pi-shazam 0.7.0 → 0.7.1
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.
|
@@ -8,13 +8,14 @@
|
|
|
8
8
|
* to check for errors before declaring "done".
|
|
9
9
|
*
|
|
10
10
|
* Uses turn_end event to detect when the agent is about to finish.
|
|
11
|
+
* Tracks verify calls in memory for reliable detection.
|
|
11
12
|
*/
|
|
12
13
|
import type { ExtensionAPI } from "../types/pi-extension.js";
|
|
13
14
|
/**
|
|
14
15
|
* Register the stop-verify hook.
|
|
15
16
|
*
|
|
17
|
+
* On tool_result for shazam_verify, marks verify as called.
|
|
16
18
|
* On turn_end, checks if there were file edits that haven't been verified.
|
|
17
|
-
* If so, sends a reminder to run shazam_verify.
|
|
18
19
|
*/
|
|
19
20
|
export declare function registerStopVerify(pi: ExtensionAPI): void;
|
|
20
21
|
//# sourceMappingURL=stop-verify.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stop-verify.d.ts","sourceRoot":"","sources":["../../hooks/stop-verify.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"stop-verify.d.ts","sourceRoot":"","sources":["../../hooks/stop-verify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AA6B7D;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAsCzD"}
|
|
@@ -8,55 +8,51 @@
|
|
|
8
8
|
* to check for errors before declaring "done".
|
|
9
9
|
*
|
|
10
10
|
* Uses turn_end event to detect when the agent is about to finish.
|
|
11
|
+
* Tracks verify calls in memory for reliable detection.
|
|
11
12
|
*/
|
|
12
13
|
import { getEditedFiles } from "./pre-edit.js";
|
|
13
14
|
/**
|
|
14
|
-
*
|
|
15
|
+
* Track whether shazam_verify was called in this session.
|
|
16
|
+
* More reliable than checking audit log file.
|
|
17
|
+
*/
|
|
18
|
+
let _verifyCalledInSession = false;
|
|
19
|
+
let _lastVerifyTimestamp = 0;
|
|
20
|
+
/**
|
|
21
|
+
* Mark that shazam_verify was called.
|
|
22
|
+
*/
|
|
23
|
+
function markVerifyCalled() {
|
|
24
|
+
_verifyCalledInSession = true;
|
|
25
|
+
_lastVerifyTimestamp = Date.now();
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Check if shazam_verify was called recently (within 5 minutes).
|
|
15
29
|
*/
|
|
16
30
|
function hasRecentVerify() {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
// Check if log file exists and was modified recently (within 3 minutes)
|
|
23
|
-
try {
|
|
24
|
-
const stat = statSync(logFile);
|
|
25
|
-
const threeMinutesAgo = Date.now() - 3 * 60 * 1000;
|
|
26
|
-
if (stat.mtimeMs < threeMinutesAgo) {
|
|
27
|
-
return false;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
catch {
|
|
31
|
-
return false;
|
|
32
|
-
}
|
|
33
|
-
// Read last 10 lines to check for recent shazam_verify calls
|
|
34
|
-
const content = readFileSync(logFile, "utf-8");
|
|
35
|
-
const lines = content.trim().split("\n").slice(-10);
|
|
36
|
-
for (const line of lines) {
|
|
37
|
-
try {
|
|
38
|
-
const entry = JSON.parse(line);
|
|
39
|
-
if (entry.tool === "shazam_verify" && entry.event === "result") {
|
|
40
|
-
return true;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
catch {
|
|
44
|
-
// Skip malformed lines
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
catch {
|
|
49
|
-
// If we can't check, assume verify was not run
|
|
50
|
-
}
|
|
51
|
-
return false;
|
|
31
|
+
if (!_verifyCalledInSession)
|
|
32
|
+
return false;
|
|
33
|
+
// Also check if it was recent (within 5 minutes)
|
|
34
|
+
const fiveMinutesAgo = Date.now() - 5 * 60 * 1000;
|
|
35
|
+
return _lastVerifyTimestamp > fiveMinutesAgo;
|
|
52
36
|
}
|
|
53
37
|
/**
|
|
54
38
|
* Register the stop-verify hook.
|
|
55
39
|
*
|
|
40
|
+
* On tool_result for shazam_verify, marks verify as called.
|
|
56
41
|
* On turn_end, checks if there were file edits that haven't been verified.
|
|
57
|
-
* If so, sends a reminder to run shazam_verify.
|
|
58
42
|
*/
|
|
59
43
|
export function registerStopVerify(pi) {
|
|
44
|
+
// Track shazam_verify calls
|
|
45
|
+
pi.on("tool_result", (event) => {
|
|
46
|
+
if (event.toolName === "shazam_verify" && !event.isError) {
|
|
47
|
+
markVerifyCalled();
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
// Reset on session start
|
|
51
|
+
pi.on("session_start", () => {
|
|
52
|
+
_verifyCalledInSession = false;
|
|
53
|
+
_lastVerifyTimestamp = 0;
|
|
54
|
+
});
|
|
55
|
+
// Check on turn end
|
|
60
56
|
pi.on("turn_end", (_event, _ctx) => {
|
|
61
57
|
// Check if there were file edits this session
|
|
62
58
|
const editedFiles = getEditedFiles();
|
|
@@ -66,10 +62,7 @@ export function registerStopVerify(pi) {
|
|
|
66
62
|
if (hasRecentVerify())
|
|
67
63
|
return;
|
|
68
64
|
// Send reminder via sendMessage (injected into next turn context)
|
|
69
|
-
|
|
70
|
-
const fileList = editedFiles.length <= 3
|
|
71
|
-
? editedFiles.map(f => `\`${f}\``).join(", ")
|
|
72
|
-
: `${editedFiles.length} files`;
|
|
65
|
+
const fileList = editedFiles.length <= 3 ? editedFiles.map((f) => `\`${f}\``).join(", ") : `${editedFiles.length} files`;
|
|
73
66
|
pi.sendMessage({
|
|
74
67
|
customType: "shazam-reminder",
|
|
75
68
|
content: [
|
|
@@ -78,7 +71,7 @@ export function registerStopVerify(pi) {
|
|
|
78
71
|
`You edited ${fileList} this session but haven't run \`shazam_verify\`.`,
|
|
79
72
|
"Run it now to check for type errors, lint issues, and broken references.",
|
|
80
73
|
].join("\n"),
|
|
81
|
-
display: false,
|
|
74
|
+
display: false,
|
|
82
75
|
});
|
|
83
76
|
});
|
|
84
77
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stop-verify.js","sourceRoot":"","sources":["../../hooks/stop-verify.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"stop-verify.js","sourceRoot":"","sources":["../../hooks/stop-verify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C;;;GAGG;AACH,IAAI,sBAAsB,GAAG,KAAK,CAAC;AACnC,IAAI,oBAAoB,GAAG,CAAC,CAAC;AAE7B;;GAEG;AACH,SAAS,gBAAgB;IACxB,sBAAsB,GAAG,IAAI,CAAC;IAC9B,oBAAoB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,SAAS,eAAe;IACvB,IAAI,CAAC,sBAAsB;QAAE,OAAO,KAAK,CAAC;IAE1C,iDAAiD;IACjD,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;IAClD,OAAO,oBAAoB,GAAG,cAAc,CAAC;AAC9C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,EAAgB;IAClD,4BAA4B;IAC5B,EAAE,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE;QAC9B,IAAI,KAAK,CAAC,QAAQ,KAAK,eAAe,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YAC1D,gBAAgB,EAAE,CAAC;QACpB,CAAC;IACF,CAAC,CAAC,CAAC;IAEH,yBAAyB;IACzB,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,GAAG,EAAE;QAC3B,sBAAsB,GAAG,KAAK,CAAC;QAC/B,oBAAoB,GAAG,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,oBAAoB;IACpB,EAAE,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE;QAClC,8CAA8C;QAC9C,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;QACrC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAErC,0CAA0C;QAC1C,IAAI,eAAe,EAAE;YAAE,OAAO;QAE9B,kEAAkE;QAClE,MAAM,QAAQ,GACb,WAAW,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,MAAM,QAAQ,CAAC;QAEzG,EAAE,CAAC,WAAW,CAAC;YACd,UAAU,EAAE,iBAAiB;YAC7B,OAAO,EAAE;gBACR,gCAAgC;gBAChC,EAAE;gBACF,cAAc,QAAQ,kDAAkD;gBACxE,0EAA0E;aAC1E,CAAC,IAAI,CAAC,IAAI,CAAC;YACZ,OAAO,EAAE,KAAK;SACd,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC"}
|
package/dist/mcp/entry.js
CHANGED
|
@@ -15,7 +15,7 @@ const PROJECT_ROOT = process.argv[2] || ".";
|
|
|
15
15
|
async function main() {
|
|
16
16
|
const server = new McpServer({
|
|
17
17
|
name: "pi-shazam",
|
|
18
|
-
version: "0.
|
|
18
|
+
version: "0.7.0",
|
|
19
19
|
});
|
|
20
20
|
// Scan project (builds symbol graph, may take 1-5s for large projects)
|
|
21
21
|
const graph = scanProject(PROJECT_ROOT);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pi-shazam",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.1",
|
|
4
4
|
"description": "Pi coding agent native codebase awareness toolkit — 14 structural analysis tools. Also supports MCP (Cursor, Claude Desktop, Windsurf, etc.)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|