debug-toolkit 0.4.0
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 +236 -0
- package/SKILL.md +104 -0
- package/dist/capture.d.ts +46 -0
- package/dist/capture.js +246 -0
- package/dist/capture.js.map +1 -0
- package/dist/cleanup.d.ts +12 -0
- package/dist/cleanup.js +103 -0
- package/dist/cleanup.js.map +1 -0
- package/dist/cli.d.ts +40 -0
- package/dist/cli.js +109 -0
- package/dist/cli.js.map +1 -0
- package/dist/context.d.ts +59 -0
- package/dist/context.js +338 -0
- package/dist/context.js.map +1 -0
- package/dist/demo.d.ts +12 -0
- package/dist/demo.js +347 -0
- package/dist/demo.js.map +1 -0
- package/dist/hook.d.ts +17 -0
- package/dist/hook.js +106 -0
- package/dist/hook.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +203 -0
- package/dist/index.js.map +1 -0
- package/dist/injected.js +151 -0
- package/dist/instrument.d.ts +15 -0
- package/dist/instrument.js +87 -0
- package/dist/instrument.js.map +1 -0
- package/dist/mcp.d.ts +14 -0
- package/dist/mcp.js +420 -0
- package/dist/mcp.js.map +1 -0
- package/dist/memory.d.ts +73 -0
- package/dist/memory.js +291 -0
- package/dist/memory.js.map +1 -0
- package/dist/methodology.d.ts +7 -0
- package/dist/methodology.js +100 -0
- package/dist/methodology.js.map +1 -0
- package/dist/proxy.d.ts +12 -0
- package/dist/proxy.js +168 -0
- package/dist/proxy.js.map +1 -0
- package/dist/security.d.ts +27 -0
- package/dist/security.js +158 -0
- package/dist/security.js.map +1 -0
- package/dist/session.d.ts +53 -0
- package/dist/session.js +94 -0
- package/dist/session.js.map +1 -0
- package/package.json +33 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { spawn } from "node:child_process";
|
|
3
|
+
import { resolve, join } from "node:path";
|
|
4
|
+
import { existsSync, mkdirSync, writeFileSync, readFileSync } from "node:fs";
|
|
5
|
+
import treeKill from "tree-kill";
|
|
6
|
+
import { pipeProcess } from "./capture.js";
|
|
7
|
+
import { startProxy, detectPort } from "./proxy.js";
|
|
8
|
+
import { setCwd, startMcpServer } from "./mcp.js";
|
|
9
|
+
import { installHook } from "./hook.js";
|
|
10
|
+
import { cleanupFromManifest } from "./cleanup.js";
|
|
11
|
+
import { banner, info, success, warn, error, dim, section, kv, ready, printHelp, sym, c } from "./cli.js";
|
|
12
|
+
// --- Parse ---
|
|
13
|
+
function parseArgs(argv) {
|
|
14
|
+
const args = argv.slice(2);
|
|
15
|
+
const cmd = args[0] ?? "mcp"; // DEFAULT: pure MCP server (zero-config!)
|
|
16
|
+
if (["clean", "init", "demo", "help", "--help", "-h", "mcp"].includes(cmd)) {
|
|
17
|
+
return { command: cmd.replace(/^-+/, ""), port: null, childCommand: [] };
|
|
18
|
+
}
|
|
19
|
+
if (cmd !== "serve")
|
|
20
|
+
return { command: "mcp", port: null, childCommand: [] };
|
|
21
|
+
let port = null;
|
|
22
|
+
const child = [];
|
|
23
|
+
let past = false;
|
|
24
|
+
for (let i = 1; i < args.length; i++) {
|
|
25
|
+
if (args[i] === "--") {
|
|
26
|
+
past = true;
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
if (past) {
|
|
30
|
+
child.push(args[i]);
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
if (args[i] === "--port" && args[i + 1]) {
|
|
34
|
+
port = parseInt(args[i + 1], 10);
|
|
35
|
+
i++;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return { command: "serve", port, childCommand: child };
|
|
39
|
+
}
|
|
40
|
+
// --- Init ---
|
|
41
|
+
function initCommand(cwd) {
|
|
42
|
+
banner();
|
|
43
|
+
section("SETUP");
|
|
44
|
+
let devCmd = ["npm", "run", "dev"];
|
|
45
|
+
let isTauri = false;
|
|
46
|
+
const pkgPath = join(cwd, "package.json");
|
|
47
|
+
if (existsSync(pkgPath)) {
|
|
48
|
+
try {
|
|
49
|
+
const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
|
|
50
|
+
// Detect Tauri project
|
|
51
|
+
const hasTauriCli = pkg.devDependencies?.["@tauri-apps/cli"] || pkg.dependencies?.["@tauri-apps/cli"];
|
|
52
|
+
const hasTauriScript = pkg.scripts?.["tauri"];
|
|
53
|
+
if ((hasTauriCli || hasTauriScript) && existsSync(join(cwd, "src-tauri"))) {
|
|
54
|
+
isTauri = true;
|
|
55
|
+
devCmd = ["cargo", "tauri", "dev"];
|
|
56
|
+
success(`Detected ${c.bold}Tauri${c.reset} project: ${c.bold}${pkg.name ?? "unknown"}${c.reset}`);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
if (pkg.scripts?.dev)
|
|
60
|
+
devCmd = ["npm", "run", "dev"];
|
|
61
|
+
else if (pkg.scripts?.start)
|
|
62
|
+
devCmd = ["npm", "start"];
|
|
63
|
+
else if (pkg.scripts?.serve)
|
|
64
|
+
devCmd = ["npm", "run", "serve"];
|
|
65
|
+
success(`Detected project: ${c.bold}${pkg.name ?? "unknown"}${c.reset}`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch { }
|
|
69
|
+
}
|
|
70
|
+
// Write MCP config
|
|
71
|
+
const claudeDir = join(cwd, ".claude");
|
|
72
|
+
if (!existsSync(claudeDir))
|
|
73
|
+
mkdirSync(claudeDir, { recursive: true });
|
|
74
|
+
const mcpPath = join(claudeDir, "mcp.json");
|
|
75
|
+
const existing = existsSync(mcpPath) ? JSON.parse(readFileSync(mcpPath, "utf-8")) : { mcpServers: {} };
|
|
76
|
+
existing.mcpServers ??= {};
|
|
77
|
+
// OPTION A: Pure MCP mode (zero-config, no proxy)
|
|
78
|
+
existing.mcpServers["debug-toolkit"] = {
|
|
79
|
+
command: "npx",
|
|
80
|
+
args: ["-y", "debug-toolkit"],
|
|
81
|
+
};
|
|
82
|
+
// OPTION B: With dev server wrapping (full capture)
|
|
83
|
+
existing.mcpServers["debug-toolkit-serve"] = {
|
|
84
|
+
command: "npx",
|
|
85
|
+
args: ["-y", "debug-toolkit", "serve", "--", ...devCmd],
|
|
86
|
+
};
|
|
87
|
+
writeFileSync(mcpPath, JSON.stringify(existing, null, 2) + "\n");
|
|
88
|
+
success(`MCP config ${sym.arrow} ${mcpPath}`);
|
|
89
|
+
// Hook
|
|
90
|
+
const h = installHook(cwd);
|
|
91
|
+
if (h.installed)
|
|
92
|
+
success(h.message);
|
|
93
|
+
if (isTauri) {
|
|
94
|
+
section("TAURI SUPPORT");
|
|
95
|
+
info(`${c.green}${sym.check}${c.reset} Rust stack trace parsing (panics + backtraces)`);
|
|
96
|
+
info(`${c.green}${sym.check}${c.reset} Tauri error classification (invoke, capability, plugin)`);
|
|
97
|
+
info(`${c.green}${sym.check}${c.reset} Rust code instrumentation (eprintln! with markers)`);
|
|
98
|
+
info(`${c.green}${sym.check}${c.reset} Tauri log file auto-discovery and tailing`);
|
|
99
|
+
info(`${c.green}${sym.check}${c.reset} RUST_BACKTRACE=1 auto-enabled in serve mode`);
|
|
100
|
+
dim("");
|
|
101
|
+
}
|
|
102
|
+
section("TWO MODES");
|
|
103
|
+
info(`${c.cyan}debug-toolkit${c.reset} ${c.dim}Pure MCP server — investigate, instrument, verify${c.reset}`);
|
|
104
|
+
info(`${c.cyan}debug-toolkit serve${c.reset} ${c.dim}+ dev server wrapping for ${isTauri ? "Tauri" : "browser"} capture${c.reset}`);
|
|
105
|
+
dim("");
|
|
106
|
+
info("Both modes registered. Restart Claude Code to activate.");
|
|
107
|
+
dim(`Edit ${mcpPath} to customize\n`);
|
|
108
|
+
}
|
|
109
|
+
// --- Main ---
|
|
110
|
+
async function main() {
|
|
111
|
+
const parsed = parseArgs(process.argv);
|
|
112
|
+
const cwd = resolve(process.cwd());
|
|
113
|
+
setCwd(cwd);
|
|
114
|
+
switch (parsed.command) {
|
|
115
|
+
case "help":
|
|
116
|
+
printHelp();
|
|
117
|
+
break;
|
|
118
|
+
case "demo": {
|
|
119
|
+
const { runDemo } = await import("./demo.js");
|
|
120
|
+
await runDemo();
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
case "init":
|
|
124
|
+
initCommand(cwd);
|
|
125
|
+
break;
|
|
126
|
+
case "clean": {
|
|
127
|
+
banner();
|
|
128
|
+
info("Scanning for debug markers...");
|
|
129
|
+
const r = cleanupFromManifest(cwd);
|
|
130
|
+
if (r.cleaned === 0)
|
|
131
|
+
success("Clean — no markers found.");
|
|
132
|
+
else {
|
|
133
|
+
success(`${r.cleaned} file(s) cleaned`);
|
|
134
|
+
for (const f of r.filesProcessed)
|
|
135
|
+
dim(` ${sym.arrow} ${f}`);
|
|
136
|
+
if (!r.verified)
|
|
137
|
+
for (const e of r.errors)
|
|
138
|
+
error(e);
|
|
139
|
+
}
|
|
140
|
+
process.exit(r.verified ? 0 : 1);
|
|
141
|
+
break;
|
|
142
|
+
}
|
|
143
|
+
// DEFAULT: Pure MCP server. No dev server wrapping needed.
|
|
144
|
+
// Just start the MCP server on stdio. The agent gets 6 tools instantly.
|
|
145
|
+
case "mcp": {
|
|
146
|
+
await startMcpServer();
|
|
147
|
+
break;
|
|
148
|
+
}
|
|
149
|
+
case "serve": {
|
|
150
|
+
if (parsed.childCommand.length === 0) {
|
|
151
|
+
error("No command specified");
|
|
152
|
+
dim(" Usage: debug-toolkit serve -- <command>");
|
|
153
|
+
process.exit(1);
|
|
154
|
+
}
|
|
155
|
+
const childCmd = parsed.childCommand.join(" ");
|
|
156
|
+
banner();
|
|
157
|
+
kv("process", childCmd);
|
|
158
|
+
// Auto-enable Rust backtraces for Tauri/Rust projects
|
|
159
|
+
const childEnv = { ...process.env };
|
|
160
|
+
if (!childEnv.RUST_BACKTRACE)
|
|
161
|
+
childEnv.RUST_BACKTRACE = "1";
|
|
162
|
+
if (!childEnv.RUST_LOG)
|
|
163
|
+
childEnv.RUST_LOG = "info";
|
|
164
|
+
const child = spawn(childCmd, {
|
|
165
|
+
shell: true,
|
|
166
|
+
stdio: ["inherit", "pipe", "pipe"],
|
|
167
|
+
cwd,
|
|
168
|
+
env: childEnv,
|
|
169
|
+
});
|
|
170
|
+
pipeProcess(child);
|
|
171
|
+
installHook(cwd);
|
|
172
|
+
let proxyHandle = null;
|
|
173
|
+
if (child.stdout) {
|
|
174
|
+
try {
|
|
175
|
+
const target = parsed.port ?? (await detectPort(child.stdout));
|
|
176
|
+
const listen = parsed.port ? parsed.port + 1 : target + 1000;
|
|
177
|
+
proxyHandle = startProxy({ targetPort: target, listenPort: listen });
|
|
178
|
+
kv("proxy", `http://localhost:${listen} ${sym.arrow} :${target}`);
|
|
179
|
+
}
|
|
180
|
+
catch (e) {
|
|
181
|
+
warn(`Proxy unavailable: ${e instanceof Error ? e.message : ""}`);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
startMcpServer().catch((e) => error(`MCP: ${e}`));
|
|
185
|
+
ready(8);
|
|
186
|
+
const cleanup = () => {
|
|
187
|
+
if (child.pid)
|
|
188
|
+
treeKill(child.pid, "SIGTERM");
|
|
189
|
+
proxyHandle?.close();
|
|
190
|
+
};
|
|
191
|
+
process.on("SIGINT", cleanup);
|
|
192
|
+
process.on("SIGTERM", cleanup);
|
|
193
|
+
child.on("close", (code) => {
|
|
194
|
+
dim(`Process exited (${code})`);
|
|
195
|
+
proxyHandle?.close();
|
|
196
|
+
process.exit(code ?? 0);
|
|
197
|
+
});
|
|
198
|
+
break;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
main().catch((e) => { error(String(e)); process.exit(1); });
|
|
203
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/injected.js
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
(function () {
|
|
2
|
+
"use strict";
|
|
3
|
+
|
|
4
|
+
var wsUrl =
|
|
5
|
+
"ws://" + location.hostname + ":" + location.port + "/__debug_toolkit/ws";
|
|
6
|
+
var ws;
|
|
7
|
+
var queue = [];
|
|
8
|
+
var reconnectAttempts = 0;
|
|
9
|
+
var maxReconnects = 5;
|
|
10
|
+
|
|
11
|
+
function send(type, data) {
|
|
12
|
+
var msg = JSON.stringify({ type: type, data: data, ts: Date.now() });
|
|
13
|
+
if (ws && ws.readyState === WebSocket.OPEN) {
|
|
14
|
+
ws.send(msg);
|
|
15
|
+
} else {
|
|
16
|
+
queue.push(msg);
|
|
17
|
+
if (queue.length > 100) queue.shift(); // Prevent unbounded queue growth
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function connect() {
|
|
22
|
+
try {
|
|
23
|
+
ws = new WebSocket(wsUrl);
|
|
24
|
+
} catch (_) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
ws.addEventListener("open", function () {
|
|
29
|
+
reconnectAttempts = 0;
|
|
30
|
+
for (var i = 0; i < queue.length; i++) {
|
|
31
|
+
ws.send(queue[i]);
|
|
32
|
+
}
|
|
33
|
+
queue = [];
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
ws.addEventListener("close", function () {
|
|
37
|
+
if (reconnectAttempts >= maxReconnects) return;
|
|
38
|
+
var delay = Math.min(1000 * Math.pow(2, reconnectAttempts), 16000);
|
|
39
|
+
reconnectAttempts++;
|
|
40
|
+
setTimeout(connect, delay);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
ws.addEventListener("error", function () {
|
|
44
|
+
// Errors are followed by close events, so reconnect logic handles it
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
connect();
|
|
49
|
+
|
|
50
|
+
// --- Console capture ---
|
|
51
|
+
var methods = ["log", "warn", "error", "info", "debug"];
|
|
52
|
+
methods.forEach(function (method) {
|
|
53
|
+
var orig = console[method];
|
|
54
|
+
console[method] = function () {
|
|
55
|
+
var args = Array.prototype.slice.call(arguments);
|
|
56
|
+
send("console", {
|
|
57
|
+
level: method,
|
|
58
|
+
args: args.map(function (a) {
|
|
59
|
+
try {
|
|
60
|
+
return typeof a === "object" ? JSON.stringify(a) : String(a);
|
|
61
|
+
} catch (_) {
|
|
62
|
+
return "[unserializable]";
|
|
63
|
+
}
|
|
64
|
+
}),
|
|
65
|
+
});
|
|
66
|
+
return orig.apply(console, arguments);
|
|
67
|
+
};
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
// --- Error capture ---
|
|
71
|
+
window.addEventListener("error", function (e) {
|
|
72
|
+
send("error", {
|
|
73
|
+
message: e.message,
|
|
74
|
+
source: e.filename,
|
|
75
|
+
line: e.lineno,
|
|
76
|
+
column: e.colno,
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
window.addEventListener("unhandledrejection", function (e) {
|
|
81
|
+
send("error", {
|
|
82
|
+
message: e.reason ? String(e.reason) : "Unhandled promise rejection",
|
|
83
|
+
type: "unhandledrejection",
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
// --- Network failure capture (fetch) ---
|
|
88
|
+
var origFetch = window.fetch;
|
|
89
|
+
window.fetch = function () {
|
|
90
|
+
var args = arguments;
|
|
91
|
+
var url = String(args[0] && args[0].url ? args[0].url : args[0]);
|
|
92
|
+
var method =
|
|
93
|
+
(args[1] && args[1].method) ||
|
|
94
|
+
(args[0] && args[0].method) ||
|
|
95
|
+
"GET";
|
|
96
|
+
|
|
97
|
+
return origFetch.apply(this, args).then(
|
|
98
|
+
function (res) {
|
|
99
|
+
if (!res.ok) {
|
|
100
|
+
send("network", {
|
|
101
|
+
url: url,
|
|
102
|
+
method: method,
|
|
103
|
+
status: res.status,
|
|
104
|
+
statusText: res.statusText,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
return res;
|
|
108
|
+
},
|
|
109
|
+
function (err) {
|
|
110
|
+
send("network", {
|
|
111
|
+
url: url,
|
|
112
|
+
method: method,
|
|
113
|
+
error: err.message || String(err),
|
|
114
|
+
});
|
|
115
|
+
throw err;
|
|
116
|
+
},
|
|
117
|
+
);
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
// --- Network failure capture (XMLHttpRequest) ---
|
|
121
|
+
var origOpen = XMLHttpRequest.prototype.open;
|
|
122
|
+
var origSend = XMLHttpRequest.prototype.send;
|
|
123
|
+
|
|
124
|
+
XMLHttpRequest.prototype.open = function (method, url) {
|
|
125
|
+
this._dbg_method = method;
|
|
126
|
+
this._dbg_url = String(url);
|
|
127
|
+
return origOpen.apply(this, arguments);
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
XMLHttpRequest.prototype.send = function () {
|
|
131
|
+
var self = this;
|
|
132
|
+
self.addEventListener("load", function () {
|
|
133
|
+
if (self.status >= 400) {
|
|
134
|
+
send("network", {
|
|
135
|
+
url: self._dbg_url,
|
|
136
|
+
method: self._dbg_method,
|
|
137
|
+
status: self.status,
|
|
138
|
+
statusText: self.statusText,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
self.addEventListener("error", function () {
|
|
143
|
+
send("network", {
|
|
144
|
+
url: self._dbg_url,
|
|
145
|
+
method: self._dbg_method,
|
|
146
|
+
error: "Network error",
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
return origSend.apply(this, arguments);
|
|
150
|
+
};
|
|
151
|
+
})();
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type DebugSession, type InstrumentationRecord } from "./session.js";
|
|
2
|
+
export interface InstrumentOptions {
|
|
3
|
+
cwd: string;
|
|
4
|
+
session: DebugSession;
|
|
5
|
+
filePath: string;
|
|
6
|
+
lineNumber: number;
|
|
7
|
+
expression: string;
|
|
8
|
+
hypothesisId?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface InstrumentResult {
|
|
11
|
+
record: InstrumentationRecord;
|
|
12
|
+
markerTag: string;
|
|
13
|
+
insertedCode: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function instrumentFile(opts: InstrumentOptions): InstrumentResult;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { readFileSync, statSync, renameSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { extname } from "node:path";
|
|
3
|
+
import { validateFilePath, validateExpression } from "./security.js";
|
|
4
|
+
import { newInstrumentationId, nextMarkerTag, indexMarker, saveSession, MAX_FILE_SIZE, } from "./session.js";
|
|
5
|
+
const EXT_MAP = {
|
|
6
|
+
".js": "js",
|
|
7
|
+
".jsx": "js",
|
|
8
|
+
".mjs": "js",
|
|
9
|
+
".cjs": "js",
|
|
10
|
+
".ts": "ts",
|
|
11
|
+
".tsx": "ts",
|
|
12
|
+
".mts": "ts",
|
|
13
|
+
".cts": "ts",
|
|
14
|
+
".py": "py",
|
|
15
|
+
".go": "go",
|
|
16
|
+
".rs": "rs",
|
|
17
|
+
};
|
|
18
|
+
function detectLanguage(filePath) {
|
|
19
|
+
return EXT_MAP[extname(filePath)] ?? "unknown";
|
|
20
|
+
}
|
|
21
|
+
// --- Indentation detection ---
|
|
22
|
+
function getIndentation(line) {
|
|
23
|
+
const match = line.match(/^(\s*)/);
|
|
24
|
+
return match ? match[1] : "";
|
|
25
|
+
}
|
|
26
|
+
// --- Marker generation ---
|
|
27
|
+
function wrapInstrumentation(lang, tag, expression, indent) {
|
|
28
|
+
switch (lang) {
|
|
29
|
+
case "js":
|
|
30
|
+
case "ts":
|
|
31
|
+
return `${indent}/* __DBG_START_${tag}__ */ console.log("[${tag}]", ${expression}); /* __DBG_END_${tag}__ */`;
|
|
32
|
+
case "py":
|
|
33
|
+
return `${indent}# __DBG_START_${tag}__\n${indent}print(f"[${tag}] {${expression}}")\n${indent}# __DBG_END_${tag}__`;
|
|
34
|
+
case "go":
|
|
35
|
+
return `${indent}/* __DBG_START_${tag}__ */ fmt.Printf("[${tag}] %v\\n", ${expression}) /* __DBG_END_${tag}__ */`;
|
|
36
|
+
case "rs":
|
|
37
|
+
return `${indent}/* __DBG_START_${tag}__ */ eprintln!("[${tag}] {:?}", ${expression}); /* __DBG_END_${tag}__ */`;
|
|
38
|
+
default:
|
|
39
|
+
return `${indent}/* __DBG_START_${tag}__ */ console.log("[${tag}]", ${expression}); /* __DBG_END_${tag}__ */`;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export function instrumentFile(opts) {
|
|
43
|
+
const { cwd, session, filePath, lineNumber, expression, hypothesisId } = opts;
|
|
44
|
+
// Security: validate file path and expression
|
|
45
|
+
const safePath = validateFilePath(filePath, cwd);
|
|
46
|
+
const safeExpression = validateExpression(expression);
|
|
47
|
+
// Safety: check file size
|
|
48
|
+
const stat = statSync(safePath);
|
|
49
|
+
if (stat.size > MAX_FILE_SIZE) {
|
|
50
|
+
throw new Error(`File too large (${stat.size} bytes). Max ${MAX_FILE_SIZE / 1024 / 1024}MB.`);
|
|
51
|
+
}
|
|
52
|
+
const lang = detectLanguage(safePath);
|
|
53
|
+
const content = readFileSync(safePath, "utf-8");
|
|
54
|
+
const lines = content.split("\n");
|
|
55
|
+
// Clamp line number to valid range
|
|
56
|
+
const insertAt = Math.min(Math.max(lineNumber, 0), lines.length);
|
|
57
|
+
// Detect indentation from the target line (or the line before it)
|
|
58
|
+
const targetLine = lines[insertAt] ?? lines[insertAt - 1] ?? "";
|
|
59
|
+
const indent = getIndentation(targetLine);
|
|
60
|
+
const tag = nextMarkerTag();
|
|
61
|
+
const insertedCode = wrapInstrumentation(lang, tag, safeExpression, indent);
|
|
62
|
+
// Insert the instrumentation lines
|
|
63
|
+
const instrumentLines = insertedCode.split("\n");
|
|
64
|
+
lines.splice(insertAt, 0, ...instrumentLines);
|
|
65
|
+
// Atomic write: write to tmp file then rename
|
|
66
|
+
const tmpPath = `${safePath}.dbg_tmp_${Date.now()}`;
|
|
67
|
+
writeFileSync(tmpPath, lines.join("\n"));
|
|
68
|
+
renameSync(tmpPath, safePath);
|
|
69
|
+
// Record with hypothesis link
|
|
70
|
+
const record = {
|
|
71
|
+
id: newInstrumentationId(),
|
|
72
|
+
filePath: safePath,
|
|
73
|
+
lineNumber: insertAt,
|
|
74
|
+
markerTag: tag,
|
|
75
|
+
language: lang,
|
|
76
|
+
insertedCode,
|
|
77
|
+
active: true,
|
|
78
|
+
hypothesisId: hypothesisId ?? null,
|
|
79
|
+
};
|
|
80
|
+
session.instrumentation.push(record);
|
|
81
|
+
// Index marker → hypothesis for O(1) lookup during capture linking
|
|
82
|
+
indexMarker(session, tag, hypothesisId ?? null);
|
|
83
|
+
// Single save (no separate manifest file)
|
|
84
|
+
saveSession(cwd, session);
|
|
85
|
+
return { record, markerTag: tag, insertedCode };
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=instrument.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instrument.js","sourceRoot":"","sources":["../src/instrument.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* mcp.ts — MCP server with 9 tools + 1 resource.
|
|
3
|
+
*
|
|
4
|
+
* Design principles:
|
|
5
|
+
* 1. One tool = one complete outcome. No chatty multi-step protocols.
|
|
6
|
+
* 2. Preprocess, don't dump. Summarize and highlight, never return raw arrays.
|
|
7
|
+
* 3. Every response tells the agent what to do next.
|
|
8
|
+
* 4. Context window space is precious — keep responses compact.
|
|
9
|
+
* 5. Memory: save diagnoses, recall past fixes for similar errors.
|
|
10
|
+
*/
|
|
11
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
12
|
+
export declare function setCwd(dir: string): void;
|
|
13
|
+
export declare function createMcpServer(): McpServer;
|
|
14
|
+
export declare function startMcpServer(): Promise<void>;
|