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;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AA8C7D;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CA0BzD"}
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
- * Check if shazam_verify was called recently by reading the audit log.
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
- try {
18
- const { readFileSync, statSync } = require("node:fs");
19
- const { join } = require("node:path");
20
- const { homedir } = require("node:os");
21
- const logFile = join(homedir(), ".pi", "hooks", "audit", "shazam-calls.log");
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
- // Using sendMessage instead of notify so the LLM sees it and can act
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, // Don't show in UI, just inject into context
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;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C;;GAEG;AACH,SAAS,eAAe;IACvB,IAAI,CAAC;QACJ,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;QACtD,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;QACtC,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;QAEvC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC;QAE7E,wEAAwE;QACxE,IAAI,CAAC;YACJ,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC/B,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;YACnD,IAAI,IAAI,CAAC,OAAO,GAAG,eAAe,EAAE,CAAC;gBACpC,OAAO,KAAK,CAAC;YACd,CAAC;QACF,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,KAAK,CAAC;QACd,CAAC;QAED,6DAA6D;QAC7D,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QAEpD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACJ,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC/B,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,IAAI,KAAK,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;oBAChE,OAAO,IAAI,CAAC;gBACb,CAAC;YACF,CAAC;YAAC,MAAM,CAAC;gBACR,uBAAuB;YACxB,CAAC;QACF,CAAC;IACF,CAAC;IAAC,MAAM,CAAC;QACR,+CAA+C;IAChD,CAAC;IAED,OAAO,KAAK,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,EAAgB;IAClD,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,qEAAqE;QACrE,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,IAAI,CAAC;YACvC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YAC7C,CAAC,CAAC,GAAG,WAAW,CAAC,MAAM,QAAQ,CAAC;QAEjC,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,EAAE,6CAA6C;SAC7D,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC"}
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.6.3",
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.0",
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",