@ybotok/loam 0.1.0-beta.3 → 0.2.0-alpha.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +5992 -82
- package/COMPARISON.md +168 -63
- package/CONTRIBUTING.md +121 -0
- package/MIGRATING-from-OpenSpec.md +238 -55
- package/QUICKSTART.md +302 -0
- package/README.md +653 -144
- package/ROADMAP.md +1035 -0
- package/SCHEMA.md +3916 -263
- package/SECURITY.md +21 -3
- package/WORKFLOW.md +927 -0
- package/dist/cli.js +133 -21
- package/dist/cli.js.map +1 -1
- package/dist/commands/adopt/adopt.js +204 -0
- package/dist/commands/adopt/adopt.js.map +1 -0
- package/dist/commands/adopt/render.js +309 -0
- package/dist/commands/adopt/render.js.map +1 -0
- package/dist/commands/archive/archive.js +74 -0
- package/dist/commands/archive/archive.js.map +1 -0
- package/dist/commands/archive/closing.js +42 -0
- package/dist/commands/archive/closing.js.map +1 -0
- package/dist/commands/archive/plan/contracts/asyncapi.js +172 -0
- package/dist/commands/archive/plan/contracts/asyncapi.js.map +1 -0
- package/dist/commands/archive/plan/contracts/consumers.js +56 -0
- package/dist/commands/archive/plan/contracts/consumers.js.map +1 -0
- package/dist/commands/archive/plan/contracts/openapi.js +193 -0
- package/dist/commands/archive/plan/contracts/openapi.js.map +1 -0
- package/dist/commands/archive/plan/contracts/verdict-lines.js +103 -0
- package/dist/commands/archive/plan/contracts/verdict-lines.js.map +1 -0
- package/dist/commands/archive/plan/document/head.js +151 -0
- package/dist/commands/archive/plan/document/head.js.map +1 -0
- package/dist/commands/archive/plan/document/links.js +284 -0
- package/dist/commands/archive/plan/document/links.js.map +1 -0
- package/dist/commands/archive/plan/document/run.js +136 -0
- package/dist/commands/archive/plan/document/run.js.map +1 -0
- package/dist/commands/archive/plan/gate.js +319 -0
- package/dist/commands/archive/plan/gate.js.map +1 -0
- package/dist/commands/archive/plan/landscape.js +298 -0
- package/dist/commands/archive/plan/landscape.js.map +1 -0
- package/dist/commands/archive/plan/model/extending.js +85 -0
- package/dist/commands/archive/plan/model/extending.js.map +1 -0
- package/dist/commands/archive/plan/refusal.js +106 -0
- package/dist/commands/archive/plan/refusal.js.map +1 -0
- package/dist/commands/archive/plan/specs.js +318 -0
- package/dist/commands/archive/plan/specs.js.map +1 -0
- package/dist/commands/archive/plan/state.js +30 -0
- package/dist/commands/archive/plan/state.js.map +1 -0
- package/dist/commands/archive/run.js +355 -0
- package/dist/commands/archive/run.js.map +1 -0
- package/dist/commands/archive/shipped.js +49 -0
- package/dist/commands/archive/shipped.js.map +1 -0
- package/dist/commands/context/context.js +166 -0
- package/dist/commands/context/context.js.map +1 -0
- package/dist/commands/context/print.js +305 -0
- package/dist/commands/context/print.js.map +1 -0
- package/dist/commands/delta/delta.js +367 -0
- package/dist/commands/delta/delta.js.map +1 -0
- package/dist/commands/delta/print.js +221 -0
- package/dist/commands/delta/print.js.map +1 -0
- package/dist/commands/dependencies.js +6 -8
- package/dist/commands/dependencies.js.map +1 -1
- package/dist/commands/diff/diff.js +86 -0
- package/dist/commands/diff/diff.js.map +1 -0
- package/dist/commands/diff/print.js +38 -0
- package/dist/commands/diff/print.js.map +1 -0
- package/dist/commands/doctor.js +65 -5
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/explain/explain.js +227 -0
- package/dist/commands/explain/explain.js.map +1 -0
- package/dist/commands/explore.js +39 -28
- package/dist/commands/explore.js.map +1 -1
- package/dist/commands/gate/gate.js +152 -0
- package/dist/commands/gate/gate.js.map +1 -0
- package/dist/commands/gate/print.js +66 -0
- package/dist/commands/gate/print.js.map +1 -0
- package/dist/commands/gherkin/commit.js +105 -0
- package/dist/commands/gherkin/commit.js.map +1 -0
- package/dist/commands/gherkin/gherkin.js +262 -0
- package/dist/commands/gherkin/gherkin.js.map +1 -0
- package/dist/commands/gherkin/reconcile.js +146 -0
- package/dist/commands/gherkin/reconcile.js.map +1 -0
- package/dist/commands/gherkin/render.js +77 -0
- package/dist/commands/gherkin/render.js.map +1 -0
- package/dist/commands/init/example.js +204 -0
- package/dist/commands/init/example.js.map +1 -0
- package/dist/commands/init/first-hour.js +72 -0
- package/dist/commands/init/first-hour.js.map +1 -0
- package/dist/commands/{init.js → init/init.js} +142 -71
- package/dist/commands/init/init.js.map +1 -0
- package/dist/commands/init/mcp.js +131 -0
- package/dist/commands/init/mcp.js.map +1 -0
- package/dist/commands/init/options.js +78 -0
- package/dist/commands/init/options.js.map +1 -0
- package/dist/commands/instructions.js +72 -14
- package/dist/commands/instructions.js.map +1 -1
- package/dist/commands/list/campaign/campaign.js +63 -0
- package/dist/commands/list/campaign/campaign.js.map +1 -0
- package/dist/commands/list/campaign/owners.js +65 -0
- package/dist/commands/list/campaign/owners.js.map +1 -0
- package/dist/commands/list/json.js +155 -0
- package/dist/commands/list/json.js.map +1 -0
- package/dist/commands/list/list.js +358 -0
- package/dist/commands/list/list.js.map +1 -0
- package/dist/commands/list/print.js +344 -0
- package/dist/commands/list/print.js.map +1 -0
- package/dist/commands/list/review.js +120 -0
- package/dist/commands/list/review.js.map +1 -0
- package/dist/commands/list/suites/suites.js +140 -0
- package/dist/commands/list/suites/suites.js.map +1 -0
- package/dist/commands/list/views.js +108 -0
- package/dist/commands/list/views.js.map +1 -0
- package/dist/commands/mcp/dispatch.js +238 -0
- package/dist/commands/mcp/dispatch.js.map +1 -0
- package/dist/commands/mcp/mcp.js +75 -0
- package/dist/commands/mcp/mcp.js.map +1 -0
- package/dist/commands/mcp/serve.js +55 -0
- package/dist/commands/mcp/serve.js.map +1 -0
- package/dist/commands/migrate-openspec/materialize/active.js +175 -0
- package/dist/commands/migrate-openspec/materialize/active.js.map +1 -0
- package/dist/commands/migrate-openspec/materialize/feature.js +41 -0
- package/dist/commands/migrate-openspec/materialize/feature.js.map +1 -0
- package/dist/commands/migrate-openspec/materialize/living.js +62 -0
- package/dist/commands/migrate-openspec/materialize/living.js.map +1 -0
- package/dist/commands/migrate-openspec/materialize/stage.js +143 -0
- package/dist/commands/migrate-openspec/materialize/stage.js.map +1 -0
- package/dist/commands/migrate-openspec/materialize/target.js +219 -0
- package/dist/commands/migrate-openspec/materialize/target.js.map +1 -0
- package/dist/commands/migrate-openspec/migrate-openspec.js +142 -0
- package/dist/commands/migrate-openspec/migrate-openspec.js.map +1 -0
- package/dist/commands/migrate-openspec/openspec/decisions.js +86 -0
- package/dist/commands/migrate-openspec/openspec/decisions.js.map +1 -0
- package/dist/commands/migrate-openspec/openspec/error.js +18 -0
- package/dist/commands/migrate-openspec/openspec/error.js.map +1 -0
- package/dist/commands/migrate-openspec/openspec/mapping.js +162 -0
- package/dist/commands/migrate-openspec/openspec/mapping.js.map +1 -0
- package/dist/commands/migrate-openspec/openspec/paths.js +40 -0
- package/dist/commands/migrate-openspec/openspec/paths.js.map +1 -0
- package/dist/commands/migrate-openspec/openspec/read.js +49 -0
- package/dist/commands/migrate-openspec/openspec/read.js.map +1 -0
- package/dist/commands/migrate-openspec/print.js +89 -0
- package/dist/commands/migrate-openspec/print.js.map +1 -0
- package/dist/commands/new/capability-template.js +118 -0
- package/dist/commands/new/capability-template.js.map +1 -0
- package/dist/commands/new/commit.js +62 -0
- package/dist/commands/new/commit.js.map +1 -0
- package/dist/commands/new/modifies.js +206 -0
- package/dist/commands/new/modifies.js.map +1 -0
- package/dist/commands/new/new.js +328 -0
- package/dist/commands/new/new.js.map +1 -0
- package/dist/commands/new/templates.js +279 -0
- package/dist/commands/new/templates.js.map +1 -0
- package/dist/commands/open.js +199 -0
- package/dist/commands/open.js.map +1 -0
- package/dist/commands/policy/format.js +152 -0
- package/dist/commands/policy/format.js.map +1 -0
- package/dist/commands/{docs-repo-gate.js → policy/gate.js} +38 -11
- package/dist/commands/policy/gate.js.map +1 -0
- package/dist/commands/rebase/edit.js +106 -0
- package/dist/commands/rebase/edit.js.map +1 -0
- package/dist/commands/rebase/living.js +185 -0
- package/dist/commands/rebase/living.js.map +1 -0
- package/dist/commands/rebase/plan.js +245 -0
- package/dist/commands/rebase/plan.js.map +1 -0
- package/dist/commands/rebase/rebase.js +300 -0
- package/dist/commands/rebase/rebase.js.map +1 -0
- package/dist/commands/seed/commit.js +221 -0
- package/dist/commands/seed/commit.js.map +1 -0
- package/dist/commands/seed/plan.js +278 -0
- package/dist/commands/seed/plan.js.map +1 -0
- package/dist/commands/seed/seed.js +174 -0
- package/dist/commands/seed/seed.js.map +1 -0
- package/dist/commands/show/feature.js +182 -0
- package/dist/commands/show/feature.js.map +1 -0
- package/dist/commands/show/introduced.js +157 -0
- package/dist/commands/show/introduced.js.map +1 -0
- package/dist/commands/show/marks.js +53 -0
- package/dist/commands/show/marks.js.map +1 -0
- package/dist/commands/show/service.js +239 -0
- package/dist/commands/show/service.js.map +1 -0
- package/dist/commands/show/show.js +87 -0
- package/dist/commands/show/show.js.map +1 -0
- package/dist/commands/status/fleet-next.js +90 -0
- package/dist/commands/status/fleet-next.js.map +1 -0
- package/dist/commands/status/json.js +47 -0
- package/dist/commands/status/json.js.map +1 -0
- package/dist/commands/status/print.js +209 -0
- package/dist/commands/status/print.js.map +1 -0
- package/dist/commands/status/status.js +115 -0
- package/dist/commands/status/status.js.map +1 -0
- package/dist/commands/steps/steps.js +269 -0
- package/dist/commands/steps/steps.js.map +1 -0
- package/dist/commands/subsystem/edit.js +192 -0
- package/dist/commands/subsystem/edit.js.map +1 -0
- package/dist/commands/subsystem/move.js +325 -0
- package/dist/commands/subsystem/move.js.map +1 -0
- package/dist/commands/subsystem/query.js +113 -0
- package/dist/commands/subsystem/query.js.map +1 -0
- package/dist/commands/subsystem/subsystem.js +98 -0
- package/dist/commands/subsystem/subsystem.js.map +1 -0
- package/dist/commands/subsystem/sync.js +318 -0
- package/dist/commands/subsystem/sync.js.map +1 -0
- package/dist/commands/subsystem/txn/exclude.js +132 -0
- package/dist/commands/subsystem/txn/exclude.js.map +1 -0
- package/dist/commands/subsystem/txn/links.js +128 -0
- package/dist/commands/subsystem/txn/links.js.map +1 -0
- package/dist/commands/subsystem/txn/report.js +174 -0
- package/dist/commands/subsystem/txn/report.js.map +1 -0
- package/dist/commands/subsystem/txn/txn.js +196 -0
- package/dist/commands/subsystem/txn/txn.js.map +1 -0
- package/dist/commands/subsystem/txn/views.js +249 -0
- package/dist/commands/subsystem/txn/views.js.map +1 -0
- package/dist/commands/tasks/actions.js +107 -0
- package/dist/commands/tasks/actions.js.map +1 -0
- package/dist/commands/tasks/render.js +253 -0
- package/dist/commands/tasks/render.js.map +1 -0
- package/dist/commands/tasks/tasks.js +119 -0
- package/dist/commands/tasks/tasks.js.map +1 -0
- package/dist/commands/unarchive/manifest.js +176 -0
- package/dist/commands/unarchive/manifest.js.map +1 -0
- package/dist/commands/unarchive/restore.js +254 -0
- package/dist/commands/unarchive/restore.js.map +1 -0
- package/dist/commands/unarchive/unarchive.js +59 -0
- package/dist/commands/unarchive/unarchive.js.map +1 -0
- package/dist/commands/validate/arch-coverage.js +245 -0
- package/dist/commands/validate/arch-coverage.js.map +1 -0
- package/dist/commands/validate/checks/fleet-shape.js +204 -0
- package/dist/commands/validate/checks/fleet-shape.js.map +1 -0
- package/dist/commands/validate/checks/health-deps.js +58 -0
- package/dist/commands/validate/checks/health-deps.js.map +1 -0
- package/dist/commands/validate/checks/introduced.js +102 -0
- package/dist/commands/validate/checks/introduced.js.map +1 -0
- package/dist/commands/validate/checks/requirements.js +264 -0
- package/dist/commands/validate/checks/requirements.js.map +1 -0
- package/dist/commands/validate/checks/sources.js +85 -0
- package/dist/commands/validate/checks/sources.js.map +1 -0
- package/dist/commands/validate/coverage/covers-after.js +105 -0
- package/dist/commands/validate/coverage/covers-after.js.map +1 -0
- package/dist/commands/validate/feature.js +222 -0
- package/dist/commands/validate/feature.js.map +1 -0
- package/dist/commands/validate/fleet/census.js +93 -0
- package/dist/commands/validate/fleet/census.js.map +1 -0
- package/dist/commands/validate/fleet/kind-tags.js +39 -0
- package/dist/commands/validate/fleet/kind-tags.js.map +1 -0
- package/dist/commands/validate/fleet/landscape.js +371 -0
- package/dist/commands/validate/fleet/landscape.js.map +1 -0
- package/dist/commands/validate/fleet/load.js +118 -0
- package/dist/commands/validate/fleet/load.js.map +1 -0
- package/dist/commands/validate/fleet/map/attest.js +98 -0
- package/dist/commands/validate/fleet/map/attest.js.map +1 -0
- package/dist/commands/validate/fleet/map/bindings.js +107 -0
- package/dist/commands/validate/fleet/map/bindings.js.map +1 -0
- package/dist/commands/validate/fleet/map/consumers.js +244 -0
- package/dist/commands/validate/fleet/map/consumers.js.map +1 -0
- package/dist/commands/validate/fleet/map/isolation.js +116 -0
- package/dist/commands/validate/fleet/map/isolation.js.map +1 -0
- package/dist/commands/validate/fleet/map/usecases.js +54 -0
- package/dist/commands/validate/fleet/map/usecases.js.map +1 -0
- package/dist/commands/validate/fleet/obligations.js +266 -0
- package/dist/commands/validate/fleet/obligations.js.map +1 -0
- package/dist/commands/validate/fleet/scorecard/adoption.js +102 -0
- package/dist/commands/validate/fleet/scorecard/adoption.js.map +1 -0
- package/dist/commands/validate/fleet/scorecard/contracts.js +98 -0
- package/dist/commands/validate/fleet/scorecard/contracts.js.map +1 -0
- package/dist/commands/validate/fleet/scorecard/print.js +71 -0
- package/dist/commands/validate/fleet/scorecard/print.js.map +1 -0
- package/dist/commands/validate/fleet/scorecard/scorecard.js +162 -0
- package/dist/commands/validate/fleet/scorecard/scorecard.js.map +1 -0
- package/dist/commands/validate/fleet/usecases/place.js +13 -0
- package/dist/commands/validate/fleet/usecases/place.js.map +1 -0
- package/dist/commands/validate/fleet/views/fleet-project.js +217 -0
- package/dist/commands/validate/fleet/views/fleet-project.js.map +1 -0
- package/dist/commands/validate/fleet/views/ids.js +75 -0
- package/dist/commands/validate/fleet/views/ids.js.map +1 -0
- package/dist/commands/validate/fleet/views/projects.js +278 -0
- package/dist/commands/validate/fleet/views/projects.js.map +1 -0
- package/dist/commands/validate/fleet/views/root-documents.js +83 -0
- package/dist/commands/validate/fleet/views/root-documents.js.map +1 -0
- package/dist/commands/validate/fleet/views/stale.js +52 -0
- package/dist/commands/validate/fleet/views/stale.js.map +1 -0
- package/dist/commands/validate/links/corpus.js +89 -0
- package/dist/commands/validate/links/corpus.js.map +1 -0
- package/dist/commands/validate/links/glossary.js +75 -0
- package/dist/commands/validate/links/glossary.js.map +1 -0
- package/dist/commands/validate/render/repeats.js +63 -0
- package/dist/commands/validate/render/repeats.js.map +1 -0
- package/dist/commands/validate/render/rollups.js +115 -0
- package/dist/commands/validate/render/rollups.js.map +1 -0
- package/dist/commands/validate/render/text.js +199 -0
- package/dist/commands/validate/render/text.js.map +1 -0
- package/dist/commands/validate/report.js +145 -0
- package/dist/commands/validate/report.js.map +1 -0
- package/dist/commands/validate/scope.js +113 -0
- package/dist/commands/validate/scope.js.map +1 -0
- package/dist/commands/validate/service/api.js +252 -0
- package/dist/commands/validate/service/api.js.map +1 -0
- package/dist/commands/validate/service/contracts/generated.js +134 -0
- package/dist/commands/validate/service/contracts/generated.js.map +1 -0
- package/dist/commands/validate/service/events/events.js +241 -0
- package/dist/commands/validate/service/events/events.js.map +1 -0
- package/dist/commands/validate/service/events/message-producers.js +77 -0
- package/dist/commands/validate/service/events/message-producers.js.map +1 -0
- package/dist/commands/validate/service/evidence-pins.js +177 -0
- package/dist/commands/validate/service/evidence-pins.js.map +1 -0
- package/dist/commands/validate/service/model/diverged.js +226 -0
- package/dist/commands/validate/service/model/diverged.js.map +1 -0
- package/dist/commands/validate/service/model/grade.js +163 -0
- package/dist/commands/validate/service/model/grade.js.map +1 -0
- package/dist/commands/validate/service/service.js +310 -0
- package/dist/commands/validate/service/service.js.map +1 -0
- package/dist/commands/validate/service/specs.js +279 -0
- package/dist/commands/validate/service/specs.js.map +1 -0
- package/dist/commands/validate/service/spine.js +148 -0
- package/dist/commands/validate/service/spine.js.map +1 -0
- package/dist/commands/validate/service/usecases/tags.js +113 -0
- package/dist/commands/validate/service/usecases/tags.js.map +1 -0
- package/dist/commands/validate/service/usecases/usecases.js +209 -0
- package/dist/commands/validate/service/usecases/usecases.js.map +1 -0
- package/dist/commands/validate/validate.js +363 -0
- package/dist/commands/validate/validate.js.map +1 -0
- package/dist/commands/verify/cross/diff.js +178 -0
- package/dist/commands/verify/cross/diff.js.map +1 -0
- package/dist/commands/verify/evidence/contract.js +32 -0
- package/dist/commands/verify/evidence/contract.js.map +1 -0
- package/dist/commands/verify/evidence/pins.js +52 -0
- package/dist/commands/verify/evidence/pins.js.map +1 -0
- package/dist/commands/verify/evidence/read.js +81 -0
- package/dist/commands/verify/evidence/read.js.map +1 -0
- package/dist/commands/verify/frozen.js +263 -0
- package/dist/commands/verify/frozen.js.map +1 -0
- package/dist/commands/verify/record.js +278 -0
- package/dist/commands/verify/record.js.map +1 -0
- package/dist/commands/verify/report.js +206 -0
- package/dist/commands/verify/report.js.map +1 -0
- package/dist/commands/verify/results.js +328 -0
- package/dist/commands/verify/results.js.map +1 -0
- package/dist/commands/verify/verify.js +220 -0
- package/dist/commands/verify/verify.js.map +1 -0
- package/dist/commands/vouch/contract.js +11 -0
- package/dist/commands/vouch/contract.js.map +1 -0
- package/dist/commands/vouch/pack/contract.js +2 -0
- package/dist/commands/vouch/pack/contract.js.map +1 -0
- package/dist/commands/vouch/pack/pack.js +266 -0
- package/dist/commands/vouch/pack/pack.js.map +1 -0
- package/dist/commands/vouch/pack/print.js +266 -0
- package/dist/commands/vouch/pack/print.js.map +1 -0
- package/dist/commands/vouch/pack/sections.js +141 -0
- package/dist/commands/vouch/pack/sections.js.map +1 -0
- package/dist/commands/vouch/prompt/confirm.js +46 -0
- package/dist/commands/vouch/prompt/confirm.js.map +1 -0
- package/dist/commands/vouch/report.js +101 -0
- package/dist/commands/vouch/report.js.map +1 -0
- package/dist/commands/vouch/run.js +230 -0
- package/dist/commands/vouch/run.js.map +1 -0
- package/dist/commands/vouch/sample/plan.js +111 -0
- package/dist/commands/vouch/sample/plan.js.map +1 -0
- package/dist/commands/vouch/sample/print.js +109 -0
- package/dist/commands/vouch/sample/print.js.map +1 -0
- package/dist/commands/vouch/vet/verify.js +155 -0
- package/dist/commands/vouch/vet/verify.js.map +1 -0
- package/dist/commands/vouch/vouch.js +169 -0
- package/dist/commands/vouch/vouch.js.map +1 -0
- package/dist/core/agent/agents-md/command-map.js +299 -0
- package/dist/core/agent/agents-md/command-map.js.map +1 -0
- package/dist/core/agent/agents-md/map/explain.js +46 -0
- package/dist/core/agent/agents-md/map/explain.js.map +1 -0
- package/dist/core/agent/agents-md/map/lenses/context.js +50 -0
- package/dist/core/agent/agents-md/map/lenses/context.js.map +1 -0
- package/dist/core/agent/agents-md/map/lenses/diff.js +59 -0
- package/dist/core/agent/agents-md/map/lenses/diff.js.map +1 -0
- package/dist/core/agent/agents-md/map/lenses/gate.js +65 -0
- package/dist/core/agent/agents-md/map/lenses/gate.js.map +1 -0
- package/dist/core/agent/agents-md/map/mcp.js +44 -0
- package/dist/core/agent/agents-md/map/mcp.js.map +1 -0
- package/dist/core/agent/agents-md/map/status.js +78 -0
- package/dist/core/agent/agents-md/map/status.js.map +1 -0
- package/dist/core/agent/agents-md/map/subsystem.js +104 -0
- package/dist/core/agent/agents-md/map/subsystem.js.map +1 -0
- package/dist/core/agent/agents-md/map/usecases.js +138 -0
- package/dist/core/agent/agents-md/map/usecases.js.map +1 -0
- package/dist/core/agent/agents-md/refusals.js +273 -0
- package/dist/core/agent/agents-md/refusals.js.map +1 -0
- package/dist/core/agent/agents-md.js +203 -0
- package/dist/core/agent/agents-md.js.map +1 -0
- package/dist/core/{agents-stamp.js → agent/agents-stamp.js} +60 -0
- package/dist/core/agent/agents-stamp.js.map +1 -0
- package/dist/core/agent/contract.js +2 -0
- package/dist/core/agent/contract.js.map +1 -0
- package/dist/core/agent/protocol.js +193 -0
- package/dist/core/agent/protocol.js.map +1 -0
- package/dist/core/agent/scaffold.js +254 -0
- package/dist/core/agent/scaffold.js.map +1 -0
- package/dist/core/agent/support/report.js +144 -0
- package/dist/core/agent/support/report.js.map +1 -0
- package/dist/core/agent/tools/dialects.js +151 -0
- package/dist/core/agent/tools/dialects.js.map +1 -0
- package/dist/core/agent/tools/registry.js +193 -0
- package/dist/core/agent/tools/registry.js.map +1 -0
- package/dist/core/agent/workflows/adopt.js +280 -0
- package/dist/core/agent/workflows/adopt.js.map +1 -0
- package/dist/core/agent/workflows/check.js +373 -0
- package/dist/core/agent/workflows/check.js.map +1 -0
- package/dist/core/agent/workflows/closing.js +323 -0
- package/dist/core/agent/workflows/closing.js.map +1 -0
- package/dist/core/agent/workflows/feature.js +220 -0
- package/dist/core/agent/workflows/feature.js.map +1 -0
- package/dist/core/agent/workflows/implement.js +188 -0
- package/dist/core/agent/workflows/implement.js.map +1 -0
- package/dist/core/agent/workflows/reference/authoring.js +311 -0
- package/dist/core/agent/workflows/reference/authoring.js.map +1 -0
- package/dist/core/agent/workflows/reference/codes.js +67 -0
- package/dist/core/agent/workflows/reference/codes.js.map +1 -0
- package/dist/core/agent/workflows/reference/done-check.js +210 -0
- package/dist/core/agent/workflows/reference/done-check.js.map +1 -0
- package/dist/core/agent/workflows/reference/drawing/drawing.js +253 -0
- package/dist/core/agent/workflows/reference/drawing/drawing.js.map +1 -0
- package/dist/core/agent/workflows/reference/reference.js +19 -0
- package/dist/core/agent/workflows/reference/reference.js.map +1 -0
- package/dist/core/agent/workflows/reference/spine.js +338 -0
- package/dist/core/agent/workflows/reference/spine.js.map +1 -0
- package/dist/core/asyncapi/baseline/plan.js +43 -0
- package/dist/core/asyncapi/baseline/plan.js.map +1 -0
- package/dist/core/asyncapi/baseline/surfaces.js +54 -0
- package/dist/core/asyncapi/baseline/surfaces.js.map +1 -0
- package/dist/core/asyncapi/depth.js +164 -0
- package/dist/core/asyncapi/depth.js.map +1 -0
- package/dist/core/asyncapi/digest.js +146 -0
- package/dist/core/asyncapi/digest.js.map +1 -0
- package/dist/core/asyncapi/merge/components.js +92 -0
- package/dist/core/asyncapi/merge/components.js.map +1 -0
- package/dist/core/asyncapi/merge/error.js +38 -0
- package/dist/core/asyncapi/merge/error.js.map +1 -0
- package/dist/core/asyncapi/merge/markers.js +290 -0
- package/dist/core/asyncapi/merge/markers.js.map +1 -0
- package/dist/core/asyncapi/merge/merge.js +195 -0
- package/dist/core/asyncapi/merge/merge.js.map +1 -0
- package/dist/core/asyncapi/merge/pin.js +83 -0
- package/dist/core/asyncapi/merge/pin.js.map +1 -0
- package/dist/core/asyncapi/model.js +11 -0
- package/dist/core/asyncapi/model.js.map +1 -0
- package/dist/core/asyncapi/producers.js +50 -0
- package/dist/core/asyncapi/producers.js.map +1 -0
- package/dist/core/asyncapi/read.js +263 -0
- package/dist/core/asyncapi/read.js.map +1 -0
- package/dist/core/brief/brief.js +285 -0
- package/dist/core/brief/brief.js.map +1 -0
- package/dist/core/brief/checks.js +385 -0
- package/dist/core/brief/checks.js.map +1 -0
- package/dist/core/brief/landscape.js +273 -0
- package/dist/core/brief/landscape.js.map +1 -0
- package/dist/core/brief/map/extend.js +84 -0
- package/dist/core/brief/map/extend.js.map +1 -0
- package/dist/core/brief/map/owed.js +266 -0
- package/dist/core/brief/map/owed.js.map +1 -0
- package/dist/core/brief/targets.js +304 -0
- package/dist/core/brief/targets.js.map +1 -0
- package/dist/core/brief/unchecked.js +58 -0
- package/dist/core/brief/unchecked.js.map +1 -0
- package/dist/core/c4/arch.js +190 -0
- package/dist/core/c4/arch.js.map +1 -0
- package/dist/core/c4/direction/direction.js +114 -0
- package/dist/core/c4/direction/direction.js.map +1 -0
- package/dist/core/c4/likec4.js +243 -0
- package/dist/core/c4/likec4.js.map +1 -0
- package/dist/core/c4/locate/unlocated.js +150 -0
- package/dist/core/c4/locate/unlocated.js.map +1 -0
- package/dist/core/c4/parsed/deployment.js +160 -0
- package/dist/core/c4/parsed/deployment.js.map +1 -0
- package/dist/core/c4/parsed/dynamic-views.js +132 -0
- package/dist/core/c4/parsed/dynamic-views.js.map +1 -0
- package/dist/core/c4/parsed/specification.js +78 -0
- package/dist/core/c4/parsed/specification.js.map +1 -0
- package/dist/core/c4/parsed/values.js +110 -0
- package/dist/core/c4/parsed/values.js.map +1 -0
- package/dist/core/c4/parsed/view-ids.js +113 -0
- package/dist/core/c4/parsed/view-ids.js.map +1 -0
- package/dist/core/c4/prefetch/fleet.js +134 -0
- package/dist/core/c4/prefetch/fleet.js.map +1 -0
- package/dist/core/c4/project/architecture.js +161 -0
- package/dist/core/c4/project/architecture.js.map +1 -0
- package/dist/core/c4/project/batch.js +140 -0
- package/dist/core/c4/project/batch.js.map +1 -0
- package/dist/core/c4/project/documents.js +89 -0
- package/dist/core/c4/project/documents.js.map +1 -0
- package/dist/core/c4/project/load.js +219 -0
- package/dist/core/c4/project/load.js.map +1 -0
- package/dist/core/c4/project/staged.js +277 -0
- package/dist/core/c4/project/staged.js.map +1 -0
- package/dist/core/c4/resolve/attested.js +0 -0
- package/dist/core/c4/resolve/attested.js.map +1 -0
- package/dist/core/c4/resolve/external.js +51 -0
- package/dist/core/c4/resolve/external.js.map +1 -0
- package/dist/core/c4/resolve/service.js +174 -0
- package/dist/core/c4/resolve/service.js.map +1 -0
- package/dist/core/c4/resolve/steps.js +290 -0
- package/dist/core/c4/resolve/steps.js.map +1 -0
- package/dist/core/c4/resolve/systems.js +154 -0
- package/dist/core/c4/resolve/systems.js.map +1 -0
- package/dist/core/c4/root-project/exclude.js +352 -0
- package/dist/core/c4/root-project/exclude.js.map +1 -0
- package/dist/core/c4/seed/fleet-file.js +201 -0
- package/dist/core/c4/seed/fleet-file.js.map +1 -0
- package/dist/core/c4/seed/items.js +91 -0
- package/dist/core/c4/seed/items.js.map +1 -0
- package/dist/core/c4/seed/stamp.js +48 -0
- package/dist/core/c4/seed/stamp.js.map +1 -0
- package/dist/core/c4/seed/template.js +173 -0
- package/dist/core/c4/seed/template.js.map +1 -0
- package/dist/core/c4/service-model/created/models.js +96 -0
- package/dist/core/c4/service-model/created/models.js.map +1 -0
- package/dist/core/c4/service-model/documents.js +47 -0
- package/dist/core/c4/service-model/documents.js.map +1 -0
- package/dist/core/c4/service-model/fleet/extending.js +82 -0
- package/dist/core/c4/service-model/fleet/extending.js.map +1 -0
- package/dist/core/c4/service-model/load.js +165 -0
- package/dist/core/c4/service-model/load.js.map +1 -0
- package/dist/core/c4/service-model/renderer.js +128 -0
- package/dist/core/c4/service-model/renderer.js.map +1 -0
- package/dist/core/c4/service-model/shape.js +106 -0
- package/dist/core/c4/service-model/shape.js.map +1 -0
- package/dist/core/c4/service-model/slice.js +188 -0
- package/dist/core/c4/service-model/slice.js.map +1 -0
- package/dist/core/c4/source-mask.js +369 -0
- package/dist/core/c4/source-mask.js.map +1 -0
- package/dist/core/c4/source-scan.js +308 -0
- package/dist/core/c4/source-scan.js.map +1 -0
- package/dist/core/c4/splice/authored-source.js +167 -0
- package/dist/core/c4/splice/authored-source.js.map +1 -0
- package/dist/core/c4/splice/contract.js +30 -0
- package/dist/core/c4/splice/contract.js.map +1 -0
- package/dist/core/c4/splice/delta-blocks.js +126 -0
- package/dist/core/c4/splice/delta-blocks.js.map +1 -0
- package/dist/core/c4/splice/identity/declared.js +87 -0
- package/dist/core/c4/splice/identity/declared.js.map +1 -0
- package/dist/core/c4/splice/identity/edges.js +73 -0
- package/dist/core/c4/splice/identity/edges.js.map +1 -0
- package/dist/core/c4/splice/identity/existing.js +80 -0
- package/dist/core/c4/splice/identity/existing.js.map +1 -0
- package/dist/core/c4/splice/identity/interior.js +80 -0
- package/dist/core/c4/splice/identity/interior.js.map +1 -0
- package/dist/core/c4/splice/identity/owner.js +50 -0
- package/dist/core/c4/splice/identity/owner.js.map +1 -0
- package/dist/core/c4/splice/landscape-merge.js +337 -0
- package/dist/core/c4/splice/landscape-merge.js.map +1 -0
- package/dist/core/c4/splice/model/merge.js +151 -0
- package/dist/core/c4/splice/model/merge.js.map +1 -0
- package/dist/core/c4/splice/placement.js +298 -0
- package/dist/core/c4/splice/placement.js.map +1 -0
- package/dist/core/c4/splice/text/spot.js +131 -0
- package/dist/core/c4/splice/text/spot.js.map +1 -0
- package/dist/core/c4/workspace.js +166 -0
- package/dist/core/c4/workspace.js.map +1 -0
- package/dist/core/capabilities/authoring/notes.js +141 -0
- package/dist/core/capabilities/authoring/notes.js.map +1 -0
- package/dist/core/capabilities/capabilities.js +124 -0
- package/dist/core/capabilities/capabilities.js.map +1 -0
- package/dist/core/capabilities/delta/doc.js +47 -0
- package/dist/core/capabilities/delta/doc.js.map +1 -0
- package/dist/core/capabilities/delta/overlay.js +129 -0
- package/dist/core/capabilities/delta/overlay.js.map +1 -0
- package/dist/core/capabilities/delta/summary.js +57 -0
- package/dist/core/capabilities/delta/summary.js.map +1 -0
- package/dist/core/capabilities/delta/tree.js +43 -0
- package/dist/core/capabilities/delta/tree.js.map +1 -0
- package/dist/core/capabilities/delta/uncovered.js +222 -0
- package/dist/core/capabilities/delta/uncovered.js.map +1 -0
- package/dist/core/capabilities/findings.js +338 -0
- package/dist/core/capabilities/findings.js.map +1 -0
- package/dist/core/capabilities/realizes/findings.js +174 -0
- package/dist/core/capabilities/realizes/findings.js.map +1 -0
- package/dist/core/capabilities/realizes/join.js +123 -0
- package/dist/core/capabilities/realizes/join.js.map +1 -0
- package/dist/core/capabilities/rollup.js +205 -0
- package/dist/core/capabilities/rollup.js.map +1 -0
- package/dist/core/capabilities/tree.js +104 -0
- package/dist/core/capabilities/tree.js.map +1 -0
- package/dist/core/capabilities/usecase-join.js +267 -0
- package/dist/core/capabilities/usecase-join.js.map +1 -0
- package/dist/core/coherence/authoring/scaffold.js +185 -0
- package/dist/core/coherence/authoring/scaffold.js.map +1 -0
- package/dist/core/coherence/authoring/sentinels.js +75 -0
- package/dist/core/coherence/authoring/sentinels.js.map +1 -0
- package/dist/core/coherence/calls/called.js +52 -0
- package/dist/core/coherence/calls/called.js.map +1 -0
- package/dist/core/coherence/coherence.js +332 -0
- package/dist/core/coherence/coherence.js.map +1 -0
- package/dist/core/coherence/consumed/operations.js +70 -0
- package/dist/core/coherence/consumed/operations.js.map +1 -0
- package/dist/core/coherence/consumed/refusal.js +38 -0
- package/dist/core/coherence/consumed/refusal.js.map +1 -0
- package/dist/core/coherence/covers/health.js +85 -0
- package/dist/core/coherence/covers/health.js.map +1 -0
- package/dist/core/coherence/declared.js +295 -0
- package/dist/core/coherence/declared.js.map +1 -0
- package/dist/core/coherence/events/declared.js +191 -0
- package/dist/core/coherence/events/declared.js.map +1 -0
- package/dist/core/coherence/events/events.js +335 -0
- package/dist/core/coherence/events/events.js.map +1 -0
- package/dist/core/coherence/events/grades.js +189 -0
- package/dist/core/coherence/events/grades.js.map +1 -0
- package/dist/core/coherence/events/lookups.js +63 -0
- package/dist/core/coherence/events/lookups.js.map +1 -0
- package/dist/core/coherence/events/produced.js +100 -0
- package/dist/core/coherence/events/produced.js.map +1 -0
- package/dist/core/coherence/living.js +198 -0
- package/dist/core/coherence/living.js.map +1 -0
- package/dist/core/coherence/lookups.js +95 -0
- package/dist/core/coherence/lookups.js.map +1 -0
- package/dist/core/coherence/pending.js +39 -0
- package/dist/core/coherence/pending.js.map +1 -0
- package/dist/core/coherence/retired/archived.js +285 -0
- package/dist/core/coherence/retired/archived.js.map +1 -0
- package/dist/core/coherence/retired/event-pair.js +62 -0
- package/dist/core/coherence/retired/event-pair.js.map +1 -0
- package/dist/core/coherence/retired/merged.js +79 -0
- package/dist/core/coherence/retired/merged.js.map +1 -0
- package/dist/core/coherence/retired/retirement.js +49 -0
- package/dist/core/coherence/retired/retirement.js.map +1 -0
- package/dist/core/coherence/retired/revival/arrivals.js +131 -0
- package/dist/core/coherence/retired/revival/arrivals.js.map +1 -0
- package/dist/core/coherence/retired/revival/revived.js +297 -0
- package/dist/core/coherence/retired/revival/revived.js.map +1 -0
- package/dist/core/conflict-markers.js +60 -0
- package/dist/core/conflict-markers.js.map +1 -0
- package/dist/core/consumers/after.js +113 -0
- package/dist/core/consumers/after.js.map +1 -0
- package/dist/core/consumers/consumers.js +296 -0
- package/dist/core/consumers/consumers.js.map +1 -0
- package/dist/core/consumers/current.js +211 -0
- package/dist/core/consumers/current.js.map +1 -0
- package/dist/core/consumers/scan.js +46 -0
- package/dist/core/consumers/scan.js.map +1 -0
- package/dist/core/consumers/state.js +27 -0
- package/dist/core/consumers/state.js.map +1 -0
- package/dist/core/delta/claims.js +73 -0
- package/dist/core/delta/claims.js.map +1 -0
- package/dist/core/delta/delta.js +341 -0
- package/dist/core/delta/delta.js.map +1 -0
- package/dist/core/delta/document.js +177 -0
- package/dist/core/delta/document.js.map +1 -0
- package/dist/core/delta/scope.js +48 -0
- package/dist/core/delta/scope.js.map +1 -0
- package/dist/core/delta/select.js +237 -0
- package/dist/core/delta/select.js.map +1 -0
- package/dist/core/dependencies/dependencies.js +141 -0
- package/dist/core/dependencies/dependencies.js.map +1 -0
- package/dist/core/dependencies/facts.js +165 -0
- package/dist/core/dependencies/facts.js.map +1 -0
- package/dist/core/dependencies/fanin.js +88 -0
- package/dist/core/dependencies/fanin.js.map +1 -0
- package/dist/core/dependencies/graph.js +106 -0
- package/dist/core/dependencies/graph.js.map +1 -0
- package/dist/core/deployment/delta.js +191 -0
- package/dist/core/deployment/delta.js.map +1 -0
- package/dist/core/deployment/objects.js +145 -0
- package/dist/core/deployment/objects.js.map +1 -0
- package/dist/core/diff/base-git.js +230 -0
- package/dist/core/diff/base-git.js.map +1 -0
- package/dist/core/diff/base-state.js +237 -0
- package/dist/core/diff/base-state.js.map +1 -0
- package/dist/core/diff/joins.js +136 -0
- package/dist/core/diff/joins.js.map +1 -0
- package/dist/core/diff/scope/changed-paths.js +204 -0
- package/dist/core/diff/scope/changed-paths.js.map +1 -0
- package/dist/core/diff/scope/edges.js +82 -0
- package/dist/core/diff/scope/edges.js.map +1 -0
- package/dist/core/diff/semantic.js +312 -0
- package/dist/core/diff/semantic.js.map +1 -0
- package/dist/core/docs.js +37 -85
- package/dist/core/docs.js.map +1 -1
- package/dist/core/doctor/agents.js +238 -0
- package/dist/core/doctor/agents.js.map +1 -0
- package/dist/core/doctor/config.js +139 -0
- package/dist/core/doctor/config.js.map +1 -0
- package/dist/core/doctor/doctor.js +355 -0
- package/dist/core/doctor/doctor.js.map +1 -0
- package/dist/core/doctor/report.js +13 -0
- package/dist/core/doctor/report.js.map +1 -0
- package/dist/core/doctor/reports/scan.js +242 -0
- package/dist/core/doctor/reports/scan.js.map +1 -0
- package/dist/core/doctor/residue.js +110 -0
- package/dist/core/doctor/residue.js.map +1 -0
- package/dist/core/document/apply.js +224 -0
- package/dist/core/document/apply.js.map +1 -0
- package/dist/core/{frontmatter.js → document/frontmatter.js} +103 -2
- package/dist/core/document/frontmatter.js.map +1 -0
- package/dist/core/document/grammar/directives.js +143 -0
- package/dist/core/document/grammar/directives.js.map +1 -0
- package/dist/core/document/parse.js +286 -0
- package/dist/core/document/parse.js.map +1 -0
- package/dist/core/document/scenarios.js +238 -0
- package/dist/core/document/scenarios.js.map +1 -0
- package/dist/core/document/spec.js +234 -0
- package/dist/core/document/spec.js.map +1 -0
- package/dist/core/{config.js → envelope/config.js} +89 -18
- package/dist/core/envelope/config.js.map +1 -0
- package/dist/core/envelope/json.js +209 -0
- package/dist/core/envelope/json.js.map +1 -0
- package/dist/core/{version.js → envelope/version.js} +3 -3
- package/dist/core/envelope/version.js.map +1 -0
- package/dist/core/explain/families.js +180 -0
- package/dist/core/explain/families.js.map +1 -0
- package/dist/core/explain/fix-tables.js +178 -0
- package/dist/core/explain/fix-tables.js.map +1 -0
- package/dist/core/explain/lookup.js +194 -0
- package/dist/core/explain/lookup.js.map +1 -0
- package/dist/core/explain/refusals.js +49 -0
- package/dist/core/explain/refusals.js.map +1 -0
- package/dist/core/explain/terms/documents.js +227 -0
- package/dist/core/explain/terms/documents.js.map +1 -0
- package/dist/core/explain/terms/done-check.js +144 -0
- package/dist/core/explain/terms/done-check.js.map +1 -0
- package/dist/core/explain/terms/entry.js +14 -0
- package/dist/core/explain/terms/entry.js.map +1 -0
- package/dist/core/explain/terms/stages.js +71 -0
- package/dist/core/explain/terms/stages.js.map +1 -0
- package/dist/core/explain/terms/tasks.js +97 -0
- package/dist/core/explain/terms/tasks.js.map +1 -0
- package/dist/core/explain/terms.js +103 -0
- package/dist/core/explain/terms.js.map +1 -0
- package/dist/core/explore/describe.js +105 -0
- package/dist/core/explore/describe.js.map +1 -0
- package/dist/core/explore/explore.js +204 -0
- package/dist/core/explore/explore.js.map +1 -0
- package/dist/core/fleet-context.js +174 -146
- package/dist/core/fleet-context.js.map +1 -1
- package/dist/core/gate/checks.js +208 -0
- package/dist/core/gate/checks.js.map +1 -0
- package/dist/core/gate/partners.js +246 -0
- package/dist/core/gate/partners.js.map +1 -0
- package/dist/core/gate/report.js +47 -0
- package/dist/core/gate/report.js.map +1 -0
- package/dist/core/gate/verification.js +176 -0
- package/dist/core/gate/verification.js.map +1 -0
- package/dist/core/gherkin/digest.js +60 -0
- package/dist/core/gherkin/digest.js.map +1 -0
- package/dist/core/gherkin/emit.js +177 -0
- package/dist/core/gherkin/emit.js.map +1 -0
- package/dist/core/gherkin/read.js +76 -0
- package/dist/core/gherkin/read.js.map +1 -0
- package/dist/core/gherkin/stale.js +210 -0
- package/dist/core/gherkin/stale.js.map +1 -0
- package/dist/core/gherkin/stamp.js +77 -0
- package/dist/core/gherkin/stamp.js.map +1 -0
- package/dist/core/gherkin/steps/catalogue.js +154 -0
- package/dist/core/gherkin/steps/catalogue.js.map +1 -0
- package/dist/core/gherkin/steps/inventory.js +98 -0
- package/dist/core/gherkin/steps/inventory.js.map +1 -0
- package/dist/core/gherkin/steps/phrase.js +72 -0
- package/dist/core/gherkin/steps/phrase.js.map +1 -0
- package/dist/core/glossary/delta.js +109 -0
- package/dist/core/glossary/delta.js.map +1 -0
- package/dist/core/glossary/tree.js +73 -0
- package/dist/core/glossary/tree.js.map +1 -0
- package/dist/core/{concurrency.js → kernel/concurrency.js} +19 -0
- package/dist/core/kernel/concurrency.js.map +1 -0
- package/dist/core/{document-bytes.js → kernel/document-bytes.js} +1 -1
- package/dist/core/kernel/document-bytes.js.map +1 -0
- package/dist/core/kernel/fences.js +42 -0
- package/dist/core/kernel/fences.js.map +1 -0
- package/dist/core/kernel/ids/capability.js +72 -0
- package/dist/core/kernel/ids/capability.js.map +1 -0
- package/dist/core/kernel/ids/dirs.js +33 -0
- package/dist/core/kernel/ids/dirs.js.map +1 -0
- package/dist/core/kernel/ids/feature.js +75 -0
- package/dist/core/kernel/ids/feature.js.map +1 -0
- package/dist/core/kernel/ids/fqn/ancestors.js +65 -0
- package/dist/core/kernel/ids/fqn/ancestors.js.map +1 -0
- package/dist/core/kernel/ids/service.js +156 -0
- package/dist/core/kernel/ids/service.js.map +1 -0
- package/dist/core/kernel/ids/subsystem.js +63 -0
- package/dist/core/kernel/ids/subsystem.js.map +1 -0
- package/dist/core/{path-safety.js → kernel/path-safety.js} +56 -4
- package/dist/core/kernel/path-safety.js.map +1 -0
- package/dist/core/{records.js → kernel/records.js} +11 -0
- package/dist/core/kernel/records.js.map +1 -0
- package/dist/core/links/backlinks.js +66 -0
- package/dist/core/links/backlinks.js.map +1 -0
- package/dist/core/links/case.js +74 -0
- package/dist/core/links/case.js.map +1 -0
- package/dist/core/links/corpus.js +118 -0
- package/dist/core/links/corpus.js.map +1 -0
- package/dist/core/links/findings.js +110 -0
- package/dist/core/links/findings.js.map +1 -0
- package/dist/core/links/parse.js +265 -0
- package/dist/core/links/parse.js.map +1 -0
- package/dist/core/mcp/argv.js +212 -0
- package/dist/core/mcp/argv.js.map +1 -0
- package/dist/core/mcp/author-tools.js +73 -0
- package/dist/core/mcp/author-tools.js.map +1 -0
- package/dist/core/mcp/framing.js +46 -0
- package/dist/core/mcp/framing.js.map +1 -0
- package/dist/core/mcp/protocol.js +280 -0
- package/dist/core/mcp/protocol.js.map +1 -0
- package/dist/core/mcp/tools.js +324 -0
- package/dist/core/mcp/tools.js.map +1 -0
- package/dist/core/obligations/obligations.js +106 -0
- package/dist/core/obligations/obligations.js.map +1 -0
- package/dist/core/openapi/baseline/gate.js +207 -0
- package/dist/core/openapi/baseline/gate.js.map +1 -0
- package/dist/core/openapi/baseline/plan.js +142 -0
- package/dist/core/openapi/baseline/plan.js.map +1 -0
- package/dist/core/openapi/baseline/record.js +174 -0
- package/dist/core/openapi/baseline/record.js.map +1 -0
- package/dist/core/openapi/contract-text.js +33 -0
- package/dist/core/openapi/contract-text.js.map +1 -0
- package/dist/core/openapi/contract-tree.js +301 -0
- package/dist/core/openapi/contract-tree.js.map +1 -0
- package/dist/core/openapi/depth.js +136 -0
- package/dist/core/openapi/depth.js.map +1 -0
- package/dist/core/openapi/digest.js +239 -0
- package/dist/core/openapi/digest.js.map +1 -0
- package/dist/core/{openapi.js → openapi/doc.js} +54 -108
- package/dist/core/openapi/doc.js.map +1 -0
- package/dist/core/openapi/merge/components.js +199 -0
- package/dist/core/openapi/merge/components.js.map +1 -0
- package/dist/core/openapi/merge/error.js +16 -0
- package/dist/core/openapi/merge/error.js.map +1 -0
- package/dist/core/openapi/merge/markers.js +204 -0
- package/dist/core/openapi/merge/markers.js.map +1 -0
- package/dist/core/openapi/merge/merge.js +232 -0
- package/dist/core/openapi/merge/merge.js.map +1 -0
- package/dist/core/openapi/merge/pin.js +110 -0
- package/dist/core/openapi/merge/pin.js.map +1 -0
- package/dist/core/openspec/decide/capabilities.js +244 -0
- package/dist/core/openspec/decide/capabilities.js.map +1 -0
- package/dist/core/openspec/decide/dispositions.js +63 -0
- package/dist/core/openspec/decide/dispositions.js.map +1 -0
- package/dist/core/openspec/decide/renames.js +179 -0
- package/dist/core/openspec/decide/renames.js.map +1 -0
- package/dist/core/openspec/decide/verdict.js +84 -0
- package/dist/core/openspec/decide/verdict.js.map +1 -0
- package/dist/core/openspec/inventory.js +220 -0
- package/dist/core/openspec/inventory.js.map +1 -0
- package/dist/core/openspec/model/mapping.js +78 -0
- package/dist/core/openspec/model/mapping.js.map +1 -0
- package/dist/core/openspec/model/model.js +70 -0
- package/dist/core/openspec/model/model.js.map +1 -0
- package/dist/core/openspec/scan/changes.js +241 -0
- package/dist/core/openspec/scan/changes.js.map +1 -0
- package/dist/core/openspec/scan/config.js +191 -0
- package/dist/core/openspec/scan/config.js.map +1 -0
- package/dist/core/openspec/scan/shape.js +304 -0
- package/dist/core/openspec/scan/shape.js.map +1 -0
- package/dist/core/openspec/scan/walk.js +116 -0
- package/dist/core/openspec/scan/walk.js.map +1 -0
- package/dist/core/openspec/scan/workspace.js +71 -0
- package/dist/core/openspec/scan/workspace.js.map +1 -0
- package/dist/core/owners/codeowners.js +141 -0
- package/dist/core/owners/codeowners.js.map +1 -0
- package/dist/core/pack/features.js +120 -0
- package/dist/core/pack/features.js.map +1 -0
- package/dist/core/pack/joins.js +112 -0
- package/dist/core/pack/joins.js.map +1 -0
- package/dist/core/pack/living.js +157 -0
- package/dist/core/pack/living.js.map +1 -0
- package/dist/core/pack/pack.js +120 -0
- package/dist/core/pack/pack.js.map +1 -0
- package/dist/core/permissions/permissions.js +87 -0
- package/dist/core/permissions/permissions.js.map +1 -0
- package/dist/core/projection/api.js +84 -0
- package/dist/core/projection/api.js.map +1 -0
- package/dist/core/projection/arch-slice.js +63 -0
- package/dist/core/projection/arch-slice.js.map +1 -0
- package/dist/core/projection/events.js +34 -0
- package/dist/core/projection/events.js.map +1 -0
- package/dist/core/projection/introduced.js +14 -0
- package/dist/core/projection/introduced.js.map +1 -0
- package/dist/core/provenance/findings.js +244 -0
- package/dist/core/provenance/findings.js.map +1 -0
- package/dist/core/provenance/git.js +201 -0
- package/dist/core/provenance/git.js.map +1 -0
- package/dist/core/provenance/gitq/moves.js +139 -0
- package/dist/core/provenance/gitq/moves.js.map +1 -0
- package/dist/core/provenance/gitq/vouched-ancestor.js +179 -0
- package/dist/core/provenance/gitq/vouched-ancestor.js.map +1 -0
- package/dist/core/provenance/sample/scope.js +238 -0
- package/dist/core/provenance/sample/scope.js.map +1 -0
- package/dist/core/provenance/sample/sections.js +61 -0
- package/dist/core/provenance/sample/sections.js.map +1 -0
- package/dist/core/provenance/sources.js +280 -0
- package/dist/core/provenance/sources.js.map +1 -0
- package/dist/core/provenance/stamp.js +220 -0
- package/dist/core/provenance/stamp.js.map +1 -0
- package/dist/core/provenance/walk.js +157 -0
- package/dist/core/provenance/walk.js.map +1 -0
- package/dist/core/repo/authored/paths.js +210 -0
- package/dist/core/repo/authored/paths.js.map +1 -0
- package/dist/core/repo/entries.js +126 -0
- package/dist/core/repo/entries.js.map +1 -0
- package/dist/core/repo/paths.js +322 -0
- package/dist/core/repo/paths.js.map +1 -0
- package/dist/core/repo/repo.js +308 -0
- package/dist/core/repo/repo.js.map +1 -0
- package/dist/core/repo/service-target.js +153 -0
- package/dist/core/repo/service-target.js.map +1 -0
- package/dist/core/repo/state.js +58 -0
- package/dist/core/repo/state.js.map +1 -0
- package/dist/core/repo/tree/find.js +61 -0
- package/dist/core/repo/tree/find.js.map +1 -0
- package/dist/core/repo/tree/fs.js +90 -0
- package/dist/core/repo/tree/fs.js.map +1 -0
- package/dist/core/repo/tree/marker.js +61 -0
- package/dist/core/repo/tree/marker.js.map +1 -0
- package/dist/core/repo/tree/render/body.js +258 -0
- package/dist/core/repo/tree/render/body.js.map +1 -0
- package/dist/core/repo/tree/render/projects.js +182 -0
- package/dist/core/repo/tree/render/projects.js.map +1 -0
- package/dist/core/repo/tree/render/service/header.js +125 -0
- package/dist/core/repo/tree/render/service/header.js.map +1 -0
- package/dist/core/repo/tree/render/service/peers.js +28 -0
- package/dist/core/repo/tree/render/service/peers.js.map +1 -0
- package/dist/core/repo/tree/render/service/view-id.js +67 -0
- package/dist/core/repo/tree/render/service/view-id.js.map +1 -0
- package/dist/core/repo/tree/render/service/views.js +78 -0
- package/dist/core/repo/tree/render/service/views.js.map +1 -0
- package/dist/core/repo/tree/render/stale.js +42 -0
- package/dist/core/repo/tree/render/stale.js.map +1 -0
- package/dist/core/repo/tree/render/text.js +84 -0
- package/dist/core/repo/tree/render/text.js.map +1 -0
- package/dist/core/repo/tree/render/views.js +293 -0
- package/dist/core/repo/tree/render/views.js.map +1 -0
- package/dist/core/repo/tree/walk.js +255 -0
- package/dist/core/repo/tree/walk.js.map +1 -0
- package/dist/core/results.js +146 -14
- package/dist/core/results.js.map +1 -1
- package/dist/core/scaffold/landscape.js +239 -0
- package/dist/core/scaffold/landscape.js.map +1 -0
- package/dist/core/scaffold/legacy.js +271 -0
- package/dist/core/scaffold/legacy.js.map +1 -0
- package/dist/core/scaffold/readme.js +84 -0
- package/dist/core/scaffold/readme.js.map +1 -0
- package/dist/core/staging/commit.js +252 -0
- package/dist/core/staging/commit.js.map +1 -0
- package/dist/core/staging/interrupted.js +96 -0
- package/dist/core/staging/interrupted.js.map +1 -0
- package/dist/core/staging/lock.js +268 -0
- package/dist/core/staging/lock.js.map +1 -0
- package/dist/core/staging/recovery/finding.js +35 -0
- package/dist/core/staging/recovery/finding.js.map +1 -0
- package/dist/core/staging/recovery/intent.js +95 -0
- package/dist/core/staging/recovery/intent.js.map +1 -0
- package/dist/core/staging/recovery/recover.js +204 -0
- package/dist/core/staging/recovery/recover.js.map +1 -0
- package/dist/core/staging/recovery/residue.js +62 -0
- package/dist/core/staging/recovery/residue.js.map +1 -0
- package/dist/core/staging/snapshot/manifest.js +188 -0
- package/dist/core/staging/snapshot/manifest.js.map +1 -0
- package/dist/core/staging/snapshot/snapshot.js +196 -0
- package/dist/core/staging/snapshot/snapshot.js.map +1 -0
- package/dist/core/staging/txn/forward.js +181 -0
- package/dist/core/staging/txn/forward.js.map +1 -0
- package/dist/core/staging/txn/journal.js +139 -0
- package/dist/core/staging/txn/journal.js.map +1 -0
- package/dist/core/staging/txn/transaction.js +75 -0
- package/dist/core/staging/txn/transaction.js.map +1 -0
- package/dist/core/staging/writes.js +113 -0
- package/dist/core/staging/writes.js.map +1 -0
- package/dist/core/status/actions/execution.js +60 -0
- package/dist/core/status/actions/execution.js.map +1 -0
- package/dist/core/status/contracts.js +126 -0
- package/dist/core/status/contracts.js.map +1 -0
- package/dist/core/status/feature/artifacts.js +196 -0
- package/dist/core/status/feature/artifacts.js.map +1 -0
- package/dist/core/status/feature/feature.js +214 -0
- package/dist/core/status/feature/feature.js.map +1 -0
- package/dist/core/status/feature/next.js +163 -0
- package/dist/core/status/feature/next.js.map +1 -0
- package/dist/core/status/feature/state.js +21 -0
- package/dist/core/status/feature/state.js.map +1 -0
- package/dist/core/status/feature/words.js +96 -0
- package/dist/core/status/feature/words.js.map +1 -0
- package/dist/core/status/fleet/fleet.js +216 -0
- package/dist/core/status/fleet/fleet.js.map +1 -0
- package/dist/core/status/fleet/next.js +302 -0
- package/dist/core/status/fleet/next.js.map +1 -0
- package/dist/core/status/interrupted.js +97 -0
- package/dist/core/status/interrupted.js.map +1 -0
- package/dist/core/status/report.js +31 -0
- package/dist/core/status/report.js.map +1 -0
- package/dist/core/status/scan.js +41 -0
- package/dist/core/status/scan.js.map +1 -0
- package/dist/core/status/verification.js +216 -0
- package/dist/core/status/verification.js.map +1 -0
- package/dist/core/tasks/packet.js +199 -0
- package/dist/core/tasks/packet.js.map +1 -0
- package/dist/core/tasks/record.js +43 -0
- package/dist/core/tasks/record.js.map +1 -0
- package/dist/core/tasks/sources.js +181 -0
- package/dist/core/tasks/sources.js.map +1 -0
- package/dist/core/tasks/stamps.js +76 -0
- package/dist/core/tasks/stamps.js.map +1 -0
- package/dist/core/tasks/unit.js +0 -0
- package/dist/core/tasks/unit.js.map +1 -0
- package/dist/core/usecases/capability.js +166 -0
- package/dist/core/usecases/capability.js.map +1 -0
- package/dist/core/usecases/delta/claims.js +140 -0
- package/dist/core/usecases/delta/claims.js.map +1 -0
- package/dist/core/usecases/delta/flows.js +101 -0
- package/dist/core/usecases/delta/flows.js.map +1 -0
- package/dist/core/usecases/delta/modified.js +315 -0
- package/dist/core/usecases/delta/modified.js.map +1 -0
- package/dist/core/usecases/delta/overlay.js +76 -0
- package/dist/core/usecases/delta/overlay.js.map +1 -0
- package/dist/core/usecases/fleet.js +296 -0
- package/dist/core/usecases/fleet.js.map +1 -0
- package/dist/core/usecases/grade/capability-tag.js +93 -0
- package/dist/core/usecases/grade/capability-tag.js.map +1 -0
- package/dist/core/usecases/grade/feature.js +88 -0
- package/dist/core/usecases/grade/feature.js.map +1 -0
- package/dist/core/usecases/grade/requirement-tag.js +94 -0
- package/dist/core/usecases/grade/requirement-tag.js.map +1 -0
- package/dist/core/usecases/grade/steps.js +266 -0
- package/dist/core/usecases/grade/steps.js.map +1 -0
- package/dist/core/usecases/grade/usecases.js +112 -0
- package/dist/core/usecases/grade/usecases.js.map +1 -0
- package/dist/core/usecases/operations.js +123 -0
- package/dist/core/usecases/operations.js.map +1 -0
- package/dist/core/usecases/place.js +44 -0
- package/dist/core/usecases/place.js.map +1 -0
- package/dist/core/usecases/service/exclude.js +119 -0
- package/dist/core/usecases/service/exclude.js.map +1 -0
- package/dist/core/usecases/service/flows.js +164 -0
- package/dist/core/usecases/service/flows.js.map +1 -0
- package/dist/core/usecases/suites/participants.js +83 -0
- package/dist/core/usecases/suites/participants.js.map +1 -0
- package/dist/core/usecases/suites/suites.js +45 -0
- package/dist/core/usecases/suites/suites.js.map +1 -0
- package/dist/core/usecases/touch.js +101 -0
- package/dist/core/usecases/touch.js.map +1 -0
- package/dist/core/verify/answers.js +180 -0
- package/dist/core/verify/answers.js.map +1 -0
- package/dist/core/verify/build.js +170 -0
- package/dist/core/verify/build.js.map +1 -0
- package/dist/core/verify/checklist.js +259 -0
- package/dist/core/verify/checklist.js.map +1 -0
- package/dist/core/verify/claims/identity.js +61 -0
- package/dist/core/verify/claims/identity.js.map +1 -0
- package/dist/core/verify/cross/diff.js +97 -0
- package/dist/core/verify/cross/diff.js.map +1 -0
- package/dist/core/verify/evidence/contract.js +169 -0
- package/dist/core/verify/evidence/contract.js.map +1 -0
- package/dist/core/verify/location.js +67 -0
- package/dist/core/verify/location.js.map +1 -0
- package/dist/core/verify/pins/lint.js +158 -0
- package/dist/core/verify/pins/lint.js.map +1 -0
- package/dist/core/verify/pins/pin.js +95 -0
- package/dist/core/verify/pins/pin.js.map +1 -0
- package/dist/core/verify/read/file.js +224 -0
- package/dist/core/verify/read/file.js.map +1 -0
- package/dist/core/verify/read/shape.js +169 -0
- package/dist/core/verify/read/shape.js.map +1 -0
- package/dist/core/verify/read/union.js +105 -0
- package/dist/core/verify/read/union.js.map +1 -0
- package/dist/core/verify/record.js +165 -0
- package/dist/core/verify/record.js.map +1 -0
- package/dist/core/verify/store/commit.js +99 -0
- package/dist/core/verify/store/commit.js.map +1 -0
- package/dist/core/verify/store/render.js +61 -0
- package/dist/core/verify/store/render.js.map +1 -0
- package/dist/core/vocabulary/health.js +91 -0
- package/dist/core/vocabulary/health.js.map +1 -0
- package/dist/core/vocabulary/issue.js +59 -0
- package/dist/core/vocabulary/issue.js.map +1 -0
- package/dist/core/vocabulary/maturity.js +216 -0
- package/dist/core/vocabulary/maturity.js.map +1 -0
- package/dist/core/vocabulary/report.js +90 -0
- package/dist/core/vocabulary/report.js.map +1 -0
- package/dist/core/vocabulary/steps.js +266 -0
- package/dist/core/vocabulary/steps.js.map +1 -0
- package/dist/core/workspace/discover.js +239 -0
- package/dist/core/workspace/discover.js.map +1 -0
- package/dist/core/workspace/render.js +52 -0
- package/dist/core/workspace/render.js.map +1 -0
- package/examples/README.md +232 -0
- package/examples/docs/architecture/adrs/0001-transactional-outbox.md +33 -0
- package/examples/docs/architecture/capabilities.yaml +31 -0
- package/examples/docs/architecture/landscape.likec4 +336 -0
- package/examples/docs/architecture/obligations.yaml +23 -0
- package/examples/docs/architecture/permissions.yaml +50 -0
- package/examples/docs/architecture/services.likec4 +70 -0
- package/examples/docs/architecture/subsystems.likec4 +18 -0
- package/examples/docs/architecture/usecases/order-notification.likec4 +74 -0
- package/examples/docs/capabilities/checkout/spec.md +55 -0
- package/examples/docs/capabilities/identity/tokens/spec.md +42 -0
- package/examples/docs/capabilities/order-notifications/spec.md +43 -0
- package/examples/docs/features/FEAT-101-payment-splitting/adrs/0001-dedicated-split-service.md +18 -0
- package/examples/docs/features/FEAT-101-payment-splitting/delta.likec4 +94 -0
- package/examples/docs/features/FEAT-101-payment-splitting/intent.md +44 -0
- package/examples/docs/features/FEAT-101-payment-splitting/specs/checkout-web/spec.md +21 -0
- package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-service/asyncapi.yaml +132 -0
- package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-service/spec.md +36 -0
- package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-split-service/arch.spec.md +40 -0
- package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-split-service/openapi.yaml +116 -0
- package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-split-service/spec.md +55 -0
- package/examples/docs/features/FEAT-112-retire-order-v1/intent.md +35 -0
- package/examples/docs/features/FEAT-112-retire-order-v1/specs/order-service/openapi.yaml +31 -0
- package/examples/docs/features/FEAT-112-retire-order-v1/specs/order-service/spec.md +17 -0
- package/examples/docs/features/archive/FEAT-088-refunds/.loam-before/files/architecture/landscape.likec4 +253 -0
- package/examples/docs/features/archive/FEAT-088-refunds/.loam-before/files/services/order-service/spec.md +121 -0
- package/examples/docs/features/archive/FEAT-088-refunds/.loam-before/files/services/payment-service/openapi.yaml +111 -0
- package/examples/docs/features/archive/FEAT-088-refunds/.loam-before/files/services/payment-service/spec.md +58 -0
- package/examples/docs/features/archive/FEAT-088-refunds/.loam-before/manifest.json +32 -0
- package/examples/docs/features/archive/FEAT-088-refunds/adrs/0001-refunds-stay-in-payment-service.md +26 -0
- package/examples/docs/features/archive/FEAT-088-refunds/delta.likec4 +28 -0
- package/examples/docs/features/archive/FEAT-088-refunds/intent.md +26 -0
- package/examples/docs/features/archive/FEAT-088-refunds/specs/order-service/spec.md +37 -0
- package/examples/docs/features/archive/FEAT-088-refunds/specs/payment-service/openapi.yaml +73 -0
- package/examples/docs/features/archive/FEAT-088-refunds/specs/payment-service/spec.md +23 -0
- package/examples/docs/features/archive/FEAT-088-refunds/verification.yaml +76 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/files/architecture/landscape.likec4 +275 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/files/services/payment-service/asyncapi.yaml +96 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/files/services/payment-service/spec.md +82 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/files/services/platform/notification-service/asyncapi.yaml +164 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/files/services/platform/notification-service/spec.md +91 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/manifest.json +46 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/delta.likec4 +36 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/intent.md +22 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/scenario-report.json +10 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/specs/notification-service/asyncapi.yaml +208 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/specs/notification-service/spec.md +24 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/specs/payment-service/asyncapi.yaml +137 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/specs/payment-service/spec.md +31 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/verification.yaml +84 -0
- package/examples/docs/glossary/order.md +15 -0
- package/examples/docs/glossary/payments/authorization.md +14 -0
- package/examples/docs/likec4.config.json +8 -0
- package/examples/docs/loam.json +3 -0
- package/examples/docs/services/checkout-web/model.likec4 +92 -0
- package/examples/docs/services/checkout-web/spec.md +91 -0
- package/examples/docs/services/checkout-web/ui/pages/checkout.page.yaml +40 -0
- package/examples/docs/services/checkout-web/ui/pages/order-status.page.yaml +24 -0
- package/examples/docs/services/checkout-web/ui/pages/split-payment.page.yaml +26 -0
- package/examples/docs/services/order-service/adrs/0001-orchestrated-order-lifecycle.md +52 -0
- package/examples/docs/services/order-service/arch.spec.md +134 -0
- package/examples/docs/services/order-service/asyncapi.yaml +109 -0
- package/examples/docs/services/order-service/health.yaml +57 -0
- package/examples/docs/services/order-service/model.likec4 +126 -0
- package/examples/docs/services/order-service/openapi.yaml +257 -0
- package/examples/docs/services/order-service/runbook.md +62 -0
- package/examples/docs/services/order-service/spec.md +134 -0
- package/examples/docs/services/payment-service/adrs/0001-payments-outbox.md +18 -0
- package/examples/docs/services/payment-service/adrs/0002-idempotency-keys-on-authorization.md +27 -0
- package/examples/docs/services/payment-service/arch.spec.md +76 -0
- package/examples/docs/services/payment-service/asyncapi.yaml +130 -0
- package/examples/docs/services/payment-service/health.yaml +39 -0
- package/examples/docs/services/payment-service/model.likec4 +68 -0
- package/examples/docs/services/payment-service/openapi.yaml +151 -0
- package/examples/docs/services/payment-service/runbook.md +37 -0
- package/examples/docs/services/payment-service/spec.md +88 -0
- package/examples/docs/services/platform/identity-service/adrs/0001-token-introspection-over-local-validation.md +60 -0
- package/examples/docs/services/platform/identity-service/arch.spec.md +120 -0
- package/examples/docs/services/platform/identity-service/health.yaml +70 -0
- package/examples/docs/services/platform/identity-service/model.likec4 +81 -0
- package/examples/docs/services/platform/identity-service/openapi.yaml +197 -0
- package/examples/docs/services/platform/identity-service/runbook.md +95 -0
- package/examples/docs/services/platform/identity-service/spec.md +119 -0
- package/examples/docs/services/platform/notification-service/asyncapi.yaml +200 -0
- package/examples/docs/services/platform/notification-service/health.yaml +40 -0
- package/examples/docs/services/platform/notification-service/model.likec4 +97 -0
- package/examples/docs/services/platform/notification-service/runbook.md +48 -0
- package/examples/docs/services/platform/notification-service/spec.md +112 -0
- package/examples/docs/services/platform/subsystem.yaml +2 -0
- package/examples/fleet.yaml +57 -0
- package/package.json +19 -6
- package/dist/commands/adopt.js +0 -240
- package/dist/commands/adopt.js.map +0 -1
- package/dist/commands/archive.js +0 -1313
- package/dist/commands/archive.js.map +0 -1
- package/dist/commands/delta.js +0 -388
- package/dist/commands/delta.js.map +0 -1
- package/dist/commands/docs-repo-gate.js.map +0 -1
- package/dist/commands/format.js +0 -17
- package/dist/commands/format.js.map +0 -1
- package/dist/commands/gherkin.js +0 -309
- package/dist/commands/gherkin.js.map +0 -1
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/list.js +0 -295
- package/dist/commands/list.js.map +0 -1
- package/dist/commands/migrate-openspec.js +0 -950
- package/dist/commands/migrate-openspec.js.map +0 -1
- package/dist/commands/new.js +0 -413
- package/dist/commands/new.js.map +0 -1
- package/dist/commands/rebase.js +0 -356
- package/dist/commands/rebase.js.map +0 -1
- package/dist/commands/show.js +0 -320
- package/dist/commands/show.js.map +0 -1
- package/dist/commands/status.js +0 -262
- package/dist/commands/status.js.map +0 -1
- package/dist/commands/unarchive.js +0 -317
- package/dist/commands/unarchive.js.map +0 -1
- package/dist/commands/validate.js +0 -1773
- package/dist/commands/validate.js.map +0 -1
- package/dist/commands/verify.js +0 -775
- package/dist/commands/verify.js.map +0 -1
- package/dist/commands/vouch.js +0 -421
- package/dist/commands/vouch.js.map +0 -1
- package/dist/core/agent.js +0 -2173
- package/dist/core/agent.js.map +0 -1
- package/dist/core/agents-stamp.js.map +0 -1
- package/dist/core/arch.js +0 -130
- package/dist/core/arch.js.map +0 -1
- package/dist/core/asyncapi.js +0 -253
- package/dist/core/asyncapi.js.map +0 -1
- package/dist/core/brief.js +0 -755
- package/dist/core/brief.js.map +0 -1
- package/dist/core/coherence.js +0 -577
- package/dist/core/coherence.js.map +0 -1
- package/dist/core/concurrency.js.map +0 -1
- package/dist/core/config.js.map +0 -1
- package/dist/core/delta.js +0 -476
- package/dist/core/delta.js.map +0 -1
- package/dist/core/dependencies.js +0 -356
- package/dist/core/dependencies.js.map +0 -1
- package/dist/core/doctor.js +0 -596
- package/dist/core/doctor.js.map +0 -1
- package/dist/core/document-bytes.js.map +0 -1
- package/dist/core/explore.js +0 -225
- package/dist/core/explore.js.map +0 -1
- package/dist/core/frontmatter.js.map +0 -1
- package/dist/core/gherkin.js +0 -463
- package/dist/core/gherkin.js.map +0 -1
- package/dist/core/health.js +0 -67
- package/dist/core/health.js.map +0 -1
- package/dist/core/ids.js +0 -122
- package/dist/core/ids.js.map +0 -1
- package/dist/core/issue.js +0 -9
- package/dist/core/issue.js.map +0 -1
- package/dist/core/json.js +0 -74
- package/dist/core/json.js.map +0 -1
- package/dist/core/likec4.js +0 -489
- package/dist/core/likec4.js.map +0 -1
- package/dist/core/maturity.js +0 -66
- package/dist/core/maturity.js.map +0 -1
- package/dist/core/openapi-merge.js +0 -552
- package/dist/core/openapi-merge.js.map +0 -1
- package/dist/core/openapi.js.map +0 -1
- package/dist/core/openspec-inventory.js +0 -1440
- package/dist/core/openspec-inventory.js.map +0 -1
- package/dist/core/path-safety.js.map +0 -1
- package/dist/core/provenance.js +0 -787
- package/dist/core/provenance.js.map +0 -1
- package/dist/core/records.js.map +0 -1
- package/dist/core/repo.js +0 -438
- package/dist/core/repo.js.map +0 -1
- package/dist/core/report.js +0 -47
- package/dist/core/report.js.map +0 -1
- package/dist/core/spec.js +0 -505
- package/dist/core/spec.js.map +0 -1
- package/dist/core/staging.js +0 -890
- package/dist/core/staging.js.map +0 -1
- package/dist/core/status.js +0 -1132
- package/dist/core/status.js.map +0 -1
- package/dist/core/steps.js +0 -72
- package/dist/core/steps.js.map +0 -1
- package/dist/core/verify.js +0 -807
- package/dist/core/verify.js.map +0 -1
- package/dist/core/version.js.map +0 -1
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `loam init --example <dir>`: copy the example fleet OUT OF the installed
|
|
3
|
+
* binary, so somebody evaluating loam can watch it work before modelling a
|
|
4
|
+
* single boundary of their own.
|
|
5
|
+
*
|
|
6
|
+
* The defect this exists to kill was measured, not imagined. `npm i -g
|
|
7
|
+
* @ybotok/loam` used to deliver no example at all — `files[]` shipped `dist`
|
|
8
|
+
* and eight Markdown pages, `examples/` was excluded, no verb in `--help` was
|
|
9
|
+
* demo/example/tour/sample, and all three `--dry-run` flags need a docs repo
|
|
10
|
+
* that already exists. So the first honest question an evaluating team asks —
|
|
11
|
+
* "show me a working one" — was answered with "model your own boundaries
|
|
12
|
+
* first, then come back". `examples` joining `files[]` is the other half of
|
|
13
|
+
* this change; this is the half that hands the tree to the user.
|
|
14
|
+
*
|
|
15
|
+
* A flag on `init` rather than a command of its own, and the flag/command line
|
|
16
|
+
* is exactly the contradiction matrix below: `--example` shares init's SUBJECT
|
|
17
|
+
* (this directory is about to become a loam workspace) and shares nothing else
|
|
18
|
+
* with it — no repository is bound, no agent files are scaffolded, no
|
|
19
|
+
* `docsDir` is recorded. A second verb would have re-litigated all of that.
|
|
20
|
+
*/
|
|
21
|
+
import { existsSync, statSync } from "node:fs";
|
|
22
|
+
import { readdir, readFile } from "node:fs/promises";
|
|
23
|
+
import { join, resolve } from "node:path";
|
|
24
|
+
import { fileURLToPath } from "node:url";
|
|
25
|
+
import { emitJson, fail } from "../../core/envelope/json.js";
|
|
26
|
+
import { inOrder } from "../../core/kernel/concurrency.js";
|
|
27
|
+
import { stageWrites } from "../../core/staging/commit.js";
|
|
28
|
+
import { commitStaged } from "../../core/staging/txn/transaction.js";
|
|
29
|
+
import { planWrite } from "../../core/staging/writes.js";
|
|
30
|
+
/**
|
|
31
|
+
* The packaged example fleet, found relative to THIS module rather than to
|
|
32
|
+
* `process.cwd()` or to any config: the tree is part of the artifact, and the
|
|
33
|
+
* whole point of the flag is that it works in a directory that has nothing in
|
|
34
|
+
* it yet.
|
|
35
|
+
*
|
|
36
|
+
* `../../../` is the package root from both layouts, which is why the path is
|
|
37
|
+
* written once instead of probed: this module is `src/commands/init/` in the
|
|
38
|
+
* repository and `dist/commands/init/` in the tarball, three levels below the
|
|
39
|
+
* root either way. `scripts/package-smoke.mjs` proves the tarball half by
|
|
40
|
+
* running the shipped binary, and `examples` is in `REVIEWED_PACKAGE_FILES`
|
|
41
|
+
* (scripts/package-docs.mjs) so the tree cannot leave the package without the
|
|
42
|
+
* release preflight blocking.
|
|
43
|
+
*/
|
|
44
|
+
const EXAMPLE_TREE = resolve(fileURLToPath(new URL("../../../examples/docs/", import.meta.url)));
|
|
45
|
+
/**
|
|
46
|
+
* The three commands the copy exists to make runnable, each with what it
|
|
47
|
+
* demonstrates. `cd` is prefixed to the first one at print time — it is the
|
|
48
|
+
* one line that is about the caller's shell rather than about loam.
|
|
49
|
+
*
|
|
50
|
+
* Spelled as `command:` string literals deliberately: that is the shape
|
|
51
|
+
* test/agent-commands-runnable.test.ts scrapes out of `src/**` (its
|
|
52
|
+
* `nextCommands`, the one `loam status`'s next[] steps use), so all three are
|
|
53
|
+
* parsed against the real commander program at gate time. loam ships
|
|
54
|
+
* instructions; an instruction that does not parse is a defect, and these are
|
|
55
|
+
* the first three an evaluating user ever types. The sibling table in
|
|
56
|
+
* first-hour.ts is reached by IMPORT instead, because its rows are tuples that
|
|
57
|
+
* no scrape can see — two mechanisms, one obligation.
|
|
58
|
+
*/
|
|
59
|
+
const TOUR = [
|
|
60
|
+
{ command: "loam status", why: "what to do next, derived from the files" },
|
|
61
|
+
{ command: "loam validate --all", why: "the gate CI runs: 0 errors, 10 deliberate warnings" },
|
|
62
|
+
{ command: "loam show FEAT-101", why: "one in-flight feature, end to end" },
|
|
63
|
+
];
|
|
64
|
+
/**
|
|
65
|
+
* Copy the packaged example fleet to `req.dir`, or refuse.
|
|
66
|
+
*
|
|
67
|
+
* Nothing here consults `loam.json`, and that is the point of the
|
|
68
|
+
* short-circuit its caller performs: `--example` writes a FRESH tree, it does
|
|
69
|
+
* not join a system, so init's governing-config guard — which refuses when a
|
|
70
|
+
* `loam.json` in an ancestor already governs this directory — is a rule about
|
|
71
|
+
* a question this flag never asks.
|
|
72
|
+
*/
|
|
73
|
+
export async function initExample(req) {
|
|
74
|
+
const { json } = req;
|
|
75
|
+
// The contradiction matrix, and naming it is what keeps `--example` a FLAG
|
|
76
|
+
// rather than a second command hiding inside `init`. Each of these four asks
|
|
77
|
+
// for a write that `--example` does not make: `--docs` and `--create` name a
|
|
78
|
+
// docs repo to point at or scaffold, `--service` binds this repository to a
|
|
79
|
+
// service, `--tools` selects agent files to generate. `--example` binds no
|
|
80
|
+
// repository and scaffolds no agent files, so none of them is a modifier of
|
|
81
|
+
// it — each is a different command spelled on the same line, and arbitrating
|
|
82
|
+
// between them would be inventing which one the caller meant.
|
|
83
|
+
//
|
|
84
|
+
// `--force`, `--no-commands` and `--no-skills` are deliberately NOT here:
|
|
85
|
+
// each only SUPPRESSES something (a refusal, a set of generated files) that
|
|
86
|
+
// this path already does not do, so none of them contradicts anything.
|
|
87
|
+
if (req.conflicts.length > 0) {
|
|
88
|
+
fail(json, "invalid-option", `--example contradicts ${req.conflicts.join(" and ")}: --example copies the packaged example ` +
|
|
89
|
+
"fleet into a fresh directory — it binds no repository, records no docsDir and generates no " +
|
|
90
|
+
"agent files. Copy the example first, then run loam init in the repository you are onboarding.");
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
const target = resolve(process.cwd(), req.dir);
|
|
94
|
+
const occupant = await occupancy(target);
|
|
95
|
+
if (occupant !== null) {
|
|
96
|
+
fail(json, "already-exists", `${target} ${occupant}. --example writes a whole tree and never merges into one that is ` +
|
|
97
|
+
"already there. Name a directory that does not exist yet, or an empty one.");
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
const writes = await planCopy(target);
|
|
101
|
+
const staged = await stageWrites(writes);
|
|
102
|
+
// The journaled transaction every other loam writer uses, and not `cp`,
|
|
103
|
+
// because the failure mode is the same one it exists for: a copy killed
|
|
104
|
+
// half way leaves a directory that LOOKS like a docs repo and validates as a
|
|
105
|
+
// broken one, and the reader has no way to tell that from an example that
|
|
106
|
+
// was always wrong. The journal's root is the target, so a killed run leaves
|
|
107
|
+
// `.loam-commit` beside the half-tree naming every file — and every write is
|
|
108
|
+
// an exclusive create (nothing here exists yet), so two `--example` runs
|
|
109
|
+
// racing for one directory serialise into the same `already-exists` the
|
|
110
|
+
// occupancy check above gives, exactly as `loam new` does for a feature id.
|
|
111
|
+
//
|
|
112
|
+
// No docs lock is taken, and that is the one place this departs from
|
|
113
|
+
// new/seed: the lock serialises writers against a SHARED docs repo, and the
|
|
114
|
+
// target here is a directory this run is creating. There is no predecessor
|
|
115
|
+
// commit to recover in a tree that does not exist yet.
|
|
116
|
+
const committed = await commitStaged({ root: target, command: "init", rerun: `loam init --example ${req.dir}`, target: "example" }, staged, "copied");
|
|
117
|
+
if (!committed.ok) {
|
|
118
|
+
if (committed.raced) {
|
|
119
|
+
fail(json, "already-exists", `${target} was created by another writer while this copy was being staged — nothing was ` +
|
|
120
|
+
"written. Name a directory that does not exist yet, or an empty one.");
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
fail(json, committed.code, committed.message);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
report(req, target, writes);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Why `target` cannot be written into, as the clause a refusal reads with — or
|
|
130
|
+
* null when it is free.
|
|
131
|
+
*
|
|
132
|
+
* A path that exists and is not a directory is refused by the same code as a
|
|
133
|
+
* non-empty directory on purpose: the caller's question is "may I have this
|
|
134
|
+
* name?", and the answer is no for the same reason either way.
|
|
135
|
+
*/
|
|
136
|
+
async function occupancy(target) {
|
|
137
|
+
if (!existsSync(target))
|
|
138
|
+
return null;
|
|
139
|
+
if (!statSync(target).isDirectory())
|
|
140
|
+
return "already exists and is not a directory";
|
|
141
|
+
return (await readdir(target)).length > 0 ? "already exists and is not empty" : null;
|
|
142
|
+
}
|
|
143
|
+
/** Every file of the packaged tree, planned as an exclusive create under `target`. */
|
|
144
|
+
async function planCopy(target) {
|
|
145
|
+
const paths = await treePaths(EXAMPLE_TREE);
|
|
146
|
+
// BYTES, never text: `readFile` without an encoding, straight into the
|
|
147
|
+
// planned write. A round trip through a string would substitute U+FFFD for
|
|
148
|
+
// every byte loam does not understand (core/staging/writes.ts records the
|
|
149
|
+
// defect), and the contract this command is tested against is that the copy
|
|
150
|
+
// is byte-identical to the tree that shipped.
|
|
151
|
+
return inOrder(paths, async (rel) => planWrite(join(target, ...rel.split("/")), await readFile(join(EXAMPLE_TREE, ...rel.split("/")))));
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Every FILE under `root`, relative with forward slashes, in a stable order.
|
|
155
|
+
*
|
|
156
|
+
* Sorted per directory so the write order — and therefore the transaction
|
|
157
|
+
* journal — is the same on every host, whatever order the filesystem
|
|
158
|
+
* enumerates in. Directories are not carried: the example tree has no empty
|
|
159
|
+
* one, and `stageWrites` makes each file's parent on the way in.
|
|
160
|
+
*/
|
|
161
|
+
async function treePaths(root) {
|
|
162
|
+
const out = [];
|
|
163
|
+
const walk = async (dir, prefix) => {
|
|
164
|
+
const entries = (await readdir(dir, { withFileTypes: true })).sort((a, b) => a.name < b.name ? -1 : a.name > b.name ? 1 : 0);
|
|
165
|
+
// Sequential, and the ordering IS the reason: `out` is one shared
|
|
166
|
+
// accumulator and its order is the journal's order.
|
|
167
|
+
for (const entry of entries) {
|
|
168
|
+
const rel = `${prefix}${entry.name}`;
|
|
169
|
+
if (entry.isDirectory())
|
|
170
|
+
await walk(join(dir, entry.name), `${rel}/`);
|
|
171
|
+
else
|
|
172
|
+
out.push(rel);
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
await walk(root, "");
|
|
176
|
+
return out;
|
|
177
|
+
}
|
|
178
|
+
/** The two views of a finished copy. Neither reads the tree again. */
|
|
179
|
+
function report(req, target, writes) {
|
|
180
|
+
const created = writes.map((w) => w.path);
|
|
181
|
+
if (req.json) {
|
|
182
|
+
emitJson({ command: "init", example: { source: EXAMPLE_TREE, dir: target }, created });
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
console.log("Example fleet copied.");
|
|
186
|
+
console.log(` from: ${EXAMPLE_TREE}`);
|
|
187
|
+
console.log(` to: ${target}`);
|
|
188
|
+
console.log(` files: ${created.length} — five services, four features, and its own loam.json`);
|
|
189
|
+
console.log(" the tree governs itself, so every command below resolves to this fleet");
|
|
190
|
+
// The first line carries the `cd` because the tree governs itself: these
|
|
191
|
+
// commands answer about THIS fleet only when they are run from inside it.
|
|
192
|
+
// The width is computed over the printed lines, `cd` included, so the
|
|
193
|
+
// comment column is straight.
|
|
194
|
+
const prefix = `cd ${req.dir} && `;
|
|
195
|
+
const lines = TOUR.map((step, i) => ({
|
|
196
|
+
text: i === 0 ? `${prefix}${step.command}` : step.command,
|
|
197
|
+
why: step.why,
|
|
198
|
+
}));
|
|
199
|
+
const width = Math.max(...lines.map((line) => line.text.length));
|
|
200
|
+
console.log(" next — run it:");
|
|
201
|
+
for (const line of lines)
|
|
202
|
+
console.log(` ${line.text.padEnd(width)} # ${line.why}`);
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=example.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"example.js","sourceRoot":"","sources":["../../../src/commands/init/example.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * `loam init --example <dir>`: copy the example fleet OUT OF the installed\n * binary, so somebody evaluating loam can watch it work before modelling a\n * single boundary of their own.\n *\n * The defect this exists to kill was measured, not imagined. `npm i -g\n * @ybotok/loam` used to deliver no example at all — `files[]` shipped `dist`\n * and eight Markdown pages, `examples/` was excluded, no verb in `--help` was\n * demo/example/tour/sample, and all three `--dry-run` flags need a docs repo\n * that already exists. So the first honest question an evaluating team asks —\n * \"show me a working one\" — was answered with \"model your own boundaries\n * first, then come back\". `examples` joining `files[]` is the other half of\n * this change; this is the half that hands the tree to the user.\n *\n * A flag on `init` rather than a command of its own, and the flag/command line\n * is exactly the contradiction matrix below: `--example` shares init's SUBJECT\n * (this directory is about to become a loam workspace) and shares nothing else\n * with it — no repository is bound, no agent files are scaffolded, no\n * `docsDir` is recorded. A second verb would have re-litigated all of that.\n */\nimport { existsSync, statSync } from \"node:fs\";\nimport { readdir, readFile } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { emitJson, fail } from \"../../core/envelope/json.js\";\nimport { inOrder } from \"../../core/kernel/concurrency.js\";\nimport { stageWrites } from \"../../core/staging/commit.js\";\nimport { commitStaged } from \"../../core/staging/txn/transaction.js\";\nimport { planWrite, type PlannedWrite } from \"../../core/staging/writes.js\";\n\n/**\n * The packaged example fleet, found relative to THIS module rather than to\n * `process.cwd()` or to any config: the tree is part of the artifact, and the\n * whole point of the flag is that it works in a directory that has nothing in\n * it yet.\n *\n * `../../../` is the package root from both layouts, which is why the path is\n * written once instead of probed: this module is `src/commands/init/` in the\n * repository and `dist/commands/init/` in the tarball, three levels below the\n * root either way. `scripts/package-smoke.mjs` proves the tarball half by\n * running the shipped binary, and `examples` is in `REVIEWED_PACKAGE_FILES`\n * (scripts/package-docs.mjs) so the tree cannot leave the package without the\n * release preflight blocking.\n */\nconst EXAMPLE_TREE = resolve(fileURLToPath(new URL(\"../../../examples/docs/\", import.meta.url)));\n\n/**\n * The three commands the copy exists to make runnable, each with what it\n * demonstrates. `cd` is prefixed to the first one at print time — it is the\n * one line that is about the caller's shell rather than about loam.\n *\n * Spelled as `command:` string literals deliberately: that is the shape\n * test/agent-commands-runnable.test.ts scrapes out of `src/**` (its\n * `nextCommands`, the one `loam status`'s next[] steps use), so all three are\n * parsed against the real commander program at gate time. loam ships\n * instructions; an instruction that does not parse is a defect, and these are\n * the first three an evaluating user ever types. The sibling table in\n * first-hour.ts is reached by IMPORT instead, because its rows are tuples that\n * no scrape can see — two mechanisms, one obligation.\n */\nconst TOUR = [\n { command: \"loam status\", why: \"what to do next, derived from the files\" },\n { command: \"loam validate --all\", why: \"the gate CI runs: 0 errors, 10 deliberate warnings\" },\n { command: \"loam show FEAT-101\", why: \"one in-flight feature, end to end\" },\n];\n\nexport interface ExampleRequest {\n /** `--example <dir>` exactly as typed: what `cd` is spelled with in the epilogue. */\n dir: string;\n /**\n * Which of `--docs`, `--service`, `--create`, `--tools` were actually\n * passed. Computed by the caller because only it can tell a typed `--docs`\n * from commander's default.\n */\n conflicts: string[];\n json: boolean;\n}\n\n/**\n * Copy the packaged example fleet to `req.dir`, or refuse.\n *\n * Nothing here consults `loam.json`, and that is the point of the\n * short-circuit its caller performs: `--example` writes a FRESH tree, it does\n * not join a system, so init's governing-config guard — which refuses when a\n * `loam.json` in an ancestor already governs this directory — is a rule about\n * a question this flag never asks.\n */\nexport async function initExample(req: ExampleRequest): Promise<void> {\n const { json } = req;\n\n // The contradiction matrix, and naming it is what keeps `--example` a FLAG\n // rather than a second command hiding inside `init`. Each of these four asks\n // for a write that `--example` does not make: `--docs` and `--create` name a\n // docs repo to point at or scaffold, `--service` binds this repository to a\n // service, `--tools` selects agent files to generate. `--example` binds no\n // repository and scaffolds no agent files, so none of them is a modifier of\n // it — each is a different command spelled on the same line, and arbitrating\n // between them would be inventing which one the caller meant.\n //\n // `--force`, `--no-commands` and `--no-skills` are deliberately NOT here:\n // each only SUPPRESSES something (a refusal, a set of generated files) that\n // this path already does not do, so none of them contradicts anything.\n if (req.conflicts.length > 0) {\n fail(\n json,\n \"invalid-option\",\n `--example contradicts ${req.conflicts.join(\" and \")}: --example copies the packaged example ` +\n \"fleet into a fresh directory — it binds no repository, records no docsDir and generates no \" +\n \"agent files. Copy the example first, then run loam init in the repository you are onboarding.\",\n );\n return;\n }\n\n const target = resolve(process.cwd(), req.dir);\n const occupant = await occupancy(target);\n if (occupant !== null) {\n fail(\n json,\n \"already-exists\",\n `${target} ${occupant}. --example writes a whole tree and never merges into one that is ` +\n \"already there. Name a directory that does not exist yet, or an empty one.\",\n );\n return;\n }\n\n const writes = await planCopy(target);\n const staged = await stageWrites(writes);\n // The journaled transaction every other loam writer uses, and not `cp`,\n // because the failure mode is the same one it exists for: a copy killed\n // half way leaves a directory that LOOKS like a docs repo and validates as a\n // broken one, and the reader has no way to tell that from an example that\n // was always wrong. The journal's root is the target, so a killed run leaves\n // `.loam-commit` beside the half-tree naming every file — and every write is\n // an exclusive create (nothing here exists yet), so two `--example` runs\n // racing for one directory serialise into the same `already-exists` the\n // occupancy check above gives, exactly as `loam new` does for a feature id.\n //\n // No docs lock is taken, and that is the one place this departs from\n // new/seed: the lock serialises writers against a SHARED docs repo, and the\n // target here is a directory this run is creating. There is no predecessor\n // commit to recover in a tree that does not exist yet.\n const committed = await commitStaged(\n { root: target, command: \"init\", rerun: `loam init --example ${req.dir}`, target: \"example\" },\n staged,\n \"copied\",\n );\n if (!committed.ok) {\n if (committed.raced) {\n fail(\n json,\n \"already-exists\",\n `${target} was created by another writer while this copy was being staged — nothing was ` +\n \"written. Name a directory that does not exist yet, or an empty one.\",\n );\n return;\n }\n fail(json, committed.code, committed.message);\n return;\n }\n\n report(req, target, writes);\n}\n\n/**\n * Why `target` cannot be written into, as the clause a refusal reads with — or\n * null when it is free.\n *\n * A path that exists and is not a directory is refused by the same code as a\n * non-empty directory on purpose: the caller's question is \"may I have this\n * name?\", and the answer is no for the same reason either way.\n */\nasync function occupancy(target: string): Promise<string | null> {\n if (!existsSync(target)) return null;\n if (!statSync(target).isDirectory()) return \"already exists and is not a directory\";\n return (await readdir(target)).length > 0 ? \"already exists and is not empty\" : null;\n}\n\n/** Every file of the packaged tree, planned as an exclusive create under `target`. */\nasync function planCopy(target: string): Promise<PlannedWrite[]> {\n const paths = await treePaths(EXAMPLE_TREE);\n // BYTES, never text: `readFile` without an encoding, straight into the\n // planned write. A round trip through a string would substitute U+FFFD for\n // every byte loam does not understand (core/staging/writes.ts records the\n // defect), and the contract this command is tested against is that the copy\n // is byte-identical to the tree that shipped.\n return inOrder(paths, async (rel) =>\n planWrite(join(target, ...rel.split(\"/\")), await readFile(join(EXAMPLE_TREE, ...rel.split(\"/\")))),\n );\n}\n\n/**\n * Every FILE under `root`, relative with forward slashes, in a stable order.\n *\n * Sorted per directory so the write order — and therefore the transaction\n * journal — is the same on every host, whatever order the filesystem\n * enumerates in. Directories are not carried: the example tree has no empty\n * one, and `stageWrites` makes each file's parent on the way in.\n */\nasync function treePaths(root: string): Promise<string[]> {\n const out: string[] = [];\n const walk = async (dir: string, prefix: string): Promise<void> => {\n const entries = (await readdir(dir, { withFileTypes: true })).sort((a, b) =>\n a.name < b.name ? -1 : a.name > b.name ? 1 : 0,\n );\n // Sequential, and the ordering IS the reason: `out` is one shared\n // accumulator and its order is the journal's order.\n for (const entry of entries) {\n const rel = `${prefix}${entry.name}`;\n if (entry.isDirectory()) await walk(join(dir, entry.name), `${rel}/`);\n else out.push(rel);\n }\n };\n await walk(root, \"\");\n return out;\n}\n\n/** The two views of a finished copy. Neither reads the tree again. */\nfunction report(req: ExampleRequest, target: string, writes: PlannedWrite[]): void {\n const created = writes.map((w) => w.path);\n if (req.json) {\n emitJson({ command: \"init\", example: { source: EXAMPLE_TREE, dir: target }, created });\n return;\n }\n\n console.log(\"Example fleet copied.\");\n console.log(` from: ${EXAMPLE_TREE}`);\n console.log(` to: ${target}`);\n console.log(` files: ${created.length} — five services, four features, and its own loam.json`);\n console.log(\" the tree governs itself, so every command below resolves to this fleet\");\n\n // The first line carries the `cd` because the tree governs itself: these\n // commands answer about THIS fleet only when they are run from inside it.\n // The width is computed over the printed lines, `cd` included, so the\n // comment column is straight.\n const prefix = `cd ${req.dir} && `;\n const lines = TOUR.map((step, i) => ({\n text: i === 0 ? `${prefix}${step.command}` : step.command,\n why: step.why,\n }));\n const width = Math.max(...lines.map((line) => line.text.length));\n console.log(\" next — run it:\");\n for (const line of lines) console.log(` ${line.text.padEnd(width)} # ${line.why}`);\n}\n"]}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The four commands of the single-repo trial's first hour, each with the
|
|
3
|
+
* reason it is there. `init` prints them as its epilogue when one run both
|
|
4
|
+
* creates the docs repo and leaves a service bound (init.ts holds that guard
|
|
5
|
+
* and the why).
|
|
6
|
+
*
|
|
7
|
+
* A module of its own for two reasons. The seam: init.ts is the wiring — the
|
|
8
|
+
* flag guards and the scaffold sequence — while this table is what the trial
|
|
9
|
+
* user is told, and the table alone pushed init.ts past the 300-line limit.
|
|
10
|
+
* The export: test/agent-commands-runnable.test.ts feeds these commands
|
|
11
|
+
* through the real commander program by IMPORT, because the printed lines are
|
|
12
|
+
* plain text inside template literals — no markdown backticks, no
|
|
13
|
+
* single-quoted `loam` forms — so that suite's literal scrape cannot see
|
|
14
|
+
* them, and they are the first instruction a single-repo trial user receives:
|
|
15
|
+
* the exact class its header records shipping broken once as `loam adopt
|
|
16
|
+
* <id>`. README.md's Quick start reprints the same four lines, and
|
|
17
|
+
* test/cli.test.ts pins that copy to this table.
|
|
18
|
+
*/
|
|
19
|
+
export function firstHour(service) {
|
|
20
|
+
return [
|
|
21
|
+
[`loam adopt --service ${service} --json`,
|
|
22
|
+
"the brief: an agent reads the code, writes the baseline as draft"],
|
|
23
|
+
[`loam validate --service ${service}`, "grade the result in this repo"],
|
|
24
|
+
[`loam vouch --service ${service}`, "you, not the agent: draft -> verified"],
|
|
25
|
+
["loam status", "what to do next, derived from the files"],
|
|
26
|
+
];
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* The first hour of a docs repo created with NO service bound — WORKFLOW.md's
|
|
30
|
+
* Day zero steps 2–4, and the same rungs `loam status` answers on an empty
|
|
31
|
+
* fleet (`next.author-landscape`, `next.bind-service`, `next.adopt-first`).
|
|
32
|
+
*
|
|
33
|
+
* This run used to print nothing after the scaffold list: the single-repo
|
|
34
|
+
* table above needs a service id to name, and the guard that withheld it read
|
|
35
|
+
* "nothing is bound" as "nothing to say". But this is the Day zero composition
|
|
36
|
+
* itself — the person who just created the fleet's shared repo — and its next
|
|
37
|
+
* steps are as fixed as the trial's: state the map, bind each service's own
|
|
38
|
+
* repo, adopt. The ids are placeholders because nothing here knows them yet,
|
|
39
|
+
* which is also why the runnable-commands suite substitutes them like every
|
|
40
|
+
* other `<id>` it parses. Exported for that suite, by import, for the reason
|
|
41
|
+
* the header gives.
|
|
42
|
+
*
|
|
43
|
+
* The bind line names `--agent-profile service` because it is run in a
|
|
44
|
+
* SERVICE checkout of a fleet whose features are authored and archived here,
|
|
45
|
+
* in this docs repo: the profile defaults to `full`, and `full` puts
|
|
46
|
+
* `loam-feature` and `loam-ship` into every service repo — the outcome
|
|
47
|
+
* README's "Pass the profile explicitly" warns against. Agents type the
|
|
48
|
+
* command loam prints, not the README.
|
|
49
|
+
*/
|
|
50
|
+
export function docsRepoFirstHour() {
|
|
51
|
+
return [
|
|
52
|
+
["loam seed --from fleet.yaml", "the fleet map from a fleet.yaml you write, or draw it by hand"],
|
|
53
|
+
["loam init --docs <docs-repo> --service <id> --agent-profile service",
|
|
54
|
+
"in each service's own repo: bind it, commit loam.json"],
|
|
55
|
+
["loam adopt --service <id> --json", "there: the brief, an agent writes the baseline as draft"],
|
|
56
|
+
["loam status", "what to do next, derived from the files"],
|
|
57
|
+
];
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* The epilogue's printed lines — the heading and one aligned `command # why`
|
|
61
|
+
* row per step — for whichever first hour this run earned. Rendering only:
|
|
62
|
+
* init.ts decides WHETHER (never on a join), this decides which table and how
|
|
63
|
+
* it reads, so the two variants cannot drift into two layouts.
|
|
64
|
+
*/
|
|
65
|
+
export function firstHourLines(service) {
|
|
66
|
+
const [heading, steps] = service === undefined
|
|
67
|
+
? ["next — the docs repo's first hour:", docsRepoFirstHour()]
|
|
68
|
+
: ["next — the first hour:", firstHour(service)];
|
|
69
|
+
const width = Math.max(...steps.map(([command]) => command.length));
|
|
70
|
+
return [` ${heading}`, ...steps.map(([command, why]) => ` ${command.padEnd(width)} # ${why}`)];
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=first-hour.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"first-hour.js","sourceRoot":"","sources":["../../../src/commands/init/first-hour.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,OAAO;QACL,CAAC,wBAAwB,OAAO,SAAS;YACvC,kEAAkE,CAAC;QACrE,CAAC,2BAA2B,OAAO,EAAE,EAAE,+BAA+B,CAAC;QACvE,CAAC,wBAAwB,OAAO,EAAE,EAAE,uCAAuC,CAAC;QAC5E,CAAC,aAAa,EAAE,yCAAyC,CAAC;KAC3D,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO;QACL,CAAC,6BAA6B,EAAE,+DAA+D,CAAC;QAChG,CAAC,qEAAqE;YACpE,uDAAuD,CAAC;QAC1D,CAAC,kCAAkC,EAAE,yDAAyD,CAAC;QAC/F,CAAC,aAAa,EAAE,yCAAyC,CAAC;KAC3D,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,OAA2B;IACxD,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,OAAO,KAAK,SAAS;QAC5C,CAAC,CAAC,CAAC,oCAAoC,EAAE,iBAAiB,EAAE,CAAC;QAC7D,CAAC,CAAC,CAAC,wBAAwB,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IACpE,OAAO,CAAC,KAAK,OAAO,EAAE,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC,CAAC;AACvG,CAAC","sourcesContent":["/**\n * The four commands of the single-repo trial's first hour, each with the\n * reason it is there. `init` prints them as its epilogue when one run both\n * creates the docs repo and leaves a service bound (init.ts holds that guard\n * and the why).\n *\n * A module of its own for two reasons. The seam: init.ts is the wiring — the\n * flag guards and the scaffold sequence — while this table is what the trial\n * user is told, and the table alone pushed init.ts past the 300-line limit.\n * The export: test/agent-commands-runnable.test.ts feeds these commands\n * through the real commander program by IMPORT, because the printed lines are\n * plain text inside template literals — no markdown backticks, no\n * single-quoted `loam` forms — so that suite's literal scrape cannot see\n * them, and they are the first instruction a single-repo trial user receives:\n * the exact class its header records shipping broken once as `loam adopt\n * <id>`. README.md's Quick start reprints the same four lines, and\n * test/cli.test.ts pins that copy to this table.\n */\nexport function firstHour(service: string): Array<[command: string, why: string]> {\n return [\n [`loam adopt --service ${service} --json`,\n \"the brief: an agent reads the code, writes the baseline as draft\"],\n [`loam validate --service ${service}`, \"grade the result in this repo\"],\n [`loam vouch --service ${service}`, \"you, not the agent: draft -> verified\"],\n [\"loam status\", \"what to do next, derived from the files\"],\n ];\n}\n\n/**\n * The first hour of a docs repo created with NO service bound — WORKFLOW.md's\n * Day zero steps 2–4, and the same rungs `loam status` answers on an empty\n * fleet (`next.author-landscape`, `next.bind-service`, `next.adopt-first`).\n *\n * This run used to print nothing after the scaffold list: the single-repo\n * table above needs a service id to name, and the guard that withheld it read\n * \"nothing is bound\" as \"nothing to say\". But this is the Day zero composition\n * itself — the person who just created the fleet's shared repo — and its next\n * steps are as fixed as the trial's: state the map, bind each service's own\n * repo, adopt. The ids are placeholders because nothing here knows them yet,\n * which is also why the runnable-commands suite substitutes them like every\n * other `<id>` it parses. Exported for that suite, by import, for the reason\n * the header gives.\n *\n * The bind line names `--agent-profile service` because it is run in a\n * SERVICE checkout of a fleet whose features are authored and archived here,\n * in this docs repo: the profile defaults to `full`, and `full` puts\n * `loam-feature` and `loam-ship` into every service repo — the outcome\n * README's \"Pass the profile explicitly\" warns against. Agents type the\n * command loam prints, not the README.\n */\nexport function docsRepoFirstHour(): Array<[command: string, why: string]> {\n return [\n [\"loam seed --from fleet.yaml\", \"the fleet map from a fleet.yaml you write, or draw it by hand\"],\n [\"loam init --docs <docs-repo> --service <id> --agent-profile service\",\n \"in each service's own repo: bind it, commit loam.json\"],\n [\"loam adopt --service <id> --json\", \"there: the brief, an agent writes the baseline as draft\"],\n [\"loam status\", \"what to do next, derived from the files\"],\n ];\n}\n\n/**\n * The epilogue's printed lines — the heading and one aligned `command # why`\n * row per step — for whichever first hour this run earned. Rendering only:\n * init.ts decides WHETHER (never on a join), this decides which table and how\n * it reads, so the two variants cannot drift into two layouts.\n */\nexport function firstHourLines(service: string | undefined): string[] {\n const [heading, steps] = service === undefined\n ? [\"next — the docs repo's first hour:\", docsRepoFirstHour()]\n : [\"next — the first hour:\", firstHour(service)];\n const width = Math.max(...steps.map(([command]) => command.length));\n return [` ${heading}`, ...steps.map(([command, why]) => ` ${command.padEnd(width)} # ${why}`)];\n}\n"]}
|
|
@@ -1,64 +1,18 @@
|
|
|
1
1
|
import { existsSync, statSync } from "node:fs";
|
|
2
2
|
import { resolve } from "node:path";
|
|
3
|
-
import { CONFIG_FILENAME, findConfigPath, loadConfig, localConfigPath, saveConfig, } from "
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
function resolveTools(raw, json) {
|
|
17
|
-
const supported = Object.keys(AGENT_TOOLS);
|
|
18
|
-
if (raw === "all")
|
|
19
|
-
return supported;
|
|
20
|
-
const ids = [...new Set(raw.split(",").map((t) => t.trim()).filter((t) => t !== ""))];
|
|
21
|
-
const unknown = ids.filter((t) => !(t in AGENT_TOOLS));
|
|
22
|
-
if (ids.length === 0 || unknown.length > 0) {
|
|
23
|
-
fail(json, "invalid-option", (ids.length === 0
|
|
24
|
-
? "--tools names no tool."
|
|
25
|
-
: `--tools does not recognize: ${unknown.join(", ")}.`) +
|
|
26
|
-
` Supported: ${supported.join(", ")} — or "all".`);
|
|
27
|
-
return null;
|
|
28
|
-
}
|
|
29
|
-
return ids;
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* `--docs` exactly as the caller wrote it, with separators normalised.
|
|
33
|
-
*
|
|
34
|
-
* Stored verbatim on purpose. `init` used to resolve it and write the absolute
|
|
35
|
-
* result, which meant a committed loam.json named a directory that existed on
|
|
36
|
-
* one laptop: every teammate who cloned the service repo got a docsDir under
|
|
37
|
-
* someone else's home directory, and `loam list` reported an empty fleet
|
|
38
|
-
* instead of saying so. `loadConfig` resolves relative paths against the config
|
|
39
|
-
* file's own directory, so `../docs` keeps meaning "next to this repo" wherever
|
|
40
|
-
* the pair is checked out. An absolute `--docs` is still stored absolute — that
|
|
41
|
-
* is the caller's explicit choice, and `loam doctor` warns about it.
|
|
42
|
-
*
|
|
43
|
-
* Backslashes become forward slashes so a config written on Windows resolves on
|
|
44
|
-
* POSIX; a trailing separator is dropped so the stored spelling is stable.
|
|
45
|
-
*/
|
|
46
|
-
function storedDocsDir(raw) {
|
|
47
|
-
const slashed = raw.split("\\").join("/");
|
|
48
|
-
if (slashed.length <= 1)
|
|
49
|
-
return slashed;
|
|
50
|
-
const trimmed = slashed.replace(/\/+$/, "");
|
|
51
|
-
return trimmed === "" ? "/" : trimmed;
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Does this directory already hold a docs repo? `services/` plus `AGENTS.md` —
|
|
55
|
-
* the two things every docs repo has and no service repo does. The pair is the
|
|
56
|
-
* whole point: a single marker would make `init --docs ../srv` (a typo for
|
|
57
|
-
* `../docs`) look like a join and adopt the service repo as the fleet.
|
|
58
|
-
*/
|
|
59
|
-
function isDocsRepo(dir) {
|
|
60
|
-
return docsRepoState(dir).kind === "ok" && existsSync(agentsPath(dir));
|
|
61
|
-
}
|
|
3
|
+
import { CONFIG_FILENAME, findConfigPath, loadConfig, localConfigPath, saveConfig, } from "../../core/envelope/config.js";
|
|
4
|
+
import { docsDirOf } from "../../core/kernel/ids/dirs.js";
|
|
5
|
+
import { emitJson, fail } from "../../core/envelope/json.js";
|
|
6
|
+
import { plannedDocsFiles, scaffoldDocs } from "../../core/docs.js";
|
|
7
|
+
import { docsRepoState } from "../../core/repo/state.js";
|
|
8
|
+
import { listServices } from "../../core/repo/repo.js";
|
|
9
|
+
import { InvalidIdError, assertServiceId } from "../../core/kernel/ids/service.js";
|
|
10
|
+
import { detectAgentTools, plannedCommandFiles, syncAgentCommands, updatedAgentFileManifest, } from "../../core/agent/scaffold.js";
|
|
11
|
+
import { AGENT_TOOLS } from "../../core/agent/tools/registry.js";
|
|
12
|
+
import { initExample } from "./example.js";
|
|
13
|
+
import { firstHourLines } from "./first-hour.js";
|
|
14
|
+
import { MCP_CONFIG_FILENAME, mcpConfigPath, mcpServerSnippet, writeMcpConfig } from "./mcp.js";
|
|
15
|
+
import { isDocsRepo, resolveAgentProfile, resolveTools, storedDocsDir } from "./options.js";
|
|
62
16
|
export function registerInit(program) {
|
|
63
17
|
program
|
|
64
18
|
.command("init")
|
|
@@ -69,12 +23,42 @@ export function registerInit(program) {
|
|
|
69
23
|
.option("--force", `write ${CONFIG_FILENAME} here even though one governs a parent directory`)
|
|
70
24
|
.option("--tools <ids>", "agent tools to generate for, overriding the scan of this directory: " +
|
|
71
25
|
`comma-separated (${Object.keys(AGENT_TOOLS).join(", ")}) or "all"`)
|
|
26
|
+
.option("--agent-profile <profile>", "workflow set: full | service | docs")
|
|
27
|
+
.option("--example <dir>", "copy the packaged example fleet to <dir> and stop: no repository is bound, nothing is scaffolded")
|
|
72
28
|
.option("--no-commands", "skip the slash commands for this repo entirely")
|
|
73
29
|
.option("--no-skills", "skip the agent skills for this repo entirely")
|
|
30
|
+
.option("--mcp", `also write ${MCP_CONFIG_FILENAME} here, so an MCP host launches \`loam mcp\` for this repo`)
|
|
31
|
+
.option("--mcp-author", `write ${MCP_CONFIG_FILENAME} with the opt-in authoring profile`)
|
|
74
32
|
.option("--json", "emit the machine contract instead of the human view")
|
|
75
33
|
.action(async (opts, command) => {
|
|
76
34
|
const json = opts.json === true;
|
|
77
35
|
const cwd = process.cwd();
|
|
36
|
+
// FIRST, before every guard below including the governing-config one:
|
|
37
|
+
// `--example` writes a fresh tree, it does not join a system. A
|
|
38
|
+
// loam.json in an ancestor governs the directories a repository is bound
|
|
39
|
+
// INTO, and this flag binds nothing — refusing here would be the tool
|
|
40
|
+
// declining to show itself working because of a config that has no
|
|
41
|
+
// bearing on the copy. Before the --service id check too, so a run
|
|
42
|
+
// combining the two answers the contradiction rather than grading an id
|
|
43
|
+
// it is about to refuse to use.
|
|
44
|
+
if (opts.example !== undefined) {
|
|
45
|
+
await initExample({
|
|
46
|
+
dir: opts.example,
|
|
47
|
+
conflicts: [
|
|
48
|
+
// `--docs` carries a default, so only its SOURCE can say whether
|
|
49
|
+
// anybody typed it — the same question the docsDir precedence
|
|
50
|
+
// below asks, for the same reason.
|
|
51
|
+
...(command.getOptionValueSource("docs") !== "default" ? ["--docs"] : []),
|
|
52
|
+
...(opts.service !== undefined ? ["--service"] : []),
|
|
53
|
+
...(opts.create === true ? ["--create"] : []),
|
|
54
|
+
...(opts.tools !== undefined ? ["--tools"] : []),
|
|
55
|
+
...(opts.agentProfile !== undefined ? ["--agent-profile"] : []),
|
|
56
|
+
...(opts.mcpAuthor === true ? ["--mcp-author"] : []),
|
|
57
|
+
],
|
|
58
|
+
json,
|
|
59
|
+
});
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
78
62
|
// The id becomes services/<id>/ in the shared repo, so it is validated
|
|
79
63
|
// before anything is written — by the same rule adopt, vouch and gherkin
|
|
80
64
|
// use, never by a guard invented here.
|
|
@@ -103,7 +87,12 @@ export function registerInit(program) {
|
|
|
103
87
|
// Only THIS directory's config is spread forward. Under --force there is
|
|
104
88
|
// a config in an ancestor too, and inheriting its `service` would bind
|
|
105
89
|
// this repo to a service somebody else's repo declared.
|
|
106
|
-
|
|
90
|
+
// `kind: "invalid"` reads as null on purpose: init REPAIRS a corrupt
|
|
91
|
+
// loam.json by rewriting it, so a config nobody can read is treated
|
|
92
|
+
// exactly like no config at all. The old stderr line about it was
|
|
93
|
+
// core's side effect, promised nowhere.
|
|
94
|
+
const load = existsSync(localConfigPath(cwd)) ? await loadConfig(cwd) : null;
|
|
95
|
+
const existing = load?.kind === "loaded" ? load.config : null;
|
|
107
96
|
// A re-run must not move a committed pointer. `--docs` has a default
|
|
108
97
|
// (`.loam-docs`), so an init invoked for any OTHER reason — `--service`,
|
|
109
98
|
// a new `--tools`, the fix `doctor.agent-files-missing` prints — used to
|
|
@@ -118,7 +107,11 @@ export function registerInit(program) {
|
|
|
118
107
|
const docsTyped = command.getOptionValueSource("docs") !== "default";
|
|
119
108
|
const docsSource = docsTyped ? "flag" : committedDocs === undefined ? "default" : "config";
|
|
120
109
|
const docsOption = !docsTyped && committedDocs !== undefined ? committedDocs : opts.docs;
|
|
121
|
-
|
|
110
|
+
// Branded at the resolution, because the guards below are what validate
|
|
111
|
+
// it — the brand's provenance is "an explicit --docs a command
|
|
112
|
+
// validated", and this command is the one that does. The STORED spelling
|
|
113
|
+
// (`storedDocsDir` below) deliberately stays a plain string.
|
|
114
|
+
const docsDir = docsDirOf(resolve(cwd, docsOption));
|
|
122
115
|
// The one predictable failure: --docs naming a file. Refused here so the
|
|
123
116
|
// caller gets a clean envelope/message instead of mkdir's ENOTDIR throw.
|
|
124
117
|
if (existsSync(docsDir) && !statSync(docsDir).isDirectory()) {
|
|
@@ -165,33 +158,72 @@ export function registerInit(program) {
|
|
|
165
158
|
const tools = opts.tools === undefined ? scanned : resolveTools(opts.tools, json);
|
|
166
159
|
if (tools === null)
|
|
167
160
|
return;
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
//
|
|
172
|
-
//
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
161
|
+
const profile = resolveAgentProfile(opts.agentProfile, existing?.agentProfile, json);
|
|
162
|
+
if (profile === null)
|
|
163
|
+
return;
|
|
164
|
+
// Probe the pre-existing paths in planned order. Managed files refreshed
|
|
165
|
+
// below are removed from `skipped`; custom and already-current files stay.
|
|
166
|
+
const plannedAgentFiles = delivery.length > 0 ? plannedCommandFiles(cwd, tools, delivery, profile) : [];
|
|
167
|
+
// `.mcp.json` joins the same list rather than being reported on the side:
|
|
168
|
+
// it is a scaffolded path like any other, so it must appear in `created`
|
|
169
|
+
// or in `skipped` by the one rule that governs both. Last, because it is
|
|
170
|
+
// written last.
|
|
171
|
+
const candidates = [
|
|
172
|
+
...plannedDocsFiles(docsDir),
|
|
173
|
+
...plannedAgentFiles.map((f) => f.path),
|
|
174
|
+
...(opts.mcp === true || opts.mcpAuthor === true ? [mcpConfigPath(cwd)] : []),
|
|
175
|
+
];
|
|
176
|
+
let skipped = candidates.filter((p) => existsSync(p));
|
|
177
177
|
// Joining touches the docs repo not at all: it is somebody's committed
|
|
178
178
|
// repository, and "point at it" must never mean "write to it".
|
|
179
179
|
const created = joining && opts.create !== true ? [] : (await scaffoldDocs(docsDir)).created;
|
|
180
180
|
const generatedFor = delivery.length > 0 ? tools : [];
|
|
181
|
+
let refreshed = [];
|
|
182
|
+
let managedFiles = {};
|
|
181
183
|
if (delivery.length > 0) {
|
|
182
|
-
|
|
184
|
+
const synced = await syncAgentCommands({
|
|
185
|
+
cwd,
|
|
186
|
+
toolIds: tools,
|
|
187
|
+
delivery,
|
|
188
|
+
profile,
|
|
189
|
+
known: existing?.agentFiles,
|
|
190
|
+
});
|
|
191
|
+
created.push(...synced.created);
|
|
192
|
+
refreshed = synced.refreshed;
|
|
193
|
+
managedFiles = synced.managed;
|
|
194
|
+
skipped = skipped.filter((path) => !refreshed.includes(path));
|
|
195
|
+
}
|
|
196
|
+
// The third delivery, and the only machine-readable one. It refuses out
|
|
197
|
+
// loud rather than being written best-effort: a `.mcp.json` half-landed
|
|
198
|
+
// is a host that starts a broken server, and the caller asked for it by
|
|
199
|
+
// name. Before saveConfig, so a run that cannot write this file has not
|
|
200
|
+
// yet moved the committed pointer either.
|
|
201
|
+
let mcpWritten = false;
|
|
202
|
+
if (opts.mcp === true || opts.mcpAuthor === true) {
|
|
203
|
+
const write = await writeMcpConfig(cwd, opts.mcpAuthor === true);
|
|
204
|
+
if (write.kind === "failed") {
|
|
205
|
+
fail(json, write.code, write.message);
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
mcpWritten = write.kind === "created";
|
|
209
|
+
if (mcpWritten)
|
|
210
|
+
created.push(mcpConfigPath(cwd));
|
|
183
211
|
}
|
|
184
212
|
const stored = storedDocsDir(docsOption);
|
|
185
213
|
// Union, not replacement: this run's files join the ones earlier runs left
|
|
186
214
|
// on disk, and `agentTools` is a record of what the repo HOLDS. A run that
|
|
187
215
|
// generated nothing adds nothing and erases nothing.
|
|
188
216
|
const recordedTools = [...new Set([...(existing?.agentTools ?? []), ...generatedFor])];
|
|
217
|
+
const agentFileManifest = updatedAgentFileManifest(cwd, plannedAgentFiles, existing?.agentFiles, managedFiles);
|
|
189
218
|
const config = {
|
|
190
219
|
...existing,
|
|
191
220
|
docsDir: stored,
|
|
192
221
|
...(opts.service ? { service: opts.service } : {}),
|
|
193
222
|
...(recordedTools.length > 0 ? { agentTools: recordedTools } : {}),
|
|
223
|
+
agentProfile: profile,
|
|
194
224
|
};
|
|
225
|
+
if (Object.keys(agentFileManifest).length > 0)
|
|
226
|
+
config.agentFiles = agentFileManifest;
|
|
195
227
|
const configFile = await saveConfig(config, cwd);
|
|
196
228
|
const serviceCount = (await listServices(docsDir)).length;
|
|
197
229
|
if (json) {
|
|
@@ -204,6 +236,7 @@ export function registerInit(program) {
|
|
|
204
236
|
// changing: an agent comparing the two learns whether its selection
|
|
205
237
|
// matches the repo.
|
|
206
238
|
emitJson({
|
|
239
|
+
command: "init",
|
|
207
240
|
docsDir,
|
|
208
241
|
docsDirStored: stored,
|
|
209
242
|
// Where the pointer came from: `flag` (a --docs somebody typed),
|
|
@@ -213,8 +246,10 @@ export function registerInit(program) {
|
|
|
213
246
|
docsRepo: joining ? "existing" : "created",
|
|
214
247
|
services: serviceCount,
|
|
215
248
|
created,
|
|
249
|
+
refreshed,
|
|
216
250
|
skipped,
|
|
217
251
|
tools: generatedFor,
|
|
252
|
+
agentProfile: profile,
|
|
218
253
|
detected,
|
|
219
254
|
});
|
|
220
255
|
return;
|
|
@@ -240,11 +275,47 @@ export function registerInit(program) {
|
|
|
240
275
|
console.log(` commands: ${tools.join(", ")}`);
|
|
241
276
|
if (opts.skills)
|
|
242
277
|
console.log(` skills: ${tools.join(", ")}`);
|
|
278
|
+
console.log(` profile: ${profile}`);
|
|
243
279
|
if (created.length > 0) {
|
|
244
280
|
console.log(" scaffolded:");
|
|
245
281
|
for (const c of created)
|
|
246
282
|
console.log(` + ${c}`);
|
|
247
283
|
}
|
|
284
|
+
if (refreshed.length > 0) {
|
|
285
|
+
console.log(" refreshed (unchanged since loam last wrote them):");
|
|
286
|
+
for (const path of refreshed)
|
|
287
|
+
console.log(` ↻ ${path}`);
|
|
288
|
+
}
|
|
289
|
+
// The one skipped path that earns more than its line in `skipped`: loam
|
|
290
|
+
// will not merge into a `.mcp.json` a human owns, and the caller asked
|
|
291
|
+
// for this delivery by name — so they are handed the exact key to paste
|
|
292
|
+
// into their own `mcpServers` object. Nothing was read out of their file
|
|
293
|
+
// to produce it; the snippet is the same bytes a fresh write would have
|
|
294
|
+
// used, which is also why it names the launch form this install shape
|
|
295
|
+
// actually needs.
|
|
296
|
+
if ((opts.mcp === true || opts.mcpAuthor === true) && !mcpWritten) {
|
|
297
|
+
console.log(` mcp: ${MCP_CONFIG_FILENAME} is already here — left exactly as it is.`);
|
|
298
|
+
console.log(` paste this into its "mcpServers" object:`);
|
|
299
|
+
for (const line of mcpServerSnippet(cwd, opts.mcpAuthor === true))
|
|
300
|
+
console.log(` ${line}`);
|
|
301
|
+
}
|
|
302
|
+
// Printed ONLY when this run created the docs repo. With a service bound
|
|
303
|
+
// (the binding may predate the run — the config spread above carries an
|
|
304
|
+
// existing loam.json's `service` forward) it is the single-repo trial's
|
|
305
|
+
// hour. `loam status` is NOT mute here — its first-hour ladder
|
|
306
|
+
// (core/status/fleet/next.ts) already answers `next.adopt-bound` in
|
|
307
|
+
// exactly this state — but status has to be run to say so, and no status
|
|
308
|
+
// rung ever names `loam vouch`, the one step of this loop that is a
|
|
309
|
+
// person's; init's output is already on screen, so it prints the whole
|
|
310
|
+
// hour once. With none bound it is the docs repo's own hour (map, bind,
|
|
311
|
+
// adopt — first-hour.ts says why that used to be silence). A join stays
|
|
312
|
+
// silent on purpose: a joined fleet has other repositories already
|
|
313
|
+
// through this loop, and `loam status` in its docs repo is the working
|
|
314
|
+
// guide there. The --json path returned above, so the envelope is
|
|
315
|
+
// byte-identical to before this block existed: neither variant has a key.
|
|
316
|
+
if (!joining)
|
|
317
|
+
for (const line of firstHourLines(config.service))
|
|
318
|
+
console.log(line);
|
|
248
319
|
});
|
|
249
320
|
}
|
|
250
321
|
//# sourceMappingURL=init.js.map
|