@unerr-ai/unerr 0.0.0-beta.9 → 0.1.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.
- package/README.md +393 -246
- package/dist/cli.js +18072 -7199
- package/dist/ui/assets/index-7gl3mIuY.css +1 -0
- package/dist/ui/assets/index-B-0HTtUR.js +10 -0
- package/dist/ui/index.html +2 -2
- package/dist/ui/screenshots/activity.png +0 -0
- package/dist/ui/screenshots/code-base-intelligence.png +0 -0
- package/dist/ui/screenshots/dashboard.png +0 -0
- package/dist/ui/screenshots/project-memory.png +0 -0
- package/dist/ui/screenshots/reasoning-quality.png +0 -0
- package/dist/ui/screenshots/token-trace-main.png +0 -0
- package/package.json +30 -19
- package/dist/ui/assets/index-B_QbOkZx.js +0 -10
- package/dist/ui/assets/index-C2BBqscH.css +0 -1
package/README.md
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<p align="center">
|
|
2
|
-
<img src="https://unerr.dev/icon-wordmark.svg" alt="unerr" width="320"
|
|
2
|
+
<a href="https://www.unerr.dev/"><img src="https://unerr.dev/icon-wordmark.svg" alt="unerr — local intelligence layer for AI coding agents" width="320" /></a>
|
|
3
3
|
</p>
|
|
4
4
|
|
|
5
5
|
<p align="center">
|
|
@@ -7,14 +7,19 @@
|
|
|
7
7
|
</p>
|
|
8
8
|
|
|
9
9
|
<p align="center">
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
A local intelligence layer that sits between your AI agent and your codebase —<br/>
|
|
11
|
+
indexes every call, remembers every decision, and gets sharper the longer you use it.
|
|
12
12
|
</p>
|
|
13
13
|
|
|
14
14
|
<p align="center">
|
|
15
|
+
<a href="https://www.unerr.dev/"><img src="https://img.shields.io/badge/website-unerr.dev-8B5CF6?style=flat-square&logo=icloud&logoColor=white" alt="Website" /></a>
|
|
15
16
|
<a href="https://www.npmjs.com/package/@unerr-ai/unerr"><img src="https://img.shields.io/badge/install-npm_i_@unerr--ai/unerr-8B5CF6?style=flat-square&logo=npm" alt="Install" /></a>
|
|
17
|
+
<a href="https://discord.gg/JfZ4pYgb"><img src="https://img.shields.io/badge/community-Discord-5865F2?style=flat-square&logo=discord&logoColor=white" alt="Discord" /></a>
|
|
18
|
+
<a href="https://x.com/unerr_ai"><img src="https://img.shields.io/badge/follow-@unerr__ai-000000?style=flat-square&logo=x&logoColor=white" alt="X / Twitter" /></a>
|
|
19
|
+
<a href="https://www.linkedin.com/company/unerr"><img src="https://img.shields.io/badge/linkedin-unerr-0A66C2?style=flat-square&logo=linkedin&logoColor=white" alt="LinkedIn" /></a>
|
|
16
20
|
<img src="https://img.shields.io/badge/runtime-Node.js_≥20-339933?style=flat-square&logo=node.js&logoColor=white" alt="Node.js" />
|
|
17
21
|
<img src="https://img.shields.io/badge/protocol-MCP-7C3AED?style=flat-square" alt="MCP" />
|
|
22
|
+
<img src="https://img.shields.io/badge/local--first-no_cloud-22D3EE?style=flat-square" alt="Local-first" />
|
|
18
23
|
<img src="https://img.shields.io/badge/license-ELv2-A1A1AA?style=flat-square" alt="License" />
|
|
19
24
|
</p>
|
|
20
25
|
|
|
@@ -24,144 +29,156 @@
|
|
|
24
29
|
|
|
25
30
|
---
|
|
26
31
|
|
|
27
|
-
##
|
|
32
|
+
## The agent isn't stupid. It's flying blind.
|
|
28
33
|
|
|
29
|
-
|
|
34
|
+
Watch any AI coding session for ten minutes and you'll see the same loop:
|
|
30
35
|
|
|
31
|
-
**
|
|
36
|
+
- It **reads 30 files** to find one function — burning the context window before it writes a line.
|
|
37
|
+
- It **edits something with 40 callers** and never knows it just broke three services.
|
|
38
|
+
- It **re-derives the same conventions** you taught it yesterday, this morning, and an hour ago.
|
|
39
|
+
- It **forgets the entire session** the moment the window closes.
|
|
32
40
|
|
|
33
|
-
|
|
34
|
-
- It doesn't know your team uses `fetch` prefixes, not `get`
|
|
35
|
-
- It forgot everything from yesterday's session
|
|
36
|
-
|
|
37
|
-
unerr gives it an intelligence layer that compounds. Every caller, every convention, every session — accumulated, not re-derived. The agent stops searching and starts knowing.
|
|
41
|
+
Every one of these is the same root cause: the agent has **no persistent memory of your code, your team's style, or its own past mistakes**. unerr is that memory. One process, fully local, indexed in seconds — and your agent picks it up automatically through MCP.
|
|
38
42
|
|
|
39
43
|
---
|
|
40
44
|
|
|
41
|
-
## What
|
|
45
|
+
## What you actually see
|
|
46
|
+
|
|
47
|
+
Run `unerr` and open the dashboard. Four panes, all live:
|
|
42
48
|
|
|
43
|
-
|
|
49
|
+
| Pane | Answers the question | Powered by |
|
|
50
|
+
|---|---|---|
|
|
51
|
+
| **Token Optimization** | *How much context did unerr save my agent this session?* — saved vs. delivered, compounding multiplier, breakdown by mechanism (compression, graph hits, skipped re-reads). | Per-turn ledger of every tool call |
|
|
52
|
+
| **Reasoning Quality** | *Did the agent actually use what it remembered?* — 4-pillar score across exploration, planning, execution, persistent memory. | 5-turn outcome window per fact/convention |
|
|
53
|
+
| **Codebase Map + Code Intelligence** | *What's the call graph and where are the blast-radius landmines?* — entities, edges, fan-in/out chokepoints, cross-module surprise links. | CozoDB graph (in-process, <5ms) |
|
|
54
|
+
| **Project Memory + Activity** | *What did we already learn, and what was I doing last time?* — facts the agent recorded, sessions stitched into intents, open blockers. | Append-only fact store + timeline.db |
|
|
44
55
|
|
|
45
|
-
|
|
46
|
-
|:---|:---|
|
|
47
|
-
| Reads 30 files to understand a call graph | Queries the graph in 5ms |
|
|
48
|
-
| Misses downstream callers, breaks things | Sees full blast radius before editing |
|
|
49
|
-
| Re-derives conventions every session | Knows your patterns, enforces them |
|
|
50
|
-
| Session degrades at 70% context fill | Stays sharp — 93% shell compression, context lasts 3–5x longer |
|
|
51
|
-
| Starts from zero tomorrow | Resumes where it left off |
|
|
56
|
+
The agent reads from the same store through MCP — every claim on the dashboard is also a tool call it just made.
|
|
52
57
|
|
|
53
58
|
### See it in action
|
|
54
59
|
|
|
55
|
-
<
|
|
56
|
-
<
|
|
57
|
-
<
|
|
58
|
-
<
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
<
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
<
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
<
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
</
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
</
|
|
82
|
-
</
|
|
83
|
-
|
|
84
|
-
|
|
60
|
+
<table align="center">
|
|
61
|
+
<tr>
|
|
62
|
+
<td align="center" width="240">
|
|
63
|
+
<img src="https://unerr.dev/open-cli/screenshots/dashboard.png" alt="unerr dashboard — live overview" width="240" height="150" />
|
|
64
|
+
<br/><sub><strong>Dashboard</strong><br/>Live overview — active sessions, recent tool calls, tokens saved this turn.</sub>
|
|
65
|
+
</td>
|
|
66
|
+
<td align="center" width="240">
|
|
67
|
+
<img src="https://unerr.dev/open-cli/screenshots/token-trace-main.png" alt="unerr token trace — global" width="240" height="150" />
|
|
68
|
+
<br/><sub><strong>Token Trace · global</strong><br/>Aggregate savings across every session, broken down by mechanism (graph, file_read, shell, dedup, format).</sub>
|
|
69
|
+
</td>
|
|
70
|
+
<td align="center" width="240">
|
|
71
|
+
<img src="https://unerr.dev/open-cli/screenshots/token-session.png" alt="unerr token trace — session" width="240" height="150" />
|
|
72
|
+
<br/><sub><strong>Token Trace · session</strong><br/>Single session: per-turn savings, mechanism mix, and the compounding multiplier.</sub>
|
|
73
|
+
</td>
|
|
74
|
+
<td align="center" width="240">
|
|
75
|
+
<img src="https://unerr.dev/open-cli/screenshots/token-turn.png" alt="unerr token trace — turn" width="240" height="150" />
|
|
76
|
+
<br/><sub><strong>Token Trace · turn</strong><br/>Single turn: which tool calls fired, tokens each would have cost without unerr vs what was delivered.</sub>
|
|
77
|
+
</td>
|
|
78
|
+
</tr>
|
|
79
|
+
<tr>
|
|
80
|
+
<td align="center" width="240">
|
|
81
|
+
<img src="https://unerr.dev/open-cli/screenshots/reasoning-quality.png" alt="unerr reasoning quality — global" width="240" height="150" />
|
|
82
|
+
<br/><sub><strong>Reasoning Quality · global</strong><br/>Four-pillar score across cleaner context, fewer wasted turns, fewer breakages, persistent memory.</sub>
|
|
83
|
+
</td>
|
|
84
|
+
<td align="center" width="240">
|
|
85
|
+
<img src="https://unerr.dev/open-cli/screenshots/reasoning-session.png" alt="unerr reasoning quality — session" width="240" height="150" />
|
|
86
|
+
<br/><sub><strong>Reasoning Quality · session</strong><br/>Per-session: which facts and conventions were reinforced, acted on, ignored, or corrected.</sub>
|
|
87
|
+
</td>
|
|
88
|
+
<td align="center" width="240">
|
|
89
|
+
<img src="https://unerr.dev/open-cli/screenshots/code-base-intelligence.png" alt="unerr code intelligence" width="240" height="150" />
|
|
90
|
+
<br/><sub><strong>Code Intelligence</strong><br/>Call graph, fan-in/out chokepoints, cross-module surprise links, and a risk grade per file.</sub>
|
|
91
|
+
</td>
|
|
92
|
+
<td align="center" width="240">
|
|
93
|
+
<img src="https://unerr.dev/open-cli/screenshots/project-memory.png" alt="unerr project memory — facts" width="240" height="150" />
|
|
94
|
+
<br/><sub><strong>Project Memory</strong><br/>Conventions, anti-patterns, decisions — with decay-adjusted confidence and reinforcement counts.</sub>
|
|
95
|
+
</td>
|
|
96
|
+
</tr>
|
|
97
|
+
<tr>
|
|
98
|
+
<td align="center" width="240" colspan="4">
|
|
99
|
+
<img src="https://unerr.dev/open-cli/screenshots/activity.png" alt="unerr activity — timeline + heatmap" width="240" height="150" />
|
|
100
|
+
<br/><sub><strong>Activity</strong><br/>Turn-grouped timeline with a 30-day heatmap — each row is one burst of agent work (intent → tools → outcome).</sub>
|
|
101
|
+
</td>
|
|
102
|
+
</tr>
|
|
103
|
+
</table>
|
|
85
104
|
|
|
86
105
|
---
|
|
87
106
|
|
|
88
107
|
## Quick Start
|
|
89
108
|
|
|
90
|
-
### Install
|
|
109
|
+
### 1. Install globally
|
|
91
110
|
|
|
92
111
|
```bash
|
|
93
|
-
# 1. Install globally
|
|
94
112
|
npm install -g @unerr-ai/unerr
|
|
95
|
-
|
|
96
|
-
# 2. Add to your AI agent (in your project directory)
|
|
97
|
-
unerr install claude-code # or: cursor, vscode, windsurf, codex, etc.
|
|
98
|
-
|
|
99
|
-
# 3. Run (indexes your codebase, starts MCP server)
|
|
100
|
-
unerr
|
|
101
113
|
```
|
|
102
114
|
|
|
103
|
-
|
|
104
|
-
|
|
115
|
+
### 2. Choose your mode
|
|
116
|
+
|
|
117
|
+
<table>
|
|
118
|
+
<tr>
|
|
119
|
+
<th width="50%">Standalone (single repo, simple)</th>
|
|
120
|
+
<th width="50%">Daemon Mode (multi-repo, recommended)</th>
|
|
121
|
+
</tr>
|
|
122
|
+
<tr>
|
|
123
|
+
<td>
|
|
105
124
|
|
|
106
125
|
```bash
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
pnpm run build
|
|
126
|
+
cd ~/project
|
|
127
|
+
unerr install cursor # install MCP config + skills
|
|
128
|
+
unerr # start per-repo process
|
|
129
|
+
```
|
|
112
130
|
|
|
113
|
-
|
|
114
|
-
pnpm link --global
|
|
131
|
+
One `unerr` process per repo. You start it manually. Good for single-project workflows.
|
|
115
132
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
unerr install claude-code # or: cursor, vscode, windsurf, codex, etc.
|
|
133
|
+
</td>
|
|
134
|
+
<td>
|
|
119
135
|
|
|
120
|
-
|
|
121
|
-
unerr
|
|
136
|
+
```bash
|
|
137
|
+
unerr daemon initialize # one-time: register at boot + start
|
|
138
|
+
cd ~/project
|
|
139
|
+
unerr install cursor # install config + register repo
|
|
140
|
+
# done — IDE auto-connects via unerrd
|
|
122
141
|
```
|
|
123
|
-
-->
|
|
124
142
|
|
|
125
|
-
|
|
143
|
+
A single `unerrd` supervisor manages all repos. Starts at login, spawns per-repo processes on demand, idles unused ones, unified dashboard at `localhost:9847`.
|
|
126
144
|
|
|
127
|
-
|
|
145
|
+
</td>
|
|
146
|
+
</tr>
|
|
147
|
+
</table>
|
|
128
148
|
|
|
129
|
-
|
|
149
|
+
> **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
150
|
|
|
131
|
-
###
|
|
151
|
+
### What each command does (no hidden behaviors)
|
|
132
152
|
|
|
133
|
-
|
|
153
|
+
| Command | What it does | What it does NOT do |
|
|
154
|
+
|---------|------|------|
|
|
155
|
+
| `unerr daemon initialize` | Registers unerrd at boot (launchd/systemd/schtasks) + starts it | - |
|
|
156
|
+
| `unerr install <agent>` | MCP config + skills + hooks + instructions + gitignore. If unerrd running: registers the repo | Start unerrd, start per-repo process |
|
|
157
|
+
| `unerr --mcp` | Bridges to running process (standalone or daemon-managed) | Spawn unerrd, register repos, start processes |
|
|
158
|
+
| `unerr` (no args) | Starts a standalone per-repo proxy | Touch the daemon |
|
|
159
|
+
|
|
160
|
+
### Supported agents
|
|
134
161
|
|
|
135
162
|
```bash
|
|
136
|
-
unerr install claude-code # .mcp.json + CLAUDE.md + .claude/skills/ + hooks
|
|
137
|
-
unerr install cursor # .cursor/mcp.json + .cursor/rules/ + hooks
|
|
138
|
-
unerr install antigravity # .antigravity/mcp_config.json + .agents/rules/ + .agents/skills/
|
|
139
|
-
unerr install windsurf # ~/.codeium/windsurf/mcp_config.json + .windsurf/rules/ + .windsurf/skills/
|
|
140
|
-
unerr install gemini-cli # .gemini/settings.json + GEMINI.md + .gemini/skills/
|
|
141
|
-
unerr install github-copilot-cli # .copilot/mcp-config.json + .github/copilot-instructions.md + .github/skills/
|
|
163
|
+
unerr install claude-code # → .mcp.json + CLAUDE.md + .claude/skills/ + hooks
|
|
164
|
+
unerr install cursor # → .cursor/mcp.json + .cursor/rules/ + hooks
|
|
165
|
+
unerr install antigravity # → .antigravity/mcp_config.json + .agents/rules/ + .agents/skills/
|
|
166
|
+
unerr install windsurf # → ~/.codeium/windsurf/mcp_config.json + .windsurf/rules/ + .windsurf/skills/
|
|
167
|
+
unerr install gemini-cli # → .gemini/settings.json + GEMINI.md + .gemini/skills/
|
|
168
|
+
unerr install github-copilot-cli # → .copilot/mcp-config.json + .github/copilot-instructions.md + .github/skills/
|
|
142
169
|
```
|
|
143
170
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
MCP config and basic integration work. Instruction injection, skills, and hooks support varies — contributions welcome.
|
|
171
|
+
You can install multiple agents in the same repo — each writes its own config, the repo is registered once:
|
|
147
172
|
|
|
148
173
|
```bash
|
|
149
|
-
unerr install
|
|
150
|
-
unerr install
|
|
151
|
-
unerr install cline # .cline/mcp.json + .clinerules
|
|
152
|
-
unerr install kiro # .kiro/mcp.json
|
|
153
|
-
unerr install codex # .codex/mcp.json + AGENTS.md
|
|
154
|
-
unerr install aider # .aider/mcp.json
|
|
155
|
-
unerr install opencode # .opencode/mcp.json
|
|
156
|
-
unerr install trae # .trae/mcp.json
|
|
157
|
-
unerr install augment # .augment/mcp.json
|
|
158
|
-
unerr install continue # .continue/config.json
|
|
174
|
+
unerr install cursor # registers repo (if daemon running), writes cursor config
|
|
175
|
+
unerr install claude-code # skips registration (already done), writes claude-code config
|
|
159
176
|
```
|
|
160
177
|
|
|
161
|
-
|
|
178
|
+
> Need manual setup? `unerr install --show-instructions <agent>` prints copy-pasteable steps.
|
|
162
179
|
|
|
163
180
|
<details>
|
|
164
|
-
<summary>Manual MCP config (any
|
|
181
|
+
<summary>Manual MCP config (any MCP-compatible client)</summary>
|
|
165
182
|
|
|
166
183
|
```json
|
|
167
184
|
{
|
|
@@ -176,47 +193,58 @@ unerr install continue # .continue/config.json
|
|
|
176
193
|
|
|
177
194
|
</details>
|
|
178
195
|
|
|
196
|
+
<details>
|
|
197
|
+
<summary>What <code>unerr install</code> does (detailed)</summary>
|
|
198
|
+
|
|
199
|
+
| Step | What | File(s) written |
|
|
200
|
+
|------|------|------|
|
|
201
|
+
| MCP config | Agent-specific config pointing to `unerr --mcp` | `.mcp.json`, `.cursor/mcp.json`, etc. |
|
|
202
|
+
| Skills | 12 skill definitions teaching the agent when to use each tool | `.claude/skills/`, `.cursor/rules/`, etc. |
|
|
203
|
+
| Instructions | Tool-routing table injected into agent instruction file | `CLAUDE.md`, `.cursor/rules/unerr-instructions.mdc` |
|
|
204
|
+
| Hooks | Shell compression + tool-adoption nudging | `.claude/settings.json`, `.cursor/hooks.json` |
|
|
205
|
+
| Repo registration | If unerrd is running: registers repo with supervisor | Only when daemon is active |
|
|
206
|
+
| Gitignore | Ensures `.unerr/` isn't committed | `.gitignore` |
|
|
207
|
+
| Force tools | Claude Code only: denies built-in Read/Grep/Glob (opt out: `--no-force-tools`) | `.claude/settings.json` |
|
|
208
|
+
|
|
209
|
+
Idempotent — re-running updates if content changed, skips if identical. Remove with `unerr uninstall`.
|
|
210
|
+
|
|
211
|
+
</details>
|
|
212
|
+
|
|
179
213
|
---
|
|
180
214
|
|
|
181
|
-
## What you
|
|
215
|
+
## What changes the moment you connect
|
|
182
216
|
|
|
183
|
-
###
|
|
217
|
+
### First session — instant value
|
|
184
218
|
|
|
185
|
-
- **Graph navigation** — `get_entity
|
|
186
|
-
- **Blast radius
|
|
187
|
-
- **
|
|
188
|
-
- **Shell compression** — 11 strategies, 645+ command classifiers. Diffs, errors, logs, test
|
|
189
|
-
- **
|
|
190
|
-
- **
|
|
191
|
-
- **Semantic search** — `semantic_search` finds conceptually similar code even with different naming. `find_similar` discovers related entities by embedding distance.
|
|
192
|
-
- **Business context** — `get_business_context` explains why code exists — purpose, feature area, taxonomy.
|
|
193
|
-
- **Tool adoption nudging** — 5-layer reinforcement system ensures agents consistently use unerr MCP tools over built-in alternatives. Exec nudges, hook interception, instruction-level enforcement, and skill reminders — all automatic, zero config.
|
|
219
|
+
- **Graph navigation in <5ms** — `get_entity`, `get_references`, `get_imports`, `search_code`. The agent stops reading 30 files to find one function.
|
|
220
|
+
- **Blast radius before edits** — `get_references` returns every caller. No more confident wrong changes that ripple across services.
|
|
221
|
+
- **Targeted file reads** — `file_read({entity: "fnName"})` returns just that function + relevant conventions/facts, not 2000 lines.
|
|
222
|
+
- **Shell compression** — 11 strategies, 645+ command classifiers. Diffs, errors, logs, test runs, YAML — each compressed differently. **93% average compression** across real-world benchmarks (2 MB → 138 KB). Raw output is kept on disk; the agent can recover it on demand.
|
|
223
|
+
- **Convention awareness** — naming, structure, import patterns auto-detected and injected into the agent's context.
|
|
224
|
+
- **Tool adoption nudging** — five reinforcement layers (exec nudges, hook interception, instruction injection, skill reminders, default-deny of built-ins on Claude Code) push the agent to use the graph instead of grep.
|
|
194
225
|
|
|
195
|
-
###
|
|
226
|
+
### Session 2+ — it starts compounding
|
|
196
227
|
|
|
197
|
-
- **Session persistence** —
|
|
198
|
-
- **Fact memory** — `record_fact` persists conventions, decisions, and anti-patterns
|
|
199
|
-
- **
|
|
200
|
-
- **
|
|
201
|
-
- **
|
|
202
|
-
- **Loop prevention** — circuit breaker fires after repeated failed attempts.
|
|
228
|
+
- **Session persistence** — what the agent learned today is available tomorrow. No more starting from zero.
|
|
229
|
+
- **Fact memory** — `record_fact` persists conventions, decisions, and anti-patterns; `recall_facts` retrieves them with decay-adjusted confidence. Facts also auto-detect from coding sessions.
|
|
230
|
+
- **Episodic narratives** — when you reopen a file, the agent sees what was modified there, when, and why.
|
|
231
|
+
- **Loop prevention** — a circuit breaker fires after repeated failed attempts on the same entity, surfacing the failure mode instead of letting the agent thrash.
|
|
232
|
+
- **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.
|
|
203
233
|
|
|
204
|
-
###
|
|
234
|
+
### Daemon mode — automated behaviors
|
|
205
235
|
|
|
206
|
-
When
|
|
236
|
+
When `unerr` is running long-lived, these activate in the background:
|
|
207
237
|
|
|
208
|
-
- **Architecture guard** — flags structural violations before they ship
|
|
209
|
-
- **Cascade guard** — warns when
|
|
210
|
-
- **Convention drift** — detects when new code diverges from established patterns
|
|
211
|
-
- **Auto-doc** — generates
|
|
212
|
-
- **Change narrative** — tracks the story behind multi-step refactors
|
|
213
|
-
- **Loop breaker** — intervenes when the agent is stuck
|
|
214
|
-
- **Session continuity** — preserves
|
|
238
|
+
- **Architecture guard** — flags structural violations before they ship.
|
|
239
|
+
- **Cascade guard** — warns when an edit has wide blast radius.
|
|
240
|
+
- **Convention drift** — detects when new code diverges from established patterns.
|
|
241
|
+
- **Auto-doc** — generates docs for undocumented entities.
|
|
242
|
+
- **Change narrative** — tracks the story behind multi-step refactors.
|
|
243
|
+
- **Loop breaker** — intervenes when the agent is stuck retrying.
|
|
244
|
+
- **Session continuity** — preserves state across restarts.
|
|
215
245
|
|
|
216
246
|
### Shell compression benchmarks
|
|
217
247
|
|
|
218
|
-
Every shell command the agent runs is classified (645+ command patterns + content heuristics) and compressed with the best-fit strategy:
|
|
219
|
-
|
|
220
248
|
| Strategy | What it compresses | Avg compression |
|
|
221
249
|
|----------|-------------------|:-:|
|
|
222
250
|
| **diff** | `git diff`, patch output | **99%** |
|
|
@@ -231,138 +259,154 @@ Every shell command the agent runs is classified (645+ command patterns + conten
|
|
|
231
259
|
| **yaml** | YAML configs, `kubectl get -o yaml`, Helm output | adaptive |
|
|
232
260
|
| **omni** | Fallback for unrecognized output | adaptive |
|
|
233
261
|
|
|
234
|
-
**Overall: 93% compression** (
|
|
262
|
+
**Overall: 93% compression** (2 MB → 138 KB across 40 real-world test cases).
|
|
235
263
|
|
|
236
264
|
### Language support
|
|
237
265
|
|
|
238
|
-
| Language | Tier |
|
|
266
|
+
| Language | Tier | Entities | Edges | Tree-sitter | SCIP |
|
|
239
267
|
|----------|:---:|:-:|:-:|:-:|:-:|
|
|
240
|
-
| TypeScript | 1 | ✓ | ✓ | ✓ | ✓ |
|
|
241
|
-
|
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
|
255
|
-
|
|
256
|
-
|
|
|
257
|
-
|
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
| Build / Make | `.cmake`, `.bazel`, `.bzl`, `.mk`, `Makefile`, `Dockerfile`, `Jenkinsfile` |
|
|
275
|
-
| Config | `.ini`, `.cfg`, `.conf`, `.properties`, `.csv`, `.tsv`, `.editorconfig` |
|
|
276
|
-
| CI/CD | `.github/workflows/*.yml`, `.gitlab-ci.yml` |
|
|
268
|
+
| TypeScript / JavaScript / Python / Go / Java / Kotlin / Scala / Rust / Ruby / C / C++ / C# | 1 | ✓ | ✓ | ✓ | ✓ |
|
|
269
|
+
| PHP / Swift / Lua / Dart / Elixir / Zig | 2 | ✓ | ✓ | ✓ | — |
|
|
270
|
+
|
|
271
|
+
**Tier 1** (12 languages): full tree-sitter AST + dedicated extraction + SCIP compiler-verified call graphs where the toolchain is on PATH.
|
|
272
|
+
**Tier 2** (6 languages): tree-sitter AST + generic extraction. Regex fallback for the rest.
|
|
273
|
+
|
|
274
|
+
**Tier 3 (search-discoverable):** Markdown, IaC (`.tf`, `.yaml`, `.toml`), schemas (`.proto`, `.graphql`, `.prisma`), SQL, shell, templates, build files, CI configs — indexed for `search_code` only, no entity extraction.
|
|
275
|
+
|
|
276
|
+
---
|
|
277
|
+
|
|
278
|
+
## How unerr compares
|
|
279
|
+
|
|
280
|
+
Adjacent tools each own one layer — graph navigation, persistent memory, or output compression. unerr integrates all three, plus the drift prevention that keeps the graph tools in active rotation. Peer strengths are real; the table credits them where they win.
|
|
281
|
+
|
|
282
|
+
| Capability | unerr | Graphify (~47K) | Serena (~23K) | claude-mem (~75K) | RTK (~40K) |
|
|
283
|
+
|---|:---:|:---:|:---:|:---:|:---:|
|
|
284
|
+
| **Code intelligence** | | | | | |
|
|
285
|
+
| Pre-hoc file-read intercept — resolves entity via graph, returns ~200 lines + conventions + blast radius instead of a 3,000-line file | ✓ | ✗ | Partial | ✗ | ✗ |
|
|
286
|
+
| Convention auto-detection — naming, structure, import direction from ≥70% adherence; no manual rules file | ✓ | ✗ | ✗ | ✗ | ✗ |
|
|
287
|
+
| Drift / staleness signals — `ur\|dft` fires when code moves under stored memory | ✓ | ✗ | ✗ | ✗ | ✗ |
|
|
288
|
+
| **Memory & continuity** | | | | | |
|
|
289
|
+
| Persistent across sessions — typed facts with per-type decay, contradiction handling | ✓ | ✗ | ✗ | ✓ | ✗ |
|
|
290
|
+
| Per-repo isolation — all state in `.unerr/` inside the repo, no cross-project leakage | ✓ | ✓ | ✓ | ✗ | — |
|
|
291
|
+
| **Runtime** | | | | | |
|
|
292
|
+
| Zero LLM in core — no API keys, no per-turn inference cost | ✓ | ✓ | ✓ | ✗ | ✓ |
|
|
293
|
+
| Keeps MCP tools in active rotation — without enforcement, agents revert to built-in Read/Grep/Glob within 3–5 turns | ✓ | ✗ | ✗ | ✗ | ✗ |
|
|
294
|
+
|
|
295
|
+
Three numbers behind the table:
|
|
296
|
+
|
|
297
|
+
- **~84%** of an AI coding agent's tokens are tool output, mostly file reads (JetBrains, NeurIPS 2025 DL4Code Workshop) — unerr intercepts before the read.
|
|
298
|
+
- **0** LLM calls per query in the Free tier — facts, conventions, and drift signals are algorithmic.
|
|
299
|
+
- **3–5** turns is how long agents take to revert to built-in Read/Grep/Glob without drift prevention.
|
|
300
|
+
|
|
301
|
+
Honest acknowledgements: unerr is the new entrant with fewer stars than every peer; the install is heavier than `brew install` (Node + index step); TypeScript is deepest, other languages run on tree-sitter; no semantic vector retrieval and no narrative session resume in the Free tier.
|
|
277
302
|
|
|
278
303
|
---
|
|
279
304
|
|
|
280
305
|
## How it works
|
|
281
306
|
|
|
282
307
|
```
|
|
283
|
-
AI Agent (Claude Code / Cursor /
|
|
284
|
-
│
|
|
285
|
-
├── MCP tools ──→ unerr ──→ CozoDB graph (in-process, <5ms)
|
|
286
|
-
│ │
|
|
287
|
-
│ ├── Convention engine (auto-detects patterns)
|
|
288
|
-
│ ├── Fact store (cross-session memory)
|
|
289
|
-
│ ├── Shadow ledger (mark-working / revert / timeline)
|
|
290
|
-
│ ├── Token budgeter (prevents context rot)
|
|
291
|
-
│ └── Compression engine (11 strategies, 645+ classifiers)
|
|
308
|
+
AI Agent (Claude Code / Cursor / Windsurf / any MCP client)
|
|
292
309
|
│
|
|
293
|
-
├──
|
|
310
|
+
├── stdio MCP ──→ unerr --mcp (bridge, per IDE session)
|
|
311
|
+
│ │
|
|
312
|
+
│ └── UDS ──→ unerr (long-lived daemon, owns everything)
|
|
313
|
+
│ │
|
|
314
|
+
│ ├── CozoDB graph (in-process, <5ms)
|
|
315
|
+
│ ├── Fact store (cross-session memory)
|
|
316
|
+
│ ├── Timeline + ledger (every tool call)
|
|
317
|
+
│ ├── File watcher (incremental reindex)
|
|
318
|
+
│ ├── Convention engine
|
|
319
|
+
│ ├── Compression engine (11 strategies, 645+ classifiers)
|
|
320
|
+
│ └── Behavior modules (cascade-guard, loop-breaker, auto-doc…)
|
|
294
321
|
│
|
|
295
|
-
└──
|
|
322
|
+
└── Dashboard ──→ http://localhost:<port> (SSE-streamed live)
|
|
296
323
|
```
|
|
297
324
|
|
|
298
|
-
|
|
325
|
+
Two processes, one local DB. Zero network calls. No API keys. No cloud. Your code never leaves the machine.
|
|
299
326
|
|
|
300
327
|
---
|
|
301
328
|
|
|
302
329
|
## MCP Tools (20)
|
|
303
330
|
|
|
304
|
-
### Graph Intelligence (
|
|
331
|
+
### Graph Intelligence (8)
|
|
305
332
|
|
|
306
333
|
| Tool | What the agent gets |
|
|
307
334
|
|------|-----|
|
|
308
|
-
| `get_entity` | Any code entity
|
|
309
|
-
| `get_file` | All entities
|
|
310
|
-
| `get_references` |
|
|
311
|
-
| `get_imports` | Import
|
|
312
|
-
| `search_code` | Graph-ranked full-text search across all
|
|
313
|
-
| `
|
|
314
|
-
| `
|
|
315
|
-
| `
|
|
316
|
-
| `get_critical_nodes` | High fan-in/fan-out chokepoints (structural bottlenecks) |
|
|
317
|
-
| `get_cross_boundary_links` | Unexpected cross-module dependencies scored by surprise |
|
|
318
|
-
| `semantic_search` | Vector-based conceptual search (finds similar code with different names) |
|
|
319
|
-
| `find_similar` | Entities similar to a given entity by embedding distance |
|
|
320
|
-
| `get_project_stats` | Project-wide entity counts, risk distribution, health grade |
|
|
321
|
-
| `file_connections` | Connected files — imports, co-change correlations, structure |
|
|
322
|
-
| `get_test_coverage` | Direct and transitive test coverage for any entity |
|
|
335
|
+
| `get_entity` | Any code entity — signature, body, callers, callees, risk |
|
|
336
|
+
| `get_file` | All entities in a file with risk summary |
|
|
337
|
+
| `get_references` | Callers (blast radius) or callees (dependencies) |
|
|
338
|
+
| `get_imports` | Import graph for a file |
|
|
339
|
+
| `search_code` | Graph-ranked full-text search across all entities |
|
|
340
|
+
| `get_conventions` | Detected naming/structure/import patterns + adherence rates |
|
|
341
|
+
| `get_critical_nodes` | High fan-in/fan-out chokepoints |
|
|
342
|
+
| `get_cross_boundary_links` | Unexpected cross-module dependencies, scored by surprise |
|
|
323
343
|
|
|
324
|
-
###
|
|
344
|
+
### Structural Analysis (3)
|
|
325
345
|
|
|
326
346
|
| Tool | What the agent gets |
|
|
327
347
|
|------|-----|
|
|
328
|
-
| `
|
|
329
|
-
| `
|
|
348
|
+
| `get_project_stats` | Entity counts, risk distribution, health grade |
|
|
349
|
+
| `file_connections` | Imports + co-change correlations for a file |
|
|
350
|
+
| `get_test_coverage` | Direct + transitive tests for any entity |
|
|
330
351
|
|
|
331
|
-
###
|
|
352
|
+
### File Protocol (2)
|
|
332
353
|
|
|
333
354
|
| Tool | What the agent gets |
|
|
334
355
|
|------|-----|
|
|
335
|
-
| `
|
|
336
|
-
| `
|
|
356
|
+
| `file_read` | Context-aware read — auto-injects conventions and facts |
|
|
357
|
+
| `file_outline` | File structure (entities, exports) without reading the body |
|
|
337
358
|
|
|
338
|
-
###
|
|
359
|
+
### Persistent Memory (2)
|
|
339
360
|
|
|
340
361
|
| Tool | What the agent gets |
|
|
341
362
|
|------|-----|
|
|
342
|
-
| `
|
|
343
|
-
| `
|
|
344
|
-
| `unerr_get_timeline` | View modification timeline across sessions |
|
|
363
|
+
| `record_fact` | Persist a convention, decision, or anti-pattern |
|
|
364
|
+
| `recall_facts` | Retrieve facts with hierarchical scope + decay-adjusted confidence |
|
|
345
365
|
|
|
346
|
-
|
|
366
|
+
### Session Narrative — Markers (4)
|
|
367
|
+
|
|
368
|
+
Inline markers the agent emits as it works. Persisted to the shadow ledger and `.unerr/timeline.db` — powers turn titles, cross-session intent stitching, the resume strip, and loop/blocker miners.
|
|
369
|
+
|
|
370
|
+
| Tool | What it does |
|
|
371
|
+
|------|-----|
|
|
372
|
+
| `mark_intent` | One-sentence task start (≤80 chars). Becomes the turn title |
|
|
373
|
+
| `mark_decision` | Records a chosen approach + up to 5 alternatives (≤140 chars) |
|
|
374
|
+
| `mark_blocker` | Flags an unresolved obstacle. Carries into the next session's resume strip |
|
|
375
|
+
| `mark_resolution` | Resolves a prior blocker by `marker_id` |
|
|
376
|
+
|
|
377
|
+
Every response includes `_meta` (latency, risk level, drift status) and inline `ur|<tag>` signals for high-priority guidance (drift, blast-radius warnings, circuit-breaker halts).
|
|
347
378
|
|
|
348
379
|
---
|
|
349
380
|
|
|
350
381
|
<details>
|
|
351
|
-
<summary><strong>
|
|
382
|
+
<summary><strong>CLI commands</strong></summary>
|
|
352
383
|
|
|
353
384
|
```bash
|
|
354
|
-
unerr # Start
|
|
355
|
-
unerr
|
|
356
|
-
unerr
|
|
357
|
-
unerr
|
|
358
|
-
unerr
|
|
359
|
-
unerr
|
|
360
|
-
unerr timeline # What happened across sessions
|
|
361
|
-
unerr rewind # Restore to a previous working state
|
|
362
|
-
unerr learn # Teach unerr a convention or correction
|
|
363
|
-
unerr debug # Diagnostic dump
|
|
385
|
+
unerr # Start per-repo daemon (or resume; auto-spawned by IDE if missing)
|
|
386
|
+
unerr --mcp # Stdio bridge — what your IDE invokes via .mcp.json
|
|
387
|
+
unerr install <agent> # Install MCP config + skills + instructions for one agent
|
|
388
|
+
unerr uninstall # Remove unerr integration from agents in this repo
|
|
389
|
+
unerr status # Show proxy health, entity count, graph age
|
|
390
|
+
unerr stats # Session statistics (tokens, tool calls, compression)
|
|
364
391
|
```
|
|
365
392
|
|
|
393
|
+
**Daemon supervisor** (multi-repo management):
|
|
394
|
+
|
|
395
|
+
```bash
|
|
396
|
+
unerr daemon start # Start the unerrd supervisor
|
|
397
|
+
unerr daemon stop # Gracefully stop unerrd + all managed repos
|
|
398
|
+
unerr daemon status # Show all managed repos, PIDs, memory, idle time
|
|
399
|
+
unerr daemon add <path> # Register a repo (indexes on next access)
|
|
400
|
+
unerr daemon remove <path> # Unregister a repo
|
|
401
|
+
unerr daemon config <path> <k=v> # Set per-repo settings (idleTimeout, javaBuildTool, etc.)
|
|
402
|
+
unerr daemon autostart on|off|status # Manage start-at-login (launchd/systemd/schtasks)
|
|
403
|
+
unerr daemon logs [--repo <path>] [--follow] # Tail daemon/repo logs
|
|
404
|
+
unerr daemon dashboard # Open the unified dashboard in browser
|
|
405
|
+
unerr daemon update # Check for updates, install, restart
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
See the [full command reference](#daemon-command-reference) below.
|
|
409
|
+
|
|
366
410
|
</details>
|
|
367
411
|
|
|
368
412
|
<details>
|
|
@@ -370,30 +414,29 @@ unerr debug # Diagnostic dump
|
|
|
370
414
|
|
|
371
415
|
```
|
|
372
416
|
src/
|
|
373
|
-
entrypoints/
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
tracking/
|
|
377
|
-
behaviors/
|
|
378
|
-
commands/
|
|
379
|
-
tools/
|
|
380
|
-
hooks/
|
|
381
|
-
skills/
|
|
382
|
-
server/
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
schemas/ Zod schemas for entity/edge/rule types
|
|
386
|
-
utils/ Logging, detection, git helpers
|
|
417
|
+
entrypoints/ CLI entry + boot state machine
|
|
418
|
+
proxy/ MCP server (daemon), stdio↔UDS bridge, session stats, shell compression
|
|
419
|
+
intelligence/ CozoDB graph, AST extraction, conventions, rules, search, semantic
|
|
420
|
+
tracking/ Prompt ledger, drift detection, git attribution
|
|
421
|
+
behaviors/ Cascade guard, loop breaker, auto-doc, change narrative…
|
|
422
|
+
commands/ CLI commands (install, status, stats, timeline, learn, debug, …)
|
|
423
|
+
tools/ MCP tool implementations (intelligence + coding)
|
|
424
|
+
hooks/ Claude Code hook system integration
|
|
425
|
+
skills/ 11 bundled skill definitions
|
|
426
|
+
server/ + ui/ HTTP API + React (Vite) dashboard
|
|
427
|
+
config/ Agent registry (16 agents), MCP config writer, instruction injector
|
|
428
|
+
schemas/ Zod schemas
|
|
387
429
|
```
|
|
388
430
|
|
|
389
|
-
**Design principles
|
|
390
|
-
- Zero network calls — fully local, no API keys
|
|
391
|
-
- stdout is sacred — MCP JSON-RPC only, everything else to stderr
|
|
392
|
-
- <5ms query responses — CozoDB runs in-process (Rust via NAPI)
|
|
393
|
-
- 30s time-to-value — shallow index first, deep enrichment in background
|
|
394
|
-
- Enhancement, not dependency — agent falls back gracefully if unerr is unavailable
|
|
431
|
+
**Design principles**
|
|
395
432
|
|
|
396
|
-
|
|
433
|
+
- Zero network calls — fully local, no API keys.
|
|
434
|
+
- stdout is sacred — MCP JSON-RPC only; everything else to stderr.
|
|
435
|
+
- <5 ms query responses — CozoDB runs in-process (Rust via NAPI).
|
|
436
|
+
- First useful output <5 s — shallow index first, deep enrichment in background.
|
|
437
|
+
- Graceful degradation — the agent still works if unerr is down, you just lose the intelligence layer.
|
|
438
|
+
|
|
439
|
+
**Tech stack** TypeScript (ESM) · CozoDB (Rust/NAPI) · web-tree-sitter (WASM) · MCP SDK · Ink (React CLI) · React + Vite (dashboard) · tsup · Vitest
|
|
397
440
|
|
|
398
441
|
</details>
|
|
399
442
|
|
|
@@ -407,10 +450,8 @@ pnpm run dev # tsx watch
|
|
|
407
450
|
pnpm run test:run # full suite
|
|
408
451
|
pnpm run lint # biome check
|
|
409
452
|
pnpm run typecheck # tsc --noEmit
|
|
410
|
-
```
|
|
411
453
|
|
|
412
|
-
|
|
413
|
-
pnpm link --global # make `unerr` available globally
|
|
454
|
+
pnpm link --global # make local `unerr` available globally
|
|
414
455
|
```
|
|
415
456
|
|
|
416
457
|
</details>
|
|
@@ -418,20 +459,126 @@ pnpm link --global # make `unerr` available globally
|
|
|
418
459
|
<details>
|
|
419
460
|
<summary><strong>Contributing</strong></summary>
|
|
420
461
|
|
|
421
|
-
Contributions welcome
|
|
462
|
+
Contributions welcome — please open an issue first.
|
|
422
463
|
|
|
423
464
|
**Before submitting a PR:**
|
|
424
|
-
-
|
|
425
|
-
- All output
|
|
465
|
+
- `pnpm run typecheck && pnpm run lint && pnpm run test:run`
|
|
466
|
+
- All output to stderr — never stdout (MCP JSON-RPC channel)
|
|
426
467
|
- All CozoDB interactions are async — always `await`
|
|
427
468
|
- Use `.js` extensions in imports (NodeNext resolution)
|
|
428
469
|
|
|
429
|
-
See [CLAUDE.md](./CLAUDE.md) for
|
|
470
|
+
See [CLAUDE.md](./CLAUDE.md) for full conventions.
|
|
430
471
|
|
|
431
472
|
</details>
|
|
432
473
|
|
|
433
474
|
---
|
|
434
475
|
|
|
476
|
+
## Daemon Command Reference
|
|
477
|
+
|
|
478
|
+
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.
|
|
479
|
+
|
|
480
|
+
### Lifecycle
|
|
481
|
+
|
|
482
|
+
```bash
|
|
483
|
+
unerr daemon start # Start supervisor (PID-locked, one instance per machine)
|
|
484
|
+
unerr daemon stop # Graceful shutdown — stops all child processes, flushes state
|
|
485
|
+
unerr daemon status # Overview: all repos, their state (running/stopped/idle), PIDs,
|
|
486
|
+
# memory usage, connection count, idle time, update notices
|
|
487
|
+
```
|
|
488
|
+
|
|
489
|
+
### Repository Management
|
|
490
|
+
|
|
491
|
+
```bash
|
|
492
|
+
unerr daemon add <path> # Register a repo with the supervisor
|
|
493
|
+
# - Auto-derives a unique label from the directory name
|
|
494
|
+
# - Mirrors settings to <repo>/.unerr/config.json
|
|
495
|
+
# - Detects parent/child directory conflicts
|
|
496
|
+
# - Installs platform auto-start on first add
|
|
497
|
+
|
|
498
|
+
unerr daemon remove <path> # Unregister — stops the child process if running, removes entry
|
|
499
|
+
|
|
500
|
+
unerr daemon config <path> <key>=<value> # Set per-repo settings:
|
|
501
|
+
# idleTimeout=600 seconds before idle sweep stops the repo
|
|
502
|
+
# javaBuildTool=gradle skip detection heuristic
|
|
503
|
+
# autostart=false exclude from warm-start at boot
|
|
504
|
+
```
|
|
505
|
+
|
|
506
|
+
### Auto-Start (Start at Login)
|
|
507
|
+
|
|
508
|
+
```bash
|
|
509
|
+
unerr daemon autostart on # Install platform service:
|
|
510
|
+
# macOS: ~/Library/LaunchAgents/dev.unerr.daemon.plist
|
|
511
|
+
# Linux: ~/.config/systemd/user/unerr-daemon.service
|
|
512
|
+
# Windows: schtasks /create ... (or Startup folder .cmd)
|
|
513
|
+
|
|
514
|
+
unerr daemon autostart off # Remove the platform service
|
|
515
|
+
unerr daemon autostart status # Show whether auto-start is installed and running
|
|
516
|
+
```
|
|
517
|
+
|
|
518
|
+
Auto-start is also installed automatically on your first `unerr install` or `daemon add` — no manual step needed. Skipped in CI/container environments.
|
|
519
|
+
|
|
520
|
+
### Warm Start
|
|
521
|
+
|
|
522
|
+
After boot, the supervisor pre-spawns your Most Recently Used repos at low priority:
|
|
523
|
+
|
|
524
|
+
```bash
|
|
525
|
+
unerr daemon set --warm-start-budget 3 # Max repos to warm-start (default: 3)
|
|
526
|
+
unerr daemon set --warm-start-idle-days 7 # Skip repos inactive for >N days
|
|
527
|
+
unerr daemon set --warm-start-delay-ms 5000 # Delay before warm-start begins
|
|
528
|
+
```
|
|
529
|
+
|
|
530
|
+
Warm-start aborts if the system is on battery or under high load.
|
|
531
|
+
|
|
532
|
+
### Logs
|
|
533
|
+
|
|
534
|
+
```bash
|
|
535
|
+
unerr daemon logs # Tail the supervisor log (~/.unerr/logs/unerrd.log)
|
|
536
|
+
unerr daemon logs --repo <path> # Tail a specific repo's log
|
|
537
|
+
unerr daemon logs --bridge # Tail bridge session logs
|
|
538
|
+
unerr daemon logs --follow # Stream continuously (like tail -f)
|
|
539
|
+
unerr daemon logs -n 50 # Last N lines
|
|
540
|
+
unerr daemon logs --boot # Show only the most recent boot sequence
|
|
541
|
+
```
|
|
542
|
+
|
|
543
|
+
### Dashboard
|
|
544
|
+
|
|
545
|
+
```bash
|
|
546
|
+
unerr daemon dashboard # Opens http://localhost:9847 in your default browser
|
|
547
|
+
```
|
|
548
|
+
|
|
549
|
+
The unified dashboard shows:
|
|
550
|
+
- **Global overview** — all registered repos, their health, active sessions
|
|
551
|
+
- **Repo switcher** — click into any repo for its full intelligence dashboard
|
|
552
|
+
- **Supervisor info** — uptime, memory, warm-start events, version status
|
|
553
|
+
|
|
554
|
+
### Updates
|
|
555
|
+
|
|
556
|
+
```bash
|
|
557
|
+
unerr daemon update # Check npm registry → confirm → stop → install → restart → verify
|
|
558
|
+
unerr daemon dismiss-update <version> # Suppress notification for a specific version
|
|
559
|
+
```
|
|
560
|
+
|
|
561
|
+
Update notifications appear as:
|
|
562
|
+
- A CLI banner on `unerr daemon status` and `unerr` startup
|
|
563
|
+
- A dashboard banner with version diff and changelog link
|
|
564
|
+
- An `_meta["dev.unerr/update_available"]` field in MCP responses (when >2 minor versions behind)
|
|
565
|
+
|
|
566
|
+
Updates are never auto-applied — the agent and supervisor remain stable mid-session.
|
|
567
|
+
|
|
568
|
+
### How auto-spawn works
|
|
569
|
+
|
|
570
|
+
When your IDE opens and spawns `unerr --mcp`:
|
|
571
|
+
|
|
572
|
+
1. Bridge checks for a per-repo UDS socket (`.unerr/state/proxy.sock`)
|
|
573
|
+
2. If not found, queries the supervisor's UDS socket (`~/.unerr/state/unerrd.sock`)
|
|
574
|
+
3. If supervisor isn't running, auto-spawns it as a detached background process
|
|
575
|
+
4. Supervisor ensures the repo is registered and its child process is running
|
|
576
|
+
5. Bridge connects — MCP requests flow through
|
|
577
|
+
|
|
578
|
+
Total cold-start latency (supervisor not running → first MCP response): **<2 seconds**.
|
|
579
|
+
|
|
580
|
+
---
|
|
581
|
+
|
|
435
582
|
## License
|
|
436
583
|
|
|
437
584
|
[Elastic License 2.0 (ELv2)](./LICENSE) — free to use, modify, and distribute. Cannot be offered as a hosted service.
|
|
@@ -441,5 +588,5 @@ See [CLAUDE.md](./CLAUDE.md) for detailed conventions.
|
|
|
441
588
|
<p align="center">
|
|
442
589
|
<code>npm install -g @unerr-ai/unerr</code>
|
|
443
590
|
<br /><br />
|
|
444
|
-
<a href="https://www.npmjs.com/package/@unerr-ai/unerr"><sub>npm registry</sub></a> · <sub>
|
|
591
|
+
<a href="https://www.unerr.dev/"><sub>unerr.dev</sub></a> · <a href="https://www.npmjs.com/package/@unerr-ai/unerr"><sub>npm registry</sub></a> · <a href="https://discord.gg/2BjRftz8kG"><sub>Discord</sub></a> · <a href="https://x.com/unerr_ai"><sub>X</sub></a> · <a href="https://www.linkedin.com/company/unerr"><sub>LinkedIn</sub></a> · <sub>Fully local. No account. No cloud. Free.</sub>
|
|
445
592
|
</p>
|