daimon 0.8.1 → 0.10.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 (82) hide show
  1. package/CHANGELOG.md +152 -0
  2. package/README.md +48 -1
  3. package/dist/cli.js +100 -85
  4. package/dist/dashboard/browser/chunk-2LMH5KDX.js +5 -0
  5. package/dist/dashboard/browser/chunk-2QORICNU.js +1 -0
  6. package/dist/dashboard/browser/chunk-36JZZZCV.js +3 -0
  7. package/dist/dashboard/browser/{chunk-QSBOKS53.js → chunk-3S7OJ77P.js} +1 -1
  8. package/dist/dashboard/browser/chunk-42QQHEGP.js +2 -0
  9. package/dist/dashboard/browser/chunk-4L223A7A.js +1 -0
  10. package/dist/dashboard/browser/chunk-532NB4ME.js +1 -0
  11. package/dist/dashboard/browser/chunk-6CP6NCA6.js +4 -0
  12. package/dist/dashboard/browser/chunk-6OMBXV4F.js +1 -0
  13. package/dist/dashboard/browser/chunk-6YXOOFGY.js +1 -0
  14. package/dist/dashboard/browser/{chunk-6WZJCF24.js → chunk-AHO3BCLI.js} +1 -1
  15. package/dist/dashboard/browser/chunk-ASK7FG27.js +1 -0
  16. package/dist/dashboard/browser/{chunk-OHX55ZU4.js → chunk-BCGQJHY3.js} +1 -1
  17. package/dist/dashboard/browser/chunk-BDTAVYPH.js +1 -0
  18. package/dist/dashboard/browser/chunk-BFBXHJEF.js +1 -0
  19. package/dist/dashboard/browser/chunk-BKYXU3OY.js +1 -0
  20. package/dist/dashboard/browser/chunk-BPUIUSAU.js +2 -0
  21. package/dist/dashboard/browser/chunk-C6SNIY22.js +2 -0
  22. package/dist/dashboard/browser/{chunk-PJPGLT4T.js → chunk-CCRYWDXZ.js} +1 -1
  23. package/dist/dashboard/browser/chunk-DNHNU64I.js +2 -0
  24. package/dist/dashboard/browser/chunk-DRBVSI3B.js +1 -0
  25. package/dist/dashboard/browser/{chunk-7NRE3SNA.js → chunk-EXOJOB6H.js} +2 -2
  26. package/dist/dashboard/browser/chunk-EYOED3X7.js +2 -0
  27. package/dist/dashboard/browser/chunk-G3IBZZQH.js +2 -0
  28. package/dist/dashboard/browser/chunk-H3HRZLHG.js +4 -0
  29. package/dist/dashboard/browser/chunk-H5GKWN4K.js +1 -0
  30. package/dist/dashboard/browser/{chunk-NDSAQ2HK.js → chunk-HVK4GEK7.js} +1 -1
  31. package/dist/dashboard/browser/{chunk-7NPLP3QD.js → chunk-HYIZY5FQ.js} +1 -1
  32. package/dist/dashboard/browser/chunk-ITSOVQEA.js +1 -0
  33. package/dist/dashboard/browser/{chunk-Q772THBA.js → chunk-JODWQVMA.js} +1 -2
  34. package/dist/dashboard/browser/chunk-LAMOHX23.js +1 -0
  35. package/dist/dashboard/browser/chunk-NMKAKRON.js +1 -0
  36. package/dist/dashboard/browser/{chunk-LBRCWYRN.js → chunk-NY5IR366.js} +1 -1
  37. package/dist/dashboard/browser/chunk-OOQPWG6B.js +1 -0
  38. package/dist/dashboard/browser/chunk-P3Q7RWT5.js +2 -0
  39. package/dist/dashboard/browser/{chunk-P5IU57TV.js → chunk-PVPELZPO.js} +1 -1
  40. package/dist/dashboard/browser/{chunk-V2KNRAE4.js → chunk-QHXOUNPA.js} +1 -1
  41. package/dist/dashboard/browser/chunk-RMV7CR6Y.js +2 -0
  42. package/dist/dashboard/browser/chunk-RQSDQXNY.js +1 -0
  43. package/dist/dashboard/browser/chunk-RWX5JIT4.js +1 -0
  44. package/dist/dashboard/browser/{chunk-UC3XMN2Y.js → chunk-SXE7REUK.js} +1 -1
  45. package/dist/dashboard/browser/chunk-TLCLILNG.js +4 -0
  46. package/dist/dashboard/browser/chunk-UAIWZYHN.js +1 -0
  47. package/dist/dashboard/browser/chunk-UFTWVSEC.js +2 -0
  48. package/dist/dashboard/browser/{chunk-2BXIFQGQ.js → chunk-UXLEE3F2.js} +1 -1
  49. package/dist/dashboard/browser/chunk-XPP3TYS2.js +2 -0
  50. package/dist/dashboard/browser/{chunk-EIWOTZT3.js → chunk-YFYMS5EE.js} +1 -1
  51. package/dist/dashboard/browser/chunk-YPVVBWNF.js +1 -0
  52. package/dist/dashboard/browser/{chunk-3WKRVGPT.js → chunk-Z3XFJOYG.js} +1 -1
  53. package/dist/dashboard/browser/index.html +2 -2
  54. package/dist/dashboard/browser/main-EENULCI5.js +1 -0
  55. package/dist/main.js +55 -50
  56. package/dist/mcp.js +3 -3
  57. package/package.json +8 -3
  58. package/dist/dashboard/browser/chunk-44JIQO3X.js +0 -1
  59. package/dist/dashboard/browser/chunk-4BAKWDAV.js +0 -1
  60. package/dist/dashboard/browser/chunk-4OCNYL7T.js +0 -1
  61. package/dist/dashboard/browser/chunk-7C772RJ3.js +0 -3
  62. package/dist/dashboard/browser/chunk-A4BNXJUT.js +0 -1
  63. package/dist/dashboard/browser/chunk-CILFSVSP.js +0 -2
  64. package/dist/dashboard/browser/chunk-CM4RQF3A.js +0 -5
  65. package/dist/dashboard/browser/chunk-CY5YRTQK.js +0 -1
  66. package/dist/dashboard/browser/chunk-GYWEXV2L.js +0 -3
  67. package/dist/dashboard/browser/chunk-H2N3RBHF.js +0 -1
  68. package/dist/dashboard/browser/chunk-H3L4MTG4.js +0 -5
  69. package/dist/dashboard/browser/chunk-I65I7J5Q.js +0 -2
  70. package/dist/dashboard/browser/chunk-K43KW4K2.js +0 -4
  71. package/dist/dashboard/browser/chunk-K7S4ITPJ.js +0 -2
  72. package/dist/dashboard/browser/chunk-KL6X73FV.js +0 -1
  73. package/dist/dashboard/browser/chunk-KLH6B22T.js +0 -1
  74. package/dist/dashboard/browser/chunk-LBL7Z5BE.js +0 -5
  75. package/dist/dashboard/browser/chunk-LHAMBNO6.js +0 -1
  76. package/dist/dashboard/browser/chunk-NX6DTO32.js +0 -1
  77. package/dist/dashboard/browser/chunk-P5IE6DI6.js +0 -2
  78. package/dist/dashboard/browser/chunk-PMAG4W5W.js +0 -1
  79. package/dist/dashboard/browser/chunk-VM2FOT77.js +0 -1
  80. package/dist/dashboard/browser/chunk-Y6B6X4Y6.js +0 -2
  81. package/dist/dashboard/browser/chunk-YYAZGY5M.js +0 -1
  82. package/dist/dashboard/browser/main-O76X7RMS.js +0 -1
package/CHANGELOG.md CHANGED
@@ -4,6 +4,158 @@ All notable changes to Daimon are documented here. The format follows [Keep a Ch
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.10.0] — 2026-05-22
8
+
9
+ Strategic theme: **Mature & Aware.** The biggest release yet. 11 milestones (M54–M64) covering perf at scale, recovery hardening, agent identity, pattern detection, predictive UX, webhooks, a VS Code extension, and a generated docs site.
10
+
11
+ ### Added (M54) — Perf at scale (50 apps / 100K events)
12
+
13
+ - `test/perf-50apps.test.mjs` bench: 50 synthetic apps, 100k events, 30-day retention. Asserts hot-path budgets: events query p95 < 250ms, timeline 24h < 300ms, 50× summary doctor pass < 500ms, SSE catchup < 1s, RSS < 150MB.
14
+ - New `events_app_ts` SQLite index for the (app, ts) lookup pattern that powers `/api/apps?cwd=` + per-app timeline.
15
+
16
+ ### Added (M55) — Recovery hardening
17
+
18
+ - History.db auto-rebuild on startup: `PRAGMA integrity_check` runs at open time; on failure the bad file is renamed `history.db.corrupt-<ts>` and a fresh db is created. Surface flows through to `daimon doctor` so the user can decide whether to delete the snapshot.
19
+ - WAL checkpoint on close: `PRAGMA wal_checkpoint(TRUNCATE)` runs during shutdown to keep `-wal` sidecars from ballooning across SIGKILL cycles.
20
+ - New doctor rule `history-db-healthy` — reports any archived `.corrupt-*` snapshots left behind by previous startups.
21
+
22
+ ### Added (M56) — Tests to 200+ under 30s
23
+
24
+ - New test files: `agents.test.mjs`, `audit.test.mjs`, `regressions.test.mjs`, `webhooks.test.mjs`, `recovery.test.mjs`, `perf-50apps.test.mjs`, `history-property.test.mjs`, `scope-property.test.mjs`, `mcp-contract.test.mjs`.
25
+ - Suite: **219 tests / 15.2s wall-clock** (up from 130 / 14s in v0.9).
26
+
27
+ ### Added (M57) — Docs site + branding
28
+
29
+ - `scripts/build-docs.mjs` → generates `docs/index.html` from the live CLI surface + MCP tool list. Single self-contained HTML, no JS framework.
30
+ - New `CLAUDE.md` — orientation for future agents (where files live, conventions, "things daimon never does").
31
+ - New `npm run build:docs` script.
32
+
33
+ ### Added (M58) — Agent identity + handoff (locked decision)
34
+
35
+ - `src/agents.ts`: `generateAgentId()` returns `<host>-<pid>-<rand4>`; `AgentRegistry` tracks who's calling (active = touched within 5 min); `LockManager` enforces 30-second per-app soft-locks.
36
+ - Audit log gains a **6th column** (agent id). `parseAuditLine()` exposed for tooling; legacy 5-col rows still parse.
37
+ - New endpoints: `GET /api/agents`, `GET /api/apps/<n>/lock`, `POST /api/apps/<n>/handoff`.
38
+ - `start`/`stop`/`restart` now return HTTP 409 `locked-by-other-agent` when another agent holds the soft-lock. Pass `?steal=1` to override.
39
+ - CLI: every call ships `X-Daimon-Agent`. New `daimon agents` and `daimon handoff <app> <agentId>` verbs. `--steal` on lifecycle verbs.
40
+ - MCP forwards `X-Daimon-Agent` and `X-Daimon-Cwd` on every request.
41
+
42
+ ### Added (M59) — MCP expansion + who's watching
43
+
44
+ - New MCP tools: `daimon_who_owns`, `daimon_subscribe_events`, `daimon_notify_on_error`.
45
+ - Per-app lock + recent-interaction list queryable via `/api/apps/<n>/lock`.
46
+ - New dashboard `/agents` route: live list of every agent touching this daemon with per-agent cards showing call counts, last-seen, cwd, and the apps each agent currently holds. Orphan-lock surface lists locks held by agents that have gone inactive. Chord `g g` jumps straight to it; the help dialog and command palette pick it up automatically.
47
+
48
+ ### Added (M60) — Pattern detection
49
+
50
+ - New event type `regression-detected` with structured payload `{ kind, factor, baseline, current, suspectCommit }`.
51
+ - Compile-time: factor 2.0 vs rolling median of last 20 successful compiles.
52
+ - Bundle: 10% initialKB growth vs the previous baseline.
53
+ - Error-flap: ≥5 errors/hour AND ≥3× the 23h-prior baseline.
54
+ - Suspect-commit hint pulled via `git log -1 --format=%h:%s` (best-effort; null on non-git workspaces).
55
+ - New dashboard `/regressions` route: filterable cards (all / compile / bundle / error-flap) showing baseline-vs-current, factor, fingerprint, and suspect-commit. Live-updates from the SSE stream and seeds from `/api/history/events?type=regression-detected`. Chord `g r`.
56
+
57
+ ### Added (M61) — Predictive UX (ready-time)
58
+
59
+ - `AppSummary.estimatedReadyAtMs` projected from p50 of last 10 compiles during `compiling` state. Surfaced in compact CLI status and MCP `get_status` payloads.
60
+ - `daimon profiles suggest` CLI verb backed by `GET /api/profiles/suggest`. Sweeps the last 30d of `status → starting` events into co-start sessions (60s windows), counts canonical app-sets, and emits suggestions for clusters seen ≥5 times that don't already match an existing profile. Each suggestion carries a name, app list, occurrence count, last-seen, and reason string. `--since` and `--min` flags tune the window.
61
+ - `smart-restart-tune` doctor rule. Scans the last 7d of `status` events for non-stopped→starting transitions per app; flags any app restarting ≥5×/day with `restartPolicy` review guidance.
62
+
63
+ ### Added (M62) — VS Code extension
64
+
65
+ - New `vscode-extension/` subpackage. Marketplace name `flycotech.daimon`.
66
+ - Features: status bar (cwd app health), errors sidebar (cwd-filtered, click-to-open), commands `Daimon: Start / Stop / Open dashboard / Show logs`, soft-lock-aware Start (offers to steal on 409).
67
+ - New root `npm run build:vscode` script (delegates to `vscode-extension` after `npm install`).
68
+ - `.vsix` built: `vscode-extension/daimon-vscode.vsix` (7.85 KB). LICENSE bundled. Ready for `vsce publish` to the marketplace.
69
+
70
+ ### Added (M63) — Webhooks + CI verb
71
+
72
+ - New top-level config key `webhooks: WebhookEntry[]`.
73
+ - `WebhookDispatcher` subscribes to registry events, filters per-config, shapes payloads per host (Slack `attachments`, Discord `embeds`, generic envelope otherwise), and posts with up to 3 retries + exponential backoff. Global budget 1 req/sec, drop-oldest on overflow.
74
+ - New CLI verb `daimon ci start <profile> --until ready|healthy --timeout <duration> [--json]`. Exit code 0 on full success, 2 on timeout, 1 on unknown profile.
75
+
76
+ ### Added (M64) — Polish + ship
77
+
78
+ - Help dialog automatically picks up new chords (`agents`, `handoff`, `ci`, `--steal`) from `cliSurface.ts`. Two new chord entries surfaced: `g g` (Agents), `g r` (Regressions), `g i` (Timeline).
79
+ - Playwright drive landed at `dashboard/e2e/dashboard.spec.ts`. Visits 13 routes (all existing + new `/agents`, `/regressions`), asserts page-specific landmarks, enforces a console-error budget, and verifies the `g g` / `g r` chord routing. Seed helper at `dashboard/e2e/seed.ts` writes 6 fixture events (≥1 serving, ≥1 error, ≥2 regressions). Run with `npm run e2e:install && npm run e2e:seed && npm run e2e` from `dashboard/`.
80
+ - Doctor 11-rule UI tightening carry-over from v0.9.
81
+ - `RELEASE-v0.10.0.md` with migration steps for the audit-column add and webhooks config.
82
+ - Test suite now at 225 / 17.0s (added 6 profile-suggester / restart-cadence tests).
83
+
84
+ ### Migration
85
+
86
+ - Audit log gains a 6th column (agent). 5-column rows still parse.
87
+ - New `webhooks: []` config key. Default is the empty array — no outbound deliveries unless you opt in.
88
+ - HTTP 409 `locked-by-other-agent` is a new response code for lifecycle endpoints. Old CLIs (no `X-Daimon-Agent` header) get `agentId = 'unknown'` and never collide with named agents.
89
+
90
+ ## [0.9.0] — 2026-05-21
91
+
92
+ Strategic theme: **Multi-agent observability.** v0.9 finishes the pivot to many agents on one machine, each in their own workspace, all sharing one daemon and one dashboard. On top of the architectural shift, deepen what daimon *sees* (lint findings as a third signal class beyond errors + warnings) and *shows* (a unified event timeline), and broaden what it *understands* (framework-aware health probes for the polyglot stack landed in v0.7).
93
+
94
+ ### Added (M46) — Multi-workspace foundation
95
+
96
+ - `src/pathScope.ts` (`isPathUnder`, `normalizeForCompare`) — case-insensitive on Windows, separator-normalized.
97
+ - `POST /api/workspaces/ensure` — idempotent register; returns `{ added, root, addedApps }` or `{ added: false, reason: 'already covered' }`.
98
+ - `GET /api/apps?cwd=<path>` — filter by workspaceRoot under cwd (bidirectional: either direction counts).
99
+ - `daimon list` defaults to cwd-scoped; `--all` bypasses; auto-calls `ensureCurrentWorkspace()`.
100
+ - Warnings as a second signal class: parser `WARNING_PATTERNS`, `ErrorEntry.level?: 'error'|'warning'`, `warning-new` / `warning-recur` events, `?level=` filter, severity chips on the Errors page, tertiary-accent warning rows.
101
+ - `TrendChartComponent` skeleton regression fix: `loading`/`empty`/`title`/`subtitle` are signals (zoneless + OnPush).
102
+ - `scripts/dev-install.mjs` + `npm run dev:install` / `dev:install:fast` / `dev:unlink`.
103
+
104
+ ### Added (M47) — Per-cwd command resolution
105
+
106
+ - `Registry.resolveByCwd(name, cwd?)`: returns `{ kind: 'unique'|'collision'|'none', key?, candidates }`. Discovery now uniquifies storage names on collision (`<base>@<workspaceLabel>`), keeping the user-facing `baseName` intact.
107
+ - Every per-app endpoint resolves `<name>` via `?cwd=`. **412 `name-collision`** body `{ error, candidates: [...], hint }` when two workspaces share the same app name and no cwd disambiguates.
108
+ - CLI `start/stop/restart/status/logs/errors/wait/run` all send `?cwd=<process.cwd()>` unless `--all` is set. New `reportCollisionAndExit` renders candidates by `workspaceLabel`.
109
+ - MCP tools `get_status`, `get_status_full`, `get_errors`, `get_logs`, `start_app`/`stop_app`/`restart_app` accept an optional `cwd` param (defaults to the MCP server's `process.cwd()`).
110
+
111
+ ### Added (M48) — Workspace registry CLI + audit attribution
112
+
113
+ - `daimon workspaces list|add [path] [--label <name>] | rm <path> | show [path]`.
114
+ - `GET /api/workspaces`, `POST /api/workspaces/remove`, `GET /api/workspaces/resolve?cwd=<p>`.
115
+ - CLI sends `X-Daimon-Cwd: <process.cwd()>` on every authenticated POST.
116
+ - `appendAuditEntry` now records the cwd as the 5th column. Two agents sharing an IP can be told apart in `~/.daimon/audit.log`.
117
+
118
+ ### Added (M49) — Dashboard cwd context
119
+
120
+ - Dashboard reads `?cwd=<path>` and pre-selects the workspace pill that covers it.
121
+ - Unknown-cwd banner offers a one-click **Register** that POSTs `/api/workspaces/ensure` and then re-resolves.
122
+ - New `daimon dashboard` verb opens the default browser to `http://127.0.0.1:4999/?cwd=<process.cwd()>`.
123
+ - Header **scope chip** (`scope: <label> ×`) gives a one-click clear back to "all workspaces". No regression when no `?cwd=` is present.
124
+
125
+ ### Added (M50) — Lint findings channel
126
+
127
+ - Parser `LINT_PATTERNS` for eslint, biome, ruff, clippy. Lint runs **first** (before error/warning) so a tight `F401`/`lint/correctness/...` signal beats the generic `<file>:<line>:<col>:` error rule.
128
+ - `ErrorEntry.level` adds `'lint'`. `AppEventType` adds `lint-new` / `lint-recur`. **Status never flips on lint.**
129
+ - `?level=lint` filter on `/api/apps/:name/errors`. `AppSummary.lintCount`.
130
+ - Errors page severity chips become **errors / warnings / lint / all** with a secondary accent for lint rows. Lint events excluded from error trends.
131
+ - Fixtures: `lint-eslint.log`, `lint-biome.log`, `lint-ruff.log`, `lint-clippy.log`.
132
+ - **Daimon never spawns linters.** This is parse-only — read what the dev server already emits.
133
+
134
+ ### Added (M51) — Unified event timeline
135
+
136
+ - `History.queryTimeline()`: merges events + compile_times + bundles + task_runs into `{ ts, app, kind, summary, payload }`. Sorted desc; 5000-row cap.
137
+ - `GET /api/history/timeline?since=&app=&kinds=<csv>`.
138
+ - New lazy-loaded `/timeline` dashboard route with virtual scroll, kind/app filters, flyout drawer. Nav-rail entry between History and Trends, keyboard chord `g i`.
139
+ - New CLI verb: `daimon timeline [--since 24h] [--app <name>] [--kinds status,error,…]`.
140
+
141
+ ### Added (M52) — Polyglot v2 health probes
142
+
143
+ - `src/healthProfiles.ts` with per-profile probe defaults: django → `/admin/login/`, rails → `/up`, fastapi → `/docs`, go-air → `/`, rust-trunk → `/`.
144
+ - Probe resolution uses (in order): user override → prior auto-discovery → profile default → fallback `/`. The first probe cycle on a fresh Rails/FastAPI app now hits the right path instead of churning through `HEALTH_PROBE_CANDIDATES`.
145
+ - Smart probe outcome: 200, 301/302/304/307/308, and 401 (auth-gated but alive) classify healthy; 5xx and `ECONNREFUSED` / `ECONNRESET` / `EHOSTUNREACH` classify unhealthy.
146
+ - New doctor rule **`health-probe-missing`** with auto-fix: writes the profile-suggested `healthProbePath` into `overrides[<app>]` and triggers a soft-reload.
147
+
148
+ ### Added (M53) — Polish + release prep
149
+
150
+ - Doctor `ALL_AUTO_FIX` now lists 12 rules (added `health-probe-missing`).
151
+ - `CHANGELOG.md` + `RELEASE-v0.9.0.md`. `package.json` 0.8.1 → 0.9.0.
152
+
153
+ ### Migration notes
154
+
155
+ - **Multi-workspace is the migration headline.** Existing single-workspace setups keep working — `daimon list --all` reproduces the v0.8 default. Two agents in different workspaces sharing an app name now coexist; CLI commands run from a workspace cwd resolve automatically. Pass `--all` to see / act on apps across all workspaces.
156
+ - **Audit format change.** `~/.daimon/audit.log` gains a 5th tab-delimited column carrying the agent's cwd. Existing 4-column rows continue to parse — the cwd is empty for them.
157
+ - **Discovery storage keys.** When two workspaces have apps with the same `baseName`, the second is stored under `<baseName>@<workspaceLabel>`. Its `baseName` field stays as the user-facing name. `daimon list` shows the storage key in the `name` column; `workspaceLabel` distinguishes the rows.
158
+
7
159
  ## [0.8.1] — 2026-05-21
8
160
 
9
161
  Hotfix for three regressions caught running v0.8.0 against a real workspace.
package/README.md CHANGED
@@ -16,10 +16,57 @@ After install, `daimon` is on your PATH globally.
16
16
 
17
17
  ```bash
18
18
  daimon init # interactive scaffolder; writes ./daimon.config.json or ~/.daimon/config.json
19
- daimon list # auto-spawns the daemon on first call
19
+ daimon list # auto-spawns the daemon on first call (defaults to cwd-scoped — pass --all for every workspace)
20
20
  daimon daemon status
21
21
  ```
22
22
 
23
+ ## Multi-agent / multi-workspace (v0.9)
24
+
25
+ A single daimon daemon on `127.0.0.1:4999` serves every workspace on your machine. Two agents (e.g. two Claude Code sessions in different repos) can use the same daemon without stepping on each other:
26
+
27
+ ```bash
28
+ # In repo A:
29
+ daimon list # only A's apps
30
+ daimon start editor # cwd disambiguates which "editor"
31
+
32
+ # In repo B (concurrent, different terminal):
33
+ daimon list # only B's apps
34
+ daimon start editor # B's editor — even though A also has one
35
+
36
+ # To see every workspace's apps:
37
+ daimon list --all
38
+
39
+ # Manage the workspace registry directly:
40
+ daimon workspaces list
41
+ daimon workspaces add /path/to/another-repo --label other
42
+ daimon workspaces show # which workspace covers cwd?
43
+
44
+ # Open the dashboard scoped to the current cwd:
45
+ daimon dashboard # opens http://127.0.0.1:4999/?cwd=<cwd>
46
+ ```
47
+
48
+ When two workspaces register apps with the same name, daimon stores the second under `<name>@<workspaceLabel>` so both coexist. CLI commands resolve from `process.cwd()`; a 412 `name-collision` body with candidate workspaces is returned only when no cwd disambiguates.
49
+
50
+ ## Three signal classes: errors, warnings, lint
51
+
52
+ Errors flip app status to `error`. Warnings (TS6133, NG8107, deprecation notes) are surfaced as a separate signal class — they do not flip status. **Lint findings** (eslint, biome, ruff, clippy) are a third channel: parsed from the dev-server log stream, never spawn a linter, never flip status, and live behind a dedicated severity chip on the Errors page.
53
+
54
+ ```bash
55
+ daimon errors editor # errors only (back-compat default)
56
+ daimon errors editor --level warning
57
+ daimon errors editor --level lint
58
+ daimon errors editor --level all
59
+ ```
60
+
61
+ ## Unified event timeline
62
+
63
+ `daimon timeline` and the dashboard `/timeline` route merge status, errors, warnings, lint, health, bundle, compile, and task-run rows into one chronological stream:
64
+
65
+ ```bash
66
+ daimon timeline --since 7d --kinds status,error,lint
67
+ daimon timeline --app editor --since 24h
68
+ ```
69
+
23
70
  Config lookup order:
24
71
 
25
72
  1. `./daimon.config.json` (cwd)