Repository navigation
Releases: MotleyAI/living-architecture
Release list
v0.4.1
living-architecture 0.4.1
A small release: the /la:pr plan now keeps a record of the choices you made, and the docs were reorganized.
When /la:pr plans a change, the plan now ends with a decisions log. Each entry gives the options considered, the one taken, why, and who decided it: you, the agent taking an obvious default, or a Codex finding. Scope changes you approved, wording you approved and Codex findings you rejected or deferred go into the log too. In OpenSpec repos the log becomes the change's design.md, so it is archived with the code. Wording you approved during planning is applied as written later, without asking you again. When a reviewer later suggests an option you already rejected, the review step checks it against the log rather than reopening the decision.
The README is shorter and leads with the principles and the PR workflow. The walkthrough of principles, the PR stages and the check moved to docs/how-it-works.md, which replaces the quickstart example, and the Q&A doc is now docs/living-architecture-in-questions-and-answers.md.
v0.4.0
living-architecture 0.4.0
This release adds a versioned repo format, lets you attach specs and views to elements at any depth, and changes how arc42 docs are named. It includes a breaking change: run la-arch-migrate once after upgrading.
Upgrading
living-architecture.yaml now records the repo's format. Until you run la-arch-migrate, most commands refuse to run on a repo with an older format or none, and la-doctor tells you so. The migration converts the repo, stamps format: 0.4.0, and is all-or-nothing: if any step fails, it restores your files. Run it before you move your CI pin to 0.4.0, then commit the result.
Nested elements and arc42 docs
Any element in your model, at any depth, can now own specs (metadata { specs [...] }), be named in cross_cutting_specs.touches, and be selected in views (include X, X -> *, * -> X). Before, these only worked on top-level nodes.
The arc42 metadata key is retired. An element's arc42 doc is now architecture/<element id>.arc42.md, and every arc42 doc sits directly in architecture/. A model that still uses the key makes la-arch-check exit with a setup error. la-arch-migrate moves the docs and removes the key for you.
Fixes
An index.yaml that isn't valid UTF-8 is now reported as invalid YAML by both the Python and npm packages; before, the Python package crashed. The YAML reader also rejects values it can't construct, such as impossible dates.
Docs and plugin
The README has been rewritten, with a runnable quickstart in examples/quickstart, a way to use the architecture check without the plugin, and new contributing and security guides. The /la:pr-review skill now keeps running the review loop after the OpenSpec archive push, until every check passes again.
v0.3.3
dr-refactor no longer crashes on valid Python that rope's walker only partly covers: parameter and return annotations, keyword-only and positional-only defaults, f-strings implicitly concatenated with plain literals, PEP 701 nested f-strings, PEP 695/696 type parameters, try/finally, class keywords and t-strings.
- When rope still cannot cover a module,
dr-refactornow refuses it before writing anything. It names the file and the line of the construct, not rope's drifted cursor, and says the gap is a rope bug, not a source error. - New preflight:
dr-compliance --select rope-walklists every file rope cannot walk, so you find them before starting a rename. - The rope floor is now
rope>=1.15, because the patches use rope 1.15 internals.
Upgrading: reinstall the commands and the plugin together (uv tool install living-architecture==0.3.3 or npm install -g living-architecture@0.3.3); the skills' preflight fails while their versions differ.
v0.3.2
No behaviour changes. The npm package now publishes from GitHub Actions through npm trusted publishing, with provenance; 0.3.1 was the package's first npm release, published by hand.
Upgrading: reinstall the commands and the plugin together (uv tool install living-architecture==0.3.2 or npm install -g living-architecture@0.3.2); the skills' preflight fails while their versions differ.
v0.3.1
Per-person config overrides: a git-ignored living-architecture.local.yaml at the repo root overrides tracker and reviewers.codex without touching the committed living-architecture.yaml. A contributor without the repo's Linear access or Codex can set tracker: none / reviewers: {codex: false} there and run the /la:pr flow. Any other key is refused, with an error naming the key and the file. The file is deep-merged over the committed one (or over the defaults), and every command sees the merged configuration. la-config show notes each overridden key on stderr; la-config get stays clean. See Local overrides.
la-doctor fails while git tracks the local file (staged included) or does not ignore it. It names the file as a second config source when it is present. A local file alone does not onboard a repo: --require-config still asks for the committed file, and still validates the local one. /la:init offers to add the file to .gitignore.
Upgrading: reinstall the commands and the plugin together (uv tool install living-architecture==0.3.1 or npm install -g living-architecture@0.3.1). No config changes are needed.
v0.3.0
TypeScript gets verified refactoring, and the npm package is now public. Both twins implement dr-refactor, dr-compliance and dr-mock-lint natively for their own language: the npm twin uses the bundled TypeScript language service, and each twin passes the other language's files to the other twin. A mixed-language run prints one block per language, the same from either twin. TS rename handles overrides, implementations, aliases and tsconfig project references. move-symbol and move-module rewrite importers and re-exports. Every change is validated before anything is written.
dr-compliance now checks TS (tsconfig strictness, explicit-any, untyped definitions, mocks). dr-mock-lint flags untyped vi.fn()/jest.fn(), untyped module-mock factories and as unknown as T in tests. --select no longer has a default: leaving it out runs every check for each file's language.
Repo languages have one definition across la-typecheck, la-doctor, dr-* and the new la-config get languages / lang.<language>.<key>. la-doctor requires node and npx when TypeScript is a repo language. Skills are language-neutral: they read facts from la-config and idioms from plugin/languages/.
The architecture model is now exactly two files: architecture/model.c4 (one specification and one model block) and architecture/views.c4 (one views block). No other LikeC4 file is allowed under architecture/. la-arch-check and la-arch-diagrams reject any other layout and list every violation. la-arch-scaffold writes the new layout.
Upgrading: reinstall the commands and the plugin together (uv tool install living-architecture==0.3.0 or npm install -g living-architecture@0.3.0). A repo still on the architecture/model/*.c4 layout fails la-arch-check until you run the new la-arch-migrate once. It merges the files, verifies that the merged model matches the old one, and restores everything if anything fails.
v0.2.3
Smoother onboarding: living-architecture.yaml records each gate the flow uses as an explicit decision (tracker, openspec, architecture, reviewers.codex, conventions.rules), and la-doctor --require-config reports a repo that isn't onboarded and any decision the disk contradicts (e.g. openspec: true with no openspec/ directory). New la:init skill writes the file from what it detects; main skills run its fast path when the file is missing.
CodeRabbit and Sonar are detected per PR (la-pr-reviewers) instead of configured; reviewers.coderabbit and reviewers.sonar.enabled are gone (reviewers.sonar.project_key stays as an override).
New la-arch-scaffold writes a starter architecture (model, views, system.arc42.md with diagrams, index additions) from the measured top-level units and import edges of every declared language, all or nothing; the new la:arch-init skill builds on it. la:arch-slice is now la:arch-cleanup, and la:living-architecture is a reference.
Also: conventions.rules selects which conventions rules run; la-typecheck gates in the skills; onboarding README with the main skills only, details under docs/. The npm package is not published yet.
Upgrading: reinstall the commands and the plugin together. A living-architecture.yaml that still sets reviewers.coderabbit or reviewers.sonar.enabled is now rejected; run /la:init to convert it.
v0.2.2
Skills check the tools against their own plugin: every skill's preflight is now la-doctor --plugin <this skill's base directory>, which reads the expected version from the plugin's .claude-plugin/plugin.json, so a release no longer touches the skills. la-doctor --expect <version> still works for skills of older plugins.
spec-mapping: spec groups in a non-archived OpenSpec change (openspec/changes/<id>/specs/<group>/) count as present, so a change that adds a capability can map it during the change and stays green through archive. A group only in openspec/changes/archive/ still yields dir-missing.
Also: la-check-conventions and la-count-comments handle TS/JS as well as Python, with each file routed to its twin; new la-typecheck ratchets type errors per language against a baseline; OS error detail is each runtime's own wording after the contract prefix; the npm twin sorts arc42 docs and spec groups by code point like the Python twin; faster CI (parallel conformance runs). The npm package is not published yet.
Upgrading: reinstall the commands and the plugin together, since the new skills' preflight needs la-doctor --plugin.
v0.2.1
Breaking architecture format: one section per language in architecture/index.yaml and one root element per language in the LikeC4 model; node mapping lives in LikeC4 metadata { } blocks and nested elements map by convention (nodes:/children: removed); views are view <id> of <root>; element ids are fully qualified (python.core). Repo-owned index.yaml keys must start with x-.
Also: source_root for src layouts; TypeScript arch-check (units and import edges) in the npm twin, with forwarding between the twins; [lang:] principle tags. The npm package is not published yet.
Migrating a repo: move root_package/source_root into a python: section, move each nodes: entry into its element's metadata { } block, wrap the model in python = system '<title>' { … }, add of python to every view, qualify cross_cutting_specs.touches, and rename repo-owned keys to x-…. Diagrams regenerate byte-identically.
v0.2.0
Renamed the spec skills: spec → pr, spec-plan → pr-plan, spec-tests → pr-tests, spec-implement → pr-implement, spec-review → pr-review. The Python package is unchanged from 0.1.1.