@matt82198/aesop 0.1.0-beta.4 → 0.1.0-rc.1
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/CHANGELOG.md +187 -5
- package/LICENSE +66 -21
- package/README.md +143 -23
- package/aesop.config.example.json +14 -1
- package/bin/CLAUDE.md +42 -5
- package/bin/cli.js +479 -95
- package/daemons/CLAUDE.md +5 -2
- package/daemons/backup-fleet.sh +209 -51
- package/daemons/run-watchdog.sh +211 -62
- package/dash/dash-extra.mjs +73 -4
- package/dash/watchdog-gui.sh +41 -35
- package/docs/ARCHITECTURE.md +296 -0
- package/docs/CONCEPTS.md +254 -0
- package/docs/CONFIGURE.md +256 -0
- package/docs/FIRST-WAVE.md +276 -0
- package/docs/INSTALL.md +224 -0
- package/docs/README.md +176 -27
- package/docs/RELEASING.md +159 -0
- package/docs/archive/README.md +3 -0
- package/docs/{spikes → archive/spikes}/tiered-cognition/README.md +1 -3
- package/docs/autonomous-swe.md +149 -0
- package/docs/case-study-portfolio.md +61 -0
- package/docs/reproduce.md +121 -0
- package/docs/self-stats-data.json +11 -0
- package/docs/templates/FLEET-OPS-ANALYSIS.example.md +27 -0
- package/docs/templates/FLEET-OPS-RECOMMENDATIONS.example.md +24 -0
- package/docs/templates/PROPOSALS-LOG.example.md +64 -0
- package/hooks/CLAUDE.md +51 -0
- package/hooks/install-waveguard.sh +68 -0
- package/hooks/pre-commit-waveguard.sh +26 -0
- package/hooks/pre-push-policy.sh +253 -15
- package/mcp/CLAUDE.md +213 -0
- package/mcp/package.json +26 -0
- package/mcp/server.mjs +543 -0
- package/monitor/CHARTER.md +76 -110
- package/monitor/CLAUDE.md +3 -3
- package/monitor/collect-signals.mjs +218 -20
- package/package.json +17 -6
- package/scan/CLAUDE.md +30 -0
- package/scan/fleet-scan.example.mjs +292 -0
- package/skills/CLAUDE.md +1 -0
- package/skills/healthcheck/SKILL.md +44 -0
- package/state_store/CLAUDE.md +39 -0
- package/state_store/__init__.py +24 -0
- package/state_store/api.py +35 -0
- package/state_store/export.py +19 -0
- package/state_store/ingest.py +41 -0
- package/state_store/projections.py +126 -0
- package/state_store/store.py +197 -0
- package/tools/CLAUDE.md +37 -149
- package/tools/alert_bridge.py +453 -0
- package/tools/bench_runner.py +438 -0
- package/tools/buildlog.py +4 -7
- package/tools/ci_merge_wait.py +308 -14
- package/tools/common.py +62 -0
- package/tools/cost_ceiling.py +191 -0
- package/tools/dash.js +102 -0
- package/tools/doctor.js +220 -0
- package/tools/fleet_ledger.py +189 -17
- package/tools/fleet_prompt_extractor.py +134 -0
- package/tools/halt.py +172 -0
- package/tools/healthcheck.py +299 -0
- package/tools/heartbeat.py +4 -7
- package/tools/metrics_gate.py +8 -2
- package/tools/orchestrator_status.py +4 -9
- package/tools/reconcile.py +277 -0
- package/tools/rotate_logs.py +152 -62
- package/tools/scanner_selftest.py +28 -3
- package/tools/secret_scan.py +367 -91
- package/tools/self_stats.py +797 -0
- package/tools/session_usage_summary.py +198 -0
- package/tools/status.js +187 -0
- package/tools/svg_to_png.mjs +50 -0
- package/tools/transcript_replay.py +236 -0
- package/tools/transcript_timeline.py +184 -0
- package/tools/verify_agent_inspector.py +289 -0
- package/tools/verify_dash.py +361 -542
- package/tools/verify_prboard.py +344 -0
- package/tools/verify_submit_encoding.py +12 -4
- package/tools/watch.js +49 -0
- package/ui/CLAUDE.md +59 -41
- package/ui/agents.py +337 -34
- package/ui/api/submit.py +44 -5
- package/ui/api/tracker.py +15 -7
- package/ui/collectors.py +294 -52
- package/ui/config.py +31 -2
- package/ui/cost.py +355 -0
- package/ui/csrf.py +9 -4
- package/ui/handler.py +450 -12
- package/ui/render.py +26 -6
- package/ui/sse.py +114 -13
- package/ui/wave_prs.py +230 -0
- package/ui/web/dist/assets/index-0qQYnvMC.js +9 -0
- package/ui/web/dist/assets/index-BdIlFieV.css +1 -0
- package/ui/web/dist/index.html +14 -0
- package/monitor/.signal-state.json +0 -3
- package/monitor/ACTIONS.log +0 -1
- package/monitor/BRIEF.md +0 -24
- package/monitor/SIGNALS.json +0 -54
- package/tools/__pycache__/buildlog.cpython-314.pyc +0 -0
- package/tools/__pycache__/ci_merge_wait.cpython-314.pyc +0 -0
- package/tools/__pycache__/ensure_state.cpython-314.pyc +0 -0
- package/tools/__pycache__/eod_sweep.cpython-314.pyc +0 -0
- package/tools/__pycache__/fleet_ledger.cpython-314.pyc +0 -0
- package/tools/__pycache__/heartbeat.cpython-314.pyc +0 -0
- package/tools/__pycache__/inbox_drain.cpython-314.pyc +0 -0
- package/tools/__pycache__/launch_tui.cpython-314.pyc +0 -0
- package/tools/__pycache__/orchestrator_status.cpython-314.pyc +0 -0
- package/tools/__pycache__/power_selftest.cpython-314.pyc +0 -0
- package/tools/__pycache__/prepublish_scan.cpython-314.pyc +0 -0
- package/tools/__pycache__/rotate_logs.cpython-314.pyc +0 -0
- package/tools/__pycache__/scanner_selftest.cpython-314.pyc +0 -0
- package/tools/__pycache__/secret_scan.cpython-314.pyc +0 -0
- package/tools/__pycache__/stall_check.cpython-314.pyc +0 -0
- package/tools/__pycache__/verify_dash.cpython-314.pyc +0 -0
- package/tools/__pycache__/verify_submit_encoding.cpython-314.pyc +0 -0
- package/ui/__pycache__/agents.cpython-314.pyc +0 -0
- package/ui/__pycache__/collectors.cpython-314.pyc +0 -0
- package/ui/__pycache__/config.cpython-314.pyc +0 -0
- package/ui/__pycache__/csrf.cpython-314.pyc +0 -0
- package/ui/__pycache__/handler.cpython-314.pyc +0 -0
- package/ui/__pycache__/render.cpython-314.pyc +0 -0
- package/ui/__pycache__/serve.cpython-314.pyc +0 -0
- package/ui/__pycache__/sse.cpython-314.pyc +0 -0
- package/ui/api/__pycache__/__init__.cpython-314.pyc +0 -0
- package/ui/api/__pycache__/submit.cpython-314.pyc +0 -0
- package/ui/api/__pycache__/tracker.cpython-314.pyc +0 -0
- package/ui/templates/dashboard.html +0 -1202
- /package/docs/{spikes → archive/spikes}/tiered-cognition/ACTIVATION.md +0 -0
- /package/docs/{spikes → archive/spikes}/tiered-cognition/DESIGN.md +0 -0
- /package/docs/{spikes → archive/spikes}/tiered-cognition/FINDINGS.md +0 -0
- /package/docs/{spikes → archive/spikes}/tiered-cognition/aesop-cognition.example.md +0 -0
- /package/docs/{spikes → archive/spikes}/tiered-cognition/force-model-policy.merged.mjs +0 -0
- /package/docs/{spikes → archive/spikes}/tiered-cognition/strip-tools-hook.mjs +0 -0
package/docs/CONCEPTS.md
ADDED
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
# Key Concepts
|
|
2
|
+
|
|
3
|
+
**TL;DR**: Aesop runs cheap, fast delivery waves via a dispatch model (Haiku-first subagents + lean orchestrator), durable state (git-committed checkpoints), and security gates. This page introduces the concepts; links below go to deep-dive reference docs.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## The Wave Cycle
|
|
8
|
+
|
|
9
|
+
A **wave** is one complete delivery loop: rank backlog → dispatch parallel agents → verify & merge → audit & close. Each wave ships 3–8 tested features/fixes and feeds findings into the next wave's backlog.
|
|
10
|
+
|
|
11
|
+
**Wallclock**: 2–3 hours
|
|
12
|
+
**Cost**: ~$0.03–$0.05 per wave
|
|
13
|
+
**Outputs**: All PRs merged, all tests green
|
|
14
|
+
|
|
15
|
+
See [HOW-THE-LOOP-WORKS.md](HOW-THE-LOOP-WORKS.md) for a concrete walkthrough.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Dispatch Model: Cheap Subagents + Lean Orchestrator
|
|
20
|
+
|
|
21
|
+
Aesop's superpower is **Haiku-first dispatch**: spawn 5–8 cheap Haiku subagents in parallel, not serial Opus.
|
|
22
|
+
|
|
23
|
+
### The rule: Subagents are ALWAYS cheap tier
|
|
24
|
+
|
|
25
|
+
**Rule**: Every subagent defaults to Haiku (1/3 Sonnet cost, 1/5 Opus cost). The orchestrator runs on the main thread only, stays lean, and never spawns as a subagent.
|
|
26
|
+
|
|
27
|
+
**Why**: Haiku at scale (6–8 in parallel) costs ~25% of an all-Opus fleet while maintaining quality on scoped tasks. Running many in parallel is both faster (3x wall-clock) and cheaper (1/5 the cost per token).
|
|
28
|
+
|
|
29
|
+
**Exception**: Only upgrade to Sonnet/Opus if the task genuinely exceeds Haiku capability (rare for scoped domains) AND you've decomposed as far as possible AND you have explicit approval.
|
|
30
|
+
|
|
31
|
+
### Cost model: Math
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
All-Opus fleet: 5 agents × Opus cost = $0.15–0.20/wave
|
|
35
|
+
Aesop (1 Opus + 5 Haiku): 1 Opus + 5 Haiku = $0.03–0.05/wave
|
|
36
|
+
|
|
37
|
+
= 4–5x cheaper + 3x faster (parallelism)
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
See [DISPATCH-MODEL.md](DISPATCH-MODEL.md) for patterns (fan-out, sequential, hierarchical) and detailed cost analysis.
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## State & Checkpointing: Durable Across Wipes
|
|
45
|
+
|
|
46
|
+
Aesop commits **STATE.md** and **BUILDLOG.md** to git. They survive machine wipes, session restarts, and context loss.
|
|
47
|
+
|
|
48
|
+
### STATE.md: Authoritative intent
|
|
49
|
+
|
|
50
|
+
- Current phase (e.g., "Phase 2: API integration")
|
|
51
|
+
- Locked decisions (tech choices, data models)
|
|
52
|
+
- Explicit NEXT STEPS (enumerated, owner assigned)
|
|
53
|
+
- Key file paths and data contracts
|
|
54
|
+
|
|
55
|
+
**Purpose**: On resume, read STATE.md to answer "where were we?" and "what's next?" without re-reading logs.
|
|
56
|
+
|
|
57
|
+
### BUILDLOG.md: Append-only progress
|
|
58
|
+
|
|
59
|
+
- Timestamped work snapshots
|
|
60
|
+
- Status (green / yellow / blocked / pending decision)
|
|
61
|
+
- Next step or blocker
|
|
62
|
+
- **Append-only discipline**: never edit earlier entries (prevents corruption)
|
|
63
|
+
|
|
64
|
+
**Example**:
|
|
65
|
+
```
|
|
66
|
+
[2026-07-12 14:00] Phase 1 complete: scaffolding + unit tests passing
|
|
67
|
+
[2026-07-12 15:30] API integration: 2 endpoints done, 1 blocked on schema review
|
|
68
|
+
[2026-07-12 16:00] Design approved; resume API endpoint 3 implementation
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
**Log rotation**: When BUILDLOG.md exceeds ~200 lines or 20 KB, archive to `BUILDLOG-YYYY-MM.md` and keep only recent entries in the live file.
|
|
72
|
+
|
|
73
|
+
See [CHECKPOINTING.md](CHECKPOINTING.md) for recovery workflows, handoff patterns, and rotation details.
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## Security Gates: Secret-Scan & Branch Discipline
|
|
78
|
+
|
|
79
|
+
Every push is gated by the pre-push hook, which enforces:
|
|
80
|
+
|
|
81
|
+
### Branch discipline
|
|
82
|
+
|
|
83
|
+
- **Feature branches only**: Never push directly to `main` or `master`
|
|
84
|
+
- **Naming**: All branches must be `feature/*` or `fix/*`
|
|
85
|
+
- **Consequence**: Attempt to push to main is rejected locally
|
|
86
|
+
|
|
87
|
+
### Secret scanning
|
|
88
|
+
|
|
89
|
+
- **Pre-push check**: `tools/secret_scan.py` scans staged files for detected credentials (API keys, tokens, passwords)
|
|
90
|
+
- **Blocks on detection**: Push fails if credentials are found
|
|
91
|
+
- **No bypass**: `--no-verify` skips the hook but is not recommended (use GitHub branch protection for real enforcement)
|
|
92
|
+
|
|
93
|
+
**Pair with GitHub branch protection**:
|
|
94
|
+
```
|
|
95
|
+
Settings > Branches > main
|
|
96
|
+
✓ Require pull request reviews
|
|
97
|
+
✓ Require status checks to pass
|
|
98
|
+
✓ Dismiss stale PR approvals
|
|
99
|
+
✓ Restrict pushes to (Admins only)
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
See [HOOK-INSTALL.md](HOOK-INSTALL.md) for setup and customization.
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## Governance: Single-Writer Files & Heartbeat Protocol
|
|
107
|
+
|
|
108
|
+
Keep the system coherent: one writer per control file, one instance per standing loop, heartbeat protocol to detect stalls.
|
|
109
|
+
|
|
110
|
+
### Single-writer enforcement
|
|
111
|
+
|
|
112
|
+
Some files must have exactly one writer:
|
|
113
|
+
|
|
114
|
+
- **MEMORY.md** — memory keeper only
|
|
115
|
+
- **STATE.md** — active orchestrator only
|
|
116
|
+
- **BUILDLOG.md** — append-only (anyone appends, no one edits earlier entries)
|
|
117
|
+
- **Other loops** → append requests to an inbox file, never edit control files directly
|
|
118
|
+
|
|
119
|
+
**Why**: Prevents race conditions, data corruption, and conflicting writes.
|
|
120
|
+
|
|
121
|
+
### Heartbeat protocol
|
|
122
|
+
|
|
123
|
+
Standing loops (watchdog, monitor, memory keeper) must not run in duplicate. Before starting, each loop:
|
|
124
|
+
|
|
125
|
+
1. Checks `~/.claude/loops/<loop-name>.heartbeat`
|
|
126
|
+
2. If exists and recent (<5 min old), skips (another instance running)
|
|
127
|
+
3. If missing or stale, creates heartbeat, runs loop, deletes heartbeat on exit
|
|
128
|
+
|
|
129
|
+
**Result**: Idempotent, collision-free loop execution.
|
|
130
|
+
|
|
131
|
+
See [GOVERNANCE.md](GOVERNANCE.md) for single-instance loops, inbox patterns, and AUTO/PROPOSE action tiers.
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## Reliability Core: Inputs Always Produce Outputs
|
|
136
|
+
|
|
137
|
+
**Rule**: Every input (event, request, cycle) must produce output (brief/log/heartbeat/FAILED). The orchestrator never goes idle — it dispatches next work, extends roadmap, gathers signals, and always offers the user an idea for what to do next.
|
|
138
|
+
|
|
139
|
+
### No silent hangs
|
|
140
|
+
|
|
141
|
+
- **Daemons emit heartbeats** every cycle (even on error)
|
|
142
|
+
- **Logs are append-only** with timestamps
|
|
143
|
+
- **Hung agents**: Watchdog detects stalls >200s and respawns (max 3 retries)
|
|
144
|
+
- **Orchestrator briefs user** while delegating to agents (never idle)
|
|
145
|
+
|
|
146
|
+
### The pride bar
|
|
147
|
+
|
|
148
|
+
Never ship known-broken. **Done** means:
|
|
149
|
+
|
|
150
|
+
- Verified end-to-end (not just tests pass)
|
|
151
|
+
- Briefs cross-checked against reality
|
|
152
|
+
- Test artifacts cleaned
|
|
153
|
+
- Loose ends closed or explicitly logged
|
|
154
|
+
- Nothing known-broken shipped silently
|
|
155
|
+
|
|
156
|
+
If you'd hesitate to hand it over under your own name, keep going.
|
|
157
|
+
|
|
158
|
+
See [CARDINAL-RULES.md](CARDINAL-RULES.md) for the full 10 foundational principles.
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## Observability & Cost Tracking
|
|
163
|
+
|
|
164
|
+
Every agent run is logged, every cost is tracked, every security event is triaged.
|
|
165
|
+
|
|
166
|
+
### What's logged
|
|
167
|
+
|
|
168
|
+
- **Agent transcripts**: Each agent's reasoning and output
|
|
169
|
+
- **Fleet heartbeats**: Watchdog checks every 10–150s
|
|
170
|
+
- **Cost ledger**: Token spend per model, per agent, per wave
|
|
171
|
+
- **Security events**: Secret-scan detections, branch violations
|
|
172
|
+
|
|
173
|
+
### Dashboard access
|
|
174
|
+
|
|
175
|
+
Open http://localhost:8770 (after `python ui/serve.py`):
|
|
176
|
+
|
|
177
|
+
- **Overview**: Fleet agents, recent events, security alerts
|
|
178
|
+
- **Work**: Task kanban (proposed → ranked → in-progress → done)
|
|
179
|
+
- **Activity**: Agent timeline, main-thread reasoning
|
|
180
|
+
- **Cost**: Token spend breakdown, per-day bar chart
|
|
181
|
+
|
|
182
|
+
### Audit trail
|
|
183
|
+
|
|
184
|
+
Everything lives in git or durable checkpoints:
|
|
185
|
+
|
|
186
|
+
- **Commits**: Agent work lives in feature branches, merged PRs
|
|
187
|
+
- **STATE.md / BUILDLOG.md**: Phase progress and decisions
|
|
188
|
+
- **Logs**: `state/FLEET-BACKUP.log`, monitor outputs, cost ledger
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## Reliability Guarantees
|
|
193
|
+
|
|
194
|
+
### Orchestrator isolation
|
|
195
|
+
|
|
196
|
+
The orchestrator reads only:
|
|
197
|
+
|
|
198
|
+
- **CLAUDE.md** — Cardinal rules (prompt-cached, warm across turns)
|
|
199
|
+
- **STATE.md** — Current phase and NEXT STEPS
|
|
200
|
+
- **BUILDLOG.md** — Recent progress
|
|
201
|
+
- **MEMORY.md** — Team facts and learnings
|
|
202
|
+
- **Short git one-liners** — Recent commits, branch status
|
|
203
|
+
|
|
204
|
+
**Why**: Lean context (no re-reading full codebase) = cheaper decisions, faster wall-clock, warm prompt cache.
|
|
205
|
+
|
|
206
|
+
See [CARDINAL-RULES.md](CARDINAL-RULES.md#4-orchestrator-isolation-lean-context) for details.
|
|
207
|
+
|
|
208
|
+
### Durable state
|
|
209
|
+
|
|
210
|
+
STATE.md + BUILDLOG.md survive:
|
|
211
|
+
|
|
212
|
+
- Machine wipes
|
|
213
|
+
- Session timeouts
|
|
214
|
+
- Context loss
|
|
215
|
+
- Network interruptions
|
|
216
|
+
|
|
217
|
+
On resume, read them and sync from git. Zero data loss.
|
|
218
|
+
|
|
219
|
+
See [RELIABILITY.md](RELIABILITY.md) for the full reliability core and failure scenarios.
|
|
220
|
+
|
|
221
|
+
---
|
|
222
|
+
|
|
223
|
+
## Reference Docs
|
|
224
|
+
|
|
225
|
+
**For adopters getting started**:
|
|
226
|
+
- [INSTALL.md](INSTALL.md) — Installation & setup
|
|
227
|
+
- [CONFIGURE.md](CONFIGURE.md) — Configuration (aesop.config.json)
|
|
228
|
+
- [FIRST-WAVE.md](FIRST-WAVE.md) — Running your first wave cycle
|
|
229
|
+
|
|
230
|
+
**For operational reference** (deep dives):
|
|
231
|
+
- [HOW-THE-LOOP-WORKS.md](HOW-THE-LOOP-WORKS.md) — Concrete walkthrough of one wave
|
|
232
|
+
- [DISPATCH-MODEL.md](DISPATCH-MODEL.md) — Cost analysis, dispatch patterns
|
|
233
|
+
- [CHECKPOINTING.md](CHECKPOINTING.md) — STATE.md/BUILDLOG.md lifecycle, recovery
|
|
234
|
+
- [CARDINAL-RULES.md](CARDINAL-RULES.md) — 10 foundational principles (subagent discipline, TDD, reliability, orchestrator isolation, etc.)
|
|
235
|
+
- [GOVERNANCE.md](GOVERNANCE.md) — Single-writer files, heartbeat protocol, AUTO/PROPOSE tiers
|
|
236
|
+
- [RELIABILITY.md](RELIABILITY.md) — Reliability core, inputs-always-outputs, pride bar
|
|
237
|
+
- [HOOK-INSTALL.md](HOOK-INSTALL.md) — Pre-push hook setup and customization
|
|
238
|
+
|
|
239
|
+
**For specific tasks**:
|
|
240
|
+
- [BEHAVIORAL-PR-REVIEW.md](BEHAVIORAL-PR-REVIEW.md) — Checklist for PRs that modify rules
|
|
241
|
+
- [FORENSICS.md](FORENSICS.md) — Reconstruct agent failures (git-bisectable debugging)
|
|
242
|
+
- [RESTORE.md](RESTORE.md) — Reconstitute Aesop on a new machine
|
|
243
|
+
- [PUBLISHING.md](PUBLISHING.md) — Release to npm with OIDC trusted publishing
|
|
244
|
+
|
|
245
|
+
---
|
|
246
|
+
|
|
247
|
+
## Next Steps
|
|
248
|
+
|
|
249
|
+
1. **Set up your environment**: [INSTALL.md](INSTALL.md)
|
|
250
|
+
2. **Configure Aesop**: [CONFIGURE.md](CONFIGURE.md)
|
|
251
|
+
3. **Run your first wave**: [FIRST-WAVE.md](FIRST-WAVE.md)
|
|
252
|
+
4. **Deep dive into concepts**: Use the reference docs above as needed
|
|
253
|
+
|
|
254
|
+
Happy orchestrating!
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
# Configuration
|
|
2
|
+
|
|
3
|
+
**TL;DR**: Edit `aesop.config.json` to tell Aesop which repos to watch, where your Claude Code brain lives, and which ports to use.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## aesop.config.json
|
|
8
|
+
|
|
9
|
+
After setup, you'll have an `aesop.config.json` in your harness root. This file tells Aesop about your environment.
|
|
10
|
+
|
|
11
|
+
```json
|
|
12
|
+
{
|
|
13
|
+
"aesopRoot": "/home/user/aesop",
|
|
14
|
+
"braindRoot": "/home/user/.claude",
|
|
15
|
+
"repos": [
|
|
16
|
+
{
|
|
17
|
+
"path": "/home/user/my-api",
|
|
18
|
+
"name": "api-backend"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"path": "/home/user/my-frontend",
|
|
22
|
+
"name": "web-frontend"
|
|
23
|
+
}
|
|
24
|
+
],
|
|
25
|
+
"dashboardPort": 8770,
|
|
26
|
+
"dashboardOrigin": "http://localhost:8770"
|
|
27
|
+
}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### Field Reference
|
|
31
|
+
|
|
32
|
+
#### `aesopRoot` (string, required)
|
|
33
|
+
|
|
34
|
+
Absolute path to this Aesop harness directory. Used by daemons to locate scripts and state files.
|
|
35
|
+
|
|
36
|
+
**Example**: `/home/user/aesop` or `C:\Users\user\aesop` (Windows)
|
|
37
|
+
|
|
38
|
+
**Default**: Set automatically during `npx` scaffold.
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
#### `braindRoot` (string, required)
|
|
43
|
+
|
|
44
|
+
Absolute path to your Claude Code home directory. This is where skills (`.claude/skills/`) and memory (`.claude/MEMORY.md`) live.
|
|
45
|
+
|
|
46
|
+
**Example**: `/home/user/.claude`
|
|
47
|
+
|
|
48
|
+
**Typical value**: `~/.claude` expanded to your home directory.
|
|
49
|
+
|
|
50
|
+
**Why it matters**: The `/power` skill primes the orchestrator brain from this root. Aesop loads CLAUDE.md rules, MEMORY.md facts, and skills from here.
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
#### `repos` (array of objects, required)
|
|
55
|
+
|
|
56
|
+
List of repositories Aesop should watch and monitor.
|
|
57
|
+
|
|
58
|
+
Each repo object has:
|
|
59
|
+
|
|
60
|
+
- **`path`** (string): Absolute path to the repository root
|
|
61
|
+
- **`name`** (string): Short human-readable name (used in logs, dashboards, status)
|
|
62
|
+
|
|
63
|
+
**Example**:
|
|
64
|
+
```json
|
|
65
|
+
"repos": [
|
|
66
|
+
{
|
|
67
|
+
"path": "/home/user/tr-sample-tracker",
|
|
68
|
+
"name": "tracker"
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"path": "/home/user/my-api",
|
|
72
|
+
"name": "api"
|
|
73
|
+
}
|
|
74
|
+
]
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
**Why multiple repos?** Aesop can orchestrate work across your entire codebase — microservices, monorepos, or a suite of related projects. Each repo is monitored independently, but the orchestrator sees all of them.
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
#### `dashboardPort` (number, default: 8770)
|
|
82
|
+
|
|
83
|
+
HTTP port for the web dashboard. The dashboard runs a Python HTTP server on this port.
|
|
84
|
+
|
|
85
|
+
**Example**: `8770`, `9000`, or any free port.
|
|
86
|
+
|
|
87
|
+
**To verify the port is free**:
|
|
88
|
+
```bash
|
|
89
|
+
# On macOS/Linux
|
|
90
|
+
lsof -i :8770
|
|
91
|
+
|
|
92
|
+
# On Windows (PowerShell)
|
|
93
|
+
Get-NetTCPConnection -LocalPort 8770
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
If the port is in use, pick a different one or kill the process using it.
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
#### `dashboardOrigin` (string, default: http://localhost:8770)
|
|
101
|
+
|
|
102
|
+
The origin (scheme + host + port) for the dashboard. Used for CORS validation and CSRF protection.
|
|
103
|
+
|
|
104
|
+
**Example**:
|
|
105
|
+
- Local development: `http://localhost:8770`
|
|
106
|
+
- Remote machine: `http://192.168.1.100:8770`
|
|
107
|
+
- Behind a proxy: `https://aesop.example.com`
|
|
108
|
+
|
|
109
|
+
**Why it matters**: The dashboard validates incoming requests against this origin to prevent HTTP header injection attacks. If your CORS origin changes (e.g., you expose the dashboard publicly), update this.
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## Example Configurations
|
|
114
|
+
|
|
115
|
+
### Single repo, local development
|
|
116
|
+
|
|
117
|
+
```json
|
|
118
|
+
{
|
|
119
|
+
"aesopRoot": "/home/user/aesop",
|
|
120
|
+
"braindRoot": "/home/user/.claude",
|
|
121
|
+
"repos": [
|
|
122
|
+
{
|
|
123
|
+
"path": "/home/user/my-app",
|
|
124
|
+
"name": "my-app"
|
|
125
|
+
}
|
|
126
|
+
],
|
|
127
|
+
"dashboardPort": 8770,
|
|
128
|
+
"dashboardOrigin": "http://localhost:8770"
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### Microservices architecture
|
|
133
|
+
|
|
134
|
+
```json
|
|
135
|
+
{
|
|
136
|
+
"aesopRoot": "/home/user/aesop",
|
|
137
|
+
"braindRoot": "/home/user/.claude",
|
|
138
|
+
"repos": [
|
|
139
|
+
{
|
|
140
|
+
"path": "/home/user/services/auth",
|
|
141
|
+
"name": "auth-service"
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
"path": "/home/user/services/api",
|
|
145
|
+
"name": "api-gateway"
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
"path": "/home/user/services/data",
|
|
149
|
+
"name": "data-service"
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
"path": "/home/user/infra",
|
|
153
|
+
"name": "infrastructure"
|
|
154
|
+
}
|
|
155
|
+
],
|
|
156
|
+
"dashboardPort": 8770,
|
|
157
|
+
"dashboardOrigin": "http://localhost:8770"
|
|
158
|
+
}
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### Windows paths
|
|
162
|
+
|
|
163
|
+
```json
|
|
164
|
+
{
|
|
165
|
+
"aesopRoot": "C:\\Users\\user\\aesop",
|
|
166
|
+
"braindRoot": "C:\\Users\\user\\.claude",
|
|
167
|
+
"repos": [
|
|
168
|
+
{
|
|
169
|
+
"path": "C:\\Users\\user\\projects\\my-api",
|
|
170
|
+
"name": "api"
|
|
171
|
+
}
|
|
172
|
+
],
|
|
173
|
+
"dashboardPort": 8770,
|
|
174
|
+
"dashboardOrigin": "http://localhost:8770"
|
|
175
|
+
}
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
## Security Notes
|
|
181
|
+
|
|
182
|
+
### git-ignore aesop.config.json
|
|
183
|
+
|
|
184
|
+
**Never commit `aesop.config.json` to git.** It may contain local paths, private repo paths, or other local configuration.
|
|
185
|
+
|
|
186
|
+
Add to `.gitignore`:
|
|
187
|
+
```
|
|
188
|
+
aesop.config.json
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
Commit `aesop.config.example.json` instead, with safe default values.
|
|
192
|
+
|
|
193
|
+
### Keep secrets out of the config
|
|
194
|
+
|
|
195
|
+
Aesop credentials (GitHub tokens, API keys) should never go in `aesop.config.json`. Instead:
|
|
196
|
+
|
|
197
|
+
1. Set them as environment variables
|
|
198
|
+
2. Use GitHub Actions secrets for CI/CD
|
|
199
|
+
3. Store them in your `~/.claude/` private brain (which is git-ignored)
|
|
200
|
+
|
|
201
|
+
---
|
|
202
|
+
|
|
203
|
+
## Environment Variables
|
|
204
|
+
|
|
205
|
+
You can override config values via environment variables (optional):
|
|
206
|
+
|
|
207
|
+
```bash
|
|
208
|
+
# Override the Aesop root
|
|
209
|
+
export AESOP_ROOT=/path/to/aesop
|
|
210
|
+
|
|
211
|
+
# Override the Claude Code home
|
|
212
|
+
export CLAUDE_CODE_HOME=/path/to/.claude
|
|
213
|
+
|
|
214
|
+
# Enable debug logging in daemons
|
|
215
|
+
export DEBUG=1
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
If set, these override the values in `aesop.config.json`.
|
|
219
|
+
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
## Validating Your Configuration
|
|
223
|
+
|
|
224
|
+
After editing `aesop.config.json`, validate it:
|
|
225
|
+
|
|
226
|
+
```bash
|
|
227
|
+
# Check JSON syntax
|
|
228
|
+
node -e "console.log(JSON.parse(require('fs').readFileSync('aesop.config.json')))"
|
|
229
|
+
|
|
230
|
+
# Run the watchdog once to verify setup
|
|
231
|
+
bash daemons/run-watchdog.sh --once
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
Expected output:
|
|
235
|
+
```
|
|
236
|
+
[watchdog] backing up fleet state...
|
|
237
|
+
[watchdog] scanning for secrets...
|
|
238
|
+
[watchdog] drift check: (files checked) ✓
|
|
239
|
+
[watchdog] all clear
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
If you see errors, check:
|
|
243
|
+
- All paths exist and are accessible
|
|
244
|
+
- JSON syntax is valid (no trailing commas)
|
|
245
|
+
- Git is initialized in all listed repos
|
|
246
|
+
|
|
247
|
+
---
|
|
248
|
+
|
|
249
|
+
## Next Steps
|
|
250
|
+
|
|
251
|
+
1. **Read [FIRST-WAVE.md](FIRST-WAVE.md)** — Run your first `/power` → `/buildsystem` cycle
|
|
252
|
+
2. **Review [CONCEPTS.md](CONCEPTS.md)** — Understand the dispatch model
|
|
253
|
+
3. **Launch the dashboard** — `python ui/serve.py` (verify it loads)
|
|
254
|
+
4. **Join the orchestration** — Type `/power` in Claude Code to prime your brain, then `/buildsystem` to start a wave
|
|
255
|
+
|
|
256
|
+
For operational governance (heartbeat protocol, single-writer files, etc.), see [GOVERNANCE.md](GOVERNANCE.md).
|