@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,193 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* unerr manifest — Workspace manifest inspection & CI gate.
|
|
3
|
-
*
|
|
4
|
-
* Subcommands:
|
|
5
|
-
* unerr manifest check — CI gate: fail if un-attributed AI commits exist
|
|
6
|
-
* unerr manifest status — Show manifest stats (total, unflushed, last flush)
|
|
7
|
-
* unerr manifest list — Show recent attribution records
|
|
8
|
-
*
|
|
9
|
-
* Exit codes:
|
|
10
|
-
* 0 — All commits have intent attribution
|
|
11
|
-
* 1 — Un-attributed commits detected (CI should block merge)
|
|
12
|
-
* 2 — No manifest found / not in a git repo
|
|
13
|
-
*/
|
|
14
|
-
import { existsSync, readFileSync } from "node:fs";
|
|
15
|
-
import { join } from "node:path";
|
|
16
|
-
import { gitQuery } from "../utils/exec.js";
|
|
17
|
-
async function findRepoRoot() {
|
|
18
|
-
return gitQuery(["rev-parse", "--show-toplevel"]);
|
|
19
|
-
}
|
|
20
|
-
function loadManifest(repoRoot) {
|
|
21
|
-
const manifestPath = join(repoRoot, ".unerr", "manifest.json");
|
|
22
|
-
if (!existsSync(manifestPath))
|
|
23
|
-
return null;
|
|
24
|
-
try {
|
|
25
|
-
const raw = readFileSync(manifestPath, "utf-8");
|
|
26
|
-
return JSON.parse(raw);
|
|
27
|
-
}
|
|
28
|
-
catch {
|
|
29
|
-
return null;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
async function _getRecentCommits(repoRoot, count) {
|
|
33
|
-
const output = await gitQuery(["log", "--format=%H", "-n", String(count)], repoRoot);
|
|
34
|
-
if (!output)
|
|
35
|
-
return [];
|
|
36
|
-
return output.split("\n").filter(Boolean);
|
|
37
|
-
}
|
|
38
|
-
async function getBranchCommits(repoRoot, baseBranch) {
|
|
39
|
-
const output = await gitQuery(["log", "--format=%H", `${baseBranch}..HEAD`], repoRoot);
|
|
40
|
-
if (!output)
|
|
41
|
-
return [];
|
|
42
|
-
return output.split("\n").filter(Boolean);
|
|
43
|
-
}
|
|
44
|
-
export function registerManifestCommand(program) {
|
|
45
|
-
const manifest = program
|
|
46
|
-
.command("manifest")
|
|
47
|
-
.description("Workspace manifest inspection & CI gate");
|
|
48
|
-
// ── unerr manifest check ──────────────────────────────────────────
|
|
49
|
-
manifest
|
|
50
|
-
.command("check")
|
|
51
|
-
.description("CI gate: verify all commits have intent attribution")
|
|
52
|
-
.option("--base <branch>", "Base branch to compare against (default: main)")
|
|
53
|
-
.option("--strict", "Fail if any commit lacks attribution (default)")
|
|
54
|
-
.option("--warn", "Warn instead of failing for un-attributed commits")
|
|
55
|
-
.action(async (opts) => {
|
|
56
|
-
const repoRoot = await findRepoRoot();
|
|
57
|
-
if (!repoRoot) {
|
|
58
|
-
console.error("[unerr] Not in a git repository.");
|
|
59
|
-
process.exit(2);
|
|
60
|
-
}
|
|
61
|
-
const manifest = loadManifest(repoRoot);
|
|
62
|
-
if (!manifest) {
|
|
63
|
-
console.error("[unerr] No manifest found at .unerr/manifest.json");
|
|
64
|
-
console.error("[unerr] Run 'unerr' in this repo to start recording attributions.");
|
|
65
|
-
process.exit(2);
|
|
66
|
-
}
|
|
67
|
-
const baseBranch = opts.base ?? "main";
|
|
68
|
-
const commits = await getBranchCommits(repoRoot, baseBranch);
|
|
69
|
-
if (commits.length === 0) {
|
|
70
|
-
console.error("[unerr] No commits found between HEAD and", baseBranch);
|
|
71
|
-
process.exit(0);
|
|
72
|
-
}
|
|
73
|
-
const attributedShas = new Set(manifest.records.map((r) => r.commitSha));
|
|
74
|
-
const unattributed = [];
|
|
75
|
-
const attributed = [];
|
|
76
|
-
for (const sha of commits) {
|
|
77
|
-
if (attributedShas.has(sha)) {
|
|
78
|
-
attributed.push(sha);
|
|
79
|
-
}
|
|
80
|
-
else {
|
|
81
|
-
unattributed.push(sha);
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
const total = commits.length;
|
|
85
|
-
const pct = total > 0 ? Math.round((attributed.length / total) * 100) : 100;
|
|
86
|
-
console.error(`[unerr] Manifest check: ${baseBranch}..HEAD`);
|
|
87
|
-
console.error(`[unerr] Commits: ${total}`);
|
|
88
|
-
console.error(`[unerr] Attributed: ${attributed.length} (${pct}%)`);
|
|
89
|
-
console.error(`[unerr] Unattributed: ${unattributed.length}`);
|
|
90
|
-
if (unattributed.length > 0) {
|
|
91
|
-
console.error("");
|
|
92
|
-
console.error("[unerr] Un-attributed commits:");
|
|
93
|
-
for (const sha of unattributed.slice(0, 10)) {
|
|
94
|
-
const msg = await gitQuery(["log", "--format=%s", "-n", "1", sha], repoRoot);
|
|
95
|
-
if (msg) {
|
|
96
|
-
console.error(` ${sha.slice(0, 10)} ${msg}`);
|
|
97
|
-
}
|
|
98
|
-
else {
|
|
99
|
-
console.error(` ${sha.slice(0, 10)}`);
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
if (unattributed.length > 10) {
|
|
103
|
-
console.error(` ... and ${unattributed.length - 10} more`);
|
|
104
|
-
}
|
|
105
|
-
if (opts.warn) {
|
|
106
|
-
console.error("");
|
|
107
|
-
console.error("[unerr] Warning: un-attributed commits detected (--warn mode)");
|
|
108
|
-
process.exit(0);
|
|
109
|
-
}
|
|
110
|
-
else {
|
|
111
|
-
console.error("");
|
|
112
|
-
console.error("[unerr] FAILED: un-attributed AI commits detected.");
|
|
113
|
-
console.error("[unerr] Ensure all AI-assisted changes are committed while 'unerr' is running.");
|
|
114
|
-
process.exit(1);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
else {
|
|
118
|
-
console.error("");
|
|
119
|
-
console.error("[unerr] All commits have intent attribution.");
|
|
120
|
-
process.exit(0);
|
|
121
|
-
}
|
|
122
|
-
});
|
|
123
|
-
// ── unerr manifest status ─────────────────────────────────────────
|
|
124
|
-
manifest
|
|
125
|
-
.command("status")
|
|
126
|
-
.description("Show manifest stats")
|
|
127
|
-
.action(async () => {
|
|
128
|
-
const repoRoot = await findRepoRoot();
|
|
129
|
-
if (!repoRoot) {
|
|
130
|
-
console.error("[unerr] Not in a git repository.");
|
|
131
|
-
process.exit(2);
|
|
132
|
-
}
|
|
133
|
-
const manifest = loadManifest(repoRoot);
|
|
134
|
-
if (!manifest) {
|
|
135
|
-
console.error("[unerr] No manifest found at .unerr/manifest.json");
|
|
136
|
-
process.exit(2);
|
|
137
|
-
}
|
|
138
|
-
const unflushed = manifest.records.filter((r) => !r.flushed).length;
|
|
139
|
-
const flushed = manifest.records.filter((r) => r.flushed).length;
|
|
140
|
-
console.error("[unerr] Manifest Status");
|
|
141
|
-
console.error(` Repo: ${manifest.repoId}`);
|
|
142
|
-
console.error(` Version: ${manifest.version}`);
|
|
143
|
-
console.error(` Records: ${manifest.records.length}`);
|
|
144
|
-
console.error(` Flushed: ${flushed}`);
|
|
145
|
-
console.error(` Unflushed: ${unflushed}`);
|
|
146
|
-
console.error(` Total flushed: ${manifest.totalFlushed}`);
|
|
147
|
-
console.error(` Last flush: ${manifest.lastFlushedAt ?? "Never"}`);
|
|
148
|
-
});
|
|
149
|
-
// ── unerr manifest list ───────────────────────────────────────────
|
|
150
|
-
manifest
|
|
151
|
-
.command("list")
|
|
152
|
-
.description("Show recent attribution records")
|
|
153
|
-
.option("-n, --count <n>", "Number of records to show", "10")
|
|
154
|
-
.option("--unflushed", "Only show unflushed records")
|
|
155
|
-
.action(async (opts) => {
|
|
156
|
-
const repoRoot = await findRepoRoot();
|
|
157
|
-
if (!repoRoot) {
|
|
158
|
-
console.error("[unerr] Not in a git repository.");
|
|
159
|
-
process.exit(2);
|
|
160
|
-
}
|
|
161
|
-
const manifest = loadManifest(repoRoot);
|
|
162
|
-
if (!manifest) {
|
|
163
|
-
console.error("[unerr] No manifest found at .unerr/manifest.json");
|
|
164
|
-
process.exit(2);
|
|
165
|
-
}
|
|
166
|
-
let records = manifest.records;
|
|
167
|
-
if (opts.unflushed) {
|
|
168
|
-
records = records.filter((r) => !r.flushed);
|
|
169
|
-
}
|
|
170
|
-
const count = Number.parseInt(opts.count, 10) || 10;
|
|
171
|
-
const recent = records.slice(-count);
|
|
172
|
-
if (recent.length === 0) {
|
|
173
|
-
console.error("[unerr] No records found.");
|
|
174
|
-
return;
|
|
175
|
-
}
|
|
176
|
-
console.error(`[unerr] ${recent.length} attribution record(s):`);
|
|
177
|
-
console.error("");
|
|
178
|
-
for (const record of recent) {
|
|
179
|
-
const flushedMark = record.flushed ? " " : "* ";
|
|
180
|
-
const sha = record.commitSha.slice(0, 8);
|
|
181
|
-
const prompt = record.prompt.length > 60
|
|
182
|
-
? `${record.prompt.slice(0, 57)}...`
|
|
183
|
-
: record.prompt;
|
|
184
|
-
const tools = record.toolChain.slice(0, 3).join(" → ");
|
|
185
|
-
const files = record.filesChanged.length;
|
|
186
|
-
console.error(`${flushedMark}${sha} ${prompt}`);
|
|
187
|
-
console.error(` Tools: ${tools || "—"}`);
|
|
188
|
-
console.error(` Files: ${files} changed Branch: ${record.branch}`);
|
|
189
|
-
console.error(` At: ${record.committedAt} ${record.flushed ? "(flushed)" : "(pending)"}`);
|
|
190
|
-
console.error("");
|
|
191
|
-
}
|
|
192
|
-
});
|
|
193
|
-
}
|
package/dist/commands/rewind.js
DELETED
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
import * as path from "node:path";
|
|
2
|
-
export function registerRewindCommand(program) {
|
|
3
|
-
program
|
|
4
|
-
.command("rewind <entry-id>")
|
|
5
|
-
.description("Rewind to a previous working state")
|
|
6
|
-
.option("--dry-run", "Only show blast radius without making changes")
|
|
7
|
-
.action(async (entryId, opts) => {
|
|
8
|
-
try {
|
|
9
|
-
const unerrDir = path.join(process.cwd(), ".unerr");
|
|
10
|
-
await handleOfflineRewind(entryId, unerrDir, opts.dryRun ?? false);
|
|
11
|
-
}
|
|
12
|
-
catch (error) {
|
|
13
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
14
|
-
console.error(`Error: ${message}`);
|
|
15
|
-
process.exit(1);
|
|
16
|
-
}
|
|
17
|
-
});
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Handle rewind using local CozoDB graph + git.
|
|
21
|
-
*/
|
|
22
|
-
async function handleOfflineRewind(entryId, unerrDir, dryRun) {
|
|
23
|
-
// Lazy-load CozoDB modules (heavy, only when needed)
|
|
24
|
-
const { offlineRewind } = await import("../tracking/offline-rewind.js");
|
|
25
|
-
const { ShadowLedger } = await import("../tracking/shadow-ledger.js");
|
|
26
|
-
// Load local graph
|
|
27
|
-
const graphDbPath = path.join(unerrDir, "graph");
|
|
28
|
-
let graph;
|
|
29
|
-
try {
|
|
30
|
-
const { CozoDb } = (await import("cozo-node"));
|
|
31
|
-
const { CozoGraphStore } = await import("../intelligence/local-graph.js");
|
|
32
|
-
const db = new CozoDb("sqlite", path.join(graphDbPath, "local.cozo"));
|
|
33
|
-
graph = await CozoGraphStore.create(db);
|
|
34
|
-
}
|
|
35
|
-
catch {
|
|
36
|
-
console.error("Local graph not available. Run: unerr index");
|
|
37
|
-
process.exit(1);
|
|
38
|
-
}
|
|
39
|
-
const ledger = new ShadowLedger(unerrDir);
|
|
40
|
-
console.log(dryRun
|
|
41
|
-
? "Dry Run — computing blast radius locally..."
|
|
42
|
-
: "Rewind — using local graph...");
|
|
43
|
-
const result = await offlineRewind({
|
|
44
|
-
targetEntryId: entryId,
|
|
45
|
-
cwd: process.cwd(),
|
|
46
|
-
unerrDir,
|
|
47
|
-
graph,
|
|
48
|
-
ledger,
|
|
49
|
-
dryRun,
|
|
50
|
-
});
|
|
51
|
-
if (result.status === "error") {
|
|
52
|
-
console.error(`Error: ${result.errorMessage}`);
|
|
53
|
-
process.exit(1);
|
|
54
|
-
}
|
|
55
|
-
if (result.status === "dry_run") {
|
|
56
|
-
console.log("\nDry Run — Blast Radius (CozoDB):");
|
|
57
|
-
console.log(` Safe files: ${result.blastRadius.safeFiles.length}`);
|
|
58
|
-
console.log(` Conflicted: ${result.blastRadius.conflictedFiles.length}`);
|
|
59
|
-
console.log(` Affected entities: ${result.blastRadius.affectedEntities.length}`);
|
|
60
|
-
console.log(` Affected callers: ${result.blastRadius.affectedCallers}`);
|
|
61
|
-
console.log(` Resolved in: ${result.blastRadius.resolvedInMs}ms`);
|
|
62
|
-
if (result.blastRadius.conflictedFiles.length > 0) {
|
|
63
|
-
console.log("\n Conflicted files:");
|
|
64
|
-
for (const f of result.blastRadius.conflictedFiles) {
|
|
65
|
-
console.log(` - ${f.filePath}: ${f.reason}`);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
if (result.blastRadius.affectedEntities.filter((e) => e.riskLevel === "high")
|
|
69
|
-
.length > 0) {
|
|
70
|
-
console.log("\n High-risk entities:");
|
|
71
|
-
for (const e of result.blastRadius.affectedEntities.filter((e) => e.riskLevel === "high")) {
|
|
72
|
-
console.log(` - ${e.name} (${e.filePath})`);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
return;
|
|
76
|
-
}
|
|
77
|
-
// Rewind applied
|
|
78
|
-
console.log("\nRewind complete");
|
|
79
|
-
console.log(` Timeline branch: ${result.timelineBranch}`);
|
|
80
|
-
console.log(` Entries reverted: ${result.entriesReverted}`);
|
|
81
|
-
console.log(` Files restored: ${result.filesRestored.length}`);
|
|
82
|
-
console.log(` Rewind entry: ${result.rewindEntryId}`);
|
|
83
|
-
console.log(` Blast radius resolved in: ${result.blastRadius.resolvedInMs}ms`);
|
|
84
|
-
if (result.filesRestored.length > 0) {
|
|
85
|
-
console.log("\n Restored files:");
|
|
86
|
-
for (const f of result.filesRestored) {
|
|
87
|
-
console.log(` - ${f}`);
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
// S7.7: Create timeline fork to record the abandoned path
|
|
91
|
-
if (result.rewindEntryId) {
|
|
92
|
-
try {
|
|
93
|
-
const { createTimelineFork } = await import("../tracking/timeline-fork.js");
|
|
94
|
-
const abandonedEntities = result.blastRadius.affectedEntities.map((e) => e.name ?? e.filePath);
|
|
95
|
-
const fork = createTimelineFork(result.rewindEntryId, abandonedEntities, [], // prompts not available at CLI level
|
|
96
|
-
`Rewind to ${entryId}`, unerrDir);
|
|
97
|
-
console.log(`\n Timeline fork: timeline ${fork.abandonedBranch.timelineId} → ${fork.newBranch.timelineId} (abandoned ${abandonedEntities.length} entities)`);
|
|
98
|
-
}
|
|
99
|
-
catch {
|
|
100
|
-
// Timeline fork is non-critical — don't block rewind output
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
}
|
package/dist/commands/serve.js
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* unerr serve — DEPRECATED. Now delegates to the unified proxy.
|
|
3
|
-
*
|
|
4
|
-
* Kept as hidden alias to preserve backward compatibility.
|
|
5
|
-
* The proxy (proxy.ts) handles all MCP server and graph loading duties.
|
|
6
|
-
*/
|
|
7
|
-
export function registerServeCommand(program) {
|
|
8
|
-
program
|
|
9
|
-
.command("serve")
|
|
10
|
-
.description("Start local MCP server (deprecated — use 'unerr')")
|
|
11
|
-
.option("--repo <repoId>", "Specific repo to serve")
|
|
12
|
-
.option("--prefetch", "Enable predictive context pre-fetching")
|
|
13
|
-
.option("--no-prefetch", "Disable predictive context pre-fetching")
|
|
14
|
-
.action(async (opts) => {
|
|
15
|
-
process.stderr.write("Note: 'unerr serve' is now handled by 'unerr'. Starting proxy...\n");
|
|
16
|
-
const { startProxy } = await import("../proxy/proxy.js");
|
|
17
|
-
await startProxy({ repoId: opts.repo, prefetch: opts.prefetch });
|
|
18
|
-
});
|
|
19
|
-
}
|