sisyphi 1.1.18 → 1.1.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (231) hide show
  1. package/README.md +195 -75
  2. package/dist/chunk-36VJ7ZBD.js +1898 -0
  3. package/dist/chunk-36VJ7ZBD.js.map +1 -0
  4. package/dist/{chunk-C2XKXERJ.js → chunk-M6Z3KHOH.js} +159 -46
  5. package/dist/chunk-M6Z3KHOH.js.map +1 -0
  6. package/dist/chunk-O4ZHSQ5R.js +544 -0
  7. package/dist/chunk-O4ZHSQ5R.js.map +1 -0
  8. package/dist/chunk-P2HHTIPM.js +478 -0
  9. package/dist/chunk-P2HHTIPM.js.map +1 -0
  10. package/dist/{chunk-TMBAVPHH.js → chunk-PNDCVKBN.js} +73 -1
  11. package/dist/chunk-PNDCVKBN.js.map +1 -0
  12. package/dist/chunk-SVGIQ2G4.js +1076 -0
  13. package/dist/chunk-SVGIQ2G4.js.map +1 -0
  14. package/dist/cli.js +4405 -892
  15. package/dist/cli.js.map +1 -1
  16. package/dist/daemon.js +4340 -1990
  17. package/dist/daemon.js.map +1 -1
  18. package/dist/{paths-XRDEEJ5R.js → paths-JXFLR5BN.js} +38 -2
  19. package/dist/single-ask-6G4BIVY2.js +132 -0
  20. package/dist/single-ask-6G4BIVY2.js.map +1 -0
  21. package/dist/templates/CLAUDE.md +1 -56
  22. package/dist/templates/agent-plugin/agents/CLAUDE.md +2 -65
  23. package/dist/templates/agent-plugin/agents/debug.md +43 -6
  24. package/dist/templates/agent-plugin/agents/debug.settings.json +57 -0
  25. package/dist/templates/agent-plugin/agents/explore.md +28 -1
  26. package/dist/templates/agent-plugin/agents/explore.settings.json +57 -0
  27. package/dist/templates/agent-plugin/agents/implementor.md +94 -0
  28. package/dist/templates/agent-plugin/agents/implementor.settings.json +57 -0
  29. package/dist/templates/agent-plugin/agents/operator.md +43 -1
  30. package/dist/templates/agent-plugin/agents/operator.settings.json +57 -0
  31. package/dist/templates/agent-plugin/agents/plan/sub-planner.md +75 -0
  32. package/dist/templates/agent-plugin/agents/plan.md +176 -86
  33. package/dist/templates/agent-plugin/agents/plan.settings.json +57 -0
  34. package/dist/templates/agent-plugin/agents/problem/adversarial.md +26 -0
  35. package/dist/templates/agent-plugin/agents/problem/contrarian.md +26 -0
  36. package/dist/templates/agent-plugin/agents/problem/first-principles.md +26 -0
  37. package/dist/templates/agent-plugin/agents/problem/precedent.md +25 -0
  38. package/dist/templates/agent-plugin/agents/problem/simplifier.md +26 -0
  39. package/dist/templates/agent-plugin/agents/problem/systems-thinker.md +26 -0
  40. package/dist/templates/agent-plugin/agents/problem/time-traveler.md +26 -0
  41. package/dist/templates/agent-plugin/agents/problem/user-empathy.md +26 -0
  42. package/dist/templates/agent-plugin/agents/problem.md +334 -79
  43. package/dist/templates/agent-plugin/agents/problem.settings.json +57 -0
  44. package/dist/templates/agent-plugin/agents/research-lead/CLAUDE.md +26 -0
  45. package/dist/templates/agent-plugin/agents/research-lead/critic.md +61 -0
  46. package/dist/templates/agent-plugin/agents/research-lead/researcher.md +60 -0
  47. package/dist/templates/agent-plugin/agents/research-lead.md +184 -0
  48. package/dist/templates/agent-plugin/agents/research-lead.settings.json +57 -0
  49. package/dist/templates/agent-plugin/agents/review/CLAUDE.md +3 -29
  50. package/dist/templates/agent-plugin/agents/review/compliance.md +14 -3
  51. package/dist/templates/agent-plugin/agents/review/efficiency.md +15 -4
  52. package/dist/templates/agent-plugin/agents/review/quality.md +20 -6
  53. package/dist/templates/agent-plugin/agents/review/reuse.md +17 -5
  54. package/dist/templates/agent-plugin/agents/review/security.md +10 -3
  55. package/dist/templates/agent-plugin/agents/review/tests.md +58 -0
  56. package/dist/templates/agent-plugin/agents/review-plan/CLAUDE.md +28 -0
  57. package/dist/templates/agent-plugin/agents/review-plan/code-smells.md +4 -2
  58. package/dist/templates/agent-plugin/agents/review-plan/pattern-consistency.md +4 -2
  59. package/dist/templates/agent-plugin/agents/review-plan/requirements-coverage.md +3 -1
  60. package/dist/templates/agent-plugin/agents/review-plan/security.md +5 -2
  61. package/dist/templates/agent-plugin/agents/review-plan.md +52 -5
  62. package/dist/templates/agent-plugin/agents/review-plan.settings.json +57 -0
  63. package/dist/templates/agent-plugin/agents/review.md +89 -16
  64. package/dist/templates/agent-plugin/agents/review.settings.json +57 -0
  65. package/dist/templates/agent-plugin/agents/spec/engineer.md +175 -0
  66. package/dist/templates/agent-plugin/agents/spec/requirements-writer.md +149 -0
  67. package/dist/templates/agent-plugin/agents/spec.md +444 -0
  68. package/dist/templates/agent-plugin/agents/spec.settings.json +57 -0
  69. package/dist/templates/agent-plugin/agents/test-spec.md +58 -2
  70. package/dist/templates/agent-plugin/agents/test-spec.settings.json +57 -0
  71. package/dist/templates/agent-plugin/hooks/CLAUDE.md +9 -57
  72. package/dist/templates/agent-plugin/hooks/ask-background-guard.sh +57 -0
  73. package/dist/templates/agent-plugin/hooks/intercept-send-message.sh +1 -1
  74. package/dist/templates/agent-plugin/hooks/plan-user-prompt.sh +8 -7
  75. package/dist/templates/agent-plugin/hooks/plan-validate.sh +97 -0
  76. package/dist/templates/agent-plugin/hooks/plan-write-path.sh +55 -0
  77. package/dist/templates/agent-plugin/hooks/problem-user-prompt.sh +26 -0
  78. package/dist/templates/agent-plugin/hooks/register-bg-task.sh +37 -0
  79. package/dist/templates/agent-plugin/hooks/require-submit.sh +51 -42
  80. package/dist/templates/agent-plugin/hooks/review-user-prompt.sh +6 -2
  81. package/dist/templates/agent-plugin/hooks/spec-user-prompt.sh +43 -0
  82. package/dist/templates/agent-plugin/skills/humanloop/SKILL.md +147 -0
  83. package/dist/templates/agent-plugin/skills/perspective-fanout/SKILL.md +115 -0
  84. package/dist/templates/agent-plugin/skills/problem-document/SKILL.md +105 -0
  85. package/dist/templates/agent-plugin/skills/problem-plateau-breakers/SKILL.md +83 -0
  86. package/dist/templates/agent-suffix.md +7 -4
  87. package/dist/templates/baleia.lua +42 -0
  88. package/dist/templates/companion-plugin/hooks/user-prompt-context.sh +1 -1
  89. package/dist/templates/dashboard-claude.md +7 -3
  90. package/dist/templates/orchestrator-base.md +89 -52
  91. package/dist/templates/orchestrator-completion.md +47 -24
  92. package/dist/templates/orchestrator-discovery.md +183 -0
  93. package/dist/templates/orchestrator-impl.md +47 -18
  94. package/dist/templates/orchestrator-planning.md +109 -20
  95. package/dist/templates/orchestrator-plugin/commands/sisyphus/scratch.md +19 -0
  96. package/dist/templates/orchestrator-plugin/commands/sisyphus/spec.md +11 -0
  97. package/dist/templates/orchestrator-plugin/commands/sisyphus/strategize.md +5 -5
  98. package/dist/templates/orchestrator-plugin/hooks/hooks.json +0 -10
  99. package/dist/templates/orchestrator-plugin/skills/humanloop/SKILL.md +149 -0
  100. package/dist/templates/orchestrator-plugin/skills/orchestration/CLAUDE.md +1 -0
  101. package/dist/templates/orchestrator-plugin/skills/orchestration/SKILL.md +2 -1
  102. package/dist/templates/orchestrator-plugin/skills/orchestration/strategy.md +160 -0
  103. package/dist/templates/orchestrator-plugin/skills/orchestration/task-patterns.md +26 -28
  104. package/dist/templates/orchestrator-plugin/skills/orchestration/workflow-examples.md +133 -25
  105. package/dist/templates/orchestrator-settings.json +55 -0
  106. package/dist/templates/orchestrator-validation.md +17 -14
  107. package/dist/templates/sisyphus-init.lua +30 -0
  108. package/dist/templates/sisyphus-tmux-plugin/hooks/hooks.json +54 -0
  109. package/dist/templates/sisyphus-tmux-plugin/hooks/tmux-state.sh +19 -0
  110. package/dist/templates/termrender-haiku-system.md +82 -0
  111. package/dist/templates/whip-animation.sh +345 -0
  112. package/dist/tui.js +3242 -2189
  113. package/dist/tui.js.map +1 -1
  114. package/native/SisyphusNotify/main.swift +15 -5
  115. package/package.json +8 -6
  116. package/templates/CLAUDE.md +1 -56
  117. package/templates/agent-plugin/agents/CLAUDE.md +2 -65
  118. package/templates/agent-plugin/agents/debug.md +43 -6
  119. package/templates/agent-plugin/agents/debug.settings.json +57 -0
  120. package/templates/agent-plugin/agents/explore.md +28 -1
  121. package/templates/agent-plugin/agents/explore.settings.json +57 -0
  122. package/templates/agent-plugin/agents/implementor.md +94 -0
  123. package/templates/agent-plugin/agents/implementor.settings.json +57 -0
  124. package/templates/agent-plugin/agents/operator.md +43 -1
  125. package/templates/agent-plugin/agents/operator.settings.json +57 -0
  126. package/templates/agent-plugin/agents/plan/sub-planner.md +75 -0
  127. package/templates/agent-plugin/agents/plan.md +176 -86
  128. package/templates/agent-plugin/agents/plan.settings.json +57 -0
  129. package/templates/agent-plugin/agents/problem/adversarial.md +26 -0
  130. package/templates/agent-plugin/agents/problem/contrarian.md +26 -0
  131. package/templates/agent-plugin/agents/problem/first-principles.md +26 -0
  132. package/templates/agent-plugin/agents/problem/precedent.md +25 -0
  133. package/templates/agent-plugin/agents/problem/simplifier.md +26 -0
  134. package/templates/agent-plugin/agents/problem/systems-thinker.md +26 -0
  135. package/templates/agent-plugin/agents/problem/time-traveler.md +26 -0
  136. package/templates/agent-plugin/agents/problem/user-empathy.md +26 -0
  137. package/templates/agent-plugin/agents/problem.md +334 -79
  138. package/templates/agent-plugin/agents/problem.settings.json +57 -0
  139. package/templates/agent-plugin/agents/research-lead/CLAUDE.md +26 -0
  140. package/templates/agent-plugin/agents/research-lead/critic.md +61 -0
  141. package/templates/agent-plugin/agents/research-lead/researcher.md +60 -0
  142. package/templates/agent-plugin/agents/research-lead.md +184 -0
  143. package/templates/agent-plugin/agents/research-lead.settings.json +57 -0
  144. package/templates/agent-plugin/agents/review/CLAUDE.md +3 -29
  145. package/templates/agent-plugin/agents/review/compliance.md +14 -3
  146. package/templates/agent-plugin/agents/review/efficiency.md +15 -4
  147. package/templates/agent-plugin/agents/review/quality.md +20 -6
  148. package/templates/agent-plugin/agents/review/reuse.md +17 -5
  149. package/templates/agent-plugin/agents/review/security.md +10 -3
  150. package/templates/agent-plugin/agents/review/tests.md +58 -0
  151. package/templates/agent-plugin/agents/review-plan/CLAUDE.md +28 -0
  152. package/templates/agent-plugin/agents/review-plan/code-smells.md +4 -2
  153. package/templates/agent-plugin/agents/review-plan/pattern-consistency.md +4 -2
  154. package/templates/agent-plugin/agents/review-plan/requirements-coverage.md +3 -1
  155. package/templates/agent-plugin/agents/review-plan/security.md +5 -2
  156. package/templates/agent-plugin/agents/review-plan.md +52 -5
  157. package/templates/agent-plugin/agents/review-plan.settings.json +57 -0
  158. package/templates/agent-plugin/agents/review.md +89 -16
  159. package/templates/agent-plugin/agents/review.settings.json +57 -0
  160. package/templates/agent-plugin/agents/spec/engineer.md +175 -0
  161. package/templates/agent-plugin/agents/spec/requirements-writer.md +149 -0
  162. package/templates/agent-plugin/agents/spec.md +444 -0
  163. package/templates/agent-plugin/agents/spec.settings.json +57 -0
  164. package/templates/agent-plugin/agents/test-spec.md +58 -2
  165. package/templates/agent-plugin/agents/test-spec.settings.json +57 -0
  166. package/templates/agent-plugin/hooks/CLAUDE.md +9 -57
  167. package/templates/agent-plugin/hooks/ask-background-guard.sh +57 -0
  168. package/templates/agent-plugin/hooks/intercept-send-message.sh +1 -1
  169. package/templates/agent-plugin/hooks/plan-user-prompt.sh +8 -7
  170. package/templates/agent-plugin/hooks/plan-validate.sh +97 -0
  171. package/templates/agent-plugin/hooks/plan-write-path.sh +55 -0
  172. package/templates/agent-plugin/hooks/problem-user-prompt.sh +26 -0
  173. package/templates/agent-plugin/hooks/register-bg-task.sh +37 -0
  174. package/templates/agent-plugin/hooks/require-submit.sh +51 -42
  175. package/templates/agent-plugin/hooks/review-user-prompt.sh +6 -2
  176. package/templates/agent-plugin/hooks/spec-user-prompt.sh +43 -0
  177. package/templates/agent-plugin/skills/humanloop/SKILL.md +147 -0
  178. package/templates/agent-plugin/skills/perspective-fanout/SKILL.md +115 -0
  179. package/templates/agent-plugin/skills/problem-document/SKILL.md +105 -0
  180. package/templates/agent-plugin/skills/problem-plateau-breakers/SKILL.md +83 -0
  181. package/templates/agent-suffix.md +7 -4
  182. package/templates/baleia.lua +42 -0
  183. package/templates/companion-plugin/hooks/user-prompt-context.sh +1 -1
  184. package/templates/dashboard-claude.md +7 -3
  185. package/templates/orchestrator-base.md +89 -52
  186. package/templates/orchestrator-completion.md +47 -24
  187. package/templates/orchestrator-discovery.md +183 -0
  188. package/templates/orchestrator-impl.md +47 -18
  189. package/templates/orchestrator-planning.md +109 -20
  190. package/templates/orchestrator-plugin/commands/sisyphus/scratch.md +19 -0
  191. package/templates/orchestrator-plugin/commands/sisyphus/spec.md +11 -0
  192. package/templates/orchestrator-plugin/commands/sisyphus/strategize.md +5 -5
  193. package/templates/orchestrator-plugin/hooks/hooks.json +0 -10
  194. package/templates/orchestrator-plugin/skills/humanloop/SKILL.md +149 -0
  195. package/templates/orchestrator-plugin/skills/orchestration/CLAUDE.md +1 -0
  196. package/templates/orchestrator-plugin/skills/orchestration/SKILL.md +2 -1
  197. package/templates/orchestrator-plugin/skills/orchestration/strategy.md +160 -0
  198. package/templates/orchestrator-plugin/skills/orchestration/task-patterns.md +26 -28
  199. package/templates/orchestrator-plugin/skills/orchestration/workflow-examples.md +133 -25
  200. package/templates/orchestrator-settings.json +55 -0
  201. package/templates/orchestrator-validation.md +17 -14
  202. package/templates/sisyphus-init.lua +30 -0
  203. package/templates/sisyphus-tmux-plugin/hooks/hooks.json +54 -0
  204. package/templates/sisyphus-tmux-plugin/hooks/tmux-state.sh +19 -0
  205. package/templates/termrender-haiku-system.md +82 -0
  206. package/templates/whip-animation.sh +345 -0
  207. package/dist/chunk-22ZGZTGY.js +0 -67
  208. package/dist/chunk-22ZGZTGY.js.map +0 -1
  209. package/dist/chunk-6PJVJEYQ.js +0 -46
  210. package/dist/chunk-6PJVJEYQ.js.map +0 -1
  211. package/dist/chunk-C2XKXERJ.js.map +0 -1
  212. package/dist/chunk-TMBAVPHH.js.map +0 -1
  213. package/dist/chunk-V36NXMHP.js +0 -299
  214. package/dist/chunk-V36NXMHP.js.map +0 -1
  215. package/dist/templates/agent-plugin/agents/design.md +0 -134
  216. package/dist/templates/agent-plugin/agents/requirements.md +0 -138
  217. package/dist/templates/begin.md +0 -22
  218. package/dist/templates/nvim-tutorial.txt +0 -68
  219. package/dist/templates/orchestrator-plugin/commands/sisyphus/design.md +0 -13
  220. package/dist/templates/orchestrator-plugin/commands/sisyphus/requirements.md +0 -13
  221. package/dist/templates/orchestrator-plugin/hooks/idle-notify.sh +0 -71
  222. package/dist/templates/orchestrator-strategy.md +0 -238
  223. package/templates/agent-plugin/agents/design.md +0 -134
  224. package/templates/agent-plugin/agents/requirements.md +0 -138
  225. package/templates/begin.md +0 -22
  226. package/templates/nvim-tutorial.txt +0 -68
  227. package/templates/orchestrator-plugin/commands/sisyphus/design.md +0 -13
  228. package/templates/orchestrator-plugin/commands/sisyphus/requirements.md +0 -13
  229. package/templates/orchestrator-plugin/hooks/idle-notify.sh +0 -71
  230. package/templates/orchestrator-strategy.md +0 -238
  231. /package/dist/{paths-XRDEEJ5R.js.map → paths-JXFLR5BN.js.map} +0 -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/plugins.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/companion.ts","../src/cli/commands/getting-started.ts","../src/cli/commands/init.ts","../src/cli/commands/setup.ts","../src/cli/commands/tmux-status.ts","../src/cli/commands/tmux-sessions.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 { registerCompanion } from './commands/companion.js';\nimport { registerGettingStarted } from './commands/getting-started.js';\nimport { registerInit } from './commands/init.js';\nimport { registerSetup } from './commands/setup.js';\nimport { registerTmuxStatus } from './commands/tmux-status.js';\nimport { registerTmuxSessions } from './commands/tmux-sessions.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);\nregisterCompanion(program);\nregisterGettingStarted(program);\nregisterInit(program);\nregisterSetup(program);\nregisterTmuxStatus(program);\nregisterTmuxSessions(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 { openDashboardWindow } 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 (openDashboardWindow(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';\nimport { ensureRequiredPlugins } from './plugins.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 await ensureRequiredPlugins(process.cwd());\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 ssyph_*) 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 by stored ID (not name)\n dwid=$(tmux show-option -t \"$name\" -v @sisyphus_dashboard 2>/dev/null)\n [ -n \"$dwid\" ] && tmux select-window -t \"$dwid\" 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 ssyph_*) 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 dwid=$(tmux show-option -t \"$name\" -v @sisyphus_dashboard 2>/dev/null)\n [ -n \"$dwid\" ] && tmux select-window -t \"$dwid\" 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 '^ssyph_'\" \"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 { execSync } from 'node:child_process';\nimport { loadConfig } from '../shared/config.js';\nimport { resolveInstalledPlugin } from '../daemon/plugins.js';\n\nfunction exec(cmd: string): string {\n try {\n return execSync(cmd, { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();\n } catch {\n return '';\n }\n}\n\nfunction isMarketplaceInstalled(marketplace: string): boolean {\n const output = exec('claude plugins marketplace list');\n return output.includes(marketplace);\n}\n\nfunction installMarketplace(marketplace: string): void {\n console.log(`Adding marketplace: ${marketplace}`);\n execSync(`claude plugins marketplace add CaptainCrouton89/${marketplace}`, { stdio: 'inherit' });\n}\n\nfunction installPlugin(key: string): void {\n console.log(`Installing plugin: ${key}`);\n execSync(`claude plugins install ${key} --scope user`, { stdio: 'inherit' });\n}\n\nexport async function ensureRequiredPlugins(cwd: string): Promise<void> {\n const config = loadConfig(cwd);\n const required = config.requiredPlugins;\n if (!required || required.length === 0) return;\n\n for (const plugin of required) {\n const key = `${plugin.name}@${plugin.marketplace}`;\n const existing = resolveInstalledPlugin(key);\n if (existing) continue;\n\n console.log(`Required plugin ${key} not found — installing...`);\n\n if (!isMarketplaceInstalled(plugin.marketplace)) {\n installMarketplace(plugin.marketplace);\n }\n\n installPlugin(key);\n\n // Verify\n const verified = resolveInstalledPlugin(key);\n if (verified) {\n console.log(`Installed ${key} → ${verified}`);\n } else {\n console.warn(`Warning: failed to verify ${key} installation`);\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 * Opens the dashboard in a new tmux window (for background use, e.g. from `start`).\n *\n * Tracks the window by its tmux window ID stored in the @sisyphus_dashboard\n * session option — not by window name, which is fragile (renames, collisions).\n * The \"; exit\" suffix closes the window when the TUI exits.\n *\n * Returns true if a new dashboard was created, false if an existing one was focused.\n */\nexport function openDashboardWindow(tmuxSession: string, cwd: string): boolean {\n // Check for existing dashboard by stored window ID\n try {\n const storedId = execSync(\n `tmux show-option -t ${shellQuote(tmuxSession)} -v @sisyphus_dashboard`,\n { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] },\n ).trim();\n\n if (storedId) {\n try {\n execSync(\n `tmux display-message -t ${shellQuote(storedId)} -p \"#{window_id}\"`,\n { stdio: 'pipe' },\n );\n execSync(`tmux select-window -t ${shellQuote(storedId)}`, { stdio: 'pipe' });\n return false;\n } catch {\n // Window is gone — fall through to create a new one\n }\n }\n } catch {\n // Option not set — fall through to create\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)}; exit`;\n execSync(\n `tmux send-keys -t ${shellQuote(windowId)} ${shellQuote(cmd)} Enter`,\n );\n\n execSync(\n `tmux set-option -t ${shellQuote(tmuxSession)} @sisyphus_dashboard ${shellQuote(windowId)}`,\n { stdio: 'pipe' },\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 tuiPath = join(import.meta.dirname, 'tui.js');\n execSync(`node ${shellQuote(tuiPath)} --cwd ${shellQuote(process.cwd())}`, {\n stdio: 'inherit',\n });\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 { execSync } from 'node:child_process';\nimport { existsSync, 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, cycleLogPath } 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, verbose: boolean): 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 (verbose && agent.instruction) {\n const truncated = agent.instruction.length > 200 ? agent.instruction.slice(0, 200) + '...' : agent.instruction;\n line += `\\n ${DIM}Instruction: ${truncated}${RESET}`;\n }\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 readRoadmap(cwd: string, sessionId: string): string | null {\n try {\n return readFileSync(roadmapPath(cwd, sessionId), 'utf8');\n } catch {\n return null;\n }\n}\n\nfunction readCycleLog(cwd: string, sessionId: string, cycle: number): string | null {\n try {\n const path = cycleLogPath(cwd, sessionId, cycle);\n if (!existsSync(path)) return null;\n return readFileSync(path, 'utf8');\n } catch {\n return null;\n }\n}\n\nfunction capturePaneOutput(paneId: string, lines: number = 50): string | null {\n try {\n return execSync(\n `tmux capture-pane -t \"${paneId}\" -p -S -${lines}`,\n { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] },\n ).trimEnd();\n } catch {\n return null;\n }\n}\n\nfunction printSession(session: Session, verbose: boolean): 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 = !verbose && 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 if (verbose && agent.instruction) {\n const truncated = agent.instruction.length > 200 ? agent.instruction.slice(0, 200) + '...' : agent.instruction;\n console.log(` ${DIM}Instruction: ${truncated}${RESET}`);\n }\n }\n }\n\n // Roadmap\n const roadmap = readRoadmap(session.cwd, session.id);\n if (roadmap) {\n console.log(`\\n${BOLD}Roadmap:${RESET}`);\n console.log(roadmap);\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 // Verbose: show cycle log\n if (verbose) {\n const log = readCycleLog(session.cwd, session.id, cycles[i].cycle);\n if (log) {\n const lines = log.split('\\n');\n const preview = lines.slice(0, 20).join('\\n');\n console.log(` ${DIM}--- cycle log ---${RESET}`);\n for (const line of preview.split('\\n')) {\n console.log(` ${DIM}${line}${RESET}`);\n }\n if (lines.length > 20) {\n console.log(` ${DIM}... (${lines.length - 20} more lines)${RESET}`);\n }\n }\n }\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, verbose));\n }\n }\n\n // Verbose: capture live pane output\n if (verbose) {\n // Orchestrator pane (from last running cycle)\n const lastCycle = session.orchestratorCycles[session.orchestratorCycles.length - 1];\n if (lastCycle && !lastCycle.completedAt && lastCycle.paneId) {\n const output = capturePaneOutput(lastCycle.paneId);\n if (output) {\n console.log(`\\n<orchestrator-pane-output lines=\"50\">`);\n console.log(output);\n console.log(`</orchestrator-pane-output>`);\n }\n }\n\n // Running agent panes\n for (const agent of runningAgents) {\n if (agent.paneId) {\n const output = capturePaneOutput(agent.paneId, 30);\n if (output) {\n console.log(`\\n<agent-pane-output agent=\"${agent.id}\" name=\"${agent.name}\" lines=\"30\">`);\n console.log(output);\n console.log(`</agent-pane-output>`);\n }\n }\n }\n }\n\n // Completion report\n if (verbose && session.completionReport) {\n console.log(`\\n${BOLD}Completion Report:${RESET}`);\n console.log(session.completionReport);\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 .option('-v, --verbose', 'Show detailed output (roadmap, pane output, agent instructions)')\n .action(async (sessionIdArg?: string, opts?: { verbose?: boolean }) => {\n const sessionId = sessionIdArg ?? process.env.SISYPHUS_SESSION_ID;\n const verbose = opts?.verbose ?? false;\n const cwd = process.env['SISYPHUS_CWD'] ?? process.cwd();\n\n const request: Request = { type: 'status', sessionId, cwd };\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, verbose);\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# --- Pane navigation (no prefix needed) ---\nbind -n C-h select-pane -L\nbind -n C-j select-pane -D\nbind -n C-k select-pane -U\nbind -n C-l select-pane -R\n\n# --- Window navigation (no prefix needed) ---\nbind -n C-n next-window\nbind -n C-p previous-window\n\n# --- New window / splits preserve cwd ---\nbind c new-window -c \"#{pane_current_path}\"\nbind '\"' split-window -v -c \"#{pane_current_path}\"\nbind % split-window -h -c \"#{pane_current_path}\"\n\n# --- Kill pane + rebalance ---\nbind x kill-pane \\\\; select-layout even-horizontal\n\n# --- Auto-rebalance on pane close ---\nset-hook -g after-kill-pane \"select-layout even-horizontal\"\nset-hook -g pane-exited \"select-layout even-horizontal\"\n\n# --- Manual re-tile ---\nbind = select-layout even-horizontal\n\n# --- Scroll (no prefix needed) ---\nbind -n C-u copy-mode \\\\; send-keys -X halfpage-up\nbind -n C-d copy-mode \\\\; send-keys -X halfpage-down\n\n# --- Vi copy mode ---\nsetw -g mode-keys vi\nbind -T copy-mode-vi v send-keys -X begin-selection\nbind -T copy-mode-vi y send-keys -X copy-selection-and-cancel\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 { sendRequest } from '../client.js';\nimport { renderCompanion } from '../../shared/companion-render.js';\nimport { ACHIEVEMENTS } from '../../shared/companion-types.js';\nimport type { CompanionState } from '../../shared/companion-types.js';\nimport { createBadgeGallery, renderBadgeCard } from '../../shared/companion-badges.js';\n\nconst CATEGORY_LABELS: Record<string, string> = {\n milestone: 'Milestone',\n session: 'Session',\n time: 'Time',\n behavioral: 'Behavioral',\n};\n\nexport function registerCompanion(program: Command): void {\n program\n .command('companion')\n .description('Show companion profile and stats')\n .option('--name <name>', 'Set companion name')\n .option('--badges', 'Show badge gallery')\n .action(async (opts: { name?: string; badges?: boolean }) => {\n const res = await sendRequest({ type: 'companion', name: opts.name });\n if (!res.ok) {\n console.error(res.error);\n process.exit(1);\n }\n const companion = res.data as unknown as CompanionState;\n\n // Header: face + identity\n const face = renderCompanion(companion, ['face', 'boulder'], { color: true });\n const displayName = companion.name !== null ? companion.name : '(unnamed)';\n console.log();\n console.log(` ${face}`);\n console.log();\n console.log(` ${displayName} · Level ${companion.level} ${companion.title}`);\n console.log(` Mood: ${companion.mood} · XP: ${companion.xp}`);\n console.log();\n\n // Stats\n const s = companion.stats;\n const endH = Math.floor(s.endurance / 3_600_000);\n console.log(' Stats');\n console.log(` Strength ${s.strength} sessions`);\n console.log(` Endurance ${endH}h total active`);\n console.log(` Wisdom ${s.wisdom} efficient sessions`);\n console.log(` Patience ${s.patience} persistence score`);\n console.log();\n\n if (opts.badges) {\n // Full badge gallery\n const gallery = createBadgeGallery(companion.achievements);\n console.log(` Badges ${companion.achievements.length}/${ACHIEVEMENTS.length} earned`);\n console.log();\n\n for (let i = 0; i < gallery.total; i++) {\n const def = gallery.achievements[i]!;\n const unlock = gallery.unlocked.get(def.id) ?? null;\n const card = renderBadgeCard(def, unlock);\n for (const line of card.lines) {\n console.log(` ${line}`);\n }\n console.log();\n }\n } else {\n // Compact achievement list\n const unlocked = new Set(companion.achievements.map(a => a.id));\n const byCategory = new Map<string, typeof ACHIEVEMENTS>();\n for (const def of ACHIEVEMENTS) {\n const group = byCategory.get(def.category) ?? [];\n group.push(def);\n byCategory.set(def.category, group);\n }\n\n console.log(` Achievements ${companion.achievements.length}/${ACHIEVEMENTS.length} (use --badges for gallery)`);\n for (const [category, defs] of byCategory) {\n const label = CATEGORY_LABELS[category] ?? category;\n const unlockedCount = defs.filter(d => unlocked.has(d.id)).length;\n console.log(` ${label} (${unlockedCount}/${defs.length})`);\n for (const def of defs) {\n const icon = unlocked.has(def.id) ? '✓' : '·';\n console.log(` ${icon} ${def.name} — ${def.description}`);\n }\n }\n console.log();\n }\n\n // Repos\n const repos = Object.entries(companion.repos);\n if (repos.length > 0) {\n repos.sort(([, a], [, b]) => b.visits - a.visits);\n console.log(' Repositories');\n for (const [path, mem] of repos.slice(0, 10)) {\n const nick = mem.nickname ? ` \"${mem.nickname}\"` : '';\n const parts = [`${mem.visits} visits`, `${mem.completions} completions`];\n if (mem.crashes > 0) parts.push(`${mem.crashes} crashes`);\n console.log(` ${path}${nick}`);\n console.log(` ${parts.join(' · ')}`);\n }\n if (repos.length > 10) {\n console.log(` … and ${repos.length - 10} more`);\n }\n console.log();\n }\n\n // Commentary\n if (companion.lastCommentary) {\n console.log(` \"${companion.lastCommentary.text}\"`);\n console.log();\n }\n });\n}\n","import { execSync } from 'node:child_process';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { Command } from 'commander';\nimport { isTmuxInstalled } from '../tmux.js';\nimport { isNvimAvailable, detectTerminal, checkItermOptionKey } from '../onboard.js';\n\nfunction templatePath(name: string): string {\n return join(dirname(fileURLToPath(import.meta.url)), 'templates', name);\n}\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 6 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| 5 | What's next — real usage guidance & suggestions | \\`--tutorial 5\\` |\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+l\\`: move to the right pane\n- \\`Ctrl+h\\`: move to the left pane\n- \\`Ctrl+j\\`: move to the pane below\n- \\`Ctrl+k\\`: move to the pane above\n- No prefix key needed — just hold Ctrl and press the direction letter\n- For windows: \\`Ctrl+n\\` next window, \\`Ctrl+p\\` previous window\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 up/down**: \\`Ctrl+u\\` / \\`Ctrl+d\\` — scroll half-page up/down (no prefix needed). Press \\`q\\` to exit scroll mode.\n- **New window**: \\`Ctrl-b n\\` — opens a new window in the current directory\n- **Kill pane**: \\`Ctrl-b x\\` — closes the current pane and rebalances layout\n- **Re-tile**: \\`Ctrl-b =\\` — rebalance all panes to equal widths\n\n### 5. Verification\n\nAsk the user to confirm: \"Can you navigate between panes with Ctrl+h and Ctrl+l?\"\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 and editing files when you jump into agent panes, but not required.\n\nNote: The sisyphus dashboard has keys that auto-open files in nvim — users don't need to know how to open files from the command line. Focus on what they'll need once they're INSIDE nvim.\n\n### If nvim is NOT installed (nvimInstalled: false)\n\nAsk the user: \"Neovim is handy for reviewing and editing 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\nBriefly explain the key concept — nvim has two modes:\n\n- **Normal mode** (default): Keys are commands, not text. This is where you navigate.\n- **Insert mode**: Press \\`i\\` to enter. Now you type normally. \\`Esc\\` goes back to normal.\n\nThen tell the user: \"I'm going to open an interactive tutorial file in a pane to your right. It walks you through everything — navigation, editing, saving. Follow the instructions inside the file.\"\n\nOpen the bundled tutorial file in a split pane:\n\\`\\`\\`\ncp ${templatePath('nvim-tutorial.txt')} /tmp/sisyphus-nvim-tutorial.txt\ntmux split-window -h \"nvim /tmp/sisyphus-nvim-tutorial.txt\"\n\\`\\`\\`\n\nTell them to click on the right pane (or \\`Ctrl+l\\`) and follow the instructions in the file. When they \\`:wq\\` or \\`ZZ\\`, the pane closes and they're back in Claude.\n\nTell them: \"When you jump into an agent's pane and the dashboard opens a file, you'll land in normal mode. Now you know how to look around, make edits, and get out.\"\n\n### Verification\n\nAsk if they were able to edit and save 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 // Detect iTerm Right Option Key status for environment data\n let rightOptionKeyStatus = 'unknown';\n const terminal = detectTerminal();\n if (!terminal.isIterm) {\n rightOptionKeyStatus = 'not-iterm';\n } else {\n const result = checkItermOptionKey();\n if (!result.checked) {\n rightOptionKeyStatus = 'could-not-check';\n } else if (result.allCorrect) {\n rightOptionKeyStatus = 'ok';\n } else {\n rightOptionKeyStatus = `incorrect:${result.incorrectProfiles.join(',')}`;\n }\n }\n\n console.log(`\n<claude-instructions>\n# Sisyphus Getting Started — Step 3: Sisyphus Concepts & Keybinds\n\n## Environment Data\n- rightOptionKeyStatus: ${rightOptionKeyStatus}\n\n## Instructions for Claude\n\n### 1. CRITICAL FIRST: Right Option Key Setup\n\n**This must be done before anything else.** Sisyphus keybinds use the Option key as \"Meta\". By default, macOS terminals send special characters when you press Option (e.g., Option+s types \\`ß\\`). We need the RIGHT Option key to send escape sequences instead.\n\n**Check the environment data above:**\n\n- **rightOptionKeyStatus: ok** — They're all set, briefly confirm and move on.\n\n- **rightOptionKeyStatus: incorrect:ProfileName** — Walk them through the fix:\n\n > Your Right Option key isn't configured correctly yet. Here's how to fix it:\n >\n > 1. Open **iTerm2 Settings** (Cmd+,)\n > 2. Go to **Profiles** → select your profile (shown above)\n > 3. Click the **Keys** tab\n > 4. At the bottom, find **Right Option Key**\n > 5. Change it from **Normal** to **Esc+**\n >\n > \\`\\`\\`\n > ┌─ iTerm2 Settings ──────────────────────────┐\n > │ Profiles > Keys │\n > │ │\n > │ Right Option Key: │\n > │ ○ Normal (sends special chars like ß) │\n > │ ● Esc+ (sends escape sequences) ← ✓ │\n > └─────────────────────────────────────────────┘\n > \\`\\`\\`\n >\n > **Why right and not left?** You'll still want the left Option key for\n > typing special characters (accents, symbols). The right Option key\n > becomes your \"Meta\" key for tmux/sisyphus keybinds.\n\n After they change it, have them verify by re-running \\`sisyphus doctor\\` — look for \"Right Option Key: Esc+\".\n\n- **rightOptionKeyStatus: not-iterm** — They're not using iTerm2. Explain:\n > Sisyphus keybinds use Option as Meta. In iTerm2 this is configured via\n > \"Right Option Key → Esc+\". For your terminal, look for a similar setting\n > like \"Option sends Meta\" or \"Option sends Esc+\". Without this, pressing\n > Option+s will type a special character instead of triggering the keybind.\n\n- **rightOptionKeyStatus: could-not-check** or **unknown** — Ask them to manually check:\n > Press Option+s in your terminal. If you see \\`ß\\` (or another special character),\n > your Option key needs to be reconfigured. In iTerm2: Settings → Profiles → Keys →\n > Right Option Key → Esc+.\n\n### 2. 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### 3. Teach keybinds\n\nTwo keybinds to remember (both use the RIGHT Option key):\n\n| Keybind | Action |\n|---------|--------|\n| Right Option + s | Cycle through sisyphus sessions |\n| Right Option + Shift + s | Jump back to dashboard |\n\n### 4. 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- \"Right Option Key\" — should be \"Esc+\"\n\nIf cycle script or keybind is missing, run: \\`sisyphus setup-keybind\\`\n\n### 5. Test the keybind\n\nHave the user try pressing Right Option + s. Nothing should happen yet (no sisyphus session running) — and that's fine. The important thing is no special character appears.\n\nIf they see \\`ß\\` or similar, circle back to the Right Option Key setup above.\n\n### 6. Verification\n\nConfirm:\n- They understand the two-session model (their session vs sisyphus session)\n- \\`sisyphus doctor\\` shows keybinds installed AND Right Option Key: Esc+\n- Right 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. BEFORE launching: Teach navigation\n\n**This is critical.** When \\`sisyphus start\\` runs, it auto-opens the dashboard in a new tmux window. The user will suddenly be looking at the dashboard and may feel \"stuck\". Teach them how to navigate BEFORE launching:\n\nExplain clearly:\n\n> Before we launch, you need to know how to move between tmux windows. Right now you're in a window with Claude. When sisyphus starts, it'll open a dashboard in a new window. Think of windows like tabs:\n>\n> \\`\\`\\`\n> Window 1 (you are here) Window 2 (dashboard)\n> ┌──────────────────┐ ┌──────────────────┐\n> │ Claude Code │ │ Sisyphus │\n> │ (this session) │ → │ Dashboard │\n> └──────────────────┘ └──────────────────┘\n> Ctrl+n → ← Ctrl+p\n> \\`\\`\\`\n>\n> - **\\`Ctrl+n\\`** — next window (go to dashboard)\n> - **\\`Ctrl+p\\`** — previous window (come back here)\n>\n> And remember from step 3:\n> - **Right Option + s** — jump to the sisyphus agent session (where you can watch agents work live)\n> - **Right Option + Shift + s** — jump back to dashboard\n\nHave the user confirm they understand these keybinds before proceeding.\n\n### 3. Set expectations, copy demo app, and launch\n\nFirst, copy the demo todo app to a temp directory and init a git repo (sisyphus needs git):\n\\`\\`\\`\nrm -rf /tmp/sisyphus-tutorial-demo\ncp -r ${templatePath('tutorial-demo')} /tmp/sisyphus-tutorial-demo\ngit -C /tmp/sisyphus-tutorial-demo init\ngit -C /tmp/sisyphus-tutorial-demo add -A\ngit -C /tmp/sisyphus-tutorial-demo commit -m \"Initial todo app\"\n\\`\\`\\`\n\nTell the user:\n\n> I've set up a small todo app in /tmp/sisyphus-tutorial-demo — a Node.js API\n> with a few files. I'm going to launch sisyphus on it. Here's what will happen:\n> 1. The dashboard opens automatically (you'll be switched to it)\n> 2. Press **Ctrl+p** to come back here to Claude — I'll guide you through what to watch\n> 3. The session takes a few minutes. You can watch agents work live!\n\nThen launch from the demo directory:\n\\`\\`\\`\ncd /tmp/sisyphus-tutorial-demo && sisyphus start \"Add three improvements to this todo app: (1) add a priority field (high/medium/low) to todos, (2) add a GET /todos/stats endpoint that returns counts of total/done/pending todos, (3) add tests for the new features. Explain your thinking at each step.\" -c \"TUTORIAL DEMO: A user is watching this session to learn how sisyphus works. Be EXTRA VERBOSE — explain your reasoning, narrate what you're doing, and make your planning visible. When spawning agents, give each agent context that this is a tutorial demo and they should explain their work clearly. Keep scope small: 2-3 agents, 1-2 cycles.\"\n\\`\\`\\`\n\nAfter launching, tell them:\n\n> The dashboard just opened. Press **Ctrl+p** to come back here — I'll provide live commentary as the session runs so you know what's happening.\n\nWait for them to confirm they're back, then start live commentary.\n\n### 4. Live commentary loop\n\n**This is the most important part of the demo.** Don't just launch and wait — actively narrate.\n\nOnce the user is back, start a polling loop. Every ~45 seconds, run \\`sisyphus status --verbose <session-id>\\` and provide SHORT, contextual commentary about what's happening. The \\`--verbose\\` flag shows agent instructions, full roadmap, cycle logs, and live pane output from the orchestrator and running agents — use this rich data to narrate what's actually happening, not just phase names.\n\n**How to narrate each phase:**\n\n- **Cycle 1, no agents yet**: \"The orchestrator is reading the codebase and planning. It's figuring out how to split the work. Check the dashboard (\\`Ctrl+n\\`) — you'll see the roadmap updating.\"\n\n- **Agents spawning**: \"Agents just spawned! You should see new panes appearing. Try \\`Right Option + s\\` to jump to the sisyphus session and watch them work. Each colored pane is an independent Claude instance.\"\n\n- **Agents working**: \"Agent-001 is working on [X], Agent-002 is on [Y]. They're working in parallel — this is the key advantage of sisyphus. Jump over and watch if you like (\\`Right Option + s\\`).\"\n\n- **Agents submitting**: \"Agent-001 just submitted its report! [N] more to go. When all agents finish, the orchestrator will respawn to review.\"\n\n- **Between cycles**: \"All agents done. The orchestrator is respawning with fresh context to review the reports and decide what's next. This is the cycle boundary — the orchestrator never runs out of context because it starts fresh each time.\"\n\n- **Completion**: \"The session is complete! Let me show you the results.\"\n\n**Important:**\n- Keep commentary to 1-3 sentences per check — don't wall-of-text\n- Remind them of navigation keys when relevant (\"jump over with Right Option + s to see this live\")\n- If agents are still working with no change, say so briefly (\"Still working... Agent-001 is the furthest along\")\n- Reference specific agent names and tasks from the status output\n- Stop polling when status shows \"completed\"\n\nBetween polls, encourage the user to explore:\n> \"While we wait, try jumping around: \\`Ctrl+n\\` for dashboard, \\`Right Option + s\\` for the agent session, \\`Right Option + Shift + s\\` to jump back. I'll keep narrating here.\"\n\n### 5. After completion\n\nOnce the session shows \"completed\":\n\n- Show them what the agents built: \\`cd /tmp/sisyphus-tutorial-demo && git log --oneline\\`\n- Run the tests to prove the work: \\`cd /tmp/sisyphus-tutorial-demo && node --test test.js\\`\n- Show the session artifacts: find the session dir in \\`.sisyphus/sessions/\\` and show \\`roadmap.md\\`\n- Explain: \"Every session creates a roadmap, agent reports, and logs — all stored in .sisyphus/sessions/\"\n\n### 6. Proceed to wrap-up\n\nTell the user the demo is done. Then run:\n\\`\\`\\`\nsisyphus getting-started --tutorial 5\n\\`\\`\\`\n</claude-instructions>\n`);\n}\n\nfunction printStep5(): void {\n // Gather codebase context for suggestions\n let recentCommits = '';\n let topLevelFiles = '';\n try {\n recentCommits = execSync('git log --oneline -15 2>/dev/null', { encoding: 'utf-8' }).trim();\n } catch { /* not in a git repo */ }\n try {\n topLevelFiles = execSync('ls -1 2>/dev/null', { encoding: 'utf-8' }).trim();\n } catch { /* ignore */ }\n\n console.log(`\n<claude-instructions>\n# Sisyphus Getting Started — Step 5: What's Next\n\n## Codebase Context\n<recent-commits>\n${recentCommits || '(no git repo detected)'}\n</recent-commits>\n\n<top-level-files>\n${topLevelFiles || '(could not list)'}\n</top-level-files>\n\n## Instructions for Claude\n\n### 1. Congratulate them\n\nTell them they've completed the tutorial and recap what they learned:\n- tmux basics (sessions, panes, navigation)\n- nvim basics for reviewing files\n- The sisyphus session model (separate tmux session for orchestrator + agents)\n- Monitoring with dashboard and keybinds\n- A live session lifecycle\n\n### 2. Navigation cheat sheet\n\n| Key | Action |\n|-----|--------|\n| \\`Ctrl+n\\` / \\`Ctrl+p\\` | Next/previous tmux window |\n| \\`Ctrl+h/j/k/l\\` | Navigate between panes |\n| \\`Right Option + s\\` | Jump to sisyphus agent session |\n| \\`Right Option + Shift + s\\` | Jump to dashboard |\n\n### 3. How to use sisyphus for REAL work\n\nThis is the most important part. Explain clearly:\n\n> **Sisyphus is for big, end-to-end features — the kind that need exploration,\n> planning, and parallel implementation across multiple systems.**\n>\n> You don't need to define the task precisely. Broad is fine — the orchestrator\n> will explore the codebase, write specs, plan phases, and break it down itself.\n\n**Real sisyphus sessions (from production use):**\n- \"Design and implement a human-in-the-loop agent inbox system\" — exploration, spec writing, DB schema, API endpoints, UI components, webhook integration, e2e validation\n- \"Build multi-user organization features — invites, privilege gating, org switcher, workspace sharing, credit tracking\" — touched auth, DB, API, UI, billing, permissions\n- \"Rework all 5 worker onboarding templates to match production pipeline patterns\" — mapped existing patterns, designed new architecture, implemented across templates, validated with e2e tests\n- \"Autonomous failure detection system across 8 sequential phases\" — monitoring, alerting, recovery, dashboard, with each phase building on the last\n- \"Comprehensive code quality audit — find and fix dead code, null handling, useless fallbacks\" — systematic codebase-wide analysis and cleanup\n- \"Implement @requirements.md\" — point it at a spec and let it go\n\n**NOT good for sisyphus:**\n- Five unrelated small tasks bundled together (\"fix the login bug, update the README, add a loading spinner\") — these aren't one feature, they're a todo list\n- Something Claude Code in plan mode would handle — plan mode already handles substantial single-engineer work. If it fits in one Claude session, just do it directly.\n- Quick fixes, bug fixes, small refactors — use regular Claude Code\n\n**How to start:**\nThe easiest way is the \\`/sisyphus:begin\\` slash command inside Claude Code. Just tell Claude\nwhat you want to build and it'll hand it off to sisyphus with the right context.\n\nOr directly: \\`sisyphus start \"your task\" -c \"any background context\"\\`\n\n### 4. Suggest real tasks for THEIR codebase\n\nLook at the recent commits and top-level files above. Based on what you can see of their project, suggest 2-3 concrete sisyphus-scale tasks they could try. Be specific to their codebase — reference actual directories, patterns, or areas you can see.\n\nIf there are no commits or files (e.g., they ran this from /tmp), skip this section.\n\nFormat as:\n> Based on your codebase, here are some tasks sisyphus would be great for:\n> - \"...\"\n> - \"...\"\n\n### 5. There's more to learn\n\nTell them:\n\n> There's actually a lot of depth to how sisyphus works — the design is intentional\n> and there's real reasoning behind why it does things the way it does. If you want\n> to understand the philosophy, or you want a deeper rundown on the dashboard,\n> monitoring, configuration, or how to steer sessions — just ask and I'll explain.\n\nIf the user says yes or asks to learn more, run \\`sisyphus getting-started --explain\\`\nand use its output to explain the system to them conversationally. Don't dump the whole\nthing — answer what they're curious about, using the reference as your source material.\n</claude-instructions>\n`);\n}\n\nfunction printExplain(): void {\n console.log(`\n<claude-instructions>\n# Sisyphus — Comprehensive Reference\n\nThis is a detailed reference for how sisyphus works. The user asked to understand\nsisyphus more deeply. Use this to answer their questions conversationally — don't dump\nthe whole thing. Read through it, then respond to what they're curious about.\n\n## Design Philosophy\n\nSisyphus is built on specific insights about how to get the best work out of LLM agents.\nThese aren't arbitrary — each design decision solves a real failure mode.\n\n### 1. The Orchestrator as \"Human-in-the-Loop\"\n\nWhen you use Claude Code effectively, YOU are the orchestrator — you review work,\nsteer direction, break problems down, and assign the next piece. Sisyphus automates\nthat human role. The orchestrator does what a skilled developer does when prompting\nClaude: explore the codebase, understand the problem, write specs, plan phases,\nassign focused work, review results, and iterate.\n\nThe strategy layer mirrors how developers actually work on end-to-end features:\nexplore, understand, spec, plan, implement, review, validate. The orchestrator\nfollows this same workflow, but runs it with parallel agents.\n\n### 2. Fresh Context Kills Shortcuts\n\nThe orchestrator is KILLED after every cycle and respawned fresh. This is the most\nimportant design decision.\n\nWhen an LLM accumulates context over a long session, it starts taking shortcuts.\nIt \"knows\" what it did earlier, so it skips re-reading, assumes things still hold,\nand builds on stale understanding. A fresh start forces honest reassessment every\ncycle — the orchestrator reads the actual state, not its memory of it.\n\nThis is inspired by adversarial training (think GANs) — better results come from\nadversarial pressure. Each fresh orchestrator effectively audits the previous cycle's\nwork because it has no stake in defending prior decisions. It sees the roadmap, the\nreports, the code — and judges them with fresh eyes.\n\n### 3. Single-Focus Agents\n\nEach agent gets ONE task with a fully self-contained instruction. No context switching,\nno juggling multiple concerns, no \"also while you're there could you...\"\n\nLLMs perform dramatically better when focused. An agent implementing a priority field\ndoesn't think about the stats endpoint. It reads the relevant context, does its one\nthing well, and reports back. The orchestrator handles decomposition — agents handle\nexecution.\n\n### 4. Shared Context Directory (Saved Research)\n\nEvery session has a context/ directory where agents save research, specs, plans, and\ndesign docs. These files persist across ALL cycles and are visible to the orchestrator\nand subsequent agents.\n\nThis means research is never repeated. Cycle 1 agents explore and write findings to\ncontext/explore-auth-system.md. Cycle 3 agents read those findings and build on them.\nKnowledge accumulates even though the orchestrator itself is stateless.\n\n### 5. Two-Layer Planning (Strategy + Roadmap)\n\nThe system maintains two documents at different abstraction levels:\n\n**strategy.md** — The high-level problem-solving map. What phases exist, what gates\nbetween them, what backtrack paths exist. Updated every few cycles when the shape of\nwork changes. Helps the orchestrator see the forest.\n\n**roadmap.md** — Working memory. Updated every cycle. Current Stage, Exit Criteria,\nActive Context, Next Steps. The orchestrator reads this first each cycle to understand\nwhere things stand. Helps the orchestrator see the trees.\n\nThis prevents the failure mode where a single document becomes either too abstract\nto act on or too detailed to show the big picture.\n\n### 6. Adversarial Review Is Built In\n\nThe orchestrator doesn't just implement — it runs mandatory critique cycles. After\nimplementation, review agents attack different dimensions: code reuse, quality,\nefficiency, correctness. Fix agents address the findings. Re-review until only nits\nremain. Multiple agents auditing each other produces better results than any single\nagent reviewing its own work.\n\nThe rule: never let 2+ stages complete without critique. Small issues compound into\narchitectural problems if unchecked.\n\n### 7. Evidence Over Assumptions\n\nValidation requires PROOF — command output, test results, HTTP responses. \"The code\nlooks correct\" is not evidence. \"All 14 tests pass\" is. This catches the gap between\ncode that looks right and code that works.\n\n## Architecture Overview\n\n\\`\\`\\`\n┌─────────────────────────────────────────────────────────────────────┐\n│ USER'S TMUX SESSION │\n│ │\n│ ┌─────────────────────────┐ ┌──────────────────────────────────┐ │\n│ │ Window 1: Claude Code │ │ Window 2: Dashboard (TUI) │ │\n│ │ │ │ │ │\n│ │ User's normal work │ │ Real-time session monitor │ │\n│ │ + this conversation │ │ Roadmap, agents, reports │ │\n│ │ │ │ Interactive controls │ │\n│ └─────────────────────────┘ └──────────────────────────────────┘ │\n└──────────────────────────────────┬──────────────────────────────────┘\n │ Right Option+s / Right Option+Shift+s\n ▼\n┌─────────────────────────────────────────────────────────────────────┐\n│ SISYPHUS TMUX SESSION │\n│ (created per sisyphus session) │\n│ │\n│ ┌──────────┬──────────┬──────────┬──────────┐ │\n│ │ Orch │ Agent │ Agent │ Agent │ ← panes │\n│ │ (yellow) │ (blue) │ (green) │ (magenta)│ │\n│ │ │ │ │ │ │\n│ │ Plans, │ Impl │ Tests │ Docs │ ← each is a │\n│ │ assigns, │ feature │ │ │ Claude Code │\n│ │ reviews │ │ │ │ instance │\n│ └──────────┴──────────┴──────────┴──────────┘ │\n└─────────────────────────────────────────────────────────────────────┘\n │\n ▼\n┌─────────────────────────────────────────────────────────────────────┐\n│ DAEMON (sisyphusd) │\n│ Background process via launchd │\n│ │\n│ Listens on ~/.sisyphus/daemon.sock │\n│ Manages session lifecycle, pane monitoring, state persistence │\n│ Polls panes to detect when agents/orchestrator finish │\n└─────────────────────────────────────────────────────────────────────┘\n\\`\\`\\`\n\n## The Session Lifecycle (in detail)\n\n\\`\\`\\`\n ┌──────────────────────────────────────────────────────────────────┐\n │ SESSION LIFECYCLE │\n │ │\n │ sisyphus start \"task\" │\n │ │ │\n │ ▼ │\n │ ┌─────────┐ spawn agents ┌──────────────┐ │\n │ │ Orch │ ──────────────────→ │ Agents work │ │\n │ │ plans │ then yields │ in parallel │ │\n │ └────┬────┘ └──────┬───────┘ │\n │ │ │ each calls │\n │ │ orchestrator │ sisyphus submit │\n │ │ is KILLED │ when done │\n │ │ ▼ │\n │ │ ┌──────────────┐ │\n │ │ │ All agents │ │\n │ │ │ finished? │ │\n │ │ └──────┬───────┘ │\n │ │ │ yes │\n │ │ ┌──────────────────────┘ │\n │ │ ▼ │\n │ │ ┌─────────┐ │\n │ └──── │ Respawn │ Fresh orchestrator with full state │\n │ next cycle │ Orch │ Reviews reports, plans next cycle │\n │ └────┬────┘ │\n │ │ │\n │ ▼ │\n │ ┌───────────────┐ ┌───────────┐ │\n │ │ More work │──yes──→ │ Spawn │ → (loop) │\n │ │ needed? │ │ agents │ │\n │ └───────┬───────┘ └───────────┘ │\n │ │ no │\n │ ▼ │\n │ ┌───────────────┐ │\n │ │ sisyphus │ │\n │ │ complete │ │\n │ └───────────────┘ │\n └──────────────────────────────────────────────────────────────────┘\n\\`\\`\\`\n\n**Key insight**: The orchestrator is STATELESS. It gets killed after each yield and\nrespawned fresh with the complete session state (roadmap, agent reports, cycle history).\nThis means it never runs out of context, no matter how many cycles a session takes.\n\n## The Dashboard\n\nThe dashboard is a real-time TUI that shows session state. Launch with \\`sisyphus dashboard\\`\nor it auto-opens when a session starts.\n\n**Dashboard sections:**\n- **Header**: Session ID, status, task description\n- **Roadmap**: Current strategic plan with checked/unchecked items\n- **Agents**: List of all agents with status, duration, and report summaries\n- **Cycles**: Orchestrator cycle history\n- **Messages**: Recent session messages\n\n**Dashboard keys:**\n| Key | Action |\n|-----|--------|\n| \\`m\\` | Message the orchestrator (steer direction mid-session) |\n| \\`w\\` | Jump to the sisyphus tmux session (watch agents work) |\n| \\`k\\` | Kill the session |\n| \\`r\\` | Resume a paused/completed session |\n| \\`q\\` | Quit the dashboard |\n| \\`↑/↓\\` | Scroll through content |\n| \\`Tab\\` | Cycle through sections |\n\n**The \\`m\\` key is the most powerful feature.** You can message the orchestrator at any time\nto course-correct: \"Focus on the API layer first\", \"Skip the tests for now\",\n\"The approach for auth is wrong, use JWT instead\". The orchestrator reads these\nmessages when it respawns each cycle.\n\n## Monitoring Strategy\n\nSisyphus sessions should be actively monitored. Here's what to watch for:\n\n**Things that go wrong:**\n- Agents stuck waiting for user input (they're autonomous — they shouldn't need input)\n- Agents going down rabbit holes or working on the wrong thing\n- Merge conflicts between agents touching the same files\n- Orchestrator spawning too many agents or too few\n- Agents crashing or getting killed unexpectedly\n\n**When to intervene:**\n- Use \\`m\\` in the dashboard to message the orchestrator with corrections\n- Use \\`sisyphus kill <id>\\` to stop a runaway session\n- Use \\`sisyphus resume <id> \"new instructions\"\\` to restart with different direction\n\n**Useful monitoring commands:**\n\\`\\`\\`\nsisyphus status <id> # Quick status check\nsisyphus status --verbose <id> # Full detail: roadmap, pane output, agent instructions\nsisyphus dashboard # Interactive TUI\ntail -f ~/.sisyphus/daemon.log # Daemon activity log\n\\`\\`\\`\n\n## The .sisyphus/ Directory\n\nEverything sisyphus does lives in a \\`.sisyphus/\\` directory at the root of your project.\nThis is project-local — each project gets its own. It contains:\n\n\\`\\`\\`\n.sisyphus/\n├── config.json # Project-specific config (model, poll interval, etc.)\n├── orchestrator.md # Optional custom orchestrator prompt override\n└── sessions/\n ├── <session-id-1>/ # Each session gets its own directory\n ├── <session-id-2>/\n └── ...\n\\`\\`\\`\n\nThere's also a global directory at \\`~/.sisyphus/\\` for the daemon socket, PID file,\nlogs, keybind scripts, and global config. But the session state — the roadmaps,\nreports, context files, cycle logs — all lives in your project's \\`.sisyphus/sessions/\\`.\n\n## Session Files\n\nEvery session creates a directory at \\`.sisyphus/sessions/<id>/\\` with:\n\n\\`\\`\\`\n.sisyphus/sessions/<id>/\n├── state.json # Session state (agents, cycles, status)\n├── roadmap.md # Strategic plan (updated by orchestrator each cycle)\n├── goal.md # Original task description\n├── strategy.md # High-level strategy notes\n├── logs/\n│ ├── cycle-000.md # What the orchestrator did in cycle 0\n│ ├── cycle-001.md # What it did in cycle 1, etc.\n│ └── ...\n├── reports/\n│ ├── agent-001-final.md # Agent's final report\n│ ├── agent-002-update.md # Agent's progress update\n│ └── ...\n├── prompts/ # System/user prompts sent to orchestrator and agents\n└── context/ # Shared context files for agents\n\\`\\`\\`\n\n## Configuration\n\n**Global config**: \\`~/.sisyphus/config.json\\`\n**Project config**: \\`.sisyphus/config.json\\` (overrides global)\n\nOptions:\n- \\`model\\` — Claude model for orchestrator and agents\n- \\`orchestratorPrompt\\` — Path to custom orchestrator prompt\n- \\`pollIntervalMs\\` — How often daemon checks pane status (default: 2000)\n\n## Starting Sessions — Best Practices\n\n**The /sisyphus:begin slash command** is the recommended way to start. Inside Claude Code:\n\\`\\`\\`\n/sisyphus:begin\n\\`\\`\\`\nThen describe your task. Claude will hand it off with the right context.\n\n**Direct CLI:**\n\\`\\`\\`\nsisyphus start \"task description\" -c \"background context\"\nsisyphus start \"Implement @requirements.md\" -n my-feature\n\\`\\`\\`\n\n**Reference files with @**: \\`sisyphus start \"Build @docs/spec.md\"\\` — the orchestrator\nwill read the referenced file as part of its planning.\n\n**The -c flag** adds background context the orchestrator sees but doesn't act on directly.\nUse it for constraints: \\`-c \"Don't modify the auth module, use the existing API\"\\`\n\n**The -n flag** gives the session a human-readable name for easier tracking.\n\n## CLI Command Reference\n\n| Command | Purpose |\n|---------|---------|\n| \\`sisyphus start \"task\"\\` | Start a new session |\n| \\`sisyphus status [id]\\` | Check session status |\n| \\`sisyphus status -v [id]\\` | Detailed status with pane output |\n| \\`sisyphus list\\` | List all sessions |\n| \\`sisyphus dashboard\\` | Open the TUI dashboard |\n| \\`sisyphus resume <id> \"msg\"\\` | Resume with new instructions |\n| \\`sisyphus kill <id>\\` | Stop a session |\n| \\`sisyphus doctor\\` | Check installation health |\n| \\`sisyphus setup\\` | Run setup/onboarding |\n| \\`sisyphus setup-keybind\\` | Install tmux keybinds |\n\n## Troubleshooting\n\n**Daemon not running:**\n\\`\\`\\`\nsisyphusd restart\n\\`\\`\\`\n\n**Keybinds not working (special characters appear):**\niTerm2 → Settings → Profiles → Keys → Right Option Key → Esc+\n\n**Agents stuck:** Check \\`sisyphus status --verbose <id>\\` to see pane output. If an\nagent is waiting for input, kill the session and restart with clearer instructions.\n\n**Dashboard not opening:** Run \\`sisyphus dashboard\\` manually. Must be inside tmux.\n\n**Session seems hung:** Check \\`tail -20 ~/.sisyphus/daemon.log\\` for errors.\nThe daemon polls panes every 2s — if a pane dies unexpectedly, it'll be detected.\n</claude-instructions>\n`);\n}\n\nconst STEPS: Array<() => void> = [printStep0, printStep1, printStep2, printStep3, printStep4, printStep5];\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-5)', parseInt)\n .option('--explain', 'Comprehensive reference for how sisyphus works')\n .action((opts) => {\n if (opts.explain) {\n printExplain();\n return;\n }\n if (opts.tutorial !== undefined) {\n const step = opts.tutorial as number;\n if (step < 0 || step > 5 || Number.isNaN(step)) {\n console.error(`Invalid tutorial step: ${opts.tutorial}. Must be 0-5.`);\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 console.log(' notifications — { enabled: boolean, sound: string } (default: enabled, Hero.aiff)');\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 // Session bar\n console.log(' \\u2713 Status bar: daemon-rendered via @sisyphus_status');\n console.log(' Add to status-right: #{@sisyphus_status}');\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","import { execSync } from 'node:child_process';\nimport type { Command } from 'commander';\n\nexport function registerTmuxStatus(program: Command): void {\n program\n .command('tmux-status')\n .description('Output session status dots for tmux status bar')\n .action(() => {\n try {\n const status = execSync(\n 'tmux show-option -gv @sisyphus_status',\n { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] },\n ).trim();\n if (status) process.stdout.write(status);\n } catch {\n // Option not set or tmux error — output nothing\n }\n });\n}\n","import { execSync } from 'node:child_process';\nimport type { Command } from 'commander';\n\ninterface SessionEntry {\n name: string;\n displayName: string;\n phase: string | null;\n}\n\nconst DOT_MAP: Record<string, { icon: string; color: string }> = {\n 'orchestrator:processing': { icon: '●', color: '#d4ad6a' },\n 'orchestrator:idle': { icon: '●', color: '#d47766' },\n 'agents:running': { icon: '◆', color: '#d4ad6a' },\n 'between-cycles': { icon: '◆', color: '#5e584e' },\n 'paused': { icon: '○', color: '#d47766' },\n 'completed': { icon: '●', color: '#a9b16e' },\n};\n\nfunction tmuxExec(cmd: string): string | null {\n try {\n return execSync(cmd, { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();\n } catch {\n return null;\n }\n}\n\nexport function registerTmuxSessions(program: Command): void {\n program\n .command('tmux-sessions')\n .description('Output sisyphus session list for tmux status bar')\n .action(() => {\n const cwd = tmuxExec('tmux show-option -v @sisyphus_cwd');\n if (!cwd) return;\n\n const currentSession = tmuxExec(\"tmux display-message -p '#{session_name}'\");\n\n const sessionList = tmuxExec('tmux list-sessions -F \"#{session_name}\"');\n if (!sessionList) return;\n\n const entries: SessionEntry[] = [];\n\n for (const name of sessionList.split('\\n').filter(Boolean)) {\n const scwd = tmuxExec(`tmux show-option -t \"${name}\" -v @sisyphus_cwd`);\n if (scwd !== cwd) continue;\n\n const phase = tmuxExec(`tmux show-option -t \"${name}\" -v @sisyphus_phase`);\n const displayName = name.replace(/^ssyph_[^_]+_/, '');\n entries.push({ name, displayName, phase });\n }\n\n if (entries.length <= 1) return;\n\n const parts = entries.map(e => {\n const dot = e.phase ? DOT_MAP[e.phase] : null;\n const dotStr = dot ? ` #[fg=${dot.color}]${dot.icon}` : '';\n const isCurrent = e.name === currentSession;\n\n if (isCurrent) {\n return `#[fg=#e2d9c6,bold]${e.displayName}${dotStr}#[default]`;\n }\n return `#[fg=#5e584e]${e.displayName}${dotStr}#[default]`;\n });\n\n process.stdout.write(parts.join('#[fg=#3a3d42] │ '));\n });\n}\n"],"mappings":"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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAkVb;AACD;AAEA,IAAM,QAA2B,CAAC,YAAY,YAAY,YAAY,YAAY,YAA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","names":["existsSync","mkdirSync","readFileSync","dirname","join","fileURLToPath","execSync","execSync","existsSync","mkdirSync","readFileSync","unlinkSync","writeFileSync","homedir","join","execSync","execSync","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","execSync","existsSync","readFileSync","readFileSync","existsSync","execSync","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","execSync","dirname","join","fileURLToPath","join","dirname","fileURLToPath","execSync","program","existsSync","mkdirSync","writeFileSync","join","program","execSync","execSync","program","execSync","program","execSync","program","readFileSync","join","dirname","fileURLToPath","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/plugins.ts","../src/cli/client.ts","../src/cli/tmux.ts","../src/cli/commands/dashboard.ts","../src/cli/commands/status.ts","../src/cli/commands/list.ts","../src/cli/commands/tell.ts","../src/cli/commands/read.ts","../src/cli/commands/message.ts","../src/cli/commands/ask.ts","../src/shared/ask-schema.ts","../src/cli/commands/kill.ts","../src/cli/commands/delete.ts","../src/cli/commands/resume.ts","../src/cli/commands/continue.ts","../src/cli/commands/complete.ts","../src/cli/commands/rollback.ts","../src/cli/commands/reconnect.ts","../src/cli/commands/clone.ts","../src/cli/commands/update-task.ts","../src/cli/commands/set-effort.ts","../src/cli/commands/print-context.ts","../src/cli/commands/spawn.ts","../src/cli/stdin.ts","../src/cli/commands/submit.ts","../src/cli/commands/report.ts","../src/cli/commands/await.ts","../src/cli/commands/kill-agent.ts","../src/cli/commands/restart-agent.ts","../src/cli/commands/yield.ts","../src/cli/commands/register-segment.ts","../src/cli/commands/unregister-segment.ts","../src/cli/commands/setup.ts","../src/cli/onboard.ts","../src/cli/commands/setup-keybind.ts","../src/cli/commands/doctor.ts","../src/cli/commands/init.ts","../src/cli/commands/uninstall.ts","../src/cli/commands/configure-upload.ts","../src/cli/commands/getting-started.ts","../src/cli/commands/history.ts","../src/cli/commands/export.ts","../src/cli/commands/upload.ts","../src/cli/commands/scratch.ts","../src/cli/commands/review.ts","../src/cli/commands/companion.ts","../src/cli/commands/notify.ts","../src/cli/commands/tmux-status.ts","../src/cli/commands/tmux-sessions.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 { registerStatus } from './commands/status.js';\nimport { registerDashboard } from './commands/dashboard.js';\nimport { registerList } from './commands/list.js';\nimport { registerTell } from './commands/tell.js';\nimport { registerRead } from './commands/read.js';\nimport { registerMessage } from './commands/message.js';\nimport { registerAsk } from './commands/ask.js';\nimport { registerKill } from './commands/kill.js';\nimport { registerDelete } from './commands/delete.js';\nimport { registerResume } from './commands/resume.js';\nimport { registerContinue } from './commands/continue.js';\nimport { registerComplete } from './commands/complete.js';\nimport { registerRollback } from './commands/rollback.js';\nimport { registerReconnect } from './commands/reconnect.js';\nimport { registerClone } from './commands/clone.js';\nimport { registerSessionTask } from './commands/update-task.js';\nimport { registerSessionEffort } from './commands/set-effort.js';\nimport { registerSessionContext } from './commands/print-context.js';\nimport { registerSpawn } from './commands/spawn.js';\nimport { registerSubmit } from './commands/submit.js';\nimport { registerReport } from './commands/report.js';\nimport { registerAwait } from './commands/await.js';\nimport { registerAgentKill } from './commands/kill-agent.js';\nimport { registerAgentRestart } from './commands/restart-agent.js';\nimport { registerYield } from './commands/yield.js';\nimport { registerSegmentRegister } from './commands/register-segment.js';\nimport { registerSegmentUnregister } from './commands/unregister-segment.js';\nimport { registerSetup } from './commands/setup.js';\nimport { registerSetupKeybind } from './commands/setup-keybind.js';\nimport { registerDoctor } from './commands/doctor.js';\nimport { registerInit } from './commands/init.js';\nimport { registerUninstall } from './commands/uninstall.js';\nimport { registerConfigureUpload } from './commands/configure-upload.js';\nimport { registerGettingStarted } from './commands/getting-started.js';\nimport { registerHistory } from './commands/history.js';\nimport { registerExport } from './commands/export.js';\nimport { registerUpload } from './commands/upload.js';\nimport { registerScratch } from './commands/scratch.js';\nimport { registerReview } from './commands/review.js';\nimport { registerCompanion } from './commands/companion.js';\nimport { attachNotify } from './commands/notify.js';\nimport { attachTmuxStatus } from './commands/tmux-status.js';\nimport { attachTmuxSessions } from './commands/tmux-sessions.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\n// Flat hot-path\nregisterStart(program);\nregisterStatus(program);\nregisterDashboard(program);\nregisterList(program);\nregisterTell(program);\nregisterRead(program);\nregisterMessage(program);\nregisterAsk(program);\n\n// session group\nconst session = program.command('session').description('Manage sessions');\nregisterKill(session);\nregisterDelete(session);\nregisterResume(session);\nregisterContinue(session);\nregisterComplete(session);\nregisterRollback(session);\nregisterReconnect(session);\nregisterClone(session);\nregisterSessionTask(session);\nregisterSessionEffort(session);\nregisterSessionContext(session);\n\n// agent group\nconst agent = program.command('agent').description('Manage agents');\nregisterSpawn(agent);\nregisterSubmit(agent);\nregisterReport(agent);\nregisterAwait(agent);\nregisterAgentKill(agent);\nregisterAgentRestart(agent);\n\n// orch group\nconst orch = program.command('orch').description('Orchestrator commands');\nregisterYield(orch);\n\n// segment group\nconst segment = program.command('segment').description('Status-line segments');\nregisterSegmentRegister(segment);\nregisterSegmentUnregister(segment);\n\n// admin group\nconst admin = program.command('admin').description('Admin / setup commands');\nregisterSetup(admin);\nregisterSetupKeybind(admin);\nregisterDoctor(admin);\nregisterInit(admin);\nregisterUninstall(admin);\nregisterConfigureUpload(admin);\nregisterGettingStarted(admin);\nregisterHistory(admin);\nregisterExport(admin);\nregisterUpload(admin);\nregisterScratch(admin);\nregisterReview(admin);\n\n// companion group (root action + memory + popup-test + context)\nregisterCompanion(program);\n\n// diagnostic group (hidden)\nconst diagnostic = program.command('diagnostic', { hidden: true });\nattachNotify(diagnostic);\nattachTmuxStatus(diagnostic);\nattachTmuxSessions(diagnostic);\n\nprogram.addHelpText('after', `\nExamples:\n $ sisyphus start \"Implement auth system\" Start a new session\n $ sisyphus start \"Build @reqs.md\" -n auth Start with name + requirements\n $ sisyphus status Check current sessions\n $ sisyphus dashboard Open the TUI\n $ sisyphus admin doctor Verify installation\n\nRun 'sisyphus admin 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 = ['admin', 'help', '--help', '-h', '--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 admin 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, spawnSync } from 'node:child_process';\nimport { basename } from 'node:path';\nimport { sendRequest } from '../client.js';\nimport { getTmuxSessionInfo, isTmuxInstalled } from '../tmux.js';\nimport { shellQuote } from '../../shared/shell.js';\nimport { openDashboardWindow } from './dashboard.js';\nimport type { Request } from '../../shared/protocol.js';\n\n\n/**\n * Get or create a tmux session for the given cwd.\n * Returns the session name. Does NOT attach — caller decides.\n */\nfunction ensureTmuxSessionExists(cwd: string): string {\n const sessionName = `sisyphus-${basename(cwd)}`;\n\n try {\n execSync(`tmux has-session -t ${shellQuote(sessionName)}`, { stdio: 'pipe' });\n } catch {\n execSync(\n `tmux new-session -d -s ${shellQuote(sessionName)} -c ${shellQuote(cwd)}`,\n { stdio: 'pipe' },\n );\n }\n\n return sessionName;\n}\n\n/**\n * Attach the user's terminal to a tmux session.\n * If already inside tmux, switches the client. Otherwise, attaches directly.\n * Attach/switch takes over the terminal — this blocks until detach.\n */\nfunction attachToTmuxSession(sessionName: string): void {\n if (process.env['TMUX']) {\n // Already in tmux — switch to the target session\n spawnSync('tmux', ['switch-client', '-t', sessionName], { stdio: 'inherit' });\n } else {\n // Not in tmux — attach takes over the terminal\n spawnSync('tmux', ['attach-session', '-t', sessionName], { stdio: 'inherit' });\n }\n}\n\n\nexport function registerStart(program: Command): void {\n program\n .command('start')\n .description('Start a new sisyphus session')\n .argument('<task>', 'Task description for the orchestrator')\n .option('-c, --context <context>', 'Background context for the orchestrator')\n .option('-n, --name <name>', 'Human-readable name for the session')\n .option('--effort <tier>', 'Pipeline effort tier (low|medium|high|xhigh)')\n .option('--no-tmux-check', 'Skip the tmux session check')\n .action(async (task: string, opts: { context?: string; name?: string; effort?: string; tmuxCheck?: boolean }) => {\n const cwd = process.env['SISYPHUS_CWD'] ?? process.cwd();\n\n if (opts.effort !== undefined) {\n const validTiers = ['low', 'medium', 'high', 'xhigh'];\n if (!validTiers.includes(opts.effort)) {\n console.error(`Error: --effort must be one of: ${validTiers.join(', ')}`);\n process.exit(1);\n }\n }\n\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 process.exit(1);\n }\n\n // Send the start request — this is just a socket call, no tmux needed\n const effort = opts.effort as 'low' | 'medium' | 'high' | 'xhigh' | undefined;\n const request: Request = { type: 'start', task, context: opts.context, cwd, name: opts.name, ...(effort !== undefined ? { effort } : {}) };\n const response = await sendRequest(request);\n if (!response.ok) {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n\n const sessionId = response.data?.sessionId as string;\n console.log(`Task handed off to sisyphus orchestrator (session ${sessionId})`);\n\n if (opts.tmuxCheck === false) {\n // --no-tmux-check: print info and exit, don't touch tmux\n const tmuxSessionName = response.data?.tmuxSessionName as string | undefined;\n if (tmuxSessionName) {\n console.log(`Tmux session: ${tmuxSessionName}`);\n console.log(` tmux attach -t ${tmuxSessionName}`);\n }\n console.log(`Monitor: sisyphus status ${sessionId}`);\n return;\n }\n\n // Determine which tmux session to use for the dashboard.\n // If we're already in tmux, use the current session.\n // If not, create a dedicated session for this project.\n let tmuxSession: string;\n let tmuxSessionTarget: string;\n if (process.env['TMUX']) {\n const info = getTmuxSessionInfo();\n tmuxSession = info.name;\n tmuxSessionTarget = info.id;\n } else {\n tmuxSession = ensureTmuxSessionExists(cwd);\n tmuxSessionTarget = tmuxSession;\n }\n\n // Tag the tmux session with the cwd — but don't clobber a tag that\n // already points to a different project. Overwriting would re-home an\n // existing session onto this project, poisoning alt+s cycle groups and\n // C-s h for the original project.\n // Target by $N id when available — tmux -t <name> can substring-match\n // the wrong session under sparse env.\n try {\n const normalizedCwd = cwd.replace(/\\/+$/, '');\n let existing = '';\n try {\n existing = execSync(\n `tmux show-options -t ${shellQuote(tmuxSessionTarget)} -v @sisyphus_cwd`,\n { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] },\n ).trim();\n } catch {\n // option unset\n }\n if (!existing || existing === normalizedCwd) {\n execSync(\n `tmux set-option -t ${shellQuote(tmuxSessionTarget)} @sisyphus_cwd ${shellQuote(normalizedCwd)}`,\n { stdio: 'ignore' },\n );\n } else {\n console.error(\n `Note: tmux session \"${tmuxSession}\" is already the home for ${existing}; leaving its @sisyphus_cwd unchanged.`,\n );\n }\n } catch (err) {\n console.error(`Warning: failed to tag tmux session with cwd: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n // Open dashboard in the tmux session\n try {\n openDashboardWindow(tmuxSession, cwd);\n } catch (err) {\n console.error(`Warning: failed to open dashboard window: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n // If we weren't in tmux, attach now — user lands on the dashboard\n if (!process.env['TMUX']) {\n attachToTmuxSession(tmuxSession);\n }\n\n console.log(`Monitor: sisyphus status ${sessionId}`);\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';\nimport { ensureRequiredPlugins, ensureSisyphusPluginInstalled, type SisyphusPluginInfo } from './plugins.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 // Idempotent: ensures the user-facing slash-command plugin is available.\n // Placed outside the !isInstalled() guard so users whose daemon was installed\n // before this plugin shipped self-heal the next time the daemon is unreachable.\n const sisyphusPlugin = ensureSisyphusPluginInstalled();\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 await ensureRequiredPlugins(process.cwd());\n\n printGettingStarted(keybindResult, sisyphusPlugin);\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(\n keybindResult: SetupResult,\n sisyphusPlugin: SisyphusPluginInfo,\n): 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 if (sisyphusPlugin.installed && sisyphusPlugin.autoInstalled) {\n lines.push(`Sisyphus plugin installed: sisyphus@sisyphus → ${sisyphusPlugin.installPath}`, '');\n } else if (!sisyphusPlugin.installed) {\n lines.push('Sisyphus plugin: failed to install (run `sisyphus admin setup` to retry; needs `claude` CLI)', '');\n }\n\n lines.push(\n 'Run `sisyphus admin 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';\nimport { KEYMAP, formatHelpForKeymap, type MenuDef, type MenuItem, type Action } from '../shared/keymap.js';\n\nexport const DEFAULT_CYCLE_KEY = 'M-s';\nexport const DEFAULT_PREFIX_KEY = 'C-s';\nexport const KEY_TABLE = 'sisyphus';\n\nconst SISYPHUS_CONF_MARKER = '# sisyphus-managed — do not edit';\n\nfunction scriptPath(name: string): string {\n return join(globalDir(), 'bin', name);\n}\n\nexport function cycleScriptPath(): string {\n return scriptPath('sisyphus-cycle');\n}\n\nexport function homeScriptPath(): string {\n return scriptPath('sisyphus-home');\n}\n\nexport function killPaneScriptPath(): string {\n return scriptPath('sisyphus-kill-pane');\n}\n\nexport function newPromptScriptPath(): string {\n return scriptPath('sisyphus-new');\n}\n\nexport function messageScriptPath(): string {\n return scriptPath('sisyphus-msg');\n}\n\nexport function deleteSessionScriptPath(): string {\n return scriptPath('sisyphus-delete-session');\n}\n\nexport function killSessionScriptPath(): string {\n return scriptPath('sisyphus-kill-session');\n}\n\nexport function helpScriptPath(): string {\n return scriptPath('sisyphus-help');\n}\n\nexport function statusPopupScriptPath(): string {\n return scriptPath('sisyphus-status-popup');\n}\n\nexport function pickSessionScriptPath(): string {\n return scriptPath('sisyphus-pick-session');\n}\n\nexport function continueSessionScriptPath(): string {\n return scriptPath('sisyphus-continue-session');\n}\n\nexport function restartAgentScriptPath(): string {\n return scriptPath('sisyphus-restart-agent-popup');\n}\n\nexport function exportSessionScriptPath(): string {\n return scriptPath('sisyphus-export-session');\n}\n\nexport function openRoadmapScriptPath(): string {\n return scriptPath('sisyphus-open-roadmap');\n}\n\nexport function openStrategyScriptPath(): string {\n return scriptPath('sisyphus-open-strategy');\n}\n\nexport function keymapJsonPath(): string {\n return join(globalDir(), 'keymap.json');\n}\n\nexport function writeKeymapJson(): void {\n mkdirSync(globalDir(), { recursive: true });\n writeFileSync(keymapJsonPath(), JSON.stringify(KEYMAP, null, 2), 'utf8');\n}\n\nexport function tmuxVersionAtLeast(major: number, minor: number): boolean {\n try {\n const out = execSync('tmux -V', { stdio: ['pipe', 'pipe', 'pipe'] }).toString().trim();\n const match = out.match(/tmux\\s+(\\d+)\\.(\\d+)/);\n if (!match) return false;\n const v = parseInt(match[1], 10) * 1000 + parseInt(match[2], 10);\n return v >= major * 1000 + minor;\n } catch {\n return false;\n }\n}\n\nfunction menuItemCommand(action: Action, scriptsDir: string): string | null {\n switch (action.type) {\n case 'script':\n return `run-shell ${join(scriptsDir, action.name)}`;\n case 'popup': {\n const { w, h, borderStyle, title, cwd } = action.popup;\n let args = '-E';\n if (w) args += ` -w ${w}`;\n if (h) args += ` -h ${h}`;\n if (borderStyle) args += ` -S '${borderStyle}'`;\n if (title) args += ` -T '${title}'`;\n if (cwd === 'current') args += ` -d '#{pane_current_path}'`;\n return `display-popup ${args} ${join(scriptsDir, action.name)}`;\n }\n case 'submenu':\n return `run-shell ${join(scriptsDir, `sisyphus-menu-${action.ref}`)}`;\n case 'tmux':\n return action.cmd;\n case 'tui':\n return null;\n }\n}\n\nexport function generateMenuLine(item: MenuItem, scriptsDir: string): string {\n const cmd = menuItemCommand(item.action, scriptsDir);\n if (cmd === null) return '';\n const label = item.label.replace(/\"/g, '\\\\\"');\n return `\"${label}\" ${item.key} \"${cmd}\"`;\n}\n\nexport function generateSubmenuScript(submenuId: string, def: MenuDef, scriptsDir: string): string {\n const lines = def.items\n .map(item => generateMenuLine(item, scriptsDir))\n .filter(l => l !== '');\n const args = lines.join(' \\\\\\n ');\n return `#!/bin/bash\nexec tmux display-menu -T '${def.title}' -x R -y S \\\\\n ${args}\n`;\n}\n\nexport function generateTopLevelBinding(prefixKey: string, def: MenuDef, scriptsDir: string): string {\n const args = def.items\n .map(item => generateMenuLine(item, scriptsDir))\n .filter(l => l !== '')\n .join(' ');\n return `bind-key -T root ${prefixKey} display-menu -T '${def.title}' -x R -y S ${args}`;\n}\n\nexport function sisyphusTmuxConfPath(): string {\n return join(globalDir(), 'tmux.conf');\n}\n\nfunction userTmuxConfPath(): string | null {\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\n# Target by $N session ID (column 5 in TSV) — tmux -t <name> can substring-match\n# the wrong session under sparse env.\nMANIFEST=\"$HOME/.sisyphus/sessions-manifest.tsv\"\nif [ ! -f \"$MANIFEST\" ]; then\n tmux display-message \"sisyphus: no manifest — daemon running?\"\n exit 0\nfi\ncurrent_id=$(tmux display-message -p '#{session_id}')\ncurrent_name=$(tmux display-message -p '#{session_name}')\ncwd=\"\"\nwhile IFS=$'\\\\t' read -r type name scwd phase sid; do\n [ \"$sid\" = \"$current_id\" ] && { cwd=\"$scwd\"; break; }\ndone < \"$MANIFEST\"\nif [ -z \"$cwd\" ]; then\n tmux display-message \"sisyphus: '$current_name' has no @sisyphus_cwd — run 'sisyphus start' here to register\"\n exit 0\nfi\nsession_ids=()\nwhile IFS=$'\\\\t' read -r type name scwd phase sid; do\n [[ \"$type\" == \"#\"* ]] && continue\n [ \"$scwd\" = \"$cwd\" ] && session_ids+=(\"$sid\")\ndone < \"$MANIFEST\"\nif (( \\${#session_ids[@]} <= 1 )); then\n tmux display-message \"sisyphus: only one session in $cwd — nothing to cycle to\"\n exit 0\nfi\nfor (( i=0; i<\\${#session_ids[@]}; i++ )); do\n if [ \"\\${session_ids[$i]}\" = \"$current_id\" ]; then\n next=$(( (i + 1) % \\${#session_ids[@]} ))\n tmux switch-client -t \"\\${session_ids[$next]}\"\n exit 0\n fi\ndone\ntmux switch-client -t \"\\${session_ids[0]}\"\n`;\n\n// Live tmux query for the home session + its dashboard window ID.\n// Sets HOME_SESSION and HOME_DWID. Returns 0 on success, 1 if no home found.\n// Optional arg: explicit cwd to look up. If omitted, uses @sisyphus_cwd from\n// the current tmux session, falling back to #{pane_current_path}.\n// Sets HOME_SESSION (tmux $N id) and HOME_DWID for the non-ssyph_ session\n// matching the given cwd. Always targets by $N — tmux -t <name> can\n// substring-match under sparse env.\nconst RESOLVE_HOME = `\nHOME_SESSION=\"\"\nHOME_DWID=\"\"\nresolve_home() {\n local target_cwd=\"$1\"\n local current_id sid sname scwd\n if [ -z \"$target_cwd\" ]; then\n current_id=$(tmux display-message -p '#{session_id}')\n target_cwd=$(tmux show-options -t \"$current_id\" -v @sisyphus_cwd 2>/dev/null)\n [ -z \"$target_cwd\" ] && target_cwd=$(tmux display-message -p '#{pane_current_path}')\n fi\n target_cwd=\"\\${target_cwd%/}\"\n [ -z \"$target_cwd\" ] && return 1\n while IFS=$'\\\\t' read -r sid sname; do\n [ -z \"$sid\" ] && continue\n case \"$sname\" in ssyph_*) continue ;; esac\n scwd=$(tmux show-options -t \"$sid\" -v @sisyphus_cwd 2>/dev/null)\n scwd=\"\\${scwd%/}\"\n if [ \"$scwd\" = \"$target_cwd\" ]; then\n HOME_SESSION=\"$sid\"\n HOME_DWID=$(tmux show-options -t \"$sid\" -v @sisyphus_dashboard 2>/dev/null)\n return 0\n fi\n done < <(tmux list-sessions -F '#{session_id}\t#{session_name}')\n return 1\n}`.trim();\n\nfunction homeScript(): string {\n const tuiPath = join(import.meta.dirname, 'tui.js');\n return `#!/bin/bash\n# Jump to the dashboard window for the home session matching this cwd.\n${RESOLVE_HOME}\nif ! resolve_home; then\n tmux display-message \"No sisyphus dashboard for this cwd\"\n exit 0\nfi\n# Validate dashboard window is still alive; clear if stale\nif [ -n \"$HOME_DWID\" ] && ! tmux list-panes -t \"$HOME_DWID\" >/dev/null 2>&1; then\n HOME_DWID=\"\"\nfi\n# Reconcile: if option is unset/stale, scan home session for an existing TUI window\n# (pane running 'node'). This prevents duplicate dashboards when the option drifts.\nif [ -z \"$HOME_DWID\" ]; then\n HOME_DWID=$(tmux list-windows -t \"$HOME_SESSION\" -F '#{window_id} #{pane_current_command}' 2>/dev/null \\\n | awk '$2==\"node\"{print $1; exit}')\n [ -n \"$HOME_DWID\" ] && tmux set-option -t \"$HOME_SESSION\" @sisyphus_dashboard \"$HOME_DWID\"\nfi\nif [ -z \"$HOME_DWID\" ]; then\n # Reopen dashboard: create window, launch TUI, update option\n home_cwd=$(tmux show-options -t \"$HOME_SESSION\" -v @sisyphus_cwd 2>/dev/null)\n [ -z \"$home_cwd\" ] && { tmux display-message \"Home session has no cwd\"; exit 0; }\n HOME_DWID=$(tmux new-window -t \"$HOME_SESSION:\" -n \"sisyphus-dashboard\" -c \"$home_cwd\" -P -F \"#{window_id}\")\n tmux send-keys -t \"$HOME_DWID\" \"node '${tuiPath}' --cwd '$home_cwd'; exit\" Enter\n tmux set-option -t \"$HOME_SESSION\" @sisyphus_dashboard \"$HOME_DWID\"\nfi\ncurrent_id=$(tmux display-message -p '#{session_id}')\n[ \"$current_id\" != \"$HOME_SESSION\" ] && tmux switch-client -t \"$HOME_SESSION\"\ntmux select-window -t \"$HOME_DWID\"\n`;\n}\n\nconst KILL_PANE_SCRIPT = `#!/bin/bash\n# Smart kill-pane invoked via the sisyphus prefix menu (C-s x).\n# If this is the last pane, switch to the home session before killing.\n${RESOLVE_HOME}\nsession_id=$(tmux display-message -p '#{session_id}')\npane_count=$(tmux list-panes -t \"$session_id\" -F '#{pane_id}' | wc -l | tr -d ' ')\n\nif [ \"$pane_count\" -le 1 ]; then\n if resolve_home; then\n tmux switch-client -t \"$HOME_SESSION\"\n [ -n \"$HOME_DWID\" ] && tmux select-window -t \"$HOME_DWID\"\n tmux kill-session -t \"$session_id\"\n exit 0\n fi\n tmux kill-pane\nelse\n tmux kill-pane\n tmux select-layout even-horizontal\nfi\n`;\n\nconst NEW_PROMPT_SCRIPT = `#!/bin/bash\n# Open nvim to compose a new sisyphus task, then start a session\ntmpfile=$(mktemp /tmp/sisyphus-new-XXXXXX.md)\ntrap 'rm -f \"$tmpfile\"' EXIT\nnvim \"$tmpfile\"\ngrep -q '[^[:space:]]' \"$tmpfile\" || exit 0\nexec sisyphus start \"$(cat \"$tmpfile\")\"\n`;\n\nconst MESSAGE_SCRIPT = `#!/bin/bash\n# Open nvim to compose a message for the current session's orchestrator\n# Resolve session ID: direct tmux option → manifest lookup.\n# All -t targeting uses $N session id — tmux -t <name> can substring-match under sparse env.\ntmux_sid=$(tmux display-message -p '#{session_id}')\nsession_id=$(tmux show-options -t \"$tmux_sid\" -v @sisyphus_session_id 2>/dev/null)\n\nif [ -z \"$session_id\" ]; then\n MANIFEST=\"$HOME/.sisyphus/sessions-manifest.tsv\"\n [ ! -f \"$MANIFEST\" ] && { echo \"No active sessions found\"; sleep 1; exit 1; }\n cwd=\"\"\n while IFS=$'\\\\t' read -r type name scwd phase sid; do\n [ \"$sid\" = \"$tmux_sid\" ] && { cwd=\"$scwd\"; break; }\n done < \"$MANIFEST\"\n [ -z \"$cwd\" ] && { echo \"Session not in manifest\"; sleep 1; exit 1; }\n while IFS=$'\\\\t' read -r type name scwd phase sid; do\n if [ \"$type\" = \"S\" ] && [ \"$scwd\" = \"$cwd\" ]; then\n session_id=$(tmux show-options -t \"$sid\" -v @sisyphus_session_id 2>/dev/null)\n [ -n \"$session_id\" ] && break\n fi\n done < \"$MANIFEST\"\nfi\n\n[ -z \"$session_id\" ] && { echo \"No active sisyphus session found\"; sleep 1; exit 1; }\n\ntmpfile=$(mktemp /tmp/sisyphus-msg-XXXXXX.md)\ntrap 'rm -f \"$tmpfile\"' EXIT\nnvim \"$tmpfile\"\ngrep -q '[^[:space:]]' \"$tmpfile\" || exit 0\nexec sisyphus message --session \"$session_id\" \"$(cat \"$tmpfile\")\"\n`;\n\n// --- Shared session ID + cwd resolution for session-scoped scripts ---\n// All tmux -t targeting uses $N session id — -t <name> can substring-match under sparse env.\nconst SESSION_RESOLVE = `\ntmux_sid=$(tmux display-message -p '#{session_id}')\nsession_id=$(tmux show-options -t \"$tmux_sid\" -v @sisyphus_session_id 2>/dev/null)\ncwd=$(tmux show-options -t \"$tmux_sid\" -v @sisyphus_cwd 2>/dev/null)\n\nif [ -z \"$session_id\" ]; then\n MANIFEST=\"$HOME/.sisyphus/sessions-manifest.tsv\"\n [ ! -f \"$MANIFEST\" ] && { echo \"No active sessions found\"; sleep 1; exit 1; }\n if [ -z \"$cwd\" ]; then\n while IFS=$'\\\\t' read -r type name scwd phase sid; do\n [ \"$sid\" = \"$tmux_sid\" ] && { cwd=\"$scwd\"; break; }\n done < \"$MANIFEST\"\n fi\n [ -z \"$cwd\" ] && { echo \"Session not in manifest\"; sleep 1; exit 1; }\n while IFS=$'\\\\t' read -r type name scwd phase sid; do\n if [ \"$type\" = \"S\" ] && [ \"$scwd\" = \"$cwd\" ]; then\n session_id=$(tmux show-options -t \"$sid\" -v @sisyphus_session_id 2>/dev/null)\n [ -n \"$session_id\" ] && break\n fi\n done < \"$MANIFEST\"\nfi\n\n[ -z \"$session_id\" ] && { echo \"No active sisyphus session found\"; sleep 1; exit 1; }\n[ -z \"$cwd\" ] && cwd=$(tmux display-message -p '#{pane_current_path}')`.trim();\n\n// --- Go-home helper used by kill/delete scripts ---\n// Assumes $cwd was captured before the destructive action ran (via SESSION_RESOLVE).\nconst GO_HOME_AFTER = `\n${RESOLVE_HOME}\nif resolve_home \"$cwd\"; then\n tmux switch-client -t \"$HOME_SESSION\"\n [ -n \"$HOME_DWID\" ] && tmux select-window -t \"$HOME_DWID\"\nfi`.trim();\n\nconst KILL_SESSION_SCRIPT = `#!/bin/bash\n# Kill the sisyphus session associated with the current tmux session\n${SESSION_RESOLVE}\n\nsisyphus session kill \"$session_id\" >/dev/null 2>&1\n${GO_HOME_AFTER}\n`;\n\nconst DELETE_SESSION_SCRIPT = `#!/bin/bash\n# Delete the sisyphus session associated with the current tmux session\n${SESSION_RESOLVE}\n\nprintf \"\\\\033[31mType 'yes' to confirm:\\\\033[0m \"\nread -r answer\n[ \"$answer\" = \"yes\" ] || exit 0\nsisyphus session delete \"$session_id\" --cwd \"$cwd\" >/dev/null 2>&1\n${GO_HOME_AFTER}\n`;\n\nconst HELP_SCRIPT = `#!/bin/bash\ncat <<'EOF_HELP'\n${formatHelpForKeymap(KEYMAP)}\nEOF_HELP\nread -n 1 -s -r -p \" Press any key to close\"\n`;\n\nconst STATUS_POPUP_SCRIPT = `#!/bin/bash\n# Show session status — if no sisyphus session here, list all.\n# -t targeting uses $N session id — -t <name> can substring-match under sparse env.\ntmux_sid=$(tmux display-message -p '#{session_id}')\nsession_id=$(tmux show-options -t \"$tmux_sid\" -v @sisyphus_session_id 2>/dev/null)\n\nif [ -z \"$session_id\" ]; then\n MANIFEST=\"$HOME/.sisyphus/sessions-manifest.tsv\"\n if [ -f \"$MANIFEST\" ]; then\n cwd=\"\"\n while IFS=$'\\\\t' read -r type name scwd phase sid; do\n [ \"$sid\" = \"$tmux_sid\" ] && { cwd=\"$scwd\"; break; }\n done < \"$MANIFEST\"\n if [ -n \"$cwd\" ]; then\n while IFS=$'\\\\t' read -r type name scwd phase sid; do\n if [ \"$type\" = \"S\" ] && [ \"$scwd\" = \"$cwd\" ]; then\n session_id=$(tmux show-options -t \"$sid\" -v @sisyphus_session_id 2>/dev/null)\n [ -n \"$session_id\" ] && break\n fi\n done < \"$MANIFEST\"\n fi\n fi\nfi\n\nif [ -n \"$session_id\" ]; then\n sisyphus status \"$session_id\" 2>&1 | less -R\nelse\n sisyphus list 2>&1 | less -R\nfi\n`;\n\nconst PICK_SESSION_SCRIPT = `#!/bin/bash\n# Session picker — switch to a sisyphus session.\n# switch-client -t targets $N session id — -t <name> can substring-match under sparse env.\nMANIFEST=\"$HOME/.sisyphus/sessions-manifest.tsv\"\n[ ! -f \"$MANIFEST\" ] && { echo \"No sessions found\"; sleep 1; exit 0; }\n\ncurrent_id=$(tmux display-message -p '#{session_id}')\ncwd=\"\"\nwhile IFS=$'\\\\t' read -r type name scwd phase sid; do\n [ \"$sid\" = \"$current_id\" ] && { cwd=\"$scwd\"; break; }\ndone < \"$MANIFEST\"\n\ndeclare -a entries=()\ndeclare -a targets=()\nwhile IFS=$'\\\\t' read -r type name scwd phase sid; do\n [[ \"$type\" == \"#\"* ]] && continue\n [ -n \"$cwd\" ] && [ \"$scwd\" != \"$cwd\" ] && continue\n display=\"$name\"\n if [[ \"$name\" == ssyph_* ]]; then\n display=\"\\${name#ssyph_}\"\n display=\"\\${display#*_}\"\n fi\n [ \"$type\" = \"H\" ] && display=\"~ home\"\n marker=\"\"\n [ \"$sid\" = \"$current_id\" ] && marker=\" *\"\n phase_label=\"\\${phase:-—}\"\n entries+=(\"\\${display} [\\${phase_label}]\\${marker}\")\n targets+=(\"$sid\")\ndone < \"$MANIFEST\"\n\n(( \\${#entries[@]} == 0 )) && { echo \"No sessions found\"; sleep 1; exit 0; }\n\nif command -v fzf &>/dev/null; then\n idx=$(for (( i=0; i<\\${#entries[@]}; i++ )); do echo \"$i \\${entries[$i]}\"; done | \\\\\n fzf --height=100% --reverse --with-nth=2.. --prompt=\"Switch to: \" | awk '{print $1}')\n [ -z \"$idx\" ] && exit 0\n tmux switch-client -t \"\\${targets[$idx]}\"\nelse\n for (( i=0; i<\\${#entries[@]}; i++ )); do\n printf \" %d) %s\\\\n\" $((i+1)) \"\\${entries[$i]}\"\n done\n printf \"\\\\nPick session: \"\n read -r choice\n idx=$((choice - 1))\n (( idx >= 0 && idx < \\${#entries[@]} )) || exit 0\n tmux switch-client -t \"\\${targets[$idx]}\"\nfi\n`;\n\nconst CONTINUE_SESSION_SCRIPT = `#!/bin/bash\n# Continue a completed session\n${SESSION_RESOLVE}\n\nshort_id=\"\\${session_id:0:8}\"\nprintf \"\\\\033[33mContinue session %s...?\\\\033[0m (y/n) \" \"$short_id\"\nread -r answer\n[ \"$answer\" = \"y\" ] || [ \"$answer\" = \"yes\" ] || exit 0\nsisyphus session continue --session \"$session_id\"\nsleep 1\n`;\n\nconst OPEN_ROADMAP_SCRIPT = `#!/bin/bash\n# Open roadmap.md for the current session in nvim\n${SESSION_RESOLVE}\n\nfile=\"$cwd/.sisyphus/sessions/$session_id/roadmap.md\"\n[ ! -f \"$file\" ] && { tmux display-message \"No roadmap.md for this session\"; exit 0; }\nexec nvim \"$file\"\n`;\n\nconst OPEN_STRATEGY_SCRIPT = `#!/bin/bash\n# Open strategy.md for the current session in nvim\n${SESSION_RESOLVE}\n\nfile=\"$cwd/.sisyphus/sessions/$session_id/strategy.md\"\n[ ! -f \"$file\" ] && { tmux display-message \"No strategy.md for this session\"; exit 0; }\nexec nvim \"$file\"\n`;\n\nconst EXPORT_SESSION_SCRIPT = `#!/bin/bash\n# Export session data as zip to ~/Downloads\n${SESSION_RESOLVE}\n\necho \"Exporting session \\${session_id:0:8}...\"\nsisyphus admin export \"$session_id\" --cwd \"$cwd\"\necho \"\"\nread -n 1 -s -r -p \"Press a key to close.\"\n`;\n\nconst RESTART_AGENT_SCRIPT = `#!/bin/bash\n# Pick a sisyphus agent and restart it (fzf picker with confirm for running agents).\n# Assumes macOS (fzf optional). Requires \\`sisyphus status --json\\`.\n${SESSION_RESOLVE}\n\ncommand -v jq &>/dev/null || { echo \"jq required\"; sleep 1; exit 1; }\n\nagents_json=$(sisyphus status \"$session_id\" --json 2>/dev/null)\nif [ -z \"$agents_json\" ]; then\n echo \"Failed to read session status\"; sleep 1; exit 1\nfi\n\ndeclare -a entries=()\ndeclare -a ids=()\ndeclare -a statuses=()\nwhile IFS=$'\\\\t' read -r aid aname atype astatus; do\n [ -z \"$aid\" ] && continue\n entries+=(\"$aid $aname ($atype) — $astatus\")\n ids+=(\"$aid\")\n statuses+=(\"$astatus\")\ndone < <(echo \"$agents_json\" | jq -r '.agents[] | [.id, .name, .agentType, .status] | @tsv')\n\n(( \\${#entries[@]} == 0 )) && { echo \"No agents in session\"; sleep 1; exit 0; }\n\nif command -v fzf &>/dev/null; then\n idx=$(for (( i=0; i<\\${#entries[@]}; i++ )); do echo \"$i \\${entries[$i]}\"; done \\\\\n | fzf --reverse --height=100% --with-nth=2.. --prompt=\"Restart: \" | awk '{print $1}')\n [ -z \"$idx\" ] && exit 0\nelse\n for (( i=0; i<\\${#entries[@]}; i++ )); do\n printf \" %d) %s\\\\n\" $((i+1)) \"\\${entries[$i]}\"\n done\n printf \"\\\\nPick agent: \"\n read -r choice\n idx=$((choice - 1))\n (( idx >= 0 && idx < \\${#entries[@]} )) || exit 0\nfi\n\nif [ \"\\${statuses[$idx]}\" = \"running\" ]; then\n printf \"\\\\033[33mAgent is running. Restart anyway? (yes/no): \\\\033[0m\"\n read -r answer\n [ \"$answer\" = \"yes\" ] || exit 0\nfi\n\nsisyphus agent restart \"\\${ids[$idx]}\" --session \"$session_id\"\necho \"\"\nread -n 1 -s -r -p \"Press a key to close.\"\n`;\n\n// === Stage 2 script constants ===\n\nconst OPEN_GOAL_SCRIPT = `#!/bin/bash\n# Open goal.md for the current session in nvim.\n# Run from a sisyphus session pane, not the home dashboard.\n${SESSION_RESOLVE}\n\nfile=\"$cwd/.sisyphus/sessions/$session_id/goal.md\"\n[ ! -f \"$file\" ] && { tmux display-message \"No goal.md for this session\"; exit 0; }\nexec nvim \"$file\"\n`;\n\nconst OPEN_DIR_SCRIPT = `#!/bin/bash\n# Open session dir in Finder (macOS).\n# macOS-only — Linux/Windows port deferred.\n# Run from a sisyphus session pane, not the home dashboard.\n${SESSION_RESOLVE}\n\ndir=\"$cwd/.sisyphus/sessions/$session_id\"\n[ ! -d \"$dir\" ] && { tmux display-message \"Session dir not found: $dir\"; exit 0; }\nexec open \"$dir\"\n`;\n\nconst OPEN_LOGS_SCRIPT = `#!/bin/bash\n# Tail the newest cycle log for this session in a popup.\n# Run from a sisyphus session pane, not the home dashboard.\n${SESSION_RESOLVE}\n\nsession_dir=\"$cwd/.sisyphus/sessions/$session_id\"\ntarget=$(ls -t \"$session_dir/logs/\"cycle-*.md 2>/dev/null | head -1)\n[ -z \"$target\" ] && { tmux display-message \"No logs for this session yet\"; exit 0; }\nexec tail -n 500 -f \"$target\"\n`;\n\nconst RESUME_SESSION_SCRIPT = `#!/bin/bash\n# Resume a paused/completed session with optional follow-up instructions.\n# Run from a sisyphus session pane, not the home dashboard.\n${SESSION_RESOLVE}\n\nshort_id=\"\\${session_id:0:8}\"\n\n# Optional message — leave empty to resume with no extra instructions.\ntmpfile=$(mktemp /tmp/sisyphus-resume-XXXXXX.md)\ntrap 'rm -f \"$tmpfile\"' EXIT\nprintf \"# Resume session %s\\\\n# (Optional) Add follow-up instructions for the orchestrator below.\\\\n# Save & quit empty to resume with no message.\\\\n\\\\n\" \"$short_id\" > \"$tmpfile\"\nnvim \"$tmpfile\"\n\n# Strip comment + blank lines to detect empty submission\nbody=$(grep -v '^[[:space:]]*#' \"$tmpfile\" | sed '/^[[:space:]]*$/d')\n\nif [ -z \"$body\" ]; then\n exec sisyphus session resume \"$session_id\"\nelse\n exec sisyphus session resume \"$session_id\" \"$body\"\nfi\n`;\n\nconst ROLLBACK_SESSION_SCRIPT = `#!/bin/bash\n# Roll back session to a chosen cycle. Prompts inline.\n# Run from a sisyphus session pane, not the home dashboard.\n${SESSION_RESOLVE}\n\nshort_id=\"\\${session_id:0:8}\"\nprintf \"Rollback %s to cycle: \" \"$short_id\"\nread -r cycle_input\n\n# Validate: positive integer\ncase \"$cycle_input\" in\n ''|*[!0-9]*)\n echo \"Invalid cycle number\"\n read -n 1 -s -r -p \"Press a key to close.\"\n exit 0\n ;;\nesac\n\nif [ \"$cycle_input\" -lt 1 ]; then\n echo \"Cycle must be >= 1\"\n read -n 1 -s -r -p \"Press a key to close.\"\n exit 0\nfi\n\nsisyphus session rollback \"$session_id\" \"$cycle_input\"\necho \"\"\necho \"Rolled back to cycle $cycle_input — use [C-s S r] to resume.\"\nread -n 1 -s -r -p \"Press a key to close.\"\n`;\n\nconst GO_TO_WINDOW_SCRIPT = `#!/bin/bash\n# Switch to the sisyphus session's tmux window. If the window is dead,\n# fall back to opening the orchestrator's last claude --resume in a popup.\n# Run from a sisyphus session pane, not the home dashboard.\n${SESSION_RESOLVE}\n\ncommand -v jq &>/dev/null || { echo \"jq required\"; sleep 1; exit 1; }\n\n# Walk the manifest for the S-row whose tmux session has @sisyphus_session_id == ours.\n# Manifest format: type\\tname\\tcwd\\tphase\\tsessionId\nMANIFEST=\"$HOME/.sisyphus/sessions-manifest.tsv\"\n[ ! -f \"$MANIFEST\" ] && { tmux display-message \"No manifest\"; exit 0; }\n\ntarget_sid=\"\"\nwhile IFS=$'\\\\t' read -r type name scwd phase sid; do\n [[ \"$type\" == \"#\"* ]] && continue\n [ \"$type\" = \"S\" ] || continue\n [ \"$scwd\" = \"$cwd\" ] || continue\n ssid=$(tmux show-options -t \"$sid\" -v @sisyphus_session_id 2>/dev/null)\n if [ \"$ssid\" = \"$session_id\" ]; then\n target_sid=\"$sid\"\n break\n fi\ndone < \"$MANIFEST\"\n\nif [ -n \"$target_sid\" ] && tmux has-session -t \"$target_sid\" 2>/dev/null; then\n tmux switch-client -t \"$target_sid\"\n exit 0\nfi\n\n# Fallback: orchestrator window is gone. Open last claude session in a popup.\nstate=\"$cwd/.sisyphus/sessions/$session_id/state.json\"\n[ ! -f \"$state\" ] && { tmux display-message \"Window dead and no state.json — try sisyphus session resume\"; exit 0; }\n\nclaude_sid=$(jq -r '[.orchestratorCycles[].claudeSessionId] | last // empty' \"$state\")\n\nif [ -z \"$claude_sid\" ]; then\n tmux display-message \"No orchestrator claude session id found — try sisyphus session resume\"\n exit 0\nfi\n\n# Validate before passing to exec — value must be a safe session id.\n[[ \"$claude_sid\" =~ ^[A-Za-z0-9_-]+$ ]] || { tmux display-message \"Invalid claude session id\"; exit 1; }\n\nexec claude --resume \"$claude_sid\"\n`;\n\nconst SPAWN_AGENT_SCRIPT = `#!/bin/bash\n# Compose an instruction for a new agent and spawn it.\n# Run from a sisyphus session pane, not the home dashboard.\n${SESSION_RESOLVE}\n\ntmpfile=$(mktemp /tmp/sisyphus-spawn-XXXXXX.md)\ntrap 'rm -f \"$tmpfile\"' EXIT\nprintf \"# Spawn agent in session %s\\\\n# Write the agent's instruction below. Empty = abort.\\\\n\\\\n\" \"\\${session_id:0:8}\" > \"$tmpfile\"\nnvim \"$tmpfile\"\n\nbody=$(grep -v '^[[:space:]]*#' \"$tmpfile\" | sed '/^[[:space:]]*$/d')\n[ -z \"$body\" ] && exit 0\n\nexec sisyphus agent spawn --session \"$session_id\" --name \"agent\" --instruction \"$body\"\n`;\n\nconst SEARCH_REPORTS_SCRIPT = `#!/bin/bash\n# fzf over reports/*.md across all sessions for the current cwd.\n# Falls back to numbered list if fzf is missing.\n\n# Resolve cwd via tmux option (set by daemon) or fall back.\ntmux_sid=$(tmux display-message -p '#{session_id}')\ncwd=$(tmux show-options -t \"$tmux_sid\" -v @sisyphus_cwd 2>/dev/null)\n[ -z \"$cwd\" ] && cwd=$(tmux display-message -p '#{pane_current_path}')\n\nsessions_dir=\"$cwd/.sisyphus/sessions\"\n[ ! -d \"$sessions_dir\" ] && { tmux display-message \"No sessions in $cwd\"; exit 0; }\n\n# Find all report files. -path filter scopes to */reports/*.md inside any session.\nmapfile -t files < <(find \"$sessions_dir\" -type f -path '*/reports/*.md' 2>/dev/null | sort)\n(( \\${#files[@]} == 0 )) && { tmux display-message \"No reports yet in $cwd\"; exit 0; }\n\nif command -v fzf &>/dev/null; then\n picked=$(printf '%s\\\\n' \"\\${files[@]}\" \\\\\n | sed \"s|$sessions_dir/||\" \\\\\n | fzf --reverse --height=100% --prompt=\"Report: \" \\\\\n --preview 'f={}; cat -- \"'\"$sessions_dir\"'/$f\"' --preview-window=right:60%)\n [ -z \"$picked\" ] && exit 0\n exec nvim \"$sessions_dir/$picked\"\nelse\n for (( i=0; i<\\${#files[@]}; i++ )); do\n rel=\"\\${files[$i]#$sessions_dir/}\"\n printf \" %d) %s\\\\n\" $((i+1)) \"\\${rel}\"\n done\n printf \"\\\\nPick: \"\n read -r choice\n idx=$((choice - 1))\n (( idx >= 0 && idx < \\${#files[@]} )) || exit 0\n exec nvim \"\\${files[$idx]}\"\nfi\n`;\n\n// === end Stage 2 script constants ===\n\n// === Stage 3 script constants ===\n\nconst JUMP_TO_PANE_SCRIPT = `#!/bin/bash\n# Pick a sisyphus agent and jump to its tmux pane.\n# Assumes macOS (pbcopy, fzf optional). Requires \\`sisyphus status --json\\`.\n${SESSION_RESOLVE}\n\ncommand -v jq &>/dev/null || { echo \"jq required\"; sleep 1; exit 1; }\n\nagents_json=$(sisyphus status \"$session_id\" --json 2>/dev/null)\nif [ -z \"$agents_json\" ]; then\n echo \"Failed to read session status\"; sleep 1; exit 1\nfi\n\ndeclare -a entries=()\ndeclare -a ids=()\ndeclare -a panes=()\nwhile IFS=$'\\\\t' read -r aid aname atype astatus pid; do\n [ -z \"$aid\" ] && continue\n entries+=(\"$aid $aname ($atype) — $astatus\")\n ids+=(\"$aid\")\n panes+=(\"$pid\")\ndone < <(echo \"$agents_json\" | jq -r '.agents[] | [.id, .name, .agentType, .status, .paneId] | @tsv')\n\n(( \\${#entries[@]} == 0 )) && { echo \"No agents in session\"; sleep 1; exit 0; }\n\nif command -v fzf &>/dev/null; then\n idx=$(for (( i=0; i<\\${#entries[@]}; i++ )); do echo \"$i \\${entries[$i]}\"; done \\\\\n | fzf --reverse --height=100% --with-nth=2.. --prompt=\"Jump to: \" | awk '{print $1}')\n [ -z \"$idx\" ] && exit 0\nelse\n for (( i=0; i<\\${#entries[@]}; i++ )); do\n printf \" %d) %s\\\\n\" $((i+1)) \"\\${entries[$i]}\"\n done\n printf \"\\\\nPick agent: \"\n read -r choice\n idx=$((choice - 1))\n (( idx >= 0 && idx < \\${#entries[@]} )) || exit 0\nfi\n\ntarget_pane=\"\\${panes[$idx]}\"\n[ -z \"$target_pane\" ] && { echo \"Agent has no active pane\"; sleep 1; exit 1; }\ntarget_session=$(tmux display-message -p -t \"$target_pane\" '#{session_id}' 2>/dev/null)\ntarget_window=$(tmux display-message -p -t \"$target_pane\" '#{window_id}' 2>/dev/null)\n[ -n \"$target_session\" ] && tmux switch-client -t \"$target_session\"\n[ -n \"$target_window\" ] && tmux select-window -t \"$target_window\"\ntmux select-pane -t \"$target_pane\"\n`;\n\nconst MSG_AGENT_SCRIPT = `#!/bin/bash\n# Pick a sisyphus agent and send it a message via nvim.\n# Assumes macOS (fzf optional). Requires \\`sisyphus status --json\\` and \\`--agent\\` on message.\n${SESSION_RESOLVE}\n\ncommand -v jq &>/dev/null || { echo \"jq required\"; sleep 1; exit 1; }\n\nagents_json=$(sisyphus status \"$session_id\" --json 2>/dev/null)\nif [ -z \"$agents_json\" ]; then\n echo \"Failed to read session status\"; sleep 1; exit 1\nfi\n\ndeclare -a entries=()\ndeclare -a ids=()\nwhile IFS=$'\\\\t' read -r aid aname atype astatus; do\n [ -z \"$aid\" ] && continue\n entries+=(\"$aid $aname ($atype) — $astatus\")\n ids+=(\"$aid\")\ndone < <(echo \"$agents_json\" | jq -r '.agents[] | [.id, .name, .agentType, .status] | @tsv')\n\n(( \\${#entries[@]} == 0 )) && { echo \"No agents in session\"; sleep 1; exit 0; }\n\nif command -v fzf &>/dev/null; then\n idx=$(for (( i=0; i<\\${#entries[@]}; i++ )); do echo \"$i \\${entries[$i]}\"; done \\\\\n | fzf --reverse --height=100% --with-nth=2.. --prompt=\"Message agent: \" | awk '{print $1}')\n [ -z \"$idx\" ] && exit 0\nelse\n for (( i=0; i<\\${#entries[@]}; i++ )); do\n printf \" %d) %s\\\\n\" $((i+1)) \"\\${entries[$i]}\"\n done\n printf \"\\\\nPick agent: \"\n read -r choice\n idx=$((choice - 1))\n (( idx >= 0 && idx < \\${#entries[@]} )) || exit 0\nfi\n\ntmpfile=$(mktemp /tmp/sisyphus-msg-agent-XXXX.md)\ntrap 'rm -f \"$tmpfile\"' EXIT\nnvim \"$tmpfile\"\ngrep -q '[^[:space:]]' \"$tmpfile\" || exit 0\nexec sisyphus message --session \"$session_id\" --agent \"\\${ids[$idx]}\" \"$(cat \"$tmpfile\")\"\n`;\n\nconst RERUN_AGENT_SCRIPT = `#!/bin/bash\n# Pick a sisyphus agent and spawn a retry with its original instruction.\n# Assumes macOS (fzf optional). Requires \\`sisyphus status --json\\`.\n${SESSION_RESOLVE}\n\ncommand -v jq &>/dev/null || { echo \"jq required\"; sleep 1; exit 1; }\n\nagents_json=$(sisyphus status \"$session_id\" --json 2>/dev/null)\nif [ -z \"$agents_json\" ]; then\n echo \"Failed to read session status\"; sleep 1; exit 1\nfi\n\ndeclare -a entries=()\ndeclare -a ids=()\ndeclare -a atypes=()\ndeclare -a anames=()\ndeclare -a instrs=()\nwhile IFS=$'\\\\t' read -r aid aname atype astatus ainstr_b64; do\n [ -z \"$aid\" ] && continue\n entries+=(\"$aid $aname ($atype) — $astatus\")\n ids+=(\"$aid\")\n atypes+=(\"$atype\")\n anames+=(\"$aname\")\n instrs+=(\"$(echo \"$ainstr_b64\" | base64 -d)\")\ndone < <(echo \"$agents_json\" | jq -r '.agents[] | [.id, .name, .agentType, .status, (.instruction // \"\" | @base64)] | @tsv')\n\n(( \\${#entries[@]} == 0 )) && { echo \"No agents in session\"; sleep 1; exit 0; }\n\nif command -v fzf &>/dev/null; then\n idx=$(for (( i=0; i<\\${#entries[@]}; i++ )); do echo \"$i \\${entries[$i]}\"; done \\\\\n | fzf --reverse --height=100% --with-nth=2.. --prompt=\"Rerun: \" | awk '{print $1}')\n [ -z \"$idx\" ] && exit 0\nelse\n for (( i=0; i<\\${#entries[@]}; i++ )); do\n printf \" %d) %s\\\\n\" $((i+1)) \"\\${entries[$i]}\"\n done\n printf \"\\\\nPick agent: \"\n read -r choice\n idx=$((choice - 1))\n (( idx >= 0 && idx < \\${#entries[@]} )) || exit 0\nfi\n\ninstr=\"\\${instrs[$idx]}\"\nif [ \"\\${#instr}\" -lt 20 ]; then\n echo \"Original instruction is shorter than 20 chars — cannot rerun safely.\"\n read -n 1 -s -r -p \"Press a key to close.\"\n exit 1\nfi\n\nexec sisyphus agent spawn --session \"$session_id\" --agent-type \"\\${atypes[$idx]}\" --name \"\\${anames[$idx]}-retry-$(date +%s)\" --instruction \"$instr\"\n`;\n\nconst OPEN_CLAUDE_AGENT_SCRIPT = `#!/bin/bash\n# Pick a sisyphus agent or orchestrator cycle and resume its Claude session.\n# Assumes macOS (fzf optional). Requires \\`sisyphus status --json\\`.\n${SESSION_RESOLVE}\n\ncommand -v jq &>/dev/null || { echo \"jq required\"; sleep 1; exit 1; }\n\nstate=\"$cwd/.sisyphus/sessions/$session_id/state.json\"\n[ ! -f \"$state\" ] && { echo \"No state.json for this session\"; sleep 1; exit 1; }\n\nagents_json=$(sisyphus status \"$session_id\" --json 2>/dev/null)\nif [ -z \"$agents_json\" ]; then\n echo \"Failed to read session status\"; sleep 1; exit 1\nfi\n\ndeclare -a entries=()\ndeclare -a claudes=()\nwhile IFS=$'\\\\t' read -r rid rname rtype rcid; do\n [ -z \"$rid\" ] && continue\n entries+=(\"$rid $rname ($rtype)\")\n claudes+=(\"$rcid\")\ndone < <(echo \"$agents_json\" | jq -r '\n ((.agents // [])[] | [.id, .name, .agentType, (.claudeSessionId // \"\")] | @tsv),\n ((.orchestratorCycles // [])[] | [\"cycle-\" + (.cycle|tostring), \"orchestrator\", \"cycle\", (.claudeSessionId // \"\")] | @tsv)\n')\n\n(( \\${#entries[@]} == 0 )) && { echo \"No agents or cycles in session\"; sleep 1; exit 0; }\n\nif command -v fzf &>/dev/null; then\n idx=$(for (( i=0; i<\\${#entries[@]}; i++ )); do echo \"$i \\${entries[$i]}\"; done \\\\\n | fzf --reverse --height=100% --with-nth=2.. --prompt=\"Open Claude: \" | awk '{print $1}')\n [ -z \"$idx\" ] && exit 0\nelse\n for (( i=0; i<\\${#entries[@]}; i++ )); do\n printf \" %d) %s\\\\n\" $((i+1)) \"\\${entries[$i]}\"\n done\n printf \"\\\\nPick: \"\n read -r choice\n idx=$((choice - 1))\n (( idx >= 0 && idx < \\${#entries[@]} )) || exit 0\nfi\n\ncid=\"\\${claudes[$idx]}\"\n[ -z \"$cid\" ] && { echo \"No Claude session\"; sleep 1; exit 1; }\n[[ \"$cid\" =~ ^[A-Za-z0-9_-]+$ ]] || { echo \"Invalid claude session id\"; sleep 1; exit 1; }\ncd \"$cwd\" && exec claude --resume \"$cid\"\n`;\n\nconst TAIL_AGENT_LOGS_SCRIPT = `#!/bin/bash\n# Pick a sisyphus agent and view its tmux pane scrollback (last 2000 lines) in less.\n# Uses tmux capture-pane — no tail -f, no pipe-pane side effects.\n# Assumes macOS (fzf optional). Requires \\`sisyphus status --json\\`.\n${SESSION_RESOLVE}\n\ncommand -v jq &>/dev/null || { echo \"jq required\"; sleep 1; exit 1; }\n\nagents_json=$(sisyphus status \"$session_id\" --json 2>/dev/null)\nif [ -z \"$agents_json\" ]; then\n echo \"Failed to read session status\"; sleep 1; exit 1\nfi\n\ndeclare -a entries=()\ndeclare -a ids=()\ndeclare -a panes=()\nwhile IFS=$'\\\\t' read -r aid aname atype astatus pid; do\n [ -z \"$aid\" ] && continue\n entries+=(\"$aid $aname ($atype) — $astatus\")\n ids+=(\"$aid\")\n panes+=(\"$pid\")\ndone < <(echo \"$agents_json\" | jq -r '.agents[] | [.id, .name, .agentType, .status, .paneId] | @tsv')\n\n(( \\${#entries[@]} == 0 )) && { echo \"No agents in session\"; sleep 1; exit 0; }\n\nif command -v fzf &>/dev/null; then\n idx=$(for (( i=0; i<\\${#entries[@]}; i++ )); do echo \"$i \\${entries[$i]}\"; done \\\\\n | fzf --reverse --height=100% --with-nth=2.. --prompt=\"Tail logs: \" | awk '{print $1}')\n [ -z \"$idx\" ] && exit 0\nelse\n for (( i=0; i<\\${#entries[@]}; i++ )); do\n printf \" %d) %s\\\\n\" $((i+1)) \"\\${entries[$i]}\"\n done\n printf \"\\\\nPick agent: \"\n read -r choice\n idx=$((choice - 1))\n (( idx >= 0 && idx < \\${#entries[@]} )) || exit 0\nfi\n\ntarget_pane=\"\\${panes[$idx]}\"\n[ -z \"$target_pane\" ] && { echo \"Agent has no active pane\"; sleep 1; exit 1; }\ntmux capture-pane -t \"$target_pane\" -p -S -2000 | less +G\n`;\n\nconst KILL_AGENT_SCRIPT = `#!/bin/bash\n# Pick a sisyphus agent and kill it (with red confirmation prompt).\n# Assumes macOS (fzf optional). Requires \\`sisyphus status --json\\` and \\`sisyphus agent kill\\`.\n${SESSION_RESOLVE}\n\ncommand -v jq &>/dev/null || { echo \"jq required\"; sleep 1; exit 1; }\n\nagents_json=$(sisyphus status \"$session_id\" --json 2>/dev/null)\nif [ -z \"$agents_json\" ]; then\n echo \"Failed to read session status\"; sleep 1; exit 1\nfi\n\ndeclare -a entries=()\ndeclare -a ids=()\nwhile IFS=$'\\\\t' read -r aid aname atype astatus; do\n [ -z \"$aid\" ] && continue\n entries+=(\"$aid $aname ($atype) — $astatus\")\n ids+=(\"$aid\")\ndone < <(echo \"$agents_json\" | jq -r '.agents[] | [.id, .name, .agentType, .status] | @tsv')\n\n(( \\${#entries[@]} == 0 )) && { echo \"No agents in session\"; sleep 1; exit 0; }\n\nif command -v fzf &>/dev/null; then\n idx=$(for (( i=0; i<\\${#entries[@]}; i++ )); do echo \"$i \\${entries[$i]}\"; done \\\\\n | fzf --reverse --height=100% --with-nth=2.. --prompt=\"Kill agent: \" | awk '{print $1}')\n [ -z \"$idx\" ] && exit 0\nelse\n for (( i=0; i<\\${#entries[@]}; i++ )); do\n printf \" %d) %s\\\\n\" $((i+1)) \"\\${entries[$i]}\"\n done\n printf \"\\\\nPick agent: \"\n read -r choice\n idx=$((choice - 1))\n (( idx >= 0 && idx < \\${#entries[@]} )) || exit 0\nfi\n\nprintf '\\\\033[31mKill %s? (yes/no): \\\\033[0m' \"\\${ids[$idx]}\"\nread -r answer\n[ \"$answer\" = \"yes\" ] || exit 0\nsisyphus agent kill \"\\${ids[$idx]}\" --session \"$session_id\"\necho \"\"\nread -n 1 -s -r -p \"Press a key to close.\"\n`;\n\nconst COPY_AGENT_ID_SCRIPT = `#!/bin/bash\n# Pick a sisyphus agent and copy its ID to clipboard.\n# Assumes macOS (pbcopy, fzf optional). Requires \\`sisyphus status --json\\`.\n${SESSION_RESOLVE}\n\ncommand -v jq &>/dev/null || { echo \"jq required\"; sleep 1; exit 1; }\n\nagents_json=$(sisyphus status \"$session_id\" --json 2>/dev/null)\nif [ -z \"$agents_json\" ]; then\n echo \"Failed to read session status\"; sleep 1; exit 1\nfi\n\ndeclare -a entries=()\ndeclare -a ids=()\nwhile IFS=$'\\\\t' read -r aid aname atype astatus; do\n [ -z \"$aid\" ] && continue\n entries+=(\"$aid $aname ($atype) — $astatus\")\n ids+=(\"$aid\")\ndone < <(echo \"$agents_json\" | jq -r '.agents[] | [.id, .name, .agentType, .status] | @tsv')\n\n(( \\${#entries[@]} == 0 )) && { echo \"No agents in session\"; sleep 1; exit 0; }\n\nif command -v fzf &>/dev/null; then\n idx=$(for (( i=0; i<\\${#entries[@]}; i++ )); do echo \"$i \\${entries[$i]}\"; done \\\\\n | fzf --reverse --height=100% --with-nth=2.. --prompt=\"Copy agent ID: \" | awk '{print $1}')\n [ -z \"$idx\" ] && exit 0\nelse\n for (( i=0; i<\\${#entries[@]}; i++ )); do\n printf \" %d) %s\\\\n\" $((i+1)) \"\\${entries[$i]}\"\n done\n printf \"\\\\nPick agent: \"\n read -r choice\n idx=$((choice - 1))\n (( idx >= 0 && idx < \\${#entries[@]} )) || exit 0\nfi\n\naid=\"\\${ids[$idx]}\"\nprintf '%s' \"$aid\" | pbcopy\ntmux display-message \"Copied $aid\"\n`;\n\nconst COPY_LOGS_SCRIPT = `#!/bin/bash\n# Copy last 200 lines of the newest cycle log to clipboard.\n# Assumes macOS (pbcopy).\n${SESSION_RESOLVE}\n\ndir=\"$cwd/.sisyphus/sessions/$session_id/logs\"\n[ -d \"$dir\" ] || { tmux display-message \"No logs dir\"; exit 0; }\nlatest=$(ls -t \"$dir\"/cycle-*.md 2>/dev/null | head -1)\n[ -z \"$latest\" ] && { tmux display-message \"No cycle logs yet\"; exit 0; }\ntail -n 200 \"$latest\" | pbcopy\ntmux display-message \"Copied last 200 lines of $(basename \"$latest\")\"\n`;\n\nconst COPY_LATEST_REPORT_SCRIPT = `#!/bin/bash\n# Copy the newest report file to clipboard.\n# Assumes macOS (pbcopy).\n${SESSION_RESOLVE}\n\ndir=\"$cwd/.sisyphus/sessions/$session_id/reports\"\n[ -d \"$dir\" ] || { tmux display-message \"No reports dir\"; exit 0; }\nlatest=$(ls -t \"$dir\" 2>/dev/null | head -1)\n[ -z \"$latest\" ] && { tmux display-message \"No reports yet\"; exit 0; }\ncat \"$dir/$latest\" | pbcopy\ntmux display-message \"Copied $latest\"\n`;\n\nconst COPY_PATH_SCRIPT = `#!/bin/bash\n# Copy the session directory path to clipboard.\n# Assumes macOS (pbcopy).\n${SESSION_RESOLVE}\n\nprintf '%s' \"$cwd/.sisyphus/sessions/$session_id\" | pbcopy\ntmux display-message \"Copied session path\"\n`;\n\nconst COPY_ID_SCRIPT = `#!/bin/bash\n# Copy the session ID to clipboard.\n# Assumes macOS (pbcopy).\n${SESSION_RESOLVE}\n\nprintf '%s' \"$session_id\" | pbcopy\ntmux display-message \"Copied session ID\"\n`;\n\nconst COPY_CONTEXT_SCRIPT = `#!/bin/bash\n# Copy the session context XML to clipboard.\n# Assumes macOS (pbcopy). Requires \\`sisyphus session context\\`.\n${SESSION_RESOLVE}\n\nsisyphus session context \"$session_id\" --cwd \"$cwd\" | pbcopy\ntmux display-message \"Copied session context (XML)\"\n`;\n\nconst EDIT_CONTEXT_FILE_SCRIPT = `#!/bin/bash\n# Pick a context file for the current session and open it in nvim.\n# Excludes archive/ subdirectory. Assumes macOS (fzf optional).\n${SESSION_RESOLVE}\n\nctx_dir=\"$cwd/.sisyphus/sessions/$session_id/context\"\n[ -d \"$ctx_dir\" ] || { echo \"No context dir for this session\"; read -n 1 -s -r -p \"Press a key to close.\"; exit 0; }\n\nmapfile -t files < <(find \"$ctx_dir\" -type f -not -path '*/archive/*' | sort)\n(( \\${#files[@]} == 0 )) && { echo \"No context files yet\"; read -n 1 -s -r -p \"Press a key to close.\"; exit 0; }\n\nif command -v fzf &>/dev/null; then\n picked=$(printf '%s\\\\n' \"\\${files[@]}\" | sed \"s|$ctx_dir/||\" \\\\\n | fzf --reverse --height=100% --prompt=\"Context file: \")\n [ -z \"$picked\" ] && exit 0\nelse\n declare -a display_files=()\n for f in \"\\${files[@]}\"; do\n display_files+=(\"\\${f#$ctx_dir/}\")\n done\n for (( i=0; i<\\${#display_files[@]}; i++ )); do\n printf \" %d) %s\\\\n\" $((i+1)) \"\\${display_files[$i]}\"\n done\n printf \"\\\\nPick file: \"\n read -r choice\n idx=$((choice - 1))\n (( idx >= 0 && idx < \\${#display_files[@]} )) || exit 0\n picked=\"\\${display_files[$idx]}\"\nfi\n\nfile=\"$ctx_dir/$picked\"\nexec nvim \"$file\"\n`;\n\n// === end Stage 3 script constants ===\n\n// === Stage 4 script constants ===\n\nconst QUICK_SPAWN_EXPLORE_SCRIPT = `#!/bin/bash\n# Spawn an Explore agent with the macOS clipboard contents as the instruction.\n# macOS only — pbpaste hard dependency.\n${SESSION_RESOLVE}\n\nif ! command -v pbpaste >/dev/null 2>&1; then\n echo \"pbpaste not found — macOS only for now\"\n read -n 1 -s -r -p \"Press a key to close.\"\n exit 1\nfi\n\ninstruction=$(pbpaste)\nif [ -z \"\\${instruction// }\" ]; then\n echo \"Clipboard is empty — copy a task description first\"\n read -n 1 -s -r -p \"Press a key to close.\"\n exit 1\nfi\n\nif [ \"\\${#instruction}\" -lt 20 ]; then\n echo \"Clipboard text too short (\\${#instruction} chars; spawn requires 20+)\"\n read -n 1 -s -r -p \"Press a key to close.\"\n exit 1\nfi\n\nname=\"explore-$(date +%s)\"\nsisyphus agent spawn \\\\\n --agent-type sisyphus:explore \\\\\n --name \"$name\" \\\\\n --session \"$session_id\" \\\\\n --instruction \"$instruction\"\nexit_code=$?\n[ $exit_code -ne 0 ] && read -n 1 -s -r -p \"Press a key to close.\"\nexit $exit_code\n`;\n\nconst QUICK_SPAWN_DEBUG_SCRIPT = `#!/bin/bash\n# Spawn a Debug agent with the macOS clipboard contents as the instruction.\n# macOS only — pbpaste hard dependency.\n${SESSION_RESOLVE}\n\nif ! command -v pbpaste >/dev/null 2>&1; then\n echo \"pbpaste not found — macOS only for now\"\n read -n 1 -s -r -p \"Press a key to close.\"\n exit 1\nfi\n\ninstruction=$(pbpaste)\nif [ -z \"\\${instruction// }\" ]; then\n echo \"Clipboard is empty — copy a task description first\"\n read -n 1 -s -r -p \"Press a key to close.\"\n exit 1\nfi\n\nif [ \"\\${#instruction}\" -lt 20 ]; then\n echo \"Clipboard text too short (\\${#instruction} chars; spawn requires 20+)\"\n read -n 1 -s -r -p \"Press a key to close.\"\n exit 1\nfi\n\nname=\"debug-$(date +%s)\"\nsisyphus agent spawn \\\\\n --agent-type sisyphus:debug \\\\\n --name \"$name\" \\\\\n --session \"$session_id\" \\\\\n --instruction \"$instruction\"\nexit_code=$?\n[ $exit_code -ne 0 ] && read -n 1 -s -r -p \"Press a key to close.\"\nexit $exit_code\n`;\n\nconst OPEN_LATEST_REPORT_SCRIPT = `#!/bin/bash\n# Open the most-recently-modified file in the current session's reports/ in nvim.\n${SESSION_RESOLVE}\n\nreports_dir=\"$cwd/.sisyphus/sessions/$session_id/reports\"\nif [ ! -d \"$reports_dir\" ]; then\n echo \"No reports/ directory for this session\"\n read -n 1 -s -r -p \"Press a key to close.\"\n exit 0\nfi\n\nlatest=$(ls -t \"$reports_dir\"/*.md 2>/dev/null | head -1)\nif [ -z \"$latest\" ]; then\n echo \"No reports yet\"\n read -n 1 -s -r -p \"Press a key to close.\"\n exit 0\nfi\n\nexec nvim \"$latest\"\n`;\n\nconst CLONE_SESSION_SCRIPT = `#!/bin/bash\n# Clone the current session into a new independent session.\n# Orchestrator-only — the underlying CLI rejects calls from other panes/agents.\n${SESSION_RESOLVE}\n\nprintf \"Goal for cloned session: \"\nread -e goal\n[ -z \"\\${goal// }\" ] && exit 0\n\nprintf \"Optional name (blank to skip): \"\nread -e clone_name\n\nprintf \"Copy strategy.md? (y/N): \"\nread -r copy_strategy\n\nargs=()\n[ -n \"$clone_name\" ] && args+=(--name \"$clone_name\")\n[ \"$copy_strategy\" = \"y\" ] || [ \"$copy_strategy\" = \"Y\" ] && args+=(--strategy)\n\nsisyphus session clone \"\\${args[@]}\" \"$goal\"\nexit_code=$?\nread -n 1 -s -r -p \"Press a key to close.\"\nexit $exit_code\n`;\n\nconst HISTORY_SCRIPT = `#!/bin/bash\n# Show rich session detail (history command's per-session view) in a popup.\n${SESSION_RESOLVE}\nsisyphus admin history \"$session_id\" 2>&1 | less -R\n`;\n\nconst RECONNECT_SCRIPT = `#!/bin/bash\n# Reconnect daemon to an orphaned tmux session for the current cwd.\n${SESSION_RESOLVE}\nsisyphus session reconnect \"$session_id\"\nexit_code=$?\nread -n 1 -s -r -p \"Press a key to close.\"\nexit $exit_code\n`;\n\nconst OPEN_SCRATCH_SCRIPT = `#!/bin/bash\n# Open a standalone Claude scratch window in the home tmux session for this cwd.\n# scratch resolves the home session itself via @sisyphus_cwd; no session_id needed.\nexec sisyphus admin scratch\n`;\n\n// === end Stage 4 script constants ===\n\nfunction installScript(name: string, content: string): void {\n mkdirSync(join(globalDir(), 'bin'), { recursive: true });\n const path = scriptPath(name);\n writeFileSync(path, content, 'utf8');\n chmodSync(path, 0o755);\n}\n\nfunction installAllScripts(): void {\n // Existing scripts with real content\n installScript('sisyphus-cycle', CYCLE_SCRIPT);\n installScript('sisyphus-home', homeScript());\n installScript('sisyphus-kill-pane', KILL_PANE_SCRIPT);\n installScript('sisyphus-new', NEW_PROMPT_SCRIPT);\n installScript('sisyphus-msg', MESSAGE_SCRIPT);\n installScript('sisyphus-kill-session', KILL_SESSION_SCRIPT);\n installScript('sisyphus-delete-session', DELETE_SESSION_SCRIPT);\n installScript('sisyphus-status-popup', STATUS_POPUP_SCRIPT);\n installScript('sisyphus-pick-session', PICK_SESSION_SCRIPT);\n installScript('sisyphus-continue-session', CONTINUE_SESSION_SCRIPT);\n installScript('sisyphus-restart-agent-popup', RESTART_AGENT_SCRIPT);\n installScript('sisyphus-open-roadmap', OPEN_ROADMAP_SCRIPT);\n installScript('sisyphus-open-strategy', OPEN_STRATEGY_SCRIPT);\n installScript('sisyphus-export-session', EXPORT_SESSION_SCRIPT);\n\n // === Stage 1 (descriptor + generator + stub installs) ===\n const scriptsDir = join(globalDir(), 'bin');\n\n // Submenu dispatch scripts — one per submenu, generated from descriptor\n for (const [id, def] of Object.entries(KEYMAP.submenus)) {\n installScript(`sisyphus-menu-${id}`, generateSubmenuScript(id, def, scriptsDir));\n }\n // === end Stage 1 ===\n\n // === Stage 2 (tmux submenu scripts) ===\n installScript('sisyphus-open-goal', OPEN_GOAL_SCRIPT);\n installScript('sisyphus-open-dir', OPEN_DIR_SCRIPT);\n installScript('sisyphus-open-logs', OPEN_LOGS_SCRIPT);\n installScript('sisyphus-resume-session', RESUME_SESSION_SCRIPT);\n installScript('sisyphus-rollback-session', ROLLBACK_SESSION_SCRIPT);\n installScript('sisyphus-go-to-window', GO_TO_WINDOW_SCRIPT);\n installScript('sisyphus-spawn-agent', SPAWN_AGENT_SCRIPT);\n installScript('sisyphus-search-reports', SEARCH_REPORTS_SCRIPT);\n // === end Stage 2 ===\n\n // === Stage 3 (cursor pickers) ===\n installScript('sisyphus-jump-to-pane', JUMP_TO_PANE_SCRIPT);\n installScript('sisyphus-msg-agent', MSG_AGENT_SCRIPT);\n installScript('sisyphus-rerun-agent', RERUN_AGENT_SCRIPT);\n installScript('sisyphus-open-claude-agent', OPEN_CLAUDE_AGENT_SCRIPT);\n installScript('sisyphus-tail-agent-logs', TAIL_AGENT_LOGS_SCRIPT);\n installScript('sisyphus-kill-agent', KILL_AGENT_SCRIPT);\n installScript('sisyphus-copy-agent-id', COPY_AGENT_ID_SCRIPT);\n installScript('sisyphus-copy-logs', COPY_LOGS_SCRIPT);\n installScript('sisyphus-copy-latest-report', COPY_LATEST_REPORT_SCRIPT);\n installScript('sisyphus-copy-path', COPY_PATH_SCRIPT);\n installScript('sisyphus-copy-id', COPY_ID_SCRIPT);\n installScript('sisyphus-copy-context', COPY_CONTEXT_SCRIPT);\n installScript('sisyphus-edit-context-file', EDIT_CONTEXT_FILE_SCRIPT);\n // === end Stage 3 ===\n\n // === Stage 4 (creative additions) ===\n installScript('sisyphus-quick-spawn-explore', QUICK_SPAWN_EXPLORE_SCRIPT);\n installScript('sisyphus-quick-spawn-debug', QUICK_SPAWN_DEBUG_SCRIPT);\n installScript('sisyphus-open-latest-report', OPEN_LATEST_REPORT_SCRIPT);\n installScript('sisyphus-clone-session', CLONE_SESSION_SCRIPT);\n installScript('sisyphus-history', HISTORY_SCRIPT);\n installScript('sisyphus-reconnect', RECONNECT_SCRIPT);\n installScript('sisyphus-open-scratch', OPEN_SCRATCH_SCRIPT);\n // === end Stage 4 ===\n\n // === Stage 6 (help script override) ===\n installScript('sisyphus-help', HELP_SCRIPT);\n // === end Stage 6 ===\n}\n\nexport function getExistingBinding(key: string, table: string = 'root'): string | null {\n try {\n const output = execSync(`tmux list-keys -T ${table}`, { stdio: ['pipe', 'pipe', 'pipe'] }).toString();\n for (const line of output.split('\\n')) {\n if (line.includes(key)) {\n const parts = line.trim().split(/\\s+/);\n const keyIdx = parts.indexOf(key);\n if (keyIdx !== -1) {\n return line.trim();\n }\n }\n }\n return null;\n } catch {\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 | { status: 'unsupported-tmux'; message: string };\n\nexport function setupTmuxKeybind(cycleKey: string = DEFAULT_CYCLE_KEY, prefixKey: string = DEFAULT_PREFIX_KEY): SetupResult {\n installAllScripts();\n\n // Version check — hard requirement for display-menu flags used\n if (!tmuxVersionAtLeast(3, 2)) {\n let version = 'unknown';\n try { version = execSync('tmux -V', { stdio: ['pipe', 'pipe', 'pipe'] }).toString().trim(); } catch {}\n return {\n status: 'unsupported-tmux',\n message: `tmux 3.2+ required for sisyphus keybindings; got ${version}`,\n };\n }\n\n // Check for existing bindings before writing anything\n for (const [label, key] of [['cycle', cycleKey], ['prefix', prefixKey]] as const) {\n const existing = getExistingBinding(key);\n if (existing !== null && !isSisyphusBinding(existing)) {\n return {\n status: 'conflict',\n message: `Tmux key ${key} (${label}) is already bound to something else. Run \"sisyphus admin setup-keybind <key>\" to use a different key.`,\n existingBinding: existing,\n };\n }\n }\n\n writeKeymapJson();\n\n const scriptsDir = join(globalDir(), 'bin');\n const bindings = [\n // C-s → display-menu top-level (descriptor-driven)\n generateTopLevelBinding(prefixKey, KEYMAP.topLevel, scriptsDir),\n // M-s → cycle (unchanged)\n `bind-key -T root ${cycleKey} run-shell ${cycleScriptPath()}`,\n // smart-kill is reachable via the sisyphus prefix menu (C-s x) — see KEYMAP.topLevel.\n // We deliberately don't override `prefix x` so users keep their default tmux kill-pane.\n ];\n\n const confPath = sisyphusTmuxConfPath();\n writeFileSync(confPath, `${SISYPHUS_CONF_MARKER}\\n${bindings.join('\\n')}\\n`, 'utf8');\n\n // Append source line to tmux.conf if not already there\n const userConf = userTmuxConfPath();\n const markedSourceLine = `source-file ${confPath} ${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\n try {\n for (const b of bindings) {\n execSync(`tmux ${b}`, { stdio: 'pipe' });\n }\n } catch {\n // tmux not running\n }\n\n if (getExistingBinding(cycleKey) !== null && isSisyphusBinding(getExistingBinding(cycleKey)!)) {\n return {\n status: 'already-installed',\n message: `Tmux keybindings already configured: ${cycleKey} (cycle), ${prefixKey}+key (?=help for full list).`,\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: ${cycleKey} cycles, ${prefixKey}+key (?=help for full list)${persistNote}`,\n };\n}\n\nexport function removeTmuxKeybind(): void {\n const confPath = sisyphusTmuxConfPath();\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 if (existsSync(confPath)) {\n unlinkSync(confPath);\n }\n\n // Unbind live\n try {\n execSync(`tmux unbind-key -T root ${DEFAULT_CYCLE_KEY}`, { stdio: 'pipe' });\n execSync(`tmux unbind-key -T root ${DEFAULT_PREFIX_KEY}`, { stdio: 'pipe' });\n const output = execSync(`tmux list-keys -T ${KEY_TABLE}`, { stdio: ['pipe', 'pipe', 'pipe'] }).toString();\n for (const line of output.split('\\n')) {\n const parts = line.trim().split(/\\s+/);\n if (parts.length >= 4 && parts[2] === KEY_TABLE) {\n execSync(`tmux unbind-key -T ${KEY_TABLE} ${parts[3]}`, { stdio: 'pipe' });\n }\n }\n } catch {\n // tmux not running\n }\n\n // Remove keymap.json\n const kmPath = keymapJsonPath();\n if (existsSync(kmPath)) unlinkSync(kmPath);\n\n // Remove scripts\n const scripts = [\n 'sisyphus-cycle', 'sisyphus-home', 'sisyphus-kill-pane', 'sisyphus-new', 'sisyphus-msg',\n 'sisyphus-kill-session', 'sisyphus-delete-session', 'sisyphus-help', 'sisyphus-status-popup',\n 'sisyphus-pick-session', 'sisyphus-continue-session', 'sisyphus-restart-agent-popup',\n 'sisyphus-open-roadmap', 'sisyphus-open-strategy', 'sisyphus-export-session',\n // Stage 1: submenu dispatch scripts\n ...Object.keys(KEYMAP.submenus).map(id => `sisyphus-menu-${id}`),\n // Stage 1: new stub scripts\n 'sisyphus-copy-path', 'sisyphus-copy-id', 'sisyphus-copy-context',\n 'sisyphus-copy-logs', 'sisyphus-copy-latest-report', 'sisyphus-copy-agent-id',\n 'sisyphus-open-goal', 'sisyphus-open-dir', 'sisyphus-open-logs',\n 'sisyphus-open-latest-report', 'sisyphus-open-scratch', 'sisyphus-edit-context-file',\n 'sisyphus-spawn-agent', 'sisyphus-msg-agent', 'sisyphus-rerun-agent',\n 'sisyphus-jump-to-pane', 'sisyphus-open-claude-agent', 'sisyphus-tail-agent-logs',\n 'sisyphus-kill-agent', 'sisyphus-quick-spawn-explore', 'sisyphus-quick-spawn-debug',\n 'sisyphus-resume-session', 'sisyphus-rollback-session', 'sisyphus-go-to-window',\n 'sisyphus-clone-session', 'sisyphus-history', 'sisyphus-reconnect',\n 'sisyphus-search-reports',\n ];\n for (const name of scripts) {\n const path = scriptPath(name);\n if (existsSync(path)) unlinkSync(path);\n }\n}\n","import { execSync } from 'node:child_process';\nimport { loadConfig } from '../shared/config.js';\nimport { resolveInstalledPlugin } from '../daemon/plugins.js';\n\nexport interface SisyphusPluginInfo {\n installed: boolean;\n autoInstalled: boolean;\n installPath: string | null;\n}\n\nfunction exec(cmd: string): string {\n try {\n return execSync(cmd, { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();\n } catch {\n return '';\n }\n}\n\nfunction isMarketplaceInstalled(marketplace: string): boolean {\n const output = exec('claude plugins marketplace list');\n return output.includes(marketplace);\n}\n\nfunction installMarketplace(marketplace: string, owner = 'CaptainCrouton89'): void {\n console.log(`Adding marketplace: ${owner}/${marketplace}`);\n execSync(`claude plugins marketplace add ${owner}/${marketplace}`, { stdio: 'inherit' });\n}\n\nfunction installPlugin(key: string): void {\n console.log(`Installing plugin: ${key}`);\n execSync(`claude plugins install ${key} --scope user`, { stdio: 'inherit' });\n}\n\nconst SISYPHUS_PLUGIN_KEY = 'sisyphus@sisyphus';\nconst SISYPHUS_MARKETPLACE = 'sisyphus';\nconst SISYPHUS_OWNER = 'crouton-labs';\n\n/**\n * Ensures the user-facing sisyphus plugin (slash commands: /sisyphus:begin,\n * /sisyphus:autopsy, /sisyphus:configure-upload) is installed in the user's\n * Claude Code workspace. Adds the marketplace if needed.\n */\nexport function ensureSisyphusPluginInstalled(): SisyphusPluginInfo {\n const existing = resolveInstalledPlugin(SISYPHUS_PLUGIN_KEY);\n if (existing) {\n return { installed: true, autoInstalled: false, installPath: existing };\n }\n\n try {\n if (!isMarketplaceInstalled(SISYPHUS_MARKETPLACE)) {\n installMarketplace(SISYPHUS_MARKETPLACE, SISYPHUS_OWNER);\n }\n installPlugin(SISYPHUS_PLUGIN_KEY);\n } catch (err) {\n console.warn(`Warning: failed to install ${SISYPHUS_PLUGIN_KEY} — ${(err as Error).message}`);\n return { installed: false, autoInstalled: false, installPath: null };\n }\n\n const installPath = resolveInstalledPlugin(SISYPHUS_PLUGIN_KEY);\n return { installed: installPath !== null, autoInstalled: installPath !== null, installPath };\n}\n\nexport async function ensureRequiredPlugins(cwd: string): Promise<void> {\n const config = loadConfig(cwd);\n const required = config.requiredPlugins;\n if (!required || required.length === 0) return;\n\n for (const plugin of required) {\n const key = `${plugin.name}@${plugin.marketplace}`;\n const existing = resolveInstalledPlugin(key);\n if (existing) continue;\n\n console.log(`Required plugin ${key} not found — installing...`);\n\n if (!isMarketplaceInstalled(plugin.marketplace)) {\n installMarketplace(plugin.marketplace);\n }\n\n installPlugin(key);\n\n // Verify\n const verified = resolveInstalledPlugin(key);\n if (verified) {\n console.log(`Installed ${key} → ${verified}`);\n } else {\n console.warn(`Warning: failed to verify ${key} installation`);\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, timeoutMs = 10_000): Promise<Response> {\n return sharedRawSend(request, timeoutMs);\n}\n\nexport async function sendRequest(request: Request, timeoutMs?: number): 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, timeoutMs);\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 admin 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/**\n * Current tmux session's $N id and name. Always prefer the id for `-t` targeting\n * — tmux -t <name> silently substring-matches other sessions under sparse env.\n */\nexport function getTmuxSessionInfo(): { id: string; name: string } {\n assertTmux();\n const out = execSync('tmux display-message -p \"#{session_id}|#{session_name}\"', { encoding: 'utf8' }).trim();\n const pipeIdx = out.indexOf('|');\n return { id: out.slice(0, pipeIdx), name: out.slice(pipeIdx + 1) };\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 * Opens the dashboard in a new tmux window (for background use, e.g. from `start`).\n *\n * Tracks the window by its tmux window ID stored in the @sisyphus_dashboard\n * session option — not by window name, which is fragile (renames, collisions).\n * The \"; exit\" suffix closes the window when the TUI exits.\n *\n * Returns true if a new dashboard was created, false if an existing one was focused.\n */\nexport function openDashboardWindow(tmuxSession: string, cwd: string): boolean {\n // Check for existing dashboard by stored window ID\n try {\n const storedId = execSync(\n `tmux show-option -t ${shellQuote(tmuxSession)} -v @sisyphus_dashboard`,\n { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] },\n ).trim();\n\n if (storedId) {\n try {\n execSync(\n `tmux display-message -t ${shellQuote(storedId)} -p \"#{window_id}\"`,\n { stdio: 'pipe' },\n );\n execSync(`tmux select-window -t ${shellQuote(storedId)}`, { stdio: 'pipe' });\n return false;\n } catch {\n // Window is gone — fall through to create a new one\n }\n }\n } catch {\n // Option not set — fall through to create\n }\n\n const tuiPath = join(import.meta.dirname, 'tui.js');\n\n const windowId = execSync(\n `tmux new-window -t ${shellQuote(tmuxSession + ':')} -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)}; exit`;\n execSync(\n `tmux send-keys -t ${shellQuote(windowId)} ${shellQuote(cmd)} Enter`,\n );\n\n execSync(\n `tmux set-option -t ${shellQuote(tmuxSession)} @sisyphus_dashboard ${shellQuote(windowId)}`,\n { stdio: 'pipe' },\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 tuiPath = join(import.meta.dirname, 'tui.js');\n execSync(`node ${shellQuote(tuiPath)} --cwd ${shellQuote(process.cwd())}`, {\n stdio: 'inherit',\n });\n });\n}\n","import { execSync } from 'node:child_process';\nimport { existsSync, 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, cycleLogPath } 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, verbose: boolean): 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 (verbose && agent.instruction) {\n const truncated = agent.instruction.length > 200 ? agent.instruction.slice(0, 200) + '...' : agent.instruction;\n line += `\\n ${DIM}Instruction: ${truncated}${RESET}`;\n }\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 readRoadmap(cwd: string, sessionId: string): string | null {\n try {\n return readFileSync(roadmapPath(cwd, sessionId), 'utf8');\n } catch {\n return null;\n }\n}\n\nfunction readCycleLog(cwd: string, sessionId: string, cycle: number): string | null {\n try {\n const path = cycleLogPath(cwd, sessionId, cycle);\n if (!existsSync(path)) return null;\n return readFileSync(path, 'utf8');\n } catch {\n return null;\n }\n}\n\nfunction capturePaneOutput(paneId: string, lines: number = 50): string | null {\n try {\n return execSync(\n `tmux capture-pane -t \"${paneId}\" -p -S -${lines}`,\n { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] },\n ).trimEnd();\n } catch {\n return null;\n }\n}\n\nfunction printSession(session: Session, verbose: boolean): 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 const effortLabel = session.effort != null ? session.effort : 'high (default)';\n console.log(` Effort: ${effortLabel}`);\n console.log(` Task: ${session.task}`);\n if (session.context) {\n const truncated = !verbose && 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 if (verbose && agent.instruction) {\n const truncated = agent.instruction.length > 200 ? agent.instruction.slice(0, 200) + '...' : agent.instruction;\n console.log(` ${DIM}Instruction: ${truncated}${RESET}`);\n }\n }\n }\n\n // Roadmap\n const roadmap = readRoadmap(session.cwd, session.id);\n if (roadmap) {\n console.log(`\\n${BOLD}Roadmap:${RESET}`);\n console.log(roadmap);\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 // Verbose: show cycle log\n if (verbose) {\n const log = readCycleLog(session.cwd, session.id, cycles[i].cycle);\n if (log) {\n const lines = log.split('\\n');\n const preview = lines.slice(0, 20).join('\\n');\n console.log(` ${DIM}--- cycle log ---${RESET}`);\n for (const line of preview.split('\\n')) {\n console.log(` ${DIM}${line}${RESET}`);\n }\n if (lines.length > 20) {\n console.log(` ${DIM}... (${lines.length - 20} more lines)${RESET}`);\n }\n }\n }\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, verbose));\n }\n }\n\n // Verbose: capture live pane output\n if (verbose) {\n // Orchestrator pane (from last running cycle)\n const lastCycle = session.orchestratorCycles[session.orchestratorCycles.length - 1];\n if (lastCycle && !lastCycle.completedAt && lastCycle.paneId) {\n const output = capturePaneOutput(lastCycle.paneId);\n if (output) {\n console.log(`\\n<orchestrator-pane-output lines=\"50\">`);\n console.log(output);\n console.log(`</orchestrator-pane-output>`);\n }\n }\n\n // Running agent panes\n for (const agent of runningAgents) {\n if (agent.paneId) {\n const output = capturePaneOutput(agent.paneId, 30);\n if (output) {\n console.log(`\\n<agent-pane-output agent=\"${agent.id}\" name=\"${agent.name}\" lines=\"30\">`);\n console.log(output);\n console.log(`</agent-pane-output>`);\n }\n }\n }\n }\n\n // Completion report\n if (verbose && session.completionReport) {\n console.log(`\\n${BOLD}Completion Report:${RESET}`);\n console.log(session.completionReport);\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 .option('-v, --verbose', 'Show detailed output (roadmap, pane output, agent instructions)')\n .option('-j, --json', 'Output raw JSON instead of formatted text')\n .action(async (sessionIdArg?: string, opts?: { verbose?: boolean; json?: boolean }) => {\n const sessionId = sessionIdArg ?? process.env.SISYPHUS_SESSION_ID;\n const verbose = opts?.verbose ?? false;\n const json = opts?.json ?? false;\n const cwd = process.env['SISYPHUS_CWD'] ?? process.cwd();\n\n const request: Request = { type: 'status', sessionId, cwd };\n const response = await sendRequest(request);\n if (response.ok) {\n const session = response.data?.session as Session | undefined;\n if (session) {\n if (json) {\n console.log(JSON.stringify(session));\n } else {\n printSession(session, verbose);\n }\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 { readFileSync } from 'node:fs';\nimport type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport type { MessageSource } from '../../shared/types.js';\n\ninterface TellOptions {\n session?: string;\n // Commander exposes `--no-submit` as `opts.submit`, defaulting to true.\n submit?: boolean;\n textFromStdin?: boolean;\n}\n\nconst ORCH_ALIASES = new Set(['orchestrator', 'orch', 'o']);\n\nfunction parseTarget(raw: string): { kind: 'orchestrator' } | { kind: 'agent'; agentId: string } | null {\n if (ORCH_ALIASES.has(raw)) return { kind: 'orchestrator' };\n if (/^agent-\\d+$/i.test(raw)) return { kind: 'agent', agentId: raw };\n return null;\n}\n\nfunction readStdin(): string {\n // Synchronous read of all stdin. Same pattern as other CLI commands that take piped input.\n return readFileSync(0, 'utf-8');\n}\n\nexport function registerTell(program: Command): void {\n program\n .command('tell <target> [text]')\n .description('Type a prompt directly into a running pane (orchestrator or agent-NNN). Submits immediately unlike `message`.')\n .option('--session <sessionId>', 'Session ID (defaults to SISYPHUS_SESSION_ID)')\n .option('--no-submit', 'Paste text but do not press Enter (caller can review/submit manually)')\n .option('--text-from-stdin', 'Read prompt body from stdin instead of the [text] argument (avoids shell escaping)')\n .action(async (targetRaw: string, textArg: string | undefined, opts: TellOptions) => {\n const sessionId = opts.session ?? process.env.SISYPHUS_SESSION_ID;\n if (!sessionId) {\n console.error('Error: provide --session or set SISYPHUS_SESSION_ID');\n process.exit(1);\n }\n\n const target = parseTarget(targetRaw);\n if (!target) {\n console.error(`Error: target must be 'orchestrator' (or 'o'/'orch') or 'agent-NNN', got: ${targetRaw}`);\n process.exit(1);\n }\n\n let text: string;\n if (opts.textFromStdin) {\n text = readStdin();\n if (text === '') {\n console.error('Error: --text-from-stdin set but stdin was empty');\n process.exit(1);\n }\n } else {\n if (textArg == null || textArg === '') {\n console.error('Error: provide [text] argument or use --text-from-stdin');\n process.exit(1);\n }\n text = textArg;\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 submit = opts.submit !== false;\n const request: Request = {\n type: 'tell',\n sessionId,\n target,\n text,\n submit,\n ...(source ? { source } : {}),\n };\n const response = await sendRequest(request);\n if (response.ok) {\n console.log(`Sent to ${targetRaw}${submit ? '' : ' (not submitted)'}`);\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport type { Session, OrchestratorCycle } from '../../shared/types.js';\n\ninterface ReadOptions {\n session?: string;\n cycle?: string;\n tail?: string;\n head?: string;\n raw?: boolean;\n summary?: boolean;\n toolDetail?: boolean;\n}\n\nconst ORCH_ALIASES = new Set(['orchestrator', 'orch', 'o']);\nconst TURN_TYPES = new Set(['user', 'assistant']);\n\ninterface JsonlEntry {\n type?: string;\n timestamp?: string;\n message?: { role?: string; content?: unknown };\n}\n\ninterface ContentBlock {\n type?: string;\n text?: string;\n thinking?: string;\n name?: string;\n input?: unknown;\n content?: unknown;\n}\n\nfunction projectDirFromCwd(cwd: string): string {\n // Claude Code project encoding: cwd with `/` → `-`. Leading `/` becomes leading `-`.\n return cwd.replace(/\\//g, '-');\n}\n\nfunction transcriptPath(cwd: string, claudeSessionId: string): string {\n return join(homedir(), '.claude', 'projects', projectDirFromCwd(cwd), `${claudeSessionId}.jsonl`);\n}\n\nfunction truncate(s: string, max: number): string {\n if (s.length <= max) return s;\n return s.slice(0, max) + `… (${s.length - max} more chars)`;\n}\n\nfunction formatBlocks(content: unknown, toolDetail: boolean): string {\n if (typeof content === 'string') return content;\n if (!Array.isArray(content)) return JSON.stringify(content);\n const parts: string[] = [];\n for (const block of content as ContentBlock[]) {\n switch (block.type) {\n case 'text':\n parts.push(block.text ?? '');\n break;\n case 'thinking':\n parts.push(`[thinking]\\n${block.thinking ?? ''}`);\n break;\n case 'tool_use': {\n const inputStr = JSON.stringify(block.input ?? {});\n parts.push(`[tool_use: ${block.name}] ${toolDetail ? inputStr : truncate(inputStr, 400)}`);\n break;\n }\n case 'tool_result': {\n const c = typeof block.content === 'string' ? block.content : JSON.stringify(block.content ?? '');\n parts.push(`[tool_result]\\n${toolDetail ? c : truncate(c, 600)}`);\n break;\n }\n default:\n parts.push(`[${block.type ?? 'unknown'}] ${truncate(JSON.stringify(block), 200)}`);\n }\n }\n return parts.join('\\n');\n}\n\nfunction summaryLine(entry: JsonlEntry): string {\n const role = (entry.type ?? '?').toUpperCase().padEnd(9);\n const ts = (entry.timestamp ?? '').slice(11, 19);\n const content = entry.message?.content;\n let preview = '';\n if (typeof content === 'string') {\n preview = content.replace(/\\s+/g, ' ').slice(0, 120);\n } else if (Array.isArray(content)) {\n const blocks = content as ContentBlock[];\n const first = blocks[0];\n if (!first) preview = '(empty)';\n else if (first.type === 'text') preview = (first.text ?? '').replace(/\\s+/g, ' ').slice(0, 120);\n else if (first.type === 'thinking') preview = `[thinking] ${(first.thinking ?? '').replace(/\\s+/g, ' ').slice(0, 100)}`;\n else if (first.type === 'tool_use') preview = `[${first.name}] ${truncate(JSON.stringify(first.input ?? {}), 100)}`;\n else if (first.type === 'tool_result') {\n const c = typeof first.content === 'string' ? first.content : JSON.stringify(first.content ?? '');\n preview = `[tool_result] ${c.replace(/\\s+/g, ' ').slice(0, 100)}`;\n } else preview = `[${first.type ?? '?'}]`;\n if (blocks.length > 1) preview += ` (+${blocks.length - 1} more block${blocks.length - 1 > 1 ? 's' : ''})`;\n }\n return `${role} ${ts} ${preview}`;\n}\n\nexport function registerRead(program: Command): void {\n program\n .command('read <target>')\n .description(\"Print the Claude conversation transcript for a target ('orchestrator' or 'agent-NNN').\")\n .option('--session <sessionId>', 'Session ID (defaults to SISYPHUS_SESSION_ID)')\n .option('--cycle <n>', 'Orchestrator cycle number (default: most recent live, else last completed)')\n .option('--tail <n>', 'Show last N turns', undefined)\n .option('--head <n>', 'Show first N turns', undefined)\n .option('--raw', 'Print raw JSONL (no formatting, no filtering)')\n .option('--summary', 'One-line-per-turn summary instead of full content')\n .option('--tool-detail', 'Include full tool inputs/outputs (default: truncated to 400/600 chars)')\n .action(async (targetRaw: string, opts: ReadOptions) => {\n const sessionId = opts.session ?? process.env.SISYPHUS_SESSION_ID;\n if (!sessionId) {\n console.error('Error: provide --session or set SISYPHUS_SESSION_ID');\n process.exit(1);\n }\n\n const response = await sendRequest({ type: 'status', sessionId, cwd: process.cwd() } as Request);\n if (!response.ok) {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n const session = (response.data as { session?: Session })?.session;\n if (!session) {\n console.error('Error: status response did not include session');\n process.exit(1);\n }\n\n let claudeSessionId: string | undefined;\n let label: string;\n if (ORCH_ALIASES.has(targetRaw)) {\n let cycle: OrchestratorCycle | undefined;\n if (opts.cycle) {\n const n = parseInt(opts.cycle, 10);\n if (!Number.isFinite(n)) {\n console.error(`Error: --cycle must be a number, got: ${opts.cycle}`);\n process.exit(1);\n }\n cycle = session.orchestratorCycles.find(c => c.cycle === n);\n if (!cycle) {\n console.error(`Error: orchestrator cycle ${n} not found in session`);\n process.exit(1);\n }\n } else {\n cycle = [...session.orchestratorCycles].reverse().find(c => !c.completedAt) ?? session.orchestratorCycles.at(-1);\n }\n if (!cycle) {\n console.error('Error: no orchestrator cycles found');\n process.exit(1);\n }\n claudeSessionId = cycle.claudeSessionId;\n label = `orchestrator cycle ${cycle.cycle}${cycle.completedAt ? ' (completed)' : ' (live)'}`;\n } else if (/^agent-\\d+$/i.test(targetRaw)) {\n const ag = session.agents.find(a => a.id === targetRaw);\n if (!ag) {\n console.error(`Error: agent ${targetRaw} not found in session ${sessionId}`);\n process.exit(1);\n }\n claudeSessionId = ag.claudeSessionId;\n label = `agent ${ag.id} — ${ag.name} (${ag.status})`;\n } else {\n console.error(`Error: target must be 'orchestrator' (or 'o'/'orch') or 'agent-NNN', got: ${targetRaw}`);\n process.exit(1);\n }\n\n if (!claudeSessionId) {\n console.error(`Error: no claudeSessionId stored for ${label} — transcript may not exist yet`);\n process.exit(1);\n }\n\n const path = transcriptPath(session.cwd, claudeSessionId);\n if (!existsSync(path)) {\n console.error(`Error: transcript not found at ${path}`);\n process.exit(1);\n }\n\n const raw = readFileSync(path, 'utf-8');\n\n if (opts.raw) {\n process.stdout.write(raw);\n return;\n }\n\n const allEntries: JsonlEntry[] = raw\n .split('\\n')\n .filter(Boolean)\n .map(line => { try { return JSON.parse(line) as JsonlEntry; } catch { return null; } })\n .filter((e): e is JsonlEntry => e !== null);\n\n let entries = allEntries.filter(e => e.type && TURN_TYPES.has(e.type));\n\n const totalTurns = entries.length;\n const head = opts.head ? parseInt(opts.head, 10) : undefined;\n const tail = opts.tail ? parseInt(opts.tail, 10) : undefined;\n let sliceNote = '';\n if (head && Number.isFinite(head)) {\n entries = entries.slice(0, head);\n sliceNote = `first ${head} of ${totalTurns}`;\n }\n if (tail && Number.isFinite(tail)) {\n entries = entries.slice(-tail);\n sliceNote = sliceNote ? `${sliceNote}, then last ${tail}` : `last ${tail} of ${totalTurns}`;\n }\n\n console.log(`=== ${label} — ${entries.length} turn(s)${sliceNote ? ` (${sliceNote})` : ''} ===`);\n console.log(`transcript: ${path}\\n`);\n\n if (opts.summary) {\n for (const e of entries) console.log(summaryLine(e));\n return;\n }\n\n for (const e of entries) {\n const role = (e.type ?? '?').toUpperCase();\n const ts = e.timestamp ?? '';\n const body = formatBlocks(e.message?.content, opts.toolDetail ?? false);\n console.log(`──── ${role} ${ts} ────`);\n console.log(body);\n console.log('');\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 .option('--agent <agentId>', 'Route message to a specific agent inbox instead of the orchestrator')\n .action(async (content: string, opts: { session?: string; agent?: 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, ...(opts.agent ? { agentId: opts.agent } : {}) };\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 { existsSync, readFileSync, watchFile, unwatchFile } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport { ulid } from 'ulid';\nimport { parseDeck } from '../../shared/ask-schema.js';\nimport { createAsk, readMeta, updateMeta, writeDecisions } from '../../daemon/ask-store.js';\nimport { emitHistoryEvent } from '../../daemon/history.js';\nimport { askOutputPath, statePath } from '../../shared/paths.js';\nimport * as state from '../../daemon/state.js';\nimport { ORCHESTRATOR_ASKED_BY } from '../../shared/types.js';\nimport type { AskOutput, AskStatus } from '../../shared/types.js';\nimport { execSafe } from '../../shared/exec.js';\nimport { shellQuote } from '../../shared/shell.js';\n\nconst ULID_RE = /^[0-9A-HJKMNP-TV-Z]{26}$/;\n\nfunction validateAskId(askId: string): void {\n if (!ULID_RE.test(askId)) {\n console.error(`Error: invalid askId format: ${askId}`);\n process.exit(1);\n }\n}\n\nexport function registerAsk(program: Command): void {\n const ask = program\n .command('ask')\n .description('Submit a structured question deck for the user to answer (blocks until answered)')\n .argument('[file]', 'Path to deck JSON (omit for poll/peek subcommands)')\n .option('--session <id>', 'Session id (defaults to SISYPHUS_SESSION_ID)')\n .addHelpText('after', `\nPosts a deck of questions to the user's dashboard inbox. They walk through it and you read the structured JSON back from stdout.\n\nThe CLI always blocks until the user answers (which can take 10+ minutes).\n\n- **Orchestrator:** invoke synchronously so the orchestrator's pane stays alive while the bash blocks. Daemon refuses \\`sisyphus orch yield\\` while orchestrator owns a pending deck; foreground is the supported pattern.\n- **Agents / one-off Claude Code sessions:** invoke through the Bash tool with \\`run_in_background: true\\` and end your turn — the bash completion notification wakes you with stdout ready to parse.\n\nFor guidance on when to use a deck, how to design options the user can actually choose between, and how to bundle related questions into one deck, read the \\`humanloop\\` skill before authoring.\n\nDeck JSON: an object with \\`interactions: [{ id, title, options, kind?, allowFreetext?, body? | bodyPath?, ... }]\\`. Validation errors at submit are precise — trust them.\n`)\n .action(async (file: string | undefined, opts: { session?: string }) => {\n if (!file) {\n ask.help();\n return;\n }\n await submit(file, opts);\n });\n\n ask\n .command('poll <askId>')\n .description('Block until <askId> is answered, then print output JSON')\n .option('--session <id>', 'Session id (defaults to SISYPHUS_SESSION_ID)')\n .action(async (askId: string, opts: { session?: string }) => poll(askId, opts));\n\n ask\n .command('peek <askId>')\n .description('Print {askId, status, completedAt?, output?} for <askId> without blocking')\n .option('--session <id>', 'Session id (defaults to SISYPHUS_SESSION_ID)')\n .action(async (askId: string, opts: { session?: string }) => peek(askId, opts));\n}\n\nfunction mintAskId(): string {\n return ulid();\n}\n\nfunction resolveClaudeSessionId(cwd: string, sessionId: string, askedBy: string): string | undefined {\n if (!existsSync(statePath(cwd, sessionId))) return undefined;\n const session = state.getSession(cwd, sessionId);\n if (askedBy === ORCHESTRATOR_ASKED_BY) {\n const last = session.orchestratorCycles[session.orchestratorCycles.length - 1];\n return last?.claudeSessionId;\n }\n return session.agents.find(a => a.id === askedBy)?.claudeSessionId;\n}\n\nfunction resolveSessionEnv(opts: { session?: string }): { cwd: string; sessionId: string } {\n const sessionId = opts.session ?? process.env.SISYPHUS_SESSION_ID;\n const cwd = process.env.SISYPHUS_CWD ?? process.cwd();\n if (!sessionId) {\n console.error('Error: provide --session or set SISYPHUS_SESSION_ID');\n process.exit(1);\n }\n return { cwd, sessionId };\n}\n\n/**\n * Idempotently mark an ask answered: stamp meta.completedAt, emit `ask-answered`,\n * and credit `userBlockedMs` on the session/cycle if the ask was blocking.\n * Re-entrant: the `meta.completedAt` check ensures only the first observer credits the wait.\n */\nasync function markAnswered(cwd: string, sessionId: string, askId: string): Promise<void> {\n const meta = readMeta(cwd, sessionId, askId);\n if (!meta || meta.completedAt) return;\n\n const completedAt = new Date().toISOString();\n const durationMs = new Date(completedAt).getTime() - new Date(meta.askedAt).getTime();\n\n try {\n await updateMeta(cwd, sessionId, askId, { status: 'answered', completedAt });\n } catch {\n // updateMeta throws if the meta file vanished mid-flight; treat as best-effort.\n return;\n }\n\n emitHistoryEvent(sessionId, 'ask-answered', {\n askId,\n askedBy: meta.askedBy,\n blocking: meta.blocking,\n durationMs,\n askedAt: meta.askedAt,\n completedAt,\n });\n\n if (meta.blocking && durationMs > 0) {\n try {\n if (existsSync(statePath(cwd, sessionId))) {\n await state.incrementUserBlockedMs(cwd, sessionId, durationMs, meta.askedAt, meta.askedBy);\n }\n } catch {\n // State increment is best-effort — history event is the source of truth for autopsy.\n }\n }\n}\n\nfunction waitForOutput(cwd: string, sessionId: string, askId: string, initialPpid?: number): Promise<AskOutput> {\n const outputPath = askOutputPath(cwd, sessionId, askId);\n\n if (existsSync(outputPath)) {\n return Promise.resolve(JSON.parse(readFileSync(outputPath, 'utf-8')) as AskOutput);\n }\n\n return new Promise((res, _rej) => {\n let ppidWatcher: ReturnType<typeof setInterval> | undefined;\n\n const cleanup = () => {\n unwatchFile(outputPath, onChange);\n if (ppidWatcher !== undefined) clearInterval(ppidWatcher);\n process.removeListener('SIGINT', onSigint);\n };\n\n const onChange = () => {\n if (!existsSync(outputPath)) return;\n try {\n const out = JSON.parse(readFileSync(outputPath, 'utf-8')) as AskOutput;\n cleanup();\n res(out);\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'ENOENT' || err instanceof SyntaxError) {\n // File disappeared mid-read or atomic rename not yet complete — next tick will retry\n return;\n }\n throw err;\n }\n };\n watchFile(outputPath, { interval: 250 }, onChange);\n\n if (initialPpid !== undefined && initialPpid !== 1) {\n ppidWatcher = setInterval(() => {\n if (process.ppid !== initialPpid || process.ppid === 1) {\n cleanup();\n process.exit(0);\n }\n }, 250);\n }\n\n const onSigint = () => {\n cleanup();\n process.exit(130);\n };\n process.once('SIGINT', onSigint);\n });\n}\n\n/**\n * Spawn a tmux pane next to the caller showing the deck so the user can answer\n * inline without leaving the agent's pane. The dashboard inbox remains a valid\n * second surface — both write through the same on-disk ask-store paths.\n *\n * No-op outside tmux, when the user opts out, or if the split fails (the\n * dashboard is still a valid answering surface, so we never want to break the\n * ask itself for a UX nicety).\n */\nfunction maybeSpawnAskPane(cwd: string, sessionId: string, askId: string): void {\n const callerPane = process.env.TMUX_PANE;\n if (!callerPane) return;\n if (process.env.SISYPHUS_DISABLE_ASK_PANE === '1') return;\n\n const tuiPath = join(import.meta.dirname, 'tui.js');\n const cmd = `node ${shellQuote(tuiPath)} --cwd ${shellQuote(cwd)} --session-id ${shellQuote(sessionId)} --ask ${shellQuote(askId)}`;\n\n // -d: don't auto-focus the new pane (caller stays focused)\n // -h: horizontal split (new pane sits to the right)\n // -t: target the caller's pane so the split is adjacent\n execSafe(`tmux split-window -d -h -t ${shellQuote(callerPane)} -c ${shellQuote(cwd)} ${shellQuote(cmd)}`);\n}\n\nasync function submit(file: string, opts: { session?: string }): Promise<void> {\n const { cwd, sessionId } = resolveSessionEnv(opts);\n const askedBy = process.env.SISYPHUS_AGENT_ID ?? ORCHESTRATOR_ASKED_BY;\n\n const deckPath = resolve(file);\n if (!existsSync(deckPath)) {\n console.error(`Error: deck file not found: ${deckPath}`);\n process.exit(1);\n }\n\n let decisions;\n try {\n decisions = parseDeck(deckPath);\n } catch (err) {\n console.error(`Error: ${(err as Error).message}`);\n process.exit(1);\n }\n\n const initialPpid = process.ppid;\n const claudeSessionId = resolveClaudeSessionId(cwd, sessionId, askedBy);\n const askId = mintAskId();\n\n const q0 = decisions.interactions[0];\n createAsk(cwd, sessionId, {\n askId,\n askedBy,\n blocking: true,\n pid: process.pid,\n claudeSessionId,\n cwd,\n title: decisions.title !== undefined ? decisions.title : q0?.title,\n subtitle: q0?.subtitle,\n kind: q0?.kind,\n });\n writeDecisions(cwd, sessionId, askId, decisions);\n\n maybeSpawnAskPane(cwd, sessionId, askId);\n\n const output = await waitForOutput(cwd, sessionId, askId, initialPpid);\n await markAnswered(cwd, sessionId, askId);\n process.stdout.write(JSON.stringify(output) + '\\n');\n}\n\nasync function poll(askId: string, opts: { session?: string }): Promise<void> {\n validateAskId(askId);\n const { cwd, sessionId } = resolveSessionEnv(opts);\n const meta = readMeta(cwd, sessionId, askId);\n if (!meta) {\n console.error(`Error: askId not found: ${askId}`);\n process.exit(1);\n }\n const output = await waitForOutput(cwd, sessionId, askId);\n await markAnswered(cwd, sessionId, askId);\n process.stdout.write(JSON.stringify(output) + '\\n');\n}\n\nasync function peek(askId: string, opts: { session?: string }): Promise<void> {\n validateAskId(askId);\n const { cwd, sessionId } = resolveSessionEnv(opts);\n const meta = readMeta(cwd, sessionId, askId);\n if (!meta) {\n process.stdout.write(JSON.stringify({ askId, status: 'not-found' satisfies AskStatus }) + '\\n');\n return;\n }\n const outputPath = askOutputPath(cwd, sessionId, askId);\n const result: { askId: string; status: AskStatus; completedAt?: string; output?: AskOutput } = {\n askId,\n status: meta.status,\n };\n if (meta.completedAt) result.completedAt = meta.completedAt;\n try {\n if (existsSync(outputPath)) {\n result.output = JSON.parse(readFileSync(outputPath, 'utf-8')) as AskOutput;\n }\n } catch (err) {\n if (!(err instanceof SyntaxError)) throw err;\n // output.json mid-write (atomic rename in progress); leave output key absent\n }\n process.stdout.write(JSON.stringify(result) + '\\n');\n}\n","import { spawnSync } from 'node:child_process';\nimport { existsSync, lstatSync, readFileSync, realpathSync } from 'node:fs';\nimport { dirname, resolve, sep } from 'node:path';\nimport { z } from 'zod';\nimport type { Deck } from './types.js';\n\n// ── zod v4 building blocks ────────────────────────────────────────────────────\n// v4 notes: .nonempty() → .min(1); error messages use {error: 'string'} per check.\n\nexport const interactionOptionSchema = z.object({\n id: z.string().min(1),\n label: z.string().min(1),\n description: z.string().optional(),\n shortcut: z.string().optional(),\n});\n\nconst interactionSchema = z.object({\n id: z.string().regex(/^[A-Za-z0-9_-]+$/, { error: 'interaction id must match /^[A-Za-z0-9_-]+$/' }).min(1).max(64),\n title: z.string().min(1, { error: 'title must be non-empty' }),\n subtitle: z.string().min(1, { error: 'subtitle must be non-empty when present' }).optional(),\n body: z.string().optional(),\n bodyPath: z.string().optional(),\n options: z.array(interactionOptionSchema),\n allowFreetext: z.boolean().optional(),\n freetextLabel: z.string().optional(),\n kind: z.enum(['notify', 'validation', 'decision', 'context', 'error']).optional(),\n});\n\nconst deckSourceSchema = z.object({\n sessionName: z.string().optional(),\n askedBy: z.string().optional(),\n blockedSince: z.string().optional(),\n});\n\nexport const deckSchema = z.object({\n title: z.string().optional(),\n source: deckSourceSchema.optional(),\n interactions: z.array(interactionSchema).min(1, { error: 'interactions[] must be non-empty' }),\n}).superRefine((input, ctx) => {\n const seen = new Map<string, number>();\n for (let i = 0; i < input.interactions.length; i++) {\n const interaction = input.interactions[i];\n if (interaction.body !== undefined && interaction.bodyPath !== undefined) {\n ctx.addIssue({\n code: 'custom',\n message: 'body and bodyPath are mutually exclusive',\n path: ['interactions', i],\n });\n }\n const prev = seen.get(interaction.id);\n if (prev !== undefined) {\n ctx.addIssue({\n code: 'custom',\n message: `duplicate interaction id \"${interaction.id}\" at indices ${prev} and ${i}`,\n path: ['interactions', i, 'id'],\n });\n }\n seen.set(interaction.id, i);\n }\n});\n\n// ── termrender invocation ─────────────────────────────────────────────────────\nfunction runTermrenderCheck(content: string): { ok: true } | { ok: false; error: string } {\n const result = spawnSync('termrender', ['--check'], {\n input: content,\n encoding: 'utf-8',\n timeout: 5000,\n });\n if (result.error) {\n return { ok: false, error: `termrender invocation failed: ${result.error.message}` };\n }\n if (result.status !== 0) {\n return { ok: false, error: `termrender --check exited ${result.status}: ${result.stderr.trim()}` };\n }\n return { ok: true };\n}\n\n// ── C2 bodyPath defense + inlining ────────────────────────────────────────────\nfunction inlineBodyPath(deckPath: string, bodyPath: string): string {\n const deckDir = dirname(deckPath);\n const joined = resolve(deckDir, bodyPath);\n\n // STEP 1: existence + lstat BEFORE realpath to catch symlinks and directories.\n if (!existsSync(joined)) {\n throw new Error(`bodyPath does not exist: ${bodyPath}`);\n }\n const stat = lstatSync(joined);\n if (!stat.isFile()) {\n // Catches symlinks, directories, FIFOs — lstat does not follow symlinks.\n throw new Error(`bodyPath must be a regular file: ${bodyPath}`);\n }\n\n // STEP 2: realpath both sides, prefix-check (defense-in-depth for .. traversal).\n // realpathSync is safe here: lstat already confirmed the path exists.\n const realResolved = realpathSync(joined);\n const realDeckDir = realpathSync(deckDir);\n const prefix = realDeckDir + sep;\n if (realResolved !== realDeckDir && !realResolved.startsWith(prefix)) {\n throw new Error(`bodyPath escapes deck directory (outside): ${bodyPath}`);\n }\n\n // STEP 3: read. lstat confirmed regular file; realpath confirmed in-tree.\n return readFileSync(joined, 'utf-8');\n}\n\n// ── public entry point ────────────────────────────────────────────────────────\nexport function parseDeck(deckPath: string): Deck {\n const raw = readFileSync(deckPath, 'utf-8');\n let json: unknown;\n try {\n json = JSON.parse(raw);\n } catch {\n throw new Error('deck is not valid JSON');\n }\n\n const parsed = deckSchema.parse(json);\n\n const inlinedInteractions = parsed.interactions.map(interaction => {\n let body = interaction.body;\n if (interaction.bodyPath !== undefined) {\n body = inlineBodyPath(deckPath, interaction.bodyPath);\n }\n if (body !== undefined) {\n const check = runTermrenderCheck(body);\n if (!check.ok) {\n throw new Error(check.error);\n }\n }\n // Drop bodyPath from persisted decisions.json (recipe §1.8).\n const { bodyPath: _drop, ...rest } = interaction;\n return body !== undefined ? { ...rest, body } : { ...rest };\n });\n\n return { ...parsed, interactions: inlinedInteractions };\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 { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\n\nexport function registerDelete(program: Command): void {\n program\n .command('delete <sessionId>')\n .description('Delete a session and all its data')\n .option('--cwd <path>', 'Project directory', process.env.SISYPHUS_CWD || process.cwd())\n .action(async (sessionId: string, opts: { cwd: string }) => {\n const request: Request = { type: 'delete', sessionId, cwd: opts.cwd };\n const response = await sendRequest(request);\n if (response.ok) {\n console.log(`Session ${sessionId} deleted.`);\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';\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 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 session 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';\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 session 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 registerReconnect(program: Command): void {\n program\n .command('reconnect')\n .description('Reconnect daemon to an orphaned tmux session (no state change, no orchestrator spawn)')\n .argument('<session-id>', 'Session ID to reconnect')\n .action(async (sessionId: string) => {\n const cwd = process.env['SISYPHUS_CWD'] ?? process.cwd();\n const request: Request = { type: 'reconnect', sessionId, cwd };\n const response = await sendRequest(request);\n if (response.ok) {\n const tmuxSessionName = response.data?.tmuxSessionName as string;\n const tmuxWindowId = response.data?.tmuxWindowId as string;\n console.log(`Reconnected to ${tmuxSessionName} (window ${tmuxWindowId})`);\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 registerClone(program: Command): void {\n program\n .command('clone')\n .description('Clone the current session into a new independent session with a different goal')\n .argument('<goal>', 'Goal for the cloned session')\n .option('-c, --context <text>', 'Additional context for the clone')\n .option('--strategy', 'Copy strategy.md from the source session')\n .option('-n, --name <name>', 'Name for the cloned session')\n .action(async (goal: string, opts: { context?: string; strategy?: boolean; name?: string }) => {\n assertTmux();\n\n const sessionId = process.env.SISYPHUS_SESSION_ID;\n if (!sessionId) {\n console.error('Error: SISYPHUS_SESSION_ID not set. Run this from an orchestrator or agent pane.');\n process.exit(1);\n }\n\n const agentId = process.env.SISYPHUS_AGENT_ID;\n if (agentId !== 'orchestrator') {\n console.error('Error: clone can only be called by the orchestrator. Use sisyphus message to ask the orchestrator to clone.');\n process.exit(1);\n }\n\n const request: Request = {\n type: 'clone',\n sessionId,\n goal,\n context: opts.context,\n name: opts.name,\n strategy: opts.strategy,\n };\n\n const response = await sendRequest(request);\n if (response.ok) {\n const data = response.data as { sessionId: string; tmuxSessionName: string };\n console.log('Session cloned successfully.');\n console.log(` Clone: ${data.sessionId}`);\n console.log(` Tmux: ${data.tmuxSessionName}`);\n console.log('');\n console.log(`The cloned session now owns: \"${goal}\"`);\n console.log('This is the other session\\'s responsibility. You do not need to monitor it.');\n console.log('');\n console.log('Update your scope:');\n console.log('- Remove cloned work from goal.md');\n console.log('- Update roadmap.md to reflect reduced scope');\n console.log('- Update strategy.md if approach changes');\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 registerSessionTask(program: Command): void {\n program\n .command('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\nconst VALID_TIERS = ['low', 'medium', 'high', 'xhigh'] as const;\ntype EffortTier = typeof VALID_TIERS[number];\n\nexport function registerSessionEffort(program: Command): void {\n program\n .command('effort <sessionId> <tier>')\n .description('Set the pipeline effort tier for a session (future cycles only; running agents keep their original prompt)')\n .action(async (sessionId: string, tier: string) => {\n if (!VALID_TIERS.includes(tier as EffortTier)) {\n console.error(`Error: tier must be one of: ${VALID_TIERS.join(', ')}`);\n process.exit(1);\n }\n\n const request: Request = { type: 'set-effort', sessionId, effort: tier as EffortTier };\n const response = await sendRequest(request);\n if (response.ok) {\n console.log(`Effort tier set to '${tier}' for session ${sessionId}`);\n console.log('Note: Future cycles only — running agents keep their original prompt.');\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport type { Session } from '../../shared/types.js';\nimport { buildSessionContext } from '../../tui/lib/context.js';\n\nexport function registerSessionContext(program: Command): void {\n program\n .command('context <sessionId>')\n .description('Print session context XML (same as dashboard space y C)')\n .requiredOption('--cwd <path>', 'Working directory of the session')\n .action(async (sessionId: string, opts: { cwd: string }) => {\n const request: Request = { type: 'status', sessionId, cwd: opts.cwd };\n const response = await sendRequest(request);\n if (!response.ok) {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n const session = response.data?.session as Session | undefined;\n if (!session) {\n console.error('Error: Session not found');\n process.exit(1);\n }\n process.stdout.write(buildSessionContext(session, opts.cwd));\n });\n}\n","import type { Command } from 'commander';\nimport { existsSync } from 'node:fs';\nimport { join, resolve } 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';\nimport { discoverAgentTypes } from '../../daemon/frontmatter.js';\n\nfunction listTypes(): void {\n const cwd = process.env['SISYPHUS_CWD'] ?? process.cwd();\n const pluginDir = resolve(import.meta.dirname, '..', 'templates', 'agent-plugin');\n const types = discoverAgentTypes(pluginDir, cwd);\n\n if (types.length === 0) {\n console.log('No agent types found.');\n return;\n }\n\n const maxName = Math.max(...types.map(t => t.qualifiedName.length), 4);\n const maxSource = Math.max(...types.map(t => t.source.length), 6);\n\n console.log(`${'TYPE'.padEnd(maxName)} ${'SOURCE'.padEnd(maxSource)} DESCRIPTION`);\n for (const t of types) {\n const desc = t.description ?? '';\n console.log(`${t.qualifiedName.padEnd(maxName)} ${t.source.padEnd(maxSource)} ${desc}`);\n }\n}\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 type (e.g. sisyphus:debug, sisyphus:explore)', 'worker')\n .option('--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 .option('--list-types', 'List available agent types and exit')\n .action(async (positionalInstruction: string | undefined, opts: { agentType: string; name?: string; instruction?: string; repo?: string; session?: string; listTypes?: boolean }) => {\n if (opts.listTypes) {\n listTypes();\n return;\n }\n\n if (!opts.name) {\n console.error('Error: required option --name <name> not specified');\n process.exit(1);\n }\n\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 positional = positionalInstruction === '-' ? undefined : positionalInstruction;\n const instruction = opts.instruction ?? positional ?? await readStdin();\n if (!instruction) {\n console.error('Error: --instruction is required (or pipe via stdin)');\n process.exit(1);\n }\n if (instruction.trim().length < 20) {\n console.error(`Error: instruction too short (${instruction.trim().length} chars). Did you mean to pipe via stdin? Use '-' as the positional or omit it entirely.`);\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(`Tip: \\`sisyphus agent await ${agentId}\\` blocks for the report and consumes it inline (won't appear in next cycle).`);\n console.log(\"Run `sisyphus orch 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 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 { existsSync, readFileSync } from 'node:fs';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport { assertTmux } from '../tmux.js';\n\n// Daemon-side handleAwait blocks until the agent reaches a terminal status.\n// Use a long socket timeout so realistic agent runtimes don't trip the default 10s.\nconst AWAIT_TIMEOUT_MS = 24 * 60 * 60 * 1000;\n\nexport function registerAwait(program: Command): void {\n program\n .command('await')\n .description('Block until an agent reaches a terminal status, then print its final report inline. Marks the agent as consumed-inline so its report is suppressed from the next cycle.')\n .argument('<agentId>', 'Agent ID to await')\n .option('--session <sessionId>', 'Session ID (defaults to SISYPHUS_SESSION_ID env var)')\n .action(async (agentId: string, 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: 'await', sessionId, agentId };\n const response = await sendRequest(request, AWAIT_TIMEOUT_MS);\n if (!response.ok) {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n\n const data = response.data ?? {};\n const status = data.status as string;\n const reportPath = data.reportPath as string | null;\n const agentName = data.agentName as string;\n const agentType = data.agentType as string;\n\n const shortType = agentType && agentType !== 'worker' ? agentType.replace(/^sisyphus:/, '') : '';\n const label = shortType ? `${shortType}-${agentName}` : agentName;\n console.log(`[${status}] ${agentId} (${label})`);\n if (reportPath && existsSync(reportPath)) {\n try {\n const body = readFileSync(reportPath, 'utf-8');\n if (body.length > 0) {\n // Avoid double newline: file usually ends with \\n already.\n process.stdout.write(body.endsWith('\\n') ? body : body + '\\n');\n }\n } catch (err) {\n console.error(`Warning: could not read report at ${reportPath}: ${err instanceof Error ? err.message : err}`);\n }\n }\n });\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\n\nexport function registerAgentKill(program: Command): void {\n program\n .command('kill <agentId>')\n .description('Kill a running agent')\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: 'kill-agent', sessionId, agentId };\n const response = await sendRequest(request);\n if (response.ok) {\n console.log(`Agent ${agentId} killed.`);\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 registerAgentRestart(program: Command): void {\n program\n .command('restart <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 { 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>', 'Short orienting nudge for the next cycle (or pipe via stdin) — name what just happened; leave tactical decisions to the fresh read of the reports')\n .option('--mode <mode>', 'System prompt mode for next cycle (discovery, planning, implementation, validation, completion)')\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';\n\nexport function registerSegmentRegister(program: Command): void {\n program\n .command('register')\n .description('Register or update an external status bar segment')\n .requiredOption('--id <id>', 'Segment identifier')\n .requiredOption('--side <side>', 'Side to render on: left or right')\n .requiredOption('--priority <n>', 'Priority (lower = further from center)', parseInt)\n .requiredOption('--bg <color>', 'Background hex color (e.g. #2d2f33)')\n .requiredOption('--content <content>', 'tmux format string content')\n .action(async (opts: { id: string; side: string; priority: number; bg: string; content: string }) => {\n if (opts.side !== 'left' && opts.side !== 'right') {\n console.error('Error: --side must be \"left\" or \"right\"');\n process.exit(1);\n }\n const request: Request = {\n type: 'register-segment',\n id: opts.id,\n side: opts.side as 'left' | 'right',\n priority: opts.priority,\n bg: opts.bg,\n content: opts.content,\n };\n const response = await sendRequest(request);\n if (response.ok) {\n console.log(`Segment '${opts.id}' registered.`);\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 registerSegmentUnregister(program: Command): void {\n program\n .command('unregister')\n .description('Remove an external status bar segment')\n .requiredOption('--id <id>', 'Segment identifier to remove')\n .action(async (opts: { id: string }) => {\n const request: Request = { type: 'unregister-segment', id: opts.id };\n const response = await sendRequest(request);\n if (response.ok) {\n console.log(`Segment '${opts.id}' unregistered.`);\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\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_CYCLE_KEY, DEFAULT_PREFIX_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 // Session bar\n console.log(' \\u2713 Status bar: daemon-rendered via @sisyphus_status');\n console.log(' Add to status-right: #{@sisyphus_status}');\n\n // Sisyphus user plugin (slash commands: /sisyphus:begin, /sisyphus:autopsy, /sisyphus:configure-upload)\n if (result.sisyphusPlugin.installed && result.sisyphusPlugin.installPath) {\n const suffix = result.sisyphusPlugin.autoInstalled ? ' (just installed)' : '';\n console.log(` \\u2713 sisyphus@sisyphus plugin: ${result.sisyphusPlugin.installPath}${suffix}`);\n } else {\n console.log(' \\u2717 sisyphus@sisyphus plugin: Failed to install (needs `claude` CLI)');\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 if (result.nvim.baleiaInstalled) {\n console.log(' \\u2713 ANSI colors: baleia.nvim plugin configured (auto-detects escape codes)');\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 admin 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_CYCLE_KEY} cycle, ${DEFAULT_PREFIX_KEY} prefix (h=dashboard, x=kill)`;\n } else {\n keybindMsg = keybindResult.message;\n }\n\n printResults(result, daemonOk, keybindMsg);\n });\n}\n","import { execSync } from 'node:child_process';\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { ensureSisyphusPluginInstalled, type SisyphusPluginInfo } from './plugins.js';\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 baleiaInstalled: boolean;\n}\n\nexport interface TermrenderInfo {\n installed: boolean;\n autoInstalled: boolean;\n}\n\nexport interface OnboardResult {\n tmuxInstalled: boolean;\n tmuxAutoInstalled: boolean;\n terminal: TerminalInfo;\n itermOptionKey: ItermOptionKeyResult;\n tmuxDefaultsWritten: boolean;\n nvim: NvimInfo;\n sisyphusPlugin: SisyphusPluginInfo;\n termrender: TermrenderInfo;\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# --- Pane navigation (no prefix needed) ---\nbind -n C-h select-pane -L\nbind -n C-j select-pane -D\nbind -n C-k select-pane -U\nbind -n C-l select-pane -R\n\n# --- Window navigation (no prefix needed) ---\nbind -n C-n next-window\nbind -n C-p previous-window\n\n# --- New window / splits preserve cwd ---\nbind c new-window -c \"#{pane_current_path}\"\nbind '\"' split-window -v -c \"#{pane_current_path}\"\nbind % split-window -h -c \"#{pane_current_path}\"\n\n# --- Kill pane + rebalance ---\nbind x kill-pane \\\\; select-layout even-horizontal\n\n# --- Auto-rebalance on pane close ---\nset-hook -g after-kill-pane \"select-layout even-horizontal\"\nset-hook -g pane-exited \"select-layout even-horizontal\"\n\n# --- Manual re-tile ---\nbind = select-layout even-horizontal\n\n# --- Scroll (no prefix needed) ---\nbind -n C-u copy-mode \\\\; send-keys -X halfpage-up\nbind -n C-d copy-mode \\\\; send-keys -X halfpage-down\n\n# --- Vi copy mode ---\nsetw -g mode-keys vi\nbind -T copy-mode-vi v send-keys -X begin-selection\nbind -T copy-mode-vi y send-keys -X copy-selection-and-cancel\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\nfunction bundledBaleiaPluginPath(): string {\n const distDir = dirname(fileURLToPath(import.meta.url));\n return join(distDir, 'templates', 'baleia.lua');\n}\n\nfunction installBaleiaPlugin(): boolean {\n const pluginsDir = join(homedir(), '.config', 'nvim', 'lua', 'plugins');\n if (!existsSync(pluginsDir)) return false;\n\n const dest = join(pluginsDir, 'sisyphus-baleia.lua');\n if (existsSync(dest)) return true; // already installed\n\n const src = bundledBaleiaPluginPath();\n if (!existsSync(src)) return false;\n\n try {\n writeFileSync(dest, readFileSync(src, 'utf-8'), 'utf8');\n return true;\n } catch {\n return false;\n }\n}\n\nexport function tryAutoInstallNvim(): NvimInfo {\n if (isNvimAvailable()) {\n const baleiaInstalled = installBaleiaPlugin();\n return { installed: true, autoInstalled: false, version: getNvimVersion(), lazyVimInstalled: hasLazyVimConfig(), baleiaInstalled };\n }\n if (!isBrewAvailable()) {\n return { installed: false, autoInstalled: false, version: '', lazyVimInstalled: false, baleiaInstalled: 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, baleiaInstalled: false };\n }\n if (!isNvimAvailable()) {\n return { installed: false, autoInstalled: false, version: '', lazyVimInstalled: false, baleiaInstalled: 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 const baleiaInstalled = installBaleiaPlugin();\n return { installed: true, autoInstalled: true, version: getNvimVersion(), lazyVimInstalled, baleiaInstalled };\n}\n\nexport function isTermrenderAvailable(): boolean {\n try {\n execSync('which termrender', { stdio: 'pipe' });\n return true;\n } catch {\n return false;\n }\n}\n\nfunction isPipxAvailable(): boolean {\n try {\n execSync('which pipx', { stdio: 'pipe' });\n return true;\n } catch {\n return false;\n }\n}\n\nfunction isPipAvailable(): boolean {\n try {\n execSync('which pip3', { stdio: 'pipe' });\n return true;\n } catch {\n try {\n execSync('which pip', { stdio: 'pipe' });\n return true;\n } catch {\n return false;\n }\n }\n}\n\nfunction tryAutoInstallTermrender(): TermrenderInfo {\n if (isTermrenderAvailable()) {\n return { installed: true, autoInstalled: false };\n }\n // Prefer pipx (isolated install), fall back to pip\n if (isPipxAvailable()) {\n try {\n console.log(' Installing termrender via pipx...');\n execSync('pipx install termrender', { stdio: 'inherit' });\n if (isTermrenderAvailable()) return { installed: true, autoInstalled: true };\n } catch { /* fall through */ }\n }\n if (isPipAvailable()) {\n try {\n console.log(' Installing termrender via pip...');\n const pip = (() => { try { execSync('which pip3', { stdio: 'pipe' }); return 'pip3'; } catch { return 'pip'; } })();\n execSync(`${pip} install termrender`, { stdio: 'inherit' });\n if (isTermrenderAvailable()) return { installed: true, autoInstalled: true };\n } catch { /* fall through */ }\n }\n return { installed: false, autoInstalled: false };\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 // User-facing slash commands ship as a Claude Code plugin from the\n // `sisyphus@sisyphus` marketplace. Best-effort: failures warn but don't abort setup.\n const sisyphusPlugin = ensureSisyphusPluginInstalled();\n\n // termrender (markdown rendering for TUI)\n const termrender = tryAutoInstallTermrender();\n\n return { tmuxInstalled, tmuxAutoInstalled, terminal, itermOptionKey, tmuxDefaultsWritten, nvim, sisyphusPlugin, termrender };\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 // termrender\n if (result.termrender.autoInstalled) {\n lines.push(' \\u2713 termrender installed (markdown rendering for TUI).', '');\n } else if (!result.termrender.installed) {\n lines.push(\n ' \\u26a0 termrender not installed (rich markdown rendering unavailable).',\n ' Install: pipx install termrender (or: pip install termrender)',\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 { DEFAULT_CYCLE_KEY, setupTmuxKeybind } from '../tmux-setup.js';\n\nexport function registerSetupKeybind(program: Command): void {\n program\n .command('setup-keybind [cycle-key]')\n .description('Install sisyphus tmux keybindings (default: M-s cycle, C-s prefix)')\n .action(async (key: string | undefined) => {\n const resolvedKey = key ?? DEFAULT_CYCLE_KEY;\n const result = setupTmuxKeybind(resolvedKey);\n\n switch (result.status) {\n case 'installed':\n console.log(result.message);\n console.log('Note: requires tmux 3.2+ for display-menu keybindings.');\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 admin setup-keybind M-S');\n console.log(' sisyphus admin setup-keybind M-w');\n console.log(' sisyphus admin setup-keybind M-j');\n break;\n case 'unsupported-tmux':\n console.log(result.message);\n break;\n }\n });\n}\n","import { execSync } from 'node:child_process';\nimport { existsSync, statSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport type { Command } from 'commander';\nimport { daemonLogPath, daemonPidPath, globalDir, socketPath } from '../../shared/paths.js';\nimport { isInstalled } from '../install.js';\nimport { detectTerminal, checkItermOptionKey, isNvimAvailable, isTermrenderAvailable } from '../onboard.js';\nimport { resolveInstalledPlugin } from '../../daemon/plugins.js';\nimport { cycleScriptPath, DEFAULT_CYCLE_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 admin 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_CYCLE_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_CYCLE_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_CYCLE_KEY})`,\n status: 'fail',\n detail: 'Not bound',\n fix: 'sisyphus admin setup-keybind',\n };\n }\n if (isSisyphusBinding(existing)) {\n return { name: `Tmux keybind (${DEFAULT_CYCLE_KEY})`, status: 'ok', detail: 'Bound to sisyphus-cycle' };\n }\n return {\n name: `Tmux keybind (${DEFAULT_CYCLE_KEY})`,\n status: 'warn',\n detail: `Bound to something else: ${existing}`,\n fix: 'sisyphus admin 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 checkSisyphusPlugin(): Check {\n const installPath = resolveInstalledPlugin('sisyphus@sisyphus');\n if (installPath) {\n return { name: 'sisyphus@sisyphus plugin', status: 'ok', detail: installPath };\n }\n return {\n name: 'sisyphus@sisyphus plugin',\n status: 'warn',\n detail: 'Not installed (slash commands /sisyphus:begin, /sisyphus:autopsy, /sisyphus:configure-upload unavailable)',\n fix: 'sisyphus admin setup',\n };\n}\n\nfunction checkTermrender(): Check {\n if (isTermrenderAvailable()) {\n try {\n const version = execSync('termrender --version', { encoding: 'utf-8', stdio: 'pipe' }).trim();\n return { name: 'termrender', status: 'ok', detail: version };\n } catch {\n return { name: 'termrender', status: 'ok', detail: 'installed' };\n }\n }\n return {\n name: 'termrender',\n status: 'warn',\n detail: 'Not installed (rich markdown rendering unavailable)',\n fix: 'pipx install termrender (or: pip install termrender)',\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\nfunction checkNotifyBinary(): Check | null {\n if (process.platform !== 'darwin') return null;\n const binary = join(homedir(), '.sisyphus', 'SisyphusNotify.app', 'Contents', 'MacOS', 'sisyphus-notify');\n if (existsSync(binary)) {\n return { name: 'Notifications', status: 'ok', detail: 'SisyphusNotify.app built' };\n }\n return {\n name: 'Notifications',\n status: 'warn',\n detail: 'SisyphusNotify.app not built (click-to-switch unavailable)',\n fix: 'Requires Xcode CLI tools: xcode-select --install, then reinstall sisyphus',\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(() => {\n const itermCheck = checkItermRightOptionKey();\n const notifyCheck = checkNotifyBinary();\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 checkSisyphusPlugin(),\n checkNvim(),\n ...(notifyCheck ? [notifyCheck] : []),\n checkTermrender(),\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 { 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\" | \"xhigh\" | \"max\" (default: \"xhigh\")');\n console.log(' agentEffort — \"low\" | \"medium\" | \"high\" | \"xhigh\" | \"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 console.log(' notifications — { enabled: boolean, sound: string } (default: enabled, Hero.aiff)');\n console.log(' companionPopup — Show companion commentary as tmux popup (default: true)');\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 { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { createInterface } from 'node:readline';\nimport { dirname } from 'node:path';\nimport type { Command } from 'commander';\nimport { globalConfigPath } from '../../shared/paths.js';\n\nasync function readUrlFromInput(interactive: boolean): Promise<string> {\n if (interactive) {\n return new Promise((resolve) => {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n rl.question('Paste the upload URL (with embedded ?token=): ', (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n }\n return new Promise((resolve) => {\n const chunks: string[] = [];\n process.stdin.setEncoding('utf-8');\n process.stdin.on('data', (chunk: string) => { chunks.push(chunk); });\n process.stdin.on('end', () => { resolve(chunks.join('').trim()); });\n });\n}\n\nexport function registerConfigureUpload(program: Command): void {\n program\n .command('configure-upload')\n .description('Configure the upload proxy from a token-bearing URL (writes ~/.sisyphus/config.json)')\n .argument('[url]', 'Worker URL with embedded ?token= query (https://worker/upload?token=sisyphus_pat_...); omit to read from stdin')\n .option('--stdin', 'Read URL from stdin (pipe-friendly: pbpaste | sisyphus admin configure-upload --stdin)')\n .action(async (urlArg: string | undefined, opts: { stdin?: boolean }) => {\n let rawUrl: string;\n\n const fromStdin = opts.stdin || urlArg === '-' || (!urlArg && process.stdin.isTTY === false);\n const fromInteractive = !urlArg && !opts.stdin && process.stdin.isTTY === true;\n\n if (fromStdin || fromInteractive) {\n rawUrl = await readUrlFromInput(fromInteractive);\n } else {\n rawUrl = urlArg!;\n console.warn(\n 'warning: passing the token on argv exposes it via `ps` and shell history; pipe it on stdin instead: `pbpaste | sisyphus admin configure-upload --stdin`',\n );\n }\n\n let parsed: URL;\n try {\n parsed = new URL(rawUrl);\n } catch {\n console.error('Error: Invalid URL');\n process.exit(1);\n }\n\n const token = parsed.searchParams.get('token');\n if (!token) {\n console.error('Error: URL is missing ?token=... query param');\n process.exit(1);\n }\n\n if (!token.startsWith('sisyphus_pat_')) {\n console.error('Error: token does not start with sisyphus_pat_ — refusing to write');\n process.exit(1);\n }\n\n parsed.searchParams.delete('token');\n\n // Strip /upload if it's the trailing segment — upload.ts appends /upload itself\n const strippedPath = parsed.pathname.replace(/\\/upload\\/?$/, '');\n const url = parsed.origin + (strippedPath.length > 0 ? strippedPath : '');\n\n // Always write to ~/.sisyphus/config.json — `loadConfig` only honors `upload`\n // from the global config (project-local upload blocks are silently stripped\n // as a security measure; see src/shared/config.ts).\n const configPath = globalConfigPath();\n\n let existing: Record<string, unknown> = {};\n if (existsSync(configPath)) {\n try {\n existing = JSON.parse(readFileSync(configPath, 'utf-8')) as Record<string, unknown>;\n } catch {\n console.error(`Error: ${configPath} could not be parsed — fix or delete it first`);\n process.exit(1);\n }\n }\n\n const merged = { ...existing, upload: { url, token } };\n mkdirSync(dirname(configPath), { recursive: true });\n writeFileSync(configPath, JSON.stringify(merged, null, 2) + '\\n', 'utf-8');\n chmodSync(configPath, 0o600);\n\n console.log(`✓ upload configured (${configPath})`);\n });\n}\n","import { execSync } from 'node:child_process';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { Command } from 'commander';\nimport { isTmuxInstalled } from '../tmux.js';\nimport { isNvimAvailable, detectTerminal, checkItermOptionKey } from '../onboard.js';\n\nfunction templatePath(name: string): string {\n return join(dirname(fileURLToPath(import.meta.url)), 'templates', name);\n}\n\nfunction isClaudeCode(): boolean {\n return !!process.env['CLAUDECODE'];\n}\n\nfunction printNonClaudeMessage(): void {\n console.log(`\n ╔══════════════════════════════════════════════════╗\n ║ sisyphus admin 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 admin getting-started\n\n If you just want the quick reference, run:\n sisyphus --help\n sisyphus admin 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 6 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 admin 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| 5 | What's next — real usage guidance & suggestions | \\`--tutorial 5\\` |\n\nTell the user they can skip to any step with \\`sisyphus admin 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 admin 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 admin 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 admin 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 admin 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+l\\`: move to the right pane\n- \\`Ctrl+h\\`: move to the left pane\n- \\`Ctrl+j\\`: move to the pane below\n- \\`Ctrl+k\\`: move to the pane above\n- No prefix key needed — just hold Ctrl and press the direction letter\n- For windows: \\`Ctrl+n\\` next window, \\`Ctrl+p\\` previous window\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 up/down**: \\`Ctrl+u\\` / \\`Ctrl+d\\` — scroll half-page up/down (no prefix needed). Press \\`q\\` to exit scroll mode.\n- **New window**: \\`Ctrl-b n\\` — opens a new window in the current directory\n- **Kill pane**: \\`Ctrl-b x\\` — closes the current pane and rebalances layout\n- **Re-tile**: \\`Ctrl-b =\\` — rebalance all panes to equal widths\n\n### 5. Verification\n\nAsk the user to confirm: \"Can you navigate between panes with Ctrl+h and Ctrl+l?\"\n\nOnce confirmed, proceed:\n\\`\\`\\`\nsisyphus admin 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 and editing files when you jump into agent panes, but not required.\n\nNote: The sisyphus dashboard has keys that auto-open files in nvim — users don't need to know how to open files from the command line. Focus on what they'll need once they're INSIDE nvim.\n\n### If nvim is NOT installed (nvimInstalled: false)\n\nAsk the user: \"Neovim is handy for reviewing and editing 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\nBriefly explain the key concept — nvim has two modes:\n\n- **Normal mode** (default): Keys are commands, not text. This is where you navigate.\n- **Insert mode**: Press \\`i\\` to enter. Now you type normally. \\`Esc\\` goes back to normal.\n\nTell them the basics they need once they're inside nvim: \\`i\\` to enter insert mode, \\`Esc\\` to return to normal mode, \\`:w\\` to save, \\`:q\\` to quit, \\`:wq\\` to save and quit.\n\n### Verification\n\nAsk if they were able to edit and save the file (or if they skipped).\n\nProceed:\n\\`\\`\\`\nsisyphus admin getting-started --tutorial 3\n\\`\\`\\`\n</claude-instructions>\n`);\n}\n\nfunction printStep3(): void {\n // Detect iTerm Right Option Key status for environment data\n let rightOptionKeyStatus = 'unknown';\n const terminal = detectTerminal();\n if (!terminal.isIterm) {\n rightOptionKeyStatus = 'not-iterm';\n } else {\n const result = checkItermOptionKey();\n if (!result.checked) {\n rightOptionKeyStatus = 'could-not-check';\n } else if (result.allCorrect) {\n rightOptionKeyStatus = 'ok';\n } else {\n rightOptionKeyStatus = `incorrect:${result.incorrectProfiles.join(',')}`;\n }\n }\n\n console.log(`\n<claude-instructions>\n# Sisyphus Getting Started — Step 3: Sisyphus Concepts & Keybinds\n\n## Environment Data\n- rightOptionKeyStatus: ${rightOptionKeyStatus}\n\n## Instructions for Claude\n\n### 1. CRITICAL FIRST: Right Option Key Setup\n\n**This must be done before anything else.** Sisyphus keybinds use the Option key as \"Meta\". By default, macOS terminals send special characters when you press Option (e.g., Option+s types \\`ß\\`). We need the RIGHT Option key to send escape sequences instead.\n\n**Check the environment data above:**\n\n- **rightOptionKeyStatus: ok** — They're all set, briefly confirm and move on.\n\n- **rightOptionKeyStatus: incorrect:ProfileName** — Walk them through the fix:\n\n > Your Right Option key isn't configured correctly yet. Here's how to fix it:\n >\n > 1. Open **iTerm2 Settings** (Cmd+,)\n > 2. Go to **Profiles** → select your profile (shown above)\n > 3. Click the **Keys** tab\n > 4. At the bottom, find **Right Option Key**\n > 5. Change it from **Normal** to **Esc+**\n >\n > \\`\\`\\`\n > ┌─ iTerm2 Settings ──────────────────────────┐\n > │ Profiles > Keys │\n > │ │\n > │ Right Option Key: │\n > │ ○ Normal (sends special chars like ß) │\n > │ ● Esc+ (sends escape sequences) ← ✓ │\n > └─────────────────────────────────────────────┘\n > \\`\\`\\`\n >\n > **Why right and not left?** You'll still want the left Option key for\n > typing special characters (accents, symbols). The right Option key\n > becomes your \"Meta\" key for tmux/sisyphus keybinds.\n\n After they change it, have them verify by re-running \\`sisyphus admin doctor\\` — look for \"Right Option Key: Esc+\".\n\n- **rightOptionKeyStatus: not-iterm** — They're not using iTerm2. Explain:\n > Sisyphus keybinds use Option as Meta. In iTerm2 this is configured via\n > \"Right Option Key → Esc+\". For your terminal, look for a similar setting\n > like \"Option sends Meta\" or \"Option sends Esc+\". Without this, pressing\n > Option+s will type a special character instead of triggering the keybind.\n\n- **rightOptionKeyStatus: could-not-check** or **unknown** — Ask them to manually check:\n > Press Option+s in your terminal. If you see \\`ß\\` (or another special character),\n > your Option key needs to be reconfigured. In iTerm2: Settings → Profiles → Keys →\n > Right Option Key → Esc+.\n\n### 2. 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### 3. Teach keybinds\n\nTwo keybinds to remember (both use the RIGHT Option key):\n\n| Keybind | Action |\n|---------|--------|\n| Right Option + s | Cycle through sisyphus sessions |\n| Right Option + Shift + s | Jump back to dashboard |\n\n### 4. Verify keybinds are installed\n\nRun \\`sisyphus admin doctor\\` and check the output. Look for:\n- \"Cycle script\" — should be ✓\n- \"Tmux keybind\" — should be ✓\n- \"Right Option Key\" — should be \"Esc+\"\n\nIf cycle script or keybind is missing, run: \\`sisyphus admin setup-keybind\\`\n\n### 5. Test the keybind\n\nHave the user try pressing Right Option + s. Nothing should happen yet (no sisyphus session running) — and that's fine. The important thing is no special character appears.\n\nIf they see \\`ß\\` or similar, circle back to the Right Option Key setup above.\n\n### 6. Verification\n\nConfirm:\n- They understand the two-session model (their session vs sisyphus session)\n- \\`sisyphus admin doctor\\` shows keybinds installed AND Right Option Key: Esc+\n- Right Option + s doesn't produce a special character\n\nProceed:\n\\`\\`\\`\nsisyphus admin 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 admin 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. BEFORE launching: Teach navigation\n\n**This is critical.** When \\`sisyphus start\\` runs, it auto-opens the dashboard in a new tmux window. The user will suddenly be looking at the dashboard and may feel \"stuck\". Teach them how to navigate BEFORE launching:\n\nExplain clearly:\n\n> Before we launch, you need to know how to move between tmux windows. Right now you're in a window with Claude. When sisyphus starts, it'll open a dashboard in a new window. Think of windows like tabs:\n>\n> \\`\\`\\`\n> Window 1 (you are here) Window 2 (dashboard)\n> ┌──────────────────┐ ┌──────────────────┐\n> │ Claude Code │ │ Sisyphus │\n> │ (this session) │ → │ Dashboard │\n> └──────────────────┘ └──────────────────┘\n> Ctrl+n → ← Ctrl+p\n> \\`\\`\\`\n>\n> - **\\`Ctrl+n\\`** — next window (go to dashboard)\n> - **\\`Ctrl+p\\`** — previous window (come back here)\n>\n> And remember from step 3:\n> - **Right Option + s** — jump to the sisyphus agent session (where you can watch agents work live)\n> - **Right Option + Shift + s** — jump back to dashboard\n\nHave the user confirm they understand these keybinds before proceeding.\n\n### 3. Set expectations, copy demo app, and launch\n\nFirst, copy the demo todo app to a temp directory and init a git repo (sisyphus needs git):\n\\`\\`\\`\nrm -rf /tmp/sisyphus-tutorial-demo\ncp -r ${templatePath('tutorial-demo')} /tmp/sisyphus-tutorial-demo\ngit -C /tmp/sisyphus-tutorial-demo init\ngit -C /tmp/sisyphus-tutorial-demo add -A\ngit -C /tmp/sisyphus-tutorial-demo commit -m \"Initial todo app\"\n\\`\\`\\`\n\nTell the user:\n\n> I've set up a small todo app in /tmp/sisyphus-tutorial-demo — a Node.js API\n> with a few files. I'm going to launch sisyphus on it. Here's what will happen:\n> 1. The dashboard opens automatically (you'll be switched to it)\n> 2. Press **Ctrl+p** to come back here to Claude — I'll guide you through what to watch\n> 3. The session takes a few minutes. You can watch agents work live!\n\nThen launch from the demo directory:\n\\`\\`\\`\ncd /tmp/sisyphus-tutorial-demo && sisyphus start \"Add three improvements to this todo app: (1) add a priority field (high/medium/low) to todos, (2) add a GET /todos/stats endpoint that returns counts of total/done/pending todos, (3) add tests for the new features. Explain your thinking at each step.\" -c \"TUTORIAL DEMO: A user is watching this session to learn how sisyphus works. Be EXTRA VERBOSE — explain your reasoning, narrate what you're doing, and make your planning visible. When spawning agents, give each agent context that this is a tutorial demo and they should explain their work clearly. Keep scope small: 2-3 agents, 1-2 cycles.\"\n\\`\\`\\`\n\nAfter launching, tell them:\n\n> The dashboard just opened. Press **Ctrl+p** to come back here — I'll provide live commentary as the session runs so you know what's happening.\n\nWait for them to confirm they're back, then start live commentary.\n\n### 4. Live commentary loop\n\n**This is the most important part of the demo.** Don't just launch and wait — actively narrate.\n\nOnce the user is back, start a polling loop. Every ~45 seconds, run \\`sisyphus status --verbose <session-id>\\` and provide SHORT, contextual commentary about what's happening. The \\`--verbose\\` flag shows agent instructions, full roadmap, cycle logs, and live pane output from the orchestrator and running agents — use this rich data to narrate what's actually happening, not just phase names.\n\n**How to narrate each phase:**\n\n- **Cycle 1, no agents yet**: \"The orchestrator is reading the codebase and planning. It's figuring out how to split the work. Check the dashboard (\\`Ctrl+n\\`) — you'll see the roadmap updating.\"\n\n- **Agents spawning**: \"Agents just spawned! You should see new panes appearing. Try \\`Right Option + s\\` to jump to the sisyphus session and watch them work. Each colored pane is an independent Claude instance.\"\n\n- **Agents working**: \"Agent-001 is working on [X], Agent-002 is on [Y]. They're working in parallel — this is the key advantage of sisyphus. Jump over and watch if you like (\\`Right Option + s\\`).\"\n\n- **Agents submitting**: \"Agent-001 just submitted its report! [N] more to go. When all agents finish, the orchestrator will respawn to review.\"\n\n- **Between cycles**: \"All agents done. The orchestrator is respawning with fresh context to review the reports and decide what's next. This is the cycle boundary — the orchestrator never runs out of context because it starts fresh each time.\"\n\n- **Completion**: \"The session is complete! Let me show you the results.\"\n\n**Important:**\n- Keep commentary to 1-3 sentences per check — don't wall-of-text\n- Remind them of navigation keys when relevant (\"jump over with Right Option + s to see this live\")\n- If agents are still working with no change, say so briefly (\"Still working... Agent-001 is the furthest along\")\n- Reference specific agent names and tasks from the status output\n- Stop polling when status shows \"completed\"\n\nBetween polls, encourage the user to explore:\n> \"While we wait, try jumping around: \\`Ctrl+n\\` for dashboard, \\`Right Option + s\\` for the agent session, \\`Right Option + Shift + s\\` to jump back. I'll keep narrating here.\"\n\n### 5. After completion\n\nOnce the session shows \"completed\":\n\n- Show them what the agents built: \\`cd /tmp/sisyphus-tutorial-demo && git log --oneline\\`\n- Run the tests to prove the work: \\`cd /tmp/sisyphus-tutorial-demo && node --test test.js\\`\n- Show the session artifacts: find the session dir in \\`.sisyphus/sessions/\\` and show \\`roadmap.md\\`\n- Explain: \"Every session creates a roadmap, agent reports, and logs — all stored in .sisyphus/sessions/\"\n\n### 6. Proceed to wrap-up\n\nTell the user the demo is done. Then run:\n\\`\\`\\`\nsisyphus admin getting-started --tutorial 5\n\\`\\`\\`\n</claude-instructions>\n`);\n}\n\nfunction printStep5(): void {\n // Gather codebase context for suggestions\n let recentCommits = '';\n let topLevelFiles = '';\n try {\n recentCommits = execSync('git log --oneline -15 2>/dev/null', { encoding: 'utf-8' }).trim();\n } catch { /* not in a git repo */ }\n try {\n topLevelFiles = execSync('ls -1 2>/dev/null', { encoding: 'utf-8' }).trim();\n } catch { /* ignore */ }\n\n console.log(`\n<claude-instructions>\n# Sisyphus Getting Started — Step 5: What's Next\n\n## Codebase Context\n<recent-commits>\n${recentCommits || '(no git repo detected)'}\n</recent-commits>\n\n<top-level-files>\n${topLevelFiles || '(could not list)'}\n</top-level-files>\n\n## Instructions for Claude\n\n### 1. Congratulate them\n\nTell them they've completed the tutorial and recap what they learned:\n- tmux basics (sessions, panes, navigation)\n- nvim basics for reviewing files\n- The sisyphus session model (separate tmux session for orchestrator + agents)\n- Monitoring with dashboard and keybinds\n- A live session lifecycle\n\n### 2. Navigation cheat sheet\n\n| Key | Action |\n|-----|--------|\n| \\`Ctrl+n\\` / \\`Ctrl+p\\` | Next/previous tmux window |\n| \\`Ctrl+h/j/k/l\\` | Navigate between panes |\n| \\`Right Option + s\\` | Jump to sisyphus agent session |\n| \\`Right Option + Shift + s\\` | Jump to dashboard |\n\n### 3. How to use sisyphus for REAL work\n\nThis is the most important part. Explain clearly:\n\n> **Sisyphus is for big, end-to-end features — the kind that need exploration,\n> planning, and parallel implementation across multiple systems.**\n>\n> You don't need to define the task precisely. Broad is fine — the orchestrator\n> will explore the codebase, write specs, plan phases, and break it down itself.\n\n**Real sisyphus sessions (from production use):**\n- \"Design and implement a human-in-the-loop agent inbox system\" — exploration, spec writing, DB schema, API endpoints, UI components, webhook integration, e2e validation\n- \"Build multi-user organization features — invites, privilege gating, org switcher, workspace sharing, credit tracking\" — touched auth, DB, API, UI, billing, permissions\n- \"Rework all 5 worker onboarding templates to match production pipeline patterns\" — mapped existing patterns, designed new architecture, implemented across templates, validated with e2e tests\n- \"Autonomous failure detection system across 8 sequential phases\" — monitoring, alerting, recovery, dashboard, with each phase building on the last\n- \"Comprehensive code quality audit — find and fix dead code, null handling, useless fallbacks\" — systematic codebase-wide analysis and cleanup\n- \"Implement @requirements.md\" — point it at a spec and let it go\n\n**NOT good for sisyphus:**\n- Five unrelated small tasks bundled together (\"fix the login bug, update the README, add a loading spinner\") — these aren't one feature, they're a todo list\n- Something Claude Code in plan mode would handle — plan mode already handles substantial single-engineer work. If it fits in one Claude session, just do it directly.\n- Quick fixes, bug fixes, small refactors — use regular Claude Code\n\n**How to start:**\nThe easiest way is the \\`/sisyphus:begin\\` slash command inside Claude Code. Just tell Claude\nwhat you want to build and it'll hand it off to sisyphus with the right context.\n\nOr directly: \\`sisyphus start \"your task\" -c \"any background context\"\\`\n\n### 4. Suggest real tasks for THEIR codebase\n\nLook at the recent commits and top-level files above. Based on what you can see of their project, suggest 2-3 concrete sisyphus-scale tasks they could try. Be specific to their codebase — reference actual directories, patterns, or areas you can see.\n\nIf there are no commits or files (e.g., they ran this from /tmp), skip this section.\n\nFormat as:\n> Based on your codebase, here are some tasks sisyphus would be great for:\n> - \"...\"\n> - \"...\"\n\n### 5. There's more to learn\n\nTell them:\n\n> There's actually a lot of depth to how sisyphus works — the design is intentional\n> and there's real reasoning behind why it does things the way it does. If you want\n> to understand the philosophy, or you want a deeper rundown on the dashboard,\n> monitoring, configuration, or how to steer sessions — just ask and I'll explain.\n\nIf the user says yes or asks to learn more, run \\`sisyphus admin getting-started --explain\\`\nand use its output to explain the system to them conversationally. Don't dump the whole\nthing — answer what they're curious about, using the reference as your source material.\n</claude-instructions>\n`);\n}\n\nfunction buildCommandTable(program: Command): string {\n const lines: string[] = ['| Command | Purpose |', '|---------|---------|'];\n for (const cmd of program.commands) {\n if ((cmd as unknown as { _hidden: boolean })._hidden) continue;\n if (cmd.name() === 'help') continue;\n const subs = cmd.commands.filter(c => !(c as unknown as { _hidden: boolean })._hidden && c.name() !== 'help');\n const hasOwnAction = (cmd as unknown as { _actionHandler?: unknown })._actionHandler != null;\n const fmtArgs = (c: typeof cmd) =>\n c.registeredArguments.map(a => a.required ? `<${a.name()}>` : `[${a.name()}]`).join(' ');\n if (subs.length === 0) {\n // flat or argument-only command\n const args = fmtArgs(cmd);\n const usage = args ? `sisyphus ${cmd.name()} ${args}` : `sisyphus ${cmd.name()}`;\n lines.push(`| \\`${usage}\\` | ${cmd.description()} |`);\n } else {\n // group: if it has its own root action (e.g. `companion`), emit a row for the bare invocation first\n if (hasOwnAction) {\n const args = fmtArgs(cmd);\n const usage = args ? `sisyphus ${cmd.name()} ${args}` : `sisyphus ${cmd.name()}`;\n lines.push(`| \\`${usage}\\` | ${cmd.description()} |`);\n }\n // then one row per subcommand\n for (const sub of subs) {\n const args = fmtArgs(sub);\n const usage = args ? `sisyphus ${cmd.name()} ${sub.name()} ${args}` : `sisyphus ${cmd.name()} ${sub.name()}`;\n lines.push(`| \\`${usage}\\` | ${sub.description()} |`);\n }\n }\n }\n return lines.join('\\n');\n}\n\nfunction printExplain(program: Command): void {\n console.log(`\n<claude-instructions>\n# Sisyphus — Comprehensive Reference\n\nThis is a detailed reference for how sisyphus works. The user asked to understand\nsisyphus more deeply. Use this to answer their questions conversationally — don't dump\nthe whole thing. Read through it, then respond to what they're curious about.\n\n## Design Philosophy\n\nSisyphus is built on specific insights about how to get the best work out of LLM agents.\nThese aren't arbitrary — each design decision solves a real failure mode.\n\n### 1. The Orchestrator as \"Human-in-the-Loop\"\n\nWhen you use Claude Code effectively, YOU are the orchestrator — you review work,\nsteer direction, break problems down, and assign the next piece. Sisyphus automates\nthat human role. The orchestrator does what a skilled developer does when prompting\nClaude: explore the codebase, understand the problem, write specs, plan phases,\nassign focused work, review results, and iterate.\n\nThe strategy layer mirrors how developers actually work on end-to-end features:\nexplore, understand, spec, plan, implement, review, validate. The orchestrator\nfollows this same workflow, but runs it with parallel agents.\n\n### 2. Fresh Context Kills Shortcuts\n\nThe orchestrator is KILLED after every cycle and respawned fresh. This is the most\nimportant design decision.\n\nWhen an LLM accumulates context over a long session, it starts taking shortcuts.\nIt \"knows\" what it did earlier, so it skips re-reading, assumes things still hold,\nand builds on stale understanding. A fresh start forces honest reassessment every\ncycle — the orchestrator reads the actual state, not its memory of it.\n\nThis is inspired by adversarial training (think GANs) — better results come from\nadversarial pressure. Each fresh orchestrator effectively audits the previous cycle's\nwork because it has no stake in defending prior decisions. It sees the roadmap, the\nreports, the code — and judges them with fresh eyes.\n\n### 3. Single-Focus Agents\n\nEach agent gets ONE task with a fully self-contained instruction. No context switching,\nno juggling multiple concerns, no \"also while you're there could you...\"\n\nLLMs perform dramatically better when focused. An agent implementing a priority field\ndoesn't think about the stats endpoint. It reads the relevant context, does its one\nthing well, and reports back. The orchestrator handles decomposition — agents handle\nexecution.\n\n### 4. Shared Context Directory (Saved Research)\n\nEvery session has a context/ directory where agents save research, specs, plans, and\ndesign docs. These files persist across ALL cycles and are visible to the orchestrator\nand subsequent agents.\n\nThis means research is never repeated. Cycle 1 agents explore and write findings to\ncontext/explore-auth-system.md. Cycle 3 agents read those findings and build on them.\nKnowledge accumulates even though the orchestrator itself is stateless.\n\nPlan lead agents save their plans under context/{agent-id}/ so parallel plan agents\ndon't interfere with each other's validation.\n\n### 5. Two-Layer Planning (Strategy + Roadmap)\n\nThe system maintains two documents at different abstraction levels:\n\n**strategy.md** — The high-level problem-solving map. What phases exist, what gates\nbetween them, what backtrack paths exist. Updated every few cycles when the shape of\nwork changes. Helps the orchestrator see the forest.\n\n**roadmap.md** — Working memory. Updated every cycle. Current Stage, Exit Criteria,\nActive Context, Next Steps. The orchestrator reads this first each cycle to understand\nwhere things stand. Helps the orchestrator see the trees.\n\nThis prevents the failure mode where a single document becomes either too abstract\nto act on or too detailed to show the big picture.\n\n### 6. Adversarial Review Is Built In\n\nThe orchestrator doesn't just implement — it runs mandatory critique cycles. After\nimplementation, review agents attack different dimensions: code reuse, quality,\nefficiency, correctness. Fix agents address the findings. Re-review until only nits\nremain. Multiple agents auditing each other produces better results than any single\nagent reviewing its own work.\n\nThe rule: never let 2+ stages complete without critique. Small issues compound into\narchitectural problems if unchecked.\n\n### 7. Evidence Over Assumptions\n\nValidation requires PROOF — command output, test results, HTTP responses. \"The code\nlooks correct\" is not evidence. \"All 14 tests pass\" is. This catches the gap between\ncode that looks right and code that works.\n\n## Architecture Overview\n\n\\`\\`\\`\n┌─────────────────────────────────────────────────────────────────────┐\n│ USER'S TMUX SESSION │\n│ │\n│ ┌─────────────────────────┐ ┌──────────────────────────────────┐ │\n│ │ Window 1: Claude Code │ │ Window 2: Dashboard (TUI) │ │\n│ │ │ │ │ │\n│ │ User's normal work │ │ Real-time session monitor │ │\n│ │ + this conversation │ │ Roadmap, agents, reports │ │\n│ │ │ │ Interactive controls │ │\n│ └─────────────────────────┘ └──────────────────────────────────┘ │\n└──────────────────────────────────┬──────────────────────────────────┘\n │ Right Option+s / Right Option+Shift+s\n ▼\n┌─────────────────────────────────────────────────────────────────────┐\n│ SISYPHUS TMUX SESSION │\n│ (created per sisyphus session) │\n│ │\n│ ┌──────────┬──────────┬──────────┬──────────┐ │\n│ │ Orch │ Agent │ Agent │ Agent │ ← panes │\n│ │ (yellow) │ (blue) │ (green) │ (magenta)│ │\n│ │ │ │ │ │ │\n│ │ Plans, │ Impl │ Tests │ Docs │ ← each is a │\n│ │ assigns, │ feature │ │ │ Claude Code │\n│ │ reviews │ │ │ │ instance │\n│ └──────────┴──────────┴──────────┴──────────┘ │\n└─────────────────────────────────────────────────────────────────────┘\n │\n ▼\n┌─────────────────────────────────────────────────────────────────────┐\n│ DAEMON (sisyphusd) │\n│ Background process via launchd │\n│ │\n│ Listens on ~/.sisyphus/daemon.sock │\n│ Manages session lifecycle, pane monitoring, state persistence │\n│ Polls panes to detect when agents/orchestrator finish │\n└─────────────────────────────────────────────────────────────────────┘\n\\`\\`\\`\n\n## The Session Lifecycle (in detail)\n\n\\`\\`\\`\n ┌──────────────────────────────────────────────────────────────────┐\n │ SESSION LIFECYCLE │\n │ │\n │ sisyphus start \"task\" │\n │ │ │\n │ ▼ │\n │ ┌─────────┐ spawn agents ┌──────────────┐ │\n │ │ Orch │ ──────────────────→ │ Agents work │ │\n │ │ plans │ then yields │ in parallel │ │\n │ └────┬────┘ └──────┬───────┘ │\n │ │ │ each calls │\n │ │ orchestrator │ sisyphus agent submit │\n │ │ is KILLED │ when done │\n │ │ ▼ │\n │ │ ┌──────────────┐ │\n │ │ │ All agents │ │\n │ │ │ finished? │ │\n │ │ └──────┬───────┘ │\n │ │ │ yes │\n │ │ ┌──────────────────────┘ │\n │ │ ▼ │\n │ │ ┌─────────┐ │\n │ └──── │ Respawn │ Fresh orchestrator with full state │\n │ next cycle │ Orch │ Reviews reports, plans next cycle │\n │ └────┬────┘ │\n │ │ │\n │ ▼ │\n │ ┌───────────────┐ ┌───────────┐ │\n │ │ More work │──yes──→ │ Spawn │ → (loop) │\n │ │ needed? │ │ agents │ │\n │ └───────┬───────┘ └───────────┘ │\n │ │ no │\n │ ▼ │\n │ ┌───────────────┐ │\n │ │ sisyphus │ │\n │ │ complete │ │\n │ └───────────────┘ │\n └──────────────────────────────────────────────────────────────────┘\n\\`\\`\\`\n\n**Key insight**: The orchestrator is STATELESS. It gets killed after each yield and\nrespawned fresh with the complete session state (roadmap, agent reports, cycle history).\nThis means it never runs out of context, no matter how many cycles a session takes.\n\n## The Dashboard\n\nThe dashboard is a real-time TUI that shows session state. Launch with \\`sisyphus dashboard\\`\nor it auto-opens when a session starts.\n\n**Dashboard sections:**\n- **Header**: Session ID, status, task description\n- **Roadmap**: Current strategic plan with checked/unchecked items\n- **Agents**: List of all agents with status, duration, and report summaries\n- **Cycles**: Orchestrator cycle history\n- **Messages**: Recent session messages\n\n**Dashboard keys:**\n| Key | Action |\n|-----|--------|\n| \\`m\\` | Message the orchestrator (steer direction mid-session) |\n| \\`w\\` | Jump to the sisyphus tmux session (watch agents work) |\n| \\`k\\` | Kill the session |\n| \\`r\\` | Resume a paused/completed session |\n| \\`q\\` | Quit the dashboard |\n| \\`↑/↓\\` | Scroll through content |\n| \\`Tab\\` | Cycle through sections |\n\n**The \\`m\\` key is the most powerful feature.** You can message the orchestrator at any time\nto course-correct: \"Focus on the API layer first\", \"Skip the tests for now\",\n\"The approach for auth is wrong, use JWT instead\". The orchestrator reads these\nmessages when it respawns each cycle.\n\n## Monitoring Strategy\n\nSisyphus sessions should be actively monitored. Here's what to watch for:\n\n**Things that go wrong:**\n- Agents stuck waiting for user input (they're autonomous — they shouldn't need input)\n- Agents going down rabbit holes or working on the wrong thing\n- Merge conflicts between agents touching the same files\n- Orchestrator spawning too many agents or too few\n- Agents crashing or getting killed unexpectedly\n\n**When to intervene:**\n- Use \\`m\\` in the dashboard to message the orchestrator with corrections\n- Use \\`sisyphus session kill <id>\\` to stop a runaway session\n- Use \\`sisyphus session resume <id> \"new instructions\"\\` to restart with different direction\n\n**Useful monitoring commands:**\n\\`\\`\\`\nsisyphus status <id> # Quick status check\nsisyphus status --verbose <id> # Full detail: roadmap, pane output, agent instructions\nsisyphus dashboard # Interactive TUI\ntail -f ~/.sisyphus/daemon.log # Daemon activity log\n\\`\\`\\`\n\n## The .sisyphus/ Directory\n\nEverything sisyphus does lives in a \\`.sisyphus/\\` directory at the root of your project.\nThis is project-local — each project gets its own. It contains:\n\n\\`\\`\\`\n.sisyphus/\n├── config.json # Project-specific config (model, poll interval, etc.)\n├── orchestrator.md # Optional custom orchestrator prompt override\n└── sessions/\n ├── <session-id-1>/ # Each session gets its own directory\n ├── <session-id-2>/\n └── ...\n\\`\\`\\`\n\nThere's also a global directory at \\`~/.sisyphus/\\` for the daemon socket, PID file,\nlogs, keybind scripts, and global config. But the session state — the roadmaps,\nreports, context files, cycle logs — all lives in your project's \\`.sisyphus/sessions/\\`.\n\n## Session Files\n\nEvery session creates a directory at \\`.sisyphus/sessions/<id>/\\` with:\n\n\\`\\`\\`\n.sisyphus/sessions/<id>/\n├── state.json # Session state (agents, cycles, status)\n├── roadmap.md # Strategic plan (updated by orchestrator each cycle)\n├── goal.md # Original task description\n├── initial-prompt.md # Immutable record of the initial user prompt\n├── strategy.md # High-level strategy notes\n├── logs/\n│ ├── cycle-000.md # What the orchestrator did in cycle 0\n│ ├── cycle-001.md # What it did in cycle 1, etc.\n│ └── ...\n├── reports/\n│ ├── agent-001-final.md # Agent's final report\n│ ├── agent-002-update.md # Agent's progress update\n│ └── ...\n├── prompts/ # System/user prompts sent to orchestrator and agents\n└── context/ # Shared context files for agents\n\\`\\`\\`\n\n## Configuration\n\n**Global config**: \\`~/.sisyphus/config.json\\`\n**Project config**: \\`.sisyphus/config.json\\` (overrides global)\n\nOptions:\n- \\`model\\` — Claude model for orchestrator and agents\n- \\`orchestratorPrompt\\` — Path to custom orchestrator prompt\n- \\`pollIntervalMs\\` — How often daemon checks pane status (default: 2000)\n\n## Starting Sessions — Best Practices\n\n**The /sisyphus:begin slash command** is the recommended way to start. Inside Claude Code:\n\\`\\`\\`\n/sisyphus:begin\n\\`\\`\\`\nThen describe your task. Claude will hand it off with the right context.\n\n**Direct CLI:**\n\\`\\`\\`\nsisyphus start \"task description\" -c \"background context\"\nsisyphus start \"Implement @requirements.md\" -n my-feature\n\\`\\`\\`\n\n**Reference files with @**: \\`sisyphus start \"Build @docs/spec.md\"\\` — the orchestrator\nwill read the referenced file as part of its planning.\n\n**The -c flag** adds background context the orchestrator sees but doesn't act on directly.\nUse it for constraints: \\`-c \"Don't modify the auth module, use the existing API\"\\`\n\n**The -n flag** gives the session a human-readable name for easier tracking.\n\n## CLI Command Reference\n\n${buildCommandTable(program)}\n\n## Troubleshooting\n\n**Daemon not running:**\n\\`\\`\\`\nsisyphusd restart\n\\`\\`\\`\n\n**Keybinds not working (special characters appear):**\niTerm2 → Settings → Profiles → Keys → Right Option Key → Esc+\n\n**Agents stuck:** Check \\`sisyphus status --verbose <id>\\` to see pane output. If an\nagent is waiting for input, kill the session and restart with clearer instructions.\n\n**Dashboard not opening:** Run \\`sisyphus dashboard\\` manually. Must be inside tmux.\n\n**Session seems hung:** Check \\`tail -20 ~/.sisyphus/daemon.log\\` for errors.\nThe daemon polls panes every 2s — if a pane dies unexpectedly, it'll be detected.\n</claude-instructions>\n`);\n}\n\nconst STEPS: Array<() => void> = [printStep0, printStep1, printStep2, printStep3, printStep4, printStep5];\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-5)', parseInt)\n .option('--explain', 'Comprehensive reference for how sisyphus works')\n .action((opts) => {\n if (opts.explain) {\n printExplain(program);\n return;\n }\n if (opts.tutorial !== undefined) {\n const step = opts.tutorial as number;\n if (step < 0 || step > 5 || Number.isNaN(step)) {\n console.error(`Invalid tutorial step: ${opts.tutorial}. Must be 0-5.`);\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 { readdirSync, readFileSync, existsSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport { historyBaseDir, historySessionDir, historyEventsPath, historySessionSummaryPath, statePath } from '../../shared/paths.js';\nimport { formatDuration, statusColor } from '../../shared/format.js';\nimport type { SessionSummary, SessionSummaryAgent } from '../../shared/history-types.js';\nimport type { HistoryEvent } from '../../shared/history-types.js';\nimport type { Session } from '../../shared/types.js';\n\nconst RESET = '\\x1b[0m';\nconst BOLD = '\\x1b[1m';\nconst DIM = '\\x1b[2m';\nconst COLOR: Record<string, string> = {\n green: '\\x1b[32m', yellow: '\\x1b[33m', cyan: '\\x1b[36m',\n red: '\\x1b[31m', gray: '\\x1b[90m', white: '\\x1b[37m', magenta: '\\x1b[35m',\n};\n\nfunction c(color: string, text: string): string {\n return `${COLOR[color] ?? ''}${text}${RESET}`;\n}\n\n// Agent types that run interactive TUI sessions. Their activeMs includes\n// user think-time while the pane is open — not actual compute. Treat\n// separately from compute-only agent types in efficiency metrics.\nconst INTERACTIVE_AGENT_TYPES = new Set<string>([\n 'sisyphus:requirements',\n 'sisyphus:design',\n 'sisyphus:spec',\n]);\n\nfunction isInteractiveAgent(agentType: string | null | undefined): boolean {\n return agentType != null && INTERACTIVE_AGENT_TYPES.has(agentType);\n}\n\nfunction splitAgentTime(agents: SessionSummaryAgent[]): { computeMs: number; interactiveMs: number; blockedMs: number } {\n let computeMs = 0;\n let interactiveMs = 0;\n let blockedMs = 0;\n for (const a of agents) {\n const blocked = a.userBlockedMs ?? 0;\n const remaining = Math.max(0, a.activeMs - blocked);\n blockedMs += blocked;\n if (isInteractiveAgent(a.agentType)) interactiveMs += remaining;\n else computeMs += remaining;\n }\n return { computeMs, interactiveMs, blockedMs };\n}\n\n// ---------------------------------------------------------------------------\n// Data loading\n// ---------------------------------------------------------------------------\n\nfunction loadAllSummaries(): Array<{ id: string; summary: SessionSummary }> {\n const base = historyBaseDir();\n if (!existsSync(base)) return [];\n\n const results: Array<{ id: string; summary: SessionSummary }> = [];\n for (const name of readdirSync(base)) {\n const summaryPath = historySessionSummaryPath(name);\n if (existsSync(summaryPath)) {\n try {\n const raw = readFileSync(summaryPath, 'utf-8');\n results.push({ id: name, summary: JSON.parse(raw) as SessionSummary });\n continue;\n } catch { /* fall through to live rebuild */ }\n }\n // No session.json — synthesize from live state if session is still in-flight\n const live = buildLiveSummary(name);\n if (live) results.push({ id: name, summary: live });\n }\n // Newest first\n results.sort((a, b) => new Date(b.summary.startedAt).getTime() - new Date(a.summary.startedAt).getTime());\n return results;\n}\n\n/**\n * Synthesize a SessionSummary on demand for an in-flight session (no `session.json` yet).\n * Reads the session's `cwd` from the first `session-start` event, then reads live\n * `state.json` and maps it to the same shape `writeSessionSummary` produces.\n * Fields that are only finalized at completion are marked null/empty.\n * Returns null if events or live state can't be read.\n */\nfunction buildLiveSummary(sessionId: string): SessionSummary | null {\n const eventsPath = historyEventsPath(sessionId);\n if (!existsSync(eventsPath)) return null;\n\n // Extract cwd from the session-start event (only place it's recorded in the history dir)\n let cwd: string | null = null;\n try {\n const lines = readFileSync(eventsPath, 'utf-8').split('\\n');\n for (const line of lines) {\n if (!line.trim()) continue;\n try {\n const ev = JSON.parse(line) as HistoryEvent;\n if (ev.event === 'session-start' && typeof ev.data.cwd === 'string') {\n cwd = ev.data.cwd;\n break;\n }\n } catch { continue; }\n }\n } catch { return null; }\n if (!cwd) return null;\n\n const sPath = statePath(cwd, sessionId);\n if (!existsSync(sPath)) return null;\n\n let session: Session;\n try {\n session = JSON.parse(readFileSync(sPath, 'utf-8')) as Session;\n } catch { return null; }\n\n // Live wall clock: created → now. activeMs is already flushed periodically by the daemon;\n // both may lag the true live value by one poll interval (~seconds), acceptable for a read-only view.\n const liveWallClockMs = Date.now() - new Date(session.createdAt).getTime();\n\n return {\n sessionId: session.id,\n name: session.name ?? null,\n task: session.task,\n cwd: session.cwd,\n model: session.model ?? null,\n status: session.status,\n startedAt: session.createdAt,\n completedAt: session.completedAt ?? null,\n activeMs: session.activeMs,\n wallClockMs: session.wallClockMs ?? liveWallClockMs,\n userBlockedMs: session.userBlockedMs ?? 0,\n agentCount: session.agents.length,\n crashCount: session.agents.filter(a => a.status === 'crashed').length,\n lostCount: session.agents.filter(a => a.status === 'lost').length,\n killedAgentCount: session.agents.filter(a => a.status === 'killed').length,\n rollbackCount: session.rollbackCount ?? 0,\n efficiency: liveWallClockMs > 0\n ? Math.max(0, session.activeMs - (session.userBlockedMs ?? 0))\n / Math.max(1, liveWallClockMs - (session.userBlockedMs ?? 0))\n : null,\n cycleCount: session.orchestratorCycles.length,\n context: session.context ?? null,\n completionReport: session.completionReport ?? null,\n agents: session.agents.map(a => ({\n id: a.id,\n name: a.name,\n nickname: a.nickname ?? null,\n agentType: a.agentType,\n status: a.status,\n activeMs: a.activeMs,\n userBlockedMs: a.userBlockedMs ?? 0,\n spawnedAt: a.spawnedAt,\n completedAt: a.completedAt,\n restartCount: a.restartCount ?? 0,\n })),\n cycles: session.orchestratorCycles.map(c => ({\n cycle: c.cycle,\n mode: c.mode ?? null,\n agentsSpawned: c.agentsSpawned.length,\n activeMs: c.activeMs,\n userBlockedMs: c.userBlockedMs ?? 0,\n startedAt: c.timestamp,\n completedAt: c.completedAt ?? null,\n })),\n messages: session.messages.map(m => ({\n id: m.id,\n source: typeof m.source === 'string' ? m.source : m.source.type,\n content: m.content,\n timestamp: m.timestamp,\n })),\n finalMoodSignals: null,\n achievements: [],\n xpGained: 0,\n sentiment: null,\n };\n}\n\nfunction loadEvents(sessionId: string): HistoryEvent[] {\n const eventsPath = historyEventsPath(sessionId);\n if (!existsSync(eventsPath)) return [];\n const lines = readFileSync(eventsPath, 'utf-8').split('\\n').filter(l => l.trim());\n const events: HistoryEvent[] = [];\n for (const line of lines) {\n try { events.push(JSON.parse(line) as HistoryEvent); } catch { continue; }\n }\n return events;\n}\n\nfunction findSession(idOrName: string): { id: string; summary: SessionSummary } | null {\n // Try exact ID match first\n const summaryPath = historySessionSummaryPath(idOrName);\n if (existsSync(summaryPath)) {\n try {\n return { id: idOrName, summary: JSON.parse(readFileSync(summaryPath, 'utf-8')) as SessionSummary };\n } catch { /* fall through */ }\n }\n // Exact-ID path with no session.json — try live rebuild before falling back to search\n if (existsSync(historySessionDir(idOrName))) {\n const live = buildLiveSummary(idOrName);\n if (live) return { id: idOrName, summary: live };\n }\n // Search by name or partial ID (loadAllSummaries handles live rebuild for in-flight sessions)\n const all = loadAllSummaries();\n return all.find(s =>\n s.id.startsWith(idOrName) ||\n s.summary.name === idOrName ||\n s.summary.name?.includes(idOrName),\n ) ?? null;\n}\n\n// ---------------------------------------------------------------------------\n// Duration parsing\n// ---------------------------------------------------------------------------\n\nfunction parseSince(since: string): number {\n const match = since.match(/^(\\d+)\\s*(d|h|m|w)$/);\n if (!match) {\n console.error(`Error: invalid --since format \"${since}\". Use e.g. 7d, 24h, 30m, 2w`);\n process.exit(1);\n }\n const n = parseInt(match[1]!, 10);\n const unit = match[2]!;\n const ms = { d: 86400000, h: 3600000, m: 60000, w: 604800000 }[unit]!;\n return Date.now() - n * ms;\n}\n\n// ---------------------------------------------------------------------------\n// Formatters\n// ---------------------------------------------------------------------------\n\nfunction fmtStatus(status: string): string {\n return c(statusColor(status), status);\n}\n\nfunction fmtDate(iso: string): string {\n const d = new Date(iso);\n return d.toLocaleDateString('en-US', { month: 'short', day: 'numeric' }) + ' ' +\n d.toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit', hour12: false });\n}\n\nfunction fmtProject(cwd: string): string {\n const parts = cwd.split('/');\n return parts.slice(-2).join('/');\n}\n\n// ---------------------------------------------------------------------------\n// Subcommands\n// ---------------------------------------------------------------------------\n\nfunction listSessions(opts: {\n cwd?: string; status?: string; since?: string; search?: string;\n limit: number; json: boolean;\n}): void {\n let sessions = loadAllSummaries();\n\n if (opts.cwd) {\n const abs = resolve(opts.cwd);\n sessions = sessions.filter(s => s.summary.cwd === abs);\n }\n if (opts.status) {\n sessions = sessions.filter(s => s.summary.status === opts.status);\n }\n if (opts.since) {\n const cutoff = parseSince(opts.since);\n sessions = sessions.filter(s => new Date(s.summary.startedAt).getTime() >= cutoff);\n }\n if (opts.search) {\n const q = opts.search.toLowerCase();\n sessions = sessions.filter(s =>\n s.summary.task.toLowerCase().includes(q) ||\n (s.summary.name ?? '').toLowerCase().includes(q) ||\n s.summary.messages.some(m => m.content.toLowerCase().includes(q)),\n );\n }\n\n sessions = sessions.slice(0, opts.limit);\n\n if (opts.json) {\n console.log(JSON.stringify(sessions.map(s => s.summary), null, 2));\n return;\n }\n\n if (sessions.length === 0) {\n console.log(c('gray', 'No sessions found.'));\n return;\n }\n\n for (const { summary: s } of sessions) {\n const name = s.name ? c('white', s.name) : c('gray', s.sessionId.slice(0, 8));\n const status = fmtStatus(s.status);\n const date = c('gray', fmtDate(s.startedAt));\n const dur = formatDuration(s.activeMs);\n const proj = c('gray', fmtProject(s.cwd));\n const agents = s.agentCount > 0 ? `${s.agentCount} agents` : '';\n const cycles = s.cycleCount > 0 ? `${s.cycleCount} cycles` : '';\n const meta = [agents, cycles, dur].filter(Boolean).join(', ');\n\n console.log(`${date} ${status} ${name} ${DIM}${meta}${RESET} ${proj}`);\n\n const taskPreview = s.task.length > 100 ? s.task.slice(0, 100) + '...' : s.task;\n console.log(` ${DIM}${taskPreview}${RESET}`);\n console.log('');\n }\n\n const total = loadAllSummaries().length;\n if (total > sessions.length) {\n console.log(c('gray', ` Showing ${sessions.length} of ${total} sessions. Use --limit or filters to see more.`));\n }\n}\n\nfunction showSession(idOrName: string, opts: { json: boolean; events: boolean }): void {\n const found = findSession(idOrName);\n if (!found) {\n console.error(`Error: session \"${idOrName}\" not found`);\n process.exit(1);\n }\n\n const { id, summary: s } = found;\n\n if (opts.json && !opts.events) {\n console.log(JSON.stringify(s, null, 2));\n return;\n }\n\n if (opts.events) {\n const events = loadEvents(id);\n if (opts.json) {\n console.log(JSON.stringify(events, null, 2));\n return;\n }\n if (events.length === 0) {\n console.log(c('gray', 'No events recorded.'));\n return;\n }\n for (const e of events) {\n const time = c('gray', fmtDate(e.ts));\n const event = c('cyan', e.event.padEnd(18));\n const data = formatEventData(e);\n console.log(`${time} ${event} ${data}`);\n }\n return;\n }\n\n // Detail view\n const inProgress = s.completedAt == null;\n const inProgressTag = inProgress ? ` ${c('yellow', '(in progress)')}` : '';\n console.log(`${BOLD}${s.name ?? s.sessionId.slice(0, 8)}${RESET} ${fmtStatus(s.status)}${inProgressTag}`);\n console.log(`${DIM}ID:${RESET} ${s.sessionId}`);\n console.log(`${DIM}Project:${RESET} ${s.cwd}`);\n console.log(`${DIM}Model:${RESET} ${s.model ?? 'default'}`);\n console.log(`${DIM}Started:${RESET} ${fmtDate(s.startedAt)}`);\n console.log(`${DIM}Ended:${RESET} ${s.completedAt ? fmtDate(s.completedAt) : c('gray', '— still running')}`);\n const { computeMs, interactiveMs } = splitAgentTime(s.agents);\n const wallStr = s.wallClockMs ? formatDuration(s.wallClockMs) : '—';\n console.log(`${DIM}Active:${RESET} ${formatDuration(s.activeMs)} ${DIM}Wall:${RESET} ${wallStr}`);\n if (interactiveMs > 0) {\n console.log(`${DIM}Compute:${RESET} ${formatDuration(computeMs)} ${DIM}Interactive:${RESET} ${formatDuration(interactiveMs)} ${DIM}(TUI wait time, not compute)${RESET}`);\n }\n if (s.userBlockedMs > 0) {\n console.log(`${DIM}Waiting on user:${RESET} ${formatDuration(s.userBlockedMs)} ${DIM}(blocked on sisyphus ask, not compute)${RESET}`);\n }\n console.log('');\n\n // Task\n console.log(`${BOLD}Task${RESET}`);\n console.log(s.task);\n console.log('');\n\n // Context\n if (s.context) {\n console.log(`${BOLD}Context${RESET}`);\n console.log(s.context.length > 500 ? s.context.slice(0, 500) + '...' : s.context);\n console.log('');\n }\n\n // Agents\n if (s.agents.length > 0) {\n console.log(`${BOLD}Agents${RESET} (${s.agents.length})`);\n for (const a of s.agents) {\n const name = a.nickname ? `${a.name} \"${a.nickname}\"` : a.name;\n const type = a.agentType ? c('gray', ` [${a.agentType}]`) : '';\n const interactive = isInteractiveAgent(a.agentType) ? c('yellow', ' (interactive)') : '';\n const blocked = a.userBlockedMs ?? 0;\n const waiting = blocked > 0 ? ` ${DIM}· ${formatDuration(blocked)} waiting${RESET}` : '';\n console.log(` ${fmtStatus(a.status)} ${name}${type}${interactive} ${DIM}${formatDuration(a.activeMs)}${RESET}${waiting}`);\n }\n console.log('');\n }\n\n // Cycles\n if (s.cycles.length > 0) {\n console.log(`${BOLD}Cycles${RESET} (${s.cycles.length})`);\n for (const cy of s.cycles) {\n const mode = cy.mode ? c('magenta', cy.mode) : '';\n const blocked = cy.userBlockedMs ?? 0;\n const waiting = blocked > 0 ? ` ${DIM}· ${formatDuration(blocked)} waiting${RESET}` : '';\n console.log(` ${DIM}#${cy.cycle}${RESET} ${mode} ${cy.agentsSpawned} agents ${DIM}${formatDuration(cy.activeMs)}${RESET}${waiting}`);\n }\n console.log('');\n }\n\n // Messages\n if (s.messages.length > 0) {\n console.log(`${BOLD}Messages${RESET} (${s.messages.length})`);\n for (const m of s.messages) {\n const src = c('gray', m.source);\n const preview = m.content.length > 120 ? m.content.slice(0, 120) + '...' : m.content;\n console.log(` ${src} ${preview}`);\n }\n console.log('');\n }\n\n // Completion report\n if (s.completionReport) {\n console.log(`${BOLD}Completion Report${RESET}`);\n console.log(s.completionReport);\n console.log('');\n }\n\n // Achievements\n if (s.achievements.length > 0) {\n console.log(`${BOLD}Achievements Unlocked${RESET}`);\n console.log(` ${s.achievements.join(', ')}`);\n console.log('');\n }\n\n // Final mood signals\n if (s.finalMoodSignals) {\n const sig = s.finalMoodSignals;\n const parts = [\n sig.recentCrashes > 0 ? c('red', `${sig.recentCrashes} crashes`) : null,\n `${sig.activeAgentCount ?? 0} active agents`,\n `cycle ${sig.cycleCount ?? 0}`,\n `hour ${sig.hourOfDay}`,\n sig.idleDurationMs > 60000 ? `idle ${formatDuration(sig.idleDurationMs)}` : null,\n ].filter(Boolean);\n console.log(`${DIM}Final signals: ${parts.join(' · ')}${RESET}`);\n }\n}\n\nfunction formatEventData(e: HistoryEvent): string {\n const d = e.data;\n switch (e.event) {\n case 'session-start':\n return `${c('white', (d.task as string).slice(0, 80))} ${c('gray', fmtProject(d.cwd as string))}`;\n case 'session-named':\n return c('white', d.name as string);\n case 'agent-spawned':\n return `${c('white', d.agentId as string)} ${d.agentType ?? ''} ${DIM}${(d.instruction as string)?.slice(0, 60) ?? ''}...${RESET}`;\n case 'agent-nicknamed':\n return `${d.agentId} \"${c('white', d.nickname as string)}\"`;\n case 'agent-completed':\n return `${d.agentId} ${DIM}${formatDuration(d.activeMs as number)}${RESET} ${DIM}${(d.reportSummary as string)?.slice(0, 60) ?? ''}${RESET}`;\n case 'agent-exited':\n return `${d.agentId} ${fmtStatus(d.status as string)} ${d.reason ?? ''}`;\n case 'cycle-boundary':\n return `#${d.cycle} ${d.mode ? c('magenta', d.mode as string) : ''} ${d.agentsSpawned} agents`;\n case 'signals-snapshot': {\n const sig = d.signals as Record<string, unknown> | undefined;\n return `${d.from} → ${c('white', d.to as string)} ${sig ? `crashes=${sig.recentCrashes} agents=${sig.activeAgentCount ?? 0}` : ''}`;\n }\n case 'message':\n return `${c('gray', d.source as string)} ${(d.content as string).slice(0, 80)}`;\n case 'review-started': {\n const fileParts = typeof d.filePath === 'string' ? d.filePath.split('/').slice(-2).join('/') : '';\n return `${c('cyan', d.type as string)} ${c('gray', fileParts)}`;\n }\n case 'agent-killed':\n return `${d.agentId} ${fmtStatus(d.status as string)} ${DIM}${formatDuration(d.activeMs as number)}${RESET} ${d.reason ?? ''}`;\n case 'agent-restarted':\n return `${d.agentId} restart #${d.restartCount} ${DIM}was ${d.previousStatus}${RESET}`;\n case 'rollback':\n return `cycle ${d.fromCycle} → ${d.toCycle} ${d.killedAgentCount} agents killed`;\n case 'session-resumed':\n return `was ${fmtStatus(d.previousStatus as string)} ${d.lostAgentCount} agents lost`;\n case 'session-continued':\n return `${d.cycleCount} cycles ${DIM}${formatDuration(d.activeMs as number)}${RESET}`;\n case 'session-end':\n return `${fmtStatus(d.status as string)} ${formatDuration(d.activeMs as number)} ${d.agentCount} agents ${d.cycleCount} cycles`;\n default:\n return JSON.stringify(d);\n }\n}\n\nfunction showStats(opts: { cwd?: string; since?: string; json: boolean }): void {\n // Exclude in-flight sessions — their activeMs/wallClockMs are live snapshots that\n // would skew aggregate averages, efficiency, and percentiles.\n let sessions = loadAllSummaries().filter(s => s.summary.completedAt != null);\n\n if (opts.cwd) {\n const abs = resolve(opts.cwd);\n sessions = sessions.filter(s => s.summary.cwd === abs);\n }\n if (opts.since) {\n const cutoff = parseSince(opts.since);\n sessions = sessions.filter(s => new Date(s.summary.startedAt).getTime() >= cutoff);\n }\n\n if (sessions.length === 0) {\n console.log(c('gray', 'No sessions found.'));\n return;\n }\n\n const completed = sessions.filter(s => s.summary.status === 'completed');\n const killed = sessions.filter(s => s.summary.status === 'killed');\n const totalActiveMs = sessions.reduce((sum, s) => sum + s.summary.activeMs, 0);\n const totalAgents = sessions.reduce((sum, s) => sum + s.summary.agentCount, 0);\n const totalCycles = sessions.reduce((sum, s) => sum + s.summary.cycleCount, 0);\n const totalMessages = sessions.reduce((sum, s) => sum + s.summary.messages.length, 0);\n\n // Per-project breakdown\n const byProject = new Map<string, { count: number; activeMs: number; agents: number }>();\n for (const { summary: s } of sessions) {\n const proj = s.cwd;\n const entry = byProject.get(proj) ?? { count: 0, activeMs: 0, agents: 0 };\n entry.count++;\n entry.activeMs += s.activeMs;\n entry.agents += s.agentCount;\n byProject.set(proj, entry);\n }\n\n // Avg session duration\n const avgMs = totalActiveMs / sessions.length;\n\n // Efficiency\n const efficiencyValues: number[] = [];\n for (const { summary: s } of sessions) {\n const eff = s.efficiency ?? (s.wallClockMs\n ? Math.max(0, s.activeMs - (s.userBlockedMs ?? 0))\n / Math.max(1, s.wallClockMs - (s.userBlockedMs ?? 0))\n : null);\n if (eff != null) efficiencyValues.push(eff);\n }\n const avgEfficiency = efficiencyValues.length > 0\n ? efficiencyValues.reduce((a, b) => a + b, 0) / efficiencyValues.length\n : null;\n\n // Duration distributions (p50/p90)\n const sortedActiveMs = sessions.map(s => s.summary.activeMs).sort((a, b) => a - b);\n const n = sortedActiveMs.length;\n const p50Ms = n >= 3 ? sortedActiveMs[Math.ceil(50 / 100 * n) - 1]! : null;\n const p90Ms = n >= 3 ? sortedActiveMs[Math.ceil(90 / 100 * n) - 1]! : null;\n\n // Per-agent-type performance\n const agentTypeMap = new Map<string, { count: number; totalMs: number; crashed: number; completed: number }>();\n for (const { summary: s } of sessions) {\n for (const a of s.agents) {\n const type = a.agentType ?? 'untyped';\n const entry = agentTypeMap.get(type) ?? { count: 0, totalMs: 0, crashed: 0, completed: 0 };\n entry.count++;\n entry.totalMs += a.activeMs;\n if (a.status === 'crashed') entry.crashed++;\n if (a.status === 'completed') entry.completed++;\n agentTypeMap.set(type, entry);\n }\n }\n\n // Temporal patterns\n const hourBlocks = new Map<string, number>();\n const dayCounts = new Map<string, number>();\n const dayNames = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n for (const { summary: s } of sessions) {\n const d = new Date(s.startedAt);\n const hour = d.getHours();\n const blockStart = hour - (hour % 2);\n const blockLabel = `${String(blockStart).padStart(2, '0')}:00–${String(blockStart + 2).padStart(2, '0')}:00`;\n hourBlocks.set(blockLabel, (hourBlocks.get(blockLabel) ?? 0) + 1);\n const day = dayNames[d.getDay()]!;\n dayCounts.set(day, (dayCounts.get(day) ?? 0) + 1);\n }\n\n if (opts.json) {\n console.log(JSON.stringify({\n total: sessions.length,\n completed: completed.length,\n killed: killed.length,\n totalActiveMs,\n avgActiveMs: Math.round(avgMs),\n avgEfficiency,\n p50Ms,\n p90Ms,\n totalAgents,\n totalCycles,\n totalMessages,\n byProject: Object.fromEntries([...byProject.entries()].map(([k, v]) => [k, v])),\n agentTypes: Object.fromEntries([...agentTypeMap.entries()].map(([k, v]) => [k, {\n ...v,\n avgMs: Math.round(v.totalMs / v.count),\n crashRate: v.count > 0 ? v.crashed / v.count : 0,\n completionRate: v.count > 0 ? v.completed / v.count : 0,\n }])),\n temporalPatterns: sessions.length >= 5 ? {\n hourBlocks: Object.fromEntries(hourBlocks),\n dayOfWeek: Object.fromEntries(dayCounts),\n } : null,\n }, null, 2));\n return;\n }\n\n console.log(`${BOLD}Session History Stats${RESET}`);\n console.log('');\n console.log(` ${BOLD}Sessions:${RESET} ${sessions.length} total ${c('cyan', `${completed.length} completed`)} ${c('red', `${killed.length} killed`)}`);\n const timeLine = ` ${BOLD}Time:${RESET} ${formatDuration(totalActiveMs)} total ${formatDuration(avgMs)} avg` +\n (p50Ms != null && p90Ms != null ? ` ${DIM}p50=${formatDuration(p50Ms)} p90=${formatDuration(p90Ms)}${RESET}` : '');\n console.log(timeLine);\n if (avgEfficiency != null) {\n const effColor = avgEfficiency >= 0.7 ? 'green' : avgEfficiency >= 0.4 ? 'yellow' : 'red';\n console.log(` ${BOLD}Efficiency:${RESET} ${c(effColor, (avgEfficiency * 100).toFixed(1) + '%')} ${DIM}(${efficiencyValues.length} sessions with data)${RESET}`);\n }\n console.log(` ${BOLD}Agents:${RESET} ${totalAgents} spawned (${(totalAgents / sessions.length).toFixed(1)} avg/session)`);\n console.log(` ${BOLD}Cycles:${RESET} ${totalCycles} total (${(totalCycles / sessions.length).toFixed(1)} avg/session)`);\n console.log(` ${BOLD}Messages:${RESET} ${totalMessages} total`);\n console.log('');\n\n console.log(`${BOLD}By Project${RESET}`);\n const sorted = [...byProject.entries()].sort((a, b) => b[1].count - a[1].count);\n for (const [proj, data] of sorted) {\n console.log(` ${c('gray', fmtProject(proj))} ${data.count} sessions ${formatDuration(data.activeMs)} ${data.agents} agents`);\n }\n\n // Per-agent-type performance table\n if (agentTypeMap.size > 0) {\n console.log('');\n console.log(`${BOLD}By Agent Type${RESET}`);\n const typeHeader = ` ${'Type'.padEnd(20)} ${'Count'.padStart(6)} ${'Avg Time'.padStart(10)} ${'Crash %'.padStart(8)} ${'Done %'.padStart(8)}`;\n console.log(`${DIM}${typeHeader}${RESET}`);\n const sortedTypes = [...agentTypeMap.entries()].sort((a, b) => b[1].count - a[1].count);\n for (const [type, data] of sortedTypes) {\n const avgTime = formatDuration(data.totalMs / data.count);\n const crashRate = data.count > 0 ? ((data.crashed / data.count) * 100).toFixed(0) + '%' : '0%';\n const completionRate = data.count > 0 ? ((data.completed / data.count) * 100).toFixed(0) + '%' : '0%';\n const crashColor = data.crashed > 0 ? 'red' : 'green';\n console.log(` ${type.padEnd(20)} ${String(data.count).padStart(6)} ${avgTime.padStart(10)} ${c(crashColor, crashRate.padStart(8))} ${c('cyan', completionRate.padStart(8))}`);\n }\n }\n\n // Temporal patterns\n if (sessions.length >= 5) {\n console.log('');\n console.log(`${BOLD}Temporal Patterns${RESET}`);\n const topBlocks = [...hourBlocks.entries()].sort((a, b) => b[1] - a[1]).slice(0, 3);\n console.log(` ${DIM}Busiest times:${RESET} ${topBlocks.map(([label, count]) => `${label} (${count})`).join(' ')}`);\n const dayOrder = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];\n const dayParts = dayOrder.map(d => `${d} ${dayCounts.get(d) ?? 0}`);\n console.log(` ${DIM}By day:${RESET} ${dayParts.join(' ')}`);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Registration\n// ---------------------------------------------------------------------------\n\nexport function registerHistory(program: Command): void {\n program\n .command('history')\n .description('Browse session history and metrics')\n .argument('[session]', 'Session ID or name to inspect')\n .option('--cwd <path>', 'Filter by project directory')\n .option('--status <status>', 'Filter by status (completed, killed)')\n .option('--since <duration>', 'Filter by recency (e.g. 7d, 24h, 2w)')\n .option('--search <query>', 'Search task text and messages')\n .option('--events', 'Show raw event timeline')\n .option('--stats', 'Show aggregate statistics')\n .option('--json', 'Output as JSON')\n .option('-n, --limit <n>', 'Max sessions to show', '20')\n .action(async (session: string | undefined, opts: {\n cwd?: string; status?: string; since?: string; search?: string;\n events?: boolean; stats?: boolean; json?: boolean; limit: string;\n }) => {\n const limit = parseInt(opts.limit, 10) || 20;\n const json = opts.json ?? false;\n\n if (opts.stats) {\n showStats({ cwd: opts.cwd, since: opts.since, json });\n return;\n }\n\n if (session) {\n showSession(session, { json, events: opts.events ?? false });\n return;\n }\n\n listSessions({\n cwd: opts.cwd,\n status: opts.status,\n since: opts.since,\n search: opts.search,\n limit,\n json,\n });\n });\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport type { Session } from '../../shared/types.js';\nimport { exportSessionToZip } from '../../shared/session-export.js';\n\nexport { exportSessionToZip };\n\nexport function registerExport(program: Command): void {\n program\n .command('export')\n .description('Export session data as zip to ~/Downloads')\n .argument('[session-id]', 'Session ID (defaults to SISYPHUS_SESSION_ID or active session)')\n .option('--cwd <path>', 'Project directory override')\n .action(async (sessionIdArg?: string, opts?: { cwd?: string }) => {\n let sessionId = sessionIdArg ?? process.env.SISYPHUS_SESSION_ID;\n const cwd = opts?.cwd ?? process.env['SISYPHUS_CWD'] ?? process.cwd();\n\n if (!sessionId) {\n const request: Request = { type: 'status', cwd };\n const response = await sendRequest(request);\n if (response.ok) {\n const session = response.data?.session as Session | undefined;\n if (session) {\n sessionId = session.id;\n }\n }\n }\n\n if (!sessionId) {\n console.error('Error: No session ID provided and no active session found.');\n console.error('Usage: sisyphus admin export [session-id]');\n process.exit(1);\n }\n\n try {\n const outputPath = await exportSessionToZip(sessionId, cwd);\n console.log(`Exported to ${outputPath}`);\n } catch (err) {\n console.error(`Error: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { rmSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport type { Session } from '../../shared/types.js';\nimport { loadConfig } from '../../shared/config.js';\nimport { exportSessionToZip } from '../../shared/session-export.js';\nimport { uploadSession, isUploadConfigured } from '../../shared/upload.js';\nimport { buildManifest } from '../../shared/manifest.js';\nimport { getSession } from '../../daemon/state.js';\nimport { getSisyphusVersion } from '../../shared/version.js';\n\nexport function registerUpload(program: Command): void {\n program\n .command('upload')\n .description('Upload a session zip to the configured upload endpoint')\n .argument('[session-id]', 'Session ID (defaults to SISYPHUS_SESSION_ID or active session)')\n .option('--cwd <path>', 'Project directory override')\n .action(async (sessionIdArg?: string, opts?: { cwd?: string }) => {\n let sessionId = sessionIdArg ?? process.env.SISYPHUS_SESSION_ID;\n const cwd = opts?.cwd ?? process.env['SISYPHUS_CWD'] ?? process.cwd();\n\n if (!sessionId) {\n const request: Request = { type: 'status', cwd };\n const response = await sendRequest(request);\n if (response.ok) {\n const session = response.data?.session as Session | undefined;\n if (session) {\n sessionId = session.id;\n }\n }\n }\n\n if (!sessionId) {\n console.error('Error: No session ID provided and no active session found.');\n console.error('Usage: sisyphus admin upload [session-id]');\n process.exit(1);\n }\n\n const config = loadConfig(cwd);\n if (!isUploadConfigured(config.upload)) {\n console.error(\n \"Error: upload not configured. Run 'sisyphus admin configure-upload <url-with-token>' or set { upload: { url, token } } in .sisyphus/config.json.\",\n );\n process.exit(1);\n }\n\n let zipPath: string;\n try {\n zipPath = await exportSessionToZip(sessionId, cwd, { reveal: false, outputDir: tmpdir() });\n } catch (err) {\n console.error(`Error: ${(err as Error).message}`);\n process.exit(1);\n }\n\n try {\n const session = getSession(cwd, sessionId);\n if (session.status !== 'completed') {\n console.warn(`warning: session ${sessionId} is not completed (status: ${session.status}); uploading anyway`);\n }\n\n const manifest = buildManifest({ session, status: 'completed', config, sisyphusVersion: getSisyphusVersion() });\n\n let result: Awaited<ReturnType<typeof uploadSession>>;\n try {\n result = await uploadSession({ config: config.upload, zipPath, manifest });\n } catch (err) {\n const errMsg = (err as Error).message;\n const persistReq: Request = {\n type: 'set-upload-status',\n sessionId,\n cwd,\n status: 'failed',\n error: errMsg,\n };\n try {\n await sendRequest(persistReq);\n } catch {\n // daemon unreachable — best-effort\n }\n console.error(`Upload failed: ${errMsg}`);\n process.exit(1);\n }\n\n const persistReq: Request = {\n type: 'set-upload-status',\n sessionId,\n cwd,\n status: 'uploaded',\n storageKey: result!.storageKey,\n };\n try {\n const resp = await sendRequest(persistReq);\n if (!resp.ok) {\n console.warn(`warning: could not persist upload status (${resp.error ? resp.error : 'no error detail'})`);\n }\n } catch {\n console.warn('warning: daemon unreachable — upload status not persisted to session state');\n }\n\n console.log(`Uploaded to ${result!.storageKey}`);\n } finally {\n rmSync(zipPath!, { force: true });\n }\n });\n}\n","import type { Command } from 'commander';\nimport { execSync } from 'node:child_process';\nimport { assertTmux } from '../tmux.js';\nimport { shellQuote } from '../../shared/shell.js';\n\n/**\n * Find the home session (non-ssyph_ session with matching @sisyphus_cwd).\n * Returns the tmux session name, or null if none found.\n *\n * Queries by $N session ID — tmux's -t <name> can substring-match the wrong\n * session under sparse env, and scratch may run from any shell context.\n */\nfunction findHomeSession(cwd: string): string | null {\n const normalizedCwd = cwd.replace(/\\/+$/, '');\n let output: string;\n try {\n output = execSync('tmux list-sessions -F \"#{session_id}|#{session_name}\"', {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n } catch {\n return null;\n }\n for (const line of output.split('\\n').filter(Boolean)) {\n const pipeIdx = line.indexOf('|');\n if (pipeIdx < 0) continue;\n const sessId = line.slice(0, pipeIdx);\n const name = line.slice(pipeIdx + 1);\n if (name.startsWith('ssyph_')) continue;\n try {\n const val = execSync(\n `tmux show-options -t ${shellQuote(sessId)} -v @sisyphus_cwd`,\n { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] },\n ).trim();\n if (val === normalizedCwd) return name;\n } catch {\n // Option not set — skip\n }\n }\n return null;\n}\n\nexport function registerScratch(program: Command): void {\n program\n .command('scratch [prompt...]')\n .description('Open a standalone Claude Code session in the home tmux session')\n .option('-c, --cwd <path>', 'Working directory for the Claude session')\n .action((promptParts: string[], opts: { cwd?: string }) => {\n assertTmux();\n\n const cwd = opts.cwd ?? process.env['SISYPHUS_CWD'] ?? process.cwd();\n const homeSession = findHomeSession(cwd);\n\n if (!homeSession) {\n // Fall back to current tmux session\n const current = execSync('tmux display-message -p \"#{session_name}\"', {\n encoding: 'utf-8',\n }).trim();\n openScratchWindow(current, cwd, promptParts.join(' '));\n return;\n }\n\n openScratchWindow(homeSession, cwd, promptParts.join(' '));\n });\n}\n\nfunction openScratchWindow(tmuxSession: string, cwd: string, prompt: string): void {\n const windowId = execSync(\n `tmux new-window -t ${shellQuote(tmuxSession + ':')} -n \"scratch\" -c ${shellQuote(cwd)} -P -F \"#{window_id}\"`,\n { encoding: 'utf-8' },\n ).trim();\n\n let cmd = 'claude --dangerously-skip-permissions';\n if (prompt) {\n cmd += ` -p ${shellQuote(prompt)}`;\n }\n\n execSync(\n `tmux send-keys -t ${shellQuote(windowId)} ${shellQuote(cmd)} Enter`,\n );\n\n console.log(`Scratch session opened in ${tmuxSession}`);\n}\n","import type { Command } from 'commander';\nimport { join, resolve, dirname } from 'node:path';\nimport { existsSync, readFileSync, writeFileSync, renameSync, readdirSync } from 'node:fs';\nimport { contextDir, sessionsDir } from '../../shared/paths.js';\nimport type { RequirementStatus } from '../../shared/requirements-types.js';\n\n// Keeps the JSON Schema enum in sync with the TS union.\nconst _statusCheck: RequirementStatus[] = ['draft', 'question', 'approved', 'rejected', 'deferred'];\n\nfunction resolveContextArtifact(\n file: string | undefined,\n opts: { sessionId?: string; cwd?: string },\n filename: string,\n notFoundMessage: string,\n): string {\n const cwd = opts.cwd || process.env.SISYPHUS_CWD || process.cwd();\n if (file) return resolve(file);\n\n const sessionId = opts.sessionId || process.env.SISYPHUS_SESSION_ID;\n if (sessionId) {\n const target = join(contextDir(cwd, sessionId), filename);\n if (!existsSync(target)) {\n console.error(`Error: File not found: ${target}`);\n process.exit(1);\n }\n return target;\n }\n\n const dir = sessionsDir(cwd);\n if (existsSync(dir)) {\n const sessions = readdirSync(dir);\n for (const session of sessions.reverse()) {\n const candidate = join(dir, session, 'context', filename);\n if (existsSync(candidate)) return candidate;\n }\n }\n\n console.error(`Error: ${notFoundMessage}`);\n process.exit(1);\n}\n\nexport function registerReview(program: Command): void {\n program\n .command('requirements')\n .description('Export and inspect EARS requirements produced by `sisyphus:spec` (or compatible writers)')\n .argument('[file]', 'Path to requirements.json (auto-detected from session if omitted)')\n .option('--session-id <id>', 'Session ID to find requirements for')\n .option('--cwd <path>', 'Project directory')\n .option('--schema', 'Print the requirements.json schema and exit')\n .option('--annotated', 'Print the schema with writing guidance annotations and exit')\n .option('--export', 'Render requirements.json into requirements.md (no LLM tokens; overwrites existing requirements.md)')\n .option('--force', 'With --export: overwrite existing requirements.md even if hand-edited; existing file is moved to requirements.md.bak before overwrite')\n .addHelpText('after', `\nFile resolution (first match wins):\n 1. Positional [file] argument\n 2. --session-id (or SISYPHUS_SESSION_ID env) → .sisyphus/sessions/<id>/context/requirements.json\n 3. Most recent session with a requirements.json\n\nExamples:\n $ sisyphus admin requirements Auto-detect from current session\n $ sisyphus admin requirements path/to/requirements.json Open a specific file\n $ sisyphus admin requirements --session-id abc123 Target a specific session\n $ sisyphus admin requirements --schema Print the JSON schema\n $ sisyphus admin requirements --annotated Print schema with writing guidance\n $ sisyphus admin requirements --export Render requirements.md from JSON\n $ sisyphus admin requirements --export --session-id abc123 Target a specific session\n $ sisyphus admin requirements --export --force Overwrite even if hand-edited\n`)\n .action(async (file, opts) => {\n if (opts.force && !opts.export) {\n console.error('Error: --force requires --export');\n process.exit(1);\n }\n if (opts.export && opts.schema) {\n console.error('Error: --export cannot be combined with --schema');\n process.exit(1);\n }\n if (opts.export && opts.annotated) {\n console.error('Error: --export cannot be combined with --annotated');\n process.exit(1);\n }\n if (opts.export) {\n const targetPath = resolveContextArtifact(\n file,\n opts,\n 'requirements.json',\n 'No requirements.json found. Provide a path or use --session-id.',\n );\n\n if (!existsSync(targetPath)) {\n console.error(`Error: File not found: ${targetPath}`);\n process.exit(1);\n }\n\n const parsed = JSON.parse(readFileSync(targetPath, 'utf-8')) as Record<string, unknown>;\n const rendered = renderRequirementsMarkdown(parsed);\n const outPath = join(dirname(targetPath), 'requirements.md');\n const tmpPath = outPath + '.tmp';\n\n if (existsSync(outPath)) {\n const existing = readFileSync(outPath, 'utf-8');\n if (existing !== rendered) {\n if (!opts.force) {\n process.stderr.write(\n `Error: ${outPath} has been hand-edited (differs from rendered output).\\n` +\n `Use --force to overwrite (existing file backed up to requirements.md.bak).\\n`,\n );\n process.exit(1);\n }\n const bakPath = outPath + '.bak';\n renameSync(outPath, bakPath);\n process.stderr.write(`Note: Existing requirements.md backed up to ${bakPath}\\n`);\n }\n }\n\n writeFileSync(tmpPath, rendered, 'utf-8');\n renameSync(tmpPath, outPath);\n process.stdout.write(resolve(outPath) + '\\n');\n return;\n }\n if (opts.schema) {\n process.stdout.write(JSON.stringify(REQUIREMENTS_SCHEMA, null, 2) + '\\n');\n return;\n }\n if (opts.annotated) {\n process.stdout.write(REQUIREMENTS_ANNOTATED + '\\n');\n return;\n }\n });\n\n}\n\n// ── Requirements schema ──────────────────────────────────────────────\n\nconst REQUIREMENTS_SCHEMA = {\n $schema: 'https://json-schema.org/draft/2020-12/schema',\n $defs: {\n requirementItem: {\n type: 'object',\n required: ['id', 'title', 'ears', 'criteria', 'status'],\n additionalProperties: false,\n properties: {\n id: { type: 'string', pattern: '^REQ-\\\\d{3}$' },\n title: { type: 'string' },\n ears: {\n type: 'object',\n required: ['shall'],\n properties: {\n when: { type: 'string' },\n while: { type: 'string' },\n if: { type: 'string' },\n where: { type: 'string' },\n shall: { type: 'string' },\n },\n oneOf: [\n { required: ['when', 'shall'] },\n { required: ['while', 'shall'] },\n { required: ['if', 'shall'] },\n { required: ['where', 'shall'] },\n ],\n },\n criteria: {\n type: 'array',\n items: {\n type: 'object',\n required: ['text', 'checked'],\n properties: {\n text: { type: 'string' },\n checked: { type: 'boolean' },\n },\n },\n },\n status: { type: 'string', enum: _statusCheck },\n agentNotes: { type: 'string' },\n userNotes: { type: 'string' },\n },\n },\n },\n title: 'Sisyphus Requirements',\n description: 'EARS-format behavioral requirements',\n type: 'object',\n required: ['meta', 'groups'],\n properties: {\n meta: {\n type: 'object',\n required: ['lastModified'],\n additionalProperties: false,\n properties: {\n title: { type: 'string' },\n subtitle: { type: 'string' },\n summary: { type: 'string' },\n version: { type: 'integer' },\n lastModified: { type: 'string', format: 'date-time' },\n draft: { type: 'integer', minimum: 1 },\n stage: { type: 'string', enum: ['stage-2-in-progress', 'stage-2-verdict-pending', 'writer-redispatch-pending', 'stage-2-done', 'stage-3-done'] },\n bounceIterations: { type: 'integer', minimum: 0 },\n openAskId: { type: 'string' },\n writerRedispatchIterations: { type: 'integer' },\n },\n },\n groups: {\n type: 'array',\n items: {\n type: 'object',\n required: ['id', 'name', 'description', 'requirements'],\n additionalProperties: false,\n properties: {\n id: { type: 'string', pattern: '^[a-z0-9-]+$' },\n name: { type: 'string' },\n description: { type: 'string' },\n context: { type: 'string' },\n requirements: {\n type: 'array',\n items: { $ref: '#/$defs/requirementItem' },\n },\n safeAssumptions: {\n type: 'array',\n items: { $ref: '#/$defs/requirementItem' },\n },\n },\n },\n },\n },\n};\n\nconst REQUIREMENTS_ANNOTATED = `# requirements.json — Annotated Writing Guide\n#\n# This is NOT valid JSON — it's a reference showing every field with\n# inline guidance. Run \\`sisyphus admin requirements --schema\\` for the raw\n# JSON Schema.\n#\n# Safe assumptions must satisfy the same EARS shape requirements as\n# regular requirements.\n#\n# ── BEHAVIORAL ONLY ──\n# Each requirement describes what the system does at its boundary —\n# what the user, caller, or tester observes. The design (already\n# approved) is the technical contract; the plan phase (later) handles\n# implementation breakdown. Do not write requirements that name files,\n# functions, libraries, data structures, or algorithms.\n\n{\n \"meta\": {\n \"title\": \"Feature Name Requirements\",\n // ^ Human-readable title.\n\n \"subtitle\": \"EARS Behavioral Spec\",\n // ^ Secondary label. Usually \"EARS Behavioral Spec\".\n\n \"summary\": \"2-3 sentences: what is being built, who it's for, and the key constraint.\",\n // ^ Orients the reviewer before they see individual items.\n // Lead with the user-facing outcome only. The implementation\n // belongs in design.md (technical) and plan.md (steps).\n\n \"version\": 1,\n // ^ Always 1. Reserved for future schema versioning.\n\n \"lastModified\": \"2026-04-04T12:00:00Z\",\n // ^ ISO 8601 timestamp. Update on each save.\n\n \"draft\": 1\n // ^ Increment on each revision cycle (1, 2, 3...).\n\n // ── Spec lead state-machine fields (do NOT write unless you are the spec lead) ──\n // \"stage\": \"stage-2-in-progress\" | \"stage-2-verdict-pending\" | \"writer-redispatch-pending\" | \"stage-2-done\" | \"stage-3-done\"\n // \"bounceIterations\": number — bounce-loop counter, never decrements\n // \"openAskId\": string — background ask id for active Stage 2 review deck\n // \"writerRedispatchIterations\": number — writer re-dispatch counter, never decrements\n },\n\n \"groups\": [\n // Each group is a thematic area (e.g., \"Session Creation\", \"Error Recovery\").\n // Aim for 3-7 groups. Present them in narrative order.\n {\n \"id\": \"kebab-case-group-id\",\n // ^ Unique, stable across drafts. Use kebab-case.\n\n \"name\": \"Group Display Name\",\n // ^ Short label shown as the group header.\n\n \"description\": \"What this group covers — one sentence.\",\n // ^ Shown below the group name. Keep it scannable.\n\n \"context\": \"Rich introduction paragraph for this group.\\\\n\\\\nInclude ASCII diagrams:\\\\n\\\\n User ──► Action ──► Response\\\\n │\\\\n ┌─────┴─────┐\\\\n ▼ ▼\\\\n Success Failure\",\n // ^ Use ASCII diagrams for flows, state transitions, architecture.\n // Newlines are literal \\\\n in JSON.\n\n \"requirements\": [\n {\n \"id\": \"REQ-001\",\n // ^ Sequential within the file. REQ-001, REQ-002, etc.\n // Unique across ALL groups, not just this one.\n\n \"title\": \"Short requirement title\",\n // ^ One line.\n\n \"ears\": {\n // ── EARS pattern object ──\n // Exactly ONE condition key + \"shall\". Never a flat string.\n //\n // Pick the matching pattern:\n // Event-driven: { \"when\": \"When [trigger]\", \"shall\": \"...\" }\n // State-driven: { \"while\": \"While [condition]\", \"shall\": \"...\" }\n // Unwanted: { \"if\": \"If [bad condition]\", \"shall\": \"...\" }\n // Optional: { \"where\": \"Where [feature flag]\", \"shall\": \"...\" }\n\n \"when\": \"When the user runs \\`start\\` with a task description\",\n // ^ Start with the EARS keyword: When/While/If/Where.\n\n \"shall\": \"the system shall return a session ID and surface the orchestrator's first response\"\n // ^ Observable behavior — what the caller sees at the boundary.\n // Not \"spawn\", \"instantiate\", \"import\", or any verb that\n // requires reading code to verify.\n },\n\n \"criteria\": [\n // Acceptance criteria — checkable assertions.\n {\n \"text\": \"Session ID is returned to the caller\",\n // ^ One testable statement per criterion.\n\n \"checked\": false\n // ^ Always false when you write it.\n }\n ],\n\n \"status\": \"draft\",\n // ^ Your control. Values:\n // \"draft\" — new or revised, needs review\n // \"question\" — blocked on user input, won't proceed without answer\n // \"approved\" — user approved\n // \"rejected\" — user rejected\n // \"deferred\" — postponed, skip for now\n //\n // Approved items are skipped on re-entry.\n\n \"agentNotes\": \"Context for the reviewer — why this requirement exists, caveats, trade-offs.\",\n // ^ Explain anything non-obvious. Link to code if relevant.\n\n \"userNotes\": \"\"\n // ^ Leave empty. The user writes back to you here.\n }\n ],\n\n /*\n * safeAssumptions — items the writer is confident the user will accept without\n * discussion: defaults, conventions, and obviously-correct behaviors that follow\n * directly from the design.\n *\n * NOT safe assumptions: anything novel, anything the writer is uncertain about,\n * or anything that would change with a small design tweak.\n *\n * Field shape: identical to a requirements item — same id pattern (REQ-NNN), same\n * ears structure, same criteria, same agentNotes. Use agentNotes to briefly justify\n * why each item qualifies as safe.\n */\n \"safeAssumptions\": [\n {\n \"id\": \"REQ-010\",\n \"title\": \"Default session timeout is 30 minutes\",\n \"ears\": {\n \"where\": \"Where no custom timeout is configured\",\n \"shall\": \"the system shall expire idle sessions after 30 minutes\"\n },\n \"criteria\": [\n { \"text\": \"Session expires after 30 minutes of inactivity\", \"checked\": false }\n ],\n \"status\": \"draft\",\n \"agentNotes\": \"Safe assumption: 30-minute idle timeout is a near-universal default and the design doc does not specify an alternative.\",\n \"userNotes\": \"\"\n }\n ]\n }\n ]\n}`;\n\n// ── Requirements markdown renderer ───────────────────────────────────\n\nfunction renderRequirementItem(out: string[], req: Record<string, unknown>): void {\n const item: string[] = [];\n\n item.push(`### ${req.id}: ${req.title}`);\n item.push('');\n item.push(`**Status:** ${req.status}`);\n item.push('');\n\n const ears = req.ears as Record<string, string> | undefined;\n if (ears) {\n const earsClauses: string[] = [];\n if (ears.when) earsClauses.push(ears.when);\n if (ears.while) earsClauses.push(ears.while);\n if (ears.if) earsClauses.push(ears.if);\n if (ears.where) earsClauses.push(ears.where);\n if (ears.shall) earsClauses.push(ears.shall);\n if (earsClauses.length > 0) {\n item.push(earsClauses.join(', '));\n item.push('');\n }\n }\n\n const criteria = req.criteria as Array<{ text: string; checked: boolean }> | undefined;\n if (criteria && criteria.length > 0) {\n item.push('**Acceptance Criteria:**');\n item.push('');\n for (const c of criteria) {\n item.push(`- [${c.checked ? 'x' : ' '}] ${c.text}`);\n }\n item.push('');\n }\n\n const agentNotes = req.agentNotes ? String(req.agentNotes).trim() : '';\n if (agentNotes) {\n item.push('**Agent Notes:**');\n item.push('');\n item.push(agentNotes);\n item.push('');\n }\n\n const userNotes = req.userNotes ? String(req.userNotes).trim() : '';\n if (userNotes) {\n item.push('**User Notes:**');\n item.push('');\n item.push(userNotes);\n item.push('');\n }\n\n while (item.length > 0 && item[item.length - 1] === '') item.pop();\n out.push(...item);\n}\n\nfunction renderRequirementsMarkdown(json: Record<string, unknown>): string {\n const meta = json.meta as Record<string, unknown>;\n const groups = json.groups as Array<Record<string, unknown>>;\n const out: string[] = [];\n\n const title = meta.title ? String(meta.title) : undefined;\n if (title) {\n out.push(`# ${title}`);\n out.push('');\n }\n if (meta.subtitle) {\n out.push(`*${meta.subtitle}*`);\n out.push('');\n }\n const draftParts: string[] = [];\n if (meta.draft) draftParts.push(`Draft ${meta.draft}`);\n if (meta.lastModified) draftParts.push(String(meta.lastModified));\n if (draftParts.length > 0) {\n out.push(draftParts.join(' — '));\n out.push('');\n }\n if (title || draftParts.length > 0) {\n out.push('---');\n out.push('');\n }\n if (meta.summary) {\n out.push(String(meta.summary));\n out.push('');\n }\n\n for (let gi = 0; gi < groups.length; gi++) {\n const group = groups[gi];\n\n if (gi > 0) {\n out.push('');\n out.push('');\n }\n\n out.push(`## ${group.name}`);\n out.push('');\n\n if (group.description) {\n out.push(String(group.description));\n out.push('');\n }\n\n if (group.context) {\n out.push(String(group.context));\n out.push('');\n }\n\n const requirements = group.requirements as Array<Record<string, unknown>>;\n for (let ri = 0; ri < requirements.length; ri++) {\n if (ri > 0) out.push('');\n renderRequirementItem(out, requirements[ri]);\n }\n\n const safeAssumptions = group.safeAssumptions as Array<Record<string, unknown>> | undefined;\n if (safeAssumptions && safeAssumptions.length > 0) {\n out.push('');\n out.push('### Safe Assumptions');\n out.push('');\n for (let si = 0; si < safeAssumptions.length; si++) {\n if (si > 0) out.push('');\n renderRequirementItem(out, safeAssumptions[si]);\n }\n }\n }\n\n return out.join('\\n') + '\\n';\n}\n","import type { Command } from 'commander';\nimport { basename } from 'node:path';\nimport { sendRequest } from '../client.js';\nimport { buildCompanionContext } from '../../tui/lib/context.js';\nimport { renderCompanion } from '../../shared/companion-render.js';\nimport { ACHIEVEMENTS } from '../../shared/companion-types.js';\nimport type { CompanionState, CompanionMemoryState, ObservationCategory, ObservationRecord } from '../../shared/companion-types.js';\nimport { MemoryStoreParseError } from '../../shared/companion-types.js';\nimport { createBadgeGallery, renderBadgeCard } from '../../shared/companion-badges.js';\nimport { loadMemoryStrict, sanitizeForDisplay } from '../../daemon/companion-memory.js';\nimport { showCommentaryPopup } from '../../daemon/companion-popup.js';\n\nconst CATEGORY_LABELS: Record<string, string> = {\n milestone: 'Milestone',\n session: 'Session',\n time: 'Time',\n behavioral: 'Behavioral',\n};\n\nconst CATEGORY_ORDER: Array<[ObservationCategory, string]> = [\n ['session-sentiments', 'Session Sentiments'],\n ['repo-impressions', 'Repo Impressions'],\n ['user-patterns', 'User Patterns'],\n ['notable-moments', 'Notable Moments'],\n];\n\nfunction formatTimestamp(iso: string): string {\n const d = new Date(iso);\n const hh = String(d.getHours()).padStart(2, '0');\n const mm = String(d.getMinutes()).padStart(2, '0');\n const ss = String(d.getSeconds()).padStart(2, '0');\n const yyyy = d.getFullYear();\n const mon = String(d.getMonth() + 1).padStart(2, '0');\n const dd = String(d.getDate()).padStart(2, '0');\n return `${hh}:${mm}:${ss} ${yyyy}-${mon}-${dd}`;\n}\n\nasync function runCompanionMemory(opts: { repo?: string }): Promise<void> {\n let state: CompanionMemoryState;\n try {\n state = loadMemoryStrict();\n } catch (err) {\n if (err instanceof MemoryStoreParseError) {\n process.stderr.write(`${err.message}\\n`);\n process.exitCode = 1;\n return;\n }\n throw err;\n }\n console.log(renderMemory(state, opts.repo));\n}\n\nexport function renderMemory(state: CompanionMemoryState, repo?: string): string {\n let observations: ObservationRecord[] = state.observations;\n if (repo !== undefined) {\n observations = observations.filter(obs => obs.repo === repo);\n }\n\n const grouped = new Map<ObservationCategory, ObservationRecord[]>();\n for (const [cat] of CATEGORY_ORDER) grouped.set(cat, []);\n for (const obs of observations) grouped.get(obs.category)?.push(obs);\n for (const [, recs] of grouped) recs.sort((a, b) => b.timestamp.localeCompare(a.timestamp));\n\n const lines: string[] = [];\n for (const [cat, label] of CATEGORY_ORDER) {\n const recs = grouped.get(cat) ?? [];\n if (recs.length > 0) {\n lines.push(`${label} (${recs.length})`);\n for (const rec of recs) {\n const ts = formatTimestamp(rec.timestamp);\n const src = `(${rec.source})`.padEnd(7);\n const text = sanitizeForDisplay(rec.text);\n const repoStr = rec.repo !== null ? `[${sanitizeForDisplay(basename(rec.repo))}]` : '[—]';\n lines.push(` [${ts}] ${src} ${text} ${repoStr}`);\n }\n } else {\n lines.push(label);\n lines.push(' (none)');\n }\n lines.push('');\n }\n if (lines[lines.length - 1] === '') lines.pop();\n\n const prunedStr = state.prunedAt !== null\n ? state.prunedAt.slice(0, 10)\n : 'never';\n lines.push('');\n lines.push(`${observations.length} observations total, last pruned ${prunedStr}`);\n\n return lines.join('\\n');\n}\n\nexport function registerCompanion(program: Command): void {\n const companion = program\n .command('companion')\n .description('Show companion profile and stats');\n\n // Default action — preserves existing bare `sisyphus companion` behavior\n companion\n .option('--name <name>', 'Set companion name')\n .option('--badges', 'Show badge gallery')\n .action(async (opts: { name?: string; badges?: boolean }) => {\n const res = await sendRequest({ type: 'companion', name: opts.name });\n if (!res.ok) {\n console.error(res.error);\n process.exit(1);\n }\n const companion = res.data as unknown as CompanionState;\n\n // Header: face + identity\n const face = renderCompanion(companion, ['face', 'boulder'], { color: true });\n const displayName = companion.name !== null ? companion.name : '(unnamed)';\n console.log();\n console.log(` ${face}`);\n console.log();\n console.log(` ${displayName} · Level ${companion.level} ${companion.title}`);\n console.log(` Mood: ${companion.mood} · XP: ${companion.xp}`);\n console.log();\n\n // Stats\n const s = companion.stats;\n const endH = Math.floor(s.endurance / 3_600_000);\n console.log(' Stats');\n console.log(` Strength ${s.strength} sessions`);\n console.log(` Endurance ${endH}h total active`);\n console.log(` Wisdom ${s.wisdom} efficient sessions`);\n console.log(` Patience ${s.patience} persistence score`);\n console.log();\n\n if (opts.badges) {\n // Full badge gallery\n const gallery = createBadgeGallery(companion.achievements);\n console.log(` Badges ${companion.achievements.length}/${ACHIEVEMENTS.length} earned`);\n console.log();\n\n for (let i = 0; i < gallery.total; i++) {\n const def = gallery.achievements[i]!;\n const unlock = gallery.unlocked.get(def.id) ?? null;\n const card = renderBadgeCard(def, unlock);\n for (const line of card.lines) {\n console.log(` ${line}`);\n }\n console.log();\n }\n } else {\n // Compact achievement list\n const unlocked = new Set(companion.achievements.map(a => a.id));\n const byCategory = new Map<string, typeof ACHIEVEMENTS>();\n for (const def of ACHIEVEMENTS) {\n const group = byCategory.get(def.category) ?? [];\n group.push(def);\n byCategory.set(def.category, group);\n }\n\n console.log(` Achievements ${companion.achievements.length}/${ACHIEVEMENTS.length} (use --badges for gallery)`);\n for (const [category, defs] of byCategory) {\n const label = CATEGORY_LABELS[category] ?? category;\n const unlockedCount = defs.filter(d => unlocked.has(d.id)).length;\n console.log(` ${label} (${unlockedCount}/${defs.length})`);\n for (const def of defs) {\n const icon = unlocked.has(def.id) ? '✓' : '·';\n console.log(` ${icon} ${def.name} — ${def.description}`);\n }\n }\n console.log();\n }\n\n // Repos\n const repos = Object.entries(companion.repos);\n if (repos.length > 0) {\n repos.sort(([, a], [, b]) => b.visits - a.visits);\n console.log(' Repositories');\n for (const [path, mem] of repos.slice(0, 10)) {\n const nick = mem.nickname ? ` \"${mem.nickname}\"` : '';\n const parts = [`${mem.visits} visits`, `${mem.completions} completions`];\n if (mem.crashes > 0) parts.push(`${mem.crashes} crashes`);\n console.log(` ${path}${nick}`);\n console.log(` ${parts.join(' · ')}`);\n }\n if (repos.length > 10) {\n console.log(` … and ${repos.length - 10} more`);\n }\n console.log();\n }\n\n // Commentary\n if (companion.lastCommentary) {\n console.log(` \"${companion.lastCommentary.text}\"`);\n console.log();\n }\n });\n\n // New: memory subcommand\n companion\n .command('memory')\n .description('Show accumulated companion observations grouped by category')\n .option('--repo <path>', 'Filter observations by repo path')\n .action(async (opts: { repo?: string }) => {\n await runCompanionMemory(opts);\n });\n\n companion\n .command('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 companion\n .command('popup-test')\n .description('Show a test commentary popup to validate feedback key handling')\n .option('--text <text>', 'Custom popup text', 'Cycle complete. Everything went exactly as planned. Nothing suspicious here.')\n .action((opts: { text: string }) => {\n const feedback = showCommentaryPopup(opts.text);\n if (feedback === null) {\n console.error('No feedback received (popup suppressed or not in tmux).');\n process.exitCode = 1;\n return;\n }\n if (feedback.rating === 'comment' && feedback.comment !== undefined) {\n console.log(`rating: comment \"${feedback.comment}\"`);\n } else {\n console.log(`rating: ${feedback.rating}${feedback.comment !== undefined ? ` comment: ${feedback.comment}` : ''}`);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { rawSend } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\n\nexport function attachNotify(diagnostic: Command): void {\n const notify = diagnostic\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 { execSync } from 'node:child_process';\nimport type { Command } from 'commander';\n\nexport function attachTmuxStatus(diagnostic: Command): void {\n diagnostic\n .command('tmux-status')\n .description('Output session status dots for tmux status bar')\n .action(() => {\n try {\n const status = execSync(\n 'tmux show-option -gv @sisyphus_status',\n { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] },\n ).trim();\n if (status) process.stdout.write(status);\n } catch {\n // Option not set or tmux error — output nothing\n }\n });\n}\n","import { execSync } from 'node:child_process';\nimport { readFileSync, existsSync } from 'node:fs';\nimport type { Command } from 'commander';\nimport { sessionsManifestPath } from '../../shared/paths.js';\n\ninterface ManifestEntry {\n type: 'S' | 'H' | 'O';\n tmuxName: string;\n cwd: string;\n phase: string | null;\n}\n\ninterface Manifest {\n updatedAt: number;\n sessions: ManifestEntry[];\n}\n\nconst DOT_MAP: Record<string, { icon: string; color: string }> = {\n 'orchestrator:processing': { icon: '●', color: '#d4ad6a' },\n 'orchestrator:idle': { icon: '●', color: '#d47766' },\n 'agents:running': { icon: '◆', color: '#d4ad6a' },\n 'between-cycles': { icon: '◆', color: '#5e584e' },\n 'paused': { icon: '○', color: '#d47766' },\n 'completed': { icon: '●', color: '#a9b16e' },\n};\n\nfunction readManifest(): Manifest | null {\n const p = sessionsManifestPath();\n if (!existsSync(p)) return null;\n try {\n return JSON.parse(readFileSync(p, 'utf-8')) as Manifest;\n } catch {\n return null;\n }\n}\n\nfunction tmuxExec(cmd: string): string | null {\n try {\n return execSync(cmd, { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();\n } catch {\n return null;\n }\n}\n\nexport function attachTmuxSessions(diagnostic: Command): void {\n diagnostic\n .command('tmux-sessions')\n .description('Output sisyphus session list for tmux status bar')\n .action(() => {\n const manifest = readManifest();\n if (!manifest) return;\n\n const currentSession = tmuxExec(\"tmux display-message -p '#{session_name}'\");\n\n // Find the cwd of the current session from the manifest\n const currentEntry = manifest.sessions.find(s => s.tmuxName === currentSession);\n if (!currentEntry) return;\n const cwd = currentEntry.cwd;\n\n // Filter to sessions matching this cwd\n const entries = manifest.sessions.filter(s => s.cwd === cwd);\n if (entries.length <= 1) return;\n\n const parts = entries.map(e => {\n const dot = e.phase ? DOT_MAP[e.phase] : null;\n const dotStr = dot ? ` #[fg=${dot.color}]${dot.icon}` : '';\n const displayName = e.tmuxName.replace(/^ssyph_[^_]+_/, '');\n const isCurrent = e.tmuxName === currentSession;\n\n if (isCurrent) {\n return `#[fg=#e2d9c6,bold]${displayName}${dotStr}#[default]`;\n }\n return `#[fg=#5e584e]${displayName}${dotStr}#[default]`;\n });\n\n process.stdout.write(parts.join('#[fg=#3a3d42] │ '));\n });\n}\n"],"mappings":"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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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","names":["existsSync","mkdirSync","readFileSync","dirname","join","fileURLToPath","execSync","execSync","existsSync","mkdirSync","readFileSync","unlinkSync","writeFileSync","homedir","join","args","execSync","execSync","join","homedir","existsSync","mkdirSync","writeFileSync","execSync","unlinkSync","resolve","readFileSync","rawSend","sleep","resolve","execSync","execSync","join","execSync","execSync","join","program","execSync","program","execSync","existsSync","readFileSync","session","agent","readFileSync","existsSync","execSync","program","basename","RESET","BOLD","DIM","program","readFileSync","readFileSync","program","submit","existsSync","readFileSync","homedir","join","ORCH_ALIASES","join","homedir","c","program","session","existsSync","readFileSync","program","existsSync","readFileSync","join","resolve","spawnSync","existsSync","readFileSync","dirname","resolve","program","existsSync","session","readFileSync","join","resolve","program","program","program","program","program","program","program","program","program","program","program","session","existsSync","join","resolve","readStdin","resolve","resolve","program","readStdin","join","existsSync","program","readStdin","program","readStdin","existsSync","readFileSync","program","existsSync","readFileSync","program","program","program","readStdin","program","program","execSync","execSync","existsSync","readFileSync","writeFileSync","homedir","dirname","join","fileURLToPath","execSync","plistPath","join","homedir","existsSync","writeFileSync","dirname","fileURLToPath","readFileSync","baleiaInstalled","execSync","program","program","execSync","existsSync","homedir","join","execSync","existsSync","join","homedir","program","c","existsSync","mkdirSync","writeFileSync","join","program","resolve","program","chmodSync","existsSync","mkdirSync","readFileSync","writeFileSync","createInterface","dirname","resolve","createInterface","program","existsSync","readFileSync","mkdirSync","dirname","writeFileSync","chmodSync","execSync","dirname","join","fileURLToPath","join","dirname","fileURLToPath","execSync","program","c","args","readFileSync","existsSync","resolve","RESET","BOLD","DIM","existsSync","readFileSync","session","c","resolve","program","program","session","rmSync","program","session","persistReq","rmSync","execSync","execSync","program","join","resolve","dirname","existsSync","readFileSync","writeFileSync","readdirSync","resolve","join","existsSync","readdirSync","session","program","readFileSync","dirname","writeFileSync","c","basename","basename","program","companion","diagnostic","rawSend","execSync","diagnostic","execSync","readFileSync","existsSync","existsSync","readFileSync","execSync","diagnostic","readFileSync","join","dirname","fileURLToPath","existsSync","mkdirSync"]}