@unerr-ai/unerr 0.1.6 → 0.1.7

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 (218) hide show
  1. package/README.md +70 -194
  2. package/dist/cli.js +39149 -36991
  3. package/package.json +9 -2
  4. package/dist/__tests__/architecture-guard.test.js +0 -122
  5. package/dist/__tests__/arg-validator.test.js +0 -205
  6. package/dist/__tests__/ast-extractor.test.js +0 -203
  7. package/dist/__tests__/auto-bootstrap.test.js +0 -280
  8. package/dist/__tests__/background-indexer.test.js +0 -228
  9. package/dist/__tests__/blast-radius-engine.test.js +0 -200
  10. package/dist/__tests__/bridge-isolation.test.js +0 -37
  11. package/dist/__tests__/budget-enforcer.test.js +0 -53
  12. package/dist/__tests__/cfg-test-detection-perf.test.js +0 -82
  13. package/dist/__tests__/change-narrative.test.js +0 -190
  14. package/dist/__tests__/check-commit.test.js +0 -258
  15. package/dist/__tests__/checksum.test.js +0 -34
  16. package/dist/__tests__/commit-watcher.test.js +0 -154
  17. package/dist/__tests__/community-detection.test.js +0 -179
  18. package/dist/__tests__/community-tools.test.js +0 -299
  19. package/dist/__tests__/components.test.js +0 -449
  20. package/dist/__tests__/compression-log.test.js +0 -174
  21. package/dist/__tests__/compression-quality-monitor.test.js +0 -40
  22. package/dist/__tests__/config-healer.test.js +0 -165
  23. package/dist/__tests__/context-ledger.test.js +0 -58
  24. package/dist/__tests__/convention-detector.test.js +0 -99
  25. package/dist/__tests__/convention-learner.test.js +0 -86
  26. package/dist/__tests__/correction-detector.test.js +0 -330
  27. package/dist/__tests__/daemon-autostart-install.test.js +0 -283
  28. package/dist/__tests__/daemon-bridge.test.js +0 -222
  29. package/dist/__tests__/daemon-dashboard.test.js +0 -202
  30. package/dist/__tests__/daemon-registry.test.js +0 -240
  31. package/dist/__tests__/daemon-supervisor.test.js +0 -318
  32. package/dist/__tests__/daemon-version-check.test.js +0 -275
  33. package/dist/__tests__/decision-point-detector.test.js +0 -98
  34. package/dist/__tests__/deep-link.test.js +0 -143
  35. package/dist/__tests__/disallowed-tools.test.js +0 -115
  36. package/dist/__tests__/drift-tracker.test.js +0 -582
  37. package/dist/__tests__/durability-scorer.test.js +0 -152
  38. package/dist/__tests__/efficiency-tracker.test.js +0 -65
  39. package/dist/__tests__/enrich.test.js +0 -144
  40. package/dist/__tests__/entity-rewind.test.js +0 -248
  41. package/dist/__tests__/ephemeral.test.js +0 -111
  42. package/dist/__tests__/exploration-cost.test.js +0 -93
  43. package/dist/__tests__/fact-generator.test.js +0 -197
  44. package/dist/__tests__/file-l0-graph.test.js +0 -244
  45. package/dist/__tests__/file-logger.test.js +0 -82
  46. package/dist/__tests__/file-outline.test.js +0 -141
  47. package/dist/__tests__/file-read-protocol.test.js +0 -188
  48. package/dist/__tests__/format-encoder.test.js +0 -233
  49. package/dist/__tests__/git-attribution.test.js +0 -259
  50. package/dist/__tests__/graph-temporal-joiner.test.js +0 -219
  51. package/dist/__tests__/health-grade-enhanced.test.js +0 -138
  52. package/dist/__tests__/health-map-data.test.js +0 -173
  53. package/dist/__tests__/helpers/mcp-harness.js +0 -45
  54. package/dist/__tests__/helpers/mcp-harness.test.js +0 -68
  55. package/dist/__tests__/hook-dedup.test.js +0 -112
  56. package/dist/__tests__/hook-runner.test.js +0 -253
  57. package/dist/__tests__/indexer-cfg.test.js +0 -185
  58. package/dist/__tests__/indexer-cross-file.test.js +0 -172
  59. package/dist/__tests__/indexer-extraction.test.js +0 -245
  60. package/dist/__tests__/indexer-incremental.test.js +0 -232
  61. package/dist/__tests__/indexer-language-expansion.test.js +0 -165
  62. package/dist/__tests__/init-push.test.js +0 -131
  63. package/dist/__tests__/instruction-writer.test.js +0 -179
  64. package/dist/__tests__/intelligence-integration.test.js +0 -217
  65. package/dist/__tests__/intent-correlator.test.js +0 -175
  66. package/dist/__tests__/intent-detector.test.js +0 -235
  67. package/dist/__tests__/intent-encoder.test.js +0 -167
  68. package/dist/__tests__/java-build-tool-detection.test.js +0 -174
  69. package/dist/__tests__/layer3-sprint-q.test.js +0 -160
  70. package/dist/__tests__/layer3-sprint-r.test.js +0 -91
  71. package/dist/__tests__/layer3-sprint-s.test.js +0 -183
  72. package/dist/__tests__/layer3-sprint-t.test.js +0 -201
  73. package/dist/__tests__/layer3-sprint-u.test.js +0 -174
  74. package/dist/__tests__/layer4-sprint-ba2.test.js +0 -354
  75. package/dist/__tests__/layer4-sprint-ba4.test.js +0 -84
  76. package/dist/__tests__/layer4-sprint-vs.test.js +0 -105
  77. package/dist/__tests__/ledger-chains.test.js +0 -162
  78. package/dist/__tests__/lifecycle-machine.test.js +0 -226
  79. package/dist/__tests__/local-chat-provider.test.js +0 -170
  80. package/dist/__tests__/local-convention-detector.test.js +0 -308
  81. package/dist/__tests__/local-embeddings.test.js +0 -422
  82. package/dist/__tests__/local-graph.test.js +0 -540
  83. package/dist/__tests__/local-indexer.test.js +0 -228
  84. package/dist/__tests__/local-intelligence-l3.test.js +0 -332
  85. package/dist/__tests__/local-llm.test.js +0 -253
  86. package/dist/__tests__/local-mode-offline.test.js +0 -187
  87. package/dist/__tests__/local-mode-stats.test.js +0 -273
  88. package/dist/__tests__/local-mode-tui.test.js +0 -343
  89. package/dist/__tests__/local-parse.test.js +0 -199
  90. package/dist/__tests__/log-tailer.test.js +0 -208
  91. package/dist/__tests__/loop-breaker.test.js +0 -276
  92. package/dist/__tests__/loop-miner.test.js +0 -226
  93. package/dist/__tests__/mcp-config.test.js +0 -126
  94. package/dist/__tests__/mcp-content-json.test.js +0 -10
  95. package/dist/__tests__/mcp-envelope.test.js +0 -124
  96. package/dist/__tests__/metrics-store.test.js +0 -223
  97. package/dist/__tests__/native-watcher.test.js +0 -191
  98. package/dist/__tests__/navigation-hooks-agent-aware.test.js +0 -145
  99. package/dist/__tests__/negative-knowledge.test.js +0 -116
  100. package/dist/__tests__/network-boundary.test.js +0 -190
  101. package/dist/__tests__/network-firewall.test.js +0 -112
  102. package/dist/__tests__/nudge-invariants.test.js +0 -160
  103. package/dist/__tests__/nudge-v2.test.js +0 -225
  104. package/dist/__tests__/offline-rewind.test.js +0 -251
  105. package/dist/__tests__/open-threads.test.js +0 -89
  106. package/dist/__tests__/output-compressor.test.js +0 -93
  107. package/dist/__tests__/pending-violations.test.js +0 -112
  108. package/dist/__tests__/persistence-effectiveness.test.js +0 -143
  109. package/dist/__tests__/provider-factory.test.js +0 -42
  110. package/dist/__tests__/providers.test.js +0 -24
  111. package/dist/__tests__/proxy.test.js +0 -314
  112. package/dist/__tests__/query-router.test.js +0 -1018
  113. package/dist/__tests__/reasoning-quality-route.test.js +0 -138
  114. package/dist/__tests__/redactor.test.js +0 -120
  115. package/dist/__tests__/resource-monitor.test.js +0 -57
  116. package/dist/__tests__/response-envelope.test.js +0 -100
  117. package/dist/__tests__/risk-classifier.test.js +0 -101
  118. package/dist/__tests__/risk-signal-scope.test.js +0 -75
  119. package/dist/__tests__/rule-evaluator.test.js +0 -280
  120. package/dist/__tests__/scip-decoder.test.js +0 -49
  121. package/dist/__tests__/scip-downloader.test.js +0 -201
  122. package/dist/__tests__/scip-merger.test.js +0 -103
  123. package/dist/__tests__/search-index.test.js +0 -422
  124. package/dist/__tests__/semantic-enrichment.test.js +0 -360
  125. package/dist/__tests__/session-brief-builder.test.js +0 -187
  126. package/dist/__tests__/session-context.test.js +0 -221
  127. package/dist/__tests__/session-continuity.test.js +0 -144
  128. package/dist/__tests__/session-dedup.test.js +0 -74
  129. package/dist/__tests__/session-event-wiring.test.js +0 -206
  130. package/dist/__tests__/session-events.test.js +0 -149
  131. package/dist/__tests__/session-legend.test.js +0 -20
  132. package/dist/__tests__/session-persistence.test.js +0 -131
  133. package/dist/__tests__/session-resume-block.test.js +0 -107
  134. package/dist/__tests__/session-resume.test.js +0 -97
  135. package/dist/__tests__/session-summary-writer.test.js +0 -134
  136. package/dist/__tests__/shadow-ledger.test.js +0 -203
  137. package/dist/__tests__/shell-classifier.test.js +0 -151
  138. package/dist/__tests__/shell-compression-floor.test.js +0 -189
  139. package/dist/__tests__/shell-compression-v2.test.js +0 -339
  140. package/dist/__tests__/shell-compressor.test.js +0 -35
  141. package/dist/__tests__/shell-hooks.test.js +0 -128
  142. package/dist/__tests__/shell-strategies.test.js +0 -644
  143. package/dist/__tests__/shell-tee.test.js +0 -133
  144. package/dist/__tests__/signal-dedup.test.js +0 -158
  145. package/dist/__tests__/signal-reinforcer.test.js +0 -77
  146. package/dist/__tests__/signal-scorer.test.js +0 -251
  147. package/dist/__tests__/signal-show-store.test.js +0 -108
  148. package/dist/__tests__/smart-truncate.test.js +0 -215
  149. package/dist/__tests__/snapshot-v2.test.js +0 -113
  150. package/dist/__tests__/sprint-l1-local-mode.test.js +0 -130
  151. package/dist/__tests__/sprint-l10-boot.test.js +0 -220
  152. package/dist/__tests__/sprint-l9-offline-commands.test.js +0 -189
  153. package/dist/__tests__/sprint-q-persistent-context.test.js +0 -198
  154. package/dist/__tests__/sprint-s1-wiring.test.js +0 -215
  155. package/dist/__tests__/sprint-s2-wiring.test.js +0 -256
  156. package/dist/__tests__/sprint-s3-wiring.test.js +0 -195
  157. package/dist/__tests__/sprint-s4-wiring.test.js +0 -213
  158. package/dist/__tests__/sprint-s6-hooks.test.js +0 -222
  159. package/dist/__tests__/sprint-s7-persistent.test.js +0 -263
  160. package/dist/__tests__/sprint-s8-value.test.js +0 -167
  161. package/dist/__tests__/sprint-s9-behavioral.test.js +0 -179
  162. package/dist/__tests__/sprint3-intelligence.test.js +0 -297
  163. package/dist/__tests__/sprint5-mcp-server.test.js +0 -136
  164. package/dist/__tests__/startup-display.test.js +0 -302
  165. package/dist/__tests__/startup-log-file.test.js +0 -97
  166. package/dist/__tests__/stash-manager.test.js +0 -229
  167. package/dist/__tests__/state-detector.test.js +0 -92
  168. package/dist/__tests__/status-dashboard.test.js +0 -142
  169. package/dist/__tests__/temporal-facts.test.js +0 -292
  170. package/dist/__tests__/temporal-routes.test.js +0 -142
  171. package/dist/__tests__/test-detector.test.js +0 -174
  172. package/dist/__tests__/theme.test.js +0 -72
  173. package/dist/__tests__/timeline-agents.test.js +0 -122
  174. package/dist/__tests__/timeline-bootstrap.test.js +0 -176
  175. package/dist/__tests__/timeline-filters.test.js +0 -193
  176. package/dist/__tests__/timeline-markers.test.js +0 -151
  177. package/dist/__tests__/timeline-routes.test.js +0 -156
  178. package/dist/__tests__/timeline-store.test.js +0 -171
  179. package/dist/__tests__/token-counter.test.js +0 -86
  180. package/dist/__tests__/token-estimator.test.js +0 -96
  181. package/dist/__tests__/token-flow-api.test.js +0 -239
  182. package/dist/__tests__/token-flow-instrumentation.test.js +0 -437
  183. package/dist/__tests__/token-flow-persistence.test.js +0 -356
  184. package/dist/__tests__/token-flow-routes.test.js +0 -199
  185. package/dist/__tests__/token-flow.test.js +0 -695
  186. package/dist/__tests__/tool-clusters.test.js +0 -177
  187. package/dist/__tests__/transport-mux.test.js +0 -283
  188. package/dist/__tests__/turn-segmenter.test.js +0 -166
  189. package/dist/__tests__/uninstall.test.js +0 -141
  190. package/dist/__tests__/warm-start-policy.test.js +0 -271
  191. package/dist/__tests__/wire-cap-nudge.test.js +0 -77
  192. package/dist/__tests__/worker-pool.test.js +0 -101
  193. package/dist/ui/assets/index-7gl3mIuY.css +0 -1
  194. package/dist/ui/assets/index-CX4FCWGT.js +0 -10
  195. package/dist/ui/assets/rolldown-runtime-S-ySWqyJ.js +0 -1
  196. package/dist/ui/assets/vis-network-NIJHUFI3.js +0 -908
  197. package/dist/ui/fonts/jetbrains-mono-latin-400-normal.woff +0 -0
  198. package/dist/ui/icon-wordmark.png +0 -0
  199. package/dist/ui/icon-wordmark.svg +0 -30
  200. package/dist/ui/icon.png +0 -0
  201. package/dist/ui/icon.svg +0 -25
  202. package/dist/ui/index.html +0 -15
  203. package/dist/ui/prototype-sandbox/index.html +0 -257
  204. package/dist/ui/screenshots/activity.png +0 -0
  205. package/dist/ui/screenshots/code-base-intelligence.png +0 -0
  206. package/dist/ui/screenshots/dashboard.png +0 -0
  207. package/dist/ui/screenshots/project-memory.png +0 -0
  208. package/dist/ui/screenshots/reasoning-quality.png +0 -0
  209. package/dist/ui/screenshots/reasoning-session.png +0 -0
  210. package/dist/ui/screenshots/token-session.png +0 -0
  211. package/dist/ui/screenshots/token-trace-main.png +0 -0
  212. package/dist/ui/screenshots/token-turn.png +0 -0
  213. package/dist/ui/unerr-wordmark.png +0 -0
  214. package/dist/ui/unerr-wordmark.svg +0 -9
  215. package/dist/ui/unerr.png +0 -0
  216. package/dist/ui/unerr.svg +0 -25
  217. package/dist/ui/web-app-manifest-192x192.png +0 -0
  218. package/dist/ui/web-app-manifest-512x512.png +0 -0
package/README.md CHANGED
@@ -57,6 +57,10 @@ The agent reads from the same store through MCP — every claim on the dashboard
57
57
 
58
58
  ### See it in action
59
59
 
60
+ <p align="center">
61
+ <img src="https://unerr.dev/open-cli/video/unerr_short.gif" alt="unerr in action" width="720" />
62
+ </p>
63
+
60
64
  <table align="center">
61
65
  <tr>
62
66
  <td align="center" width="240">
@@ -106,68 +110,30 @@ The agent reads from the same store through MCP — every claim on the dashboard
106
110
 
107
111
  ## Quick Start
108
112
 
109
- ### 1. Install globally
110
-
111
- ```bash
112
- npm install -g @unerr-ai/unerr
113
- ```
114
-
115
- ### 2. Verify your environment
116
-
117
- ```bash
118
- unerr doctor
119
- ```
120
-
121
- This ensures `unerr` is available in **all** terminal sessions — not just the one you installed from. If your PATH isn't configured correctly (common with nvm, fnm, volta, or pnpm), `unerr doctor` detects the issue and offers to fix it automatically by updating your shell config (`~/.zshrc`, `~/.bashrc`, or `~/.config/fish/config.fish`).
122
-
123
- > **Why this matters:** Global npm packages are installed to a directory that some shells don't include by default. Without this step, `unerr` might work in your current terminal but fail in new ones — which breaks IDE integrations that spawn `unerr --mcp` in a fresh shell.
124
-
125
- ### 3. Choose your mode
113
+ Three steps. Step 1 is once per machine; steps 2–3 are per repo.
126
114
 
127
- <table>
128
- <tr>
129
- <th width="50%">Standalone (single repo, simple)</th>
130
- <th width="50%">Daemon Mode (multi-repo, recommended)</th>
131
- </tr>
132
- <tr>
133
- <td>
115
+ ### 1. Install the CLI
134
116
 
135
117
  ```bash
136
- cd ~/project
137
- unerr install cursor # install MCP config + skills
138
- unerr # start per-repo process
118
+ npm install -g @unerr-ai/unerr
139
119
  ```
140
120
 
141
- One `unerr` process per repo. You start it manually. Good for single-project workflows.
121
+ Puts the `unerr` binary on your PATH. If the global `npm` directory isn't already in your shell's PATH (common with nvm, fnm, volta, pnpm), run `unerr doctor` once — it patches your shell config and won't need to run again.
142
122
 
143
- </td>
144
- <td>
123
+ ### 2. Install for your agent (per repo)
145
124
 
146
125
  ```bash
147
- unerr daemon initialize # one-time: register at boot + start
148
- cd ~/project
149
- unerr install cursor # install config + register repo
150
- # done — IDE auto-connects via unerrd
126
+ cd ~/your-project
127
+ unerr install cursor
151
128
  ```
152
129
 
153
- A single `unerrd` supervisor manages all repos. Starts at login, spawns per-repo processes on demand, idles unused ones, unified dashboard at `localhost:9847`.
154
-
155
- </td>
156
- </tr>
157
- </table>
158
-
159
- > **Important:** After running `unerr install`, restart your coding AI session (close and reopen the IDE or start a new chat) for unerr to take effect. The agent needs to pick up the newly installed MCP config, skills, and instructions.
130
+ Writes the MCP config, skills, hooks, and instructions for that agent in the current repo. Swap `cursor` for any of the [supported agents](#supported-agents): `claude-code`, `windsurf`, `gemini-cli`, `antigravity`, `github-copilot-cli`.
160
131
 
161
- > **`unerr: command not found` in a new terminal?** Run `unerr doctor` in the terminal where it works — it will detect the PATH issue and fix it so `unerr` is recognized everywhere.
132
+ ### 3. Restart your IDE
162
133
 
163
- ### What each command does (no hidden behaviors)
134
+ Close and reopen your IDE (or start a new chat session). Your agent picks up unerr through MCP — graph-backed tools, persistent memory, shell compression all available immediately.
164
135
 
165
- | Command | What it does | What it does NOT do |
166
- |---------|------|------|
167
- | `unerr daemon initialize` | Registers unerrd at boot (launchd/systemd/schtasks) + starts it | - |
168
- | `unerr install <agent>` | MCP config + skills + hooks + instructions + gitignore. If unerrd running: registers the repo | Start unerrd, start per-repo process |
169
- | `unerr --mcp` | Bridges to running process (standalone or daemon-managed) | Spawn unerrd, register repos, start processes |
170
- | `unerr` (no args) | Starts a standalone per-repo proxy | Touch the daemon |
136
+ > **Dashboard:** <http://localhost:9847> open any time to watch token savings, reasoning quality, and the codebase map update as your agent works.
171
137
 
172
138
  ### Supported agents
173
139
 
@@ -180,11 +146,11 @@ unerr install gemini-cli # → .gemini/settings.json + GEMINI.md + .gemi
180
146
  unerr install github-copilot-cli # → .copilot/mcp-config.json + .github/copilot-instructions.md + .github/skills/
181
147
  ```
182
148
 
183
- You can install multiple agents in the same repo — each writes its own config, the repo is registered once:
149
+ Install multiple agents in the same repo — each writes its own config:
184
150
 
185
151
  ```bash
186
- unerr install cursor # registers repo (if daemon running), writes cursor config
187
- unerr install claude-code # skips registration (already done), writes claude-code config
152
+ unerr install cursor
153
+ unerr install claude-code
188
154
  ```
189
155
 
190
156
  > Need manual setup? `unerr install --show-instructions <agent>` prints copy-pasteable steps.
@@ -206,17 +172,16 @@ unerr install claude-code # skips registration (already done), writes claude-c
206
172
  </details>
207
173
 
208
174
  <details>
209
- <summary>What <code>unerr install</code> does (detailed)</summary>
210
-
211
- | Step | What | File(s) written |
212
- |------|------|------|
213
- | MCP config | Agent-specific config pointing to `unerr --mcp` | `.mcp.json`, `.cursor/mcp.json`, etc. |
214
- | Skills | 12 skill definitions teaching the agent when to use each tool | `.claude/skills/`, `.cursor/rules/`, etc. |
215
- | Instructions | Tool-routing table injected into agent instruction file | `CLAUDE.md`, `.cursor/rules/unerr-instructions.mdc` |
216
- | Hooks | Shell compression + tool-adoption nudging | `.claude/settings.json`, `.cursor/hooks.json` |
217
- | Repo registration | If unerrd is running: registers repo with supervisor | Only when daemon is active |
218
- | Gitignore | Ensures `.unerr/` isn't committed | `.gitignore` |
219
- | Force tools | Claude Code only: denies built-in Read/Grep/Glob (opt out: `--no-force-tools`) | `.claude/settings.json` |
175
+ <summary>What <code>unerr install</code> writes</summary>
176
+
177
+ | Item | File(s) |
178
+ |------|------|
179
+ | MCP config pointing to `unerr --mcp` | `.mcp.json`, `.cursor/mcp.json`, |
180
+ | Skills 12 definitions teaching the agent when to use each tool | `.claude/skills/`, `.cursor/rules/`, |
181
+ | Instructions tool-routing table injected into the agent's instruction file | `CLAUDE.md`, `.cursor/rules/unerr-instructions.mdc` |
182
+ | Hooks shell compression + tool-adoption nudging | `.claude/settings.json`, `.cursor/hooks.json` |
183
+ | Gitignore keeps `.unerr/` out of commits | `.gitignore` |
184
+ | Force tools (Claude Code only) denies built-in Read/Grep/Glob so the agent uses graph tools. Opt out with `--no-force-tools`. | `.claude/settings.json` |
220
185
 
221
186
  Idempotent — re-running updates if content changed, skips if identical. Remove with `unerr uninstall`.
222
187
 
@@ -243,9 +208,9 @@ Idempotent — re-running updates if content changed, skips if identical. Remove
243
208
  - **Loop prevention** — a circuit breaker fires after repeated failed attempts on the same entity, surfacing the failure mode instead of letting the agent thrash.
244
209
  - **Memory-effectiveness scoring** — every fact and convention opens a 5-turn observation window and resolves to a verdict (reinforced / acted_on / caught / ignored / corrected). The Reasoning Quality pane shows the **load-bearing rate** — not just how much the agent remembered, but how much of it actually mattered.
245
210
 
246
- ### Daemon mode — automated behaviors
211
+ ### Background behaviors
247
212
 
248
- When `unerr` is running long-lived, these activate in the background:
213
+ While unerr is running these activate automatically no extra commands:
249
214
 
250
215
  - **Architecture guard** — flags structural violations before they ship.
251
216
  - **Cascade guard** — warns when an edit has wide blast radius.
@@ -321,20 +286,23 @@ AI Agent (Claude Code / Cursor / Windsurf / any MCP client)
321
286
 
322
287
  ├── stdio MCP ──→ unerr --mcp (bridge, per IDE session)
323
288
  │ │
324
- │ └── UDS ──→ unerr (long-lived daemon, owns everything)
289
+ │ └── UDS ──→ unerrd (lightweight Node process,
290
+ │ one per machine, auto-spawned)
325
291
  │ │
326
- ├── CozoDB graph (in-process, <5ms)
327
- ├── Fact store (cross-session memory)
328
- ├── Timeline + ledger (every tool call)
329
- ├── File watcher (incremental reindex)
330
- ├── Convention engine
331
- ├── Compression engine (11 strategies, 645+ classifiers)
332
- └── Behavior modules (cascade-guard, loop-breaker, auto-doc…)
292
+ └── per-repo unerr process(es)
293
+
294
+ ├── CozoDB graph (in-process, <5ms)
295
+ ├── Fact store (cross-session memory)
296
+ ├── Timeline + ledger (every tool call)
297
+ ├── File watcher (incremental reindex)
298
+ ├── Convention engine
299
+ │ ├── Compression engine (11 strategies, 645+ classifiers)
300
+ │ └── Behavior modules (cascade-guard, loop-breaker, auto-doc…)
333
301
 
334
- └── Dashboard ──→ http://localhost:<port> (SSE-streamed live)
302
+ └── Dashboard ──→ http://localhost:9847 (SSE-streamed live)
335
303
  ```
336
304
 
337
- Two processes, one local DB. Zero network calls. No API keys. No cloud. Your code never leaves the machine.
305
+ One local DB per repo. Zero network calls. No API keys. No cloud. Your code never leaves the machine.
338
306
 
339
307
  ---
340
308
 
@@ -394,31 +362,17 @@ Every response includes `_meta` (latency, risk level, drift status) and inline `
394
362
  <summary><strong>CLI commands</strong></summary>
395
363
 
396
364
  ```bash
397
- unerr # Start per-repo daemon (or resume; auto-spawned by IDE if missing)
398
- unerr --mcp # Stdio bridge what your IDE invokes via .mcp.json
399
- unerr doctor # Check PATH + environment; auto-fix if unerr isn't in all terminals
400
- unerr install <agent> # Install MCP config + skills + instructions for one agent
401
- unerr uninstall # Remove unerr integration from agents in this repo
402
- unerr status # Show proxy health, entity count, graph age
365
+ unerr install <agent> # MCP config + skills + hooks + instructions for one agent
366
+ unerr uninstall # Remove unerr integration from this repo
367
+ unerr doctor # Check PATH + environment, auto-fix if unerr isn't on all shells
368
+ unerr status # Proxy health, entity count, graph age
403
369
  unerr stats # Session statistics (tokens, tool calls, compression)
404
- ```
405
370
 
406
- **Daemon supervisor** (multi-repo management):
407
-
408
- ```bash
409
- unerr daemon start # Start the unerrd supervisor
410
- unerr daemon stop # Gracefully stop unerrd + all managed repos
411
- unerr daemon status # Show all managed repos, PIDs, memory, idle time
412
- unerr daemon add <path> # Register a repo (indexes on next access)
413
- unerr daemon remove <path> # Unregister a repo
414
- unerr daemon config <path> <k=v> # Set per-repo settings (idleTimeout, javaBuildTool, etc.)
415
- unerr daemon autostart on|off|status # Manage start-at-login (launchd/systemd/schtasks)
416
- unerr daemon logs [--repo <path>] [--follow] # Tail daemon/repo logs
417
- unerr daemon dashboard # Open the unified dashboard in browser
418
- unerr daemon update # Check for updates, install, restart
371
+ unerr --mcp # Stdio bridge — what your IDE invokes via .mcp.json
372
+ unerr # Start a standalone per-repo proxy (rare — IDE invocation covers this)
419
373
  ```
420
374
 
421
- See the [full command reference](#daemon-command-reference) below.
375
+ `unerr pm …` manages the cross-repo `unerrd` process — see the [reference](#process-manager-command-reference) below.
422
376
 
423
377
  </details>
424
378
 
@@ -428,16 +382,17 @@ See the [full command reference](#daemon-command-reference) below.
428
382
  ```
429
383
  src/
430
384
  entrypoints/ CLI entry + boot state machine
431
- proxy/ MCP server (daemon), stdio↔UDS bridge, session stats, shell compression
385
+ proxy/ Per-repo MCP server, stdio↔UDS bridge, session stats, shell compression
386
+ daemon/ Process manager (unerrd) — registry, supervisor, spawn lock, HTTP API
432
387
  intelligence/ CozoDB graph, AST extraction, conventions, rules, search, semantic
433
388
  tracking/ Prompt ledger, drift detection, git attribution
434
389
  behaviors/ Cascade guard, loop breaker, auto-doc, change narrative…
435
- commands/ CLI commands (install, status, stats, timeline, learn, debug, …)
390
+ commands/ CLI commands (install, status, stats, pm, debug, …)
436
391
  tools/ MCP tool implementations (intelligence + coding)
437
392
  hooks/ Claude Code hook system integration
438
- skills/ 11 bundled skill definitions
393
+ skills/ 12 bundled skill definitions
439
394
  server/ + ui/ HTTP API + React (Vite) dashboard
440
- config/ Agent registry (16 agents), MCP config writer, instruction injector
395
+ config/ Agent registry, MCP config writer, instruction injector
441
396
  schemas/ Zod schemas
442
397
  ```
443
398
 
@@ -486,109 +441,30 @@ See [CLAUDE.md](./CLAUDE.md) for full conventions.
486
441
 
487
442
  ---
488
443
 
489
- ## Daemon Command Reference
490
-
491
- The `unerrd` supervisor is a single lightweight process that manages all your registered repositories. It replaces the need to run `unerr` separately in each repo.
444
+ ## Process Manager Command Reference
492
445
 
493
- ### Lifecycle
446
+ `unerrd` is a lightweight Node process that supervises every registered repo. Your IDE invocation auto-spawns it; it exits cleanly after 30 minutes of no MCP activity. You rarely run these commands directly, but they're here when you want a look under the hood.
494
447
 
495
448
  ```bash
496
- unerr daemon start # Start supervisor (PID-locked, one instance per machine)
497
- unerr daemon stop # Graceful shutdown stops all child processes, flushes state
498
- unerr daemon status # Overview: all repos, their state (running/stopped/idle), PIDs,
499
- # memory usage, connection count, idle time, update notices
500
- ```
449
+ unerr pm status # PID, uptime, repos, memory, idle countdown
450
+ unerr pm start # Start manually (auto-spawn usually covers this)
451
+ unerr pm stop # Graceful shutdown — stops children, flushes state
501
452
 
502
- ### Repository Management
453
+ unerr pm add <path> # Register a repo (auto-registered on first MCP call)
454
+ unerr pm remove <path> # Unregister a repo
455
+ unerr pm config <path> <key>=<value> # Per-repo settings (idleTimeout, javaBuildTool, …)
503
456
 
504
- ```bash
505
- unerr daemon add <path> # Register a repo with the supervisor
506
- # - Auto-derives a unique label from the directory name
507
- # - Mirrors settings to <repo>/.unerr/config.json
508
- # - Detects parent/child directory conflicts
509
- # - Installs platform auto-start on first add
510
-
511
- unerr daemon remove <path> # Unregister — stops the child process if running, removes entry
512
-
513
- unerr daemon config <path> <key>=<value> # Set per-repo settings:
514
- # idleTimeout=600 seconds before idle sweep stops the repo
515
- # javaBuildTool=gradle skip detection heuristic
516
- # autostart=false exclude from warm-start at boot
517
- ```
457
+ unerr pm logs # Tail ~/.unerr/logs/unerrd.log
458
+ unerr pm logs --repo <path> # Tail a specific repo's log
459
+ unerr pm logs --bridge --follow # Stream bridge session logs continuously
460
+ unerr pm logs --boot # Most recent spawn sequence only
518
461
 
519
- ### Auto-Start (Start at Login)
520
-
521
- ```bash
522
- unerr daemon autostart on # Install platform service:
523
- # macOS: ~/Library/LaunchAgents/dev.unerr.daemon.plist
524
- # Linux: ~/.config/systemd/user/unerr-daemon.service
525
- # Windows: schtasks /create ... (or Startup folder .cmd)
526
-
527
- unerr daemon autostart off # Remove the platform service
528
- unerr daemon autostart status # Show whether auto-start is installed and running
529
- ```
530
-
531
- Auto-start is also installed automatically on your first `unerr install` or `daemon add` — no manual step needed. Skipped in CI/container environments.
532
-
533
- ### Warm Start
534
-
535
- After boot, the supervisor pre-spawns your Most Recently Used repos at low priority:
536
-
537
- ```bash
538
- unerr daemon set --warm-start-budget 3 # Max repos to warm-start (default: 3)
539
- unerr daemon set --warm-start-idle-days 7 # Skip repos inactive for >N days
540
- unerr daemon set --warm-start-delay-ms 5000 # Delay before warm-start begins
541
- ```
542
-
543
- Warm-start aborts if the system is on battery or under high load.
544
-
545
- ### Logs
546
-
547
- ```bash
548
- unerr daemon logs # Tail the supervisor log (~/.unerr/logs/unerrd.log)
549
- unerr daemon logs --repo <path> # Tail a specific repo's log
550
- unerr daemon logs --bridge # Tail bridge session logs
551
- unerr daemon logs --follow # Stream continuously (like tail -f)
552
- unerr daemon logs -n 50 # Last N lines
553
- unerr daemon logs --boot # Show only the most recent boot sequence
462
+ unerr pm dashboard # Open http://localhost:9847 in your browser
554
463
  ```
555
464
 
556
- ### Dashboard
557
-
558
- ```bash
559
- unerr daemon dashboard # Opens http://localhost:9847 in your default browser
560
- ```
561
-
562
- The unified dashboard shows:
563
- - **Global overview** — all registered repos, their health, active sessions
564
- - **Repo switcher** — click into any repo for its full intelligence dashboard
565
- - **Supervisor info** — uptime, memory, warm-start events, version status
566
-
567
- ### Updates
568
-
569
- ```bash
570
- unerr daemon update # Check npm registry → confirm → stop → install → restart → verify
571
- unerr daemon dismiss-update <version> # Suppress notification for a specific version
572
- ```
573
-
574
- Update notifications appear as:
575
- - A CLI banner on `unerr daemon status` and `unerr` startup
576
- - A dashboard banner with version diff and changelog link
577
- - An `_meta["dev.unerr/update_available"]` field in MCP responses (when >2 minor versions behind)
578
-
579
- Updates are never auto-applied — the agent and supervisor remain stable mid-session.
580
-
581
- ### How auto-spawn works
582
-
583
- When your IDE opens and spawns `unerr --mcp`:
584
-
585
- 1. Bridge checks for a per-repo UDS socket (`.unerr/state/proxy.sock`)
586
- 2. If not found, queries the supervisor's UDS socket (`~/.unerr/state/unerrd.sock`)
587
- 3. If supervisor isn't running, auto-spawns it as a detached background process
588
- 4. Supervisor ensures the repo is registered and its child process is running
589
- 5. Bridge connects — MCP requests flow through
465
+ **Dashboard** shows the global overview (registered repos, health, active sessions), a repo switcher into each repo's full intelligence dashboard, and process-manager info (uptime, memory, idle countdown).
590
466
 
591
- Total cold-start latency (supervisor not running first MCP response): **<2 seconds**.
467
+ **Updates** — `npm i -g @unerr-ai/unerr` and restart the IDE. The next bridge invocation re-spawns the manager on the new version.
592
468
 
593
469
  ---
594
470