@ybotok/loam 0.1.0-beta.3 → 0.2.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +2548 -86
- package/COMPARISON.md +80 -63
- package/CONTRIBUTING.md +84 -0
- package/MIGRATING-from-OpenSpec.md +213 -54
- package/QUICKSTART.md +125 -0
- package/README.md +450 -150
- package/ROADMAP.md +494 -0
- package/SCHEMA.md +2355 -256
- package/SECURITY.md +21 -3
- package/WORKFLOW.md +701 -0
- package/dist/cli.js +113 -19
- package/dist/cli.js.map +1 -1
- package/dist/commands/adopt/adopt.js +209 -0
- package/dist/commands/adopt/adopt.js.map +1 -0
- package/dist/commands/adopt/render.js +268 -0
- package/dist/commands/adopt/render.js.map +1 -0
- package/dist/commands/archive/archive.js +77 -0
- package/dist/commands/archive/archive.js.map +1 -0
- package/dist/commands/archive/plan/contracts/asyncapi.js +178 -0
- package/dist/commands/archive/plan/contracts/asyncapi.js.map +1 -0
- package/dist/commands/archive/plan/contracts/openapi.js +159 -0
- package/dist/commands/archive/plan/contracts/openapi.js.map +1 -0
- package/dist/commands/archive/plan/gate.js +317 -0
- package/dist/commands/archive/plan/gate.js.map +1 -0
- package/dist/commands/archive/plan/landscape.js +161 -0
- package/dist/commands/archive/plan/landscape.js.map +1 -0
- package/dist/commands/archive/plan/refusal.js +111 -0
- package/dist/commands/archive/plan/refusal.js.map +1 -0
- package/dist/commands/archive/plan/specs.js +237 -0
- package/dist/commands/archive/plan/specs.js.map +1 -0
- package/dist/commands/archive/plan/state.js +27 -0
- package/dist/commands/archive/plan/state.js.map +1 -0
- package/dist/commands/archive/run.js +251 -0
- package/dist/commands/archive/run.js.map +1 -0
- package/dist/commands/context/context.js +99 -0
- package/dist/commands/context/context.js.map +1 -0
- package/dist/commands/context/print.js +283 -0
- package/dist/commands/context/print.js.map +1 -0
- package/dist/commands/delta/delta.js +279 -0
- package/dist/commands/delta/delta.js.map +1 -0
- package/dist/commands/delta/print.js +205 -0
- package/dist/commands/delta/print.js.map +1 -0
- package/dist/commands/dependencies.js +9 -7
- package/dist/commands/dependencies.js.map +1 -1
- package/dist/commands/diff/diff.js +93 -0
- package/dist/commands/diff/diff.js.map +1 -0
- package/dist/commands/diff/print.js +38 -0
- package/dist/commands/diff/print.js.map +1 -0
- package/dist/commands/doctor.js +5 -4
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/explain/explain.js +151 -0
- package/dist/commands/explain/explain.js.map +1 -0
- package/dist/commands/explore.js +29 -24
- package/dist/commands/explore.js.map +1 -1
- package/dist/commands/gate/gate.js +115 -0
- package/dist/commands/gate/gate.js.map +1 -0
- package/dist/commands/gate/print.js +54 -0
- package/dist/commands/gate/print.js.map +1 -0
- package/dist/commands/gherkin/commit.js +146 -0
- package/dist/commands/gherkin/commit.js.map +1 -0
- package/dist/commands/gherkin/gherkin.js +246 -0
- package/dist/commands/gherkin/gherkin.js.map +1 -0
- package/dist/commands/gherkin/reconcile.js +149 -0
- package/dist/commands/gherkin/reconcile.js.map +1 -0
- package/dist/commands/gherkin/render.js +77 -0
- package/dist/commands/gherkin/render.js.map +1 -0
- package/dist/commands/init/example.js +204 -0
- package/dist/commands/init/example.js.map +1 -0
- package/dist/commands/init/first-hour.js +28 -0
- package/dist/commands/init/first-hour.js.map +1 -0
- package/dist/commands/{init.js → init/init.js} +146 -71
- package/dist/commands/init/init.js.map +1 -0
- package/dist/commands/init/mcp.js +131 -0
- package/dist/commands/init/mcp.js.map +1 -0
- package/dist/commands/init/options.js +78 -0
- package/dist/commands/init/options.js.map +1 -0
- package/dist/commands/instructions.js +72 -14
- package/dist/commands/instructions.js.map +1 -1
- package/dist/commands/list/campaign/campaign.js +65 -0
- package/dist/commands/list/campaign/campaign.js.map +1 -0
- package/dist/commands/list/campaign/owners.js +65 -0
- package/dist/commands/list/campaign/owners.js.map +1 -0
- package/dist/commands/list/json.js +157 -0
- package/dist/commands/list/json.js.map +1 -0
- package/dist/commands/list/list.js +343 -0
- package/dist/commands/list/list.js.map +1 -0
- package/dist/commands/list/print.js +301 -0
- package/dist/commands/list/print.js.map +1 -0
- package/dist/commands/list/review.js +120 -0
- package/dist/commands/list/review.js.map +1 -0
- package/dist/commands/list/views.js +105 -0
- package/dist/commands/list/views.js.map +1 -0
- package/dist/commands/mcp/dispatch.js +183 -0
- package/dist/commands/mcp/dispatch.js.map +1 -0
- package/dist/commands/mcp/mcp.js +34 -0
- package/dist/commands/mcp/mcp.js.map +1 -0
- package/dist/commands/mcp/serve.js +55 -0
- package/dist/commands/mcp/serve.js.map +1 -0
- package/dist/commands/migrate-openspec/materialize/active.js +170 -0
- package/dist/commands/migrate-openspec/materialize/active.js.map +1 -0
- package/dist/commands/migrate-openspec/materialize/feature.js +41 -0
- package/dist/commands/migrate-openspec/materialize/feature.js.map +1 -0
- package/dist/commands/migrate-openspec/materialize/living.js +62 -0
- package/dist/commands/migrate-openspec/materialize/living.js.map +1 -0
- package/dist/commands/migrate-openspec/materialize/stage.js +142 -0
- package/dist/commands/migrate-openspec/materialize/stage.js.map +1 -0
- package/dist/commands/migrate-openspec/materialize/target.js +219 -0
- package/dist/commands/migrate-openspec/materialize/target.js.map +1 -0
- package/dist/commands/migrate-openspec/migrate-openspec.js +142 -0
- package/dist/commands/migrate-openspec/migrate-openspec.js.map +1 -0
- package/dist/commands/migrate-openspec/openspec/decisions.js +91 -0
- package/dist/commands/migrate-openspec/openspec/decisions.js.map +1 -0
- package/dist/commands/migrate-openspec/openspec/error.js +19 -0
- package/dist/commands/migrate-openspec/openspec/error.js.map +1 -0
- package/dist/commands/migrate-openspec/openspec/mapping.js +170 -0
- package/dist/commands/migrate-openspec/openspec/mapping.js.map +1 -0
- package/dist/commands/migrate-openspec/openspec/paths.js +43 -0
- package/dist/commands/migrate-openspec/openspec/paths.js.map +1 -0
- package/dist/commands/migrate-openspec/openspec/read.js +49 -0
- package/dist/commands/migrate-openspec/openspec/read.js.map +1 -0
- package/dist/commands/migrate-openspec/print.js +89 -0
- package/dist/commands/migrate-openspec/print.js.map +1 -0
- package/dist/commands/new/commit.js +76 -0
- package/dist/commands/new/commit.js.map +1 -0
- package/dist/commands/new/new.js +283 -0
- package/dist/commands/new/new.js.map +1 -0
- package/dist/commands/new/templates.js +355 -0
- package/dist/commands/new/templates.js.map +1 -0
- package/dist/commands/open.js +203 -0
- package/dist/commands/open.js.map +1 -0
- package/dist/commands/policy/format.js +152 -0
- package/dist/commands/policy/format.js.map +1 -0
- package/dist/commands/{docs-repo-gate.js → policy/gate.js} +11 -11
- package/dist/commands/policy/gate.js.map +1 -0
- package/dist/commands/rebase/edit.js +106 -0
- package/dist/commands/rebase/edit.js.map +1 -0
- package/dist/commands/rebase/living.js +185 -0
- package/dist/commands/rebase/living.js.map +1 -0
- package/dist/commands/rebase/plan.js +245 -0
- package/dist/commands/rebase/plan.js.map +1 -0
- package/dist/commands/rebase/rebase.js +275 -0
- package/dist/commands/rebase/rebase.js.map +1 -0
- package/dist/commands/seed/commit.js +192 -0
- package/dist/commands/seed/commit.js.map +1 -0
- package/dist/commands/seed/plan.js +133 -0
- package/dist/commands/seed/plan.js.map +1 -0
- package/dist/commands/seed/seed.js +172 -0
- package/dist/commands/seed/seed.js.map +1 -0
- package/dist/commands/show/feature.js +178 -0
- package/dist/commands/show/feature.js.map +1 -0
- package/dist/commands/show/marks.js +24 -0
- package/dist/commands/show/marks.js.map +1 -0
- package/dist/commands/{show.js → show/service.js} +63 -152
- package/dist/commands/show/service.js.map +1 -0
- package/dist/commands/show/show.js +77 -0
- package/dist/commands/show/show.js.map +1 -0
- package/dist/commands/status/json.js +45 -0
- package/dist/commands/status/json.js.map +1 -0
- package/dist/commands/status/print.js +157 -0
- package/dist/commands/status/print.js.map +1 -0
- package/dist/commands/status/status.js +119 -0
- package/dist/commands/status/status.js.map +1 -0
- package/dist/commands/steps/steps.js +189 -0
- package/dist/commands/steps/steps.js.map +1 -0
- package/dist/commands/subsystem/edit.js +192 -0
- package/dist/commands/subsystem/edit.js.map +1 -0
- package/dist/commands/subsystem/move.js +265 -0
- package/dist/commands/subsystem/move.js.map +1 -0
- package/dist/commands/subsystem/query.js +115 -0
- package/dist/commands/subsystem/query.js.map +1 -0
- package/dist/commands/subsystem/subsystem.js +101 -0
- package/dist/commands/subsystem/subsystem.js.map +1 -0
- package/dist/commands/subsystem/sync.js +103 -0
- package/dist/commands/subsystem/sync.js.map +1 -0
- package/dist/commands/subsystem/txn/txn.js +94 -0
- package/dist/commands/subsystem/txn/txn.js.map +1 -0
- package/dist/commands/subsystem/txn/views.js +70 -0
- package/dist/commands/subsystem/txn/views.js.map +1 -0
- package/dist/commands/unarchive/manifest.js +160 -0
- package/dist/commands/unarchive/manifest.js.map +1 -0
- package/dist/commands/{unarchive.js → unarchive/restore.js} +47 -160
- package/dist/commands/unarchive/restore.js.map +1 -0
- package/dist/commands/unarchive/unarchive.js +67 -0
- package/dist/commands/unarchive/unarchive.js.map +1 -0
- package/dist/commands/validate/arch-coverage.js +194 -0
- package/dist/commands/validate/arch-coverage.js.map +1 -0
- package/dist/commands/validate/checks/fleet-shape.js +296 -0
- package/dist/commands/validate/checks/fleet-shape.js.map +1 -0
- package/dist/commands/validate/checks/health-deps.js +55 -0
- package/dist/commands/validate/checks/health-deps.js.map +1 -0
- package/dist/commands/validate/checks/requirements.js +254 -0
- package/dist/commands/validate/checks/requirements.js.map +1 -0
- package/dist/commands/validate/checks/sources.js +76 -0
- package/dist/commands/validate/checks/sources.js.map +1 -0
- package/dist/commands/validate/checks/vocabulary.js +31 -0
- package/dist/commands/validate/checks/vocabulary.js.map +1 -0
- package/dist/commands/validate/feature.js +216 -0
- package/dist/commands/validate/feature.js.map +1 -0
- package/dist/commands/validate/fleet/census.js +69 -0
- package/dist/commands/validate/fleet/census.js.map +1 -0
- package/dist/commands/validate/fleet/kind-tags.js +39 -0
- package/dist/commands/validate/fleet/kind-tags.js.map +1 -0
- package/dist/commands/validate/fleet/landscape.js +353 -0
- package/dist/commands/validate/fleet/landscape.js.map +1 -0
- package/dist/commands/validate/fleet/load.js +52 -0
- package/dist/commands/validate/fleet/load.js.map +1 -0
- package/dist/commands/validate/fleet/obligations.js +236 -0
- package/dist/commands/validate/fleet/obligations.js.map +1 -0
- package/dist/commands/validate/fleet/scorecard/adoption.js +102 -0
- package/dist/commands/validate/fleet/scorecard/adoption.js.map +1 -0
- package/dist/commands/validate/fleet/scorecard/contracts.js +98 -0
- package/dist/commands/validate/fleet/scorecard/contracts.js.map +1 -0
- package/dist/commands/validate/fleet/scorecard/print.js +63 -0
- package/dist/commands/validate/fleet/scorecard/print.js.map +1 -0
- package/dist/commands/validate/fleet/scorecard/scorecard.js +156 -0
- package/dist/commands/validate/fleet/scorecard/scorecard.js.map +1 -0
- package/dist/commands/validate/fleet/usecases/capability-tag.js +94 -0
- package/dist/commands/validate/fleet/usecases/capability-tag.js.map +1 -0
- package/dist/commands/validate/fleet/usecases/place.js +13 -0
- package/dist/commands/validate/fleet/usecases/place.js.map +1 -0
- package/dist/commands/validate/fleet/usecases/requirement-tag.js +95 -0
- package/dist/commands/validate/fleet/usecases/requirement-tag.js.map +1 -0
- package/dist/commands/validate/fleet/usecases/steps.js +197 -0
- package/dist/commands/validate/fleet/usecases/steps.js.map +1 -0
- package/dist/commands/validate/fleet/usecases/usecases.js +99 -0
- package/dist/commands/validate/fleet/usecases/usecases.js.map +1 -0
- package/dist/commands/validate/fleet/views/ids.js +40 -0
- package/dist/commands/validate/fleet/views/ids.js.map +1 -0
- package/dist/commands/validate/fleet/views/stale.js +59 -0
- package/dist/commands/validate/fleet/views/stale.js.map +1 -0
- package/dist/commands/validate/links/corpus.js +92 -0
- package/dist/commands/validate/links/corpus.js.map +1 -0
- package/dist/commands/validate/links/glossary.js +75 -0
- package/dist/commands/validate/links/glossary.js.map +1 -0
- package/dist/commands/validate/report.js +269 -0
- package/dist/commands/validate/report.js.map +1 -0
- package/dist/commands/validate/service/api.js +338 -0
- package/dist/commands/validate/service/api.js.map +1 -0
- package/dist/commands/validate/service/events/events.js +219 -0
- package/dist/commands/validate/service/events/events.js.map +1 -0
- package/dist/commands/validate/service/events/message-producers.js +77 -0
- package/dist/commands/validate/service/events/message-producers.js.map +1 -0
- package/dist/commands/validate/service/evidence-pins.js +131 -0
- package/dist/commands/validate/service/evidence-pins.js.map +1 -0
- package/dist/commands/validate/service/service.js +250 -0
- package/dist/commands/validate/service/service.js.map +1 -0
- package/dist/commands/validate/service/specs.js +219 -0
- package/dist/commands/validate/service/specs.js.map +1 -0
- package/dist/commands/validate/service/spine.js +113 -0
- package/dist/commands/validate/service/spine.js.map +1 -0
- package/dist/commands/validate/validate.js +338 -0
- package/dist/commands/validate/validate.js.map +1 -0
- package/dist/commands/verify/cross/diff.js +182 -0
- package/dist/commands/verify/cross/diff.js.map +1 -0
- package/dist/commands/verify/evidence/contract.js +32 -0
- package/dist/commands/verify/evidence/contract.js.map +1 -0
- package/dist/commands/verify/evidence/pins.js +52 -0
- package/dist/commands/verify/evidence/pins.js.map +1 -0
- package/dist/commands/verify/evidence/read.js +72 -0
- package/dist/commands/verify/evidence/read.js.map +1 -0
- package/dist/commands/verify/frozen.js +241 -0
- package/dist/commands/verify/frozen.js.map +1 -0
- package/dist/commands/verify/record.js +226 -0
- package/dist/commands/verify/record.js.map +1 -0
- package/dist/commands/verify/report.js +223 -0
- package/dist/commands/verify/report.js.map +1 -0
- package/dist/commands/verify/results.js +246 -0
- package/dist/commands/verify/results.js.map +1 -0
- package/dist/commands/verify/verify.js +217 -0
- package/dist/commands/verify/verify.js.map +1 -0
- package/dist/commands/vouch/contract.js +11 -0
- package/dist/commands/vouch/contract.js.map +1 -0
- package/dist/commands/vouch/pack/contract.js +2 -0
- package/dist/commands/vouch/pack/contract.js.map +1 -0
- package/dist/commands/vouch/pack/pack.js +266 -0
- package/dist/commands/vouch/pack/pack.js.map +1 -0
- package/dist/commands/vouch/pack/print.js +271 -0
- package/dist/commands/vouch/pack/print.js.map +1 -0
- package/dist/commands/vouch/pack/sections.js +142 -0
- package/dist/commands/vouch/pack/sections.js.map +1 -0
- package/dist/commands/vouch/prompt/confirm.js +46 -0
- package/dist/commands/vouch/prompt/confirm.js.map +1 -0
- package/dist/commands/vouch/report.js +101 -0
- package/dist/commands/vouch/report.js.map +1 -0
- package/dist/commands/vouch/run.js +285 -0
- package/dist/commands/vouch/run.js.map +1 -0
- package/dist/commands/vouch/sample/plan.js +125 -0
- package/dist/commands/vouch/sample/plan.js.map +1 -0
- package/dist/commands/vouch/sample/print.js +109 -0
- package/dist/commands/vouch/sample/print.js.map +1 -0
- package/dist/commands/vouch/vet/verify.js +123 -0
- package/dist/commands/vouch/vet/verify.js.map +1 -0
- package/dist/commands/vouch/vouch.js +176 -0
- package/dist/commands/vouch/vouch.js.map +1 -0
- package/dist/core/agent/agents-md/artifacts.js +220 -0
- package/dist/core/agent/agents-md/artifacts.js.map +1 -0
- package/dist/core/agent/agents-md/command-map.js +324 -0
- package/dist/core/agent/agents-md/command-map.js.map +1 -0
- package/dist/core/agent/agents-md/cycle.js +165 -0
- package/dist/core/agent/agents-md/cycle.js.map +1 -0
- package/dist/core/agent/agents-md/map/explain.js +34 -0
- package/dist/core/agent/agents-md/map/explain.js.map +1 -0
- package/dist/core/agent/agents-md/map/lenses/context.js +41 -0
- package/dist/core/agent/agents-md/map/lenses/context.js.map +1 -0
- package/dist/core/agent/agents-md/map/lenses/diff.js +46 -0
- package/dist/core/agent/agents-md/map/lenses/diff.js.map +1 -0
- package/dist/core/agent/agents-md/map/lenses/gate.js +57 -0
- package/dist/core/agent/agents-md/map/lenses/gate.js.map +1 -0
- package/dist/core/agent/agents-md/map/mcp.js +41 -0
- package/dist/core/agent/agents-md/map/mcp.js.map +1 -0
- package/dist/core/agent/agents-md/map/status.js +62 -0
- package/dist/core/agent/agents-md/map/status.js.map +1 -0
- package/dist/core/agent/agents-md/map/subsystem.js +32 -0
- package/dist/core/agent/agents-md/map/subsystem.js.map +1 -0
- package/dist/core/agent/agents-md/map/usecases.js +60 -0
- package/dist/core/agent/agents-md/map/usecases.js.map +1 -0
- package/dist/core/agent/agents-md/refusals.js +246 -0
- package/dist/core/agent/agents-md/refusals.js.map +1 -0
- package/dist/core/agent/agents-md/shipped/archive-gate.js +98 -0
- package/dist/core/agent/agents-md/shipped/archive-gate.js.map +1 -0
- package/dist/core/agent/agents-md/spine.js +40 -0
- package/dist/core/agent/agents-md/spine.js.map +1 -0
- package/dist/core/agent/agents-md.js +170 -0
- package/dist/core/agent/agents-md.js.map +1 -0
- package/dist/core/{agents-stamp.js → agent/agents-stamp.js} +50 -0
- package/dist/core/agent/agents-stamp.js.map +1 -0
- package/dist/core/agent/contract.js +2 -0
- package/dist/core/agent/contract.js.map +1 -0
- package/dist/core/agent/protocol.js +193 -0
- package/dist/core/agent/protocol.js.map +1 -0
- package/dist/core/agent/scaffold.js +259 -0
- package/dist/core/agent/scaffold.js.map +1 -0
- package/dist/core/agent/support/report.js +103 -0
- package/dist/core/agent/support/report.js.map +1 -0
- package/dist/core/agent/tools/dialects.js +150 -0
- package/dist/core/agent/tools/dialects.js.map +1 -0
- package/dist/core/agent/tools/registry.js +228 -0
- package/dist/core/agent/tools/registry.js.map +1 -0
- package/dist/core/agent/workflows/adopt.js +133 -0
- package/dist/core/agent/workflows/adopt.js.map +1 -0
- package/dist/core/agent/workflows/check.js +334 -0
- package/dist/core/agent/workflows/check.js.map +1 -0
- package/dist/core/agent/workflows/closing.js +262 -0
- package/dist/core/agent/workflows/closing.js.map +1 -0
- package/dist/core/agent/workflows/feature.js +105 -0
- package/dist/core/agent/workflows/feature.js.map +1 -0
- package/dist/core/agent/workflows/implement.js +105 -0
- package/dist/core/agent/workflows/implement.js.map +1 -0
- package/dist/core/agent/workflows/reference/authoring.js +209 -0
- package/dist/core/agent/workflows/reference/authoring.js.map +1 -0
- package/dist/core/agent/workflows/reference/codes.js +65 -0
- package/dist/core/agent/workflows/reference/codes.js.map +1 -0
- package/dist/core/agent/workflows/reference/done-check.js +188 -0
- package/dist/core/agent/workflows/reference/done-check.js.map +1 -0
- package/dist/core/agent/workflows/reference/reference.js +16 -0
- package/dist/core/agent/workflows/reference/reference.js.map +1 -0
- package/dist/core/agent/workflows/reference/spine.js +297 -0
- package/dist/core/agent/workflows/reference/spine.js.map +1 -0
- package/dist/core/asyncapi/baseline/plan.js +110 -0
- package/dist/core/asyncapi/baseline/plan.js.map +1 -0
- package/dist/core/asyncapi/baseline/surfaces.js +54 -0
- package/dist/core/asyncapi/baseline/surfaces.js.map +1 -0
- package/dist/core/asyncapi/depth.js +164 -0
- package/dist/core/asyncapi/depth.js.map +1 -0
- package/dist/core/asyncapi/digest.js +141 -0
- package/dist/core/asyncapi/digest.js.map +1 -0
- package/dist/core/asyncapi/merge/components.js +91 -0
- package/dist/core/asyncapi/merge/components.js.map +1 -0
- package/dist/core/asyncapi/merge/error.js +33 -0
- package/dist/core/asyncapi/merge/error.js.map +1 -0
- package/dist/core/asyncapi/merge/markers.js +308 -0
- package/dist/core/asyncapi/merge/markers.js.map +1 -0
- package/dist/core/asyncapi/merge/merge.js +215 -0
- package/dist/core/asyncapi/merge/merge.js.map +1 -0
- package/dist/core/asyncapi/merge/pin.js +107 -0
- package/dist/core/asyncapi/merge/pin.js.map +1 -0
- package/dist/core/asyncapi/model.js +11 -0
- package/dist/core/asyncapi/model.js.map +1 -0
- package/dist/core/asyncapi/producers.js +50 -0
- package/dist/core/asyncapi/producers.js.map +1 -0
- package/dist/core/{asyncapi.js → asyncapi/read.js} +95 -109
- package/dist/core/asyncapi/read.js.map +1 -0
- package/dist/core/brief/brief.js +225 -0
- package/dist/core/brief/brief.js.map +1 -0
- package/dist/core/brief/checks.js +250 -0
- package/dist/core/brief/checks.js.map +1 -0
- package/dist/core/brief/landscape.js +194 -0
- package/dist/core/brief/landscape.js.map +1 -0
- package/dist/core/brief/targets.js +226 -0
- package/dist/core/brief/targets.js.map +1 -0
- package/dist/core/brief/unchecked.js +47 -0
- package/dist/core/brief/unchecked.js.map +1 -0
- package/dist/core/c4/arch.js +282 -0
- package/dist/core/c4/arch.js.map +1 -0
- package/dist/core/c4/likec4.js +88 -0
- package/dist/core/c4/likec4.js.map +1 -0
- package/dist/core/c4/parsed/dynamic-views.js +132 -0
- package/dist/core/c4/parsed/dynamic-views.js.map +1 -0
- package/dist/core/c4/parsed/specification.js +78 -0
- package/dist/core/c4/parsed/specification.js.map +1 -0
- package/dist/core/c4/parsed/values.js +57 -0
- package/dist/core/c4/parsed/values.js.map +1 -0
- package/dist/core/c4/parsed/view-ids.js +75 -0
- package/dist/core/c4/parsed/view-ids.js.map +1 -0
- package/dist/core/c4/project/architecture.js +45 -0
- package/dist/core/c4/project/architecture.js.map +1 -0
- package/dist/core/c4/project/documents.js +58 -0
- package/dist/core/c4/project/documents.js.map +1 -0
- package/dist/core/c4/project/load.js +183 -0
- package/dist/core/c4/project/load.js.map +1 -0
- package/dist/core/c4/resolve/service.js +113 -0
- package/dist/core/c4/resolve/service.js.map +1 -0
- package/dist/core/c4/seed/fleet-file.js +201 -0
- package/dist/core/c4/seed/fleet-file.js.map +1 -0
- package/dist/core/c4/seed/items.js +91 -0
- package/dist/core/c4/seed/items.js.map +1 -0
- package/dist/core/c4/seed/stamp.js +48 -0
- package/dist/core/c4/seed/stamp.js.map +1 -0
- package/dist/core/c4/seed/template.js +109 -0
- package/dist/core/c4/seed/template.js.map +1 -0
- package/dist/core/c4/source-mask.js +82 -0
- package/dist/core/c4/source-mask.js.map +1 -0
- package/dist/core/c4/source-scan.js +227 -0
- package/dist/core/c4/source-scan.js.map +1 -0
- package/dist/core/c4/splice/authored-source.js +101 -0
- package/dist/core/c4/splice/authored-source.js.map +1 -0
- package/dist/core/c4/splice/contract.js +10 -0
- package/dist/core/c4/splice/contract.js.map +1 -0
- package/dist/core/c4/splice/delta-blocks.js +126 -0
- package/dist/core/c4/splice/delta-blocks.js.map +1 -0
- package/dist/core/c4/splice/identity/edges.js +36 -0
- package/dist/core/c4/splice/identity/edges.js.map +1 -0
- package/dist/core/c4/splice/landscape-merge.js +269 -0
- package/dist/core/c4/splice/landscape-merge.js.map +1 -0
- package/dist/core/c4/splice/placement.js +194 -0
- package/dist/core/c4/splice/placement.js.map +1 -0
- package/dist/core/c4/workspace.js +172 -0
- package/dist/core/c4/workspace.js.map +1 -0
- package/dist/core/capabilities/authoring/notes.js +141 -0
- package/dist/core/capabilities/authoring/notes.js.map +1 -0
- package/dist/core/capabilities/capabilities.js +124 -0
- package/dist/core/capabilities/capabilities.js.map +1 -0
- package/dist/core/capabilities/delta/doc.js +50 -0
- package/dist/core/capabilities/delta/doc.js.map +1 -0
- package/dist/core/capabilities/delta/overlay.js +129 -0
- package/dist/core/capabilities/delta/overlay.js.map +1 -0
- package/dist/core/capabilities/delta/summary.js +57 -0
- package/dist/core/capabilities/delta/summary.js.map +1 -0
- package/dist/core/capabilities/delta/tree.js +43 -0
- package/dist/core/capabilities/delta/tree.js.map +1 -0
- package/dist/core/capabilities/delta/uncovered.js +222 -0
- package/dist/core/capabilities/delta/uncovered.js.map +1 -0
- package/dist/core/capabilities/findings.js +342 -0
- package/dist/core/capabilities/findings.js.map +1 -0
- package/dist/core/capabilities/realizes/findings.js +181 -0
- package/dist/core/capabilities/realizes/findings.js.map +1 -0
- package/dist/core/capabilities/realizes/join.js +143 -0
- package/dist/core/capabilities/realizes/join.js.map +1 -0
- package/dist/core/capabilities/rollup.js +199 -0
- package/dist/core/capabilities/rollup.js.map +1 -0
- package/dist/core/capabilities/tree.js +126 -0
- package/dist/core/capabilities/tree.js.map +1 -0
- package/dist/core/capabilities/usecase-join.js +277 -0
- package/dist/core/capabilities/usecase-join.js.map +1 -0
- package/dist/core/coherence/authoring/scaffold.js +177 -0
- package/dist/core/coherence/authoring/scaffold.js.map +1 -0
- package/dist/core/coherence/authoring/sentinels.js +74 -0
- package/dist/core/coherence/authoring/sentinels.js.map +1 -0
- package/dist/core/coherence/coherence.js +251 -0
- package/dist/core/coherence/coherence.js.map +1 -0
- package/dist/core/coherence/declared.js +269 -0
- package/dist/core/coherence/declared.js.map +1 -0
- package/dist/core/coherence/events/declared.js +206 -0
- package/dist/core/coherence/events/declared.js.map +1 -0
- package/dist/core/coherence/events/events.js +204 -0
- package/dist/core/coherence/events/events.js.map +1 -0
- package/dist/core/coherence/events/grades.js +166 -0
- package/dist/core/coherence/events/grades.js.map +1 -0
- package/dist/core/coherence/events/lookups.js +122 -0
- package/dist/core/coherence/events/lookups.js.map +1 -0
- package/dist/core/coherence/events/merged.js +40 -0
- package/dist/core/coherence/events/merged.js.map +1 -0
- package/dist/core/coherence/living.js +198 -0
- package/dist/core/coherence/living.js.map +1 -0
- package/dist/core/coherence/lookups.js +155 -0
- package/dist/core/coherence/lookups.js.map +1 -0
- package/dist/core/coherence/pending.js +39 -0
- package/dist/core/coherence/pending.js.map +1 -0
- package/dist/core/conflict-markers.js +60 -0
- package/dist/core/conflict-markers.js.map +1 -0
- package/dist/core/delta/claims.js +73 -0
- package/dist/core/delta/claims.js.map +1 -0
- package/dist/core/delta/delta.js +296 -0
- package/dist/core/delta/delta.js.map +1 -0
- package/dist/core/delta/document.js +177 -0
- package/dist/core/delta/document.js.map +1 -0
- package/dist/core/delta/scope.js +48 -0
- package/dist/core/delta/scope.js.map +1 -0
- package/dist/core/delta/select.js +237 -0
- package/dist/core/delta/select.js.map +1 -0
- package/dist/core/dependencies/dependencies.js +141 -0
- package/dist/core/dependencies/dependencies.js.map +1 -0
- package/dist/core/dependencies/facts.js +165 -0
- package/dist/core/dependencies/facts.js.map +1 -0
- package/dist/core/dependencies/fanin.js +88 -0
- package/dist/core/dependencies/fanin.js.map +1 -0
- package/dist/core/dependencies/graph.js +106 -0
- package/dist/core/dependencies/graph.js.map +1 -0
- package/dist/core/diff/base-git.js +148 -0
- package/dist/core/diff/base-git.js.map +1 -0
- package/dist/core/diff/base-state.js +209 -0
- package/dist/core/diff/base-state.js.map +1 -0
- package/dist/core/diff/current-state.js +96 -0
- package/dist/core/diff/current-state.js.map +1 -0
- package/dist/core/diff/scope/changed-paths.js +188 -0
- package/dist/core/diff/scope/changed-paths.js.map +1 -0
- package/dist/core/diff/semantic.js +243 -0
- package/dist/core/diff/semantic.js.map +1 -0
- package/dist/core/diff/victims.js +247 -0
- package/dist/core/diff/victims.js.map +1 -0
- package/dist/core/docs.js +7 -64
- package/dist/core/docs.js.map +1 -1
- package/dist/core/doctor/agents.js +222 -0
- package/dist/core/doctor/agents.js.map +1 -0
- package/dist/core/doctor/config.js +135 -0
- package/dist/core/doctor/config.js.map +1 -0
- package/dist/core/doctor/doctor.js +275 -0
- package/dist/core/doctor/doctor.js.map +1 -0
- package/dist/core/doctor/report.js +13 -0
- package/dist/core/doctor/report.js.map +1 -0
- package/dist/core/doctor/residue.js +110 -0
- package/dist/core/doctor/residue.js.map +1 -0
- package/dist/core/document/apply.js +77 -0
- package/dist/core/document/apply.js.map +1 -0
- package/dist/core/{frontmatter.js → document/frontmatter.js} +48 -2
- package/dist/core/document/frontmatter.js.map +1 -0
- package/dist/core/document/grammar/directives.js +143 -0
- package/dist/core/document/grammar/directives.js.map +1 -0
- package/dist/core/document/parse.js +263 -0
- package/dist/core/document/parse.js.map +1 -0
- package/dist/core/document/scenarios.js +221 -0
- package/dist/core/document/scenarios.js.map +1 -0
- package/dist/core/document/spec.js +241 -0
- package/dist/core/document/spec.js.map +1 -0
- package/dist/core/{config.js → envelope/config.js} +79 -18
- package/dist/core/envelope/config.js.map +1 -0
- package/dist/core/envelope/json.js +175 -0
- package/dist/core/envelope/json.js.map +1 -0
- package/dist/core/{version.js → envelope/version.js} +3 -3
- package/dist/core/envelope/version.js.map +1 -0
- package/dist/core/explain/families.js +175 -0
- package/dist/core/explain/families.js.map +1 -0
- package/dist/core/explain/fix-tables.js +178 -0
- package/dist/core/explain/fix-tables.js.map +1 -0
- package/dist/core/explain/lookup.js +181 -0
- package/dist/core/explain/lookup.js.map +1 -0
- package/dist/core/explain/refusals.js +49 -0
- package/dist/core/explain/refusals.js.map +1 -0
- package/dist/core/explain/terms.js +144 -0
- package/dist/core/explain/terms.js.map +1 -0
- package/dist/core/explore/describe.js +105 -0
- package/dist/core/explore/describe.js.map +1 -0
- package/dist/core/{explore.js → explore/explore.js} +50 -101
- package/dist/core/explore/explore.js.map +1 -0
- package/dist/core/fleet-context.js +120 -78
- package/dist/core/fleet-context.js.map +1 -1
- package/dist/core/gate/checks.js +201 -0
- package/dist/core/gate/checks.js.map +1 -0
- package/dist/core/gate/partners.js +205 -0
- package/dist/core/gate/partners.js.map +1 -0
- package/dist/core/gate/report.js +47 -0
- package/dist/core/gate/report.js.map +1 -0
- package/dist/core/gate/verification.js +113 -0
- package/dist/core/gate/verification.js.map +1 -0
- package/dist/core/gherkin/digest.js +60 -0
- package/dist/core/gherkin/digest.js.map +1 -0
- package/dist/core/gherkin/emit.js +177 -0
- package/dist/core/gherkin/emit.js.map +1 -0
- package/dist/core/gherkin/read.js +76 -0
- package/dist/core/gherkin/read.js.map +1 -0
- package/dist/core/gherkin/stale.js +234 -0
- package/dist/core/gherkin/stale.js.map +1 -0
- package/dist/core/gherkin/stamp.js +77 -0
- package/dist/core/gherkin/stamp.js.map +1 -0
- package/dist/core/gherkin/steps/catalogue.js +154 -0
- package/dist/core/gherkin/steps/catalogue.js.map +1 -0
- package/dist/core/gherkin/steps/inventory.js +98 -0
- package/dist/core/gherkin/steps/inventory.js.map +1 -0
- package/dist/core/gherkin/steps/phrase.js +72 -0
- package/dist/core/gherkin/steps/phrase.js.map +1 -0
- package/dist/core/glossary/delta.js +106 -0
- package/dist/core/glossary/delta.js.map +1 -0
- package/dist/core/glossary/tree.js +86 -0
- package/dist/core/glossary/tree.js.map +1 -0
- package/dist/core/kernel/concurrency.js.map +1 -0
- package/dist/core/{document-bytes.js → kernel/document-bytes.js} +1 -1
- package/dist/core/kernel/document-bytes.js.map +1 -0
- package/dist/core/kernel/fences.js +42 -0
- package/dist/core/kernel/fences.js.map +1 -0
- package/dist/core/kernel/ids/capability.js +72 -0
- package/dist/core/kernel/ids/capability.js.map +1 -0
- package/dist/core/kernel/ids/dirs.js +33 -0
- package/dist/core/kernel/ids/dirs.js.map +1 -0
- package/dist/core/kernel/ids/feature.js +75 -0
- package/dist/core/kernel/ids/feature.js.map +1 -0
- package/dist/core/kernel/ids/service.js +156 -0
- package/dist/core/kernel/ids/service.js.map +1 -0
- package/dist/core/kernel/ids/subsystem.js +63 -0
- package/dist/core/kernel/ids/subsystem.js.map +1 -0
- package/dist/core/{path-safety.js → kernel/path-safety.js} +18 -4
- package/dist/core/kernel/path-safety.js.map +1 -0
- package/dist/core/kernel/records.js.map +1 -0
- package/dist/core/links/backlinks.js +68 -0
- package/dist/core/links/backlinks.js.map +1 -0
- package/dist/core/links/case.js +74 -0
- package/dist/core/links/case.js.map +1 -0
- package/dist/core/links/corpus.js +104 -0
- package/dist/core/links/corpus.js.map +1 -0
- package/dist/core/links/findings.js +110 -0
- package/dist/core/links/findings.js.map +1 -0
- package/dist/core/links/parse.js +236 -0
- package/dist/core/links/parse.js.map +1 -0
- package/dist/core/mcp/argv.js +111 -0
- package/dist/core/mcp/argv.js.map +1 -0
- package/dist/core/mcp/author-tools.js +72 -0
- package/dist/core/mcp/author-tools.js.map +1 -0
- package/dist/core/mcp/framing.js +46 -0
- package/dist/core/mcp/framing.js.map +1 -0
- package/dist/core/mcp/protocol.js +280 -0
- package/dist/core/mcp/protocol.js.map +1 -0
- package/dist/core/mcp/tools.js +314 -0
- package/dist/core/mcp/tools.js.map +1 -0
- package/dist/core/obligations/obligations.js +106 -0
- package/dist/core/obligations/obligations.js.map +1 -0
- package/dist/core/openapi/baseline/gate.js +166 -0
- package/dist/core/openapi/baseline/gate.js.map +1 -0
- package/dist/core/openapi/baseline/plan.js +112 -0
- package/dist/core/openapi/baseline/plan.js.map +1 -0
- package/dist/core/openapi/baseline/record.js +175 -0
- package/dist/core/openapi/baseline/record.js.map +1 -0
- package/dist/core/openapi/depth.js +122 -0
- package/dist/core/openapi/depth.js.map +1 -0
- package/dist/core/openapi/digest.js +189 -0
- package/dist/core/openapi/digest.js.map +1 -0
- package/dist/core/{openapi.js → openapi/doc.js} +44 -106
- package/dist/core/openapi/doc.js.map +1 -0
- package/dist/core/openapi/merge/components.js +234 -0
- package/dist/core/openapi/merge/components.js.map +1 -0
- package/dist/core/openapi/merge/error.js +26 -0
- package/dist/core/openapi/merge/error.js.map +1 -0
- package/dist/core/openapi/merge/markers.js +208 -0
- package/dist/core/openapi/merge/markers.js.map +1 -0
- package/dist/core/openapi/merge/merge.js +256 -0
- package/dist/core/openapi/merge/merge.js.map +1 -0
- package/dist/core/openapi/merge/pin.js +128 -0
- package/dist/core/openapi/merge/pin.js.map +1 -0
- package/dist/core/openspec/decide/capabilities.js +244 -0
- package/dist/core/openspec/decide/capabilities.js.map +1 -0
- package/dist/core/openspec/decide/dispositions.js +63 -0
- package/dist/core/openspec/decide/dispositions.js.map +1 -0
- package/dist/core/openspec/decide/renames.js +179 -0
- package/dist/core/openspec/decide/renames.js.map +1 -0
- package/dist/core/openspec/decide/verdict.js +84 -0
- package/dist/core/openspec/decide/verdict.js.map +1 -0
- package/dist/core/openspec/inventory.js +221 -0
- package/dist/core/openspec/inventory.js.map +1 -0
- package/dist/core/openspec/model/mapping.js +76 -0
- package/dist/core/openspec/model/mapping.js.map +1 -0
- package/dist/core/openspec/model/model.js +65 -0
- package/dist/core/openspec/model/model.js.map +1 -0
- package/dist/core/openspec/scan/changes.js +235 -0
- package/dist/core/openspec/scan/changes.js.map +1 -0
- package/dist/core/openspec/scan/config.js +200 -0
- package/dist/core/openspec/scan/config.js.map +1 -0
- package/dist/core/openspec/scan/shape.js +260 -0
- package/dist/core/openspec/scan/shape.js.map +1 -0
- package/dist/core/openspec/scan/walk.js +133 -0
- package/dist/core/openspec/scan/walk.js.map +1 -0
- package/dist/core/openspec/scan/workspace.js +71 -0
- package/dist/core/openspec/scan/workspace.js.map +1 -0
- package/dist/core/owners/codeowners.js +141 -0
- package/dist/core/owners/codeowners.js.map +1 -0
- package/dist/core/pack/features.js +120 -0
- package/dist/core/pack/features.js.map +1 -0
- package/dist/core/pack/joins.js +112 -0
- package/dist/core/pack/joins.js.map +1 -0
- package/dist/core/pack/living.js +118 -0
- package/dist/core/pack/living.js.map +1 -0
- package/dist/core/pack/pack.js +76 -0
- package/dist/core/pack/pack.js.map +1 -0
- package/dist/core/permissions/permissions.js +87 -0
- package/dist/core/permissions/permissions.js.map +1 -0
- package/dist/core/projection/api.js +84 -0
- package/dist/core/projection/api.js.map +1 -0
- package/dist/core/projection/arch-slice.js +63 -0
- package/dist/core/projection/arch-slice.js.map +1 -0
- package/dist/core/projection/events.js +34 -0
- package/dist/core/projection/events.js.map +1 -0
- package/dist/core/provenance/findings.js +208 -0
- package/dist/core/provenance/findings.js.map +1 -0
- package/dist/core/provenance/git.js +225 -0
- package/dist/core/provenance/git.js.map +1 -0
- package/dist/core/provenance/gitq/moves.js +182 -0
- package/dist/core/provenance/gitq/moves.js.map +1 -0
- package/dist/core/provenance/gitq/vouched-ancestor.js +179 -0
- package/dist/core/provenance/gitq/vouched-ancestor.js.map +1 -0
- package/dist/core/provenance/sample/scope.js +238 -0
- package/dist/core/provenance/sample/scope.js.map +1 -0
- package/dist/core/provenance/sample/sections.js +61 -0
- package/dist/core/provenance/sample/sections.js.map +1 -0
- package/dist/core/provenance/sources.js +263 -0
- package/dist/core/provenance/sources.js.map +1 -0
- package/dist/core/provenance/stamp.js +232 -0
- package/dist/core/provenance/stamp.js.map +1 -0
- package/dist/core/provenance/walk.js +157 -0
- package/dist/core/provenance/walk.js.map +1 -0
- package/dist/core/repo/authored/paths.js +192 -0
- package/dist/core/repo/authored/paths.js.map +1 -0
- package/dist/core/repo/entries.js +126 -0
- package/dist/core/repo/entries.js.map +1 -0
- package/dist/core/repo/paths.js +236 -0
- package/dist/core/repo/paths.js.map +1 -0
- package/dist/core/repo/repo.js +248 -0
- package/dist/core/repo/repo.js.map +1 -0
- package/dist/core/repo/service-target.js +153 -0
- package/dist/core/repo/service-target.js.map +1 -0
- package/dist/core/repo/state.js +58 -0
- package/dist/core/repo/state.js.map +1 -0
- package/dist/core/repo/tree/find.js +52 -0
- package/dist/core/repo/tree/find.js.map +1 -0
- package/dist/core/repo/tree/fs.js +64 -0
- package/dist/core/repo/tree/fs.js.map +1 -0
- package/dist/core/repo/tree/marker.js +61 -0
- package/dist/core/repo/tree/marker.js.map +1 -0
- package/dist/core/repo/tree/views.js +172 -0
- package/dist/core/repo/tree/views.js.map +1 -0
- package/dist/core/repo/tree/walk.js +234 -0
- package/dist/core/repo/tree/walk.js.map +1 -0
- package/dist/core/results.js +99 -2
- package/dist/core/results.js.map +1 -1
- package/dist/core/scaffold/landscape.js +131 -0
- package/dist/core/scaffold/landscape.js.map +1 -0
- package/dist/core/scaffold/readme.js +84 -0
- package/dist/core/scaffold/readme.js.map +1 -0
- package/dist/core/staging/commit.js +241 -0
- package/dist/core/staging/commit.js.map +1 -0
- package/dist/core/staging/interrupted.js +96 -0
- package/dist/core/staging/interrupted.js.map +1 -0
- package/dist/core/staging/lock.js +206 -0
- package/dist/core/staging/lock.js.map +1 -0
- package/dist/core/staging/recovery/finding.js +35 -0
- package/dist/core/staging/recovery/finding.js.map +1 -0
- package/dist/core/staging/recovery/intent.js +98 -0
- package/dist/core/staging/recovery/intent.js.map +1 -0
- package/dist/core/staging/recovery/recover.js +126 -0
- package/dist/core/staging/recovery/recover.js.map +1 -0
- package/dist/core/staging/recovery/residue.js +62 -0
- package/dist/core/staging/recovery/residue.js.map +1 -0
- package/dist/core/staging/snapshot.js +202 -0
- package/dist/core/staging/snapshot.js.map +1 -0
- package/dist/core/staging/txn/forward.js +171 -0
- package/dist/core/staging/txn/forward.js.map +1 -0
- package/dist/core/staging/txn/journal.js +139 -0
- package/dist/core/staging/txn/journal.js.map +1 -0
- package/dist/core/staging/txn/transaction.js +75 -0
- package/dist/core/staging/txn/transaction.js.map +1 -0
- package/dist/core/staging/writes.js +113 -0
- package/dist/core/staging/writes.js.map +1 -0
- package/dist/core/status/actions/execution.js +49 -0
- package/dist/core/status/actions/execution.js.map +1 -0
- package/dist/core/status/contracts.js +102 -0
- package/dist/core/status/contracts.js.map +1 -0
- package/dist/core/status/feature/artifacts.js +171 -0
- package/dist/core/status/feature/artifacts.js.map +1 -0
- package/dist/core/status/feature/feature.js +207 -0
- package/dist/core/status/feature/feature.js.map +1 -0
- package/dist/core/status/feature/next.js +150 -0
- package/dist/core/status/feature/next.js.map +1 -0
- package/dist/core/status/feature/state.js +21 -0
- package/dist/core/status/feature/state.js.map +1 -0
- package/dist/core/status/fleet/fleet.js +187 -0
- package/dist/core/status/fleet/fleet.js.map +1 -0
- package/dist/core/status/fleet/next.js +207 -0
- package/dist/core/status/fleet/next.js.map +1 -0
- package/dist/core/status/interrupted.js +97 -0
- package/dist/core/status/interrupted.js.map +1 -0
- package/dist/core/status/report.js +31 -0
- package/dist/core/status/report.js.map +1 -0
- package/dist/core/status/scan.js +41 -0
- package/dist/core/status/scan.js.map +1 -0
- package/dist/core/status/verification.js +201 -0
- package/dist/core/status/verification.js.map +1 -0
- package/dist/core/usecases/capability.js +169 -0
- package/dist/core/usecases/capability.js.map +1 -0
- package/dist/core/usecases/delta/claims.js +116 -0
- package/dist/core/usecases/delta/claims.js.map +1 -0
- package/dist/core/usecases/delta/flows.js +103 -0
- package/dist/core/usecases/delta/flows.js.map +1 -0
- package/dist/core/usecases/delta/overlay.js +235 -0
- package/dist/core/usecases/delta/overlay.js.map +1 -0
- package/dist/core/usecases/fleet.js +137 -0
- package/dist/core/usecases/fleet.js.map +1 -0
- package/dist/core/usecases/operations.js +111 -0
- package/dist/core/usecases/operations.js.map +1 -0
- package/dist/core/usecases/place.js +44 -0
- package/dist/core/usecases/place.js.map +1 -0
- package/dist/core/usecases/touch.js +101 -0
- package/dist/core/usecases/touch.js.map +1 -0
- package/dist/core/verify/answers.js +173 -0
- package/dist/core/verify/answers.js.map +1 -0
- package/dist/core/verify/build.js +150 -0
- package/dist/core/verify/build.js.map +1 -0
- package/dist/core/verify/checklist.js +201 -0
- package/dist/core/verify/checklist.js.map +1 -0
- package/dist/core/verify/claims/identity.js +61 -0
- package/dist/core/verify/claims/identity.js.map +1 -0
- package/dist/core/verify/cross/diff.js +97 -0
- package/dist/core/verify/cross/diff.js.map +1 -0
- package/dist/core/verify/evidence/contract.js +169 -0
- package/dist/core/verify/evidence/contract.js.map +1 -0
- package/dist/core/verify/file.js +257 -0
- package/dist/core/verify/file.js.map +1 -0
- package/dist/core/verify/pins/lint.js +157 -0
- package/dist/core/verify/pins/lint.js.map +1 -0
- package/dist/core/verify/pins/pin.js +95 -0
- package/dist/core/verify/pins/pin.js.map +1 -0
- package/dist/core/verify/record.js +142 -0
- package/dist/core/verify/record.js.map +1 -0
- package/dist/core/verify/store/commit.js +89 -0
- package/dist/core/verify/store/commit.js.map +1 -0
- package/dist/core/verify/store/render.js +57 -0
- package/dist/core/verify/store/render.js.map +1 -0
- package/dist/core/vocabulary/health.js +91 -0
- package/dist/core/vocabulary/health.js.map +1 -0
- package/dist/core/vocabulary/issue.js +55 -0
- package/dist/core/vocabulary/issue.js.map +1 -0
- package/dist/core/vocabulary/maturity.js +145 -0
- package/dist/core/vocabulary/maturity.js.map +1 -0
- package/dist/core/{report.js → vocabulary/report.js} +30 -2
- package/dist/core/vocabulary/report.js.map +1 -0
- package/dist/core/vocabulary/steps.js +266 -0
- package/dist/core/vocabulary/steps.js.map +1 -0
- package/dist/core/workspace/discover.js +239 -0
- package/dist/core/workspace/discover.js.map +1 -0
- package/dist/core/workspace/render.js +52 -0
- package/dist/core/workspace/render.js.map +1 -0
- package/examples/README.md +189 -0
- package/examples/docs/architecture/adrs/0001-transactional-outbox.md +33 -0
- package/examples/docs/architecture/capabilities.yaml +31 -0
- package/examples/docs/architecture/landscape.likec4 +280 -0
- package/examples/docs/architecture/obligations.yaml +23 -0
- package/examples/docs/architecture/permissions.yaml +50 -0
- package/examples/docs/architecture/subsystems.likec4 +11 -0
- package/examples/docs/architecture/usecases/order-notification.likec4 +65 -0
- package/examples/docs/capabilities/checkout/spec.md +55 -0
- package/examples/docs/capabilities/identity/tokens/spec.md +42 -0
- package/examples/docs/capabilities/order-notifications/spec.md +43 -0
- package/examples/docs/features/FEAT-101-payment-splitting/adrs/0001-dedicated-split-service.md +18 -0
- package/examples/docs/features/FEAT-101-payment-splitting/delta.likec4 +94 -0
- package/examples/docs/features/FEAT-101-payment-splitting/intent.md +44 -0
- package/examples/docs/features/FEAT-101-payment-splitting/specs/checkout-web/spec.md +21 -0
- package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-service/asyncapi.yaml +129 -0
- package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-service/spec.md +36 -0
- package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-split-service/arch.spec.md +40 -0
- package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-split-service/openapi.yaml +116 -0
- package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-split-service/spec.md +55 -0
- package/examples/docs/features/FEAT-112-retire-order-v1/intent.md +35 -0
- package/examples/docs/features/FEAT-112-retire-order-v1/specs/order-service/openapi.yaml +28 -0
- package/examples/docs/features/FEAT-112-retire-order-v1/specs/order-service/spec.md +17 -0
- package/examples/docs/features/archive/FEAT-088-refunds/.loam-before/files/architecture/landscape.likec4 +253 -0
- package/examples/docs/features/archive/FEAT-088-refunds/.loam-before/files/services/order-service/spec.md +121 -0
- package/examples/docs/features/archive/FEAT-088-refunds/.loam-before/files/services/payment-service/openapi.yaml +111 -0
- package/examples/docs/features/archive/FEAT-088-refunds/.loam-before/files/services/payment-service/spec.md +58 -0
- package/examples/docs/features/archive/FEAT-088-refunds/.loam-before/manifest.json +32 -0
- package/examples/docs/features/archive/FEAT-088-refunds/adrs/0001-refunds-stay-in-payment-service.md +26 -0
- package/examples/docs/features/archive/FEAT-088-refunds/delta.likec4 +28 -0
- package/examples/docs/features/archive/FEAT-088-refunds/intent.md +26 -0
- package/examples/docs/features/archive/FEAT-088-refunds/specs/order-service/spec.md +37 -0
- package/examples/docs/features/archive/FEAT-088-refunds/specs/payment-service/openapi.yaml +70 -0
- package/examples/docs/features/archive/FEAT-088-refunds/specs/payment-service/spec.md +23 -0
- package/examples/docs/features/archive/FEAT-088-refunds/verification.yaml +76 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/files/architecture/landscape.likec4 +275 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/files/services/payment-service/asyncapi.yaml +96 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/files/services/payment-service/spec.md +82 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/files/services/platform/notification-service/asyncapi.yaml +164 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/files/services/platform/notification-service/spec.md +91 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/manifest.json +46 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/delta.likec4 +36 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/intent.md +22 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/scenario-report.json +10 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/specs/notification-service/asyncapi.yaml +208 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/specs/notification-service/spec.md +24 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/specs/payment-service/asyncapi.yaml +137 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/specs/payment-service/spec.md +31 -0
- package/examples/docs/features/archive/FEAT-120-refund-notification/verification.yaml +84 -0
- package/examples/docs/glossary/order.md +15 -0
- package/examples/docs/glossary/payments/authorization.md +14 -0
- package/examples/docs/likec4.config.json +9 -0
- package/examples/docs/loam.json +3 -0
- package/examples/docs/services/checkout-web/model.likec4 +109 -0
- package/examples/docs/services/checkout-web/spec.md +91 -0
- package/examples/docs/services/checkout-web/ui/pages/checkout.page.yaml +40 -0
- package/examples/docs/services/checkout-web/ui/pages/order-status.page.yaml +24 -0
- package/examples/docs/services/checkout-web/ui/pages/split-payment.page.yaml +26 -0
- package/examples/docs/services/order-service/adrs/0001-orchestrated-order-lifecycle.md +52 -0
- package/examples/docs/services/order-service/arch.spec.md +127 -0
- package/examples/docs/services/order-service/asyncapi.yaml +108 -0
- package/examples/docs/services/order-service/health.yaml +57 -0
- package/examples/docs/services/order-service/model.likec4 +138 -0
- package/examples/docs/services/order-service/openapi.yaml +257 -0
- package/examples/docs/services/order-service/runbook.md +62 -0
- package/examples/docs/services/order-service/spec.md +134 -0
- package/examples/docs/services/payment-service/adrs/0001-payments-outbox.md +18 -0
- package/examples/docs/services/payment-service/adrs/0002-idempotency-keys-on-authorization.md +27 -0
- package/examples/docs/services/payment-service/arch.spec.md +73 -0
- package/examples/docs/services/payment-service/asyncapi.yaml +130 -0
- package/examples/docs/services/payment-service/health.yaml +39 -0
- package/examples/docs/services/payment-service/model.likec4 +67 -0
- package/examples/docs/services/payment-service/openapi.yaml +151 -0
- package/examples/docs/services/payment-service/runbook.md +37 -0
- package/examples/docs/services/payment-service/spec.md +88 -0
- package/examples/docs/services/platform/identity-service/adrs/0001-token-introspection-over-local-validation.md +60 -0
- package/examples/docs/services/platform/identity-service/arch.spec.md +117 -0
- package/examples/docs/services/platform/identity-service/health.yaml +70 -0
- package/examples/docs/services/platform/identity-service/model.likec4 +83 -0
- package/examples/docs/services/platform/identity-service/openapi.yaml +197 -0
- package/examples/docs/services/platform/identity-service/runbook.md +95 -0
- package/examples/docs/services/platform/identity-service/spec.md +119 -0
- package/examples/docs/services/platform/notification-service/asyncapi.yaml +199 -0
- package/examples/docs/services/platform/notification-service/health.yaml +35 -0
- package/examples/docs/services/platform/notification-service/model.likec4 +118 -0
- package/examples/docs/services/platform/notification-service/runbook.md +48 -0
- package/examples/docs/services/platform/notification-service/spec.md +112 -0
- package/examples/docs/services/platform/subsystem.yaml +2 -0
- package/examples/fleet.yaml +57 -0
- package/package.json +19 -6
- package/dist/commands/adopt.js +0 -240
- package/dist/commands/adopt.js.map +0 -1
- package/dist/commands/archive.js +0 -1313
- package/dist/commands/archive.js.map +0 -1
- package/dist/commands/delta.js +0 -388
- package/dist/commands/delta.js.map +0 -1
- package/dist/commands/docs-repo-gate.js.map +0 -1
- package/dist/commands/format.js +0 -17
- package/dist/commands/format.js.map +0 -1
- package/dist/commands/gherkin.js +0 -309
- package/dist/commands/gherkin.js.map +0 -1
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/list.js +0 -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.map +0 -1
- package/dist/commands/status.js +0 -262
- package/dist/commands/status.js.map +0 -1
- 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.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.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.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
- /package/dist/core/{concurrency.js → kernel/concurrency.js} +0 -0
- /package/dist/core/{records.js → kernel/records.js} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../../src/core/agent/scaffold.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The generated FILES: what a pointer file contains (the stub), what this\n * binary would write (SLASH_COMMANDS, plannedCommandFiles), and how the files\n * land and are detected on disk.\n *\n * The command and skill files go into the repo `init` runs in, because that is\n * where the agent is invoked — for whichever tools the repo shows signs of, via\n * the AGENT_TOOLS registry (tools/registry.ts): one shared body, a per-tool\n * path and wrapper. A delivery is refreshed only while its bytes still match\n * the digest loam recorded when it wrote them; a team's edits revoke that\n * authority and outrank ours.\n *\n * Two deliveries, one body. A slash command has to be TYPED, so it only ever\n * reaches an agent whose operator already knows loam exists. A skill is loaded\n * by the model itself when the task matches its `description`, which is how the\n * protocol reaches an agent that was never told about it. That difference is\n * the whole reason both are written by default.\n *\n * The per-tool command and skill files carry the same version stamp AGENTS.md\n * does (agents-md.ts), for the same reason and with the same answer:\n * `loam doctor` reports `doctor.agent-files-stale` without writing. A later\n * `loam init` can refresh only a digest-matched pointer. Without the stamp,\n * absence was the only drift doctor could see — a command file mangled to one\n * line left it saying `healthy: true`, which across a hundred repositories is\n * invisible rot with no repair path.\n */\nimport { createHash } from \"node:crypto\";\nimport { existsSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, join, relative } from \"node:path\";\nimport { agentsStampLine } from \"./agents-stamp.js\";\nimport { LOAM_VERSION } from \"../envelope/version.js\";\nimport type { AgentFileEmitter, CommandContent } from \"./contract.js\";\nimport { AGENT_COMMANDS } from \"./protocol.js\";\nimport { AGENT_TOOLS, CLAUDE } from \"./tools/registry.js\";\n\n/**\n * What a generated file actually contains: the purpose, the spine, and the\n * command that prints the rest.\n *\n * The protocol itself stays in `body` and ships inside the binary, reachable as\n * `loam instructions <name>`. The file on disk gets a pointer to it, because\n * these two things go stale in opposite directions and only one of them can be\n * fixed. A generated file is refreshed only while its bytes still match the\n * digest loam recorded; any edit revokes that authority because your edits\n * outrank the template. Without that distinction a repo scaffolded a year ago\n * holds a year-old protocol: exact\n * flags, exact finding codes, exact step order, all of it asserted with total\n * confidence by a file whose reader has no way to know it is describing a\n * different release. That is not a hypothetical failure mode. It is the one\n * every project shipping generated agent instructions has had, and the fix\n * everybody reaches for — regenerate on upgrade — trades it for silently\n * overwriting what a human wrote.\n *\n * Thinning the file is the third option. What remains is what does not move\n * between releases: what this workflow is for, and the verbs in order. What\n * leaves is everything version-shaped. `doctor.agent-files-stale` still reports\n * a file whose stamp has fallen behind, and now has almost nothing to be right\n * about — which is the point.\n *\n * The trade is real and worth stating: an agent that cannot execute `loam` now\n * has a spine instead of a protocol. That is the correct failure. The exact\n * diagnostic and lifecycle invocations belong to the binary-owned page; an\n * agent that cannot run loam cannot finish either kind from an embedded copy —\n * it can only try using a year-old flag.\n *\n * The last clause of the pointer is the one sentence here that changes what an\n * agent DOES rather than what it knows. `loam instructions loam-check` prints\n * 84 KB — about a fifth of a 100k-token window, 223 fix-table rows of which a\n * run needs two or three — and every file written from this stub opens by\n * telling the agent to run it. `--no-fix-tables` (commands/instructions.ts)\n * drops the rows, and `loam explain <code>` answers the one row the run turned\n * out to need in under 500 bytes. The flag is what makes the lazy path payable;\n * this sentence is what makes an agent take it.\n */\nfunction stubBody(c: CommandContent): string {\n const steps = c.spine.map((s, i) => ` ${i + 1}. ${s}`).join(\"\\n\");\n const entry = c.name === \"loam-report\"\n ? `This support protocol has two equivalent chat entry points: the explicit command a\nuser chooses, and the Agent Skill an unexpected-run request may load. Both reach\nthe same local, sanitized report; the agent owns the diagnostic steps.`\n : `This workflow has two equivalent chat entry points: the explicit command a user\nchooses, and the Agent Skill a natural-language request may load. Both reach this\nsame body and must produce the same status/edit/validate loop; do not make the\nuser type the internal loam commands one by one.`;\n const output = c.name === \"loam-report\"\n ? `The runtime protocol decides which diagnostics are safe to run and what may enter the\nreport. Do not infer permission to retry a writer, repair files or send the result\nfrom the broader lifecycle commands another generated skill may allow.`\n : `Every step above is a \\`loam\\` invocation, and each command's own \\`--json\\` output\ncarries what to do next: findings have stable codes, and \\`loam status --json\\` puts\nthe ordered \\`next[]\\` — each entry a code and the literal command — in one place.\nBranch on the codes, never on the prose. The check workflow starts with\n\\`--no-fix-tables\\`; use \\`loam explain <code>\\` for each code the run actually\nreports, and remove that flag only when you deliberately need the complete table.`;\n return `${c.purpose}\n\n${entry}\n\n**Run this first.** It is the protocol, and it ships with the binary you are about\nto call — so it names this loam's flags, its finding codes and its fix tables,\nnot the ones that were current when this repository was scaffolded:\n\n ${c.invocation}\n\nThe spine it fills in, so you can tell a run that went sideways from one that did not:\n\n${steps}\n\n${output}\n\nThis file is a pointer, not the protocol. loam may refresh it while its bytes still\nmatch the digest recorded in loam.json. Editing it revokes that authority: your\nchanges outrank the template and stay untouched. Where this file and\n\\`loam instructions\\` disagree, the command is right.\n`;\n}\n\n/**\n * The command body a file actually gets: the pointer, under the same version\n * stamp AGENTS.md carries.\n *\n * The stamp is applied once, here, rather than in twenty wrappers — it is a\n * fact about loam, not about a tool's dialect, and a per-wrapper copy is twenty\n * chances to forget it. It rides at the top of the BODY (not the file) because\n * every dialect puts something of its own first: YAML frontmatter, a TOML key,\n * a title line. An HTML comment is invisible in all of them, and\n * `agentsStampVersion` matches it wherever in the file it lands.\n *\n * A repo initialized before stamping existed has unstamped files, which is\n * exactly what `doctor.agent-files-stale` is for: nobody has confirmed that\n * those instructions still describe this binary.\n */\nconst stubbed = (c: CommandContent): CommandContent => ({\n ...c,\n body: `${agentsStampLine(LOAM_VERSION)}\\n\\n${stubBody(c)}`,\n});\n\n/**\n * The Claude-format files, keyed by command name: exactly what **this** binary\n * would write, derived through the same adapter that writes them, so the export\n * and a freshly scaffolded repo can never disagree.\n *\n * Read that scope literally. It used to be described as the on-disk contract of\n * every repo initialized before `--tools` existed, and that is no longer true\n * of anything but a fresh scaffold: a file holds the STUB now, every repo\n * scaffolded before that holds the full protocol. A recorded, byte-identical\n * pointer can refresh; an older unrecorded file or any customized file cannot,\n * so an export cannot describe files this binary did not write.\n *\n * The protocol those older files carry is `PROTOCOLS`. Anything asserting on\n * protocol content wants that one — this answers \"what would loam write here\",\n * not \"what does loam instruct\".\n */\nexport const SLASH_COMMANDS: Record<string, string> = Object.fromEntries(\n AGENT_COMMANDS.map((c) => [c.name, CLAUDE.format(stubbed(c))]),\n);\n\n/** The two ways a command body reaches an agent. Both are on by default. */\nexport const DELIVERIES = [\"commands\", \"skills\"] as const;\nexport type Delivery = (typeof DELIVERIES)[number];\n\nexport const AGENT_PROFILES = [\"full\", \"service\", \"docs\"] as const;\nexport type AgentProfile = (typeof AGENT_PROFILES)[number];\n\nconst PROFILE_COMMANDS: Record<AgentProfile, ReadonlySet<string>> = {\n full: new Set(AGENT_COMMANDS.map((command) => command.name)),\n service: new Set([\"loam-adopt\", \"loam-implement\", \"loam-check\", \"loam-verify\", \"loam-report\"]),\n docs: new Set([\"loam-feature\", \"loam-check\", \"loam-ship\", \"loam-report\"]),\n};\n\n/**\n * Every file the selected tools would lay down, in creation order — the same\n * list `init` probes for `skipped` BEFORE the scaffold runs, so created +\n * skipped is the same list on every repo.\n *\n * Called with two arguments it returns EVERYTHING the binary would write under\n * default delivery: commands and skills both. That is the contract callers\n * outside this module depend on — `loam doctor` asks \"what should be here?\"\n * and a half-answer would report a fully-scaffolded repo as fully scaffolded\n * while ignoring every skill file. The name predates the second delivery and is\n * kept because it is imported elsewhere; `delivery` narrows it.\n */\nexport function plannedCommandFiles(\n cwd: string,\n toolIds: string[],\n delivery: readonly Delivery[] = DELIVERIES,\n profile: AgentProfile = \"full\",\n): Array<{ path: string; content: string }> {\n return toolIds.flatMap((id) => {\n const tool = AGENT_TOOLS[id];\n if (tool === undefined) throw new Error(`unknown agent tool: ${id}`);\n const emitters: AgentFileEmitter[] = [];\n // A tool declares only the deliveries it actually reads, so an absent\n // emitter is a fact about the tool, never a reason to fall back to some\n // other tool's convention.\n const { path, format, skill } = tool;\n if (delivery.includes(\"commands\") && path !== undefined && format !== undefined) {\n emitters.push({ path, format });\n }\n if (delivery.includes(\"skills\") && skill !== undefined) emitters.push(skill);\n return emitters.flatMap((e) =>\n AGENT_COMMANDS.filter((command) => PROFILE_COMMANDS[profile].has(command.name)).map((c) => ({\n path: join(cwd, ...e.path(c.name)),\n content: e.format(stubbed(c)),\n })),\n );\n });\n}\n\nfunction contentDigest(content: string | Buffer): string {\n return createHash(\"sha256\").update(content).digest(\"hex\");\n}\n\nfunction manifestPath(cwd: string, path: string): string {\n return relative(cwd, path).replaceAll(\"\\\\\", \"/\");\n}\n\nexport function updatedAgentFileManifest(\n cwd: string,\n planned: Array<{ path: string }>,\n existing: Readonly<Record<string, string>> | undefined,\n managed: Readonly<Record<string, string>>,\n): Record<string, string> {\n const out = { ...existing };\n for (const file of planned) delete out[manifestPath(cwd, file.path)];\n return Object.assign(out, managed);\n}\n\nexport interface AgentFileSync {\n created: string[];\n refreshed: string[];\n /** Repo-relative path -> digest of the bytes loam is allowed to refresh. */\n managed: Record<string, string>;\n}\n\n/**\n * Create missing files and refresh only files still byte-identical to the\n * digest recorded when loam last wrote them. A human edit breaks that equality\n * and therefore revokes loam's authority over the file without a marker block\n * or a prompt.\n */\nexport async function syncAgentCommands(req: {\n cwd: string;\n toolIds?: string[];\n delivery?: readonly Delivery[];\n profile?: AgentProfile;\n known?: Readonly<Record<string, string>>;\n}): Promise<AgentFileSync> {\n const { cwd, toolIds = [\"claude\"], delivery = DELIVERIES, profile = \"full\", known = {} } = req;\n const out: AgentFileSync = { created: [], refreshed: [], managed: {} };\n for (const { path, content } of plannedCommandFiles(cwd, toolIds, delivery, profile)) {\n const key = manifestPath(cwd, path);\n const desired = contentDigest(content);\n if (!existsSync(path)) {\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, content, \"utf8\");\n out.created.push(path);\n out.managed[key] = desired;\n continue;\n }\n const current = contentDigest(await readFile(path));\n if (current === desired) {\n out.managed[key] = desired;\n continue;\n }\n if (known[key] !== current) continue;\n await writeFile(path, content, \"utf8\");\n out.refreshed.push(path);\n out.managed[key] = desired;\n }\n return out;\n}\n\n/**\n * Backward-compatible create-only wrapper. Callers that own no digest manifest\n * leave every existing file alone and receive only the paths created.\n */\nexport async function scaffoldAgentCommands(\n cwd: string,\n toolIds: string[] = [\"claude\"],\n delivery: readonly Delivery[] = DELIVERIES,\n): Promise<string[]> {\n return (await syncAgentCommands({ cwd, toolIds, delivery })).created;\n}\n\n/**\n * The registry ids whose marker paths are present in `cwd` — what `loam init`\n * writes for when nobody passed `--tools`.\n *\n * A repo with `.cursor/` and no Claude Code used to get `.claude/commands/`\n * and nothing it could actually run. Presence is the whole test, and existence\n * (not directory-ness) is what is asked, because a marker is as often a file as\n * a directory — `.github/copilot-instructions.md` is the honest signal for\n * Copilot where `.github/` itself is noise.\n */\nexport function detectAgentTools(cwd: string): string[] {\n return Object.entries(AGENT_TOOLS)\n .filter(([, tool]) => tool.detect.some((marker) => existsSync(join(cwd, marker))))\n .map(([id]) => id);\n}\n"]}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The incident-reporting protocol: preserve a small, sanitized reproducer when
|
|
3
|
+
* loam or its agent integration behaves unexpectedly, without turning loam
|
|
4
|
+
* into a telemetry service or retrying a risky write.
|
|
5
|
+
*/
|
|
6
|
+
export const LOAM_REPORT = {
|
|
7
|
+
name: "loam-report",
|
|
8
|
+
description: "Record unexpected loam or agent behavior as a sanitized, reproducible Markdown report",
|
|
9
|
+
argumentHint: "",
|
|
10
|
+
purpose: "Collect one unexpected loam or agent-integration incident into a separate, reviewable Markdown file. This is local diagnostics only: redact secrets, never upload automatically, and never repeat a writer merely to reproduce it.",
|
|
11
|
+
invocation: "loam instructions loam-report",
|
|
12
|
+
placeholders: [],
|
|
13
|
+
spine: [
|
|
14
|
+
"preserve the user's original symptom and expected result before investigating",
|
|
15
|
+
"collect the binary version, wiring diagnosis and the smallest safe reproduction",
|
|
16
|
+
"classify the failure without repairing, retrying a writer or changing project documents",
|
|
17
|
+
"sanitize commands, paths and output, then write one report under loam-reports/",
|
|
18
|
+
"hand back the report path, classification and any evidence that could not be collected",
|
|
19
|
+
],
|
|
20
|
+
body: `Record one incident where loam, a generated command/skill, or the agent following it
|
|
21
|
+
behaved unexpectedly. The result is a local diagnostic document, not a repair and not telemetry.
|
|
22
|
+
Do not change architecture/spec files while collecting it.
|
|
23
|
+
|
|
24
|
+
## Preserve the symptom first
|
|
25
|
+
|
|
26
|
+
Before running anything, write down the user's original request, what they expected, what actually
|
|
27
|
+
happened, the command or chat entry point involved, and whether any files may already have changed.
|
|
28
|
+
Do not improve or reinterpret the failing command yet: a cleaned-up command is not a reproduction.
|
|
29
|
+
|
|
30
|
+
Classify the incident as one of these, using \`inconclusive\` until the evidence supports another:
|
|
31
|
+
|
|
32
|
+
- \`loam-product\` — the binary violated its documented contract or produced internally inconsistent output;
|
|
33
|
+
- \`project-data\` — the binary correctly reported invalid, incomplete or stale repository documents;
|
|
34
|
+
- \`agent-workflow\` — the generated command/skill was missing, stale, misrouted or followed incorrectly;
|
|
35
|
+
- \`host-infrastructure\` — permissions, filesystem, process, shell or tool-host behavior prevented the run;
|
|
36
|
+
- \`inconclusive\` — the available evidence does not distinguish the above.
|
|
37
|
+
|
|
38
|
+
## Collect only safe evidence
|
|
39
|
+
|
|
40
|
+
1. Run \`loam --version\` and record the result.
|
|
41
|
+
2. Run \`loam doctor --json\`. If it succeeds, keep \`healthy\`, the finding codes and their structured
|
|
42
|
+
locations/fixes, the resolved repository role, and the write-path state. If it refuses, keep
|
|
43
|
+
\`error.code\` and the sanitized message. Do not apply the fixes during reporting.
|
|
44
|
+
3. When the repository is wired, run \`loam status --json\` and keep only the state and next-action
|
|
45
|
+
rows relevant to this incident. A refusal is evidence too; keep its \`error.code\`.
|
|
46
|
+
4. Re-run the original operation only when it is read-only and safe. Never re-run \`init\`, \`new\`,
|
|
47
|
+
\`rebase\`, \`subsystem\`, \`archive\`, \`unarchive\`, \`vouch\`, a recording form of \`verify\`, or
|
|
48
|
+
any other writer merely to make it fail twice. For a writer, record its original exit/output and
|
|
49
|
+
inspect \`doctor\`, \`status\` and version only. Do not repair, roll back or delete anything unless
|
|
50
|
+
the user separately asks for that action.
|
|
51
|
+
5. Prefer the JSON envelope: record \`contractVersion\`, \`ok\`, \`command\`, \`error.code\`, finding
|
|
52
|
+
codes and \`locations[]\`. Quote only the smallest stdout/stderr excerpt that demonstrates the
|
|
53
|
+
symptom. State what was omitted.
|
|
54
|
+
|
|
55
|
+
## Sanitize before writing
|
|
56
|
+
|
|
57
|
+
Never include credentials, tokens, cookies, authorization headers, private keys, environment dumps,
|
|
58
|
+
or values of variables whose names contain \`TOKEN\`, \`SECRET\`, \`PASSWORD\`, \`AUTH\`, \`COOKIE\` or
|
|
59
|
+
\`KEY\`. Replace each value with \`<redacted>\`. Replace the user's home directory with \`<home>\` and
|
|
60
|
+
prefer repository-relative paths. Do not copy source files, architecture/spec bodies, or a complete
|
|
61
|
+
command output when a code and short excerpt prove the same fact. Review the finished report once
|
|
62
|
+
more for secrets before handing it back.
|
|
63
|
+
|
|
64
|
+
## Write one separate report
|
|
65
|
+
|
|
66
|
+
Create \`loam-reports/YYYY-MM-DD-<short-slug>.md\` at the current repository root. Use a short neutral
|
|
67
|
+
slug based on the symptom, not a customer, person or secret. Never overwrite a different incident;
|
|
68
|
+
add a numeric suffix when the path exists. Reports are ordinary project files so the team can
|
|
69
|
+
review or commit them deliberately, but do not upload, submit an issue, send telemetry, or contact
|
|
70
|
+
any service automatically.
|
|
71
|
+
|
|
72
|
+
Use this shape, omitting only fields that truly cannot be known and marking them \`not collected\`:
|
|
73
|
+
|
|
74
|
+
# loam problem report: <short title>
|
|
75
|
+
|
|
76
|
+
- Recorded: <ISO-8601 timestamp>
|
|
77
|
+
- Classification: <one value above>
|
|
78
|
+
- Repository role: <docs | service | combined | unresolved>
|
|
79
|
+
- loam version: <version>
|
|
80
|
+
- Entry point: <chat command, skill, or CLI command; sanitized>
|
|
81
|
+
- Side effects observed: <none known | paths changed | unknown>
|
|
82
|
+
|
|
83
|
+
## Summary
|
|
84
|
+
## Expected
|
|
85
|
+
## Actual
|
|
86
|
+
## Minimal safe reproduction
|
|
87
|
+
## Machine contract
|
|
88
|
+
## Doctor and status evidence
|
|
89
|
+
## Files changed or write state
|
|
90
|
+
## Workaround
|
|
91
|
+
## Missing evidence
|
|
92
|
+
## Sanitization
|
|
93
|
+
|
|
94
|
+
In \`Machine contract\`, include exit code plus the stable envelope fields and relevant finding
|
|
95
|
+
codes/locations; do not paste an entire large JSON payload. In \`Sanitization\`, list the kinds of
|
|
96
|
+
values removed without revealing them. If no workaround is known, say so rather than inventing one.
|
|
97
|
+
|
|
98
|
+
Finish by telling the user the report path, classification, whether project files changed, and which
|
|
99
|
+
evidence was unavailable. Keep diagnosis separate from certainty: a plausible cause belongs under
|
|
100
|
+
\`Summary\` as a hypothesis until the reproduction proves it.
|
|
101
|
+
`,
|
|
102
|
+
};
|
|
103
|
+
//# sourceMappingURL=report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../../../src/core/agent/support/report.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAmB;IACzC,IAAI,EAAE,aAAa;IACnB,WAAW,EACT,uFAAuF;IACzF,YAAY,EAAE,EAAE;IAChB,OAAO,EACL,oOAAoO;IACtO,UAAU,EAAE,+BAA+B;IAC3C,YAAY,EAAE,EAAE;IAChB,KAAK,EAAE;QACL,+EAA+E;QAC/E,iFAAiF;QACjF,yFAAyF;QACzF,gFAAgF;QAChF,wFAAwF;KACzF;IACD,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiFP;CACA,CAAC","sourcesContent":["import type { CommandContent } from \"../contract.js\";\n\n/**\n * The incident-reporting protocol: preserve a small, sanitized reproducer when\n * loam or its agent integration behaves unexpectedly, without turning loam\n * into a telemetry service or retrying a risky write.\n */\nexport const LOAM_REPORT: CommandContent = {\n name: \"loam-report\",\n description:\n \"Record unexpected loam or agent behavior as a sanitized, reproducible Markdown report\",\n argumentHint: \"\",\n purpose:\n \"Collect one unexpected loam or agent-integration incident into a separate, reviewable Markdown file. This is local diagnostics only: redact secrets, never upload automatically, and never repeat a writer merely to reproduce it.\",\n invocation: \"loam instructions loam-report\",\n placeholders: [],\n spine: [\n \"preserve the user's original symptom and expected result before investigating\",\n \"collect the binary version, wiring diagnosis and the smallest safe reproduction\",\n \"classify the failure without repairing, retrying a writer or changing project documents\",\n \"sanitize commands, paths and output, then write one report under loam-reports/\",\n \"hand back the report path, classification and any evidence that could not be collected\",\n ],\n body: `Record one incident where loam, a generated command/skill, or the agent following it\nbehaved unexpectedly. The result is a local diagnostic document, not a repair and not telemetry.\nDo not change architecture/spec files while collecting it.\n\n## Preserve the symptom first\n\nBefore running anything, write down the user's original request, what they expected, what actually\nhappened, the command or chat entry point involved, and whether any files may already have changed.\nDo not improve or reinterpret the failing command yet: a cleaned-up command is not a reproduction.\n\nClassify the incident as one of these, using \\`inconclusive\\` until the evidence supports another:\n\n- \\`loam-product\\` — the binary violated its documented contract or produced internally inconsistent output;\n- \\`project-data\\` — the binary correctly reported invalid, incomplete or stale repository documents;\n- \\`agent-workflow\\` — the generated command/skill was missing, stale, misrouted or followed incorrectly;\n- \\`host-infrastructure\\` — permissions, filesystem, process, shell or tool-host behavior prevented the run;\n- \\`inconclusive\\` — the available evidence does not distinguish the above.\n\n## Collect only safe evidence\n\n1. Run \\`loam --version\\` and record the result.\n2. Run \\`loam doctor --json\\`. If it succeeds, keep \\`healthy\\`, the finding codes and their structured\n locations/fixes, the resolved repository role, and the write-path state. If it refuses, keep\n \\`error.code\\` and the sanitized message. Do not apply the fixes during reporting.\n3. When the repository is wired, run \\`loam status --json\\` and keep only the state and next-action\n rows relevant to this incident. A refusal is evidence too; keep its \\`error.code\\`.\n4. Re-run the original operation only when it is read-only and safe. Never re-run \\`init\\`, \\`new\\`,\n \\`rebase\\`, \\`subsystem\\`, \\`archive\\`, \\`unarchive\\`, \\`vouch\\`, a recording form of \\`verify\\`, or\n any other writer merely to make it fail twice. For a writer, record its original exit/output and\n inspect \\`doctor\\`, \\`status\\` and version only. Do not repair, roll back or delete anything unless\n the user separately asks for that action.\n5. Prefer the JSON envelope: record \\`contractVersion\\`, \\`ok\\`, \\`command\\`, \\`error.code\\`, finding\n codes and \\`locations[]\\`. Quote only the smallest stdout/stderr excerpt that demonstrates the\n symptom. State what was omitted.\n\n## Sanitize before writing\n\nNever include credentials, tokens, cookies, authorization headers, private keys, environment dumps,\nor values of variables whose names contain \\`TOKEN\\`, \\`SECRET\\`, \\`PASSWORD\\`, \\`AUTH\\`, \\`COOKIE\\` or\n\\`KEY\\`. Replace each value with \\`<redacted>\\`. Replace the user's home directory with \\`<home>\\` and\nprefer repository-relative paths. Do not copy source files, architecture/spec bodies, or a complete\ncommand output when a code and short excerpt prove the same fact. Review the finished report once\nmore for secrets before handing it back.\n\n## Write one separate report\n\nCreate \\`loam-reports/YYYY-MM-DD-<short-slug>.md\\` at the current repository root. Use a short neutral\nslug based on the symptom, not a customer, person or secret. Never overwrite a different incident;\nadd a numeric suffix when the path exists. Reports are ordinary project files so the team can\nreview or commit them deliberately, but do not upload, submit an issue, send telemetry, or contact\nany service automatically.\n\nUse this shape, omitting only fields that truly cannot be known and marking them \\`not collected\\`:\n\n # loam problem report: <short title>\n\n - Recorded: <ISO-8601 timestamp>\n - Classification: <one value above>\n - Repository role: <docs | service | combined | unresolved>\n - loam version: <version>\n - Entry point: <chat command, skill, or CLI command; sanitized>\n - Side effects observed: <none known | paths changed | unknown>\n\n ## Summary\n ## Expected\n ## Actual\n ## Minimal safe reproduction\n ## Machine contract\n ## Doctor and status evidence\n ## Files changed or write state\n ## Workaround\n ## Missing evidence\n ## Sanitization\n\nIn \\`Machine contract\\`, include exit code plus the stable envelope fields and relevant finding\ncodes/locations; do not paste an entire large JSON payload. In \\`Sanitization\\`, list the kinds of\nvalues removed without revealing them. If no workaround is known, say so rather than inventing one.\n\nFinish by telling the user the report path, classification, whether project files changed, and which\nevidence was unavailable. Keep diagnosis separate from certainty: a plausible cause belongs under\n\\`Summary\\` as a hypothesis until the reproduction proves it.\n`,\n};\n"]}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The loam verbs a generated file pre-approves, so an agent that honors the
|
|
3
|
+
* field stops asking permission for each call. Everything else a command needs
|
|
4
|
+
* (Read, Write, the service's own test runner) stays under the user's normal
|
|
5
|
+
* permission settings, and a tool that does not know the field ignores it.
|
|
6
|
+
*
|
|
7
|
+
* Enumerated rather than spelled `Bash(loam:*)`, for one verb's sake. `vouch`
|
|
8
|
+
* is the only command in loam whose output is a claim about a HUMAN act — a
|
|
9
|
+
* person read the code and says the document matches it — and a blanket
|
|
10
|
+
* allowlist pre-approved it, which handed the agent that wrote a draft the
|
|
11
|
+
* power to promote its own draft to `verified` without anybody being asked.
|
|
12
|
+
* That inverts the argument loam makes everywhere else: it holds test evidence
|
|
13
|
+
* to "an agent must not be able to SAY a scenario is tested", and then let one
|
|
14
|
+
* say a spec matches the code. `vouch` now refuses without a terminal or
|
|
15
|
+
* `--yes` (commands/vouch.ts) — this list is the other half, so the refusal is
|
|
16
|
+
* something a person sees rather than something an agent routes around.
|
|
17
|
+
*
|
|
18
|
+
* A verb missing from this list is not forbidden, only unapproved: the agent
|
|
19
|
+
* asks, and the user says yes. That is the correct cost for this one.
|
|
20
|
+
*
|
|
21
|
+
* The rule the list obeys is **every verb the CLI registers except the keys of
|
|
22
|
+
* {@link UNAPPROVED}**, and it admits no silent third category: a verb is
|
|
23
|
+
* either here or there, with a written reason. The rule it does NOT obey is
|
|
24
|
+
* "read-only" — that is false of `subsystem`, which writes, and it was never
|
|
25
|
+
* what this list did anyway: `archive`, `rebase` and `new` all write, and all
|
|
26
|
+
* three have been on it since the day the wildcard came off.
|
|
27
|
+
*
|
|
28
|
+
* The rule is written down because a hand-kept list drifts, and this one had.
|
|
29
|
+
* Seventeen of the twenty-nine registered verbs were on it, and three of the
|
|
30
|
+
* twelve missing ones were instructed by loam's own protocols: `loam-implement`
|
|
31
|
+
* opens with `loam context` and calls `loam steps` mandatory before a step
|
|
32
|
+
* definition is written, and `loam-check`'s fix table says to run
|
|
33
|
+
* `loam subsystem sync`. Each stalled on a permission prompt at exactly the
|
|
34
|
+
* step its own protocol calls required. It was worst for `explain`: every
|
|
35
|
+
* generated file now tells the agent to read the protocol narrow
|
|
36
|
+
* (`loam instructions <workflow> --no-fix-tables`) and then look up the codes
|
|
37
|
+
* the run actually reported — so the one command that makes an 84 KB page
|
|
38
|
+
* payable was the one the skill could not invoke unasked.
|
|
39
|
+
*/
|
|
40
|
+
const LOAM_ALLOWED_VERBS = [
|
|
41
|
+
"adopt",
|
|
42
|
+
"archive",
|
|
43
|
+
"context",
|
|
44
|
+
"delta",
|
|
45
|
+
"dependencies",
|
|
46
|
+
"diff",
|
|
47
|
+
"doctor",
|
|
48
|
+
"explain",
|
|
49
|
+
"explore",
|
|
50
|
+
"gate",
|
|
51
|
+
"gherkin",
|
|
52
|
+
"init",
|
|
53
|
+
"instructions",
|
|
54
|
+
"list",
|
|
55
|
+
"new",
|
|
56
|
+
"rebase",
|
|
57
|
+
"show",
|
|
58
|
+
"status",
|
|
59
|
+
"steps",
|
|
60
|
+
"subsystem",
|
|
61
|
+
"unarchive",
|
|
62
|
+
"validate",
|
|
63
|
+
"verify",
|
|
64
|
+
];
|
|
65
|
+
/**
|
|
66
|
+
* The verbs deliberately left OFF {@link LOAM_ALLOWED_VERBS}, each with the
|
|
67
|
+
* reason it is off.
|
|
68
|
+
*
|
|
69
|
+
* A map rather than a paragraph, because "every verb but the named exclusions"
|
|
70
|
+
* is only a checkable rule if the exclusions are a VALUE. test/agents.test.ts
|
|
71
|
+
* reads this one: the emitted allowlist must equal the CLI's registered
|
|
72
|
+
* commands minus these keys, so an absent verb is either a decision recorded
|
|
73
|
+
* here or a test failure — never something nobody can tell from a forgotten
|
|
74
|
+
* one, which is what the previous list was. Only `vouch` had ever been reasoned
|
|
75
|
+
* in the source, and its reason is the paragraph above, unchanged.
|
|
76
|
+
*
|
|
77
|
+
* The equality is checked in the test layer and cannot be computed here:
|
|
78
|
+
* deriving the allowlist from the command registry would mean `core/`
|
|
79
|
+
* importing `commands/`, which AGENTS.md forbids outright.
|
|
80
|
+
*/
|
|
81
|
+
export const UNAPPROVED = {
|
|
82
|
+
"audit-openspec": "the OpenSpec on-ramp: a one-time migration a person drives against a foreign workspace, named by no workflow protocol",
|
|
83
|
+
mcp: "a long-running stdio server rather than a call that returns — an agent that starts it inside a step waits forever",
|
|
84
|
+
"migrate-openspec": "the same on-ramp, and `--apply` materializes a whole target tree from a mapping only a human can have filled in",
|
|
85
|
+
open: "writes a `.code-workspace` for a person's editor; the output is aimed at the human, and no protocol step reads it",
|
|
86
|
+
seed: "templates the fleet map from a human-authored fleet.yaml — who exists and who calls whom is the one thing no generator may state",
|
|
87
|
+
vouch: "a claim about a HUMAN act, so an agent must not be able to SAY a spec matches the code; the refusal has to be something a person sees rather than something an agent routes around",
|
|
88
|
+
};
|
|
89
|
+
const LOAM_ALLOWED_TOOLS = LOAM_ALLOWED_VERBS.map((v) => `Bash(loam ${v}:*)`).join(", ");
|
|
90
|
+
/**
|
|
91
|
+
* Incident collection is intentionally narrower than a lifecycle workflow.
|
|
92
|
+
* The body names writers so an agent can recognize and avoid retrying them;
|
|
93
|
+
* inheriting the lifecycle allowlist would nevertheless pre-authorize those
|
|
94
|
+
* same writers while diagnosing a bad run. Version, doctor and status are the
|
|
95
|
+
* complete command set the reporting protocol asks to execute.
|
|
96
|
+
*/
|
|
97
|
+
const REPORT_ALLOWED_TOOLS = [
|
|
98
|
+
"Bash(loam --version)",
|
|
99
|
+
"Bash(loam doctor:*)",
|
|
100
|
+
"Bash(loam instructions:*)",
|
|
101
|
+
"Bash(loam status:*)",
|
|
102
|
+
].join(", ");
|
|
103
|
+
const skillAllowedTools = (c) => c.name === "loam-report" ? REPORT_ALLOWED_TOOLS : LOAM_ALLOWED_TOOLS;
|
|
104
|
+
/**
|
|
105
|
+
* The Agent Skills convention loam EMITS: `<root>/skills/<name>/SKILL.md`, YAML
|
|
106
|
+
* frontmatter, then the shared body verbatim — where `<root>` is whatever the
|
|
107
|
+
* calling registry entry passes.
|
|
108
|
+
*
|
|
109
|
+
* It used to say that every tool in the registry which reads skills spells the
|
|
110
|
+
* path this way. That was an unevidenced universal, and the `agents` entry
|
|
111
|
+
* falsifies it: `.agents/skills/` is a vendor-neutral root several tools read
|
|
112
|
+
* INSTEAD of their own dot-directory, not another tool's directory. Where a
|
|
113
|
+
* path is documented by the tool, the citation lives on that tool's registry
|
|
114
|
+
* entry — this helper states only what it writes.
|
|
115
|
+
*
|
|
116
|
+
* `description` is load-bearing in a way no command file's is — it is the only
|
|
117
|
+
* thing the model sees before deciding whether to load the skill — so it comes
|
|
118
|
+
* from the same `CommandContent.description` the command wrappers use rather
|
|
119
|
+
* than a second, skill-flavoured copy that could drift into a better pitch for
|
|
120
|
+
* a worse protocol.
|
|
121
|
+
*/
|
|
122
|
+
export const skillsIn = (dir) => ({
|
|
123
|
+
path: (name) => [dir, "skills", name, "SKILL.md"],
|
|
124
|
+
format: (c) => `---\nname: ${c.name}\ndescription: ${c.description}\n` +
|
|
125
|
+
`allowed-tools: ${skillAllowedTools(c)}\n---\n\n${c.body}`,
|
|
126
|
+
});
|
|
127
|
+
/**
|
|
128
|
+
* TOML basic-string escapes for the one non-markdown format. Today's bodies
|
|
129
|
+
* carry neither backslashes nor `"""`, but the escape is what keeps a future
|
|
130
|
+
* body edit from silently corrupting the generated TOML.
|
|
131
|
+
*/
|
|
132
|
+
export const tomlLine = (s) => s.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
|
|
133
|
+
export const tomlBlock = (s) => s.replace(/\\/g, "\\\\").replace(/"""/g, '""\\"');
|
|
134
|
+
/* The four markdown command dialects the registry actually needs. Shared so a
|
|
135
|
+
* tool's entry is its PATH and its dialect's name — the part that differs —
|
|
136
|
+
* instead of a wall of near-identical template literals. `claude` deliberately
|
|
137
|
+
* spells its own wrapper inline even though `hintedMd` matches it byte for
|
|
138
|
+
* byte: an edit made here for some other tool must not be able to re-spell the
|
|
139
|
+
* one format that is frozen. */
|
|
140
|
+
/** Description-only frontmatter — the most common dialect by a wide margin. */
|
|
141
|
+
export const describedMd = (c) => `---\ndescription: ${c.description}\n---\n\n${c.body}`;
|
|
142
|
+
/** Description plus Claude's `argument-hint`, for the tools that copied it. */
|
|
143
|
+
export const hintedMd = (c) => `---\ndescription: ${c.description}\nargument-hint: ${c.argumentHint}\n---\n\n${c.body}`;
|
|
144
|
+
/** Name plus description — the Cascade-style workflow frontmatter. */
|
|
145
|
+
export const namedMd = (c) => `---\nname: ${c.name}\ndescription: ${c.description}\n---\n\n${c.body}`;
|
|
146
|
+
/** No frontmatter at all: a title line is the whole wrapper. */
|
|
147
|
+
export const titledMd = (c) => `# ${c.name}\n\n${c.body}`;
|
|
148
|
+
/** The `loam-` prefix a namespace directory carries instead of the file name. */
|
|
149
|
+
export const unprefixed = (name) => name.replace(/^loam-/, "");
|
|
150
|
+
//# sourceMappingURL=dialects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dialects.js","sourceRoot":"","sources":["../../../../src/core/agent/tools/dialects.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * How one shared command body is SPELLED per tool family: the markdown and\n * TOML wrapper dialects, and the Agent Skills convention. registry.ts builds\n * its entries from these — nothing here adds prose of its own, so the body\n * stays one source of truth however many tools spell it.\n */\nimport type { AgentFileEmitter, CommandContent } from \"../contract.js\";\n\n/**\n * The loam verbs a generated file pre-approves, so an agent that honors the\n * field stops asking permission for each call. Everything else a command needs\n * (Read, Write, the service's own test runner) stays under the user's normal\n * permission settings, and a tool that does not know the field ignores it.\n *\n * Enumerated rather than spelled `Bash(loam:*)`, for one verb's sake. `vouch`\n * is the only command in loam whose output is a claim about a HUMAN act — a\n * person read the code and says the document matches it — and a blanket\n * allowlist pre-approved it, which handed the agent that wrote a draft the\n * power to promote its own draft to `verified` without anybody being asked.\n * That inverts the argument loam makes everywhere else: it holds test evidence\n * to \"an agent must not be able to SAY a scenario is tested\", and then let one\n * say a spec matches the code. `vouch` now refuses without a terminal or\n * `--yes` (commands/vouch.ts) — this list is the other half, so the refusal is\n * something a person sees rather than something an agent routes around.\n *\n * A verb missing from this list is not forbidden, only unapproved: the agent\n * asks, and the user says yes. That is the correct cost for this one.\n *\n * The rule the list obeys is **every verb the CLI registers except the keys of\n * {@link UNAPPROVED}**, and it admits no silent third category: a verb is\n * either here or there, with a written reason. The rule it does NOT obey is\n * \"read-only\" — that is false of `subsystem`, which writes, and it was never\n * what this list did anyway: `archive`, `rebase` and `new` all write, and all\n * three have been on it since the day the wildcard came off.\n *\n * The rule is written down because a hand-kept list drifts, and this one had.\n * Seventeen of the twenty-nine registered verbs were on it, and three of the\n * twelve missing ones were instructed by loam's own protocols: `loam-implement`\n * opens with `loam context` and calls `loam steps` mandatory before a step\n * definition is written, and `loam-check`'s fix table says to run\n * `loam subsystem sync`. Each stalled on a permission prompt at exactly the\n * step its own protocol calls required. It was worst for `explain`: every\n * generated file now tells the agent to read the protocol narrow\n * (`loam instructions <workflow> --no-fix-tables`) and then look up the codes\n * the run actually reported — so the one command that makes an 84 KB page\n * payable was the one the skill could not invoke unasked.\n */\nconst LOAM_ALLOWED_VERBS = [\n \"adopt\",\n \"archive\",\n \"context\",\n \"delta\",\n \"dependencies\",\n \"diff\",\n \"doctor\",\n \"explain\",\n \"explore\",\n \"gate\",\n \"gherkin\",\n \"init\",\n \"instructions\",\n \"list\",\n \"new\",\n \"rebase\",\n \"show\",\n \"status\",\n \"steps\",\n \"subsystem\",\n \"unarchive\",\n \"validate\",\n \"verify\",\n] as const;\n\n/**\n * The verbs deliberately left OFF {@link LOAM_ALLOWED_VERBS}, each with the\n * reason it is off.\n *\n * A map rather than a paragraph, because \"every verb but the named exclusions\"\n * is only a checkable rule if the exclusions are a VALUE. test/agents.test.ts\n * reads this one: the emitted allowlist must equal the CLI's registered\n * commands minus these keys, so an absent verb is either a decision recorded\n * here or a test failure — never something nobody can tell from a forgotten\n * one, which is what the previous list was. Only `vouch` had ever been reasoned\n * in the source, and its reason is the paragraph above, unchanged.\n *\n * The equality is checked in the test layer and cannot be computed here:\n * deriving the allowlist from the command registry would mean `core/`\n * importing `commands/`, which AGENTS.md forbids outright.\n */\nexport const UNAPPROVED: Record<string, string> = {\n \"audit-openspec\":\n \"the OpenSpec on-ramp: a one-time migration a person drives against a foreign workspace, named by no workflow protocol\",\n mcp: \"a long-running stdio server rather than a call that returns — an agent that starts it inside a step waits forever\",\n \"migrate-openspec\":\n \"the same on-ramp, and `--apply` materializes a whole target tree from a mapping only a human can have filled in\",\n open: \"writes a `.code-workspace` for a person's editor; the output is aimed at the human, and no protocol step reads it\",\n seed: \"templates the fleet map from a human-authored fleet.yaml — who exists and who calls whom is the one thing no generator may state\",\n vouch:\n \"a claim about a HUMAN act, so an agent must not be able to SAY a spec matches the code; the refusal has to be something a person sees rather than something an agent routes around\",\n};\n\nconst LOAM_ALLOWED_TOOLS = LOAM_ALLOWED_VERBS.map((v) => `Bash(loam ${v}:*)`).join(\", \");\n\n/**\n * Incident collection is intentionally narrower than a lifecycle workflow.\n * The body names writers so an agent can recognize and avoid retrying them;\n * inheriting the lifecycle allowlist would nevertheless pre-authorize those\n * same writers while diagnosing a bad run. Version, doctor and status are the\n * complete command set the reporting protocol asks to execute.\n */\nconst REPORT_ALLOWED_TOOLS = [\n \"Bash(loam --version)\",\n \"Bash(loam doctor:*)\",\n \"Bash(loam instructions:*)\",\n \"Bash(loam status:*)\",\n].join(\", \");\n\nconst skillAllowedTools = (c: CommandContent): string =>\n c.name === \"loam-report\" ? REPORT_ALLOWED_TOOLS : LOAM_ALLOWED_TOOLS;\n\n/**\n * The Agent Skills convention loam EMITS: `<root>/skills/<name>/SKILL.md`, YAML\n * frontmatter, then the shared body verbatim — where `<root>` is whatever the\n * calling registry entry passes.\n *\n * It used to say that every tool in the registry which reads skills spells the\n * path this way. That was an unevidenced universal, and the `agents` entry\n * falsifies it: `.agents/skills/` is a vendor-neutral root several tools read\n * INSTEAD of their own dot-directory, not another tool's directory. Where a\n * path is documented by the tool, the citation lives on that tool's registry\n * entry — this helper states only what it writes.\n *\n * `description` is load-bearing in a way no command file's is — it is the only\n * thing the model sees before deciding whether to load the skill — so it comes\n * from the same `CommandContent.description` the command wrappers use rather\n * than a second, skill-flavoured copy that could drift into a better pitch for\n * a worse protocol.\n */\nexport const skillsIn = (dir: string): AgentFileEmitter => ({\n path: (name) => [dir, \"skills\", name, \"SKILL.md\"],\n format: (c) =>\n `---\\nname: ${c.name}\\ndescription: ${c.description}\\n` +\n `allowed-tools: ${skillAllowedTools(c)}\\n---\\n\\n${c.body}`,\n});\n\n/**\n * TOML basic-string escapes for the one non-markdown format. Today's bodies\n * carry neither backslashes nor `\"\"\"`, but the escape is what keeps a future\n * body edit from silently corrupting the generated TOML.\n */\nexport const tomlLine = (s: string): string => s.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"');\nexport const tomlBlock = (s: string): string => s.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"\"\"/g, '\"\"\\\\\"');\n\n/* The four markdown command dialects the registry actually needs. Shared so a\n * tool's entry is its PATH and its dialect's name — the part that differs —\n * instead of a wall of near-identical template literals. `claude` deliberately\n * spells its own wrapper inline even though `hintedMd` matches it byte for\n * byte: an edit made here for some other tool must not be able to re-spell the\n * one format that is frozen. */\n/** Description-only frontmatter — the most common dialect by a wide margin. */\nexport const describedMd = (c: CommandContent): string =>\n `---\\ndescription: ${c.description}\\n---\\n\\n${c.body}`;\n/** Description plus Claude's `argument-hint`, for the tools that copied it. */\nexport const hintedMd = (c: CommandContent): string =>\n `---\\ndescription: ${c.description}\\nargument-hint: ${c.argumentHint}\\n---\\n\\n${c.body}`;\n/** Name plus description — the Cascade-style workflow frontmatter. */\nexport const namedMd = (c: CommandContent): string =>\n `---\\nname: ${c.name}\\ndescription: ${c.description}\\n---\\n\\n${c.body}`;\n/** No frontmatter at all: a title line is the whole wrapper. */\nexport const titledMd = (c: CommandContent): string => `# ${c.name}\\n\\n${c.body}`;\n\n/** The `loam-` prefix a namespace directory carries instead of the file name. */\nexport const unprefixed = (name: string): string => name.replace(/^loam-/, \"\");\n"]}
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import { describedMd, hintedMd, namedMd, skillsIn, titledMd, tomlBlock, tomlLine, unprefixed, } from "./dialects.js";
|
|
2
|
+
/**
|
|
3
|
+
* The original target and the default. This WRAPPER must stay byte-identical
|
|
4
|
+
* to what loam has always written — SLASH_COMMANDS (scaffold.ts) derives
|
|
5
|
+
* through it —
|
|
6
|
+
* and an already-initialized repo must still read as fully scaffolded
|
|
7
|
+
* (`skipped` is existsSync, never content). What the wrapper wraps now carries
|
|
8
|
+
* a version stamp, which is the one thing about a generated file loam will
|
|
9
|
+
* report on; see `stubbed`.
|
|
10
|
+
*
|
|
11
|
+
* It stands outside the registry object because SLASH_COMMANDS reaches for it
|
|
12
|
+
* by name. That lookup was `AGENT_TOOLS["claude"]!.format!` — two assertions on
|
|
13
|
+
* an exported const evaluated at import time, so renaming the key, or letting
|
|
14
|
+
* this entry lose `format` the way `codex` legitimately has, would have thrown
|
|
15
|
+
* a TypeError while the CLI entry point was still being loaded: before
|
|
16
|
+
* `program.exitOverride()` exists, and therefore with no envelope around it.
|
|
17
|
+
* Named and typed, both mistakes are typecheck failures instead. The registry
|
|
18
|
+
* still lists it first, and the emitted bytes are unchanged.
|
|
19
|
+
*/
|
|
20
|
+
export const CLAUDE = {
|
|
21
|
+
path: (name) => [".claude", "commands", `${name}.md`],
|
|
22
|
+
format: (c) => `---\ndescription: ${c.description}\nargument-hint: ${c.argumentHint}\n---\n\n${c.body}`,
|
|
23
|
+
skill: skillsIn(".claude"),
|
|
24
|
+
detect: [".claude"],
|
|
25
|
+
};
|
|
26
|
+
export const AGENT_TOOLS = {
|
|
27
|
+
claude: CLAUDE,
|
|
28
|
+
// Cursor invokes by flat file name (`/loam-check`); its frontmatter `name`
|
|
29
|
+
// field spells that invocation form.
|
|
30
|
+
cursor: {
|
|
31
|
+
path: (name) => [".cursor", "commands", `${name}.md`],
|
|
32
|
+
format: (c) => `---\nname: /${c.name}\n---\n\n${c.body}`,
|
|
33
|
+
skill: skillsIn(".cursor"),
|
|
34
|
+
detect: [".cursor"],
|
|
35
|
+
},
|
|
36
|
+
// Copilot prompt files: `.prompt.md` extension, description-only frontmatter.
|
|
37
|
+
// Detection cannot use `.github/` — almost every repo has one and almost none
|
|
38
|
+
// of them means Copilot — so it looks for the files Copilot itself reads.
|
|
39
|
+
"github-copilot": {
|
|
40
|
+
path: (name) => [".github", "prompts", `${name}.prompt.md`],
|
|
41
|
+
format: describedMd,
|
|
42
|
+
skill: skillsIn(".github"),
|
|
43
|
+
detect: [
|
|
44
|
+
".github/copilot-instructions.md",
|
|
45
|
+
".github/instructions",
|
|
46
|
+
".github/prompts",
|
|
47
|
+
".github/agents",
|
|
48
|
+
".github/skills",
|
|
49
|
+
".github/workflows/copilot-setup-steps.yml",
|
|
50
|
+
".github/.mcp.json",
|
|
51
|
+
],
|
|
52
|
+
},
|
|
53
|
+
// Gemini: TOML, and a namespace DIRECTORY — `.gemini/commands/loam/check.toml`
|
|
54
|
+
// is invoked as `/loam:check`, so the file name drops the `loam-` prefix the
|
|
55
|
+
// flat-named tools carry.
|
|
56
|
+
gemini: {
|
|
57
|
+
path: (name) => [".gemini", "commands", "loam", `${unprefixed(name)}.toml`],
|
|
58
|
+
format: (c) => `description = "${tomlLine(c.description)}"\nprompt = """\n${tomlBlock(c.body)}"""`,
|
|
59
|
+
skill: skillsIn(".gemini"),
|
|
60
|
+
detect: [".gemini"],
|
|
61
|
+
},
|
|
62
|
+
opencode: {
|
|
63
|
+
path: (name) => [".opencode", "commands", `${name}.md`],
|
|
64
|
+
format: describedMd,
|
|
65
|
+
skill: skillsIn(".opencode"),
|
|
66
|
+
detect: [".opencode"],
|
|
67
|
+
},
|
|
68
|
+
// Cline reads workflows from `.clinerules/` — plain markdown, no frontmatter —
|
|
69
|
+
// but its skills from `.cline/`. The two directories are unrelated, so both
|
|
70
|
+
// count as a sighting.
|
|
71
|
+
cline: {
|
|
72
|
+
path: (name) => [".clinerules", "workflows", `${name}.md`],
|
|
73
|
+
format: (c) => `# ${c.name}\n\n${c.body}`,
|
|
74
|
+
skill: skillsIn(".cline"),
|
|
75
|
+
detect: [".cline", ".clinerules"],
|
|
76
|
+
},
|
|
77
|
+
// Amazon Q surfaces these as its PROMPT library, not as commands: the file is
|
|
78
|
+
// invoked `@loam-check`, never `/loam-check`. Same file shape regardless.
|
|
79
|
+
"amazon-q": {
|
|
80
|
+
path: (name) => [".amazonq", "prompts", `${name}.md`],
|
|
81
|
+
format: describedMd,
|
|
82
|
+
skill: skillsIn(".amazonq"),
|
|
83
|
+
detect: [".amazonq"],
|
|
84
|
+
},
|
|
85
|
+
// Antigravity's directory is `.agent/`, which is why the id and the directory
|
|
86
|
+
// do not match here as they do almost everywhere else.
|
|
87
|
+
antigravity: {
|
|
88
|
+
path: (name) => [".agent", "workflows", `${name}.md`],
|
|
89
|
+
format: describedMd,
|
|
90
|
+
skill: skillsIn(".agent"),
|
|
91
|
+
detect: [".agent"],
|
|
92
|
+
},
|
|
93
|
+
// Auggie is the Augment CLI: id `auggie`, directory `.augment/`.
|
|
94
|
+
auggie: {
|
|
95
|
+
path: (name) => [".augment", "commands", `${name}.md`],
|
|
96
|
+
format: hintedMd,
|
|
97
|
+
skill: skillsIn(".augment"),
|
|
98
|
+
detect: [".augment"],
|
|
99
|
+
},
|
|
100
|
+
// Skills-only, deliberately: Codex reads `.codex/skills/` and does not load
|
|
101
|
+
// custom command files, so it declares no command emitter at all rather than
|
|
102
|
+
// laying down files nothing will ever open.
|
|
103
|
+
codex: {
|
|
104
|
+
skill: skillsIn(".codex"),
|
|
105
|
+
detect: [".codex"],
|
|
106
|
+
},
|
|
107
|
+
// Continue's prompt files take a bare `.prompt` extension, and `invokable`
|
|
108
|
+
// is what promotes one from a template to something you can call.
|
|
109
|
+
continue: {
|
|
110
|
+
path: (name) => [".continue", "prompts", `${name}.prompt`],
|
|
111
|
+
format: (c) => `---\nname: ${c.name}\ndescription: ${c.description}\ninvokable: true\n---\n\n${c.body}`,
|
|
112
|
+
skill: skillsIn(".continue"),
|
|
113
|
+
detect: [".continue"],
|
|
114
|
+
},
|
|
115
|
+
// Crush namespaces like Gemini does — `.crush/commands/loam/check.md` is
|
|
116
|
+
// `/loam:check` — but stays markdown.
|
|
117
|
+
crush: {
|
|
118
|
+
path: (name) => [".crush", "commands", "loam", `${unprefixed(name)}.md`],
|
|
119
|
+
format: namedMd,
|
|
120
|
+
skill: skillsIn(".crush"),
|
|
121
|
+
detect: [".crush"],
|
|
122
|
+
},
|
|
123
|
+
// Devin Desktop, formerly Windsurf: Cascade-style workflows, and the rename
|
|
124
|
+
// moved the directory from `.windsurf/` to `.devin/`. New files go to the new
|
|
125
|
+
// directory; a repo still holding the old one is still a Devin repo, so both
|
|
126
|
+
// are sightings.
|
|
127
|
+
devin: {
|
|
128
|
+
path: (name) => [".devin", "workflows", `${name}.md`],
|
|
129
|
+
format: namedMd,
|
|
130
|
+
skill: skillsIn(".devin"),
|
|
131
|
+
detect: [".devin", ".windsurf"],
|
|
132
|
+
},
|
|
133
|
+
factory: {
|
|
134
|
+
path: (name) => [".factory", "commands", `${name}.md`],
|
|
135
|
+
format: hintedMd,
|
|
136
|
+
skill: skillsIn(".factory"),
|
|
137
|
+
detect: [".factory"],
|
|
138
|
+
},
|
|
139
|
+
junie: {
|
|
140
|
+
path: (name) => [".junie", "commands", `${name}.md`],
|
|
141
|
+
format: describedMd,
|
|
142
|
+
skill: skillsIn(".junie"),
|
|
143
|
+
detect: [".junie"],
|
|
144
|
+
},
|
|
145
|
+
// Kilo Code workflows carry no frontmatter — the title line is all the
|
|
146
|
+
// wrapper there is.
|
|
147
|
+
kilocode: {
|
|
148
|
+
path: (name) => [".kilocode", "workflows", `${name}.md`],
|
|
149
|
+
format: titledMd,
|
|
150
|
+
skill: skillsIn(".kilocode"),
|
|
151
|
+
detect: [".kilocode"],
|
|
152
|
+
},
|
|
153
|
+
// Kiro uses Copilot's `.prompt.md` extension under its own directory.
|
|
154
|
+
kiro: {
|
|
155
|
+
path: (name) => [".kiro", "prompts", `${name}.prompt.md`],
|
|
156
|
+
format: describedMd,
|
|
157
|
+
skill: skillsIn(".kiro"),
|
|
158
|
+
detect: [".kiro"],
|
|
159
|
+
},
|
|
160
|
+
// Qwen Code retired its TOML commands in favour of markdown + frontmatter,
|
|
161
|
+
// so this is markdown despite the Gemini lineage.
|
|
162
|
+
qwen: {
|
|
163
|
+
path: (name) => [".qwen", "commands", `${name}.md`],
|
|
164
|
+
format: describedMd,
|
|
165
|
+
skill: skillsIn(".qwen"),
|
|
166
|
+
detect: [".qwen"],
|
|
167
|
+
},
|
|
168
|
+
// Roo/Zoo Code: id `roocode`, directory `.roo/`, no frontmatter.
|
|
169
|
+
roocode: {
|
|
170
|
+
path: (name) => [".roo", "commands", `${name}.md`],
|
|
171
|
+
format: titledMd,
|
|
172
|
+
skill: skillsIn(".roo"),
|
|
173
|
+
detect: [".roo"],
|
|
174
|
+
},
|
|
175
|
+
trae: {
|
|
176
|
+
path: (name) => [".trae", "commands", `${name}.md`],
|
|
177
|
+
format: namedMd,
|
|
178
|
+
skill: skillsIn(".trae"),
|
|
179
|
+
detect: [".trae"],
|
|
180
|
+
},
|
|
181
|
+
// The vendor-neutral skills root, and the only id here that names no vendor.
|
|
182
|
+
// `.agents/skills/<name>/SKILL.md` is read by six of the tools that already
|
|
183
|
+
// have entries above, each documenting it in its own words:
|
|
184
|
+
//
|
|
185
|
+
// Cursor — "Skills are automatically loaded from `.agents/skills/`,
|
|
186
|
+
// `.cursor/skills/`, `~/.agents/skills/` … and `~/.cursor/skills/`"
|
|
187
|
+
// (Agent Skills, cursor.com/docs/skills).
|
|
188
|
+
// GitHub Copilot — "For project skills, specific to a single repository,
|
|
189
|
+
// create a `.github/skills`, `.claude/skills`, or `.agents/skills`
|
|
190
|
+
// directory in your repository" (Adding agent skills for GitHub Copilot,
|
|
191
|
+
// docs.github.com/en/copilot → customize-cloud-agent/add-skills).
|
|
192
|
+
// Codex — "Codex scans `.agents/skills` in every directory from your
|
|
193
|
+
// current working directory up to the repository root" (Build skills,
|
|
194
|
+
// developers.openai.com/codex/skills).
|
|
195
|
+
// Gemini CLI — `.agents/skills/` is the workspace-tier alias for
|
|
196
|
+
// `.gemini/skills/`, and "within the same tier … takes precedence over
|
|
197
|
+
// the `.gemini/skills/` directory" (docs/cli/skills.md in
|
|
198
|
+
// google-gemini/gemini-cli).
|
|
199
|
+
// Zed — "Skills are loaded from `~/.agents/skills/` and
|
|
200
|
+
// `<worktree>/.agents/skills/` only" (Agent Skills, zed.dev/docs/ai/skills).
|
|
201
|
+
// Roo Code — `.agents/skills/` is its cross-agent project location, ranked
|
|
202
|
+
// below `.roo/skills/` at the same level (Skills,
|
|
203
|
+
// docs.roocode.com/features/skills).
|
|
204
|
+
//
|
|
205
|
+
// Skills only, for the reason spelled out on `codex`: not one of those six
|
|
206
|
+
// documents a COMMAND file under this root, so a `.agents/commands/` would be
|
|
207
|
+
// files nothing will ever open — the thing this entry exists to stop.
|
|
208
|
+
//
|
|
209
|
+
// Purely ADDITIVE, and that is the design rather than an implementation
|
|
210
|
+
// detail. No tool above loses or re-points its own skill path: a repo already
|
|
211
|
+
// carrying `.claude/skills/` keeps getting them there. This entry is for the
|
|
212
|
+
// team that would rather have ONE copy those six read than six copies of the
|
|
213
|
+
// same bytes, and choosing that is the user's call — which is why selecting
|
|
214
|
+
// `agents` adds a target and never removes one.
|
|
215
|
+
//
|
|
216
|
+
// `detect` is `.agents/skills`, never a bare `.agents/`, for exactly
|
|
217
|
+
// `github-copilot`'s reason. `.agents/` is a shared root that other
|
|
218
|
+
// conventions also write into, so a bare marker would auto-scaffold into any
|
|
219
|
+
// repository where something else had made the directory — the failure that
|
|
220
|
+
// rules out `.github/` one entry up. It is also NOT `antigravity`'s
|
|
221
|
+
// `.agent/`: one letter apart, unrelated conventions, and `existsSync` on
|
|
222
|
+
// either says nothing about the other.
|
|
223
|
+
agents: {
|
|
224
|
+
skill: skillsIn(".agents"),
|
|
225
|
+
detect: [".agents/skills"],
|
|
226
|
+
},
|
|
227
|
+
};
|
|
228
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../../src/core/agent/tools/registry.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The registry of agent tools loam can scaffold for — one entry per tool: its\n * paths, its wrapper dialect, and the marker paths whose presence means the\n * tool is in use. Paths and wrappers follow each tool's own documented\n * convention and are pinned byte-for-byte in test/agents.test.ts.\n */\nimport type { AgentTool } from \"../contract.js\";\nimport {\n describedMd,\n hintedMd,\n namedMd,\n skillsIn,\n titledMd,\n tomlBlock,\n tomlLine,\n unprefixed,\n} from \"./dialects.js\";\n\n/**\n * A registry entry that really does emit command files — both halves of the\n * command adapter present. The distinction is not hypothetical: `codex`\n * declares neither, on purpose. Naming it lets the one entry\n * scaffold.ts derives THROUGH carry that guarantee in its type, instead of at\n * the use site where the only way to state it was a pair of `!`.\n */\ntype CommandEmittingTool = AgentTool & Required<Pick<AgentTool, \"path\" | \"format\">>;\n\n/**\n * The original target and the default. This WRAPPER must stay byte-identical\n * to what loam has always written — SLASH_COMMANDS (scaffold.ts) derives\n * through it —\n * and an already-initialized repo must still read as fully scaffolded\n * (`skipped` is existsSync, never content). What the wrapper wraps now carries\n * a version stamp, which is the one thing about a generated file loam will\n * report on; see `stubbed`.\n *\n * It stands outside the registry object because SLASH_COMMANDS reaches for it\n * by name. That lookup was `AGENT_TOOLS[\"claude\"]!.format!` — two assertions on\n * an exported const evaluated at import time, so renaming the key, or letting\n * this entry lose `format` the way `codex` legitimately has, would have thrown\n * a TypeError while the CLI entry point was still being loaded: before\n * `program.exitOverride()` exists, and therefore with no envelope around it.\n * Named and typed, both mistakes are typecheck failures instead. The registry\n * still lists it first, and the emitted bytes are unchanged.\n */\nexport const CLAUDE: CommandEmittingTool = {\n path: (name) => [\".claude\", \"commands\", `${name}.md`],\n format: (c) =>\n `---\\ndescription: ${c.description}\\nargument-hint: ${c.argumentHint}\\n---\\n\\n${c.body}`,\n skill: skillsIn(\".claude\"),\n detect: [\".claude\"],\n};\n\nexport const AGENT_TOOLS: Record<string, AgentTool> = {\n claude: CLAUDE,\n // Cursor invokes by flat file name (`/loam-check`); its frontmatter `name`\n // field spells that invocation form.\n cursor: {\n path: (name) => [\".cursor\", \"commands\", `${name}.md`],\n format: (c) => `---\\nname: /${c.name}\\n---\\n\\n${c.body}`,\n skill: skillsIn(\".cursor\"),\n detect: [\".cursor\"],\n },\n // Copilot prompt files: `.prompt.md` extension, description-only frontmatter.\n // Detection cannot use `.github/` — almost every repo has one and almost none\n // of them means Copilot — so it looks for the files Copilot itself reads.\n \"github-copilot\": {\n path: (name) => [\".github\", \"prompts\", `${name}.prompt.md`],\n format: describedMd,\n skill: skillsIn(\".github\"),\n detect: [\n \".github/copilot-instructions.md\",\n \".github/instructions\",\n \".github/prompts\",\n \".github/agents\",\n \".github/skills\",\n \".github/workflows/copilot-setup-steps.yml\",\n \".github/.mcp.json\",\n ],\n },\n // Gemini: TOML, and a namespace DIRECTORY — `.gemini/commands/loam/check.toml`\n // is invoked as `/loam:check`, so the file name drops the `loam-` prefix the\n // flat-named tools carry.\n gemini: {\n path: (name) => [\".gemini\", \"commands\", \"loam\", `${unprefixed(name)}.toml`],\n format: (c) =>\n `description = \"${tomlLine(c.description)}\"\\nprompt = \"\"\"\\n${tomlBlock(c.body)}\"\"\"`,\n skill: skillsIn(\".gemini\"),\n detect: [\".gemini\"],\n },\n opencode: {\n path: (name) => [\".opencode\", \"commands\", `${name}.md`],\n format: describedMd,\n skill: skillsIn(\".opencode\"),\n detect: [\".opencode\"],\n },\n // Cline reads workflows from `.clinerules/` — plain markdown, no frontmatter —\n // but its skills from `.cline/`. The two directories are unrelated, so both\n // count as a sighting.\n cline: {\n path: (name) => [\".clinerules\", \"workflows\", `${name}.md`],\n format: (c) => `# ${c.name}\\n\\n${c.body}`,\n skill: skillsIn(\".cline\"),\n detect: [\".cline\", \".clinerules\"],\n },\n // Amazon Q surfaces these as its PROMPT library, not as commands: the file is\n // invoked `@loam-check`, never `/loam-check`. Same file shape regardless.\n \"amazon-q\": {\n path: (name) => [\".amazonq\", \"prompts\", `${name}.md`],\n format: describedMd,\n skill: skillsIn(\".amazonq\"),\n detect: [\".amazonq\"],\n },\n // Antigravity's directory is `.agent/`, which is why the id and the directory\n // do not match here as they do almost everywhere else.\n antigravity: {\n path: (name) => [\".agent\", \"workflows\", `${name}.md`],\n format: describedMd,\n skill: skillsIn(\".agent\"),\n detect: [\".agent\"],\n },\n // Auggie is the Augment CLI: id `auggie`, directory `.augment/`.\n auggie: {\n path: (name) => [\".augment\", \"commands\", `${name}.md`],\n format: hintedMd,\n skill: skillsIn(\".augment\"),\n detect: [\".augment\"],\n },\n // Skills-only, deliberately: Codex reads `.codex/skills/` and does not load\n // custom command files, so it declares no command emitter at all rather than\n // laying down files nothing will ever open.\n codex: {\n skill: skillsIn(\".codex\"),\n detect: [\".codex\"],\n },\n // Continue's prompt files take a bare `.prompt` extension, and `invokable`\n // is what promotes one from a template to something you can call.\n continue: {\n path: (name) => [\".continue\", \"prompts\", `${name}.prompt`],\n format: (c) =>\n `---\\nname: ${c.name}\\ndescription: ${c.description}\\ninvokable: true\\n---\\n\\n${c.body}`,\n skill: skillsIn(\".continue\"),\n detect: [\".continue\"],\n },\n // Crush namespaces like Gemini does — `.crush/commands/loam/check.md` is\n // `/loam:check` — but stays markdown.\n crush: {\n path: (name) => [\".crush\", \"commands\", \"loam\", `${unprefixed(name)}.md`],\n format: namedMd,\n skill: skillsIn(\".crush\"),\n detect: [\".crush\"],\n },\n // Devin Desktop, formerly Windsurf: Cascade-style workflows, and the rename\n // moved the directory from `.windsurf/` to `.devin/`. New files go to the new\n // directory; a repo still holding the old one is still a Devin repo, so both\n // are sightings.\n devin: {\n path: (name) => [\".devin\", \"workflows\", `${name}.md`],\n format: namedMd,\n skill: skillsIn(\".devin\"),\n detect: [\".devin\", \".windsurf\"],\n },\n factory: {\n path: (name) => [\".factory\", \"commands\", `${name}.md`],\n format: hintedMd,\n skill: skillsIn(\".factory\"),\n detect: [\".factory\"],\n },\n junie: {\n path: (name) => [\".junie\", \"commands\", `${name}.md`],\n format: describedMd,\n skill: skillsIn(\".junie\"),\n detect: [\".junie\"],\n },\n // Kilo Code workflows carry no frontmatter — the title line is all the\n // wrapper there is.\n kilocode: {\n path: (name) => [\".kilocode\", \"workflows\", `${name}.md`],\n format: titledMd,\n skill: skillsIn(\".kilocode\"),\n detect: [\".kilocode\"],\n },\n // Kiro uses Copilot's `.prompt.md` extension under its own directory.\n kiro: {\n path: (name) => [\".kiro\", \"prompts\", `${name}.prompt.md`],\n format: describedMd,\n skill: skillsIn(\".kiro\"),\n detect: [\".kiro\"],\n },\n // Qwen Code retired its TOML commands in favour of markdown + frontmatter,\n // so this is markdown despite the Gemini lineage.\n qwen: {\n path: (name) => [\".qwen\", \"commands\", `${name}.md`],\n format: describedMd,\n skill: skillsIn(\".qwen\"),\n detect: [\".qwen\"],\n },\n // Roo/Zoo Code: id `roocode`, directory `.roo/`, no frontmatter.\n roocode: {\n path: (name) => [\".roo\", \"commands\", `${name}.md`],\n format: titledMd,\n skill: skillsIn(\".roo\"),\n detect: [\".roo\"],\n },\n trae: {\n path: (name) => [\".trae\", \"commands\", `${name}.md`],\n format: namedMd,\n skill: skillsIn(\".trae\"),\n detect: [\".trae\"],\n },\n // The vendor-neutral skills root, and the only id here that names no vendor.\n // `.agents/skills/<name>/SKILL.md` is read by six of the tools that already\n // have entries above, each documenting it in its own words:\n //\n // Cursor — \"Skills are automatically loaded from `.agents/skills/`,\n // `.cursor/skills/`, `~/.agents/skills/` … and `~/.cursor/skills/`\"\n // (Agent Skills, cursor.com/docs/skills).\n // GitHub Copilot — \"For project skills, specific to a single repository,\n // create a `.github/skills`, `.claude/skills`, or `.agents/skills`\n // directory in your repository\" (Adding agent skills for GitHub Copilot,\n // docs.github.com/en/copilot → customize-cloud-agent/add-skills).\n // Codex — \"Codex scans `.agents/skills` in every directory from your\n // current working directory up to the repository root\" (Build skills,\n // developers.openai.com/codex/skills).\n // Gemini CLI — `.agents/skills/` is the workspace-tier alias for\n // `.gemini/skills/`, and \"within the same tier … takes precedence over\n // the `.gemini/skills/` directory\" (docs/cli/skills.md in\n // google-gemini/gemini-cli).\n // Zed — \"Skills are loaded from `~/.agents/skills/` and\n // `<worktree>/.agents/skills/` only\" (Agent Skills, zed.dev/docs/ai/skills).\n // Roo Code — `.agents/skills/` is its cross-agent project location, ranked\n // below `.roo/skills/` at the same level (Skills,\n // docs.roocode.com/features/skills).\n //\n // Skills only, for the reason spelled out on `codex`: not one of those six\n // documents a COMMAND file under this root, so a `.agents/commands/` would be\n // files nothing will ever open — the thing this entry exists to stop.\n //\n // Purely ADDITIVE, and that is the design rather than an implementation\n // detail. No tool above loses or re-points its own skill path: a repo already\n // carrying `.claude/skills/` keeps getting them there. This entry is for the\n // team that would rather have ONE copy those six read than six copies of the\n // same bytes, and choosing that is the user's call — which is why selecting\n // `agents` adds a target and never removes one.\n //\n // `detect` is `.agents/skills`, never a bare `.agents/`, for exactly\n // `github-copilot`'s reason. `.agents/` is a shared root that other\n // conventions also write into, so a bare marker would auto-scaffold into any\n // repository where something else had made the directory — the failure that\n // rules out `.github/` one entry up. It is also NOT `antigravity`'s\n // `.agent/`: one letter apart, unrelated conventions, and `existsSync` on\n // either says nothing about the other.\n agents: {\n skill: skillsIn(\".agents\"),\n detect: [\".agents/skills\"],\n },\n};\n"]}
|