@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,324 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The curated MCP tool table: which loam commands an MCP client can reach,
|
|
3
|
+
* and how a JSON argument object becomes an argv the CLI already trusts.
|
|
4
|
+
*
|
|
5
|
+
* This base table is read-only. Opt-in writers live in `./author-tools.ts`;
|
|
6
|
+
* vouch and a committing archive remain absent: an MCP caller is definitionally
|
|
7
|
+
* an agent, `loam vouch` is a HUMAN act (the CLI refuses unattended runs with
|
|
8
|
+
* vouch-unattended), and exposing it here would rebuild the hole the generated
|
|
9
|
+
* skill files' allowlist was narrowed to close. verify is excluded with them: its read form and its
|
|
10
|
+
* attesting `--record`/`--results`/`--contract-results` form are one command,
|
|
11
|
+
* and a facade that exposes "only the read half" of a writer is one
|
|
12
|
+
* flag-mapping bug away from exposing the writer.
|
|
13
|
+
*
|
|
14
|
+
* The inclusion of the two commands that read no CONFIG — `explain` and
|
|
15
|
+
* `instructions` — is equally deliberate, and is recorded here because the
|
|
16
|
+
* gap is otherwise re-derivable as an oversight: an agent meets both BEFORE
|
|
17
|
+
* the repository is wired (every generated skill's first line is `loam
|
|
18
|
+
* instructions <workflow>`, and `loam explain <code>` answers a code from a
|
|
19
|
+
* run that has not happened yet), so an MCP-only host that could not reach
|
|
20
|
+
* them could not fetch the protocol its own generated skill points at.
|
|
21
|
+
*
|
|
22
|
+
* `adopt` is here for the same reason one step later: it writes nothing — it
|
|
23
|
+
* emits the brief an agent then writes a baseline from — and the loam-adopt
|
|
24
|
+
* protocol an MCP-only host fetches through `loam_instructions` opens by
|
|
25
|
+
* running it. Without the tool that host could read the protocol and never
|
|
26
|
+
* receive the brief the protocol is about.
|
|
27
|
+
*
|
|
28
|
+
* Every table entry mirrors a real registration in `src/commands/` — same
|
|
29
|
+
* positionals, same flags, same spellings — so the contract an MCP client
|
|
30
|
+
* sees is the CLI contract, not a second one. `--json` is appended by
|
|
31
|
+
* `toArgv` unconditionally: the tool result IS the machine envelope.
|
|
32
|
+
*/
|
|
33
|
+
import { TERMS } from "../explain/terms.js";
|
|
34
|
+
/**
|
|
35
|
+
* The concept-term names, from the registry that owns them — `loam_explain`'s
|
|
36
|
+
* schema description must not be a hand copy that silently trails TERMS.
|
|
37
|
+
*/
|
|
38
|
+
const TERM_LIST = TERMS.map(({ term }) => term).join(", ");
|
|
39
|
+
const SERVICE_FLAG = {
|
|
40
|
+
property: "service",
|
|
41
|
+
flag: "--service",
|
|
42
|
+
kind: "string",
|
|
43
|
+
description: "service id (defaults to the one loam.json configures)",
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* The tool annotations EVERY entry in this table carries — one shared literal,
|
|
47
|
+
* because the table is read-only by construction and a per-tool copy is a
|
|
48
|
+
* place for one of them to drift into claiming something else.
|
|
49
|
+
*
|
|
50
|
+
* `readOnlyHint` is the whole point: without it a host has no machine signal
|
|
51
|
+
* that `loam_validate` or `loam_context` is safe, so a call that only reads
|
|
52
|
+
* files falls into the same approval prompt as a mutating tool. Read-only
|
|
53
|
+
* hints are what let a host auto-approve, and the reason the writers are
|
|
54
|
+
* excluded from the table above is precisely so this hint can be true of
|
|
55
|
+
* everything left. `openWorldHint: false` states the other half a host acts
|
|
56
|
+
* on: loam reaches no network and no service — it reads the files in the
|
|
57
|
+
* directory the server started in, and nothing else.
|
|
58
|
+
*
|
|
59
|
+
* `idempotentHint` and `destructiveHint` are deliberately ABSENT rather than
|
|
60
|
+
* spelled `true`/`false`: MCP defines both as meaningful only when
|
|
61
|
+
* `readOnlyHint` is false, so shipping them would be noise a reviewer has to
|
|
62
|
+
* justify before deciding they mean nothing here.
|
|
63
|
+
*
|
|
64
|
+
* `outputSchema` lives in `./protocol.ts`, beside `toolReply`: the declaration
|
|
65
|
+
* and the fallback structured envelope have to change together or a client is
|
|
66
|
+
* promised structured content one branch can omit.
|
|
67
|
+
*/
|
|
68
|
+
export const READ_ONLY_ANNOTATIONS = { readOnlyHint: true, openWorldHint: false };
|
|
69
|
+
/**
|
|
70
|
+
* The `loam_` prefix on every name: multi-server MCP hosts flatten tool names
|
|
71
|
+
* into one namespace, and a bare `validate` collides with anybody else's.
|
|
72
|
+
* Each description names the CLI command it mirrors, so the equivalence is
|
|
73
|
+
* stated where the client reads it.
|
|
74
|
+
*/
|
|
75
|
+
export const MCP_TOOLS = [
|
|
76
|
+
{
|
|
77
|
+
name: "loam_validate",
|
|
78
|
+
command: "validate",
|
|
79
|
+
description: "Validate a service (C4 + requirement coverage), a feature (delta + coverage), or the whole fleet. " +
|
|
80
|
+
"CLI equivalent: loam validate [target] [--service <id>] [--feature <id>] [--all] [--strict] [--errors-only] --json",
|
|
81
|
+
positionals: [
|
|
82
|
+
{
|
|
83
|
+
property: "target",
|
|
84
|
+
required: false,
|
|
85
|
+
variadic: false,
|
|
86
|
+
description: "service or feature id (a feature wins when both match; service/feature force the reading)",
|
|
87
|
+
},
|
|
88
|
+
],
|
|
89
|
+
flags: [
|
|
90
|
+
{ ...SERVICE_FLAG, description: "service to validate (defaults to the configured service)" },
|
|
91
|
+
{ property: "feature", flag: "--feature", kind: "string", description: "validate a feature delta instead of a service" },
|
|
92
|
+
{ property: "all", flag: "--all", kind: "boolean", description: "validate every service and every active feature" },
|
|
93
|
+
{ property: "strict", flag: "--strict", kind: "boolean", description: "exit 1 on any warning too; the payload does not change" },
|
|
94
|
+
{ property: "errorsOnly", flag: "--errors-only", kind: "boolean", description: "print only errors and warnings; the payload does not change" },
|
|
95
|
+
],
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
name: "loam_status",
|
|
99
|
+
command: "status",
|
|
100
|
+
description: "Where the work stands and what to do next, derived from the files. " +
|
|
101
|
+
"CLI equivalent: loam status [feature] [--service <id>] --json",
|
|
102
|
+
positionals: [
|
|
103
|
+
{ property: "feature", required: false, variadic: false, description: "feature id or directory name; omit for the whole repository" },
|
|
104
|
+
],
|
|
105
|
+
flags: [{ ...SERVICE_FLAG, description: "narrow the per-service view to one service" }],
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
name: "loam_list",
|
|
109
|
+
command: "list",
|
|
110
|
+
description: "List the services and features in the docs repo. " +
|
|
111
|
+
"CLI equivalent: loam list [section] [name] [--archived] [--needs-work] [--review-order] [--subsystem <name>] [--owners <path>] --json",
|
|
112
|
+
positionals: [
|
|
113
|
+
{ property: "section", required: false, variadic: false, description: "services | features | capabilities | glossary | suites (default: services + features)" },
|
|
114
|
+
{ property: "name", required: false, variadic: false, description: "suites only: the one suite to show" },
|
|
115
|
+
],
|
|
116
|
+
flags: [
|
|
117
|
+
{ property: "archived", flag: "--archived", kind: "boolean", description: "include archived features" },
|
|
118
|
+
{ property: "needsWork", flag: "--needs-work", kind: "boolean", description: "services only: every service below vouched, with what it is missing" },
|
|
119
|
+
{ property: "reviewOrder", flag: "--review-order", kind: "boolean", description: "with needsWork: order the worklist by fan-in, highest blast radius first" },
|
|
120
|
+
{ property: "subsystem", flag: "--subsystem", kind: "string", description: "services only: limit the listing to services filed under this subsystem, at any depth ('unfiled' selects the ones filed under none)" },
|
|
121
|
+
{ property: "owners", flag: "--owners", kind: "string", description: "services only: group the listing by owning team from this CODEOWNERS file (directory-pattern rules only; unsupported rules are listed as skipped, never guessed)" },
|
|
122
|
+
],
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
name: "loam_show",
|
|
126
|
+
command: "show",
|
|
127
|
+
description: "Everything loam knows about a service or a feature. " +
|
|
128
|
+
"CLI equivalent: loam show <target> [--type service|feature] --json",
|
|
129
|
+
positionals: [
|
|
130
|
+
{ property: "target", required: true, variadic: false, description: "service id or feature id" },
|
|
131
|
+
],
|
|
132
|
+
flags: [
|
|
133
|
+
{ property: "type", flag: "--type", kind: "string", description: "force the reading: service | feature" },
|
|
134
|
+
],
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
name: "loam_delta",
|
|
138
|
+
command: "delta",
|
|
139
|
+
description: "Project a feature onto a service: why + requirement delta + C4 changes. " +
|
|
140
|
+
"CLI equivalent: loam delta <featureId> [--service <id>] --json",
|
|
141
|
+
positionals: [
|
|
142
|
+
{ property: "featureId", required: true, variadic: false, description: "feature id, e.g. FEAT-101" },
|
|
143
|
+
],
|
|
144
|
+
flags: [{ ...SERVICE_FLAG, description: "service to project onto (defaults to the configured service)" }],
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
name: "loam_tasks",
|
|
148
|
+
command: "tasks",
|
|
149
|
+
description: "What is still open on a feature, at which step, and what closes each unit — a read-only projection that writes nothing. " +
|
|
150
|
+
"CLI equivalent: loam tasks <featureId> [--service <id>] [--next] --json",
|
|
151
|
+
positionals: [
|
|
152
|
+
{ property: "featureId", required: true, variadic: false, description: "feature id, e.g. FEAT-101" },
|
|
153
|
+
],
|
|
154
|
+
flags: [
|
|
155
|
+
{ ...SERVICE_FLAG, description: "narrow the packet to the units one service owns (a lens: no binding needed)" },
|
|
156
|
+
{ property: "next", flag: "--next", kind: "boolean", description: "the frontier head alone — the single leaf to hand to a worker" },
|
|
157
|
+
],
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
name: "loam_explore",
|
|
161
|
+
command: "explore",
|
|
162
|
+
description: "Read the fleet around a change nobody has written down yet — writes nothing. " +
|
|
163
|
+
"CLI equivalent: loam explore [service...] [--op <id>] [--capability <id>] [--as <FEAT>] --json",
|
|
164
|
+
positionals: [
|
|
165
|
+
{ property: "services", required: false, variadic: true, description: "service ids the change starts from" },
|
|
166
|
+
],
|
|
167
|
+
flags: [
|
|
168
|
+
{ property: "op", flag: "--op", kind: "strings", description: "seed from an operation instead of a service; repeatable" },
|
|
169
|
+
{ property: "capability", flag: "--capability", kind: "strings", description: "seed from a declared capability's realizing services; repeatable" },
|
|
170
|
+
{ property: "as", flag: "--as", kind: "string", description: "feature id for the suggested command line" },
|
|
171
|
+
],
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
name: "loam_dependencies",
|
|
175
|
+
command: "dependencies",
|
|
176
|
+
description: "Dependencies and conflicts derived from active feature artifacts. " +
|
|
177
|
+
"CLI equivalent: loam dependencies [featureId] --json",
|
|
178
|
+
positionals: [
|
|
179
|
+
{ property: "featureId", required: false, variadic: false, description: "active feature id; omit for the whole in-flight graph" },
|
|
180
|
+
],
|
|
181
|
+
flags: [],
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
name: "loam_diff",
|
|
185
|
+
command: "diff",
|
|
186
|
+
description: "Semantic diff of the living docs against a base git ref of the docs repo — removals graded against their current consumers; read-only. " +
|
|
187
|
+
"CLI equivalent: loam diff --base <ref> --json",
|
|
188
|
+
positionals: [],
|
|
189
|
+
flags: [
|
|
190
|
+
{
|
|
191
|
+
property: "base",
|
|
192
|
+
flag: "--base",
|
|
193
|
+
kind: "string",
|
|
194
|
+
required: true,
|
|
195
|
+
description: "base git ref of the docs repo (e.g. main, origin/main, a commit sha)",
|
|
196
|
+
},
|
|
197
|
+
],
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
name: "loam_doctor",
|
|
201
|
+
command: "doctor",
|
|
202
|
+
description: "Diagnose local loam configuration and docs-repo accessibility without writing. " +
|
|
203
|
+
"CLI equivalent: loam doctor --json",
|
|
204
|
+
positionals: [],
|
|
205
|
+
flags: [],
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
name: "loam_context",
|
|
209
|
+
command: "context",
|
|
210
|
+
description: "Assemble one service's whole docs slice as one deterministic briefing. " +
|
|
211
|
+
"CLI equivalent: loam context <service> [--feature <FEAT>] --json",
|
|
212
|
+
positionals: [
|
|
213
|
+
{ property: "service", required: true, variadic: false, description: "service id, e.g. payment-service" },
|
|
214
|
+
],
|
|
215
|
+
flags: [
|
|
216
|
+
{ property: "feature", flag: "--feature", kind: "string", description: "narrow the in-flight section to this one feature" },
|
|
217
|
+
],
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
name: "loam_adopt",
|
|
221
|
+
command: "adopt",
|
|
222
|
+
description: "Brief an agent to write one service's baseline docs from its code, and say what will be checked — writes nothing. " +
|
|
223
|
+
"CLI equivalent: loam adopt [--service <id>] [--subsystem <name>] [--targets] --json",
|
|
224
|
+
positionals: [],
|
|
225
|
+
flags: [
|
|
226
|
+
{ ...SERVICE_FLAG, description: "service to adopt (defaults to the configured service)" },
|
|
227
|
+
{ property: "subsystem", flag: "--subsystem", kind: "string", description: "brief a NEW service's baseline into this subsystem instead of the services/ root" },
|
|
228
|
+
{ property: "targets", flag: "--targets", kind: "boolean", description: "only what varies by service; a `full` field names the run that carries the walk, the checks and the unchecked list" },
|
|
229
|
+
],
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
name: "loam_gate",
|
|
233
|
+
command: "gate",
|
|
234
|
+
description: "Can this service deploy? A read-only query over recorded evidence — advisory by default. " +
|
|
235
|
+
"CLI equivalent: loam gate [--service <id>] [--since <ref>] [--strict] --json",
|
|
236
|
+
positionals: [],
|
|
237
|
+
flags: [
|
|
238
|
+
{ ...SERVICE_FLAG, description: "the service being deployed (defaults to the configured service)" },
|
|
239
|
+
{ property: "since", flag: "--since", kind: "string", description: "also grade features archived after this docs-repo git ref; without it only in-flight features are read" },
|
|
240
|
+
{ property: "strict", flag: "--strict", kind: "boolean", description: "exit 1 on any warning too; the payload does not change" },
|
|
241
|
+
],
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
name: "loam_steps",
|
|
245
|
+
command: "steps",
|
|
246
|
+
description: "Inventory the step phrases of a service's scenarios — how many step definitions its suite needs. " +
|
|
247
|
+
"CLI equivalent: loam steps [--service <id>] [--duplicates] --json",
|
|
248
|
+
positionals: [],
|
|
249
|
+
flags: [
|
|
250
|
+
{ ...SERVICE_FLAG, description: "service to inventory (defaults to the configured service)" },
|
|
251
|
+
{
|
|
252
|
+
property: "duplicates",
|
|
253
|
+
flag: "--duplicates",
|
|
254
|
+
kind: "boolean",
|
|
255
|
+
description: "list only the near-duplicate groups — phrases that differ by an article or a trailing clause",
|
|
256
|
+
},
|
|
257
|
+
],
|
|
258
|
+
},
|
|
259
|
+
{
|
|
260
|
+
name: "loam_explain",
|
|
261
|
+
command: "explain",
|
|
262
|
+
description: "Explain a finding code, a refusal code, or a loam concept term, version-matched to this binary; reads no config and no docs repo. " +
|
|
263
|
+
"CLI equivalent: loam explain [subject] --json",
|
|
264
|
+
positionals: [
|
|
265
|
+
{
|
|
266
|
+
property: "subject",
|
|
267
|
+
required: false,
|
|
268
|
+
variadic: false,
|
|
269
|
+
description: `finding code (spine.op-undefined), refusal code (docs-busy), or concept term (${TERM_LIST}); omit to list the terms`,
|
|
270
|
+
},
|
|
271
|
+
],
|
|
272
|
+
flags: [],
|
|
273
|
+
},
|
|
274
|
+
{
|
|
275
|
+
name: "loam_instructions",
|
|
276
|
+
command: "instructions",
|
|
277
|
+
description: "Print a workflow, support protocol or reference page, version-matched to this binary; reads no config and no docs repo, so it answers " +
|
|
278
|
+
"before the repository is wired. Ask for loam-check DELIBERATELY: it is by far the largest protocol " +
|
|
279
|
+
"(almost all of what it prints is its per-code fix tables), and noFixTables true returns the narrowed page " +
|
|
280
|
+
"— every paragraph that introduces a table, none of the rows — after which loam_explain answers any one code " +
|
|
281
|
+
"a run reports, on its own. " +
|
|
282
|
+
"CLI equivalent: loam instructions [workflow] [args...] [--no-fix-tables] --json",
|
|
283
|
+
positionals: [
|
|
284
|
+
{
|
|
285
|
+
property: "workflow",
|
|
286
|
+
required: false,
|
|
287
|
+
variadic: false,
|
|
288
|
+
description: "workflow, support or reference name (loam-adopt, loam-report, loam-codes, …); omit to list them",
|
|
289
|
+
},
|
|
290
|
+
{
|
|
291
|
+
property: "args",
|
|
292
|
+
required: false,
|
|
293
|
+
variadic: true,
|
|
294
|
+
description: "values substituted for the protocol's $1, $2, … placeholders",
|
|
295
|
+
},
|
|
296
|
+
],
|
|
297
|
+
flags: [
|
|
298
|
+
{
|
|
299
|
+
// `noFixTables`, not `fixTables`, and the mismatch with commander's own
|
|
300
|
+
// attribute name (`fixTables`, because `--no-` negates) is the point:
|
|
301
|
+
// `toArgv` spells a true boolean as its flag string, so a property named
|
|
302
|
+
// for the option's ATTRIBUTE would make `{fixTables: true}` emit
|
|
303
|
+
// `--no-fix-tables` and turn the tables off. The JSON property is named
|
|
304
|
+
// for what setting it true DOES.
|
|
305
|
+
property: "noFixTables",
|
|
306
|
+
flag: "--no-fix-tables",
|
|
307
|
+
kind: "boolean",
|
|
308
|
+
description: "drop the per-code fix tables; loam_explain answers any code a run reports",
|
|
309
|
+
},
|
|
310
|
+
],
|
|
311
|
+
},
|
|
312
|
+
];
|
|
313
|
+
export function toolByName(name, tools = MCP_TOOLS) {
|
|
314
|
+
return tools.find((tool) => tool.name === name);
|
|
315
|
+
}
|
|
316
|
+
// How a tool call's JSON arguments become an argv — including the refusal of
|
|
317
|
+
// any string a shell-less argv would still read as a flag — lives in
|
|
318
|
+
// `./argv.ts`: the table above says WHAT the tools are, that module says how
|
|
319
|
+
// a call crosses into the CLI's own parsing. The inputSchema each tool is
|
|
320
|
+
// advertised with (`toInputSchema`) lives there too: it DECLARES the argument
|
|
321
|
+
// contract `toArgv` ENFORCES — the closed object, the required set, the order
|
|
322
|
+
// the positionals are read in — and the two halves change together or a
|
|
323
|
+
// client validates against one rule and is refused by another.
|
|
324
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/core/mcp/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAE5C;;;GAGG;AACH,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAsC3D,MAAM,YAAY,GAAG;IACnB,QAAQ,EAAE,SAAS;IACnB,IAAI,EAAE,WAAW;IACjB,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,uDAAuD;CAC5D,CAAC;AAEX;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAW,CAAC;AAE3F;;;;;GAKG;AACH,MAAM,CAAC,MAAM,SAAS,GAAuB;IAC3C;QACE,IAAI,EAAE,eAAe;QACrB,OAAO,EAAE,UAAU;QACnB,WAAW,EACT,oGAAoG;YACpG,oHAAoH;QACtH,WAAW,EAAE;YACX;gBACE,QAAQ,EAAE,QAAQ;gBAClB,QAAQ,EAAE,KAAK;gBACf,QAAQ,EAAE,KAAK;gBACf,WAAW,EAAE,2FAA2F;aACzG;SACF;QACD,KAAK,EAAE;YACL,EAAE,GAAG,YAAY,EAAE,WAAW,EAAE,0DAA0D,EAAE;YAC5F,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,+CAA+C,EAAE;YACxH,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,iDAAiD,EAAE;YACnH,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,wDAAwD,EAAE;YAChI,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,6DAA6D,EAAE;SAC/I;KACF;IACD;QACE,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,QAAQ;QACjB,WAAW,EACT,qEAAqE;YACrE,+DAA+D;QACjE,WAAW,EAAE;YACX,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,6DAA6D,EAAE;SACtI;QACD,KAAK,EAAE,CAAC,EAAE,GAAG,YAAY,EAAE,WAAW,EAAE,4CAA4C,EAAE,CAAC;KACxF;IACD;QACE,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,MAAM;QACf,WAAW,EACT,mDAAmD;YACnD,uIAAuI;QACzI,WAAW,EAAE;YACX,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,uFAAuF,EAAE;YAC/J,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,oCAAoC,EAAE;SAC1G;QACD,KAAK,EAAE;YACL,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,2BAA2B,EAAE;YACvG,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,qEAAqE,EAAE;YACpJ,EAAE,QAAQ,EAAE,aAAa,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,0EAA0E,EAAE;YAC7J,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,qIAAqI,EAAE;YAClN,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kKAAkK,EAAE;SAC1O;KACF;IACD;QACE,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,MAAM;QACf,WAAW,EACT,sDAAsD;YACtD,oEAAoE;QACtE,WAAW,EAAE;YACX,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,0BAA0B,EAAE;SACjG;QACD,KAAK,EAAE;YACL,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sCAAsC,EAAE;SAC1G;KACF;IACD;QACE,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,OAAO;QAChB,WAAW,EACT,0EAA0E;YAC1E,gEAAgE;QAClE,WAAW,EAAE;YACX,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,2BAA2B,EAAE;SACrG;QACD,KAAK,EAAE,CAAC,EAAE,GAAG,YAAY,EAAE,WAAW,EAAE,8DAA8D,EAAE,CAAC;KAC1G;IACD;QACE,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,OAAO;QAChB,WAAW,EACT,0HAA0H;YAC1H,yEAAyE;QAC3E,WAAW,EAAE;YACX,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,2BAA2B,EAAE;SACrG;QACD,KAAK,EAAE;YACL,EAAE,GAAG,YAAY,EAAE,WAAW,EAAE,6EAA6E,EAAE;YAC/G,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,+DAA+D,EAAE;SACpI;KACF;IACD;QACE,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,SAAS;QAClB,WAAW,EACT,+EAA+E;YAC/E,gGAAgG;QAClG,WAAW,EAAE;YACX,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,oCAAoC,EAAE;SAC7G;QACD,KAAK,EAAE;YACL,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,yDAAyD,EAAE;YACzH,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,kEAAkE,EAAE;YAClJ,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,2CAA2C,EAAE;SAC3G;KACF;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,cAAc;QACvB,WAAW,EACT,oEAAoE;YACpE,sDAAsD;QACxD,WAAW,EAAE;YACX,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,uDAAuD,EAAE;SAClI;QACD,KAAK,EAAE,EAAE;KACV;IACD;QACE,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,MAAM;QACf,WAAW,EACT,yIAAyI;YACzI,+CAA+C;QACjD,WAAW,EAAE,EAAE;QACf,KAAK,EAAE;YACL;gBACE,QAAQ,EAAE,MAAM;gBAChB,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,IAAI;gBACd,WAAW,EAAE,sEAAsE;aACpF;SACF;KACF;IACD;QACE,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,QAAQ;QACjB,WAAW,EACT,iFAAiF;YACjF,oCAAoC;QACtC,WAAW,EAAE,EAAE;QACf,KAAK,EAAE,EAAE;KACV;IACD;QACE,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,SAAS;QAClB,WAAW,EACT,yEAAyE;YACzE,kEAAkE;QACpE,WAAW,EAAE;YACX,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,kCAAkC,EAAE;SAC1G;QACD,KAAK,EAAE;YACL,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kDAAkD,EAAE;SAC5H;KACF;IACD;QACE,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,OAAO;QAChB,WAAW,EACT,oHAAoH;YACpH,qFAAqF;QACvF,WAAW,EAAE,EAAE;QACf,KAAK,EAAE;YACL,EAAE,GAAG,YAAY,EAAE,WAAW,EAAE,uDAAuD,EAAE;YACzF,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kFAAkF,EAAE;YAC/J,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,oHAAoH,EAAE;SAC/L;KACF;IACD;QACE,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,MAAM;QACf,WAAW,EACT,2FAA2F;YAC3F,8EAA8E;QAChF,WAAW,EAAE,EAAE;QACf,KAAK,EAAE;YACL,EAAE,GAAG,YAAY,EAAE,WAAW,EAAE,iEAAiE,EAAE;YACnG,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,wGAAwG,EAAE;YAC7K,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,wDAAwD,EAAE;SACjI;KACF;IACD;QACE,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,OAAO;QAChB,WAAW,EACT,mGAAmG;YACnG,mEAAmE;QACrE,WAAW,EAAE,EAAE;QACf,KAAK,EAAE;YACL,EAAE,GAAG,YAAY,EAAE,WAAW,EAAE,2DAA2D,EAAE;YAC7F;gBACE,QAAQ,EAAE,YAAY;gBACtB,IAAI,EAAE,cAAc;gBACpB,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,8FAA8F;aAC5G;SACF;KACF;IACD;QACE,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,SAAS;QAClB,WAAW,EACT,oIAAoI;YACpI,+CAA+C;QACjD,WAAW,EAAE;YACX;gBACE,QAAQ,EAAE,SAAS;gBACnB,QAAQ,EAAE,KAAK;gBACf,QAAQ,EAAE,KAAK;gBACf,WAAW,EAAE,iFAAiF,SAAS,2BAA2B;aACnI;SACF;QACD,KAAK,EAAE,EAAE;KACV;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,cAAc;QACvB,WAAW,EACT,wIAAwI;YACxI,qGAAqG;YACrG,4GAA4G;YAC5G,8GAA8G;YAC9G,6BAA6B;YAC7B,iFAAiF;QACnF,WAAW,EAAE;YACX;gBACE,QAAQ,EAAE,UAAU;gBACpB,QAAQ,EAAE,KAAK;gBACf,QAAQ,EAAE,KAAK;gBACf,WAAW,EAAE,iGAAiG;aAC/G;YACD;gBACE,QAAQ,EAAE,MAAM;gBAChB,QAAQ,EAAE,KAAK;gBACf,QAAQ,EAAE,IAAI;gBACd,WAAW,EAAE,8DAA8D;aAC5E;SACF;QACD,KAAK,EAAE;YACL;gBACE,wEAAwE;gBACxE,sEAAsE;gBACtE,yEAAyE;gBACzE,iEAAiE;gBACjE,wEAAwE;gBACxE,iCAAiC;gBACjC,QAAQ,EAAE,aAAa;gBACvB,IAAI,EAAE,iBAAiB;gBACvB,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,2EAA2E;aACzF;SACF;KACF;CACF,CAAC;AAEF,MAAM,UAAU,UAAU,CACxB,IAAY,EACZ,KAAK,GAAuB,SAAS;IAErC,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAClD,CAAC;AAED,6EAA6E;AAC7E,qEAAqE;AACrE,6EAA6E;AAC7E,0EAA0E;AAC1E,8EAA8E;AAC9E,8EAA8E;AAC9E,wEAAwE;AACxE,+DAA+D","sourcesContent":["/**\n * The curated MCP tool table: which loam commands an MCP client can reach,\n * and how a JSON argument object becomes an argv the CLI already trusts.\n *\n * This base table is read-only. Opt-in writers live in `./author-tools.ts`;\n * vouch and a committing archive remain absent: an MCP caller is definitionally\n * an agent, `loam vouch` is a HUMAN act (the CLI refuses unattended runs with\n * vouch-unattended), and exposing it here would rebuild the hole the generated\n * skill files' allowlist was narrowed to close. verify is excluded with them: its read form and its\n * attesting `--record`/`--results`/`--contract-results` form are one command,\n * and a facade that exposes \"only the read half\" of a writer is one\n * flag-mapping bug away from exposing the writer.\n *\n * The inclusion of the two commands that read no CONFIG — `explain` and\n * `instructions` — is equally deliberate, and is recorded here because the\n * gap is otherwise re-derivable as an oversight: an agent meets both BEFORE\n * the repository is wired (every generated skill's first line is `loam\n * instructions <workflow>`, and `loam explain <code>` answers a code from a\n * run that has not happened yet), so an MCP-only host that could not reach\n * them could not fetch the protocol its own generated skill points at.\n *\n * `adopt` is here for the same reason one step later: it writes nothing — it\n * emits the brief an agent then writes a baseline from — and the loam-adopt\n * protocol an MCP-only host fetches through `loam_instructions` opens by\n * running it. Without the tool that host could read the protocol and never\n * receive the brief the protocol is about.\n *\n * Every table entry mirrors a real registration in `src/commands/` — same\n * positionals, same flags, same spellings — so the contract an MCP client\n * sees is the CLI contract, not a second one. `--json` is appended by\n * `toArgv` unconditionally: the tool result IS the machine envelope.\n */\n\nimport { TERMS } from \"../explain/terms.js\";\n\n/**\n * The concept-term names, from the registry that owns them — `loam_explain`'s\n * schema description must not be a hand copy that silently trails TERMS.\n */\nconst TERM_LIST = TERMS.map(({ term }) => term).join(\", \");\n\n/** A positional argument, in declaration order. A variadic one is always last. */\nexport interface ToolPositional {\n readonly property: string;\n readonly required: boolean;\n /** True when the JSON argument is an array of strings spread as trailing positionals. */\n readonly variadic: boolean;\n readonly description: string;\n}\n\n/** One CLI flag: `kind` decides both the JSON Schema type and the argv shape. */\nexport interface ToolFlag {\n readonly property: string;\n readonly flag: string;\n readonly kind: \"string\" | \"boolean\" | \"strings\";\n /**\n * Set when the CLI declares the option with `requiredOption` — the schema\n * then requires the property and the argv builder refuses its absence, so\n * a client learns the requirement from the schema instead of from an\n * invalid-option envelope after the call. The shape test asserts this\n * mirrors commander's own `mandatory`, both ways.\n */\n readonly required?: true;\n readonly description: string;\n}\n\nexport interface McpTool {\n readonly name: string;\n readonly command: string;\n readonly description: string;\n readonly positionals: readonly ToolPositional[];\n readonly flags: readonly ToolFlag[];\n /** Arguments enforced by the server rather than exposed to the caller. */\n readonly fixed?: readonly string[];\n readonly annotations?: Readonly<Record<string, boolean>>;\n}\n\nconst SERVICE_FLAG = {\n property: \"service\",\n flag: \"--service\",\n kind: \"string\",\n description: \"service id (defaults to the one loam.json configures)\",\n} as const;\n\n/**\n * The tool annotations EVERY entry in this table carries — one shared literal,\n * because the table is read-only by construction and a per-tool copy is a\n * place for one of them to drift into claiming something else.\n *\n * `readOnlyHint` is the whole point: without it a host has no machine signal\n * that `loam_validate` or `loam_context` is safe, so a call that only reads\n * files falls into the same approval prompt as a mutating tool. Read-only\n * hints are what let a host auto-approve, and the reason the writers are\n * excluded from the table above is precisely so this hint can be true of\n * everything left. `openWorldHint: false` states the other half a host acts\n * on: loam reaches no network and no service — it reads the files in the\n * directory the server started in, and nothing else.\n *\n * `idempotentHint` and `destructiveHint` are deliberately ABSENT rather than\n * spelled `true`/`false`: MCP defines both as meaningful only when\n * `readOnlyHint` is false, so shipping them would be noise a reviewer has to\n * justify before deciding they mean nothing here.\n *\n * `outputSchema` lives in `./protocol.ts`, beside `toolReply`: the declaration\n * and the fallback structured envelope have to change together or a client is\n * promised structured content one branch can omit.\n */\nexport const READ_ONLY_ANNOTATIONS = { readOnlyHint: true, openWorldHint: false } as const;\n\n/**\n * The `loam_` prefix on every name: multi-server MCP hosts flatten tool names\n * into one namespace, and a bare `validate` collides with anybody else's.\n * Each description names the CLI command it mirrors, so the equivalence is\n * stated where the client reads it.\n */\nexport const MCP_TOOLS: readonly McpTool[] = [\n {\n name: \"loam_validate\",\n command: \"validate\",\n description:\n \"Validate a service (C4 + requirement coverage), a feature (delta + coverage), or the whole fleet. \" +\n \"CLI equivalent: loam validate [target] [--service <id>] [--feature <id>] [--all] [--strict] [--errors-only] --json\",\n positionals: [\n {\n property: \"target\",\n required: false,\n variadic: false,\n description: \"service or feature id (a feature wins when both match; service/feature force the reading)\",\n },\n ],\n flags: [\n { ...SERVICE_FLAG, description: \"service to validate (defaults to the configured service)\" },\n { property: \"feature\", flag: \"--feature\", kind: \"string\", description: \"validate a feature delta instead of a service\" },\n { property: \"all\", flag: \"--all\", kind: \"boolean\", description: \"validate every service and every active feature\" },\n { property: \"strict\", flag: \"--strict\", kind: \"boolean\", description: \"exit 1 on any warning too; the payload does not change\" },\n { property: \"errorsOnly\", flag: \"--errors-only\", kind: \"boolean\", description: \"print only errors and warnings; the payload does not change\" },\n ],\n },\n {\n name: \"loam_status\",\n command: \"status\",\n description:\n \"Where the work stands and what to do next, derived from the files. \" +\n \"CLI equivalent: loam status [feature] [--service <id>] --json\",\n positionals: [\n { property: \"feature\", required: false, variadic: false, description: \"feature id or directory name; omit for the whole repository\" },\n ],\n flags: [{ ...SERVICE_FLAG, description: \"narrow the per-service view to one service\" }],\n },\n {\n name: \"loam_list\",\n command: \"list\",\n description:\n \"List the services and features in the docs repo. \" +\n \"CLI equivalent: loam list [section] [name] [--archived] [--needs-work] [--review-order] [--subsystem <name>] [--owners <path>] --json\",\n positionals: [\n { property: \"section\", required: false, variadic: false, description: \"services | features | capabilities | glossary | suites (default: services + features)\" },\n { property: \"name\", required: false, variadic: false, description: \"suites only: the one suite to show\" },\n ],\n flags: [\n { property: \"archived\", flag: \"--archived\", kind: \"boolean\", description: \"include archived features\" },\n { property: \"needsWork\", flag: \"--needs-work\", kind: \"boolean\", description: \"services only: every service below vouched, with what it is missing\" },\n { property: \"reviewOrder\", flag: \"--review-order\", kind: \"boolean\", description: \"with needsWork: order the worklist by fan-in, highest blast radius first\" },\n { property: \"subsystem\", flag: \"--subsystem\", kind: \"string\", description: \"services only: limit the listing to services filed under this subsystem, at any depth ('unfiled' selects the ones filed under none)\" },\n { property: \"owners\", flag: \"--owners\", kind: \"string\", description: \"services only: group the listing by owning team from this CODEOWNERS file (directory-pattern rules only; unsupported rules are listed as skipped, never guessed)\" },\n ],\n },\n {\n name: \"loam_show\",\n command: \"show\",\n description:\n \"Everything loam knows about a service or a feature. \" +\n \"CLI equivalent: loam show <target> [--type service|feature] --json\",\n positionals: [\n { property: \"target\", required: true, variadic: false, description: \"service id or feature id\" },\n ],\n flags: [\n { property: \"type\", flag: \"--type\", kind: \"string\", description: \"force the reading: service | feature\" },\n ],\n },\n {\n name: \"loam_delta\",\n command: \"delta\",\n description:\n \"Project a feature onto a service: why + requirement delta + C4 changes. \" +\n \"CLI equivalent: loam delta <featureId> [--service <id>] --json\",\n positionals: [\n { property: \"featureId\", required: true, variadic: false, description: \"feature id, e.g. FEAT-101\" },\n ],\n flags: [{ ...SERVICE_FLAG, description: \"service to project onto (defaults to the configured service)\" }],\n },\n {\n name: \"loam_tasks\",\n command: \"tasks\",\n description:\n \"What is still open on a feature, at which step, and what closes each unit — a read-only projection that writes nothing. \" +\n \"CLI equivalent: loam tasks <featureId> [--service <id>] [--next] --json\",\n positionals: [\n { property: \"featureId\", required: true, variadic: false, description: \"feature id, e.g. FEAT-101\" },\n ],\n flags: [\n { ...SERVICE_FLAG, description: \"narrow the packet to the units one service owns (a lens: no binding needed)\" },\n { property: \"next\", flag: \"--next\", kind: \"boolean\", description: \"the frontier head alone — the single leaf to hand to a worker\" },\n ],\n },\n {\n name: \"loam_explore\",\n command: \"explore\",\n description:\n \"Read the fleet around a change nobody has written down yet — writes nothing. \" +\n \"CLI equivalent: loam explore [service...] [--op <id>] [--capability <id>] [--as <FEAT>] --json\",\n positionals: [\n { property: \"services\", required: false, variadic: true, description: \"service ids the change starts from\" },\n ],\n flags: [\n { property: \"op\", flag: \"--op\", kind: \"strings\", description: \"seed from an operation instead of a service; repeatable\" },\n { property: \"capability\", flag: \"--capability\", kind: \"strings\", description: \"seed from a declared capability's realizing services; repeatable\" },\n { property: \"as\", flag: \"--as\", kind: \"string\", description: \"feature id for the suggested command line\" },\n ],\n },\n {\n name: \"loam_dependencies\",\n command: \"dependencies\",\n description:\n \"Dependencies and conflicts derived from active feature artifacts. \" +\n \"CLI equivalent: loam dependencies [featureId] --json\",\n positionals: [\n { property: \"featureId\", required: false, variadic: false, description: \"active feature id; omit for the whole in-flight graph\" },\n ],\n flags: [],\n },\n {\n name: \"loam_diff\",\n command: \"diff\",\n description:\n \"Semantic diff of the living docs against a base git ref of the docs repo — removals graded against their current consumers; read-only. \" +\n \"CLI equivalent: loam diff --base <ref> --json\",\n positionals: [],\n flags: [\n {\n property: \"base\",\n flag: \"--base\",\n kind: \"string\",\n required: true,\n description: \"base git ref of the docs repo (e.g. main, origin/main, a commit sha)\",\n },\n ],\n },\n {\n name: \"loam_doctor\",\n command: \"doctor\",\n description:\n \"Diagnose local loam configuration and docs-repo accessibility without writing. \" +\n \"CLI equivalent: loam doctor --json\",\n positionals: [],\n flags: [],\n },\n {\n name: \"loam_context\",\n command: \"context\",\n description:\n \"Assemble one service's whole docs slice as one deterministic briefing. \" +\n \"CLI equivalent: loam context <service> [--feature <FEAT>] --json\",\n positionals: [\n { property: \"service\", required: true, variadic: false, description: \"service id, e.g. payment-service\" },\n ],\n flags: [\n { property: \"feature\", flag: \"--feature\", kind: \"string\", description: \"narrow the in-flight section to this one feature\" },\n ],\n },\n {\n name: \"loam_adopt\",\n command: \"adopt\",\n description:\n \"Brief an agent to write one service's baseline docs from its code, and say what will be checked — writes nothing. \" +\n \"CLI equivalent: loam adopt [--service <id>] [--subsystem <name>] [--targets] --json\",\n positionals: [],\n flags: [\n { ...SERVICE_FLAG, description: \"service to adopt (defaults to the configured service)\" },\n { property: \"subsystem\", flag: \"--subsystem\", kind: \"string\", description: \"brief a NEW service's baseline into this subsystem instead of the services/ root\" },\n { property: \"targets\", flag: \"--targets\", kind: \"boolean\", description: \"only what varies by service; a `full` field names the run that carries the walk, the checks and the unchecked list\" },\n ],\n },\n {\n name: \"loam_gate\",\n command: \"gate\",\n description:\n \"Can this service deploy? A read-only query over recorded evidence — advisory by default. \" +\n \"CLI equivalent: loam gate [--service <id>] [--since <ref>] [--strict] --json\",\n positionals: [],\n flags: [\n { ...SERVICE_FLAG, description: \"the service being deployed (defaults to the configured service)\" },\n { property: \"since\", flag: \"--since\", kind: \"string\", description: \"also grade features archived after this docs-repo git ref; without it only in-flight features are read\" },\n { property: \"strict\", flag: \"--strict\", kind: \"boolean\", description: \"exit 1 on any warning too; the payload does not change\" },\n ],\n },\n {\n name: \"loam_steps\",\n command: \"steps\",\n description:\n \"Inventory the step phrases of a service's scenarios — how many step definitions its suite needs. \" +\n \"CLI equivalent: loam steps [--service <id>] [--duplicates] --json\",\n positionals: [],\n flags: [\n { ...SERVICE_FLAG, description: \"service to inventory (defaults to the configured service)\" },\n {\n property: \"duplicates\",\n flag: \"--duplicates\",\n kind: \"boolean\",\n description: \"list only the near-duplicate groups — phrases that differ by an article or a trailing clause\",\n },\n ],\n },\n {\n name: \"loam_explain\",\n command: \"explain\",\n description:\n \"Explain a finding code, a refusal code, or a loam concept term, version-matched to this binary; reads no config and no docs repo. \" +\n \"CLI equivalent: loam explain [subject] --json\",\n positionals: [\n {\n property: \"subject\",\n required: false,\n variadic: false,\n description: `finding code (spine.op-undefined), refusal code (docs-busy), or concept term (${TERM_LIST}); omit to list the terms`,\n },\n ],\n flags: [],\n },\n {\n name: \"loam_instructions\",\n command: \"instructions\",\n description:\n \"Print a workflow, support protocol or reference page, version-matched to this binary; reads no config and no docs repo, so it answers \" +\n \"before the repository is wired. Ask for loam-check DELIBERATELY: it is by far the largest protocol \" +\n \"(almost all of what it prints is its per-code fix tables), and noFixTables true returns the narrowed page \" +\n \"— every paragraph that introduces a table, none of the rows — after which loam_explain answers any one code \" +\n \"a run reports, on its own. \" +\n \"CLI equivalent: loam instructions [workflow] [args...] [--no-fix-tables] --json\",\n positionals: [\n {\n property: \"workflow\",\n required: false,\n variadic: false,\n description: \"workflow, support or reference name (loam-adopt, loam-report, loam-codes, …); omit to list them\",\n },\n {\n property: \"args\",\n required: false,\n variadic: true,\n description: \"values substituted for the protocol's $1, $2, … placeholders\",\n },\n ],\n flags: [\n {\n // `noFixTables`, not `fixTables`, and the mismatch with commander's own\n // attribute name (`fixTables`, because `--no-` negates) is the point:\n // `toArgv` spells a true boolean as its flag string, so a property named\n // for the option's ATTRIBUTE would make `{fixTables: true}` emit\n // `--no-fix-tables` and turn the tables off. The JSON property is named\n // for what setting it true DOES.\n property: \"noFixTables\",\n flag: \"--no-fix-tables\",\n kind: \"boolean\",\n description: \"drop the per-code fix tables; loam_explain answers any code a run reports\",\n },\n ],\n },\n];\n\nexport function toolByName(\n name: string,\n tools: readonly McpTool[] = MCP_TOOLS,\n): McpTool | undefined {\n return tools.find((tool) => tool.name === name);\n}\n\n// How a tool call's JSON arguments become an argv — including the refusal of\n// any string a shell-less argv would still read as a flag — lives in\n// `./argv.ts`: the table above says WHAT the tools are, that module says how\n// a call crosses into the CLI's own parsing. The inputSchema each tool is\n// advertised with (`toInputSchema`) lives there too: it DECLARES the argument\n// contract `toArgv` ENFORCES — the closed object, the required set, the order\n// the positionals are read in — and the two halves change together or a\n// client validates against one rule and is refused by another.\n"]}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The fleet's ARCHITECTURAL OBLIGATION vocabulary: which architectural rules
|
|
3
|
+
* this fleet has decided on, so a `#obl-<name>` tag on the map resolves or
|
|
4
|
+
* refuses instead of silently labelling.
|
|
5
|
+
*
|
|
6
|
+
* THE GAP IT CLOSES is the architect→team handoff, and loam already had exactly
|
|
7
|
+
* one channel for it: a landscape edge carrying `metadata { op 'authorizePayment' }`
|
|
8
|
+
* obliges the provider to define that operationId, or `spine.op-undefined` fails
|
|
9
|
+
* the gate. The architect writes the edge and the team owes the contract. There
|
|
10
|
+
* was no equivalent for the obligations that VARY — an outbox on this publisher
|
|
11
|
+
* and not that one, a circuit breaker on two edges out of five — and "vary" is
|
|
12
|
+
* why a policy document is the wrong shape: a fleet-wide rule every service
|
|
13
|
+
* inherits is not what an architect actually hands over.
|
|
14
|
+
*
|
|
15
|
+
* SO THE DECISION AND ITS SCOPE ARE SEPARATE THINGS, and each lives where it
|
|
16
|
+
* already belonged. The **ADR** says WHAT was decided, in `architecture/adrs/`,
|
|
17
|
+
* as thin or as thick as the decision needs. A **tag** on a landscape element or
|
|
18
|
+
* edge says WHERE it applies, so one ADR governs three edges and not the fourth
|
|
19
|
+
* without the document forking. This **vocabulary** declares the names, so a
|
|
20
|
+
* mistyped tag is an error rather than a word nobody notices. And the team's
|
|
21
|
+
* **`Covers:`** line says it is met, with a scenario proving it.
|
|
22
|
+
*
|
|
23
|
+
* THE SHAPE IS `permissions.yaml`'s AND `capabilities.yaml`'s, deliberately: a
|
|
24
|
+
* fleet file declares names with prose that has no other home, the join is made
|
|
25
|
+
* elsewhere, and the vocabulary is graded in both directions. What it is NOT is
|
|
26
|
+
* a policy engine — there are no conditions, no severities, no inheritance.
|
|
27
|
+
* Everything past a declared name has no ground truth to check against, which
|
|
28
|
+
* is the same line the permission and capability vocabularies stop at.
|
|
29
|
+
*
|
|
30
|
+
* AN ID IS ITS OWN TAG SUFFIX, so an id is refused unless a LikeC4 tag name can
|
|
31
|
+
* carry it verbatim. The capability axis had to flatten `identity/tokens` into
|
|
32
|
+
* `#cap-identity-tokens` — lossy, and two ids can collapse into one slug — which
|
|
33
|
+
* it pays for with a `many` arm at every join. Here the id is chosen by whoever
|
|
34
|
+
* writes the vocabulary and has no other life, so refusing `payments/outbox` at
|
|
35
|
+
* the source is strictly better than flattening it: the tag is exact, no slug
|
|
36
|
+
* exists, and no collision arm is needed anywhere downstream.
|
|
37
|
+
*/
|
|
38
|
+
import { readFile } from "node:fs/promises";
|
|
39
|
+
import { existsSync } from "node:fs";
|
|
40
|
+
import { parse as parseYaml } from "yaml";
|
|
41
|
+
import { isRecord } from "../kernel/records.js";
|
|
42
|
+
/** The reserved tag prefix. `#obl-outbox` applies the obligation `outbox`. */
|
|
43
|
+
export const OBLIGATION_TAG_PREFIX = "obl-";
|
|
44
|
+
/**
|
|
45
|
+
* Every character a LikeC4 tag name accepts, at the 1.59.2 pin — the same
|
|
46
|
+
* measured whitelist `core/capabilities/usecase-join.ts` records, applied here
|
|
47
|
+
* as a REFUSAL rather than as a flattening. A rejected character truncates the
|
|
48
|
+
* tag rather than failing it (`#obl-a.b` reads back as `obl-a`), so a name that
|
|
49
|
+
* cannot be a tag is a name whose tag would silently mean something else.
|
|
50
|
+
*/
|
|
51
|
+
const TAG_SAFE_NAME = /^[A-Za-z0-9_-]+$/;
|
|
52
|
+
const EMPTY = { present: false, byId: new Map() };
|
|
53
|
+
/**
|
|
54
|
+
* Read the vocabulary — the same defensive ladder `permissions.ts` and
|
|
55
|
+
* `capabilities.ts` walk, because the three files fail the same ways. A missing
|
|
56
|
+
* file is silence; a YAML error or a non-mapping shape is `invalid`, one finding
|
|
57
|
+
* for the whole run with the family suspended behind it; an empty document is a
|
|
58
|
+
* present-and-empty vocabulary; and a declaration whose body is not a mapping is
|
|
59
|
+
* read as `{}` rather than refusing the whole file over one leaf.
|
|
60
|
+
*
|
|
61
|
+
* The one rule that is this file's own is the id grammar above, and it refuses
|
|
62
|
+
* the FILE rather than dropping the entry: a vocabulary that silently held only
|
|
63
|
+
* the names loam could tag would grade the rest as undeclared, which reads as
|
|
64
|
+
* "you have a typo" against a line the author did write.
|
|
65
|
+
*/
|
|
66
|
+
export async function readObligations(path) {
|
|
67
|
+
if (!existsSync(path))
|
|
68
|
+
return EMPTY;
|
|
69
|
+
let doc;
|
|
70
|
+
try {
|
|
71
|
+
doc = parseYaml(await readFile(path, "utf8"));
|
|
72
|
+
}
|
|
73
|
+
catch (e) {
|
|
74
|
+
return { ...EMPTY, present: true, invalid: e instanceof Error ? e.message : String(e) };
|
|
75
|
+
}
|
|
76
|
+
if (doc === null || doc === undefined)
|
|
77
|
+
return { ...EMPTY, present: true };
|
|
78
|
+
if (!isRecord(doc))
|
|
79
|
+
return { ...EMPTY, present: true, invalid: "the document is not a mapping" };
|
|
80
|
+
const block = doc["obligations"];
|
|
81
|
+
if (block === undefined)
|
|
82
|
+
return { present: true, byId: new Map() };
|
|
83
|
+
if (!isRecord(block)) {
|
|
84
|
+
return { ...EMPTY, present: true, invalid: "`obligations` is not a mapping of obligation id to its declaration" };
|
|
85
|
+
}
|
|
86
|
+
const byId = new Map();
|
|
87
|
+
for (const [id, body] of Object.entries(block)) {
|
|
88
|
+
if (!TAG_SAFE_NAME.test(id)) {
|
|
89
|
+
return {
|
|
90
|
+
...EMPTY,
|
|
91
|
+
present: true,
|
|
92
|
+
invalid: `'${id}' cannot be a LikeC4 tag name, and an obligation id IS its tag suffix — ` +
|
|
93
|
+
"use letters, digits, `_` and `-` only (a rejected character truncates the tag rather than failing it, " +
|
|
94
|
+
"so `#obl-a.b` would read back as the obligation `a`)",
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
const decl = isRecord(body) ? body : {};
|
|
98
|
+
byId.set(id, {
|
|
99
|
+
id,
|
|
100
|
+
...(typeof decl["description"] === "string" ? { description: decl["description"] } : {}),
|
|
101
|
+
...(typeof decl["adr"] === "string" ? { adr: decl["adr"] } : {}),
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
return { present: true, byId };
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=obligations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"obligations.js","sourceRoot":"","sources":["../../../src/core/obligations/obligations.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The fleet's ARCHITECTURAL OBLIGATION vocabulary: which architectural rules\n * this fleet has decided on, so a `#obl-<name>` tag on the map resolves or\n * refuses instead of silently labelling.\n *\n * THE GAP IT CLOSES is the architect→team handoff, and loam already had exactly\n * one channel for it: a landscape edge carrying `metadata { op 'authorizePayment' }`\n * obliges the provider to define that operationId, or `spine.op-undefined` fails\n * the gate. The architect writes the edge and the team owes the contract. There\n * was no equivalent for the obligations that VARY — an outbox on this publisher\n * and not that one, a circuit breaker on two edges out of five — and \"vary\" is\n * why a policy document is the wrong shape: a fleet-wide rule every service\n * inherits is not what an architect actually hands over.\n *\n * SO THE DECISION AND ITS SCOPE ARE SEPARATE THINGS, and each lives where it\n * already belonged. The **ADR** says WHAT was decided, in `architecture/adrs/`,\n * as thin or as thick as the decision needs. A **tag** on a landscape element or\n * edge says WHERE it applies, so one ADR governs three edges and not the fourth\n * without the document forking. This **vocabulary** declares the names, so a\n * mistyped tag is an error rather than a word nobody notices. And the team's\n * **`Covers:`** line says it is met, with a scenario proving it.\n *\n * THE SHAPE IS `permissions.yaml`'s AND `capabilities.yaml`'s, deliberately: a\n * fleet file declares names with prose that has no other home, the join is made\n * elsewhere, and the vocabulary is graded in both directions. What it is NOT is\n * a policy engine — there are no conditions, no severities, no inheritance.\n * Everything past a declared name has no ground truth to check against, which\n * is the same line the permission and capability vocabularies stop at.\n *\n * AN ID IS ITS OWN TAG SUFFIX, so an id is refused unless a LikeC4 tag name can\n * carry it verbatim. The capability axis had to flatten `identity/tokens` into\n * `#cap-identity-tokens` — lossy, and two ids can collapse into one slug — which\n * it pays for with a `many` arm at every join. Here the id is chosen by whoever\n * writes the vocabulary and has no other life, so refusing `payments/outbox` at\n * the source is strictly better than flattening it: the tag is exact, no slug\n * exists, and no collision arm is needed anywhere downstream.\n */\nimport { readFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { parse as parseYaml } from \"yaml\";\nimport { isRecord } from \"../kernel/records.js\";\n\n/** The reserved tag prefix. `#obl-outbox` applies the obligation `outbox`. */\nexport const OBLIGATION_TAG_PREFIX = \"obl-\";\n\n/**\n * Every character a LikeC4 tag name accepts, at the 1.59.2 pin — the same\n * measured whitelist `core/capabilities/usecase-join.ts` records, applied here\n * as a REFUSAL rather than as a flattening. A rejected character truncates the\n * tag rather than failing it (`#obl-a.b` reads back as `obl-a`), so a name that\n * cannot be a tag is a name whose tag would silently mean something else.\n */\nconst TAG_SAFE_NAME = /^[A-Za-z0-9_-]+$/;\n\n/** One declared architectural obligation. */\nexport interface Obligation {\n /** The name, which is also the tag suffix: `#obl-<id>`. */\n id: string;\n description?: string;\n /**\n * The decision record this obligation comes from, as a path relative to the\n * docs repo root — `architecture/adrs/0001-transactional-outbox.md`.\n *\n * Optional, and RESOLVED when present: this is the join that makes \"the ADR\n * says what, the tag says where\" checkable rather than a convention. An\n * obligation with no ADR is a legitimate state — the reason may be one\n * sentence of `description` — but a path that names nothing is a pointer at a\n * decision nobody can read, which is the same failure `capability.unknown`\n * catches one axis over.\n */\n adr?: string;\n}\n\nexport interface ObligationVocabulary {\n /**\n * False when `architecture/obligations.yaml` does not exist. The FILE is the\n * axis's opt-in, exactly as it is for permissions and capabilities: a fleet\n * that has decided nothing architectural owes no vocabulary and hears\n * nothing, however many tags its map already carries.\n */\n present: boolean;\n /** Why the file could not be read as a vocabulary, when it could not. */\n invalid?: string;\n /** Declared obligations, keyed by id. */\n byId: Map<string, Obligation>;\n}\n\nconst EMPTY: ObligationVocabulary = { present: false, byId: new Map() };\n\n/**\n * Read the vocabulary — the same defensive ladder `permissions.ts` and\n * `capabilities.ts` walk, because the three files fail the same ways. A missing\n * file is silence; a YAML error or a non-mapping shape is `invalid`, one finding\n * for the whole run with the family suspended behind it; an empty document is a\n * present-and-empty vocabulary; and a declaration whose body is not a mapping is\n * read as `{}` rather than refusing the whole file over one leaf.\n *\n * The one rule that is this file's own is the id grammar above, and it refuses\n * the FILE rather than dropping the entry: a vocabulary that silently held only\n * the names loam could tag would grade the rest as undeclared, which reads as\n * \"you have a typo\" against a line the author did write.\n */\nexport async function readObligations(path: string): Promise<ObligationVocabulary> {\n if (!existsSync(path)) return EMPTY;\n let doc: unknown;\n try {\n doc = parseYaml(await readFile(path, \"utf8\"));\n } catch (e) {\n return { ...EMPTY, present: true, invalid: e instanceof Error ? e.message : String(e) };\n }\n if (doc === null || doc === undefined) return { ...EMPTY, present: true };\n if (!isRecord(doc)) return { ...EMPTY, present: true, invalid: \"the document is not a mapping\" };\n\n const block = doc[\"obligations\"];\n if (block === undefined) return { present: true, byId: new Map() };\n if (!isRecord(block)) {\n return { ...EMPTY, present: true, invalid: \"`obligations` is not a mapping of obligation id to its declaration\" };\n }\n\n const byId = new Map<string, Obligation>();\n for (const [id, body] of Object.entries(block)) {\n if (!TAG_SAFE_NAME.test(id)) {\n return {\n ...EMPTY,\n present: true,\n invalid:\n `'${id}' cannot be a LikeC4 tag name, and an obligation id IS its tag suffix — ` +\n \"use letters, digits, `_` and `-` only (a rejected character truncates the tag rather than failing it, \" +\n \"so `#obl-a.b` would read back as the obligation `a`)\",\n };\n }\n const decl = isRecord(body) ? body : {};\n byId.set(id, {\n id,\n ...(typeof decl[\"description\"] === \"string\" ? { description: decl[\"description\"] } : {}),\n ...(typeof decl[\"adr\"] === \"string\" ? { adr: decl[\"adr\"] } : {}),\n });\n }\n return { present: true, byId };\n}\n"]}
|