aicodeman 0.2.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.
- package/LICENSE +21 -0
- package/README.md +403 -0
- package/dist/ai-checker-base.d.ts +175 -0
- package/dist/ai-checker-base.d.ts.map +1 -0
- package/dist/ai-checker-base.js +424 -0
- package/dist/ai-checker-base.js.map +1 -0
- package/dist/ai-idle-checker.d.ts +53 -0
- package/dist/ai-idle-checker.d.ts.map +1 -0
- package/dist/ai-idle-checker.js +141 -0
- package/dist/ai-idle-checker.js.map +1 -0
- package/dist/ai-plan-checker.d.ts +52 -0
- package/dist/ai-plan-checker.d.ts.map +1 -0
- package/dist/ai-plan-checker.js +103 -0
- package/dist/ai-plan-checker.js.map +1 -0
- package/dist/bash-tool-parser.d.ts +191 -0
- package/dist/bash-tool-parser.d.ts.map +1 -0
- package/dist/bash-tool-parser.js +598 -0
- package/dist/bash-tool-parser.js.map +1 -0
- package/dist/cli.d.ts +12 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +460 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/buffer-limits.d.ts +59 -0
- package/dist/config/buffer-limits.d.ts.map +1 -0
- package/dist/config/buffer-limits.js +74 -0
- package/dist/config/buffer-limits.js.map +1 -0
- package/dist/config/map-limits.d.ts +40 -0
- package/dist/config/map-limits.d.ts.map +1 -0
- package/dist/config/map-limits.js +52 -0
- package/dist/config/map-limits.js.map +1 -0
- package/dist/file-stream-manager.d.ts +148 -0
- package/dist/file-stream-manager.d.ts.map +1 -0
- package/dist/file-stream-manager.js +351 -0
- package/dist/file-stream-manager.js.map +1 -0
- package/dist/hooks-config.d.ts +31 -0
- package/dist/hooks-config.d.ts.map +1 -0
- package/dist/hooks-config.js +115 -0
- package/dist/hooks-config.js.map +1 -0
- package/dist/image-watcher.d.ts +86 -0
- package/dist/image-watcher.d.ts.map +1 -0
- package/dist/image-watcher.js +275 -0
- package/dist/image-watcher.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +54 -0
- package/dist/index.js.map +1 -0
- package/dist/mux-factory.d.ts +13 -0
- package/dist/mux-factory.d.ts.map +1 -0
- package/dist/mux-factory.js +19 -0
- package/dist/mux-factory.js.map +1 -0
- package/dist/mux-interface.d.ts +145 -0
- package/dist/mux-interface.d.ts.map +1 -0
- package/dist/mux-interface.js +9 -0
- package/dist/mux-interface.js.map +1 -0
- package/dist/plan-orchestrator.d.ts +123 -0
- package/dist/plan-orchestrator.d.ts.map +1 -0
- package/dist/plan-orchestrator.js +500 -0
- package/dist/plan-orchestrator.js.map +1 -0
- package/dist/prompts/index.d.ts +9 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +9 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/planner.d.ts +14 -0
- package/dist/prompts/planner.d.ts.map +1 -0
- package/dist/prompts/planner.js +83 -0
- package/dist/prompts/planner.js.map +1 -0
- package/dist/prompts/research-agent.d.ts +10 -0
- package/dist/prompts/research-agent.d.ts.map +1 -0
- package/dist/prompts/research-agent.js +143 -0
- package/dist/prompts/research-agent.js.map +1 -0
- package/dist/push-store.d.ts +41 -0
- package/dist/push-store.d.ts.map +1 -0
- package/dist/push-store.js +168 -0
- package/dist/push-store.js.map +1 -0
- package/dist/ralph-config.d.ts +67 -0
- package/dist/ralph-config.d.ts.map +1 -0
- package/dist/ralph-config.js +134 -0
- package/dist/ralph-config.js.map +1 -0
- package/dist/ralph-loop.d.ts +124 -0
- package/dist/ralph-loop.d.ts.map +1 -0
- package/dist/ralph-loop.js +418 -0
- package/dist/ralph-loop.js.map +1 -0
- package/dist/ralph-tracker.d.ts +1081 -0
- package/dist/ralph-tracker.d.ts.map +1 -0
- package/dist/ralph-tracker.js +3343 -0
- package/dist/ralph-tracker.js.map +1 -0
- package/dist/respawn-controller.d.ts +1182 -0
- package/dist/respawn-controller.d.ts.map +1 -0
- package/dist/respawn-controller.js +2754 -0
- package/dist/respawn-controller.js.map +1 -0
- package/dist/run-summary.d.ts +123 -0
- package/dist/run-summary.d.ts.map +1 -0
- package/dist/run-summary.js +325 -0
- package/dist/run-summary.js.map +1 -0
- package/dist/session-lifecycle-log.d.ts +36 -0
- package/dist/session-lifecycle-log.d.ts.map +1 -0
- package/dist/session-lifecycle-log.js +101 -0
- package/dist/session-lifecycle-log.js.map +1 -0
- package/dist/session-manager.d.ts +97 -0
- package/dist/session-manager.d.ts.map +1 -0
- package/dist/session-manager.js +224 -0
- package/dist/session-manager.js.map +1 -0
- package/dist/session.d.ts +686 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +2025 -0
- package/dist/session.js.map +1 -0
- package/dist/state-store.d.ts +189 -0
- package/dist/state-store.d.ts.map +1 -0
- package/dist/state-store.js +730 -0
- package/dist/state-store.js.map +1 -0
- package/dist/subagent-watcher.d.ts +345 -0
- package/dist/subagent-watcher.d.ts.map +1 -0
- package/dist/subagent-watcher.js +1469 -0
- package/dist/subagent-watcher.js.map +1 -0
- package/dist/task-queue.d.ts +108 -0
- package/dist/task-queue.d.ts.map +1 -0
- package/dist/task-queue.js +235 -0
- package/dist/task-queue.js.map +1 -0
- package/dist/task-tracker.d.ts +306 -0
- package/dist/task-tracker.d.ts.map +1 -0
- package/dist/task-tracker.js +488 -0
- package/dist/task-tracker.js.map +1 -0
- package/dist/task.d.ts +73 -0
- package/dist/task.d.ts.map +1 -0
- package/dist/task.js +177 -0
- package/dist/task.js.map +1 -0
- package/dist/team-watcher.d.ts +53 -0
- package/dist/team-watcher.d.ts.map +1 -0
- package/dist/team-watcher.js +313 -0
- package/dist/team-watcher.js.map +1 -0
- package/dist/templates/case-template.md +461 -0
- package/dist/templates/claude-md.d.ts +26 -0
- package/dist/templates/claude-md.d.ts.map +1 -0
- package/dist/templates/claude-md.js +74 -0
- package/dist/templates/claude-md.js.map +1 -0
- package/dist/tmux-manager.d.ts +181 -0
- package/dist/tmux-manager.d.ts.map +1 -0
- package/dist/tmux-manager.js +1405 -0
- package/dist/tmux-manager.js.map +1 -0
- package/dist/transcript-watcher.d.ts +110 -0
- package/dist/transcript-watcher.d.ts.map +1 -0
- package/dist/transcript-watcher.js +338 -0
- package/dist/transcript-watcher.js.map +1 -0
- package/dist/tunnel-manager.d.ts +54 -0
- package/dist/tunnel-manager.d.ts.map +1 -0
- package/dist/tunnel-manager.js +251 -0
- package/dist/tunnel-manager.js.map +1 -0
- package/dist/types.d.ts +1139 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +215 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/buffer-accumulator.d.ts +111 -0
- package/dist/utils/buffer-accumulator.d.ts.map +1 -0
- package/dist/utils/buffer-accumulator.js +172 -0
- package/dist/utils/buffer-accumulator.js.map +1 -0
- package/dist/utils/claude-cli-resolver.d.ts +26 -0
- package/dist/utils/claude-cli-resolver.d.ts.map +1 -0
- package/dist/utils/claude-cli-resolver.js +78 -0
- package/dist/utils/claude-cli-resolver.js.map +1 -0
- package/dist/utils/cleanup-manager.d.ts +165 -0
- package/dist/utils/cleanup-manager.d.ts.map +1 -0
- package/dist/utils/cleanup-manager.js +274 -0
- package/dist/utils/cleanup-manager.js.map +1 -0
- package/dist/utils/index.d.ts +19 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +19 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/lru-map.d.ts +140 -0
- package/dist/utils/lru-map.d.ts.map +1 -0
- package/dist/utils/lru-map.js +234 -0
- package/dist/utils/lru-map.js.map +1 -0
- package/dist/utils/nice-wrapper.d.ts +13 -0
- package/dist/utils/nice-wrapper.d.ts.map +1 -0
- package/dist/utils/nice-wrapper.js +17 -0
- package/dist/utils/nice-wrapper.js.map +1 -0
- package/dist/utils/opencode-cli-resolver.d.ts +21 -0
- package/dist/utils/opencode-cli-resolver.d.ts.map +1 -0
- package/dist/utils/opencode-cli-resolver.js +67 -0
- package/dist/utils/opencode-cli-resolver.js.map +1 -0
- package/dist/utils/regex-patterns.d.ts +64 -0
- package/dist/utils/regex-patterns.d.ts.map +1 -0
- package/dist/utils/regex-patterns.js +74 -0
- package/dist/utils/regex-patterns.js.map +1 -0
- package/dist/utils/stale-expiration-map.d.ts +159 -0
- package/dist/utils/stale-expiration-map.d.ts.map +1 -0
- package/dist/utils/stale-expiration-map.js +277 -0
- package/dist/utils/stale-expiration-map.js.map +1 -0
- package/dist/utils/string-similarity.d.ts +108 -0
- package/dist/utils/string-similarity.d.ts.map +1 -0
- package/dist/utils/string-similarity.js +189 -0
- package/dist/utils/string-similarity.js.map +1 -0
- package/dist/utils/token-validation.d.ts +39 -0
- package/dist/utils/token-validation.d.ts.map +1 -0
- package/dist/utils/token-validation.js +59 -0
- package/dist/utils/token-validation.js.map +1 -0
- package/dist/utils/type-safety.d.ts +33 -0
- package/dist/utils/type-safety.d.ts.map +1 -0
- package/dist/utils/type-safety.js +35 -0
- package/dist/utils/type-safety.js.map +1 -0
- package/dist/web/public/app.js +491 -0
- package/dist/web/public/app.js.br +0 -0
- package/dist/web/public/app.js.gz +0 -0
- package/dist/web/public/index.html +1675 -0
- package/dist/web/public/index.html.br +0 -0
- package/dist/web/public/index.html.gz +0 -0
- package/dist/web/public/manifest.json +8 -0
- package/dist/web/public/mobile.css +1 -0
- package/dist/web/public/mobile.css.br +0 -0
- package/dist/web/public/mobile.css.gz +0 -0
- package/dist/web/public/ralph-wizard.js +1037 -0
- package/dist/web/public/ralph-wizard.js.br +0 -0
- package/dist/web/public/ralph-wizard.js.gz +0 -0
- package/dist/web/public/styles.css +1 -0
- package/dist/web/public/styles.css.br +0 -0
- package/dist/web/public/styles.css.gz +0 -0
- package/dist/web/public/sw.js +67 -0
- package/dist/web/public/sw.js.br +0 -0
- package/dist/web/public/sw.js.gz +0 -0
- package/dist/web/public/upload.html +155 -0
- package/dist/web/public/upload.html.br +0 -0
- package/dist/web/public/upload.html.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-fit.min.js +1 -0
- package/dist/web/public/vendor/xterm-addon-fit.min.js.br +0 -0
- package/dist/web/public/vendor/xterm-addon-fit.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-unicode11.min.js +1 -0
- package/dist/web/public/vendor/xterm-addon-unicode11.min.js.br +0 -0
- package/dist/web/public/vendor/xterm-addon-unicode11.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-webgl.min.js +2 -0
- package/dist/web/public/vendor/xterm-addon-webgl.min.js.br +0 -0
- package/dist/web/public/vendor/xterm-addon-webgl.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm.css +209 -0
- package/dist/web/public/vendor/xterm.css.br +0 -0
- package/dist/web/public/vendor/xterm.css.gz +0 -0
- package/dist/web/public/vendor/xterm.min.js +9 -0
- package/dist/web/public/vendor/xterm.min.js.br +0 -0
- package/dist/web/public/vendor/xterm.min.js.gz +0 -0
- package/dist/web/schemas.d.ts +479 -0
- package/dist/web/schemas.d.ts.map +1 -0
- package/dist/web/schemas.js +448 -0
- package/dist/web/schemas.js.map +1 -0
- package/dist/web/server.d.ts +207 -0
- package/dist/web/server.d.ts.map +1 -0
- package/dist/web/server.js +5784 -0
- package/dist/web/server.js.map +1 -0
- package/package.json +110 -0
- package/scripts/postinstall.js +390 -0
|
@@ -0,0 +1,500 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Simplified plan generation with 2 agents instead of 9.
|
|
3
|
+
*
|
|
4
|
+
* Previous architecture (removed):
|
|
5
|
+
* - 4 parallel analysis agents (requirements, architecture, testing, risks)
|
|
6
|
+
* - Synthesis phase
|
|
7
|
+
* - Verification agent
|
|
8
|
+
* - Execution optimizer agent (output was ignored anyway)
|
|
9
|
+
* - Final review agent
|
|
10
|
+
*
|
|
11
|
+
* New architecture:
|
|
12
|
+
* 1. Research Agent - gather context (optional, can fail)
|
|
13
|
+
* 2. Planner Agent - single agent generates complete TDD plan
|
|
14
|
+
*
|
|
15
|
+
* @module plan-orchestrator
|
|
16
|
+
*/
|
|
17
|
+
import { Session } from './session.js';
|
|
18
|
+
import { existsSync, mkdirSync, writeFileSync } from 'node:fs';
|
|
19
|
+
import { join } from 'node:path';
|
|
20
|
+
import { RESEARCH_AGENT_PROMPT, PLANNER_PROMPT } from './prompts/index.js';
|
|
21
|
+
// ============================================================================
|
|
22
|
+
// JSON Repair Helper
|
|
23
|
+
// ============================================================================
|
|
24
|
+
function tryParseJSON(jsonString) {
|
|
25
|
+
try {
|
|
26
|
+
return { success: true, data: JSON.parse(jsonString) };
|
|
27
|
+
}
|
|
28
|
+
catch (firstError) {
|
|
29
|
+
let repaired = jsonString;
|
|
30
|
+
repaired = repaired.replace(/,(\s*[\]}])/g, '$1');
|
|
31
|
+
repaired = repaired.replace(/"([^"\\]|\\.)*"/g, (match) => {
|
|
32
|
+
return match.replace(/\n/g, '\\n').replace(/\r/g, '\\r').replace(/\t/g, '\\t');
|
|
33
|
+
});
|
|
34
|
+
const openBraces = (repaired.match(/\{/g) || []).length;
|
|
35
|
+
const closeBraces = (repaired.match(/\}/g) || []).length;
|
|
36
|
+
for (let i = 0; i < openBraces - closeBraces; i++) {
|
|
37
|
+
repaired = repaired.replace(/,\s*$/, '') + '}';
|
|
38
|
+
}
|
|
39
|
+
try {
|
|
40
|
+
return { success: true, data: JSON.parse(repaired) };
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
const errMsg = firstError instanceof Error ? firstError.message : String(firstError);
|
|
44
|
+
return { success: false, error: errMsg };
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// ============================================================================
|
|
49
|
+
// Constants
|
|
50
|
+
// ============================================================================
|
|
51
|
+
const DEFAULT_MODEL = 'opus';
|
|
52
|
+
// ============================================================================
|
|
53
|
+
// Main Orchestrator Class
|
|
54
|
+
// ============================================================================
|
|
55
|
+
export class PlanOrchestrator {
|
|
56
|
+
mux;
|
|
57
|
+
workingDir;
|
|
58
|
+
outputDir;
|
|
59
|
+
runningSessions = new Set();
|
|
60
|
+
cancelled = false;
|
|
61
|
+
taskDescription = '';
|
|
62
|
+
researchModel;
|
|
63
|
+
plannerModel;
|
|
64
|
+
constructor(mux, workingDir = process.cwd(), outputDir, modelConfig) {
|
|
65
|
+
this.mux = mux;
|
|
66
|
+
this.workingDir = workingDir;
|
|
67
|
+
this.outputDir = outputDir;
|
|
68
|
+
this.researchModel = modelConfig?.agentTypeOverrides?.explore || modelConfig?.defaultModel || DEFAULT_MODEL;
|
|
69
|
+
this.plannerModel = modelConfig?.agentTypeOverrides?.review || modelConfig?.defaultModel || DEFAULT_MODEL;
|
|
70
|
+
}
|
|
71
|
+
saveAgentOutput(agentType, prompt, result, durationMs) {
|
|
72
|
+
if (!this.outputDir)
|
|
73
|
+
return;
|
|
74
|
+
try {
|
|
75
|
+
if (!existsSync(this.outputDir)) {
|
|
76
|
+
mkdirSync(this.outputDir, { recursive: true });
|
|
77
|
+
}
|
|
78
|
+
const agentDir = join(this.outputDir, agentType);
|
|
79
|
+
if (!existsSync(agentDir)) {
|
|
80
|
+
mkdirSync(agentDir, { recursive: true });
|
|
81
|
+
}
|
|
82
|
+
const promptPath = join(agentDir, 'prompt.md');
|
|
83
|
+
writeFileSync(promptPath, `# ${agentType} Agent Prompt\n\nGenerated: ${new Date().toISOString()}\nDuration: ${(durationMs / 1000).toFixed(1)}s\n\n## Task\n${this.taskDescription}\n\n## Prompt\n${prompt}\n`, 'utf-8');
|
|
84
|
+
const resultPath = join(agentDir, 'result.json');
|
|
85
|
+
writeFileSync(resultPath, JSON.stringify(result, null, 2), 'utf-8');
|
|
86
|
+
}
|
|
87
|
+
catch (err) {
|
|
88
|
+
console.warn(`[PlanOrchestrator] Failed to save ${agentType} output:`, err);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
saveFinalResult(result) {
|
|
92
|
+
if (!this.outputDir)
|
|
93
|
+
return;
|
|
94
|
+
try {
|
|
95
|
+
if (!existsSync(this.outputDir)) {
|
|
96
|
+
mkdirSync(this.outputDir, { recursive: true });
|
|
97
|
+
}
|
|
98
|
+
// Save final result JSON
|
|
99
|
+
const resultPath = join(this.outputDir, 'final-result.json');
|
|
100
|
+
writeFileSync(resultPath, JSON.stringify(result, null, 2), 'utf-8');
|
|
101
|
+
// Save human-readable summary
|
|
102
|
+
if (result.success && result.items) {
|
|
103
|
+
const summaryPath = join(this.outputDir, 'summary.md');
|
|
104
|
+
const summary = this.generateSummary(result);
|
|
105
|
+
writeFileSync(summaryPath, summary, 'utf-8');
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
catch (err) {
|
|
109
|
+
console.warn('[PlanOrchestrator] Failed to save final result:', err);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
generateSummary(result) {
|
|
113
|
+
const items = result.items || [];
|
|
114
|
+
const p0 = items.filter((i) => i.priority === 'P0');
|
|
115
|
+
const p1 = items.filter((i) => i.priority === 'P1');
|
|
116
|
+
const p2 = items.filter((i) => i.priority === 'P2');
|
|
117
|
+
let md = `# Plan Summary\n\n`;
|
|
118
|
+
md += `Generated: ${new Date().toISOString()}\n`;
|
|
119
|
+
md += `Total Tasks: ${items.length} (P0: ${p0.length}, P1: ${p1.length}, P2: ${p2.length})\n\n`;
|
|
120
|
+
md += `## Task\n${this.taskDescription}\n\n`;
|
|
121
|
+
const addSection = (title, tasks) => {
|
|
122
|
+
if (tasks.length === 0)
|
|
123
|
+
return;
|
|
124
|
+
md += `## ${title}\n\n`;
|
|
125
|
+
for (const t of tasks) {
|
|
126
|
+
const phase = t.tddPhase ? ` [${t.tddPhase}]` : '';
|
|
127
|
+
md += `- **${t.id}**${phase}: ${t.content}\n`;
|
|
128
|
+
if (t.verificationCriteria)
|
|
129
|
+
md += ` - Verify: ${t.verificationCriteria}\n`;
|
|
130
|
+
}
|
|
131
|
+
md += '\n';
|
|
132
|
+
};
|
|
133
|
+
addSection('P0 - Critical', p0);
|
|
134
|
+
addSection('P1 - Required', p1);
|
|
135
|
+
addSection('P2 - Enhancement', p2);
|
|
136
|
+
if (result.metadata?.plannerWarnings?.length) {
|
|
137
|
+
md += `## Warnings\n\n`;
|
|
138
|
+
for (const w of result.metadata.plannerWarnings) {
|
|
139
|
+
md += `- ${w}\n`;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return md;
|
|
143
|
+
}
|
|
144
|
+
async cancel() {
|
|
145
|
+
this.cancelled = true;
|
|
146
|
+
// Stop all running sessions and await cleanup to prevent PTY process leaks
|
|
147
|
+
const stopPromises = [];
|
|
148
|
+
for (const session of this.runningSessions) {
|
|
149
|
+
stopPromises.push(session.stop().catch((err) => {
|
|
150
|
+
console.error('[PlanOrchestrator] Failed to stop session during cancel:', err);
|
|
151
|
+
}));
|
|
152
|
+
}
|
|
153
|
+
await Promise.all(stopPromises);
|
|
154
|
+
this.runningSessions.clear();
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Generate a detailed TDD plan.
|
|
158
|
+
*
|
|
159
|
+
* Flow:
|
|
160
|
+
* 1. Research Agent (optional - failures don't block)
|
|
161
|
+
* 2. Planner Agent (generates complete TDD plan)
|
|
162
|
+
*/
|
|
163
|
+
async generateDetailedPlan(taskDescription, onProgress, onSubagent) {
|
|
164
|
+
const startTime = Date.now();
|
|
165
|
+
let totalCost = 0;
|
|
166
|
+
this.taskDescription = taskDescription;
|
|
167
|
+
try {
|
|
168
|
+
// Phase 1: Research (optional)
|
|
169
|
+
onProgress?.('research', 'Running research agent...');
|
|
170
|
+
const researchResult = await this.runResearchAgent(taskDescription, onProgress, onSubagent);
|
|
171
|
+
totalCost += researchResult.success ? 0.01 : 0;
|
|
172
|
+
const effectiveTaskDescription = researchResult.success
|
|
173
|
+
? researchResult.enrichedTaskDescription
|
|
174
|
+
: taskDescription;
|
|
175
|
+
const researchContext = this.formatResearchContext(researchResult);
|
|
176
|
+
// Phase 2: Planner (main agent)
|
|
177
|
+
onProgress?.('planning', 'Running planner agent...');
|
|
178
|
+
const plannerResult = await this.runPlannerAgent(effectiveTaskDescription, researchContext, onProgress, onSubagent);
|
|
179
|
+
if (!plannerResult.success) {
|
|
180
|
+
return {
|
|
181
|
+
success: false,
|
|
182
|
+
error: plannerResult.error || 'Planner failed',
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
totalCost += 0.01;
|
|
186
|
+
const totalDurationMs = Date.now() - startTime;
|
|
187
|
+
const result = {
|
|
188
|
+
success: true,
|
|
189
|
+
items: plannerResult.items,
|
|
190
|
+
costUsd: totalCost,
|
|
191
|
+
metadata: {
|
|
192
|
+
researchResult: researchResult.success ? researchResult : undefined,
|
|
193
|
+
plannerGaps: plannerResult.gaps || [],
|
|
194
|
+
plannerWarnings: plannerResult.warnings || [],
|
|
195
|
+
totalDurationMs,
|
|
196
|
+
},
|
|
197
|
+
};
|
|
198
|
+
this.saveFinalResult(result);
|
|
199
|
+
return result;
|
|
200
|
+
}
|
|
201
|
+
catch (err) {
|
|
202
|
+
return {
|
|
203
|
+
success: false,
|
|
204
|
+
error: err instanceof Error ? err.message : String(err),
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
formatResearchContext(research) {
|
|
209
|
+
if (!research.success)
|
|
210
|
+
return '';
|
|
211
|
+
const parts = ['## Research Context\n'];
|
|
212
|
+
if (research.findings.externalResources.length > 0) {
|
|
213
|
+
parts.push('### External Resources');
|
|
214
|
+
for (const r of research.findings.externalResources.slice(0, 5)) {
|
|
215
|
+
parts.push(`- ${r.title}${r.url ? ` (${r.url})` : ''}`);
|
|
216
|
+
if (r.keyInsights.length > 0) {
|
|
217
|
+
parts.push(` Key insights: ${r.keyInsights.slice(0, 3).join(', ')}`);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
parts.push('');
|
|
221
|
+
}
|
|
222
|
+
if (research.findings.codebasePatterns.length > 0) {
|
|
223
|
+
parts.push('### Existing Codebase Patterns');
|
|
224
|
+
for (const p of research.findings.codebasePatterns.slice(0, 5)) {
|
|
225
|
+
parts.push(`- ${p.pattern} at ${p.location}`);
|
|
226
|
+
}
|
|
227
|
+
parts.push('');
|
|
228
|
+
}
|
|
229
|
+
if (research.findings.technicalRecommendations.length > 0) {
|
|
230
|
+
parts.push('### Recommendations');
|
|
231
|
+
for (const r of research.findings.technicalRecommendations.slice(0, 5)) {
|
|
232
|
+
parts.push(`- ${r}`);
|
|
233
|
+
}
|
|
234
|
+
parts.push('');
|
|
235
|
+
}
|
|
236
|
+
return parts.join('\n');
|
|
237
|
+
}
|
|
238
|
+
async runResearchAgent(taskDescription, _onProgress, onSubagent) {
|
|
239
|
+
const agentId = `research-${Date.now()}`;
|
|
240
|
+
const startTime = Date.now();
|
|
241
|
+
if (this.cancelled) {
|
|
242
|
+
return {
|
|
243
|
+
success: false,
|
|
244
|
+
findings: {
|
|
245
|
+
externalResources: [],
|
|
246
|
+
codebasePatterns: [],
|
|
247
|
+
technicalRecommendations: [],
|
|
248
|
+
potentialChallenges: [],
|
|
249
|
+
recommendedTools: [],
|
|
250
|
+
},
|
|
251
|
+
enrichedTaskDescription: taskDescription,
|
|
252
|
+
error: 'Cancelled',
|
|
253
|
+
durationMs: 0,
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
onSubagent?.({
|
|
257
|
+
type: 'started',
|
|
258
|
+
agentId,
|
|
259
|
+
agentType: 'research',
|
|
260
|
+
model: this.researchModel,
|
|
261
|
+
status: 'running',
|
|
262
|
+
detail: 'Researching...',
|
|
263
|
+
});
|
|
264
|
+
const session = new Session({
|
|
265
|
+
workingDir: this.workingDir,
|
|
266
|
+
mux: this.mux,
|
|
267
|
+
useMux: false,
|
|
268
|
+
mode: 'claude',
|
|
269
|
+
});
|
|
270
|
+
this.runningSessions.add(session);
|
|
271
|
+
const prompt = RESEARCH_AGENT_PROMPT.replace('{TASK}', taskDescription).replace('{WORKING_DIR}', this.workingDir);
|
|
272
|
+
// Start progress interval before try block to ensure cleanup in finally
|
|
273
|
+
const progressInterval = setInterval(() => {
|
|
274
|
+
const elapsed = Math.floor((Date.now() - startTime) / 1000);
|
|
275
|
+
onSubagent?.({
|
|
276
|
+
type: 'progress',
|
|
277
|
+
agentId,
|
|
278
|
+
agentType: 'research',
|
|
279
|
+
model: this.researchModel,
|
|
280
|
+
status: 'running',
|
|
281
|
+
detail: `${elapsed}s elapsed`,
|
|
282
|
+
});
|
|
283
|
+
}, 30000);
|
|
284
|
+
try {
|
|
285
|
+
const { result: response } = await session.runPrompt(prompt, { model: this.researchModel });
|
|
286
|
+
const durationMs = Date.now() - startTime;
|
|
287
|
+
// Extract JSON from response
|
|
288
|
+
const jsonMatch = response.match(/\{[\s\S]*\}/);
|
|
289
|
+
if (!jsonMatch) {
|
|
290
|
+
onSubagent?.({
|
|
291
|
+
type: 'failed',
|
|
292
|
+
agentId,
|
|
293
|
+
agentType: 'research',
|
|
294
|
+
model: this.researchModel,
|
|
295
|
+
status: 'failed',
|
|
296
|
+
error: 'No JSON found',
|
|
297
|
+
durationMs,
|
|
298
|
+
});
|
|
299
|
+
return {
|
|
300
|
+
success: false,
|
|
301
|
+
findings: {
|
|
302
|
+
externalResources: [],
|
|
303
|
+
codebasePatterns: [],
|
|
304
|
+
technicalRecommendations: [],
|
|
305
|
+
potentialChallenges: [],
|
|
306
|
+
recommendedTools: [],
|
|
307
|
+
},
|
|
308
|
+
enrichedTaskDescription: taskDescription,
|
|
309
|
+
error: 'No JSON in response',
|
|
310
|
+
durationMs,
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
const parsed = tryParseJSON(jsonMatch[0]);
|
|
314
|
+
if (!parsed.success) {
|
|
315
|
+
onSubagent?.({
|
|
316
|
+
type: 'failed',
|
|
317
|
+
agentId,
|
|
318
|
+
agentType: 'research',
|
|
319
|
+
model: this.researchModel,
|
|
320
|
+
status: 'failed',
|
|
321
|
+
error: parsed.error,
|
|
322
|
+
durationMs,
|
|
323
|
+
});
|
|
324
|
+
return {
|
|
325
|
+
success: false,
|
|
326
|
+
findings: {
|
|
327
|
+
externalResources: [],
|
|
328
|
+
codebasePatterns: [],
|
|
329
|
+
technicalRecommendations: [],
|
|
330
|
+
potentialChallenges: [],
|
|
331
|
+
recommendedTools: [],
|
|
332
|
+
},
|
|
333
|
+
enrichedTaskDescription: taskDescription,
|
|
334
|
+
error: parsed.error,
|
|
335
|
+
durationMs,
|
|
336
|
+
};
|
|
337
|
+
}
|
|
338
|
+
const data = parsed.data;
|
|
339
|
+
const result = {
|
|
340
|
+
success: true,
|
|
341
|
+
findings: {
|
|
342
|
+
externalResources: Array.isArray(data.externalResources) ? data.externalResources : [],
|
|
343
|
+
codebasePatterns: Array.isArray(data.codebasePatterns) ? data.codebasePatterns : [],
|
|
344
|
+
technicalRecommendations: Array.isArray(data.technicalRecommendations) ? data.technicalRecommendations : [],
|
|
345
|
+
potentialChallenges: Array.isArray(data.potentialChallenges) ? data.potentialChallenges : [],
|
|
346
|
+
recommendedTools: Array.isArray(data.recommendedTools) ? data.recommendedTools : [],
|
|
347
|
+
},
|
|
348
|
+
enrichedTaskDescription: typeof data.enrichedTaskDescription === 'string' ? data.enrichedTaskDescription : taskDescription,
|
|
349
|
+
durationMs,
|
|
350
|
+
};
|
|
351
|
+
this.saveAgentOutput('research', prompt, result, durationMs);
|
|
352
|
+
onSubagent?.({
|
|
353
|
+
type: 'completed',
|
|
354
|
+
agentId,
|
|
355
|
+
agentType: 'research',
|
|
356
|
+
model: this.researchModel,
|
|
357
|
+
status: 'completed',
|
|
358
|
+
durationMs,
|
|
359
|
+
});
|
|
360
|
+
return result;
|
|
361
|
+
}
|
|
362
|
+
catch (err) {
|
|
363
|
+
const durationMs = Date.now() - startTime;
|
|
364
|
+
const error = err instanceof Error ? err.message : String(err);
|
|
365
|
+
onSubagent?.({
|
|
366
|
+
type: 'failed',
|
|
367
|
+
agentId,
|
|
368
|
+
agentType: 'research',
|
|
369
|
+
model: this.researchModel,
|
|
370
|
+
status: 'failed',
|
|
371
|
+
error,
|
|
372
|
+
durationMs,
|
|
373
|
+
});
|
|
374
|
+
return {
|
|
375
|
+
success: false,
|
|
376
|
+
findings: {
|
|
377
|
+
externalResources: [],
|
|
378
|
+
codebasePatterns: [],
|
|
379
|
+
technicalRecommendations: [],
|
|
380
|
+
potentialChallenges: [],
|
|
381
|
+
recommendedTools: [],
|
|
382
|
+
},
|
|
383
|
+
enrichedTaskDescription: taskDescription,
|
|
384
|
+
error,
|
|
385
|
+
durationMs,
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
finally {
|
|
389
|
+
// Always clean up session and progress interval — centralizing here
|
|
390
|
+
// prevents the race where cancel() and catch both try to manage the set
|
|
391
|
+
await session.stop().catch(() => { });
|
|
392
|
+
this.runningSessions.delete(session);
|
|
393
|
+
clearInterval(progressInterval);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
async runPlannerAgent(taskDescription, researchContext, onProgress, onSubagent) {
|
|
397
|
+
const agentId = `planner-${Date.now()}`;
|
|
398
|
+
const startTime = Date.now();
|
|
399
|
+
if (this.cancelled) {
|
|
400
|
+
return { success: false, error: 'Cancelled' };
|
|
401
|
+
}
|
|
402
|
+
onSubagent?.({
|
|
403
|
+
type: 'started',
|
|
404
|
+
agentId,
|
|
405
|
+
agentType: 'planner',
|
|
406
|
+
model: this.plannerModel,
|
|
407
|
+
status: 'running',
|
|
408
|
+
detail: 'Generating plan...',
|
|
409
|
+
});
|
|
410
|
+
const session = new Session({
|
|
411
|
+
workingDir: this.workingDir,
|
|
412
|
+
mux: this.mux,
|
|
413
|
+
useMux: false,
|
|
414
|
+
mode: 'claude',
|
|
415
|
+
});
|
|
416
|
+
this.runningSessions.add(session);
|
|
417
|
+
const prompt = PLANNER_PROMPT.replace('{TASK}', taskDescription).replace('{RESEARCH_CONTEXT}', researchContext || '');
|
|
418
|
+
// Start progress interval before try block to ensure cleanup in finally
|
|
419
|
+
const progressInterval = setInterval(() => {
|
|
420
|
+
const elapsed = Math.floor((Date.now() - startTime) / 1000);
|
|
421
|
+
onSubagent?.({
|
|
422
|
+
type: 'progress',
|
|
423
|
+
agentId,
|
|
424
|
+
agentType: 'planner',
|
|
425
|
+
model: this.plannerModel,
|
|
426
|
+
status: 'running',
|
|
427
|
+
detail: `${elapsed}s elapsed`,
|
|
428
|
+
});
|
|
429
|
+
}, 30000);
|
|
430
|
+
try {
|
|
431
|
+
const { result: response } = await session.runPrompt(prompt, { model: this.plannerModel });
|
|
432
|
+
const durationMs = Date.now() - startTime;
|
|
433
|
+
// Extract JSON from response
|
|
434
|
+
const jsonMatch = response.match(/\{[\s\S]*\}/);
|
|
435
|
+
if (!jsonMatch) {
|
|
436
|
+
onSubagent?.({
|
|
437
|
+
type: 'failed',
|
|
438
|
+
agentId,
|
|
439
|
+
agentType: 'planner',
|
|
440
|
+
model: this.plannerModel,
|
|
441
|
+
status: 'failed',
|
|
442
|
+
error: 'No JSON found',
|
|
443
|
+
durationMs,
|
|
444
|
+
});
|
|
445
|
+
return { success: false, error: 'No JSON in response' };
|
|
446
|
+
}
|
|
447
|
+
const parsed = tryParseJSON(jsonMatch[0]);
|
|
448
|
+
if (!parsed.success) {
|
|
449
|
+
onSubagent?.({
|
|
450
|
+
type: 'failed',
|
|
451
|
+
agentId,
|
|
452
|
+
agentType: 'planner',
|
|
453
|
+
model: this.plannerModel,
|
|
454
|
+
status: 'failed',
|
|
455
|
+
error: parsed.error,
|
|
456
|
+
durationMs,
|
|
457
|
+
});
|
|
458
|
+
return { success: false, error: parsed.error };
|
|
459
|
+
}
|
|
460
|
+
const data = parsed.data;
|
|
461
|
+
const items = Array.isArray(data.items) ? data.items : [];
|
|
462
|
+
const gaps = Array.isArray(data.gaps) ? data.gaps : [];
|
|
463
|
+
const warnings = Array.isArray(data.warnings) ? data.warnings : [];
|
|
464
|
+
this.saveAgentOutput('planner', prompt, { items, gaps, warnings }, durationMs);
|
|
465
|
+
onSubagent?.({
|
|
466
|
+
type: 'completed',
|
|
467
|
+
agentId,
|
|
468
|
+
agentType: 'planner',
|
|
469
|
+
model: this.plannerModel,
|
|
470
|
+
status: 'completed',
|
|
471
|
+
itemCount: items.length,
|
|
472
|
+
durationMs,
|
|
473
|
+
});
|
|
474
|
+
onProgress?.('planning', `Generated ${items.length} tasks`);
|
|
475
|
+
return { success: true, items, gaps, warnings };
|
|
476
|
+
}
|
|
477
|
+
catch (err) {
|
|
478
|
+
const durationMs = Date.now() - startTime;
|
|
479
|
+
const error = err instanceof Error ? err.message : String(err);
|
|
480
|
+
onSubagent?.({
|
|
481
|
+
type: 'failed',
|
|
482
|
+
agentId,
|
|
483
|
+
agentType: 'planner',
|
|
484
|
+
model: this.plannerModel,
|
|
485
|
+
status: 'failed',
|
|
486
|
+
error,
|
|
487
|
+
durationMs,
|
|
488
|
+
});
|
|
489
|
+
return { success: false, error };
|
|
490
|
+
}
|
|
491
|
+
finally {
|
|
492
|
+
// Always clean up session and progress interval — centralizing here
|
|
493
|
+
// prevents the race where cancel() and catch both try to manage the set
|
|
494
|
+
await session.stop().catch(() => { });
|
|
495
|
+
this.runningSessions.delete(session);
|
|
496
|
+
clearInterval(progressInterval);
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
//# sourceMappingURL=plan-orchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-orchestrator.js","sourceRoot":"","sources":["../src/plan-orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Plan Orchestrator Prompts
|
|
3
|
+
*
|
|
4
|
+
* Each prompt is in its own file for easy editing and iteration.
|
|
5
|
+
* Import from here for convenience.
|
|
6
|
+
*/
|
|
7
|
+
export { RESEARCH_AGENT_PROMPT } from './research-agent.js';
|
|
8
|
+
export { PLANNER_PROMPT } from './planner.js';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Plan Orchestrator Prompts
|
|
3
|
+
*
|
|
4
|
+
* Each prompt is in its own file for easy editing and iteration.
|
|
5
|
+
* Import from here for convenience.
|
|
6
|
+
*/
|
|
7
|
+
export { RESEARCH_AGENT_PROMPT } from './research-agent.js';
|
|
8
|
+
export { PLANNER_PROMPT } from './planner.js';
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Planner Prompt - Single agent for TDD plan generation
|
|
3
|
+
*
|
|
4
|
+
* Combines what was previously 5 separate agents:
|
|
5
|
+
* - Requirements Analyst (redundant)
|
|
6
|
+
* - Architecture Planner (redundant)
|
|
7
|
+
* - Testing Specialist (kept - TDD focus)
|
|
8
|
+
* - Risk Analyst (redundant)
|
|
9
|
+
* - Verification Expert (kept - structure)
|
|
10
|
+
*
|
|
11
|
+
* Placeholders: {TASK}, {RESEARCH_CONTEXT}
|
|
12
|
+
*/
|
|
13
|
+
export declare const PLANNER_PROMPT = "You are a TDD Plan Generator. Create a complete implementation plan with test-first approach.\n\n## TASK DESCRIPTION\n{TASK}\n\n{RESEARCH_CONTEXT}\n\n## YOUR MISSION\nGenerate a complete TDD implementation plan with:\n1. Tests BEFORE implementations (red-green-refactor)\n2. Review tasks AFTER implementations\n3. Clear priorities (P0=blocking, P1=required, P2=polish)\n4. Dependencies between tasks\n\n## TDD CYCLE\nFor each feature:\n1. Write failing test first\n2. Implement to make test pass\n3. Review implementation\n\n## PRIORITY GUIDELINES\n- P0: Foundation, types, project setup, blocking dependencies\n- P1: Core features, main implementation, error handling\n- P2: Polish, optimization, documentation\n\n## OUTPUT FORMAT\nReturn ONLY a JSON object:\n{\n \"items\": [\n {\n \"id\": \"P0-001\",\n \"content\": \"Write failing test for user authentication endpoint\",\n \"priority\": \"P0\",\n \"tddPhase\": \"test\",\n \"verificationCriteria\": \"Test file exists, test fails with 'not implemented'\",\n \"testCommand\": \"npm test -- --grep='auth'\",\n \"dependencies\": []\n },\n {\n \"id\": \"P0-002\",\n \"content\": \"Implement user authentication handler\",\n \"priority\": \"P0\",\n \"tddPhase\": \"impl\",\n \"verificationCriteria\": \"npm test -- --grep='auth' passes\",\n \"pairedWith\": \"P0-001\",\n \"dependencies\": [\"P0-001\"]\n },\n {\n \"id\": \"P0-003\",\n \"content\": \"Review auth implementation for security\",\n \"priority\": \"P0\",\n \"tddPhase\": \"review\",\n \"verificationCriteria\": \"No security issues, follows best practices\",\n \"reviewChecklist\": [\"Input validation\", \"XSS prevention\", \"Error handling\"],\n \"pairedWith\": \"P0-002\",\n \"dependencies\": [\"P0-002\"]\n }\n ],\n \"gaps\": [\"any missing requirements noted\"],\n \"warnings\": [\"any concerns or risks identified\"]\n}\n\nCRITICAL REQUIREMENTS:\n1. Every implementation MUST have a paired test task that comes BEFORE it\n2. Every implementation MUST have a review task that comes AFTER it\n3. Use sequential IDs: P0-001, P0-002, P1-001, etc.\n4. verificationCriteria must be SPECIFIC and observable\n5. Dependencies must form a valid DAG (no cycles)\n\nGenerate 15-40 items covering the complete implementation.";
|
|
14
|
+
//# sourceMappingURL=planner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planner.d.ts","sourceRoot":"","sources":["../../src/prompts/planner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,eAAO,MAAM,cAAc,+zEAqEgC,CAAC"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Planner Prompt - Single agent for TDD plan generation
|
|
3
|
+
*
|
|
4
|
+
* Combines what was previously 5 separate agents:
|
|
5
|
+
* - Requirements Analyst (redundant)
|
|
6
|
+
* - Architecture Planner (redundant)
|
|
7
|
+
* - Testing Specialist (kept - TDD focus)
|
|
8
|
+
* - Risk Analyst (redundant)
|
|
9
|
+
* - Verification Expert (kept - structure)
|
|
10
|
+
*
|
|
11
|
+
* Placeholders: {TASK}, {RESEARCH_CONTEXT}
|
|
12
|
+
*/
|
|
13
|
+
export const PLANNER_PROMPT = `You are a TDD Plan Generator. Create a complete implementation plan with test-first approach.
|
|
14
|
+
|
|
15
|
+
## TASK DESCRIPTION
|
|
16
|
+
{TASK}
|
|
17
|
+
|
|
18
|
+
{RESEARCH_CONTEXT}
|
|
19
|
+
|
|
20
|
+
## YOUR MISSION
|
|
21
|
+
Generate a complete TDD implementation plan with:
|
|
22
|
+
1. Tests BEFORE implementations (red-green-refactor)
|
|
23
|
+
2. Review tasks AFTER implementations
|
|
24
|
+
3. Clear priorities (P0=blocking, P1=required, P2=polish)
|
|
25
|
+
4. Dependencies between tasks
|
|
26
|
+
|
|
27
|
+
## TDD CYCLE
|
|
28
|
+
For each feature:
|
|
29
|
+
1. Write failing test first
|
|
30
|
+
2. Implement to make test pass
|
|
31
|
+
3. Review implementation
|
|
32
|
+
|
|
33
|
+
## PRIORITY GUIDELINES
|
|
34
|
+
- P0: Foundation, types, project setup, blocking dependencies
|
|
35
|
+
- P1: Core features, main implementation, error handling
|
|
36
|
+
- P2: Polish, optimization, documentation
|
|
37
|
+
|
|
38
|
+
## OUTPUT FORMAT
|
|
39
|
+
Return ONLY a JSON object:
|
|
40
|
+
{
|
|
41
|
+
"items": [
|
|
42
|
+
{
|
|
43
|
+
"id": "P0-001",
|
|
44
|
+
"content": "Write failing test for user authentication endpoint",
|
|
45
|
+
"priority": "P0",
|
|
46
|
+
"tddPhase": "test",
|
|
47
|
+
"verificationCriteria": "Test file exists, test fails with 'not implemented'",
|
|
48
|
+
"testCommand": "npm test -- --grep='auth'",
|
|
49
|
+
"dependencies": []
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"id": "P0-002",
|
|
53
|
+
"content": "Implement user authentication handler",
|
|
54
|
+
"priority": "P0",
|
|
55
|
+
"tddPhase": "impl",
|
|
56
|
+
"verificationCriteria": "npm test -- --grep='auth' passes",
|
|
57
|
+
"pairedWith": "P0-001",
|
|
58
|
+
"dependencies": ["P0-001"]
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"id": "P0-003",
|
|
62
|
+
"content": "Review auth implementation for security",
|
|
63
|
+
"priority": "P0",
|
|
64
|
+
"tddPhase": "review",
|
|
65
|
+
"verificationCriteria": "No security issues, follows best practices",
|
|
66
|
+
"reviewChecklist": ["Input validation", "XSS prevention", "Error handling"],
|
|
67
|
+
"pairedWith": "P0-002",
|
|
68
|
+
"dependencies": ["P0-002"]
|
|
69
|
+
}
|
|
70
|
+
],
|
|
71
|
+
"gaps": ["any missing requirements noted"],
|
|
72
|
+
"warnings": ["any concerns or risks identified"]
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
CRITICAL REQUIREMENTS:
|
|
76
|
+
1. Every implementation MUST have a paired test task that comes BEFORE it
|
|
77
|
+
2. Every implementation MUST have a review task that comes AFTER it
|
|
78
|
+
3. Use sequential IDs: P0-001, P0-002, P1-001, etc.
|
|
79
|
+
4. verificationCriteria must be SPECIFIC and observable
|
|
80
|
+
5. Dependencies must form a valid DAG (no cycles)
|
|
81
|
+
|
|
82
|
+
Generate 15-40 items covering the complete implementation.`;
|
|
83
|
+
//# sourceMappingURL=planner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planner.js","sourceRoot":"","sources":["../../src/prompts/planner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2DAqE6B,CAAC"}
|