@ybotok/loam 0.1.0-beta.3 → 0.2.0-alpha.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +5992 -82
- package/COMPARISON.md +168 -63
- package/CONTRIBUTING.md +121 -0
- package/MIGRATING-from-OpenSpec.md +238 -55
- package/QUICKSTART.md +302 -0
- package/README.md +653 -144
- package/ROADMAP.md +1035 -0
- package/SCHEMA.md +3916 -263
- package/SECURITY.md +21 -3
- package/WORKFLOW.md +927 -0
- package/dist/cli.js +133 -21
- package/dist/cli.js.map +1 -1
- package/dist/commands/adopt/adopt.js +204 -0
- package/dist/commands/adopt/adopt.js.map +1 -0
- package/dist/commands/adopt/render.js +309 -0
- package/dist/commands/adopt/render.js.map +1 -0
- package/dist/commands/archive/archive.js +74 -0
- package/dist/commands/archive/archive.js.map +1 -0
- package/dist/commands/archive/closing.js +42 -0
- package/dist/commands/archive/closing.js.map +1 -0
- package/dist/commands/archive/plan/contracts/asyncapi.js +172 -0
- package/dist/commands/archive/plan/contracts/asyncapi.js.map +1 -0
- package/dist/commands/archive/plan/contracts/consumers.js +56 -0
- package/dist/commands/archive/plan/contracts/consumers.js.map +1 -0
- package/dist/commands/archive/plan/contracts/openapi.js +193 -0
- package/dist/commands/archive/plan/contracts/openapi.js.map +1 -0
- package/dist/commands/archive/plan/contracts/verdict-lines.js +103 -0
- package/dist/commands/archive/plan/contracts/verdict-lines.js.map +1 -0
- package/dist/commands/archive/plan/document/head.js +151 -0
- package/dist/commands/archive/plan/document/head.js.map +1 -0
- package/dist/commands/archive/plan/document/links.js +284 -0
- package/dist/commands/archive/plan/document/links.js.map +1 -0
- package/dist/commands/archive/plan/document/run.js +136 -0
- package/dist/commands/archive/plan/document/run.js.map +1 -0
- package/dist/commands/archive/plan/gate.js +319 -0
- package/dist/commands/archive/plan/gate.js.map +1 -0
- package/dist/commands/archive/plan/landscape.js +298 -0
- package/dist/commands/archive/plan/landscape.js.map +1 -0
- package/dist/commands/archive/plan/model/extending.js +85 -0
- package/dist/commands/archive/plan/model/extending.js.map +1 -0
- package/dist/commands/archive/plan/refusal.js +106 -0
- package/dist/commands/archive/plan/refusal.js.map +1 -0
- package/dist/commands/archive/plan/specs.js +318 -0
- package/dist/commands/archive/plan/specs.js.map +1 -0
- package/dist/commands/archive/plan/state.js +30 -0
- package/dist/commands/archive/plan/state.js.map +1 -0
- package/dist/commands/archive/run.js +355 -0
- package/dist/commands/archive/run.js.map +1 -0
- package/dist/commands/archive/shipped.js +49 -0
- package/dist/commands/archive/shipped.js.map +1 -0
- package/dist/commands/context/context.js +166 -0
- package/dist/commands/context/context.js.map +1 -0
- package/dist/commands/context/print.js +305 -0
- package/dist/commands/context/print.js.map +1 -0
- package/dist/commands/delta/delta.js +367 -0
- package/dist/commands/delta/delta.js.map +1 -0
- package/dist/commands/delta/print.js +221 -0
- package/dist/commands/delta/print.js.map +1 -0
- package/dist/commands/dependencies.js +6 -8
- package/dist/commands/dependencies.js.map +1 -1
- package/dist/commands/diff/diff.js +86 -0
- package/dist/commands/diff/diff.js.map +1 -0
- package/dist/commands/diff/print.js +38 -0
- package/dist/commands/diff/print.js.map +1 -0
- package/dist/commands/doctor.js +65 -5
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/explain/explain.js +227 -0
- package/dist/commands/explain/explain.js.map +1 -0
- package/dist/commands/explore.js +39 -28
- package/dist/commands/explore.js.map +1 -1
- package/dist/commands/gate/gate.js +152 -0
- package/dist/commands/gate/gate.js.map +1 -0
- package/dist/commands/gate/print.js +66 -0
- package/dist/commands/gate/print.js.map +1 -0
- package/dist/commands/gherkin/commit.js +105 -0
- package/dist/commands/gherkin/commit.js.map +1 -0
- package/dist/commands/gherkin/gherkin.js +262 -0
- package/dist/commands/gherkin/gherkin.js.map +1 -0
- package/dist/commands/gherkin/reconcile.js +146 -0
- package/dist/commands/gherkin/reconcile.js.map +1 -0
- package/dist/commands/gherkin/render.js +77 -0
- package/dist/commands/gherkin/render.js.map +1 -0
- package/dist/commands/init/example.js +204 -0
- package/dist/commands/init/example.js.map +1 -0
- package/dist/commands/init/first-hour.js +72 -0
- package/dist/commands/init/first-hour.js.map +1 -0
- package/dist/commands/{init.js → init/init.js} +142 -71
- package/dist/commands/init/init.js.map +1 -0
- package/dist/commands/init/mcp.js +131 -0
- package/dist/commands/init/mcp.js.map +1 -0
- package/dist/commands/init/options.js +78 -0
- package/dist/commands/init/options.js.map +1 -0
- package/dist/commands/instructions.js +72 -14
- package/dist/commands/instructions.js.map +1 -1
- package/dist/commands/list/campaign/campaign.js +63 -0
- package/dist/commands/list/campaign/campaign.js.map +1 -0
- package/dist/commands/list/campaign/owners.js +65 -0
- package/dist/commands/list/campaign/owners.js.map +1 -0
- package/dist/commands/list/json.js +155 -0
- package/dist/commands/list/json.js.map +1 -0
- package/dist/commands/list/list.js +358 -0
- package/dist/commands/list/list.js.map +1 -0
- package/dist/commands/list/print.js +344 -0
- package/dist/commands/list/print.js.map +1 -0
- package/dist/commands/list/review.js +120 -0
- package/dist/commands/list/review.js.map +1 -0
- package/dist/commands/list/suites/suites.js +140 -0
- package/dist/commands/list/suites/suites.js.map +1 -0
- package/dist/commands/list/views.js +108 -0
- package/dist/commands/list/views.js.map +1 -0
- package/dist/commands/mcp/dispatch.js +238 -0
- package/dist/commands/mcp/dispatch.js.map +1 -0
- package/dist/commands/mcp/mcp.js +75 -0
- package/dist/commands/mcp/mcp.js.map +1 -0
- package/dist/commands/mcp/serve.js +55 -0
- package/dist/commands/mcp/serve.js.map +1 -0
- package/dist/commands/migrate-openspec/materialize/active.js +175 -0
- package/dist/commands/migrate-openspec/materialize/active.js.map +1 -0
- package/dist/commands/migrate-openspec/materialize/feature.js +41 -0
- package/dist/commands/migrate-openspec/materialize/feature.js.map +1 -0
- package/dist/commands/migrate-openspec/materialize/living.js +62 -0
- package/dist/commands/migrate-openspec/materialize/living.js.map +1 -0
- package/dist/commands/migrate-openspec/materialize/stage.js +143 -0
- package/dist/commands/migrate-openspec/materialize/stage.js.map +1 -0
- package/dist/commands/migrate-openspec/materialize/target.js +219 -0
- package/dist/commands/migrate-openspec/materialize/target.js.map +1 -0
- package/dist/commands/migrate-openspec/migrate-openspec.js +142 -0
- package/dist/commands/migrate-openspec/migrate-openspec.js.map +1 -0
- package/dist/commands/migrate-openspec/openspec/decisions.js +86 -0
- package/dist/commands/migrate-openspec/openspec/decisions.js.map +1 -0
- package/dist/commands/migrate-openspec/openspec/error.js +18 -0
- package/dist/commands/migrate-openspec/openspec/error.js.map +1 -0
- package/dist/commands/migrate-openspec/openspec/mapping.js +162 -0
- package/dist/commands/migrate-openspec/openspec/mapping.js.map +1 -0
- package/dist/commands/migrate-openspec/openspec/paths.js +40 -0
- package/dist/commands/migrate-openspec/openspec/paths.js.map +1 -0
- package/dist/commands/migrate-openspec/openspec/read.js +49 -0
- package/dist/commands/migrate-openspec/openspec/read.js.map +1 -0
- package/dist/commands/migrate-openspec/print.js +89 -0
- package/dist/commands/migrate-openspec/print.js.map +1 -0
- package/dist/commands/new/capability-template.js +118 -0
- package/dist/commands/new/capability-template.js.map +1 -0
- package/dist/commands/new/commit.js +62 -0
- package/dist/commands/new/commit.js.map +1 -0
- package/dist/commands/new/modifies.js +206 -0
- package/dist/commands/new/modifies.js.map +1 -0
- package/dist/commands/new/new.js +328 -0
- package/dist/commands/new/new.js.map +1 -0
- package/dist/commands/new/templates.js +279 -0
- package/dist/commands/new/templates.js.map +1 -0
- package/dist/commands/open.js +199 -0
- package/dist/commands/open.js.map +1 -0
- package/dist/commands/policy/format.js +152 -0
- package/dist/commands/policy/format.js.map +1 -0
- package/dist/commands/{docs-repo-gate.js → policy/gate.js} +38 -11
- package/dist/commands/policy/gate.js.map +1 -0
- package/dist/commands/rebase/edit.js +106 -0
- package/dist/commands/rebase/edit.js.map +1 -0
- package/dist/commands/rebase/living.js +185 -0
- package/dist/commands/rebase/living.js.map +1 -0
- package/dist/commands/rebase/plan.js +245 -0
- package/dist/commands/rebase/plan.js.map +1 -0
- package/dist/commands/rebase/rebase.js +300 -0
- package/dist/commands/rebase/rebase.js.map +1 -0
- package/dist/commands/seed/commit.js +221 -0
- package/dist/commands/seed/commit.js.map +1 -0
- package/dist/commands/seed/plan.js +278 -0
- package/dist/commands/seed/plan.js.map +1 -0
- package/dist/commands/seed/seed.js +174 -0
- package/dist/commands/seed/seed.js.map +1 -0
- package/dist/commands/show/feature.js +182 -0
- package/dist/commands/show/feature.js.map +1 -0
- package/dist/commands/show/introduced.js +157 -0
- package/dist/commands/show/introduced.js.map +1 -0
- package/dist/commands/show/marks.js +53 -0
- package/dist/commands/show/marks.js.map +1 -0
- package/dist/commands/show/service.js +239 -0
- package/dist/commands/show/service.js.map +1 -0
- package/dist/commands/show/show.js +87 -0
- package/dist/commands/show/show.js.map +1 -0
- package/dist/commands/status/fleet-next.js +90 -0
- package/dist/commands/status/fleet-next.js.map +1 -0
- package/dist/commands/status/json.js +47 -0
- package/dist/commands/status/json.js.map +1 -0
- package/dist/commands/status/print.js +209 -0
- package/dist/commands/status/print.js.map +1 -0
- package/dist/commands/status/status.js +115 -0
- package/dist/commands/status/status.js.map +1 -0
- package/dist/commands/steps/steps.js +269 -0
- package/dist/commands/steps/steps.js.map +1 -0
- package/dist/commands/subsystem/edit.js +192 -0
- package/dist/commands/subsystem/edit.js.map +1 -0
- package/dist/commands/subsystem/move.js +325 -0
- package/dist/commands/subsystem/move.js.map +1 -0
- package/dist/commands/subsystem/query.js +113 -0
- package/dist/commands/subsystem/query.js.map +1 -0
- package/dist/commands/subsystem/subsystem.js +98 -0
- package/dist/commands/subsystem/subsystem.js.map +1 -0
- package/dist/commands/subsystem/sync.js +318 -0
- package/dist/commands/subsystem/sync.js.map +1 -0
- package/dist/commands/subsystem/txn/exclude.js +132 -0
- package/dist/commands/subsystem/txn/exclude.js.map +1 -0
- package/dist/commands/subsystem/txn/links.js +128 -0
- package/dist/commands/subsystem/txn/links.js.map +1 -0
- package/dist/commands/subsystem/txn/report.js +174 -0
- package/dist/commands/subsystem/txn/report.js.map +1 -0
- package/dist/commands/subsystem/txn/txn.js +196 -0
- package/dist/commands/subsystem/txn/txn.js.map +1 -0
- package/dist/commands/subsystem/txn/views.js +249 -0
- package/dist/commands/subsystem/txn/views.js.map +1 -0
- package/dist/commands/tasks/actions.js +107 -0
- package/dist/commands/tasks/actions.js.map +1 -0
- package/dist/commands/tasks/render.js +253 -0
- package/dist/commands/tasks/render.js.map +1 -0
- package/dist/commands/tasks/tasks.js +119 -0
- package/dist/commands/tasks/tasks.js.map +1 -0
- package/dist/commands/unarchive/manifest.js +176 -0
- package/dist/commands/unarchive/manifest.js.map +1 -0
- package/dist/commands/unarchive/restore.js +254 -0
- package/dist/commands/unarchive/restore.js.map +1 -0
- package/dist/commands/unarchive/unarchive.js +59 -0
- package/dist/commands/unarchive/unarchive.js.map +1 -0
- package/dist/commands/validate/arch-coverage.js +245 -0
- package/dist/commands/validate/arch-coverage.js.map +1 -0
- package/dist/commands/validate/checks/fleet-shape.js +204 -0
- package/dist/commands/validate/checks/fleet-shape.js.map +1 -0
- package/dist/commands/validate/checks/health-deps.js +58 -0
- package/dist/commands/validate/checks/health-deps.js.map +1 -0
- package/dist/commands/validate/checks/introduced.js +102 -0
- package/dist/commands/validate/checks/introduced.js.map +1 -0
- package/dist/commands/validate/checks/requirements.js +264 -0
- package/dist/commands/validate/checks/requirements.js.map +1 -0
- package/dist/commands/validate/checks/sources.js +85 -0
- package/dist/commands/validate/checks/sources.js.map +1 -0
- package/dist/commands/validate/coverage/covers-after.js +105 -0
- package/dist/commands/validate/coverage/covers-after.js.map +1 -0
- package/dist/commands/validate/feature.js +222 -0
- package/dist/commands/validate/feature.js.map +1 -0
- package/dist/commands/validate/fleet/census.js +93 -0
- package/dist/commands/validate/fleet/census.js.map +1 -0
- package/dist/commands/validate/fleet/kind-tags.js +39 -0
- package/dist/commands/validate/fleet/kind-tags.js.map +1 -0
- package/dist/commands/validate/fleet/landscape.js +371 -0
- package/dist/commands/validate/fleet/landscape.js.map +1 -0
- package/dist/commands/validate/fleet/load.js +118 -0
- package/dist/commands/validate/fleet/load.js.map +1 -0
- package/dist/commands/validate/fleet/map/attest.js +98 -0
- package/dist/commands/validate/fleet/map/attest.js.map +1 -0
- package/dist/commands/validate/fleet/map/bindings.js +107 -0
- package/dist/commands/validate/fleet/map/bindings.js.map +1 -0
- package/dist/commands/validate/fleet/map/consumers.js +244 -0
- package/dist/commands/validate/fleet/map/consumers.js.map +1 -0
- package/dist/commands/validate/fleet/map/isolation.js +116 -0
- package/dist/commands/validate/fleet/map/isolation.js.map +1 -0
- package/dist/commands/validate/fleet/map/usecases.js +54 -0
- package/dist/commands/validate/fleet/map/usecases.js.map +1 -0
- package/dist/commands/validate/fleet/obligations.js +266 -0
- package/dist/commands/validate/fleet/obligations.js.map +1 -0
- package/dist/commands/validate/fleet/scorecard/adoption.js +102 -0
- package/dist/commands/validate/fleet/scorecard/adoption.js.map +1 -0
- package/dist/commands/validate/fleet/scorecard/contracts.js +98 -0
- package/dist/commands/validate/fleet/scorecard/contracts.js.map +1 -0
- package/dist/commands/validate/fleet/scorecard/print.js +71 -0
- package/dist/commands/validate/fleet/scorecard/print.js.map +1 -0
- package/dist/commands/validate/fleet/scorecard/scorecard.js +162 -0
- package/dist/commands/validate/fleet/scorecard/scorecard.js.map +1 -0
- package/dist/commands/validate/fleet/usecases/place.js +13 -0
- package/dist/commands/validate/fleet/usecases/place.js.map +1 -0
- package/dist/commands/validate/fleet/views/fleet-project.js +217 -0
- package/dist/commands/validate/fleet/views/fleet-project.js.map +1 -0
- package/dist/commands/validate/fleet/views/ids.js +75 -0
- package/dist/commands/validate/fleet/views/ids.js.map +1 -0
- package/dist/commands/validate/fleet/views/projects.js +278 -0
- package/dist/commands/validate/fleet/views/projects.js.map +1 -0
- package/dist/commands/validate/fleet/views/root-documents.js +83 -0
- package/dist/commands/validate/fleet/views/root-documents.js.map +1 -0
- package/dist/commands/validate/fleet/views/stale.js +52 -0
- package/dist/commands/validate/fleet/views/stale.js.map +1 -0
- package/dist/commands/validate/links/corpus.js +89 -0
- package/dist/commands/validate/links/corpus.js.map +1 -0
- package/dist/commands/validate/links/glossary.js +75 -0
- package/dist/commands/validate/links/glossary.js.map +1 -0
- package/dist/commands/validate/render/repeats.js +63 -0
- package/dist/commands/validate/render/repeats.js.map +1 -0
- package/dist/commands/validate/render/rollups.js +115 -0
- package/dist/commands/validate/render/rollups.js.map +1 -0
- package/dist/commands/validate/render/text.js +199 -0
- package/dist/commands/validate/render/text.js.map +1 -0
- package/dist/commands/validate/report.js +145 -0
- package/dist/commands/validate/report.js.map +1 -0
- package/dist/commands/validate/scope.js +113 -0
- package/dist/commands/validate/scope.js.map +1 -0
- package/dist/commands/validate/service/api.js +252 -0
- package/dist/commands/validate/service/api.js.map +1 -0
- package/dist/commands/validate/service/contracts/generated.js +134 -0
- package/dist/commands/validate/service/contracts/generated.js.map +1 -0
- package/dist/commands/validate/service/events/events.js +241 -0
- package/dist/commands/validate/service/events/events.js.map +1 -0
- package/dist/commands/validate/service/events/message-producers.js +77 -0
- package/dist/commands/validate/service/events/message-producers.js.map +1 -0
- package/dist/commands/validate/service/evidence-pins.js +177 -0
- package/dist/commands/validate/service/evidence-pins.js.map +1 -0
- package/dist/commands/validate/service/model/diverged.js +226 -0
- package/dist/commands/validate/service/model/diverged.js.map +1 -0
- package/dist/commands/validate/service/model/grade.js +163 -0
- package/dist/commands/validate/service/model/grade.js.map +1 -0
- package/dist/commands/validate/service/service.js +310 -0
- package/dist/commands/validate/service/service.js.map +1 -0
- package/dist/commands/validate/service/specs.js +279 -0
- package/dist/commands/validate/service/specs.js.map +1 -0
- package/dist/commands/validate/service/spine.js +148 -0
- package/dist/commands/validate/service/spine.js.map +1 -0
- package/dist/commands/validate/service/usecases/tags.js +113 -0
- package/dist/commands/validate/service/usecases/tags.js.map +1 -0
- package/dist/commands/validate/service/usecases/usecases.js +209 -0
- package/dist/commands/validate/service/usecases/usecases.js.map +1 -0
- package/dist/commands/validate/validate.js +363 -0
- package/dist/commands/validate/validate.js.map +1 -0
- package/dist/commands/verify/cross/diff.js +178 -0
- package/dist/commands/verify/cross/diff.js.map +1 -0
- package/dist/commands/verify/evidence/contract.js +32 -0
- package/dist/commands/verify/evidence/contract.js.map +1 -0
- package/dist/commands/verify/evidence/pins.js +52 -0
- package/dist/commands/verify/evidence/pins.js.map +1 -0
- package/dist/commands/verify/evidence/read.js +81 -0
- package/dist/commands/verify/evidence/read.js.map +1 -0
- package/dist/commands/verify/frozen.js +263 -0
- package/dist/commands/verify/frozen.js.map +1 -0
- package/dist/commands/verify/record.js +278 -0
- package/dist/commands/verify/record.js.map +1 -0
- package/dist/commands/verify/report.js +206 -0
- package/dist/commands/verify/report.js.map +1 -0
- package/dist/commands/verify/results.js +328 -0
- package/dist/commands/verify/results.js.map +1 -0
- package/dist/commands/verify/verify.js +220 -0
- package/dist/commands/verify/verify.js.map +1 -0
- package/dist/commands/vouch/contract.js +11 -0
- package/dist/commands/vouch/contract.js.map +1 -0
- package/dist/commands/vouch/pack/contract.js +2 -0
- package/dist/commands/vouch/pack/contract.js.map +1 -0
- package/dist/commands/vouch/pack/pack.js +266 -0
- package/dist/commands/vouch/pack/pack.js.map +1 -0
- package/dist/commands/vouch/pack/print.js +266 -0
- package/dist/commands/vouch/pack/print.js.map +1 -0
- package/dist/commands/vouch/pack/sections.js +141 -0
- package/dist/commands/vouch/pack/sections.js.map +1 -0
- package/dist/commands/vouch/prompt/confirm.js +46 -0
- package/dist/commands/vouch/prompt/confirm.js.map +1 -0
- package/dist/commands/vouch/report.js +101 -0
- package/dist/commands/vouch/report.js.map +1 -0
- package/dist/commands/vouch/run.js +230 -0
- package/dist/commands/vouch/run.js.map +1 -0
- package/dist/commands/vouch/sample/plan.js +111 -0
- package/dist/commands/vouch/sample/plan.js.map +1 -0
- package/dist/commands/vouch/sample/print.js +109 -0
- package/dist/commands/vouch/sample/print.js.map +1 -0
- package/dist/commands/vouch/vet/verify.js +155 -0
- package/dist/commands/vouch/vet/verify.js.map +1 -0
- package/dist/commands/vouch/vouch.js +169 -0
- package/dist/commands/vouch/vouch.js.map +1 -0
- package/dist/core/agent/agents-md/command-map.js +299 -0
- package/dist/core/agent/agents-md/command-map.js.map +1 -0
- package/dist/core/agent/agents-md/map/explain.js +46 -0
- package/dist/core/agent/agents-md/map/explain.js.map +1 -0
- package/dist/core/agent/agents-md/map/lenses/context.js +50 -0
- package/dist/core/agent/agents-md/map/lenses/context.js.map +1 -0
- package/dist/core/agent/agents-md/map/lenses/diff.js +59 -0
- package/dist/core/agent/agents-md/map/lenses/diff.js.map +1 -0
- package/dist/core/agent/agents-md/map/lenses/gate.js +65 -0
- package/dist/core/agent/agents-md/map/lenses/gate.js.map +1 -0
- package/dist/core/agent/agents-md/map/mcp.js +44 -0
- package/dist/core/agent/agents-md/map/mcp.js.map +1 -0
- package/dist/core/agent/agents-md/map/status.js +78 -0
- package/dist/core/agent/agents-md/map/status.js.map +1 -0
- package/dist/core/agent/agents-md/map/subsystem.js +104 -0
- package/dist/core/agent/agents-md/map/subsystem.js.map +1 -0
- package/dist/core/agent/agents-md/map/usecases.js +138 -0
- package/dist/core/agent/agents-md/map/usecases.js.map +1 -0
- package/dist/core/agent/agents-md/refusals.js +273 -0
- package/dist/core/agent/agents-md/refusals.js.map +1 -0
- package/dist/core/agent/agents-md.js +203 -0
- package/dist/core/agent/agents-md.js.map +1 -0
- package/dist/core/{agents-stamp.js → agent/agents-stamp.js} +60 -0
- package/dist/core/agent/agents-stamp.js.map +1 -0
- package/dist/core/agent/contract.js +2 -0
- package/dist/core/agent/contract.js.map +1 -0
- package/dist/core/agent/protocol.js +193 -0
- package/dist/core/agent/protocol.js.map +1 -0
- package/dist/core/agent/scaffold.js +254 -0
- package/dist/core/agent/scaffold.js.map +1 -0
- package/dist/core/agent/support/report.js +144 -0
- package/dist/core/agent/support/report.js.map +1 -0
- package/dist/core/agent/tools/dialects.js +151 -0
- package/dist/core/agent/tools/dialects.js.map +1 -0
- package/dist/core/agent/tools/registry.js +193 -0
- package/dist/core/agent/tools/registry.js.map +1 -0
- package/dist/core/agent/workflows/adopt.js +280 -0
- package/dist/core/agent/workflows/adopt.js.map +1 -0
- package/dist/core/agent/workflows/check.js +373 -0
- package/dist/core/agent/workflows/check.js.map +1 -0
- package/dist/core/agent/workflows/closing.js +323 -0
- package/dist/core/agent/workflows/closing.js.map +1 -0
- package/dist/core/agent/workflows/feature.js +220 -0
- package/dist/core/agent/workflows/feature.js.map +1 -0
- package/dist/core/agent/workflows/implement.js +188 -0
- package/dist/core/agent/workflows/implement.js.map +1 -0
- package/dist/core/agent/workflows/reference/authoring.js +311 -0
- package/dist/core/agent/workflows/reference/authoring.js.map +1 -0
- package/dist/core/agent/workflows/reference/codes.js +67 -0
- package/dist/core/agent/workflows/reference/codes.js.map +1 -0
- package/dist/core/agent/workflows/reference/done-check.js +210 -0
- package/dist/core/agent/workflows/reference/done-check.js.map +1 -0
- package/dist/core/agent/workflows/reference/drawing/drawing.js +253 -0
- package/dist/core/agent/workflows/reference/drawing/drawing.js.map +1 -0
- package/dist/core/agent/workflows/reference/reference.js +19 -0
- package/dist/core/agent/workflows/reference/reference.js.map +1 -0
- package/dist/core/agent/workflows/reference/spine.js +338 -0
- package/dist/core/agent/workflows/reference/spine.js.map +1 -0
- package/dist/core/asyncapi/baseline/plan.js +43 -0
- package/dist/core/asyncapi/baseline/plan.js.map +1 -0
- package/dist/core/asyncapi/baseline/surfaces.js +54 -0
- package/dist/core/asyncapi/baseline/surfaces.js.map +1 -0
- package/dist/core/asyncapi/depth.js +164 -0
- package/dist/core/asyncapi/depth.js.map +1 -0
- package/dist/core/asyncapi/digest.js +146 -0
- package/dist/core/asyncapi/digest.js.map +1 -0
- package/dist/core/asyncapi/merge/components.js +92 -0
- package/dist/core/asyncapi/merge/components.js.map +1 -0
- package/dist/core/asyncapi/merge/error.js +38 -0
- package/dist/core/asyncapi/merge/error.js.map +1 -0
- package/dist/core/asyncapi/merge/markers.js +290 -0
- package/dist/core/asyncapi/merge/markers.js.map +1 -0
- package/dist/core/asyncapi/merge/merge.js +195 -0
- package/dist/core/asyncapi/merge/merge.js.map +1 -0
- package/dist/core/asyncapi/merge/pin.js +83 -0
- package/dist/core/asyncapi/merge/pin.js.map +1 -0
- package/dist/core/asyncapi/model.js +11 -0
- package/dist/core/asyncapi/model.js.map +1 -0
- package/dist/core/asyncapi/producers.js +50 -0
- package/dist/core/asyncapi/producers.js.map +1 -0
- package/dist/core/asyncapi/read.js +263 -0
- package/dist/core/asyncapi/read.js.map +1 -0
- package/dist/core/brief/brief.js +285 -0
- package/dist/core/brief/brief.js.map +1 -0
- package/dist/core/brief/checks.js +385 -0
- package/dist/core/brief/checks.js.map +1 -0
- package/dist/core/brief/landscape.js +273 -0
- package/dist/core/brief/landscape.js.map +1 -0
- package/dist/core/brief/map/extend.js +84 -0
- package/dist/core/brief/map/extend.js.map +1 -0
- package/dist/core/brief/map/owed.js +266 -0
- package/dist/core/brief/map/owed.js.map +1 -0
- package/dist/core/brief/targets.js +304 -0
- package/dist/core/brief/targets.js.map +1 -0
- package/dist/core/brief/unchecked.js +58 -0
- package/dist/core/brief/unchecked.js.map +1 -0
- package/dist/core/c4/arch.js +190 -0
- package/dist/core/c4/arch.js.map +1 -0
- package/dist/core/c4/direction/direction.js +114 -0
- package/dist/core/c4/direction/direction.js.map +1 -0
- package/dist/core/c4/likec4.js +243 -0
- package/dist/core/c4/likec4.js.map +1 -0
- package/dist/core/c4/locate/unlocated.js +150 -0
- package/dist/core/c4/locate/unlocated.js.map +1 -0
- package/dist/core/c4/parsed/deployment.js +160 -0
- package/dist/core/c4/parsed/deployment.js.map +1 -0
- package/dist/core/c4/parsed/dynamic-views.js +132 -0
- package/dist/core/c4/parsed/dynamic-views.js.map +1 -0
- package/dist/core/c4/parsed/specification.js +78 -0
- package/dist/core/c4/parsed/specification.js.map +1 -0
- package/dist/core/c4/parsed/values.js +110 -0
- package/dist/core/c4/parsed/values.js.map +1 -0
- package/dist/core/c4/parsed/view-ids.js +113 -0
- package/dist/core/c4/parsed/view-ids.js.map +1 -0
- package/dist/core/c4/prefetch/fleet.js +134 -0
- package/dist/core/c4/prefetch/fleet.js.map +1 -0
- package/dist/core/c4/project/architecture.js +161 -0
- package/dist/core/c4/project/architecture.js.map +1 -0
- package/dist/core/c4/project/batch.js +140 -0
- package/dist/core/c4/project/batch.js.map +1 -0
- package/dist/core/c4/project/documents.js +89 -0
- package/dist/core/c4/project/documents.js.map +1 -0
- package/dist/core/c4/project/load.js +219 -0
- package/dist/core/c4/project/load.js.map +1 -0
- package/dist/core/c4/project/staged.js +277 -0
- package/dist/core/c4/project/staged.js.map +1 -0
- package/dist/core/c4/resolve/attested.js +0 -0
- package/dist/core/c4/resolve/attested.js.map +1 -0
- package/dist/core/c4/resolve/external.js +51 -0
- package/dist/core/c4/resolve/external.js.map +1 -0
- package/dist/core/c4/resolve/service.js +174 -0
- package/dist/core/c4/resolve/service.js.map +1 -0
- package/dist/core/c4/resolve/steps.js +290 -0
- package/dist/core/c4/resolve/steps.js.map +1 -0
- package/dist/core/c4/resolve/systems.js +154 -0
- package/dist/core/c4/resolve/systems.js.map +1 -0
- package/dist/core/c4/root-project/exclude.js +352 -0
- package/dist/core/c4/root-project/exclude.js.map +1 -0
- package/dist/core/c4/seed/fleet-file.js +201 -0
- package/dist/core/c4/seed/fleet-file.js.map +1 -0
- package/dist/core/c4/seed/items.js +91 -0
- package/dist/core/c4/seed/items.js.map +1 -0
- package/dist/core/c4/seed/stamp.js +48 -0
- package/dist/core/c4/seed/stamp.js.map +1 -0
- package/dist/core/c4/seed/template.js +173 -0
- package/dist/core/c4/seed/template.js.map +1 -0
- package/dist/core/c4/service-model/created/models.js +96 -0
- package/dist/core/c4/service-model/created/models.js.map +1 -0
- package/dist/core/c4/service-model/documents.js +47 -0
- package/dist/core/c4/service-model/documents.js.map +1 -0
- package/dist/core/c4/service-model/fleet/extending.js +82 -0
- package/dist/core/c4/service-model/fleet/extending.js.map +1 -0
- package/dist/core/c4/service-model/load.js +165 -0
- package/dist/core/c4/service-model/load.js.map +1 -0
- package/dist/core/c4/service-model/renderer.js +128 -0
- package/dist/core/c4/service-model/renderer.js.map +1 -0
- package/dist/core/c4/service-model/shape.js +106 -0
- package/dist/core/c4/service-model/shape.js.map +1 -0
- package/dist/core/c4/service-model/slice.js +188 -0
- package/dist/core/c4/service-model/slice.js.map +1 -0
- package/dist/core/c4/source-mask.js +369 -0
- package/dist/core/c4/source-mask.js.map +1 -0
- package/dist/core/c4/source-scan.js +308 -0
- package/dist/core/c4/source-scan.js.map +1 -0
- package/dist/core/c4/splice/authored-source.js +167 -0
- package/dist/core/c4/splice/authored-source.js.map +1 -0
- package/dist/core/c4/splice/contract.js +30 -0
- package/dist/core/c4/splice/contract.js.map +1 -0
- package/dist/core/c4/splice/delta-blocks.js +126 -0
- package/dist/core/c4/splice/delta-blocks.js.map +1 -0
- package/dist/core/c4/splice/identity/declared.js +87 -0
- package/dist/core/c4/splice/identity/declared.js.map +1 -0
- package/dist/core/c4/splice/identity/edges.js +73 -0
- package/dist/core/c4/splice/identity/edges.js.map +1 -0
- package/dist/core/c4/splice/identity/existing.js +80 -0
- package/dist/core/c4/splice/identity/existing.js.map +1 -0
- package/dist/core/c4/splice/identity/interior.js +80 -0
- package/dist/core/c4/splice/identity/interior.js.map +1 -0
- package/dist/core/c4/splice/identity/owner.js +50 -0
- package/dist/core/c4/splice/identity/owner.js.map +1 -0
- package/dist/core/c4/splice/landscape-merge.js +337 -0
- package/dist/core/c4/splice/landscape-merge.js.map +1 -0
- package/dist/core/c4/splice/model/merge.js +151 -0
- package/dist/core/c4/splice/model/merge.js.map +1 -0
- package/dist/core/c4/splice/placement.js +298 -0
- package/dist/core/c4/splice/placement.js.map +1 -0
- package/dist/core/c4/splice/text/spot.js +131 -0
- package/dist/core/c4/splice/text/spot.js.map +1 -0
- package/dist/core/c4/workspace.js +166 -0
- package/dist/core/c4/workspace.js.map +1 -0
- package/dist/core/capabilities/authoring/notes.js +141 -0
- package/dist/core/capabilities/authoring/notes.js.map +1 -0
- package/dist/core/capabilities/capabilities.js +124 -0
- package/dist/core/capabilities/capabilities.js.map +1 -0
- package/dist/core/capabilities/delta/doc.js +47 -0
- package/dist/core/capabilities/delta/doc.js.map +1 -0
- package/dist/core/capabilities/delta/overlay.js +129 -0
- package/dist/core/capabilities/delta/overlay.js.map +1 -0
- package/dist/core/capabilities/delta/summary.js +57 -0
- package/dist/core/capabilities/delta/summary.js.map +1 -0
- package/dist/core/capabilities/delta/tree.js +43 -0
- package/dist/core/capabilities/delta/tree.js.map +1 -0
- package/dist/core/capabilities/delta/uncovered.js +222 -0
- package/dist/core/capabilities/delta/uncovered.js.map +1 -0
- package/dist/core/capabilities/findings.js +338 -0
- package/dist/core/capabilities/findings.js.map +1 -0
- package/dist/core/capabilities/realizes/findings.js +174 -0
- package/dist/core/capabilities/realizes/findings.js.map +1 -0
- package/dist/core/capabilities/realizes/join.js +123 -0
- package/dist/core/capabilities/realizes/join.js.map +1 -0
- package/dist/core/capabilities/rollup.js +205 -0
- package/dist/core/capabilities/rollup.js.map +1 -0
- package/dist/core/capabilities/tree.js +104 -0
- package/dist/core/capabilities/tree.js.map +1 -0
- package/dist/core/capabilities/usecase-join.js +267 -0
- package/dist/core/capabilities/usecase-join.js.map +1 -0
- package/dist/core/coherence/authoring/scaffold.js +185 -0
- package/dist/core/coherence/authoring/scaffold.js.map +1 -0
- package/dist/core/coherence/authoring/sentinels.js +75 -0
- package/dist/core/coherence/authoring/sentinels.js.map +1 -0
- package/dist/core/coherence/calls/called.js +52 -0
- package/dist/core/coherence/calls/called.js.map +1 -0
- package/dist/core/coherence/coherence.js +332 -0
- package/dist/core/coherence/coherence.js.map +1 -0
- package/dist/core/coherence/consumed/operations.js +70 -0
- package/dist/core/coherence/consumed/operations.js.map +1 -0
- package/dist/core/coherence/consumed/refusal.js +38 -0
- package/dist/core/coherence/consumed/refusal.js.map +1 -0
- package/dist/core/coherence/covers/health.js +85 -0
- package/dist/core/coherence/covers/health.js.map +1 -0
- package/dist/core/coherence/declared.js +295 -0
- package/dist/core/coherence/declared.js.map +1 -0
- package/dist/core/coherence/events/declared.js +191 -0
- package/dist/core/coherence/events/declared.js.map +1 -0
- package/dist/core/coherence/events/events.js +335 -0
- package/dist/core/coherence/events/events.js.map +1 -0
- package/dist/core/coherence/events/grades.js +189 -0
- package/dist/core/coherence/events/grades.js.map +1 -0
- package/dist/core/coherence/events/lookups.js +63 -0
- package/dist/core/coherence/events/lookups.js.map +1 -0
- package/dist/core/coherence/events/produced.js +100 -0
- package/dist/core/coherence/events/produced.js.map +1 -0
- package/dist/core/coherence/living.js +198 -0
- package/dist/core/coherence/living.js.map +1 -0
- package/dist/core/coherence/lookups.js +95 -0
- package/dist/core/coherence/lookups.js.map +1 -0
- package/dist/core/coherence/pending.js +39 -0
- package/dist/core/coherence/pending.js.map +1 -0
- package/dist/core/coherence/retired/archived.js +285 -0
- package/dist/core/coherence/retired/archived.js.map +1 -0
- package/dist/core/coherence/retired/event-pair.js +62 -0
- package/dist/core/coherence/retired/event-pair.js.map +1 -0
- package/dist/core/coherence/retired/merged.js +79 -0
- package/dist/core/coherence/retired/merged.js.map +1 -0
- package/dist/core/coherence/retired/retirement.js +49 -0
- package/dist/core/coherence/retired/retirement.js.map +1 -0
- package/dist/core/coherence/retired/revival/arrivals.js +131 -0
- package/dist/core/coherence/retired/revival/arrivals.js.map +1 -0
- package/dist/core/coherence/retired/revival/revived.js +297 -0
- package/dist/core/coherence/retired/revival/revived.js.map +1 -0
- package/dist/core/conflict-markers.js +60 -0
- package/dist/core/conflict-markers.js.map +1 -0
- package/dist/core/consumers/after.js +113 -0
- package/dist/core/consumers/after.js.map +1 -0
- package/dist/core/consumers/consumers.js +296 -0
- package/dist/core/consumers/consumers.js.map +1 -0
- package/dist/core/consumers/current.js +211 -0
- package/dist/core/consumers/current.js.map +1 -0
- package/dist/core/consumers/scan.js +46 -0
- package/dist/core/consumers/scan.js.map +1 -0
- package/dist/core/consumers/state.js +27 -0
- package/dist/core/consumers/state.js.map +1 -0
- package/dist/core/delta/claims.js +73 -0
- package/dist/core/delta/claims.js.map +1 -0
- package/dist/core/delta/delta.js +341 -0
- package/dist/core/delta/delta.js.map +1 -0
- package/dist/core/delta/document.js +177 -0
- package/dist/core/delta/document.js.map +1 -0
- package/dist/core/delta/scope.js +48 -0
- package/dist/core/delta/scope.js.map +1 -0
- package/dist/core/delta/select.js +237 -0
- package/dist/core/delta/select.js.map +1 -0
- package/dist/core/dependencies/dependencies.js +141 -0
- package/dist/core/dependencies/dependencies.js.map +1 -0
- package/dist/core/dependencies/facts.js +165 -0
- package/dist/core/dependencies/facts.js.map +1 -0
- package/dist/core/dependencies/fanin.js +88 -0
- package/dist/core/dependencies/fanin.js.map +1 -0
- package/dist/core/dependencies/graph.js +106 -0
- package/dist/core/dependencies/graph.js.map +1 -0
- package/dist/core/deployment/delta.js +191 -0
- package/dist/core/deployment/delta.js.map +1 -0
- package/dist/core/deployment/objects.js +145 -0
- package/dist/core/deployment/objects.js.map +1 -0
- package/dist/core/diff/base-git.js +230 -0
- package/dist/core/diff/base-git.js.map +1 -0
- package/dist/core/diff/base-state.js +237 -0
- package/dist/core/diff/base-state.js.map +1 -0
- package/dist/core/diff/joins.js +136 -0
- package/dist/core/diff/joins.js.map +1 -0
- package/dist/core/diff/scope/changed-paths.js +204 -0
- package/dist/core/diff/scope/changed-paths.js.map +1 -0
- package/dist/core/diff/scope/edges.js +82 -0
- package/dist/core/diff/scope/edges.js.map +1 -0
- package/dist/core/diff/semantic.js +312 -0
- package/dist/core/diff/semantic.js.map +1 -0
- package/dist/core/docs.js +37 -85
- package/dist/core/docs.js.map +1 -1
- package/dist/core/doctor/agents.js +238 -0
- package/dist/core/doctor/agents.js.map +1 -0
- package/dist/core/doctor/config.js +139 -0
- package/dist/core/doctor/config.js.map +1 -0
- package/dist/core/doctor/doctor.js +355 -0
- package/dist/core/doctor/doctor.js.map +1 -0
- package/dist/core/doctor/report.js +13 -0
- package/dist/core/doctor/report.js.map +1 -0
- package/dist/core/doctor/reports/scan.js +242 -0
- package/dist/core/doctor/reports/scan.js.map +1 -0
- package/dist/core/doctor/residue.js +110 -0
- package/dist/core/doctor/residue.js.map +1 -0
- package/dist/core/document/apply.js +224 -0
- package/dist/core/document/apply.js.map +1 -0
- package/dist/core/{frontmatter.js → document/frontmatter.js} +103 -2
- package/dist/core/document/frontmatter.js.map +1 -0
- package/dist/core/document/grammar/directives.js +143 -0
- package/dist/core/document/grammar/directives.js.map +1 -0
- package/dist/core/document/parse.js +286 -0
- package/dist/core/document/parse.js.map +1 -0
- package/dist/core/document/scenarios.js +238 -0
- package/dist/core/document/scenarios.js.map +1 -0
- package/dist/core/document/spec.js +234 -0
- package/dist/core/document/spec.js.map +1 -0
- package/dist/core/{config.js → envelope/config.js} +89 -18
- package/dist/core/envelope/config.js.map +1 -0
- package/dist/core/envelope/json.js +209 -0
- package/dist/core/envelope/json.js.map +1 -0
- package/dist/core/{version.js → envelope/version.js} +3 -3
- package/dist/core/envelope/version.js.map +1 -0
- package/dist/core/explain/families.js +180 -0
- package/dist/core/explain/families.js.map +1 -0
- package/dist/core/explain/fix-tables.js +178 -0
- package/dist/core/explain/fix-tables.js.map +1 -0
- package/dist/core/explain/lookup.js +194 -0
- package/dist/core/explain/lookup.js.map +1 -0
- package/dist/core/explain/refusals.js +49 -0
- package/dist/core/explain/refusals.js.map +1 -0
- package/dist/core/explain/terms/documents.js +227 -0
- package/dist/core/explain/terms/documents.js.map +1 -0
- package/dist/core/explain/terms/done-check.js +144 -0
- package/dist/core/explain/terms/done-check.js.map +1 -0
- package/dist/core/explain/terms/entry.js +14 -0
- package/dist/core/explain/terms/entry.js.map +1 -0
- package/dist/core/explain/terms/stages.js +71 -0
- package/dist/core/explain/terms/stages.js.map +1 -0
- package/dist/core/explain/terms/tasks.js +97 -0
- package/dist/core/explain/terms/tasks.js.map +1 -0
- package/dist/core/explain/terms.js +103 -0
- package/dist/core/explain/terms.js.map +1 -0
- package/dist/core/explore/describe.js +105 -0
- package/dist/core/explore/describe.js.map +1 -0
- package/dist/core/explore/explore.js +204 -0
- package/dist/core/explore/explore.js.map +1 -0
- package/dist/core/fleet-context.js +174 -146
- package/dist/core/fleet-context.js.map +1 -1
- package/dist/core/gate/checks.js +208 -0
- package/dist/core/gate/checks.js.map +1 -0
- package/dist/core/gate/partners.js +246 -0
- package/dist/core/gate/partners.js.map +1 -0
- package/dist/core/gate/report.js +47 -0
- package/dist/core/gate/report.js.map +1 -0
- package/dist/core/gate/verification.js +176 -0
- package/dist/core/gate/verification.js.map +1 -0
- package/dist/core/gherkin/digest.js +60 -0
- package/dist/core/gherkin/digest.js.map +1 -0
- package/dist/core/gherkin/emit.js +177 -0
- package/dist/core/gherkin/emit.js.map +1 -0
- package/dist/core/gherkin/read.js +76 -0
- package/dist/core/gherkin/read.js.map +1 -0
- package/dist/core/gherkin/stale.js +210 -0
- package/dist/core/gherkin/stale.js.map +1 -0
- package/dist/core/gherkin/stamp.js +77 -0
- package/dist/core/gherkin/stamp.js.map +1 -0
- package/dist/core/gherkin/steps/catalogue.js +154 -0
- package/dist/core/gherkin/steps/catalogue.js.map +1 -0
- package/dist/core/gherkin/steps/inventory.js +98 -0
- package/dist/core/gherkin/steps/inventory.js.map +1 -0
- package/dist/core/gherkin/steps/phrase.js +72 -0
- package/dist/core/gherkin/steps/phrase.js.map +1 -0
- package/dist/core/glossary/delta.js +109 -0
- package/dist/core/glossary/delta.js.map +1 -0
- package/dist/core/glossary/tree.js +73 -0
- package/dist/core/glossary/tree.js.map +1 -0
- package/dist/core/{concurrency.js → kernel/concurrency.js} +19 -0
- package/dist/core/kernel/concurrency.js.map +1 -0
- package/dist/core/{document-bytes.js → kernel/document-bytes.js} +1 -1
- package/dist/core/kernel/document-bytes.js.map +1 -0
- package/dist/core/kernel/fences.js +42 -0
- package/dist/core/kernel/fences.js.map +1 -0
- package/dist/core/kernel/ids/capability.js +72 -0
- package/dist/core/kernel/ids/capability.js.map +1 -0
- package/dist/core/kernel/ids/dirs.js +33 -0
- package/dist/core/kernel/ids/dirs.js.map +1 -0
- package/dist/core/kernel/ids/feature.js +75 -0
- package/dist/core/kernel/ids/feature.js.map +1 -0
- package/dist/core/kernel/ids/fqn/ancestors.js +65 -0
- package/dist/core/kernel/ids/fqn/ancestors.js.map +1 -0
- package/dist/core/kernel/ids/service.js +156 -0
- package/dist/core/kernel/ids/service.js.map +1 -0
- package/dist/core/kernel/ids/subsystem.js +63 -0
- package/dist/core/kernel/ids/subsystem.js.map +1 -0
- package/dist/core/{path-safety.js → kernel/path-safety.js} +56 -4
- package/dist/core/kernel/path-safety.js.map +1 -0
- package/dist/core/{records.js → kernel/records.js} +11 -0
- package/dist/core/kernel/records.js.map +1 -0
- package/dist/core/links/backlinks.js +66 -0
- package/dist/core/links/backlinks.js.map +1 -0
- package/dist/core/links/case.js +74 -0
- package/dist/core/links/case.js.map +1 -0
- package/dist/core/links/corpus.js +118 -0
- package/dist/core/links/corpus.js.map +1 -0
- package/dist/core/links/findings.js +110 -0
- package/dist/core/links/findings.js.map +1 -0
- package/dist/core/links/parse.js +265 -0
- package/dist/core/links/parse.js.map +1 -0
- package/dist/core/mcp/argv.js +212 -0
- package/dist/core/mcp/argv.js.map +1 -0
- package/dist/core/mcp/author-tools.js +73 -0
- package/dist/core/mcp/author-tools.js.map +1 -0
- package/dist/core/mcp/framing.js +46 -0
- package/dist/core/mcp/framing.js.map +1 -0
- package/dist/core/mcp/protocol.js +280 -0
- package/dist/core/mcp/protocol.js.map +1 -0
- package/dist/core/mcp/tools.js +324 -0
- package/dist/core/mcp/tools.js.map +1 -0
- package/dist/core/obligations/obligations.js +106 -0
- package/dist/core/obligations/obligations.js.map +1 -0
- package/dist/core/openapi/baseline/gate.js +207 -0
- package/dist/core/openapi/baseline/gate.js.map +1 -0
- package/dist/core/openapi/baseline/plan.js +142 -0
- package/dist/core/openapi/baseline/plan.js.map +1 -0
- package/dist/core/openapi/baseline/record.js +174 -0
- package/dist/core/openapi/baseline/record.js.map +1 -0
- package/dist/core/openapi/contract-text.js +33 -0
- package/dist/core/openapi/contract-text.js.map +1 -0
- package/dist/core/openapi/contract-tree.js +301 -0
- package/dist/core/openapi/contract-tree.js.map +1 -0
- package/dist/core/openapi/depth.js +136 -0
- package/dist/core/openapi/depth.js.map +1 -0
- package/dist/core/openapi/digest.js +239 -0
- package/dist/core/openapi/digest.js.map +1 -0
- package/dist/core/{openapi.js → openapi/doc.js} +54 -108
- package/dist/core/openapi/doc.js.map +1 -0
- package/dist/core/openapi/merge/components.js +199 -0
- package/dist/core/openapi/merge/components.js.map +1 -0
- package/dist/core/openapi/merge/error.js +16 -0
- package/dist/core/openapi/merge/error.js.map +1 -0
- package/dist/core/openapi/merge/markers.js +204 -0
- package/dist/core/openapi/merge/markers.js.map +1 -0
- package/dist/core/openapi/merge/merge.js +232 -0
- package/dist/core/openapi/merge/merge.js.map +1 -0
- package/dist/core/openapi/merge/pin.js +110 -0
- package/dist/core/openapi/merge/pin.js.map +1 -0
- package/dist/core/openspec/decide/capabilities.js +244 -0
- package/dist/core/openspec/decide/capabilities.js.map +1 -0
- package/dist/core/openspec/decide/dispositions.js +63 -0
- package/dist/core/openspec/decide/dispositions.js.map +1 -0
- package/dist/core/openspec/decide/renames.js +179 -0
- package/dist/core/openspec/decide/renames.js.map +1 -0
- package/dist/core/openspec/decide/verdict.js +84 -0
- package/dist/core/openspec/decide/verdict.js.map +1 -0
- package/dist/core/openspec/inventory.js +220 -0
- package/dist/core/openspec/inventory.js.map +1 -0
- package/dist/core/openspec/model/mapping.js +78 -0
- package/dist/core/openspec/model/mapping.js.map +1 -0
- package/dist/core/openspec/model/model.js +70 -0
- package/dist/core/openspec/model/model.js.map +1 -0
- package/dist/core/openspec/scan/changes.js +241 -0
- package/dist/core/openspec/scan/changes.js.map +1 -0
- package/dist/core/openspec/scan/config.js +191 -0
- package/dist/core/openspec/scan/config.js.map +1 -0
- package/dist/core/openspec/scan/shape.js +304 -0
- package/dist/core/openspec/scan/shape.js.map +1 -0
- package/dist/core/openspec/scan/walk.js +116 -0
- package/dist/core/openspec/scan/walk.js.map +1 -0
- package/dist/core/openspec/scan/workspace.js +71 -0
- package/dist/core/openspec/scan/workspace.js.map +1 -0
- package/dist/core/owners/codeowners.js +141 -0
- package/dist/core/owners/codeowners.js.map +1 -0
- package/dist/core/pack/features.js +120 -0
- package/dist/core/pack/features.js.map +1 -0
- package/dist/core/pack/joins.js +112 -0
- package/dist/core/pack/joins.js.map +1 -0
- package/dist/core/pack/living.js +157 -0
- package/dist/core/pack/living.js.map +1 -0
- package/dist/core/pack/pack.js +120 -0
- package/dist/core/pack/pack.js.map +1 -0
- package/dist/core/permissions/permissions.js +87 -0
- package/dist/core/permissions/permissions.js.map +1 -0
- package/dist/core/projection/api.js +84 -0
- package/dist/core/projection/api.js.map +1 -0
- package/dist/core/projection/arch-slice.js +63 -0
- package/dist/core/projection/arch-slice.js.map +1 -0
- package/dist/core/projection/events.js +34 -0
- package/dist/core/projection/events.js.map +1 -0
- package/dist/core/projection/introduced.js +14 -0
- package/dist/core/projection/introduced.js.map +1 -0
- package/dist/core/provenance/findings.js +244 -0
- package/dist/core/provenance/findings.js.map +1 -0
- package/dist/core/provenance/git.js +201 -0
- package/dist/core/provenance/git.js.map +1 -0
- package/dist/core/provenance/gitq/moves.js +139 -0
- package/dist/core/provenance/gitq/moves.js.map +1 -0
- package/dist/core/provenance/gitq/vouched-ancestor.js +179 -0
- package/dist/core/provenance/gitq/vouched-ancestor.js.map +1 -0
- package/dist/core/provenance/sample/scope.js +238 -0
- package/dist/core/provenance/sample/scope.js.map +1 -0
- package/dist/core/provenance/sample/sections.js +61 -0
- package/dist/core/provenance/sample/sections.js.map +1 -0
- package/dist/core/provenance/sources.js +280 -0
- package/dist/core/provenance/sources.js.map +1 -0
- package/dist/core/provenance/stamp.js +220 -0
- package/dist/core/provenance/stamp.js.map +1 -0
- package/dist/core/provenance/walk.js +157 -0
- package/dist/core/provenance/walk.js.map +1 -0
- package/dist/core/repo/authored/paths.js +210 -0
- package/dist/core/repo/authored/paths.js.map +1 -0
- package/dist/core/repo/entries.js +126 -0
- package/dist/core/repo/entries.js.map +1 -0
- package/dist/core/repo/paths.js +322 -0
- package/dist/core/repo/paths.js.map +1 -0
- package/dist/core/repo/repo.js +308 -0
- package/dist/core/repo/repo.js.map +1 -0
- package/dist/core/repo/service-target.js +153 -0
- package/dist/core/repo/service-target.js.map +1 -0
- package/dist/core/repo/state.js +58 -0
- package/dist/core/repo/state.js.map +1 -0
- package/dist/core/repo/tree/find.js +61 -0
- package/dist/core/repo/tree/find.js.map +1 -0
- package/dist/core/repo/tree/fs.js +90 -0
- package/dist/core/repo/tree/fs.js.map +1 -0
- package/dist/core/repo/tree/marker.js +61 -0
- package/dist/core/repo/tree/marker.js.map +1 -0
- package/dist/core/repo/tree/render/body.js +258 -0
- package/dist/core/repo/tree/render/body.js.map +1 -0
- package/dist/core/repo/tree/render/projects.js +182 -0
- package/dist/core/repo/tree/render/projects.js.map +1 -0
- package/dist/core/repo/tree/render/service/header.js +125 -0
- package/dist/core/repo/tree/render/service/header.js.map +1 -0
- package/dist/core/repo/tree/render/service/peers.js +28 -0
- package/dist/core/repo/tree/render/service/peers.js.map +1 -0
- package/dist/core/repo/tree/render/service/view-id.js +67 -0
- package/dist/core/repo/tree/render/service/view-id.js.map +1 -0
- package/dist/core/repo/tree/render/service/views.js +78 -0
- package/dist/core/repo/tree/render/service/views.js.map +1 -0
- package/dist/core/repo/tree/render/stale.js +42 -0
- package/dist/core/repo/tree/render/stale.js.map +1 -0
- package/dist/core/repo/tree/render/text.js +84 -0
- package/dist/core/repo/tree/render/text.js.map +1 -0
- package/dist/core/repo/tree/render/views.js +293 -0
- package/dist/core/repo/tree/render/views.js.map +1 -0
- package/dist/core/repo/tree/walk.js +255 -0
- package/dist/core/repo/tree/walk.js.map +1 -0
- package/dist/core/results.js +146 -14
- package/dist/core/results.js.map +1 -1
- package/dist/core/scaffold/landscape.js +239 -0
- package/dist/core/scaffold/landscape.js.map +1 -0
- package/dist/core/scaffold/legacy.js +271 -0
- package/dist/core/scaffold/legacy.js.map +1 -0
- package/dist/core/scaffold/readme.js +84 -0
- package/dist/core/scaffold/readme.js.map +1 -0
- package/dist/core/staging/commit.js +252 -0
- package/dist/core/staging/commit.js.map +1 -0
- package/dist/core/staging/interrupted.js +96 -0
- package/dist/core/staging/interrupted.js.map +1 -0
- package/dist/core/staging/lock.js +268 -0
- package/dist/core/staging/lock.js.map +1 -0
- package/dist/core/staging/recovery/finding.js +35 -0
- package/dist/core/staging/recovery/finding.js.map +1 -0
- package/dist/core/staging/recovery/intent.js +95 -0
- package/dist/core/staging/recovery/intent.js.map +1 -0
- package/dist/core/staging/recovery/recover.js +204 -0
- package/dist/core/staging/recovery/recover.js.map +1 -0
- package/dist/core/staging/recovery/residue.js +62 -0
- package/dist/core/staging/recovery/residue.js.map +1 -0
- package/dist/core/staging/snapshot/manifest.js +188 -0
- package/dist/core/staging/snapshot/manifest.js.map +1 -0
- package/dist/core/staging/snapshot/snapshot.js +196 -0
- package/dist/core/staging/snapshot/snapshot.js.map +1 -0
- package/dist/core/staging/txn/forward.js +181 -0
- package/dist/core/staging/txn/forward.js.map +1 -0
- package/dist/core/staging/txn/journal.js +139 -0
- package/dist/core/staging/txn/journal.js.map +1 -0
- package/dist/core/staging/txn/transaction.js +75 -0
- package/dist/core/staging/txn/transaction.js.map +1 -0
- package/dist/core/staging/writes.js +113 -0
- package/dist/core/staging/writes.js.map +1 -0
- package/dist/core/status/actions/execution.js +60 -0
- package/dist/core/status/actions/execution.js.map +1 -0
- package/dist/core/status/contracts.js +126 -0
- package/dist/core/status/contracts.js.map +1 -0
- package/dist/core/status/feature/artifacts.js +196 -0
- package/dist/core/status/feature/artifacts.js.map +1 -0
- package/dist/core/status/feature/feature.js +214 -0
- package/dist/core/status/feature/feature.js.map +1 -0
- package/dist/core/status/feature/next.js +163 -0
- package/dist/core/status/feature/next.js.map +1 -0
- package/dist/core/status/feature/state.js +21 -0
- package/dist/core/status/feature/state.js.map +1 -0
- package/dist/core/status/feature/words.js +96 -0
- package/dist/core/status/feature/words.js.map +1 -0
- package/dist/core/status/fleet/fleet.js +216 -0
- package/dist/core/status/fleet/fleet.js.map +1 -0
- package/dist/core/status/fleet/next.js +302 -0
- package/dist/core/status/fleet/next.js.map +1 -0
- package/dist/core/status/interrupted.js +97 -0
- package/dist/core/status/interrupted.js.map +1 -0
- package/dist/core/status/report.js +31 -0
- package/dist/core/status/report.js.map +1 -0
- package/dist/core/status/scan.js +41 -0
- package/dist/core/status/scan.js.map +1 -0
- package/dist/core/status/verification.js +216 -0
- package/dist/core/status/verification.js.map +1 -0
- package/dist/core/tasks/packet.js +199 -0
- package/dist/core/tasks/packet.js.map +1 -0
- package/dist/core/tasks/record.js +43 -0
- package/dist/core/tasks/record.js.map +1 -0
- package/dist/core/tasks/sources.js +181 -0
- package/dist/core/tasks/sources.js.map +1 -0
- package/dist/core/tasks/stamps.js +76 -0
- package/dist/core/tasks/stamps.js.map +1 -0
- package/dist/core/tasks/unit.js +0 -0
- package/dist/core/tasks/unit.js.map +1 -0
- package/dist/core/usecases/capability.js +166 -0
- package/dist/core/usecases/capability.js.map +1 -0
- package/dist/core/usecases/delta/claims.js +140 -0
- package/dist/core/usecases/delta/claims.js.map +1 -0
- package/dist/core/usecases/delta/flows.js +101 -0
- package/dist/core/usecases/delta/flows.js.map +1 -0
- package/dist/core/usecases/delta/modified.js +315 -0
- package/dist/core/usecases/delta/modified.js.map +1 -0
- package/dist/core/usecases/delta/overlay.js +76 -0
- package/dist/core/usecases/delta/overlay.js.map +1 -0
- package/dist/core/usecases/fleet.js +296 -0
- package/dist/core/usecases/fleet.js.map +1 -0
- package/dist/core/usecases/grade/capability-tag.js +93 -0
- package/dist/core/usecases/grade/capability-tag.js.map +1 -0
- package/dist/core/usecases/grade/feature.js +88 -0
- package/dist/core/usecases/grade/feature.js.map +1 -0
- package/dist/core/usecases/grade/requirement-tag.js +94 -0
- package/dist/core/usecases/grade/requirement-tag.js.map +1 -0
- package/dist/core/usecases/grade/steps.js +266 -0
- package/dist/core/usecases/grade/steps.js.map +1 -0
- package/dist/core/usecases/grade/usecases.js +112 -0
- package/dist/core/usecases/grade/usecases.js.map +1 -0
- package/dist/core/usecases/operations.js +123 -0
- package/dist/core/usecases/operations.js.map +1 -0
- package/dist/core/usecases/place.js +44 -0
- package/dist/core/usecases/place.js.map +1 -0
- package/dist/core/usecases/service/exclude.js +119 -0
- package/dist/core/usecases/service/exclude.js.map +1 -0
- package/dist/core/usecases/service/flows.js +164 -0
- package/dist/core/usecases/service/flows.js.map +1 -0
- package/dist/core/usecases/suites/participants.js +83 -0
- package/dist/core/usecases/suites/participants.js.map +1 -0
- package/dist/core/usecases/suites/suites.js +45 -0
- package/dist/core/usecases/suites/suites.js.map +1 -0
- package/dist/core/usecases/touch.js +101 -0
- package/dist/core/usecases/touch.js.map +1 -0
- package/dist/core/verify/answers.js +180 -0
- package/dist/core/verify/answers.js.map +1 -0
- package/dist/core/verify/build.js +170 -0
- package/dist/core/verify/build.js.map +1 -0
- package/dist/core/verify/checklist.js +259 -0
- package/dist/core/verify/checklist.js.map +1 -0
- package/dist/core/verify/claims/identity.js +61 -0
- package/dist/core/verify/claims/identity.js.map +1 -0
- package/dist/core/verify/cross/diff.js +97 -0
- package/dist/core/verify/cross/diff.js.map +1 -0
- package/dist/core/verify/evidence/contract.js +169 -0
- package/dist/core/verify/evidence/contract.js.map +1 -0
- package/dist/core/verify/location.js +67 -0
- package/dist/core/verify/location.js.map +1 -0
- package/dist/core/verify/pins/lint.js +158 -0
- package/dist/core/verify/pins/lint.js.map +1 -0
- package/dist/core/verify/pins/pin.js +95 -0
- package/dist/core/verify/pins/pin.js.map +1 -0
- package/dist/core/verify/read/file.js +224 -0
- package/dist/core/verify/read/file.js.map +1 -0
- package/dist/core/verify/read/shape.js +169 -0
- package/dist/core/verify/read/shape.js.map +1 -0
- package/dist/core/verify/read/union.js +105 -0
- package/dist/core/verify/read/union.js.map +1 -0
- package/dist/core/verify/record.js +165 -0
- package/dist/core/verify/record.js.map +1 -0
- package/dist/core/verify/store/commit.js +99 -0
- package/dist/core/verify/store/commit.js.map +1 -0
- package/dist/core/verify/store/render.js +61 -0
- package/dist/core/verify/store/render.js.map +1 -0
- package/dist/core/vocabulary/health.js +91 -0
- package/dist/core/vocabulary/health.js.map +1 -0
- package/dist/core/vocabulary/issue.js +59 -0
- package/dist/core/vocabulary/issue.js.map +1 -0
- package/dist/core/vocabulary/maturity.js +216 -0
- package/dist/core/vocabulary/maturity.js.map +1 -0
- package/dist/core/vocabulary/report.js +90 -0
- package/dist/core/vocabulary/report.js.map +1 -0
- package/dist/core/vocabulary/steps.js +266 -0
- package/dist/core/vocabulary/steps.js.map +1 -0
- package/dist/core/workspace/discover.js +239 -0
- package/dist/core/workspace/discover.js.map +1 -0
- package/dist/core/workspace/render.js +52 -0
- package/dist/core/workspace/render.js.map +1 -0
- package/examples/README.md +232 -0
- package/examples/docs/architecture/adrs/0001-transactional-outbox.md +33 -0
- package/examples/docs/architecture/capabilities.yaml +31 -0
- package/examples/docs/architecture/landscape.likec4 +336 -0
- package/examples/docs/architecture/obligations.yaml +23 -0
- package/examples/docs/architecture/permissions.yaml +50 -0
- package/examples/docs/architecture/services.likec4 +70 -0
- package/examples/docs/architecture/subsystems.likec4 +18 -0
- package/examples/docs/architecture/usecases/order-notification.likec4 +74 -0
- package/examples/docs/capabilities/checkout/spec.md +55 -0
- package/examples/docs/capabilities/identity/tokens/spec.md +42 -0
- package/examples/docs/capabilities/order-notifications/spec.md +43 -0
- package/examples/docs/features/FEAT-101-payment-splitting/adrs/0001-dedicated-split-service.md +18 -0
- package/examples/docs/features/FEAT-101-payment-splitting/delta.likec4 +94 -0
- package/examples/docs/features/FEAT-101-payment-splitting/intent.md +44 -0
- package/examples/docs/features/FEAT-101-payment-splitting/specs/checkout-web/spec.md +21 -0
- package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-service/asyncapi.yaml +132 -0
- package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-service/spec.md +36 -0
- package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-split-service/arch.spec.md +40 -0
- package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-split-service/openapi.yaml +116 -0
- package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-split-service/spec.md +55 -0
- package/examples/docs/features/FEAT-112-retire-order-v1/intent.md +35 -0
- package/examples/docs/features/FEAT-112-retire-order-v1/specs/order-service/openapi.yaml +31 -0
- package/examples/docs/features/FEAT-112-retire-order-v1/specs/order-service/spec.md +17 -0
- package/examples/docs/features/archive/FEAT-088-refunds/.loam-before/files/architecture/landscape.likec4 +253 -0
- package/examples/docs/features/archive/FEAT-088-refunds/.loam-before/files/services/order-service/spec.md +121 -0
- package/examples/docs/features/archive/FEAT-088-refunds/.loam-before/files/services/payment-service/openapi.yaml +111 -0
- package/examples/docs/features/archive/FEAT-088-refunds/.loam-before/files/services/payment-service/spec.md +58 -0
- package/examples/docs/features/archive/FEAT-088-refunds/.loam-before/manifest.json +32 -0
- package/examples/docs/features/archive/FEAT-088-refunds/adrs/0001-refunds-stay-in-payment-service.md +26 -0
- package/examples/docs/features/archive/FEAT-088-refunds/delta.likec4 +28 -0
- package/examples/docs/features/archive/FEAT-088-refunds/intent.md +26 -0
- package/examples/docs/features/archive/FEAT-088-refunds/specs/order-service/spec.md +37 -0
- package/examples/docs/features/archive/FEAT-088-refunds/specs/payment-service/openapi.yaml +73 -0
- package/examples/docs/features/archive/FEAT-088-refunds/specs/payment-service/spec.md +23 -0
- package/examples/docs/features/archive/FEAT-088-refunds/verification.yaml +76 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/files/architecture/landscape.likec4 +275 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/files/services/payment-service/asyncapi.yaml +96 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/files/services/payment-service/spec.md +82 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/files/services/platform/notification-service/asyncapi.yaml +164 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/files/services/platform/notification-service/spec.md +91 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/manifest.json +46 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/delta.likec4 +36 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/intent.md +22 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/scenario-report.json +10 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/specs/notification-service/asyncapi.yaml +208 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/specs/notification-service/spec.md +24 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/specs/payment-service/asyncapi.yaml +137 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/specs/payment-service/spec.md +31 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/verification.yaml +84 -0
- package/examples/docs/glossary/order.md +15 -0
- package/examples/docs/glossary/payments/authorization.md +14 -0
- package/examples/docs/likec4.config.json +8 -0
- package/examples/docs/loam.json +3 -0
- package/examples/docs/services/checkout-web/model.likec4 +92 -0
- package/examples/docs/services/checkout-web/spec.md +91 -0
- package/examples/docs/services/checkout-web/ui/pages/checkout.page.yaml +40 -0
- package/examples/docs/services/checkout-web/ui/pages/order-status.page.yaml +24 -0
- package/examples/docs/services/checkout-web/ui/pages/split-payment.page.yaml +26 -0
- package/examples/docs/services/order-service/adrs/0001-orchestrated-order-lifecycle.md +52 -0
- package/examples/docs/services/order-service/arch.spec.md +134 -0
- package/examples/docs/services/order-service/asyncapi.yaml +109 -0
- package/examples/docs/services/order-service/health.yaml +57 -0
- package/examples/docs/services/order-service/model.likec4 +126 -0
- package/examples/docs/services/order-service/openapi.yaml +257 -0
- package/examples/docs/services/order-service/runbook.md +62 -0
- package/examples/docs/services/order-service/spec.md +134 -0
- package/examples/docs/services/payment-service/adrs/0001-payments-outbox.md +18 -0
- package/examples/docs/services/payment-service/adrs/0002-idempotency-keys-on-authorization.md +27 -0
- package/examples/docs/services/payment-service/arch.spec.md +76 -0
- package/examples/docs/services/payment-service/asyncapi.yaml +130 -0
- package/examples/docs/services/payment-service/health.yaml +39 -0
- package/examples/docs/services/payment-service/model.likec4 +68 -0
- package/examples/docs/services/payment-service/openapi.yaml +151 -0
- package/examples/docs/services/payment-service/runbook.md +37 -0
- package/examples/docs/services/payment-service/spec.md +88 -0
- package/examples/docs/services/platform/identity-service/adrs/0001-token-introspection-over-local-validation.md +60 -0
- package/examples/docs/services/platform/identity-service/arch.spec.md +120 -0
- package/examples/docs/services/platform/identity-service/health.yaml +70 -0
- package/examples/docs/services/platform/identity-service/model.likec4 +81 -0
- package/examples/docs/services/platform/identity-service/openapi.yaml +197 -0
- package/examples/docs/services/platform/identity-service/runbook.md +95 -0
- package/examples/docs/services/platform/identity-service/spec.md +119 -0
- package/examples/docs/services/platform/notification-service/asyncapi.yaml +200 -0
- package/examples/docs/services/platform/notification-service/health.yaml +40 -0
- package/examples/docs/services/platform/notification-service/model.likec4 +97 -0
- package/examples/docs/services/platform/notification-service/runbook.md +48 -0
- package/examples/docs/services/platform/notification-service/spec.md +112 -0
- package/examples/docs/services/platform/subsystem.yaml +2 -0
- package/examples/fleet.yaml +57 -0
- package/package.json +19 -6
- package/dist/commands/adopt.js +0 -240
- package/dist/commands/adopt.js.map +0 -1
- package/dist/commands/archive.js +0 -1313
- package/dist/commands/archive.js.map +0 -1
- package/dist/commands/delta.js +0 -388
- package/dist/commands/delta.js.map +0 -1
- package/dist/commands/docs-repo-gate.js.map +0 -1
- package/dist/commands/format.js +0 -17
- package/dist/commands/format.js.map +0 -1
- package/dist/commands/gherkin.js +0 -309
- package/dist/commands/gherkin.js.map +0 -1
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/list.js +0 -295
- package/dist/commands/list.js.map +0 -1
- package/dist/commands/migrate-openspec.js +0 -950
- package/dist/commands/migrate-openspec.js.map +0 -1
- package/dist/commands/new.js +0 -413
- package/dist/commands/new.js.map +0 -1
- package/dist/commands/rebase.js +0 -356
- package/dist/commands/rebase.js.map +0 -1
- package/dist/commands/show.js +0 -320
- package/dist/commands/show.js.map +0 -1
- package/dist/commands/status.js +0 -262
- package/dist/commands/status.js.map +0 -1
- package/dist/commands/unarchive.js +0 -317
- package/dist/commands/unarchive.js.map +0 -1
- package/dist/commands/validate.js +0 -1773
- package/dist/commands/validate.js.map +0 -1
- package/dist/commands/verify.js +0 -775
- package/dist/commands/verify.js.map +0 -1
- package/dist/commands/vouch.js +0 -421
- package/dist/commands/vouch.js.map +0 -1
- package/dist/core/agent.js +0 -2173
- package/dist/core/agent.js.map +0 -1
- package/dist/core/agents-stamp.js.map +0 -1
- package/dist/core/arch.js +0 -130
- package/dist/core/arch.js.map +0 -1
- package/dist/core/asyncapi.js +0 -253
- package/dist/core/asyncapi.js.map +0 -1
- package/dist/core/brief.js +0 -755
- package/dist/core/brief.js.map +0 -1
- package/dist/core/coherence.js +0 -577
- package/dist/core/coherence.js.map +0 -1
- package/dist/core/concurrency.js.map +0 -1
- package/dist/core/config.js.map +0 -1
- package/dist/core/delta.js +0 -476
- package/dist/core/delta.js.map +0 -1
- package/dist/core/dependencies.js +0 -356
- package/dist/core/dependencies.js.map +0 -1
- package/dist/core/doctor.js +0 -596
- package/dist/core/doctor.js.map +0 -1
- package/dist/core/document-bytes.js.map +0 -1
- package/dist/core/explore.js +0 -225
- package/dist/core/explore.js.map +0 -1
- package/dist/core/frontmatter.js.map +0 -1
- package/dist/core/gherkin.js +0 -463
- package/dist/core/gherkin.js.map +0 -1
- package/dist/core/health.js +0 -67
- package/dist/core/health.js.map +0 -1
- package/dist/core/ids.js +0 -122
- package/dist/core/ids.js.map +0 -1
- package/dist/core/issue.js +0 -9
- package/dist/core/issue.js.map +0 -1
- package/dist/core/json.js +0 -74
- package/dist/core/json.js.map +0 -1
- package/dist/core/likec4.js +0 -489
- package/dist/core/likec4.js.map +0 -1
- package/dist/core/maturity.js +0 -66
- package/dist/core/maturity.js.map +0 -1
- package/dist/core/openapi-merge.js +0 -552
- package/dist/core/openapi-merge.js.map +0 -1
- package/dist/core/openapi.js.map +0 -1
- package/dist/core/openspec-inventory.js +0 -1440
- package/dist/core/openspec-inventory.js.map +0 -1
- package/dist/core/path-safety.js.map +0 -1
- package/dist/core/provenance.js +0 -787
- package/dist/core/provenance.js.map +0 -1
- package/dist/core/records.js.map +0 -1
- package/dist/core/repo.js +0 -438
- package/dist/core/repo.js.map +0 -1
- package/dist/core/report.js +0 -47
- package/dist/core/report.js.map +0 -1
- package/dist/core/spec.js +0 -505
- package/dist/core/spec.js.map +0 -1
- package/dist/core/staging.js +0 -890
- package/dist/core/staging.js.map +0 -1
- package/dist/core/status.js +0 -1132
- package/dist/core/status.js.map +0 -1
- package/dist/core/steps.js +0 -72
- package/dist/core/steps.js.map +0 -1
- package/dist/core/verify.js +0 -807
- package/dist/core/verify.js.map +0 -1
- package/dist/core/version.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,41 +1,172 @@
|
|
|
1
1
|
# loam
|
|
2
2
|
|
|
3
|
-
**Architecture-first
|
|
3
|
+
**Architecture-first semantic integrity and change governance for evolving software systems.**
|
|
4
4
|
|
|
5
5
|

|
|
6
6
|

|
|
7
7
|
[](https://github.com/ybotok/loam/actions/workflows/ci.yml)
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
> **Pre-release: `0.
|
|
11
|
-
|
|
12
|
-
|
|
8
|
+
[](https://www.npmjs.com/package/@ybotok/loam)
|
|
9
|
+
|
|
10
|
+
> **Pre-release: `0.2.0-alpha.13`** is the version this checkout's `package.json` names, on the 0.2
|
|
11
|
+
> line of [`@ybotok/loam`](https://www.npmjs.com/package/@ybotok/loam). Whether npm serves it is not
|
|
12
|
+
> something this file can know — a version is cut before its publish runs, and a publish can fail
|
|
13
|
+
> after — so **the npm dist-tags are the source of truth**: the badge above reads the `alpha` tag, and
|
|
14
|
+
> `npm view @ybotok/loam dist-tags` prints every tag. Prereleases publish under `alpha`, so
|
|
15
|
+
> `npm i @ybotok/loam@alpha` installs the newest one that did. `latest` is moved onto a release by
|
|
16
|
+
> hand once it has published, so a plain `npm i @ybotok/loam` resolves to an earlier release until it
|
|
17
|
+
> is moved. See [Status](#status).
|
|
18
|
+
|
|
19
|
+
`loam` keeps an authored C4 model, requirements, API and event contracts, permissions, domain
|
|
20
|
+
vocabulary and verification evidence in explicit agreement as a system changes. The same lifecycle
|
|
21
|
+
governs a modular monolith, a distributed service fleet, or a hybrid of both; the CLI and filesystem
|
|
22
|
+
call each governed implementation boundary a `service`, but it need not be a network service.
|
|
23
|
+
|
|
24
|
+
For an existing boundary, `loam` briefs an agent to document it **by reading its code**, then checks
|
|
25
|
+
the result without pretending to extract architectural meaning itself. Forward changes start from
|
|
26
|
+
an authored C4 delta: `loam` projects it onto each affected boundary, generates digest-stamped
|
|
27
|
+
Gherkin, and checks that behavior, architecture, contracts and evidence still join.
|
|
13
28
|
|
|
14
29
|
## Contents
|
|
15
30
|
|
|
16
|
-
- [Why](#why) · [
|
|
17
|
-
|
|
18
|
-
- [
|
|
19
|
-
|
|
31
|
+
- [Why](#why) · [System shapes](#one-lifecycle-several-system-shapes) · [Install](#install) ·
|
|
32
|
+
[Quick start](#quick-start) · [Commands](#commands) · [Working with AI agents](#working-with-ai-agents)
|
|
33
|
+
- [Docs](#docs) · [Development](#development) · [Status](#status) · [Contributing](#contributing) ·
|
|
34
|
+
[Security](#security) · [License](#license)
|
|
35
|
+
- Companion pages: [QUICKSTART.md](QUICKSTART.md) — install-to-first-change ·
|
|
36
|
+
[WORKFLOW.md](WORKFLOW.md) — the protocol · [SCHEMA.md](SCHEMA.md) — the reference ·
|
|
37
|
+
[ROADMAP.md](ROADMAP.md) · [COMPARISON.md](COMPARISON.md)
|
|
20
38
|
|
|
21
39
|
## Why
|
|
22
40
|
|
|
23
|
-
|
|
41
|
+
Software architecture does not live in one artifact. A business-simple feature can cross modules,
|
|
42
|
+
processes or services while C4 diagrams, requirements, API contracts, permissions and test evidence
|
|
43
|
+
drift independently. `loam` makes the authored C4 model the center and gives those artifacts
|
|
44
|
+
referential integrity: every join below is an exact token spelled in two places, never a heuristic
|
|
45
|
+
over prose.
|
|
46
|
+
|
|
47
|
+
| The join | Ties |
|
|
48
|
+
|---|---|
|
|
49
|
+
| `Operations:` ↔ OpenAPI `operationId` | a requirement to the endpoint it governs |
|
|
50
|
+
| `Publishes:` / `Consumes:` ↔ AsyncAPI message names | a requirement to the event spine |
|
|
51
|
+
| `Covers:` ↔ C4 elements, `#obl-` tags, `health.yaml` ids | an architectural obligation to what it accounts for |
|
|
52
|
+
| `Requires:` ↔ `architecture/permissions.yaml` | a requirement to the system-wide authorization vocabulary |
|
|
53
|
+
| `Realizes:` ↔ `capabilities/<cap>/spec.md` | a service requirement to the business promise it keeps |
|
|
54
|
+
| `#cap-` / `#req-` on a `dynamic view` ↔ a capability requirement | a cross-service use case to the promise it keeps |
|
|
55
|
+
| a Markdown link ↔ `glossary/<term>.md` | a document to the word it uses |
|
|
56
|
+
|
|
57
|
+
Architecture has its own requirement axis (`arch.spec.md`) because a business spec will not mention
|
|
58
|
+
the transactional outbox, retries or alerts.
|
|
59
|
+
|
|
60
|
+
### One lifecycle, several system shapes
|
|
61
|
+
|
|
62
|
+
Topology changes where loam's checks pay off; it does not change the lifecycle:
|
|
63
|
+
|
|
64
|
+
- **A modular monolith is one governed boundary.** Bind one root element to one
|
|
65
|
+
`services/<app>/` directory and draw modules, components and their relationships beneath it.
|
|
66
|
+
`Covers:` can name those nested elements and edges, and a feature's `delta.likec4` can change
|
|
67
|
+
them through the same validate/archive transaction as any fleet change.
|
|
68
|
+
- **A distributed system is several governed boundaries.** Each service gets its own directory and
|
|
69
|
+
binding; cross-boundary edges can join to provider OpenAPI operations or AsyncAPI messages, and a
|
|
70
|
+
feature is projected onto every boundary it touches.
|
|
71
|
+
- **A hybrid uses both shapes at once.** A modular application can sit beside independently
|
|
72
|
+
deployed services and external systems in the same landscape. The binding, not the C4 kind or
|
|
73
|
+
nesting depth, decides which `services/<id>/` owns an element.
|
|
74
|
+
|
|
75
|
+
For example, the frozen `service` term can name an application while its internal modules remain
|
|
76
|
+
ordinary C4 elements. This is `architecture/landscape.likec4`, the fleet map — the one document
|
|
77
|
+
that declares the kinds:
|
|
78
|
+
|
|
79
|
+
```likec4
|
|
80
|
+
specification {
|
|
81
|
+
element softwareSystem
|
|
82
|
+
element component
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
model {
|
|
86
|
+
commerce = softwareSystem 'commerce-app' {
|
|
87
|
+
metadata {
|
|
88
|
+
service 'commerce-app'
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
orders = component 'Orders module'
|
|
92
|
+
billing = component 'Billing module'
|
|
93
|
+
orders -> billing 'Reserves credit'
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
The modules can equally live in `services/commerce-app/model.likec4`, which is the ordinary place
|
|
99
|
+
for them once the application has one — as an **extending model**, declaring no kinds of its own and
|
|
100
|
+
saying `extend commerce { … }` on the element above. SCHEMA.md's "Two shapes of a service model" has
|
|
101
|
+
that shape, the older one that parses alone, and the rule that picks between them.
|
|
102
|
+
|
|
103
|
+
An internal edge normally carries no `metadata { op }`: that key specifically joins a call to the
|
|
104
|
+
governed boundary's OpenAPI contract. An architecture requirement can instead say
|
|
105
|
+
`Covers: commerce.orders -> commerce.billing`. Fleet-level maturity, dependency and scorecard views
|
|
106
|
+
still aggregate at the bound `service`; nested elements get architecture coverage and feature
|
|
107
|
+
lifecycle, not a separate deployment status invented for each module.
|
|
108
|
+
|
|
109
|
+
**There is no extractor, and there will not be one.** Nothing deterministic reads a legacy service
|
|
110
|
+
and says what its architecture *means*, and a model that was guessed is worse than none — everyone
|
|
111
|
+
downstream has to re-derive it to know whether to believe it. So loam takes the half of the job that
|
|
112
|
+
is mechanical: it **states the work** and it **checks the result**. An agent does the reading, and
|
|
113
|
+
both halves are written down: the question in the brief or the checklist, the answer in `sources` or
|
|
114
|
+
the verification record.
|
|
115
|
+
|
|
116
|
+
### What green means here, and what it does not
|
|
117
|
+
|
|
118
|
+
Most of this category will tell you what it checks. loam ships the other list too, in the binary:
|
|
119
|
+
**[`src/core/brief/unchecked.ts`](https://github.com/ybotok/loam/blob/main/src/core/brief/unchecked.ts)
|
|
120
|
+
is seventeen statements of what no check will ever tell you**, printed into the adoption brief beside
|
|
121
|
+
the checks that do run. It says, in loam's own words, that nothing here knows whether the model is
|
|
122
|
+
the architecture the code actually has, whether a requirement is *true*, whether an `operationId` is
|
|
123
|
+
the one the code serves, or whether `sources` names the files anybody read. And it says the one that
|
|
124
|
+
matters most: **completeness is unchecked** — forty behaviours documented as one requirement passes
|
|
125
|
+
every check loam has, and so does a service with one endpoint documented out of thirty.
|
|
126
|
+
|
|
127
|
+
That list exists because a check that is silent for want of anything to ask must never read as a
|
|
128
|
+
check that passed. Green here means *the documents agree with each other* — never that they are
|
|
129
|
+
true, and never that they are complete.
|
|
130
|
+
|
|
131
|
+
The same refusal runs through the evidence model. `loam verify` records who answered every claim,
|
|
132
|
+
and keeps two answers permanently distinguishable:
|
|
133
|
+
|
|
134
|
+
- **`verified`** — a digest-tagged scenario answered by a green test run. The digest is taken over
|
|
135
|
+
the scenario's *body*, so rewording a `Given` breaks the link on purpose. Tag-based coverage
|
|
136
|
+
(`@REQ-1234` and its relatives) survives any rewrite and goes on asserting a claim nobody
|
|
137
|
+
re-checked.
|
|
138
|
+
- **`attested`** — an agent's word, with `file:line` evidence at an attested commit. Recorded in
|
|
139
|
+
full, labelled on every surface, and never promoted. A feature whose scenarios rest on attestation
|
|
140
|
+
does not become verified because a gate would be greener if it did.
|
|
141
|
+
|
|
142
|
+
Neither gates the archive. The claim loam makes for its evidence is persistence and honest
|
|
143
|
+
provenance — not that every recorded judgement is true.
|
|
144
|
+
|
|
145
|
+
Files stay the source of truth. Delete `loam` and every artifact remains as Markdown, LikeC4 DSL,
|
|
146
|
+
Gherkin and YAML — no server, no database, no state file, three runtime dependencies. The two flows
|
|
147
|
+
this implies, what gates and what only advises, are in [WORKFLOW.md](WORKFLOW.md).
|
|
24
148
|
|
|
25
149
|
## Install
|
|
26
150
|
|
|
27
|
-
**Node ≥ 22.22.3** (the `engines` floor in `package.json`) is the only prerequisite for everything
|
|
151
|
+
**Node ≥ 22.22.3** (the `engines` floor in `package.json`) is the only prerequisite for everything
|
|
152
|
+
loam derives from the docs repo. C4 modeling uses **[LikeC4](https://likec4.dev)** (pinned exact),
|
|
153
|
+
an ordinary npm runtime dependency loaded in-process (TypeScript-native): no JVM, no external CLI.
|
|
154
|
+
The one outside binary loam ever calls is **`git`** — read-only questions in whichever repository
|
|
155
|
+
the command is about (`verify --service`, `vouch`'s source digest, `subsystem move`/`history`, and
|
|
156
|
+
`diff --base`), plus the one blessed `git add` that stages a subsystem move's renames. Never the
|
|
157
|
+
network.
|
|
28
158
|
|
|
29
159
|
```bash
|
|
30
160
|
npm install -g @ybotok/loam
|
|
31
161
|
loam --version
|
|
32
162
|
```
|
|
33
163
|
|
|
34
|
-
`loam doctor` is the wiring check, not the install check: run where no `loam.json` is in scope, it
|
|
164
|
+
`loam doctor` is the wiring check, not the install check: run where no `loam.json` is in scope, it
|
|
165
|
+
reports `doctor.config-missing` and exits 1 by design. Save it for after `loam init`.
|
|
35
166
|
|
|
36
167
|
A per-repo dev dependency works the same way: `npm i -D @ybotok/loam`, then `npx loam …`.
|
|
37
168
|
|
|
38
|
-
|
|
169
|
+
To work on loam itself — or to run an unreleased commit — install from a clone:
|
|
39
170
|
|
|
40
171
|
```bash
|
|
41
172
|
git clone https://github.com/ybotok/loam.git && cd loam
|
|
@@ -46,170 +177,526 @@ Drop `--link` to build without a global `loam`; on Windows run `npm ci && npm ru
|
|
|
46
177
|
|
|
47
178
|
## Quick start
|
|
48
179
|
|
|
49
|
-
|
|
180
|
+
For the shortest install-to-first-feature path, including the exact chat commands and local problem
|
|
181
|
+
report flow, use [QUICKSTART.md](QUICKSTART.md). The routes below explain the alternative starting
|
|
182
|
+
positions in more depth.
|
|
50
183
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
`test/examples.test.ts` pins the validate summary and every finding code, and the archive plan file-for-file, so those outcomes cannot drift from the code; the `list` rendering is not pinned.
|
|
59
|
-
|
|
60
|
-
To wire loam into your own repositories, start at [Day zero](#day-zero-onboarding-a-fleet).
|
|
184
|
+
`loam --help` ends by naming where to start and the way out, and this section is the same two
|
|
185
|
+
commands in the same order: **`loam init --create`** first — every other command needs the docs repo
|
|
186
|
+
it writes — and **`loam doctor`** whenever a later run does not do what you expected, which reports
|
|
187
|
+
the runtime, the resolved `docsDir`, the access, the binding, and any finding with its `fix:` line.
|
|
188
|
+
Each path below is that first command aimed at a different starting position; `loam diff` is the one
|
|
189
|
+
that needs neither.
|
|
61
190
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
loam reads the core of [OpenSpec](https://github.com/Fission-AI/OpenSpec)'s requirement format: requirement/scenario headings and the `ADDED | MODIFIED | REMOVED` delta sections. Routine CI exercises seven representative upstream fixtures; a scheduled/manual sweep reproduces the broader compatibility result — counts *and* parse/serialize/parse stability of every requirement's content — against the full living, active and archived spec trees at the pinned OpenSpec v1.7.0 commit: **207 Markdown files, 739 requirements, 2273 scenarios** (the post-release main canary the same sweep pins is 209 / 742 / 2284). The boundary is explicit: OpenSpec `Purpose`, wrapper, and `RENAMED` semantics are not round-trippable — a `RENAMED` section is a loud `delta.unknown-section` error, not a silent drop, and `migrate-openspec` maps it rather than losing it.
|
|
65
|
-
|
|
66
|
-
| | OpenSpec | loam |
|
|
67
|
-
|---|---|---|
|
|
68
|
-
| System model | capability specs; beta Stores share planning across repos (Git-owned planning roots, read-only references), but model no service topology | C4 landscape + one ID spine across spec / arch / API |
|
|
69
|
-
| Executability | `/opsx:verify` asks an agent to inspect implementation and tests; advisory | digest-stamped Gherkin; a green cucumber run confirms a scenario mechanically, and a scenario confirmed on an agent's word instead is recorded as **attested, not verified** (`verify.scenario-attested`) |
|
|
70
|
-
| Drift control | structural CLI validation plus agent-led verification on demand; no persisted digests to compare against later | persisted source/content digests + human vouch. `content.stale` is checkable fleet-wide; `sources.stale` only inside each service's own repo. Both are warnings — `--strict` is the CI escalation |
|
|
71
|
-
| Change merge | validates prepared requirement updates, supports `RENAMED`, then writes specs sequentially | transactional 3-axis merge behind a coherence gate, digest-checked byte-level undo, and a commit journal that repairs an interrupted merge |
|
|
72
|
-
| Agent surface | skills + commands for 34 tools at v1.7.0; `openspec update` regenerates them in place, skipping ones already current | skills for 20 tools and commands for the 19 that read them (Codex takes skills only); `--json` on every command; generated files carry a version stamp and are **never** regenerated — drift is reported (`doctor.agent-files-stale`) and repaired by hand |
|
|
73
|
-
| Entry curve | minutes | you learn LikeC4 + frontmatter + the operationId spine first |
|
|
191
|
+
### Start from the fleet spine
|
|
74
192
|
|
|
75
|
-
|
|
193
|
+
The path that pays off first, because it is the only one whose checks have two sides to compare.
|
|
194
|
+
It needs **no requirement Markdown, no `loam adopt`, and no `loam vouch`** — just the map and the
|
|
195
|
+
contracts you already have.
|
|
76
196
|
|
|
77
|
-
|
|
197
|
+
Write a `fleet.yaml` naming your services and who calls whom
|
|
198
|
+
([`examples/fleet.yaml`](https://github.com/ybotok/loam/blob/main/examples/fleet.yaml) is a real
|
|
199
|
+
one), then:
|
|
78
200
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
201
|
+
```bash
|
|
202
|
+
loam init --docs . --create # in an empty directory: the docs repo
|
|
203
|
+
loam seed --from fleet.yaml # the fleet map + one services/<id>/ per service
|
|
204
|
+
```
|
|
82
205
|
|
|
83
|
-
|
|
84
|
-
loam init --docs . --create
|
|
85
|
-
```
|
|
206
|
+
Now do the two things only you can do:
|
|
86
207
|
|
|
87
|
-
|
|
208
|
+
1. **Drop each service's existing `openapi.yaml`** into `services/<id>/`. Copy the one your build
|
|
209
|
+
already produces — loam never generates it and never reads your code.
|
|
210
|
+
2. **Name the operation on each call edge** in `architecture/landscape.likec4`:
|
|
211
|
+
`metadata { op 'createOrder' }`. This is the labour, and it is also the artifact nothing else
|
|
212
|
+
produces — a drawn arrow becomes a checked join.
|
|
88
213
|
|
|
89
|
-
|
|
214
|
+
```bash
|
|
215
|
+
loam validate --all
|
|
216
|
+
```
|
|
90
217
|
|
|
91
|
-
|
|
218
|
+
That already convicts the fleet's real edges: a call naming an operation its provider does not
|
|
219
|
+
define is `spine.op-undefined`, an **error**, and one letter is enough — `authorisePayment` against
|
|
220
|
+
a contract spelling it `authorizePayment` fails here and nowhere else a team normally runs.
|
|
221
|
+
|
|
222
|
+
**Expect a red run, and read it correctly.** Five seeded services with no C4 centre report
|
|
223
|
+
`service.no-model` (error) five times, and `service.no-spec` (warn) five times. Those are not
|
|
224
|
+
misconfiguration: they are a truthful reading of a fleet where adoption has not started, and they
|
|
225
|
+
stay until you write those documents. The finding you came for is the spine one. Under the `--base`
|
|
226
|
+
PR gate [below](#guard-the-fleets-edges-on-every-pr), a PR that adds a service's `openapi.yaml`
|
|
227
|
+
stays red until that service has a `model.likec4` — the gate grades the service the PR touched, and
|
|
228
|
+
`service.no-model` is that ratchet working as designed — while a PR that only names operations on
|
|
229
|
+
the map is graded on those edges alone.
|
|
230
|
+
[`test/spine-first.test.ts`](https://github.com/ybotok/loam/blob/main/test/spine-first.test.ts)
|
|
231
|
+
pins this whole sequence against the shipped `examples/fleet.yaml`, so the recipe cannot drift from
|
|
232
|
+
the binary.
|
|
233
|
+
|
|
234
|
+
From here, [WORKFLOW.md's day zero](WORKFLOW.md#day-zero-onboarding-a-fleet) is the rest: bind each
|
|
235
|
+
service repo, adopt, grade, promote. Bind each one with the service profile:
|
|
92
236
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
237
|
+
```bash
|
|
238
|
+
# in each service checkout, beside the docs repo
|
|
239
|
+
loam init --docs ../docs --service payment-service --agent-profile service
|
|
240
|
+
loam doctor
|
|
241
|
+
```
|
|
97
242
|
|
|
98
|
-
|
|
243
|
+
Pass the profile explicitly. `--agent-profile` defaults to `full`, with `--service` or without it,
|
|
244
|
+
and `full` writes all seven entry points into the checkout — `loam-feature` and `loam-ship` among
|
|
245
|
+
them, the two workflows that author a feature and archive it into the living docs, which the `docs`
|
|
246
|
+
profile gives to the docs repo. `service` writes the five that run beside the code: `loam-adopt`,
|
|
247
|
+
`loam-implement`, `loam-check`, `loam-verify` and `loam-report`. Across a hundred service repos that
|
|
248
|
+
is the difference between one place a cross-service change starts and a hundred places an agent
|
|
249
|
+
can be told to start one. The people in those service repos need about a screen of this:
|
|
250
|
+
[docs/SERVICE-TEAMS.md](https://github.com/ybotok/loam/blob/main/docs/SERVICE-TEAMS.md).
|
|
251
|
+
|
|
252
|
+
### Guard the fleet's edges on every PR
|
|
253
|
+
|
|
254
|
+
Two commands, each installable on its own with no part of the workflow above adopted. **`loam diff`
|
|
255
|
+
exits 1 when a pull request removes an operation or an event message the fleet still consumes**,
|
|
256
|
+
and names the consumers — of a removal, a deprecation, or a change to what an operation or message
|
|
257
|
+
returns. That question — *who is joined to this?* — is the one a fleet answers wrong, and it is
|
|
258
|
+
answerable only from a document that knows the whole fleet. **`loam validate --all --base <ref>`
|
|
259
|
+
grades only the boundaries the branch touched**, which is what lets a strict gate go in on the
|
|
260
|
+
first day of adoption and tighten as the system gets written down.
|
|
261
|
+
|
|
262
|
+
```yaml
|
|
263
|
+
# .github/workflows/fleet-edges.yml — in the docs repo
|
|
264
|
+
name: fleet edges
|
|
265
|
+
on: pull_request
|
|
266
|
+
jobs:
|
|
267
|
+
edges:
|
|
268
|
+
runs-on: ubuntu-latest
|
|
269
|
+
env:
|
|
270
|
+
LOAM: "@ybotok/loam@0.2.0-alpha.13" # an exact version: bump it in a PR of its own
|
|
271
|
+
BASE: origin/${{ github.base_ref }}
|
|
272
|
+
steps:
|
|
273
|
+
- uses: actions/checkout@v4
|
|
274
|
+
with: { fetch-depth: 0 } # every step reads the base out of git history
|
|
275
|
+
- uses: actions/setup-node@v4
|
|
276
|
+
with: { node-version: 22 }
|
|
277
|
+
# did you remove something an authored consumer still names? (fails) — and
|
|
278
|
+
# who is joined to each operation or message you changed? (warns, naming them)
|
|
279
|
+
- run: npx -y "$LOAM" diff --base "$BASE"
|
|
280
|
+
# did you document what you touched?
|
|
281
|
+
- run: npx -y "$LOAM" validate --all --base "$BASE" --strict
|
|
282
|
+
# does a changed operation break its readers? oasdiff answers that; loam does not
|
|
283
|
+
- run: |
|
|
284
|
+
for spec in $(git diff --name-only --diff-filter=M "$BASE"... -- 'services/*openapi.yaml'); do
|
|
285
|
+
git show "$BASE:./$spec" > "$RUNNER_TEMP/base.yaml"
|
|
286
|
+
docker run --rm -v "$RUNNER_TEMP:/base:ro" -v "$PWD:/head:ro" tufin/oasdiff \
|
|
287
|
+
breaking /base/base.yaml "/head/$spec" --fail-on ERR
|
|
288
|
+
done
|
|
289
|
+
```
|
|
99
290
|
|
|
100
|
-
|
|
291
|
+
**Pin loam, and move the pin on purpose.** An unpinned `npx -y @ybotok/loam` runs whatever the
|
|
292
|
+
`latest` tag points at on the day the job starts, so a release can change what gates your pull
|
|
293
|
+
requests in the middle of a review. Bump `LOAM` in a pull request of its own: run
|
|
294
|
+
`loam subsystem sync` with the new version, update the `<!-- generated by loam vX.Y.Z -->` stamp
|
|
295
|
+
in the docs repo's `AGENTS.md`, and read the release's CHANGELOG entry, which opens with what a
|
|
296
|
+
repository notices after upgrading. Pin the oasdiff image's tag the same way.
|
|
297
|
+
|
|
298
|
+
Three steps, three different questions, and none is another's cheaper form. `diff` reports every
|
|
299
|
+
removal against the fleet's authored consumers — landscape edges, other services' living
|
|
300
|
+
requirements, use-case hops — rather than against a rule list, which is why it repays installation
|
|
301
|
+
before anything else exists. It names who is joined to a changed operation or message, and it never
|
|
302
|
+
says whether the change breaks them: loam does not read what a schema says, so a renamed required
|
|
303
|
+
field and a new optional one are the same warning to it. That half is oasdiff's, and
|
|
304
|
+
`asyncapi diff`'s for event contracts. A caller drawn on the map with no operation on its edge is
|
|
305
|
+
listed as one nobody could check, never counted as no caller. `validate --base` grades the
|
|
306
|
+
boundaries this branch changed, at full strictness, and says out loud how much of the system that
|
|
307
|
+
was — a run with nothing in scope prints that it graded nothing rather than the word valid.
|
|
308
|
+
Unscoped, neither setting is usable on a partly-documented system: `loam validate --all` is green
|
|
309
|
+
over boundaries nobody has written yet, because warnings do not gate, and `--strict` over all of
|
|
310
|
+
them is red from the first minute of adoption until the last one is done.
|
|
311
|
+
|
|
312
|
+
An archive's PR stays red under `--base --strict` until its re-vouches land: the merge moves every
|
|
313
|
+
vouched spec it touches under its vouch stamp, so `content.stale` follows, and `loam archive` names
|
|
314
|
+
each such spec and its owner (`revouchOwed`) so those re-vouches can join the same PR.
|
|
315
|
+
|
|
316
|
+
**A `--base`-scoped validate cannot see a victim boundary the change did not touch.** Remove an
|
|
317
|
+
operation `payment-service` owns, and `checkout-web` — whose living requirement still names it —
|
|
318
|
+
is not in scope, so nothing in that gate reports the broken join. That is `loam diff --base`'s
|
|
319
|
+
question, it stays `loam diff --base`'s, and a green scoped validate is not a statement about the
|
|
320
|
+
consumers of what changed. A join the branch itself *wrote* is the other case: a call edge it adds
|
|
321
|
+
or edits in `architecture/` is graded against its provider's contract even with the provider out of
|
|
322
|
+
scope, so the one-letter `authorisePayment` above fails on the PR that introduces it.
|
|
323
|
+
[WORKFLOW.md](WORKFLOW.md#what-actually-gates) has what each does and
|
|
324
|
+
does not grade — including the oasdiff invocation for the byte-level OpenAPI breaking-change
|
|
325
|
+
catalogue, which loam deliberately does not reimplement.
|
|
326
|
+
|
|
327
|
+
### Check each service repo on its own pull requests
|
|
328
|
+
|
|
329
|
+
The docs repo's job cannot see provenance. `sources` resolve only inside a service's own
|
|
330
|
+
repository, so `sources.stale` — the code under a vouched spec moved — surfaces only in that
|
|
331
|
+
service repo's CI ([SCHEMA.md](SCHEMA.md), "Operating at fleet scale"). Its committed `loam.json`
|
|
332
|
+
reaches the docs repo through a relative `docsDir` such as `"../docs"`, so the job rebuilds the
|
|
333
|
+
side-by-side layout a laptop has. `actions/checkout` refuses `path: ../docs` — it writes only
|
|
334
|
+
beneath `GITHUB_WORKSPACE` — so check out **both** repositories as subdirectories of the workspace,
|
|
335
|
+
siblings, and run loam from the service's:
|
|
336
|
+
|
|
337
|
+
```yaml
|
|
338
|
+
# .github/workflows/loam.yml — in each service repo
|
|
339
|
+
name: loam
|
|
340
|
+
on: pull_request
|
|
341
|
+
jobs:
|
|
342
|
+
docs:
|
|
343
|
+
runs-on: ubuntu-latest
|
|
344
|
+
env:
|
|
345
|
+
LOAM: "@ybotok/loam@0.2.0-alpha.13" # the docs repo's pin: move them together
|
|
346
|
+
SERVICE: payment-service # this repo's "service" in its loam.json
|
|
347
|
+
steps:
|
|
348
|
+
# Both repositories as siblings under the workspace, the way a laptop holds
|
|
349
|
+
# them, so the committed "docsDir": "../docs" resolves unchanged.
|
|
350
|
+
- uses: actions/checkout@v4
|
|
351
|
+
with: { path: payment-service }
|
|
352
|
+
- uses: actions/checkout@v4
|
|
353
|
+
with:
|
|
354
|
+
repository: acme/docs # your docs repo
|
|
355
|
+
path: docs # the last segment of docsDir
|
|
356
|
+
token: ${{ secrets.LOAM_DOCS_READ_TOKEN }} # contents: read on the docs repo
|
|
357
|
+
- uses: actions/setup-node@v4
|
|
358
|
+
with: { node-version: 22 }
|
|
359
|
+
- name: loam validate --service
|
|
360
|
+
working-directory: payment-service
|
|
361
|
+
run: |
|
|
362
|
+
rc=0
|
|
363
|
+
npx -y "$LOAM" validate --service "$SERVICE" --json > "$RUNNER_TEMP/loam.json" || rc=$?
|
|
364
|
+
# one annotation per error and warning; a refusal (docs-missing, …) is one error
|
|
365
|
+
jq -r '
|
|
366
|
+
def esc: gsub("%"; "%25") | gsub("\r"; "%0D") | gsub("\n"; "%0A");
|
|
367
|
+
if .ok then
|
|
368
|
+
.targets[].findings[] | select(.severity != "ok")
|
|
369
|
+
| "::\(if .severity == "error" then "error" else "warning" end) title=\(.code)::\(.message | esc) (docs: \(.locations[0].path))"
|
|
370
|
+
else "::error title=\(.error.code)::\(.error.message | esc)" end
|
|
371
|
+
' "$RUNNER_TEMP/loam.json"
|
|
372
|
+
# the same findings as a table on the run's summary page
|
|
373
|
+
jq -r '
|
|
374
|
+
if .ok then
|
|
375
|
+
"### loam validate --service \(.targets[0].id) — \(.summary.errors) error(s), \(.summary.warnings) warning(s)",
|
|
376
|
+
"", "| severity | code | finding |", "|---|---|---|",
|
|
377
|
+
(.targets[].findings[] | select(.severity != "ok")
|
|
378
|
+
| "| \(.severity) | `\(.code)` | \(.message | gsub("\\|"; "\\|") | gsub("\n"; " ")) |")
|
|
379
|
+
else "### loam refused: `\(.error.code)`", "", .error.message end
|
|
380
|
+
' "$RUNNER_TEMP/loam.json" >> "$GITHUB_STEP_SUMMARY"
|
|
381
|
+
exit "$rc"
|
|
382
|
+
```
|
|
101
383
|
|
|
102
|
-
|
|
384
|
+
Run from a `payment-service` checkout beside `examples/docs`, in a repository with no
|
|
385
|
+
`src/main/java/` — the source that service's specs name — the step exits 1 and prints:
|
|
103
386
|
|
|
104
|
-
|
|
387
|
+
```text
|
|
388
|
+
::warning title=spine.op-link-missing::payment-service: landscape edge checkout-web → payment-service ("Calls the payment API") has no operation link (metadata { op }) (docs: services/payment-service)
|
|
389
|
+
::error title=sources.path-missing::payment-service: spec.md: 1 source(s) do not exist — src/main/java/ (docs: services/payment-service)
|
|
390
|
+
::error title=sources.path-missing::payment-service: arch.spec.md: 1 source(s) do not exist — src/main/java/ (docs: services/payment-service)
|
|
391
|
+
```
|
|
105
392
|
|
|
106
|
-
|
|
393
|
+
The annotations carry no `file=`, on purpose: every location loam reports is a path in the docs
|
|
394
|
+
repo, which is not the repository this pull request diffs, so GitHub could not place one on a line
|
|
395
|
+
here. They land on the check run and its summary instead. A docs repo that is private needs a token
|
|
396
|
+
that can read it — a fine-grained token or a GitHub App token with `contents: read` on that one
|
|
397
|
+
repository — because the workflow's own `GITHUB_TOKEN` reads only the repository it runs in. Add
|
|
398
|
+
`--strict` once the service is vouched and its warnings are ones you mean to keep at zero; before
|
|
399
|
+
that, the warnings are the adoption still to do.
|
|
107
400
|
|
|
108
|
-
|
|
401
|
+
The same layout answers the deploy question. In the deploy pipeline, check the docs repo out with
|
|
402
|
+
`fetch-depth: 0` — `--since` is read from its git history — and ask whether this service may ship:
|
|
109
403
|
|
|
404
|
+
```bash
|
|
405
|
+
npx -y "$LOAM" gate --service "$SERVICE" --since "$DOCS_SHA_OF_LAST_DEPLOY"
|
|
110
406
|
```
|
|
111
|
-
BOOTSTRAP (once per service, reverse):
|
|
112
|
-
code ──adopt──► brief ──agent──► C4 baseline + capability spec [truth = code]
|
|
113
407
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
408
|
+
`gate` executes nothing and writes nothing, and without `--strict` its warnings stay advisory;
|
|
409
|
+
[WORKFLOW.md](WORKFLOW.md#what-actually-gates) says what each finding of it means for a pipeline.
|
|
410
|
+
|
|
411
|
+
**Cloud agents in a service repo** need the same sibling on disk before they start: a lone clone
|
|
412
|
+
of the service answers every docs-reading command with `docs-missing`. GitHub's Copilot coding
|
|
413
|
+
agent and Codex cloud each start from the one repository the task names and run a setup step you
|
|
414
|
+
own, so clone the docs repo there, into the committed `docsDir`. Copilot reads the job
|
|
415
|
+
`copilot-setup-steps` from `.github/workflows/copilot-setup-steps.yml` on the default branch, and
|
|
416
|
+
an
|
|
417
|
+
[Agents secret](https://docs.github.com/en/copilot/how-tos/copilot-on-github/customize-copilot/customize-cloud-agent/configure-secrets-and-variables)
|
|
418
|
+
reaches those steps as an environment variable:
|
|
419
|
+
|
|
420
|
+
```yaml
|
|
421
|
+
# .github/workflows/copilot-setup-steps.yml — in each service repo
|
|
422
|
+
name: Copilot setup steps
|
|
423
|
+
on: workflow_dispatch
|
|
424
|
+
jobs:
|
|
425
|
+
copilot-setup-steps:
|
|
426
|
+
runs-on: ubuntu-latest
|
|
427
|
+
permissions: { contents: read }
|
|
428
|
+
steps:
|
|
429
|
+
- uses: actions/checkout@v4
|
|
430
|
+
- uses: actions/setup-node@v4
|
|
431
|
+
with: { node-version: 22 }
|
|
432
|
+
- run: npm install -g @ybotok/loam@0.2.0-alpha.13
|
|
433
|
+
# "../docs" is outside the workspace, so git clone rather than actions/checkout;
|
|
434
|
+
# the second command takes the token back out of the clone's config
|
|
435
|
+
- run: |
|
|
436
|
+
git clone --depth 1 "https://x-access-token:${LOAM_DOCS_READ_TOKEN}@github.com/acme/docs.git" ../docs
|
|
437
|
+
git -C ../docs remote set-url origin https://github.com/acme/docs.git
|
|
438
|
+
- run: loam doctor
|
|
120
439
|
```
|
|
121
440
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
441
|
+
Codex cloud has no workflow file: the same commands go in the environment's setup script, with
|
|
442
|
+
the token as an environment **secret** — Codex hands secrets to the setup script only and removes
|
|
443
|
+
them before the agent phase, which is all a clone needs. Pin Node.js to 22 or newer in the
|
|
444
|
+
environment's package versions, and spell the target from the repository root, because where the
|
|
445
|
+
script starts is not documented:
|
|
125
446
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
- **loam never guesses about code.** It reads the docs repo; inside a service repo it only ever hashes or locates what a document already named — the files a `sources` list covers, the `file:line` an answer cites, the cucumber report `--results` was handed. It never parses code or derives meaning from it. Where a judgement about a codebase is needed — what this service is, whether that scenario has a test — loam states the **question**, precisely and repeatably, and an agent answers it. Both halves are written down: the question in the brief or the checklist, the answer in `sources` or `verification.yaml`.
|
|
134
|
-
|
|
135
|
-
## Commands
|
|
447
|
+
```bash
|
|
448
|
+
npm install -g @ybotok/loam@0.2.0-alpha.13
|
|
449
|
+
DOCS="$(git rev-parse --show-toplevel)/../docs"
|
|
450
|
+
git clone --depth 1 "https://x-access-token:${LOAM_DOCS_READ_TOKEN}@github.com/acme/docs.git" "$DOCS"
|
|
451
|
+
git -C "$DOCS" remote set-url origin https://github.com/acme/docs.git
|
|
452
|
+
loam doctor
|
|
453
|
+
```
|
|
136
454
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
| `loam doctor` | Read-only preflight for runtime, config, docs-repo access, fleet roots, counts, and the current service binding. Blockers exit 1; incomplete optional bindings stay warnings. |
|
|
143
|
-
| `loam dependencies [<FEAT>]` | Derive the active-feature dependency graph and same-identity conflicts from requirement deltas and OpenAPI operationIds. Optional focus includes transitive prerequisites. |
|
|
144
|
-
| `loam explore [<service>...]` | Read the fleet around a change nobody has written down yet: the ring one hop out, each service's maturity and living operations, the features already in flight over the same ground, and the `loam new` line the seeds imply. `--op <id>` seeds from an operation. Writes nothing. |
|
|
145
|
-
| `loam instructions [<workflow>] [args...]` | Print one of the six workflow protocols, `$1`/`$2` filled in — version-matched to this binary, which is what the generated command and skill files point at. Reads no config. |
|
|
146
|
-
| `loam new <FEAT> [--title <t>] [--touches <id>] [--new-service <id>]` | Scaffold a feature: intent, C4 delta, and a requirement delta for every service named by `--touches` / `--new-service` (both repeatable). The title is optional and becomes the directory slug. |
|
|
147
|
-
| `loam show <service\|FEAT>` | Everything loam knows about one service or feature. |
|
|
148
|
-
| `loam adopt --service <id>` | Brief an agent to write this service's baseline into the docs repo as `draft`. Writes nothing. |
|
|
149
|
-
| `loam delta <FEAT> [--service <id>]` | Project a feature onto one service: the intent, its requirement deltas with every requirement body and every Given/When/Then line reproduced verbatim, the endpoints it adds or retires, and the edges around it. The output doubles as a coding-agent task. |
|
|
150
|
-
| `loam gherkin [<FEAT>] [--service <id>]` | Emit spec scenarios as digest-stamped Gherkin `.feature` files into the service repo's `<gherkinDir>/loam/`. |
|
|
151
|
-
| `loam rebase <FEAT> [--service <id>]` | Pin the feature to the living versions it was written against, on the requirement axis and the contract axis. `--dry-run` shows what would be pinned. |
|
|
152
|
-
| `loam validate [<id>] [--service <id>\|--feature <id>] [--all]` | Validate one service or feature, or the whole fleet in one run (the docs repo's CI gate). The positional id resolves a feature first; `--service` / `--feature` force the reading. `--strict` exits 1 on warnings too. |
|
|
153
|
-
| `loam verify <FEAT> [--service <id>]` | The done-check: derive a checklist of the feature's own promises, and record the answers with their evidence. |
|
|
154
|
-
| `loam vouch --service <id>` | The human promotion `draft` → `verified`: stamp a living spec against the code it was written from. Run in the service's own repo. |
|
|
155
|
-
| `loam archive <FEAT>` | Merge a shipped feature into the living specs, API and landscape; gated on gating coherence issues, on what only the computed merge can see, and on living documents the merge cannot rewrite safely. `--approve` overrides the judgement calls, never the mechanical losses. `--dry-run` prints the plan and writes nothing. |
|
|
156
|
-
| `loam unarchive <FEAT>` | Take that back: restore the living docs from the snapshot archive left behind, and re-open the feature. |
|
|
157
|
-
| `loam audit-openspec <root>` | Read-only inventory of an OpenSpec checkout/workspace/Store checkout. Writes nothing; `--write-mapping <path>` emits the decision skeleton you fill in. |
|
|
158
|
-
| `loam migrate-openspec <root> --map <path>` | Validate a completed mapping against a re-read of the source, and materialize staged migration docs. Dry-run is the default. |
|
|
455
|
+
The clone is the agent's reading, not a second place it can deliver. A cloud agent opens its pull
|
|
456
|
+
request against the repository it was started in, so anything it writes into the docs checkout —
|
|
457
|
+
a verification record, a spec edit — stays in its sandbox. `loam-implement`'s own outputs, the
|
|
458
|
+
generated Gherkin and the code, land in the service repo as usual; what belongs in the docs repo
|
|
459
|
+
goes there through that repo's own pull request.
|
|
159
460
|
|
|
160
|
-
|
|
461
|
+
### Try loam on one governed system in five minutes
|
|
161
462
|
|
|
162
|
-
|
|
463
|
+
The full model may be one application or a fleet; the trial is one repository. In the codebase you
|
|
464
|
+
know best (after [installing](#install)):
|
|
163
465
|
|
|
164
|
-
|
|
466
|
+
```bash
|
|
467
|
+
loam init --docs loam-docs --create --service commerce-app
|
|
468
|
+
```
|
|
165
469
|
|
|
166
|
-
|
|
470
|
+
One run does two things: it scaffolds a new docs repo at `loam-docs/` — `services/`, `features/`,
|
|
471
|
+
`architecture/landscape.likec4`, its own `AGENTS.md` and `loam.json` — and it binds this repository
|
|
472
|
+
to the id `commerce-app` in a committed `loam.json` beside your code (plus the slash commands and
|
|
473
|
+
Agent Skills for the AI tools it detects here — [Working with AI agents](#working-with-ai-agents)).
|
|
474
|
+
`init` ends by printing the first hour, which is this loop:
|
|
167
475
|
|
|
168
|
-
|
|
476
|
+
```bash
|
|
477
|
+
loam adopt --service commerce-app --json # the brief: an agent reads the code, writes the baseline as draft
|
|
478
|
+
loam validate --service commerce-app # grade the result in this repo
|
|
479
|
+
loam vouch --service commerce-app # you, not the agent: draft -> verified
|
|
480
|
+
loam status # what to do next, derived from the files
|
|
481
|
+
```
|
|
169
482
|
|
|
170
|
-
|
|
483
|
+
What the trial pays off on is the adopt → validate → vouch mechanics: the brief, the graded
|
|
484
|
+
baseline, the human promotion that makes later staleness detectable. In a modular monolith,
|
|
485
|
+
`arch.spec.md` and `Covers:` can already govern the nested model inside this one boundary. The
|
|
486
|
+
cross-boundary contract spine needs a second service — one boundary has no remote edge to join.
|
|
487
|
+
When a second service wants in, graduate to the full wiring:
|
|
488
|
+
[WORKFLOW.md's day zero](WORKFLOW.md#day-zero-onboarding-a-fleet) is the same steps, pluralized.
|
|
171
489
|
|
|
172
|
-
|
|
490
|
+
### Explore the example fleet
|
|
173
491
|
|
|
174
|
-
|
|
492
|
+
Installed from npm rather than cloned? The example fleet ships inside the package, and one command
|
|
493
|
+
copies it out — through the same journaled write path every other loam writer uses, byte for byte.
|
|
494
|
+
It binds no repository, records no `docsDir`, and writes nothing outside the directory you name:
|
|
175
495
|
|
|
176
|
-
|
|
496
|
+
```bash
|
|
497
|
+
loam init --example ./loam-demo
|
|
498
|
+
cd loam-demo && loam validate --all # 0 errors, 10 deliberate warnings
|
|
499
|
+
```
|
|
177
500
|
|
|
178
|
-
|
|
501
|
+
That tree is the one the repo ships under
|
|
502
|
+
[`examples/docs/`](https://github.com/ybotok/loam/tree/main/examples/docs) — five services, two
|
|
503
|
+
features already shipped, two in flight, the event spine, the permission vocabulary, the business
|
|
504
|
+
tree, and two verification records that read `attested` and `verified` so the difference between
|
|
505
|
+
them can be seen standing.
|
|
506
|
+
[`examples/README.md`](https://github.com/ybotok/loam/blob/main/examples/README.md) is the guided
|
|
507
|
+
tour: what each service is there to show, and what every one of the ten deliberate warnings
|
|
508
|
+
demonstrates. From a clone, step into the fleet where it sits and run the real commands — it carries
|
|
509
|
+
its own committed `loam.json`, so there is nothing to write first and nothing to delete afterwards
|
|
510
|
+
(working from source instead of an installed binary, substitute `npx tsx ../../src/cli.ts` for
|
|
511
|
+
`loam`):
|
|
179
512
|
|
|
180
|
-
|
|
513
|
+
```bash
|
|
514
|
+
cd examples/docs # the tree governs itself: its loam.json says "docsDir": "."
|
|
515
|
+
loam list # the fleet and its maturity ladder
|
|
516
|
+
loam status # what to do next, derived from the files
|
|
517
|
+
loam validate --all # the CI gate: 0 errors, 10 deliberate warnings
|
|
518
|
+
loam archive FEAT-101 --dry-run # the whole three-axis merge plan, writing nothing
|
|
519
|
+
loam archive FEAT-112 --dry-run # an operation being retired, writing nothing
|
|
520
|
+
loam verify FEAT-088 # an archived feature's done-check: attested
|
|
521
|
+
loam verify FEAT-120 # its pair, same check: verified
|
|
522
|
+
```
|
|
181
523
|
|
|
182
|
-
|
|
524
|
+
`test/examples.test.ts` pins the validate summary and every finding code, and both archive plans
|
|
525
|
+
file-for-file, so those outcomes cannot drift from the code; the `list` rendering is not pinned.
|
|
183
526
|
|
|
184
|
-
|
|
527
|
+
## Commands
|
|
185
528
|
|
|
186
|
-
|
|
529
|
+
Every command takes `--json`; findings carry stable codes (`c4.valid`, `spine.op-undefined`,
|
|
530
|
+
`coherence.ok` …) so an agent branches on the code, not on prose. Flags are listed in full below —
|
|
531
|
+
`loam <command> --help` is the same list from the binary you are running, and
|
|
532
|
+
[WORKFLOW.md's command notes](WORKFLOW.md#command-notes) is the per-command behavior that a table
|
|
533
|
+
cannot hold.
|
|
187
534
|
|
|
188
|
-
|
|
535
|
+
| Command | Flags | What it does |
|
|
536
|
+
|---|---|---|
|
|
537
|
+
| `loam init` | `--docs <dir>` `--service <id>` `--create` `--force` `--tools <ids>` `--agent-profile <full\|service\|docs>` `--example <dir>` `--no-commands` `--no-skills` `--mcp` `--mcp-author` | Bind this repository to the single shared docs repo: a committed local `loam.json`, plus command and Agent Skill pointers for detected AI tools. Profiles narrow the six lifecycle workflows to a repo's role; the support-only `loam-report` stays in every profile. Re-running init refreshes only unchanged loam-owned pointers; edited files are preserved. `--mcp` writes the read-only host entry, while `--mcp-author` opts into the bounded authoring tools. `--create` scaffolds the docs repo; `--example` copies the packaged example and stops |
|
|
538
|
+
| `loam seed` | `--from <file>` | Template the fleet map and one `services/<id>/` directory per service from a tiny human-authored `fleet.yaml`. Mechanical, never a guess: a human stated every fact. Refuses once the landscape has been hand-edited |
|
|
539
|
+
| `loam list [services\|features\|capabilities\|glossary\|suites]` | `--archived` `--needs-work` `--review-order` `--subsystem <name>` `--owners <path>` | What is in the docs repo, and what is missing from it. `capabilities` rolls up who realizes each promise; `glossary` rolls up each term with the documents that cite it; `suites` groups the use cases by `#suite-` tag and names the services each suite needs up (`loam list suites <name>` shows one) |
|
|
540
|
+
| `loam status [<FEAT>]` | `--service <id>` | Where the work stands and what to do next, as a projection over the two gates. Each `next[]` row has an `execution` object that says whether it is runnable, where, and what input or edit is still needed. Derived every run; writes nothing |
|
|
541
|
+
| `loam doctor` | — | Read-only preflight for runtime, config, docs-repo access, fleet roots, counts, and the current service binding. Blockers exit 1; incomplete optional bindings stay warnings |
|
|
542
|
+
| `loam dependencies [<FEAT>]` | — | The active-feature dependency graph and same-identity conflicts, derived from requirement deltas and OpenAPI operationIds |
|
|
543
|
+
| `loam diff` | `--base <ref>` | Semantic diff of the living docs against a base git ref of the docs repo — the review lens for a docs-repo PR, with the authored consumers of every removal, deprecation and contract change named. Exit 1 on a removal the fleet still consumes |
|
|
544
|
+
| `loam explore [<service>...]` | `--op <operationId>` `--capability <id>` `--as <FEAT>` | Read the fleet around a change nobody has written down yet: the ring one hop out, each service's maturity and living operations, the features already in flight over the same ground, and the `loam new` line the seeds imply |
|
|
545
|
+
| `loam context <service>` | `--feature <FEAT>` | Assemble one service's docs slice — living requirements verbatim, both contracts, the fleet edges around it, permissions, capabilities, provenance, and every active feature's delta over it — as one deterministic briefing |
|
|
546
|
+
| `loam steps` | `--service <id>` `--duplicates` `--json` | Inventory the step phrases of one service's scenarios: how many distinct steps its suite is written in, how few definitions cover most of them, and which phrases differ only by an article or a trailing clause. Reads the living specs, writes nothing — the work-list a team writes its step definitions from, diffed against the optional `services/<svc>/steps.yaml` catalogue when one exists |
|
|
547
|
+
| `loam instructions [<workflow>] [args...]` | `--no-fix-tables` | Print one of the six workflow protocols, the separate `loam-report` support protocol, or one of the five reference pages `loam-codes`, `loam-spine`, `loam-authoring`, `loam-done-check` and `loam-drawing`, version-matched to this binary. Workflow `$1`/`$2` placeholders are filled; support/reference pages take no arguments. Reads no config. `--no-fix-tables` collapses the per-code fix tables to a line each, keeping the paragraph that says which scope graded them: `loam-check`'s page, almost all of it fix tables, comes back in a few kilobytes, while a support/reference page holds no such table and comes back byte-identical |
|
|
548
|
+
| `loam explain [<subject>]` | `--codes` | Explain a finding code, a refusal code, or a concept term. Most finding prose is parsed at runtime from the shipped fix tables, so it cannot drift from the binary; the `doctor.*`, `next.*`, `diff.*` and `gate.*` families, which no fix table grades, are answered from a registry written beside them. Every text-mode refusal prints `<code> · loam explain <code>` on stderr and every non-`ok` finding line carries its code in parentheses, so the lookup is reachable without re-running under `--json`. The concept terms cover every word loam prints to a person — the stages (`ready`, `done`), the claim kinds, the `loam tasks` steps, the maturity ladder. Omit the subject to list the terms; `--codes` lists the whole vocabulary — every finding code and every refusal code it can answer, each row the same answer `explain <code> --json` gives for that one |
|
|
549
|
+
| `loam open` | `--root <dir>` `--out <file>` `--force` | Write a `.code-workspace` joining the docs repo and every service checkout whose committed `loam.json` binds to it. Never overwrites without `--force` |
|
|
550
|
+
| `loam mcp` | `--author` | Serve sixteen read tools, version-matched instruction resources and a declared envelope output schema over MCP. `--author` adds `new`, `rebase`, `gherkin` and an archive dry-run; it never exposes `vouch`, verification recording or a committing archive — [the MCP server](WORKFLOW.md#the-mcp-server) |
|
|
551
|
+
| `loam new <FEAT>` | `--title <text>` `--touches <id>` `--new-service <id>` `--capability <id>` `--modifies <Req-ID>` | Scaffold a feature: intent, C4 delta, a requirement delta per service named by `--touches`/`--new-service`, and a capability delta per promise named by `--capability` (all repeatable). `--modifies` copies a touched service's living requirement into an uncommented `## MODIFIED Requirements` block with its `Based-On:` pin already set, so a small change is new → edit → archive; when every touched service is rewritten that way and nothing is introduced, no `delta.likec4` is written |
|
|
552
|
+
| `loam show <service\|FEAT>` | `--type <kind>` | Everything loam knows about one service or feature. A feature's JSON includes a semantic `review` pack: intent, exact architecture objects, API/event slices, dependencies, artifacts, verification, blockers and next actions. `--type` forces an ambiguous reading |
|
|
553
|
+
| `loam subsystem <verb> [names...]` | `--into <name>` `--under <name>` `--title <text>` `--description <text>` `--owner <name>` | Manage the grouping tree under `services/` — a navigable tree no identity depends on. `new`/`rm`, `move … --into`, `rename`, `list`, `history`, `sync` |
|
|
554
|
+
| `loam adopt` | `--service <id>` `--subsystem <name>` `--targets` | Brief an agent to write this service's baseline into the docs repo as `draft`: the target paths, the grammar of each, what the landscape already says — and, for an element no edge touches, the edges the service's own model.likec4 attests — and the checks that follow. Writes nothing. `--targets` narrows it to what varies by service — the walk, the 52 checks and the seventeen statements of what nothing checks are the same bytes everywhere, so a `full` field names the one run that carries them. Both sizes, for the example fleet's payment-service, are in the payload table of [docs/BENCHMARKS.md](https://github.com/ybotok/loam/blob/main/docs/BENCHMARKS.md#what-an-agent-is-handed--payload-sizes), which a test regenerates from the tree |
|
|
555
|
+
| `loam delta <FEAT>` | `--service <id>` | Project a feature onto one service: the intent, its requirement deltas with every body and Given/When/Then line verbatim, the endpoints it adds or retires, and the edges around it. Doubles as a coding-agent task |
|
|
556
|
+
| `loam tasks <FEAT>` | `--service <id>` `--next` | The same checklist `loam verify` grades, read forwards: one work unit per promise the feature makes, each carrying the step it waits on (`describe`, `generate`, `implement`, `attested`) and the fact that closes it — only a confirmed claim in a non-stale verification record retires one, and an attested scenario stays visible. Derived every run and writes nothing. `--service` is a pure lens that adds what this service is waiting on elsewhere, and in a service repository it defaults to that service when the feature touches it; the frontier orders providers before consumers as advice, never a lock. The per-unit work packet, and `--next` is the single leaf packet an orchestrator hands a coding agent |
|
|
557
|
+
| `loam gherkin [<FEAT>]` | `--service <id>` `--dry-run` | Emit spec scenarios as digest-stamped Gherkin `.feature` files into the service repo's `<gherkinDir>/loam/` |
|
|
558
|
+
| `loam rebase [<FEAT>]` | `--service <id>` `--dry-run` `--living` | Pin the feature to the living versions it was written against, on the requirement axis and the contract axis. `--living` takes no feature: it pins the living corpus's `Realizes:` entries to the capability requirements they name, which is what makes `capability.realizes-stale` able to fire later |
|
|
559
|
+
| `loam validate [<id>]` | `--service <id>` `--feature <id>` `--all` `--base <ref>` `--strict` `--errors-only` | Validate one service or feature, or the whole fleet in one run. JSON findings carry `locations[]`: an exact primary location when the check knows one, otherwise the narrowest proved scope. `--base` is the adoption ratchet, not a substitute for `loam diff`; `--strict` exits 1 on warnings; `--errors-only` drops the `ok` confirmations from the text view, keeping every warning |
|
|
560
|
+
| `loam verify <FEAT>` | `--record <file>` `--results <file>` `--contract-results <file>` `--diff-answers <files...>` `--service <id>` | The done-check: derive a checklist of the feature's own promises, and record the answers with their evidence. `--results`/`--contract-results` answer claims from a test report; `--diff-answers` cross-examines two blind answer sets |
|
|
561
|
+
| `loam vouch` | `--service <id>` `--yes` `--pack` `--sample <n>` | The human promotion `draft` → `verified`: stamp a living spec against the code it was written from. `--pack` prints the re-vouch reading pack; `--sample <n>` records a partial read as one. Run in the service's own repo |
|
|
562
|
+
| `loam gate` | `--service <id>` `--since <ref>` `--strict` | Can this service deploy? A pure query over recorded evidence for deploy pipelines outside loam's lifecycle. Executes nothing, writes nothing; errors exit 1, warnings stay advisory. Without `--since` it grades in-flight features only; `--since` (the docs commit the last deploy recorded) adds every feature archived after it |
|
|
563
|
+
| `loam archive <FEAT>` | `--approve` `--dry-run` | Merge a finished feature into the living specs, API, events, business tree and landscape; gated on what only the computed merge can see — the documents, never the code or the verification record. `--approve` overrides the judgement calls, never the mechanical losses |
|
|
564
|
+
| `loam unarchive <FEAT>` | `--force` | Take that back: restore the living docs from the snapshot archive left behind, and re-open the feature |
|
|
565
|
+
| `loam audit-openspec <root>` | `--write-mapping <path>` | Read-only inventory of an OpenSpec checkout/workspace/Store checkout. `--write-mapping` emits the decision skeleton you fill in |
|
|
566
|
+
| `loam migrate-openspec <root>` | `--map <path>` `--mapping <path>` `--apply` `--target <directory>` | Validate a completed mapping against a re-read of the source, and materialize staged migration docs. Dry-run is the default |
|
|
567
|
+
|
|
568
|
+
The envelope keeps three different questions apart, each on the command that can answer it — `ok`
|
|
569
|
+
(the command ran) on every envelope, `valid` (the docs pass) on `validate`, and `verified` (every
|
|
570
|
+
claim is confirmed **and** every scenario claim came from a test run) on `verify`, beside `verdict`,
|
|
571
|
+
which carries the third state, `attested`, for a record whose scenarios rest on an agent's word.
|
|
572
|
+
Every envelope also says what answered it — `contractVersion` for the shape and `version` for the
|
|
573
|
+
binary — because the two move independently: a release bumps one and leaves the other alone, so a
|
|
574
|
+
new build never reads as a contract break, and a green run from a loam that is behind is
|
|
575
|
+
recognisable as one. Every success payload carries `command`, so a host holding a pile of envelopes
|
|
576
|
+
branches on one field instead of guessing from the presence of `valid` or `services`.
|
|
189
577
|
|
|
190
578
|
## Working with AI agents
|
|
191
579
|
|
|
192
|
-
`loam init --create` writes `AGENTS.md` into the docs repo — the process contract, travelling with
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
580
|
+
`loam init --create` writes `AGENTS.md` into the docs repo — the process contract, travelling with
|
|
581
|
+
the thing it describes; a join finds it there and refuses a `--docs` target without one. Into the
|
|
582
|
+
repo it runs in, every `init` writes pointers for the six workflow bodies (`loam-adopt`,
|
|
583
|
+
`loam-feature`, `loam-implement`, `loam-check`, `loam-verify`, `loam-ship`) plus the separate
|
|
584
|
+
`loam-report` support protocol, **twice each for nineteen of the
|
|
585
|
+
twenty-one targets**: as a command file you type — `/loam-check` for most, `/loam:check` where the
|
|
586
|
+
tool namespaces by directory, `@loam-check` in Amazon Q's prompt library — and as an Agent Skill
|
|
587
|
+
at `<tool-dir>/skills/loam-<x>/SKILL.md`, which the model loads by itself when the task matches. Two
|
|
588
|
+
targets are skills only: Codex loads no custom command files, and its target writes
|
|
589
|
+
`.codex/skills/` — a root Codex still reads but no longer documents (its skills page names only
|
|
590
|
+
`.agents/skills`; select `agents` too if you want the documented one) — and
|
|
591
|
+
`agents` is not a tool at all but the vendor-neutral `.agents/skills/` root that Cursor, GitHub
|
|
592
|
+
Copilot, Codex, Gemini CLI, Zed and Roo Code each document reading — one copy those six share
|
|
593
|
+
instead of six copies of the same bytes. `--no-commands` and `--no-skills` each suppress one
|
|
594
|
+
delivery.
|
|
595
|
+
|
|
596
|
+
**The explicit command is the recommended, predictable entry point; natural language remains a
|
|
597
|
+
shortcut.** A normal chat lifecycle is `/loam-feature FEAT-101 "Split payments"` to propose,
|
|
598
|
+
`/loam-implement FEAT-101 payment-service` in each affected checkout, `/loam-check`,
|
|
599
|
+
`/loam-verify FEAT-101`, then `/loam-ship FEAT-101`. Most hosts use the flat slash spelling;
|
|
600
|
+
Gemini namespaces it as `/loam:feature`, Amazon Q exposes `@loam-feature`, and a skills-only host
|
|
601
|
+
uses its explicit skill syntax such as `$loam-feature`. Saying “implement FEAT-101” may load that
|
|
602
|
+
same skill automatically. Both routes reach the same binary-owned protocol; after entry, the agent
|
|
603
|
+
runs the status/edit/validate loop rather than asking the user to type every internal command.
|
|
604
|
+
|
|
605
|
+
When the binary or agent integration behaves unexpectedly, `/loam-report` (or `$loam-report` on a
|
|
606
|
+
skills-only host) collects a sanitized, reproducible local report under `loam-reports/`. It records
|
|
607
|
+
the version, doctor/status evidence, stable codes, write state and the smallest safe reproduction;
|
|
608
|
+
it does not repair the repo, retry a writer, include secrets, or upload anything. The support
|
|
609
|
+
protocol ships in every agent profile but remains outside the six-step lifecycle.
|
|
610
|
+
|
|
611
|
+
Which tools is detected from the repo: `init` scans each of the 21 targets it knows for its own
|
|
612
|
+
marker paths — usually just its dot-directory, but Copilot's are the files *inside* `.github/` and
|
|
613
|
+
the vendor-neutral one's is `.agents/skills/` rather than `.agents/`, because almost every repo has
|
|
614
|
+
a `.github/`, a `.agents/` is claimed by other conventions too, and almost none of either means the
|
|
615
|
+
tool. It writes for the ones it finds, and falls back to Claude Code when it finds none.
|
|
616
|
+
`--tools <ids>|all` overrides the scan; an unknown id is refused, not skipped. `--agent-profile`
|
|
617
|
+
selects `full`, `service` or `docs`, so a service checkout need not install feature-authoring and
|
|
618
|
+
shipping entry points. `loam.json` records the tools, profile and sha256 of every pointer loam owns;
|
|
619
|
+
that is how `doctor` distinguishes missing managed files from workflows nobody selected.
|
|
620
|
+
|
|
621
|
+
**A generated file is a pointer, not a protocol.** It carries what does not move between releases —
|
|
622
|
+
what the workflow is for, and the verbs in order — and defers this release's flags, finding codes
|
|
623
|
+
and fix tables to `loam instructions <workflow>`, which ships inside the binary you are about to
|
|
624
|
+
run. That split exists because the two go stale in opposite directions and only one of them is
|
|
625
|
+
fixable: embedded protocol text eventually describes a different loam with total confidence, while
|
|
626
|
+
the command cannot. Pointing at the binary is also what makes the protocol
|
|
627
|
+
affordable to load: `loam instructions loam-check --no-fix-tables` prints the same page with its
|
|
628
|
+
per-code fix tables collapsed to a line each — from a page that is almost all tables down to a few
|
|
629
|
+
kilobytes — and `loam explain <code> --json` answers, one code at a time, whichever two or three of
|
|
630
|
+
those rows a run actually reported. What each of those costs in bytes and tokens, page by page, is
|
|
631
|
+
[docs/BENCHMARKS.md](https://github.com/ybotok/loam/blob/main/docs/BENCHMARKS.md)'s payload table,
|
|
632
|
+
generated from the tree rather than typed. A copy frozen into the generated file would have charged
|
|
633
|
+
the whole page every session, and gone stale doing it. `AGENTS.md` itself was the one generated file that argument did
|
|
634
|
+
not reach — it was the process contract *and* the reference manual, and every session paid for all
|
|
635
|
+
of it — so four **reference pages** now come out of the binary instead, printed by
|
|
636
|
+
`loam instructions`: `loam-codes` (which codes each invocation can raise), `loam-spine` (every join
|
|
637
|
+
between the artifacts, and the `Based-On:` pins), `loam-authoring` (`arch.spec.md`, the generated
|
|
638
|
+
Gherkin suite, frontmatter, and writing a feature a reviewer can follow) and `loam-done-check` (how
|
|
639
|
+
`loam verify` derives its claims, and verified versus attested). A fifth page, `loam-drawing`,
|
|
640
|
+
never stood in `AGENTS.md`: it teaches how to draw the map so that a person can read it — one
|
|
641
|
+
relationship kind per kind of traffic, an arrow only where evidence gives one, a legend, and
|
|
642
|
+
overview views that each answer one question. What stayed is what a reader needs to form a question at all: the layout,
|
|
643
|
+
the cycle, which element is which service, the validator's rules and the archive gate. The
|
|
644
|
+
orientation stays below both the 32,768-byte Codex chain limit and the smaller 12,000-byte
|
|
645
|
+
workspace-rule ceiling — `test/agents.test.ts` fails the build the day it does not. Detailed pages are fetched only when the task reaches them. `loam init`
|
|
646
|
+
writes **no file** for a reference page: a page printed on demand describes the loam you are
|
|
647
|
+
running, not the one that scaffolded the repository.
|
|
648
|
+
|
|
649
|
+
The code inventory is that same split applied twice, and the largest page is what it left behind.
|
|
650
|
+
`loam instructions loam-codes` lists which codes each invocation can raise — nearly every code the
|
|
651
|
+
scaffolded docs name, and the one fact no other surface carries — and no longer says what
|
|
652
|
+
any of them means, because `loam explain <code>` answers that from the binary actually running and a
|
|
653
|
+
paragraph written once at `init` cannot. Dropping the duplicated gloss came first and took the file
|
|
654
|
+
from 120,896 bytes to 109,399; moving the inventory off it took the remaining 79,679. The OpenSpec
|
|
655
|
+
migration codes keep their notes inline on the page, because they are almost all of the codes
|
|
656
|
+
`loam explain` does not answer yet, and a pointer to an explanation that does not exist is worse
|
|
657
|
+
than the prose it replaced.
|
|
658
|
+
|
|
659
|
+
**Refresh is ownership-aware.** Re-running `loam init` may replace a pointer only when its bytes
|
|
660
|
+
still match the digest recorded when loam last wrote it. The first human edit breaks that equality
|
|
661
|
+
and permanently wins; loam preserves the file and `doctor` reports its stale stamp for review.
|
|
662
|
+
Missing pointers are created. This gives unchanged repositories current entry points without an
|
|
663
|
+
`openspec update`-style overwrite of team customizations.
|
|
664
|
+
|
|
665
|
+
For hosts that reach tools through MCP rather than a shell, see [the MCP server](WORKFLOW.md#the-mcp-server).
|
|
666
|
+
Read tools declare `readOnlyHint`; every tool declares the shared envelope output schema; the compact
|
|
667
|
+
orientation and all workflow/support/reference pages are MCP resources, including a compact loam-check
|
|
668
|
+
resource without the 223-row fix table. `loam init --mcp` writes the
|
|
669
|
+
read-only host entry. `--mcp-author` is a separate explicit choice that adds bounded writers while
|
|
670
|
+
still excluding vouch, evidence recording and a committing archive. An existing `.mcp.json` is
|
|
671
|
+
always preserved byte for byte, with the entry printed for manual merge.
|
|
205
672
|
|
|
206
673
|
## Docs
|
|
207
674
|
|
|
208
|
-
- [
|
|
209
|
-
-
|
|
210
|
-
- [
|
|
211
|
-
|
|
212
|
-
|
|
675
|
+
- [QUICKSTART.md](QUICKSTART.md) — the shortest complete path from install to adoption, the first
|
|
676
|
+
agent-driven feature, and a local problem report when something behaves unexpectedly.
|
|
677
|
+
- [WORKFLOW.md](WORKFLOW.md) — the working protocol: day zero, the artifact graph and its derived
|
|
678
|
+
states, what gates and what only advises, the six workflows, the per-command notes, and how an
|
|
679
|
+
agent drives the cycle from `--json`.
|
|
680
|
+
- [SCHEMA.md](SCHEMA.md) — the docs-repo layout, each artifact's grammar, and the decisions behind
|
|
681
|
+
them: the coherence rules, how `archive` writes and `unarchive` undoes, operating at fleet scale.
|
|
682
|
+
- [COMPARISON.md](COMPARISON.md) — where loam fits beside architecture-as-code tools, software and
|
|
683
|
+
event catalogs, contract verification and diff engines, requirements traceability, and code-level
|
|
684
|
+
architecture checks. Each is treated as a neighbouring specialist, not an opponent loam needs to
|
|
685
|
+
replace. One dated section sets out what the spec-driven change tools — OpenSpec, Spec Kit and
|
|
686
|
+
Kiro — each offer for a change that crosses repositories, what is still open upstream, and where
|
|
687
|
+
loam differs.
|
|
688
|
+
- [MIGRATING-from-OpenSpec.md](MIGRATING-from-OpenSpec.md) — moving an OpenSpec repo onto loam: what
|
|
689
|
+
maps, what is lost, what must be added.
|
|
690
|
+
- [ROADMAP.md](ROADMAP.md) — the evidence-backed improvement plan, priorities, non-goals and exit
|
|
691
|
+
criteria.
|
|
692
|
+
- [CHANGELOG.md](CHANGELOG.md) — released beta.1–alpha.13 plus the changes on `main` under
|
|
693
|
+
`[Unreleased]`.
|
|
694
|
+
- [docs/SERVICE-TEAMS.md](https://github.com/ybotok/loam/blob/main/docs/SERVICE-TEAMS.md) — one
|
|
695
|
+
screen for a team whose repository is one service in the fleet: the commands, the slash
|
|
696
|
+
commands, what to know before vouching, and the codes they will actually meet.
|
|
697
|
+
- [docs/BENCHMARKS.md](https://github.com/ybotok/loam/blob/main/docs/BENCHMARKS.md) — what a
|
|
698
|
+
fleet-sized run costs, with the method, the machine and the committed runs behind every number,
|
|
699
|
+
and what each payload loam hands an agent weighs in bytes and tokens.
|
|
213
700
|
|
|
214
701
|
## Development
|
|
215
702
|
|
|
@@ -218,31 +705,53 @@ npm run setup # or: npm ci && npm run build
|
|
|
218
705
|
npm run dev -- --help # run the CLI from source
|
|
219
706
|
npm run lint
|
|
220
707
|
npm run typecheck
|
|
708
|
+
npm run arch:check # package-level dependency graph stays acyclic
|
|
221
709
|
npm test # vitest
|
|
222
710
|
npm run test:coverage # full src/**/*.ts coverage with enforced thresholds
|
|
223
711
|
npm run test:package # clean, pack, install the tarball, run its loam binary
|
|
224
|
-
|
|
225
|
-
#
|
|
226
|
-
#
|
|
227
|
-
# at any other HEAD):
|
|
712
|
+
# optional, against the exact upstream checkout named in MIGRATING-from-OpenSpec.md
|
|
713
|
+
# (--baseline defaults to release, the certified pin; every pinned baseline refuses a
|
|
714
|
+
# checkout at any other HEAD, and only --baseline latest sweeps an unpinned one):
|
|
228
715
|
npm run test:openspec-corpus -- --baseline release /path/to/OpenSpec
|
|
229
716
|
```
|
|
230
717
|
|
|
231
|
-
`npm run setup` is `bash scripts/setup.sh`, so on Windows use `npm ci && npm run build`.
|
|
718
|
+
`npm run setup` is `bash scripts/setup.sh`, so on Windows use `npm ci && npm run build`.
|
|
719
|
+
[CONTRIBUTING.md](CONTRIBUTING.md) has the rest — the local loop, what a reviewable change looks
|
|
720
|
+
like, and the release posture.
|
|
232
721
|
|
|
233
722
|
## Status
|
|
234
723
|
|
|
235
|
-
Every command in the table is implemented, `verify --results`
|
|
236
|
-
|
|
237
|
-
|
|
724
|
+
Every command in the table is implemented, including `verify --results` and its contract-test
|
|
725
|
+
sibling `verify --contract-results`, the full AsyncAPI feature lifecycle, OpenAPI path-item and
|
|
726
|
+
component baselines, the `architecture/permissions.yaml` authorization vocabulary, the declared- and
|
|
727
|
+
authored-capability axes with the `Realizes:` join, use cases graded as `dynamic view`s, the
|
|
728
|
+
`glossary/<term>.md` domain vocabulary checked through the links that cite it, and the
|
|
729
|
+
`architecture/obligations.yaml` architectural obligations checked through `#obl-` tags and
|
|
730
|
+
`Covers:`. Known limits, each with its owner in [ROADMAP.md](ROADMAP.md): the scheduled CI
|
|
731
|
+
`stability` job has still to be observed green. Speculative `render`, health composition and UI
|
|
732
|
+
generation come later. Behind that status stand **205 test files** (counted 2026-10-22): the count is graded
|
|
733
|
+
against a live readdir by `test/docs-facts.test.ts`, so this sentence fails the suite the moment it
|
|
734
|
+
trails the tree.
|
|
735
|
+
|
|
736
|
+
The package is published as [`@ybotok/loam`](https://www.npmjs.com/package/@ybotok/loam): the
|
|
737
|
+
unscoped `loam` name is taken by an unrelated GDAL wrapper, so the package ships under the
|
|
738
|
+
maintainer's own npm user scope. Releases are tag-driven and maintainer-only
|
|
739
|
+
([CONTRIBUTING.md](CONTRIBUTING.md)). This checkout is `0.2.0-alpha.13` — a version pinned to
|
|
740
|
+
`package.json` by a drift test, so it is always the version of the checkout you are reading, and for
|
|
741
|
+
that reason it says nothing about whether that version reached npm.
|
|
742
|
+
`npm view @ybotok/loam dist-tags` is the answer to what installs.
|
|
238
743
|
|
|
239
744
|
## Contributing
|
|
240
745
|
|
|
241
|
-
Issues and pull requests are welcome — see [CONTRIBUTING.md](CONTRIBUTING.md) for the local
|
|
746
|
+
Issues and pull requests are welcome — see [CONTRIBUTING.md](CONTRIBUTING.md) for the complete local
|
|
747
|
+
gate and what a reviewable change looks like here.
|
|
242
748
|
|
|
243
749
|
## Security
|
|
244
750
|
|
|
245
|
-
|
|
751
|
+
Do not put vulnerability details in a public issue. Report privately through
|
|
752
|
+
[GitHub Private Vulnerability Reporting](https://github.com/ybotok/loam/security/advisories/new),
|
|
753
|
+
which is enabled for this repository; [SECURITY.md](SECURITY.md) says what to include and what to
|
|
754
|
+
leave out.
|
|
246
755
|
|
|
247
756
|
## License
|
|
248
757
|
|