@slope-dev/slope 1.57.0 → 1.57.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.
Files changed (102) hide show
  1. package/dist/cli/commands/auto-card.d.ts.map +1 -1
  2. package/dist/cli/commands/auto-card.js +27 -1
  3. package/dist/cli/commands/auto-card.js.map +1 -1
  4. package/dist/cli/commands/briefing.d.ts.map +1 -1
  5. package/dist/cli/commands/briefing.js +17 -0
  6. package/dist/cli/commands/briefing.js.map +1 -1
  7. package/dist/cli/commands/doctor.d.ts.map +1 -1
  8. package/dist/cli/commands/doctor.js +6 -2
  9. package/dist/cli/commands/doctor.js.map +1 -1
  10. package/dist/cli/commands/guard.d.ts +1 -0
  11. package/dist/cli/commands/guard.d.ts.map +1 -1
  12. package/dist/cli/commands/guard.js +332 -6
  13. package/dist/cli/commands/guard.js.map +1 -1
  14. package/dist/cli/commands/pr.d.ts +2 -0
  15. package/dist/cli/commands/pr.d.ts.map +1 -1
  16. package/dist/cli/commands/pr.js +21 -0
  17. package/dist/cli/commands/pr.js.map +1 -1
  18. package/dist/cli/commands/review-state.d.ts.map +1 -1
  19. package/dist/cli/commands/review-state.js +7 -1
  20. package/dist/cli/commands/review-state.js.map +1 -1
  21. package/dist/cli/commands/roadmap.d.ts.map +1 -1
  22. package/dist/cli/commands/roadmap.js +6 -0
  23. package/dist/cli/commands/roadmap.js.map +1 -1
  24. package/dist/cli/commands/session.d.ts.map +1 -1
  25. package/dist/cli/commands/session.js +28 -0
  26. package/dist/cli/commands/session.js.map +1 -1
  27. package/dist/cli/commands/sprint.d.ts.map +1 -1
  28. package/dist/cli/commands/sprint.js +63 -4
  29. package/dist/cli/commands/sprint.js.map +1 -1
  30. package/dist/cli/commands/validate.d.ts.map +1 -1
  31. package/dist/cli/commands/validate.js +3 -27
  32. package/dist/cli/commands/validate.js.map +1 -1
  33. package/dist/cli/commands/worktree.d.ts.map +1 -1
  34. package/dist/cli/commands/worktree.js +23 -0
  35. package/dist/cli/commands/worktree.js.map +1 -1
  36. package/dist/cli/error-reporter.d.ts +3 -0
  37. package/dist/cli/error-reporter.d.ts.map +1 -0
  38. package/dist/cli/error-reporter.js +20 -0
  39. package/dist/cli/error-reporter.js.map +1 -0
  40. package/dist/cli/guards/phase-boundary.d.ts.map +1 -1
  41. package/dist/cli/guards/phase-boundary.js +111 -11
  42. package/dist/cli/guards/phase-boundary.js.map +1 -1
  43. package/dist/cli/guards/push-nudge.d.ts.map +1 -1
  44. package/dist/cli/guards/push-nudge.js +4 -1
  45. package/dist/cli/guards/push-nudge.js.map +1 -1
  46. package/dist/cli/guards/sprint-completion.d.ts.map +1 -1
  47. package/dist/cli/guards/sprint-completion.js +32 -4
  48. package/dist/cli/guards/sprint-completion.js.map +1 -1
  49. package/dist/cli/guards/worktree-check.d.ts.map +1 -1
  50. package/dist/cli/guards/worktree-check.js +209 -6
  51. package/dist/cli/guards/worktree-check.js.map +1 -1
  52. package/dist/cli/index.js +57 -214
  53. package/dist/cli/index.js.map +1 -1
  54. package/dist/cli/pr-closeout.d.ts +38 -0
  55. package/dist/cli/pr-closeout.d.ts.map +1 -0
  56. package/dist/cli/pr-closeout.js +197 -0
  57. package/dist/cli/pr-closeout.js.map +1 -0
  58. package/dist/cli/pre-sprint-reality.d.ts +33 -0
  59. package/dist/cli/pre-sprint-reality.d.ts.map +1 -0
  60. package/dist/cli/pre-sprint-reality.js +253 -0
  61. package/dist/cli/pre-sprint-reality.js.map +1 -0
  62. package/dist/cli/registry.d.ts.map +1 -1
  63. package/dist/cli/registry.js +15 -1
  64. package/dist/cli/registry.js.map +1 -1
  65. package/dist/core/config.d.ts +2 -0
  66. package/dist/core/config.d.ts.map +1 -1
  67. package/dist/core/config.js.map +1 -1
  68. package/dist/core/index.d.ts +2 -2
  69. package/dist/core/index.d.ts.map +1 -1
  70. package/dist/core/index.js +1 -1
  71. package/dist/core/index.js.map +1 -1
  72. package/dist/core/loader.d.ts +1 -0
  73. package/dist/core/loader.d.ts.map +1 -1
  74. package/dist/core/loader.js +80 -22
  75. package/dist/core/loader.js.map +1 -1
  76. package/dist/core/roadmap.d.ts +7 -0
  77. package/dist/core/roadmap.d.ts.map +1 -1
  78. package/dist/core/roadmap.js +42 -8
  79. package/dist/core/roadmap.js.map +1 -1
  80. package/dist/core/store.d.ts +2 -0
  81. package/dist/core/store.d.ts.map +1 -1
  82. package/dist/core/store.js.map +1 -1
  83. package/dist/core/validation.d.ts +2 -0
  84. package/dist/core/validation.d.ts.map +1 -1
  85. package/dist/core/validation.js +12 -8
  86. package/dist/core/validation.js.map +1 -1
  87. package/dist/mcp/index.test.js +7 -0
  88. package/dist/mcp/index.test.js.map +1 -1
  89. package/dist/mcp/registry.d.ts +1 -1
  90. package/dist/mcp/registry.d.ts.map +1 -1
  91. package/dist/mcp/registry.js +1 -1
  92. package/dist/store/index.d.ts +2 -1
  93. package/dist/store/index.d.ts.map +1 -1
  94. package/dist/store/index.js +26 -0
  95. package/dist/store/index.js.map +1 -1
  96. package/dist/store-pg/index.d.ts +2 -1
  97. package/dist/store-pg/index.d.ts.map +1 -1
  98. package/dist/store-pg/index.js +36 -0
  99. package/dist/store-pg/index.js.map +1 -1
  100. package/package.json +1 -1
  101. package/packages/pi-extension/dist/index.js +4 -1
  102. package/templates/codex/plugins/slope/.codex-plugin/plugin.json +1 -1
@@ -0,0 +1,197 @@
1
+ import { execFileSync } from 'node:child_process';
2
+ import { existsSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { detectLatestSprint } from '../core/index.js';
5
+ import { loadConfig } from './config.js';
6
+ import { loadPrReviewState } from './pr-review-state.js';
7
+ import { isActiveSprintState, loadSprintState } from './sprint-state.js';
8
+ export function closeoutPolicy(cwd) {
9
+ const guidance = loadConfig(cwd).guidance;
10
+ return {
11
+ commitWarnAt: positiveInt(guidance?.prCommitWarnAt, 50),
12
+ fileWarnAt: positiveInt(guidance?.prFileWarnAt, 100),
13
+ };
14
+ }
15
+ function positiveInt(value, fallback) {
16
+ return typeof value === 'number' && Number.isInteger(value) && value > 0 ? value : fallback;
17
+ }
18
+ export function branchSizeWarnings(size, policy) {
19
+ const warnings = [];
20
+ if (typeof size.commits === 'number' && size.commits > policy.commitWarnAt) {
21
+ warnings.push(`Branch has ${size.commits} commits, above closeout warning threshold ${policy.commitWarnAt}.`);
22
+ }
23
+ if (typeof size.files === 'number' && size.files > policy.fileWarnAt) {
24
+ warnings.push(`Branch changes ${size.files} files, above closeout warning threshold ${policy.fileWarnAt}.`);
25
+ }
26
+ return warnings;
27
+ }
28
+ export function buildPrCloseoutStatus(cwd, opts = {}) {
29
+ const config = loadConfig(cwd);
30
+ const policy = closeoutPolicy(cwd);
31
+ const sprint = opts.sprint ?? inferSprint(cwd);
32
+ const branch = currentBranch(cwd);
33
+ const pr = currentPr();
34
+ const base = pr?.baseRefName ? `origin/${pr.baseRefName}` : inferBaseRef(cwd);
35
+ const branchSize = collectBranchSize(cwd, base);
36
+ const prReview = resolvePrReviewStatus(cwd, { pr: pr?.number, sprint, branch });
37
+ const scorecardPath = sprint
38
+ ? join(cwd, config.scorecardDir, config.scorecardPattern.replaceAll('*', String(sprint)))
39
+ : undefined;
40
+ const sprintReviewPath = sprint
41
+ ? join(cwd, config.scorecardDir, `sprint-${sprint}-review.md`)
42
+ : undefined;
43
+ const status = {
44
+ sprint,
45
+ branch,
46
+ scorecardPath,
47
+ scorecardExists: scorecardPath ? existsSync(scorecardPath) : false,
48
+ sprintReviewPath,
49
+ sprintReviewExists: sprintReviewPath ? existsSync(sprintReviewPath) : false,
50
+ unpushedCommits: countUnpushedCommits(cwd),
51
+ pr,
52
+ prReview,
53
+ branchSize,
54
+ branchSizeWarnings: branchSizeWarnings(branchSize, policy),
55
+ blockers: [],
56
+ warnings: [],
57
+ };
58
+ if (!status.sprint)
59
+ status.warnings.push('No sprint could be inferred; pass --sprint=N for scorecard/review checks.');
60
+ if (status.sprint && !status.scorecardExists)
61
+ status.blockers.push(`Sprint S${status.sprint} scorecard is missing.`);
62
+ if (status.sprint && !status.sprintReviewExists)
63
+ status.blockers.push(`Sprint S${status.sprint} retrospective review markdown is missing.`);
64
+ if (typeof status.unpushedCommits === 'number' && status.unpushedCommits > 0) {
65
+ status.blockers.push(`Branch has ${status.unpushedCommits} unpushed commit${status.unpushedCommits === 1 ? '' : 's'}.`);
66
+ }
67
+ if (!status.pr)
68
+ status.blockers.push('No open PR found for the current branch.');
69
+ if (status.prReview !== 'reviewed') {
70
+ status.blockers.push(status.prReview === 'pending'
71
+ ? 'PR review is pending; run slope pr review.'
72
+ : 'No PR implementation review record found; run slope pr review.');
73
+ }
74
+ status.warnings.push(...status.branchSizeWarnings);
75
+ return status;
76
+ }
77
+ export function formatPrCloseoutStatus(status) {
78
+ const lines = [
79
+ '',
80
+ 'PR closeout status',
81
+ '══════════════════',
82
+ `Sprint: ${status.sprint ? `S${status.sprint}` : 'unknown'}`,
83
+ `Branch: ${status.branch ?? 'unknown'}`,
84
+ `Scorecard: ${status.scorecardExists ? 'ok' : 'missing'}${status.scorecardPath ? ` (${status.scorecardPath})` : ''}`,
85
+ `Sprint review: ${status.sprintReviewExists ? 'ok' : 'missing'}${status.sprintReviewPath ? ` (${status.sprintReviewPath})` : ''}`,
86
+ `Push state: ${formatPushState(status.unpushedCommits)}`,
87
+ `PR: ${status.pr ? `#${status.pr.number}${status.pr.state ? ` ${status.pr.state}` : ''}${status.pr.url ? ` ${status.pr.url}` : ''}` : 'missing'}`,
88
+ `PR review: ${status.prReview}`,
89
+ `Branch size: ${formatBranchSize(status.branchSize)}`,
90
+ ];
91
+ if (status.blockers.length > 0) {
92
+ lines.push('', 'Blockers:', ...status.blockers.map(item => ` - ${item}`));
93
+ }
94
+ if (status.warnings.length > 0) {
95
+ lines.push('', 'Warnings:', ...status.warnings.map(item => ` - ${item}`));
96
+ }
97
+ lines.push('', status.blockers.length === 0 ? 'Ready for PR closeout.' : 'Not ready for PR closeout.');
98
+ return lines.join('\n');
99
+ }
100
+ function formatPushState(unpushed) {
101
+ if (typeof unpushed !== 'number')
102
+ return 'unknown';
103
+ return unpushed === 0 ? 'ok' : `${unpushed} unpushed`;
104
+ }
105
+ function formatBranchSize(size) {
106
+ const commits = typeof size.commits === 'number' ? `${size.commits} commit${size.commits === 1 ? '' : 's'}` : 'unknown commits';
107
+ const files = typeof size.files === 'number' ? `${size.files} file${size.files === 1 ? '' : 's'}` : 'unknown files';
108
+ return `${commits}, ${files}${size.base ? ` vs ${size.base}` : ''}`;
109
+ }
110
+ function inferSprint(cwd) {
111
+ const state = loadSprintState(cwd);
112
+ if (isActiveSprintState(state))
113
+ return state.sprint;
114
+ const config = loadConfig(cwd);
115
+ return config.currentSprint ?? (detectLatestSprint(config, cwd) || undefined);
116
+ }
117
+ function currentBranch(cwd) {
118
+ try {
119
+ return execFileSync('git', ['branch', '--show-current'], { cwd, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }).trim() || undefined;
120
+ }
121
+ catch {
122
+ return undefined;
123
+ }
124
+ }
125
+ function currentPr() {
126
+ try {
127
+ const raw = execFileSync('gh', ['pr', 'view', '--json', 'number,url,state,baseRefName,headRefName'], {
128
+ encoding: 'utf8',
129
+ stdio: ['ignore', 'pipe', 'ignore'],
130
+ }).trim();
131
+ const parsed = JSON.parse(raw);
132
+ return typeof parsed.number === 'number' ? parsed : null;
133
+ }
134
+ catch {
135
+ return null;
136
+ }
137
+ }
138
+ function countUnpushedCommits(cwd) {
139
+ try {
140
+ execFileSync('git', ['rev-parse', '--abbrev-ref', '--symbolic-full-name', '@{u}'], { cwd, stdio: ['ignore', 'ignore', 'ignore'] });
141
+ const raw = execFileSync('git', ['rev-list', '--count', '@{u}..HEAD'], {
142
+ cwd,
143
+ encoding: 'utf8',
144
+ stdio: ['ignore', 'pipe', 'ignore'],
145
+ }).trim();
146
+ return Number.parseInt(raw, 10);
147
+ }
148
+ catch {
149
+ return undefined;
150
+ }
151
+ }
152
+ function inferBaseRef(cwd) {
153
+ for (const ref of ['origin/main', 'origin/master', 'main', 'master']) {
154
+ try {
155
+ execFileSync('git', ['rev-parse', '--verify', ref], { cwd, stdio: ['ignore', 'ignore', 'ignore'] });
156
+ return ref;
157
+ }
158
+ catch { /* try next */ }
159
+ }
160
+ return undefined;
161
+ }
162
+ function collectBranchSize(cwd, base) {
163
+ if (!base)
164
+ return {};
165
+ const size = { base };
166
+ try {
167
+ const raw = execFileSync('git', ['rev-list', '--count', `${base}..HEAD`], {
168
+ cwd,
169
+ encoding: 'utf8',
170
+ stdio: ['ignore', 'pipe', 'ignore'],
171
+ }).trim();
172
+ size.commits = Number.parseInt(raw, 10);
173
+ }
174
+ catch { /* best-effort */ }
175
+ try {
176
+ const raw = execFileSync('git', ['diff', '--name-only', `${base}...HEAD`], {
177
+ cwd,
178
+ encoding: 'utf8',
179
+ stdio: ['ignore', 'pipe', 'ignore'],
180
+ }).trim();
181
+ size.files = raw ? raw.split('\n').filter(Boolean).length : 0;
182
+ }
183
+ catch { /* best-effort */ }
184
+ return size;
185
+ }
186
+ function resolvePrReviewStatus(cwd, input) {
187
+ const reviews = loadPrReviewState(cwd).reviews;
188
+ const matching = reviews.filter(review => (input.pr != null && review.pr === input.pr)
189
+ || (input.sprint != null && review.sprint === input.sprint)
190
+ || (input.branch != null && review.branch === input.branch));
191
+ if (matching.some(review => review.status === 'reviewed'))
192
+ return 'reviewed';
193
+ if (matching.some(review => review.status === 'pending'))
194
+ return 'pending';
195
+ return 'missing';
196
+ }
197
+ //# sourceMappingURL=pr-closeout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pr-closeout.js","sourceRoot":"","sources":["../../src/cli/pr-closeout.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import type { RoadmapDefinition, RoadmapValidationError, RoadmapValidationResult, RoadmapValidationWarning } from '../core/index.js';
2
+ export interface RoadmapReality {
3
+ roadmap?: RoadmapDefinition;
4
+ validation?: RoadmapValidationResult;
5
+ }
6
+ export interface WorktreeReality {
7
+ path: string;
8
+ branch: string;
9
+ head: string;
10
+ ahead: number;
11
+ behind: number;
12
+ dirtyFiles: string[];
13
+ changedFiles: string[];
14
+ migrationFiles: string[];
15
+ }
16
+ export interface WorktreeOverlap {
17
+ path: string;
18
+ branch: string;
19
+ files: string[];
20
+ }
21
+ type RoadmapIssue = RoadmapValidationError | RoadmapValidationWarning;
22
+ export declare function buildRoadmapReality(cwd: string, roadmap: RoadmapDefinition): RoadmapReality;
23
+ export declare function loadRoadmapReality(cwd: string): RoadmapReality;
24
+ export declare function roadmapRealityIssues(reality: RoadmapReality, sprint?: number): RoadmapIssue[];
25
+ export declare function blockingRoadmapIssuesForSprint(reality: RoadmapReality, sprint: number): RoadmapIssue[];
26
+ export declare function formatRoadmapRealitySection(reality: RoadmapReality, sprint?: number, limit?: number): string[];
27
+ export declare function collectSiblingWorktreeReality(cwd: string, baseRef?: string): WorktreeReality[];
28
+ export declare function parseTouchedPaths(value: string | undefined): string[];
29
+ export declare function findWorktreeOverlaps(worktrees: WorktreeReality[], touchedPaths: string[]): WorktreeOverlap[];
30
+ export declare function formatWorktreeRealitySection(worktrees: WorktreeReality[], touchedPaths?: string[]): string[];
31
+ export declare function relativeWorktreePath(cwd: string, path: string): string;
32
+ export {};
33
+ //# sourceMappingURL=pre-sprint-reality.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pre-sprint-reality.d.ts","sourceRoot":"","sources":["../../src/cli/pre-sprint-reality.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EACV,iBAAiB,EACjB,sBAAsB,EACtB,uBAAuB,EACvB,wBAAwB,EACzB,MAAM,kBAAkB,CAAC;AAG1B,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,UAAU,CAAC,EAAE,uBAAuB,CAAC;CACtC;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,KAAK,YAAY,GAAG,sBAAsB,GAAG,wBAAwB,CAAC;AAQtE,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,cAAc,CAQ3F;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAa9D;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE,CAO7F;AAED,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY,EAAE,CAGtG;AAED,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,MAAM,EAAE,CAezG;AAED,wBAAgB,6BAA6B,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe,EAAE,CAS9F;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE,CAMrE;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,eAAe,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,eAAe,EAAE,CAc5G;AAED,wBAAgB,4BAA4B,CAAC,SAAS,EAAE,eAAe,EAAE,EAAE,YAAY,GAAE,MAAM,EAAO,GAAG,MAAM,EAAE,CAkChH;AAyID,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAGtE"}
@@ -0,0 +1,253 @@
1
+ import { execFileSync } from 'node:child_process';
2
+ import { existsSync, readFileSync } from 'node:fs';
3
+ import { join, relative, resolve } from 'node:path';
4
+ import { castRoadmapStructure, findShippedSprintsOnMain, formatSprintLabel, loadScorecards, parseRoadmap, validateRoadmap, } from '../core/index.js';
5
+ import { loadConfig } from './config.js';
6
+ export function buildRoadmapReality(cwd, roadmap) {
7
+ const config = loadConfig(cwd);
8
+ const scorecards = loadScorecards(config, cwd).map(s => ({ sprint_number: s.sprint_number }));
9
+ const shippedSprintIds = findShippedSprintsOnMain(cwd);
10
+ return {
11
+ roadmap,
12
+ validation: validateRoadmap(roadmap, scorecards, shippedSprintIds),
13
+ };
14
+ }
15
+ export function loadRoadmapReality(cwd) {
16
+ const config = loadConfig(cwd);
17
+ const path = join(cwd, config.roadmapPath);
18
+ if (!existsSync(path))
19
+ return {};
20
+ try {
21
+ const raw = JSON.parse(readFileSync(path, 'utf8'));
22
+ const parsed = parseRoadmap(raw);
23
+ const roadmap = parsed.roadmap ?? castRoadmapStructure(raw) ?? undefined;
24
+ return roadmap ? buildRoadmapReality(cwd, roadmap) : {};
25
+ }
26
+ catch {
27
+ return {};
28
+ }
29
+ }
30
+ export function roadmapRealityIssues(reality, sprint) {
31
+ const validation = reality.validation;
32
+ if (!validation)
33
+ return [];
34
+ return [...validation.errors, ...validation.warnings]
35
+ .filter(isRealityIssue)
36
+ .filter(issue => sprint == null || issue.sprint === sprint);
37
+ }
38
+ export function blockingRoadmapIssuesForSprint(reality, sprint) {
39
+ return roadmapRealityIssues(reality, sprint)
40
+ .filter(issue => /has shipped commits on main|has a scorecard/.test(issue.message));
41
+ }
42
+ export function formatRoadmapRealitySection(reality, sprint, limit = 8) {
43
+ const issues = roadmapRealityIssues(reality, sprint);
44
+ if (issues.length === 0)
45
+ return [];
46
+ const shown = issues.slice(0, limit);
47
+ const lines = ['ROADMAP REALITY CHECKS'];
48
+ for (const issue of shown) {
49
+ const level = issue.type === 'error' ? 'error' : 'warn';
50
+ const loc = issue.sprint ? `[${formatSprintLabel(issue.sprint)}] ` : '';
51
+ lines.push(` [${level}] ${loc}${issue.message}`);
52
+ }
53
+ if (issues.length > shown.length) {
54
+ lines.push(` ... ${issues.length - shown.length} more roadmap reality issue(s)`);
55
+ }
56
+ return lines;
57
+ }
58
+ export function collectSiblingWorktreeReality(cwd, baseRef) {
59
+ const worktrees = listWorktrees(cwd);
60
+ if (worktrees.length <= 1)
61
+ return [];
62
+ const currentPath = currentWorktreePath(cwd);
63
+ const base = baseRef ?? resolveBaseRef(cwd);
64
+ return worktrees
65
+ .filter(wt => resolve(wt.path) !== currentPath)
66
+ .map(wt => buildWorktreeReality(wt, base));
67
+ }
68
+ export function parseTouchedPaths(value) {
69
+ if (!value)
70
+ return [];
71
+ return value
72
+ .split(',')
73
+ .map(p => normalizeRepoPath(p))
74
+ .filter(Boolean);
75
+ }
76
+ export function findWorktreeOverlaps(worktrees, touchedPaths) {
77
+ if (touchedPaths.length === 0)
78
+ return [];
79
+ const overlaps = [];
80
+ for (const wt of worktrees) {
81
+ const candidateFiles = unique([...wt.dirtyFiles, ...wt.changedFiles, ...wt.migrationFiles]);
82
+ const files = candidateFiles.filter(file => touchedPaths.some(touched => pathsOverlap(file, touched)));
83
+ if (files.length > 0) {
84
+ overlaps.push({ path: wt.path, branch: wt.branch, files });
85
+ }
86
+ }
87
+ return overlaps;
88
+ }
89
+ export function formatWorktreeRealitySection(worktrees, touchedPaths = []) {
90
+ if (worktrees.length === 0)
91
+ return [];
92
+ const lines = ['WORKTREE CONFLICT SURFACE'];
93
+ for (const wt of worktrees) {
94
+ const branch = wt.branch || '(detached)';
95
+ lines.push(` ${branch} at ${wt.path} (ahead ${wt.ahead}, behind ${wt.behind})`);
96
+ if (wt.dirtyFiles.length > 0) {
97
+ lines.push(` dirty: ${formatFileList(wt.dirtyFiles)}`);
98
+ }
99
+ if (wt.changedFiles.length > 0) {
100
+ lines.push(` ahead files: ${formatFileList(wt.changedFiles)}`);
101
+ }
102
+ if (wt.migrationFiles.length > 0) {
103
+ lines.push(` migrations: ${formatFileList(wt.migrationFiles)}`);
104
+ }
105
+ if (wt.dirtyFiles.length === 0 && wt.changedFiles.length === 0) {
106
+ lines.push(' no dirty or ahead files detected');
107
+ }
108
+ }
109
+ const overlaps = findWorktreeOverlaps(worktrees, touchedPaths);
110
+ if (overlaps.length > 0) {
111
+ lines.push('');
112
+ lines.push(' Potential overlap with requested touched paths:');
113
+ for (const overlap of overlaps) {
114
+ lines.push(` [!!] ${overlap.branch || '(detached)'}: ${formatFileList(overlap.files, 8)}`);
115
+ }
116
+ }
117
+ else if (touchedPaths.length === 0) {
118
+ lines.push('');
119
+ lines.push(' Tip: pass --touches=path/to/file,path/to/dir to block on direct overlap during sprint start.');
120
+ }
121
+ return lines;
122
+ }
123
+ function isRealityIssue(issue) {
124
+ return /scorecard|shipped commits|phantom sprint/i.test(issue.message);
125
+ }
126
+ function listWorktrees(cwd) {
127
+ const output = git(cwd, ['worktree', 'list', '--porcelain']);
128
+ if (!output)
129
+ return [];
130
+ const worktrees = [];
131
+ let current = {};
132
+ for (const line of output.split('\n')) {
133
+ if (line.startsWith('worktree ')) {
134
+ if (current.path)
135
+ worktrees.push(normalizeWorktree(current));
136
+ current = { path: line.slice('worktree '.length) };
137
+ }
138
+ else if (line.startsWith('HEAD ')) {
139
+ current.head = line.slice('HEAD '.length);
140
+ }
141
+ else if (line.startsWith('branch ')) {
142
+ current.branch = line.slice('branch '.length).replace('refs/heads/', '');
143
+ }
144
+ else if (line === '') {
145
+ if (current.path)
146
+ worktrees.push(normalizeWorktree(current));
147
+ current = {};
148
+ }
149
+ }
150
+ if (current.path)
151
+ worktrees.push(normalizeWorktree(current));
152
+ return worktrees;
153
+ }
154
+ function normalizeWorktree(wt) {
155
+ return {
156
+ path: wt.path ?? '',
157
+ branch: wt.branch ?? '',
158
+ head: wt.head ?? '',
159
+ };
160
+ }
161
+ function buildWorktreeReality(wt, baseRef) {
162
+ const statusFiles = parseStatus(git(wt.path, ['status', '--porcelain=v1', '--untracked-files=all']));
163
+ const changedFiles = splitLines(git(wt.path, ['diff', '--name-only', `${baseRef}...HEAD`]))
164
+ .map(normalizeRepoPath)
165
+ .filter(isRelevantPath);
166
+ const counts = parseAheadBehind(git(wt.path, ['rev-list', '--left-right', '--count', `${baseRef}...HEAD`]));
167
+ const migrationFiles = unique([...statusFiles, ...changedFiles].filter(isMigrationPath));
168
+ return {
169
+ path: wt.path,
170
+ branch: wt.branch,
171
+ head: wt.head,
172
+ ahead: counts.ahead,
173
+ behind: counts.behind,
174
+ dirtyFiles: statusFiles,
175
+ changedFiles,
176
+ migrationFiles,
177
+ };
178
+ }
179
+ function currentWorktreePath(cwd) {
180
+ const top = git(cwd, ['rev-parse', '--show-toplevel']);
181
+ return resolve(top || cwd);
182
+ }
183
+ function resolveBaseRef(cwd) {
184
+ for (const ref of ['origin/main', 'main', 'master', 'HEAD']) {
185
+ if (git(cwd, ['rev-parse', '--verify', ref]))
186
+ return ref;
187
+ }
188
+ return 'HEAD';
189
+ }
190
+ function git(cwd, args) {
191
+ try {
192
+ return execFileSync('git', args, {
193
+ cwd,
194
+ encoding: 'utf8',
195
+ stdio: ['ignore', 'pipe', 'ignore'],
196
+ timeout: 10000,
197
+ }).trimEnd();
198
+ }
199
+ catch {
200
+ return '';
201
+ }
202
+ }
203
+ function parseStatus(output) {
204
+ return output.split('\n')
205
+ .map(line => line.trimEnd())
206
+ .filter(Boolean)
207
+ .map(line => normalizeStatusPath(line.slice(3)))
208
+ .map(normalizeRepoPath)
209
+ .filter(isRelevantPath);
210
+ }
211
+ function parseAheadBehind(output) {
212
+ const [left, right] = output.trim().split(/\s+/).map(v => parseInt(v, 10));
213
+ return {
214
+ behind: Number.isFinite(left) ? left : 0,
215
+ ahead: Number.isFinite(right) ? right : 0,
216
+ };
217
+ }
218
+ function normalizeStatusPath(path) {
219
+ const renameArrow = ' -> ';
220
+ return path.includes(renameArrow) ? path.slice(path.indexOf(renameArrow) + renameArrow.length) : path;
221
+ }
222
+ function normalizeRepoPath(path) {
223
+ return path.trim().replace(/\\/g, '/').replace(/^\.\//, '').replace(/\/+$/, '');
224
+ }
225
+ function pathsOverlap(a, b) {
226
+ if (a === b)
227
+ return true;
228
+ return a.startsWith(`${b}/`) || b.startsWith(`${a}/`);
229
+ }
230
+ function isRelevantPath(path) {
231
+ if (!path)
232
+ return false;
233
+ return !/^(?:\.git|\.slope|\.codex|\.claude|node_modules|dist|coverage|\.DS_Store)(?:\/|$)/.test(path);
234
+ }
235
+ function isMigrationPath(path) {
236
+ return /(^|\/)(?:migrations?|drizzle)(\/|$)/i.test(path) || /\b\d{3,}[_-].*\.sql$/i.test(path);
237
+ }
238
+ function splitLines(output) {
239
+ return output.split('\n').map(line => line.trim()).filter(Boolean);
240
+ }
241
+ function unique(values) {
242
+ return [...new Set(values)];
243
+ }
244
+ function formatFileList(files, limit = 6) {
245
+ const shown = files.slice(0, limit);
246
+ const suffix = files.length > shown.length ? ` (+${files.length - shown.length} more)` : '';
247
+ return shown.join(', ') + suffix;
248
+ }
249
+ export function relativeWorktreePath(cwd, path) {
250
+ const rel = relative(cwd, path);
251
+ return rel && !rel.startsWith('..') ? rel : path;
252
+ }
253
+ //# sourceMappingURL=pre-sprint-reality.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pre-sprint-reality.js","sourceRoot":"","sources":["../../src/cli/pre-sprint-reality.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/cli/registry.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,OAAO;IACtB,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,wBAAwB;IACxB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,wBAAwB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,wDAAwD;IACxD,GAAG,EAAE,MAAM,CAAC;IACZ,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,QAAQ,EAAE,WAAW,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,CAAC;IACxE,0BAA0B;IAC1B,WAAW,CAAC,EAAE,aAAa,EAAE,CAAC;IAC9B,0EAA0E;IAC1E,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;CACnB;AAED,qGAAqG;AACrG,eAAO,MAAM,oBAAoB,iEAAkE,CAAC;AAEpG,eAAO,MAAM,oBAAoB,EAAE,SAAS,cAAc,EAuqBzD,CAAC"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/cli/registry.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,OAAO;IACtB,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,wBAAwB;IACxB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,wBAAwB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,wDAAwD;IACxD,GAAG,EAAE,MAAM,CAAC;IACZ,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,QAAQ,EAAE,WAAW,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,CAAC;IACxE,0BAA0B;IAC1B,WAAW,CAAC,EAAE,aAAa,EAAE,CAAC;IAC9B,0EAA0E;IAC1E,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;CACnB;AAED,qGAAqG;AACrG,eAAO,MAAM,oBAAoB,iEAAkE,CAAC;AAEpG,eAAO,MAAM,oBAAoB,EAAE,SAAS,cAAc,EAqrBzD,CAAC"}
@@ -87,6 +87,8 @@ export const CLI_COMMAND_REGISTRY = [
87
87
  { name: 'start', desc: 'Start a new sprint', flags: [
88
88
  { flag: '--number=<N>', desc: 'Sprint number (required)' },
89
89
  { flag: '--phase=<phase>', desc: 'Initial phase (default: planning)' },
90
+ { flag: '--touches=<paths>', desc: 'Comma-separated paths to check against sibling worktrees' },
91
+ { flag: '--force', desc: 'Override pre-sprint reality-check blockers' },
90
92
  ] },
91
93
  { name: 'gate', desc: 'Mark a gate as complete', flags: [
92
94
  { flag: '<name>', desc: 'Gate name to complete' },
@@ -506,6 +508,10 @@ export const CLI_COMMAND_REGISTRY = [
506
508
  {
507
509
  cmd: 'worktree', desc: 'Manage git worktrees', category: 'tooling',
508
510
  subcommands: [
511
+ { name: 'status', desc: 'Show sibling worktree dirty/ahead/migration state', flags: [
512
+ { flag: '--base=<ref>', desc: 'Base ref for ahead/behind and changed-file detection' },
513
+ { flag: '--touches=<paths>', desc: 'Comma-separated paths to check for overlap' },
514
+ ] },
509
515
  { name: 'cleanup', desc: 'Clean up stale worktrees (remove, delete branch, delete remote)', flags: [
510
516
  { flag: '--path=<path>', desc: 'Target a specific worktree' },
511
517
  { flag: '--all', desc: 'Clean up all secondary worktrees' },
@@ -664,12 +670,20 @@ export const CLI_COMMAND_REGISTRY = [
664
670
  ],
665
671
  },
666
672
  {
667
- cmd: 'pr', desc: 'Pull request helpers (auto-close, finalize)', category: 'tooling',
673
+ cmd: 'pr', desc: 'Pull request helpers (auto-close, finalize, closeout)', category: 'tooling',
668
674
  subcommands: [
669
675
  { name: 'finalize', desc: 'Inject Closes #N for issue refs in commit messages (#321)', flags: [
670
676
  { flag: '--pr=<N>', desc: 'PR number (default: resolved from current branch)' },
671
677
  { flag: '--dry-run', desc: 'Print plan without modifying the PR body' },
672
678
  ] },
679
+ { name: 'review', desc: 'Run post-PR implementation review workflow', flags: [
680
+ { flag: '--pr=<N>', desc: 'PR number (default: resolved from current branch)' },
681
+ { flag: '--sprint=<N>', desc: 'Sprint number for review context' },
682
+ { flag: '--type=<type>', desc: 'architect, code, or both' },
683
+ ] },
684
+ { name: 'status', desc: 'Check PR closeout readiness', flags: [
685
+ { flag: '--sprint=<N>', desc: 'Sprint number for scorecard/review checks' },
686
+ ] },
673
687
  { name: 'issues', desc: 'Print extracted issue refs from the branch commits' },
674
688
  ],
675
689
  },