@unerr-ai/unerr 0.2.1 → 0.2.3
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 +36 -45
- package/dist/cli.js +37443 -36022
- package/package.json +2 -1
- package/dist/behaviors/agent-llm-bridge.js +0 -166
- package/dist/behaviors/architecture-guard.js +0 -256
- package/dist/behaviors/auto-doc.js +0 -247
- package/dist/behaviors/cascade-guard.js +0 -289
- package/dist/behaviors/change-narrative.js +0 -270
- package/dist/behaviors/convention-drift.js +0 -290
- package/dist/behaviors/framework.js +0 -235
- package/dist/behaviors/guard-formatter.js +0 -44
- package/dist/behaviors/incomplete-work.js +0 -270
- package/dist/behaviors/loop-breaker.js +0 -300
- package/dist/behaviors/session-continuity.js +0 -208
- package/dist/commands/branches.js +0 -97
- package/dist/commands/check-commit.js +0 -225
- package/dist/commands/compress-output.js +0 -64
- package/dist/commands/config-verify.js +0 -243
- package/dist/commands/daemon.js +0 -905
- package/dist/commands/dashboard.js +0 -52
- package/dist/commands/debug.js +0 -200
- package/dist/commands/enrich.js +0 -184
- package/dist/commands/exec.js +0 -233
- package/dist/commands/gain.js +0 -156
- package/dist/commands/hook.js +0 -88
- package/dist/commands/index.js +0 -88
- package/dist/commands/init.js +0 -74
- package/dist/commands/install.js +0 -505
- package/dist/commands/learn.js +0 -116
- package/dist/commands/manifest.js +0 -193
- package/dist/commands/rewind.js +0 -103
- package/dist/commands/serve.js +0 -19
- package/dist/commands/setup-wizard.js +0 -414
- package/dist/commands/skills.js +0 -64
- package/dist/commands/stats.js +0 -20
- package/dist/commands/status.js +0 -654
- package/dist/commands/timeline.js +0 -139
- package/dist/commands/uninstall.js +0 -230
- package/dist/components/App.js +0 -109
- package/dist/components/Banner.js +0 -12
- package/dist/components/ConfirmPrompt.js +0 -25
- package/dist/components/DriftSummary.js +0 -23
- package/dist/components/GradeBadge.js +0 -15
- package/dist/components/HealthCard.js +0 -18
- package/dist/components/InkSpinner.js +0 -22
- package/dist/components/InputBox.js +0 -17
- package/dist/components/KeyValue.js +0 -13
- package/dist/components/MessageList.js +0 -14
- package/dist/components/ProgressBar.js +0 -26
- package/dist/components/Section.js +0 -16
- package/dist/components/SessionSummaryCard.js +0 -73
- package/dist/components/StartupDisplay.js +0 -24
- package/dist/components/StatusDashboard.js +0 -57
- package/dist/components/StatusLine.js +0 -8
- package/dist/components/StepLine.js +0 -22
- package/dist/components/Theme.js +0 -20
- package/dist/components/ToolProgress.js +0 -8
- package/dist/components/ViolationList.js +0 -21
- package/dist/components/render.js +0 -13
- package/dist/config/agent-registry.js +0 -237
- package/dist/config/claude-settings-hooks.js +0 -304
- package/dist/config/hook-installer.js +0 -65
- package/dist/config/instruction-writer.js +0 -388
- package/dist/config/mcp-config-writer.js +0 -266
- package/dist/config/settings.js +0 -174
- package/dist/config/tool-detector.js +0 -42
- package/dist/config/value-surfacing.js +0 -119
- package/dist/core/context-assembly.js +0 -108
- package/dist/core/conversation.js +0 -33
- package/dist/core/local-chat-provider.js +0 -475
- package/dist/core/provider-factory.js +0 -55
- package/dist/core/providers.js +0 -90
- package/dist/core/query-engine.js +0 -174
- package/dist/daemon/api.js +0 -312
- package/dist/daemon/autostart.js +0 -119
- package/dist/daemon/bootstrap.js +0 -39
- package/dist/daemon/client.js +0 -164
- package/dist/daemon/detect-ci.js +0 -81
- package/dist/daemon/platform-linux.js +0 -146
- package/dist/daemon/platform-macos.js +0 -134
- package/dist/daemon/platform-windows.js +0 -116
- package/dist/daemon/process-manager.js +0 -299
- package/dist/daemon/protocol.js +0 -23
- package/dist/daemon/registry.js +0 -270
- package/dist/daemon/settings-schema.js +0 -72
- package/dist/daemon/system-health.js +0 -134
- package/dist/daemon/version-checker.js +0 -262
- package/dist/daemon/warm-start.js +0 -223
- package/dist/entrypoints/cli.js +0 -1043
- package/dist/entrypoints/daemon.js +0 -380
- package/dist/entrypoints/repl.js +0 -147
- package/dist/hooks/adapters/claude-code.js +0 -90
- package/dist/hooks/adapters/cline.js +0 -100
- package/dist/hooks/adapters/cursor.js +0 -98
- package/dist/hooks/hook-dedup.js +0 -79
- package/dist/hooks/hook-runner.js +0 -113
- package/dist/hooks/navigation-hooks.js +0 -175
- package/dist/hooks/prompt-hooks.js +0 -63
- package/dist/hooks/shell-hooks.js +0 -47
- package/dist/ignore.js +0 -111
- package/dist/intelligence/approach-suggester.js +0 -61
- package/dist/intelligence/ast-extractor.js +0 -2615
- package/dist/intelligence/ast-worker.js +0 -34
- package/dist/intelligence/background-indexer.js +0 -121
- package/dist/intelligence/blast-radius.js +0 -200
- package/dist/intelligence/community-detection.js +0 -691
- package/dist/intelligence/community-detector.js +0 -184
- package/dist/intelligence/computation-scheduler.js +0 -75
- package/dist/intelligence/confidence-propagation.js +0 -47
- package/dist/intelligence/convention-detector.js +0 -242
- package/dist/intelligence/convention-learner.js +0 -205
- package/dist/intelligence/convention-matcher.js +0 -205
- package/dist/intelligence/cozo-schema.js +0 -376
- package/dist/intelligence/decision-point-detector.js +0 -90
- package/dist/intelligence/deep-dive-tools.js +0 -586
- package/dist/intelligence/durability-scorer.js +0 -84
- package/dist/intelligence/exploration-cost.js +0 -204
- package/dist/intelligence/exploration-pattern-tracker.js +0 -61
- package/dist/intelligence/fact-generator.js +0 -322
- package/dist/intelligence/facts-schema.js +0 -90
- package/dist/intelligence/file-intelligence.js +0 -59
- package/dist/intelligence/graph-holder.js +0 -220
- package/dist/intelligence/graph-temporal-joiner.js +0 -238
- package/dist/intelligence/health-grade.js +0 -423
- package/dist/intelligence/health-grader.js +0 -200
- package/dist/intelligence/health-map-data.js +0 -259
- package/dist/intelligence/import-symbols.js +0 -136
- package/dist/intelligence/incremental-indexer.js +0 -658
- package/dist/intelligence/indexer/centrality.js +0 -62
- package/dist/intelligence/indexer/cfg-context.js +0 -95
- package/dist/intelligence/indexer/confidence.js +0 -34
- package/dist/intelligence/indexer/cross-file-resolver.js +0 -104
- package/dist/intelligence/indexer/edge-repair.js +0 -89
- package/dist/intelligence/indexer/entity-key.js +0 -17
- package/dist/intelligence/indexer/export-map.js +0 -132
- package/dist/intelligence/indexer/git-cochange.js +0 -128
- package/dist/intelligence/indexer/graph-patch.js +0 -147
- package/dist/intelligence/indexer/incremental.js +0 -78
- package/dist/intelligence/indexer/ingest.js +0 -160
- package/dist/intelligence/indexer/language-detect.js +0 -226
- package/dist/intelligence/indexer/metadata.js +0 -63
- package/dist/intelligence/indexer/mutation-tracker.js +0 -79
- package/dist/intelligence/indexer/orchestrator.js +0 -155
- package/dist/intelligence/indexer/plugin-interface.js +0 -31
- package/dist/intelligence/indexer/plugins/csharp.js +0 -440
- package/dist/intelligence/indexer/plugins/go.js +0 -335
- package/dist/intelligence/indexer/plugins/java.js +0 -370
- package/dist/intelligence/indexer/plugins/python.js +0 -358
- package/dist/intelligence/indexer/plugins/regex-fallback.js +0 -82
- package/dist/intelligence/indexer/plugins/ruby.js +0 -290
- package/dist/intelligence/indexer/plugins/rust.js +0 -484
- package/dist/intelligence/indexer/plugins/tier2-generic.js +0 -310
- package/dist/intelligence/indexer/plugins/typescript.js +0 -456
- package/dist/intelligence/indexer/resource-monitor.js +0 -93
- package/dist/intelligence/indexer/scip/decoder.js +0 -253
- package/dist/intelligence/indexer/scip/detector.js +0 -232
- package/dist/intelligence/indexer/scip/downloader.js +0 -427
- package/dist/intelligence/indexer/scip/fallback.js +0 -34
- package/dist/intelligence/indexer/scip/merger.js +0 -109
- package/dist/intelligence/indexer/scip/orchestrator.js +0 -433
- package/dist/intelligence/indexer/scip/runner.js +0 -98
- package/dist/intelligence/indexer/snapshot.js +0 -66
- package/dist/intelligence/indexer/test-detector.js +0 -196
- package/dist/intelligence/indexer/watch-integration.js +0 -61
- package/dist/intelligence/indexer/worker.js +0 -85
- package/dist/intelligence/local-convention-detector.js +0 -437
- package/dist/intelligence/local-embeddings.js +0 -190
- package/dist/intelligence/local-graph.js +0 -1946
- package/dist/intelligence/local-indexer.js +0 -1575
- package/dist/intelligence/local-llm.js +0 -163
- package/dist/intelligence/local-rule-generator.js +0 -154
- package/dist/intelligence/local-snapshot.js +0 -213
- package/dist/intelligence/negative-knowledge.js +0 -103
- package/dist/intelligence/persistent-db.js +0 -85
- package/dist/intelligence/query-router.js +0 -2556
- package/dist/intelligence/risk-classifier.js +0 -116
- package/dist/intelligence/rule-evaluator.js +0 -380
- package/dist/intelligence/rule-generator.js +0 -49
- package/dist/intelligence/search-index.js +0 -173
- package/dist/intelligence/semantic/docstring-extractor.js +0 -67
- package/dist/intelligence/semantic/embedding-store.js +0 -52
- package/dist/intelligence/semantic/enrichment-orchestrator.js +0 -48
- package/dist/intelligence/semantic/git-message-miner.js +0 -114
- package/dist/intelligence/semantic/identifier-tokenizer.js +0 -51
- package/dist/intelligence/semantic/node2vec-embeddings.js +0 -71
- package/dist/intelligence/semantic/node2vec-walks.js +0 -103
- package/dist/intelligence/semantic/path-domain-inference.js +0 -112
- package/dist/intelligence/semantic/similarity-engine.js +0 -60
- package/dist/intelligence/semantic/tfidf-vectors.js +0 -88
- package/dist/intelligence/session-brief-builder.js +0 -159
- package/dist/intelligence/session-context.js +0 -221
- package/dist/intelligence/session-health-monitor.js +0 -211
- package/dist/intelligence/session-narrative.js +0 -197
- package/dist/intelligence/session-pattern-analyzer.js +0 -218
- package/dist/intelligence/signal-scorer.js +0 -390
- package/dist/intelligence/signal-show-store.js +0 -182
- package/dist/intelligence/smart-truncate.js +0 -158
- package/dist/intelligence/subgraph-cache.js +0 -88
- package/dist/intelligence/temporal-facts.js +0 -494
- package/dist/intelligence/token-estimator.js +0 -100
- package/dist/intelligence/tool-injector.js +0 -87
- package/dist/intelligence/tree-sitter-loader.js +0 -71
- package/dist/intelligence/worker-pool.js +0 -116
- package/dist/proxy/arg-validator.js +0 -79
- package/dist/proxy/auto-bootstrap.js +0 -167
- package/dist/proxy/bridge.js +0 -147
- package/dist/proxy/budget-enforcer.js +0 -70
- package/dist/proxy/compression-quality-monitor.js +0 -160
- package/dist/proxy/compression-stats.js +0 -51
- package/dist/proxy/context-rot-detector.js +0 -137
- package/dist/proxy/drift-detector.js +0 -139
- package/dist/proxy/efficiency-tracker.js +0 -79
- package/dist/proxy/fact-ranking.js +0 -154
- package/dist/proxy/format-encoder.js +0 -266
- package/dist/proxy/http-transport.js +0 -90
- package/dist/proxy/lifecycle-actor.js +0 -55
- package/dist/proxy/lifecycle-machine.js +0 -187
- package/dist/proxy/log-tailer.js +0 -265
- package/dist/proxy/model-pricing.js +0 -98
- package/dist/proxy/network-firewall.js +0 -141
- package/dist/proxy/nudge-state.js +0 -93
- package/dist/proxy/output-compressor.js +0 -185
- package/dist/proxy/pid-lock.js +0 -291
- package/dist/proxy/proxy-context.js +0 -11
- package/dist/proxy/proxy.js +0 -2633
- package/dist/proxy/response-enrichment.js +0 -32
- package/dist/proxy/response-envelope.js +0 -313
- package/dist/proxy/session-dedup.js +0 -82
- package/dist/proxy/session-legend.js +0 -30
- package/dist/proxy/session-persistence.js +0 -210
- package/dist/proxy/session-resume.js +0 -94
- package/dist/proxy/session-stats.js +0 -513
- package/dist/proxy/shell-classifier.js +0 -1346
- package/dist/proxy/shell-compression-log.js +0 -93
- package/dist/proxy/shell-compressor.js +0 -390
- package/dist/proxy/shell-graph-boost.js +0 -202
- package/dist/proxy/shell-monitor-map.js +0 -18
- package/dist/proxy/shell-stats.js +0 -54
- package/dist/proxy/shell-strategies/cloud.js +0 -215
- package/dist/proxy/shell-strategies/diff.js +0 -159
- package/dist/proxy/shell-strategies/error-diagnostic.js +0 -796
- package/dist/proxy/shell-strategies/filter-dsl.js +0 -358
- package/dist/proxy/shell-strategies/git-status.js +0 -177
- package/dist/proxy/shell-strategies/key-value.js +0 -193
- package/dist/proxy/shell-strategies/log-text.js +0 -154
- package/dist/proxy/shell-strategies/omni.js +0 -188
- package/dist/proxy/shell-strategies/progress.js +0 -55
- package/dist/proxy/shell-strategies/redact.js +0 -76
- package/dist/proxy/shell-strategies/structured.js +0 -241
- package/dist/proxy/shell-strategies/tabular.js +0 -243
- package/dist/proxy/shell-strategies/test-results-types.js +0 -13
- package/dist/proxy/shell-strategies/test-results.js +0 -784
- package/dist/proxy/shell-strategies/tree-paths.js +0 -144
- package/dist/proxy/shell-strategies/yaml.js +0 -182
- package/dist/proxy/shell-tee.js +0 -111
- package/dist/proxy/signal-dedup.js +0 -171
- package/dist/proxy/startup-renderer.js +0 -158
- package/dist/proxy/task-token-display.js +0 -38
- package/dist/proxy/token-counter.js +0 -61
- package/dist/proxy/tool-clusters.js +0 -273
- package/dist/proxy/tool-definitions.js +0 -525
- package/dist/proxy/transport-mux.js +0 -229
- package/dist/proxy/wire-cap.js +0 -268
- package/dist/rules/developer.mozilla.org.json +0 -9
- package/dist/rules/github.com.json +0 -21
- package/dist/schemas/api/skills.js +0 -19
- package/dist/schemas/common/errors.js +0 -7
- package/dist/schemas/common/headers.js +0 -5
- package/dist/schemas/entities/edge.js +0 -25
- package/dist/schemas/entities/entity.js +0 -22
- package/dist/schemas/entities/rule.js +0 -18
- package/dist/schemas/index.js +0 -14
- package/dist/server/event-bus.js +0 -59
- package/dist/server/http.js +0 -156
- package/dist/server/middleware.js +0 -70
- package/dist/server/routes/drift.js +0 -97
- package/dist/server/routes/intelligence.js +0 -1217
- package/dist/server/routes/reasoning-quality.js +0 -444
- package/dist/server/routes/session.js +0 -86
- package/dist/server/routes/stream.js +0 -120
- package/dist/server/routes/system.js +0 -73
- package/dist/server/routes/temporal.js +0 -170
- package/dist/server/routes/timeline.js +0 -232
- package/dist/server/routes/token-flow.js +0 -403
- package/dist/skills/effectiveness-tracker.js +0 -93
- package/dist/skills/local-pack.js +0 -380
- package/dist/skills/resolver.js +0 -495
- package/dist/state-detector.js +0 -83
- package/dist/timeline/intent-detector.js +0 -263
- package/dist/timeline/loop-miner.js +0 -140
- package/dist/timeline/open-threads.js +0 -49
- package/dist/timeline/signal-reinforcer.js +0 -62
- package/dist/timeline/timeline-bootstrap.js +0 -151
- package/dist/timeline/timeline-store.js +0 -618
- package/dist/tools/coding/bash.js +0 -49
- package/dist/tools/coding/file-edit.js +0 -72
- package/dist/tools/coding/file-outline.js +0 -227
- package/dist/tools/coding/file-read-protocol.js +0 -425
- package/dist/tools/coding/file-read.js +0 -35
- package/dist/tools/coding/file-write.js +0 -43
- package/dist/tools/coding/glob-tool.js +0 -109
- package/dist/tools/coding/grep.js +0 -162
- package/dist/tools/coding/index.js +0 -27
- package/dist/tools/intelligence/index.js +0 -269
- package/dist/tools/intelligence/record-fact.js +0 -48
- package/dist/tools/intelligence/timeline-markers.js +0 -130
- package/dist/tools/registry.js +0 -47
- package/dist/tools/types.js +0 -8
- package/dist/tracking/auto-snapshot-triggers.js +0 -246
- package/dist/tracking/branch-context.js +0 -115
- package/dist/tracking/branch-snapshot.js +0 -217
- package/dist/tracking/causal-bridge.js +0 -317
- package/dist/tracking/circuit-breaker.js +0 -147
- package/dist/tracking/commit-watcher.js +0 -114
- package/dist/tracking/context-ledger.js +0 -119
- package/dist/tracking/correction-detector.js +0 -324
- package/dist/tracking/drift-tracker.js +0 -874
- package/dist/tracking/durability-tracker.js +0 -94
- package/dist/tracking/entity-rewind.js +0 -200
- package/dist/tracking/file-hash-state.js +0 -114
- package/dist/tracking/git-attribution.js +0 -132
- package/dist/tracking/git-trailers.js +0 -171
- package/dist/tracking/intelligence-counter.js +0 -46
- package/dist/tracking/intent-correlator.js +0 -202
- package/dist/tracking/intent-encoder.js +0 -52
- package/dist/tracking/intent-token-tracker.js +0 -159
- package/dist/tracking/ledger-archiver.js +0 -94
- package/dist/tracking/ledger-chains.js +0 -245
- package/dist/tracking/metrics-store.js +0 -361
- package/dist/tracking/native-watcher.js +0 -131
- package/dist/tracking/offline-rewind.js +0 -295
- package/dist/tracking/pending-violations.js +0 -74
- package/dist/tracking/persistence-effectiveness.js +0 -167
- package/dist/tracking/prompt-durability.js +0 -202
- package/dist/tracking/quality-signals.js +0 -213
- package/dist/tracking/redactor.js +0 -73
- package/dist/tracking/rewind-engine.js +0 -161
- package/dist/tracking/session-history.js +0 -128
- package/dist/tracking/session-receipt.js +0 -88
- package/dist/tracking/session-summary-writer.js +0 -157
- package/dist/tracking/shadow-ledger.js +0 -321
- package/dist/tracking/stash-manager.js +0 -258
- package/dist/tracking/timeline-fork.js +0 -213
- package/dist/tracking/timeline.js +0 -69
- package/dist/tracking/token-flow.js +0 -276
- package/dist/tracking/turn-segmenter.js +0 -122
- package/dist/tracking/weekly-accumulator.js +0 -179
- package/dist/tracking/working-snapshots.js +0 -188
- package/dist/tracking/workspace-manifest.js +0 -176
- package/dist/transport/http.js +0 -102
- package/dist/utils/counterfactual.js +0 -65
- package/dist/utils/deep-link.js +0 -34
- package/dist/utils/detect.js +0 -193
- package/dist/utils/exec.js +0 -73
- package/dist/utils/file-logger.js +0 -87
- package/dist/utils/format-error.js +0 -29
- package/dist/utils/git.js +0 -181
- package/dist/utils/log.js +0 -57
- package/dist/utils/logger.js +0 -35
- package/dist/utils/mcp-content-json.js +0 -8
- package/dist/utils/session-logger.js +0 -154
- package/dist/utils/startup-log.js +0 -512
- package/dist/utils/ui.js +0 -56
|
@@ -1,414 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Setup Wizard — first-run project initialization.
|
|
3
|
-
*
|
|
4
|
-
* Generates a repo ID, writes .unerr/config.json, installs skills.
|
|
5
|
-
* All output goes to stderr (stdout is MCP-sacred).
|
|
6
|
-
*
|
|
7
|
-
* LLM configuration is disabled — unerr operates as an MCP proxy where
|
|
8
|
-
* the calling agent (Claude Code, Cursor, etc.) provides the LLM.
|
|
9
|
-
* The configure* functions are retained for future re-enablement.
|
|
10
|
-
*/
|
|
11
|
-
import { createHash } from "node:crypto";
|
|
12
|
-
import { existsSync, mkdirSync, writeFileSync } from "node:fs";
|
|
13
|
-
import { join } from "node:path";
|
|
14
|
-
import * as clack from "@clack/prompts";
|
|
15
|
-
import { getRemoteUrl } from "../utils/git.js";
|
|
16
|
-
/** @deprecated Use runSetup() directly. Kept for backward compat. */
|
|
17
|
-
export const promptLocalOrExit = runSetup;
|
|
18
|
-
/** @deprecated Use runSetup() directly. Kept for backward compat. */
|
|
19
|
-
export const enterLocalModeSetup = runSetup;
|
|
20
|
-
/**
|
|
21
|
-
* First-run project setup. Generates repo ID, writes config, installs skills.
|
|
22
|
-
*/
|
|
23
|
-
export async function runSetup(cwd) {
|
|
24
|
-
const projectDir = cwd ?? process.cwd();
|
|
25
|
-
clack.intro("unerr");
|
|
26
|
-
clack.log.step("Project Setup");
|
|
27
|
-
// Generate repo ID from git remote or cwd
|
|
28
|
-
const repoId = await generateRepoId(projectDir);
|
|
29
|
-
// Write config files
|
|
30
|
-
const configDir = join(projectDir, ".unerr");
|
|
31
|
-
mkdirSync(configDir, { recursive: true });
|
|
32
|
-
const configPath = join(configDir, "config.json");
|
|
33
|
-
const settingsPath = join(configDir, "settings.json");
|
|
34
|
-
writeFileSync(configPath, `${JSON.stringify({ repoId }, null, 2)}\n`);
|
|
35
|
-
// Write/merge settings.json
|
|
36
|
-
let existingSettings = {};
|
|
37
|
-
if (existsSync(settingsPath)) {
|
|
38
|
-
try {
|
|
39
|
-
existingSettings = JSON.parse(require("node:fs").readFileSync(settingsPath, "utf-8"));
|
|
40
|
-
}
|
|
41
|
-
catch {
|
|
42
|
-
// Ignore parse errors
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
writeFileSync(settingsPath, `${JSON.stringify({ ...existingSettings }, null, 2)}\n`);
|
|
46
|
-
// Install skills from bundled pack
|
|
47
|
-
let skillCount = 0;
|
|
48
|
-
let detectedIde = "unknown";
|
|
49
|
-
try {
|
|
50
|
-
const { detectIde } = await import("../utils/detect.js");
|
|
51
|
-
const { resolveAndInstallSkills } = await import("../skills/resolver.js");
|
|
52
|
-
const ide = await detectIde(projectDir);
|
|
53
|
-
detectedIde = ide;
|
|
54
|
-
const result = await resolveAndInstallSkills({ ide, cwd: projectDir });
|
|
55
|
-
skillCount = result.installed.length;
|
|
56
|
-
if (skillCount > 0) {
|
|
57
|
-
clack.log.success(`🧠 ${skillCount} intelligence skills installed — your AI agent will now use graph tools before reading files`);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
catch {
|
|
61
|
-
// Non-blocking — skills can self-heal on first boot
|
|
62
|
-
}
|
|
63
|
-
// Write MCP config for detected IDE only (project-level, never global)
|
|
64
|
-
// Users add other agents manually via: unerr install <agent>
|
|
65
|
-
let mcpConfigAction = "";
|
|
66
|
-
try {
|
|
67
|
-
const { writeMcpConfig } = await import("../config/mcp-config-writer.js");
|
|
68
|
-
const mcpResult = writeMcpConfig(projectDir, detectedIde);
|
|
69
|
-
if (mcpResult.action === "created") {
|
|
70
|
-
mcpConfigAction = `MCP config written → ${mcpResult.path}`;
|
|
71
|
-
clack.log.success(`🔌 MCP server registered for ${detectedIde} — AI agent will auto-connect to unerr intelligence`);
|
|
72
|
-
}
|
|
73
|
-
else if (mcpResult.action === "updated") {
|
|
74
|
-
mcpConfigAction = `MCP config updated → ${mcpResult.path}`;
|
|
75
|
-
clack.log.success(`🔌 MCP config updated for ${detectedIde} — unerr intelligence now wired in`);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
catch {
|
|
79
|
-
// Non-blocking — MCP config can be written manually
|
|
80
|
-
}
|
|
81
|
-
// Summary
|
|
82
|
-
const summaryLines = [
|
|
83
|
-
`Mode: MCP intelligence proxy (${detectedIde} detected)`,
|
|
84
|
-
`Skills: ${skillCount} agent skills installed`,
|
|
85
|
-
];
|
|
86
|
-
if (mcpConfigAction) {
|
|
87
|
-
summaryLines.push(`MCP: ${mcpConfigAction}`);
|
|
88
|
-
}
|
|
89
|
-
summaryLines.push("Config: .unerr/config.json");
|
|
90
|
-
summaryLines.push("");
|
|
91
|
-
summaryLines.push("Your AI agent now has: blast radius, community detection,");
|
|
92
|
-
summaryLines.push("convention enforcement, and <5ms graph queries.");
|
|
93
|
-
clack.note(summaryLines.join("\n"), "✅ Intelligence layer configured");
|
|
94
|
-
clack.outro("🚀 Starting intelligence engine...");
|
|
95
|
-
return { action: "setup", repoId };
|
|
96
|
-
}
|
|
97
|
-
// ── Internal Helpers ─────────────────────────────────────────
|
|
98
|
-
async function generateRepoId(cwd) {
|
|
99
|
-
let repoIdentifier = cwd;
|
|
100
|
-
const remote = await getRemoteUrl(cwd);
|
|
101
|
-
if (remote)
|
|
102
|
-
repoIdentifier = remote;
|
|
103
|
-
return createHash("sha256").update(repoIdentifier).digest("hex").slice(0, 12);
|
|
104
|
-
}
|
|
105
|
-
function formatSize(bytes) {
|
|
106
|
-
if (bytes >= 1e9)
|
|
107
|
-
return `${(bytes / 1e9).toFixed(1)}GB`;
|
|
108
|
-
if (bytes >= 1e6)
|
|
109
|
-
return `${(bytes / 1e6).toFixed(0)}MB`;
|
|
110
|
-
return `${bytes}B`;
|
|
111
|
-
}
|
|
112
|
-
async function fetchOllamaModels(baseUrl) {
|
|
113
|
-
try {
|
|
114
|
-
const response = await fetch(`${baseUrl}/api/tags`, {
|
|
115
|
-
signal: AbortSignal.timeout(3000),
|
|
116
|
-
});
|
|
117
|
-
if (!response.ok)
|
|
118
|
-
return [];
|
|
119
|
-
const body = (await response.json());
|
|
120
|
-
if (!body.models || !Array.isArray(body.models))
|
|
121
|
-
return [];
|
|
122
|
-
return body.models.map((m) => ({
|
|
123
|
-
name: m.name,
|
|
124
|
-
size: formatSize(m.size),
|
|
125
|
-
}));
|
|
126
|
-
}
|
|
127
|
-
catch {
|
|
128
|
-
return [];
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
/** @internal Retained for future LLM config re-enablement. */
|
|
132
|
-
export async function configureOllama() {
|
|
133
|
-
const defaultUrl = "http://localhost:11434";
|
|
134
|
-
const spinner = clack.spinner();
|
|
135
|
-
spinner.start("Checking for Ollama...");
|
|
136
|
-
let ollamaReachable = false;
|
|
137
|
-
let models = [];
|
|
138
|
-
try {
|
|
139
|
-
const response = await fetch(`${defaultUrl}/api/tags`, {
|
|
140
|
-
signal: AbortSignal.timeout(2000),
|
|
141
|
-
});
|
|
142
|
-
ollamaReachable = response.ok;
|
|
143
|
-
if (ollamaReachable) {
|
|
144
|
-
models = await fetchOllamaModels(defaultUrl);
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
catch {
|
|
148
|
-
ollamaReachable = false;
|
|
149
|
-
}
|
|
150
|
-
if (ollamaReachable && models.length > 0) {
|
|
151
|
-
spinner.stop("Ollama detected at localhost:11434");
|
|
152
|
-
const embeddingModel = await clack.select({
|
|
153
|
-
message: "Select embedding model",
|
|
154
|
-
options: models.map((m) => ({
|
|
155
|
-
value: m.name,
|
|
156
|
-
label: m.name,
|
|
157
|
-
hint: m.size,
|
|
158
|
-
})),
|
|
159
|
-
});
|
|
160
|
-
if (clack.isCancel(embeddingModel)) {
|
|
161
|
-
clack.cancel("Setup cancelled.");
|
|
162
|
-
return null;
|
|
163
|
-
}
|
|
164
|
-
const chatModel = await clack.select({
|
|
165
|
-
message: "Select chat model (for 'unerr chat' and enrichment)",
|
|
166
|
-
options: models.map((m) => ({
|
|
167
|
-
value: m.name,
|
|
168
|
-
label: m.name,
|
|
169
|
-
hint: m.size,
|
|
170
|
-
})),
|
|
171
|
-
});
|
|
172
|
-
if (clack.isCancel(chatModel)) {
|
|
173
|
-
clack.cancel("Setup cancelled.");
|
|
174
|
-
return null;
|
|
175
|
-
}
|
|
176
|
-
return {
|
|
177
|
-
provider: "ollama",
|
|
178
|
-
baseUrl: defaultUrl,
|
|
179
|
-
embeddingModel: embeddingModel,
|
|
180
|
-
chatModel: chatModel,
|
|
181
|
-
};
|
|
182
|
-
}
|
|
183
|
-
if (ollamaReachable) {
|
|
184
|
-
spinner.stop("Ollama detected but no models found");
|
|
185
|
-
clack.log.warn("No models installed. Run: ollama pull nomic-embed-text && ollama pull llama3");
|
|
186
|
-
}
|
|
187
|
-
else {
|
|
188
|
-
spinner.stop("Ollama not running");
|
|
189
|
-
clack.log.warn("Install from ollama.com and start it, or enter a custom URL.");
|
|
190
|
-
}
|
|
191
|
-
const baseUrl = await clack.text({
|
|
192
|
-
message: "Ollama URL",
|
|
193
|
-
defaultValue: defaultUrl,
|
|
194
|
-
placeholder: defaultUrl,
|
|
195
|
-
});
|
|
196
|
-
if (clack.isCancel(baseUrl)) {
|
|
197
|
-
clack.cancel("Setup cancelled.");
|
|
198
|
-
return null;
|
|
199
|
-
}
|
|
200
|
-
return {
|
|
201
|
-
provider: "ollama",
|
|
202
|
-
baseUrl: baseUrl || defaultUrl,
|
|
203
|
-
embeddingModel: "nomic-embed-text",
|
|
204
|
-
chatModel: "llama3",
|
|
205
|
-
};
|
|
206
|
-
}
|
|
207
|
-
/** @internal Retained for future LLM config re-enablement. */
|
|
208
|
-
export async function configureOpenAICompatible() {
|
|
209
|
-
const splitChoice = await clack.select({
|
|
210
|
-
message: "Same provider for embedding and inference?",
|
|
211
|
-
options: [
|
|
212
|
-
{
|
|
213
|
-
value: "same",
|
|
214
|
-
label: "Yes — same base URL for both",
|
|
215
|
-
hint: "Single provider, different models",
|
|
216
|
-
},
|
|
217
|
-
{
|
|
218
|
-
value: "split",
|
|
219
|
-
label: "No — different URLs/providers",
|
|
220
|
-
hint: "E.g., Ollama embedding + Fireworks inference",
|
|
221
|
-
},
|
|
222
|
-
],
|
|
223
|
-
});
|
|
224
|
-
if (clack.isCancel(splitChoice)) {
|
|
225
|
-
clack.cancel("Setup cancelled.");
|
|
226
|
-
return null;
|
|
227
|
-
}
|
|
228
|
-
if (splitChoice === "split") {
|
|
229
|
-
return configureSplitEndpoints();
|
|
230
|
-
}
|
|
231
|
-
const baseUrl = await clack.text({
|
|
232
|
-
message: "API base URL",
|
|
233
|
-
placeholder: "http://localhost:1234/v1",
|
|
234
|
-
});
|
|
235
|
-
if (clack.isCancel(baseUrl)) {
|
|
236
|
-
clack.cancel("Setup cancelled.");
|
|
237
|
-
return null;
|
|
238
|
-
}
|
|
239
|
-
const apiKey = await clack.password({
|
|
240
|
-
message: "API key (leave empty if none)",
|
|
241
|
-
});
|
|
242
|
-
if (clack.isCancel(apiKey)) {
|
|
243
|
-
clack.cancel("Setup cancelled.");
|
|
244
|
-
return null;
|
|
245
|
-
}
|
|
246
|
-
const embeddingModel = await clack.text({
|
|
247
|
-
message: "Embedding model name",
|
|
248
|
-
placeholder: "nomic-embed-text",
|
|
249
|
-
defaultValue: "nomic-embed-text",
|
|
250
|
-
});
|
|
251
|
-
if (clack.isCancel(embeddingModel)) {
|
|
252
|
-
clack.cancel("Setup cancelled.");
|
|
253
|
-
return null;
|
|
254
|
-
}
|
|
255
|
-
const chatModel = await clack.text({
|
|
256
|
-
message: "Chat/inference model name",
|
|
257
|
-
placeholder: "llama3",
|
|
258
|
-
defaultValue: "llama3",
|
|
259
|
-
});
|
|
260
|
-
if (clack.isCancel(chatModel)) {
|
|
261
|
-
clack.cancel("Setup cancelled.");
|
|
262
|
-
return null;
|
|
263
|
-
}
|
|
264
|
-
return {
|
|
265
|
-
provider: "openai-compatible",
|
|
266
|
-
baseUrl: baseUrl,
|
|
267
|
-
...(apiKey ? { apiKey: apiKey } : {}),
|
|
268
|
-
embeddingModel: embeddingModel,
|
|
269
|
-
chatModel: chatModel,
|
|
270
|
-
};
|
|
271
|
-
}
|
|
272
|
-
async function configureSplitEndpoints() {
|
|
273
|
-
clack.log.step("Embedding endpoint");
|
|
274
|
-
const embBaseUrl = await clack.text({
|
|
275
|
-
message: "Embedding API base URL",
|
|
276
|
-
placeholder: "http://localhost:11434",
|
|
277
|
-
});
|
|
278
|
-
if (clack.isCancel(embBaseUrl)) {
|
|
279
|
-
clack.cancel("Setup cancelled.");
|
|
280
|
-
return null;
|
|
281
|
-
}
|
|
282
|
-
const embApiKey = await clack.password({
|
|
283
|
-
message: "Embedding API key (leave empty if none)",
|
|
284
|
-
});
|
|
285
|
-
if (clack.isCancel(embApiKey)) {
|
|
286
|
-
clack.cancel("Setup cancelled.");
|
|
287
|
-
return null;
|
|
288
|
-
}
|
|
289
|
-
const embModel = await clack.text({
|
|
290
|
-
message: "Embedding model name",
|
|
291
|
-
placeholder: "nomic-embed-text",
|
|
292
|
-
defaultValue: "nomic-embed-text",
|
|
293
|
-
});
|
|
294
|
-
if (clack.isCancel(embModel)) {
|
|
295
|
-
clack.cancel("Setup cancelled.");
|
|
296
|
-
return null;
|
|
297
|
-
}
|
|
298
|
-
clack.log.step("Inference (chat) endpoint");
|
|
299
|
-
const infProvider = await clack.select({
|
|
300
|
-
message: "Inference provider type",
|
|
301
|
-
options: [
|
|
302
|
-
{
|
|
303
|
-
value: "openai-compatible",
|
|
304
|
-
label: "OpenAI-compatible",
|
|
305
|
-
hint: "Fireworks, Together, vLLM, etc.",
|
|
306
|
-
},
|
|
307
|
-
{
|
|
308
|
-
value: "anthropic-direct",
|
|
309
|
-
label: "Anthropic",
|
|
310
|
-
hint: "Claude API",
|
|
311
|
-
},
|
|
312
|
-
{ value: "ollama", label: "Ollama", hint: "Local Ollama" },
|
|
313
|
-
],
|
|
314
|
-
});
|
|
315
|
-
if (clack.isCancel(infProvider)) {
|
|
316
|
-
clack.cancel("Setup cancelled.");
|
|
317
|
-
return null;
|
|
318
|
-
}
|
|
319
|
-
const infBaseUrl = await clack.text({
|
|
320
|
-
message: "Inference API base URL",
|
|
321
|
-
placeholder: infProvider === "anthropic-direct"
|
|
322
|
-
? "https://api.anthropic.com"
|
|
323
|
-
: infProvider === "ollama"
|
|
324
|
-
? "http://localhost:11434"
|
|
325
|
-
: "https://api.fireworks.ai/inference/v1",
|
|
326
|
-
});
|
|
327
|
-
if (clack.isCancel(infBaseUrl)) {
|
|
328
|
-
clack.cancel("Setup cancelled.");
|
|
329
|
-
return null;
|
|
330
|
-
}
|
|
331
|
-
const infApiKey = await clack.password({
|
|
332
|
-
message: "Inference API key (leave empty if none)",
|
|
333
|
-
});
|
|
334
|
-
if (clack.isCancel(infApiKey)) {
|
|
335
|
-
clack.cancel("Setup cancelled.");
|
|
336
|
-
return null;
|
|
337
|
-
}
|
|
338
|
-
const infModel = await clack.text({
|
|
339
|
-
message: "Chat/inference model name",
|
|
340
|
-
placeholder: "llama3",
|
|
341
|
-
defaultValue: "llama3",
|
|
342
|
-
});
|
|
343
|
-
if (clack.isCancel(infModel)) {
|
|
344
|
-
clack.cancel("Setup cancelled.");
|
|
345
|
-
return null;
|
|
346
|
-
}
|
|
347
|
-
return {
|
|
348
|
-
provider: "openai-compatible",
|
|
349
|
-
embedding: {
|
|
350
|
-
provider: "openai-compatible",
|
|
351
|
-
baseUrl: embBaseUrl,
|
|
352
|
-
model: embModel,
|
|
353
|
-
...(embApiKey ? { apiKey: embApiKey } : {}),
|
|
354
|
-
},
|
|
355
|
-
inference: {
|
|
356
|
-
provider: infProvider,
|
|
357
|
-
baseUrl: infBaseUrl,
|
|
358
|
-
model: infModel,
|
|
359
|
-
...(infApiKey ? { apiKey: infApiKey } : {}),
|
|
360
|
-
},
|
|
361
|
-
};
|
|
362
|
-
}
|
|
363
|
-
/** @internal Retained for future LLM config re-enablement. */
|
|
364
|
-
export async function configureOpenAI() {
|
|
365
|
-
const apiKey = await clack.password({
|
|
366
|
-
message: "OpenAI API key",
|
|
367
|
-
});
|
|
368
|
-
if (clack.isCancel(apiKey)) {
|
|
369
|
-
clack.cancel("Setup cancelled.");
|
|
370
|
-
return null;
|
|
371
|
-
}
|
|
372
|
-
const embeddingModel = await clack.select({
|
|
373
|
-
message: "Embedding model",
|
|
374
|
-
options: [
|
|
375
|
-
{
|
|
376
|
-
value: "text-embedding-3-small",
|
|
377
|
-
label: "text-embedding-3-small",
|
|
378
|
-
hint: "Fast, cheap",
|
|
379
|
-
},
|
|
380
|
-
{
|
|
381
|
-
value: "text-embedding-3-large",
|
|
382
|
-
label: "text-embedding-3-large",
|
|
383
|
-
hint: "Best quality",
|
|
384
|
-
},
|
|
385
|
-
],
|
|
386
|
-
});
|
|
387
|
-
if (clack.isCancel(embeddingModel)) {
|
|
388
|
-
clack.cancel("Setup cancelled.");
|
|
389
|
-
return null;
|
|
390
|
-
}
|
|
391
|
-
return {
|
|
392
|
-
provider: "openai-compatible",
|
|
393
|
-
baseUrl: "https://api.openai.com/v1",
|
|
394
|
-
apiKey: apiKey,
|
|
395
|
-
embeddingModel: embeddingModel,
|
|
396
|
-
chatModel: "gpt-4o",
|
|
397
|
-
};
|
|
398
|
-
}
|
|
399
|
-
/** @internal Retained for future LLM config re-enablement. */
|
|
400
|
-
export async function configureAnthropic() {
|
|
401
|
-
const apiKey = await clack.password({
|
|
402
|
-
message: "Anthropic API key",
|
|
403
|
-
});
|
|
404
|
-
if (clack.isCancel(apiKey)) {
|
|
405
|
-
clack.cancel("Setup cancelled.");
|
|
406
|
-
return null;
|
|
407
|
-
}
|
|
408
|
-
clack.log.info("Note: Anthropic has no embedding API. Semantic search will use text matching.");
|
|
409
|
-
return {
|
|
410
|
-
provider: "anthropic-direct",
|
|
411
|
-
apiKey: apiKey,
|
|
412
|
-
chatModel: "claude-sonnet-4-20250514",
|
|
413
|
-
};
|
|
414
|
-
}
|
package/dist/commands/skills.js
DELETED
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* unerr skills — Skill download & installation.
|
|
3
|
-
*
|
|
4
|
-
* Installs skills from bundled and local directories into IDE-specific locations.
|
|
5
|
-
*
|
|
6
|
-
* Skill destinations:
|
|
7
|
-
* - Claude Code: .claude/skills/{name}.md (project-level)
|
|
8
|
-
* - Cursor: .cursor/rules/{name}.mdc (as always-on rules)
|
|
9
|
-
* - VS Code: .github/copilot/{name}.md
|
|
10
|
-
* - Windsurf: embedded in .windsurfrules
|
|
11
|
-
* - Zed: .zed/rules/{name}.md
|
|
12
|
-
*
|
|
13
|
-
* Usage:
|
|
14
|
-
* unerr skills install — Install recommended skills for detected IDE
|
|
15
|
-
* unerr skills list — List installed skills
|
|
16
|
-
*/
|
|
17
|
-
import { blank, detail, info, pc, section, success } from "../utils/ui.js";
|
|
18
|
-
// ── CLI Command ─────────────────────────────────────────────────────
|
|
19
|
-
export function registerSkillsCommand(program) {
|
|
20
|
-
const skillsCmd = program
|
|
21
|
-
.command("skills")
|
|
22
|
-
.description("Manage unerr skills for your coding agent");
|
|
23
|
-
skillsCmd
|
|
24
|
-
.command("install")
|
|
25
|
-
.description("Download and install recommended skills")
|
|
26
|
-
.option("--ide <ide>", "IDE type (auto-detected if not specified)")
|
|
27
|
-
.action(async (opts) => {
|
|
28
|
-
const { detectIde } = await import("../utils/detect.js");
|
|
29
|
-
const { resolveAndInstallSkills } = await import("../skills/resolver.js");
|
|
30
|
-
const cwd = process.cwd();
|
|
31
|
-
const ide = opts.ide ?? (await detectIde(cwd));
|
|
32
|
-
section("Installing skills (bundled + local)...");
|
|
33
|
-
const result = await resolveAndInstallSkills({
|
|
34
|
-
ide,
|
|
35
|
-
cwd,
|
|
36
|
-
});
|
|
37
|
-
if (result.installed.length > 0) {
|
|
38
|
-
success(`Installed ${result.installed.length} skill${result.installed.length === 1 ? "" : "s"} (source: ${result.source}): ${result.installed.map((n) => pc.bold(n)).join(", ")}`);
|
|
39
|
-
}
|
|
40
|
-
else {
|
|
41
|
-
detail("No skills available.");
|
|
42
|
-
}
|
|
43
|
-
});
|
|
44
|
-
skillsCmd
|
|
45
|
-
.command("list")
|
|
46
|
-
.description("List installed skills")
|
|
47
|
-
.action(async () => {
|
|
48
|
-
const { detectIde } = await import("../utils/detect.js");
|
|
49
|
-
const { listInstalledSkills } = await import("../skills/resolver.js");
|
|
50
|
-
const cwd = process.cwd();
|
|
51
|
-
const ide = await detectIde(cwd);
|
|
52
|
-
const skills = listInstalledSkills(ide, cwd);
|
|
53
|
-
if (skills.length === 0) {
|
|
54
|
-
info("No unerr skills installed.");
|
|
55
|
-
info(`Run ${pc.cyan("unerr skills install")} to get started.`);
|
|
56
|
-
return;
|
|
57
|
-
}
|
|
58
|
-
section(`Installed skills (${skills.length}):`);
|
|
59
|
-
for (const skill of skills) {
|
|
60
|
-
info(` ${pc.bold(skill.name)} ${pc.dim(skill.path)}`);
|
|
61
|
-
}
|
|
62
|
-
blank();
|
|
63
|
-
});
|
|
64
|
-
}
|
package/dist/commands/stats.js
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* unerr stats — Show weekly and all-time savings with mechanism breakdown.
|
|
3
|
-
*
|
|
4
|
-
* S8.8 + Layer 10 TF-C.6: Reads ~/.unerr/stats.json and displays formatted
|
|
5
|
-
* report including per-mechanism token attribution.
|
|
6
|
-
*/
|
|
7
|
-
import { formatStatsReport, loadStats, } from "../tracking/weekly-accumulator.js";
|
|
8
|
-
export function registerStatsCommand(program) {
|
|
9
|
-
program
|
|
10
|
-
.command("stats")
|
|
11
|
-
.description("Show weekly and all-time token savings with mechanism breakdown")
|
|
12
|
-
.action(() => {
|
|
13
|
-
const stats = loadStats();
|
|
14
|
-
if (stats.allTime.totalSessions === 0) {
|
|
15
|
-
process.stderr.write("\n No sessions recorded yet. Start using unerr to see stats.\n\n");
|
|
16
|
-
return;
|
|
17
|
-
}
|
|
18
|
-
process.stderr.write(formatStatsReport(stats));
|
|
19
|
-
});
|
|
20
|
-
}
|