247-cli 1.6.0 → 1.7.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.
- package/agent/dist/db/index.d.ts.map +1 -1
- package/agent/dist/db/index.js +22 -0
- package/agent/dist/db/index.js.map +1 -1
- package/agent/dist/db/issues.d.ts +83 -0
- package/agent/dist/db/issues.d.ts.map +1 -0
- package/agent/dist/db/issues.js +423 -0
- package/agent/dist/db/issues.js.map +1 -0
- package/agent/dist/db/projects.d.ts +63 -0
- package/agent/dist/db/projects.d.ts.map +1 -0
- package/agent/dist/db/projects.js +288 -0
- package/agent/dist/db/projects.js.map +1 -0
- package/agent/dist/db/schema.d.ts +64 -3
- package/agent/dist/db/schema.d.ts.map +1 -1
- package/agent/dist/db/schema.js +45 -2
- package/agent/dist/db/schema.js.map +1 -1
- package/agent/dist/db/sessions.d.ts.map +1 -1
- package/agent/dist/db/sessions.js +5 -3
- package/agent/dist/db/sessions.js.map +1 -1
- package/agent/dist/lib/init-script.d.ts +14 -2
- package/agent/dist/lib/init-script.d.ts.map +1 -1
- package/agent/dist/lib/init-script.js +234 -14
- package/agent/dist/lib/init-script.js.map +1 -1
- package/agent/dist/lib/planning-prompt.d.ts +7 -0
- package/agent/dist/lib/planning-prompt.d.ts.map +1 -0
- package/agent/dist/lib/planning-prompt.js +51 -0
- package/agent/dist/lib/planning-prompt.js.map +1 -0
- package/agent/dist/routes/index.d.ts +2 -0
- package/agent/dist/routes/index.d.ts.map +1 -1
- package/agent/dist/routes/index.js +2 -0
- package/agent/dist/routes/index.js.map +1 -1
- package/agent/dist/routes/issues.d.ts +6 -0
- package/agent/dist/routes/issues.d.ts.map +1 -0
- package/agent/dist/routes/issues.js +235 -0
- package/agent/dist/routes/issues.js.map +1 -0
- package/agent/dist/routes/managed-projects.d.ts +7 -0
- package/agent/dist/routes/managed-projects.d.ts.map +1 -0
- package/agent/dist/routes/managed-projects.js +230 -0
- package/agent/dist/routes/managed-projects.js.map +1 -0
- package/agent/dist/server.d.ts.map +1 -1
- package/agent/dist/server.js +10 -1
- package/agent/dist/server.js.map +1 -1
- package/agent/dist/services/index.d.ts +2 -0
- package/agent/dist/services/index.d.ts.map +1 -1
- package/agent/dist/services/index.js +1 -0
- package/agent/dist/services/index.js.map +1 -1
- package/agent/dist/services/planner.d.ts +79 -0
- package/agent/dist/services/planner.d.ts.map +1 -0
- package/agent/dist/services/planner.js +298 -0
- package/agent/dist/services/planner.js.map +1 -0
- package/agent/dist/terminal.d.ts +11 -1
- package/agent/dist/terminal.d.ts.map +1 -1
- package/agent/dist/terminal.js +18 -2
- package/agent/dist/terminal.js.map +1 -1
- package/agent/dist/websocket-handlers-planning.d.ts +10 -0
- package/agent/dist/websocket-handlers-planning.d.ts.map +1 -0
- package/agent/dist/websocket-handlers-planning.js +289 -0
- package/agent/dist/websocket-handlers-planning.js.map +1 -0
- package/agent/dist/websocket-handlers.d.ts.map +1 -1
- package/agent/dist/websocket-handlers.js +33 -1
- package/agent/dist/websocket-handlers.js.map +1 -1
- package/agent/node_modules/247-shared/dist/types/index.d.ts +191 -0
- package/agent/node_modules/247-shared/dist/types/index.d.ts.map +1 -1
- package/agent/node_modules/247-shared/dist/types/index.js +13 -0
- package/agent/node_modules/247-shared/dist/types/index.js.map +1 -1
- package/agent/node_modules/247-shared/package.json +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Planner Service
|
|
3
|
+
*
|
|
4
|
+
* Manages project planning sessions using Claude Code.
|
|
5
|
+
* The planner helps users break down projects into actionable issues
|
|
6
|
+
* by asking clarifying questions and generating detailed plans.
|
|
7
|
+
*/
|
|
8
|
+
import { EventEmitter } from 'events';
|
|
9
|
+
import { type Terminal } from '../terminal.js';
|
|
10
|
+
import type { PlanningPhase, PlanningQuestion, IssueSpec } from '247-shared';
|
|
11
|
+
export interface PlanningSession {
|
|
12
|
+
id: string;
|
|
13
|
+
projectId: string;
|
|
14
|
+
phase: PlanningPhase;
|
|
15
|
+
startedAt: number;
|
|
16
|
+
questions: PlanningQuestion[];
|
|
17
|
+
answers: Map<string, string>;
|
|
18
|
+
generatedPlan?: GeneratedPlan;
|
|
19
|
+
terminal?: Terminal;
|
|
20
|
+
outputBuffer: string;
|
|
21
|
+
isWaitingForResponse: boolean;
|
|
22
|
+
}
|
|
23
|
+
export interface GeneratedPlan {
|
|
24
|
+
summary: string;
|
|
25
|
+
issues: IssueSpec[];
|
|
26
|
+
risks: string[];
|
|
27
|
+
estimatedComplexity: 'low' | 'medium' | 'high';
|
|
28
|
+
}
|
|
29
|
+
export interface PlannerEvents {
|
|
30
|
+
'phase-change': (sessionId: string, phase: PlanningPhase) => void;
|
|
31
|
+
'question': (sessionId: string, question: PlanningQuestion) => void;
|
|
32
|
+
'progress': (sessionId: string, message: string) => void;
|
|
33
|
+
'plan-ready': (sessionId: string, plan: GeneratedPlan) => void;
|
|
34
|
+
'issues-created': (sessionId: string, issueIds: string[]) => void;
|
|
35
|
+
'error': (sessionId: string, error: string) => void;
|
|
36
|
+
'output': (sessionId: string, output: string) => void;
|
|
37
|
+
}
|
|
38
|
+
export declare class PlannerService extends EventEmitter {
|
|
39
|
+
private sessions;
|
|
40
|
+
constructor();
|
|
41
|
+
/**
|
|
42
|
+
* Start a new planning session for a project
|
|
43
|
+
*/
|
|
44
|
+
startPlanning(projectId: string, trustMode?: boolean): Promise<string>;
|
|
45
|
+
/**
|
|
46
|
+
* Answer a planning question
|
|
47
|
+
*/
|
|
48
|
+
answerQuestion(sessionId: string, questionId: string, answer: string): void;
|
|
49
|
+
/**
|
|
50
|
+
* Approve the generated plan and create issues
|
|
51
|
+
*/
|
|
52
|
+
approvePlan(sessionId: string): Promise<string[]>;
|
|
53
|
+
/**
|
|
54
|
+
* Cancel a planning session
|
|
55
|
+
*/
|
|
56
|
+
cancelPlanning(sessionId: string): void;
|
|
57
|
+
/**
|
|
58
|
+
* Get planning session info by session ID
|
|
59
|
+
*/
|
|
60
|
+
getSession(sessionId: string): PlanningSession | undefined;
|
|
61
|
+
/**
|
|
62
|
+
* Get planning session by project ID
|
|
63
|
+
*/
|
|
64
|
+
getSessionByProjectId(projectId: string): PlanningSession | undefined;
|
|
65
|
+
/**
|
|
66
|
+
* Send input to the planning terminal
|
|
67
|
+
*/
|
|
68
|
+
sendInput(sessionId: string, input: string): void;
|
|
69
|
+
/**
|
|
70
|
+
* Generate the initial planning prompt for Claude
|
|
71
|
+
*/
|
|
72
|
+
private generatePlanningPrompt;
|
|
73
|
+
/**
|
|
74
|
+
* Parse terminal output for structured data (questions, plan)
|
|
75
|
+
*/
|
|
76
|
+
private parseTerminalOutput;
|
|
77
|
+
}
|
|
78
|
+
export declare const plannerService: PlannerService;
|
|
79
|
+
//# sourceMappingURL=planner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planner.d.ts","sourceRoot":"","sources":["../../src/services/planner.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAI/D,OAAO,KAAK,EACV,aAAa,EACb,gBAAgB,EAChB,SAAS,EAEV,MAAM,YAAY,CAAC;AAMpB,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,aAAa,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC9B,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,oBAAoB,EAAE,OAAO,CAAC;CAC/B;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,mBAAmB,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;CAChD;AAED,MAAM,WAAW,aAAa;IAC5B,cAAc,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IAClE,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACpE,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACzD,YAAY,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,KAAK,IAAI,CAAC;IAC/D,gBAAgB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAClE,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACvD;AAMD,qBAAa,cAAe,SAAQ,YAAY;IAC9C,OAAO,CAAC,QAAQ,CAA2C;;IAM3D;;OAEG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,GAAE,OAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IAmFnF;;OAEG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAmB3E;;OAEG;IACG,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IA2CvD;;OAEG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAevC;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAI1D;;OAEG;IACH,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IASrE;;OAEG;IACH,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAajD;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAqE9B;;OAEG;IACH,OAAO,CAAC,mBAAmB;CA+C5B;AAGD,eAAO,MAAM,cAAc,gBAAuB,CAAC"}
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Planner Service
|
|
3
|
+
*
|
|
4
|
+
* Manages project planning sessions using Claude Code.
|
|
5
|
+
* The planner helps users break down projects into actionable issues
|
|
6
|
+
* by asking clarifying questions and generating detailed plans.
|
|
7
|
+
*/
|
|
8
|
+
import { EventEmitter } from 'events';
|
|
9
|
+
import { createTerminal } from '../terminal.js';
|
|
10
|
+
import { config } from '../config.js';
|
|
11
|
+
import * as projectsDb from '../db/projects.js';
|
|
12
|
+
import * as issuesDb from '../db/issues.js';
|
|
13
|
+
// ============================================================================
|
|
14
|
+
// Planner Service
|
|
15
|
+
// ============================================================================
|
|
16
|
+
export class PlannerService extends EventEmitter {
|
|
17
|
+
sessions = new Map();
|
|
18
|
+
constructor() {
|
|
19
|
+
super();
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Start a new planning session for a project
|
|
23
|
+
*/
|
|
24
|
+
async startPlanning(projectId, trustMode = false) {
|
|
25
|
+
const project = projectsDb.getProject(projectId);
|
|
26
|
+
if (!project) {
|
|
27
|
+
throw new Error(`Project not found: ${projectId}`);
|
|
28
|
+
}
|
|
29
|
+
const sessionId = `planning-${projectId}-${Date.now()}`;
|
|
30
|
+
// Get the base project path
|
|
31
|
+
const baseProject = project.baseProject;
|
|
32
|
+
if (!baseProject) {
|
|
33
|
+
throw new Error('Project has no base project configured');
|
|
34
|
+
}
|
|
35
|
+
const whitelist = config.projects.whitelist;
|
|
36
|
+
if (!whitelist.includes(baseProject)) {
|
|
37
|
+
throw new Error(`Base project not in whitelist: ${baseProject}`);
|
|
38
|
+
}
|
|
39
|
+
const projectPath = `${config.projects.basePath}/${baseProject}`.replace('~', process.env.HOME);
|
|
40
|
+
const session = {
|
|
41
|
+
id: sessionId,
|
|
42
|
+
projectId,
|
|
43
|
+
phase: 'gathering',
|
|
44
|
+
startedAt: Date.now(),
|
|
45
|
+
questions: [],
|
|
46
|
+
answers: new Map(),
|
|
47
|
+
outputBuffer: '',
|
|
48
|
+
isWaitingForResponse: false,
|
|
49
|
+
};
|
|
50
|
+
this.sessions.set(sessionId, session);
|
|
51
|
+
// Update project status
|
|
52
|
+
projectsDb.updateProjectStatus(projectId, 'planning');
|
|
53
|
+
// Create the planning prompt based on mode
|
|
54
|
+
const planningPrompt = this.generatePlanningPrompt(project.name, project.description, trustMode);
|
|
55
|
+
// Create a hidden terminal for Claude Code
|
|
56
|
+
const terminal = createTerminal(projectPath, `planning-${projectId}`, {
|
|
57
|
+
customEnvVars: {
|
|
58
|
+
CLAUDE_PLANNING_SESSION: sessionId,
|
|
59
|
+
CLAUDE_PLANNING_MODE: trustMode ? 'trust' : 'interactive',
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
session.terminal = terminal;
|
|
63
|
+
// Listen for terminal output
|
|
64
|
+
terminal.onData((data) => {
|
|
65
|
+
session.outputBuffer += data;
|
|
66
|
+
this.emit('output', sessionId, data);
|
|
67
|
+
// Parse output for questions, progress, and plan completion
|
|
68
|
+
this.parseTerminalOutput(sessionId);
|
|
69
|
+
});
|
|
70
|
+
terminal.onExit(() => {
|
|
71
|
+
console.log(`[Planner] Terminal exited for session ${sessionId}`);
|
|
72
|
+
if (session.phase !== 'complete') {
|
|
73
|
+
this.emit('error', sessionId, 'Planning session terminated unexpectedly');
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
// Wait for terminal to be ready, then start Claude
|
|
77
|
+
terminal.onReady(() => {
|
|
78
|
+
console.log(`[Planner] Terminal ready, starting Claude for session ${sessionId}`);
|
|
79
|
+
// Start Claude Code with the planning prompt
|
|
80
|
+
terminal.write(`claude "${planningPrompt.replace(/"/g, '\\"')}"\n`);
|
|
81
|
+
});
|
|
82
|
+
this.emit('phase-change', sessionId, 'gathering');
|
|
83
|
+
this.emit('progress', sessionId, 'Starting planning session...');
|
|
84
|
+
return sessionId;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Answer a planning question
|
|
88
|
+
*/
|
|
89
|
+
answerQuestion(sessionId, questionId, answer) {
|
|
90
|
+
const session = this.sessions.get(sessionId);
|
|
91
|
+
if (!session) {
|
|
92
|
+
throw new Error(`Planning session not found: ${sessionId}`);
|
|
93
|
+
}
|
|
94
|
+
if (!session.terminal) {
|
|
95
|
+
throw new Error('Planning session has no active terminal');
|
|
96
|
+
}
|
|
97
|
+
session.answers.set(questionId, answer);
|
|
98
|
+
session.isWaitingForResponse = false;
|
|
99
|
+
// Send the answer to Claude
|
|
100
|
+
session.terminal.write(`${answer}\n`);
|
|
101
|
+
this.emit('progress', sessionId, 'Processing your answer...');
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Approve the generated plan and create issues
|
|
105
|
+
*/
|
|
106
|
+
async approvePlan(sessionId) {
|
|
107
|
+
const session = this.sessions.get(sessionId);
|
|
108
|
+
if (!session) {
|
|
109
|
+
throw new Error(`Planning session not found: ${sessionId}`);
|
|
110
|
+
}
|
|
111
|
+
if (!session.generatedPlan) {
|
|
112
|
+
throw new Error('No plan to approve');
|
|
113
|
+
}
|
|
114
|
+
// Update phase
|
|
115
|
+
session.phase = 'complete';
|
|
116
|
+
this.emit('phase-change', sessionId, 'complete');
|
|
117
|
+
// Create issues from the plan
|
|
118
|
+
const issueInputs = session.generatedPlan.issues.map((spec) => ({
|
|
119
|
+
title: spec.title,
|
|
120
|
+
description: spec.description,
|
|
121
|
+
priority: spec.priority,
|
|
122
|
+
plan: spec.plan,
|
|
123
|
+
}));
|
|
124
|
+
const createdIssues = issuesDb.createIssues(session.projectId, issueInputs);
|
|
125
|
+
const issueIds = createdIssues.map((issue) => issue.id);
|
|
126
|
+
// Update project plan
|
|
127
|
+
projectsDb.updateProjectPlan(session.projectId, session.generatedPlan.summary);
|
|
128
|
+
projectsDb.updateProjectStatus(session.projectId, 'active');
|
|
129
|
+
// Clean up terminal
|
|
130
|
+
if (session.terminal) {
|
|
131
|
+
session.terminal.write('\x03'); // Ctrl+C to exit Claude
|
|
132
|
+
setTimeout(() => {
|
|
133
|
+
session.terminal?.kill();
|
|
134
|
+
}, 500);
|
|
135
|
+
}
|
|
136
|
+
this.emit('issues-created', sessionId, issueIds);
|
|
137
|
+
this.emit('progress', sessionId, `Created ${issueIds.length} issues`);
|
|
138
|
+
return issueIds;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Cancel a planning session
|
|
142
|
+
*/
|
|
143
|
+
cancelPlanning(sessionId) {
|
|
144
|
+
const session = this.sessions.get(sessionId);
|
|
145
|
+
if (!session) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
if (session.terminal) {
|
|
149
|
+
session.terminal.write('\x03'); // Ctrl+C
|
|
150
|
+
session.terminal.kill();
|
|
151
|
+
}
|
|
152
|
+
this.sessions.delete(sessionId);
|
|
153
|
+
this.emit('progress', sessionId, 'Planning cancelled');
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Get planning session info by session ID
|
|
157
|
+
*/
|
|
158
|
+
getSession(sessionId) {
|
|
159
|
+
return this.sessions.get(sessionId);
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Get planning session by project ID
|
|
163
|
+
*/
|
|
164
|
+
getSessionByProjectId(projectId) {
|
|
165
|
+
for (const session of this.sessions.values()) {
|
|
166
|
+
if (session.projectId === projectId) {
|
|
167
|
+
return session;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return undefined;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Send input to the planning terminal
|
|
174
|
+
*/
|
|
175
|
+
sendInput(sessionId, input) {
|
|
176
|
+
const session = this.sessions.get(sessionId);
|
|
177
|
+
if (!session || !session.terminal) {
|
|
178
|
+
throw new Error('Planning session not found or no terminal');
|
|
179
|
+
}
|
|
180
|
+
session.terminal.write(input);
|
|
181
|
+
}
|
|
182
|
+
// ============================================================================
|
|
183
|
+
// Private Methods
|
|
184
|
+
// ============================================================================
|
|
185
|
+
/**
|
|
186
|
+
* Generate the initial planning prompt for Claude
|
|
187
|
+
*/
|
|
188
|
+
generatePlanningPrompt(projectName, description, trustMode) {
|
|
189
|
+
if (trustMode) {
|
|
190
|
+
return `You are a project planning assistant. Create a detailed implementation plan for the following project:
|
|
191
|
+
|
|
192
|
+
Project: ${projectName}
|
|
193
|
+
${description ? `Description: ${description}` : ''}
|
|
194
|
+
|
|
195
|
+
Generate a comprehensive plan with:
|
|
196
|
+
1. A summary of the approach
|
|
197
|
+
2. A list of 3-8 concrete issues/tasks to implement this
|
|
198
|
+
3. For each issue, provide:
|
|
199
|
+
- A clear title
|
|
200
|
+
- A detailed description
|
|
201
|
+
- Priority (0=none, 1=low, 2=medium, 3=high, 4=urgent)
|
|
202
|
+
- An execution plan with specific steps
|
|
203
|
+
|
|
204
|
+
Output your plan in the following format at the end:
|
|
205
|
+
===PLAN_START===
|
|
206
|
+
{
|
|
207
|
+
"summary": "...",
|
|
208
|
+
"issues": [
|
|
209
|
+
{
|
|
210
|
+
"title": "...",
|
|
211
|
+
"description": "...",
|
|
212
|
+
"priority": 2,
|
|
213
|
+
"plan": "Step 1: ...\\nStep 2: ..."
|
|
214
|
+
}
|
|
215
|
+
],
|
|
216
|
+
"risks": ["..."],
|
|
217
|
+
"estimatedComplexity": "medium"
|
|
218
|
+
}
|
|
219
|
+
===PLAN_END===`;
|
|
220
|
+
}
|
|
221
|
+
return `You are a project planning assistant. I need help planning the following project:
|
|
222
|
+
|
|
223
|
+
Project: ${projectName}
|
|
224
|
+
${description ? `Description: ${description}` : ''}
|
|
225
|
+
|
|
226
|
+
Please ask me clarifying questions one at a time to understand:
|
|
227
|
+
- The scope and requirements
|
|
228
|
+
- Technical constraints or preferences
|
|
229
|
+
- Priority and timeline
|
|
230
|
+
|
|
231
|
+
Format each question like this:
|
|
232
|
+
===QUESTION===
|
|
233
|
+
{
|
|
234
|
+
"id": "q1",
|
|
235
|
+
"question": "Your question here?",
|
|
236
|
+
"type": "text",
|
|
237
|
+
"context": "Why you're asking this"
|
|
238
|
+
}
|
|
239
|
+
===END_QUESTION===
|
|
240
|
+
|
|
241
|
+
After gathering enough information (3-5 questions), generate a plan with format:
|
|
242
|
+
===PLAN_START===
|
|
243
|
+
{
|
|
244
|
+
"summary": "...",
|
|
245
|
+
"issues": [...],
|
|
246
|
+
"risks": ["..."],
|
|
247
|
+
"estimatedComplexity": "low|medium|high"
|
|
248
|
+
}
|
|
249
|
+
===PLAN_END===`;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Parse terminal output for structured data (questions, plan)
|
|
253
|
+
*/
|
|
254
|
+
parseTerminalOutput(sessionId) {
|
|
255
|
+
const session = this.sessions.get(sessionId);
|
|
256
|
+
if (!session)
|
|
257
|
+
return;
|
|
258
|
+
const output = session.outputBuffer;
|
|
259
|
+
// Look for questions
|
|
260
|
+
const questionMatch = output.match(/===QUESTION===\s*([\s\S]*?)\s*===END_QUESTION===/);
|
|
261
|
+
if (questionMatch && !session.isWaitingForResponse) {
|
|
262
|
+
try {
|
|
263
|
+
const questionJson = questionMatch[1].trim();
|
|
264
|
+
const question = JSON.parse(questionJson);
|
|
265
|
+
session.questions.push(question);
|
|
266
|
+
session.isWaitingForResponse = true;
|
|
267
|
+
session.phase = 'gathering';
|
|
268
|
+
// Clear the matched portion from buffer
|
|
269
|
+
session.outputBuffer = output.replace(questionMatch[0], '');
|
|
270
|
+
this.emit('question', sessionId, question);
|
|
271
|
+
this.emit('phase-change', sessionId, 'gathering');
|
|
272
|
+
}
|
|
273
|
+
catch (e) {
|
|
274
|
+
console.error('[Planner] Failed to parse question:', e);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
// Look for plan
|
|
278
|
+
const planMatch = output.match(/===PLAN_START===\s*([\s\S]*?)\s*===PLAN_END===/);
|
|
279
|
+
if (planMatch) {
|
|
280
|
+
try {
|
|
281
|
+
const planJson = planMatch[1].trim();
|
|
282
|
+
const plan = JSON.parse(planJson);
|
|
283
|
+
session.generatedPlan = plan;
|
|
284
|
+
session.phase = 'review';
|
|
285
|
+
// Clear the matched portion from buffer
|
|
286
|
+
session.outputBuffer = output.replace(planMatch[0], '');
|
|
287
|
+
this.emit('plan-ready', sessionId, plan);
|
|
288
|
+
this.emit('phase-change', sessionId, 'review');
|
|
289
|
+
}
|
|
290
|
+
catch (e) {
|
|
291
|
+
console.error('[Planner] Failed to parse plan:', e);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
// Singleton instance
|
|
297
|
+
export const plannerService = new PlannerService();
|
|
298
|
+
//# sourceMappingURL=planner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planner.js","sourceRoot":"","sources":["../../src/services/planner.ts"],"names":[],"mappings":"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"}
|
package/agent/dist/terminal.d.ts
CHANGED
|
@@ -11,5 +11,15 @@ export interface Terminal {
|
|
|
11
11
|
isExistingSession(): boolean;
|
|
12
12
|
onReady(callback: () => void): void;
|
|
13
13
|
}
|
|
14
|
-
export
|
|
14
|
+
export interface CreateTerminalOptions {
|
|
15
|
+
/** Custom environment variables to inject into the session */
|
|
16
|
+
customEnvVars?: Record<string, string>;
|
|
17
|
+
/** Issue plan to inject as Claude context */
|
|
18
|
+
issuePlan?: string;
|
|
19
|
+
/** Issue title for display */
|
|
20
|
+
issueTitle?: string;
|
|
21
|
+
/** Planning prompt to start Claude with (for planning sessions) */
|
|
22
|
+
planningPrompt?: string;
|
|
23
|
+
}
|
|
24
|
+
export declare function createTerminal(cwd: string, sessionName: string, options?: CreateTerminalOptions | Record<string, string>): Terminal;
|
|
15
25
|
//# sourceMappingURL=terminal.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../src/terminal.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../src/terminal.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,QAAQ;IACvB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,MAAM,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IAC/C,MAAM,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IAC7D,IAAI,IAAI,IAAI,CAAC;IACb,MAAM,IAAI,IAAI,CAAC;IACf,cAAc,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAChD,iBAAiB,IAAI,OAAO,CAAC;IAC7B,OAAO,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;CACrC;AAED,MAAM,WAAW,qBAAqB;IACpC,8DAA8D;IAC9D,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8BAA8B;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,qBAAqB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAC3D,QAAQ,CAwKV"}
|
package/agent/dist/terminal.js
CHANGED
|
@@ -2,8 +2,13 @@ import * as pty from '@homebridge/node-pty-prebuilt-multiarch';
|
|
|
2
2
|
import { exec, execSync } from 'child_process';
|
|
3
3
|
import { promisify } from 'util';
|
|
4
4
|
import { generateInitScript, writeInitScript, cleanupInitScript } from './lib/init-script';
|
|
5
|
+
import * as path from 'path';
|
|
5
6
|
const execAsync = promisify(exec);
|
|
6
|
-
export function createTerminal(cwd, sessionName,
|
|
7
|
+
export function createTerminal(cwd, sessionName, options = {}) {
|
|
8
|
+
// Support both old signature (customEnvVars object) and new options object
|
|
9
|
+
const { customEnvVars = {}, issuePlan, issueTitle, planningPrompt } = 'customEnvVars' in options || 'issuePlan' in options || 'issueTitle' in options || 'planningPrompt' in options
|
|
10
|
+
? options
|
|
11
|
+
: { customEnvVars: options, issuePlan: undefined, issueTitle: undefined, planningPrompt: undefined };
|
|
7
12
|
// Check if session already exists before spawning
|
|
8
13
|
let existingSession = false;
|
|
9
14
|
try {
|
|
@@ -27,8 +32,19 @@ export function createTerminal(cwd, sessionName, customEnvVars = {}) {
|
|
|
27
32
|
tmuxArgs = ['attach-session', '-t', sessionName];
|
|
28
33
|
}
|
|
29
34
|
else {
|
|
35
|
+
// Extract project name from cwd (last directory component)
|
|
36
|
+
const projectName = path.basename(cwd) || 'unknown';
|
|
30
37
|
// Generate and write init script for new sessions
|
|
31
|
-
|
|
38
|
+
// Always use bash since we launch with `bash --init-file`
|
|
39
|
+
const scriptContent = generateInitScript({
|
|
40
|
+
sessionName,
|
|
41
|
+
projectName,
|
|
42
|
+
customEnvVars,
|
|
43
|
+
shell: 'bash',
|
|
44
|
+
issuePlan,
|
|
45
|
+
issueTitle,
|
|
46
|
+
planningPrompt,
|
|
47
|
+
});
|
|
32
48
|
initScriptPath = writeInitScript(sessionName, scriptContent);
|
|
33
49
|
console.log(`[Terminal] Init script written to: ${initScriptPath}`);
|
|
34
50
|
// Spawn tmux with the init script
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal.js","sourceRoot":"","sources":["../src/terminal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,yCAAyC,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"terminal.js","sourceRoot":"","sources":["../src/terminal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebSocket handlers for project planning sessions.
|
|
3
|
+
* Manages the interactive planning flow with Claude Code.
|
|
4
|
+
*/
|
|
5
|
+
import { WebSocket } from 'ws';
|
|
6
|
+
/**
|
|
7
|
+
* Handle a planning WebSocket connection
|
|
8
|
+
*/
|
|
9
|
+
export declare function handlePlanningConnection(ws: WebSocket, url: URL): void;
|
|
10
|
+
//# sourceMappingURL=websocket-handlers-planning.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket-handlers-planning.d.ts","sourceRoot":"","sources":["../src/websocket-handlers-planning.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAU/B;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,GAAG,IAAI,CA8EtE"}
|