@ybotok/loam 0.1.0-beta.2 → 0.2.0-alpha.1
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 +2570 -61
- package/COMPARISON.md +80 -63
- package/CONTRIBUTING.md +84 -0
- package/MIGRATING-from-OpenSpec.md +213 -54
- package/QUICKSTART.md +125 -0
- package/README.md +450 -150
- package/ROADMAP.md +494 -0
- package/SCHEMA.md +2362 -245
- package/SECURITY.md +21 -3
- package/WORKFLOW.md +701 -0
- package/dist/cli.js +113 -19
- package/dist/cli.js.map +1 -1
- package/dist/commands/adopt/adopt.js +209 -0
- package/dist/commands/adopt/adopt.js.map +1 -0
- package/dist/commands/adopt/render.js +268 -0
- package/dist/commands/adopt/render.js.map +1 -0
- package/dist/commands/archive/archive.js +77 -0
- package/dist/commands/archive/archive.js.map +1 -0
- package/dist/commands/archive/plan/contracts/asyncapi.js +178 -0
- package/dist/commands/archive/plan/contracts/asyncapi.js.map +1 -0
- package/dist/commands/archive/plan/contracts/openapi.js +159 -0
- package/dist/commands/archive/plan/contracts/openapi.js.map +1 -0
- package/dist/commands/archive/plan/gate.js +317 -0
- package/dist/commands/archive/plan/gate.js.map +1 -0
- package/dist/commands/archive/plan/landscape.js +161 -0
- package/dist/commands/archive/plan/landscape.js.map +1 -0
- package/dist/commands/archive/plan/refusal.js +111 -0
- package/dist/commands/archive/plan/refusal.js.map +1 -0
- package/dist/commands/archive/plan/specs.js +237 -0
- package/dist/commands/archive/plan/specs.js.map +1 -0
- package/dist/commands/archive/plan/state.js +27 -0
- package/dist/commands/archive/plan/state.js.map +1 -0
- package/dist/commands/archive/run.js +251 -0
- package/dist/commands/archive/run.js.map +1 -0
- package/dist/commands/context/context.js +99 -0
- package/dist/commands/context/context.js.map +1 -0
- package/dist/commands/context/print.js +283 -0
- package/dist/commands/context/print.js.map +1 -0
- package/dist/commands/delta/delta.js +279 -0
- package/dist/commands/delta/delta.js.map +1 -0
- package/dist/commands/delta/print.js +205 -0
- package/dist/commands/delta/print.js.map +1 -0
- package/dist/commands/dependencies.js +9 -7
- package/dist/commands/dependencies.js.map +1 -1
- package/dist/commands/diff/diff.js +93 -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 +5 -4
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/explain/explain.js +151 -0
- package/dist/commands/explain/explain.js.map +1 -0
- package/dist/commands/explore.js +29 -24
- package/dist/commands/explore.js.map +1 -1
- package/dist/commands/gate/gate.js +115 -0
- package/dist/commands/gate/gate.js.map +1 -0
- package/dist/commands/gate/print.js +54 -0
- package/dist/commands/gate/print.js.map +1 -0
- package/dist/commands/gherkin/commit.js +146 -0
- package/dist/commands/gherkin/commit.js.map +1 -0
- package/dist/commands/gherkin/gherkin.js +246 -0
- package/dist/commands/gherkin/gherkin.js.map +1 -0
- package/dist/commands/gherkin/reconcile.js +149 -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 +28 -0
- package/dist/commands/init/first-hour.js.map +1 -0
- package/dist/commands/{init.js → init/init.js} +146 -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 +82 -14
- package/dist/commands/instructions.js.map +1 -1
- package/dist/commands/list/campaign/campaign.js +65 -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 +157 -0
- package/dist/commands/list/json.js.map +1 -0
- package/dist/commands/list/list.js +343 -0
- package/dist/commands/list/list.js.map +1 -0
- package/dist/commands/list/print.js +301 -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/views.js +105 -0
- package/dist/commands/list/views.js.map +1 -0
- package/dist/commands/mcp/dispatch.js +183 -0
- package/dist/commands/mcp/dispatch.js.map +1 -0
- package/dist/commands/mcp/mcp.js +34 -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 +170 -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 +142 -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 +91 -0
- package/dist/commands/migrate-openspec/openspec/decisions.js.map +1 -0
- package/dist/commands/migrate-openspec/openspec/error.js +19 -0
- package/dist/commands/migrate-openspec/openspec/error.js.map +1 -0
- package/dist/commands/migrate-openspec/openspec/mapping.js +170 -0
- package/dist/commands/migrate-openspec/openspec/mapping.js.map +1 -0
- package/dist/commands/migrate-openspec/openspec/paths.js +43 -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/commit.js +76 -0
- package/dist/commands/new/commit.js.map +1 -0
- package/dist/commands/new/new.js +283 -0
- package/dist/commands/new/new.js.map +1 -0
- package/dist/commands/new/templates.js +355 -0
- package/dist/commands/new/templates.js.map +1 -0
- package/dist/commands/open.js +203 -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} +11 -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 +275 -0
- package/dist/commands/rebase/rebase.js.map +1 -0
- package/dist/commands/seed/commit.js +192 -0
- package/dist/commands/seed/commit.js.map +1 -0
- package/dist/commands/seed/plan.js +133 -0
- package/dist/commands/seed/plan.js.map +1 -0
- package/dist/commands/seed/seed.js +172 -0
- package/dist/commands/seed/seed.js.map +1 -0
- package/dist/commands/show/feature.js +178 -0
- package/dist/commands/show/feature.js.map +1 -0
- package/dist/commands/show/marks.js +24 -0
- package/dist/commands/show/marks.js.map +1 -0
- package/dist/commands/{show.js → show/service.js} +63 -152
- package/dist/commands/show/service.js.map +1 -0
- package/dist/commands/show/show.js +77 -0
- package/dist/commands/show/show.js.map +1 -0
- package/dist/commands/status/json.js +45 -0
- package/dist/commands/status/json.js.map +1 -0
- package/dist/commands/status/print.js +157 -0
- package/dist/commands/status/print.js.map +1 -0
- package/dist/commands/status/status.js +119 -0
- package/dist/commands/status/status.js.map +1 -0
- package/dist/commands/steps/steps.js +189 -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 +265 -0
- package/dist/commands/subsystem/move.js.map +1 -0
- package/dist/commands/subsystem/query.js +115 -0
- package/dist/commands/subsystem/query.js.map +1 -0
- package/dist/commands/subsystem/subsystem.js +101 -0
- package/dist/commands/subsystem/subsystem.js.map +1 -0
- package/dist/commands/subsystem/sync.js +103 -0
- package/dist/commands/subsystem/sync.js.map +1 -0
- package/dist/commands/subsystem/txn/txn.js +94 -0
- package/dist/commands/subsystem/txn/txn.js.map +1 -0
- package/dist/commands/subsystem/txn/views.js +70 -0
- package/dist/commands/subsystem/txn/views.js.map +1 -0
- package/dist/commands/unarchive/manifest.js +160 -0
- package/dist/commands/unarchive/manifest.js.map +1 -0
- package/dist/commands/{unarchive.js → unarchive/restore.js} +47 -160
- package/dist/commands/unarchive/restore.js.map +1 -0
- package/dist/commands/unarchive/unarchive.js +67 -0
- package/dist/commands/unarchive/unarchive.js.map +1 -0
- package/dist/commands/validate/arch-coverage.js +194 -0
- package/dist/commands/validate/arch-coverage.js.map +1 -0
- package/dist/commands/validate/checks/fleet-shape.js +296 -0
- package/dist/commands/validate/checks/fleet-shape.js.map +1 -0
- package/dist/commands/validate/checks/health-deps.js +55 -0
- package/dist/commands/validate/checks/health-deps.js.map +1 -0
- package/dist/commands/validate/checks/requirements.js +254 -0
- package/dist/commands/validate/checks/requirements.js.map +1 -0
- package/dist/commands/validate/checks/sources.js +76 -0
- package/dist/commands/validate/checks/sources.js.map +1 -0
- package/dist/commands/validate/checks/vocabulary.js +31 -0
- package/dist/commands/validate/checks/vocabulary.js.map +1 -0
- package/dist/commands/validate/feature.js +216 -0
- package/dist/commands/validate/feature.js.map +1 -0
- package/dist/commands/validate/fleet/census.js +69 -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 +353 -0
- package/dist/commands/validate/fleet/landscape.js.map +1 -0
- package/dist/commands/validate/fleet/load.js +52 -0
- package/dist/commands/validate/fleet/load.js.map +1 -0
- package/dist/commands/validate/fleet/obligations.js +236 -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 +63 -0
- package/dist/commands/validate/fleet/scorecard/print.js.map +1 -0
- package/dist/commands/validate/fleet/scorecard/scorecard.js +156 -0
- package/dist/commands/validate/fleet/scorecard/scorecard.js.map +1 -0
- package/dist/commands/validate/fleet/usecases/capability-tag.js +94 -0
- package/dist/commands/validate/fleet/usecases/capability-tag.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/usecases/requirement-tag.js +95 -0
- package/dist/commands/validate/fleet/usecases/requirement-tag.js.map +1 -0
- package/dist/commands/validate/fleet/usecases/steps.js +197 -0
- package/dist/commands/validate/fleet/usecases/steps.js.map +1 -0
- package/dist/commands/validate/fleet/usecases/usecases.js +99 -0
- package/dist/commands/validate/fleet/usecases/usecases.js.map +1 -0
- package/dist/commands/validate/fleet/views/ids.js +40 -0
- package/dist/commands/validate/fleet/views/ids.js.map +1 -0
- package/dist/commands/validate/fleet/views/stale.js +59 -0
- package/dist/commands/validate/fleet/views/stale.js.map +1 -0
- package/dist/commands/validate/links/corpus.js +92 -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/report.js +269 -0
- package/dist/commands/validate/report.js.map +1 -0
- package/dist/commands/validate/service/api.js +338 -0
- package/dist/commands/validate/service/api.js.map +1 -0
- package/dist/commands/validate/service/events/events.js +219 -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 +131 -0
- package/dist/commands/validate/service/evidence-pins.js.map +1 -0
- package/dist/commands/validate/service/service.js +250 -0
- package/dist/commands/validate/service/service.js.map +1 -0
- package/dist/commands/validate/service/specs.js +219 -0
- package/dist/commands/validate/service/specs.js.map +1 -0
- package/dist/commands/validate/service/spine.js +113 -0
- package/dist/commands/validate/service/spine.js.map +1 -0
- package/dist/commands/validate/validate.js +338 -0
- package/dist/commands/validate/validate.js.map +1 -0
- package/dist/commands/verify/cross/diff.js +182 -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 +72 -0
- package/dist/commands/verify/evidence/read.js.map +1 -0
- package/dist/commands/verify/frozen.js +241 -0
- package/dist/commands/verify/frozen.js.map +1 -0
- package/dist/commands/verify/record.js +226 -0
- package/dist/commands/verify/record.js.map +1 -0
- package/dist/commands/verify/report.js +223 -0
- package/dist/commands/verify/report.js.map +1 -0
- package/dist/commands/verify/results.js +246 -0
- package/dist/commands/verify/results.js.map +1 -0
- package/dist/commands/verify/verify.js +217 -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 +271 -0
- package/dist/commands/vouch/pack/print.js.map +1 -0
- package/dist/commands/vouch/pack/sections.js +142 -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 +285 -0
- package/dist/commands/vouch/run.js.map +1 -0
- package/dist/commands/vouch/sample/plan.js +125 -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 +123 -0
- package/dist/commands/vouch/vet/verify.js.map +1 -0
- package/dist/commands/vouch/vouch.js +176 -0
- package/dist/commands/vouch/vouch.js.map +1 -0
- package/dist/core/agent/agents-md/artifacts.js +220 -0
- package/dist/core/agent/agents-md/artifacts.js.map +1 -0
- package/dist/core/agent/agents-md/command-map.js +324 -0
- package/dist/core/agent/agents-md/command-map.js.map +1 -0
- package/dist/core/agent/agents-md/cycle.js +165 -0
- package/dist/core/agent/agents-md/cycle.js.map +1 -0
- package/dist/core/agent/agents-md/map/explain.js +34 -0
- package/dist/core/agent/agents-md/map/explain.js.map +1 -0
- package/dist/core/agent/agents-md/map/lenses/context.js +41 -0
- package/dist/core/agent/agents-md/map/lenses/context.js.map +1 -0
- package/dist/core/agent/agents-md/map/lenses/diff.js +46 -0
- package/dist/core/agent/agents-md/map/lenses/diff.js.map +1 -0
- package/dist/core/agent/agents-md/map/lenses/gate.js +57 -0
- package/dist/core/agent/agents-md/map/lenses/gate.js.map +1 -0
- package/dist/core/agent/agents-md/map/mcp.js +41 -0
- package/dist/core/agent/agents-md/map/mcp.js.map +1 -0
- package/dist/core/agent/agents-md/map/status.js +62 -0
- package/dist/core/agent/agents-md/map/status.js.map +1 -0
- package/dist/core/agent/agents-md/map/subsystem.js +32 -0
- package/dist/core/agent/agents-md/map/subsystem.js.map +1 -0
- package/dist/core/agent/agents-md/map/usecases.js +60 -0
- package/dist/core/agent/agents-md/map/usecases.js.map +1 -0
- package/dist/core/agent/agents-md/refusals.js +246 -0
- package/dist/core/agent/agents-md/refusals.js.map +1 -0
- package/dist/core/agent/agents-md/shipped/archive-gate.js +98 -0
- package/dist/core/agent/agents-md/shipped/archive-gate.js.map +1 -0
- package/dist/core/agent/agents-md/spine.js +40 -0
- package/dist/core/agent/agents-md/spine.js.map +1 -0
- package/dist/core/agent/agents-md.js +170 -0
- package/dist/core/agent/agents-md.js.map +1 -0
- package/dist/core/agent/agents-stamp.js +155 -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 +259 -0
- package/dist/core/agent/scaffold.js.map +1 -0
- package/dist/core/agent/support/report.js +103 -0
- package/dist/core/agent/support/report.js.map +1 -0
- package/dist/core/agent/tools/dialects.js +150 -0
- package/dist/core/agent/tools/dialects.js.map +1 -0
- package/dist/core/agent/tools/registry.js +228 -0
- package/dist/core/agent/tools/registry.js.map +1 -0
- package/dist/core/agent/workflows/adopt.js +133 -0
- package/dist/core/agent/workflows/adopt.js.map +1 -0
- package/dist/core/agent/workflows/check.js +334 -0
- package/dist/core/agent/workflows/check.js.map +1 -0
- package/dist/core/agent/workflows/closing.js +262 -0
- package/dist/core/agent/workflows/closing.js.map +1 -0
- package/dist/core/agent/workflows/feature.js +105 -0
- package/dist/core/agent/workflows/feature.js.map +1 -0
- package/dist/core/agent/workflows/implement.js +105 -0
- package/dist/core/agent/workflows/implement.js.map +1 -0
- package/dist/core/agent/workflows/reference/authoring.js +209 -0
- package/dist/core/agent/workflows/reference/authoring.js.map +1 -0
- package/dist/core/agent/workflows/reference/codes.js +65 -0
- package/dist/core/agent/workflows/reference/codes.js.map +1 -0
- package/dist/core/agent/workflows/reference/done-check.js +188 -0
- package/dist/core/agent/workflows/reference/done-check.js.map +1 -0
- package/dist/core/agent/workflows/reference/reference.js +16 -0
- package/dist/core/agent/workflows/reference/reference.js.map +1 -0
- package/dist/core/agent/workflows/reference/spine.js +297 -0
- package/dist/core/agent/workflows/reference/spine.js.map +1 -0
- package/dist/core/asyncapi/baseline/plan.js +110 -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 +141 -0
- package/dist/core/asyncapi/digest.js.map +1 -0
- package/dist/core/asyncapi/merge/components.js +91 -0
- package/dist/core/asyncapi/merge/components.js.map +1 -0
- package/dist/core/asyncapi/merge/error.js +33 -0
- package/dist/core/asyncapi/merge/error.js.map +1 -0
- package/dist/core/asyncapi/merge/markers.js +308 -0
- package/dist/core/asyncapi/merge/markers.js.map +1 -0
- package/dist/core/asyncapi/merge/merge.js +215 -0
- package/dist/core/asyncapi/merge/merge.js.map +1 -0
- package/dist/core/asyncapi/merge/pin.js +107 -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 +239 -0
- package/dist/core/asyncapi/read.js.map +1 -0
- package/dist/core/brief/brief.js +225 -0
- package/dist/core/brief/brief.js.map +1 -0
- package/dist/core/brief/checks.js +250 -0
- package/dist/core/brief/checks.js.map +1 -0
- package/dist/core/brief/landscape.js +194 -0
- package/dist/core/brief/landscape.js.map +1 -0
- package/dist/core/brief/targets.js +226 -0
- package/dist/core/brief/targets.js.map +1 -0
- package/dist/core/brief/unchecked.js +47 -0
- package/dist/core/brief/unchecked.js.map +1 -0
- package/dist/core/c4/arch.js +282 -0
- package/dist/core/c4/arch.js.map +1 -0
- package/dist/core/c4/likec4.js +88 -0
- package/dist/core/c4/likec4.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 +57 -0
- package/dist/core/c4/parsed/values.js.map +1 -0
- package/dist/core/c4/parsed/view-ids.js +75 -0
- package/dist/core/c4/parsed/view-ids.js.map +1 -0
- package/dist/core/c4/project/architecture.js +45 -0
- package/dist/core/c4/project/architecture.js.map +1 -0
- package/dist/core/c4/project/documents.js +58 -0
- package/dist/core/c4/project/documents.js.map +1 -0
- package/dist/core/c4/project/load.js +183 -0
- package/dist/core/c4/project/load.js.map +1 -0
- package/dist/core/c4/resolve/service.js +113 -0
- package/dist/core/c4/resolve/service.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 +109 -0
- package/dist/core/c4/seed/template.js.map +1 -0
- package/dist/core/c4/source-mask.js +82 -0
- package/dist/core/c4/source-mask.js.map +1 -0
- package/dist/core/c4/source-scan.js +227 -0
- package/dist/core/c4/source-scan.js.map +1 -0
- package/dist/core/c4/splice/authored-source.js +101 -0
- package/dist/core/c4/splice/authored-source.js.map +1 -0
- package/dist/core/c4/splice/contract.js +10 -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/edges.js +36 -0
- package/dist/core/c4/splice/identity/edges.js.map +1 -0
- package/dist/core/c4/splice/landscape-merge.js +269 -0
- package/dist/core/c4/splice/landscape-merge.js.map +1 -0
- package/dist/core/c4/splice/placement.js +194 -0
- package/dist/core/c4/splice/placement.js.map +1 -0
- package/dist/core/c4/workspace.js +172 -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 +50 -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 +342 -0
- package/dist/core/capabilities/findings.js.map +1 -0
- package/dist/core/capabilities/realizes/findings.js +181 -0
- package/dist/core/capabilities/realizes/findings.js.map +1 -0
- package/dist/core/capabilities/realizes/join.js +143 -0
- package/dist/core/capabilities/realizes/join.js.map +1 -0
- package/dist/core/capabilities/rollup.js +199 -0
- package/dist/core/capabilities/rollup.js.map +1 -0
- package/dist/core/capabilities/tree.js +126 -0
- package/dist/core/capabilities/tree.js.map +1 -0
- package/dist/core/capabilities/usecase-join.js +277 -0
- package/dist/core/capabilities/usecase-join.js.map +1 -0
- package/dist/core/coherence/authoring/scaffold.js +177 -0
- package/dist/core/coherence/authoring/scaffold.js.map +1 -0
- package/dist/core/coherence/authoring/sentinels.js +74 -0
- package/dist/core/coherence/authoring/sentinels.js.map +1 -0
- package/dist/core/coherence/coherence.js +251 -0
- package/dist/core/coherence/coherence.js.map +1 -0
- package/dist/core/coherence/declared.js +269 -0
- package/dist/core/coherence/declared.js.map +1 -0
- package/dist/core/coherence/events/declared.js +206 -0
- package/dist/core/coherence/events/declared.js.map +1 -0
- package/dist/core/coherence/events/events.js +204 -0
- package/dist/core/coherence/events/events.js.map +1 -0
- package/dist/core/coherence/events/grades.js +166 -0
- package/dist/core/coherence/events/grades.js.map +1 -0
- package/dist/core/coherence/events/lookups.js +122 -0
- package/dist/core/coherence/events/lookups.js.map +1 -0
- package/dist/core/coherence/events/merged.js +40 -0
- package/dist/core/coherence/events/merged.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 +155 -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/conflict-markers.js +60 -0
- package/dist/core/conflict-markers.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 +296 -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/diff/base-git.js +148 -0
- package/dist/core/diff/base-git.js.map +1 -0
- package/dist/core/diff/base-state.js +209 -0
- package/dist/core/diff/base-state.js.map +1 -0
- package/dist/core/diff/current-state.js +96 -0
- package/dist/core/diff/current-state.js.map +1 -0
- package/dist/core/diff/scope/changed-paths.js +188 -0
- package/dist/core/diff/scope/changed-paths.js.map +1 -0
- package/dist/core/diff/semantic.js +243 -0
- package/dist/core/diff/semantic.js.map +1 -0
- package/dist/core/diff/victims.js +247 -0
- package/dist/core/diff/victims.js.map +1 -0
- package/dist/core/docs.js +59 -55
- package/dist/core/docs.js.map +1 -1
- package/dist/core/doctor/agents.js +222 -0
- package/dist/core/doctor/agents.js.map +1 -0
- package/dist/core/doctor/config.js +135 -0
- package/dist/core/doctor/config.js.map +1 -0
- package/dist/core/doctor/doctor.js +275 -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/residue.js +110 -0
- package/dist/core/doctor/residue.js.map +1 -0
- package/dist/core/document/apply.js +77 -0
- package/dist/core/document/apply.js.map +1 -0
- package/dist/core/{frontmatter.js → document/frontmatter.js} +48 -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 +263 -0
- package/dist/core/document/parse.js.map +1 -0
- package/dist/core/document/scenarios.js +221 -0
- package/dist/core/document/scenarios.js.map +1 -0
- package/dist/core/document/spec.js +241 -0
- package/dist/core/document/spec.js.map +1 -0
- package/dist/core/{config.js → envelope/config.js} +79 -18
- package/dist/core/envelope/config.js.map +1 -0
- package/dist/core/envelope/json.js +175 -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 +175 -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 +181 -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.js +144 -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.js → explore/explore.js} +50 -101
- package/dist/core/explore/explore.js.map +1 -0
- package/dist/core/fleet-context.js +132 -77
- package/dist/core/fleet-context.js.map +1 -1
- package/dist/core/gate/checks.js +201 -0
- package/dist/core/gate/checks.js.map +1 -0
- package/dist/core/gate/partners.js +205 -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 +113 -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 +234 -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 +106 -0
- package/dist/core/glossary/delta.js.map +1 -0
- package/dist/core/glossary/tree.js +86 -0
- package/dist/core/glossary/tree.js.map +1 -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/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} +18 -4
- package/dist/core/kernel/path-safety.js.map +1 -0
- package/dist/core/kernel/records.js.map +1 -0
- package/dist/core/links/backlinks.js +68 -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 +104 -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 +236 -0
- package/dist/core/links/parse.js.map +1 -0
- package/dist/core/mcp/argv.js +111 -0
- package/dist/core/mcp/argv.js.map +1 -0
- package/dist/core/mcp/author-tools.js +72 -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 +314 -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 +166 -0
- package/dist/core/openapi/baseline/gate.js.map +1 -0
- package/dist/core/openapi/baseline/plan.js +112 -0
- package/dist/core/openapi/baseline/plan.js.map +1 -0
- package/dist/core/openapi/baseline/record.js +175 -0
- package/dist/core/openapi/baseline/record.js.map +1 -0
- package/dist/core/openapi/depth.js +122 -0
- package/dist/core/openapi/depth.js.map +1 -0
- package/dist/core/openapi/digest.js +189 -0
- package/dist/core/openapi/digest.js.map +1 -0
- package/dist/core/{openapi.js → openapi/doc.js} +44 -106
- package/dist/core/openapi/doc.js.map +1 -0
- package/dist/core/openapi/merge/components.js +234 -0
- package/dist/core/openapi/merge/components.js.map +1 -0
- package/dist/core/openapi/merge/error.js +26 -0
- package/dist/core/openapi/merge/error.js.map +1 -0
- package/dist/core/openapi/merge/markers.js +208 -0
- package/dist/core/openapi/merge/markers.js.map +1 -0
- package/dist/core/openapi/merge/merge.js +256 -0
- package/dist/core/openapi/merge/merge.js.map +1 -0
- package/dist/core/openapi/merge/pin.js +128 -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 +221 -0
- package/dist/core/openspec/inventory.js.map +1 -0
- package/dist/core/openspec/model/mapping.js +76 -0
- package/dist/core/openspec/model/mapping.js.map +1 -0
- package/dist/core/openspec/model/model.js +65 -0
- package/dist/core/openspec/model/model.js.map +1 -0
- package/dist/core/openspec/scan/changes.js +235 -0
- package/dist/core/openspec/scan/changes.js.map +1 -0
- package/dist/core/openspec/scan/config.js +200 -0
- package/dist/core/openspec/scan/config.js.map +1 -0
- package/dist/core/openspec/scan/shape.js +260 -0
- package/dist/core/openspec/scan/shape.js.map +1 -0
- package/dist/core/openspec/scan/walk.js +133 -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 +118 -0
- package/dist/core/pack/living.js.map +1 -0
- package/dist/core/pack/pack.js +76 -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/provenance/findings.js +208 -0
- package/dist/core/provenance/findings.js.map +1 -0
- package/dist/core/provenance/git.js +225 -0
- package/dist/core/provenance/git.js.map +1 -0
- package/dist/core/provenance/gitq/moves.js +182 -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 +263 -0
- package/dist/core/provenance/sources.js.map +1 -0
- package/dist/core/provenance/stamp.js +232 -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 +192 -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 +236 -0
- package/dist/core/repo/paths.js.map +1 -0
- package/dist/core/repo/repo.js +248 -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 +52 -0
- package/dist/core/repo/tree/find.js.map +1 -0
- package/dist/core/repo/tree/fs.js +64 -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/views.js +172 -0
- package/dist/core/repo/tree/views.js.map +1 -0
- package/dist/core/repo/tree/walk.js +234 -0
- package/dist/core/repo/tree/walk.js.map +1 -0
- package/dist/core/results.js +99 -2
- package/dist/core/results.js.map +1 -1
- package/dist/core/scaffold/landscape.js +131 -0
- package/dist/core/scaffold/landscape.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 +241 -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 +206 -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 +98 -0
- package/dist/core/staging/recovery/intent.js.map +1 -0
- package/dist/core/staging/recovery/recover.js +126 -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.js +202 -0
- package/dist/core/staging/snapshot.js.map +1 -0
- package/dist/core/staging/txn/forward.js +171 -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 +49 -0
- package/dist/core/status/actions/execution.js.map +1 -0
- package/dist/core/status/contracts.js +102 -0
- package/dist/core/status/contracts.js.map +1 -0
- package/dist/core/status/feature/artifacts.js +171 -0
- package/dist/core/status/feature/artifacts.js.map +1 -0
- package/dist/core/status/feature/feature.js +207 -0
- package/dist/core/status/feature/feature.js.map +1 -0
- package/dist/core/status/feature/next.js +150 -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/fleet/fleet.js +187 -0
- package/dist/core/status/fleet/fleet.js.map +1 -0
- package/dist/core/status/fleet/next.js +207 -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 +201 -0
- package/dist/core/status/verification.js.map +1 -0
- package/dist/core/usecases/capability.js +169 -0
- package/dist/core/usecases/capability.js.map +1 -0
- package/dist/core/usecases/delta/claims.js +116 -0
- package/dist/core/usecases/delta/claims.js.map +1 -0
- package/dist/core/usecases/delta/flows.js +103 -0
- package/dist/core/usecases/delta/flows.js.map +1 -0
- package/dist/core/usecases/delta/overlay.js +235 -0
- package/dist/core/usecases/delta/overlay.js.map +1 -0
- package/dist/core/usecases/fleet.js +137 -0
- package/dist/core/usecases/fleet.js.map +1 -0
- package/dist/core/usecases/operations.js +111 -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/touch.js +101 -0
- package/dist/core/usecases/touch.js.map +1 -0
- package/dist/core/verify/answers.js +173 -0
- package/dist/core/verify/answers.js.map +1 -0
- package/dist/core/verify/build.js +150 -0
- package/dist/core/verify/build.js.map +1 -0
- package/dist/core/verify/checklist.js +201 -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/file.js +257 -0
- package/dist/core/verify/file.js.map +1 -0
- package/dist/core/verify/pins/lint.js +157 -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/record.js +142 -0
- package/dist/core/verify/record.js.map +1 -0
- package/dist/core/verify/store/commit.js +89 -0
- package/dist/core/verify/store/commit.js.map +1 -0
- package/dist/core/verify/store/render.js +57 -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 +55 -0
- package/dist/core/vocabulary/issue.js.map +1 -0
- package/dist/core/vocabulary/maturity.js +145 -0
- package/dist/core/vocabulary/maturity.js.map +1 -0
- package/dist/core/{report.js → vocabulary/report.js} +30 -2
- 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 +189 -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 +280 -0
- package/examples/docs/architecture/obligations.yaml +23 -0
- package/examples/docs/architecture/permissions.yaml +50 -0
- package/examples/docs/architecture/subsystems.likec4 +11 -0
- package/examples/docs/architecture/usecases/order-notification.likec4 +65 -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 +129 -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 +28 -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 +70 -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 +9 -0
- package/examples/docs/loam.json +3 -0
- package/examples/docs/services/checkout-web/model.likec4 +109 -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 +127 -0
- package/examples/docs/services/order-service/asyncapi.yaml +108 -0
- package/examples/docs/services/order-service/health.yaml +57 -0
- package/examples/docs/services/order-service/model.likec4 +138 -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 +73 -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 +67 -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 +117 -0
- package/examples/docs/services/platform/identity-service/health.yaml +70 -0
- package/examples/docs/services/platform/identity-service/model.likec4 +83 -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 +199 -0
- package/examples/docs/services/platform/notification-service/health.yaml +35 -0
- package/examples/docs/services/platform/notification-service/model.likec4 +118 -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 -291
- 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.map +0 -1
- package/dist/commands/status.js +0 -254
- package/dist/commands/status.js.map +0 -1
- package/dist/commands/unarchive.js.map +0 -1
- package/dist/commands/validate.js +0 -1591
- 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 -343
- package/dist/commands/vouch.js.map +0 -1
- package/dist/core/agent.js +0 -2065
- package/dist/core/agent.js.map +0 -1
- package/dist/core/agents-stamp.js +0 -68
- 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/brief.js +0 -733
- 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 -559
- package/dist/core/doctor.js.map +0 -1
- package/dist/core/document-bytes.js.map +0 -1
- 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 -479
- 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 -720
- package/dist/core/provenance.js.map +0 -1
- package/dist/core/records.js.map +0 -1
- package/dist/core/repo.js +0 -436
- package/dist/core/repo.js.map +0 -1
- package/dist/core/report.js.map +0 -1
- package/dist/core/spec.js +0 -481
- 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 -1104
- package/dist/core/status.js.map +0 -1
- package/dist/core/steps.js +0 -72
- package/dist/core/steps.js.map +0 -1
- package/dist/core/verify.js +0 -807
- package/dist/core/verify.js.map +0 -1
- package/dist/core/version.js.map +0 -1
- /package/dist/core/{concurrency.js → kernel/concurrency.js} +0 -0
- /package/dist/core/{records.js → kernel/records.js} +0 -0
|
@@ -0,0 +1,283 @@
|
|
|
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
|
+
const badge = [pack.frontmatter.status, pack.frontmatter.owner].filter((s) => s !== null);
|
|
20
|
+
console.log(`${pack.path} · ${pack.maturity}${badge.length > 0 ? ` · ${badge.join(" · ")}` : ""}`);
|
|
21
|
+
if (pack.missing.length > 0)
|
|
22
|
+
console.log(`missing: ${pack.missing.join(", ")}`);
|
|
23
|
+
if (pack.frontmatter.last_verified !== null)
|
|
24
|
+
console.log(`last_verified: ${pack.frontmatter.last_verified}`);
|
|
25
|
+
// Under the date it qualifies: that vouch read the sections this names and
|
|
26
|
+
// no others, so `verified` above covers less of the document than it looks.
|
|
27
|
+
if (pack.frontmatter.vouch_scope !== null) {
|
|
28
|
+
console.log(`vouch_scope: ${pack.frontmatter.vouch_scope} — the rest was not read at that vouch`);
|
|
29
|
+
}
|
|
30
|
+
// Per axis and named, `show`'s discipline: the sample is per FILE, so one
|
|
31
|
+
// run can read a short spec.md in full and stamp a long arch.spec.md
|
|
32
|
+
// sampled. Printing only the first line said `verified` over arch
|
|
33
|
+
// requirements this pack then reproduced verbatim, half of them unread.
|
|
34
|
+
if (pack.archSpec.vouch_scope !== null) {
|
|
35
|
+
console.log(`archSpec.vouch_scope: ${pack.archSpec.vouch_scope} — the rest of arch.spec.md was not read at that vouch`);
|
|
36
|
+
}
|
|
37
|
+
for (const s of pack.frontmatter.sources)
|
|
38
|
+
console.log(`sources: ${s}`);
|
|
39
|
+
console.log();
|
|
40
|
+
// Unreadable documents are said FIRST and without hedging (explore's print
|
|
41
|
+
// discipline): every empty section below could otherwise be read as "nothing
|
|
42
|
+
// here", which is the one conclusion an unreadable document never supports.
|
|
43
|
+
if (pack.landscape.present && !pack.landscape.parses) {
|
|
44
|
+
console.log("! architecture/landscape.likec4 does not parse — no edge below is derived, and none is missing either\n");
|
|
45
|
+
}
|
|
46
|
+
if (pack.openapi.unreadable) {
|
|
47
|
+
console.log(`! openapi.yaml does not parse — nothing here lists what ${pack.service} exposes`);
|
|
48
|
+
if (pack.openapi.error !== undefined)
|
|
49
|
+
console.log(` ${pack.openapi.error}`);
|
|
50
|
+
console.log();
|
|
51
|
+
}
|
|
52
|
+
if (pack.asyncapi.unreadable) {
|
|
53
|
+
console.log(`! asyncapi.yaml does not parse — nothing here lists what ${pack.service} publishes or consumes`);
|
|
54
|
+
if (pack.asyncapi.error !== undefined)
|
|
55
|
+
console.log(` ${pack.asyncapi.error}`);
|
|
56
|
+
console.log();
|
|
57
|
+
}
|
|
58
|
+
// The vocabulary failures lead with the contract failures: each empties a
|
|
59
|
+
// section below into something that reads as an answer ("declared: false"
|
|
60
|
+
// on every permission, "(none realized here)"), and a warning printed down
|
|
61
|
+
// beside the section is a warning a reader pasting the top of the pack
|
|
62
|
+
// never sees.
|
|
63
|
+
if (pack.permissionsVocabulary.invalid !== undefined) {
|
|
64
|
+
console.log("! architecture/permissions.yaml does not read as a vocabulary — every permission below reports declared: false because nobody could look");
|
|
65
|
+
console.log(` ${pack.permissionsVocabulary.invalid}`);
|
|
66
|
+
console.log();
|
|
67
|
+
}
|
|
68
|
+
if (pack.capabilitiesVocabulary.invalid !== undefined) {
|
|
69
|
+
console.log("! architecture/capabilities.yaml does not read as a vocabulary — no capability below is derived, and none is missing either");
|
|
70
|
+
console.log(` ${pack.capabilitiesVocabulary.invalid}`);
|
|
71
|
+
console.log();
|
|
72
|
+
}
|
|
73
|
+
for (const path of pack.capabilitiesUnread) {
|
|
74
|
+
console.log(`! ${path} could not be read while joining capabilities — that service's realizations are missing from the rollup this pack filtered`);
|
|
75
|
+
}
|
|
76
|
+
if (pack.capabilitiesUnread.length > 0)
|
|
77
|
+
console.log();
|
|
78
|
+
if (pack.useCaseScan.unreadable) {
|
|
79
|
+
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");
|
|
80
|
+
if (pack.useCaseScan.error !== undefined)
|
|
81
|
+
console.log(` ${pack.useCaseScan.error}`);
|
|
82
|
+
console.log();
|
|
83
|
+
}
|
|
84
|
+
printRequirements("Requirements", pack.requirements);
|
|
85
|
+
printRequirements("Arch requirements", pack.archRequirements);
|
|
86
|
+
console.log("## Operations\n");
|
|
87
|
+
if (pack.operations.length === 0)
|
|
88
|
+
console.log(pack.openapi.unreadable ? "(unreadable — see above)\n" : "(none)\n");
|
|
89
|
+
for (const op of pack.operations) {
|
|
90
|
+
const by = op.governedBy.length > 0
|
|
91
|
+
? `governed by ${op.governedBy.map((n) => `"${n}"`).join(", ")}`
|
|
92
|
+
: "not governed by any requirement";
|
|
93
|
+
console.log(`- ${op.method} ${op.path} ${op.id} — ${by}`);
|
|
94
|
+
}
|
|
95
|
+
if (pack.operations.length > 0)
|
|
96
|
+
console.log();
|
|
97
|
+
console.log("## Messages\n");
|
|
98
|
+
if (pack.messages.length === 0)
|
|
99
|
+
console.log(pack.asyncapi.unreadable ? "(unreadable — see above)\n" : "(none)\n");
|
|
100
|
+
for (const m of pack.messages) {
|
|
101
|
+
const direction = m.direction === null ? "declared, not wired" : m.direction.toUpperCase();
|
|
102
|
+
console.log(`- ${direction} ${m.name} (${m.slot})`);
|
|
103
|
+
}
|
|
104
|
+
if (pack.messages.length > 0)
|
|
105
|
+
console.log();
|
|
106
|
+
console.log("## Permissions\n");
|
|
107
|
+
if (pack.permissions.length === 0)
|
|
108
|
+
console.log("(none required)\n");
|
|
109
|
+
for (const p of pack.permissions) {
|
|
110
|
+
if (!p.declared) {
|
|
111
|
+
console.log(`- ${p.id} — not declared in architecture/permissions.yaml`);
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
const notes = [
|
|
115
|
+
...(p.description === undefined ? [] : [p.description]),
|
|
116
|
+
...(p.ownedBy === undefined ? [] : [`owned by ${p.ownedBy}`]),
|
|
117
|
+
...(p.enforcedBy.length === 0 ? [] : [`enforced by ${p.enforcedBy.join(", ")}`]),
|
|
118
|
+
];
|
|
119
|
+
console.log(`- ${p.id}${notes.length > 0 ? ` — ${notes.join("; ")}` : ""}`);
|
|
120
|
+
}
|
|
121
|
+
if (pack.permissions.length > 0)
|
|
122
|
+
console.log();
|
|
123
|
+
console.log("## Capabilities\n");
|
|
124
|
+
if (pack.capabilities.length === 0) {
|
|
125
|
+
console.log(pack.capabilitiesVocabulary.invalid !== undefined ? "(unreadable — see above)\n" : "(none realized here)\n");
|
|
126
|
+
}
|
|
127
|
+
for (const c of pack.capabilities) {
|
|
128
|
+
const label = c.description === undefined ? c.id : `${c.id} — ${c.description}`;
|
|
129
|
+
console.log(`- ${label} (realized by: ${c.requirements.map((n) => `"${n}"`).join(", ")})`);
|
|
130
|
+
// The flows that claim the capability, fleet-wide — the answer to "what is
|
|
131
|
+
// this requirement FOR", which the requirement's own text rarely gives.
|
|
132
|
+
for (const flow of c.useCases)
|
|
133
|
+
console.log(` - flow: ${flow.title ?? flow.id} [${flow.id}] ${flow.file}`);
|
|
134
|
+
}
|
|
135
|
+
if (pack.capabilities.length > 0)
|
|
136
|
+
console.log();
|
|
137
|
+
console.log("## Use cases\n");
|
|
138
|
+
if (pack.useCaseSteps.length === 0) {
|
|
139
|
+
console.log(pack.useCaseScan.unreadable ? "(unreadable — see above)\n" : "(no declared flow draws this service)\n");
|
|
140
|
+
}
|
|
141
|
+
for (const flow of pack.useCaseSteps) {
|
|
142
|
+
console.log(`- ${flow.title ?? flow.id} [${flow.id}] ${flow.file}`);
|
|
143
|
+
for (const step of flow.steps) {
|
|
144
|
+
const label = step.title === undefined ? "" : ` '${step.title}'`;
|
|
145
|
+
console.log(` - step ${step.ordinal}${label}: ${step.source} -> ${step.target}`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
if (pack.useCaseSteps.length > 0)
|
|
149
|
+
console.log();
|
|
150
|
+
console.log("## Landscape\n");
|
|
151
|
+
if (!pack.landscape.present)
|
|
152
|
+
console.log("(no architecture/landscape.likec4)\n");
|
|
153
|
+
else if (!pack.landscape.parses)
|
|
154
|
+
console.log("(unreadable — see above)\n");
|
|
155
|
+
else {
|
|
156
|
+
if (!pack.landscape.modelled)
|
|
157
|
+
console.log(`${pack.service} is not in the fleet map — no edge into it can be checked`);
|
|
158
|
+
for (const e of pack.landscape.inbound)
|
|
159
|
+
console.log(`- ← ${e.service}${edgeNote(e.op, e.title)}`);
|
|
160
|
+
for (const e of pack.landscape.outbound)
|
|
161
|
+
console.log(`- → ${e.service}${edgeNote(e.op, e.title)}`);
|
|
162
|
+
if (pack.landscape.modelled && pack.landscape.inbound.length === 0 && pack.landscape.outbound.length === 0) {
|
|
163
|
+
console.log("(modelled, no edges touch it)");
|
|
164
|
+
}
|
|
165
|
+
console.log();
|
|
166
|
+
}
|
|
167
|
+
console.log("## Pointers\n");
|
|
168
|
+
const mark = (present) => (present ? "present" : "absent");
|
|
169
|
+
console.log(`- runbook: ${mark(pack.pointers.runbook.present)} (${pack.pointers.runbook.path})`);
|
|
170
|
+
console.log(`- health: ${mark(pack.pointers.health.present)} (${pack.pointers.health.path})`);
|
|
171
|
+
console.log(`- adrs: ${pack.pointers.adrs.count} (${pack.pointers.adrs.path})`);
|
|
172
|
+
console.log();
|
|
173
|
+
// The narrowing is said in the heading: a narrowed pack differs from the
|
|
174
|
+
// default only by what it leaves OUT, and a reader (or a diff) must not
|
|
175
|
+
// mistake one for a fleet gone quiet.
|
|
176
|
+
console.log(pack.feature === null ? "## In flight\n" : `## In flight (narrowed to ${pack.feature})\n`);
|
|
177
|
+
if (pack.features.length === 0)
|
|
178
|
+
console.log("(no active feature touches this service)");
|
|
179
|
+
for (const f of pack.features)
|
|
180
|
+
printFeature(f, pack.service);
|
|
181
|
+
}
|
|
182
|
+
function printRequirements(label, reqs, level = "##") {
|
|
183
|
+
console.log(`${level} ${label}\n`);
|
|
184
|
+
if (reqs.length === 0)
|
|
185
|
+
console.log("(none)\n");
|
|
186
|
+
for (const r of reqs) {
|
|
187
|
+
const tag = r.kind === "BASE" ? "" : `[${r.kind}] `;
|
|
188
|
+
console.log(`${level}# Requirement: ${tag}${r.name}`);
|
|
189
|
+
if (r.text.length > 0)
|
|
190
|
+
console.log(r.text);
|
|
191
|
+
for (const s of r.scenarios) {
|
|
192
|
+
console.log(`\n${level}## Scenario: ${s.name}`);
|
|
193
|
+
// Verbatim, bullets and markdown emphasis included: these lines are the
|
|
194
|
+
// acceptance criteria.
|
|
195
|
+
for (const line of s.lines)
|
|
196
|
+
console.log(line);
|
|
197
|
+
}
|
|
198
|
+
console.log();
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
function printFeature(f, service) {
|
|
202
|
+
console.log(`### ${f.feature} (${f.path})\n`);
|
|
203
|
+
if (!f.services.includes(service)) {
|
|
204
|
+
console.log(`(no delta for ${service} — ${f.feature} touches: ${f.services.length > 0 ? f.services.join(", ") : "(no services)"})\n`);
|
|
205
|
+
}
|
|
206
|
+
// Intent prose arrives with its own headings — usually an H1 title — and
|
|
207
|
+
// pasted raw under this feature's `###` those restructure the whole pack: a
|
|
208
|
+
// second H1 splits the document, and an intent section named "Operations"
|
|
209
|
+
// collides with the pack's own. Demoted three levels (below the feature
|
|
210
|
+
// heading), capped at H6 because a seventh `#` renders as literal text.
|
|
211
|
+
// Body lines are untouched — the demotion is structural, not a paraphrase.
|
|
212
|
+
if (f.intent !== null && f.intent.length > 0)
|
|
213
|
+
console.log(`${demoteHeadings(f.intent)}\n`);
|
|
214
|
+
if (f.requirements.length > 0)
|
|
215
|
+
printRequirements("Requirement delta", f.requirements, "###");
|
|
216
|
+
if (f.archRequirements.length > 0)
|
|
217
|
+
printRequirements("Arch requirement delta", f.archRequirements, "###");
|
|
218
|
+
if (f.openapi.unreadable) {
|
|
219
|
+
// Worded like the delta brief's answer for the same failure, and without a
|
|
220
|
+
// "run `loam validate`" hint: the parser's own message is quoted and the
|
|
221
|
+
// exit code carries the failure.
|
|
222
|
+
console.log("API: openapi.yaml does not parse");
|
|
223
|
+
if (f.openapi.error !== undefined)
|
|
224
|
+
console.log(` ${f.openapi.error}`);
|
|
225
|
+
console.log();
|
|
226
|
+
}
|
|
227
|
+
else if (f.api.length > 0) {
|
|
228
|
+
console.log("API changes:");
|
|
229
|
+
for (const op of f.api) {
|
|
230
|
+
const marker = op.remove ? "REMOVE " : "";
|
|
231
|
+
console.log(`- ${marker}${op.method} ${op.path} ${op.operationId}${op.summary === null ? "" : ` — ${op.summary}`}`);
|
|
232
|
+
}
|
|
233
|
+
console.log();
|
|
234
|
+
}
|
|
235
|
+
if (f.events.unreadable) {
|
|
236
|
+
console.log("Events: asyncapi.yaml does not parse");
|
|
237
|
+
if (f.events.error !== undefined)
|
|
238
|
+
console.log(` ${f.events.error}`);
|
|
239
|
+
console.log();
|
|
240
|
+
}
|
|
241
|
+
else if (f.events.changes.length > 0) {
|
|
242
|
+
console.log("Event changes:");
|
|
243
|
+
for (const m of f.events.changes) {
|
|
244
|
+
const marker = m.remove ? "REMOVE " : "";
|
|
245
|
+
const direction = m.direction === null ? "" : `${m.direction.toUpperCase()} `;
|
|
246
|
+
console.log(`- ${marker}${direction}${m.message} (${m.slot})`);
|
|
247
|
+
}
|
|
248
|
+
console.log();
|
|
249
|
+
}
|
|
250
|
+
const arch = f.architecture;
|
|
251
|
+
if (arch.errors.length > 0) {
|
|
252
|
+
console.log("Architecture: delta.likec4 has errors");
|
|
253
|
+
for (const e of arch.errors)
|
|
254
|
+
console.log(` ${e}`);
|
|
255
|
+
console.log();
|
|
256
|
+
}
|
|
257
|
+
else if (arch.isNew || arch.inbound.length > 0 || arch.outbound.length > 0) {
|
|
258
|
+
console.log("Architecture:");
|
|
259
|
+
if (arch.isNew)
|
|
260
|
+
console.log(`- NEW service — create ${service}`);
|
|
261
|
+
for (const e of arch.outbound)
|
|
262
|
+
console.log(`- → ${e.service}${edgeNote(e.op, e.title)}`);
|
|
263
|
+
for (const e of arch.inbound)
|
|
264
|
+
console.log(`- ← ${e.service}${edgeNote(e.op, e.title)}`);
|
|
265
|
+
console.log();
|
|
266
|
+
}
|
|
267
|
+
// Both interpolants passed their grammars at the boundary — the service
|
|
268
|
+
// through assertServiceId, the feature id as the CANONICAL id the
|
|
269
|
+
// enumeration derived — so the printed command parses. That property is the
|
|
270
|
+
// exact lesson explore's `--as` records: this line is assembled from data,
|
|
271
|
+
// which is the one shape test/agent-commands-runnable.test.ts cannot see.
|
|
272
|
+
console.log(`next: loam delta ${f.feature} --service ${service}\n`);
|
|
273
|
+
}
|
|
274
|
+
function edgeNote(op, title) {
|
|
275
|
+
if (op !== null)
|
|
276
|
+
return ` ${op}`;
|
|
277
|
+
return title !== null && title.length > 0 ? ` "${title}"` : "";
|
|
278
|
+
}
|
|
279
|
+
/** Every ATX heading pushed three levels down, capped at H6 — see the intent comment above. */
|
|
280
|
+
function demoteHeadings(md) {
|
|
281
|
+
return md.replace(/^(#{1,6})(?= )/gm, (h) => "#".repeat(Math.min(6, h.length + 3)));
|
|
282
|
+
}
|
|
283
|
+
//# 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 } 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): void {\n console.log(`# ${pack.service} — context pack\\n`);\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 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 console.log(\"! architecture/landscape.likec4 does 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 parse — 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 parse\");\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"]}
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
|
+
import { loadConfig } from "../../core/envelope/config.js";
|
|
4
|
+
import { InvalidIdError, assertServiceId } from "../../core/kernel/ids/service.js";
|
|
5
|
+
import { emitJson, emitJsonError, fail, repoPath, reportNoConfig, sayExplain } from "../../core/envelope/json.js";
|
|
6
|
+
import { loadFile } from "../../core/c4/likec4.js";
|
|
7
|
+
import { compareIds, nearestIds } from "../../core/repo/entries.js";
|
|
8
|
+
import { featurePaths, featureSpecPaths } from "../../core/repo/paths.js";
|
|
9
|
+
import { missingFeatureMessage, resolveFeature } from "../../core/repo/repo.js";
|
|
10
|
+
import { parseRequirements } from "../../core/document/parse.js";
|
|
11
|
+
import {} from "../../core/document/spec.js";
|
|
12
|
+
import { stripFrontmatter } from "../../core/document/frontmatter.js";
|
|
13
|
+
import { apiChanges } from "../../core/projection/api.js";
|
|
14
|
+
import { eventChanges } from "../../core/projection/events.js";
|
|
15
|
+
import { archSlice, introducedServices, livingServices } from "../../core/projection/arch-slice.js";
|
|
16
|
+
import { useCaseBlastRadius } from "../../core/usecases/touch.js";
|
|
17
|
+
import { featureCapabilityDeltas } from "../../core/capabilities/delta/tree.js";
|
|
18
|
+
import { capabilityDeltaSummaries } from "../../core/capabilities/delta/summary.js";
|
|
19
|
+
import { printApi, printArchSlice, printCapabilities, printEvents, printRequirements, printUseCases } from "./print.js";
|
|
20
|
+
import { indent } from "./print.js";
|
|
21
|
+
export function registerDelta(program) {
|
|
22
|
+
program
|
|
23
|
+
.command("delta")
|
|
24
|
+
.argument("<featureId>", "feature id, e.g. FEAT-101")
|
|
25
|
+
.description("Project a feature onto a service: why + requirement delta + C4 changes")
|
|
26
|
+
.option("--service <id>", "service to project onto (defaults to the configured service)")
|
|
27
|
+
.option("--json", "emit the machine contract instead of the human view")
|
|
28
|
+
.action(async (featureId, opts) => {
|
|
29
|
+
const json = opts.json === true;
|
|
30
|
+
const loaded = await loadConfig();
|
|
31
|
+
if (loaded.kind !== "loaded") {
|
|
32
|
+
reportNoConfig(json, loaded);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const config = loaded.config;
|
|
36
|
+
// The id grammar first, and on the RAW argument: `--service ../../etc`
|
|
37
|
+
// reaches `featureSpecPaths` and reads from outside the feature directory.
|
|
38
|
+
// One grammar for the whole tool (core/kernel/ids/service.ts).
|
|
39
|
+
if (opts.service !== undefined) {
|
|
40
|
+
try {
|
|
41
|
+
assertServiceId(opts.service, "--service");
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
if (!(err instanceof InvalidIdError))
|
|
45
|
+
throw err;
|
|
46
|
+
fail(json, "invalid-option", err.message);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// The feature is resolved BEFORE the service is chosen, because every
|
|
51
|
+
// sentence about the service ("which ones does this feature touch?") is
|
|
52
|
+
// only answerable once the feature is known.
|
|
53
|
+
const feature = await resolveFeature(config.docsDir, featureId, "exclude");
|
|
54
|
+
if (!feature) {
|
|
55
|
+
fail(json, "unknown-target", await missingFeatureMessage(config.docsDir, featureId));
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
// Canonical id from here on — the delta's tags carry `#FEAT-5`, so a raw
|
|
59
|
+
// `FEAT-5-slug` argument used to empty the architecture slice silently.
|
|
60
|
+
const { id } = feature;
|
|
61
|
+
const paths = featurePaths(feature.dir);
|
|
62
|
+
const deltaDoc = existsSync(paths.delta) ? await loadFile(paths.delta) : null;
|
|
63
|
+
// Services the feature speaks about at all: one with a requirement delta,
|
|
64
|
+
// or one its C4 delta introduces. This is the list a refusal quotes.
|
|
65
|
+
const featureServices = [
|
|
66
|
+
...new Set([...feature.services, ...introducedServices(deltaDoc, id)]),
|
|
67
|
+
].sort(compareIds);
|
|
68
|
+
const service = opts.service ?? config.service;
|
|
69
|
+
if (!service) {
|
|
70
|
+
// The refusal NAMES the choices. "No service. Pass --service <id>" told
|
|
71
|
+
// the reader the shape of the flag and nothing about the answer, so the
|
|
72
|
+
// next step was always to go list the feature's specs/ by hand — and an
|
|
73
|
+
// agent had no way to recover at all. The list rides the JSON envelope
|
|
74
|
+
// for the same reason.
|
|
75
|
+
const message = `No service to project ${id} onto. Pass --service <id> or set 'service' in loam.json.` +
|
|
76
|
+
(featureServices.length === 0
|
|
77
|
+
? ` ${id} carries no per-service delta yet.`
|
|
78
|
+
: ` ${id} touches: ${featureServices.join(", ")}.`);
|
|
79
|
+
if (json)
|
|
80
|
+
emitJsonError("invalid-option", message, { feature: id, services: featureServices });
|
|
81
|
+
else {
|
|
82
|
+
console.error(message);
|
|
83
|
+
// This arm refuses by hand because the envelope carries `services` as
|
|
84
|
+
// data, which `fail()` has no room for — so the code and its lookup
|
|
85
|
+
// are asked for explicitly, with the same code the branch above
|
|
86
|
+
// emits. Without it this was one of the two refusals that most needed
|
|
87
|
+
// `loam explain` and had no way to name it.
|
|
88
|
+
sayExplain("invalid-option");
|
|
89
|
+
process.exitCode = 1;
|
|
90
|
+
}
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
// A service nobody has heard of produces a perfectly plausible EMPTY
|
|
94
|
+
// report — no requirements, no edges, "no architecture change" — which an
|
|
95
|
+
// agent consuming this as a task brief reads as "nothing to do here".
|
|
96
|
+
// A typo must never be indistinguishable from a finished service.
|
|
97
|
+
const living = await livingServices(config.docsDir);
|
|
98
|
+
if (!featureServices.includes(service) && !living.includes(service)) {
|
|
99
|
+
const near = nearestIds(service, [...new Set([...featureServices, ...living])]);
|
|
100
|
+
fail(json, "unknown-target", `No service '${service}': it is neither a services/${service}/ in the docs repo nor a service ${id} touches` +
|
|
101
|
+
(featureServices.length === 0 ? "" : ` (${featureServices.join(", ")})`) +
|
|
102
|
+
(near.length === 0 ? "." : ` — did you mean ${near.map((n) => `'${n}'`).join(" or ")}?`));
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
// Why — business intent
|
|
106
|
+
const intent = existsSync(paths.intent)
|
|
107
|
+
? stripFrontmatter(await readFile(paths.intent, "utf8")).trim()
|
|
108
|
+
: null;
|
|
109
|
+
// Requirement delta for this service (OpenSpec style), business and arch:
|
|
110
|
+
// the same projection covers both axes, in the same shape, so the payload
|
|
111
|
+
// stays one task — the arch requirements are the integration/ops half the
|
|
112
|
+
// business ones never mention.
|
|
113
|
+
const specPaths = featureSpecPaths(feature.dir, service);
|
|
114
|
+
const reqs = existsSync(specPaths.spec)
|
|
115
|
+
? parseRequirements(await readFile(specPaths.spec, "utf8"))
|
|
116
|
+
: [];
|
|
117
|
+
const archReqs = existsSync(specPaths.archSpec)
|
|
118
|
+
? parseRequirements(await readFile(specPaths.archSpec, "utf8"))
|
|
119
|
+
: [];
|
|
120
|
+
// The contract axis. Until now no command surfaced it at all: the feature's
|
|
121
|
+
// openapi.yaml was read by validate and by archive, and the one command
|
|
122
|
+
// whose output IS the implementation task never mentioned it — so "add the
|
|
123
|
+
// endpoint" was the half of the work the brief left out.
|
|
124
|
+
const api = await apiChanges(specPaths.openapi);
|
|
125
|
+
// The event axis, same reasoning: a feature's asyncapi.yaml is merged by
|
|
126
|
+
// archive and graded by validate, so the brief must name what it changes
|
|
127
|
+
// — a message the implementer was never told to publish is the same
|
|
128
|
+
// dropped work as an endpoint the brief left out.
|
|
129
|
+
const events = await eventChanges(specPaths.asyncapi);
|
|
130
|
+
// C4 architecture slice. The fleet union mirrors coherence's: services/
|
|
131
|
+
// plus the feature's own specs/ names, so the slice and the validator
|
|
132
|
+
// resolve a container-targeted edge to the same owner.
|
|
133
|
+
const fleet = new Set([...living, ...featureServices]);
|
|
134
|
+
const arch = archSlice(deltaDoc, service, id, fleet);
|
|
135
|
+
// The use-case axis, and the one section here that is a fact about the
|
|
136
|
+
// FLEET rather than about the feature's own files: which declared business
|
|
137
|
+
// flows already run through this service, and at which hop. An implementer
|
|
138
|
+
// handed "add the endpoint" and not told that step 4 of Checkout is the
|
|
139
|
+
// caller has to go find that out, and on a fleet of a hundred nobody does.
|
|
140
|
+
//
|
|
141
|
+
// The fleet set is `living ∪ featureServices`, the same union `archSlice`
|
|
142
|
+
// resolves with, so a service this feature INTRODUCES resolves to itself
|
|
143
|
+
// rather than to a container's title. And `useCaseBlastRadius` gates its
|
|
144
|
+
// own load: a docs repo whose architecture/ never mentions the reserved
|
|
145
|
+
// tag prefix costs a readdir and a few file reads here, not a LikeC4
|
|
146
|
+
// workspace — which is what keeps this command usable inside
|
|
147
|
+
// /loam-implement's inner loop.
|
|
148
|
+
const useCases = await useCaseBlastRadius({
|
|
149
|
+
docsDir: config.docsDir,
|
|
150
|
+
known: fleet,
|
|
151
|
+
services: new Set([service]),
|
|
152
|
+
});
|
|
153
|
+
// The business axis. Like the use-case section above it is a fact about
|
|
154
|
+
// the FEATURE rather than about this service's own files, and it is here
|
|
155
|
+
// for the sharper version of that section's reason: a capability delta
|
|
156
|
+
// NAMES NO SERVICE, so projecting the feature onto a service would drop
|
|
157
|
+
// it entirely — and the implementer handed "add the endpoint" would never
|
|
158
|
+
// learn which business promise the requirement they are about to write is
|
|
159
|
+
// supposed to keep. `Realizes: <capability>#<id>` is the line that says
|
|
160
|
+
// so, it is written on the SERVICE requirement, and the id in it is the
|
|
161
|
+
// one thing here that cannot be guessed.
|
|
162
|
+
//
|
|
163
|
+
// Not narrowed by `--service`, deliberately: the promise is what the
|
|
164
|
+
// whole feature is for, and narrowing it would report a capability-only
|
|
165
|
+
// feature as having nothing to say about every service in turn. One
|
|
166
|
+
// `existsSync` for a fleet that has not adopted the axis.
|
|
167
|
+
const capabilities = await capabilityDeltaSummaries((await featureCapabilityDeltas(feature.dir)).docs, async (path) => parseRequirements(await readFile(path, "utf8")));
|
|
168
|
+
// An unparseable delta.likec4 empties the C4 slice, and a consumer
|
|
169
|
+
// reading this projection as a task brief — the JSON payload and the
|
|
170
|
+
// printed view alike — would take that as "no architecture change": the
|
|
171
|
+
// vacuously-green pattern. The output stays as informative as ever (and
|
|
172
|
+
// `ok` stays true under --json: the command ran); the exit code is what
|
|
173
|
+
// stops a pipeline from building on it, so it is set BEFORE the format
|
|
174
|
+
// fork — the guard is about the delta, not about how it is rendered.
|
|
175
|
+
//
|
|
176
|
+
// The two contract axes fail the same way and earn the same guard: an
|
|
177
|
+
// openapi.yaml or asyncapi.yaml that does not parse projects as an empty
|
|
178
|
+
// change list. `validate --feature` does catch both these days
|
|
179
|
+
// (`openapi.invalid` / `asyncapi.invalid` on the feature's own files),
|
|
180
|
+
// but the guard stays this command's own: the brief is consumed by
|
|
181
|
+
// agents that never ran validate, so the exit code must carry the
|
|
182
|
+
// failure itself.
|
|
183
|
+
if (arch.errors.length > 0 || api.unreadable || events.unreadable)
|
|
184
|
+
process.exitCode = 1;
|
|
185
|
+
if (json) {
|
|
186
|
+
const reqJson = (r) => ({
|
|
187
|
+
kind: r.kind,
|
|
188
|
+
id: r.id,
|
|
189
|
+
name: r.name,
|
|
190
|
+
text: r.text.join("\n").trim(),
|
|
191
|
+
operations: r.operations,
|
|
192
|
+
covers: r.covers,
|
|
193
|
+
// Scenarios go out verbatim: they are the acceptance criteria and the
|
|
194
|
+
// source for the tests whoever picks this up is expected to write.
|
|
195
|
+
scenarios: r.scenarios.map((s) => ({ name: s.name, lines: s.lines })),
|
|
196
|
+
});
|
|
197
|
+
emitJson({
|
|
198
|
+
command: "delta",
|
|
199
|
+
feature: id,
|
|
200
|
+
service,
|
|
201
|
+
services: featureServices,
|
|
202
|
+
path: repoPath(config.docsDir, feature.dir),
|
|
203
|
+
intent,
|
|
204
|
+
requirements: reqs.map(reqJson),
|
|
205
|
+
// Same shape, separate section: an arch requirement's scenarios are
|
|
206
|
+
// integration/ops tests, and a consumer must not have to parse prose
|
|
207
|
+
// to tell the two apart.
|
|
208
|
+
archRequirements: archReqs.map(reqJson),
|
|
209
|
+
api: api.changes,
|
|
210
|
+
// `api` stays exactly the operations array it has always been — a
|
|
211
|
+
// consumer indexing it must not have to learn a new shape — so the
|
|
212
|
+
// readability of the document rides alongside as its own key,
|
|
213
|
+
// spelled the way `loam show` already spells it for a living
|
|
214
|
+
// contract. Additive, which the envelope permits (core/envelope/json.ts).
|
|
215
|
+
openapi: {
|
|
216
|
+
unreadable: api.unreadable,
|
|
217
|
+
...(api.error === undefined ? {} : { error: api.error }),
|
|
218
|
+
},
|
|
219
|
+
// The event axis arrives after the api/openapi pair settled its
|
|
220
|
+
// split shape, so it is one additive key carrying both halves:
|
|
221
|
+
// the declarations and the document's readability.
|
|
222
|
+
events: {
|
|
223
|
+
changes: events.changes,
|
|
224
|
+
unreadable: events.unreadable,
|
|
225
|
+
...(events.error === undefined ? {} : { error: events.error }),
|
|
226
|
+
},
|
|
227
|
+
architecture: arch,
|
|
228
|
+
// Additive, which the envelope permits (core/envelope/json.ts), and
|
|
229
|
+
// deliberately NOT wired into the exit-code guard above. The three
|
|
230
|
+
// conditions there are about the FEATURE's own documents; an
|
|
231
|
+
// `architecture/` that does not parse is a pre-existing fleet defect
|
|
232
|
+
// `validate` already reports as `landscape.invalid`, and making every
|
|
233
|
+
// `loam delta` in such a repo exit 1 would be a new gate wearing the
|
|
234
|
+
// clothes of a new field. `unreadable` is how this payload says it
|
|
235
|
+
// could not look.
|
|
236
|
+
useCases: {
|
|
237
|
+
unreadable: useCases.unreadable,
|
|
238
|
+
...(useCases.error === undefined ? {} : { error: useCases.error }),
|
|
239
|
+
flows: useCases.flows,
|
|
240
|
+
},
|
|
241
|
+
// Additive, and an empty array rather than an absent key for the same
|
|
242
|
+
// reason `loam show`'s is: a consumer must not have to tell "this
|
|
243
|
+
// feature changes no capability" from "this loam does not report
|
|
244
|
+
// them". The shape is `show`'s, verbatim — the two commands are read
|
|
245
|
+
// side by side, and a second shape for one idea is a second thing to
|
|
246
|
+
// learn.
|
|
247
|
+
capabilities: capabilities.map((c) => ({
|
|
248
|
+
id: c.id,
|
|
249
|
+
path: repoPath(config.docsDir, c.spec),
|
|
250
|
+
added: c.added,
|
|
251
|
+
modified: c.modified,
|
|
252
|
+
removed: c.removed,
|
|
253
|
+
promises: c.promises,
|
|
254
|
+
})),
|
|
255
|
+
});
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
console.log(`${id} · ${service}\n`);
|
|
259
|
+
if (intent) {
|
|
260
|
+
console.log(indent(intent, " "));
|
|
261
|
+
console.log();
|
|
262
|
+
}
|
|
263
|
+
if (existsSync(specPaths.spec))
|
|
264
|
+
printRequirements(reqs, "Requirements");
|
|
265
|
+
else
|
|
266
|
+
console.log("Requirements: (none for this service)\n");
|
|
267
|
+
if (existsSync(specPaths.archSpec))
|
|
268
|
+
printRequirements(archReqs, "Arch requirements");
|
|
269
|
+
if (existsSync(specPaths.openapi))
|
|
270
|
+
printApi(api);
|
|
271
|
+
if (existsSync(specPaths.asyncapi))
|
|
272
|
+
printEvents(events);
|
|
273
|
+
if (existsSync(paths.delta))
|
|
274
|
+
printArchSlice(arch, service);
|
|
275
|
+
printCapabilities(capabilities);
|
|
276
|
+
printUseCases(useCases, service);
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
//# sourceMappingURL=delta.js.map
|