@ybotok/loam 0.2.0-alpha.1 → 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 +3448 -0
- package/COMPARISON.md +91 -3
- package/CONTRIBUTING.md +37 -0
- package/MIGRATING-from-OpenSpec.md +47 -23
- package/QUICKSTART.md +189 -12
- package/README.md +274 -65
- package/ROADMAP.md +572 -31
- package/SCHEMA.md +1709 -155
- package/WORKFLOW.md +298 -72
- package/dist/cli.js +26 -8
- package/dist/cli.js.map +1 -1
- package/dist/commands/adopt/adopt.js +5 -10
- package/dist/commands/adopt/adopt.js.map +1 -1
- package/dist/commands/adopt/render.js +50 -9
- package/dist/commands/adopt/render.js.map +1 -1
- package/dist/commands/archive/archive.js +16 -19
- package/dist/commands/archive/archive.js.map +1 -1
- 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 +36 -42
- package/dist/commands/archive/plan/contracts/asyncapi.js.map +1 -1
- 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 +77 -43
- package/dist/commands/archive/plan/contracts/openapi.js.map +1 -1
- 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 +21 -19
- package/dist/commands/archive/plan/gate.js.map +1 -1
- package/dist/commands/archive/plan/landscape.js +167 -30
- package/dist/commands/archive/plan/landscape.js.map +1 -1
- 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 +14 -19
- package/dist/commands/archive/plan/refusal.js.map +1 -1
- package/dist/commands/archive/plan/specs.js +137 -56
- package/dist/commands/archive/plan/specs.js.map +1 -1
- package/dist/commands/archive/plan/state.js +3 -0
- package/dist/commands/archive/plan/state.js.map +1 -1
- package/dist/commands/archive/run.js +134 -30
- package/dist/commands/archive/run.js.map +1 -1
- package/dist/commands/archive/shipped.js +49 -0
- package/dist/commands/archive/shipped.js.map +1 -0
- package/dist/commands/context/context.js +85 -18
- package/dist/commands/context/context.js.map +1 -1
- package/dist/commands/context/print.js +29 -7
- package/dist/commands/context/print.js.map +1 -1
- package/dist/commands/delta/delta.js +102 -14
- package/dist/commands/delta/delta.js.map +1 -1
- package/dist/commands/delta/print.js +17 -1
- package/dist/commands/delta/print.js.map +1 -1
- package/dist/commands/dependencies.js +3 -7
- package/dist/commands/dependencies.js.map +1 -1
- package/dist/commands/diff/diff.js +20 -27
- package/dist/commands/diff/diff.js.map +1 -1
- package/dist/commands/doctor.js +60 -1
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/explain/explain.js +89 -13
- package/dist/commands/explain/explain.js.map +1 -1
- package/dist/commands/explore.js +16 -10
- package/dist/commands/explore.js.map +1 -1
- package/dist/commands/gate/gate.js +45 -8
- package/dist/commands/gate/gate.js.map +1 -1
- package/dist/commands/gate/print.js +15 -3
- package/dist/commands/gate/print.js.map +1 -1
- package/dist/commands/gherkin/commit.js +13 -54
- package/dist/commands/gherkin/commit.js.map +1 -1
- package/dist/commands/gherkin/gherkin.js +36 -20
- package/dist/commands/gherkin/gherkin.js.map +1 -1
- package/dist/commands/gherkin/reconcile.js +10 -13
- package/dist/commands/gherkin/reconcile.js.map +1 -1
- package/dist/commands/init/first-hour.js +44 -0
- package/dist/commands/init/first-hour.js.map +1 -1
- package/dist/commands/init/init.js +18 -22
- package/dist/commands/init/init.js.map +1 -1
- package/dist/commands/list/campaign/campaign.js +4 -6
- package/dist/commands/list/campaign/campaign.js.map +1 -1
- package/dist/commands/list/json.js +5 -7
- package/dist/commands/list/json.js.map +1 -1
- package/dist/commands/list/list.js +44 -29
- package/dist/commands/list/list.js.map +1 -1
- package/dist/commands/list/print.js +52 -9
- package/dist/commands/list/print.js.map +1 -1
- 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 +37 -34
- package/dist/commands/list/views.js.map +1 -1
- package/dist/commands/mcp/dispatch.js +91 -36
- package/dist/commands/mcp/dispatch.js.map +1 -1
- package/dist/commands/mcp/mcp.js +56 -15
- package/dist/commands/mcp/mcp.js.map +1 -1
- package/dist/commands/mcp/serve.js.map +1 -1
- package/dist/commands/migrate-openspec/materialize/active.js +27 -22
- package/dist/commands/migrate-openspec/materialize/active.js.map +1 -1
- package/dist/commands/migrate-openspec/materialize/stage.js +4 -3
- package/dist/commands/migrate-openspec/materialize/stage.js.map +1 -1
- package/dist/commands/migrate-openspec/materialize/target.js +2 -2
- package/dist/commands/migrate-openspec/materialize/target.js.map +1 -1
- package/dist/commands/migrate-openspec/openspec/decisions.js +9 -14
- package/dist/commands/migrate-openspec/openspec/decisions.js.map +1 -1
- package/dist/commands/migrate-openspec/openspec/error.js +7 -8
- package/dist/commands/migrate-openspec/openspec/error.js.map +1 -1
- package/dist/commands/migrate-openspec/openspec/mapping.js +1 -9
- package/dist/commands/migrate-openspec/openspec/mapping.js.map +1 -1
- package/dist/commands/migrate-openspec/openspec/paths.js +3 -6
- package/dist/commands/migrate-openspec/openspec/paths.js.map +1 -1
- 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 +8 -22
- package/dist/commands/new/commit.js.map +1 -1
- package/dist/commands/new/modifies.js +206 -0
- package/dist/commands/new/modifies.js.map +1 -0
- package/dist/commands/new/new.js +59 -14
- package/dist/commands/new/new.js.map +1 -1
- package/dist/commands/new/templates.js +48 -124
- package/dist/commands/new/templates.js.map +1 -1
- package/dist/commands/open.js +3 -7
- package/dist/commands/open.js.map +1 -1
- package/dist/commands/policy/gate.js +27 -0
- package/dist/commands/policy/gate.js.map +1 -1
- package/dist/commands/rebase/plan.js +2 -2
- package/dist/commands/rebase/plan.js.map +1 -1
- package/dist/commands/rebase/rebase.js +60 -35
- package/dist/commands/rebase/rebase.js.map +1 -1
- package/dist/commands/seed/commit.js +55 -26
- package/dist/commands/seed/commit.js.map +1 -1
- package/dist/commands/seed/plan.js +158 -13
- package/dist/commands/seed/plan.js.map +1 -1
- package/dist/commands/seed/seed.js +13 -11
- package/dist/commands/seed/seed.js.map +1 -1
- package/dist/commands/show/feature.js +9 -5
- package/dist/commands/show/feature.js.map +1 -1
- package/dist/commands/show/introduced.js +157 -0
- package/dist/commands/show/introduced.js.map +1 -0
- package/dist/commands/show/marks.js +35 -6
- package/dist/commands/show/marks.js.map +1 -1
- package/dist/commands/show/service.js +41 -33
- package/dist/commands/show/service.js.map +1 -1
- package/dist/commands/show/show.js +17 -7
- package/dist/commands/show/show.js.map +1 -1
- 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 +2 -0
- package/dist/commands/status/json.js.map +1 -1
- package/dist/commands/status/print.js +89 -37
- package/dist/commands/status/print.js.map +1 -1
- package/dist/commands/status/status.js +3 -7
- package/dist/commands/status/status.js.map +1 -1
- package/dist/commands/steps/steps.js +103 -23
- package/dist/commands/steps/steps.js.map +1 -1
- package/dist/commands/subsystem/edit.js +7 -7
- package/dist/commands/subsystem/edit.js.map +1 -1
- package/dist/commands/subsystem/move.js +106 -46
- package/dist/commands/subsystem/move.js.map +1 -1
- package/dist/commands/subsystem/query.js +2 -4
- package/dist/commands/subsystem/query.js.map +1 -1
- package/dist/commands/subsystem/subsystem.js +4 -7
- package/dist/commands/subsystem/subsystem.js.map +1 -1
- package/dist/commands/subsystem/sync.js +289 -74
- package/dist/commands/subsystem/sync.js.map +1 -1
- 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 +147 -45
- package/dist/commands/subsystem/txn/txn.js.map +1 -1
- package/dist/commands/subsystem/txn/views.js +200 -21
- package/dist/commands/subsystem/txn/views.js.map +1 -1
- 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 +42 -26
- package/dist/commands/unarchive/manifest.js.map +1 -1
- package/dist/commands/unarchive/restore.js +83 -33
- package/dist/commands/unarchive/restore.js.map +1 -1
- package/dist/commands/unarchive/unarchive.js +22 -30
- package/dist/commands/unarchive/unarchive.js.map +1 -1
- package/dist/commands/validate/arch-coverage.js +78 -27
- package/dist/commands/validate/arch-coverage.js.map +1 -1
- package/dist/commands/validate/checks/fleet-shape.js +34 -126
- package/dist/commands/validate/checks/fleet-shape.js.map +1 -1
- package/dist/commands/validate/checks/health-deps.js +9 -6
- package/dist/commands/validate/checks/health-deps.js.map +1 -1
- 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 +18 -8
- package/dist/commands/validate/checks/requirements.js.map +1 -1
- package/dist/commands/validate/checks/sources.js +11 -2
- package/dist/commands/validate/checks/sources.js.map +1 -1
- 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 +26 -20
- package/dist/commands/validate/feature.js.map +1 -1
- package/dist/commands/validate/fleet/census.js +37 -13
- package/dist/commands/validate/fleet/census.js.map +1 -1
- package/dist/commands/validate/fleet/landscape.js +144 -126
- package/dist/commands/validate/fleet/landscape.js.map +1 -1
- package/dist/commands/validate/fleet/load.js +66 -0
- package/dist/commands/validate/fleet/load.js.map +1 -1
- 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 +44 -14
- package/dist/commands/validate/fleet/obligations.js.map +1 -1
- package/dist/commands/validate/fleet/scorecard/print.js +10 -2
- package/dist/commands/validate/fleet/scorecard/print.js.map +1 -1
- package/dist/commands/validate/fleet/scorecard/scorecard.js +17 -11
- package/dist/commands/validate/fleet/scorecard/scorecard.js.map +1 -1
- package/dist/commands/validate/fleet/usecases/place.js.map +1 -1
- 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 +50 -15
- package/dist/commands/validate/fleet/views/ids.js.map +1 -1
- 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 +40 -47
- package/dist/commands/validate/fleet/views/stale.js.map +1 -1
- package/dist/commands/validate/links/corpus.js +1 -4
- package/dist/commands/validate/links/corpus.js.map +1 -1
- package/dist/commands/validate/links/glossary.js.map +1 -1
- 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 +36 -160
- package/dist/commands/validate/report.js.map +1 -1
- package/dist/commands/validate/scope.js +113 -0
- package/dist/commands/validate/scope.js.map +1 -0
- package/dist/commands/validate/service/api.js +21 -107
- package/dist/commands/validate/service/api.js.map +1 -1
- 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 +36 -14
- package/dist/commands/validate/service/events/events.js.map +1 -1
- package/dist/commands/validate/service/events/message-producers.js +1 -1
- package/dist/commands/validate/service/events/message-producers.js.map +1 -1
- package/dist/commands/validate/service/evidence-pins.js +56 -10
- package/dist/commands/validate/service/evidence-pins.js.map +1 -1
- 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 +121 -61
- package/dist/commands/validate/service/service.js.map +1 -1
- package/dist/commands/validate/service/specs.js +88 -28
- package/dist/commands/validate/service/specs.js.map +1 -1
- package/dist/commands/validate/service/spine.js +38 -3
- package/dist/commands/validate/service/spine.js.map +1 -1
- 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 +85 -60
- package/dist/commands/validate/validate.js.map +1 -1
- package/dist/commands/verify/cross/diff.js +2 -6
- package/dist/commands/verify/cross/diff.js.map +1 -1
- package/dist/commands/verify/evidence/contract.js +1 -1
- package/dist/commands/verify/evidence/contract.js.map +1 -1
- package/dist/commands/verify/evidence/read.js +12 -3
- package/dist/commands/verify/evidence/read.js.map +1 -1
- package/dist/commands/verify/frozen.js +45 -23
- package/dist/commands/verify/frozen.js.map +1 -1
- package/dist/commands/verify/record.js +69 -17
- package/dist/commands/verify/record.js.map +1 -1
- package/dist/commands/verify/report.js +27 -44
- package/dist/commands/verify/report.js.map +1 -1
- package/dist/commands/verify/results.js +112 -30
- package/dist/commands/verify/results.js.map +1 -1
- package/dist/commands/verify/verify.js +55 -52
- package/dist/commands/verify/verify.js.map +1 -1
- package/dist/commands/vouch/pack/pack.js +2 -2
- package/dist/commands/vouch/pack/pack.js.map +1 -1
- package/dist/commands/vouch/pack/print.js +1 -6
- package/dist/commands/vouch/pack/print.js.map +1 -1
- package/dist/commands/vouch/pack/sections.js +1 -2
- package/dist/commands/vouch/pack/sections.js.map +1 -1
- package/dist/commands/vouch/run.js +26 -81
- package/dist/commands/vouch/run.js.map +1 -1
- package/dist/commands/vouch/sample/plan.js +20 -34
- package/dist/commands/vouch/sample/plan.js.map +1 -1
- package/dist/commands/vouch/vet/verify.js +39 -7
- package/dist/commands/vouch/vet/verify.js.map +1 -1
- package/dist/commands/vouch/vouch.js +10 -17
- package/dist/commands/vouch/vouch.js.map +1 -1
- package/dist/core/agent/agents-md/command-map.js +81 -106
- package/dist/core/agent/agents-md/command-map.js.map +1 -1
- package/dist/core/agent/agents-md/map/explain.js +21 -9
- package/dist/core/agent/agents-md/map/explain.js.map +1 -1
- package/dist/core/agent/agents-md/map/lenses/context.js +17 -8
- package/dist/core/agent/agents-md/map/lenses/context.js.map +1 -1
- package/dist/core/agent/agents-md/map/lenses/diff.js +33 -20
- package/dist/core/agent/agents-md/map/lenses/diff.js.map +1 -1
- package/dist/core/agent/agents-md/map/lenses/gate.js +13 -5
- package/dist/core/agent/agents-md/map/lenses/gate.js.map +1 -1
- package/dist/core/agent/agents-md/map/mcp.js +10 -7
- package/dist/core/agent/agents-md/map/mcp.js.map +1 -1
- package/dist/core/agent/agents-md/map/status.js +24 -8
- package/dist/core/agent/agents-md/map/status.js.map +1 -1
- package/dist/core/agent/agents-md/map/subsystem.js +80 -8
- package/dist/core/agent/agents-md/map/subsystem.js.map +1 -1
- package/dist/core/agent/agents-md/map/usecases.js +88 -10
- package/dist/core/agent/agents-md/map/usecases.js.map +1 -1
- package/dist/core/agent/agents-md/refusals.js +49 -22
- package/dist/core/agent/agents-md/refusals.js.map +1 -1
- package/dist/core/agent/agents-md.js +39 -6
- package/dist/core/agent/agents-md.js.map +1 -1
- package/dist/core/agent/agents-stamp.js +10 -0
- package/dist/core/agent/agents-stamp.js.map +1 -1
- package/dist/core/agent/protocol.js +1 -1
- package/dist/core/agent/protocol.js.map +1 -1
- package/dist/core/agent/scaffold.js +10 -15
- package/dist/core/agent/scaffold.js.map +1 -1
- package/dist/core/agent/support/report.js +46 -5
- package/dist/core/agent/support/report.js.map +1 -1
- package/dist/core/agent/tools/dialects.js +1 -0
- package/dist/core/agent/tools/dialects.js.map +1 -1
- package/dist/core/agent/tools/registry.js +41 -76
- package/dist/core/agent/tools/registry.js.map +1 -1
- package/dist/core/agent/workflows/adopt.js +158 -11
- package/dist/core/agent/workflows/adopt.js.map +1 -1
- package/dist/core/agent/workflows/check.js +78 -39
- package/dist/core/agent/workflows/check.js.map +1 -1
- package/dist/core/agent/workflows/closing.js +88 -27
- package/dist/core/agent/workflows/closing.js.map +1 -1
- package/dist/core/agent/workflows/feature.js +128 -13
- package/dist/core/agent/workflows/feature.js.map +1 -1
- package/dist/core/agent/workflows/implement.js +96 -13
- package/dist/core/agent/workflows/implement.js.map +1 -1
- package/dist/core/agent/workflows/reference/authoring.js +106 -4
- package/dist/core/agent/workflows/reference/authoring.js.map +1 -1
- package/dist/core/agent/workflows/reference/codes.js +8 -6
- package/dist/core/agent/workflows/reference/codes.js.map +1 -1
- package/dist/core/agent/workflows/reference/done-check.js +37 -15
- package/dist/core/agent/workflows/reference/done-check.js.map +1 -1
- 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 +6 -3
- package/dist/core/agent/workflows/reference/reference.js.map +1 -1
- package/dist/core/agent/workflows/reference/spine.js +68 -27
- package/dist/core/agent/workflows/reference/spine.js.map +1 -1
- package/dist/core/asyncapi/baseline/plan.js +14 -81
- package/dist/core/asyncapi/baseline/plan.js.map +1 -1
- package/dist/core/asyncapi/digest.js +30 -25
- package/dist/core/asyncapi/digest.js.map +1 -1
- package/dist/core/asyncapi/merge/components.js +5 -4
- package/dist/core/asyncapi/merge/components.js.map +1 -1
- package/dist/core/asyncapi/merge/error.js +7 -2
- package/dist/core/asyncapi/merge/error.js.map +1 -1
- package/dist/core/asyncapi/merge/markers.js +32 -50
- package/dist/core/asyncapi/merge/markers.js.map +1 -1
- package/dist/core/asyncapi/merge/merge.js +33 -53
- package/dist/core/asyncapi/merge/merge.js.map +1 -1
- package/dist/core/asyncapi/merge/pin.js +12 -36
- package/dist/core/asyncapi/merge/pin.js.map +1 -1
- package/dist/core/asyncapi/model.js.map +1 -1
- package/dist/core/asyncapi/read.js +36 -12
- package/dist/core/asyncapi/read.js.map +1 -1
- package/dist/core/brief/brief.js +96 -36
- package/dist/core/brief/brief.js.map +1 -1
- package/dist/core/brief/checks.js +138 -3
- package/dist/core/brief/checks.js.map +1 -1
- package/dist/core/brief/landscape.js +209 -130
- package/dist/core/brief/landscape.js.map +1 -1
- 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 +109 -31
- package/dist/core/brief/targets.js.map +1 -1
- package/dist/core/brief/unchecked.js +14 -3
- package/dist/core/brief/unchecked.js.map +1 -1
- package/dist/core/c4/arch.js +90 -182
- package/dist/core/c4/arch.js.map +1 -1
- 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 +169 -14
- package/dist/core/c4/likec4.js.map +1 -1
- 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.map +1 -1
- package/dist/core/c4/parsed/values.js +54 -1
- package/dist/core/c4/parsed/values.js.map +1 -1
- package/dist/core/c4/parsed/view-ids.js +39 -1
- package/dist/core/c4/parsed/view-ids.js.map +1 -1
- 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 +123 -7
- package/dist/core/c4/project/architecture.js.map +1 -1
- 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 +43 -12
- package/dist/core/c4/project/documents.js.map +1 -1
- package/dist/core/c4/project/load.js +79 -43
- package/dist/core/c4/project/load.js.map +1 -1
- 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 +78 -17
- package/dist/core/c4/resolve/service.js.map +1 -1
- 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/template.js +65 -1
- package/dist/core/c4/seed/template.js.map +1 -1
- 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 +297 -10
- package/dist/core/c4/source-mask.js.map +1 -1
- package/dist/core/c4/source-scan.js +222 -141
- package/dist/core/c4/source-scan.js.map +1 -1
- package/dist/core/c4/splice/authored-source.js +79 -13
- package/dist/core/c4/splice/authored-source.js.map +1 -1
- package/dist/core/c4/splice/contract.js +20 -0
- package/dist/core/c4/splice/contract.js.map +1 -1
- package/dist/core/c4/splice/delta-blocks.js +20 -20
- package/dist/core/c4/splice/delta-blocks.js.map +1 -1
- 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 +37 -0
- package/dist/core/c4/splice/identity/edges.js.map +1 -1
- 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 +182 -114
- package/dist/core/c4/splice/landscape-merge.js.map +1 -1
- 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 +160 -56
- package/dist/core/c4/splice/placement.js.map +1 -1
- 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 +13 -19
- package/dist/core/c4/workspace.js.map +1 -1
- package/dist/core/capabilities/capabilities.js +6 -6
- package/dist/core/capabilities/capabilities.js.map +1 -1
- package/dist/core/capabilities/delta/doc.js +7 -10
- package/dist/core/capabilities/delta/doc.js.map +1 -1
- package/dist/core/capabilities/delta/uncovered.js +2 -2
- package/dist/core/capabilities/delta/uncovered.js.map +1 -1
- package/dist/core/capabilities/findings.js +18 -22
- package/dist/core/capabilities/findings.js.map +1 -1
- package/dist/core/capabilities/realizes/findings.js +12 -19
- package/dist/core/capabilities/realizes/findings.js.map +1 -1
- package/dist/core/capabilities/realizes/join.js +0 -20
- package/dist/core/capabilities/realizes/join.js.map +1 -1
- package/dist/core/capabilities/rollup.js +6 -0
- package/dist/core/capabilities/rollup.js.map +1 -1
- package/dist/core/capabilities/tree.js +6 -28
- package/dist/core/capabilities/tree.js.map +1 -1
- package/dist/core/capabilities/usecase-join.js +3 -13
- package/dist/core/capabilities/usecase-join.js.map +1 -1
- package/dist/core/coherence/authoring/scaffold.js +11 -3
- package/dist/core/coherence/authoring/scaffold.js.map +1 -1
- package/dist/core/coherence/authoring/sentinels.js +2 -1
- package/dist/core/coherence/authoring/sentinels.js.map +1 -1
- 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 +103 -22
- package/dist/core/coherence/coherence.js.map +1 -1
- 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 +60 -34
- package/dist/core/coherence/declared.js.map +1 -1
- package/dist/core/coherence/events/declared.js +44 -59
- package/dist/core/coherence/events/declared.js.map +1 -1
- package/dist/core/coherence/events/events.js +147 -16
- package/dist/core/coherence/events/events.js.map +1 -1
- package/dist/core/coherence/events/grades.js +31 -8
- package/dist/core/coherence/events/grades.js.map +1 -1
- package/dist/core/coherence/events/lookups.js +28 -87
- package/dist/core/coherence/events/lookups.js.map +1 -1
- package/dist/core/coherence/events/produced.js +100 -0
- package/dist/core/coherence/events/produced.js.map +1 -0
- package/dist/core/coherence/lookups.js +18 -78
- package/dist/core/coherence/lookups.js.map +1 -1
- 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/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/delta.js +51 -6
- package/dist/core/delta/delta.js.map +1 -1
- package/dist/core/dependencies/fanin.js +2 -2
- package/dist/core/dependencies/fanin.js.map +1 -1
- 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 +94 -12
- package/dist/core/diff/base-git.js.map +1 -1
- package/dist/core/diff/base-state.js +49 -21
- package/dist/core/diff/base-state.js.map +1 -1
- 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 +22 -6
- package/dist/core/diff/scope/changed-paths.js.map +1 -1
- 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 +100 -31
- package/dist/core/diff/semantic.js.map +1 -1
- package/dist/core/docs.js +31 -22
- package/dist/core/docs.js.map +1 -1
- package/dist/core/doctor/agents.js +34 -18
- package/dist/core/doctor/agents.js.map +1 -1
- package/dist/core/doctor/config.js +7 -3
- package/dist/core/doctor/config.js.map +1 -1
- package/dist/core/doctor/doctor.js +91 -11
- package/dist/core/doctor/doctor.js.map +1 -1
- package/dist/core/doctor/report.js.map +1 -1
- package/dist/core/doctor/reports/scan.js +242 -0
- package/dist/core/doctor/reports/scan.js.map +1 -0
- package/dist/core/document/apply.js +158 -11
- package/dist/core/document/apply.js.map +1 -1
- package/dist/core/document/frontmatter.js +55 -0
- package/dist/core/document/frontmatter.js.map +1 -1
- package/dist/core/document/parse.js +29 -6
- package/dist/core/document/parse.js.map +1 -1
- package/dist/core/document/scenarios.js +17 -0
- package/dist/core/document/scenarios.js.map +1 -1
- package/dist/core/document/spec.js +4 -11
- package/dist/core/document/spec.js.map +1 -1
- package/dist/core/envelope/config.js +10 -0
- package/dist/core/envelope/config.js.map +1 -1
- package/dist/core/envelope/json.js +34 -0
- package/dist/core/envelope/json.js.map +1 -1
- package/dist/core/explain/families.js +26 -21
- package/dist/core/explain/families.js.map +1 -1
- package/dist/core/explain/lookup.js +14 -1
- package/dist/core/explain/lookup.js.map +1 -1
- package/dist/core/explain/refusals.js +5 -5
- package/dist/core/explain/refusals.js.map +1 -1
- 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 +68 -109
- package/dist/core/explain/terms.js.map +1 -1
- package/dist/core/explore/explore.js +40 -10
- package/dist/core/explore/explore.js.map +1 -1
- package/dist/core/fleet-context.js +81 -95
- package/dist/core/fleet-context.js.map +1 -1
- package/dist/core/gate/checks.js +11 -4
- package/dist/core/gate/checks.js.map +1 -1
- package/dist/core/gate/partners.js +69 -28
- package/dist/core/gate/partners.js.map +1 -1
- package/dist/core/gate/report.js.map +1 -1
- package/dist/core/gate/verification.js +75 -12
- package/dist/core/gate/verification.js.map +1 -1
- package/dist/core/gherkin/stale.js +13 -37
- package/dist/core/gherkin/stale.js.map +1 -1
- package/dist/core/glossary/delta.js +10 -7
- package/dist/core/glossary/delta.js.map +1 -1
- package/dist/core/glossary/tree.js +6 -19
- package/dist/core/glossary/tree.js.map +1 -1
- package/dist/core/kernel/concurrency.js +19 -0
- package/dist/core/kernel/concurrency.js.map +1 -1
- 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/path-safety.js +38 -0
- package/dist/core/kernel/path-safety.js.map +1 -1
- package/dist/core/kernel/records.js +11 -0
- package/dist/core/kernel/records.js.map +1 -1
- package/dist/core/links/backlinks.js +1 -3
- package/dist/core/links/backlinks.js.map +1 -1
- package/dist/core/links/corpus.js +51 -37
- package/dist/core/links/corpus.js.map +1 -1
- package/dist/core/links/findings.js.map +1 -1
- package/dist/core/links/parse.js +38 -9
- package/dist/core/links/parse.js.map +1 -1
- package/dist/core/mcp/argv.js +101 -0
- package/dist/core/mcp/argv.js.map +1 -1
- package/dist/core/mcp/author-tools.js +2 -1
- package/dist/core/mcp/author-tools.js.map +1 -1
- package/dist/core/mcp/protocol.js +2 -2
- package/dist/core/mcp/protocol.js.map +1 -1
- package/dist/core/mcp/tools.js +43 -33
- package/dist/core/mcp/tools.js.map +1 -1
- package/dist/core/openapi/baseline/gate.js +53 -12
- package/dist/core/openapi/baseline/gate.js.map +1 -1
- package/dist/core/openapi/baseline/plan.js +40 -10
- package/dist/core/openapi/baseline/plan.js.map +1 -1
- package/dist/core/openapi/baseline/record.js +0 -1
- package/dist/core/openapi/baseline/record.js.map +1 -1
- 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 +38 -24
- package/dist/core/openapi/depth.js.map +1 -1
- package/dist/core/openapi/digest.js +52 -2
- package/dist/core/openapi/digest.js.map +1 -1
- package/dist/core/openapi/doc.js +12 -4
- package/dist/core/openapi/doc.js.map +1 -1
- package/dist/core/openapi/merge/components.js +25 -60
- package/dist/core/openapi/merge/components.js.map +1 -1
- package/dist/core/openapi/merge/error.js +3 -13
- package/dist/core/openapi/merge/error.js.map +1 -1
- package/dist/core/openapi/merge/markers.js +26 -30
- package/dist/core/openapi/merge/markers.js.map +1 -1
- package/dist/core/openapi/merge/merge.js +28 -52
- package/dist/core/openapi/merge/merge.js.map +1 -1
- package/dist/core/openapi/merge/pin.js +17 -35
- package/dist/core/openapi/merge/pin.js.map +1 -1
- package/dist/core/openspec/decide/verdict.js.map +1 -1
- package/dist/core/openspec/inventory.js +4 -5
- package/dist/core/openspec/inventory.js.map +1 -1
- package/dist/core/openspec/model/mapping.js +30 -28
- package/dist/core/openspec/model/mapping.js.map +1 -1
- package/dist/core/openspec/model/model.js +12 -7
- package/dist/core/openspec/model/model.js.map +1 -1
- package/dist/core/openspec/scan/changes.js +10 -4
- package/dist/core/openspec/scan/changes.js.map +1 -1
- package/dist/core/openspec/scan/config.js +7 -16
- package/dist/core/openspec/scan/config.js.map +1 -1
- package/dist/core/openspec/scan/shape.js +63 -19
- package/dist/core/openspec/scan/shape.js.map +1 -1
- package/dist/core/openspec/scan/walk.js +21 -38
- package/dist/core/openspec/scan/walk.js.map +1 -1
- package/dist/core/pack/living.js +43 -4
- package/dist/core/pack/living.js.map +1 -1
- package/dist/core/pack/pack.js +50 -6
- package/dist/core/pack/pack.js.map +1 -1
- package/dist/core/projection/arch-slice.js +2 -2
- package/dist/core/projection/arch-slice.js.map +1 -1
- package/dist/core/projection/introduced.js +14 -0
- package/dist/core/projection/introduced.js.map +1 -0
- package/dist/core/provenance/findings.js +48 -12
- package/dist/core/provenance/findings.js.map +1 -1
- package/dist/core/provenance/git.js +33 -57
- package/dist/core/provenance/git.js.map +1 -1
- package/dist/core/provenance/gitq/moves.js +71 -114
- package/dist/core/provenance/gitq/moves.js.map +1 -1
- package/dist/core/provenance/gitq/vouched-ancestor.js +2 -2
- package/dist/core/provenance/gitq/vouched-ancestor.js.map +1 -1
- package/dist/core/provenance/sources.js +23 -6
- package/dist/core/provenance/sources.js.map +1 -1
- package/dist/core/provenance/stamp.js +5 -17
- package/dist/core/provenance/stamp.js.map +1 -1
- package/dist/core/repo/authored/paths.js +18 -0
- package/dist/core/repo/authored/paths.js.map +1 -1
- package/dist/core/repo/entries.js.map +1 -1
- package/dist/core/repo/paths.js +92 -6
- package/dist/core/repo/paths.js.map +1 -1
- package/dist/core/repo/repo.js +74 -14
- package/dist/core/repo/repo.js.map +1 -1
- package/dist/core/repo/tree/find.js +12 -3
- package/dist/core/repo/tree/find.js.map +1 -1
- package/dist/core/repo/tree/fs.js +27 -1
- package/dist/core/repo/tree/fs.js.map +1 -1
- 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 +53 -32
- package/dist/core/repo/tree/walk.js.map +1 -1
- package/dist/core/results.js +47 -12
- package/dist/core/results.js.map +1 -1
- package/dist/core/scaffold/landscape.js +121 -13
- package/dist/core/scaffold/landscape.js.map +1 -1
- package/dist/core/scaffold/legacy.js +271 -0
- package/dist/core/scaffold/legacy.js.map +1 -0
- package/dist/core/staging/commit.js +26 -15
- package/dist/core/staging/commit.js.map +1 -1
- package/dist/core/staging/lock.js +74 -12
- package/dist/core/staging/lock.js.map +1 -1
- package/dist/core/staging/recovery/intent.js +2 -5
- package/dist/core/staging/recovery/intent.js.map +1 -1
- package/dist/core/staging/recovery/recover.js +84 -6
- package/dist/core/staging/recovery/recover.js.map +1 -1
- package/dist/core/staging/snapshot/manifest.js +188 -0
- package/dist/core/staging/snapshot/manifest.js.map +1 -0
- package/dist/core/staging/{snapshot.js → snapshot/snapshot.js} +39 -45
- package/dist/core/staging/snapshot/snapshot.js.map +1 -0
- package/dist/core/staging/txn/forward.js +24 -14
- package/dist/core/staging/txn/forward.js.map +1 -1
- package/dist/core/staging/writes.js.map +1 -1
- package/dist/core/status/actions/execution.js +11 -0
- package/dist/core/status/actions/execution.js.map +1 -1
- package/dist/core/status/contracts.js +39 -15
- package/dist/core/status/contracts.js.map +1 -1
- package/dist/core/status/feature/artifacts.js +33 -8
- package/dist/core/status/feature/artifacts.js.map +1 -1
- package/dist/core/status/feature/feature.js +24 -17
- package/dist/core/status/feature/feature.js.map +1 -1
- package/dist/core/status/feature/next.js +20 -7
- package/dist/core/status/feature/next.js.map +1 -1
- 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 +43 -14
- package/dist/core/status/fleet/fleet.js.map +1 -1
- package/dist/core/status/fleet/next.js +153 -58
- package/dist/core/status/fleet/next.js.map +1 -1
- package/dist/core/status/report.js.map +1 -1
- package/dist/core/status/scan.js.map +1 -1
- package/dist/core/status/verification.js +30 -15
- package/dist/core/status/verification.js.map +1 -1
- 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 +11 -14
- package/dist/core/usecases/capability.js.map +1 -1
- package/dist/core/usecases/delta/claims.js +31 -7
- package/dist/core/usecases/delta/claims.js.map +1 -1
- package/dist/core/usecases/delta/flows.js +5 -7
- package/dist/core/usecases/delta/flows.js.map +1 -1
- 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 +32 -191
- package/dist/core/usecases/delta/overlay.js.map +1 -1
- package/dist/core/usecases/fleet.js +195 -36
- package/dist/core/usecases/fleet.js.map +1 -1
- package/dist/{commands/validate/fleet/usecases → core/usecases/grade}/capability-tag.js +8 -9
- 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/{commands/validate/fleet/usecases → core/usecases/grade}/requirement-tag.js +3 -4
- package/dist/core/usecases/grade/requirement-tag.js.map +1 -0
- package/dist/{commands/validate/fleet/usecases → core/usecases/grade}/steps.js +102 -33
- package/dist/core/usecases/grade/steps.js.map +1 -0
- package/dist/{commands/validate/fleet/usecases → core/usecases/grade}/usecases.js +23 -10
- package/dist/core/usecases/grade/usecases.js.map +1 -0
- package/dist/core/usecases/operations.js +26 -14
- package/dist/core/usecases/operations.js.map +1 -1
- package/dist/core/usecases/place.js.map +1 -1
- 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/verify/answers.js +12 -5
- package/dist/core/verify/answers.js.map +1 -1
- package/dist/core/verify/build.js +102 -82
- package/dist/core/verify/build.js.map +1 -1
- package/dist/core/verify/checklist.js +70 -12
- package/dist/core/verify/checklist.js.map +1 -1
- package/dist/core/verify/location.js +67 -0
- package/dist/core/verify/location.js.map +1 -0
- package/dist/core/verify/pins/lint.js +3 -2
- package/dist/core/verify/pins/lint.js.map +1 -1
- package/dist/core/verify/pins/pin.js +1 -1
- package/dist/core/verify/pins/pin.js.map +1 -1
- package/dist/core/verify/read/file.js +224 -0
- package/dist/core/verify/read/file.js.map +1 -0
- package/dist/core/verify/{file.js → read/shape.js} +16 -104
- 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 +35 -12
- package/dist/core/verify/record.js.map +1 -1
- package/dist/core/verify/store/commit.js +40 -30
- package/dist/core/verify/store/commit.js.map +1 -1
- package/dist/core/verify/store/render.js +8 -4
- package/dist/core/verify/store/render.js.map +1 -1
- package/dist/core/vocabulary/issue.js +4 -0
- package/dist/core/vocabulary/issue.js.map +1 -1
- package/dist/core/vocabulary/maturity.js +75 -4
- package/dist/core/vocabulary/maturity.js.map +1 -1
- package/dist/core/vocabulary/report.js +16 -1
- package/dist/core/vocabulary/report.js.map +1 -1
- package/examples/README.md +54 -11
- package/examples/docs/architecture/landscape.likec4 +62 -6
- package/examples/docs/architecture/services.likec4 +70 -0
- package/examples/docs/architecture/subsystems.likec4 +7 -0
- package/examples/docs/architecture/usecases/order-notification.likec4 +16 -7
- package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-service/asyncapi.yaml +11 -8
- package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-split-service/openapi.yaml +6 -6
- package/examples/docs/features/FEAT-112-retire-order-v1/specs/order-service/openapi.yaml +4 -1
- package/examples/docs/features/archive/FEAT-088-refunds/specs/payment-service/openapi.yaml +13 -10
- package/examples/docs/likec4.config.json +0 -1
- package/examples/docs/services/checkout-web/model.likec4 +39 -56
- package/examples/docs/services/order-service/arch.spec.md +13 -6
- package/examples/docs/services/order-service/asyncapi.yaml +3 -2
- package/examples/docs/services/order-service/model.likec4 +58 -70
- package/examples/docs/services/payment-service/arch.spec.md +7 -4
- package/examples/docs/services/payment-service/model.likec4 +38 -37
- package/examples/docs/services/platform/identity-service/arch.spec.md +7 -4
- package/examples/docs/services/platform/identity-service/model.likec4 +35 -37
- package/examples/docs/services/platform/notification-service/asyncapi.yaml +2 -1
- package/examples/docs/services/platform/notification-service/health.yaml +8 -3
- package/examples/docs/services/platform/notification-service/model.likec4 +43 -64
- package/package.json +1 -1
- package/dist/commands/validate/checks/vocabulary.js +0 -31
- package/dist/commands/validate/checks/vocabulary.js.map +0 -1
- package/dist/commands/validate/fleet/usecases/capability-tag.js.map +0 -1
- package/dist/commands/validate/fleet/usecases/requirement-tag.js.map +0 -1
- package/dist/commands/validate/fleet/usecases/steps.js.map +0 -1
- package/dist/commands/validate/fleet/usecases/usecases.js.map +0 -1
- package/dist/core/agent/agents-md/artifacts.js +0 -220
- package/dist/core/agent/agents-md/artifacts.js.map +0 -1
- package/dist/core/agent/agents-md/cycle.js +0 -165
- package/dist/core/agent/agents-md/cycle.js.map +0 -1
- package/dist/core/agent/agents-md/shipped/archive-gate.js +0 -98
- package/dist/core/agent/agents-md/shipped/archive-gate.js.map +0 -1
- package/dist/core/agent/agents-md/spine.js +0 -40
- package/dist/core/agent/agents-md/spine.js.map +0 -1
- package/dist/core/coherence/events/merged.js +0 -40
- package/dist/core/coherence/events/merged.js.map +0 -1
- package/dist/core/diff/current-state.js +0 -96
- package/dist/core/diff/current-state.js.map +0 -1
- package/dist/core/diff/victims.js +0 -247
- package/dist/core/diff/victims.js.map +0 -1
- package/dist/core/repo/tree/views.js +0 -172
- package/dist/core/repo/tree/views.js.map +0 -1
- package/dist/core/staging/snapshot.js.map +0 -1
- package/dist/core/verify/file.js.map +0 -1
package/examples/README.md
CHANGED
|
@@ -18,6 +18,7 @@ loam archive FEAT-112 --dry-run # an operation being retired, writing nothing
|
|
|
18
18
|
loam verify FEAT-088 # a shipped feature's done-check: attested
|
|
19
19
|
loam verify FEAT-120 # …and its pair, the same check: verified
|
|
20
20
|
loam dependencies # the active-feature graph
|
|
21
|
+
loam list suites # which services each test suite needs up
|
|
21
22
|
```
|
|
22
23
|
|
|
23
24
|
Working on loam itself and running from source, use `npx tsx ../../src/cli.ts <args>` in place of
|
|
@@ -58,6 +59,18 @@ GROUP and earns no finding. Each requirement in both files is a promise a custom
|
|
|
58
59
|
names no service, and carries a `Requirement-ID:` — required here, unlike in a service spec, because
|
|
59
60
|
these documents outlive every service that realizes them.
|
|
60
61
|
|
|
62
|
+
**One journey in two suites.** The same use case also carries `#suite-smoke` and
|
|
63
|
+
`#suite-notifications`, both declared in the landscape's `specification` block, so `loam list
|
|
64
|
+
suites` has a real answer: each suite needs `checkout-web`, `order-service` and
|
|
65
|
+
`notification-service` up — the union of the journey's participants, resolved through the same
|
|
66
|
+
element→service join the step grades use (notification-service is found through its filing under
|
|
67
|
+
`platform/`, because the answer is ids, never paths). Two participants resolve to no service and are
|
|
68
|
+
NAMED rather than dropped: `customer`, who drives the flow, and `kafka.orderEvents`, which is
|
|
69
|
+
`#external` through its `topic` kind and wants a double on the test stand. One journey in both
|
|
70
|
+
suites is the point of the tag: a directory could file it in only one. The suite tags change
|
|
71
|
+
nothing `validate` says here — the view was already graded through its `#cap-` tag — but on a view
|
|
72
|
+
carrying ONLY `#suite-` tags they are the opt-in, and its hops are graded like any other use case's.
|
|
73
|
+
|
|
61
74
|
**Two glossary terms**, `glossary/order.md` and the nested `glossary/payments/authorization.md`,
|
|
62
75
|
each cited from the capability documents that use the word. This is the axis's whole mechanism in
|
|
63
76
|
two files: the citation is an ordinary markdown link, so `loam validate` resolves it like any other
|
|
@@ -81,8 +94,9 @@ nowhere, and `obligation.unapplied` is the warning in the table below.
|
|
|
81
94
|
**On the event spine the arrow follows the message** — producer → topic for `publishes`, topic →
|
|
82
95
|
consumer for `consumes` — and that is load-bearing rather than aesthetic. `publishes` binds the
|
|
83
96
|
edge's source and `consumes` binds its target, so a consume edge drawn the other way round binds to
|
|
84
|
-
nothing: the metadata parses, the document validates, and
|
|
85
|
-
|
|
97
|
+
nothing: the metadata parses, the document validates, and no contract is checked against the link.
|
|
98
|
+
`spine.message-unbound` (warn) is what reports it, on the service at the end the key did not bind;
|
|
99
|
+
SCHEMA.md's *Which way an edge points* lists every reader of the arrow and the drawing each expects.
|
|
86
100
|
|
|
87
101
|
## Four features, at four points in their life
|
|
88
102
|
|
|
@@ -94,8 +108,10 @@ for.
|
|
|
94
108
|
- **`features/archive/FEAT-088-refunds/`** — shipped, and **`attested`**. It was merged by the real
|
|
95
109
|
`loam archive`, so its `.loam-before/` snapshot holds the exact bytes the merge overwrote and
|
|
96
110
|
`loam unarchive FEAT-088` would put them back. Its `verification.yaml` is the done-check written
|
|
97
|
-
down
|
|
98
|
-
|
|
111
|
+
down — recorded all at once, so it is the one file (a feature recorded per service carries one
|
|
112
|
+
`verification/<svc>.yaml` per attesting service instead): every claim is confirmed, but the
|
|
113
|
+
scenario claims rest on an agent's word instead of a digest-matched test run. loam does not
|
|
114
|
+
pretend those are the same thing.
|
|
99
115
|
- **`features/archive/FEAT-120-refund-notification/`** — shipped, and **`verified`**. The sequel
|
|
100
116
|
FEAT-088 left open: the money went back and nobody told the customer. It publishes
|
|
101
117
|
`payment.PaymentRefunded` from payment-service and has notification-service turn it into the
|
|
@@ -111,10 +127,10 @@ for.
|
|
|
111
127
|
with its own requirements, architecture requirements and contract, a C4 delta that splices a
|
|
112
128
|
nested element into the living landscape, a `MODIFIED` requirement that **renames its heading**
|
|
113
129
|
while keeping its `Requirement-ID` — loam's rename mechanism — and an **event-contract delta**
|
|
114
|
-
(`specs/payment-service/asyncapi.yaml`)
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
130
|
+
(`specs/payment-service/asyncapi.yaml`) that restates payment-service's living contract under
|
|
131
|
+
`loam rebase`-written `x-loam-based-on` pins and adds one new producer side, so the archive merges
|
|
132
|
+
the new slots and leaves every pinned quote to the living contract's own copy. The restatement is
|
|
133
|
+
there to demonstrate the pin; a real delta holds only the slots it adds, changes or removes.
|
|
118
134
|
- **`features/FEAT-112-retire-order-v1/`** — in flight, and the smallest legal shape: no
|
|
119
135
|
`delta.likec4` at all, because retiring an operation moves no boxes. It carries the two halves
|
|
120
136
|
loam requires together for a removal — a `REMOVED` requirement and an `x-loam-remove: true` marker
|
|
@@ -143,12 +159,39 @@ while the other three sit unfiled — the permanent, normal state a partially or
|
|
|
143
159
|
in, counted by `loam list` and never a finding. Placement is not identity: both services' specs,
|
|
144
160
|
contracts and digests are byte-identical to their unfiled days, every command addresses them by bare
|
|
145
161
|
id, and `architecture/subsystems.likec4` — GENERATED by `loam subsystem sync`, one view per
|
|
146
|
-
subsystem, one `include` per line — is the only file the grouping added.
|
|
147
|
-
`
|
|
148
|
-
|
|
162
|
+
subsystem, one `include` per line — is the only file the grouping added. Its sibling
|
|
163
|
+
`architecture/services.likec4` is the other generated views file and owes the grouping nothing: one
|
|
164
|
+
overview view per service the fleet map draws, filed or not, each declared `of` its service's
|
|
165
|
+
element so every other view drills into it, and each titled by its path so the two files fold into
|
|
166
|
+
one folder tree. Edit the tree with
|
|
167
|
+
`loam subsystem move|rename|rm` and both views files travel in the same transaction; edit either by
|
|
168
|
+
hand and `validate --all` answers `subsystem.views-stale`, naming the file that drifted. (`order-service` and `payment-service` stay
|
|
149
169
|
unfiled deliberately: FEAT-088's committed version-2 snapshot restores them by literal path, and the
|
|
150
170
|
`loam unarchive FEAT-088` walkthrough must keep working byte-for-byte.)
|
|
151
171
|
|
|
172
|
+
**All five models are EXTENDING models, and that is the shape this example teaches.** None of them
|
|
173
|
+
declares a `specification` block, none re-declares a partner, and none has a `likec4.config.json`
|
|
174
|
+
beside it. Each one says what is inside its service with `extend marketplace.<svc> { … }` on the
|
|
175
|
+
element `architecture/landscape.likec4` already binds to its directory, so `kafka`, `stripe`,
|
|
176
|
+
`notification-provider` and every peer service are declared exactly once — in the map — and no two
|
|
177
|
+
documents can disagree about their tags. The root `likec4.config.json` therefore excludes only
|
|
178
|
+
`**/node_modules/**` and `features/**`: `npx likec4 validate examples/docs` names ONE project,
|
|
179
|
+
`fleet`, holding the map and all five models, and needs no `--project` flag. The other shape — a
|
|
180
|
+
model that declares its own `specification` and is parsed alone, which is what every model here was
|
|
181
|
+
before — is still legal and still supported; SCHEMA.md's "Two shapes of a service model" has both,
|
|
182
|
+
the eight grades in its table — seven that came with the pair, plus the one it narrowed
|
|
183
|
+
(`service.likec4-config-missing`, now standalone-only) — and the
|
|
184
|
+
ordered recipe for migrating between them.
|
|
185
|
+
|
|
186
|
+
Two consequences are visible in the tree and worth reading for. Element ids carry their full path,
|
|
187
|
+
so `services/order-service/arch.spec.md` writes `Covers: marketplace.orderService.db` — the
|
|
188
|
+
container has no shorter name, because the model extends an element nested in the `marketplace`
|
|
189
|
+
group. And a cross-boundary call is written **twice** on purpose: container-level in the model
|
|
190
|
+
(`marketplace.notificationService.sender -> notificationProvider`) and service-level in the map
|
|
191
|
+
(`marketplace.notificationService -> notificationProvider`), because every fleet check — the spine,
|
|
192
|
+
`landscape.service-isolated`, the platform census — reads the map alone. ROADMAP.md keeps that
|
|
193
|
+
remainder written down rather than hidden.
|
|
194
|
+
|
|
152
195
|
Plus one count rather than a finding: `sourcesUnverifiableFromHere: 4`. Four specs name paths in
|
|
153
196
|
their own service repositories, and this is none of those repositories — the fleet gate reports the
|
|
154
197
|
blind spot instead of resolving it. Running `loam validate --service <id>` inside each service repo
|
|
@@ -8,6 +8,16 @@
|
|
|
8
8
|
// service needs a directory (warning). An element is tied to its directory by
|
|
9
9
|
// `metadata { service '<id>' }`, or by its title when there is no binding.
|
|
10
10
|
// Systems that are not ours carry #external and are exempt.
|
|
11
|
+
//
|
|
12
|
+
// This file is also the SPECIFICATION every service model borrows. Each
|
|
13
|
+
// `services/<…>/<svc>/model.likec4` here is an EXTENDING model: it declares no
|
|
14
|
+
// kinds and no partners, and says what is inside its service with
|
|
15
|
+
// `extend marketplace.<svc> { … }` on the element below that binds to its
|
|
16
|
+
// directory. The root `likec4.config.json` therefore does NOT exclude
|
|
17
|
+
// `services/**` — the map and every model are ONE LikeC4 project, so an element
|
|
18
|
+
// is declared exactly once and no two documents can disagree about its tags.
|
|
19
|
+
// SCHEMA.md, "Two shapes of a service model", has both shapes and the rule that
|
|
20
|
+
// picks between them; a kind or tag a model needs is added HERE, once.
|
|
11
21
|
specification {
|
|
12
22
|
// A grouping element — it stands for no service and owns no directory. The
|
|
13
23
|
// service checks WALK the tree rather than reading only top-level elements:
|
|
@@ -17,10 +27,27 @@ specification {
|
|
|
17
27
|
// CONTAINS services rather than being one.
|
|
18
28
|
element group
|
|
19
29
|
element softwareSystem
|
|
20
|
-
// Declared here
|
|
21
|
-
// new system
|
|
22
|
-
//
|
|
30
|
+
// Declared here for the service models, which declare no kinds of their own.
|
|
31
|
+
// FEAT-101's new system draws an `api` container inside it, and archive
|
|
32
|
+
// creates services/payment-split-service/model.likec4 with the service and
|
|
33
|
+
// splices the container in there — never into this file, which holds no
|
|
34
|
+
// service's interior. That model borrows its kinds from this block, so the
|
|
35
|
+
// kind has to be legal HERE for it to parse (archive refuses otherwise).
|
|
23
36
|
element container
|
|
37
|
+
// Declared here for the SERVICE MODELS, and nothing in this file uses it.
|
|
38
|
+
// This fleet writes every `database` element inside the service that owns it,
|
|
39
|
+
// in a `services/<svc>/model.likec4` under `extend marketplace.<svc>` — a
|
|
40
|
+
// CHOICE this example makes, not a rule loam enforces. Drawing an owned store
|
|
41
|
+
// beside the services is equally first-class and earns no finding; what the
|
|
42
|
+
// placement decides is one thing, and it is a fact about LikeC4: a second
|
|
43
|
+
// service's edge naming `marketplace.<svc>.<store>` resolves only against a
|
|
44
|
+
// declaration the MAP holds, because a per-service project is `architecture/`
|
|
45
|
+
// plus one model. So a store a second consumer will name belongs on the map,
|
|
46
|
+
// and one nobody else reaches may live wherever the team finds it clearest.
|
|
47
|
+
// An extending model declares no kinds of its own, so a kind it needs and
|
|
48
|
+
// this block does not declare is ONE parse error on the model — which is what
|
|
49
|
+
// this line prevents.
|
|
50
|
+
element database
|
|
24
51
|
element person
|
|
25
52
|
// A topic is an element, and the kind carries #external rather than each
|
|
26
53
|
// instance doing it: LikeC4 does NOT inherit tags, so a topic nested inside
|
|
@@ -58,6 +85,14 @@ specification {
|
|
|
58
85
|
// cannot carry flattened to `-`. Declared here for the same reason — one
|
|
59
86
|
// specification block serves the whole `architecture/` project.
|
|
60
87
|
tag req-NOTIFY-ONCE
|
|
88
|
+
// The SUITES a flow runs with — `#suite-<name>` on the view, many-to-many, so
|
|
89
|
+
// the one journey below sits in both. Declared here, like every tag, so a
|
|
90
|
+
// mistyped suite is a parse error rather than a second, empty suite.
|
|
91
|
+
// `loam list suites` answers which services each one needs up: the union of
|
|
92
|
+
// its journeys' participants, plus the ones no services/ directory stands for
|
|
93
|
+
// (the customer who drives it, the #external topic in the middle).
|
|
94
|
+
tag suite-smoke
|
|
95
|
+
tag suite-notifications
|
|
61
96
|
// An ARCHITECTURAL OBLIGATION, declared in architecture/obligations.yaml and
|
|
62
97
|
// applied HERE, on the objects it holds for. The decision itself is
|
|
63
98
|
// architecture/adrs/0001-transactional-outbox.md; this tag is the architect
|
|
@@ -137,6 +172,18 @@ model {
|
|
|
137
172
|
description 'CRM of record — the fleet reads its events and writes none'
|
|
138
173
|
}
|
|
139
174
|
|
|
175
|
+
// Declared HERE rather than in notification-service's model, and that is the
|
|
176
|
+
// rule an extending model turns on: a system a service reaches is the fleet's
|
|
177
|
+
// element, declared once, and a model that declared its own copy would be
|
|
178
|
+
// `c4.element-unowned` (an extending model may only add elements under the
|
|
179
|
+
// element that resolves to its own service). One consumer, so it never
|
|
180
|
+
// becomes `landscape.platform-candidate`; #external, so no
|
|
181
|
+
// services/notification-provider/ is asked for.
|
|
182
|
+
notificationProvider = softwareSystem 'notification-provider' {
|
|
183
|
+
#external
|
|
184
|
+
description 'Third-party email and SMS gateway — quota-limited, and outside this fleet'
|
|
185
|
+
}
|
|
186
|
+
|
|
140
187
|
customer -> marketplace.checkoutWeb 'Uses'
|
|
141
188
|
|
|
142
189
|
// The synchronous spine. Every one of these resolves against the TARGET's
|
|
@@ -185,6 +232,14 @@ model {
|
|
|
185
232
|
// it raises no warning because its title does not claim to be a call into a
|
|
186
233
|
// fleet service.
|
|
187
234
|
marketplace.paymentService -> stripe 'Authorizes cards'
|
|
235
|
+
// The second half of the rule the extending shape keeps: the container that
|
|
236
|
+
// really makes the call is drawn in the service's own model
|
|
237
|
+
// (`marketplace.notificationService.sender -> notificationProvider`), and the
|
|
238
|
+
// SERVICE-level twin is drawn here, because every fleet check — the spine,
|
|
239
|
+
// `landscape.service-isolated`, the platform census — reads this file alone.
|
|
240
|
+
// The edge exists twice on purpose; SCHEMA.md says so where it says the map
|
|
241
|
+
// is the one document holding every cross-service edge.
|
|
242
|
+
marketplace.notificationService -> notificationProvider 'Sends email and SMS'
|
|
188
243
|
|
|
189
244
|
// The event spine, the async mirror of `metadata { op }`: the name must be a
|
|
190
245
|
// message the PRODUCER's own asyncapi.yaml declares an `action: send` for, or
|
|
@@ -195,9 +250,10 @@ model {
|
|
|
195
250
|
// THE ARROW FOLLOWS THE MESSAGE, and that is load-bearing rather than
|
|
196
251
|
// aesthetic. `publishes` binds the edge's SOURCE and `consumes` binds its
|
|
197
252
|
// TARGET, so a consume edge drawn the other way round — `orderService ->
|
|
198
|
-
// kafka.paymentEvents` — binds to nothing at all: the metadata parses
|
|
199
|
-
// document validates, and
|
|
200
|
-
// topic, topic to consumer, every
|
|
253
|
+
// kafka.paymentEvents` — binds to nothing at all: the metadata parses and the
|
|
254
|
+
// document validates, and all that says so is `spine.message-unbound` (warn)
|
|
255
|
+
// on the service that drew it. Producer to topic, topic to consumer, every
|
|
256
|
+
// time.
|
|
201
257
|
marketplace.paymentService -> kafka.paymentEvents 'Publishes PaymentAuthorized' {
|
|
202
258
|
#obl-outbox
|
|
203
259
|
metadata {
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
// generated by loam — one overview view per service under services/, drawn from the fleet map.
|
|
2
|
+
// Do not edit: `loam subsystem sync` regenerates this file from the directories and the map,
|
|
3
|
+
// and `loam validate --all` reports `subsystem.views-stale` when it drifts.
|
|
4
|
+
// A navigation aid, not the fleet's architecture: author your own diagrams elsewhere.
|
|
5
|
+
|
|
6
|
+
views {
|
|
7
|
+
view service_checkout_2dweb of marketplace.checkoutWeb {
|
|
8
|
+
title 'checkout-web'
|
|
9
|
+
include *
|
|
10
|
+
include customer
|
|
11
|
+
include marketplace.orderService
|
|
12
|
+
include marketplace.paymentService
|
|
13
|
+
exclude * -> *
|
|
14
|
+
include -> marketplace.checkoutWeb
|
|
15
|
+
include marketplace.checkoutWeb ->
|
|
16
|
+
include marketplace.checkoutWeb.* -> marketplace.checkoutWeb.*
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
view service_identity_2dservice of marketplace.identityService {
|
|
20
|
+
title 'Platform / identity-service'
|
|
21
|
+
include *
|
|
22
|
+
include marketplace.orderService
|
|
23
|
+
include marketplace.paymentService
|
|
24
|
+
exclude * -> *
|
|
25
|
+
include -> marketplace.identityService
|
|
26
|
+
include marketplace.identityService ->
|
|
27
|
+
include marketplace.identityService.* -> marketplace.identityService.*
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
view service_notification_2dservice of marketplace.notificationService {
|
|
31
|
+
title 'Platform / notification-service'
|
|
32
|
+
include *
|
|
33
|
+
include kafka.crmEvents
|
|
34
|
+
include kafka.orderEvents
|
|
35
|
+
include kafka.paymentEvents
|
|
36
|
+
include notificationProvider
|
|
37
|
+
exclude * -> *
|
|
38
|
+
include -> marketplace.notificationService
|
|
39
|
+
include marketplace.notificationService ->
|
|
40
|
+
include marketplace.notificationService.* -> marketplace.notificationService.*
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
view service_order_2dservice of marketplace.orderService {
|
|
44
|
+
title 'order-service'
|
|
45
|
+
include *
|
|
46
|
+
include kafka.orderEvents
|
|
47
|
+
include kafka.paymentEvents
|
|
48
|
+
include marketplace.checkoutWeb
|
|
49
|
+
include marketplace.identityService
|
|
50
|
+
include marketplace.paymentService
|
|
51
|
+
exclude * -> *
|
|
52
|
+
include -> marketplace.orderService
|
|
53
|
+
include marketplace.orderService ->
|
|
54
|
+
include marketplace.orderService.* -> marketplace.orderService.*
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
view service_payment_2dservice of marketplace.paymentService {
|
|
58
|
+
title 'payment-service'
|
|
59
|
+
include *
|
|
60
|
+
include kafka.paymentEvents
|
|
61
|
+
include marketplace.checkoutWeb
|
|
62
|
+
include marketplace.identityService
|
|
63
|
+
include marketplace.orderService
|
|
64
|
+
include stripe
|
|
65
|
+
exclude * -> *
|
|
66
|
+
include -> marketplace.paymentService
|
|
67
|
+
include marketplace.paymentService ->
|
|
68
|
+
include marketplace.paymentService.* -> marketplace.paymentService.*
|
|
69
|
+
}
|
|
70
|
+
}
|
|
@@ -1,11 +1,18 @@
|
|
|
1
1
|
// generated by loam — the subsystem tree under services/, one view per subsystem.
|
|
2
2
|
// Do not edit: `loam subsystem sync` regenerates this file from the directories,
|
|
3
3
|
// and `loam validate --all` reports `subsystem.views-stale` when it drifts.
|
|
4
|
+
// A scoping aid, not the fleet's architecture: author your own diagrams elsewhere.
|
|
4
5
|
|
|
5
6
|
views {
|
|
6
7
|
// services/platform
|
|
8
|
+
// model: no boundary — marketplace also holds services outside this subsystem.
|
|
7
9
|
view subsystem_platform {
|
|
10
|
+
title 'Platform'
|
|
11
|
+
description 'Cross-cutting identity and messaging'
|
|
8
12
|
include marketplace.identityService
|
|
9
13
|
include marketplace.notificationService
|
|
14
|
+
|
|
15
|
+
include marketplace.identityService -> *, * -> marketplace.identityService
|
|
16
|
+
include marketplace.notificationService -> *, * -> marketplace.notificationService
|
|
10
17
|
}
|
|
11
18
|
}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
// A fleet use case: the ordered hops that fulfil one business capability.
|
|
2
2
|
//
|
|
3
3
|
// This file is the whole shape of the axis. A `dynamic view` tagged
|
|
4
|
-
// `#cap-<slug>` opts in to grading
|
|
5
|
-
//
|
|
4
|
+
// `#cap-<slug>` opts in to grading — so does one tagged only `#req-` or only
|
|
5
|
+
// `#suite-<name>`, the suite a journey runs with (`loam list suites`); an
|
|
6
|
+
// untagged one is somebody's hand-drawn diagram and loam never says a word
|
|
7
|
+
// about it. The slug is the capability id
|
|
6
8
|
// from architecture/capabilities.yaml with every `/` flattened to `-`, because
|
|
7
9
|
// a LikeC4 tag name cannot carry a slash — `identity/tokens` would be
|
|
8
10
|
// `#cap-identity-tokens`.
|
|
@@ -14,7 +16,10 @@
|
|
|
14
16
|
// read as ONE LikeC4 project, so the steps below resolve against the landscape's
|
|
15
17
|
// elements even though this file declares none — which also means exactly one
|
|
16
18
|
// file in this directory declares the `specification` block, and it is not this
|
|
17
|
-
// one.
|
|
19
|
+
// one. (The renderer's root project is WIDER than what loam grades here: it also
|
|
20
|
+
// holds every `services/<svc>/model.likec4`, because each of them extends the
|
|
21
|
+
// map. A tag declared twice across that whole set is `c4.fleet-project-invalid`,
|
|
22
|
+
// which is why a tag belongs in the landscape's one block.)
|
|
18
23
|
//
|
|
19
24
|
// THE TAG MUST BE THE FIRST THING IN THE VIEW BODY. Written after `title` it is
|
|
20
25
|
// five parse errors, none of which mentions tags. That is the mistake every
|
|
@@ -30,7 +35,7 @@
|
|
|
30
35
|
// `usecase.step-unlinked` is met except the one that matters, which is that a
|
|
31
36
|
// person is not a caller. Somebody clicking a button owes no operationId. Delete
|
|
32
37
|
// that exemption from the checker and this file is what notices: the example
|
|
33
|
-
// fleet's warning count moves from
|
|
38
|
+
// fleet's warning count moves from ten to eleven and test/examples.test.ts
|
|
34
39
|
// fails.
|
|
35
40
|
//
|
|
36
41
|
// The hop from checkout-web to order-service is DELIBERATELY NOT DRAWN, and its
|
|
@@ -38,14 +43,18 @@
|
|
|
38
43
|
// edges for that pair — `Calls createOrder` and `Calls getOrder` — so a step
|
|
39
44
|
// between those two elements names two operations, and loam refuses to guess
|
|
40
45
|
// which one the flow exercises: `usecase.step-contested` (warn), listing both
|
|
41
|
-
// candidates. That is the check working. The
|
|
42
|
-
//
|
|
43
|
-
//
|
|
46
|
+
// candidates. That is the check working. The fix is the one the message offers
|
|
47
|
+
// first: say which operation the hop means by opening the step's title with it,
|
|
48
|
+
// then punctuation — `marketplace.checkoutWeb -> marketplace.orderService
|
|
49
|
+
// 'createOrder — creates the order'` — and loam attributes the hop to that edge.
|
|
50
|
+
// (The other fix is to give the candidates one operation between them.)
|
|
44
51
|
|
|
45
52
|
views {
|
|
46
53
|
dynamic view uc_order_notification {
|
|
47
54
|
#cap-order-notifications
|
|
48
55
|
#req-NOTIFY-ONCE
|
|
56
|
+
#suite-smoke
|
|
57
|
+
#suite-notifications
|
|
49
58
|
title 'Order notification'
|
|
50
59
|
description 'A placed order reaches the customer as exactly one confirmation'
|
|
51
60
|
|
package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-service/asyncapi.yaml
CHANGED
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
# The event-contract delta: what FEAT-101 changes about the messages
|
|
2
2
|
# payment-service puts on the bus.
|
|
3
3
|
#
|
|
4
|
-
#
|
|
5
|
-
#
|
|
6
|
-
# the
|
|
7
|
-
#
|
|
8
|
-
#
|
|
9
|
-
#
|
|
10
|
-
#
|
|
11
|
-
#
|
|
4
|
+
# A delta needs only the slots it adds, changes or removes — the merge leaves
|
|
5
|
+
# every slot it does not declare exactly as the living contract has it. This
|
|
6
|
+
# one restates the living contract around the change ON PURPOSE, to show what
|
|
7
|
+
# a pin does with a restatement: identity is the slot — `channels.<key>`,
|
|
8
|
+
# `operations.<key>`, `components.messages.<key>` — and `x-loam-based-on`
|
|
9
|
+
# (written by `loam rebase`, never by hand) is what lets the merge tell a
|
|
10
|
+
# restated slot from an edited one: a pinned QUOTE is never a merge input, so
|
|
11
|
+
# a change that lands on the living contract after this delta was written
|
|
12
|
+
# survives the archive. Outside a demonstration, leave quotes out: each one
|
|
13
|
+
# is a pin, and a parallel feature's removal turns it into an error. The new
|
|
14
|
+
# slots below carry no pin — there is no living version for them to be based on.
|
|
12
15
|
asyncapi: 3.0.0
|
|
13
16
|
info:
|
|
14
17
|
title: payment-service events
|
package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-split-service/openapi.yaml
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
# API delta for FEAT-101 — payment-split-service (new) gains the split API.
|
|
2
2
|
# On `loam archive` this folds into services/payment-split-service/openapi.yaml (living).
|
|
3
3
|
#
|
|
4
|
-
# A feature contract
|
|
5
|
-
#
|
|
6
|
-
#
|
|
7
|
-
#
|
|
8
|
-
#
|
|
9
|
-
# the shape that silently reverts whoever landed in between.
|
|
4
|
+
# A feature contract holds only what the feature adds, changes or removes, and the merge upserts
|
|
5
|
+
# every operation it spells. Both operations here are new, like the service, so neither carries
|
|
6
|
+
# an `x-loam-based-on` pin — there is no living operation for a pin to be the digest of. On a
|
|
7
|
+
# service that already exists, an operation the delta edits carries one, written by `loam
|
|
8
|
+
# rebase`; one it would only quote belongs out of the delta, because a restatement is exactly
|
|
9
|
+
# the shape that silently reverts whoever landed in between unless something pins it.
|
|
10
10
|
openapi: 3.1.0
|
|
11
11
|
info:
|
|
12
12
|
title: payment-split-service
|
|
@@ -17,10 +17,13 @@
|
|
|
17
17
|
# Removal markers carry no baseline pin, unlike the operations a feature edits:
|
|
18
18
|
# `openapi.remove-target-mismatch` already checks that exact slot, which is the same question a
|
|
19
19
|
# pin would answer.
|
|
20
|
+
#
|
|
21
|
+
# `info` restates the living contract's. No merge carries `info`, so a value that differs here
|
|
22
|
+
# would be lost at archive — `openapi.info-not-merged` says so in the plan instead of letting it vanish.
|
|
20
23
|
openapi: 3.1.0
|
|
21
24
|
info:
|
|
22
25
|
title: order-service
|
|
23
|
-
version: "
|
|
26
|
+
version: "2.0"
|
|
24
27
|
paths:
|
|
25
28
|
/v1/orders:
|
|
26
29
|
post:
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
# API delta for FEAT-088 — payment-service gains the refund operation.
|
|
2
2
|
#
|
|
3
|
-
# A feature contract
|
|
4
|
-
#
|
|
5
|
-
#
|
|
6
|
-
#
|
|
7
|
-
#
|
|
8
|
-
#
|
|
3
|
+
# A feature contract holds only what the feature adds, changes or removes. The merge walks only
|
|
4
|
+
# the paths and methods this document spells, so authorizePayment and capturePayment, which it
|
|
5
|
+
# leaves out, stay exactly as the living contract has them. refundPayment is new, so it carries
|
|
6
|
+
# no `x-loam-based-on` pin: a pin is the digest of the LIVING operation, and there is none. Only
|
|
7
|
+
# an operation the living contract already holds needs one (`loam rebase` writes it), and every
|
|
8
|
+
# such operation quoted without being changed is one more pin and a collision waiting for a
|
|
9
|
+
# parallel feature to edit or remove it.
|
|
9
10
|
openapi: 3.1.0
|
|
10
11
|
info:
|
|
11
12
|
title: payment-service
|
|
@@ -51,10 +52,12 @@ components:
|
|
|
51
52
|
refundedAt:
|
|
52
53
|
type: string
|
|
53
54
|
format: date-time
|
|
54
|
-
# Quoted from the living contract unchanged
|
|
55
|
-
#
|
|
56
|
-
#
|
|
57
|
-
#
|
|
55
|
+
# Quoted from the living contract unchanged, and it did not need to be: the `$ref` to it
|
|
56
|
+
# above resolves into the living document, which already holds Problem. The merge leaves a
|
|
57
|
+
# component the living document holds IDENTICALLY alone; one it holds DIFFERENTLY is
|
|
58
|
+
# overwritten wholesale and reported as `openapi.component-modified`. Components carried no
|
|
59
|
+
# baseline pin when this feature archived; a quote like this one now needs one in the root
|
|
60
|
+
# `x-loam-baselines` record `loam rebase` writes — one more reason to leave it out.
|
|
58
61
|
Problem:
|
|
59
62
|
type: object
|
|
60
63
|
required: [type, title, status]
|
|
@@ -1,27 +1,24 @@
|
|
|
1
|
-
//
|
|
2
|
-
//
|
|
3
|
-
//
|
|
1
|
+
// checkout-web's own C4 — what is INSIDE the element the fleet map binds to
|
|
2
|
+
// services/checkout-web/. A UI is a first-class C4 system: it has containers, it
|
|
3
|
+
// has runtime dependencies, and its pages (ui/pages/*.page.yaml) hang off the
|
|
4
|
+
// operations the edges below name.
|
|
4
5
|
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
6
|
+
// An EXTENDING model: no `specification` block, no partner copies. The kinds and
|
|
7
|
+
// every element this file points at — `customer`, `marketplace.orderService`,
|
|
8
|
+
// `marketplace.paymentService` — are declared once in
|
|
9
|
+
// architecture/landscape.likec4, and the root `likec4.config.json` does not
|
|
10
|
+
// exclude `services/**`, so the map and every model are read as ONE LikeC4
|
|
11
|
+
// project. `extend` takes the fully-qualified id, because the element is nested
|
|
12
|
+
// in the `marketplace` group.
|
|
13
|
+
//
|
|
14
|
+
// Note what this file does NOT do: it does not declare `customer = person`. The
|
|
15
|
+
// actor is the map's, and the edge below simply points at it. That is the rule
|
|
16
|
+
// the shape turns on — an element declared here outside
|
|
17
|
+
// `marketplace.checkoutWeb` is `c4.element-unowned` — and it is also what stops
|
|
18
|
+
// two documents from holding two different descriptions of the same person.
|
|
19
|
+
// SCHEMA.md, "Two shapes of a service model", has the other shape.
|
|
15
20
|
model {
|
|
16
|
-
|
|
17
|
-
// the pages exist for this person, and the flows in ui/pages/ start at them.
|
|
18
|
-
// The landscape draws the same customer -> checkout-web edge at fleet scale;
|
|
19
|
-
// a person is exempt from the service/directory cross-check either way.
|
|
20
|
-
customer = person 'Customer'
|
|
21
|
-
|
|
22
|
-
checkoutWeb = softwareSystem 'checkout-web' {
|
|
23
|
-
description 'Customer-facing checkout UI'
|
|
24
|
-
|
|
21
|
+
extend marketplace.checkoutWeb {
|
|
25
22
|
spa = container 'spa' {
|
|
26
23
|
description 'Checkout SPA — cart, payment and order status pages'
|
|
27
24
|
technology 'React'
|
|
@@ -37,37 +34,21 @@ model {
|
|
|
37
34
|
technology 'Node.js'
|
|
38
35
|
}
|
|
39
36
|
|
|
40
|
-
customer -> spa 'Buys'
|
|
41
37
|
spa -> bff 'Calls the checkout BFF'
|
|
42
38
|
}
|
|
43
39
|
|
|
44
|
-
// The
|
|
45
|
-
//
|
|
46
|
-
//
|
|
47
|
-
//
|
|
48
|
-
|
|
49
|
-
// `c4.no-relationships` would be right to say a model that reaches nothing is
|
|
50
|
-
// almost never true.
|
|
51
|
-
orderService = softwareSystem 'order-service' {
|
|
52
|
-
description 'Owns the order lifecycle'
|
|
53
|
-
// Bind rather than rely on the title. A renamed box silently stops matching
|
|
54
|
-
// its directory everywhere the two are joined — in the landscape that costs
|
|
55
|
-
// `landscape.binding-unknown` (error) when the id is wrong, and here it is
|
|
56
|
-
// what `health.dependency-unmodelled` resolves a declared dependency
|
|
57
|
-
// through in the services that have a health.yaml. checkout-web has none:
|
|
58
|
-
// a UI is nobody's runtime dependency, so it declares no SLIs, no alerts
|
|
59
|
-
// and no dependency graph, and owes no arch.spec.md to cover them.
|
|
60
|
-
metadata {
|
|
61
|
-
service 'order-service'
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
paymentService = softwareSystem 'payment-service' {
|
|
65
|
-
description 'Owns payment authorization/capture'
|
|
66
|
-
metadata {
|
|
67
|
-
service 'payment-service'
|
|
68
|
-
}
|
|
69
|
-
}
|
|
40
|
+
// The person is the MAP's element and the hop into this UI is drawn from it.
|
|
41
|
+
// The landscape draws the coarser `customer -> marketplace.checkoutWeb` twin
|
|
42
|
+
// at fleet scale; this one says which container the click reaches. A person is
|
|
43
|
+
// exempt from the service/directory cross-check either way.
|
|
44
|
+
customer -> marketplace.checkoutWeb.spa 'Buys'
|
|
70
45
|
|
|
46
|
+
// The services this one actually calls, drawn with the edge the service really
|
|
47
|
+
// has — the landscape carries only the boundary crossing (checkout-web ->
|
|
48
|
+
// order-service), while the edges below say WHICH container makes the call.
|
|
49
|
+
// Without them this file would be two boxes and a hop, and `c4.no-relationships`
|
|
50
|
+
// would be right to say a model that reaches nothing is almost never true.
|
|
51
|
+
//
|
|
71
52
|
// `metadata { op }` is the C4 half of the operation join: the exact
|
|
72
53
|
// operationId order-service's openapi.yaml declares. What `loam validate`
|
|
73
54
|
// grades is the LANDSCAPE's twin of each edge below — `spine.op-undefined`
|
|
@@ -77,12 +58,12 @@ model {
|
|
|
77
58
|
// nothing would catch it if they did. Two calls to one service are two edges,
|
|
78
59
|
// not one edge with a list — a view has to be able to show that the status
|
|
79
60
|
// page and the checkout page stand on different operations.
|
|
80
|
-
checkoutWeb.bff -> orderService 'Calls createOrder' {
|
|
61
|
+
marketplace.checkoutWeb.bff -> marketplace.orderService 'Calls createOrder' {
|
|
81
62
|
metadata {
|
|
82
63
|
op 'createOrder'
|
|
83
64
|
}
|
|
84
65
|
}
|
|
85
|
-
checkoutWeb.bff -> orderService 'Calls getOrder' {
|
|
66
|
+
marketplace.checkoutWeb.bff -> marketplace.orderService 'Calls getOrder' {
|
|
86
67
|
metadata {
|
|
87
68
|
op 'getOrder'
|
|
88
69
|
}
|
|
@@ -94,16 +75,18 @@ model {
|
|
|
94
75
|
// for an edge that SAYS it calls something and names no operation, so nothing
|
|
95
76
|
// can check the call still exists. Free here and one warning there, which is
|
|
96
77
|
// the asymmetry worth knowing: the fleet map is what the spine reads.
|
|
97
|
-
checkoutWeb.spa -> paymentService 'Calls the payment API'
|
|
78
|
+
marketplace.checkoutWeb.spa -> marketplace.paymentService 'Calls the payment API'
|
|
98
79
|
}
|
|
99
80
|
|
|
100
81
|
// Views are the LikeC4 renderer's, never loam's — no check reads this block.
|
|
101
|
-
// Scoped to the
|
|
102
|
-
// rather than redrawing the fleet, which architecture/landscape.likec4
|
|
82
|
+
// Scoped to the service's element so the page answers "what does the checkout UI
|
|
83
|
+
// stand on" rather than redrawing the fleet, which architecture/landscape.likec4
|
|
84
|
+
// already does. This file is part of the root project: `npx likec4 start` at the
|
|
85
|
+
// docs root draws it, with no per-service project file to write.
|
|
103
86
|
views {
|
|
104
|
-
view checkout_web of checkoutWeb {
|
|
87
|
+
view checkout_web of marketplace.checkoutWeb {
|
|
105
88
|
title 'checkout-web — containers and the services they call'
|
|
106
89
|
include *
|
|
107
|
-
include orderService, paymentService
|
|
90
|
+
include marketplace.orderService, marketplace.paymentService
|
|
108
91
|
}
|
|
109
92
|
}
|