@ybotok/loam 0.1.0-beta.2 → 0.2.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +2570 -61
- package/COMPARISON.md +80 -63
- package/CONTRIBUTING.md +84 -0
- package/MIGRATING-from-OpenSpec.md +213 -54
- package/QUICKSTART.md +125 -0
- package/README.md +450 -150
- package/ROADMAP.md +494 -0
- package/SCHEMA.md +2362 -245
- package/SECURITY.md +21 -3
- package/WORKFLOW.md +701 -0
- package/dist/cli.js +113 -19
- package/dist/cli.js.map +1 -1
- package/dist/commands/adopt/adopt.js +209 -0
- package/dist/commands/adopt/adopt.js.map +1 -0
- package/dist/commands/adopt/render.js +268 -0
- package/dist/commands/adopt/render.js.map +1 -0
- package/dist/commands/archive/archive.js +77 -0
- package/dist/commands/archive/archive.js.map +1 -0
- package/dist/commands/archive/plan/contracts/asyncapi.js +178 -0
- package/dist/commands/archive/plan/contracts/asyncapi.js.map +1 -0
- package/dist/commands/archive/plan/contracts/openapi.js +159 -0
- package/dist/commands/archive/plan/contracts/openapi.js.map +1 -0
- package/dist/commands/archive/plan/gate.js +317 -0
- package/dist/commands/archive/plan/gate.js.map +1 -0
- package/dist/commands/archive/plan/landscape.js +161 -0
- package/dist/commands/archive/plan/landscape.js.map +1 -0
- package/dist/commands/archive/plan/refusal.js +111 -0
- package/dist/commands/archive/plan/refusal.js.map +1 -0
- package/dist/commands/archive/plan/specs.js +237 -0
- package/dist/commands/archive/plan/specs.js.map +1 -0
- package/dist/commands/archive/plan/state.js +27 -0
- package/dist/commands/archive/plan/state.js.map +1 -0
- package/dist/commands/archive/run.js +251 -0
- package/dist/commands/archive/run.js.map +1 -0
- package/dist/commands/context/context.js +99 -0
- package/dist/commands/context/context.js.map +1 -0
- package/dist/commands/context/print.js +283 -0
- package/dist/commands/context/print.js.map +1 -0
- package/dist/commands/delta/delta.js +279 -0
- package/dist/commands/delta/delta.js.map +1 -0
- package/dist/commands/delta/print.js +205 -0
- package/dist/commands/delta/print.js.map +1 -0
- package/dist/commands/dependencies.js +9 -7
- package/dist/commands/dependencies.js.map +1 -1
- package/dist/commands/diff/diff.js +93 -0
- package/dist/commands/diff/diff.js.map +1 -0
- package/dist/commands/diff/print.js +38 -0
- package/dist/commands/diff/print.js.map +1 -0
- package/dist/commands/doctor.js +5 -4
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/explain/explain.js +151 -0
- package/dist/commands/explain/explain.js.map +1 -0
- package/dist/commands/explore.js +29 -24
- package/dist/commands/explore.js.map +1 -1
- package/dist/commands/gate/gate.js +115 -0
- package/dist/commands/gate/gate.js.map +1 -0
- package/dist/commands/gate/print.js +54 -0
- package/dist/commands/gate/print.js.map +1 -0
- package/dist/commands/gherkin/commit.js +146 -0
- package/dist/commands/gherkin/commit.js.map +1 -0
- package/dist/commands/gherkin/gherkin.js +246 -0
- package/dist/commands/gherkin/gherkin.js.map +1 -0
- package/dist/commands/gherkin/reconcile.js +149 -0
- package/dist/commands/gherkin/reconcile.js.map +1 -0
- package/dist/commands/gherkin/render.js +77 -0
- package/dist/commands/gherkin/render.js.map +1 -0
- package/dist/commands/init/example.js +204 -0
- package/dist/commands/init/example.js.map +1 -0
- package/dist/commands/init/first-hour.js +28 -0
- package/dist/commands/init/first-hour.js.map +1 -0
- package/dist/commands/{init.js → init/init.js} +146 -71
- package/dist/commands/init/init.js.map +1 -0
- package/dist/commands/init/mcp.js +131 -0
- package/dist/commands/init/mcp.js.map +1 -0
- package/dist/commands/init/options.js +78 -0
- package/dist/commands/init/options.js.map +1 -0
- package/dist/commands/instructions.js +82 -14
- package/dist/commands/instructions.js.map +1 -1
- package/dist/commands/list/campaign/campaign.js +65 -0
- package/dist/commands/list/campaign/campaign.js.map +1 -0
- package/dist/commands/list/campaign/owners.js +65 -0
- package/dist/commands/list/campaign/owners.js.map +1 -0
- package/dist/commands/list/json.js +157 -0
- package/dist/commands/list/json.js.map +1 -0
- package/dist/commands/list/list.js +343 -0
- package/dist/commands/list/list.js.map +1 -0
- package/dist/commands/list/print.js +301 -0
- package/dist/commands/list/print.js.map +1 -0
- package/dist/commands/list/review.js +120 -0
- package/dist/commands/list/review.js.map +1 -0
- package/dist/commands/list/views.js +105 -0
- package/dist/commands/list/views.js.map +1 -0
- package/dist/commands/mcp/dispatch.js +183 -0
- package/dist/commands/mcp/dispatch.js.map +1 -0
- package/dist/commands/mcp/mcp.js +34 -0
- package/dist/commands/mcp/mcp.js.map +1 -0
- package/dist/commands/mcp/serve.js +55 -0
- package/dist/commands/mcp/serve.js.map +1 -0
- package/dist/commands/migrate-openspec/materialize/active.js +170 -0
- package/dist/commands/migrate-openspec/materialize/active.js.map +1 -0
- package/dist/commands/migrate-openspec/materialize/feature.js +41 -0
- package/dist/commands/migrate-openspec/materialize/feature.js.map +1 -0
- package/dist/commands/migrate-openspec/materialize/living.js +62 -0
- package/dist/commands/migrate-openspec/materialize/living.js.map +1 -0
- package/dist/commands/migrate-openspec/materialize/stage.js +142 -0
- package/dist/commands/migrate-openspec/materialize/stage.js.map +1 -0
- package/dist/commands/migrate-openspec/materialize/target.js +219 -0
- package/dist/commands/migrate-openspec/materialize/target.js.map +1 -0
- package/dist/commands/migrate-openspec/migrate-openspec.js +142 -0
- package/dist/commands/migrate-openspec/migrate-openspec.js.map +1 -0
- package/dist/commands/migrate-openspec/openspec/decisions.js +91 -0
- package/dist/commands/migrate-openspec/openspec/decisions.js.map +1 -0
- package/dist/commands/migrate-openspec/openspec/error.js +19 -0
- package/dist/commands/migrate-openspec/openspec/error.js.map +1 -0
- package/dist/commands/migrate-openspec/openspec/mapping.js +170 -0
- package/dist/commands/migrate-openspec/openspec/mapping.js.map +1 -0
- package/dist/commands/migrate-openspec/openspec/paths.js +43 -0
- package/dist/commands/migrate-openspec/openspec/paths.js.map +1 -0
- package/dist/commands/migrate-openspec/openspec/read.js +49 -0
- package/dist/commands/migrate-openspec/openspec/read.js.map +1 -0
- package/dist/commands/migrate-openspec/print.js +89 -0
- package/dist/commands/migrate-openspec/print.js.map +1 -0
- package/dist/commands/new/commit.js +76 -0
- package/dist/commands/new/commit.js.map +1 -0
- package/dist/commands/new/new.js +283 -0
- package/dist/commands/new/new.js.map +1 -0
- package/dist/commands/new/templates.js +355 -0
- package/dist/commands/new/templates.js.map +1 -0
- package/dist/commands/open.js +203 -0
- package/dist/commands/open.js.map +1 -0
- package/dist/commands/policy/format.js +152 -0
- package/dist/commands/policy/format.js.map +1 -0
- package/dist/commands/{docs-repo-gate.js → policy/gate.js} +11 -11
- package/dist/commands/policy/gate.js.map +1 -0
- package/dist/commands/rebase/edit.js +106 -0
- package/dist/commands/rebase/edit.js.map +1 -0
- package/dist/commands/rebase/living.js +185 -0
- package/dist/commands/rebase/living.js.map +1 -0
- package/dist/commands/rebase/plan.js +245 -0
- package/dist/commands/rebase/plan.js.map +1 -0
- package/dist/commands/rebase/rebase.js +275 -0
- package/dist/commands/rebase/rebase.js.map +1 -0
- package/dist/commands/seed/commit.js +192 -0
- package/dist/commands/seed/commit.js.map +1 -0
- package/dist/commands/seed/plan.js +133 -0
- package/dist/commands/seed/plan.js.map +1 -0
- package/dist/commands/seed/seed.js +172 -0
- package/dist/commands/seed/seed.js.map +1 -0
- package/dist/commands/show/feature.js +178 -0
- package/dist/commands/show/feature.js.map +1 -0
- package/dist/commands/show/marks.js +24 -0
- package/dist/commands/show/marks.js.map +1 -0
- package/dist/commands/{show.js → show/service.js} +63 -152
- package/dist/commands/show/service.js.map +1 -0
- package/dist/commands/show/show.js +77 -0
- package/dist/commands/show/show.js.map +1 -0
- package/dist/commands/status/json.js +45 -0
- package/dist/commands/status/json.js.map +1 -0
- package/dist/commands/status/print.js +157 -0
- package/dist/commands/status/print.js.map +1 -0
- package/dist/commands/status/status.js +119 -0
- package/dist/commands/status/status.js.map +1 -0
- package/dist/commands/steps/steps.js +189 -0
- package/dist/commands/steps/steps.js.map +1 -0
- package/dist/commands/subsystem/edit.js +192 -0
- package/dist/commands/subsystem/edit.js.map +1 -0
- package/dist/commands/subsystem/move.js +265 -0
- package/dist/commands/subsystem/move.js.map +1 -0
- package/dist/commands/subsystem/query.js +115 -0
- package/dist/commands/subsystem/query.js.map +1 -0
- package/dist/commands/subsystem/subsystem.js +101 -0
- package/dist/commands/subsystem/subsystem.js.map +1 -0
- package/dist/commands/subsystem/sync.js +103 -0
- package/dist/commands/subsystem/sync.js.map +1 -0
- package/dist/commands/subsystem/txn/txn.js +94 -0
- package/dist/commands/subsystem/txn/txn.js.map +1 -0
- package/dist/commands/subsystem/txn/views.js +70 -0
- package/dist/commands/subsystem/txn/views.js.map +1 -0
- package/dist/commands/unarchive/manifest.js +160 -0
- package/dist/commands/unarchive/manifest.js.map +1 -0
- package/dist/commands/{unarchive.js → unarchive/restore.js} +47 -160
- package/dist/commands/unarchive/restore.js.map +1 -0
- package/dist/commands/unarchive/unarchive.js +67 -0
- package/dist/commands/unarchive/unarchive.js.map +1 -0
- package/dist/commands/validate/arch-coverage.js +194 -0
- package/dist/commands/validate/arch-coverage.js.map +1 -0
- package/dist/commands/validate/checks/fleet-shape.js +296 -0
- package/dist/commands/validate/checks/fleet-shape.js.map +1 -0
- package/dist/commands/validate/checks/health-deps.js +55 -0
- package/dist/commands/validate/checks/health-deps.js.map +1 -0
- package/dist/commands/validate/checks/requirements.js +254 -0
- package/dist/commands/validate/checks/requirements.js.map +1 -0
- package/dist/commands/validate/checks/sources.js +76 -0
- package/dist/commands/validate/checks/sources.js.map +1 -0
- package/dist/commands/validate/checks/vocabulary.js +31 -0
- package/dist/commands/validate/checks/vocabulary.js.map +1 -0
- package/dist/commands/validate/feature.js +216 -0
- package/dist/commands/validate/feature.js.map +1 -0
- package/dist/commands/validate/fleet/census.js +69 -0
- package/dist/commands/validate/fleet/census.js.map +1 -0
- package/dist/commands/validate/fleet/kind-tags.js +39 -0
- package/dist/commands/validate/fleet/kind-tags.js.map +1 -0
- package/dist/commands/validate/fleet/landscape.js +353 -0
- package/dist/commands/validate/fleet/landscape.js.map +1 -0
- package/dist/commands/validate/fleet/load.js +52 -0
- package/dist/commands/validate/fleet/load.js.map +1 -0
- package/dist/commands/validate/fleet/obligations.js +236 -0
- package/dist/commands/validate/fleet/obligations.js.map +1 -0
- package/dist/commands/validate/fleet/scorecard/adoption.js +102 -0
- package/dist/commands/validate/fleet/scorecard/adoption.js.map +1 -0
- package/dist/commands/validate/fleet/scorecard/contracts.js +98 -0
- package/dist/commands/validate/fleet/scorecard/contracts.js.map +1 -0
- package/dist/commands/validate/fleet/scorecard/print.js +63 -0
- package/dist/commands/validate/fleet/scorecard/print.js.map +1 -0
- package/dist/commands/validate/fleet/scorecard/scorecard.js +156 -0
- package/dist/commands/validate/fleet/scorecard/scorecard.js.map +1 -0
- package/dist/commands/validate/fleet/usecases/capability-tag.js +94 -0
- package/dist/commands/validate/fleet/usecases/capability-tag.js.map +1 -0
- package/dist/commands/validate/fleet/usecases/place.js +13 -0
- package/dist/commands/validate/fleet/usecases/place.js.map +1 -0
- package/dist/commands/validate/fleet/usecases/requirement-tag.js +95 -0
- package/dist/commands/validate/fleet/usecases/requirement-tag.js.map +1 -0
- package/dist/commands/validate/fleet/usecases/steps.js +197 -0
- package/dist/commands/validate/fleet/usecases/steps.js.map +1 -0
- package/dist/commands/validate/fleet/usecases/usecases.js +99 -0
- package/dist/commands/validate/fleet/usecases/usecases.js.map +1 -0
- package/dist/commands/validate/fleet/views/ids.js +40 -0
- package/dist/commands/validate/fleet/views/ids.js.map +1 -0
- package/dist/commands/validate/fleet/views/stale.js +59 -0
- package/dist/commands/validate/fleet/views/stale.js.map +1 -0
- package/dist/commands/validate/links/corpus.js +92 -0
- package/dist/commands/validate/links/corpus.js.map +1 -0
- package/dist/commands/validate/links/glossary.js +75 -0
- package/dist/commands/validate/links/glossary.js.map +1 -0
- package/dist/commands/validate/report.js +269 -0
- package/dist/commands/validate/report.js.map +1 -0
- package/dist/commands/validate/service/api.js +338 -0
- package/dist/commands/validate/service/api.js.map +1 -0
- package/dist/commands/validate/service/events/events.js +219 -0
- package/dist/commands/validate/service/events/events.js.map +1 -0
- package/dist/commands/validate/service/events/message-producers.js +77 -0
- package/dist/commands/validate/service/events/message-producers.js.map +1 -0
- package/dist/commands/validate/service/evidence-pins.js +131 -0
- package/dist/commands/validate/service/evidence-pins.js.map +1 -0
- package/dist/commands/validate/service/service.js +250 -0
- package/dist/commands/validate/service/service.js.map +1 -0
- package/dist/commands/validate/service/specs.js +219 -0
- package/dist/commands/validate/service/specs.js.map +1 -0
- package/dist/commands/validate/service/spine.js +113 -0
- package/dist/commands/validate/service/spine.js.map +1 -0
- package/dist/commands/validate/validate.js +338 -0
- package/dist/commands/validate/validate.js.map +1 -0
- package/dist/commands/verify/cross/diff.js +182 -0
- package/dist/commands/verify/cross/diff.js.map +1 -0
- package/dist/commands/verify/evidence/contract.js +32 -0
- package/dist/commands/verify/evidence/contract.js.map +1 -0
- package/dist/commands/verify/evidence/pins.js +52 -0
- package/dist/commands/verify/evidence/pins.js.map +1 -0
- package/dist/commands/verify/evidence/read.js +72 -0
- package/dist/commands/verify/evidence/read.js.map +1 -0
- package/dist/commands/verify/frozen.js +241 -0
- package/dist/commands/verify/frozen.js.map +1 -0
- package/dist/commands/verify/record.js +226 -0
- package/dist/commands/verify/record.js.map +1 -0
- package/dist/commands/verify/report.js +223 -0
- package/dist/commands/verify/report.js.map +1 -0
- package/dist/commands/verify/results.js +246 -0
- package/dist/commands/verify/results.js.map +1 -0
- package/dist/commands/verify/verify.js +217 -0
- package/dist/commands/verify/verify.js.map +1 -0
- package/dist/commands/vouch/contract.js +11 -0
- package/dist/commands/vouch/contract.js.map +1 -0
- package/dist/commands/vouch/pack/contract.js +2 -0
- package/dist/commands/vouch/pack/contract.js.map +1 -0
- package/dist/commands/vouch/pack/pack.js +266 -0
- package/dist/commands/vouch/pack/pack.js.map +1 -0
- package/dist/commands/vouch/pack/print.js +271 -0
- package/dist/commands/vouch/pack/print.js.map +1 -0
- package/dist/commands/vouch/pack/sections.js +142 -0
- package/dist/commands/vouch/pack/sections.js.map +1 -0
- package/dist/commands/vouch/prompt/confirm.js +46 -0
- package/dist/commands/vouch/prompt/confirm.js.map +1 -0
- package/dist/commands/vouch/report.js +101 -0
- package/dist/commands/vouch/report.js.map +1 -0
- package/dist/commands/vouch/run.js +285 -0
- package/dist/commands/vouch/run.js.map +1 -0
- package/dist/commands/vouch/sample/plan.js +125 -0
- package/dist/commands/vouch/sample/plan.js.map +1 -0
- package/dist/commands/vouch/sample/print.js +109 -0
- package/dist/commands/vouch/sample/print.js.map +1 -0
- package/dist/commands/vouch/vet/verify.js +123 -0
- package/dist/commands/vouch/vet/verify.js.map +1 -0
- package/dist/commands/vouch/vouch.js +176 -0
- package/dist/commands/vouch/vouch.js.map +1 -0
- package/dist/core/agent/agents-md/artifacts.js +220 -0
- package/dist/core/agent/agents-md/artifacts.js.map +1 -0
- package/dist/core/agent/agents-md/command-map.js +324 -0
- package/dist/core/agent/agents-md/command-map.js.map +1 -0
- package/dist/core/agent/agents-md/cycle.js +165 -0
- package/dist/core/agent/agents-md/cycle.js.map +1 -0
- package/dist/core/agent/agents-md/map/explain.js +34 -0
- package/dist/core/agent/agents-md/map/explain.js.map +1 -0
- package/dist/core/agent/agents-md/map/lenses/context.js +41 -0
- package/dist/core/agent/agents-md/map/lenses/context.js.map +1 -0
- package/dist/core/agent/agents-md/map/lenses/diff.js +46 -0
- package/dist/core/agent/agents-md/map/lenses/diff.js.map +1 -0
- package/dist/core/agent/agents-md/map/lenses/gate.js +57 -0
- package/dist/core/agent/agents-md/map/lenses/gate.js.map +1 -0
- package/dist/core/agent/agents-md/map/mcp.js +41 -0
- package/dist/core/agent/agents-md/map/mcp.js.map +1 -0
- package/dist/core/agent/agents-md/map/status.js +62 -0
- package/dist/core/agent/agents-md/map/status.js.map +1 -0
- package/dist/core/agent/agents-md/map/subsystem.js +32 -0
- package/dist/core/agent/agents-md/map/subsystem.js.map +1 -0
- package/dist/core/agent/agents-md/map/usecases.js +60 -0
- package/dist/core/agent/agents-md/map/usecases.js.map +1 -0
- package/dist/core/agent/agents-md/refusals.js +246 -0
- package/dist/core/agent/agents-md/refusals.js.map +1 -0
- package/dist/core/agent/agents-md/shipped/archive-gate.js +98 -0
- package/dist/core/agent/agents-md/shipped/archive-gate.js.map +1 -0
- package/dist/core/agent/agents-md/spine.js +40 -0
- package/dist/core/agent/agents-md/spine.js.map +1 -0
- package/dist/core/agent/agents-md.js +170 -0
- package/dist/core/agent/agents-md.js.map +1 -0
- package/dist/core/agent/agents-stamp.js +155 -0
- package/dist/core/agent/agents-stamp.js.map +1 -0
- package/dist/core/agent/contract.js +2 -0
- package/dist/core/agent/contract.js.map +1 -0
- package/dist/core/agent/protocol.js +193 -0
- package/dist/core/agent/protocol.js.map +1 -0
- package/dist/core/agent/scaffold.js +259 -0
- package/dist/core/agent/scaffold.js.map +1 -0
- package/dist/core/agent/support/report.js +103 -0
- package/dist/core/agent/support/report.js.map +1 -0
- package/dist/core/agent/tools/dialects.js +150 -0
- package/dist/core/agent/tools/dialects.js.map +1 -0
- package/dist/core/agent/tools/registry.js +228 -0
- package/dist/core/agent/tools/registry.js.map +1 -0
- package/dist/core/agent/workflows/adopt.js +133 -0
- package/dist/core/agent/workflows/adopt.js.map +1 -0
- package/dist/core/agent/workflows/check.js +334 -0
- package/dist/core/agent/workflows/check.js.map +1 -0
- package/dist/core/agent/workflows/closing.js +262 -0
- package/dist/core/agent/workflows/closing.js.map +1 -0
- package/dist/core/agent/workflows/feature.js +105 -0
- package/dist/core/agent/workflows/feature.js.map +1 -0
- package/dist/core/agent/workflows/implement.js +105 -0
- package/dist/core/agent/workflows/implement.js.map +1 -0
- package/dist/core/agent/workflows/reference/authoring.js +209 -0
- package/dist/core/agent/workflows/reference/authoring.js.map +1 -0
- package/dist/core/agent/workflows/reference/codes.js +65 -0
- package/dist/core/agent/workflows/reference/codes.js.map +1 -0
- package/dist/core/agent/workflows/reference/done-check.js +188 -0
- package/dist/core/agent/workflows/reference/done-check.js.map +1 -0
- package/dist/core/agent/workflows/reference/reference.js +16 -0
- package/dist/core/agent/workflows/reference/reference.js.map +1 -0
- package/dist/core/agent/workflows/reference/spine.js +297 -0
- package/dist/core/agent/workflows/reference/spine.js.map +1 -0
- package/dist/core/asyncapi/baseline/plan.js +110 -0
- package/dist/core/asyncapi/baseline/plan.js.map +1 -0
- package/dist/core/asyncapi/baseline/surfaces.js +54 -0
- package/dist/core/asyncapi/baseline/surfaces.js.map +1 -0
- package/dist/core/asyncapi/depth.js +164 -0
- package/dist/core/asyncapi/depth.js.map +1 -0
- package/dist/core/asyncapi/digest.js +141 -0
- package/dist/core/asyncapi/digest.js.map +1 -0
- package/dist/core/asyncapi/merge/components.js +91 -0
- package/dist/core/asyncapi/merge/components.js.map +1 -0
- package/dist/core/asyncapi/merge/error.js +33 -0
- package/dist/core/asyncapi/merge/error.js.map +1 -0
- package/dist/core/asyncapi/merge/markers.js +308 -0
- package/dist/core/asyncapi/merge/markers.js.map +1 -0
- package/dist/core/asyncapi/merge/merge.js +215 -0
- package/dist/core/asyncapi/merge/merge.js.map +1 -0
- package/dist/core/asyncapi/merge/pin.js +107 -0
- package/dist/core/asyncapi/merge/pin.js.map +1 -0
- package/dist/core/asyncapi/model.js +11 -0
- package/dist/core/asyncapi/model.js.map +1 -0
- package/dist/core/asyncapi/producers.js +50 -0
- package/dist/core/asyncapi/producers.js.map +1 -0
- package/dist/core/asyncapi/read.js +239 -0
- package/dist/core/asyncapi/read.js.map +1 -0
- package/dist/core/brief/brief.js +225 -0
- package/dist/core/brief/brief.js.map +1 -0
- package/dist/core/brief/checks.js +250 -0
- package/dist/core/brief/checks.js.map +1 -0
- package/dist/core/brief/landscape.js +194 -0
- package/dist/core/brief/landscape.js.map +1 -0
- package/dist/core/brief/targets.js +226 -0
- package/dist/core/brief/targets.js.map +1 -0
- package/dist/core/brief/unchecked.js +47 -0
- package/dist/core/brief/unchecked.js.map +1 -0
- package/dist/core/c4/arch.js +282 -0
- package/dist/core/c4/arch.js.map +1 -0
- package/dist/core/c4/likec4.js +88 -0
- package/dist/core/c4/likec4.js.map +1 -0
- package/dist/core/c4/parsed/dynamic-views.js +132 -0
- package/dist/core/c4/parsed/dynamic-views.js.map +1 -0
- package/dist/core/c4/parsed/specification.js +78 -0
- package/dist/core/c4/parsed/specification.js.map +1 -0
- package/dist/core/c4/parsed/values.js +57 -0
- package/dist/core/c4/parsed/values.js.map +1 -0
- package/dist/core/c4/parsed/view-ids.js +75 -0
- package/dist/core/c4/parsed/view-ids.js.map +1 -0
- package/dist/core/c4/project/architecture.js +45 -0
- package/dist/core/c4/project/architecture.js.map +1 -0
- package/dist/core/c4/project/documents.js +58 -0
- package/dist/core/c4/project/documents.js.map +1 -0
- package/dist/core/c4/project/load.js +183 -0
- package/dist/core/c4/project/load.js.map +1 -0
- package/dist/core/c4/resolve/service.js +113 -0
- package/dist/core/c4/resolve/service.js.map +1 -0
- package/dist/core/c4/seed/fleet-file.js +201 -0
- package/dist/core/c4/seed/fleet-file.js.map +1 -0
- package/dist/core/c4/seed/items.js +91 -0
- package/dist/core/c4/seed/items.js.map +1 -0
- package/dist/core/c4/seed/stamp.js +48 -0
- package/dist/core/c4/seed/stamp.js.map +1 -0
- package/dist/core/c4/seed/template.js +109 -0
- package/dist/core/c4/seed/template.js.map +1 -0
- package/dist/core/c4/source-mask.js +82 -0
- package/dist/core/c4/source-mask.js.map +1 -0
- package/dist/core/c4/source-scan.js +227 -0
- package/dist/core/c4/source-scan.js.map +1 -0
- package/dist/core/c4/splice/authored-source.js +101 -0
- package/dist/core/c4/splice/authored-source.js.map +1 -0
- package/dist/core/c4/splice/contract.js +10 -0
- package/dist/core/c4/splice/contract.js.map +1 -0
- package/dist/core/c4/splice/delta-blocks.js +126 -0
- package/dist/core/c4/splice/delta-blocks.js.map +1 -0
- package/dist/core/c4/splice/identity/edges.js +36 -0
- package/dist/core/c4/splice/identity/edges.js.map +1 -0
- package/dist/core/c4/splice/landscape-merge.js +269 -0
- package/dist/core/c4/splice/landscape-merge.js.map +1 -0
- package/dist/core/c4/splice/placement.js +194 -0
- package/dist/core/c4/splice/placement.js.map +1 -0
- package/dist/core/c4/workspace.js +172 -0
- package/dist/core/c4/workspace.js.map +1 -0
- package/dist/core/capabilities/authoring/notes.js +141 -0
- package/dist/core/capabilities/authoring/notes.js.map +1 -0
- package/dist/core/capabilities/capabilities.js +124 -0
- package/dist/core/capabilities/capabilities.js.map +1 -0
- package/dist/core/capabilities/delta/doc.js +50 -0
- package/dist/core/capabilities/delta/doc.js.map +1 -0
- package/dist/core/capabilities/delta/overlay.js +129 -0
- package/dist/core/capabilities/delta/overlay.js.map +1 -0
- package/dist/core/capabilities/delta/summary.js +57 -0
- package/dist/core/capabilities/delta/summary.js.map +1 -0
- package/dist/core/capabilities/delta/tree.js +43 -0
- package/dist/core/capabilities/delta/tree.js.map +1 -0
- package/dist/core/capabilities/delta/uncovered.js +222 -0
- package/dist/core/capabilities/delta/uncovered.js.map +1 -0
- package/dist/core/capabilities/findings.js +342 -0
- package/dist/core/capabilities/findings.js.map +1 -0
- package/dist/core/capabilities/realizes/findings.js +181 -0
- package/dist/core/capabilities/realizes/findings.js.map +1 -0
- package/dist/core/capabilities/realizes/join.js +143 -0
- package/dist/core/capabilities/realizes/join.js.map +1 -0
- package/dist/core/capabilities/rollup.js +199 -0
- package/dist/core/capabilities/rollup.js.map +1 -0
- package/dist/core/capabilities/tree.js +126 -0
- package/dist/core/capabilities/tree.js.map +1 -0
- package/dist/core/capabilities/usecase-join.js +277 -0
- package/dist/core/capabilities/usecase-join.js.map +1 -0
- package/dist/core/coherence/authoring/scaffold.js +177 -0
- package/dist/core/coherence/authoring/scaffold.js.map +1 -0
- package/dist/core/coherence/authoring/sentinels.js +74 -0
- package/dist/core/coherence/authoring/sentinels.js.map +1 -0
- package/dist/core/coherence/coherence.js +251 -0
- package/dist/core/coherence/coherence.js.map +1 -0
- package/dist/core/coherence/declared.js +269 -0
- package/dist/core/coherence/declared.js.map +1 -0
- package/dist/core/coherence/events/declared.js +206 -0
- package/dist/core/coherence/events/declared.js.map +1 -0
- package/dist/core/coherence/events/events.js +204 -0
- package/dist/core/coherence/events/events.js.map +1 -0
- package/dist/core/coherence/events/grades.js +166 -0
- package/dist/core/coherence/events/grades.js.map +1 -0
- package/dist/core/coherence/events/lookups.js +122 -0
- package/dist/core/coherence/events/lookups.js.map +1 -0
- package/dist/core/coherence/events/merged.js +40 -0
- package/dist/core/coherence/events/merged.js.map +1 -0
- package/dist/core/coherence/living.js +198 -0
- package/dist/core/coherence/living.js.map +1 -0
- package/dist/core/coherence/lookups.js +155 -0
- package/dist/core/coherence/lookups.js.map +1 -0
- package/dist/core/coherence/pending.js +39 -0
- package/dist/core/coherence/pending.js.map +1 -0
- package/dist/core/conflict-markers.js +60 -0
- package/dist/core/conflict-markers.js.map +1 -0
- package/dist/core/delta/claims.js +73 -0
- package/dist/core/delta/claims.js.map +1 -0
- package/dist/core/delta/delta.js +296 -0
- package/dist/core/delta/delta.js.map +1 -0
- package/dist/core/delta/document.js +177 -0
- package/dist/core/delta/document.js.map +1 -0
- package/dist/core/delta/scope.js +48 -0
- package/dist/core/delta/scope.js.map +1 -0
- package/dist/core/delta/select.js +237 -0
- package/dist/core/delta/select.js.map +1 -0
- package/dist/core/dependencies/dependencies.js +141 -0
- package/dist/core/dependencies/dependencies.js.map +1 -0
- package/dist/core/dependencies/facts.js +165 -0
- package/dist/core/dependencies/facts.js.map +1 -0
- package/dist/core/dependencies/fanin.js +88 -0
- package/dist/core/dependencies/fanin.js.map +1 -0
- package/dist/core/dependencies/graph.js +106 -0
- package/dist/core/dependencies/graph.js.map +1 -0
- package/dist/core/diff/base-git.js +148 -0
- package/dist/core/diff/base-git.js.map +1 -0
- package/dist/core/diff/base-state.js +209 -0
- package/dist/core/diff/base-state.js.map +1 -0
- package/dist/core/diff/current-state.js +96 -0
- package/dist/core/diff/current-state.js.map +1 -0
- package/dist/core/diff/scope/changed-paths.js +188 -0
- package/dist/core/diff/scope/changed-paths.js.map +1 -0
- package/dist/core/diff/semantic.js +243 -0
- package/dist/core/diff/semantic.js.map +1 -0
- package/dist/core/diff/victims.js +247 -0
- package/dist/core/diff/victims.js.map +1 -0
- package/dist/core/docs.js +59 -55
- package/dist/core/docs.js.map +1 -1
- package/dist/core/doctor/agents.js +222 -0
- package/dist/core/doctor/agents.js.map +1 -0
- package/dist/core/doctor/config.js +135 -0
- package/dist/core/doctor/config.js.map +1 -0
- package/dist/core/doctor/doctor.js +275 -0
- package/dist/core/doctor/doctor.js.map +1 -0
- package/dist/core/doctor/report.js +13 -0
- package/dist/core/doctor/report.js.map +1 -0
- package/dist/core/doctor/residue.js +110 -0
- package/dist/core/doctor/residue.js.map +1 -0
- package/dist/core/document/apply.js +77 -0
- package/dist/core/document/apply.js.map +1 -0
- package/dist/core/{frontmatter.js → document/frontmatter.js} +48 -2
- package/dist/core/document/frontmatter.js.map +1 -0
- package/dist/core/document/grammar/directives.js +143 -0
- package/dist/core/document/grammar/directives.js.map +1 -0
- package/dist/core/document/parse.js +263 -0
- package/dist/core/document/parse.js.map +1 -0
- package/dist/core/document/scenarios.js +221 -0
- package/dist/core/document/scenarios.js.map +1 -0
- package/dist/core/document/spec.js +241 -0
- package/dist/core/document/spec.js.map +1 -0
- package/dist/core/{config.js → envelope/config.js} +79 -18
- package/dist/core/envelope/config.js.map +1 -0
- package/dist/core/envelope/json.js +175 -0
- package/dist/core/envelope/json.js.map +1 -0
- package/dist/core/{version.js → envelope/version.js} +3 -3
- package/dist/core/envelope/version.js.map +1 -0
- package/dist/core/explain/families.js +175 -0
- package/dist/core/explain/families.js.map +1 -0
- package/dist/core/explain/fix-tables.js +178 -0
- package/dist/core/explain/fix-tables.js.map +1 -0
- package/dist/core/explain/lookup.js +181 -0
- package/dist/core/explain/lookup.js.map +1 -0
- package/dist/core/explain/refusals.js +49 -0
- package/dist/core/explain/refusals.js.map +1 -0
- package/dist/core/explain/terms.js +144 -0
- package/dist/core/explain/terms.js.map +1 -0
- package/dist/core/explore/describe.js +105 -0
- package/dist/core/explore/describe.js.map +1 -0
- package/dist/core/{explore.js → explore/explore.js} +50 -101
- package/dist/core/explore/explore.js.map +1 -0
- package/dist/core/fleet-context.js +132 -77
- package/dist/core/fleet-context.js.map +1 -1
- package/dist/core/gate/checks.js +201 -0
- package/dist/core/gate/checks.js.map +1 -0
- package/dist/core/gate/partners.js +205 -0
- package/dist/core/gate/partners.js.map +1 -0
- package/dist/core/gate/report.js +47 -0
- package/dist/core/gate/report.js.map +1 -0
- package/dist/core/gate/verification.js +113 -0
- package/dist/core/gate/verification.js.map +1 -0
- package/dist/core/gherkin/digest.js +60 -0
- package/dist/core/gherkin/digest.js.map +1 -0
- package/dist/core/gherkin/emit.js +177 -0
- package/dist/core/gherkin/emit.js.map +1 -0
- package/dist/core/gherkin/read.js +76 -0
- package/dist/core/gherkin/read.js.map +1 -0
- package/dist/core/gherkin/stale.js +234 -0
- package/dist/core/gherkin/stale.js.map +1 -0
- package/dist/core/gherkin/stamp.js +77 -0
- package/dist/core/gherkin/stamp.js.map +1 -0
- package/dist/core/gherkin/steps/catalogue.js +154 -0
- package/dist/core/gherkin/steps/catalogue.js.map +1 -0
- package/dist/core/gherkin/steps/inventory.js +98 -0
- package/dist/core/gherkin/steps/inventory.js.map +1 -0
- package/dist/core/gherkin/steps/phrase.js +72 -0
- package/dist/core/gherkin/steps/phrase.js.map +1 -0
- package/dist/core/glossary/delta.js +106 -0
- package/dist/core/glossary/delta.js.map +1 -0
- package/dist/core/glossary/tree.js +86 -0
- package/dist/core/glossary/tree.js.map +1 -0
- package/dist/core/kernel/concurrency.js.map +1 -0
- package/dist/core/{document-bytes.js → kernel/document-bytes.js} +1 -1
- package/dist/core/kernel/document-bytes.js.map +1 -0
- package/dist/core/kernel/fences.js +42 -0
- package/dist/core/kernel/fences.js.map +1 -0
- package/dist/core/kernel/ids/capability.js +72 -0
- package/dist/core/kernel/ids/capability.js.map +1 -0
- package/dist/core/kernel/ids/dirs.js +33 -0
- package/dist/core/kernel/ids/dirs.js.map +1 -0
- package/dist/core/kernel/ids/feature.js +75 -0
- package/dist/core/kernel/ids/feature.js.map +1 -0
- package/dist/core/kernel/ids/service.js +156 -0
- package/dist/core/kernel/ids/service.js.map +1 -0
- package/dist/core/kernel/ids/subsystem.js +63 -0
- package/dist/core/kernel/ids/subsystem.js.map +1 -0
- package/dist/core/{path-safety.js → kernel/path-safety.js} +18 -4
- package/dist/core/kernel/path-safety.js.map +1 -0
- package/dist/core/kernel/records.js.map +1 -0
- package/dist/core/links/backlinks.js +68 -0
- package/dist/core/links/backlinks.js.map +1 -0
- package/dist/core/links/case.js +74 -0
- package/dist/core/links/case.js.map +1 -0
- package/dist/core/links/corpus.js +104 -0
- package/dist/core/links/corpus.js.map +1 -0
- package/dist/core/links/findings.js +110 -0
- package/dist/core/links/findings.js.map +1 -0
- package/dist/core/links/parse.js +236 -0
- package/dist/core/links/parse.js.map +1 -0
- package/dist/core/mcp/argv.js +111 -0
- package/dist/core/mcp/argv.js.map +1 -0
- package/dist/core/mcp/author-tools.js +72 -0
- package/dist/core/mcp/author-tools.js.map +1 -0
- package/dist/core/mcp/framing.js +46 -0
- package/dist/core/mcp/framing.js.map +1 -0
- package/dist/core/mcp/protocol.js +280 -0
- package/dist/core/mcp/protocol.js.map +1 -0
- package/dist/core/mcp/tools.js +314 -0
- package/dist/core/mcp/tools.js.map +1 -0
- package/dist/core/obligations/obligations.js +106 -0
- package/dist/core/obligations/obligations.js.map +1 -0
- package/dist/core/openapi/baseline/gate.js +166 -0
- package/dist/core/openapi/baseline/gate.js.map +1 -0
- package/dist/core/openapi/baseline/plan.js +112 -0
- package/dist/core/openapi/baseline/plan.js.map +1 -0
- package/dist/core/openapi/baseline/record.js +175 -0
- package/dist/core/openapi/baseline/record.js.map +1 -0
- package/dist/core/openapi/depth.js +122 -0
- package/dist/core/openapi/depth.js.map +1 -0
- package/dist/core/openapi/digest.js +189 -0
- package/dist/core/openapi/digest.js.map +1 -0
- package/dist/core/{openapi.js → openapi/doc.js} +44 -106
- package/dist/core/openapi/doc.js.map +1 -0
- package/dist/core/openapi/merge/components.js +234 -0
- package/dist/core/openapi/merge/components.js.map +1 -0
- package/dist/core/openapi/merge/error.js +26 -0
- package/dist/core/openapi/merge/error.js.map +1 -0
- package/dist/core/openapi/merge/markers.js +208 -0
- package/dist/core/openapi/merge/markers.js.map +1 -0
- package/dist/core/openapi/merge/merge.js +256 -0
- package/dist/core/openapi/merge/merge.js.map +1 -0
- package/dist/core/openapi/merge/pin.js +128 -0
- package/dist/core/openapi/merge/pin.js.map +1 -0
- package/dist/core/openspec/decide/capabilities.js +244 -0
- package/dist/core/openspec/decide/capabilities.js.map +1 -0
- package/dist/core/openspec/decide/dispositions.js +63 -0
- package/dist/core/openspec/decide/dispositions.js.map +1 -0
- package/dist/core/openspec/decide/renames.js +179 -0
- package/dist/core/openspec/decide/renames.js.map +1 -0
- package/dist/core/openspec/decide/verdict.js +84 -0
- package/dist/core/openspec/decide/verdict.js.map +1 -0
- package/dist/core/openspec/inventory.js +221 -0
- package/dist/core/openspec/inventory.js.map +1 -0
- package/dist/core/openspec/model/mapping.js +76 -0
- package/dist/core/openspec/model/mapping.js.map +1 -0
- package/dist/core/openspec/model/model.js +65 -0
- package/dist/core/openspec/model/model.js.map +1 -0
- package/dist/core/openspec/scan/changes.js +235 -0
- package/dist/core/openspec/scan/changes.js.map +1 -0
- package/dist/core/openspec/scan/config.js +200 -0
- package/dist/core/openspec/scan/config.js.map +1 -0
- package/dist/core/openspec/scan/shape.js +260 -0
- package/dist/core/openspec/scan/shape.js.map +1 -0
- package/dist/core/openspec/scan/walk.js +133 -0
- package/dist/core/openspec/scan/walk.js.map +1 -0
- package/dist/core/openspec/scan/workspace.js +71 -0
- package/dist/core/openspec/scan/workspace.js.map +1 -0
- package/dist/core/owners/codeowners.js +141 -0
- package/dist/core/owners/codeowners.js.map +1 -0
- package/dist/core/pack/features.js +120 -0
- package/dist/core/pack/features.js.map +1 -0
- package/dist/core/pack/joins.js +112 -0
- package/dist/core/pack/joins.js.map +1 -0
- package/dist/core/pack/living.js +118 -0
- package/dist/core/pack/living.js.map +1 -0
- package/dist/core/pack/pack.js +76 -0
- package/dist/core/pack/pack.js.map +1 -0
- package/dist/core/permissions/permissions.js +87 -0
- package/dist/core/permissions/permissions.js.map +1 -0
- package/dist/core/projection/api.js +84 -0
- package/dist/core/projection/api.js.map +1 -0
- package/dist/core/projection/arch-slice.js +63 -0
- package/dist/core/projection/arch-slice.js.map +1 -0
- package/dist/core/projection/events.js +34 -0
- package/dist/core/projection/events.js.map +1 -0
- package/dist/core/provenance/findings.js +208 -0
- package/dist/core/provenance/findings.js.map +1 -0
- package/dist/core/provenance/git.js +225 -0
- package/dist/core/provenance/git.js.map +1 -0
- package/dist/core/provenance/gitq/moves.js +182 -0
- package/dist/core/provenance/gitq/moves.js.map +1 -0
- package/dist/core/provenance/gitq/vouched-ancestor.js +179 -0
- package/dist/core/provenance/gitq/vouched-ancestor.js.map +1 -0
- package/dist/core/provenance/sample/scope.js +238 -0
- package/dist/core/provenance/sample/scope.js.map +1 -0
- package/dist/core/provenance/sample/sections.js +61 -0
- package/dist/core/provenance/sample/sections.js.map +1 -0
- package/dist/core/provenance/sources.js +263 -0
- package/dist/core/provenance/sources.js.map +1 -0
- package/dist/core/provenance/stamp.js +232 -0
- package/dist/core/provenance/stamp.js.map +1 -0
- package/dist/core/provenance/walk.js +157 -0
- package/dist/core/provenance/walk.js.map +1 -0
- package/dist/core/repo/authored/paths.js +192 -0
- package/dist/core/repo/authored/paths.js.map +1 -0
- package/dist/core/repo/entries.js +126 -0
- package/dist/core/repo/entries.js.map +1 -0
- package/dist/core/repo/paths.js +236 -0
- package/dist/core/repo/paths.js.map +1 -0
- package/dist/core/repo/repo.js +248 -0
- package/dist/core/repo/repo.js.map +1 -0
- package/dist/core/repo/service-target.js +153 -0
- package/dist/core/repo/service-target.js.map +1 -0
- package/dist/core/repo/state.js +58 -0
- package/dist/core/repo/state.js.map +1 -0
- package/dist/core/repo/tree/find.js +52 -0
- package/dist/core/repo/tree/find.js.map +1 -0
- package/dist/core/repo/tree/fs.js +64 -0
- package/dist/core/repo/tree/fs.js.map +1 -0
- package/dist/core/repo/tree/marker.js +61 -0
- package/dist/core/repo/tree/marker.js.map +1 -0
- package/dist/core/repo/tree/views.js +172 -0
- package/dist/core/repo/tree/views.js.map +1 -0
- package/dist/core/repo/tree/walk.js +234 -0
- package/dist/core/repo/tree/walk.js.map +1 -0
- package/dist/core/results.js +99 -2
- package/dist/core/results.js.map +1 -1
- package/dist/core/scaffold/landscape.js +131 -0
- package/dist/core/scaffold/landscape.js.map +1 -0
- package/dist/core/scaffold/readme.js +84 -0
- package/dist/core/scaffold/readme.js.map +1 -0
- package/dist/core/staging/commit.js +241 -0
- package/dist/core/staging/commit.js.map +1 -0
- package/dist/core/staging/interrupted.js +96 -0
- package/dist/core/staging/interrupted.js.map +1 -0
- package/dist/core/staging/lock.js +206 -0
- package/dist/core/staging/lock.js.map +1 -0
- package/dist/core/staging/recovery/finding.js +35 -0
- package/dist/core/staging/recovery/finding.js.map +1 -0
- package/dist/core/staging/recovery/intent.js +98 -0
- package/dist/core/staging/recovery/intent.js.map +1 -0
- package/dist/core/staging/recovery/recover.js +126 -0
- package/dist/core/staging/recovery/recover.js.map +1 -0
- package/dist/core/staging/recovery/residue.js +62 -0
- package/dist/core/staging/recovery/residue.js.map +1 -0
- package/dist/core/staging/snapshot.js +202 -0
- package/dist/core/staging/snapshot.js.map +1 -0
- package/dist/core/staging/txn/forward.js +171 -0
- package/dist/core/staging/txn/forward.js.map +1 -0
- package/dist/core/staging/txn/journal.js +139 -0
- package/dist/core/staging/txn/journal.js.map +1 -0
- package/dist/core/staging/txn/transaction.js +75 -0
- package/dist/core/staging/txn/transaction.js.map +1 -0
- package/dist/core/staging/writes.js +113 -0
- package/dist/core/staging/writes.js.map +1 -0
- package/dist/core/status/actions/execution.js +49 -0
- package/dist/core/status/actions/execution.js.map +1 -0
- package/dist/core/status/contracts.js +102 -0
- package/dist/core/status/contracts.js.map +1 -0
- package/dist/core/status/feature/artifacts.js +171 -0
- package/dist/core/status/feature/artifacts.js.map +1 -0
- package/dist/core/status/feature/feature.js +207 -0
- package/dist/core/status/feature/feature.js.map +1 -0
- package/dist/core/status/feature/next.js +150 -0
- package/dist/core/status/feature/next.js.map +1 -0
- package/dist/core/status/feature/state.js +21 -0
- package/dist/core/status/feature/state.js.map +1 -0
- package/dist/core/status/fleet/fleet.js +187 -0
- package/dist/core/status/fleet/fleet.js.map +1 -0
- package/dist/core/status/fleet/next.js +207 -0
- package/dist/core/status/fleet/next.js.map +1 -0
- package/dist/core/status/interrupted.js +97 -0
- package/dist/core/status/interrupted.js.map +1 -0
- package/dist/core/status/report.js +31 -0
- package/dist/core/status/report.js.map +1 -0
- package/dist/core/status/scan.js +41 -0
- package/dist/core/status/scan.js.map +1 -0
- package/dist/core/status/verification.js +201 -0
- package/dist/core/status/verification.js.map +1 -0
- package/dist/core/usecases/capability.js +169 -0
- package/dist/core/usecases/capability.js.map +1 -0
- package/dist/core/usecases/delta/claims.js +116 -0
- package/dist/core/usecases/delta/claims.js.map +1 -0
- package/dist/core/usecases/delta/flows.js +103 -0
- package/dist/core/usecases/delta/flows.js.map +1 -0
- package/dist/core/usecases/delta/overlay.js +235 -0
- package/dist/core/usecases/delta/overlay.js.map +1 -0
- package/dist/core/usecases/fleet.js +137 -0
- package/dist/core/usecases/fleet.js.map +1 -0
- package/dist/core/usecases/operations.js +111 -0
- package/dist/core/usecases/operations.js.map +1 -0
- package/dist/core/usecases/place.js +44 -0
- package/dist/core/usecases/place.js.map +1 -0
- package/dist/core/usecases/touch.js +101 -0
- package/dist/core/usecases/touch.js.map +1 -0
- package/dist/core/verify/answers.js +173 -0
- package/dist/core/verify/answers.js.map +1 -0
- package/dist/core/verify/build.js +150 -0
- package/dist/core/verify/build.js.map +1 -0
- package/dist/core/verify/checklist.js +201 -0
- package/dist/core/verify/checklist.js.map +1 -0
- package/dist/core/verify/claims/identity.js +61 -0
- package/dist/core/verify/claims/identity.js.map +1 -0
- package/dist/core/verify/cross/diff.js +97 -0
- package/dist/core/verify/cross/diff.js.map +1 -0
- package/dist/core/verify/evidence/contract.js +169 -0
- package/dist/core/verify/evidence/contract.js.map +1 -0
- package/dist/core/verify/file.js +257 -0
- package/dist/core/verify/file.js.map +1 -0
- package/dist/core/verify/pins/lint.js +157 -0
- package/dist/core/verify/pins/lint.js.map +1 -0
- package/dist/core/verify/pins/pin.js +95 -0
- package/dist/core/verify/pins/pin.js.map +1 -0
- package/dist/core/verify/record.js +142 -0
- package/dist/core/verify/record.js.map +1 -0
- package/dist/core/verify/store/commit.js +89 -0
- package/dist/core/verify/store/commit.js.map +1 -0
- package/dist/core/verify/store/render.js +57 -0
- package/dist/core/verify/store/render.js.map +1 -0
- package/dist/core/vocabulary/health.js +91 -0
- package/dist/core/vocabulary/health.js.map +1 -0
- package/dist/core/vocabulary/issue.js +55 -0
- package/dist/core/vocabulary/issue.js.map +1 -0
- package/dist/core/vocabulary/maturity.js +145 -0
- package/dist/core/vocabulary/maturity.js.map +1 -0
- package/dist/core/{report.js → vocabulary/report.js} +30 -2
- package/dist/core/vocabulary/report.js.map +1 -0
- package/dist/core/vocabulary/steps.js +266 -0
- package/dist/core/vocabulary/steps.js.map +1 -0
- package/dist/core/workspace/discover.js +239 -0
- package/dist/core/workspace/discover.js.map +1 -0
- package/dist/core/workspace/render.js +52 -0
- package/dist/core/workspace/render.js.map +1 -0
- package/examples/README.md +189 -0
- package/examples/docs/architecture/adrs/0001-transactional-outbox.md +33 -0
- package/examples/docs/architecture/capabilities.yaml +31 -0
- package/examples/docs/architecture/landscape.likec4 +280 -0
- package/examples/docs/architecture/obligations.yaml +23 -0
- package/examples/docs/architecture/permissions.yaml +50 -0
- package/examples/docs/architecture/subsystems.likec4 +11 -0
- package/examples/docs/architecture/usecases/order-notification.likec4 +65 -0
- package/examples/docs/capabilities/checkout/spec.md +55 -0
- package/examples/docs/capabilities/identity/tokens/spec.md +42 -0
- package/examples/docs/capabilities/order-notifications/spec.md +43 -0
- package/examples/docs/features/FEAT-101-payment-splitting/adrs/0001-dedicated-split-service.md +18 -0
- package/examples/docs/features/FEAT-101-payment-splitting/delta.likec4 +94 -0
- package/examples/docs/features/FEAT-101-payment-splitting/intent.md +44 -0
- package/examples/docs/features/FEAT-101-payment-splitting/specs/checkout-web/spec.md +21 -0
- package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-service/asyncapi.yaml +129 -0
- package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-service/spec.md +36 -0
- package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-split-service/arch.spec.md +40 -0
- package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-split-service/openapi.yaml +116 -0
- package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-split-service/spec.md +55 -0
- package/examples/docs/features/FEAT-112-retire-order-v1/intent.md +35 -0
- package/examples/docs/features/FEAT-112-retire-order-v1/specs/order-service/openapi.yaml +28 -0
- package/examples/docs/features/FEAT-112-retire-order-v1/specs/order-service/spec.md +17 -0
- package/examples/docs/features/archive/FEAT-088-refunds/.loam-before/files/architecture/landscape.likec4 +253 -0
- package/examples/docs/features/archive/FEAT-088-refunds/.loam-before/files/services/order-service/spec.md +121 -0
- package/examples/docs/features/archive/FEAT-088-refunds/.loam-before/files/services/payment-service/openapi.yaml +111 -0
- package/examples/docs/features/archive/FEAT-088-refunds/.loam-before/files/services/payment-service/spec.md +58 -0
- package/examples/docs/features/archive/FEAT-088-refunds/.loam-before/manifest.json +32 -0
- package/examples/docs/features/archive/FEAT-088-refunds/adrs/0001-refunds-stay-in-payment-service.md +26 -0
- package/examples/docs/features/archive/FEAT-088-refunds/delta.likec4 +28 -0
- package/examples/docs/features/archive/FEAT-088-refunds/intent.md +26 -0
- package/examples/docs/features/archive/FEAT-088-refunds/specs/order-service/spec.md +37 -0
- package/examples/docs/features/archive/FEAT-088-refunds/specs/payment-service/openapi.yaml +70 -0
- package/examples/docs/features/archive/FEAT-088-refunds/specs/payment-service/spec.md +23 -0
- package/examples/docs/features/archive/FEAT-088-refunds/verification.yaml +76 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/files/architecture/landscape.likec4 +275 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/files/services/payment-service/asyncapi.yaml +96 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/files/services/payment-service/spec.md +82 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/files/services/platform/notification-service/asyncapi.yaml +164 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/files/services/platform/notification-service/spec.md +91 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/manifest.json +46 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/delta.likec4 +36 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/intent.md +22 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/scenario-report.json +10 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/specs/notification-service/asyncapi.yaml +208 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/specs/notification-service/spec.md +24 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/specs/payment-service/asyncapi.yaml +137 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/specs/payment-service/spec.md +31 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/verification.yaml +84 -0
- package/examples/docs/glossary/order.md +15 -0
- package/examples/docs/glossary/payments/authorization.md +14 -0
- package/examples/docs/likec4.config.json +9 -0
- package/examples/docs/loam.json +3 -0
- package/examples/docs/services/checkout-web/model.likec4 +109 -0
- package/examples/docs/services/checkout-web/spec.md +91 -0
- package/examples/docs/services/checkout-web/ui/pages/checkout.page.yaml +40 -0
- package/examples/docs/services/checkout-web/ui/pages/order-status.page.yaml +24 -0
- package/examples/docs/services/checkout-web/ui/pages/split-payment.page.yaml +26 -0
- package/examples/docs/services/order-service/adrs/0001-orchestrated-order-lifecycle.md +52 -0
- package/examples/docs/services/order-service/arch.spec.md +127 -0
- package/examples/docs/services/order-service/asyncapi.yaml +108 -0
- package/examples/docs/services/order-service/health.yaml +57 -0
- package/examples/docs/services/order-service/model.likec4 +138 -0
- package/examples/docs/services/order-service/openapi.yaml +257 -0
- package/examples/docs/services/order-service/runbook.md +62 -0
- package/examples/docs/services/order-service/spec.md +134 -0
- package/examples/docs/services/payment-service/adrs/0001-payments-outbox.md +18 -0
- package/examples/docs/services/payment-service/adrs/0002-idempotency-keys-on-authorization.md +27 -0
- package/examples/docs/services/payment-service/arch.spec.md +73 -0
- package/examples/docs/services/payment-service/asyncapi.yaml +130 -0
- package/examples/docs/services/payment-service/health.yaml +39 -0
- package/examples/docs/services/payment-service/model.likec4 +67 -0
- package/examples/docs/services/payment-service/openapi.yaml +151 -0
- package/examples/docs/services/payment-service/runbook.md +37 -0
- package/examples/docs/services/payment-service/spec.md +88 -0
- package/examples/docs/services/platform/identity-service/adrs/0001-token-introspection-over-local-validation.md +60 -0
- package/examples/docs/services/platform/identity-service/arch.spec.md +117 -0
- package/examples/docs/services/platform/identity-service/health.yaml +70 -0
- package/examples/docs/services/platform/identity-service/model.likec4 +83 -0
- package/examples/docs/services/platform/identity-service/openapi.yaml +197 -0
- package/examples/docs/services/platform/identity-service/runbook.md +95 -0
- package/examples/docs/services/platform/identity-service/spec.md +119 -0
- package/examples/docs/services/platform/notification-service/asyncapi.yaml +199 -0
- package/examples/docs/services/platform/notification-service/health.yaml +35 -0
- package/examples/docs/services/platform/notification-service/model.likec4 +118 -0
- package/examples/docs/services/platform/notification-service/runbook.md +48 -0
- package/examples/docs/services/platform/notification-service/spec.md +112 -0
- package/examples/docs/services/platform/subsystem.yaml +2 -0
- package/examples/fleet.yaml +57 -0
- package/package.json +19 -6
- package/dist/commands/adopt.js +0 -240
- package/dist/commands/adopt.js.map +0 -1
- package/dist/commands/archive.js +0 -1313
- package/dist/commands/archive.js.map +0 -1
- package/dist/commands/delta.js +0 -388
- package/dist/commands/delta.js.map +0 -1
- package/dist/commands/docs-repo-gate.js.map +0 -1
- package/dist/commands/format.js +0 -17
- package/dist/commands/format.js.map +0 -1
- package/dist/commands/gherkin.js +0 -309
- package/dist/commands/gherkin.js.map +0 -1
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/list.js +0 -291
- package/dist/commands/list.js.map +0 -1
- package/dist/commands/migrate-openspec.js +0 -950
- package/dist/commands/migrate-openspec.js.map +0 -1
- package/dist/commands/new.js +0 -413
- package/dist/commands/new.js.map +0 -1
- package/dist/commands/rebase.js +0 -356
- package/dist/commands/rebase.js.map +0 -1
- package/dist/commands/show.js.map +0 -1
- package/dist/commands/status.js +0 -254
- package/dist/commands/status.js.map +0 -1
- package/dist/commands/unarchive.js.map +0 -1
- package/dist/commands/validate.js +0 -1591
- package/dist/commands/validate.js.map +0 -1
- package/dist/commands/verify.js +0 -775
- package/dist/commands/verify.js.map +0 -1
- package/dist/commands/vouch.js +0 -343
- package/dist/commands/vouch.js.map +0 -1
- package/dist/core/agent.js +0 -2065
- package/dist/core/agent.js.map +0 -1
- package/dist/core/agents-stamp.js +0 -68
- package/dist/core/agents-stamp.js.map +0 -1
- package/dist/core/arch.js +0 -130
- package/dist/core/arch.js.map +0 -1
- package/dist/core/brief.js +0 -733
- package/dist/core/brief.js.map +0 -1
- package/dist/core/coherence.js +0 -577
- package/dist/core/coherence.js.map +0 -1
- package/dist/core/concurrency.js.map +0 -1
- package/dist/core/config.js.map +0 -1
- package/dist/core/delta.js +0 -476
- package/dist/core/delta.js.map +0 -1
- package/dist/core/dependencies.js +0 -356
- package/dist/core/dependencies.js.map +0 -1
- package/dist/core/doctor.js +0 -559
- package/dist/core/doctor.js.map +0 -1
- package/dist/core/document-bytes.js.map +0 -1
- package/dist/core/explore.js.map +0 -1
- package/dist/core/frontmatter.js.map +0 -1
- package/dist/core/gherkin.js +0 -463
- package/dist/core/gherkin.js.map +0 -1
- package/dist/core/health.js +0 -67
- package/dist/core/health.js.map +0 -1
- package/dist/core/ids.js +0 -122
- package/dist/core/ids.js.map +0 -1
- package/dist/core/issue.js +0 -9
- package/dist/core/issue.js.map +0 -1
- package/dist/core/json.js +0 -74
- package/dist/core/json.js.map +0 -1
- package/dist/core/likec4.js +0 -479
- package/dist/core/likec4.js.map +0 -1
- package/dist/core/maturity.js +0 -66
- package/dist/core/maturity.js.map +0 -1
- package/dist/core/openapi-merge.js +0 -552
- package/dist/core/openapi-merge.js.map +0 -1
- package/dist/core/openapi.js.map +0 -1
- package/dist/core/openspec-inventory.js +0 -1440
- package/dist/core/openspec-inventory.js.map +0 -1
- package/dist/core/path-safety.js.map +0 -1
- package/dist/core/provenance.js +0 -720
- package/dist/core/provenance.js.map +0 -1
- package/dist/core/records.js.map +0 -1
- package/dist/core/repo.js +0 -436
- package/dist/core/repo.js.map +0 -1
- package/dist/core/report.js.map +0 -1
- package/dist/core/spec.js +0 -481
- package/dist/core/spec.js.map +0 -1
- package/dist/core/staging.js +0 -890
- package/dist/core/staging.js.map +0 -1
- package/dist/core/status.js +0 -1104
- package/dist/core/status.js.map +0 -1
- package/dist/core/steps.js +0 -72
- package/dist/core/steps.js.map +0 -1
- package/dist/core/verify.js +0 -807
- package/dist/core/verify.js.map +0 -1
- package/dist/core/version.js.map +0 -1
- /package/dist/core/{concurrency.js → kernel/concurrency.js} +0 -0
- /package/dist/core/{records.js → kernel/records.js} +0 -0
|
@@ -1,13 +1,41 @@
|
|
|
1
1
|
# Migrating from OpenSpec
|
|
2
2
|
|
|
3
|
-
loam reads OpenSpec requirement Markdown from the outside: `### Requirement:` headings,
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
3
|
+
loam reads OpenSpec requirement Markdown from the outside: `### Requirement:` headings,
|
|
4
|
+
`#### Scenario:` blocks, and `## ADDED|MODIFIED|REMOVED Requirements` delta sections. Compatibility
|
|
5
|
+
is measured, not inferred from a successful directory walk.
|
|
6
|
+
|
|
7
|
+
## Version matrix
|
|
8
|
+
|
|
9
|
+
> **Compatibility boundary:** the v1.9 exact-commit corpus is certified for the parser and one-way
|
|
10
|
+
> migration boundary documented here. That boundary is the Markdown and the staged migration, not
|
|
11
|
+
> OpenSpec's behavior: `audit-openspec` inventories v1.8/v1.9 workspace shapes, and loam does not
|
|
12
|
+
> reimplement v1.9 validation, archive recovery, capability retirement, Store or agent-delivery
|
|
13
|
+
> semantics.
|
|
14
|
+
|
|
15
|
+
| OpenSpec source | Exact pin | loam coverage | Status |
|
|
16
|
+
|---|---|---|---|
|
|
17
|
+
| [v1.9.0 release](https://github.com/Fission-AI/OpenSpec/releases/tag/v1.9.0) | `2826b8889e5223a9a8095d4428b60b56597e1020`, released 2026-08-13 | Full living + active + archived Markdown corpus sweep, seven verbatim regression fixtures re-vendored at this commit, and the documented audit/mapping/staged-apply path. | **Certified for this documented parser/migration boundary.** It is not bidirectional OpenSpec compatibility. |
|
|
18
|
+
| [v1.8.0 release](https://github.com/Fission-AI/OpenSpec/releases/tag/v1.8.0) | `d57889664cab4f2f061d236ec3ff82a5578701bb`, released 2026-08-05 | Audit inventories or preserves modern planning roots, Stores, nested capability paths, config context/rules/references, custom schemas/templates, per-change metadata, `skip_specs`, `RENAMED`, and authored artifacts. | **Inventoried, and superseded by the certified v1.9.0 pin.** No v1.8 exact-release sweep of its own runs; the shapes v1.8 introduced are carried by the v1.9 corpus. |
|
|
19
|
+
| [v1.7.0 release](https://github.com/Fission-AI/OpenSpec/releases/tag/v1.7.0) | `4e16790d90d8f54d4773ad9a5e71a57cd9f1e86b` | The previously certified corpus, still swept file by file. | **Regression pin.** A parser change may not fix the current corpus by breaking the one somebody already migrated from. |
|
|
20
|
+
| Historical post-v1.7 `main` canary | `45cca5db6137ed209117cc70510eb3e057fb981b` | A third exact living + active + archived parser corpus. | **Regression pin only.** It is not a release and not a moving claim. |
|
|
21
|
+
|
|
22
|
+
The seven verbatim fixtures come from the v1.9.0 commit and run in routine CI. A scheduled/manual
|
|
23
|
+
matrix separately sweeps all three pinned commits across living, active, and archived spec trees:
|
|
24
|
+
v1.9.0 211 files / 746 requirements / 2317 scenarios; v1.7.0 207 / 739 / 2273; canary 209 / 742 /
|
|
25
|
+
2284. These test requirement/scenario parsing, not every v1.8/v1.9 workspace feature. The
|
|
26
|
+
[fixture provenance, immutable upstream paths, and checksums](https://github.com/ybotok/loam/blob/main/test/fixtures/openspec/README.md)
|
|
27
|
+
and the [compatibility tests](https://github.com/ybotok/loam/blob/main/test/openspec-compat.test.ts)
|
|
28
|
+
use absolute GitHub URLs because this guide is also shipped in the npm tarball while `test/` is not.
|
|
29
|
+
|
|
30
|
+
OpenSpec v1.10.0 (released 2026-08-19) changed no requirement-Markdown format, so the certified
|
|
31
|
+
v1.9.0 boundary also covers documents it writes; its workspace-level additions are inventoried like
|
|
32
|
+
the v1.8/v1.9 shapes above.
|
|
33
|
+
|
|
34
|
+
An audit result of `ready: true` means that the particular files the installed loam inspected
|
|
35
|
+
satisfy loam's documented migration checks. It is not a statement that every behavior of the
|
|
36
|
+
OpenSpec version which created them has been certified. In particular, a v1.8/v1.9 `.openspec.yaml`
|
|
37
|
+
field such as `retire_capabilities` is inventoried and preserved with the source tree, but loam does
|
|
38
|
+
not translate OpenSpec capability retirement into a loam service or feature lifecycle action.
|
|
11
39
|
|
|
12
40
|
## Start with a read-only audit
|
|
13
41
|
|
|
@@ -16,30 +44,50 @@ loam audit-openspec /path/to/repo
|
|
|
16
44
|
loam audit-openspec /path/to/repo --json
|
|
17
45
|
```
|
|
18
46
|
|
|
19
|
-
The input may be a repository containing `openspec/`, the `openspec/` directory itself, or a Store
|
|
47
|
+
The input may be a repository containing `openspec/`, the `openspec/` directory itself, or a Store
|
|
48
|
+
checkout. Modern `config.yaml`, Store metadata, nested capability folders, per-change
|
|
49
|
+
`.openspec.yaml`, `skip_specs: true`, and project custom schemas are inventoried.
|
|
20
50
|
|
|
21
|
-
For a **Store checkout** the planning shape decides the root and the store marker decides only the
|
|
51
|
+
For a **Store checkout** the planning shape decides the root and the store marker decides only the
|
|
52
|
+
kind: the planning content may sit at the checkout root or under `<checkout>/openspec`, and a
|
|
53
|
+
checkout with a `.openspec-store/store.yaml` but planning content in neither place is refused by
|
|
54
|
+
name rather than audited as an empty, compatible workspace. Planning content in *both* places is the
|
|
55
|
+
pre-existing `Ambiguous OpenSpec root` refusal, unchanged. A root that holds no living spec and no
|
|
56
|
+
active change at all is never `ready` (`openspec.workspace-empty`): a verdict over a corpus nobody
|
|
57
|
+
read is the one answer this command must not be able to give.
|
|
22
58
|
|
|
23
59
|
Audit separates four different facts:
|
|
24
60
|
|
|
25
61
|
- `readiness.living` — living specs are mechanically readable;
|
|
26
62
|
- `readiness.active` — active deltas will not silently strand content;
|
|
27
|
-
- capability/service mappings, active change/feature mappings, rename identities, and authored
|
|
28
|
-
|
|
63
|
+
- capability/service mappings, active change/feature mappings, rename identities, and authored
|
|
64
|
+
artifact dispositions — human decisions still required (`readiness.mappingsResolved`,
|
|
65
|
+
`changesResolved`, `renamesResolved`, and `dispositionsResolved` stay separate);
|
|
66
|
+
- `archiveDiagnostics` — anomalies in frozen history, reported but never allowed to block migration
|
|
67
|
+
of living/active truth.
|
|
29
68
|
|
|
30
|
-
An audit that completed exits successfully even when it found blockers. Root, YAML and I/O failures
|
|
69
|
+
An audit that completed exits successfully even when it found blockers. Root, YAML and I/O failures
|
|
70
|
+
still fail. This makes “the audit ran” distinct from `ready`/`mechanicallyCompatible`.
|
|
31
71
|
|
|
32
72
|
## Generate and complete the mapping
|
|
33
73
|
|
|
34
|
-
Audit is read-only by default. An explicit output path outside the OpenSpec source writes a
|
|
74
|
+
Audit is read-only by default. An explicit output path outside the OpenSpec source writes a
|
|
75
|
+
non-overwriting skeleton:
|
|
35
76
|
|
|
36
77
|
```bash
|
|
37
78
|
loam audit-openspec /path/to/repo --write-mapping /tmp/openspec-map.yaml
|
|
38
79
|
```
|
|
39
80
|
|
|
40
|
-
The mapping is versioned and bound to both the canonical planning root and a SHA-256 inventory
|
|
81
|
+
The mapping is versioned and bound to both the canonical planning root and a SHA-256 inventory
|
|
82
|
+
digest. That digest covers the **living tree and the active changes only** — not
|
|
83
|
+
`changes/archive/**`. Frozen history is reported as diagnostics that never gate, so letting a
|
|
84
|
+
colleague's typo fix inside an archived change invalidate a 900-line mapping somebody spent a day
|
|
85
|
+
completing was a cost with no safety behind it. An edit to a living spec or an active delta still
|
|
86
|
+
invalidates it, which is the case the binding exists for.
|
|
41
87
|
|
|
42
|
-
Digest and artifact paths are planning-root relative regardless of whether audit receives the
|
|
88
|
+
Digest and artifact paths are planning-root relative regardless of whether audit receives the
|
|
89
|
+
repository container or its `openspec/` directory (`@workspace/` is reserved for Store metadata
|
|
90
|
+
outside that root):
|
|
43
91
|
|
|
44
92
|
```yaml
|
|
45
93
|
version: 1
|
|
@@ -80,27 +128,54 @@ artifacts:
|
|
|
80
128
|
suggestedDisposition: preserve-as-legacy-checklist
|
|
81
129
|
```
|
|
82
130
|
|
|
83
|
-
`suggestedServices`, `suggestedFeature`, and `suggestedDisposition` are hints, not decisions. The
|
|
131
|
+
`suggestedServices`, `suggestedFeature`, and `suggestedDisposition` are hints, not decisions. The
|
|
132
|
+
fields that count are `services`, an explicit `changes.<OpenSpec-id>.feature` plus `title`,
|
|
133
|
+
`requirementId` where needed, and `disposition`. Feature ids use loam's `<word>-<number>` grammar
|
|
134
|
+
and must be unique across active changes.
|
|
84
135
|
|
|
85
136
|
### Capability → service is a human decision
|
|
86
137
|
|
|
87
|
-
OpenSpec's unit is a capability; loam's unit is a service bound to the C4 landscape. A nested
|
|
138
|
+
OpenSpec's unit is a capability; loam's unit is a service bound to the C4 landscape. A nested
|
|
139
|
+
capability id stays nested (`payments/refunds`) rather than collapsing to `payments`. Mapping scope
|
|
140
|
+
is the union of living capabilities and capabilities found only in active deltas, so a brand-new
|
|
141
|
+
nested capability cannot disappear merely because it has not reached `specs/` yet.
|
|
142
|
+
|
|
143
|
+
The mapping of requirements to services stays a human decision — but the capability ids and their
|
|
144
|
+
associations are preserved mechanically. Apply declares every living and active-horizon capability
|
|
145
|
+
id in the target's `architecture/capabilities.yaml`, and every routed requirement carries a
|
|
146
|
+
`Capability: <id>` line joining it back to that declaration, so migration is no longer the step
|
|
147
|
+
where the analyst's capability structure is lost to everything but `legacy/`.
|
|
148
|
+
`loam list capabilities` in the staged target answers "what realizes payments/refunds now" from day
|
|
149
|
+
one.
|
|
88
150
|
|
|
89
151
|
- With one selected service, every requirement in the capability goes there.
|
|
90
|
-
- With several selected services, `requirementServices` must allocate every living **and active**
|
|
91
|
-
|
|
152
|
+
- With several selected services, `requirementServices` must allocate every living **and active**
|
|
153
|
+
requirement to one or more of them. Apply refuses an omitted allocation or a service outside the
|
|
154
|
+
declared list.
|
|
155
|
+
- If two mapped capabilities would create the same heading/`Requirement-ID` in one service, apply
|
|
156
|
+
refuses instead of guessing which requirement wins.
|
|
92
157
|
|
|
93
158
|
### Change → feature is explicit
|
|
94
159
|
|
|
95
|
-
Every active OpenSpec change gets one `changes.<id>` entry. Fill both the loam feature id and the
|
|
160
|
+
Every active OpenSpec change gets one `changes.<id>` entry. Fill both the loam feature id and the
|
|
161
|
+
human title. The skeleton deliberately leaves `feature: null` next to a deterministic suggestion;
|
|
162
|
+
suggestions never make a migration ready. Unknown OpenSpec change ids, malformed feature ids, blank
|
|
163
|
+
titles, and duplicate feature ids block apply.
|
|
96
164
|
|
|
97
165
|
### RENAMED keeps identity
|
|
98
166
|
|
|
99
|
-
Audit parses every OpenSpec FROM/TO pair and gives it a stable mapping key. FROM must select exactly
|
|
167
|
+
Audit parses every OpenSpec FROM/TO pair and gives it a stable mapping key. FROM must select exactly
|
|
168
|
+
one living requirement in that delta's capability. If that requirement already has a
|
|
169
|
+
`Requirement-ID`, the skeleton reuses it and refuses a replacement; otherwise assign a valid id.
|
|
170
|
+
Apply places that id on the staged living source and emits a `MODIFIED` requirement with the TO
|
|
171
|
+
heading, the same body/scenarios, and an `OpenSpec-Living-Source` annotation. Conflicting targets,
|
|
172
|
+
duplicate sources/targets, identity collisions, and multi-change rename chains block instead of
|
|
173
|
+
being flattened to `REMOVED` + `ADDED`.
|
|
100
174
|
|
|
101
175
|
### Authored artifacts require explicit disposition
|
|
102
176
|
|
|
103
|
-
Every active `proposal.md`, `design.md`, and `tasks.md` appears in the mapping with
|
|
177
|
+
Every active `proposal.md`, `design.md`, and `tasks.md` appears in the mapping with
|
|
178
|
+
`disposition: null` until a human chooses. A suggestion does not make migration ready.
|
|
104
179
|
|
|
105
180
|
Typical choices are:
|
|
106
181
|
|
|
@@ -118,7 +193,8 @@ loam migrate-openspec /path/to/repo --map /tmp/openspec-map.yaml
|
|
|
118
193
|
loam migrate-openspec /path/to/repo --map /tmp/openspec-map.yaml --json
|
|
119
194
|
```
|
|
120
195
|
|
|
121
|
-
`--mapping` remains a deprecated spelling of `--map`. Dry-run is always the default and never
|
|
196
|
+
`--mapping` remains a deprecated spelling of `--map`. Dry-run is always the default and never
|
|
197
|
+
creates the target.
|
|
122
198
|
|
|
123
199
|
Writing requires both flags:
|
|
124
200
|
|
|
@@ -129,56 +205,130 @@ loam migrate-openspec /path/to/repo \
|
|
|
129
205
|
--target /tmp/loam-migration-review
|
|
130
206
|
```
|
|
131
207
|
|
|
132
|
-
Before apply, loam repeats the audit and compares the fresh source root/digest with the mapping. Any
|
|
208
|
+
Before apply, loam repeats the audit and compares the fresh source root/digest with the mapping. Any
|
|
209
|
+
living or active source edit since review invalidates the mapping. The target must be absent or
|
|
210
|
+
empty, must not overlap the OpenSpec source, and **must not sit inside a live loam fleet**: a target
|
|
211
|
+
under the `docsDir` of a governing `loam.json` — or under any directory holding
|
|
212
|
+
`architecture/landscape.likec4` — is refused, because every staged feature would otherwise be
|
|
213
|
+
enumerated by `loam list` and `loam validate --all` as a phantom feature of the governing fleet. A
|
|
214
|
+
sibling of `docsDir` is fine. Writes are staged and swapped with rollback; source files and live
|
|
215
|
+
loam docs are never modified, and every refusal above leaves the target directory absent rather than
|
|
216
|
+
half-written.
|
|
133
217
|
|
|
134
218
|
The target contains:
|
|
135
219
|
|
|
136
|
-
- `services/<service>/spec.md` with mapped living requirements and `status: draft
|
|
220
|
+
- `services/<service>/spec.md` with mapped living requirements and `status: draft`, each requirement
|
|
221
|
+
carrying a `Capability:` line for the capability it was routed from;
|
|
222
|
+
- `architecture/capabilities.yaml` declaring the union of living and active-horizon capability ids
|
|
223
|
+
(empty bodies — no description is invented, the authored `## Purpose` prose stays verbatim under
|
|
224
|
+
`legacy/`);
|
|
137
225
|
- `features/<FEAT>-<slug>/intent.md` for every active change;
|
|
138
|
-
- `features/<FEAT>-<slug>/specs/<service>/spec.md` with routed ADDED/MODIFIED/REMOVED sections for
|
|
139
|
-
|
|
140
|
-
-
|
|
226
|
+
- `features/<FEAT>-<slug>/specs/<service>/spec.md` with routed ADDED/MODIFIED/REMOVED sections for
|
|
227
|
+
every non-`skip_specs` change;
|
|
228
|
+
- feature ADR/legacy files according to the explicit proposal/design/tasks dispositions, plus an
|
|
229
|
+
exact read-only copy of the complete source change tree under `legacy/openspec/`, **and the living
|
|
230
|
+
capability tree verbatim under `legacy/openspec/specs/`** — `## Purpose` prose, section prose
|
|
231
|
+
between a heading and its first requirement, and capability `design.md` have no loam equivalent,
|
|
232
|
+
so they are copied rather than converted and nothing is silently lost;
|
|
233
|
+
- `migration-plan.json` with active changes, mappings, archive diagnostics and every artifact
|
|
234
|
+
disposition;
|
|
141
235
|
- normalized `mapping.yaml`;
|
|
142
236
|
- `FOLLOW-UP.md` naming the work that still blocks a trustworthy fleet;
|
|
143
|
-
- and the target's own `loam.json` (`{"docsDir": "."}`), `AGENTS.md`, and an **empty**
|
|
144
|
-
|
|
145
|
-
|
|
237
|
+
- and the target's own `loam.json` (`{"docsDir": "."}`), `AGENTS.md`, and an **empty**
|
|
238
|
+
`architecture/landscape.likec4`. The target is therefore a standalone docs repo, which is what
|
|
239
|
+
makes `FOLLOW-UP.md`'s instructions runnable where they are written: `loam validate --all`,
|
|
240
|
+
`loam status`, `loam rebase <FEAT>` and `loam doctor` all work inside it. The landscape is laid
|
|
241
|
+
down empty on purpose — OpenSpec carries no topology, and a generated one would be a guess
|
|
242
|
+
presented as the map — so every staged service surfaces as exactly one
|
|
243
|
+
`landscape.service-unmodelled`, which is follow-up item one.
|
|
244
|
+
|
|
245
|
+
This is deliberately called **staged migration docs**, not a finished or green loam repository.
|
|
246
|
+
Apply uses the reviewed feature ids and materializes active changes, but it does not invent C4
|
|
247
|
+
topology/deltas, OpenAPI contracts, source provenance, or vouch evidence. `skip_specs: true` changes
|
|
248
|
+
still receive intent and legacy artifacts but no feature spec delta. Every feature therefore remains
|
|
249
|
+
review material until the follow-up checklist is complete.
|
|
146
250
|
|
|
147
251
|
## What carries over mechanically
|
|
148
252
|
|
|
149
|
-
The exact-commit corpus gate checks living, active, and archived spec trees.
|
|
253
|
+
The exact-commit corpus gate checks living, active, and archived spec trees. The certified corpus is
|
|
254
|
+
the OpenSpec v1.9.0 release `2826b888`: 211 Markdown files, 746 requirements, and 2317 scenarios.
|
|
255
|
+
The v1.7.0 release `4e16790` (207, 739, 2273) and the post-v1.7 main canary `45cca5d` (209, 742,
|
|
256
|
+
2284) remain as regression sweeps. All three sweeps check parse/serialize/parse stability of
|
|
257
|
+
requirement content. Nested bullets, fenced markup, removal prose, CRLF, BOM and non-ASCII names
|
|
258
|
+
survive. `REMOVED` requirements with no scenarios remain legal.
|
|
150
259
|
|
|
151
|
-
Modern ADDED/MODIFIED/REMOVED deltas are readable, but “readable” is not “ready”: routing to
|
|
260
|
+
Modern ADDED/MODIFIED/REMOVED deltas are readable, but “readable” is not “ready”: routing to
|
|
261
|
+
services, loam frontmatter, Operations/Covers links and feature identity still require decisions.
|
|
152
262
|
|
|
153
263
|
## Shapes that need repair or review
|
|
154
264
|
|
|
155
|
-
- **Mixed legacy complete-state deltas.** Any BASE requirement stranded under `## Behavior`,
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
265
|
+
- **Mixed legacy complete-state deltas.** Any BASE requirement stranded under `## Behavior`,
|
|
266
|
+
`## Error Handling` or another prose heading is reported even if the same file also contains a
|
|
267
|
+
valid ADDED/MODIFIED section. Re-home it before conversion.
|
|
268
|
+
- **`## Requirements` inside an active change delta** is a **blocker**
|
|
269
|
+
(`openspec.change-quoted-requirements`), which needs saying plainly because it is the shape
|
|
270
|
+
OpenSpec's own living-spec template mandates and it looks correct. In a *living* spec that heading
|
|
271
|
+
is the requirements section; in a *change delta* it is the one explicitly non-merging quote
|
|
272
|
+
section, so requirements sitting under it stage nothing. loam refuses rather than counting
|
|
273
|
+
requirements it cannot route — which is also what guarantees the per-change requirement counts in
|
|
274
|
+
`migration-plan.json` equal what apply actually stages. Re-home them under `ADDED`, `MODIFIED` or
|
|
275
|
+
`REMOVED`.
|
|
276
|
+
- **Markdown under `specs/` named neither `spec.md` nor `design.md`**
|
|
277
|
+
(`openspec.nonstandard-living-spec`) — a `Spec.md` on a case-sensitive filesystem, a
|
|
278
|
+
`spec.markdown`, a hand-split `part-2.md`. No capability reads it, so migrating would leave its
|
|
279
|
+
requirements behind. This is the living twin of the same check on change specs.
|
|
280
|
+
- **Dot-prefixed directories under `changes/`** (`openspec.hidden-change-directory`) — a
|
|
281
|
+
`.wip-refunds/` convention. They are not enumerated as changes, so nothing under them migrates.
|
|
282
|
+
loam blocks rather than walking them: rename or move the directory before migrating, and its
|
|
283
|
+
content is never silently dropped. Under `changes/archive/` the same finding is an archive
|
|
284
|
+
diagnostic and does not gate, because frozen history never blocks.
|
|
285
|
+
- **An ISO-8601 `created` timestamp** in `.openspec.yaml` is a valid date. It used to fail the whole
|
|
286
|
+
workspace; a calendar date with an optional time and offset is now accepted.
|
|
287
|
+
- **Spec-less changes.** They are valid only when a present, valid `.openspec.yaml` explicitly sets
|
|
288
|
+
`skip_specs: true` and its named built-in or project custom schema resolves. A custom artifact
|
|
289
|
+
graph never implies this opt-out by itself. Otherwise an active zero-delta change is a blocker.
|
|
290
|
+
Explicit `skip_specs` suppresses generated feature specs while preserving intent, metadata, and
|
|
291
|
+
authored legacy material. **This is the blocker a live workspace hits first**
|
|
292
|
+
(`openspec.change-no-specs`): a change still at the proposal stage of OpenSpec's artifact pipeline
|
|
293
|
+
has a `proposal.md` and no `specs/` tree yet, which is normal upstream and unmigratable here.
|
|
294
|
+
Finish it, archive it, or migrate from a commit that predates it — the audit names the directory.
|
|
295
|
+
- **v1.8/v1.9 lifecycle metadata.** `retire_capabilities` changes what OpenSpec archive is allowed
|
|
296
|
+
to delete when the last requirement is removed. loam records the metadata field and preserves the
|
|
297
|
+
exact change tree, but does not infer that an OpenSpec capability is a loam service or translate
|
|
298
|
+
retirement into a loam deletion. Review that intent manually before apply and express any loam
|
|
299
|
+
retirement through loam's own modeled change.
|
|
300
|
+
- **Malformed RENAMED.** A rename-only delta is not “empty”, but every section must supply a FROM/TO
|
|
301
|
+
pair and every active pair needs an identity decision.
|
|
302
|
+
- **External Store pointer.** A config-only code repo with `store: <id>` identifies external
|
|
303
|
+
planning. Audit the registered Store checkout itself; loam does not guess a machine-local registry
|
|
304
|
+
path.
|
|
305
|
+
- **Frozen archive history.** Legacy shapes are diagnostics only. Keep `changes/archive/` read-only
|
|
306
|
+
where it is; do not reconstruct it as loam `features/archive/`, whose entries imply loam computed
|
|
307
|
+
and snapshotted the merge.
|
|
164
308
|
|
|
165
309
|
## What must be added after staged apply
|
|
166
310
|
|
|
167
|
-
- Truthful `sources:` paths from each service repository, followed by human `loam vouch`; staged
|
|
168
|
-
|
|
311
|
+
- Truthful `sources:` paths from each service repository, followed by human `loam vouch`; staged
|
|
312
|
+
specs intentionally remain `status: draft`.
|
|
313
|
+
- `Operations:` links to provider OpenAPI `operationId`s, and `Covers:` links where architecture
|
|
314
|
+
requirements are created.
|
|
169
315
|
- `architecture/landscape.likec4`, service `model.likec4`, and explicit fleet relationships.
|
|
170
|
-
- Service OpenAPI contracts and provider-before-consumer
|
|
171
|
-
|
|
172
|
-
-
|
|
316
|
+
- Service OpenAPI contracts and provider-before-consumer sequencing where inbound edges already name
|
|
317
|
+
operations.
|
|
318
|
+
- LikeC4 and OpenAPI deltas for the already mapped active feature ids (`FEAT-12`, `BUG-42`, and so
|
|
319
|
+
on); OpenSpec's prose change id/title remains visible in the staged slug, annotations, plan, and
|
|
320
|
+
preserved source tree.
|
|
321
|
+
- Human disposition of `config.yaml.context`, per-artifact rules, custom schemas/templates,
|
|
322
|
+
Stores/references, Purpose prose and generated tool instructions.
|
|
173
323
|
|
|
174
324
|
## Modern artifact disposition guide
|
|
175
325
|
|
|
176
326
|
| OpenSpec artifact | Migration treatment |
|
|
177
327
|
|---|---|
|
|
178
328
|
| `config.yaml` (`schema`, `context`, `rules`, optional `store`) | Inventory and review. Move durable operating context into the docs contract; do not silently convert workflow rules into different validator semantics. |
|
|
179
|
-
| `specs/<nested/capability>/spec.md` | Map requirements to one or more services. Apply stages combined `services/<svc>/spec.md` files. |
|
|
329
|
+
| `specs/<nested/capability>/spec.md` | Map requirements to one or more services. Apply stages combined `services/<svc>/spec.md` files, declares the capability id in `architecture/capabilities.yaml`, and stamps each routed requirement with a `Capability:` line. |
|
|
180
330
|
| `specs/<capability>/design.md` | Review as a service ADR; do not mark accepted merely because the file existed. |
|
|
181
|
-
| `changes/<id>/.openspec.yaml` | Preserve schema/`skip_specs`/created
|
|
331
|
+
| `changes/<id>/.openspec.yaml` | Preserve schema/`skip_specs`/created and all inventoried field names in the plan and exact feature-local legacy tree. Current fields such as `retire_capabilities` are not silently converted into loam lifecycle actions. |
|
|
182
332
|
| `changes/<id>/proposal.md` | Explicit `convert-to-intent`, or retain/manual-review in feature legacy material; the original is also preserved. |
|
|
183
333
|
| `changes/<id>/specs/**/spec.md` | Validate and route ADDED/MODIFIED/REMOVED requirements into the mapped feature/service delta, preserving delta kinds; keep the original beneath `legacy/openspec/`. |
|
|
184
334
|
| `changes/<id>/tasks.md` | Preserve as a non-authoritative feature-local legacy checklist with its explicit disposition until reviewed. |
|
|
@@ -192,11 +342,20 @@ Modern ADDED/MODIFIED/REMOVED deltas are readable, but “readable” is not “
|
|
|
192
342
|
|
|
193
343
|
The staged target has two halves, and only one of them moves.
|
|
194
344
|
|
|
195
|
-
1. Work `FOLLOW-UP.md` until `loam validate --all` **inside the target** is green. That is the gate;
|
|
345
|
+
1. Work `FOLLOW-UP.md` until `loam validate --all` **inside the target** is green. That is the gate;
|
|
346
|
+
nothing before it means anything, because a staged target is deliberately red on arrival.
|
|
196
347
|
2. Move `services/` and `features/` into the live fleet.
|
|
197
|
-
3. Leave the rest behind: `legacy/`, `mapping.yaml`, `migration-plan.json`, `FOLLOW-UP.md`, and the
|
|
198
|
-
|
|
348
|
+
3. Leave the rest behind: `legacy/`, `mapping.yaml`, `migration-plan.json`, `FOLLOW-UP.md`, and the
|
|
349
|
+
target's own `loam.json` and `AGENTS.md` are review residue. They exist so a human can check the
|
|
350
|
+
conversion, and the live fleet has its own copies of the last two.
|
|
351
|
+
4. Remove OpenSpec's generated skills, commands and instruction blocks from every repo, so agents
|
|
352
|
+
stop receiving two live process contracts.
|
|
199
353
|
|
|
200
354
|
## Migration is one-way
|
|
201
355
|
|
|
202
|
-
loam reads OpenSpec; it never writes back into the OpenSpec workspace. Loam serialization does not
|
|
356
|
+
loam reads OpenSpec; it never writes back into the OpenSpec workspace. Loam serialization does not
|
|
357
|
+
preserve OpenSpec's required `## Purpose` and `## Requirements` framing as an OpenSpec round-trip
|
|
358
|
+
contract — but the source framing is not lost either: the verbatim living tree under
|
|
359
|
+
`legacy/openspec/specs/` is what makes "no authored artifact is silently lost" cover living
|
|
360
|
+
capabilities and not only change trees. Migrate into a separate target, review it, cut over once,
|
|
361
|
+
and retire the old tooling only after the staged follow-up is complete.
|
package/QUICKSTART.md
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
# loam quick start
|
|
2
|
+
|
|
3
|
+
From installation to the first agent-driven change, with the smallest useful setup. This guide
|
|
4
|
+
uses one application and a local docs directory. A real fleet normally keeps that directory in a
|
|
5
|
+
separate repository; the commands and chat flow stay the same.
|
|
6
|
+
|
|
7
|
+
## 1. Install
|
|
8
|
+
|
|
9
|
+
loam requires Node 22.22.3 or newer.
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npm install -g @ybotok/loam
|
|
13
|
+
loam --version
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
A project-local install works too: `npm install --save-dev @ybotok/loam`, then replace `loam` below
|
|
17
|
+
with `npx loam`.
|
|
18
|
+
|
|
19
|
+
## 2. Wire one project
|
|
20
|
+
|
|
21
|
+
Run this in the code repository you want to govern:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
loam init --docs loam-docs --create --service commerce-app
|
|
25
|
+
loam doctor
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
This creates a docs repo under `loam-docs/`, binds the current code checkout to the governed
|
|
29
|
+
boundary `commerce-app`, and installs command and Agent Skill pointers for the AI tools it detects.
|
|
30
|
+
Commit the generated `loam.json`, agent files and docs directory. Use your real stable service or
|
|
31
|
+
application id instead of `commerce-app`.
|
|
32
|
+
|
|
33
|
+
`--create` is only for a new docs repo. To join an existing shared docs repo, use:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
loam init --docs ../architecture-docs --service commerce-app
|
|
37
|
+
loam doctor
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## 3. Adopt what already exists
|
|
41
|
+
|
|
42
|
+
In chat, use the explicit entry point:
|
|
43
|
+
|
|
44
|
+
```text
|
|
45
|
+
/loam-adopt commerce-app
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
The agent loads the version-matched protocol, asks loam for an adoption brief, reads the code, writes
|
|
49
|
+
the baseline as draft, and validates it. It must report what it did not inspect or could not prove.
|
|
50
|
+
The agent does not vouch for its own work. After reviewing the baseline, a person runs:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
loam vouch --service commerce-app
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Most hosts use `/loam-adopt`; Gemini uses `/loam:adopt`, Amazon Q uses `@loam-adopt`, and a
|
|
57
|
+
skills-only host can use `$loam-adopt`. A natural-language request such as “adopt commerce-app into
|
|
58
|
+
loam” may load the same skill automatically, but the explicit spelling is the predictable path.
|
|
59
|
+
|
|
60
|
+
## 4. Make the first change
|
|
61
|
+
|
|
62
|
+
For this one-project setup, stay in the wired code repo: its `loam.json` resolves `loam-docs/`, and
|
|
63
|
+
its generated agent entries are already present. In a separately cloned team docs repo, run
|
|
64
|
+
`loam init` there once to install that repo's own entries before starting chat.
|
|
65
|
+
|
|
66
|
+
```text
|
|
67
|
+
/loam-feature FEAT-101 "Split payments"
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
The agent explores the living model before it proposes anything, scaffolds the feature, authors its
|
|
71
|
+
intent and deltas, and validates the result. Then use the remaining entry points as the work moves:
|
|
72
|
+
|
|
73
|
+
```text
|
|
74
|
+
/loam-implement FEAT-101 commerce-app
|
|
75
|
+
/loam-check FEAT-101
|
|
76
|
+
/loam-verify FEAT-101
|
|
77
|
+
/loam-ship FEAT-101
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
`loam-implement` runs in each affected code checkout. `loam-check`, `loam-verify` and `loam-ship`
|
|
81
|
+
read the files and machine envelopes rather than relying on conversational memory. Shipping begins
|
|
82
|
+
with an archive dry run and still waits for the code merge and any human-only decision.
|
|
83
|
+
|
|
84
|
+
At any point, this is the reliable way to resume:
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
loam status --json
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Its ordered `next[]` is the work queue. The agent runs an entry only when `next[].execution.runnable`
|
|
91
|
+
is true; edits, work in another checkout and human review stay visibly different.
|
|
92
|
+
|
|
93
|
+
## 5. When something behaves badly
|
|
94
|
+
|
|
95
|
+
Use the support entry point; it is not another lifecycle step:
|
|
96
|
+
|
|
97
|
+
```text
|
|
98
|
+
/loam-report
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Or ask naturally: “Create a loam problem report for what just happened.” The generated
|
|
102
|
+
`loam-report` Agent Skill preserves the symptom, collects `loam --version`, `loam doctor --json`,
|
|
103
|
+
relevant status and the smallest safe reproduction, and writes a separate file:
|
|
104
|
+
|
|
105
|
+
```text
|
|
106
|
+
loam-reports/YYYY-MM-DD-short-symptom.md
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
The report records expected versus actual behavior, stable codes, relevant locations, write state,
|
|
110
|
+
classification and missing evidence. It replaces secrets with `<redacted>`, prefers repo-relative
|
|
111
|
+
paths, does not copy source/spec bodies, does not retry a writer merely to reproduce it, and never
|
|
112
|
+
uploads or submits anything automatically. Review the file before sharing or committing it.
|
|
113
|
+
|
|
114
|
+
If the report command or skill file is missing after an upgrade, rerun `loam init`. loam refreshes
|
|
115
|
+
only pointers whose recorded digest still matches; a file your team edited remains untouched.
|
|
116
|
+
|
|
117
|
+
## What to read next
|
|
118
|
+
|
|
119
|
+
- [WORKFLOW.md](WORKFLOW.md) explains the complete lifecycle and human/agent boundary.
|
|
120
|
+
- [SCHEMA.md](SCHEMA.md) defines every docs-repo artifact and join.
|
|
121
|
+
- [COMPARISON.md](COMPARISON.md) explains where loam fits beside neighboring tools.
|
|
122
|
+
- [MIGRATING-from-OpenSpec.md](MIGRATING-from-OpenSpec.md) covers an OpenSpec migration.
|
|
123
|
+
|
|
124
|
+
Three rules prevent most surprises: use `--create` only once, let a human vouch, and branch on JSON
|
|
125
|
+
codes rather than message prose.
|