sisyphi 1.0.13 → 1.0.14

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/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/index.ts","../src/cli/commands/start.ts","../src/cli/install.ts","../src/cli/tmux-setup.ts","../src/cli/client.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","../src/cli/commands/companion-context.ts","../src/cli/commands/getting-started.ts","../src/cli/commands/init.ts"],"sourcesContent":["const nodeVersion = parseInt(process.versions.node.split('.')[0]!, 10);\nif (nodeVersion < 22) {\n console.error(`Sisyphus requires Node.js v22+ (current: v${process.versions.node})`);\n process.exit(1);\n}\n\nimport { Command } from 'commander';\nimport { existsSync, mkdirSync } from 'node:fs';\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';\nimport { registerCompanionContext } from './commands/companion-context.js';\nimport { registerGettingStarted } from './commands/getting-started.js';\nimport { registerInit } from './commands/init.js';\nimport { globalDir } from '../shared/paths.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\nprogram.configureHelp({\n sortSubcommands: false,\n});\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);\nregisterCompanionContext(program);\nregisterGettingStarted(program);\nregisterInit(program);\n\nprogram.addHelpText('after', `\nExamples:\n $ sisyphus start \"Implement auth system\" Start a new session\n $ sisyphus start \"Build @spec.md\" -n auth Start with a name and spec reference\n $ sisyphus status Check current sessions\n $ sisyphus dashboard Open the TUI\n $ sisyphus doctor Verify installation\n\nRun 'sisyphus getting-started' for a complete usage guide.\n`);\n\n// Show welcome on first run (before ~/.sisyphus exists)\nconst args = process.argv.slice(2);\nconst firstArg = args[0];\nconst skipWelcome = ['doctor', 'getting-started', 'help', '--help', '-h', 'init', 'uninstall', '--version', '-V'];\nif (!existsSync(globalDir()) && firstArg && !skipWelcome.includes(firstArg)) {\n mkdirSync(globalDir(), { recursive: true });\n console.log('');\n console.log(' Welcome to Sisyphus — multi-agent orchestration for Claude Code.');\n console.log('');\n console.log(' First time? Run these commands:');\n console.log(' sisyphus doctor Check your setup');\n console.log(' sisyphus getting-started Learn the basics');\n console.log('');\n}\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, isTmuxInstalled } from '../tmux.js';\nimport { shellQuote } from '../../shared/shell.js';\nimport { ensureDashboard } from './dashboard.js';\nimport type { Request } from '../../shared/protocol.js';\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 .option('--no-tmux-check', 'Skip the tmux session check')\n .action(async (task: string, opts: { context?: string; name?: string; tmuxCheck?: boolean }) => {\n const cwd = process.env['SISYPHUS_CWD'] ?? process.cwd();\n\n if (!process.env['TMUX'] && opts.tmuxCheck !== false) {\n if (!isTmuxInstalled()) {\n console.error('Error: tmux is not installed. Sisyphus requires tmux for agent panes.');\n console.error(' Install: brew install tmux (macOS) or apt install tmux (Linux)');\n console.error(' Then: tmux new-session');\n process.exit(1);\n }\n console.error('Error: Not running inside a tmux session.');\n console.error(' Sisyphus uses tmux to manage agent panes.');\n console.error(' Start a tmux session first: tmux new-session');\n console.error('');\n console.error(' To skip this check: sisyphus start --no-tmux-check \"task\"');\n process.exit(1);\n }\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 (ensureDashboard(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 { 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 ];\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 'Run `sisyphus getting-started` for a complete usage guide.',\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';\nexport const DEFAULT_HOME_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 homeScriptPath(): string {\n return join(globalDir(), 'bin', 'sisyphus-home');\n}\n\nexport function killPaneScriptPath(): string {\n return join(globalDir(), 'bin', 'sisyphus-kill-pane');\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\nconst HOME_SCRIPT = `#!/bin/bash\n# Jump to the home (non-sisyphus) session that has the dashboard window\ncwd=$(tmux show-option -v @sisyphus_cwd 2>/dev/null)\n[ -z \"$cwd\" ] && exit 0\nwhile IFS= read -r name; do\n # Skip sisyphus agent/orchestrator sessions\n case \"$name\" in sisyphus-*) continue ;; esac\n scwd=$(tmux show-option -t \"$name\" -v @sisyphus_cwd 2>/dev/null)\n if [ \"$scwd\" = \"$cwd\" ]; then\n tmux switch-client -t \"$name\"\n # Focus the dashboard window if it exists\n tmux select-window -t \"$name:sisyphus-dashboard\" 2>/dev/null\n exit 0\n fi\ndone < <(tmux list-sessions -F '#{session_name}')\n`;\n\nconst KILL_PANE_SCRIPT = `#!/bin/bash\n# prefix-x override for sisyphus sessions.\n# If this is the last pane, switch to the home session before killing.\nsession=$(tmux display-message -p '#{session_name}')\npane_count=$(tmux list-panes -t \"$session\" -F '#{pane_id}' | wc -l | tr -d ' ')\n\nif [ \"$pane_count\" -le 1 ]; then\n # Last pane — find home session, switch there, then kill sisyphus session\n cwd=$(tmux show-option -t \"$session\" -v @sisyphus_cwd 2>/dev/null)\n if [ -n \"$cwd\" ]; then\n while IFS= read -r name; do\n case \"$name\" in sisyphus-*) continue ;; esac\n scwd=$(tmux show-option -t \"$name\" -v @sisyphus_cwd 2>/dev/null)\n if [ \"$scwd\" = \"$cwd\" ]; then\n tmux switch-client -t \"$name\"\n tmux select-window -t \"$name:sisyphus-dashboard\" 2>/dev/null\n tmux kill-session -t \"$session\"\n exit 0\n fi\n done < <(tmux list-sessions -F '#{session_name}')\n fi\n # No home session found — just kill the pane\n tmux kill-pane\nelse\n # Multiple panes — kill this one and rebalance\n tmux kill-pane\n tmux select-layout even-horizontal\nfi\n`;\n\nexport function installCycleScript(): void {\n mkdirSync(join(globalDir(), 'bin'), { recursive: true });\n const scriptPath = cycleScriptPath();\n writeFileSync(scriptPath, CYCLE_SCRIPT, 'utf8');\n chmodSync(scriptPath, 0o755);\n}\n\nexport function installHomeScript(): void {\n mkdirSync(join(globalDir(), 'bin'), { recursive: true });\n const scriptPath = homeScriptPath();\n writeFileSync(scriptPath, HOME_SCRIPT, 'utf8');\n chmodSync(scriptPath, 0o755);\n}\n\nexport function installKillPaneScript(): void {\n mkdirSync(join(globalDir(), 'bin'), { recursive: true });\n const scriptPath = killPaneScriptPath();\n writeFileSync(scriptPath, KILL_PANE_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, homeKey: string = DEFAULT_HOME_KEY): SetupResult {\n installCycleScript();\n installHomeScript();\n installKillPaneScript();\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 // Check home key for conflicts too (only if different from cycle key)\n if (homeKey !== key) {\n const existingHome = getExistingBinding(homeKey);\n if (existingHome !== null && !isSisyphusBinding(existingHome)) {\n return {\n status: 'conflict',\n message: `Tmux key ${homeKey} is already bound to something else.`,\n existingBinding: existingHome,\n };\n }\n }\n\n // Write ~/.sisyphus/tmux.conf with keybindings + prefix-x override\n const confPath = sisyphusTmuxConfPath();\n const cycleBinding = `bind-key -T root ${key} run-shell ${cycleScriptPath()}`;\n const homeBinding = `bind-key -T root ${homeKey} run-shell ${homeScriptPath()}`;\n const killPaneOverride = `bind-key -T prefix x if-shell \"tmux display-message -p '#{session_name}' | grep -q '^sisyphus-'\" \"run-shell ${killPaneScriptPath()}\" \"kill-pane \\\\; select-layout even-horizontal\"`;\n writeFileSync(confPath, `${SISYPHUS_CONF_MARKER}\\n${cycleBinding}\\n${homeBinding}\\n${killPaneOverride}\\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 bindings live if tmux is running\n try {\n execSync(`tmux bind-key -T root ${key} run-shell ${cycleScriptPath()}`, { stdio: 'pipe' });\n execSync(`tmux bind-key -T root ${homeKey} run-shell ${homeScriptPath()}`, { stdio: 'pipe' });\n execSync(`tmux ${killPaneOverride}`, { stdio: 'pipe' });\n } catch {\n // tmux not running — bindings will take effect on next session start\n }\n\n if (existing !== null && isSisyphusBinding(existing)) {\n return {\n status: 'already-installed',\n message: `Tmux keybindings ${key} (cycle) and ${homeKey} (dashboard) 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 keybindings set: ${key} cycles sessions, ${homeKey} jumps to dashboard${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 // Restore default prefix-x binding if tmux is running\n try {\n execSync('tmux bind-key -T prefix x kill-pane \\\\; select-layout even-horizontal', { stdio: 'pipe' });\n } catch {\n // tmux not running\n }\n\n // Remove scripts\n for (const scriptPath of [cycleScriptPath(), homeScriptPath(), killPaneScriptPath()]) {\n if (existsSync(scriptPath)) {\n unlinkSync(scriptPath);\n }\n }\n}\n","import type { Request, Response } from '../shared/protocol.js';\nimport { rawSend as sharedRawSend } from '../shared/client.js';\nimport { ensureDaemonInstalled, waitForDaemon } from './install.js';\n\nexport function rawSend(request: Request): Promise<Response> {\n return sharedRawSend(request, 10_000);\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 const lines = [`Sisyphus daemon is not running.`];\n if (process.platform === 'linux') {\n lines.push(\n '',\n ' Start options:',\n ' sisyphusd & # Run in background',\n ' nohup sisyphusd > ~/.sisyphus/daemon.log 2>&1 & # Persist after logout',\n '',\n ' For systemd (recommended):',\n ' # Create ~/.config/systemd/user/sisyphus.service with:',\n ' # [Unit]',\n ' # Description=Sisyphus Daemon',\n ' # [Service]',\n ' # ExecStart=/usr/bin/env node <path-to-sisyphusd>',\n ' # Restart=always',\n ' # [Install]',\n ' # WantedBy=default.target',\n ' systemctl --user enable --now sisyphus',\n );\n } else {\n lines.push(\n '',\n ' Start it manually: sisyphusd &',\n );\n }\n lines.push(\n '',\n ' Diagnose: sisyphus doctor',\n ' Logs: tail -f ~/.sisyphus/daemon.log',\n );\n throw new Error(lines.join('\\n'));\n }\n throw lastErr;\n}\n","import { execSync } from 'node:child_process';\n\nexport function isTmuxInstalled(): boolean {\n try {\n execSync('which tmux', { stdio: 'pipe' });\n return true;\n } catch {\n return false;\n }\n}\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\n","import type { Command } from 'commander';\nimport { join } from 'node:path';\nimport { execSync } from 'node:child_process';\nimport { assertTmux, getTmuxSession } from '../tmux.js';\nimport { shellQuote } from '../../shared/shell.js';\n\n\n/**\n * Ensures a dashboard window exists in the given tmux session.\n * If one is already open, focuses it. Otherwise launches a new one.\n * Returns true if a new dashboard was created, false if an existing one was focused.\n */\nexport function ensureDashboard(tmuxSession: string, cwd: string): boolean {\n try {\n const windows = execSync(\n `tmux list-windows -t ${shellQuote(tmuxSession)} -F \"#{window_name}\"`,\n { encoding: 'utf-8' },\n );\n const isOpen = windows.split('\\n').some(name => name.trim() === 'sisyphus-dashboard');\n\n if (isOpen) {\n execSync(\n `tmux select-window -t ${shellQuote(tmuxSession)}:sisyphus-dashboard`,\n );\n return false;\n }\n } catch {\n // tmux error — proceed to launch\n }\n\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 return true;\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 ensureDashboard(tmuxSession, process.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('Clear roadmap and continue working on a completed session (stays in current cycle)')\n .addHelpText('after', '\\n Use `continue` when a session completed but you want to add more work.\\n Use `resume` when you want to restart with specific new instructions.\\n')\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';\nimport { formatDuration, statusColor } from '../../shared/format.js';\n\nconst COLOR_CODES: Record<string, string> = {\n green: '\\x1b[32m', yellow: '\\x1b[33m', cyan: '\\x1b[36m',\n red: '\\x1b[31m', gray: '\\x1b[90m', white: '\\x1b[37m',\n};\nconst RESET = '\\x1b[0m';\nconst BOLD = '\\x1b[1m';\nconst DIM = '\\x1b[2m';\n\nfunction colorize(text: string, status: string): string {\n const colorName = statusColor(status);\n const code = COLOR_CODES[colorName];\n if (!code) return `${text}\\x1b[0m`;\n return `${code}${text}\\x1b[0m`;\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: ${formatDuration(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('Respawn orchestrator with new instructions (for paused/completed sessions)')\n .addHelpText('after', '\\n Use `resume` to restart a paused or completed session with new instructions.\\n Use `continue` to keep working on a completed session without new instructions.\\n')\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 checkNodeVersion(): Check {\n const major = parseInt(process.versions.node.split('.')[0]!, 10);\n if (major < 22) {\n return { name: 'Node.js', status: 'fail', detail: `v${process.versions.node} (v22+ required)`, fix: 'Install Node.js 22+: https://nodejs.org' };\n }\n return { name: 'Node.js', status: 'ok', detail: `v${process.versions.node}` };\n}\n\nfunction checkClaudeCli(): Check {\n try {\n execSync('which claude', { stdio: 'pipe' });\n return { name: 'Claude CLI', status: 'ok', detail: 'Found on PATH' };\n } catch {\n return {\n name: 'Claude CLI',\n status: 'fail',\n detail: 'Not found on PATH',\n fix: 'Install Claude Code: https://docs.anthropic.com/en/docs/claude-code/overview',\n };\n }\n}\n\nfunction checkGit(): Check {\n try {\n const version = execSync('git --version', { encoding: 'utf-8', stdio: 'pipe' }).trim();\n return { name: 'git', status: 'ok', detail: version };\n } catch {\n return { name: 'git', status: 'fail', detail: 'Not found on PATH', fix: 'Install git: https://git-scm.com/downloads' };\n }\n}\n\nfunction checkTmuxVersion(): Check {\n try {\n const version = execSync('tmux -V', { encoding: 'utf-8', stdio: 'pipe' }).trim();\n // Parse \"tmux X.Y\" or \"tmux next-X.Y\"\n const match = version.match(/(\\d+\\.\\d+)/);\n if (!match) return { name: 'tmux version', status: 'warn', detail: `Could not parse version: ${version}` };\n const ver = parseFloat(match[1]);\n if (ver < 3.2) {\n const upgradeHint = process.platform === 'darwin' ? 'brew install tmux (or upgrade)' : 'apt install tmux (Debian/Ubuntu) or your package manager';\n return { name: 'tmux version', status: 'warn', detail: `${version} (3.2+ recommended for popup support)`, fix: upgradeHint };\n }\n return { name: 'tmux version', status: 'ok', detail: version };\n } catch {\n return { name: 'tmux version', status: 'warn', detail: 'Could not determine version' };\n }\n}\n\nfunction checkDaemonInstalled(): Check {\n if (process.platform === 'darwin') {\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 // Linux: check if PID file exists (daemon started manually)\n const pid = daemonPidPath();\n if (existsSync(pid)) {\n return { name: 'Daemon setup', status: 'ok', detail: `PID file found at ${pid}` };\n }\n return {\n name: 'Daemon setup',\n status: 'fail',\n detail: 'Daemon not running (no PID file)',\n fix: 'Start manually: sisyphusd & — or configure via systemd',\n };\n}\n\nfunction checkDaemonRunning(): Check {\n const pid = daemonPidPath();\n if (!existsSync(pid)) {\n const fix = process.platform === 'darwin'\n ? 'launchctl load -w ~/Library/LaunchAgents/com.sisyphus.daemon.plist'\n : 'sisyphusd & — or check if the process is running';\n return {\n name: 'Daemon process',\n status: 'fail',\n detail: 'No PID file found',\n fix,\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 const installHint = process.platform === 'darwin' ? 'brew install tmux' : 'apt install tmux (Debian/Ubuntu) or your package manager';\n return { name: 'tmux', status: 'fail', detail: 'Not found on PATH', fix: installHint };\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 checkNodeVersion(),\n checkClaudeCli(),\n checkGit(),\n checkTmux(),\n checkTmuxVersion(),\n checkGlobalDir(),\n checkDaemonInstalled(),\n checkDaemonRunning(),\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 && c.status !== 'ok');\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","import type { Command } from 'commander';\nimport { buildCompanionContext } from '../../tui/lib/context.js';\n\nexport function registerCompanionContext(program: Command): void {\n program\n .command('companion-context')\n .description('Output session context JSON for companion hook')\n .option('--cwd <path>', 'Project directory', process.cwd())\n .action((opts: { cwd: string }) => {\n const context = buildCompanionContext(opts.cwd);\n process.stdout.write(JSON.stringify({ additionalContext: context }));\n });\n}\n","import type { Command } from 'commander';\nimport { isTmuxInstalled } from '../tmux.js';\n\nexport function registerGettingStarted(program: Command): void {\n program\n .command('getting-started')\n .description('Show a complete guide to using sisyphus effectively')\n .action(() => {\n const hasTmux = isTmuxInstalled();\n const inTmux = !!process.env['TMUX'];\n\n const lines = [\n '',\n ' ╔══════════════════════════════════════════╗',\n ' ║ Getting Started with Sisyphus ║',\n ' ╚══════════════════════════════════════════╝',\n '',\n ' Sisyphus is a multi-agent orchestration daemon for Claude Code.',\n ' It breaks large tasks into subtasks, spawns parallel Claude agents,',\n ' and coordinates their work across multiple cycles — autonomously.',\n '',\n ' ─── Tmux ───────────────────────────────────',\n '',\n ];\n\n if (!hasTmux) {\n lines.push(\n ' ⚠ tmux is not installed. Sisyphus requires tmux.',\n ' Install it: brew install tmux (macOS)',\n ' apt install tmux (Linux)',\n '',\n );\n } else if (!inTmux) {\n lines.push(\n ' ⚠ You are not inside a tmux session.',\n ' Sisyphus spawns agent panes inside tmux, so you should',\n ' start a tmux session before running sisyphus:',\n '',\n ' tmux new-session',\n '',\n );\n } else {\n lines.push(\n ' ✓ You are inside tmux. Good to go.',\n '',\n );\n }\n\n lines.push(\n ' ─── What Makes a Good Sisyphus Task ────────',\n '',\n ' Sisyphus is built for BIG tasks — the kind that would take',\n ' multiple cycles of orchestration and parallel agent work.',\n ' If you could do it with a single Claude Code session in plan',\n ' mode, it\\'s too small for sisyphus.',\n '',\n ' Good tasks:',\n ' • \"Implement this feature\" @path/to/spec.md',\n ' • \"Do a deep dive on all SEO/AEO optimizations and',\n ' systematically apply them across the site\"',\n ' • Large-scale refactors spanning dozens of files',\n ' • Full feature builds from a written spec',\n '',\n ' Too small for sisyphus:',\n ' • \"Add these 3 UI components to the page\"',\n ' • \"Fix this bug in auth.ts\"',\n ' • Anything a single Claude session handles comfortably',\n '',\n ' Tasks don\\'t need to be hyper-specific — broad but meaningful',\n ' tasks work great because the orchestrator will plan the approach.',\n ' What matters is SCALE, not specificity.',\n '',\n ' For best results, write a spec and reference it directly:',\n '',\n ' sisyphus start \"Implement this @path/to/spec.md\"',\n '',\n ' ─── How It Works ───────────────────────────',\n '',\n ' 1. You run: sisyphus start \"task description\"',\n ' 2. An orchestrator Claude reviews the task and creates a roadmap',\n ' 3. It spawns agent Claude instances in parallel tmux panes',\n ' 4. Agents work independently, then submit reports when done',\n ' 5. The orchestrator respawns with fresh context, reviews progress,',\n ' and kicks off the next cycle of work',\n ' 6. This repeats until the orchestrator marks the task complete',\n '',\n ' The orchestrator is stateless — it gets killed after each cycle',\n ' and respawned fresh with the full session state. This means it',\n ' never runs out of context, no matter how many cycles a task takes.',\n '',\n ' ─── Monitoring (Important!) ────────────────',\n '',\n ' Sisyphus sessions should be actively monitored. Agents can get',\n ' stuck waiting for input, fail to submit reports, or take the',\n ' roadmap in a direction you don\\'t want. The dashboard is your',\n ' primary tool for staying on top of things:',\n '',\n ' sisyphus dashboard',\n '',\n ' Key dashboard actions:',\n ' m — Message the orchestrator to steer direction',\n ' w — Jump directly into the sisyphus tmux session',\n ' to see exactly what agents are doing',\n '',\n ' Use `m` to course-correct from the dashboard, and `w` when you',\n ' need the most granular view of agent activity.',\n '',\n ' ─── Commands ───────────────────────────────',\n '',\n ' Start & monitor:',\n ' sisyphus start \"task\" Start a session',\n ' sisyphus start \"task @spec.md\" Start referencing a spec',\n ' sisyphus status [id] Show session status',\n ' sisyphus list List all sessions',\n ' sisyphus dashboard Open TUI dashboard',\n '',\n ' Control:',\n ' sisyphus resume <id> \"instructions\" Resume with new direction',\n ' sisyphus kill <id> Stop a session',\n '',\n ' Health:',\n ' sisyphus doctor Check installation health',\n ' tail -f ~/.sisyphus/daemon.log Watch daemon logs',\n '',\n ' ─── Next Steps ─────────────────────────────',\n '',\n ' 1. Run `sisyphus doctor` to check your setup',\n ' 2. Start a tmux session: `tmux new-session`',\n ' 3. Try it: `sisyphus start \"your task description\"`',\n '',\n );\n\n console.log(lines.join('\\n'));\n });\n}\n","import type { Command } from 'commander';\nimport { existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\nconst DEFAULT_CONFIG = {};\n\nconst ORCHESTRATOR_TEMPLATE = `# Custom Orchestrator Prompt\n\n<!-- This file overrides the default orchestrator system prompt. -->\n<!-- Delete this file to use the built-in prompt. -->\n<!-- See: https://github.com/silasrhyneer/sisyphi for details. -->\n`;\n\nexport function registerInit(program: Command): void {\n program\n .command('init')\n .description('Initialize sisyphus configuration for this project')\n .option('--orchestrator', 'Also create a custom orchestrator prompt template')\n .action((opts: { orchestrator?: boolean }) => {\n const cwd = process.cwd();\n const sisDir = join(cwd, '.sisyphus');\n const configPath = join(sisDir, 'config.json');\n\n if (existsSync(configPath)) {\n console.log(`Already initialized: ${configPath}`);\n return;\n }\n\n mkdirSync(sisDir, { recursive: true });\n writeFileSync(configPath, JSON.stringify(DEFAULT_CONFIG, null, 2) + '\\n', 'utf-8');\n console.log(`Created ${configPath}`);\n\n if (opts.orchestrator) {\n const orchPath = join(sisDir, 'orchestrator.md');\n if (!existsSync(orchPath)) {\n writeFileSync(orchPath, ORCHESTRATOR_TEMPLATE, 'utf-8');\n console.log(`Created ${orchPath}`);\n }\n }\n\n console.log('');\n console.log('Configuration options (add to .sisyphus/config.json):');\n console.log(' orchestratorEffort — \"low\" | \"medium\" | \"high\" | \"max\" (default: \"high\")');\n console.log(' agentEffort — \"low\" | \"medium\" | \"high\" | \"max\" (default: \"medium\")');\n console.log(' pollIntervalMs — Daemon poll interval in ms (default: 5000)');\n console.log(' autoUpdate — Auto-update daemon on restart (default: true)');\n });\n}\n"],"mappings":"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","names":["existsSync","mkdirSync","execSync","execSync","existsSync","mkdirSync","readFileSync","unlinkSync","writeFileSync","homedir","join","join","homedir","existsSync","mkdirSync","writeFileSync","execSync","unlinkSync","resolve","readFileSync","rawSend","sleep","resolve","execSync","join","execSync","execSync","join","program","program","execSync","resolve","program","execSync","execSync","program","program","program","program","readFileSync","readFileSync","program","RESET","BOLD","DIM","program","program","program","program","resolve","program","program","rawSend","program","program","program","program","program","execSync","existsSync","execSync","existsSync","program","program","program","existsSync","mkdirSync","writeFileSync","join","program","existsSync","mkdirSync"]}
1
+ {"version":3,"sources":["../src/cli/index.ts","../src/cli/commands/start.ts","../src/cli/install.ts","../src/cli/tmux-setup.ts","../src/cli/client.ts","../src/cli/tmux.ts","../src/cli/commands/dashboard.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/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","../src/cli/commands/companion-context.ts","../src/cli/commands/getting-started.ts","../src/cli/commands/init.ts"],"sourcesContent":["const nodeVersion = parseInt(process.versions.node.split('.')[0]!, 10);\nif (nodeVersion < 22) {\n console.error(`Sisyphus requires Node.js v22+ (current: v${process.versions.node})`);\n process.exit(1);\n}\n\nimport { Command } from 'commander';\nimport { existsSync, mkdirSync } from 'node:fs';\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';\nimport { registerCompanionContext } from './commands/companion-context.js';\nimport { registerGettingStarted } from './commands/getting-started.js';\nimport { registerInit } from './commands/init.js';\nimport { globalDir } from '../shared/paths.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\nprogram.configureHelp({\n sortSubcommands: false,\n});\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);\nregisterCompanionContext(program);\nregisterGettingStarted(program);\nregisterInit(program);\n\nprogram.addHelpText('after', `\nExamples:\n $ sisyphus start \"Implement auth system\" Start a new session\n $ sisyphus start \"Build @spec.md\" -n auth Start with a name and spec reference\n $ sisyphus status Check current sessions\n $ sisyphus dashboard Open the TUI\n $ sisyphus doctor Verify installation\n\nRun 'sisyphus getting-started' for a complete usage guide.\n`);\n\n// Show welcome on first run (before ~/.sisyphus exists)\nconst args = process.argv.slice(2);\nconst firstArg = args[0];\nconst skipWelcome = ['doctor', 'getting-started', 'help', '--help', '-h', 'init', 'uninstall', '--version', '-V'];\nif (!existsSync(globalDir()) && firstArg && !skipWelcome.includes(firstArg)) {\n mkdirSync(globalDir(), { recursive: true });\n console.log('');\n console.log(' Welcome to Sisyphus — multi-agent orchestration for Claude Code.');\n console.log('');\n console.log(' First time? Run these commands:');\n console.log(' sisyphus doctor Check your setup');\n console.log(' sisyphus getting-started Learn the basics');\n console.log('');\n}\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, isTmuxInstalled } from '../tmux.js';\nimport { shellQuote } from '../../shared/shell.js';\nimport { ensureDashboard } from './dashboard.js';\nimport type { Request } from '../../shared/protocol.js';\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 .option('--no-tmux-check', 'Skip the tmux session check')\n .action(async (task: string, opts: { context?: string; name?: string; tmuxCheck?: boolean }) => {\n const cwd = process.env['SISYPHUS_CWD'] ?? process.cwd();\n\n if (!process.env['TMUX'] && opts.tmuxCheck !== false) {\n if (!isTmuxInstalled()) {\n console.error('Error: tmux is not installed. Sisyphus requires tmux for agent panes.');\n console.error(' Install: brew install tmux (macOS) or apt install tmux (Linux)');\n console.error(' Then: tmux new-session');\n process.exit(1);\n }\n console.error('Error: Not running inside a tmux session.');\n console.error(' Sisyphus uses tmux to manage agent panes.');\n console.error(' Start a tmux session first: tmux new-session');\n console.error('');\n console.error(' To skip this check: sisyphus start --no-tmux-check \"task\"');\n process.exit(1);\n }\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 (ensureDashboard(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 { 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 ];\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 'Run `sisyphus getting-started` for a complete usage guide.',\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';\nexport const DEFAULT_HOME_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 homeScriptPath(): string {\n return join(globalDir(), 'bin', 'sisyphus-home');\n}\n\nexport function killPaneScriptPath(): string {\n return join(globalDir(), 'bin', 'sisyphus-kill-pane');\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\nconst HOME_SCRIPT = `#!/bin/bash\n# Jump to the home (non-sisyphus) session that has the dashboard window\ncwd=$(tmux show-option -v @sisyphus_cwd 2>/dev/null)\n[ -z \"$cwd\" ] && exit 0\nwhile IFS= read -r name; do\n # Skip sisyphus agent/orchestrator sessions\n case \"$name\" in sisyphus-*) continue ;; esac\n scwd=$(tmux show-option -t \"$name\" -v @sisyphus_cwd 2>/dev/null)\n if [ \"$scwd\" = \"$cwd\" ]; then\n tmux switch-client -t \"$name\"\n # Focus the dashboard window if it exists\n tmux select-window -t \"$name:sisyphus-dashboard\" 2>/dev/null\n exit 0\n fi\ndone < <(tmux list-sessions -F '#{session_name}')\n`;\n\nconst KILL_PANE_SCRIPT = `#!/bin/bash\n# prefix-x override for sisyphus sessions.\n# If this is the last pane, switch to the home session before killing.\nsession=$(tmux display-message -p '#{session_name}')\npane_count=$(tmux list-panes -t \"$session\" -F '#{pane_id}' | wc -l | tr -d ' ')\n\nif [ \"$pane_count\" -le 1 ]; then\n # Last pane — find home session, switch there, then kill sisyphus session\n cwd=$(tmux show-option -t \"$session\" -v @sisyphus_cwd 2>/dev/null)\n if [ -n \"$cwd\" ]; then\n while IFS= read -r name; do\n case \"$name\" in sisyphus-*) continue ;; esac\n scwd=$(tmux show-option -t \"$name\" -v @sisyphus_cwd 2>/dev/null)\n if [ \"$scwd\" = \"$cwd\" ]; then\n tmux switch-client -t \"$name\"\n tmux select-window -t \"$name:sisyphus-dashboard\" 2>/dev/null\n tmux kill-session -t \"$session\"\n exit 0\n fi\n done < <(tmux list-sessions -F '#{session_name}')\n fi\n # No home session found — just kill the pane\n tmux kill-pane\nelse\n # Multiple panes — kill this one and rebalance\n tmux kill-pane\n tmux select-layout even-horizontal\nfi\n`;\n\nexport function installCycleScript(): void {\n mkdirSync(join(globalDir(), 'bin'), { recursive: true });\n const scriptPath = cycleScriptPath();\n writeFileSync(scriptPath, CYCLE_SCRIPT, 'utf8');\n chmodSync(scriptPath, 0o755);\n}\n\nexport function installHomeScript(): void {\n mkdirSync(join(globalDir(), 'bin'), { recursive: true });\n const scriptPath = homeScriptPath();\n writeFileSync(scriptPath, HOME_SCRIPT, 'utf8');\n chmodSync(scriptPath, 0o755);\n}\n\nexport function installKillPaneScript(): void {\n mkdirSync(join(globalDir(), 'bin'), { recursive: true });\n const scriptPath = killPaneScriptPath();\n writeFileSync(scriptPath, KILL_PANE_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, homeKey: string = DEFAULT_HOME_KEY): SetupResult {\n installCycleScript();\n installHomeScript();\n installKillPaneScript();\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 // Check home key for conflicts too (only if different from cycle key)\n if (homeKey !== key) {\n const existingHome = getExistingBinding(homeKey);\n if (existingHome !== null && !isSisyphusBinding(existingHome)) {\n return {\n status: 'conflict',\n message: `Tmux key ${homeKey} is already bound to something else.`,\n existingBinding: existingHome,\n };\n }\n }\n\n // Write ~/.sisyphus/tmux.conf with keybindings + prefix-x override\n const confPath = sisyphusTmuxConfPath();\n const cycleBinding = `bind-key -T root ${key} run-shell ${cycleScriptPath()}`;\n const homeBinding = `bind-key -T root ${homeKey} run-shell ${homeScriptPath()}`;\n const killPaneOverride = `bind-key -T prefix x if-shell \"tmux display-message -p '#{session_name}' | grep -q '^sisyphus-'\" \"run-shell ${killPaneScriptPath()}\" \"kill-pane \\\\; select-layout even-horizontal\"`;\n writeFileSync(confPath, `${SISYPHUS_CONF_MARKER}\\n${cycleBinding}\\n${homeBinding}\\n${killPaneOverride}\\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 bindings live if tmux is running\n try {\n execSync(`tmux bind-key -T root ${key} run-shell ${cycleScriptPath()}`, { stdio: 'pipe' });\n execSync(`tmux bind-key -T root ${homeKey} run-shell ${homeScriptPath()}`, { stdio: 'pipe' });\n execSync(`tmux ${killPaneOverride}`, { stdio: 'pipe' });\n } catch {\n // tmux not running — bindings will take effect on next session start\n }\n\n if (existing !== null && isSisyphusBinding(existing)) {\n return {\n status: 'already-installed',\n message: `Tmux keybindings ${key} (cycle) and ${homeKey} (dashboard) 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 keybindings set: ${key} cycles sessions, ${homeKey} jumps to dashboard${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 // Restore default prefix-x binding if tmux is running\n try {\n execSync('tmux bind-key -T prefix x kill-pane \\\\; select-layout even-horizontal', { stdio: 'pipe' });\n } catch {\n // tmux not running\n }\n\n // Remove scripts\n for (const scriptPath of [cycleScriptPath(), homeScriptPath(), killPaneScriptPath()]) {\n if (existsSync(scriptPath)) {\n unlinkSync(scriptPath);\n }\n }\n}\n","import type { Request, Response } from '../shared/protocol.js';\nimport { rawSend as sharedRawSend } from '../shared/client.js';\nimport { ensureDaemonInstalled, waitForDaemon } from './install.js';\n\nexport function rawSend(request: Request): Promise<Response> {\n return sharedRawSend(request, 10_000);\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 const lines = [`Sisyphus daemon is not running.`];\n if (process.platform === 'linux') {\n lines.push(\n '',\n ' Start options:',\n ' sisyphusd & # Run in background',\n ' nohup sisyphusd > ~/.sisyphus/daemon.log 2>&1 & # Persist after logout',\n '',\n ' For systemd (recommended):',\n ' # Create ~/.config/systemd/user/sisyphus.service with:',\n ' # [Unit]',\n ' # Description=Sisyphus Daemon',\n ' # [Service]',\n ' # ExecStart=/usr/bin/env node <path-to-sisyphusd>',\n ' # Restart=always',\n ' # [Install]',\n ' # WantedBy=default.target',\n ' systemctl --user enable --now sisyphus',\n );\n } else {\n lines.push(\n '',\n ' Start it manually: sisyphusd &',\n );\n }\n lines.push(\n '',\n ' Diagnose: sisyphus doctor',\n ' Logs: tail -f ~/.sisyphus/daemon.log',\n );\n throw new Error(lines.join('\\n'));\n }\n throw lastErr;\n}\n","import { execSync } from 'node:child_process';\n\nexport function isTmuxInstalled(): boolean {\n try {\n execSync('which tmux', { stdio: 'pipe' });\n return true;\n } catch {\n return false;\n }\n}\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\n","import type { Command } from 'commander';\nimport { join } from 'node:path';\nimport { execSync } from 'node:child_process';\nimport { assertTmux, getTmuxSession } from '../tmux.js';\nimport { shellQuote } from '../../shared/shell.js';\n\n\n/**\n * Ensures a dashboard window exists in the given tmux session.\n * If one is already open, focuses it. Otherwise launches a new one.\n * Returns true if a new dashboard was created, false if an existing one was focused.\n */\nexport function ensureDashboard(tmuxSession: string, cwd: string): boolean {\n try {\n const windows = execSync(\n `tmux list-windows -t ${shellQuote(tmuxSession)} -F \"#{window_name}\"`,\n { encoding: 'utf-8' },\n );\n const isOpen = windows.split('\\n').some(name => name.trim() === 'sisyphus-dashboard');\n\n if (isOpen) {\n execSync(\n `tmux select-window -t ${shellQuote(tmuxSession)}:sisyphus-dashboard`,\n );\n return false;\n }\n } catch {\n // tmux error — proceed to launch\n }\n\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 return true;\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 ensureDashboard(tmuxSession, process.cwd());\n });\n}\n","import type { Command } from 'commander';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\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 .option('--repo <name>', 'Repo subdirectory to use for this agent')\n .action(async (positionalInstruction: string | undefined, opts: { agentType: string; name: string; instruction?: string; worktree?: boolean; repo?: 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 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 sisyphusCwd = process.env['SISYPHUS_CWD'] ?? process.cwd();\n\n if (opts.repo && (opts.repo.includes('/') || opts.repo.includes('..') || opts.repo.includes('\\\\'))) {\n console.error('Error: --repo must be a directory name, not a path');\n process.exit(1);\n }\n\n if (opts.repo && opts.repo !== '.') {\n const repoPath = join(sisyphusCwd, opts.repo);\n if (!existsSync(repoPath)) {\n console.error(`Error: repo directory does not exist: ${repoPath}`);\n process.exit(1);\n }\n if (opts.worktree && !existsSync(join(repoPath, '.git'))) {\n console.error(`Error: --worktree requires a git repo; no .git found at ${repoPath}`);\n process.exit(1);\n }\n } else if (!opts.repo) {\n if (!existsSync(join(sisyphusCwd, '.git'))) {\n console.error('Error: --repo is required when session root is not a git repo.');\n process.exit(1);\n }\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 ...(opts.repo ? { repo: opts.repo } : {}),\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 { 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('Clear roadmap and continue working on a completed session (stays in current cycle)')\n .addHelpText('after', '\\n Use `continue` when a session completed but you want to add more work.\\n Use `resume` when you want to restart with specific new instructions.\\n')\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';\nimport { formatDuration, statusColor } from '../../shared/format.js';\n\nconst COLOR_CODES: Record<string, string> = {\n green: '\\x1b[32m', yellow: '\\x1b[33m', cyan: '\\x1b[36m',\n red: '\\x1b[31m', gray: '\\x1b[90m', white: '\\x1b[37m',\n};\nconst RESET = '\\x1b[0m';\nconst BOLD = '\\x1b[1m';\nconst DIM = '\\x1b[2m';\n\nfunction colorize(text: string, status: string): string {\n const colorName = statusColor(status);\n const code = COLOR_CODES[colorName];\n if (!code) return `${text}\\x1b[0m`;\n return `${code}${text}\\x1b[0m`;\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: ${formatDuration(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 name?: 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.env['SISYPHUS_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 label = s.name ? `${s.name} ${DIM}(${s.id.slice(0, 8)})${RESET}` : s.id;\n const cwdLabel = opts.all && s.cwd ? ` ${DIM}${basename(s.cwd)}${RESET}` : '';\n console.log(` ${BOLD}${label}${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('Respawn orchestrator with new instructions (for paused/completed sessions)')\n .addHelpText('after', '\\n Use `resume` to restart a paused or completed session with new instructions.\\n Use `continue` to keep working on a completed session without new instructions.\\n')\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.env['SISYPHUS_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 cwd = process.env['SISYPHUS_CWD'] ?? process.cwd();\n const request: Request = { type: 'rollback', sessionId, 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 checkNodeVersion(): Check {\n const major = parseInt(process.versions.node.split('.')[0]!, 10);\n if (major < 22) {\n return { name: 'Node.js', status: 'fail', detail: `v${process.versions.node} (v22+ required)`, fix: 'Install Node.js 22+: https://nodejs.org' };\n }\n return { name: 'Node.js', status: 'ok', detail: `v${process.versions.node}` };\n}\n\nfunction checkClaudeCli(): Check {\n try {\n execSync('which claude', { stdio: 'pipe' });\n return { name: 'Claude CLI', status: 'ok', detail: 'Found on PATH' };\n } catch {\n return {\n name: 'Claude CLI',\n status: 'fail',\n detail: 'Not found on PATH',\n fix: 'Install Claude Code: https://docs.anthropic.com/en/docs/claude-code/overview',\n };\n }\n}\n\nfunction checkGit(): Check {\n try {\n const version = execSync('git --version', { encoding: 'utf-8', stdio: 'pipe' }).trim();\n return { name: 'git', status: 'ok', detail: version };\n } catch {\n return { name: 'git', status: 'fail', detail: 'Not found on PATH', fix: 'Install git: https://git-scm.com/downloads' };\n }\n}\n\nfunction checkTmuxVersion(): Check {\n try {\n const version = execSync('tmux -V', { encoding: 'utf-8', stdio: 'pipe' }).trim();\n // Parse \"tmux X.Y\" or \"tmux next-X.Y\"\n const match = version.match(/(\\d+\\.\\d+)/);\n if (!match) return { name: 'tmux version', status: 'warn', detail: `Could not parse version: ${version}` };\n const ver = parseFloat(match[1]);\n if (ver < 3.2) {\n const upgradeHint = process.platform === 'darwin' ? 'brew install tmux (or upgrade)' : 'apt install tmux (Debian/Ubuntu) or your package manager';\n return { name: 'tmux version', status: 'warn', detail: `${version} (3.2+ recommended for popup support)`, fix: upgradeHint };\n }\n return { name: 'tmux version', status: 'ok', detail: version };\n } catch {\n return { name: 'tmux version', status: 'warn', detail: 'Could not determine version' };\n }\n}\n\nfunction checkDaemonInstalled(): Check {\n if (process.platform === 'darwin') {\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 // Linux: check if PID file exists (daemon started manually)\n const pid = daemonPidPath();\n if (existsSync(pid)) {\n return { name: 'Daemon setup', status: 'ok', detail: `PID file found at ${pid}` };\n }\n return {\n name: 'Daemon setup',\n status: 'fail',\n detail: 'Daemon not running (no PID file)',\n fix: 'Start manually: sisyphusd & — or configure via systemd',\n };\n}\n\nfunction checkDaemonRunning(): Check {\n const pid = daemonPidPath();\n if (!existsSync(pid)) {\n const fix = process.platform === 'darwin'\n ? 'launchctl load -w ~/Library/LaunchAgents/com.sisyphus.daemon.plist'\n : 'sisyphusd & — or check if the process is running';\n return {\n name: 'Daemon process',\n status: 'fail',\n detail: 'No PID file found',\n fix,\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 const installHint = process.platform === 'darwin' ? 'brew install tmux' : 'apt install tmux (Debian/Ubuntu) or your package manager';\n return { name: 'tmux', status: 'fail', detail: 'Not found on PATH', fix: installHint };\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 checkNodeVersion(),\n checkClaudeCli(),\n checkGit(),\n checkTmux(),\n checkTmuxVersion(),\n checkGlobalDir(),\n checkDaemonInstalled(),\n checkDaemonRunning(),\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 && c.status !== 'ok');\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","import type { Command } from 'commander';\nimport { buildCompanionContext } from '../../tui/lib/context.js';\n\nexport function registerCompanionContext(program: Command): void {\n program\n .command('companion-context')\n .description('Output session context JSON for companion hook')\n .option('--cwd <path>', 'Project directory', process.cwd())\n .action((opts: { cwd: string }) => {\n const context = buildCompanionContext(opts.cwd);\n process.stdout.write(JSON.stringify({ additionalContext: context }));\n });\n}\n","import type { Command } from 'commander';\nimport { isTmuxInstalled } from '../tmux.js';\n\nexport function registerGettingStarted(program: Command): void {\n program\n .command('getting-started')\n .description('Show a complete guide to using sisyphus effectively')\n .action(() => {\n const hasTmux = isTmuxInstalled();\n const inTmux = !!process.env['TMUX'];\n\n const lines = [\n '',\n ' ╔══════════════════════════════════════════╗',\n ' ║ Getting Started with Sisyphus ║',\n ' ╚══════════════════════════════════════════╝',\n '',\n ' Sisyphus is a multi-agent orchestration daemon for Claude Code.',\n ' It breaks large tasks into subtasks, spawns parallel Claude agents,',\n ' and coordinates their work across multiple cycles — autonomously.',\n '',\n ' ─── Tmux ───────────────────────────────────',\n '',\n ];\n\n if (!hasTmux) {\n lines.push(\n ' ⚠ tmux is not installed. Sisyphus requires tmux.',\n ' Install it: brew install tmux (macOS)',\n ' apt install tmux (Linux)',\n '',\n );\n } else if (!inTmux) {\n lines.push(\n ' ⚠ You are not inside a tmux session.',\n ' Sisyphus spawns agent panes inside tmux, so you should',\n ' start a tmux session before running sisyphus:',\n '',\n ' tmux new-session',\n '',\n );\n } else {\n lines.push(\n ' ✓ You are inside tmux. Good to go.',\n '',\n );\n }\n\n lines.push(\n ' ─── What Makes a Good Sisyphus Task ────────',\n '',\n ' Sisyphus is built for BIG tasks — the kind that would take',\n ' multiple cycles of orchestration and parallel agent work.',\n ' If you could do it with a single Claude Code session in plan',\n ' mode, it\\'s too small for sisyphus.',\n '',\n ' Good tasks:',\n ' • \"Implement this feature\" @path/to/spec.md',\n ' • \"Do a deep dive on all SEO/AEO optimizations and',\n ' systematically apply them across the site\"',\n ' • Large-scale refactors spanning dozens of files',\n ' • Full feature builds from a written spec',\n '',\n ' Too small for sisyphus:',\n ' • \"Add these 3 UI components to the page\"',\n ' • \"Fix this bug in auth.ts\"',\n ' • Anything a single Claude session handles comfortably',\n '',\n ' Tasks don\\'t need to be hyper-specific — broad but meaningful',\n ' tasks work great because the orchestrator will plan the approach.',\n ' What matters is SCALE, not specificity.',\n '',\n ' For best results, write a spec and reference it directly:',\n '',\n ' sisyphus start \"Implement this @path/to/spec.md\"',\n '',\n ' ─── How It Works ───────────────────────────',\n '',\n ' 1. You run: sisyphus start \"task description\"',\n ' 2. An orchestrator Claude reviews the task and creates a roadmap',\n ' 3. It spawns agent Claude instances in parallel tmux panes',\n ' 4. Agents work independently, then submit reports when done',\n ' 5. The orchestrator respawns with fresh context, reviews progress,',\n ' and kicks off the next cycle of work',\n ' 6. This repeats until the orchestrator marks the task complete',\n '',\n ' The orchestrator is stateless — it gets killed after each cycle',\n ' and respawned fresh with the full session state. This means it',\n ' never runs out of context, no matter how many cycles a task takes.',\n '',\n ' ─── Monitoring (Important!) ────────────────',\n '',\n ' Sisyphus sessions should be actively monitored. Agents can get',\n ' stuck waiting for input, fail to submit reports, or take the',\n ' roadmap in a direction you don\\'t want. The dashboard is your',\n ' primary tool for staying on top of things:',\n '',\n ' sisyphus dashboard',\n '',\n ' Key dashboard actions:',\n ' m — Message the orchestrator to steer direction',\n ' w — Jump directly into the sisyphus tmux session',\n ' to see exactly what agents are doing',\n '',\n ' Use `m` to course-correct from the dashboard, and `w` when you',\n ' need the most granular view of agent activity.',\n '',\n ' ─── Commands ───────────────────────────────',\n '',\n ' Start & monitor:',\n ' sisyphus start \"task\" Start a session',\n ' sisyphus start \"task @spec.md\" Start referencing a spec',\n ' sisyphus status [id] Show session status',\n ' sisyphus list List all sessions',\n ' sisyphus dashboard Open TUI dashboard',\n '',\n ' Control:',\n ' sisyphus resume <id> \"instructions\" Resume with new direction',\n ' sisyphus kill <id> Stop a session',\n '',\n ' Health:',\n ' sisyphus doctor Check installation health',\n ' tail -f ~/.sisyphus/daemon.log Watch daemon logs',\n '',\n ' ─── Next Steps ─────────────────────────────',\n '',\n ' 1. Run `sisyphus doctor` to check your setup',\n ' 2. Start a tmux session: `tmux new-session`',\n ' 3. Try it: `sisyphus start \"your task description\"`',\n '',\n );\n\n console.log(lines.join('\\n'));\n });\n}\n","import type { Command } from 'commander';\nimport { existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\nconst DEFAULT_CONFIG = {};\n\nconst ORCHESTRATOR_TEMPLATE = `# Custom Orchestrator Prompt\n\n<!-- This file overrides the default orchestrator system prompt. -->\n<!-- Delete this file to use the built-in prompt. -->\n<!-- See: https://github.com/silasrhyneer/sisyphi for details. -->\n`;\n\nexport function registerInit(program: Command): void {\n program\n .command('init')\n .description('Initialize sisyphus configuration for this project')\n .option('--orchestrator', 'Also create a custom orchestrator prompt template')\n .action((opts: { orchestrator?: boolean }) => {\n const cwd = process.cwd();\n const sisDir = join(cwd, '.sisyphus');\n const configPath = join(sisDir, 'config.json');\n\n if (existsSync(configPath)) {\n console.log(`Already initialized: ${configPath}`);\n return;\n }\n\n mkdirSync(sisDir, { recursive: true });\n writeFileSync(configPath, JSON.stringify(DEFAULT_CONFIG, null, 2) + '\\n', 'utf-8');\n console.log(`Created ${configPath}`);\n\n if (opts.orchestrator) {\n const orchPath = join(sisDir, 'orchestrator.md');\n if (!existsSync(orchPath)) {\n writeFileSync(orchPath, ORCHESTRATOR_TEMPLATE, 'utf-8');\n console.log(`Created ${orchPath}`);\n }\n }\n\n console.log('');\n console.log('Configuration options (add to .sisyphus/config.json):');\n console.log(' orchestratorEffort — \"low\" | \"medium\" | \"high\" | \"max\" (default: \"high\")');\n console.log(' agentEffort — \"low\" | \"medium\" | \"high\" | \"max\" (default: \"medium\")');\n console.log(' pollIntervalMs — Daemon poll interval in ms (default: 5000)');\n console.log(' autoUpdate — Auto-update daemon on restart (default: true)');\n });\n}\n"],"mappings":"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","names":["existsSync","mkdirSync","execSync","execSync","existsSync","mkdirSync","readFileSync","unlinkSync","writeFileSync","homedir","join","join","homedir","existsSync","mkdirSync","writeFileSync","execSync","unlinkSync","resolve","readFileSync","rawSend","sleep","resolve","execSync","join","execSync","execSync","join","program","program","execSync","existsSync","join","resolve","program","join","existsSync","execSync","execSync","program","program","program","program","readFileSync","readFileSync","program","RESET","BOLD","DIM","program","program","program","program","resolve","program","program","rawSend","program","program","program","program","program","execSync","existsSync","execSync","existsSync","program","program","program","existsSync","mkdirSync","writeFileSync","join","program","existsSync","mkdirSync"]}