sisyphi 0.1.3 → 0.1.5
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 +103 -33
- package/dist/cli.js +35 -0
- package/dist/cli.js.map +1 -1
- package/dist/daemon.js +114 -30
- package/dist/daemon.js.map +1 -1
- package/dist/templates/orchestrator-plugin/scripts/stop-suggest.sh +9 -1
- package/package.json +1 -1
- package/templates/orchestrator-plugin/scripts/stop-suggest.sh +9 -1
package/README.md
CHANGED
|
@@ -1,13 +1,31 @@
|
|
|
1
1
|
```
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
2
|
+
╔═══════════════════════════════════════════════════════╗
|
|
3
|
+
║ @@@@@@@@@@@@@@@@@@@@@@@@@@@%%%#*++**#%%@@@@@@@@@@@@@@ ║
|
|
4
|
+
║ @@@@@@@@@@@@@@@@@@@@@@@@%*====-----::::-:=%@@@@@@@@@@ ║
|
|
5
|
+
║ @@@@@@@@@@@@@@@@@@@@@%#=:.:-=------:... -%@@@@@@@@ ║
|
|
6
|
+
║ @@@@@@@@@@@@@@@@@@%%#= .....:-:.......... *%@@@@@@ ║
|
|
7
|
+
║ @@@@@@@@@@@@@@%+==-+%*: .:---::::....:.... #@@@@@@ ║
|
|
8
|
+
║ @@@@@@@@@@@@%#:. ..:. ..:-...:..... . :%@@@@@@ ║
|
|
9
|
+
║ @@@@@@@@@@@@#:.:.. :*= ............ . :%@@@@@@ ║
|
|
10
|
+
║ @@@@@@@@@@@@#--:.. -%+............... .. *%#=-:.: ║
|
|
11
|
+
║ @@@@@@@@@@%#----.:#%+.::::... ..... .... .:# ║
|
|
12
|
+
║ @@@@@@@@%+-:::.. :%@@@@@@@@%*=: ..*%@ ║
|
|
13
|
+
║ @@@@@@%*-=:..::.:-..+@@@@@@%%#=:. .. . ... *@@@ ║
|
|
14
|
+
║ @@@@#==::%@@@@@@%=:::=%*-:. .... . ... :%@@@@ ║
|
|
15
|
+
║ @@#::=#@@@@%#-.:-... .::... :#%@@@@@ ║
|
|
16
|
+
║ %=:%%%#####+:.: . ..... . . *%@@@@@@@ ║
|
|
17
|
+
║ :::.:.:::..::. . .. :#@@@@@@@ ║
|
|
18
|
+
║ %#*++===--============++===-::::::::---=====#%@@@@@@@ ║
|
|
19
|
+
║ _____ _____ _______ _______ _ _ _ _ _____ ║
|
|
20
|
+
║ / ___|_ _/ ___\ \ / / ___ \ | | | | | / ___| ║
|
|
21
|
+
║ \ `--. | | \ `--. \ V /| |_/ / |_| | | | \ `--. ║
|
|
22
|
+
║ `--. \ | | `--. \ \ / | __/| _ | | | |`--. \ ║
|
|
23
|
+
║ /\__/ /_| |_/\__/ / | | | | | | | | |_| /\__/ / ║
|
|
24
|
+
║ \____/ \___/\____/ \_/ \_| \_| |_/\___/\____/ ║
|
|
25
|
+
╚═══════════════════════════════════════════════════════╝
|
|
8
26
|
```
|
|
9
27
|
|
|
10
|
-
#
|
|
28
|
+
# sisyphus
|
|
11
29
|
|
|
12
30
|
A tmux-integrated orchestration daemon for [Claude Code](https://docs.anthropic.com/en/docs/claude-code) multi-agent workflows.
|
|
13
31
|
|
|
@@ -38,7 +56,7 @@ You ──► sisyphus start "build auth system"
|
|
|
38
56
|
```
|
|
39
57
|
|
|
40
58
|
1. **You** run `sisyphus start` with a high-level task
|
|
41
|
-
2. **Orchestrator** decomposes it,
|
|
59
|
+
2. **Orchestrator** decomposes it, spawns agents, yields
|
|
42
60
|
3. **Agents** work in parallel tmux panes, send progress reports, submit when done
|
|
43
61
|
4. **Daemon** detects completion, respawns orchestrator with updated state
|
|
44
62
|
5. **Orchestrator** reviews reports, spawns more agents or completes the session
|
|
@@ -63,7 +81,7 @@ This gives you two commands:
|
|
|
63
81
|
|
|
64
82
|
### Claude Code Plugin (optional)
|
|
65
83
|
|
|
66
|
-
The companion plugin on the [crouton-kit](https://github.com/CaptainCrouton89/crouton-kit) marketplace adds
|
|
84
|
+
The companion plugin on the [crouton-kit](https://github.com/CaptainCrouton89/crouton-kit) marketplace adds specialized agent types and an orchestration skill with task breakdown patterns for common workflows (bug fixes, feature builds, refactors, reviews, etc.).
|
|
67
85
|
|
|
68
86
|
```bash
|
|
69
87
|
claude plugins install CaptainCrouton89/crouton-kit sisyphus
|
|
@@ -79,7 +97,9 @@ This makes `sisyphus:debug`, `sisyphus:implement`, `sisyphus:plan`, and other ag
|
|
|
79
97
|
sisyphusd
|
|
80
98
|
```
|
|
81
99
|
|
|
82
|
-
|
|
100
|
+
The daemon also supports `sisyphusd stop` and `sisyphusd restart` subcommands.
|
|
101
|
+
|
|
102
|
+
To run it persistently on macOS, use launchd — create `~/Library/LaunchAgents/com.sisyphus.daemon.plist`:
|
|
83
103
|
|
|
84
104
|
```xml
|
|
85
105
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
@@ -110,6 +130,13 @@ Then load it:
|
|
|
110
130
|
launchctl load ~/Library/LaunchAgents/com.sisyphus.daemon.plist
|
|
111
131
|
```
|
|
112
132
|
|
|
133
|
+
To unload and clean up:
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
sisyphus uninstall # Unload from launchd
|
|
137
|
+
sisyphus uninstall --purge # Also remove ~/.sisyphus data
|
|
138
|
+
```
|
|
139
|
+
|
|
113
140
|
### 2. Start a session (inside tmux)
|
|
114
141
|
|
|
115
142
|
```bash
|
|
@@ -121,23 +148,19 @@ The orchestrator spawns in a yellow tmux pane and begins planning.
|
|
|
121
148
|
### 3. Watch it work
|
|
122
149
|
|
|
123
150
|
```bash
|
|
124
|
-
sisyphus status
|
|
125
|
-
sisyphus
|
|
151
|
+
sisyphus status # Check session state and agents
|
|
152
|
+
sisyphus list # List sessions in current project
|
|
153
|
+
sisyphus list --all # List sessions across all projects
|
|
126
154
|
```
|
|
127
155
|
|
|
128
|
-
Agent panes appear as the orchestrator spawns them, color-coded by
|
|
129
|
-
|
|
130
|
-
| Role | Color |
|
|
131
|
-
|------|-------|
|
|
132
|
-
| Orchestrator | Yellow |
|
|
133
|
-
| Agents | Blue, Green, Magenta, Cyan, Red, White (rotating) |
|
|
156
|
+
Agent panes appear as the orchestrator spawns them, color-coded by role. Agent types from the crouton-kit plugin define their own colors via frontmatter; otherwise agents rotate through blue, green, magenta, cyan, red, and white.
|
|
134
157
|
|
|
135
158
|
### 4. Resume or complete
|
|
136
159
|
|
|
137
160
|
```bash
|
|
138
161
|
sisyphus resume <session-id> # Resume a paused session
|
|
139
162
|
sisyphus resume <session-id> "focus on tests" # Resume with new instructions
|
|
140
|
-
sisyphus
|
|
163
|
+
sisyphus kill <session-id> # Kill a session and all agents
|
|
141
164
|
```
|
|
142
165
|
|
|
143
166
|
## CLI Reference
|
|
@@ -145,25 +168,56 @@ sisyphus list # List all sessions
|
|
|
145
168
|
```bash
|
|
146
169
|
# Session lifecycle
|
|
147
170
|
sisyphus start "task description" # Create session, launch orchestrator
|
|
148
|
-
sisyphus status
|
|
149
|
-
sisyphus list
|
|
171
|
+
sisyphus status [session-id] # Session state (defaults to active session)
|
|
172
|
+
sisyphus list [-a, --all] # List sessions (--all for cross-project)
|
|
150
173
|
sisyphus resume <id> [message] # Resume paused session
|
|
151
|
-
sisyphus kill <id> # Kill
|
|
174
|
+
sisyphus kill <id> # Kill session and all agents
|
|
175
|
+
sisyphus uninstall [--purge] [-y] # Unload daemon from launchd
|
|
176
|
+
|
|
177
|
+
# Daemon management
|
|
178
|
+
sisyphusd # Start the daemon
|
|
179
|
+
sisyphusd stop # Stop the daemon
|
|
180
|
+
sisyphusd restart # Restart the daemon
|
|
152
181
|
|
|
153
|
-
#
|
|
182
|
+
# Used by the orchestrator/agents (not typically run manually):
|
|
154
183
|
sisyphus spawn --agent-type <t> --name <n> --instruction "..."
|
|
155
|
-
sisyphus
|
|
184
|
+
sisyphus spawn --agent-type <t> --name <n> --instruction "..." --worktree
|
|
185
|
+
sisyphus yield [--prompt "next cycle context"]
|
|
156
186
|
sisyphus complete --report "summary" # Mark session done
|
|
157
187
|
sisyphus submit --report "findings" # Agent submits final report
|
|
158
188
|
sisyphus report --message "progress" # Agent sends progress update
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
Both `yield`, `submit`, and `report` support stdin piping for long content:
|
|
159
192
|
|
|
160
|
-
|
|
161
|
-
sisyphus
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
193
|
+
```bash
|
|
194
|
+
echo "detailed report" | sisyphus submit
|
|
195
|
+
echo "progress update" | sisyphus report
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
## Git Worktree Isolation
|
|
199
|
+
|
|
200
|
+
Agents can work in isolated git worktrees to avoid conflicts when multiple agents edit files in parallel:
|
|
201
|
+
|
|
202
|
+
```bash
|
|
203
|
+
sisyphus spawn --agent-type sisyphus:implement --name "auth" \
|
|
204
|
+
--instruction "implement auth module" --worktree
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
With `--worktree`, the daemon:
|
|
208
|
+
1. Creates a new branch (`sisyphus/{session}/{agent-id}`) and worktree
|
|
209
|
+
2. Symlinks `.sisyphus` and `.claude` directories into the worktree
|
|
210
|
+
3. Runs bootstrap commands from `.sisyphus/worktree.json` (copy files, install deps, etc.)
|
|
211
|
+
4. Automatically merges the agent's branch back when the agent submits
|
|
212
|
+
|
|
213
|
+
Configure worktree bootstrap in `.sisyphus/worktree.json`:
|
|
214
|
+
|
|
215
|
+
```json
|
|
216
|
+
{
|
|
217
|
+
"symlink": [".env", "node_modules"],
|
|
218
|
+
"copy": ["package.json"],
|
|
219
|
+
"init": "npm install"
|
|
220
|
+
}
|
|
167
221
|
```
|
|
168
222
|
|
|
169
223
|
## Architecture
|
|
@@ -174,7 +228,22 @@ Three layers communicating over a Unix socket (`~/.sisyphus/daemon.sock`):
|
|
|
174
228
|
- **Daemon** (`sisyphusd`) — Manages sessions, spawns/monitors tmux panes, tracks state
|
|
175
229
|
- **Shared** — Types, protocol definitions, config resolution
|
|
176
230
|
|
|
177
|
-
State
|
|
231
|
+
### State & Persistence
|
|
232
|
+
|
|
233
|
+
State is persisted as JSON at `.sisyphus/sessions/{id}/state.json` (project-relative), written atomically via temp file + rename.
|
|
234
|
+
|
|
235
|
+
Each session directory contains:
|
|
236
|
+
```
|
|
237
|
+
.sisyphus/sessions/{id}/
|
|
238
|
+
├── state.json # Session state (atomic writes)
|
|
239
|
+
├── plan.md # Orchestrator memory — outstanding work
|
|
240
|
+
├── logs.md # Orchestrator memory — session log
|
|
241
|
+
├── prompts/ # Rendered system + user prompt files
|
|
242
|
+
├── reports/ # Agent report files
|
|
243
|
+
└── context/ # Persistent artifacts (specs, plans, explorations)
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
The orchestrator maintains `plan.md` and `logs.md` across cycles as persistent memory — these survive orchestrator respawns and give each new cycle continuity with previous work.
|
|
178
247
|
|
|
179
248
|
## Configuration
|
|
180
249
|
|
|
@@ -183,7 +252,8 @@ Config is layered: project (`.sisyphus/config.json`) overrides global (`~/.sisyp
|
|
|
183
252
|
```json
|
|
184
253
|
{
|
|
185
254
|
"model": "sonnet",
|
|
186
|
-
"pollIntervalMs":
|
|
255
|
+
"pollIntervalMs": 1000,
|
|
256
|
+
"tmuxSession": "my-session"
|
|
187
257
|
}
|
|
188
258
|
```
|
|
189
259
|
|
package/dist/cli.js
CHANGED
|
@@ -262,6 +262,9 @@ function registerSpawn(program2) {
|
|
|
262
262
|
});
|
|
263
263
|
}
|
|
264
264
|
|
|
265
|
+
// src/cli/commands/submit.ts
|
|
266
|
+
import { execSync as execSync3 } from "child_process";
|
|
267
|
+
|
|
265
268
|
// src/cli/stdin.ts
|
|
266
269
|
function readStdin() {
|
|
267
270
|
if (process.stdin.isTTY) return Promise.resolve(null);
|
|
@@ -277,6 +280,23 @@ function readStdin() {
|
|
|
277
280
|
}
|
|
278
281
|
|
|
279
282
|
// src/cli/commands/submit.ts
|
|
283
|
+
function isInWorktree() {
|
|
284
|
+
try {
|
|
285
|
+
const gitDir = execSync3("git rev-parse --git-dir", { encoding: "utf-8" }).trim();
|
|
286
|
+
const commonDir = execSync3("git rev-parse --git-common-dir", { encoding: "utf-8" }).trim();
|
|
287
|
+
return gitDir !== commonDir;
|
|
288
|
+
} catch {
|
|
289
|
+
return false;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
function getUncommittedChanges() {
|
|
293
|
+
try {
|
|
294
|
+
const status = execSync3("git status --porcelain", { encoding: "utf-8" }).trim();
|
|
295
|
+
return status || null;
|
|
296
|
+
} catch {
|
|
297
|
+
return null;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
280
300
|
function registerSubmit(program2) {
|
|
281
301
|
program2.command("submit").description("Submit work report and exit (agent only)").option("--report <report>", "Work report (or pipe via stdin)").action(async (opts) => {
|
|
282
302
|
assertTmux();
|
|
@@ -286,6 +306,17 @@ function registerSubmit(program2) {
|
|
|
286
306
|
console.error("Error: SISYPHUS_SESSION_ID and SISYPHUS_AGENT_ID environment variables must be set");
|
|
287
307
|
process.exit(1);
|
|
288
308
|
}
|
|
309
|
+
if (isInWorktree()) {
|
|
310
|
+
const changes = getUncommittedChanges();
|
|
311
|
+
if (changes) {
|
|
312
|
+
console.error("Error: uncommitted changes in worktree. Your branch is merged automatically after submit \u2014 uncommitted work will be lost.");
|
|
313
|
+
console.error('\nCommit first:\n git add -A && git commit -m "description of changes"\n');
|
|
314
|
+
console.error("Or discard:\n git checkout -- .\n");
|
|
315
|
+
console.error("Uncommitted changes:");
|
|
316
|
+
console.error(changes);
|
|
317
|
+
process.exit(1);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
289
320
|
const report = opts.report ?? await readStdin();
|
|
290
321
|
if (!report) {
|
|
291
322
|
console.error("Error: provide --report or pipe content via stdin");
|
|
@@ -304,6 +335,7 @@ function registerSubmit(program2) {
|
|
|
304
335
|
}
|
|
305
336
|
|
|
306
337
|
// src/cli/commands/yield.ts
|
|
338
|
+
import { writeFileSync as writeFileSync2 } from "fs";
|
|
307
339
|
function registerYield(program2) {
|
|
308
340
|
program2.command("yield").description("Yield control back to daemon (orchestrator only)").option("--prompt <text>", "Instructions for the next orchestrator cycle (or pipe via stdin)").action(async (opts) => {
|
|
309
341
|
assertTmux();
|
|
@@ -316,6 +348,7 @@ function registerYield(program2) {
|
|
|
316
348
|
const request = { type: "yield", sessionId, agentId: "orchestrator", nextPrompt };
|
|
317
349
|
const response = await sendRequest(request);
|
|
318
350
|
if (response.ok) {
|
|
351
|
+
writeFileSync2(`/tmp/sisyphus-exit-${sessionId}`, "");
|
|
319
352
|
console.log("Yielded. Waiting for agents to complete.");
|
|
320
353
|
} else {
|
|
321
354
|
console.error(`Error: ${response.error}`);
|
|
@@ -325,6 +358,7 @@ function registerYield(program2) {
|
|
|
325
358
|
}
|
|
326
359
|
|
|
327
360
|
// src/cli/commands/complete.ts
|
|
361
|
+
import { writeFileSync as writeFileSync3 } from "fs";
|
|
328
362
|
function registerComplete(program2) {
|
|
329
363
|
program2.command("complete").description("Mark session as completed (orchestrator only)").requiredOption("--report <report>", "Final completion report").action(async (opts) => {
|
|
330
364
|
assertTmux();
|
|
@@ -336,6 +370,7 @@ function registerComplete(program2) {
|
|
|
336
370
|
const request = { type: "complete", sessionId, report: opts.report };
|
|
337
371
|
const response = await sendRequest(request);
|
|
338
372
|
if (response.ok) {
|
|
373
|
+
writeFileSync3(`/tmp/sisyphus-exit-${sessionId}`, "");
|
|
339
374
|
console.log("Session completed.");
|
|
340
375
|
} else {
|
|
341
376
|
console.error(`Error: ${response.error}`);
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/index.ts","../src/cli/client.ts","../src/cli/install.ts","../src/cli/tmux.ts","../src/cli/commands/start.ts","../src/cli/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/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"],"sourcesContent":["import { Command } from 'commander';\nimport { registerStart } from './commands/start.js';\nimport { registerSpawn } from './commands/spawn.js';\nimport { registerSubmit } from './commands/submit.js';\nimport { registerYield } from './commands/yield.js';\nimport { registerComplete } from './commands/complete.js';\nimport { registerStatus } from './commands/status.js';\nimport { registerList } from './commands/list.js';\nimport { registerReport } from './commands/report.js';\nimport { registerResume } from './commands/resume.js';\nimport { registerKill } from './commands/kill.js';\nimport { registerUninstall } from './commands/uninstall.js';\n\nconst program = new Command();\n\nprogram\n .name('sisyphus')\n .description('tmux-integrated orchestration daemon for Claude Code')\n .version('0.1.0');\n\nregisterStart(program);\nregisterSpawn(program);\nregisterSubmit(program);\nregisterReport(program);\nregisterYield(program);\nregisterComplete(program);\nregisterStatus(program);\nregisterList(program);\nregisterResume(program);\nregisterKill(program);\nregisterUninstall(program);\n\nprogram.parseAsync(process.argv).catch((err: Error) => {\n console.error(err.message);\n process.exit(1);\n});\n","import { connect } from 'node:net';\nimport { socketPath } from '../shared/paths.js';\nimport type { Request, Response } from '../shared/protocol.js';\nimport { ensureDaemonInstalled, waitForDaemon } from './install.js';\n\nfunction rawSend(request: Request): Promise<Response> {\n const sock = socketPath();\n\n return new Promise<Response>((resolve, reject) => {\n const socket = connect(sock);\n let data = '';\n\n const timeout = setTimeout(() => {\n socket.destroy();\n reject(new Error('Request timed out after 10s'));\n }, 10_000);\n\n socket.on('connect', () => {\n socket.write(JSON.stringify(request) + '\\n');\n });\n\n socket.on('data', (chunk) => {\n data += chunk.toString();\n const newlineIdx = data.indexOf('\\n');\n if (newlineIdx !== -1) {\n clearTimeout(timeout);\n const line = data.slice(0, newlineIdx);\n socket.destroy();\n try {\n resolve(JSON.parse(line) as Response);\n } catch {\n reject(new Error(`Invalid JSON response from daemon: ${line}`));\n }\n }\n });\n\n socket.on('error', (err) => {\n clearTimeout(timeout);\n reject(err);\n });\n });\n}\n\nexport async function sendRequest(request: Request): Promise<Response> {\n const sleep = (ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms));\n const MAX_ATTEMPTS = 5;\n const RETRY_DELAY_MS = 2000;\n let installedDaemon = false;\n let lastErr: unknown;\n\n for (let attempt = 1; attempt <= MAX_ATTEMPTS; attempt++) {\n try {\n return await rawSend(request);\n } catch (err) {\n lastErr = err;\n const code = (err as NodeJS.ErrnoException).code;\n if (code !== 'ENOENT' && code !== 'ECONNREFUSED') {\n throw err;\n }\n\n if (attempt === MAX_ATTEMPTS) break;\n\n if (process.platform === 'darwin' && !installedDaemon) {\n installedDaemon = true;\n await ensureDaemonInstalled();\n await waitForDaemon(5000);\n } else {\n process.stderr.write(`Daemon not ready, retrying (${attempt}/${MAX_ATTEMPTS - 1})...\\n`);\n await sleep(RETRY_DELAY_MS);\n }\n }\n }\n\n if (process.platform !== 'darwin') {\n throw new Error(\n `Sisyphus daemon is not running.\\n` +\n ` Start it manually: sisyphusd &\\n` +\n ` Or check logs at: ~/.sisyphus/daemon.log`\n );\n }\n throw lastErr;\n}\n","import { execSync } from 'node:child_process';\nimport { existsSync, mkdirSync, 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, globalDir, socketPath } from '../shared/paths.js';\n\nconst PLIST_LABEL = 'com.sisyphus.daemon';\nconst PLIST_FILENAME = `${PLIST_LABEL}.plist`;\n\nfunction launchAgentDir(): string {\n return join(homedir(), 'Library', 'LaunchAgents');\n}\n\nfunction plistPath(): string {\n return join(launchAgentDir(), PLIST_FILENAME);\n}\n\nfunction daemonBinPath(): string {\n const installDir = dirname(fileURLToPath(import.meta.url));\n return resolve(installDir, '..', 'daemon.js');\n}\n\nfunction generatePlist(nodePath: string, daemonPath: string, logPath: string): string {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n <key>Label</key>\n <string>${PLIST_LABEL}</string>\n <key>ProgramArguments</key>\n <array>\n <string>${nodePath}</string>\n <string>${daemonPath}</string>\n </array>\n <key>RunAtLoad</key>\n <true/>\n <key>KeepAlive</key>\n <true/>\n <key>StandardOutPath</key>\n <string>${logPath}</string>\n <key>StandardErrorPath</key>\n <string>${logPath}</string>\n</dict>\n</plist>\n`;\n}\n\nexport function isInstalled(): boolean {\n return existsSync(plistPath());\n}\n\nexport async function ensureDaemonInstalled(): Promise<void> {\n if (process.platform !== 'darwin') return;\n\n if (!isInstalled()) {\n const nodePath = process.execPath;\n const daemonPath = daemonBinPath();\n const logPath = daemonLogPath();\n\n mkdirSync(globalDir(), { recursive: true });\n mkdirSync(launchAgentDir(), { recursive: true });\n\n const plist = generatePlist(nodePath, daemonPath, logPath);\n writeFileSync(plistPath(), plist, 'utf8');\n\n execSync(`launchctl load -w ${plistPath()}`);\n }\n\n await waitForDaemon();\n}\n\nexport async function uninstallDaemon(purge: boolean): Promise<void> {\n if (process.platform !== 'darwin') {\n console.log('Auto-install is only supported on macOS.');\n return;\n }\n\n const plist = plistPath();\n if (existsSync(plist)) {\n try {\n execSync(`launchctl unload -w ${plist}`, { stdio: 'pipe' });\n } catch {\n // already unloaded or not registered — ignore\n }\n unlinkSync(plist);\n console.log('Daemon unloaded and plist removed.');\n } else {\n console.log('Daemon is not installed (plist not found).');\n }\n\n if (purge) {\n const dir = globalDir();\n if (existsSync(dir)) {\n rmSync(dir, { recursive: true, force: true });\n console.log(`Removed ${dir}`);\n }\n }\n}\n\nfunction testConnection(): Promise<void> {\n return new Promise((resolve, reject) => {\n const sock = connect(socketPath());\n sock.on('connect', () => { sock.destroy(); resolve(); });\n sock.on('error', (err) => { sock.destroy(); reject(err); });\n });\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport async function waitForDaemon(maxWaitMs = 6000): Promise<void> {\n const start = Date.now();\n while (Date.now() - start < maxWaitMs) {\n if (existsSync(socketPath())) {\n try {\n await testConnection();\n return;\n } catch {\n // not ready yet\n }\n }\n await sleep(300);\n }\n throw new Error(`Daemon did not start within ${maxWaitMs}ms. Check ${daemonLogPath()}`);\n}\n","import { execSync } from 'node:child_process';\n\nexport function assertTmux(): void {\n if (!process.env.TMUX) {\n throw new Error('Not running inside a tmux pane. Sisyphus requires tmux.');\n }\n}\n\nexport function getTmuxSession(): string {\n assertTmux();\n return execSync('tmux display-message -p \"#{session_name}\"', { encoding: 'utf8' }).trim();\n}\n\nexport function getTmuxWindow(): string {\n assertTmux();\n return execSync('tmux display-message -p \"#{window_id}\"', { encoding: 'utf8' }).trim();\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport { getTmuxSession, getTmuxWindow } from '../tmux.js';\n\nexport function registerStart(program: Command): void {\n program\n .command('start')\n .description('Start a new sisyphus session')\n .argument('<task>', 'Task description for the orchestrator')\n .action(async (task: string) => {\n const tmuxSession = getTmuxSession();\n const tmuxWindow = getTmuxWindow();\n const request: Request = { type: 'start', task, cwd: process.cwd(), tmuxSession, tmuxWindow };\n const response = await sendRequest(request);\n if (response.ok) {\n const sessionId = response.data?.sessionId as string;\n console.log(`Session started: ${sessionId}`);\n if (response.data?.tmuxWindow) {\n console.log(`Orchestrator spawned in tmux window: ${response.data.tmuxWindow}`);\n }\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\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 .option('--agent-type <type>', 'Agent role label (default: worker)', 'worker')\n .requiredOption('--name <name>', 'Agent name')\n .requiredOption('--instruction <instruction>', 'Task instruction for the agent')\n .option('--worktree', 'Spawn agent in an isolated git worktree')\n .action(async (opts: { agentType: string; name: string; instruction: string; worktree?: boolean }) => {\n assertTmux();\n const sessionId = process.env.SISYPHUS_SESSION_ID;\n if (!sessionId) {\n console.error('Error: SISYPHUS_SESSION_ID environment variable not set');\n process.exit(1);\n }\n\n const request: Request = {\n type: 'spawn',\n sessionId,\n agentType: opts.agentType,\n name: opts.name,\n instruction: opts.instruction,\n ...(opts.worktree ? { worktree: true } : {}),\n };\n const response = await sendRequest(request);\n if (response.ok) {\n const agentId = response.data?.agentId as string;\n console.log(`Agent spawned: ${agentId}`);\n console.log(\"Run `sisyphus yield` when done spawning agents.\");\n } else {\n console.error(`Error: ${response.error}`);\n if (response.error?.includes(\"Unknown session\")) console.error(\"Hint: run `sisyphus list` to see active sessions.\");\n process.exit(1);\n }\n });\n}\n","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 .action(async (opts: { report?: string }) => {\n assertTmux();\n const sessionId = process.env.SISYPHUS_SESSION_ID;\n const agentId = process.env.SISYPHUS_AGENT_ID;\n if (!sessionId || !agentId) {\n console.error('Error: SISYPHUS_SESSION_ID and SISYPHUS_AGENT_ID environment variables must be set');\n process.exit(1);\n }\n\n const report = opts.report ?? await readStdin();\n if (!report) {\n console.error('Error: provide --report or pipe content via stdin');\n process.exit(1);\n }\n\n const request: Request = { type: 'submit', sessionId, agentId, report };\n const response = await sendRequest(request);\n if (response.ok) {\n console.log('Report submitted successfully');\n console.log('Your pane will close. The orchestrator resumes when all agents finish.');\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport { readStdin } from '../stdin.js';\nimport { assertTmux } from '../tmux.js';\n\nexport function registerYield(program: Command): void {\n program\n .command('yield')\n .description('Yield control back to daemon (orchestrator only)')\n .option('--prompt <text>', 'Instructions for the next orchestrator cycle (or pipe via stdin)')\n .action(async (opts: { prompt?: string }) => {\n assertTmux();\n const sessionId = process.env.SISYPHUS_SESSION_ID;\n if (!sessionId) {\n console.error('Error: SISYPHUS_SESSION_ID environment variable not set');\n process.exit(1);\n }\n\n const nextPrompt = opts.prompt ?? await readStdin() ?? undefined;\n\n const request: Request = { type: 'yield', sessionId, agentId: 'orchestrator', nextPrompt };\n const response = await sendRequest(request);\n if (response.ok) {\n console.log('Yielded. Waiting for agents to complete.');\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport { assertTmux } from '../tmux.js';\n\nexport function registerComplete(program: Command): void {\n program\n .command('complete')\n .description('Mark session as completed (orchestrator only)')\n .requiredOption('--report <report>', 'Final completion report')\n .action(async (opts: { report: string }) => {\n assertTmux();\n const sessionId = process.env.SISYPHUS_SESSION_ID;\n if (!sessionId) {\n console.error('Error: SISYPHUS_SESSION_ID environment variable not set');\n process.exit(1);\n }\n\n const request: Request = { type: 'complete', sessionId, report: opts.report };\n const response = await sendRequest(request);\n if (response.ok) {\n console.log('Session completed.');\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport type { Session, Agent, OrchestratorCycle } from '../../shared/types.js';\n\nconst STATUS_COLORS: Record<string, string> = {\n active: '\\x1b[32m', // green\n paused: '\\x1b[33m', // yellow\n completed: '\\x1b[36m', // cyan\n running: '\\x1b[32m', // green\n killed: '\\x1b[31m', // red\n crashed: '\\x1b[31m', // red\n lost: '\\x1b[90m', // gray\n};\nconst RESET = '\\x1b[0m';\nconst BOLD = '\\x1b[1m';\nconst DIM = '\\x1b[2m';\n\nfunction colorize(text: string, status: string): string {\n const color = STATUS_COLORS[status] ?? '';\n return `${color}${text}${RESET}`;\n}\n\nfunction formatDuration(startIso: string, endIso?: string | null): string {\n const start = new Date(startIso).getTime();\n const end = endIso ? new Date(endIso).getTime() : Date.now();\n const totalSeconds = Math.floor((end - start) / 1000);\n if (totalSeconds < 0) return '0s';\n const hours = Math.floor(totalSeconds / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n const parts: string[] = [];\n if (hours > 0) parts.push(`${hours}h`);\n if (minutes > 0) parts.push(`${minutes}m`);\n parts.push(`${seconds}s`);\n return parts.join(' ');\n}\n\nfunction formatAgent(agent: Agent): string {\n const status = colorize(agent.status, agent.status);\n const name = `${BOLD}${agent.name}${RESET}`;\n const type = `${DIM}(${agent.agentType})${RESET}`;\n const duration = formatDuration(agent.spawnedAt, agent.completedAt);\n let line = ` ${agent.id} ${name} ${type} — ${status} ${DIM}(${duration})${RESET}`;\n if (agent.reports.length > 0) {\n for (const r of agent.reports) {\n const label = r.type === 'final' ? 'Final' : 'Update';\n line += `\\n ${label}: ${r.summary}`;\n }\n }\n if (agent.killedReason) {\n line += `\\n Reason: ${agent.killedReason}`;\n }\n return line;\n}\n\nfunction formatCycle(cycle: OrchestratorCycle): string {\n const duration = cycle.completedAt\n ? ` ${DIM}(${formatDuration(cycle.timestamp, cycle.completedAt)})${RESET}`\n : ` ${DIM}(running)${RESET}`;\n const agents = cycle.agentsSpawned.length > 0\n ? ` — agents: ${cycle.agentsSpawned.join(', ')}`\n : '';\n return ` Cycle ${cycle.cycle}${duration}${agents}`;\n}\n\nfunction printSession(session: Session): void {\n const status = colorize(session.status, session.status);\n const sessionDuration = formatDuration(session.createdAt, session.completedAt);\n console.log(`\\n${BOLD}Session: ${session.id}${RESET}`);\n console.log(` Status: ${status}`);\n console.log(` Task: ${session.task}`);\n console.log(` CWD: ${session.cwd}`);\n console.log(` Created: ${session.createdAt}`);\n console.log(` Duration: ${sessionDuration}${session.completedAt ? '' : ' (ongoing)'}`);\n console.log(` Orchestrator cycles: ${session.orchestratorCycles.length}`);\n\n if (session.orchestratorCycles.length > 0) {\n console.log(`\\n ${BOLD}Cycles:${RESET}`);\n for (const cycle of session.orchestratorCycles) {\n console.log(formatCycle(cycle));\n }\n }\n\n if (session.agents.length > 0) {\n console.log(`\\n ${BOLD}Agents:${RESET}`);\n for (const agent of session.agents) {\n console.log(formatAgent(agent));\n }\n }\n}\n\nexport function registerStatus(program: Command): void {\n program\n .command('status')\n .description('Show session status')\n .argument('[session-id]', 'Session ID (defaults to SISYPHUS_SESSION_ID env)')\n .action(async (sessionIdArg?: string) => {\n const sessionId = sessionIdArg ?? process.env.SISYPHUS_SESSION_ID;\n\n const request: Request = { type: 'status', sessionId };\n const response = await sendRequest(request);\n if (response.ok) {\n const session = response.data?.session as Session | undefined;\n if (session) {\n printSession(session);\n } else {\n console.log('No session found');\n }\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport { basename } from 'node:path';\n\ninterface SessionSummary {\n id: string;\n task: string;\n status: string;\n agentCount: number;\n createdAt: string;\n cwd?: string;\n}\n\nconst STATUS_COLORS: Record<string, string> = {\n active: '\\x1b[32m',\n paused: '\\x1b[33m',\n completed: '\\x1b[36m',\n};\nconst RESET = '\\x1b[0m';\nconst BOLD = '\\x1b[1m';\nconst DIM = '\\x1b[2m';\n\nfunction truncateTask(task: string, max: number): string {\n if (task.length <= max) return task;\n return task.slice(0, max - 1) + '…';\n}\n\nexport function registerList(program: Command): void {\n program\n .command('list')\n .description('List sessions (defaults to current project)')\n .option('-a, --all', 'Show sessions from all projects')\n .action(async (opts: { all?: boolean }) => {\n const cwd = process.cwd();\n const request: Request = { type: 'list', cwd, all: opts.all };\n const response = await sendRequest(request);\n if (response.ok) {\n const sessions = (response.data?.sessions ?? []) as SessionSummary[];\n const totalCount = response.data?.totalCount as number | undefined;\n const filtered = response.data?.filtered as boolean | undefined;\n\n if (sessions.length === 0) {\n if (filtered && totalCount && totalCount > 0) {\n console.log(`No sessions in this project. ${totalCount} session(s) in other projects.`);\n console.log(`${DIM}Run ${RESET}sisyphus list --all${DIM} to show all.${RESET}`);\n } else {\n console.log('No sessions');\n }\n return;\n }\n\n for (const s of sessions) {\n const color = STATUS_COLORS[s.status] ?? '';\n const status = `${color}${s.status}${RESET}`;\n const agents = `${DIM}${s.agentCount} agent(s)${RESET}`;\n const task = truncateTask(s.task, 60);\n const cwdLabel = opts.all && s.cwd ? ` ${DIM}${basename(s.cwd)}${RESET}` : '';\n console.log(` ${BOLD}${s.id}${RESET} ${status} ${agents} ${task}${cwdLabel}`);\n }\n\n if (filtered && totalCount && totalCount > sessions.length) {\n const otherCount = totalCount - sessions.length;\n console.log(`\\n${DIM}${otherCount} more session(s) in other projects. Run ${RESET}sisyphus list --all${DIM} to show all.${RESET}`);\n }\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport { readStdin } from '../stdin.js';\nimport { assertTmux } from '../tmux.js';\n\nexport function registerReport(program: Command): void {\n program\n .command('report')\n .description('Send a progress report without exiting (agent only)')\n .option('--message <message>', 'Progress report content')\n .action(async (opts: { message?: string }) => {\n assertTmux();\n const sessionId = process.env.SISYPHUS_SESSION_ID;\n const agentId = process.env.SISYPHUS_AGENT_ID;\n if (!sessionId || !agentId) {\n console.error('Error: SISYPHUS_SESSION_ID and SISYPHUS_AGENT_ID environment variables must be set');\n process.exit(1);\n }\n\n const content = opts.message ?? await readStdin();\n if (!content) {\n console.error('Error: provide --message or pipe content via stdin');\n process.exit(1);\n }\n\n const request: Request = { type: 'report', sessionId, agentId, content };\n const response = await sendRequest(request);\n if (response.ok) {\n console.log('Progress report recorded');\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport { getTmuxSession, getTmuxWindow } from '../tmux.js';\n\nexport function registerResume(program: Command): void {\n program\n .command('resume')\n .description('Resume a paused session')\n .argument('<session-id>', 'Session ID to resume')\n .argument('[message]', 'Additional instructions for the orchestrator')\n .action(async (sessionId: string, message?: string) => {\n const tmuxSession = getTmuxSession();\n const tmuxWindow = getTmuxWindow();\n const cwd = process.cwd();\n const request: Request = { type: 'resume', sessionId, cwd, tmuxSession, tmuxWindow, message };\n const response = await sendRequest(request);\n if (response.ok) {\n console.log(`Session ${sessionId} resumed`);\n if (response.data?.tmuxWindow) {\n console.log(`Orchestrator respawned in tmux window: ${response.data.tmuxWindow}`);\n }\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\n\nexport function registerKill(program: Command): void {\n program\n .command('kill <sessionId>')\n .description('Kill a running session and all its agents')\n .action(async (sessionId: string) => {\n const request: Request = { type: 'kill', sessionId };\n const response = await sendRequest(request);\n if (response.ok) {\n console.log(`Session ${sessionId} killed.`);\n if (response.data) {\n const { killedAgents } = response.data as { killedAgents: number };\n console.log(`Cleaned up: ${killedAgents} agent(s) killed, tmux window removed.`);\n }\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { createInterface } from 'node:readline';\nimport { uninstallDaemon } from '../install.js';\n\nasync function confirm(question: string): Promise<boolean> {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer.trim().toLowerCase() === 'y');\n });\n });\n}\n\nexport function registerUninstall(program: Command): void {\n program\n .command('uninstall')\n .description('Unload the sisyphus daemon from launchd and remove the plist')\n .option('--purge', 'Also remove all session data in ~/.sisyphus')\n .option('-y, --yes', 'Skip confirmation prompt for --purge')\n .action(async (opts: { purge?: boolean; yes?: boolean }) => {\n const purge = opts.purge ?? false;\n\n if (purge && !opts.yes) {\n const ok = await confirm('This will delete all session data in ~/.sisyphus. Continue? (y/N) ');\n if (!ok) {\n console.log('Aborted.');\n return;\n }\n }\n\n await uninstallDaemon(purge);\n });\n}\n"],"mappings":"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","names":["connect","resolve","resolve","connect","sleep","execSync","program","program","resolve","program","program","program","program","STATUS_COLORS","RESET","BOLD","DIM","program","program","program","program","resolve","program"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli/index.ts","../src/cli/client.ts","../src/cli/install.ts","../src/cli/tmux.ts","../src/cli/commands/start.ts","../src/cli/commands/spawn.ts","../src/cli/commands/submit.ts","../src/cli/stdin.ts","../src/cli/commands/yield.ts","../src/cli/commands/complete.ts","../src/cli/commands/status.ts","../src/cli/commands/list.ts","../src/cli/commands/report.ts","../src/cli/commands/resume.ts","../src/cli/commands/kill.ts","../src/cli/commands/uninstall.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { registerStart } from './commands/start.js';\nimport { registerSpawn } from './commands/spawn.js';\nimport { registerSubmit } from './commands/submit.js';\nimport { registerYield } from './commands/yield.js';\nimport { registerComplete } from './commands/complete.js';\nimport { registerStatus } from './commands/status.js';\nimport { registerList } from './commands/list.js';\nimport { registerReport } from './commands/report.js';\nimport { registerResume } from './commands/resume.js';\nimport { registerKill } from './commands/kill.js';\nimport { registerUninstall } from './commands/uninstall.js';\n\nconst program = new Command();\n\nprogram\n .name('sisyphus')\n .description('tmux-integrated orchestration daemon for Claude Code')\n .version('0.1.0');\n\nregisterStart(program);\nregisterSpawn(program);\nregisterSubmit(program);\nregisterReport(program);\nregisterYield(program);\nregisterComplete(program);\nregisterStatus(program);\nregisterList(program);\nregisterResume(program);\nregisterKill(program);\nregisterUninstall(program);\n\nprogram.parseAsync(process.argv).catch((err: Error) => {\n console.error(err.message);\n process.exit(1);\n});\n","import { connect } from 'node:net';\nimport { socketPath } from '../shared/paths.js';\nimport type { Request, Response } from '../shared/protocol.js';\nimport { ensureDaemonInstalled, waitForDaemon } from './install.js';\n\nfunction rawSend(request: Request): Promise<Response> {\n const sock = socketPath();\n\n return new Promise<Response>((resolve, reject) => {\n const socket = connect(sock);\n let data = '';\n\n const timeout = setTimeout(() => {\n socket.destroy();\n reject(new Error('Request timed out after 10s'));\n }, 10_000);\n\n socket.on('connect', () => {\n socket.write(JSON.stringify(request) + '\\n');\n });\n\n socket.on('data', (chunk) => {\n data += chunk.toString();\n const newlineIdx = data.indexOf('\\n');\n if (newlineIdx !== -1) {\n clearTimeout(timeout);\n const line = data.slice(0, newlineIdx);\n socket.destroy();\n try {\n resolve(JSON.parse(line) as Response);\n } catch {\n reject(new Error(`Invalid JSON response from daemon: ${line}`));\n }\n }\n });\n\n socket.on('error', (err) => {\n clearTimeout(timeout);\n reject(err);\n });\n });\n}\n\nexport async function sendRequest(request: Request): Promise<Response> {\n const sleep = (ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms));\n const MAX_ATTEMPTS = 5;\n const RETRY_DELAY_MS = 2000;\n let installedDaemon = false;\n let lastErr: unknown;\n\n for (let attempt = 1; attempt <= MAX_ATTEMPTS; attempt++) {\n try {\n return await rawSend(request);\n } catch (err) {\n lastErr = err;\n const code = (err as NodeJS.ErrnoException).code;\n if (code !== 'ENOENT' && code !== 'ECONNREFUSED') {\n throw err;\n }\n\n if (attempt === MAX_ATTEMPTS) break;\n\n if (process.platform === 'darwin' && !installedDaemon) {\n installedDaemon = true;\n await ensureDaemonInstalled();\n await waitForDaemon(5000);\n } else {\n process.stderr.write(`Daemon not ready, retrying (${attempt}/${MAX_ATTEMPTS - 1})...\\n`);\n await sleep(RETRY_DELAY_MS);\n }\n }\n }\n\n if (process.platform !== 'darwin') {\n throw new Error(\n `Sisyphus daemon is not running.\\n` +\n ` Start it manually: sisyphusd &\\n` +\n ` Or check logs at: ~/.sisyphus/daemon.log`\n );\n }\n throw lastErr;\n}\n","import { execSync } from 'node:child_process';\nimport { existsSync, mkdirSync, 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, globalDir, socketPath } from '../shared/paths.js';\n\nconst PLIST_LABEL = 'com.sisyphus.daemon';\nconst PLIST_FILENAME = `${PLIST_LABEL}.plist`;\n\nfunction launchAgentDir(): string {\n return join(homedir(), 'Library', 'LaunchAgents');\n}\n\nfunction plistPath(): string {\n return join(launchAgentDir(), PLIST_FILENAME);\n}\n\nfunction daemonBinPath(): string {\n const installDir = dirname(fileURLToPath(import.meta.url));\n return resolve(installDir, '..', 'daemon.js');\n}\n\nfunction generatePlist(nodePath: string, daemonPath: string, logPath: string): string {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n <key>Label</key>\n <string>${PLIST_LABEL}</string>\n <key>ProgramArguments</key>\n <array>\n <string>${nodePath}</string>\n <string>${daemonPath}</string>\n </array>\n <key>RunAtLoad</key>\n <true/>\n <key>KeepAlive</key>\n <true/>\n <key>StandardOutPath</key>\n <string>${logPath}</string>\n <key>StandardErrorPath</key>\n <string>${logPath}</string>\n</dict>\n</plist>\n`;\n}\n\nexport function isInstalled(): boolean {\n return existsSync(plistPath());\n}\n\nexport async function ensureDaemonInstalled(): Promise<void> {\n if (process.platform !== 'darwin') return;\n\n if (!isInstalled()) {\n const nodePath = process.execPath;\n const daemonPath = daemonBinPath();\n const logPath = daemonLogPath();\n\n mkdirSync(globalDir(), { recursive: true });\n mkdirSync(launchAgentDir(), { recursive: true });\n\n const plist = generatePlist(nodePath, daemonPath, logPath);\n writeFileSync(plistPath(), plist, 'utf8');\n\n execSync(`launchctl load -w ${plistPath()}`);\n }\n\n await waitForDaemon();\n}\n\nexport async function uninstallDaemon(purge: boolean): Promise<void> {\n if (process.platform !== 'darwin') {\n console.log('Auto-install is only supported on macOS.');\n return;\n }\n\n const plist = plistPath();\n if (existsSync(plist)) {\n try {\n execSync(`launchctl unload -w ${plist}`, { stdio: 'pipe' });\n } catch {\n // already unloaded or not registered — ignore\n }\n unlinkSync(plist);\n console.log('Daemon unloaded and plist removed.');\n } else {\n console.log('Daemon is not installed (plist not found).');\n }\n\n if (purge) {\n const dir = globalDir();\n if (existsSync(dir)) {\n rmSync(dir, { recursive: true, force: true });\n console.log(`Removed ${dir}`);\n }\n }\n}\n\nfunction testConnection(): Promise<void> {\n return new Promise((resolve, reject) => {\n const sock = connect(socketPath());\n sock.on('connect', () => { sock.destroy(); resolve(); });\n sock.on('error', (err) => { sock.destroy(); reject(err); });\n });\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport async function waitForDaemon(maxWaitMs = 6000): Promise<void> {\n const start = Date.now();\n while (Date.now() - start < maxWaitMs) {\n if (existsSync(socketPath())) {\n try {\n await testConnection();\n return;\n } catch {\n // not ready yet\n }\n }\n await sleep(300);\n }\n throw new Error(`Daemon did not start within ${maxWaitMs}ms. Check ${daemonLogPath()}`);\n}\n","import { execSync } from 'node:child_process';\n\nexport function assertTmux(): void {\n if (!process.env.TMUX) {\n throw new Error('Not running inside a tmux pane. Sisyphus requires tmux.');\n }\n}\n\nexport function getTmuxSession(): string {\n assertTmux();\n return execSync('tmux display-message -p \"#{session_name}\"', { encoding: 'utf8' }).trim();\n}\n\nexport function getTmuxWindow(): string {\n assertTmux();\n return execSync('tmux display-message -p \"#{window_id}\"', { encoding: 'utf8' }).trim();\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport { getTmuxSession, getTmuxWindow } from '../tmux.js';\n\nexport function registerStart(program: Command): void {\n program\n .command('start')\n .description('Start a new sisyphus session')\n .argument('<task>', 'Task description for the orchestrator')\n .action(async (task: string) => {\n const tmuxSession = getTmuxSession();\n const tmuxWindow = getTmuxWindow();\n const request: Request = { type: 'start', task, cwd: process.cwd(), tmuxSession, tmuxWindow };\n const response = await sendRequest(request);\n if (response.ok) {\n const sessionId = response.data?.sessionId as string;\n console.log(`Session started: ${sessionId}`);\n if (response.data?.tmuxWindow) {\n console.log(`Orchestrator spawned in tmux window: ${response.data.tmuxWindow}`);\n }\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\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 .option('--agent-type <type>', 'Agent role label (default: worker)', 'worker')\n .requiredOption('--name <name>', 'Agent name')\n .requiredOption('--instruction <instruction>', 'Task instruction for the agent')\n .option('--worktree', 'Spawn agent in an isolated git worktree')\n .action(async (opts: { agentType: string; name: string; instruction: string; worktree?: boolean }) => {\n assertTmux();\n const sessionId = process.env.SISYPHUS_SESSION_ID;\n if (!sessionId) {\n console.error('Error: SISYPHUS_SESSION_ID environment variable not set');\n process.exit(1);\n }\n\n const request: Request = {\n type: 'spawn',\n sessionId,\n agentType: opts.agentType,\n name: opts.name,\n instruction: opts.instruction,\n ...(opts.worktree ? { worktree: true } : {}),\n };\n const response = await sendRequest(request);\n if (response.ok) {\n const agentId = response.data?.agentId as string;\n console.log(`Agent spawned: ${agentId}`);\n console.log(\"Run `sisyphus yield` when done spawning agents.\");\n } else {\n console.error(`Error: ${response.error}`);\n if (response.error?.includes(\"Unknown session\")) console.error(\"Hint: run `sisyphus list` to see active sessions.\");\n process.exit(1);\n }\n });\n}\n","import { execSync } from 'node:child_process';\nimport type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport { readStdin } from '../stdin.js';\nimport { assertTmux } from '../tmux.js';\n\nfunction isInWorktree(): boolean {\n try {\n const gitDir = execSync('git rev-parse --git-dir', { encoding: 'utf-8' }).trim();\n const commonDir = execSync('git rev-parse --git-common-dir', { encoding: 'utf-8' }).trim();\n return gitDir !== commonDir;\n } catch {\n return false;\n }\n}\n\nfunction getUncommittedChanges(): string | null {\n try {\n const status = execSync('git status --porcelain', { encoding: 'utf-8' }).trim();\n return status || null;\n } catch {\n return null;\n }\n}\n\nexport function registerSubmit(program: Command): void {\n program\n .command('submit')\n .description('Submit work report and exit (agent only)')\n .option('--report <report>', 'Work report (or pipe via stdin)')\n .action(async (opts: { report?: string }) => {\n assertTmux();\n const sessionId = process.env.SISYPHUS_SESSION_ID;\n const agentId = process.env.SISYPHUS_AGENT_ID;\n if (!sessionId || !agentId) {\n console.error('Error: SISYPHUS_SESSION_ID and SISYPHUS_AGENT_ID environment variables must be set');\n process.exit(1);\n }\n\n // Block submit if worktree has uncommitted changes — they'd be lost on merge\n if (isInWorktree()) {\n const changes = getUncommittedChanges();\n if (changes) {\n console.error('Error: uncommitted changes in worktree. Your branch is merged automatically after submit — uncommitted work will be lost.');\n console.error('\\nCommit first:\\n git add -A && git commit -m \"description of changes\"\\n');\n console.error('Or discard:\\n git checkout -- .\\n');\n console.error('Uncommitted changes:');\n console.error(changes);\n process.exit(1);\n }\n }\n\n const report = opts.report ?? await readStdin();\n if (!report) {\n console.error('Error: provide --report or pipe content via stdin');\n process.exit(1);\n }\n\n const request: Request = { type: 'submit', sessionId, agentId, report };\n const response = await sendRequest(request);\n if (response.ok) {\n console.log('Report submitted successfully');\n console.log('Your pane will close. The orchestrator resumes when all agents finish.');\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","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 { writeFileSync } from 'node:fs';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport { readStdin } from '../stdin.js';\nimport { assertTmux } from '../tmux.js';\n\nexport function registerYield(program: Command): void {\n program\n .command('yield')\n .description('Yield control back to daemon (orchestrator only)')\n .option('--prompt <text>', 'Instructions for the next orchestrator cycle (or pipe via stdin)')\n .action(async (opts: { prompt?: string }) => {\n assertTmux();\n const sessionId = process.env.SISYPHUS_SESSION_ID;\n if (!sessionId) {\n console.error('Error: SISYPHUS_SESSION_ID environment variable not set');\n process.exit(1);\n }\n\n const nextPrompt = opts.prompt ?? await readStdin() ?? undefined;\n\n const request: Request = { type: 'yield', sessionId, agentId: 'orchestrator', nextPrompt };\n const response = await sendRequest(request);\n if (response.ok) {\n writeFileSync(`/tmp/sisyphus-exit-${sessionId}`, '');\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 { writeFileSync } from 'node:fs';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport { assertTmux } from '../tmux.js';\n\nexport function registerComplete(program: Command): void {\n program\n .command('complete')\n .description('Mark session as completed (orchestrator only)')\n .requiredOption('--report <report>', 'Final completion report')\n .action(async (opts: { report: string }) => {\n assertTmux();\n const sessionId = process.env.SISYPHUS_SESSION_ID;\n if (!sessionId) {\n console.error('Error: SISYPHUS_SESSION_ID environment variable not set');\n process.exit(1);\n }\n\n const request: Request = { type: 'complete', sessionId, report: opts.report };\n const response = await sendRequest(request);\n if (response.ok) {\n writeFileSync(`/tmp/sisyphus-exit-${sessionId}`, '');\n console.log('Session completed.');\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport type { Session, Agent, OrchestratorCycle } from '../../shared/types.js';\n\nconst STATUS_COLORS: Record<string, string> = {\n active: '\\x1b[32m', // green\n paused: '\\x1b[33m', // yellow\n completed: '\\x1b[36m', // cyan\n running: '\\x1b[32m', // green\n killed: '\\x1b[31m', // red\n crashed: '\\x1b[31m', // red\n lost: '\\x1b[90m', // gray\n};\nconst RESET = '\\x1b[0m';\nconst BOLD = '\\x1b[1m';\nconst DIM = '\\x1b[2m';\n\nfunction colorize(text: string, status: string): string {\n const color = STATUS_COLORS[status] ?? '';\n return `${color}${text}${RESET}`;\n}\n\nfunction formatDuration(startIso: string, endIso?: string | null): string {\n const start = new Date(startIso).getTime();\n const end = endIso ? new Date(endIso).getTime() : Date.now();\n const totalSeconds = Math.floor((end - start) / 1000);\n if (totalSeconds < 0) return '0s';\n const hours = Math.floor(totalSeconds / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n const parts: string[] = [];\n if (hours > 0) parts.push(`${hours}h`);\n if (minutes > 0) parts.push(`${minutes}m`);\n parts.push(`${seconds}s`);\n return parts.join(' ');\n}\n\nfunction formatAgent(agent: Agent): string {\n const status = colorize(agent.status, agent.status);\n const name = `${BOLD}${agent.name}${RESET}`;\n const type = `${DIM}(${agent.agentType})${RESET}`;\n const duration = formatDuration(agent.spawnedAt, agent.completedAt);\n let line = ` ${agent.id} ${name} ${type} — ${status} ${DIM}(${duration})${RESET}`;\n if (agent.reports.length > 0) {\n for (const r of agent.reports) {\n const label = r.type === 'final' ? 'Final' : 'Update';\n line += `\\n ${label}: ${r.summary}`;\n }\n }\n if (agent.killedReason) {\n line += `\\n Reason: ${agent.killedReason}`;\n }\n return line;\n}\n\nfunction formatCycle(cycle: OrchestratorCycle): string {\n const duration = cycle.completedAt\n ? ` ${DIM}(${formatDuration(cycle.timestamp, cycle.completedAt)})${RESET}`\n : ` ${DIM}(running)${RESET}`;\n const agents = cycle.agentsSpawned.length > 0\n ? ` — agents: ${cycle.agentsSpawned.join(', ')}`\n : '';\n return ` Cycle ${cycle.cycle}${duration}${agents}`;\n}\n\nfunction printSession(session: Session): void {\n const status = colorize(session.status, session.status);\n const sessionDuration = formatDuration(session.createdAt, session.completedAt);\n console.log(`\\n${BOLD}Session: ${session.id}${RESET}`);\n console.log(` Status: ${status}`);\n console.log(` Task: ${session.task}`);\n console.log(` CWD: ${session.cwd}`);\n console.log(` Created: ${session.createdAt}`);\n console.log(` Duration: ${sessionDuration}${session.completedAt ? '' : ' (ongoing)'}`);\n console.log(` Orchestrator cycles: ${session.orchestratorCycles.length}`);\n\n if (session.orchestratorCycles.length > 0) {\n console.log(`\\n ${BOLD}Cycles:${RESET}`);\n for (const cycle of session.orchestratorCycles) {\n console.log(formatCycle(cycle));\n }\n }\n\n if (session.agents.length > 0) {\n console.log(`\\n ${BOLD}Agents:${RESET}`);\n for (const agent of session.agents) {\n console.log(formatAgent(agent));\n }\n }\n}\n\nexport function registerStatus(program: Command): void {\n program\n .command('status')\n .description('Show session status')\n .argument('[session-id]', 'Session ID (defaults to SISYPHUS_SESSION_ID env)')\n .action(async (sessionIdArg?: string) => {\n const sessionId = sessionIdArg ?? process.env.SISYPHUS_SESSION_ID;\n\n const request: Request = { type: 'status', sessionId };\n const response = await sendRequest(request);\n if (response.ok) {\n const session = response.data?.session as Session | undefined;\n if (session) {\n printSession(session);\n } else {\n console.log('No session found');\n }\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport { basename } from 'node:path';\n\ninterface SessionSummary {\n id: string;\n task: string;\n status: string;\n agentCount: number;\n createdAt: string;\n cwd?: string;\n}\n\nconst STATUS_COLORS: Record<string, string> = {\n active: '\\x1b[32m',\n paused: '\\x1b[33m',\n completed: '\\x1b[36m',\n};\nconst RESET = '\\x1b[0m';\nconst BOLD = '\\x1b[1m';\nconst DIM = '\\x1b[2m';\n\nfunction truncateTask(task: string, max: number): string {\n if (task.length <= max) return task;\n return task.slice(0, max - 1) + '…';\n}\n\nexport function registerList(program: Command): void {\n program\n .command('list')\n .description('List sessions (defaults to current project)')\n .option('-a, --all', 'Show sessions from all projects')\n .action(async (opts: { all?: boolean }) => {\n const cwd = process.cwd();\n const request: Request = { type: 'list', cwd, all: opts.all };\n const response = await sendRequest(request);\n if (response.ok) {\n const sessions = (response.data?.sessions ?? []) as SessionSummary[];\n const totalCount = response.data?.totalCount as number | undefined;\n const filtered = response.data?.filtered as boolean | undefined;\n\n if (sessions.length === 0) {\n if (filtered && totalCount && totalCount > 0) {\n console.log(`No sessions in this project. ${totalCount} session(s) in other projects.`);\n console.log(`${DIM}Run ${RESET}sisyphus list --all${DIM} to show all.${RESET}`);\n } else {\n console.log('No sessions');\n }\n return;\n }\n\n for (const s of sessions) {\n const color = STATUS_COLORS[s.status] ?? '';\n const status = `${color}${s.status}${RESET}`;\n const agents = `${DIM}${s.agentCount} agent(s)${RESET}`;\n const task = truncateTask(s.task, 60);\n const cwdLabel = opts.all && s.cwd ? ` ${DIM}${basename(s.cwd)}${RESET}` : '';\n console.log(` ${BOLD}${s.id}${RESET} ${status} ${agents} ${task}${cwdLabel}`);\n }\n\n if (filtered && totalCount && totalCount > sessions.length) {\n const otherCount = totalCount - sessions.length;\n console.log(`\\n${DIM}${otherCount} more session(s) in other projects. Run ${RESET}sisyphus list --all${DIM} to show all.${RESET}`);\n }\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport { readStdin } from '../stdin.js';\nimport { assertTmux } from '../tmux.js';\n\nexport function registerReport(program: Command): void {\n program\n .command('report')\n .description('Send a progress report without exiting (agent only)')\n .option('--message <message>', 'Progress report content')\n .action(async (opts: { message?: string }) => {\n assertTmux();\n const sessionId = process.env.SISYPHUS_SESSION_ID;\n const agentId = process.env.SISYPHUS_AGENT_ID;\n if (!sessionId || !agentId) {\n console.error('Error: SISYPHUS_SESSION_ID and SISYPHUS_AGENT_ID environment variables must be set');\n process.exit(1);\n }\n\n const content = opts.message ?? await readStdin();\n if (!content) {\n console.error('Error: provide --message or pipe content via stdin');\n process.exit(1);\n }\n\n const request: Request = { type: 'report', sessionId, agentId, content };\n const response = await sendRequest(request);\n if (response.ok) {\n console.log('Progress report recorded');\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\nimport { getTmuxSession, getTmuxWindow } from '../tmux.js';\n\nexport function registerResume(program: Command): void {\n program\n .command('resume')\n .description('Resume a paused session')\n .argument('<session-id>', 'Session ID to resume')\n .argument('[message]', 'Additional instructions for the orchestrator')\n .action(async (sessionId: string, message?: string) => {\n const tmuxSession = getTmuxSession();\n const tmuxWindow = getTmuxWindow();\n const cwd = process.cwd();\n const request: Request = { type: 'resume', sessionId, cwd, tmuxSession, tmuxWindow, message };\n const response = await sendRequest(request);\n if (response.ok) {\n console.log(`Session ${sessionId} resumed`);\n if (response.data?.tmuxWindow) {\n console.log(`Orchestrator respawned in tmux window: ${response.data.tmuxWindow}`);\n }\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { sendRequest } from '../client.js';\nimport type { Request } from '../../shared/protocol.js';\n\nexport function registerKill(program: Command): void {\n program\n .command('kill <sessionId>')\n .description('Kill a running session and all its agents')\n .action(async (sessionId: string) => {\n const request: Request = { type: 'kill', sessionId };\n const response = await sendRequest(request);\n if (response.ok) {\n console.log(`Session ${sessionId} killed.`);\n if (response.data) {\n const { killedAgents } = response.data as { killedAgents: number };\n console.log(`Cleaned up: ${killedAgents} agent(s) killed, tmux window removed.`);\n }\n } else {\n console.error(`Error: ${response.error}`);\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { createInterface } from 'node:readline';\nimport { uninstallDaemon } from '../install.js';\n\nasync function confirm(question: string): Promise<boolean> {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer.trim().toLowerCase() === 'y');\n });\n });\n}\n\nexport function registerUninstall(program: Command): void {\n program\n .command('uninstall')\n .description('Unload the sisyphus daemon from launchd and remove the plist')\n .option('--purge', 'Also remove all session data in ~/.sisyphus')\n .option('-y, --yes', 'Skip confirmation prompt for --purge')\n .action(async (opts: { purge?: boolean; yes?: boolean }) => {\n const purge = opts.purge ?? false;\n\n if (purge && !opts.yes) {\n const ok = await confirm('This will delete all session data in ~/.sisyphus. Continue? (y/N) ');\n if (!ok) {\n console.log('Aborted.');\n return;\n }\n }\n\n await uninstallDaemon(purge);\n });\n}\n"],"mappings":"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","names":["connect","resolve","resolve","connect","sleep","execSync","program","program","execSync","resolve","execSync","program","writeFileSync","program","writeFileSync","writeFileSync","program","writeFileSync","program","STATUS_COLORS","RESET","BOLD","DIM","program","program","program","program","resolve","program"]}
|