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.
- package/dist/core/cache.d.ts +50 -0
- package/dist/core/cache.d.ts.map +1 -0
- package/dist/core/cache.js +116 -0
- package/dist/core/cache.js.map +1 -0
- package/dist/core/encoding.d.ts +25 -0
- package/dist/core/encoding.d.ts.map +1 -0
- package/dist/core/encoding.js +109 -0
- package/dist/core/encoding.js.map +1 -0
- package/dist/core/graph.d.ts +146 -0
- package/dist/core/graph.d.ts.map +1 -0
- package/dist/core/graph.js +224 -0
- package/dist/core/graph.js.map +1 -0
- package/dist/core/pagerank.d.ts +19 -0
- package/dist/core/pagerank.d.ts.map +1 -0
- package/dist/core/pagerank.js +106 -0
- package/dist/core/pagerank.js.map +1 -0
- package/dist/core/scanner.d.ts +19 -0
- package/dist/core/scanner.d.ts.map +1 -0
- package/dist/core/scanner.js +266 -0
- package/dist/core/scanner.js.map +1 -0
- package/dist/core/treesitter-queries.d.ts +19 -0
- package/dist/core/treesitter-queries.d.ts.map +1 -0
- package/dist/core/treesitter-queries.js +222 -0
- package/dist/core/treesitter-queries.js.map +1 -0
- package/dist/core/treesitter.d.ts +67 -0
- package/dist/core/treesitter.d.ts.map +1 -0
- package/dist/core/treesitter.js +624 -0
- package/dist/core/treesitter.js.map +1 -0
- package/dist/hooks/after-write.d.ts +32 -0
- package/dist/hooks/after-write.d.ts.map +1 -0
- package/dist/hooks/after-write.js +111 -0
- package/dist/hooks/after-write.js.map +1 -0
- package/dist/hooks/before-start.d.ts +23 -0
- package/dist/hooks/before-start.d.ts.map +1 -0
- package/dist/hooks/before-start.js +43 -0
- package/dist/hooks/before-start.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +106 -0
- package/dist/index.js.map +1 -0
- package/dist/lsp/client.d.ts +77 -0
- package/dist/lsp/client.d.ts.map +1 -0
- package/dist/lsp/client.js +355 -0
- package/dist/lsp/client.js.map +1 -0
- package/dist/lsp/manager.d.ts +85 -0
- package/dist/lsp/manager.d.ts.map +1 -0
- package/dist/lsp/manager.js +362 -0
- package/dist/lsp/manager.js.map +1 -0
- package/dist/lsp/servers.d.ts +43 -0
- package/dist/lsp/servers.d.ts.map +1 -0
- package/dist/lsp/servers.js +140 -0
- package/dist/lsp/servers.js.map +1 -0
- package/dist/lsp/setup.d.ts +24 -0
- package/dist/lsp/setup.d.ts.map +1 -0
- package/dist/lsp/setup.js +140 -0
- package/dist/lsp/setup.js.map +1 -0
- package/dist/tools/call_chain.d.ts +9 -0
- package/dist/tools/call_chain.d.ts.map +1 -0
- package/dist/tools/call_chain.js +151 -0
- package/dist/tools/call_chain.js.map +1 -0
- package/dist/tools/check.d.ts +18 -0
- package/dist/tools/check.d.ts.map +1 -0
- package/dist/tools/check.js +141 -0
- package/dist/tools/check.js.map +1 -0
- package/dist/tools/codequery.d.ts +19 -0
- package/dist/tools/codequery.d.ts.map +1 -0
- package/dist/tools/codequery.js +128 -0
- package/dist/tools/codequery.js.map +1 -0
- package/dist/tools/codesearch.d.ts +8 -0
- package/dist/tools/codesearch.d.ts.map +1 -0
- package/dist/tools/codesearch.js +101 -0
- package/dist/tools/codesearch.js.map +1 -0
- package/dist/tools/file_detail.d.ts +9 -0
- package/dist/tools/file_detail.d.ts.map +1 -0
- package/dist/tools/file_detail.js +125 -0
- package/dist/tools/file_detail.js.map +1 -0
- package/dist/tools/fix.d.ts +25 -0
- package/dist/tools/fix.d.ts.map +1 -0
- package/dist/tools/fix.js +257 -0
- package/dist/tools/fix.js.map +1 -0
- package/dist/tools/hotspots.d.ts +9 -0
- package/dist/tools/hotspots.d.ts.map +1 -0
- package/dist/tools/hotspots.js +107 -0
- package/dist/tools/hotspots.js.map +1 -0
- package/dist/tools/impact.d.ts +14 -0
- package/dist/tools/impact.d.ts.map +1 -0
- package/dist/tools/impact.js +160 -0
- package/dist/tools/impact.js.map +1 -0
- package/dist/tools/orphan.d.ts +9 -0
- package/dist/tools/orphan.d.ts.map +1 -0
- package/dist/tools/orphan.js +124 -0
- package/dist/tools/orphan.js.map +1 -0
- package/dist/tools/overview.d.ts +9 -0
- package/dist/tools/overview.d.ts.map +1 -0
- package/dist/tools/overview.js +137 -0
- package/dist/tools/overview.js.map +1 -0
- package/dist/tools/ready.d.ts +18 -0
- package/dist/tools/ready.d.ts.map +1 -0
- package/dist/tools/ready.js +145 -0
- package/dist/tools/ready.js.map +1 -0
- package/dist/tools/refs.d.ts +9 -0
- package/dist/tools/refs.d.ts.map +1 -0
- package/dist/tools/refs.js +129 -0
- package/dist/tools/refs.js.map +1 -0
- package/dist/tools/routes.d.ts +8 -0
- package/dist/tools/routes.d.ts.map +1 -0
- package/dist/tools/routes.js +83 -0
- package/dist/tools/routes.js.map +1 -0
- package/dist/tools/state_map.d.ts +8 -0
- package/dist/tools/state_map.d.ts.map +1 -0
- package/dist/tools/state_map.js +95 -0
- package/dist/tools/state_map.js.map +1 -0
- package/dist/tools/symbol.d.ts +9 -0
- package/dist/tools/symbol.d.ts.map +1 -0
- package/dist/tools/symbol.js +84 -0
- package/dist/tools/symbol.js.map +1 -0
- package/dist/tools/verify.d.ts +24 -0
- package/dist/tools/verify.d.ts.map +1 -0
- package/dist/tools/verify.js +212 -0
- package/dist/tools/verify.js.map +1 -0
- 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":"AAKA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,UAAU,cAAc,CAAC,EAAgB;IAC9C,EAAE,CAAC,YAAY,CAAC;QACf,IAAI,EAAE,eAAe;QACrB,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE;;;;;;iEAMkD;QAC/D,UAAU,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;YAC7B,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE;YACzB,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAC9C,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,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YAC9D,OAAO;gBACN,OAAO,EAAE;oBACR;wBACC,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI;4BACT,CAAC,CAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC;4BACpD,CAAC,CAAC,MAAM;qBACT;iBACD;aACD,CAAC;QACH,CAAC;KACD,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAC5B,KAAgB,EAChB,IAAY,EACZ,IAAa;IAEb,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC/C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,qBAAqB,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IAChE,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CACT,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,EAAE,EACnD,iBAAiB,GAAG,CAAC,UAAU,EAAE,EACjC,eAAe,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EACxC,gBAAgB,GAAG,CAAC,SAAS,EAAE,CAC/B,CAAC;QACF,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5C,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrC,KAAK,CAAC,IAAI,CAAC,oBAAoB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QACnD,CAAC;QACD,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrC,KAAK,CAAC,IAAI,CAAC,oBAAoB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QACnD,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAChC,KAAgB,EAChB,IAAY,EACZ,IAAa;IAEb,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC/C,OAAO,IAAI,CAAC,SAAS,CAAC;QACrB,cAAc,EAAE,KAAK;QACrB,OAAO,EAAE,QAAQ;QACjB,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3B,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,SAAS,EAAE,CAAC,CAAC,SAAS;SACtB,CAAC,CAAC;KACH,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CACnB,KAAgB,EAChB,IAAY,EACZ,IAAa;IAEb,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QAC1C,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;gBAChC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACnB,CAAC;QACF,CAAC;IACF,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;AACxD,CAAC"}
|