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,145 @@
1
+ import { scanProject } from "../core/scanner.js";
2
+ import { executeVerifyJson } from "./verify.js";
3
+ import { executeCheckJson } from "./check.js";
4
+ export function registerReady(pi) {
5
+ pi.registerTool({
6
+ name: "shazam_ready",
7
+ label: "Pre-Commit Readiness",
8
+ description: `\
9
+ MUST call before committing, pushing, or calling goal_complete. Runs
10
+ verify + check + fix in sequence. This is the FINAL GATE — the last
11
+ thing you do before shipping code. If ready fails, you are NOT DONE.
12
+ Fix all issues and call ready again until it passes with zero errors.
13
+
14
+ Scenario: about to git commit. About to push. About to open a PR.
15
+ About to call goal_complete. Before merging to main.`,
16
+ parameters: pi.typebox.Object({
17
+ json: pi.typebox.Optional(pi.typebox.Boolean()),
18
+ }),
19
+ async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
20
+ const json = params.json ?? false;
21
+ const graph = scanProject(".");
22
+ if (json) {
23
+ return {
24
+ content: [
25
+ {
26
+ type: "text",
27
+ text: executeReadyJson(graph, "."),
28
+ },
29
+ ],
30
+ };
31
+ }
32
+ return {
33
+ content: [
34
+ {
35
+ type: "text",
36
+ text: executeReady(graph, "."),
37
+ },
38
+ ],
39
+ };
40
+ },
41
+ });
42
+ }
43
+ // ── Execute functions (testable without Pi) ────────────────────────────────
44
+ /**
45
+ * Run pre-commit readiness check, composing verify + check results.
46
+ */
47
+ export function executeReady(graph, projectRoot) {
48
+ const verifyJsonRaw = executeVerifyJson(graph, projectRoot);
49
+ const checkJsonRaw = executeCheckJson(graph, projectRoot);
50
+ let verifyData = {};
51
+ let checkData = {};
52
+ try {
53
+ verifyData = JSON.parse(verifyJsonRaw);
54
+ }
55
+ catch { /* use defaults */ }
56
+ try {
57
+ checkData = JSON.parse(checkJsonRaw);
58
+ }
59
+ catch { /* use defaults */ }
60
+ const riskLevel = verifyData.result?.riskLevel ?? "unknown";
61
+ const orphanCount = verifyData.result?.orphanCount ?? 0;
62
+ const failedFiles = checkData.result?.failedFiles ?? 0;
63
+ const parsedFiles = checkData.result?.parsedFiles ?? 0;
64
+ const isReady = riskLevel === "low" && orphanCount === 0 && failedFiles === 0;
65
+ const lines = [];
66
+ lines.push("## Pre-Commit Readiness");
67
+ lines.push("");
68
+ // ── Status ──────────────────────────────────────────────────────────
69
+ lines.push(`**Status:** ${isReady ? "✅ READY" : "❌ NOT READY"}`);
70
+ lines.push("");
71
+ // ── Verify summary ──────────────────────────────────────────────────
72
+ lines.push("### Verify");
73
+ lines.push(`Risk level: **${riskLevel}**`);
74
+ lines.push(`Orphan symbols: ${orphanCount}`);
75
+ lines.push(`Total symbols: ${verifyData.result?.symbolCount ?? "?"}`);
76
+ lines.push(`Total files: ${verifyData.result?.fileCount ?? "?"}`);
77
+ lines.push("");
78
+ // ── Check summary ──────────────────────────────────────────────────
79
+ lines.push("### Check");
80
+ lines.push(`Files parsed: ${parsedFiles}`);
81
+ lines.push(`Files failed: ${failedFiles}`);
82
+ lines.push("");
83
+ // ── Recommendations ────────────────────────────────────────────────
84
+ if (!isReady) {
85
+ lines.push("### Issues to Fix Before Commit");
86
+ lines.push("");
87
+ if (riskLevel !== "low") {
88
+ lines.push(`- Risk level is **${riskLevel}** — run \`shazam_verify\` for details`);
89
+ }
90
+ if (orphanCount > 0) {
91
+ lines.push(`- ${orphanCount} orphan symbol(s) — run \`shazam_orphan\` to review`);
92
+ }
93
+ if (failedFiles > 0) {
94
+ lines.push(`- ${failedFiles} file(s) failed parse — run \`shazam_check\` for details`);
95
+ }
96
+ lines.push("");
97
+ lines.push("Run `shazam_fix` to auto-fix format issues, then call `shazam_ready` again.");
98
+ }
99
+ else {
100
+ lines.push("All checks pass. Ready to commit! 🚀");
101
+ }
102
+ return lines.join("\n");
103
+ }
104
+ /**
105
+ * Run readiness check and return structured JSON.
106
+ */
107
+ export function executeReadyJson(graph, projectRoot) {
108
+ const verifyJsonRaw = executeVerifyJson(graph, projectRoot);
109
+ const checkJsonRaw = executeCheckJson(graph, projectRoot);
110
+ let verifyData = {};
111
+ let checkData = {};
112
+ try {
113
+ verifyData = JSON.parse(verifyJsonRaw);
114
+ }
115
+ catch { /* use defaults */ }
116
+ try {
117
+ checkData = JSON.parse(checkJsonRaw);
118
+ }
119
+ catch { /* use defaults */ }
120
+ const riskLevel = verifyData.result?.riskLevel ?? "unknown";
121
+ const orphanCount = verifyData.result?.orphanCount ?? 0;
122
+ const failedFiles = checkData.result?.failedFiles ?? 0;
123
+ const isReady = riskLevel === "low" && orphanCount === 0 && failedFiles === 0;
124
+ return JSON.stringify({
125
+ schema_version: "1.0",
126
+ command: "ready",
127
+ project: projectRoot,
128
+ status: "ok",
129
+ result: {
130
+ ready: isReady,
131
+ verify: {
132
+ riskLevel,
133
+ orphanCount,
134
+ symbolCount: verifyData.result?.symbolCount ?? 0,
135
+ fileCount: verifyData.result?.fileCount ?? 0,
136
+ },
137
+ check: {
138
+ parsedFiles: checkData.result?.parsedFiles ?? 0,
139
+ failedFiles,
140
+ symbolCount: checkData.result?.symbolCount ?? 0,
141
+ },
142
+ },
143
+ });
144
+ }
145
+ //# sourceMappingURL=ready.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ready.js","sourceRoot":"","sources":["../../tools/ready.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * pi-shazam tools/refs — Reference finder.
3
+ */
4
+ import type { ExtensionAPI } from "../types/pi-extension.js";
5
+ import type { RepoGraph } from "../core/graph.js";
6
+ export declare function registerRefs(pi: ExtensionAPI): void;
7
+ export declare function executeRefs(graph: RepoGraph, symbolName: string, file?: string): string;
8
+ export declare function executeRefsJson(graph: RepoGraph, symbolName: string, file?: string): string;
9
+ //# sourceMappingURL=refs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refs.d.ts","sourceRoot":"","sources":["../../tools/refs.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,YAAY,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAqCnD;AAED,wBAAgB,WAAW,CAC1B,KAAK,EAAE,SAAS,EAChB,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,MAAM,GACX,MAAM,CAgDR;AAED,wBAAgB,eAAe,CAC9B,KAAK,EAAE,SAAS,EAChB,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,MAAM,GACX,MAAM,CAwCR"}
@@ -0,0 +1,129 @@
1
+ import { scanProject } from "../core/scanner.js";
2
+ export function registerRefs(pi) {
3
+ pi.registerTool({
4
+ name: "shazam_refs",
5
+ label: "Find References",
6
+ description: `\
7
+ Call to find EVERY reference to a symbol (function, class, variable,
8
+ type) across the entire project. Uses LSP references + tree-sitter
9
+ fallback. Returns file:line:context for each usage.
10
+
11
+ MUST call BEFORE renaming, deleting, or changing visibility of any
12
+ symbol. A reference you miss is a broken import or a runtime crash.
13
+
14
+ Scenario: renaming a variable. Changing a function from public to
15
+ private. Deleting dead code (confirm zero references first). Checking
16
+ if a deprecated function still has callers.`,
17
+ parameters: pi.typebox.Object({
18
+ symbol: pi.typebox.String(),
19
+ file: pi.typebox.Optional(pi.typebox.String()),
20
+ line: 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 result = executeRefs(graph, params.symbol, params.file);
27
+ return {
28
+ content: [
29
+ {
30
+ type: "text",
31
+ text: json
32
+ ? executeRefsJson(graph, params.symbol, params.file)
33
+ : result,
34
+ },
35
+ ],
36
+ };
37
+ },
38
+ });
39
+ }
40
+ export function executeRefs(graph, symbolName, file) {
41
+ // Find the symbol first
42
+ const targetSyms = findSymbols(graph, symbolName, file);
43
+ if (targetSyms.length === 0) {
44
+ return `Symbol not found: ${symbolName}${file ? ` in ${file}` : ""}`;
45
+ }
46
+ const lines = [];
47
+ for (const target of targetSyms) {
48
+ lines.push(`## References to ${target.kind} \`${target.name}\` (${target.file}:${target.line})`);
49
+ lines.push("");
50
+ // Incoming references (who references this symbol)
51
+ const incoming = graph.incoming.get(target.id);
52
+ if (incoming && incoming.length > 0) {
53
+ lines.push(`### Incoming (${incoming.length} references)`);
54
+ for (const edge of incoming) {
55
+ const srcSym = graph.symbols.get(edge.source);
56
+ if (srcSym) {
57
+ lines.push(`- ${srcSym.kind} \`${srcSym.name}\` — ${srcSym.file}:${srcSym.line} (${edge.kind})`);
58
+ }
59
+ }
60
+ }
61
+ else {
62
+ lines.push("### Incoming: 0 references");
63
+ }
64
+ // Outgoing references (what this symbol references)
65
+ const outgoing = graph.outgoing.get(target.id);
66
+ if (outgoing && outgoing.length > 0) {
67
+ lines.push("");
68
+ lines.push(`### Outgoing (${outgoing.length} references)`);
69
+ for (const edge of outgoing) {
70
+ const tgtSym = graph.symbols.get(edge.target);
71
+ if (tgtSym) {
72
+ lines.push(`- ${tgtSym.kind} \`${tgtSym.name}\` — ${tgtSym.file}:${tgtSym.line} (${edge.kind})`);
73
+ }
74
+ }
75
+ }
76
+ lines.push("");
77
+ }
78
+ return lines.join("\n").trim();
79
+ }
80
+ export function executeRefsJson(graph, symbolName, file) {
81
+ const targets = findSymbols(graph, symbolName, file);
82
+ const result = targets.map((target) => {
83
+ const incoming = graph.incoming.get(target.id) || [];
84
+ const outgoing = graph.outgoing.get(target.id) || [];
85
+ return {
86
+ symbol: {
87
+ id: target.id,
88
+ name: target.name,
89
+ kind: target.kind,
90
+ file: target.file,
91
+ line: target.line,
92
+ },
93
+ incomingCount: incoming.length,
94
+ outgoingCount: outgoing.length,
95
+ incoming: incoming.slice(0, 50).map((e) => {
96
+ const src = graph.symbols.get(e.source);
97
+ return {
98
+ from: src?.name ?? e.source,
99
+ file: src?.file ?? "?",
100
+ kind: e.kind,
101
+ };
102
+ }),
103
+ outgoing: outgoing.slice(0, 50).map((e) => {
104
+ const tgt = graph.symbols.get(e.target);
105
+ return {
106
+ to: tgt?.name ?? e.target,
107
+ file: tgt?.file ?? "?",
108
+ kind: e.kind,
109
+ };
110
+ }),
111
+ };
112
+ });
113
+ return JSON.stringify({
114
+ schema_version: "1.0",
115
+ command: "refs",
116
+ status: "ok",
117
+ result,
118
+ });
119
+ }
120
+ function findSymbols(graph, name, file) {
121
+ const results = [];
122
+ for (const sym of graph.symbols.values()) {
123
+ if (sym.name === name && (!file || sym.file === file)) {
124
+ results.push(sym);
125
+ }
126
+ }
127
+ return results;
128
+ }
129
+ //# sourceMappingURL=refs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refs.js","sourceRoot":"","sources":["../../tools/refs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * pi-shazam tools/routes — HTTP route inventory.
3
+ */
4
+ import type { ExtensionAPI } from "../types/pi-extension.js";
5
+ import type { RepoGraph } from "../core/graph.js";
6
+ export declare function registerRoutes(pi: ExtensionAPI): void;
7
+ export declare function executeRoutes(graph: RepoGraph, _projectRoot: string): string;
8
+ //# sourceMappingURL=routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../tools/routes.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,cAAc,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAuCrD;AAQD,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CA8C5E"}
@@ -0,0 +1,83 @@
1
+ import { scanProject } from "../core/scanner.js";
2
+ export function registerRoutes(pi) {
3
+ pi.registerTool({
4
+ name: "shazam_routes",
5
+ label: "HTTP Route Inventory",
6
+ description: `\
7
+ Call when working on web/API projects to inventory ALL HTTP routes.
8
+ Returns: method (GET/POST/PUT/DELETE), path pattern, handler file:line.
9
+
10
+ MUST call before changing any route path or handler signature — a route
11
+ consumer you miss is a broken API endpoint in production. Also surfaces
12
+ routes WITHOUT authentication guards (security risk).
13
+
14
+ Scenario: adding a new API endpoint. Changing a route path or parameter
15
+ pattern. Refactoring middleware. Auditing auth coverage across
16
+ endpoints. Before deleting a handler function.`,
17
+ parameters: pi.typebox.Object({
18
+ json: pi.typebox.Optional(pi.typebox.Boolean()),
19
+ }),
20
+ async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
21
+ const json = params.json ?? false;
22
+ const graph = scanProject(".");
23
+ const result = executeRoutes(graph, ".");
24
+ return {
25
+ content: [
26
+ {
27
+ type: "text",
28
+ text: json
29
+ ? JSON.stringify({
30
+ schema_version: "1.0",
31
+ command: "routes",
32
+ status: "ok",
33
+ result: { routeCount: 0 },
34
+ })
35
+ : result,
36
+ },
37
+ ],
38
+ };
39
+ },
40
+ });
41
+ }
42
+ // HTTP method pattern keywords found in symbol names/signatures
43
+ const ROUTE_KEYWORDS = [
44
+ "route", "router", "endpoint", "handler", "controller",
45
+ "get", "post", "put", "delete", "patch",
46
+ ];
47
+ export function executeRoutes(graph, _projectRoot) {
48
+ const routeSymbols = [];
49
+ for (const sym of graph.symbols.values()) {
50
+ const lower = sym.name.toLowerCase();
51
+ for (const kw of ROUTE_KEYWORDS) {
52
+ if (lower.includes(kw)) {
53
+ routeSymbols.push(sym);
54
+ break;
55
+ }
56
+ }
57
+ }
58
+ const lines = [];
59
+ lines.push("## HTTP Route Inventory");
60
+ lines.push("");
61
+ if (routeSymbols.length === 0) {
62
+ lines.push("No route-like symbols detected.");
63
+ lines.push("(Route detection works by keyword matching on symbol names.)");
64
+ return lines.join("\n");
65
+ }
66
+ lines.push(`Found ${routeSymbols.length} route-related symbols:`);
67
+ // Group by file
68
+ const byFile = new Map();
69
+ for (const sym of routeSymbols) {
70
+ const arr = byFile.get(sym.file) || [];
71
+ arr.push(sym);
72
+ byFile.set(sym.file, arr);
73
+ }
74
+ for (const [file, syms] of [...byFile.entries()].sort()) {
75
+ lines.push("");
76
+ lines.push(`### ${file}`);
77
+ for (const sym of syms) {
78
+ lines.push(`- ${sym.kind} \`${sym.name}\` L${sym.line} — ${sym.signature.slice(0, 80)}`);
79
+ }
80
+ }
81
+ return lines.join("\n");
82
+ }
83
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../tools/routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * pi-shazam tools/state_map — State definition discovery.
3
+ */
4
+ import type { ExtensionAPI } from "../types/pi-extension.js";
5
+ import type { RepoGraph } from "../core/graph.js";
6
+ export declare function registerStateMap(pi: ExtensionAPI): void;
7
+ export declare function executeStateMap(graph: RepoGraph, symbolName: string): string;
8
+ //# sourceMappingURL=state_map.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state_map.d.ts","sourceRoot":"","sources":["../../tools/state_map.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,gBAAgB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CA0CvD;AAED,wBAAgB,eAAe,CAC9B,KAAK,EAAE,SAAS,EAChB,UAAU,EAAE,MAAM,GAChB,MAAM,CA8DR"}
@@ -0,0 +1,95 @@
1
+ import { scanProject } from "../core/scanner.js";
2
+ export function registerStateMap(pi) {
3
+ pi.registerTool({
4
+ name: "shazam_state_map",
5
+ label: "State Map / Enum Explorer",
6
+ description: `\
7
+ Call on enum, const group, or state-machine symbols to see EVERY
8
+ possible value and exactly where each value is used (pattern-matched
9
+ across the full project).
10
+
11
+ MUST call before adding/removing enum variants or changing state
12
+ transitions — a missing case in a switch/match is a runtime crash.
13
+ Returns: all variant names, count of usages per variant, and files
14
+ that would be impacted by variant changes.
15
+
16
+ Scenario: adding a new enum variant. Removing a state-machine state.
17
+ Auditing exhaustive match/switch coverage. Before changing a union
18
+ type's members.`,
19
+ parameters: pi.typebox.Object({
20
+ symbol: pi.typebox.String(),
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 result = executeStateMap(graph, params.symbol);
27
+ return {
28
+ content: [
29
+ {
30
+ type: "text",
31
+ text: json
32
+ ? JSON.stringify({
33
+ schema_version: "1.0",
34
+ command: "state_map",
35
+ status: "ok",
36
+ result: { symbol: params.symbol, found: result.includes(params.symbol) },
37
+ })
38
+ : result,
39
+ },
40
+ ],
41
+ };
42
+ },
43
+ });
44
+ }
45
+ export function executeStateMap(graph, symbolName) {
46
+ const targets = [];
47
+ for (const sym of graph.symbols.values()) {
48
+ if (sym.name === symbolName) {
49
+ targets.push(sym);
50
+ }
51
+ }
52
+ if (targets.length === 0) {
53
+ return `Symbol not found: ${symbolName}`;
54
+ }
55
+ const lines = [];
56
+ for (const target of targets) {
57
+ lines.push(`## State Map: ${target.kind} \`${target.name}\` (${target.file}:${target.line})`);
58
+ lines.push("");
59
+ // Members: search for symbols that reference this one
60
+ const incoming = graph.incoming.get(target.id) || [];
61
+ const outgoing = graph.outgoing.get(target.id) || [];
62
+ if (incoming.length > 0) {
63
+ lines.push(`### Usages (${incoming.length} references from other symbols)`);
64
+ // Group by file
65
+ const byFile = new Map();
66
+ for (const edge of incoming) {
67
+ const sym = graph.symbols.get(edge.source);
68
+ if (sym) {
69
+ const arr = byFile.get(sym.file) || [];
70
+ arr.push(sym);
71
+ byFile.set(sym.file, arr);
72
+ }
73
+ }
74
+ for (const [file, syms] of [...byFile.entries()].sort()) {
75
+ lines.push(` **${file}**: ${syms.map((s) => s.name).join(", ")}`);
76
+ }
77
+ }
78
+ if (outgoing.length > 0) {
79
+ lines.push("");
80
+ lines.push(`### Dependencies (${outgoing.length} symbols this depends on)`);
81
+ for (const edge of outgoing) {
82
+ const sym = graph.symbols.get(edge.target);
83
+ if (sym) {
84
+ lines.push(`- ${sym.kind} \`${sym.name}\` — ${sym.file}:${sym.line}`);
85
+ }
86
+ }
87
+ }
88
+ lines.push("");
89
+ lines.push(`Visibility: ${target.visibility}`);
90
+ lines.push(`PageRank: ${target.pagerank.toFixed(4)}`);
91
+ lines.push(`Signature: ${target.signature}`);
92
+ }
93
+ return lines.join("\n");
94
+ }
95
+ //# sourceMappingURL=state_map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state_map.js","sourceRoot":"","sources":["../../tools/state_map.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,UAAU,gBAAgB,CAAC,EAAgB;IAChD,EAAE,CAAC,YAAY,CAAC;QACf,IAAI,EAAE,kBAAkB;QACxB,KAAK,EAAE,2BAA2B;QAClC,WAAW,EAAE;;;;;;;;;;;;gBAYC;QACd,UAAU,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;YAC7B,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE;YAC3B,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;SAC/C,CAAC;QACF,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI;YAC1D,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,KAAK,CAAC;YAClC,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;YAC/B,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YACrD,OAAO;gBACN,OAAO,EAAE;oBACR;wBACC,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI;4BACT,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC;gCACf,cAAc,EAAE,KAAK;gCACrB,OAAO,EAAE,WAAW;gCACpB,MAAM,EAAE,IAAI;gCACZ,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;6BACxE,CAAC;4BACH,CAAC,CAAC,MAAM;qBACT;iBACD;aACD,CAAC;QACH,CAAC;KACD,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAC9B,KAAgB,EAChB,UAAkB;IAElB,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QAC1C,IAAI,GAAG,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;IACF,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,qBAAqB,UAAU,EAAE,CAAC;IAC1C,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CACT,iBAAiB,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC,IAAI,OAAO,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,GAAG,CACjF,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,sDAAsD;QACtD,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QACrD,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QAErD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,KAAK,CAAC,IAAI,CACT,eAAe,QAAQ,CAAC,MAAM,iCAAiC,CAC/D,CAAC;YACF,gBAAgB;YAChB,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAC;YAC3C,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;gBAC7B,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC3C,IAAI,GAAG,EAAE,CAAC;oBACT,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;oBACvC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBACd,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;gBAC3B,CAAC;YACF,CAAC;YACD,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;gBACzD,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACpE,CAAC;QACF,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CACT,qBAAqB,QAAQ,CAAC,MAAM,2BAA2B,CAC/D,CAAC;YACF,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;gBAC7B,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC3C,IAAI,GAAG,EAAE,CAAC;oBACT,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,QAAQ,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;gBACvE,CAAC;YACF,CAAC;QACF,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;QAC/C,KAAK,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACtD,KAAK,CAAC,IAAI,CAAC,cAAc,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * pi-shazam tools/symbol — Symbol lookup.
3
+ */
4
+ import type { ExtensionAPI } from "../types/pi-extension.js";
5
+ import type { RepoGraph } from "../core/graph.js";
6
+ export declare function registerSymbol(pi: ExtensionAPI): void;
7
+ export declare function executeSymbol(graph: RepoGraph, name: string, file?: string): string;
8
+ export declare function executeSymbolJson(graph: RepoGraph, name: string, file?: string): string;
9
+ //# sourceMappingURL=symbol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symbol.d.ts","sourceRoot":"","sources":["../../tools/symbol.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,cAAc,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAgCrD;AAED,wBAAgB,aAAa,CAC5B,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,GACX,MAAM,CA0BR;AAED,wBAAgB,iBAAiB,CAChC,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,GACX,MAAM,CAiBR"}
@@ -0,0 +1,84 @@
1
+ import { scanProject } from "../core/scanner.js";
2
+ export function registerSymbol(pi) {
3
+ pi.registerTool({
4
+ name: "shazam_symbol",
5
+ label: "Symbol Lookup",
6
+ description: `\
7
+ Call to look up a symbol by name and get its definition, kind,
8
+ signature, file location, PageRank score, callers, and callees.
9
+ Faster than grep for precise symbol lookup.
10
+
11
+ Scenario: finding where a function is defined, checking a symbol's
12
+ type signature, verifying a symbol exists before referencing it.`,
13
+ parameters: pi.typebox.Object({
14
+ name: pi.typebox.String(),
15
+ file: pi.typebox.Optional(pi.typebox.String()),
16
+ json: pi.typebox.Optional(pi.typebox.Boolean()),
17
+ }),
18
+ async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
19
+ const json = params.json ?? false;
20
+ const graph = scanProject(".");
21
+ const result = executeSymbol(graph, params.name, params.file);
22
+ return {
23
+ content: [
24
+ {
25
+ type: "text",
26
+ text: json
27
+ ? executeSymbolJson(graph, params.name, params.file)
28
+ : result,
29
+ },
30
+ ],
31
+ };
32
+ },
33
+ });
34
+ }
35
+ export function executeSymbol(graph, name, file) {
36
+ const matches = findSymbols(graph, name, file);
37
+ if (matches.length === 0) {
38
+ return `Symbol not found: ${name}${file ? ` in ${file}` : ""}`;
39
+ }
40
+ const lines = [];
41
+ for (const sym of matches) {
42
+ lines.push(`${sym.kind} ${sym.name} — ${sym.file}:${sym.line}`, ` visibility: ${sym.visibility}`, ` PageRank: ${sym.pagerank.toFixed(4)}`, ` signature: ${sym.signature}`);
43
+ const incoming = graph.incoming.get(sym.id);
44
+ const outgoing = graph.outgoing.get(sym.id);
45
+ if (incoming && incoming.length > 0) {
46
+ lines.push(` incoming refs: ${incoming.length}`);
47
+ }
48
+ if (outgoing && outgoing.length > 0) {
49
+ lines.push(` outgoing refs: ${outgoing.length}`);
50
+ }
51
+ lines.push("");
52
+ }
53
+ return lines.join("\n").trim();
54
+ }
55
+ export function executeSymbolJson(graph, name, file) {
56
+ const matches = findSymbols(graph, name, file);
57
+ return JSON.stringify({
58
+ schema_version: "1.0",
59
+ command: "symbol",
60
+ status: "ok",
61
+ result: matches.map((s) => ({
62
+ id: s.id,
63
+ name: s.name,
64
+ kind: s.kind,
65
+ file: s.file,
66
+ line: s.line,
67
+ visibility: s.visibility,
68
+ pagerank: s.pagerank,
69
+ signature: s.signature,
70
+ })),
71
+ });
72
+ }
73
+ function findSymbols(graph, name, file) {
74
+ const results = [];
75
+ for (const sym of graph.symbols.values()) {
76
+ if (sym.name === name) {
77
+ if (!file || sym.file === file) {
78
+ results.push(sym);
79
+ }
80
+ }
81
+ }
82
+ return results.sort((a, b) => a.pagerank - b.pagerank);
83
+ }
84
+ //# sourceMappingURL=symbol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symbol.js","sourceRoot":"","sources":["../../tools/symbol.ts"],"names":[],"mappings":"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"}