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 CHANGED
@@ -1,6 +1,8 @@
1
1
  # Sverklo
2
2
 
3
- **Your AI agent wastes 70% of tokens reading irrelevant files.** Sverklo fixes that.
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
- This creates `.claude/mcp.json`, adds a SessionStart hook, and appends sverklo instructions to your `CLAUDE.md`. Safe to run multiple times.
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
- Add to `.cursor/mcp.json` (or `.windsurf/mcp.json` / `.vscode/mcp.json`):
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
- ### Windsurf
90
- Add to `~/.windsurf/mcp.json` (same format as Cursor).
91
-
92
- ### VS Code (Copilot)
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
@@ -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 (CLAUDE.md + hooks + MCP config)
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
 
@@ -1 +1 @@
1
- {"version":3,"file":"sverklo.js","sourceRoot":"","sources":["../../bin/sverklo.ts"],"names":[],"mappings":"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"}
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,4CAA4C;IAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IACrD,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3D,MAAM,WAAW,GAAG,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IACjD,MAAM,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC5D,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACvD,MAAM,WAAW,CAAC,WAAW,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC;IAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,UAAU,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;IAC1E,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACtD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IACvD,SAAS,CAAC,WAAW,CAAC,CAAC;IACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,OAAO,KAAK,WAAW,EAAE,CAAC;IAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,MAAM,EACJ,eAAe,EACf,aAAa,EACb,cAAc,EACd,kBAAkB,EAClB,uBAAuB,GACxB,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;IAExC,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,IAAI,EAAE,CAAC;YAAC,OAAO,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;YAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;QAC3G,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACzE,MAAM,EAAE,GAAG,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,UAAU,EAAE,CAAC,KAAK,CAAC,MAAM,WAAW,CAAC,CAAC;QAC5E,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK;YAAE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACnB,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;QAC7B,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,4EAA4E,CAAC,CAAC;QAC5F,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAC3B,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE,CAAC;gBACvB,MAAM,EAAE,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;gBAC/B,IAAI,EAAE;oBAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,KAAK,EAAE,CAAC,KAAK,CAAC,MAAM,SAAS,CAAC,CAAC;YAChE,CAAC;QACH,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QACtC,IAAI,CAAC,IAAI,EAAE,CAAC;YAAC,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;YAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;QAC5F,MAAM,EAAE,GAAG,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,aAAa,EAAE,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAAC,OAAO,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;YAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;QACxG,MAAM,EAAE,GAAG,uBAAuB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC/C,IAAI,EAAE;YAAE,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,aAAa,EAAE,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC;;YACvE,OAAO,CAAC,KAAK,CAAC,cAAc,IAAI,aAAa,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACnB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,IAAI,EAAE,CAAC;YAAC,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;YAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;QACtF,MAAM,EAAE,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,EAAE,EAAE,CAAC;YAAC,OAAO,CAAC,KAAK,CAAC,cAAc,IAAI,aAAa,CAAC,CAAC;YAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;QAC7E,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;QAC3C,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK;YAAE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC;;;;;;;;;CASb,CAAC,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;IAClD,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACtD,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;IAC/C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;IAC3C,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;IACvD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC;QAC9C,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;QAChE,MAAM,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACtC,CAAC;IACD,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;IACpE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;IAC9D,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,+BAA+B,CAAC,CAAC;IACzE,MAAM,MAAM,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACpC,oCAAoC;IACpC,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;IAC3D,OAAO,CAAC,KAAK,EAAE,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,OAAO,KAAK,OAAO,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;IACjD,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;IAChE,MAAM,WAAW,EAAE,CAAC;IACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,WAAW,EAAE,CAAC;IAChD,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACtD,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;IAC/C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;IAC3C,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;IACvD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;QACtD,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;QAChE,MAAM,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACtC,CAAC;IACD,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;IACpE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;IAC9D,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,8BAA8B,CAAC,CAAC;IACzE,MAAM,MAAM,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACtB,eAAe,CAAC,OAAO,CAAC,CAAC;IACzB,MAAM,IAAI,GAAG,IAAI,CAAC;IAClB,OAAO,CAAC,GAAG,CAAC,yCAAyC,IAAI,IAAI,CAAC,CAAC;IAC/D,eAAe;IACf,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;IACpD,IAAI,CAAC,yBAAyB,IAAI,6CAA6C,IAAI,cAAc,CAAC,CAAC;IACnG,aAAa;IACb,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClE,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAAC,gBAAgB;AAC/C,CAAC;AAED,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;CAmBb,CAAC,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AAEnD,iEAAiE;AACjE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;AAC/C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;AAC3C,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;AAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;AACvD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC;IAC9C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gEAAgE,CAAC,CAAC;IACvF,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;IAChE,MAAM,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE;QAC7B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,4EAA4E,CAAC,CAAC;IACrG,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAC3D,cAAc,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACrC,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,GAAG,CAAC,CAAC;IAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -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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"}
@@ -1,3 +1,4 @@
1
1
  export declare function initProject(projectPath: string, options?: {
2
2
  autoCapture?: boolean;
3
+ mineChats?: boolean;
3
4
  }): Promise<void>;
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
- function buildHooksConfig(autoCapture) {
17
- const base = {
18
- hooks: {
19
- SessionStart: [
20
- {
21
- matcher: "",
22
- hooks: [
23
- {
24
- type: "command",
25
- command: "echo 'Sverklo is connected. Use sverklo_search for code search (semantic, ranked by importance — better than grep). Use sverklo_remember to save decisions. Use sverklo_recall to check past decisions.'",
26
- timeout: 5,
27
- },
28
- ],
29
- },
30
- ],
31
- },
32
- };
33
- if (autoCapture) {
34
- // PostToolUse hook — nudge Claude to capture decisions after meaningful tool calls.
35
- // This runs after every tool call; Claude sees the output and decides whether to call
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
- matcher: "Edit|Write|NotebookEdit",
40
- hooks: [
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. Add hooks to .claude/settings.local.json
73
- const claudeDir = join(projectPath, ".claude");
74
- const settingsPath = join(claudeDir, "settings.local.json");
75
- mkdirSync(claudeDir, { recursive: true });
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(" .claude/mcp.json — sverklo already configured, skipping");
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: "sverklo",
84
+ command: sverkloBin,
129
85
  args: ["."],
130
86
  };
131
87
  writeFileSync(mcpConfigPath, JSON.stringify(mcpConfig, null, 2) + "\n");
132
- console.log(" .claude/mcp.json — added sverklo MCP server");
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
- // 4. Import existing memories from CLAUDE.md, ADRs, etc.
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
- console.log(" no CLAUDE.md, .cursorrules, or ADRs found — skipping");
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! Sverklo is now configured for this project.");
172
- console.log("Start Claude Code and sverklo tools will be preferred automatically.");
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