247-cli 1.7.0 → 2.0.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 +4 -16
- package/agent/dist/db/index.js.map +1 -1
- package/agent/dist/db/schema.d.ts +2 -63
- package/agent/dist/db/schema.d.ts.map +1 -1
- package/agent/dist/db/schema.js +1 -44
- 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 +3 -5
- package/agent/dist/db/sessions.js.map +1 -1
- package/agent/dist/lib/init-script.d.ts +0 -6
- package/agent/dist/lib/init-script.d.ts.map +1 -1
- package/agent/dist/lib/init-script.js +157 -48
- package/agent/dist/lib/init-script.js.map +1 -1
- package/agent/dist/routes/index.d.ts +0 -2
- package/agent/dist/routes/index.d.ts.map +1 -1
- package/agent/dist/routes/index.js +0 -2
- package/agent/dist/routes/index.js.map +1 -1
- package/agent/dist/server.d.ts.map +1 -1
- package/agent/dist/server.js +1 -10
- package/agent/dist/server.js.map +1 -1
- package/agent/dist/services/index.d.ts +0 -2
- package/agent/dist/services/index.d.ts.map +1 -1
- package/agent/dist/services/index.js +0 -1
- package/agent/dist/services/index.js.map +1 -1
- package/agent/dist/terminal.d.ts +0 -6
- package/agent/dist/terminal.d.ts.map +1 -1
- package/agent/dist/terminal.js +16 -6
- package/agent/dist/terminal.js.map +1 -1
- package/agent/dist/websocket-handlers.d.ts.map +1 -1
- package/agent/dist/websocket-handlers.js +0 -30
- package/agent/dist/websocket-handlers.js.map +1 -1
- package/agent/node_modules/247-shared/dist/types/index.d.ts +0 -191
- package/agent/node_modules/247-shared/dist/types/index.d.ts.map +1 -1
- package/agent/node_modules/247-shared/dist/types/index.js +0 -13
- 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
- package/agent/dist/db/issues.d.ts +0 -83
- package/agent/dist/db/issues.d.ts.map +0 -1
- package/agent/dist/db/issues.js +0 -423
- package/agent/dist/db/issues.js.map +0 -1
- package/agent/dist/db/projects.d.ts +0 -63
- package/agent/dist/db/projects.d.ts.map +0 -1
- package/agent/dist/db/projects.js +0 -288
- package/agent/dist/db/projects.js.map +0 -1
- package/agent/dist/lib/planning-prompt.d.ts +0 -7
- package/agent/dist/lib/planning-prompt.d.ts.map +0 -1
- package/agent/dist/lib/planning-prompt.js +0 -51
- package/agent/dist/lib/planning-prompt.js.map +0 -1
- package/agent/dist/routes/issues.d.ts +0 -6
- package/agent/dist/routes/issues.d.ts.map +0 -1
- package/agent/dist/routes/issues.js +0 -235
- package/agent/dist/routes/issues.js.map +0 -1
- package/agent/dist/routes/managed-projects.d.ts +0 -7
- package/agent/dist/routes/managed-projects.d.ts.map +0 -1
- package/agent/dist/routes/managed-projects.js +0 -230
- package/agent/dist/routes/managed-projects.js.map +0 -1
- package/agent/dist/services/planner.d.ts +0 -79
- package/agent/dist/services/planner.d.ts.map +0 -1
- package/agent/dist/services/planner.js +0 -298
- package/agent/dist/services/planner.js.map +0 -1
- package/agent/dist/websocket-handlers-planning.d.ts +0 -10
- package/agent/dist/websocket-handlers-planning.d.ts.map +0 -1
- package/agent/dist/websocket-handlers-planning.js +0 -289
- package/agent/dist/websocket-handlers-planning.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"issues.js","sourceRoot":"","sources":["../../src/routes/issues.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Managed Projects API routes: CRUD operations for Project entities.
|
|
3
|
-
* These are the Linear-like project management entities, not filesystem projects.
|
|
4
|
-
*/
|
|
5
|
-
import { Router } from 'express';
|
|
6
|
-
export declare function createManagedProjectRoutes(): Router;
|
|
7
|
-
//# sourceMappingURL=managed-projects.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"managed-projects.d.ts","sourceRoot":"","sources":["../../src/routes/managed-projects.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AA+BjC,wBAAgB,0BAA0B,IAAI,MAAM,CAkQnD"}
|
|
@@ -1,230 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Managed Projects API routes: CRUD operations for Project entities.
|
|
3
|
-
* These are the Linear-like project management entities, not filesystem projects.
|
|
4
|
-
*/
|
|
5
|
-
import { Router } from 'express';
|
|
6
|
-
import * as fs from 'fs';
|
|
7
|
-
import * as path from 'path';
|
|
8
|
-
import { config } from '../config.js';
|
|
9
|
-
import { getProject, getAllProjectsWithCounts, getArchivedProjects, getProjectsByStatus, createProject, updateProject, updateProjectStatus, updateProjectPlan, archiveProject, deleteProject, } from '../db/projects.js';
|
|
10
|
-
import { getIssuesByProject, createIssues } from '../db/issues.js';
|
|
11
|
-
import { generatePlanningPrompt } from '../lib/planning-prompt.js';
|
|
12
|
-
// Helper to check if a folder exists in basePath
|
|
13
|
-
function isValidBaseProject(projectName) {
|
|
14
|
-
const basePath = config.projects.basePath.replace('~', process.env.HOME || '');
|
|
15
|
-
const projectPath = path.join(basePath, projectName);
|
|
16
|
-
try {
|
|
17
|
-
return fs.existsSync(projectPath) && fs.statSync(projectPath).isDirectory();
|
|
18
|
-
}
|
|
19
|
-
catch {
|
|
20
|
-
return false;
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
export function createManagedProjectRoutes() {
|
|
24
|
-
const router = Router();
|
|
25
|
-
// List all projects (with issue counts)
|
|
26
|
-
router.get('/', (req, res) => {
|
|
27
|
-
const includeArchived = req.query.archived === 'true';
|
|
28
|
-
const status = req.query.status;
|
|
29
|
-
if (status) {
|
|
30
|
-
res.json({
|
|
31
|
-
success: true,
|
|
32
|
-
projects: getProjectsByStatus(status),
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
else if (includeArchived) {
|
|
36
|
-
res.json({
|
|
37
|
-
success: true,
|
|
38
|
-
projects: [...getAllProjectsWithCounts(), ...getArchivedProjects()],
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
else {
|
|
42
|
-
res.json({
|
|
43
|
-
success: true,
|
|
44
|
-
projects: getAllProjectsWithCounts(),
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
});
|
|
48
|
-
// Get single project with issues
|
|
49
|
-
router.get('/:id', (req, res) => {
|
|
50
|
-
const project = getProject(req.params.id);
|
|
51
|
-
if (!project) {
|
|
52
|
-
return res.status(404).json({ success: false, error: 'Project not found' });
|
|
53
|
-
}
|
|
54
|
-
const issues = getIssuesByProject(req.params.id);
|
|
55
|
-
res.json({
|
|
56
|
-
success: true,
|
|
57
|
-
project,
|
|
58
|
-
issues,
|
|
59
|
-
});
|
|
60
|
-
});
|
|
61
|
-
// Create project
|
|
62
|
-
router.post('/', (req, res) => {
|
|
63
|
-
const body = req.body;
|
|
64
|
-
if (!body.name) {
|
|
65
|
-
return res.status(400).json({ success: false, error: 'Missing required field: name' });
|
|
66
|
-
}
|
|
67
|
-
if (!body.baseProject) {
|
|
68
|
-
return res.status(400).json({ success: false, error: 'Missing required field: baseProject' });
|
|
69
|
-
}
|
|
70
|
-
// Validate baseProject exists as a folder in basePath
|
|
71
|
-
if (!isValidBaseProject(body.baseProject)) {
|
|
72
|
-
return res.status(400).json({
|
|
73
|
-
success: false,
|
|
74
|
-
error: `Invalid baseProject: ${body.baseProject}. Folder does not exist in ${config.projects.basePath}`,
|
|
75
|
-
});
|
|
76
|
-
}
|
|
77
|
-
try {
|
|
78
|
-
const project = createProject({
|
|
79
|
-
name: body.name,
|
|
80
|
-
description: body.description ?? null,
|
|
81
|
-
trustMode: body.trustMode ?? false,
|
|
82
|
-
baseProject: body.baseProject,
|
|
83
|
-
});
|
|
84
|
-
res.status(201).json({
|
|
85
|
-
success: true,
|
|
86
|
-
project,
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
catch (err) {
|
|
90
|
-
console.error('[ManagedProjects] Create error:', err);
|
|
91
|
-
res.status(500).json({ success: false, error: 'Failed to create project' });
|
|
92
|
-
}
|
|
93
|
-
});
|
|
94
|
-
// Update project
|
|
95
|
-
router.patch('/:id', (req, res) => {
|
|
96
|
-
const body = req.body;
|
|
97
|
-
const updated = updateProject(req.params.id, {
|
|
98
|
-
name: body.name,
|
|
99
|
-
description: body.description,
|
|
100
|
-
status: body.status,
|
|
101
|
-
trustMode: body.trustMode,
|
|
102
|
-
});
|
|
103
|
-
if (!updated) {
|
|
104
|
-
return res.status(404).json({ success: false, error: 'Project not found' });
|
|
105
|
-
}
|
|
106
|
-
res.json({
|
|
107
|
-
success: true,
|
|
108
|
-
project: updated,
|
|
109
|
-
});
|
|
110
|
-
});
|
|
111
|
-
// Update project status
|
|
112
|
-
router.patch('/:id/status', (req, res) => {
|
|
113
|
-
const { status } = req.body;
|
|
114
|
-
if (!status) {
|
|
115
|
-
return res.status(400).json({ success: false, error: 'Missing required field: status' });
|
|
116
|
-
}
|
|
117
|
-
const success = updateProjectStatus(req.params.id, status);
|
|
118
|
-
if (!success) {
|
|
119
|
-
return res.status(404).json({ success: false, error: 'Project not found' });
|
|
120
|
-
}
|
|
121
|
-
res.json({
|
|
122
|
-
success: true,
|
|
123
|
-
project: getProject(req.params.id),
|
|
124
|
-
});
|
|
125
|
-
});
|
|
126
|
-
// Update project plan
|
|
127
|
-
router.patch('/:id/plan', (req, res) => {
|
|
128
|
-
const { plan } = req.body;
|
|
129
|
-
if (!plan) {
|
|
130
|
-
return res.status(400).json({ success: false, error: 'Missing required field: plan' });
|
|
131
|
-
}
|
|
132
|
-
const success = updateProjectPlan(req.params.id, plan);
|
|
133
|
-
if (!success) {
|
|
134
|
-
return res.status(404).json({ success: false, error: 'Project not found' });
|
|
135
|
-
}
|
|
136
|
-
res.json({
|
|
137
|
-
success: true,
|
|
138
|
-
project: getProject(req.params.id),
|
|
139
|
-
});
|
|
140
|
-
});
|
|
141
|
-
// Archive project
|
|
142
|
-
router.post('/:id/archive', (req, res) => {
|
|
143
|
-
const archived = archiveProject(req.params.id);
|
|
144
|
-
if (!archived) {
|
|
145
|
-
return res.status(404).json({ success: false, error: 'Project not found' });
|
|
146
|
-
}
|
|
147
|
-
res.json({
|
|
148
|
-
success: true,
|
|
149
|
-
project: archived,
|
|
150
|
-
});
|
|
151
|
-
});
|
|
152
|
-
// Delete project
|
|
153
|
-
router.delete('/:id', (req, res) => {
|
|
154
|
-
const deleted = deleteProject(req.params.id);
|
|
155
|
-
if (!deleted) {
|
|
156
|
-
return res.status(404).json({ success: false, error: 'Project not found' });
|
|
157
|
-
}
|
|
158
|
-
res.json({ success: true });
|
|
159
|
-
});
|
|
160
|
-
// Get issues for project
|
|
161
|
-
router.get('/:id/issues', (req, res) => {
|
|
162
|
-
const project = getProject(req.params.id);
|
|
163
|
-
if (!project) {
|
|
164
|
-
return res.status(404).json({ success: false, error: 'Project not found' });
|
|
165
|
-
}
|
|
166
|
-
const issues = getIssuesByProject(req.params.id);
|
|
167
|
-
res.json({
|
|
168
|
-
success: true,
|
|
169
|
-
issues,
|
|
170
|
-
});
|
|
171
|
-
});
|
|
172
|
-
// Batch create issues for project (from plan)
|
|
173
|
-
router.post('/:id/issues/batch', (req, res) => {
|
|
174
|
-
const project = getProject(req.params.id);
|
|
175
|
-
if (!project) {
|
|
176
|
-
return res.status(404).json({ success: false, error: 'Project not found' });
|
|
177
|
-
}
|
|
178
|
-
const { issues: issueSpecs } = req.body;
|
|
179
|
-
if (!issueSpecs || !Array.isArray(issueSpecs)) {
|
|
180
|
-
return res.status(400).json({ success: false, error: 'Missing required field: issues (array)' });
|
|
181
|
-
}
|
|
182
|
-
try {
|
|
183
|
-
const createdIssues = createIssues(req.params.id, issueSpecs.map((spec) => ({
|
|
184
|
-
title: spec.title,
|
|
185
|
-
description: spec.description,
|
|
186
|
-
priority: (spec.priority ?? 0),
|
|
187
|
-
plan: spec.plan,
|
|
188
|
-
})));
|
|
189
|
-
// Update project status to active if it was planning
|
|
190
|
-
if (project.status === 'planning') {
|
|
191
|
-
updateProjectStatus(req.params.id, 'active');
|
|
192
|
-
}
|
|
193
|
-
res.status(201).json({
|
|
194
|
-
success: true,
|
|
195
|
-
issues: createdIssues,
|
|
196
|
-
});
|
|
197
|
-
}
|
|
198
|
-
catch (err) {
|
|
199
|
-
console.error('[ManagedProjects] Batch create issues error:', err);
|
|
200
|
-
res.status(500).json({ success: false, error: 'Failed to create issues' });
|
|
201
|
-
}
|
|
202
|
-
});
|
|
203
|
-
// Start planning session - returns info needed to launch a Claude session with planning prompt
|
|
204
|
-
router.post('/:id/start-planning', (req, res) => {
|
|
205
|
-
const project = getProject(req.params.id);
|
|
206
|
-
if (!project) {
|
|
207
|
-
return res.status(404).json({ success: false, error: 'Project not found' });
|
|
208
|
-
}
|
|
209
|
-
if (!project.baseProject) {
|
|
210
|
-
return res.status(400).json({ success: false, error: 'Project has no baseProject configured' });
|
|
211
|
-
}
|
|
212
|
-
// Generate session name from project name
|
|
213
|
-
const sessionName = `planning-${project.name.toLowerCase().replace(/\s+/g, '-').replace(/[^a-z0-9-]/g, '')}`;
|
|
214
|
-
// Get the codebase path
|
|
215
|
-
const basePath = config.projects.basePath.replace('~', process.env.HOME || '');
|
|
216
|
-
const projectPath = path.join(basePath, project.baseProject);
|
|
217
|
-
// Generate the planning prompt
|
|
218
|
-
const agentPort = config.agent?.port ?? 4678;
|
|
219
|
-
const prompt = generatePlanningPrompt(project.id, project.name, project.description ?? '', `http://localhost:${agentPort}`);
|
|
220
|
-
res.json({
|
|
221
|
-
success: true,
|
|
222
|
-
sessionName,
|
|
223
|
-
projectPath,
|
|
224
|
-
baseProject: project.baseProject,
|
|
225
|
-
prompt,
|
|
226
|
-
});
|
|
227
|
-
});
|
|
228
|
-
return router;
|
|
229
|
-
}
|
|
230
|
-
//# sourceMappingURL=managed-projects.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"managed-projects.js","sourceRoot":"","sources":["../../src/routes/managed-projects.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,79 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1,298 +0,0 @@
|
|
|
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
|