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,32 @@
1
+ /**
2
+ * pi-shazam hooks/after-write — Auto-verify after write/edit operations.
3
+ *
4
+ * Registered on the `tool_result` event. When the LLM writes or edits a file,
5
+ * this hook automatically runs diagnostics (scan + verify) and sends findings
6
+ * back to the conversation.
7
+ */
8
+ import type { ExtensionAPI } from "../types/pi-extension.js";
9
+ /**
10
+ * Determine if a tool result should trigger automatic verification.
11
+ *
12
+ * @param toolName - Name of the tool that was executed
13
+ * @param isError - Whether the tool execution resulted in an error
14
+ * @returns true if verification should run
15
+ */
16
+ export declare function shouldTriggerVerify(toolName: string, isError: boolean): boolean;
17
+ /**
18
+ * Handle a write/edit tool result by running diagnostics and reporting findings.
19
+ *
20
+ * @param toolName - The tool that was executed (write or edit)
21
+ * @param projectRoot - Project root directory
22
+ * @returns Diagnostic findings as a formatted text string
23
+ */
24
+ export declare function handleWriteResult(toolName: string, projectRoot: string): string;
25
+ /**
26
+ * Register the after-write hook on the Pi extension API.
27
+ *
28
+ * On `tool_result` for write/edit operations, runs diagnostics and sends
29
+ * findings via pi.sendMessage().
30
+ */
31
+ export declare function registerAfterWriteHook(pi: ExtensionAPI): void;
32
+ //# sourceMappingURL=after-write.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"after-write.d.ts","sourceRoot":"","sources":["../../hooks/after-write.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAO7D;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAClC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,OAAO,GACd,OAAO,CAET;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAChC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GACjB,MAAM,CAoER;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAoB7D"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * pi-shazam hooks/after-write — Auto-verify after write/edit operations.
3
+ *
4
+ * Registered on the `tool_result` event. When the LLM writes or edits a file,
5
+ * this hook automatically runs diagnostics (scan + verify) and sends findings
6
+ * back to the conversation.
7
+ */
8
+ import { scanProject } from "../core/scanner.js";
9
+ import { diffBaseline } from "../core/cache.js";
10
+ /** Tool names that trigger auto-verify */
11
+ const WRITE_TOOLS = new Set(["write", "edit"]);
12
+ /**
13
+ * Determine if a tool result should trigger automatic verification.
14
+ *
15
+ * @param toolName - Name of the tool that was executed
16
+ * @param isError - Whether the tool execution resulted in an error
17
+ * @returns true if verification should run
18
+ */
19
+ export function shouldTriggerVerify(toolName, isError) {
20
+ return WRITE_TOOLS.has(toolName) && !isError;
21
+ }
22
+ /**
23
+ * Handle a write/edit tool result by running diagnostics and reporting findings.
24
+ *
25
+ * @param toolName - The tool that was executed (write or edit)
26
+ * @param projectRoot - Project root directory
27
+ * @returns Diagnostic findings as a formatted text string
28
+ */
29
+ export function handleWriteResult(toolName, projectRoot) {
30
+ try {
31
+ // Re-scan project to detect changes
32
+ const graph = scanProject(projectRoot, () => { });
33
+ const lines = [];
34
+ lines.push(`[pi-shazam] Auto-verify after ${toolName}:`);
35
+ lines.push("");
36
+ // Summary stats
37
+ lines.push(`- Project has ${graph.symbols.size} symbols across ${graph.fileSymbols.size} files`);
38
+ // Baseline diff (if available)
39
+ const diff = diffBaseline(graph, projectRoot);
40
+ if (diff) {
41
+ const added = diff.addedSymbols?.length ?? 0;
42
+ const removed = diff.removedSymbols?.length ?? 0;
43
+ const modified = diff.modifiedSymbols?.length ?? 0;
44
+ const totalChanges = added + removed + modified;
45
+ if (totalChanges > 0) {
46
+ lines.push(`- Graph changes: +${added} added, -${removed} removed, ~${modified} modified`);
47
+ }
48
+ }
49
+ // Check for orphan symbols (symbols with no incoming edges)
50
+ const orphanCount = [...graph.symbols.values()].filter((sym) => {
51
+ // Skip exported entry points and test files
52
+ if (sym.visibility === "exported" && sym.pagerank > 0.01)
53
+ return false;
54
+ if (sym.kind === "anonymous_function")
55
+ return false;
56
+ if (sym.file.includes("tests/") || sym.file.includes(".test."))
57
+ return false;
58
+ const incoming = graph.incoming.get(sym.id);
59
+ return !incoming || incoming.length === 0;
60
+ }).length;
61
+ if (orphanCount > 0) {
62
+ lines.push(`- ⚠️ Found ${orphanCount} symbols with no incoming references (potential orphans)`);
63
+ }
64
+ else {
65
+ lines.push("- ✅ No orphan symbols detected");
66
+ }
67
+ // File relationship summary
68
+ const fileCount = graph.fileSymbols.size;
69
+ const importCount = graph.fileImports.size;
70
+ lines.push(`- ${importCount}/${fileCount} files have import relationships`);
71
+ // Edge count
72
+ let edgeCount = 0;
73
+ for (const [, edges] of graph.outgoing) {
74
+ edgeCount += edges.length;
75
+ }
76
+ lines.push(`- Total edges in graph: ${edgeCount}`);
77
+ lines.push("");
78
+ lines.push("Run `shazam_verify` for full diagnostics including LSP checks and risk assessment.");
79
+ return lines.join("\n");
80
+ }
81
+ catch (err) {
82
+ return `[pi-shazam] Auto-verify failed: ${err}`;
83
+ }
84
+ }
85
+ /**
86
+ * Register the after-write hook on the Pi extension API.
87
+ *
88
+ * On `tool_result` for write/edit operations, runs diagnostics and sends
89
+ * findings via pi.sendMessage().
90
+ */
91
+ export function registerAfterWriteHook(pi) {
92
+ pi.on("tool_result", async (event, _ctx) => {
93
+ try {
94
+ // Skip non-write tools and errors
95
+ if (!shouldTriggerVerify(event.toolName, event.isError)) {
96
+ return;
97
+ }
98
+ const findings = handleWriteResult(event.toolName, ".");
99
+ // Send findings as a message to the LLM
100
+ pi.sendMessage({
101
+ customType: "shazam-auto-verify",
102
+ content: [{ type: "text", text: findings }],
103
+ display: true,
104
+ });
105
+ }
106
+ catch (err) {
107
+ pi.logger.warn(`[pi-shazam] Auto-verify hook error: ${err}`);
108
+ }
109
+ });
110
+ }
111
+ //# sourceMappingURL=after-write.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"after-write.js","sourceRoot":"","sources":["../../hooks/after-write.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * pi-shazam hooks/before-start — Inject project overview into system prompt.
3
+ *
4
+ * Registered on the `before_agent_start` event. Scans the project with
5
+ * tree-sitter, generates an overview, and injects it into the system prompt
6
+ * so the LLM has structural awareness before reading any code.
7
+ */
8
+ import type { ExtensionAPI } from "../types/pi-extension.js";
9
+ /**
10
+ * Generate a project overview string suitable for system prompt injection.
11
+ *
12
+ * @param projectRoot - Absolute or relative path to the project root
13
+ * @returns A formatted overview string prefixed with [pi-shazam] tag
14
+ */
15
+ export declare function generateOverviewForPrompt(projectRoot: string): string;
16
+ /**
17
+ * Register the before-start hook on the Pi extension API.
18
+ *
19
+ * On `before_agent_start`, generates a project overview and injects it
20
+ * into the system prompt array.
21
+ */
22
+ export declare function registerBeforeStartHook(pi: ExtensionAPI): void;
23
+ //# sourceMappingURL=before-start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"before-start.d.ts","sourceRoot":"","sources":["../../hooks/before-start.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAI7D;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAIrE;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAc9D"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * pi-shazam hooks/before-start — Inject project overview into system prompt.
3
+ *
4
+ * Registered on the `before_agent_start` event. Scans the project with
5
+ * tree-sitter, generates an overview, and injects it into the system prompt
6
+ * so the LLM has structural awareness before reading any code.
7
+ */
8
+ import { scanProject } from "../core/scanner.js";
9
+ import { executeOverview } from "../tools/overview.js";
10
+ /**
11
+ * Generate a project overview string suitable for system prompt injection.
12
+ *
13
+ * @param projectRoot - Absolute or relative path to the project root
14
+ * @returns A formatted overview string prefixed with [pi-shazam] tag
15
+ */
16
+ export function generateOverviewForPrompt(projectRoot) {
17
+ const graph = scanProject(projectRoot, () => { });
18
+ const overview = executeOverview(graph, projectRoot);
19
+ return `[pi-shazam] Project Overview:\n${overview}`;
20
+ }
21
+ /**
22
+ * Register the before-start hook on the Pi extension API.
23
+ *
24
+ * On `before_agent_start`, generates a project overview and injects it
25
+ * into the system prompt array.
26
+ */
27
+ export function registerBeforeStartHook(pi) {
28
+ pi.on("before_agent_start", async (_event, _ctx) => {
29
+ try {
30
+ const overviewText = generateOverviewForPrompt(".");
31
+ // Append overview to the system prompt
32
+ return {
33
+ systemPrompt: [overviewText],
34
+ };
35
+ }
36
+ catch (err) {
37
+ pi.logger.warn(`[pi-shazam] Failed to generate overview: ${err}`);
38
+ // Don't block agent start on overview failure
39
+ return undefined;
40
+ }
41
+ });
42
+ }
43
+ //# sourceMappingURL=before-start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"before-start.js","sourceRoot":"","sources":["../../hooks/before-start.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CAAC,WAAmB;IAC5D,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IACrD,OAAO,kCAAkC,QAAQ,EAAE,CAAC;AACrD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CAAC,EAAgB;IACvD,EAAE,CAAC,EAAE,CAAC,oBAAoB,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;QAClD,IAAI,CAAC;YACJ,MAAM,YAAY,GAAG,yBAAyB,CAAC,GAAG,CAAC,CAAC;YACpD,uCAAuC;YACvC,OAAO;gBACN,YAAY,EAAE,CAAC,YAAY,CAAC;aAC5B,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,4CAA4C,GAAG,EAAE,CAAC,CAAC;YAClE,8CAA8C;YAC9C,OAAO,SAAS,CAAC;QAClB,CAAC;IACF,CAAC,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * pi-shazam — Pi coding agent native codebase awareness extension.
3
+ *
4
+ * Entry point. Registered as a default export.
5
+ *
6
+ * Layers:
7
+ * hooks/ → tools/ → core/ + lsp/
8
+ *
9
+ * Core has zero Pi or LSP imports. LSP may import from core.
10
+ */
11
+ import type { ExtensionAPI } from "./types/pi-extension.js";
12
+ export default function (pi: ExtensionAPI): void;
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACX,YAAY,EAEZ,MAAM,yBAAyB,CAAC;AA0BjC,MAAM,CAAC,OAAO,WAAW,EAAE,EAAE,YAAY,GAAG,IAAI,CAoF/C"}
package/dist/index.js ADDED
@@ -0,0 +1,106 @@
1
+ /**
2
+ * pi-shazam — Pi coding agent native codebase awareness extension.
3
+ *
4
+ * Entry point. Registered as a default export.
5
+ *
6
+ * Layers:
7
+ * hooks/ → tools/ → core/ + lsp/
8
+ *
9
+ * Core has zero Pi or LSP imports. LSP may import from core.
10
+ */
11
+ import { LspManager } from "./lsp/manager.js";
12
+ import { generateSetupReport } from "./lsp/setup.js";
13
+ // ── Hook registrations ───────────────────────────────────────────────────
14
+ import { registerBeforeStartHook } from "./hooks/before-start.js";
15
+ import { registerAfterWriteHook } from "./hooks/after-write.js";
16
+ // ── Tool registrations ────────────────────────────────────────────────────
17
+ import { registerOverview } from "./tools/overview.js";
18
+ import { registerImpact } from "./tools/impact.js";
19
+ import { registerCodequery } from "./tools/codequery.js";
20
+ import { registerCallChain } from "./tools/call_chain.js";
21
+ import { registerVerify } from "./tools/verify.js";
22
+ import { registerCheck } from "./tools/check.js";
23
+ import { registerFix } from "./tools/fix.js";
24
+ import { registerReady } from "./tools/ready.js";
25
+ import { registerRefs } from "./tools/refs.js";
26
+ import { registerRoutes } from "./tools/routes.js";
27
+ import { registerStateMap } from "./tools/state_map.js";
28
+ import { registerOrphan } from "./tools/orphan.js";
29
+ import { registerHotspots } from "./tools/hotspots.js";
30
+ import { registerCodesearch } from "./tools/codesearch.js";
31
+ import { registerFileDetail } from "./tools/file_detail.js";
32
+ import { registerSymbol } from "./tools/symbol.js";
33
+ export default function (pi) {
34
+ const projectRoot = process.cwd();
35
+ const log = (msg) => pi.logger.info(`[pi-shazam] ${msg}`);
36
+ // ── LSP manager ─────────────────────────────────────────────────────────
37
+ const lspManager = new LspManager(projectRoot, log);
38
+ // Auto-initialize LSP on agent start
39
+ pi.on("before_agent_start", async (_event, _ctx) => {
40
+ try {
41
+ const languages = lspManager.detectLanguages();
42
+ if (languages.length > 0) {
43
+ log(`Detected languages: ${languages.join(", ")}`);
44
+ await lspManager.initializeAll();
45
+ }
46
+ }
47
+ catch (err) {
48
+ log(`LSP init error: ${err}`);
49
+ }
50
+ });
51
+ // Shutdown LSP servers on session shutdown
52
+ pi.on("session_shutdown", () => {
53
+ log("Shutting down LSP servers...");
54
+ lspManager.shutdown();
55
+ });
56
+ // ── Hooks ────────────────────────────────────────────────────────────────
57
+ registerBeforeStartHook(pi);
58
+ registerAfterWriteHook(pi);
59
+ // ── /shazam-setup command ───────────────────────────────────────────────
60
+ pi.registerCommand("shazam-setup", {
61
+ description: "Detect and report LSP server availability with install instructions",
62
+ async handler(_args, ctx) {
63
+ const report = generateSetupReport(projectRoot);
64
+ ctx.ui.setStatus("shazam-setup", "LSP setup report generated");
65
+ // Send as a custom message so the user sees the report
66
+ pi.sendMessage({
67
+ customType: "shazam-setup",
68
+ content: [{ type: "text", text: report }],
69
+ display: true,
70
+ });
71
+ },
72
+ });
73
+ // ── /shazam-doctor command ──────────────────────────────────────────────
74
+ pi.registerCommand("shazam-doctor", {
75
+ description: "Health check: tree-sitter grammars, LSP servers, cache integrity",
76
+ async handler(_args, ctx) {
77
+ const lspReport = generateSetupReport(projectRoot);
78
+ const msg = ["## Shazam Doctor — Health Check", "", lspReport].join("\n");
79
+ ctx.ui.setStatus("shazam-doctor", "Health check complete");
80
+ pi.sendMessage({
81
+ customType: "shazam-doctor",
82
+ content: [{ type: "text", text: msg }],
83
+ display: true,
84
+ });
85
+ },
86
+ });
87
+ // ── Tools (LLM-visible) ────────────────────────────────────────────────
88
+ registerOverview(pi);
89
+ registerImpact(pi);
90
+ registerCodequery(pi);
91
+ registerCallChain(pi);
92
+ registerVerify(pi);
93
+ registerCheck(pi);
94
+ registerFix(pi);
95
+ registerReady(pi);
96
+ registerRefs(pi);
97
+ registerRoutes(pi);
98
+ registerStateMap(pi);
99
+ registerOrphan(pi);
100
+ registerHotspots(pi);
101
+ registerCodesearch(pi);
102
+ registerFileDetail(pi);
103
+ registerSymbol(pi);
104
+ log("pi-shazam loaded");
105
+ }
106
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * pi-shazam lsp/client — LSP protocol communication (JSON-RPC over stdio).
3
+ *
4
+ * Uses vscode-jsonrpc/node for wire protocol handling
5
+ * (StreamMessageReader / StreamMessageWriter + createMessageConnection).
6
+ *
7
+ * Ported from repomap/src/lsp.py (StdioLspClient).
8
+ */
9
+ import type { Location, PublishDiagnosticsParams, Hover, SymbolInformation, DocumentSymbol } from "vscode-languageserver-protocol";
10
+ export interface LspDiagnostic {
11
+ file: string;
12
+ line: number;
13
+ col: number;
14
+ endLine: number;
15
+ endCol: number;
16
+ severity: "error" | "warning" | "info" | "hint";
17
+ code: string;
18
+ message: string;
19
+ source: string;
20
+ }
21
+ export interface LspLocation {
22
+ file: string;
23
+ line: number;
24
+ col: number;
25
+ endLine: number;
26
+ endCol: number;
27
+ }
28
+ export declare class LspClient {
29
+ readonly command: readonly string[];
30
+ readonly workspaceRoot: string;
31
+ readonly timeout: number;
32
+ private process;
33
+ private connection;
34
+ private _openedFiles;
35
+ private _serverCapabilities;
36
+ private _running;
37
+ private _log;
38
+ private _notifications;
39
+ constructor(command: readonly string[], workspaceRoot: string, timeout?: number, log?: (msg: string) => void);
40
+ isRunning(): boolean;
41
+ isFileOpened(filePath: string): boolean;
42
+ get serverCapabilities(): Record<string, unknown>;
43
+ start(): void;
44
+ initialize(): Promise<void>;
45
+ didOpen(filePath: string, text: string): Promise<void>;
46
+ request(method: string, params: unknown): Promise<unknown>;
47
+ definition(filePath: string, line: number, character: number): Promise<Location | Location[] | null>;
48
+ references(filePath: string, line: number, character: number): Promise<Location[] | null>;
49
+ hover(filePath: string, line: number, character: number): Promise<Hover | null>;
50
+ documentSymbols(filePath: string): Promise<DocumentSymbol[] | SymbolInformation[] | null>;
51
+ /**
52
+ * Collect diagnostics for a set of file paths.
53
+ * Checks accumulated notifications first, then polls briefly for more.
54
+ */
55
+ collectDiagnostics(filePaths: string[]): PublishDiagnosticsParams[];
56
+ close(): void;
57
+ private _detectLanguage;
58
+ }
59
+ export interface RawLspDiagnostic {
60
+ range: {
61
+ start: {
62
+ line: number;
63
+ character: number;
64
+ };
65
+ end: {
66
+ line: number;
67
+ character: number;
68
+ };
69
+ };
70
+ severity?: number;
71
+ code?: string | number;
72
+ message: string;
73
+ source?: string;
74
+ }
75
+ export declare function convertDiagnostics(projectRoot: string, uri: string, rawDiagnostics: RawLspDiagnostic[]): LspDiagnostic[];
76
+ export declare function convertLocation(projectRoot: string, loc: Location): LspLocation;
77
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../lsp/client.ts"],"names":[],"mappings":"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"}