@slope-dev/slope 1.55.11 → 1.56.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/cli/atomic-write.d.ts +9 -0
- package/dist/cli/atomic-write.d.ts.map +1 -0
- package/dist/cli/atomic-write.js +89 -0
- package/dist/cli/atomic-write.js.map +1 -0
- package/dist/cli/commands/auto-card.d.ts.map +1 -1
- package/dist/cli/commands/auto-card.js +17 -12
- package/dist/cli/commands/auto-card.js.map +1 -1
- package/dist/cli/commands/briefing.d.ts.map +1 -1
- package/dist/cli/commands/briefing.js +21 -3
- package/dist/cli/commands/briefing.js.map +1 -1
- package/dist/cli/commands/claim.d.ts.map +1 -1
- package/dist/cli/commands/claim.js +31 -3
- package/dist/cli/commands/claim.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +32 -11
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/guard.d.ts.map +1 -1
- package/dist/cli/commands/guard.js +14 -0
- package/dist/cli/commands/guard.js.map +1 -1
- package/dist/cli/commands/init.d.ts +1 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +189 -13
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/next.d.ts.map +1 -1
- package/dist/cli/commands/next.js +3 -2
- package/dist/cli/commands/next.js.map +1 -1
- package/dist/cli/commands/pr.d.ts.map +1 -1
- package/dist/cli/commands/pr.js +27 -0
- package/dist/cli/commands/pr.js.map +1 -1
- package/dist/cli/commands/review-state.d.ts +2 -0
- package/dist/cli/commands/review-state.d.ts.map +1 -1
- package/dist/cli/commands/review-state.js +28 -11
- package/dist/cli/commands/review-state.js.map +1 -1
- package/dist/cli/commands/review.d.ts.map +1 -1
- package/dist/cli/commands/review.js +7 -6
- package/dist/cli/commands/review.js.map +1 -1
- package/dist/cli/commands/roadmap.d.ts.map +1 -1
- package/dist/cli/commands/roadmap.js +20 -5
- package/dist/cli/commands/roadmap.js.map +1 -1
- package/dist/cli/commands/skills.d.ts +2 -0
- package/dist/cli/commands/skills.d.ts.map +1 -0
- package/dist/cli/commands/skills.js +124 -0
- package/dist/cli/commands/skills.js.map +1 -0
- package/dist/cli/commands/sprint-plan.js +8 -8
- package/dist/cli/commands/sprint-plan.js.map +1 -1
- package/dist/cli/commands/sprint.d.ts.map +1 -1
- package/dist/cli/commands/sprint.js +111 -25
- package/dist/cli/commands/sprint.js.map +1 -1
- package/dist/cli/commands/store.d.ts +1 -0
- package/dist/cli/commands/store.d.ts.map +1 -1
- package/dist/cli/commands/store.js +72 -5
- package/dist/cli/commands/store.js.map +1 -1
- package/dist/cli/commands/validate.d.ts +1 -1
- package/dist/cli/commands/validate.d.ts.map +1 -1
- package/dist/cli/commands/validate.js +31 -10
- package/dist/cli/commands/validate.js.map +1 -1
- package/dist/cli/commands/worktree.d.ts.map +1 -1
- package/dist/cli/commands/worktree.js +203 -8
- package/dist/cli/commands/worktree.js.map +1 -1
- package/dist/cli/guards/claim-required.d.ts.map +1 -1
- package/dist/cli/guards/claim-required.js +23 -25
- package/dist/cli/guards/claim-required.js.map +1 -1
- package/dist/cli/guards/docs.js +2 -2
- package/dist/cli/guards/docs.js.map +1 -1
- package/dist/cli/guards/hazard.d.ts.map +1 -1
- package/dist/cli/guards/hazard.js +148 -52
- package/dist/cli/guards/hazard.js.map +1 -1
- package/dist/cli/guards/hook-input.d.ts +15 -0
- package/dist/cli/guards/hook-input.d.ts.map +1 -0
- package/dist/cli/guards/hook-input.js +89 -0
- package/dist/cli/guards/hook-input.js.map +1 -0
- package/dist/cli/guards/pr-review.d.ts.map +1 -1
- package/dist/cli/guards/pr-review.js +3 -2
- package/dist/cli/guards/pr-review.js.map +1 -1
- package/dist/cli/guards/roadmap-edit-shipped.d.ts.map +1 -1
- package/dist/cli/guards/roadmap-edit-shipped.js +109 -16
- package/dist/cli/guards/roadmap-edit-shipped.js.map +1 -1
- package/dist/cli/guards/scope-drift.d.ts.map +1 -1
- package/dist/cli/guards/scope-drift.js +25 -15
- package/dist/cli/guards/scope-drift.js.map +1 -1
- package/dist/cli/guards/session-briefing.d.ts.map +1 -1
- package/dist/cli/guards/session-briefing.js +10 -6
- package/dist/cli/guards/session-briefing.js.map +1 -1
- package/dist/cli/guards/sprint-completion.js +10 -4
- package/dist/cli/guards/sprint-completion.js.map +1 -1
- package/dist/cli/guards/workflow-gate.js +6 -5
- package/dist/cli/guards/workflow-gate.js.map +1 -1
- package/dist/cli/guards/worktree-check.js +1 -1
- package/dist/cli/guards/worktree-check.js.map +1 -1
- package/dist/cli/index.js +14 -5
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/registry.d.ts.map +1 -1
- package/dist/cli/registry.js +20 -1
- package/dist/cli/registry.js.map +1 -1
- package/dist/cli/session-state.d.ts +1 -1
- package/dist/cli/session-state.d.ts.map +1 -1
- package/dist/cli/session-state.js +76 -57
- package/dist/cli/session-state.js.map +1 -1
- package/dist/cli/sprint-inference.d.ts.map +1 -1
- package/dist/cli/sprint-inference.js +2 -2
- package/dist/cli/sprint-inference.js.map +1 -1
- package/dist/cli/sprint-state.d.ts +3 -1
- package/dist/cli/sprint-state.d.ts.map +1 -1
- package/dist/cli/sprint-state.js +41 -25
- package/dist/cli/sprint-state.js.map +1 -1
- package/dist/core/analytics.d.ts +2 -1
- package/dist/core/analytics.d.ts.map +1 -1
- package/dist/core/analytics.js +25 -2
- package/dist/core/analytics.js.map +1 -1
- package/dist/core/analyzers/git.d.ts +3 -1
- package/dist/core/analyzers/git.d.ts.map +1 -1
- package/dist/core/analyzers/git.js +4 -2
- package/dist/core/analyzers/git.js.map +1 -1
- package/dist/core/briefing.d.ts +30 -0
- package/dist/core/briefing.d.ts.map +1 -1
- package/dist/core/briefing.js +272 -1
- package/dist/core/briefing.js.map +1 -1
- package/dist/core/builder.d.ts +5 -0
- package/dist/core/builder.d.ts.map +1 -1
- package/dist/core/builder.js +5 -0
- package/dist/core/builder.js.map +1 -1
- package/dist/core/config.d.ts +2 -0
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +1 -0
- package/dist/core/config.js.map +1 -1
- package/dist/core/guard.d.ts +4 -0
- package/dist/core/guard.d.ts.map +1 -1
- package/dist/core/guard.js.map +1 -1
- package/dist/core/index.d.ts +6 -4
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +4 -2
- package/dist/core/index.js.map +1 -1
- package/dist/core/loader.js +2 -2
- package/dist/core/loader.js.map +1 -1
- package/dist/core/roadmap.d.ts +7 -3
- package/dist/core/roadmap.d.ts.map +1 -1
- package/dist/core/roadmap.js +37 -4
- package/dist/core/roadmap.js.map +1 -1
- package/dist/core/skills.d.ts +59 -0
- package/dist/core/skills.d.ts.map +1 -0
- package/dist/core/skills.js +333 -0
- package/dist/core/skills.js.map +1 -0
- package/dist/core/types.d.ts +10 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/validation.d.ts +4 -1
- package/dist/core/validation.d.ts.map +1 -1
- package/dist/core/validation.js +51 -1
- package/dist/core/validation.js.map +1 -1
- package/dist/mcp/index.d.ts +2 -0
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +13 -8
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/registry.d.ts +1 -0
- package/dist/mcp/registry.d.ts.map +1 -1
- package/dist/mcp/registry.js +20 -10
- package/dist/mcp/registry.js.map +1 -1
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/index.js +5 -1
- package/dist/store/index.js.map +1 -1
- package/dist/store/sqlite-memory-backend.d.ts.map +1 -1
- package/dist/store/sqlite-memory-backend.js +6 -1
- package/dist/store/sqlite-memory-backend.js.map +1 -1
- package/package.json +1 -1
- package/templates/codex/plugins/slope/.codex-plugin/plugin.json +10 -7
- package/templates/codex/plugins/slope/.mcp.json +8 -0
- package/templates/codex/plugins/slope/hooks/slope-guard.sh +3 -1
- package/templates/codex/plugins/slope/hooks.json +211 -10
- package/templates/codex/plugins/slope/skills/slope-guard-warning/SKILL.md +28 -0
- package/templates/codex/plugins/slope/skills/slope-setup/SKILL.md +29 -0
- package/templates/codex/plugins/slope/skills/slope-sprint/SKILL.md +34 -0
|
@@ -7,6 +7,7 @@ import { inferSprintContext } from '../sprint-inference.js';
|
|
|
7
7
|
import { loadSprintState } from '../sprint-state.js';
|
|
8
8
|
import { loadSessionState, updateSessionState } from '../session-state.js';
|
|
9
9
|
import { resolveStore } from '../store.js';
|
|
10
|
+
import { normalizeTouchedPath, resolveTouchedPaths } from './hook-input.js';
|
|
10
11
|
const IMPLEMENTATION_DIRS = [
|
|
11
12
|
'app/',
|
|
12
13
|
'client/',
|
|
@@ -107,8 +108,7 @@ export async function claimRequiredGuard(input, cwd) {
|
|
|
107
108
|
catch { /* claims unavailable */ }
|
|
108
109
|
}
|
|
109
110
|
else if (!sprintState) {
|
|
110
|
-
const
|
|
111
|
-
const relativePath = normalizeHookPath(filePath, cwd);
|
|
111
|
+
const relativePath = findImplementationWritePath(input, cwd);
|
|
112
112
|
if (!relativePath || !isImplementationWritePath(relativePath))
|
|
113
113
|
return {};
|
|
114
114
|
const hint = inferMissingSprintHint(cwd);
|
|
@@ -122,8 +122,7 @@ export async function claimRequiredGuard(input, cwd) {
|
|
|
122
122
|
]);
|
|
123
123
|
}
|
|
124
124
|
else {
|
|
125
|
-
const
|
|
126
|
-
const relativePath = normalizeHookPath(filePath, cwd);
|
|
125
|
+
const relativePath = findImplementationWritePath(input, cwd);
|
|
127
126
|
if (!relativePath || !isImplementationWritePath(relativePath))
|
|
128
127
|
return {};
|
|
129
128
|
return implementationWritePolicyResult(policy, [
|
|
@@ -203,15 +202,13 @@ function implementationWritePolicyResult(policy, lines) {
|
|
|
203
202
|
context: lines.join('\n'),
|
|
204
203
|
};
|
|
205
204
|
}
|
|
206
|
-
function
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
: normalizedPath;
|
|
214
|
-
return relativePath.replace(/^\.\//, '');
|
|
205
|
+
function findImplementationWritePath(input, cwd) {
|
|
206
|
+
for (const touchedPath of resolveTouchedPaths(input)) {
|
|
207
|
+
const relativePath = normalizeTouchedPath(touchedPath, cwd);
|
|
208
|
+
if (relativePath && isImplementationWritePath(relativePath))
|
|
209
|
+
return relativePath;
|
|
210
|
+
}
|
|
211
|
+
return null;
|
|
215
212
|
}
|
|
216
213
|
export function isImplementationWritePath(relativePath) {
|
|
217
214
|
const path = relativePath.replace(/\\/g, '/').replace(/^\.\//, '');
|
|
@@ -248,13 +245,11 @@ export function claimOverlapsPath(scope, target, relativePath, fileArea) {
|
|
|
248
245
|
* Returns a warning string if overlap found, null otherwise.
|
|
249
246
|
*/
|
|
250
247
|
async function detectCrossSessionOverlap(input, cwd, sprintNumber) {
|
|
251
|
-
const
|
|
252
|
-
|
|
248
|
+
const relativePaths = resolveTouchedPaths(input)
|
|
249
|
+
.map(filePath => normalizeTouchedPath(filePath, cwd))
|
|
250
|
+
.filter((filePath) => Boolean(filePath));
|
|
251
|
+
if (relativePaths.length === 0)
|
|
253
252
|
return null;
|
|
254
|
-
const relativePath = filePath.startsWith(cwd)
|
|
255
|
-
? filePath.slice(cwd.length + 1)
|
|
256
|
-
: filePath;
|
|
257
|
-
const fileArea = dirname(relativePath);
|
|
258
253
|
try {
|
|
259
254
|
const store = await resolveStore(cwd);
|
|
260
255
|
const claims = await store.list(sprintNumber);
|
|
@@ -262,12 +257,15 @@ async function detectCrossSessionOverlap(input, cwd, sprintNumber) {
|
|
|
262
257
|
store.close();
|
|
263
258
|
// Find claims from OTHER sessions that overlap with this file's area
|
|
264
259
|
const otherClaims = claims.filter(c => c.session_id && c.session_id !== input.session_id);
|
|
265
|
-
for (const
|
|
266
|
-
const
|
|
267
|
-
|
|
268
|
-
const
|
|
269
|
-
|
|
270
|
-
|
|
260
|
+
for (const relativePath of relativePaths) {
|
|
261
|
+
const fileArea = dirname(relativePath);
|
|
262
|
+
for (const claim of otherClaims) {
|
|
263
|
+
const overlaps = claimOverlapsPath(claim.scope, claim.target, relativePath, fileArea);
|
|
264
|
+
if (overlaps) {
|
|
265
|
+
const agent = sessions.find(s => s.session_id === claim.session_id);
|
|
266
|
+
const agentDesc = agent?.agent_role ?? agent?.role ?? 'another agent';
|
|
267
|
+
return `SLOPE multi-agent: ${relativePath} overlaps with ${agentDesc}'s claim on "${claim.target}". Coordinate to avoid conflicts.`;
|
|
268
|
+
}
|
|
271
269
|
}
|
|
272
270
|
}
|
|
273
271
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claim-required.js","sourceRoot":"","sources":["../../../src/cli/guards/claim-required.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"claim-required.js","sourceRoot":"","sources":["../../../src/cli/guards/claim-required.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/guards/docs.js
CHANGED
|
@@ -10,8 +10,8 @@ export const GUARD_DOCS = {
|
|
|
10
10
|
hazard: {
|
|
11
11
|
purpose: 'Warns about known issues and recurring patterns in file areas being edited. Prevents the agent from repeating past mistakes.',
|
|
12
12
|
triggers: 'PreToolUse on Edit, Write. Fires when the agent is about to modify a file.',
|
|
13
|
-
behavior: 'Advisory — injects context with relevant hazards
|
|
14
|
-
configuration: 'guidance.hazardRecency (default: 5) controls how many
|
|
13
|
+
behavior: 'Advisory — injects context with relevant hazards for the file area being edited. Source precedence is common-issues.json first, recent scorecard shot hazards and bunker locations second, then compact cached guard state.',
|
|
14
|
+
configuration: 'guidance.hazardRecency (default: 5) controls how many recent scorecards the fallback source reads. Disable: add "hazard" to guidance.disabled.',
|
|
15
15
|
level: 'full',
|
|
16
16
|
},
|
|
17
17
|
'commit-nudge': {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docs.js","sourceRoot":"","sources":["../../../src/cli/guards/docs.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAehF,MAAM,CAAC,MAAM,UAAU,GAA6B;IAClD,OAAO,EAAE;QACP,OAAO,EAAE,gKAAgK;QACzK,QAAQ,EAAE,qFAAqF;QAC/F,QAAQ,EAAE,oJAAoJ;QAC9J,aAAa,EAAE,0HAA0H;QACzI,KAAK,EAAE,MAAM;KACd;IACD,MAAM,EAAE;QACN,OAAO,EAAE,8HAA8H;QACvI,QAAQ,EAAE,4EAA4E;QACtF,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"docs.js","sourceRoot":"","sources":["../../../src/cli/guards/docs.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAehF,MAAM,CAAC,MAAM,UAAU,GAA6B;IAClD,OAAO,EAAE;QACP,OAAO,EAAE,gKAAgK;QACzK,QAAQ,EAAE,qFAAqF;QAC/F,QAAQ,EAAE,oJAAoJ;QAC9J,aAAa,EAAE,0HAA0H;QACzI,KAAK,EAAE,MAAM;KACd;IACD,MAAM,EAAE;QACN,OAAO,EAAE,8HAA8H;QACvI,QAAQ,EAAE,4EAA4E;QACtF,QAAQ,EAAE,6NAA6N;QACvO,aAAa,EAAE,gJAAgJ;QAC/J,KAAK,EAAE,MAAM;KACd;IACD,cAAc,EAAE;QACd,OAAO,EAAE,kGAAkG;QAC3G,QAAQ,EAAE,wEAAwE;QAClF,QAAQ,EAAE,uHAAuH;QACjI,aAAa,EAAE,+HAA+H;QAC9I,KAAK,EAAE,MAAM;KACd;IACD,aAAa,EAAE;QACb,OAAO,EAAE,wHAAwH;QACjI,QAAQ,EAAE,yEAAyE;QACnF,QAAQ,EAAE,6IAA6I;QACvJ,aAAa,EAAE,wGAAwG;QACvH,KAAK,EAAE,MAAM;KACd;IACD,UAAU,EAAE;QACV,OAAO,EAAE,6IAA6I;QACtJ,QAAQ,EAAE,2EAA2E;QACrF,QAAQ,EAAE,6GAA6G;QACvH,aAAa,EAAE,2IAA2I;QAC1J,KAAK,EAAE,MAAM;KACd;IACD,YAAY,EAAE;QACZ,OAAO,EAAE,wGAAwG;QACjH,QAAQ,EAAE,+CAA+C;QACzD,QAAQ,EAAE,kIAAkI;QAC5I,aAAa,EAAE,iDAAiD;QAChE,KAAK,EAAE,MAAM;KACd;IACD,eAAe,EAAE;QACf,OAAO,EAAE,0IAA0I;QACnJ,QAAQ,EAAE,gEAAgE;QAC1E,QAAQ,EAAE,oHAAoH;QAC9H,aAAa,EAAE,yGAAyG;QACxH,KAAK,EAAE,MAAM;KACd;IACD,YAAY,EAAE;QACZ,OAAO,EAAE,qHAAqH;QAC9H,QAAQ,EAAE,6FAA6F;QACvG,QAAQ,EAAE,uGAAuG;QACjH,aAAa,EAAE,iJAAiJ;QAChK,KAAK,EAAE,MAAM;KACd;IACD,eAAe,EAAE;QACf,OAAO,EAAE,iGAAiG;QAC1G,QAAQ,EAAE,4EAA4E;QACtF,QAAQ,EAAE,yHAAyH;QACnI,aAAa,EAAE,2HAA2H;QAC1I,KAAK,EAAE,MAAM;KACd;IACD,aAAa,EAAE;QACb,OAAO,EAAE,6GAA6G;QACtH,QAAQ,EAAE,qGAAqG;QAC/G,QAAQ,EAAE,+HAA+H;QACzI,aAAa,EAAE,kDAAkD;QACjE,KAAK,EAAE,MAAM;KACd;IACD,eAAe,EAAE;QACf,OAAO,EAAE,qGAAqG;QAC9G,QAAQ,EAAE,+FAA+F;QACzG,QAAQ,EAAE,uIAAuI;QACjJ,aAAa,EAAE,oDAAoD;QACnE,KAAK,EAAE,MAAM;KACd;IACD,aAAa,EAAE;QACb,OAAO,EAAE,qGAAqG;QAC9G,QAAQ,EAAE,mFAAmF;QAC7F,QAAQ,EAAE,wHAAwH;QAClI,aAAa,EAAE,6FAA6F;QAC5G,KAAK,EAAE,MAAM;KACd;IACD,aAAa,EAAE;QACb,OAAO,EAAE,iGAAiG;QAC1G,QAAQ,EAAE,+CAA+C;QACzD,QAAQ,EAAE,uHAAuH;QACjI,aAAa,EAAE,kDAAkD;QACjE,KAAK,EAAE,MAAM;KACd;IACD,WAAW,EAAE;QACX,OAAO,EAAE,wFAAwF;QACjG,QAAQ,EAAE,yFAAyF;QACnG,QAAQ,EAAE,2NAA2N;QACrO,aAAa,EAAE,gDAAgD;QAC/D,KAAK,EAAE,MAAM;KACd;IACD,UAAU,EAAE;QACV,OAAO,EAAE,+GAA+G;QACxH,QAAQ,EAAE,wDAAwD;QAClE,QAAQ,EAAE,gGAAgG;QAC1G,aAAa,EAAE,iDAAiD;QAChE,KAAK,EAAE,MAAM;KACd;IACD,sBAAsB,EAAE;QACtB,OAAO,EAAE,mGAAmG;QAC5G,QAAQ,EAAE,+GAA+G;QACzH,QAAQ,EAAE,iHAAiH;QAC3H,aAAa,EAAE,0KAA0K;QACzL,KAAK,EAAE,MAAM;KACd;IACD,gBAAgB,EAAE;QAChB,OAAO,EAAE,qIAAqI;QAC9I,QAAQ,EAAE,8EAA8E;QACxF,QAAQ,EAAE,8HAA8H;QACxI,aAAa,EAAE,qDAAqD;QACpE,KAAK,EAAE,MAAM;KACd;IACD,gBAAgB,EAAE;QAChB,OAAO,EAAE,qLAAqL;QAC9L,QAAQ,EAAE,gGAAgG;QAC1G,QAAQ,EAAE,iMAAiM;QAC3M,aAAa,EAAE,yNAAyN;QACxO,KAAK,EAAE,MAAM;KACd;IACD,mBAAmB,EAAE;QACnB,OAAO,EAAE,kIAAkI;QAC3I,QAAQ,EAAE,sHAAsH;QAChI,QAAQ,EAAE,yHAAyH;QACnI,aAAa,EAAE,uHAAuH;QACtI,KAAK,EAAE,MAAM;KACd;IACD,gBAAgB,EAAE;QAChB,OAAO,EAAE,0HAA0H;QACnI,QAAQ,EAAE,+GAA+G;QACzH,QAAQ,EAAE,oHAAoH;QAC9H,aAAa,EAAE,qDAAqD;QACpE,KAAK,EAAE,MAAM;KACd;CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,IAAa;IAC3C,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,CAAC,KAAK,CAAC,mBAAmB,IAAI,GAAG,CAAC,CAAC;YAC1C,OAAO,CAAC,KAAK,CAAC,qBAAqB,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,aAAa,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACzB,OAAO;IACT,CAAC;IAED,mCAAmC;IACnC,MAAM,OAAO,GAA6B,EAAE,CAAC;IAC7C,KAAK,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QAC1D,6CAA6C;QAC7C,MAAM,UAAU,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC;QACzC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QACzC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAE7C,MAAM,UAAU,GAAG,CAAC,YAAY,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;IACvE,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAE7C,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC;QAC3B,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YAC1B,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC;YACrE,OAAO,CAAC,GAAG,CAAC,OAAO,QAAQ,IAAI,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC9E,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;AAC7E,CAAC;AAED,SAAS,aAAa,CAAC,IAAY,EAAE,GAAa;IAChD,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,KAAK,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,qBAAqB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,qBAAqB,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,qBAAqB,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,qBAAqB,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,qBAAqB,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hazard.d.ts","sourceRoot":"","sources":["../../../src/cli/guards/hazard.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"hazard.d.ts","sourceRoot":"","sources":["../../../src/cli/guards/hazard.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAwDlE;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CA4ErF"}
|
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
import { readFileSync, existsSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
2
2
|
import { join, dirname } from 'node:path';
|
|
3
3
|
import { loadConfig } from '../config.js';
|
|
4
|
+
import { loadScorecards } from '../../core/index.js';
|
|
4
5
|
import { dedupGuardContext } from '../session-state.js';
|
|
6
|
+
import { normalizeTouchedPath, resolveTouchedPaths } from './hook-input.js';
|
|
5
7
|
const GUARD_STATE_DIR = '.slope/guard-state';
|
|
6
8
|
const STATE_FILE = 'hazard.json';
|
|
7
9
|
const MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000; // 7 days
|
|
10
|
+
const DEFAULT_HAZARD_RECENCY = 5;
|
|
11
|
+
const GENERIC_AREA_SEGMENTS = new Set(['src', 'test', 'tests', 'package', 'packages']);
|
|
8
12
|
function loadHazardState(cwd) {
|
|
9
13
|
try {
|
|
10
14
|
const path = join(cwd, GUARD_STATE_DIR, STATE_FILE);
|
|
@@ -38,74 +42,166 @@ function pruneState(state, currentSprint) {
|
|
|
38
42
|
* Writes state to disk so warnings survive context compaction.
|
|
39
43
|
*/
|
|
40
44
|
export async function hazardGuard(input, cwd) {
|
|
41
|
-
const
|
|
42
|
-
if (
|
|
43
|
-
return {};
|
|
44
|
-
const config = loadConfig();
|
|
45
|
-
const recency = config.guidance?.hazardRecency ?? 5;
|
|
45
|
+
const areas = resolveTouchedAreas(input, cwd);
|
|
46
|
+
if (areas.length === 0)
|
|
47
|
+
return { metricReason: 'no-file-path' };
|
|
48
|
+
const config = loadConfig(cwd);
|
|
46
49
|
const currentSprint = config.currentSprint ?? 0;
|
|
47
|
-
// Determine the area from the file path (use directory)
|
|
48
|
-
const area = dirname(filePath).replace(cwd + '/', '').replace(cwd, '');
|
|
49
|
-
if (!area || area === '.')
|
|
50
|
-
return {};
|
|
51
50
|
// Load and prune disk state
|
|
52
51
|
let state = loadHazardState(cwd);
|
|
53
52
|
state = pruneState(state, currentSprint);
|
|
54
|
-
|
|
55
|
-
const MAX_HAZARDS = 3;
|
|
56
|
-
const freshWarnings = [];
|
|
53
|
+
let issues = null;
|
|
57
54
|
try {
|
|
58
55
|
const issuesPath = join(cwd, config.commonIssuesPath);
|
|
59
56
|
if (existsSync(issuesPath)) {
|
|
60
|
-
|
|
61
|
-
const areaLower = area.toLowerCase();
|
|
62
|
-
for (const pattern of issues.recurring_patterns) {
|
|
63
|
-
// Check if pattern is relevant to this area
|
|
64
|
-
const text = `${pattern.title} ${pattern.description} ${pattern.prevention}`.toLowerCase();
|
|
65
|
-
if (text.includes(areaLower) || areaLower.split('/').some(seg => text.includes(seg))) {
|
|
66
|
-
const lastSprint = Math.max(...pattern.sprints_hit);
|
|
67
|
-
freshWarnings.push({ lastSprint, text: `[${pattern.category}] ${pattern.title} (S${lastSprint}) — ${pattern.prevention.slice(0, 80)}` });
|
|
68
|
-
}
|
|
69
|
-
}
|
|
57
|
+
issues = JSON.parse(readFileSync(issuesPath, 'utf8'));
|
|
70
58
|
}
|
|
71
59
|
}
|
|
72
60
|
catch { /* skip — common issues are optional */ }
|
|
73
|
-
|
|
61
|
+
const hazardRecency = config.guidance?.hazardRecency ?? DEFAULT_HAZARD_RECENCY;
|
|
62
|
+
let recentScorecards = null;
|
|
63
|
+
let scorecardSourceAvailable = false;
|
|
64
|
+
const loadRecentScorecards = () => {
|
|
65
|
+
if (recentScorecards)
|
|
66
|
+
return recentScorecards;
|
|
67
|
+
try {
|
|
68
|
+
const scorecards = loadScorecards(config, cwd);
|
|
69
|
+
recentScorecards = hazardRecency > 0 ? scorecards.slice(-hazardRecency) : scorecards;
|
|
70
|
+
scorecardSourceAvailable = recentScorecards.length > 0;
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
recentScorecards = [];
|
|
74
|
+
scorecardSourceAvailable = false;
|
|
75
|
+
}
|
|
76
|
+
return recentScorecards;
|
|
77
|
+
};
|
|
78
|
+
for (const area of areas) {
|
|
79
|
+
// Compute fresh warnings from common issues (ranked by recency)
|
|
80
|
+
const commonWarnings = computeFreshWarnings(area, issues);
|
|
81
|
+
const freshTexts = commonWarnings.length > 0
|
|
82
|
+
? commonWarnings
|
|
83
|
+
: computeScorecardWarnings(area, loadRecentScorecards());
|
|
84
|
+
// Merge fresh warnings with any disk-cached warnings for this area
|
|
85
|
+
const cached = state.entries.find(e => e.area === area);
|
|
86
|
+
const allWarnings = freshTexts.length > 0 ? freshTexts : (cached?.warnings ?? []);
|
|
87
|
+
if (freshTexts.length === 0 && cached) {
|
|
88
|
+
state.entries = state.entries.filter(e => e.area !== area);
|
|
89
|
+
saveHazardState(cwd, state);
|
|
90
|
+
}
|
|
91
|
+
// Persist fresh warnings to disk (update or add entry)
|
|
92
|
+
if (freshTexts.length > 0) {
|
|
93
|
+
const entry = {
|
|
94
|
+
area,
|
|
95
|
+
warnings: freshTexts,
|
|
96
|
+
sprint: currentSprint,
|
|
97
|
+
timestamp: Date.now(),
|
|
98
|
+
};
|
|
99
|
+
state.entries = state.entries.filter(e => e.area !== area);
|
|
100
|
+
state.entries.push(entry);
|
|
101
|
+
saveHazardState(cwd, state);
|
|
102
|
+
}
|
|
103
|
+
if (allWarnings.length === 0)
|
|
104
|
+
continue;
|
|
105
|
+
const fullContext = formatHazardContext(area, allWarnings);
|
|
106
|
+
// Session dedup: if this exact context was already injected, return compressed reference
|
|
107
|
+
const dedup = dedupGuardContext(cwd, input.session_id, 'hazard', fullContext);
|
|
108
|
+
if (dedup)
|
|
109
|
+
return { context: dedup, metricReason: 'deduped' };
|
|
110
|
+
return { context: fullContext, metricReason: 'matched' };
|
|
111
|
+
}
|
|
112
|
+
return { metricReason: issues || scorecardSourceAvailable ? 'no-match' : 'state-unavailable' };
|
|
113
|
+
}
|
|
114
|
+
function resolveTouchedAreas(input, cwd) {
|
|
115
|
+
const seen = new Set();
|
|
116
|
+
const areas = [];
|
|
117
|
+
for (const touchedPath of resolveTouchedPaths(input)) {
|
|
118
|
+
const relativePath = normalizeTouchedPath(touchedPath, cwd);
|
|
119
|
+
if (!relativePath)
|
|
120
|
+
continue;
|
|
121
|
+
const area = dirname(relativePath);
|
|
122
|
+
if (!area || area === '.' || seen.has(area))
|
|
123
|
+
continue;
|
|
124
|
+
seen.add(area);
|
|
125
|
+
areas.push(area);
|
|
126
|
+
}
|
|
127
|
+
return areas;
|
|
128
|
+
}
|
|
129
|
+
function computeFreshWarnings(area, issues) {
|
|
130
|
+
if (!issues)
|
|
131
|
+
return [];
|
|
132
|
+
const freshWarnings = [];
|
|
133
|
+
for (const pattern of issues.recurring_patterns) {
|
|
134
|
+
// Check if pattern is relevant to this area
|
|
135
|
+
const text = `${pattern.title} ${pattern.description} ${pattern.prevention}`.toLowerCase();
|
|
136
|
+
if (areaMatchesText(area, text, { includeGenericSegments: true })) {
|
|
137
|
+
const lastSprint = Math.max(...pattern.sprints_hit);
|
|
138
|
+
freshWarnings.push({ lastSprint, text: `[${pattern.category}] ${pattern.title} (S${lastSprint}) — ${pattern.prevention.slice(0, 80)}` });
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// Sort by recency (most recent first)
|
|
74
142
|
freshWarnings.sort((a, b) => b.lastSprint - a.lastSprint);
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
const
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
143
|
+
return freshWarnings.map(w => w.text);
|
|
144
|
+
}
|
|
145
|
+
function computeScorecardWarnings(area, scorecards) {
|
|
146
|
+
const warnings = [];
|
|
147
|
+
for (const sc of scorecards) {
|
|
148
|
+
const sprint = sc.sprint_number ?? sc.sprint ?? 0;
|
|
149
|
+
for (const shot of sc.shots ?? []) {
|
|
150
|
+
for (const hazard of shot.hazards ?? []) {
|
|
151
|
+
const description = hazard.description ?? '';
|
|
152
|
+
const haystack = `${shot.ticket_key} ${shot.title} ${hazard.type} ${description}`.toLowerCase();
|
|
153
|
+
if (!areaMatchesText(area, haystack))
|
|
154
|
+
continue;
|
|
155
|
+
warnings.push({
|
|
156
|
+
sprint,
|
|
157
|
+
text: `[scorecard:${hazard.type}] ${description || shot.title} (S${sprint})`,
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
for (const location of sc.bunker_locations ?? []) {
|
|
162
|
+
const locationText = typeof location === 'string'
|
|
163
|
+
? location
|
|
164
|
+
: String(location.area ?? '');
|
|
165
|
+
if (!locationText || !areaMatchesText(area, locationText.toLowerCase()))
|
|
166
|
+
continue;
|
|
167
|
+
warnings.push({
|
|
168
|
+
sprint,
|
|
169
|
+
text: `[scorecard:bunker] ${locationText} (S${sprint})`,
|
|
170
|
+
});
|
|
171
|
+
}
|
|
82
172
|
}
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
state.entries.push(entry);
|
|
93
|
-
saveHazardState(cwd, state);
|
|
173
|
+
warnings.sort((a, b) => b.sprint - a.sprint);
|
|
174
|
+
const seen = new Set();
|
|
175
|
+
const unique = [];
|
|
176
|
+
for (const warning of warnings) {
|
|
177
|
+
const key = warning.text.replace(/ \(S\d+\)$/, '');
|
|
178
|
+
if (seen.has(key))
|
|
179
|
+
continue;
|
|
180
|
+
seen.add(key);
|
|
181
|
+
unique.push(warning.text);
|
|
94
182
|
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
const
|
|
183
|
+
return unique;
|
|
184
|
+
}
|
|
185
|
+
function areaMatchesText(area, lowerText, opts = {}) {
|
|
186
|
+
const areaLower = area.toLowerCase();
|
|
187
|
+
if (lowerText.includes(areaLower))
|
|
188
|
+
return true;
|
|
189
|
+
const segments = areaLower
|
|
190
|
+
.split('/')
|
|
191
|
+
.map(seg => seg.trim())
|
|
192
|
+
.filter(Boolean)
|
|
193
|
+
.filter(seg => opts.includeGenericSegments || seg.length >= 4)
|
|
194
|
+
.filter(seg => opts.includeGenericSegments || !GENERIC_AREA_SEGMENTS.has(seg));
|
|
195
|
+
return segments.some(seg => lowerText.includes(seg));
|
|
196
|
+
}
|
|
197
|
+
function formatHazardContext(area, allWarnings) {
|
|
198
|
+
const maxHazards = 3;
|
|
199
|
+
const shown = allWarnings.slice(0, maxHazards);
|
|
99
200
|
const overflow = allWarnings.length - shown.length;
|
|
100
|
-
const header = `SLOPE hazards (${area}, ${allWarnings.length} total${overflow > 0 ? `, showing top ${
|
|
201
|
+
const header = `SLOPE hazards (${area}, ${allWarnings.length} total${overflow > 0 ? `, showing top ${maxHazards}` : ''}):`;
|
|
101
202
|
const lines = [header, ...shown.map(w => `• ${w}`)];
|
|
102
203
|
if (overflow > 0)
|
|
103
204
|
lines.push(` (+${overflow} more — run \`slope briefing --area=${area}\` for all)`);
|
|
104
|
-
|
|
105
|
-
// Session dedup: if this exact context was already injected, return compressed reference
|
|
106
|
-
const dedup = dedupGuardContext(cwd, input.session_id, 'hazard', fullContext);
|
|
107
|
-
if (dedup)
|
|
108
|
-
return { context: dedup };
|
|
109
|
-
return { context: fullContext };
|
|
205
|
+
return lines.join('\n');
|
|
110
206
|
}
|
|
111
207
|
//# sourceMappingURL=hazard.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hazard.js","sourceRoot":"","sources":["../../../src/cli/guards/hazard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"hazard.js","sourceRoot":"","sources":["../../../src/cli/guards/hazard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { HookInput } from '../../core/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Resolve file paths touched by a hook input across agent harness payloads.
|
|
4
|
+
*
|
|
5
|
+
* Claude-style tools usually provide tool_input.file_path. Codex apply_patch
|
|
6
|
+
* hooks carry the edited files inside the patch text, commonly in
|
|
7
|
+
* tool_input.command.
|
|
8
|
+
*/
|
|
9
|
+
export declare function resolveTouchedPaths(input: HookInput): string[];
|
|
10
|
+
export declare function resolvePrimaryTouchedPath(input: HookInput): string | undefined;
|
|
11
|
+
export declare function normalizeTouchedPath(filePath: string | undefined, cwd: string): string | null;
|
|
12
|
+
export declare function toAbsoluteTouchedPath(filePath: string, cwd: string): string;
|
|
13
|
+
export declare function getApplyPatchText(input: HookInput): string | null;
|
|
14
|
+
export declare function parseApplyPatchTouchedPaths(patchText: string): string[];
|
|
15
|
+
//# sourceMappingURL=hook-input.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-input.d.ts","sourceRoot":"","sources":["../../../src/cli/guards/hook-input.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAMrD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,EAAE,CAqB9D;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,CAE9E;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAY7F;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAG3E;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,GAAG,IAAI,CASjE;AAED,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAavE"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { isAbsolute, resolve } from 'node:path';
|
|
2
|
+
const PATCH_TEXT_KEYS = ['command', 'patch', 'input'];
|
|
3
|
+
const DIRECT_PATH_KEYS = ['file_path', 'path'];
|
|
4
|
+
const DIRECT_PATH_ARRAY_KEYS = ['file_paths', 'paths'];
|
|
5
|
+
/**
|
|
6
|
+
* Resolve file paths touched by a hook input across agent harness payloads.
|
|
7
|
+
*
|
|
8
|
+
* Claude-style tools usually provide tool_input.file_path. Codex apply_patch
|
|
9
|
+
* hooks carry the edited files inside the patch text, commonly in
|
|
10
|
+
* tool_input.command.
|
|
11
|
+
*/
|
|
12
|
+
export function resolveTouchedPaths(input) {
|
|
13
|
+
const toolInput = input.tool_input ?? {};
|
|
14
|
+
const paths = [];
|
|
15
|
+
for (const key of DIRECT_PATH_KEYS) {
|
|
16
|
+
const value = toolInput[key];
|
|
17
|
+
if (typeof value === 'string')
|
|
18
|
+
paths.push(value);
|
|
19
|
+
}
|
|
20
|
+
for (const key of DIRECT_PATH_ARRAY_KEYS) {
|
|
21
|
+
const value = toolInput[key];
|
|
22
|
+
if (!Array.isArray(value))
|
|
23
|
+
continue;
|
|
24
|
+
for (const item of value) {
|
|
25
|
+
if (typeof item === 'string')
|
|
26
|
+
paths.push(item);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const patchText = getApplyPatchText(input);
|
|
30
|
+
if (patchText)
|
|
31
|
+
paths.push(...parseApplyPatchTouchedPaths(patchText));
|
|
32
|
+
return uniqueNonEmpty(paths);
|
|
33
|
+
}
|
|
34
|
+
export function resolvePrimaryTouchedPath(input) {
|
|
35
|
+
return resolveTouchedPaths(input)[0];
|
|
36
|
+
}
|
|
37
|
+
export function normalizeTouchedPath(filePath, cwd) {
|
|
38
|
+
if (!filePath)
|
|
39
|
+
return null;
|
|
40
|
+
const normalizedCwd = cwd.replace(/\\/g, '/').replace(/\/$/, '');
|
|
41
|
+
const normalizedPath = filePath.trim().replace(/\\/g, '/');
|
|
42
|
+
if (!normalizedPath)
|
|
43
|
+
return null;
|
|
44
|
+
const relativePath = normalizedPath.startsWith(`${normalizedCwd}/`)
|
|
45
|
+
? normalizedPath.slice(normalizedCwd.length + 1)
|
|
46
|
+
: normalizedPath;
|
|
47
|
+
return relativePath.replace(/^\.\//, '');
|
|
48
|
+
}
|
|
49
|
+
export function toAbsoluteTouchedPath(filePath, cwd) {
|
|
50
|
+
const trimmed = filePath.trim();
|
|
51
|
+
return isAbsolute(trimmed) ? resolve(trimmed) : resolve(cwd, trimmed);
|
|
52
|
+
}
|
|
53
|
+
export function getApplyPatchText(input) {
|
|
54
|
+
const toolInput = input.tool_input ?? {};
|
|
55
|
+
for (const key of PATCH_TEXT_KEYS) {
|
|
56
|
+
const value = toolInput[key];
|
|
57
|
+
if (typeof value === 'string' && value.includes('*** Begin Patch')) {
|
|
58
|
+
return value;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
export function parseApplyPatchTouchedPaths(patchText) {
|
|
64
|
+
const paths = [];
|
|
65
|
+
for (const line of patchText.split(/\r?\n/)) {
|
|
66
|
+
const match = line.match(/^\*\*\* (?:Add|Update|Delete) File: (.+)$/);
|
|
67
|
+
if (match) {
|
|
68
|
+
paths.push(match[1]);
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
const moveMatch = line.match(/^\*\*\* Move to: (.+)$/);
|
|
72
|
+
if (moveMatch)
|
|
73
|
+
paths.push(moveMatch[1]);
|
|
74
|
+
}
|
|
75
|
+
return uniqueNonEmpty(paths);
|
|
76
|
+
}
|
|
77
|
+
function uniqueNonEmpty(values) {
|
|
78
|
+
const seen = new Set();
|
|
79
|
+
const result = [];
|
|
80
|
+
for (const value of values) {
|
|
81
|
+
const normalized = value.trim();
|
|
82
|
+
if (!normalized || seen.has(normalized))
|
|
83
|
+
continue;
|
|
84
|
+
seen.add(normalized);
|
|
85
|
+
result.push(normalized);
|
|
86
|
+
}
|
|
87
|
+
return result;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=hook-input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-input.js","sourceRoot":"","sources":["../../../src/cli/guards/hook-input.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pr-review.d.ts","sourceRoot":"","sources":["../../../src/cli/guards/pr-review.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAIhE;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,
|
|
1
|
+
{"version":3,"file":"pr-review.d.ts","sourceRoot":"","sources":["../../../src/cli/guards/pr-review.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAIhE;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAgCvF;AAiBD;oEACoE;AACpE,iBAAS,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,oBAAoB,EAAE,CAenE;AAwBD,iBAAS,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAiB3D;AAED,iBAAS,qBAAqB,CAAC,IAAI,EAAE,oBAAoB,EAAE,GAAG,MAAM,CAKnE;AAGD,eAAO,MAAM,UAAU;;;;CAAsE,CAAC"}
|
|
@@ -14,7 +14,7 @@ export async function prReviewGuard(input, cwd) {
|
|
|
14
14
|
const command = input.tool_input?.command ?? '';
|
|
15
15
|
const response = input.tool_response?.stdout ?? input.tool_response?.result ?? '';
|
|
16
16
|
if (!command.includes('gh pr create'))
|
|
17
|
-
return {};
|
|
17
|
+
return { metricReason: 'irrelevant-command' };
|
|
18
18
|
// Substring fast-path used to gate the regex match, but `includes()` over
|
|
19
19
|
// arbitrary text can never tightly bound a URL — CodeQL flags it as
|
|
20
20
|
// js/incomplete-url-substring-sanitization. The regex below is the real
|
|
@@ -23,13 +23,14 @@ export async function prReviewGuard(input, cwd) {
|
|
|
23
23
|
// PR URL; if not, the guard skips.
|
|
24
24
|
const urlMatch = response.match(/(https:\/\/github\.com\/[^\s]+\/pull\/(\d+))/);
|
|
25
25
|
if (!urlMatch)
|
|
26
|
-
return {};
|
|
26
|
+
return { metricReason: 'no-match' };
|
|
27
27
|
const prUrl = urlMatch[1];
|
|
28
28
|
const prNumber = urlMatch[2];
|
|
29
29
|
recordPendingReview(cwd, parseInt(prNumber, 10));
|
|
30
30
|
const recs = computeRecommendations(cwd);
|
|
31
31
|
const recLine = formatRecommendations(recs);
|
|
32
32
|
return {
|
|
33
|
+
metricReason: 'matched',
|
|
33
34
|
context: [
|
|
34
35
|
`SLOPE PR Review: A pull request was just created (${prUrl}).`,
|
|
35
36
|
...(recLine ? [`Recommended reviews based on diff: ${recLine}.`] : []),
|