@paths.design/caws-cli 11.0.0 → 11.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/README.md +2 -2
  2. package/dist/index.js +2 -2
  3. package/dist/init/harness-detect.d.ts +18 -0
  4. package/dist/init/harness-detect.d.ts.map +1 -0
  5. package/dist/init/harness-detect.js +90 -0
  6. package/dist/init/harness-detect.js.map +1 -0
  7. package/dist/init/hook-install.d.ts +53 -0
  8. package/dist/init/hook-install.d.ts.map +1 -0
  9. package/dist/init/hook-install.js +421 -0
  10. package/dist/init/hook-install.js.map +1 -0
  11. package/dist/init/hook-packs/manifest-claude-code.d.ts +4 -0
  12. package/dist/init/hook-packs/manifest-claude-code.d.ts.map +1 -0
  13. package/dist/init/hook-packs/manifest-claude-code.js +190 -0
  14. package/dist/init/hook-packs/manifest-claude-code.js.map +1 -0
  15. package/dist/init/hook-packs/register.d.ts +19 -0
  16. package/dist/init/hook-packs/register.d.ts.map +1 -0
  17. package/dist/init/hook-packs/register.js +37 -0
  18. package/dist/init/hook-packs/register.js.map +1 -0
  19. package/dist/init/hook-packs/types.d.ts +123 -0
  20. package/dist/init/hook-packs/types.d.ts.map +1 -0
  21. package/dist/init/hook-packs/types.js +29 -0
  22. package/dist/init/hook-packs/types.js.map +1 -0
  23. package/dist/shell/commands/gates.d.ts.map +1 -1
  24. package/dist/shell/commands/gates.js +28 -1
  25. package/dist/shell/commands/gates.js.map +1 -1
  26. package/dist/shell/commands/init.d.ts +9 -0
  27. package/dist/shell/commands/init.d.ts.map +1 -1
  28. package/dist/shell/commands/init.js +131 -27
  29. package/dist/shell/commands/init.js.map +1 -1
  30. package/dist/shell/commands/specs.d.ts +41 -0
  31. package/dist/shell/commands/specs.d.ts.map +1 -0
  32. package/dist/shell/commands/specs.js +264 -0
  33. package/dist/shell/commands/specs.js.map +1 -0
  34. package/dist/shell/commands/worktree.d.ts +38 -0
  35. package/dist/shell/commands/worktree.d.ts.map +1 -0
  36. package/dist/shell/commands/worktree.js +286 -0
  37. package/dist/shell/commands/worktree.js.map +1 -0
  38. package/dist/shell/gates/disposition.d.ts.map +1 -1
  39. package/dist/shell/gates/disposition.js +33 -3
  40. package/dist/shell/gates/disposition.js.map +1 -1
  41. package/dist/shell/gates/local-evaluators/budget-limit.d.ts +24 -0
  42. package/dist/shell/gates/local-evaluators/budget-limit.d.ts.map +1 -0
  43. package/dist/shell/gates/local-evaluators/budget-limit.js +67 -0
  44. package/dist/shell/gates/local-evaluators/budget-limit.js.map +1 -0
  45. package/dist/shell/gates/local-evaluators/diff-helpers.d.ts +25 -0
  46. package/dist/shell/gates/local-evaluators/diff-helpers.d.ts.map +1 -0
  47. package/dist/shell/gates/local-evaluators/diff-helpers.js +74 -0
  48. package/dist/shell/gates/local-evaluators/diff-helpers.js.map +1 -0
  49. package/dist/shell/gates/local-evaluators/index.d.ts +28 -0
  50. package/dist/shell/gates/local-evaluators/index.d.ts.map +1 -0
  51. package/dist/shell/gates/local-evaluators/index.js +67 -0
  52. package/dist/shell/gates/local-evaluators/index.js.map +1 -0
  53. package/dist/shell/gates/local-evaluators/scope-boundary.d.ts +23 -0
  54. package/dist/shell/gates/local-evaluators/scope-boundary.d.ts.map +1 -0
  55. package/dist/shell/gates/local-evaluators/scope-boundary.js +67 -0
  56. package/dist/shell/gates/local-evaluators/scope-boundary.js.map +1 -0
  57. package/dist/shell/gates/local-evaluators/spec-completeness.d.ts +12 -0
  58. package/dist/shell/gates/local-evaluators/spec-completeness.d.ts.map +1 -0
  59. package/dist/shell/gates/local-evaluators/spec-completeness.js +73 -0
  60. package/dist/shell/gates/local-evaluators/spec-completeness.js.map +1 -0
  61. package/dist/shell/index.d.ts +4 -0
  62. package/dist/shell/index.d.ts.map +1 -1
  63. package/dist/shell/index.js +13 -1
  64. package/dist/shell/index.js.map +1 -1
  65. package/dist/shell/register.d.ts.map +1 -1
  66. package/dist/shell/register.js +192 -2
  67. package/dist/shell/register.js.map +1 -1
  68. package/dist/shell/render/init-hook-pack.d.ts +16 -0
  69. package/dist/shell/render/init-hook-pack.d.ts.map +1 -0
  70. package/dist/shell/render/init-hook-pack.js +206 -0
  71. package/dist/shell/render/init-hook-pack.js.map +1 -0
  72. package/dist/store/atomic-write.d.ts +20 -2
  73. package/dist/store/atomic-write.d.ts.map +1 -1
  74. package/dist/store/atomic-write.js +44 -2
  75. package/dist/store/atomic-write.js.map +1 -1
  76. package/dist/store/lifecycle-lock.d.ts +34 -0
  77. package/dist/store/lifecycle-lock.d.ts.map +1 -0
  78. package/dist/store/lifecycle-lock.js +168 -0
  79. package/dist/store/lifecycle-lock.js.map +1 -0
  80. package/dist/store/lifecycle-transaction.d.ts +79 -0
  81. package/dist/store/lifecycle-transaction.d.ts.map +1 -0
  82. package/dist/store/lifecycle-transaction.js +319 -0
  83. package/dist/store/lifecycle-transaction.js.map +1 -0
  84. package/dist/store/rules.d.ts +16 -0
  85. package/dist/store/rules.d.ts.map +1 -1
  86. package/dist/store/rules.js +17 -0
  87. package/dist/store/rules.js.map +1 -1
  88. package/dist/store/specs-writer.d.ts +61 -0
  89. package/dist/store/specs-writer.d.ts.map +1 -0
  90. package/dist/store/specs-writer.js +506 -0
  91. package/dist/store/specs-writer.js.map +1 -0
  92. package/dist/store/worktrees-writer.d.ts +77 -0
  93. package/dist/store/worktrees-writer.d.ts.map +1 -0
  94. package/dist/store/worktrees-writer.js +674 -0
  95. package/dist/store/worktrees-writer.js.map +1 -0
  96. package/dist/store/yaml-patch.d.ts +7 -0
  97. package/dist/store/yaml-patch.d.ts.map +1 -0
  98. package/dist/store/yaml-patch.js +250 -0
  99. package/dist/store/yaml-patch.js.map +1 -0
  100. package/package.json +7 -4
  101. package/templates/hook-packs/claude-code/CLAUDE.md +172 -0
  102. package/templates/hook-packs/claude-code/audit.sh +121 -0
  103. package/templates/hook-packs/claude-code/block-dangerous.sh +158 -0
  104. package/templates/hook-packs/claude-code/classify_command.py +1064 -0
  105. package/templates/hook-packs/claude-code/dispatch/post_tool_use.sh +63 -0
  106. package/templates/hook-packs/claude-code/dispatch/pre_tool_use.sh +50 -0
  107. package/templates/hook-packs/claude-code/dispatch/session_start.sh +41 -0
  108. package/templates/hook-packs/claude-code/dispatch/stop.sh +37 -0
  109. package/templates/hook-packs/claude-code/guard-strikes.sh +140 -0
  110. package/templates/hook-packs/claude-code/lib/parse-input.sh +127 -0
  111. package/templates/hook-packs/claude-code/lib/run-handlers.sh +212 -0
  112. package/templates/hook-packs/claude-code/reset-danger-latch.sh +21 -0
  113. package/templates/hook-packs/claude-code/reset-strikes.sh +243 -0
  114. package/templates/hook-packs/claude-code/runtime-paths.sh +80 -0
  115. package/templates/hook-packs/claude-code/scope-guard.sh +392 -0
  116. package/templates/hook-packs/claude-code/session-caws-status.sh +171 -0
  117. package/templates/hook-packs/claude-code/session-log.sh +180 -0
  118. package/templates/hook-packs/claude-code/worktree-guard.sh +240 -0
  119. package/templates/hook-packs/claude-code/worktree-write-guard.sh +77 -0
package/README.md CHANGED
@@ -1,8 +1,8 @@
1
1
  # @paths.design/caws-cli
2
2
 
3
- **CAWS CLI v11.0.0 — the governed core for the Coding Agent Workflow System.**
3
+ **CAWS CLI v11.0.0 — the governed core for the Coding Agent Working Standard.**
4
4
 
5
- CAWS (Coding Agent Workflow System) gives coding agents a deterministic
5
+ CAWS (Coding Agent Working Standard) gives coding agents a deterministic
6
6
  substrate for project state, scope, claims, gates, waivers, and audit
7
7
  evidence. v11.0.0 is a ground-up rewrite around a pure kernel, an I/O
8
8
  store, and a thin shell. It replaces v10.x.
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  /**
4
- * @fileoverview CAWS CLI - Scaffolding tool for Coding Agent Workflow System
4
+ * @fileoverview CAWS CLI - Scaffolding tool for Coding Agent Working Standard
5
5
  * Provides commands to initialize new projects and scaffold existing ones with CAWS.
6
6
  * Includes spec management, quality gates, and AI-assisted development workflows.
7
7
  * @author @darianrosebrook
@@ -39,7 +39,7 @@ const program = new Command();
39
39
 
40
40
  program
41
41
  .name('caws')
42
- .description('CAWS - Coding Agent Workflow System CLI')
42
+ .description('CAWS - Coding Agent Working Standard CLI')
43
43
  .version(CLI_VERSION)
44
44
  .showHelpAfterError(false);
45
45
 
@@ -0,0 +1,18 @@
1
+ import type { AgentSurface } from './hook-packs/types';
2
+ export type HarnessDetectionResult = {
3
+ readonly kind: 'single';
4
+ readonly surface: Exclude<AgentSurface, 'none'>;
5
+ } | {
6
+ readonly kind: 'ambiguous';
7
+ readonly candidates: readonly Exclude<AgentSurface, 'none'>[];
8
+ } | {
9
+ readonly kind: 'none';
10
+ };
11
+ /**
12
+ * Detect the harness(es) in use in `repoRoot`.
13
+ *
14
+ * Returns `single` when exactly one harness has signals, `ambiguous`
15
+ * when multiple do, and `none` when no harness signal is present.
16
+ */
17
+ export declare function detectAgentHarness(repoRoot: string): HarnessDetectionResult;
18
+ //# sourceMappingURL=harness-detect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness-detect.d.ts","sourceRoot":"","sources":["../../src/init/harness-detect.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,MAAM,sBAAsB,GAC9B;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC,CAAA;CAAE,GAC5E;IACE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,SAAS,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC,EAAE,CAAC;CAC/D,GACD;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AA6B9B;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,sBAAsB,CAc3E"}
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ // Detect which agent harness is in use for a given repo, so `caws init`
3
+ // can suggest or auto-select an appropriate hook pack.
4
+ //
5
+ // Detection is intentionally simple: filesystem signals only, no
6
+ // process introspection. False negatives (the user has the harness but
7
+ // the signal file isn't present yet) are expected and acceptable — the
8
+ // caller can always pass --agent-surface explicitly.
9
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ var desc = Object.getOwnPropertyDescriptor(m, k);
12
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
13
+ desc = { enumerable: true, get: function() { return m[k]; } };
14
+ }
15
+ Object.defineProperty(o, k2, desc);
16
+ }) : (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ o[k2] = m[k];
19
+ }));
20
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
22
+ }) : function(o, v) {
23
+ o["default"] = v;
24
+ });
25
+ var __importStar = (this && this.__importStar) || (function () {
26
+ var ownKeys = function(o) {
27
+ ownKeys = Object.getOwnPropertyNames || function (o) {
28
+ var ar = [];
29
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
30
+ return ar;
31
+ };
32
+ return ownKeys(o);
33
+ };
34
+ return function (mod) {
35
+ if (mod && mod.__esModule) return mod;
36
+ var result = {};
37
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
38
+ __setModuleDefault(result, mod);
39
+ return result;
40
+ };
41
+ })();
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ exports.detectAgentHarness = detectAgentHarness;
44
+ const fs = __importStar(require("fs"));
45
+ const path = __importStar(require("path"));
46
+ const SIGNALS = [
47
+ {
48
+ surface: 'claude-code',
49
+ markers: ['.claude', '.claude/settings.json', '.claude/hooks'],
50
+ },
51
+ {
52
+ surface: 'cursor',
53
+ markers: ['.cursor', '.cursor/settings.json', '.cursor/rules'],
54
+ },
55
+ {
56
+ surface: 'windsurf',
57
+ markers: ['.windsurf', '.windsurf/settings.json'],
58
+ },
59
+ ];
60
+ function anyMarkerExists(repoRoot, markers) {
61
+ for (const m of markers) {
62
+ if (fs.existsSync(path.join(repoRoot, m)))
63
+ return true;
64
+ }
65
+ return false;
66
+ }
67
+ /**
68
+ * Detect the harness(es) in use in `repoRoot`.
69
+ *
70
+ * Returns `single` when exactly one harness has signals, `ambiguous`
71
+ * when multiple do, and `none` when no harness signal is present.
72
+ */
73
+ function detectAgentHarness(repoRoot) {
74
+ const present = [];
75
+ for (const signal of SIGNALS) {
76
+ if (anyMarkerExists(repoRoot, signal.markers)) {
77
+ present.push(signal.surface);
78
+ }
79
+ }
80
+ if (present.length === 0)
81
+ return { kind: 'none' };
82
+ if (present.length === 1) {
83
+ const surface = present[0];
84
+ if (surface === undefined)
85
+ return { kind: 'none' };
86
+ return { kind: 'single', surface };
87
+ }
88
+ return { kind: 'ambiguous', candidates: present };
89
+ }
90
+ //# sourceMappingURL=harness-detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness-detect.js","sourceRoot":"","sources":["../../src/init/harness-detect.ts"],"names":[],"mappings":";AAAA,wEAAwE;AACxE,uDAAuD;AACvD,EAAE;AACF,iEAAiE;AACjE,uEAAuE;AACvE,uEAAuE;AACvE,qDAAqD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgDrD,gDAcC;AA5DD,uCAAyB;AACzB,2CAA6B;AAiB7B,MAAM,OAAO,GAA6B;IACxC;QACE,OAAO,EAAE,aAAa;QACtB,OAAO,EAAE,CAAC,SAAS,EAAE,uBAAuB,EAAE,eAAe,CAAC;KAC/D;IACD;QACE,OAAO,EAAE,QAAQ;QACjB,OAAO,EAAE,CAAC,SAAS,EAAE,uBAAuB,EAAE,eAAe,CAAC;KAC/D;IACD;QACE,OAAO,EAAE,UAAU;QACnB,OAAO,EAAE,CAAC,WAAW,EAAE,yBAAyB,CAAC;KAClD;CACF,CAAC;AAEF,SAAS,eAAe,CAAC,QAAgB,EAAE,OAA0B;IACnE,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;IACzD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,SAAgB,kBAAkB,CAAC,QAAgB;IACjD,MAAM,OAAO,GAAoC,EAAE,CAAC;IACpD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9C,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAClD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QACnD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IACrC,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;AACpD,CAAC"}
@@ -0,0 +1,53 @@
1
+ import type { HookPackInstallResult, HookPackV1, ManagedHeader } from './hook-packs/types';
2
+ /** Parse a managed header from file content. Returns null when not
3
+ * present. Tolerant of leading shebang and of `<!--`/`-->`-style
4
+ * comment wrappers (for Markdown). */
5
+ export declare function parseManagedHeader(content: string): ManagedHeader | null;
6
+ export interface HookPackInstallOptions {
7
+ readonly repoRoot: string;
8
+ /** When true, allow overwriting unmanaged or drifted files. */
9
+ readonly overwrite?: boolean;
10
+ /** When true, leave drifted/unmanaged files in place and report. */
11
+ readonly adopt?: boolean;
12
+ /** Override the pack template root (used by tests). */
13
+ readonly packRootOverride?: string;
14
+ }
15
+ /** Install a pack into repoRoot. Pure with respect to its inputs except
16
+ * for the filesystem writes it performs. Returns a typed result the
17
+ * caller renders. */
18
+ export declare function installHookPack(pack: HookPackV1, options: HookPackInstallOptions): HookPackInstallResult;
19
+ /** Result of inspecting `.claude/settings.json` for hook wiring. */
20
+ export type SettingsWiringStatus =
21
+ /** settings.json is absent. Caller should print the canonical snippet
22
+ * and instruct the user to create the file. */
23
+ {
24
+ readonly kind: 'absent';
25
+ }
26
+ /** settings.json exists and references all four canonical dispatch
27
+ * entrypoints. No action needed. */
28
+ | {
29
+ readonly kind: 'wired';
30
+ }
31
+ /** settings.json exists but is missing one or more canonical entries.
32
+ * Caller should print which entries are missing and the snippet to add. */
33
+ | {
34
+ readonly kind: 'partial';
35
+ readonly missing: readonly string[];
36
+ }
37
+ /** settings.json exists but could not be parsed as JSON. Caller should
38
+ * surface the parse error and refuse to suggest changes. */
39
+ | {
40
+ readonly kind: 'invalid';
41
+ readonly error: string;
42
+ };
43
+ /**
44
+ * Inspect `.claude/settings.json` and report whether the canonical
45
+ * Claude Code hook wiring is present. Install is non-destructive on
46
+ * settings.json — this function just surfaces the state so the CLI can
47
+ * tell the user exactly what to add.
48
+ */
49
+ export declare function inspectClaudeSettings(repoRoot: string): SettingsWiringStatus;
50
+ /** Canonical settings.json wiring snippet, returned as a JSON string
51
+ * ready to print or copy. Mirrors the snippet in CLAUDE.md. */
52
+ export declare const CANONICAL_SETTINGS_SNIPPET: string;
53
+ //# sourceMappingURL=hook-install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-install.d.ts","sourceRoot":"","sources":["../../src/init/hook-install.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAGV,qBAAqB,EACrB,UAAU,EAEV,aAAa,EACd,MAAM,oBAAoB,CAAC;AAgC5B;;uCAEuC;AACvC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAmExE;AAoED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,+DAA+D;IAC/D,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,oEAAoE;IACpE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,uDAAuD;IACvD,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CACpC;AAsFD;;sBAEsB;AACtB,wBAAgB,eAAe,CAC7B,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,sBAAsB,GAC9B,qBAAqB,CAyCvB;AAED,oEAAoE;AACpE,MAAM,MAAM,oBAAoB;AAC9B;gDACgD;AAC9C;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE;AAC7B;qCACqC;GACnC;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE;AAC5B;4EAC4E;GAC1E;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE;AACnE;6DAC6D;GAC3D;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,GACf,oBAAoB,CAoDtB;AAED;gEACgE;AAChE,eAAO,MAAM,0BAA0B,QAyDtC,CAAC"}
@@ -0,0 +1,421 @@
1
+ "use strict";
2
+ // Hook-pack install logic. Managed-marker aware; non-destructive by default.
3
+ //
4
+ // Install policy:
5
+ // - absent → create the file from the pack's bundled template.
6
+ // - managed_clean → no-op (same pack/version, content matches).
7
+ // - managed_old_version → update (replace with new bundled content).
8
+ // - managed_drift → refuse unless adopt/overwrite is passed.
9
+ // - unmanaged_collision → refuse unless adopt/overwrite is passed.
10
+ //
11
+ // settings.json is intentionally NOT in the pack manifest. If a user
12
+ // already has .claude/settings.json, this module surfaces the canonical
13
+ // wiring snippet for them to merge by hand. If they have no settings.json,
14
+ // it emits the snippet to put into a new file.
15
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ var desc = Object.getOwnPropertyDescriptor(m, k);
18
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
19
+ desc = { enumerable: true, get: function() { return m[k]; } };
20
+ }
21
+ Object.defineProperty(o, k2, desc);
22
+ }) : (function(o, m, k, k2) {
23
+ if (k2 === undefined) k2 = k;
24
+ o[k2] = m[k];
25
+ }));
26
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
27
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
28
+ }) : function(o, v) {
29
+ o["default"] = v;
30
+ });
31
+ var __importStar = (this && this.__importStar) || (function () {
32
+ var ownKeys = function(o) {
33
+ ownKeys = Object.getOwnPropertyNames || function (o) {
34
+ var ar = [];
35
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
36
+ return ar;
37
+ };
38
+ return ownKeys(o);
39
+ };
40
+ return function (mod) {
41
+ if (mod && mod.__esModule) return mod;
42
+ var result = {};
43
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
44
+ __setModuleDefault(result, mod);
45
+ return result;
46
+ };
47
+ })();
48
+ Object.defineProperty(exports, "__esModule", { value: true });
49
+ exports.CANONICAL_SETTINGS_SNIPPET = void 0;
50
+ exports.parseManagedHeader = parseManagedHeader;
51
+ exports.installHookPack = installHookPack;
52
+ exports.inspectClaudeSettings = inspectClaudeSettings;
53
+ const fs = __importStar(require("fs"));
54
+ const path = __importStar(require("path"));
55
+ /** Location of the pack templates relative to the caws-cli package root.
56
+ * Resolved at runtime from __dirname so it works both in dev (running
57
+ * ts-node against src/) and from the dist build. */
58
+ function packTemplateRoot(packId) {
59
+ // The templates live alongside the built dist/ at the package root.
60
+ // From dist/, walk up to the package root and down into templates.
61
+ // From src/init/hook-install.ts ts-node mode, the same walk works.
62
+ // We tolerate both: src/init -> package root is two levels up;
63
+ // dist -> package root is one level up.
64
+ const here = __dirname;
65
+ const candidates = [
66
+ path.resolve(here, '..', '..', 'templates', 'hook-packs', packId),
67
+ path.resolve(here, '..', 'templates', 'hook-packs', packId),
68
+ path.resolve(here, '..', '..', '..', 'templates', 'hook-packs', packId),
69
+ ];
70
+ for (const c of candidates) {
71
+ if (fs.existsSync(c))
72
+ return c;
73
+ }
74
+ // Fall through to the first candidate even if missing; downstream will
75
+ // emit a clean "template file missing" diagnostic.
76
+ return candidates[0] ?? '';
77
+ }
78
+ // ─── Managed header parsing ──────────────────────────────────────────────
79
+ /** Match a managed-header block at the top of a file. The block consists
80
+ * of consecutive `# CAWS-...` lines after an optional shebang or
81
+ * HTML/JSDoc comment opener. */
82
+ const HEADER_MARKER = 'CAWS-MANAGED-HOOK';
83
+ /** Parse a managed header from file content. Returns null when not
84
+ * present. Tolerant of leading shebang and of `<!--`/`-->`-style
85
+ * comment wrappers (for Markdown). */
86
+ function parseManagedHeader(content) {
87
+ // Search the first ~30 lines for the marker. This is large enough to
88
+ // tolerate shebang + HTML comment wrapper but small enough to stay
89
+ // fast on big files.
90
+ const lines = content.split('\n').slice(0, 30);
91
+ let inBlock = false;
92
+ let hookPack = '';
93
+ let hookPackVersion = 0;
94
+ let cawsMinMajor = 0;
95
+ let lineageRefs = [];
96
+ let sawMarker = false;
97
+ for (const raw of lines) {
98
+ const line = raw.trim().replace(/^<!--\s*/, '').replace(/\s*-->\s*$/, '');
99
+ if (!line)
100
+ continue;
101
+ if (line.includes(HEADER_MARKER)) {
102
+ sawMarker = true;
103
+ inBlock = true;
104
+ continue;
105
+ }
106
+ if (!inBlock)
107
+ continue;
108
+ // The block consists of `# key: value` lines. First non-comment
109
+ // line ends the block.
110
+ if (!line.startsWith('#'))
111
+ break;
112
+ const stripped = line.replace(/^#\s*/, '');
113
+ const colon = stripped.indexOf(':');
114
+ if (colon < 0)
115
+ continue;
116
+ const key = stripped.slice(0, colon).trim();
117
+ const value = stripped.slice(colon + 1).trim();
118
+ switch (key) {
119
+ case 'hook_pack':
120
+ hookPack = value;
121
+ break;
122
+ case 'hook_pack_version': {
123
+ const n = Number.parseInt(value, 10);
124
+ if (!Number.isNaN(n))
125
+ hookPackVersion = n;
126
+ break;
127
+ }
128
+ case 'caws_min_major': {
129
+ const n = Number.parseInt(value, 10);
130
+ if (!Number.isNaN(n))
131
+ cawsMinMajor = n;
132
+ break;
133
+ }
134
+ case 'lineage_refs': {
135
+ lineageRefs = value
136
+ .split(',')
137
+ .map((s) => s.trim())
138
+ .filter((s) => s.length > 0)
139
+ .map((s) => Number.parseInt(s, 10))
140
+ .filter((n) => !Number.isNaN(n));
141
+ break;
142
+ }
143
+ // 'do_not_edit_directly' is informational; ignored here.
144
+ }
145
+ }
146
+ if (!sawMarker || !hookPack || hookPackVersion <= 0)
147
+ return null;
148
+ return {
149
+ hookPack,
150
+ hookPackVersion,
151
+ cawsMinMajor,
152
+ lineageRefs,
153
+ };
154
+ }
155
+ // ─── Per-file state evaluation ───────────────────────────────────────────
156
+ function readBytes(p) {
157
+ try {
158
+ return fs.readFileSync(p);
159
+ }
160
+ catch {
161
+ return null;
162
+ }
163
+ }
164
+ function bytesEqual(a, b) {
165
+ if (a.length !== b.length)
166
+ return false;
167
+ return a.compare(b) === 0;
168
+ }
169
+ function evaluateFileState(repoRoot, packRoot, packId, packVersion, file) {
170
+ const destAbs = path.join(repoRoot, file.destPath);
171
+ const localBytes = readBytes(destAbs);
172
+ if (localBytes === null)
173
+ return { kind: 'absent' };
174
+ if (!file.managed) {
175
+ // Non-managed pack file (none currently exist, but we model the case).
176
+ // Treat any existing content as a collision; let the policy decide.
177
+ return { kind: 'unmanaged_collision' };
178
+ }
179
+ const localContent = localBytes.toString('utf8');
180
+ const header = parseManagedHeader(localContent);
181
+ if (!header)
182
+ return { kind: 'unmanaged_collision' };
183
+ if (header.hookPack !== packId) {
184
+ // A managed file from a different pack at our destPath. Treat as
185
+ // unmanaged collision so the user sees a clear refusal.
186
+ return { kind: 'unmanaged_collision' };
187
+ }
188
+ const sourceAbs = path.join(packRoot, file.sourcePath);
189
+ const sourceBytes = readBytes(sourceAbs);
190
+ if (sourceBytes === null) {
191
+ // Source template missing — this is a bug in the install, not a
192
+ // collision. Surface as drift so we don't silently no-op.
193
+ return { kind: 'managed_drift', header };
194
+ }
195
+ if (header.hookPackVersion < packVersion) {
196
+ return {
197
+ kind: 'managed_old_version',
198
+ header,
199
+ currentVersion: header.hookPackVersion,
200
+ };
201
+ }
202
+ if (bytesEqual(localBytes, sourceBytes)) {
203
+ return { kind: 'managed_clean', header };
204
+ }
205
+ return { kind: 'managed_drift', header };
206
+ }
207
+ function ensureDir(target) {
208
+ fs.mkdirSync(target, { recursive: true });
209
+ }
210
+ function writeFile(destAbs, sourceAbs, executable) {
211
+ ensureDir(path.dirname(destAbs));
212
+ fs.copyFileSync(sourceAbs, destAbs);
213
+ if (executable) {
214
+ try {
215
+ fs.chmodSync(destAbs, 0o755);
216
+ }
217
+ catch {
218
+ // chmod can fail on some filesystems (Windows). Non-fatal.
219
+ }
220
+ }
221
+ }
222
+ function applyOne(ctx, file) {
223
+ const destAbs = path.join(ctx.repoRoot, file.destPath);
224
+ const sourceAbs = path.join(ctx.packRoot, file.sourcePath);
225
+ const state = evaluateFileState(ctx.repoRoot, ctx.packRoot, ctx.pack.id, ctx.pack.packVersion, file);
226
+ switch (state.kind) {
227
+ case 'absent':
228
+ writeFile(destAbs, sourceAbs, file.executable);
229
+ return { destPath: file.destPath, action: 'created' };
230
+ case 'managed_clean':
231
+ return { destPath: file.destPath, action: 'unchanged' };
232
+ case 'managed_old_version':
233
+ writeFile(destAbs, sourceAbs, file.executable);
234
+ return { destPath: file.destPath, action: 'updated' };
235
+ case 'managed_drift':
236
+ if (ctx.overwrite) {
237
+ writeFile(destAbs, sourceAbs, file.executable);
238
+ return { destPath: file.destPath, action: 'updated' };
239
+ }
240
+ if (ctx.adopt) {
241
+ return { destPath: file.destPath, action: 'unchanged' };
242
+ }
243
+ return {
244
+ destPath: file.destPath,
245
+ action: 'refused',
246
+ refusalReason: 'managed_drift',
247
+ };
248
+ case 'unmanaged_collision':
249
+ if (ctx.overwrite) {
250
+ writeFile(destAbs, sourceAbs, file.executable);
251
+ return { destPath: file.destPath, action: 'updated' };
252
+ }
253
+ if (ctx.adopt) {
254
+ return { destPath: file.destPath, action: 'unchanged' };
255
+ }
256
+ return {
257
+ destPath: file.destPath,
258
+ action: 'refused',
259
+ refusalReason: 'unmanaged_collision',
260
+ };
261
+ }
262
+ }
263
+ /** Install a pack into repoRoot. Pure with respect to its inputs except
264
+ * for the filesystem writes it performs. Returns a typed result the
265
+ * caller renders. */
266
+ function installHookPack(pack, options) {
267
+ const ctx = {
268
+ repoRoot: options.repoRoot,
269
+ packRoot: options.packRootOverride ?? packTemplateRoot(pack.id),
270
+ pack,
271
+ overwrite: options.overwrite === true,
272
+ adopt: options.adopt === true,
273
+ };
274
+ const actions = [];
275
+ for (const file of pack.installedFiles) {
276
+ actions.push(applyOne(ctx, file));
277
+ }
278
+ // Determine outcome.
279
+ const anyRefused = actions.some((a) => a.action === 'refused');
280
+ const allUnchanged = actions.every((a) => a.action === 'unchanged');
281
+ let outcome;
282
+ if (anyRefused) {
283
+ // Even a single refusal blocks the outcome from being clean —
284
+ // 'installed' on partial success would imply more than was done.
285
+ // Caller reads action[].refusalReason to decide diagnostic.
286
+ outcome = 'installed';
287
+ }
288
+ else if (allUnchanged) {
289
+ outcome = 'already_installed';
290
+ }
291
+ else if (actions.some((a) => a.action === 'updated') &&
292
+ !actions.some((a) => a.action === 'created')) {
293
+ outcome = 'updated';
294
+ }
295
+ else {
296
+ outcome = 'installed';
297
+ }
298
+ return {
299
+ outcome,
300
+ pack,
301
+ actions,
302
+ activation: pack.activation,
303
+ };
304
+ }
305
+ /**
306
+ * Inspect `.claude/settings.json` and report whether the canonical
307
+ * Claude Code hook wiring is present. Install is non-destructive on
308
+ * settings.json — this function just surfaces the state so the CLI can
309
+ * tell the user exactly what to add.
310
+ */
311
+ function inspectClaudeSettings(repoRoot) {
312
+ const settingsPath = path.join(repoRoot, '.claude', 'settings.json');
313
+ if (!fs.existsSync(settingsPath)) {
314
+ return { kind: 'absent' };
315
+ }
316
+ let parsed;
317
+ try {
318
+ parsed = JSON.parse(fs.readFileSync(settingsPath, 'utf8'));
319
+ }
320
+ catch (e) {
321
+ return { kind: 'invalid', error: e.message };
322
+ }
323
+ if (!parsed || typeof parsed !== 'object') {
324
+ return { kind: 'invalid', error: 'settings.json root is not an object' };
325
+ }
326
+ const hooks = parsed.hooks;
327
+ if (!hooks || typeof hooks !== 'object') {
328
+ return {
329
+ kind: 'partial',
330
+ missing: ['PreToolUse', 'PostToolUse', 'SessionStart', 'Stop'],
331
+ };
332
+ }
333
+ const required = ['PreToolUse', 'PostToolUse', 'SessionStart', 'Stop'];
334
+ const missing = [];
335
+ for (const key of required) {
336
+ const entry = hooks[key];
337
+ if (!Array.isArray(entry) || entry.length === 0) {
338
+ missing.push(key);
339
+ continue;
340
+ }
341
+ // A canonical entry has a hook whose command path references
342
+ // .claude/hooks/dispatch/<key snake_case>.sh
343
+ const snake = key
344
+ .replace(/([a-z])([A-Z])/g, '$1_$2')
345
+ .toLowerCase();
346
+ const expectedTail = `.claude/hooks/dispatch/${snake}.sh`;
347
+ let found = false;
348
+ for (const block of entry) {
349
+ const hookList = block.hooks;
350
+ if (!Array.isArray(hookList))
351
+ continue;
352
+ for (const h of hookList) {
353
+ const cmd = h.command;
354
+ if (typeof cmd === 'string' && cmd.includes(expectedTail)) {
355
+ found = true;
356
+ break;
357
+ }
358
+ }
359
+ if (found)
360
+ break;
361
+ }
362
+ if (!found)
363
+ missing.push(key);
364
+ }
365
+ if (missing.length === 0)
366
+ return { kind: 'wired' };
367
+ return { kind: 'partial', missing };
368
+ }
369
+ /** Canonical settings.json wiring snippet, returned as a JSON string
370
+ * ready to print or copy. Mirrors the snippet in CLAUDE.md. */
371
+ exports.CANONICAL_SETTINGS_SNIPPET = JSON.stringify({
372
+ hooks: {
373
+ PreToolUse: [
374
+ {
375
+ matcher: 'Bash|Read|Write|Edit|Glob|Grep|NotebookEdit',
376
+ hooks: [
377
+ {
378
+ type: 'command',
379
+ command: '"$CLAUDE_PROJECT_DIR"/.claude/hooks/dispatch/pre_tool_use.sh',
380
+ timeout: 45,
381
+ },
382
+ ],
383
+ },
384
+ ],
385
+ PostToolUse: [
386
+ {
387
+ matcher: 'Write|Edit|Bash|ExitPlanMode',
388
+ hooks: [
389
+ {
390
+ type: 'command',
391
+ command: '"$CLAUDE_PROJECT_DIR"/.claude/hooks/dispatch/post_tool_use.sh',
392
+ timeout: 60,
393
+ },
394
+ ],
395
+ },
396
+ ],
397
+ SessionStart: [
398
+ {
399
+ hooks: [
400
+ {
401
+ type: 'command',
402
+ command: '"$CLAUDE_PROJECT_DIR"/.claude/hooks/dispatch/session_start.sh',
403
+ timeout: 30,
404
+ },
405
+ ],
406
+ },
407
+ ],
408
+ Stop: [
409
+ {
410
+ hooks: [
411
+ {
412
+ type: 'command',
413
+ command: '"$CLAUDE_PROJECT_DIR"/.claude/hooks/dispatch/stop.sh',
414
+ timeout: 30,
415
+ },
416
+ ],
417
+ },
418
+ ],
419
+ },
420
+ }, null, 2);
421
+ //# sourceMappingURL=hook-install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-install.js","sourceRoot":"","sources":["../../src/init/hook-install.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { HookPackV1 } from './types';
2
+ export declare const CLAUDE_CODE_PACK_VERSION = 2;
3
+ export declare const CLAUDE_CODE_PACK: HookPackV1;
4
+ //# sourceMappingURL=manifest-claude-code.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest-claude-code.d.ts","sourceRoot":"","sources":["../../../src/init/hook-packs/manifest-claude-code.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAO1C,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAE1C,eAAO,MAAM,gBAAgB,EAAE,UA2K9B,CAAC"}