@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,166 @@
|
|
|
1
|
+
import { configOrRefuse, emitJson, fail } from "../../core/envelope/json.js";
|
|
2
|
+
import { parseServiceId } from "../../core/kernel/ids/service.js";
|
|
3
|
+
import { FleetContext } from "../../core/fleet-context.js";
|
|
4
|
+
import { assembleIntroducedPack, assemblePack, packHoles, } from "../../core/pack/pack.js";
|
|
5
|
+
import { introducingFeatures } from "../../core/projection/introduced.js";
|
|
6
|
+
import { nearestIds } from "../../core/repo/entries.js";
|
|
7
|
+
import { missingFeatureMessage, resolveFeature } from "../../core/repo/repo.js";
|
|
8
|
+
import { DocsRepoUnavailableError } from "../../core/repo/state.js";
|
|
9
|
+
import { docsRepoReady, reportDocsRepoError, reportRepositoryUnavailable } from "../policy/gate.js";
|
|
10
|
+
import { printPack } from "./print.js";
|
|
11
|
+
export function registerContext(program) {
|
|
12
|
+
program
|
|
13
|
+
.command("context")
|
|
14
|
+
.argument("<service>", "service id, e.g. payment-service")
|
|
15
|
+
.description("Assemble one service's docs slice — spec, contracts, edges, permissions, capabilities, and the deltas in flight over it — as one deterministic briefing; writes nothing")
|
|
16
|
+
.option("--feature <FEAT>", "narrow the in-flight section to this one feature")
|
|
17
|
+
.option("--json", "emit the machine contract instead of the human view")
|
|
18
|
+
.action(async (serviceArg, opts) => {
|
|
19
|
+
const json = opts.json === true;
|
|
20
|
+
const config = await configOrRefuse(json);
|
|
21
|
+
if (config === null)
|
|
22
|
+
return;
|
|
23
|
+
const { docsDir } = config;
|
|
24
|
+
// `services`, not `docs`: the pack is a statement about one service in
|
|
25
|
+
// the fleet, and an empty pack read out of a directory that is not a
|
|
26
|
+
// docs repo would say "nothing is documented here" about a repo nobody
|
|
27
|
+
// looked in.
|
|
28
|
+
if (!docsRepoReady(json, docsDir, "services"))
|
|
29
|
+
return;
|
|
30
|
+
const context = new FleetContext();
|
|
31
|
+
try {
|
|
32
|
+
// The feature is resolved BEFORE the service is looked up (delta's
|
|
33
|
+
// ordering): its refusal is about the flag, and it must not depend on
|
|
34
|
+
// whether the service half of the invocation was right.
|
|
35
|
+
let feature = null;
|
|
36
|
+
if (opts.feature !== undefined) {
|
|
37
|
+
feature = await resolveFeature(docsDir, opts.feature, "exclude", context);
|
|
38
|
+
if (!feature) {
|
|
39
|
+
fail(json, "unknown-target", await missingFeatureMessage(docsDir, opts.feature, context));
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// The enumeration answers first and the grammar second —
|
|
44
|
+
// core/repo/service-target.ts's settled order, and the pack is exactly
|
|
45
|
+
// the case its banner argues from: `services/payment service/` is a
|
|
46
|
+
// directory `validate --all` grades and `service.id-invalid` tells the
|
|
47
|
+
// team to rename, so refusing it on the grammar would make the one
|
|
48
|
+
// service loam complains about the one service nobody can be briefed
|
|
49
|
+
// on. The enumerated id is safe to use onward — a readdir produced it,
|
|
50
|
+
// which is `RawServiceId`'s whole provenance. A name that is neither
|
|
51
|
+
// enumerated nor legal is refused before any path is built; a legal
|
|
52
|
+
// name with no directory is `unknown-service`, because a typo must
|
|
53
|
+
// never be indistinguishable from an undocumented service — an EMPTY
|
|
54
|
+
// pack reads as "nothing to know here".
|
|
55
|
+
const entries = await context.listServices(docsDir);
|
|
56
|
+
const entry = entries.find((e) => e.id === serviceArg);
|
|
57
|
+
const assembled = entry !== undefined
|
|
58
|
+
? { ok: true, pack: await assemblePack({ docsDir, entry, feature, context }) }
|
|
59
|
+
: await notLivingPack({ docsDir, name: serviceArg, feature, context });
|
|
60
|
+
if (!assembled.ok) {
|
|
61
|
+
fail(json, assembled.code, assembled.message);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const { pack } = assembled;
|
|
65
|
+
// A document behind the pack that exists but does not parse empties
|
|
66
|
+
// its section, and an agent loading the pack as a briefing would read
|
|
67
|
+
// that as "nothing here" — the vacuously-green pattern. The output
|
|
68
|
+
// stays as informative as ever (and `ok` stays true under --json: the
|
|
69
|
+
// command ran); the exit code is what stops a pipeline from building
|
|
70
|
+
// on it, so it is set BEFORE the format fork — the guard is about the
|
|
71
|
+
// pack, not about how it is rendered.
|
|
72
|
+
if (packHoles(pack))
|
|
73
|
+
process.exitCode = 1;
|
|
74
|
+
if (json) {
|
|
75
|
+
emitJson({ command: "context", docsDir, ...pack });
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
printPack(pack);
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
if (err instanceof DocsRepoUnavailableError) {
|
|
82
|
+
reportDocsRepoError(json, err);
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
// The assembly is all-or-nothing, like explore's scan: it reads every
|
|
86
|
+
// document the pack quotes, so the honest answer to an unreadable FILE
|
|
87
|
+
// (a directory where a document belongs, bytes that are not UTF-8) is
|
|
88
|
+
// a refusal naming the path, not a briefing with a silent hole in it.
|
|
89
|
+
reportRepositoryUnavailable(json, err, "the pack would be missing a document", docsDir);
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* The answer for a name `services/` does not hold: the pack of the service an
|
|
95
|
+
* active feature INTRODUCES, or the refusal.
|
|
96
|
+
*
|
|
97
|
+
* The introducing features are the second enumeration, asked before the
|
|
98
|
+
* grammar for the first one's reason — the name came off a readdir, of the
|
|
99
|
+
* feature's own `specs/`. Refusing it as unknown told the implementer of a NEW
|
|
100
|
+
* service, at step 1 of the implement protocol (`loam context <svc> --feature
|
|
101
|
+
* <FEAT>`), that the service the feature they were handed creates does not
|
|
102
|
+
* exist, while `loam tasks` listed their work for it on the same tree.
|
|
103
|
+
*
|
|
104
|
+
* The briefing is ONE feature's delta, because a service nobody has merged yet
|
|
105
|
+
* is whatever its introducing delta says it is. One introducer is used without
|
|
106
|
+
* a flag; several, with none named, is refused rather than picked — two deltas
|
|
107
|
+
* each describing the same new service differently is a conflict a person
|
|
108
|
+
* resolves, and silently briefing from the first would hide the other.
|
|
109
|
+
*/
|
|
110
|
+
async function notLivingPack(req) {
|
|
111
|
+
const { docsDir, name, feature, context } = req;
|
|
112
|
+
const introducing = await introducingFeatures(docsDir, name, context);
|
|
113
|
+
const [first] = introducing;
|
|
114
|
+
if (first === undefined)
|
|
115
|
+
return unknownService(req);
|
|
116
|
+
const ids = introducing.map((f) => f.id).join(", ");
|
|
117
|
+
if (feature !== null && !introducing.some((f) => f.dir === feature.dir)) {
|
|
118
|
+
// A feature that does not introduce the service has nothing to say about
|
|
119
|
+
// it — its projection would be an EMPTY pack, which reads as "nothing to
|
|
120
|
+
// know here" about a service another feature is busy creating.
|
|
121
|
+
return {
|
|
122
|
+
ok: false,
|
|
123
|
+
code: "unknown-service",
|
|
124
|
+
message: `No service '${name}' under ${docsDir}/services/, and ${feature.id} does not introduce it — ` +
|
|
125
|
+
`${ids} ${introducing.length === 1 ? "does" : "do"}. Name ${introducing.length === 1 ? "it" : "one"} with --feature ${first.id}.`,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
if (feature === null && introducing.length > 1) {
|
|
129
|
+
return {
|
|
130
|
+
ok: false,
|
|
131
|
+
code: "invalid-option",
|
|
132
|
+
message: `'${name}' is not in the living docs yet, and ${ids} each introduce it — ` +
|
|
133
|
+
`name the delta to brief from with --feature <FEAT>.`,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
const chosen = feature ?? first;
|
|
137
|
+
// The chosen feature's own readdir spelling of the name: equal as a string,
|
|
138
|
+
// and the one value here that carries the fact that a directory produced it.
|
|
139
|
+
const service = chosen.services.find((s) => s === name);
|
|
140
|
+
if (service === undefined)
|
|
141
|
+
return unknownService(req);
|
|
142
|
+
const pack = await assembleIntroducedPack({ docsDir, service, feature: chosen, introducedBy: introducing, context });
|
|
143
|
+
return { ok: true, pack };
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* The refusal for a name nothing holds — the grammar's, then `unknown-service`
|
|
147
|
+
* with the near misses. The candidates are every service a reader could have
|
|
148
|
+
* meant: the living ones and the ones a feature in flight introduces, since a
|
|
149
|
+
* typo of the second is now a name this command would have briefed.
|
|
150
|
+
*/
|
|
151
|
+
async function unknownService(req) {
|
|
152
|
+
const { docsDir, name, context } = req;
|
|
153
|
+
const parsed = parseServiceId(name, "service");
|
|
154
|
+
if (!parsed.ok)
|
|
155
|
+
return { ok: false, code: "invalid-option", message: parsed.problem };
|
|
156
|
+
const [living, active] = await Promise.all([context.listServices(docsDir), context.listFeatures(docsDir)]);
|
|
157
|
+
const known = new Set([...living.map((e) => e.id), ...active.flatMap((f) => f.services)]);
|
|
158
|
+
const near = nearestIds(name, [...known]);
|
|
159
|
+
return {
|
|
160
|
+
ok: false,
|
|
161
|
+
code: "unknown-service",
|
|
162
|
+
message: `No service '${name}' under ${docsDir}/services/.` +
|
|
163
|
+
(near.length === 0 ? "" : ` Did you mean ${near.map((n) => `'${n}'`).join(" or ")}?`),
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/commands/context/context.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Command } from \"commander\";\nimport { configOrRefuse, emitJson, fail } from \"../../core/envelope/json.js\";\nimport { parseServiceId, type RawServiceId } from \"../../core/kernel/ids/service.js\";\nimport type { DocsDir } from \"../../core/kernel/ids/dirs.js\";\nimport { FleetContext } from \"../../core/fleet-context.js\";\nimport {\n assembleIntroducedPack,\n assemblePack,\n packHoles,\n type ContextPack,\n type IntroducedPack,\n} from \"../../core/pack/pack.js\";\nimport { introducingFeatures } from \"../../core/projection/introduced.js\";\nimport { nearestIds, type FeatureEntry } from \"../../core/repo/entries.js\";\nimport { missingFeatureMessage, resolveFeature } from \"../../core/repo/repo.js\";\nimport { DocsRepoUnavailableError } from \"../../core/repo/state.js\";\nimport { docsRepoReady, reportDocsRepoError, reportRepositoryUnavailable } from \"../policy/gate.js\";\nimport { printPack } from \"./print.js\";\n\ninterface ContextOptions {\n feature?: string;\n json?: boolean;\n}\n\nexport function registerContext(program: Command): void {\n program\n .command(\"context\")\n .argument(\"<service>\", \"service id, e.g. payment-service\")\n .description(\n \"Assemble one service's docs slice — spec, contracts, edges, permissions, capabilities, and the deltas in flight over it — as one deterministic briefing; writes nothing\",\n )\n .option(\"--feature <FEAT>\", \"narrow the in-flight section to this one feature\")\n .option(\"--json\", \"emit the machine contract instead of the human view\")\n .action(async (serviceArg: string, opts: ContextOptions) => {\n const json = opts.json === true;\n\n const config = await configOrRefuse(json);\n if (config === null) return;\n const { docsDir } = config;\n // `services`, not `docs`: the pack is a statement about one service in\n // the fleet, and an empty pack read out of a directory that is not a\n // docs repo would say \"nothing is documented here\" about a repo nobody\n // looked in.\n if (!docsRepoReady(json, docsDir, \"services\")) return;\n\n const context = new FleetContext();\n try {\n // The feature is resolved BEFORE the service is looked up (delta's\n // ordering): its refusal is about the flag, and it must not depend on\n // whether the service half of the invocation was right.\n let feature: FeatureEntry | null = null;\n if (opts.feature !== undefined) {\n feature = await resolveFeature(docsDir, opts.feature, \"exclude\", context);\n if (!feature) {\n fail(json, \"unknown-target\", await missingFeatureMessage(docsDir, opts.feature, context));\n return;\n }\n }\n\n // The enumeration answers first and the grammar second —\n // core/repo/service-target.ts's settled order, and the pack is exactly\n // the case its banner argues from: `services/payment service/` is a\n // directory `validate --all` grades and `service.id-invalid` tells the\n // team to rename, so refusing it on the grammar would make the one\n // service loam complains about the one service nobody can be briefed\n // on. The enumerated id is safe to use onward — a readdir produced it,\n // which is `RawServiceId`'s whole provenance. A name that is neither\n // enumerated nor legal is refused before any path is built; a legal\n // name with no directory is `unknown-service`, because a typo must\n // never be indistinguishable from an undocumented service — an EMPTY\n // pack reads as \"nothing to know here\".\n const entries = await context.listServices(docsDir);\n const entry = entries.find((e) => e.id === serviceArg);\n const assembled: Assembled =\n entry !== undefined\n ? { ok: true, pack: await assemblePack({ docsDir, entry, feature, context }) }\n : await notLivingPack({ docsDir, name: serviceArg, feature, context });\n if (!assembled.ok) {\n fail(json, assembled.code, assembled.message);\n return;\n }\n const { pack } = assembled;\n // A document behind the pack that exists but does not parse empties\n // its section, and an agent loading the pack as a briefing would read\n // that as \"nothing here\" — the vacuously-green pattern. The output\n // stays as informative as ever (and `ok` stays true under --json: the\n // command ran); the exit code is what stops a pipeline from building\n // on it, so it is set BEFORE the format fork — the guard is about the\n // pack, not about how it is rendered.\n if (packHoles(pack)) process.exitCode = 1;\n\n if (json) {\n emitJson({ command: \"context\", docsDir, ...pack });\n return;\n }\n printPack(pack);\n } catch (err) {\n if (err instanceof DocsRepoUnavailableError) {\n reportDocsRepoError(json, err);\n return;\n }\n // The assembly is all-or-nothing, like explore's scan: it reads every\n // document the pack quotes, so the honest answer to an unreadable FILE\n // (a directory where a document belongs, bytes that are not UTF-8) is\n // a refusal naming the path, not a briefing with a silent hole in it.\n reportRepositoryUnavailable(json, err, \"the pack would be missing a document\", docsDir);\n }\n });\n}\n\n/** A pack to print, or the refusal that stands in for one. */\ntype Assembled =\n | { ok: true; pack: ContextPack | IntroducedPack }\n | { ok: false; code: \"invalid-option\" | \"unknown-service\"; message: string };\n\ninterface NotLivingRequest {\n docsDir: DocsDir;\n /** The argument exactly as typed — the living enumeration did not answer to it. */\n name: string;\n /** What `--feature` resolved to, or null when the flag was not given. */\n feature: FeatureEntry | null;\n context: FleetContext;\n}\n\n/**\n * The answer for a name `services/` does not hold: the pack of the service an\n * active feature INTRODUCES, or the refusal.\n *\n * The introducing features are the second enumeration, asked before the\n * grammar for the first one's reason — the name came off a readdir, of the\n * feature's own `specs/`. Refusing it as unknown told the implementer of a NEW\n * service, at step 1 of the implement protocol (`loam context <svc> --feature\n * <FEAT>`), that the service the feature they were handed creates does not\n * exist, while `loam tasks` listed their work for it on the same tree.\n *\n * The briefing is ONE feature's delta, because a service nobody has merged yet\n * is whatever its introducing delta says it is. One introducer is used without\n * a flag; several, with none named, is refused rather than picked — two deltas\n * each describing the same new service differently is a conflict a person\n * resolves, and silently briefing from the first would hide the other.\n */\nasync function notLivingPack(req: NotLivingRequest): Promise<Assembled> {\n const { docsDir, name, feature, context } = req;\n const introducing = await introducingFeatures(docsDir, name, context);\n const [first] = introducing;\n if (first === undefined) return unknownService(req);\n const ids = introducing.map((f) => f.id).join(\", \");\n if (feature !== null && !introducing.some((f) => f.dir === feature.dir)) {\n // A feature that does not introduce the service has nothing to say about\n // it — its projection would be an EMPTY pack, which reads as \"nothing to\n // know here\" about a service another feature is busy creating.\n return {\n ok: false,\n code: \"unknown-service\",\n message:\n `No service '${name}' under ${docsDir}/services/, and ${feature.id} does not introduce it — ` +\n `${ids} ${introducing.length === 1 ? \"does\" : \"do\"}. Name ${introducing.length === 1 ? \"it\" : \"one\"} with --feature ${first.id}.`,\n };\n }\n if (feature === null && introducing.length > 1) {\n return {\n ok: false,\n code: \"invalid-option\",\n message:\n `'${name}' is not in the living docs yet, and ${ids} each introduce it — ` +\n `name the delta to brief from with --feature <FEAT>.`,\n };\n }\n const chosen = feature ?? first;\n // The chosen feature's own readdir spelling of the name: equal as a string,\n // and the one value here that carries the fact that a directory produced it.\n const service: RawServiceId | undefined = chosen.services.find((s) => s === name);\n if (service === undefined) return unknownService(req);\n const pack = await assembleIntroducedPack({ docsDir, service, feature: chosen, introducedBy: introducing, context });\n return { ok: true, pack };\n}\n\n/**\n * The refusal for a name nothing holds — the grammar's, then `unknown-service`\n * with the near misses. The candidates are every service a reader could have\n * meant: the living ones and the ones a feature in flight introduces, since a\n * typo of the second is now a name this command would have briefed.\n */\nasync function unknownService(req: NotLivingRequest): Promise<Assembled> {\n const { docsDir, name, context } = req;\n const parsed = parseServiceId(name, \"service\");\n if (!parsed.ok) return { ok: false, code: \"invalid-option\", message: parsed.problem };\n const [living, active] = await Promise.all([context.listServices(docsDir), context.listFeatures(docsDir)]);\n const known = new Set<string>([...living.map((e) => e.id), ...active.flatMap((f) => f.services)]);\n const near = nearestIds(name, [...known]);\n return {\n ok: false,\n code: \"unknown-service\",\n message:\n `No service '${name}' under ${docsDir}/services/.` +\n (near.length === 0 ? \"\" : ` Did you mean ${near.map((n) => `'${n}'`).join(\" or \")}?`),\n };\n}\n"]}
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The context pack as a Markdown document on stdout — for pasting into an
|
|
3
|
+
* agent's context, or reading in a terminal that renders neither.
|
|
4
|
+
*
|
|
5
|
+
* Rendering only. Everything printed here comes from `core/pack/`, which is
|
|
6
|
+
* also what `--json` emits, so a printed section can never disagree with the
|
|
7
|
+
* payload beside it. Requirement bodies and Given/When/Then lines go out
|
|
8
|
+
* VERBATIM — they are the acceptance criteria, and paraphrasing them here
|
|
9
|
+
* would put a second wording of the contract in front of whoever implements
|
|
10
|
+
* it. The living sections use the canonical `### Requirement:` /
|
|
11
|
+
* `#### Scenario:` heading levels; the in-flight blocks print the same lines
|
|
12
|
+
* one level deeper, because each sits under its feature's own `###` heading.
|
|
13
|
+
*/
|
|
14
|
+
import {} from "../../core/pack/pack.js";
|
|
15
|
+
import {} from "../../core/pack/living.js";
|
|
16
|
+
import {} from "../../core/pack/features.js";
|
|
17
|
+
export function printPack(pack) {
|
|
18
|
+
console.log(`# ${pack.service} — context pack\n`);
|
|
19
|
+
if ("introducedBy" in pack) {
|
|
20
|
+
// Said FIRST, in place of the maturity line, because every living section
|
|
21
|
+
// below is about to print "(none)" — and a reader who has not been told why
|
|
22
|
+
// takes that for a documented service with nothing in it. `missing` is not
|
|
23
|
+
// printed: it names the living artifacts (`spec.md`, `model.likec4`) that
|
|
24
|
+
// the feature's archive writes, and an agent told they are missing writes
|
|
25
|
+
// them under services/ by hand, which forks the service before it exists.
|
|
26
|
+
console.log(`${pack.path} · introduced by ${pack.introducedBy.join(", ")} (in flight) — not in the living docs until it archives`);
|
|
27
|
+
console.log(`the living sections below are empty because nothing about ${pack.service} has merged yet; its documents are ${pack.feature ?? "the feature"}'s delta, under In flight`);
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
const badge = [pack.frontmatter.status, pack.frontmatter.owner].filter((s) => s !== null);
|
|
31
|
+
console.log(`${pack.path} · ${pack.maturity}${badge.length > 0 ? ` · ${badge.join(" · ")}` : ""}`);
|
|
32
|
+
if (pack.missing.length > 0)
|
|
33
|
+
console.log(`missing: ${pack.missing.join(", ")}`);
|
|
34
|
+
}
|
|
35
|
+
if (pack.frontmatter.last_verified !== null)
|
|
36
|
+
console.log(`last_verified: ${pack.frontmatter.last_verified}`);
|
|
37
|
+
// Under the date it qualifies: that vouch read the sections this names and
|
|
38
|
+
// no others, so `verified` above covers less of the document than it looks.
|
|
39
|
+
if (pack.frontmatter.vouch_scope !== null) {
|
|
40
|
+
console.log(`vouch_scope: ${pack.frontmatter.vouch_scope} — the rest was not read at that vouch`);
|
|
41
|
+
}
|
|
42
|
+
// Per axis and named, `show`'s discipline: the sample is per FILE, so one
|
|
43
|
+
// run can read a short spec.md in full and stamp a long arch.spec.md
|
|
44
|
+
// sampled. Printing only the first line said `verified` over arch
|
|
45
|
+
// requirements this pack then reproduced verbatim, half of them unread.
|
|
46
|
+
if (pack.archSpec.vouch_scope !== null) {
|
|
47
|
+
console.log(`archSpec.vouch_scope: ${pack.archSpec.vouch_scope} — the rest of arch.spec.md was not read at that vouch`);
|
|
48
|
+
}
|
|
49
|
+
for (const s of pack.frontmatter.sources)
|
|
50
|
+
console.log(`sources: ${s}`);
|
|
51
|
+
console.log();
|
|
52
|
+
// Unreadable documents are said FIRST and without hedging (explore's print
|
|
53
|
+
// discipline): every empty section below could otherwise be read as "nothing
|
|
54
|
+
// here", which is the one conclusion an unreadable document never supports.
|
|
55
|
+
if (pack.landscape.present && !pack.landscape.parses) {
|
|
56
|
+
// The `architecture/` PROJECT is what `parses` answers for, so the document
|
|
57
|
+
// at fault is very often a SIBLING beside a landscape that reads perfectly
|
|
58
|
+
// — and naming the landscape sent a reader to bytes loam read fine
|
|
59
|
+
// (verification 2026-09-04). `adopt` and `validate --all` name the file; so
|
|
60
|
+
// does this. The project keeps the fallback: a failure LikeC4 reports with
|
|
61
|
+
// no source document behind it is still a project that does not parse.
|
|
62
|
+
const broken = pack.landscape.broken;
|
|
63
|
+
const named = broken.length === 0 ? "the fleet map (architecture/)" : broken.join(", ");
|
|
64
|
+
// `> 1`, not `=== 1`: the empty arm's subject is the singular "fleet map".
|
|
65
|
+
const verb = broken.length > 1 ? "do" : "does";
|
|
66
|
+
console.log(`! ${named} ${verb} not parse — no edge below is derived, and none is missing either\n`);
|
|
67
|
+
}
|
|
68
|
+
if (pack.openapi.unreadable) {
|
|
69
|
+
console.log(`! openapi.yaml does not parse — nothing here lists what ${pack.service} exposes`);
|
|
70
|
+
if (pack.openapi.error !== undefined)
|
|
71
|
+
console.log(` ${pack.openapi.error}`);
|
|
72
|
+
console.log();
|
|
73
|
+
}
|
|
74
|
+
if (pack.asyncapi.unreadable) {
|
|
75
|
+
console.log(`! asyncapi.yaml does not read as AsyncAPI 3.0 — nothing here lists what ${pack.service} publishes or consumes`);
|
|
76
|
+
if (pack.asyncapi.error !== undefined)
|
|
77
|
+
console.log(` ${pack.asyncapi.error}`);
|
|
78
|
+
console.log();
|
|
79
|
+
}
|
|
80
|
+
// The vocabulary failures lead with the contract failures: each empties a
|
|
81
|
+
// section below into something that reads as an answer ("declared: false"
|
|
82
|
+
// on every permission, "(none realized here)"), and a warning printed down
|
|
83
|
+
// beside the section is a warning a reader pasting the top of the pack
|
|
84
|
+
// never sees.
|
|
85
|
+
if (pack.permissionsVocabulary.invalid !== undefined) {
|
|
86
|
+
console.log("! architecture/permissions.yaml does not read as a vocabulary — every permission below reports declared: false because nobody could look");
|
|
87
|
+
console.log(` ${pack.permissionsVocabulary.invalid}`);
|
|
88
|
+
console.log();
|
|
89
|
+
}
|
|
90
|
+
if (pack.capabilitiesVocabulary.invalid !== undefined) {
|
|
91
|
+
console.log("! architecture/capabilities.yaml does not read as a vocabulary — no capability below is derived, and none is missing either");
|
|
92
|
+
console.log(` ${pack.capabilitiesVocabulary.invalid}`);
|
|
93
|
+
console.log();
|
|
94
|
+
}
|
|
95
|
+
for (const path of pack.capabilitiesUnread) {
|
|
96
|
+
console.log(`! ${path} could not be read while joining capabilities — that service's realizations are missing from the rollup this pack filtered`);
|
|
97
|
+
}
|
|
98
|
+
if (pack.capabilitiesUnread.length > 0)
|
|
99
|
+
console.log();
|
|
100
|
+
if (pack.useCaseScan.unreadable) {
|
|
101
|
+
console.log("! architecture/ does not parse as one LikeC4 project — every use case below is missing because nobody could look, not because none is drawn");
|
|
102
|
+
if (pack.useCaseScan.error !== undefined)
|
|
103
|
+
console.log(` ${pack.useCaseScan.error}`);
|
|
104
|
+
console.log();
|
|
105
|
+
}
|
|
106
|
+
printRequirements("Requirements", pack.requirements);
|
|
107
|
+
printRequirements("Arch requirements", pack.archRequirements);
|
|
108
|
+
console.log("## Operations\n");
|
|
109
|
+
if (pack.operations.length === 0)
|
|
110
|
+
console.log(pack.openapi.unreadable ? "(unreadable — see above)\n" : "(none)\n");
|
|
111
|
+
for (const op of pack.operations) {
|
|
112
|
+
const by = op.governedBy.length > 0
|
|
113
|
+
? `governed by ${op.governedBy.map((n) => `"${n}"`).join(", ")}`
|
|
114
|
+
: "not governed by any requirement";
|
|
115
|
+
console.log(`- ${op.method} ${op.path} ${op.id} — ${by}`);
|
|
116
|
+
}
|
|
117
|
+
if (pack.operations.length > 0)
|
|
118
|
+
console.log();
|
|
119
|
+
console.log("## Messages\n");
|
|
120
|
+
if (pack.messages.length === 0)
|
|
121
|
+
console.log(pack.asyncapi.unreadable ? "(unreadable — see above)\n" : "(none)\n");
|
|
122
|
+
for (const m of pack.messages) {
|
|
123
|
+
const direction = m.direction === null ? "declared, not wired" : m.direction.toUpperCase();
|
|
124
|
+
console.log(`- ${direction} ${m.name} (${m.slot})`);
|
|
125
|
+
}
|
|
126
|
+
if (pack.messages.length > 0)
|
|
127
|
+
console.log();
|
|
128
|
+
console.log("## Permissions\n");
|
|
129
|
+
if (pack.permissions.length === 0)
|
|
130
|
+
console.log("(none required)\n");
|
|
131
|
+
for (const p of pack.permissions) {
|
|
132
|
+
if (!p.declared) {
|
|
133
|
+
console.log(`- ${p.id} — not declared in architecture/permissions.yaml`);
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
const notes = [
|
|
137
|
+
...(p.description === undefined ? [] : [p.description]),
|
|
138
|
+
...(p.ownedBy === undefined ? [] : [`owned by ${p.ownedBy}`]),
|
|
139
|
+
...(p.enforcedBy.length === 0 ? [] : [`enforced by ${p.enforcedBy.join(", ")}`]),
|
|
140
|
+
];
|
|
141
|
+
console.log(`- ${p.id}${notes.length > 0 ? ` — ${notes.join("; ")}` : ""}`);
|
|
142
|
+
}
|
|
143
|
+
if (pack.permissions.length > 0)
|
|
144
|
+
console.log();
|
|
145
|
+
console.log("## Capabilities\n");
|
|
146
|
+
if (pack.capabilities.length === 0) {
|
|
147
|
+
console.log(pack.capabilitiesVocabulary.invalid !== undefined ? "(unreadable — see above)\n" : "(none realized here)\n");
|
|
148
|
+
}
|
|
149
|
+
for (const c of pack.capabilities) {
|
|
150
|
+
const label = c.description === undefined ? c.id : `${c.id} — ${c.description}`;
|
|
151
|
+
console.log(`- ${label} (realized by: ${c.requirements.map((n) => `"${n}"`).join(", ")})`);
|
|
152
|
+
// The flows that claim the capability, fleet-wide — the answer to "what is
|
|
153
|
+
// this requirement FOR", which the requirement's own text rarely gives.
|
|
154
|
+
for (const flow of c.useCases)
|
|
155
|
+
console.log(` - flow: ${flow.title ?? flow.id} [${flow.id}] ${flow.file}`);
|
|
156
|
+
}
|
|
157
|
+
if (pack.capabilities.length > 0)
|
|
158
|
+
console.log();
|
|
159
|
+
console.log("## Use cases\n");
|
|
160
|
+
if (pack.useCaseSteps.length === 0) {
|
|
161
|
+
console.log(pack.useCaseScan.unreadable ? "(unreadable — see above)\n" : "(no declared flow draws this service)\n");
|
|
162
|
+
}
|
|
163
|
+
for (const flow of pack.useCaseSteps) {
|
|
164
|
+
console.log(`- ${flow.title ?? flow.id} [${flow.id}] ${flow.file}`);
|
|
165
|
+
for (const step of flow.steps) {
|
|
166
|
+
const label = step.title === undefined ? "" : ` '${step.title}'`;
|
|
167
|
+
console.log(` - step ${step.ordinal}${label}: ${step.source} -> ${step.target}`);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
if (pack.useCaseSteps.length > 0)
|
|
171
|
+
console.log();
|
|
172
|
+
console.log("## Landscape\n");
|
|
173
|
+
if (!pack.landscape.present)
|
|
174
|
+
console.log("(no architecture/landscape.likec4)\n");
|
|
175
|
+
else if (!pack.landscape.parses)
|
|
176
|
+
console.log("(unreadable — see above)\n");
|
|
177
|
+
else {
|
|
178
|
+
if (!pack.landscape.modelled)
|
|
179
|
+
console.log(`${pack.service} is not in the fleet map — no edge into it can be checked`);
|
|
180
|
+
for (const e of pack.landscape.inbound)
|
|
181
|
+
console.log(`- ← ${e.service}${edgeNote(e.op, e.title)}`);
|
|
182
|
+
for (const e of pack.landscape.outbound)
|
|
183
|
+
console.log(`- → ${e.service}${edgeNote(e.op, e.title)}`);
|
|
184
|
+
if (pack.landscape.modelled && pack.landscape.inbound.length === 0 && pack.landscape.outbound.length === 0) {
|
|
185
|
+
console.log("(modelled, no edges touch it)");
|
|
186
|
+
}
|
|
187
|
+
console.log();
|
|
188
|
+
}
|
|
189
|
+
console.log("## Pointers\n");
|
|
190
|
+
const mark = (present) => (present ? "present" : "absent");
|
|
191
|
+
console.log(`- runbook: ${mark(pack.pointers.runbook.present)} (${pack.pointers.runbook.path})`);
|
|
192
|
+
console.log(`- health: ${mark(pack.pointers.health.present)} (${pack.pointers.health.path})`);
|
|
193
|
+
console.log(`- adrs: ${pack.pointers.adrs.count} (${pack.pointers.adrs.path})`);
|
|
194
|
+
console.log();
|
|
195
|
+
// The narrowing is said in the heading: a narrowed pack differs from the
|
|
196
|
+
// default only by what it leaves OUT, and a reader (or a diff) must not
|
|
197
|
+
// mistake one for a fleet gone quiet.
|
|
198
|
+
console.log(pack.feature === null ? "## In flight\n" : `## In flight (narrowed to ${pack.feature})\n`);
|
|
199
|
+
if (pack.features.length === 0)
|
|
200
|
+
console.log("(no active feature touches this service)");
|
|
201
|
+
for (const f of pack.features)
|
|
202
|
+
printFeature(f, pack.service);
|
|
203
|
+
}
|
|
204
|
+
function printRequirements(label, reqs, level = "##") {
|
|
205
|
+
console.log(`${level} ${label}\n`);
|
|
206
|
+
if (reqs.length === 0)
|
|
207
|
+
console.log("(none)\n");
|
|
208
|
+
for (const r of reqs) {
|
|
209
|
+
const tag = r.kind === "BASE" ? "" : `[${r.kind}] `;
|
|
210
|
+
console.log(`${level}# Requirement: ${tag}${r.name}`);
|
|
211
|
+
if (r.text.length > 0)
|
|
212
|
+
console.log(r.text);
|
|
213
|
+
for (const s of r.scenarios) {
|
|
214
|
+
console.log(`\n${level}## Scenario: ${s.name}`);
|
|
215
|
+
// Verbatim, bullets and markdown emphasis included: these lines are the
|
|
216
|
+
// acceptance criteria.
|
|
217
|
+
for (const line of s.lines)
|
|
218
|
+
console.log(line);
|
|
219
|
+
}
|
|
220
|
+
console.log();
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
function printFeature(f, service) {
|
|
224
|
+
console.log(`### ${f.feature} (${f.path})\n`);
|
|
225
|
+
if (!f.services.includes(service)) {
|
|
226
|
+
console.log(`(no delta for ${service} — ${f.feature} touches: ${f.services.length > 0 ? f.services.join(", ") : "(no services)"})\n`);
|
|
227
|
+
}
|
|
228
|
+
// Intent prose arrives with its own headings — usually an H1 title — and
|
|
229
|
+
// pasted raw under this feature's `###` those restructure the whole pack: a
|
|
230
|
+
// second H1 splits the document, and an intent section named "Operations"
|
|
231
|
+
// collides with the pack's own. Demoted three levels (below the feature
|
|
232
|
+
// heading), capped at H6 because a seventh `#` renders as literal text.
|
|
233
|
+
// Body lines are untouched — the demotion is structural, not a paraphrase.
|
|
234
|
+
if (f.intent !== null && f.intent.length > 0)
|
|
235
|
+
console.log(`${demoteHeadings(f.intent)}\n`);
|
|
236
|
+
if (f.requirements.length > 0)
|
|
237
|
+
printRequirements("Requirement delta", f.requirements, "###");
|
|
238
|
+
if (f.archRequirements.length > 0)
|
|
239
|
+
printRequirements("Arch requirement delta", f.archRequirements, "###");
|
|
240
|
+
if (f.openapi.unreadable) {
|
|
241
|
+
// Worded like the delta brief's answer for the same failure, and without a
|
|
242
|
+
// "run `loam validate`" hint: the parser's own message is quoted and the
|
|
243
|
+
// exit code carries the failure.
|
|
244
|
+
console.log("API: openapi.yaml does not parse");
|
|
245
|
+
if (f.openapi.error !== undefined)
|
|
246
|
+
console.log(` ${f.openapi.error}`);
|
|
247
|
+
console.log();
|
|
248
|
+
}
|
|
249
|
+
else if (f.api.length > 0) {
|
|
250
|
+
console.log("API changes:");
|
|
251
|
+
for (const op of f.api) {
|
|
252
|
+
const marker = op.remove ? "REMOVE " : "";
|
|
253
|
+
console.log(`- ${marker}${op.method} ${op.path} ${op.operationId}${op.summary === null ? "" : ` — ${op.summary}`}`);
|
|
254
|
+
}
|
|
255
|
+
console.log();
|
|
256
|
+
}
|
|
257
|
+
if (f.events.unreadable) {
|
|
258
|
+
console.log("Events: asyncapi.yaml does not read as AsyncAPI 3.0");
|
|
259
|
+
if (f.events.error !== undefined)
|
|
260
|
+
console.log(` ${f.events.error}`);
|
|
261
|
+
console.log();
|
|
262
|
+
}
|
|
263
|
+
else if (f.events.changes.length > 0) {
|
|
264
|
+
console.log("Event changes:");
|
|
265
|
+
for (const m of f.events.changes) {
|
|
266
|
+
const marker = m.remove ? "REMOVE " : "";
|
|
267
|
+
const direction = m.direction === null ? "" : `${m.direction.toUpperCase()} `;
|
|
268
|
+
console.log(`- ${marker}${direction}${m.message} (${m.slot})`);
|
|
269
|
+
}
|
|
270
|
+
console.log();
|
|
271
|
+
}
|
|
272
|
+
const arch = f.architecture;
|
|
273
|
+
if (arch.errors.length > 0) {
|
|
274
|
+
console.log("Architecture: delta.likec4 has errors");
|
|
275
|
+
for (const e of arch.errors)
|
|
276
|
+
console.log(` ${e}`);
|
|
277
|
+
console.log();
|
|
278
|
+
}
|
|
279
|
+
else if (arch.isNew || arch.inbound.length > 0 || arch.outbound.length > 0) {
|
|
280
|
+
console.log("Architecture:");
|
|
281
|
+
if (arch.isNew)
|
|
282
|
+
console.log(`- NEW service — create ${service}`);
|
|
283
|
+
for (const e of arch.outbound)
|
|
284
|
+
console.log(`- → ${e.service}${edgeNote(e.op, e.title)}`);
|
|
285
|
+
for (const e of arch.inbound)
|
|
286
|
+
console.log(`- ← ${e.service}${edgeNote(e.op, e.title)}`);
|
|
287
|
+
console.log();
|
|
288
|
+
}
|
|
289
|
+
// Both interpolants passed their grammars at the boundary — the service
|
|
290
|
+
// through assertServiceId, the feature id as the CANONICAL id the
|
|
291
|
+
// enumeration derived — so the printed command parses. That property is the
|
|
292
|
+
// exact lesson explore's `--as` records: this line is assembled from data,
|
|
293
|
+
// which is the one shape test/agent-commands-runnable.test.ts cannot see.
|
|
294
|
+
console.log(`next: loam delta ${f.feature} --service ${service}\n`);
|
|
295
|
+
}
|
|
296
|
+
function edgeNote(op, title) {
|
|
297
|
+
if (op !== null)
|
|
298
|
+
return ` ${op}`;
|
|
299
|
+
return title !== null && title.length > 0 ? ` "${title}"` : "";
|
|
300
|
+
}
|
|
301
|
+
/** Every ATX heading pushed three levels down, capped at H6 — see the intent comment above. */
|
|
302
|
+
function demoteHeadings(md) {
|
|
303
|
+
return md.replace(/^(#{1,6})(?= )/gm, (h) => "#".repeat(Math.min(6, h.length + 3)));
|
|
304
|
+
}
|
|
305
|
+
//# sourceMappingURL=print.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"print.js","sourceRoot":"","sources":["../../../src/commands/context/print.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The context pack as a Markdown document on stdout — for pasting into an\n * agent's context, or reading in a terminal that renders neither.\n *\n * Rendering only. Everything printed here comes from `core/pack/`, which is\n * also what `--json` emits, so a printed section can never disagree with the\n * payload beside it. Requirement bodies and Given/When/Then lines go out\n * VERBATIM — they are the acceptance criteria, and paraphrasing them here\n * would put a second wording of the contract in front of whoever implements\n * it. The living sections use the canonical `### Requirement:` /\n * `#### Scenario:` heading levels; the in-flight blocks print the same lines\n * one level deeper, because each sits under its feature's own `###` heading.\n */\nimport { type ContextPack, type IntroducedPack } from \"../../core/pack/pack.js\";\nimport { type PackRequirement } from \"../../core/pack/living.js\";\nimport { type PackFeature } from \"../../core/pack/features.js\";\n\nexport function printPack(pack: ContextPack | IntroducedPack): void {\n console.log(`# ${pack.service} — context pack\\n`);\n if (\"introducedBy\" in pack) {\n // Said FIRST, in place of the maturity line, because every living section\n // below is about to print \"(none)\" — and a reader who has not been told why\n // takes that for a documented service with nothing in it. `missing` is not\n // printed: it names the living artifacts (`spec.md`, `model.likec4`) that\n // the feature's archive writes, and an agent told they are missing writes\n // them under services/ by hand, which forks the service before it exists.\n console.log(\n `${pack.path} · introduced by ${pack.introducedBy.join(\", \")} (in flight) — not in the living docs until it archives`,\n );\n console.log(\n `the living sections below are empty because nothing about ${pack.service} has merged yet; its documents are ${pack.feature ?? \"the feature\"}'s delta, under In flight`,\n );\n } else {\n const badge = [pack.frontmatter.status, pack.frontmatter.owner].filter((s) => s !== null);\n console.log(`${pack.path} · ${pack.maturity}${badge.length > 0 ? ` · ${badge.join(\" · \")}` : \"\"}`);\n if (pack.missing.length > 0) console.log(`missing: ${pack.missing.join(\", \")}`);\n }\n if (pack.frontmatter.last_verified !== null) console.log(`last_verified: ${pack.frontmatter.last_verified}`);\n // Under the date it qualifies: that vouch read the sections this names and\n // no others, so `verified` above covers less of the document than it looks.\n if (pack.frontmatter.vouch_scope !== null) {\n console.log(`vouch_scope: ${pack.frontmatter.vouch_scope} — the rest was not read at that vouch`);\n }\n // Per axis and named, `show`'s discipline: the sample is per FILE, so one\n // run can read a short spec.md in full and stamp a long arch.spec.md\n // sampled. Printing only the first line said `verified` over arch\n // requirements this pack then reproduced verbatim, half of them unread.\n if (pack.archSpec.vouch_scope !== null) {\n console.log(\n `archSpec.vouch_scope: ${pack.archSpec.vouch_scope} — the rest of arch.spec.md was not read at that vouch`,\n );\n }\n for (const s of pack.frontmatter.sources) console.log(`sources: ${s}`);\n console.log();\n\n // Unreadable documents are said FIRST and without hedging (explore's print\n // discipline): every empty section below could otherwise be read as \"nothing\n // here\", which is the one conclusion an unreadable document never supports.\n if (pack.landscape.present && !pack.landscape.parses) {\n // The `architecture/` PROJECT is what `parses` answers for, so the document\n // at fault is very often a SIBLING beside a landscape that reads perfectly\n // — and naming the landscape sent a reader to bytes loam read fine\n // (verification 2026-09-04). `adopt` and `validate --all` name the file; so\n // does this. The project keeps the fallback: a failure LikeC4 reports with\n // no source document behind it is still a project that does not parse.\n const broken = pack.landscape.broken;\n const named = broken.length === 0 ? \"the fleet map (architecture/)\" : broken.join(\", \");\n // `> 1`, not `=== 1`: the empty arm's subject is the singular \"fleet map\".\n const verb = broken.length > 1 ? \"do\" : \"does\";\n console.log(`! ${named} ${verb} not parse — no edge below is derived, and none is missing either\\n`);\n }\n if (pack.openapi.unreadable) {\n console.log(`! openapi.yaml does not parse — nothing here lists what ${pack.service} exposes`);\n if (pack.openapi.error !== undefined) console.log(` ${pack.openapi.error}`);\n console.log();\n }\n if (pack.asyncapi.unreadable) {\n console.log(`! asyncapi.yaml does not read as AsyncAPI 3.0 — nothing here lists what ${pack.service} publishes or consumes`);\n if (pack.asyncapi.error !== undefined) console.log(` ${pack.asyncapi.error}`);\n console.log();\n }\n // The vocabulary failures lead with the contract failures: each empties a\n // section below into something that reads as an answer (\"declared: false\"\n // on every permission, \"(none realized here)\"), and a warning printed down\n // beside the section is a warning a reader pasting the top of the pack\n // never sees.\n if (pack.permissionsVocabulary.invalid !== undefined) {\n console.log(\"! architecture/permissions.yaml does not read as a vocabulary — every permission below reports declared: false because nobody could look\");\n console.log(` ${pack.permissionsVocabulary.invalid}`);\n console.log();\n }\n if (pack.capabilitiesVocabulary.invalid !== undefined) {\n console.log(\"! architecture/capabilities.yaml does not read as a vocabulary — no capability below is derived, and none is missing either\");\n console.log(` ${pack.capabilitiesVocabulary.invalid}`);\n console.log();\n }\n for (const path of pack.capabilitiesUnread) {\n console.log(`! ${path} could not be read while joining capabilities — that service's realizations are missing from the rollup this pack filtered`);\n }\n if (pack.capabilitiesUnread.length > 0) console.log();\n if (pack.useCaseScan.unreadable) {\n console.log(\"! architecture/ does not parse as one LikeC4 project — every use case below is missing because nobody could look, not because none is drawn\");\n if (pack.useCaseScan.error !== undefined) console.log(` ${pack.useCaseScan.error}`);\n console.log();\n }\n\n printRequirements(\"Requirements\", pack.requirements);\n printRequirements(\"Arch requirements\", pack.archRequirements);\n\n console.log(\"## Operations\\n\");\n if (pack.operations.length === 0) console.log(pack.openapi.unreadable ? \"(unreadable — see above)\\n\" : \"(none)\\n\");\n for (const op of pack.operations) {\n const by = op.governedBy.length > 0\n ? `governed by ${op.governedBy.map((n) => `\"${n}\"`).join(\", \")}`\n : \"not governed by any requirement\";\n console.log(`- ${op.method} ${op.path} ${op.id} — ${by}`);\n }\n if (pack.operations.length > 0) console.log();\n\n console.log(\"## Messages\\n\");\n if (pack.messages.length === 0) console.log(pack.asyncapi.unreadable ? \"(unreadable — see above)\\n\" : \"(none)\\n\");\n for (const m of pack.messages) {\n const direction = m.direction === null ? \"declared, not wired\" : m.direction.toUpperCase();\n console.log(`- ${direction} ${m.name} (${m.slot})`);\n }\n if (pack.messages.length > 0) console.log();\n\n console.log(\"## Permissions\\n\");\n if (pack.permissions.length === 0) console.log(\"(none required)\\n\");\n for (const p of pack.permissions) {\n if (!p.declared) {\n console.log(`- ${p.id} — not declared in architecture/permissions.yaml`);\n continue;\n }\n const notes = [\n ...(p.description === undefined ? [] : [p.description]),\n ...(p.ownedBy === undefined ? [] : [`owned by ${p.ownedBy}`]),\n ...(p.enforcedBy.length === 0 ? [] : [`enforced by ${p.enforcedBy.join(\", \")}`]),\n ];\n console.log(`- ${p.id}${notes.length > 0 ? ` — ${notes.join(\"; \")}` : \"\"}`);\n }\n if (pack.permissions.length > 0) console.log();\n\n console.log(\"## Capabilities\\n\");\n if (pack.capabilities.length === 0) {\n console.log(pack.capabilitiesVocabulary.invalid !== undefined ? \"(unreadable — see above)\\n\" : \"(none realized here)\\n\");\n }\n for (const c of pack.capabilities) {\n const label = c.description === undefined ? c.id : `${c.id} — ${c.description}`;\n console.log(`- ${label} (realized by: ${c.requirements.map((n) => `\"${n}\"`).join(\", \")})`);\n // The flows that claim the capability, fleet-wide — the answer to \"what is\n // this requirement FOR\", which the requirement's own text rarely gives.\n for (const flow of c.useCases) console.log(` - flow: ${flow.title ?? flow.id} [${flow.id}] ${flow.file}`);\n }\n if (pack.capabilities.length > 0) console.log();\n\n console.log(\"## Use cases\\n\");\n if (pack.useCaseSteps.length === 0) {\n console.log(pack.useCaseScan.unreadable ? \"(unreadable — see above)\\n\" : \"(no declared flow draws this service)\\n\");\n }\n for (const flow of pack.useCaseSteps) {\n console.log(`- ${flow.title ?? flow.id} [${flow.id}] ${flow.file}`);\n for (const step of flow.steps) {\n const label = step.title === undefined ? \"\" : ` '${step.title}'`;\n console.log(` - step ${step.ordinal}${label}: ${step.source} -> ${step.target}`);\n }\n }\n if (pack.useCaseSteps.length > 0) console.log();\n\n console.log(\"## Landscape\\n\");\n if (!pack.landscape.present) console.log(\"(no architecture/landscape.likec4)\\n\");\n else if (!pack.landscape.parses) console.log(\"(unreadable — see above)\\n\");\n else {\n if (!pack.landscape.modelled) console.log(`${pack.service} is not in the fleet map — no edge into it can be checked`);\n for (const e of pack.landscape.inbound) console.log(`- ← ${e.service}${edgeNote(e.op, e.title)}`);\n for (const e of pack.landscape.outbound) console.log(`- → ${e.service}${edgeNote(e.op, e.title)}`);\n if (pack.landscape.modelled && pack.landscape.inbound.length === 0 && pack.landscape.outbound.length === 0) {\n console.log(\"(modelled, no edges touch it)\");\n }\n console.log();\n }\n\n console.log(\"## Pointers\\n\");\n const mark = (present: boolean): string => (present ? \"present\" : \"absent\");\n console.log(`- runbook: ${mark(pack.pointers.runbook.present)} (${pack.pointers.runbook.path})`);\n console.log(`- health: ${mark(pack.pointers.health.present)} (${pack.pointers.health.path})`);\n console.log(`- adrs: ${pack.pointers.adrs.count} (${pack.pointers.adrs.path})`);\n console.log();\n\n // The narrowing is said in the heading: a narrowed pack differs from the\n // default only by what it leaves OUT, and a reader (or a diff) must not\n // mistake one for a fleet gone quiet.\n console.log(pack.feature === null ? \"## In flight\\n\" : `## In flight (narrowed to ${pack.feature})\\n`);\n if (pack.features.length === 0) console.log(\"(no active feature touches this service)\");\n for (const f of pack.features) printFeature(f, pack.service);\n}\n\nfunction printRequirements(label: string, reqs: PackRequirement[], level = \"##\"): void {\n console.log(`${level} ${label}\\n`);\n if (reqs.length === 0) console.log(\"(none)\\n\");\n for (const r of reqs) {\n const tag = r.kind === \"BASE\" ? \"\" : `[${r.kind}] `;\n console.log(`${level}# Requirement: ${tag}${r.name}`);\n if (r.text.length > 0) console.log(r.text);\n for (const s of r.scenarios) {\n console.log(`\\n${level}## Scenario: ${s.name}`);\n // Verbatim, bullets and markdown emphasis included: these lines are the\n // acceptance criteria.\n for (const line of s.lines) console.log(line);\n }\n console.log();\n }\n}\n\nfunction printFeature(f: PackFeature, service: string): void {\n console.log(`### ${f.feature} (${f.path})\\n`);\n if (!f.services.includes(service)) {\n console.log(`(no delta for ${service} — ${f.feature} touches: ${f.services.length > 0 ? f.services.join(\", \") : \"(no services)\"})\\n`);\n }\n // Intent prose arrives with its own headings — usually an H1 title — and\n // pasted raw under this feature's `###` those restructure the whole pack: a\n // second H1 splits the document, and an intent section named \"Operations\"\n // collides with the pack's own. Demoted three levels (below the feature\n // heading), capped at H6 because a seventh `#` renders as literal text.\n // Body lines are untouched — the demotion is structural, not a paraphrase.\n if (f.intent !== null && f.intent.length > 0) console.log(`${demoteHeadings(f.intent)}\\n`);\n if (f.requirements.length > 0) printRequirements(\"Requirement delta\", f.requirements, \"###\");\n if (f.archRequirements.length > 0) printRequirements(\"Arch requirement delta\", f.archRequirements, \"###\");\n\n if (f.openapi.unreadable) {\n // Worded like the delta brief's answer for the same failure, and without a\n // \"run `loam validate`\" hint: the parser's own message is quoted and the\n // exit code carries the failure.\n console.log(\"API: openapi.yaml does not parse\");\n if (f.openapi.error !== undefined) console.log(` ${f.openapi.error}`);\n console.log();\n } else if (f.api.length > 0) {\n console.log(\"API changes:\");\n for (const op of f.api) {\n const marker = op.remove ? \"REMOVE \" : \"\";\n console.log(`- ${marker}${op.method} ${op.path} ${op.operationId}${op.summary === null ? \"\" : ` — ${op.summary}`}`);\n }\n console.log();\n }\n\n if (f.events.unreadable) {\n console.log(\"Events: asyncapi.yaml does not read as AsyncAPI 3.0\");\n if (f.events.error !== undefined) console.log(` ${f.events.error}`);\n console.log();\n } else if (f.events.changes.length > 0) {\n console.log(\"Event changes:\");\n for (const m of f.events.changes) {\n const marker = m.remove ? \"REMOVE \" : \"\";\n const direction = m.direction === null ? \"\" : `${m.direction.toUpperCase()} `;\n console.log(`- ${marker}${direction}${m.message} (${m.slot})`);\n }\n console.log();\n }\n\n const arch = f.architecture;\n if (arch.errors.length > 0) {\n console.log(\"Architecture: delta.likec4 has errors\");\n for (const e of arch.errors) console.log(` ${e}`);\n console.log();\n } else if (arch.isNew || arch.inbound.length > 0 || arch.outbound.length > 0) {\n console.log(\"Architecture:\");\n if (arch.isNew) console.log(`- NEW service — create ${service}`);\n for (const e of arch.outbound) console.log(`- → ${e.service}${edgeNote(e.op, e.title)}`);\n for (const e of arch.inbound) console.log(`- ← ${e.service}${edgeNote(e.op, e.title)}`);\n console.log();\n }\n\n // Both interpolants passed their grammars at the boundary — the service\n // through assertServiceId, the feature id as the CANONICAL id the\n // enumeration derived — so the printed command parses. That property is the\n // exact lesson explore's `--as` records: this line is assembled from data,\n // which is the one shape test/agent-commands-runnable.test.ts cannot see.\n console.log(`next: loam delta ${f.feature} --service ${service}\\n`);\n}\n\nfunction edgeNote(op: string | null, title: string | null): string {\n if (op !== null) return ` ${op}`;\n return title !== null && title.length > 0 ? ` \"${title}\"` : \"\";\n}\n\n/** Every ATX heading pushed three levels down, capped at H6 — see the intent comment above. */\nfunction demoteHeadings(md: string): string {\n return md.replace(/^(#{1,6})(?= )/gm, (h) => \"#\".repeat(Math.min(6, h.length + 3)));\n}\n"]}
|