slavedriver 0.1.0
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 +165 -0
- package/agents/executor.md +26 -0
- package/agents/planner.md +41 -0
- package/agents/researcher.md +28 -0
- package/agents/verifier.md +25 -0
- package/dist/agents/backends/claude-code.d.ts +2 -0
- package/dist/agents/backends/claude-code.js +215 -0
- package/dist/agents/backends/claude-code.js.map +1 -0
- package/dist/agents/backends/mock.d.ts +9 -0
- package/dist/agents/backends/mock.js +31 -0
- package/dist/agents/backends/mock.js.map +1 -0
- package/dist/agents/context-builder.d.ts +10 -0
- package/dist/agents/context-builder.js +61 -0
- package/dist/agents/context-builder.js.map +1 -0
- package/dist/agents/prompt-compiler.d.ts +27 -0
- package/dist/agents/prompt-compiler.js +549 -0
- package/dist/agents/prompt-compiler.js.map +1 -0
- package/dist/agents/runtime.d.ts +40 -0
- package/dist/agents/runtime.js +2 -0
- package/dist/agents/runtime.js.map +1 -0
- package/dist/cli/arg-parser.d.ts +6 -0
- package/dist/cli/arg-parser.js +59 -0
- package/dist/cli/arg-parser.js.map +1 -0
- package/dist/cli/commands/config.d.ts +9 -0
- package/dist/cli/commands/config.js +120 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/dashboard.d.ts +1 -0
- package/dist/cli/commands/dashboard.js +54 -0
- package/dist/cli/commands/dashboard.js.map +1 -0
- package/dist/cli/commands/find-root.d.ts +14 -0
- package/dist/cli/commands/find-root.js +55 -0
- package/dist/cli/commands/find-root.js.map +1 -0
- package/dist/cli/commands/init.d.ts +1 -0
- package/dist/cli/commands/init.js +65 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/next.d.ts +1 -0
- package/dist/cli/commands/next.js +61 -0
- package/dist/cli/commands/next.js.map +1 -0
- package/dist/cli/commands/plan.d.ts +2 -0
- package/dist/cli/commands/plan.js +53 -0
- package/dist/cli/commands/plan.js.map +1 -0
- package/dist/cli/commands/replan.d.ts +1 -0
- package/dist/cli/commands/replan.js +54 -0
- package/dist/cli/commands/replan.js.map +1 -0
- package/dist/cli/commands/run-pipeline.d.ts +2 -0
- package/dist/cli/commands/run-pipeline.js +74 -0
- package/dist/cli/commands/run-pipeline.js.map +1 -0
- package/dist/cli/commands/run.d.ts +2 -0
- package/dist/cli/commands/run.js +106 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/status.d.ts +1 -0
- package/dist/cli/commands/status.js +51 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/verify.d.ts +1 -0
- package/dist/cli/commands/verify.js +63 -0
- package/dist/cli/commands/verify.js.map +1 -0
- package/dist/cli/commands/wizard.d.ts +8 -0
- package/dist/cli/commands/wizard.js +39 -0
- package/dist/cli/commands/wizard.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +82 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/wizard/index.d.ts +11 -0
- package/dist/cli/wizard/index.js +40 -0
- package/dist/cli/wizard/index.js.map +1 -0
- package/dist/cli/wizard/interview.d.ts +26 -0
- package/dist/cli/wizard/interview.js +284 -0
- package/dist/cli/wizard/interview.js.map +1 -0
- package/dist/cli/wizard/prompt.d.ts +18 -0
- package/dist/cli/wizard/prompt.js +72 -0
- package/dist/cli/wizard/prompt.js.map +1 -0
- package/dist/cli/wizard/template-generator.d.ts +8 -0
- package/dist/cli/wizard/template-generator.js +133 -0
- package/dist/cli/wizard/template-generator.js.map +1 -0
- package/dist/mcp/index.d.ts +2 -0
- package/dist/mcp/index.js +68 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/protocol.d.ts +33 -0
- package/dist/mcp/protocol.js +82 -0
- package/dist/mcp/protocol.js.map +1 -0
- package/dist/mcp/resources.d.ts +20 -0
- package/dist/mcp/resources.js +101 -0
- package/dist/mcp/resources.js.map +1 -0
- package/dist/mcp/run-manager.d.ts +36 -0
- package/dist/mcp/run-manager.js +179 -0
- package/dist/mcp/run-manager.js.map +1 -0
- package/dist/mcp/server.d.ts +13 -0
- package/dist/mcp/server.js +99 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.d.ts +32 -0
- package/dist/mcp/tools.js +259 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/orchestrator/alert-types.d.ts +16 -0
- package/dist/orchestrator/alert-types.js +2 -0
- package/dist/orchestrator/alert-types.js.map +1 -0
- package/dist/orchestrator/alerts.d.ts +20 -0
- package/dist/orchestrator/alerts.js +76 -0
- package/dist/orchestrator/alerts.js.map +1 -0
- package/dist/orchestrator/checkpoints.d.ts +8 -0
- package/dist/orchestrator/checkpoints.js +24 -0
- package/dist/orchestrator/checkpoints.js.map +1 -0
- package/dist/orchestrator/engine.d.ts +71 -0
- package/dist/orchestrator/engine.js +420 -0
- package/dist/orchestrator/engine.js.map +1 -0
- package/dist/orchestrator/phase-gates.d.ts +6 -0
- package/dist/orchestrator/phase-gates.js +127 -0
- package/dist/orchestrator/phase-gates.js.map +1 -0
- package/dist/orchestrator/plan-approval.d.ts +10 -0
- package/dist/orchestrator/plan-approval.js +51 -0
- package/dist/orchestrator/plan-approval.js.map +1 -0
- package/dist/orchestrator/safety.d.ts +22 -0
- package/dist/orchestrator/safety.js +126 -0
- package/dist/orchestrator/safety.js.map +1 -0
- package/dist/orchestrator/task-graph.d.ts +17 -0
- package/dist/orchestrator/task-graph.js +156 -0
- package/dist/orchestrator/task-graph.js.map +1 -0
- package/dist/orchestrator/wave-executor.d.ts +37 -0
- package/dist/orchestrator/wave-executor.js +237 -0
- package/dist/orchestrator/wave-executor.js.map +1 -0
- package/dist/session/in-process.d.ts +2 -0
- package/dist/session/in-process.js +149 -0
- package/dist/session/in-process.js.map +1 -0
- package/dist/session/log-capture.d.ts +7 -0
- package/dist/session/log-capture.js +56 -0
- package/dist/session/log-capture.js.map +1 -0
- package/dist/session/manager.d.ts +20 -0
- package/dist/session/manager.js +2 -0
- package/dist/session/manager.js.map +1 -0
- package/dist/state/file-store.d.ts +3 -0
- package/dist/state/file-store.js +124 -0
- package/dist/state/file-store.js.map +1 -0
- package/dist/state/lock.d.ts +6 -0
- package/dist/state/lock.js +71 -0
- package/dist/state/lock.js.map +1 -0
- package/dist/state/plan-parser.d.ts +6 -0
- package/dist/state/plan-parser.js +54 -0
- package/dist/state/plan-parser.js.map +1 -0
- package/dist/state/store.d.ts +27 -0
- package/dist/state/store.js +2 -0
- package/dist/state/store.js.map +1 -0
- package/dist/steps/events.d.ts +49 -0
- package/dist/steps/events.js +2 -0
- package/dist/steps/events.js.map +1 -0
- package/dist/steps/pipeline.d.ts +14 -0
- package/dist/steps/pipeline.js +284 -0
- package/dist/steps/pipeline.js.map +1 -0
- package/dist/steps/plan-parser.d.ts +35 -0
- package/dist/steps/plan-parser.js +147 -0
- package/dist/steps/plan-parser.js.map +1 -0
- package/dist/steps/runner.d.ts +13 -0
- package/dist/steps/runner.js +155 -0
- package/dist/steps/runner.js.map +1 -0
- package/dist/steps/store.d.ts +26 -0
- package/dist/steps/store.js +164 -0
- package/dist/steps/store.js.map +1 -0
- package/dist/steps/types.d.ts +36 -0
- package/dist/steps/types.js +2 -0
- package/dist/steps/types.js.map +1 -0
- package/dist/tui/app.d.ts +15 -0
- package/dist/tui/app.js +297 -0
- package/dist/tui/app.js.map +1 -0
- package/dist/tui/banner.d.ts +1 -0
- package/dist/tui/banner.js +11 -0
- package/dist/tui/banner.js.map +1 -0
- package/dist/tui/colors.d.ts +22 -0
- package/dist/tui/colors.js +30 -0
- package/dist/tui/colors.js.map +1 -0
- package/dist/tui/components/agent-panel.d.ts +8 -0
- package/dist/tui/components/agent-panel.js +80 -0
- package/dist/tui/components/agent-panel.js.map +1 -0
- package/dist/tui/components/header.d.ts +15 -0
- package/dist/tui/components/header.js +69 -0
- package/dist/tui/components/header.js.map +1 -0
- package/dist/tui/components/status-bar.d.ts +2 -0
- package/dist/tui/components/status-bar.js +8 -0
- package/dist/tui/components/status-bar.js.map +1 -0
- package/dist/tui/components/task-board.d.ts +3 -0
- package/dist/tui/components/task-board.js +96 -0
- package/dist/tui/components/task-board.js.map +1 -0
- package/dist/tui/display.d.ts +23 -0
- package/dist/tui/display.js +125 -0
- package/dist/tui/display.js.map +1 -0
- package/dist/tui/input.d.ts +2 -0
- package/dist/tui/input.js +44 -0
- package/dist/tui/input.js.map +1 -0
- package/dist/tui/layout-master.d.ts +7 -0
- package/dist/tui/layout-master.js +31 -0
- package/dist/tui/layout-master.js.map +1 -0
- package/dist/tui/layout.d.ts +13 -0
- package/dist/tui/layout.js +37 -0
- package/dist/tui/layout.js.map +1 -0
- package/dist/tui/pane-formatter.d.ts +27 -0
- package/dist/tui/pane-formatter.js +153 -0
- package/dist/tui/pane-formatter.js.map +1 -0
- package/dist/tui/renderer.d.ts +8 -0
- package/dist/tui/renderer.js +30 -0
- package/dist/tui/renderer.js.map +1 -0
- package/dist/tui/screen.d.ts +12 -0
- package/dist/tui/screen.js +32 -0
- package/dist/tui/screen.js.map +1 -0
- package/dist/tui/structured-display.d.ts +5 -0
- package/dist/tui/structured-display.js +74 -0
- package/dist/tui/structured-display.js.map +1 -0
- package/dist/tui/tmux-display.d.ts +6 -0
- package/dist/tui/tmux-display.js +187 -0
- package/dist/tui/tmux-display.js.map +1 -0
- package/dist/tui/tmux.d.ts +26 -0
- package/dist/tui/tmux.js +265 -0
- package/dist/tui/tmux.js.map +1 -0
- package/dist/types.d.ts +15 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/git.d.ts +6 -0
- package/dist/utils/git.js +35 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/hello.d.ts +1 -0
- package/dist/utils/hello.js +4 -0
- package/dist/utils/hello.js.map +1 -0
- package/dist/utils/id.d.ts +1 -0
- package/dist/utils/id.js +5 -0
- package/dist/utils/id.js.map +1 -0
- package/dist/utils/jsonl.d.ts +2 -0
- package/dist/utils/jsonl.js +18 -0
- package/dist/utils/jsonl.js.map +1 -0
- package/dist/utils/logger.d.ts +20 -0
- package/dist/utils/logger.js +40 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/pricing.d.ts +3 -0
- package/dist/utils/pricing.js +26 -0
- package/dist/utils/pricing.js.map +1 -0
- package/dist/utils/xml.d.ts +13 -0
- package/dist/utils/xml.js +67 -0
- package/dist/utils/xml.js.map +1 -0
- package/dist/utils/yaml.d.ts +5 -0
- package/dist/utils/yaml.js +126 -0
- package/dist/utils/yaml.js.map +1 -0
- package/package.json +45 -0
- package/templates/CONSTITUTION.md +10 -0
- package/templates/STATE.md +3 -0
- package/templates/config.json +11 -0
package/README.md
ADDED
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
# slavedriver
|
|
2
|
+
|
|
3
|
+
**Multi-agent orchestration that actually ships code.**
|
|
4
|
+
|
|
5
|
+
One command. Multiple AI agents. Parallel execution. Real results.
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npx slavedriver "build a REST API with auth, users, and tests"
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
slavedriver spawns a team of AI agents that discover your codebase, plan the work, execute tasks in parallel waves, and verify the results — all with a lazygit-style TUI you can watch and control.
|
|
12
|
+
|
|
13
|
+
## The Problem
|
|
14
|
+
|
|
15
|
+
Multi-agent orchestration is fragmented. Every framework picks one pattern and builds a universe around it. GSD has great wave execution but no TUI. OpenClaw has the best autonomous heartbeat but requires a full server. CrewAI has nice agent roles but locks you into their ecosystem. Ralph Wiggum's iterative loop is genius but it's just a bash script.
|
|
16
|
+
|
|
17
|
+
**slavedriver cherry-picks the best patterns from all of them into a single `npx` command.**
|
|
18
|
+
|
|
19
|
+
## Key Features
|
|
20
|
+
|
|
21
|
+
- **Wave Execution** — Tasks organized in dependency-aware waves that run in parallel (from GSD)
|
|
22
|
+
- **Full TUI** — lazygit/k9s-style terminal UI with task board, agent output, and live controls
|
|
23
|
+
- **Ralph Loop** — Iterative self-improvement mode: run, check, fix, repeat (from Ralph Wiggum)
|
|
24
|
+
- **Heartbeat Daemon** — Autonomous scheduled agent that checks on your project (from OpenClaw)
|
|
25
|
+
- **Fresh Context Per Task** — Every agent spawns clean. No context rot. Ever (from GSD)
|
|
26
|
+
- **Git Worktree Isolation** — Each agent works in its own branch/directory. No conflicts (from Claude Code Teams)
|
|
27
|
+
- **File-Based State** — No databases. `.slavedriver/` is the state. Human-readable. Git-friendly
|
|
28
|
+
- **Zero Production Dependencies** — Built-in Node.js APIs only
|
|
29
|
+
- **Model-Agnostic** — Claude Code CLI, Anthropic API, OpenAI, Ollama — bring your own backend
|
|
30
|
+
- **Safety First** — Budget limits, iteration caps, path exclusions, human approval gates
|
|
31
|
+
|
|
32
|
+
## Quick Start
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
# Run with a goal (discover -> plan -> execute -> verify)
|
|
36
|
+
npx slavedriver "add user authentication with JWT"
|
|
37
|
+
|
|
38
|
+
# Launch the interactive TUI
|
|
39
|
+
npx slavedriver
|
|
40
|
+
|
|
41
|
+
# Just generate a plan
|
|
42
|
+
npx slavedriver plan "refactor the database layer"
|
|
43
|
+
|
|
44
|
+
# Execute an existing plan
|
|
45
|
+
npx slavedriver run
|
|
46
|
+
|
|
47
|
+
# Run in Ralph Wiggum loop mode
|
|
48
|
+
npx slavedriver run --ralph
|
|
49
|
+
|
|
50
|
+
# Start the autonomous heartbeat daemon
|
|
51
|
+
npx slavedriver heartbeat --daemon
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## TUI
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
┌══════════════════════════════════════════════════════════════════┐
|
|
58
|
+
│ SLAVEDRIVER v0.1.0 │ Project: my-api │ Phase: EXECUTING │
|
|
59
|
+
│ Wave 2/4 │ Tasks: 3/12 done │ Agents: 3 active │ $0.42 │
|
|
60
|
+
├═══════════════════════╤══════════════════════════════════════════┤
|
|
61
|
+
│ │ │
|
|
62
|
+
│ TASK BOARD │ AGENT OUTPUT │
|
|
63
|
+
│ │ │
|
|
64
|
+
│ Wave 1 [████] DONE │ > planner (opus) │
|
|
65
|
+
│ [x] T1: Setup DB │ Analyzing codebase structure... │
|
|
66
|
+
│ [x] T2: Init proj │ Found 47 files across 12 modules. │
|
|
67
|
+
│ │ Generating task dependency graph... │
|
|
68
|
+
│ Wave 2 [██ ] 1/3 │ │
|
|
69
|
+
│ [x] T3: Auth │ ───────────────────────────────────── │
|
|
70
|
+
│ [>] T4: User CRUD │ > executor-1 (sonnet) │
|
|
71
|
+
│ [>] T5: API routes │ Writing src/routes/users.ts... │
|
|
72
|
+
│ │ Created 4 endpoints: GET, POST, │
|
|
73
|
+
│ Wave 3 [ ] 0/2 │ PUT, DELETE. Running tsc... OK │
|
|
74
|
+
│ [ ] T6: Tests │ │
|
|
75
|
+
│ [ ] T7: Integrate │ ───────────────────────────────────── │
|
|
76
|
+
│ │ > executor-2 (sonnet) │
|
|
77
|
+
│ Wave 4 [ ] 0/1 │ Implementing auth middleware... │
|
|
78
|
+
│ [ ] T8: Deploy │ JWT generation complete. │
|
|
79
|
+
│ │ │
|
|
80
|
+
├═══════════════════════╧══════════════════════════════════════════┤
|
|
81
|
+
│ [q]uit [p]ause [r]esume [a]bort [l]ogs [t]asks [Tab]focus [?] │
|
|
82
|
+
│ > _ │
|
|
83
|
+
└══════════════════════════════════════════════════════════════════┘
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Architecture Overview
|
|
87
|
+
|
|
88
|
+
```
|
|
89
|
+
CLI / TUI
|
|
90
|
+
│
|
|
91
|
+
├── Orchestrator (state machine: DISCOVER → PLAN → EXECUTE → VERIFY)
|
|
92
|
+
│ │
|
|
93
|
+
│ ├── Task Graph (DAG with wave-based parallel execution)
|
|
94
|
+
│ ├── Safety Engine (budgets, caps, exclusions)
|
|
95
|
+
│ ├── Heartbeat Daemon (autonomous scheduled runs)
|
|
96
|
+
│ └── Ralph Loop (iterative self-improvement mode)
|
|
97
|
+
│
|
|
98
|
+
├── Session Manager (tmux backend + git worktree isolation)
|
|
99
|
+
│ │
|
|
100
|
+
│ └── Agent 1..N (each in isolated worktree + fresh context)
|
|
101
|
+
│
|
|
102
|
+
├── Agent Runtime (model-agnostic abstraction)
|
|
103
|
+
│ │
|
|
104
|
+
│ └── Backends: Claude Code CLI | Anthropic API | OpenAI | Ollama
|
|
105
|
+
│
|
|
106
|
+
└── State Store (file-based, .slavedriver/ directory)
|
|
107
|
+
│
|
|
108
|
+
├── STATE.md, PLAN.md, CONTEXT.md
|
|
109
|
+
├── tasks.jsonl (append-only event log)
|
|
110
|
+
└── config.json
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
See [`.planning/ARCHITECTURE.md`](.planning/ARCHITECTURE.md) for the full system design.
|
|
114
|
+
|
|
115
|
+
## Project Structure
|
|
116
|
+
|
|
117
|
+
```
|
|
118
|
+
.slavedriver/ # Per-project state (created by `slavedriver init`)
|
|
119
|
+
├── config.json # Project configuration + safety limits
|
|
120
|
+
├── STATE.md # Current project state (<100 lines, always current)
|
|
121
|
+
├── CONTEXT.md # Locked decisions all agents must respect
|
|
122
|
+
├── PLAN.md # XML-structured task plan with waves
|
|
123
|
+
├── CONSTITUTION.md # Project-level non-negotiable principles
|
|
124
|
+
├── HEARTBEAT.md # What the heartbeat daemon should check
|
|
125
|
+
├── tasks.jsonl # Append-only task event log
|
|
126
|
+
├── sessions/ # Agent session data
|
|
127
|
+
├── memory/ # Per-agent persistent memory
|
|
128
|
+
└── worktrees/ # Git worktree directories per agent
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## Inspiration & Credits
|
|
132
|
+
|
|
133
|
+
slavedriver stands on the shoulders of these projects:
|
|
134
|
+
|
|
135
|
+
| Project | What We Took | License |
|
|
136
|
+
|---------|-------------|---------|
|
|
137
|
+
| [GSD](https://github.com/get-shit-done) | Wave execution, fresh context per task, atomic commits, `.planning/` pattern | MIT |
|
|
138
|
+
| [OpenClaw](https://docs.openclaw.ai) | Heartbeat daemon, skills system, file-based state philosophy | MIT |
|
|
139
|
+
| [Ralph Wiggum Loop](https://ghuntley.com/ralph/) | Iterative self-improvement loop, worker/reviewer dual-model, git-as-memory | MIT |
|
|
140
|
+
| [Goose](https://github.com/block/goose) | MCP extension system, recipe format, permission modes, subagent limits | Apache 2.0 |
|
|
141
|
+
| [Warp Terminal](https://www.warp.dev) | Block-based output, tiered approval UX, agent management panel, Oz orchestration | Proprietary |
|
|
142
|
+
| [BMAD](https://github.com/bmad-method) | Artifact-first development, quality gates, agent roles | MIT |
|
|
143
|
+
| [Spec Kit](https://github.com/spec-kit) | Spec-driven workflow, phase context templates | MIT |
|
|
144
|
+
| [Claude Code](https://docs.anthropic.com) | Git worktree isolation, orchestrator-worker, hooks system, stream JSON | — |
|
|
145
|
+
| [Claude Cowork](https://claude.com/blog/cowork-research-preview) | No-code plugin system, VM sandboxing, two-tier parallelism, 15+ lifecycle hooks | — |
|
|
146
|
+
| [CrewAI](https://github.com/crewai) | Role-based agents, crew/flow hybrid, YAML agent definitions | Apache 2.0 |
|
|
147
|
+
| [Devin](https://devin.ai) | Four-tab workspace, following toggle, auto-proceed approval, machine snapshots | Proprietary |
|
|
148
|
+
| [Cursor](https://cursor.com) | Agent sessions sidebar, parallel agents, aggregated diff view | Proprietary |
|
|
149
|
+
| [LangGraph Studio](https://github.com/langchain-ai/langgraph) | Time travel / state forking, graph-as-execution-trace | MIT |
|
|
150
|
+
|
|
151
|
+
## Documentation
|
|
152
|
+
|
|
153
|
+
- [Architecture](.planning/ARCHITECTURE.md) — Full system design, interfaces, state machines
|
|
154
|
+
- [Requirements](.planning/REQUIREMENTS.md) — All v1 requirements with IDs
|
|
155
|
+
- [Roadmap](.planning/ROADMAP.md) — Phased milestones and success criteria
|
|
156
|
+
- [Stack](.planning/STACK.md) — Technology decisions and rationale
|
|
157
|
+
- [Conventions](.planning/CONVENTIONS.md) — Coding standards and patterns
|
|
158
|
+
- [Research](.planning/RESEARCH.md) — Framework analysis and pattern extraction
|
|
159
|
+
- [References](.planning/references/INDEX.md) — Deep implementation references from all inspiration projects
|
|
160
|
+
- [Project State](.planning/STATE.md) — Current status and open questions
|
|
161
|
+
- [Constitution](CONSTITUTION.md) — Non-negotiable project principles
|
|
162
|
+
|
|
163
|
+
## License
|
|
164
|
+
|
|
165
|
+
MIT
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: executor
|
|
3
|
+
role: "Code implementation specialist"
|
|
4
|
+
model: sonnet
|
|
5
|
+
maxTurns: 50
|
|
6
|
+
tools:
|
|
7
|
+
- Read
|
|
8
|
+
- Write
|
|
9
|
+
- Edit
|
|
10
|
+
- Bash
|
|
11
|
+
- Glob
|
|
12
|
+
- Grep
|
|
13
|
+
color: green
|
|
14
|
+
icon: ">"
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
You are an executor agent for slavedriver. Your job is to implement a single task as described in your prompt.
|
|
18
|
+
|
|
19
|
+
## Rules
|
|
20
|
+
|
|
21
|
+
- Read existing code before modifying it
|
|
22
|
+
- Follow the project's coding conventions
|
|
23
|
+
- Write clean, working code — not placeholder stubs
|
|
24
|
+
- Run tests if they exist
|
|
25
|
+
- Create one atomic commit when done
|
|
26
|
+
- Do not modify files outside your task scope
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: planner
|
|
3
|
+
role: "Strategic task planning and decomposition"
|
|
4
|
+
model: opus
|
|
5
|
+
maxTurns: 30
|
|
6
|
+
color: blue
|
|
7
|
+
icon: "P"
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
You are a planner agent for slavedriver. Your job is to analyze a codebase and create a structured task plan.
|
|
11
|
+
|
|
12
|
+
## Your Output
|
|
13
|
+
|
|
14
|
+
You MUST output a valid PLAN.md with this exact format:
|
|
15
|
+
|
|
16
|
+
# Plan: [Goal Description]
|
|
17
|
+
|
|
18
|
+
## Must-Haves
|
|
19
|
+
- [List of verification criteria]
|
|
20
|
+
|
|
21
|
+
## Tasks
|
|
22
|
+
|
|
23
|
+
<task id="T1" wave="1" agent="executor" priority="critical">
|
|
24
|
+
<title>Task title</title>
|
|
25
|
+
<depends-on></depends-on>
|
|
26
|
+
<description>What to do</description>
|
|
27
|
+
<must-haves>
|
|
28
|
+
- Specific success criteria
|
|
29
|
+
</must-haves>
|
|
30
|
+
<verification>How to verify</verification>
|
|
31
|
+
<mode>one-shot</mode>
|
|
32
|
+
</task>
|
|
33
|
+
|
|
34
|
+
## Rules
|
|
35
|
+
|
|
36
|
+
- Group independent tasks into the same wave
|
|
37
|
+
- Tasks that depend on others go in later waves
|
|
38
|
+
- Every task must have clear, testable must-haves
|
|
39
|
+
- Prefer smaller, focused tasks over large ones
|
|
40
|
+
- Use "critical" priority for tasks that block everything
|
|
41
|
+
- Use "ralph-loop" mode only for tasks requiring iterative correctness
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: researcher
|
|
3
|
+
role: "Codebase analysis and exploration"
|
|
4
|
+
model: haiku
|
|
5
|
+
maxTurns: 15
|
|
6
|
+
color: cyan
|
|
7
|
+
icon: "R"
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
You are a researcher agent for slavedriver. Your job is to analyze a codebase and produce a concise summary.
|
|
11
|
+
|
|
12
|
+
## Process
|
|
13
|
+
|
|
14
|
+
1. Check for project files (package.json, Cargo.toml, go.mod, etc.)
|
|
15
|
+
2. List the directory structure
|
|
16
|
+
3. Read key files (entry points, configs, READMEs)
|
|
17
|
+
4. Identify architecture patterns, frameworks, and conventions
|
|
18
|
+
|
|
19
|
+
## Output
|
|
20
|
+
|
|
21
|
+
Write a concise STATE.md with:
|
|
22
|
+
- Project type and language
|
|
23
|
+
- Framework and key dependencies
|
|
24
|
+
- Directory structure summary
|
|
25
|
+
- Architecture patterns
|
|
26
|
+
- Entry points
|
|
27
|
+
- Test setup
|
|
28
|
+
- Key conventions to follow
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: verifier
|
|
3
|
+
role: "Goal-backward verification specialist"
|
|
4
|
+
model: opus
|
|
5
|
+
maxTurns: 20
|
|
6
|
+
color: yellow
|
|
7
|
+
icon: "V"
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
You are a verifier agent for slavedriver. Your job is to check whether the planned must-haves have been achieved.
|
|
11
|
+
|
|
12
|
+
## Process
|
|
13
|
+
|
|
14
|
+
1. Read the must-haves from the plan
|
|
15
|
+
2. For each must-have, check the actual codebase
|
|
16
|
+
3. Run tests, type checks, and linting if applicable
|
|
17
|
+
4. Report PASS if all must-haves are met, FAIL with specific gaps if not
|
|
18
|
+
|
|
19
|
+
## Output Format
|
|
20
|
+
|
|
21
|
+
For each must-have:
|
|
22
|
+
- [PASS] or [FAIL]: description
|
|
23
|
+
- If FAIL: what's missing and what needs to be done
|
|
24
|
+
|
|
25
|
+
Final verdict: PASS or FAIL
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import { spawn, execFile } from 'node:child_process';
|
|
2
|
+
// Remove CLAUDECODE env var so spawned claude processes don't think they're nested
|
|
3
|
+
function cleanEnv() {
|
|
4
|
+
const env = { ...process.env };
|
|
5
|
+
delete env.CLAUDECODE;
|
|
6
|
+
return env;
|
|
7
|
+
}
|
|
8
|
+
export function createClaudeCodeRuntime() {
|
|
9
|
+
const activeProcesses = new Map();
|
|
10
|
+
return {
|
|
11
|
+
type: 'claude-code',
|
|
12
|
+
async isAvailable() {
|
|
13
|
+
return new Promise((resolve) => {
|
|
14
|
+
execFile('claude', ['--version'], { env: cleanEnv() }, (error) => {
|
|
15
|
+
resolve(error === null);
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
},
|
|
19
|
+
async *execute(params) {
|
|
20
|
+
const args = buildArgs(params);
|
|
21
|
+
const child = spawn('claude', args, {
|
|
22
|
+
cwd: params.workingDirectory,
|
|
23
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
24
|
+
env: cleanEnv(),
|
|
25
|
+
});
|
|
26
|
+
activeProcesses.set(params.executionId, child);
|
|
27
|
+
// Pipe prompt to stdin
|
|
28
|
+
if (child.stdin) {
|
|
29
|
+
child.stdin.write(params.prompt);
|
|
30
|
+
child.stdin.end();
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
yield* parseNdjsonStream(child, params.executionId);
|
|
34
|
+
}
|
|
35
|
+
finally {
|
|
36
|
+
activeProcesses.delete(params.executionId);
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
async abort(executionId) {
|
|
40
|
+
const child = activeProcesses.get(executionId);
|
|
41
|
+
if (child) {
|
|
42
|
+
child.kill('SIGTERM');
|
|
43
|
+
activeProcesses.delete(executionId);
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
function buildArgs(params) {
|
|
49
|
+
const args = ['-p', '--output-format', 'stream-json'];
|
|
50
|
+
if (params.model !== undefined) {
|
|
51
|
+
args.push('--model', params.model);
|
|
52
|
+
}
|
|
53
|
+
if (params.maxTurns !== undefined) {
|
|
54
|
+
args.push('--max-turns', String(params.maxTurns));
|
|
55
|
+
}
|
|
56
|
+
if (params.allowedTools !== undefined && params.allowedTools.length > 0) {
|
|
57
|
+
args.push('--allowedTools', params.allowedTools.join(','));
|
|
58
|
+
}
|
|
59
|
+
if (params.systemPrompt !== undefined) {
|
|
60
|
+
args.push('--append-system-prompt', params.systemPrompt);
|
|
61
|
+
}
|
|
62
|
+
if (params.dangerouslySkipPermissions === true) {
|
|
63
|
+
args.push('--dangerously-skip-permissions');
|
|
64
|
+
}
|
|
65
|
+
return args;
|
|
66
|
+
}
|
|
67
|
+
async function* parseNdjsonStream(child, executionId) {
|
|
68
|
+
const stdout = child.stdout;
|
|
69
|
+
if (!stdout) {
|
|
70
|
+
yield { type: 'error', error: `No stdout for execution ${executionId}` };
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
let buffer = '';
|
|
74
|
+
const events = [];
|
|
75
|
+
let done = false;
|
|
76
|
+
let resolveWait;
|
|
77
|
+
let error;
|
|
78
|
+
function onData(chunk) {
|
|
79
|
+
buffer += chunk.toString('utf-8');
|
|
80
|
+
const lines = buffer.split('\n');
|
|
81
|
+
buffer = lines.pop() ?? '';
|
|
82
|
+
for (const line of lines) {
|
|
83
|
+
const trimmed = line.trim();
|
|
84
|
+
if (trimmed === '')
|
|
85
|
+
continue;
|
|
86
|
+
try {
|
|
87
|
+
const parsed = JSON.parse(trimmed);
|
|
88
|
+
const mapped = mapClaudeEvent(parsed);
|
|
89
|
+
for (const event of mapped) {
|
|
90
|
+
events.push(event);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
// Skip malformed JSON lines
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
if (resolveWait) {
|
|
98
|
+
const r = resolveWait;
|
|
99
|
+
resolveWait = undefined;
|
|
100
|
+
r();
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
function onError(err) {
|
|
104
|
+
error = err.message;
|
|
105
|
+
done = true;
|
|
106
|
+
if (resolveWait) {
|
|
107
|
+
const r = resolveWait;
|
|
108
|
+
resolveWait = undefined;
|
|
109
|
+
r();
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
function onClose() {
|
|
113
|
+
// Process remaining buffer
|
|
114
|
+
if (buffer.trim() !== '') {
|
|
115
|
+
try {
|
|
116
|
+
const parsed = JSON.parse(buffer.trim());
|
|
117
|
+
const mapped = mapClaudeEvent(parsed);
|
|
118
|
+
for (const event of mapped) {
|
|
119
|
+
events.push(event);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
// Skip malformed final line
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
done = true;
|
|
127
|
+
if (resolveWait) {
|
|
128
|
+
const r = resolveWait;
|
|
129
|
+
resolveWait = undefined;
|
|
130
|
+
r();
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
stdout.on('data', onData);
|
|
134
|
+
child.on('error', onError);
|
|
135
|
+
child.on('close', onClose);
|
|
136
|
+
try {
|
|
137
|
+
while (true) {
|
|
138
|
+
while (events.length > 0) {
|
|
139
|
+
yield events.shift();
|
|
140
|
+
}
|
|
141
|
+
if (done)
|
|
142
|
+
break;
|
|
143
|
+
await new Promise((resolve) => {
|
|
144
|
+
resolveWait = resolve;
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
// Yield any remaining events
|
|
148
|
+
while (events.length > 0) {
|
|
149
|
+
yield events.shift();
|
|
150
|
+
}
|
|
151
|
+
if (error !== undefined) {
|
|
152
|
+
yield { type: 'error', error };
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
finally {
|
|
156
|
+
stdout.removeListener('data', onData);
|
|
157
|
+
child.removeListener('error', onError);
|
|
158
|
+
child.removeListener('close', onClose);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
function mapClaudeEvent(raw) {
|
|
162
|
+
if (raw === null || typeof raw !== 'object')
|
|
163
|
+
return [];
|
|
164
|
+
const obj = raw;
|
|
165
|
+
const eventType = obj.type;
|
|
166
|
+
if (eventType === 'assistant') {
|
|
167
|
+
return mapAssistantEvent(obj);
|
|
168
|
+
}
|
|
169
|
+
if (eventType === 'tool_use') {
|
|
170
|
+
const tool = typeof obj.name === 'string' ? obj.name : 'unknown';
|
|
171
|
+
return [{ type: 'tool_use', tool, input: obj.input }];
|
|
172
|
+
}
|
|
173
|
+
if (eventType === 'tool_result') {
|
|
174
|
+
const tool = typeof obj.name === 'string' ? obj.name : 'unknown';
|
|
175
|
+
return [{ type: 'tool_result', tool, output: obj.output }];
|
|
176
|
+
}
|
|
177
|
+
if (eventType === 'result') {
|
|
178
|
+
const events = [];
|
|
179
|
+
const inputTokens = typeof obj.input_tokens === 'number' ? obj.input_tokens : 0;
|
|
180
|
+
const outputTokens = typeof obj.output_tokens === 'number' ? obj.output_tokens : 0;
|
|
181
|
+
events.push({
|
|
182
|
+
type: 'cost_update',
|
|
183
|
+
inputTokens,
|
|
184
|
+
outputTokens,
|
|
185
|
+
});
|
|
186
|
+
const result = typeof obj.result === 'string'
|
|
187
|
+
? obj.result
|
|
188
|
+
: typeof obj.message === 'string'
|
|
189
|
+
? obj.message
|
|
190
|
+
: '';
|
|
191
|
+
events.push({ type: 'complete', result });
|
|
192
|
+
return events;
|
|
193
|
+
}
|
|
194
|
+
return [];
|
|
195
|
+
}
|
|
196
|
+
function mapAssistantEvent(obj) {
|
|
197
|
+
const events = [];
|
|
198
|
+
const message = obj.message;
|
|
199
|
+
if (message !== null && typeof message === 'object') {
|
|
200
|
+
const msg = message;
|
|
201
|
+
const content = msg.content;
|
|
202
|
+
if (Array.isArray(content)) {
|
|
203
|
+
for (const block of content) {
|
|
204
|
+
if (block !== null && typeof block === 'object') {
|
|
205
|
+
const b = block;
|
|
206
|
+
if (b.type === 'text' && typeof b.text === 'string') {
|
|
207
|
+
events.push({ type: 'text_delta', text: b.text });
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return events;
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=claude-code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../src/agents/backends/claude-code.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { AgentRuntime, AgentEvent } from '../runtime.js';
|
|
2
|
+
export interface MockConfig {
|
|
3
|
+
readonly events?: readonly AgentEvent[];
|
|
4
|
+
readonly delay?: number;
|
|
5
|
+
readonly shouldFail?: boolean;
|
|
6
|
+
readonly errorMessage?: string;
|
|
7
|
+
readonly isAvailableResult?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare function createMockRuntime(config: MockConfig): AgentRuntime;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export function createMockRuntime(config) {
|
|
2
|
+
return {
|
|
3
|
+
type: 'mock',
|
|
4
|
+
async isAvailable() {
|
|
5
|
+
return config.isAvailableResult ?? true;
|
|
6
|
+
},
|
|
7
|
+
async *execute(_params) {
|
|
8
|
+
if (config.shouldFail === true) {
|
|
9
|
+
yield {
|
|
10
|
+
type: 'error',
|
|
11
|
+
error: config.errorMessage ?? 'Mock execution failed',
|
|
12
|
+
};
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
const events = config.events ?? [];
|
|
16
|
+
for (const event of events) {
|
|
17
|
+
if (config.delay !== undefined && config.delay > 0) {
|
|
18
|
+
await sleep(config.delay);
|
|
19
|
+
}
|
|
20
|
+
yield event;
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
async abort(_executionId) {
|
|
24
|
+
// no-op for mock
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function sleep(ms) {
|
|
29
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=mock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock.js","sourceRoot":"","sources":["../../../src/agents/backends/mock.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,iBAAiB,CAAC,MAAkB;IAClD,OAAO;QACL,IAAI,EAAE,MAAM;QAEZ,KAAK,CAAC,WAAW;YACf,OAAO,MAAM,CAAC,iBAAiB,IAAI,IAAI,CAAC;QAC1C,CAAC;QAED,KAAK,CAAC,CAAC,OAAO,CAAC,OAA2B;YACxC,IAAI,MAAM,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;gBAC/B,MAAM;oBACJ,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE,MAAM,CAAC,YAAY,IAAI,uBAAuB;iBACtD,CAAC;gBACF,OAAO;YACT,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;YACnC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;oBACnD,MAAM,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC5B,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;QAED,KAAK,CAAC,KAAK,CAAC,YAAoB;YAC9B,iBAAiB;QACnB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Task } from '../types.js';
|
|
2
|
+
import type { StateStore } from '../state/store.js';
|
|
3
|
+
export interface BuildContextParams {
|
|
4
|
+
readonly task: Task;
|
|
5
|
+
readonly store: StateStore;
|
|
6
|
+
readonly constitution?: string;
|
|
7
|
+
readonly dependencySummaries?: Record<string, string>;
|
|
8
|
+
readonly waveSummary?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function buildContext(params: BuildContextParams): Promise<string>;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
export async function buildContext(params) {
|
|
2
|
+
const { task, store, constitution, dependencySummaries, waveSummary } = params;
|
|
3
|
+
const sections = [];
|
|
4
|
+
// Task header
|
|
5
|
+
sections.push(`# Task: ${task.title}`);
|
|
6
|
+
// Description
|
|
7
|
+
sections.push('## Description');
|
|
8
|
+
sections.push(task.description);
|
|
9
|
+
// Must-Haves
|
|
10
|
+
if (task.mustHaves.length > 0) {
|
|
11
|
+
sections.push('## Must-Haves');
|
|
12
|
+
sections.push(task.mustHaves.map((item) => `- ${item}`).join('\n'));
|
|
13
|
+
}
|
|
14
|
+
// Verification
|
|
15
|
+
if (task.verification) {
|
|
16
|
+
sections.push('## Verification');
|
|
17
|
+
sections.push(task.verification);
|
|
18
|
+
}
|
|
19
|
+
// Completed Dependency Outputs
|
|
20
|
+
if (dependencySummaries && Object.keys(dependencySummaries).length > 0) {
|
|
21
|
+
sections.push('## Completed Dependency Outputs');
|
|
22
|
+
for (const [key, summary] of Object.entries(dependencySummaries)) {
|
|
23
|
+
sections.push(`### ${key}`);
|
|
24
|
+
sections.push(summary);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
// Previous Wave Summary
|
|
28
|
+
if (waveSummary) {
|
|
29
|
+
sections.push('## Previous Wave Summary');
|
|
30
|
+
sections.push(waveSummary);
|
|
31
|
+
}
|
|
32
|
+
// Project State
|
|
33
|
+
const stateContent = await safeRead(() => store.readState());
|
|
34
|
+
if (stateContent) {
|
|
35
|
+
sections.push('## Project State');
|
|
36
|
+
sections.push(stateContent);
|
|
37
|
+
}
|
|
38
|
+
// Project Context
|
|
39
|
+
const contextContent = await safeRead(() => store.readContext());
|
|
40
|
+
if (contextContent) {
|
|
41
|
+
sections.push('## Project Context');
|
|
42
|
+
sections.push(contextContent);
|
|
43
|
+
}
|
|
44
|
+
// Constitution
|
|
45
|
+
const constitutionContent = constitution ?? await safeRead(() => store.readConstitution());
|
|
46
|
+
if (constitutionContent) {
|
|
47
|
+
sections.push('## Constitution');
|
|
48
|
+
sections.push(constitutionContent);
|
|
49
|
+
}
|
|
50
|
+
return sections.join('\n\n');
|
|
51
|
+
}
|
|
52
|
+
async function safeRead(fn) {
|
|
53
|
+
try {
|
|
54
|
+
const content = await fn();
|
|
55
|
+
return content || undefined;
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=context-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-builder.js","sourceRoot":"","sources":["../../src/agents/context-builder.ts"],"names":[],"mappings":"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"}
|