@unerr-ai/unerr 0.2.1 → 0.2.2
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 +6 -0
- package/dist/cli.js +37236 -35793
- package/package.json +1 -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
package/dist/utils/detect.js
DELETED
|
@@ -1,193 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Smart detection utilities for git host and IDE type.
|
|
3
|
-
*/
|
|
4
|
-
import { existsSync } from "node:fs";
|
|
5
|
-
import { join } from "node:path";
|
|
6
|
-
import { exec } from "./exec.js";
|
|
7
|
-
import { getCurrentBranch, getRemoteUrl, isGitRepo as isGitRepoGit, } from "./git.js";
|
|
8
|
-
/**
|
|
9
|
-
* Classify a git remote URL into a known host or "other".
|
|
10
|
-
*/
|
|
11
|
-
export function classifyHost(remote) {
|
|
12
|
-
const lower = remote.toLowerCase();
|
|
13
|
-
if (lower.includes("github.com"))
|
|
14
|
-
return "github";
|
|
15
|
-
if (lower.includes("gitlab.com") || lower.includes("gitlab."))
|
|
16
|
-
return "gitlab";
|
|
17
|
-
if (lower.includes("bitbucket.org") || lower.includes("bitbucket."))
|
|
18
|
-
return "bitbucket";
|
|
19
|
-
return "other";
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Parse a remote URL into owner/repo format.
|
|
23
|
-
*/
|
|
24
|
-
function parseRemote(remote) {
|
|
25
|
-
// git@github.com:owner/repo.git
|
|
26
|
-
const sshMatch = remote.match(/git@[^:]+:(.+?)(?:\.git)?$/);
|
|
27
|
-
if (sshMatch)
|
|
28
|
-
return sshMatch[1] ?? null;
|
|
29
|
-
// https://github.com/owner/repo.git
|
|
30
|
-
const httpMatch = remote.match(/(?:https?:\/\/)?(?:www\.)?[^/]+\/(.+?)(?:\.git)?$/);
|
|
31
|
-
if (httpMatch)
|
|
32
|
-
return httpMatch[1] ?? null;
|
|
33
|
-
return null;
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Detect full git context from the current working directory.
|
|
37
|
-
*/
|
|
38
|
-
export async function detectGitContext(cwd) {
|
|
39
|
-
try {
|
|
40
|
-
const dir = cwd ?? process.cwd();
|
|
41
|
-
const remote = await getRemoteUrl(dir);
|
|
42
|
-
if (!remote)
|
|
43
|
-
return null;
|
|
44
|
-
const branch = (await getCurrentBranch(dir)) || "main";
|
|
45
|
-
const fullName = parseRemote(remote);
|
|
46
|
-
if (!fullName)
|
|
47
|
-
return null;
|
|
48
|
-
const parts = fullName.split("/");
|
|
49
|
-
if (parts.length < 2)
|
|
50
|
-
return null;
|
|
51
|
-
return {
|
|
52
|
-
remote,
|
|
53
|
-
branch,
|
|
54
|
-
owner: parts[0] ?? "",
|
|
55
|
-
repo: parts[1] ?? "",
|
|
56
|
-
fullName,
|
|
57
|
-
host: classifyHost(remote),
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
catch {
|
|
61
|
-
return null;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Check if the current directory is inside a git repository.
|
|
66
|
-
*/
|
|
67
|
-
export async function isGitRepo(cwd) {
|
|
68
|
-
return isGitRepoGit(cwd ?? process.cwd());
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* Auto-detect the IDE from project directory and environment.
|
|
72
|
-
*
|
|
73
|
-
* Checks in order:
|
|
74
|
-
* 1. CURSOR_TRACE_ID env → Cursor terminal
|
|
75
|
-
* 2. TERM_PROGRAM=vscode + cursor extensions path → Cursor
|
|
76
|
-
* 3. CLAUDE_CODE env or "claude" process ancestry → Claude Code
|
|
77
|
-
* 4. .cursor/ directory in project → Cursor
|
|
78
|
-
* 5. .windsurf/ directory in project → Windsurf
|
|
79
|
-
* 6. TERM_PROGRAM=vscode → VS Code
|
|
80
|
-
* 7. .vscode/ directory in project → VS Code
|
|
81
|
-
* 8. "unknown" → will be prompted
|
|
82
|
-
*/
|
|
83
|
-
export async function detectIde(cwd) {
|
|
84
|
-
// Cursor sets CURSOR_TRACE_ID in its integrated terminal
|
|
85
|
-
if (process.env.CURSOR_TRACE_ID)
|
|
86
|
-
return "cursor";
|
|
87
|
-
// Claude Code sets CLAUDE_CODE or similar markers
|
|
88
|
-
if (process.env.CLAUDE_CODE === "1" || process.env.CLAUDE_CODE === "true")
|
|
89
|
-
return "claude-code";
|
|
90
|
-
// Check TERM_PROGRAM for VS Code-based editors
|
|
91
|
-
const termProgram = process.env.TERM_PROGRAM ?? "";
|
|
92
|
-
if (termProgram === "vscode") {
|
|
93
|
-
// Could be Cursor (fork of VS Code) — check for Cursor-specific paths
|
|
94
|
-
const cursorExtensions = process.env.VSCODE_CWD ?? "";
|
|
95
|
-
if (cursorExtensions.toLowerCase().includes("cursor"))
|
|
96
|
-
return "cursor";
|
|
97
|
-
}
|
|
98
|
-
// Check for Claude Code in process ancestry
|
|
99
|
-
try {
|
|
100
|
-
const ppid = process.ppid;
|
|
101
|
-
if (ppid) {
|
|
102
|
-
const result = await exec("ps", ["-o", "comm=", "-p", String(ppid)]);
|
|
103
|
-
if (result.exitCode === 0 && result.stdout.includes("claude"))
|
|
104
|
-
return "claude-code";
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
catch {
|
|
108
|
-
// Ignore — process inspection may not be available
|
|
109
|
-
}
|
|
110
|
-
// Directory-based detection
|
|
111
|
-
if (existsSync(join(cwd, ".cursor")))
|
|
112
|
-
return "cursor";
|
|
113
|
-
if (existsSync(join(cwd, ".windsurf")))
|
|
114
|
-
return "windsurf";
|
|
115
|
-
if (termProgram === "vscode")
|
|
116
|
-
return "vscode";
|
|
117
|
-
if (existsSync(join(cwd, ".vscode")))
|
|
118
|
-
return "vscode";
|
|
119
|
-
// Zed: checks for .zed/ directory or ZED_TERM env
|
|
120
|
-
if (process.env.ZED_TERM === "true" || existsSync(join(cwd, ".zed")))
|
|
121
|
-
return "zed";
|
|
122
|
-
// Antigravity: checks for env vars or .antigravity/ directory
|
|
123
|
-
if (process.env.ANTIGRAVITY_PROJECT_DIR || process.env.ANTIGRAVITY_VERSION)
|
|
124
|
-
return "antigravity";
|
|
125
|
-
if (existsSync(join(cwd, ".antigravity")))
|
|
126
|
-
return "antigravity";
|
|
127
|
-
return "unknown";
|
|
128
|
-
}
|
|
129
|
-
/**
|
|
130
|
-
* Human-readable IDE name for display.
|
|
131
|
-
*/
|
|
132
|
-
export function ideDisplayName(ide) {
|
|
133
|
-
switch (ide) {
|
|
134
|
-
case "cursor":
|
|
135
|
-
return "Cursor";
|
|
136
|
-
case "claude-code":
|
|
137
|
-
return "Claude Code";
|
|
138
|
-
case "vscode":
|
|
139
|
-
return "VS Code";
|
|
140
|
-
case "windsurf":
|
|
141
|
-
return "Windsurf";
|
|
142
|
-
case "zed":
|
|
143
|
-
return "Zed";
|
|
144
|
-
case "cline":
|
|
145
|
-
return "Cline";
|
|
146
|
-
case "kiro":
|
|
147
|
-
return "Kiro";
|
|
148
|
-
case "gemini-cli":
|
|
149
|
-
return "Gemini CLI";
|
|
150
|
-
case "codex":
|
|
151
|
-
return "Codex";
|
|
152
|
-
case "aider":
|
|
153
|
-
return "Aider";
|
|
154
|
-
case "opencode":
|
|
155
|
-
return "OpenCode";
|
|
156
|
-
case "trae":
|
|
157
|
-
return "Trae";
|
|
158
|
-
case "augment":
|
|
159
|
-
return "Augment";
|
|
160
|
-
case "github-copilot-cli":
|
|
161
|
-
return "GitHub Copilot CLI";
|
|
162
|
-
case "continue":
|
|
163
|
-
return "Continue";
|
|
164
|
-
case "antigravity":
|
|
165
|
-
return "Google Antigravity";
|
|
166
|
-
case "other":
|
|
167
|
-
return "Other";
|
|
168
|
-
case "unknown":
|
|
169
|
-
return "your IDE";
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
/**
|
|
173
|
-
* All IDE choices for interactive prompt.
|
|
174
|
-
*/
|
|
175
|
-
export const IDE_CHOICES = [
|
|
176
|
-
{ title: "Cursor", value: "cursor" },
|
|
177
|
-
{ title: "Claude Code", value: "claude-code" },
|
|
178
|
-
{ title: "VS Code / Copilot", value: "vscode" },
|
|
179
|
-
{ title: "Windsurf", value: "windsurf" },
|
|
180
|
-
{ title: "Zed", value: "zed" },
|
|
181
|
-
{ title: "Cline", value: "cline" },
|
|
182
|
-
{ title: "Kiro", value: "kiro" },
|
|
183
|
-
{ title: "Gemini CLI", value: "gemini-cli" },
|
|
184
|
-
{ title: "Codex (OpenAI)", value: "codex" },
|
|
185
|
-
{ title: "Aider", value: "aider" },
|
|
186
|
-
{ title: "OpenCode", value: "opencode" },
|
|
187
|
-
{ title: "Trae", value: "trae" },
|
|
188
|
-
{ title: "Augment", value: "augment" },
|
|
189
|
-
{ title: "GitHub Copilot CLI", value: "github-copilot-cli" },
|
|
190
|
-
{ title: "Continue", value: "continue" },
|
|
191
|
-
{ title: "Google Antigravity", value: "antigravity" },
|
|
192
|
-
{ title: "Other (manual MCP setup)", value: "other" },
|
|
193
|
-
];
|
package/dist/utils/exec.js
DELETED
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Shell Execution Utility — tinyexec-based async command runner.
|
|
3
|
-
*
|
|
4
|
-
* Replaces all raw child_process.execSync / exec usage in the codebase.
|
|
5
|
-
* Provides type-safe, async, argument-array-based execution (no shell injection).
|
|
6
|
-
*
|
|
7
|
-
* For git operations specifically, prefer the higher-level helpers in git.ts
|
|
8
|
-
* which wrap simple-git. This module is for arbitrary shell commands and
|
|
9
|
-
* low-level git plumbing where simple-git's API doesn't reach.
|
|
10
|
-
*/
|
|
11
|
-
import { x } from "tinyexec";
|
|
12
|
-
/**
|
|
13
|
-
* Execute a command with args (no shell interpolation — safe by construction).
|
|
14
|
-
* Returns structured result. Throws only if throwOnError is true and exit code != 0.
|
|
15
|
-
*/
|
|
16
|
-
export async function exec(command, args = [], options = {}) {
|
|
17
|
-
const result = await x(command, args, {
|
|
18
|
-
nodeOptions: {
|
|
19
|
-
cwd: options.cwd,
|
|
20
|
-
timeout: options.timeout,
|
|
21
|
-
},
|
|
22
|
-
throwOnError: false,
|
|
23
|
-
});
|
|
24
|
-
const execResult = {
|
|
25
|
-
stdout: result.stdout.trim(),
|
|
26
|
-
stderr: result.stderr.trim(),
|
|
27
|
-
exitCode: result.exitCode ?? 0,
|
|
28
|
-
};
|
|
29
|
-
if (options.throwOnError && execResult.exitCode !== 0) {
|
|
30
|
-
const msg = execResult.stderr ||
|
|
31
|
-
execResult.stdout ||
|
|
32
|
-
`Command failed: ${command} ${args.join(" ")}`;
|
|
33
|
-
throw new Error(msg);
|
|
34
|
-
}
|
|
35
|
-
return execResult;
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Execute a git command. Convenience wrapper that prefixes args with the git subcommand.
|
|
39
|
-
*
|
|
40
|
-
* Example: gitExec(["rev-parse", "--is-inside-work-tree"], { cwd })
|
|
41
|
-
*/
|
|
42
|
-
export async function gitExec(args, options = {}) {
|
|
43
|
-
return exec("git", args, options);
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Quick git query — returns stdout as trimmed string.
|
|
47
|
-
* Returns null on non-zero exit code instead of throwing.
|
|
48
|
-
*/
|
|
49
|
-
export async function gitQuery(args, cwd) {
|
|
50
|
-
const result = await gitExec(args, { cwd });
|
|
51
|
-
return result.exitCode === 0 ? result.stdout : null;
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Open a `http(s):` URL in the system default browser (no shell interpolation).
|
|
55
|
-
* Localhost-only dashboard links use this from `unerr dashboard`.
|
|
56
|
-
*/
|
|
57
|
-
export async function openUrlInDefaultBrowser(url) {
|
|
58
|
-
if (!/^https?:\/\//i.test(url)) {
|
|
59
|
-
throw new Error("openUrlInDefaultBrowser: only http(s) URLs are allowed");
|
|
60
|
-
}
|
|
61
|
-
const platform = process.platform;
|
|
62
|
-
if (platform === "darwin") {
|
|
63
|
-
await exec("open", [url], { throwOnError: true });
|
|
64
|
-
return;
|
|
65
|
-
}
|
|
66
|
-
if (platform === "win32") {
|
|
67
|
-
await exec("rundll32", ["url.dll,FileProtocolHandler", url], {
|
|
68
|
-
throwOnError: true,
|
|
69
|
-
});
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
72
|
-
await exec("xdg-open", [url], { throwOnError: true });
|
|
73
|
-
}
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Layer 12 / DM-0: rotating stderr → file mirror.
|
|
3
|
-
*
|
|
4
|
-
* Tees every `process.stderr.write` call to a `.log` file on disk so the
|
|
5
|
-
* three Layer-12 processes (`unerrd`, `unerr`, `unerr --mcp`) still produce
|
|
6
|
-
* inspectable output when they leave the foreground (auto-spawn from DM-3,
|
|
7
|
-
* stdio-only IDE bridge, etc.).
|
|
8
|
-
*
|
|
9
|
-
* Rotation: when the current file passes `maxBytes`, rename `*.log` →
|
|
10
|
-
* `*.log.1` (shift the rest), keep the last `keep` files, drop the oldest.
|
|
11
|
-
*
|
|
12
|
-
* Independent of `startupLog`: that tool writes structured JSONL events
|
|
13
|
-
* (`unerr.jsonl`); this one mirrors the raw stderr byte stream (`*.log`).
|
|
14
|
-
*/
|
|
15
|
-
import { appendFileSync, existsSync, mkdirSync, renameSync, statSync, unlinkSync, } from "node:fs";
|
|
16
|
-
import { dirname } from "node:path";
|
|
17
|
-
// biome-ignore lint/suspicious/noControlCharactersInRegex: ANSI escape codes are control characters by definition.
|
|
18
|
-
const ANSI_RE = /\x1b\[[0-9;?]*[A-Za-z~]|\x1b\][^\x07]*\x07/g;
|
|
19
|
-
function stripAnsi(s) {
|
|
20
|
-
return s.replace(ANSI_RE, "");
|
|
21
|
-
}
|
|
22
|
-
function rotate(filePath, keep) {
|
|
23
|
-
for (let i = keep; i >= 1; i--) {
|
|
24
|
-
const cur = i === 1 ? filePath : `${filePath}.${i - 1}`;
|
|
25
|
-
const next = `${filePath}.${i}`;
|
|
26
|
-
if (!existsSync(cur))
|
|
27
|
-
continue;
|
|
28
|
-
if (i === keep && existsSync(next)) {
|
|
29
|
-
try {
|
|
30
|
-
unlinkSync(next);
|
|
31
|
-
}
|
|
32
|
-
catch {
|
|
33
|
-
/* best effort */
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
try {
|
|
37
|
-
renameSync(cur, next);
|
|
38
|
-
}
|
|
39
|
-
catch {
|
|
40
|
-
/* best effort */
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Mirror `process.stderr.write` to `filePath` with ANSI codes stripped.
|
|
46
|
-
* Returns an uninstaller that restores the original `stderr.write`.
|
|
47
|
-
*
|
|
48
|
-
* Side effects: ensures `dirname(filePath)` exists, opens the file in append
|
|
49
|
-
* mode, never closes it (process lifetime). Terminal stderr is unchanged —
|
|
50
|
-
* the original colored bytes still reach the TTY.
|
|
51
|
-
*/
|
|
52
|
-
export function installFileLogger(opts) {
|
|
53
|
-
const { filePath, maxBytes = 5_000_000, keep = 5 } = opts;
|
|
54
|
-
mkdirSync(dirname(filePath), { recursive: true });
|
|
55
|
-
let bytesWritten = 0;
|
|
56
|
-
try {
|
|
57
|
-
bytesWritten = statSync(filePath).size;
|
|
58
|
-
}
|
|
59
|
-
catch {
|
|
60
|
-
/* file doesn't exist yet */
|
|
61
|
-
}
|
|
62
|
-
const original = process.stderr.write;
|
|
63
|
-
const bound = original.bind(process.stderr);
|
|
64
|
-
const wrapped = ((chunk, ...rest) => {
|
|
65
|
-
const result = bound(chunk, ...rest);
|
|
66
|
-
try {
|
|
67
|
-
const text = typeof chunk === "string"
|
|
68
|
-
? chunk
|
|
69
|
-
: Buffer.from(chunk).toString("utf-8");
|
|
70
|
-
const clean = stripAnsi(text);
|
|
71
|
-
appendFileSync(filePath, clean);
|
|
72
|
-
bytesWritten += clean.length;
|
|
73
|
-
if (bytesWritten >= maxBytes) {
|
|
74
|
-
rotate(filePath, keep);
|
|
75
|
-
bytesWritten = 0;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
catch {
|
|
79
|
-
/* file logging is best-effort — never block stderr */
|
|
80
|
-
}
|
|
81
|
-
return result;
|
|
82
|
-
});
|
|
83
|
-
process.stderr.write = wrapped;
|
|
84
|
-
return () => {
|
|
85
|
-
process.stderr.write = original;
|
|
86
|
-
};
|
|
87
|
-
}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Serialize an unknown caught value into a stable, human-readable string.
|
|
3
|
-
*
|
|
4
|
-
* Why: `String(obj)` returns `"[object Object]"` for plain objects (e.g.,
|
|
5
|
-
* cozo-node driver errors that aren't Error instances), which is useless in
|
|
6
|
-
* logs. `JSON.stringify(obj)` returns `"{}"` when an object's properties
|
|
7
|
-
* are non-enumerable. This helper handles all three shapes deterministically.
|
|
8
|
-
*/
|
|
9
|
-
export function formatUnknownError(err) {
|
|
10
|
-
if (err instanceof Error)
|
|
11
|
-
return err.stack ?? err.message;
|
|
12
|
-
if (typeof err === "object" && err !== null) {
|
|
13
|
-
const obj = err;
|
|
14
|
-
if (typeof obj.display === "string")
|
|
15
|
-
return obj.display;
|
|
16
|
-
if (typeof obj.message === "string")
|
|
17
|
-
return obj.message;
|
|
18
|
-
try {
|
|
19
|
-
const serialized = JSON.stringify(err, Object.getOwnPropertyNames(err));
|
|
20
|
-
if (serialized && serialized !== "{}")
|
|
21
|
-
return serialized;
|
|
22
|
-
}
|
|
23
|
-
catch {
|
|
24
|
-
// fall through
|
|
25
|
-
}
|
|
26
|
-
return Object.prototype.toString.call(err);
|
|
27
|
-
}
|
|
28
|
-
return String(err);
|
|
29
|
-
}
|
package/dist/utils/git.js
DELETED
|
@@ -1,181 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Centralized Git Utility — simple-git based.
|
|
3
|
-
*
|
|
4
|
-
* Provides a single factory for creating git instances and typed helpers
|
|
5
|
-
* for common operations used throughout the codebase.
|
|
6
|
-
*
|
|
7
|
-
* Design notes (temporal intelligence foundation):
|
|
8
|
-
* - Git log queries return structured data for bi-temporal edge construction.
|
|
9
|
-
* - Blame/history helpers enable "when did this fact become true?" queries.
|
|
10
|
-
* - Instance caching avoids re-initialization overhead on hot paths.
|
|
11
|
-
*/
|
|
12
|
-
import { simpleGit } from "simple-git";
|
|
13
|
-
const instanceCache = new Map();
|
|
14
|
-
/**
|
|
15
|
-
* Get a simple-git instance for a working directory.
|
|
16
|
-
* Instances are cached per cwd to avoid repeated initialization.
|
|
17
|
-
*/
|
|
18
|
-
export function getGit(cwd) {
|
|
19
|
-
const cached = instanceCache.get(cwd);
|
|
20
|
-
if (cached)
|
|
21
|
-
return cached;
|
|
22
|
-
const opts = {
|
|
23
|
-
baseDir: cwd,
|
|
24
|
-
binary: "git",
|
|
25
|
-
maxConcurrentProcesses: 6,
|
|
26
|
-
trimmed: true,
|
|
27
|
-
};
|
|
28
|
-
const instance = simpleGit(opts);
|
|
29
|
-
instanceCache.set(cwd, instance);
|
|
30
|
-
return instance;
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Clear the instance cache (for testing or after cwd changes).
|
|
34
|
-
*/
|
|
35
|
-
export function clearGitCache() {
|
|
36
|
-
instanceCache.clear();
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Check if a directory is inside a git work tree.
|
|
40
|
-
*/
|
|
41
|
-
export async function isGitRepo(cwd) {
|
|
42
|
-
try {
|
|
43
|
-
const git = getGit(cwd);
|
|
44
|
-
await git.revparse(["--is-inside-work-tree"]);
|
|
45
|
-
return true;
|
|
46
|
-
}
|
|
47
|
-
catch {
|
|
48
|
-
return false;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Get the current HEAD commit SHA.
|
|
53
|
-
*/
|
|
54
|
-
export async function getHeadSha(cwd) {
|
|
55
|
-
try {
|
|
56
|
-
const git = getGit(cwd);
|
|
57
|
-
return await git.revparse(["HEAD"]);
|
|
58
|
-
}
|
|
59
|
-
catch {
|
|
60
|
-
return null;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Get the current branch name.
|
|
65
|
-
*/
|
|
66
|
-
export async function getCurrentBranch(cwd) {
|
|
67
|
-
try {
|
|
68
|
-
const git = getGit(cwd);
|
|
69
|
-
return await git.revparse(["--abbrev-ref", "HEAD"]);
|
|
70
|
-
}
|
|
71
|
-
catch {
|
|
72
|
-
return null;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* Get the remote origin URL.
|
|
77
|
-
*/
|
|
78
|
-
export async function getRemoteUrl(cwd) {
|
|
79
|
-
try {
|
|
80
|
-
const git = getGit(cwd);
|
|
81
|
-
const remotes = await git.getRemotes(true);
|
|
82
|
-
const origin = remotes.find((r) => r.name === "origin");
|
|
83
|
-
return origin?.refs.fetch ?? null;
|
|
84
|
-
}
|
|
85
|
-
catch {
|
|
86
|
-
return null;
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* Get files changed between two refs.
|
|
91
|
-
*/
|
|
92
|
-
export async function getChangedFiles(cwd, fromRef, toRef) {
|
|
93
|
-
try {
|
|
94
|
-
const git = getGit(cwd);
|
|
95
|
-
const diff = await git.diff(["--name-only", `${fromRef}..${toRef}`]);
|
|
96
|
-
return diff
|
|
97
|
-
.split("\n")
|
|
98
|
-
.map((f) => f.trim())
|
|
99
|
-
.filter(Boolean);
|
|
100
|
-
}
|
|
101
|
-
catch {
|
|
102
|
-
return [];
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* Restore a file to a specific ref's version.
|
|
107
|
-
*/
|
|
108
|
-
export async function checkoutFile(cwd, ref, filePath) {
|
|
109
|
-
const git = getGit(cwd);
|
|
110
|
-
await git.checkout([ref, "--", filePath]);
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* Get staged file names (for pre-commit hooks).
|
|
114
|
-
*/
|
|
115
|
-
export async function getStagedFiles(cwd) {
|
|
116
|
-
try {
|
|
117
|
-
const git = getGit(cwd);
|
|
118
|
-
const diff = await git.diff([
|
|
119
|
-
"--cached",
|
|
120
|
-
"--name-only",
|
|
121
|
-
"--diff-filter=ACMR",
|
|
122
|
-
]);
|
|
123
|
-
return diff
|
|
124
|
-
.split("\n")
|
|
125
|
-
.map((f) => f.trim())
|
|
126
|
-
.filter(Boolean);
|
|
127
|
-
}
|
|
128
|
-
catch {
|
|
129
|
-
return [];
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
/**
|
|
133
|
-
* Get recent commit log entries.
|
|
134
|
-
*/
|
|
135
|
-
export async function getLog(cwd, maxCount = 5) {
|
|
136
|
-
try {
|
|
137
|
-
const git = getGit(cwd);
|
|
138
|
-
const log = await git.log({ maxCount });
|
|
139
|
-
return log.all.map((entry) => ({
|
|
140
|
-
hash: entry.hash,
|
|
141
|
-
date: entry.date,
|
|
142
|
-
message: entry.message,
|
|
143
|
-
author_name: entry.author_name,
|
|
144
|
-
}));
|
|
145
|
-
}
|
|
146
|
-
catch {
|
|
147
|
-
return [];
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
/**
|
|
151
|
-
* List local branches.
|
|
152
|
-
*/
|
|
153
|
-
export async function listBranches(cwd) {
|
|
154
|
-
try {
|
|
155
|
-
const git = getGit(cwd);
|
|
156
|
-
const summary = await git.branchLocal();
|
|
157
|
-
return summary.all;
|
|
158
|
-
}
|
|
159
|
-
catch {
|
|
160
|
-
return [];
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
/**
|
|
164
|
-
* Write a git note under a custom ref namespace.
|
|
165
|
-
*/
|
|
166
|
-
export async function writeNote(cwd, ref, commitSha, content) {
|
|
167
|
-
const git = getGit(cwd);
|
|
168
|
-
await git.raw(["notes", "--ref", ref, "add", "-f", "-m", content, commitSha]);
|
|
169
|
-
}
|
|
170
|
-
/**
|
|
171
|
-
* Read a git note from a custom ref namespace. Returns null if no note exists.
|
|
172
|
-
*/
|
|
173
|
-
export async function readNote(cwd, ref, commitSha) {
|
|
174
|
-
try {
|
|
175
|
-
const git = getGit(cwd);
|
|
176
|
-
return await git.raw(["notes", "--ref", ref, "show", commitSha]);
|
|
177
|
-
}
|
|
178
|
-
catch {
|
|
179
|
-
return null;
|
|
180
|
-
}
|
|
181
|
-
}
|
package/dist/utils/log.js
DELETED
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* File logger — writes structured logs to .unerr/logs/ in the repo root.
|
|
3
|
-
*
|
|
4
|
-
* Each setup run creates a timestamped log file. All API calls, responses,
|
|
5
|
-
* and errors are recorded. On error, the CLI prints the log file path.
|
|
6
|
-
*
|
|
7
|
-
* Built on consola — routes all output to file, never to stdout.
|
|
8
|
-
*/
|
|
9
|
-
import { appendFileSync, mkdirSync } from "node:fs";
|
|
10
|
-
import { join } from "node:path";
|
|
11
|
-
let logFilePath = null;
|
|
12
|
-
function ensureLogDir(cwd) {
|
|
13
|
-
const logsDir = join(cwd, ".unerr", "logs");
|
|
14
|
-
mkdirSync(logsDir, { recursive: true });
|
|
15
|
-
return logsDir;
|
|
16
|
-
}
|
|
17
|
-
function timestamp() {
|
|
18
|
-
return new Date().toISOString();
|
|
19
|
-
}
|
|
20
|
-
function datestamp() {
|
|
21
|
-
return new Date().toISOString().slice(0, 10);
|
|
22
|
-
}
|
|
23
|
-
export function initLogFile(cwd) {
|
|
24
|
-
const logsDir = ensureLogDir(cwd);
|
|
25
|
-
logFilePath = join(logsDir, `setup-${datestamp()}.log`);
|
|
26
|
-
write("info", "=== unerr setup started ===");
|
|
27
|
-
write("info", `cwd: ${cwd}`);
|
|
28
|
-
write("info", `node: ${process.version}`);
|
|
29
|
-
write("info", `platform: ${process.platform} ${process.arch}`);
|
|
30
|
-
return logFilePath;
|
|
31
|
-
}
|
|
32
|
-
function write(level, message, data) {
|
|
33
|
-
if (!logFilePath)
|
|
34
|
-
return;
|
|
35
|
-
const line = data
|
|
36
|
-
? `[${timestamp()}] [${level}] ${message} ${JSON.stringify(data)}`
|
|
37
|
-
: `[${timestamp()}] [${level}] ${message}`;
|
|
38
|
-
try {
|
|
39
|
-
appendFileSync(logFilePath, `${line}\n`);
|
|
40
|
-
}
|
|
41
|
-
catch {
|
|
42
|
-
/* best effort — never crash on logging failure */
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
export function logInfo(message, data) {
|
|
46
|
-
write("info", message, data);
|
|
47
|
-
}
|
|
48
|
-
export function logError(message, data) {
|
|
49
|
-
write("error", message, data);
|
|
50
|
-
}
|
|
51
|
-
export function logApi(method, url, status, body) {
|
|
52
|
-
const statusStr = status !== undefined ? ` → ${status}` : "";
|
|
53
|
-
write("api", `${method} ${url}${statusStr}`, body);
|
|
54
|
-
}
|
|
55
|
-
export function getLogFilePath() {
|
|
56
|
-
return logFilePath;
|
|
57
|
-
}
|
package/dist/utils/logger.js
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Centralized Logger — consola-based, stderr-only.
|
|
3
|
-
*
|
|
4
|
-
* CRITICAL INVARIANT: stdout is reserved for MCP JSON-RPC protocol.
|
|
5
|
-
* Every log call routes to stderr. This is enforced at construction time
|
|
6
|
-
* by setting both stdout and stderr streams to process.stderr.
|
|
7
|
-
*
|
|
8
|
-
* Design notes (temporal intelligence foundation):
|
|
9
|
-
* - Structured event emission supports future episodic memory capture.
|
|
10
|
-
* - Module-scoped child loggers enable per-subsystem log routing.
|
|
11
|
-
* - Log levels respect UNERR_LOG_LEVEL env var (0=silent, 3=info, 4=debug, 5=trace).
|
|
12
|
-
*/
|
|
13
|
-
import { createConsola } from "consola";
|
|
14
|
-
const resolveLevel = () => {
|
|
15
|
-
const env = process.env.UNERR_LOG_LEVEL;
|
|
16
|
-
if (env !== undefined) {
|
|
17
|
-
const parsed = Number(env);
|
|
18
|
-
return Number.isFinite(parsed) ? parsed : 3;
|
|
19
|
-
}
|
|
20
|
-
return process.env.NODE_ENV === "test" ? 0 : 3;
|
|
21
|
-
};
|
|
22
|
-
export const logger = createConsola({
|
|
23
|
-
stdout: process.stderr,
|
|
24
|
-
stderr: process.stderr,
|
|
25
|
-
level: resolveLevel(),
|
|
26
|
-
defaults: { tag: "unerr" },
|
|
27
|
-
formatOptions: {
|
|
28
|
-
date: false,
|
|
29
|
-
colors: process.env.NO_COLOR === undefined,
|
|
30
|
-
compact: true,
|
|
31
|
-
},
|
|
32
|
-
});
|
|
33
|
-
export function createModuleLogger(module) {
|
|
34
|
-
return logger.withTag(module);
|
|
35
|
-
}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Layer 6 — Sprint FE-A (§43): MCP tool `content[].text` payloads use compact JSON only.
|
|
3
|
-
* Pretty-printed JSON (`JSON.stringify(v, null, 2)`) inflates token count by ~15–25%
|
|
4
|
-
* on structural whitespace (`LAYER_6_FORMAT_ENCODING.md`).
|
|
5
|
-
*/
|
|
6
|
-
export function stringifyMcpToolJson(value) {
|
|
7
|
-
return JSON.stringify(value);
|
|
8
|
-
}
|