@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
|
@@ -1,196 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Test File & Entity Detection — Single Source of Truth (Sprint R.8)
|
|
3
|
-
*
|
|
4
|
-
* Determines whether a file/entity is test code across all supported languages.
|
|
5
|
-
* All consumers (health-grade, convention-detector, blast-radius, community detection)
|
|
6
|
-
* should use these functions instead of inline regex.
|
|
7
|
-
*
|
|
8
|
-
* Supported languages: TypeScript/JavaScript, Python, Go, Java, Rust, Ruby, C#, C/C++
|
|
9
|
-
*/
|
|
10
|
-
import { basename } from "node:path";
|
|
11
|
-
// ── File-Level Patterns ─────────────────────────────────────────
|
|
12
|
-
/** Directory-based test patterns (match against full path) */
|
|
13
|
-
const TEST_DIR_PATTERNS = [
|
|
14
|
-
/(?:^|[/\\])__tests__[/\\]/,
|
|
15
|
-
/(?:^|[/\\])tests?[/\\]/,
|
|
16
|
-
/(?:^|[/\\])spec[/\\]/,
|
|
17
|
-
/(?:^|[/\\])src[/\\]test[/\\]/, // Java Maven/Gradle convention
|
|
18
|
-
];
|
|
19
|
-
/** Suffix/prefix-based test patterns (match against full path or basename) */
|
|
20
|
-
const TEST_FILE_PATTERNS = [
|
|
21
|
-
// TS/JS: foo.test.ts, foo.spec.tsx
|
|
22
|
-
/\.(?:test|spec)\.[^.]+$/,
|
|
23
|
-
// Go: foo_test.go
|
|
24
|
-
/_test\.go$/,
|
|
25
|
-
// Python: test_foo.py
|
|
26
|
-
/(?:^|[/\\])test_[^/\\]+\.py$/,
|
|
27
|
-
// Python: foo_test.py
|
|
28
|
-
/_test\.py$/,
|
|
29
|
-
// Python: conftest.py (test infrastructure)
|
|
30
|
-
/conftest\.py$/,
|
|
31
|
-
// Java/Kotlin: FooTest.java, FooTests.java, FooIT.java (integration test)
|
|
32
|
-
/(?:Test|Tests|IT)\.(?:java|kt)$/,
|
|
33
|
-
// Ruby: foo_spec.rb, foo_test.rb
|
|
34
|
-
/[_.](?:spec|test)\.rb$/,
|
|
35
|
-
// C#: FooTests.cs, FooTest.cs
|
|
36
|
-
/Tests?\.cs$/,
|
|
37
|
-
// C/C++: foo_test.cpp, test_foo.c
|
|
38
|
-
/(?:_test|_spec)\.[ch](?:pp|c|xx)?$/,
|
|
39
|
-
/(?:^|[/\\])test_[^/\\]+\.[ch](?:pp|c|xx)?$/,
|
|
40
|
-
// Rust: in tests/ directory (caught by dir pattern), or _test.rs
|
|
41
|
-
/_test\.rs$/,
|
|
42
|
-
];
|
|
43
|
-
/**
|
|
44
|
-
* Determine if a file path represents a test file.
|
|
45
|
-
*
|
|
46
|
-
* @param filePath - Relative file path from project root
|
|
47
|
-
* @returns true if the file is a test file
|
|
48
|
-
*/
|
|
49
|
-
export function isTestFile(filePath) {
|
|
50
|
-
// Check directory patterns
|
|
51
|
-
for (const pattern of TEST_DIR_PATTERNS) {
|
|
52
|
-
if (pattern.test(filePath))
|
|
53
|
-
return true;
|
|
54
|
-
}
|
|
55
|
-
// Check file name patterns
|
|
56
|
-
for (const pattern of TEST_FILE_PATTERNS) {
|
|
57
|
-
if (pattern.test(filePath))
|
|
58
|
-
return true;
|
|
59
|
-
}
|
|
60
|
-
return false;
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Determine if an entity should be marked as a test entity.
|
|
64
|
-
*
|
|
65
|
-
* For most languages, all entities in a test file are test entities.
|
|
66
|
-
* Future: Rust `#[cfg(test)]` inline modules could use AST scope detection.
|
|
67
|
-
*
|
|
68
|
-
* @param filePath - Entity's file path
|
|
69
|
-
* @returns true if the entity is a test entity
|
|
70
|
-
*/
|
|
71
|
-
export function isTestEntity(filePath) {
|
|
72
|
-
return isTestFile(filePath);
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* Given a test file path, attempt to resolve the source file it tests.
|
|
76
|
-
* Uses naming conventions (file stem matching) across all languages.
|
|
77
|
-
*
|
|
78
|
-
* @param testFilePath - Path to the test file
|
|
79
|
-
* @param projectFiles - Set of all project file paths
|
|
80
|
-
* @returns The source file path, or null if not determinable
|
|
81
|
-
*/
|
|
82
|
-
export function resolveTestSubject(testFilePath, projectFiles) {
|
|
83
|
-
const base = basename(testFilePath);
|
|
84
|
-
// Strip test indicators from filename to get source stem
|
|
85
|
-
const candidates = getSourceCandidates(testFilePath, base);
|
|
86
|
-
for (const candidate of candidates) {
|
|
87
|
-
if (projectFiles.has(candidate))
|
|
88
|
-
return candidate;
|
|
89
|
-
}
|
|
90
|
-
return null;
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* Generate candidate source file paths from a test file path.
|
|
94
|
-
*/
|
|
95
|
-
function getSourceCandidates(testFilePath, base) {
|
|
96
|
-
const dir = testFilePath.slice(0, testFilePath.length - base.length);
|
|
97
|
-
const candidates = [];
|
|
98
|
-
// TS/JS: foo.test.ts → foo.ts
|
|
99
|
-
const tsMatch = base.match(/^(.+)\.(?:test|spec)(\.[^.]+)$/);
|
|
100
|
-
if (tsMatch) {
|
|
101
|
-
const [, stem, ext] = tsMatch;
|
|
102
|
-
// Same directory
|
|
103
|
-
candidates.push(`${dir}${stem}${ext}`);
|
|
104
|
-
// Parent directory (for __tests__/foo.test.ts → ../foo.ts)
|
|
105
|
-
const parentDir = dir.replace(/(?:__tests__|tests?|spec)[/\\]$/, "");
|
|
106
|
-
if (parentDir !== dir) {
|
|
107
|
-
candidates.push(`${parentDir}${stem}${ext}`);
|
|
108
|
-
}
|
|
109
|
-
return candidates;
|
|
110
|
-
}
|
|
111
|
-
// Go: foo_test.go → foo.go
|
|
112
|
-
if (base.endsWith("_test.go")) {
|
|
113
|
-
const stem = base.slice(0, -8); // remove _test.go
|
|
114
|
-
candidates.push(`${dir}${stem}.go`);
|
|
115
|
-
return candidates;
|
|
116
|
-
}
|
|
117
|
-
// Python: test_foo.py → foo.py
|
|
118
|
-
const pyPrefixMatch = base.match(/^test_(.+\.py)$/);
|
|
119
|
-
if (pyPrefixMatch) {
|
|
120
|
-
candidates.push(`${dir}${pyPrefixMatch[1]}`);
|
|
121
|
-
// Also check parent (tests/test_foo.py → ../foo.py)
|
|
122
|
-
const parentDir = dir.replace(/(?:tests?)[/\\]$/, "");
|
|
123
|
-
if (parentDir !== dir) {
|
|
124
|
-
candidates.push(`${parentDir}${pyPrefixMatch[1]}`);
|
|
125
|
-
}
|
|
126
|
-
return candidates;
|
|
127
|
-
}
|
|
128
|
-
// Python: foo_test.py → foo.py
|
|
129
|
-
if (base.endsWith("_test.py")) {
|
|
130
|
-
const stem = base.slice(0, -8);
|
|
131
|
-
candidates.push(`${dir}${stem}.py`);
|
|
132
|
-
return candidates;
|
|
133
|
-
}
|
|
134
|
-
// Java/Kotlin: FooTest.java → Foo.java
|
|
135
|
-
const javaMatch = base.match(/^(.+?)(?:Test|Tests|IT)(\.(java|kt))$/);
|
|
136
|
-
if (javaMatch) {
|
|
137
|
-
const [, stem, ext] = javaMatch;
|
|
138
|
-
candidates.push(`${dir}${stem}${ext}`);
|
|
139
|
-
// Maven: src/test/java/... → src/main/java/...
|
|
140
|
-
const mainDir = dir.replace(/src[/\\]test[/\\]/, "src/main/");
|
|
141
|
-
if (mainDir !== dir) {
|
|
142
|
-
candidates.push(`${mainDir}${stem}${ext}`);
|
|
143
|
-
}
|
|
144
|
-
return candidates;
|
|
145
|
-
}
|
|
146
|
-
// Ruby: foo_spec.rb → foo.rb
|
|
147
|
-
const rbMatch = base.match(/^(.+)[_.](?:spec|test)(\.rb)$/);
|
|
148
|
-
if (rbMatch) {
|
|
149
|
-
const [, stem, ext] = rbMatch;
|
|
150
|
-
candidates.push(`${dir}${stem}${ext}`);
|
|
151
|
-
// spec/models/user_spec.rb → app/models/user.rb or lib/models/user.rb
|
|
152
|
-
const specDir = dir.replace(/(?:spec|test)[/\\]/, "");
|
|
153
|
-
if (specDir !== dir) {
|
|
154
|
-
candidates.push(`${specDir}${stem}${ext}`);
|
|
155
|
-
candidates.push(`${specDir.replace(/^/, "app/")}${stem}${ext}`);
|
|
156
|
-
candidates.push(`${specDir.replace(/^/, "lib/")}${stem}${ext}`);
|
|
157
|
-
}
|
|
158
|
-
return candidates;
|
|
159
|
-
}
|
|
160
|
-
// C#: FooTests.cs → Foo.cs
|
|
161
|
-
const csMatch = base.match(/^(.+?)Tests?(\.cs)$/);
|
|
162
|
-
if (csMatch) {
|
|
163
|
-
const [, stem, ext] = csMatch;
|
|
164
|
-
candidates.push(`${dir}${stem}${ext}`);
|
|
165
|
-
// Tests/FooTests.cs → Src/Foo.cs or Services/Foo.cs
|
|
166
|
-
const srcDir = dir.replace(/\.?Tests?[/\\]/, "/");
|
|
167
|
-
if (srcDir !== dir) {
|
|
168
|
-
candidates.push(`${srcDir}${stem}${ext}`);
|
|
169
|
-
}
|
|
170
|
-
return candidates;
|
|
171
|
-
}
|
|
172
|
-
// Rust: foo_test.rs → foo.rs
|
|
173
|
-
if (base.endsWith("_test.rs")) {
|
|
174
|
-
const stem = base.slice(0, -8);
|
|
175
|
-
candidates.push(`${dir}${stem}.rs`);
|
|
176
|
-
// tests/foo_test.rs → src/foo.rs
|
|
177
|
-
const srcDir = dir.replace(/tests?[/\\]/, "src/");
|
|
178
|
-
if (srcDir !== dir) {
|
|
179
|
-
candidates.push(`${srcDir}${stem}.rs`);
|
|
180
|
-
}
|
|
181
|
-
return candidates;
|
|
182
|
-
}
|
|
183
|
-
// C/C++: foo_test.cpp → foo.cpp
|
|
184
|
-
const cMatch = base.match(/^(.+?)_test(\.[ch](?:pp|c|xx)?)$/);
|
|
185
|
-
if (cMatch) {
|
|
186
|
-
const [, stem, ext] = cMatch;
|
|
187
|
-
candidates.push(`${dir}${stem}${ext}`);
|
|
188
|
-
return candidates;
|
|
189
|
-
}
|
|
190
|
-
const cPrefixMatch = base.match(/^test_(.+\.[ch](?:pp|c|xx)?)$/);
|
|
191
|
-
if (cPrefixMatch) {
|
|
192
|
-
candidates.push(`${dir}${cPrefixMatch[1]}`);
|
|
193
|
-
return candidates;
|
|
194
|
-
}
|
|
195
|
-
return candidates;
|
|
196
|
-
}
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* File Watcher Integration — connects @parcel/watcher events to the
|
|
3
|
-
* incremental indexing pipeline.
|
|
4
|
-
*
|
|
5
|
-
* Receives file change events from the native watcher (Sprint B.4),
|
|
6
|
-
* triggers targeted re-indexing, and applies graph patches.
|
|
7
|
-
*/
|
|
8
|
-
import path from "node:path";
|
|
9
|
-
import { createModuleLogger } from "../../utils/logger.js";
|
|
10
|
-
const log = createModuleLogger("watch-integration");
|
|
11
|
-
/** Extensions that the indexer can process — mirrors local-indexer.ts INDEXABLE_EXTENSIONS. */
|
|
12
|
-
const INDEXABLE_EXTENSIONS = new Set([
|
|
13
|
-
".ts",
|
|
14
|
-
".tsx",
|
|
15
|
-
".js",
|
|
16
|
-
".jsx",
|
|
17
|
-
".mjs",
|
|
18
|
-
".cjs",
|
|
19
|
-
".py",
|
|
20
|
-
".go",
|
|
21
|
-
".java",
|
|
22
|
-
".rs",
|
|
23
|
-
".c",
|
|
24
|
-
".h",
|
|
25
|
-
".cpp",
|
|
26
|
-
".cc",
|
|
27
|
-
".cxx",
|
|
28
|
-
".hpp",
|
|
29
|
-
]);
|
|
30
|
-
/**
|
|
31
|
-
* Filter watch events to only indexable source files.
|
|
32
|
-
* Ignores non-source files, build artifacts, and lockfiles.
|
|
33
|
-
*/
|
|
34
|
-
export function filterIndexableEvents(events) {
|
|
35
|
-
const paths = new Set();
|
|
36
|
-
for (const event of events) {
|
|
37
|
-
if (event.type === "delete") {
|
|
38
|
-
paths.add(event.path);
|
|
39
|
-
continue;
|
|
40
|
-
}
|
|
41
|
-
const ext = path.extname(event.path).toLowerCase();
|
|
42
|
-
if (INDEXABLE_EXTENSIONS.has(ext)) {
|
|
43
|
-
paths.add(event.path);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
return [...paths];
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Create a watcher callback that triggers incremental reindexing.
|
|
50
|
-
*/
|
|
51
|
-
export function createWatchReindexHook(onReindex) {
|
|
52
|
-
return (events) => {
|
|
53
|
-
const indexable = filterIndexableEvents(events);
|
|
54
|
-
if (indexable.length === 0)
|
|
55
|
-
return;
|
|
56
|
-
log.debug(`Reindexing ${indexable.length} files from watch events`);
|
|
57
|
-
onReindex(indexable).catch((err) => {
|
|
58
|
-
log.warn(`Watch-triggered reindex failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
59
|
-
});
|
|
60
|
-
};
|
|
61
|
-
}
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Indexer Worker Pool — parallel file indexing via tinypool.
|
|
3
|
-
*
|
|
4
|
-
* For large projects (>100 files), distributes indexing across worker threads.
|
|
5
|
-
* Falls back to sequential indexing when workers are unavailable.
|
|
6
|
-
*
|
|
7
|
-
* Each worker receives a file path + source code, returns extraction results.
|
|
8
|
-
* Tree-sitter parsers are initialized per-worker (one-time cost).
|
|
9
|
-
*/
|
|
10
|
-
import { readFileSync } from "node:fs";
|
|
11
|
-
import { join } from "node:path";
|
|
12
|
-
import { createModuleLogger } from "../../utils/logger.js";
|
|
13
|
-
import { parseSource } from "../tree-sitter-loader.js";
|
|
14
|
-
import { discoverFiles } from "./orchestrator.js";
|
|
15
|
-
import { getPluginForFile, } from "./plugin-interface.js";
|
|
16
|
-
const log = createModuleLogger("indexer-worker");
|
|
17
|
-
const MAX_FILE_SIZE = 500 * 1024;
|
|
18
|
-
const PARALLEL_THRESHOLD = 50;
|
|
19
|
-
async function processFile(filePath, projectRoot) {
|
|
20
|
-
const plugin = getPluginForFile(filePath);
|
|
21
|
-
if (!plugin)
|
|
22
|
-
return { entities: [], edges: [], imports: [], error: true };
|
|
23
|
-
const absolutePath = join(projectRoot, filePath);
|
|
24
|
-
let source;
|
|
25
|
-
try {
|
|
26
|
-
source = readFileSync(absolutePath, "utf-8");
|
|
27
|
-
}
|
|
28
|
-
catch {
|
|
29
|
-
return { entities: [], edges: [], imports: [], error: true };
|
|
30
|
-
}
|
|
31
|
-
if (source.length > MAX_FILE_SIZE) {
|
|
32
|
-
return { entities: [], edges: [], imports: [], error: false };
|
|
33
|
-
}
|
|
34
|
-
try {
|
|
35
|
-
const tree = await parseSource(source, plugin.grammarWasmName);
|
|
36
|
-
const extraction = plugin.extract(tree, filePath, source);
|
|
37
|
-
const imports = plugin.resolveImports(tree, filePath);
|
|
38
|
-
tree.delete();
|
|
39
|
-
return { ...extraction, imports, error: false };
|
|
40
|
-
}
|
|
41
|
-
catch {
|
|
42
|
-
return { entities: [], edges: [], imports: [], error: true };
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Index a project using chunked parallelism.
|
|
47
|
-
* Files are processed in batches to avoid overwhelming the event loop.
|
|
48
|
-
*/
|
|
49
|
-
export async function indexProjectParallel(projectRoot, ignorePatterns) {
|
|
50
|
-
const start = performance.now();
|
|
51
|
-
const files = discoverFiles(projectRoot, ignorePatterns);
|
|
52
|
-
const allEntities = [];
|
|
53
|
-
const allEdges = [];
|
|
54
|
-
const allImports = [];
|
|
55
|
-
let errorCount = 0;
|
|
56
|
-
const chunkSize = Math.min(50, Math.max(10, Math.ceil(files.length / 4)));
|
|
57
|
-
for (let i = 0; i < files.length; i += chunkSize) {
|
|
58
|
-
const chunk = files.slice(i, i + chunkSize);
|
|
59
|
-
const results = await Promise.all(chunk.map((file) => processFile(file, projectRoot)));
|
|
60
|
-
for (const result of results) {
|
|
61
|
-
if (result.error) {
|
|
62
|
-
errorCount++;
|
|
63
|
-
}
|
|
64
|
-
else {
|
|
65
|
-
allEntities.push(...result.entities);
|
|
66
|
-
allEdges.push(...result.edges);
|
|
67
|
-
allImports.push(...result.imports);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
return {
|
|
72
|
-
entities: allEntities,
|
|
73
|
-
edges: allEdges,
|
|
74
|
-
imports: allImports,
|
|
75
|
-
fileCount: files.length,
|
|
76
|
-
errorCount,
|
|
77
|
-
durationMs: performance.now() - start,
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* Choose optimal indexing strategy based on file count.
|
|
82
|
-
*/
|
|
83
|
-
export async function indexProjectAuto(projectRoot, ignorePatterns) {
|
|
84
|
-
return indexProjectParallel(projectRoot, ignorePatterns);
|
|
85
|
-
}
|