sisyphi 1.1.0 → 1.1.8
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 +767 -177
- package/dist/cli.js.map +1 -1
- package/dist/templates/begin.md +22 -0
- package/dist/tui.js +59 -29
- package/dist/tui.js.map +1 -1
- package/package.json +2 -2
- package/templates/begin.md +22 -0
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/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 @requirements.md\" -n auth Start with a name and requirements 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('--repo <name>', 'Repo subdirectory to use for this agent')\n .option('--session <sessionId>', 'Session ID (defaults to SISYPHUS_SESSION_ID env var)')\n .action(async (positionalInstruction: string | undefined, opts: { agentType: string; name: string; instruction?: string; repo?: string; session?: string }) => {\n assertTmux();\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 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 }\n\n const request: Request = {\n type: 'spawn',\n sessionId,\n agentType: opts.agentType,\n name: opts.name,\n instruction,\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 .option('--session <sessionId>', 'Session ID (defaults to SISYPHUS_SESSION_ID env var)')\n .action(async (opts: { report?: string; session?: string }) => {\n assertTmux();\n const sessionId = opts.session ?? process.env.SISYPHUS_SESSION_ID;\n const agentId = process.env.SISYPHUS_AGENT_ID;\n if (!sessionId || !agentId) {\n console.error('Error: provide --session or set SISYPHUS_SESSION_ID (and SISYPHUS_AGENT_ID) environment variables');\n process.exit(1);\n }\n\n // Block submit if in a git worktree with uncommitted changes — commit first\n if (isInWorktree()) {\n const changes = getUncommittedChanges();\n if (changes) {\n console.error('Error: uncommitted changes in worktree. Commit your changes before submitting.');\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, validation)')\n .option('--session <sessionId>', 'Session ID (defaults to SISYPHUS_SESSION_ID env var)')\n .action(async (opts: { prompt?: string; mode?: string; session?: string }) => {\n assertTmux();\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 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 .option('--session <sessionId>', 'Session ID (defaults to SISYPHUS_SESSION_ID env var)')\n .action(async (opts: { report: string; session?: string }) => {\n assertTmux();\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: 'complete', sessionId, report: opts.report };\n const response = await sendRequest(request);\n if (response.ok) {\n console.log('Session completed.');\n console.log(`\\nTo keep working in this session:`);\n console.log(` sisyphus continue # reactivate session and clear roadmap for new work`);\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 .option('--session <sessionId>', 'Session ID (defaults to SISYPHUS_SESSION_ID env var)')\n .action(async (opts: { session?: string }) => {\n assertTmux();\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: 'continue', sessionId };\n const response = await sendRequest(request);\n if (response.ok) {\n console.log('Session reactivated. Roadmap cleared.');\n console.log('\\nThe previous roadmap has been wiped — you are starting fresh.');\n console.log('Consider writing a new roadmap before spawning agents.');\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.activeMs);\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.activeMs)})${RESET}`;\n } else {\n const elapsed = formatDuration(cycle.activeMs);\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.activeMs);\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 .option('--cwd <path>', 'Project directory to list sessions for (overrides SISYPHUS_CWD)')\n .action(async (opts: { all?: boolean; cwd?: string }) => {\n const cwd = opts.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 .option('--session <sessionId>', 'Session ID (defaults to SISYPHUS_SESSION_ID env var)')\n .action(async (opts: { message?: string; session?: string }) => {\n assertTmux();\n const sessionId = opts.session ?? process.env.SISYPHUS_SESSION_ID;\n const agentId = process.env.SISYPHUS_AGENT_ID;\n if (!sessionId || !agentId) {\n console.error('Error: provide --session or set SISYPHUS_SESSION_ID (and SISYPHUS_AGENT_ID) environment variables');\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/requirements.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 written requirements',\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 requirements and reference them directly:',\n '',\n ' sisyphus start \"Implement this @path/to/requirements.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 @requirements.md\" Start referencing requirements',\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"]}
|
|
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/onboard.ts","../src/cli/commands/companion-context.ts","../src/cli/commands/getting-started.ts","../src/cli/commands/init.ts","../src/cli/commands/setup.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, readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\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 { registerSetup } from './commands/setup.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(\n JSON.parse(\n readFileSync(join(dirname(fileURLToPath(import.meta.url)), '..', 'package.json'), 'utf-8'),\n ).version,\n );\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);\nregisterSetup(program);\n\nprogram.addHelpText('after', `\nExamples:\n $ sisyphus start \"Implement auth system\" Start a new session\n $ sisyphus start \"Build @requirements.md\" -n auth Start with a name and requirements 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', 'setup', 'uninstall', '--version', '-V'];\nif (!existsSync(globalDir()) && firstArg && !skipWelcome.includes(firstArg)) {\n mkdirSync(globalDir(), { recursive: true });\n console.log('');\n console.log(\" Welcome to Sisyphus. Run 'sisyphus setup' to get started.\");\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('--repo <name>', 'Repo subdirectory to use for this agent')\n .option('--session <sessionId>', 'Session ID (defaults to SISYPHUS_SESSION_ID env var)')\n .action(async (positionalInstruction: string | undefined, opts: { agentType: string; name: string; instruction?: string; repo?: string; session?: string }) => {\n assertTmux();\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 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 }\n\n const request: Request = {\n type: 'spawn',\n sessionId,\n agentType: opts.agentType,\n name: opts.name,\n instruction,\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 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 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 .option('--session <sessionId>', 'Session ID (defaults to SISYPHUS_SESSION_ID env var)')\n .action(async (opts: { report?: string; session?: string }) => {\n assertTmux();\n const sessionId = opts.session ?? process.env.SISYPHUS_SESSION_ID;\n const agentId = process.env.SISYPHUS_AGENT_ID;\n if (!sessionId || !agentId) {\n console.error('Error: provide --session or set SISYPHUS_SESSION_ID (and SISYPHUS_AGENT_ID) environment variables');\n process.exit(1);\n }\n\n const report = opts.report ?? await readStdin();\n if (!report) {\n console.error('Error: provide --report or pipe content via stdin');\n process.exit(1);\n }\n\n const request: Request = { type: 'submit', sessionId, agentId, report };\n const response = await sendRequest(request);\n if (response.ok) {\n console.log('Report submitted successfully');\n console.log('Your pane will close. The orchestrator resumes when all agents finish.');\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport { readStdin } from '../stdin.js';\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, validation)')\n .option('--session <sessionId>', 'Session ID (defaults to SISYPHUS_SESSION_ID env var)')\n .action(async (opts: { prompt?: string; mode?: string; session?: string }) => {\n assertTmux();\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 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 .option('--session <sessionId>', 'Session ID (defaults to SISYPHUS_SESSION_ID env var)')\n .action(async (opts: { report: string; session?: string }) => {\n assertTmux();\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: 'complete', sessionId, report: opts.report };\n const response = await sendRequest(request);\n if (response.ok) {\n console.log('Session completed.');\n console.log(`\\nTo keep working in this session:`);\n console.log(` sisyphus continue # reactivate session and clear roadmap for new work`);\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 .option('--session <sessionId>', 'Session ID (defaults to SISYPHUS_SESSION_ID env var)')\n .action(async (opts: { session?: string }) => {\n assertTmux();\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: 'continue', sessionId };\n const response = await sendRequest(request);\n if (response.ok) {\n console.log('Session reactivated. Roadmap cleared.');\n console.log('\\nThe previous roadmap has been wiped — you are starting fresh.');\n console.log('Consider writing a new roadmap before spawning agents.');\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.activeMs);\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.activeMs)})${RESET}`;\n } else {\n const elapsed = formatDuration(cycle.activeMs);\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.activeMs);\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 .option('--cwd <path>', 'Project directory to list sessions for (overrides SISYPHUS_CWD)')\n .action(async (opts: { all?: boolean; cwd?: string }) => {\n const cwd = opts.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 .option('--session <sessionId>', 'Session ID (defaults to SISYPHUS_SESSION_ID env var)')\n .action(async (opts: { message?: string; session?: string }) => {\n assertTmux();\n const sessionId = opts.session ?? process.env.SISYPHUS_SESSION_ID;\n const agentId = process.env.SISYPHUS_AGENT_ID;\n if (!sessionId || !agentId) {\n console.error('Error: provide --session or set SISYPHUS_SESSION_ID (and SISYPHUS_AGENT_ID) environment variables');\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 { detectTerminal, checkItermOptionKey, isNvimAvailable, isBeginCommandInstalled } from '../onboard.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\nfunction checkTerminal(): Check {\n if (process.platform !== 'darwin') {\n return { name: 'Terminal', status: 'ok', detail: 'Non-macOS (skipped)' };\n }\n const terminal = detectTerminal();\n if (terminal.isIterm) {\n return { name: 'Terminal', status: 'ok', detail: terminal.name };\n }\n return {\n name: 'Terminal',\n status: 'warn',\n detail: terminal.name ? terminal.name : 'unknown',\n fix: 'iTerm2 recommended for best experience: https://iterm2.com',\n };\n}\n\nfunction checkItermRightOptionKey(): Check | null {\n if (process.platform !== 'darwin') return null;\n const terminal = detectTerminal();\n if (!terminal.isIterm) return null;\n const result = checkItermOptionKey();\n if (!result.checked) return null;\n if (result.allCorrect) {\n return { name: 'Right Option Key', status: 'ok', detail: 'Esc+' };\n }\n const profiles = result.incorrectProfiles.map((p) => `\"${p}\"`).join(', ');\n return {\n name: 'Right Option Key',\n status: 'warn',\n detail: `Not Esc+ for ${profiles}`,\n fix: 'iTerm2 \\u2192 Settings \\u2192 Profiles \\u2192 Keys \\u2192 Right Option Key \\u2192 Esc+',\n };\n}\n\nfunction checkBeginCommand(): Check {\n if (isBeginCommandInstalled()) {\n return { name: '/begin command', status: 'ok', detail: 'Installed' };\n }\n return {\n name: '/begin command',\n status: 'warn',\n detail: 'Not installed',\n fix: 'sisyphus setup',\n };\n}\n\nfunction checkNvim(): Check {\n if (!isNvimAvailable()) {\n const fix = process.platform === 'darwin' ? 'brew install neovim' : 'Install neovim from https://neovim.io';\n return { name: 'nvim', status: 'warn', detail: 'Not installed', fix };\n }\n try {\n const version = execSync('nvim --version', { encoding: 'utf-8', stdio: 'pipe' }).split('\\n')[0]?.replace('NVIM ', '');\n return { name: 'nvim', status: 'ok', detail: version ?? 'installed' };\n } catch {\n return { name: 'nvim', status: 'ok', detail: 'installed' };\n }\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 itermCheck = checkItermRightOptionKey();\n const checks: Check[] = [\n checkNodeVersion(),\n checkClaudeCli(),\n checkGit(),\n checkTmux(),\n checkTmuxVersion(),\n checkTerminal(),\n ...(itermCheck ? [itermCheck] : []),\n checkGlobalDir(),\n checkDaemonInstalled(),\n checkDaemonRunning(),\n checkCycleScript(),\n checkTmuxKeybind(),\n checkBeginCommand(),\n checkNvim(),\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 { execSync } from 'node:child_process';\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport interface TerminalInfo {\n name: string;\n isIterm: boolean;\n}\n\nexport interface ItermOptionKeyResult {\n checked: boolean;\n allCorrect: boolean;\n incorrectProfiles: string[];\n}\n\nexport interface NvimInfo {\n installed: boolean;\n autoInstalled: boolean;\n version: string;\n lazyVimInstalled: boolean;\n}\n\nexport interface CommandInfo {\n installed: boolean;\n autoInstalled: boolean;\n path: string;\n}\n\nexport interface OnboardResult {\n tmuxInstalled: boolean;\n tmuxAutoInstalled: boolean;\n terminal: TerminalInfo;\n itermOptionKey: ItermOptionKeyResult;\n tmuxDefaultsWritten: boolean;\n nvim: NvimInfo;\n command: CommandInfo;\n}\n\nexport function detectTerminal(): TerminalInfo {\n const termProgram = process.env['TERM_PROGRAM'] || '';\n const isIterm = termProgram === 'iTerm.app' || !!process.env['ITERM_SESSION_ID'];\n return { name: termProgram || 'unknown', isIterm };\n}\n\nfunction isTmuxAvailable(): boolean {\n try {\n execSync('which tmux', { stdio: 'pipe' });\n return true;\n } catch {\n return false;\n }\n}\n\nfunction isBrewAvailable(): boolean {\n try {\n execSync('which brew', { stdio: 'pipe' });\n return true;\n } catch {\n return false;\n }\n}\n\nfunction tryAutoInstallTmux(): boolean {\n if (!isBrewAvailable()) return false;\n try {\n console.log(' Installing tmux via Homebrew...');\n execSync('brew install tmux', { stdio: 'inherit' });\n return isTmuxAvailable();\n } catch {\n return false;\n }\n}\n\nexport function checkItermOptionKey(): ItermOptionKeyResult {\n if (process.platform !== 'darwin') {\n return { checked: false, allCorrect: true, incorrectProfiles: [] };\n }\n\n const plistPath = join(homedir(), 'Library', 'Preferences', 'com.googlecode.iterm2.plist');\n if (!existsSync(plistPath)) {\n return { checked: false, allCorrect: false, incorrectProfiles: [] };\n }\n\n try {\n const json = execSync(\n `plutil -extract \"New Bookmarks\" json -o - \"${plistPath}\"`,\n { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] },\n );\n const profiles = JSON.parse(json) as Array<Record<string, unknown>>;\n const currentProfile = process.env['ITERM_PROFILE'];\n const incorrect: string[] = [];\n for (const profile of profiles) {\n const name = (profile['Name'] as string) || 'Unnamed';\n // Only check the current profile (or all if we can't detect which)\n if (currentProfile && name !== currentProfile) continue;\n // 0 = Normal, 1 = Meta, 2 = Esc+\n if (profile['Right Option Key Sends'] !== 2) {\n incorrect.push(name);\n }\n }\n return { checked: true, allCorrect: incorrect.length === 0, incorrectProfiles: incorrect };\n } catch {\n return { checked: false, allCorrect: false, incorrectProfiles: [] };\n }\n}\n\nfunction hasExistingTmuxConf(): boolean {\n return (\n existsSync(join(homedir(), '.tmux.conf')) ||\n existsSync(join(homedir(), '.config', 'tmux', 'tmux.conf'))\n );\n}\n\nconst TMUX_DEFAULTS = `# Sensible tmux defaults (installed by sisyphus)\n# Customize freely — sisyphus won't overwrite this file.\n\n# Enable mouse (click panes, scroll, resize)\nset -g mouse on\n\n# Scrollback history\nset -g history-limit 50000\n\n# 256 color + true color support\nset -g default-terminal \"tmux-256color\"\nset -as terminal-overrides \",*:Tc\"\n\n# Low escape delay (keeps Option/Meta keybindings responsive)\nset -sg escape-time 10\n\n# Window numbering from 1\nset -g base-index 1\nsetw -g pane-base-index 1\n\n# Renumber windows when one closes\nset -g renumber-windows on\n\n# Clipboard integration\nset -g set-clipboard on\n\n# Focus events (for editors)\nset -g focus-events on\n`;\n\nfunction writeTmuxDefaults(): void {\n const confPath = join(homedir(), '.tmux.conf');\n writeFileSync(confPath, TMUX_DEFAULTS, 'utf8');\n}\n\nexport function isNvimAvailable(): boolean {\n try {\n execSync('which nvim', { stdio: 'pipe' });\n return true;\n } catch {\n return false;\n }\n}\n\nfunction getNvimVersion(): string {\n try {\n return execSync('nvim --version', { encoding: 'utf-8', stdio: 'pipe' }).split('\\n')[0]?.replace('NVIM ', '') || 'unknown';\n } catch {\n return 'unknown';\n }\n}\n\nfunction hasLazyVimConfig(): boolean {\n return existsSync(join(homedir(), '.config', 'nvim', 'lazy-lock.json'));\n}\n\nexport function tryAutoInstallNvim(): NvimInfo {\n if (isNvimAvailable()) {\n return { installed: true, autoInstalled: false, version: getNvimVersion(), lazyVimInstalled: hasLazyVimConfig() };\n }\n if (!isBrewAvailable()) {\n return { installed: false, autoInstalled: false, version: '', lazyVimInstalled: false };\n }\n try {\n console.log(' Installing neovim via Homebrew...');\n execSync('brew install neovim', { stdio: 'inherit' });\n } catch {\n return { installed: false, autoInstalled: false, version: '', lazyVimInstalled: false };\n }\n if (!isNvimAvailable()) {\n return { installed: false, autoInstalled: false, version: '', lazyVimInstalled: false };\n }\n // Clone LazyVim starter config if no nvim config exists\n const nvimConfigDir = join(homedir(), '.config', 'nvim');\n let lazyVimInstalled = false;\n if (!existsSync(nvimConfigDir)) {\n try {\n console.log(' Cloning LazyVim starter config...');\n execSync(`git clone https://github.com/LazyVim/starter ${nvimConfigDir}`, { stdio: 'inherit' });\n // Remove .git so user owns the config\n const gitDir = join(nvimConfigDir, '.git');\n if (existsSync(gitDir)) {\n execSync(`rm -rf \"${gitDir}\"`, { stdio: 'pipe' });\n }\n lazyVimInstalled = true;\n } catch {\n // Non-fatal — nvim is installed, just no starter config\n }\n }\n return { installed: true, autoInstalled: true, version: getNvimVersion(), lazyVimInstalled };\n}\n\nfunction beginCommandPath(): string {\n return join(homedir(), '.claude', 'commands', 'sisyphus', 'begin.md');\n}\n\nfunction bundledBeginCommandPath(): string {\n const distDir = dirname(fileURLToPath(import.meta.url));\n return join(distDir, 'templates', 'begin.md');\n}\n\nexport function isBeginCommandInstalled(): boolean {\n return existsSync(beginCommandPath());\n}\n\nexport function installBeginCommand(): CommandInfo {\n const dest = beginCommandPath();\n if (existsSync(dest)) {\n return { installed: true, autoInstalled: false, path: dest };\n }\n const src = bundledBeginCommandPath();\n if (!existsSync(src)) {\n return { installed: false, autoInstalled: false, path: dest };\n }\n try {\n mkdirSync(dirname(dest), { recursive: true });\n writeFileSync(dest, readFileSync(src, 'utf-8'), 'utf8');\n return { installed: true, autoInstalled: true, path: dest };\n } catch {\n return { installed: false, autoInstalled: false, path: dest };\n }\n}\n\nexport function runOnboarding(): OnboardResult {\n const terminal = detectTerminal();\n const tmuxAlreadyInstalled = isTmuxAvailable();\n\n let tmuxInstalled = tmuxAlreadyInstalled;\n let tmuxAutoInstalled = false;\n let tmuxDefaultsWritten = false;\n\n // Auto-install tmux if missing\n if (!tmuxAlreadyInstalled && process.platform === 'darwin') {\n tmuxAutoInstalled = tryAutoInstallTmux();\n tmuxInstalled = tmuxAutoInstalled;\n\n // Write sensible defaults only for fresh tmux installs (don't touch existing configs)\n if (tmuxAutoInstalled && !hasExistingTmuxConf()) {\n writeTmuxDefaults();\n tmuxDefaultsWritten = true;\n }\n }\n\n // Check iTerm2 right option key\n let itermOptionKey: ItermOptionKeyResult = { checked: false, allCorrect: true, incorrectProfiles: [] };\n if (terminal.isIterm) {\n itermOptionKey = checkItermOptionKey();\n }\n\n // Nvim\n const nvim = tryAutoInstallNvim();\n\n // /begin command\n const command = installBeginCommand();\n\n return { tmuxInstalled, tmuxAutoInstalled, terminal, itermOptionKey, tmuxDefaultsWritten, nvim, command };\n}\n\nexport function formatOnboardingMessages(result: OnboardResult): string[] {\n const lines: string[] = [];\n\n // Terminal recommendation (macOS only)\n if (process.platform === 'darwin' && !result.terminal.isIterm) {\n lines.push(\n ` Terminal: ${result.terminal.name || 'unknown'}`,\n ' Tip: iTerm2 is recommended for the best experience with sisyphus.',\n ' Download: https://iterm2.com',\n '',\n );\n }\n\n // tmux status\n if (result.tmuxAutoInstalled) {\n lines.push(' \\u2713 tmux installed via Homebrew.');\n if (result.tmuxDefaultsWritten) {\n lines.push(' \\u2713 Default tmux config written to ~/.tmux.conf');\n }\n lines.push('');\n } else if (!result.tmuxInstalled) {\n const installHint = process.platform === 'darwin'\n ? ' Install Homebrew (https://brew.sh) then run: brew install tmux'\n : ' Install: apt install tmux (Debian/Ubuntu) or your package manager';\n lines.push(\n ' \\u2717 tmux is required but could not be installed automatically.',\n installHint,\n '',\n );\n }\n\n // iTerm2 right option key\n if (result.itermOptionKey.checked && !result.itermOptionKey.allCorrect) {\n const profiles = result.itermOptionKey.incorrectProfiles;\n lines.push(\n ' \\u26a0 Right Option Key is not sending Esc+ in iTerm2:',\n ...profiles.map((p) => ` \\u2022 Profile \"${p}\"`),\n '',\n ' Sisyphus uses Option keybindings (e.g., Option-s to cycle sessions).',\n ' Fix: iTerm2 \\u2192 Settings \\u2192 Profiles \\u2192 Keys \\u2192 Right Option Key \\u2192 Esc+',\n '',\n );\n }\n\n return lines;\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';\nimport { isNvimAvailable } from '../onboard.js';\n\nfunction isClaudeCode(): boolean {\n return !!process.env['CLAUDECODE'];\n}\n\nfunction printNonClaudeMessage(): void {\n console.log(`\n ╔══════════════════════════════════════════════════╗\n ║ sisyphus getting-started — Interactive Tutorial ║\n ╚══════════════════════════════════════════════════╝\n\n This command provides an interactive tutorial best experienced\n inside Claude Code. Claude will walk you through setup step by step.\n\n To start:\n 1. Open Claude Code: claude\n 2. Run: sisyphus getting-started\n\n If you just want the quick reference, run:\n sisyphus --help\n sisyphus doctor\n`);\n}\n\nfunction printStep0(): void {\n const tmuxInstalled = isTmuxInstalled();\n const inTmux = !!process.env['TMUX'];\n let tmuxSession: string | null = null;\n if (process.env['TMUX']) {\n const segments = process.env['TMUX'].split(',');\n const pathPart = segments[0];\n if (pathPart) {\n const parts = pathPart.split('/');\n tmuxSession = parts[parts.length - 1] || null;\n }\n }\n\n console.log(`\n<claude-instructions>\n# Sisyphus Getting Started — Step 0: Entry & Tmux Gate\n\n## Environment Data\n- tmuxInstalled: ${tmuxInstalled}\n- inTmux: ${inTmux}\n- tmuxSession: ${tmuxSession ?? 'none'}\n\n## Tutorial Overview\n\nThis tutorial has 5 steps. Share this overview so the user knows what's coming and can skip ahead:\n\n| Step | Topic | Command |\n|------|-------|---------|\n| 0 | Entry & tmux gate (you are here) | \\`sisyphus getting-started\\` |\n| 1 | Tmux basics — sessions, panes, navigation | \\`--tutorial 1\\` |\n| 2 | Nvim basics — open, save, quit (optional) | \\`--tutorial 2\\` |\n| 3 | Sisyphus concepts — session model & keybinds | \\`--tutorial 3\\` |\n| 4 | Live demo — launch and observe a real session | \\`--tutorial 4\\` |\n\nTell the user they can skip to any step with \\`sisyphus getting-started --tutorial <N>\\`.\n\n## Instructions for Claude\n\nYou are guiding a user through the Sisyphus interactive tutorial.\n\n### First: Ask if they want the tutorial\n\nAsk the user if they'd like the interactive walkthrough. If they decline, give this quick summary and stop:\n\n> Sisyphus is a multi-agent orchestrator for Claude Code. Start a session with \\`sisyphus start \"task\"\\`,\n> monitor with \\`sisyphus dashboard\\`, and check health with \\`sisyphus doctor\\`.\n\n### If they want the tutorial:\n\n**Case 1: tmux is NOT installed (tmuxInstalled: false)**\n- Explain what tmux is in 2-3 sentences: \"tmux is a terminal multiplexer — it lets you split your terminal into multiple panes and keep sessions running in the background. Sisyphus uses it to give each agent its own workspace.\"\n- Show this ASCII diagram:\n\n\\`\\`\\`\n Regular terminal: With tmux:\n ┌──────────────┐ ┌──────┬──────┐\n │ │ │ Agent│ Agent│\n │ one view │ │ 001 │ 002 │\n │ │ ├──────┼──────┤\n │ │ │ Agent│ Orch │\n └──────────────┘ │ 003 │ │\n └──────┴──────┘\n\\`\\`\\`\n\n- Tell them to install tmux:\n - macOS: \\`brew install tmux\\`\n - Linux: \\`apt install tmux\\` or their package manager\n- After install, re-run: \\`sisyphus getting-started --tutorial 0\\` to verify\n\n**Case 2: tmux installed but NOT in a tmux session (inTmux: false)**\n- Tell the user they need to be inside a tmux session for the tutorial\n- Have them run: \\`tmux new-session\\`\n- Then resume the conversation with Claude in the new tmux session: \\`claude\\`\n- Then re-run: \\`sisyphus getting-started --tutorial 0\\` to verify\n\n**Case 3: In tmux (inTmux: true)**\n- Tell the user they're all set — tmux is running\n- Proceed by running: \\`sisyphus getting-started --tutorial 1\\`\n</claude-instructions>\n`);\n}\n\nfunction printStep1(): void {\n console.log(`\n<claude-instructions>\n# Sisyphus Getting Started — Step 1: Tmux Basics\n\n## Instructions for Claude\n\nTeach the user tmux fundamentals. Be conversational and encouraging.\n\n### 1. Explain the concepts with diagrams\n\n**Sessions, Windows, and Panes:**\n\n\\`\\`\\`\ntmux session \"work\"\n├── window 1: \"code\"\n│ ┌──────────┬──────────┐\n│ │ pane 1 │ pane 2 │\n│ │ (editor)│ (tests) │\n│ └──────────┴──────────┘\n└── window 2: \"servers\"\n ┌──────────────────────┐\n │ pane 1 │\n │ (dev server) │\n └──────────────────────┘\n\\`\\`\\`\n\n- **Session**: A collection of windows. Persists even if you close the terminal.\n- **Window**: Like a tab. Each window fills the screen.\n- **Pane**: A split within a window. Sisyphus puts each agent in its own pane.\n\n### 2. Hands-on: Create a test split\n\nRun this command for the user:\n\\`\\`\\`\ntmux split-window -h\n\\`\\`\\`\n\nTell them: \"I just split your terminal. You should see two panes side by side.\"\n\nExplain navigation:\n- \\`Ctrl-b\\` then \\`→\\` (right arrow): move to the right pane\n- \\`Ctrl-b\\` then \\`←\\` (left arrow): move to the left pane\n- The prefix \\`Ctrl-b\\` is always pressed first, then released, then the arrow key\n\nAsk them to try navigating between panes.\n\n### 3. Clean up the test pane\n\nOnce they confirm they can navigate, close the extra pane:\n\\`\\`\\`\ntmux kill-pane -t {the other pane}\n\\`\\`\\`\n\nOr tell them they can type \\`exit\\` in the extra pane to close it.\n\n### 4. Teach essential commands\n\n- **Detach**: \\`Ctrl-b d\\` — leaves tmux running in background, returns to normal terminal\n- **Reattach**: \\`tmux attach\\` (or \\`tmux a\\`) — reconnects to the running session\n- **Scroll mode**: \\`Ctrl-b [\\` — lets you scroll up through output. Press \\`q\\` to exit scroll mode.\n\n### 5. Verification\n\nAsk the user to confirm: \"Can you navigate between panes with Ctrl-b + arrow keys?\"\n\nOnce confirmed, proceed:\n\\`\\`\\`\nsisyphus getting-started --tutorial 2\n\\`\\`\\`\n</claude-instructions>\n`);\n}\n\nfunction printStep2(): void {\n const nvimInstalled = isNvimAvailable();\n\n console.log(`\n<claude-instructions>\n# Sisyphus Getting Started — Step 2: Nvim Basics\n\n## Environment Data\n- nvimInstalled: ${nvimInstalled}\n\n## Instructions for Claude\n\nThis step is OPTIONAL. Nvim is useful for reviewing agent work in tmux panes but not required.\n\n### If nvim is NOT installed (nvimInstalled: false)\n\nAsk the user: \"Neovim is handy for reviewing files in tmux panes. Want me to install it, or skip this step?\"\n\n- **Install**: Run \\`brew install neovim\\` (macOS) or suggest their package manager\n- **Skip**: That's fine — they can use \\`cat\\`, \\`less\\`, or any editor they prefer. Proceed to step 3.\n\n### If nvim IS installed (nvimInstalled: true)\n\nTeach exactly 3 things — no more:\n\n1. **Open a file**: \\`nvim filename.txt\\`\n2. **Save and close**: \\`ZZ\\` (capital Z twice — hold Shift, press Z twice)\n3. **Quit without saving**: \\`:q!\\` (colon, q, exclamation mark, Enter)\n\n### Hands-on exercise\n\nCreate a temporary file for practice:\n\\`\\`\\`\necho \"Hello from the sisyphus tutorial!\" > /tmp/sisyphus-tutorial-test.txt\n\\`\\`\\`\n\nWalk them through:\n1. Open it: \\`nvim /tmp/sisyphus-tutorial-test.txt\\`\n2. Look around (they're in normal mode — arrow keys work for navigation)\n3. Close it: type \\`ZZ\\`\n\nTell them: \"That's all you need. When you jump into a sisyphus agent's pane, you can use \\`nvim\\` to inspect files the agent is working on.\"\n\n### Verification\n\nAsk if they were able to open and close the file (or if they skipped).\n\nProceed:\n\\`\\`\\`\nsisyphus getting-started --tutorial 3\n\\`\\`\\`\n</claude-instructions>\n`);\n}\n\nfunction printStep3(): void {\n console.log(`\n<claude-instructions>\n# Sisyphus Getting Started — Step 3: Sisyphus Concepts & Keybinds\n\n## Instructions for Claude\n\n### 1. Explain the session model\n\nThis is the KEY concept. Use the diagram and be clear:\n\n\\`\\`\\`\n YOUR tmux session (\"work\") Sisyphus tmux session (\"sisyphus-abc123\")\n ┌─────────────────────┐ ┌──────────┬──────────┬──────────┐\n │ │ │ Orch │ Agent │ Agent │\n │ Your normal work │ ←──→ │ (yellow)│ (blue) │ (green) │\n │ + dashboard │ │ │ │ │\n │ │ │ Plans & │ Writes │ Writes │\n │ │ │ assigns │ code │ tests │\n └─────────────────────┘ └──────────┴──────────┴──────────┘\n\\`\\`\\`\n\nKey points:\n- Sisyphus creates its OWN tmux session — it doesn't clutter yours\n- The **orchestrator** (yellow pane) plans work and spawns agents\n- **Agents** (colored panes) work in parallel on subtasks\n- Your session stays clean — you get a **dashboard** for monitoring\n- You can jump between your session and the sisyphus session to observe\n\n### 2. Teach keybinds\n\nTwo keybinds to remember:\n\n| Keybind | Action |\n|---------|--------|\n| \\`M-s\\` (Option+s) | Cycle through sisyphus sessions |\n| \\`M-S\\` (Option+Shift+s) | Jump back to dashboard |\n\n\"M\" means \"Meta\" which is the Option key on macOS. So \\`M-s\\` = hold Option, press s.\n\n### 3. Verify keybinds are installed\n\nRun \\`sisyphus doctor\\` and check the output. Look for:\n- \"Cycle script\" — should be ✓\n- \"Tmux keybind\" — should be ✓\n\nIf either is missing, run: \\`sisyphus setup-keybind\\`\n\n### 4. Test the keybind\n\nHave the user try pressing \\`Option+s\\`. Nothing should happen yet (no sisyphus session running) — and that's fine. The important thing is it doesn't error.\n\nIf they get a special character (like ß) instead of the keybind firing, explain:\n- Their terminal needs to send Option as Esc+ (Meta)\n- iTerm2: Settings → Profiles → Keys → Right Option Key → Esc+\n- Other terminals: look for \"Meta key\" or \"Option sends\" in preferences\n\n### 5. Verification\n\nConfirm:\n- They understand the two-session model (their session vs sisyphus session)\n- \\`sisyphus doctor\\` shows keybinds installed\n- Option+s doesn't produce a special character\n\nProceed:\n\\`\\`\\`\nsisyphus getting-started --tutorial 4\n\\`\\`\\`\n</claude-instructions>\n`);\n}\n\nfunction printStep4(): void {\n console.log(`\n<claude-instructions>\n# Sisyphus Getting Started — Step 4: Demo Session\n\n## Instructions for Claude\n\nThis is the grand finale — a live demo session.\n\n### 1. Health check\n\nRun \\`sisyphus doctor\\` first. If any checks are failing, help the user fix them before proceeding.\nAll core checks (tmux, daemon, keybinds) should be ✓.\n\n### 2. Launch the demo\n\nRun this command:\n\\`\\`\\`\nsisyphus start \"Tutorial demo: explore this repository's structure, identify the main entry points, and write a brief summary of what each top-level directory contains\" -c \"This is a tutorial demo session. Be extra verbose in your planning and reports so the user watching can understand what's happening. Keep the scope small — 2-3 agents max, 1-2 cycles.\"\n\\`\\`\\`\n\n### 3. Walk through what's happening\n\nGuide the user through observing the session in real-time:\n\n**Step A: Dashboard**\n- The dashboard should auto-open. If not, run \\`sisyphus dashboard\\`\n- Point out: session status, cycle number, agent list\n- Tell them: \"Watch the roadmap section — it updates as the orchestrator plans\"\n\n**Step B: Jump to sisyphus session**\n- Have them press \\`M-s\\` (Option+s) to cycle to the sisyphus tmux session\n- They should see the orchestrator (yellow) working — reading files, planning\n- Point out: \"Each pane is a separate Claude instance working independently\"\n\n**Step C: Jump back**\n- Press \\`M-S\\` (Option+Shift+s) to jump back to the dashboard\n- Or \\`M-s\\` to cycle through\n\n**Step D: Watch the lifecycle**\n- As agents spawn, they'll appear in both the dashboard and the sisyphus session\n- Agents submit reports when done\n- The orchestrator respawns each cycle with fresh context\n- Eventually the session completes\n\n### 4. After completion\n\nOnce the session shows \"completed\":\n\n- Run \\`sisyphus status\\` to see the final state\n- Show them the session directory: \\`ls .sisyphus/sessions/\\` → find the session → show \\`roadmap.md\\`\n- Explain: \"Every session creates a roadmap, agent reports, and logs — all in .sisyphus/sessions/\"\n\n### 5. Congratulations!\n\nWrap up with:\n\n> You've completed the Sisyphus tutorial! Here's what you learned:\n> - tmux basics (sessions, panes, navigation)\n> - How sisyphus creates separate sessions for orchestrator + agents\n> - How to monitor with the dashboard and keybinds\n> - What a real session lifecycle looks like\n>\n> **Ready for real work?**\n> \\`sisyphus start \"your actual task here\"\\`\n>\n> **Tips:**\n> - Write requirements in a file and reference them: \\`sisyphus start \"Implement @requirements.md\"\\`\n> - Monitor actively — agents can get stuck. Use the dashboard's \\`m\\` key to message the orchestrator.\n> - Check \\`sisyphus --help\\` for all commands.\n</claude-instructions>\n`);\n}\n\nconst STEPS: Array<() => void> = [printStep0, printStep1, printStep2, printStep3, printStep4];\n\nexport function registerGettingStarted(program: Command): void {\n program\n .command('getting-started')\n .description('Interactive tutorial (best with Claude Code)')\n .option('--tutorial <step>', 'Tutorial step (0-4)', parseInt)\n .action((opts) => {\n if (opts.tutorial !== undefined) {\n const step = opts.tutorial as number;\n if (step < 0 || step > 4 || Number.isNaN(step)) {\n console.error(`Invalid tutorial step: ${opts.tutorial}. Must be 0-4.`);\n process.exit(1);\n }\n STEPS[step]!();\n return;\n }\n if (!isClaudeCode()) {\n printNonClaudeMessage();\n return;\n }\n printStep0();\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","import { execSync } from 'node:child_process';\nimport type { Command } from 'commander';\nimport { runOnboarding, type OnboardResult } from '../onboard.js';\nimport { ensureDaemonInstalled, isInstalled } from '../install.js';\nimport { setupTmuxKeybind, DEFAULT_KEY, DEFAULT_HOME_KEY } from '../tmux-setup.js';\n\nfunction getTmuxVersion(): string {\n try {\n return execSync('tmux -V', { encoding: 'utf-8', stdio: 'pipe' }).trim();\n } catch {\n return 'installed';\n }\n}\n\nfunction printResults(result: OnboardResult, daemonOk: boolean, keybindMsg: string): void {\n console.log('');\n console.log('Setting up Sisyphus...');\n console.log('');\n\n // tmux\n if (result.tmuxInstalled) {\n const detail = getTmuxVersion();\n console.log(` \\u2713 tmux: ${detail}${result.tmuxAutoInstalled ? ' (just installed)' : ''}`);\n } else {\n const hint = process.platform === 'darwin'\n ? 'Install Homebrew (https://brew.sh) then: brew install tmux'\n : 'apt install tmux (Debian/Ubuntu) or your package manager';\n console.log(` \\u2717 tmux: Not installed \\u2014 ${hint}`);\n }\n\n // tmux config\n if (result.tmuxDefaultsWritten) {\n console.log(' \\u2713 tmux config: Sensible defaults written to ~/.tmux.conf');\n }\n\n // Terminal\n if (process.platform === 'darwin') {\n if (result.terminal.isIterm) {\n console.log(` \\u2713 Terminal: ${result.terminal.name}`);\n } else {\n const name = result.terminal.name ? result.terminal.name : 'unknown';\n console.log(` \\u26a0 Terminal: ${name} \\u2014 iTerm2 recommended (https://iterm2.com)`);\n }\n }\n\n // iTerm option key\n if (result.itermOptionKey.checked) {\n if (result.itermOptionKey.allCorrect) {\n console.log(' \\u2713 Right Option Key: Esc+');\n } else {\n const profiles = result.itermOptionKey.incorrectProfiles.map((p) => `\"${p}\"`).join(', ');\n console.log(` \\u26a0 Right Option Key: Not set to Esc+ for ${profiles}`);\n console.log(' Fix: iTerm2 \\u2192 Settings \\u2192 Profiles \\u2192 Keys \\u2192 Right Option Key \\u2192 Esc+');\n }\n }\n\n // Daemon\n if (daemonOk) {\n console.log(' \\u2713 Daemon: Running');\n } else {\n console.log(' \\u2717 Daemon: Failed to start');\n }\n\n // Keybindings\n console.log(` \\u2713 Keybindings: ${keybindMsg}`);\n\n // /begin command\n if (result.command.installed) {\n console.log(` \\u2713 /begin command: ${result.command.path}${result.command.autoInstalled ? ' (just installed)' : ''}`);\n } else {\n console.log(' \\u2717 /begin command: Failed to install');\n }\n\n // Nvim\n if (result.nvim.installed) {\n const extra = result.nvim.autoInstalled ? ' (just installed)' : '';\n console.log(` \\u2713 Editor: nvim ${result.nvim.version}${extra}`);\n if (result.nvim.lazyVimInstalled) {\n console.log(' \\u2713 LazyVim: Starter config installed to ~/.config/nvim/');\n }\n } else {\n console.log(' \\u26a0 Editor: nvim not installed');\n if (process.platform === 'darwin') {\n console.log(' Install: brew install neovim');\n }\n }\n\n console.log('');\n console.log(\"Run 'sisyphus getting-started' for a usage guide.\");\n console.log('');\n}\n\nexport function registerSetup(program: Command): void {\n program\n .command('setup')\n .description('One-time setup: install dependencies, daemon, keybindings, and commands')\n .action(async () => {\n // 1. Onboarding (tmux, terminal, iterm, nvim, plugin)\n const result = runOnboarding();\n\n // 2. Daemon\n let daemonOk = false;\n try {\n await ensureDaemonInstalled();\n daemonOk = true;\n } catch {\n daemonOk = isInstalled();\n }\n\n // 3. Keybindings\n const keybindResult = setupTmuxKeybind();\n let keybindMsg: string;\n if (keybindResult.status === 'installed' || keybindResult.status === 'already-installed') {\n keybindMsg = `${DEFAULT_KEY} (cycle), ${DEFAULT_HOME_KEY} (dashboard)`;\n } else {\n keybindMsg = keybindResult.message;\n }\n\n printResults(result, daemonOk, keybindMsg);\n });\n}\n"],"mappings":"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","names":["existsSync","mkdirSync","readFileSync","dirname","join","fileURLToPath","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","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","mkdirSync","readFileSync","writeFileSync","homedir","dirname","join","fileURLToPath","plistPath","execSync","existsSync","program","program","program","existsSync","mkdirSync","writeFileSync","join","program","execSync","execSync","program","readFileSync","join","dirname","fileURLToPath","existsSync","mkdirSync"]}
|