@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feature.js","sourceRoot":"","sources":["../../../../src/core/agent/workflows/feature.ts"],"names":[],"mappings":"AAEA,sFAAsF;AACtF,MAAM,CAAC,MAAM,YAAY,GAAmB;IAC1C,IAAI,EAAE,cAAc;IACpB,WAAW,EACT,yFAAyF;IAC3F,YAAY,EAAE,qBAAqB;IACnC,OAAO,EACL,uQAAuQ;IACzQ,UAAU,EAAE,wCAAwC;IACpD,8DAA8D;IAC9D,YAAY,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC;IACjC,KAAK,EAAE;QACL,8GAA8G;QAC9G,6FAA6F;QAC7F,qIAAqI;QACrI,kFAAkF;QAClF,sGAAsG;QACtG,0GAA0G;QAC1G,4HAA4H;QAC5H,uHAAuH;QACvH,mFAAmF;KACpF;IACD,2EAA2E;IAC3E,4EAA4E;IAC5E,6EAA6E;IAC7E,0EAA0E;IAC1E,4EAA4E;IAC5E,sEAAsE;IACtE,4EAA4E;IAC5E,8EAA8E;IAC9E,2EAA2E;IAC3E,6EAA6E;IAC7E,6EAA6E;IAC7E,qEAAqE;IACrE,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyLP;CACA,CAAC","sourcesContent":["import type { CommandContent } from \"../contract.js\";\n\n/** Starting a feature: explore, scaffold, author the three axes, rebase, validate. */\nexport const LOAM_FEATURE: CommandContent = {\n name: \"loam-feature\",\n description:\n \"Start a new loam feature — scaffold it, then author the C4 delta and requirement deltas\",\n argumentHint: `<FEAT-id> \"<title>\"`,\n purpose:\n \"Start a feature in the docs repo: decide which services it touches, scaffold it, then author the C4 delta and one requirement delta per service. The `--touches` list is the hardest call in the cycle and nothing downstream catches one that is short by a service.\",\n invocation: 'loam instructions loam-feature $1 \"$2\"',\n // $2 is the feature's human title: any string is a legal one.\n placeholders: [\"feature\", \"free\"],\n spine: [\n \"decide whether this is a feature at all — a change that touches no requirement, operation or edge needs none\",\n \"read `AGENTS.md` at the docs repo root — it defines the ID spine everything else depends on\",\n \"`loam explore` around the services you think are involved: the ring one hop out, and what is already in flight over the same ground\",\n \"`loam status` / `loam list` / `loam show` — what exists and what is already owed\",\n \"`loam new` with a `--touches` per service it changes and a `--new-service` per service it introduces\",\n \"author what the templates left as TODO: intent, the C4 delta, the per-service spec / arch spec / openapi\",\n \"analyze before you pin — write what the documents leave open under `## Open questions` in intent.md, for a human to answer\",\n \"`loam rebase` — pin every MODIFIED requirement and every living operation you edited to the version you wrote against\",\n \"validate the feature, then read `loam dependencies` before anyone starts building\",\n ],\n // Step 0 and step 4b are the two this protocol was missing, and neither is\n // graded — on purpose. Step 0 exists because the lightest lane loam has (no\n // feature at all, for a change that moves no requirement, operation or edge)\n // was true and written down nowhere, so the work that is most of a legacy\n // fleet's week either walked the whole feature cycle or routed around loam.\n // Step 4b exists because every check after it is a join between exact\n // tokens: two services that agree on every operationId and disagree on what\n // it means (one confirms a split the other answers 422 for) validate, archive\n // and ship green, and a `Realizes:` whose requirement does not deliver the\n // promise reads as a clean join. Nothing in the binary can read meaning, and\n // a check pretending to would be the false green this tool exists to refuse,\n // so the step asks for questions and leaves the answers to a person.\n body: `Start a new feature in the loam docs repo (its path is \\`docsDir\\` in ./loam.json).\n\n0. First decide whether this needs a feature at all. A change that touches no\n requirement, no operation and no fleet edge — a refactor, a dependency bump,\n a fix that brings the code back to behaviour the living spec already\n documents — needs NONE: nothing in the docs repo changes, so there is nothing\n to scaffold, pin or archive. It is a code PR in the service repo, then\n \\`loam validate --service <id>\\` there (the service repo is the only place\n \\`sources.stale\\` is visible), then \\`loam vouch --pack --service <id>\\` to\n prepare the re-read the moved sources owe — the vouch itself is a human's.\n If the change alters what a requirement promises, it IS a feature, however\n small: one \\`--touches\\`, a Why, the ADDED/MODIFIED requirement, and\n \\`loam rebase\\` for a MODIFIED one — the rest of this page still applies.\n1. Read \\`AGENTS.md\\` at the root of the docs repo first — it defines the ID spine\n everything here depends on.\n2. Understand the current state before proposing a change:\n - \\`loam status --json\\` — what is already in flight and what it is waiting on.\n Run this FIRST if you joined this repository halfway or lost the session:\n \\`next[]\\` is ordered and each entry carries the literal command to run, so it\n tells you whether the work is to start $1 at all. \\`loam status $1 --json\\`\n narrows it to one feature once $1 exists\n - \\`loam list --json\\` — what services exist, and what documentation they are missing\n - \\`loam show <service> --json\\` — what a service owns, exposes, and who already calls it\n2b. \\`loam explore <service> --json --as $1\\` around every service you believe this\n feature touches. This is the step that decides step 3's \\`--touches\\` list, and it\n is the only decision in the cycle nothing downstream catches — a list short by one\n service produces a feature that validates, archives and ships with a consumer\n nobody updated. Read four fields:\n - \\`neighbours\\` — the services one hop out in the fleet map. Weigh each one. loam\n knows they are connected, not whether you change them, and it deliberately\n leaves them OUT of the suggested command line rather than guessing for you\n - \\`services[].maturity\\` — a service at \\`empty\\` or \\`partial\\` has no baseline to\n write a delta against, so the work starts with \\`loam adopt --service <id>\\`, not\n with this feature\n - \\`services[].operations\\` — what each already exposes, so an operation you are\n about to \"add\" that is already there becomes a MODIFIED requirement instead\n - \\`overlaps\\` — active features already carrying a delta for these services.\n \\`loam dependencies --json\\` (step 7) then says which must archive first\n \\`--op <operationId>\\` seeds from an operation when you know the call but not who\n owns it. A seed naming no \\`services/<id>/\\` is reported in \\`unknown\\` with the\n closest real ids rather than refused — the feature may be introducing it, and a\n typo looks identical until you read that list. \\`scaffold\\` is the literal step-3\n command line the seeds imply, with \\`--new-service\\` where the service does not\n exist yet.\n3. Scaffold it: \\`loam new $1 --title \"$2\"\\`, adding \\`--touches <id>\\` for every service the\n feature touches and \\`--new-service <id>\\` for every one it introduces. Every id goes\n through the \\`services/<id>/\\` grammar, so a typo is refused (\\`invalid-option\\`)\n rather than scaffolded; a \\`--touches\\` that matches nothing existing comes back as\n a \\`note\\` with the close ids, not as a failure — read it, because a \\`--touches\\`\n naming a service that does not exist is \\`delta.service-unknown\\` at validate time\n and a phantom \\`services/<typo>/\\` directory if it ever archives.\n4. Author what the templates left as TODO. This step is gated, not advisory:\n \\`loam archive\\` refuses a scaffold nobody edited (\\`scaffold.placeholder\\`,\n \\`intent.empty\\`), so the placeholder text cannot reach the living docs.\n - \\`intent.md\\` — the problem in business terms, in prose; the scaffold's\n comment-only Why/Scope count as unwritten\n - \\`delta.likec4\\` — new elements and edges, each tagged \\`#$1\\`; every call edge carries\n \\`metadata { op '<operationId>' }\\`; replace the scaffolded TODO description on each\n new service. For a requirements-only feature DELETE this\n file: an empty delta is legal, but a scaffold left half-filled is not.\n Draw each edge with its relationship kind (\\`-[calls]->\\`, \\`-[publishes]->\\`,\n \\`-[delivers]->\\`, …), and draw a direction only where the evidence shows\n one: anything else is \\`-[connects]->\\`. A message runs producer\n \\`-[publishes]->\\` topic and topic \\`-[delivers]->\\` consumer, never\n producer \\`->\\` consumer. A producer outside the fleet is an \\`#external\\`\n element whose edge carries \\`metadata { publishes }\\`. Declare every kind\n you draw in the delta's own \\`specification\\`, and check that the living\n map's declares it too. The archive copies the edge and never the\n declaration, so a kind the map lacks refuses the archive (\\`merge-failed\\`)\n even though validate and status call the feature ready.\n \\`loam instructions loam-drawing\\` has the kinds and their styles\n - \\`specs/<svc>/spec.md\\` — the example requirement ships INSIDE the template's\n comment: copy it out, unindent, one behaviour per requirement, SHALL, at\n least one Given/When/Then scenario; add \\`Operations:\\` once the operation exists\n - \\`specs/<svc>/arch.spec.md\\` — the architectural obligations (outbox, retries,\n idempotency, alerts), same grammar; a \\`Covers:\\` line per requirement naming the\n tagged elements/edges it accounts for, or \\`c4.uncovered\\` says nothing does.\n Write an edge by its endpoints' service names\n (\\`order-service -> payment-service\\`), which resolve the same before and\n after the archive\n - write every document for a reviewer who has never seen the code.\n \\`intent.md\\` gains a \\`## How to read this feature\\` section, a\n business-requirement coverage table, and \\`## Open questions\\` as a table\n (ID, question, blocks, owner, current default). Each spec delta opens\n with a plain-language \\`## Purpose\\`. A long requirement body becomes a\n one-line lead plus one bullet per SHALL sentence. Every abbreviation is\n expanded on first use. \"This delta\" and \"this feature\" stay out of\n requirement bodies and contract descriptions, because the archive copies\n those into the living docs. A word the feature brings goes in\n \\`glossary/<term>.md\\` and a decision in \\`adrs/\\`, both inside the feature,\n and a cross-service flow in \\`usecases/<name>.likec4\\`, tagged with a\n \\`#cap-\\` that resolves. \\`loam instructions loam-authoring\\`, \"Writing\n for a person\", has the shapes\n - \\`specs/<svc>/openapi.yaml\\` — define every operationId the edges reference.\n A self-contained document holding ONLY the operations this feature adds,\n changes or removes — never a copy of the living contract. An operation you\n leave out stays exactly as the living contract has it, and a local \\`$ref\\`\n (\\`#/components/schemas/Order\\`) resolves into the living document, so there\n is nothing to restate. Every operation you quote costs a pin, and once a\n parallel feature retires it — or moves it, and you quoted the old\n address — a pinned quote is \\`openapi.baseline-invalid\\` and\n \\`openapi.op-revived\\` both, an unpinned one \\`openapi.op-revived\\` alone\n (\\`asyncapi.slot-revived\\` on the event axis) — archive refuses either.\n Delete the quote; only a feature that MEANS to bring a retired operation\n back keeps it, and archives past the finding with a human's \\`--approve\\`\n - \\`specs/<svc>/asyncapi.yaml\\` — the event axis, only when the feature changes\n what a service puts on or takes off the bus: an AsyncAPI 3.0 document\n holding only the channel, operation and message slots you add, change or\n remove (an edited slot is written out whole), new messages under\n \\`components.messages\\`, and a \\`Publishes:\\`/\\`Consumes:\\` line on each\n requirement that names them. \\`loam new\\` scaffolds none — an event\n contract is genuinely optional\n - for a service (or capability) this feature CREATES, the delta is the\n living document's first draft, and \\`loam archive\\` carries only what you\n mark as the document's own: the frontmatter \\`owner\\`, an H1 that neither\n names $1 nor calls itself a delta (the scaffold's does both — retitle it),\n and a \\`## Purpose\\` section — put the service's narrative there. Everything\n else in the delta is read as being about the change and stays with it in\n \\`features/archive/\\`, linked from the new document\n - links: write each one so it resolves where you write it, relative to the\n file. A link into this feature — from its deltas, or from any other\n document whose links validate grades — is re-pointed by \\`loam archive\\`\n to wherever the file ends up — a term in \\`glossary/<term>.md\\` at the living glossary,\n anything else (an ADR in \\`adrs/\\` above all) inside\n \\`features/archive/\\`, because a feature ADR is never copied into the living\n tree. A decision meant to outlive this change belongs in\n \\`architecture/adrs/\\` or the service's own \\`adrs/\\` instead. The same\n holds inside this feature: its own documents (the intent, its ADRs) move\n to \\`features/archive/\\` with it, and the archive re-expresses their links\n for the move — never write them for the archived location yourself\n4b. **Analyze before you pin.** Nothing grades this step, which is why it is here:\n every check after it is a join between exact tokens, so two services that\n agree on every operationId and disagree on what it means validate, archive\n and ship green. Read the feature as its reviewer will, before rebase freezes it:\n - \\`loam show $1 --json\\` — its \\`review\\` object joins the intent, the C4\n objects, the API/event slices and the dependencies\n - \\`loam context <service> --feature $1 --json\\` for every service it touches —\n the living requirements verbatim, the edges one hop out, and this delta\n - the \\`neighbours\\` step 2b's \\`loam explore\\` reported\n Then write what the documents leave open under \\`## Open questions\\` in\n \\`intent.md\\` (the scaffold already carries the heading), one table row per\n question — ID, the question, what it blocks (the requirement id or edge it is\n about), its owner, and the default that gets built if nobody answers:\n - a SHALL two engineers could build two ways — an unstated unit, bound,\n ordering, or an \"eventually\" with no window\n - a value, limit or window two services state differently (a refund window,\n a rounding rule, a retry budget), and which side refuses when they\n disagree — a caller that accepts what its provider answers 4xx for is a\n contradiction no check can see\n - a \\`Realizes:\\` line whose requirement does not actually deliver the\n capability promise it names, or a promise this feature changes that no\n realizing requirement keeps\n - per call edge in the delta: the timeout, the retry and what makes it safe\n to repeat, what a partial failure leaves behind, and what compensates it —\n an edge no requirement answers these for is a question, not a default\n - each \\`explore\\` neighbour outside \\`--touches\\`: why it is untouched, or that\n it is a candidate — adding one means a \\`specs/<svc>/\\` delta in this feature,\n because that directory IS the feature's service list\n Ask; do not answer for the author. The default column records what the\n documents imply today, not what you would choose. A human answers by editing the file —\n replacing a question with the decision, or with a change to the delta.\n Nothing is graded: an empty section is legal, and so is an answered one.\n5. **\\`loam rebase $1\\`** — the step between authoring and checking, and the one that\n stops two features in flight from silently deleting each other's work. It pins\n every MODIFIED/REMOVED requirement (\\`Based-On:\\`), and every operation and\n asyncapi channel/operation/message slot the living contract already holds\n (\\`x-loam-based-on\\`), to the living version you wrote against. What the\n feature ADDS has no living version and takes no pin, so an add-only contract\n delta needs no rebase. Any living operation or slot the delta spells is one\n the merge upserts, so it needs its pin even when you changed one line of it.\n Without the pins, \\`delta.baseline-missing\\` / \\`openapi.baseline-missing\\` /\n \\`asyncapi.baseline-missing\\` GATE\n the archive: before they did, the second feature to archive reverted the\n first — with \\`+0 ~1 -0\\`, exit 0, and nobody told. Rebase clears them; a\n human's \\`--approve\\` is the only other way past.\n Restamping is not resolving: if rebase reports a requirement as MOVED, re-read\n the living text and fold in what you still mean BEFORE you ship.\n6. \\`loam validate --feature $1 --json\\`. Do not stop while \\`valid\\` is false.\n7. \\`loam dependencies $1 --json\\` before anyone starts building: it says which\n features in flight have to archive first (\\`order\\`) and which collisions no\n ordering fixes (\\`conflicts\\`, \\`cycles\\`). Every conflict it names is one \\`loam rebase\\`\n cannot fix for you — two intentions have to be merged by people.\n\nThe operation's three spellings — the edge's \\`op\\`, the requirement's \\`Operations:\\`\nline, and the OpenAPI \\`operationId\\` — must match exactly.\n`,\n};\n"]}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Building one service's slice: the delta brief, then a unit at a time —
|
|
3
|
+
* generated gherkin, steps, code, verify.
|
|
4
|
+
*
|
|
5
|
+
* Steps 3-5 are a LOOP, not a sequence, and that is why `loam tasks` sits at
|
|
6
|
+
* the head of them. They used to be three things done in order — generate the
|
|
7
|
+
* suite, write the definitions, implement — which is only the right order for a
|
|
8
|
+
* slice whose every requirement already owns a scenario. Where one does not,
|
|
9
|
+
* the next thing owed is a sentence in the docs repo, and the body had no step
|
|
10
|
+
* that could say so; where the suite is half written, nothing here answered
|
|
11
|
+
* which half. `at` answers both: the projection names which of four states the
|
|
12
|
+
* next unit is in, and each state names exactly one action, so the numbering
|
|
13
|
+
* below is a table of destinations rather than an itinerary. An editor adding a
|
|
14
|
+
* step must therefore say which `at` value routes to it, or it is unreachable.
|
|
15
|
+
*/
|
|
16
|
+
export const LOAM_IMPLEMENT = {
|
|
17
|
+
name: "loam-implement",
|
|
18
|
+
description: "Implement a loam feature's slice for one service — generated gherkin first, tests from it, then code",
|
|
19
|
+
argumentHint: "<FEAT-id> [service]",
|
|
20
|
+
purpose: "Build one service's part of a feature, in that service's own repository. The generated Gherkin is the acceptance criterion — it comes before the step definitions, and those come before the code.",
|
|
21
|
+
invocation: "loam instructions loam-implement $1 $2",
|
|
22
|
+
placeholders: ["feature", "service"],
|
|
23
|
+
spine: [
|
|
24
|
+
"`loam status` — where this feature actually is, and what is owed before you start",
|
|
25
|
+
"`loam context` — the briefing: the service's living slice, and every delta in flight over it",
|
|
26
|
+
"`loam delta` — the task: the intent, every requirement verbatim, the endpoints, and the calls in and out",
|
|
27
|
+
"`loam tasks` — the open units, ordered; `--next` is the single next unit, with the scenario verbatim and the fact that closes it",
|
|
28
|
+
"`loam gherkin` in the service's repo — the digest-stamped `.feature` files. Never edit them",
|
|
29
|
+
"write step definitions for the generated scenarios first, outside the generated directory",
|
|
30
|
+
"implement until the suite passes, running it with a JSON report",
|
|
31
|
+
"honour the contract in both directions: expose every inbound operation, call every outbound one",
|
|
32
|
+
"`loam rebase` if building made you change the feature's documents at all, then validate the feature",
|
|
33
|
+
],
|
|
34
|
+
body: `Implement one service's part of a feature. Every step runs in the SERVICE'S own
|
|
35
|
+
repository, which needs its own committed ./loam.json — if there is none,
|
|
36
|
+
\`loam init --docs <path-to-docs-repo> --service $2 --agent-profile service\` then
|
|
37
|
+
\`loam doctor\` first.
|
|
38
|
+
|
|
39
|
+
0. \`loam status $1 --json\` — where this feature actually is. Run it before
|
|
40
|
+
anything else if you joined halfway or lost the session: it says which
|
|
41
|
+
artifacts are still owed, whether another feature has to archive first, and
|
|
42
|
+
what the next step is, each \`next[]\` entry carrying the literal command. It
|
|
43
|
+
writes nothing, so it is always safe to re-run.
|
|
44
|
+
1. \`loam context $2 --feature $1 --json\` — the briefing to load before touching
|
|
45
|
+
code: the service's living requirements and arch requirements verbatim, its
|
|
46
|
+
operations and messages as they stand today, the permissions and capabilities
|
|
47
|
+
its requirements join to, the fleet edges around it, and this feature's delta
|
|
48
|
+
over it (\`--feature $1\` narrows the in-flight section; drop it to see every
|
|
49
|
+
feature working over this service). The delta below is WHAT CHANGES; the pack
|
|
50
|
+
is what it changes INTO — read it first so a MODIFIED requirement lands as an
|
|
51
|
+
edit rather than a rewrite, and an operation you are about to add is caught
|
|
52
|
+
when the living contract already defines it. Exit 1 with \`ok: true\` means a
|
|
53
|
+
document behind the pack did not parse; the empty section beside the flag is
|
|
54
|
+
the parse failure, not "nothing here".
|
|
55
|
+
2. \`loam delta $1 --service $2 --json\` (drop \`--service\` to use the service configured
|
|
56
|
+
in ./loam.json). That output IS the task:
|
|
57
|
+
- \`intent\` — why this exists
|
|
58
|
+
- \`requirements[]\` — what to build, with \`scenarios[].lines\` verbatim
|
|
59
|
+
- \`archRequirements[]\` — the architectural obligations (outbox, retries, alerts),
|
|
60
|
+
same shape; their scenarios become integration/ops tests, and \`covers\` names
|
|
61
|
+
the model objects each exercises
|
|
62
|
+
- \`architecture\` — whether this service is new, and the calls in and out of it
|
|
63
|
+
- \`api\` — the endpoints this feature adds or retires for this service: path,
|
|
64
|
+
method, operationId and summary, with removals spelled \`REMOVE <METHOD> <path>\`
|
|
65
|
+
- \`openapi\` — whether that contract could be read at all: \`unreadable\`, plus an
|
|
66
|
+
\`error\` when the parser gave a message. It rides beside \`api\` rather than
|
|
67
|
+
inside it because \`api\` stays the operations array it has always been, and it
|
|
68
|
+
is what tells an empty \`api\` apart from a contract delta that did not parse
|
|
69
|
+
- \`services\` — every service this feature projects onto, so a run without
|
|
70
|
+
\`--service\` tells you which ones to ask for rather than guessing
|
|
71
|
+
Exit 1 with \`ok: true\` means one of the two authored documents behind this brief
|
|
72
|
+
did not parse: \`architecture.errors\` non-empty (delta.likec4), or
|
|
73
|
+
\`openapi.unreadable\` true (the feature's openapi.yaml for this service). The empty
|
|
74
|
+
slice is the parse failure itself, not "nothing changes there". Stop and fix that
|
|
75
|
+
document before building anything — for the delta, \`loam validate $1 --json\` names
|
|
76
|
+
the error; the contract delta is not graded by validate, so read the parser message
|
|
77
|
+
the payload carries.
|
|
78
|
+
3. \`loam tasks $1 --service $2 --next --json\` — ONE unit of work, and the loop
|
|
79
|
+
every step below runs inside. Step 2 is the whole brief; this is the next thing
|
|
80
|
+
to do in it. It writes nothing: the projection is derived from the verify
|
|
81
|
+
checklist, the delta scans, the feature's verification record and — in this,
|
|
82
|
+
the bound service repo — the digest stamps in the generated \`.feature\` files.
|
|
83
|
+
Drop \`--next\` to see every open unit instead of only the head.
|
|
84
|
+
Each entry of \`units[]\` carries its \`id\` (the same id the verify checklist uses
|
|
85
|
+
for that claim), \`kind\` (\`service.exists\`, \`api.exposes\`, \`event.declares\`,
|
|
86
|
+
\`c4.calls\`, \`scenario.tested\` or \`requirement.described\`), \`subject\`, \`claim\`,
|
|
87
|
+
\`digest\`, \`dependsOn\`, \`source\` — the path, line, requirement and scenario it was
|
|
88
|
+
derived from, with the scenario's own \`lines\` verbatim — and \`done.check\`.
|
|
89
|
+
|
|
90
|
+
\`at\` is the instruction. It says what the unit NEEDS, and each of its four
|
|
91
|
+
values names exactly one action:
|
|
92
|
+
- \`describe\` — the requirement owns no scenarios yet. Write the Given/When/Then
|
|
93
|
+
in the DOCS repo, on the requirement \`source\` names, and nothing else. loam
|
|
94
|
+
does not author, and no amount of code closes a unit sitting here.
|
|
95
|
+
- \`generate\` — no stamped \`.feature\` carries this scenario's digest. The only
|
|
96
|
+
action is \`loam gherkin $1\` in this repo (step 4). Do not write code.
|
|
97
|
+
- \`implement\` — the stamped scenario exists and no recorded run has confirmed
|
|
98
|
+
it. Write step definitions outside \`loam/\`, implement until the suite passes,
|
|
99
|
+
then \`loam verify $1 --service $2 --results report.json\` (step 5).
|
|
100
|
+
- \`attested\` — the claim was closed on somebody's word rather than on a run.
|
|
101
|
+
Run the suite and re-record it so it stops resting on an assertion. An
|
|
102
|
+
agent-attested scenario stays visible at \`attested\` forever, deliberately: it
|
|
103
|
+
is the one state that cannot be made to go away by ignoring it.
|
|
104
|
+
|
|
105
|
+
\`done.check\` is the FACT that closes the unit, and the RUNNER decides whether
|
|
106
|
+
that fact holds — never your own reading of the code you just wrote. Done means
|
|
107
|
+
the unit no longer appears, and it stops appearing only once its claim is
|
|
108
|
+
recorded confirmed in a verification record that is not stale. So re-run
|
|
109
|
+
\`loam tasks $1 --service $2 --json\` after every recording instead of working
|
|
110
|
+
down a list you copied out: \`frontier\` (the first ten open unit ids, in order)
|
|
111
|
+
and \`counts\` (\`open\`, \`done\`, \`attested\`) are recomputed from the documents on
|
|
112
|
+
every run, which is what makes taking the head of it always safe.
|
|
113
|
+
\`checklist\` is the digest of the question set the whole projection derives from.
|
|
114
|
+
If it differs from the one you started against, the question set moved under
|
|
115
|
+
you — re-read the feature before continuing, because what you closed earlier may
|
|
116
|
+
not be what is being asked now.
|
|
117
|
+
\`record\` says whether the answers were found at all (\`absent\`, \`recorded\`,
|
|
118
|
+
\`stale\`, \`unreadable\`) and \`stamps\` whether this repo's generated suite could be
|
|
119
|
+
read (\`read\`, \`unknown\`); an \`unknown\` makes every \`generate\` verdict a guess,
|
|
120
|
+
so fix the binding before acting on one. \`contracts\` restates step 6 as data
|
|
121
|
+
(\`expose[]\` and \`call[]\`), \`size\` the shape of the packet, \`review[]\` what a
|
|
122
|
+
reviewer of it will read, and \`waitingOn\` — whenever the packet is narrowed to one
|
|
123
|
+
service: by \`--service\`, or without it to this repo's own service when the feature
|
|
124
|
+
touches it — what another service still owes before your frontier can move.
|
|
125
|
+
Exit 1 with \`ok: true\` is step 2's rule again: delta.likec4 or one of the
|
|
126
|
+
contract axes did not parse, so the projection is SHORT by everything that
|
|
127
|
+
document would have contributed. Fix the document; do not work the units that
|
|
128
|
+
happened to survive it.
|
|
129
|
+
4. \`at: "generate"\` — in the service's repo, \`loam gherkin $1 --json\`. One
|
|
130
|
+
\`.feature\` file per changed requirement lands under \`<gherkinDir>/loam/\`
|
|
131
|
+
(default \`features/loam/\`), scenarios digest-stamped, arch requirements tagged
|
|
132
|
+
\`@architecture\`. Those files ARE the acceptance criteria. Never edit them:
|
|
133
|
+
regeneration rewrites the directory, and \`loam validate\` reports the suite stale
|
|
134
|
+
by digest, not by your intentions. Generating is the WHOLE action for a unit at
|
|
135
|
+
\`generate\`: go back to step 3, where the same unit now reads \`implement\`.
|
|
136
|
+
5. \`at: "implement"\` — step definitions FIRST, outside \`loam/\`, then the code.
|
|
137
|
+
Do not paraphrase a scenario into something easier to pass; it is the acceptance
|
|
138
|
+
criterion someone else reviews against.
|
|
139
|
+
Run \`loam steps --service $2 --json\` before you write any: it collapses every
|
|
140
|
+
written step onto the phrase a definition actually matches, so you see the size
|
|
141
|
+
of the registry you owe and which phrases already exist. Write ONE definition per
|
|
142
|
+
phrase row. If \`nearDuplicates\` is non-empty, two rows differ by an article or a
|
|
143
|
+
trailing \`because …\` clause and one definition was meant — fix the SPEC's wording
|
|
144
|
+
and regenerate, rather than writing the second definition.
|
|
145
|
+
A step's argument arrives as an argument: a \`"""\` docstring is the payload, an
|
|
146
|
+
indented table is a DataTable. Assert against them; do not re-parse the step text.
|
|
147
|
+
Then implement until the suite passes — run it with a JSON report
|
|
148
|
+
(\`cucumber-js --format json:report.json\`; cucumber-jvm, behave, Reqnroll,
|
|
149
|
+
pytest-bdd \`--cucumberjson\` and godog write the same cucumber JSON):
|
|
150
|
+
\`loam verify $1 --service $2 --results report.json\` consumes that report as the
|
|
151
|
+
done-check's answer sheet. A runner with no cucumber formatter answers through
|
|
152
|
+
loam's runner-neutral shape instead, keyed by each scenario's \`@loam-digest\`
|
|
153
|
+
tag — adapting the runner's report into it is a build step you own:
|
|
154
|
+
\`{"loamScenarioReport": 1, "results": [{"digest": "<16 hex>", "status": "passed"}]}\`.
|
|
155
|
+
A cucumber run must have run every step of the stamped scenario: a report
|
|
156
|
+
entry whose step count differs is not that scenario's run and stays
|
|
157
|
+
unconfirmed. Record from THIS repo, with \`--service\` — the
|
|
158
|
+
\`--service\`-less \`--record\` form writes the whole record from one place and is
|
|
159
|
+
refused (\`record-federated\`) once another service has attested. Recording is what
|
|
160
|
+
closes the unit, so step 3 is the command AFTER it, not the end of the run.
|
|
161
|
+
6. Honour the contract: every operation in \`architecture.inbound\` must exist under
|
|
162
|
+
exactly that operationId, and every one in \`architecture.outbound\` must be called.
|
|
163
|
+
The code you just wrote is evidence about the delta's edges. If an edge the
|
|
164
|
+
feature draws as \`connects\` is in fact a publish, a delivery, a read or a write,
|
|
165
|
+
redraw it in delta.likec4 with that kind (\`loam instructions loam-drawing\`) —
|
|
166
|
+
and step 7 applies, because that is a change to the feature's documents.
|
|
167
|
+
7. If building made you change the feature's documents at all — a requirement's
|
|
168
|
+
wording, an operation in its openapi.yaml — **\`loam rebase $1\`** before you
|
|
169
|
+
validate. Every edit you make in the docs repo while other features are in
|
|
170
|
+
flight is written against a living document that may have moved since the
|
|
171
|
+
feature directory was created, and the pins are the only thing that lets the
|
|
172
|
+
merge tell an EDIT from a QUOTE — for operations, path-level keys and
|
|
173
|
+
components alike. \`delta.baseline-missing\` and
|
|
174
|
+
\`openapi.baseline-missing\` are the warnings that say you skipped it — archive
|
|
175
|
+
refuses on them until you rebase (or a human \`--approve\`s the unpinned merge);
|
|
176
|
+
\`delta.baseline-stale\` / \`openapi.baseline-stale\` are archive refusing because
|
|
177
|
+
somebody landed a change underneath you — re-read theirs, fold in what you
|
|
178
|
+
still mean, then rebase again. Re-pinning without re-reading is how you
|
|
179
|
+
overwrite someone else's requirement with loam's blessing.
|
|
180
|
+
8. \`loam validate --feature $1 --json\` before handing back.
|
|
181
|
+
|
|
182
|
+
If the requirement is ambiguous, say so and stop — do not invent behaviour and
|
|
183
|
+
leave the spec disagreeing with the code. Write the question under
|
|
184
|
+
\`## Open questions\` in the feature's \`intent.md\`, where loam-feature's analyze
|
|
185
|
+
step put the ones it found, so a person answers it once for every service.
|
|
186
|
+
`,
|
|
187
|
+
};
|
|
188
|
+
//# sourceMappingURL=implement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"implement.js","sourceRoot":"","sources":["../../../../src/core/agent/workflows/implement.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,cAAc,GAAmB;IAC5C,IAAI,EAAE,gBAAgB;IACtB,WAAW,EACT,sGAAsG;IACxG,YAAY,EAAE,qBAAqB;IACnC,OAAO,EACL,oMAAoM;IACtM,UAAU,EAAE,wCAAwC;IACpD,YAAY,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;IACpC,KAAK,EAAE;QACL,mFAAmF;QACnF,8FAA8F;QAC9F,0GAA0G;QAC1G,kIAAkI;QAClI,6FAA6F;QAC7F,2FAA2F;QAC3F,iEAAiE;QACjE,iGAAiG;QACjG,qGAAqG;KACtG;IACD,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwJP;CACA,CAAC","sourcesContent":["import type { CommandContent } from \"../contract.js\";\n\n/**\n * Building one service's slice: the delta brief, then a unit at a time —\n * generated gherkin, steps, code, verify.\n *\n * Steps 3-5 are a LOOP, not a sequence, and that is why `loam tasks` sits at\n * the head of them. They used to be three things done in order — generate the\n * suite, write the definitions, implement — which is only the right order for a\n * slice whose every requirement already owns a scenario. Where one does not,\n * the next thing owed is a sentence in the docs repo, and the body had no step\n * that could say so; where the suite is half written, nothing here answered\n * which half. `at` answers both: the projection names which of four states the\n * next unit is in, and each state names exactly one action, so the numbering\n * below is a table of destinations rather than an itinerary. An editor adding a\n * step must therefore say which `at` value routes to it, or it is unreachable.\n */\nexport const LOAM_IMPLEMENT: CommandContent = {\n name: \"loam-implement\",\n description:\n \"Implement a loam feature's slice for one service — generated gherkin first, tests from it, then code\",\n argumentHint: \"<FEAT-id> [service]\",\n purpose:\n \"Build one service's part of a feature, in that service's own repository. The generated Gherkin is the acceptance criterion — it comes before the step definitions, and those come before the code.\",\n invocation: \"loam instructions loam-implement $1 $2\",\n placeholders: [\"feature\", \"service\"],\n spine: [\n \"`loam status` — where this feature actually is, and what is owed before you start\",\n \"`loam context` — the briefing: the service's living slice, and every delta in flight over it\",\n \"`loam delta` — the task: the intent, every requirement verbatim, the endpoints, and the calls in and out\",\n \"`loam tasks` — the open units, ordered; `--next` is the single next unit, with the scenario verbatim and the fact that closes it\",\n \"`loam gherkin` in the service's repo — the digest-stamped `.feature` files. Never edit them\",\n \"write step definitions for the generated scenarios first, outside the generated directory\",\n \"implement until the suite passes, running it with a JSON report\",\n \"honour the contract in both directions: expose every inbound operation, call every outbound one\",\n \"`loam rebase` if building made you change the feature's documents at all, then validate the feature\",\n ],\n body: `Implement one service's part of a feature. Every step runs in the SERVICE'S own\nrepository, which needs its own committed ./loam.json — if there is none,\n\\`loam init --docs <path-to-docs-repo> --service $2 --agent-profile service\\` then\n\\`loam doctor\\` first.\n\n0. \\`loam status $1 --json\\` — where this feature actually is. Run it before\n anything else if you joined halfway or lost the session: it says which\n artifacts are still owed, whether another feature has to archive first, and\n what the next step is, each \\`next[]\\` entry carrying the literal command. It\n writes nothing, so it is always safe to re-run.\n1. \\`loam context $2 --feature $1 --json\\` — the briefing to load before touching\n code: the service's living requirements and arch requirements verbatim, its\n operations and messages as they stand today, the permissions and capabilities\n its requirements join to, the fleet edges around it, and this feature's delta\n over it (\\`--feature $1\\` narrows the in-flight section; drop it to see every\n feature working over this service). The delta below is WHAT CHANGES; the pack\n is what it changes INTO — read it first so a MODIFIED requirement lands as an\n edit rather than a rewrite, and an operation you are about to add is caught\n when the living contract already defines it. Exit 1 with \\`ok: true\\` means a\n document behind the pack did not parse; the empty section beside the flag is\n the parse failure, not \"nothing here\".\n2. \\`loam delta $1 --service $2 --json\\` (drop \\`--service\\` to use the service configured\n in ./loam.json). That output IS the task:\n - \\`intent\\` — why this exists\n - \\`requirements[]\\` — what to build, with \\`scenarios[].lines\\` verbatim\n - \\`archRequirements[]\\` — the architectural obligations (outbox, retries, alerts),\n same shape; their scenarios become integration/ops tests, and \\`covers\\` names\n the model objects each exercises\n - \\`architecture\\` — whether this service is new, and the calls in and out of it\n - \\`api\\` — the endpoints this feature adds or retires for this service: path,\n method, operationId and summary, with removals spelled \\`REMOVE <METHOD> <path>\\`\n - \\`openapi\\` — whether that contract could be read at all: \\`unreadable\\`, plus an\n \\`error\\` when the parser gave a message. It rides beside \\`api\\` rather than\n inside it because \\`api\\` stays the operations array it has always been, and it\n is what tells an empty \\`api\\` apart from a contract delta that did not parse\n - \\`services\\` — every service this feature projects onto, so a run without\n \\`--service\\` tells you which ones to ask for rather than guessing\n Exit 1 with \\`ok: true\\` means one of the two authored documents behind this brief\n did not parse: \\`architecture.errors\\` non-empty (delta.likec4), or\n \\`openapi.unreadable\\` true (the feature's openapi.yaml for this service). The empty\n slice is the parse failure itself, not \"nothing changes there\". Stop and fix that\n document before building anything — for the delta, \\`loam validate $1 --json\\` names\n the error; the contract delta is not graded by validate, so read the parser message\n the payload carries.\n3. \\`loam tasks $1 --service $2 --next --json\\` — ONE unit of work, and the loop\n every step below runs inside. Step 2 is the whole brief; this is the next thing\n to do in it. It writes nothing: the projection is derived from the verify\n checklist, the delta scans, the feature's verification record and — in this,\n the bound service repo — the digest stamps in the generated \\`.feature\\` files.\n Drop \\`--next\\` to see every open unit instead of only the head.\n Each entry of \\`units[]\\` carries its \\`id\\` (the same id the verify checklist uses\n for that claim), \\`kind\\` (\\`service.exists\\`, \\`api.exposes\\`, \\`event.declares\\`,\n \\`c4.calls\\`, \\`scenario.tested\\` or \\`requirement.described\\`), \\`subject\\`, \\`claim\\`,\n \\`digest\\`, \\`dependsOn\\`, \\`source\\` — the path, line, requirement and scenario it was\n derived from, with the scenario's own \\`lines\\` verbatim — and \\`done.check\\`.\n\n \\`at\\` is the instruction. It says what the unit NEEDS, and each of its four\n values names exactly one action:\n - \\`describe\\` — the requirement owns no scenarios yet. Write the Given/When/Then\n in the DOCS repo, on the requirement \\`source\\` names, and nothing else. loam\n does not author, and no amount of code closes a unit sitting here.\n - \\`generate\\` — no stamped \\`.feature\\` carries this scenario's digest. The only\n action is \\`loam gherkin $1\\` in this repo (step 4). Do not write code.\n - \\`implement\\` — the stamped scenario exists and no recorded run has confirmed\n it. Write step definitions outside \\`loam/\\`, implement until the suite passes,\n then \\`loam verify $1 --service $2 --results report.json\\` (step 5).\n - \\`attested\\` — the claim was closed on somebody's word rather than on a run.\n Run the suite and re-record it so it stops resting on an assertion. An\n agent-attested scenario stays visible at \\`attested\\` forever, deliberately: it\n is the one state that cannot be made to go away by ignoring it.\n\n \\`done.check\\` is the FACT that closes the unit, and the RUNNER decides whether\n that fact holds — never your own reading of the code you just wrote. Done means\n the unit no longer appears, and it stops appearing only once its claim is\n recorded confirmed in a verification record that is not stale. So re-run\n \\`loam tasks $1 --service $2 --json\\` after every recording instead of working\n down a list you copied out: \\`frontier\\` (the first ten open unit ids, in order)\n and \\`counts\\` (\\`open\\`, \\`done\\`, \\`attested\\`) are recomputed from the documents on\n every run, which is what makes taking the head of it always safe.\n \\`checklist\\` is the digest of the question set the whole projection derives from.\n If it differs from the one you started against, the question set moved under\n you — re-read the feature before continuing, because what you closed earlier may\n not be what is being asked now.\n \\`record\\` says whether the answers were found at all (\\`absent\\`, \\`recorded\\`,\n \\`stale\\`, \\`unreadable\\`) and \\`stamps\\` whether this repo's generated suite could be\n read (\\`read\\`, \\`unknown\\`); an \\`unknown\\` makes every \\`generate\\` verdict a guess,\n so fix the binding before acting on one. \\`contracts\\` restates step 6 as data\n (\\`expose[]\\` and \\`call[]\\`), \\`size\\` the shape of the packet, \\`review[]\\` what a\n reviewer of it will read, and \\`waitingOn\\` — whenever the packet is narrowed to one\n service: by \\`--service\\`, or without it to this repo's own service when the feature\n touches it — what another service still owes before your frontier can move.\n Exit 1 with \\`ok: true\\` is step 2's rule again: delta.likec4 or one of the\n contract axes did not parse, so the projection is SHORT by everything that\n document would have contributed. Fix the document; do not work the units that\n happened to survive it.\n4. \\`at: \"generate\"\\` — in the service's repo, \\`loam gherkin $1 --json\\`. One\n \\`.feature\\` file per changed requirement lands under \\`<gherkinDir>/loam/\\`\n (default \\`features/loam/\\`), scenarios digest-stamped, arch requirements tagged\n \\`@architecture\\`. Those files ARE the acceptance criteria. Never edit them:\n regeneration rewrites the directory, and \\`loam validate\\` reports the suite stale\n by digest, not by your intentions. Generating is the WHOLE action for a unit at\n \\`generate\\`: go back to step 3, where the same unit now reads \\`implement\\`.\n5. \\`at: \"implement\"\\` — step definitions FIRST, outside \\`loam/\\`, then the code.\n Do not paraphrase a scenario into something easier to pass; it is the acceptance\n criterion someone else reviews against.\n Run \\`loam steps --service $2 --json\\` before you write any: it collapses every\n written step onto the phrase a definition actually matches, so you see the size\n of the registry you owe and which phrases already exist. Write ONE definition per\n phrase row. If \\`nearDuplicates\\` is non-empty, two rows differ by an article or a\n trailing \\`because …\\` clause and one definition was meant — fix the SPEC's wording\n and regenerate, rather than writing the second definition.\n A step's argument arrives as an argument: a \\`\"\"\"\\` docstring is the payload, an\n indented table is a DataTable. Assert against them; do not re-parse the step text.\n Then implement until the suite passes — run it with a JSON report\n (\\`cucumber-js --format json:report.json\\`; cucumber-jvm, behave, Reqnroll,\n pytest-bdd \\`--cucumberjson\\` and godog write the same cucumber JSON):\n \\`loam verify $1 --service $2 --results report.json\\` consumes that report as the\n done-check's answer sheet. A runner with no cucumber formatter answers through\n loam's runner-neutral shape instead, keyed by each scenario's \\`@loam-digest\\`\n tag — adapting the runner's report into it is a build step you own:\n \\`{\"loamScenarioReport\": 1, \"results\": [{\"digest\": \"<16 hex>\", \"status\": \"passed\"}]}\\`.\n A cucumber run must have run every step of the stamped scenario: a report\n entry whose step count differs is not that scenario's run and stays\n unconfirmed. Record from THIS repo, with \\`--service\\` — the\n \\`--service\\`-less \\`--record\\` form writes the whole record from one place and is\n refused (\\`record-federated\\`) once another service has attested. Recording is what\n closes the unit, so step 3 is the command AFTER it, not the end of the run.\n6. Honour the contract: every operation in \\`architecture.inbound\\` must exist under\n exactly that operationId, and every one in \\`architecture.outbound\\` must be called.\n The code you just wrote is evidence about the delta's edges. If an edge the\n feature draws as \\`connects\\` is in fact a publish, a delivery, a read or a write,\n redraw it in delta.likec4 with that kind (\\`loam instructions loam-drawing\\`) —\n and step 7 applies, because that is a change to the feature's documents.\n7. If building made you change the feature's documents at all — a requirement's\n wording, an operation in its openapi.yaml — **\\`loam rebase $1\\`** before you\n validate. Every edit you make in the docs repo while other features are in\n flight is written against a living document that may have moved since the\n feature directory was created, and the pins are the only thing that lets the\n merge tell an EDIT from a QUOTE — for operations, path-level keys and\n components alike. \\`delta.baseline-missing\\` and\n \\`openapi.baseline-missing\\` are the warnings that say you skipped it — archive\n refuses on them until you rebase (or a human \\`--approve\\`s the unpinned merge);\n \\`delta.baseline-stale\\` / \\`openapi.baseline-stale\\` are archive refusing because\n somebody landed a change underneath you — re-read theirs, fold in what you\n still mean, then rebase again. Re-pinning without re-reading is how you\n overwrite someone else's requirement with loam's blessing.\n8. \\`loam validate --feature $1 --json\\` before handing back.\n\nIf the requirement is ambiguous, say so and stop — do not invent behaviour and\nleave the spec disagreeing with the code. Write the question under\n\\`## Open questions\\` in the feature's \\`intent.md\\`, where loam-feature's analyze\nstep put the ones it found, so a person answers it once for every service.\n`,\n};\n"]}
|
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
export const LOAM_AUTHORING = {
|
|
2
|
+
name: "loam-authoring",
|
|
3
|
+
description: "Reference: the grammars you author against — arch.spec.md, the generated Gherkin suite, frontmatter, and writing a feature a person can follow",
|
|
4
|
+
// No arguments: one document, printed whole. See ./spine.ts for why the hint
|
|
5
|
+
// is empty rather than a spelled-out "<none>".
|
|
6
|
+
argumentHint: "",
|
|
7
|
+
purpose: "What each document you author by hand must contain: the architecture requirements axis and its `Covers:` line, how scenarios become an executable suite, the frontmatter fields `loam vouch` stamps, and how to write a feature's documents so a reviewer can follow them.",
|
|
8
|
+
invocation: "loam instructions loam-authoring",
|
|
9
|
+
placeholders: [],
|
|
10
|
+
spine: [
|
|
11
|
+
"The architecture spec axis",
|
|
12
|
+
"The generated Gherkin suite",
|
|
13
|
+
"Frontmatter — who vouched for this, and from what",
|
|
14
|
+
"Writing for a person",
|
|
15
|
+
],
|
|
16
|
+
body: `The grammars you author against: the architecture spec axis, the generated Gherkin suite, frontmatter, and writing a feature a person can follow.
|
|
17
|
+
|
|
18
|
+
## The architecture spec axis
|
|
19
|
+
|
|
20
|
+
The business spec will never mention the transactional outbox — that is
|
|
21
|
+
architecture. Retries, idempotency, metrics, alerts: real obligations no business
|
|
22
|
+
scenario states, and exactly where generated code cuts corners unless the
|
|
23
|
+
obligations are derived mechanically. They live in \`arch.spec.md\` — living and
|
|
24
|
+
delta, same grammar, same delta algebra, merged by \`loam archive\` through the
|
|
25
|
+
same code path (the two files are separate requirement namespaces).
|
|
26
|
+
|
|
27
|
+
Where a business requirement carries \`Operations:\`, an arch requirement carries
|
|
28
|
+
\`Covers:\` — the model objects its scenarios exercise, comma-separated:
|
|
29
|
+
|
|
30
|
+
\`\`\`
|
|
31
|
+
Covers: paymentService.db, paymentService -> kafka, alert:payment_5xx, sli:availability
|
|
32
|
+
\`\`\`
|
|
33
|
+
|
|
34
|
+
a C4 element (id, or the service a bound element stands for), an edge
|
|
35
|
+
(\`source -> target\`), or a health signal the service's health.yaml declares.
|
|
36
|
+
Every entry must resolve — \`covers.unknown\` (warn) is the typo guard, because a
|
|
37
|
+
mistyped entry silently costs the coverage it was written for.
|
|
38
|
+
|
|
39
|
+
Coverage is then derived, never trusted, as two warnings: a feature's NEW tagged
|
|
40
|
+
elements and edges want a covering requirement in its arch.spec.md deltas
|
|
41
|
+
(\`c4.uncovered\`), and every alert/SLI health.yaml declares wants one in the
|
|
42
|
+
living arch spec (\`health.uncovered\`). None of this gates \`loam archive\`;
|
|
43
|
+
\`--strict\` is the CI escalation. An absent arch.spec.md is not a finding —
|
|
44
|
+
partial adoption is supported — but write one for any service with real
|
|
45
|
+
architecture, or its obligations ship unchecked.
|
|
46
|
+
|
|
47
|
+
**Effective configuration and dependency semantics live here too, by
|
|
48
|
+
convention.** Facts about the service that no artifact structurally holds —
|
|
49
|
+
the value a deploy chart actually sets, the retry budget a client library
|
|
50
|
+
hardcodes ("retries: -1 is unbounded"), the delivery or idempotency guarantee
|
|
51
|
+
a driver decides — are ARCH REQUIREMENTS: prose with a \`Covers:\` line naming
|
|
52
|
+
the element or edge whose behaviour the fact decides. loam will never verify
|
|
53
|
+
the values; naming the home is the point. A service whose timeout comes from
|
|
54
|
+
an env var in a chart in another repository is otherwise described by no file
|
|
55
|
+
in this repo, and two adoptions will file the same fact two different ways.
|
|
56
|
+
|
|
57
|
+
**Test levels, mapped once.** A business scenario is an acceptance test. An arch
|
|
58
|
+
scenario is an integration/ops test — the outbox relay under a dead broker, the
|
|
59
|
+
retry that stays idempotent, the alert rule that actually fires. \`api.exposes\`
|
|
60
|
+
is a contract test. Unit tests sit below spec granularity and are your TDD
|
|
61
|
+
concern, not the specs'.
|
|
62
|
+
|
|
63
|
+
## The generated Gherkin suite
|
|
64
|
+
|
|
65
|
+
Scenarios are the acceptance criteria, and \`loam gherkin\` makes them
|
|
66
|
+
executable: real \`.feature\` files, written into the SERVICE'S repo — the one
|
|
67
|
+
loam command that writes there, because tests live with the code they gate.
|
|
68
|
+
Output lands in \`<gherkinDir>/loam/\` (\`gherkinDir\` is an optional loam.json
|
|
69
|
+
fact, default \`features\`), and that \`loam/\` subdirectory is loam's own
|
|
70
|
+
derived space — and a committed one: an emission lands through the same lock
|
|
71
|
+
and journal the docs repo's writers use, as \`loam/.loam-lock\` and
|
|
72
|
+
\`loam/.loam-commit\` dotfiles that exist only while a run is in flight (or
|
|
73
|
+
after a kill, where the journal is what lets the next run finish the job).
|
|
74
|
+
Regeneration rewrites its scope and deletes its orphans, so
|
|
75
|
+
never hand-edit inside it — step definitions and hand-written features belong
|
|
76
|
+
outside it, and loam never touches a byte outside \`loam/\`.
|
|
77
|
+
|
|
78
|
+
- \`loam gherkin FEAT-101\` — the feature's ADDED/MODIFIED requirements for this
|
|
79
|
+
service, both spec axes. Files carry \`@FEAT-101\`; arch-axis files add
|
|
80
|
+
\`@architecture\` and are named \`arch--<slug>.feature\` — their scenarios are
|
|
81
|
+
integration/ops tests, not acceptance tests.
|
|
82
|
+
- \`loam gherkin --service <id>\` (no feature) — the full living suite from
|
|
83
|
+
spec.md + arch.spec.md: the regression skeleton a legacy service gets at
|
|
84
|
+
adoption.
|
|
85
|
+
|
|
86
|
+
One file per requirement (\`Feature:\` is the requirement name). Bullet lines
|
|
87
|
+
opening with Given/When/Then/And/But — the \`- **WHEN** ...\` convention
|
|
88
|
+
included — become steps; every other body line is kept as scenario
|
|
89
|
+
description. A valid Markdown table AT THE MARGIN becomes the \`Examples:\` of
|
|
90
|
+
a \`Scenario Outline\`; a malformed table stays in the description and is
|
|
91
|
+
reported, because it will run once rather than once per row.
|
|
92
|
+
|
|
93
|
+
A step takes an ARGUMENT by carrying it INDENTED underneath: an indented table
|
|
94
|
+
becomes that step's data table (the rows an outbox or a DB table must hold after
|
|
95
|
+
the pass), a fenced block becomes its docstring, indentation intact (the request
|
|
96
|
+
payload). Indented under a step means this step's rows; at the margin means the
|
|
97
|
+
scenario's cases. A block no step precedes stays description and is reported as
|
|
98
|
+
\`strandedBlocks\` — the document reads, and the TEST lost its argument. Each scenario is
|
|
99
|
+
tagged \`@loam-digest-<16hex>\`: the same body
|
|
100
|
+
hash \`loam verify\` folds into its claim ids, riding into cucumber's JSON
|
|
101
|
+
report as a tag, so the suite, the claim and the report cannot quietly
|
|
102
|
+
disagree about what a scenario says. \`loam validate
|
|
103
|
+
--service <id>\`, run in the service repo, grades the suite by those digests
|
|
104
|
+
(\`gherkin.missing\` / \`gherkin.stale\` / \`gherkin.orphaned\`, all warn) — the
|
|
105
|
+
fix is always regeneration, never editing a generated file.
|
|
106
|
+
|
|
107
|
+
The flow, closed end to end: \`loam gherkin FEAT-101\` → \`loam steps --service
|
|
108
|
+
<id>\` (the phrase inventory: how many step definitions this suite needs, one
|
|
109
|
+
per phrase row, and which phrases differ only by an article or a trailing
|
|
110
|
+
clause) → write step definitions (outside \`loam/\`) → run the suite with a JSON report
|
|
111
|
+
(\`cucumber-js --format json:report.json\`) → implement until green →
|
|
112
|
+
\`loam verify FEAT-101 --service <id> --results report.json [--contract-results contract.json] [--record rest.json]\`,
|
|
113
|
+
run in that same service repo. The digest
|
|
114
|
+
tags ride through the runner into the report, so the \`scenario.tested\` claims
|
|
115
|
+
are answered mechanically from the passing report rather than anybody's word.
|
|
116
|
+
This proves which digest-matched report bytes loam accepted; it does not prove
|
|
117
|
+
the report was produced by executing the attested commit. See
|
|
118
|
+
\`loam instructions loam-done-check\` for what \`--record\` still covers.
|
|
119
|
+
|
|
120
|
+
## Frontmatter — who vouched for this, and from what
|
|
121
|
+
|
|
122
|
+
Every markdown artifact opens with a YAML block:
|
|
123
|
+
|
|
124
|
+
\`\`\`yaml
|
|
125
|
+
---
|
|
126
|
+
service: payment-service # or feature: FEAT-101
|
|
127
|
+
status: verified # services: draft -> verified
|
|
128
|
+
# features: proposed -> in_progress -> built -> done
|
|
129
|
+
owner: payments-team
|
|
130
|
+
last_verified: 2026-07-31 # written by \`loam vouch\` — do not hand-edit
|
|
131
|
+
sources: # files/directories in the SERVICE'S repo this was written from — no globs
|
|
132
|
+
- src/main/java/com/shop/payment/
|
|
133
|
+
sources_digest: 6f1c0a… # written by \`loam vouch\` — do not hand-edit
|
|
134
|
+
content_digest: 9b2f41… # written by \`loam vouch\` — do not hand-edit
|
|
135
|
+
sources_files: | # written by \`loam vouch\` — do not hand-edit
|
|
136
|
+
9b2f41… src/main/java/com/shop/payment/Api.java
|
|
137
|
+
vouch_scope: sampled 2/9 seed=1a2b3c4d5e6f7089 # only when the vouch read a SAMPLE
|
|
138
|
+
---
|
|
139
|
+
\`\`\`
|
|
140
|
+
|
|
141
|
+
\`sources\` matters more than it looks. Everything else loam checks is internal
|
|
142
|
+
consistency — and a corpus can agree with itself perfectly while describing nothing
|
|
143
|
+
that exists. \`sources\` is the one thing tying a document to code: \`loam validate\`,
|
|
144
|
+
run inside that service's repository, checks every listed path is still there.
|
|
145
|
+
Entries are literal files and directories only — a directory covers everything
|
|
146
|
+
beneath it. Glob patterns are refused loudly (\`loam vouch\` will not stamp them,
|
|
147
|
+
\`loam validate\` errors on them): a pattern dialect nobody can be sure of digests
|
|
148
|
+
a different file set than intended, corrupting the staleness signal silently.
|
|
149
|
+
|
|
150
|
+
\`sources_digest\` is what makes that tie say something over time: a hash of the
|
|
151
|
+
CONTENT of those files, taken when a human last vouched for the document. Every
|
|
152
|
+
later \`loam validate\` re-computes it, so it can tell a document nobody has checked
|
|
153
|
+
(\`sources.unvouched\`) from one that still matches the code (\`sources.current\`) from
|
|
154
|
+
one the code has moved out from under (\`sources.stale\`). On \`sources.stale\` or
|
|
155
|
+
\`content.stale\`, \`loam vouch --pack --service <id>\` (read-only, stamps nothing)
|
|
156
|
+
prints exactly what to re-read before the human re-vouches — the body's diff since
|
|
157
|
+
the last vouch, the source files that moved, and the sections already covered.
|
|
158
|
+
|
|
159
|
+
\`content_digest\` is the same promise about the document itself: a hash of the
|
|
160
|
+
body below the frontmatter, stamped by the same vouch. It closes the other half of
|
|
161
|
+
the forgery — editing a spec after it was vouched used to leave \`status: verified\`
|
|
162
|
+
standing over words nobody read. \`loam validate\` recomputes it wherever it can
|
|
163
|
+
read the doc (no service repo needed, so it fires from the docs repo too) and
|
|
164
|
+
reports \`content.stale\` (warn): only a person can say whether verified still
|
|
165
|
+
holds of the new words. The fleet readouts say the same: \`loam list\` shows
|
|
166
|
+
\`vouched (stale)\` and owes the row a re-vouch, and \`loam status\` emits
|
|
167
|
+
\`next.revouch\` — a step for a person, never for you.
|
|
168
|
+
|
|
169
|
+
\`vouch_scope\` appears only when the person vouched after reading a SAMPLE of the
|
|
170
|
+
document — \`loam vouch --sample <n>\`, whose whole purpose is that a partial read
|
|
171
|
+
is recorded as a partial read. Its value is one flat string,
|
|
172
|
+
\`sampled <k>/<n> seed=<16 hex>\`: k sections read of n, and the seed those k were
|
|
173
|
+
chosen with. The seed is \`sha256(<service> NUL <content_digest> NUL <sources_digest>)\`
|
|
174
|
+
truncated to 16 hex characters, and the sections are ranked by
|
|
175
|
+
\`sha256(<seed> NUL <index> NUL <heading>)\` with the lowest k taken, over every H2
|
|
176
|
+
and H3 heading of the body outside code fences — so anybody holding the document
|
|
177
|
+
can recompute exactly which sections that person was shown, and an agent cannot
|
|
178
|
+
steer the pick without rewriting the document (which changes the seed and voids the
|
|
179
|
+
stamp). \`status\` stays \`verified\` and the maturity rung stays \`vouched\`: the scope
|
|
180
|
+
qualifies that claim, it is not a fourth status. \`loam validate\` reports
|
|
181
|
+
\`sources.sampled-vouch\` (warn) while it is there, \`loam list\` shows
|
|
182
|
+
\`vouched (sampled)\`, and a later FULL \`loam vouch\` deletes the field. Never write
|
|
183
|
+
or delete it by hand: removing it turns a partial read into a full one on every
|
|
184
|
+
surface at once, which is the one forgery this field exists to make impossible.
|
|
185
|
+
|
|
186
|
+
Write \`sources\` for anything you author from reading code, and leave \`status: draft\`
|
|
187
|
+
until a human has read it. Promoting draft to verified is their call, not yours, and
|
|
188
|
+
it has its own command — \`loam vouch --service <id>\`, run inside that service's repo,
|
|
189
|
+
which stamps the status, the date, the identity (\`vouched_by\`, from git), both digests
|
|
190
|
+
and the per-file index
|
|
191
|
+
(\`sources_files\`, which is what lets a later \`sources.stale\` name the paths that
|
|
192
|
+
moved) together — into the living spec.md
|
|
193
|
+
and, when the service has one, arch.spec.md, in one all-or-nothing run: a file whose
|
|
194
|
+
sources cannot be verified refuses the whole vouch. Never write those six fields by
|
|
195
|
+
hand: a status with no digest behind it is a claim with nothing behind it. If the
|
|
196
|
+
document changed under vouch between the read and the write, it refuses with
|
|
197
|
+
\`vouch-raced\` and stamps nothing — re-read and re-run.
|
|
198
|
+
|
|
199
|
+
**\`loam vouch\` is not yours to run**, and it is built so that it cannot be. It is
|
|
200
|
+
the one command whose output is a claim about a HUMAN act — everything else loam
|
|
201
|
+
checks is internal consistency, which fluent prose satisfies on its own — so it
|
|
202
|
+
refuses \`vouch-unattended\` when stdin is not a terminal (and in \`--json\` mode,
|
|
203
|
+
where a question cannot be asked), answers \`vouch-declined\` when the person says
|
|
204
|
+
no, and refuses \`vouch-unattributable\` when git can name nobody, because a stamp
|
|
205
|
+
with no \`vouched_by\` behind it records only that the word was written. \`--yes\`
|
|
206
|
+
exists for a person's own scripted run; typing it on someone's behalf is
|
|
207
|
+
writing their name. The generated command and skill files pre-approve loam's
|
|
208
|
+
read-only and authoring verbs one by one and deliberately not this one: when
|
|
209
|
+
the work is done, hand back and say a vouch is owed.
|
|
210
|
+
|
|
211
|
+
## Writing for a person
|
|
212
|
+
|
|
213
|
+
A feature is read by a reviewer before anyone builds it, and its requirements
|
|
214
|
+
are read for years after \`loam archive\` copies them into the living docs. loam
|
|
215
|
+
grades the joins and never the prose, so nothing in this section is checked: a
|
|
216
|
+
delta can validate clean and still be one nobody can follow.
|
|
217
|
+
|
|
218
|
+
**intent.md** opens with the problem in business terms — \`## Why\` and
|
|
219
|
+
\`## Scope\`, the two sections the archive gate reads — and then carries the three
|
|
220
|
+
things a reviewer looks for first:
|
|
221
|
+
|
|
222
|
+
- \`## How to read this feature\`: two or three sentences saying which services
|
|
223
|
+
change, which document to open first, and which picture shows the change (the
|
|
224
|
+
delta's own view, or a flow under the feature's \`usecases/\`).
|
|
225
|
+
- a business-requirement coverage table, one row per business requirement the
|
|
226
|
+
feature was asked to meet, naming what keeps it:
|
|
227
|
+
|
|
228
|
+
| Business requirement | Kept by | Where |
|
|
229
|
+
|---|---|---|
|
|
230
|
+
| A customer can split one payment between two cards | PAY-SPLIT-1 | payment-split-service spec.md |
|
|
231
|
+
| Every payee gets a receipt | uc_split_receipt | usecases/split-receipt.likec4 |
|
|
232
|
+
|
|
233
|
+
- \`## Open questions\` (the scaffold already writes the heading) as a table, so
|
|
234
|
+
that a person can answer each question and a reader can see what each blocks:
|
|
235
|
+
|
|
236
|
+
| ID | Question | Blocks | Owner | Current default |
|
|
237
|
+
|---|---|---|---|---|
|
|
238
|
+
| Q1 | Is a split refunded per card or as a whole? | PAY-SPLIT-3 | payments-team | per card |
|
|
239
|
+
|
|
240
|
+
The current default is what gets built if nobody answers, so write one for
|
|
241
|
+
every question.
|
|
242
|
+
|
|
243
|
+
**Each spec delta opens with a plain-language \`## Purpose\`**: what the service
|
|
244
|
+
does in this change, written for someone who has never opened its code. Where
|
|
245
|
+
the delta CREATES the living document — a new service's spec.md, a first
|
|
246
|
+
arch.spec.md, a new capability — \`loam archive\` copies that section into the
|
|
247
|
+
new document as its narrative. Where the living document already exists, the
|
|
248
|
+
section stays with the archived delta, and the archive plan says so on that
|
|
249
|
+
file's line; if the service's own narrative should change, edit the living
|
|
250
|
+
document in the same change.
|
|
251
|
+
|
|
252
|
+
**Write a long requirement body as a lead and bullets.** A new requirement
|
|
253
|
+
states one behaviour. A requirement carried over from another source often
|
|
254
|
+
arrives as one paragraph of SHALL sentences. Keep every sentence, but open with
|
|
255
|
+
one line that says what the requirement is for, and give each SHALL sentence a
|
|
256
|
+
bullet of its own:
|
|
257
|
+
|
|
258
|
+
### Requirement: Split a payment
|
|
259
|
+
Requirement-ID: PAY-SPLIT-1
|
|
260
|
+
|
|
261
|
+
A payment can be divided between several payees.
|
|
262
|
+
|
|
263
|
+
- The service SHALL accept between two and five payees per split.
|
|
264
|
+
- The service SHALL reject a split whose shares do not add up to the authorized amount.
|
|
265
|
+
|
|
266
|
+
**Expand every abbreviation the first time a document uses it**, in words a new
|
|
267
|
+
reader knows: "service-level objective (SLO)", then "SLO".
|
|
268
|
+
|
|
269
|
+
**Keep review-time wording out of what the archive copies.** "This delta", "this
|
|
270
|
+
feature", "the new endpoint" and "we now" read correctly in review. But
|
|
271
|
+
\`loam archive\` copies requirement bodies, scenarios and contract descriptions
|
|
272
|
+
into living documents, where "this feature" points at a pull request that merged
|
|
273
|
+
long ago. Write what the service does, not what the change does. Prose about the
|
|
274
|
+
change belongs in \`intent.md\`, which stays with the feature.
|
|
275
|
+
|
|
276
|
+
**A feature's vocabulary, decisions and flows travel with it.**
|
|
277
|
+
|
|
278
|
+
- A word the feature brings is \`features/<FEAT>/glossary/<term>.md\`, which the
|
|
279
|
+
archive copies into \`glossary/\`. A term the living glossary already defines is
|
|
280
|
+
edited there instead, because the copy never overwrites
|
|
281
|
+
(\`glossary.term-exists\`).
|
|
282
|
+
- A decision is \`features/<FEAT>/adrs/NNNN-<slug>.md\`. It stays with the
|
|
283
|
+
feature under \`features/archive/\`, and the living documents that link to it go
|
|
284
|
+
on resolving. A decision meant to outlive the change belongs in
|
|
285
|
+
\`architecture/adrs/\` or the service's own \`adrs/\` instead.
|
|
286
|
+
- A flow that keeps a promise across services is
|
|
287
|
+
\`features/<FEAT>/usecases/<name>.likec4\`: a \`dynamic view\` tagged
|
|
288
|
+
\`#cap-<capability>\`, naming a capability the fleet declares, and
|
|
289
|
+
\`#req-<Requirement-ID>\`, naming the promise it keeps. A promise the feature's
|
|
290
|
+
own capability delta adds resolves too. \`usecase.capability-unresolved\` and
|
|
291
|
+
\`usecase.requirement-unresolved\` grade both tags before the archive.
|
|
292
|
+
|
|
293
|
+
Link to all three from the deltas, written relative to the file you write in:
|
|
294
|
+
\`loam archive\` re-points every link into the feature for the move.
|
|
295
|
+
|
|
296
|
+
**Write a \`Covers:\` edge by service name**:
|
|
297
|
+
\`Covers: order-service -> payment-service\`. An edge spelled by its endpoints'
|
|
298
|
+
service names resolves the same before and after the archive. A delta's own
|
|
299
|
+
element id may not, and \`covers.unknown\` at feature scope says when it would not.
|
|
300
|
+
A kinded spelling such as \`order-service -[calls]-> payment-service\` is accepted,
|
|
301
|
+
but the kind is read past rather than compared: it covers every edge from the
|
|
302
|
+
first service to the second, whatever its kind. So write the plain arrow.
|
|
303
|
+
|
|
304
|
+
**Draw a producer outside the fleet as an \`#external\` element**, with the edge
|
|
305
|
+
it publishes on carrying \`metadata { publishes }\`, so that the consumer's
|
|
306
|
+
\`Consumes:\` line has a producer to join to. \`loam instructions loam-spine\`
|
|
307
|
+
("A message produced outside the fleet") has the join, and
|
|
308
|
+
\`loam instructions loam-drawing\` has the drawing.
|
|
309
|
+
`,
|
|
310
|
+
};
|
|
311
|
+
//# sourceMappingURL=authoring.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authoring.js","sourceRoot":"","sources":["../../../../../src/core/agent/workflows/reference/authoring.ts"],"names":[],"mappings":"AAuBA,MAAM,CAAC,MAAM,cAAc,GAAmB;IAC5C,IAAI,EAAE,gBAAgB;IACtB,WAAW,EACT,gJAAgJ;IAClJ,6EAA6E;IAC7E,+CAA+C;IAC/C,YAAY,EAAE,EAAE;IAChB,OAAO,EACL,4QAA4Q;IAC9Q,UAAU,EAAE,kCAAkC;IAC9C,YAAY,EAAE,EAAE;IAChB,KAAK,EAAE;QACL,4BAA4B;QAC5B,6BAA6B;QAC7B,mDAAmD;QACnD,sBAAsB;KACvB;IACD,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqSP;CACA,CAAC","sourcesContent":["/**\n * The `loam-authoring` reference page: the grammars of the documents you write.\n *\n * The architecture spec axis (`arch.spec.md` and its `Covers:` line), the\n * generated Gherkin suite, and the frontmatter/vouch chain that ties a\n * document to the code it was written from.\n *\n * All three are consulted at a moment you can name — while authoring one file\n * — and none of them is needed to form the question. That is the split this\n * page exists to make; ./reference.ts records why it had to be made at all.\n *\n * The first three sections are the three AGENTS.md sections verbatim, in their\n * original order, so a cross-reference elsewhere in the corpus still names the\n * same headings. The fourth, \"Writing for a person\", was written for this page\n * and never stood in AGENTS.md. A large real fleet was migrated into one feature\n * whose every delta validated, and its reviewers still could not follow it: no\n * purpose said what a service did, requirement bodies were a source document\n * pasted whole, and \"this delta\" was copied into the living docs by the\n * archive. No check reads prose, so this is where that lesson lives. Its\n * examples are neutral; nothing from that fleet may enter this repository.\n */\nimport type { CommandContent } from \"../../contract.js\";\n\nexport const LOAM_AUTHORING: CommandContent = {\n name: \"loam-authoring\",\n description:\n \"Reference: the grammars you author against — arch.spec.md, the generated Gherkin suite, frontmatter, and writing a feature a person can follow\",\n // No arguments: one document, printed whole. See ./spine.ts for why the hint\n // is empty rather than a spelled-out \"<none>\".\n argumentHint: \"\",\n purpose:\n \"What each document you author by hand must contain: the architecture requirements axis and its `Covers:` line, how scenarios become an executable suite, the frontmatter fields `loam vouch` stamps, and how to write a feature's documents so a reviewer can follow them.\",\n invocation: \"loam instructions loam-authoring\",\n placeholders: [],\n spine: [\n \"The architecture spec axis\",\n \"The generated Gherkin suite\",\n \"Frontmatter — who vouched for this, and from what\",\n \"Writing for a person\",\n ],\n body: `The grammars you author against: the architecture spec axis, the generated Gherkin suite, frontmatter, and writing a feature a person can follow.\n\n## The architecture spec axis\n\nThe business spec will never mention the transactional outbox — that is\narchitecture. Retries, idempotency, metrics, alerts: real obligations no business\nscenario states, and exactly where generated code cuts corners unless the\nobligations are derived mechanically. They live in \\`arch.spec.md\\` — living and\ndelta, same grammar, same delta algebra, merged by \\`loam archive\\` through the\nsame code path (the two files are separate requirement namespaces).\n\nWhere a business requirement carries \\`Operations:\\`, an arch requirement carries\n\\`Covers:\\` — the model objects its scenarios exercise, comma-separated:\n\n\\`\\`\\`\nCovers: paymentService.db, paymentService -> kafka, alert:payment_5xx, sli:availability\n\\`\\`\\`\n\na C4 element (id, or the service a bound element stands for), an edge\n(\\`source -> target\\`), or a health signal the service's health.yaml declares.\nEvery entry must resolve — \\`covers.unknown\\` (warn) is the typo guard, because a\nmistyped entry silently costs the coverage it was written for.\n\nCoverage is then derived, never trusted, as two warnings: a feature's NEW tagged\nelements and edges want a covering requirement in its arch.spec.md deltas\n(\\`c4.uncovered\\`), and every alert/SLI health.yaml declares wants one in the\nliving arch spec (\\`health.uncovered\\`). None of this gates \\`loam archive\\`;\n\\`--strict\\` is the CI escalation. An absent arch.spec.md is not a finding —\npartial adoption is supported — but write one for any service with real\narchitecture, or its obligations ship unchecked.\n\n**Effective configuration and dependency semantics live here too, by\nconvention.** Facts about the service that no artifact structurally holds —\nthe value a deploy chart actually sets, the retry budget a client library\nhardcodes (\"retries: -1 is unbounded\"), the delivery or idempotency guarantee\na driver decides — are ARCH REQUIREMENTS: prose with a \\`Covers:\\` line naming\nthe element or edge whose behaviour the fact decides. loam will never verify\nthe values; naming the home is the point. A service whose timeout comes from\nan env var in a chart in another repository is otherwise described by no file\nin this repo, and two adoptions will file the same fact two different ways.\n\n**Test levels, mapped once.** A business scenario is an acceptance test. An arch\nscenario is an integration/ops test — the outbox relay under a dead broker, the\nretry that stays idempotent, the alert rule that actually fires. \\`api.exposes\\`\nis a contract test. Unit tests sit below spec granularity and are your TDD\nconcern, not the specs'.\n\n## The generated Gherkin suite\n\nScenarios are the acceptance criteria, and \\`loam gherkin\\` makes them\nexecutable: real \\`.feature\\` files, written into the SERVICE'S repo — the one\nloam command that writes there, because tests live with the code they gate.\nOutput lands in \\`<gherkinDir>/loam/\\` (\\`gherkinDir\\` is an optional loam.json\nfact, default \\`features\\`), and that \\`loam/\\` subdirectory is loam's own\nderived space — and a committed one: an emission lands through the same lock\nand journal the docs repo's writers use, as \\`loam/.loam-lock\\` and\n\\`loam/.loam-commit\\` dotfiles that exist only while a run is in flight (or\nafter a kill, where the journal is what lets the next run finish the job).\nRegeneration rewrites its scope and deletes its orphans, so\nnever hand-edit inside it — step definitions and hand-written features belong\noutside it, and loam never touches a byte outside \\`loam/\\`.\n\n- \\`loam gherkin FEAT-101\\` — the feature's ADDED/MODIFIED requirements for this\n service, both spec axes. Files carry \\`@FEAT-101\\`; arch-axis files add\n \\`@architecture\\` and are named \\`arch--<slug>.feature\\` — their scenarios are\n integration/ops tests, not acceptance tests.\n- \\`loam gherkin --service <id>\\` (no feature) — the full living suite from\n spec.md + arch.spec.md: the regression skeleton a legacy service gets at\n adoption.\n\nOne file per requirement (\\`Feature:\\` is the requirement name). Bullet lines\nopening with Given/When/Then/And/But — the \\`- **WHEN** ...\\` convention\nincluded — become steps; every other body line is kept as scenario\ndescription. A valid Markdown table AT THE MARGIN becomes the \\`Examples:\\` of\na \\`Scenario Outline\\`; a malformed table stays in the description and is\nreported, because it will run once rather than once per row.\n\nA step takes an ARGUMENT by carrying it INDENTED underneath: an indented table\nbecomes that step's data table (the rows an outbox or a DB table must hold after\nthe pass), a fenced block becomes its docstring, indentation intact (the request\npayload). Indented under a step means this step's rows; at the margin means the\nscenario's cases. A block no step precedes stays description and is reported as\n\\`strandedBlocks\\` — the document reads, and the TEST lost its argument. Each scenario is\ntagged \\`@loam-digest-<16hex>\\`: the same body\nhash \\`loam verify\\` folds into its claim ids, riding into cucumber's JSON\nreport as a tag, so the suite, the claim and the report cannot quietly\ndisagree about what a scenario says. \\`loam validate\n--service <id>\\`, run in the service repo, grades the suite by those digests\n(\\`gherkin.missing\\` / \\`gherkin.stale\\` / \\`gherkin.orphaned\\`, all warn) — the\nfix is always regeneration, never editing a generated file.\n\nThe flow, closed end to end: \\`loam gherkin FEAT-101\\` → \\`loam steps --service\n<id>\\` (the phrase inventory: how many step definitions this suite needs, one\nper phrase row, and which phrases differ only by an article or a trailing\nclause) → write step definitions (outside \\`loam/\\`) → run the suite with a JSON report\n(\\`cucumber-js --format json:report.json\\`) → implement until green →\n\\`loam verify FEAT-101 --service <id> --results report.json [--contract-results contract.json] [--record rest.json]\\`,\nrun in that same service repo. The digest\ntags ride through the runner into the report, so the \\`scenario.tested\\` claims\nare answered mechanically from the passing report rather than anybody's word.\nThis proves which digest-matched report bytes loam accepted; it does not prove\nthe report was produced by executing the attested commit. See\n\\`loam instructions loam-done-check\\` for what \\`--record\\` still covers.\n\n## Frontmatter — who vouched for this, and from what\n\nEvery markdown artifact opens with a YAML block:\n\n\\`\\`\\`yaml\n---\nservice: payment-service # or feature: FEAT-101\nstatus: verified # services: draft -> verified\n # features: proposed -> in_progress -> built -> done\nowner: payments-team\nlast_verified: 2026-07-31 # written by \\`loam vouch\\` — do not hand-edit\nsources: # files/directories in the SERVICE'S repo this was written from — no globs\n - src/main/java/com/shop/payment/\nsources_digest: 6f1c0a… # written by \\`loam vouch\\` — do not hand-edit\ncontent_digest: 9b2f41… # written by \\`loam vouch\\` — do not hand-edit\nsources_files: | # written by \\`loam vouch\\` — do not hand-edit\n 9b2f41… src/main/java/com/shop/payment/Api.java\nvouch_scope: sampled 2/9 seed=1a2b3c4d5e6f7089 # only when the vouch read a SAMPLE\n---\n\\`\\`\\`\n\n\\`sources\\` matters more than it looks. Everything else loam checks is internal\nconsistency — and a corpus can agree with itself perfectly while describing nothing\nthat exists. \\`sources\\` is the one thing tying a document to code: \\`loam validate\\`,\nrun inside that service's repository, checks every listed path is still there.\nEntries are literal files and directories only — a directory covers everything\nbeneath it. Glob patterns are refused loudly (\\`loam vouch\\` will not stamp them,\n\\`loam validate\\` errors on them): a pattern dialect nobody can be sure of digests\na different file set than intended, corrupting the staleness signal silently.\n\n\\`sources_digest\\` is what makes that tie say something over time: a hash of the\nCONTENT of those files, taken when a human last vouched for the document. Every\nlater \\`loam validate\\` re-computes it, so it can tell a document nobody has checked\n(\\`sources.unvouched\\`) from one that still matches the code (\\`sources.current\\`) from\none the code has moved out from under (\\`sources.stale\\`). On \\`sources.stale\\` or\n\\`content.stale\\`, \\`loam vouch --pack --service <id>\\` (read-only, stamps nothing)\nprints exactly what to re-read before the human re-vouches — the body's diff since\nthe last vouch, the source files that moved, and the sections already covered.\n\n\\`content_digest\\` is the same promise about the document itself: a hash of the\nbody below the frontmatter, stamped by the same vouch. It closes the other half of\nthe forgery — editing a spec after it was vouched used to leave \\`status: verified\\`\nstanding over words nobody read. \\`loam validate\\` recomputes it wherever it can\nread the doc (no service repo needed, so it fires from the docs repo too) and\nreports \\`content.stale\\` (warn): only a person can say whether verified still\nholds of the new words. The fleet readouts say the same: \\`loam list\\` shows\n\\`vouched (stale)\\` and owes the row a re-vouch, and \\`loam status\\` emits\n\\`next.revouch\\` — a step for a person, never for you.\n\n\\`vouch_scope\\` appears only when the person vouched after reading a SAMPLE of the\ndocument — \\`loam vouch --sample <n>\\`, whose whole purpose is that a partial read\nis recorded as a partial read. Its value is one flat string,\n\\`sampled <k>/<n> seed=<16 hex>\\`: k sections read of n, and the seed those k were\nchosen with. The seed is \\`sha256(<service> NUL <content_digest> NUL <sources_digest>)\\`\ntruncated to 16 hex characters, and the sections are ranked by\n\\`sha256(<seed> NUL <index> NUL <heading>)\\` with the lowest k taken, over every H2\nand H3 heading of the body outside code fences — so anybody holding the document\ncan recompute exactly which sections that person was shown, and an agent cannot\nsteer the pick without rewriting the document (which changes the seed and voids the\nstamp). \\`status\\` stays \\`verified\\` and the maturity rung stays \\`vouched\\`: the scope\nqualifies that claim, it is not a fourth status. \\`loam validate\\` reports\n\\`sources.sampled-vouch\\` (warn) while it is there, \\`loam list\\` shows\n\\`vouched (sampled)\\`, and a later FULL \\`loam vouch\\` deletes the field. Never write\nor delete it by hand: removing it turns a partial read into a full one on every\nsurface at once, which is the one forgery this field exists to make impossible.\n\nWrite \\`sources\\` for anything you author from reading code, and leave \\`status: draft\\`\nuntil a human has read it. Promoting draft to verified is their call, not yours, and\nit has its own command — \\`loam vouch --service <id>\\`, run inside that service's repo,\nwhich stamps the status, the date, the identity (\\`vouched_by\\`, from git), both digests\nand the per-file index\n(\\`sources_files\\`, which is what lets a later \\`sources.stale\\` name the paths that\nmoved) together — into the living spec.md\nand, when the service has one, arch.spec.md, in one all-or-nothing run: a file whose\nsources cannot be verified refuses the whole vouch. Never write those six fields by\nhand: a status with no digest behind it is a claim with nothing behind it. If the\ndocument changed under vouch between the read and the write, it refuses with\n\\`vouch-raced\\` and stamps nothing — re-read and re-run.\n\n**\\`loam vouch\\` is not yours to run**, and it is built so that it cannot be. It is\nthe one command whose output is a claim about a HUMAN act — everything else loam\nchecks is internal consistency, which fluent prose satisfies on its own — so it\nrefuses \\`vouch-unattended\\` when stdin is not a terminal (and in \\`--json\\` mode,\nwhere a question cannot be asked), answers \\`vouch-declined\\` when the person says\nno, and refuses \\`vouch-unattributable\\` when git can name nobody, because a stamp\nwith no \\`vouched_by\\` behind it records only that the word was written. \\`--yes\\`\nexists for a person's own scripted run; typing it on someone's behalf is\nwriting their name. The generated command and skill files pre-approve loam's\nread-only and authoring verbs one by one and deliberately not this one: when\nthe work is done, hand back and say a vouch is owed.\n\n## Writing for a person\n\nA feature is read by a reviewer before anyone builds it, and its requirements\nare read for years after \\`loam archive\\` copies them into the living docs. loam\ngrades the joins and never the prose, so nothing in this section is checked: a\ndelta can validate clean and still be one nobody can follow.\n\n**intent.md** opens with the problem in business terms — \\`## Why\\` and\n\\`## Scope\\`, the two sections the archive gate reads — and then carries the three\nthings a reviewer looks for first:\n\n- \\`## How to read this feature\\`: two or three sentences saying which services\n change, which document to open first, and which picture shows the change (the\n delta's own view, or a flow under the feature's \\`usecases/\\`).\n- a business-requirement coverage table, one row per business requirement the\n feature was asked to meet, naming what keeps it:\n\n | Business requirement | Kept by | Where |\n |---|---|---|\n | A customer can split one payment between two cards | PAY-SPLIT-1 | payment-split-service spec.md |\n | Every payee gets a receipt | uc_split_receipt | usecases/split-receipt.likec4 |\n\n- \\`## Open questions\\` (the scaffold already writes the heading) as a table, so\n that a person can answer each question and a reader can see what each blocks:\n\n | ID | Question | Blocks | Owner | Current default |\n |---|---|---|---|---|\n | Q1 | Is a split refunded per card or as a whole? | PAY-SPLIT-3 | payments-team | per card |\n\n The current default is what gets built if nobody answers, so write one for\n every question.\n\n**Each spec delta opens with a plain-language \\`## Purpose\\`**: what the service\ndoes in this change, written for someone who has never opened its code. Where\nthe delta CREATES the living document — a new service's spec.md, a first\narch.spec.md, a new capability — \\`loam archive\\` copies that section into the\nnew document as its narrative. Where the living document already exists, the\nsection stays with the archived delta, and the archive plan says so on that\nfile's line; if the service's own narrative should change, edit the living\ndocument in the same change.\n\n**Write a long requirement body as a lead and bullets.** A new requirement\nstates one behaviour. A requirement carried over from another source often\narrives as one paragraph of SHALL sentences. Keep every sentence, but open with\none line that says what the requirement is for, and give each SHALL sentence a\nbullet of its own:\n\n ### Requirement: Split a payment\n Requirement-ID: PAY-SPLIT-1\n\n A payment can be divided between several payees.\n\n - The service SHALL accept between two and five payees per split.\n - The service SHALL reject a split whose shares do not add up to the authorized amount.\n\n**Expand every abbreviation the first time a document uses it**, in words a new\nreader knows: \"service-level objective (SLO)\", then \"SLO\".\n\n**Keep review-time wording out of what the archive copies.** \"This delta\", \"this\nfeature\", \"the new endpoint\" and \"we now\" read correctly in review. But\n\\`loam archive\\` copies requirement bodies, scenarios and contract descriptions\ninto living documents, where \"this feature\" points at a pull request that merged\nlong ago. Write what the service does, not what the change does. Prose about the\nchange belongs in \\`intent.md\\`, which stays with the feature.\n\n**A feature's vocabulary, decisions and flows travel with it.**\n\n- A word the feature brings is \\`features/<FEAT>/glossary/<term>.md\\`, which the\n archive copies into \\`glossary/\\`. A term the living glossary already defines is\n edited there instead, because the copy never overwrites\n (\\`glossary.term-exists\\`).\n- A decision is \\`features/<FEAT>/adrs/NNNN-<slug>.md\\`. It stays with the\n feature under \\`features/archive/\\`, and the living documents that link to it go\n on resolving. A decision meant to outlive the change belongs in\n \\`architecture/adrs/\\` or the service's own \\`adrs/\\` instead.\n- A flow that keeps a promise across services is\n \\`features/<FEAT>/usecases/<name>.likec4\\`: a \\`dynamic view\\` tagged\n \\`#cap-<capability>\\`, naming a capability the fleet declares, and\n \\`#req-<Requirement-ID>\\`, naming the promise it keeps. A promise the feature's\n own capability delta adds resolves too. \\`usecase.capability-unresolved\\` and\n \\`usecase.requirement-unresolved\\` grade both tags before the archive.\n\nLink to all three from the deltas, written relative to the file you write in:\n\\`loam archive\\` re-points every link into the feature for the move.\n\n**Write a \\`Covers:\\` edge by service name**:\n\\`Covers: order-service -> payment-service\\`. An edge spelled by its endpoints'\nservice names resolves the same before and after the archive. A delta's own\nelement id may not, and \\`covers.unknown\\` at feature scope says when it would not.\nA kinded spelling such as \\`order-service -[calls]-> payment-service\\` is accepted,\nbut the kind is read past rather than compared: it covers every edge from the\nfirst service to the second, whatever its kind. So write the plain arrow.\n\n**Draw a producer outside the fleet as an \\`#external\\` element**, with the edge\nit publishes on carrying \\`metadata { publishes }\\`, so that the consumer's\n\\`Consumes:\\` line has a producer to join to. \\`loam instructions loam-spine\\`\n(\"A message produced outside the fleet\") has the join, and\n\\`loam instructions loam-drawing\\` has the drawing.\n`,\n};\n"]}
|