@ybotok/loam 0.1.0-beta.3 → 0.2.0-alpha.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +5992 -82
- package/COMPARISON.md +168 -63
- package/CONTRIBUTING.md +121 -0
- package/MIGRATING-from-OpenSpec.md +238 -55
- package/QUICKSTART.md +302 -0
- package/README.md +653 -144
- package/ROADMAP.md +1035 -0
- package/SCHEMA.md +3916 -263
- package/SECURITY.md +21 -3
- package/WORKFLOW.md +927 -0
- package/dist/cli.js +133 -21
- package/dist/cli.js.map +1 -1
- package/dist/commands/adopt/adopt.js +204 -0
- package/dist/commands/adopt/adopt.js.map +1 -0
- package/dist/commands/adopt/render.js +309 -0
- package/dist/commands/adopt/render.js.map +1 -0
- package/dist/commands/archive/archive.js +74 -0
- package/dist/commands/archive/archive.js.map +1 -0
- package/dist/commands/archive/closing.js +42 -0
- package/dist/commands/archive/closing.js.map +1 -0
- package/dist/commands/archive/plan/contracts/asyncapi.js +172 -0
- package/dist/commands/archive/plan/contracts/asyncapi.js.map +1 -0
- package/dist/commands/archive/plan/contracts/consumers.js +56 -0
- package/dist/commands/archive/plan/contracts/consumers.js.map +1 -0
- package/dist/commands/archive/plan/contracts/openapi.js +193 -0
- package/dist/commands/archive/plan/contracts/openapi.js.map +1 -0
- package/dist/commands/archive/plan/contracts/verdict-lines.js +103 -0
- package/dist/commands/archive/plan/contracts/verdict-lines.js.map +1 -0
- package/dist/commands/archive/plan/document/head.js +151 -0
- package/dist/commands/archive/plan/document/head.js.map +1 -0
- package/dist/commands/archive/plan/document/links.js +284 -0
- package/dist/commands/archive/plan/document/links.js.map +1 -0
- package/dist/commands/archive/plan/document/run.js +136 -0
- package/dist/commands/archive/plan/document/run.js.map +1 -0
- package/dist/commands/archive/plan/gate.js +319 -0
- package/dist/commands/archive/plan/gate.js.map +1 -0
- package/dist/commands/archive/plan/landscape.js +298 -0
- package/dist/commands/archive/plan/landscape.js.map +1 -0
- package/dist/commands/archive/plan/model/extending.js +85 -0
- package/dist/commands/archive/plan/model/extending.js.map +1 -0
- package/dist/commands/archive/plan/refusal.js +106 -0
- package/dist/commands/archive/plan/refusal.js.map +1 -0
- package/dist/commands/archive/plan/specs.js +318 -0
- package/dist/commands/archive/plan/specs.js.map +1 -0
- package/dist/commands/archive/plan/state.js +30 -0
- package/dist/commands/archive/plan/state.js.map +1 -0
- package/dist/commands/archive/run.js +355 -0
- package/dist/commands/archive/run.js.map +1 -0
- package/dist/commands/archive/shipped.js +49 -0
- package/dist/commands/archive/shipped.js.map +1 -0
- package/dist/commands/context/context.js +166 -0
- package/dist/commands/context/context.js.map +1 -0
- package/dist/commands/context/print.js +305 -0
- package/dist/commands/context/print.js.map +1 -0
- package/dist/commands/delta/delta.js +367 -0
- package/dist/commands/delta/delta.js.map +1 -0
- package/dist/commands/delta/print.js +221 -0
- package/dist/commands/delta/print.js.map +1 -0
- package/dist/commands/dependencies.js +6 -8
- package/dist/commands/dependencies.js.map +1 -1
- package/dist/commands/diff/diff.js +86 -0
- package/dist/commands/diff/diff.js.map +1 -0
- package/dist/commands/diff/print.js +38 -0
- package/dist/commands/diff/print.js.map +1 -0
- package/dist/commands/doctor.js +65 -5
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/explain/explain.js +227 -0
- package/dist/commands/explain/explain.js.map +1 -0
- package/dist/commands/explore.js +39 -28
- package/dist/commands/explore.js.map +1 -1
- package/dist/commands/gate/gate.js +152 -0
- package/dist/commands/gate/gate.js.map +1 -0
- package/dist/commands/gate/print.js +66 -0
- package/dist/commands/gate/print.js.map +1 -0
- package/dist/commands/gherkin/commit.js +105 -0
- package/dist/commands/gherkin/commit.js.map +1 -0
- package/dist/commands/gherkin/gherkin.js +262 -0
- package/dist/commands/gherkin/gherkin.js.map +1 -0
- package/dist/commands/gherkin/reconcile.js +146 -0
- package/dist/commands/gherkin/reconcile.js.map +1 -0
- package/dist/commands/gherkin/render.js +77 -0
- package/dist/commands/gherkin/render.js.map +1 -0
- package/dist/commands/init/example.js +204 -0
- package/dist/commands/init/example.js.map +1 -0
- package/dist/commands/init/first-hour.js +72 -0
- package/dist/commands/init/first-hour.js.map +1 -0
- package/dist/commands/{init.js → init/init.js} +142 -71
- package/dist/commands/init/init.js.map +1 -0
- package/dist/commands/init/mcp.js +131 -0
- package/dist/commands/init/mcp.js.map +1 -0
- package/dist/commands/init/options.js +78 -0
- package/dist/commands/init/options.js.map +1 -0
- package/dist/commands/instructions.js +72 -14
- package/dist/commands/instructions.js.map +1 -1
- package/dist/commands/list/campaign/campaign.js +63 -0
- package/dist/commands/list/campaign/campaign.js.map +1 -0
- package/dist/commands/list/campaign/owners.js +65 -0
- package/dist/commands/list/campaign/owners.js.map +1 -0
- package/dist/commands/list/json.js +155 -0
- package/dist/commands/list/json.js.map +1 -0
- package/dist/commands/list/list.js +358 -0
- package/dist/commands/list/list.js.map +1 -0
- package/dist/commands/list/print.js +344 -0
- package/dist/commands/list/print.js.map +1 -0
- package/dist/commands/list/review.js +120 -0
- package/dist/commands/list/review.js.map +1 -0
- package/dist/commands/list/suites/suites.js +140 -0
- package/dist/commands/list/suites/suites.js.map +1 -0
- package/dist/commands/list/views.js +108 -0
- package/dist/commands/list/views.js.map +1 -0
- package/dist/commands/mcp/dispatch.js +238 -0
- package/dist/commands/mcp/dispatch.js.map +1 -0
- package/dist/commands/mcp/mcp.js +75 -0
- package/dist/commands/mcp/mcp.js.map +1 -0
- package/dist/commands/mcp/serve.js +55 -0
- package/dist/commands/mcp/serve.js.map +1 -0
- package/dist/commands/migrate-openspec/materialize/active.js +175 -0
- package/dist/commands/migrate-openspec/materialize/active.js.map +1 -0
- package/dist/commands/migrate-openspec/materialize/feature.js +41 -0
- package/dist/commands/migrate-openspec/materialize/feature.js.map +1 -0
- package/dist/commands/migrate-openspec/materialize/living.js +62 -0
- package/dist/commands/migrate-openspec/materialize/living.js.map +1 -0
- package/dist/commands/migrate-openspec/materialize/stage.js +143 -0
- package/dist/commands/migrate-openspec/materialize/stage.js.map +1 -0
- package/dist/commands/migrate-openspec/materialize/target.js +219 -0
- package/dist/commands/migrate-openspec/materialize/target.js.map +1 -0
- package/dist/commands/migrate-openspec/migrate-openspec.js +142 -0
- package/dist/commands/migrate-openspec/migrate-openspec.js.map +1 -0
- package/dist/commands/migrate-openspec/openspec/decisions.js +86 -0
- package/dist/commands/migrate-openspec/openspec/decisions.js.map +1 -0
- package/dist/commands/migrate-openspec/openspec/error.js +18 -0
- package/dist/commands/migrate-openspec/openspec/error.js.map +1 -0
- package/dist/commands/migrate-openspec/openspec/mapping.js +162 -0
- package/dist/commands/migrate-openspec/openspec/mapping.js.map +1 -0
- package/dist/commands/migrate-openspec/openspec/paths.js +40 -0
- package/dist/commands/migrate-openspec/openspec/paths.js.map +1 -0
- package/dist/commands/migrate-openspec/openspec/read.js +49 -0
- package/dist/commands/migrate-openspec/openspec/read.js.map +1 -0
- package/dist/commands/migrate-openspec/print.js +89 -0
- package/dist/commands/migrate-openspec/print.js.map +1 -0
- package/dist/commands/new/capability-template.js +118 -0
- package/dist/commands/new/capability-template.js.map +1 -0
- package/dist/commands/new/commit.js +62 -0
- package/dist/commands/new/commit.js.map +1 -0
- package/dist/commands/new/modifies.js +206 -0
- package/dist/commands/new/modifies.js.map +1 -0
- package/dist/commands/new/new.js +328 -0
- package/dist/commands/new/new.js.map +1 -0
- package/dist/commands/new/templates.js +279 -0
- package/dist/commands/new/templates.js.map +1 -0
- package/dist/commands/open.js +199 -0
- package/dist/commands/open.js.map +1 -0
- package/dist/commands/policy/format.js +152 -0
- package/dist/commands/policy/format.js.map +1 -0
- package/dist/commands/{docs-repo-gate.js → policy/gate.js} +38 -11
- package/dist/commands/policy/gate.js.map +1 -0
- package/dist/commands/rebase/edit.js +106 -0
- package/dist/commands/rebase/edit.js.map +1 -0
- package/dist/commands/rebase/living.js +185 -0
- package/dist/commands/rebase/living.js.map +1 -0
- package/dist/commands/rebase/plan.js +245 -0
- package/dist/commands/rebase/plan.js.map +1 -0
- package/dist/commands/rebase/rebase.js +300 -0
- package/dist/commands/rebase/rebase.js.map +1 -0
- package/dist/commands/seed/commit.js +221 -0
- package/dist/commands/seed/commit.js.map +1 -0
- package/dist/commands/seed/plan.js +278 -0
- package/dist/commands/seed/plan.js.map +1 -0
- package/dist/commands/seed/seed.js +174 -0
- package/dist/commands/seed/seed.js.map +1 -0
- package/dist/commands/show/feature.js +182 -0
- package/dist/commands/show/feature.js.map +1 -0
- package/dist/commands/show/introduced.js +157 -0
- package/dist/commands/show/introduced.js.map +1 -0
- package/dist/commands/show/marks.js +53 -0
- package/dist/commands/show/marks.js.map +1 -0
- package/dist/commands/show/service.js +239 -0
- package/dist/commands/show/service.js.map +1 -0
- package/dist/commands/show/show.js +87 -0
- package/dist/commands/show/show.js.map +1 -0
- package/dist/commands/status/fleet-next.js +90 -0
- package/dist/commands/status/fleet-next.js.map +1 -0
- package/dist/commands/status/json.js +47 -0
- package/dist/commands/status/json.js.map +1 -0
- package/dist/commands/status/print.js +209 -0
- package/dist/commands/status/print.js.map +1 -0
- package/dist/commands/status/status.js +115 -0
- package/dist/commands/status/status.js.map +1 -0
- package/dist/commands/steps/steps.js +269 -0
- package/dist/commands/steps/steps.js.map +1 -0
- package/dist/commands/subsystem/edit.js +192 -0
- package/dist/commands/subsystem/edit.js.map +1 -0
- package/dist/commands/subsystem/move.js +325 -0
- package/dist/commands/subsystem/move.js.map +1 -0
- package/dist/commands/subsystem/query.js +113 -0
- package/dist/commands/subsystem/query.js.map +1 -0
- package/dist/commands/subsystem/subsystem.js +98 -0
- package/dist/commands/subsystem/subsystem.js.map +1 -0
- package/dist/commands/subsystem/sync.js +318 -0
- package/dist/commands/subsystem/sync.js.map +1 -0
- package/dist/commands/subsystem/txn/exclude.js +132 -0
- package/dist/commands/subsystem/txn/exclude.js.map +1 -0
- package/dist/commands/subsystem/txn/links.js +128 -0
- package/dist/commands/subsystem/txn/links.js.map +1 -0
- package/dist/commands/subsystem/txn/report.js +174 -0
- package/dist/commands/subsystem/txn/report.js.map +1 -0
- package/dist/commands/subsystem/txn/txn.js +196 -0
- package/dist/commands/subsystem/txn/txn.js.map +1 -0
- package/dist/commands/subsystem/txn/views.js +249 -0
- package/dist/commands/subsystem/txn/views.js.map +1 -0
- package/dist/commands/tasks/actions.js +107 -0
- package/dist/commands/tasks/actions.js.map +1 -0
- package/dist/commands/tasks/render.js +253 -0
- package/dist/commands/tasks/render.js.map +1 -0
- package/dist/commands/tasks/tasks.js +119 -0
- package/dist/commands/tasks/tasks.js.map +1 -0
- package/dist/commands/unarchive/manifest.js +176 -0
- package/dist/commands/unarchive/manifest.js.map +1 -0
- package/dist/commands/unarchive/restore.js +254 -0
- package/dist/commands/unarchive/restore.js.map +1 -0
- package/dist/commands/unarchive/unarchive.js +59 -0
- package/dist/commands/unarchive/unarchive.js.map +1 -0
- package/dist/commands/validate/arch-coverage.js +245 -0
- package/dist/commands/validate/arch-coverage.js.map +1 -0
- package/dist/commands/validate/checks/fleet-shape.js +204 -0
- package/dist/commands/validate/checks/fleet-shape.js.map +1 -0
- package/dist/commands/validate/checks/health-deps.js +58 -0
- package/dist/commands/validate/checks/health-deps.js.map +1 -0
- package/dist/commands/validate/checks/introduced.js +102 -0
- package/dist/commands/validate/checks/introduced.js.map +1 -0
- package/dist/commands/validate/checks/requirements.js +264 -0
- package/dist/commands/validate/checks/requirements.js.map +1 -0
- package/dist/commands/validate/checks/sources.js +85 -0
- package/dist/commands/validate/checks/sources.js.map +1 -0
- package/dist/commands/validate/coverage/covers-after.js +105 -0
- package/dist/commands/validate/coverage/covers-after.js.map +1 -0
- package/dist/commands/validate/feature.js +222 -0
- package/dist/commands/validate/feature.js.map +1 -0
- package/dist/commands/validate/fleet/census.js +93 -0
- package/dist/commands/validate/fleet/census.js.map +1 -0
- package/dist/commands/validate/fleet/kind-tags.js +39 -0
- package/dist/commands/validate/fleet/kind-tags.js.map +1 -0
- package/dist/commands/validate/fleet/landscape.js +371 -0
- package/dist/commands/validate/fleet/landscape.js.map +1 -0
- package/dist/commands/validate/fleet/load.js +118 -0
- package/dist/commands/validate/fleet/load.js.map +1 -0
- package/dist/commands/validate/fleet/map/attest.js +98 -0
- package/dist/commands/validate/fleet/map/attest.js.map +1 -0
- package/dist/commands/validate/fleet/map/bindings.js +107 -0
- package/dist/commands/validate/fleet/map/bindings.js.map +1 -0
- package/dist/commands/validate/fleet/map/consumers.js +244 -0
- package/dist/commands/validate/fleet/map/consumers.js.map +1 -0
- package/dist/commands/validate/fleet/map/isolation.js +116 -0
- package/dist/commands/validate/fleet/map/isolation.js.map +1 -0
- package/dist/commands/validate/fleet/map/usecases.js +54 -0
- package/dist/commands/validate/fleet/map/usecases.js.map +1 -0
- package/dist/commands/validate/fleet/obligations.js +266 -0
- package/dist/commands/validate/fleet/obligations.js.map +1 -0
- package/dist/commands/validate/fleet/scorecard/adoption.js +102 -0
- package/dist/commands/validate/fleet/scorecard/adoption.js.map +1 -0
- package/dist/commands/validate/fleet/scorecard/contracts.js +98 -0
- package/dist/commands/validate/fleet/scorecard/contracts.js.map +1 -0
- package/dist/commands/validate/fleet/scorecard/print.js +71 -0
- package/dist/commands/validate/fleet/scorecard/print.js.map +1 -0
- package/dist/commands/validate/fleet/scorecard/scorecard.js +162 -0
- package/dist/commands/validate/fleet/scorecard/scorecard.js.map +1 -0
- package/dist/commands/validate/fleet/usecases/place.js +13 -0
- package/dist/commands/validate/fleet/usecases/place.js.map +1 -0
- package/dist/commands/validate/fleet/views/fleet-project.js +217 -0
- package/dist/commands/validate/fleet/views/fleet-project.js.map +1 -0
- package/dist/commands/validate/fleet/views/ids.js +75 -0
- package/dist/commands/validate/fleet/views/ids.js.map +1 -0
- package/dist/commands/validate/fleet/views/projects.js +278 -0
- package/dist/commands/validate/fleet/views/projects.js.map +1 -0
- package/dist/commands/validate/fleet/views/root-documents.js +83 -0
- package/dist/commands/validate/fleet/views/root-documents.js.map +1 -0
- package/dist/commands/validate/fleet/views/stale.js +52 -0
- package/dist/commands/validate/fleet/views/stale.js.map +1 -0
- package/dist/commands/validate/links/corpus.js +89 -0
- package/dist/commands/validate/links/corpus.js.map +1 -0
- package/dist/commands/validate/links/glossary.js +75 -0
- package/dist/commands/validate/links/glossary.js.map +1 -0
- package/dist/commands/validate/render/repeats.js +63 -0
- package/dist/commands/validate/render/repeats.js.map +1 -0
- package/dist/commands/validate/render/rollups.js +115 -0
- package/dist/commands/validate/render/rollups.js.map +1 -0
- package/dist/commands/validate/render/text.js +199 -0
- package/dist/commands/validate/render/text.js.map +1 -0
- package/dist/commands/validate/report.js +145 -0
- package/dist/commands/validate/report.js.map +1 -0
- package/dist/commands/validate/scope.js +113 -0
- package/dist/commands/validate/scope.js.map +1 -0
- package/dist/commands/validate/service/api.js +252 -0
- package/dist/commands/validate/service/api.js.map +1 -0
- package/dist/commands/validate/service/contracts/generated.js +134 -0
- package/dist/commands/validate/service/contracts/generated.js.map +1 -0
- package/dist/commands/validate/service/events/events.js +241 -0
- package/dist/commands/validate/service/events/events.js.map +1 -0
- package/dist/commands/validate/service/events/message-producers.js +77 -0
- package/dist/commands/validate/service/events/message-producers.js.map +1 -0
- package/dist/commands/validate/service/evidence-pins.js +177 -0
- package/dist/commands/validate/service/evidence-pins.js.map +1 -0
- package/dist/commands/validate/service/model/diverged.js +226 -0
- package/dist/commands/validate/service/model/diverged.js.map +1 -0
- package/dist/commands/validate/service/model/grade.js +163 -0
- package/dist/commands/validate/service/model/grade.js.map +1 -0
- package/dist/commands/validate/service/service.js +310 -0
- package/dist/commands/validate/service/service.js.map +1 -0
- package/dist/commands/validate/service/specs.js +279 -0
- package/dist/commands/validate/service/specs.js.map +1 -0
- package/dist/commands/validate/service/spine.js +148 -0
- package/dist/commands/validate/service/spine.js.map +1 -0
- package/dist/commands/validate/service/usecases/tags.js +113 -0
- package/dist/commands/validate/service/usecases/tags.js.map +1 -0
- package/dist/commands/validate/service/usecases/usecases.js +209 -0
- package/dist/commands/validate/service/usecases/usecases.js.map +1 -0
- package/dist/commands/validate/validate.js +363 -0
- package/dist/commands/validate/validate.js.map +1 -0
- package/dist/commands/verify/cross/diff.js +178 -0
- package/dist/commands/verify/cross/diff.js.map +1 -0
- package/dist/commands/verify/evidence/contract.js +32 -0
- package/dist/commands/verify/evidence/contract.js.map +1 -0
- package/dist/commands/verify/evidence/pins.js +52 -0
- package/dist/commands/verify/evidence/pins.js.map +1 -0
- package/dist/commands/verify/evidence/read.js +81 -0
- package/dist/commands/verify/evidence/read.js.map +1 -0
- package/dist/commands/verify/frozen.js +263 -0
- package/dist/commands/verify/frozen.js.map +1 -0
- package/dist/commands/verify/record.js +278 -0
- package/dist/commands/verify/record.js.map +1 -0
- package/dist/commands/verify/report.js +206 -0
- package/dist/commands/verify/report.js.map +1 -0
- package/dist/commands/verify/results.js +328 -0
- package/dist/commands/verify/results.js.map +1 -0
- package/dist/commands/verify/verify.js +220 -0
- package/dist/commands/verify/verify.js.map +1 -0
- package/dist/commands/vouch/contract.js +11 -0
- package/dist/commands/vouch/contract.js.map +1 -0
- package/dist/commands/vouch/pack/contract.js +2 -0
- package/dist/commands/vouch/pack/contract.js.map +1 -0
- package/dist/commands/vouch/pack/pack.js +266 -0
- package/dist/commands/vouch/pack/pack.js.map +1 -0
- package/dist/commands/vouch/pack/print.js +266 -0
- package/dist/commands/vouch/pack/print.js.map +1 -0
- package/dist/commands/vouch/pack/sections.js +141 -0
- package/dist/commands/vouch/pack/sections.js.map +1 -0
- package/dist/commands/vouch/prompt/confirm.js +46 -0
- package/dist/commands/vouch/prompt/confirm.js.map +1 -0
- package/dist/commands/vouch/report.js +101 -0
- package/dist/commands/vouch/report.js.map +1 -0
- package/dist/commands/vouch/run.js +230 -0
- package/dist/commands/vouch/run.js.map +1 -0
- package/dist/commands/vouch/sample/plan.js +111 -0
- package/dist/commands/vouch/sample/plan.js.map +1 -0
- package/dist/commands/vouch/sample/print.js +109 -0
- package/dist/commands/vouch/sample/print.js.map +1 -0
- package/dist/commands/vouch/vet/verify.js +155 -0
- package/dist/commands/vouch/vet/verify.js.map +1 -0
- package/dist/commands/vouch/vouch.js +169 -0
- package/dist/commands/vouch/vouch.js.map +1 -0
- package/dist/core/agent/agents-md/command-map.js +299 -0
- package/dist/core/agent/agents-md/command-map.js.map +1 -0
- package/dist/core/agent/agents-md/map/explain.js +46 -0
- package/dist/core/agent/agents-md/map/explain.js.map +1 -0
- package/dist/core/agent/agents-md/map/lenses/context.js +50 -0
- package/dist/core/agent/agents-md/map/lenses/context.js.map +1 -0
- package/dist/core/agent/agents-md/map/lenses/diff.js +59 -0
- package/dist/core/agent/agents-md/map/lenses/diff.js.map +1 -0
- package/dist/core/agent/agents-md/map/lenses/gate.js +65 -0
- package/dist/core/agent/agents-md/map/lenses/gate.js.map +1 -0
- package/dist/core/agent/agents-md/map/mcp.js +44 -0
- package/dist/core/agent/agents-md/map/mcp.js.map +1 -0
- package/dist/core/agent/agents-md/map/status.js +78 -0
- package/dist/core/agent/agents-md/map/status.js.map +1 -0
- package/dist/core/agent/agents-md/map/subsystem.js +104 -0
- package/dist/core/agent/agents-md/map/subsystem.js.map +1 -0
- package/dist/core/agent/agents-md/map/usecases.js +138 -0
- package/dist/core/agent/agents-md/map/usecases.js.map +1 -0
- package/dist/core/agent/agents-md/refusals.js +273 -0
- package/dist/core/agent/agents-md/refusals.js.map +1 -0
- package/dist/core/agent/agents-md.js +203 -0
- package/dist/core/agent/agents-md.js.map +1 -0
- package/dist/core/{agents-stamp.js → agent/agents-stamp.js} +60 -0
- package/dist/core/agent/agents-stamp.js.map +1 -0
- package/dist/core/agent/contract.js +2 -0
- package/dist/core/agent/contract.js.map +1 -0
- package/dist/core/agent/protocol.js +193 -0
- package/dist/core/agent/protocol.js.map +1 -0
- package/dist/core/agent/scaffold.js +254 -0
- package/dist/core/agent/scaffold.js.map +1 -0
- package/dist/core/agent/support/report.js +144 -0
- package/dist/core/agent/support/report.js.map +1 -0
- package/dist/core/agent/tools/dialects.js +151 -0
- package/dist/core/agent/tools/dialects.js.map +1 -0
- package/dist/core/agent/tools/registry.js +193 -0
- package/dist/core/agent/tools/registry.js.map +1 -0
- package/dist/core/agent/workflows/adopt.js +280 -0
- package/dist/core/agent/workflows/adopt.js.map +1 -0
- package/dist/core/agent/workflows/check.js +373 -0
- package/dist/core/agent/workflows/check.js.map +1 -0
- package/dist/core/agent/workflows/closing.js +323 -0
- package/dist/core/agent/workflows/closing.js.map +1 -0
- package/dist/core/agent/workflows/feature.js +220 -0
- package/dist/core/agent/workflows/feature.js.map +1 -0
- package/dist/core/agent/workflows/implement.js +188 -0
- package/dist/core/agent/workflows/implement.js.map +1 -0
- package/dist/core/agent/workflows/reference/authoring.js +311 -0
- package/dist/core/agent/workflows/reference/authoring.js.map +1 -0
- package/dist/core/agent/workflows/reference/codes.js +67 -0
- package/dist/core/agent/workflows/reference/codes.js.map +1 -0
- package/dist/core/agent/workflows/reference/done-check.js +210 -0
- package/dist/core/agent/workflows/reference/done-check.js.map +1 -0
- package/dist/core/agent/workflows/reference/drawing/drawing.js +253 -0
- package/dist/core/agent/workflows/reference/drawing/drawing.js.map +1 -0
- package/dist/core/agent/workflows/reference/reference.js +19 -0
- package/dist/core/agent/workflows/reference/reference.js.map +1 -0
- package/dist/core/agent/workflows/reference/spine.js +338 -0
- package/dist/core/agent/workflows/reference/spine.js.map +1 -0
- package/dist/core/asyncapi/baseline/plan.js +43 -0
- package/dist/core/asyncapi/baseline/plan.js.map +1 -0
- package/dist/core/asyncapi/baseline/surfaces.js +54 -0
- package/dist/core/asyncapi/baseline/surfaces.js.map +1 -0
- package/dist/core/asyncapi/depth.js +164 -0
- package/dist/core/asyncapi/depth.js.map +1 -0
- package/dist/core/asyncapi/digest.js +146 -0
- package/dist/core/asyncapi/digest.js.map +1 -0
- package/dist/core/asyncapi/merge/components.js +92 -0
- package/dist/core/asyncapi/merge/components.js.map +1 -0
- package/dist/core/asyncapi/merge/error.js +38 -0
- package/dist/core/asyncapi/merge/error.js.map +1 -0
- package/dist/core/asyncapi/merge/markers.js +290 -0
- package/dist/core/asyncapi/merge/markers.js.map +1 -0
- package/dist/core/asyncapi/merge/merge.js +195 -0
- package/dist/core/asyncapi/merge/merge.js.map +1 -0
- package/dist/core/asyncapi/merge/pin.js +83 -0
- package/dist/core/asyncapi/merge/pin.js.map +1 -0
- package/dist/core/asyncapi/model.js +11 -0
- package/dist/core/asyncapi/model.js.map +1 -0
- package/dist/core/asyncapi/producers.js +50 -0
- package/dist/core/asyncapi/producers.js.map +1 -0
- package/dist/core/asyncapi/read.js +263 -0
- package/dist/core/asyncapi/read.js.map +1 -0
- package/dist/core/brief/brief.js +285 -0
- package/dist/core/brief/brief.js.map +1 -0
- package/dist/core/brief/checks.js +385 -0
- package/dist/core/brief/checks.js.map +1 -0
- package/dist/core/brief/landscape.js +273 -0
- package/dist/core/brief/landscape.js.map +1 -0
- package/dist/core/brief/map/extend.js +84 -0
- package/dist/core/brief/map/extend.js.map +1 -0
- package/dist/core/brief/map/owed.js +266 -0
- package/dist/core/brief/map/owed.js.map +1 -0
- package/dist/core/brief/targets.js +304 -0
- package/dist/core/brief/targets.js.map +1 -0
- package/dist/core/brief/unchecked.js +58 -0
- package/dist/core/brief/unchecked.js.map +1 -0
- package/dist/core/c4/arch.js +190 -0
- package/dist/core/c4/arch.js.map +1 -0
- package/dist/core/c4/direction/direction.js +114 -0
- package/dist/core/c4/direction/direction.js.map +1 -0
- package/dist/core/c4/likec4.js +243 -0
- package/dist/core/c4/likec4.js.map +1 -0
- package/dist/core/c4/locate/unlocated.js +150 -0
- package/dist/core/c4/locate/unlocated.js.map +1 -0
- package/dist/core/c4/parsed/deployment.js +160 -0
- package/dist/core/c4/parsed/deployment.js.map +1 -0
- package/dist/core/c4/parsed/dynamic-views.js +132 -0
- package/dist/core/c4/parsed/dynamic-views.js.map +1 -0
- package/dist/core/c4/parsed/specification.js +78 -0
- package/dist/core/c4/parsed/specification.js.map +1 -0
- package/dist/core/c4/parsed/values.js +110 -0
- package/dist/core/c4/parsed/values.js.map +1 -0
- package/dist/core/c4/parsed/view-ids.js +113 -0
- package/dist/core/c4/parsed/view-ids.js.map +1 -0
- package/dist/core/c4/prefetch/fleet.js +134 -0
- package/dist/core/c4/prefetch/fleet.js.map +1 -0
- package/dist/core/c4/project/architecture.js +161 -0
- package/dist/core/c4/project/architecture.js.map +1 -0
- package/dist/core/c4/project/batch.js +140 -0
- package/dist/core/c4/project/batch.js.map +1 -0
- package/dist/core/c4/project/documents.js +89 -0
- package/dist/core/c4/project/documents.js.map +1 -0
- package/dist/core/c4/project/load.js +219 -0
- package/dist/core/c4/project/load.js.map +1 -0
- package/dist/core/c4/project/staged.js +277 -0
- package/dist/core/c4/project/staged.js.map +1 -0
- package/dist/core/c4/resolve/attested.js +0 -0
- package/dist/core/c4/resolve/attested.js.map +1 -0
- package/dist/core/c4/resolve/external.js +51 -0
- package/dist/core/c4/resolve/external.js.map +1 -0
- package/dist/core/c4/resolve/service.js +174 -0
- package/dist/core/c4/resolve/service.js.map +1 -0
- package/dist/core/c4/resolve/steps.js +290 -0
- package/dist/core/c4/resolve/steps.js.map +1 -0
- package/dist/core/c4/resolve/systems.js +154 -0
- package/dist/core/c4/resolve/systems.js.map +1 -0
- package/dist/core/c4/root-project/exclude.js +352 -0
- package/dist/core/c4/root-project/exclude.js.map +1 -0
- package/dist/core/c4/seed/fleet-file.js +201 -0
- package/dist/core/c4/seed/fleet-file.js.map +1 -0
- package/dist/core/c4/seed/items.js +91 -0
- package/dist/core/c4/seed/items.js.map +1 -0
- package/dist/core/c4/seed/stamp.js +48 -0
- package/dist/core/c4/seed/stamp.js.map +1 -0
- package/dist/core/c4/seed/template.js +173 -0
- package/dist/core/c4/seed/template.js.map +1 -0
- package/dist/core/c4/service-model/created/models.js +96 -0
- package/dist/core/c4/service-model/created/models.js.map +1 -0
- package/dist/core/c4/service-model/documents.js +47 -0
- package/dist/core/c4/service-model/documents.js.map +1 -0
- package/dist/core/c4/service-model/fleet/extending.js +82 -0
- package/dist/core/c4/service-model/fleet/extending.js.map +1 -0
- package/dist/core/c4/service-model/load.js +165 -0
- package/dist/core/c4/service-model/load.js.map +1 -0
- package/dist/core/c4/service-model/renderer.js +128 -0
- package/dist/core/c4/service-model/renderer.js.map +1 -0
- package/dist/core/c4/service-model/shape.js +106 -0
- package/dist/core/c4/service-model/shape.js.map +1 -0
- package/dist/core/c4/service-model/slice.js +188 -0
- package/dist/core/c4/service-model/slice.js.map +1 -0
- package/dist/core/c4/source-mask.js +369 -0
- package/dist/core/c4/source-mask.js.map +1 -0
- package/dist/core/c4/source-scan.js +308 -0
- package/dist/core/c4/source-scan.js.map +1 -0
- package/dist/core/c4/splice/authored-source.js +167 -0
- package/dist/core/c4/splice/authored-source.js.map +1 -0
- package/dist/core/c4/splice/contract.js +30 -0
- package/dist/core/c4/splice/contract.js.map +1 -0
- package/dist/core/c4/splice/delta-blocks.js +126 -0
- package/dist/core/c4/splice/delta-blocks.js.map +1 -0
- package/dist/core/c4/splice/identity/declared.js +87 -0
- package/dist/core/c4/splice/identity/declared.js.map +1 -0
- package/dist/core/c4/splice/identity/edges.js +73 -0
- package/dist/core/c4/splice/identity/edges.js.map +1 -0
- package/dist/core/c4/splice/identity/existing.js +80 -0
- package/dist/core/c4/splice/identity/existing.js.map +1 -0
- package/dist/core/c4/splice/identity/interior.js +80 -0
- package/dist/core/c4/splice/identity/interior.js.map +1 -0
- package/dist/core/c4/splice/identity/owner.js +50 -0
- package/dist/core/c4/splice/identity/owner.js.map +1 -0
- package/dist/core/c4/splice/landscape-merge.js +337 -0
- package/dist/core/c4/splice/landscape-merge.js.map +1 -0
- package/dist/core/c4/splice/model/merge.js +151 -0
- package/dist/core/c4/splice/model/merge.js.map +1 -0
- package/dist/core/c4/splice/placement.js +298 -0
- package/dist/core/c4/splice/placement.js.map +1 -0
- package/dist/core/c4/splice/text/spot.js +131 -0
- package/dist/core/c4/splice/text/spot.js.map +1 -0
- package/dist/core/c4/workspace.js +166 -0
- package/dist/core/c4/workspace.js.map +1 -0
- package/dist/core/capabilities/authoring/notes.js +141 -0
- package/dist/core/capabilities/authoring/notes.js.map +1 -0
- package/dist/core/capabilities/capabilities.js +124 -0
- package/dist/core/capabilities/capabilities.js.map +1 -0
- package/dist/core/capabilities/delta/doc.js +47 -0
- package/dist/core/capabilities/delta/doc.js.map +1 -0
- package/dist/core/capabilities/delta/overlay.js +129 -0
- package/dist/core/capabilities/delta/overlay.js.map +1 -0
- package/dist/core/capabilities/delta/summary.js +57 -0
- package/dist/core/capabilities/delta/summary.js.map +1 -0
- package/dist/core/capabilities/delta/tree.js +43 -0
- package/dist/core/capabilities/delta/tree.js.map +1 -0
- package/dist/core/capabilities/delta/uncovered.js +222 -0
- package/dist/core/capabilities/delta/uncovered.js.map +1 -0
- package/dist/core/capabilities/findings.js +338 -0
- package/dist/core/capabilities/findings.js.map +1 -0
- package/dist/core/capabilities/realizes/findings.js +174 -0
- package/dist/core/capabilities/realizes/findings.js.map +1 -0
- package/dist/core/capabilities/realizes/join.js +123 -0
- package/dist/core/capabilities/realizes/join.js.map +1 -0
- package/dist/core/capabilities/rollup.js +205 -0
- package/dist/core/capabilities/rollup.js.map +1 -0
- package/dist/core/capabilities/tree.js +104 -0
- package/dist/core/capabilities/tree.js.map +1 -0
- package/dist/core/capabilities/usecase-join.js +267 -0
- package/dist/core/capabilities/usecase-join.js.map +1 -0
- package/dist/core/coherence/authoring/scaffold.js +185 -0
- package/dist/core/coherence/authoring/scaffold.js.map +1 -0
- package/dist/core/coherence/authoring/sentinels.js +75 -0
- package/dist/core/coherence/authoring/sentinels.js.map +1 -0
- package/dist/core/coherence/calls/called.js +52 -0
- package/dist/core/coherence/calls/called.js.map +1 -0
- package/dist/core/coherence/coherence.js +332 -0
- package/dist/core/coherence/coherence.js.map +1 -0
- package/dist/core/coherence/consumed/operations.js +70 -0
- package/dist/core/coherence/consumed/operations.js.map +1 -0
- package/dist/core/coherence/consumed/refusal.js +38 -0
- package/dist/core/coherence/consumed/refusal.js.map +1 -0
- package/dist/core/coherence/covers/health.js +85 -0
- package/dist/core/coherence/covers/health.js.map +1 -0
- package/dist/core/coherence/declared.js +295 -0
- package/dist/core/coherence/declared.js.map +1 -0
- package/dist/core/coherence/events/declared.js +191 -0
- package/dist/core/coherence/events/declared.js.map +1 -0
- package/dist/core/coherence/events/events.js +335 -0
- package/dist/core/coherence/events/events.js.map +1 -0
- package/dist/core/coherence/events/grades.js +189 -0
- package/dist/core/coherence/events/grades.js.map +1 -0
- package/dist/core/coherence/events/lookups.js +63 -0
- package/dist/core/coherence/events/lookups.js.map +1 -0
- package/dist/core/coherence/events/produced.js +100 -0
- package/dist/core/coherence/events/produced.js.map +1 -0
- package/dist/core/coherence/living.js +198 -0
- package/dist/core/coherence/living.js.map +1 -0
- package/dist/core/coherence/lookups.js +95 -0
- package/dist/core/coherence/lookups.js.map +1 -0
- package/dist/core/coherence/pending.js +39 -0
- package/dist/core/coherence/pending.js.map +1 -0
- package/dist/core/coherence/retired/archived.js +285 -0
- package/dist/core/coherence/retired/archived.js.map +1 -0
- package/dist/core/coherence/retired/event-pair.js +62 -0
- package/dist/core/coherence/retired/event-pair.js.map +1 -0
- package/dist/core/coherence/retired/merged.js +79 -0
- package/dist/core/coherence/retired/merged.js.map +1 -0
- package/dist/core/coherence/retired/retirement.js +49 -0
- package/dist/core/coherence/retired/retirement.js.map +1 -0
- package/dist/core/coherence/retired/revival/arrivals.js +131 -0
- package/dist/core/coherence/retired/revival/arrivals.js.map +1 -0
- package/dist/core/coherence/retired/revival/revived.js +297 -0
- package/dist/core/coherence/retired/revival/revived.js.map +1 -0
- package/dist/core/conflict-markers.js +60 -0
- package/dist/core/conflict-markers.js.map +1 -0
- package/dist/core/consumers/after.js +113 -0
- package/dist/core/consumers/after.js.map +1 -0
- package/dist/core/consumers/consumers.js +296 -0
- package/dist/core/consumers/consumers.js.map +1 -0
- package/dist/core/consumers/current.js +211 -0
- package/dist/core/consumers/current.js.map +1 -0
- package/dist/core/consumers/scan.js +46 -0
- package/dist/core/consumers/scan.js.map +1 -0
- package/dist/core/consumers/state.js +27 -0
- package/dist/core/consumers/state.js.map +1 -0
- package/dist/core/delta/claims.js +73 -0
- package/dist/core/delta/claims.js.map +1 -0
- package/dist/core/delta/delta.js +341 -0
- package/dist/core/delta/delta.js.map +1 -0
- package/dist/core/delta/document.js +177 -0
- package/dist/core/delta/document.js.map +1 -0
- package/dist/core/delta/scope.js +48 -0
- package/dist/core/delta/scope.js.map +1 -0
- package/dist/core/delta/select.js +237 -0
- package/dist/core/delta/select.js.map +1 -0
- package/dist/core/dependencies/dependencies.js +141 -0
- package/dist/core/dependencies/dependencies.js.map +1 -0
- package/dist/core/dependencies/facts.js +165 -0
- package/dist/core/dependencies/facts.js.map +1 -0
- package/dist/core/dependencies/fanin.js +88 -0
- package/dist/core/dependencies/fanin.js.map +1 -0
- package/dist/core/dependencies/graph.js +106 -0
- package/dist/core/dependencies/graph.js.map +1 -0
- package/dist/core/deployment/delta.js +191 -0
- package/dist/core/deployment/delta.js.map +1 -0
- package/dist/core/deployment/objects.js +145 -0
- package/dist/core/deployment/objects.js.map +1 -0
- package/dist/core/diff/base-git.js +230 -0
- package/dist/core/diff/base-git.js.map +1 -0
- package/dist/core/diff/base-state.js +237 -0
- package/dist/core/diff/base-state.js.map +1 -0
- package/dist/core/diff/joins.js +136 -0
- package/dist/core/diff/joins.js.map +1 -0
- package/dist/core/diff/scope/changed-paths.js +204 -0
- package/dist/core/diff/scope/changed-paths.js.map +1 -0
- package/dist/core/diff/scope/edges.js +82 -0
- package/dist/core/diff/scope/edges.js.map +1 -0
- package/dist/core/diff/semantic.js +312 -0
- package/dist/core/diff/semantic.js.map +1 -0
- package/dist/core/docs.js +37 -85
- package/dist/core/docs.js.map +1 -1
- package/dist/core/doctor/agents.js +238 -0
- package/dist/core/doctor/agents.js.map +1 -0
- package/dist/core/doctor/config.js +139 -0
- package/dist/core/doctor/config.js.map +1 -0
- package/dist/core/doctor/doctor.js +355 -0
- package/dist/core/doctor/doctor.js.map +1 -0
- package/dist/core/doctor/report.js +13 -0
- package/dist/core/doctor/report.js.map +1 -0
- package/dist/core/doctor/reports/scan.js +242 -0
- package/dist/core/doctor/reports/scan.js.map +1 -0
- package/dist/core/doctor/residue.js +110 -0
- package/dist/core/doctor/residue.js.map +1 -0
- package/dist/core/document/apply.js +224 -0
- package/dist/core/document/apply.js.map +1 -0
- package/dist/core/{frontmatter.js → document/frontmatter.js} +103 -2
- package/dist/core/document/frontmatter.js.map +1 -0
- package/dist/core/document/grammar/directives.js +143 -0
- package/dist/core/document/grammar/directives.js.map +1 -0
- package/dist/core/document/parse.js +286 -0
- package/dist/core/document/parse.js.map +1 -0
- package/dist/core/document/scenarios.js +238 -0
- package/dist/core/document/scenarios.js.map +1 -0
- package/dist/core/document/spec.js +234 -0
- package/dist/core/document/spec.js.map +1 -0
- package/dist/core/{config.js → envelope/config.js} +89 -18
- package/dist/core/envelope/config.js.map +1 -0
- package/dist/core/envelope/json.js +209 -0
- package/dist/core/envelope/json.js.map +1 -0
- package/dist/core/{version.js → envelope/version.js} +3 -3
- package/dist/core/envelope/version.js.map +1 -0
- package/dist/core/explain/families.js +180 -0
- package/dist/core/explain/families.js.map +1 -0
- package/dist/core/explain/fix-tables.js +178 -0
- package/dist/core/explain/fix-tables.js.map +1 -0
- package/dist/core/explain/lookup.js +194 -0
- package/dist/core/explain/lookup.js.map +1 -0
- package/dist/core/explain/refusals.js +49 -0
- package/dist/core/explain/refusals.js.map +1 -0
- package/dist/core/explain/terms/documents.js +227 -0
- package/dist/core/explain/terms/documents.js.map +1 -0
- package/dist/core/explain/terms/done-check.js +144 -0
- package/dist/core/explain/terms/done-check.js.map +1 -0
- package/dist/core/explain/terms/entry.js +14 -0
- package/dist/core/explain/terms/entry.js.map +1 -0
- package/dist/core/explain/terms/stages.js +71 -0
- package/dist/core/explain/terms/stages.js.map +1 -0
- package/dist/core/explain/terms/tasks.js +97 -0
- package/dist/core/explain/terms/tasks.js.map +1 -0
- package/dist/core/explain/terms.js +103 -0
- package/dist/core/explain/terms.js.map +1 -0
- package/dist/core/explore/describe.js +105 -0
- package/dist/core/explore/describe.js.map +1 -0
- package/dist/core/explore/explore.js +204 -0
- package/dist/core/explore/explore.js.map +1 -0
- package/dist/core/fleet-context.js +174 -146
- package/dist/core/fleet-context.js.map +1 -1
- package/dist/core/gate/checks.js +208 -0
- package/dist/core/gate/checks.js.map +1 -0
- package/dist/core/gate/partners.js +246 -0
- package/dist/core/gate/partners.js.map +1 -0
- package/dist/core/gate/report.js +47 -0
- package/dist/core/gate/report.js.map +1 -0
- package/dist/core/gate/verification.js +176 -0
- package/dist/core/gate/verification.js.map +1 -0
- package/dist/core/gherkin/digest.js +60 -0
- package/dist/core/gherkin/digest.js.map +1 -0
- package/dist/core/gherkin/emit.js +177 -0
- package/dist/core/gherkin/emit.js.map +1 -0
- package/dist/core/gherkin/read.js +76 -0
- package/dist/core/gherkin/read.js.map +1 -0
- package/dist/core/gherkin/stale.js +210 -0
- package/dist/core/gherkin/stale.js.map +1 -0
- package/dist/core/gherkin/stamp.js +77 -0
- package/dist/core/gherkin/stamp.js.map +1 -0
- package/dist/core/gherkin/steps/catalogue.js +154 -0
- package/dist/core/gherkin/steps/catalogue.js.map +1 -0
- package/dist/core/gherkin/steps/inventory.js +98 -0
- package/dist/core/gherkin/steps/inventory.js.map +1 -0
- package/dist/core/gherkin/steps/phrase.js +72 -0
- package/dist/core/gherkin/steps/phrase.js.map +1 -0
- package/dist/core/glossary/delta.js +109 -0
- package/dist/core/glossary/delta.js.map +1 -0
- package/dist/core/glossary/tree.js +73 -0
- package/dist/core/glossary/tree.js.map +1 -0
- package/dist/core/{concurrency.js → kernel/concurrency.js} +19 -0
- package/dist/core/kernel/concurrency.js.map +1 -0
- package/dist/core/{document-bytes.js → kernel/document-bytes.js} +1 -1
- package/dist/core/kernel/document-bytes.js.map +1 -0
- package/dist/core/kernel/fences.js +42 -0
- package/dist/core/kernel/fences.js.map +1 -0
- package/dist/core/kernel/ids/capability.js +72 -0
- package/dist/core/kernel/ids/capability.js.map +1 -0
- package/dist/core/kernel/ids/dirs.js +33 -0
- package/dist/core/kernel/ids/dirs.js.map +1 -0
- package/dist/core/kernel/ids/feature.js +75 -0
- package/dist/core/kernel/ids/feature.js.map +1 -0
- package/dist/core/kernel/ids/fqn/ancestors.js +65 -0
- package/dist/core/kernel/ids/fqn/ancestors.js.map +1 -0
- package/dist/core/kernel/ids/service.js +156 -0
- package/dist/core/kernel/ids/service.js.map +1 -0
- package/dist/core/kernel/ids/subsystem.js +63 -0
- package/dist/core/kernel/ids/subsystem.js.map +1 -0
- package/dist/core/{path-safety.js → kernel/path-safety.js} +56 -4
- package/dist/core/kernel/path-safety.js.map +1 -0
- package/dist/core/{records.js → kernel/records.js} +11 -0
- package/dist/core/kernel/records.js.map +1 -0
- package/dist/core/links/backlinks.js +66 -0
- package/dist/core/links/backlinks.js.map +1 -0
- package/dist/core/links/case.js +74 -0
- package/dist/core/links/case.js.map +1 -0
- package/dist/core/links/corpus.js +118 -0
- package/dist/core/links/corpus.js.map +1 -0
- package/dist/core/links/findings.js +110 -0
- package/dist/core/links/findings.js.map +1 -0
- package/dist/core/links/parse.js +265 -0
- package/dist/core/links/parse.js.map +1 -0
- package/dist/core/mcp/argv.js +212 -0
- package/dist/core/mcp/argv.js.map +1 -0
- package/dist/core/mcp/author-tools.js +73 -0
- package/dist/core/mcp/author-tools.js.map +1 -0
- package/dist/core/mcp/framing.js +46 -0
- package/dist/core/mcp/framing.js.map +1 -0
- package/dist/core/mcp/protocol.js +280 -0
- package/dist/core/mcp/protocol.js.map +1 -0
- package/dist/core/mcp/tools.js +324 -0
- package/dist/core/mcp/tools.js.map +1 -0
- package/dist/core/obligations/obligations.js +106 -0
- package/dist/core/obligations/obligations.js.map +1 -0
- package/dist/core/openapi/baseline/gate.js +207 -0
- package/dist/core/openapi/baseline/gate.js.map +1 -0
- package/dist/core/openapi/baseline/plan.js +142 -0
- package/dist/core/openapi/baseline/plan.js.map +1 -0
- package/dist/core/openapi/baseline/record.js +174 -0
- package/dist/core/openapi/baseline/record.js.map +1 -0
- package/dist/core/openapi/contract-text.js +33 -0
- package/dist/core/openapi/contract-text.js.map +1 -0
- package/dist/core/openapi/contract-tree.js +301 -0
- package/dist/core/openapi/contract-tree.js.map +1 -0
- package/dist/core/openapi/depth.js +136 -0
- package/dist/core/openapi/depth.js.map +1 -0
- package/dist/core/openapi/digest.js +239 -0
- package/dist/core/openapi/digest.js.map +1 -0
- package/dist/core/{openapi.js → openapi/doc.js} +54 -108
- package/dist/core/openapi/doc.js.map +1 -0
- package/dist/core/openapi/merge/components.js +199 -0
- package/dist/core/openapi/merge/components.js.map +1 -0
- package/dist/core/openapi/merge/error.js +16 -0
- package/dist/core/openapi/merge/error.js.map +1 -0
- package/dist/core/openapi/merge/markers.js +204 -0
- package/dist/core/openapi/merge/markers.js.map +1 -0
- package/dist/core/openapi/merge/merge.js +232 -0
- package/dist/core/openapi/merge/merge.js.map +1 -0
- package/dist/core/openapi/merge/pin.js +110 -0
- package/dist/core/openapi/merge/pin.js.map +1 -0
- package/dist/core/openspec/decide/capabilities.js +244 -0
- package/dist/core/openspec/decide/capabilities.js.map +1 -0
- package/dist/core/openspec/decide/dispositions.js +63 -0
- package/dist/core/openspec/decide/dispositions.js.map +1 -0
- package/dist/core/openspec/decide/renames.js +179 -0
- package/dist/core/openspec/decide/renames.js.map +1 -0
- package/dist/core/openspec/decide/verdict.js +84 -0
- package/dist/core/openspec/decide/verdict.js.map +1 -0
- package/dist/core/openspec/inventory.js +220 -0
- package/dist/core/openspec/inventory.js.map +1 -0
- package/dist/core/openspec/model/mapping.js +78 -0
- package/dist/core/openspec/model/mapping.js.map +1 -0
- package/dist/core/openspec/model/model.js +70 -0
- package/dist/core/openspec/model/model.js.map +1 -0
- package/dist/core/openspec/scan/changes.js +241 -0
- package/dist/core/openspec/scan/changes.js.map +1 -0
- package/dist/core/openspec/scan/config.js +191 -0
- package/dist/core/openspec/scan/config.js.map +1 -0
- package/dist/core/openspec/scan/shape.js +304 -0
- package/dist/core/openspec/scan/shape.js.map +1 -0
- package/dist/core/openspec/scan/walk.js +116 -0
- package/dist/core/openspec/scan/walk.js.map +1 -0
- package/dist/core/openspec/scan/workspace.js +71 -0
- package/dist/core/openspec/scan/workspace.js.map +1 -0
- package/dist/core/owners/codeowners.js +141 -0
- package/dist/core/owners/codeowners.js.map +1 -0
- package/dist/core/pack/features.js +120 -0
- package/dist/core/pack/features.js.map +1 -0
- package/dist/core/pack/joins.js +112 -0
- package/dist/core/pack/joins.js.map +1 -0
- package/dist/core/pack/living.js +157 -0
- package/dist/core/pack/living.js.map +1 -0
- package/dist/core/pack/pack.js +120 -0
- package/dist/core/pack/pack.js.map +1 -0
- package/dist/core/permissions/permissions.js +87 -0
- package/dist/core/permissions/permissions.js.map +1 -0
- package/dist/core/projection/api.js +84 -0
- package/dist/core/projection/api.js.map +1 -0
- package/dist/core/projection/arch-slice.js +63 -0
- package/dist/core/projection/arch-slice.js.map +1 -0
- package/dist/core/projection/events.js +34 -0
- package/dist/core/projection/events.js.map +1 -0
- package/dist/core/projection/introduced.js +14 -0
- package/dist/core/projection/introduced.js.map +1 -0
- package/dist/core/provenance/findings.js +244 -0
- package/dist/core/provenance/findings.js.map +1 -0
- package/dist/core/provenance/git.js +201 -0
- package/dist/core/provenance/git.js.map +1 -0
- package/dist/core/provenance/gitq/moves.js +139 -0
- package/dist/core/provenance/gitq/moves.js.map +1 -0
- package/dist/core/provenance/gitq/vouched-ancestor.js +179 -0
- package/dist/core/provenance/gitq/vouched-ancestor.js.map +1 -0
- package/dist/core/provenance/sample/scope.js +238 -0
- package/dist/core/provenance/sample/scope.js.map +1 -0
- package/dist/core/provenance/sample/sections.js +61 -0
- package/dist/core/provenance/sample/sections.js.map +1 -0
- package/dist/core/provenance/sources.js +280 -0
- package/dist/core/provenance/sources.js.map +1 -0
- package/dist/core/provenance/stamp.js +220 -0
- package/dist/core/provenance/stamp.js.map +1 -0
- package/dist/core/provenance/walk.js +157 -0
- package/dist/core/provenance/walk.js.map +1 -0
- package/dist/core/repo/authored/paths.js +210 -0
- package/dist/core/repo/authored/paths.js.map +1 -0
- package/dist/core/repo/entries.js +126 -0
- package/dist/core/repo/entries.js.map +1 -0
- package/dist/core/repo/paths.js +322 -0
- package/dist/core/repo/paths.js.map +1 -0
- package/dist/core/repo/repo.js +308 -0
- package/dist/core/repo/repo.js.map +1 -0
- package/dist/core/repo/service-target.js +153 -0
- package/dist/core/repo/service-target.js.map +1 -0
- package/dist/core/repo/state.js +58 -0
- package/dist/core/repo/state.js.map +1 -0
- package/dist/core/repo/tree/find.js +61 -0
- package/dist/core/repo/tree/find.js.map +1 -0
- package/dist/core/repo/tree/fs.js +90 -0
- package/dist/core/repo/tree/fs.js.map +1 -0
- package/dist/core/repo/tree/marker.js +61 -0
- package/dist/core/repo/tree/marker.js.map +1 -0
- package/dist/core/repo/tree/render/body.js +258 -0
- package/dist/core/repo/tree/render/body.js.map +1 -0
- package/dist/core/repo/tree/render/projects.js +182 -0
- package/dist/core/repo/tree/render/projects.js.map +1 -0
- package/dist/core/repo/tree/render/service/header.js +125 -0
- package/dist/core/repo/tree/render/service/header.js.map +1 -0
- package/dist/core/repo/tree/render/service/peers.js +28 -0
- package/dist/core/repo/tree/render/service/peers.js.map +1 -0
- package/dist/core/repo/tree/render/service/view-id.js +67 -0
- package/dist/core/repo/tree/render/service/view-id.js.map +1 -0
- package/dist/core/repo/tree/render/service/views.js +78 -0
- package/dist/core/repo/tree/render/service/views.js.map +1 -0
- package/dist/core/repo/tree/render/stale.js +42 -0
- package/dist/core/repo/tree/render/stale.js.map +1 -0
- package/dist/core/repo/tree/render/text.js +84 -0
- package/dist/core/repo/tree/render/text.js.map +1 -0
- package/dist/core/repo/tree/render/views.js +293 -0
- package/dist/core/repo/tree/render/views.js.map +1 -0
- package/dist/core/repo/tree/walk.js +255 -0
- package/dist/core/repo/tree/walk.js.map +1 -0
- package/dist/core/results.js +146 -14
- package/dist/core/results.js.map +1 -1
- package/dist/core/scaffold/landscape.js +239 -0
- package/dist/core/scaffold/landscape.js.map +1 -0
- package/dist/core/scaffold/legacy.js +271 -0
- package/dist/core/scaffold/legacy.js.map +1 -0
- package/dist/core/scaffold/readme.js +84 -0
- package/dist/core/scaffold/readme.js.map +1 -0
- package/dist/core/staging/commit.js +252 -0
- package/dist/core/staging/commit.js.map +1 -0
- package/dist/core/staging/interrupted.js +96 -0
- package/dist/core/staging/interrupted.js.map +1 -0
- package/dist/core/staging/lock.js +268 -0
- package/dist/core/staging/lock.js.map +1 -0
- package/dist/core/staging/recovery/finding.js +35 -0
- package/dist/core/staging/recovery/finding.js.map +1 -0
- package/dist/core/staging/recovery/intent.js +95 -0
- package/dist/core/staging/recovery/intent.js.map +1 -0
- package/dist/core/staging/recovery/recover.js +204 -0
- package/dist/core/staging/recovery/recover.js.map +1 -0
- package/dist/core/staging/recovery/residue.js +62 -0
- package/dist/core/staging/recovery/residue.js.map +1 -0
- package/dist/core/staging/snapshot/manifest.js +188 -0
- package/dist/core/staging/snapshot/manifest.js.map +1 -0
- package/dist/core/staging/snapshot/snapshot.js +196 -0
- package/dist/core/staging/snapshot/snapshot.js.map +1 -0
- package/dist/core/staging/txn/forward.js +181 -0
- package/dist/core/staging/txn/forward.js.map +1 -0
- package/dist/core/staging/txn/journal.js +139 -0
- package/dist/core/staging/txn/journal.js.map +1 -0
- package/dist/core/staging/txn/transaction.js +75 -0
- package/dist/core/staging/txn/transaction.js.map +1 -0
- package/dist/core/staging/writes.js +113 -0
- package/dist/core/staging/writes.js.map +1 -0
- package/dist/core/status/actions/execution.js +60 -0
- package/dist/core/status/actions/execution.js.map +1 -0
- package/dist/core/status/contracts.js +126 -0
- package/dist/core/status/contracts.js.map +1 -0
- package/dist/core/status/feature/artifacts.js +196 -0
- package/dist/core/status/feature/artifacts.js.map +1 -0
- package/dist/core/status/feature/feature.js +214 -0
- package/dist/core/status/feature/feature.js.map +1 -0
- package/dist/core/status/feature/next.js +163 -0
- package/dist/core/status/feature/next.js.map +1 -0
- package/dist/core/status/feature/state.js +21 -0
- package/dist/core/status/feature/state.js.map +1 -0
- package/dist/core/status/feature/words.js +96 -0
- package/dist/core/status/feature/words.js.map +1 -0
- package/dist/core/status/fleet/fleet.js +216 -0
- package/dist/core/status/fleet/fleet.js.map +1 -0
- package/dist/core/status/fleet/next.js +302 -0
- package/dist/core/status/fleet/next.js.map +1 -0
- package/dist/core/status/interrupted.js +97 -0
- package/dist/core/status/interrupted.js.map +1 -0
- package/dist/core/status/report.js +31 -0
- package/dist/core/status/report.js.map +1 -0
- package/dist/core/status/scan.js +41 -0
- package/dist/core/status/scan.js.map +1 -0
- package/dist/core/status/verification.js +216 -0
- package/dist/core/status/verification.js.map +1 -0
- package/dist/core/tasks/packet.js +199 -0
- package/dist/core/tasks/packet.js.map +1 -0
- package/dist/core/tasks/record.js +43 -0
- package/dist/core/tasks/record.js.map +1 -0
- package/dist/core/tasks/sources.js +181 -0
- package/dist/core/tasks/sources.js.map +1 -0
- package/dist/core/tasks/stamps.js +76 -0
- package/dist/core/tasks/stamps.js.map +1 -0
- package/dist/core/tasks/unit.js +0 -0
- package/dist/core/tasks/unit.js.map +1 -0
- package/dist/core/usecases/capability.js +166 -0
- package/dist/core/usecases/capability.js.map +1 -0
- package/dist/core/usecases/delta/claims.js +140 -0
- package/dist/core/usecases/delta/claims.js.map +1 -0
- package/dist/core/usecases/delta/flows.js +101 -0
- package/dist/core/usecases/delta/flows.js.map +1 -0
- package/dist/core/usecases/delta/modified.js +315 -0
- package/dist/core/usecases/delta/modified.js.map +1 -0
- package/dist/core/usecases/delta/overlay.js +76 -0
- package/dist/core/usecases/delta/overlay.js.map +1 -0
- package/dist/core/usecases/fleet.js +296 -0
- package/dist/core/usecases/fleet.js.map +1 -0
- package/dist/core/usecases/grade/capability-tag.js +93 -0
- package/dist/core/usecases/grade/capability-tag.js.map +1 -0
- package/dist/core/usecases/grade/feature.js +88 -0
- package/dist/core/usecases/grade/feature.js.map +1 -0
- package/dist/core/usecases/grade/requirement-tag.js +94 -0
- package/dist/core/usecases/grade/requirement-tag.js.map +1 -0
- package/dist/core/usecases/grade/steps.js +266 -0
- package/dist/core/usecases/grade/steps.js.map +1 -0
- package/dist/core/usecases/grade/usecases.js +112 -0
- package/dist/core/usecases/grade/usecases.js.map +1 -0
- package/dist/core/usecases/operations.js +123 -0
- package/dist/core/usecases/operations.js.map +1 -0
- package/dist/core/usecases/place.js +44 -0
- package/dist/core/usecases/place.js.map +1 -0
- package/dist/core/usecases/service/exclude.js +119 -0
- package/dist/core/usecases/service/exclude.js.map +1 -0
- package/dist/core/usecases/service/flows.js +164 -0
- package/dist/core/usecases/service/flows.js.map +1 -0
- package/dist/core/usecases/suites/participants.js +83 -0
- package/dist/core/usecases/suites/participants.js.map +1 -0
- package/dist/core/usecases/suites/suites.js +45 -0
- package/dist/core/usecases/suites/suites.js.map +1 -0
- package/dist/core/usecases/touch.js +101 -0
- package/dist/core/usecases/touch.js.map +1 -0
- package/dist/core/verify/answers.js +180 -0
- package/dist/core/verify/answers.js.map +1 -0
- package/dist/core/verify/build.js +170 -0
- package/dist/core/verify/build.js.map +1 -0
- package/dist/core/verify/checklist.js +259 -0
- package/dist/core/verify/checklist.js.map +1 -0
- package/dist/core/verify/claims/identity.js +61 -0
- package/dist/core/verify/claims/identity.js.map +1 -0
- package/dist/core/verify/cross/diff.js +97 -0
- package/dist/core/verify/cross/diff.js.map +1 -0
- package/dist/core/verify/evidence/contract.js +169 -0
- package/dist/core/verify/evidence/contract.js.map +1 -0
- package/dist/core/verify/location.js +67 -0
- package/dist/core/verify/location.js.map +1 -0
- package/dist/core/verify/pins/lint.js +158 -0
- package/dist/core/verify/pins/lint.js.map +1 -0
- package/dist/core/verify/pins/pin.js +95 -0
- package/dist/core/verify/pins/pin.js.map +1 -0
- package/dist/core/verify/read/file.js +224 -0
- package/dist/core/verify/read/file.js.map +1 -0
- package/dist/core/verify/read/shape.js +169 -0
- package/dist/core/verify/read/shape.js.map +1 -0
- package/dist/core/verify/read/union.js +105 -0
- package/dist/core/verify/read/union.js.map +1 -0
- package/dist/core/verify/record.js +165 -0
- package/dist/core/verify/record.js.map +1 -0
- package/dist/core/verify/store/commit.js +99 -0
- package/dist/core/verify/store/commit.js.map +1 -0
- package/dist/core/verify/store/render.js +61 -0
- package/dist/core/verify/store/render.js.map +1 -0
- package/dist/core/vocabulary/health.js +91 -0
- package/dist/core/vocabulary/health.js.map +1 -0
- package/dist/core/vocabulary/issue.js +59 -0
- package/dist/core/vocabulary/issue.js.map +1 -0
- package/dist/core/vocabulary/maturity.js +216 -0
- package/dist/core/vocabulary/maturity.js.map +1 -0
- package/dist/core/vocabulary/report.js +90 -0
- package/dist/core/vocabulary/report.js.map +1 -0
- package/dist/core/vocabulary/steps.js +266 -0
- package/dist/core/vocabulary/steps.js.map +1 -0
- package/dist/core/workspace/discover.js +239 -0
- package/dist/core/workspace/discover.js.map +1 -0
- package/dist/core/workspace/render.js +52 -0
- package/dist/core/workspace/render.js.map +1 -0
- package/examples/README.md +232 -0
- package/examples/docs/architecture/adrs/0001-transactional-outbox.md +33 -0
- package/examples/docs/architecture/capabilities.yaml +31 -0
- package/examples/docs/architecture/landscape.likec4 +336 -0
- package/examples/docs/architecture/obligations.yaml +23 -0
- package/examples/docs/architecture/permissions.yaml +50 -0
- package/examples/docs/architecture/services.likec4 +70 -0
- package/examples/docs/architecture/subsystems.likec4 +18 -0
- package/examples/docs/architecture/usecases/order-notification.likec4 +74 -0
- package/examples/docs/capabilities/checkout/spec.md +55 -0
- package/examples/docs/capabilities/identity/tokens/spec.md +42 -0
- package/examples/docs/capabilities/order-notifications/spec.md +43 -0
- package/examples/docs/features/FEAT-101-payment-splitting/adrs/0001-dedicated-split-service.md +18 -0
- package/examples/docs/features/FEAT-101-payment-splitting/delta.likec4 +94 -0
- package/examples/docs/features/FEAT-101-payment-splitting/intent.md +44 -0
- package/examples/docs/features/FEAT-101-payment-splitting/specs/checkout-web/spec.md +21 -0
- package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-service/asyncapi.yaml +132 -0
- package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-service/spec.md +36 -0
- package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-split-service/arch.spec.md +40 -0
- package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-split-service/openapi.yaml +116 -0
- package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-split-service/spec.md +55 -0
- package/examples/docs/features/FEAT-112-retire-order-v1/intent.md +35 -0
- package/examples/docs/features/FEAT-112-retire-order-v1/specs/order-service/openapi.yaml +31 -0
- package/examples/docs/features/FEAT-112-retire-order-v1/specs/order-service/spec.md +17 -0
- package/examples/docs/features/archive/FEAT-088-refunds/.loam-before/files/architecture/landscape.likec4 +253 -0
- package/examples/docs/features/archive/FEAT-088-refunds/.loam-before/files/services/order-service/spec.md +121 -0
- package/examples/docs/features/archive/FEAT-088-refunds/.loam-before/files/services/payment-service/openapi.yaml +111 -0
- package/examples/docs/features/archive/FEAT-088-refunds/.loam-before/files/services/payment-service/spec.md +58 -0
- package/examples/docs/features/archive/FEAT-088-refunds/.loam-before/manifest.json +32 -0
- package/examples/docs/features/archive/FEAT-088-refunds/adrs/0001-refunds-stay-in-payment-service.md +26 -0
- package/examples/docs/features/archive/FEAT-088-refunds/delta.likec4 +28 -0
- package/examples/docs/features/archive/FEAT-088-refunds/intent.md +26 -0
- package/examples/docs/features/archive/FEAT-088-refunds/specs/order-service/spec.md +37 -0
- package/examples/docs/features/archive/FEAT-088-refunds/specs/payment-service/openapi.yaml +73 -0
- package/examples/docs/features/archive/FEAT-088-refunds/specs/payment-service/spec.md +23 -0
- package/examples/docs/features/archive/FEAT-088-refunds/verification.yaml +76 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/files/architecture/landscape.likec4 +275 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/files/services/payment-service/asyncapi.yaml +96 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/files/services/payment-service/spec.md +82 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/files/services/platform/notification-service/asyncapi.yaml +164 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/files/services/platform/notification-service/spec.md +91 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/manifest.json +46 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/delta.likec4 +36 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/intent.md +22 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/scenario-report.json +10 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/specs/notification-service/asyncapi.yaml +208 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/specs/notification-service/spec.md +24 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/specs/payment-service/asyncapi.yaml +137 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/specs/payment-service/spec.md +31 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/verification.yaml +84 -0
- package/examples/docs/glossary/order.md +15 -0
- package/examples/docs/glossary/payments/authorization.md +14 -0
- package/examples/docs/likec4.config.json +8 -0
- package/examples/docs/loam.json +3 -0
- package/examples/docs/services/checkout-web/model.likec4 +92 -0
- package/examples/docs/services/checkout-web/spec.md +91 -0
- package/examples/docs/services/checkout-web/ui/pages/checkout.page.yaml +40 -0
- package/examples/docs/services/checkout-web/ui/pages/order-status.page.yaml +24 -0
- package/examples/docs/services/checkout-web/ui/pages/split-payment.page.yaml +26 -0
- package/examples/docs/services/order-service/adrs/0001-orchestrated-order-lifecycle.md +52 -0
- package/examples/docs/services/order-service/arch.spec.md +134 -0
- package/examples/docs/services/order-service/asyncapi.yaml +109 -0
- package/examples/docs/services/order-service/health.yaml +57 -0
- package/examples/docs/services/order-service/model.likec4 +126 -0
- package/examples/docs/services/order-service/openapi.yaml +257 -0
- package/examples/docs/services/order-service/runbook.md +62 -0
- package/examples/docs/services/order-service/spec.md +134 -0
- package/examples/docs/services/payment-service/adrs/0001-payments-outbox.md +18 -0
- package/examples/docs/services/payment-service/adrs/0002-idempotency-keys-on-authorization.md +27 -0
- package/examples/docs/services/payment-service/arch.spec.md +76 -0
- package/examples/docs/services/payment-service/asyncapi.yaml +130 -0
- package/examples/docs/services/payment-service/health.yaml +39 -0
- package/examples/docs/services/payment-service/model.likec4 +68 -0
- package/examples/docs/services/payment-service/openapi.yaml +151 -0
- package/examples/docs/services/payment-service/runbook.md +37 -0
- package/examples/docs/services/payment-service/spec.md +88 -0
- package/examples/docs/services/platform/identity-service/adrs/0001-token-introspection-over-local-validation.md +60 -0
- package/examples/docs/services/platform/identity-service/arch.spec.md +120 -0
- package/examples/docs/services/platform/identity-service/health.yaml +70 -0
- package/examples/docs/services/platform/identity-service/model.likec4 +81 -0
- package/examples/docs/services/platform/identity-service/openapi.yaml +197 -0
- package/examples/docs/services/platform/identity-service/runbook.md +95 -0
- package/examples/docs/services/platform/identity-service/spec.md +119 -0
- package/examples/docs/services/platform/notification-service/asyncapi.yaml +200 -0
- package/examples/docs/services/platform/notification-service/health.yaml +40 -0
- package/examples/docs/services/platform/notification-service/model.likec4 +97 -0
- package/examples/docs/services/platform/notification-service/runbook.md +48 -0
- package/examples/docs/services/platform/notification-service/spec.md +112 -0
- package/examples/docs/services/platform/subsystem.yaml +2 -0
- package/examples/fleet.yaml +57 -0
- package/package.json +19 -6
- package/dist/commands/adopt.js +0 -240
- package/dist/commands/adopt.js.map +0 -1
- package/dist/commands/archive.js +0 -1313
- package/dist/commands/archive.js.map +0 -1
- package/dist/commands/delta.js +0 -388
- package/dist/commands/delta.js.map +0 -1
- package/dist/commands/docs-repo-gate.js.map +0 -1
- package/dist/commands/format.js +0 -17
- package/dist/commands/format.js.map +0 -1
- package/dist/commands/gherkin.js +0 -309
- package/dist/commands/gherkin.js.map +0 -1
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/list.js +0 -295
- package/dist/commands/list.js.map +0 -1
- package/dist/commands/migrate-openspec.js +0 -950
- package/dist/commands/migrate-openspec.js.map +0 -1
- package/dist/commands/new.js +0 -413
- package/dist/commands/new.js.map +0 -1
- package/dist/commands/rebase.js +0 -356
- package/dist/commands/rebase.js.map +0 -1
- package/dist/commands/show.js +0 -320
- package/dist/commands/show.js.map +0 -1
- package/dist/commands/status.js +0 -262
- package/dist/commands/status.js.map +0 -1
- package/dist/commands/unarchive.js +0 -317
- package/dist/commands/unarchive.js.map +0 -1
- package/dist/commands/validate.js +0 -1773
- package/dist/commands/validate.js.map +0 -1
- package/dist/commands/verify.js +0 -775
- package/dist/commands/verify.js.map +0 -1
- package/dist/commands/vouch.js +0 -421
- package/dist/commands/vouch.js.map +0 -1
- package/dist/core/agent.js +0 -2173
- package/dist/core/agent.js.map +0 -1
- package/dist/core/agents-stamp.js.map +0 -1
- package/dist/core/arch.js +0 -130
- package/dist/core/arch.js.map +0 -1
- package/dist/core/asyncapi.js +0 -253
- package/dist/core/asyncapi.js.map +0 -1
- package/dist/core/brief.js +0 -755
- package/dist/core/brief.js.map +0 -1
- package/dist/core/coherence.js +0 -577
- package/dist/core/coherence.js.map +0 -1
- package/dist/core/concurrency.js.map +0 -1
- package/dist/core/config.js.map +0 -1
- package/dist/core/delta.js +0 -476
- package/dist/core/delta.js.map +0 -1
- package/dist/core/dependencies.js +0 -356
- package/dist/core/dependencies.js.map +0 -1
- package/dist/core/doctor.js +0 -596
- package/dist/core/doctor.js.map +0 -1
- package/dist/core/document-bytes.js.map +0 -1
- package/dist/core/explore.js +0 -225
- package/dist/core/explore.js.map +0 -1
- package/dist/core/frontmatter.js.map +0 -1
- package/dist/core/gherkin.js +0 -463
- package/dist/core/gherkin.js.map +0 -1
- package/dist/core/health.js +0 -67
- package/dist/core/health.js.map +0 -1
- package/dist/core/ids.js +0 -122
- package/dist/core/ids.js.map +0 -1
- package/dist/core/issue.js +0 -9
- package/dist/core/issue.js.map +0 -1
- package/dist/core/json.js +0 -74
- package/dist/core/json.js.map +0 -1
- package/dist/core/likec4.js +0 -489
- package/dist/core/likec4.js.map +0 -1
- package/dist/core/maturity.js +0 -66
- package/dist/core/maturity.js.map +0 -1
- package/dist/core/openapi-merge.js +0 -552
- package/dist/core/openapi-merge.js.map +0 -1
- package/dist/core/openapi.js.map +0 -1
- package/dist/core/openspec-inventory.js +0 -1440
- package/dist/core/openspec-inventory.js.map +0 -1
- package/dist/core/path-safety.js.map +0 -1
- package/dist/core/provenance.js +0 -787
- package/dist/core/provenance.js.map +0 -1
- package/dist/core/records.js.map +0 -1
- package/dist/core/repo.js +0 -438
- package/dist/core/repo.js.map +0 -1
- package/dist/core/report.js +0 -47
- package/dist/core/report.js.map +0 -1
- package/dist/core/spec.js +0 -505
- package/dist/core/spec.js.map +0 -1
- package/dist/core/staging.js +0 -890
- package/dist/core/staging.js.map +0 -1
- package/dist/core/status.js +0 -1132
- package/dist/core/status.js.map +0 -1
- package/dist/core/steps.js +0 -72
- package/dist/core/steps.js.map +0 -1
- package/dist/core/verify.js +0 -807
- package/dist/core/verify.js.map +0 -1
- package/dist/core/version.js.map +0 -1
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `loam-codes` reference page: which codes each INVOCATION can raise.
|
|
3
|
+
*
|
|
4
|
+
* The largest of the four pages and the one this migration is mostly about. As
|
|
5
|
+
* a section of AGENTS.md it was 44,433 bytes — 41% of a 109,399-byte file that
|
|
6
|
+
* Codex truncates at 32,768 and Windsurf at 12,000 characters, both silently.
|
|
7
|
+
* It is also the half a reader consults at a moment it can NAME (a run reported
|
|
8
|
+
* something) rather than the half it needs to form a question at all, which is
|
|
9
|
+
* what decided which side of the split it went. ./reference.ts carries the rest
|
|
10
|
+
* of that argument.
|
|
11
|
+
*
|
|
12
|
+
* This module does one thing: it CONCATENATES, in the order ../../agents-md.ts
|
|
13
|
+
* used to. Nothing here reformats a part on the way past, and nothing here is
|
|
14
|
+
* written — every byte comes from ../../agents-md/, which is where the sections
|
|
15
|
+
* already lived and where they stayed. The parts still carry their own trailing
|
|
16
|
+
* newlines and are joined with no separator, so the printed page is the old
|
|
17
|
+
* section byte for byte. That is the assembly contract every part's header
|
|
18
|
+
* points back at: each starts at the first character of its opening line and
|
|
19
|
+
* ends with the newline that closes its last one, or two parts glue onto one
|
|
20
|
+
* line on the printed page.
|
|
21
|
+
*
|
|
22
|
+
* WHAT IS AND IS NOT DUPLICATED. `## Reading loam's output` still exists in
|
|
23
|
+
* AGENTS.md (../../agents-md.ts's ORIENTATION), and it is orientation, not a
|
|
24
|
+
* summary of this page: the envelope's keys, branching on codes rather than
|
|
25
|
+
* prose, severity versus gating, and a pointer here. The per-invocation
|
|
26
|
+
* inventory below appears in exactly one place.
|
|
27
|
+
*/
|
|
28
|
+
import { CODE_MAP } from "../../agents-md/command-map.js";
|
|
29
|
+
import { CONTEXT_COMMAND } from "../../agents-md/map/lenses/context.js";
|
|
30
|
+
import { DIFF_COMMAND } from "../../agents-md/map/lenses/diff.js";
|
|
31
|
+
import { GATE_COMMAND } from "../../agents-md/map/lenses/gate.js";
|
|
32
|
+
import { EXPLAIN_COMMAND } from "../../agents-md/map/explain.js";
|
|
33
|
+
import { MCP_COMMAND } from "../../agents-md/map/mcp.js";
|
|
34
|
+
import { SUBSYSTEM_COMMANDS } from "../../agents-md/map/subsystem.js";
|
|
35
|
+
import { USECASE_VIEWS } from "../../agents-md/map/usecases.js";
|
|
36
|
+
import { REFUSALS } from "../../agents-md/refusals.js";
|
|
37
|
+
export const LOAM_CODES = {
|
|
38
|
+
name: "loam-codes",
|
|
39
|
+
description: "Reference: which codes each invocation can raise, command by command",
|
|
40
|
+
// No arguments: one document, printed whole. See ./spine.ts for why the hint
|
|
41
|
+
// is empty rather than a spelled-out "<none>".
|
|
42
|
+
argumentHint: "",
|
|
43
|
+
purpose: "The per-invocation inventory: which findings `validate --service` / `--feature` / `--all`, `status`, `doctor`, `gate`, `context`, `diff`, `explore`, `dependencies`, `rebase`, `seed`, `subsystem` and `mcp` can report, and the refusals the containment surface answers with.",
|
|
44
|
+
invocation: "loam instructions loam-codes",
|
|
45
|
+
placeholders: [],
|
|
46
|
+
// The page carries no `## ` headings — it is one list, and the bullets are
|
|
47
|
+
// the structure. The spine names the invocations it walks instead, which is
|
|
48
|
+
// what a reader is actually looking one of up.
|
|
49
|
+
spine: [
|
|
50
|
+
"validate --service / --feature / --all",
|
|
51
|
+
"status, doctor, rebase, dependencies, explore, seed",
|
|
52
|
+
"context, gate, subsystem, use-case views, diff, explain, mcp",
|
|
53
|
+
"the containment refusals and the OpenSpec migration surface",
|
|
54
|
+
],
|
|
55
|
+
// CODE_MAP already opens with the page's own "**What this page is.**" and
|
|
56
|
+
// leads with `status`, the orientation command.
|
|
57
|
+
body: CODE_MAP +
|
|
58
|
+
CONTEXT_COMMAND +
|
|
59
|
+
GATE_COMMAND +
|
|
60
|
+
SUBSYSTEM_COMMANDS +
|
|
61
|
+
USECASE_VIEWS +
|
|
62
|
+
DIFF_COMMAND +
|
|
63
|
+
EXPLAIN_COMMAND +
|
|
64
|
+
MCP_COMMAND +
|
|
65
|
+
REFUSALS,
|
|
66
|
+
};
|
|
67
|
+
//# sourceMappingURL=codes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codes.js","sourceRoot":"","sources":["../../../../../src/core/agent/workflows/reference/codes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAGvD,MAAM,CAAC,MAAM,UAAU,GAAmB;IACxC,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,sEAAsE;IACnF,6EAA6E;IAC7E,+CAA+C;IAC/C,YAAY,EAAE,EAAE;IAChB,OAAO,EACL,iRAAiR;IACnR,UAAU,EAAE,8BAA8B;IAC1C,YAAY,EAAE,EAAE;IAChB,2EAA2E;IAC3E,4EAA4E;IAC5E,+CAA+C;IAC/C,KAAK,EAAE;QACL,wCAAwC;QACxC,qDAAqD;QACrD,8DAA8D;QAC9D,6DAA6D;KAC9D;IACD,0EAA0E;IAC1E,gDAAgD;IAChD,IAAI,EACF,QAAQ;QACR,eAAe;QACf,YAAY;QACZ,kBAAkB;QAClB,aAAa;QACb,YAAY;QACZ,eAAe;QACf,WAAW;QACX,QAAQ;CACX,CAAC","sourcesContent":["/**\n * The `loam-codes` reference page: which codes each INVOCATION can raise.\n *\n * The largest of the four pages and the one this migration is mostly about. As\n * a section of AGENTS.md it was 44,433 bytes — 41% of a 109,399-byte file that\n * Codex truncates at 32,768 and Windsurf at 12,000 characters, both silently.\n * It is also the half a reader consults at a moment it can NAME (a run reported\n * something) rather than the half it needs to form a question at all, which is\n * what decided which side of the split it went. ./reference.ts carries the rest\n * of that argument.\n *\n * This module does one thing: it CONCATENATES, in the order ../../agents-md.ts\n * used to. Nothing here reformats a part on the way past, and nothing here is\n * written — every byte comes from ../../agents-md/, which is where the sections\n * already lived and where they stayed. The parts still carry their own trailing\n * newlines and are joined with no separator, so the printed page is the old\n * section byte for byte. That is the assembly contract every part's header\n * points back at: each starts at the first character of its opening line and\n * ends with the newline that closes its last one, or two parts glue onto one\n * line on the printed page.\n *\n * WHAT IS AND IS NOT DUPLICATED. `## Reading loam's output` still exists in\n * AGENTS.md (../../agents-md.ts's ORIENTATION), and it is orientation, not a\n * summary of this page: the envelope's keys, branching on codes rather than\n * prose, severity versus gating, and a pointer here. The per-invocation\n * inventory below appears in exactly one place.\n */\nimport { CODE_MAP } from \"../../agents-md/command-map.js\";\nimport { CONTEXT_COMMAND } from \"../../agents-md/map/lenses/context.js\";\nimport { DIFF_COMMAND } from \"../../agents-md/map/lenses/diff.js\";\nimport { GATE_COMMAND } from \"../../agents-md/map/lenses/gate.js\";\nimport { EXPLAIN_COMMAND } from \"../../agents-md/map/explain.js\";\nimport { MCP_COMMAND } from \"../../agents-md/map/mcp.js\";\nimport { SUBSYSTEM_COMMANDS } from \"../../agents-md/map/subsystem.js\";\nimport { USECASE_VIEWS } from \"../../agents-md/map/usecases.js\";\nimport { REFUSALS } from \"../../agents-md/refusals.js\";\nimport type { CommandContent } from \"../../contract.js\";\n\nexport const LOAM_CODES: CommandContent = {\n name: \"loam-codes\",\n description: \"Reference: which codes each invocation can raise, command by command\",\n // No arguments: one document, printed whole. See ./spine.ts for why the hint\n // is empty rather than a spelled-out \"<none>\".\n argumentHint: \"\",\n purpose:\n \"The per-invocation inventory: which findings `validate --service` / `--feature` / `--all`, `status`, `doctor`, `gate`, `context`, `diff`, `explore`, `dependencies`, `rebase`, `seed`, `subsystem` and `mcp` can report, and the refusals the containment surface answers with.\",\n invocation: \"loam instructions loam-codes\",\n placeholders: [],\n // The page carries no `## ` headings — it is one list, and the bullets are\n // the structure. The spine names the invocations it walks instead, which is\n // what a reader is actually looking one of up.\n spine: [\n \"validate --service / --feature / --all\",\n \"status, doctor, rebase, dependencies, explore, seed\",\n \"context, gate, subsystem, use-case views, diff, explain, mcp\",\n \"the containment refusals and the OpenSpec migration surface\",\n ],\n // CODE_MAP already opens with the page's own \"**What this page is.**\" and\n // leads with `status`, the orientation command.\n body:\n CODE_MAP +\n CONTEXT_COMMAND +\n GATE_COMMAND +\n SUBSYSTEM_COMMANDS +\n USECASE_VIEWS +\n DIFF_COMMAND +\n EXPLAIN_COMMAND +\n MCP_COMMAND +\n REFUSALS,\n};\n"]}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
export const LOAM_DONE_CHECK = {
|
|
2
|
+
name: "loam-done-check",
|
|
3
|
+
description: "Reference: the done-check — how `loam verify` derives claims, and verified versus attested",
|
|
4
|
+
// No arguments: one document, printed whole. See ./spine.ts for why the hint
|
|
5
|
+
// is empty rather than a spelled-out "<none>".
|
|
6
|
+
argumentHint: "",
|
|
7
|
+
purpose: "What `loam verify` asks, which of the three channels may answer each kind of claim, how a cross-service feature is recorded from each service's own repository, and why an agent's word yields `attested` rather than `verified`.",
|
|
8
|
+
invocation: "loam instructions loam-done-check",
|
|
9
|
+
placeholders: [],
|
|
10
|
+
spine: ["The done-check"],
|
|
11
|
+
body: `The done-check: what \`loam verify\` asks, who may answer it, and what the answer is worth.
|
|
12
|
+
|
|
13
|
+
## The done-check
|
|
14
|
+
|
|
15
|
+
\`loam verify <FEAT>\` derives a checklist from the feature's own artifacts —
|
|
16
|
+
one claim per new service, per operation the delta adds, per tagged edge that
|
|
17
|
+
names an operation, and per scenario of every changed requirement, arch.spec.md
|
|
18
|
+
deltas included (those claims name their file, and the test they ask for is an
|
|
19
|
+
integration/ops test, not an acceptance test). Each claim has a stable id, so
|
|
20
|
+
two runs are diffable and an answer cannot drift onto a different question.
|
|
21
|
+
|
|
22
|
+
Three answer channels, and they never overlap. The \`scenario.tested\` claims
|
|
23
|
+
are the TEST RUNNER's to answer: run the generated suite and pass its report
|
|
24
|
+
back — cucumber JSON (\`cucumber-js --format json:report.json\`), or loam's own
|
|
25
|
+
runner-neutral shape \`{"loamScenarioReport": 1, "results": [{"digest": "…",
|
|
26
|
+
"status": "passed"}]}\` that any runner can be adapted into, chosen by its
|
|
27
|
+
marker key. The digest is the contract, never the dialect: both read
|
|
28
|
+
\`answered_by: runner\` because both are a real run reporting that digest green,
|
|
29
|
+
so a JUnit or pytest fleet is not held at \`attested\` by a file format —
|
|
30
|
+
\`loam verify <FEAT> --results report.json\`. A claim is confirmed only when a
|
|
31
|
+
report scenario carrying its \`@loam-digest-<16hex>\` tag ran at least one step
|
|
32
|
+
and every step passed — every occurrence, when the report holds a re-run, and
|
|
33
|
+
every before/after hook with it — and, in a cucumber report, ran exactly as
|
|
34
|
+
many steps as the stamped scenario has: a hand-tagged stub is not that
|
|
35
|
+
scenario's run. A failed, undefined, pending or skipped step, a failed hook, a
|
|
36
|
+
step count that differs, or no matching scenario at all, is \`unconfirmed\` with
|
|
37
|
+
the reason. A report that is not JSON (a JUnit XML file) is refused
|
|
38
|
+
\`answers-unreadable\`, naming both shapes. The digest is the only identity: a reworded spec scenario matches
|
|
39
|
+
nothing until the suite is regenerated and re-run. When a report exists,
|
|
40
|
+
ALWAYS pass \`--results\` — under it the runner owns every scenario claim, and
|
|
41
|
+
an answers-file entry for one is refused.
|
|
42
|
+
|
|
43
|
+
The \`api.exposes\` claims have a mechanical channel of their own: an API
|
|
44
|
+
contract-test run, passed back with
|
|
45
|
+
\`loam verify <FEAT> --contract-results contract.json\`. loam accepts one
|
|
46
|
+
shape — its own documented contract-results JSON,
|
|
47
|
+
\`{"loamContractReport": 1, "results": [{"operationId": "createSplit",
|
|
48
|
+
"status": "passed"}]}\` — emitted from your contract tool's report in one
|
|
49
|
+
transform (Specmatic's own coverage JSON is refused by design: its "covered"
|
|
50
|
+
status means exercised, not passed, so reading it would confirm what a red run
|
|
51
|
+
refuted). An entry whose status is exactly \`passed\` confirms the claim whose
|
|
52
|
+
operationId it names — the record says \`answered_by: external-runner\` and the
|
|
53
|
+
views mark the line \`[contract]\` — while a failed or unknown status and an
|
|
54
|
+
operation the report never exercised leave the claim \`unconfirmed\` with the
|
|
55
|
+
reason; entries naming operations outside the checklist are ignored.
|
|
56
|
+
\`verify.operation-contested\` (warn) is \`verify.digest-contested\`'s twin on
|
|
57
|
+
this axis: an operationId is unique per contract document, not per fleet, so
|
|
58
|
+
when two services on the checklist expose the same one, a report entry — which
|
|
59
|
+
names no service — cannot say whose suite exercised it, those claims stay
|
|
60
|
+
unconfirmed, and each service records its own with \`--service\`. Under the
|
|
61
|
+
flag the contract report OWNS every api.exposes claim in scope, so an
|
|
62
|
+
answers-file entry for one is refused (\`answers-mismatch\`), and the record
|
|
63
|
+
pins the file consumed in \`contractReport\` (path, sha256 of the bytes, mtime,
|
|
64
|
+
operation count) exactly as \`report\` pins the cucumber one. The verdict
|
|
65
|
+
ladder does not move: external evidence never answers a \`scenario.tested\`
|
|
66
|
+
claim, so \`attested\` versus \`verified\` still turns on scenario claims
|
|
67
|
+
alone.
|
|
68
|
+
|
|
69
|
+
\`--record\` without \`--results\` is the fallback for a service with no runnable
|
|
70
|
+
suite yet: there your word answers the scenario claims too. It still works, and
|
|
71
|
+
it costs something you must know about. The record says who answered
|
|
72
|
+
(\`answered_by: agent\`), and that answer changes the VERDICT: a feature whose
|
|
73
|
+
scenario claims rest on an agent's word is **attested**, not verified.
|
|
74
|
+
\`verify --json\` reports \`verdict: "attested"\` with \`verified: false\` and an
|
|
75
|
+
\`attested\` count, \`loam status\` marks it and adds a \`next.verify-attested\` step,
|
|
76
|
+
and the notice rides in \`notices[]\` under \`verify.scenario-attested\` (warn —
|
|
77
|
+
nothing gates on it, because a legacy service with no suite must still be able
|
|
78
|
+
to ship). Answer them mechanically the moment a suite runs:
|
|
79
|
+
\`loam verify <FEAT> --results <report.json>\`.
|
|
80
|
+
|
|
81
|
+
A record that leaves any claim unconfirmed or unanswered carries
|
|
82
|
+
\`verify.claims-open\` (warn) in \`notices[]\` — the one-line "not a clean
|
|
83
|
+
result" summary with all four counts, on the read view and the frozen
|
|
84
|
+
post-archive view alike; it gates nothing, and a feature with no record at all
|
|
85
|
+
never carries it, because not-started is not partial.
|
|
86
|
+
|
|
87
|
+
Federated \`--record\` also stamps \`evidence_pins\` on each agent-confirmed
|
|
88
|
+
citation — the cited file's sha256 at the attested commit, the cited line's
|
|
89
|
+
text, and the literal token the claim asserts (operationId, message name, edge
|
|
90
|
+
op). One notice rides beside the stamp: \`verify.evidence-token-missing\` (warn,
|
|
91
|
+
verdict-neutral, gates nothing) says a cited file at the attested commit does
|
|
92
|
+
not contain the claim's token — read that evidence first, while the answer can
|
|
93
|
+
still be corrected. \`loam validate\`, run later in the service's repo,
|
|
94
|
+
re-checks the pins and reports drift under the \`evidence.*\` findings; nothing
|
|
95
|
+
there moves a verdict either.
|
|
96
|
+
|
|
97
|
+
Two more codes belong to the record itself. \`verify.record-miscounted\` (error):
|
|
98
|
+
a record file whose \`summary\` block contradicts its own \`claims[]\` — the
|
|
99
|
+
record is refused as unreadable rather than believed in either half, and the
|
|
100
|
+
repair is never editing the counts: a service's own \`verification/<id>.yaml\`
|
|
101
|
+
is deleted and recorded again by that service, and the one-file
|
|
102
|
+
\`verification.yaml\` is restored from version control and then recorded over.
|
|
103
|
+
\`verify.digest-contested\`
|
|
104
|
+
(warn): two or more services word a scenario identically, so they share one
|
|
105
|
+
\`@loam-digest-…\` tag and no single cucumber report can say whose suite ran it —
|
|
106
|
+
those scenario claims are left unconfirmed, and each service records its own
|
|
107
|
+
from its own repository with \`--service\`.
|
|
108
|
+
|
|
109
|
+
A federated record also says WHAT EACH SERVICE ANSWERED AGAINST. Every
|
|
110
|
+
attestation carries the \`checklist\` digest it answered and, when the docs repo
|
|
111
|
+
is a git checkout, the \`docsCommit\` that checklist was derived from — so the
|
|
112
|
+
record pins both sides, the service repo through \`commit\` and the question set
|
|
113
|
+
through these two. \`verify.checklist-forked\` (warn) is what that buys: it names the
|
|
114
|
+
services whose attestation answers a DIFFERENT checklist than the feature now
|
|
115
|
+
asks, which the record-level \`checklist\` field alone could never show — it
|
|
116
|
+
flagged every service or none, and never said which answers went stale. It is
|
|
117
|
+
measured against the present rather than pairwise between attestations, because
|
|
118
|
+
services that all answered a since-rewritten delta agree with each other and are
|
|
119
|
+
every one of them stale. Differing \`docsCommit\` values are NOT a finding:
|
|
120
|
+
recording a week apart is normal for a feature in flight.
|
|
121
|
+
Normal mid-rollout and it gates nothing; re-record the services on the older
|
|
122
|
+
version from their own repositories. In a record kept as per-service files the
|
|
123
|
+
answers of the services it names do not count until they do: the record
|
|
124
|
+
answers the newest version its files answered, and an answer filed against an
|
|
125
|
+
older one could otherwise fill the slot of the question that replaced it.
|
|
126
|
+
Attestations written before the field existed carry no \`checklist\` and are not
|
|
127
|
+
counted as a third version — silence is not disagreement.
|
|
128
|
+
|
|
129
|
+
A consumed report is written down: \`report\` and \`contractReport\` on the
|
|
130
|
+
record (or on that repository's attestation) each carry the path, a sha256 of
|
|
131
|
+
the bytes, the file's mtime and how much it held — tagged scenarios for the
|
|
132
|
+
one, distinct operationIds for the other. That identifies WHICH file answered
|
|
133
|
+
the claims, and — when the file is committed — that it matches the attested
|
|
134
|
+
commit. It does not prove the file came from executing that commit; no digest
|
|
135
|
+
can.
|
|
136
|
+
|
|
137
|
+
Everything else you answer from the code, and \`--record answers.json\` takes
|
|
138
|
+
those back — into \`features/<FEAT>/verification/<svc>.yaml\` with \`--service\`,
|
|
139
|
+
into the one file \`features/<FEAT>/verification.yaml\` without — and either
|
|
140
|
+
travels into the archive with the feature and reads without loam. Alongside the mechanical
|
|
141
|
+
flags, the answers file must answer exactly the claims no report owns: an
|
|
142
|
+
entry for a report-owned claim is refused (\`answers-mismatch\`), and a
|
|
143
|
+
mechanical flag alone is refused while claims outside its kind are
|
|
144
|
+
outstanding. Every recorded verdict says who answered it
|
|
145
|
+
(\`answered_by: runner | external-runner | agent\`), so a reviewer can tell a
|
|
146
|
+
green run from somebody's word.
|
|
147
|
+
|
|
148
|
+
**A cross-service feature is verified once per service, and the form matters.**
|
|
149
|
+
The claims of one feature belong to several services, and each service's code
|
|
150
|
+
lives in its own repository — so the recording form is federated:
|
|
151
|
+
|
|
152
|
+
\`\`\`sh
|
|
153
|
+
# in EACH affected service's own repo, not in the docs repo:
|
|
154
|
+
loam verify FEAT-101 --service payment-service --results report.json --record answers.json
|
|
155
|
+
# with an API contract suite, its report answers the api.exposes claims too:
|
|
156
|
+
loam verify FEAT-101 --service payment-service --results report.json --contract-results contract.json --record answers.json
|
|
157
|
+
\`\`\`
|
|
158
|
+
|
|
159
|
+
\`--service <id>\` narrows the checklist to that service's claims and binds the
|
|
160
|
+
answers to this repository's commit, producing that service's **attestation**
|
|
161
|
+
as a file of its own, \`features/<FEAT>/verification/<id>.yaml\`. The directory
|
|
162
|
+
is the record: loam adds the files up when it reads, and the verdict and
|
|
163
|
+
counts are computed from them, never stored. Re-running it in the next repo
|
|
164
|
+
writes that repo's file and touches no other — which is why two teams'
|
|
165
|
+
attestations on two docs-repo branches merge cleanly, where one shared file
|
|
166
|
+
conflicted every time. A one-file federated \`verification.yaml\` written
|
|
167
|
+
before the directory is still read; a service that records again supersedes
|
|
168
|
+
its share of it, and the file goes once every service it names has its own.
|
|
169
|
+
Omitting
|
|
170
|
+
\`--service\` in a repo whose \`loam.json\` declares one substitutes it, so the
|
|
171
|
+
short form is safe there; a \`--service\` naming a service this repo does not
|
|
172
|
+
declare is refused (\`service-mismatch\`), and \`--service\` from a repo that
|
|
173
|
+
declares none is refused (\`repository-unavailable\`) — an attestation has to be
|
|
174
|
+
bound to the code it is about.
|
|
175
|
+
|
|
176
|
+
⚠ **The legacy all-at-once form \`loam verify <FEAT> --record answers.json\` with
|
|
177
|
+
no \`--service\` writes the whole record from one place.** Over a record that
|
|
178
|
+
already carries other services' attestations it is refused outright
|
|
179
|
+
(\`record-federated\`, naming the attestors) rather than merged or migrated — the
|
|
180
|
+
alternative was one repo silently erasing nine others' evidence. Use it only for
|
|
181
|
+
a single-service feature that has never been recorded federated. A record file
|
|
182
|
+
that exists but cannot be read — broken YAML, git conflict markers, a miscount
|
|
183
|
+
— is \`record-unreadable\`: it is never overwritten and never reported as "no
|
|
184
|
+
record", and the message names the file and the repair that is safe for it. A
|
|
185
|
+
service's own \`verification/<id>.yaml\` holds only that service's word, so that
|
|
186
|
+
service may delete it and record again; the one-file \`verification.yaml\` may
|
|
187
|
+
hold other services' attestations, so it is restored from version control
|
|
188
|
+
(after a merge, the copy on the branch you merged into) and never deleted.
|
|
189
|
+
|
|
190
|
+
Reading is not writing: \`loam verify <FEAT> --service <id>\` **without**
|
|
191
|
+
\`--record\` is a pure lens on the checklist. A read-only verify checklist needs no
|
|
192
|
+
binding and works from the docs repo, or from anywhere else — the refusals above
|
|
193
|
+
are about WRITING an attestation, and only about that. Every run lists all
|
|
194
|
+
subjects in \`services\`, and a recorded run reports in \`discarded\` every previous
|
|
195
|
+
answer the new record does not carry.
|
|
196
|
+
|
|
197
|
+
It refuses an answer set that does not answer the current checklist: an id that
|
|
198
|
+
is not on it (\`answers-mismatch\`), a claim with no answer (same), or a
|
|
199
|
+
\`confirmed\` with no evidence (\`answers-unevidenced\`). Evidence is \`file:line\`.
|
|
200
|
+
A claim you cannot show is \`unconfirmed\` with a note saying why — that is a
|
|
201
|
+
successful record, and it is more useful to the next reader than a yes.
|
|
202
|
+
|
|
203
|
+
**Nothing gates on it.** \`loam archive\` will ship an unverified feature. That
|
|
204
|
+
is deliberate: coherence is something loam computed from the documents, and a
|
|
205
|
+
verdict is your word about code loam never read. A gate in front of shipping
|
|
206
|
+
would only teach everyone that the cheapest way past it is to say yes. The
|
|
207
|
+
record is for the reviewer who comes later, so leave it true.
|
|
208
|
+
`,
|
|
209
|
+
};
|
|
210
|
+
//# sourceMappingURL=done-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"done-check.js","sourceRoot":"","sources":["../../../../../src/core/agent/workflows/reference/done-check.ts"],"names":[],"mappings":"AAcA,MAAM,CAAC,MAAM,eAAe,GAAmB;IAC7C,IAAI,EAAE,iBAAiB;IACvB,WAAW,EACT,4FAA4F;IAC9F,6EAA6E;IAC7E,+CAA+C;IAC/C,YAAY,EAAE,EAAE;IAChB,OAAO,EACL,mOAAmO;IACrO,UAAU,EAAE,mCAAmC;IAC/C,YAAY,EAAE,EAAE;IAChB,KAAK,EAAE,CAAC,gBAAgB,CAAC;IACzB,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqMP;CACA,CAAC","sourcesContent":["/**\n * The `loam-done-check` reference page: how `loam verify` derives its claims,\n * who may answer them, and what separates **verified** from **attested**.\n *\n * It is the longest single section the corpus had after the code inventory —\n * three answer channels, the federated recording form, the evidence pins and\n * the six codes the record itself can carry — and every word of it is read at\n * one moment in the cycle, step 7. AGENTS.md's own step 7 names this page.\n *\n * The text is the AGENTS.md section verbatim. See ./reference.ts for why the\n * four pages exist and what was traded for them.\n */\nimport type { CommandContent } from \"../../contract.js\";\n\nexport const LOAM_DONE_CHECK: CommandContent = {\n name: \"loam-done-check\",\n description:\n \"Reference: the done-check — how `loam verify` derives claims, and verified versus attested\",\n // No arguments: one document, printed whole. See ./spine.ts for why the hint\n // is empty rather than a spelled-out \"<none>\".\n argumentHint: \"\",\n purpose:\n \"What `loam verify` asks, which of the three channels may answer each kind of claim, how a cross-service feature is recorded from each service's own repository, and why an agent's word yields `attested` rather than `verified`.\",\n invocation: \"loam instructions loam-done-check\",\n placeholders: [],\n spine: [\"The done-check\"],\n body: `The done-check: what \\`loam verify\\` asks, who may answer it, and what the answer is worth.\n\n## The done-check\n\n\\`loam verify <FEAT>\\` derives a checklist from the feature's own artifacts —\none claim per new service, per operation the delta adds, per tagged edge that\nnames an operation, and per scenario of every changed requirement, arch.spec.md\ndeltas included (those claims name their file, and the test they ask for is an\nintegration/ops test, not an acceptance test). Each claim has a stable id, so\ntwo runs are diffable and an answer cannot drift onto a different question.\n\nThree answer channels, and they never overlap. The \\`scenario.tested\\` claims\nare the TEST RUNNER's to answer: run the generated suite and pass its report\nback — cucumber JSON (\\`cucumber-js --format json:report.json\\`), or loam's own\nrunner-neutral shape \\`{\"loamScenarioReport\": 1, \"results\": [{\"digest\": \"…\",\n\"status\": \"passed\"}]}\\` that any runner can be adapted into, chosen by its\nmarker key. The digest is the contract, never the dialect: both read\n\\`answered_by: runner\\` because both are a real run reporting that digest green,\nso a JUnit or pytest fleet is not held at \\`attested\\` by a file format —\n\\`loam verify <FEAT> --results report.json\\`. A claim is confirmed only when a\nreport scenario carrying its \\`@loam-digest-<16hex>\\` tag ran at least one step\nand every step passed — every occurrence, when the report holds a re-run, and\nevery before/after hook with it — and, in a cucumber report, ran exactly as\nmany steps as the stamped scenario has: a hand-tagged stub is not that\nscenario's run. A failed, undefined, pending or skipped step, a failed hook, a\nstep count that differs, or no matching scenario at all, is \\`unconfirmed\\` with\nthe reason. A report that is not JSON (a JUnit XML file) is refused\n\\`answers-unreadable\\`, naming both shapes. The digest is the only identity: a reworded spec scenario matches\nnothing until the suite is regenerated and re-run. When a report exists,\nALWAYS pass \\`--results\\` — under it the runner owns every scenario claim, and\nan answers-file entry for one is refused.\n\nThe \\`api.exposes\\` claims have a mechanical channel of their own: an API\ncontract-test run, passed back with\n\\`loam verify <FEAT> --contract-results contract.json\\`. loam accepts one\nshape — its own documented contract-results JSON,\n\\`{\"loamContractReport\": 1, \"results\": [{\"operationId\": \"createSplit\",\n\"status\": \"passed\"}]}\\` — emitted from your contract tool's report in one\ntransform (Specmatic's own coverage JSON is refused by design: its \"covered\"\nstatus means exercised, not passed, so reading it would confirm what a red run\nrefuted). An entry whose status is exactly \\`passed\\` confirms the claim whose\noperationId it names — the record says \\`answered_by: external-runner\\` and the\nviews mark the line \\`[contract]\\` — while a failed or unknown status and an\noperation the report never exercised leave the claim \\`unconfirmed\\` with the\nreason; entries naming operations outside the checklist are ignored.\n\\`verify.operation-contested\\` (warn) is \\`verify.digest-contested\\`'s twin on\nthis axis: an operationId is unique per contract document, not per fleet, so\nwhen two services on the checklist expose the same one, a report entry — which\nnames no service — cannot say whose suite exercised it, those claims stay\nunconfirmed, and each service records its own with \\`--service\\`. Under the\nflag the contract report OWNS every api.exposes claim in scope, so an\nanswers-file entry for one is refused (\\`answers-mismatch\\`), and the record\npins the file consumed in \\`contractReport\\` (path, sha256 of the bytes, mtime,\noperation count) exactly as \\`report\\` pins the cucumber one. The verdict\nladder does not move: external evidence never answers a \\`scenario.tested\\`\nclaim, so \\`attested\\` versus \\`verified\\` still turns on scenario claims\nalone.\n\n\\`--record\\` without \\`--results\\` is the fallback for a service with no runnable\nsuite yet: there your word answers the scenario claims too. It still works, and\nit costs something you must know about. The record says who answered\n(\\`answered_by: agent\\`), and that answer changes the VERDICT: a feature whose\nscenario claims rest on an agent's word is **attested**, not verified.\n\\`verify --json\\` reports \\`verdict: \"attested\"\\` with \\`verified: false\\` and an\n\\`attested\\` count, \\`loam status\\` marks it and adds a \\`next.verify-attested\\` step,\nand the notice rides in \\`notices[]\\` under \\`verify.scenario-attested\\` (warn —\nnothing gates on it, because a legacy service with no suite must still be able\nto ship). Answer them mechanically the moment a suite runs:\n\\`loam verify <FEAT> --results <report.json>\\`.\n\nA record that leaves any claim unconfirmed or unanswered carries\n\\`verify.claims-open\\` (warn) in \\`notices[]\\` — the one-line \"not a clean\nresult\" summary with all four counts, on the read view and the frozen\npost-archive view alike; it gates nothing, and a feature with no record at all\nnever carries it, because not-started is not partial.\n\nFederated \\`--record\\` also stamps \\`evidence_pins\\` on each agent-confirmed\ncitation — the cited file's sha256 at the attested commit, the cited line's\ntext, and the literal token the claim asserts (operationId, message name, edge\nop). One notice rides beside the stamp: \\`verify.evidence-token-missing\\` (warn,\nverdict-neutral, gates nothing) says a cited file at the attested commit does\nnot contain the claim's token — read that evidence first, while the answer can\nstill be corrected. \\`loam validate\\`, run later in the service's repo,\nre-checks the pins and reports drift under the \\`evidence.*\\` findings; nothing\nthere moves a verdict either.\n\nTwo more codes belong to the record itself. \\`verify.record-miscounted\\` (error):\na record file whose \\`summary\\` block contradicts its own \\`claims[]\\` — the\nrecord is refused as unreadable rather than believed in either half, and the\nrepair is never editing the counts: a service's own \\`verification/<id>.yaml\\`\nis deleted and recorded again by that service, and the one-file\n\\`verification.yaml\\` is restored from version control and then recorded over.\n\\`verify.digest-contested\\`\n(warn): two or more services word a scenario identically, so they share one\n\\`@loam-digest-…\\` tag and no single cucumber report can say whose suite ran it —\nthose scenario claims are left unconfirmed, and each service records its own\nfrom its own repository with \\`--service\\`.\n\nA federated record also says WHAT EACH SERVICE ANSWERED AGAINST. Every\nattestation carries the \\`checklist\\` digest it answered and, when the docs repo\nis a git checkout, the \\`docsCommit\\` that checklist was derived from — so the\nrecord pins both sides, the service repo through \\`commit\\` and the question set\nthrough these two. \\`verify.checklist-forked\\` (warn) is what that buys: it names the\nservices whose attestation answers a DIFFERENT checklist than the feature now\nasks, which the record-level \\`checklist\\` field alone could never show — it\nflagged every service or none, and never said which answers went stale. It is\nmeasured against the present rather than pairwise between attestations, because\nservices that all answered a since-rewritten delta agree with each other and are\nevery one of them stale. Differing \\`docsCommit\\` values are NOT a finding:\nrecording a week apart is normal for a feature in flight.\nNormal mid-rollout and it gates nothing; re-record the services on the older\nversion from their own repositories. In a record kept as per-service files the\nanswers of the services it names do not count until they do: the record\nanswers the newest version its files answered, and an answer filed against an\nolder one could otherwise fill the slot of the question that replaced it.\nAttestations written before the field existed carry no \\`checklist\\` and are not\ncounted as a third version — silence is not disagreement.\n\nA consumed report is written down: \\`report\\` and \\`contractReport\\` on the\nrecord (or on that repository's attestation) each carry the path, a sha256 of\nthe bytes, the file's mtime and how much it held — tagged scenarios for the\none, distinct operationIds for the other. That identifies WHICH file answered\nthe claims, and — when the file is committed — that it matches the attested\ncommit. It does not prove the file came from executing that commit; no digest\ncan.\n\nEverything else you answer from the code, and \\`--record answers.json\\` takes\nthose back — into \\`features/<FEAT>/verification/<svc>.yaml\\` with \\`--service\\`,\ninto the one file \\`features/<FEAT>/verification.yaml\\` without — and either\ntravels into the archive with the feature and reads without loam. Alongside the mechanical\nflags, the answers file must answer exactly the claims no report owns: an\nentry for a report-owned claim is refused (\\`answers-mismatch\\`), and a\nmechanical flag alone is refused while claims outside its kind are\noutstanding. Every recorded verdict says who answered it\n(\\`answered_by: runner | external-runner | agent\\`), so a reviewer can tell a\ngreen run from somebody's word.\n\n**A cross-service feature is verified once per service, and the form matters.**\nThe claims of one feature belong to several services, and each service's code\nlives in its own repository — so the recording form is federated:\n\n\\`\\`\\`sh\n# in EACH affected service's own repo, not in the docs repo:\nloam verify FEAT-101 --service payment-service --results report.json --record answers.json\n# with an API contract suite, its report answers the api.exposes claims too:\nloam verify FEAT-101 --service payment-service --results report.json --contract-results contract.json --record answers.json\n\\`\\`\\`\n\n\\`--service <id>\\` narrows the checklist to that service's claims and binds the\nanswers to this repository's commit, producing that service's **attestation**\nas a file of its own, \\`features/<FEAT>/verification/<id>.yaml\\`. The directory\nis the record: loam adds the files up when it reads, and the verdict and\ncounts are computed from them, never stored. Re-running it in the next repo\nwrites that repo's file and touches no other — which is why two teams'\nattestations on two docs-repo branches merge cleanly, where one shared file\nconflicted every time. A one-file federated \\`verification.yaml\\` written\nbefore the directory is still read; a service that records again supersedes\nits share of it, and the file goes once every service it names has its own.\nOmitting\n\\`--service\\` in a repo whose \\`loam.json\\` declares one substitutes it, so the\nshort form is safe there; a \\`--service\\` naming a service this repo does not\ndeclare is refused (\\`service-mismatch\\`), and \\`--service\\` from a repo that\ndeclares none is refused (\\`repository-unavailable\\`) — an attestation has to be\nbound to the code it is about.\n\n⚠ **The legacy all-at-once form \\`loam verify <FEAT> --record answers.json\\` with\nno \\`--service\\` writes the whole record from one place.** Over a record that\nalready carries other services' attestations it is refused outright\n(\\`record-federated\\`, naming the attestors) rather than merged or migrated — the\nalternative was one repo silently erasing nine others' evidence. Use it only for\na single-service feature that has never been recorded federated. A record file\nthat exists but cannot be read — broken YAML, git conflict markers, a miscount\n— is \\`record-unreadable\\`: it is never overwritten and never reported as \"no\nrecord\", and the message names the file and the repair that is safe for it. A\nservice's own \\`verification/<id>.yaml\\` holds only that service's word, so that\nservice may delete it and record again; the one-file \\`verification.yaml\\` may\nhold other services' attestations, so it is restored from version control\n(after a merge, the copy on the branch you merged into) and never deleted.\n\nReading is not writing: \\`loam verify <FEAT> --service <id>\\` **without**\n\\`--record\\` is a pure lens on the checklist. A read-only verify checklist needs no\nbinding and works from the docs repo, or from anywhere else — the refusals above\nare about WRITING an attestation, and only about that. Every run lists all\nsubjects in \\`services\\`, and a recorded run reports in \\`discarded\\` every previous\nanswer the new record does not carry.\n\nIt refuses an answer set that does not answer the current checklist: an id that\nis not on it (\\`answers-mismatch\\`), a claim with no answer (same), or a\n\\`confirmed\\` with no evidence (\\`answers-unevidenced\\`). Evidence is \\`file:line\\`.\nA claim you cannot show is \\`unconfirmed\\` with a note saying why — that is a\nsuccessful record, and it is more useful to the next reader than a yes.\n\n**Nothing gates on it.** \\`loam archive\\` will ship an unverified feature. That\nis deliberate: coherence is something loam computed from the documents, and a\nverdict is your word about code loam never read. A gate in front of shipping\nwould only teach everyone that the cheapest way past it is to say yes. The\nrecord is for the reviewer who comes later, so leave it true.\n`,\n};\n"]}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
export const LOAM_DRAWING = {
|
|
2
|
+
name: "loam-drawing",
|
|
3
|
+
description: "Reference: drawing the map so a person can read it — relationship kinds and which way each arrow points, the legend, overview views",
|
|
4
|
+
// A reference page takes no arguments: see ../spine.ts for why the hint is
|
|
5
|
+
// empty rather than a spelled-out "<none>".
|
|
6
|
+
argumentHint: "",
|
|
7
|
+
purpose: "How to draw the C4 model so the picture reads: one relationship kind per kind of traffic and an arrow only where evidence gives one, a legend drawn from real edges, and overview views that each answer one question at one altitude.",
|
|
8
|
+
invocation: "loam instructions loam-drawing",
|
|
9
|
+
placeholders: [],
|
|
10
|
+
spine: [
|
|
11
|
+
"Which way an arrow points — the relationship kinds",
|
|
12
|
+
"The legend",
|
|
13
|
+
"Overview views that read",
|
|
14
|
+
"A feature's message flows",
|
|
15
|
+
],
|
|
16
|
+
body: `Drawing the fleet so that a person can read it: one relationship kind per kind of traffic, an arrow only where evidence gives one, a legend, and overview views that each answer one question.
|
|
17
|
+
|
|
18
|
+
Nothing on this page is graded. loam reads elements and relationships, never a
|
|
19
|
+
view, and no check reads a relationship's kind — so a map can validate clean
|
|
20
|
+
and still be a wall of tiny boxes joined by gray lines. Every spelling below was
|
|
21
|
+
measured at the LikeC4 1.59.2 pin loam ships.
|
|
22
|
+
|
|
23
|
+
## Which way an arrow points — the relationship kinds
|
|
24
|
+
|
|
25
|
+
A plain \`->\` says only that two things are connected. A fleet drawn from
|
|
26
|
+
deployment configuration, which says nothing more than that, ends with every
|
|
27
|
+
arrow pointing into the broker and the stores. So give every relationship ONE
|
|
28
|
+
kind, and give each kind one meaning:
|
|
29
|
+
|
|
30
|
+
- \`publishes\` — producer \`->\` topic, with \`metadata { publishes '<message>' }\`:
|
|
31
|
+
the producer puts the message on the topic.
|
|
32
|
+
- \`delivers\` — topic \`->\` consumer, with \`metadata { consumes '<message>' }\`:
|
|
33
|
+
the broker hands the message to the consumer.
|
|
34
|
+
- \`reads\` — service \`->\` store, its head drawn at the SERVICE end (a tail
|
|
35
|
+
arrow): data flows out of the store into the service.
|
|
36
|
+
- \`writes\` — service \`->\` store, its head at the store: data lands in the store.
|
|
37
|
+
- \`readsWrites\` — service \`->\` store, heads at both ends: both.
|
|
38
|
+
- \`calls\` — caller \`->\` provider, with \`metadata { op '<operationId>' }\`: a
|
|
39
|
+
synchronous request.
|
|
40
|
+
- \`connects\` — gray, dashed, no arrowhead: a connection whose direction nobody
|
|
41
|
+
has established yet.
|
|
42
|
+
|
|
43
|
+
For the store kinds the arrowhead is where the data lands, and putting it there
|
|
44
|
+
is the style's job, never the arrow's: a store edge is ALWAYS written
|
|
45
|
+
service \`->\` store, and a read gets its head at the service end from the
|
|
46
|
+
\`reads\` style. Never flip a store edge to show a read. \`Covers:\` names an
|
|
47
|
+
edge as \`a -> b\`, review order reads a plain edge's source as depending on its
|
|
48
|
+
target, and the consumer census behind \`landscape.datastore-shared\` reads both
|
|
49
|
+
directions only for an element whose kind is \`database\`, \`queue\`, \`topic\`,
|
|
50
|
+
\`cache\` or \`bucket\` — a store drawn as any other kind has a service for a
|
|
51
|
+
consumer only when the store is the edge's TARGET. SCHEMA.md, "Which way an edge
|
|
52
|
+
points", lists every reader.
|
|
53
|
+
|
|
54
|
+
**Never guess a direction.** Give an edge a direction only from evidence:
|
|
55
|
+
|
|
56
|
+
- the service's code: the client that sends, the listener that receives, the
|
|
57
|
+
repository that writes;
|
|
58
|
+
- a configuration name that says which side the service is on —
|
|
59
|
+
\`*_PRODUCER_*\`, \`*_CONSUMER_*\`, a consumer-group id;
|
|
60
|
+
- the service's own \`asyncapi.yaml\`: \`action: send\` publishes,
|
|
61
|
+
\`action: receive\` consumes.
|
|
62
|
+
|
|
63
|
+
Configuration that lists a broker address or a database URL says only that the
|
|
64
|
+
two are connected: draw that as \`connects\`. A \`connects\` edge is an honest
|
|
65
|
+
placeholder, not a defect, and adopting the service from its code is what turns
|
|
66
|
+
it into a real kind (\`loam instructions loam-adopt <id>\`, step 3). A guessed
|
|
67
|
+
\`publishes\` is worse than a \`connects\`: it reads exactly like a right one, it
|
|
68
|
+
binds the event spine, and nobody goes back to check it.
|
|
69
|
+
|
|
70
|
+
Declare the kinds once, in \`architecture/landscape.likec4\`'s own
|
|
71
|
+
\`specification\` block, where every extending model borrows them:
|
|
72
|
+
|
|
73
|
+
specification {
|
|
74
|
+
relationship publishes {
|
|
75
|
+
color amber
|
|
76
|
+
line solid
|
|
77
|
+
head normal
|
|
78
|
+
}
|
|
79
|
+
relationship delivers {
|
|
80
|
+
color amber
|
|
81
|
+
line solid
|
|
82
|
+
head normal
|
|
83
|
+
}
|
|
84
|
+
relationship reads {
|
|
85
|
+
color green
|
|
86
|
+
head none
|
|
87
|
+
tail normal
|
|
88
|
+
}
|
|
89
|
+
relationship writes {
|
|
90
|
+
color green
|
|
91
|
+
head normal
|
|
92
|
+
}
|
|
93
|
+
relationship readsWrites {
|
|
94
|
+
color green
|
|
95
|
+
head normal
|
|
96
|
+
tail normal
|
|
97
|
+
}
|
|
98
|
+
relationship calls {
|
|
99
|
+
color secondary
|
|
100
|
+
line solid
|
|
101
|
+
head normal
|
|
102
|
+
}
|
|
103
|
+
relationship connects {
|
|
104
|
+
color gray
|
|
105
|
+
line dashed
|
|
106
|
+
head none
|
|
107
|
+
tail odot
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
Then name the kind in brackets on each edge:
|
|
112
|
+
|
|
113
|
+
marketplace.checkoutWeb -[calls]-> marketplace.orderService 'createOrder' {
|
|
114
|
+
metadata { op 'createOrder' }
|
|
115
|
+
}
|
|
116
|
+
marketplace.orderService -[publishes]-> kafka.orderEvents 'OrderPlaced' {
|
|
117
|
+
metadata { publishes 'order.OrderPlaced' }
|
|
118
|
+
}
|
|
119
|
+
kafka.orderEvents -[delivers]-> marketplace.paymentService 'OrderPlaced' {
|
|
120
|
+
metadata { consumes 'order.OrderPlaced' }
|
|
121
|
+
}
|
|
122
|
+
marketplace.paymentService -[reads]-> marketplace.ordersDb 'order totals'
|
|
123
|
+
marketplace.orderService -[connects]-> kafka 'broker address in its deployment config'
|
|
124
|
+
|
|
125
|
+
A store a service owns and nests INSIDE its own element cannot take an edge from
|
|
126
|
+
that element: LikeC4 refuses a relationship between a parent and its child
|
|
127
|
+
("Invalid parent-child relationship"). Draw that edge from the container that
|
|
128
|
+
does the work, in the service's own model
|
|
129
|
+
(\`marketplace.orderService.api -[readsWrites]-> marketplace.orderService.db\`),
|
|
130
|
+
or draw the store beside the service.
|
|
131
|
+
|
|
132
|
+
A feature's \`delta.likec4\` parses on its own, so it declares every kind it
|
|
133
|
+
draws in its own \`specification\` block too. **The living map must declare that
|
|
134
|
+
kind BEFORE the feature archives.** \`loam archive\` copies the edge into
|
|
135
|
+
\`architecture/landscape.likec4\` as written and never copies a declaration.
|
|
136
|
+
When the map lacks the kind, the merged map does not parse and the archive
|
|
137
|
+
refuses with \`merge-failed\` ("Could not resolve reference to
|
|
138
|
+
RelationshipKind"), while \`loam validate --feature\` and \`loam status\` still
|
|
139
|
+
called the feature ready. A kind is vocabulary, not a change, so adding it to the
|
|
140
|
+
map's \`specification\` is an ordinary edit to the living map, made in its own
|
|
141
|
+
change.
|
|
142
|
+
|
|
143
|
+
Two spellings to avoid:
|
|
144
|
+
|
|
145
|
+
- **Never put a tag on a kind** (\`relationship publishes { #async }\`). LikeC4
|
|
146
|
+
copies a kind's tags onto every edge of that kind. A \`#<FEAT>\` there makes
|
|
147
|
+
every such edge in the delta part of the change, context included, and an
|
|
148
|
+
\`#obl-\` tag there claims the obligation for every edge of that kind. Tag the
|
|
149
|
+
edge instead.
|
|
150
|
+
- **Never use the dotted form** (\`orderService .publishes kafka.orderEvents\`).
|
|
151
|
+
LikeC4 reads it, but not every loam reader does: \`loam validate --base\` scans
|
|
152
|
+
an extending model without the map's kinds and does not see such an edge.
|
|
153
|
+
Write \`-[publishes]->\`.
|
|
154
|
+
|
|
155
|
+
\`connects\` carries \`tail odot\` on purpose. An edge with no arrowhead at either
|
|
156
|
+
end is laid out with \`constraint=false\` and \`minlen=0\`, and enough of them
|
|
157
|
+
collapse a view into one band. The small circle at the source keeps the edge in
|
|
158
|
+
the layout without claiming a direction.
|
|
159
|
+
|
|
160
|
+
The kind is the picture and the metadata is the join. \`metadata { op }\`,
|
|
161
|
+
\`publishes\` and \`consumes\` are what loam grades (\`loam instructions loam-spine\`).
|
|
162
|
+
A kind changes no grade, so a kind with no metadata beside it is a drawing that
|
|
163
|
+
nothing checks.
|
|
164
|
+
|
|
165
|
+
## The legend
|
|
166
|
+
|
|
167
|
+
Add a \`legend\` view to \`architecture/landscape.likec4\` that draws ONE real
|
|
168
|
+
edge of each kind the map uses. Use real services, a real topic and a real store,
|
|
169
|
+
so that a reader learns the colours from the fleet itself. Name each edge by
|
|
170
|
+
both of its endpoints:
|
|
171
|
+
|
|
172
|
+
view legend {
|
|
173
|
+
title 'Fleet / 0 · Legend'
|
|
174
|
+
include marketplace.checkoutWeb -> marketplace.orderService
|
|
175
|
+
include marketplace.orderService -> kafka.orderEvents
|
|
176
|
+
include kafka.orderEvents -> marketplace.paymentService
|
|
177
|
+
include marketplace.paymentService -> marketplace.ordersDb
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
A view can name only elements the model declares, so the legend is written once
|
|
181
|
+
the map has real edges of each kind, and it gains a line when the map gains a
|
|
182
|
+
kind. \`loam init\` cannot scaffold one, because an empty map has nothing to draw.
|
|
183
|
+
|
|
184
|
+
## Overview views that read
|
|
185
|
+
|
|
186
|
+
A view is a picture for one reader with one question. Every rule below comes
|
|
187
|
+
from an overview that drew the whole fleet and so showed nothing:
|
|
188
|
+
|
|
189
|
+
- **One question per view, at one altitude.** "Who publishes to the broker?" is
|
|
190
|
+
one view, and "who calls whom" is another. A fleet overview draws subsystem
|
|
191
|
+
boxes, not services: the generated \`architecture/subsystems.likec4\` and
|
|
192
|
+
\`architecture/services.likec4\` views are the drill-down. Aim for at most
|
|
193
|
+
about 20 nodes and 25 drawn lines.
|
|
194
|
+
- **Filter by ONE kind, and say it positively.** A view above service altitude
|
|
195
|
+
merges every relationship between two boxes into one drawn line. When those
|
|
196
|
+
relationships are of different kinds, LikeC4 falls back to the default gray
|
|
197
|
+
and the line says nothing. \`where kind is publishes\` keeps the line amber;
|
|
198
|
+
\`where kind is not calls\` and \`where kind is publishes or kind is connects\`
|
|
199
|
+
still merge into gray.
|
|
200
|
+
- **Know the form that draws nothing.** Where \`fleet\`'s children are subsystem
|
|
201
|
+
groups, \`include fleet.* -> * where kind is publishes\` renders an EMPTY view,
|
|
202
|
+
with no error. Use a unary form, a named target or a tag target instead:
|
|
203
|
+
|
|
204
|
+
include fleet.* -> where kind is publishes
|
|
205
|
+
include fleet.* -> element.tag = #broker where kind is publishes
|
|
206
|
+
include kafka -> fleet.* where kind is delivers
|
|
207
|
+
include -> fleet.* where kind is delivers
|
|
208
|
+
|
|
209
|
+
- **Prefer relationship rules to element lists.** An element included directly
|
|
210
|
+
brings every relationship between it and the others: \`include fleet.orders, kafka\`
|
|
211
|
+
draws one merged gray line, where
|
|
212
|
+
\`include fleet.orders -> where kind is publishes\` draws one amber line.
|
|
213
|
+
- **Lay out rows with \`rank\`.** \`rank source { … }\`, \`rank same { … }\` and
|
|
214
|
+
\`rank sink { … }\` put nodes in rows, and the braces are required. A
|
|
215
|
+
\`rank source\` row whose nodes' edges all point INTO them is ignored, so a row
|
|
216
|
+
of consumers belongs at \`sink\`.
|
|
217
|
+
- **Give a direction-less edge a marker.** An edge with no arrowhead at either
|
|
218
|
+
end is laid out unconstrained and collapses the view into one band, so give it
|
|
219
|
+
\`tail odot\`, as the \`connects\` style above does.
|
|
220
|
+
- **Titles make folders.** LikeC4 splits a title on \`/\` into browser folders
|
|
221
|
+
and lists sub-folders before views, so number the views you want read in
|
|
222
|
+
order: \`title 'Fleet / 1 · Who publishes'\`.
|
|
223
|
+
- **Never author \`view … of\` a subsystem or service element.** The generated
|
|
224
|
+
views own that drill-down, and an authored one in a file that sorts before
|
|
225
|
+
them — \`landscape.likec4\` does — takes the click from every other view that
|
|
226
|
+
draws the element.
|
|
227
|
+
- **No \`xs\` nodes across a whole fleet, and no \`include parent.**\` with
|
|
228
|
+
excludes.** Together they drew a 68-node band at 2.5 pixels per label, a view
|
|
229
|
+
nobody can read.
|
|
230
|
+
|
|
231
|
+
## A feature's message flows
|
|
232
|
+
|
|
233
|
+
A feature delta draws a message the way the map does: through the broker. Write
|
|
234
|
+
\`orderService -[publishes]-> kafka.orderEvents\` and
|
|
235
|
+
\`kafka.orderEvents -[delivers]-> notificationService\`, never
|
|
236
|
+
\`orderService -> notificationService\` for an event. A direct edge reads as a
|
|
237
|
+
call, sits outside the event spine, and draws a second picture of the topic the
|
|
238
|
+
map already draws. Point at the topic the living map nests in the broker, leave
|
|
239
|
+
that context untagged, and tag only the edges the feature adds.
|
|
240
|
+
|
|
241
|
+
A producer outside the fleet is an \`#external\` element, and the edge it
|
|
242
|
+
publishes on carries the metadata (\`loam instructions loam-spine\`, "A message
|
|
243
|
+
produced outside the fleet", has the full join):
|
|
244
|
+
|
|
245
|
+
crm = softwareSystem 'crm' {
|
|
246
|
+
#external
|
|
247
|
+
}
|
|
248
|
+
crm -[publishes]-> kafka.crmEvents 'CustomerUpdated' {
|
|
249
|
+
metadata { publishes 'crm.CustomerUpdated' }
|
|
250
|
+
}
|
|
251
|
+
`,
|
|
252
|
+
};
|
|
253
|
+
//# sourceMappingURL=drawing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drawing.js","sourceRoot":"","sources":["../../../../../../src/core/agent/workflows/reference/drawing/drawing.ts"],"names":[],"mappings":"AA6BA,MAAM,CAAC,MAAM,YAAY,GAAmB;IAC1C,IAAI,EAAE,cAAc;IACpB,WAAW,EACT,qIAAqI;IACvI,2EAA2E;IAC3E,4CAA4C;IAC5C,YAAY,EAAE,EAAE;IAChB,OAAO,EACL,wOAAwO;IAC1O,UAAU,EAAE,gCAAgC;IAC5C,YAAY,EAAE,EAAE;IAChB,KAAK,EAAE;QACL,oDAAoD;QACpD,YAAY;QACZ,0BAA0B;QAC1B,2BAA2B;KAC5B;IACD,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2OP;CACA,CAAC","sourcesContent":["/**\n * The `loam-drawing` reference page: how to draw the C4 model so that a person\n * can read the picture — one relationship kind per kind of traffic, an arrow\n * that points where the evidence says, a legend, and overview views that each\n * answer one question.\n *\n * WHY A PAGE. A large real fleet was drawn by agents following loam's pages,\n * and every document validated while the pictures were unreadable: every arrow\n * pointed into the broker and the stores (deployment configuration says only\n * that two things are connected, and the agents turned that into a direction),\n * the overview views were walls of tiny boxes, and the lines were the default\n * gray because LikeC4 merges relationships of different kinds into one line\n * with no style. Nothing loam grades could have caught any of it — loam reads\n * elements and relationships and never a view, and no check reads a\n * relationship's KIND — so the only place the lesson can live is the text an\n * agent reads before it draws. That text is consulted at a moment the agent\n * can name (\"I am drawing an edge\", \"I am writing a view\"), which is the split\n * rule in ../reference.ts: a reference page, not AGENTS.md.\n *\n * WHY ITS OWN PACKAGE. ../ sits at the five-file cap, and this page is a\n * subject of its own rather than a section of an existing one: loam-spine says\n * which joins the metadata makes, and this page says how the picture is drawn\n * around them. Every LikeC4 spelling below was measured at the 1.59.2 pin\n * (`likec4 validate`, `export json`, `gen dot`) on a neutral fleet shaped like\n * examples/docs — never on the fleet the lesson came from, which is\n * confidential and must not reach this repository in any form.\n */\nimport type { CommandContent } from \"../../../contract.js\";\n\nexport const LOAM_DRAWING: CommandContent = {\n name: \"loam-drawing\",\n description:\n \"Reference: drawing the map so a person can read it — relationship kinds and which way each arrow points, the legend, overview views\",\n // A reference page takes no arguments: see ../spine.ts for why the hint is\n // empty rather than a spelled-out \"<none>\".\n argumentHint: \"\",\n purpose:\n \"How to draw the C4 model so the picture reads: one relationship kind per kind of traffic and an arrow only where evidence gives one, a legend drawn from real edges, and overview views that each answer one question at one altitude.\",\n invocation: \"loam instructions loam-drawing\",\n placeholders: [],\n spine: [\n \"Which way an arrow points — the relationship kinds\",\n \"The legend\",\n \"Overview views that read\",\n \"A feature's message flows\",\n ],\n body: `Drawing the fleet so that a person can read it: one relationship kind per kind of traffic, an arrow only where evidence gives one, a legend, and overview views that each answer one question.\n\nNothing on this page is graded. loam reads elements and relationships, never a\nview, and no check reads a relationship's kind — so a map can validate clean\nand still be a wall of tiny boxes joined by gray lines. Every spelling below was\nmeasured at the LikeC4 1.59.2 pin loam ships.\n\n## Which way an arrow points — the relationship kinds\n\nA plain \\`->\\` says only that two things are connected. A fleet drawn from\ndeployment configuration, which says nothing more than that, ends with every\narrow pointing into the broker and the stores. So give every relationship ONE\nkind, and give each kind one meaning:\n\n- \\`publishes\\` — producer \\`->\\` topic, with \\`metadata { publishes '<message>' }\\`:\n the producer puts the message on the topic.\n- \\`delivers\\` — topic \\`->\\` consumer, with \\`metadata { consumes '<message>' }\\`:\n the broker hands the message to the consumer.\n- \\`reads\\` — service \\`->\\` store, its head drawn at the SERVICE end (a tail\n arrow): data flows out of the store into the service.\n- \\`writes\\` — service \\`->\\` store, its head at the store: data lands in the store.\n- \\`readsWrites\\` — service \\`->\\` store, heads at both ends: both.\n- \\`calls\\` — caller \\`->\\` provider, with \\`metadata { op '<operationId>' }\\`: a\n synchronous request.\n- \\`connects\\` — gray, dashed, no arrowhead: a connection whose direction nobody\n has established yet.\n\nFor the store kinds the arrowhead is where the data lands, and putting it there\nis the style's job, never the arrow's: a store edge is ALWAYS written\nservice \\`->\\` store, and a read gets its head at the service end from the\n\\`reads\\` style. Never flip a store edge to show a read. \\`Covers:\\` names an\nedge as \\`a -> b\\`, review order reads a plain edge's source as depending on its\ntarget, and the consumer census behind \\`landscape.datastore-shared\\` reads both\ndirections only for an element whose kind is \\`database\\`, \\`queue\\`, \\`topic\\`,\n\\`cache\\` or \\`bucket\\` — a store drawn as any other kind has a service for a\nconsumer only when the store is the edge's TARGET. SCHEMA.md, \"Which way an edge\npoints\", lists every reader.\n\n**Never guess a direction.** Give an edge a direction only from evidence:\n\n- the service's code: the client that sends, the listener that receives, the\n repository that writes;\n- a configuration name that says which side the service is on —\n \\`*_PRODUCER_*\\`, \\`*_CONSUMER_*\\`, a consumer-group id;\n- the service's own \\`asyncapi.yaml\\`: \\`action: send\\` publishes,\n \\`action: receive\\` consumes.\n\nConfiguration that lists a broker address or a database URL says only that the\ntwo are connected: draw that as \\`connects\\`. A \\`connects\\` edge is an honest\nplaceholder, not a defect, and adopting the service from its code is what turns\nit into a real kind (\\`loam instructions loam-adopt <id>\\`, step 3). A guessed\n\\`publishes\\` is worse than a \\`connects\\`: it reads exactly like a right one, it\nbinds the event spine, and nobody goes back to check it.\n\nDeclare the kinds once, in \\`architecture/landscape.likec4\\`'s own\n\\`specification\\` block, where every extending model borrows them:\n\n specification {\n relationship publishes {\n color amber\n line solid\n head normal\n }\n relationship delivers {\n color amber\n line solid\n head normal\n }\n relationship reads {\n color green\n head none\n tail normal\n }\n relationship writes {\n color green\n head normal\n }\n relationship readsWrites {\n color green\n head normal\n tail normal\n }\n relationship calls {\n color secondary\n line solid\n head normal\n }\n relationship connects {\n color gray\n line dashed\n head none\n tail odot\n }\n }\n\nThen name the kind in brackets on each edge:\n\n marketplace.checkoutWeb -[calls]-> marketplace.orderService 'createOrder' {\n metadata { op 'createOrder' }\n }\n marketplace.orderService -[publishes]-> kafka.orderEvents 'OrderPlaced' {\n metadata { publishes 'order.OrderPlaced' }\n }\n kafka.orderEvents -[delivers]-> marketplace.paymentService 'OrderPlaced' {\n metadata { consumes 'order.OrderPlaced' }\n }\n marketplace.paymentService -[reads]-> marketplace.ordersDb 'order totals'\n marketplace.orderService -[connects]-> kafka 'broker address in its deployment config'\n\nA store a service owns and nests INSIDE its own element cannot take an edge from\nthat element: LikeC4 refuses a relationship between a parent and its child\n(\"Invalid parent-child relationship\"). Draw that edge from the container that\ndoes the work, in the service's own model\n(\\`marketplace.orderService.api -[readsWrites]-> marketplace.orderService.db\\`),\nor draw the store beside the service.\n\nA feature's \\`delta.likec4\\` parses on its own, so it declares every kind it\ndraws in its own \\`specification\\` block too. **The living map must declare that\nkind BEFORE the feature archives.** \\`loam archive\\` copies the edge into\n\\`architecture/landscape.likec4\\` as written and never copies a declaration.\nWhen the map lacks the kind, the merged map does not parse and the archive\nrefuses with \\`merge-failed\\` (\"Could not resolve reference to\nRelationshipKind\"), while \\`loam validate --feature\\` and \\`loam status\\` still\ncalled the feature ready. A kind is vocabulary, not a change, so adding it to the\nmap's \\`specification\\` is an ordinary edit to the living map, made in its own\nchange.\n\nTwo spellings to avoid:\n\n- **Never put a tag on a kind** (\\`relationship publishes { #async }\\`). LikeC4\n copies a kind's tags onto every edge of that kind. A \\`#<FEAT>\\` there makes\n every such edge in the delta part of the change, context included, and an\n \\`#obl-\\` tag there claims the obligation for every edge of that kind. Tag the\n edge instead.\n- **Never use the dotted form** (\\`orderService .publishes kafka.orderEvents\\`).\n LikeC4 reads it, but not every loam reader does: \\`loam validate --base\\` scans\n an extending model without the map's kinds and does not see such an edge.\n Write \\`-[publishes]->\\`.\n\n\\`connects\\` carries \\`tail odot\\` on purpose. An edge with no arrowhead at either\nend is laid out with \\`constraint=false\\` and \\`minlen=0\\`, and enough of them\ncollapse a view into one band. The small circle at the source keeps the edge in\nthe layout without claiming a direction.\n\nThe kind is the picture and the metadata is the join. \\`metadata { op }\\`,\n\\`publishes\\` and \\`consumes\\` are what loam grades (\\`loam instructions loam-spine\\`).\nA kind changes no grade, so a kind with no metadata beside it is a drawing that\nnothing checks.\n\n## The legend\n\nAdd a \\`legend\\` view to \\`architecture/landscape.likec4\\` that draws ONE real\nedge of each kind the map uses. Use real services, a real topic and a real store,\nso that a reader learns the colours from the fleet itself. Name each edge by\nboth of its endpoints:\n\n view legend {\n title 'Fleet / 0 · Legend'\n include marketplace.checkoutWeb -> marketplace.orderService\n include marketplace.orderService -> kafka.orderEvents\n include kafka.orderEvents -> marketplace.paymentService\n include marketplace.paymentService -> marketplace.ordersDb\n }\n\nA view can name only elements the model declares, so the legend is written once\nthe map has real edges of each kind, and it gains a line when the map gains a\nkind. \\`loam init\\` cannot scaffold one, because an empty map has nothing to draw.\n\n## Overview views that read\n\nA view is a picture for one reader with one question. Every rule below comes\nfrom an overview that drew the whole fleet and so showed nothing:\n\n- **One question per view, at one altitude.** \"Who publishes to the broker?\" is\n one view, and \"who calls whom\" is another. A fleet overview draws subsystem\n boxes, not services: the generated \\`architecture/subsystems.likec4\\` and\n \\`architecture/services.likec4\\` views are the drill-down. Aim for at most\n about 20 nodes and 25 drawn lines.\n- **Filter by ONE kind, and say it positively.** A view above service altitude\n merges every relationship between two boxes into one drawn line. When those\n relationships are of different kinds, LikeC4 falls back to the default gray\n and the line says nothing. \\`where kind is publishes\\` keeps the line amber;\n \\`where kind is not calls\\` and \\`where kind is publishes or kind is connects\\`\n still merge into gray.\n- **Know the form that draws nothing.** Where \\`fleet\\`'s children are subsystem\n groups, \\`include fleet.* -> * where kind is publishes\\` renders an EMPTY view,\n with no error. Use a unary form, a named target or a tag target instead:\n\n include fleet.* -> where kind is publishes\n include fleet.* -> element.tag = #broker where kind is publishes\n include kafka -> fleet.* where kind is delivers\n include -> fleet.* where kind is delivers\n\n- **Prefer relationship rules to element lists.** An element included directly\n brings every relationship between it and the others: \\`include fleet.orders, kafka\\`\n draws one merged gray line, where\n \\`include fleet.orders -> where kind is publishes\\` draws one amber line.\n- **Lay out rows with \\`rank\\`.** \\`rank source { … }\\`, \\`rank same { … }\\` and\n \\`rank sink { … }\\` put nodes in rows, and the braces are required. A\n \\`rank source\\` row whose nodes' edges all point INTO them is ignored, so a row\n of consumers belongs at \\`sink\\`.\n- **Give a direction-less edge a marker.** An edge with no arrowhead at either\n end is laid out unconstrained and collapses the view into one band, so give it\n \\`tail odot\\`, as the \\`connects\\` style above does.\n- **Titles make folders.** LikeC4 splits a title on \\`/\\` into browser folders\n and lists sub-folders before views, so number the views you want read in\n order: \\`title 'Fleet / 1 · Who publishes'\\`.\n- **Never author \\`view … of\\` a subsystem or service element.** The generated\n views own that drill-down, and an authored one in a file that sorts before\n them — \\`landscape.likec4\\` does — takes the click from every other view that\n draws the element.\n- **No \\`xs\\` nodes across a whole fleet, and no \\`include parent.**\\` with\n excludes.** Together they drew a 68-node band at 2.5 pixels per label, a view\n nobody can read.\n\n## A feature's message flows\n\nA feature delta draws a message the way the map does: through the broker. Write\n\\`orderService -[publishes]-> kafka.orderEvents\\` and\n\\`kafka.orderEvents -[delivers]-> notificationService\\`, never\n\\`orderService -> notificationService\\` for an event. A direct edge reads as a\ncall, sits outside the event spine, and draws a second picture of the topic the\nmap already draws. Point at the topic the living map nests in the broker, leave\nthat context untagged, and tag only the edges the feature adds.\n\nA producer outside the fleet is an \\`#external\\` element, and the edge it\npublishes on carries the metadata (\\`loam instructions loam-spine\\`, \"A message\nproduced outside the fleet\", has the full join):\n\n crm = softwareSystem 'crm' {\n #external\n }\n crm -[publishes]-> kafka.crmEvents 'CustomerUpdated' {\n metadata { publishes 'crm.CustomerUpdated' }\n }\n`,\n};\n"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { LOAM_AUTHORING } from "./authoring.js";
|
|
2
|
+
import { LOAM_CODES } from "./codes.js";
|
|
3
|
+
import { LOAM_DONE_CHECK } from "./done-check.js";
|
|
4
|
+
import { LOAM_DRAWING } from "./drawing/drawing.js";
|
|
5
|
+
import { LOAM_SPINE } from "./spine.js";
|
|
6
|
+
/**
|
|
7
|
+
* The five pages, in the order AGENTS.md's own index names them. The first four
|
|
8
|
+
* stand in the order their sections stood in the document they left, so a
|
|
9
|
+
* reader who knew the file finds them where they were. The drawing page comes
|
|
10
|
+
* last because it never stood there.
|
|
11
|
+
*/
|
|
12
|
+
export const REFERENCES = [
|
|
13
|
+
LOAM_CODES,
|
|
14
|
+
LOAM_SPINE,
|
|
15
|
+
LOAM_AUTHORING,
|
|
16
|
+
LOAM_DONE_CHECK,
|
|
17
|
+
LOAM_DRAWING,
|
|
18
|
+
];
|
|
19
|
+
//# sourceMappingURL=reference.js.map
|