@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
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The LIVING flows whose `#req-` tag claims a requirement this feature changes:
|
|
3
|
+
* `usecase.requirement-modified` for one it rewrites, and
|
|
4
|
+
* `usecase.requirement-unresolved` for one it takes away.
|
|
5
|
+
*
|
|
6
|
+
* THE HOLE. A `#req-` tag joins a flow to one named promise, and the join is by
|
|
7
|
+
* id. A MODIFIED requirement keeps its id and replaces its whole text, so after
|
|
8
|
+
* the archive the tag still resolves, every grade of the flow stays green — and
|
|
9
|
+
* the flow can be drawing exactly the behaviour the new wording forbids: an
|
|
10
|
+
* event path the requirement now says is gone, a hop through a service it no
|
|
11
|
+
* longer names. Nothing in loam reads a flow's MEANING, so nothing can say
|
|
12
|
+
* whether the drawing still keeps the promise. What loam can say is that the
|
|
13
|
+
* promise moved under it, and it said nothing.
|
|
14
|
+
*
|
|
15
|
+
* A WARNING, AND IT NEVER GATES. Rewording a promise a flow keeps is ordinary;
|
|
16
|
+
* the flow may well still keep it. This names each flow and the requirement, so
|
|
17
|
+
* the author reads one against the other while the feature is still open — and
|
|
18
|
+
* redraws the flow in the same change where it no longer holds.
|
|
19
|
+
*
|
|
20
|
+
* A REMOVAL IS THE FLEET'S OWN ERROR, ONE ARCHIVE EARLY. The merge deletes the
|
|
21
|
+
* promise and leaves the tag, so the very next `validate --all` reports the flow
|
|
22
|
+
* `usecase.requirement-unresolved` — while the feature gate had said nothing and
|
|
23
|
+
* the archive had exited 0 (the real-fleet review, 2026-10-21). That grade holds
|
|
24
|
+
* no judgement about the drawing: the tag resolves to nothing, whatever the flow
|
|
25
|
+
* shows. So it is raised here under the SAME code, at the same severity, with
|
|
26
|
+
* the VIEW as its subject as at fleet altitude — the fleet's grade predicted,
|
|
27
|
+
* not a second opinion beside it — and as an error it gates the archive.
|
|
28
|
+
* `--approve` may walk past it, for `capability.remove-requirement-realized`'s
|
|
29
|
+
* reason one carrier over: retiring a promise something still claims is the
|
|
30
|
+
* author's call about the feature, loam reads the flow perfectly well (this is
|
|
31
|
+
* no `usecase.flow-invalid` blindness), and the living docs then carry exactly
|
|
32
|
+
* the error this named.
|
|
33
|
+
*
|
|
34
|
+
* GRADED AGAINST WHAT THE MERGE LEAVES, not against the REMOVED list. Each
|
|
35
|
+
* document's after-side is the merge's own fold (`applyRequirementDelta`), so a
|
|
36
|
+
* removal the same delta re-spells under an id that flattens to the same tag
|
|
37
|
+
* leaves the tag resolving and earns nothing, exactly as the fleet will grade
|
|
38
|
+
* it. The same verdict is asked of a MODIFIED: it keeps its id, but
|
|
39
|
+
* an id this feature adds beside it may flatten to the same tag, and then the
|
|
40
|
+
* merge breaks the tag too — the error, not the warning, whose "the tag will
|
|
41
|
+
* still resolve" would be false. And only a claim that resolves TODAY is asked
|
|
42
|
+
* about: one that is already broken is `validate --all`'s finding now, and
|
|
43
|
+
* reporting it again here would be one mistake counted twice.
|
|
44
|
+
*
|
|
45
|
+
* TWO ALTITUDES, TWO SCOPES — the ones `validate --all` resolves the tag with.
|
|
46
|
+
* A flow in `architecture/` keeps a BUSINESS promise: its `#req-` tag is scoped
|
|
47
|
+
* by its `#cap-` tag to a capability document (`core/capabilities/usecase-join.ts`),
|
|
48
|
+
* so it is asked about the capability requirements this feature changes. A
|
|
49
|
+
* flow beside a service's model keeps that SERVICE's promise: its `#req-` tag is
|
|
50
|
+
* scoped by the directory to the ids of that service's spec.md and arch.spec.md
|
|
51
|
+
* (`commands/validate/service/usecases/tags.ts`), so it is asked about the
|
|
52
|
+
* service requirements this feature changes there — and only the services the
|
|
53
|
+
* feature's `specs/` touch can hold one. BOTH documents are that scope, so the
|
|
54
|
+
* one a touched service carries no delta for is read as it stands: without it
|
|
55
|
+
* an id the other document also declares would read as gone after the merge,
|
|
56
|
+
* and gate an archive the fleet then grades green. The feature's own
|
|
57
|
+
* `usecases/` are not living and are graded against the new text already
|
|
58
|
+
* (`../grade/feature.ts`).
|
|
59
|
+
*
|
|
60
|
+
* WHAT IT COSTS. Nothing, for a feature that modifies and removes no
|
|
61
|
+
* requirement — which is nearly every feature, and the caller does not call
|
|
62
|
+
* this then. For one that does, a byte scan for the tag's own spelling
|
|
63
|
+
* (`req-<slug>`) over the documents that could declare it, the living document
|
|
64
|
+
* of a touched service's other axis, and a LikeC4 load only for a project one
|
|
65
|
+
* of them is in: a tag name is one token, so a document without its characters
|
|
66
|
+
* cannot carry it. A project that does not parse is skipped, not reported —
|
|
67
|
+
* `validate --all` owns that answer (`usecase.flow-invalid`, `landscape.invalid`),
|
|
68
|
+
* and a finding about one requirement must not become a second report of a
|
|
69
|
+
* broken map.
|
|
70
|
+
*/
|
|
71
|
+
import { existsSync } from "node:fs";
|
|
72
|
+
import { readFile } from "node:fs/promises";
|
|
73
|
+
import { join, relative } from "node:path";
|
|
74
|
+
import { REQ_TAG_PREFIX, resolveCapabilityTags, resolveRequirementTags, tagSlug, } from "../../capabilities/usecase-join.js";
|
|
75
|
+
import { gradableCapabilityIds } from "../../capabilities/findings.js";
|
|
76
|
+
import { architectureDocuments } from "../../c4/project/documents.js";
|
|
77
|
+
import { architectureProjectDocuments } from "../../c4/project/architecture.js";
|
|
78
|
+
import { applyRequirementDelta, replacementsOf } from "../../document/apply.js";
|
|
79
|
+
import { SPEC_AXES } from "../../repo/paths.js";
|
|
80
|
+
import { compareIds } from "../../repo/entries.js";
|
|
81
|
+
import { useCasesIn } from "../fleet.js";
|
|
82
|
+
import { viewFile } from "../place.js";
|
|
83
|
+
import { readServiceFlows } from "../service/flows.js";
|
|
84
|
+
export async function changedPromiseFlowIssues(req) {
|
|
85
|
+
const tables = {
|
|
86
|
+
capability: tableOf(req.capabilities),
|
|
87
|
+
service: tableOf(await withUntouchedAxes(req)),
|
|
88
|
+
};
|
|
89
|
+
const flows = [
|
|
90
|
+
...(await fleetFlows(req, changedIds(tables.capability))),
|
|
91
|
+
...(await serviceFlows(req, changedIds(tables.service))),
|
|
92
|
+
];
|
|
93
|
+
const issues = [];
|
|
94
|
+
for (const flow of flows.sort((a, b) => compareIds(a.file, b.file) || compareIds(a.view.id, b.view.id))) {
|
|
95
|
+
const table = tables[flow.altitude];
|
|
96
|
+
const after = new Map(resolveRequirementTags(flow.view.tags, flow.scope, (id) => table.merged.get(id)).map((c) => [c.tag, c]));
|
|
97
|
+
for (const claim of resolveRequirementTags(flow.view.tags, flow.scope, (id) => table.living.get(id))) {
|
|
98
|
+
if (claim.kind !== "resolved")
|
|
99
|
+
continue;
|
|
100
|
+
const change = changeOf(table, claim);
|
|
101
|
+
if (change === null)
|
|
102
|
+
continue;
|
|
103
|
+
// The merge's verdict first, for either change: a MODIFIED keeps its id,
|
|
104
|
+
// but an id this feature adds beside it can flatten to the same tag, and
|
|
105
|
+
// then the warning's "the tag will still resolve" would be false.
|
|
106
|
+
const later = after.get(claim.tag);
|
|
107
|
+
if (later !== undefined && later.kind !== "resolved")
|
|
108
|
+
issues.push(brokenIssue(flow, claim, { change, later }));
|
|
109
|
+
else if (change === "MODIFIES")
|
|
110
|
+
issues.push(modifiedIssue(flow, claim));
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return issues;
|
|
114
|
+
}
|
|
115
|
+
function changeOf(table, claim) {
|
|
116
|
+
if (table.modified.get(claim.capability)?.has(claim.id) === true)
|
|
117
|
+
return "MODIFIES";
|
|
118
|
+
return table.removed.get(claim.capability)?.has(claim.id) === true ? "REMOVES" : null;
|
|
119
|
+
}
|
|
120
|
+
function whose(flow, claim) {
|
|
121
|
+
return flow.altitude === "capability" ? `${claim.capability}#${claim.id}` : `${claim.capability}'s requirement ${claim.id}`;
|
|
122
|
+
}
|
|
123
|
+
function modifiedIssue(flow, claim) {
|
|
124
|
+
return {
|
|
125
|
+
severity: "warn",
|
|
126
|
+
code: "usecase.requirement-modified",
|
|
127
|
+
subject: claim.capability,
|
|
128
|
+
message: `${flow.file}: flow '${flow.view.id}' is tagged #${claim.tag} — it claims ${whose(flow, claim)}, which this feature MODIFIES. ` +
|
|
129
|
+
`The tag will still resolve after the archive and nothing grades what the flow draws against the new ` +
|
|
130
|
+
`wording: read the flow against the replacement, and redraw it in this change if it no longer keeps the promise.`,
|
|
131
|
+
locations: [{ path: flow.file, role: "primary" }],
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* The tag the merge breaks. Two ways, and each has its own fix: a removal
|
|
136
|
+
* leaves nothing the tag names, and an id this feature adds can flatten to the
|
|
137
|
+
* same tag as the one it claims — the only way a MODIFIED, which keeps its id,
|
|
138
|
+
* can break it at all.
|
|
139
|
+
*/
|
|
140
|
+
function brokenIssue(flow, claim, broken) {
|
|
141
|
+
const { change, later } = broken;
|
|
142
|
+
const [why, fix] = later.kind === "many"
|
|
143
|
+
? [
|
|
144
|
+
`${later.ids.length} requirements will flatten to '${later.slug}' (${later.ids.join(", ")}), so nothing in the tag can say which promise the flow keeps`,
|
|
145
|
+
"rename one of the colliding ids in this change",
|
|
146
|
+
]
|
|
147
|
+
: [
|
|
148
|
+
"nothing it names is left",
|
|
149
|
+
"drop the tag (or point it at the promise that replaces this one) in this change, or MODIFY the requirement instead of removing it",
|
|
150
|
+
];
|
|
151
|
+
return {
|
|
152
|
+
severity: "error",
|
|
153
|
+
code: "usecase.requirement-unresolved",
|
|
154
|
+
// The VIEW, as `validate --all` names it once the archive lands — so the
|
|
155
|
+
// prediction and the outcome are about one thing a reader opens.
|
|
156
|
+
subject: flow.view.id,
|
|
157
|
+
message: `${flow.file}: flow '${flow.view.id}' is tagged #${claim.tag} — it claims ${whose(flow, claim)}, which this feature ${change}. ` +
|
|
158
|
+
`After the archive the tag no longer resolves — ${why} — and \`loam validate --all\` reports this flow with this ` +
|
|
159
|
+
`same error: ${fix}.`,
|
|
160
|
+
locations: [{ path: flow.file, role: "primary" }],
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Each document's table rows. The modified and removed ids are named by the id
|
|
165
|
+
* the LIVING document gives them — selected by `replacementsOf`, the merge's own
|
|
166
|
+
* walk, so a MODIFIED or REMOVED written by heading alone still names the id a
|
|
167
|
+
* tag carries — and the after-side is that same merge's result. A document the
|
|
168
|
+
* merge would refuse keeps its living ids on both sides and changes nothing:
|
|
169
|
+
* the delta gate reports it, and nothing here has a true thing to say about a
|
|
170
|
+
* merge that cannot happen.
|
|
171
|
+
*
|
|
172
|
+
* TODAY'S side leaves out a living requirement sitting under a REMOVED heading,
|
|
173
|
+
* as both fleet indexes do (`capabilityRequirementIndex`, `requirementIdsOf`):
|
|
174
|
+
* a tag resolving only through one is already the fleet's error. The fold
|
|
175
|
+
* still runs on the whole living list, because that is the archive's input.
|
|
176
|
+
*/
|
|
177
|
+
function tableOf(docs) {
|
|
178
|
+
const table = { living: new Map(), merged: new Map(), modified: new Map(), removed: new Map() };
|
|
179
|
+
for (const doc of docs) {
|
|
180
|
+
const living = doc.living.filter((r) => r.kind !== "REMOVED");
|
|
181
|
+
let fold;
|
|
182
|
+
try {
|
|
183
|
+
fold = { replaced: replacementsOf([...doc.living], [...doc.reqs]), merged: applyRequirementDelta([...doc.living], [...doc.reqs]) };
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
fold = { replaced: [], merged: living };
|
|
187
|
+
}
|
|
188
|
+
idsInto(table.living, doc.id, living);
|
|
189
|
+
idsInto(table.merged, doc.id, fold.merged);
|
|
190
|
+
for (const r of fold.replaced) {
|
|
191
|
+
if (r.living.id === undefined || (r.kind !== "MODIFIED" && r.kind !== "REMOVED"))
|
|
192
|
+
continue;
|
|
193
|
+
const into = r.kind === "MODIFIED" ? table.modified : table.removed;
|
|
194
|
+
into.set(doc.id, (into.get(doc.id) ?? new Set()).add(r.living.id));
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return table;
|
|
198
|
+
}
|
|
199
|
+
/** A document's ids, unioned into its row — created even when empty, which is the `empty` arm's answer rather than `undocumented`'s. */
|
|
200
|
+
function idsInto(rows, id, reqs) {
|
|
201
|
+
const ids = rows.get(id) ?? new Set();
|
|
202
|
+
for (const r of reqs)
|
|
203
|
+
if (r.id !== undefined)
|
|
204
|
+
ids.add(r.id);
|
|
205
|
+
rows.set(id, ids);
|
|
206
|
+
}
|
|
207
|
+
/** The ids each document's delta modifies or removes — what a flow has to mention to be asked about at all. */
|
|
208
|
+
function changedIds(table) {
|
|
209
|
+
const out = new Map();
|
|
210
|
+
for (const rows of [table.modified, table.removed]) {
|
|
211
|
+
for (const [id, ids] of rows)
|
|
212
|
+
out.set(id, new Set([...(out.get(id) ?? []), ...ids]));
|
|
213
|
+
}
|
|
214
|
+
return out;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* The service pairs, plus — for each service whose delta modifies or removes
|
|
218
|
+
* something — every document of it the feature carries no delta for, as it
|
|
219
|
+
* stands (`reqs: []`, so it changes nothing and only widens both sides).
|
|
220
|
+
* `requirementIdsOf` (`commands/validate/service/usecases/usecases.ts`) reads
|
|
221
|
+
* both documents for a service-local tag, skipping a requirement under a
|
|
222
|
+
* REMOVED heading; so must this, or a tag the untouched document keeps
|
|
223
|
+
* resolving reads as broken — and one only a REMOVED entry there answers reads
|
|
224
|
+
* as kept, though the archive leaves that document as it is.
|
|
225
|
+
*/
|
|
226
|
+
async function withUntouchedAxes(req) {
|
|
227
|
+
const out = [...req.services];
|
|
228
|
+
const asked = new Set();
|
|
229
|
+
// Sequential, and it costs nothing worth racing: a feature names a handful of
|
|
230
|
+
// services, each read is one memoised document, and most services here
|
|
231
|
+
// already have both axes in the feature or no second document at all.
|
|
232
|
+
for (const pair of req.services) {
|
|
233
|
+
const own = req.services.filter((p) => p.id === pair.id);
|
|
234
|
+
if (asked.has(pair.id) || !own.some((p) => p.reqs.some((r) => r.kind === "MODIFIED" || r.kind === "REMOVED")))
|
|
235
|
+
continue;
|
|
236
|
+
asked.add(pair.id);
|
|
237
|
+
const paths = await pair.paths();
|
|
238
|
+
for (const axis of SPEC_AXES) {
|
|
239
|
+
if (own.some((p) => p.axis === axis.key) || !existsSync(paths[axis.key]))
|
|
240
|
+
continue;
|
|
241
|
+
const living = (await req.readRequirements(paths[axis.key])).filter((r) => r.kind !== "REMOVED");
|
|
242
|
+
out.push({ id: pair.id, reqs: [], living });
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
return out;
|
|
246
|
+
}
|
|
247
|
+
/** The tag spellings that could claim one of these ids. */
|
|
248
|
+
function needlesFor(changed) {
|
|
249
|
+
return [...new Set([...changed.values()].flatMap((ids) => [...ids].map((id) => `${REQ_TAG_PREFIX}${tagSlug(id)}`)))];
|
|
250
|
+
}
|
|
251
|
+
/** Does any of these documents contain one of the tag spellings at all? Unreadable fails closed, as `../fleet.ts`'s gate does. */
|
|
252
|
+
async function mentions(paths, needles) {
|
|
253
|
+
for (const path of paths) {
|
|
254
|
+
try {
|
|
255
|
+
const text = (await readFile(path)).toString("latin1");
|
|
256
|
+
if (needles.some((needle) => text.includes(needle)))
|
|
257
|
+
return true;
|
|
258
|
+
}
|
|
259
|
+
catch {
|
|
260
|
+
return true;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
return false;
|
|
264
|
+
}
|
|
265
|
+
async function fleetFlows(req, changed) {
|
|
266
|
+
// The vocabulary ladder (`core/capabilities/findings.ts`): with nothing
|
|
267
|
+
// declared no `#cap-` tag resolves, so no fleet flow can be said to claim anything.
|
|
268
|
+
const declared = gradableCapabilityIds(req.vocabulary);
|
|
269
|
+
if (changed.size === 0 || declared === null)
|
|
270
|
+
return [];
|
|
271
|
+
if (!(await mentions(await architectureProjectDocuments(req.docsDir), needlesFor(changed))))
|
|
272
|
+
return [];
|
|
273
|
+
const read = useCasesIn(await req.architecture(), req.known);
|
|
274
|
+
if (read.kind !== "read")
|
|
275
|
+
return [];
|
|
276
|
+
return read.views.map((view) => ({
|
|
277
|
+
view,
|
|
278
|
+
file: viewFile(view),
|
|
279
|
+
scope: resolveCapabilityTags(view.tags, declared).flatMap((c) => (c.kind === "resolved" ? [c.id] : [])),
|
|
280
|
+
altitude: "capability",
|
|
281
|
+
}));
|
|
282
|
+
}
|
|
283
|
+
async function serviceFlows(req, changed) {
|
|
284
|
+
const out = [];
|
|
285
|
+
for (const [service, ids] of changed) {
|
|
286
|
+
// Sequential on purpose, for `../fleet.ts`'s gate's reason: nearly every
|
|
287
|
+
// service answers from one readdir and a byte scan, and the rare one that
|
|
288
|
+
// opens a workspace should not be raced by the ones that do not need one.
|
|
289
|
+
const pair = req.services.find((doc) => doc.id === service);
|
|
290
|
+
if (pair === undefined)
|
|
291
|
+
continue;
|
|
292
|
+
const paths = await pair.paths();
|
|
293
|
+
if (!(await mentions(await architectureDocuments(paths.dir), needlesFor(new Map([[service, ids]])))))
|
|
294
|
+
continue;
|
|
295
|
+
const model = await req.serviceModel(paths);
|
|
296
|
+
if (model.mapUnreadable || model.doc.errors.length > 0)
|
|
297
|
+
continue;
|
|
298
|
+
const flows = await readServiceFlows({
|
|
299
|
+
paths,
|
|
300
|
+
model: model.doc,
|
|
301
|
+
known: req.known,
|
|
302
|
+
...(model.shape === "extending" && model.project !== null
|
|
303
|
+
? { extending: { docsDir: req.docsDir, project: model.project } }
|
|
304
|
+
: {}),
|
|
305
|
+
});
|
|
306
|
+
if (flows.kind !== "read")
|
|
307
|
+
continue;
|
|
308
|
+
for (const view of flows.views) {
|
|
309
|
+
const file = relative(req.docsDir, join(paths.dir, view.sourcePath ?? "model.likec4")).split(/[\\/]/).join("/");
|
|
310
|
+
out.push({ view, file, scope: [service], altitude: "service" });
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
return out;
|
|
314
|
+
}
|
|
315
|
+
//# sourceMappingURL=modified.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modified.js","sourceRoot":"","sources":["../../../../src/core/usecases/delta/modified.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The LIVING flows whose `#req-` tag claims a requirement this feature changes:\n * `usecase.requirement-modified` for one it rewrites, and\n * `usecase.requirement-unresolved` for one it takes away.\n *\n * THE HOLE. A `#req-` tag joins a flow to one named promise, and the join is by\n * id. A MODIFIED requirement keeps its id and replaces its whole text, so after\n * the archive the tag still resolves, every grade of the flow stays green — and\n * the flow can be drawing exactly the behaviour the new wording forbids: an\n * event path the requirement now says is gone, a hop through a service it no\n * longer names. Nothing in loam reads a flow's MEANING, so nothing can say\n * whether the drawing still keeps the promise. What loam can say is that the\n * promise moved under it, and it said nothing.\n *\n * A WARNING, AND IT NEVER GATES. Rewording a promise a flow keeps is ordinary;\n * the flow may well still keep it. This names each flow and the requirement, so\n * the author reads one against the other while the feature is still open — and\n * redraws the flow in the same change where it no longer holds.\n *\n * A REMOVAL IS THE FLEET'S OWN ERROR, ONE ARCHIVE EARLY. The merge deletes the\n * promise and leaves the tag, so the very next `validate --all` reports the flow\n * `usecase.requirement-unresolved` — while the feature gate had said nothing and\n * the archive had exited 0 (the real-fleet review, 2026-10-21). That grade holds\n * no judgement about the drawing: the tag resolves to nothing, whatever the flow\n * shows. So it is raised here under the SAME code, at the same severity, with\n * the VIEW as its subject as at fleet altitude — the fleet's grade predicted,\n * not a second opinion beside it — and as an error it gates the archive.\n * `--approve` may walk past it, for `capability.remove-requirement-realized`'s\n * reason one carrier over: retiring a promise something still claims is the\n * author's call about the feature, loam reads the flow perfectly well (this is\n * no `usecase.flow-invalid` blindness), and the living docs then carry exactly\n * the error this named.\n *\n * GRADED AGAINST WHAT THE MERGE LEAVES, not against the REMOVED list. Each\n * document's after-side is the merge's own fold (`applyRequirementDelta`), so a\n * removal the same delta re-spells under an id that flattens to the same tag\n * leaves the tag resolving and earns nothing, exactly as the fleet will grade\n * it. The same verdict is asked of a MODIFIED: it keeps its id, but\n * an id this feature adds beside it may flatten to the same tag, and then the\n * merge breaks the tag too — the error, not the warning, whose \"the tag will\n * still resolve\" would be false. And only a claim that resolves TODAY is asked\n * about: one that is already broken is `validate --all`'s finding now, and\n * reporting it again here would be one mistake counted twice.\n *\n * TWO ALTITUDES, TWO SCOPES — the ones `validate --all` resolves the tag with.\n * A flow in `architecture/` keeps a BUSINESS promise: its `#req-` tag is scoped\n * by its `#cap-` tag to a capability document (`core/capabilities/usecase-join.ts`),\n * so it is asked about the capability requirements this feature changes. A\n * flow beside a service's model keeps that SERVICE's promise: its `#req-` tag is\n * scoped by the directory to the ids of that service's spec.md and arch.spec.md\n * (`commands/validate/service/usecases/tags.ts`), so it is asked about the\n * service requirements this feature changes there — and only the services the\n * feature's `specs/` touch can hold one. BOTH documents are that scope, so the\n * one a touched service carries no delta for is read as it stands: without it\n * an id the other document also declares would read as gone after the merge,\n * and gate an archive the fleet then grades green. The feature's own\n * `usecases/` are not living and are graded against the new text already\n * (`../grade/feature.ts`).\n *\n * WHAT IT COSTS. Nothing, for a feature that modifies and removes no\n * requirement — which is nearly every feature, and the caller does not call\n * this then. For one that does, a byte scan for the tag's own spelling\n * (`req-<slug>`) over the documents that could declare it, the living document\n * of a touched service's other axis, and a LikeC4 load only for a project one\n * of them is in: a tag name is one token, so a document without its characters\n * cannot carry it. A project that does not parse is skipped, not reported —\n * `validate --all` owns that answer (`usecase.flow-invalid`, `landscape.invalid`),\n * and a finding about one requirement must not become a second report of a\n * broken map.\n */\nimport { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { join, relative } from \"node:path\";\nimport {\n REQ_TAG_PREFIX,\n resolveCapabilityTags,\n resolveRequirementTags,\n tagSlug,\n type RequirementClaim,\n} from \"../../capabilities/usecase-join.js\";\nimport { gradableCapabilityIds } from \"../../capabilities/findings.js\";\nimport type { CapabilityVocabulary } from \"../../capabilities/capabilities.js\";\nimport type { CapabilityDeltaDoc } from \"../../capabilities/delta/uncovered.js\";\nimport { architectureDocuments } from \"../../c4/project/documents.js\";\nimport { architectureProjectDocuments } from \"../../c4/project/architecture.js\";\nimport type { ParsedView } from \"../../c4/parsed/dynamic-views.js\";\nimport type { LoadedDoc } from \"../../c4/likec4.js\";\nimport type { ServiceModel } from \"../../c4/service-model/load.js\";\nimport { applyRequirementDelta, replacementsOf, type Replacement } from \"../../document/apply.js\";\nimport type { Requirement } from \"../../document/spec.js\";\nimport type { DocsDir } from \"../../kernel/ids/dirs.js\";\nimport { SPEC_AXES, type ServicePaths, type SpecAxis } from \"../../repo/paths.js\";\nimport { compareIds } from \"../../repo/entries.js\";\nimport type { Issue } from \"../../vocabulary/issue.js\";\nimport { useCasesIn } from \"../fleet.js\";\nimport { viewFile } from \"../place.js\";\nimport { readServiceFlows } from \"../service/flows.js\";\n\n/** One delta document beside the living one it merges into — a capability's, or one spec axis of a service. */\nexport interface DeltaPair {\n /** The capability id, or the service id. */\n id: string;\n reqs: readonly Requirement[];\n living: readonly Requirement[];\n}\n\n/** One spec axis of a service the feature touches, and where that service lives — asked only for one whose delta changes something. */\nexport interface ServiceDeltaPair extends DeltaPair {\n /** Which of the service's two documents this is: the other is read as it stands when the feature carries no delta for it. */\n axis: SpecAxis[\"key\"];\n paths: () => Promise<ServicePaths>;\n}\n\nexport interface ChangedPromiseRequest {\n docsDir: DocsDir;\n /** The feature's capability deltas — what an `architecture/` flow's tag is asked about. */\n capabilities: readonly CapabilityDeltaDoc[];\n /** The feature's service deltas, one entry per spec axis — what a service's own flow is asked about. */\n services: readonly ServiceDeltaPair[];\n /** The capability vocabulary a `#cap-` tag resolves against. */\n vocabulary: CapabilityVocabulary;\n /** The enumerated fleet, for the element→service resolver's reason (`../fleet.ts`). */\n known: ReadonlySet<string>;\n /**\n * A service's model, read the way its shape demands. Injected for\n * `./overlay.ts`'s reason: a memoised read does not justify an edge from\n * `core/usecases/` to `fleet-context`.\n */\n serviceModel: (paths: ServicePaths) => Promise<ServiceModel>;\n /**\n * The `architecture/` project, as the invocation already holds it — the\n * same injection, for the same reason: `validate --all` and `status` run this\n * walk once per active feature, and a fresh load per feature is a LikeC4\n * workspace each.\n */\n architecture: () => Promise<LoadedDoc>;\n /** A living requirements document, parsed — a touched service's axis the feature carries no delta for. Injected for the same reason again. */\n readRequirements: (path: string) => Promise<Requirement[]>;\n}\n\n/** One living flow, located, and the scope its `#req-` tag resolves in. */\ninterface LivingFlow {\n view: ParsedView;\n /** The repo-relative file a reader opens. */\n file: string;\n /** The capability ids its own `#cap-` tags resolve to, or — beside a model — its service alone. */\n scope: string[];\n /** Which of the two scopes `scope` is in: a capability id and a service id may be spelled alike. */\n altitude: Altitude;\n}\n\ntype Altitude = \"capability\" | \"service\";\n\ntype Resolved = Extract<RequirementClaim, { kind: \"resolved\" }>;\n\n/**\n * Per document id — a capability, or a service's two axes together, the one\n * set its directory-scoped tag is read against — the ids a tag resolves\n * against today and after the merge, and which living ids this feature\n * rewrites or retires.\n */\ninterface Table {\n living: Map<string, Set<string>>;\n merged: Map<string, Set<string>>;\n modified: Map<string, Set<string>>;\n removed: Map<string, Set<string>>;\n}\n\nexport async function changedPromiseFlowIssues(req: ChangedPromiseRequest): Promise<Issue[]> {\n const tables: Record<Altitude, Table> = {\n capability: tableOf(req.capabilities),\n service: tableOf(await withUntouchedAxes(req)),\n };\n const flows = [\n ...(await fleetFlows(req, changedIds(tables.capability))),\n ...(await serviceFlows(req, changedIds(tables.service))),\n ];\n const issues: Issue[] = [];\n for (const flow of flows.sort((a, b) => compareIds(a.file, b.file) || compareIds(a.view.id, b.view.id))) {\n const table = tables[flow.altitude];\n const after = new Map(resolveRequirementTags(flow.view.tags, flow.scope, (id) => table.merged.get(id)).map((c) => [c.tag, c]));\n for (const claim of resolveRequirementTags(flow.view.tags, flow.scope, (id) => table.living.get(id))) {\n if (claim.kind !== \"resolved\") continue;\n const change = changeOf(table, claim);\n if (change === null) continue;\n // The merge's verdict first, for either change: a MODIFIED keeps its id,\n // but an id this feature adds beside it can flatten to the same tag, and\n // then the warning's \"the tag will still resolve\" would be false.\n const later = after.get(claim.tag);\n if (later !== undefined && later.kind !== \"resolved\") issues.push(brokenIssue(flow, claim, { change, later }));\n else if (change === \"MODIFIES\") issues.push(modifiedIssue(flow, claim));\n }\n }\n return issues;\n}\n\nfunction changeOf(table: Table, claim: Resolved): \"MODIFIES\" | \"REMOVES\" | null {\n if (table.modified.get(claim.capability)?.has(claim.id) === true) return \"MODIFIES\";\n return table.removed.get(claim.capability)?.has(claim.id) === true ? \"REMOVES\" : null;\n}\n\nfunction whose(flow: LivingFlow, claim: Resolved): string {\n return flow.altitude === \"capability\" ? `${claim.capability}#${claim.id}` : `${claim.capability}'s requirement ${claim.id}`;\n}\n\nfunction modifiedIssue(flow: LivingFlow, claim: Resolved): Issue {\n return {\n severity: \"warn\",\n code: \"usecase.requirement-modified\",\n subject: claim.capability,\n message:\n `${flow.file}: flow '${flow.view.id}' is tagged #${claim.tag} — it claims ${whose(flow, claim)}, which this feature MODIFIES. ` +\n `The tag will still resolve after the archive and nothing grades what the flow draws against the new ` +\n `wording: read the flow against the replacement, and redraw it in this change if it no longer keeps the promise.`,\n locations: [{ path: flow.file, role: \"primary\" }],\n };\n}\n\n/**\n * The tag the merge breaks. Two ways, and each has its own fix: a removal\n * leaves nothing the tag names, and an id this feature adds can flatten to the\n * same tag as the one it claims — the only way a MODIFIED, which keeps its id,\n * can break it at all.\n */\nfunction brokenIssue(\n flow: LivingFlow,\n claim: Resolved,\n broken: { change: \"MODIFIES\" | \"REMOVES\"; later: Exclude<RequirementClaim, { kind: \"resolved\" }> },\n): Issue {\n const { change, later } = broken;\n const [why, fix] =\n later.kind === \"many\"\n ? [\n `${later.ids.length} requirements will flatten to '${later.slug}' (${later.ids.join(\", \")}), so nothing in the tag can say which promise the flow keeps`,\n \"rename one of the colliding ids in this change\",\n ]\n : [\n \"nothing it names is left\",\n \"drop the tag (or point it at the promise that replaces this one) in this change, or MODIFY the requirement instead of removing it\",\n ];\n return {\n severity: \"error\",\n code: \"usecase.requirement-unresolved\",\n // The VIEW, as `validate --all` names it once the archive lands — so the\n // prediction and the outcome are about one thing a reader opens.\n subject: flow.view.id,\n message:\n `${flow.file}: flow '${flow.view.id}' is tagged #${claim.tag} — it claims ${whose(flow, claim)}, which this feature ${change}. ` +\n `After the archive the tag no longer resolves — ${why} — and \\`loam validate --all\\` reports this flow with this ` +\n `same error: ${fix}.`,\n locations: [{ path: flow.file, role: \"primary\" }],\n };\n}\n\n/**\n * Each document's table rows. The modified and removed ids are named by the id\n * the LIVING document gives them — selected by `replacementsOf`, the merge's own\n * walk, so a MODIFIED or REMOVED written by heading alone still names the id a\n * tag carries — and the after-side is that same merge's result. A document the\n * merge would refuse keeps its living ids on both sides and changes nothing:\n * the delta gate reports it, and nothing here has a true thing to say about a\n * merge that cannot happen.\n *\n * TODAY'S side leaves out a living requirement sitting under a REMOVED heading,\n * as both fleet indexes do (`capabilityRequirementIndex`, `requirementIdsOf`):\n * a tag resolving only through one is already the fleet's error. The fold\n * still runs on the whole living list, because that is the archive's input.\n */\nfunction tableOf(docs: readonly DeltaPair[]): Table {\n const table: Table = { living: new Map(), merged: new Map(), modified: new Map(), removed: new Map() };\n for (const doc of docs) {\n const living = doc.living.filter((r) => r.kind !== \"REMOVED\");\n let fold: { replaced: Replacement[]; merged: readonly Requirement[] };\n try {\n fold = { replaced: replacementsOf([...doc.living], [...doc.reqs]), merged: applyRequirementDelta([...doc.living], [...doc.reqs]) };\n } catch {\n fold = { replaced: [], merged: living };\n }\n idsInto(table.living, doc.id, living);\n idsInto(table.merged, doc.id, fold.merged);\n for (const r of fold.replaced) {\n if (r.living.id === undefined || (r.kind !== \"MODIFIED\" && r.kind !== \"REMOVED\")) continue;\n const into = r.kind === \"MODIFIED\" ? table.modified : table.removed;\n into.set(doc.id, (into.get(doc.id) ?? new Set()).add(r.living.id));\n }\n }\n return table;\n}\n\n/** A document's ids, unioned into its row — created even when empty, which is the `empty` arm's answer rather than `undocumented`'s. */\nfunction idsInto(rows: Map<string, Set<string>>, id: string, reqs: readonly Requirement[]): void {\n const ids = rows.get(id) ?? new Set<string>();\n for (const r of reqs) if (r.id !== undefined) ids.add(r.id);\n rows.set(id, ids);\n}\n\n/** The ids each document's delta modifies or removes — what a flow has to mention to be asked about at all. */\nfunction changedIds(table: Table): Map<string, Set<string>> {\n const out = new Map<string, Set<string>>();\n for (const rows of [table.modified, table.removed]) {\n for (const [id, ids] of rows) out.set(id, new Set([...(out.get(id) ?? []), ...ids]));\n }\n return out;\n}\n\n/**\n * The service pairs, plus — for each service whose delta modifies or removes\n * something — every document of it the feature carries no delta for, as it\n * stands (`reqs: []`, so it changes nothing and only widens both sides).\n * `requirementIdsOf` (`commands/validate/service/usecases/usecases.ts`) reads\n * both documents for a service-local tag, skipping a requirement under a\n * REMOVED heading; so must this, or a tag the untouched document keeps\n * resolving reads as broken — and one only a REMOVED entry there answers reads\n * as kept, though the archive leaves that document as it is.\n */\nasync function withUntouchedAxes(req: ChangedPromiseRequest): Promise<DeltaPair[]> {\n const out: DeltaPair[] = [...req.services];\n const asked = new Set<string>();\n // Sequential, and it costs nothing worth racing: a feature names a handful of\n // services, each read is one memoised document, and most services here\n // already have both axes in the feature or no second document at all.\n for (const pair of req.services) {\n const own = req.services.filter((p) => p.id === pair.id);\n if (asked.has(pair.id) || !own.some((p) => p.reqs.some((r) => r.kind === \"MODIFIED\" || r.kind === \"REMOVED\"))) continue;\n asked.add(pair.id);\n const paths = await pair.paths();\n for (const axis of SPEC_AXES) {\n if (own.some((p) => p.axis === axis.key) || !existsSync(paths[axis.key])) continue;\n const living = (await req.readRequirements(paths[axis.key])).filter((r) => r.kind !== \"REMOVED\");\n out.push({ id: pair.id, reqs: [], living });\n }\n }\n return out;\n}\n\n/** The tag spellings that could claim one of these ids. */\nfunction needlesFor(changed: ReadonlyMap<string, ReadonlySet<string>>): string[] {\n return [...new Set([...changed.values()].flatMap((ids) => [...ids].map((id) => `${REQ_TAG_PREFIX}${tagSlug(id)}`)))];\n}\n\n/** Does any of these documents contain one of the tag spellings at all? Unreadable fails closed, as `../fleet.ts`'s gate does. */\nasync function mentions(paths: readonly string[], needles: readonly string[]): Promise<boolean> {\n for (const path of paths) {\n try {\n const text = (await readFile(path)).toString(\"latin1\");\n if (needles.some((needle) => text.includes(needle))) return true;\n } catch {\n return true;\n }\n }\n return false;\n}\n\nasync function fleetFlows(req: ChangedPromiseRequest, changed: ReadonlyMap<string, ReadonlySet<string>>): Promise<LivingFlow[]> {\n // The vocabulary ladder (`core/capabilities/findings.ts`): with nothing\n // declared no `#cap-` tag resolves, so no fleet flow can be said to claim anything.\n const declared = gradableCapabilityIds(req.vocabulary);\n if (changed.size === 0 || declared === null) return [];\n if (!(await mentions(await architectureProjectDocuments(req.docsDir), needlesFor(changed)))) return [];\n const read = useCasesIn(await req.architecture(), req.known);\n if (read.kind !== \"read\") return [];\n return read.views.map((view) => ({\n view,\n file: viewFile(view),\n scope: resolveCapabilityTags(view.tags, declared).flatMap((c) => (c.kind === \"resolved\" ? [c.id] : [])),\n altitude: \"capability\" as const,\n }));\n}\n\nasync function serviceFlows(req: ChangedPromiseRequest, changed: ReadonlyMap<string, ReadonlySet<string>>): Promise<LivingFlow[]> {\n const out: LivingFlow[] = [];\n for (const [service, ids] of changed) {\n // Sequential on purpose, for `../fleet.ts`'s gate's reason: nearly every\n // service answers from one readdir and a byte scan, and the rare one that\n // opens a workspace should not be raced by the ones that do not need one.\n const pair = req.services.find((doc) => doc.id === service);\n if (pair === undefined) continue;\n const paths = await pair.paths();\n if (!(await mentions(await architectureDocuments(paths.dir), needlesFor(new Map([[service, ids]]))))) continue;\n const model = await req.serviceModel(paths);\n if (model.mapUnreadable || model.doc.errors.length > 0) continue;\n const flows = await readServiceFlows({\n paths,\n model: model.doc,\n known: req.known,\n ...(model.shape === \"extending\" && model.project !== null\n ? { extending: { docsDir: req.docsDir, project: model.project } }\n : {}),\n });\n if (flows.kind !== \"read\") continue;\n for (const view of flows.views) {\n const file = relative(req.docsDir, join(paths.dir, view.sourcePath ?? \"model.likec4\")).split(/[\\\\/]/).join(\"/\");\n out.push({ view, file, scope: [service], altitude: \"service\" });\n }\n }\n return out;\n}\n"]}
|