aiwcli 0.12.6 → 0.12.7

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 (124) hide show
  1. package/bin/dev.cmd +3 -3
  2. package/bin/dev.js +16 -16
  3. package/bin/run.cmd +3 -3
  4. package/bin/run.js +21 -21
  5. package/dist/commands/branch.js +7 -2
  6. package/dist/lib/bmad-installer.js +37 -37
  7. package/dist/lib/terminal.d.ts +2 -0
  8. package/dist/lib/terminal.js +57 -7
  9. package/dist/templates/CLAUDE.md +205 -205
  10. package/dist/templates/_shared/.claude/commands/handoff-resume.md +12 -12
  11. package/dist/templates/_shared/.claude/commands/handoff.md +12 -12
  12. package/dist/templates/_shared/.claude/settings.json +65 -65
  13. package/dist/templates/_shared/.codex/workflows/handoff.md +226 -226
  14. package/dist/templates/_shared/.windsurf/workflows/handoff.md +226 -226
  15. package/dist/templates/_shared/handoff-system/CLAUDE.md +421 -421
  16. package/dist/templates/_shared/handoff-system/lib/document-generator.ts +215 -215
  17. package/dist/templates/_shared/handoff-system/lib/handoff-reader.ts +158 -158
  18. package/dist/templates/_shared/handoff-system/scripts/resume_handoff.ts +373 -373
  19. package/dist/templates/_shared/handoff-system/scripts/save_handoff.ts +469 -469
  20. package/dist/templates/_shared/handoff-system/workflows/handoff-resume.md +66 -66
  21. package/dist/templates/_shared/handoff-system/workflows/handoff.md +254 -254
  22. package/dist/templates/_shared/hooks-ts/_utils/git-state.ts +2 -2
  23. package/dist/templates/_shared/hooks-ts/archive_plan.ts +159 -159
  24. package/dist/templates/_shared/hooks-ts/context_monitor.ts +147 -147
  25. package/dist/templates/_shared/hooks-ts/file-suggestion.ts +128 -128
  26. package/dist/templates/_shared/hooks-ts/pre_compact.ts +49 -49
  27. package/dist/templates/_shared/hooks-ts/session_end.ts +196 -196
  28. package/dist/templates/_shared/hooks-ts/session_start.ts +163 -163
  29. package/dist/templates/_shared/hooks-ts/task_create_capture.ts +48 -48
  30. package/dist/templates/_shared/hooks-ts/task_update_capture.ts +74 -74
  31. package/dist/templates/_shared/hooks-ts/user_prompt_submit.ts +93 -93
  32. package/dist/templates/_shared/lib-ts/CLAUDE.md +367 -367
  33. package/dist/templates/_shared/lib-ts/base/atomic-write.ts +138 -138
  34. package/dist/templates/_shared/lib-ts/base/constants.ts +303 -303
  35. package/dist/templates/_shared/lib-ts/base/git-state.ts +58 -58
  36. package/dist/templates/_shared/lib-ts/base/hook-utils.ts +582 -582
  37. package/dist/templates/_shared/lib-ts/base/inference.ts +301 -301
  38. package/dist/templates/_shared/lib-ts/base/logger.ts +247 -247
  39. package/dist/templates/_shared/lib-ts/base/state-io.ts +202 -202
  40. package/dist/templates/_shared/lib-ts/base/stop-words.ts +184 -184
  41. package/dist/templates/_shared/lib-ts/base/utils.ts +184 -184
  42. package/dist/templates/_shared/lib-ts/context/context-formatter.ts +566 -566
  43. package/dist/templates/_shared/lib-ts/context/context-selector.ts +524 -524
  44. package/dist/templates/_shared/lib-ts/context/context-store.ts +712 -712
  45. package/dist/templates/_shared/lib-ts/context/plan-manager.ts +312 -312
  46. package/dist/templates/_shared/lib-ts/context/task-tracker.ts +185 -185
  47. package/dist/templates/_shared/lib-ts/package.json +20 -20
  48. package/dist/templates/_shared/lib-ts/templates/formatters.ts +102 -102
  49. package/dist/templates/_shared/lib-ts/templates/plan-context.ts +58 -58
  50. package/dist/templates/_shared/lib-ts/tsconfig.json +13 -13
  51. package/dist/templates/_shared/lib-ts/types.ts +186 -186
  52. package/dist/templates/_shared/scripts/resolve_context.ts +33 -33
  53. package/dist/templates/_shared/scripts/status_line.ts +690 -690
  54. package/dist/templates/cc-native/.claude/commands/cc-native/rlm/ask.md +136 -136
  55. package/dist/templates/cc-native/.claude/commands/cc-native/rlm/index.md +21 -21
  56. package/dist/templates/cc-native/.claude/commands/cc-native/rlm/overview.md +56 -56
  57. package/dist/templates/cc-native/.claude/commands/cc-native/specdev.md +10 -10
  58. package/dist/templates/cc-native/.windsurf/workflows/cc-native/fix.md +8 -8
  59. package/dist/templates/cc-native/.windsurf/workflows/cc-native/implement.md +8 -8
  60. package/dist/templates/cc-native/.windsurf/workflows/cc-native/research.md +8 -8
  61. package/dist/templates/cc-native/CC-NATIVE-README.md +189 -189
  62. package/dist/templates/cc-native/TEMPLATE-SCHEMA.md +304 -304
  63. package/dist/templates/cc-native/_cc-native/agents/CLAUDE.md +143 -143
  64. package/dist/templates/cc-native/_cc-native/agents/PLAN-ORCHESTRATOR.md +213 -213
  65. package/dist/templates/cc-native/_cc-native/agents/plan-questions/PLAN-QUESTIONER.md +70 -70
  66. package/dist/templates/cc-native/_cc-native/cc-native.config.json +96 -96
  67. package/dist/templates/cc-native/_cc-native/hooks/CLAUDE.md +247 -247
  68. package/dist/templates/cc-native/_cc-native/hooks/cc-native-plan-review.ts +76 -76
  69. package/dist/templates/cc-native/_cc-native/hooks/enhance_plan_post_subagent.ts +54 -54
  70. package/dist/templates/cc-native/_cc-native/hooks/enhance_plan_post_write.ts +51 -51
  71. package/dist/templates/cc-native/_cc-native/hooks/mark_questions_asked.ts +53 -53
  72. package/dist/templates/cc-native/_cc-native/hooks/plan_questions_early.ts +61 -61
  73. package/dist/templates/cc-native/_cc-native/lib-ts/agent-selection.ts +163 -163
  74. package/dist/templates/cc-native/_cc-native/lib-ts/aggregate-agents.ts +156 -156
  75. package/dist/templates/cc-native/_cc-native/lib-ts/artifacts/format.ts +597 -597
  76. package/dist/templates/cc-native/_cc-native/lib-ts/artifacts/index.ts +26 -26
  77. package/dist/templates/cc-native/_cc-native/lib-ts/artifacts/tracker.ts +107 -107
  78. package/dist/templates/cc-native/_cc-native/lib-ts/artifacts/write.ts +119 -119
  79. package/dist/templates/cc-native/_cc-native/lib-ts/artifacts.ts +21 -21
  80. package/dist/templates/cc-native/_cc-native/lib-ts/cc-native-state.ts +319 -319
  81. package/dist/templates/cc-native/_cc-native/lib-ts/cli-output-parser.ts +144 -144
  82. package/dist/templates/cc-native/_cc-native/lib-ts/config.ts +57 -57
  83. package/dist/templates/cc-native/_cc-native/lib-ts/constants.ts +83 -83
  84. package/dist/templates/cc-native/_cc-native/lib-ts/corroboration.ts +119 -119
  85. package/dist/templates/cc-native/_cc-native/lib-ts/debug.ts +79 -79
  86. package/dist/templates/cc-native/_cc-native/lib-ts/graduation.ts +132 -132
  87. package/dist/templates/cc-native/_cc-native/lib-ts/index.ts +116 -116
  88. package/dist/templates/cc-native/_cc-native/lib-ts/json-parser.ts +168 -168
  89. package/dist/templates/cc-native/_cc-native/lib-ts/orchestrator.ts +70 -70
  90. package/dist/templates/cc-native/_cc-native/lib-ts/output-builder.ts +130 -130
  91. package/dist/templates/cc-native/_cc-native/lib-ts/plan-discovery.ts +80 -80
  92. package/dist/templates/cc-native/_cc-native/lib-ts/plan-enhancement.ts +41 -41
  93. package/dist/templates/cc-native/_cc-native/lib-ts/plan-questions.ts +101 -101
  94. package/dist/templates/cc-native/_cc-native/lib-ts/review-pipeline.ts +511 -511
  95. package/dist/templates/cc-native/_cc-native/lib-ts/reviewers/agent.ts +71 -71
  96. package/dist/templates/cc-native/_cc-native/lib-ts/reviewers/base/base-agent.ts +217 -217
  97. package/dist/templates/cc-native/_cc-native/lib-ts/reviewers/index.ts +12 -12
  98. package/dist/templates/cc-native/_cc-native/lib-ts/reviewers/providers/claude-agent.ts +66 -66
  99. package/dist/templates/cc-native/_cc-native/lib-ts/reviewers/providers/codex-agent.ts +184 -184
  100. package/dist/templates/cc-native/_cc-native/lib-ts/reviewers/providers/gemini-agent.ts +39 -39
  101. package/dist/templates/cc-native/_cc-native/lib-ts/reviewers/providers/orchestrator-claude-agent.ts +196 -196
  102. package/dist/templates/cc-native/_cc-native/lib-ts/reviewers/schemas.ts +201 -201
  103. package/dist/templates/cc-native/_cc-native/lib-ts/reviewers/types.ts +21 -21
  104. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/CLAUDE.md +480 -480
  105. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/embedding-indexer.ts +287 -287
  106. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/hyde.ts +148 -148
  107. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/index.ts +54 -54
  108. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/logger.ts +58 -58
  109. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/ollama-client.ts +208 -208
  110. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/retrieval-pipeline.ts +460 -460
  111. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/transcript-indexer.ts +446 -446
  112. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/transcript-loader.ts +280 -280
  113. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/transcript-searcher.ts +274 -274
  114. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/types.ts +201 -201
  115. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/vector-store.ts +278 -278
  116. package/dist/templates/cc-native/_cc-native/lib-ts/settings.ts +184 -184
  117. package/dist/templates/cc-native/_cc-native/lib-ts/state.ts +275 -275
  118. package/dist/templates/cc-native/_cc-native/lib-ts/tsconfig.json +18 -18
  119. package/dist/templates/cc-native/_cc-native/lib-ts/types.ts +329 -329
  120. package/dist/templates/cc-native/_cc-native/lib-ts/verdict.ts +72 -72
  121. package/dist/templates/cc-native/_cc-native/workflows/specdev.md +9 -9
  122. package/oclif.manifest.json +1 -1
  123. package/package.json +108 -108
  124. package/dist/templates/cc-native/_cc-native/lib-ts/nul +0 -3
@@ -1,76 +1,76 @@
1
- #!/usr/bin/env bun
2
- /**
3
- * CC-Native Plan Review Hook (Thin Coordinator)
4
- *
5
- * Claude Code PreToolUse hook that intercepts ExitPlanMode and delegates
6
- * to the review pipeline for plan quality review.
7
- *
8
- * Trigger: ExitPlanMode tool use (PreToolUse)
9
- * Configuration: _cc-native/cc-native.config.json
10
- * Output: _output/cc-native/plans/{YYYY-MM-DD}/{slug}/reviews/
11
- */
12
-
13
- import {
14
- loadHookInput,
15
- runHookAsync,
16
- logDebug,
17
- logInfo,
18
- logWarn,
19
- emitContext,
20
- emitContextAndBlock,
21
- } from "../../_shared/lib-ts/base/hook-utils.js";
22
- import { isInternalCall } from "../../_shared/lib-ts/base/subprocess-utils.js";
23
- import { getProjectRoot, getAiwcliDir } from "../../_shared/lib-ts/base/constants.js";
24
- import { runReviewPipeline } from "../lib-ts/review-pipeline.js";
25
- import type { PipelineResult } from "../lib-ts/types.js";
26
-
27
- const HOOK = "cc-native-plan-review";
28
-
29
- async function main(): Promise<void> {
30
- logInfo(HOOK, "Unified hook started (PreToolUse)");
31
-
32
- if (isInternalCall()) {
33
- logDebug(HOOK, "Skipping: internal subprocess call");
34
- return;
35
- }
36
-
37
- const payload = loadHookInput();
38
- if (!payload) {
39
- logInfo(HOOK, "Skipping: Invalid JSON input");
40
- emitContext("[Plan Review Skipped] Invalid JSON input");
41
- return;
42
- }
43
-
44
- if (payload.tool_name !== "ExitPlanMode") {
45
- logDebug(HOOK, "Skipping: not ExitPlanMode");
46
- return;
47
- }
48
-
49
- const sessionId = String(payload.session_id ?? "unknown");
50
- const base = getProjectRoot(payload.cwd);
51
- const aiwcliDir = getAiwcliDir(base);
52
-
53
- const result: PipelineResult = await runReviewPipeline({
54
- sessionId,
55
- base,
56
- aiwcliDir,
57
- transcriptPath: payload.transcript_path as string | undefined,
58
- payload: payload as Record<string, unknown>,
59
- });
60
-
61
- switch (result.action) {
62
- case "skip":
63
- logInfo(HOOK, `Skipping: ${result.reason}`);
64
- emitContext(`[Plan Review Skipped] ${result.reason}`);
65
- break;
66
- case "block":
67
- emitContextAndBlock(result.contextText, result.blockReason);
68
- break;
69
- default: {
70
- const _exhaustive: never = result;
71
- logWarn(HOOK, `Unhandled pipeline action: ${(_exhaustive as { action: string }).action}`);
72
- }
73
- }
74
- }
75
-
76
- runHookAsync(main, "cc_native_plan_review");
1
+ #!/usr/bin/env bun
2
+ /**
3
+ * CC-Native Plan Review Hook (Thin Coordinator)
4
+ *
5
+ * Claude Code PreToolUse hook that intercepts ExitPlanMode and delegates
6
+ * to the review pipeline for plan quality review.
7
+ *
8
+ * Trigger: ExitPlanMode tool use (PreToolUse)
9
+ * Configuration: _cc-native/cc-native.config.json
10
+ * Output: _output/cc-native/plans/{YYYY-MM-DD}/{slug}/reviews/
11
+ */
12
+
13
+ import {
14
+ loadHookInput,
15
+ runHookAsync,
16
+ logDebug,
17
+ logInfo,
18
+ logWarn,
19
+ emitContext,
20
+ emitContextAndBlock,
21
+ } from "../../_shared/lib-ts/base/hook-utils.js";
22
+ import { isInternalCall } from "../../_shared/lib-ts/base/subprocess-utils.js";
23
+ import { getProjectRoot, getAiwcliDir } from "../../_shared/lib-ts/base/constants.js";
24
+ import { runReviewPipeline } from "../lib-ts/review-pipeline.js";
25
+ import type { PipelineResult } from "../lib-ts/types.js";
26
+
27
+ const HOOK = "cc-native-plan-review";
28
+
29
+ async function main(): Promise<void> {
30
+ logInfo(HOOK, "Unified hook started (PreToolUse)");
31
+
32
+ if (isInternalCall()) {
33
+ logDebug(HOOK, "Skipping: internal subprocess call");
34
+ return;
35
+ }
36
+
37
+ const payload = loadHookInput();
38
+ if (!payload) {
39
+ logInfo(HOOK, "Skipping: Invalid JSON input");
40
+ emitContext("[Plan Review Skipped] Invalid JSON input");
41
+ return;
42
+ }
43
+
44
+ if (payload.tool_name !== "ExitPlanMode") {
45
+ logDebug(HOOK, "Skipping: not ExitPlanMode");
46
+ return;
47
+ }
48
+
49
+ const sessionId = String(payload.session_id ?? "unknown");
50
+ const base = getProjectRoot(payload.cwd);
51
+ const aiwcliDir = getAiwcliDir(base);
52
+
53
+ const result: PipelineResult = await runReviewPipeline({
54
+ sessionId,
55
+ base,
56
+ aiwcliDir,
57
+ transcriptPath: payload.transcript_path as string | undefined,
58
+ payload: payload as Record<string, unknown>,
59
+ });
60
+
61
+ switch (result.action) {
62
+ case "skip":
63
+ logInfo(HOOK, `Skipping: ${result.reason}`);
64
+ emitContext(`[Plan Review Skipped] ${result.reason}`);
65
+ break;
66
+ case "block":
67
+ emitContextAndBlock(result.contextText, result.blockReason);
68
+ break;
69
+ default: {
70
+ const _exhaustive: never = result;
71
+ logWarn(HOOK, `Unhandled pipeline action: ${(_exhaustive as { action: string }).action}`);
72
+ }
73
+ }
74
+ }
75
+
76
+ runHookAsync(main, "cc_native_plan_review");
@@ -1,54 +1,54 @@
1
- #!/usr/bin/env bun
2
- /**
3
- * PostToolUse:Task Hook: Plan Quality Review Context
4
- *
5
- * Fires after Task tool completes with a Plan subagent. Emits plan quality review guidance
6
- * as context for the main agent to review the plan before ExitPlanMode.
7
- *
8
- * Design:
9
- * - Never blocks (all errors exit 0)
10
- * - Emits context via emitContext() — no file mutation
11
- * - Only fires for Task tool with subagent_type="Plan"
12
- */
13
-
14
- import {
15
- loadHookInput,
16
- runHook,
17
- logInfo,
18
- logDebug,
19
- emitContext,
20
- getToolInput,
21
- } from "../../_shared/lib-ts/base/hook-utils.js";
22
- import { isInternalCall } from "../../_shared/lib-ts/base/subprocess-utils.js";
23
- import { getPlanQualityReviewContext } from "../lib-ts/plan-enhancement.js";
24
-
25
- function main(): void {
26
- if (isInternalCall()) return;
27
-
28
- const payload = loadHookInput();
29
- if (!payload) {
30
- logDebug("enhance_plan_post_subagent", "No payload received");
31
- return;
32
- }
33
-
34
- // Check if this is a Task tool call
35
- if (payload.tool_name !== "Task") {
36
- logDebug("enhance_plan_post_subagent", `Skipping: tool_name is "${payload.tool_name}", not "Task"`);
37
- return;
38
- }
39
-
40
- // Check if the Task is spawning a Plan subagent
41
- const toolInput = getToolInput(payload);
42
- const subagentType = toolInput?.subagent_type;
43
- logDebug("enhance_plan_post_subagent", `subagent_type: ${subagentType ?? "undefined"}`);
44
-
45
- if (subagentType !== "Plan") {
46
- logDebug("enhance_plan_post_subagent", `Skipping: subagent_type is "${subagentType}", not "Plan"`);
47
- return;
48
- }
49
-
50
- logInfo("enhance_plan_post_subagent", "Emitting plan quality review context");
51
- emitContext(getPlanQualityReviewContext());
52
- }
53
-
54
- runHook(main, "enhance_plan_post_subagent");
1
+ #!/usr/bin/env bun
2
+ /**
3
+ * PostToolUse:Task Hook: Plan Quality Review Context
4
+ *
5
+ * Fires after Task tool completes with a Plan subagent. Emits plan quality review guidance
6
+ * as context for the main agent to review the plan before ExitPlanMode.
7
+ *
8
+ * Design:
9
+ * - Never blocks (all errors exit 0)
10
+ * - Emits context via emitContext() — no file mutation
11
+ * - Only fires for Task tool with subagent_type="Plan"
12
+ */
13
+
14
+ import {
15
+ loadHookInput,
16
+ runHook,
17
+ logInfo,
18
+ logDebug,
19
+ emitContext,
20
+ getToolInput,
21
+ } from "../../_shared/lib-ts/base/hook-utils.js";
22
+ import { isInternalCall } from "../../_shared/lib-ts/base/subprocess-utils.js";
23
+ import { getPlanQualityReviewContext } from "../lib-ts/plan-enhancement.js";
24
+
25
+ function main(): void {
26
+ if (isInternalCall()) return;
27
+
28
+ const payload = loadHookInput();
29
+ if (!payload) {
30
+ logDebug("enhance_plan_post_subagent", "No payload received");
31
+ return;
32
+ }
33
+
34
+ // Check if this is a Task tool call
35
+ if (payload.tool_name !== "Task") {
36
+ logDebug("enhance_plan_post_subagent", `Skipping: tool_name is "${payload.tool_name}", not "Task"`);
37
+ return;
38
+ }
39
+
40
+ // Check if the Task is spawning a Plan subagent
41
+ const toolInput = getToolInput(payload);
42
+ const subagentType = toolInput?.subagent_type;
43
+ logDebug("enhance_plan_post_subagent", `subagent_type: ${subagentType ?? "undefined"}`);
44
+
45
+ if (subagentType !== "Plan") {
46
+ logDebug("enhance_plan_post_subagent", `Skipping: subagent_type is "${subagentType}", not "Plan"`);
47
+ return;
48
+ }
49
+
50
+ logInfo("enhance_plan_post_subagent", "Emitting plan quality review context");
51
+ emitContext(getPlanQualityReviewContext());
52
+ }
53
+
54
+ runHook(main, "enhance_plan_post_subagent");
@@ -1,52 +1,52 @@
1
- #!/usr/bin/env bun
2
- /**
3
- * PostToolUse:Write Hook: Plan Quality Review Context
4
- *
5
- * Fires after Write tool completes. Detects writes to ~/.claude/plans/*.md files
6
- * and emits plan quality review guidance as context.
7
- *
8
- * Design:
9
- * - Never blocks (all paths exit 0)
10
- * - Uses normalized path comparison (cross-platform)
11
- * - Shares prompt logic with SubagentStop hook via plan-enhancement.ts
12
- * - Emits context via emitContext() — no file mutation
13
- */
14
-
15
- import * as os from "node:os";
1
+ #!/usr/bin/env bun
2
+ /**
3
+ * PostToolUse:Write Hook: Plan Quality Review Context
4
+ *
5
+ * Fires after Write tool completes. Detects writes to ~/.claude/plans/*.md files
6
+ * and emits plan quality review guidance as context.
7
+ *
8
+ * Design:
9
+ * - Never blocks (all paths exit 0)
10
+ * - Uses normalized path comparison (cross-platform)
11
+ * - Shares prompt logic with SubagentStop hook via plan-enhancement.ts
12
+ * - Emits context via emitContext() — no file mutation
13
+ */
14
+
15
+ import * as os from "node:os";
16
16
  import * as path from "node:path";
17
-
18
- import {
19
- loadHookInput,
20
- runHook,
21
- logInfo,
22
- emitContext,
23
- } from "../../_shared/lib-ts/base/hook-utils.js";
24
- import { isInternalCall } from "../../_shared/lib-ts/base/subprocess-utils.js";
25
- import { getPlanQualityReviewContext } from "../lib-ts/plan-enhancement.js";
26
-
27
- function main(): void {
28
- if (isInternalCall()) return;
29
-
30
- const payload = loadHookInput();
31
- if (!payload) return;
32
-
33
- const toolInput = payload.tool_input;
34
- if (!toolInput || typeof toolInput !== "object") return;
35
-
36
- const filePath = toolInput.file_path as string | undefined;
37
- if (!filePath) return;
38
-
39
- // Normalize paths for cross-platform comparison
40
- const normalizedPath = path.normalize(path.resolve(filePath));
41
- const plansDir = path.normalize(path.join(os.homedir(), ".claude", "plans"));
42
-
43
- // Check if file is a markdown file in the plans directory
44
- if (!normalizedPath.startsWith(plansDir) || !normalizedPath.endsWith(".md")) {
45
- return;
46
- }
47
-
48
- logInfo("enhance_plan_write", `Detected plan file write: ${filePath}`);
49
- emitContext(getPlanQualityReviewContext());
50
- }
51
-
52
- runHook(main, "enhance_plan_post_write");
17
+
18
+ import {
19
+ loadHookInput,
20
+ runHook,
21
+ logInfo,
22
+ emitContext,
23
+ } from "../../_shared/lib-ts/base/hook-utils.js";
24
+ import { isInternalCall } from "../../_shared/lib-ts/base/subprocess-utils.js";
25
+ import { getPlanQualityReviewContext } from "../lib-ts/plan-enhancement.js";
26
+
27
+ function main(): void {
28
+ if (isInternalCall()) return;
29
+
30
+ const payload = loadHookInput();
31
+ if (!payload) return;
32
+
33
+ const toolInput = payload.tool_input;
34
+ if (!toolInput || typeof toolInput !== "object") return;
35
+
36
+ const filePath = toolInput.file_path as string | undefined;
37
+ if (!filePath) return;
38
+
39
+ // Normalize paths for cross-platform comparison
40
+ const normalizedPath = path.normalize(path.resolve(filePath));
41
+ const plansDir = path.normalize(path.join(os.homedir(), ".claude", "plans"));
42
+
43
+ // Check if file is a markdown file in the plans directory
44
+ if (!normalizedPath.startsWith(plansDir) || !normalizedPath.endsWith(".md")) {
45
+ return;
46
+ }
47
+
48
+ logInfo("enhance_plan_write", `Detected plan file write: ${filePath}`);
49
+ emitContext(getPlanQualityReviewContext());
50
+ }
51
+
52
+ runHook(main, "enhance_plan_post_write");
@@ -1,53 +1,53 @@
1
- #!/usr/bin/env bun
2
- /**
3
- * Mark Questions Asked Hook
4
- *
5
- * Tracks when AskUserQuestion tool is used during a session.
6
- * Used by other hooks to determine if user clarification was gathered.
7
- *
8
- * Registered for:
9
- * - PostToolUse: AskUserQuestion — marks questions asked state for this session
10
- *
11
- * Fail-safe: Any error exits 0 (non-blocking).
12
- */
13
-
14
- import { getProjectRoot } from "../../_shared/lib-ts/base/constants.js";
15
- import {
16
- loadHookInput,
17
- runHook,
18
- logInfo,
19
- logDiagnostic,
20
- } from "../../_shared/lib-ts/base/hook-utils.js";
21
- import { isInternalCall } from "../../_shared/lib-ts/base/subprocess-utils.js";
22
- import { markQuestionsAsked } from "../lib-ts/cc-native-state.js";
23
-
24
- function main(): void {
25
- // Guard: skip for internal subprocess calls (prevents recursive hook execution)
26
- if (isInternalCall()) return;
27
-
28
- const payload = loadHookInput();
29
- if (!payload) return;
30
-
31
- const toolName = payload.tool_name;
32
- const hookEvent = payload.hook_event_name ?? "unknown";
33
- logDiagnostic(
34
- "add_plan_context",
35
- "receive",
36
- `tool=${toolName}, event=${hookEvent}`,
37
- { inputs: { tool_name: toolName, hook_event: hookEvent } },
38
- );
39
-
40
- const projectRoot = getProjectRoot(payload.cwd);
41
-
42
- // PostToolUse: AskUserQuestion — mark that early questions (Phase A) were asked
43
- if (toolName === "AskUserQuestion") {
44
- const sessionId = String(payload.session_id ?? "");
45
- if (sessionId) {
46
- markQuestionsAsked(sessionId, projectRoot, "early");
47
- logInfo("add_plan_context", `Marked early questions asked for session ${sessionId.slice(0, 8)}...`);
48
- }
49
-
50
- }
51
- }
52
-
53
- runHook(main, "mark_questions_asked");
1
+ #!/usr/bin/env bun
2
+ /**
3
+ * Mark Questions Asked Hook
4
+ *
5
+ * Tracks when AskUserQuestion tool is used during a session.
6
+ * Used by other hooks to determine if user clarification was gathered.
7
+ *
8
+ * Registered for:
9
+ * - PostToolUse: AskUserQuestion — marks questions asked state for this session
10
+ *
11
+ * Fail-safe: Any error exits 0 (non-blocking).
12
+ */
13
+
14
+ import { getProjectRoot } from "../../_shared/lib-ts/base/constants.js";
15
+ import {
16
+ loadHookInput,
17
+ runHook,
18
+ logInfo,
19
+ logDiagnostic,
20
+ } from "../../_shared/lib-ts/base/hook-utils.js";
21
+ import { isInternalCall } from "../../_shared/lib-ts/base/subprocess-utils.js";
22
+ import { markQuestionsAsked } from "../lib-ts/cc-native-state.js";
23
+
24
+ function main(): void {
25
+ // Guard: skip for internal subprocess calls (prevents recursive hook execution)
26
+ if (isInternalCall()) return;
27
+
28
+ const payload = loadHookInput();
29
+ if (!payload) return;
30
+
31
+ const toolName = payload.tool_name;
32
+ const hookEvent = payload.hook_event_name ?? "unknown";
33
+ logDiagnostic(
34
+ "add_plan_context",
35
+ "receive",
36
+ `tool=${toolName}, event=${hookEvent}`,
37
+ { inputs: { tool_name: toolName, hook_event: hookEvent } },
38
+ );
39
+
40
+ const projectRoot = getProjectRoot(payload.cwd);
41
+
42
+ // PostToolUse: AskUserQuestion — mark that early questions (Phase A) were asked
43
+ if (toolName === "AskUserQuestion") {
44
+ const sessionId = String(payload.session_id ?? "");
45
+ if (sessionId) {
46
+ markQuestionsAsked(sessionId, projectRoot, "early");
47
+ logInfo("add_plan_context", `Marked early questions asked for session ${sessionId.slice(0, 8)}...`);
48
+ }
49
+
50
+ }
51
+ }
52
+
53
+ runHook(main, "mark_questions_asked");
@@ -1,61 +1,61 @@
1
- #!/usr/bin/env bun
2
- /**
3
- * UserPromptSubmit hook — injects post-exploration clarification prompt in plan mode.
4
- *
5
- * After explore agents finish examining the codebase, injects a system-reminder
6
- * telling Claude to ask clarification questions via AskUserQuestion to narrow
7
- * the approach before drafting the plan.
8
- *
9
- * Skips if questions were already asked this session.
10
- */
11
-
12
- import { getProjectRoot } from "../../_shared/lib-ts/base/constants.js";
13
- import { loadHookInput, runHook, logDebug, logInfo, emitContext } from "../../_shared/lib-ts/base/hook-utils.js";
14
- import { wasEarlyQuestionsAsked } from "../lib-ts/cc-native-state.js";
15
-
16
- const PHASE_A_PROMPT = `## Plan Mode: Narrow the Approach After Exploration
17
-
18
- After exploring the codebase, use AskUserQuestion — one call, 3-4 questions — before drafting the plan.
19
-
20
- ### Why This Matters
21
- Once you've explored the codebase, you'll understand what exists — but not which direction the user prefers. That's a branch point: multiple viable approaches, and the user's priorities determine which is best. Questions asked after exploration have maximum steering value: they narrow your path before you commit to an implementation direction.
22
-
23
- ### What to Ask About
24
- Only ask about decisions that exploration will surface but can't resolve — where human judgment is needed to choose between viable options:
25
-
26
- - **Approach selection:** If exploration reveals 2-3 viable implementation paths, ask which the user prefers. Present each option with its trade-offs as concrete choices.
27
- - **Scope boundaries:** What's in scope vs. out of scope for this change? Which areas of the codebase should be left untouched? How far should the change ripple?
28
- - **Trade-off preferences:** Where exploration reveals tensions (simplicity vs. flexibility, speed vs. thoroughness, minimal change vs. full refactor), ask which side the user leans toward.
29
- - **Success criteria beyond the literal ask:** What would make this a 10? What non-obvious quality matters most — performance, readability, extensibility, consistency with existing patterns?
30
-
31
- ### How to Select Questions
32
- 1. Generate 5+ candidate questions across the categories above
33
- 2. For each, evaluate: "If they answered A vs B, would I take a different approach or write different code?" If no — discard it.
34
- 3. Keep the 3-4 where different answers lead to meaningfully different implementation strategies
35
- 4. Frame each with 2-3 concrete options so the user can react rather than generate from scratch`;
36
-
37
- function main(): void {
38
- const payload = loadHookInput();
39
- if (!payload) return;
40
-
41
- const permissionMode = payload.permission_mode ?? "";
42
- if (permissionMode !== "plan") return;
43
-
44
- const sessionId = String(payload.session_id ?? "");
45
- if (!sessionId) {
46
- logDebug("plan_questions_early", "No session_id, skipping");
47
- return;
48
- }
49
-
50
- const projectRoot = getProjectRoot(payload.cwd);
51
-
52
- if (wasEarlyQuestionsAsked(sessionId, projectRoot)) {
53
- logDebug("plan_questions_early", "Early questions already asked, skipping Phase A prompt");
54
- return;
55
- }
56
-
57
- logInfo("plan_questions_early", "Plan mode detected, injecting Phase A prompt");
58
- emitContext(PHASE_A_PROMPT);
59
- }
60
-
61
- runHook(main, "plan_questions_early");
1
+ #!/usr/bin/env bun
2
+ /**
3
+ * UserPromptSubmit hook — injects post-exploration clarification prompt in plan mode.
4
+ *
5
+ * After explore agents finish examining the codebase, injects a system-reminder
6
+ * telling Claude to ask clarification questions via AskUserQuestion to narrow
7
+ * the approach before drafting the plan.
8
+ *
9
+ * Skips if questions were already asked this session.
10
+ */
11
+
12
+ import { getProjectRoot } from "../../_shared/lib-ts/base/constants.js";
13
+ import { loadHookInput, runHook, logDebug, logInfo, emitContext } from "../../_shared/lib-ts/base/hook-utils.js";
14
+ import { wasEarlyQuestionsAsked } from "../lib-ts/cc-native-state.js";
15
+
16
+ const PHASE_A_PROMPT = `## Plan Mode: Narrow the Approach After Exploration
17
+
18
+ After exploring the codebase, use AskUserQuestion — one call, 3-4 questions — before drafting the plan.
19
+
20
+ ### Why This Matters
21
+ Once you've explored the codebase, you'll understand what exists — but not which direction the user prefers. That's a branch point: multiple viable approaches, and the user's priorities determine which is best. Questions asked after exploration have maximum steering value: they narrow your path before you commit to an implementation direction.
22
+
23
+ ### What to Ask About
24
+ Only ask about decisions that exploration will surface but can't resolve — where human judgment is needed to choose between viable options:
25
+
26
+ - **Approach selection:** If exploration reveals 2-3 viable implementation paths, ask which the user prefers. Present each option with its trade-offs as concrete choices.
27
+ - **Scope boundaries:** What's in scope vs. out of scope for this change? Which areas of the codebase should be left untouched? How far should the change ripple?
28
+ - **Trade-off preferences:** Where exploration reveals tensions (simplicity vs. flexibility, speed vs. thoroughness, minimal change vs. full refactor), ask which side the user leans toward.
29
+ - **Success criteria beyond the literal ask:** What would make this a 10? What non-obvious quality matters most — performance, readability, extensibility, consistency with existing patterns?
30
+
31
+ ### How to Select Questions
32
+ 1. Generate 5+ candidate questions across the categories above
33
+ 2. For each, evaluate: "If they answered A vs B, would I take a different approach or write different code?" If no — discard it.
34
+ 3. Keep the 3-4 where different answers lead to meaningfully different implementation strategies
35
+ 4. Frame each with 2-3 concrete options so the user can react rather than generate from scratch`;
36
+
37
+ function main(): void {
38
+ const payload = loadHookInput();
39
+ if (!payload) return;
40
+
41
+ const permissionMode = payload.permission_mode ?? "";
42
+ if (permissionMode !== "plan") return;
43
+
44
+ const sessionId = String(payload.session_id ?? "");
45
+ if (!sessionId) {
46
+ logDebug("plan_questions_early", "No session_id, skipping");
47
+ return;
48
+ }
49
+
50
+ const projectRoot = getProjectRoot(payload.cwd);
51
+
52
+ if (wasEarlyQuestionsAsked(sessionId, projectRoot)) {
53
+ logDebug("plan_questions_early", "Early questions already asked, skipping Phase A prompt");
54
+ return;
55
+ }
56
+
57
+ logInfo("plan_questions_early", "Plan mode detected, injecting Phase A prompt");
58
+ emitContext(PHASE_A_PROMPT);
59
+ }
60
+
61
+ runHook(main, "plan_questions_early");