pi-shazam 0.9.0 → 0.9.2
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/hooks/before-start.d.ts +4 -0
- package/dist/hooks/before-start.d.ts.map +1 -1
- package/dist/hooks/before-start.js +7 -3
- package/dist/hooks/before-start.js.map +1 -1
- package/dist/hooks/pre-edit.d.ts +5 -0
- package/dist/hooks/pre-edit.d.ts.map +1 -1
- package/dist/hooks/pre-edit.js +14 -7
- package/dist/hooks/pre-edit.js.map +1 -1
- package/dist/hooks/safety.d.ts +2 -2
- package/dist/hooks/safety.d.ts.map +1 -1
- package/dist/hooks/safety.js +8 -51
- package/dist/hooks/safety.js.map +1 -1
- package/dist/hooks/shazam-guide.d.ts +2 -2
- package/dist/hooks/shazam-guide.js +13 -13
- package/dist/hooks/shazam-guide.js.map +1 -1
- package/dist/hooks/stop-verify.d.ts +3 -2
- package/dist/hooks/stop-verify.d.ts.map +1 -1
- package/dist/hooks/stop-verify.js +14 -29
- package/dist/hooks/stop-verify.js.map +1 -1
- package/dist/hooks/tool-logger.d.ts.map +1 -1
- package/dist/hooks/tool-logger.js +12 -0
- package/dist/hooks/tool-logger.js.map +1 -1
- package/dist/hooks/verify-state.d.ts +28 -0
- package/dist/hooks/verify-state.d.ts.map +1 -0
- package/dist/hooks/verify-state.js +43 -0
- package/dist/hooks/verify-state.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/lsp/client.d.ts +5 -1
- package/dist/lsp/client.d.ts.map +1 -1
- package/dist/lsp/client.js +95 -0
- package/dist/lsp/client.js.map +1 -1
- package/dist/mcp/entry.js +1 -1
- package/dist/tools/file_detail.d.ts.map +1 -1
- package/dist/tools/file_detail.js +22 -2
- package/dist/tools/file_detail.js.map +1 -1
- package/dist/tools/hover.d.ts +1 -0
- package/dist/tools/hover.d.ts.map +1 -1
- package/dist/tools/hover.js +42 -0
- package/dist/tools/hover.js.map +1 -1
- package/dist/tools/lsp_enrich.d.ts +22 -1
- package/dist/tools/lsp_enrich.d.ts.map +1 -1
- package/dist/tools/lsp_enrich.js +84 -0
- package/dist/tools/lsp_enrich.js.map +1 -1
- package/dist/tools/type_hierarchy.d.ts +1 -0
- package/dist/tools/type_hierarchy.d.ts.map +1 -1
- package/dist/tools/type_hierarchy.js +33 -0
- package/dist/tools/type_hierarchy.js.map +1 -1
- package/dist/tools/verify.d.ts.map +1 -1
- package/dist/tools/verify.js +39 -0
- package/dist/tools/verify.js.map +1 -1
- package/package.json +1 -1
|
@@ -13,6 +13,10 @@
|
|
|
13
13
|
* - buildProactiveRecommendations: builds context-aware recommendations
|
|
14
14
|
* - buildSessionBaselineSection: builds baseline summary
|
|
15
15
|
* - generateOverviewForPrompt: orchestrates all parts
|
|
16
|
+
*
|
|
17
|
+
* NOTE: This handler MUST be registered AFTER the LSP init handler in index.ts.
|
|
18
|
+
* Only this handler returns { systemPrompt }. If ordering changes, the system
|
|
19
|
+
* prompt injection could be silently lost.
|
|
16
20
|
*/
|
|
17
21
|
import type { ExtensionAPI } from "../types/pi-extension.js";
|
|
18
22
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"before-start.d.ts","sourceRoot":"","sources":["../../hooks/before-start.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"before-start.d.ts","sourceRoot":"","sources":["../../hooks/before-start.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAoG7D;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,MAAM,EAAE,cAAc,UAAQ,GAAG,MAAM,CAe7F;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAuB9D"}
|
|
@@ -13,11 +13,15 @@
|
|
|
13
13
|
* - buildProactiveRecommendations: builds context-aware recommendations
|
|
14
14
|
* - buildSessionBaselineSection: builds baseline summary
|
|
15
15
|
* - generateOverviewForPrompt: orchestrates all parts
|
|
16
|
+
*
|
|
17
|
+
* NOTE: This handler MUST be registered AFTER the LSP init handler in index.ts.
|
|
18
|
+
* Only this handler returns { systemPrompt }. If ordering changes, the system
|
|
19
|
+
* prompt injection could be silently lost.
|
|
16
20
|
*/
|
|
17
21
|
import { scanProject } from "../core/scanner.js";
|
|
18
22
|
import { executeOverview } from "../tools/overview.js";
|
|
19
23
|
import { hasTestFiles, hasHierarchyKinds } from "../core/output.js";
|
|
20
|
-
import { createBaseline,
|
|
24
|
+
import { createBaseline, getBaseline, formatBaselineSummary } from "../core/baseline.js";
|
|
21
25
|
import { execSync } from "node:child_process";
|
|
22
26
|
/**
|
|
23
27
|
* Get the number of uncommitted changes in the working tree.
|
|
@@ -83,8 +87,8 @@ function buildSessionBaselineSection(_projectRoot, graph) {
|
|
|
83
87
|
try {
|
|
84
88
|
const branch = execSync("git branch --show-current 2>/dev/null", { encoding: "utf-8", timeout: 3000 }).trim();
|
|
85
89
|
const commit = execSync("git rev-parse HEAD 2>/dev/null", { encoding: "utf-8", timeout: 3000 }).trim();
|
|
86
|
-
//
|
|
87
|
-
clearBaseline()
|
|
90
|
+
// createBaseline immediately reassigns _baseline and _previousOrphans,
|
|
91
|
+
// so no explicit clearBaseline() is needed here.
|
|
88
92
|
createBaseline(graph, 0, 0, branch || "unknown", commit || "unknown");
|
|
89
93
|
const baseline = getBaseline();
|
|
90
94
|
return baseline ? formatBaselineSummary(baseline) : "";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"before-start.js","sourceRoot":"","sources":["../../hooks/before-start.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"before-start.js","sourceRoot":"","sources":["../../hooks/before-start.ts"],"names":[],"mappings":"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"}
|
package/dist/hooks/pre-edit.d.ts
CHANGED
|
@@ -10,6 +10,11 @@
|
|
|
10
10
|
* shazam_impact first to assess blast radius.
|
|
11
11
|
*/
|
|
12
12
|
import type { ExtensionAPI } from "../types/pi-extension.js";
|
|
13
|
+
/**
|
|
14
|
+
* Normalize a file path to prevent duplicate tracking of the same file
|
|
15
|
+
* under different path representations (e.g. "./src/foo.ts" vs "src/foo.ts").
|
|
16
|
+
*/
|
|
17
|
+
export declare function normalizeEditedPath(filePath: string, cwd: string): string;
|
|
13
18
|
/**
|
|
14
19
|
* Get the list of files that have been edited so far in this session.
|
|
15
20
|
*/
|
|
@@ -1 +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;
|
|
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;AAkB7D;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAEzE;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,EAAE,CAEzC;AAqBD;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAIvC;AA+BD;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CA6E3D"}
|
package/dist/hooks/pre-edit.js
CHANGED
|
@@ -9,11 +9,12 @@
|
|
|
9
9
|
* When triggered, it sends a warning message suggesting the user run
|
|
10
10
|
* shazam_impact first to assess blast radius.
|
|
11
11
|
*/
|
|
12
|
+
import { resolve } from "node:path";
|
|
12
13
|
/** Maximum number of edited files tracked in the set. */
|
|
13
14
|
const MAX_EDITED_FILES = 100;
|
|
14
15
|
/**
|
|
15
16
|
* Track files edited in the current session for multi-edit detection.
|
|
16
|
-
* Key: file path, Value: insertion order timestamp.
|
|
17
|
+
* Key: normalized file path, Value: insertion order timestamp.
|
|
17
18
|
*/
|
|
18
19
|
const _editedFiles = new Map();
|
|
19
20
|
let _editCounter = 0;
|
|
@@ -21,6 +22,13 @@ let _editCounter = 0;
|
|
|
21
22
|
* Track tentative file additions from tool_call for removal on failed tool_result.
|
|
22
23
|
*/
|
|
23
24
|
const _tentativeFiles = new Map();
|
|
25
|
+
/**
|
|
26
|
+
* Normalize a file path to prevent duplicate tracking of the same file
|
|
27
|
+
* under different path representations (e.g. "./src/foo.ts" vs "src/foo.ts").
|
|
28
|
+
*/
|
|
29
|
+
export function normalizeEditedPath(filePath, cwd) {
|
|
30
|
+
return resolve(cwd, filePath);
|
|
31
|
+
}
|
|
24
32
|
/**
|
|
25
33
|
* Get the list of files that have been edited so far in this session.
|
|
26
34
|
*/
|
|
@@ -96,9 +104,11 @@ export function registerPreEditGuard(pi) {
|
|
|
96
104
|
if (event.toolName !== "write" && event.toolName !== "edit")
|
|
97
105
|
return;
|
|
98
106
|
const input = "input" in event ? event.input : {};
|
|
99
|
-
const
|
|
100
|
-
if (
|
|
107
|
+
const rawFiles = extractFilesFromInput(input);
|
|
108
|
+
if (rawFiles.length === 0)
|
|
101
109
|
return;
|
|
110
|
+
// Normalize paths to avoid duplicate tracking
|
|
111
|
+
const files = rawFiles.map((f) => normalizeEditedPath(f, ctx.cwd));
|
|
102
112
|
// Track tentatively for this tool call (for removal on failure).
|
|
103
113
|
// Also schedule TTL-based eviction in case tool_result never arrives.
|
|
104
114
|
const toolId = event.toolCallId;
|
|
@@ -130,11 +140,8 @@ export function registerPreEditGuard(pi) {
|
|
|
130
140
|
if (allFiles.length >= 2) {
|
|
131
141
|
reasons.push(`This session has touched ${allFiles.length} files`);
|
|
132
142
|
}
|
|
133
|
-
// Condition 2: Shared/exported module check is deferred to graph availability.
|
|
134
|
-
// Formerly used blocking execSync("grep -r ..."); now relies on multi-file
|
|
135
|
-
// detection (Condition 1) which catches most risky edit patterns.
|
|
136
143
|
if (reasons.length > 0) {
|
|
137
|
-
ctx.ui
|
|
144
|
+
ctx.ui.notify(`[shazam] Caution: ${reasons.join("; ")}. Run \`shazam_impact --files ${allFiles.join(" ")}\` to assess blast radius before editing.`, "warning");
|
|
138
145
|
}
|
|
139
146
|
});
|
|
140
147
|
// On tool_result: remove tentatively tracked files if the tool call failed
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pre-edit.js","sourceRoot":"","sources":["../../hooks/pre-edit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"pre-edit.js","sourceRoot":"","sources":["../../hooks/pre-edit.ts"],"names":[],"mappings":"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"}
|
package/dist/hooks/safety.d.ts
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
* 1. Destructive command detection — shows confirmation dialog for dangerous commands
|
|
6
6
|
* 2. Pre-commit gate — blocks git commit if shazam_verify was not run recently
|
|
7
7
|
*
|
|
8
|
-
* Uses Pi's ctx.ui.confirm() for interactive confirmation
|
|
9
|
-
*
|
|
8
|
+
* Uses Pi's ctx.ui.confirm() for interactive confirmation.
|
|
9
|
+
* Uses shared verify-state module for reliable verify detection.
|
|
10
10
|
*/
|
|
11
11
|
import type { ExtensionAPI } from "../types/pi-extension.js";
|
|
12
12
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"safety.d.ts","sourceRoot":"","sources":["../../hooks/safety.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"safety.d.ts","sourceRoot":"","sources":["../../hooks/safety.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAsE7D;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CA0F1D"}
|
package/dist/hooks/safety.js
CHANGED
|
@@ -5,9 +5,10 @@
|
|
|
5
5
|
* 1. Destructive command detection — shows confirmation dialog for dangerous commands
|
|
6
6
|
* 2. Pre-commit gate — blocks git commit if shazam_verify was not run recently
|
|
7
7
|
*
|
|
8
|
-
* Uses Pi's ctx.ui.confirm() for interactive confirmation
|
|
9
|
-
*
|
|
8
|
+
* Uses Pi's ctx.ui.confirm() for interactive confirmation.
|
|
9
|
+
* Uses shared verify-state module for reliable verify detection.
|
|
10
10
|
*/
|
|
11
|
+
import { hasRecentVerify } from "./verify-state.js";
|
|
11
12
|
/**
|
|
12
13
|
* High-risk patterns that should always trigger confirmation.
|
|
13
14
|
* Matched as substrings in the command.
|
|
@@ -67,49 +68,6 @@ function detectDestructiveCommand(cmd) {
|
|
|
67
68
|
}
|
|
68
69
|
return null;
|
|
69
70
|
}
|
|
70
|
-
/**
|
|
71
|
-
* Check if shazam_verify was called recently in this session.
|
|
72
|
-
* Uses the tool-logger's audit log or checks in-memory state.
|
|
73
|
-
*/
|
|
74
|
-
function hasRecentVerify() {
|
|
75
|
-
// Check if shazam_verify appears in recent tool results
|
|
76
|
-
// We can't directly access the tool history, so we check the audit log
|
|
77
|
-
try {
|
|
78
|
-
const { readFileSync, statSync } = require("node:fs");
|
|
79
|
-
const { join } = require("node:path");
|
|
80
|
-
const { homedir } = require("node:os");
|
|
81
|
-
const logFile = join(homedir(), ".pi", "hooks", "audit", "shazam-calls.log");
|
|
82
|
-
// Check if log file exists and was modified recently (within 5 minutes)
|
|
83
|
-
try {
|
|
84
|
-
const stat = statSync(logFile);
|
|
85
|
-
const fiveMinutesAgo = Date.now() - 5 * 60 * 1000;
|
|
86
|
-
if (stat.mtimeMs < fiveMinutesAgo) {
|
|
87
|
-
return false;
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
catch {
|
|
91
|
-
return false; // File doesn't exist
|
|
92
|
-
}
|
|
93
|
-
// Read last 20 lines to check for recent shazam_verify calls
|
|
94
|
-
const content = readFileSync(logFile, "utf-8");
|
|
95
|
-
const lines = content.trim().split("\n").slice(-20);
|
|
96
|
-
for (const line of lines) {
|
|
97
|
-
try {
|
|
98
|
-
const entry = JSON.parse(line);
|
|
99
|
-
if (entry.tool === "shazam_verify" && entry.event === "result") {
|
|
100
|
-
return true;
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
catch {
|
|
104
|
-
// Skip malformed lines
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
catch {
|
|
109
|
-
// If we can't check, assume verify was not run
|
|
110
|
-
}
|
|
111
|
-
return false;
|
|
112
|
-
}
|
|
113
71
|
/**
|
|
114
72
|
* Register the safety hooks.
|
|
115
73
|
*
|
|
@@ -126,7 +84,7 @@ export function registerSafetyHooks(pi) {
|
|
|
126
84
|
const cmd = input.command;
|
|
127
85
|
if (!cmd || typeof cmd !== "string")
|
|
128
86
|
return;
|
|
129
|
-
//
|
|
87
|
+
// -- Check 1: Destructive command detection --
|
|
130
88
|
const destructive = detectDestructiveCommand(cmd);
|
|
131
89
|
if (destructive) {
|
|
132
90
|
const emoji = destructive.level === "HIGH" ? "!!!" : "!";
|
|
@@ -148,7 +106,7 @@ export function registerSafetyHooks(pi) {
|
|
|
148
106
|
};
|
|
149
107
|
}
|
|
150
108
|
// User confirmed, allow the command
|
|
151
|
-
ctx.ui.notify
|
|
109
|
+
ctx.ui.notify(`Proceeding with ${destructive.level}-risk command...`, "warning");
|
|
152
110
|
}
|
|
153
111
|
catch {
|
|
154
112
|
// If confirm dialog fails (e.g., non-interactive mode), block high-risk
|
|
@@ -162,13 +120,13 @@ export function registerSafetyHooks(pi) {
|
|
|
162
120
|
}
|
|
163
121
|
return;
|
|
164
122
|
}
|
|
165
|
-
//
|
|
123
|
+
// -- Check 2: Pre-commit gate --
|
|
166
124
|
if (GIT_COMMIT_PATTERN.test(cmd)) {
|
|
167
125
|
// Skip if --no-verify flag is present
|
|
168
126
|
if (cmd.includes("--no-verify")) {
|
|
169
127
|
return;
|
|
170
128
|
}
|
|
171
|
-
// Check if shazam_verify was run recently
|
|
129
|
+
// Check if shazam_verify was run recently (via shared state)
|
|
172
130
|
if (!hasRecentVerify()) {
|
|
173
131
|
try {
|
|
174
132
|
const choice = await ctx.ui.select("Pre-Commit Gate", [
|
|
@@ -177,7 +135,6 @@ export function registerSafetyHooks(pi) {
|
|
|
177
135
|
"Cancel commit",
|
|
178
136
|
]);
|
|
179
137
|
if (choice === "Run shazam_verify first (Recommended)") {
|
|
180
|
-
// Block the commit and suggest running verify
|
|
181
138
|
return {
|
|
182
139
|
block: true,
|
|
183
140
|
reason: "Run shazam_verify first, then try committing again.",
|
|
@@ -193,7 +150,7 @@ export function registerSafetyHooks(pi) {
|
|
|
193
150
|
}
|
|
194
151
|
catch {
|
|
195
152
|
// Non-interactive mode: just warn but allow
|
|
196
|
-
ctx.ui.notify
|
|
153
|
+
ctx.ui.notify("[shazam] Tip: Run shazam_verify before committing to catch errors early.", "warning");
|
|
197
154
|
}
|
|
198
155
|
}
|
|
199
156
|
}
|
package/dist/hooks/safety.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"safety.js","sourceRoot":"","sources":["../../hooks/safety.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"safety.js","sourceRoot":"","sources":["../../hooks/safety.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
* - before_agent_start: inject shazam tool list into system prompt
|
|
6
6
|
* - tool_result (write/edit): auto-format + suggest running shazam_verify
|
|
7
7
|
* - tool_result (shazam_symbol): suggest call_chain when symbol has many callers
|
|
8
|
-
* - tool_call (
|
|
9
|
-
* - tool_call (
|
|
8
|
+
* - tool_call (shazam_impact): suggest running shazam_verify first
|
|
9
|
+
* - tool_call (shazam_rename_symbol): suggest running shazam_call_chain first
|
|
10
10
|
*
|
|
11
11
|
* Auto-format feature (v0.6.4):
|
|
12
12
|
* - After write/edit, detect file type and run native formatter
|
|
@@ -70,7 +70,7 @@ async function autoFormatFile(filePath, ctx) {
|
|
|
70
70
|
existsSync(join(projectRoot, "pyproject.toml"));
|
|
71
71
|
if (hasRuff) {
|
|
72
72
|
execSync(`ruff format "${absPath}"`, { cwd: projectRoot, timeout: 10000, stdio: "pipe" });
|
|
73
|
-
ctx.ui
|
|
73
|
+
ctx.ui.notify(`[auto-format] Formatted ${filePath} with ruff`, "info");
|
|
74
74
|
return true;
|
|
75
75
|
}
|
|
76
76
|
}
|
|
@@ -83,7 +83,7 @@ async function autoFormatFile(filePath, ctx) {
|
|
|
83
83
|
existsSync(join(projectRoot, "prettier.config.mjs"));
|
|
84
84
|
if (hasPrettier) {
|
|
85
85
|
execSync(`npx prettier --write "${absPath}"`, { cwd: projectRoot, timeout: 15000, stdio: "pipe" });
|
|
86
|
-
ctx.ui
|
|
86
|
+
ctx.ui.notify(`[auto-format] Formatted ${filePath} with prettier`, "info");
|
|
87
87
|
return true;
|
|
88
88
|
}
|
|
89
89
|
// Biome
|
|
@@ -91,26 +91,26 @@ async function autoFormatFile(filePath, ctx) {
|
|
|
91
91
|
existsSync(join(projectRoot, "biome.jsonc"));
|
|
92
92
|
if (hasBiome) {
|
|
93
93
|
execSync(`npx biome format --write "${absPath}"`, { cwd: projectRoot, timeout: 15000, stdio: "pipe" });
|
|
94
|
-
ctx.ui
|
|
94
|
+
ctx.ui.notify(`[auto-format] Formatted ${filePath} with biome`, "info");
|
|
95
95
|
return true;
|
|
96
96
|
}
|
|
97
97
|
}
|
|
98
98
|
// Go: gofmt
|
|
99
99
|
if (ext === ".go") {
|
|
100
100
|
execSync(`gofmt -w "${absPath}"`, { cwd: projectRoot, timeout: 10000, stdio: "pipe" });
|
|
101
|
-
ctx.ui
|
|
101
|
+
ctx.ui.notify(`[auto-format] Formatted ${filePath} with gofmt`, "info");
|
|
102
102
|
return true;
|
|
103
103
|
}
|
|
104
104
|
// Rust: rustfmt
|
|
105
105
|
if (ext === ".rs") {
|
|
106
106
|
execSync(`rustfmt "${absPath}"`, { cwd: projectRoot, timeout: 10000, stdio: "pipe" });
|
|
107
|
-
ctx.ui
|
|
107
|
+
ctx.ui.notify(`[auto-format] Formatted ${filePath} with rustfmt`, "info");
|
|
108
108
|
return true;
|
|
109
109
|
}
|
|
110
110
|
}
|
|
111
111
|
catch (err) {
|
|
112
112
|
// Formatter failed — warn but don't block
|
|
113
|
-
ctx.ui
|
|
113
|
+
ctx.ui.notify(`[auto-format] Formatter failed for ${filePath}: ${err instanceof Error ? err.message : String(err)}`, "warning");
|
|
114
114
|
return true; // We attempted formatting
|
|
115
115
|
}
|
|
116
116
|
return false; // No formatter found
|
|
@@ -142,11 +142,11 @@ export function registerShazamGuide(pi) {
|
|
|
142
142
|
const formatted = filePath ? await autoFormatFile(filePath, ctx) : false;
|
|
143
143
|
// If no native formatter found, suggest shazam_fix
|
|
144
144
|
if (!formatted) {
|
|
145
|
-
ctx.ui
|
|
145
|
+
ctx.ui.notify("run shazam_fix to auto-format (prettier/ruff/gofmt/rustfmt)", "info");
|
|
146
146
|
}
|
|
147
147
|
// Check if multi-file edit was done — suggest impact analysis
|
|
148
148
|
if (hasMultiFileEdit(event.content)) {
|
|
149
|
-
ctx.ui
|
|
149
|
+
ctx.ui.notify("suggestion: you edited multiple files — shazam_impact assesses blast radius before continuing", "info");
|
|
150
150
|
}
|
|
151
151
|
return;
|
|
152
152
|
}
|
|
@@ -154,7 +154,7 @@ export function registerShazamGuide(pi) {
|
|
|
154
154
|
if (event.toolName === "shazam_symbol") {
|
|
155
155
|
const symbolName = hasManyCallers(event.content);
|
|
156
156
|
if (symbolName && !event.isError) {
|
|
157
|
-
ctx.ui
|
|
157
|
+
ctx.ui.notify(`recommended: shazam_call_chain --symbol ${symbolName} traces all callers before changing this symbol`, "info");
|
|
158
158
|
}
|
|
159
159
|
return;
|
|
160
160
|
}
|
|
@@ -169,10 +169,10 @@ export function registerShazamGuide(pi) {
|
|
|
169
169
|
}
|
|
170
170
|
const combined = texts.join("\n");
|
|
171
171
|
if (combined.includes("[FAIL]")) {
|
|
172
|
-
ctx.ui
|
|
172
|
+
ctx.ui.notify("shazam_verify reported FAIL — fix errors before proceeding", "warning");
|
|
173
173
|
}
|
|
174
174
|
else if (combined.includes("[WARN]")) {
|
|
175
|
-
ctx.ui
|
|
175
|
+
ctx.ui.notify("shazam_verify reported WARN — review warnings, then run shazam_fix if needed", "info");
|
|
176
176
|
}
|
|
177
177
|
return;
|
|
178
178
|
}
|
|
@@ -181,12 +181,12 @@ export function registerShazamGuide(pi) {
|
|
|
181
181
|
const name = event.toolName;
|
|
182
182
|
// Before impact: suggest verifying first if there are uncommitted changes
|
|
183
183
|
if (name === "shazam_impact") {
|
|
184
|
-
ctx.ui
|
|
184
|
+
ctx.ui.notify("tip: run shazam_verify first to establish a baseline before assessing impact", "info");
|
|
185
185
|
return;
|
|
186
186
|
}
|
|
187
187
|
// Before rename_symbol: suggest call_chain first
|
|
188
188
|
if (name === "shazam_rename_symbol") {
|
|
189
|
-
ctx.ui
|
|
189
|
+
ctx.ui.notify("tip: run shazam_call_chain first to verify all references before renaming", "info");
|
|
190
190
|
return;
|
|
191
191
|
}
|
|
192
192
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shazam-guide.js","sourceRoot":"","sources":["../../hooks/shazam-guide.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"shazam-guide.js","sourceRoot":"","sources":["../../hooks/shazam-guide.ts"],"names":[],"mappings":"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"}
|
|
@@ -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
|
|
11
|
+
* Tracks verify calls via shared verify-state module.
|
|
12
12
|
*/
|
|
13
13
|
import type { ExtensionAPI } from "../types/pi-extension.js";
|
|
14
14
|
/**
|
|
15
15
|
* Register the stop-verify hook.
|
|
16
16
|
*
|
|
17
|
-
* On tool_result for shazam_verify, marks verify as called.
|
|
17
|
+
* On tool_result for shazam_verify, marks verify as called and clears edit tracker.
|
|
18
|
+
* On tool_call for write/edit after verify, resets verify flag (post-verify edit detection).
|
|
18
19
|
* On turn_end, checks if there were file edits that haven't been verified.
|
|
19
20
|
*/
|
|
20
21
|
export declare function registerStopVerify(pi: ExtensionAPI): void;
|
|
@@ -1 +1 @@
|
|
|
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;
|
|
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;AAI7D;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CA6CzD"}
|
|
@@ -8,49 +8,34 @@
|
|
|
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
|
|
11
|
+
* Tracks verify calls via shared verify-state module.
|
|
12
12
|
*/
|
|
13
|
-
import { getEditedFiles } from "./pre-edit.js";
|
|
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).
|
|
29
|
-
*/
|
|
30
|
-
function hasRecentVerify() {
|
|
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;
|
|
36
|
-
}
|
|
13
|
+
import { getEditedFiles, clearEditedFiles } from "./pre-edit.js";
|
|
14
|
+
import { markVerifyCalled, hasRecentVerify, onNewEdit, resetVerifyState } from "./verify-state.js";
|
|
37
15
|
/**
|
|
38
16
|
* Register the stop-verify hook.
|
|
39
17
|
*
|
|
40
|
-
* On tool_result for shazam_verify, marks verify as called.
|
|
18
|
+
* On tool_result for shazam_verify, marks verify as called and clears edit tracker.
|
|
19
|
+
* On tool_call for write/edit after verify, resets verify flag (post-verify edit detection).
|
|
41
20
|
* On turn_end, checks if there were file edits that haven't been verified.
|
|
42
21
|
*/
|
|
43
22
|
export function registerStopVerify(pi) {
|
|
44
|
-
// Track shazam_verify calls
|
|
23
|
+
// Track shazam_verify calls and clear edit history (edits are now verified)
|
|
45
24
|
pi.on("tool_result", (event) => {
|
|
46
25
|
if (event.toolName === "shazam_verify" && !event.isError) {
|
|
47
26
|
markVerifyCalled();
|
|
27
|
+
clearEditedFiles();
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
// Reset verify flag when new edits happen after verify
|
|
31
|
+
pi.on("tool_call", (event) => {
|
|
32
|
+
if (event.toolName === "write" || event.toolName === "edit") {
|
|
33
|
+
onNewEdit();
|
|
48
34
|
}
|
|
49
35
|
});
|
|
50
36
|
// Reset on session start
|
|
51
37
|
pi.on("session_start", () => {
|
|
52
|
-
|
|
53
|
-
_lastVerifyTimestamp = 0;
|
|
38
|
+
resetVerifyState();
|
|
54
39
|
});
|
|
55
40
|
// Check on turn end
|
|
56
41
|
pi.on("turn_end", (_event, _ctx) => {
|
|
@@ -1 +1 @@
|
|
|
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;
|
|
1
|
+
{"version":3,"file":"stop-verify.js","sourceRoot":"","sources":["../../hooks/stop-verify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAEnG;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,EAAgB;IAClD,4EAA4E;IAC5E,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;YACnB,gBAAgB,EAAE,CAAC;QACpB,CAAC;IACF,CAAC,CAAC,CAAC;IAEH,uDAAuD;IACvD,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE;QAC5B,IAAI,KAAK,CAAC,QAAQ,KAAK,OAAO,IAAI,KAAK,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;YAC7D,SAAS,EAAE,CAAC;QACb,CAAC;IACF,CAAC,CAAC,CAAC;IAEH,yBAAyB;IACzB,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,GAAG,EAAE;QAC3B,gBAAgB,EAAE,CAAC;IACpB,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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-logger.d.ts","sourceRoot":"","sources":["../../hooks/tool-logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"tool-logger.d.ts","sourceRoot":"","sources":["../../hooks/tool-logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AA6D7D,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAuDzD"}
|
|
@@ -30,6 +30,7 @@ function write(entry) {
|
|
|
30
30
|
try {
|
|
31
31
|
ensureDir();
|
|
32
32
|
appendFileSync(LOG_FILE, JSON.stringify(entry) + "\n", "utf-8");
|
|
33
|
+
_writeFailed = false;
|
|
33
34
|
}
|
|
34
35
|
catch (err) {
|
|
35
36
|
if (!_writeFailed) {
|
|
@@ -57,6 +58,10 @@ function summarize(v) {
|
|
|
57
58
|
}
|
|
58
59
|
return v;
|
|
59
60
|
}
|
|
61
|
+
function cleanupState() {
|
|
62
|
+
_starts.clear();
|
|
63
|
+
_writeFailed = false;
|
|
64
|
+
}
|
|
60
65
|
export function registerToolLogger(pi) {
|
|
61
66
|
pi.on("tool_call", (event, ctx) => {
|
|
62
67
|
if (!isShazam(event.toolName))
|
|
@@ -101,5 +106,12 @@ export function registerToolLogger(pi) {
|
|
|
101
106
|
result: truncated,
|
|
102
107
|
});
|
|
103
108
|
});
|
|
109
|
+
// Clean up orphaned entries on session boundaries
|
|
110
|
+
pi.on("session_start", () => {
|
|
111
|
+
cleanupState();
|
|
112
|
+
});
|
|
113
|
+
pi.on("session_shutdown", () => {
|
|
114
|
+
cleanupState();
|
|
115
|
+
});
|
|
104
116
|
}
|
|
105
117
|
//# sourceMappingURL=tool-logger.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-logger.js","sourceRoot":"","sources":["../../hooks/tool-logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAC3D,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC;AACrD,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEhC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;AAC1C,IAAI,YAAY,GAAG,KAAK,CAAC;AAEzB,SAAS,SAAS;IACjB,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,EAAE;IACV,MAAM,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;IACrB,MAAM,GAAG,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC9D,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC;IACnC,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IAClC,MAAM,EAAE,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;IACrF,OAAO,GAAG,CAAC,CAAC,WAAW,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC;AAClJ,CAAC;AAED,SAAS,KAAK,CAAC,KAA8B;IAC5C,IAAI,CAAC;QACJ,SAAS,EAAE,CAAC;QACZ,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"tool-logger.js","sourceRoot":"","sources":["../../hooks/tool-logger.ts"],"names":[],"mappings":"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"}
|