sverklo 0.12.0 → 0.12.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 +11 -7
- package/dist/src/search/boost.d.ts +32 -0
- package/dist/src/search/boost.js +120 -0
- package/dist/src/search/boost.js.map +1 -0
- package/dist/src/search/boost.test.d.ts +1 -0
- package/dist/src/search/boost.test.js +61 -0
- package/dist/src/search/boost.test.js.map +1 -0
- package/dist/src/search/hybrid-search.d.ts +7 -0
- package/dist/src/search/hybrid-search.js +7 -1
- package/dist/src/search/hybrid-search.js.map +1 -1
- package/dist/src/server/audit-html.d.ts +2 -0
- package/dist/src/server/audit-html.js +163 -7
- package/dist/src/server/audit-html.js.map +1 -1
- package/dist/src/server/audit-html.test.d.ts +1 -0
- package/dist/src/server/audit-html.test.js +81 -0
- package/dist/src/server/audit-html.test.js.map +1 -0
- package/dist/src/server/tools/search.d.ts +4 -0
- package/dist/src/server/tools/search.js +8 -0
- package/dist/src/server/tools/search.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,24 +1,26 @@
|
|
|
1
1
|
# Sverklo
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
> **Hallucination-resistant code intelligence for Claude Code, Cursor, Windsurf, and Zed.**
|
|
4
|
+
> Semantic search, impact analysis, persistent memory — pick 3. Local, MIT, zero config.
|
|
4
5
|
|
|
5
6
|
[](https://www.npmjs.com/package/sverklo)
|
|
6
7
|
[](https://www.npmjs.com/package/sverklo)
|
|
7
8
|
[](LICENSE)
|
|
9
|
+
[](https://sverklo.com/report)
|
|
8
10
|
|
|
9
11
|

|
|
10
12
|
|
|
11
|
-
##
|
|
13
|
+
## Why
|
|
12
14
|
|
|
13
|
-
Your AI agent edits `UserService.validate()`. It doesn't know
|
|
15
|
+
Your AI agent edits `UserService.validate()`. It doesn't know 47 other functions call it. It hallucinates an import. It forgets the design decision you made yesterday because context was compacted. Tests pass because they mock the dependency. Breaking changes ship.
|
|
14
16
|
|
|
15
|
-
Sverklo gives your agent
|
|
17
|
+
Sverklo (Russian: *сверкло*, "drill") gives your agent a structural understanding of your codebase — symbol graph, blast radius, semantic recall, and git-pinned memory — so it stops guessing.
|
|
16
18
|
|
|
17
19
|
<table>
|
|
18
20
|
<tr>
|
|
19
|
-
<td align="center"><b>20</b><br/>tools your agent
|
|
21
|
+
<td align="center"><b>20</b><br/>MCP tools your agent uses</td>
|
|
20
22
|
<td align="center"><b>< 2 s</b><br/>to index a 1,700-file monorepo</td>
|
|
21
|
-
<td align="center"><b>0 bytes</b><br/>of your code leave
|
|
23
|
+
<td align="center"><b>0 bytes</b><br/>of your code leave the machine</td>
|
|
22
24
|
</tr>
|
|
23
25
|
</table>
|
|
24
26
|
|
|
@@ -27,7 +29,9 @@ npm install -g sverklo
|
|
|
27
29
|
cd your-project && sverklo init
|
|
28
30
|
```
|
|
29
31
|
|
|
30
|
-
`sverklo init` auto-detects your installed AI coding
|
|
32
|
+
That's it. `sverklo init` auto-detects your installed AI coding agent (Claude Code, Cursor, Windsurf, Zed), writes the right MCP config, appends instructions to your `CLAUDE.md`, and runs `sverklo doctor` to verify the setup. **No API keys. No cloud. No telemetry.**
|
|
33
|
+
|
|
34
|
+
**Want proof before installing?** Browse the [/report leaderboard](https://sverklo.com/report) — Sverklo audits of 47 popular OSS repos (express, react-hook-form, vite, lodash, prisma, …) with grade cards for dead code, circular deps, coupling, and security.
|
|
31
35
|
|
|
32
36
|
---
|
|
33
37
|
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* +5% multiplicative bonus for files that conventionally serve as a
|
|
3
|
+
* module's entry point. Cheap disambiguation for files-with-the-same-name
|
|
4
|
+
* cases.
|
|
5
|
+
*/
|
|
6
|
+
export declare function entryPointBonus(filePath: string): number;
|
|
7
|
+
/**
|
|
8
|
+
* Path-suffix alignment. When the user typed a path-shaped query (one
|
|
9
|
+
* containing a separator), files whose path *ends* with that fragment
|
|
10
|
+
* are dramatically more likely to be the intended target. Score by the
|
|
11
|
+
* number of matched trailing segments × per-segment weight.
|
|
12
|
+
*
|
|
13
|
+
* Returns a multiplicative factor in [1.0, 1.4]. No-op (1.0) for
|
|
14
|
+
* non-path queries or when no suffix overlap exists.
|
|
15
|
+
*
|
|
16
|
+
* Borrowed shape from fff.nvim score.rs:677-700.
|
|
17
|
+
*/
|
|
18
|
+
export declare function pathSuffixAlignmentBonus(query: string, filePath: string): number;
|
|
19
|
+
/**
|
|
20
|
+
* When the MCP caller provides the file the user is currently editing,
|
|
21
|
+
* penalize candidates by directory distance. Files in the same dir or a
|
|
22
|
+
* sibling are more relevant than something across the repo. Borrowed
|
|
23
|
+
* from fff.nvim path_utils.rs:36-92.
|
|
24
|
+
*
|
|
25
|
+
* Returns a multiplicative factor in (0.5, 1.0]. No-op when currentFile
|
|
26
|
+
* is undefined.
|
|
27
|
+
*
|
|
28
|
+
* The penalty is gentle because the structural signals (PageRank, RRF)
|
|
29
|
+
* already do a lot of work — we only want to break ties between two
|
|
30
|
+
* otherwise-equivalent candidates.
|
|
31
|
+
*/
|
|
32
|
+
export declare function currentFileDistancePenalty(candidatePath: string, currentFile: string | undefined): number;
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
// Scoring boosts borrowed from fff.nvim's score.rs (MIT). Each one is
|
|
2
|
+
// independent and small enough to ship behind a feature flag if needed.
|
|
3
|
+
// All three operate on top of the RRF-fused base score, multiplicatively.
|
|
4
|
+
//
|
|
5
|
+
// FOLLOW-UP (deferred): fff.nvim also has a "dual-decay frecency" model
|
|
6
|
+
// where AI sessions get a 3-day half-life and human sessions get 10-day
|
|
7
|
+
// (frecency.rs:21-45). Implementing it for Sverklo requires tracking
|
|
8
|
+
// per-(repo, file) access timestamps and a client-type signal through
|
|
9
|
+
// the MCP layer — not in scope for this patch. Tracked for v0.13.
|
|
10
|
+
import { basename, dirname, sep } from "node:path";
|
|
11
|
+
// Files that conventionally re-export a module's surface area or define
|
|
12
|
+
// its entry point. A small bonus disambiguates the common case of "I
|
|
13
|
+
// typed `foo` and there are 12 files containing `foo`; which one is the
|
|
14
|
+
// actual module entry?". Borrowed table from fff.nvim score.rs:745.
|
|
15
|
+
const ENTRY_POINT_BASENAMES = new Set([
|
|
16
|
+
// JS / TS
|
|
17
|
+
"index.ts",
|
|
18
|
+
"index.tsx",
|
|
19
|
+
"index.js",
|
|
20
|
+
"index.jsx",
|
|
21
|
+
"index.mjs",
|
|
22
|
+
"index.cjs",
|
|
23
|
+
// Python
|
|
24
|
+
"__init__.py",
|
|
25
|
+
"__main__.py",
|
|
26
|
+
// Rust
|
|
27
|
+
"mod.rs",
|
|
28
|
+
"lib.rs",
|
|
29
|
+
"main.rs",
|
|
30
|
+
// Go
|
|
31
|
+
"main.go",
|
|
32
|
+
// C / C++
|
|
33
|
+
"main.c",
|
|
34
|
+
"main.cpp",
|
|
35
|
+
"main.cc",
|
|
36
|
+
// Java / Kotlin
|
|
37
|
+
"Main.java",
|
|
38
|
+
"Main.kt",
|
|
39
|
+
// Ruby
|
|
40
|
+
"main.rb",
|
|
41
|
+
]);
|
|
42
|
+
/**
|
|
43
|
+
* +5% multiplicative bonus for files that conventionally serve as a
|
|
44
|
+
* module's entry point. Cheap disambiguation for files-with-the-same-name
|
|
45
|
+
* cases.
|
|
46
|
+
*/
|
|
47
|
+
export function entryPointBonus(filePath) {
|
|
48
|
+
return ENTRY_POINT_BASENAMES.has(basename(filePath)) ? 1.05 : 1.0;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Path-suffix alignment. When the user typed a path-shaped query (one
|
|
52
|
+
* containing a separator), files whose path *ends* with that fragment
|
|
53
|
+
* are dramatically more likely to be the intended target. Score by the
|
|
54
|
+
* number of matched trailing segments × per-segment weight.
|
|
55
|
+
*
|
|
56
|
+
* Returns a multiplicative factor in [1.0, 1.4]. No-op (1.0) for
|
|
57
|
+
* non-path queries or when no suffix overlap exists.
|
|
58
|
+
*
|
|
59
|
+
* Borrowed shape from fff.nvim score.rs:677-700.
|
|
60
|
+
*/
|
|
61
|
+
export function pathSuffixAlignmentBonus(query, filePath) {
|
|
62
|
+
// Only kicks in for path-shaped queries.
|
|
63
|
+
if (!query.includes("/") && !query.includes(sep))
|
|
64
|
+
return 1.0;
|
|
65
|
+
// Normalize separators to forward-slash for comparison.
|
|
66
|
+
const normalizedQuery = query.replaceAll("\\", "/").toLowerCase();
|
|
67
|
+
const normalizedPath = filePath.replaceAll("\\", "/").toLowerCase();
|
|
68
|
+
const querySegments = normalizedQuery.split("/").filter(Boolean);
|
|
69
|
+
const pathSegments = normalizedPath.split("/").filter(Boolean);
|
|
70
|
+
if (querySegments.length === 0 || pathSegments.length === 0)
|
|
71
|
+
return 1.0;
|
|
72
|
+
// Count contiguous matching segments from the right. The query's last
|
|
73
|
+
// segment must exactly equal the path's last segment for a match to
|
|
74
|
+
// start; partial filename matches are handled elsewhere.
|
|
75
|
+
let matched = 0;
|
|
76
|
+
for (let i = 1; i <= Math.min(querySegments.length, pathSegments.length); i++) {
|
|
77
|
+
if (querySegments[querySegments.length - i] === pathSegments[pathSegments.length - i]) {
|
|
78
|
+
matched++;
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (matched === 0)
|
|
85
|
+
return 1.0;
|
|
86
|
+
// Each matched segment adds 10%, capped at +40%.
|
|
87
|
+
return 1.0 + Math.min(0.4, matched * 0.1);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* When the MCP caller provides the file the user is currently editing,
|
|
91
|
+
* penalize candidates by directory distance. Files in the same dir or a
|
|
92
|
+
* sibling are more relevant than something across the repo. Borrowed
|
|
93
|
+
* from fff.nvim path_utils.rs:36-92.
|
|
94
|
+
*
|
|
95
|
+
* Returns a multiplicative factor in (0.5, 1.0]. No-op when currentFile
|
|
96
|
+
* is undefined.
|
|
97
|
+
*
|
|
98
|
+
* The penalty is gentle because the structural signals (PageRank, RRF)
|
|
99
|
+
* already do a lot of work — we only want to break ties between two
|
|
100
|
+
* otherwise-equivalent candidates.
|
|
101
|
+
*/
|
|
102
|
+
export function currentFileDistancePenalty(candidatePath, currentFile) {
|
|
103
|
+
if (!currentFile || candidatePath === currentFile)
|
|
104
|
+
return 1.0;
|
|
105
|
+
const candidateDirs = dirname(candidatePath).split(/[\\/]/).filter(Boolean);
|
|
106
|
+
const currentDirs = dirname(currentFile).split(/[\\/]/).filter(Boolean);
|
|
107
|
+
// Find common prefix length.
|
|
108
|
+
let common = 0;
|
|
109
|
+
const max = Math.min(candidateDirs.length, currentDirs.length);
|
|
110
|
+
while (common < max && candidateDirs[common] === currentDirs[common]) {
|
|
111
|
+
common++;
|
|
112
|
+
}
|
|
113
|
+
// Distance = directories you'd have to walk up + over to reach the candidate.
|
|
114
|
+
const distance = candidateDirs.length - common + (currentDirs.length - common);
|
|
115
|
+
// Cap at 20 (matches fff.nvim's clamp). Each unit ~2.5% penalty.
|
|
116
|
+
// Floor at 0.5 so even far-away files don't get crushed.
|
|
117
|
+
const clamped = Math.min(20, distance);
|
|
118
|
+
return Math.max(0.5, 1.0 - 0.025 * clamped);
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=boost.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boost.js","sourceRoot":"","sources":["../../../src/search/boost.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { entryPointBonus, pathSuffixAlignmentBonus, currentFileDistancePenalty, } from "./boost.js";
|
|
3
|
+
describe("entryPointBonus", () => {
|
|
4
|
+
it("boosts conventional entry points across languages", () => {
|
|
5
|
+
expect(entryPointBonus("src/index.ts")).toBe(1.05);
|
|
6
|
+
expect(entryPointBonus("pkg/__init__.py")).toBe(1.05);
|
|
7
|
+
expect(entryPointBonus("crates/foo/src/mod.rs")).toBe(1.05);
|
|
8
|
+
expect(entryPointBonus("cmd/server/main.go")).toBe(1.05);
|
|
9
|
+
});
|
|
10
|
+
it("does not boost regular files", () => {
|
|
11
|
+
expect(entryPointBonus("src/parser.ts")).toBe(1.0);
|
|
12
|
+
expect(entryPointBonus("src/utils/string.ts")).toBe(1.0);
|
|
13
|
+
expect(entryPointBonus("README.md")).toBe(1.0);
|
|
14
|
+
});
|
|
15
|
+
});
|
|
16
|
+
describe("pathSuffixAlignmentBonus", () => {
|
|
17
|
+
it("returns 1.0 for non-path queries", () => {
|
|
18
|
+
expect(pathSuffixAlignmentBonus("authenticate", "src/auth/index.ts")).toBe(1.0);
|
|
19
|
+
expect(pathSuffixAlignmentBonus("getUserById", "src/users.ts")).toBe(1.0);
|
|
20
|
+
});
|
|
21
|
+
it("boosts when query suffix matches path suffix", () => {
|
|
22
|
+
// Single-segment match: +10%
|
|
23
|
+
expect(pathSuffixAlignmentBonus("auth/index.ts", "src/api/auth/index.ts")).toBeCloseTo(1.2);
|
|
24
|
+
// Two-segment match: +20%
|
|
25
|
+
expect(pathSuffixAlignmentBonus("api/auth/index.ts", "src/api/auth/index.ts")).toBeCloseTo(1.3);
|
|
26
|
+
});
|
|
27
|
+
it("caps at +40%", () => {
|
|
28
|
+
const score = pathSuffixAlignmentBonus("a/b/c/d/e/f/g/h.ts", "/a/b/c/d/e/f/g/h.ts");
|
|
29
|
+
expect(score).toBeLessThanOrEqual(1.4);
|
|
30
|
+
});
|
|
31
|
+
it("returns 1.0 when no suffix overlap", () => {
|
|
32
|
+
expect(pathSuffixAlignmentBonus("foo/bar.ts", "src/baz/qux.ts")).toBe(1.0);
|
|
33
|
+
});
|
|
34
|
+
it("is case-insensitive", () => {
|
|
35
|
+
expect(pathSuffixAlignmentBonus("Auth/Index.ts", "src/AUTH/INDEX.TS")).toBeCloseTo(1.2);
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
describe("currentFileDistancePenalty", () => {
|
|
39
|
+
it("returns 1.0 when no current file", () => {
|
|
40
|
+
expect(currentFileDistancePenalty("src/anywhere.ts", undefined)).toBe(1.0);
|
|
41
|
+
});
|
|
42
|
+
it("returns 1.0 when candidate IS the current file", () => {
|
|
43
|
+
expect(currentFileDistancePenalty("src/foo.ts", "src/foo.ts")).toBe(1.0);
|
|
44
|
+
});
|
|
45
|
+
it("applies small penalty for sibling files", () => {
|
|
46
|
+
// Same directory: distance 0, no penalty
|
|
47
|
+
const score = currentFileDistancePenalty("src/api/users.ts", "src/api/auth.ts");
|
|
48
|
+
expect(score).toBe(1.0);
|
|
49
|
+
});
|
|
50
|
+
it("applies larger penalty for far-away files", () => {
|
|
51
|
+
const close = currentFileDistancePenalty("src/api/users.ts", "src/api/auth.ts");
|
|
52
|
+
const far = currentFileDistancePenalty("test/integration/billing/charge.test.ts", "src/api/auth.ts");
|
|
53
|
+
expect(far).toBeLessThan(close);
|
|
54
|
+
expect(far).toBeGreaterThanOrEqual(0.5); // floor
|
|
55
|
+
});
|
|
56
|
+
it("never goes below 0.5", () => {
|
|
57
|
+
const veryFar = currentFileDistancePenalty("a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x.ts", "z/y.ts");
|
|
58
|
+
expect(veryFar).toBeGreaterThanOrEqual(0.5);
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
//# sourceMappingURL=boost.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boost.test.js","sourceRoot":"","sources":["../../../src/search/boost.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,13 @@ interface SearchOptions {
|
|
|
6
6
|
scope?: string;
|
|
7
7
|
language?: string;
|
|
8
8
|
type?: ChunkType | "any";
|
|
9
|
+
/**
|
|
10
|
+
* Repo-relative path of the file the user is currently editing. When
|
|
11
|
+
* provided, candidates are gently penalized by directory distance so
|
|
12
|
+
* results closer to the active file rank higher in tie-breaks. Pass
|
|
13
|
+
* undefined to disable. See ./boost.ts.
|
|
14
|
+
*/
|
|
15
|
+
currentFile?: string;
|
|
9
16
|
}
|
|
10
17
|
/**
|
|
11
18
|
* Result of a hybrid search — the ranked candidates plus a confidence
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { cosineSimilarity } from "../indexer/embedder.js";
|
|
2
|
+
import { entryPointBonus, pathSuffixAlignmentBonus, currentFileDistancePenalty, } from "./boost.js";
|
|
2
3
|
// Reciprocal Rank Fusion constant
|
|
3
4
|
const RRF_K = 60;
|
|
4
5
|
// Issue #4: query-shape classification. Research showed semantic search
|
|
@@ -185,7 +186,12 @@ async function rankCandidates(indexer, options) {
|
|
|
185
186
|
continue;
|
|
186
187
|
// Boost by PageRank
|
|
187
188
|
const pagerankBoost = 1 + 0.3 * file.pagerank;
|
|
188
|
-
|
|
189
|
+
// Cheap structural boosts borrowed from fff.nvim. Each is ≤±40% so
|
|
190
|
+
// they break ties without overwhelming the RRF + PageRank signal.
|
|
191
|
+
const entryBoost = entryPointBonus(file.path);
|
|
192
|
+
const suffixBoost = pathSuffixAlignmentBonus(query, file.path);
|
|
193
|
+
const distancePenalty = currentFileDistancePenalty(file.path, options.currentFile);
|
|
194
|
+
const finalScore = rrfScore * pagerankBoost * entryBoost * suffixBoost * distancePenalty;
|
|
189
195
|
candidates.push({ chunk, file, score: finalScore });
|
|
190
196
|
}
|
|
191
197
|
// Sort by score, return unbounded — caller packs.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hybrid-search.js","sourceRoot":"","sources":["../../../src/search/hybrid-search.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"hybrid-search.js","sourceRoot":"","sources":["../../../src/search/hybrid-search.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,3 +3,5 @@
|
|
|
3
3
|
* Dark theme matching sverklo.com branding. Google Fonts for typography.
|
|
4
4
|
*/
|
|
5
5
|
export declare function generateAuditHtml(markdownContent: string, projectName: string, projectPath: string): string;
|
|
6
|
+
export declare function cleanProjectName(projectName: string, projectPath: string): string;
|
|
7
|
+
export declare function deriveSourceLink(projectName: string, projectPath: string): string;
|
|
@@ -4,6 +4,12 @@
|
|
|
4
4
|
*/
|
|
5
5
|
export function generateAuditHtml(markdownContent, projectName, projectPath) {
|
|
6
6
|
const now = new Date().toISOString().slice(0, 19).replace("T", " ");
|
|
7
|
+
// Clean up project name (prefer basename of projectPath with known temp
|
|
8
|
+
// prefixes like "report-", "regen-", "rpt-", "final-", "v12-", "bench-"
|
|
9
|
+
// stripped). This prevents leaking benchmark scratch directory names into
|
|
10
|
+
// published reports.
|
|
11
|
+
const displayName = cleanProjectName(projectName, projectPath);
|
|
12
|
+
const sourceLink = deriveSourceLink(projectName, projectPath);
|
|
7
13
|
// Parse structured data from the markdown
|
|
8
14
|
const parsed = parseAuditMarkdown(markdownContent);
|
|
9
15
|
// Build dimension cards
|
|
@@ -25,12 +31,30 @@ export function generateAuditHtml(markdownContent, projectName, projectPath) {
|
|
|
25
31
|
.join("\n");
|
|
26
32
|
// Badge markdown (extracted from last section if present)
|
|
27
33
|
const badgeSection = parsed.badgeMarkdown;
|
|
34
|
+
const canonicalPath = displayName.toLowerCase();
|
|
35
|
+
const canonicalUrl = `https://sverklo.com/report/${canonicalPath}/`;
|
|
36
|
+
const seoTitle = `Sverklo Audit — ${displayName} — Grade ${parsed.overallGrade}`;
|
|
37
|
+
const seoDescription = `Sverklo code-intelligence audit of ${displayName}. Overall grade ${parsed.overallGrade}. Dead code, circular dependencies, coupling, and security analysis with reproducer.`;
|
|
28
38
|
return `<!DOCTYPE html>
|
|
29
39
|
<html lang="en">
|
|
30
40
|
<head>
|
|
31
41
|
<meta charset="UTF-8">
|
|
32
42
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
33
|
-
<title>Sverklo Audit — ${esc(
|
|
43
|
+
<title>Sverklo Audit — ${esc(displayName)}</title>
|
|
44
|
+
<meta name="description" content="${esc(seoDescription)}">
|
|
45
|
+
<link rel="canonical" href="${esc(canonicalUrl)}">
|
|
46
|
+
<meta property="og:title" content="${esc(seoTitle)}">
|
|
47
|
+
<meta property="og:description" content="${esc(seoDescription)}">
|
|
48
|
+
<meta property="og:type" content="article">
|
|
49
|
+
<meta property="og:url" content="${esc(canonicalUrl)}">
|
|
50
|
+
<meta property="og:site_name" content="Sverklo">
|
|
51
|
+
<meta property="og:image" content="https://sverklo.com/og.png">
|
|
52
|
+
<meta property="og:image:width" content="1200">
|
|
53
|
+
<meta property="og:image:height" content="630">
|
|
54
|
+
<meta name="twitter:card" content="summary_large_image">
|
|
55
|
+
<meta name="twitter:title" content="${esc(seoTitle)}">
|
|
56
|
+
<meta name="twitter:description" content="${esc(seoDescription)}">
|
|
57
|
+
<meta name="twitter:image" content="https://sverklo.com/og.png">
|
|
34
58
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
35
59
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
36
60
|
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600&family=Public+Sans:wght@400;500;600;700&display=swap" rel="stylesheet">
|
|
@@ -80,6 +104,51 @@ export function generateAuditHtml(markdownContent, projectName, projectPath) {
|
|
|
80
104
|
padding: 48px 24px 64px;
|
|
81
105
|
}
|
|
82
106
|
|
|
107
|
+
/* ── Top bar (site-standard header) ── */
|
|
108
|
+
header.top {
|
|
109
|
+
border-bottom: 1px solid var(--border);
|
|
110
|
+
padding: 16px 0;
|
|
111
|
+
position: sticky;
|
|
112
|
+
top: 0;
|
|
113
|
+
background: rgba(14, 13, 11, 0.92);
|
|
114
|
+
backdrop-filter: blur(10px);
|
|
115
|
+
-webkit-backdrop-filter: blur(10px);
|
|
116
|
+
z-index: 100;
|
|
117
|
+
}
|
|
118
|
+
header.top .wrap {
|
|
119
|
+
max-width: 960px;
|
|
120
|
+
margin: 0 auto;
|
|
121
|
+
padding: 0 32px;
|
|
122
|
+
display: flex;
|
|
123
|
+
align-items: center;
|
|
124
|
+
justify-content: space-between;
|
|
125
|
+
}
|
|
126
|
+
.brand {
|
|
127
|
+
font-family: 'JetBrains Mono', monospace;
|
|
128
|
+
font-size: 18px;
|
|
129
|
+
font-weight: 700;
|
|
130
|
+
letter-spacing: -0.02em;
|
|
131
|
+
color: var(--text);
|
|
132
|
+
text-decoration: none;
|
|
133
|
+
border: none;
|
|
134
|
+
}
|
|
135
|
+
.brand::before {
|
|
136
|
+
content: "\\25CC ";
|
|
137
|
+
color: var(--accent);
|
|
138
|
+
}
|
|
139
|
+
.top-nav {
|
|
140
|
+
display: flex;
|
|
141
|
+
gap: 24px;
|
|
142
|
+
font-family: 'JetBrains Mono', monospace;
|
|
143
|
+
font-size: 13px;
|
|
144
|
+
}
|
|
145
|
+
.top-nav a {
|
|
146
|
+
color: var(--muted);
|
|
147
|
+
text-decoration: none;
|
|
148
|
+
border: none;
|
|
149
|
+
}
|
|
150
|
+
.top-nav a:hover { color: var(--text); }
|
|
151
|
+
|
|
83
152
|
/* ── Header ── */
|
|
84
153
|
.header {
|
|
85
154
|
text-align: center;
|
|
@@ -103,6 +172,15 @@ export function generateAuditHtml(markdownContent, projectName, projectPath) {
|
|
|
103
172
|
.header .meta .project-name {
|
|
104
173
|
color: var(--text);
|
|
105
174
|
font-weight: 600;
|
|
175
|
+
font-size: inherit;
|
|
176
|
+
margin: 0;
|
|
177
|
+
display: inline;
|
|
178
|
+
}
|
|
179
|
+
/* a11y: focus ring for keyboard nav */
|
|
180
|
+
a:focus-visible, button:focus-visible {
|
|
181
|
+
outline: 2px solid var(--accent);
|
|
182
|
+
outline-offset: 2px;
|
|
183
|
+
border-radius: 2px;
|
|
106
184
|
}
|
|
107
185
|
|
|
108
186
|
/* ── Overall grade circle ── */
|
|
@@ -355,6 +433,19 @@ export function generateAuditHtml(markdownContent, projectName, projectPath) {
|
|
|
355
433
|
</style>
|
|
356
434
|
</head>
|
|
357
435
|
<body>
|
|
436
|
+
<header class="top">
|
|
437
|
+
<div class="wrap">
|
|
438
|
+
<a class="brand" href="https://sverklo.com/">sverklo</a>
|
|
439
|
+
<nav class="top-nav">
|
|
440
|
+
<a href="https://sverklo.com/report/">← All reports</a>
|
|
441
|
+
<a href="https://sverklo.com/vs/">compare</a>
|
|
442
|
+
<a href="https://sverklo.com/benchmarks/">benchmarks</a>
|
|
443
|
+
<a href="https://sverklo.com/blog/">blog</a>
|
|
444
|
+
<a href="https://github.com/sverklo/sverklo">GitHub</a>
|
|
445
|
+
</nav>
|
|
446
|
+
</div>
|
|
447
|
+
</header>
|
|
448
|
+
<main>
|
|
358
449
|
<div class="wrapper">
|
|
359
450
|
|
|
360
451
|
<div class="header">
|
|
@@ -364,8 +455,8 @@ export function generateAuditHtml(markdownContent, projectName, projectPath) {
|
|
|
364
455
|
</div>
|
|
365
456
|
<div class="grade-label">Overall Health</div>
|
|
366
457
|
<div class="meta">
|
|
367
|
-
<
|
|
368
|
-
${esc(
|
|
458
|
+
<h1 class="project-name">${esc(displayName)}</h1><br>
|
|
459
|
+
${sourceLink ? `<a href="${esc(sourceLink)}">${esc(sourceLink)}</a><br>` : ""}
|
|
369
460
|
${now}
|
|
370
461
|
</div>
|
|
371
462
|
</div>
|
|
@@ -384,6 +475,7 @@ export function generateAuditHtml(markdownContent, projectName, projectPath) {
|
|
|
384
475
|
</div>
|
|
385
476
|
|
|
386
477
|
</div>
|
|
478
|
+
</main>
|
|
387
479
|
</body>
|
|
388
480
|
</html>`;
|
|
389
481
|
}
|
|
@@ -415,6 +507,53 @@ function inline(text) {
|
|
|
415
507
|
.replace(/_(.+?)_/g, "<em>$1</em>")
|
|
416
508
|
.replace(/`([^`]+)`/g, "<code>$1</code>");
|
|
417
509
|
}
|
|
510
|
+
// Known temp/scratch directory prefixes produced by benchmark scripts. These
|
|
511
|
+
// must not leak into published audit reports.
|
|
512
|
+
const TEMP_PREFIXES = [
|
|
513
|
+
"report-",
|
|
514
|
+
"regen-",
|
|
515
|
+
"rpt-",
|
|
516
|
+
"final-",
|
|
517
|
+
"bench-",
|
|
518
|
+
// versioned variants: v12-, v9-, v0.12-, etc.
|
|
519
|
+
];
|
|
520
|
+
export function cleanProjectName(projectName, projectPath) {
|
|
521
|
+
// Prefer basename of the absolute path; fall back to the provided name.
|
|
522
|
+
const base = basename(projectPath) || projectName || "project";
|
|
523
|
+
const stripped = stripTempPrefix(base);
|
|
524
|
+
// Convert "expressjs_express" style separators used by benchmark scripts
|
|
525
|
+
// into "expressjs/express".
|
|
526
|
+
return stripped.replace(/_/g, "/");
|
|
527
|
+
}
|
|
528
|
+
export function deriveSourceLink(projectName, projectPath) {
|
|
529
|
+
const base = basename(projectPath) || projectName || "";
|
|
530
|
+
const stripped = stripTempPrefix(base);
|
|
531
|
+
// Must look like "owner_repo" to derive a GitHub URL.
|
|
532
|
+
const parts = stripped.split("_");
|
|
533
|
+
if (parts.length === 2 && parts[0] && parts[1]) {
|
|
534
|
+
return `https://github.com/${parts[0]}/${parts[1]}`;
|
|
535
|
+
}
|
|
536
|
+
return "";
|
|
537
|
+
}
|
|
538
|
+
function stripTempPrefix(name) {
|
|
539
|
+
for (const prefix of TEMP_PREFIXES) {
|
|
540
|
+
if (name.startsWith(prefix))
|
|
541
|
+
return name.slice(prefix.length);
|
|
542
|
+
}
|
|
543
|
+
// Strip "vN-" / "vN.N-" style version prefixes.
|
|
544
|
+
const versioned = name.match(/^v\d+(?:\.\d+)?-(.+)$/);
|
|
545
|
+
if (versioned)
|
|
546
|
+
return versioned[1];
|
|
547
|
+
return name;
|
|
548
|
+
}
|
|
549
|
+
function basename(p) {
|
|
550
|
+
if (!p)
|
|
551
|
+
return "";
|
|
552
|
+
// Strip trailing slashes, then return everything after the last "/".
|
|
553
|
+
const trimmed = p.replace(/\/+$/, "");
|
|
554
|
+
const idx = trimmed.lastIndexOf("/");
|
|
555
|
+
return idx === -1 ? trimmed : trimmed.slice(idx + 1);
|
|
556
|
+
}
|
|
418
557
|
function parseAuditMarkdown(md) {
|
|
419
558
|
const lines = md.split("\n");
|
|
420
559
|
let overallGrade = "?";
|
|
@@ -433,27 +572,44 @@ function parseAuditMarkdown(md) {
|
|
|
433
572
|
}
|
|
434
573
|
i++;
|
|
435
574
|
}
|
|
436
|
-
// Parse dimension table
|
|
575
|
+
// Parse dimension table. Skip blank lines between the grade heading and the
|
|
576
|
+
// table; only stop once we've seen at least one table row and then hit a
|
|
577
|
+
// non-table line (or a "## " section heading, which starts the next block).
|
|
578
|
+
let sawTableRow = false;
|
|
437
579
|
while (i < lines.length) {
|
|
438
580
|
const line = lines[i];
|
|
581
|
+
const trimmed = line.trim();
|
|
582
|
+
if (trimmed === "") {
|
|
583
|
+
// A blank line after the table ends it; before the table, keep scanning.
|
|
584
|
+
if (sawTableRow)
|
|
585
|
+
break;
|
|
586
|
+
i++;
|
|
587
|
+
continue;
|
|
588
|
+
}
|
|
589
|
+
if (line.startsWith("## ") || line.startsWith("# "))
|
|
590
|
+
break;
|
|
439
591
|
// Skip table header/separator rows
|
|
440
|
-
if (line.startsWith("| Dimension") || line
|
|
592
|
+
if (line.startsWith("| Dimension") || /^\|\s*-/.test(line)) {
|
|
441
593
|
i++;
|
|
442
594
|
continue;
|
|
443
595
|
}
|
|
444
596
|
if (line.startsWith("|")) {
|
|
445
597
|
const cells = line.split("|").filter(Boolean).map((c) => c.trim());
|
|
446
|
-
if (cells.length >= 3) {
|
|
598
|
+
if (cells.length >= 3 && /^[A-F]$/.test(cells[1])) {
|
|
447
599
|
dimensions.push({
|
|
448
600
|
name: cells[0],
|
|
449
601
|
grade: cells[1],
|
|
450
602
|
detail: cells[2],
|
|
451
603
|
});
|
|
604
|
+
sawTableRow = true;
|
|
452
605
|
}
|
|
453
606
|
i++;
|
|
454
607
|
continue;
|
|
455
608
|
}
|
|
456
|
-
|
|
609
|
+
// Non-table, non-blank, non-heading line — if we've seen rows, stop.
|
|
610
|
+
if (sawTableRow)
|
|
611
|
+
break;
|
|
612
|
+
i++;
|
|
457
613
|
}
|
|
458
614
|
// Parse remaining sections (## headings)
|
|
459
615
|
let currentTitle = "";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit-html.js","sourceRoot":"","sources":["../../../src/server/audit-html.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"audit-html.js","sourceRoot":"","sources":["../../../src/server/audit-html.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { generateAuditHtml, cleanProjectName, deriveSourceLink, } from "./audit-html.js";
|
|
3
|
+
const SAMPLE_MD = `# Sverklo Project Audit — Grade: B
|
|
4
|
+
|
|
5
|
+
| Dimension | Score | Detail |
|
|
6
|
+
|---|---|---|
|
|
7
|
+
| Dead code | B | 8 of 415 symbols unreferenced |
|
|
8
|
+
| Circular deps | A | No cycles detected |
|
|
9
|
+
| Coupling | C | Top file has PageRank 1.00 |
|
|
10
|
+
| Security | F | 4 critical issues |
|
|
11
|
+
|
|
12
|
+
## Overview
|
|
13
|
+
|
|
14
|
+
- **141** files indexed
|
|
15
|
+
- **415** code symbols extracted
|
|
16
|
+
`;
|
|
17
|
+
describe("cleanProjectName", () => {
|
|
18
|
+
it("strips 'report-' prefix", () => {
|
|
19
|
+
expect(cleanProjectName("report-expressjs_express", "/private/tmp/report-expressjs_express")).toBe("expressjs/express");
|
|
20
|
+
});
|
|
21
|
+
it("strips 'regen-' prefix", () => {
|
|
22
|
+
expect(cleanProjectName("regen-claude-mem", "/private/tmp/regen-claude-mem")).toBe("claude-mem");
|
|
23
|
+
});
|
|
24
|
+
it("strips 'bench-' prefix", () => {
|
|
25
|
+
expect(cleanProjectName("bench-nest", "/tmp/bench-nest")).toBe("nest");
|
|
26
|
+
});
|
|
27
|
+
it("strips version-style prefixes like 'v12-'", () => {
|
|
28
|
+
expect(cleanProjectName("v12-foo_bar", "/tmp/v12-foo_bar")).toBe("foo/bar");
|
|
29
|
+
});
|
|
30
|
+
it("leaves a clean name untouched", () => {
|
|
31
|
+
expect(cleanProjectName("sverklo", "/Users/nikita/projects/sverklo")).toBe("sverklo");
|
|
32
|
+
});
|
|
33
|
+
it("prefers basename of projectPath over projectName", () => {
|
|
34
|
+
expect(cleanProjectName("report-expressjs_express", "/Users/me/real-project")).toBe("real-project");
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
describe("deriveSourceLink", () => {
|
|
38
|
+
it("builds a GitHub URL from 'owner_repo' form", () => {
|
|
39
|
+
expect(deriveSourceLink("report-expressjs_express", "/private/tmp/report-expressjs_express")).toBe("https://github.com/expressjs/express");
|
|
40
|
+
});
|
|
41
|
+
it("returns empty string when owner/repo can't be derived", () => {
|
|
42
|
+
expect(deriveSourceLink("regen-claude-mem", "/private/tmp/regen-claude-mem")).toBe("");
|
|
43
|
+
});
|
|
44
|
+
it("returns empty string for regular project paths", () => {
|
|
45
|
+
expect(deriveSourceLink("sverklo", "/Users/nikita/projects/sverklo")).toBe("");
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
describe("generateAuditHtml", () => {
|
|
49
|
+
const html = generateAuditHtml(SAMPLE_MD, "report-expressjs_express", "/private/tmp/report-expressjs_express");
|
|
50
|
+
it("renders the site-standard top header with brand + nav", () => {
|
|
51
|
+
expect(html).toContain('<header class="top">');
|
|
52
|
+
expect(html).toContain('class="brand"');
|
|
53
|
+
expect(html).toContain('class="top-nav"');
|
|
54
|
+
expect(html).toContain("All reports");
|
|
55
|
+
expect(html).toContain("https://github.com/sverklo/sverklo");
|
|
56
|
+
expect(html).toContain("https://sverklo.com/vs/");
|
|
57
|
+
expect(html).toContain("https://sverklo.com/blog/");
|
|
58
|
+
});
|
|
59
|
+
it("populates dimension cards (P0-1 fix)", () => {
|
|
60
|
+
expect(html).toContain("Dead code");
|
|
61
|
+
expect(html).toContain("Circular deps");
|
|
62
|
+
expect(html).toContain("Coupling");
|
|
63
|
+
expect(html).toContain("Security");
|
|
64
|
+
// Empty dimensions block regression check:
|
|
65
|
+
expect(html).not.toMatch(/<div class="dimensions">\s*<\/div>/);
|
|
66
|
+
});
|
|
67
|
+
it("uses a clean owner/repo display name in title and header (P0-7 fix)", () => {
|
|
68
|
+
expect(html).toContain("<title>Sverklo Audit — expressjs/express</title>");
|
|
69
|
+
expect(html).toContain('<h1 class="project-name">expressjs/express</h1>');
|
|
70
|
+
expect(html).not.toContain("report-expressjs_express");
|
|
71
|
+
});
|
|
72
|
+
it("replaces the /private/tmp path with the GitHub URL (P1-7 fix)", () => {
|
|
73
|
+
expect(html).not.toContain("/private/tmp/");
|
|
74
|
+
expect(html).toContain("https://github.com/expressjs/express");
|
|
75
|
+
});
|
|
76
|
+
it("still renders overall grade ring", () => {
|
|
77
|
+
expect(html).toContain("grade-letter");
|
|
78
|
+
expect(html).toMatch(/>B</);
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
//# sourceMappingURL=audit-html.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-html.test.js","sourceRoot":"","sources":["../../../src/server/audit-html.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -36,6 +36,13 @@ export const searchTool = {
|
|
|
36
36
|
enum: ["function", "class", "type", "interface", "method", "any"],
|
|
37
37
|
description: "Filter by symbol type (default: any)",
|
|
38
38
|
},
|
|
39
|
+
current_file: {
|
|
40
|
+
type: "string",
|
|
41
|
+
description: "Optional: repo-relative path of the file the user is currently editing. " +
|
|
42
|
+
"When provided, results closer to this file (in directory distance) get a " +
|
|
43
|
+
"small ranking boost — useful for breaking ties between equally-relevant " +
|
|
44
|
+
"candidates.",
|
|
45
|
+
},
|
|
39
46
|
},
|
|
40
47
|
required: ["query"],
|
|
41
48
|
},
|
|
@@ -48,6 +55,7 @@ export async function handleSearch(indexer, args) {
|
|
|
48
55
|
scope: args.scope,
|
|
49
56
|
language: args.language,
|
|
50
57
|
type: args.type || "any",
|
|
58
|
+
currentFile: args.current_file,
|
|
51
59
|
});
|
|
52
60
|
const body = formatResults(response.results);
|
|
53
61
|
// Confidence footer — issue #4. Keep it terse and only attach
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../../src/server/tools/search.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAE1F,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,IAAI,EAAE,gBAAgB;IACtB,WAAW,EACT,uDAAuD;QACvD,8EAA8E;QAC9E,gFAAgF;QAChF,mFAAmF;QACnF,mCAAmC;QACnC,yEAAyE;QACzE,6EAA6E;QAC7E,4EAA4E;QAC5E,2EAA2E;QAC3E,sDAAsD;IACxD,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,wCAAwC;aACtD;YACD,YAAY,EAAE;gBACZ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,sCAAsC;aACpD;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,uCAAuC;aACrD;YACD,QAAQ,EAAE;gBACR,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,uCAAuC;aACrD;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,CAAC;gBACjE,WAAW,EAAE,sCAAsC;aACpD;SACF;QACD,QAAQ,EAAE,CAAC,OAAO,CAAC;KACpB;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAgB,EAChB,IAA6B;IAE7B,MAAM,WAAW,GAAG,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAG,MAAM,0BAA0B,CAAC,OAAO,EAAE;QACzD,KAAK,EAAE,IAAI,CAAC,KAAe;QAC3B,WAAW;QACX,KAAK,EAAE,IAAI,CAAC,KAA2B;QACvC,QAAQ,EAAE,IAAI,CAAC,QAA8B;QAC7C,IAAI,EAAG,IAAI,CAAC,IAA0B,IAAI,KAAK;
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../../src/server/tools/search.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sverklo",
|
|
3
3
|
"mcpName": "io.github.sverklo/sverklo",
|
|
4
|
-
"version": "0.12.
|
|
4
|
+
"version": "0.12.3",
|
|
5
5
|
"description": "Sverklo — local-first code intelligence MCP server. Diff-aware MR review, risk scoring, hybrid semantic search, PageRank ranking, persistent memory. Zero config.",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"bin": {
|