@paths.design/caws-cli 10.2.0 → 11.1.0
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/README.md +125 -374
- package/dist/index.js +45 -787
- package/dist/init/harness-detect.d.ts +18 -0
- package/dist/init/harness-detect.d.ts.map +1 -0
- package/dist/init/harness-detect.js +90 -0
- package/dist/init/harness-detect.js.map +1 -0
- package/dist/init/hook-install.d.ts +53 -0
- package/dist/init/hook-install.d.ts.map +1 -0
- package/dist/init/hook-install.js +421 -0
- package/dist/init/hook-install.js.map +1 -0
- package/dist/init/hook-packs/manifest-claude-code.d.ts +4 -0
- package/dist/init/hook-packs/manifest-claude-code.d.ts.map +1 -0
- package/dist/init/hook-packs/manifest-claude-code.js +190 -0
- package/dist/init/hook-packs/manifest-claude-code.js.map +1 -0
- package/dist/init/hook-packs/register.d.ts +19 -0
- package/dist/init/hook-packs/register.d.ts.map +1 -0
- package/dist/init/hook-packs/register.js +37 -0
- package/dist/init/hook-packs/register.js.map +1 -0
- package/dist/init/hook-packs/types.d.ts +123 -0
- package/dist/init/hook-packs/types.d.ts.map +1 -0
- package/dist/init/hook-packs/types.js +29 -0
- package/dist/init/hook-packs/types.js.map +1 -0
- package/dist/shell/binding/resolve-binding.d.ts +4 -0
- package/dist/shell/binding/resolve-binding.d.ts.map +1 -0
- package/dist/shell/binding/resolve-binding.js +228 -0
- package/dist/shell/binding/resolve-binding.js.map +1 -0
- package/dist/shell/binding/types.d.ts +42 -0
- package/dist/shell/binding/types.d.ts.map +1 -0
- package/dist/shell/binding/types.js +21 -0
- package/dist/shell/binding/types.js.map +1 -0
- package/dist/shell/commands/claim.d.ts +14 -0
- package/dist/shell/commands/claim.d.ts.map +1 -0
- package/dist/shell/commands/claim.js +197 -0
- package/dist/shell/commands/claim.js.map +1 -0
- package/dist/shell/commands/doctor.d.ts +13 -0
- package/dist/shell/commands/doctor.d.ts.map +1 -0
- package/dist/shell/commands/doctor.js +97 -0
- package/dist/shell/commands/doctor.js.map +1 -0
- package/dist/shell/commands/evidence.d.ts +28 -0
- package/dist/shell/commands/evidence.d.ts.map +1 -0
- package/dist/shell/commands/evidence.js +166 -0
- package/dist/shell/commands/evidence.js.map +1 -0
- package/dist/shell/commands/gates.d.ts +19 -0
- package/dist/shell/commands/gates.d.ts.map +1 -0
- package/dist/shell/commands/gates.js +208 -0
- package/dist/shell/commands/gates.js.map +1 -0
- package/dist/shell/commands/init.d.ts +17 -0
- package/dist/shell/commands/init.d.ts.map +1 -0
- package/dist/shell/commands/init.js +168 -0
- package/dist/shell/commands/init.js.map +1 -0
- package/dist/shell/commands/scope.d.ts +11 -0
- package/dist/shell/commands/scope.d.ts.map +1 -0
- package/dist/shell/commands/scope.js +92 -0
- package/dist/shell/commands/scope.js.map +1 -0
- package/dist/shell/commands/specs.d.ts +41 -0
- package/dist/shell/commands/specs.d.ts.map +1 -0
- package/dist/shell/commands/specs.js +264 -0
- package/dist/shell/commands/specs.js.map +1 -0
- package/dist/shell/commands/status.d.ts +15 -0
- package/dist/shell/commands/status.d.ts.map +1 -0
- package/dist/shell/commands/status.js +106 -0
- package/dist/shell/commands/status.js.map +1 -0
- package/dist/shell/commands/waiver.d.ts +38 -0
- package/dist/shell/commands/waiver.d.ts.map +1 -0
- package/dist/shell/commands/waiver.js +240 -0
- package/dist/shell/commands/waiver.js.map +1 -0
- package/dist/shell/commands/worktree.d.ts +38 -0
- package/dist/shell/commands/worktree.d.ts.map +1 -0
- package/dist/shell/commands/worktree.js +286 -0
- package/dist/shell/commands/worktree.js.map +1 -0
- package/dist/shell/gates/disposition.d.ts +23 -0
- package/dist/shell/gates/disposition.d.ts.map +1 -0
- package/dist/shell/gates/disposition.js +117 -0
- package/dist/shell/gates/disposition.js.map +1 -0
- package/dist/shell/gates/gate-result-contract.d.ts +39 -0
- package/dist/shell/gates/gate-result-contract.d.ts.map +1 -0
- package/dist/shell/gates/gate-result-contract.js +150 -0
- package/dist/shell/gates/gate-result-contract.js.map +1 -0
- package/dist/shell/gates/local-evaluators/budget-limit.d.ts +24 -0
- package/dist/shell/gates/local-evaluators/budget-limit.d.ts.map +1 -0
- package/dist/shell/gates/local-evaluators/budget-limit.js +67 -0
- package/dist/shell/gates/local-evaluators/budget-limit.js.map +1 -0
- package/dist/shell/gates/local-evaluators/diff-helpers.d.ts +25 -0
- package/dist/shell/gates/local-evaluators/diff-helpers.d.ts.map +1 -0
- package/dist/shell/gates/local-evaluators/diff-helpers.js +74 -0
- package/dist/shell/gates/local-evaluators/diff-helpers.js.map +1 -0
- package/dist/shell/gates/local-evaluators/index.d.ts +28 -0
- package/dist/shell/gates/local-evaluators/index.d.ts.map +1 -0
- package/dist/shell/gates/local-evaluators/index.js +67 -0
- package/dist/shell/gates/local-evaluators/index.js.map +1 -0
- package/dist/shell/gates/local-evaluators/scope-boundary.d.ts +23 -0
- package/dist/shell/gates/local-evaluators/scope-boundary.d.ts.map +1 -0
- package/dist/shell/gates/local-evaluators/scope-boundary.js +67 -0
- package/dist/shell/gates/local-evaluators/scope-boundary.js.map +1 -0
- package/dist/shell/gates/local-evaluators/spec-completeness.d.ts +12 -0
- package/dist/shell/gates/local-evaluators/spec-completeness.d.ts.map +1 -0
- package/dist/shell/gates/local-evaluators/spec-completeness.js +73 -0
- package/dist/shell/gates/local-evaluators/spec-completeness.js.map +1 -0
- package/dist/shell/gates/quality-gates-adapter.d.ts +55 -0
- package/dist/shell/gates/quality-gates-adapter.d.ts.map +1 -0
- package/dist/shell/gates/quality-gates-adapter.js +161 -0
- package/dist/shell/gates/quality-gates-adapter.js.map +1 -0
- package/dist/shell/gates/waiver-filter.d.ts +58 -0
- package/dist/shell/gates/waiver-filter.d.ts.map +1 -0
- package/dist/shell/gates/waiver-filter.js +119 -0
- package/dist/shell/gates/waiver-filter.js.map +1 -0
- package/dist/shell/index.d.ts +54 -0
- package/dist/shell/index.d.ts.map +1 -0
- package/dist/shell/index.js +85 -0
- package/dist/shell/index.js.map +1 -0
- package/dist/shell/register.d.ts +11 -0
- package/dist/shell/register.d.ts.map +1 -0
- package/dist/shell/register.js +464 -0
- package/dist/shell/register.js.map +1 -0
- package/dist/shell/render/claim.d.ts +22 -0
- package/dist/shell/render/claim.d.ts.map +1 -0
- package/dist/shell/render/claim.js +75 -0
- package/dist/shell/render/claim.js.map +1 -0
- package/dist/shell/render/decision.d.ts +15 -0
- package/dist/shell/render/decision.d.ts.map +1 -0
- package/dist/shell/render/decision.js +66 -0
- package/dist/shell/render/decision.js.map +1 -0
- package/dist/shell/render/diagnostic.d.ts +19 -0
- package/dist/shell/render/diagnostic.d.ts.map +1 -0
- package/dist/shell/render/diagnostic.js +76 -0
- package/dist/shell/render/diagnostic.js.map +1 -0
- package/dist/shell/render/finding.d.ts +15 -0
- package/dist/shell/render/finding.d.ts.map +1 -0
- package/dist/shell/render/finding.js +57 -0
- package/dist/shell/render/finding.js.map +1 -0
- package/dist/shell/render/gates.d.ts +3 -0
- package/dist/shell/render/gates.d.ts.map +1 -0
- package/dist/shell/render/gates.js +56 -0
- package/dist/shell/render/gates.js.map +1 -0
- package/dist/shell/render/init-hook-pack.d.ts +16 -0
- package/dist/shell/render/init-hook-pack.d.ts.map +1 -0
- package/dist/shell/render/init-hook-pack.js +206 -0
- package/dist/shell/render/init-hook-pack.js.map +1 -0
- package/dist/shell/render/init.d.ts +11 -0
- package/dist/shell/render/init.d.ts.map +1 -0
- package/dist/shell/render/init.js +32 -0
- package/dist/shell/render/init.js.map +1 -0
- package/dist/shell/render/status.d.ts +26 -0
- package/dist/shell/render/status.d.ts.map +1 -0
- package/dist/shell/render/status.js +143 -0
- package/dist/shell/render/status.js.map +1 -0
- package/dist/shell/render/waiver.d.ts +21 -0
- package/dist/shell/render/waiver.d.ts.map +1 -0
- package/dist/shell/render/waiver.js +94 -0
- package/dist/shell/render/waiver.js.map +1 -0
- package/dist/shell/rules.d.ts +37 -0
- package/dist/shell/rules.d.ts.map +1 -0
- package/dist/shell/rules.js +51 -0
- package/dist/shell/rules.js.map +1 -0
- package/dist/shell/session/actor.d.ts +14 -0
- package/dist/shell/session/actor.d.ts.map +1 -0
- package/dist/shell/session/actor.js +34 -0
- package/dist/shell/session/actor.js.map +1 -0
- package/dist/shell/session/resolve-session.d.ts +5 -0
- package/dist/shell/session/resolve-session.d.ts.map +1 -0
- package/dist/shell/session/resolve-session.js +239 -0
- package/dist/shell/session/resolve-session.js.map +1 -0
- package/dist/shell/session/types.d.ts +56 -0
- package/dist/shell/session/types.d.ts.map +1 -0
- package/dist/shell/session/types.js +15 -0
- package/dist/shell/session/types.js.map +1 -0
- package/dist/store/agents-store.d.ts +3 -0
- package/dist/store/agents-store.d.ts.map +1 -0
- package/dist/store/agents-store.js +63 -0
- package/dist/store/agents-store.js.map +1 -0
- package/dist/store/apply-patch.d.ts +16 -0
- package/dist/store/apply-patch.d.ts.map +1 -0
- package/dist/store/apply-patch.js +191 -0
- package/dist/store/apply-patch.js.map +1 -0
- package/dist/store/atomic-write.d.ts +34 -0
- package/dist/store/atomic-write.d.ts.map +1 -0
- package/dist/store/atomic-write.js +174 -0
- package/dist/store/atomic-write.js.map +1 -0
- package/dist/store/doctor-snapshot.d.ts +20 -0
- package/dist/store/doctor-snapshot.d.ts.map +1 -0
- package/dist/store/doctor-snapshot.js +176 -0
- package/dist/store/doctor-snapshot.js.map +1 -0
- package/dist/store/events-store.d.ts +33 -0
- package/dist/store/events-store.d.ts.map +1 -0
- package/dist/store/events-store.js +297 -0
- package/dist/store/events-store.js.map +1 -0
- package/dist/store/index.d.ts +21 -0
- package/dist/store/index.d.ts.map +1 -0
- package/dist/store/index.js +47 -0
- package/dist/store/index.js.map +1 -0
- package/dist/store/init-store.d.ts +21 -0
- package/dist/store/init-store.d.ts.map +1 -0
- package/dist/store/init-store.js +295 -0
- package/dist/store/init-store.js.map +1 -0
- package/dist/store/json-store.d.ts +3 -0
- package/dist/store/json-store.d.ts.map +1 -0
- package/dist/store/json-store.js +65 -0
- package/dist/store/json-store.js.map +1 -0
- package/dist/store/lifecycle-lock.d.ts +34 -0
- package/dist/store/lifecycle-lock.d.ts.map +1 -0
- package/dist/store/lifecycle-lock.js +168 -0
- package/dist/store/lifecycle-lock.js.map +1 -0
- package/dist/store/lifecycle-transaction.d.ts +79 -0
- package/dist/store/lifecycle-transaction.d.ts.map +1 -0
- package/dist/store/lifecycle-transaction.js +319 -0
- package/dist/store/lifecycle-transaction.js.map +1 -0
- package/dist/store/policy-store.d.ts +3 -0
- package/dist/store/policy-store.d.ts.map +1 -0
- package/dist/store/policy-store.js +65 -0
- package/dist/store/policy-store.js.map +1 -0
- package/dist/store/repo-root.d.ts +46 -0
- package/dist/store/repo-root.d.ts.map +1 -0
- package/dist/store/repo-root.js +145 -0
- package/dist/store/repo-root.js.map +1 -0
- package/dist/store/rules.d.ts +69 -0
- package/dist/store/rules.d.ts.map +1 -0
- package/dist/store/rules.js +95 -0
- package/dist/store/rules.js.map +1 -0
- package/dist/store/specs-store.d.ts +3 -0
- package/dist/store/specs-store.d.ts.map +1 -0
- package/dist/store/specs-store.js +131 -0
- package/dist/store/specs-store.js.map +1 -0
- package/dist/store/specs-writer.d.ts +61 -0
- package/dist/store/specs-writer.d.ts.map +1 -0
- package/dist/store/specs-writer.js +506 -0
- package/dist/store/specs-writer.js.map +1 -0
- package/dist/store/types.d.ts +84 -0
- package/dist/store/types.d.ts.map +1 -0
- package/dist/store/types.js +14 -0
- package/dist/store/types.js.map +1 -0
- package/dist/store/waivers-store.d.ts +25 -0
- package/dist/store/waivers-store.d.ts.map +1 -0
- package/dist/store/waivers-store.js +232 -0
- package/dist/store/waivers-store.js.map +1 -0
- package/dist/store/worktrees-store.d.ts +3 -0
- package/dist/store/worktrees-store.d.ts.map +1 -0
- package/dist/store/worktrees-store.js +62 -0
- package/dist/store/worktrees-store.js.map +1 -0
- package/dist/store/worktrees-writer.d.ts +77 -0
- package/dist/store/worktrees-writer.d.ts.map +1 -0
- package/dist/store/worktrees-writer.js +674 -0
- package/dist/store/worktrees-writer.js.map +1 -0
- package/dist/store/yaml-patch.d.ts +7 -0
- package/dist/store/yaml-patch.d.ts.map +1 -0
- package/dist/store/yaml-patch.js +250 -0
- package/dist/store/yaml-patch.js.map +1 -0
- package/dist/store/yaml-store.d.ts +9 -0
- package/dist/store/yaml-store.d.ts.map +1 -0
- package/dist/store/yaml-store.js +121 -0
- package/dist/store/yaml-store.js.map +1 -0
- package/package.json +15 -13
- package/dist/budget-derivation.js +0 -751
- package/dist/cicd-optimizer.js +0 -504
- package/dist/commands/agents.js +0 -124
- package/dist/commands/archive.js +0 -500
- package/dist/commands/burnup.js +0 -198
- package/dist/commands/diagnose.js +0 -525
- package/dist/commands/evaluate.js +0 -314
- package/dist/commands/gates.js +0 -149
- package/dist/commands/init.js +0 -857
- package/dist/commands/iterate.js +0 -417
- package/dist/commands/mode.js +0 -269
- package/dist/commands/parallel.js +0 -242
- package/dist/commands/plan.js +0 -438
- package/dist/commands/provenance.js +0 -1143
- package/dist/commands/quality-monitor.js +0 -284
- package/dist/commands/scope.js +0 -264
- package/dist/commands/session.js +0 -312
- package/dist/commands/sidecar.js +0 -74
- package/dist/commands/specs.js +0 -1656
- package/dist/commands/status.js +0 -1172
- package/dist/commands/templates.js +0 -237
- package/dist/commands/tool.js +0 -136
- package/dist/commands/tutorial.js +0 -480
- package/dist/commands/validate.js +0 -357
- package/dist/commands/verify-acs.js +0 -443
- package/dist/commands/waivers.js +0 -599
- package/dist/commands/workflow.js +0 -243
- package/dist/commands/worktree.js +0 -502
- package/dist/config/lite-scope.js +0 -158
- package/dist/config/modes.js +0 -347
- package/dist/constants/spec-types.js +0 -65
- package/dist/gates/budget-limit.js +0 -121
- package/dist/gates/feedback.js +0 -260
- package/dist/gates/format.js +0 -179
- package/dist/gates/god-object.js +0 -117
- package/dist/gates/pipeline.js +0 -167
- package/dist/gates/scope-boundary.js +0 -112
- package/dist/gates/spec-completeness.js +0 -109
- package/dist/gates/todo-detection.js +0 -205
- package/dist/generators/jest-config-generator.js +0 -242
- package/dist/generators/working-spec.js +0 -237
- package/dist/minimal-cli.js +0 -88
- package/dist/parallel/parallel-manager.js +0 -433
- package/dist/policy/PolicyManager.js +0 -470
- package/dist/scaffold/claude-hooks.js +0 -443
- package/dist/scaffold/cursor-hooks.js +0 -177
- package/dist/scaffold/git-hooks.js +0 -928
- package/dist/scaffold/index.js +0 -794
- package/dist/session/session-manager.js +0 -653
- package/dist/sidecars/index.js +0 -33
- package/dist/sidecars/listeners.js +0 -40
- package/dist/sidecars/provenance-summary.js +0 -238
- package/dist/sidecars/quality-gaps.js +0 -258
- package/dist/sidecars/schema.js +0 -149
- package/dist/sidecars/spec-drift.js +0 -151
- package/dist/sidecars/waiver-draft.js +0 -176
- package/dist/spec/SpecFileManager.js +0 -419
- package/dist/templates/.caws/schemas/policy.schema.json +0 -117
- package/dist/templates/.caws/schemas/scope.schema.json +0 -52
- package/dist/templates/.caws/schemas/waivers.schema.json +0 -106
- package/dist/templates/.caws/schemas/working-spec.schema.json +0 -340
- package/dist/templates/.caws/schemas/worktrees.schema.json +0 -38
- package/dist/templates/.caws/templates/working-spec.template.yml +0 -80
- package/dist/templates/.caws/tools/README.md +0 -18
- package/dist/templates/.caws/tools/scope-guard.js +0 -203
- package/dist/templates/.caws/tools-allow.json +0 -331
- package/dist/templates/.caws/waivers.yml +0 -19
- package/dist/templates/.claude/README.md +0 -190
- package/dist/templates/.claude/hooks/audit.sh +0 -121
- package/dist/templates/.claude/hooks/block-dangerous.sh +0 -203
- package/dist/templates/.claude/hooks/classify_command.py +0 -592
- package/dist/templates/.claude/hooks/doc-frontmatter-check.sh +0 -173
- package/dist/templates/.claude/hooks/lite-sprawl-check.sh +0 -145
- package/dist/templates/.claude/hooks/naming-check.sh +0 -100
- package/dist/templates/.claude/hooks/protected-paths.sh +0 -39
- package/dist/templates/.claude/hooks/quality-check.sh +0 -81
- package/dist/templates/.claude/hooks/scan-secrets.sh +0 -85
- package/dist/templates/.claude/hooks/scope-guard.sh +0 -381
- package/dist/templates/.claude/hooks/session-caws-status.sh +0 -117
- package/dist/templates/.claude/hooks/session-log.sh +0 -634
- package/dist/templates/.claude/hooks/simplification-guard.sh +0 -92
- package/dist/templates/.claude/hooks/stop-worktree-check.sh +0 -46
- package/dist/templates/.claude/hooks/test_classify_command.py +0 -370
- package/dist/templates/.claude/hooks/test_wrapper_smoke.sh +0 -96
- package/dist/templates/.claude/hooks/validate-spec.sh +0 -76
- package/dist/templates/.claude/hooks/worktree-guard.sh +0 -220
- package/dist/templates/.claude/hooks/worktree-write-guard.sh +0 -190
- package/dist/templates/.claude/rules/git-safety.md +0 -26
- package/dist/templates/.claude/rules/worktree-isolation.md +0 -101
- package/dist/templates/.claude/settings.json +0 -141
- package/dist/templates/.cursor/README.md +0 -299
- package/dist/templates/.cursor/hooks/audit.sh +0 -55
- package/dist/templates/.cursor/hooks/block-dangerous.sh +0 -84
- package/dist/templates/.cursor/hooks/caws-quality-check.sh +0 -52
- package/dist/templates/.cursor/hooks/caws-scope-guard.sh +0 -130
- package/dist/templates/.cursor/hooks/format.sh +0 -38
- package/dist/templates/.cursor/hooks/naming-check.sh +0 -64
- package/dist/templates/.cursor/hooks/scan-secrets.sh +0 -51
- package/dist/templates/.cursor/hooks/scope-guard.sh +0 -52
- package/dist/templates/.cursor/hooks/session-log.sh +0 -924
- package/dist/templates/.cursor/hooks/validate-spec.sh +0 -83
- package/dist/templates/.cursor/hooks.json +0 -76
- package/dist/templates/.cursor/rules/00-claims-verification.mdc +0 -144
- package/dist/templates/.cursor/rules/01-working-style.mdc +0 -50
- package/dist/templates/.cursor/rules/02-quality-gates.mdc +0 -368
- package/dist/templates/.cursor/rules/03-naming-and-refactor.mdc +0 -33
- package/dist/templates/.cursor/rules/04-logging-language-style.mdc +0 -23
- package/dist/templates/.cursor/rules/05-safe-defaults-guards.mdc +0 -23
- package/dist/templates/.cursor/rules/06-typescript-conventions.mdc +0 -36
- package/dist/templates/.cursor/rules/07-process-ops.mdc +0 -20
- package/dist/templates/.cursor/rules/08-solid-and-architecture.mdc +0 -16
- package/dist/templates/.cursor/rules/09-docstrings.mdc +0 -89
- package/dist/templates/.cursor/rules/10-documentation-quality-standards.mdc +0 -385
- package/dist/templates/.cursor/rules/11-scope-management-waivers.mdc +0 -381
- package/dist/templates/.cursor/rules/12-implementation-completeness.mdc +0 -516
- package/dist/templates/.cursor/rules/13-language-agnostic-standards.mdc +0 -578
- package/dist/templates/.cursor/rules/README.md +0 -148
- package/dist/templates/.github/copilot-instructions.md +0 -82
- package/dist/templates/.idea/runConfigurations/CAWS_Evaluate.xml +0 -5
- package/dist/templates/.idea/runConfigurations/CAWS_Validate.xml +0 -5
- package/dist/templates/.junie/guidelines.md +0 -73
- package/dist/templates/.vscode/launch.json +0 -17
- package/dist/templates/.vscode/settings.json +0 -95
- package/dist/templates/.windsurf/rules/caws-quality-standards.md +0 -54
- package/dist/templates/.windsurf/workflows/caws-guided-development.md +0 -92
- package/dist/templates/CLAUDE.md +0 -196
- package/dist/templates/COMMIT_CONVENTIONS.md +0 -86
- package/dist/templates/OIDC_SETUP.md +0 -300
- package/dist/templates/agents.md +0 -171
- package/dist/templates/codemod/README.md +0 -1
- package/dist/templates/codemod/test.js +0 -93
- package/dist/templates/docs/README.md +0 -151
- package/dist/templates/scripts/new_feature.sh +0 -80
- package/dist/templates/scripts/quality-gates/check-god-objects.js +0 -146
- package/dist/templates/scripts/quality-gates/run-quality-gates.js +0 -50
- package/dist/templates/scripts/v3/analysis/todo_analyzer.py +0 -1997
- package/dist/test-analysis.js +0 -786
- package/dist/tool-interface.js +0 -314
- package/dist/tool-loader.js +0 -303
- package/dist/tool-validator.js +0 -393
- package/dist/utils/agent-display.js +0 -210
- package/dist/utils/agent-session.js +0 -344
- package/dist/utils/async-utils.js +0 -188
- package/dist/utils/command-wrapper.js +0 -200
- package/dist/utils/event-log.js +0 -584
- package/dist/utils/event-renderer.js +0 -521
- package/dist/utils/finalization.js +0 -230
- package/dist/utils/git-lock.js +0 -119
- package/dist/utils/gitignore-updater.js +0 -158
- package/dist/utils/ide-detection.js +0 -133
- package/dist/utils/lifecycle-events.js +0 -94
- package/dist/utils/project-analysis.js +0 -367
- package/dist/utils/promise-utils.js +0 -72
- package/dist/utils/quality-gates-errors.js +0 -520
- package/dist/utils/quality-gates-utils.js +0 -387
- package/dist/utils/schema-validator.js +0 -50
- package/dist/utils/spec-resolver.js +0 -711
- package/dist/utils/typescript-detector.js +0 -369
- package/dist/utils/working-state.js +0 -530
- package/dist/utils/yaml-validation.js +0 -156
- package/dist/validation/spec-validation.js +0 -924
- package/dist/waivers-manager.js +0 -732
- package/dist/worktree/worktree-manager.js +0 -1735
- package/templates/.caws/schemas/policy.schema.json +0 -117
- package/templates/.caws/schemas/scope.schema.json +0 -52
- package/templates/.caws/schemas/waivers.schema.json +0 -106
- package/templates/.caws/schemas/working-spec.schema.json +0 -340
- package/templates/.caws/schemas/worktrees.schema.json +0 -38
- package/templates/.caws/templates/working-spec.template.yml +0 -80
- package/templates/.caws/tools/README.md +0 -18
- package/templates/.caws/tools/scope-guard.js +0 -203
- package/templates/.caws/tools-allow.json +0 -331
- package/templates/.caws/waivers.yml +0 -19
- package/templates/.claude/README.md +0 -190
- package/templates/.claude/hooks/audit.sh +0 -121
- package/templates/.claude/hooks/block-dangerous.sh +0 -203
- package/templates/.claude/hooks/classify_command.py +0 -592
- package/templates/.claude/hooks/doc-frontmatter-check.sh +0 -173
- package/templates/.claude/hooks/lite-sprawl-check.sh +0 -145
- package/templates/.claude/hooks/naming-check.sh +0 -100
- package/templates/.claude/hooks/protected-paths.sh +0 -39
- package/templates/.claude/hooks/quality-check.sh +0 -81
- package/templates/.claude/hooks/scan-secrets.sh +0 -85
- package/templates/.claude/hooks/scope-guard.sh +0 -381
- package/templates/.claude/hooks/session-caws-status.sh +0 -117
- package/templates/.claude/hooks/session-log.sh +0 -634
- package/templates/.claude/hooks/simplification-guard.sh +0 -92
- package/templates/.claude/hooks/stop-worktree-check.sh +0 -46
- package/templates/.claude/hooks/test_classify_command.py +0 -370
- package/templates/.claude/hooks/test_wrapper_smoke.sh +0 -96
- package/templates/.claude/hooks/validate-spec.sh +0 -76
- package/templates/.claude/hooks/worktree-guard.sh +0 -220
- package/templates/.claude/hooks/worktree-write-guard.sh +0 -190
- package/templates/.claude/rules/git-safety.md +0 -26
- package/templates/.claude/rules/worktree-isolation.md +0 -101
- package/templates/.claude/settings.json +0 -141
- package/templates/.cursor/README.md +0 -299
- package/templates/.cursor/hooks/audit.sh +0 -55
- package/templates/.cursor/hooks/block-dangerous.sh +0 -84
- package/templates/.cursor/hooks/caws-quality-check.sh +0 -52
- package/templates/.cursor/hooks/caws-scope-guard.sh +0 -130
- package/templates/.cursor/hooks/format.sh +0 -38
- package/templates/.cursor/hooks/naming-check.sh +0 -64
- package/templates/.cursor/hooks/scan-secrets.sh +0 -51
- package/templates/.cursor/hooks/scope-guard.sh +0 -52
- package/templates/.cursor/hooks/session-log.sh +0 -924
- package/templates/.cursor/hooks/validate-spec.sh +0 -83
- package/templates/.cursor/hooks.json +0 -76
- package/templates/.cursor/rules/00-claims-verification.mdc +0 -144
- package/templates/.cursor/rules/01-working-style.mdc +0 -50
- package/templates/.cursor/rules/02-quality-gates.mdc +0 -368
- package/templates/.cursor/rules/03-naming-and-refactor.mdc +0 -33
- package/templates/.cursor/rules/04-logging-language-style.mdc +0 -23
- package/templates/.cursor/rules/05-safe-defaults-guards.mdc +0 -23
- package/templates/.cursor/rules/06-typescript-conventions.mdc +0 -36
- package/templates/.cursor/rules/07-process-ops.mdc +0 -20
- package/templates/.cursor/rules/08-solid-and-architecture.mdc +0 -16
- package/templates/.cursor/rules/09-docstrings.mdc +0 -89
- package/templates/.cursor/rules/10-documentation-quality-standards.mdc +0 -385
- package/templates/.cursor/rules/11-scope-management-waivers.mdc +0 -381
- package/templates/.cursor/rules/12-implementation-completeness.mdc +0 -516
- package/templates/.cursor/rules/13-language-agnostic-standards.mdc +0 -578
- package/templates/.cursor/rules/README.md +0 -148
- package/templates/.github/copilot-instructions.md +0 -82
- package/templates/.idea/runConfigurations/CAWS_Evaluate.xml +0 -5
- package/templates/.idea/runConfigurations/CAWS_Validate.xml +0 -5
- package/templates/.junie/guidelines.md +0 -73
- package/templates/.vscode/launch.json +0 -17
- package/templates/.vscode/settings.json +0 -95
- package/templates/.windsurf/rules/caws-quality-standards.md +0 -54
- package/templates/.windsurf/workflows/caws-guided-development.md +0 -92
- package/templates/CLAUDE.md +0 -196
- package/templates/COMMIT_CONVENTIONS.md +0 -86
- package/templates/OIDC_SETUP.md +0 -300
- package/templates/agents.md +0 -171
- package/templates/codemod/README.md +0 -1
- package/templates/codemod/test.js +0 -93
- package/templates/docs/README.md +0 -151
- package/templates/scripts/new_feature.sh +0 -80
- package/templates/scripts/quality-gates/check-god-objects.js +0 -146
- package/templates/scripts/quality-gates/run-quality-gates.js +0 -50
- package/templates/scripts/v3/analysis/todo_analyzer.py +0 -1997
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Claude Code hook pack manifest.
|
|
3
|
+
//
|
|
4
|
+
// Installs the v11-shape Claude Code hook plane into a repo. Activation
|
|
5
|
+
// requires a session restart in Claude Code: hook registration is read at
|
|
6
|
+
// session start, so installing mid-session does not affect the current
|
|
7
|
+
// session's tool calls.
|
|
8
|
+
//
|
|
9
|
+
// Lineage entries this pack covers — see
|
|
10
|
+
// packages/caws-cli/docs-status/failure-lineage.md:
|
|
11
|
+
// Entry 1 — git init catastrophic deletion (block-dangerous + classify_command)
|
|
12
|
+
// Entry 4 — worktree cross-contamination, inherited-dirty-state (worktree-guard)
|
|
13
|
+
// Entry 6 — stash-and-destroy (worktree-guard)
|
|
14
|
+
// Entry 8 — scope violations, union-mode interference (scope-guard)
|
|
15
|
+
// Entry 11 — ownership claim, CAWSFIX-31/32 (worktree-guard, session-caws-status)
|
|
16
|
+
// Entry 12 — unbound = no authority (scope-guard fail-closed)
|
|
17
|
+
// Entry 13 — working-spec.yaml baseline clobber (worktree-write-guard)
|
|
18
|
+
// Entry 16 — adjudicator overstep / role partitioning (the pack itself)
|
|
19
|
+
// Entry 17 — git --bare init bypass + danger latch (classify_command + block-dangerous + reset-danger-latch)
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
exports.CLAUDE_CODE_PACK = exports.CLAUDE_CODE_PACK_VERSION = void 0;
|
|
22
|
+
// Pack version bumps when managed file contents change in a way that
|
|
23
|
+
// existing installs should pick up via the managed_old_version → auto-
|
|
24
|
+
// update path. Version 2 ships the strike-level diagnostic triage,
|
|
25
|
+
// activation-banner wording fix, settings.json "why we don't write it"
|
|
26
|
+
// note, and tightened ask/block semantics in block-dangerous.
|
|
27
|
+
exports.CLAUDE_CODE_PACK_VERSION = 2;
|
|
28
|
+
exports.CLAUDE_CODE_PACK = {
|
|
29
|
+
id: 'claude-code',
|
|
30
|
+
targetSurface: 'claude-code',
|
|
31
|
+
packVersion: exports.CLAUDE_CODE_PACK_VERSION,
|
|
32
|
+
cawsMinMajor: 11,
|
|
33
|
+
summary: 'v11-shape Claude Code hook pack: scope, worktree, dangerous-command, ' +
|
|
34
|
+
'and session lifecycle guards.',
|
|
35
|
+
activation: 'restart_required',
|
|
36
|
+
lifecycleEvents: ['pre_bash', 'pre_write', 'pre_edit', 'session_start', 'stop'],
|
|
37
|
+
stateModel: {
|
|
38
|
+
reads: [
|
|
39
|
+
'.caws/specs/*.yaml',
|
|
40
|
+
'.caws/worktrees.json',
|
|
41
|
+
'.caws/agents.json',
|
|
42
|
+
'.caws/policy.yaml',
|
|
43
|
+
'package.json',
|
|
44
|
+
],
|
|
45
|
+
writes: [
|
|
46
|
+
'.claude/logs/audit.log',
|
|
47
|
+
'.claude/logs/session-*.log',
|
|
48
|
+
'.claude/hooks/state/danger-latch-*.json',
|
|
49
|
+
'.claude/hooks/state/guard-strikes-*.json',
|
|
50
|
+
'tmp/<session-id>/',
|
|
51
|
+
],
|
|
52
|
+
},
|
|
53
|
+
lineageRefs: [1, 4, 6, 8, 11, 12, 13, 16, 17],
|
|
54
|
+
// Installed files. Order is deterministic (used by tests and by the
|
|
55
|
+
// install reporter). destPath is relative to repo root.
|
|
56
|
+
// sourcePath is relative to the pack root
|
|
57
|
+
// (packages/caws-cli/templates/hook-packs/claude-code/).
|
|
58
|
+
installedFiles: [
|
|
59
|
+
// -- Scope and worktree guards (v11-shape) --
|
|
60
|
+
{
|
|
61
|
+
destPath: '.claude/hooks/scope-guard.sh',
|
|
62
|
+
sourcePath: 'scope-guard.sh',
|
|
63
|
+
executable: true,
|
|
64
|
+
managed: true,
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
destPath: '.claude/hooks/worktree-guard.sh',
|
|
68
|
+
sourcePath: 'worktree-guard.sh',
|
|
69
|
+
executable: true,
|
|
70
|
+
managed: true,
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
destPath: '.claude/hooks/worktree-write-guard.sh',
|
|
74
|
+
sourcePath: 'worktree-write-guard.sh',
|
|
75
|
+
executable: true,
|
|
76
|
+
managed: true,
|
|
77
|
+
},
|
|
78
|
+
// -- Entry 17 dangerous-command hardening (preserved verbatim) --
|
|
79
|
+
{
|
|
80
|
+
destPath: '.claude/hooks/block-dangerous.sh',
|
|
81
|
+
sourcePath: 'block-dangerous.sh',
|
|
82
|
+
executable: true,
|
|
83
|
+
managed: true,
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
destPath: '.claude/hooks/classify_command.py',
|
|
87
|
+
sourcePath: 'classify_command.py',
|
|
88
|
+
executable: true,
|
|
89
|
+
managed: true,
|
|
90
|
+
},
|
|
91
|
+
// -- Human-authorized escape hatches (preserved) --
|
|
92
|
+
{
|
|
93
|
+
destPath: '.claude/hooks/reset-strikes.sh',
|
|
94
|
+
sourcePath: 'reset-strikes.sh',
|
|
95
|
+
executable: true,
|
|
96
|
+
managed: true,
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
destPath: '.claude/hooks/reset-danger-latch.sh',
|
|
100
|
+
sourcePath: 'reset-danger-latch.sh',
|
|
101
|
+
executable: true,
|
|
102
|
+
managed: true,
|
|
103
|
+
},
|
|
104
|
+
// -- Strike counter shared library (sourced by scope-guard) --
|
|
105
|
+
{
|
|
106
|
+
destPath: '.claude/hooks/guard-strikes.sh',
|
|
107
|
+
sourcePath: 'guard-strikes.sh',
|
|
108
|
+
executable: true,
|
|
109
|
+
managed: true,
|
|
110
|
+
},
|
|
111
|
+
// -- Session lifecycle and logging --
|
|
112
|
+
{
|
|
113
|
+
destPath: '.claude/hooks/session-caws-status.sh',
|
|
114
|
+
sourcePath: 'session-caws-status.sh',
|
|
115
|
+
executable: true,
|
|
116
|
+
managed: true,
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
destPath: '.claude/hooks/session-log.sh',
|
|
120
|
+
sourcePath: 'session-log.sh',
|
|
121
|
+
executable: true,
|
|
122
|
+
managed: true,
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
destPath: '.claude/hooks/audit.sh',
|
|
126
|
+
sourcePath: 'audit.sh',
|
|
127
|
+
executable: true,
|
|
128
|
+
managed: true,
|
|
129
|
+
},
|
|
130
|
+
// -- Shared libraries sourced by every hook script --
|
|
131
|
+
{
|
|
132
|
+
destPath: '.claude/hooks/runtime-paths.sh',
|
|
133
|
+
sourcePath: 'runtime-paths.sh',
|
|
134
|
+
executable: false,
|
|
135
|
+
managed: true,
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
destPath: '.claude/hooks/lib/parse-input.sh',
|
|
139
|
+
sourcePath: 'lib/parse-input.sh',
|
|
140
|
+
executable: false,
|
|
141
|
+
managed: true,
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
destPath: '.claude/hooks/lib/run-handlers.sh',
|
|
145
|
+
sourcePath: 'lib/run-handlers.sh',
|
|
146
|
+
executable: false,
|
|
147
|
+
managed: true,
|
|
148
|
+
},
|
|
149
|
+
// -- Dispatch entrypoints invoked from .claude/settings.json --
|
|
150
|
+
{
|
|
151
|
+
destPath: '.claude/hooks/dispatch/pre_tool_use.sh',
|
|
152
|
+
sourcePath: 'dispatch/pre_tool_use.sh',
|
|
153
|
+
executable: true,
|
|
154
|
+
managed: true,
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
destPath: '.claude/hooks/dispatch/post_tool_use.sh',
|
|
158
|
+
sourcePath: 'dispatch/post_tool_use.sh',
|
|
159
|
+
executable: true,
|
|
160
|
+
managed: true,
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
destPath: '.claude/hooks/dispatch/session_start.sh',
|
|
164
|
+
sourcePath: 'dispatch/session_start.sh',
|
|
165
|
+
executable: true,
|
|
166
|
+
managed: true,
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
destPath: '.claude/hooks/dispatch/stop.sh',
|
|
170
|
+
sourcePath: 'dispatch/stop.sh',
|
|
171
|
+
executable: true,
|
|
172
|
+
managed: true,
|
|
173
|
+
},
|
|
174
|
+
// NOTE: .claude/settings.json is NOT a managed pack file. It often
|
|
175
|
+
// carries user-authored `permissions` and `env` blocks that the pack
|
|
176
|
+
// should not touch. Install emits explicit instructions for the
|
|
177
|
+
// user to wire the four dispatch entrypoints into their existing
|
|
178
|
+
// settings.json (or to create one from the canonical snippet in
|
|
179
|
+
// CLAUDE.md if absent). This avoids JSON-merge complexity and
|
|
180
|
+
// preserves user-owned settings.
|
|
181
|
+
// -- Doctrine landing for hook editors --
|
|
182
|
+
{
|
|
183
|
+
destPath: '.claude/hooks/CLAUDE.md',
|
|
184
|
+
sourcePath: 'CLAUDE.md',
|
|
185
|
+
executable: false,
|
|
186
|
+
managed: true,
|
|
187
|
+
},
|
|
188
|
+
],
|
|
189
|
+
};
|
|
190
|
+
//# sourceMappingURL=manifest-claude-code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest-claude-code.js","sourceRoot":"","sources":["../../../src/init/hook-packs/manifest-claude-code.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { AgentSurface, HookPackV1 } from './types';
|
|
2
|
+
export type PackResolution = {
|
|
3
|
+
readonly kind: 'pack';
|
|
4
|
+
readonly pack: HookPackV1;
|
|
5
|
+
} | {
|
|
6
|
+
readonly kind: 'none';
|
|
7
|
+
} | {
|
|
8
|
+
readonly kind: 'declared_not_implemented';
|
|
9
|
+
readonly surface: Exclude<AgentSurface, 'none'>;
|
|
10
|
+
};
|
|
11
|
+
/** Resolve a requested surface to a pack manifest. */
|
|
12
|
+
export declare function resolveHookPack(surface: AgentSurface): PackResolution;
|
|
13
|
+
/** Full list of surfaces this CLI version recognizes (for help text and
|
|
14
|
+
* validation). */
|
|
15
|
+
export declare const KNOWN_SURFACES: readonly AgentSurface[];
|
|
16
|
+
/** Surfaces that have a fully-implemented pack in this CLI version. */
|
|
17
|
+
export declare const IMPLEMENTED_SURFACES: readonly AgentSurface[];
|
|
18
|
+
export declare function isKnownSurface(value: string): value is AgentSurface;
|
|
19
|
+
//# sourceMappingURL=register.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../../src/init/hook-packs/register.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAGxD,MAAM,MAAM,cAAc,GACtB;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;CAAE,GACpD;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACzB;IACE,QAAQ,CAAC,IAAI,EAAE,0BAA0B,CAAC;IAC1C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;CACjD,CAAC;AAEN,sDAAsD;AACtD,wBAAgB,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,cAAc,CASrE;AAED;mBACmB;AACnB,eAAO,MAAM,cAAc,EAAE,SAAS,YAAY,EAKjD,CAAC;AAEF,uEAAuE;AACvE,eAAO,MAAM,oBAAoB,EAAE,SAAS,YAAY,EAAoB,CAAC;AAE7E,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,YAAY,CAEnE"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Pack registry. Maps `--agent-surface <id>` to a `HookPackV1` manifest.
|
|
3
|
+
//
|
|
4
|
+
// v11.1 ships only the `claude-code` pack. `cursor` and `windsurf` are
|
|
5
|
+
// recognized as values but resolution returns a "declared but not
|
|
6
|
+
// implemented" diagnostic — the abstraction is in place so adding a
|
|
7
|
+
// new pack is purely additive (drop a manifest, register it here).
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.IMPLEMENTED_SURFACES = exports.KNOWN_SURFACES = void 0;
|
|
10
|
+
exports.resolveHookPack = resolveHookPack;
|
|
11
|
+
exports.isKnownSurface = isKnownSurface;
|
|
12
|
+
const manifest_claude_code_1 = require("./manifest-claude-code");
|
|
13
|
+
/** Resolve a requested surface to a pack manifest. */
|
|
14
|
+
function resolveHookPack(surface) {
|
|
15
|
+
if (surface === 'none') {
|
|
16
|
+
return { kind: 'none' };
|
|
17
|
+
}
|
|
18
|
+
if (surface === 'claude-code') {
|
|
19
|
+
return { kind: 'pack', pack: manifest_claude_code_1.CLAUDE_CODE_PACK };
|
|
20
|
+
}
|
|
21
|
+
// cursor / windsurf: recognized but not yet implemented.
|
|
22
|
+
return { kind: 'declared_not_implemented', surface };
|
|
23
|
+
}
|
|
24
|
+
/** Full list of surfaces this CLI version recognizes (for help text and
|
|
25
|
+
* validation). */
|
|
26
|
+
exports.KNOWN_SURFACES = [
|
|
27
|
+
'claude-code',
|
|
28
|
+
'cursor',
|
|
29
|
+
'windsurf',
|
|
30
|
+
'none',
|
|
31
|
+
];
|
|
32
|
+
/** Surfaces that have a fully-implemented pack in this CLI version. */
|
|
33
|
+
exports.IMPLEMENTED_SURFACES = ['claude-code'];
|
|
34
|
+
function isKnownSurface(value) {
|
|
35
|
+
return exports.KNOWN_SURFACES.includes(value);
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=register.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register.js","sourceRoot":"","sources":["../../../src/init/hook-packs/register.ts"],"names":[],"mappings":";AAAA,yEAAyE;AACzE,EAAE;AACF,uEAAuE;AACvE,kEAAkE;AAClE,oEAAoE;AACpE,mEAAmE;;;AAcnE,0CASC;AAcD,wCAEC;AApCD,iEAA0D;AAU1D,sDAAsD;AACtD,SAAgB,eAAe,CAAC,OAAqB;IACnD,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC1B,CAAC;IACD,IAAI,OAAO,KAAK,aAAa,EAAE,CAAC;QAC9B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,uCAAgB,EAAE,CAAC;IAClD,CAAC;IACD,yDAAyD;IACzD,OAAO,EAAE,IAAI,EAAE,0BAA0B,EAAE,OAAO,EAAE,CAAC;AACvD,CAAC;AAED;mBACmB;AACN,QAAA,cAAc,GAA4B;IACrD,aAAa;IACb,QAAQ;IACR,UAAU;IACV,MAAM;CACP,CAAC;AAEF,uEAAuE;AAC1D,QAAA,oBAAoB,GAA4B,CAAC,aAAa,CAAC,CAAC;AAE7E,SAAgB,cAAc,CAAC,KAAa;IAC1C,OAAQ,sBAAoC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC/D,CAAC"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/** Supported agent harnesses. v11.1 implements claude-code only. */
|
|
2
|
+
export type AgentSurface = 'claude-code' | 'cursor' | 'windsurf' | 'none';
|
|
3
|
+
/** Lifecycle interception points a pack may register on a harness. */
|
|
4
|
+
export type LifecycleEvent = 'pre_bash' | 'pre_write' | 'pre_edit' | 'session_start' | 'stop';
|
|
5
|
+
/** A single file the pack installs, relative to the repo root. */
|
|
6
|
+
export interface HookPackFile {
|
|
7
|
+
/** Destination path relative to repo root (e.g., `.claude/hooks/scope-guard.sh`). */
|
|
8
|
+
readonly destPath: string;
|
|
9
|
+
/** Source path within the templates tree, relative to the pack root
|
|
10
|
+
* (e.g., `scope-guard.sh`). */
|
|
11
|
+
readonly sourcePath: string;
|
|
12
|
+
/** When true, the installed file must be executable (chmod +x). */
|
|
13
|
+
readonly executable: boolean;
|
|
14
|
+
/** When true, this file gets a managed header prepended/verified.
|
|
15
|
+
* Set false for non-script auxiliary files where a comment marker
|
|
16
|
+
* is not appropriate (e.g., a state directory placeholder). */
|
|
17
|
+
readonly managed: boolean;
|
|
18
|
+
}
|
|
19
|
+
/** State surfaces the pack reads from / writes to. Informational; used
|
|
20
|
+
* by docs and by future drift detection. */
|
|
21
|
+
export interface HookPackStateModel {
|
|
22
|
+
/** Files/dirs the pack reads (relative to repo root). */
|
|
23
|
+
readonly reads: readonly string[];
|
|
24
|
+
/** Files/dirs the pack writes (relative to repo root). */
|
|
25
|
+
readonly writes: readonly string[];
|
|
26
|
+
}
|
|
27
|
+
/** The pack manifest. */
|
|
28
|
+
export interface HookPackV1 {
|
|
29
|
+
/** Pack identifier, stable across versions (e.g., "claude-code"). */
|
|
30
|
+
readonly id: string;
|
|
31
|
+
/** The harness this pack targets. */
|
|
32
|
+
readonly targetSurface: Exclude<AgentSurface, 'none'>;
|
|
33
|
+
/** Pack version. Bumps when managed file contents change in a way
|
|
34
|
+
* that requires an update on re-install. */
|
|
35
|
+
readonly packVersion: number;
|
|
36
|
+
/** Minimum CAWS major version this pack is compatible with. */
|
|
37
|
+
readonly cawsMinMajor: number;
|
|
38
|
+
/** Lifecycle events this pack registers on the harness. */
|
|
39
|
+
readonly lifecycleEvents: readonly LifecycleEvent[];
|
|
40
|
+
/** Files installed by this pack, in deterministic order. */
|
|
41
|
+
readonly installedFiles: readonly HookPackFile[];
|
|
42
|
+
/** State surfaces (read/write paths). */
|
|
43
|
+
readonly stateModel: HookPackStateModel;
|
|
44
|
+
/** Failure-lineage entry numbers this pack covers. */
|
|
45
|
+
readonly lineageRefs: readonly number[];
|
|
46
|
+
/** Human-readable summary for init output. One short sentence. */
|
|
47
|
+
readonly summary: string;
|
|
48
|
+
/** Activation contract: whether installed hooks take effect in the
|
|
49
|
+
* current harness session, or require a restart. */
|
|
50
|
+
readonly activation: 'immediate' | 'restart_required' | 'unknown';
|
|
51
|
+
}
|
|
52
|
+
/** Managed-file header fields. Used by install for parse/emit. */
|
|
53
|
+
export interface ManagedHeader {
|
|
54
|
+
readonly hookPack: string;
|
|
55
|
+
readonly hookPackVersion: number;
|
|
56
|
+
readonly cawsMinMajor: number;
|
|
57
|
+
readonly lineageRefs: readonly number[];
|
|
58
|
+
}
|
|
59
|
+
/** Outcome of evaluating an installed-file path against the local filesystem
|
|
60
|
+
* during install. */
|
|
61
|
+
export type InstallFileState =
|
|
62
|
+
/** No file at destPath; safe to create. */
|
|
63
|
+
{
|
|
64
|
+
readonly kind: 'absent';
|
|
65
|
+
}
|
|
66
|
+
/** Managed file at destPath matching this pack/version and unchanged
|
|
67
|
+
* from bundled content. Safe to no-op. */
|
|
68
|
+
| {
|
|
69
|
+
readonly kind: 'managed_clean';
|
|
70
|
+
readonly header: ManagedHeader;
|
|
71
|
+
}
|
|
72
|
+
/** Managed file at destPath matching this pack but at an older version.
|
|
73
|
+
* Safe to update under update policy. */
|
|
74
|
+
| {
|
|
75
|
+
readonly kind: 'managed_old_version';
|
|
76
|
+
readonly header: ManagedHeader;
|
|
77
|
+
readonly currentVersion: number;
|
|
78
|
+
}
|
|
79
|
+
/** Managed file at destPath matching this pack/version but content
|
|
80
|
+
* differs from bundled. Refuses without --adopt or --overwrite. */
|
|
81
|
+
| {
|
|
82
|
+
readonly kind: 'managed_drift';
|
|
83
|
+
readonly header: ManagedHeader;
|
|
84
|
+
}
|
|
85
|
+
/** File at destPath without a managed header. Refuses without
|
|
86
|
+
* --adopt or --overwrite. */
|
|
87
|
+
| {
|
|
88
|
+
readonly kind: 'unmanaged_collision';
|
|
89
|
+
};
|
|
90
|
+
/** Aggregate outcome of an install operation. */
|
|
91
|
+
export type HookPackInstallOutcome =
|
|
92
|
+
/** Pack was installed for the first time (or new files added to an
|
|
93
|
+
* existing pack install). */
|
|
94
|
+
'installed'
|
|
95
|
+
/** Pack files all present at correct version and content; no changes. */
|
|
96
|
+
| 'already_installed'
|
|
97
|
+
/** Pack files updated from an older version. */
|
|
98
|
+
| 'updated'
|
|
99
|
+
/** Caller explicitly chose `--agent-surface none`. No pack installed. */
|
|
100
|
+
| 'skipped_explicit_none'
|
|
101
|
+
/** No harness detected, non-interactive mode. No pack installed, warning
|
|
102
|
+
* emitted. */
|
|
103
|
+
| 'skipped_ambiguous';
|
|
104
|
+
/** Per-file install action recorded for reporting. */
|
|
105
|
+
export interface HookPackFileAction {
|
|
106
|
+
readonly destPath: string;
|
|
107
|
+
readonly action: 'created' | 'updated' | 'unchanged' | 'refused';
|
|
108
|
+
/** When action === 'refused', the reason. */
|
|
109
|
+
readonly refusalReason?: 'unmanaged_collision' | 'managed_drift';
|
|
110
|
+
}
|
|
111
|
+
/** Result of installing a pack into a repo. */
|
|
112
|
+
export interface HookPackInstallResult {
|
|
113
|
+
readonly outcome: HookPackInstallOutcome;
|
|
114
|
+
/** The pack that was (or would have been) installed. Null when
|
|
115
|
+
* outcome is 'skipped_explicit_none' or 'skipped_ambiguous'. */
|
|
116
|
+
readonly pack: HookPackV1 | null;
|
|
117
|
+
/** Per-file actions. */
|
|
118
|
+
readonly actions: readonly HookPackFileAction[];
|
|
119
|
+
/** Whether the harness requires a session restart for hooks to take
|
|
120
|
+
* effect. Drives the activation banner. */
|
|
121
|
+
readonly activation: 'immediate' | 'restart_required' | 'unknown' | 'not_applicable';
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/init/hook-packs/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// HookPackV1 — manifest model for harness-specific hook packs installed by
|
|
3
|
+
// `caws init --agent-surface <name>`.
|
|
4
|
+
//
|
|
5
|
+
// A hook pack is the **runtime adapter** that projects CAWS authority into
|
|
6
|
+
// an agent harness's lifecycle (Claude Code, Cursor, Windsurf, etc.).
|
|
7
|
+
// The kernel/store/shell trinity owns canonical state. The pack interposes
|
|
8
|
+
// at pre-Edit/Write/Bash, where the kernel cannot reach (it runs downstream
|
|
9
|
+
// of the agent's tool call).
|
|
10
|
+
//
|
|
11
|
+
// Every file installed by a pack carries a CAWS-MANAGED-HOOK header:
|
|
12
|
+
//
|
|
13
|
+
// # CAWS-MANAGED-HOOK
|
|
14
|
+
// # hook_pack: <id>
|
|
15
|
+
// # hook_pack_version: <pack_version>
|
|
16
|
+
// # caws_min_major: <caws_min_major>
|
|
17
|
+
// # lineage_refs: <comma-separated lineage entry numbers>
|
|
18
|
+
// # do_not_edit_directly: update via `caws init --agent-surface <id>`
|
|
19
|
+
//
|
|
20
|
+
// The marker is what install/update uses to distinguish managed files
|
|
21
|
+
// (safe to rewrite under explicit policy) from local user files (refused
|
|
22
|
+
// without --adopt/--overwrite).
|
|
23
|
+
//
|
|
24
|
+
// Lineage: every pack must declare which failure-lineage entries it covers
|
|
25
|
+
// (packages/caws-cli/docs-status/failure-lineage.md). Removing or weakening
|
|
26
|
+
// a pack file requires naming the entry and identifying the replacement
|
|
27
|
+
// mechanism.
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/init/hook-packs/types.ts"],"names":[],"mappings":";AAAA,2EAA2E;AAC3E,sCAAsC;AACtC,EAAE;AACF,2EAA2E;AAC3E,sEAAsE;AACtE,2EAA2E;AAC3E,4EAA4E;AAC5E,6BAA6B;AAC7B,EAAE;AACF,qEAAqE;AACrE,EAAE;AACF,wBAAwB;AACxB,sBAAsB;AACtB,wCAAwC;AACxC,uCAAuC;AACvC,4DAA4D;AAC5D,wEAAwE;AACxE,EAAE;AACF,sEAAsE;AACtE,yEAAyE;AACzE,gCAAgC;AAChC,EAAE;AACF,2EAA2E;AAC3E,4EAA4E;AAC5E,wEAAwE;AACxE,aAAa"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { GitWorktreeEntry, ResolveBindingInput, ResolvedBinding } from './types';
|
|
2
|
+
export declare function parseWorktreePorcelain(text: string): readonly GitWorktreeEntry[];
|
|
3
|
+
export declare function resolveBinding(input: ResolveBindingInput): ResolvedBinding;
|
|
4
|
+
//# sourceMappingURL=resolve-binding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-binding.d.ts","sourceRoot":"","sources":["../../../src/shell/binding/resolve-binding.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EACV,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EAChB,MAAM,SAAS,CAAC;AA0BjB,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,gBAAgB,EAAE,CAqChF;AA6BD,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,eAAe,CA2F1E"}
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// resolve-binding — turn (repoRoot, cwd, registry, specsBySpecId) into a
|
|
3
|
+
// `BindingState` plus a worktree-name resolution provenance.
|
|
4
|
+
//
|
|
5
|
+
// Algorithm:
|
|
6
|
+
//
|
|
7
|
+
// 1. Real-resolve repoRoot and cwd. macOS /tmp ↔ /private/tmp matters.
|
|
8
|
+
// 2. If cwd is the repoRoot (or a descendant that is NOT inside any
|
|
9
|
+
// worktree path), we are NOT in a tracked worktree → `unbound`.
|
|
10
|
+
// 3. Walk worktrees.json entries with a recorded `path`. Pick the entry
|
|
11
|
+
// whose realpath(path) is cwd or an ancestor of cwd. (Multiple matches
|
|
12
|
+
// would be a registry conflict; we take the deepest match, with a
|
|
13
|
+
// stable tiebreak by name.)
|
|
14
|
+
// 4. If no registry entry matches, fall back to `git worktree list
|
|
15
|
+
// --porcelain` to find the worktree path containing cwd, then look up
|
|
16
|
+
// that path in the registry. If still no match: `unbound`.
|
|
17
|
+
// 5. With a worktree name in hand, look up the bound spec by following
|
|
18
|
+
// registry.specId → spec. If the spec exists, hand the Spec +
|
|
19
|
+
// registry + name to kernel `deriveBindingState`. If not, synthesize
|
|
20
|
+
// an `unbound` (and emit a one-sided shape if the registry has a
|
|
21
|
+
// specId pointing at something that didn't load).
|
|
22
|
+
//
|
|
23
|
+
// The shell NEVER uses `basename(cwd)` to invent a worktree name.
|
|
24
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
25
|
+
if (k2 === undefined) k2 = k;
|
|
26
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
27
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
28
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
29
|
+
}
|
|
30
|
+
Object.defineProperty(o, k2, desc);
|
|
31
|
+
}) : (function(o, m, k, k2) {
|
|
32
|
+
if (k2 === undefined) k2 = k;
|
|
33
|
+
o[k2] = m[k];
|
|
34
|
+
}));
|
|
35
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
36
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
37
|
+
}) : function(o, v) {
|
|
38
|
+
o["default"] = v;
|
|
39
|
+
});
|
|
40
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
41
|
+
var ownKeys = function(o) {
|
|
42
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
43
|
+
var ar = [];
|
|
44
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
45
|
+
return ar;
|
|
46
|
+
};
|
|
47
|
+
return ownKeys(o);
|
|
48
|
+
};
|
|
49
|
+
return function (mod) {
|
|
50
|
+
if (mod && mod.__esModule) return mod;
|
|
51
|
+
var result = {};
|
|
52
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
53
|
+
__setModuleDefault(result, mod);
|
|
54
|
+
return result;
|
|
55
|
+
};
|
|
56
|
+
})();
|
|
57
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
58
|
+
exports.parseWorktreePorcelain = parseWorktreePorcelain;
|
|
59
|
+
exports.resolveBinding = resolveBinding;
|
|
60
|
+
const fs = __importStar(require("node:fs"));
|
|
61
|
+
const path = __importStar(require("node:path"));
|
|
62
|
+
const node_child_process_1 = require("node:child_process");
|
|
63
|
+
const caws_kernel_1 = require("@paths.design/caws-kernel");
|
|
64
|
+
function safeRealpath(p) {
|
|
65
|
+
try {
|
|
66
|
+
return fs.realpathSync(p);
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return p;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function isAncestorOrEqual(maybeAncestor, descendant) {
|
|
73
|
+
if (maybeAncestor === descendant)
|
|
74
|
+
return true;
|
|
75
|
+
const withSep = maybeAncestor.endsWith(path.sep)
|
|
76
|
+
? maybeAncestor
|
|
77
|
+
: maybeAncestor + path.sep;
|
|
78
|
+
return descendant.startsWith(withSep);
|
|
79
|
+
}
|
|
80
|
+
function defaultGitWorktreeList(repoRoot) {
|
|
81
|
+
const r = (0, node_child_process_1.spawnSync)('git', ['-C', repoRoot, 'worktree', 'list', '--porcelain'], {
|
|
82
|
+
encoding: 'utf8',
|
|
83
|
+
});
|
|
84
|
+
if (r.status !== 0 || typeof r.stdout !== 'string')
|
|
85
|
+
return [];
|
|
86
|
+
return parseWorktreePorcelain(r.stdout);
|
|
87
|
+
}
|
|
88
|
+
function parseWorktreePorcelain(text) {
|
|
89
|
+
const out = [];
|
|
90
|
+
let currentPath;
|
|
91
|
+
let currentBranch;
|
|
92
|
+
for (const line of text.split('\n')) {
|
|
93
|
+
if (line.startsWith('worktree ')) {
|
|
94
|
+
if (currentPath !== undefined) {
|
|
95
|
+
const entry = currentBranch !== undefined
|
|
96
|
+
? { path: currentPath, branch: currentBranch }
|
|
97
|
+
: { path: currentPath };
|
|
98
|
+
out.push(entry);
|
|
99
|
+
}
|
|
100
|
+
currentPath = line.slice('worktree '.length);
|
|
101
|
+
currentBranch = undefined;
|
|
102
|
+
}
|
|
103
|
+
else if (line.startsWith('branch ')) {
|
|
104
|
+
currentBranch = line.slice('branch '.length);
|
|
105
|
+
}
|
|
106
|
+
else if (line === '') {
|
|
107
|
+
if (currentPath !== undefined) {
|
|
108
|
+
const entry = currentBranch !== undefined
|
|
109
|
+
? { path: currentPath, branch: currentBranch }
|
|
110
|
+
: { path: currentPath };
|
|
111
|
+
out.push(entry);
|
|
112
|
+
currentPath = undefined;
|
|
113
|
+
currentBranch = undefined;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
if (currentPath !== undefined) {
|
|
118
|
+
const entry = currentBranch !== undefined
|
|
119
|
+
? { path: currentPath, branch: currentBranch }
|
|
120
|
+
: { path: currentPath };
|
|
121
|
+
out.push(entry);
|
|
122
|
+
}
|
|
123
|
+
return out;
|
|
124
|
+
}
|
|
125
|
+
function findRegistryMatch(cwdReal, registry) {
|
|
126
|
+
let best = null;
|
|
127
|
+
let bestDepth = -1;
|
|
128
|
+
for (const [name, record] of Object.entries(registry)) {
|
|
129
|
+
if (typeof record?.path !== 'string')
|
|
130
|
+
continue;
|
|
131
|
+
const recordReal = safeRealpath(record.path);
|
|
132
|
+
if (!isAncestorOrEqual(recordReal, cwdReal))
|
|
133
|
+
continue;
|
|
134
|
+
const depth = recordReal.split(path.sep).length;
|
|
135
|
+
if (depth > bestDepth ||
|
|
136
|
+
(depth === bestDepth && best !== null && name < best.name)) {
|
|
137
|
+
best = { name, path: recordReal };
|
|
138
|
+
bestDepth = depth;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return best;
|
|
142
|
+
}
|
|
143
|
+
function resolveBinding(input) {
|
|
144
|
+
const cwdReal = safeRealpath(input.cwd);
|
|
145
|
+
const repoRootReal = safeRealpath(input.repoRoot);
|
|
146
|
+
// If cwd is exactly the repo root, we are in the main checkout. Walk the
|
|
147
|
+
// registry anyway in case a worktree was created at the repo root (rare,
|
|
148
|
+
// would imply specId === <main> binding). Otherwise this returns null.
|
|
149
|
+
let candidate = findRegistryMatch(cwdReal, input.registry);
|
|
150
|
+
let source = 'registry_path_match';
|
|
151
|
+
if (candidate === null) {
|
|
152
|
+
// Fallback: git porcelain. Find the worktree path containing cwd,
|
|
153
|
+
// then match that path against the registry.
|
|
154
|
+
const lister = input.gitWorktreeList ?? defaultGitWorktreeList;
|
|
155
|
+
const wts = lister(input.repoRoot);
|
|
156
|
+
let porcelainMatch = null;
|
|
157
|
+
let porcelainDepth = -1;
|
|
158
|
+
for (const wt of wts) {
|
|
159
|
+
const wtReal = safeRealpath(wt.path);
|
|
160
|
+
if (!isAncestorOrEqual(wtReal, cwdReal))
|
|
161
|
+
continue;
|
|
162
|
+
const depth = wtReal.split(path.sep).length;
|
|
163
|
+
if (depth > porcelainDepth) {
|
|
164
|
+
porcelainMatch = wt;
|
|
165
|
+
porcelainDepth = depth;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
if (porcelainMatch !== null) {
|
|
169
|
+
const porcelainReal = safeRealpath(porcelainMatch.path);
|
|
170
|
+
// Skip if porcelain match is the main checkout (no worktree binding).
|
|
171
|
+
if (porcelainReal !== repoRootReal) {
|
|
172
|
+
// Look up registry entry by path equality.
|
|
173
|
+
for (const [name, record] of Object.entries(input.registry)) {
|
|
174
|
+
if (typeof record?.path === 'string' &&
|
|
175
|
+
safeRealpath(record.path) === porcelainReal) {
|
|
176
|
+
candidate = { name, path: porcelainReal };
|
|
177
|
+
source = 'git_porcelain_match';
|
|
178
|
+
break;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
if (candidate === null) {
|
|
185
|
+
return { binding: { kind: 'unbound' }, source: 'none' };
|
|
186
|
+
}
|
|
187
|
+
// We have a worktree name. Now find the bound spec for kernel evaluation.
|
|
188
|
+
const record = input.registry[candidate.name];
|
|
189
|
+
const registrySpecId = record?.specId;
|
|
190
|
+
if (typeof registrySpecId !== 'string' || registrySpecId.length === 0) {
|
|
191
|
+
// Registry knows the worktree but no spec is linked. Neither side
|
|
192
|
+
// points at the other, so this is `unbound`, NOT `one_sided`.
|
|
193
|
+
// The repair is "bind this worktree to a spec", not "repair corrupt
|
|
194
|
+
// asymmetric binding". The downstream renderer keys off the
|
|
195
|
+
// worktreeName being set to distinguish "tracked worktree without
|
|
196
|
+
// spec" from "cwd outside any worktree".
|
|
197
|
+
return {
|
|
198
|
+
binding: { kind: 'unbound' },
|
|
199
|
+
worktreeName: candidate.name,
|
|
200
|
+
source,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
// We have registrySpecId. Find the bound spec in the loaded specs list.
|
|
204
|
+
const boundSpec = input.specs.find((s) => s.id === registrySpecId);
|
|
205
|
+
if (boundSpec === undefined) {
|
|
206
|
+
// Registry points at a spec id that didn't load. From the kernel's
|
|
207
|
+
// perspective this is one-sided (registry has specId, spec missing).
|
|
208
|
+
return {
|
|
209
|
+
binding: {
|
|
210
|
+
kind: 'one_sided',
|
|
211
|
+
detail: {
|
|
212
|
+
specHasWorktree: false,
|
|
213
|
+
registryHasSpecId: true,
|
|
214
|
+
registrySpecId,
|
|
215
|
+
worktreeName: candidate.name,
|
|
216
|
+
},
|
|
217
|
+
},
|
|
218
|
+
worktreeName: candidate.name,
|
|
219
|
+
source,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
return {
|
|
223
|
+
binding: (0, caws_kernel_1.deriveBindingState)(boundSpec, input.registry, candidate.name),
|
|
224
|
+
worktreeName: candidate.name,
|
|
225
|
+
source,
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=resolve-binding.js.map
|