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.
Files changed (67) hide show
  1. package/agent/dist/db/index.d.ts.map +1 -1
  2. package/agent/dist/db/index.js +22 -0
  3. package/agent/dist/db/index.js.map +1 -1
  4. package/agent/dist/db/issues.d.ts +83 -0
  5. package/agent/dist/db/issues.d.ts.map +1 -0
  6. package/agent/dist/db/issues.js +423 -0
  7. package/agent/dist/db/issues.js.map +1 -0
  8. package/agent/dist/db/projects.d.ts +63 -0
  9. package/agent/dist/db/projects.d.ts.map +1 -0
  10. package/agent/dist/db/projects.js +288 -0
  11. package/agent/dist/db/projects.js.map +1 -0
  12. package/agent/dist/db/schema.d.ts +64 -3
  13. package/agent/dist/db/schema.d.ts.map +1 -1
  14. package/agent/dist/db/schema.js +45 -2
  15. package/agent/dist/db/schema.js.map +1 -1
  16. package/agent/dist/db/sessions.d.ts.map +1 -1
  17. package/agent/dist/db/sessions.js +5 -3
  18. package/agent/dist/db/sessions.js.map +1 -1
  19. package/agent/dist/lib/init-script.d.ts +14 -2
  20. package/agent/dist/lib/init-script.d.ts.map +1 -1
  21. package/agent/dist/lib/init-script.js +234 -14
  22. package/agent/dist/lib/init-script.js.map +1 -1
  23. package/agent/dist/lib/planning-prompt.d.ts +7 -0
  24. package/agent/dist/lib/planning-prompt.d.ts.map +1 -0
  25. package/agent/dist/lib/planning-prompt.js +51 -0
  26. package/agent/dist/lib/planning-prompt.js.map +1 -0
  27. package/agent/dist/routes/index.d.ts +2 -0
  28. package/agent/dist/routes/index.d.ts.map +1 -1
  29. package/agent/dist/routes/index.js +2 -0
  30. package/agent/dist/routes/index.js.map +1 -1
  31. package/agent/dist/routes/issues.d.ts +6 -0
  32. package/agent/dist/routes/issues.d.ts.map +1 -0
  33. package/agent/dist/routes/issues.js +235 -0
  34. package/agent/dist/routes/issues.js.map +1 -0
  35. package/agent/dist/routes/managed-projects.d.ts +7 -0
  36. package/agent/dist/routes/managed-projects.d.ts.map +1 -0
  37. package/agent/dist/routes/managed-projects.js +230 -0
  38. package/agent/dist/routes/managed-projects.js.map +1 -0
  39. package/agent/dist/server.d.ts.map +1 -1
  40. package/agent/dist/server.js +10 -1
  41. package/agent/dist/server.js.map +1 -1
  42. package/agent/dist/services/index.d.ts +2 -0
  43. package/agent/dist/services/index.d.ts.map +1 -1
  44. package/agent/dist/services/index.js +1 -0
  45. package/agent/dist/services/index.js.map +1 -1
  46. package/agent/dist/services/planner.d.ts +79 -0
  47. package/agent/dist/services/planner.d.ts.map +1 -0
  48. package/agent/dist/services/planner.js +298 -0
  49. package/agent/dist/services/planner.js.map +1 -0
  50. package/agent/dist/terminal.d.ts +11 -1
  51. package/agent/dist/terminal.d.ts.map +1 -1
  52. package/agent/dist/terminal.js +18 -2
  53. package/agent/dist/terminal.js.map +1 -1
  54. package/agent/dist/websocket-handlers-planning.d.ts +10 -0
  55. package/agent/dist/websocket-handlers-planning.d.ts.map +1 -0
  56. package/agent/dist/websocket-handlers-planning.js +289 -0
  57. package/agent/dist/websocket-handlers-planning.js.map +1 -0
  58. package/agent/dist/websocket-handlers.d.ts.map +1 -1
  59. package/agent/dist/websocket-handlers.js +33 -1
  60. package/agent/dist/websocket-handlers.js.map +1 -1
  61. package/agent/node_modules/247-shared/dist/types/index.d.ts +191 -0
  62. package/agent/node_modules/247-shared/dist/types/index.d.ts.map +1 -1
  63. package/agent/node_modules/247-shared/dist/types/index.js +13 -0
  64. package/agent/node_modules/247-shared/dist/types/index.js.map +1 -1
  65. package/agent/node_modules/247-shared/package.json +1 -1
  66. package/dist/index.js +1 -1
  67. 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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"}
@@ -11,5 +11,15 @@ export interface Terminal {
11
11
  isExistingSession(): boolean;
12
12
  onReady(callback: () => void): void;
13
13
  }
14
- export declare function createTerminal(cwd: string, sessionName: string, customEnvVars?: Record<string, string>): Terminal;
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":"AAOA,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,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM,EACnB,aAAa,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GACzC,QAAQ,CAuJV"}
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"}
@@ -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, customEnvVars = {}) {
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
- const scriptContent = generateInitScript({ sessionName, customEnvVars });
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":"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"}
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"}