@slope-dev/slope 1.55.9 → 1.55.11
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/commands/pr.d.ts.map +1 -1
- package/dist/cli/commands/pr.js +17 -0
- package/dist/cli/commands/pr.js.map +1 -1
- package/dist/cli/commands/review-state.d.ts.map +1 -1
- package/dist/cli/commands/review-state.js +130 -46
- package/dist/cli/commands/review-state.js.map +1 -1
- package/dist/cli/commands/sprint.d.ts.map +1 -1
- package/dist/cli/commands/sprint.js +85 -3
- package/dist/cli/commands/sprint.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/explore.d.ts.map +1 -1
- package/dist/cli/guards/explore.js +77 -14
- package/dist/cli/guards/explore.js.map +1 -1
- package/dist/cli/guards/plan-analysis.d.ts +5 -1
- package/dist/cli/guards/plan-analysis.d.ts.map +1 -1
- package/dist/cli/guards/plan-analysis.js +5 -3
- package/dist/cli/guards/plan-analysis.js.map +1 -1
- package/dist/cli/guards/post-hole-enforcement.d.ts.map +1 -1
- package/dist/cli/guards/post-hole-enforcement.js +49 -22
- package/dist/cli/guards/post-hole-enforcement.js.map +1 -1
- package/dist/cli/guards/pr-review.d.ts +2 -1
- package/dist/cli/guards/pr-review.d.ts.map +1 -1
- package/dist/cli/guards/pr-review.js +25 -17
- package/dist/cli/guards/pr-review.js.map +1 -1
- package/dist/cli/guards/session-briefing.d.ts.map +1 -1
- package/dist/cli/guards/session-briefing.js +4 -2
- package/dist/cli/guards/session-briefing.js.map +1 -1
- package/dist/cli/pr-review-state.d.ts +26 -0
- package/dist/cli/pr-review-state.d.ts.map +1 -0
- package/dist/cli/pr-review-state.js +86 -0
- package/dist/cli/pr-review-state.js.map +1 -0
- package/dist/cli/session-state.d.ts +4 -0
- package/dist/cli/session-state.d.ts.map +1 -1
- package/dist/cli/session-state.js +22 -1
- package/dist/cli/session-state.js.map +1 -1
- package/dist/cli/sprint-inference.d.ts +1 -1
- package/dist/cli/sprint-inference.d.ts.map +1 -1
- package/dist/cli/sprint-inference.js +10 -0
- package/dist/cli/sprint-inference.js.map +1 -1
- package/dist/cli/sprint-state.d.ts +8 -1
- package/dist/cli/sprint-state.d.ts.map +1 -1
- package/dist/cli/sprint-state.js +19 -0
- package/dist/cli/sprint-state.js.map +1 -1
- package/dist/core/analyzers/git.d.ts +5 -0
- package/dist/core/analyzers/git.d.ts.map +1 -1
- package/dist/core/analyzers/git.js +27 -3
- package/dist/core/analyzers/git.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import { execSync } from 'node:child_process';
|
|
2
2
|
import { recommendReviews } from '../../core/review.js';
|
|
3
|
+
import { recordPrReviewPending } from '../pr-review-state.js';
|
|
4
|
+
import { isActiveSprintState, loadSprintState } from '../sprint-state.js';
|
|
3
5
|
/**
|
|
4
6
|
* PR review guard: fires PostToolUse on Bash.
|
|
5
7
|
*
|
|
6
|
-
* Detects `gh pr create` output and
|
|
8
|
+
* Detects `gh pr create` output and reminds the agent to run the post-PR
|
|
9
|
+
* review workflow.
|
|
7
10
|
* As of S91-4 (#302) the suggestion includes recommended review types
|
|
8
11
|
* computed from the PR's diff (file patterns) and current sprint metadata.
|
|
9
12
|
*/
|
|
@@ -23,29 +26,34 @@ export async function prReviewGuard(input, cwd) {
|
|
|
23
26
|
return {};
|
|
24
27
|
const prUrl = urlMatch[1];
|
|
25
28
|
const prNumber = urlMatch[2];
|
|
29
|
+
recordPendingReview(cwd, parseInt(prNumber, 10));
|
|
26
30
|
const recs = computeRecommendations(cwd);
|
|
27
31
|
const recLine = formatRecommendations(recs);
|
|
28
|
-
|
|
29
|
-
id: 'pr-review',
|
|
30
|
-
title: 'PR Review',
|
|
32
|
+
return {
|
|
31
33
|
context: [
|
|
32
|
-
`A pull request was just created (${prUrl}).`,
|
|
33
|
-
...(recLine ? [`Recommended reviews based on diff: ${recLine}
|
|
34
|
+
`SLOPE PR Review: A pull request was just created (${prUrl}).`,
|
|
35
|
+
...(recLine ? [`Recommended reviews based on diff: ${recLine}.`] : []),
|
|
34
36
|
`Run \`slope pr review --pr=${prNumber}\` to generate the transport-independent review workflow.`,
|
|
35
|
-
`After
|
|
37
|
+
`After review, capture findings with \`slope review findings add\`, then \`slope review amend\` to apply them to the scorecard.`,
|
|
36
38
|
'Tip: also run `slope pr finalize` to add Closes #N for any issues referenced in commits.',
|
|
37
39
|
].join(' '),
|
|
38
|
-
options: [
|
|
39
|
-
{ id: 'code', label: 'Code Review', description: 'Detailed line-by-line code review of the diff' },
|
|
40
|
-
{ id: 'architect', label: 'Architect Review', description: 'High-level architecture and design review' },
|
|
41
|
-
{ id: 'both', label: 'Both', description: 'Run code review followed by architect review' },
|
|
42
|
-
{ id: 'manual', label: 'Manual Review', description: 'User will review manually, no automated review' },
|
|
43
|
-
{ id: 'skip', label: 'Skip / Merge Now', description: 'No review needed, proceed to merge' },
|
|
44
|
-
],
|
|
45
|
-
requiresDecision: true,
|
|
46
|
-
priority: 'high',
|
|
47
40
|
};
|
|
48
|
-
|
|
41
|
+
}
|
|
42
|
+
function recordPendingReview(cwd, pr) {
|
|
43
|
+
try {
|
|
44
|
+
const state = loadSprintState(cwd);
|
|
45
|
+
let branch;
|
|
46
|
+
try {
|
|
47
|
+
branch = execSync('git branch --show-current', { cwd, encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] }).trim() || undefined;
|
|
48
|
+
}
|
|
49
|
+
catch { /* branch is metadata only */ }
|
|
50
|
+
recordPrReviewPending(cwd, {
|
|
51
|
+
pr,
|
|
52
|
+
sprint: isActiveSprintState(state) ? state.sprint : undefined,
|
|
53
|
+
branch,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
catch { /* review marker is best-effort; the reminder still fires */ }
|
|
49
57
|
}
|
|
50
58
|
/** Inspect the current branch's diff and call recommendReviews(). Best-effort
|
|
51
59
|
* — returns [] if git is unavailable or the diff can't be read. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pr-review.js","sourceRoot":"","sources":["../../../src/cli/guards/pr-review.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"pr-review.js","sourceRoot":"","sources":["../../../src/cli/guards/pr-review.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1E;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAgB,EAAE,GAAW;IAC/D,MAAM,OAAO,GAAI,KAAK,CAAC,UAAU,EAAE,OAAkB,IAAI,EAAE,CAAC;IAC5D,MAAM,QAAQ,GAAI,KAAK,CAAC,aAAa,EAAE,MAAiB,IAAK,KAAK,CAAC,aAAa,EAAE,MAAiB,IAAI,EAAE,CAAC;IAE1G,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;QAAE,OAAO,EAAE,CAAC;IAEjD,0EAA0E;IAC1E,oEAAoE;IACpE,wEAAwE;IACxE,2EAA2E;IAC3E,wEAAwE;IACxE,mCAAmC;IACnC,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAChF,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,CAAC;IACzB,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC1B,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAE7B,mBAAmB,CAAC,GAAG,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;IAEjD,MAAM,IAAI,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAE5C,OAAO;QACL,OAAO,EAAE;YACP,qDAAqD,KAAK,IAAI;YAC9D,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,sCAAsC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACtE,8BAA8B,QAAQ,2DAA2D;YACjG,gIAAgI;YAChI,0FAA0F;SAC3F,CAAC,IAAI,CAAC,GAAG,CAAC;KACZ,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAW,EAAE,EAAU;IAClD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,MAA0B,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,GAAG,QAAQ,CAAC,2BAA2B,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,SAAS,CAAC;QACjI,CAAC;QAAC,MAAM,CAAC,CAAC,6BAA6B,CAAC,CAAC;QACzC,qBAAqB,CAAC,GAAG,EAAE;YACzB,EAAE;YACF,MAAM,EAAE,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;YAC7D,MAAM;SACP,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC,CAAC,4DAA4D,CAAC,CAAC;AAC1E,CAAC;AAED;oEACoE;AACpE,SAAS,sBAAsB,CAAC,GAAW;IACzC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,aAAa,CAAC;QAChD,MAAM,QAAQ,GAAG,QAAQ,CAAC,YAAY,IAAI,qBAAqB,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACpI,MAAM,YAAY,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1E,MAAM,WAAW,GAAG,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAChD,OAAO,gBAAgB,CAAC;YACtB,WAAW;YACX,KAAK,EAAE,CAAC;YACR,YAAY;YACZ,WAAW,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,sDAAsD,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SACpG,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,GAAW,EAAE,GAAW;IACzC,IAAI,CAAC;QACH,QAAQ,CAAC,0BAA0B,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QACpF,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,GAAW;IAC/B,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,QAAQ,CAAC,mDAAmD,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACpJ,sEAAsE;QACtE,kEAAkE;QAClE,IAAI,UAAU,IAAI,SAAS,CAAC,GAAG,EAAE,UAAU,CAAC;YAAE,OAAO,UAAU,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;IAC9B,KAAK,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,eAAe,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC;QACnE,IAAI,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAW,EAAE,IAAY;IACjD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,IAAI,oBAAoB,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAClI,IAAI,CAAC,QAAQ;YAAE,OAAO,CAAC,CAAC;QACxB,2EAA2E;QAC3E,qDAAqD;QACrD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,MAAM,EAAE,GAAG,mBAAmB,CAAC;QAC/B,IAAI,CAAyB,CAAC;QAC9B,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACxC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC9B,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC;QACpC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED,SAAS,qBAAqB,CAAC,IAA4B;IACzD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,OAAO,IAAI;SACR,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,WAAW,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;SACnF,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,qBAAqB;AACrB,MAAM,CAAC,MAAM,UAAU,GAAG,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-briefing.d.ts","sourceRoot":"","sources":["../../../src/cli/guards/session-briefing.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAc,MAAM,qBAAqB,CAAC;AAK9E;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,
|
|
1
|
+
{"version":3,"file":"session-briefing.d.ts","sourceRoot":"","sources":["../../../src/cli/guards/session-briefing.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAc,MAAM,qBAAqB,CAAC;AAK9E;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAoH9F"}
|
|
@@ -2,7 +2,7 @@ import { existsSync, readFileSync } from 'node:fs';
|
|
|
2
2
|
import { join } from 'node:path';
|
|
3
3
|
import { loadConfig, parseRoadmap, formatStrategicContext } from '../../core/index.js';
|
|
4
4
|
import { loadSprintState } from '../sprint-state.js';
|
|
5
|
-
import { loadSessionState, updateSessionState, setSessionMode } from '../session-state.js';
|
|
5
|
+
import { loadSessionState, updateSessionState, setSessionMode, syncSessionModeWithSprintState } from '../session-state.js';
|
|
6
6
|
/**
|
|
7
7
|
* Session-briefing guard: fires PostToolUse on all tools.
|
|
8
8
|
* Injects sprint context on the very first tool call of a session.
|
|
@@ -14,8 +14,10 @@ export async function sessionBriefingGuard(input, cwd) {
|
|
|
14
14
|
return {};
|
|
15
15
|
// Dedup: only fire once per session
|
|
16
16
|
const sessionState = loadSessionState(cwd);
|
|
17
|
-
if (sessionState.briefing_session_id === sessionId)
|
|
17
|
+
if (sessionState.briefing_session_id === sessionId) {
|
|
18
|
+
syncSessionModeWithSprintState(cwd, sessionId);
|
|
18
19
|
return {};
|
|
20
|
+
}
|
|
19
21
|
// Mark as briefed (atomic write)
|
|
20
22
|
updateSessionState(cwd, 'briefing_session_id', sessionId);
|
|
21
23
|
// Gather context
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-briefing.js","sourceRoot":"","sources":["../../../src/cli/guards/session-briefing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AACvF,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"session-briefing.js","sourceRoot":"","sources":["../../../src/cli/guards/session-briefing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export interface PrReviewRecord {
|
|
2
|
+
pr: number;
|
|
3
|
+
sprint?: number;
|
|
4
|
+
branch?: string;
|
|
5
|
+
status: 'pending' | 'reviewed';
|
|
6
|
+
created_at: string;
|
|
7
|
+
reviewed_at?: string;
|
|
8
|
+
review_type?: 'architect' | 'code' | 'both';
|
|
9
|
+
}
|
|
10
|
+
export interface PrReviewState {
|
|
11
|
+
reviews: PrReviewRecord[];
|
|
12
|
+
}
|
|
13
|
+
export declare function loadPrReviewState(cwd: string): PrReviewState;
|
|
14
|
+
export declare function recordPrReviewPending(cwd: string, input: {
|
|
15
|
+
pr: number;
|
|
16
|
+
sprint?: number;
|
|
17
|
+
branch?: string;
|
|
18
|
+
}): void;
|
|
19
|
+
export declare function recordPrReviewComplete(cwd: string, input: {
|
|
20
|
+
pr: number;
|
|
21
|
+
sprint?: number;
|
|
22
|
+
branch?: string;
|
|
23
|
+
reviewType?: 'architect' | 'code' | 'both';
|
|
24
|
+
}): void;
|
|
25
|
+
export declare function pendingPrReviews(cwd: string, sprint?: number): PrReviewRecord[];
|
|
26
|
+
//# sourceMappingURL=pr-review-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr-review-state.d.ts","sourceRoot":"","sources":["../../src/cli/pr-review-state.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,SAAS,GAAG,UAAU,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,MAAM,CAAC;CAC7C;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,cAAc,EAAE,CAAC;CAC3B;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAY5D;AAqBD,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAoBhH;AAED,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,MAAM,CAAA;CAAE,GAClG,IAAI,CAwBN;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,cAAc,EAAE,CAK/E"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
const PR_REVIEW_STATE_FILE = '.slope/pr-reviews.json';
|
|
4
|
+
export function loadPrReviewState(cwd) {
|
|
5
|
+
const filePath = join(cwd, PR_REVIEW_STATE_FILE);
|
|
6
|
+
if (!existsSync(filePath))
|
|
7
|
+
return { reviews: [] };
|
|
8
|
+
try {
|
|
9
|
+
const raw = JSON.parse(readFileSync(filePath, 'utf8'));
|
|
10
|
+
if (!Array.isArray(raw.reviews))
|
|
11
|
+
return { reviews: [] };
|
|
12
|
+
return {
|
|
13
|
+
reviews: raw.reviews.filter(isPrReviewRecord),
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return { reviews: [] };
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function isPrReviewRecord(value) {
|
|
21
|
+
const record = value;
|
|
22
|
+
return Boolean(record
|
|
23
|
+
&& typeof record.pr === 'number'
|
|
24
|
+
&& (record.status === 'pending' || record.status === 'reviewed')
|
|
25
|
+
&& typeof record.created_at === 'string');
|
|
26
|
+
}
|
|
27
|
+
function savePrReviewState(cwd, state) {
|
|
28
|
+
const dir = join(cwd, '.slope');
|
|
29
|
+
mkdirSync(dir, { recursive: true });
|
|
30
|
+
const filePath = join(cwd, PR_REVIEW_STATE_FILE);
|
|
31
|
+
const tmpPath = `${filePath}.tmp`;
|
|
32
|
+
writeFileSync(tmpPath, JSON.stringify(state, null, 2) + '\n');
|
|
33
|
+
renameSync(tmpPath, filePath);
|
|
34
|
+
}
|
|
35
|
+
export function recordPrReviewPending(cwd, input) {
|
|
36
|
+
const state = loadPrReviewState(cwd);
|
|
37
|
+
const now = new Date().toISOString();
|
|
38
|
+
const existing = state.reviews.find(review => review.pr === input.pr);
|
|
39
|
+
if (existing) {
|
|
40
|
+
existing.sprint = input.sprint ?? existing.sprint;
|
|
41
|
+
existing.branch = input.branch ?? existing.branch;
|
|
42
|
+
if (existing.status !== 'reviewed')
|
|
43
|
+
existing.status = 'pending';
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
state.reviews.push({
|
|
47
|
+
pr: input.pr,
|
|
48
|
+
sprint: input.sprint,
|
|
49
|
+
branch: input.branch,
|
|
50
|
+
status: 'pending',
|
|
51
|
+
created_at: now,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
savePrReviewState(cwd, state);
|
|
55
|
+
}
|
|
56
|
+
export function recordPrReviewComplete(cwd, input) {
|
|
57
|
+
const state = loadPrReviewState(cwd);
|
|
58
|
+
const now = new Date().toISOString();
|
|
59
|
+
const existing = state.reviews.find(review => review.pr === input.pr);
|
|
60
|
+
if (existing) {
|
|
61
|
+
existing.sprint = input.sprint ?? existing.sprint;
|
|
62
|
+
existing.branch = input.branch ?? existing.branch;
|
|
63
|
+
existing.status = 'reviewed';
|
|
64
|
+
existing.reviewed_at = now;
|
|
65
|
+
existing.review_type = input.reviewType ?? existing.review_type;
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
state.reviews.push({
|
|
69
|
+
pr: input.pr,
|
|
70
|
+
sprint: input.sprint,
|
|
71
|
+
branch: input.branch,
|
|
72
|
+
status: 'reviewed',
|
|
73
|
+
created_at: now,
|
|
74
|
+
reviewed_at: now,
|
|
75
|
+
review_type: input.reviewType,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
savePrReviewState(cwd, state);
|
|
79
|
+
}
|
|
80
|
+
export function pendingPrReviews(cwd, sprint) {
|
|
81
|
+
return loadPrReviewState(cwd).reviews
|
|
82
|
+
.filter(review => review.status === 'pending')
|
|
83
|
+
.filter(review => sprint == null || review.sprint == null || review.sprint === sprint)
|
|
84
|
+
.sort((a, b) => b.pr - a.pr);
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=pr-review-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr-review-state.js","sourceRoot":"","sources":["../../src/cli/pr-review-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,6 +29,10 @@ export declare function setSessionMode(cwd: string, sessionId: string, mode: Ses
|
|
|
29
29
|
* Returns true if mode is explicitly 'adhoc' for this session.
|
|
30
30
|
* Returns false if mode is 'sprint', unset, or set by a different session. */
|
|
31
31
|
export declare function isAdhocSession(cwd: string, sessionId: string): boolean;
|
|
32
|
+
/** Keep pinned session mode aligned with live sprint-state.
|
|
33
|
+
* If a sprint starts after a session was pinned adhoc, promote the session
|
|
34
|
+
* back to sprint mode so sprint-workflow guards do not stay suppressed. */
|
|
35
|
+
export declare function syncSessionModeWithSprintState(cwd: string, sessionId: string): SessionMode | null;
|
|
32
36
|
/**
|
|
33
37
|
* Check if context has already been injected this session.
|
|
34
38
|
* Returns null if new (caller should inject full context).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-state.d.ts","sourceRoot":"","sources":["../../src/cli/session-state.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"session-state.d.ts","sourceRoot":"","sources":["../../src/cli/session-state.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE7C,UAAU,YAAY;IACpB,wCAAwC;IACxC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,6EAA6E;IAC7E,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,8CAA8C;IAC9C,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,mDAAmD;IACnD,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,gEAAgE;IAChE,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B,uEAAuE;IACvE,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,gFAAgF;AAChF,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAQ1D;AAED,mEAAmE;AACnE,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI,CAQvE;AAED,kEAAkE;AAClE,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAI9F;AAED,kEAAkE;AAClE,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,IAAI,CAKtF;AAED;;+EAE+E;AAC/E,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAItE;AAED;;4EAE4E;AAC5E,wBAAgB,8BAA8B,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAgBjG;AAqCD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,MAAM,GAAG,IAAI,CAyCf"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { existsSync, readFileSync, writeFileSync, mkdirSync, renameSync } from 'node:fs';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
3
|
import { createHash } from 'node:crypto';
|
|
4
|
+
import { isActiveSprintState, loadSprintState } from './sprint-state.js';
|
|
4
5
|
const SESSION_STATE_FILE = '.slope/.session-state.json';
|
|
5
6
|
/** Load consolidated session state. Returns empty object if missing/corrupt. */
|
|
6
7
|
export function loadSessionState(cwd) {
|
|
@@ -42,8 +43,28 @@ export function setSessionMode(cwd, sessionId, mode) {
|
|
|
42
43
|
export function isAdhocSession(cwd, sessionId) {
|
|
43
44
|
if (!sessionId)
|
|
44
45
|
return false;
|
|
46
|
+
const mode = syncSessionModeWithSprintState(cwd, sessionId);
|
|
47
|
+
return mode === 'adhoc';
|
|
48
|
+
}
|
|
49
|
+
/** Keep pinned session mode aligned with live sprint-state.
|
|
50
|
+
* If a sprint starts after a session was pinned adhoc, promote the session
|
|
51
|
+
* back to sprint mode so sprint-workflow guards do not stay suppressed. */
|
|
52
|
+
export function syncSessionModeWithSprintState(cwd, sessionId) {
|
|
53
|
+
if (!sessionId)
|
|
54
|
+
return null;
|
|
45
55
|
const state = loadSessionState(cwd);
|
|
46
|
-
|
|
56
|
+
const sprintState = loadSprintState(cwd);
|
|
57
|
+
if (isActiveSprintState(sprintState)) {
|
|
58
|
+
if (state.session_mode !== 'sprint' || state.session_mode_id !== sessionId) {
|
|
59
|
+
state.session_mode = 'sprint';
|
|
60
|
+
state.session_mode_id = sessionId;
|
|
61
|
+
saveSessionState(cwd, state);
|
|
62
|
+
}
|
|
63
|
+
return 'sprint';
|
|
64
|
+
}
|
|
65
|
+
if (state.session_mode_id !== sessionId)
|
|
66
|
+
return null;
|
|
67
|
+
return state.session_mode ?? null;
|
|
47
68
|
}
|
|
48
69
|
// ── Context dedup ───────────────────────────────────
|
|
49
70
|
/** File for context dedup hashes (separate from session-state for performance) */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-state.js","sourceRoot":"","sources":["../../src/cli/session-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACzF,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"session-state.js","sourceRoot":"","sources":["../../src/cli/session-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import type { RoadmapDefinition, RoadmapSprint, SlopeConfig } from '../core/inde
|
|
|
2
2
|
export interface InferredSprintContext {
|
|
3
3
|
sprint: number;
|
|
4
4
|
label: string;
|
|
5
|
-
source: 'config' | 'roadmap' | 'scorecards' | 'initial';
|
|
5
|
+
source: 'sprint-state' | 'config' | 'roadmap' | 'scorecards' | 'initial';
|
|
6
6
|
latestScorecard: number;
|
|
7
7
|
roadmapSprint?: RoadmapSprint;
|
|
8
8
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sprint-inference.d.ts","sourceRoot":"","sources":["../../src/cli/sprint-inference.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"sprint-inference.d.ts","sourceRoot":"","sources":["../../src/cli/sprint-inference.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAItF,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,cAAc,GAAG,QAAQ,GAAG,SAAS,GAAG,YAAY,GAAG,SAAS,CAAC;IACzE,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,iBAAiB,GAAG,IAAI,CAUlG;AAED,wBAAgB,kBAAkB,CAAC,GAAG,GAAE,MAAsB,EAAE,MAAM,GAAE,WAA6B,GAAG,qBAAqB,CA2D5H;AA0BD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,CAEtD"}
|
|
@@ -2,6 +2,7 @@ import { existsSync, readFileSync } from 'node:fs';
|
|
|
2
2
|
import { join } from 'node:path';
|
|
3
3
|
import { castRoadmapStructure, compareSprintIds, detectLatestSprint, formatSprintLabel, isEncodedInsertedSprintId, isRoadmapSprintPending, loadScorecards, parseRoadmap, sprintOrderValue, } from '../core/index.js';
|
|
4
4
|
import { loadConfig } from './config.js';
|
|
5
|
+
import { isActiveSprintState, loadSprintState } from './sprint-state.js';
|
|
5
6
|
export function loadRoadmapForInference(cwd, config) {
|
|
6
7
|
const roadmapPath = join(cwd, config.roadmapPath);
|
|
7
8
|
if (!existsSync(roadmapPath))
|
|
@@ -17,6 +18,15 @@ export function loadRoadmapForInference(cwd, config) {
|
|
|
17
18
|
}
|
|
18
19
|
export function inferSprintContext(cwd = process.cwd(), config = loadConfig(cwd)) {
|
|
19
20
|
const latestScorecard = detectLatestSprint(config, cwd);
|
|
21
|
+
const sprintState = loadSprintState(cwd);
|
|
22
|
+
if (isActiveSprintState(sprintState)) {
|
|
23
|
+
return {
|
|
24
|
+
sprint: sprintState.sprint,
|
|
25
|
+
label: formatSprintLabel(sprintState.sprint),
|
|
26
|
+
source: 'sprint-state',
|
|
27
|
+
latestScorecard,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
20
30
|
if (config.currentSprint) {
|
|
21
31
|
return {
|
|
22
32
|
sprint: config.currentSprint,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sprint-inference.js","sourceRoot":"","sources":["../../src/cli/sprint-inference.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,yBAAyB,EACzB,sBAAsB,EACtB,cAAc,EACd,YAAY,EACZ,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"sprint-inference.js","sourceRoot":"","sources":["../../src/cli/sprint-inference.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/** Sprint lifecycle phases */
|
|
2
|
-
export
|
|
2
|
+
export declare const SPRINT_PHASES: readonly ["planning", "reviewing", "implementing", "scoring", "complete"];
|
|
3
|
+
export type SprintPhase = typeof SPRINT_PHASES[number];
|
|
3
4
|
/** Gate names that must be completed before PR */
|
|
4
5
|
export type GateName = 'tests' | 'code_review' | 'architect_review' | 'scorecard' | 'review_md';
|
|
5
6
|
/** Sprint state persisted to .slope/sprint-state.json */
|
|
@@ -10,12 +11,18 @@ export interface SprintState {
|
|
|
10
11
|
started_at: string;
|
|
11
12
|
updated_at: string;
|
|
12
13
|
}
|
|
14
|
+
/** Validate a user-provided sprint lifecycle phase. */
|
|
15
|
+
export declare function isSprintPhase(value: string): value is SprintPhase;
|
|
13
16
|
/** Load sprint state from .slope/sprint-state.json. Returns null if missing or malformed. */
|
|
14
17
|
export declare function loadSprintState(cwd: string): SprintState | null;
|
|
18
|
+
/** True when sprint-state represents an active workflow sprint. */
|
|
19
|
+
export declare function isActiveSprintState(state: SprintState | null): state is SprintState;
|
|
15
20
|
/** Save sprint state atomically via tmp + rename. */
|
|
16
21
|
export declare function saveSprintState(cwd: string, state: SprintState): void;
|
|
17
22
|
/** Update a single gate and save. */
|
|
18
23
|
export declare function updateGate(cwd: string, gate: GateName, value: boolean): void;
|
|
24
|
+
/** Update the current sprint lifecycle phase. */
|
|
25
|
+
export declare function updateSprintPhase(cwd: string, phase: SprintPhase): SprintState | null;
|
|
19
26
|
/** Check if all gates are true. */
|
|
20
27
|
export declare function isSprintComplete(state: SprintState): boolean;
|
|
21
28
|
/** Return human-readable list of incomplete gates. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sprint-state.d.ts","sourceRoot":"","sources":["../../src/cli/sprint-state.ts"],"names":[],"mappings":"AAGA,8BAA8B;AAC9B,
|
|
1
|
+
{"version":3,"file":"sprint-state.d.ts","sourceRoot":"","sources":["../../src/cli/sprint-state.ts"],"names":[],"mappings":"AAGA,8BAA8B;AAC9B,eAAO,MAAM,aAAa,2EAA4E,CAAC;AACvG,MAAM,MAAM,WAAW,GAAG,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC;AAEvD,kDAAkD;AAClD,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,aAAa,GAAG,kBAAkB,GAAG,WAAW,GAAG,WAAW,CAAC;AAWhG,yDAAyD;AACzD,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAMD,uDAAuD;AACvD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,WAAW,CAEjE;AAED,6FAA6F;AAC7F,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAmB/D;AAED,mEAAmE;AACnE,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,GAAG,KAAK,IAAI,WAAW,CAEnF;AAED,qDAAqD;AACrD,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAUrE;AAED,qCAAqC;AACrC,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAK5E;AAED,iDAAiD;AACjD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI,CAMrF;AAED,mCAAmC;AACnC,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAE5D;AAED,sDAAsD;AACtD,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,EAAE,CAIzD;AAED,wDAAwD;AACxD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,WAAwB,GAAG,WAAW,CAe9F;AAED,oCAAoC;AACpC,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAKlD"}
|
package/dist/cli/sprint-state.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { readFileSync, writeFileSync, existsSync, mkdirSync, renameSync, unlinkSync } from 'node:fs';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
|
+
/** Sprint lifecycle phases */
|
|
4
|
+
export const SPRINT_PHASES = ['planning', 'reviewing', 'implementing', 'scoring', 'complete'];
|
|
3
5
|
/** Human-readable labels for gates */
|
|
4
6
|
const GATE_LABELS = {
|
|
5
7
|
tests: 'Tests passing',
|
|
@@ -10,6 +12,10 @@ const GATE_LABELS = {
|
|
|
10
12
|
};
|
|
11
13
|
const SPRINT_STATE_FILE = '.slope/sprint-state.json';
|
|
12
14
|
const ALL_GATES = ['tests', 'code_review', 'architect_review', 'scorecard', 'review_md'];
|
|
15
|
+
/** Validate a user-provided sprint lifecycle phase. */
|
|
16
|
+
export function isSprintPhase(value) {
|
|
17
|
+
return SPRINT_PHASES.includes(value);
|
|
18
|
+
}
|
|
13
19
|
/** Load sprint state from .slope/sprint-state.json. Returns null if missing or malformed. */
|
|
14
20
|
export function loadSprintState(cwd) {
|
|
15
21
|
const statePath = join(cwd, SPRINT_STATE_FILE);
|
|
@@ -33,6 +39,10 @@ export function loadSprintState(cwd) {
|
|
|
33
39
|
return null;
|
|
34
40
|
}
|
|
35
41
|
}
|
|
42
|
+
/** True when sprint-state represents an active workflow sprint. */
|
|
43
|
+
export function isActiveSprintState(state) {
|
|
44
|
+
return Boolean(state && state.phase !== 'complete');
|
|
45
|
+
}
|
|
36
46
|
/** Save sprint state atomically via tmp + rename. */
|
|
37
47
|
export function saveSprintState(cwd, state) {
|
|
38
48
|
const dir = join(cwd, '.slope');
|
|
@@ -51,6 +61,15 @@ export function updateGate(cwd, gate, value) {
|
|
|
51
61
|
state.gates[gate] = value;
|
|
52
62
|
saveSprintState(cwd, state);
|
|
53
63
|
}
|
|
64
|
+
/** Update the current sprint lifecycle phase. */
|
|
65
|
+
export function updateSprintPhase(cwd, phase) {
|
|
66
|
+
const state = loadSprintState(cwd);
|
|
67
|
+
if (!state)
|
|
68
|
+
return null;
|
|
69
|
+
state.phase = phase;
|
|
70
|
+
saveSprintState(cwd, state);
|
|
71
|
+
return state;
|
|
72
|
+
}
|
|
54
73
|
/** Check if all gates are true. */
|
|
55
74
|
export function isSprintComplete(state) {
|
|
56
75
|
return ALL_GATES.every(g => state.gates[g] === true);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sprint-state.js","sourceRoot":"","sources":["../../src/cli/sprint-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrG,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"sprint-state.js","sourceRoot":"","sources":["../../src/cli/sprint-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,11 @@ import type { GitProfile } from './types.js';
|
|
|
5
5
|
* Pure function — separated from git I/O for testability.
|
|
6
6
|
*/
|
|
7
7
|
export declare function extractSprintReferences(commitSubjects: string[]): Set<number>;
|
|
8
|
+
/** Extract sprint IDs from shipped sprint artifact paths in git log output.
|
|
9
|
+
* This catches normal GitHub squash merges whose subject is PR-oriented
|
|
10
|
+
* (`Fix thing (#123)`) while the commit itself adds `docs/retros/sprint-N.json`.
|
|
11
|
+
*/
|
|
12
|
+
export declare function extractSprintArtifactReferences(logLines: string[]): Set<number>;
|
|
8
13
|
/** Detect sprint IDs with shipped commits on the given ref (default: main).
|
|
9
14
|
* Falls back to `master` then `HEAD` if main is unavailable. Returns an empty
|
|
10
15
|
* set on any git failure so callers can run validation without a working repo.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../../src/core/analyzers/git.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAU7C;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAU7E;
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../../src/core/analyzers/git.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAU7C;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAU7E;AAED;;;GAGG;AACH,wBAAgB,+BAA+B,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAQ/E;AAkBD;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAoB/E;AA0BD,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAyDjE"}
|
|
@@ -24,6 +24,28 @@ export function extractSprintReferences(commitSubjects) {
|
|
|
24
24
|
}
|
|
25
25
|
return result;
|
|
26
26
|
}
|
|
27
|
+
/** Extract sprint IDs from shipped sprint artifact paths in git log output.
|
|
28
|
+
* This catches normal GitHub squash merges whose subject is PR-oriented
|
|
29
|
+
* (`Fix thing (#123)`) while the commit itself adds `docs/retros/sprint-N.json`.
|
|
30
|
+
*/
|
|
31
|
+
export function extractSprintArtifactReferences(logLines) {
|
|
32
|
+
const result = new Set();
|
|
33
|
+
const re = /^docs\/retros\/sprint-(\d+)(?:\.json|-review\.md)$/i;
|
|
34
|
+
for (const line of logLines) {
|
|
35
|
+
const m = line.trim().match(re);
|
|
36
|
+
if (m)
|
|
37
|
+
result.add(parseInt(m[1], 10));
|
|
38
|
+
}
|
|
39
|
+
return result;
|
|
40
|
+
}
|
|
41
|
+
function unionSets(...sets) {
|
|
42
|
+
const result = new Set();
|
|
43
|
+
for (const set of sets) {
|
|
44
|
+
for (const value of set)
|
|
45
|
+
result.add(value);
|
|
46
|
+
}
|
|
47
|
+
return result;
|
|
48
|
+
}
|
|
27
49
|
/**
|
|
28
50
|
* Allowed characters in git refs (branch / tag / abbreviated SHA). Permissive
|
|
29
51
|
* enough for the names users actually pick (alphanumerics, slash, dot, dash,
|
|
@@ -49,9 +71,11 @@ export function findShippedSprintsOnMain(cwd, ref) {
|
|
|
49
71
|
// Cap at 1000 commits — plenty for sprint references (a project would
|
|
50
72
|
// need to ship hundreds of sprints to exhaust this) and avoids slowing
|
|
51
73
|
// session-end Stop hooks on deep-history repos.
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
|
|
74
|
+
const subjects = git(`log ${r} --format=%s -n 1000`, cwd);
|
|
75
|
+
const files = git(`log ${r} --name-only --format= -n 1000`, cwd);
|
|
76
|
+
if (subjects || files) {
|
|
77
|
+
return unionSets(extractSprintReferences(subjects ? subjects.split('\n') : []), extractSprintArtifactReferences(files ? files.split('\n') : []));
|
|
78
|
+
}
|
|
55
79
|
}
|
|
56
80
|
return new Set();
|
|
57
81
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../../src/core/analyzers/git.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAG9C,SAAS,GAAG,CAAC,GAAW,EAAE,GAAW;IACnC,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,OAAO,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACnH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,cAAwB;IAC9D,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,MAAM,EAAE,GAAG,oBAAoB,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;QAClC,IAAI,CAAyB,CAAC;QAC9B,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACpC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,MAAM,WAAW,GAAG,qBAAqB,CAAC;AAE1C;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB,CAAC,GAAW,EAAE,GAAY;IAChE,MAAM,KAAK,GAAG,GAAG,CAAC,iCAAiC,EAAE,GAAG,CAAC,CAAC;IAC1D,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,IAAI,GAAG,EAAE,CAAC;IAEvC,MAAM,UAAU,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC5D,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,SAAS,CAAC,4BAA4B;QAChE,sEAAsE;QACtE,uEAAuE;QACvE,gDAAgD;QAChD,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../../src/core/analyzers/git.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@slope-dev/slope",
|
|
3
|
-
"version": "1.55.
|
|
3
|
+
"version": "1.55.11",
|
|
4
4
|
"description": "Quantified sprint metrics for AI-assisted development. Scorecards, handicap tracking, and real-time agent guidance for Claude Code, Cursor, Windsurf, Cline, and OpenCode.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|