sverklo 0.2.1 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -14
- package/dist/bin/sverklo.js +33 -3
- package/dist/bin/sverklo.js.map +1 -1
- package/dist/src/doctor.d.ts +1 -0
- package/dist/src/doctor.js +238 -0
- package/dist/src/doctor.js.map +1 -0
- package/dist/src/init.d.ts +1 -0
- package/dist/src/init.js +86 -82
- package/dist/src/init.js.map +1 -1
- package/dist/src/memory/import.d.ts +3 -1
- package/dist/src/memory/import.js +17 -1
- package/dist/src/memory/import.js.map +1 -1
- package/dist/src/memory/mine-chats.d.ts +19 -0
- package/dist/src/memory/mine-chats.js +376 -0
- package/dist/src/memory/mine-chats.js.map +1 -0
- package/dist/src/server/mcp-server.js +25 -1
- package/dist/src/server/mcp-server.js.map +1 -1
- package/dist/src/server/tools/audit.js +1 -1
- package/dist/src/server/tools/dependencies.js +2 -2
- package/dist/src/server/tools/find-references.js +2 -2
- package/dist/src/server/tools/index-status.js +68 -9
- package/dist/src/server/tools/index-status.js.map +1 -1
- package/dist/src/server/tools/lookup.js +2 -2
- package/dist/src/server/tools/overview.js +2 -2
- package/dist/src/server/tools/search.js +2 -2
- package/dist/src/server/tools/wakeup.d.ts +24 -0
- package/dist/src/server/tools/wakeup.js +71 -0
- package/dist/src/server/tools/wakeup.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
# Sverklo
|
|
2
2
|
|
|
3
|
-
**
|
|
3
|
+
**Other tools remember your conversations. Sverklo understands your code.**
|
|
4
|
+
|
|
5
|
+
Local-first code intelligence MCP with hybrid semantic search, symbol-level impact analysis, and bi-temporal memory tied to git state. **5.1× fewer tokens** than grep in benchmarks — roughly **$78–$390/month saved per developer** at Claude API pricing.
|
|
4
6
|
|
|
5
7
|
One command gives Claude Code, Cursor, or any MCP agent deep codebase understanding — semantic search, dependency ranking, and persistent memory. Everything runs locally. No API keys. No cloud.
|
|
6
8
|
|
|
@@ -67,33 +69,37 @@ Agent query → BM25 text search ──┐
|
|
|
67
69
|
|
|
68
70
|
## Quick Start
|
|
69
71
|
|
|
70
|
-
### Claude Code (recommended)
|
|
71
72
|
```bash
|
|
73
|
+
npm install -g sverklo
|
|
74
|
+
cd your-project
|
|
72
75
|
sverklo init
|
|
73
76
|
```
|
|
74
|
-
|
|
77
|
+
|
|
78
|
+
This creates `.mcp.json` at your project root (the only file Claude Code reads for project-scoped MCP servers) and appends sverklo instructions to your `CLAUDE.md`. Safe to re-run.
|
|
79
|
+
|
|
80
|
+
If sverklo doesn't appear in Claude Code's `/mcp` list after restart, run:
|
|
81
|
+
```bash
|
|
82
|
+
sverklo doctor
|
|
83
|
+
```
|
|
84
|
+
This diagnoses MCP setup issues — checks the binary, the model, the config file location, the handshake, and tells you exactly what's wrong.
|
|
75
85
|
|
|
76
86
|
### Cursor / Windsurf / VS Code
|
|
77
|
-
|
|
87
|
+
These IDEs use their own MCP config locations. Use the **full binary path** to avoid PATH resolution issues in spawned subprocesses:
|
|
78
88
|
```json
|
|
79
89
|
{
|
|
80
90
|
"mcpServers": {
|
|
81
91
|
"sverklo": {
|
|
82
|
-
"command": "sverklo",
|
|
92
|
+
"command": "/full/path/to/sverklo",
|
|
83
93
|
"args": ["."]
|
|
84
94
|
}
|
|
85
95
|
}
|
|
86
96
|
}
|
|
87
97
|
```
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
Add to `.vscode/mcp.json` (same format as Cursor).
|
|
94
|
-
|
|
95
|
-
### JetBrains
|
|
96
|
-
Settings → Tools → MCP Servers → Add → command: `npx`, args: `sverklo .`
|
|
98
|
+
Find the path with `which sverklo`. Add to:
|
|
99
|
+
- **Cursor:** `.cursor/mcp.json`
|
|
100
|
+
- **Windsurf:** `~/.windsurf/mcp.json`
|
|
101
|
+
- **VS Code:** `.vscode/mcp.json`
|
|
102
|
+
- **JetBrains:** Settings → Tools → MCP Servers
|
|
97
103
|
|
|
98
104
|
### Any MCP Client
|
|
99
105
|
```bash
|
package/dist/bin/sverklo.js
CHANGED
|
@@ -20,13 +20,20 @@ if (command === "--version" || command === "-v" || command === "-V") {
|
|
|
20
20
|
process.exit(0);
|
|
21
21
|
}
|
|
22
22
|
if (command === "init") {
|
|
23
|
-
// Parse flags: --auto-capture
|
|
23
|
+
// Parse flags: --auto-capture, --mine-chats
|
|
24
24
|
const flags = args.filter((a) => a.startsWith("--"));
|
|
25
25
|
const positional = args.filter((a) => !a.startsWith("--"));
|
|
26
26
|
const autoCapture = flags.includes("--auto-capture");
|
|
27
|
+
const mineChats = flags.includes("--mine-chats");
|
|
27
28
|
const projectPath = resolve(positional[1] || process.cwd());
|
|
28
29
|
const { initProject } = await import("../src/init.js");
|
|
29
|
-
await initProject(projectPath, { autoCapture });
|
|
30
|
+
await initProject(projectPath, { autoCapture, mineChats });
|
|
31
|
+
process.exit(0);
|
|
32
|
+
}
|
|
33
|
+
if (command === "doctor" || command === "diagnose" || command === "check") {
|
|
34
|
+
const projectPath = resolve(args[1] || process.cwd());
|
|
35
|
+
const { runDoctor } = await import("../src/doctor.js");
|
|
36
|
+
runDoctor(projectPath);
|
|
30
37
|
process.exit(0);
|
|
31
38
|
}
|
|
32
39
|
if (command === "workspace") {
|
|
@@ -114,6 +121,27 @@ Usage:
|
|
|
114
121
|
`);
|
|
115
122
|
process.exit(0);
|
|
116
123
|
}
|
|
124
|
+
if (command === "wakeup" || command === "wake-up") {
|
|
125
|
+
const projectPath = resolve(args[1] || process.cwd());
|
|
126
|
+
const { existsSync } = await import("node:fs");
|
|
127
|
+
const { join } = await import("node:path");
|
|
128
|
+
const { homedir } = await import("node:os");
|
|
129
|
+
const modelDir = join(homedir(), ".sverklo", "models");
|
|
130
|
+
if (!existsSync(join(modelDir, "model.onnx"))) {
|
|
131
|
+
const { setupModels } = await import("../src/indexer/setup.js");
|
|
132
|
+
await setupModels().catch(() => { });
|
|
133
|
+
}
|
|
134
|
+
const { getProjectConfig } = await import("../src/utils/config.js");
|
|
135
|
+
const { Indexer } = await import("../src/indexer/indexer.js");
|
|
136
|
+
const { generateWakeup } = await import("../src/server/tools/wakeup.js");
|
|
137
|
+
const config = getProjectConfig(projectPath);
|
|
138
|
+
const indexer = new Indexer(config);
|
|
139
|
+
// Use existing index — don't re-run
|
|
140
|
+
const output = generateWakeup(indexer, { maxTokens: 500 });
|
|
141
|
+
indexer.close();
|
|
142
|
+
console.log(output);
|
|
143
|
+
process.exit(0);
|
|
144
|
+
}
|
|
117
145
|
if (command === "setup" || command === "install") {
|
|
118
146
|
const { setupModels } = await import("../src/indexer/setup.js");
|
|
119
147
|
await setupModels();
|
|
@@ -151,9 +179,11 @@ if (command === "--help" || command === "-h") {
|
|
|
151
179
|
sverklo — code intelligence for AI agents
|
|
152
180
|
|
|
153
181
|
Usage:
|
|
154
|
-
sverklo init Set up sverklo in your project (
|
|
182
|
+
sverklo init Set up sverklo in your project (.mcp.json + CLAUDE.md)
|
|
183
|
+
sverklo doctor Diagnose MCP setup issues
|
|
155
184
|
sverklo [project-path] Start the MCP server (stdio transport)
|
|
156
185
|
sverklo ui [project-path] Open the web dashboard
|
|
186
|
+
sverklo wakeup Print compressed project context (for system-prompt injection)
|
|
157
187
|
sverklo setup Download the embedding model (~90MB)
|
|
158
188
|
sverklo --help Show this help
|
|
159
189
|
|
package/dist/bin/sverklo.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sverklo.js","sourceRoot":"","sources":["../../bin/sverklo.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AAExB,IAAI,OAAO,KAAK,WAAW,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;IACpE,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;IACjD,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;IACpD,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACvD,kEAAkE;IAClE,KAAK,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;YACjF,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;IACvB,
|
|
1
|
+
{"version":3,"file":"sverklo.js","sourceRoot":"","sources":["../../bin/sverklo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function runDoctor(projectPath: string): void;
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import { existsSync, readFileSync, statSync } from "node:fs";
|
|
2
|
+
import { execSync, spawnSync } from "node:child_process";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { homedir } from "node:os";
|
|
5
|
+
export function runDoctor(projectPath) {
|
|
6
|
+
const checks = [];
|
|
7
|
+
// 1. Binary on PATH
|
|
8
|
+
let sverkloBin = null;
|
|
9
|
+
try {
|
|
10
|
+
sverkloBin = execSync("command -v sverklo", { encoding: "utf-8" }).trim();
|
|
11
|
+
checks.push({
|
|
12
|
+
name: "sverklo binary",
|
|
13
|
+
status: "ok",
|
|
14
|
+
message: sverkloBin,
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
checks.push({
|
|
19
|
+
name: "sverklo binary",
|
|
20
|
+
status: "fail",
|
|
21
|
+
message: "not found on PATH",
|
|
22
|
+
fix: "npm install -g sverklo",
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
// 2. Version
|
|
26
|
+
if (sverkloBin) {
|
|
27
|
+
try {
|
|
28
|
+
const version = execSync(`${sverkloBin} --version`, { encoding: "utf-8" }).trim();
|
|
29
|
+
checks.push({
|
|
30
|
+
name: "version",
|
|
31
|
+
status: "ok",
|
|
32
|
+
message: version,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
checks.push({
|
|
37
|
+
name: "version",
|
|
38
|
+
status: "fail",
|
|
39
|
+
message: "failed to run --version",
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// 3. ONNX model
|
|
44
|
+
const modelPath = join(homedir(), ".sverklo", "models", "model.onnx");
|
|
45
|
+
if (existsSync(modelPath)) {
|
|
46
|
+
const size = statSync(modelPath).size;
|
|
47
|
+
checks.push({
|
|
48
|
+
name: "embedding model",
|
|
49
|
+
status: "ok",
|
|
50
|
+
message: `${(size / 1024 / 1024).toFixed(0)}MB at ~/.sverklo/models/model.onnx`,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
checks.push({
|
|
55
|
+
name: "embedding model",
|
|
56
|
+
status: "warn",
|
|
57
|
+
message: "not downloaded yet (will auto-download on first MCP tool call)",
|
|
58
|
+
fix: "sverklo setup",
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
// 4. .mcp.json at PROJECT ROOT (the only place Claude Code reads)
|
|
62
|
+
const mcpPath = join(projectPath, ".mcp.json");
|
|
63
|
+
if (existsSync(mcpPath)) {
|
|
64
|
+
try {
|
|
65
|
+
const mcp = JSON.parse(readFileSync(mcpPath, "utf-8"));
|
|
66
|
+
if (mcp.mcpServers?.sverklo) {
|
|
67
|
+
const cmd = mcp.mcpServers.sverklo.command;
|
|
68
|
+
if (cmd === "sverklo" || cmd?.endsWith("/sverklo")) {
|
|
69
|
+
checks.push({
|
|
70
|
+
name: ".mcp.json (project root)",
|
|
71
|
+
status: "ok",
|
|
72
|
+
message: `sverklo configured: ${cmd}`,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
checks.push({
|
|
77
|
+
name: ".mcp.json (project root)",
|
|
78
|
+
status: "warn",
|
|
79
|
+
message: `command is "${cmd}" — may not resolve in subprocess`,
|
|
80
|
+
fix: "Use full path: " + (sverkloBin || "/path/to/sverklo"),
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
checks.push({
|
|
86
|
+
name: ".mcp.json (project root)",
|
|
87
|
+
status: "fail",
|
|
88
|
+
message: "exists but does not configure sverklo",
|
|
89
|
+
fix: "sverklo init",
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
checks.push({
|
|
95
|
+
name: ".mcp.json (project root)",
|
|
96
|
+
status: "fail",
|
|
97
|
+
message: "exists but is invalid JSON",
|
|
98
|
+
fix: "Delete .mcp.json and run: sverklo init",
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
checks.push({
|
|
104
|
+
name: ".mcp.json (project root)",
|
|
105
|
+
status: "fail",
|
|
106
|
+
message: "missing — Claude Code will not load sverklo",
|
|
107
|
+
fix: "sverklo init",
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
// 5. Legacy .claude/mcp.json (does NOT work — flag it)
|
|
111
|
+
const legacyMcp = join(projectPath, ".claude", "mcp.json");
|
|
112
|
+
if (existsSync(legacyMcp)) {
|
|
113
|
+
checks.push({
|
|
114
|
+
name: ".claude/mcp.json (legacy)",
|
|
115
|
+
status: "warn",
|
|
116
|
+
message: "this file exists but Claude Code does NOT read it",
|
|
117
|
+
fix: "config moved to .mcp.json at project root — safe to delete",
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
// 6. CLAUDE.md
|
|
121
|
+
const claudeMdPath = join(projectPath, "CLAUDE.md");
|
|
122
|
+
if (existsSync(claudeMdPath)) {
|
|
123
|
+
const content = readFileSync(claudeMdPath, "utf-8");
|
|
124
|
+
if (content.includes("sverklo_search")) {
|
|
125
|
+
checks.push({
|
|
126
|
+
name: "CLAUDE.md",
|
|
127
|
+
status: "ok",
|
|
128
|
+
message: "contains sverklo instructions",
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
checks.push({
|
|
133
|
+
name: "CLAUDE.md",
|
|
134
|
+
status: "warn",
|
|
135
|
+
message: "exists but does not mention sverklo",
|
|
136
|
+
fix: "sverklo init (will append instructions)",
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
checks.push({
|
|
142
|
+
name: "CLAUDE.md",
|
|
143
|
+
status: "warn",
|
|
144
|
+
message: "missing — agents will not know to prefer sverklo over grep",
|
|
145
|
+
fix: "sverklo init",
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
// 7. MCP handshake (actually try to talk to the server)
|
|
149
|
+
if (sverkloBin) {
|
|
150
|
+
try {
|
|
151
|
+
const result = spawnSync(sverkloBin, ["."], {
|
|
152
|
+
input: JSON.stringify({
|
|
153
|
+
jsonrpc: "2.0",
|
|
154
|
+
id: 1,
|
|
155
|
+
method: "initialize",
|
|
156
|
+
params: {
|
|
157
|
+
protocolVersion: "2024-11-05",
|
|
158
|
+
capabilities: {},
|
|
159
|
+
clientInfo: { name: "sverklo-doctor", version: "1.0" },
|
|
160
|
+
},
|
|
161
|
+
}) + "\n",
|
|
162
|
+
encoding: "utf-8",
|
|
163
|
+
cwd: projectPath,
|
|
164
|
+
timeout: 8000,
|
|
165
|
+
maxBuffer: 1024 * 1024,
|
|
166
|
+
});
|
|
167
|
+
const out = result.stdout || "";
|
|
168
|
+
const firstLine = out.split("\n").find((l) => l.trim());
|
|
169
|
+
if (firstLine) {
|
|
170
|
+
try {
|
|
171
|
+
const parsed = JSON.parse(firstLine);
|
|
172
|
+
if (parsed.result?.serverInfo?.name === "sverklo") {
|
|
173
|
+
checks.push({
|
|
174
|
+
name: "MCP handshake",
|
|
175
|
+
status: "ok",
|
|
176
|
+
message: `responds correctly (protocol ${parsed.result.protocolVersion})`,
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
checks.push({
|
|
181
|
+
name: "MCP handshake",
|
|
182
|
+
status: "warn",
|
|
183
|
+
message: "unexpected response shape",
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
checks.push({
|
|
189
|
+
name: "MCP handshake",
|
|
190
|
+
status: "fail",
|
|
191
|
+
message: "first stdout line is not valid JSON",
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
checks.push({
|
|
197
|
+
name: "MCP handshake",
|
|
198
|
+
status: "fail",
|
|
199
|
+
message: "no stdout received",
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
catch (err) {
|
|
204
|
+
checks.push({
|
|
205
|
+
name: "MCP handshake",
|
|
206
|
+
status: "fail",
|
|
207
|
+
message: err instanceof Error ? err.message : "spawn failed",
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
// ── Print results ──
|
|
212
|
+
console.log("");
|
|
213
|
+
console.log("sverklo doctor — checking MCP setup");
|
|
214
|
+
console.log("");
|
|
215
|
+
for (const c of checks) {
|
|
216
|
+
const icon = c.status === "ok" ? "✓" : c.status === "warn" ? "!" : "✗";
|
|
217
|
+
const color = c.status === "ok" ? "\x1b[32m" : c.status === "warn" ? "\x1b[33m" : "\x1b[31m";
|
|
218
|
+
const reset = "\x1b[0m";
|
|
219
|
+
console.log(` ${color}${icon}${reset} ${c.name.padEnd(28)} ${c.message}`);
|
|
220
|
+
if (c.fix) {
|
|
221
|
+
console.log(` ${"".padEnd(28)} → ${c.fix}`);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
const failed = checks.filter((c) => c.status === "fail").length;
|
|
225
|
+
const warned = checks.filter((c) => c.status === "warn").length;
|
|
226
|
+
console.log("");
|
|
227
|
+
if (failed === 0 && warned === 0) {
|
|
228
|
+
console.log("All checks passed. Restart Claude Code if sverklo isn't already loaded.");
|
|
229
|
+
}
|
|
230
|
+
else if (failed === 0) {
|
|
231
|
+
console.log(`${warned} warning${warned === 1 ? "" : "s"} — sverklo should still work but may not be optimal.`);
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
console.log(`${failed} failure${failed === 1 ? "" : "s"}, ${warned} warning${warned === 1 ? "" : "s"}. Fix the failures above.`);
|
|
235
|
+
}
|
|
236
|
+
console.log("");
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/doctor.ts"],"names":[],"mappings":"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"}
|
package/dist/src/init.d.ts
CHANGED
package/dist/src/init.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { existsSync, readFileSync, writeFileSync, mkdirSync } from "node:fs";
|
|
2
|
+
import { execSync } from "node:child_process";
|
|
2
3
|
import { join } from "node:path";
|
|
3
4
|
const CLAUDE_MD_SNIPPET = `
|
|
4
5
|
## Sverklo — Code Intelligence
|
|
@@ -13,46 +14,37 @@ When sverklo MCP server is connected, **always prefer sverklo tools over built-i
|
|
|
13
14
|
- \`sverklo_remember\` — save important decisions and patterns
|
|
14
15
|
- \`sverklo_recall\` — check past decisions before making new ones
|
|
15
16
|
`;
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
// sverklo_remember. Cheap, non-blocking, model-driven (no heuristic false positives).
|
|
37
|
-
base.hooks.PostToolUse = [
|
|
17
|
+
/**
|
|
18
|
+
* Resolve the absolute path to the sverklo binary.
|
|
19
|
+
* Using a full path is more reliable than relying on PATH inheritance
|
|
20
|
+
* when Claude Code spawns the subprocess.
|
|
21
|
+
*/
|
|
22
|
+
function resolveSverkloBinary() {
|
|
23
|
+
try {
|
|
24
|
+
return execSync("command -v sverklo", { encoding: "utf-8" }).trim() || "sverklo";
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return "sverklo";
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function buildAutoCaptureHook() {
|
|
31
|
+
// PostToolUse hook — nudge Claude to capture decisions after Edit/Write tool calls.
|
|
32
|
+
// The hook output is visible to Claude, who decides whether to call sverklo_remember.
|
|
33
|
+
// Cheap, non-blocking, model-driven (no heuristic false positives).
|
|
34
|
+
return {
|
|
35
|
+
matcher: "Edit|Write|NotebookEdit",
|
|
36
|
+
hooks: [
|
|
38
37
|
{
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
type: "command",
|
|
43
|
-
command: "echo 'If this edit represents a design decision, architectural choice, or pattern worth remembering, call sverklo_remember to save it. Skip if it is a routine fix.'",
|
|
44
|
-
timeout: 3,
|
|
45
|
-
},
|
|
46
|
-
],
|
|
38
|
+
type: "command",
|
|
39
|
+
command: "echo 'If this edit represents a design decision, architectural choice, or pattern worth remembering, call sverklo_remember to save it. Skip if it is a routine fix.'",
|
|
40
|
+
timeout: 3,
|
|
47
41
|
},
|
|
48
|
-
]
|
|
49
|
-
}
|
|
50
|
-
return base;
|
|
42
|
+
],
|
|
43
|
+
};
|
|
51
44
|
}
|
|
52
45
|
export async function initProject(projectPath, options = {}) {
|
|
53
46
|
console.log("Initializing Sverklo in", projectPath);
|
|
54
47
|
console.log("");
|
|
55
|
-
const HOOKS_CONFIG = buildHooksConfig(options.autoCapture ?? false);
|
|
56
48
|
// 1. Add CLAUDE.md snippet
|
|
57
49
|
const claudeMdPath = join(projectPath, "CLAUDE.md");
|
|
58
50
|
if (existsSync(claudeMdPath)) {
|
|
@@ -69,46 +61,10 @@ export async function initProject(projectPath, options = {}) {
|
|
|
69
61
|
writeFileSync(claudeMdPath, CLAUDE_MD_SNIPPET.trim() + "\n");
|
|
70
62
|
console.log(" CLAUDE.md — created with sverklo instructions");
|
|
71
63
|
}
|
|
72
|
-
// 2.
|
|
73
|
-
|
|
74
|
-
const
|
|
75
|
-
|
|
76
|
-
let settings = {};
|
|
77
|
-
if (existsSync(settingsPath)) {
|
|
78
|
-
try {
|
|
79
|
-
settings = JSON.parse(readFileSync(settingsPath, "utf-8"));
|
|
80
|
-
}
|
|
81
|
-
catch {
|
|
82
|
-
settings = {};
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
// Check if hook already exists
|
|
86
|
-
const existingHooks = settings.hooks?.SessionStart;
|
|
87
|
-
const alreadyHasSverklo = existingHooks?.some((h) => h.hooks?.some((hook) => hook.command?.includes("sverklo") || hook.command?.includes("Sverklo")));
|
|
88
|
-
if (alreadyHasSverklo) {
|
|
89
|
-
console.log(" .claude/settings.local.json — already has sverklo hooks, skipping");
|
|
90
|
-
}
|
|
91
|
-
else {
|
|
92
|
-
// Merge hooks
|
|
93
|
-
if (!settings.hooks)
|
|
94
|
-
settings.hooks = {};
|
|
95
|
-
if (!settings.hooks.SessionStart)
|
|
96
|
-
settings.hooks.SessionStart = [];
|
|
97
|
-
settings.hooks.SessionStart.push(...HOOKS_CONFIG.hooks.SessionStart);
|
|
98
|
-
// Optionally add PostToolUse auto-capture hook
|
|
99
|
-
if (options.autoCapture && HOOKS_CONFIG.hooks.PostToolUse) {
|
|
100
|
-
if (!settings.hooks.PostToolUse)
|
|
101
|
-
settings.hooks.PostToolUse = [];
|
|
102
|
-
settings.hooks.PostToolUse.push(...HOOKS_CONFIG.hooks.PostToolUse);
|
|
103
|
-
console.log(" .claude/settings.local.json — added SessionStart + PostToolUse (auto-capture) hooks");
|
|
104
|
-
}
|
|
105
|
-
else {
|
|
106
|
-
console.log(" .claude/settings.local.json — added SessionStart hook");
|
|
107
|
-
}
|
|
108
|
-
writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + "\n");
|
|
109
|
-
}
|
|
110
|
-
// 3. Add MCP server config if not present
|
|
111
|
-
const mcpConfigPath = join(claudeDir, "mcp.json");
|
|
64
|
+
// 2. MCP server config — Claude Code reads .mcp.json AT PROJECT ROOT for project-scoped servers.
|
|
65
|
+
// .claude/mcp.json is NOT read by Claude Code (verified Apr 2026).
|
|
66
|
+
const mcpConfigPath = join(projectPath, ".mcp.json");
|
|
67
|
+
const sverkloBin = resolveSverkloBinary();
|
|
112
68
|
let mcpConfig = {};
|
|
113
69
|
if (existsSync(mcpConfigPath)) {
|
|
114
70
|
try {
|
|
@@ -119,19 +75,62 @@ export async function initProject(projectPath, options = {}) {
|
|
|
119
75
|
}
|
|
120
76
|
}
|
|
121
77
|
if (mcpConfig.mcpServers?.sverklo) {
|
|
122
|
-
console.log(" .
|
|
78
|
+
console.log(" .mcp.json — sverklo already configured, skipping");
|
|
123
79
|
}
|
|
124
80
|
else {
|
|
125
81
|
if (!mcpConfig.mcpServers)
|
|
126
82
|
mcpConfig.mcpServers = {};
|
|
127
83
|
mcpConfig.mcpServers.sverklo = {
|
|
128
|
-
command:
|
|
84
|
+
command: sverkloBin,
|
|
129
85
|
args: ["."],
|
|
130
86
|
};
|
|
131
87
|
writeFileSync(mcpConfigPath, JSON.stringify(mcpConfig, null, 2) + "\n");
|
|
132
|
-
console.log(
|
|
88
|
+
console.log(` .mcp.json — added sverklo MCP server (${sverkloBin})`);
|
|
89
|
+
}
|
|
90
|
+
// 3. Optional auto-capture hook in .claude/settings.local.json
|
|
91
|
+
// NOTE: We no longer write a fake "Sverklo is connected" SessionStart hook —
|
|
92
|
+
// that masked real connection failures. Claude Code's normal MCP loading
|
|
93
|
+
// surfaces actual errors when .mcp.json is correct.
|
|
94
|
+
if (options.autoCapture) {
|
|
95
|
+
const claudeDir = join(projectPath, ".claude");
|
|
96
|
+
const settingsPath = join(claudeDir, "settings.local.json");
|
|
97
|
+
mkdirSync(claudeDir, { recursive: true });
|
|
98
|
+
let settings = {};
|
|
99
|
+
if (existsSync(settingsPath)) {
|
|
100
|
+
try {
|
|
101
|
+
settings = JSON.parse(readFileSync(settingsPath, "utf-8"));
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
settings = {};
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
if (!settings.hooks)
|
|
108
|
+
settings.hooks = {};
|
|
109
|
+
if (!settings.hooks.PostToolUse)
|
|
110
|
+
settings.hooks.PostToolUse = [];
|
|
111
|
+
const existingPost = settings.hooks.PostToolUse;
|
|
112
|
+
const alreadyHasSverklo = existingPost.some((h) => h.hooks?.some((hook) => hook.command?.includes("sverklo_remember")));
|
|
113
|
+
if (alreadyHasSverklo) {
|
|
114
|
+
console.log(" .claude/settings.local.json — auto-capture hook already present, skipping");
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
existingPost.push(buildAutoCaptureHook());
|
|
118
|
+
writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + "\n");
|
|
119
|
+
console.log(" .claude/settings.local.json — added PostToolUse auto-capture hook");
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// 4. Migrate legacy .claude/mcp.json if present (from older sverklo versions)
|
|
123
|
+
const legacyMcpPath = join(projectPath, ".claude", "mcp.json");
|
|
124
|
+
if (existsSync(legacyMcpPath)) {
|
|
125
|
+
try {
|
|
126
|
+
const legacy = JSON.parse(readFileSync(legacyMcpPath, "utf-8"));
|
|
127
|
+
if (legacy?.mcpServers?.sverklo) {
|
|
128
|
+
console.log(" .claude/mcp.json — found legacy config (Claude Code does not read this — moved to .mcp.json)");
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
catch { }
|
|
133
132
|
}
|
|
134
|
-
//
|
|
133
|
+
// 5. Import existing memories from CLAUDE.md, ADRs, etc.
|
|
135
134
|
console.log("");
|
|
136
135
|
console.log("Scanning for existing project knowledge...");
|
|
137
136
|
try {
|
|
@@ -145,7 +144,9 @@ export async function initProject(projectPath, options = {}) {
|
|
|
145
144
|
const { importExistingMemories } = await import("./memory/import.js");
|
|
146
145
|
const config = getProjectConfig(projectPath);
|
|
147
146
|
const indexer = new Indexer(config);
|
|
148
|
-
const result = await importExistingMemories(indexer, projectPath
|
|
147
|
+
const result = await importExistingMemories(indexer, projectPath, {
|
|
148
|
+
mineChats: options.mineChats ?? false,
|
|
149
|
+
});
|
|
149
150
|
indexer.close();
|
|
150
151
|
if (result.imported > 0) {
|
|
151
152
|
console.log(` imported ${result.imported} memories from:`);
|
|
@@ -157,7 +158,10 @@ export async function initProject(projectPath, options = {}) {
|
|
|
157
158
|
}
|
|
158
159
|
}
|
|
159
160
|
else {
|
|
160
|
-
|
|
161
|
+
const hint = options.mineChats
|
|
162
|
+
? " no CLAUDE.md, .cursorrules, ADRs, or matching Claude Code chats found — skipping"
|
|
163
|
+
: " no CLAUDE.md, .cursorrules, or ADRs found — skipping";
|
|
164
|
+
console.log(hint);
|
|
161
165
|
}
|
|
162
166
|
}
|
|
163
167
|
else {
|
|
@@ -168,7 +172,7 @@ export async function initProject(projectPath, options = {}) {
|
|
|
168
172
|
console.log(" (memory import skipped)");
|
|
169
173
|
}
|
|
170
174
|
console.log("");
|
|
171
|
-
console.log("Done
|
|
172
|
-
console.log("
|
|
175
|
+
console.log("Done. Restart Claude Code in this directory and sverklo should appear in /mcp.");
|
|
176
|
+
console.log("If it doesn't load, run `sverklo doctor` to diagnose.");
|
|
173
177
|
}
|
|
174
178
|
//# sourceMappingURL=init.js.map
|