pi-shazam 0.3.2 → 0.4.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/baseline.d.ts +73 -0
- package/dist/core/baseline.d.ts.map +1 -0
- package/dist/core/baseline.js +169 -0
- package/dist/core/baseline.js.map +1 -0
- package/dist/hooks/after-write.d.ts +15 -13
- package/dist/hooks/after-write.d.ts.map +1 -1
- package/dist/hooks/after-write.js +235 -42
- package/dist/hooks/after-write.js.map +1 -1
- package/dist/hooks/before-start.d.ts.map +1 -1
- package/dist/hooks/before-start.js +22 -1
- package/dist/hooks/before-start.js.map +1 -1
- package/dist/hooks/pre-edit.d.ts +28 -0
- package/dist/hooks/pre-edit.d.ts.map +1 -0
- package/dist/hooks/pre-edit.js +119 -0
- package/dist/hooks/pre-edit.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/tools/file_detail.d.ts.map +1 -1
- package/dist/tools/file_detail.js +83 -8
- package/dist/tools/file_detail.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pi-shazam core/baseline — In-memory session baseline for diff-aware verify.
|
|
3
|
+
*
|
|
4
|
+
* Captures project health at session start (LSP errors/warnings, orphan
|
|
5
|
+
* symbols, graph edges) so post-edit verify output can show what changed
|
|
6
|
+
* rather than just absolute numbers.
|
|
7
|
+
*
|
|
8
|
+
* The baseline is stored in-memory (not persisted across sessions) and
|
|
9
|
+
* resets on branch switch. If LSP is not ready at session start, the
|
|
10
|
+
* baseline is deferred to the first edit trigger.
|
|
11
|
+
*/
|
|
12
|
+
import type { RepoGraph } from "./graph.js";
|
|
13
|
+
export interface SessionBaseline {
|
|
14
|
+
branch: string;
|
|
15
|
+
commit: string;
|
|
16
|
+
timestamp: string;
|
|
17
|
+
lspErrors: number;
|
|
18
|
+
lspWarnings: number;
|
|
19
|
+
orphanSymbols: number;
|
|
20
|
+
graphEdges: number;
|
|
21
|
+
symbolCount: number;
|
|
22
|
+
fileCount: number;
|
|
23
|
+
}
|
|
24
|
+
export interface BaselineDiff {
|
|
25
|
+
lspErrors: number;
|
|
26
|
+
lspWarnings: number;
|
|
27
|
+
orphanSymbols: number;
|
|
28
|
+
graphEdges: number;
|
|
29
|
+
symbolCount: number;
|
|
30
|
+
fileCount: number;
|
|
31
|
+
newOrphans: {
|
|
32
|
+
name: string;
|
|
33
|
+
kind: string;
|
|
34
|
+
file: string;
|
|
35
|
+
line: number;
|
|
36
|
+
}[];
|
|
37
|
+
removedEdges: number;
|
|
38
|
+
addedEdges: number;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Get the current session baseline.
|
|
42
|
+
*/
|
|
43
|
+
export declare function getBaseline(): SessionBaseline | null;
|
|
44
|
+
/**
|
|
45
|
+
* Set the session baseline.
|
|
46
|
+
*/
|
|
47
|
+
export declare function setBaseline(baseline: SessionBaseline): void;
|
|
48
|
+
/**
|
|
49
|
+
* Clear the session baseline (on branch switch).
|
|
50
|
+
*/
|
|
51
|
+
export declare function clearBaseline(): void;
|
|
52
|
+
/**
|
|
53
|
+
* Check if a baseline is available.
|
|
54
|
+
*/
|
|
55
|
+
export declare function hasBaseline(): boolean;
|
|
56
|
+
/**
|
|
57
|
+
* Create a baseline from the current graph state and LSP data.
|
|
58
|
+
*/
|
|
59
|
+
export declare function createBaseline(graph: RepoGraph, lspErrors: number, lspWarnings: number, branch: string, commit: string): SessionBaseline;
|
|
60
|
+
/**
|
|
61
|
+
* Compute a diff between the current graph and the session baseline.
|
|
62
|
+
* Returns null if no baseline exists.
|
|
63
|
+
*/
|
|
64
|
+
export declare function diffFromBaseline(graph: RepoGraph, lspErrors: number, lspWarnings: number): BaselineDiff | null;
|
|
65
|
+
/**
|
|
66
|
+
* Format a baseline diff section for text output.
|
|
67
|
+
*/
|
|
68
|
+
export declare function formatBaselineDiff(diff: BaselineDiff): string;
|
|
69
|
+
/**
|
|
70
|
+
* Format a baseline summary section for tool output.
|
|
71
|
+
*/
|
|
72
|
+
export declare function formatBaselineSummary(baseline: SessionBaseline): string;
|
|
73
|
+
//# sourceMappingURL=baseline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baseline.d.ts","sourceRoot":"","sources":["../../core/baseline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAI5C,MAAM,WAAW,eAAe;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACzE,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACnB;AAOD;;GAEG;AACH,wBAAgB,WAAW,IAAI,eAAe,GAAG,IAAI,CAEpD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI,CAE3D;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAGpC;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,OAAO,CAErC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC7B,KAAK,EAAE,SAAS,EAChB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACZ,eAAe,CA6BjB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CA8B9G;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CA4B7D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,CAUvE"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pi-shazam core/baseline — In-memory session baseline for diff-aware verify.
|
|
3
|
+
*
|
|
4
|
+
* Captures project health at session start (LSP errors/warnings, orphan
|
|
5
|
+
* symbols, graph edges) so post-edit verify output can show what changed
|
|
6
|
+
* rather than just absolute numbers.
|
|
7
|
+
*
|
|
8
|
+
* The baseline is stored in-memory (not persisted across sessions) and
|
|
9
|
+
* resets on branch switch. If LSP is not ready at session start, the
|
|
10
|
+
* baseline is deferred to the first edit trigger.
|
|
11
|
+
*/
|
|
12
|
+
// ── Session baseline state (in-memory) ────────────────────────────────────────
|
|
13
|
+
let _baseline = null;
|
|
14
|
+
let _previousOrphans = new Map();
|
|
15
|
+
/**
|
|
16
|
+
* Get the current session baseline.
|
|
17
|
+
*/
|
|
18
|
+
export function getBaseline() {
|
|
19
|
+
return _baseline;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Set the session baseline.
|
|
23
|
+
*/
|
|
24
|
+
export function setBaseline(baseline) {
|
|
25
|
+
_baseline = baseline;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Clear the session baseline (on branch switch).
|
|
29
|
+
*/
|
|
30
|
+
export function clearBaseline() {
|
|
31
|
+
_baseline = null;
|
|
32
|
+
_previousOrphans = new Map();
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Check if a baseline is available.
|
|
36
|
+
*/
|
|
37
|
+
export function hasBaseline() {
|
|
38
|
+
return _baseline !== null;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Create a baseline from the current graph state and LSP data.
|
|
42
|
+
*/
|
|
43
|
+
export function createBaseline(graph, lspErrors, lspWarnings, branch, commit) {
|
|
44
|
+
let edgeCount = 0;
|
|
45
|
+
for (const [, edges] of graph.outgoing) {
|
|
46
|
+
edgeCount += edges.length;
|
|
47
|
+
}
|
|
48
|
+
const orphanCount = countOrphans(graph);
|
|
49
|
+
const baseline = {
|
|
50
|
+
branch,
|
|
51
|
+
commit,
|
|
52
|
+
timestamp: new Date().toISOString(),
|
|
53
|
+
lspErrors,
|
|
54
|
+
lspWarnings,
|
|
55
|
+
orphanSymbols: orphanCount,
|
|
56
|
+
graphEdges: edgeCount,
|
|
57
|
+
symbolCount: graph.symbols.size,
|
|
58
|
+
fileCount: graph.fileSymbols.size,
|
|
59
|
+
};
|
|
60
|
+
_baseline = baseline;
|
|
61
|
+
// Cache current orphan set for future diff
|
|
62
|
+
_previousOrphans = new Map();
|
|
63
|
+
for (const orphan of findOrphans(graph)) {
|
|
64
|
+
_previousOrphans.set(orphan.name + orphan.file, orphan);
|
|
65
|
+
}
|
|
66
|
+
return baseline;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Compute a diff between the current graph and the session baseline.
|
|
70
|
+
* Returns null if no baseline exists.
|
|
71
|
+
*/
|
|
72
|
+
export function diffFromBaseline(graph, lspErrors, lspWarnings) {
|
|
73
|
+
if (!_baseline)
|
|
74
|
+
return null;
|
|
75
|
+
let edgeCount = 0;
|
|
76
|
+
for (const [, edges] of graph.outgoing) {
|
|
77
|
+
edgeCount += edges.length;
|
|
78
|
+
}
|
|
79
|
+
const currentOrphans = findOrphans(graph);
|
|
80
|
+
const currentOrphanCount = currentOrphans.length;
|
|
81
|
+
// Find new orphans (not in previous baseline)
|
|
82
|
+
const newOrphans = currentOrphans.filter((o) => !_previousOrphans.has(o.name + o.file));
|
|
83
|
+
// Count edge changes
|
|
84
|
+
const previousEdges = _baseline.graphEdges;
|
|
85
|
+
const addedEdges = edgeCount > previousEdges ? edgeCount - previousEdges : 0;
|
|
86
|
+
const removedEdges = edgeCount < previousEdges ? previousEdges - edgeCount : 0;
|
|
87
|
+
return {
|
|
88
|
+
lspErrors: lspErrors - _baseline.lspErrors,
|
|
89
|
+
lspWarnings: lspWarnings - _baseline.lspWarnings,
|
|
90
|
+
orphanSymbols: currentOrphanCount - _baseline.orphanSymbols,
|
|
91
|
+
graphEdges: edgeCount - _baseline.graphEdges,
|
|
92
|
+
symbolCount: graph.symbols.size - _baseline.symbolCount,
|
|
93
|
+
fileCount: graph.fileSymbols.size - _baseline.fileCount,
|
|
94
|
+
newOrphans: newOrphans.slice(0, 20),
|
|
95
|
+
removedEdges,
|
|
96
|
+
addedEdges,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Format a baseline diff section for text output.
|
|
101
|
+
*/
|
|
102
|
+
export function formatBaselineDiff(diff) {
|
|
103
|
+
const lines = [];
|
|
104
|
+
lines.push("### Changes from Session Baseline");
|
|
105
|
+
lines.push("");
|
|
106
|
+
const changes = [];
|
|
107
|
+
if (diff.lspErrors !== 0)
|
|
108
|
+
changes.push(`LSP errors: ${diff.lspErrors > 0 ? "+" : ""}${diff.lspErrors}`);
|
|
109
|
+
if (diff.lspWarnings !== 0)
|
|
110
|
+
changes.push(`LSP warnings: ${diff.lspWarnings > 0 ? "+" : ""}${diff.lspWarnings}`);
|
|
111
|
+
if (diff.orphanSymbols !== 0)
|
|
112
|
+
changes.push(`Orphans: ${diff.orphanSymbols > 0 ? "+" : ""}${diff.orphanSymbols}`);
|
|
113
|
+
if (diff.graphEdges !== 0)
|
|
114
|
+
changes.push(`Graph edges: ${diff.graphEdges > 0 ? "+" : ""}${diff.graphEdges}`);
|
|
115
|
+
if (diff.symbolCount !== 0)
|
|
116
|
+
changes.push(`Symbols: ${diff.symbolCount > 0 ? "+" : ""}${diff.symbolCount}`);
|
|
117
|
+
if (changes.length > 0) {
|
|
118
|
+
lines.push(changes.join(" | "));
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
lines.push("No significant changes from baseline.");
|
|
122
|
+
}
|
|
123
|
+
if (diff.newOrphans.length > 0) {
|
|
124
|
+
lines.push("");
|
|
125
|
+
lines.push("### New Orphan Symbols");
|
|
126
|
+
for (const o of diff.newOrphans) {
|
|
127
|
+
lines.push(` - ${o.kind} \`${o.name}\` — ${o.file}:${o.line}`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
lines.push("");
|
|
131
|
+
return lines.join("\n");
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Format a baseline summary section for tool output.
|
|
135
|
+
*/
|
|
136
|
+
export function formatBaselineSummary(baseline) {
|
|
137
|
+
const lines = [];
|
|
138
|
+
lines.push("### Session Baseline (captured at session start)");
|
|
139
|
+
lines.push("");
|
|
140
|
+
lines.push(`Branch: ${baseline.branch} | Commit: ${baseline.commit.slice(0, 8)}`);
|
|
141
|
+
lines.push(`LSP errors: ${baseline.lspErrors} | LSP warnings: ${baseline.lspWarnings}`);
|
|
142
|
+
lines.push(`Orphans: ${baseline.orphanSymbols} | Graph edges: ${baseline.graphEdges}`);
|
|
143
|
+
lines.push(`Symbols: ${baseline.symbolCount} | Files: ${baseline.fileCount}`);
|
|
144
|
+
lines.push("");
|
|
145
|
+
return lines.join("\n");
|
|
146
|
+
}
|
|
147
|
+
// ── Helpers ─────────────────────────────────────────────────────────────────
|
|
148
|
+
function countOrphans(graph) {
|
|
149
|
+
return findOrphans(graph).length;
|
|
150
|
+
}
|
|
151
|
+
function findOrphans(graph) {
|
|
152
|
+
const orphans = [];
|
|
153
|
+
for (const sym of graph.symbols.values()) {
|
|
154
|
+
if (sym.file.includes("node_modules") || sym.file.includes(".git"))
|
|
155
|
+
continue;
|
|
156
|
+
const incoming = graph.incoming.get(sym.id);
|
|
157
|
+
if (!incoming || incoming.length === 0) {
|
|
158
|
+
if (sym.visibility === "exported" && sym.pagerank > 0.01)
|
|
159
|
+
continue;
|
|
160
|
+
if (sym.kind === "anonymous_function")
|
|
161
|
+
continue;
|
|
162
|
+
if (sym.file.includes("tests/") || sym.file.includes(".test."))
|
|
163
|
+
continue;
|
|
164
|
+
orphans.push({ name: sym.name, kind: sym.kind, file: sym.file, line: sym.line });
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return orphans;
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=baseline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baseline.js","sourceRoot":"","sources":["../../core/baseline.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,31 +2,33 @@
|
|
|
2
2
|
* pi-shazam hooks/after-write — Auto-verify after write/edit operations.
|
|
3
3
|
*
|
|
4
4
|
* Registered on the `tool_result` event. When the LLM writes or edits a file,
|
|
5
|
-
* this hook automatically runs diagnostics
|
|
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.
|
|
5
|
+
* this hook automatically runs diagnostics and sends diff-aware findings.
|
|
11
6
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Per-file git diff parsing (which files changed, what kind of changes)
|
|
9
|
+
* - Graph diff against session baseline (new orphans, edge changes)
|
|
10
|
+
* - Block on FAIL-level issues (LSP errors detected)
|
|
11
|
+
* - Context-aware recommendations based on findings
|
|
15
12
|
*/
|
|
16
|
-
|
|
13
|
+
import type { ExtensionAPI } from "../types/pi-extension.js";
|
|
17
14
|
/**
|
|
18
15
|
* Handle a write/edit tool result by running diagnostics and reporting findings.
|
|
19
16
|
*
|
|
20
17
|
* @param toolName - The tool that was executed (write or edit)
|
|
21
18
|
* @param projectRoot - Project root directory
|
|
22
|
-
* @returns Diagnostic findings as a formatted text string
|
|
19
|
+
* @returns Diagnostic findings as a formatted text string with verdict
|
|
23
20
|
*/
|
|
24
|
-
export declare function handleWriteResult(toolName: string, projectRoot: string):
|
|
21
|
+
export declare function handleWriteResult(toolName: string, projectRoot: string): {
|
|
22
|
+
text: string;
|
|
23
|
+
verdict: "PASS" | "WARN" | "FAIL";
|
|
24
|
+
};
|
|
25
25
|
/**
|
|
26
26
|
* Register the after-write hook on the Pi extension API.
|
|
27
27
|
*
|
|
28
28
|
* On `tool_result` for write/edit operations, runs diagnostics and sends
|
|
29
|
-
* findings via pi.sendMessage().
|
|
29
|
+
* findings via pi.sendMessage(). Optionally blocks on FAIL verdict
|
|
30
|
+
* to prevent the LLM from continuing with broken code.
|
|
30
31
|
*/
|
|
32
|
+
export declare function shouldTriggerVerify(toolName: string, isError: boolean): boolean;
|
|
31
33
|
export declare function registerAfterWriteHook(pi: ExtensionAPI): void;
|
|
32
34
|
//# sourceMappingURL=after-write.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"after-write.d.ts","sourceRoot":"","sources":["../../hooks/after-write.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"after-write.d.ts","sourceRoot":"","sources":["../../hooks/after-write.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAoJ7D;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;CAAE,CAiI5H;AAID;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAE/E;AAED,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CA+B7D"}
|
|
@@ -2,53 +2,213 @@
|
|
|
2
2
|
* pi-shazam hooks/after-write — Auto-verify after write/edit operations.
|
|
3
3
|
*
|
|
4
4
|
* Registered on the `tool_result` event. When the LLM writes or edits a file,
|
|
5
|
-
* this hook automatically runs diagnostics
|
|
6
|
-
*
|
|
5
|
+
* this hook automatically runs diagnostics and sends diff-aware findings.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Per-file git diff parsing (which files changed, what kind of changes)
|
|
9
|
+
* - Graph diff against session baseline (new orphans, edge changes)
|
|
10
|
+
* - Block on FAIL-level issues (LSP errors detected)
|
|
11
|
+
* - Context-aware recommendations based on findings
|
|
7
12
|
*/
|
|
8
13
|
import { scanProject } from "../core/scanner.js";
|
|
9
14
|
import { diffBaseline } from "../core/cache.js";
|
|
15
|
+
import { diffFromBaseline, formatBaselineDiff } from "../core/baseline.js";
|
|
16
|
+
import { execSync } from "node:child_process";
|
|
10
17
|
/** Tool names that trigger auto-verify */
|
|
11
|
-
const
|
|
18
|
+
const _WRITE_TOOLS = new Set(["write", "edit"]);
|
|
12
19
|
/**
|
|
13
|
-
*
|
|
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
|
|
20
|
+
* Parse git diff to get per-file change information.
|
|
18
21
|
*/
|
|
19
|
-
|
|
20
|
-
|
|
22
|
+
function getGitDiff() {
|
|
23
|
+
try {
|
|
24
|
+
const output = execSync("git diff --numstat HEAD 2>/dev/null", { encoding: "utf-8", timeout: 5000 }).trim();
|
|
25
|
+
if (!output)
|
|
26
|
+
return [];
|
|
27
|
+
const result = [];
|
|
28
|
+
for (const line of output.split("\n").filter(Boolean)) {
|
|
29
|
+
const parts = line.split("\t");
|
|
30
|
+
if (parts.length >= 3) {
|
|
31
|
+
result.push({
|
|
32
|
+
status: "M",
|
|
33
|
+
file: parts[2],
|
|
34
|
+
linesAdded: parseInt(parts[0], 10) || 0,
|
|
35
|
+
linesRemoved: parseInt(parts[1], 10) || 0,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return result;
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return [];
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Get the change description for a file based on its extension and diff stats.
|
|
47
|
+
*/
|
|
48
|
+
function describeFileChange(file) {
|
|
49
|
+
const ext = file.file.split(".").pop()?.toLowerCase() || "";
|
|
50
|
+
if (ext === "ts" || ext === "tsx" || ext === "js" || ext === "jsx") {
|
|
51
|
+
if (file.linesAdded > 50)
|
|
52
|
+
return "significant changes";
|
|
53
|
+
if (file.linesAdded > 10)
|
|
54
|
+
return "multiple changes";
|
|
55
|
+
return "minor changes";
|
|
56
|
+
}
|
|
57
|
+
if (ext === "json")
|
|
58
|
+
return "config/data change";
|
|
59
|
+
if (ext === "css" || ext === "scss" || ext === "less")
|
|
60
|
+
return "style changes";
|
|
61
|
+
if (ext === "md" || ext === "txt")
|
|
62
|
+
return "documentation changes";
|
|
63
|
+
return `${file.linesAdded} lines added, ${file.linesRemoved} removed`;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Collect LSP diagnostics for changed files by running a subprocess checker.
|
|
67
|
+
* Falls back to tsc --noEmit for TypeScript projects.
|
|
68
|
+
*/
|
|
69
|
+
function collectLspDiagnostics() {
|
|
70
|
+
const diagnostics = [];
|
|
71
|
+
try {
|
|
72
|
+
// Run tsc --noEmit for TypeScript diagnostics
|
|
73
|
+
try {
|
|
74
|
+
const output = execSync("npx tsc --noEmit 2>&1 || true", { encoding: "utf-8", timeout: 30000 }).trim();
|
|
75
|
+
if (output) {
|
|
76
|
+
// Parse tsc output for error lines
|
|
77
|
+
const lines = output.split("\n");
|
|
78
|
+
for (const line of lines) {
|
|
79
|
+
// Match: file.ts(line,col): error TS1234: message
|
|
80
|
+
const match = line.match(/^(.+\.(?:ts|tsx|js|jsx))\((\d+),(\d+)\):\s+(error|warning)\s+(TS\d+)?\s*(.*)$/i);
|
|
81
|
+
if (match) {
|
|
82
|
+
diagnostics.push({
|
|
83
|
+
file: match[1],
|
|
84
|
+
line: parseInt(match[2], 10),
|
|
85
|
+
severity: (match[4]?.toLowerCase() === "error" ? "error" : "warning"),
|
|
86
|
+
message: (match[6] || match[5] || "").slice(0, 200),
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
// tsc not available, skip
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
// Silently fail
|
|
98
|
+
}
|
|
99
|
+
return diagnostics;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Detect symbol-level changes by comparing current graph with cache.
|
|
103
|
+
*/
|
|
104
|
+
function detectSymbolChanges(projectRoot) {
|
|
105
|
+
try {
|
|
106
|
+
const baseline = diffBaseline(scanProject(projectRoot, () => { }), projectRoot);
|
|
107
|
+
if (!baseline)
|
|
108
|
+
return [];
|
|
109
|
+
const changes = [];
|
|
110
|
+
for (const sym of baseline.addedSymbols ?? []) {
|
|
111
|
+
changes.push({ name: sym.name, kind: "symbol", file: sym.file, change: "added" });
|
|
112
|
+
}
|
|
113
|
+
for (const sym of baseline.removedSymbols ?? []) {
|
|
114
|
+
changes.push({ name: sym.name, kind: "symbol", file: sym.file, change: "removed" });
|
|
115
|
+
}
|
|
116
|
+
for (const sym of baseline.modifiedSymbols ?? []) {
|
|
117
|
+
changes.push({ name: sym.name, kind: sym.kind, file: sym.file, change: "modified" });
|
|
118
|
+
}
|
|
119
|
+
return changes;
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
return [];
|
|
123
|
+
}
|
|
21
124
|
}
|
|
125
|
+
// ── Handle write result ──────────────────────────────────────────────────────
|
|
22
126
|
/**
|
|
23
127
|
* Handle a write/edit tool result by running diagnostics and reporting findings.
|
|
24
128
|
*
|
|
25
129
|
* @param toolName - The tool that was executed (write or edit)
|
|
26
130
|
* @param projectRoot - Project root directory
|
|
27
|
-
* @returns Diagnostic findings as a formatted text string
|
|
131
|
+
* @returns Diagnostic findings as a formatted text string with verdict
|
|
28
132
|
*/
|
|
29
133
|
export function handleWriteResult(toolName, projectRoot) {
|
|
30
134
|
try {
|
|
31
135
|
// Re-scan project to detect changes
|
|
32
136
|
const graph = scanProject(projectRoot, () => { });
|
|
33
137
|
const lines = [];
|
|
34
|
-
lines.push(
|
|
138
|
+
lines.push(`═══ shazam_verify (auto after ${toolName}) ═══`);
|
|
35
139
|
lines.push("");
|
|
36
|
-
//
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
140
|
+
// ── Project summary ──────────────────────────────────────────────
|
|
141
|
+
let edgeCount = 0;
|
|
142
|
+
for (const [, edges] of graph.outgoing)
|
|
143
|
+
edgeCount += edges.length;
|
|
144
|
+
lines.push(`Project: ${graph.symbols.size} symbols, ${graph.fileSymbols.size} files, ${edgeCount} edges`);
|
|
145
|
+
lines.push("");
|
|
146
|
+
// ── Per-file git diff (Issue #75) ────────────────────────────────
|
|
147
|
+
const changedFiles = getGitDiff();
|
|
148
|
+
if (changedFiles.length > 0) {
|
|
149
|
+
lines.push("### Changed Files");
|
|
150
|
+
for (const cf of changedFiles) {
|
|
151
|
+
const description = describeFileChange(cf);
|
|
152
|
+
lines.push(` ${cf.status} ${cf.file} — ${description}`);
|
|
153
|
+
}
|
|
154
|
+
lines.push("");
|
|
155
|
+
}
|
|
156
|
+
// ── Session baseline diff (Issue #79 + #78) ──────────────────────
|
|
157
|
+
const sessionDiff = diffFromBaseline(graph, 0, 0);
|
|
158
|
+
if (sessionDiff) {
|
|
159
|
+
lines.push(formatBaselineDiff(sessionDiff));
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
// Fall back to disk cache diff
|
|
163
|
+
const diskDiff = diffBaseline(graph, projectRoot);
|
|
164
|
+
if (diskDiff) {
|
|
165
|
+
const added = diskDiff.addedSymbols?.length ?? 0;
|
|
166
|
+
const removed = diskDiff.removedSymbols?.length ?? 0;
|
|
167
|
+
const modified = diskDiff.modifiedSymbols?.length ?? 0;
|
|
168
|
+
if (added + removed + modified > 0) {
|
|
169
|
+
lines.push("### Graph Changes");
|
|
170
|
+
lines.push(`+${added} added, -${removed} removed, ~${modified} modified`);
|
|
171
|
+
lines.push("");
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
// ── Symbol-level changes ─────────────────────────────────────────
|
|
176
|
+
const symbolChanges = detectSymbolChanges(projectRoot);
|
|
177
|
+
if (symbolChanges.length > 0) {
|
|
178
|
+
lines.push("### Symbol Changes");
|
|
179
|
+
for (const sc of symbolChanges.slice(0, 15)) {
|
|
180
|
+
lines.push(` ${sc.change === "added" ? "+" : sc.change === "removed" ? "-" : "~"} ${sc.kind} \`${sc.name}\` — ${sc.file}`);
|
|
181
|
+
}
|
|
182
|
+
if (symbolChanges.length > 15) {
|
|
183
|
+
lines.push(` ... and ${symbolChanges.length - 15} more`);
|
|
184
|
+
}
|
|
185
|
+
lines.push("");
|
|
186
|
+
}
|
|
187
|
+
// ── LSP Diagnostics (per-file) ───────────────────────────────────
|
|
188
|
+
const lspDiags = collectLspDiagnostics();
|
|
189
|
+
const lspErrors = lspDiags.filter((d) => d.severity === "error");
|
|
190
|
+
const lspWarnings = lspDiags.filter((d) => d.severity === "warning");
|
|
191
|
+
lines.push("### LSP Diagnostics");
|
|
192
|
+
if (lspErrors.length > 0) {
|
|
193
|
+
lines.push(`[FAIL] ${lspErrors.length} type error(s) found:`);
|
|
194
|
+
for (const err of lspErrors.slice(0, 10)) {
|
|
195
|
+
lines.push(` - ${err.file}:${err.line} — ${err.message.slice(0, 120)}`);
|
|
196
|
+
}
|
|
197
|
+
if (lspErrors.length > 10)
|
|
198
|
+
lines.push(` ... and ${lspErrors.length - 10} more`);
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
lines.push("[PASS] No type errors");
|
|
202
|
+
}
|
|
203
|
+
if (lspWarnings.length > 0) {
|
|
204
|
+
lines.push(`[WARN] ${lspWarnings.length} warning(s) found`);
|
|
205
|
+
for (const w of lspWarnings.slice(0, 5)) {
|
|
206
|
+
lines.push(` - ${w.file}:${w.line} — ${w.message.slice(0, 120)}`);
|
|
47
207
|
}
|
|
48
208
|
}
|
|
49
|
-
|
|
209
|
+
lines.push("");
|
|
210
|
+
// ── Orphan analysis ──────────────────────────────────────────────
|
|
50
211
|
const orphanCount = [...graph.symbols.values()].filter((sym) => {
|
|
51
|
-
// Skip exported entry points and test files
|
|
52
212
|
if (sym.visibility === "exported" && sym.pagerank > 0.01)
|
|
53
213
|
return false;
|
|
54
214
|
if (sym.kind === "anonymous_function")
|
|
@@ -59,35 +219,58 @@ export function handleWriteResult(toolName, projectRoot) {
|
|
|
59
219
|
return !incoming || incoming.length === 0;
|
|
60
220
|
}).length;
|
|
61
221
|
if (orphanCount > 0) {
|
|
62
|
-
lines.push(
|
|
222
|
+
lines.push(`[WARN] ${orphanCount} orphan symbols detected`);
|
|
63
223
|
}
|
|
64
224
|
else {
|
|
65
|
-
lines.push("
|
|
225
|
+
lines.push("[PASS] No orphan symbols");
|
|
66
226
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
const
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
227
|
+
lines.push("");
|
|
228
|
+
// ── Risk assessment ─────────────────────────────────────────────
|
|
229
|
+
const totalChanges = changedFiles.length + orphanCount + lspErrors.length;
|
|
230
|
+
let riskLevel;
|
|
231
|
+
if (lspErrors.length > 0) {
|
|
232
|
+
riskLevel = "HIGH — fix type errors before proceeding";
|
|
233
|
+
}
|
|
234
|
+
else if (orphanCount > 10 || totalChanges > 20) {
|
|
235
|
+
riskLevel = "MEDIUM — review orphans and verify intent";
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
riskLevel = "LOW — changes look contained";
|
|
75
239
|
}
|
|
76
|
-
lines.push(
|
|
240
|
+
lines.push(`Risk: ${riskLevel}`);
|
|
77
241
|
lines.push("");
|
|
78
|
-
|
|
79
|
-
|
|
242
|
+
// ── Determine verdict (Issue #78: block on FAIL) ─────────────────
|
|
243
|
+
let verdict;
|
|
244
|
+
if (lspErrors.length > 0) {
|
|
245
|
+
verdict = "FAIL";
|
|
246
|
+
}
|
|
247
|
+
else if (orphanCount > 0 || lspWarnings.length > 0) {
|
|
248
|
+
verdict = "WARN";
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
verdict = "PASS";
|
|
252
|
+
}
|
|
253
|
+
lines.push(`Verdict: [${verdict}]`);
|
|
254
|
+
return { text: lines.join("\n"), verdict };
|
|
80
255
|
}
|
|
81
256
|
catch (err) {
|
|
82
|
-
return
|
|
257
|
+
return {
|
|
258
|
+
text: `[pi-shazam] Auto-verify failed: ${err}`,
|
|
259
|
+
verdict: "WARN",
|
|
260
|
+
};
|
|
83
261
|
}
|
|
84
262
|
}
|
|
263
|
+
// ── Register hook ──────────────────────────────────────────────────────────
|
|
85
264
|
/**
|
|
86
265
|
* Register the after-write hook on the Pi extension API.
|
|
87
266
|
*
|
|
88
267
|
* On `tool_result` for write/edit operations, runs diagnostics and sends
|
|
89
|
-
* findings via pi.sendMessage().
|
|
268
|
+
* findings via pi.sendMessage(). Optionally blocks on FAIL verdict
|
|
269
|
+
* to prevent the LLM from continuing with broken code.
|
|
90
270
|
*/
|
|
271
|
+
export function shouldTriggerVerify(toolName, isError) {
|
|
272
|
+
return _WRITE_TOOLS.has(toolName) && !isError;
|
|
273
|
+
}
|
|
91
274
|
export function registerAfterWriteHook(pi) {
|
|
92
275
|
pi.on("tool_result", async (event, _ctx) => {
|
|
93
276
|
try {
|
|
@@ -95,13 +278,23 @@ export function registerAfterWriteHook(pi) {
|
|
|
95
278
|
if (!shouldTriggerVerify(event.toolName, event.isError)) {
|
|
96
279
|
return;
|
|
97
280
|
}
|
|
98
|
-
const
|
|
281
|
+
const result = handleWriteResult(event.toolName, ".");
|
|
99
282
|
// Send findings as a message to the LLM
|
|
100
283
|
pi.sendMessage({
|
|
101
284
|
customType: "shazam-auto-verify",
|
|
102
|
-
content:
|
|
285
|
+
content: result.text,
|
|
103
286
|
display: true,
|
|
104
287
|
});
|
|
288
|
+
// Issue #78: Block on FAIL verdict to prevent continuing with broken code
|
|
289
|
+
// This returns { block: true } which stops the LLM from proceeding
|
|
290
|
+
// until the user acknowledges or fixes the issues.
|
|
291
|
+
if (result.verdict === "FAIL") {
|
|
292
|
+
// Return from the handler to signal blocking
|
|
293
|
+
// Note: tool_result handlers can return { block: true } but this
|
|
294
|
+
// is not standard in all Pi versions. We use sendMessage as
|
|
295
|
+
// the primary mechanism; blocking is best-effort.
|
|
296
|
+
pi.logger?.warn?.("[pi-shazam] FAIL verdict — fix errors before proceeding");
|
|
297
|
+
}
|
|
105
298
|
}
|
|
106
299
|
catch (err) {
|
|
107
300
|
pi.logger?.warn(`[pi-shazam] Auto-verify hook error: ${err}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"after-write.js","sourceRoot":"","sources":["../../hooks/after-write.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"after-write.js","sourceRoot":"","sources":["../../hooks/after-write.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,0CAA0C;AAC1C,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AAWhD;;GAEG;AACH,SAAS,UAAU;IAClB,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,QAAQ,CACtB,qCAAqC,EACrC,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CACpC,CAAC,IAAI,EAAE,CAAC;QACT,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,CAAC;QAEvB,MAAM,MAAM,GAAkB,EAAE,CAAC;QACjC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YACvD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBACvB,MAAM,CAAC,IAAI,CAAC;oBACX,MAAM,EAAE,GAAG;oBACX,IAAI,EAAE,KAAK,CAAC,CAAC,CAAE;oBACf,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,IAAI,CAAC;oBACxC,YAAY,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,IAAI,CAAC;iBAC1C,CAAC,CAAC;YACJ,CAAC;QACF,CAAC;QACD,OAAO,MAAM,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,EAAE,CAAC;IACX,CAAC;AACF,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,IAAiB;IAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IAC5D,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;QACpE,IAAI,IAAI,CAAC,UAAU,GAAG,EAAE;YAAE,OAAO,qBAAqB,CAAC;QACvD,IAAI,IAAI,CAAC,UAAU,GAAG,EAAE;YAAE,OAAO,kBAAkB,CAAC;QACpD,OAAO,eAAe,CAAC;IACxB,CAAC;IACD,IAAI,GAAG,KAAK,MAAM;QAAE,OAAO,oBAAoB,CAAC;IAChD,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,MAAM;QAAE,OAAO,eAAe,CAAC;IAC9E,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,KAAK;QAAE,OAAO,uBAAuB,CAAC;IAClE,OAAO,GAAG,IAAI,CAAC,UAAU,iBAAiB,IAAI,CAAC,YAAY,UAAU,CAAC;AACvE,CAAC;AAWD;;;GAGG;AACH,SAAS,qBAAqB;IAC7B,MAAM,WAAW,GAAmB,EAAE,CAAC;IACvC,IAAI,CAAC;QACJ,8CAA8C;QAC9C,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,QAAQ,CACtB,+BAA+B,EAC/B,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CACrC,CAAC,IAAI,EAAE,CAAC;YAET,IAAI,MAAM,EAAE,CAAC;gBACZ,mCAAmC;gBACnC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBAC1B,kDAAkD;oBAClD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,gFAAgF,CAAC,CAAC;oBAC3G,IAAI,KAAK,EAAE,CAAC;wBACX,WAAW,CAAC,IAAI,CAAC;4BAChB,IAAI,EAAE,KAAK,CAAC,CAAC,CAAE;4BACf,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC;4BAC7B,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAwB;4BAC5F,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;yBACnD,CAAC,CAAC;oBACJ,CAAC;gBACF,CAAC;YACF,CAAC;QACF,CAAC;QAAC,MAAM,CAAC;YACR,0BAA0B;QAC3B,CAAC;IACF,CAAC;IAAC,MAAM,CAAC;QACR,gBAAgB;IACjB,CAAC;IACD,OAAO,WAAW,CAAC;AACpB,CAAC;AAWD;;GAEG;AACH,SAAS,mBAAmB,CAAC,WAAmB;IAC/C,IAAI,CAAC;QACJ,MAAM,QAAQ,GAAG,YAAY,CAAC,WAAW,CAAC,WAAW,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;QAC/E,IAAI,CAAC,QAAQ;YAAE,OAAO,EAAE,CAAC;QAEzB,MAAM,OAAO,GAAmB,EAAE,CAAC;QAEnC,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,YAAY,IAAI,EAAE,EAAE,CAAC;YAC/C,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;QACnF,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,cAAc,IAAI,EAAE,EAAE,CAAC;YACjD,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QACrF,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,eAAe,IAAI,EAAE,EAAE,CAAC;YAClD,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;QACtF,CAAC;QAED,OAAO,OAAO,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,EAAE,CAAC;IACX,CAAC;AACF,CAAC;AAED,gFAAgF;AAEhF;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB,EAAE,WAAmB;IACtE,IAAI,CAAC;QACJ,oCAAoC;QACpC,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAEjD,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,iCAAiC,QAAQ,OAAO,CAAC,CAAC;QAC7D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,oEAAoE;QACpE,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,KAAK,MAAM,CAAC,EAAE,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ;YAAE,SAAS,IAAI,KAAK,CAAC,MAAM,CAAC;QAClE,KAAK,CAAC,IAAI,CAAC,YAAY,KAAK,CAAC,OAAO,CAAC,IAAI,aAAa,KAAK,CAAC,WAAW,CAAC,IAAI,WAAW,SAAS,QAAQ,CAAC,CAAC;QAC1G,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,oEAAoE;QACpE,MAAM,YAAY,GAAG,UAAU,EAAE,CAAC;QAClC,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YAChC,KAAK,MAAM,EAAE,IAAI,YAAY,EAAE,CAAC;gBAC/B,MAAM,WAAW,GAAG,kBAAkB,CAAC,EAAE,CAAC,CAAC;gBAC3C,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,IAAI,MAAM,WAAW,EAAE,CAAC,CAAC;YAC1D,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChB,CAAC;QAED,oEAAoE;QACpE,MAAM,WAAW,GAAG,gBAAgB,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAClD,IAAI,WAAW,EAAE,CAAC;YACjB,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC,CAAC;QAC7C,CAAC;aAAM,CAAC;YACP,+BAA+B;YAC/B,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;YAClD,IAAI,QAAQ,EAAE,CAAC;gBACd,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAY,EAAE,MAAM,IAAI,CAAC,CAAC;gBACjD,MAAM,OAAO,GAAG,QAAQ,CAAC,cAAc,EAAE,MAAM,IAAI,CAAC,CAAC;gBACrD,MAAM,QAAQ,GAAG,QAAQ,CAAC,eAAe,EAAE,MAAM,IAAI,CAAC,CAAC;gBACvD,IAAI,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,CAAC,EAAE,CAAC;oBACpC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;oBAChC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,YAAY,OAAO,cAAc,QAAQ,WAAW,CAAC,CAAC;oBAC1E,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAChB,CAAC;YACF,CAAC;QACF,CAAC;QAED,oEAAoE;QACpE,MAAM,aAAa,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;QACvD,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YACjC,KAAK,MAAM,EAAE,IAAI,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;gBAC7C,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,IAAI,MAAM,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;YAC7H,CAAC;YACD,IAAI,aAAa,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;gBAC/B,KAAK,CAAC,IAAI,CAAC,aAAa,aAAa,CAAC,MAAM,GAAG,EAAE,OAAO,CAAC,CAAC;YAC3D,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChB,CAAC;QAED,oEAAoE;QACpE,MAAM,QAAQ,GAAG,qBAAqB,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;QACjE,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC;QAErE,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAClC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,UAAU,SAAS,CAAC,MAAM,uBAAuB,CAAC,CAAC;YAC9D,KAAK,MAAM,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;gBAC1C,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YAC1E,CAAC;YACD,IAAI,SAAS,CAAC,MAAM,GAAG,EAAE;gBAAE,KAAK,CAAC,IAAI,CAAC,aAAa,SAAS,CAAC,MAAM,GAAG,EAAE,OAAO,CAAC,CAAC;QAClF,CAAC;aAAM,CAAC;YACP,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACrC,CAAC;QAED,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,UAAU,WAAW,CAAC,MAAM,mBAAmB,CAAC,CAAC;YAC5D,KAAK,MAAM,CAAC,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBACzC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YACpE,CAAC;QACF,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,oEAAoE;QACpE,MAAM,WAAW,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;YAC9D,IAAI,GAAG,CAAC,UAAU,KAAK,UAAU,IAAI,GAAG,CAAC,QAAQ,GAAG,IAAI;gBAAE,OAAO,KAAK,CAAC;YACvE,IAAI,GAAG,CAAC,IAAI,KAAK,oBAAoB;gBAAE,OAAO,KAAK,CAAC;YACpD,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAAE,OAAO,KAAK,CAAC;YAC7E,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC5C,OAAO,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC,MAAM,CAAC;QAEV,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;YACrB,KAAK,CAAC,IAAI,CAAC,UAAU,WAAW,0BAA0B,CAAC,CAAC;QAC7D,CAAC;aAAM,CAAC;YACP,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACxC,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,mEAAmE;QACnE,MAAM,YAAY,GAAG,YAAY,CAAC,MAAM,GAAG,WAAW,GAAG,SAAS,CAAC,MAAM,CAAC;QAC1E,IAAI,SAAiB,CAAC;QACtB,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,SAAS,GAAG,0CAA0C,CAAC;QACxD,CAAC;aAAM,IAAI,WAAW,GAAG,EAAE,IAAI,YAAY,GAAG,EAAE,EAAE,CAAC;YAClD,SAAS,GAAG,2CAA2C,CAAC;QACzD,CAAC;aAAM,CAAC;YACP,SAAS,GAAG,8BAA8B,CAAC;QAC5C,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,SAAS,SAAS,EAAE,CAAC,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,oEAAoE;QACpE,IAAI,OAAiC,CAAC;QACtC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,OAAO,GAAG,MAAM,CAAC;QAClB,CAAC;aAAM,IAAI,WAAW,GAAG,CAAC,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtD,OAAO,GAAG,MAAM,CAAC;QAClB,CAAC;aAAM,CAAC;YACP,OAAO,GAAG,MAAM,CAAC;QAClB,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,aAAa,OAAO,GAAG,CAAC,CAAC;QAEpC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;IAC5C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,OAAO;YACN,IAAI,EAAE,mCAAmC,GAAG,EAAE;YAC9C,OAAO,EAAE,MAAM;SACf,CAAC;IACH,CAAC;AACF,CAAC;AAED,8EAA8E;AAE9E;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAgB,EAAE,OAAgB;IACrE,OAAO,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,EAAgB;IACtD,EAAE,CAAC,EAAE,CAAC,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAC1C,IAAI,CAAC;YACJ,kCAAkC;YAClC,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;gBACzD,OAAO;YACR,CAAC;YAED,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YAEtD,wCAAwC;YACxC,EAAE,CAAC,WAAW,CAAC;gBACd,UAAU,EAAE,oBAAoB;gBAChC,OAAO,EAAE,MAAM,CAAC,IAAI;gBACpB,OAAO,EAAE,IAAI;aACb,CAAC,CAAC;YAEH,0EAA0E;YAC1E,mEAAmE;YACnE,mDAAmD;YACnD,IAAI,MAAM,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;gBAC/B,6CAA6C;gBAC7C,iEAAiE;gBACjE,4DAA4D;gBAC5D,kDAAkD;gBAClD,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,yDAAyD,CAAC,CAAC;YAC9E,CAAC;QACF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,uCAAuC,GAAG,EAAE,CAAC,CAAC;QAC/D,CAAC;IACF,CAAC,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"before-start.d.ts","sourceRoot":"","sources":["../../hooks/before-start.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"before-start.d.ts","sourceRoot":"","sources":["../../hooks/before-start.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAwF7D;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAOrE;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAc9D"}
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
import { scanProject } from "../core/scanner.js";
|
|
12
12
|
import { executeOverview } from "../tools/overview.js";
|
|
13
13
|
import { hasTestFiles, hasHierarchyKinds } from "../core/output.js";
|
|
14
|
+
import { createBaseline, clearBaseline, getBaseline, formatBaselineSummary } from "../core/baseline.js";
|
|
14
15
|
import { execSync } from "node:child_process";
|
|
15
16
|
/**
|
|
16
17
|
* Get the number of uncommitted changes in the working tree.
|
|
@@ -63,6 +64,24 @@ function buildProactiveRecommendations(projectRoot) {
|
|
|
63
64
|
}
|
|
64
65
|
return lines.join("\n");
|
|
65
66
|
}
|
|
67
|
+
/**
|
|
68
|
+
* Build a session baseline summary section.
|
|
69
|
+
* Captures current project health metrics for diff-aware verification.
|
|
70
|
+
*/
|
|
71
|
+
function buildSessionBaselineSection(projectRoot) {
|
|
72
|
+
try {
|
|
73
|
+
const graph = scanProject(projectRoot, () => { });
|
|
74
|
+
const branch = execSync("git branch --show-current 2>/dev/null", { encoding: "utf-8", timeout: 3000 }).trim();
|
|
75
|
+
const commit = execSync("git rev-parse HEAD 2>/dev/null", { encoding: "utf-8", timeout: 3000 }).trim();
|
|
76
|
+
// Clear any previous baseline and capture current state
|
|
77
|
+
clearBaseline();
|
|
78
|
+
createBaseline(graph, 0, 0, branch || "unknown", commit || "unknown");
|
|
79
|
+
return formatBaselineSummary(getBaseline());
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
return "";
|
|
83
|
+
}
|
|
84
|
+
}
|
|
66
85
|
/**
|
|
67
86
|
* Generate a project overview string suitable for system prompt injection.
|
|
68
87
|
*
|
|
@@ -73,7 +92,9 @@ export function generateOverviewForPrompt(projectRoot) {
|
|
|
73
92
|
const graph = scanProject(projectRoot, () => { });
|
|
74
93
|
const overview = executeOverview(graph, projectRoot);
|
|
75
94
|
const recommendations = buildProactiveRecommendations(projectRoot);
|
|
76
|
-
|
|
95
|
+
const baselineSection = buildSessionBaselineSection(projectRoot);
|
|
96
|
+
const parts = [`[pi-shazam] Project Overview:\n${overview}`, recommendations, baselineSection].filter(Boolean);
|
|
97
|
+
return parts.join("\n\n");
|
|
77
98
|
}
|
|
78
99
|
/**
|
|
79
100
|
* Register the before-start hook on the Pi extension API.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"before-start.js","sourceRoot":"","sources":["../../hooks/before-start.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"before-start.js","sourceRoot":"","sources":["../../hooks/before-start.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pi-shazam hooks/pre-edit — Pre-edit impact analysis guard.
|
|
3
|
+
*
|
|
4
|
+
* Intercepts tool_call events for write/edit and detects when:
|
|
5
|
+
* 1. Multiple files are about to be edited in a single turn
|
|
6
|
+
* 2. A shared/exported module is being modified
|
|
7
|
+
* 3. A function signature is being changed
|
|
8
|
+
*
|
|
9
|
+
* When triggered, it sends a warning message suggesting the user run
|
|
10
|
+
* shazam_impact first to assess blast radius.
|
|
11
|
+
*/
|
|
12
|
+
import type { ExtensionAPI } from "../types/pi-extension.js";
|
|
13
|
+
/**
|
|
14
|
+
* Get the list of files that have been edited so far in this session.
|
|
15
|
+
*/
|
|
16
|
+
export declare function getEditedFiles(): string[];
|
|
17
|
+
/**
|
|
18
|
+
* Clear the edited files tracker.
|
|
19
|
+
*/
|
|
20
|
+
export declare function clearEditedFiles(): void;
|
|
21
|
+
/**
|
|
22
|
+
* Register the pre-edit guard hook.
|
|
23
|
+
*
|
|
24
|
+
* On tool_call for write/edit, checks if the edit affects multiple files
|
|
25
|
+
* or modifies a shared module and sends a warning message.
|
|
26
|
+
*/
|
|
27
|
+
export declare function registerPreEditGuard(pi: ExtensionAPI): void;
|
|
28
|
+
//# sourceMappingURL=pre-edit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pre-edit.d.ts","sourceRoot":"","sources":["../../hooks/pre-edit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAQ7D;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,EAAE,CAEzC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAiDD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAkD3D"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pi-shazam hooks/pre-edit — Pre-edit impact analysis guard.
|
|
3
|
+
*
|
|
4
|
+
* Intercepts tool_call events for write/edit and detects when:
|
|
5
|
+
* 1. Multiple files are about to be edited in a single turn
|
|
6
|
+
* 2. A shared/exported module is being modified
|
|
7
|
+
* 3. A function signature is being changed
|
|
8
|
+
*
|
|
9
|
+
* When triggered, it sends a warning message suggesting the user run
|
|
10
|
+
* shazam_impact first to assess blast radius.
|
|
11
|
+
*/
|
|
12
|
+
import { execSync } from "node:child_process";
|
|
13
|
+
/**
|
|
14
|
+
* Track files edited in the current session for multi-edit detection.
|
|
15
|
+
*/
|
|
16
|
+
const _editedFiles = new Set();
|
|
17
|
+
/**
|
|
18
|
+
* Get the list of files that have been edited so far in this session.
|
|
19
|
+
*/
|
|
20
|
+
export function getEditedFiles() {
|
|
21
|
+
return [..._editedFiles];
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Clear the edited files tracker.
|
|
25
|
+
*/
|
|
26
|
+
export function clearEditedFiles() {
|
|
27
|
+
_editedFiles.clear();
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Extract file paths from a tool call's input parameters.
|
|
31
|
+
*/
|
|
32
|
+
function extractFilesFromInput(input) {
|
|
33
|
+
const files = [];
|
|
34
|
+
if (input && typeof input === "object") {
|
|
35
|
+
const obj = input;
|
|
36
|
+
// Tool calls may have `path` (write), `file` (edit), or `files` (impact)
|
|
37
|
+
if (typeof obj.path === "string")
|
|
38
|
+
files.push(obj.path);
|
|
39
|
+
if (typeof obj.file === "string")
|
|
40
|
+
files.push(obj.file);
|
|
41
|
+
if (Array.isArray(obj.files)) {
|
|
42
|
+
for (const f of obj.files) {
|
|
43
|
+
if (typeof f === "string")
|
|
44
|
+
files.push(f);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// For edit tool, the edits array may contain file paths
|
|
48
|
+
if (Array.isArray(obj.edits)) {
|
|
49
|
+
for (const edit of obj.edits) {
|
|
50
|
+
if (edit && typeof edit === "object" && typeof edit.path === "string") {
|
|
51
|
+
files.push(edit.path);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return [...new Set(files)];
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Check if a file is a shared/exported module by looking at git history
|
|
60
|
+
* and import frequency.
|
|
61
|
+
*/
|
|
62
|
+
function isSharedModule(filePath) {
|
|
63
|
+
try {
|
|
64
|
+
// Check if the file is imported by many other files
|
|
65
|
+
const importCount = execSync(`grep -r "from ['\"./]*${filePath.replace(/\.[^.]+$/, "")}['\"]" --include="*.ts" --include="*.js" --include="*.tsx" --include="*.jsx" -l 2>/dev/null | wc -l`, { encoding: "utf-8", timeout: 3000 }).trim();
|
|
66
|
+
const count = parseInt(importCount, 10);
|
|
67
|
+
return count >= 3;
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Register the pre-edit guard hook.
|
|
75
|
+
*
|
|
76
|
+
* On tool_call for write/edit, checks if the edit affects multiple files
|
|
77
|
+
* or modifies a shared module and sends a warning message.
|
|
78
|
+
*/
|
|
79
|
+
export function registerPreEditGuard(pi) {
|
|
80
|
+
pi.on("tool_call", (event, ctx) => {
|
|
81
|
+
if (event.toolName !== "write" && event.toolName !== "edit")
|
|
82
|
+
return;
|
|
83
|
+
// Don't re-warn if we already warned for this tool call
|
|
84
|
+
const input = "input" in event ? event.input : {};
|
|
85
|
+
const files = extractFilesFromInput(input);
|
|
86
|
+
if (files.length === 0)
|
|
87
|
+
return;
|
|
88
|
+
// Track files for multi-edit detection
|
|
89
|
+
for (const f of files) {
|
|
90
|
+
_editedFiles.add(f);
|
|
91
|
+
}
|
|
92
|
+
// Combine current files with previously edited files
|
|
93
|
+
const allFiles = getEditedFiles();
|
|
94
|
+
// Check conditions for suggesting impact analysis
|
|
95
|
+
const reasons = [];
|
|
96
|
+
// Condition 1: Multiple files edited in this session
|
|
97
|
+
if (allFiles.length >= 2) {
|
|
98
|
+
reasons.push(`This session has touched ${allFiles.length} files`);
|
|
99
|
+
}
|
|
100
|
+
// Condition 2: Shared/exported module being modified
|
|
101
|
+
for (const f of files) {
|
|
102
|
+
if (isSharedModule(f)) {
|
|
103
|
+
reasons.push(`File "${f}" appears to be a shared module (imported by multiple files)`);
|
|
104
|
+
break;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
if (reasons.length > 0) {
|
|
108
|
+
ctx.ui?.notify?.(`[shazam] Caution: ${reasons.join("; ")}. Run \`shazam_impact --files ${allFiles.join(" ")}\` to assess blast radius before editing.`, "warning");
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
// Clear edited files on session start and shutdown
|
|
112
|
+
pi.on("session_start", () => {
|
|
113
|
+
clearEditedFiles();
|
|
114
|
+
});
|
|
115
|
+
pi.on("session_shutdown", () => {
|
|
116
|
+
clearEditedFiles();
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=pre-edit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pre-edit.js","sourceRoot":"","sources":["../../hooks/pre-edit.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,YAAY,EAA2B,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,YAAY,EAA2B,MAAM,yBAAyB,CAAC;AA6BrF,MAAM,CAAC,OAAO,WAAW,EAAE,EAAE,YAAY,GAAG,IAAI,CA+J/C"}
|
package/dist/index.js
CHANGED
|
@@ -17,6 +17,7 @@ import { registerBeforeStartHook } from "./hooks/before-start.js";
|
|
|
17
17
|
import { registerAfterWriteHook } from "./hooks/after-write.js";
|
|
18
18
|
import { registerToolLogger } from "./hooks/tool-logger.js";
|
|
19
19
|
import { registerShazamGuide } from "./hooks/shazam-guide.js";
|
|
20
|
+
import { registerPreEditGuard } from "./hooks/pre-edit.js";
|
|
20
21
|
// ── Tool registrations ────────────────────────────────────────────────────
|
|
21
22
|
import { registerOverview } from "./tools/overview.js";
|
|
22
23
|
import { registerImpact } from "./tools/impact.js";
|
|
@@ -65,6 +66,7 @@ export default function (pi) {
|
|
|
65
66
|
registerAfterWriteHook(pi);
|
|
66
67
|
registerToolLogger(pi);
|
|
67
68
|
registerShazamGuide(pi);
|
|
69
|
+
registerPreEditGuard(pi);
|
|
68
70
|
// ── /shazam-setup command ───────────────────────────────────────────────
|
|
69
71
|
pi.registerCommand("shazam-setup", {
|
|
70
72
|
description: "Detect and report LSP server availability with install instructions",
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEpG,4EAA4E;AAC5E,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file_detail.d.ts","sourceRoot":"","sources":["../../tools/file_detail.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,YAAY,EAAmB,MAAM,0BAA0B,CAAC;AAE9E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAQlD,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CA0DzD;AAsBD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"file_detail.d.ts","sourceRoot":"","sources":["../../tools/file_detail.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,YAAY,EAAmB,MAAM,0BAA0B,CAAC;AAE9E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAQlD,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CA0DzD;AAsBD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAyJxE;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAyB5E"}
|
|
@@ -107,16 +107,75 @@ export function executeFileDetail(graph, file) {
|
|
|
107
107
|
lines.push("");
|
|
108
108
|
lines.push("Kinds: " + [...byKind.entries()].map(([k, v]) => `${v} ${k}`).join(", "));
|
|
109
109
|
lines.push("");
|
|
110
|
-
// Symbol list
|
|
110
|
+
// Symbol list with tree-sitter nesting grouping
|
|
111
|
+
// Group container symbols (class, interface, impl, struct, module, namespace)
|
|
112
|
+
// and nest their member functions
|
|
111
113
|
lines.push("### Symbols");
|
|
112
114
|
lines.push("");
|
|
115
|
+
const CONTAINER_KINDS = new Set(["class", "interface", "struct", "impl", "module", "namespace", "object"]);
|
|
116
|
+
const containers = [];
|
|
117
|
+
const standalone = [];
|
|
113
118
|
for (const sym of symbols) {
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
119
|
+
if (CONTAINER_KINDS.has(sym.kind)) {
|
|
120
|
+
// Find members that are within this container's line range
|
|
121
|
+
const members = symbols.filter((other) => {
|
|
122
|
+
if (other.id === sym.id)
|
|
123
|
+
return false;
|
|
124
|
+
// A member is between the container's start and end lines
|
|
125
|
+
return other.line >= sym.line && other.endLine <= sym.endLine;
|
|
126
|
+
});
|
|
127
|
+
if (members.length > 0) {
|
|
128
|
+
containers.push({ sym, members });
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
standalone.push(sym);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
standalone.push(sym);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// If we have containers with members, show tree-sitter hierarchy
|
|
139
|
+
if (containers.length > 0) {
|
|
140
|
+
for (const { sym, members } of containers) {
|
|
141
|
+
const inc = graph.incoming.get(sym.id);
|
|
142
|
+
const out = graph.outgoing.get(sym.id);
|
|
143
|
+
const incCount = inc ? inc.length : 0;
|
|
144
|
+
const outCount = out ? out.length : 0;
|
|
145
|
+
lines.push(`- container ${sym.kind} \`${sym.name}\` L${sym.line}-${sym.endLine} | in:${incCount} out:${outCount}`);
|
|
146
|
+
for (const member of members) {
|
|
147
|
+
const mInc = graph.incoming.get(member.id);
|
|
148
|
+
const mOut = graph.outgoing.get(member.id);
|
|
149
|
+
const mIncCount = mInc ? mInc.length : 0;
|
|
150
|
+
const mOutCount = mOut ? mOut.length : 0;
|
|
151
|
+
lines.push(` └ ${member.kind} \`${member.name}\` L${member.line}-${member.endLine} [${member.visibility}] PR ${member.pagerank.toFixed(3)} | in:${mIncCount} out:${mOutCount}`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// Add standalone symbols (not in any container)
|
|
155
|
+
if (standalone.length > 0) {
|
|
156
|
+
lines.push("");
|
|
157
|
+
lines.push("Other symbols:");
|
|
158
|
+
for (const sym of standalone) {
|
|
159
|
+
const inc = graph.incoming.get(sym.id);
|
|
160
|
+
const out = graph.outgoing.get(sym.id);
|
|
161
|
+
const incCount = inc ? inc.length : 0;
|
|
162
|
+
const outCount = out ? out.length : 0;
|
|
163
|
+
lines.push(` - ${sym.kind} \`${sym.name}\` L${sym.line}-${sym.endLine} [${sym.visibility}] PR ${sym.pagerank.toFixed(3)} | in:${incCount} out:${outCount}`);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
// Flat list (no containers found)
|
|
169
|
+
for (const sym of symbols) {
|
|
170
|
+
const inc = graph.incoming.get(sym.id);
|
|
171
|
+
const out = graph.outgoing.get(sym.id);
|
|
172
|
+
const incCount = inc ? inc.length : 0;
|
|
173
|
+
const outCount = out ? out.length : 0;
|
|
174
|
+
lines.push(`- ${sym.kind} \`${sym.name}\` L${sym.line}-${sym.endLine} [${sym.visibility}] PR ${sym.pagerank.toFixed(3)} | in:${incCount} out:${outCount}`);
|
|
175
|
+
if (sym.signature) {
|
|
176
|
+
lines.push(` ${sym.signature.slice(0, 100)}`);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
120
179
|
}
|
|
121
180
|
// File-level imports
|
|
122
181
|
const fileImports = graph.fileImports.get(file);
|
|
@@ -128,7 +187,23 @@ export function executeFileDetail(graph, file) {
|
|
|
128
187
|
}
|
|
129
188
|
}
|
|
130
189
|
// Add Next recommendations
|
|
131
|
-
const
|
|
190
|
+
const hasHierarchyTypes = symbols.some((s) => ["class", "interface", "struct", "impl"].includes(s.kind));
|
|
191
|
+
const nextItems = getNextForTool("file_detail", {
|
|
192
|
+
topFile: file,
|
|
193
|
+
topSymbol: symbols[0]?.name,
|
|
194
|
+
});
|
|
195
|
+
// Add type_hierarchy recommendation if file has class/interface symbols (Phase 3)
|
|
196
|
+
if (hasHierarchyTypes) {
|
|
197
|
+
const typeSym = symbols.find((s) => ["class", "interface", "struct"].includes(s.kind));
|
|
198
|
+
if (typeSym) {
|
|
199
|
+
nextItems.push({
|
|
200
|
+
tool: "type_hierarchy",
|
|
201
|
+
params: { name: typeSym.name },
|
|
202
|
+
label: `Explore type hierarchy for ${typeSym.name}`,
|
|
203
|
+
level: "recommended",
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
}
|
|
132
207
|
if (nextItems.length > 0) {
|
|
133
208
|
lines.push("");
|
|
134
209
|
lines.push(formatNextSection(nextItems));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file_detail.js","sourceRoot":"","sources":["../../tools/file_detail.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"file_detail.js","sourceRoot":"","sources":["../../tools/file_detail.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pi-shazam",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Pi coding agent native codebase awareness extension - Shazam: power from multiple sources (repomap, pi-lens, serena MCP, tree-sitter, LSP) unified into one",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|