memorydetective 1.1.0 → 1.2.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/CHANGELOG.md +24 -1
- package/README.md +15 -20
- package/dist/cli.js +1 -1
- package/dist/index.js +41 -0
- package/dist/index.js.map +1 -1
- package/dist/runtime/sourcekit/client.d.ts +37 -0
- package/dist/runtime/sourcekit/client.js +132 -0
- package/dist/runtime/sourcekit/client.js.map +1 -0
- package/dist/runtime/sourcekit/pool.d.ts +25 -0
- package/dist/runtime/sourcekit/pool.js +101 -0
- package/dist/runtime/sourcekit/pool.js.map +1 -0
- package/dist/runtime/sourcekit/protocol.d.ts +37 -0
- package/dist/runtime/sourcekit/protocol.js +161 -0
- package/dist/runtime/sourcekit/protocol.js.map +1 -0
- package/dist/tools/swift/_helpers.d.ts +29 -0
- package/dist/tools/swift/_helpers.js +64 -0
- package/dist/tools/swift/_helpers.js.map +1 -0
- package/dist/tools/swift/findSymbolReferences.d.ts +30 -0
- package/dist/tools/swift/findSymbolReferences.js +56 -0
- package/dist/tools/swift/findSymbolReferences.js.map +1 -0
- package/dist/tools/swift/getHoverInfo.d.ts +27 -0
- package/dist/tools/swift/getHoverInfo.js +40 -0
- package/dist/tools/swift/getHoverInfo.js.map +1 -0
- package/dist/tools/swift/getSymbolDefinition.d.ts +46 -0
- package/dist/tools/swift/getSymbolDefinition.js +68 -0
- package/dist/tools/swift/getSymbolDefinition.js.map +1 -0
- package/dist/tools/swift/getSymbolsOverview.d.ts +22 -0
- package/dist/tools/swift/getSymbolsOverview.js +33 -0
- package/dist/tools/swift/getSymbolsOverview.js.map +1 -0
- package/dist/tools/swift/index.d.ts +14 -0
- package/dist/tools/swift/index.js +15 -0
- package/dist/tools/swift/index.js.map +1 -0
- package/dist/tools/swift/searchPattern.d.ts +38 -0
- package/dist/tools/swift/searchPattern.js +71 -0
- package/dist/tools/swift/searchPattern.js.map +1 -0
- package/package.json +3 -1
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Swift source-bridging tools. Pair with the memory-graph tools so the
|
|
3
|
+
* LLM agent can go from "found this leak in the cycle" to "find it in the
|
|
4
|
+
* codebase" without leaving chat.
|
|
5
|
+
*
|
|
6
|
+
* One tool per file, all backed by a shared SourceKit-LSP client pool
|
|
7
|
+
* (`src/runtime/sourcekit/`). This file is purely a re-export aggregator
|
|
8
|
+
* for callers that want a single import point.
|
|
9
|
+
*/
|
|
10
|
+
export { swiftGetSymbolDefinition, swiftGetSymbolDefinitionSchema, } from "./getSymbolDefinition.js";
|
|
11
|
+
export { swiftFindSymbolReferences, swiftFindSymbolReferencesSchema, } from "./findSymbolReferences.js";
|
|
12
|
+
export { swiftGetSymbolsOverview, swiftGetSymbolsOverviewSchema, } from "./getSymbolsOverview.js";
|
|
13
|
+
export { swiftGetHoverInfo, swiftGetHoverInfoSchema, } from "./getHoverInfo.js";
|
|
14
|
+
export { swiftSearchPattern, swiftSearchPatternSchema, } from "./searchPattern.js";
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/swift/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,wBAAwB,EACxB,8BAA8B,GAG/B,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,yBAAyB,EACzB,+BAA+B,GAGhC,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,uBAAuB,EACvB,6BAA6B,GAG9B,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,iBAAiB,EACjB,uBAAuB,GAGxB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,kBAAkB,EAClB,wBAAwB,GAIzB,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* Pure regex search over a Swift file. No SourceKit-LSP involvement, no
|
|
4
|
+
* IndexStoreDB. Useful for catching what LSP misses: closure capture lists
|
|
5
|
+
* (`[weak self]`, `[unowned self]`), `Task { ... self ... }` blocks, custom
|
|
6
|
+
* patterns the agent comes up with from a leak chain.
|
|
7
|
+
*/
|
|
8
|
+
export declare const swiftSearchPatternSchema: z.ZodObject<{
|
|
9
|
+
filePath: z.ZodString;
|
|
10
|
+
pattern: z.ZodString;
|
|
11
|
+
flags: z.ZodOptional<z.ZodString>;
|
|
12
|
+
maxMatches: z.ZodDefault<z.ZodNumber>;
|
|
13
|
+
}, "strip", z.ZodTypeAny, {
|
|
14
|
+
filePath: string;
|
|
15
|
+
pattern: string;
|
|
16
|
+
maxMatches: number;
|
|
17
|
+
flags?: string | undefined;
|
|
18
|
+
}, {
|
|
19
|
+
filePath: string;
|
|
20
|
+
pattern: string;
|
|
21
|
+
flags?: string | undefined;
|
|
22
|
+
maxMatches?: number | undefined;
|
|
23
|
+
}>;
|
|
24
|
+
export type SwiftSearchPatternInput = z.infer<typeof swiftSearchPatternSchema>;
|
|
25
|
+
export interface SwiftSearchPatternMatch {
|
|
26
|
+
line: number;
|
|
27
|
+
character: number;
|
|
28
|
+
text: string;
|
|
29
|
+
/** Trimmed source line for context. */
|
|
30
|
+
snippet?: string;
|
|
31
|
+
}
|
|
32
|
+
export interface SwiftSearchPatternResult {
|
|
33
|
+
ok: boolean;
|
|
34
|
+
filePath: string;
|
|
35
|
+
matches: SwiftSearchPatternMatch[];
|
|
36
|
+
truncated: boolean;
|
|
37
|
+
}
|
|
38
|
+
export declare function swiftSearchPattern(input: SwiftSearchPatternInput): Promise<SwiftSearchPatternResult>;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
3
|
+
import { resolve as resolvePath } from "node:path";
|
|
4
|
+
/**
|
|
5
|
+
* Pure regex search over a Swift file. No SourceKit-LSP involvement, no
|
|
6
|
+
* IndexStoreDB. Useful for catching what LSP misses: closure capture lists
|
|
7
|
+
* (`[weak self]`, `[unowned self]`), `Task { ... self ... }` blocks, custom
|
|
8
|
+
* patterns the agent comes up with from a leak chain.
|
|
9
|
+
*/
|
|
10
|
+
export const swiftSearchPatternSchema = z.object({
|
|
11
|
+
filePath: z
|
|
12
|
+
.string()
|
|
13
|
+
.min(1)
|
|
14
|
+
.describe("Absolute path to a Swift source file."),
|
|
15
|
+
pattern: z
|
|
16
|
+
.string()
|
|
17
|
+
.min(1)
|
|
18
|
+
.describe("Regex pattern (JavaScript flavour). The `g` flag is implied — every match is returned."),
|
|
19
|
+
flags: z
|
|
20
|
+
.string()
|
|
21
|
+
.optional()
|
|
22
|
+
.describe('Additional RegExp flags ("i", "m", "s", "im", etc.).'),
|
|
23
|
+
maxMatches: z
|
|
24
|
+
.number()
|
|
25
|
+
.int()
|
|
26
|
+
.positive()
|
|
27
|
+
.max(500)
|
|
28
|
+
.default(50)
|
|
29
|
+
.describe("Cap on matches returned (default 50)."),
|
|
30
|
+
});
|
|
31
|
+
export async function swiftSearchPattern(input) {
|
|
32
|
+
const file = resolvePath(input.filePath);
|
|
33
|
+
if (!existsSync(file)) {
|
|
34
|
+
throw new Error(`File not found: ${file}`);
|
|
35
|
+
}
|
|
36
|
+
const flags = `g${input.flags ?? ""}`.replace(/g+/g, "g");
|
|
37
|
+
let re;
|
|
38
|
+
try {
|
|
39
|
+
re = new RegExp(input.pattern, flags);
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
throw new Error(`Invalid regex: ${err instanceof Error ? err.message : String(err)}`);
|
|
43
|
+
}
|
|
44
|
+
const text = readFileSync(file, "utf8");
|
|
45
|
+
const lines = text.split(/\r?\n/);
|
|
46
|
+
const matches = [];
|
|
47
|
+
let truncated = false;
|
|
48
|
+
const max = input.maxMatches ?? 50;
|
|
49
|
+
for (let i = 0; i < lines.length; i++) {
|
|
50
|
+
re.lastIndex = 0;
|
|
51
|
+
let m;
|
|
52
|
+
while ((m = re.exec(lines[i])) !== null) {
|
|
53
|
+
if (matches.length >= max) {
|
|
54
|
+
truncated = true;
|
|
55
|
+
break;
|
|
56
|
+
}
|
|
57
|
+
matches.push({
|
|
58
|
+
line: i,
|
|
59
|
+
character: m.index,
|
|
60
|
+
text: m[0],
|
|
61
|
+
snippet: lines[i].trim(),
|
|
62
|
+
});
|
|
63
|
+
if (m[0].length === 0)
|
|
64
|
+
re.lastIndex += 1;
|
|
65
|
+
}
|
|
66
|
+
if (truncated)
|
|
67
|
+
break;
|
|
68
|
+
}
|
|
69
|
+
return { ok: true, filePath: file, matches, truncated };
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=searchPattern.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"searchPattern.js","sourceRoot":"","sources":["../../../src/tools/swift/searchPattern.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "memorydetective",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "MCP server for iOS leak hunting and performance investigation. Reads .memgraph + .trace files, captures new ones via xctrace and leaks(1), classifies retain cycles.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -51,6 +51,8 @@
|
|
|
51
51
|
"dependencies": {
|
|
52
52
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
53
53
|
"fast-xml-parser": "^5.7.2",
|
|
54
|
+
"vscode-jsonrpc": "^8.2.1",
|
|
55
|
+
"vscode-languageserver-protocol": "^3.17.5",
|
|
54
56
|
"zod": "^3.23.0"
|
|
55
57
|
},
|
|
56
58
|
"devDependencies": {
|