daimon 0.6.0 → 0.7.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.
Files changed (54) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/README.md +43 -29
  3. package/dist/cli.js +78 -69
  4. package/dist/dashboard/browser/{chunk-7L4DWDGL.js → chunk-25VLDASM.js} +1 -1
  5. package/dist/dashboard/browser/{chunk-ESDYJ3BP.js → chunk-5PAHWCG5.js} +1 -1
  6. package/dist/dashboard/browser/chunk-6BDWIJ3G.js +3 -0
  7. package/dist/dashboard/browser/chunk-6C6GHU3A.js +1 -0
  8. package/dist/dashboard/browser/{chunk-L63FHXGH.js → chunk-7NRE3SNA.js} +3 -3
  9. package/dist/dashboard/browser/chunk-BDYOKQF3.js +1 -0
  10. package/dist/dashboard/browser/{chunk-UNT27XFJ.js → chunk-CILFSVSP.js} +1 -1
  11. package/dist/dashboard/browser/{chunk-4ZR4NTJW.js → chunk-GDJOSLWM.js} +1 -1
  12. package/dist/dashboard/browser/chunk-HYGMRGYR.js +4 -0
  13. package/dist/dashboard/browser/chunk-HYIZMKSF.js +1 -0
  14. package/dist/dashboard/browser/chunk-IQZZO5IM.js +3 -0
  15. package/dist/dashboard/browser/chunk-J5UK77OJ.js +1 -0
  16. package/dist/dashboard/browser/chunk-JI63U3KC.js +2 -0
  17. package/dist/dashboard/browser/chunk-KLH6B22T.js +1 -0
  18. package/dist/dashboard/browser/chunk-L2PHC6DL.js +1 -0
  19. package/dist/dashboard/browser/chunk-MHYQENOC.js +1 -0
  20. package/dist/dashboard/browser/chunk-OHX55ZU4.js +2 -0
  21. package/dist/dashboard/browser/chunk-OUXULJ3Z.js +3 -0
  22. package/dist/dashboard/browser/chunk-P5IU57TV.js +2 -0
  23. package/dist/dashboard/browser/{chunk-U6AY7XZK.js → chunk-Q3N4MMWW.js} +3 -3
  24. package/dist/dashboard/browser/chunk-RIDV4B55.js +5 -0
  25. package/dist/dashboard/browser/{chunk-VZ6E4VQY.js → chunk-SR5JAOLW.js} +1 -1
  26. package/dist/dashboard/browser/chunk-UU5K6ZPO.js +1 -0
  27. package/dist/dashboard/browser/chunk-XXIJQBCQ.js +2 -0
  28. package/dist/dashboard/browser/chunk-YA4AZONZ.js +5 -0
  29. package/dist/dashboard/browser/{chunk-NN2YNLGP.js → chunk-YNCTXEXX.js} +1 -1
  30. package/dist/dashboard/browser/chunk-ZDNBWNU5.js +1 -0
  31. package/dist/dashboard/browser/chunk-ZEO5YLWG.js +3 -0
  32. package/dist/dashboard/browser/chunk-ZVUH3ISD.js +2 -0
  33. package/dist/dashboard/browser/index.html +1 -1
  34. package/dist/dashboard/browser/main-IDF27PFI.js +1 -0
  35. package/dist/main.js +58 -49
  36. package/dist/mcp.js +3 -3
  37. package/package.json +2 -2
  38. package/dist/dashboard/browser/chunk-4VNZXWQZ.js +0 -3
  39. package/dist/dashboard/browser/chunk-BLNPJ4WD.js +0 -4
  40. package/dist/dashboard/browser/chunk-E3HUMJ6S.js +0 -6
  41. package/dist/dashboard/browser/chunk-EBOHC6KX.js +0 -1
  42. package/dist/dashboard/browser/chunk-JUZHAE4L.js +0 -2
  43. package/dist/dashboard/browser/chunk-K46KCL6L.js +0 -1
  44. package/dist/dashboard/browser/chunk-KDCKLTCZ.js +0 -1
  45. package/dist/dashboard/browser/chunk-MHOSWLRR.js +0 -3
  46. package/dist/dashboard/browser/chunk-N5GRSTMJ.js +0 -6
  47. package/dist/dashboard/browser/chunk-R6J2WYUD.js +0 -1
  48. package/dist/dashboard/browser/chunk-T2YKGOEM.js +0 -3
  49. package/dist/dashboard/browser/chunk-V2CQL6W5.js +0 -1
  50. package/dist/dashboard/browser/chunk-WJUGRIIZ.js +0 -1
  51. package/dist/dashboard/browser/chunk-WRBP4DQN.js +0 -4
  52. package/dist/dashboard/browser/chunk-XUU4AY4M.js +0 -2
  53. package/dist/dashboard/browser/chunk-XYVF5I5T.js +0 -1
  54. package/dist/dashboard/browser/main-ZADV4SOC.js +0 -1
package/CHANGELOG.md CHANGED
@@ -4,6 +4,58 @@ All notable changes to Daimon are documented here. The format follows [Keep a Ch
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.7.0] — 2026-05-20
8
+
9
+ Strategic theme: **Memory and reach.** v0.7 makes the *past* actionable (history surfaces) and broadens *what* daimon can manage (polyglot dev servers, whole-workspace orchestration, refreshed TUI).
10
+
11
+ ### Added (M37) — History dashboard surface
12
+
13
+ - **T1a — Bundle-size persistence.** New `bundles` table in `~/.daimon/history.db` (`app, ts, initialKB, lazyKB, fileCount`). The registry persists one row per `onBundleUpdate` (Angular esbuild bundle parse), so the dashboard can render long-term bundle trends without an external store. The new table is additive — v0.6 history.db files migrate forward automatically on first open via `CREATE TABLE IF NOT EXISTS`. `daimon snapshot` carries the last 100 bundle rows per app in the payload.
14
+ - **T1b — `GET /api/history/trends`.** New aggregated time-series endpoint: `?app=<name>&metric=<compile|bundle|errors|restarts>&since=<24h|7d|30d>` returns `{app, metric, since, points:[{t, v, v2?}], _meta:{aggregation, count}}`. `compile` averages ms per bucket. `bundle` returns initialKB as `v` and lazyKB as `v2`. `errors` counts `error-new` + `error-recur` events per bucket. `restarts` counts `status` transitions where `to=starting` and `from ∈ {error, serving, compiling}`. Aggregation is hour-buckets for `24h` and day-buckets for `7d`/`30d`. Companion endpoint `/api/history/bundles` returns raw rows.
15
+ - **T1c — Dashboard `Trends` route.** New lazy-loaded `/trends` page with four charts (compile · bundle · errors · restarts) rendered via the existing chart.js lazy chunk from M30 — no new chart dep. Bundle chart stacks initialKB + lazyKB per app. Toggle between `24h` / `7d` / `30d` and between "All apps" and a single-app focus. Linked from the nav rail with `g t` shortcut.
16
+ - **T1d — Fixture-daemon harness (partial H1).** New `test/history-trends.test.mjs` exercises `History.recordBundle` / `queryBundles` and the four `trends()` aggregations against a temp sqlite db, so the Trends backend is verified without a real `~/.daimon/history.db`. Wired into `npm test`.
17
+
18
+ ### Deferred (M37 → v0.7.1)
19
+
20
+ - **H1 — Vitest + Playwright dashboard scaffolding.** The non-trivial dev-dep + per-component spec layer carries over from v0.6.1; only the History.ts fixture-daemon harness lands in v0.7.0. Reason: keeps the Trends surface shipping on schedule while leaving the dashboard-test footprint for a focused v0.7.1 weekend.
21
+ - **H3 — WCAG AA contrast audit.** Visual inspection task across light/dark/reduced-motion tonal surfaces — also pushed to v0.7.1 alongside H1.
22
+
23
+ ### Changed (M37)
24
+
25
+ - **Initial-route gzip transfer: 126.44 KB** — Trends route + `getTrends` + `getBundles` API are entirely lazy. Initial bundle stays under the 130 KB v0.6 ceiling.
26
+
27
+ ### Added (M38) — Whole-workspace orchestration
28
+
29
+ - **T2a — `daimon orchestrate <profile>`.** New CLI / HTTP / MCP verb. `POST /api/orchestrate?profile=<name>&goal=serving|healthy|stable&timeoutMs=<n>[&dryRun=true&budget=<tokens>]`. Resolves the profile's app list, cascade-starts every app via the existing F18 depends-topo ordering, waits up to `timeoutMs/2` per app for the goal, and runs **one** round of `runAutoFix` + restart + wait on stragglers. Returns `{profile, goal, perApp:[{name, reached, tries, fixed?, stillFailing?:[…first 3 parsed errors], waitedMs}], totalMs, allReached}`. `goal=stable` requires serving + healthy + 5s idle (same definition as `focus --until stable`).
30
+ - **T2b — MCP `orchestrate` tool.** Same surface exposed to Claude; documented as the recommended way to "bring up my whole workspace" in one call. Inputs: `profile, goal?, timeoutMs?, dryRun?, budget?`. Returns the same shape as the HTTP endpoint.
31
+ - **T2c — Idempotency + dry-run.** Apps already at goal are no-ops (`tries:0, reached:true`). `--dry-run` returns `{dryRun:true, plannedOrder:[…topo levels…], alreadyHealthy:[…]}` without starting anything.
32
+ - **`--budget <tokens>`.** Honors a token budget like `overview`: drops `stillFailing` entries first (≈60 tokens each), then trims already-reached `perApp` rows, recording counts in `_meta.omitted`.
33
+ - **Decision locked in (no recursion).** Orchestrate runs at most **one** try-fix round per app. Stragglers land in `stillFailing` and the caller decides the next move. Keeps results predictable, preserves per-rule attribution, and avoids compound-round confusion. Upgrade path is bounded-by-progress retry, not an N-round cap.
34
+ - **Tests:** new `test/orchestrate.test.mjs` covers (1) dry-run reports planned order, (2) unknown profile error, (3) already-healthy short-circuit, (4) happy-path cascade reaches goal, (5) one try-fix round + stillFailing surfacing.
35
+
36
+ ### Added (M39) — Polyglot dev-server discovery
37
+
38
+ - **T3a — Marker-file detectors for non-JS stacks.** `discoverApps` now detects Django (`manage.py` containing a `django` import), Rails (`bin/rails` + `Gemfile`), FastAPI (`fastapi` mention in `pyproject.toml` or `requirements.txt`), Go air (`.air.toml` or `air.toml`), and Rust trunk (`Trunk.toml`). Each profile gets a sensible default serve command (`python manage.py runserver`, `bin/rails server`, `uvicorn main:app --reload`, `air`, `trunk serve`) which can be overridden via `overrides.<name>.command`.
39
+ - **T3b — `DiscoveredApp.serverProfile`.** New optional field — `'angular'|'nx'|'vite'|'storybook'|'django'|'rails'|'fastapi'|'go-air'|'rust-trunk'`. Existing JS detectors now also tag their apps with `serverProfile` matching `workspaceType`. Polyglot apps get `workspaceType: 'polyglot'` + a specific `serverProfile`. The field is additive; v0.6 configs and snapshots still parse unchanged.
40
+ - **T3c — Polyglot parser hints.** `parseLine` gains serving / compiling / error patterns for Django (`Watching for file changes with StatReloader` → compiling, `Quit the server with CONTROL-C` → serving, `Traceback` + `File "..."` back-fill → error+location), Rails (`Puma starting`, `Use Ctrl-C to stop`, `ActionController::*` / `NameError(...)` + `file.rb:L:in` back-fill), FastAPI (`Uvicorn running on`, `Application startup complete`, ASGI tracebacks), Go air (`building...`, `running...`, `file.go:L:C:` location detection + `panic:` patterns), and Rust trunk (`error[E0425]` + `--> file.rs:L:C` back-fill). New `ParserTool` values: `django`, `rails`, `fastapi`, `go-air`, `rust-trunk`, `python`. Stack-trace locations now resolve `.py` / `.rb` / `.go` / `.rs` file extensions alongside JS/TS.
41
+ - **T3d — `daimon discover --explain` updates.** `/api/discovery/explain` (and `daimon discover --explain` / `daimon list --explain`) now annotate each detected app with `workspaceType` + `serverProfile` and append a `N polyglot app(s) found (django, fastapi, ...)` hint to the suggestion when any non-JS profile is present. The rejection-reason hint now also mentions `manage.py / Gemfile / pyproject.toml (fastapi) / .air.toml / Trunk.toml`.
42
+ - **Polyglot doctor rules (report-only).** Three new sibling rules to M36's `orphan-node-modules`: `orphan-venv` (Python — flags missing `.venv` / `venv` or one stamped older than `pyproject.toml` / `requirements.txt`), `orphan-bundler-cache` (Ruby — `vendor/bundle` missing or older than `Gemfile.lock`), `orphan-cargo-target` (Rust — `target/` missing or older than `Cargo.lock`). All three are **report-only** and emit a `would suggest: ...` paragraph — daimon never runs `pip install`, `bundle install`, or `cargo build`. Default `doctor.autoFix.permitted` extends to include them.
43
+ - **Parser corpus fixtures.** New `test/fixtures/parsers/{django,rails,fastapi,go-air,rust-trunk}.{log,expected.json}` covered by the existing M33 corpus test (≥95% capture rate + tool + status assertions).
44
+ - **Tests:** new `test/polyglot-discovery.test.mjs` covers each detector (strict markers — `manage.py` without `django` import is rejected; JS detector precedence on Vite + `manage.py`; JS apps still tagged with `serverProfile === workspaceType`).
45
+ - **Decisions locked in** (re-affirmed from PLAN-v0.7.md):
46
+ - Daimon **never invokes** `pip install`, `bundle install`, `cargo build`, `go mod download` — the polyglot orphan rules are report-only, never a shell-out.
47
+ - Polyglot detectors run **unconditionally** on every searchRoot, guarded by strict markers (`manage.py` must contain `django`, `pyproject.toml`/`requirements.txt` must declare `fastapi`) and JS precedence (`nx.json`/`angular.json`/vite/storybook detected first).
48
+ - No new `searchRoots[*].polyglot: true` opt-in is introduced.
49
+
50
+ ### Added (M40) — TUI parity refresh
51
+
52
+ - **T6a — Shortcut alignment.** The Ink TUI now uses `/` for filter (the prior `t` tag-pick remains), `j`/`k` (in addition to `↑`/`↓`) for navigation, a `g <key>` chord that surfaces dashboard-style view hints (`g a` apps, `g e` errors, `g v` events, `g s` settings, `g n` sessions), and `r` requires a `y`/`n` snack-confirm before restarting — matching the dashboard's M35 anti-fatfinger behaviour. `o` (open URL) and `s` (start) are preserved. Stop is rebound to `S` (shift-S) because `x` now means try-fix (per T6c).
53
+ - **T6b — Per-app 20-cell event ribbon.** Each app row in the TUI gains a second line with a 20-cell ASCII bar (`▓▓░▒▓▓░░░░░░░░░░░░░░ srv·err·cmp·stp`) representing the last 60 minutes of status events, computed with the same algorithm as the dashboard's H5 ribbon. Glyphs: `▓` serving, `█` error, `▒` compiling/starting, `░` stopped, `·` empty bucket. Powered by the new `src/tui/ribbon.ts` helper (covered by `test/tui-ribbon.test.mjs`).
54
+ - **T6c — Focus / try-fix / orchestrate from the TUI.** New action keys on the selected app: `f` runs the M34 "focus until stable" wait (5s idle on serving + healthy, 180s budget) and surfaces the outcome in the footer status line; `x` runs `try-fix` (runAutoFix on the permitted rule set + restart + wait for healthy) and reports `fixed N` + reached/timeout; `O` (shift-O) opens an inline orchestrate dialog — type a profile name + Enter to run the M38 `orchestrateProfile` with `goal=healthy, timeoutMs=300_000` and see the result on the footer. All three call the in-process registry directly (no HTTP round-trip), so the TUI keeps working over SSH without network access.
55
+ - **T6d — Headless mode unchanged.** `--headless` + `config.headless: true` continue to skip the TUI entirely. No new daemon flags.
56
+ - **Footer status line.** A new auto-dismissing `[i] …` line surfaces the outcome of `f` / `x` / `O` actions (plus `r` confirm and `g <key>` view hints) for ~4 seconds — necessary because the TUI no longer relitigates ambient state when an in-flight action completes.
57
+ - **Tests:** new `test/tui-ribbon.test.mjs` covers the ribbon helper (60-min window, error-over-serving ranking, per-app filtering, glyph rendering, count aggregation).
58
+
7
59
  ## [0.6.0] — 2026-05-20
8
60
 
9
61
  Strategic theme: **Every signal becomes actionable.** M33 deepens parser coverage so every tool's errors land structured; M34 turns daimon into a 3-call agent surface (overview → try-fix → focus); M35 ships keyboard / logs / ribbon polish; M36 broadens auto-heal with four new doctor rules and opt-in health-probe path discovery.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Daimon
2
2
 
3
- A local manager for Angular / Nx / Vite / Storybook dev servers. One daemon owns all your `serve` processes, auto-assigns ports, dedup'd error captures, exposes a loopback HTTP API + JSON CLI + MCP server. Built so you and Claude Code can both query app state without parsing thousands of log lines.
3
+ A local manager for dev servers: Angular / Nx / Vite / Storybook out of the box, plus Django / Rails / FastAPI / Go-air / Rust-trunk (v0.7). One daemon owns all your `serve` processes, auto-assigns ports, dedup'd error captures across every supported tool, exposes a loopback HTTP API + JSON CLI + MCP server. Built so you and Claude Code can both query app state without parsing thousands of log lines.
4
4
 
5
5
  Loopback only. Single user. No cloud. No telemetry.
6
6
 
@@ -69,10 +69,10 @@ The daemon auto-spawns on the first `daimon` call that needs it. To suppress: `D
69
69
  ## CLI
70
70
 
71
71
  ```bash
72
- daimon list [--tag <name>] [--workspace <label>]
73
- daimon status <name>
72
+ daimon list [--tag <name>] [--workspace <label>] [--explain] [--full] [--stream]
73
+ daimon status <name> [--full]
74
74
  daimon errors <name> [--since 2m] [--since-last] [--client <id>] [--structured]
75
- daimon events [--since 1h] [--app <name>]
75
+ daimon events [--since 1h] [--app <name>] [--stream]
76
76
  daimon wait <name> [--until serving|healthy|stopped|error] [--timeout 60s]
77
77
  daimon logs <name> [--tail N] [--since 30s]
78
78
  daimon start <name> [--with-deps]
@@ -80,39 +80,59 @@ daimon stop <name>
80
80
  daimon restart <name>
81
81
  daimon up [<profile>] # topological start; waits for each level to reach healthy
82
82
  daimon down [<profile>]
83
+ daimon overview [--workspace <label>] [--profile <name>] [--budget <tokens>] # decision-ready snapshot
84
+ daimon ensure <name> [--until serving|healthy] [--timeout 60s]
85
+ daimon ensure-up <profile> [--until serving|healthy] [--timeout 60s]
86
+ daimon focus <name> [--until serving|healthy|stable] [--timeout 180s] # one-shot subscribe-then-act (v0.6)
87
+ daimon try-fix <name> [--until healthy] [--timeout 60s] # doctor + restart + wait (v0.6)
88
+ daimon orchestrate <profile> [--goal serving|healthy|stable] [--dry-run] [--budget <tokens>] # whole-workspace bring-up (v0.7)
89
+ daimon trends <name> --metric compile|bundle|errors|restarts [--since 24h|7d|30d] # history time-series (v0.7)
90
+ daimon discover [--explain] [--dry-run] # what daimon would (or did) detect
91
+ daimon why-empty # alias of `daimon list --explain`
83
92
  daimon history <name> # uptime%, restart count, compile p50/p95, top errors
84
- daimon why <name> # last transition + 5 preceding events (great for "what just broke")
93
+ daimon why <name> # last transition + 5 preceding events
85
94
  daimon tasks <name> # discovered non-serve tasks
86
95
  daimon run <name> <task> [--watch] [-- args...]
87
96
  daimon snapshot <name> # bundle state for bug reports
88
97
  daimon env <name> [--use <file>] # env-file switcher
89
98
  daimon clean <name> [--deep] [--yes]
90
99
  daimon record / replay
91
- daimon doctor # config sanity checks; does not need the daemon
100
+ daimon doctor [--auto-fix] [--dry-run] # config sanity checks + rule-based self-repair (v0.5+)
101
+ daimon pin-health <name> [--accept] [--path <p>] # opt-in health-probe path discovery (v0.6)
102
+ daimon export-config [--redacted] # paste-ready config for bug reports
92
103
  daimon free-port <port> [--force]
93
- daimon init # interactive config scaffolder
104
+ daimon init [--auto] # interactive (or non-interactive) config scaffolder
94
105
  ```
95
106
 
96
- All CLI commands print compact JSON on stdout. Errors are compact JSON on stderr with non-zero exit. Exit codes: `0` success, `1` generic error, `2` timeout (used by `daimon wait`).
107
+ All CLI commands print compact JSON on stdout by default (`--full` for the verbose v0.4 shape). Errors are compact JSON on stderr with non-zero exit. Exit codes: `0` success, `1` generic error, `2` timeout (used by `daimon wait`, `daimon focus`, `daimon ensure*`).
97
108
 
98
109
  ## HTTP API
99
110
 
100
- Bound to `127.0.0.1:<apiPort>` only. The dashboard at `/` lets you inspect state, restart apps, expand error drawers, and (in v0.4) edit configuration.
111
+ Bound to `127.0.0.1:<apiPort>` only. The dashboard at `/` is an Angular 20 SPA (Material 3, zoneless, signals) bundled into the published tarball — it shows apps, errors grouped by file/app/tool, live logs, doctor, trends (v0.7), settings editor, and one-click actions.
101
112
 
102
113
  ```
103
- GET /api/apps
114
+ GET /api/apps # compact by default; ?format=full for v0.4 shape
104
115
  GET /api/apps/:name
105
116
  GET /api/apps/:name/errors[?since=2m]
106
117
  GET /api/apps/:name/errors/since-last?client=<id>
107
118
  GET /api/apps/:name/logs?tail=N&since=30s
108
- GET /api/apps/:name/logs/stream # Server-Sent Events
119
+ GET /api/apps/:name/logs/stream # Server-Sent Events
109
120
  GET /api/apps/:name/wait?until=serving&timeout=60
110
- GET /api/events?since=5m&app=<name>
121
+ GET /api/events[?since=5m&app=<name>&stream=ndjson]
122
+ GET /api/overview[?budget=<tokens>&workspace=&profile=] # v0.5
123
+ GET /api/discovery/explain # v0.5
111
124
  GET /api/history/{events,compile-times,tasks,summary/:name,why/:name}
112
- GET /api/config # current config (env redacted)
125
+ GET /api/history/trends?app=&metric=&since= # v0.7
126
+ GET /api/history/bundles?app= # v0.7
127
+ GET /api/config # current config (env redacted)
113
128
  POST /api/apps/:name/(start|stop|restart|snapshot|clean|run/:task)
114
- PATCH /api/config # If-Match: <etag>; 412 on conflict
115
- POST /api/config/reload # soft reload — no running children killed
129
+ POST /api/apps/:name/focus?until=… # NDJSON event stream (v0.6)
130
+ POST /api/apps/:name/try-fix?until=… # v0.6
131
+ POST /api/apps/:name/health/pin # v0.6 (with --accept)
132
+ POST /api/orchestrate?profile=&goal=&timeoutMs=&dryRun=&budget= # v0.7
133
+ POST /api/doctor/auto-fix[?dryRun=true]
134
+ PATCH /api/config # If-Match: <etag>; 412 on conflict
135
+ POST /api/config/reload # soft reload — no running children killed
116
136
  POST /api/shutdown
117
137
  ```
118
138
 
@@ -121,34 +141,28 @@ If `config.apiToken` is set, mutating endpoints require `Authorization: Bearer <
121
141
  ## Claude Code integration
122
142
 
123
143
  ```bash
124
- daimon claude install --all
125
- # or pick: --skill, --commands, --agent
126
- # or interactive: daimon claude install
144
+ daimon claude install # writes a single SKILL.md (no per-command slash files since v0.5)
127
145
  ```
128
146
 
129
- Three selectable artifacts:
147
+ Daimon installs a single skill at `~/.claude/skills/daimon/SKILL.md` (~120 useful tokens) that documents every verb inline. Old per-command `~/.claude/commands/daimon-*.md` files from v0.3/v0.4 are removed (or renamed to `.bak` if you've edited them since install). An optional `~/.claude/agents/daimon-runner.md` subagent can be installed with `--agent`.
130
148
 
131
- - **Skill** at `~/.claude/skills/daimon/SKILL.md` comprehensive how-to and recipes.
132
- - **Slash commands** at `~/.claude/commands/daimon-{status,start,stop,restart,errors,logs,up,doctor,why,wait}.md`.
133
- - **Subagent** at `~/.claude/agents/daimon-runner.md` — specialized dev-loop orchestrator.
134
-
135
- Templates are rendered from a single source of truth (`src/cliSurface.ts`), so they cannot drift from the actual command surface.
149
+ The skill is rendered from a single source of truth (`src/cliSurface.ts`) so it cannot drift from the actual command surface.
136
150
 
137
151
  Daimon stamps the current version into the artifact frontmatter. When you upgrade daimon, the next CLI call nudges you (once per 24h) to run `daimon claude update`. Silence with `DAIMON_NO_CLAUDE_NUDGE=1`.
138
152
 
139
153
  ```bash
140
154
  daimon claude status # what's installed and at which version
141
155
  daimon claude update # refresh based on the install manifest
142
- daimon claude uninstall [--all|--skill|--commands|--agent]
156
+ daimon claude uninstall
143
157
  ```
144
158
 
145
- For raw MCP use (without slash commands or a subagent):
159
+ For raw MCP use:
146
160
 
147
161
  ```bash
148
162
  claude mcp add daimon -- daimon mcp
149
163
  ```
150
164
 
151
- The MCP server exposes: `list_apps`, `get_status`, `get_errors`, `get_logs`, `start_app`, `stop_app`, `restart_app`, `wait_for_app`.
165
+ The MCP server exposes: `list_apps`, `get_status`, `get_errors`, `get_logs`, `start_app`, `stop_app`, `restart_app`, `wait_for_app`, plus the agent-first verbs added in v0.5–v0.7: `overview`, `ensure`, `ensure_up`, `focus`, `try_fix`, `diff_errors`, `orchestrate`. The recommended session opener is `overview` (compact-by-default, token-budgetable); the recommended one-call workspace bring-up is `orchestrate <profile> goal=stable`.
152
166
 
153
167
  ## State files (in `~/.daimon/`)
154
168
 
@@ -156,7 +170,7 @@ The MCP server exposes: `list_apps`, `get_status`, `get_errors`, `get_logs`, `st
156
170
  - `daemon.lock` — `{ pid, apiPort, version, startedAt, headless }`
157
171
  - `state.json` — sticky port assignments
158
172
  - `cursors.json` — per-client error cursors for `--since-last`
159
- - `history.db` — SQLite of events, compile times, task runs
173
+ - `history.db` — SQLite of events, compile times, task runs, and per-app bundle sizes (the last powers the v0.7 Trends dashboard)
160
174
  - `logs/<name>.log[.N]` — when `logs.enabled` is true
161
175
  - `snapshots/<name>-<ts>.json` — `daimon snapshot` output
162
176
  - `notifications.log` — desktop notification audit
@@ -183,7 +197,7 @@ The `summary.url` field returned by the API was synthetic `http://127.0.0.1:<por
183
197
  npm test
184
198
  ```
185
199
 
186
- Four small `node:test` files cover dependency-graph math, bundle parsing, notifier throttling, and compile-time regression. No vitest dependency.
200
+ 60 `node:test` cases across small focused files: dependency-graph math, bundle parsing, notifier throttling, compile-time regression, the parser fixture corpus (Vite/Storybook/Jest/Nx/Angular esbuild/webpack/Node/Django/Rails/FastAPI/Go-air/Rust-trunk — see `test/fixtures/parsers/`), `overview` budget truncation, auto-fix rule registry, `orchestrate` dry-run/cascade/try-fix paths, polyglot discovery (strict markers + JS precedence), and the TUI ribbon helper. No vitest dependency. The dashboard's Vitest + Playwright layer is deferred to v0.7.1.
187
201
 
188
202
  ## License
189
203