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.
- package/bin/dev.cmd +3 -3
- package/bin/dev.js +16 -16
- package/bin/run.cmd +3 -3
- package/bin/run.js +21 -21
- package/dist/commands/branch.js +7 -2
- package/dist/lib/bmad-installer.js +37 -37
- package/dist/lib/terminal.d.ts +2 -0
- package/dist/lib/terminal.js +57 -7
- package/dist/templates/CLAUDE.md +205 -205
- package/dist/templates/_shared/.claude/commands/handoff-resume.md +12 -12
- package/dist/templates/_shared/.claude/commands/handoff.md +12 -12
- package/dist/templates/_shared/.claude/settings.json +65 -65
- package/dist/templates/_shared/.codex/workflows/handoff.md +226 -226
- package/dist/templates/_shared/.windsurf/workflows/handoff.md +226 -226
- package/dist/templates/_shared/handoff-system/CLAUDE.md +421 -421
- package/dist/templates/_shared/handoff-system/lib/document-generator.ts +215 -215
- package/dist/templates/_shared/handoff-system/lib/handoff-reader.ts +158 -158
- package/dist/templates/_shared/handoff-system/scripts/resume_handoff.ts +373 -373
- package/dist/templates/_shared/handoff-system/scripts/save_handoff.ts +469 -469
- package/dist/templates/_shared/handoff-system/workflows/handoff-resume.md +66 -66
- package/dist/templates/_shared/handoff-system/workflows/handoff.md +254 -254
- package/dist/templates/_shared/hooks-ts/_utils/git-state.ts +2 -2
- package/dist/templates/_shared/hooks-ts/archive_plan.ts +159 -159
- package/dist/templates/_shared/hooks-ts/context_monitor.ts +147 -147
- package/dist/templates/_shared/hooks-ts/file-suggestion.ts +128 -128
- package/dist/templates/_shared/hooks-ts/pre_compact.ts +49 -49
- package/dist/templates/_shared/hooks-ts/session_end.ts +196 -196
- package/dist/templates/_shared/hooks-ts/session_start.ts +163 -163
- package/dist/templates/_shared/hooks-ts/task_create_capture.ts +48 -48
- package/dist/templates/_shared/hooks-ts/task_update_capture.ts +74 -74
- package/dist/templates/_shared/hooks-ts/user_prompt_submit.ts +93 -93
- package/dist/templates/_shared/lib-ts/CLAUDE.md +367 -367
- package/dist/templates/_shared/lib-ts/base/atomic-write.ts +138 -138
- package/dist/templates/_shared/lib-ts/base/constants.ts +303 -303
- package/dist/templates/_shared/lib-ts/base/git-state.ts +58 -58
- package/dist/templates/_shared/lib-ts/base/hook-utils.ts +582 -582
- package/dist/templates/_shared/lib-ts/base/inference.ts +301 -301
- package/dist/templates/_shared/lib-ts/base/logger.ts +247 -247
- package/dist/templates/_shared/lib-ts/base/state-io.ts +202 -202
- package/dist/templates/_shared/lib-ts/base/stop-words.ts +184 -184
- package/dist/templates/_shared/lib-ts/base/utils.ts +184 -184
- package/dist/templates/_shared/lib-ts/context/context-formatter.ts +566 -566
- package/dist/templates/_shared/lib-ts/context/context-selector.ts +524 -524
- package/dist/templates/_shared/lib-ts/context/context-store.ts +712 -712
- package/dist/templates/_shared/lib-ts/context/plan-manager.ts +312 -312
- package/dist/templates/_shared/lib-ts/context/task-tracker.ts +185 -185
- package/dist/templates/_shared/lib-ts/package.json +20 -20
- package/dist/templates/_shared/lib-ts/templates/formatters.ts +102 -102
- package/dist/templates/_shared/lib-ts/templates/plan-context.ts +58 -58
- package/dist/templates/_shared/lib-ts/tsconfig.json +13 -13
- package/dist/templates/_shared/lib-ts/types.ts +186 -186
- package/dist/templates/_shared/scripts/resolve_context.ts +33 -33
- package/dist/templates/_shared/scripts/status_line.ts +690 -690
- package/dist/templates/cc-native/.claude/commands/cc-native/rlm/ask.md +136 -136
- package/dist/templates/cc-native/.claude/commands/cc-native/rlm/index.md +21 -21
- package/dist/templates/cc-native/.claude/commands/cc-native/rlm/overview.md +56 -56
- package/dist/templates/cc-native/.claude/commands/cc-native/specdev.md +10 -10
- package/dist/templates/cc-native/.windsurf/workflows/cc-native/fix.md +8 -8
- package/dist/templates/cc-native/.windsurf/workflows/cc-native/implement.md +8 -8
- package/dist/templates/cc-native/.windsurf/workflows/cc-native/research.md +8 -8
- package/dist/templates/cc-native/CC-NATIVE-README.md +189 -189
- package/dist/templates/cc-native/TEMPLATE-SCHEMA.md +304 -304
- package/dist/templates/cc-native/_cc-native/agents/CLAUDE.md +143 -143
- package/dist/templates/cc-native/_cc-native/agents/PLAN-ORCHESTRATOR.md +213 -213
- package/dist/templates/cc-native/_cc-native/agents/plan-questions/PLAN-QUESTIONER.md +70 -70
- package/dist/templates/cc-native/_cc-native/cc-native.config.json +96 -96
- package/dist/templates/cc-native/_cc-native/hooks/CLAUDE.md +247 -247
- package/dist/templates/cc-native/_cc-native/hooks/cc-native-plan-review.ts +76 -76
- package/dist/templates/cc-native/_cc-native/hooks/enhance_plan_post_subagent.ts +54 -54
- package/dist/templates/cc-native/_cc-native/hooks/enhance_plan_post_write.ts +51 -51
- package/dist/templates/cc-native/_cc-native/hooks/mark_questions_asked.ts +53 -53
- package/dist/templates/cc-native/_cc-native/hooks/plan_questions_early.ts +61 -61
- package/dist/templates/cc-native/_cc-native/lib-ts/agent-selection.ts +163 -163
- package/dist/templates/cc-native/_cc-native/lib-ts/aggregate-agents.ts +156 -156
- package/dist/templates/cc-native/_cc-native/lib-ts/artifacts/format.ts +597 -597
- package/dist/templates/cc-native/_cc-native/lib-ts/artifacts/index.ts +26 -26
- package/dist/templates/cc-native/_cc-native/lib-ts/artifacts/tracker.ts +107 -107
- package/dist/templates/cc-native/_cc-native/lib-ts/artifacts/write.ts +119 -119
- package/dist/templates/cc-native/_cc-native/lib-ts/artifacts.ts +21 -21
- package/dist/templates/cc-native/_cc-native/lib-ts/cc-native-state.ts +319 -319
- package/dist/templates/cc-native/_cc-native/lib-ts/cli-output-parser.ts +144 -144
- package/dist/templates/cc-native/_cc-native/lib-ts/config.ts +57 -57
- package/dist/templates/cc-native/_cc-native/lib-ts/constants.ts +83 -83
- package/dist/templates/cc-native/_cc-native/lib-ts/corroboration.ts +119 -119
- package/dist/templates/cc-native/_cc-native/lib-ts/debug.ts +79 -79
- package/dist/templates/cc-native/_cc-native/lib-ts/graduation.ts +132 -132
- package/dist/templates/cc-native/_cc-native/lib-ts/index.ts +116 -116
- package/dist/templates/cc-native/_cc-native/lib-ts/json-parser.ts +168 -168
- package/dist/templates/cc-native/_cc-native/lib-ts/orchestrator.ts +70 -70
- package/dist/templates/cc-native/_cc-native/lib-ts/output-builder.ts +130 -130
- package/dist/templates/cc-native/_cc-native/lib-ts/plan-discovery.ts +80 -80
- package/dist/templates/cc-native/_cc-native/lib-ts/plan-enhancement.ts +41 -41
- package/dist/templates/cc-native/_cc-native/lib-ts/plan-questions.ts +101 -101
- package/dist/templates/cc-native/_cc-native/lib-ts/review-pipeline.ts +511 -511
- package/dist/templates/cc-native/_cc-native/lib-ts/reviewers/agent.ts +71 -71
- package/dist/templates/cc-native/_cc-native/lib-ts/reviewers/base/base-agent.ts +217 -217
- package/dist/templates/cc-native/_cc-native/lib-ts/reviewers/index.ts +12 -12
- package/dist/templates/cc-native/_cc-native/lib-ts/reviewers/providers/claude-agent.ts +66 -66
- package/dist/templates/cc-native/_cc-native/lib-ts/reviewers/providers/codex-agent.ts +184 -184
- package/dist/templates/cc-native/_cc-native/lib-ts/reviewers/providers/gemini-agent.ts +39 -39
- package/dist/templates/cc-native/_cc-native/lib-ts/reviewers/providers/orchestrator-claude-agent.ts +196 -196
- package/dist/templates/cc-native/_cc-native/lib-ts/reviewers/schemas.ts +201 -201
- package/dist/templates/cc-native/_cc-native/lib-ts/reviewers/types.ts +21 -21
- package/dist/templates/cc-native/_cc-native/lib-ts/rlm/CLAUDE.md +480 -480
- package/dist/templates/cc-native/_cc-native/lib-ts/rlm/embedding-indexer.ts +287 -287
- package/dist/templates/cc-native/_cc-native/lib-ts/rlm/hyde.ts +148 -148
- package/dist/templates/cc-native/_cc-native/lib-ts/rlm/index.ts +54 -54
- package/dist/templates/cc-native/_cc-native/lib-ts/rlm/logger.ts +58 -58
- package/dist/templates/cc-native/_cc-native/lib-ts/rlm/ollama-client.ts +208 -208
- package/dist/templates/cc-native/_cc-native/lib-ts/rlm/retrieval-pipeline.ts +460 -460
- package/dist/templates/cc-native/_cc-native/lib-ts/rlm/transcript-indexer.ts +446 -446
- package/dist/templates/cc-native/_cc-native/lib-ts/rlm/transcript-loader.ts +280 -280
- package/dist/templates/cc-native/_cc-native/lib-ts/rlm/transcript-searcher.ts +274 -274
- package/dist/templates/cc-native/_cc-native/lib-ts/rlm/types.ts +201 -201
- package/dist/templates/cc-native/_cc-native/lib-ts/rlm/vector-store.ts +278 -278
- package/dist/templates/cc-native/_cc-native/lib-ts/settings.ts +184 -184
- package/dist/templates/cc-native/_cc-native/lib-ts/state.ts +275 -275
- package/dist/templates/cc-native/_cc-native/lib-ts/tsconfig.json +18 -18
- package/dist/templates/cc-native/_cc-native/lib-ts/types.ts +329 -329
- package/dist/templates/cc-native/_cc-native/lib-ts/verdict.ts +72 -72
- package/dist/templates/cc-native/_cc-native/workflows/specdev.md +9 -9
- package/oclif.manifest.json +1 -1
- package/package.json +108 -108
- 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");
|