sisyphi 0.1.21 → 0.1.23
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/dist/chunk-KQBSC5KY.js +31 -0
- package/dist/chunk-KQBSC5KY.js.map +1 -0
- package/dist/{chunk-LTAW6OWS.js → chunk-YGBGKMTF.js} +31 -6
- package/dist/chunk-YGBGKMTF.js.map +1 -0
- package/dist/chunk-ZE2SKB4B.js +35 -0
- package/dist/chunk-ZE2SKB4B.js.map +1 -0
- package/dist/cli.js +638 -51
- package/dist/cli.js.map +1 -1
- package/dist/daemon.js +915 -289
- package/dist/daemon.js.map +1 -1
- package/dist/paths-FYYSBD27.js +58 -0
- package/dist/paths-FYYSBD27.js.map +1 -0
- package/dist/templates/CLAUDE.md +21 -20
- package/dist/templates/agent-plugin/agents/CLAUDE.md +2 -0
- package/dist/templates/agent-plugin/agents/debug.md +1 -0
- package/dist/templates/agent-plugin/agents/operator.md +1 -2
- package/dist/templates/agent-plugin/agents/plan.md +86 -55
- package/dist/templates/agent-plugin/agents/review-plan.md +1 -0
- package/dist/templates/agent-plugin/agents/spec-draft.md +1 -0
- package/dist/templates/agent-plugin/hooks/hooks.json +19 -1
- package/dist/templates/agent-plugin/hooks/intercept-send-message.sh +1 -1
- package/dist/templates/agent-plugin/hooks/require-submit.sh +24 -0
- package/dist/templates/agent-suffix.md +18 -0
- package/dist/templates/dashboard-claude.md +38 -0
- package/dist/templates/orchestrator-base.md +270 -0
- package/dist/templates/orchestrator-impl.md +116 -0
- package/dist/templates/orchestrator-planning.md +131 -0
- package/dist/templates/orchestrator-plugin/hooks/hooks.json +1 -15
- package/dist/templates/orchestrator-plugin/skills/git-management/SKILL.md +1 -1
- package/dist/templates/orchestrator-plugin/skills/orchestration/SKILL.md +4 -16
- package/dist/templates/orchestrator-plugin/skills/orchestration/task-patterns.md +22 -23
- package/dist/templates/orchestrator-plugin/skills/orchestration/workflow-examples.md +11 -11
- package/dist/tui.js +3236 -0
- package/dist/tui.js.map +1 -0
- package/package.json +5 -1
- package/templates/CLAUDE.md +21 -20
- package/templates/agent-plugin/agents/CLAUDE.md +2 -0
- package/templates/agent-plugin/agents/debug.md +1 -0
- package/templates/agent-plugin/agents/operator.md +1 -2
- package/templates/agent-plugin/agents/plan.md +86 -55
- package/templates/agent-plugin/agents/review-plan.md +1 -0
- package/templates/agent-plugin/agents/spec-draft.md +1 -0
- package/templates/agent-plugin/hooks/hooks.json +19 -1
- package/templates/agent-plugin/hooks/intercept-send-message.sh +1 -1
- package/templates/agent-plugin/hooks/require-submit.sh +24 -0
- package/templates/agent-suffix.md +18 -0
- package/templates/dashboard-claude.md +38 -0
- package/templates/orchestrator-base.md +270 -0
- package/templates/orchestrator-impl.md +116 -0
- package/templates/orchestrator-planning.md +131 -0
- package/templates/orchestrator-plugin/hooks/hooks.json +1 -15
- package/templates/orchestrator-plugin/skills/git-management/SKILL.md +1 -1
- package/templates/orchestrator-plugin/skills/orchestration/SKILL.md +4 -16
- package/templates/orchestrator-plugin/skills/orchestration/task-patterns.md +22 -23
- package/templates/orchestrator-plugin/skills/orchestration/workflow-examples.md +11 -11
- package/dist/chunk-LTAW6OWS.js.map +0 -1
- package/dist/templates/orchestrator-plugin/scripts/block-task.sh +0 -11
- package/dist/templates/orchestrator.md +0 -173
- package/templates/orchestrator-plugin/scripts/block-task.sh +0 -11
- package/templates/orchestrator.md +0 -173
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/index.ts","../src/cli/client.ts","../src/cli/install.ts","../src/cli/tmux.ts","../src/cli/commands/start.ts","../src/cli/stdin.ts","../src/cli/commands/spawn.ts","../src/cli/commands/submit.ts","../src/cli/commands/yield.ts","../src/cli/commands/complete.ts","../src/cli/commands/status.ts","../src/cli/commands/list.ts","../src/cli/commands/report.ts","../src/cli/commands/resume.ts","../src/cli/commands/kill.ts","../src/cli/commands/uninstall.ts","../src/cli/commands/notify.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 { registerList } from './commands/list.js';\nimport { registerReport } from './commands/report.js';\nimport { registerResume } from './commands/resume.js';\nimport { registerKill } from './commands/kill.js';\nimport { registerUninstall } from './commands/uninstall.js';\nimport { registerNotify } from './commands/notify.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);\nregisterList(program);\nregisterResume(program);\nregisterKill(program);\nregisterUninstall(program);\nregisterNotify(program);\n\nprogram.parseAsync(process.argv).catch((err: Error) => {\n console.error(err.message);\n process.exit(1);\n});\n","import { connect } from 'node:net';\nimport { socketPath } from '../shared/paths.js';\nimport type { Request, Response } from '../shared/protocol.js';\nimport { ensureDaemonInstalled, waitForDaemon } from './install.js';\n\nexport function rawSend(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 reject(err);\n });\n });\n}\n\nexport async function sendRequest(request: Request): Promise<Response> {\n const sleep = (ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms));\n const MAX_ATTEMPTS = 5;\n const RETRY_DELAY_MS = 2000;\n let installedDaemon = false;\n let lastErr: unknown;\n\n for (let attempt = 1; attempt <= MAX_ATTEMPTS; attempt++) {\n try {\n return await rawSend(request);\n } catch (err) {\n lastErr = err;\n const code = (err as NodeJS.ErrnoException).code;\n if (code !== 'ENOENT' && code !== 'ECONNREFUSED') {\n throw err;\n }\n\n if (attempt === MAX_ATTEMPTS) break;\n\n if (process.platform === 'darwin' && !installedDaemon) {\n installedDaemon = true;\n await ensureDaemonInstalled();\n await waitForDaemon(5000);\n } else {\n process.stderr.write(`Daemon not ready, retrying (${attempt}/${MAX_ATTEMPTS - 1})...\\n`);\n await sleep(RETRY_DELAY_MS);\n }\n }\n }\n\n if (process.platform !== 'darwin') {\n throw new Error(\n `Sisyphus daemon is not running.\\n` +\n ` Start it manually: sisyphusd &\\n` +\n ` Or check logs at: ~/.sisyphus/daemon.log`\n );\n }\n throw lastErr;\n}\n","import { execSync } from 'node:child_process';\nimport { existsSync, mkdirSync, readFileSync, rmSync, unlinkSync, writeFileSync } from 'node:fs';\nimport { connect } from 'node:net';\nimport { homedir } from 'node:os';\nimport { dirname, join, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { daemonLogPath, daemonUpdatingPath, globalDir, socketPath } from '../shared/paths.js';\n\nconst PLIST_LABEL = 'com.sisyphus.daemon';\nconst PLIST_FILENAME = `${PLIST_LABEL}.plist`;\n\nfunction launchAgentDir(): string {\n return join(homedir(), 'Library', 'LaunchAgents');\n}\n\nfunction plistPath(): string {\n return join(launchAgentDir(), PLIST_FILENAME);\n}\n\nfunction daemonBinPath(): string {\n // In bundled output, cli.js and daemon.js are siblings in dist/\n const installDir = dirname(fileURLToPath(import.meta.url));\n return resolve(installDir, 'daemon.js');\n}\n\nfunction generatePlist(nodePath: string, daemonPath: string, logPath: string): string {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n <key>Label</key>\n <string>${PLIST_LABEL}</string>\n <key>ProgramArguments</key>\n <array>\n <string>${nodePath}</string>\n <string>${daemonPath}</string>\n </array>\n <key>RunAtLoad</key>\n <true/>\n <key>KeepAlive</key>\n <true/>\n <key>StandardOutPath</key>\n <string>${logPath}</string>\n <key>StandardErrorPath</key>\n <string>${logPath}</string>\n</dict>\n</plist>\n`;\n}\n\nexport function isInstalled(): boolean {\n return existsSync(plistPath());\n}\n\nexport async function ensureDaemonInstalled(): Promise<void> {\n if (process.platform !== 'darwin') return;\n\n if (!isInstalled()) {\n const nodePath = process.execPath;\n const daemonPath = daemonBinPath();\n const logPath = daemonLogPath();\n\n mkdirSync(globalDir(), { recursive: true });\n mkdirSync(launchAgentDir(), { recursive: true });\n\n const plist = generatePlist(nodePath, daemonPath, logPath);\n writeFileSync(plistPath(), plist, 'utf8');\n\n execSync(`launchctl load -w ${plistPath()}`);\n }\n\n await waitForDaemon();\n}\n\nexport async function uninstallDaemon(purge: boolean): Promise<void> {\n if (process.platform !== 'darwin') {\n console.log('Auto-install is only supported on macOS.');\n return;\n }\n\n const plist = plistPath();\n if (existsSync(plist)) {\n try {\n execSync(`launchctl unload -w ${plist}`, { stdio: 'pipe' });\n } catch {\n // already unloaded or not registered — ignore\n }\n unlinkSync(plist);\n console.log('Daemon unloaded and plist removed.');\n } else {\n console.log('Daemon is not installed (plist not found).');\n }\n\n if (purge) {\n const dir = globalDir();\n if (existsSync(dir)) {\n rmSync(dir, { recursive: true, force: true });\n console.log(`Removed ${dir}`);\n }\n }\n}\n\nfunction testConnection(): Promise<void> {\n return new Promise((resolve, reject) => {\n const sock = connect(socketPath());\n sock.on('connect', () => { sock.destroy(); resolve(); });\n sock.on('error', (err) => { sock.destroy(); reject(err); });\n });\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport async function waitForDaemon(maxWaitMs = 6000): Promise<void> {\n const start = Date.now();\n let updatingLogged = false;\n\n while (Date.now() - start < maxWaitMs) {\n // Extend timeout if daemon is updating\n const updatingPath = daemonUpdatingPath();\n if (existsSync(updatingPath)) {\n if (!updatingLogged) {\n try {\n const version = readFileSync(updatingPath, 'utf-8').trim();\n console.log(`Updating sisyphus to ${version}...`);\n } catch {\n console.log('Updating sisyphus...');\n }\n updatingLogged = true;\n }\n maxWaitMs = Math.max(maxWaitMs, 30000);\n }\n\n if (existsSync(socketPath())) {\n try {\n await testConnection();\n return;\n } catch {\n // not ready yet\n }\n }\n await sleep(300);\n }\n throw new Error(`Daemon did not start within ${maxWaitMs}ms. Check ${daemonLogPath()}`);\n}\n","import { execSync } from 'node:child_process';\n\nexport function assertTmux(): void {\n if (!process.env.TMUX) {\n throw new Error('Not running inside a tmux pane. Sisyphus requires tmux.');\n }\n}\n\nexport function getTmuxSession(): string {\n assertTmux();\n return execSync('tmux display-message -p \"#{session_name}\"', { encoding: 'utf8' }).trim();\n}\n\nexport function getTmuxWindow(): string {\n assertTmux();\n return execSync('tmux display-message -p \"#{window_id}\"', { encoding: 'utf8' }).trim();\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport { getTmuxSession, getTmuxWindow } from '../tmux.js';\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 .option('-c, --context <context>', 'Background context for the orchestrator')\n .action(async (task: string, opts: { context?: string }) => {\n const tmuxSession = getTmuxSession();\n const tmuxWindow = getTmuxWindow();\n const request: Request = { type: 'start', task, context: opts.context, 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(`Task handed off to sisyphus orchestrator (session ${sessionId})`);\n console.log(`The orchestrator and its agents will handle this task autonomously — no further action needed from you.`);\n\n console.log(`\\nMonitor:`);\n console.log(` sisyphus status ${sessionId} # agents, cycles, reports`);\n console.log(` tail -f ~/.sisyphus/daemon.log # daemon activity`);\n console.log(`\\nControl:`);\n console.log(` sisyphus resume ${sessionId} \"new instructions\" # respawn with follow-up`);\n console.log(` sisyphus kill ${sessionId} # stop all agents and orchestrator`);\n } else {\n console.error(`Error: ${response.error}`);\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';\nimport { assertTmux } from '../tmux.js';\n\nexport function registerSpawn(program: Command): void {\n program\n .command('spawn')\n .description('Spawn a new agent (orchestrator only)')\n .argument('[instruction]', 'Task instruction for the agent')\n .option('--agent-type <type>', 'Agent role label (default: worker)', 'worker')\n .requiredOption('--name <name>', 'Agent name')\n .option('--instruction <instruction>', 'Task instruction for the agent (or pipe via stdin)')\n .option('--worktree', 'Spawn agent in an isolated git worktree')\n .action(async (positionalInstruction: string | undefined, opts: { agentType: string; name: string; instruction?: string; worktree?: boolean }) => {\n assertTmux();\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 instruction = opts.instruction ?? positionalInstruction ?? await readStdin();\n if (!instruction) {\n console.error('Error: --instruction is required (or pipe via stdin)');\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,\n ...(opts.worktree ? { worktree: true } : {}),\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","import { execSync } from 'node:child_process';\nimport type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport { readStdin } from '../stdin.js';\nimport { assertTmux } from '../tmux.js';\n\nfunction isInWorktree(): boolean {\n try {\n const gitDir = execSync('git rev-parse --git-dir', { encoding: 'utf-8' }).trim();\n const commonDir = execSync('git rev-parse --git-common-dir', { encoding: 'utf-8' }).trim();\n return gitDir !== commonDir;\n } catch {\n return false;\n }\n}\n\nfunction getUncommittedChanges(): string | null {\n try {\n const status = execSync('git status --porcelain', { encoding: 'utf-8' }).trim();\n return status || null;\n } catch {\n return null;\n }\n}\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 assertTmux();\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 // Block submit if worktree has uncommitted changes — they'd be lost on merge\n if (isInWorktree()) {\n const changes = getUncommittedChanges();\n if (changes) {\n console.error('Error: uncommitted changes in worktree. Your branch is merged automatically after submit — uncommitted work will be lost.');\n console.error('\\nCommit first:\\n git add -A && git commit -m \"description of changes\"\\n');\n console.error('Or discard:\\n git checkout -- .\\n');\n console.error('Uncommitted changes:');\n console.error(changes);\n process.exit(1);\n }\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';\nimport { assertTmux } from '../tmux.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 assertTmux();\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';\nimport { assertTmux } from '../tmux.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 assertTmux();\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(`\\nFollow up:`);\n console.log(` sisyphus resume ${sessionId} \"new instructions\" # respawn orchestrator with follow-up`);\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, 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};\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 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 if (session.context) {\n const truncated = session.context.length > 120 ? session.context.slice(0, 120) + '...' : session.context;\n console.log(` Context: ${truncated}`);\n }\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.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 { basename } from 'node:path';\n\ninterface SessionSummary {\n id: string;\n task: string;\n status: string;\n agentCount: number;\n createdAt: string;\n cwd?: 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\nfunction truncateTask(task: string, max: number): string {\n if (task.length <= max) return task;\n return task.slice(0, max - 1) + '…';\n}\n\nexport function registerList(program: Command): void {\n program\n .command('list')\n .description('List sessions (defaults to current project)')\n .option('-a, --all', 'Show sessions from all projects')\n .action(async (opts: { all?: boolean }) => {\n const cwd = process.cwd();\n const request: Request = { type: 'list', cwd, all: opts.all };\n const response = await sendRequest(request);\n if (response.ok) {\n const sessions = (response.data?.sessions ?? []) as SessionSummary[];\n const totalCount = response.data?.totalCount as number | undefined;\n const filtered = response.data?.filtered as boolean | undefined;\n\n if (sessions.length === 0) {\n if (filtered && totalCount && totalCount > 0) {\n console.log(`No sessions in this project. ${totalCount} session(s) in other projects.`);\n console.log(`${DIM}Run ${RESET}sisyphus list --all${DIM} to show all.${RESET}`);\n } else {\n console.log('No sessions');\n }\n return;\n }\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 const task = truncateTask(s.task, 60);\n const cwdLabel = opts.all && s.cwd ? ` ${DIM}${basename(s.cwd)}${RESET}` : '';\n console.log(` ${BOLD}${s.id}${RESET} ${status} ${agents} ${task}${cwdLabel}`);\n }\n\n if (filtered && totalCount && totalCount > sessions.length) {\n const otherCount = totalCount - sessions.length;\n console.log(`\\n${DIM}${otherCount} more session(s) in other projects. Run ${RESET}sisyphus list --all${DIM} to show all.${RESET}`);\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';\nimport { assertTmux } from '../tmux.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 assertTmux();\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 { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport { getTmuxSession, getTmuxWindow } from '../tmux.js';\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","import type { Command } from 'commander';\nimport { createInterface } from 'node:readline';\nimport { uninstallDaemon } from '../install.js';\n\nasync function confirm(question: string): Promise<boolean> {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer.trim().toLowerCase() === 'y');\n });\n });\n}\n\nexport function registerUninstall(program: Command): void {\n program\n .command('uninstall')\n .description('Unload the sisyphus daemon from launchd and remove the plist')\n .option('--purge', 'Also remove all session data in ~/.sisyphus')\n .option('-y, --yes', 'Skip confirmation prompt for --purge')\n .action(async (opts: { purge?: boolean; yes?: boolean }) => {\n const purge = opts.purge ?? false;\n\n if (purge && !opts.yes) {\n const ok = await confirm('This will delete all session data in ~/.sisyphus. Continue? (y/N) ');\n if (!ok) {\n console.log('Aborted.');\n return;\n }\n }\n\n await uninstallDaemon(purge);\n });\n}\n","import type { Command } from 'commander';\nimport { rawSend } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\n\nexport function registerNotify(program: Command): void {\n const notify = program\n .command('notify')\n .description('Internal notifications (fire-and-forget)');\n\n notify\n .command('pane-exited')\n .description('Notify daemon that a tmux pane exited')\n .requiredOption('--pane-id <paneId>', 'Pane ID that exited')\n .action(async (opts: { paneId: string }) => {\n try {\n const request: Request = { type: 'pane-exited', paneId: opts.paneId };\n await rawSend(request);\n } catch {\n // Fire-and-forget: daemon may be stopped, socket gone, etc.\n }\n });\n}\n"],"mappings":"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","names":["connect","resolve","resolve","connect","sleep","execSync","program","resolve","program","execSync","execSync","program","program","program","program","STATUS_COLORS","RESET","BOLD","DIM","program","program","program","program","resolve","program","program"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli/index.ts","../src/cli/commands/start.ts","../src/cli/client.ts","../src/cli/install.ts","../src/cli/tmux-setup.ts","../src/cli/tmux.ts","../src/cli/commands/dashboard.ts","../src/cli/stdin.ts","../src/cli/commands/spawn.ts","../src/cli/commands/submit.ts","../src/cli/commands/yield.ts","../src/cli/commands/complete.ts","../src/cli/commands/continue.ts","../src/cli/commands/status.ts","../src/cli/commands/list.ts","../src/cli/commands/report.ts","../src/cli/commands/resume.ts","../src/cli/commands/kill.ts","../src/cli/commands/uninstall.ts","../src/cli/commands/notify.ts","../src/cli/commands/message.ts","../src/cli/commands/update-task.ts","../src/cli/commands/rollback.ts","../src/cli/commands/restart-agent.ts","../src/cli/commands/setup-keybind.ts","../src/cli/commands/doctor.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 { registerContinue } from './commands/continue.js';\nimport { registerStatus } from './commands/status.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';\nimport { registerUninstall } from './commands/uninstall.js';\nimport { registerNotify } from './commands/notify.js';\nimport { registerMessage } from './commands/message.js';\nimport { registerUpdateTask } from './commands/update-task.js';\nimport { registerDashboard } from './commands/dashboard.js';\nimport { registerRollback } from './commands/rollback.js';\nimport { registerRestartAgent } from './commands/restart-agent.js';\nimport { registerSetupKeybind } from './commands/setup-keybind.js';\nimport { registerDoctor } from './commands/doctor.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);\nregisterContinue(program);\nregisterStatus(program);\nregisterList(program);\nregisterResume(program);\nregisterKill(program);\nregisterUninstall(program);\nregisterNotify(program);\nregisterMessage(program);\nregisterUpdateTask(program);\nregisterDashboard(program);\nregisterRollback(program);\nregisterRestartAgent(program);\nregisterSetupKeybind(program);\nregisterDoctor(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 { getTmuxSession } from '../tmux.js';\nimport { isDashboardOpen, launchDashboard } from './dashboard.js';\nimport type { Request } from '../../shared/protocol.js';\n\nfunction shellQuote(s: string): string {\n return `'${s.replace(/'/g, \"'\\\\''\")}'`;\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 .option('-c, --context <context>', 'Background context for the orchestrator')\n .option('-n, --name <name>', 'Human-readable name for the session')\n .action(async (task: string, opts: { context?: string; name?: string }) => {\n const cwd = process.env['SISYPHUS_CWD'] ?? process.cwd();\n const request: Request = { type: 'start', task, context: opts.context, cwd, name: opts.name };\n const response = await sendRequest(request);\n if (response.ok) {\n const sessionId = response.data?.sessionId as string;\n const tmuxSessionName = response.data?.tmuxSessionName as string | undefined;\n // Tag the user's current tmux session so it's part of the same cycle group\n if (process.env['TMUX']) {\n try {\n execSync(`tmux set-option @sisyphus_cwd ${shellQuote(cwd)}`, { stdio: 'ignore' });\n } catch { /* not in tmux or tmux error — ignore */ }\n\n try {\n const tmuxSession = getTmuxSession();\n if (!isDashboardOpen(tmuxSession)) {\n launchDashboard(tmuxSession, cwd);\n console.log(`Dashboard opened in tmux window \"sisyphus-dashboard\"`);\n }\n } catch { /* dashboard launch failed — non-fatal */ }\n }\n\n console.log(`Task handed off to sisyphus orchestrator (session ${sessionId})`);\n console.log(`The orchestrator and its agents will handle this task autonomously — no further action needed from you.`);\n\n if (tmuxSessionName) {\n console.log(`\\nTmux session: ${tmuxSessionName}`);\n console.log(` tmux attach -t ${tmuxSessionName}`);\n }\n\n console.log(`\\nMonitor:`);\n console.log(` sisyphus status ${sessionId} # agents, cycles, reports`);\n console.log(` tail -f ~/.sisyphus/daemon.log # daemon activity`);\n console.log(`\\nControl:`);\n console.log(` sisyphus resume ${sessionId} \"new instructions\" # respawn with follow-up`);\n console.log(` sisyphus kill ${sessionId} # stop all agents and orchestrator`);\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';\nimport { ensureDaemonInstalled, waitForDaemon } from './install.js';\n\nexport function rawSend(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 reject(err);\n });\n });\n}\n\nexport async function sendRequest(request: Request): Promise<Response> {\n const sleep = (ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms));\n const MAX_ATTEMPTS = 5;\n const RETRY_DELAY_MS = 2000;\n let installedDaemon = false;\n let lastErr: unknown;\n\n for (let attempt = 1; attempt <= MAX_ATTEMPTS; attempt++) {\n try {\n return await rawSend(request);\n } catch (err) {\n lastErr = err;\n const code = (err as NodeJS.ErrnoException).code;\n if (code !== 'ENOENT' && code !== 'ECONNREFUSED') {\n throw err;\n }\n\n if (attempt === MAX_ATTEMPTS) break;\n\n if (process.platform === 'darwin' && !installedDaemon) {\n installedDaemon = true;\n await ensureDaemonInstalled();\n await waitForDaemon(5000);\n } else {\n process.stderr.write(`Daemon not ready, retrying (${attempt}/${MAX_ATTEMPTS - 1})...\\n`);\n await sleep(RETRY_DELAY_MS);\n }\n }\n }\n\n if (process.platform !== 'darwin') {\n throw new Error(\n `Sisyphus daemon is not running.\\n` +\n ` Start it manually: sisyphusd &\\n` +\n ` Or check logs at: ~/.sisyphus/daemon.log`\n );\n }\n throw lastErr;\n}\n","import { execSync } from 'node:child_process';\nimport { existsSync, mkdirSync, readFileSync, rmSync, unlinkSync, writeFileSync } from 'node:fs';\nimport { connect } from 'node:net';\nimport { homedir } from 'node:os';\nimport { dirname, join, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { daemonLogPath, daemonUpdatingPath, globalDir, socketPath } from '../shared/paths.js';\nimport { type SetupResult, removeTmuxKeybind, setupTmuxKeybind } from './tmux-setup.js';\n\nconst PLIST_LABEL = 'com.sisyphus.daemon';\nconst PLIST_FILENAME = `${PLIST_LABEL}.plist`;\n\nfunction launchAgentDir(): string {\n return join(homedir(), 'Library', 'LaunchAgents');\n}\n\nfunction plistPath(): string {\n return join(launchAgentDir(), PLIST_FILENAME);\n}\n\nfunction daemonBinPath(): string {\n // In bundled output, cli.js and daemon.js are siblings in dist/\n const installDir = dirname(fileURLToPath(import.meta.url));\n return resolve(installDir, 'daemon.js');\n}\n\nfunction generatePlist(nodePath: string, daemonPath: string, logPath: string): string {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n <key>Label</key>\n <string>${PLIST_LABEL}</string>\n <key>ProgramArguments</key>\n <array>\n <string>${nodePath}</string>\n <string>${daemonPath}</string>\n </array>\n <key>RunAtLoad</key>\n <true/>\n <key>KeepAlive</key>\n <true/>\n <key>StandardOutPath</key>\n <string>${logPath}</string>\n <key>StandardErrorPath</key>\n <string>${logPath}</string>\n</dict>\n</plist>\n`;\n}\n\nexport function isInstalled(): boolean {\n return existsSync(plistPath());\n}\n\nexport async function ensureDaemonInstalled(): Promise<void> {\n if (process.platform !== 'darwin') return;\n\n if (!isInstalled()) {\n const nodePath = process.execPath;\n const daemonPath = daemonBinPath();\n const logPath = daemonLogPath();\n\n mkdirSync(globalDir(), { recursive: true });\n mkdirSync(launchAgentDir(), { recursive: true });\n\n const plist = generatePlist(nodePath, daemonPath, logPath);\n writeFileSync(plistPath(), plist, 'utf8');\n\n execSync(`launchctl load -w ${plistPath()}`);\n\n const keybindResult = setupTmuxKeybind();\n\n printGettingStarted(keybindResult);\n }\n\n await waitForDaemon();\n}\n\nexport async function uninstallDaemon(purge: boolean): Promise<void> {\n if (process.platform !== 'darwin') {\n console.log('Auto-install is only supported on macOS.');\n return;\n }\n\n const plist = plistPath();\n if (existsSync(plist)) {\n try {\n execSync(`launchctl unload -w ${plist}`, { stdio: 'pipe' });\n } catch {\n // already unloaded or not registered — ignore\n }\n unlinkSync(plist);\n console.log('Daemon unloaded and plist removed.');\n } else {\n console.log('Daemon is not installed (plist not found).');\n }\n\n removeTmuxKeybind();\n\n if (purge) {\n const dir = globalDir();\n if (existsSync(dir)) {\n rmSync(dir, { recursive: true, force: true });\n console.log(`Removed ${dir}`);\n }\n }\n}\n\nfunction printGettingStarted(keybindResult: SetupResult): void {\n const lines = [\n '',\n 'Sisyphus installed — daemon running via launchd.',\n '',\n 'Sisyphus is a tmux-integrated orchestration daemon for Claude Code multi-agent workflows.',\n 'A background daemon manages sessions where an orchestrator Claude breaks tasks into',\n 'subtasks, spawns agent Claude instances in tmux panes, and coordinates their lifecycle.',\n '',\n 'Quick start:',\n ' sisyphus start \"task description\" Start a session (must be inside tmux)',\n ' sisyphus list List sessions',\n ' sisyphus status Show current session status',\n ' sisyphus kill <id> Kill a session',\n '',\n 'Monitoring:',\n ' sisyphus dashboard Open TUI dashboard',\n ' tail -f ~/.sisyphus/daemon.log Watch daemon logs',\n '',\n ];\n\n if (keybindResult.status === 'installed') {\n lines.push(`Tmux keybind: ${keybindResult.message}`);\n } else if (keybindResult.status === 'conflict') {\n lines.push(`Keybind: ${keybindResult.message}`);\n }\n\n lines.push(\n '',\n 'Troubleshooting:',\n ' sisyphus doctor Check installation health',\n ' sisyphus setup-keybind [key] Configure tmux session-cycling keybind',\n ' sisyphus uninstall [--purge] Remove daemon and optionally all data',\n '',\n );\n\n console.log(lines.join('\\n'));\n}\n\nfunction testConnection(): Promise<void> {\n return new Promise((resolve, reject) => {\n const sock = connect(socketPath());\n sock.on('connect', () => { sock.destroy(); resolve(); });\n sock.on('error', (err) => { sock.destroy(); reject(err); });\n });\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport async function waitForDaemon(maxWaitMs = 6000): Promise<void> {\n const start = Date.now();\n let updatingLogged = false;\n\n while (Date.now() - start < maxWaitMs) {\n // Extend timeout if daemon is updating\n const updatingPath = daemonUpdatingPath();\n if (existsSync(updatingPath)) {\n if (!updatingLogged) {\n try {\n const version = readFileSync(updatingPath, 'utf-8').trim();\n console.log(`Updating sisyphus to ${version}...`);\n } catch {\n console.log('Updating sisyphus...');\n }\n updatingLogged = true;\n }\n maxWaitMs = Math.max(maxWaitMs, 30000);\n }\n\n if (existsSync(socketPath())) {\n try {\n await testConnection();\n return;\n } catch {\n // not ready yet\n }\n }\n await sleep(300);\n }\n throw new Error(`Daemon did not start within ${maxWaitMs}ms. Check ${daemonLogPath()}`);\n}\n","import { execSync } from 'node:child_process';\nimport { existsSync, mkdirSync, readFileSync, writeFileSync, chmodSync, unlinkSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { globalDir } from '../shared/paths.js';\n\nexport const DEFAULT_KEY = 'M-s';\n\nconst SISYPHUS_CONF_MARKER = '# sisyphus-managed — do not edit';\n\nexport function cycleScriptPath(): string {\n return join(globalDir(), 'bin', 'sisyphus-cycle');\n}\n\nexport function sisyphusTmuxConfPath(): string {\n return join(globalDir(), 'tmux.conf');\n}\n\nfunction userTmuxConfPath(): string | null {\n // Check both standard locations, preferring whichever exists\n const dotfile = join(homedir(), '.tmux.conf');\n const xdg = join(homedir(), '.config', 'tmux', 'tmux.conf');\n if (existsSync(xdg)) return xdg;\n if (existsSync(dotfile)) return dotfile;\n return null;\n}\n\nconst CYCLE_SCRIPT = `#!/bin/bash\ncwd=$(tmux show-option -v @sisyphus_cwd 2>/dev/null)\n[ -z \"$cwd\" ] && exit 0\ncurrent=$(tmux display-message -p '#{session_name}')\nsessions=()\nwhile IFS= read -r name; do\n scwd=$(tmux show-option -t \"$name\" -v @sisyphus_cwd 2>/dev/null)\n [ \"$scwd\" = \"$cwd\" ] && sessions+=(\"$name\")\ndone < <(tmux list-sessions -F '#{session_name}')\n(( \\${#sessions[@]} <= 1 )) && exit 0\nfor (( i=0; i<\\${#sessions[@]}; i++ )); do\n if [ \"\\${sessions[$i]}\" = \"$current\" ]; then\n next=$(( (i + 1) % \\${#sessions[@]} ))\n tmux switch-client -t \"\\${sessions[$next]}\"\n exit 0\n fi\ndone\ntmux switch-client -t \"\\${sessions[0]}\"\n`;\n\nexport function installCycleScript(): void {\n const scriptPath = cycleScriptPath();\n mkdirSync(join(globalDir(), 'bin'), { recursive: true });\n writeFileSync(scriptPath, CYCLE_SCRIPT, 'utf8');\n chmodSync(scriptPath, 0o755);\n}\n\nexport function getExistingBinding(key: string): string | null {\n try {\n const output = execSync('tmux list-keys', { stdio: ['pipe', 'pipe', 'pipe'] }).toString();\n for (const line of output.split('\\n')) {\n // lines look like: bind-key -T root M-s run-shell ...\n // or: bind-key -T root M-s run-shell ...\n if (line.includes(key)) {\n const parts = line.trim().split(/\\s+/);\n // Find the key in parts and check it matches exactly (not as substring of another key)\n const keyIdx = parts.indexOf(key);\n if (keyIdx !== -1) {\n return line.trim();\n }\n }\n }\n return null;\n } catch {\n // tmux not running or not available\n return null;\n }\n}\n\nexport function isSisyphusBinding(binding: string): boolean {\n return binding.includes('sisyphus');\n}\n\nexport type SetupResult =\n | { status: 'installed'; message: string }\n | { status: 'already-installed'; message: string }\n | { status: 'conflict'; message: string; existingBinding: string };\n\nexport function setupTmuxKeybind(key: string = DEFAULT_KEY): SetupResult {\n installCycleScript();\n\n // Check for existing binding before writing anything\n const existing = getExistingBinding(key);\n if (existing !== null && !isSisyphusBinding(existing)) {\n return {\n status: 'conflict',\n message: `Tmux key ${key} is already bound to something else. Run \"sisyphus setup-keybind <key>\" to use a different key.`,\n existingBinding: existing,\n };\n }\n\n // Write ~/.sisyphus/tmux.conf\n const confPath = sisyphusTmuxConfPath();\n const bindingLine = `bind-key -T root ${key} run-shell ${cycleScriptPath()}`;\n writeFileSync(confPath, `${SISYPHUS_CONF_MARKER}\\n${bindingLine}\\n`, 'utf8');\n\n // Append source line to tmux.conf if not already there\n const userConf = userTmuxConfPath();\n const sourceLine = `source-file ${confPath}`;\n const markedSourceLine = `${sourceLine} ${SISYPHUS_CONF_MARKER}`;\n let persistedToConf = false;\n\n if (userConf !== null) {\n const contents = readFileSync(userConf, 'utf8');\n if (!contents.includes(confPath)) {\n const separator = contents.endsWith('\\n') ? '' : '\\n';\n writeFileSync(userConf, `${contents}${separator}${markedSourceLine}\\n`, 'utf8');\n }\n persistedToConf = true;\n }\n\n // Apply binding live if tmux is running\n try {\n execSync(`tmux bind-key -T root ${key} run-shell ${cycleScriptPath()}`, { stdio: 'pipe' });\n } catch {\n // tmux not running — binding will take effect on next session start\n }\n\n if (existing !== null && isSisyphusBinding(existing)) {\n return {\n status: 'already-installed',\n message: `Tmux keybinding ${key} already configured for sisyphus.`,\n };\n }\n\n const persistNote = persistedToConf\n ? ''\n : `\\nNote: No tmux.conf found. Add this to your tmux config for persistence:\\n source-file ${confPath}`;\n return {\n status: 'installed',\n message: `Tmux keybinding set: ${key} cycles sisyphus sessions${persistNote}`,\n };\n}\n\nexport function removeTmuxKeybind(): void {\n // Remove source line from user's tmux.conf\n const confPath = sisyphusTmuxConfPath();\n // Check both possible tmux.conf locations\n for (const candidate of [join(homedir(), '.tmux.conf'), join(homedir(), '.config', 'tmux', 'tmux.conf')]) {\n if (existsSync(candidate)) {\n const contents = readFileSync(candidate, 'utf8');\n const filtered = contents\n .split('\\n')\n .filter((line) => !line.includes(confPath))\n .join('\\n');\n if (filtered !== contents) {\n writeFileSync(candidate, filtered, 'utf8');\n }\n }\n }\n\n // Remove ~/.sisyphus/tmux.conf\n if (existsSync(confPath)) {\n unlinkSync(confPath);\n }\n\n // Remove cycle script\n const scriptPath = cycleScriptPath();\n if (existsSync(scriptPath)) {\n unlinkSync(scriptPath);\n }\n}\n","import { execSync } from 'node:child_process';\n\nexport function assertTmux(): void {\n if (!process.env.TMUX) {\n throw new Error('Not running inside a tmux pane. Sisyphus requires tmux.');\n }\n}\n\nexport function getTmuxSession(): string {\n assertTmux();\n return execSync('tmux display-message -p \"#{session_name}\"', { encoding: 'utf8' }).trim();\n}\n\nexport function getTmuxWindow(): string {\n assertTmux();\n return execSync('tmux display-message -p \"#{window_id}\"', { encoding: 'utf8' }).trim();\n}\n","import type { Command } from 'commander';\nimport { join } from 'node:path';\nimport { execSync } from 'node:child_process';\nimport { assertTmux, getTmuxSession } from '../tmux.js';\n\nfunction shellQuote(s: string): string {\n return `'${s.replace(/'/g, \"'\\\\''\")}'`;\n}\n\nexport function isDashboardOpen(tmuxSession: string): boolean {\n try {\n const windows = execSync(\n `tmux list-windows -t ${shellQuote(tmuxSession)} -F \"#{window_name}\"`,\n { encoding: 'utf-8' },\n );\n return windows.split('\\n').some(name => name.trim() === 'sisyphus-dashboard');\n } catch {\n return false;\n }\n}\n\nexport function launchDashboard(tmuxSession: string, cwd: string): void {\n const tuiPath = join(import.meta.dirname, 'tui.js');\n\n const windowId = execSync(\n `tmux new-window -n \"sisyphus-dashboard\" -c ${shellQuote(cwd)} -P -F \"#{window_id}\"`,\n { encoding: 'utf-8' },\n ).trim();\n\n const cmd = `node ${shellQuote(tuiPath)} --cwd ${shellQuote(cwd)}`;\n execSync(\n `tmux send-keys -t ${shellQuote(windowId)} ${shellQuote(cmd)} Enter`,\n );\n}\n\nexport function registerDashboard(program: Command): void {\n program\n .command('dashboard')\n .description('Launch the TUI dashboard for monitoring and managing sessions')\n .action(async () => {\n assertTmux();\n const tmuxSession = getTmuxSession();\n const cwd = process.cwd();\n launchDashboard(tmuxSession, cwd);\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';\nimport { assertTmux } from '../tmux.js';\n\nexport function registerSpawn(program: Command): void {\n program\n .command('spawn')\n .description('Spawn a new agent (orchestrator only)')\n .argument('[instruction]', 'Task instruction for the agent')\n .option('--agent-type <type>', 'Agent role label (default: worker)', 'worker')\n .requiredOption('--name <name>', 'Agent name')\n .option('--instruction <instruction>', 'Task instruction for the agent (or pipe via stdin)')\n .option('--worktree', 'Spawn agent in an isolated git worktree')\n .action(async (positionalInstruction: string | undefined, opts: { agentType: string; name: string; instruction?: string; worktree?: boolean }) => {\n assertTmux();\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 instruction = opts.instruction ?? positionalInstruction ?? await readStdin();\n if (!instruction) {\n console.error('Error: --instruction is required (or pipe via stdin)');\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,\n ...(opts.worktree ? { worktree: true } : {}),\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","import { execSync } from 'node:child_process';\nimport type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport { readStdin } from '../stdin.js';\nimport { assertTmux } from '../tmux.js';\n\nfunction isInWorktree(): boolean {\n try {\n const gitDir = execSync('git rev-parse --git-dir', { encoding: 'utf-8' }).trim();\n const commonDir = execSync('git rev-parse --git-common-dir', { encoding: 'utf-8' }).trim();\n return gitDir !== commonDir;\n } catch {\n return false;\n }\n}\n\nfunction getUncommittedChanges(): string | null {\n try {\n const status = execSync('git status --porcelain', { encoding: 'utf-8' }).trim();\n return status || null;\n } catch {\n return null;\n }\n}\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 assertTmux();\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 // Block submit if worktree has uncommitted changes — they'd be lost on merge\n if (isInWorktree()) {\n const changes = getUncommittedChanges();\n if (changes) {\n console.error('Error: uncommitted changes in worktree. Your branch is merged automatically after submit — uncommitted work will be lost.');\n console.error('\\nCommit first:\\n git add -A && git commit -m \"description of changes\"\\n');\n console.error('Or discard:\\n git checkout -- .\\n');\n console.error('Uncommitted changes:');\n console.error(changes);\n process.exit(1);\n }\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';\nimport { assertTmux } from '../tmux.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 .option('--mode <mode>', 'System prompt mode for next cycle (planning, implementation)')\n .action(async (opts: { prompt?: string; mode?: string }) => {\n assertTmux();\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, mode: opts.mode };\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';\nimport { assertTmux } from '../tmux.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 assertTmux();\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(`\\nFollow up:`);\n console.log(` sisyphus continue # reactivate and keep working`);\n console.log(` sisyphus resume ${sessionId} \"new instructions\" # respawn orchestrator externally`);\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 { assertTmux } from '../tmux.js';\n\nexport function registerContinue(program: Command): void {\n program\n .command('continue')\n .description('Reactivate a completed session (orchestrator only)')\n .action(async () => {\n assertTmux();\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: 'continue', sessionId };\n const response = await sendRequest(request);\n if (response.ok) {\n console.log('Session reactivated. Plan cleared.');\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import { readFileSync } from 'node:fs';\nimport type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport type { Session, Agent, OrchestratorCycle } from '../../shared/types.js';\nimport { computeActiveTimeMs } from '../../shared/utils.js';\nimport { roadmapPath } from '../../shared/paths.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};\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 if (!color) return `${text}${RESET}`;\n return `${color}${text}${RESET}`;\n}\n\nfunction formatMs(ms: number): string {\n const totalSeconds = Math.floor(ms / 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 formatDuration(startOrMs: string | number, endIso?: string | null): string {\n if (typeof startOrMs === 'number') return formatMs(startOrMs);\n const start = new Date(startOrMs).getTime();\n const end = endIso ? new Date(endIso).getTime() : Date.now();\n return formatMs(end - start);\n}\n\nfunction inferOrchestratorPhase(session: Session): string {\n const cycles = session.orchestratorCycles;\n if (cycles.length === 0) return 'planning';\n const lastCycle = cycles[cycles.length - 1];\n\n if (!lastCycle.completedAt) {\n // Orchestrator pane is alive\n const elapsed = Date.now() - new Date(lastCycle.timestamp).getTime();\n if (elapsed < 5000 || lastCycle.agentsSpawned.length === 0) return 'planning';\n return 'spawning';\n } else {\n // Orchestrator yielded\n const runningAgents = session.agents.filter(\n a => lastCycle.agentsSpawned.includes(a.id) && a.status === 'running'\n );\n if (runningAgents.length > 0) {\n return `waiting on ${runningAgents.map(a => a.id).join(', ')}`;\n }\n return 'starting';\n }\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 formatCycle(cycle: OrchestratorCycle, phase?: string): string {\n let duration: string;\n if (cycle.completedAt) {\n duration = ` ${DIM}(${formatDuration(cycle.timestamp, cycle.completedAt)})${RESET}`;\n } else {\n const elapsed = formatDuration(cycle.timestamp, null);\n duration = ` ${DIM}(running, ${elapsed})${RESET}`;\n }\n const agents = cycle.agentsSpawned.length > 0\n ? ` — agents: ${cycle.agentsSpawned.join(', ')}`\n : '';\n const phaseStr = phase ? ` — orchestrator: ${phase}` : '';\n return ` Cycle ${cycle.cycle}${duration}${agents}${phaseStr}`;\n}\n\nfunction computeLastActivity(session: Session): Date | null {\n const timestamps: number[] = [];\n\n for (const cycle of session.orchestratorCycles) {\n timestamps.push(new Date(cycle.timestamp).getTime());\n if (cycle.completedAt) timestamps.push(new Date(cycle.completedAt).getTime());\n }\n\n for (const agent of session.agents) {\n timestamps.push(new Date(agent.spawnedAt).getTime());\n if (agent.completedAt) timestamps.push(new Date(agent.completedAt).getTime());\n for (const r of agent.reports) {\n timestamps.push(new Date(r.timestamp).getTime());\n }\n }\n\n if (timestamps.length === 0) return null;\n return new Date(Math.max(...timestamps));\n}\n\nfunction readRoadmapTodos(cwd: string, sessionId: string): string[] {\n try {\n const content = readFileSync(roadmapPath(cwd, sessionId), 'utf8');\n return content\n .split('\\n')\n .filter(line => /^\\s*- \\[ \\]/.test(line))\n .map(line => line.replace(/^\\s*- \\[ \\]\\s*/, ''))\n .slice(0, 5);\n } catch {\n return [];\n }\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 if (session.context) {\n const truncated = session.context.length > 120 ? session.context.slice(0, 120) + '...' : session.context;\n console.log(` Context: ${truncated}`);\n }\n console.log(` CWD: ${session.cwd}`);\n console.log(` Created: ${session.createdAt}`);\n const activeTime = formatDuration(computeActiveTimeMs(session));\n console.log(` Duration: ${sessionDuration}${session.completedAt ? '' : ' (ongoing)'} (${activeTime} active)`);\n\n const lastActivity = computeLastActivity(session);\n if (lastActivity) {\n console.log(` Last activity: ${formatMs(Date.now() - lastActivity.getTime())} ago`);\n }\n\n console.log(` Orchestrator cycles: ${session.orchestratorCycles.length}`);\n\n // Active agents block\n const runningAgents = session.agents.filter(a => a.status === 'running');\n if (runningAgents.length > 0) {\n console.log(`\\n${BOLD}Active agents (${runningAgents.length}):${RESET}`);\n for (const agent of runningAgents) {\n const name = `${BOLD}${agent.name}${RESET}`;\n const type = `${DIM}(${agent.agentType})${RESET}`;\n const duration = formatDuration(agent.spawnedAt, null);\n console.log(` ${agent.id} ${name} ${type} running ${duration}`);\n }\n }\n\n // Roadmap pending todos\n const todos = readRoadmapTodos(session.cwd, session.id);\n if (todos.length > 0) {\n console.log(`\\n${BOLD}Remaining (${todos.length} unchecked):${RESET}`);\n for (const todo of todos) {\n console.log(` - ${todo}`);\n }\n }\n\n if (session.orchestratorCycles.length > 0) {\n console.log(`\\n ${BOLD}Cycles:${RESET}`);\n const cycles = session.orchestratorCycles;\n for (let i = 0; i < cycles.length; i++) {\n const isLast = i === cycles.length - 1;\n const phase = isLast && session.status === 'active' ? inferOrchestratorPhase(session) : undefined;\n console.log(formatCycle(cycles[i], phase));\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 { basename } from 'node:path';\n\ninterface SessionSummary {\n id: string;\n task: string;\n status: string;\n agentCount: number;\n createdAt: string;\n cwd?: 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\nfunction truncateTask(task: string, max: number): string {\n if (task.length <= max) return task;\n return task.slice(0, max - 1) + '…';\n}\n\nexport function registerList(program: Command): void {\n program\n .command('list')\n .description('List sessions (defaults to current project)')\n .option('-a, --all', 'Show sessions from all projects')\n .action(async (opts: { all?: boolean }) => {\n const cwd = process.cwd();\n const request: Request = { type: 'list', cwd, all: opts.all };\n const response = await sendRequest(request);\n if (response.ok) {\n const sessions = (response.data?.sessions ?? []) as SessionSummary[];\n const totalCount = response.data?.totalCount as number | undefined;\n const filtered = response.data?.filtered as boolean | undefined;\n\n if (sessions.length === 0) {\n if (filtered && totalCount && totalCount > 0) {\n console.log(`No sessions in this project. ${totalCount} session(s) in other projects.`);\n console.log(`${DIM}Run ${RESET}sisyphus list --all${DIM} to show all.${RESET}`);\n } else {\n console.log('No sessions');\n }\n return;\n }\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 const task = truncateTask(s.task, 60);\n const cwdLabel = opts.all && s.cwd ? ` ${DIM}${basename(s.cwd)}${RESET}` : '';\n console.log(` ${BOLD}${s.id}${RESET} ${status} ${agents} ${task}${cwdLabel}`);\n }\n\n if (filtered && totalCount && totalCount > sessions.length) {\n const otherCount = totalCount - sessions.length;\n console.log(`\\n${DIM}${otherCount} more session(s) in other projects. Run ${RESET}sisyphus list --all${DIM} to show all.${RESET}`);\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';\nimport { assertTmux } from '../tmux.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 assertTmux();\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 { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\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 cwd = process.cwd();\n const request: Request = { type: 'resume', sessionId, cwd, message };\n const response = await sendRequest(request);\n if (response.ok) {\n const tmuxSessionName = response.data?.tmuxSessionName as string | undefined;\n console.log(`Session ${sessionId} resumed`);\n if (tmuxSessionName) {\n console.log(`Tmux session: ${tmuxSessionName}`);\n console.log(` tmux attach -t ${tmuxSessionName}`);\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","import type { Command } from 'commander';\nimport { createInterface } from 'node:readline';\nimport { uninstallDaemon } from '../install.js';\n\nasync function confirm(question: string): Promise<boolean> {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer.trim().toLowerCase() === 'y');\n });\n });\n}\n\nexport function registerUninstall(program: Command): void {\n program\n .command('uninstall')\n .description('Unload the sisyphus daemon from launchd and remove the plist')\n .option('--purge', 'Also remove all session data in ~/.sisyphus')\n .option('-y, --yes', 'Skip confirmation prompt for --purge')\n .action(async (opts: { purge?: boolean; yes?: boolean }) => {\n const purge = opts.purge ?? false;\n\n if (purge && !opts.yes) {\n const ok = await confirm('This will delete all session data in ~/.sisyphus. Continue? (y/N) ');\n if (!ok) {\n console.log('Aborted.');\n return;\n }\n }\n\n await uninstallDaemon(purge);\n });\n}\n","import type { Command } from 'commander';\nimport { rawSend } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\n\nexport function registerNotify(program: Command): void {\n const notify = program\n .command('notify')\n .description('Internal notifications (fire-and-forget)');\n\n notify\n .command('pane-exited')\n .description('Notify daemon that a tmux pane exited')\n .requiredOption('--pane-id <paneId>', 'Pane ID that exited')\n .action(async (opts: { paneId: string }) => {\n try {\n const request: Request = { type: 'pane-exited', paneId: opts.paneId };\n await rawSend(request);\n } catch {\n // Fire-and-forget: daemon may be stopped, socket gone, etc.\n }\n });\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport type { MessageSource } from '../../shared/types.js';\n\nexport function registerMessage(program: Command): void {\n program\n .command('message <content>')\n .description('Queue a message for the orchestrator to see on next cycle')\n .option('--session <sessionId>', 'Session ID (defaults to SISYPHUS_SESSION_ID env var)')\n .action(async (content: string, opts: { session?: string }) => {\n const sessionId = opts.session ?? process.env.SISYPHUS_SESSION_ID;\n if (!sessionId) {\n console.error('Error: provide --session or set SISYPHUS_SESSION_ID environment variable');\n process.exit(1);\n }\n\n const source: MessageSource | undefined = process.env.SISYPHUS_AGENT_ID\n ? { type: 'agent' as const, agentId: process.env.SISYPHUS_AGENT_ID }\n : undefined;\n\n const request: Request = { type: 'message', sessionId, content, source };\n const response = await sendRequest(request);\n if (response.ok) {\n console.log('Message queued');\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 registerUpdateTask(program: Command): void {\n program\n .command('update-task <task>')\n .description('Update the session task/goal')\n .option('--session <sessionId>', 'Session ID (defaults to SISYPHUS_SESSION_ID env var)')\n .action(async (task: string, opts: { session?: string }) => {\n const sessionId = opts.session ?? process.env.SISYPHUS_SESSION_ID;\n if (!sessionId) {\n console.error('Error: provide --session or set SISYPHUS_SESSION_ID environment variable');\n process.exit(1);\n }\n\n const request: Request = { type: 'update-task', sessionId, task };\n const response = await sendRequest(request);\n if (response.ok) {\n console.log('Task updated');\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 registerRollback(program: Command): void {\n program\n .command('rollback <sessionId> <cycle>')\n .description('Roll back a session to a previous cycle boundary')\n .action(async (sessionId: string, cycleStr: string) => {\n const toCycle = parseInt(cycleStr, 10);\n if (isNaN(toCycle) || toCycle < 1) {\n console.error('Error: cycle must be a positive integer');\n process.exit(1);\n }\n\n const request: Request = { type: 'rollback', sessionId, cwd: process.cwd(), toCycle };\n const response = await sendRequest(request);\n if (response.ok) {\n const data = response.data as { restoredToCycle: number };\n console.log(`Session ${sessionId} rolled back to cycle ${data.restoredToCycle}.`);\n console.log(`Session is now paused. Use 'sisyphus resume ${sessionId}' to respawn the orchestrator.`);\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 registerRestartAgent(program: Command): void {\n program\n .command('restart-agent <agentId>')\n .description('Restart a failed/killed/lost agent in a new tmux pane')\n .option('-s, --session <sessionId>', 'Session ID (defaults to SISYPHUS_SESSION_ID)')\n .action(async (agentId: string, opts: { session?: string }) => {\n const sessionId = opts.session ?? process.env.SISYPHUS_SESSION_ID;\n if (!sessionId) {\n console.error('Error: No session ID. Use --session or set SISYPHUS_SESSION_ID.');\n process.exit(1);\n }\n\n const request: Request = { type: 'restart-agent', sessionId, agentId };\n const response = await sendRequest(request);\n if (response.ok) {\n console.log(`Agent ${agentId} restarted.`);\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { DEFAULT_KEY, setupTmuxKeybind } from '../tmux-setup.js';\n\nexport function registerSetupKeybind(program: Command): void {\n program\n .command('setup-keybind [key]')\n .description('Install the sisyphus-cycle tmux keybinding (default: M-s)')\n .action(async (key: string | undefined) => {\n const resolvedKey = key ?? DEFAULT_KEY;\n const result = setupTmuxKeybind(resolvedKey);\n\n switch (result.status) {\n case 'installed':\n console.log(result.message);\n break;\n case 'already-installed':\n console.log(result.message);\n break;\n case 'conflict':\n console.log(`Key ${resolvedKey} is already bound:`);\n console.log(` ${result.existingBinding}`);\n console.log('');\n console.log('Use a different key, e.g.:');\n console.log(' sisyphus setup-keybind M-S');\n console.log(' sisyphus setup-keybind M-w');\n console.log(' sisyphus setup-keybind M-j');\n break;\n }\n });\n}\n","import { execSync } from 'node:child_process';\nimport { existsSync, statSync } from 'node:fs';\nimport type { Command } from 'commander';\nimport { daemonLogPath, daemonPidPath, globalDir, socketPath } from '../../shared/paths.js';\nimport { isInstalled } from '../install.js';\nimport { cycleScriptPath, DEFAULT_KEY, getExistingBinding, isSisyphusBinding, sisyphusTmuxConfPath } from '../tmux-setup.js';\n\ninterface Check {\n name: string;\n status: 'ok' | 'warn' | 'fail';\n detail: string;\n fix?: string;\n}\n\nfunction checkDaemonInstalled(): Check {\n if (isInstalled()) {\n return { name: 'Daemon plist', status: 'ok', detail: 'Installed in LaunchAgents' };\n }\n return {\n name: 'Daemon plist',\n status: 'fail',\n detail: 'Not installed',\n fix: 'Run any sisyphus command to auto-install, or: sisyphus start \"test\"',\n };\n}\n\nfunction checkDaemonRunning(): Check {\n const pid = daemonPidPath();\n if (!existsSync(pid)) {\n return {\n name: 'Daemon process',\n status: 'fail',\n detail: 'No PID file found',\n fix: 'launchctl load -w ~/Library/LaunchAgents/com.sisyphus.daemon.plist',\n };\n }\n try {\n const sock = socketPath();\n execSync(`test -S \"${sock}\"`, { stdio: 'pipe' });\n return { name: 'Daemon process', status: 'ok', detail: `Socket at ${sock}` };\n } catch {\n return {\n name: 'Daemon process',\n status: 'warn',\n detail: 'PID file exists but socket not found',\n fix: `Check logs: tail -20 ${daemonLogPath()}`,\n };\n }\n}\n\nfunction checkTmux(): Check {\n try {\n execSync('which tmux', { stdio: 'pipe' });\n } catch {\n return { name: 'tmux', status: 'fail', detail: 'Not found on PATH', fix: 'brew install tmux' };\n }\n try {\n execSync('tmux list-sessions', { stdio: 'pipe' });\n return { name: 'tmux', status: 'ok', detail: 'Running' };\n } catch {\n return { name: 'tmux', status: 'warn', detail: 'Installed but no server running' };\n }\n}\n\nfunction checkCycleScript(): Check {\n const path = cycleScriptPath();\n if (!existsSync(path)) {\n return {\n name: 'Cycle script',\n status: 'fail',\n detail: `Not found at ${path}`,\n fix: 'sisyphus setup-keybind',\n };\n }\n try {\n const mode = statSync(path).mode;\n if ((mode & 0o111) === 0) {\n return {\n name: 'Cycle script',\n status: 'fail',\n detail: 'Not executable',\n fix: `chmod +x ${path}`,\n };\n }\n } catch { /* ignore stat errors */ }\n return { name: 'Cycle script', status: 'ok', detail: path };\n}\n\nfunction checkTmuxKeybind(): Check {\n const existing = getExistingBinding(DEFAULT_KEY);\n if (existing === null) {\n // Also check if the sisyphus tmux.conf exists (binding might be configured but tmux not running)\n if (existsSync(sisyphusTmuxConfPath())) {\n return {\n name: `Tmux keybind (${DEFAULT_KEY})`,\n status: 'warn',\n detail: 'Configured in sisyphus tmux.conf but not active (tmux may not be running)',\n };\n }\n return {\n name: `Tmux keybind (${DEFAULT_KEY})`,\n status: 'fail',\n detail: 'Not bound',\n fix: 'sisyphus setup-keybind',\n };\n }\n if (isSisyphusBinding(existing)) {\n return { name: `Tmux keybind (${DEFAULT_KEY})`, status: 'ok', detail: 'Bound to sisyphus-cycle' };\n }\n return {\n name: `Tmux keybind (${DEFAULT_KEY})`,\n status: 'warn',\n detail: `Bound to something else: ${existing}`,\n fix: 'sisyphus setup-keybind M-S (or another free key)',\n };\n}\n\nfunction checkGlobalDir(): Check {\n const dir = globalDir();\n if (existsSync(dir)) {\n return { name: 'Data directory', status: 'ok', detail: dir };\n }\n return { name: 'Data directory', status: 'warn', detail: `${dir} does not exist (created on first use)` };\n}\n\nconst SYMBOLS = { ok: '\\u2713', warn: '!', fail: '\\u2717' } as const;\n\nexport function registerDoctor(program: Command): void {\n program\n .command('doctor')\n .description('Check sisyphus installation health')\n .action(async () => {\n const checks: Check[] = [\n checkGlobalDir(),\n checkDaemonInstalled(),\n checkDaemonRunning(),\n checkTmux(),\n checkCycleScript(),\n checkTmuxKeybind(),\n ];\n\n let hasIssues = false;\n for (const c of checks) {\n const sym = SYMBOLS[c.status];\n console.log(` ${sym} ${c.name}: ${c.detail}`);\n if (c.status !== 'ok') hasIssues = true;\n }\n\n // Print fixes\n const fixable = checks.filter((c) => c.fix);\n if (fixable.length > 0) {\n console.log('\\nFixes:');\n for (const c of fixable) {\n console.log(` ${c.name}: ${c.fix}`);\n }\n }\n\n if (!hasIssues) {\n console.log('\\nAll checks passed.');\n }\n });\n}\n"],"mappings":"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","names":["execSync","connect","execSync","existsSync","mkdirSync","readFileSync","unlinkSync","writeFileSync","homedir","join","join","homedir","existsSync","mkdirSync","writeFileSync","execSync","unlinkSync","resolve","readFileSync","resolve","connect","sleep","execSync","join","execSync","execSync","join","program","shellQuote","program","execSync","resolve","program","execSync","execSync","program","program","program","program","readFileSync","readFileSync","program","STATUS_COLORS","RESET","BOLD","DIM","program","program","program","program","resolve","program","program","program","program","program","program","program","execSync","existsSync","existsSync","execSync","program"]}
|