@slope-dev/slope 1.60.0 → 1.62.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.
Files changed (135) hide show
  1. package/README.md +6 -0
  2. package/dist/cli/commands/agent.js +2 -2
  3. package/dist/cli/commands/agent.js.map +1 -1
  4. package/dist/cli/commands/commit-ready.js +1 -1
  5. package/dist/cli/commands/commit-ready.js.map +1 -1
  6. package/dist/cli/commands/next.d.ts +1 -1
  7. package/dist/cli/commands/next.d.ts.map +1 -1
  8. package/dist/cli/commands/next.js +31 -2
  9. package/dist/cli/commands/next.js.map +1 -1
  10. package/dist/cli/commands/now.d.ts +3 -0
  11. package/dist/cli/commands/now.d.ts.map +1 -1
  12. package/dist/cli/commands/now.js +14 -2
  13. package/dist/cli/commands/now.js.map +1 -1
  14. package/dist/cli/commands/pr.d.ts +11 -3
  15. package/dist/cli/commands/pr.d.ts.map +1 -1
  16. package/dist/cli/commands/pr.js +81 -31
  17. package/dist/cli/commands/pr.js.map +1 -1
  18. package/dist/cli/commands/review-run.d.ts +40 -6
  19. package/dist/cli/commands/review-run.d.ts.map +1 -1
  20. package/dist/cli/commands/review-run.js +235 -105
  21. package/dist/cli/commands/review-run.js.map +1 -1
  22. package/dist/cli/commands/review-state.d.ts.map +1 -1
  23. package/dist/cli/commands/review-state.js +61 -7
  24. package/dist/cli/commands/review-state.js.map +1 -1
  25. package/dist/cli/commands/review.d.ts +9 -1
  26. package/dist/cli/commands/review.d.ts.map +1 -1
  27. package/dist/cli/commands/review.js +67 -39
  28. package/dist/cli/commands/review.js.map +1 -1
  29. package/dist/cli/commands/roadmap.d.ts.map +1 -1
  30. package/dist/cli/commands/roadmap.js +364 -5
  31. package/dist/cli/commands/roadmap.js.map +1 -1
  32. package/dist/cli/commands/sprint.d.ts.map +1 -1
  33. package/dist/cli/commands/sprint.js +353 -54
  34. package/dist/cli/commands/sprint.js.map +1 -1
  35. package/dist/cli/guards/claim-required.d.ts.map +1 -1
  36. package/dist/cli/guards/claim-required.js +19 -4
  37. package/dist/cli/guards/claim-required.js.map +1 -1
  38. package/dist/cli/guards/next-action.js +1 -1
  39. package/dist/cli/guards/next-action.js.map +1 -1
  40. package/dist/cli/guards/phase-boundary.d.ts.map +1 -1
  41. package/dist/cli/guards/phase-boundary.js +8 -2
  42. package/dist/cli/guards/phase-boundary.js.map +1 -1
  43. package/dist/cli/guards/post-push.js +2 -2
  44. package/dist/cli/guards/post-push.js.map +1 -1
  45. package/dist/cli/guards/review-tier.d.ts.map +1 -1
  46. package/dist/cli/guards/review-tier.js +2 -3
  47. package/dist/cli/guards/review-tier.js.map +1 -1
  48. package/dist/cli/guards/roadmap-edit-shipped.d.ts.map +1 -1
  49. package/dist/cli/guards/roadmap-edit-shipped.js +143 -7
  50. package/dist/cli/guards/roadmap-edit-shipped.js.map +1 -1
  51. package/dist/cli/guards/scope-drift.d.ts.map +1 -1
  52. package/dist/cli/guards/scope-drift.js +8 -2
  53. package/dist/cli/guards/scope-drift.js.map +1 -1
  54. package/dist/cli/guards/session-briefing.js +6 -2
  55. package/dist/cli/guards/session-briefing.js.map +1 -1
  56. package/dist/cli/guards/sprint-completion.d.ts.map +1 -1
  57. package/dist/cli/guards/sprint-completion.js +94 -18
  58. package/dist/cli/guards/sprint-completion.js.map +1 -1
  59. package/dist/cli/index.js +4 -2
  60. package/dist/cli/index.js.map +1 -1
  61. package/dist/cli/registry.d.ts.map +1 -1
  62. package/dist/cli/registry.js +31 -0
  63. package/dist/cli/registry.js.map +1 -1
  64. package/dist/cli/review-diff.d.ts +72 -0
  65. package/dist/cli/review-diff.d.ts.map +1 -0
  66. package/dist/cli/review-diff.js +416 -0
  67. package/dist/cli/review-diff.js.map +1 -0
  68. package/dist/cli/roadmap-source-migration.d.ts +113 -0
  69. package/dist/cli/roadmap-source-migration.d.ts.map +1 -0
  70. package/dist/cli/roadmap-source-migration.js +721 -0
  71. package/dist/cli/roadmap-source-migration.js.map +1 -0
  72. package/dist/cli/roadmap-source-store.d.ts +44 -0
  73. package/dist/cli/roadmap-source-store.d.ts.map +1 -0
  74. package/dist/cli/roadmap-source-store.js +307 -0
  75. package/dist/cli/roadmap-source-store.js.map +1 -0
  76. package/dist/cli/sprint-inference.js +1 -1
  77. package/dist/cli/sprint-inference.js.map +1 -1
  78. package/dist/cli/sprint-rollover.d.ts +102 -0
  79. package/dist/cli/sprint-rollover.d.ts.map +1 -0
  80. package/dist/cli/sprint-rollover.js +558 -0
  81. package/dist/cli/sprint-rollover.js.map +1 -0
  82. package/dist/cli/sprint-state.d.ts +72 -1
  83. package/dist/cli/sprint-state.d.ts.map +1 -1
  84. package/dist/cli/sprint-state.js +203 -5
  85. package/dist/cli/sprint-state.js.map +1 -1
  86. package/dist/cli/template-generator.d.ts.map +1 -1
  87. package/dist/cli/template-generator.js +45 -32
  88. package/dist/cli/template-generator.js.map +1 -1
  89. package/dist/cli/workflow-resync.d.ts.map +1 -1
  90. package/dist/cli/workflow-resync.js +9 -8
  91. package/dist/cli/workflow-resync.js.map +1 -1
  92. package/dist/core/briefing.d.ts.map +1 -1
  93. package/dist/core/briefing.js +254 -14
  94. package/dist/core/briefing.js.map +1 -1
  95. package/dist/core/builder.d.ts +16 -2
  96. package/dist/core/builder.d.ts.map +1 -1
  97. package/dist/core/builder.js +82 -5
  98. package/dist/core/builder.js.map +1 -1
  99. package/dist/core/index.d.ts +9 -3
  100. package/dist/core/index.d.ts.map +1 -1
  101. package/dist/core/index.js +4 -1
  102. package/dist/core/index.js.map +1 -1
  103. package/dist/core/roadmap-focus.d.ts +101 -0
  104. package/dist/core/roadmap-focus.d.ts.map +1 -0
  105. package/dist/core/roadmap-focus.js +293 -0
  106. package/dist/core/roadmap-focus.js.map +1 -0
  107. package/dist/core/roadmap-migration.d.ts +101 -0
  108. package/dist/core/roadmap-migration.d.ts.map +1 -0
  109. package/dist/core/roadmap-migration.js +630 -0
  110. package/dist/core/roadmap-migration.js.map +1 -0
  111. package/dist/core/roadmap-sources.d.ts +52 -0
  112. package/dist/core/roadmap-sources.d.ts.map +1 -0
  113. package/dist/core/roadmap-sources.js +487 -0
  114. package/dist/core/roadmap-sources.js.map +1 -0
  115. package/dist/core/roadmap.d.ts +25 -1
  116. package/dist/core/roadmap.d.ts.map +1 -1
  117. package/dist/core/roadmap.js +62 -45
  118. package/dist/core/roadmap.js.map +1 -1
  119. package/dist/core/workflow-engine.d.ts.map +1 -1
  120. package/dist/core/workflow-engine.js +17 -2
  121. package/dist/core/workflow-engine.js.map +1 -1
  122. package/dist/mcp/registry.d.ts +1 -1
  123. package/dist/mcp/registry.d.ts.map +1 -1
  124. package/dist/mcp/registry.js +5 -4
  125. package/dist/mcp/registry.js.map +1 -1
  126. package/package.json +1 -1
  127. package/src/core/workflows/sprint-standard.yaml +1 -1
  128. package/templates/claude-code/CLAUDE.md +3 -1
  129. package/templates/claude-code/commands/start-sprint.md +9 -5
  130. package/templates/claude-code/rules/sprint-checklist.md +13 -10
  131. package/templates/codex/plugins/slope/.codex-plugin/plugin.json +1 -1
  132. package/templates/codex/plugins/slope/skills/slope-sprint/SKILL.md +5 -4
  133. package/templates/cursor/rules/slope-sprint-checklist.mdc +11 -8
  134. package/templates/generic/SLOPE-CHECKLIST.md +10 -7
  135. package/templates/pi/skills/start-sprint.md +9 -5
@@ -0,0 +1,416 @@
1
+ import { spawn } from 'node:child_process';
2
+ export const DEFAULT_REVIEW_DIFF_BYTES = 256 * 1024;
3
+ export const MAX_REVIEW_DIFF_BYTES = 4 * 1024 * 1024;
4
+ const GH_STDOUT_LIMIT = 32 * 1024 * 1024;
5
+ const GH_STDERR_LIMIT = 16 * 1024;
6
+ const GH_TIMEOUT_MS = 45_000;
7
+ const REVIEW_COLLECTION_TIMEOUT_MS = 120_000;
8
+ const PROCESS_KILL_GRACE_MS = 1_000;
9
+ const PROCESS_TERMINAL_WAIT_MS = 1_000;
10
+ const FILES_PAGE_SIZE = 100;
11
+ const GITHUB_FILES_LIMIT = 3_000;
12
+ export class ReviewDiffError extends Error {
13
+ kind;
14
+ stage;
15
+ exitCode;
16
+ stderr;
17
+ constructor(kind, stage, message, exitCode = null, stderr = '') {
18
+ super(message);
19
+ this.kind = kind;
20
+ this.stage = stage;
21
+ this.exitCode = exitCode;
22
+ this.stderr = stderr;
23
+ this.name = 'ReviewDiffError';
24
+ }
25
+ }
26
+ function appendBounded(chunks, chunk, retained, maxBytes) {
27
+ const available = Math.max(0, maxBytes - retained.bytes);
28
+ if (available > 0) {
29
+ const kept = chunk.subarray(0, available);
30
+ chunks.push(kept);
31
+ retained.bytes += kept.length;
32
+ }
33
+ return chunk.length > available;
34
+ }
35
+ /** Spawn without a shell, drain both pipes, and retain only bounded output. */
36
+ export function runBoundedProcess(command, args, options = {}) {
37
+ const maxStdoutBytes = options.maxStdoutBytes ?? GH_STDOUT_LIMIT;
38
+ const maxStderrBytes = options.maxStderrBytes ?? GH_STDERR_LIMIT;
39
+ const timeoutMs = options.timeoutMs ?? GH_TIMEOUT_MS;
40
+ const killGraceMs = options.killGraceMs ?? PROCESS_KILL_GRACE_MS;
41
+ const terminalWaitMs = options.terminalWaitMs ?? PROCESS_TERMINAL_WAIT_MS;
42
+ return new Promise(resolve => {
43
+ const stdout = [];
44
+ const stderr = [];
45
+ const stdoutRetained = { bytes: 0 };
46
+ const stderrRetained = { bytes: 0 };
47
+ let stdoutOverflow = false;
48
+ let stderrOverflow = false;
49
+ let timedOut = false;
50
+ let spawnCode;
51
+ let settled = false;
52
+ let forceKillTimer;
53
+ let terminalTimer;
54
+ const child = spawn(command, args, {
55
+ cwd: options.cwd,
56
+ stdio: ['ignore', 'pipe', 'pipe'],
57
+ windowsHide: true,
58
+ });
59
+ child.stdout.on('data', (value) => {
60
+ const chunk = Buffer.isBuffer(value) ? value : Buffer.from(value);
61
+ stdoutOverflow = appendBounded(stdout, chunk, stdoutRetained, maxStdoutBytes) || stdoutOverflow;
62
+ });
63
+ child.stderr.on('data', (value) => {
64
+ const chunk = Buffer.isBuffer(value) ? value : Buffer.from(value);
65
+ stderrOverflow = appendBounded(stderr, chunk, stderrRetained, maxStderrBytes) || stderrOverflow;
66
+ });
67
+ child.on('error', (error) => {
68
+ spawnCode = error.code;
69
+ });
70
+ const finish = (exitCode, signal) => {
71
+ if (settled)
72
+ return;
73
+ settled = true;
74
+ clearTimeout(timer);
75
+ if (forceKillTimer)
76
+ clearTimeout(forceKillTimer);
77
+ if (terminalTimer)
78
+ clearTimeout(terminalTimer);
79
+ resolve({
80
+ stdout: Buffer.concat(stdout).toString('utf8'),
81
+ stderr: Buffer.concat(stderr).toString('utf8'),
82
+ exitCode,
83
+ signal,
84
+ timedOut,
85
+ stdoutOverflow,
86
+ stderrOverflow,
87
+ spawnCode,
88
+ });
89
+ };
90
+ const timer = setTimeout(() => {
91
+ timedOut = true;
92
+ child.kill();
93
+ forceKillTimer = setTimeout(() => {
94
+ if (settled)
95
+ return;
96
+ child.kill('SIGKILL');
97
+ // A platform or mocked process may never emit close even after a
98
+ // force-kill attempt. Resolve terminally after one final bounded wait;
99
+ // timedOut remains the authoritative cross-platform signal.
100
+ terminalTimer = setTimeout(() => {
101
+ child.stdout.destroy();
102
+ child.stderr.destroy();
103
+ child.unref();
104
+ finish(null, 'SIGKILL');
105
+ }, terminalWaitMs);
106
+ terminalTimer.unref();
107
+ }, killGraceMs);
108
+ forceKillTimer.unref();
109
+ }, timeoutMs);
110
+ timer.unref();
111
+ child.on('close', (exitCode, signal) => {
112
+ finish(exitCode, signal);
113
+ });
114
+ });
115
+ }
116
+ export function sanitizeGhDiagnostic(input) {
117
+ return input
118
+ .replace(/\b(?:github_pat_[A-Za-z0-9_]+|gh[pousr]_[A-Za-z0-9]+)\b/g, '[REDACTED]')
119
+ .replace(/(\bAuthorization\s*:\s*)[^\r\n]+/gi, '$1[REDACTED]')
120
+ .replace(/\b((?:GH|GITHUB)_TOKEN\s*=\s*)\S+/gi, '$1[REDACTED]')
121
+ .replace(/([?&](?:access_token|token)=)[^&\s]+/gi, '$1[REDACTED]')
122
+ .replace(/(https?:\/\/)[^/@\s]+@/gi, '$1[REDACTED]@')
123
+ .trim();
124
+ }
125
+ function classifyFailure(stage, result) {
126
+ const sanitized = sanitizeGhDiagnostic(result.stderr);
127
+ const diagnostic = result.stderrOverflow
128
+ ? `${sanitized}${sanitized ? '\n' : ''}...[gh stderr truncated by bounded diagnostic capture]`
129
+ : sanitized;
130
+ if (result.spawnCode === 'ENOENT') {
131
+ return new ReviewDiffError('gh-missing', stage, 'GitHub CLI (`gh`) is not installed or not on PATH.');
132
+ }
133
+ if (result.timedOut) {
134
+ return new ReviewDiffError('timeout', stage, `GitHub command timed out during ${stage}.`, result.exitCode, diagnostic);
135
+ }
136
+ if (result.stdoutOverflow) {
137
+ return new ReviewDiffError('buffer', stage, `GitHub response exceeded the bounded buffer during ${stage}.`, result.exitCode, diagnostic);
138
+ }
139
+ if (/authentication|auth login|not logged|HTTP 401|bad credentials/i.test(diagnostic)) {
140
+ return new ReviewDiffError('auth', stage, 'GitHub authentication failed. Run `gh auth login` and retry.', result.exitCode, diagnostic);
141
+ }
142
+ if (stage === 'PR lookup' && /no pull requests found|could not resolve|not found|HTTP 404/i.test(diagnostic)) {
143
+ return new ReviewDiffError('lookup', stage, 'The requested pull request could not be resolved.', result.exitCode, diagnostic);
144
+ }
145
+ return new ReviewDiffError('provider', stage, `GitHub command failed during ${stage}.`, result.exitCode, diagnostic);
146
+ }
147
+ async function runGhChecked(runner, args, stage, cwd, deadlineAt) {
148
+ const remainingMs = deadlineAt == null ? GH_TIMEOUT_MS : deadlineAt - Date.now();
149
+ if (remainingMs <= 0) {
150
+ throw new ReviewDiffError('timeout', stage, `GitHub review collection exceeded its aggregate deadline during ${stage}.`);
151
+ }
152
+ const result = await runner(args, {
153
+ cwd,
154
+ timeoutMs: Math.min(GH_TIMEOUT_MS, remainingMs),
155
+ maxStdoutBytes: GH_STDOUT_LIMIT,
156
+ maxStderrBytes: GH_STDERR_LIMIT,
157
+ });
158
+ if (result.exitCode !== 0 || result.spawnCode || result.timedOut || result.stdoutOverflow) {
159
+ throw classifyFailure(stage, result);
160
+ }
161
+ return result.stdout.trim();
162
+ }
163
+ function normalizeReviewPath(value) {
164
+ return value.replace(/\\/g, '/').replace(/^\.\//, '');
165
+ }
166
+ function globToRegExp(rawPattern) {
167
+ let pattern = normalizeReviewPath(rawPattern.trim());
168
+ if (pattern.endsWith('/'))
169
+ pattern += '**';
170
+ const basenamePattern = !pattern.includes('/');
171
+ let source = basenamePattern ? '(?:^|/)' : '^';
172
+ for (let i = 0; i < pattern.length; i += 1) {
173
+ const char = pattern[i];
174
+ if (char === '*') {
175
+ if (pattern[i + 1] === '*') {
176
+ i += 1;
177
+ if (pattern[i + 1] === '/') {
178
+ i += 1;
179
+ source += '(?:.*/)?';
180
+ }
181
+ else {
182
+ source += '.*';
183
+ }
184
+ }
185
+ else {
186
+ source += '[^/]*';
187
+ }
188
+ }
189
+ else if (char === '?') {
190
+ source += '[^/]';
191
+ }
192
+ else {
193
+ source += char.replace(/[|\\{}()[\]^$+?.]/g, '\\$&');
194
+ }
195
+ }
196
+ return new RegExp(`${source}$`);
197
+ }
198
+ export function matchesReviewScope(filename, previousFilename, scope) {
199
+ const candidates = [filename, previousFilename].filter((value) => Boolean(value)).map(normalizeReviewPath);
200
+ const included = scope.include.length === 0
201
+ || scope.include.some(pattern => {
202
+ const regex = globToRegExp(pattern);
203
+ return candidates.some(candidate => regex.test(candidate));
204
+ });
205
+ if (!included)
206
+ return false;
207
+ return !scope.exclude.some(pattern => {
208
+ const regex = globToRegExp(pattern);
209
+ return candidates.some(candidate => regex.test(candidate));
210
+ });
211
+ }
212
+ function countChangedPatchLines(patch) {
213
+ let count = 0;
214
+ for (const line of patch.split('\n')) {
215
+ // GitHub's per-file REST patch begins at a hunk header and does not
216
+ // contain unified-diff file headers, so even `+++content` is an authored
217
+ // addition and must count toward metadata coverage.
218
+ if (line.startsWith('+') || line.startsWith('-')) {
219
+ count += 1;
220
+ }
221
+ }
222
+ return count;
223
+ }
224
+ function utf8Bytes(value) {
225
+ return Buffer.byteLength(value, 'utf8');
226
+ }
227
+ export function utf8Prefix(value, maxBytes) {
228
+ if (maxBytes <= 0)
229
+ return '';
230
+ const encoded = Buffer.from(value, 'utf8');
231
+ if (encoded.length <= maxBytes)
232
+ return value;
233
+ // `end` is the first excluded byte. If it points into a continuation
234
+ // sequence, walk back to the leading byte so decoding never manufactures a
235
+ // replacement character or splits a UTF-16 surrogate pair. This is linear
236
+ // in input size (encoding once) rather than repeatedly re-encoding slices.
237
+ let end = maxBytes;
238
+ while (end > 0 && (encoded[end] & 0b1100_0000) === 0b1000_0000)
239
+ end -= 1;
240
+ return encoded.subarray(0, end).toString('utf8');
241
+ }
242
+ function allocatePatchBudgets(sizes, budget) {
243
+ const allocations = new Array(sizes.length).fill(0);
244
+ let remainingBudget = budget;
245
+ let remaining = sizes.map((_, index) => index).filter(index => sizes[index] > 0);
246
+ while (remaining.length > 0 && remainingBudget > 0) {
247
+ const share = Math.floor(remainingBudget / remaining.length);
248
+ if (share === 0) {
249
+ for (let i = 0; i < Math.min(remainingBudget, remaining.length); i += 1)
250
+ allocations[remaining[i]] += 1;
251
+ break;
252
+ }
253
+ const completed = remaining.filter(index => sizes[index] <= share);
254
+ if (completed.length === 0) {
255
+ for (const index of remaining)
256
+ allocations[index] = share;
257
+ remainingBudget -= share * remaining.length;
258
+ for (let i = 0; i < remainingBudget; i += 1)
259
+ allocations[remaining[i % remaining.length]] += 1;
260
+ break;
261
+ }
262
+ for (const index of completed) {
263
+ allocations[index] = sizes[index];
264
+ remainingBudget -= sizes[index];
265
+ }
266
+ const completedSet = new Set(completed);
267
+ remaining = remaining.filter(index => !completedSet.has(index));
268
+ }
269
+ return allocations;
270
+ }
271
+ function parsePullFiles(raw, stage) {
272
+ let value;
273
+ try {
274
+ value = JSON.parse(raw);
275
+ }
276
+ catch {
277
+ throw new ReviewDiffError('malformed-response', stage, `GitHub returned malformed JSON during ${stage}.`, 0);
278
+ }
279
+ if (!Array.isArray(value)) {
280
+ throw new ReviewDiffError('malformed-response', stage, `GitHub returned an unexpected response during ${stage}.`, 0);
281
+ }
282
+ return value.map((item, index) => {
283
+ if (!item || typeof item !== 'object') {
284
+ throw new ReviewDiffError('malformed-response', stage, `GitHub returned an invalid file record at index ${index}.`, 0);
285
+ }
286
+ const record = item;
287
+ if (typeof record.filename !== 'string' || record.filename.length === 0
288
+ || typeof record.status !== 'string' || record.status.length === 0) {
289
+ throw new ReviewDiffError('malformed-response', stage, `GitHub returned an invalid file record at index ${index}.`, 0);
290
+ }
291
+ const numericFields = ['additions', 'deletions', 'changes'];
292
+ for (const field of numericFields) {
293
+ if (typeof record[field] !== 'number' || !Number.isSafeInteger(record[field]) || record[field] < 0) {
294
+ throw new ReviewDiffError('malformed-response', stage, `GitHub returned invalid ${field} metadata at file index ${index}.`, 0);
295
+ }
296
+ }
297
+ if (record.previous_filename !== undefined
298
+ && (typeof record.previous_filename !== 'string' || record.previous_filename.length === 0)) {
299
+ throw new ReviewDiffError('malformed-response', stage, `GitHub returned an invalid previous_filename at file index ${index}.`, 0);
300
+ }
301
+ if (record.patch !== undefined && typeof record.patch !== 'string') {
302
+ throw new ReviewDiffError('malformed-response', stage, `GitHub returned an invalid patch at file index ${index}.`, 0);
303
+ }
304
+ const filename = normalizeReviewPath(record.filename);
305
+ const previousFilename = typeof record.previous_filename === 'string'
306
+ ? normalizeReviewPath(record.previous_filename)
307
+ : undefined;
308
+ if (!filename || previousFilename === '') {
309
+ throw new ReviewDiffError('malformed-response', stage, `GitHub returned an empty normalized path at file index ${index}.`, 0);
310
+ }
311
+ if (!Number.isSafeInteger(record.additions + record.deletions)) {
312
+ throw new ReviewDiffError('malformed-response', stage, `GitHub returned unsafe aggregate change metadata at file index ${index}.`, 0);
313
+ }
314
+ return {
315
+ filename,
316
+ previous_filename: previousFilename,
317
+ status: record.status,
318
+ additions: record.additions,
319
+ deletions: record.deletions,
320
+ changes: record.changes,
321
+ patch: typeof record.patch === 'string' ? record.patch : undefined,
322
+ };
323
+ });
324
+ }
325
+ export async function collectReviewDiff(cwd, requestedPr, scope, runner = (args, options) => runBoundedProcess('gh', args, options)) {
326
+ const deadlineAt = Date.now() + REVIEW_COLLECTION_TIMEOUT_MS;
327
+ const prArgs = ['pr', 'view'];
328
+ if (requestedPr != null)
329
+ prArgs.push(String(requestedPr));
330
+ prArgs.push('--json', 'number', '--jq', '.number');
331
+ const prRaw = await runGhChecked(runner, prArgs, 'PR lookup', cwd, deadlineAt);
332
+ const prNum = Number(prRaw);
333
+ if (!Number.isInteger(prNum) || prNum <= 0) {
334
+ throw new ReviewDiffError('malformed-response', 'PR lookup', 'GitHub returned an invalid pull request number.', 0);
335
+ }
336
+ const repository = await runGhChecked(runner, ['repo', 'view', '--json', 'nameWithOwner', '--jq', '.nameWithOwner'], 'repository lookup', cwd, deadlineAt);
337
+ if (!/^[^/\s]+\/[^/\s]+$/.test(repository)) {
338
+ throw new ReviewDiffError('malformed-response', 'repository lookup', 'GitHub returned an invalid repository name.', 0);
339
+ }
340
+ const allFiles = [];
341
+ const selected = [];
342
+ let reachedProviderLimit = false;
343
+ for (let page = 1; allFiles.length < GITHUB_FILES_LIMIT; page += 1) {
344
+ const stage = `PR file metadata page ${page}`;
345
+ const raw = await runGhChecked(runner, [
346
+ 'api', '--method', 'GET',
347
+ `repos/${repository}/pulls/${prNum}/files`,
348
+ '-f', `per_page=${FILES_PAGE_SIZE}`,
349
+ '-f', `page=${page}`,
350
+ ], stage, cwd, deadlineAt);
351
+ const records = parsePullFiles(raw, stage);
352
+ for (const record of records) {
353
+ allFiles.push(record.filename);
354
+ if (!matchesReviewScope(record.filename, record.previous_filename, scope))
355
+ continue;
356
+ const expectedChangedLines = record.additions + record.deletions;
357
+ const providerChangedLines = record.patch ? countChangedPatchLines(record.patch) : 0;
358
+ const providerPatchState = record.patch == null
359
+ ? 'omitted'
360
+ : providerChangedLines < expectedChangedLines ? 'partial' : 'complete';
361
+ selected.push({ ...record, providerPatchState, providerChangedLines });
362
+ }
363
+ if (records.length < FILES_PAGE_SIZE)
364
+ break;
365
+ if (allFiles.length >= GITHUB_FILES_LIMIT)
366
+ reachedProviderLimit = true;
367
+ }
368
+ const sizes = selected.map(record => utf8Bytes(record.patch ?? ''));
369
+ const patchCount = sizes.filter(size => size > 0).length;
370
+ // Joining per-file patches adds a newline separator. Reserve those bytes so
371
+ // --max-diff-bytes remains a true upper bound rather than an approximation.
372
+ const patchBudget = Math.max(0, scope.maxDiffBytes - Math.max(0, patchCount - 1));
373
+ const allocations = allocatePatchBudgets(sizes, patchBudget);
374
+ const files = selected.map((record, index) => {
375
+ const patch = record.patch ?? '';
376
+ const includedPatch = utf8Prefix(patch, allocations[index]);
377
+ return {
378
+ filename: record.filename,
379
+ previousFilename: record.previous_filename,
380
+ status: record.status,
381
+ additions: record.additions,
382
+ deletions: record.deletions,
383
+ changes: record.changes,
384
+ expectedChangedLines: record.additions + record.deletions,
385
+ providerChangedLines: record.providerChangedLines,
386
+ providerPatchState: record.providerPatchState,
387
+ includedPatch,
388
+ localTruncated: utf8Bytes(includedPatch) < utf8Bytes(patch),
389
+ };
390
+ });
391
+ const coverage = {
392
+ complete: files.filter(file => file.providerPatchState === 'complete' && !file.localTruncated).map(file => file.filename),
393
+ providerPartial: files.filter(file => file.providerPatchState === 'partial').map(file => file.filename),
394
+ providerOmitted: files.filter(file => file.providerPatchState === 'omitted').map(file => file.filename),
395
+ localTruncated: files.filter(file => file.localTruncated).map(file => file.filename),
396
+ };
397
+ const combinedPatch = files.map(file => file.includedPatch).filter(Boolean).join('\n');
398
+ return {
399
+ prNum,
400
+ repository,
401
+ allFiles,
402
+ files,
403
+ includedDiffBytes: utf8Bytes(combinedPatch),
404
+ includedDiffLines: combinedPatch ? combinedPatch.split('\n').length : 0,
405
+ coverage,
406
+ providerFileListTruncated: reachedProviderLimit,
407
+ };
408
+ }
409
+ export function formatReviewDiffError(error) {
410
+ const details = [`Review diff failed (${error.kind}) during ${error.stage}: ${error.message}`];
411
+ details.push(`gh exit code: ${error.exitCode == null ? 'unavailable' : error.exitCode}`);
412
+ if (error.stderr)
413
+ details.push(`gh stderr: ${error.stderr}`);
414
+ return details.join('\n');
415
+ }
416
+ //# sourceMappingURL=review-diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-diff.js","sourceRoot":"","sources":["../../src/cli/review-diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,113 @@
1
+ import { type RoadmapMigrationPlan } from '../core/roadmap-migration.js';
2
+ type ArtifactRole = 'bundle' | 'audit' | 'non_core' | 'receipt' | 'projection' | 'manifest';
3
+ interface MigrationArtifact {
4
+ role: ArtifactRole;
5
+ path: string;
6
+ absolutePath: string;
7
+ contents: string;
8
+ sha256: string;
9
+ }
10
+ interface MigrationEvidenceArtifact {
11
+ path: string;
12
+ absolutePath: string;
13
+ sha256: string;
14
+ textSha256: string;
15
+ }
16
+ interface RoadmapMigrationReceiptOutput {
17
+ role: Exclude<ArtifactRole, 'receipt'>;
18
+ path: string;
19
+ sha256: string;
20
+ }
21
+ export interface RoadmapMigrationReceipt {
22
+ version: 1;
23
+ kind: 'roadmap_migration_receipt';
24
+ digest_kind: 'text_crlf_normalized_sha256';
25
+ migration_id: string;
26
+ recorded_at: string;
27
+ plan_sha256: string;
28
+ source: {
29
+ path: string;
30
+ original_sha256: string;
31
+ projection_sha256: string;
32
+ };
33
+ manifest: {
34
+ path: string;
35
+ sha256: string;
36
+ };
37
+ audit_path: string;
38
+ non_core_path: string;
39
+ receipt_path: string;
40
+ inputs: {
41
+ mapping?: {
42
+ path: string;
43
+ sha256: string;
44
+ };
45
+ scorecards: Array<{
46
+ path: string;
47
+ sha256: string;
48
+ }>;
49
+ };
50
+ summary: {
51
+ sources: number;
52
+ archives: number;
53
+ history_unverified: number;
54
+ };
55
+ outputs: RoadmapMigrationReceiptOutput[];
56
+ integrity_sha256: string;
57
+ }
58
+ export interface RoadmapSourceMigrationInput {
59
+ cwd: string;
60
+ path?: string;
61
+ source?: string;
62
+ mapping?: string;
63
+ recordedAt?: string;
64
+ }
65
+ interface PreparedMigrationBase {
66
+ input: RoadmapSourceMigrationInput;
67
+ sourcePath: string;
68
+ sourceRelativePath: string;
69
+ manifestPath: string;
70
+ manifestRelativePath: string;
71
+ sourceRoot: string;
72
+ journalPath: string;
73
+ backupPath: string;
74
+ }
75
+ export interface ReadyRoadmapSourceMigration extends PreparedMigrationBase {
76
+ status: 'ready';
77
+ recordedAt: string;
78
+ sourceBytes: Buffer;
79
+ sourceSha256: string;
80
+ mappingPath?: string;
81
+ mappingSha256?: string;
82
+ evidenceSha256: string;
83
+ evidenceArtifacts: MigrationEvidenceArtifact[];
84
+ plan: RoadmapMigrationPlan;
85
+ artifacts: MigrationArtifact[];
86
+ receipt: RoadmapMigrationReceipt;
87
+ }
88
+ export interface BlockedRoadmapSourceMigration extends PreparedMigrationBase {
89
+ status: 'blocked';
90
+ plan: RoadmapMigrationPlan;
91
+ }
92
+ export interface UnchangedRoadmapSourceMigration extends PreparedMigrationBase {
93
+ status: 'unchanged';
94
+ receipt: RoadmapMigrationReceipt;
95
+ }
96
+ export interface RecoveryRequiredRoadmapSourceMigration extends PreparedMigrationBase {
97
+ status: 'recovery_required';
98
+ }
99
+ export type PreparedRoadmapSourceMigration = ReadyRoadmapSourceMigration | BlockedRoadmapSourceMigration | UnchangedRoadmapSourceMigration | RecoveryRequiredRoadmapSourceMigration;
100
+ export interface RoadmapSourceMigrationResult {
101
+ status: 'applied' | 'unchanged';
102
+ receipt: RoadmapMigrationReceipt;
103
+ sources: number;
104
+ archives: number;
105
+ historyUnverified: number;
106
+ }
107
+ export interface RoadmapSourceMigrationApplyHooks {
108
+ afterWrite?: (role: ArtifactRole, path: string) => void;
109
+ }
110
+ export declare function prepareRoadmapSourceMigration(input: RoadmapSourceMigrationInput): PreparedRoadmapSourceMigration;
111
+ export declare function applyRoadmapSourceMigration(prepared: PreparedRoadmapSourceMigration, hooks?: RoadmapSourceMigrationApplyHooks): RoadmapSourceMigrationResult;
112
+ export {};
113
+ //# sourceMappingURL=roadmap-source-migration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roadmap-source-migration.d.ts","sourceRoot":"","sources":["../../src/cli/roadmap-source-migration.ts"],"names":[],"mappings":"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"}