pi-shazam 0.1.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.
Files changed (121) hide show
  1. package/dist/core/cache.d.ts +50 -0
  2. package/dist/core/cache.d.ts.map +1 -0
  3. package/dist/core/cache.js +116 -0
  4. package/dist/core/cache.js.map +1 -0
  5. package/dist/core/encoding.d.ts +25 -0
  6. package/dist/core/encoding.d.ts.map +1 -0
  7. package/dist/core/encoding.js +109 -0
  8. package/dist/core/encoding.js.map +1 -0
  9. package/dist/core/graph.d.ts +146 -0
  10. package/dist/core/graph.d.ts.map +1 -0
  11. package/dist/core/graph.js +224 -0
  12. package/dist/core/graph.js.map +1 -0
  13. package/dist/core/pagerank.d.ts +19 -0
  14. package/dist/core/pagerank.d.ts.map +1 -0
  15. package/dist/core/pagerank.js +106 -0
  16. package/dist/core/pagerank.js.map +1 -0
  17. package/dist/core/scanner.d.ts +19 -0
  18. package/dist/core/scanner.d.ts.map +1 -0
  19. package/dist/core/scanner.js +266 -0
  20. package/dist/core/scanner.js.map +1 -0
  21. package/dist/core/treesitter-queries.d.ts +19 -0
  22. package/dist/core/treesitter-queries.d.ts.map +1 -0
  23. package/dist/core/treesitter-queries.js +222 -0
  24. package/dist/core/treesitter-queries.js.map +1 -0
  25. package/dist/core/treesitter.d.ts +67 -0
  26. package/dist/core/treesitter.d.ts.map +1 -0
  27. package/dist/core/treesitter.js +624 -0
  28. package/dist/core/treesitter.js.map +1 -0
  29. package/dist/hooks/after-write.d.ts +32 -0
  30. package/dist/hooks/after-write.d.ts.map +1 -0
  31. package/dist/hooks/after-write.js +111 -0
  32. package/dist/hooks/after-write.js.map +1 -0
  33. package/dist/hooks/before-start.d.ts +23 -0
  34. package/dist/hooks/before-start.d.ts.map +1 -0
  35. package/dist/hooks/before-start.js +43 -0
  36. package/dist/hooks/before-start.js.map +1 -0
  37. package/dist/index.d.ts +13 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +106 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/lsp/client.d.ts +77 -0
  42. package/dist/lsp/client.d.ts.map +1 -0
  43. package/dist/lsp/client.js +355 -0
  44. package/dist/lsp/client.js.map +1 -0
  45. package/dist/lsp/manager.d.ts +85 -0
  46. package/dist/lsp/manager.d.ts.map +1 -0
  47. package/dist/lsp/manager.js +362 -0
  48. package/dist/lsp/manager.js.map +1 -0
  49. package/dist/lsp/servers.d.ts +43 -0
  50. package/dist/lsp/servers.d.ts.map +1 -0
  51. package/dist/lsp/servers.js +140 -0
  52. package/dist/lsp/servers.js.map +1 -0
  53. package/dist/lsp/setup.d.ts +24 -0
  54. package/dist/lsp/setup.d.ts.map +1 -0
  55. package/dist/lsp/setup.js +140 -0
  56. package/dist/lsp/setup.js.map +1 -0
  57. package/dist/tools/call_chain.d.ts +9 -0
  58. package/dist/tools/call_chain.d.ts.map +1 -0
  59. package/dist/tools/call_chain.js +151 -0
  60. package/dist/tools/call_chain.js.map +1 -0
  61. package/dist/tools/check.d.ts +18 -0
  62. package/dist/tools/check.d.ts.map +1 -0
  63. package/dist/tools/check.js +141 -0
  64. package/dist/tools/check.js.map +1 -0
  65. package/dist/tools/codequery.d.ts +19 -0
  66. package/dist/tools/codequery.d.ts.map +1 -0
  67. package/dist/tools/codequery.js +128 -0
  68. package/dist/tools/codequery.js.map +1 -0
  69. package/dist/tools/codesearch.d.ts +8 -0
  70. package/dist/tools/codesearch.d.ts.map +1 -0
  71. package/dist/tools/codesearch.js +101 -0
  72. package/dist/tools/codesearch.js.map +1 -0
  73. package/dist/tools/file_detail.d.ts +9 -0
  74. package/dist/tools/file_detail.d.ts.map +1 -0
  75. package/dist/tools/file_detail.js +125 -0
  76. package/dist/tools/file_detail.js.map +1 -0
  77. package/dist/tools/fix.d.ts +25 -0
  78. package/dist/tools/fix.d.ts.map +1 -0
  79. package/dist/tools/fix.js +257 -0
  80. package/dist/tools/fix.js.map +1 -0
  81. package/dist/tools/hotspots.d.ts +9 -0
  82. package/dist/tools/hotspots.d.ts.map +1 -0
  83. package/dist/tools/hotspots.js +107 -0
  84. package/dist/tools/hotspots.js.map +1 -0
  85. package/dist/tools/impact.d.ts +14 -0
  86. package/dist/tools/impact.d.ts.map +1 -0
  87. package/dist/tools/impact.js +160 -0
  88. package/dist/tools/impact.js.map +1 -0
  89. package/dist/tools/orphan.d.ts +9 -0
  90. package/dist/tools/orphan.d.ts.map +1 -0
  91. package/dist/tools/orphan.js +124 -0
  92. package/dist/tools/orphan.js.map +1 -0
  93. package/dist/tools/overview.d.ts +9 -0
  94. package/dist/tools/overview.d.ts.map +1 -0
  95. package/dist/tools/overview.js +137 -0
  96. package/dist/tools/overview.js.map +1 -0
  97. package/dist/tools/ready.d.ts +18 -0
  98. package/dist/tools/ready.d.ts.map +1 -0
  99. package/dist/tools/ready.js +145 -0
  100. package/dist/tools/ready.js.map +1 -0
  101. package/dist/tools/refs.d.ts +9 -0
  102. package/dist/tools/refs.d.ts.map +1 -0
  103. package/dist/tools/refs.js +129 -0
  104. package/dist/tools/refs.js.map +1 -0
  105. package/dist/tools/routes.d.ts +8 -0
  106. package/dist/tools/routes.d.ts.map +1 -0
  107. package/dist/tools/routes.js +83 -0
  108. package/dist/tools/routes.js.map +1 -0
  109. package/dist/tools/state_map.d.ts +8 -0
  110. package/dist/tools/state_map.d.ts.map +1 -0
  111. package/dist/tools/state_map.js +95 -0
  112. package/dist/tools/state_map.js.map +1 -0
  113. package/dist/tools/symbol.d.ts +9 -0
  114. package/dist/tools/symbol.d.ts.map +1 -0
  115. package/dist/tools/symbol.js +84 -0
  116. package/dist/tools/symbol.js.map +1 -0
  117. package/dist/tools/verify.d.ts +24 -0
  118. package/dist/tools/verify.d.ts.map +1 -0
  119. package/dist/tools/verify.js +212 -0
  120. package/dist/tools/verify.js.map +1 -0
  121. package/package.json +70 -0
@@ -0,0 +1,140 @@
1
+ /**
2
+ * pi-shazam lsp/setup — /shazam-setup command: detect + install guidance.
3
+ *
4
+ * Scans the project for supported languages, detects installed LSP servers,
5
+ * and outputs install instructions for missing ones.
6
+ *
7
+ * Ported from repomap/src/lsp.py (detect_lsp_servers and CLI output formatting).
8
+ */
9
+ import { detectLspServer, detectProjectLanguages } from "./manager.js";
10
+ const INSTALL_INSTRUCTIONS = [
11
+ {
12
+ language: "python",
13
+ serverName: "pyright-langserver",
14
+ packages: ["pyright"],
15
+ commands: ["npm install -g pyright", "pip install pyright"],
16
+ },
17
+ {
18
+ language: "python",
19
+ serverName: "pylsp",
20
+ packages: ["python-lsp-server"],
21
+ commands: [
22
+ "pip install python-lsp-server",
23
+ "pipx install python-lsp-server",
24
+ ],
25
+ },
26
+ {
27
+ language: "typescript",
28
+ serverName: "typescript-language-server",
29
+ packages: ["typescript-language-server", "typescript"],
30
+ commands: [
31
+ "npm install -g typescript-language-server typescript",
32
+ ],
33
+ },
34
+ {
35
+ language: "go",
36
+ serverName: "gopls",
37
+ packages: ["golang.org/x/tools/gopls"],
38
+ commands: ["go install golang.org/x/tools/gopls@latest"],
39
+ },
40
+ {
41
+ language: "json",
42
+ serverName: "vscode-json-languageserver",
43
+ packages: ["vscode-langservers-extracted"],
44
+ commands: ["npm install -g vscode-langservers-extracted"],
45
+ },
46
+ {
47
+ language: "yaml",
48
+ serverName: "yaml-language-server",
49
+ packages: ["yaml-language-server"],
50
+ commands: [
51
+ "npm install -g yaml-language-server",
52
+ ],
53
+ },
54
+ {
55
+ language: "rust",
56
+ serverName: "rust-analyzer",
57
+ packages: ["rust-analyzer"],
58
+ commands: [
59
+ "rustup component add rust-analyzer",
60
+ "brew install rust-analyzer",
61
+ ],
62
+ },
63
+ ];
64
+ // ── Detection ────────────────────────────────────────────────────────────────
65
+ /**
66
+ * Detect LSP servers for specified languages or auto-detect from project.
67
+ */
68
+ export function detectLspServers(projectRoot, languages) {
69
+ const detected = languages ?? detectProjectLanguages(projectRoot);
70
+ return detected.map((lang) => detectLspServer(projectRoot, lang));
71
+ }
72
+ // ── Setup command handler ────────────────────────────────────────────────────
73
+ /**
74
+ * Generate the /shazam-setup output as a formatted string.
75
+ */
76
+ export function generateSetupReport(projectRoot, languages) {
77
+ const detections = detectLspServers(projectRoot, languages);
78
+ const available = [];
79
+ const missing = [];
80
+ for (const d of detections) {
81
+ if (d.status === "available") {
82
+ available.push(d);
83
+ }
84
+ else {
85
+ missing.push(d);
86
+ }
87
+ }
88
+ const lines = [];
89
+ lines.push("## Shazam LSP Setup");
90
+ lines.push("");
91
+ lines.push(`Project: ${projectRoot}`);
92
+ lines.push(`Detected languages: ${detections.map((d) => d.language).join(", ") || "none"}`);
93
+ lines.push("");
94
+ // Available servers
95
+ if (available.length > 0) {
96
+ lines.push("### ✅ Available LSP Servers");
97
+ lines.push("");
98
+ for (const d of available) {
99
+ lines.push(`- **${d.language}**: \`${d.serverName}\` (${d.source}: \`${d.command.join(" ")}\`)`);
100
+ }
101
+ lines.push("");
102
+ }
103
+ // Missing servers with install instructions
104
+ if (missing.length > 0) {
105
+ lines.push("### ❌ Missing LSP Servers");
106
+ lines.push("");
107
+ for (const d of missing) {
108
+ const instruction = INSTALL_INSTRUCTIONS.find((i) => i.language === d.language &&
109
+ i.serverName === d.serverName);
110
+ lines.push(`#### ${d.language} — ${d.serverName}`);
111
+ if (d.reason) {
112
+ lines.push(` Reason: ${d.reason}`);
113
+ }
114
+ if (instruction) {
115
+ lines.push(" Install:");
116
+ for (const cmd of instruction.commands) {
117
+ lines.push(` ${cmd}`);
118
+ }
119
+ }
120
+ lines.push("");
121
+ }
122
+ }
123
+ if (detections.length === 0) {
124
+ lines.push("No supported languages detected in this project. LSP features will be unavailable.");
125
+ }
126
+ return lines.join("\n");
127
+ }
128
+ /**
129
+ * Get the install instructions as a simple key-value map
130
+ * for use in tool outputs.
131
+ */
132
+ export function getInstallInstructions() {
133
+ const map = {};
134
+ for (const inst of INSTALL_INSTRUCTIONS) {
135
+ const key = `${inst.language}:${inst.serverName}`;
136
+ map[key] = inst.commands;
137
+ }
138
+ return map;
139
+ }
140
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../lsp/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * pi-shazam tools/call_chain — Call graph traversal.
3
+ */
4
+ import type { ExtensionAPI } from "../types/pi-extension.js";
5
+ import type { RepoGraph } from "../core/graph.js";
6
+ export declare function registerCallChain(pi: ExtensionAPI): void;
7
+ export declare function executeCallChain(graph: RepoGraph, symbolName: string, depth?: number): string;
8
+ export declare function executeCallChainJson(graph: RepoGraph, symbolName: string, depth: number): string;
9
+ //# sourceMappingURL=call_chain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"call_chain.d.ts","sourceRoot":"","sources":["../../tools/call_chain.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,SAAS,EAAU,MAAM,kBAAkB,CAAC;AAG1D,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAsCxD;AAED,wBAAgB,gBAAgB,CAC/B,KAAK,EAAE,SAAS,EAChB,UAAU,EAAE,MAAM,EAClB,KAAK,GAAE,MAAU,GACf,MAAM,CA0CR;AAED,wBAAgB,oBAAoB,CACnC,KAAK,EAAE,SAAS,EAChB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,GACX,MAAM,CAwBR"}
@@ -0,0 +1,151 @@
1
+ import { scanProject } from "../core/scanner.js";
2
+ export function registerCallChain(pi) {
3
+ pi.registerTool({
4
+ name: "shazam_call_chain",
5
+ label: "Call Chain Analysis",
6
+ description: `\
7
+ MUST call before changing a function signature, deleting code, or
8
+ refactoring. Traces ALL upstream callers and downstream callees for a
9
+ symbol. Without this, you cannot know the blast radius. Every caller
10
+ you miss is a bug you will ship.
11
+
12
+ Returns: incoming calls (who calls this), outgoing calls (what this
13
+ calls), and full reference list. Pass --depth to control traversal
14
+ depth (default 2).
15
+
16
+ Scenario: changing parameter order. Removing a function. Renaming an
17
+ exported symbol. Changing return type. Adding required parameters.`,
18
+ parameters: pi.typebox.Object({
19
+ symbol: pi.typebox.String(),
20
+ depth: pi.typebox.Optional(pi.typebox.Number()),
21
+ json: pi.typebox.Optional(pi.typebox.Boolean()),
22
+ }),
23
+ async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
24
+ const json = params.json ?? false;
25
+ const graph = scanProject(".");
26
+ const depth = params.depth ?? 2;
27
+ const result = executeCallChain(graph, params.symbol, depth);
28
+ return {
29
+ content: [
30
+ {
31
+ type: "text",
32
+ text: json
33
+ ? executeCallChainJson(graph, params.symbol, depth)
34
+ : result,
35
+ },
36
+ ],
37
+ };
38
+ },
39
+ });
40
+ }
41
+ export function executeCallChain(graph, symbolName, depth = 2) {
42
+ const targets = findSymbolsByName(graph, symbolName);
43
+ if (targets.length === 0) {
44
+ return `Symbol not found: ${symbolName}`;
45
+ }
46
+ const lines = [];
47
+ for (const target of targets) {
48
+ lines.push(`## Call Chain for ${target.kind} \`${target.name}\` (${target.file}:${target.line})`);
49
+ lines.push("");
50
+ // Incoming callers (upstream) — BFS
51
+ const incomingChain = traceIncoming(graph, target.id, depth);
52
+ if (incomingChain.length > 0) {
53
+ lines.push(`### Incoming Calls (${incomingChain.length} callers in ${depth} levels)`);
54
+ for (const [level, sym, edge] of incomingChain) {
55
+ const indent = " ".repeat(level);
56
+ lines.push(`${indent}L${level}: ${sym.kind} \`${sym.name}\` — ${sym.file}:${sym.line} (${edge.kind})`);
57
+ }
58
+ }
59
+ // Outgoing callees (downstream) — BFS
60
+ const outgoingChain = traceOutgoing(graph, target.id, depth);
61
+ if (outgoingChain.length > 0) {
62
+ lines.push("");
63
+ lines.push(`### Outgoing Calls (${outgoingChain.length} callees in ${depth} levels)`);
64
+ for (const [level, sym, edge] of outgoingChain) {
65
+ const indent = " ".repeat(level);
66
+ lines.push(`${indent}L${level}: ${sym.kind} \`${sym.name}\` — ${sym.file}:${sym.line} (${edge.kind})`);
67
+ }
68
+ }
69
+ lines.push("");
70
+ }
71
+ return lines.join("\n").trim();
72
+ }
73
+ export function executeCallChainJson(graph, symbolName, depth) {
74
+ const targets = findSymbolsByName(graph, symbolName);
75
+ const result = targets.map((target) => ({
76
+ symbol: { id: target.id, name: target.name, kind: target.kind, file: target.file, line: target.line },
77
+ incoming: traceIncoming(graph, target.id, depth).map(([level, sym, edge]) => ({
78
+ level,
79
+ symbol: sym.name,
80
+ file: sym.file,
81
+ kind: edge.kind,
82
+ })),
83
+ outgoing: traceOutgoing(graph, target.id, depth).map(([level, sym, edge]) => ({
84
+ level,
85
+ symbol: sym.name,
86
+ file: sym.file,
87
+ kind: edge.kind,
88
+ })),
89
+ }));
90
+ return JSON.stringify({
91
+ schema_version: "1.0",
92
+ command: "call_chain",
93
+ status: "ok",
94
+ result,
95
+ });
96
+ }
97
+ function findSymbolsByName(graph, name) {
98
+ const results = [];
99
+ for (const sym of graph.symbols.values()) {
100
+ if (sym.name === name)
101
+ results.push(sym);
102
+ }
103
+ return results;
104
+ }
105
+ function traceIncoming(graph, startId, maxDepth) {
106
+ const visited = new Set();
107
+ const result = [];
108
+ const queue = [{ id: startId, depth: 0 }];
109
+ visited.add(startId);
110
+ while (queue.length > 0) {
111
+ const { id, depth } = queue.shift();
112
+ if (depth >= maxDepth)
113
+ continue;
114
+ const incoming = graph.incoming.get(id);
115
+ if (!incoming)
116
+ continue;
117
+ for (const edge of incoming) {
118
+ const srcSym = graph.symbols.get(edge.source);
119
+ if (!srcSym || visited.has(edge.source))
120
+ continue;
121
+ visited.add(edge.source);
122
+ result.push([depth + 1, srcSym, edge]);
123
+ queue.push({ id: edge.source, depth: depth + 1 });
124
+ }
125
+ }
126
+ return result;
127
+ }
128
+ function traceOutgoing(graph, startId, maxDepth) {
129
+ const visited = new Set();
130
+ const result = [];
131
+ const queue = [{ id: startId, depth: 0 }];
132
+ visited.add(startId);
133
+ while (queue.length > 0) {
134
+ const { id, depth } = queue.shift();
135
+ if (depth >= maxDepth)
136
+ continue;
137
+ const outgoing = graph.outgoing.get(id);
138
+ if (!outgoing)
139
+ continue;
140
+ for (const edge of outgoing) {
141
+ const tgtSym = graph.symbols.get(edge.target);
142
+ if (!tgtSym || visited.has(edge.target))
143
+ continue;
144
+ visited.add(edge.target);
145
+ result.push([depth + 1, tgtSym, edge]);
146
+ queue.push({ id: edge.target, depth: depth + 1 });
147
+ }
148
+ }
149
+ return result;
150
+ }
151
+ //# sourceMappingURL=call_chain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"call_chain.js","sourceRoot":"","sources":["../../tools/call_chain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * pi-shazam tools/check — Compiler/lint diagnostics.
3
+ *
4
+ * Validates project files using tree-sitter parsing and reports issues.
5
+ * Falls back to tree-sitter only when LSP is unavailable, annotated in output.
6
+ */
7
+ import type { ExtensionAPI } from "../types/pi-extension.js";
8
+ import type { RepoGraph } from "../core/graph.js";
9
+ export declare function registerCheck(pi: ExtensionAPI): void;
10
+ /**
11
+ * Run diagnostics check against the current graph.
12
+ */
13
+ export declare function executeCheck(graph: RepoGraph, _projectRoot: string, file?: string): string;
14
+ /**
15
+ * Run diagnostics and return structured JSON.
16
+ */
17
+ export declare function executeCheckJson(graph: RepoGraph, _projectRoot: string, file?: string): string;
18
+ //# sourceMappingURL=check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../tools/check.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAGlD,wBAAgB,aAAa,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CA6CpD;AAID;;GAEG;AACH,wBAAgB,YAAY,CAC3B,KAAK,EAAE,SAAS,EAChB,YAAY,EAAE,MAAM,EACpB,IAAI,CAAC,EAAE,MAAM,GACX,MAAM,CAwER;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC/B,KAAK,EAAE,SAAS,EAChB,YAAY,EAAE,MAAM,EACpB,IAAI,CAAC,EAAE,MAAM,GACX,MAAM,CA8BR"}
@@ -0,0 +1,141 @@
1
+ import { scanProject } from "../core/scanner.js";
2
+ export function registerCheck(pi) {
3
+ pi.registerTool({
4
+ name: "shazam_check",
5
+ label: "Compiler & Lint Diagnostics",
6
+ description: `\
7
+ Call when shazam_verify reports errors or you need compiler/linter
8
+ diagnostics independent of git state. Runs tsc/eslint/pyright/go-vet/
9
+ rustc directly and returns file:line:code:message for every issue.
10
+
11
+ Fix ALL errors before proceeding — a red check means broken code, not
12
+ "warnings to ignore later." Unlike verify, check does NOT depend on git
13
+ diff state — it runs on the entire project.
14
+
15
+ Scenario: CI failed, need local reproduction. verify says "run check
16
+ for details." Mid-refactor before all files are saved. After npm install
17
+ to confirm no type regressions.`,
18
+ parameters: pi.typebox.Object({
19
+ file: pi.typebox.Optional(pi.typebox.String()),
20
+ json: pi.typebox.Optional(pi.typebox.Boolean()),
21
+ }),
22
+ async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
23
+ const json = params.json ?? false;
24
+ const graph = scanProject(".");
25
+ if (json) {
26
+ return {
27
+ content: [
28
+ {
29
+ type: "text",
30
+ text: executeCheckJson(graph, ".", params.file),
31
+ },
32
+ ],
33
+ };
34
+ }
35
+ return {
36
+ content: [
37
+ {
38
+ type: "text",
39
+ text: executeCheck(graph, ".", params.file),
40
+ },
41
+ ],
42
+ };
43
+ },
44
+ });
45
+ }
46
+ // ── Execute functions (testable without Pi) ────────────────────────────────
47
+ /**
48
+ * Run diagnostics check against the current graph.
49
+ */
50
+ export function executeCheck(graph, _projectRoot, file) {
51
+ const lines = [];
52
+ lines.push("## Check Diagnostics");
53
+ lines.push("");
54
+ // ── Filter to target file if specified ─────────────────────────────
55
+ const targetFiles = file
56
+ ? [file]
57
+ : [...graph.fileSymbols.keys()];
58
+ if (targetFiles.length === 0) {
59
+ lines.push("No files to check.");
60
+ return lines.join("\n");
61
+ }
62
+ // ── Parse validation ────────────────────────────────────────────────
63
+ lines.push("### Tree-sitter Parse Status");
64
+ lines.push("");
65
+ const failedFiles = [];
66
+ const successfulFiles = [];
67
+ for (const filePath of targetFiles) {
68
+ const symIds = graph.fileSymbols.get(filePath);
69
+ if (!symIds || symIds.length === 0) {
70
+ failedFiles.push(filePath);
71
+ }
72
+ else {
73
+ successfulFiles.push(filePath);
74
+ }
75
+ }
76
+ lines.push(`✅ ${successfulFiles.length} files parsed successfully`);
77
+ if (failedFiles.length > 0) {
78
+ lines.push(`⚠️ ${failedFiles.length} files have no symbols (possible parse failure)`);
79
+ for (const f of failedFiles.slice(0, 10)) {
80
+ lines.push(` - ${f}`);
81
+ }
82
+ }
83
+ lines.push("");
84
+ // ── Symbol statistics ───────────────────────────────────────────────
85
+ lines.push("### Symbol Summary");
86
+ lines.push("");
87
+ let totalSymbols = 0;
88
+ let totalEdges = 0;
89
+ for (const filePath of targetFiles) {
90
+ const symIds = graph.fileSymbols.get(filePath);
91
+ if (symIds) {
92
+ totalSymbols += symIds.length;
93
+ for (const id of symIds) {
94
+ const out = graph.outgoing.get(id);
95
+ if (out)
96
+ totalEdges += out.length;
97
+ }
98
+ }
99
+ }
100
+ lines.push(`Files: ${successfulFiles.length}`);
101
+ lines.push(`Symbols: ${totalSymbols}`);
102
+ lines.push(`Edges: ${totalEdges}`);
103
+ lines.push("");
104
+ // ── LSP note ────────────────────────────────────────────────────────
105
+ lines.push("*LSP diagnostics not available in direct tool mode. Run `npx tsc --noEmit` for TypeScript type checking, or use repomap check for full LSP diagnostics.*");
106
+ lines.push("");
107
+ return lines.join("\n");
108
+ }
109
+ /**
110
+ * Run diagnostics and return structured JSON.
111
+ */
112
+ export function executeCheckJson(graph, _projectRoot, file) {
113
+ const targetFiles = file
114
+ ? [file]
115
+ : [...graph.fileSymbols.keys()];
116
+ const successfulFiles = [];
117
+ const failedFiles = [];
118
+ for (const filePath of targetFiles) {
119
+ const symIds = graph.fileSymbols.get(filePath);
120
+ if (!symIds || symIds.length === 0) {
121
+ failedFiles.push(filePath);
122
+ }
123
+ else {
124
+ successfulFiles.push(filePath);
125
+ }
126
+ }
127
+ return JSON.stringify({
128
+ schema_version: "1.0",
129
+ command: "check",
130
+ project: _projectRoot,
131
+ status: "ok",
132
+ result: {
133
+ totalFiles: targetFiles.length,
134
+ parsedFiles: successfulFiles.length,
135
+ failedFiles: failedFiles.length,
136
+ failedFileList: failedFiles.slice(0, 20),
137
+ symbolCount: graph.symbols.size,
138
+ },
139
+ });
140
+ }
141
+ //# sourceMappingURL=check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../tools/check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * pi-shazam tools/codequery — Unified symbol/file query.
3
+ */
4
+ import type { ExtensionAPI } from "../types/pi-extension.js";
5
+ import type { RepoGraph, Symbol } from "../core/graph.js";
6
+ export declare function registerCodequery(pi: ExtensionAPI): void;
7
+ interface CodequeryParams {
8
+ symbol?: string;
9
+ file?: string;
10
+ query?: string;
11
+ }
12
+ interface CodequeryResult {
13
+ symbols: Symbol[];
14
+ fileSymbols: Symbol[];
15
+ searchResults: Symbol[];
16
+ }
17
+ export declare function executeCodequery(graph: RepoGraph, params: CodequeryParams): CodequeryResult;
18
+ export {};
19
+ //# sourceMappingURL=codequery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codequery.d.ts","sourceRoot":"","sources":["../../tools/codequery.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAG1D,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAmDxD;AAED,UAAU,eAAe;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,UAAU,eAAe;IACxB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,wBAAgB,gBAAgB,CAC/B,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,eAAe,GACrB,eAAe,CAmCjB"}
@@ -0,0 +1,128 @@
1
+ import { scanProject } from "../core/scanner.js";
2
+ export function registerCodequery(pi) {
3
+ pi.registerTool({
4
+ name: "shazam_codequery",
5
+ label: "Symbol & File Query",
6
+ description: `\
7
+ MUST call to locate a symbol or inspect a file BEFORE reading or
8
+ editing it. Uses LSP precision + tree-sitter parsing. Faster and more
9
+ accurate than grep/read — returns definition site, references, callers,
10
+ and type info in one call.
11
+
12
+ Supports: --symbol <name> (find definition + references), --file <path>
13
+ (list all symbols in file with signatures), --query <keyword> (BM25
14
+ search with synonym expansion).
15
+
16
+ If this returns empty or "not found", the symbol does not exist — do
17
+ not guess or invent it. Use --file to verify the file's actual contents.
18
+
19
+ Scenario: before editing any function/class. Before renaming. Before
20
+ deleting. When you need to find where something is defined. When grep
21
+ returns too many results.`,
22
+ parameters: pi.typebox.Object({
23
+ symbol: pi.typebox.Optional(pi.typebox.String()),
24
+ file: pi.typebox.Optional(pi.typebox.String()),
25
+ query: pi.typebox.Optional(pi.typebox.String()),
26
+ json: pi.typebox.Optional(pi.typebox.Boolean()),
27
+ }),
28
+ async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
29
+ const json = params.json ?? false;
30
+ const graph = scanProject(".");
31
+ const result = executeCodequery(graph, {
32
+ symbol: params.symbol,
33
+ file: params.file,
34
+ query: params.query,
35
+ });
36
+ return {
37
+ content: [
38
+ {
39
+ type: "text",
40
+ text: json
41
+ ? JSON.stringify({
42
+ schema_version: "1.0",
43
+ command: "codequery",
44
+ status: "ok",
45
+ result: result,
46
+ })
47
+ : formatCodequeryResult(result, params),
48
+ },
49
+ ],
50
+ };
51
+ },
52
+ });
53
+ }
54
+ export function executeCodequery(graph, params) {
55
+ const result = {
56
+ symbols: [],
57
+ fileSymbols: [],
58
+ searchResults: [],
59
+ };
60
+ if (params.symbol) {
61
+ for (const sym of graph.symbols.values()) {
62
+ if (sym.name === params.symbol) {
63
+ result.symbols.push(sym);
64
+ }
65
+ }
66
+ }
67
+ if (params.file) {
68
+ const symIds = graph.fileSymbols.get(params.file) || [];
69
+ for (const id of symIds) {
70
+ const sym = graph.symbols.get(id);
71
+ if (sym)
72
+ result.fileSymbols.push(sym);
73
+ }
74
+ }
75
+ if (params.query) {
76
+ const lower = params.query.toLowerCase();
77
+ for (const sym of graph.symbols.values()) {
78
+ if (sym.name.toLowerCase().includes(lower)) {
79
+ result.searchResults.push(sym);
80
+ }
81
+ }
82
+ // Sort by PageRank
83
+ result.searchResults.sort((a, b) => b.pagerank - a.pagerank);
84
+ }
85
+ return result;
86
+ }
87
+ function formatCodequeryResult(result, params) {
88
+ const lines = [];
89
+ if (result.symbols.length > 0) {
90
+ lines.push(`## Symbol: ${params.symbol}`);
91
+ lines.push("");
92
+ for (const sym of result.symbols) {
93
+ lines.push(`- ${sym.kind} \`${sym.name}\` — ${sym.file}:${sym.line}`);
94
+ lines.push(` visibility: ${sym.visibility}`);
95
+ lines.push(` signature: ${sym.signature}`);
96
+ lines.push(` PageRank: ${sym.pagerank.toFixed(4)}`);
97
+ }
98
+ }
99
+ else if (params.symbol) {
100
+ lines.push(`Symbol not found: ${params.symbol}`);
101
+ }
102
+ if (result.fileSymbols.length > 0) {
103
+ if (lines.length > 0)
104
+ lines.push("");
105
+ lines.push(`## File: ${params.file} (${result.fileSymbols.length} symbols)`);
106
+ lines.push("");
107
+ for (const sym of result.fileSymbols) {
108
+ lines.push(`- ${sym.kind} \`${sym.name}\` (L${sym.line}) — ${sym.signature.slice(0, 80)}`);
109
+ }
110
+ }
111
+ else if (params.file) {
112
+ lines.push(`File not in graph: ${params.file}`);
113
+ }
114
+ if (result.searchResults.length > 0) {
115
+ if (lines.length > 0)
116
+ lines.push("");
117
+ lines.push(`## Search: "${params.query}" (${result.searchResults.length} results)`);
118
+ lines.push("");
119
+ for (const sym of result.searchResults.slice(0, 20)) {
120
+ lines.push(`- ${sym.kind} \`${sym.name}\` — ${sym.file}:${sym.line} (PR ${sym.pagerank.toFixed(3)})`);
121
+ }
122
+ if (result.searchResults.length > 20) {
123
+ lines.push(` ... and ${result.searchResults.length - 20} more`);
124
+ }
125
+ }
126
+ return lines.length > 0 ? lines.join("\n") : "No results found.";
127
+ }
128
+ //# sourceMappingURL=codequery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codequery.js","sourceRoot":"","sources":["../../tools/codequery.ts"],"names":[],"mappings":"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"}