aiwcli 0.12.6 → 0.12.8

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 (163) 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 +232 -205
  10. package/dist/templates/_shared/.claude/settings.json +65 -65
  11. package/dist/templates/_shared/.claude/{commands/handoff.md → skills/handoff/SKILL.md} +13 -12
  12. package/dist/templates/_shared/.claude/{commands/handoff-resume.md → skills/handoff-resume/SKILL.md} +13 -12
  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 +15 -3
  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 +24 -6
  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/CLAUDE.md +134 -0
  43. package/dist/templates/_shared/lib-ts/context/context-formatter.ts +566 -566
  44. package/dist/templates/_shared/lib-ts/context/context-selector.ts +524 -524
  45. package/dist/templates/_shared/lib-ts/context/context-store.ts +712 -712
  46. package/dist/templates/_shared/lib-ts/context/plan-manager.ts +312 -312
  47. package/dist/templates/_shared/lib-ts/context/task-tracker.ts +185 -185
  48. package/dist/templates/_shared/lib-ts/package.json +20 -20
  49. package/dist/templates/_shared/lib-ts/templates/formatters.ts +102 -102
  50. package/dist/templates/_shared/lib-ts/templates/plan-context.ts +58 -58
  51. package/dist/templates/_shared/lib-ts/tsconfig.json +13 -13
  52. package/dist/templates/_shared/lib-ts/types.ts +186 -186
  53. package/dist/templates/_shared/scripts/resolve_context.ts +33 -33
  54. package/dist/templates/_shared/scripts/status_line.ts +687 -690
  55. package/dist/templates/cc-native/.claude/commands/cc-native/rlm/ask.md +136 -136
  56. package/dist/templates/cc-native/.claude/commands/cc-native/rlm/index.md +21 -21
  57. package/dist/templates/cc-native/.claude/commands/cc-native/rlm/overview.md +56 -56
  58. package/dist/templates/cc-native/.claude/commands/cc-native/specdev.md +10 -10
  59. package/dist/templates/cc-native/.claude/settings.json +3 -2
  60. package/dist/templates/cc-native/.windsurf/workflows/cc-native/fix.md +8 -8
  61. package/dist/templates/cc-native/.windsurf/workflows/cc-native/implement.md +8 -8
  62. package/dist/templates/cc-native/.windsurf/workflows/cc-native/research.md +8 -8
  63. package/dist/templates/cc-native/CC-NATIVE-README.md +189 -189
  64. package/dist/templates/cc-native/TEMPLATE-SCHEMA.md +304 -304
  65. package/dist/templates/cc-native/_cc-native/agents/CLAUDE.md +143 -143
  66. package/dist/templates/cc-native/_cc-native/agents/PLAN-ORCHESTRATOR.md +213 -213
  67. package/dist/templates/cc-native/_cc-native/agents/plan-questions/PLAN-QUESTIONER.md +70 -70
  68. package/dist/templates/cc-native/_cc-native/artifacts/CLAUDE.md +64 -0
  69. package/dist/templates/cc-native/_cc-native/{lib-ts/artifacts → artifacts/lib}/format.ts +1 -1
  70. package/dist/templates/cc-native/_cc-native/{lib-ts/artifacts → artifacts/lib}/write.ts +2 -2
  71. package/dist/templates/cc-native/_cc-native/cc-native.config.json +96 -96
  72. package/dist/templates/cc-native/_cc-native/hooks/CLAUDE.md +14 -24
  73. package/dist/templates/cc-native/_cc-native/hooks/cc-native-plan-review.ts +1 -1
  74. package/dist/templates/cc-native/_cc-native/hooks/enhance_plan_post_subagent.ts +54 -54
  75. package/dist/templates/cc-native/_cc-native/hooks/enhance_plan_post_write.ts +51 -51
  76. package/dist/templates/cc-native/_cc-native/hooks/mark_questions_asked.ts +53 -53
  77. package/dist/templates/cc-native/_cc-native/hooks/plan_questions_early.ts +61 -61
  78. package/dist/templates/cc-native/_cc-native/hooks/validate_task_prompt.ts +76 -0
  79. package/dist/templates/cc-native/_cc-native/lib-ts/aggregate-agents.ts +9 -2
  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/debug.ts +79 -79
  85. package/dist/templates/cc-native/_cc-native/lib-ts/index.ts +4 -4
  86. package/dist/templates/cc-native/_cc-native/lib-ts/json-parser.ts +168 -168
  87. package/dist/templates/cc-native/_cc-native/lib-ts/plan-discovery.ts +80 -80
  88. package/dist/templates/cc-native/_cc-native/lib-ts/plan-enhancement.ts +41 -41
  89. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/CLAUDE.md +480 -480
  90. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/embedding-indexer.ts +287 -287
  91. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/hyde.ts +148 -148
  92. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/index.ts +54 -54
  93. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/logger.ts +58 -58
  94. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/ollama-client.ts +208 -208
  95. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/retrieval-pipeline.ts +460 -460
  96. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/transcript-indexer.ts +446 -446
  97. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/transcript-loader.ts +280 -280
  98. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/transcript-searcher.ts +274 -274
  99. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/types.ts +201 -201
  100. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/vector-store.ts +278 -278
  101. package/dist/templates/cc-native/_cc-native/lib-ts/settings.ts +184 -184
  102. package/dist/templates/cc-native/_cc-native/lib-ts/state.ts +275 -275
  103. package/dist/templates/cc-native/_cc-native/lib-ts/tsconfig.json +18 -18
  104. package/dist/templates/cc-native/_cc-native/lib-ts/types.ts +1 -1
  105. package/dist/templates/cc-native/_cc-native/plan-review/CLAUDE.md +149 -0
  106. package/dist/templates/cc-native/_cc-native/plan-review/agents/CLAUDE.md +143 -0
  107. package/dist/templates/cc-native/_cc-native/plan-review/agents/PLAN-ORCHESTRATOR.md +213 -0
  108. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-questions/PLAN-QUESTIONER.md +70 -0
  109. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/ARCH-EVOLUTION.md +62 -0
  110. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/ARCH-PATTERNS.md +61 -0
  111. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/ARCH-STRUCTURE.md +62 -0
  112. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/ASSUMPTION-TRACER.md +56 -0
  113. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/CLARITY-AUDITOR.md +53 -0
  114. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/COMPLETENESS-FEASIBILITY.md +66 -0
  115. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/COMPLETENESS-GAPS.md +70 -0
  116. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/COMPLETENESS-ORDERING.md +62 -0
  117. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/CONSTRAINT-VALIDATOR.md +72 -0
  118. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/DESIGN-ADR-VALIDATOR.md +61 -0
  119. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/DESIGN-SCALE-MATCHER.md +64 -0
  120. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/DEVILS-ADVOCATE.md +56 -0
  121. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/DOCUMENTATION-PHILOSOPHY.md +86 -0
  122. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/HANDOFF-READINESS.md +59 -0
  123. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/HIDDEN-COMPLEXITY.md +58 -0
  124. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/INCREMENTAL-DELIVERY.md +66 -0
  125. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/RISK-DEPENDENCY.md +62 -0
  126. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/RISK-FMEA.md +66 -0
  127. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/RISK-PREMORTEM.md +71 -0
  128. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/RISK-REVERSIBILITY.md +74 -0
  129. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/SCOPE-BOUNDARY.md +77 -0
  130. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/SIMPLICITY-GUARDIAN.md +62 -0
  131. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/SKEPTIC.md +68 -0
  132. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/TESTDRIVEN-BEHAVIOR-AUDITOR.md +61 -0
  133. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/TESTDRIVEN-CHARACTERIZATION.md +71 -0
  134. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/TESTDRIVEN-FIRST-VALIDATOR.md +61 -0
  135. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/TESTDRIVEN-PYRAMID-ANALYZER.md +61 -0
  136. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/TRADEOFF-COSTS.md +67 -0
  137. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/TRADEOFF-STAKEHOLDERS.md +65 -0
  138. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/VERIFY-COVERAGE.md +74 -0
  139. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/VERIFY-STRENGTH.md +69 -0
  140. package/dist/templates/cc-native/_cc-native/{lib-ts → plan-review/lib}/agent-selection.ts +3 -3
  141. package/dist/templates/cc-native/_cc-native/{lib-ts → plan-review/lib}/corroboration.ts +1 -1
  142. package/dist/templates/cc-native/_cc-native/{lib-ts → plan-review/lib}/graduation.ts +1 -1
  143. package/dist/templates/cc-native/_cc-native/{lib-ts → plan-review/lib}/orchestrator.ts +2 -2
  144. package/dist/templates/cc-native/_cc-native/{lib-ts → plan-review/lib}/output-builder.ts +3 -3
  145. package/dist/templates/cc-native/_cc-native/{lib-ts → plan-review/lib}/plan-questions.ts +6 -6
  146. package/dist/templates/cc-native/_cc-native/{lib-ts → plan-review/lib}/review-pipeline.ts +15 -15
  147. package/dist/templates/cc-native/_cc-native/{lib-ts → plan-review/lib}/reviewers/agent.ts +5 -5
  148. package/dist/templates/cc-native/_cc-native/{lib-ts → plan-review/lib}/reviewers/base/base-agent.ts +4 -4
  149. package/dist/templates/cc-native/_cc-native/{lib-ts → plan-review/lib}/reviewers/providers/claude-agent.ts +4 -4
  150. package/dist/templates/cc-native/_cc-native/{lib-ts → plan-review/lib}/reviewers/providers/codex-agent.ts +6 -6
  151. package/dist/templates/cc-native/_cc-native/{lib-ts → plan-review/lib}/reviewers/providers/gemini-agent.ts +1 -1
  152. package/dist/templates/cc-native/_cc-native/{lib-ts → plan-review/lib}/reviewers/providers/orchestrator-claude-agent.ts +4 -4
  153. package/dist/templates/cc-native/_cc-native/{lib-ts → plan-review/lib}/reviewers/types.ts +3 -3
  154. package/dist/templates/cc-native/_cc-native/{lib-ts → plan-review/lib}/verdict.ts +1 -1
  155. package/oclif.manifest.json +1 -1
  156. package/package.json +108 -108
  157. package/dist/templates/cc-native/_cc-native/lib-ts/artifacts.ts +0 -21
  158. package/dist/templates/cc-native/_cc-native/lib-ts/nul +0 -3
  159. /package/dist/templates/cc-native/_cc-native/{lib-ts/artifacts → artifacts/lib}/index.ts +0 -0
  160. /package/dist/templates/cc-native/_cc-native/{lib-ts/artifacts → artifacts/lib}/tracker.ts +0 -0
  161. /package/dist/templates/cc-native/_cc-native/{lib-ts → plan-review/lib}/reviewers/index.ts +0 -0
  162. /package/dist/templates/cc-native/_cc-native/{lib-ts → plan-review/lib}/reviewers/schemas.ts +0 -0
  163. /package/dist/templates/cc-native/_cc-native/{workflows → plan-review/workflows}/specdev.md +0 -0
@@ -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");
@@ -0,0 +1,76 @@
1
+ #!/usr/bin/env bun
2
+ /**
3
+ * PreToolUse:Task Hook: Prompt Validation Gate
4
+ *
5
+ * Validates that Task tool calls have self-contained, goal-oriented prompts.
6
+ * Short-circuits immediately for resume calls (no prompt to validate).
7
+ *
8
+ * Design:
9
+ * - Resume calls (tool_input.resume present) → allow through, no inference
10
+ * - Missing/empty prompt → allow through (fail open)
11
+ * - Non-empty prompt → run AI validation via inference(), block if ok:false
12
+ */
13
+
14
+ import {
15
+ loadHookInput,
16
+ runHook,
17
+ logInfo,
18
+ logDebug,
19
+ logWarn,
20
+ emitContextAndBlock,
21
+ getToolInput,
22
+ } from "../../_shared/lib-ts/base/hook-utils.js";
23
+ import { isInternalCall } from "../../_shared/lib-ts/base/subprocess-utils.js";
24
+ import { inference } from "../../_shared/lib-ts/base/inference.js";
25
+
26
+ const VALIDATION_SYSTEM_PROMPT = `The sub-agent receives ONLY the prompt text — no conversation history, no prior context.
27
+
28
+ Check 1 — Dangling References: Does the prompt use pronouns or demonstratives that ONLY make sense with prior conversation? Violations: 'the file we looked at', 'as discussed above', 'that approach we chose', 'the error from earlier', 'fix the issue mentioned above'. NOT violations: relative paths ('_output/', 'src/lib/'), search terms ('context-manager', 'auth module'), directory exploration ('find files matching X'), tool names, or any concrete noun — even if imprecise. Only flag references that are truly UNRESOLVABLE without conversation history.
29
+
30
+ Check 2 — Implicit Contract: Does the prompt have ANY discernible goal? 'Explore the _output directory and find context files' IS a clear goal. 'Search for hooks that handle Task events' IS a clear goal. 'Read and summarize all files in X' IS a clear goal. Only flag if the prompt is truly goalless — e.g., a sentence fragment with no verb, or pure context with no request.
31
+
32
+ If both checks pass, return ok:true. When in doubt, pass — false negatives (letting a vague prompt through) are far less costly than false positives (blocking legitimate work).
33
+
34
+ When returning ok:false, end your response with: 'Retry: Re-invoke the Task tool with a revised prompt that resolves the issues above.'`;
35
+
36
+ function main(): void {
37
+ if (isInternalCall()) return;
38
+
39
+ const payload = loadHookInput();
40
+ if (!payload) return;
41
+
42
+ const toolInput = getToolInput(payload);
43
+
44
+ // Resume calls: tool_input contains `resume: "<agent-id>"` (may also have prompt/description).
45
+ // The resume field being present is the authoritative discriminator — skip all validation.
46
+ if (toolInput?.resume) {
47
+ logInfo("validate_task_prompt", `Resume call detected (agent: ${toolInput.resume}) — skipping validation`);
48
+ return;
49
+ }
50
+
51
+ const prompt: string = toolInput?.prompt ?? "";
52
+ if (!prompt.trim()) {
53
+ logDebug("validate_task_prompt", "No prompt field — allowing through (fail open)");
54
+ return;
55
+ }
56
+
57
+ logInfo("validate_task_prompt", `Validating Task prompt (${prompt.length} chars)`);
58
+ const result = inference(VALIDATION_SYSTEM_PROMPT, prompt, "fast");
59
+
60
+ if (!result.success) {
61
+ logWarn("validate_task_prompt", `inference() failed (${result.error}) — failing open`);
62
+ return;
63
+ }
64
+
65
+ const output = result.output;
66
+ if (output.includes("ok:false")) {
67
+ // Extract the Retry line if present; fall back to full output
68
+ const retryMatch = output.match(/Retry:.*$/m);
69
+ const retryMessage = retryMatch ? retryMatch[0] : "Retry: Re-invoke the Task tool with a revised, self-contained prompt.";
70
+ logInfo("validate_task_prompt", "Blocking Task — prompt failed validation");
71
+ emitContextAndBlock(output, retryMessage);
72
+ }
73
+ // ok:true or anything else → allow through (no output = no block)
74
+ }
75
+
76
+ runHook(main, "validate_task_prompt");
@@ -1,6 +1,11 @@
1
1
  /**
2
2
  * Agent frontmatter parser — discovers and loads agent configs from markdown files.
3
3
  * See cc-native-plan-review-spec.md §4.14
4
+ *
5
+ * NOTE: This file intentionally stays in lib-ts/ rather than plan-review/lib/.
6
+ * Both settings.ts (shared cc-native infra) and plan-questions.ts (plan-review) import it.
7
+ * Moving it to plan-review/ would create a forbidden backward dependency: lib-ts → plan-review.
8
+ * Do not move this file without first moving settings.ts out of lib-ts/.
4
9
  */
5
10
 
6
11
  import * as fs from "node:fs";
@@ -92,11 +97,13 @@ export function extractBody(content: string): string {
92
97
  * Discover and load all agent configs from a directory of markdown files.
93
98
  * Skips the plan-orchestrator agent. Defaults categories to ["code"].
94
99
  *
95
- * @param agentsDir - Path to agents directory (default: _cc-native/agents/)
100
+ * @param agentsDir - Path to agents directory. Callers must pass an explicit path.
101
+ * Known call sites: settings.ts → plan-review/agents/plan-review,
102
+ * plan-questions.ts → plan-review/agents/plan-questions
96
103
  * @returns Array of AgentConfig objects
97
104
  */
98
105
  export function aggregateAgents(agentsDir?: string): AgentConfig[] {
99
- const dir = agentsDir ?? path.join("_cc-native", "agents");
106
+ const dir = agentsDir ?? path.join("_cc-native", "plan-review", "agents");
100
107
 
101
108
  if (!fs.existsSync(dir)) {
102
109
  logWarn("aggregate", `Agents directory not found: ${dir}`);