@planu/cli 0.90.1 → 0.91.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (252) hide show
  1. package/dist/config/license-plans.json +3 -1
  2. package/dist/engine/batch-script-generator/index.d.ts +6 -0
  3. package/dist/engine/batch-script-generator/index.d.ts.map +1 -0
  4. package/dist/engine/batch-script-generator/index.js +126 -0
  5. package/dist/engine/batch-script-generator/index.js.map +1 -0
  6. package/dist/engine/ci-generator/index.d.ts.map +1 -1
  7. package/dist/engine/ci-generator/index.js +32 -1
  8. package/dist/engine/ci-generator/index.js.map +1 -1
  9. package/dist/engine/ci-generator/output-formats.d.ts +15 -0
  10. package/dist/engine/ci-generator/output-formats.d.ts.map +1 -0
  11. package/dist/engine/ci-generator/output-formats.js +52 -0
  12. package/dist/engine/ci-generator/output-formats.js.map +1 -0
  13. package/dist/engine/claude-config-auditor/claudemd-auditor.d.ts.map +1 -1
  14. package/dist/engine/claude-config-auditor/claudemd-auditor.js +139 -31
  15. package/dist/engine/claude-config-auditor/claudemd-auditor.js.map +1 -1
  16. package/dist/engine/claude-config-auditor/rules-auditor.d.ts.map +1 -1
  17. package/dist/engine/claude-config-auditor/rules-auditor.js +87 -49
  18. package/dist/engine/claude-config-auditor/rules-auditor.js.map +1 -1
  19. package/dist/engine/claude-config-auditor/scoring.d.ts.map +1 -1
  20. package/dist/engine/claude-config-auditor/scoring.js +37 -1
  21. package/dist/engine/claude-config-auditor/scoring.js.map +1 -1
  22. package/dist/engine/claude-config-auditor/settings-auditor.d.ts.map +1 -1
  23. package/dist/engine/claude-config-auditor/settings-auditor.js +55 -40
  24. package/dist/engine/claude-config-auditor/settings-auditor.js.map +1 -1
  25. package/dist/engine/config-schemas.d.ts.map +1 -1
  26. package/dist/engine/config-schemas.js +1 -0
  27. package/dist/engine/config-schemas.js.map +1 -1
  28. package/dist/engine/context-advisor/btw-advisor.d.ts +11 -0
  29. package/dist/engine/context-advisor/btw-advisor.d.ts.map +1 -0
  30. package/dist/engine/context-advisor/btw-advisor.js +29 -0
  31. package/dist/engine/context-advisor/btw-advisor.js.map +1 -0
  32. package/dist/engine/facilitate/context-loader.d.ts +12 -0
  33. package/dist/engine/facilitate/context-loader.d.ts.map +1 -0
  34. package/dist/engine/facilitate/context-loader.js +156 -0
  35. package/dist/engine/facilitate/context-loader.js.map +1 -0
  36. package/dist/engine/facilitate/intent-classifier.d.ts +6 -0
  37. package/dist/engine/facilitate/intent-classifier.d.ts.map +1 -0
  38. package/dist/engine/facilitate/intent-classifier.js +153 -0
  39. package/dist/engine/facilitate/intent-classifier.js.map +1 -0
  40. package/dist/engine/facilitate/plan-parser.d.ts +7 -0
  41. package/dist/engine/facilitate/plan-parser.d.ts.map +1 -0
  42. package/dist/engine/facilitate/plan-parser.js +115 -0
  43. package/dist/engine/facilitate/plan-parser.js.map +1 -0
  44. package/dist/engine/facilitate/router.d.ts +6 -0
  45. package/dist/engine/facilitate/router.d.ts.map +1 -0
  46. package/dist/engine/facilitate/router.js +71 -0
  47. package/dist/engine/facilitate/router.js.map +1 -0
  48. package/dist/engine/hooks/context-injector.d.ts +11 -0
  49. package/dist/engine/hooks/context-injector.d.ts.map +1 -0
  50. package/dist/engine/hooks/context-injector.js +163 -0
  51. package/dist/engine/hooks/context-injector.js.map +1 -0
  52. package/dist/engine/hooks/hook-templates.d.ts +16 -0
  53. package/dist/engine/hooks/hook-templates.d.ts.map +1 -0
  54. package/dist/engine/hooks/hook-templates.js +148 -0
  55. package/dist/engine/hooks/hook-templates.js.map +1 -0
  56. package/dist/engine/hooks/plan-mode-detector.d.ts +27 -0
  57. package/dist/engine/hooks/plan-mode-detector.d.ts.map +1 -0
  58. package/dist/engine/hooks/plan-mode-detector.js +68 -0
  59. package/dist/engine/hooks/plan-mode-detector.js.map +1 -0
  60. package/dist/engine/hooks/plan-mode-scripts.d.ts +10 -0
  61. package/dist/engine/hooks/plan-mode-scripts.d.ts.map +1 -0
  62. package/dist/engine/hooks/plan-mode-scripts.js +45 -0
  63. package/dist/engine/hooks/plan-mode-scripts.js.map +1 -0
  64. package/dist/engine/model-router/complexity-analyzer.d.ts +9 -1
  65. package/dist/engine/model-router/complexity-analyzer.d.ts.map +1 -1
  66. package/dist/engine/model-router/complexity-analyzer.js +44 -1
  67. package/dist/engine/model-router/complexity-analyzer.js.map +1 -1
  68. package/dist/engine/model-router/rules-engine.d.ts.map +1 -1
  69. package/dist/engine/model-router/rules-engine.js +14 -1
  70. package/dist/engine/model-router/rules-engine.js.map +1 -1
  71. package/dist/engine/nfr-profile-detector.d.ts.map +1 -1
  72. package/dist/engine/nfr-profile-detector.js +2 -1
  73. package/dist/engine/nfr-profile-detector.js.map +1 -1
  74. package/dist/engine/spec-coverage/core.js.map +1 -1
  75. package/dist/engine/spec-migrator/frontmatter-parser.d.ts.map +1 -1
  76. package/dist/engine/spec-migrator/frontmatter-parser.js.map +1 -1
  77. package/dist/engine/spec-summary-html.d.ts.map +1 -1
  78. package/dist/engine/spec-summary-html.js +1 -1
  79. package/dist/engine/spec-summary-html.js.map +1 -1
  80. package/dist/engine/team-planner/writer-reviewer.d.ts +12 -0
  81. package/dist/engine/team-planner/writer-reviewer.d.ts.map +1 -0
  82. package/dist/engine/team-planner/writer-reviewer.js +48 -0
  83. package/dist/engine/team-planner/writer-reviewer.js.map +1 -0
  84. package/dist/engine/tool-groups/group-manager.js.map +1 -1
  85. package/dist/index.js +11 -1
  86. package/dist/index.js.map +1 -1
  87. package/dist/storage/drift-cache-store.js.map +1 -1
  88. package/dist/storage/error-telemetry-store.js.map +1 -1
  89. package/dist/storage/federation-store.js.map +1 -1
  90. package/dist/storage/global-store.js.map +1 -1
  91. package/dist/storage/ideas-store.d.ts.map +1 -1
  92. package/dist/storage/ideas-store.js.map +1 -1
  93. package/dist/storage/living-dashboard-store.js.map +1 -1
  94. package/dist/storage/metrics-store.js.map +1 -1
  95. package/dist/storage/rbac-store.js.map +1 -1
  96. package/dist/storage/spec-observability-store.js.map +1 -1
  97. package/dist/storage/worker-metrics-store.js.map +1 -1
  98. package/dist/storage/worker-store.js.map +1 -1
  99. package/dist/tools/checkpoint-handler.d.ts.map +1 -1
  100. package/dist/tools/checkpoint-handler.js +11 -0
  101. package/dist/tools/checkpoint-handler.js.map +1 -1
  102. package/dist/tools/clarify-requirements/interview-mode.d.ts +42 -0
  103. package/dist/tools/clarify-requirements/interview-mode.d.ts.map +1 -0
  104. package/dist/tools/clarify-requirements/interview-mode.js +342 -0
  105. package/dist/tools/clarify-requirements/interview-mode.js.map +1 -0
  106. package/dist/tools/configure-workers-handler.d.ts.map +1 -1
  107. package/dist/tools/configure-workers-handler.js +81 -0
  108. package/dist/tools/configure-workers-handler.js.map +1 -1
  109. package/dist/tools/facilitate.d.ts +1 -5
  110. package/dist/tools/facilitate.d.ts.map +1 -1
  111. package/dist/tools/facilitate.js +100 -23
  112. package/dist/tools/facilitate.js.map +1 -1
  113. package/dist/tools/generate-automation-guide.d.ts +10 -0
  114. package/dist/tools/generate-automation-guide.d.ts.map +1 -0
  115. package/dist/tools/generate-automation-guide.js +222 -0
  116. package/dist/tools/generate-automation-guide.js.map +1 -0
  117. package/dist/tools/generate-batch-script.d.ts +27 -0
  118. package/dist/tools/generate-batch-script.d.ts.map +1 -0
  119. package/dist/tools/generate-batch-script.js +77 -0
  120. package/dist/tools/generate-batch-script.js.map +1 -0
  121. package/dist/tools/generate-sub-agent.d.ts.map +1 -1
  122. package/dist/tools/generate-sub-agent.js +16 -2
  123. package/dist/tools/generate-sub-agent.js.map +1 -1
  124. package/dist/tools/git/branch-ops.d.ts +18 -0
  125. package/dist/tools/git/branch-ops.d.ts.map +1 -1
  126. package/dist/tools/git/branch-ops.js +121 -0
  127. package/dist/tools/git/branch-ops.js.map +1 -1
  128. package/dist/tools/git/pr-ops.d.ts.map +1 -1
  129. package/dist/tools/git/pr-ops.js +7 -0
  130. package/dist/tools/git/pr-ops.js.map +1 -1
  131. package/dist/tools/init-project/git-setup.d.ts.map +1 -1
  132. package/dist/tools/init-project/git-setup.js.map +1 -1
  133. package/dist/tools/init-project/handler.d.ts.map +1 -1
  134. package/dist/tools/init-project/handler.js +5 -2
  135. package/dist/tools/init-project/handler.js.map +1 -1
  136. package/dist/tools/init-project/hooks-configurator.d.ts +17 -0
  137. package/dist/tools/init-project/hooks-configurator.d.ts.map +1 -0
  138. package/dist/tools/init-project/hooks-configurator.js +102 -0
  139. package/dist/tools/init-project/hooks-configurator.js.map +1 -0
  140. package/dist/tools/init-project/lifecycle-helpers.d.ts.map +1 -1
  141. package/dist/tools/init-project/lifecycle-helpers.js +1 -1
  142. package/dist/tools/init-project/lifecycle-helpers.js.map +1 -1
  143. package/dist/tools/init-project/migration-runner.d.ts.map +1 -1
  144. package/dist/tools/init-project/migration-runner.js +1 -1
  145. package/dist/tools/init-project/migration-runner.js.map +1 -1
  146. package/dist/tools/init-project/planu-workflow-generator.d.ts +21 -0
  147. package/dist/tools/init-project/planu-workflow-generator.d.ts.map +1 -0
  148. package/dist/tools/init-project/planu-workflow-generator.js +73 -0
  149. package/dist/tools/init-project/planu-workflow-generator.js.map +1 -0
  150. package/dist/tools/init-project/rules-generator.d.ts +15 -0
  151. package/dist/tools/init-project/rules-generator.d.ts.map +1 -0
  152. package/dist/tools/init-project/rules-generator.js +110 -0
  153. package/dist/tools/init-project/rules-generator.js.map +1 -0
  154. package/dist/tools/init-project/scaffold-writer.d.ts +3 -0
  155. package/dist/tools/init-project/scaffold-writer.d.ts.map +1 -1
  156. package/dist/tools/init-project/scaffold-writer.js +33 -0
  157. package/dist/tools/init-project/scaffold-writer.js.map +1 -1
  158. package/dist/tools/integrate-pm.js.map +1 -1
  159. package/dist/tools/license-status.js +4 -4
  160. package/dist/tools/license-status.js.map +1 -1
  161. package/dist/tools/list-backlog-handler.d.ts.map +1 -1
  162. package/dist/tools/list-backlog-handler.js +4 -1
  163. package/dist/tools/list-backlog-handler.js.map +1 -1
  164. package/dist/tools/list-sessions.d.ts.map +1 -1
  165. package/dist/tools/list-sessions.js +8 -0
  166. package/dist/tools/list-sessions.js.map +1 -1
  167. package/dist/tools/manage-git.d.ts.map +1 -1
  168. package/dist/tools/manage-git.js +15 -1
  169. package/dist/tools/manage-git.js.map +1 -1
  170. package/dist/tools/orchestrate/state.js.map +1 -1
  171. package/dist/tools/promote-idea-handler.d.ts.map +1 -1
  172. package/dist/tools/promote-idea-handler.js +1 -3
  173. package/dist/tools/promote-idea-handler.js.map +1 -1
  174. package/dist/tools/recommend-model-handler.d.ts.map +1 -1
  175. package/dist/tools/recommend-model-handler.js +7 -0
  176. package/dist/tools/recommend-model-handler.js.map +1 -1
  177. package/dist/tools/register-backlog-tools.d.ts.map +1 -1
  178. package/dist/tools/register-backlog-tools.js +3 -13
  179. package/dist/tools/register-backlog-tools.js.map +1 -1
  180. package/dist/tools/register-facilitator-tools.d.ts.map +1 -1
  181. package/dist/tools/register-facilitator-tools.js +12 -7
  182. package/dist/tools/register-facilitator-tools.js.map +1 -1
  183. package/dist/tools/register-generate-automation-guide.d.ts +3 -0
  184. package/dist/tools/register-generate-automation-guide.d.ts.map +1 -0
  185. package/dist/tools/register-generate-automation-guide.js +10 -0
  186. package/dist/tools/register-generate-automation-guide.js.map +1 -0
  187. package/dist/tools/register-generate-batch-script.d.ts +3 -0
  188. package/dist/tools/register-generate-batch-script.d.ts.map +1 -0
  189. package/dist/tools/register-generate-batch-script.js +10 -0
  190. package/dist/tools/register-generate-batch-script.js.map +1 -0
  191. package/dist/tools/register-hooks-tools.d.ts.map +1 -1
  192. package/dist/tools/register-hooks-tools.js +27 -0
  193. package/dist/tools/register-hooks-tools.js.map +1 -1
  194. package/dist/tools/register-platform-tools/design-stack-tools.d.ts.map +1 -1
  195. package/dist/tools/register-platform-tools/design-stack-tools.js +4 -0
  196. package/dist/tools/register-platform-tools/design-stack-tools.js.map +1 -1
  197. package/dist/tools/restore-session.d.ts.map +1 -1
  198. package/dist/tools/restore-session.js +10 -0
  199. package/dist/tools/restore-session.js.map +1 -1
  200. package/dist/tools/schemas/ide-config.d.ts +2 -2
  201. package/dist/tools/schemas/workers-schema.d.ts +1 -0
  202. package/dist/tools/schemas/workers-schema.d.ts.map +1 -1
  203. package/dist/tools/schemas/workers-schema.js +10 -2
  204. package/dist/tools/schemas/workers-schema.js.map +1 -1
  205. package/dist/tools/start-hooks.d.ts.map +1 -1
  206. package/dist/tools/start-hooks.js +104 -1
  207. package/dist/tools/start-hooks.js.map +1 -1
  208. package/dist/tools/status-handler.d.ts.map +1 -1
  209. package/dist/tools/status-handler.js +9 -0
  210. package/dist/tools/status-handler.js.map +1 -1
  211. package/dist/types/analysis.d.ts +8 -0
  212. package/dist/types/analysis.d.ts.map +1 -1
  213. package/dist/types/batch-script.d.ts +36 -0
  214. package/dist/types/batch-script.d.ts.map +1 -0
  215. package/dist/types/batch-script.js +3 -0
  216. package/dist/types/batch-script.js.map +1 -0
  217. package/dist/types/ci.d.ts +4 -0
  218. package/dist/types/ci.d.ts.map +1 -1
  219. package/dist/types/common/tech-enums.d.ts +1 -1
  220. package/dist/types/common/tech-enums.d.ts.map +1 -1
  221. package/dist/types/execution.d.ts +9 -0
  222. package/dist/types/execution.d.ts.map +1 -1
  223. package/dist/types/facilitator.d.ts +67 -0
  224. package/dist/types/facilitator.d.ts.map +1 -1
  225. package/dist/types/file-hooks.d.ts +7 -0
  226. package/dist/types/file-hooks.d.ts.map +1 -1
  227. package/dist/types/file-hooks.js +0 -1
  228. package/dist/types/file-hooks.js.map +1 -1
  229. package/dist/types/git.d.ts +12 -0
  230. package/dist/types/git.d.ts.map +1 -1
  231. package/dist/types/hooks.d.ts +77 -0
  232. package/dist/types/hooks.d.ts.map +1 -1
  233. package/dist/types/index.d.ts +1 -0
  234. package/dist/types/index.d.ts.map +1 -1
  235. package/dist/types/index.js +1 -0
  236. package/dist/types/index.js.map +1 -1
  237. package/dist/types/model-routing.d.ts +16 -0
  238. package/dist/types/model-routing.d.ts.map +1 -1
  239. package/dist/types/project/planu-config.d.ts +6 -0
  240. package/dist/types/project/planu-config.d.ts.map +1 -1
  241. package/dist/types/session.d.ts +2 -0
  242. package/dist/types/session.d.ts.map +1 -1
  243. package/dist/types/stack/recommend.d.ts +1 -0
  244. package/dist/types/stack/recommend.d.ts.map +1 -1
  245. package/dist/types/status.d.ts +7 -0
  246. package/dist/types/status.d.ts.map +1 -1
  247. package/dist/types/team-planner.d.ts +18 -0
  248. package/dist/types/team-planner.d.ts.map +1 -1
  249. package/dist/types/workers.d.ts +1 -1
  250. package/dist/types/workers.d.ts.map +1 -1
  251. package/package.json +10 -10
  252. package/src/config/license-plans.json +3 -1
@@ -0,0 +1,163 @@
1
+ // engine/hooks/context-injector.ts — Reads project data and writes .planu/plan-context.md (SPEC-262)
2
+ import { readFile, writeFile, mkdir } from 'node:fs/promises';
3
+ import { join } from 'node:path';
4
+ import { createHash } from 'node:crypto';
5
+ // ---------------------------------------------------------------------------
6
+ // Constants
7
+ // ---------------------------------------------------------------------------
8
+ const ACTIVE_STATUSES = ['implementing', 'approved'];
9
+ const MAX_RELATED_SPECS = 3;
10
+ const MAX_RECENT_DECISIONS = 5;
11
+ // ---------------------------------------------------------------------------
12
+ // Internal helpers
13
+ // ---------------------------------------------------------------------------
14
+ function hashProjectPath(projectPath) {
15
+ return createHash('sha256').update(projectPath).digest('hex').slice(0, 16);
16
+ }
17
+ /** Safely extract a string from an unknown value — returns '' when not a string */
18
+ function str(val) {
19
+ return typeof val === 'string' ? val : '';
20
+ }
21
+ async function loadSpecs(projectPath) {
22
+ const projectId = hashProjectPath(projectPath);
23
+ const specsFile = join(projectPath, 'data', 'projects', projectId, 'specs.json');
24
+ try {
25
+ const raw = await readFile(specsFile, 'utf-8');
26
+ return JSON.parse(raw);
27
+ }
28
+ catch {
29
+ return [];
30
+ }
31
+ }
32
+ async function loadDecisions(projectPath) {
33
+ const projectId = hashProjectPath(projectPath);
34
+ const decisionsFile = join(projectPath, 'data', 'projects', projectId, 'decisions.json');
35
+ try {
36
+ const raw = await readFile(decisionsFile, 'utf-8');
37
+ const data = JSON.parse(raw);
38
+ return data.decisions ?? [];
39
+ }
40
+ catch {
41
+ return [];
42
+ }
43
+ }
44
+ /**
45
+ * Scores a spec's relevance to the task description.
46
+ * Returns a score >= 0; higher is more relevant.
47
+ */
48
+ function relevanceScore(spec, taskDescription) {
49
+ if (!taskDescription.trim()) {
50
+ return 0;
51
+ }
52
+ const specText = [str(spec.id), str(spec.title)].join(' ').toLowerCase();
53
+ const words = taskDescription
54
+ .toLowerCase()
55
+ .split(/\W+/)
56
+ .filter((w) => w.length > 2);
57
+ return words.reduce((score, word) => {
58
+ return specText.includes(word) ? score + 1 : score;
59
+ }, 0);
60
+ }
61
+ function formatDecisionSummary(d) {
62
+ const title = str(d.title);
63
+ const detail = str(d.summary) || str(d.rationale);
64
+ return [title, detail].filter(Boolean).join(': ');
65
+ }
66
+ // ---------------------------------------------------------------------------
67
+ // Public API
68
+ // ---------------------------------------------------------------------------
69
+ /**
70
+ * Reads project specs and decisions from data/ and writes
71
+ * .planu/plan-context.md in the project root.
72
+ */
73
+ export async function injectPlanContext(projectPath, taskDescription) {
74
+ const md = await buildContextMarkdown(projectPath, taskDescription);
75
+ const planuDir = join(projectPath, '.planu');
76
+ await mkdir(planuDir, { recursive: true });
77
+ await writeFile(join(planuDir, 'plan-context.md'), md, 'utf-8');
78
+ }
79
+ /**
80
+ * Builds the markdown content for .planu/plan-context.md.
81
+ * Pure function for testability — does not write to disk.
82
+ */
83
+ export async function buildContextMarkdown(projectPath, taskDescription) {
84
+ const [allSpecs, allDecisions] = await Promise.all([
85
+ loadSpecs(projectPath),
86
+ loadDecisions(projectPath),
87
+ ]);
88
+ // Active specs: implementing or approved
89
+ const activeSpecs = allSpecs
90
+ .filter((s) => ACTIVE_STATUSES.includes(str(s.status)))
91
+ .map((s) => ({ id: str(s.id), title: str(s.title), status: str(s.status) }));
92
+ // Related specs: non-active specs scored by keyword match
93
+ const desc = taskDescription ?? '';
94
+ const relatedSpecs = allSpecs
95
+ .filter((s) => !ACTIVE_STATUSES.includes(str(s.status)))
96
+ .map((s) => ({ spec: s, score: relevanceScore(s, desc) }))
97
+ .filter(({ score }) => score > 0)
98
+ .sort((a, b) => b.score - a.score)
99
+ .slice(0, MAX_RELATED_SPECS)
100
+ .map(({ spec, score }) => ({
101
+ id: str(spec.id),
102
+ title: str(spec.title),
103
+ status: str(spec.status),
104
+ relevanceReason: `keyword match (score: ${score})`,
105
+ }));
106
+ // Recent decisions
107
+ const recentDecisions = allDecisions
108
+ .slice(-MAX_RECENT_DECISIONS)
109
+ .reverse()
110
+ .map(formatDecisionSummary)
111
+ .filter(Boolean);
112
+ const context = {
113
+ activeSpecs,
114
+ relatedSpecs,
115
+ recentDecisions,
116
+ generatedAt: new Date().toISOString(),
117
+ };
118
+ return renderMarkdown(context, taskDescription);
119
+ }
120
+ function renderMarkdown(ctx, taskDescription) {
121
+ const lines = [
122
+ '# Planu Context — Plan Mode',
123
+ '> Auto-generated by Planu. Claude: read this before exploring.',
124
+ '',
125
+ ];
126
+ if (taskDescription) {
127
+ lines.push('## Task', taskDescription, '');
128
+ }
129
+ lines.push('## Active Specs');
130
+ if (ctx.activeSpecs.length === 0) {
131
+ lines.push('_No specs currently implementing or approved._');
132
+ }
133
+ else {
134
+ for (const s of ctx.activeSpecs) {
135
+ lines.push(`- ${s.id}: ${s.title} (${s.status})`);
136
+ }
137
+ }
138
+ lines.push('');
139
+ lines.push('## Related Specs (semantic match)');
140
+ if (ctx.relatedSpecs.length === 0) {
141
+ lines.push('_No related specs found._');
142
+ }
143
+ else {
144
+ for (const s of ctx.relatedSpecs) {
145
+ const reason = s.relevanceReason ? ` — ${s.relevanceReason}` : '';
146
+ lines.push(`- ${s.id}: ${s.title}${reason}`);
147
+ }
148
+ }
149
+ lines.push('');
150
+ lines.push('## Recent Decisions');
151
+ if (ctx.recentDecisions.length === 0) {
152
+ lines.push('_No recent decisions recorded._');
153
+ }
154
+ else {
155
+ for (const d of ctx.recentDecisions) {
156
+ lines.push(`- ${d}`);
157
+ }
158
+ }
159
+ lines.push('');
160
+ lines.push('## Suggested next step', 'After exploring, call `facilitate` with your findings to create a spec.', '', `> Generated at: ${ctx.generatedAt}`);
161
+ return lines.join('\n');
162
+ }
163
+ //# sourceMappingURL=context-injector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-injector.js","sourceRoot":"","sources":["../../../src/engine/hooks/context-injector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { HookTemplateName, HookTemplateOptions, GeneratedHookConfig } from '../../types/index.js';
2
+ /**
3
+ * Generates a Claude Code hook configuration for the given template.
4
+ * `notification-desktop` auto-detects the current platform via process.platform.
5
+ */
6
+ export declare function generateHookTemplate(opts: HookTemplateOptions): GeneratedHookConfig;
7
+ /**
8
+ * Merges a new hook config into an existing settings object without overwriting.
9
+ * Existing hooks for the same event type are preserved (array merge).
10
+ */
11
+ export declare function mergeHookConfig(existing: Record<string, unknown>, newHook: GeneratedHookConfig): Record<string, unknown>;
12
+ /**
13
+ * Returns all valid HookTemplateName values (for use in Zod schemas and descriptions).
14
+ */
15
+ export declare function listHookTemplateNames(): HookTemplateName[];
16
+ //# sourceMappingURL=hook-templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-templates.d.ts","sourceRoot":"","sources":["../../../src/engine/hooks/hook-templates.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,gBAAgB,EAEhB,mBAAmB,EACnB,mBAAmB,EAEpB,MAAM,sBAAsB,CAAC;AAuH9B;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,mBAAmB,GAAG,mBAAmB,CAsBnF;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,OAAO,EAAE,mBAAmB,GAC3B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAUzB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,gBAAgB,EAAE,CAS1D"}
@@ -0,0 +1,148 @@
1
+ // engine/hooks/hook-templates.ts — Claude Code notification & permission hook templates (SPEC-258)
2
+ // ---------------------------------------------------------------------------
3
+ // Template builders
4
+ // ---------------------------------------------------------------------------
5
+ function buildNotificationEntry(command, matcher) {
6
+ return {
7
+ matcher: matcher ?? '',
8
+ hooks: [{ type: 'command', command }],
9
+ };
10
+ }
11
+ function buildMacosTemplate(matcher) {
12
+ return {
13
+ hooks: {
14
+ Notification: [
15
+ buildNotificationEntry('osascript -e \'display notification "Claude needs your attention" with title "Planu"\'', matcher),
16
+ ],
17
+ },
18
+ mergeInstructions: 'Add the "Notification" key to the "hooks" object in .claude/settings.json.',
19
+ description: 'macOS desktop notification via osascript when Claude requests attention.',
20
+ };
21
+ }
22
+ function buildLinuxTemplate(matcher) {
23
+ return {
24
+ hooks: {
25
+ Notification: [
26
+ buildNotificationEntry("notify-send 'Planu' 'Claude needs your attention'", matcher),
27
+ ],
28
+ },
29
+ mergeInstructions: 'Add the "Notification" key to the "hooks" object in .claude/settings.json.',
30
+ description: 'Linux desktop notification via notify-send when Claude requests attention. Requires libnotify-bin.',
31
+ };
32
+ }
33
+ function buildWindowsTemplate(matcher) {
34
+ const command = "powershell.exe -Command \"[System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms'); " +
35
+ "[System.Windows.Forms.MessageBox]::Show('Claude needs your attention', 'Planu')\"";
36
+ return {
37
+ hooks: {
38
+ Notification: [buildNotificationEntry(command, matcher)],
39
+ },
40
+ mergeInstructions: 'Add the "Notification" key to the "hooks" object in .claude/settings.json.',
41
+ description: 'Windows desktop notification via PowerShell MessageBox when Claude needs input.',
42
+ };
43
+ }
44
+ function buildDesktopTemplate(matcher) {
45
+ const platform = process.platform;
46
+ if (platform === 'darwin') {
47
+ return buildMacosTemplate(matcher);
48
+ }
49
+ if (platform === 'win32') {
50
+ return buildWindowsTemplate(matcher);
51
+ }
52
+ // Default to Linux for all other platforms (linux, freebsd, etc.)
53
+ return buildLinuxTemplate(matcher);
54
+ }
55
+ function buildInstructionsLoadedDebugTemplate() {
56
+ return {
57
+ hooks: {
58
+ InstructionsLoaded: [
59
+ {
60
+ matcher: '',
61
+ hooks: [
62
+ {
63
+ type: 'command',
64
+ command: 'echo "[CLAUDE $(date +%H:%M:%S)] Instructions loaded: $CLAUDE_INSTRUCTIONS_FILE" >> ~/.claude/instructions-debug.log',
65
+ },
66
+ ],
67
+ },
68
+ ],
69
+ },
70
+ mergeInstructions: 'Add the "InstructionsLoaded" key to the "hooks" object in .claude/settings.json.',
71
+ description: 'Debug hook that appends a timestamped line to ~/.claude/instructions-debug.log every time Claude loads instructions.',
72
+ };
73
+ }
74
+ function buildPermissionAutoApproveReadonlyTemplate() {
75
+ return {
76
+ hooks: {
77
+ PermissionRequest: [
78
+ {
79
+ matcher: 'Read|Glob|Grep',
80
+ hooks: [
81
+ {
82
+ type: 'command',
83
+ command: 'echo \'{"decision": "allow", "reason": "Read-only operation auto-approved by Planu"}\'',
84
+ },
85
+ ],
86
+ },
87
+ ],
88
+ },
89
+ mergeInstructions: 'Add the "PermissionRequest" key to the "hooks" object in .claude/settings.json.',
90
+ description: 'Automatically approves read-only permission requests (Read, Glob, Grep) without user confirmation.',
91
+ };
92
+ }
93
+ // ---------------------------------------------------------------------------
94
+ // Public API
95
+ // ---------------------------------------------------------------------------
96
+ /**
97
+ * Generates a Claude Code hook configuration for the given template.
98
+ * `notification-desktop` auto-detects the current platform via process.platform.
99
+ */
100
+ export function generateHookTemplate(opts) {
101
+ const { template, notificationMatcher } = opts;
102
+ switch (template) {
103
+ case 'notification-macos':
104
+ return buildMacosTemplate(notificationMatcher);
105
+ case 'notification-linux':
106
+ return buildLinuxTemplate(notificationMatcher);
107
+ case 'notification-windows':
108
+ return buildWindowsTemplate(notificationMatcher);
109
+ case 'notification-desktop':
110
+ return buildDesktopTemplate(notificationMatcher);
111
+ case 'instructions-loaded-debug':
112
+ return buildInstructionsLoadedDebugTemplate();
113
+ case 'permission-auto-approve-readonly':
114
+ return buildPermissionAutoApproveReadonlyTemplate();
115
+ /* v8 ignore next 3 */
116
+ default: {
117
+ const _exhaustive = template;
118
+ throw new Error(`Unknown hook template: ${String(_exhaustive)}`);
119
+ }
120
+ }
121
+ }
122
+ /**
123
+ * Merges a new hook config into an existing settings object without overwriting.
124
+ * Existing hooks for the same event type are preserved (array merge).
125
+ */
126
+ export function mergeHookConfig(existing, newHook) {
127
+ const existingHooks = (existing.hooks ?? {});
128
+ const merged = { ...existingHooks };
129
+ for (const [eventType, entries] of Object.entries(newHook.hooks)) {
130
+ const current = merged[eventType] ?? [];
131
+ merged[eventType] = [...current, ...entries];
132
+ }
133
+ return { ...existing, hooks: merged };
134
+ }
135
+ /**
136
+ * Returns all valid HookTemplateName values (for use in Zod schemas and descriptions).
137
+ */
138
+ export function listHookTemplateNames() {
139
+ return [
140
+ 'notification-macos',
141
+ 'notification-linux',
142
+ 'notification-windows',
143
+ 'notification-desktop',
144
+ 'instructions-loaded-debug',
145
+ 'permission-auto-approve-readonly',
146
+ ];
147
+ }
148
+ //# sourceMappingURL=hook-templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-templates.js","sourceRoot":"","sources":["../../../src/engine/hooks/hook-templates.ts"],"names":[],"mappings":"AAAA,mGAAmG;AAUnG,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E,SAAS,sBAAsB,CAC7B,OAAe,EACf,OAAwC;IAExC,OAAO;QACL,OAAO,EAAE,OAAO,IAAI,EAAE;QACtB,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;KACtC,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAwC;IAClE,OAAO;QACL,KAAK,EAAE;YACL,YAAY,EAAE;gBACZ,sBAAsB,CACpB,wFAAwF,EACxF,OAAO,CACR;aACF;SACF;QACD,iBAAiB,EAAE,4EAA4E;QAC/F,WAAW,EAAE,0EAA0E;KACxF,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAwC;IAClE,OAAO;QACL,KAAK,EAAE;YACL,YAAY,EAAE;gBACZ,sBAAsB,CAAC,mDAAmD,EAAE,OAAO,CAAC;aACrF;SACF;QACD,iBAAiB,EAAE,4EAA4E;QAC/F,WAAW,EACT,oGAAoG;KACvG,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,OAAwC;IACpE,MAAM,OAAO,GACX,uGAAuG;QACvG,mFAAmF,CAAC;IACtF,OAAO;QACL,KAAK,EAAE;YACL,YAAY,EAAE,CAAC,sBAAsB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;SACzD;QACD,iBAAiB,EAAE,4EAA4E;QAC/F,WAAW,EAAE,iFAAiF;KAC/F,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,OAAwC;IACpE,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IACD,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO,oBAAoB,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;IACD,kEAAkE;IAClE,OAAO,kBAAkB,CAAC,OAAO,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,oCAAoC;IAC3C,OAAO;QACL,KAAK,EAAE;YACL,kBAAkB,EAAE;gBAClB;oBACE,OAAO,EAAE,EAAE;oBACX,KAAK,EAAE;wBACL;4BACE,IAAI,EAAE,SAAS;4BACf,OAAO,EACL,sHAAsH;yBACzH;qBACF;iBACF;aACF;SACF;QACD,iBAAiB,EACf,kFAAkF;QACpF,WAAW,EACT,sHAAsH;KACzH,CAAC;AACJ,CAAC;AAED,SAAS,0CAA0C;IACjD,OAAO;QACL,KAAK,EAAE;YACL,iBAAiB,EAAE;gBACjB;oBACE,OAAO,EAAE,gBAAgB;oBACzB,KAAK,EAAE;wBACL;4BACE,IAAI,EAAE,SAAS;4BACf,OAAO,EACL,wFAAwF;yBAC3F;qBACF;iBACF;aACF;SACF;QACD,iBAAiB,EACf,iFAAiF;QACnF,WAAW,EACT,oGAAoG;KACvG,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAyB;IAC5D,MAAM,EAAE,QAAQ,EAAE,mBAAmB,EAAE,GAAG,IAAI,CAAC;IAE/C,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,oBAAoB;YACvB,OAAO,kBAAkB,CAAC,mBAAmB,CAAC,CAAC;QACjD,KAAK,oBAAoB;YACvB,OAAO,kBAAkB,CAAC,mBAAmB,CAAC,CAAC;QACjD,KAAK,sBAAsB;YACzB,OAAO,oBAAoB,CAAC,mBAAmB,CAAC,CAAC;QACnD,KAAK,sBAAsB;YACzB,OAAO,oBAAoB,CAAC,mBAAmB,CAAC,CAAC;QACnD,KAAK,2BAA2B;YAC9B,OAAO,oCAAoC,EAAE,CAAC;QAChD,KAAK,kCAAkC;YACrC,OAAO,0CAA0C,EAAE,CAAC;QACtD,sBAAsB;QACtB,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,WAAW,GAAU,QAAQ,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,0BAA0B,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAC7B,QAAiC,EACjC,OAA4B;IAE5B,MAAM,aAAa,GAAG,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAA0C,CAAC;IACtF,MAAM,MAAM,GAA0C,EAAE,GAAG,aAAa,EAAE,CAAC;IAE3E,KAAK,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjE,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QACxC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,EAAE,GAAG,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO;QACL,oBAAoB;QACpB,oBAAoB;QACpB,sBAAsB;QACtB,sBAAsB;QACtB,2BAA2B;QAC3B,kCAAkC;KACnC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { PlanModeEvent } from '../../types/index.js';
2
+ /**
3
+ * Reads CLAUDE_TOOL_NAME and CLAUDE_TOOL_INPUT from the environment
4
+ * and returns a PlanModeEvent describing the current tool invocation.
5
+ *
6
+ * This is designed to be called from Claude Code hook scripts that set
7
+ * these env vars before invoking the hook handler.
8
+ */
9
+ export declare function detectPlanModeEvent(): PlanModeEvent;
10
+ /**
11
+ * Returns true when the given tool name corresponds to entering Plan Mode.
12
+ */
13
+ export declare function isEnterPlanMode(toolName: string): boolean;
14
+ /**
15
+ * Returns true when the given tool name corresponds to exiting Plan Mode.
16
+ */
17
+ export declare function isExitPlanMode(toolName: string): boolean;
18
+ /**
19
+ * Attempts to extract a human-readable task description from the JSON-encoded
20
+ * CLAUDE_TOOL_INPUT string. Returns null when the input is empty or cannot
21
+ * be parsed, or when no recognisable description field is present.
22
+ *
23
+ * Claude Code's Task tool input has the shape: { description: string, ... }
24
+ * We also fall back to a `prompt`, `task`, or `content` field.
25
+ */
26
+ export declare function extractTaskDescription(toolInput: string): string | null;
27
+ //# sourceMappingURL=plan-mode-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-mode-detector.d.ts","sourceRoot":"","sources":["../../../src/engine/hooks/plan-mode-detector.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAa1D;;;;;;GAMG;AACH,wBAAgB,mBAAmB,IAAI,aAAa,CAKnD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAExD;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA4BvE"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Names of Claude Code tools that indicate entering Plan Mode.
3
+ * The main "Task" tool is how Claude enters plan mode; "plan" is an alias.
4
+ */
5
+ const ENTER_PLAN_MODE_TOOLS = ['Task'];
6
+ /**
7
+ * Names of Claude Code tools that indicate exiting Plan Mode.
8
+ */
9
+ const EXIT_PLAN_MODE_TOOLS = ['exit_plan_mode'];
10
+ /**
11
+ * Reads CLAUDE_TOOL_NAME and CLAUDE_TOOL_INPUT from the environment
12
+ * and returns a PlanModeEvent describing the current tool invocation.
13
+ *
14
+ * This is designed to be called from Claude Code hook scripts that set
15
+ * these env vars before invoking the hook handler.
16
+ */
17
+ export function detectPlanModeEvent() {
18
+ const toolName = process.env.CLAUDE_TOOL_NAME ?? '';
19
+ const toolInputRaw = process.env.CLAUDE_TOOL_INPUT ?? '';
20
+ const taskDescription = extractTaskDescription(toolInputRaw);
21
+ return { toolName, taskDescription };
22
+ }
23
+ /**
24
+ * Returns true when the given tool name corresponds to entering Plan Mode.
25
+ */
26
+ export function isEnterPlanMode(toolName) {
27
+ return ENTER_PLAN_MODE_TOOLS.includes(toolName);
28
+ }
29
+ /**
30
+ * Returns true when the given tool name corresponds to exiting Plan Mode.
31
+ */
32
+ export function isExitPlanMode(toolName) {
33
+ return EXIT_PLAN_MODE_TOOLS.includes(toolName);
34
+ }
35
+ /**
36
+ * Attempts to extract a human-readable task description from the JSON-encoded
37
+ * CLAUDE_TOOL_INPUT string. Returns null when the input is empty or cannot
38
+ * be parsed, or when no recognisable description field is present.
39
+ *
40
+ * Claude Code's Task tool input has the shape: { description: string, ... }
41
+ * We also fall back to a `prompt`, `task`, or `content` field.
42
+ */
43
+ export function extractTaskDescription(toolInput) {
44
+ if (!toolInput.trim()) {
45
+ return null;
46
+ }
47
+ let parsed;
48
+ try {
49
+ parsed = JSON.parse(toolInput);
50
+ }
51
+ catch {
52
+ // Not JSON — treat the raw string as the description if it is short enough
53
+ const trimmed = toolInput.trim();
54
+ return trimmed.length > 0 && trimmed.length <= 2000 ? trimmed : null;
55
+ }
56
+ if (typeof parsed !== 'object' || parsed === null) {
57
+ return null;
58
+ }
59
+ const obj = parsed;
60
+ for (const key of ['description', 'prompt', 'task', 'content']) {
61
+ const val = obj[key];
62
+ if (typeof val === 'string' && val.trim().length > 0) {
63
+ return val.trim();
64
+ }
65
+ }
66
+ return null;
67
+ }
68
+ //# sourceMappingURL=plan-mode-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-mode-detector.js","sourceRoot":"","sources":["../../../src/engine/hooks/plan-mode-detector.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,qBAAqB,GAAsB,CAAC,MAAM,CAAC,CAAC;AAE1D;;GAEG;AACH,MAAM,oBAAoB,GAAsB,CAAC,gBAAgB,CAAC,CAAC;AAEnE;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB;IACjC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,EAAE,CAAC;IACpD,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC;IACzD,MAAM,eAAe,GAAG,sBAAsB,CAAC,YAAY,CAAC,CAAC;IAC7D,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,OAAO,qBAAqB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,OAAO,oBAAoB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACjD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,sBAAsB,CAAC,SAAiB;IACtD,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,2EAA2E;QAC3E,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;QACjC,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IACvE,CAAC;IAED,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QAClD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,GAAG,GAAG,MAAiC,CAAC;IAE9C,KAAK,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC;QAC/D,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACrB,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrD,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;QACpB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { PlanModeHookScripts } from '../../types/index.js';
2
+ /**
3
+ * Returns the content of the two bash scripts that integrate Planu with
4
+ * Claude Code's Plan Mode hooks:
5
+ *
6
+ * - preScript: called by PreToolUse when tool name is "Task" (entering Plan Mode)
7
+ * - postScript: called by PostToolUse when tool name is "exit_plan_mode"
8
+ */
9
+ export declare function buildPlanModeHookScripts(): PlanModeHookScripts;
10
+ //# sourceMappingURL=plan-mode-scripts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-mode-scripts.d.ts","sourceRoot":"","sources":["../../../src/engine/hooks/plan-mode-scripts.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAEhE;;;;;;GAMG;AACH,wBAAgB,wBAAwB,IAAI,mBAAmB,CAI9D"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Returns the content of the two bash scripts that integrate Planu with
3
+ * Claude Code's Plan Mode hooks:
4
+ *
5
+ * - preScript: called by PreToolUse when tool name is "Task" (entering Plan Mode)
6
+ * - postScript: called by PostToolUse when tool name is "exit_plan_mode"
7
+ */
8
+ export function buildPlanModeHookScripts() {
9
+ const preScript = buildPreScript();
10
+ const postScript = buildPostScript();
11
+ return { preScript, postScript };
12
+ }
13
+ function buildPreScript() {
14
+ return [
15
+ '#!/usr/bin/env bash',
16
+ '# planu-pre-plan.sh — Auto-generated by Planu (SPEC-262)',
17
+ '# Called by Claude Code PreToolUse hook when entering Plan Mode (Task tool).',
18
+ '# Injects project context into .planu/plan-context.md',
19
+ '',
20
+ 'PROJECT_PATH="${CLAUDE_PROJECT_DIR:-$(pwd)}"',
21
+ '',
22
+ 'node -e "',
23
+ "import('@planu/cli/dist/engine/hooks/context-injector.js')",
24
+ ' .then(({ injectPlanContext }) =>',
25
+ ' injectPlanContext(process.env.PROJECT_PATH || process.cwd(), process.env.CLAUDE_TOOL_INPUT || null)',
26
+ ' )',
27
+ ' .catch(() => {});',
28
+ '" PROJECT_PATH="$PROJECT_PATH" 2>/dev/null || true',
29
+ '',
30
+ ].join('\n');
31
+ }
32
+ function buildPostScript() {
33
+ return [
34
+ '#!/usr/bin/env bash',
35
+ '# planu-post-plan.sh — Auto-generated by Planu (SPEC-262)',
36
+ '# Called by Claude Code PostToolUse hook when exiting Plan Mode.',
37
+ '# Appends a suggestion to call `facilitate` with plan findings.',
38
+ '',
39
+ "echo '---'",
40
+ "echo 'Planu: Plan Mode exited.'",
41
+ "echo 'Tip: call `facilitate` with your findings to create a spec, or `create_spec` directly.'",
42
+ '',
43
+ ].join('\n');
44
+ }
45
+ //# sourceMappingURL=plan-mode-scripts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-mode-scripts.js","sourceRoot":"","sources":["../../../src/engine/hooks/plan-mode-scripts.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB;IACtC,MAAM,SAAS,GAAG,cAAc,EAAE,CAAC;IACnC,MAAM,UAAU,GAAG,eAAe,EAAE,CAAC;IACrC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;AACnC,CAAC;AAED,SAAS,cAAc;IACrB,OAAO;QACL,qBAAqB;QACrB,0DAA0D;QAC1D,8EAA8E;QAC9E,uDAAuD;QACvD,EAAE;QACF,8CAA8C;QAC9C,EAAE;QACF,WAAW;QACX,4DAA4D;QAC5D,oCAAoC;QACpC,yGAAyG;QACzG,KAAK;QACL,qBAAqB;QACrB,oDAAoD;QACpD,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,eAAe;IACtB,OAAO;QACL,qBAAqB;QACrB,2DAA2D;QAC3D,kEAAkE;QAClE,iEAAiE;QACjE,EAAE;QACF,YAAY;QACZ,iCAAiC;QACjC,+FAA+F;QAC/F,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
@@ -1,4 +1,12 @@
1
- import type { ComplexitySignals, NormalisedSignals, PartialSignals } from '../../types/index.js';
1
+ import type { ComplexitySignals, EffortSuggestion, NormalisedSignals, PartialSignals } from '../../types/index.js';
2
+ /**
3
+ * Compute the suggested effort level for a task based on its signals and description.
4
+ * Returns 'ultrathink' for architectural/high-risk tasks, scaling down to 'low' for simple ones.
5
+ */
6
+ export declare function computeEffortSuggestion(signals: Pick<ComplexitySignals, 'taskType' | 'hasSecurityImplications'> & {
7
+ criteriaCount: number;
8
+ crossLayerCount: number;
9
+ }, text: string): EffortSuggestion;
2
10
  /**
3
11
  * Extract complexity signals from a text description (spec content or task description).
4
12
  * Missing signals are filled with sensible defaults.
@@ -1 +1 @@
1
- {"version":3,"file":"complexity-analyzer.d.ts","sourceRoot":"","sources":["../../../src/engine/model-router/complexity-analyzer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EAEf,MAAM,sBAAsB,CAAC;AAiK9B;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,cAAc,GAAG,iBAAiB,CAO1F;AAED,iFAAiF;AACjF,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,cAAc,GAAG,iBAAiB,CAElF;AAED,sDAAsD;AACtD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,EAAE,OAAO,CAAC;IACtB,uBAAuB,EAAE,OAAO,CAAC;IACjC,UAAU,EAAE,OAAO,CAAC;CACrB,GAAG,iBAAiB,CAYpB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAmBhE"}
1
+ {"version":3,"file":"complexity-analyzer.d.ts","sourceRoot":"","sources":["../../../src/engine/model-router/complexity-analyzer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EAEf,MAAM,sBAAsB,CAAC;AA8K9B;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,IAAI,CAAC,iBAAiB,EAAE,UAAU,GAAG,yBAAyB,CAAC,GAAG;IACzE,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;CACzB,EACD,IAAI,EAAE,MAAM,GACX,gBAAgB,CAwBlB;AAMD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,cAAc,GAAG,iBAAiB,CAa1F;AAED,iFAAiF;AACjF,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,cAAc,GAAG,iBAAiB,CAElF;AAED,sDAAsD;AACtD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,EAAE,OAAO,CAAC;IACtB,uBAAuB,EAAE,OAAO,CAAC;IACjC,UAAU,EAAE,OAAO,CAAC;CACrB,GAAG,iBAAiB,CAYpB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAmBhE"}
@@ -57,6 +57,18 @@ const DB_KEYWORDS = [
57
57
  'prisma',
58
58
  'drizzle',
59
59
  ];
60
+ /** Keywords that indicate ultra-deep reasoning is required (SPEC-259). */
61
+ const ULTRATHINK_KEYWORDS = [
62
+ 'architecture',
63
+ 'migration',
64
+ 'redesign',
65
+ 'security audit',
66
+ 'performance bottleneck',
67
+ 'race condition',
68
+ 'distributed system',
69
+ 'refactor entire',
70
+ 'redesign the',
71
+ ];
60
72
  /** Infer a TaskType from a text description. */
61
73
  function inferTaskType(text) {
62
74
  const lower = text.toLowerCase();
@@ -127,6 +139,33 @@ function extractRawSignals(text, overrides) {
127
139
  };
128
140
  }
129
141
  // ---------------------------------------------------------------------------
142
+ // Effort suggestion computation (SPEC-259)
143
+ // ---------------------------------------------------------------------------
144
+ /**
145
+ * Compute the suggested effort level for a task based on its signals and description.
146
+ * Returns 'ultrathink' for architectural/high-risk tasks, scaling down to 'low' for simple ones.
147
+ */
148
+ export function computeEffortSuggestion(signals, text) {
149
+ const lower = text.toLowerCase();
150
+ // Ultrathink conditions
151
+ const hasUltrathinkKeyword = ULTRATHINK_KEYWORDS.some((kw) => lower.includes(kw));
152
+ const isArchitectural = signals.taskType === 'architecture';
153
+ const isHighRisk = signals.hasSecurityImplications;
154
+ const isDifficultyUltra = signals.criteriaCount >= 20;
155
+ if (isArchitectural || isHighRisk || isDifficultyUltra || hasUltrathinkKeyword) {
156
+ return 'ultrathink';
157
+ }
158
+ // High: difficulty >= 3 (criteriaCount >= 12) or cross-module (crossLayerCount >= 3)
159
+ if (signals.criteriaCount >= 12 || signals.crossLayerCount >= 3) {
160
+ return 'high';
161
+ }
162
+ // Medium: difficulty >= 2 (criteriaCount >= 6)
163
+ if (signals.criteriaCount >= 6) {
164
+ return 'medium';
165
+ }
166
+ return 'low';
167
+ }
168
+ // ---------------------------------------------------------------------------
130
169
  // Public API
131
170
  // ---------------------------------------------------------------------------
132
171
  /**
@@ -137,7 +176,11 @@ export function extractSignals(text, overrides) {
137
176
  const raw = extractRawSignals(text, overrides);
138
177
  const normalised = normaliseSignals(raw);
139
178
  const overallScore = computeOverallScore(normalised);
140
- return { ...raw, overallScore };
179
+ const effortSuggestion = computeEffortSuggestion(raw, text);
180
+ const requiresDeepReasoning = effortSuggestion === 'ultrathink' ||
181
+ raw.taskType === 'architecture' ||
182
+ text.toLowerCase().includes('architecture');
183
+ return { ...raw, overallScore, requiresDeepReasoning, effortSuggestion };
141
184
  }
142
185
  /** Build signals entirely from an explicit partial object (no text analysis). */
143
186
  export function buildSignalsFromPartial(partial) {
@@ -1 +1 @@
1
- {"version":3,"file":"complexity-analyzer.js","sourceRoot":"","sources":["../../../src/engine/model-router/complexity-analyzer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"complexity-analyzer.js","sourceRoot":"","sources":["../../../src/engine/model-router/complexity-analyzer.ts"],"names":[],"mappings":"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"}