sessioncast-cli 2.0.2 → 2.0.3

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 (45) hide show
  1. package/dist/agent/runner.js +23 -0
  2. package/dist/agent/session-handler.d.ts +1 -2
  3. package/dist/agent/session-handler.js +34 -79
  4. package/dist/agent/tmux-executor.d.ts +3 -33
  5. package/dist/agent/tmux-executor.js +3 -50
  6. package/dist/agent/tmux.d.ts +2 -6
  7. package/dist/agent/tmux.js +2 -9
  8. package/dist/agent/types.d.ts +0 -10
  9. package/dist/agent/websocket.d.ts +2 -21
  10. package/dist/agent/websocket.js +10 -46
  11. package/dist/commands/agent.js +3 -0
  12. package/dist/index.js +14 -0
  13. package/dist/sentry.d.ts +4 -0
  14. package/dist/sentry.js +87 -0
  15. package/package.json +2 -1
  16. package/dist/autopilot/index.d.ts +0 -94
  17. package/dist/autopilot/index.js +0 -322
  18. package/dist/autopilot/mission-analyzer.d.ts +0 -27
  19. package/dist/autopilot/mission-analyzer.js +0 -232
  20. package/dist/autopilot/project-detector.d.ts +0 -12
  21. package/dist/autopilot/project-detector.js +0 -326
  22. package/dist/autopilot/source-scanner.d.ts +0 -26
  23. package/dist/autopilot/source-scanner.js +0 -285
  24. package/dist/autopilot/speckit-generator.d.ts +0 -60
  25. package/dist/autopilot/speckit-generator.js +0 -511
  26. package/dist/autopilot/types.d.ts +0 -110
  27. package/dist/autopilot/types.js +0 -6
  28. package/dist/autopilot/workflow-generator.d.ts +0 -33
  29. package/dist/autopilot/workflow-generator.js +0 -278
  30. package/dist/commands/autopilot.d.ts +0 -30
  31. package/dist/commands/autopilot.js +0 -262
  32. package/dist/commands/project.d.ts +0 -33
  33. package/dist/commands/project.js +0 -350
  34. package/dist/project/executor.d.ts +0 -73
  35. package/dist/project/executor.js +0 -437
  36. package/dist/project/index.d.ts +0 -4
  37. package/dist/project/index.js +0 -20
  38. package/dist/project/manager.d.ts +0 -66
  39. package/dist/project/manager.js +0 -290
  40. package/dist/project/relay-client.d.ts +0 -37
  41. package/dist/project/relay-client.js +0 -204
  42. package/dist/project/types.d.ts +0 -48
  43. package/dist/project/types.js +0 -3
  44. package/dist/utils/fileUtils.d.ts +0 -28
  45. package/dist/utils/fileUtils.js +0 -159
@@ -1,350 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- var __importDefault = (this && this.__importDefault) || function (mod) {
36
- return (mod && mod.__esModule) ? mod : { "default": mod };
37
- };
38
- Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.projectInit = projectInit;
40
- exports.projectRun = projectRun;
41
- exports.projectStatus = projectStatus;
42
- exports.projectStop = projectStop;
43
- exports.projectSend = projectSend;
44
- exports.projectCreateWorkflow = projectCreateWorkflow;
45
- const chalk_1 = __importDefault(require("chalk"));
46
- const path = __importStar(require("path"));
47
- const project_1 = require("../project");
48
- /**
49
- * Initialize a new project
50
- */
51
- async function projectInit(projectPath, options) {
52
- const resolvedPath = path.resolve(projectPath || '.');
53
- console.log(chalk_1.default.blue('Initializing SessionCast project...'));
54
- console.log(chalk_1.default.gray(`Path: ${resolvedPath}`));
55
- const manager = new project_1.ProjectManager(resolvedPath);
56
- const project = manager.init(options.name);
57
- console.log(chalk_1.default.green('\nProject initialized successfully!'));
58
- console.log(chalk_1.default.gray('─'.repeat(50)));
59
- console.log(` Name: ${chalk_1.default.bold(project.name)}`);
60
- console.log(` Path: ${project.path}`);
61
- console.log(` Status: ${project.status}`);
62
- console.log(chalk_1.default.gray('─'.repeat(50)));
63
- console.log(chalk_1.default.yellow('\nFolder structure created:'));
64
- console.log(' mission/ - Mission history and refined mission');
65
- console.log(' flow/ - Workflow definitions');
66
- console.log(' shared/ - Shared context between agents');
67
- console.log(' tools/ - Meta tools (mission-refiner, pm-agent)');
68
- console.log(' work/ - Work agents');
69
- console.log(chalk_1.default.cyan('\nNext steps:'));
70
- console.log(' 1. Define your workflow in flow/workflow.yml');
71
- console.log(' 2. Or start mission refinement:');
72
- console.log(chalk_1.default.gray(` cd ${resolvedPath}/tools/mission-refiner && claude`));
73
- console.log(' 3. Run the workflow:');
74
- console.log(chalk_1.default.gray(` sessioncast project run ${resolvedPath}`));
75
- }
76
- /**
77
- * Run workflow
78
- */
79
- async function projectRun(projectPath, options) {
80
- const resolvedPath = path.resolve(projectPath || '.');
81
- console.log(chalk_1.default.blue('Running SessionCast workflow...'));
82
- console.log(chalk_1.default.gray(`Path: ${resolvedPath}`));
83
- const manager = new project_1.ProjectManager(resolvedPath);
84
- const project = manager.load();
85
- if (!project) {
86
- console.error(chalk_1.default.red('Error: Not a SessionCast project. Run `sessioncast project init` first.'));
87
- process.exit(1);
88
- }
89
- const workflow = manager.loadWorkflow();
90
- if (!workflow) {
91
- console.error(chalk_1.default.red('Error: No workflow.yml found. Define your workflow first.'));
92
- process.exit(1);
93
- }
94
- console.log(chalk_1.default.gray('─'.repeat(50)));
95
- console.log(` Workflow: ${chalk_1.default.bold(workflow.name)}`);
96
- console.log(` Mission: ${workflow.mission}`);
97
- console.log(` Agents: ${workflow.agents.map(a => a.id).join(', ')}`);
98
- console.log(` Auto-launch Claude: ${options.noClaude ? 'No' : 'Yes'}`);
99
- if (options.relay) {
100
- console.log(` Relay: ${options.relay}`);
101
- }
102
- console.log(chalk_1.default.gray('─'.repeat(50)));
103
- const executor = new project_1.WorkflowExecutor(manager, {
104
- autoLaunchClaude: !options.noClaude,
105
- relayUrl: options.relay,
106
- relayToken: options.relayToken
107
- });
108
- executor.on('agent-started', ({ agentId, sessionName }) => {
109
- console.log(chalk_1.default.cyan(`[${agentId}] Started - tmux session: ${sessionName}`));
110
- });
111
- executor.on('agent-completed', ({ agentId, output }) => {
112
- console.log(chalk_1.default.green(`[${agentId}] Completed`));
113
- if (output) {
114
- console.log(chalk_1.default.gray(` Output: ${output.substring(0, 100)}...`));
115
- }
116
- });
117
- executor.on('workflow-completed', () => {
118
- console.log(chalk_1.default.green.bold('\nWorkflow completed successfully!'));
119
- if (!options.watch) {
120
- process.exit(0);
121
- }
122
- });
123
- executor.on('workflow-failed', () => {
124
- console.log(chalk_1.default.red.bold('\nWorkflow failed!'));
125
- const status = manager.loadStatus();
126
- if (status) {
127
- for (const [agentId, agentStatus] of Object.entries(status.agents)) {
128
- if (agentStatus.status === 'failed') {
129
- console.log(chalk_1.default.red(` [${agentId}] ${agentStatus.error || 'Unknown error'}`));
130
- }
131
- }
132
- }
133
- if (!options.watch) {
134
- process.exit(1);
135
- }
136
- });
137
- // Handle shutdown
138
- process.on('SIGINT', () => {
139
- console.log(chalk_1.default.yellow('\nStopping workflow...'));
140
- executor.stop();
141
- process.exit(0);
142
- });
143
- await executor.start();
144
- if (options.watch) {
145
- console.log(chalk_1.default.gray('\nWatching for changes... (Ctrl+C to stop)'));
146
- }
147
- }
148
- /**
149
- * Show project status
150
- */
151
- async function projectStatus(projectPath) {
152
- const resolvedPath = path.resolve(projectPath || '.');
153
- const manager = new project_1.ProjectManager(resolvedPath);
154
- const project = manager.load();
155
- if (!project) {
156
- console.error(chalk_1.default.red('Error: Not a SessionCast project.'));
157
- process.exit(1);
158
- }
159
- const workflow = manager.loadWorkflow();
160
- const status = manager.loadStatus();
161
- const executor = new project_1.WorkflowExecutor(manager);
162
- const sessions = executor.listSessions();
163
- console.log(chalk_1.default.blue('SessionCast Project Status'));
164
- console.log(chalk_1.default.gray('─'.repeat(50)));
165
- console.log(` Project: ${chalk_1.default.bold(project.name)}`);
166
- console.log(` Path: ${project.path}`);
167
- console.log(` Status: ${colorStatus(project.status)}`);
168
- console.log(chalk_1.default.gray('─'.repeat(50)));
169
- if (workflow) {
170
- console.log(chalk_1.default.yellow('\nWorkflow:'));
171
- console.log(` Name: ${workflow.name}`);
172
- console.log(` Mission: ${workflow.mission}`);
173
- console.log(` Agents: ${workflow.agents.length}`);
174
- if (status) {
175
- console.log(chalk_1.default.yellow('\nAgent Status:'));
176
- for (const agent of workflow.agents) {
177
- const agentStatus = status.agents[agent.id];
178
- const statusStr = agentStatus ? colorStatus(agentStatus.status) : chalk_1.default.gray('not started');
179
- const isRunning = sessions.includes(agent.id);
180
- const sessionIndicator = isRunning ? chalk_1.default.green(' [tmux]') : '';
181
- console.log(` ${agent.id}: ${statusStr}${sessionIndicator}`);
182
- if (agentStatus?.currentTask) {
183
- console.log(chalk_1.default.gray(` → ${agentStatus.currentTask}`));
184
- }
185
- if (agentStatus?.error) {
186
- console.log(chalk_1.default.red(` ! ${agentStatus.error}`));
187
- }
188
- }
189
- }
190
- }
191
- else {
192
- console.log(chalk_1.default.yellow('\nNo workflow defined yet.'));
193
- console.log(chalk_1.default.gray('Create flow/workflow.yml to define your workflow.'));
194
- }
195
- if (sessions.length > 0) {
196
- console.log(chalk_1.default.yellow('\nActive Sessions:'));
197
- for (const session of sessions) {
198
- console.log(` ${session}`);
199
- }
200
- }
201
- }
202
- /**
203
- * Stop workflow and kill sessions
204
- */
205
- async function projectStop(projectPath) {
206
- const resolvedPath = path.resolve(projectPath || '.');
207
- console.log(chalk_1.default.blue('Stopping SessionCast workflow...'));
208
- const manager = new project_1.ProjectManager(resolvedPath);
209
- const executor = new project_1.WorkflowExecutor(manager);
210
- executor.killAllSessions();
211
- console.log(chalk_1.default.green('All sessions stopped.'));
212
- }
213
- /**
214
- * List agents and send commands
215
- */
216
- async function projectSend(projectPath, agentId, message) {
217
- const resolvedPath = path.resolve(projectPath || '.');
218
- const manager = new project_1.ProjectManager(resolvedPath);
219
- const executor = new project_1.WorkflowExecutor(manager);
220
- if (executor.sendToAgent(agentId, message)) {
221
- console.log(chalk_1.default.green(`Sent to ${agentId}: ${message}`));
222
- }
223
- else {
224
- console.error(chalk_1.default.red(`Failed to send to ${agentId}. Is the session running?`));
225
- process.exit(1);
226
- }
227
- }
228
- /**
229
- * Create a sample workflow
230
- */
231
- async function projectCreateWorkflow(projectPath, options) {
232
- const resolvedPath = path.resolve(projectPath || '.');
233
- const manager = new project_1.ProjectManager(resolvedPath);
234
- const project = manager.load();
235
- if (!project) {
236
- console.error(chalk_1.default.red('Error: Not a SessionCast project.'));
237
- process.exit(1);
238
- }
239
- const template = options.template || 'basic';
240
- const workflow = getWorkflowTemplate(template, project.name);
241
- manager.saveWorkflow(workflow);
242
- // Create work folders
243
- for (const agent of workflow.agents) {
244
- manager.createWorkAgent(agent.id, agent.name, agent.tasks);
245
- }
246
- console.log(chalk_1.default.green(`Created workflow from template: ${template}`));
247
- console.log(chalk_1.default.gray(`File: ${resolvedPath}/flow/workflow.yml`));
248
- console.log(chalk_1.default.yellow('\nAgents created:'));
249
- for (const agent of workflow.agents) {
250
- console.log(` ${agent.id} - ${agent.name}`);
251
- }
252
- }
253
- function getWorkflowTemplate(template, projectName) {
254
- switch (template) {
255
- case 'android':
256
- return {
257
- name: projectName,
258
- mission: 'Android app development',
259
- created: new Date().toISOString(),
260
- agents: [
261
- {
262
- id: 'android',
263
- name: 'Android Development',
264
- workDir: 'work/android',
265
- tasks: ['Feature implementation', 'UI development'],
266
- dependsOn: []
267
- },
268
- {
269
- id: 'qa',
270
- name: 'QA Testing',
271
- workDir: 'work/qa',
272
- tasks: ['Unit tests', 'Integration tests'],
273
- dependsOn: ['android']
274
- },
275
- {
276
- id: 'release',
277
- name: 'Release',
278
- workDir: 'work/release',
279
- tasks: ['Version tagging', 'Release notes'],
280
- dependsOn: ['qa']
281
- }
282
- ]
283
- };
284
- case 'fullstack':
285
- return {
286
- name: projectName,
287
- mission: 'Fullstack development',
288
- created: new Date().toISOString(),
289
- agents: [
290
- {
291
- id: 'backend',
292
- name: 'Backend Development',
293
- workDir: 'work/backend',
294
- tasks: ['API implementation', 'Database schema'],
295
- dependsOn: []
296
- },
297
- {
298
- id: 'frontend',
299
- name: 'Frontend Development',
300
- workDir: 'work/frontend',
301
- tasks: ['UI components', 'API integration'],
302
- dependsOn: ['backend']
303
- },
304
- {
305
- id: 'qa',
306
- name: 'QA Testing',
307
- workDir: 'work/qa',
308
- tasks: ['E2E tests', 'Performance tests'],
309
- dependsOn: ['frontend']
310
- }
311
- ]
312
- };
313
- default: // basic
314
- return {
315
- name: projectName,
316
- mission: 'Project mission (edit this)',
317
- created: new Date().toISOString(),
318
- agents: [
319
- {
320
- id: 'dev',
321
- name: 'Development',
322
- workDir: 'work/dev',
323
- tasks: ['Implement features'],
324
- dependsOn: []
325
- },
326
- {
327
- id: 'test',
328
- name: 'Testing',
329
- workDir: 'work/test',
330
- tasks: ['Write tests'],
331
- dependsOn: ['dev']
332
- }
333
- ]
334
- };
335
- }
336
- }
337
- function colorStatus(status) {
338
- switch (status) {
339
- case 'completed':
340
- return chalk_1.default.green(status);
341
- case 'running':
342
- return chalk_1.default.cyan(status);
343
- case 'failed':
344
- return chalk_1.default.red(status);
345
- case 'pending':
346
- return chalk_1.default.yellow(status);
347
- default:
348
- return chalk_1.default.gray(status);
349
- }
350
- }
@@ -1,73 +0,0 @@
1
- import { EventEmitter } from 'events';
2
- import { ProjectManager } from './manager';
3
- export interface ExecutorOptions {
4
- autoLaunchClaude?: boolean;
5
- claudeCommand?: string;
6
- relayUrl?: string;
7
- relayToken?: string;
8
- }
9
- export declare class WorkflowExecutor extends EventEmitter {
10
- private manager;
11
- private workflow;
12
- private running;
13
- private pollTimer;
14
- private options;
15
- private relayClient;
16
- constructor(manager: ProjectManager, options?: ExecutorOptions);
17
- /**
18
- * Start workflow execution
19
- */
20
- start(): Promise<void>;
21
- /**
22
- * Connect to relay server and register project
23
- */
24
- private connectToRelay;
25
- /**
26
- * Update relay with current agents list
27
- */
28
- private updateRelayAgents;
29
- /**
30
- * Start PM Agent tmux session
31
- */
32
- private startPMAgent;
33
- /**
34
- * Start a work agent
35
- */
36
- private startAgent;
37
- /**
38
- * Build task prompt for agent
39
- */
40
- private buildTaskPrompt;
41
- /**
42
- * Launch Claude Code CLI in a tmux session
43
- */
44
- private launchClaudeInSession;
45
- /**
46
- * Sleep helper
47
- */
48
- private sleep;
49
- /**
50
- * Main execution loop
51
- */
52
- private runExecutionLoop;
53
- /**
54
- * Stop workflow execution
55
- */
56
- stop(): void;
57
- /**
58
- * Kill all project tmux sessions
59
- */
60
- killAllSessions(): void;
61
- /**
62
- * Send keys to an agent session
63
- */
64
- sendToAgent(agentId: string, keys: string): boolean;
65
- /**
66
- * Capture agent terminal output
67
- */
68
- captureAgent(agentId: string): string | null;
69
- /**
70
- * List all agent sessions for this project
71
- */
72
- listSessions(): string[];
73
- }