@matt82198/aesop 0.1.0-beta.5 → 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 +146 -5
- package/LICENSE +66 -21
- package/README.md +97 -33
- package/aesop.config.example.json +6 -0
- package/bin/CLAUDE.md +12 -3
- package/bin/cli.js +211 -40
- package/daemons/CLAUDE.md +1 -1
- package/daemons/backup-fleet.sh +209 -51
- package/daemons/run-watchdog.sh +208 -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/autonomous-swe.md +149 -0
- package/docs/reproduce.md +121 -0
- package/hooks/CLAUDE.md +28 -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/monitor/CLAUDE.md +3 -3
- package/monitor/collect-signals.mjs +133 -20
- package/package.json +15 -7
- package/scan/CLAUDE.md +30 -0
- package/skills/CLAUDE.md +1 -0
- package/state_store/ingest.py +18 -1
- package/state_store/projections.py +78 -4
- package/state_store/store.py +102 -7
- package/tools/CLAUDE.md +25 -18
- package/tools/alert_bridge.py +14 -10
- package/tools/bench_runner.py +438 -0
- package/tools/buildlog.py +4 -7
- package/tools/ci_merge_wait.py +215 -34
- 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/halt.py +172 -0
- package/tools/healthcheck.py +24 -21
- 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 +359 -90
- package/tools/self_stats.py +292 -4
- package/tools/status.js +187 -0
- package/tools/verify_agent_inspector.py +289 -0
- package/tools/verify_prboard.py +344 -0
- package/tools/watch.js +49 -0
- package/ui/CLAUDE.md +2 -0
- package/ui/agents.py +332 -33
- package/ui/api/tracker.py +15 -7
- package/ui/collectors.py +125 -32
- package/ui/config.py +22 -2
- package/ui/cost.py +98 -3
- package/ui/csrf.py +2 -1
- package/ui/handler.py +209 -21
- package/ui/sse.py +102 -16
- 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 +2 -2
- 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/state_store/__pycache__/__init__.cpython-314.pyc +0 -0
- package/state_store/__pycache__/api.cpython-314.pyc +0 -0
- package/state_store/__pycache__/export.cpython-314.pyc +0 -0
- package/state_store/__pycache__/ingest.cpython-314.pyc +0 -0
- package/state_store/__pycache__/projections.cpython-314.pyc +0 -0
- package/state_store/__pycache__/store.cpython-314.pyc +0 -0
- package/tools/__pycache__/alert_bridge.cpython-314.pyc +0 -0
- 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__/fleet_prompt_extractor.cpython-314.pyc +0 -0
- package/tools/__pycache__/healthcheck.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__/metrics_gate.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__/self_stats.cpython-314.pyc +0 -0
- package/tools/__pycache__/session_usage_summary.cpython-314.pyc +0 -0
- package/tools/__pycache__/stall_check.cpython-314.pyc +0 -0
- package/tools/__pycache__/transcript_replay.cpython-314.pyc +0 -0
- package/tools/__pycache__/transcript_timeline.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__/cost.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/web/.gitattributes +0 -13
- package/ui/web/dist/assets/index-2LZDQirC.js +0 -9
- package/ui/web/dist/assets/index-D4M1qyOv.css +0 -1
- package/ui/web/index.html +0 -13
- package/ui/web/package-lock.json +0 -2225
- package/ui/web/package.json +0 -26
- package/ui/web/src/App.test.tsx +0 -74
- package/ui/web/src/App.tsx +0 -142
- package/ui/web/src/CONTRIBUTING-UI.md +0 -49
- package/ui/web/src/components/AgentRow.css +0 -187
- package/ui/web/src/components/AgentRow.test.tsx +0 -209
- package/ui/web/src/components/AgentRow.tsx +0 -207
- package/ui/web/src/components/AgentsPanel.css +0 -108
- package/ui/web/src/components/AgentsPanel.test.tsx +0 -41
- package/ui/web/src/components/AgentsPanel.tsx +0 -58
- package/ui/web/src/components/AlertsPanel.css +0 -88
- package/ui/web/src/components/AlertsPanel.test.tsx +0 -51
- package/ui/web/src/components/AlertsPanel.tsx +0 -67
- package/ui/web/src/components/BacklogPanel.test.tsx +0 -126
- package/ui/web/src/components/BacklogPanel.tsx +0 -122
- package/ui/web/src/components/CostChart.css +0 -110
- package/ui/web/src/components/CostChart.test.tsx +0 -144
- package/ui/web/src/components/CostChart.tsx +0 -152
- package/ui/web/src/components/CostTable.css +0 -93
- package/ui/web/src/components/CostTable.test.tsx +0 -165
- package/ui/web/src/components/CostTable.tsx +0 -94
- package/ui/web/src/components/EventsFeed.css +0 -68
- package/ui/web/src/components/EventsFeed.test.tsx +0 -36
- package/ui/web/src/components/EventsFeed.tsx +0 -31
- package/ui/web/src/components/HealthHeader.css +0 -137
- package/ui/web/src/components/HealthHeader.test.tsx +0 -278
- package/ui/web/src/components/HealthHeader.tsx +0 -281
- package/ui/web/src/components/InboxForm.css +0 -135
- package/ui/web/src/components/InboxForm.test.tsx +0 -208
- package/ui/web/src/components/InboxForm.tsx +0 -116
- package/ui/web/src/components/MessagesTail.module.css +0 -144
- package/ui/web/src/components/MessagesTail.test.tsx +0 -176
- package/ui/web/src/components/MessagesTail.tsx +0 -94
- package/ui/web/src/components/ReposPanel.css +0 -90
- package/ui/web/src/components/ReposPanel.test.tsx +0 -45
- package/ui/web/src/components/ReposPanel.tsx +0 -67
- package/ui/web/src/components/Scorecard.css +0 -106
- package/ui/web/src/components/Scorecard.test.tsx +0 -117
- package/ui/web/src/components/Scorecard.tsx +0 -85
- package/ui/web/src/components/Timeline.module.css +0 -151
- package/ui/web/src/components/Timeline.test.tsx +0 -215
- package/ui/web/src/components/Timeline.tsx +0 -99
- package/ui/web/src/components/TrackerBoard.test.tsx +0 -121
- package/ui/web/src/components/TrackerBoard.tsx +0 -107
- package/ui/web/src/components/TrackerCard.test.tsx +0 -180
- package/ui/web/src/components/TrackerCard.tsx +0 -160
- package/ui/web/src/components/TrackerForm.test.tsx +0 -189
- package/ui/web/src/components/TrackerForm.tsx +0 -144
- package/ui/web/src/lib/api.ts +0 -218
- package/ui/web/src/lib/format.test.ts +0 -89
- package/ui/web/src/lib/format.ts +0 -103
- package/ui/web/src/lib/sanitizeUrl.test.ts +0 -84
- package/ui/web/src/lib/sanitizeUrl.ts +0 -38
- package/ui/web/src/lib/types.ts +0 -230
- package/ui/web/src/lib/useHashRoute.test.ts +0 -60
- package/ui/web/src/lib/useHashRoute.ts +0 -23
- package/ui/web/src/lib/useSSE.ts +0 -175
- package/ui/web/src/main.tsx +0 -10
- package/ui/web/src/styles/global.css +0 -179
- package/ui/web/src/styles/theme.css +0 -184
- package/ui/web/src/styles/work.css +0 -572
- package/ui/web/src/test/fixtures.ts +0 -385
- package/ui/web/src/test/setup.ts +0 -49
- package/ui/web/src/views/Activity.module.css +0 -43
- package/ui/web/src/views/Activity.test.tsx +0 -89
- package/ui/web/src/views/Activity.tsx +0 -31
- package/ui/web/src/views/Cost.css +0 -87
- package/ui/web/src/views/Cost.test.tsx +0 -142
- package/ui/web/src/views/Cost.tsx +0 -54
- package/ui/web/src/views/Overview.css +0 -51
- package/ui/web/src/views/Overview.test.tsx +0 -76
- package/ui/web/src/views/Overview.tsx +0 -46
- package/ui/web/src/views/Work.test.tsx +0 -82
- package/ui/web/src/views/Work.tsx +0 -79
- package/ui/web/src/vite-env.d.ts +0 -10
- package/ui/web/tsconfig.json +0 -22
- package/ui/web/vite.config.ts +0 -25
- package/ui/web/vitest.config.ts +0 -12
package/CHANGELOG.md
CHANGED
|
@@ -7,11 +7,152 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
|
|
10
|
+
## [0.1.0-rc.1] - 2026-07-17
|
|
11
|
+
|
|
12
|
+
First release candidate. The dispatch-model claims are now backed by measurement, the
|
|
13
|
+
kill-switch and cost-ceiling are wired into the live dispatch path and proven, and the npm
|
|
14
|
+
package ships slim and reproducible from a clean clone.
|
|
15
|
+
|
|
16
|
+
### Added
|
|
17
|
+
- **Verified Opus audit** (wave.26): Full release audit run with adversarial verification — 0 hallucinated findings, closing out the all-Haiku severity-inflation risk (wave-24: 4 reported P0s, 0 real).
|
|
18
|
+
- **Kill-switch wired into dispatch** (wave.27): Fleet-wide halt control is now wired into the dispatch path and proven end-to-end — an operator can stop all agents from a single signal.
|
|
19
|
+
- **Cost-ceiling guardrail** (wave.27): Per-wave spend ceiling halts dispatch when the configured budget is exceeded.
|
|
20
|
+
- **Held-out benchmark measured** (wave.28): Real offline benchmark scorer (`tools/bench_runner.py`) over a held-out ground-truth set of 39 judgment tasks — Haiku scores on par with Opus at roughly 1/3 the cost, replacing the previously illustrative numbers.
|
|
21
|
+
- **State-reconcile primitive** (wave.29): A reconcile primitive compares tracker state against shipped work so already-done items are not re-dispatched at wave open.
|
|
22
|
+
- **Reproduce-from-clean-clone CI** (wave.30): CI job builds and validates the package from a fresh clone, proving the tarball is reproducible and self-contained.
|
|
23
|
+
- **Wave PR Board** (wave.31): Dashboard view aggregating per-wave PR status for at-a-glance merge-train visibility (browser-proven).
|
|
24
|
+
- **Agent Inspector** (wave.31): Drill-down dashboard view exposing individual agent transcripts, cost, and lifecycle (browser-proven).
|
|
25
|
+
|
|
26
|
+
### Changed
|
|
27
|
+
- **npm package slimmed** (wave.30): Package trimmed to ~400 kB by excluding UI source and node_modules; only built artifacts (`ui/web/dist/`), Python, tools, and docs ship.
|
|
28
|
+
- **Adversarially-verified audits** (wave.25): Full audits now verify Haiku-reported findings before scheduling fixes.
|
|
29
|
+
- **Tracker reconciliation at wave open** (wave.29): Wave startup reconciles the tracker against shipped work so already-done items are not re-dispatched.
|
|
30
|
+
|
|
31
|
+
### Fixed
|
|
32
|
+
- **CI docs-only deadlock** (wave.30): Broke a docs-gate deadlock that could mask HEAD failures in the CI pipeline.
|
|
33
|
+
- **Waveguard worktree marker resolution** (#165): Fixed pre-commit hook to resolve marker to current worktree instead of hardcoded primary tree path (wave-24 fleet-block incident).
|
|
34
|
+
|
|
35
|
+
### Tests
|
|
36
|
+
- **Waveguard regression test** (#165): Added Test 7 to prove worktree commits pass while primary tree writes remain blocked by waveguard (wave-24 regression).
|
|
37
|
+
|
|
38
|
+
## [0.1.0-wave.23] - 2026-07-15
|
|
39
|
+
|
|
40
|
+
### Added
|
|
41
|
+
- **Adopter-focused documentation restructure** (#164): Reorganized docs into adopter journey with architecture diagram (Mermaid) to improve onboarding clarity.
|
|
42
|
+
- **Runtime CLI subcommands** (#164): Added `aesop watch`, `aesop dash`, and `aesop status` to CLI for real-time fleet monitoring.
|
|
43
|
+
- **Pre-commit waveguard hook** (#164): New write-guard hook prevents stray primary-tree writes during active wave builds; blocks commits outside worktrees.
|
|
44
|
+
|
|
45
|
+
### Fixed
|
|
46
|
+
- **Tracker projection snapshotting** (#164): Fixed O(n²) replay latency in tracker-snapshotting by caching projection state (wave-19 P2).
|
|
47
|
+
- **Log rotation race condition** (#164): Made `rotate_logs` atomic to prevent concurrent write race when logs exceed size limits.
|
|
48
|
+
- **Dashboard transcript cache** (#164): Optimized `dash-extra.mjs` by caching transcript metadata (path, size, mtime) to reduce redundant reads.
|
|
49
|
+
- **Monitor signal deduplication** (#164): Eliminated double-read of SECURITY-ALERTS.log in monitor signal collector to reduce noise.
|
|
50
|
+
|
|
51
|
+
### Documentation
|
|
52
|
+
- **Architecture diagram** (#164): Added Mermaid diagram showing fleet machinery layers (orchestrator → monitor → daemons → state).
|
|
53
|
+
- **Adopter journey** (#164): Restructured README and docs to guide new adopters through setup → operations → troubleshooting workflows.
|
|
54
|
+
|
|
55
|
+
## [0.1.0-wave.22] - 2026-07-15
|
|
56
|
+
|
|
57
|
+
### Added
|
|
58
|
+
- **GitHub docs overhaul** (#163): Complete README rewrite with "Why Aesop?" problem statement and architectural overview for discoverability.
|
|
59
|
+
- **Aesop doctor preflight** (#163): New `aesop doctor` subcommand validates configuration, hooks, and state-store health before running waves.
|
|
60
|
+
- **Self-building stats automation** (#163): Extended `self_stats.py` to regenerate `stats.json` and detect README stats drift; auto-regenerate in CI.
|
|
61
|
+
- **TypeScript type safety** (#163): Added `tsc --noEmit` CI gate to catch UI type errors before merge.
|
|
62
|
+
|
|
63
|
+
### Changed
|
|
64
|
+
- **Stats drift enforcement** (#163): README stats block now auto-reconciled by CI; stale stats block push gate enforces freshness.
|
|
65
|
+
|
|
66
|
+
### Fixed
|
|
67
|
+
- **TypeScript compiler warnings** (#163): Resolved unused variable and type mismatch warnings in UI layer.
|
|
68
|
+
|
|
69
|
+
### Documentation
|
|
70
|
+
- **README landing rewrite** (#163): Replaced generic boilerplate with concrete "Why Aesop exists" section explaining multi-agent durability and cost optimization.
|
|
71
|
+
- **CHANGELOG reconciliation** (#163): Added missing wave 16-20 dated entries and reorganized unreleased backlog to reflect actual shipped state.
|
|
72
|
+
|
|
73
|
+
## [0.1.0-wave.21] - 2026-07-15
|
|
74
|
+
|
|
75
|
+
### Added
|
|
76
|
+
- **CI performance optimization** (#161): Implemented path-based build filters to skip CI on docs-only changes; added Python test parallelization for faster feedback.
|
|
77
|
+
- **Fleet ledger instrumentation** (#161): Added phase and wave tagging to cost ledger for better fleet operations analytics and wave closure reporting.
|
|
78
|
+
|
|
79
|
+
### Changed
|
|
80
|
+
- **CI trigger-level filtering** (#161): Removed `paths-ignore` from trigger layer (was silently blocking required checks) and moved filtering to job level for correctness.
|
|
81
|
+
|
|
82
|
+
### Fixed
|
|
83
|
+
- **Python test parallelization** (#161): Parallel test runner now properly isolates test fixtures and state to prevent race conditions.
|
|
84
|
+
|
|
85
|
+
### Documentation
|
|
86
|
+
- **CI filtering best practices** (#161): Documented correct pattern for docs-only CI bypass (job-level, not trigger-level, to preserve required-check semantics).
|
|
87
|
+
|
|
88
|
+
## [0.1.0-wave.20] - 2026-07-15
|
|
89
|
+
|
|
90
|
+
### Added
|
|
91
|
+
- **Fail-closed push gate** (#160): Secret-scan gate now blocks pushes on timeout, preventing silent failures that allow commits to bypass scanning.
|
|
92
|
+
- **UI liveness improvements** (#160): Enhanced SSE cost collection and HealthHeader status display with better timeout handling.
|
|
93
|
+
- **CI state classification** (#160): Improved `ci_merge_wait` handling to distinguish real CI status (success/failure) from temporary waits.
|
|
94
|
+
- **Daemon portability fixes** (#160): Fixed `backup-fleet` and `run-watchdog` for Linux CI environments (path handling, process detection).
|
|
95
|
+
- **Host normalization** (#160): Added consistent URL normalization in UI handler and monitor collectors to reduce false positives.
|
|
96
|
+
- **Monitor cursor improvements** (#160): Enhanced monitor signal collection with better state tracking and recovery.
|
|
97
|
+
|
|
98
|
+
### Documentation
|
|
99
|
+
- **Currency updates** (#160): README and docs refresh for wave 20 machinery improvements.
|
|
100
|
+
|
|
101
|
+
### Fixed
|
|
102
|
+
- **UI handler robustness** (#160): Improved error handling in SSE cost collection and API state rendering.
|
|
103
|
+
- **Test harness** (#160): Additional coverage for CI merge state handling and daemon portability.
|
|
104
|
+
|
|
105
|
+
## [0.1.0-wave.19] - 2026-07-15
|
|
106
|
+
|
|
107
|
+
### Added
|
|
108
|
+
- **Secret-scan range push gate** (#165): Enhanced push hook with per-range verification to block partial/corrupted scans and prevent silent gate bypasses.
|
|
109
|
+
- **Host-header guard** (#163): HTTP host validation in UI handler to prevent header injection attacks.
|
|
110
|
+
- **CI merge classification** (#162): `ci_merge_wait` now distinguishes real CI status (success/failure) vs temporary waits, improving integration reliability.
|
|
111
|
+
- **Scaffolder manifest completeness** (#161): All 10 template directories (state_store, skills, mcp, scan) verified in npm package; consistent onboarding experience.
|
|
112
|
+
- **UI collector efficiency** (#164): Optimized agent and cost data collection for better freshness and reduced polling overhead; improved SSE contract.
|
|
113
|
+
- **Stall-check test rewrite** (#160): Migrated bare test functions to unittest.TestCase for CI compatibility and better failure reporting.
|
|
114
|
+
- **npm publish OIDC diagnostics** (#158): Self-diagnosing workflow for OIDC token generation and npm publish reliability.
|
|
115
|
+
|
|
116
|
+
## [0.1.0-wave.18] - 2026-07-15
|
|
117
|
+
|
|
118
|
+
### Added
|
|
119
|
+
- **Comprehensive audit fixes**: 8-lens security, correctness, a11y, density, shippability, docs, and tools audit with 13 targeted fixes.
|
|
120
|
+
- **Watchdog robustness** (#155): Improved `backup-fleet` and `run-watchdog` daemon stability with better error handling and signal detection.
|
|
121
|
+
- **Pre-push policy hardening** (#155): Enhanced branch protection and secret-scan enforcement in hook execution.
|
|
122
|
+
- **Config management** (#155): Improved aesop.config.json parsing and CLI handling for reliability.
|
|
123
|
+
- **State store hardening** (#155): Fixed concurrency edge cases, improved error recovery, and validated persistence.
|
|
124
|
+
|
|
125
|
+
### Fixed
|
|
126
|
+
- **Security gates** (#155): Fixed secret-scan coverage gaps (node_modules, dynamic content); improved push hook reliability.
|
|
127
|
+
- **a11y and UI hardening** (#155): Fixed contrast, keyboard navigation, and state-update timing issues.
|
|
128
|
+
- **Test infrastructure** (#155): Added comprehensive test coverage for daemons, state store, SSE reliability, UI hardening, and tools.
|
|
129
|
+
|
|
130
|
+
## [0.1.0-wave.17] - 2026-07-15
|
|
131
|
+
|
|
132
|
+
### Added
|
|
133
|
+
- **Fleet-ops templates** (#153): Example documents for fleet analysis, recommendations, and proposal tracking to guide operations workflows.
|
|
134
|
+
- **Tools suite expansion** (#153): New Python and Node tools for fleet operations:
|
|
135
|
+
- `transcript_replay.py`: Replay agent transcripts with event timing
|
|
136
|
+
- `transcript_timeline.py`: Extract and visualize agent activity timelines
|
|
137
|
+
- `fleet_prompt_extractor.py`: Extract and categorize fleet prompts for analysis
|
|
138
|
+
- `svg_to_png.mjs`: Convert SVG charts to PNG for documentation
|
|
139
|
+
- `session_usage_summary.py`: Aggregate session token usage across fleet
|
|
140
|
+
- **CI merge wait improvements** (#153): Enhanced `ci_merge_wait` detection with better status classification.
|
|
141
|
+
- **Machinery port** (#153): Completed isolation violation detector, health checks, and signal collection for orchestration monitor.
|
|
142
|
+
- **Shippability fixes** (#153): Fixed daemon portability and improved bootstrap process.
|
|
143
|
+
|
|
144
|
+
### Documentation
|
|
145
|
+
- **Fleet-ops guidance** (#153): Added templates and examples for monitoring, analysis, and recommendations workflows.
|
|
146
|
+
|
|
147
|
+
## [0.1.0-wave.16] - 2026-07-15
|
|
148
|
+
|
|
149
|
+
### Added
|
|
150
|
+
- **Isolation-violation detector** (#152): Monitor now detects and reports when worktrees modify shared state (repository contamination checker).
|
|
151
|
+
- **Monitor signal collection** (#152): Enhanced `collect-signals.mjs` with isolation detection and improved signal accuracy.
|
|
152
|
+
|
|
153
|
+
### Documentation
|
|
154
|
+
- **CLAUDE.md minimization** (#151): Streamlined domain-specific documentation; archived cancelled tiered-cognition spike; improved maintainability.
|
|
155
|
+
- **Domain map refinement** (#151): Clarified tool, test, and UI layer responsibilities and ownership.
|
|
15
156
|
|
|
16
157
|
## [0.1.0-beta.5] - 2026-07-15
|
|
17
158
|
|
package/LICENSE
CHANGED
|
@@ -1,21 +1,66 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
1
|
+
Copyright 2026 Matt Culliton
|
|
2
|
+
|
|
3
|
+
Licensed under the PolyForm Strict License 1.0.0.
|
|
4
|
+
The full license text follows.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# PolyForm Strict License 1.0.0
|
|
9
|
+
|
|
10
|
+
<https://polyformproject.org/licenses/strict/1.0.0>
|
|
11
|
+
|
|
12
|
+
## Acceptance
|
|
13
|
+
|
|
14
|
+
In order to get any license under these terms, you must agree to them as both strict obligations and conditions to all your licenses.
|
|
15
|
+
|
|
16
|
+
## Copyright License
|
|
17
|
+
|
|
18
|
+
The licensor grants you a copyright license for the software to do everything you might do with the software that would otherwise infringe the licensor's copyright in it for any permitted purpose, other than distributing the software or making changes or new works based on the software.
|
|
19
|
+
|
|
20
|
+
## Patent License
|
|
21
|
+
|
|
22
|
+
The licensor grants you a patent license for the software that covers patent claims the licensor can license, or becomes able to license, that you would infringe by using the software.
|
|
23
|
+
|
|
24
|
+
## Noncommercial Purposes
|
|
25
|
+
|
|
26
|
+
Any noncommercial purpose is a permitted purpose.
|
|
27
|
+
|
|
28
|
+
## Personal Uses
|
|
29
|
+
|
|
30
|
+
Personal use for research, experiment, and testing for the benefit of public knowledge, personal study, private entertainment, hobby projects, amateur pursuits, or religious observance, without any anticipated commercial application, is use for a permitted purpose.
|
|
31
|
+
|
|
32
|
+
## Noncommercial Organizations
|
|
33
|
+
|
|
34
|
+
Use by any charitable organization, educational institution, public research organization, public safety or health organization, environmental protection organization, or government institution is use for a permitted purpose regardless of the source of funding or obligations resulting from the funding.
|
|
35
|
+
|
|
36
|
+
## Fair Use
|
|
37
|
+
|
|
38
|
+
You may have "fair use" rights for the software under the law. These terms do not limit them.
|
|
39
|
+
|
|
40
|
+
## No Other Rights
|
|
41
|
+
|
|
42
|
+
These terms do not allow you to sublicense or transfer any of your licenses to anyone else, or prevent the licensor from granting licenses to anyone else. These terms do not imply any other licenses.
|
|
43
|
+
|
|
44
|
+
## Patent Defense
|
|
45
|
+
|
|
46
|
+
If you make any written claim that the software infringes or contributes to infringement of any patent, your patent license for the software granted under these terms ends immediately. If your company makes such a claim, your patent license ends immediately for work on behalf of your company.
|
|
47
|
+
|
|
48
|
+
## Violations
|
|
49
|
+
|
|
50
|
+
The first time you are notified in writing that you have violated any of these terms, or done anything with the software not covered by your licenses, your licenses can nonetheless continue if you come into full compliance with these terms, and take practical steps to correct past violations, within 32 days of receiving notice. Otherwise, all your licenses end immediately.
|
|
51
|
+
|
|
52
|
+
## No Liability
|
|
53
|
+
|
|
54
|
+
***As far as the law allows, the software comes as is, without any warranty or condition, and the licensor will not be liable to you for any damages arising out of these terms or the use or nature of the software, under any kind of legal claim.***
|
|
55
|
+
|
|
56
|
+
## Definitions
|
|
57
|
+
|
|
58
|
+
The **licensor** is the individual or entity offering these terms, and the **software** is the software the licensor makes available under these terms.
|
|
59
|
+
|
|
60
|
+
**You** refers to the individual or entity agreeing to these terms.
|
|
61
|
+
|
|
62
|
+
**Your company** is any legal entity, sole proprietorship, or other kind of organization that you work for, plus all organizations that have control over, are under the control of, or are under common control with that organization. **Control** means ownership of substantially all the assets of an entity, or the power to direct its management and policies by vote, contract, or otherwise. Control can be direct or indirect.
|
|
63
|
+
|
|
64
|
+
**Your licenses** are all the licenses granted to you for the software under these terms.
|
|
65
|
+
|
|
66
|
+
**Use** means anything you do with the software requiring one of your licenses.
|
package/README.md
CHANGED
|
@@ -7,15 +7,56 @@
|
|
|
7
7
|
</p>
|
|
8
8
|
|
|
9
9
|
<p align="center">
|
|
10
|
-
<a href="https://www.npmjs.com/package/@matt82198/aesop"><img src="https://img.shields.io/npm/v/@matt82198/aesop/beta" alt="npm"></a>
|
|
11
|
-
<a href="LICENSE"><img src="https://img.shields.io/npm/l/@matt82198/aesop" alt="license"></a>
|
|
12
10
|
<a href="https://github.com/matt82198/aesop/actions/workflows/ci.yml"><img src="https://github.com/matt82198/aesop/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
|
|
11
|
+
<a href="https://www.npmjs.com/package/@matt82198/aesop"><img src="https://img.shields.io/npm/v/@matt82198/aesop/rc" alt="npm"></a>
|
|
12
|
+
<a href="LICENSE"><img src="https://img.shields.io/badge/license-PolyForm%20Strict%201.0.0-orange.svg" alt="License: PolyForm Strict 1.0.0 (source-available)"></a>
|
|
13
13
|
</p>
|
|
14
14
|
|
|
15
|
-
**Aesop** is
|
|
15
|
+
**Aesop** is a source-available orchestration harness for Claude Code that builds itself. It runs a `/buildsystem` wave cycle—ranking a backlog, fanning out parallel Haiku agents (1/3 the cost of Sonnet, 1/5 the cost of Opus), watchdogging them, verifying merges, then feeding the next wave via audit + ideation + fleet-ops monitoring. **This repo's own PRs are built by Aesop's own loop.** Dogfooding, not doctrine.
|
|
16
|
+
|
|
17
|
+
As of **0.1.0-rc.1**, that loop has carried the project to an installable, tested, audited, and benchmarked release candidate—the fleet running the wave loop on its own, under a human who sets goals and owns the outward gates. The claims below are backed by committed artifacts you can check, not adjectives. See [Milestone: it shipped itself](#milestone-it-shipped-itself-010-rc1).
|
|
16
18
|
|
|
17
19
|
What you get: **cost-optimized multi-agent dispatch** (Haiku-first subagents, lean orchestrator), **durable state** (git-committed checkpoints survive wipes), **observable machinery** (every agent run logged, every cost tracked), **live dashboard** (real-time fleet health at http://localhost:8770), and **security gates** (secret-scan blocks pushes, CI validates each merge).
|
|
18
20
|
|
|
21
|
+
## Milestone: it shipped itself (0.1.0-rc.1)
|
|
22
|
+
|
|
23
|
+
Aesop reached its first release candidate by running its own wave loop—**audit → parallel build → verify → merge-train**—across the backlog that produced it. This is the version where the load-bearing claims stopped being illustrations and became measurements. The word "autonomous" has a precise, deliberately narrow meaning here.
|
|
24
|
+
|
|
25
|
+
**What "autonomous" means here (and what it doesn't).** The *fleet* autonomously runs the wave loop: it ranks work, dispatches parallel Haiku workers on file-disjoint domains, verifies merges, and feeds the next wave from a closing audit. A *human* sets the goals and owns every outward gate—npm publish, tagged releases, and history rewrites all stay human-approved. It is a supervised loop, not an unsupervised agent, and not AGI. The true model-dispatch core runs inside the Claude Code harness, which lives outside this repo; what ships here is the harness around it—orchestration, guardrails, dashboard, and tooling.
|
|
26
|
+
|
|
27
|
+
The differentiator is not "an AI wrote code." It's that the credibility and safety claims come with receipts:
|
|
28
|
+
|
|
29
|
+
| Claim | Evidence (committed, checkable) | Honest caveat |
|
|
30
|
+
| --- | --- | --- |
|
|
31
|
+
| **Haiku is good enough for fleet judgment** | Across 39 held-out judgment tasks, Haiku scored **39/39** vs Opus **38/39** at ~1/3 the per-token cost — measured by a plain-Python scorer with no model in the grading loop. See [`bench/results/`](./bench/results/). | Curated set, **not** sampled from real fleet transcripts (N=39). The benchmark found *no* task where Opus beats Haiku — so it proves sufficiency for these shapes, not parity at the reasoning frontier. |
|
|
32
|
+
| **Audits don't hallucinate findings** | A full release audit was run with adversarial verification of every finding: **0 hallucinated issues**, closing the prior all-Haiku severity-inflation risk. | An internal audit, not a third-party one. |
|
|
33
|
+
| **Kill-switch actually stops the fleet** | The fleet-wide halt is wired into the live dispatch path and proven end-to-end — one signal **aborted a real wave with zero workers spawned**. See [`tools/halt.py`](./tools/halt.py). | Operator-triggered; it is a manual brake, not an autonomous safety monitor. |
|
|
34
|
+
| **A cost ceiling brakes runaway spend** | Dispatch halts when a per-wave budget is exceeded. See [`tools/cost_ceiling.py`](./tools/cost_ceiling.py). | A brake on a *configured* ceiling, **not yet tied to live token spend**. |
|
|
35
|
+
| **The package installs and reproduces** | A **~409 kB** npm tarball (measured via `npm pack`) builds and validates from a fresh clone in CI. See [docs/reproduce.md](./docs/reproduce.md). | UI browser-proofs (Playwright) and real-model runs need local setup / API keys; they don't run in the offline reproduce job. |
|
|
36
|
+
|
|
37
|
+
**Nobody outside this project has reproduced these results yet.** The evidence is committed so a skeptical reader can check it — that transparency is the point, not a substitute for independent replication. For the full, unhedged account of what is and isn't proven, read [docs/autonomous-swe.md](./docs/autonomous-swe.md) and the ["Honest limits" section of the release notes](./RELEASE-NOTES.md#honest-limits).
|
|
38
|
+
|
|
39
|
+
## Why Aesop?
|
|
40
|
+
|
|
41
|
+
Multi-agent AI fleets hit a wall: all-Opus orchestrators cost $10k+ per wave, and machine crashes lose state—losing work and context on restart. Aesop solves both: **Haiku-first** dispatch cuts costs to 1/3 of Opus, and **git-committed state** (STATE.md, BUILDLOG.md) survives machine wipes with zero data loss. See the wave cycle below: ranked backlog → parallel worktree-isolated fleet → merge train → checkpoint → audit feeds next wave.
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
ranked backlog
|
|
45
|
+
↓
|
|
46
|
+
parallel haiku fleet (worktree-isolated)
|
|
47
|
+
[test] [build] [docs] [ui] [review] ...
|
|
48
|
+
↓
|
|
49
|
+
integration-branch merge train
|
|
50
|
+
↓
|
|
51
|
+
checkpoint (STATE.md + BUILDLOG.md)
|
|
52
|
+
↓
|
|
53
|
+
audit + fleet-ops monitoring
|
|
54
|
+
↓
|
|
55
|
+
(feeds next wave's backlog)
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
(See [assets/wave-cycle-diagram.txt](./assets/wave-cycle-diagram.txt) for the cycle reference.)
|
|
59
|
+
|
|
19
60
|
## What You Get
|
|
20
61
|
|
|
21
62
|
- **Parallel Haiku fleets** — Cheap, scoped subagents dispatch in parallel; orchestrator stays lean on main thread.
|
|
@@ -24,15 +65,17 @@ What you get: **cost-optimized multi-agent dispatch** (Haiku-first subagents, le
|
|
|
24
65
|
- **Self-healing watchdog** — Runs every 150s: backs up work, scans for secrets, detects drift, restores on reboot.
|
|
25
66
|
- **Live web dashboard** — Real-time fleet health, security alerts, work-item kanban at `http://localhost:8770`.
|
|
26
67
|
- **Secret-scan gates** — Pre-push hook blocks leaks; audit trail logged. Pair with GitHub branch protection for enforcement.
|
|
68
|
+
- **Read-only MCP Fleet Server** — Expose fleet status, active agents, work items, and cost metrics to Claude Code (fleet_status, fleet_agents, fleet_tracker, fleet_cost tools). See [mcp/CLAUDE.md](./mcp/CLAUDE.md) for setup.
|
|
69
|
+
- **Self-diagnosing npm publish** — OIDC token generation and publish reliability verified on each release; workflow surfaces diagnostics inline.
|
|
27
70
|
|
|
28
71
|
## Get Started (3 steps, 5 min)
|
|
29
72
|
|
|
30
|
-
**Note:** Aesop is
|
|
73
|
+
**Note:** Aesop is at its first release candidate. Install the `@rc` tag for the latest prerelease (v0.1.0-rc.1); the `@beta` tag remains available for earlier prereleases.
|
|
31
74
|
|
|
32
75
|
### Quickest path: npx scaffold
|
|
33
76
|
|
|
34
77
|
```bash
|
|
35
|
-
npx @matt82198/aesop@
|
|
78
|
+
npx @matt82198/aesop@rc my-fleet \
|
|
36
79
|
--name "my-api" \
|
|
37
80
|
--repos "/path/to/repo1,/path/to/repo2"
|
|
38
81
|
cd my-fleet
|
|
@@ -70,7 +113,7 @@ orchestrator (via Claude Code) Reads backlog, dispatches Haiku subagents in par
|
|
|
70
113
|
↓
|
|
71
114
|
parallel Haiku fleet Tiny, scoped domains (tests, build, review, docs, etc.)
|
|
72
115
|
↓
|
|
73
|
-
watchdog
|
|
116
|
+
watchdog backs up & gates Heartbeat, secret-scan, push to backup branch; merging is orchestrator/human-driven
|
|
74
117
|
↓
|
|
75
118
|
monitor/collect-signals.mjs Audits orchestration health, feeds next wave's backlog
|
|
76
119
|
↓
|
|
@@ -79,7 +122,7 @@ STATE.md + BUILDLOG.md Git-committed, survives machine wipes
|
|
|
79
122
|
|
|
80
123
|
See [docs/DISPATCH-MODEL.md](./docs/DISPATCH-MODEL.md) for cost analysis and parallel patterns.
|
|
81
124
|
|
|
82
|
-
<!--
|
|
125
|
+
<!-- STATS:START -->
|
|
83
126
|
|
|
84
127
|
## Aesop builds itself
|
|
85
128
|
|
|
@@ -87,30 +130,32 @@ Aesop is built entirely by its own `/buildsystem` wave cycle—running parallel
|
|
|
87
130
|
|
|
88
131
|
| Metric | Value |
|
|
89
132
|
| --- | --- |
|
|
90
|
-
| Merged PRs |
|
|
91
|
-
| Total Commits |
|
|
92
|
-
| Project Age |
|
|
93
|
-
| Waves |
|
|
94
|
-
| Insertions + Deletions |
|
|
95
|
-
| Files Tracked |
|
|
96
|
-
| Distinct Co-authors |
|
|
133
|
+
| Merged PRs | 170 <!-- metrics-verified: self_stats.py (git log) --> |
|
|
134
|
+
| Total Commits | 556 <!-- metrics-verified: self_stats.py (git log) --> |
|
|
135
|
+
| Project Age | 5 days <!-- metrics-verified: self_stats.py (git log) --> |
|
|
136
|
+
| Waves | 30 <!-- metrics-verified: self_stats.py (git log) --> |
|
|
137
|
+
| Insertions + Deletions | 96,065 <!-- metrics-verified: self_stats.py (git log) --> |
|
|
138
|
+
| Files Tracked | 336 <!-- metrics-verified: self_stats.py (git log) --> |
|
|
139
|
+
| Distinct Co-authors | 9 <!-- metrics-verified: self_stats.py (git log) --> |
|
|
140
|
+
|
|
141
|
+
<!-- STATS:END -->
|
|
97
142
|
|
|
98
|
-
<!-- SELF-STATS:END -->
|
|
99
143
|
|
|
100
144
|
## Recommended Agents
|
|
101
145
|
|
|
102
|
-
Aesop pairs well with the open-source
|
|
146
|
+
Aesop pairs well with the open-source catalog of ~130 community-authored specialized agent definitions (TDD orchestrators, security reviewers, performance engineers, etc.). For optimal results, install agents from the upstream source and pair them with Aesop's cost-optimized Haiku dispatch. This is optional; Aesop works standalone with general-purpose Claude Code agents.
|
|
103
147
|
|
|
104
148
|
## Use with Claude Code
|
|
105
149
|
|
|
106
150
|
If you're using **Claude Code**, invoke `/power` at the start of each session. It loads your orchestrator brain (cardinal rules, domain map, team memory, system state) and outputs a health brief. Setup once:
|
|
107
151
|
|
|
108
152
|
```bash
|
|
109
|
-
# Copy the /power skill
|
|
153
|
+
# Copy the /power skill and optional /healthcheck skill
|
|
110
154
|
cp -r skills/power/ ~/.claude/skills/power/
|
|
155
|
+
cp -r skills/healthcheck/ ~/.claude/skills/healthcheck/
|
|
111
156
|
```
|
|
112
157
|
|
|
113
|
-
Then in Claude Code, type `/power` or `/buildsystem` to start a wave cycle. See [skills/power/SKILL.md](./skills/power/SKILL.md) for details.
|
|
158
|
+
Then in Claude Code, type `/power` or `/buildsystem` to start a wave cycle. Use `/healthcheck` to audit fleet machinery health before running waves. See [skills/power/SKILL.md](./skills/power/SKILL.md) and [skills/healthcheck/SKILL.md](./skills/healthcheck/SKILL.md) for details.
|
|
114
159
|
|
|
115
160
|
## Core Principles
|
|
116
161
|
|
|
@@ -150,7 +195,7 @@ Settings > Branches > main
|
|
|
150
195
|
✓ Restrict pushes to (Admins only)
|
|
151
196
|
```
|
|
152
197
|
|
|
153
|
-
Private brain (`~/.claude`) is never committed to this repo. Keep `aesop.config.json` git-ignored. Implement `tools/secret_scan.py` with your security rules. See [docs/HOOK-INSTALL.md](./docs/HOOK-INSTALL.md) for setup.
|
|
198
|
+
**Host-header validation** in the dashboard UI handler prevents HTTP header injection attacks; all requests are validated against the configured origin. Private brain (`~/.claude`) is never committed to this repo. Keep `aesop.config.json` git-ignored. Implement `tools/secret_scan.py` with your security rules. See [docs/HOOK-INSTALL.md](./docs/HOOK-INSTALL.md) for setup.
|
|
154
199
|
|
|
155
200
|
## Dashboard (Wave-14 Rewrite)
|
|
156
201
|
|
|
@@ -200,28 +245,47 @@ The dev server proxies `/data`, `/api`, `/events`, `/agent`, `/submit` to the Py
|
|
|
200
245
|
| Secret-scan blocks push | Add suppression to `tools/secret_scan.py`; no auto-bypass (by design) |
|
|
201
246
|
| Monitor doesn't start | Verify Node.js on PATH; check `monitor/BRIEF.md` for logs |
|
|
202
247
|
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
-
|
|
207
|
-
-
|
|
208
|
-
-
|
|
209
|
-
|
|
210
|
-
|
|
248
|
+
## Documentation
|
|
249
|
+
|
|
250
|
+
**Adopter journey** (start here):
|
|
251
|
+
- [docs/INSTALL.md](./docs/INSTALL.md) — Install Aesop and verify setup
|
|
252
|
+
- [docs/CONFIGURE.md](./docs/CONFIGURE.md) — Configure repos, ports, and brain root
|
|
253
|
+
- [docs/FIRST-WAVE.md](./docs/FIRST-WAVE.md) — Run your first `/power` → `/buildsystem` cycle
|
|
254
|
+
- [docs/CONCEPTS.md](./docs/CONCEPTS.md) — Key concepts (dispatch, state, security, governance) with links to deep dives
|
|
255
|
+
- [docs/ARCHITECTURE.md](./docs/ARCHITECTURE.md) — System architecture diagram and components
|
|
256
|
+
|
|
257
|
+
**Operational reference**:
|
|
258
|
+
- [docs/HOW-THE-LOOP-WORKS.md](./docs/HOW-THE-LOOP-WORKS.md) — Concrete walkthrough of one wave cycle
|
|
259
|
+
- [docs/DISPATCH-MODEL.md](./docs/DISPATCH-MODEL.md) — Cost analysis, dispatch patterns, scaling
|
|
260
|
+
- [docs/CHECKPOINTING.md](./docs/CHECKPOINTING.md) — STATE.md + BUILDLOG.md lifecycle, recovery on wipe
|
|
261
|
+
- [docs/CARDINAL-RULES.md](./docs/CARDINAL-RULES.md) — 10 foundational principles
|
|
262
|
+
- [docs/GOVERNANCE.md](./docs/GOVERNANCE.md) — Single-writer files, heartbeat protocol, AUTO/PROPOSE tiers
|
|
263
|
+
- [docs/RELIABILITY.md](./docs/RELIABILITY.md) — Reliability guarantees, pride bar, inputs-always-outputs
|
|
264
|
+
- [docs/HOOK-INSTALL.md](./docs/HOOK-INSTALL.md) — Secret-scan and branch protection setup
|
|
265
|
+
|
|
266
|
+
**For specific tasks**:
|
|
267
|
+
- [docs/FORENSICS.md](./docs/FORENSICS.md) — Debug agent failures (git-bisectable)
|
|
268
|
+
- [docs/RESTORE.md](./docs/RESTORE.md) — Reconstitute Aesop on a new machine
|
|
269
|
+
- [docs/PUBLISHING.md](./docs/PUBLISHING.md) — Release Aesop to npm
|
|
270
|
+
- [docs/autonomous-swe.md](./docs/autonomous-swe.md) — The 0.1.0-rc.1 milestone told honestly: what "autonomous SWE" means here, the evidence behind each claim, and the limits the project owns
|
|
271
|
+
- [docs/case-study-portfolio.md](./docs/case-study-portfolio.md) — How Aesop built its own portfolio site; full audit trail and cost breakdown
|
|
272
|
+
|
|
273
|
+
See [CHANGELOG.md](./CHANGELOG.md) and [RELEASE-NOTES.md](./RELEASE-NOTES.md) for release notes.
|
|
211
274
|
|
|
212
275
|
## Contributing
|
|
213
276
|
|
|
214
|
-
Aesop
|
|
277
|
+
Aesop is **source-available** under the PolyForm Strict License 1.0.0, which does not permit modification or redistribution — so outside code patches can't be accepted as merged contributions. That said, **feedback is genuinely welcome**:
|
|
215
278
|
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
3. Open a PR; Aesop's wave cycle will verify and merge.
|
|
279
|
+
- **Issues and bug reports** — tell us what's broken or confusing.
|
|
280
|
+
- **Discussion and ideas** — feature requests, design critiques, use-case questions.
|
|
219
281
|
|
|
220
|
-
|
|
282
|
+
The repo develops itself via its own `/buildsystem` loop; code changes are made by the maintainer at their discretion, or by prior arrangement. See [CONTRIBUTING.md](./CONTRIBUTING.md) for details.
|
|
221
283
|
|
|
222
284
|
## License
|
|
223
285
|
|
|
224
|
-
|
|
286
|
+
**Source-available** under the [PolyForm Strict License 1.0.0](./LICENSE). You may read, run, and use the software for any permitted purpose, but **modification and redistribution are not permitted**. See [`LICENSE`](./LICENSE) for the full terms and the definition of permitted (noncommercial and personal) purposes.
|
|
287
|
+
|
|
288
|
+
Copyright 2026 Matt Culliton.
|
|
225
289
|
|
|
226
290
|
## References
|
|
227
291
|
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
"temp_root": "~/.aesop-temp",
|
|
15
15
|
"_temp_root_notes": "Portable path for temporary aesop files. ~ expands to home directory on both Windows and POSIX. Alternatively, on Windows set to %TEMP%/aesop, on POSIX set to /tmp/aesop. Config loaders expand ~ at runtime.",
|
|
16
16
|
"state_root": "./state",
|
|
17
|
+
"_fleet_root_note": "SECURITY BOUNDARY: all repository clone targets must remain under fleet_root to prevent credential harvesting across account boundaries. The monitor validates clone targets on each cycle. Defaults to home directory if not specified.",
|
|
17
18
|
"fleet_root": "/path/to/fleet",
|
|
18
19
|
"transcripts_root": "~/.claude/projects",
|
|
19
20
|
"repos": [
|
|
@@ -45,6 +46,11 @@
|
|
|
45
46
|
"cardinal_rules": {
|
|
46
47
|
"subagent_model": "haiku"
|
|
47
48
|
},
|
|
49
|
+
"limits": {
|
|
50
|
+
"_comment": "Cost ceiling / kill switch (tools/cost_ceiling.py, tools/halt.py). null disables a given ceiling (feature opt-in). When spend meets or exceeds a configured ceiling, cost_ceiling.py trips tools/halt.py's .HALT sentinel, which daemons/run-watchdog.sh checks at the top of every cycle and refuses to do work (no backup, no push, no scan) until cleared via 'python tools/halt.py --clear'.",
|
|
51
|
+
"max_wave_tokens": null,
|
|
52
|
+
"max_daily_tokens": null
|
|
53
|
+
},
|
|
48
54
|
"alerts": {
|
|
49
55
|
"_comment": "Slack/Discord webhook integration for fleet alerts. webhook_url: null (default) disables alerts (feature opt-in). SETUP: (1) Slack: Create an app at https://api.slack.com/apps, enable 'Incoming Webhooks', add a new webhook to your channel, copy the Webhook URL. (2) Discord: In your Discord server, go to Server Settings > Integrations > Webhooks, create a webhook, copy its URL. SECURITY: NEVER commit a real webhook URL to version control — retrieve at runtime via environment variable AESOP_ALERTS_WEBHOOK_URL or load from a .env.local file. Provider: 'slack' (block-kit format) or 'discord' (embed format). min_severity: filter by HIGH/CRITICAL/etc. heartbeat_stall_s: alert if watchdog heartbeat older than N seconds (null = skip).",
|
|
50
56
|
"webhook_url": null,
|
package/bin/CLAUDE.md
CHANGED
|
@@ -9,10 +9,19 @@
|
|
|
9
9
|
- **Help**: `npx @matt82198/aesop --help` or `-h`
|
|
10
10
|
- **Interactive wizard**: `npx @matt82198/aesop wizard` (on a TTY, prompts; with `--yes`, uses defaults)
|
|
11
11
|
|
|
12
|
+
## Runtime subcommands
|
|
13
|
+
|
|
14
|
+
cli.js dispatches runtime management subcommands to `tools/{subcommand}.js`:
|
|
15
|
+
|
|
16
|
+
- **`aesop doctor`** (or `node bin/cli.js doctor`) — Preflight readiness check; validates Node.js, Python, git, config, directories, hooks, and dashboard port availability.
|
|
17
|
+
- **`aesop watch`** (or `node bin/cli.js watch`) — Launch the watchdog daemon; spawns `daemons/run-watchdog.sh` for continuous fleet monitoring.
|
|
18
|
+
- **`aesop dash`** (or `node bin/cli.js dash`) — Launch the web dashboard; spawns `python ui/serve.py` to serve realtime fleet status at localhost:8770 (default).
|
|
19
|
+
- **`aesop status`** (or `node bin/cli.js status`) — One-shot fleet status snapshot; displays heartbeats, dashboard port, and git branch status.
|
|
20
|
+
|
|
12
21
|
## What gets copied
|
|
13
22
|
|
|
14
|
-
Files in `filesToCopy` array (cli.js
|
|
15
|
-
- **Directories**: `daemons/`, `dash/`, `monitor/`, `tools/`, `ui/`, `docs/`
|
|
23
|
+
Files in `filesToCopy` array (cli.js lines 239–256):
|
|
24
|
+
- **Directories**: `daemons/`, `dash/`, `monitor/`, `tools/`, `ui/`, `docs/`, `state_store/`, `skills/`, `mcp/`, `scan/`, `hooks/`
|
|
16
25
|
- **Files**: `aesop.config.example.json`, `README.md`, `LICENSE`, `CHANGELOG.md`, `CLAUDE-TEMPLATE.md`
|
|
17
26
|
- **Brain templates** (in docs/): `MEMORY-TEMPLATE.md` (via docs/ directory copy)
|
|
18
27
|
|
|
@@ -61,7 +70,7 @@ The wizard mode provides an interactive onboarding flow for new adopters, guidin
|
|
|
61
70
|
## Invariants & gotchas
|
|
62
71
|
|
|
63
72
|
- **Idempotent on empty targets**: Fails if `targetDir` exists and is non-empty (non-destructive). Safe to retry.
|
|
64
|
-
- **Adding shipped files**: Any new file/dir added to `filesToCopy` array must also be added to `package.json` `files` array (lines 9–
|
|
73
|
+
- **Adding shipped files**: Any new file/dir added to `filesToCopy` array must also be added to `package.json` `files` array (lines 9–27 in package.json) so npm publish includes it.
|
|
65
74
|
- **No machine-specific paths**: Use relative paths only; `__dirname` and `path.join()` handle cross-platform resolution.
|
|
66
75
|
- **Wizard prompts are async**: Main execution is wrapped in async IIFE to support readline prompts
|
|
67
76
|
- **Help text accuracy**: If invocation steps or output paths change, update help text
|