sisyphi 1.1.17 → 1.1.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -48,8 +48,9 @@ The daemon handles the lifecycle: spawning panes, detecting when agents finish,
48
48
  ## Requirements
49
49
 
50
50
  - **Node.js** >= 22
51
- - **tmux** (you must be inside a tmux session)
51
+ - **tmux** >= 3.2 (you must be inside a tmux session)
52
52
  - **Claude Code** CLI (`claude`) installed and authenticated
53
+ - **Neovim** (optional — enables embedded editor in the dashboard)
53
54
 
54
55
  ## Install
55
56
 
@@ -57,9 +58,27 @@ The daemon handles the lifecycle: spawning panes, detecting when agents finish,
57
58
  npm install -g sisyphi
58
59
  ```
59
60
 
60
- The daemon starts automatically on first use via launchd. It auto-updates when new versions are published.
61
+ Then run one-time setup:
61
62
 
62
- ## Usage
63
+ ```bash
64
+ sisyphus setup
65
+ ```
66
+
67
+ This installs the background daemon (macOS launchd), tmux keybindings (`M-s` to cycle sessions, `M-S` for dashboard), and checks your environment. The daemon auto-updates when new versions are published.
68
+
69
+ Verify everything is working:
70
+
71
+ ```bash
72
+ sisyphus doctor
73
+ ```
74
+
75
+ ## Quick start
76
+
77
+ ```bash
78
+ sisyphus start "your task description" # Start a session
79
+ sisyphus dashboard # Open the TUI (auto-opens on start)
80
+ sisyphus status # Check session state from the CLI
81
+ ```
63
82
 
64
83
  Sisyphus is a CLI that Claude Code calls for you. You tell Claude to use it, and Claude handles the rest — calling `sisyphus start`, writing the task description, and kicking off the orchestration loop.
65
84
 
@@ -98,13 +117,161 @@ For large tasks, use the `sisyphus` CLI to orchestrate parallel agents.
98
117
  Run `sisyphus start "detailed task description"` inside tmux.
99
118
  ```
100
119
 
101
- ### Monitoring and stopping
120
+ ### Interactive tutorial
121
+
122
+ If you're new to tmux or sisyphus, run the guided walkthrough:
123
+
124
+ ```bash
125
+ sisyphus getting-started
126
+ ```
127
+
128
+ Six steps covering tmux basics, neovim essentials, sisyphus concepts, and a live demo session.
129
+
130
+ ## Dashboard
131
+
132
+ The dashboard is a full-screen TUI for monitoring and controlling sessions in real time.
102
133
 
103
134
  ```bash
104
- sisyphus status # Check session state
105
- sisyphus kill <session-id> # Stop everything
135
+ sisyphus dashboard # or press M-S (Alt-Shift-S)
106
136
  ```
107
137
 
138
+ It auto-opens when you `sisyphus start` a session.
139
+
140
+ **Layout:**
141
+
142
+ - **Left panel** — Session tree with collapsible hierarchy: sessions → cycles → agents → reports. Status indicators show active/completed/paused state at a glance.
143
+ - **Right panel** — Context-sensitive detail view for the selected node: session roadmap, agent instructions, report content, or live pane output. Opens files in an embedded neovim instance when available.
144
+ - **Bottom bar** — Current mode, keybinding hints, and transient notifications.
145
+
146
+ **Key bindings:**
147
+
148
+ | Key | Action |
149
+ |-----|--------|
150
+ | `j/k` or `↑/↓` | Navigate tree / scroll detail |
151
+ | `h/l` or `←/→` | Collapse/expand nodes |
152
+ | `n` | New session (compose mode) |
153
+ | `R` | Resume a paused/completed session |
154
+ | `w` | Jump to session's tmux window |
155
+ | `g` | Edit goal |
156
+ | `p` | Open roadmap |
157
+ | `m` | Message orchestrator |
158
+ | `r` | Re-run agent |
159
+ | `x` | Restart agent |
160
+ | `Space` | Leader menu (copy, delete, spawn agent, shell, etc.) |
161
+ | `Tab` | Cycle panel focus |
162
+ | `/` | Search sessions |
163
+ | `?` | Help overlay |
164
+
165
+ Compose mode opens a temp file in the embedded neovim for multi-line input (new sessions, messages, resume instructions). Falls back to tmux popups if neovim isn't available.
166
+
167
+ ## Agent types
168
+
169
+ Agents can be spawned with role templates that define their model, behavior, and capabilities. The orchestrator discovers available types automatically and uses them to match the right agent to each subtask.
170
+
171
+ ### Built-in types
172
+
173
+ Sisyphus ships these agent types:
174
+
175
+ | Type | Description |
176
+ |------|-------------|
177
+ | `sisyphus:worker` | Generic agent (default) |
178
+ | `sisyphus:plan` | Plan lead — breaks work into phases |
179
+ | `sisyphus:design` | Technical design and architecture |
180
+ | `sisyphus:requirements` | EARS-based requirements analysis |
181
+ | `sisyphus:problem` | Problem exploration and assumption challenging |
182
+ | `sisyphus:review` | Code review |
183
+ | `sisyphus:review-plan` | Plan review with parallel sub-reviewers |
184
+ | `sisyphus:debug` | Systematic debugging investigation |
185
+ | `sisyphus:explore` | Lightweight code exploration |
186
+ | `sisyphus:operator` | QA/testing with browser automation |
187
+ | `sisyphus:test-spec` | Test specification writing |
188
+
189
+ ### Custom agent types
190
+
191
+ Define your own by creating a markdown file with YAML frontmatter:
192
+
193
+ ```markdown
194
+ ---
195
+ name: security-reviewer
196
+ description: Reviews code for security vulnerabilities
197
+ model: opus
198
+ color: red
199
+ effort: high
200
+ skills: [capture]
201
+ permissionMode: bypassPermissions
202
+ interactive: false
203
+ ---
204
+
205
+ You are a security-focused code reviewer. Analyze the code for OWASP top 10
206
+ vulnerabilities, injection risks, auth bypasses, and data exposure...
207
+ ```
208
+
209
+ **Resolution order** (first match wins):
210
+ 1. `.claude/agents/{name}.md` (project-local)
211
+ 2. `~/.claude/agents/{name}.md` (user-global)
212
+ 3. Bundled `sisyphus:{name}`
213
+ 4. Installed Claude Code plugins
214
+
215
+ ### Frontmatter options
216
+
217
+ | Field | Description |
218
+ |-------|-------------|
219
+ | `model` | LLM model (`opus`, `sonnet`, `gpt-4`, `codex-mini`, etc.) |
220
+ | `color` | Tmux pane border color |
221
+ | `effort` | `low` / `medium` / `high` / `max` |
222
+ | `interactive` | `true` = agent can pause for user input |
223
+ | `skills` | Claude Code skills to enable |
224
+ | `permissionMode` | Permission handling mode |
225
+
226
+ Models prefixed with `gpt-` or `codex-` automatically route to the OpenAI provider (Codex CLI).
227
+
228
+ ## Tmux integration
229
+
230
+ ### Status bar
231
+
232
+ The daemon renders a live status indicator into your tmux status bar showing all sessions scoped to the current working directory:
233
+
234
+ - **Yellow dot** — orchestrator processing
235
+ - **Yellow diamond** — agents running
236
+ - **Green dot** — session completed
237
+ - **Red dot** — waiting for input
238
+ - **Gray** — idle / between cycles
239
+
240
+ Session phases update every 5 seconds. The currently focused session is highlighted.
241
+
242
+ ### Keybindings
243
+
244
+ Installed by `sisyphus setup` into `~/.sisyphus/tmux.conf`:
245
+
246
+ | Key | Action |
247
+ |-----|--------|
248
+ | `M-s` | Cycle through sisyphus sessions in current project |
249
+ | `M-S` | Jump to dashboard window |
250
+ | `prefix-x` | Smart kill — kills pane or session depending on context |
251
+
252
+ ### Native notifications (macOS)
253
+
254
+ On macOS, sisyphus builds a native notification helper (`SisyphusNotify.app`) during install. Notifications fire on session completion, agent crashes, and other lifecycle events. Clicking a notification switches your terminal to the relevant session.
255
+
256
+ Falls back to `terminal-notifier` or `osascript` if the native app isn't available.
257
+
258
+ ## Companion
259
+
260
+ The companion is a persistent character that tracks your work across sessions. It earns XP, levels up (30 levels from *Boulder Intern* to *The Absurd Hero*), unlocks achievements, and shifts mood based on your usage patterns — time of day, session length, crash frequency, efficiency.
261
+
262
+ It manifests as:
263
+ - A mood-colored face in the tmux status bar (updates in real time)
264
+ - Commentary on lifecycle events (session start, level-up, late-night coding) generated by Haiku
265
+ - An achievement gallery with 66 unlockable badges across milestone, session, time, and behavioral categories
266
+
267
+ ```bash
268
+ sisyphus companion # View profile, stats, and achievements
269
+ sisyphus companion --badges # Full achievement gallery
270
+ sisyphus companion --name Bub # Rename your companion
271
+ ```
272
+
273
+ In the dashboard, press `Space` → `c` to open the companion overlay.
274
+
108
275
  ## Configuration
109
276
 
110
277
  Project (`.sisyphus/config.json`) overrides global (`~/.sisyphus/config.json`):
@@ -112,10 +279,45 @@ Project (`.sisyphus/config.json`) overrides global (`~/.sisyphus/config.json`):
112
279
  ```json
113
280
  {
114
281
  "model": "sonnet",
115
- "autoUpdate": true
282
+ "orchestratorEffort": "high",
283
+ "agentEffort": "medium",
284
+ "pollIntervalMs": 5000,
285
+ "autoUpdate": true,
286
+ "notifications": {
287
+ "enabled": true,
288
+ "sound": "/System/Library/Sounds/Hero.aiff"
289
+ }
116
290
  }
117
291
  ```
118
292
 
293
+ | Option | Default | Description |
294
+ |--------|---------|-------------|
295
+ | `model` | *(Claude Code default)* | LLM model for orchestrator and agents |
296
+ | `orchestratorEffort` | `high` | Effort level for orchestrator (`low`/`medium`/`high`/`max`) |
297
+ | `agentEffort` | `medium` | Effort level for agents |
298
+ | `orchestratorPrompt` | *(built-in)* | Path to custom orchestrator system prompt |
299
+ | `pollIntervalMs` | `5000` | Daemon poll interval in milliseconds |
300
+ | `autoUpdate` | — | Auto-update via npm on new releases |
301
+ | `notifications.enabled` | `true` | Desktop notifications on lifecycle events |
302
+ | `notifications.sound` | macOS Hero | Notification sound file path |
303
+ | `requiredPlugins` | `[devcore]` | Claude Code plugins to auto-install for agents |
304
+
305
+ ## CLI reference
306
+
307
+ **Session lifecycle:**
308
+ `start`, `kill`, `resume`, `continue`, `rollback`, `complete`
309
+
310
+ **Agent & orchestrator interaction:**
311
+ `spawn`, `submit`, `report`, `yield`, `message`, `restart-agent`, `update-task`
312
+
313
+ **Monitoring:**
314
+ `status` (`--verbose`), `list` (`--all`), `dashboard`
315
+
316
+ **Setup & utilities:**
317
+ `setup`, `init`, `doctor`, `getting-started`, `companion`, `uninstall`
318
+
319
+ Run `sisyphus --help` or `sisyphus <command> --help` for full usage.
320
+
119
321
  ## License
120
322
 
121
323
  MIT
@@ -46,8 +46,8 @@ function execEnv() {
46
46
  // src/shared/exec.ts
47
47
  import { execSync } from "child_process";
48
48
  var EXEC_ENV = execEnv();
49
- function exec(cmd, cwd) {
50
- return execSync(cmd, { encoding: "utf-8", env: EXEC_ENV, cwd }).trim();
49
+ function exec(cmd, cwd, timeoutMs = 3e4) {
50
+ return execSync(cmd, { encoding: "utf-8", env: EXEC_ENV, cwd, timeout: timeoutMs }).trim();
51
51
  }
52
52
  function execSafe(cmd, cwd) {
53
53
  try {
@@ -64,4 +64,4 @@ export {
64
64
  exec,
65
65
  execSafe
66
66
  };
67
- //# sourceMappingURL=chunk-6TIO23U3.js.map
67
+ //# sourceMappingURL=chunk-22ZGZTGY.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shared/env.ts","../src/shared/exec.ts"],"sourcesContent":["import { resolve } from 'node:path';\n\n/**\n * Build a PATH string that includes common binary directories\n * across package managers and platforms.\n *\n * Prepends known directories that exist on the system to the current PATH.\n * This ensures tmux commands can find binaries installed by Homebrew,\n * MacPorts, nix, and other package managers.\n */\nexport function augmentedPath(): string {\n const rawPath = process.env['PATH'];\n const basePath = rawPath !== undefined && rawPath.length > 0 ? rawPath : '/usr/bin:/bin';\n\n // Common binary directories across platforms/package managers.\n // Only prepend ones that aren't already in PATH.\n const home = process.env['HOME'];\n const candidates = [\n ...(home ? [`${home}/.local/bin`] : []), // Claude CLI, pipx, user-local installs\n resolve(process.execPath, '..'), // Node.js bin dir (ensures node/npm available)\n '/opt/homebrew/bin', // Homebrew (Apple Silicon macOS)\n '/opt/homebrew/sbin', // Homebrew sbin\n '/usr/local/bin', // Homebrew (Intel macOS), manual installs\n '/usr/local/sbin', // Manual installs\n '/opt/local/bin', // MacPorts\n '/opt/local/sbin', // MacPorts\n '/home/linuxbrew/.linuxbrew/bin', // Linuxbrew\n ];\n\n // Check for nix profile paths\n const nixProfile = process.env['NIX_PROFILES'];\n if (nixProfile) {\n for (const p of nixProfile.split(' ').reverse()) {\n candidates.push(`${p}/bin`);\n }\n }\n\n const existing = new Set(basePath.split(':'));\n const prepend = candidates.filter(dir => !existing.has(dir));\n\n return prepend.length > 0 ? `${prepend.join(':')}:${basePath}` : basePath;\n}\n\n/**\n * Environment variables for child processes that need access to\n * user-installed binaries (tmux, git, claude, etc.).\n */\nexport function execEnv(): Record<string, string | undefined> {\n return {\n ...process.env,\n PATH: augmentedPath(),\n };\n}\n","import { execSync } from 'node:child_process';\nimport { execEnv } from './env.js';\n\nexport const EXEC_ENV = execEnv();\n\nexport function exec(cmd: string, cwd?: string): string {\n return execSync(cmd, { encoding: 'utf-8', env: EXEC_ENV, cwd }).trim();\n}\n\nexport function execSafe(cmd: string, cwd?: string): string | null {\n try {\n return execSync(cmd, { encoding: 'utf-8', env: EXEC_ENV, cwd, stdio: ['pipe', 'pipe', 'pipe'] }).trim();\n } catch { return null; }\n}\n"],"mappings":";;;AAAA,SAAS,eAAe;AAUjB,SAAS,gBAAwB;AACtC,QAAM,UAAU,QAAQ,IAAI,MAAM;AAClC,QAAM,WAAW,YAAY,UAAa,QAAQ,SAAS,IAAI,UAAU;AAIzE,QAAM,OAAO,QAAQ,IAAI,MAAM;AAC/B,QAAM,aAAa;AAAA,IACjB,GAAI,OAAO,CAAC,GAAG,IAAI,aAAa,IAAI,CAAC;AAAA;AAAA,IACrC,QAAQ,QAAQ,UAAU,IAAI;AAAA;AAAA,IAC9B;AAAA;AAAA,IACA;AAAA;AAAA,IACA;AAAA;AAAA,IACA;AAAA;AAAA,IACA;AAAA;AAAA,IACA;AAAA;AAAA,IACA;AAAA;AAAA,EACF;AAGA,QAAM,aAAa,QAAQ,IAAI,cAAc;AAC7C,MAAI,YAAY;AACd,eAAW,KAAK,WAAW,MAAM,GAAG,EAAE,QAAQ,GAAG;AAC/C,iBAAW,KAAK,GAAG,CAAC,MAAM;AAAA,IAC5B;AAAA,EACF;AAEA,QAAM,WAAW,IAAI,IAAI,SAAS,MAAM,GAAG,CAAC;AAC5C,QAAM,UAAU,WAAW,OAAO,SAAO,CAAC,SAAS,IAAI,GAAG,CAAC;AAE3D,SAAO,QAAQ,SAAS,IAAI,GAAG,QAAQ,KAAK,GAAG,CAAC,IAAI,QAAQ,KAAK;AACnE;AAMO,SAAS,UAA8C;AAC5D,SAAO;AAAA,IACL,GAAG,QAAQ;AAAA,IACX,MAAM,cAAc;AAAA,EACtB;AACF;;;ACpDA,SAAS,gBAAgB;AAGlB,IAAM,WAAW,QAAQ;AAEzB,SAAS,KAAK,KAAa,KAAsB;AACtD,SAAO,SAAS,KAAK,EAAE,UAAU,SAAS,KAAK,UAAU,IAAI,CAAC,EAAE,KAAK;AACvE;AAEO,SAAS,SAAS,KAAa,KAA6B;AACjE,MAAI;AACF,WAAO,SAAS,KAAK,EAAE,UAAU,SAAS,KAAK,UAAU,KAAK,OAAO,CAAC,QAAQ,QAAQ,MAAM,EAAE,CAAC,EAAE,KAAK;AAAA,EACxG,QAAQ;AAAE,WAAO;AAAA,EAAM;AACzB;","names":[]}
1
+ {"version":3,"sources":["../src/shared/env.ts","../src/shared/exec.ts"],"sourcesContent":["import { resolve } from 'node:path';\n\n/**\n * Build a PATH string that includes common binary directories\n * across package managers and platforms.\n *\n * Prepends known directories that exist on the system to the current PATH.\n * This ensures tmux commands can find binaries installed by Homebrew,\n * MacPorts, nix, and other package managers.\n */\nexport function augmentedPath(): string {\n const rawPath = process.env['PATH'];\n const basePath = rawPath !== undefined && rawPath.length > 0 ? rawPath : '/usr/bin:/bin';\n\n // Common binary directories across platforms/package managers.\n // Only prepend ones that aren't already in PATH.\n const home = process.env['HOME'];\n const candidates = [\n ...(home ? [`${home}/.local/bin`] : []), // Claude CLI, pipx, user-local installs\n resolve(process.execPath, '..'), // Node.js bin dir (ensures node/npm available)\n '/opt/homebrew/bin', // Homebrew (Apple Silicon macOS)\n '/opt/homebrew/sbin', // Homebrew sbin\n '/usr/local/bin', // Homebrew (Intel macOS), manual installs\n '/usr/local/sbin', // Manual installs\n '/opt/local/bin', // MacPorts\n '/opt/local/sbin', // MacPorts\n '/home/linuxbrew/.linuxbrew/bin', // Linuxbrew\n ];\n\n // Check for nix profile paths\n const nixProfile = process.env['NIX_PROFILES'];\n if (nixProfile) {\n for (const p of nixProfile.split(' ').reverse()) {\n candidates.push(`${p}/bin`);\n }\n }\n\n const existing = new Set(basePath.split(':'));\n const prepend = candidates.filter(dir => !existing.has(dir));\n\n return prepend.length > 0 ? `${prepend.join(':')}:${basePath}` : basePath;\n}\n\n/**\n * Environment variables for child processes that need access to\n * user-installed binaries (tmux, git, claude, etc.).\n */\nexport function execEnv(): Record<string, string | undefined> {\n return {\n ...process.env,\n PATH: augmentedPath(),\n };\n}\n","import { execSync } from 'node:child_process';\nimport { execEnv } from './env.js';\n\nexport const EXEC_ENV = execEnv();\n\nexport function exec(cmd: string, cwd?: string, timeoutMs: number = 30_000): string {\n return execSync(cmd, { encoding: 'utf-8', env: EXEC_ENV, cwd, timeout: timeoutMs }).trim();\n}\n\nexport function execSafe(cmd: string, cwd?: string): string | null {\n try {\n return execSync(cmd, { encoding: 'utf-8', env: EXEC_ENV, cwd, stdio: ['pipe', 'pipe', 'pipe'] }).trim();\n } catch { return null; }\n}\n"],"mappings":";;;AAAA,SAAS,eAAe;AAUjB,SAAS,gBAAwB;AACtC,QAAM,UAAU,QAAQ,IAAI,MAAM;AAClC,QAAM,WAAW,YAAY,UAAa,QAAQ,SAAS,IAAI,UAAU;AAIzE,QAAM,OAAO,QAAQ,IAAI,MAAM;AAC/B,QAAM,aAAa;AAAA,IACjB,GAAI,OAAO,CAAC,GAAG,IAAI,aAAa,IAAI,CAAC;AAAA;AAAA,IACrC,QAAQ,QAAQ,UAAU,IAAI;AAAA;AAAA,IAC9B;AAAA;AAAA,IACA;AAAA;AAAA,IACA;AAAA;AAAA,IACA;AAAA;AAAA,IACA;AAAA;AAAA,IACA;AAAA;AAAA,IACA;AAAA;AAAA,EACF;AAGA,QAAM,aAAa,QAAQ,IAAI,cAAc;AAC7C,MAAI,YAAY;AACd,eAAW,KAAK,WAAW,MAAM,GAAG,EAAE,QAAQ,GAAG;AAC/C,iBAAW,KAAK,GAAG,CAAC,MAAM;AAAA,IAC5B;AAAA,EACF;AAEA,QAAM,WAAW,IAAI,IAAI,SAAS,MAAM,GAAG,CAAC;AAC5C,QAAM,UAAU,WAAW,OAAO,SAAO,CAAC,SAAS,IAAI,GAAG,CAAC;AAE3D,SAAO,QAAQ,SAAS,IAAI,GAAG,QAAQ,KAAK,GAAG,CAAC,IAAI,QAAQ,KAAK;AACnE;AAMO,SAAS,UAA8C;AAC5D,SAAO;AAAA,IACL,GAAG,QAAQ;AAAA,IACX,MAAM,cAAc;AAAA,EACtB;AACF;;;ACpDA,SAAS,gBAAgB;AAGlB,IAAM,WAAW,QAAQ;AAEzB,SAAS,KAAK,KAAa,KAAc,YAAoB,KAAgB;AAClF,SAAO,SAAS,KAAK,EAAE,UAAU,SAAS,KAAK,UAAU,KAAK,SAAS,UAAU,CAAC,EAAE,KAAK;AAC3F;AAEO,SAAS,SAAS,KAAa,KAA6B;AACjE,MAAI;AACF,WAAO,SAAS,KAAK,EAAE,UAAU,SAAS,KAAK,UAAU,KAAK,OAAO,CAAC,QAAQ,QAAQ,MAAM,EAAE,CAAC,EAAE,KAAK;AAAA,EACxG,QAAQ;AAAE,WAAO;AAAA,EAAM;AACzB;","names":[]}
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  loadConfig
4
- } from "./chunk-IF55HPWX.js";
4
+ } from "./chunk-V36NXMHP.js";
5
5
 
6
6
  // src/daemon/plugins.ts
7
7
  import { readFileSync } from "fs";
@@ -43,4 +43,4 @@ export {
43
43
  resolveInstalledPlugin,
44
44
  resolveRequiredPluginDirs
45
45
  };
46
- //# sourceMappingURL=chunk-UIVQXCWB.js.map
46
+ //# sourceMappingURL=chunk-6PJVJEYQ.js.map