@unerr-ai/unerr 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (553) hide show
  1. package/dist/__tests__/architecture-guard.test.js +122 -0
  2. package/dist/__tests__/arg-validator.test.js +205 -0
  3. package/dist/__tests__/ast-extractor.test.js +203 -0
  4. package/dist/__tests__/auto-bootstrap.test.js +280 -0
  5. package/dist/__tests__/background-indexer.test.js +228 -0
  6. package/dist/__tests__/blast-radius-engine.test.js +200 -0
  7. package/dist/__tests__/bridge-isolation.test.js +37 -0
  8. package/dist/__tests__/budget-enforcer.test.js +53 -0
  9. package/dist/__tests__/cfg-test-detection-perf.test.js +82 -0
  10. package/dist/__tests__/change-narrative.test.js +190 -0
  11. package/dist/__tests__/check-commit.test.js +258 -0
  12. package/dist/__tests__/checksum.test.js +34 -0
  13. package/dist/__tests__/commit-watcher.test.js +154 -0
  14. package/dist/__tests__/community-detection.test.js +179 -0
  15. package/dist/__tests__/community-tools.test.js +299 -0
  16. package/dist/__tests__/components.test.js +449 -0
  17. package/dist/__tests__/compression-log.test.js +174 -0
  18. package/dist/__tests__/compression-quality-monitor.test.js +40 -0
  19. package/dist/__tests__/config-healer.test.js +165 -0
  20. package/dist/__tests__/context-ledger.test.js +58 -0
  21. package/dist/__tests__/convention-detector.test.js +99 -0
  22. package/dist/__tests__/convention-learner.test.js +86 -0
  23. package/dist/__tests__/correction-detector.test.js +330 -0
  24. package/dist/__tests__/daemon-autostart-install.test.js +283 -0
  25. package/dist/__tests__/daemon-bridge.test.js +222 -0
  26. package/dist/__tests__/daemon-dashboard.test.js +202 -0
  27. package/dist/__tests__/daemon-registry.test.js +240 -0
  28. package/dist/__tests__/daemon-supervisor.test.js +318 -0
  29. package/dist/__tests__/daemon-version-check.test.js +275 -0
  30. package/dist/__tests__/decision-point-detector.test.js +98 -0
  31. package/dist/__tests__/deep-link.test.js +143 -0
  32. package/dist/__tests__/disallowed-tools.test.js +115 -0
  33. package/dist/__tests__/drift-tracker.test.js +582 -0
  34. package/dist/__tests__/durability-scorer.test.js +152 -0
  35. package/dist/__tests__/efficiency-tracker.test.js +65 -0
  36. package/dist/__tests__/enrich.test.js +144 -0
  37. package/dist/__tests__/entity-rewind.test.js +248 -0
  38. package/dist/__tests__/ephemeral.test.js +111 -0
  39. package/dist/__tests__/exploration-cost.test.js +93 -0
  40. package/dist/__tests__/fact-generator.test.js +197 -0
  41. package/dist/__tests__/file-l0-graph.test.js +244 -0
  42. package/dist/__tests__/file-logger.test.js +82 -0
  43. package/dist/__tests__/file-outline.test.js +141 -0
  44. package/dist/__tests__/file-read-protocol.test.js +188 -0
  45. package/dist/__tests__/format-encoder.test.js +233 -0
  46. package/dist/__tests__/git-attribution.test.js +259 -0
  47. package/dist/__tests__/graph-temporal-joiner.test.js +219 -0
  48. package/dist/__tests__/health-grade-enhanced.test.js +138 -0
  49. package/dist/__tests__/health-map-data.test.js +173 -0
  50. package/dist/__tests__/helpers/mcp-harness.js +45 -0
  51. package/dist/__tests__/helpers/mcp-harness.test.js +68 -0
  52. package/dist/__tests__/hook-dedup.test.js +112 -0
  53. package/dist/__tests__/hook-runner.test.js +253 -0
  54. package/dist/__tests__/indexer-cfg.test.js +185 -0
  55. package/dist/__tests__/indexer-cross-file.test.js +172 -0
  56. package/dist/__tests__/indexer-extraction.test.js +245 -0
  57. package/dist/__tests__/indexer-incremental.test.js +232 -0
  58. package/dist/__tests__/indexer-language-expansion.test.js +165 -0
  59. package/dist/__tests__/init-push.test.js +131 -0
  60. package/dist/__tests__/instruction-writer.test.js +179 -0
  61. package/dist/__tests__/intelligence-integration.test.js +217 -0
  62. package/dist/__tests__/intent-correlator.test.js +175 -0
  63. package/dist/__tests__/intent-detector.test.js +235 -0
  64. package/dist/__tests__/intent-encoder.test.js +167 -0
  65. package/dist/__tests__/java-build-tool-detection.test.js +174 -0
  66. package/dist/__tests__/layer3-sprint-q.test.js +160 -0
  67. package/dist/__tests__/layer3-sprint-r.test.js +91 -0
  68. package/dist/__tests__/layer3-sprint-s.test.js +183 -0
  69. package/dist/__tests__/layer3-sprint-t.test.js +201 -0
  70. package/dist/__tests__/layer3-sprint-u.test.js +174 -0
  71. package/dist/__tests__/layer4-sprint-ba2.test.js +354 -0
  72. package/dist/__tests__/layer4-sprint-ba4.test.js +84 -0
  73. package/dist/__tests__/layer4-sprint-vs.test.js +105 -0
  74. package/dist/__tests__/ledger-chains.test.js +162 -0
  75. package/dist/__tests__/lifecycle-machine.test.js +226 -0
  76. package/dist/__tests__/local-chat-provider.test.js +170 -0
  77. package/dist/__tests__/local-convention-detector.test.js +308 -0
  78. package/dist/__tests__/local-embeddings.test.js +422 -0
  79. package/dist/__tests__/local-graph.test.js +540 -0
  80. package/dist/__tests__/local-indexer.test.js +228 -0
  81. package/dist/__tests__/local-intelligence-l3.test.js +332 -0
  82. package/dist/__tests__/local-llm.test.js +253 -0
  83. package/dist/__tests__/local-mode-offline.test.js +187 -0
  84. package/dist/__tests__/local-mode-stats.test.js +273 -0
  85. package/dist/__tests__/local-mode-tui.test.js +343 -0
  86. package/dist/__tests__/local-parse.test.js +199 -0
  87. package/dist/__tests__/log-tailer.test.js +208 -0
  88. package/dist/__tests__/loop-breaker.test.js +276 -0
  89. package/dist/__tests__/loop-miner.test.js +226 -0
  90. package/dist/__tests__/mcp-config.test.js +126 -0
  91. package/dist/__tests__/mcp-content-json.test.js +10 -0
  92. package/dist/__tests__/mcp-envelope.test.js +124 -0
  93. package/dist/__tests__/metrics-store.test.js +223 -0
  94. package/dist/__tests__/native-watcher.test.js +191 -0
  95. package/dist/__tests__/navigation-hooks-agent-aware.test.js +145 -0
  96. package/dist/__tests__/negative-knowledge.test.js +116 -0
  97. package/dist/__tests__/network-boundary.test.js +190 -0
  98. package/dist/__tests__/network-firewall.test.js +112 -0
  99. package/dist/__tests__/nudge-invariants.test.js +160 -0
  100. package/dist/__tests__/nudge-v2.test.js +225 -0
  101. package/dist/__tests__/offline-rewind.test.js +251 -0
  102. package/dist/__tests__/open-threads.test.js +89 -0
  103. package/dist/__tests__/output-compressor.test.js +93 -0
  104. package/dist/__tests__/pending-violations.test.js +112 -0
  105. package/dist/__tests__/persistence-effectiveness.test.js +143 -0
  106. package/dist/__tests__/provider-factory.test.js +42 -0
  107. package/dist/__tests__/providers.test.js +24 -0
  108. package/dist/__tests__/proxy.test.js +314 -0
  109. package/dist/__tests__/query-router.test.js +1018 -0
  110. package/dist/__tests__/reasoning-quality-route.test.js +138 -0
  111. package/dist/__tests__/redactor.test.js +120 -0
  112. package/dist/__tests__/resource-monitor.test.js +57 -0
  113. package/dist/__tests__/response-envelope.test.js +100 -0
  114. package/dist/__tests__/risk-classifier.test.js +101 -0
  115. package/dist/__tests__/risk-signal-scope.test.js +75 -0
  116. package/dist/__tests__/rule-evaluator.test.js +280 -0
  117. package/dist/__tests__/scip-decoder.test.js +49 -0
  118. package/dist/__tests__/scip-downloader.test.js +201 -0
  119. package/dist/__tests__/scip-merger.test.js +103 -0
  120. package/dist/__tests__/search-index.test.js +422 -0
  121. package/dist/__tests__/semantic-enrichment.test.js +360 -0
  122. package/dist/__tests__/session-brief-builder.test.js +187 -0
  123. package/dist/__tests__/session-context.test.js +221 -0
  124. package/dist/__tests__/session-continuity.test.js +144 -0
  125. package/dist/__tests__/session-dedup.test.js +74 -0
  126. package/dist/__tests__/session-event-wiring.test.js +206 -0
  127. package/dist/__tests__/session-events.test.js +149 -0
  128. package/dist/__tests__/session-legend.test.js +20 -0
  129. package/dist/__tests__/session-persistence.test.js +131 -0
  130. package/dist/__tests__/session-resume-block.test.js +107 -0
  131. package/dist/__tests__/session-resume.test.js +97 -0
  132. package/dist/__tests__/session-summary-writer.test.js +134 -0
  133. package/dist/__tests__/shadow-ledger.test.js +203 -0
  134. package/dist/__tests__/shell-classifier.test.js +151 -0
  135. package/dist/__tests__/shell-compression-floor.test.js +189 -0
  136. package/dist/__tests__/shell-compression-v2.test.js +339 -0
  137. package/dist/__tests__/shell-compressor.test.js +35 -0
  138. package/dist/__tests__/shell-hooks.test.js +128 -0
  139. package/dist/__tests__/shell-strategies.test.js +644 -0
  140. package/dist/__tests__/shell-tee.test.js +133 -0
  141. package/dist/__tests__/signal-dedup.test.js +158 -0
  142. package/dist/__tests__/signal-reinforcer.test.js +77 -0
  143. package/dist/__tests__/signal-scorer.test.js +251 -0
  144. package/dist/__tests__/signal-show-store.test.js +108 -0
  145. package/dist/__tests__/smart-truncate.test.js +215 -0
  146. package/dist/__tests__/snapshot-v2.test.js +113 -0
  147. package/dist/__tests__/sprint-l1-local-mode.test.js +130 -0
  148. package/dist/__tests__/sprint-l10-boot.test.js +220 -0
  149. package/dist/__tests__/sprint-l9-offline-commands.test.js +189 -0
  150. package/dist/__tests__/sprint-q-persistent-context.test.js +198 -0
  151. package/dist/__tests__/sprint-s1-wiring.test.js +215 -0
  152. package/dist/__tests__/sprint-s2-wiring.test.js +256 -0
  153. package/dist/__tests__/sprint-s3-wiring.test.js +195 -0
  154. package/dist/__tests__/sprint-s4-wiring.test.js +213 -0
  155. package/dist/__tests__/sprint-s6-hooks.test.js +222 -0
  156. package/dist/__tests__/sprint-s7-persistent.test.js +263 -0
  157. package/dist/__tests__/sprint-s8-value.test.js +167 -0
  158. package/dist/__tests__/sprint-s9-behavioral.test.js +179 -0
  159. package/dist/__tests__/sprint3-intelligence.test.js +297 -0
  160. package/dist/__tests__/sprint5-mcp-server.test.js +136 -0
  161. package/dist/__tests__/startup-display.test.js +302 -0
  162. package/dist/__tests__/startup-log-file.test.js +97 -0
  163. package/dist/__tests__/stash-manager.test.js +229 -0
  164. package/dist/__tests__/state-detector.test.js +92 -0
  165. package/dist/__tests__/status-dashboard.test.js +142 -0
  166. package/dist/__tests__/temporal-facts.test.js +292 -0
  167. package/dist/__tests__/temporal-routes.test.js +142 -0
  168. package/dist/__tests__/test-detector.test.js +174 -0
  169. package/dist/__tests__/theme.test.js +72 -0
  170. package/dist/__tests__/timeline-agents.test.js +122 -0
  171. package/dist/__tests__/timeline-bootstrap.test.js +176 -0
  172. package/dist/__tests__/timeline-filters.test.js +193 -0
  173. package/dist/__tests__/timeline-markers.test.js +151 -0
  174. package/dist/__tests__/timeline-routes.test.js +156 -0
  175. package/dist/__tests__/timeline-store.test.js +171 -0
  176. package/dist/__tests__/token-counter.test.js +86 -0
  177. package/dist/__tests__/token-estimator.test.js +96 -0
  178. package/dist/__tests__/token-flow-api.test.js +239 -0
  179. package/dist/__tests__/token-flow-instrumentation.test.js +437 -0
  180. package/dist/__tests__/token-flow-persistence.test.js +356 -0
  181. package/dist/__tests__/token-flow-routes.test.js +199 -0
  182. package/dist/__tests__/token-flow.test.js +695 -0
  183. package/dist/__tests__/tool-clusters.test.js +177 -0
  184. package/dist/__tests__/transport-mux.test.js +283 -0
  185. package/dist/__tests__/turn-segmenter.test.js +166 -0
  186. package/dist/__tests__/uninstall.test.js +141 -0
  187. package/dist/__tests__/warm-start-policy.test.js +271 -0
  188. package/dist/__tests__/wire-cap-nudge.test.js +77 -0
  189. package/dist/__tests__/worker-pool.test.js +101 -0
  190. package/dist/behaviors/agent-llm-bridge.js +166 -0
  191. package/dist/behaviors/architecture-guard.js +256 -0
  192. package/dist/behaviors/auto-doc.js +247 -0
  193. package/dist/behaviors/cascade-guard.js +289 -0
  194. package/dist/behaviors/change-narrative.js +270 -0
  195. package/dist/behaviors/convention-drift.js +290 -0
  196. package/dist/behaviors/framework.js +235 -0
  197. package/dist/behaviors/guard-formatter.js +44 -0
  198. package/dist/behaviors/incomplete-work.js +270 -0
  199. package/dist/behaviors/loop-breaker.js +300 -0
  200. package/dist/behaviors/session-continuity.js +208 -0
  201. package/dist/cli.js +992 -706
  202. package/dist/commands/branches.js +97 -0
  203. package/dist/commands/check-commit.js +225 -0
  204. package/dist/commands/compress-output.js +64 -0
  205. package/dist/commands/config-verify.js +243 -0
  206. package/dist/commands/daemon.js +905 -0
  207. package/dist/commands/dashboard.js +52 -0
  208. package/dist/commands/debug.js +200 -0
  209. package/dist/commands/enrich.js +184 -0
  210. package/dist/commands/exec.js +233 -0
  211. package/dist/commands/gain.js +156 -0
  212. package/dist/commands/hook.js +88 -0
  213. package/dist/commands/index.js +88 -0
  214. package/dist/commands/init.js +74 -0
  215. package/dist/commands/install.js +505 -0
  216. package/dist/commands/learn.js +116 -0
  217. package/dist/commands/manifest.js +193 -0
  218. package/dist/commands/rewind.js +103 -0
  219. package/dist/commands/serve.js +19 -0
  220. package/dist/commands/setup-wizard.js +414 -0
  221. package/dist/commands/skills.js +64 -0
  222. package/dist/commands/stats.js +20 -0
  223. package/dist/commands/status.js +654 -0
  224. package/dist/commands/timeline.js +139 -0
  225. package/dist/commands/uninstall.js +230 -0
  226. package/dist/components/App.js +109 -0
  227. package/dist/components/Banner.js +12 -0
  228. package/dist/components/ConfirmPrompt.js +25 -0
  229. package/dist/components/DriftSummary.js +23 -0
  230. package/dist/components/GradeBadge.js +15 -0
  231. package/dist/components/HealthCard.js +18 -0
  232. package/dist/components/InkSpinner.js +22 -0
  233. package/dist/components/InputBox.js +17 -0
  234. package/dist/components/KeyValue.js +13 -0
  235. package/dist/components/MessageList.js +14 -0
  236. package/dist/components/ProgressBar.js +26 -0
  237. package/dist/components/Section.js +16 -0
  238. package/dist/components/SessionSummaryCard.js +73 -0
  239. package/dist/components/StartupDisplay.js +24 -0
  240. package/dist/components/StatusDashboard.js +57 -0
  241. package/dist/components/StatusLine.js +8 -0
  242. package/dist/components/StepLine.js +22 -0
  243. package/dist/components/Theme.js +20 -0
  244. package/dist/components/ToolProgress.js +8 -0
  245. package/dist/components/ViolationList.js +21 -0
  246. package/dist/components/render.js +13 -0
  247. package/dist/config/agent-registry.js +237 -0
  248. package/dist/config/claude-settings-hooks.js +304 -0
  249. package/dist/config/hook-installer.js +65 -0
  250. package/dist/config/instruction-writer.js +388 -0
  251. package/dist/config/mcp-config-writer.js +266 -0
  252. package/dist/config/settings.js +174 -0
  253. package/dist/config/tool-detector.js +42 -0
  254. package/dist/config/value-surfacing.js +119 -0
  255. package/dist/core/context-assembly.js +108 -0
  256. package/dist/core/conversation.js +33 -0
  257. package/dist/core/local-chat-provider.js +475 -0
  258. package/dist/core/provider-factory.js +55 -0
  259. package/dist/core/providers.js +90 -0
  260. package/dist/core/query-engine.js +174 -0
  261. package/dist/daemon/api.js +312 -0
  262. package/dist/daemon/autostart.js +119 -0
  263. package/dist/daemon/bootstrap.js +39 -0
  264. package/dist/daemon/client.js +164 -0
  265. package/dist/daemon/detect-ci.js +81 -0
  266. package/dist/daemon/platform-linux.js +146 -0
  267. package/dist/daemon/platform-macos.js +134 -0
  268. package/dist/daemon/platform-windows.js +116 -0
  269. package/dist/daemon/process-manager.js +299 -0
  270. package/dist/daemon/protocol.js +23 -0
  271. package/dist/daemon/registry.js +270 -0
  272. package/dist/daemon/settings-schema.js +72 -0
  273. package/dist/daemon/system-health.js +134 -0
  274. package/dist/daemon/version-checker.js +262 -0
  275. package/dist/daemon/warm-start.js +223 -0
  276. package/dist/entrypoints/cli.js +1043 -0
  277. package/dist/entrypoints/daemon.js +380 -0
  278. package/dist/entrypoints/repl.js +147 -0
  279. package/dist/hooks/adapters/claude-code.js +90 -0
  280. package/dist/hooks/adapters/cline.js +100 -0
  281. package/dist/hooks/adapters/cursor.js +98 -0
  282. package/dist/hooks/hook-dedup.js +79 -0
  283. package/dist/hooks/hook-runner.js +113 -0
  284. package/dist/hooks/navigation-hooks.js +175 -0
  285. package/dist/hooks/prompt-hooks.js +63 -0
  286. package/dist/hooks/shell-hooks.js +47 -0
  287. package/dist/ignore.js +111 -0
  288. package/dist/intelligence/approach-suggester.js +61 -0
  289. package/dist/intelligence/ast-extractor.js +2615 -0
  290. package/dist/intelligence/ast-worker.js +34 -0
  291. package/dist/intelligence/background-indexer.js +121 -0
  292. package/dist/intelligence/blast-radius.js +200 -0
  293. package/dist/intelligence/community-detection.js +691 -0
  294. package/dist/intelligence/community-detector.js +184 -0
  295. package/dist/intelligence/computation-scheduler.js +75 -0
  296. package/dist/intelligence/confidence-propagation.js +47 -0
  297. package/dist/intelligence/convention-detector.js +242 -0
  298. package/dist/intelligence/convention-learner.js +205 -0
  299. package/dist/intelligence/convention-matcher.js +205 -0
  300. package/dist/intelligence/cozo-schema.js +376 -0
  301. package/dist/intelligence/decision-point-detector.js +90 -0
  302. package/dist/intelligence/deep-dive-tools.js +586 -0
  303. package/dist/intelligence/durability-scorer.js +84 -0
  304. package/dist/intelligence/exploration-cost.js +204 -0
  305. package/dist/intelligence/exploration-pattern-tracker.js +61 -0
  306. package/dist/intelligence/fact-generator.js +322 -0
  307. package/dist/intelligence/facts-schema.js +90 -0
  308. package/dist/intelligence/file-intelligence.js +59 -0
  309. package/dist/intelligence/graph-holder.js +220 -0
  310. package/dist/intelligence/graph-temporal-joiner.js +238 -0
  311. package/dist/intelligence/health-grade.js +423 -0
  312. package/dist/intelligence/health-grader.js +200 -0
  313. package/dist/intelligence/health-map-data.js +259 -0
  314. package/dist/intelligence/import-symbols.js +136 -0
  315. package/dist/intelligence/incremental-indexer.js +658 -0
  316. package/dist/intelligence/indexer/centrality.js +62 -0
  317. package/dist/intelligence/indexer/cfg-context.js +95 -0
  318. package/dist/intelligence/indexer/confidence.js +34 -0
  319. package/dist/intelligence/indexer/cross-file-resolver.js +104 -0
  320. package/dist/intelligence/indexer/edge-repair.js +89 -0
  321. package/dist/intelligence/indexer/entity-key.js +17 -0
  322. package/dist/intelligence/indexer/export-map.js +132 -0
  323. package/dist/intelligence/indexer/git-cochange.js +128 -0
  324. package/dist/intelligence/indexer/graph-patch.js +147 -0
  325. package/dist/intelligence/indexer/incremental.js +78 -0
  326. package/dist/intelligence/indexer/ingest.js +160 -0
  327. package/dist/intelligence/indexer/language-detect.js +226 -0
  328. package/dist/intelligence/indexer/metadata.js +63 -0
  329. package/dist/intelligence/indexer/mutation-tracker.js +79 -0
  330. package/dist/intelligence/indexer/orchestrator.js +155 -0
  331. package/dist/intelligence/indexer/plugin-interface.js +31 -0
  332. package/dist/intelligence/indexer/plugins/csharp.js +440 -0
  333. package/dist/intelligence/indexer/plugins/go.js +335 -0
  334. package/dist/intelligence/indexer/plugins/java.js +370 -0
  335. package/dist/intelligence/indexer/plugins/python.js +358 -0
  336. package/dist/intelligence/indexer/plugins/regex-fallback.js +82 -0
  337. package/dist/intelligence/indexer/plugins/ruby.js +290 -0
  338. package/dist/intelligence/indexer/plugins/rust.js +484 -0
  339. package/dist/intelligence/indexer/plugins/tier2-generic.js +310 -0
  340. package/dist/intelligence/indexer/plugins/typescript.js +456 -0
  341. package/dist/intelligence/indexer/resource-monitor.js +93 -0
  342. package/dist/intelligence/indexer/scip/decoder.js +253 -0
  343. package/dist/intelligence/indexer/scip/detector.js +232 -0
  344. package/dist/intelligence/indexer/scip/downloader.js +427 -0
  345. package/dist/intelligence/indexer/scip/fallback.js +34 -0
  346. package/dist/intelligence/indexer/scip/merger.js +109 -0
  347. package/dist/intelligence/indexer/scip/orchestrator.js +433 -0
  348. package/dist/intelligence/indexer/scip/runner.js +98 -0
  349. package/dist/intelligence/indexer/snapshot.js +66 -0
  350. package/dist/intelligence/indexer/test-detector.js +196 -0
  351. package/dist/intelligence/indexer/watch-integration.js +61 -0
  352. package/dist/intelligence/indexer/worker.js +85 -0
  353. package/dist/intelligence/local-convention-detector.js +437 -0
  354. package/dist/intelligence/local-embeddings.js +190 -0
  355. package/dist/intelligence/local-graph.js +1946 -0
  356. package/dist/intelligence/local-indexer.js +1575 -0
  357. package/dist/intelligence/local-llm.js +163 -0
  358. package/dist/intelligence/local-rule-generator.js +154 -0
  359. package/dist/intelligence/local-snapshot.js +213 -0
  360. package/dist/intelligence/negative-knowledge.js +103 -0
  361. package/dist/intelligence/persistent-db.js +85 -0
  362. package/dist/intelligence/query-router.js +2556 -0
  363. package/dist/intelligence/risk-classifier.js +116 -0
  364. package/dist/intelligence/rule-evaluator.js +380 -0
  365. package/dist/intelligence/rule-generator.js +49 -0
  366. package/dist/intelligence/search-index.js +173 -0
  367. package/dist/intelligence/semantic/docstring-extractor.js +67 -0
  368. package/dist/intelligence/semantic/embedding-store.js +52 -0
  369. package/dist/intelligence/semantic/enrichment-orchestrator.js +48 -0
  370. package/dist/intelligence/semantic/git-message-miner.js +114 -0
  371. package/dist/intelligence/semantic/identifier-tokenizer.js +51 -0
  372. package/dist/intelligence/semantic/node2vec-embeddings.js +71 -0
  373. package/dist/intelligence/semantic/node2vec-walks.js +103 -0
  374. package/dist/intelligence/semantic/path-domain-inference.js +112 -0
  375. package/dist/intelligence/semantic/similarity-engine.js +60 -0
  376. package/dist/intelligence/semantic/tfidf-vectors.js +88 -0
  377. package/dist/intelligence/session-brief-builder.js +159 -0
  378. package/dist/intelligence/session-context.js +221 -0
  379. package/dist/intelligence/session-health-monitor.js +211 -0
  380. package/dist/intelligence/session-narrative.js +197 -0
  381. package/dist/intelligence/session-pattern-analyzer.js +218 -0
  382. package/dist/intelligence/signal-scorer.js +390 -0
  383. package/dist/intelligence/signal-show-store.js +182 -0
  384. package/dist/intelligence/smart-truncate.js +158 -0
  385. package/dist/intelligence/subgraph-cache.js +88 -0
  386. package/dist/intelligence/temporal-facts.js +494 -0
  387. package/dist/intelligence/token-estimator.js +100 -0
  388. package/dist/intelligence/tool-injector.js +87 -0
  389. package/dist/intelligence/tree-sitter-loader.js +71 -0
  390. package/dist/intelligence/worker-pool.js +116 -0
  391. package/dist/proxy/arg-validator.js +79 -0
  392. package/dist/proxy/auto-bootstrap.js +167 -0
  393. package/dist/proxy/bridge.js +147 -0
  394. package/dist/proxy/budget-enforcer.js +70 -0
  395. package/dist/proxy/compression-quality-monitor.js +160 -0
  396. package/dist/proxy/compression-stats.js +51 -0
  397. package/dist/proxy/context-rot-detector.js +137 -0
  398. package/dist/proxy/drift-detector.js +139 -0
  399. package/dist/proxy/efficiency-tracker.js +79 -0
  400. package/dist/proxy/fact-ranking.js +154 -0
  401. package/dist/proxy/format-encoder.js +266 -0
  402. package/dist/proxy/http-transport.js +90 -0
  403. package/dist/proxy/lifecycle-actor.js +55 -0
  404. package/dist/proxy/lifecycle-machine.js +187 -0
  405. package/dist/proxy/log-tailer.js +265 -0
  406. package/dist/proxy/model-pricing.js +98 -0
  407. package/dist/proxy/network-firewall.js +141 -0
  408. package/dist/proxy/nudge-state.js +93 -0
  409. package/dist/proxy/output-compressor.js +185 -0
  410. package/dist/proxy/pid-lock.js +291 -0
  411. package/dist/proxy/proxy-context.js +11 -0
  412. package/dist/proxy/proxy.js +2633 -0
  413. package/dist/proxy/response-enrichment.js +32 -0
  414. package/dist/proxy/response-envelope.js +313 -0
  415. package/dist/proxy/session-dedup.js +82 -0
  416. package/dist/proxy/session-legend.js +30 -0
  417. package/dist/proxy/session-persistence.js +210 -0
  418. package/dist/proxy/session-resume.js +94 -0
  419. package/dist/proxy/session-stats.js +513 -0
  420. package/dist/proxy/shell-classifier.js +1346 -0
  421. package/dist/proxy/shell-compression-log.js +93 -0
  422. package/dist/proxy/shell-compressor.js +390 -0
  423. package/dist/proxy/shell-graph-boost.js +202 -0
  424. package/dist/proxy/shell-monitor-map.js +18 -0
  425. package/dist/proxy/shell-stats.js +54 -0
  426. package/dist/proxy/shell-strategies/cloud.js +215 -0
  427. package/dist/proxy/shell-strategies/diff.js +159 -0
  428. package/dist/proxy/shell-strategies/error-diagnostic.js +796 -0
  429. package/dist/proxy/shell-strategies/filter-dsl.js +358 -0
  430. package/dist/proxy/shell-strategies/git-status.js +177 -0
  431. package/dist/proxy/shell-strategies/key-value.js +193 -0
  432. package/dist/proxy/shell-strategies/log-text.js +154 -0
  433. package/dist/proxy/shell-strategies/omni.js +188 -0
  434. package/dist/proxy/shell-strategies/progress.js +55 -0
  435. package/dist/proxy/shell-strategies/redact.js +76 -0
  436. package/dist/proxy/shell-strategies/structured.js +241 -0
  437. package/dist/proxy/shell-strategies/tabular.js +243 -0
  438. package/dist/proxy/shell-strategies/test-results-types.js +13 -0
  439. package/dist/proxy/shell-strategies/test-results.js +784 -0
  440. package/dist/proxy/shell-strategies/tree-paths.js +144 -0
  441. package/dist/proxy/shell-strategies/yaml.js +182 -0
  442. package/dist/proxy/shell-tee.js +111 -0
  443. package/dist/proxy/signal-dedup.js +171 -0
  444. package/dist/proxy/startup-renderer.js +158 -0
  445. package/dist/proxy/task-token-display.js +38 -0
  446. package/dist/proxy/token-counter.js +61 -0
  447. package/dist/proxy/tool-clusters.js +273 -0
  448. package/dist/proxy/tool-definitions.js +525 -0
  449. package/dist/proxy/transport-mux.js +229 -0
  450. package/dist/proxy/wire-cap.js +268 -0
  451. package/dist/schemas/api/skills.js +19 -0
  452. package/dist/schemas/common/errors.js +7 -0
  453. package/dist/schemas/common/headers.js +5 -0
  454. package/dist/schemas/entities/edge.js +25 -0
  455. package/dist/schemas/entities/entity.js +22 -0
  456. package/dist/schemas/entities/rule.js +18 -0
  457. package/dist/schemas/index.js +14 -0
  458. package/dist/server/event-bus.js +59 -0
  459. package/dist/server/http.js +156 -0
  460. package/dist/server/middleware.js +70 -0
  461. package/dist/server/routes/drift.js +97 -0
  462. package/dist/server/routes/intelligence.js +1217 -0
  463. package/dist/server/routes/reasoning-quality.js +444 -0
  464. package/dist/server/routes/session.js +86 -0
  465. package/dist/server/routes/stream.js +120 -0
  466. package/dist/server/routes/system.js +73 -0
  467. package/dist/server/routes/temporal.js +170 -0
  468. package/dist/server/routes/timeline.js +232 -0
  469. package/dist/server/routes/token-flow.js +403 -0
  470. package/dist/skills/effectiveness-tracker.js +93 -0
  471. package/dist/skills/local-pack.js +380 -0
  472. package/dist/skills/resolver.js +495 -0
  473. package/dist/state-detector.js +83 -0
  474. package/dist/timeline/intent-detector.js +263 -0
  475. package/dist/timeline/loop-miner.js +140 -0
  476. package/dist/timeline/open-threads.js +49 -0
  477. package/dist/timeline/signal-reinforcer.js +62 -0
  478. package/dist/timeline/timeline-bootstrap.js +151 -0
  479. package/dist/timeline/timeline-store.js +618 -0
  480. package/dist/tools/coding/bash.js +49 -0
  481. package/dist/tools/coding/file-edit.js +72 -0
  482. package/dist/tools/coding/file-outline.js +227 -0
  483. package/dist/tools/coding/file-read-protocol.js +425 -0
  484. package/dist/tools/coding/file-read.js +35 -0
  485. package/dist/tools/coding/file-write.js +43 -0
  486. package/dist/tools/coding/glob-tool.js +109 -0
  487. package/dist/tools/coding/grep.js +162 -0
  488. package/dist/tools/coding/index.js +27 -0
  489. package/dist/tools/intelligence/index.js +269 -0
  490. package/dist/tools/intelligence/record-fact.js +48 -0
  491. package/dist/tools/intelligence/timeline-markers.js +130 -0
  492. package/dist/tools/registry.js +47 -0
  493. package/dist/tools/types.js +8 -0
  494. package/dist/tracking/auto-snapshot-triggers.js +246 -0
  495. package/dist/tracking/branch-context.js +115 -0
  496. package/dist/tracking/branch-snapshot.js +217 -0
  497. package/dist/tracking/causal-bridge.js +317 -0
  498. package/dist/tracking/circuit-breaker.js +147 -0
  499. package/dist/tracking/commit-watcher.js +114 -0
  500. package/dist/tracking/context-ledger.js +119 -0
  501. package/dist/tracking/correction-detector.js +324 -0
  502. package/dist/tracking/drift-tracker.js +874 -0
  503. package/dist/tracking/durability-tracker.js +94 -0
  504. package/dist/tracking/entity-rewind.js +200 -0
  505. package/dist/tracking/file-hash-state.js +114 -0
  506. package/dist/tracking/git-attribution.js +132 -0
  507. package/dist/tracking/git-trailers.js +171 -0
  508. package/dist/tracking/intelligence-counter.js +46 -0
  509. package/dist/tracking/intent-correlator.js +202 -0
  510. package/dist/tracking/intent-encoder.js +52 -0
  511. package/dist/tracking/intent-token-tracker.js +159 -0
  512. package/dist/tracking/ledger-archiver.js +94 -0
  513. package/dist/tracking/ledger-chains.js +245 -0
  514. package/dist/tracking/metrics-store.js +361 -0
  515. package/dist/tracking/native-watcher.js +131 -0
  516. package/dist/tracking/offline-rewind.js +295 -0
  517. package/dist/tracking/pending-violations.js +74 -0
  518. package/dist/tracking/persistence-effectiveness.js +167 -0
  519. package/dist/tracking/prompt-durability.js +202 -0
  520. package/dist/tracking/quality-signals.js +213 -0
  521. package/dist/tracking/redactor.js +73 -0
  522. package/dist/tracking/rewind-engine.js +161 -0
  523. package/dist/tracking/session-history.js +128 -0
  524. package/dist/tracking/session-receipt.js +88 -0
  525. package/dist/tracking/session-summary-writer.js +157 -0
  526. package/dist/tracking/shadow-ledger.js +321 -0
  527. package/dist/tracking/stash-manager.js +258 -0
  528. package/dist/tracking/timeline-fork.js +213 -0
  529. package/dist/tracking/timeline.js +69 -0
  530. package/dist/tracking/token-flow.js +276 -0
  531. package/dist/tracking/turn-segmenter.js +122 -0
  532. package/dist/tracking/weekly-accumulator.js +179 -0
  533. package/dist/tracking/working-snapshots.js +188 -0
  534. package/dist/tracking/workspace-manifest.js +176 -0
  535. package/dist/transport/http.js +102 -0
  536. package/dist/ui/assets/index-BsMTQdhX.js +10 -0
  537. package/dist/ui/index.html +1 -1
  538. package/dist/utils/counterfactual.js +65 -0
  539. package/dist/utils/deep-link.js +34 -0
  540. package/dist/utils/detect.js +193 -0
  541. package/dist/utils/exec.js +73 -0
  542. package/dist/utils/file-logger.js +87 -0
  543. package/dist/utils/format-error.js +29 -0
  544. package/dist/utils/git.js +181 -0
  545. package/dist/utils/log.js +57 -0
  546. package/dist/utils/logger.js +35 -0
  547. package/dist/utils/mcp-content-json.js +8 -0
  548. package/dist/utils/session-logger.js +154 -0
  549. package/dist/utils/startup-log.js +512 -0
  550. package/dist/utils/ui.js +56 -0
  551. package/package.json +5 -3
  552. package/scripts/postinstall.mjs +299 -0
  553. package/dist/ui/assets/index-B-0HTtUR.js +0 -10
@@ -0,0 +1,156 @@
1
+ /**
2
+ * R5 — `unerr gain` / `unerr discover`
3
+ *
4
+ * Two analytics CLI commands that read the token-flow ledger and surface:
5
+ * - `gain`: where compression IS working — top commands by tokens_saved
6
+ * - `discover`: where compression IS NOT working — commands with high raw
7
+ * bytes but <30% reduction. These are untapped opportunities.
8
+ *
9
+ * Both read `.unerr/token-flow.jsonl` for the current repo only; no network,
10
+ * no aggregation across repos.
11
+ */
12
+ import { existsSync, readFileSync } from "node:fs";
13
+ import { join } from "node:path";
14
+ const PALETTE = {
15
+ reset: "\x1b[0m",
16
+ violet: "\x1b[38;2;139;92;246m",
17
+ cyan: "\x1b[38;2;34;211;238m",
18
+ success: "\x1b[38;2;52;211;153m",
19
+ warn: "\x1b[38;2;251;191;36m",
20
+ red: "\x1b[38;2;248;113;113m",
21
+ dim: "\x1b[38;2;161;161;170m",
22
+ bold: "\x1b[1m",
23
+ };
24
+ function loadFlow(cwd) {
25
+ const path = join(cwd, ".unerr", "token-flow.jsonl");
26
+ if (!existsSync(path))
27
+ return [];
28
+ const raw = readFileSync(path, "utf8");
29
+ const events = [];
30
+ for (const line of raw.split("\n")) {
31
+ if (!line.trim())
32
+ continue;
33
+ try {
34
+ events.push(JSON.parse(line));
35
+ }
36
+ catch {
37
+ // skip malformed
38
+ }
39
+ }
40
+ return events;
41
+ }
42
+ /** Normalize a command to its leading-token fingerprint ("git diff" → "git diff"). */
43
+ function commandKey(detail) {
44
+ const cmd = (detail?.command ?? detail?.cmd);
45
+ if (!cmd)
46
+ return null;
47
+ const tokens = cmd.trim().split(/\s+/).slice(0, 2).join(" ");
48
+ return tokens || null;
49
+ }
50
+ function aggregateByCommand(events) {
51
+ const map = new Map();
52
+ for (const e of events) {
53
+ if (e.mechanism !== "shell_compression")
54
+ continue;
55
+ const key = commandKey(e.detail);
56
+ if (!key)
57
+ continue;
58
+ let row = map.get(key);
59
+ if (!row) {
60
+ row = {
61
+ command: key,
62
+ invocations: 0,
63
+ rawTokens: 0,
64
+ outTokens: 0,
65
+ savedTokens: 0,
66
+ ratio: 0,
67
+ };
68
+ map.set(key, row);
69
+ }
70
+ row.invocations++;
71
+ row.rawTokens += e.tokens_without;
72
+ row.outTokens += e.tokens_with;
73
+ row.savedTokens += e.tokens_saved;
74
+ }
75
+ for (const row of map.values()) {
76
+ row.ratio = row.rawTokens > 0 ? row.savedTokens / row.rawTokens : 0;
77
+ }
78
+ return [...map.values()];
79
+ }
80
+ function fmtNum(n) {
81
+ if (n >= 1_000_000)
82
+ return `${(n / 1_000_000).toFixed(1)}M`;
83
+ if (n >= 1_000)
84
+ return `${(n / 1_000).toFixed(1)}K`;
85
+ return `${n}`;
86
+ }
87
+ function table(rows, title, kind) {
88
+ const c = PALETTE;
89
+ const out = [];
90
+ out.push("");
91
+ out.push(` ${c.violet}◆${c.reset} ${c.bold}${title}${c.reset}`);
92
+ out.push("");
93
+ if (rows.length === 0) {
94
+ out.push(` ${c.dim}No matching shell compression events yet.${c.reset}`);
95
+ out.push("");
96
+ return out.join("\n");
97
+ }
98
+ out.push(` ${c.dim}${"command".padEnd(28)} ${"invs".padStart(5)} ${"raw".padStart(7)} ${"saved".padStart(7)} ${"ratio".padStart(6)}${c.reset}`);
99
+ out.push(` ${c.dim}${"".padEnd(28, "─")} ${"────".padStart(5)} ${"───".padStart(7)} ${"─────".padStart(7)} ${"─────".padStart(6)}${c.reset}`);
100
+ for (const r of rows) {
101
+ const ratioColor = kind === "discover"
102
+ ? r.ratio < 0.3
103
+ ? c.red
104
+ : r.ratio < 0.5
105
+ ? c.warn
106
+ : c.dim
107
+ : r.ratio >= 0.8
108
+ ? c.success
109
+ : r.ratio >= 0.5
110
+ ? c.cyan
111
+ : c.warn;
112
+ const cmd = r.command.slice(0, 28).padEnd(28);
113
+ const ratioStr = `${(r.ratio * 100).toFixed(0)}%`.padStart(6);
114
+ out.push(` ${cmd} ${String(r.invocations).padStart(5)} ${fmtNum(r.rawTokens).padStart(7)} ${fmtNum(r.savedTokens).padStart(7)} ${ratioColor}${ratioStr}${c.reset}`);
115
+ }
116
+ out.push("");
117
+ return out.join("\n");
118
+ }
119
+ export function registerGainCommand(program) {
120
+ program
121
+ .command("gain")
122
+ .description("Show top commands by tokens saved through shell compression (this repo)")
123
+ .option("-n, --limit <n>", "Number of rows to show", "20")
124
+ .action((opts) => {
125
+ const limit = Number.parseInt(opts.limit, 10) || 20;
126
+ const cwd = process.cwd();
127
+ const events = loadFlow(cwd);
128
+ const rows = aggregateByCommand(events);
129
+ const top = rows
130
+ .sort((a, b) => b.savedTokens - a.savedTokens)
131
+ .slice(0, limit);
132
+ process.stderr.write(table(top, `unerr gain — top ${limit} by tokens saved`, "gain"));
133
+ });
134
+ }
135
+ export function registerDiscoverCommand(program) {
136
+ program
137
+ .command("discover")
138
+ .description("Surface commands that bypass effective compression — untapped savings")
139
+ .option("-n, --limit <n>", "Number of rows to show", "20")
140
+ .option("-t, --threshold <pct>", "Ratio floor (0..100) below which a command is flagged", "30")
141
+ .option("-m, --min-raw <bytes>", "Ignore commands with raw output below this", "2000")
142
+ .action((opts) => {
143
+ const limit = Number.parseInt(opts.limit, 10) || 20;
144
+ const threshold = (Number.parseFloat(opts.threshold) || 30) / 100;
145
+ const minRaw = Number.parseInt(opts.minRaw, 10) || 2000;
146
+ const cwd = process.cwd();
147
+ const events = loadFlow(cwd);
148
+ const rows = aggregateByCommand(events);
149
+ const leaking = rows
150
+ .filter((r) => r.ratio < threshold &&
151
+ r.rawTokens / Math.max(1, r.invocations) >= minRaw)
152
+ .sort((a, b) => b.rawTokens - a.rawTokens)
153
+ .slice(0, limit);
154
+ process.stderr.write(table(leaking, `unerr discover — ${leaking.length} commands below ${Math.round(threshold * 100)}% compression`, "discover"));
155
+ });
156
+ }
@@ -0,0 +1,88 @@
1
+ /**
2
+ * `unerr hook <pre-*|post-*|prompt-submit>` — Hook handlers for all event types.
3
+ *
4
+ * Each subcommand reads stdin JSON and writes stdout JSON.
5
+ * - pre-bash: rewrites Bash commands to route through `unerr exec` (transparent)
6
+ * - pre-read/pre-grep/pre-glob: inject systemMessage nudges suggesting unerr tools
7
+ * - pre-write/pre-edit: blast radius + convention validation before code modifications
8
+ * - post-read/post-grep/post-glob: enrich tool output with graph navigation suggestions
9
+ * - post-write/post-edit: convention check + caller verification after modifications
10
+ * - prompt-submit: inject unerr tool reminder on each user prompt (UserPromptSubmit)
11
+ */
12
+ import { readFileSync } from "node:fs";
13
+ import { runPostEditHook, runPostGlobHook, runPostGrepHook, runPostReadHook, runPostWriteHook, runPreEditHook, runPreGlobHook, runPreGrepHook, runPreReadHook, runPreWriteHook, } from "../hooks/navigation-hooks.js";
14
+ import { runUserPromptSubmitHook } from "../hooks/prompt-hooks.js";
15
+ import { runPreBashHook } from "../hooks/shell-hooks.js";
16
+ /**
17
+ * Safe hook action wrapper. Reads stdin, runs the handler, writes stdout.
18
+ * On ANY failure (EAGAIN on stdin, handler throw, etc.) outputs valid JSON "{}"
19
+ * so Claude Code never sees a crash/invalid output and reports "hook error".
20
+ */
21
+ function safeHookAction(handler) {
22
+ return () => {
23
+ try {
24
+ const stdin = readFileSync(0, "utf-8");
25
+ process.stdout.write(handler(stdin));
26
+ }
27
+ catch (e) {
28
+ process.stderr.write(`[unerr] hook error: ${e}\n`);
29
+ process.stdout.write("{}");
30
+ }
31
+ };
32
+ }
33
+ export function registerHookCommand(program) {
34
+ const hook = program
35
+ .command("hook")
36
+ .description("IDE hook handlers (stdin/stdout JSON)");
37
+ // ── PreToolUse hooks ──────────────────────────────────────────
38
+ hook
39
+ .command("pre-bash")
40
+ .description("Rewrite Bash tool input to pipe through unerr exec")
41
+ .action(safeHookAction(runPreBashHook));
42
+ hook
43
+ .command("pre-read")
44
+ .description("Nudge agent to use file_outline/file_read instead of Read")
45
+ .action(safeHookAction(runPreReadHook));
46
+ hook
47
+ .command("pre-grep")
48
+ .description("Nudge agent to use search_code/get_callers instead of Grep")
49
+ .action(safeHookAction(runPreGrepHook));
50
+ hook
51
+ .command("pre-glob")
52
+ .description("Nudge agent to use search_code instead of Glob")
53
+ .action(safeHookAction(runPreGlobHook));
54
+ hook
55
+ .command("pre-write")
56
+ .description("Blast radius + convention check before Write")
57
+ .action(safeHookAction(runPreWriteHook));
58
+ hook
59
+ .command("pre-edit")
60
+ .description("Blast radius + convention check before Edit")
61
+ .action(safeHookAction(runPreEditHook));
62
+ // ── PostToolUse hooks ─────────────────────────────────────────
63
+ hook
64
+ .command("post-read")
65
+ .description("Enrich Read output with graph navigation suggestions")
66
+ .action(safeHookAction(runPostReadHook));
67
+ hook
68
+ .command("post-grep")
69
+ .description("Enrich Grep output with graph navigation suggestions")
70
+ .action(safeHookAction(runPostGrepHook));
71
+ hook
72
+ .command("post-glob")
73
+ .description("Enrich Glob output with graph navigation suggestions")
74
+ .action(safeHookAction(runPostGlobHook));
75
+ hook
76
+ .command("post-write")
77
+ .description("Post-write convention check + caller verification reminder")
78
+ .action(safeHookAction(runPostWriteHook));
79
+ hook
80
+ .command("post-edit")
81
+ .description("Post-edit convention check + caller verification reminder")
82
+ .action(safeHookAction(runPostEditHook));
83
+ // ── UserPromptSubmit hook ───────────────────────────────────────
84
+ hook
85
+ .command("prompt-submit")
86
+ .description("Inject unerr tool reminder on each user prompt")
87
+ .action(safeHookAction(runUserPromptSubmitHook));
88
+ }
@@ -0,0 +1,88 @@
1
+ /**
2
+ * unerr index — Trigger local graph indexing.
3
+ *
4
+ * Scans the current project with tree-sitter AST analysis, extracts
5
+ * entities + edges, populates the persistent CozoDB at .unerr/graph.db,
6
+ * and runs community detection. Data persists across restarts.
7
+ */
8
+ import { createHash } from "node:crypto";
9
+ import { getRemoteUrl, isGitRepo } from "../utils/git.js";
10
+ // ── Helpers ─────────────────────────────────────────────────
11
+ async function isInsideGitRepo() {
12
+ return isGitRepo(process.cwd());
13
+ }
14
+ async function deriveLocalRepoId(projectRoot) {
15
+ let repoIdentifier = projectRoot;
16
+ const remoteUrl = await getRemoteUrl(projectRoot);
17
+ if (remoteUrl)
18
+ repoIdentifier = remoteUrl;
19
+ return `local-${createHash("sha256").update(repoIdentifier).digest("hex").slice(0, 12)}`;
20
+ }
21
+ // ── Command ─────────────────────────────────────────────────
22
+ export function registerIndexCommand(program) {
23
+ program
24
+ .command("index")
25
+ .description("Build local code intelligence graph (replaces 'pull' in Local Mode)")
26
+ .option("--force", "Re-index even if local snapshot is fresh")
27
+ .option("--verbose", "Show per-file indexing progress")
28
+ .option("--json", "Output results as JSON (to stdout)")
29
+ .action(async (opts) => {
30
+ if (!(await isInsideGitRepo())) {
31
+ process.stderr.write("[unerr] Error: not inside a git repository.\n");
32
+ process.exit(1);
33
+ }
34
+ const projectRoot = process.cwd();
35
+ // Check freshness unless --force
36
+ if (!opts.force) {
37
+ const { shouldReindex } = await import("../intelligence/local-snapshot.js");
38
+ if (!shouldReindex(projectRoot)) {
39
+ if (opts.json) {
40
+ process.stdout.write(JSON.stringify({ status: "fresh", reindexed: false }));
41
+ process.stdout.write("\n");
42
+ }
43
+ else {
44
+ process.stderr.write("[unerr] Local snapshot is fresh. Use --force to re-index.\n");
45
+ }
46
+ process.exit(0);
47
+ }
48
+ }
49
+ // Open persistent CozoDB (SQLite-backed at .unerr/graph.db)
50
+ const { openPersistentDb } = await import("../intelligence/persistent-db.js");
51
+ const { CozoGraphStore } = await import("../intelligence/local-graph.js");
52
+ const { db } = await openPersistentDb(projectRoot);
53
+ const graphStore = await CozoGraphStore.create(db);
54
+ const repoId = await deriveLocalRepoId(projectRoot);
55
+ // Run indexing
56
+ if (!opts.json) {
57
+ process.stderr.write("[unerr] Indexing local project...\n");
58
+ }
59
+ const { indexLocalProject } = await import("../intelligence/local-indexer.js");
60
+ const result = await indexLocalProject(projectRoot, graphStore, repoId, {
61
+ verbose: opts.verbose,
62
+ });
63
+ // Output results
64
+ if (opts.json) {
65
+ process.stdout.write(JSON.stringify({
66
+ status: "indexed",
67
+ reindexed: true,
68
+ fileCount: result.fileCount,
69
+ entityCount: result.entityCount,
70
+ edgeCount: result.edgeCount,
71
+ communityCount: result.communityCount,
72
+ patternCount: result.patternCount,
73
+ ruleCount: result.ruleCount,
74
+ elapsedMs: result.elapsedMs,
75
+ }));
76
+ process.stdout.write("\n");
77
+ }
78
+ else {
79
+ process.stderr.write(`\n[unerr] Indexed ${result.fileCount} files\n`);
80
+ process.stderr.write(` Entities: ${result.entityCount}\n`);
81
+ process.stderr.write(` Edges: ${result.edgeCount}\n`);
82
+ process.stderr.write(` Communities: ${result.communityCount}\n`);
83
+ process.stderr.write(` Conventions: ${result.patternCount} patterns, ${result.ruleCount} rules\n`);
84
+ process.stderr.write(` Time: ${result.elapsedMs}ms\n`);
85
+ process.stderr.write("\n[unerr] Graph persisted to .unerr/graph.db — available instantly on next boot.\n");
86
+ }
87
+ });
88
+ }
@@ -0,0 +1,74 @@
1
+ /**
2
+ * `unerr init` — auto-detect AI tools, install hooks, write MCP config.
3
+ *
4
+ * S6.2+S6.3: Combines tool detection, hook installation, and MCP config
5
+ * writing into a single command. Idempotent — safe to run multiple times.
6
+ *
7
+ * All output to stderr (stdout is MCP-sacred).
8
+ */
9
+ import { installClaudeHook } from "../config/hook-installer.js";
10
+ import { writeMcpConfig } from "../config/mcp-config-writer.js";
11
+ import { detectTools, formatDetectedTools } from "../config/tool-detector.js";
12
+ export function registerInitCommand(program) {
13
+ program
14
+ .command("init")
15
+ .description("Auto-detect AI tools and configure unerr integration")
16
+ .action(async () => {
17
+ const cwd = process.cwd();
18
+ const result = runInit(cwd);
19
+ if (result.detectedTools.length === 0) {
20
+ process.stderr.write("[unerr] No AI tools detected. Create a .cursor/, .claude/, or .vscode/ directory first.\n");
21
+ process.stderr.write("[unerr] Or run 'unerr' directly — it will start the MCP proxy on stdio.\n");
22
+ return;
23
+ }
24
+ process.stderr.write(`[unerr] Detected: ${result.detectedTools.join(", ")}\n`);
25
+ for (const h of result.hooksInstalled) {
26
+ process.stderr.write(`[unerr] ✓ ${h}\n`);
27
+ }
28
+ for (const c of result.configsWritten) {
29
+ process.stderr.write(`[unerr] ✓ ${c}\n`);
30
+ }
31
+ for (const s of result.skipped) {
32
+ process.stderr.write(`[unerr] · ${s}\n`);
33
+ }
34
+ process.stderr.write("[unerr] Init complete. Run 'unerr' to start.\n");
35
+ });
36
+ }
37
+ /**
38
+ * Core init logic — testable without Commander.
39
+ */
40
+ export function runInit(cwd) {
41
+ const tools = detectTools(cwd);
42
+ const result = {
43
+ detectedTools: [],
44
+ hooksInstalled: [],
45
+ configsWritten: [],
46
+ skipped: [],
47
+ };
48
+ for (const tool of tools) {
49
+ const name = formatDetectedTools([tool]);
50
+ result.detectedTools.push(name);
51
+ // Install hook for Claude Code
52
+ if (tool.ide === "claude-code") {
53
+ const hookResult = installClaudeHook(cwd);
54
+ if (hookResult.action === "installed") {
55
+ result.hooksInstalled.push(`Installed Claude Code hook at ${hookResult.path}`);
56
+ }
57
+ else if (hookResult.action === "already_exists") {
58
+ result.skipped.push("Claude Code hook already installed");
59
+ }
60
+ }
61
+ // Write MCP config for all detected tools
62
+ const configResult = writeMcpConfig(cwd, tool.ide);
63
+ if (configResult.action === "created") {
64
+ result.configsWritten.push(`Created MCP config at ${configResult.path}`);
65
+ }
66
+ else if (configResult.action === "updated") {
67
+ result.configsWritten.push(`Added unerr to existing config at ${configResult.path}`);
68
+ }
69
+ else {
70
+ result.skipped.push(`MCP config for ${name} already configured`);
71
+ }
72
+ }
73
+ return result;
74
+ }