@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,506 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Spec lifecycle writer.
|
|
3
|
+
//
|
|
4
|
+
// CLI-SPECS-001: store-layer mutations for spec lifecycle. Composes
|
|
5
|
+
// lifecycle-transaction + yaml-patch + appendEvent into typed lifecycle
|
|
6
|
+
// operations:
|
|
7
|
+
//
|
|
8
|
+
// createSpec — write a new .caws/specs/<id>.yaml (active) + spec_created
|
|
9
|
+
// closeSpec — raw-byte patch lifecycle_state/resolution/closure_notes
|
|
10
|
+
// /updated_at on existing spec + spec_closed
|
|
11
|
+
// archiveSpec — move .caws/specs/<id>.yaml → .caws/specs/.archive/<id>.yaml,
|
|
12
|
+
// patch lifecycle_state → archived + spec_archived
|
|
13
|
+
//
|
|
14
|
+
// Every operation:
|
|
15
|
+
// - acquires the lifecycle lock
|
|
16
|
+
// - validates plan via kernel (parseAndValidateSpec on planned bytes)
|
|
17
|
+
// - performs writes through atomicWrite with preserveMode
|
|
18
|
+
// - appends events through appendEvent (the SOLE v11 events writer)
|
|
19
|
+
// - rolls back on failure with typed partial-failure outcomes
|
|
20
|
+
//
|
|
21
|
+
// What this module does NOT do:
|
|
22
|
+
// - CLI argument parsing (that's in shell/commands/specs.ts)
|
|
23
|
+
// - Rendering (shell layer)
|
|
24
|
+
// - Concurrent worktree mutations (Slice 6 surface)
|
|
25
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
26
|
+
if (k2 === undefined) k2 = k;
|
|
27
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
28
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
29
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
30
|
+
}
|
|
31
|
+
Object.defineProperty(o, k2, desc);
|
|
32
|
+
}) : (function(o, m, k, k2) {
|
|
33
|
+
if (k2 === undefined) k2 = k;
|
|
34
|
+
o[k2] = m[k];
|
|
35
|
+
}));
|
|
36
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
37
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
38
|
+
}) : function(o, v) {
|
|
39
|
+
o["default"] = v;
|
|
40
|
+
});
|
|
41
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
42
|
+
var ownKeys = function(o) {
|
|
43
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
44
|
+
var ar = [];
|
|
45
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
46
|
+
return ar;
|
|
47
|
+
};
|
|
48
|
+
return ownKeys(o);
|
|
49
|
+
};
|
|
50
|
+
return function (mod) {
|
|
51
|
+
if (mod && mod.__esModule) return mod;
|
|
52
|
+
var result = {};
|
|
53
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
54
|
+
__setModuleDefault(result, mod);
|
|
55
|
+
return result;
|
|
56
|
+
};
|
|
57
|
+
})();
|
|
58
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
59
|
+
exports.createSpec = createSpec;
|
|
60
|
+
exports.closeSpec = closeSpec;
|
|
61
|
+
exports.archiveSpec = archiveSpec;
|
|
62
|
+
exports.listSpecs = listSpecs;
|
|
63
|
+
exports.showSpec = showSpec;
|
|
64
|
+
const fs = __importStar(require("fs"));
|
|
65
|
+
const path = __importStar(require("path"));
|
|
66
|
+
const caws_kernel_1 = require("@paths.design/caws-kernel");
|
|
67
|
+
const events_store_1 = require("./events-store");
|
|
68
|
+
const lifecycle_transaction_1 = require("./lifecycle-transaction");
|
|
69
|
+
const lifecycle_lock_1 = require("./lifecycle-lock");
|
|
70
|
+
const repo_root_1 = require("./repo-root");
|
|
71
|
+
const rules_1 = require("./rules");
|
|
72
|
+
const specs_store_1 = require("./specs-store");
|
|
73
|
+
const yaml_patch_1 = require("./yaml-patch");
|
|
74
|
+
const yaml_store_1 = require("./yaml-store");
|
|
75
|
+
// ─── Path helpers ────────────────────────────────────────────────────────
|
|
76
|
+
function specPath(cawsDir, id) {
|
|
77
|
+
return path.join(cawsDir, 'specs', `${id}.yaml`);
|
|
78
|
+
}
|
|
79
|
+
function archivedSpecPath(cawsDir, id) {
|
|
80
|
+
return path.join(cawsDir, 'specs', '.archive', `${id}.yaml`);
|
|
81
|
+
}
|
|
82
|
+
/** Find a spec on disk under either active or archived locations. */
|
|
83
|
+
function findSpecPath(cawsDir, id) {
|
|
84
|
+
const active = specPath(cawsDir, id);
|
|
85
|
+
if (fs.existsSync(active))
|
|
86
|
+
return active;
|
|
87
|
+
const archived = archivedSpecPath(cawsDir, id);
|
|
88
|
+
if (fs.existsSync(archived))
|
|
89
|
+
return archived;
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
// ─── ID validation (mirrors kernel regex) ────────────────────────────────
|
|
93
|
+
const SPEC_ID_PATTERN = /^[A-Z][A-Z0-9]*(-[A-Z0-9]+)*-\d+[a-z]*$/;
|
|
94
|
+
function validateSpecId(id) {
|
|
95
|
+
if (typeof id !== 'string' || id.length === 0) {
|
|
96
|
+
return (0, caws_kernel_1.err)((0, repo_root_1.storeDiagnostic)(rules_1.STORE_RULES.LIFECYCLE_PLAN_REJECTED, 'Spec id is required.', { subject: 'id' }));
|
|
97
|
+
}
|
|
98
|
+
if (!SPEC_ID_PATTERN.test(id)) {
|
|
99
|
+
return (0, caws_kernel_1.err)((0, repo_root_1.storeDiagnostic)(rules_1.STORE_RULES.LIFECYCLE_PLAN_REJECTED, `Spec id "${id}" does not match the v11 pattern (e.g., FEAT-001, CLI-SPECS-001).`, { subject: id, data: { pattern: SPEC_ID_PATTERN.source } }));
|
|
100
|
+
}
|
|
101
|
+
return (0, caws_kernel_1.ok)(true);
|
|
102
|
+
}
|
|
103
|
+
// ─── Spec rendering for create ───────────────────────────────────────────
|
|
104
|
+
function renderInitialSpecYaml(input) {
|
|
105
|
+
const now = (input.now ?? (() => new Date()))().toISOString();
|
|
106
|
+
const state = input.initialState ?? 'active';
|
|
107
|
+
// Render a minimum-viable v11 spec. Plain-string fields are
|
|
108
|
+
// single-quoted to be defensive against embedded colons. The body
|
|
109
|
+
// is intentionally minimal but satisfies the kernel's structural
|
|
110
|
+
// requirements (non-empty arrays where the schema demands them).
|
|
111
|
+
// The user fills in concrete values before iteration.
|
|
112
|
+
return [
|
|
113
|
+
`id: ${input.id}`,
|
|
114
|
+
`title: '${input.title.replace(/'/g, "''")}'`,
|
|
115
|
+
`risk_tier: ${input.riskTier}`,
|
|
116
|
+
`mode: ${input.mode}`,
|
|
117
|
+
`lifecycle_state: ${state}`,
|
|
118
|
+
`created_at: '${now}'`,
|
|
119
|
+
`updated_at: '${now}'`,
|
|
120
|
+
`blast_radius:`,
|
|
121
|
+
` modules:`,
|
|
122
|
+
` - 'TODO: list one or more modules this spec touches.'`,
|
|
123
|
+
` data_migration: false`,
|
|
124
|
+
`operational_rollback_slo: 5m`,
|
|
125
|
+
`scope:`,
|
|
126
|
+
` in:`,
|
|
127
|
+
` - 'TODO: list the file(s) or directories this spec authorizes.'`,
|
|
128
|
+
` out: []`,
|
|
129
|
+
`invariants:`,
|
|
130
|
+
` - 'TODO: describe one invariant this spec guarantees.'`,
|
|
131
|
+
`acceptance:`,
|
|
132
|
+
` - id: A1`,
|
|
133
|
+
` given: 'TODO'`,
|
|
134
|
+
` when: 'TODO'`,
|
|
135
|
+
` then: 'TODO'`,
|
|
136
|
+
`non_functional: {}`,
|
|
137
|
+
`contracts: []`,
|
|
138
|
+
``,
|
|
139
|
+
].join('\n');
|
|
140
|
+
}
|
|
141
|
+
// ─── createSpec ──────────────────────────────────────────────────────────
|
|
142
|
+
function createSpec(cawsDir, input) {
|
|
143
|
+
const idValidation = validateSpecId(input.id);
|
|
144
|
+
if (!idValidation.ok)
|
|
145
|
+
return idValidation;
|
|
146
|
+
// Refuse duplicate ids (in either active or archived location).
|
|
147
|
+
const existing = findSpecPath(cawsDir, input.id);
|
|
148
|
+
if (existing !== null) {
|
|
149
|
+
return (0, caws_kernel_1.err)((0, repo_root_1.storeDiagnostic)(rules_1.STORE_RULES.LIFECYCLE_PLAN_REJECTED, `Spec "${input.id}" already exists at ${existing}.`, { subject: input.id, data: { existing_path: existing } }));
|
|
150
|
+
}
|
|
151
|
+
const targetPath = specPath(cawsDir, input.id);
|
|
152
|
+
const newBytes = renderInitialSpecYaml(input);
|
|
153
|
+
// Validate the planned YAML through the kernel BEFORE we write or
|
|
154
|
+
// append events.
|
|
155
|
+
const parsed = (0, caws_kernel_1.parseAndValidateSpec)(newBytes);
|
|
156
|
+
if (!(0, caws_kernel_1.isOk)(parsed)) {
|
|
157
|
+
return (0, caws_kernel_1.err)(parsed.errors.map((d) => (0, repo_root_1.storeDiagnostic)(rules_1.STORE_RULES.LIFECYCLE_PLAN_REJECTED, d.message, {
|
|
158
|
+
subject: d.subject ?? input.id,
|
|
159
|
+
data: { source_rule: d.rule },
|
|
160
|
+
})));
|
|
161
|
+
}
|
|
162
|
+
const now = (input.now ?? (() => new Date()))().toISOString();
|
|
163
|
+
const event = {
|
|
164
|
+
event: 'spec_created',
|
|
165
|
+
ts: now,
|
|
166
|
+
actor: input.actor,
|
|
167
|
+
spec_id: input.id,
|
|
168
|
+
data: {
|
|
169
|
+
title: input.title,
|
|
170
|
+
risk_tier: input.riskTier,
|
|
171
|
+
mode: input.mode,
|
|
172
|
+
lifecycle_state: input.initialState ?? 'active',
|
|
173
|
+
},
|
|
174
|
+
};
|
|
175
|
+
const txnResult = (0, lifecycle_lock_1.withLifecycleLock)(cawsDir, () => (0, lifecycle_transaction_1.runLifecycleTransaction)({
|
|
176
|
+
cawsDir,
|
|
177
|
+
plannedWrites: [{ path: targetPath, contents: newBytes }],
|
|
178
|
+
events: [event],
|
|
179
|
+
}));
|
|
180
|
+
if (!txnResult.ok) {
|
|
181
|
+
return (0, caws_kernel_1.err)(txnResult.errors);
|
|
182
|
+
}
|
|
183
|
+
return mapTxnToOutcome(txnResult.value, input.id, targetPath);
|
|
184
|
+
}
|
|
185
|
+
// ─── closeSpec ───────────────────────────────────────────────────────────
|
|
186
|
+
function closeSpec(cawsDir, input) {
|
|
187
|
+
const idValidation = validateSpecId(input.id);
|
|
188
|
+
if (!idValidation.ok)
|
|
189
|
+
return idValidation;
|
|
190
|
+
const targetPath = specPath(cawsDir, input.id);
|
|
191
|
+
if (!fs.existsSync(targetPath)) {
|
|
192
|
+
// Check archive too — if it's already archived, this is a different
|
|
193
|
+
// kind of error than "not found."
|
|
194
|
+
const archived = archivedSpecPath(cawsDir, input.id);
|
|
195
|
+
if (fs.existsSync(archived)) {
|
|
196
|
+
return (0, caws_kernel_1.err)((0, repo_root_1.storeDiagnostic)(rules_1.STORE_RULES.LIFECYCLE_PLAN_REJECTED, `Spec "${input.id}" is archived; cannot close (legal transitions: active → closed → archived).`, { subject: input.id }));
|
|
197
|
+
}
|
|
198
|
+
return (0, caws_kernel_1.err)((0, repo_root_1.storeDiagnostic)(rules_1.STORE_RULES.LIFECYCLE_PLAN_REJECTED, `Spec "${input.id}" not found at ${targetPath}.`, { subject: input.id }));
|
|
199
|
+
}
|
|
200
|
+
// Load and verify the current state.
|
|
201
|
+
const sourceResult = (0, yaml_store_1.readYamlSource)(targetPath);
|
|
202
|
+
if (!(0, caws_kernel_1.isOk)(sourceResult))
|
|
203
|
+
return (0, caws_kernel_1.err)(sourceResult.errors);
|
|
204
|
+
const originalBytes = sourceResult.value;
|
|
205
|
+
const parsed = (0, caws_kernel_1.parseAndValidateSpec)(originalBytes);
|
|
206
|
+
if (!(0, caws_kernel_1.isOk)(parsed)) {
|
|
207
|
+
return (0, caws_kernel_1.err)(parsed.errors.map((d) => (0, repo_root_1.storeDiagnostic)(rules_1.STORE_RULES.LIFECYCLE_PLAN_REJECTED, d.message, {
|
|
208
|
+
subject: d.subject ?? input.id,
|
|
209
|
+
data: { source_rule: d.rule },
|
|
210
|
+
})));
|
|
211
|
+
}
|
|
212
|
+
const spec = parsed.value;
|
|
213
|
+
if (spec.lifecycle_state !== 'active') {
|
|
214
|
+
return (0, caws_kernel_1.err)((0, repo_root_1.storeDiagnostic)(rules_1.STORE_RULES.LIFECYCLE_PLAN_REJECTED, `Spec "${input.id}" is in lifecycle_state "${spec.lifecycle_state}"; only active specs can be closed.`, { subject: input.id, data: { current_state: spec.lifecycle_state } }));
|
|
215
|
+
}
|
|
216
|
+
// Raw-byte patch sequence:
|
|
217
|
+
// 1. lifecycle_state → closed
|
|
218
|
+
// 2. insert resolution after lifecycle_state
|
|
219
|
+
// 3. if reason: insert closure_notes after resolution
|
|
220
|
+
// 4. updated_at → now
|
|
221
|
+
const now = (input.now ?? (() => new Date()))().toISOString();
|
|
222
|
+
let patched = originalBytes;
|
|
223
|
+
const step1 = (0, yaml_patch_1.setTopLevelScalar)(patched, 'lifecycle_state', 'closed');
|
|
224
|
+
if (!step1.ok)
|
|
225
|
+
return (0, caws_kernel_1.err)(step1.errors);
|
|
226
|
+
patched = step1.value;
|
|
227
|
+
// Insert resolution after lifecycle_state. If resolution already
|
|
228
|
+
// exists (e.g., from a prior failed transaction), update it instead.
|
|
229
|
+
const hasResolution = /^resolution:/m.test(patched);
|
|
230
|
+
if (hasResolution) {
|
|
231
|
+
const step2 = (0, yaml_patch_1.setTopLevelScalar)(patched, 'resolution', input.resolution);
|
|
232
|
+
if (!step2.ok)
|
|
233
|
+
return (0, caws_kernel_1.err)(step2.errors);
|
|
234
|
+
patched = step2.value;
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
const step2 = (0, yaml_patch_1.insertTopLevelScalarAfter)(patched, 'lifecycle_state', 'resolution', input.resolution);
|
|
238
|
+
if (!step2.ok)
|
|
239
|
+
return (0, caws_kernel_1.err)(step2.errors);
|
|
240
|
+
patched = step2.value;
|
|
241
|
+
}
|
|
242
|
+
if (input.reason !== undefined && input.reason.length > 0) {
|
|
243
|
+
const escaped = `'${input.reason.replace(/'/g, "''")}'`;
|
|
244
|
+
const hasNotes = /^closure_notes:/m.test(patched);
|
|
245
|
+
if (hasNotes) {
|
|
246
|
+
const step3 = (0, yaml_patch_1.setTopLevelScalar)(patched, 'closure_notes', escaped);
|
|
247
|
+
if (!step3.ok)
|
|
248
|
+
return (0, caws_kernel_1.err)(step3.errors);
|
|
249
|
+
patched = step3.value;
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
const step3 = (0, yaml_patch_1.insertTopLevelScalarAfter)(patched, 'resolution', 'closure_notes', escaped);
|
|
253
|
+
if (!step3.ok)
|
|
254
|
+
return (0, caws_kernel_1.err)(step3.errors);
|
|
255
|
+
patched = step3.value;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
const step4 = (0, yaml_patch_1.setTopLevelScalar)(patched, 'updated_at', `'${now}'`);
|
|
259
|
+
if (!step4.ok)
|
|
260
|
+
return (0, caws_kernel_1.err)(step4.errors);
|
|
261
|
+
patched = step4.value;
|
|
262
|
+
// Validate the patched bytes through the kernel before write.
|
|
263
|
+
const reparsed = (0, caws_kernel_1.parseAndValidateSpec)(patched);
|
|
264
|
+
if (!(0, caws_kernel_1.isOk)(reparsed)) {
|
|
265
|
+
return (0, caws_kernel_1.err)(reparsed.errors.map((d) => (0, repo_root_1.storeDiagnostic)(rules_1.STORE_RULES.LIFECYCLE_PLAN_REJECTED, d.message, {
|
|
266
|
+
subject: d.subject ?? input.id,
|
|
267
|
+
data: { source_rule: d.rule, hint: 'planned-bytes validation failed' },
|
|
268
|
+
})));
|
|
269
|
+
}
|
|
270
|
+
const eventData = { resolution: input.resolution };
|
|
271
|
+
if (input.reason !== undefined && input.reason.length > 0) {
|
|
272
|
+
eventData.closure_notes = input.reason;
|
|
273
|
+
}
|
|
274
|
+
if (input.mergeCommit !== undefined)
|
|
275
|
+
eventData.merge_commit = input.mergeCommit;
|
|
276
|
+
if (input.supersededBy !== undefined)
|
|
277
|
+
eventData.superseded_by = input.supersededBy;
|
|
278
|
+
const event = {
|
|
279
|
+
event: 'spec_closed',
|
|
280
|
+
ts: now,
|
|
281
|
+
actor: input.actor,
|
|
282
|
+
spec_id: input.id,
|
|
283
|
+
data: eventData,
|
|
284
|
+
};
|
|
285
|
+
const txnResult = (0, lifecycle_lock_1.withLifecycleLock)(cawsDir, () => (0, lifecycle_transaction_1.runLifecycleTransaction)({
|
|
286
|
+
cawsDir,
|
|
287
|
+
plannedWrites: [{ path: targetPath, contents: patched }],
|
|
288
|
+
events: [event],
|
|
289
|
+
}));
|
|
290
|
+
if (!txnResult.ok) {
|
|
291
|
+
return (0, caws_kernel_1.err)(txnResult.errors);
|
|
292
|
+
}
|
|
293
|
+
return mapTxnToOutcome(txnResult.value, input.id, targetPath);
|
|
294
|
+
}
|
|
295
|
+
// ─── archiveSpec ─────────────────────────────────────────────────────────
|
|
296
|
+
function archiveSpec(cawsDir, input) {
|
|
297
|
+
const idValidation = validateSpecId(input.id);
|
|
298
|
+
if (!idValidation.ok)
|
|
299
|
+
return idValidation;
|
|
300
|
+
const fromPath = specPath(cawsDir, input.id);
|
|
301
|
+
if (!fs.existsSync(fromPath)) {
|
|
302
|
+
const archived = archivedSpecPath(cawsDir, input.id);
|
|
303
|
+
if (fs.existsSync(archived)) {
|
|
304
|
+
return (0, caws_kernel_1.err)((0, repo_root_1.storeDiagnostic)(rules_1.STORE_RULES.LIFECYCLE_PLAN_REJECTED, `Spec "${input.id}" is already archived at ${archived}.`, { subject: input.id }));
|
|
305
|
+
}
|
|
306
|
+
return (0, caws_kernel_1.err)((0, repo_root_1.storeDiagnostic)(rules_1.STORE_RULES.LIFECYCLE_PLAN_REJECTED, `Spec "${input.id}" not found at ${fromPath}.`, { subject: input.id }));
|
|
307
|
+
}
|
|
308
|
+
// Validate current state: must be closed.
|
|
309
|
+
const sourceResult = (0, yaml_store_1.readYamlSource)(fromPath);
|
|
310
|
+
if (!(0, caws_kernel_1.isOk)(sourceResult))
|
|
311
|
+
return (0, caws_kernel_1.err)(sourceResult.errors);
|
|
312
|
+
const originalBytes = sourceResult.value;
|
|
313
|
+
const parsed = (0, caws_kernel_1.parseAndValidateSpec)(originalBytes);
|
|
314
|
+
if (!(0, caws_kernel_1.isOk)(parsed)) {
|
|
315
|
+
return (0, caws_kernel_1.err)(parsed.errors.map((d) => (0, repo_root_1.storeDiagnostic)(rules_1.STORE_RULES.LIFECYCLE_PLAN_REJECTED, d.message, {
|
|
316
|
+
subject: d.subject ?? input.id,
|
|
317
|
+
data: { source_rule: d.rule },
|
|
318
|
+
})));
|
|
319
|
+
}
|
|
320
|
+
const spec = parsed.value;
|
|
321
|
+
if (spec.lifecycle_state !== 'closed') {
|
|
322
|
+
return (0, caws_kernel_1.err)((0, repo_root_1.storeDiagnostic)(rules_1.STORE_RULES.LIFECYCLE_PLAN_REJECTED, `Spec "${input.id}" is in lifecycle_state "${spec.lifecycle_state}"; only closed specs can be archived.`, { subject: input.id, data: { current_state: spec.lifecycle_state } }));
|
|
323
|
+
}
|
|
324
|
+
const now = (input.now ?? (() => new Date()))().toISOString();
|
|
325
|
+
const toPath = archivedSpecPath(cawsDir, input.id);
|
|
326
|
+
// Patch lifecycle_state → archived and bump updated_at on a copy.
|
|
327
|
+
let patched = originalBytes;
|
|
328
|
+
const s1 = (0, yaml_patch_1.setTopLevelScalar)(patched, 'lifecycle_state', 'archived');
|
|
329
|
+
if (!s1.ok)
|
|
330
|
+
return (0, caws_kernel_1.err)(s1.errors);
|
|
331
|
+
patched = s1.value;
|
|
332
|
+
const s2 = (0, yaml_patch_1.setTopLevelScalar)(patched, 'updated_at', `'${now}'`);
|
|
333
|
+
if (!s2.ok)
|
|
334
|
+
return (0, caws_kernel_1.err)(s2.errors);
|
|
335
|
+
patched = s2.value;
|
|
336
|
+
// Validate.
|
|
337
|
+
const reparsed = (0, caws_kernel_1.parseAndValidateSpec)(patched);
|
|
338
|
+
if (!(0, caws_kernel_1.isOk)(reparsed)) {
|
|
339
|
+
return (0, caws_kernel_1.err)(reparsed.errors.map((d) => (0, repo_root_1.storeDiagnostic)(rules_1.STORE_RULES.LIFECYCLE_PLAN_REJECTED, d.message, {
|
|
340
|
+
subject: d.subject ?? input.id,
|
|
341
|
+
data: { source_rule: d.rule, hint: 'planned-bytes validation failed' },
|
|
342
|
+
})));
|
|
343
|
+
}
|
|
344
|
+
// Ensure the archive dir exists. fs.renameSync requires it.
|
|
345
|
+
try {
|
|
346
|
+
fs.mkdirSync(path.dirname(toPath), { recursive: true });
|
|
347
|
+
}
|
|
348
|
+
catch (e) {
|
|
349
|
+
const cause = e;
|
|
350
|
+
return (0, caws_kernel_1.err)((0, repo_root_1.storeDiagnostic)(rules_1.STORE_RULES.LIFECYCLE_WRITE_FAILED, `Failed to create archive directory: ${cause.message ?? 'unknown'}.`, { subject: path.dirname(toPath) }));
|
|
351
|
+
}
|
|
352
|
+
// Filesystem-move pattern: we write the patched bytes to the new
|
|
353
|
+
// path via the transaction, then delete the source. The transaction
|
|
354
|
+
// doesn't model moves natively, so we do this in two phases inside
|
|
355
|
+
// the same lock:
|
|
356
|
+
// 1. lifecycle-transaction: write toPath + append spec_archived
|
|
357
|
+
// 2. AFTER transaction success: unlink fromPath
|
|
358
|
+
//
|
|
359
|
+
// If step 2 fails, we surface the partial-failure but the audit log
|
|
360
|
+
// already records the move intent. The next doctor pass will see
|
|
361
|
+
// the spec in BOTH locations and surface that as a doctor finding.
|
|
362
|
+
const fromRel = path.relative(path.join(cawsDir, '..'), fromPath);
|
|
363
|
+
const toRel = path.relative(path.join(cawsDir, '..'), toPath);
|
|
364
|
+
const event = {
|
|
365
|
+
event: 'spec_archived',
|
|
366
|
+
ts: now,
|
|
367
|
+
actor: input.actor,
|
|
368
|
+
spec_id: input.id,
|
|
369
|
+
data: { from_path: fromRel, to_path: toRel },
|
|
370
|
+
};
|
|
371
|
+
// Capture original bytes so we can roll back the unlink in
|
|
372
|
+
// emergencies (rare but worth tracking).
|
|
373
|
+
let unlinkOk = false;
|
|
374
|
+
let unlinkError = null;
|
|
375
|
+
const txnResult = (0, lifecycle_lock_1.withLifecycleLock)(cawsDir, () => {
|
|
376
|
+
const r = (0, lifecycle_transaction_1.runLifecycleTransaction)({
|
|
377
|
+
cawsDir,
|
|
378
|
+
plannedWrites: [{ path: toPath, contents: patched }],
|
|
379
|
+
events: [event],
|
|
380
|
+
});
|
|
381
|
+
if (!r.ok)
|
|
382
|
+
return r;
|
|
383
|
+
if (r.value.kind !== 'success')
|
|
384
|
+
return r;
|
|
385
|
+
// Transaction wrote toPath + appended event. Now remove fromPath.
|
|
386
|
+
try {
|
|
387
|
+
fs.unlinkSync(fromPath);
|
|
388
|
+
unlinkOk = true;
|
|
389
|
+
}
|
|
390
|
+
catch (e) {
|
|
391
|
+
const cause = e;
|
|
392
|
+
unlinkError = cause.message ?? 'unknown unlink error';
|
|
393
|
+
}
|
|
394
|
+
return r;
|
|
395
|
+
});
|
|
396
|
+
// Reason flows into closure_notes ONLY if the user passed one; archive
|
|
397
|
+
// event schema does NOT take closure_notes, but we attach the reason
|
|
398
|
+
// to a follow-up evidence record path in future versions. For v11.1
|
|
399
|
+
// archive, we accept the --reason for parity with close but the
|
|
400
|
+
// schema does not carry it.
|
|
401
|
+
void input.reason;
|
|
402
|
+
if (!txnResult.ok) {
|
|
403
|
+
return (0, caws_kernel_1.err)(txnResult.errors);
|
|
404
|
+
}
|
|
405
|
+
if (txnResult.value.kind !== 'success') {
|
|
406
|
+
return (0, caws_kernel_1.ok)({
|
|
407
|
+
kind: 'partial_failure_recovered',
|
|
408
|
+
cause: txnResult.value.cause,
|
|
409
|
+
});
|
|
410
|
+
}
|
|
411
|
+
if (!unlinkOk) {
|
|
412
|
+
return (0, caws_kernel_1.err)((0, repo_root_1.storeDiagnostic)(rules_1.STORE_RULES.LIFECYCLE_PARTIAL_FAILURE_UNRECOVERED, `Archive write succeeded and spec_archived event appended, but original file unlink failed (${unlinkError}). Spec now exists in BOTH active and archived locations.`, {
|
|
413
|
+
subject: input.id,
|
|
414
|
+
data: {
|
|
415
|
+
from_path: fromPath,
|
|
416
|
+
to_path: toPath,
|
|
417
|
+
recovery_instruction: `Manually remove ${fromPath} once you've confirmed ${toPath} is intact.`,
|
|
418
|
+
},
|
|
419
|
+
}));
|
|
420
|
+
}
|
|
421
|
+
return (0, caws_kernel_1.ok)({ kind: 'success', id: input.id, path: toPath });
|
|
422
|
+
}
|
|
423
|
+
// ─── Outcome mapper ──────────────────────────────────────────────────────
|
|
424
|
+
function mapTxnToOutcome(result, id, targetPath) {
|
|
425
|
+
if (result.kind === 'success') {
|
|
426
|
+
return (0, caws_kernel_1.ok)({ kind: 'success', id, path: targetPath });
|
|
427
|
+
}
|
|
428
|
+
if (result.kind === 'partial_failure_recovered') {
|
|
429
|
+
return (0, caws_kernel_1.ok)({ kind: 'partial_failure_recovered', cause: result.cause });
|
|
430
|
+
}
|
|
431
|
+
// partial_failure_unrecovered: this should already have surfaced as
|
|
432
|
+
// an Err from runLifecycleTransaction, but we map defensively.
|
|
433
|
+
return (0, caws_kernel_1.err)((0, repo_root_1.storeDiagnostic)(rules_1.STORE_RULES.LIFECYCLE_PARTIAL_FAILURE_UNRECOVERED, `Spec "${id}" lifecycle transaction left partial state.`, {
|
|
434
|
+
subject: id,
|
|
435
|
+
data: {
|
|
436
|
+
writes_completed: result.writesCompleted,
|
|
437
|
+
rolled_back: result.rolledBack,
|
|
438
|
+
rollback_failed: result.rollbackFailed,
|
|
439
|
+
recovery_instruction: result.recoveryInstruction,
|
|
440
|
+
},
|
|
441
|
+
}));
|
|
442
|
+
}
|
|
443
|
+
/** List specs by lifecycle state, optionally including archived ones. */
|
|
444
|
+
function listSpecs(cawsDir, options = {}) {
|
|
445
|
+
const activeResult = (0, specs_store_1.loadSpecs)(cawsDir);
|
|
446
|
+
const active = activeResult.specs.map((spec) => ({
|
|
447
|
+
id: spec.id,
|
|
448
|
+
title: spec.title,
|
|
449
|
+
lifecycle_state: spec.lifecycle_state,
|
|
450
|
+
path: specPath(cawsDir, spec.id),
|
|
451
|
+
}));
|
|
452
|
+
const archived = [];
|
|
453
|
+
if (options.includeArchived === true) {
|
|
454
|
+
const archiveDir = path.join(cawsDir, 'specs', '.archive');
|
|
455
|
+
if (fs.existsSync(archiveDir)) {
|
|
456
|
+
try {
|
|
457
|
+
const entries = fs.readdirSync(archiveDir, { withFileTypes: true });
|
|
458
|
+
for (const entry of entries) {
|
|
459
|
+
if (!entry.isFile())
|
|
460
|
+
continue;
|
|
461
|
+
if (!entry.name.endsWith('.yaml') && !entry.name.endsWith('.yml'))
|
|
462
|
+
continue;
|
|
463
|
+
const fullPath = path.join(archiveDir, entry.name);
|
|
464
|
+
const src = (0, yaml_store_1.readYamlSource)(fullPath);
|
|
465
|
+
if (!(0, caws_kernel_1.isOk)(src))
|
|
466
|
+
continue;
|
|
467
|
+
const parsed = (0, caws_kernel_1.parseAndValidateSpec)(src.value);
|
|
468
|
+
if (!(0, caws_kernel_1.isOk)(parsed))
|
|
469
|
+
continue;
|
|
470
|
+
const spec = parsed.value;
|
|
471
|
+
archived.push({
|
|
472
|
+
id: spec.id,
|
|
473
|
+
title: spec.title,
|
|
474
|
+
lifecycle_state: spec.lifecycle_state,
|
|
475
|
+
path: fullPath,
|
|
476
|
+
});
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
catch {
|
|
480
|
+
// Best-effort archive listing.
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
return (0, caws_kernel_1.ok)({ active, archived });
|
|
485
|
+
}
|
|
486
|
+
/** Find a spec by id under active or archive locations. */
|
|
487
|
+
function showSpec(cawsDir, id) {
|
|
488
|
+
const idValidation = validateSpecId(id);
|
|
489
|
+
if (!idValidation.ok)
|
|
490
|
+
return idValidation;
|
|
491
|
+
const fullPath = findSpecPath(cawsDir, id);
|
|
492
|
+
if (fullPath === null) {
|
|
493
|
+
return (0, caws_kernel_1.err)((0, repo_root_1.storeDiagnostic)(rules_1.STORE_RULES.LIFECYCLE_PLAN_REJECTED, `Spec "${id}" not found in .caws/specs/ or .caws/specs/.archive/.`, { subject: id }));
|
|
494
|
+
}
|
|
495
|
+
const sourceResult = (0, yaml_store_1.readYamlSource)(fullPath);
|
|
496
|
+
if (!(0, caws_kernel_1.isOk)(sourceResult))
|
|
497
|
+
return (0, caws_kernel_1.err)(sourceResult.errors);
|
|
498
|
+
const parsed = (0, caws_kernel_1.parseAndValidateSpec)(sourceResult.value);
|
|
499
|
+
if (!(0, caws_kernel_1.isOk)(parsed))
|
|
500
|
+
return (0, caws_kernel_1.err)(parsed.errors);
|
|
501
|
+
return (0, caws_kernel_1.ok)({ spec: parsed.value, path: fullPath, source: sourceResult.value });
|
|
502
|
+
}
|
|
503
|
+
// Unused import elimination: surface appendEvent so future direct-event
|
|
504
|
+
// flows (if any) compile against the same surface as evidence/waiver.
|
|
505
|
+
void events_store_1.appendEvent;
|
|
506
|
+
//# sourceMappingURL=specs-writer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"specs-writer.js","sourceRoot":"","sources":["../../src/store/specs-writer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import type { AgentRegistry, ChainedEvent, Diagnostic, Policy, Spec, Waiver, WorktreeRegistry } from '@paths.design/caws-kernel';
|
|
2
|
+
export interface SpecsLoadResult {
|
|
3
|
+
/** Specs that parsed AND validated. Safe to hand to the kernel. */
|
|
4
|
+
readonly specs: readonly Spec[];
|
|
5
|
+
/**
|
|
6
|
+
* Per-file diagnostics from parse/validate. Includes:
|
|
7
|
+
* - kernel diagnostics for individual spec files that failed
|
|
8
|
+
* - store diagnostics for unreadable/skipped files
|
|
9
|
+
* - store diagnostics for duplicate spec ids
|
|
10
|
+
*/
|
|
11
|
+
readonly diagnostics: readonly Diagnostic[];
|
|
12
|
+
}
|
|
13
|
+
export interface PolicyLoadResult {
|
|
14
|
+
/** Undefined when no policy.yaml exists or the file failed to parse. */
|
|
15
|
+
readonly policy?: Policy;
|
|
16
|
+
/** Non-fatal diagnostics from the kernel's policy semantics layer. */
|
|
17
|
+
readonly warnings: readonly Diagnostic[];
|
|
18
|
+
/** Fatal diagnostics — when present, `policy` is undefined. */
|
|
19
|
+
readonly errors: readonly Diagnostic[];
|
|
20
|
+
}
|
|
21
|
+
export interface EventsLoadResult {
|
|
22
|
+
/** Successfully parsed chained events. */
|
|
23
|
+
readonly events: readonly ChainedEvent[];
|
|
24
|
+
/**
|
|
25
|
+
* Non-fatal diagnostics. Only one kind is currently emitted here:
|
|
26
|
+
* `store.events.trailing_partial_line` when the last line was incomplete
|
|
27
|
+
* (crash-recovery tolerance).
|
|
28
|
+
*/
|
|
29
|
+
readonly warnings: readonly Diagnostic[];
|
|
30
|
+
}
|
|
31
|
+
export interface StoreSnapshot {
|
|
32
|
+
readonly repoRoot: string;
|
|
33
|
+
readonly cawsDir: string;
|
|
34
|
+
/** Specs that parsed AND validated. */
|
|
35
|
+
readonly specs: readonly Spec[];
|
|
36
|
+
/** Per-file diagnostics from loadSpecs. */
|
|
37
|
+
readonly specDiagnostics: readonly Diagnostic[];
|
|
38
|
+
/** Parsed policy if present. */
|
|
39
|
+
readonly policy?: Policy;
|
|
40
|
+
/** Non-fatal diagnostics from the policy kernel. */
|
|
41
|
+
readonly policyWarnings: readonly Diagnostic[];
|
|
42
|
+
/** Fatal diagnostics that prevented policy loading. */
|
|
43
|
+
readonly policyErrors: readonly Diagnostic[];
|
|
44
|
+
readonly worktrees: WorktreeRegistry;
|
|
45
|
+
readonly agents: AgentRegistry;
|
|
46
|
+
readonly events: readonly ChainedEvent[];
|
|
47
|
+
readonly eventWarnings: readonly Diagnostic[];
|
|
48
|
+
/** Waivers that parsed AND validated (slice 7a.5). */
|
|
49
|
+
readonly waivers: readonly Waiver[];
|
|
50
|
+
/** Per-file load diagnostics from loadWaivers (slice 7a.5). */
|
|
51
|
+
readonly waiverDiagnostics: readonly Diagnostic[];
|
|
52
|
+
/**
|
|
53
|
+
* Presence of legacy single-spec / pre-vNext artifacts inside `.caws/`.
|
|
54
|
+
* Doctor surfaces these as errors — vNext init refuses to bootstrap
|
|
55
|
+
* over them, and live projects should retire them.
|
|
56
|
+
*/
|
|
57
|
+
readonly initResidue: {
|
|
58
|
+
readonly workingSpecYaml: boolean;
|
|
59
|
+
readonly workingSpecSchemaJson: boolean;
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* Existence facts for each canonical vNext path. Doctor needs these
|
|
63
|
+
* to surface "canonical layout drift" (e.g. specs/ dir missing on a
|
|
64
|
+
* live project). `eventsJsonlExists` is reported but never required:
|
|
65
|
+
* the first append creates it under lock.
|
|
66
|
+
*/
|
|
67
|
+
readonly filesystem: {
|
|
68
|
+
readonly cawsDirExists: boolean;
|
|
69
|
+
readonly specsDirExists: boolean;
|
|
70
|
+
readonly waiversDirExists: boolean;
|
|
71
|
+
readonly policyYamlExists: boolean;
|
|
72
|
+
readonly worktreesJsonExists: boolean;
|
|
73
|
+
readonly agentsJsonExists: boolean;
|
|
74
|
+
readonly eventsJsonlExists: boolean;
|
|
75
|
+
};
|
|
76
|
+
/**
|
|
77
|
+
* Diagnostics from worktrees.json / agents.json load failures that
|
|
78
|
+
* the previous shape silently swallowed (the snapshot fell back to
|
|
79
|
+
* `{}` on Err). Doctor needs to see these to flag "registry file is
|
|
80
|
+
* malformed" without treating registry absence as drift.
|
|
81
|
+
*/
|
|
82
|
+
readonly registryDiagnostics: readonly Diagnostic[];
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/store/types.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EACV,aAAa,EACb,YAAY,EACZ,UAAU,EACV,MAAM,EACN,IAAI,EACJ,MAAM,EACN,gBAAgB,EACjB,MAAM,2BAA2B,CAAC;AAMnC,MAAM,WAAW,eAAe;IAC9B,mEAAmE;IACnE,QAAQ,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;IAChC;;;;;OAKG;IACH,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,CAAC;CAC7C;AAMD,MAAM,WAAW,gBAAgB;IAC/B,wEAAwE;IACxE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,sEAAsE;IACtE,QAAQ,CAAC,QAAQ,EAAE,SAAS,UAAU,EAAE,CAAC;IACzC,+DAA+D;IAC/D,QAAQ,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,CAAC;CACxC;AAMD,MAAM,WAAW,gBAAgB;IAC/B,0CAA0C;IAC1C,QAAQ,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC;IACzC;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,EAAE,SAAS,UAAU,EAAE,CAAC;CAC1C;AAWD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,uCAAuC;IACvC,QAAQ,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;IAChC,2CAA2C;IAC3C,QAAQ,CAAC,eAAe,EAAE,SAAS,UAAU,EAAE,CAAC;IAChD,gCAAgC;IAChC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,oDAAoD;IACpD,QAAQ,CAAC,cAAc,EAAE,SAAS,UAAU,EAAE,CAAC;IAC/C,uDAAuD;IACvD,QAAQ,CAAC,YAAY,EAAE,SAAS,UAAU,EAAE,CAAC;IAC7C,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC;IACzC,QAAQ,CAAC,aAAa,EAAE,SAAS,UAAU,EAAE,CAAC;IAC9C,sDAAsD;IACtD,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,+DAA+D;IAC/D,QAAQ,CAAC,iBAAiB,EAAE,SAAS,UAAU,EAAE,CAAC;IAUlD;;;;OAIG;IACH,QAAQ,CAAC,WAAW,EAAE;QACpB,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;QAClC,QAAQ,CAAC,qBAAqB,EAAE,OAAO,CAAC;KACzC,CAAC;IAEF;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,EAAE;QACnB,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;QAChC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;QACjC,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;QACnC,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;QACnC,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;QACtC,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;QACnC,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;KACrC,CAAC;IAEF;;;;;OAKG;IACH,QAAQ,CAAC,mBAAmB,EAAE,SAAS,UAAU,EAAE,CAAC;CACrD"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Node-only store types.
|
|
3
|
+
//
|
|
4
|
+
// The store layer is the bridge between the filesystem and the pure
|
|
5
|
+
// kernel. It loads state, delegates validation to the kernel, and returns
|
|
6
|
+
// either parsed values or structured Diagnostics.
|
|
7
|
+
//
|
|
8
|
+
// Discipline:
|
|
9
|
+
// - The store never invents new validation rules. It parses and forwards.
|
|
10
|
+
// - The store distinguishes "missing file" (often a recoverable Ok) from
|
|
11
|
+
// "malformed file" (always Err).
|
|
12
|
+
// - Programmer errors throw; user/repo errors return Result.
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/store/types.ts"],"names":[],"mappings":";AAAA,yBAAyB;AACzB,EAAE;AACF,oEAAoE;AACpE,0EAA0E;AAC1E,kDAAkD;AAClD,EAAE;AACF,cAAc;AACd,4EAA4E;AAC5E,2EAA2E;AAC3E,qCAAqC;AACrC,+DAA+D"}
|