sisyphi 0.1.0 → 0.1.1

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/README.md CHANGED
@@ -52,6 +52,16 @@ This gives you two commands:
52
52
  - `sisyphus` — the CLI for interacting with sessions
53
53
  - `sisyphusd` — the background daemon
54
54
 
55
+ ### Claude Code Plugin (optional)
56
+
57
+ The companion plugin on the [crouton-kit](https://github.com/CaptainCrouton89/crouton-kit) marketplace adds 11 specialized agent types and an orchestration skill with task breakdown patterns for common workflows (bug fixes, feature builds, refactors, reviews, etc.).
58
+
59
+ ```bash
60
+ claude plugins install CaptainCrouton89/crouton-kit sisyphus
61
+ ```
62
+
63
+ This makes `sisyphus:debug`, `sisyphus:implement`, `sisyphus:plan`, and other agent types available for `sisyphus spawn --agent-type`.
64
+
55
65
  ## Quick Start
56
66
 
57
67
  ### 1. Start the daemon
@@ -39,6 +39,9 @@ function reportsDir(cwd, sessionId) {
39
39
  function reportFilePath(cwd, sessionId, agentId, suffix) {
40
40
  return join(reportsDir(cwd, sessionId), `${agentId}-${suffix}.md`);
41
41
  }
42
+ function contextDir(cwd, sessionId) {
43
+ return join(sessionDir(cwd, sessionId), "context");
44
+ }
42
45
 
43
46
  export {
44
47
  globalDir,
@@ -51,6 +54,7 @@ export {
51
54
  sessionDir,
52
55
  statePath,
53
56
  reportsDir,
54
- reportFilePath
57
+ reportFilePath,
58
+ contextDir
55
59
  };
56
- //# sourceMappingURL=chunk-5WP7O7D3.js.map
60
+ //# sourceMappingURL=chunk-T6Z5F4SP.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shared/paths.ts"],"sourcesContent":["import { homedir } from 'node:os';\nimport { join } from 'node:path';\n\nexport function globalDir(): string {\n return join(homedir(), '.sisyphus');\n}\n\nexport function socketPath(): string {\n return join(globalDir(), 'daemon.sock');\n}\n\nexport function globalConfigPath(): string {\n return join(globalDir(), 'config.json');\n}\n\nexport function daemonLogPath(): string {\n return join(globalDir(), 'daemon.log');\n}\n\nexport function daemonPidPath(): string {\n return join(globalDir(), 'daemon.pid');\n}\n\nexport function projectDir(cwd: string): string {\n return join(cwd, '.sisyphus');\n}\n\nexport function projectConfigPath(cwd: string): string {\n return join(projectDir(cwd), 'config.json');\n}\n\nexport function projectOrchestratorPromptPath(cwd: string): string {\n return join(projectDir(cwd), 'orchestrator.md');\n}\n\nexport function sessionsDir(cwd: string): string {\n return join(projectDir(cwd), 'sessions');\n}\n\nexport function sessionDir(cwd: string, sessionId: string): string {\n return join(sessionsDir(cwd), sessionId);\n}\n\nexport function statePath(cwd: string, sessionId: string): string {\n return join(sessionDir(cwd, sessionId), 'state.json');\n}\n\nexport function reportsDir(cwd: string, sessionId: string): string {\n return join(sessionDir(cwd, sessionId), 'reports');\n}\n\nexport function reportFilePath(cwd: string, sessionId: string, agentId: string, suffix: string): string {\n return join(reportsDir(cwd, sessionId), `${agentId}-${suffix}.md`);\n}\n"],"mappings":";;;AAAA,SAAS,eAAe;AACxB,SAAS,YAAY;AAEd,SAAS,YAAoB;AAClC,SAAO,KAAK,QAAQ,GAAG,WAAW;AACpC;AAEO,SAAS,aAAqB;AACnC,SAAO,KAAK,UAAU,GAAG,aAAa;AACxC;AAEO,SAAS,mBAA2B;AACzC,SAAO,KAAK,UAAU,GAAG,aAAa;AACxC;AAMO,SAAS,gBAAwB;AACtC,SAAO,KAAK,UAAU,GAAG,YAAY;AACvC;AAEO,SAAS,WAAW,KAAqB;AAC9C,SAAO,KAAK,KAAK,WAAW;AAC9B;AAEO,SAAS,kBAAkB,KAAqB;AACrD,SAAO,KAAK,WAAW,GAAG,GAAG,aAAa;AAC5C;AAEO,SAAS,8BAA8B,KAAqB;AACjE,SAAO,KAAK,WAAW,GAAG,GAAG,iBAAiB;AAChD;AAEO,SAAS,YAAY,KAAqB;AAC/C,SAAO,KAAK,WAAW,GAAG,GAAG,UAAU;AACzC;AAEO,SAAS,WAAW,KAAa,WAA2B;AACjE,SAAO,KAAK,YAAY,GAAG,GAAG,SAAS;AACzC;AAEO,SAAS,UAAU,KAAa,WAA2B;AAChE,SAAO,KAAK,WAAW,KAAK,SAAS,GAAG,YAAY;AACtD;AAEO,SAAS,WAAW,KAAa,WAA2B;AACjE,SAAO,KAAK,WAAW,KAAK,SAAS,GAAG,SAAS;AACnD;AAEO,SAAS,eAAe,KAAa,WAAmB,SAAiB,QAAwB;AACtG,SAAO,KAAK,WAAW,KAAK,SAAS,GAAG,GAAG,OAAO,IAAI,MAAM,KAAK;AACnE;","names":[]}
1
+ {"version":3,"sources":["../src/shared/paths.ts"],"sourcesContent":["import { homedir } from 'node:os';\nimport { join } from 'node:path';\n\nexport function globalDir(): string {\n return join(homedir(), '.sisyphus');\n}\n\nexport function socketPath(): string {\n return join(globalDir(), 'daemon.sock');\n}\n\nexport function globalConfigPath(): string {\n return join(globalDir(), 'config.json');\n}\n\nexport function daemonLogPath(): string {\n return join(globalDir(), 'daemon.log');\n}\n\nexport function daemonPidPath(): string {\n return join(globalDir(), 'daemon.pid');\n}\n\nexport function projectDir(cwd: string): string {\n return join(cwd, '.sisyphus');\n}\n\nexport function projectConfigPath(cwd: string): string {\n return join(projectDir(cwd), 'config.json');\n}\n\nexport function projectOrchestratorPromptPath(cwd: string): string {\n return join(projectDir(cwd), 'orchestrator.md');\n}\n\nexport function sessionsDir(cwd: string): string {\n return join(projectDir(cwd), 'sessions');\n}\n\nexport function sessionDir(cwd: string, sessionId: string): string {\n return join(sessionsDir(cwd), sessionId);\n}\n\nexport function statePath(cwd: string, sessionId: string): string {\n return join(sessionDir(cwd, sessionId), 'state.json');\n}\n\nexport function reportsDir(cwd: string, sessionId: string): string {\n return join(sessionDir(cwd, sessionId), 'reports');\n}\n\nexport function reportFilePath(cwd: string, sessionId: string, agentId: string, suffix: string): string {\n return join(reportsDir(cwd, sessionId), `${agentId}-${suffix}.md`);\n}\n\nexport function contextDir(cwd: string, sessionId: string): string {\n return join(sessionDir(cwd, sessionId), 'context');\n}\n"],"mappings":";;;AAAA,SAAS,eAAe;AACxB,SAAS,YAAY;AAEd,SAAS,YAAoB;AAClC,SAAO,KAAK,QAAQ,GAAG,WAAW;AACpC;AAEO,SAAS,aAAqB;AACnC,SAAO,KAAK,UAAU,GAAG,aAAa;AACxC;AAEO,SAAS,mBAA2B;AACzC,SAAO,KAAK,UAAU,GAAG,aAAa;AACxC;AAMO,SAAS,gBAAwB;AACtC,SAAO,KAAK,UAAU,GAAG,YAAY;AACvC;AAEO,SAAS,WAAW,KAAqB;AAC9C,SAAO,KAAK,KAAK,WAAW;AAC9B;AAEO,SAAS,kBAAkB,KAAqB;AACrD,SAAO,KAAK,WAAW,GAAG,GAAG,aAAa;AAC5C;AAEO,SAAS,8BAA8B,KAAqB;AACjE,SAAO,KAAK,WAAW,GAAG,GAAG,iBAAiB;AAChD;AAEO,SAAS,YAAY,KAAqB;AAC/C,SAAO,KAAK,WAAW,GAAG,GAAG,UAAU;AACzC;AAEO,SAAS,WAAW,KAAa,WAA2B;AACjE,SAAO,KAAK,YAAY,GAAG,GAAG,SAAS;AACzC;AAEO,SAAS,UAAU,KAAa,WAA2B;AAChE,SAAO,KAAK,WAAW,KAAK,SAAS,GAAG,YAAY;AACtD;AAEO,SAAS,WAAW,KAAa,WAA2B;AACjE,SAAO,KAAK,WAAW,KAAK,SAAS,GAAG,SAAS;AACnD;AAEO,SAAS,eAAe,KAAa,WAAmB,SAAiB,QAAwB;AACtG,SAAO,KAAK,WAAW,KAAK,SAAS,GAAG,GAAG,OAAO,IAAI,MAAM,KAAK;AACnE;AAEO,SAAS,WAAW,KAAa,WAA2B;AACjE,SAAO,KAAK,WAAW,KAAK,SAAS,GAAG,SAAS;AACnD;","names":[]}
package/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  socketPath
4
- } from "./chunk-5WP7O7D3.js";
4
+ } from "./chunk-T6Z5F4SP.js";
5
5
 
6
6
  // src/cli/index.ts
7
7
  import { Command } from "commander";
@@ -156,13 +156,14 @@ function registerSubmit(program2) {
156
156
 
157
157
  // src/cli/commands/yield.ts
158
158
  function registerYield(program2) {
159
- program2.command("yield").description("Yield control back to daemon (orchestrator only)").action(async () => {
159
+ program2.command("yield").description("Yield control back to daemon (orchestrator only)").option("--prompt <text>", "Instructions for the next orchestrator cycle (or pipe via stdin)").action(async (opts) => {
160
160
  const sessionId = process.env.SISYPHUS_SESSION_ID;
161
161
  if (!sessionId) {
162
162
  console.error("Error: SISYPHUS_SESSION_ID environment variable not set");
163
163
  process.exit(1);
164
164
  }
165
- const request = { type: "yield", sessionId, agentId: "orchestrator" };
165
+ const nextPrompt = opts.prompt ?? await readStdin() ?? void 0;
166
+ const request = { type: "yield", sessionId, agentId: "orchestrator", nextPrompt };
166
167
  const response = await sendRequest(request);
167
168
  if (response.ok) {
168
169
  console.log("Yielded. Waiting for agents to complete.");
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/index.ts","../src/cli/commands/start.ts","../src/cli/client.ts","../src/cli/commands/spawn.ts","../src/cli/stdin.ts","../src/cli/commands/submit.ts","../src/cli/commands/yield.ts","../src/cli/commands/complete.ts","../src/cli/commands/status.ts","../src/cli/commands/tasks.ts","../src/cli/commands/list.ts","../src/cli/commands/report.ts","../src/cli/commands/resume.ts","../src/cli/commands/kill.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { registerStart } from './commands/start.js';\nimport { registerSpawn } from './commands/spawn.js';\nimport { registerSubmit } from './commands/submit.js';\nimport { registerYield } from './commands/yield.js';\nimport { registerComplete } from './commands/complete.js';\nimport { registerStatus } from './commands/status.js';\nimport { registerTasks } from './commands/tasks.js';\nimport { registerList } from './commands/list.js';\nimport { registerReport } from './commands/report.js';\nimport { registerResume } from './commands/resume.js';\nimport { registerKill } from './commands/kill.js';\n\nconst program = new Command();\n\nprogram\n .name('sisyphus')\n .description('tmux-integrated orchestration daemon for Claude Code')\n .version('0.1.0');\n\nregisterStart(program);\nregisterSpawn(program);\nregisterSubmit(program);\nregisterReport(program);\nregisterYield(program);\nregisterComplete(program);\nregisterStatus(program);\nregisterTasks(program);\nregisterList(program);\nregisterResume(program);\nregisterKill(program);\n\nprogram.parseAsync(process.argv).catch((err: Error) => {\n console.error(err.message);\n process.exit(1);\n});\n","import type { Command } from 'commander';\nimport { execSync } from 'node:child_process';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\n\nfunction getTmuxSession(): string {\n try {\n return execSync('tmux display-message -p \"#{session_name}\"', { encoding: 'utf8' }).trim();\n } catch {\n throw new Error('Not running inside tmux');\n }\n}\n\nfunction getTmuxWindow(): string {\n try {\n return execSync('tmux display-message -p \"#{window_id}\"', { encoding: 'utf8' }).trim();\n } catch {\n throw new Error('Not running inside tmux');\n }\n}\n\nexport function registerStart(program: Command): void {\n program\n .command('start')\n .description('Start a new sisyphus session')\n .argument('<task>', 'Task description for the orchestrator')\n .action(async (task: string) => {\n const tmuxSession = getTmuxSession();\n const tmuxWindow = getTmuxWindow();\n const request: Request = { type: 'start', task, cwd: process.cwd(), tmuxSession, tmuxWindow };\n const response = await sendRequest(request);\n if (response.ok) {\n const sessionId = response.data?.sessionId as string;\n console.log(`Session started: ${sessionId}`);\n if (response.data?.tmuxWindow) {\n console.log(`Orchestrator spawned in tmux window: ${response.data.tmuxWindow}`);\n }\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import { connect } from 'node:net';\nimport { socketPath } from '../shared/paths.js';\nimport type { Request, Response } from '../shared/protocol.js';\n\nexport async function sendRequest(request: Request): Promise<Response> {\n const sock = socketPath();\n\n return new Promise<Response>((resolve, reject) => {\n const socket = connect(sock);\n let data = '';\n\n const timeout = setTimeout(() => {\n socket.destroy();\n reject(new Error('Request timed out after 10s'));\n }, 10_000);\n\n socket.on('connect', () => {\n socket.write(JSON.stringify(request) + '\\n');\n });\n\n socket.on('data', (chunk) => {\n data += chunk.toString();\n const newlineIdx = data.indexOf('\\n');\n if (newlineIdx !== -1) {\n clearTimeout(timeout);\n const line = data.slice(0, newlineIdx);\n socket.destroy();\n try {\n resolve(JSON.parse(line) as Response);\n } catch {\n reject(new Error(`Invalid JSON response from daemon: ${line}`));\n }\n }\n });\n\n socket.on('error', (err) => {\n clearTimeout(timeout);\n if ((err as NodeJS.ErrnoException).code === 'ENOENT' || (err as NodeJS.ErrnoException).code === 'ECONNREFUSED') {\n reject(new Error(\n `Sisyphus daemon is not running.\\n` +\n ` Start it with: launchctl load ~/Library/LaunchAgents/com.sisyphus.daemon.plist\\n` +\n ` Or check logs at: ~/.sisyphus/daemon.log`\n ));\n } else {\n reject(err);\n }\n });\n });\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\n\nexport function registerSpawn(program: Command): void {\n program\n .command('spawn')\n .description('Spawn a new agent (orchestrator only)')\n .option('--agent-type <type>', 'Agent role label (default: worker)', 'worker')\n .requiredOption('--name <name>', 'Agent name')\n .requiredOption('--instruction <instruction>', 'Task instruction for the agent')\n .action(async (opts: { agentType: string; name: string; instruction: string }) => {\n const sessionId = process.env.SISYPHUS_SESSION_ID;\n if (!sessionId) {\n console.error('Error: SISYPHUS_SESSION_ID environment variable not set');\n process.exit(1);\n }\n\n const request: Request = {\n type: 'spawn',\n sessionId,\n agentType: opts.agentType,\n name: opts.name,\n instruction: opts.instruction,\n };\n const response = await sendRequest(request);\n if (response.ok) {\n const agentId = response.data?.agentId as string;\n console.log(`Agent spawned: ${agentId}`);\n console.log(\"Run `sisyphus yield` when done spawning agents.\");\n } else {\n console.error(`Error: ${response.error}`);\n if (response.error?.includes(\"Unknown session\")) console.error(\"Hint: run `sisyphus list` to see active sessions.\");\n process.exit(1);\n }\n });\n}\n","export function readStdin(): Promise<string | null> {\n if (process.stdin.isTTY) return Promise.resolve(null);\n\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n process.stdin.on('data', (chunk: Buffer) => chunks.push(chunk));\n process.stdin.on('end', () => {\n const text = Buffer.concat(chunks).toString('utf-8').trim();\n resolve(text || null);\n });\n process.stdin.on('error', reject);\n });\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport { readStdin } from '../stdin.js';\n\nexport function registerSubmit(program: Command): void {\n program\n .command('submit')\n .description('Submit work report and exit (agent only)')\n .option('--report <report>', 'Work report (or pipe via stdin)')\n .action(async (opts: { report?: string }) => {\n const sessionId = process.env.SISYPHUS_SESSION_ID;\n const agentId = process.env.SISYPHUS_AGENT_ID;\n if (!sessionId || !agentId) {\n console.error('Error: SISYPHUS_SESSION_ID and SISYPHUS_AGENT_ID environment variables must be set');\n process.exit(1);\n }\n\n const report = opts.report ?? await readStdin();\n if (!report) {\n console.error('Error: provide --report or pipe content via stdin');\n process.exit(1);\n }\n\n const request: Request = { type: 'submit', sessionId, agentId, report };\n const response = await sendRequest(request);\n if (response.ok) {\n console.log('Report submitted successfully');\n console.log('Your pane will close. The orchestrator resumes when all agents finish.');\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\n\nexport function registerYield(program: Command): void {\n program\n .command('yield')\n .description('Yield control back to daemon (orchestrator only)')\n .action(async () => {\n const sessionId = process.env.SISYPHUS_SESSION_ID;\n if (!sessionId) {\n console.error('Error: SISYPHUS_SESSION_ID environment variable not set');\n process.exit(1);\n }\n\n const request: Request = { type: 'yield', sessionId, agentId: 'orchestrator' };\n const response = await sendRequest(request);\n if (response.ok) {\n console.log('Yielded. Waiting for agents to complete.');\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\n\nexport function registerComplete(program: Command): void {\n program\n .command('complete')\n .description('Mark session as completed (orchestrator only)')\n .requiredOption('--report <report>', 'Final completion report')\n .action(async (opts: { report: string }) => {\n const sessionId = process.env.SISYPHUS_SESSION_ID;\n if (!sessionId) {\n console.error('Error: SISYPHUS_SESSION_ID environment variable not set');\n process.exit(1);\n }\n\n const request: Request = { type: 'complete', sessionId, report: opts.report };\n const response = await sendRequest(request);\n if (response.ok) {\n console.log('Session completed.');\n console.log('All panes will close.');\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport type { Session, Agent, Task, OrchestratorCycle } from '../../shared/types.js';\n\nconst STATUS_COLORS: Record<string, string> = {\n active: '\\x1b[32m', // green\n paused: '\\x1b[33m', // yellow\n completed: '\\x1b[36m', // cyan\n running: '\\x1b[32m', // green\n killed: '\\x1b[31m', // red\n crashed: '\\x1b[31m', // red\n lost: '\\x1b[90m', // gray\n draft: '\\x1b[2m', // dim\n pending: '\\x1b[90m', // gray\n in_progress: '\\x1b[33m', // yellow\n done: '\\x1b[32m', // green\n};\nconst RESET = '\\x1b[0m';\nconst BOLD = '\\x1b[1m';\nconst DIM = '\\x1b[2m';\n\nfunction colorize(text: string, status: string): string {\n const color = STATUS_COLORS[status] ?? '';\n return `${color}${text}${RESET}`;\n}\n\nfunction formatDuration(startIso: string, endIso?: string | null): string {\n const start = new Date(startIso).getTime();\n const end = endIso ? new Date(endIso).getTime() : Date.now();\n const totalSeconds = Math.floor((end - start) / 1000);\n if (totalSeconds < 0) return '0s';\n const hours = Math.floor(totalSeconds / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n const parts: string[] = [];\n if (hours > 0) parts.push(`${hours}h`);\n if (minutes > 0) parts.push(`${minutes}m`);\n parts.push(`${seconds}s`);\n return parts.join(' ');\n}\n\nfunction formatAgent(agent: Agent): string {\n const status = colorize(agent.status, agent.status);\n const name = `${BOLD}${agent.name}${RESET}`;\n const type = `${DIM}(${agent.agentType})${RESET}`;\n const duration = formatDuration(agent.spawnedAt, agent.completedAt);\n let line = ` ${agent.id} ${name} ${type} — ${status} ${DIM}(${duration})${RESET}`;\n if (agent.reports.length > 0) {\n for (const r of agent.reports) {\n const label = r.type === 'final' ? 'Final' : 'Update';\n line += `\\n ${label}: ${r.summary}`;\n }\n }\n if (agent.killedReason) {\n line += `\\n Reason: ${agent.killedReason}`;\n }\n return line;\n}\n\nfunction formatTask(task: Task): string {\n const status = colorize(task.status, task.status);\n return ` ${task.id}: ${task.description} [${status}]`;\n}\n\nfunction formatCycle(cycle: OrchestratorCycle): string {\n const duration = cycle.completedAt\n ? ` ${DIM}(${formatDuration(cycle.timestamp, cycle.completedAt)})${RESET}`\n : ` ${DIM}(running)${RESET}`;\n const agents = cycle.agentsSpawned.length > 0\n ? ` — agents: ${cycle.agentsSpawned.join(', ')}`\n : '';\n return ` Cycle ${cycle.cycle}${duration}${agents}`;\n}\n\nfunction printSession(session: Session): void {\n const status = colorize(session.status, session.status);\n const sessionDuration = formatDuration(session.createdAt, session.completedAt);\n console.log(`\\n${BOLD}Session: ${session.id}${RESET}`);\n console.log(` Status: ${status}`);\n console.log(` Task: ${session.task}`);\n console.log(` CWD: ${session.cwd}`);\n console.log(` Created: ${session.createdAt}`);\n console.log(` Duration: ${sessionDuration}${session.completedAt ? '' : ' (ongoing)'}`);\n console.log(` Orchestrator cycles: ${session.orchestratorCycles.length}`);\n\n if (session.orchestratorCycles.length > 0) {\n console.log(`\\n ${BOLD}Cycles:${RESET}`);\n for (const cycle of session.orchestratorCycles) {\n console.log(formatCycle(cycle));\n }\n }\n\n if (session.tasks.length > 0) {\n console.log(`\\n ${BOLD}Tasks:${RESET}`);\n for (const task of session.tasks) {\n console.log(formatTask(task));\n }\n }\n\n if (session.agents.length > 0) {\n console.log(`\\n ${BOLD}Agents:${RESET}`);\n for (const agent of session.agents) {\n console.log(formatAgent(agent));\n }\n }\n}\n\nexport function registerStatus(program: Command): void {\n program\n .command('status')\n .description('Show session status')\n .argument('[session-id]', 'Session ID (defaults to SISYPHUS_SESSION_ID env)')\n .action(async (sessionIdArg?: string) => {\n const sessionId = sessionIdArg ?? process.env.SISYPHUS_SESSION_ID;\n\n const request: Request = { type: 'status', sessionId };\n const response = await sendRequest(request);\n if (response.ok) {\n const session = response.data?.session as Session | undefined;\n if (session) {\n printSession(session);\n } else {\n console.log('No session found');\n }\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport type { Task } from '../../shared/types.js';\nimport { readStdin } from '../stdin.js';\n\nfunction getSessionId(): string {\n const sessionId = process.env.SISYPHUS_SESSION_ID;\n if (!sessionId) {\n console.error('Error: SISYPHUS_SESSION_ID environment variable not set');\n process.exit(1);\n }\n return sessionId;\n}\n\nconst STATUS_COLORS: Record<string, string> = {\n draft: '\\x1b[2m', // dim\n pending: '\\x1b[90m', // gray\n in_progress: '\\x1b[33m', // yellow\n done: '\\x1b[32m', // green\n};\nconst RESET = '\\x1b[0m';\n\nexport function registerTasks(program: Command): void {\n const tasks = program\n .command('tasks')\n .description('Manage session tasks');\n\n tasks\n .command('add')\n .description('Add a new task')\n .argument('[description]', 'Task description (or pipe via stdin)')\n .option('--status <status>', 'Initial status (draft|pending)', 'pending')\n .action(async (descriptionArg: string | undefined, opts: { status: string }) => {\n const description = descriptionArg ?? await readStdin();\n if (!description) {\n console.error('Error: provide a description argument or pipe via stdin');\n process.exit(1);\n }\n const sessionId = getSessionId();\n const request: Request = { type: 'tasks_add', sessionId, description, status: opts.status !== 'pending' ? opts.status : undefined };\n const response = await sendRequest(request);\n if (response.ok) {\n const taskId = response.data?.taskId as string;\n console.log(`Task added: ${taskId} [${opts.status}]`);\n } else {\n console.error(`Error: ${response.error}`);\n if (response.error?.includes(\"Unknown session\")) console.error(\"Hint: run `sisyphus list` to see active sessions.\");\n process.exit(1);\n }\n });\n\n tasks\n .command('update')\n .description('Update a task')\n .argument('<task-id>', 'Task ID (e.g. t1)')\n .option('--status <status>', 'New status (draft|pending|in_progress|done)')\n .option('--description <description>', 'New description')\n .action(async (taskId: string, opts: { status?: string; description?: string }) => {\n if (!opts.status && !opts.description) {\n console.error('Error: provide --status and/or --description');\n process.exit(1);\n }\n const sessionId = getSessionId();\n const request: Request = { type: 'tasks_update', sessionId, taskId, status: opts.status, description: opts.description };\n const response = await sendRequest(request);\n if (response.ok) {\n const parts: string[] = [];\n if (opts.status) parts.push(`status → ${opts.status}`);\n if (opts.description) parts.push(`description updated`);\n console.log(`Task ${taskId}: ${parts.join(', ')}`);\n } else {\n console.error(`Error: ${response.error}`);\n if (response.error?.includes(\"not found\")) console.error(\"Hint: run `sisyphus tasks list` to see current tasks.\");\n if (response.error?.includes(\"Unknown session\")) console.error(\"Hint: run `sisyphus list` to see active sessions.\");\n process.exit(1);\n }\n });\n\n tasks\n .command('list')\n .description('List all tasks')\n .action(async () => {\n const sessionId = getSessionId();\n const request: Request = { type: 'tasks_list', sessionId };\n const response = await sendRequest(request);\n if (response.ok) {\n const taskList = (response.data?.tasks ?? []) as Task[];\n if (taskList.length === 0) {\n console.log('No tasks');\n return;\n }\n for (const task of taskList) {\n const color = STATUS_COLORS[task.status] ?? '';\n console.log(` ${task.id}: ${task.description} [${color}${task.status}${RESET}]`);\n }\n } else {\n console.error(`Error: ${response.error}`);\n if (response.error?.includes(\"Unknown session\")) console.error(\"Hint: run `sisyphus list` to see active sessions.\");\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\n\ninterface SessionSummary {\n id: string;\n task: string;\n status: string;\n agentCount: number;\n createdAt: string;\n}\n\nconst STATUS_COLORS: Record<string, string> = {\n active: '\\x1b[32m',\n paused: '\\x1b[33m',\n completed: '\\x1b[36m',\n};\nconst RESET = '\\x1b[0m';\nconst BOLD = '\\x1b[1m';\nconst DIM = '\\x1b[2m';\n\nexport function registerList(program: Command): void {\n program\n .command('list')\n .description('List all sessions')\n .action(async () => {\n const request: Request = { type: 'list' };\n const response = await sendRequest(request);\n if (response.ok) {\n const sessions = (response.data?.sessions ?? []) as SessionSummary[];\n if (sessions.length === 0) {\n console.log('No sessions');\n return;\n }\n for (const s of sessions) {\n const color = STATUS_COLORS[s.status] ?? '';\n const status = `${color}${s.status}${RESET}`;\n const agents = `${DIM}${s.agentCount} agent(s)${RESET}`;\n console.log(` ${BOLD}${s.id}${RESET} ${status} ${agents} ${s.task}`);\n }\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport { readStdin } from '../stdin.js';\n\nexport function registerReport(program: Command): void {\n program\n .command('report')\n .description('Send a progress report without exiting (agent only)')\n .option('--message <message>', 'Progress report content')\n .action(async (opts: { message?: string }) => {\n const sessionId = process.env.SISYPHUS_SESSION_ID;\n const agentId = process.env.SISYPHUS_AGENT_ID;\n if (!sessionId || !agentId) {\n console.error('Error: SISYPHUS_SESSION_ID and SISYPHUS_AGENT_ID environment variables must be set');\n process.exit(1);\n }\n\n const content = opts.message ?? await readStdin();\n if (!content) {\n console.error('Error: provide --message or pipe content via stdin');\n process.exit(1);\n }\n\n const request: Request = { type: 'report', sessionId, agentId, content };\n const response = await sendRequest(request);\n if (response.ok) {\n console.log('Progress report recorded');\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { execSync } from 'node:child_process';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\n\nfunction getTmuxSession(): string {\n try {\n return execSync('tmux display-message -p \"#{session_name}\"', { encoding: 'utf8' }).trim();\n } catch {\n throw new Error('Not running inside tmux');\n }\n}\n\nfunction getTmuxWindow(): string {\n try {\n return execSync('tmux display-message -p \"#{window_id}\"', { encoding: 'utf8' }).trim();\n } catch {\n throw new Error('Not running inside tmux');\n }\n}\n\nexport function registerResume(program: Command): void {\n program\n .command('resume')\n .description('Resume a paused session')\n .argument('<session-id>', 'Session ID to resume')\n .argument('[message]', 'Additional instructions for the orchestrator')\n .action(async (sessionId: string, message?: string) => {\n const tmuxSession = getTmuxSession();\n const tmuxWindow = getTmuxWindow();\n const cwd = process.cwd();\n const request: Request = { type: 'resume', sessionId, cwd, tmuxSession, tmuxWindow, message };\n const response = await sendRequest(request);\n if (response.ok) {\n console.log(`Session ${sessionId} resumed`);\n if (response.data?.tmuxWindow) {\n console.log(`Orchestrator respawned in tmux window: ${response.data.tmuxWindow}`);\n }\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\n\nexport function registerKill(program: Command): void {\n program\n .command('kill <sessionId>')\n .description('Kill a running session and all its agents')\n .action(async (sessionId: string) => {\n const request: Request = { type: 'kill', sessionId };\n const response = await sendRequest(request);\n if (response.ok) {\n console.log(`Session ${sessionId} killed.`);\n if (response.data) {\n const { killedAgents } = response.data as { killedAgents: number };\n console.log(`Cleaned up: ${killedAgents} agent(s) killed, tmux window removed.`);\n }\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n"],"mappings":"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","names":["program","program","program","program","program","program","STATUS_COLORS","RESET","program","STATUS_COLORS","RESET","BOLD","DIM","program","program","execSync","getTmuxSession","execSync","getTmuxWindow","program","program"]}
1
+ {"version":3,"sources":["../src/cli/index.ts","../src/cli/commands/start.ts","../src/cli/client.ts","../src/cli/commands/spawn.ts","../src/cli/stdin.ts","../src/cli/commands/submit.ts","../src/cli/commands/yield.ts","../src/cli/commands/complete.ts","../src/cli/commands/status.ts","../src/cli/commands/tasks.ts","../src/cli/commands/list.ts","../src/cli/commands/report.ts","../src/cli/commands/resume.ts","../src/cli/commands/kill.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { registerStart } from './commands/start.js';\nimport { registerSpawn } from './commands/spawn.js';\nimport { registerSubmit } from './commands/submit.js';\nimport { registerYield } from './commands/yield.js';\nimport { registerComplete } from './commands/complete.js';\nimport { registerStatus } from './commands/status.js';\nimport { registerTasks } from './commands/tasks.js';\nimport { registerList } from './commands/list.js';\nimport { registerReport } from './commands/report.js';\nimport { registerResume } from './commands/resume.js';\nimport { registerKill } from './commands/kill.js';\n\nconst program = new Command();\n\nprogram\n .name('sisyphus')\n .description('tmux-integrated orchestration daemon for Claude Code')\n .version('0.1.0');\n\nregisterStart(program);\nregisterSpawn(program);\nregisterSubmit(program);\nregisterReport(program);\nregisterYield(program);\nregisterComplete(program);\nregisterStatus(program);\nregisterTasks(program);\nregisterList(program);\nregisterResume(program);\nregisterKill(program);\n\nprogram.parseAsync(process.argv).catch((err: Error) => {\n console.error(err.message);\n process.exit(1);\n});\n","import type { Command } from 'commander';\nimport { execSync } from 'node:child_process';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\n\nfunction getTmuxSession(): string {\n try {\n return execSync('tmux display-message -p \"#{session_name}\"', { encoding: 'utf8' }).trim();\n } catch {\n throw new Error('Not running inside tmux');\n }\n}\n\nfunction getTmuxWindow(): string {\n try {\n return execSync('tmux display-message -p \"#{window_id}\"', { encoding: 'utf8' }).trim();\n } catch {\n throw new Error('Not running inside tmux');\n }\n}\n\nexport function registerStart(program: Command): void {\n program\n .command('start')\n .description('Start a new sisyphus session')\n .argument('<task>', 'Task description for the orchestrator')\n .action(async (task: string) => {\n const tmuxSession = getTmuxSession();\n const tmuxWindow = getTmuxWindow();\n const request: Request = { type: 'start', task, cwd: process.cwd(), tmuxSession, tmuxWindow };\n const response = await sendRequest(request);\n if (response.ok) {\n const sessionId = response.data?.sessionId as string;\n console.log(`Session started: ${sessionId}`);\n if (response.data?.tmuxWindow) {\n console.log(`Orchestrator spawned in tmux window: ${response.data.tmuxWindow}`);\n }\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import { connect } from 'node:net';\nimport { socketPath } from '../shared/paths.js';\nimport type { Request, Response } from '../shared/protocol.js';\n\nexport async function sendRequest(request: Request): Promise<Response> {\n const sock = socketPath();\n\n return new Promise<Response>((resolve, reject) => {\n const socket = connect(sock);\n let data = '';\n\n const timeout = setTimeout(() => {\n socket.destroy();\n reject(new Error('Request timed out after 10s'));\n }, 10_000);\n\n socket.on('connect', () => {\n socket.write(JSON.stringify(request) + '\\n');\n });\n\n socket.on('data', (chunk) => {\n data += chunk.toString();\n const newlineIdx = data.indexOf('\\n');\n if (newlineIdx !== -1) {\n clearTimeout(timeout);\n const line = data.slice(0, newlineIdx);\n socket.destroy();\n try {\n resolve(JSON.parse(line) as Response);\n } catch {\n reject(new Error(`Invalid JSON response from daemon: ${line}`));\n }\n }\n });\n\n socket.on('error', (err) => {\n clearTimeout(timeout);\n if ((err as NodeJS.ErrnoException).code === 'ENOENT' || (err as NodeJS.ErrnoException).code === 'ECONNREFUSED') {\n reject(new Error(\n `Sisyphus daemon is not running.\\n` +\n ` Start it with: launchctl load ~/Library/LaunchAgents/com.sisyphus.daemon.plist\\n` +\n ` Or check logs at: ~/.sisyphus/daemon.log`\n ));\n } else {\n reject(err);\n }\n });\n });\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\n\nexport function registerSpawn(program: Command): void {\n program\n .command('spawn')\n .description('Spawn a new agent (orchestrator only)')\n .option('--agent-type <type>', 'Agent role label (default: worker)', 'worker')\n .requiredOption('--name <name>', 'Agent name')\n .requiredOption('--instruction <instruction>', 'Task instruction for the agent')\n .action(async (opts: { agentType: string; name: string; instruction: string }) => {\n const sessionId = process.env.SISYPHUS_SESSION_ID;\n if (!sessionId) {\n console.error('Error: SISYPHUS_SESSION_ID environment variable not set');\n process.exit(1);\n }\n\n const request: Request = {\n type: 'spawn',\n sessionId,\n agentType: opts.agentType,\n name: opts.name,\n instruction: opts.instruction,\n };\n const response = await sendRequest(request);\n if (response.ok) {\n const agentId = response.data?.agentId as string;\n console.log(`Agent spawned: ${agentId}`);\n console.log(\"Run `sisyphus yield` when done spawning agents.\");\n } else {\n console.error(`Error: ${response.error}`);\n if (response.error?.includes(\"Unknown session\")) console.error(\"Hint: run `sisyphus list` to see active sessions.\");\n process.exit(1);\n }\n });\n}\n","export function readStdin(): Promise<string | null> {\n if (process.stdin.isTTY) return Promise.resolve(null);\n\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n process.stdin.on('data', (chunk: Buffer) => chunks.push(chunk));\n process.stdin.on('end', () => {\n const text = Buffer.concat(chunks).toString('utf-8').trim();\n resolve(text || null);\n });\n process.stdin.on('error', reject);\n });\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport { readStdin } from '../stdin.js';\n\nexport function registerSubmit(program: Command): void {\n program\n .command('submit')\n .description('Submit work report and exit (agent only)')\n .option('--report <report>', 'Work report (or pipe via stdin)')\n .action(async (opts: { report?: string }) => {\n const sessionId = process.env.SISYPHUS_SESSION_ID;\n const agentId = process.env.SISYPHUS_AGENT_ID;\n if (!sessionId || !agentId) {\n console.error('Error: SISYPHUS_SESSION_ID and SISYPHUS_AGENT_ID environment variables must be set');\n process.exit(1);\n }\n\n const report = opts.report ?? await readStdin();\n if (!report) {\n console.error('Error: provide --report or pipe content via stdin');\n process.exit(1);\n }\n\n const request: Request = { type: 'submit', sessionId, agentId, report };\n const response = await sendRequest(request);\n if (response.ok) {\n console.log('Report submitted successfully');\n console.log('Your pane will close. The orchestrator resumes when all agents finish.');\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport { readStdin } from '../stdin.js';\n\nexport function registerYield(program: Command): void {\n program\n .command('yield')\n .description('Yield control back to daemon (orchestrator only)')\n .option('--prompt <text>', 'Instructions for the next orchestrator cycle (or pipe via stdin)')\n .action(async (opts: { prompt?: string }) => {\n const sessionId = process.env.SISYPHUS_SESSION_ID;\n if (!sessionId) {\n console.error('Error: SISYPHUS_SESSION_ID environment variable not set');\n process.exit(1);\n }\n\n const nextPrompt = opts.prompt ?? await readStdin() ?? undefined;\n\n const request: Request = { type: 'yield', sessionId, agentId: 'orchestrator', nextPrompt };\n const response = await sendRequest(request);\n if (response.ok) {\n console.log('Yielded. Waiting for agents to complete.');\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\n\nexport function registerComplete(program: Command): void {\n program\n .command('complete')\n .description('Mark session as completed (orchestrator only)')\n .requiredOption('--report <report>', 'Final completion report')\n .action(async (opts: { report: string }) => {\n const sessionId = process.env.SISYPHUS_SESSION_ID;\n if (!sessionId) {\n console.error('Error: SISYPHUS_SESSION_ID environment variable not set');\n process.exit(1);\n }\n\n const request: Request = { type: 'complete', sessionId, report: opts.report };\n const response = await sendRequest(request);\n if (response.ok) {\n console.log('Session completed.');\n console.log('All panes will close.');\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport type { Session, Agent, Task, OrchestratorCycle } from '../../shared/types.js';\n\nconst STATUS_COLORS: Record<string, string> = {\n active: '\\x1b[32m', // green\n paused: '\\x1b[33m', // yellow\n completed: '\\x1b[36m', // cyan\n running: '\\x1b[32m', // green\n killed: '\\x1b[31m', // red\n crashed: '\\x1b[31m', // red\n lost: '\\x1b[90m', // gray\n draft: '\\x1b[2m', // dim\n pending: '\\x1b[90m', // gray\n in_progress: '\\x1b[33m', // yellow\n done: '\\x1b[32m', // green\n};\nconst RESET = '\\x1b[0m';\nconst BOLD = '\\x1b[1m';\nconst DIM = '\\x1b[2m';\n\nfunction colorize(text: string, status: string): string {\n const color = STATUS_COLORS[status] ?? '';\n return `${color}${text}${RESET}`;\n}\n\nfunction formatDuration(startIso: string, endIso?: string | null): string {\n const start = new Date(startIso).getTime();\n const end = endIso ? new Date(endIso).getTime() : Date.now();\n const totalSeconds = Math.floor((end - start) / 1000);\n if (totalSeconds < 0) return '0s';\n const hours = Math.floor(totalSeconds / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n const parts: string[] = [];\n if (hours > 0) parts.push(`${hours}h`);\n if (minutes > 0) parts.push(`${minutes}m`);\n parts.push(`${seconds}s`);\n return parts.join(' ');\n}\n\nfunction formatAgent(agent: Agent): string {\n const status = colorize(agent.status, agent.status);\n const name = `${BOLD}${agent.name}${RESET}`;\n const type = `${DIM}(${agent.agentType})${RESET}`;\n const duration = formatDuration(agent.spawnedAt, agent.completedAt);\n let line = ` ${agent.id} ${name} ${type} — ${status} ${DIM}(${duration})${RESET}`;\n if (agent.reports.length > 0) {\n for (const r of agent.reports) {\n const label = r.type === 'final' ? 'Final' : 'Update';\n line += `\\n ${label}: ${r.summary}`;\n }\n }\n if (agent.killedReason) {\n line += `\\n Reason: ${agent.killedReason}`;\n }\n return line;\n}\n\nfunction formatTask(task: Task): string {\n const status = colorize(task.status, task.status);\n return ` ${task.id}: ${task.description} [${status}]`;\n}\n\nfunction formatCycle(cycle: OrchestratorCycle): string {\n const duration = cycle.completedAt\n ? ` ${DIM}(${formatDuration(cycle.timestamp, cycle.completedAt)})${RESET}`\n : ` ${DIM}(running)${RESET}`;\n const agents = cycle.agentsSpawned.length > 0\n ? ` — agents: ${cycle.agentsSpawned.join(', ')}`\n : '';\n return ` Cycle ${cycle.cycle}${duration}${agents}`;\n}\n\nfunction printSession(session: Session): void {\n const status = colorize(session.status, session.status);\n const sessionDuration = formatDuration(session.createdAt, session.completedAt);\n console.log(`\\n${BOLD}Session: ${session.id}${RESET}`);\n console.log(` Status: ${status}`);\n console.log(` Task: ${session.task}`);\n console.log(` CWD: ${session.cwd}`);\n console.log(` Created: ${session.createdAt}`);\n console.log(` Duration: ${sessionDuration}${session.completedAt ? '' : ' (ongoing)'}`);\n console.log(` Orchestrator cycles: ${session.orchestratorCycles.length}`);\n\n if (session.orchestratorCycles.length > 0) {\n console.log(`\\n ${BOLD}Cycles:${RESET}`);\n for (const cycle of session.orchestratorCycles) {\n console.log(formatCycle(cycle));\n }\n }\n\n if (session.tasks.length > 0) {\n console.log(`\\n ${BOLD}Tasks:${RESET}`);\n for (const task of session.tasks) {\n console.log(formatTask(task));\n }\n }\n\n if (session.agents.length > 0) {\n console.log(`\\n ${BOLD}Agents:${RESET}`);\n for (const agent of session.agents) {\n console.log(formatAgent(agent));\n }\n }\n}\n\nexport function registerStatus(program: Command): void {\n program\n .command('status')\n .description('Show session status')\n .argument('[session-id]', 'Session ID (defaults to SISYPHUS_SESSION_ID env)')\n .action(async (sessionIdArg?: string) => {\n const sessionId = sessionIdArg ?? process.env.SISYPHUS_SESSION_ID;\n\n const request: Request = { type: 'status', sessionId };\n const response = await sendRequest(request);\n if (response.ok) {\n const session = response.data?.session as Session | undefined;\n if (session) {\n printSession(session);\n } else {\n console.log('No session found');\n }\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport type { Task } from '../../shared/types.js';\nimport { readStdin } from '../stdin.js';\n\nfunction getSessionId(): string {\n const sessionId = process.env.SISYPHUS_SESSION_ID;\n if (!sessionId) {\n console.error('Error: SISYPHUS_SESSION_ID environment variable not set');\n process.exit(1);\n }\n return sessionId;\n}\n\nconst STATUS_COLORS: Record<string, string> = {\n draft: '\\x1b[2m', // dim\n pending: '\\x1b[90m', // gray\n in_progress: '\\x1b[33m', // yellow\n done: '\\x1b[32m', // green\n};\nconst RESET = '\\x1b[0m';\n\nexport function registerTasks(program: Command): void {\n const tasks = program\n .command('tasks')\n .description('Manage session tasks');\n\n tasks\n .command('add')\n .description('Add a new task')\n .argument('[description]', 'Task description (or pipe via stdin)')\n .option('--status <status>', 'Initial status (draft|pending)', 'pending')\n .action(async (descriptionArg: string | undefined, opts: { status: string }) => {\n const description = descriptionArg ?? await readStdin();\n if (!description) {\n console.error('Error: provide a description argument or pipe via stdin');\n process.exit(1);\n }\n const sessionId = getSessionId();\n const request: Request = { type: 'tasks_add', sessionId, description, status: opts.status !== 'pending' ? opts.status : undefined };\n const response = await sendRequest(request);\n if (response.ok) {\n const taskId = response.data?.taskId as string;\n console.log(`Task added: ${taskId} [${opts.status}]`);\n } else {\n console.error(`Error: ${response.error}`);\n if (response.error?.includes(\"Unknown session\")) console.error(\"Hint: run `sisyphus list` to see active sessions.\");\n process.exit(1);\n }\n });\n\n tasks\n .command('update')\n .description('Update a task')\n .argument('<task-id>', 'Task ID (e.g. t1)')\n .option('--status <status>', 'New status (draft|pending|in_progress|done)')\n .option('--description <description>', 'New description')\n .action(async (taskId: string, opts: { status?: string; description?: string }) => {\n if (!opts.status && !opts.description) {\n console.error('Error: provide --status and/or --description');\n process.exit(1);\n }\n const sessionId = getSessionId();\n const request: Request = { type: 'tasks_update', sessionId, taskId, status: opts.status, description: opts.description };\n const response = await sendRequest(request);\n if (response.ok) {\n const parts: string[] = [];\n if (opts.status) parts.push(`status → ${opts.status}`);\n if (opts.description) parts.push(`description updated`);\n console.log(`Task ${taskId}: ${parts.join(', ')}`);\n } else {\n console.error(`Error: ${response.error}`);\n if (response.error?.includes(\"not found\")) console.error(\"Hint: run `sisyphus tasks list` to see current tasks.\");\n if (response.error?.includes(\"Unknown session\")) console.error(\"Hint: run `sisyphus list` to see active sessions.\");\n process.exit(1);\n }\n });\n\n tasks\n .command('list')\n .description('List all tasks')\n .action(async () => {\n const sessionId = getSessionId();\n const request: Request = { type: 'tasks_list', sessionId };\n const response = await sendRequest(request);\n if (response.ok) {\n const taskList = (response.data?.tasks ?? []) as Task[];\n if (taskList.length === 0) {\n console.log('No tasks');\n return;\n }\n for (const task of taskList) {\n const color = STATUS_COLORS[task.status] ?? '';\n console.log(` ${task.id}: ${task.description} [${color}${task.status}${RESET}]`);\n }\n } else {\n console.error(`Error: ${response.error}`);\n if (response.error?.includes(\"Unknown session\")) console.error(\"Hint: run `sisyphus list` to see active sessions.\");\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\n\ninterface SessionSummary {\n id: string;\n task: string;\n status: string;\n agentCount: number;\n createdAt: string;\n}\n\nconst STATUS_COLORS: Record<string, string> = {\n active: '\\x1b[32m',\n paused: '\\x1b[33m',\n completed: '\\x1b[36m',\n};\nconst RESET = '\\x1b[0m';\nconst BOLD = '\\x1b[1m';\nconst DIM = '\\x1b[2m';\n\nexport function registerList(program: Command): void {\n program\n .command('list')\n .description('List all sessions')\n .action(async () => {\n const request: Request = { type: 'list' };\n const response = await sendRequest(request);\n if (response.ok) {\n const sessions = (response.data?.sessions ?? []) as SessionSummary[];\n if (sessions.length === 0) {\n console.log('No sessions');\n return;\n }\n for (const s of sessions) {\n const color = STATUS_COLORS[s.status] ?? '';\n const status = `${color}${s.status}${RESET}`;\n const agents = `${DIM}${s.agentCount} agent(s)${RESET}`;\n console.log(` ${BOLD}${s.id}${RESET} ${status} ${agents} ${s.task}`);\n }\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport { readStdin } from '../stdin.js';\n\nexport function registerReport(program: Command): void {\n program\n .command('report')\n .description('Send a progress report without exiting (agent only)')\n .option('--message <message>', 'Progress report content')\n .action(async (opts: { message?: string }) => {\n const sessionId = process.env.SISYPHUS_SESSION_ID;\n const agentId = process.env.SISYPHUS_AGENT_ID;\n if (!sessionId || !agentId) {\n console.error('Error: SISYPHUS_SESSION_ID and SISYPHUS_AGENT_ID environment variables must be set');\n process.exit(1);\n }\n\n const content = opts.message ?? await readStdin();\n if (!content) {\n console.error('Error: provide --message or pipe content via stdin');\n process.exit(1);\n }\n\n const request: Request = { type: 'report', sessionId, agentId, content };\n const response = await sendRequest(request);\n if (response.ok) {\n console.log('Progress report recorded');\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { execSync } from 'node:child_process';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\n\nfunction getTmuxSession(): string {\n try {\n return execSync('tmux display-message -p \"#{session_name}\"', { encoding: 'utf8' }).trim();\n } catch {\n throw new Error('Not running inside tmux');\n }\n}\n\nfunction getTmuxWindow(): string {\n try {\n return execSync('tmux display-message -p \"#{window_id}\"', { encoding: 'utf8' }).trim();\n } catch {\n throw new Error('Not running inside tmux');\n }\n}\n\nexport function registerResume(program: Command): void {\n program\n .command('resume')\n .description('Resume a paused session')\n .argument('<session-id>', 'Session ID to resume')\n .argument('[message]', 'Additional instructions for the orchestrator')\n .action(async (sessionId: string, message?: string) => {\n const tmuxSession = getTmuxSession();\n const tmuxWindow = getTmuxWindow();\n const cwd = process.cwd();\n const request: Request = { type: 'resume', sessionId, cwd, tmuxSession, tmuxWindow, message };\n const response = await sendRequest(request);\n if (response.ok) {\n console.log(`Session ${sessionId} resumed`);\n if (response.data?.tmuxWindow) {\n console.log(`Orchestrator respawned in tmux window: ${response.data.tmuxWindow}`);\n }\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\n\nexport function registerKill(program: Command): void {\n program\n .command('kill <sessionId>')\n .description('Kill a running session and all its agents')\n .action(async (sessionId: string) => {\n const request: Request = { type: 'kill', sessionId };\n const response = await sendRequest(request);\n if (response.ok) {\n console.log(`Session ${sessionId} killed.`);\n if (response.data) {\n const { killedAgents } = response.data as { killedAgents: number };\n console.log(`Cleaned up: ${killedAgents} agent(s) killed, tmux window removed.`);\n }\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n"],"mappings":";;;;;;AAAA,SAAS,eAAe;;;ACCxB,SAAS,gBAAgB;;;ACDzB,SAAS,eAAe;AAIxB,eAAsB,YAAY,SAAqC;AACrE,QAAM,OAAO,WAAW;AAExB,SAAO,IAAI,QAAkB,CAAC,SAAS,WAAW;AAChD,UAAM,SAAS,QAAQ,IAAI;AAC3B,QAAI,OAAO;AAEX,UAAM,UAAU,WAAW,MAAM;AAC/B,aAAO,QAAQ;AACf,aAAO,IAAI,MAAM,6BAA6B,CAAC;AAAA,IACjD,GAAG,GAAM;AAET,WAAO,GAAG,WAAW,MAAM;AACzB,aAAO,MAAM,KAAK,UAAU,OAAO,IAAI,IAAI;AAAA,IAC7C,CAAC;AAED,WAAO,GAAG,QAAQ,CAAC,UAAU;AAC3B,cAAQ,MAAM,SAAS;AACvB,YAAM,aAAa,KAAK,QAAQ,IAAI;AACpC,UAAI,eAAe,IAAI;AACrB,qBAAa,OAAO;AACpB,cAAM,OAAO,KAAK,MAAM,GAAG,UAAU;AACrC,eAAO,QAAQ;AACf,YAAI;AACF,kBAAQ,KAAK,MAAM,IAAI,CAAa;AAAA,QACtC,QAAQ;AACN,iBAAO,IAAI,MAAM,sCAAsC,IAAI,EAAE,CAAC;AAAA,QAChE;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO,GAAG,SAAS,CAAC,QAAQ;AAC1B,mBAAa,OAAO;AACpB,UAAK,IAA8B,SAAS,YAAa,IAA8B,SAAS,gBAAgB;AAC9G,eAAO,IAAI;AAAA,UACT;AAAA;AAAA;AAAA,QAGF,CAAC;AAAA,MACH,OAAO;AACL,eAAO,GAAG;AAAA,MACZ;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;;;AD3CA,SAAS,iBAAyB;AAChC,MAAI;AACF,WAAO,SAAS,6CAA6C,EAAE,UAAU,OAAO,CAAC,EAAE,KAAK;AAAA,EAC1F,QAAQ;AACN,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC3C;AACF;AAEA,SAAS,gBAAwB;AAC/B,MAAI;AACF,WAAO,SAAS,0CAA0C,EAAE,UAAU,OAAO,CAAC,EAAE,KAAK;AAAA,EACvF,QAAQ;AACN,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC3C;AACF;AAEO,SAAS,cAAcA,UAAwB;AACpD,EAAAA,SACG,QAAQ,OAAO,EACf,YAAY,8BAA8B,EAC1C,SAAS,UAAU,uCAAuC,EAC1D,OAAO,OAAO,SAAiB;AAC9B,UAAM,cAAc,eAAe;AACnC,UAAM,aAAa,cAAc;AACjC,UAAM,UAAmB,EAAE,MAAM,SAAS,MAAM,KAAK,QAAQ,IAAI,GAAG,aAAa,WAAW;AAC5F,UAAM,WAAW,MAAM,YAAY,OAAO;AAC1C,QAAI,SAAS,IAAI;AACf,YAAM,YAAY,SAAS,MAAM;AACjC,cAAQ,IAAI,oBAAoB,SAAS,EAAE;AAC3C,UAAI,SAAS,MAAM,YAAY;AAC7B,gBAAQ,IAAI,wCAAwC,SAAS,KAAK,UAAU,EAAE;AAAA,MAChF;AAAA,IACF,OAAO;AACL,cAAQ,MAAM,UAAU,SAAS,KAAK,EAAE;AACxC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;;;AEtCO,SAAS,cAAcC,UAAwB;AACpD,EAAAA,SACG,QAAQ,OAAO,EACf,YAAY,uCAAuC,EACnD,OAAO,uBAAuB,sCAAsC,QAAQ,EAC5E,eAAe,iBAAiB,YAAY,EAC5C,eAAe,+BAA+B,gCAAgC,EAC9E,OAAO,OAAO,SAAmE;AAChF,UAAM,YAAY,QAAQ,IAAI;AAC9B,QAAI,CAAC,WAAW;AACd,cAAQ,MAAM,yDAAyD;AACvE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,UAAmB;AAAA,MACvB,MAAM;AAAA,MACN;AAAA,MACA,WAAW,KAAK;AAAA,MAChB,MAAM,KAAK;AAAA,MACX,aAAa,KAAK;AAAA,IACpB;AACA,UAAM,WAAW,MAAM,YAAY,OAAO;AAC1C,QAAI,SAAS,IAAI;AACf,YAAM,UAAU,SAAS,MAAM;AAC/B,cAAQ,IAAI,kBAAkB,OAAO,EAAE;AACvC,cAAQ,IAAI,iDAAiD;AAAA,IAC/D,OAAO;AACL,cAAQ,MAAM,UAAU,SAAS,KAAK,EAAE;AACxC,UAAI,SAAS,OAAO,SAAS,iBAAiB,EAAG,SAAQ,MAAM,mDAAmD;AAClH,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;;;ACpCO,SAAS,YAAoC;AAClD,MAAI,QAAQ,MAAM,MAAO,QAAO,QAAQ,QAAQ,IAAI;AAEpD,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,SAAmB,CAAC;AAC1B,YAAQ,MAAM,GAAG,QAAQ,CAAC,UAAkB,OAAO,KAAK,KAAK,CAAC;AAC9D,YAAQ,MAAM,GAAG,OAAO,MAAM;AAC5B,YAAM,OAAO,OAAO,OAAO,MAAM,EAAE,SAAS,OAAO,EAAE,KAAK;AAC1D,cAAQ,QAAQ,IAAI;AAAA,IACtB,CAAC;AACD,YAAQ,MAAM,GAAG,SAAS,MAAM;AAAA,EAClC,CAAC;AACH;;;ACPO,SAAS,eAAeC,UAAwB;AACrD,EAAAA,SACG,QAAQ,QAAQ,EAChB,YAAY,0CAA0C,EACtD,OAAO,qBAAqB,iCAAiC,EAC7D,OAAO,OAAO,SAA8B;AAC3C,UAAM,YAAY,QAAQ,IAAI;AAC9B,UAAM,UAAU,QAAQ,IAAI;AAC5B,QAAI,CAAC,aAAa,CAAC,SAAS;AAC1B,cAAQ,MAAM,oFAAoF;AAClG,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,SAAS,KAAK,UAAU,MAAM,UAAU;AAC9C,QAAI,CAAC,QAAQ;AACX,cAAQ,MAAM,mDAAmD;AACjE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,UAAmB,EAAE,MAAM,UAAU,WAAW,SAAS,OAAO;AACtE,UAAM,WAAW,MAAM,YAAY,OAAO;AAC1C,QAAI,SAAS,IAAI;AACf,cAAQ,IAAI,+BAA+B;AAC3C,cAAQ,IAAI,wEAAwE;AAAA,IACtF,OAAO;AACL,cAAQ,MAAM,UAAU,SAAS,KAAK,EAAE;AACxC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;;;AC7BO,SAAS,cAAcC,UAAwB;AACpD,EAAAA,SACG,QAAQ,OAAO,EACf,YAAY,kDAAkD,EAC9D,OAAO,mBAAmB,kEAAkE,EAC5F,OAAO,OAAO,SAA8B;AAC3C,UAAM,YAAY,QAAQ,IAAI;AAC9B,QAAI,CAAC,WAAW;AACd,cAAQ,MAAM,yDAAyD;AACvE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,aAAa,KAAK,UAAU,MAAM,UAAU,KAAK;AAEvD,UAAM,UAAmB,EAAE,MAAM,SAAS,WAAW,SAAS,gBAAgB,WAAW;AACzF,UAAM,WAAW,MAAM,YAAY,OAAO;AAC1C,QAAI,SAAS,IAAI;AACf,cAAQ,IAAI,0CAA0C;AAAA,IACxD,OAAO;AACL,cAAQ,MAAM,UAAU,SAAS,KAAK,EAAE;AACxC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;;;ACxBO,SAAS,iBAAiBC,UAAwB;AACvD,EAAAA,SACG,QAAQ,UAAU,EAClB,YAAY,+CAA+C,EAC3D,eAAe,qBAAqB,yBAAyB,EAC7D,OAAO,OAAO,SAA6B;AAC1C,UAAM,YAAY,QAAQ,IAAI;AAC9B,QAAI,CAAC,WAAW;AACd,cAAQ,MAAM,yDAAyD;AACvE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,UAAmB,EAAE,MAAM,YAAY,WAAW,QAAQ,KAAK,OAAO;AAC5E,UAAM,WAAW,MAAM,YAAY,OAAO;AAC1C,QAAI,SAAS,IAAI;AACf,cAAQ,IAAI,oBAAoB;AAChC,cAAQ,IAAI,uBAAuB;AAAA,IACrC,OAAO;AACL,cAAQ,MAAM,UAAU,SAAS,KAAK,EAAE;AACxC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;;;ACrBA,IAAM,gBAAwC;AAAA,EAC5C,QAAQ;AAAA;AAAA,EACR,QAAQ;AAAA;AAAA,EACR,WAAW;AAAA;AAAA,EACX,SAAS;AAAA;AAAA,EACT,QAAQ;AAAA;AAAA,EACR,SAAS;AAAA;AAAA,EACT,MAAM;AAAA;AAAA,EACN,OAAO;AAAA;AAAA,EACP,SAAS;AAAA;AAAA,EACT,aAAa;AAAA;AAAA,EACb,MAAM;AAAA;AACR;AACA,IAAM,QAAQ;AACd,IAAM,OAAO;AACb,IAAM,MAAM;AAEZ,SAAS,SAAS,MAAc,QAAwB;AACtD,QAAM,QAAQ,cAAc,MAAM,KAAK;AACvC,SAAO,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK;AAChC;AAEA,SAAS,eAAe,UAAkB,QAAgC;AACxE,QAAM,QAAQ,IAAI,KAAK,QAAQ,EAAE,QAAQ;AACzC,QAAM,MAAM,SAAS,IAAI,KAAK,MAAM,EAAE,QAAQ,IAAI,KAAK,IAAI;AAC3D,QAAM,eAAe,KAAK,OAAO,MAAM,SAAS,GAAI;AACpD,MAAI,eAAe,EAAG,QAAO;AAC7B,QAAM,QAAQ,KAAK,MAAM,eAAe,IAAI;AAC5C,QAAM,UAAU,KAAK,MAAO,eAAe,OAAQ,EAAE;AACrD,QAAM,UAAU,eAAe;AAC/B,QAAM,QAAkB,CAAC;AACzB,MAAI,QAAQ,EAAG,OAAM,KAAK,GAAG,KAAK,GAAG;AACrC,MAAI,UAAU,EAAG,OAAM,KAAK,GAAG,OAAO,GAAG;AACzC,QAAM,KAAK,GAAG,OAAO,GAAG;AACxB,SAAO,MAAM,KAAK,GAAG;AACvB;AAEA,SAAS,YAAY,OAAsB;AACzC,QAAM,SAAS,SAAS,MAAM,QAAQ,MAAM,MAAM;AAClD,QAAM,OAAO,GAAG,IAAI,GAAG,MAAM,IAAI,GAAG,KAAK;AACzC,QAAM,OAAO,GAAG,GAAG,IAAI,MAAM,SAAS,IAAI,KAAK;AAC/C,QAAM,WAAW,eAAe,MAAM,WAAW,MAAM,WAAW;AAClE,MAAI,OAAO,OAAO,MAAM,EAAE,IAAI,IAAI,IAAI,IAAI,WAAM,MAAM,IAAI,GAAG,IAAI,QAAQ,IAAI,KAAK;AAClF,MAAI,MAAM,QAAQ,SAAS,GAAG;AAC5B,eAAW,KAAK,MAAM,SAAS;AAC7B,YAAM,QAAQ,EAAE,SAAS,UAAU,UAAU;AAC7C,cAAQ;AAAA,QAAW,KAAK,KAAK,EAAE,OAAO;AAAA,IACxC;AAAA,EACF;AACA,MAAI,MAAM,cAAc;AACtB,YAAQ;AAAA,gBAAmB,MAAM,YAAY;AAAA,EAC/C;AACA,SAAO;AACT;AAEA,SAAS,WAAW,MAAoB;AACtC,QAAM,SAAS,SAAS,KAAK,QAAQ,KAAK,MAAM;AAChD,SAAO,OAAO,KAAK,EAAE,KAAK,KAAK,WAAW,KAAK,MAAM;AACvD;AAEA,SAAS,YAAY,OAAkC;AACrD,QAAM,WAAW,MAAM,cACnB,IAAI,GAAG,IAAI,eAAe,MAAM,WAAW,MAAM,WAAW,CAAC,IAAI,KAAK,KACtE,IAAI,GAAG,YAAY,KAAK;AAC5B,QAAM,SAAS,MAAM,cAAc,SAAS,IACxC,mBAAc,MAAM,cAAc,KAAK,IAAI,CAAC,KAC5C;AACJ,SAAO,aAAa,MAAM,KAAK,GAAG,QAAQ,GAAG,MAAM;AACrD;AAEA,SAAS,aAAa,SAAwB;AAC5C,QAAM,SAAS,SAAS,QAAQ,QAAQ,QAAQ,MAAM;AACtD,QAAM,kBAAkB,eAAe,QAAQ,WAAW,QAAQ,WAAW;AAC7E,UAAQ,IAAI;AAAA,EAAK,IAAI,YAAY,QAAQ,EAAE,GAAG,KAAK,EAAE;AACrD,UAAQ,IAAI,aAAa,MAAM,EAAE;AACjC,UAAQ,IAAI,WAAW,QAAQ,IAAI,EAAE;AACrC,UAAQ,IAAI,UAAU,QAAQ,GAAG,EAAE;AACnC,UAAQ,IAAI,cAAc,QAAQ,SAAS,EAAE;AAC7C,UAAQ,IAAI,eAAe,eAAe,GAAG,QAAQ,cAAc,KAAK,YAAY,EAAE;AACtF,UAAQ,IAAI,0BAA0B,QAAQ,mBAAmB,MAAM,EAAE;AAEzE,MAAI,QAAQ,mBAAmB,SAAS,GAAG;AACzC,YAAQ,IAAI;AAAA,IAAO,IAAI,UAAU,KAAK,EAAE;AACxC,eAAW,SAAS,QAAQ,oBAAoB;AAC9C,cAAQ,IAAI,YAAY,KAAK,CAAC;AAAA,IAChC;AAAA,EACF;AAEA,MAAI,QAAQ,MAAM,SAAS,GAAG;AAC5B,YAAQ,IAAI;AAAA,IAAO,IAAI,SAAS,KAAK,EAAE;AACvC,eAAW,QAAQ,QAAQ,OAAO;AAChC,cAAQ,IAAI,WAAW,IAAI,CAAC;AAAA,IAC9B;AAAA,EACF;AAEA,MAAI,QAAQ,OAAO,SAAS,GAAG;AAC7B,YAAQ,IAAI;AAAA,IAAO,IAAI,UAAU,KAAK,EAAE;AACxC,eAAW,SAAS,QAAQ,QAAQ;AAClC,cAAQ,IAAI,YAAY,KAAK,CAAC;AAAA,IAChC;AAAA,EACF;AACF;AAEO,SAAS,eAAeC,UAAwB;AACrD,EAAAA,SACG,QAAQ,QAAQ,EAChB,YAAY,qBAAqB,EACjC,SAAS,gBAAgB,kDAAkD,EAC3E,OAAO,OAAO,iBAA0B;AACvC,UAAM,YAAY,gBAAgB,QAAQ,IAAI;AAE9C,UAAM,UAAmB,EAAE,MAAM,UAAU,UAAU;AACrD,UAAM,WAAW,MAAM,YAAY,OAAO;AAC1C,QAAI,SAAS,IAAI;AACf,YAAM,UAAU,SAAS,MAAM;AAC/B,UAAI,SAAS;AACX,qBAAa,OAAO;AAAA,MACtB,OAAO;AACL,gBAAQ,IAAI,kBAAkB;AAAA,MAChC;AAAA,IACF,OAAO;AACL,cAAQ,MAAM,UAAU,SAAS,KAAK,EAAE;AACxC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;;;AC5HA,SAAS,eAAuB;AAC9B,QAAM,YAAY,QAAQ,IAAI;AAC9B,MAAI,CAAC,WAAW;AACd,YAAQ,MAAM,yDAAyD;AACvE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,SAAO;AACT;AAEA,IAAMC,iBAAwC;AAAA,EAC5C,OAAO;AAAA;AAAA,EACP,SAAS;AAAA;AAAA,EACT,aAAa;AAAA;AAAA,EACb,MAAM;AAAA;AACR;AACA,IAAMC,SAAQ;AAEP,SAAS,cAAcC,UAAwB;AACpD,QAAM,QAAQA,SACX,QAAQ,OAAO,EACf,YAAY,sBAAsB;AAErC,QACG,QAAQ,KAAK,EACb,YAAY,gBAAgB,EAC5B,SAAS,iBAAiB,sCAAsC,EAChE,OAAO,qBAAqB,kCAAkC,SAAS,EACvE,OAAO,OAAO,gBAAoC,SAA6B;AAC9E,UAAM,cAAc,kBAAkB,MAAM,UAAU;AACtD,QAAI,CAAC,aAAa;AAChB,cAAQ,MAAM,yDAAyD;AACvE,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,UAAM,YAAY,aAAa;AAC/B,UAAM,UAAmB,EAAE,MAAM,aAAa,WAAW,aAAa,QAAQ,KAAK,WAAW,YAAY,KAAK,SAAS,OAAU;AAClI,UAAM,WAAW,MAAM,YAAY,OAAO;AAC1C,QAAI,SAAS,IAAI;AACf,YAAM,SAAS,SAAS,MAAM;AAC9B,cAAQ,IAAI,eAAe,MAAM,KAAK,KAAK,MAAM,GAAG;AAAA,IACtD,OAAO;AACL,cAAQ,MAAM,UAAU,SAAS,KAAK,EAAE;AACxC,UAAI,SAAS,OAAO,SAAS,iBAAiB,EAAG,SAAQ,MAAM,mDAAmD;AAClH,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,YAAY,eAAe,EAC3B,SAAS,aAAa,mBAAmB,EACzC,OAAO,qBAAqB,6CAA6C,EACzE,OAAO,+BAA+B,iBAAiB,EACvD,OAAO,OAAO,QAAgB,SAAoD;AACjF,QAAI,CAAC,KAAK,UAAU,CAAC,KAAK,aAAa;AACrC,cAAQ,MAAM,8CAA8C;AAC5D,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,UAAM,YAAY,aAAa;AAC/B,UAAM,UAAmB,EAAE,MAAM,gBAAgB,WAAW,QAAQ,QAAQ,KAAK,QAAQ,aAAa,KAAK,YAAY;AACvH,UAAM,WAAW,MAAM,YAAY,OAAO;AAC1C,QAAI,SAAS,IAAI;AACf,YAAM,QAAkB,CAAC;AACzB,UAAI,KAAK,OAAQ,OAAM,KAAK,iBAAY,KAAK,MAAM,EAAE;AACrD,UAAI,KAAK,YAAa,OAAM,KAAK,qBAAqB;AACtD,cAAQ,IAAI,QAAQ,MAAM,KAAK,MAAM,KAAK,IAAI,CAAC,EAAE;AAAA,IACnD,OAAO;AACL,cAAQ,MAAM,UAAU,SAAS,KAAK,EAAE;AACxC,UAAI,SAAS,OAAO,SAAS,WAAW,EAAG,SAAQ,MAAM,uDAAuD;AAChH,UAAI,SAAS,OAAO,SAAS,iBAAiB,EAAG,SAAQ,MAAM,mDAAmD;AAClH,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,QACG,QAAQ,MAAM,EACd,YAAY,gBAAgB,EAC5B,OAAO,YAAY;AAClB,UAAM,YAAY,aAAa;AAC/B,UAAM,UAAmB,EAAE,MAAM,cAAc,UAAU;AACzD,UAAM,WAAW,MAAM,YAAY,OAAO;AAC1C,QAAI,SAAS,IAAI;AACf,YAAM,WAAY,SAAS,MAAM,SAAS,CAAC;AAC3C,UAAI,SAAS,WAAW,GAAG;AACzB,gBAAQ,IAAI,UAAU;AACtB;AAAA,MACF;AACA,iBAAW,QAAQ,UAAU;AAC3B,cAAM,QAAQF,eAAc,KAAK,MAAM,KAAK;AAC5C,gBAAQ,IAAI,KAAK,KAAK,EAAE,KAAK,KAAK,WAAW,KAAK,KAAK,GAAG,KAAK,MAAM,GAAGC,MAAK,GAAG;AAAA,MAClF;AAAA,IACF,OAAO;AACL,cAAQ,MAAM,UAAU,SAAS,KAAK,EAAE;AACxC,UAAI,SAAS,OAAO,SAAS,iBAAiB,EAAG,SAAQ,MAAM,mDAAmD;AAClH,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;;;AC1FA,IAAME,iBAAwC;AAAA,EAC5C,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,WAAW;AACb;AACA,IAAMC,SAAQ;AACd,IAAMC,QAAO;AACb,IAAMC,OAAM;AAEL,SAAS,aAAaC,UAAwB;AACnD,EAAAA,SACG,QAAQ,MAAM,EACd,YAAY,mBAAmB,EAC/B,OAAO,YAAY;AAClB,UAAM,UAAmB,EAAE,MAAM,OAAO;AACxC,UAAM,WAAW,MAAM,YAAY,OAAO;AAC1C,QAAI,SAAS,IAAI;AACf,YAAM,WAAY,SAAS,MAAM,YAAY,CAAC;AAC9C,UAAI,SAAS,WAAW,GAAG;AACzB,gBAAQ,IAAI,aAAa;AACzB;AAAA,MACF;AACA,iBAAW,KAAK,UAAU;AACxB,cAAM,QAAQJ,eAAc,EAAE,MAAM,KAAK;AACzC,cAAM,SAAS,GAAG,KAAK,GAAG,EAAE,MAAM,GAAGC,MAAK;AAC1C,cAAM,SAAS,GAAGE,IAAG,GAAG,EAAE,UAAU,YAAYF,MAAK;AACrD,gBAAQ,IAAI,KAAKC,KAAI,GAAG,EAAE,EAAE,GAAGD,MAAK,KAAK,MAAM,KAAK,MAAM,KAAK,EAAE,IAAI,EAAE;AAAA,MACzE;AAAA,IACF,OAAO;AACL,cAAQ,MAAM,UAAU,SAAS,KAAK,EAAE;AACxC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;;;ACxCO,SAAS,eAAeI,UAAwB;AACrD,EAAAA,SACG,QAAQ,QAAQ,EAChB,YAAY,qDAAqD,EACjE,OAAO,uBAAuB,yBAAyB,EACvD,OAAO,OAAO,SAA+B;AAC5C,UAAM,YAAY,QAAQ,IAAI;AAC9B,UAAM,UAAU,QAAQ,IAAI;AAC5B,QAAI,CAAC,aAAa,CAAC,SAAS;AAC1B,cAAQ,MAAM,oFAAoF;AAClG,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,UAAU,KAAK,WAAW,MAAM,UAAU;AAChD,QAAI,CAAC,SAAS;AACZ,cAAQ,MAAM,oDAAoD;AAClE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,UAAmB,EAAE,MAAM,UAAU,WAAW,SAAS,QAAQ;AACvE,UAAM,WAAW,MAAM,YAAY,OAAO;AAC1C,QAAI,SAAS,IAAI;AACf,cAAQ,IAAI,0BAA0B;AAAA,IACxC,OAAO;AACL,cAAQ,MAAM,UAAU,SAAS,KAAK,EAAE;AACxC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;;;AChCA,SAAS,YAAAC,iBAAgB;AAIzB,SAASC,kBAAyB;AAChC,MAAI;AACF,WAAOC,UAAS,6CAA6C,EAAE,UAAU,OAAO,CAAC,EAAE,KAAK;AAAA,EAC1F,QAAQ;AACN,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC3C;AACF;AAEA,SAASC,iBAAwB;AAC/B,MAAI;AACF,WAAOD,UAAS,0CAA0C,EAAE,UAAU,OAAO,CAAC,EAAE,KAAK;AAAA,EACvF,QAAQ;AACN,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC3C;AACF;AAEO,SAAS,eAAeE,UAAwB;AACrD,EAAAA,SACG,QAAQ,QAAQ,EAChB,YAAY,yBAAyB,EACrC,SAAS,gBAAgB,sBAAsB,EAC/C,SAAS,aAAa,8CAA8C,EACpE,OAAO,OAAO,WAAmB,YAAqB;AACrD,UAAM,cAAcH,gBAAe;AACnC,UAAM,aAAaE,eAAc;AACjC,UAAM,MAAM,QAAQ,IAAI;AACxB,UAAM,UAAmB,EAAE,MAAM,UAAU,WAAW,KAAK,aAAa,YAAY,QAAQ;AAC5F,UAAM,WAAW,MAAM,YAAY,OAAO;AAC1C,QAAI,SAAS,IAAI;AACf,cAAQ,IAAI,WAAW,SAAS,UAAU;AAC1C,UAAI,SAAS,MAAM,YAAY;AAC7B,gBAAQ,IAAI,0CAA0C,SAAS,KAAK,UAAU,EAAE;AAAA,MAClF;AAAA,IACF,OAAO;AACL,cAAQ,MAAM,UAAU,SAAS,KAAK,EAAE;AACxC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;;;ACvCO,SAAS,aAAaE,UAAwB;AACnD,EAAAA,SACG,QAAQ,kBAAkB,EAC1B,YAAY,2CAA2C,EACvD,OAAO,OAAO,cAAsB;AACnC,UAAM,UAAmB,EAAE,MAAM,QAAQ,UAAU;AACnD,UAAM,WAAW,MAAM,YAAY,OAAO;AAC1C,QAAI,SAAS,IAAI;AACf,cAAQ,IAAI,WAAW,SAAS,UAAU;AAC1C,UAAI,SAAS,MAAM;AACjB,cAAM,EAAE,aAAa,IAAI,SAAS;AAClC,gBAAQ,IAAI,eAAe,YAAY,wCAAwC;AAAA,MACjF;AAAA,IACF,OAAO;AACL,cAAQ,MAAM,UAAU,SAAS,KAAK,EAAE;AACxC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;;;AbTA,IAAM,UAAU,IAAI,QAAQ;AAE5B,QACG,KAAK,UAAU,EACf,YAAY,sDAAsD,EAClE,QAAQ,OAAO;AAElB,cAAc,OAAO;AACrB,cAAc,OAAO;AACrB,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB,cAAc,OAAO;AACrB,iBAAiB,OAAO;AACxB,eAAe,OAAO;AACtB,cAAc,OAAO;AACrB,aAAa,OAAO;AACpB,eAAe,OAAO;AACtB,aAAa,OAAO;AAEpB,QAAQ,WAAW,QAAQ,IAAI,EAAE,MAAM,CAAC,QAAe;AACrD,UAAQ,MAAM,IAAI,OAAO;AACzB,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":["program","program","program","program","program","program","STATUS_COLORS","RESET","program","STATUS_COLORS","RESET","BOLD","DIM","program","program","execSync","getTmuxSession","execSync","getTmuxWindow","program","program"]}
package/dist/daemon.js CHANGED
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
+ contextDir,
3
4
  daemonPidPath,
4
5
  globalConfigPath,
5
6
  globalDir,
@@ -11,7 +12,7 @@ import {
11
12
  sessionsDir,
12
13
  socketPath,
13
14
  statePath
14
- } from "./chunk-5WP7O7D3.js";
15
+ } from "./chunk-T6Z5F4SP.js";
15
16
 
16
17
  // src/daemon/index.ts
17
18
  import { mkdirSync as mkdirSync4, readFileSync as readFileSync6, writeFileSync as writeFileSync5, unlinkSync as unlinkSync2, existsSync as existsSync4 } from "fs";
@@ -42,7 +43,7 @@ import { join as join2 } from "path";
42
43
 
43
44
  // src/daemon/session-manager.ts
44
45
  import { v4 as uuidv4 } from "uuid";
45
- import { existsSync as existsSync2, readdirSync as readdirSync2 } from "fs";
46
+ import { existsSync as existsSync2, readdirSync as readdirSync3 } from "fs";
46
47
 
47
48
  // src/daemon/state.ts
48
49
  import { readFileSync as readFileSync2, writeFileSync, mkdirSync, renameSync } from "fs";
@@ -72,6 +73,7 @@ function atomicWrite(filePath, data) {
72
73
  function createSession(id, task, cwd) {
73
74
  const dir = sessionDir(cwd, id);
74
75
  mkdirSync(dir, { recursive: true });
76
+ mkdirSync(contextDir(cwd, id), { recursive: true });
75
77
  const session = {
76
78
  id,
77
79
  task,
@@ -176,18 +178,20 @@ async function appendAgentReport(cwd, sessionId, agentId, entry) {
176
178
  saveSession(session);
177
179
  });
178
180
  }
179
- async function completeOrchestratorCycle(cwd, sessionId) {
181
+ async function completeOrchestratorCycle(cwd, sessionId, nextPrompt) {
180
182
  return withSessionLock(sessionId, () => {
181
183
  const session = getSession(cwd, sessionId);
182
184
  const cycles = session.orchestratorCycles;
183
185
  if (cycles.length === 0) return;
184
- cycles[cycles.length - 1].completedAt = (/* @__PURE__ */ new Date()).toISOString();
186
+ const cycle = cycles[cycles.length - 1];
187
+ cycle.completedAt = (/* @__PURE__ */ new Date()).toISOString();
188
+ if (nextPrompt) cycle.nextPrompt = nextPrompt;
185
189
  saveSession(session);
186
190
  });
187
191
  }
188
192
 
189
193
  // src/daemon/orchestrator.ts
190
- import { readFileSync as readFileSync3, existsSync, writeFileSync as writeFileSync2 } from "fs";
194
+ import { readFileSync as readFileSync3, existsSync, writeFileSync as writeFileSync2, readdirSync } from "fs";
191
195
  import { resolve } from "path";
192
196
 
193
197
  // src/daemon/tmux.ts
@@ -233,7 +237,10 @@ function setPaneTitle(paneTarget, title) {
233
237
  execSafe(`tmux select-pane -t "${paneTarget}" -T ${shellQuote(title)}`);
234
238
  }
235
239
  function setPaneStyle(paneTarget, color) {
236
- execSafe(`tmux select-pane -t "${paneTarget}" -P "border-style=fg=${color}"`);
240
+ const fmt = `#[fg=${color},bold] #{pane_title} #[fg=${color}]#{pane_current_path} #[default]`;
241
+ execSafe(`tmux set -p -t "${paneTarget}" pane-border-format ${shellQuote(fmt)}`);
242
+ execSafe(`tmux set -p -t "${paneTarget}" pane-border-style "fg=${color}"`);
243
+ execSafe(`tmux set -p -t "${paneTarget}" pane-active-border-style "fg=${color}"`);
237
244
  }
238
245
  function shellQuote(s) {
239
246
  return `'${s.replace(/'/g, "'\\''")}'`;
@@ -274,6 +281,14 @@ function formatStateForOrchestrator(session) {
274
281
  const shortId = session.id.slice(0, 8);
275
282
  const cycleNum = session.orchestratorCycles.length;
276
283
  const taskLines = session.tasks.length > 0 ? session.tasks.map((t) => `- ${t.id}: [${t.status}] ${t.description}`).join("\n") : " (none)";
284
+ const ctxDir = contextDir(session.cwd, session.id);
285
+ let contextLines;
286
+ if (existsSync(ctxDir)) {
287
+ const files = readdirSync(ctxDir);
288
+ contextLines = files.length > 0 ? files.map((f) => `- ${f}`).join("\n") : " (none)";
289
+ } else {
290
+ contextLines = " (none)";
291
+ }
277
292
  const agentLines = session.agents.length > 0 ? session.agents.map((a) => {
278
293
  const header = `- ${a.id} (${a.name}): ${a.status} \u2014 ${a.reports.length} report(s)`;
279
294
  if (a.reports.length === 0) return header;
@@ -297,6 +312,9 @@ function formatStateForOrchestrator(session) {
297
312
  "## Tasks",
298
313
  taskLines,
299
314
  "",
315
+ "## Context Files",
316
+ contextLines,
317
+ "",
300
318
  "## Agents",
301
319
  agentLines,
302
320
  "",
@@ -309,18 +327,32 @@ async function spawnOrchestrator(sessionId, cwd, windowId, message) {
309
327
  const session = getSession(cwd, sessionId);
310
328
  const basePrompt = loadOrchestratorPrompt(cwd);
311
329
  const formattedState = formatStateForOrchestrator(session);
312
- const fullPrompt = `${basePrompt}
313
-
314
- ${formattedState}`;
315
330
  const cycleNum = session.orchestratorCycles.length + 1;
316
331
  const promptFilePath = `${sessionDir(cwd, sessionId)}/orchestrator-prompt-${cycleNum}.md`;
317
- writeFileSync2(promptFilePath, fullPrompt, "utf-8");
332
+ writeFileSync2(promptFilePath, basePrompt, "utf-8");
318
333
  sessionWindowMap.set(sessionId, windowId);
319
334
  const envExports = [
320
335
  `export SISYPHUS_SESSION_ID='${sessionId}'`,
321
336
  `export SISYPHUS_AGENT_ID='orchestrator'`
322
337
  ].join(" && ");
323
- const userPrompt = message ? `The user resumed this session with new instructions: ${message}` : "Review the current session state and execute the next cycle of work.";
338
+ let userPrompt;
339
+ if (message) {
340
+ userPrompt = `${formattedState}
341
+
342
+ The user resumed this session with new instructions: ${message}`;
343
+ } else {
344
+ const lastCycle = [...session.orchestratorCycles].reverse().find((c) => c.completedAt);
345
+ const storedPrompt = lastCycle?.nextPrompt;
346
+ if (storedPrompt) {
347
+ userPrompt = `${formattedState}
348
+
349
+ ${storedPrompt}`;
350
+ } else {
351
+ userPrompt = `${formattedState}
352
+
353
+ Review the current session state and execute the next cycle of work.`;
354
+ }
355
+ }
324
356
  const userPromptFilePath = `${sessionDir(cwd, sessionId)}/orchestrator-user-${cycleNum}.md`;
325
357
  writeFileSync2(userPromptFilePath, userPrompt, "utf-8");
326
358
  const claudeCmd = `claude --dangerously-skip-permissions --append-system-prompt "$(cat '${promptFilePath}')" "$(cat '${userPromptFilePath}')"`;
@@ -343,13 +375,13 @@ function resolveOrchestratorPane(sessionId, cwd) {
343
375
  const lastCycle = session.orchestratorCycles[session.orchestratorCycles.length - 1];
344
376
  return lastCycle?.paneId ?? void 0;
345
377
  }
346
- async function handleOrchestratorYield(sessionId, cwd) {
378
+ async function handleOrchestratorYield(sessionId, cwd, nextPrompt) {
347
379
  const paneId = resolveOrchestratorPane(sessionId, cwd);
348
380
  if (paneId) {
349
381
  killPane(paneId);
350
382
  sessionOrchestratorPane.delete(sessionId);
351
383
  }
352
- await completeOrchestratorCycle(cwd, sessionId);
384
+ await completeOrchestratorCycle(cwd, sessionId, nextPrompt);
353
385
  const session = getSession(cwd, sessionId);
354
386
  const runningAgents = session.agents.filter((a) => a.status === "running");
355
387
  if (runningAgents.length === 0) {
@@ -369,7 +401,7 @@ async function handleOrchestratorComplete(sessionId, cwd, report) {
369
401
  }
370
402
 
371
403
  // src/daemon/agent.ts
372
- import { readFileSync as readFileSync4, writeFileSync as writeFileSync3, mkdirSync as mkdirSync2, readdirSync } from "fs";
404
+ import { readFileSync as readFileSync4, writeFileSync as writeFileSync3, mkdirSync as mkdirSync2, readdirSync as readdirSync2 } from "fs";
373
405
  import { resolve as resolve2 } from "path";
374
406
  var agentCounters = /* @__PURE__ */ new Map();
375
407
  function resetAgentCounter(sessionId, value = 0) {
@@ -427,7 +459,7 @@ async function spawnAgent(opts) {
427
459
  function nextReportNumber(cwd, sessionId, agentId) {
428
460
  const dir = reportsDir(cwd, sessionId);
429
461
  try {
430
- const files = readdirSync(dir).filter((f) => f.startsWith(`${agentId}-`) && !f.endsWith("-final.md"));
462
+ const files = readdirSync2(dir).filter((f) => f.startsWith(`${agentId}-`) && !f.endsWith("-final.md"));
431
463
  return String(files.length + 1).padStart(3, "0");
432
464
  } catch {
433
465
  return "001";
@@ -592,7 +624,7 @@ function getSessionStatus(cwd, sessionId) {
592
624
  function listSessions(cwd) {
593
625
  const dir = sessionsDir(cwd);
594
626
  if (!existsSync2(dir)) return [];
595
- const entries = readdirSync2(dir, { withFileTypes: true });
627
+ const entries = readdirSync3(dir, { withFileTypes: true });
596
628
  const sessions = [];
597
629
  for (const entry of entries) {
598
630
  if (!entry.isDirectory()) continue;
@@ -641,8 +673,8 @@ async function handleSubmit(cwd, sessionId, agentId, report, windowId) {
641
673
  async function handleReport(cwd, sessionId, agentId, content) {
642
674
  await handleAgentReport(cwd, sessionId, agentId, content);
643
675
  }
644
- async function handleYield(sessionId, cwd) {
645
- await handleOrchestratorYield(sessionId, cwd);
676
+ async function handleYield(sessionId, cwd, nextPrompt) {
677
+ await handleOrchestratorYield(sessionId, cwd, nextPrompt);
646
678
  }
647
679
  async function handleComplete(sessionId, cwd, report) {
648
680
  untrackSession(sessionId);
@@ -761,7 +793,7 @@ async function handleRequest(req) {
761
793
  case "yield": {
762
794
  const cwd = sessionCwdMap.get(req.sessionId);
763
795
  if (!cwd) return { ok: false, error: `Unknown session: ${req.sessionId}` };
764
- await handleYield(req.sessionId, cwd);
796
+ await handleYield(req.sessionId, cwd, req.nextPrompt);
765
797
  return { ok: true };
766
798
  }
767
799
  case "complete": {