sverklo 0.2.6 → 0.2.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/README.md +18 -0
  2. package/dist/src/doctor.js +57 -0
  3. package/dist/src/doctor.js.map +1 -1
  4. package/dist/src/indexer/indexer.d.ts +13 -0
  5. package/dist/src/indexer/indexer.js +41 -0
  6. package/dist/src/indexer/indexer.js.map +1 -1
  7. package/dist/src/indexer/parser.js +43 -2
  8. package/dist/src/indexer/parser.js.map +1 -1
  9. package/dist/src/init.js +36 -0
  10. package/dist/src/init.js.map +1 -1
  11. package/dist/src/search/hybrid-search.d.ts +3 -1
  12. package/dist/src/search/hybrid-search.js +18 -3
  13. package/dist/src/search/hybrid-search.js.map +1 -1
  14. package/dist/src/search/token-budget.js +20 -2
  15. package/dist/src/search/token-budget.js.map +1 -1
  16. package/dist/src/server/mcp-server.js +27 -23
  17. package/dist/src/server/mcp-server.js.map +1 -1
  18. package/dist/src/server/tools/ast-grep.js +4 -13
  19. package/dist/src/server/tools/ast-grep.js.map +1 -1
  20. package/dist/src/server/tools/audit.js +18 -7
  21. package/dist/src/server/tools/audit.js.map +1 -1
  22. package/dist/src/server/tools/diff-search.d.ts +33 -0
  23. package/dist/src/server/tools/diff-search.js +121 -0
  24. package/dist/src/server/tools/diff-search.js.map +1 -0
  25. package/dist/src/server/tools/impact.js +1 -4
  26. package/dist/src/server/tools/impact.js.map +1 -1
  27. package/dist/src/server/tools/index-status.js +38 -0
  28. package/dist/src/server/tools/index-status.js.map +1 -1
  29. package/dist/src/server/tools/remember.js +7 -19
  30. package/dist/src/server/tools/remember.js.map +1 -1
  31. package/dist/src/server/tools/review-diff.d.ts +27 -0
  32. package/dist/src/server/tools/review-diff.js +414 -0
  33. package/dist/src/server/tools/review-diff.js.map +1 -0
  34. package/dist/src/server/tools/test-map.d.ts +19 -0
  35. package/dist/src/server/tools/test-map.js +227 -0
  36. package/dist/src/server/tools/test-map.js.map +1 -0
  37. package/dist/src/server/tools/wakeup.js +1 -3
  38. package/dist/src/server/tools/wakeup.js.map +1 -1
  39. package/package.json +3 -2
@@ -0,0 +1,227 @@
1
+ import { execSync } from "node:child_process";
2
+ import { basename, dirname, join } from "node:path";
3
+ export const testMapTool = {
4
+ name: "sverklo_test_map",
5
+ description: "Map a git diff to its test coverage. Given a ref/range, lists which tests likely cover " +
6
+ "each changed source file (via name heuristics + import graph), flags changed source files " +
7
+ "with NO matching tests, and shows which test files were modified in the diff. Use this " +
8
+ "during MR/PR review to answer 'what tests should I run?' and 'is this change tested?' " +
9
+ "without grepping the whole repo. Coverage is heuristic — sverklo doesn't run code, so " +
10
+ "treat results as candidates, not ground truth.",
11
+ inputSchema: {
12
+ type: "object",
13
+ properties: {
14
+ ref: {
15
+ type: "string",
16
+ description: "Git ref or range. Default: main..HEAD",
17
+ },
18
+ include_importers: {
19
+ type: "boolean",
20
+ description: "Also surface test files that import the changed file via the dependency graph (not just name matches). Default: true.",
21
+ },
22
+ },
23
+ },
24
+ };
25
+ // Filename patterns that indicate a test file across common ecosystems.
26
+ // Kept regex-light so additions are easy.
27
+ const TEST_FILE_PATTERNS = [
28
+ /\.test\.[jt]sx?$/,
29
+ /\.spec\.[jt]sx?$/,
30
+ /(^|\/)__tests__\//,
31
+ /(^|\/)tests?\//,
32
+ /_test\.go$/,
33
+ /_test\.py$/,
34
+ /(^|\/)test_[^/]+\.py$/,
35
+ /Test\.java$/,
36
+ /Tests\.java$/,
37
+ /Spec\.scala$/,
38
+ /_spec\.rb$/,
39
+ /(^|\/)spec\//,
40
+ /\.test\.exs$/,
41
+ /(^|\/)test\/.*\.exs$/,
42
+ ];
43
+ function isTestPath(path) {
44
+ return TEST_FILE_PATTERNS.some((re) => re.test(path));
45
+ }
46
+ /**
47
+ * Generate the candidate test filenames that conventionally cover a source file.
48
+ * Examples:
49
+ * src/foo/bar.ts → bar.test.ts, bar.spec.ts, __tests__/bar.test.ts
50
+ * src/foo/bar.py → test_bar.py, bar_test.py
51
+ * com/Foo.java → FooTest.java, FooTests.java
52
+ */
53
+ function candidateTestNames(sourcePath) {
54
+ const file = basename(sourcePath);
55
+ const dot = file.lastIndexOf(".");
56
+ if (dot <= 0)
57
+ return [];
58
+ const stem = file.slice(0, dot);
59
+ const ext = file.slice(dot); // includes leading dot
60
+ const names = [];
61
+ // JS/TS family
62
+ if (/\.[jt]sx?$/.test(ext)) {
63
+ names.push(`${stem}.test${ext}`, `${stem}.spec${ext}`);
64
+ }
65
+ // Python
66
+ if (ext === ".py") {
67
+ names.push(`test_${stem}.py`, `${stem}_test.py`);
68
+ }
69
+ // Go
70
+ if (ext === ".go") {
71
+ names.push(`${stem}_test.go`);
72
+ }
73
+ // Java/Kotlin/Scala
74
+ if (ext === ".java" || ext === ".kt" || ext === ".scala") {
75
+ names.push(`${stem}Test${ext}`, `${stem}Tests${ext}`, `${stem}Spec${ext}`);
76
+ }
77
+ // Ruby
78
+ if (ext === ".rb") {
79
+ names.push(`${stem}_spec.rb`, `${stem}_test.rb`);
80
+ }
81
+ // Rust — convention is inline #[cfg(test)] modules; sibling file uncommon
82
+ if (ext === ".rs") {
83
+ names.push(`${stem}_test.rs`);
84
+ }
85
+ // Elixir
86
+ if (ext === ".ex") {
87
+ names.push(`${stem}_test.exs`);
88
+ }
89
+ return names;
90
+ }
91
+ export function handleTestMap(indexer, args) {
92
+ const ref = args.ref || "main..HEAD";
93
+ const includeImporters = args.include_importers !== false;
94
+ // 1. Get changed files from git diff
95
+ let changedPaths;
96
+ try {
97
+ const out = execSync(`git diff --name-only --diff-filter=ACMRT ${ref}`, { cwd: indexer.rootPath, encoding: "utf-8", timeout: 8000, maxBuffer: 5 * 1024 * 1024 });
98
+ changedPaths = out.trim().split("\n").filter(Boolean);
99
+ }
100
+ catch {
101
+ return `Error: not a git repository or invalid ref \`${ref}\`. Try \`sverklo_test_map ref:"HEAD~1..HEAD"\`.`;
102
+ }
103
+ if (changedPaths.length === 0) {
104
+ return `No file changes between \`${ref}\`.`;
105
+ }
106
+ // 2. Partition into source vs test files
107
+ const changedTests = [];
108
+ const changedSources = [];
109
+ for (const p of changedPaths) {
110
+ if (isTestPath(p))
111
+ changedTests.push(p);
112
+ else
113
+ changedSources.push(p);
114
+ }
115
+ // 3. Build a quick lookup of all known test files in the index
116
+ const allFiles = indexer.fileStore.getAll();
117
+ const testFiles = allFiles.filter((f) => isTestPath(f.path));
118
+ const testFilesByBasename = new Map();
119
+ for (const tf of testFiles) {
120
+ const b = basename(tf.path);
121
+ const list = testFilesByBasename.get(b) || [];
122
+ list.push(tf.path);
123
+ testFilesByBasename.set(b, list);
124
+ }
125
+ // 4. Build file id ↔ path maps for graph lookups
126
+ const idToPath = new Map();
127
+ const pathToId = new Map();
128
+ for (const f of allFiles) {
129
+ idToPath.set(f.id, f.path);
130
+ pathToId.set(f.path, f.id);
131
+ }
132
+ const coverage = [];
133
+ const uncovered = [];
134
+ for (const src of changedSources) {
135
+ const nameMatches = new Set();
136
+ // Heuristic 1: conventional test filenames anywhere in the index
137
+ for (const cand of candidateTestNames(src)) {
138
+ const hits = testFilesByBasename.get(cand);
139
+ if (hits)
140
+ hits.forEach((h) => nameMatches.add(h));
141
+ }
142
+ // Heuristic 2: same-directory test file (rare but possible)
143
+ const dir = dirname(src);
144
+ for (const cand of candidateTestNames(src)) {
145
+ const sibling = join(dir, cand);
146
+ if (pathToId.has(sibling))
147
+ nameMatches.add(sibling);
148
+ }
149
+ // Heuristic 3: dependency-graph importers that happen to be test files
150
+ const importerTests = new Set();
151
+ if (includeImporters) {
152
+ const id = pathToId.get(src);
153
+ if (id !== undefined) {
154
+ for (const edge of indexer.graphStore.getImporters(id)) {
155
+ const importerPath = idToPath.get(edge.source_file_id);
156
+ if (importerPath && isTestPath(importerPath)) {
157
+ importerTests.add(importerPath);
158
+ }
159
+ }
160
+ }
161
+ }
162
+ // Subtract name matches from importer matches to avoid double-listing
163
+ for (const nm of nameMatches)
164
+ importerTests.delete(nm);
165
+ if (nameMatches.size === 0 && importerTests.size === 0) {
166
+ uncovered.push(src);
167
+ }
168
+ else {
169
+ coverage.push({
170
+ source: src,
171
+ nameMatches: [...nameMatches].sort(),
172
+ importerTests: [...importerTests].sort(),
173
+ });
174
+ }
175
+ }
176
+ // 6. Format output
177
+ const lines = [];
178
+ lines.push(`# Test map for \`${ref}\``);
179
+ lines.push(`${changedSources.length} source file${changedSources.length === 1 ? "" : "s"} changed · ` +
180
+ `${changedTests.length} test file${changedTests.length === 1 ? "" : "s"} changed · ` +
181
+ `${coverage.length} covered · ${uncovered.length} uncovered`);
182
+ lines.push("");
183
+ if (changedTests.length > 0) {
184
+ lines.push(`## Test files modified in this diff (${changedTests.length})`);
185
+ lines.push(`These run as part of the change itself — make sure they pass.`);
186
+ for (const t of changedTests)
187
+ lines.push(`- ${t}`);
188
+ lines.push("");
189
+ }
190
+ if (coverage.length > 0) {
191
+ lines.push(`## Likely test coverage (${coverage.length})`);
192
+ lines.push(`_Heuristic — based on filename conventions and import graph, not actual coverage data._`);
193
+ for (const c of coverage) {
194
+ lines.push(`- **${c.source}**`);
195
+ for (const t of c.nameMatches)
196
+ lines.push(` - ${t} _(name match)_`);
197
+ for (const t of c.importerTests)
198
+ lines.push(` - ${t} _(imports source)_`);
199
+ }
200
+ lines.push("");
201
+ }
202
+ if (uncovered.length > 0) {
203
+ lines.push(`## ⚠️ No matching tests found (${uncovered.length})`);
204
+ lines.push(`These changed files have no test file matching by name or import. They may be untested, ` +
205
+ `tested via integration/e2e suites sverklo can't see, or covered by tests outside the indexed paths.`);
206
+ for (const u of uncovered)
207
+ lines.push(`- ${u}`);
208
+ lines.push("");
209
+ }
210
+ // Suggested next-step commands the reviewer can paste
211
+ if (coverage.length > 0 || changedTests.length > 0) {
212
+ const allTests = new Set();
213
+ changedTests.forEach((t) => allTests.add(t));
214
+ for (const c of coverage) {
215
+ c.nameMatches.forEach((t) => allTests.add(t));
216
+ c.importerTests.forEach((t) => allTests.add(t));
217
+ }
218
+ if (allTests.size > 0 && allTests.size <= 30) {
219
+ lines.push(`## Suggested test selection`);
220
+ lines.push("```");
221
+ lines.push([...allTests].sort().join(" "));
222
+ lines.push("```");
223
+ }
224
+ }
225
+ return lines.join("\n");
226
+ }
227
+ //# sourceMappingURL=test-map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-map.js","sourceRoot":"","sources":["../../../../src/server/tools/test-map.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,6 @@
1
1
  export const wakeupTool = {
2
2
  name: "sverklo_wakeup",
3
- description: "Returns a compressed 'wake-up' context: top core memories + repo overview + hub files + key " +
4
- "decisions. Designed for system-prompt injection when using non-MCP clients (local Llama, " +
5
- "GPT API without MCP, etc). Alternative to the auto-injected sverklo://context resource.",
3
+ description: "Compressed project context for non-MCP clients (system-prompt injection).",
6
4
  inputSchema: {
7
5
  type: "object",
8
6
  properties: {
@@ -1 +1 @@
1
- {"version":3,"file":"wakeup.js","sourceRoot":"","sources":["../../../../src/server/tools/wakeup.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wakeup.js","sourceRoot":"","sources":["../../../../src/server/tools/wakeup.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sverklo",
3
- "version": "0.2.6",
3
+ "version": "0.2.8",
4
4
  "description": "Sverklo — local-first code intelligence MCP server. Hybrid search, PageRank ranking, semantic embeddings. Zero config.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -20,7 +20,8 @@
20
20
  "test:watch": "vitest",
21
21
  "lint": "eslint src/",
22
22
  "prepublishOnly": "rm -rf dist && npm run build",
23
- "benchmark": "node --experimental-strip-types benchmark/benchmark.ts"
23
+ "benchmark": "node --experimental-strip-types benchmark/benchmark.ts",
24
+ "bench:quick": "node --experimental-strip-types --no-warnings benchmark/src/index.ts"
24
25
  },
25
26
  "keywords": [
26
27
  "sverklo",