@slope-dev/slope 1.60.0 → 1.61.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 (115) 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/review-state.d.ts.map +1 -1
  15. package/dist/cli/commands/review-state.js +45 -4
  16. package/dist/cli/commands/review-state.js.map +1 -1
  17. package/dist/cli/commands/review.d.ts +9 -1
  18. package/dist/cli/commands/review.d.ts.map +1 -1
  19. package/dist/cli/commands/review.js +67 -39
  20. package/dist/cli/commands/review.js.map +1 -1
  21. package/dist/cli/commands/roadmap.d.ts.map +1 -1
  22. package/dist/cli/commands/roadmap.js +274 -5
  23. package/dist/cli/commands/roadmap.js.map +1 -1
  24. package/dist/cli/commands/sprint.d.ts.map +1 -1
  25. package/dist/cli/commands/sprint.js +353 -54
  26. package/dist/cli/commands/sprint.js.map +1 -1
  27. package/dist/cli/guards/claim-required.d.ts.map +1 -1
  28. package/dist/cli/guards/claim-required.js +19 -4
  29. package/dist/cli/guards/claim-required.js.map +1 -1
  30. package/dist/cli/guards/next-action.js +1 -1
  31. package/dist/cli/guards/next-action.js.map +1 -1
  32. package/dist/cli/guards/phase-boundary.d.ts.map +1 -1
  33. package/dist/cli/guards/phase-boundary.js +8 -2
  34. package/dist/cli/guards/phase-boundary.js.map +1 -1
  35. package/dist/cli/guards/post-push.js +2 -2
  36. package/dist/cli/guards/post-push.js.map +1 -1
  37. package/dist/cli/guards/review-tier.d.ts.map +1 -1
  38. package/dist/cli/guards/review-tier.js +2 -3
  39. package/dist/cli/guards/review-tier.js.map +1 -1
  40. package/dist/cli/guards/roadmap-edit-shipped.d.ts.map +1 -1
  41. package/dist/cli/guards/roadmap-edit-shipped.js +143 -7
  42. package/dist/cli/guards/roadmap-edit-shipped.js.map +1 -1
  43. package/dist/cli/guards/scope-drift.d.ts.map +1 -1
  44. package/dist/cli/guards/scope-drift.js +8 -2
  45. package/dist/cli/guards/scope-drift.js.map +1 -1
  46. package/dist/cli/guards/session-briefing.js +6 -2
  47. package/dist/cli/guards/session-briefing.js.map +1 -1
  48. package/dist/cli/guards/sprint-completion.d.ts.map +1 -1
  49. package/dist/cli/guards/sprint-completion.js +94 -18
  50. package/dist/cli/guards/sprint-completion.js.map +1 -1
  51. package/dist/cli/index.js +4 -2
  52. package/dist/cli/index.js.map +1 -1
  53. package/dist/cli/registry.d.ts.map +1 -1
  54. package/dist/cli/registry.js +25 -0
  55. package/dist/cli/registry.js.map +1 -1
  56. package/dist/cli/roadmap-source-store.d.ts +37 -0
  57. package/dist/cli/roadmap-source-store.d.ts.map +1 -0
  58. package/dist/cli/roadmap-source-store.js +298 -0
  59. package/dist/cli/roadmap-source-store.js.map +1 -0
  60. package/dist/cli/sprint-inference.js +1 -1
  61. package/dist/cli/sprint-inference.js.map +1 -1
  62. package/dist/cli/sprint-rollover.d.ts +102 -0
  63. package/dist/cli/sprint-rollover.d.ts.map +1 -0
  64. package/dist/cli/sprint-rollover.js +558 -0
  65. package/dist/cli/sprint-rollover.js.map +1 -0
  66. package/dist/cli/sprint-state.d.ts +72 -1
  67. package/dist/cli/sprint-state.d.ts.map +1 -1
  68. package/dist/cli/sprint-state.js +203 -5
  69. package/dist/cli/sprint-state.js.map +1 -1
  70. package/dist/cli/template-generator.d.ts.map +1 -1
  71. package/dist/cli/template-generator.js +45 -32
  72. package/dist/cli/template-generator.js.map +1 -1
  73. package/dist/cli/workflow-resync.d.ts.map +1 -1
  74. package/dist/cli/workflow-resync.js +9 -8
  75. package/dist/cli/workflow-resync.js.map +1 -1
  76. package/dist/core/briefing.d.ts.map +1 -1
  77. package/dist/core/briefing.js +254 -14
  78. package/dist/core/briefing.js.map +1 -1
  79. package/dist/core/builder.d.ts +16 -2
  80. package/dist/core/builder.d.ts.map +1 -1
  81. package/dist/core/builder.js +82 -5
  82. package/dist/core/builder.js.map +1 -1
  83. package/dist/core/index.d.ts +7 -3
  84. package/dist/core/index.d.ts.map +1 -1
  85. package/dist/core/index.js +3 -1
  86. package/dist/core/index.js.map +1 -1
  87. package/dist/core/roadmap-focus.d.ts +101 -0
  88. package/dist/core/roadmap-focus.d.ts.map +1 -0
  89. package/dist/core/roadmap-focus.js +293 -0
  90. package/dist/core/roadmap-focus.js.map +1 -0
  91. package/dist/core/roadmap-sources.d.ts +52 -0
  92. package/dist/core/roadmap-sources.d.ts.map +1 -0
  93. package/dist/core/roadmap-sources.js +483 -0
  94. package/dist/core/roadmap-sources.js.map +1 -0
  95. package/dist/core/roadmap.d.ts +25 -1
  96. package/dist/core/roadmap.d.ts.map +1 -1
  97. package/dist/core/roadmap.js +62 -45
  98. package/dist/core/roadmap.js.map +1 -1
  99. package/dist/core/workflow-engine.d.ts.map +1 -1
  100. package/dist/core/workflow-engine.js +17 -2
  101. package/dist/core/workflow-engine.js.map +1 -1
  102. package/dist/mcp/registry.d.ts +1 -1
  103. package/dist/mcp/registry.d.ts.map +1 -1
  104. package/dist/mcp/registry.js +5 -4
  105. package/dist/mcp/registry.js.map +1 -1
  106. package/package.json +1 -1
  107. package/src/core/workflows/sprint-standard.yaml +1 -1
  108. package/templates/claude-code/CLAUDE.md +3 -1
  109. package/templates/claude-code/commands/start-sprint.md +9 -5
  110. package/templates/claude-code/rules/sprint-checklist.md +13 -10
  111. package/templates/codex/plugins/slope/.codex-plugin/plugin.json +1 -1
  112. package/templates/codex/plugins/slope/skills/slope-sprint/SKILL.md +5 -4
  113. package/templates/cursor/rules/slope-sprint-checklist.mdc +11 -8
  114. package/templates/generic/SLOPE-CHECKLIST.md +10 -7
  115. package/templates/pi/skills/start-sprint.md +9 -5
@@ -0,0 +1,558 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { existsSync, readFileSync, realpathSync } from 'node:fs';
3
+ import { dirname, isAbsolute, join, relative, resolve } from 'node:path';
4
+ import { castRoadmapStructure, discoverScorecardFiles, formatRoadmapSprintLabel, isRoadmapSprintPending, isRoadmapSprintTerminal, parseRoadmap, roadmapSprintOrderValue, sprintNumberFromScorecardFile, validateScorecard, } from '../core/index.js';
5
+ import { atomicWriteFileSync, withFileLockSync } from './atomic-write.js';
6
+ import { loadConfig } from './config.js';
7
+ import { createSprintState, isSprintComplete, isValidSprintStateEvidence, loadSprintStateResult, replaceSprintState, } from './sprint-state.js';
8
+ export class SprintRolloverError extends Error {
9
+ assessment;
10
+ constructor(message, assessment) {
11
+ super(message);
12
+ this.assessment = assessment;
13
+ this.name = 'SprintRolloverError';
14
+ }
15
+ }
16
+ function roadmapIdsEqual(roadmap, left, right) {
17
+ return roadmapSprintOrderValue(roadmap, left) === roadmapSprintOrderValue(roadmap, right);
18
+ }
19
+ function roadmapSprintsById(roadmap, sprint) {
20
+ return roadmap.sprints.filter(candidate => roadmapIdsEqual(roadmap, candidate.id, sprint));
21
+ }
22
+ function loadRolloverRoadmap(cwd) {
23
+ const config = loadConfig(cwd);
24
+ const absolutePath = ensureTrackedPath(cwd, resolve(cwd, config.roadmapPath));
25
+ const path = relative(cwd, absolutePath).replaceAll('\\', '/');
26
+ if (!existsSync(absolutePath)) {
27
+ throw new SprintRolloverError(`Roadmap not found at ${path}; safe rollover requires dependency evidence.`);
28
+ }
29
+ let raw;
30
+ let source;
31
+ try {
32
+ source = readFileSync(absolutePath, 'utf8');
33
+ raw = JSON.parse(source);
34
+ }
35
+ catch (error) {
36
+ throw new SprintRolloverError(`Could not parse roadmap at ${path}: ${error.message}`);
37
+ }
38
+ const parsed = parseRoadmap(raw);
39
+ const roadmap = parsed.roadmap ?? castRoadmapStructure(raw);
40
+ if (!roadmap || parsed.validation.errors.length > 0) {
41
+ const detail = boundedMessages(parsed.validation.errors.map(issue => issue.message));
42
+ throw new SprintRolloverError(`Roadmap is not safe for rollover${detail ? `: ${detail}` : '.'}`);
43
+ }
44
+ return { roadmap, path, sha256: createHash('sha256').update(source).digest('hex') };
45
+ }
46
+ function loadCompletionEvidence(cwd) {
47
+ const config = loadConfig(cwd);
48
+ const scorecards = [];
49
+ const recorded = new Set();
50
+ for (const discovered of discoverScorecardFiles(config, cwd)) {
51
+ const fileSprint = sprintNumberFromScorecardFile(discovered, config);
52
+ if (fileSprint == null || recorded.has(fileSprint))
53
+ continue;
54
+ const absolutePath = ensureTrackedPath(cwd, resolve(cwd, discovered));
55
+ const source = readFileSync(absolutePath);
56
+ let raw;
57
+ try {
58
+ raw = JSON.parse(source.toString('utf8'));
59
+ }
60
+ catch {
61
+ continue;
62
+ }
63
+ const sprint = raw.sprint_number ?? raw.sprint;
64
+ if (sprint !== fileSprint
65
+ || !validateScorecard(raw).valid)
66
+ continue;
67
+ scorecards.push({
68
+ sprint: fileSprint,
69
+ path: relative(cwd, absolutePath).replaceAll('\\', '/'),
70
+ sha256: createHash('sha256').update(source).digest('hex'),
71
+ });
72
+ recorded.add(fileSprint);
73
+ }
74
+ return { sprintIds: [...recorded], scorecards };
75
+ }
76
+ function effectiveCompletedOrders(roadmap, fromSprint, fromTerminal, completionEvidence) {
77
+ const fromOrder = fromSprint ? roadmapSprintOrderValue(roadmap, fromSprint.id) : null;
78
+ const completed = new Set(roadmap.sprints
79
+ .filter(sprint => sprint.status === 'complete'
80
+ && (fromTerminal || roadmapSprintOrderValue(roadmap, sprint.id) !== fromOrder))
81
+ .map(sprint => roadmapSprintOrderValue(roadmap, sprint.id)));
82
+ for (const sprint of completionEvidence) {
83
+ const order = roadmapSprintOrderValue(roadmap, sprint);
84
+ if (fromTerminal || order !== fromOrder)
85
+ completed.add(order);
86
+ }
87
+ if (fromTerminal && fromSprint)
88
+ completed.add(roadmapSprintOrderValue(roadmap, fromSprint.id));
89
+ return completed;
90
+ }
91
+ function boundedMessages(messages, limit = 5) {
92
+ const shown = messages.slice(0, limit);
93
+ const omitted = messages.length - shown.length;
94
+ return `${shown.join('; ')}${omitted > 0 ? `; … ${omitted} additional issue(s) omitted` : ''}`;
95
+ }
96
+ function boundedSprintLabels(roadmap, ids, limit = 5) {
97
+ const shown = ids.slice(0, limit).map(id => formatRoadmapSprintLabel(roadmap, id));
98
+ const omitted = ids.length - shown.length;
99
+ return `${shown.join(', ')}${omitted > 0 ? `, … ${omitted} additional sprint(s)` : ''}`;
100
+ }
101
+ function dependencyBlockers(roadmap, sprint, completed) {
102
+ return (sprint.depends_on ?? []).filter(dependency => !completed.has(roadmapSprintOrderValue(roadmap, dependency)));
103
+ }
104
+ export function assessSprintRollover(state, roadmap, roadmapPath, input, completionEvidence = [], roadmapSha256 = '') {
105
+ const force = input.force === true;
106
+ const reason = input.reason?.trim();
107
+ const fromMatches = roadmapSprintsById(roadmap, input.from);
108
+ const toMatches = roadmapSprintsById(roadmap, input.to);
109
+ const fromSprint = fromMatches.length === 1 ? fromMatches[0] : undefined;
110
+ const toSprint = toMatches.length === 1 ? toMatches[0] : undefined;
111
+ const fromLabel = fromSprint ? formatRoadmapSprintLabel(roadmap, fromSprint.id) : `S${input.from}`;
112
+ const toLabel = toSprint ? formatRoadmapSprintLabel(roadmap, toSprint.id) : `S${input.to}`;
113
+ const terminal = Boolean(state && isSprintComplete(state));
114
+ const issues = [];
115
+ if (!state)
116
+ issues.push({ code: 'state_missing', message: 'No sprint state exists to roll over.' });
117
+ if (fromMatches.length === 0)
118
+ issues.push({ code: 'from_roadmap_missing', message: `${fromLabel} is not present in the roadmap.` });
119
+ if (fromMatches.length > 1)
120
+ issues.push({ code: 'from_roadmap_ambiguous', message: `${fromLabel} resolves to multiple roadmap rows.` });
121
+ if (toMatches.length === 0)
122
+ issues.push({ code: 'target_roadmap_missing', message: `${toLabel} is not present in the roadmap.` });
123
+ if (toMatches.length > 1)
124
+ issues.push({ code: 'target_roadmap_ambiguous', message: `${toLabel} resolves to multiple roadmap rows.` });
125
+ if (state && fromSprint && !roadmapIdsEqual(roadmap, state.sprint, fromSprint.id)) {
126
+ issues.push({
127
+ code: 'from_state_mismatch',
128
+ message: `sprint-state.json is for ${formatRoadmapSprintLabel(roadmap, state.sprint)}, not ${fromLabel}.`,
129
+ });
130
+ }
131
+ if (fromSprint && toSprint
132
+ && roadmapSprintOrderValue(roadmap, toSprint.id) <= roadmapSprintOrderValue(roadmap, fromSprint.id)) {
133
+ issues.push({ code: 'target_not_later', message: `${toLabel} is not later than ${fromLabel}.` });
134
+ }
135
+ if (toSprint && isRoadmapSprintTerminal(toSprint)) {
136
+ issues.push({ code: 'target_not_pending', message: `${toLabel} is not pending roadmap work (status: ${toSprint.status ?? 'unset'}).` });
137
+ }
138
+ if (state && !terminal && !force) {
139
+ issues.push({
140
+ code: 'from_not_terminal',
141
+ message: `${fromLabel} is still in progress (phase: ${state.phase}; pending gates: ${Object.entries(state.gates).filter(([, done]) => !done).map(([gate]) => gate).join(', ') || 'review evidence'}).`,
142
+ });
143
+ }
144
+ if (force && !reason) {
145
+ issues.push({ code: 'force_reason_required', message: '--force requires --reason=<why the in-progress rollover is intentional>.' });
146
+ }
147
+ if (!force && reason) {
148
+ issues.push({ code: 'reason_without_force', message: '--reason is only valid with --force.' });
149
+ }
150
+ const fromOrderForEvidence = fromSprint ? roadmapSprintOrderValue(roadmap, fromSprint.id) : Number.NEGATIVE_INFINITY;
151
+ const relevantDependencyOrders = new Set(roadmap.sprints
152
+ .filter(sprint => roadmapSprintOrderValue(roadmap, sprint.id) > fromOrderForEvidence)
153
+ .flatMap(sprint => sprint.depends_on ?? [])
154
+ .map(id => roadmapSprintOrderValue(roadmap, id)));
155
+ const relevantCompletionEvidence = completionEvidence
156
+ .filter(id => relevantDependencyOrders.has(roadmapSprintOrderValue(roadmap, id)));
157
+ const completed = effectiveCompletedOrders(roadmap, fromSprint, terminal, relevantCompletionEvidence);
158
+ const roadmapComplete = roadmap.sprints
159
+ .filter(sprint => sprint.status === 'complete'
160
+ && (terminal || !fromSprint
161
+ || roadmapSprintOrderValue(roadmap, sprint.id) !== roadmapSprintOrderValue(roadmap, fromSprint.id)))
162
+ .map(sprint => roadmapSprintOrderValue(roadmap, sprint.id));
163
+ const scorecardCompletions = [...new Set(relevantCompletionEvidence.map(sprint => roadmapSprintOrderValue(roadmap, sprint)))];
164
+ const fromOrder = fromSprint ? roadmapSprintOrderValue(roadmap, fromSprint.id) : Number.POSITIVE_INFINITY;
165
+ const candidates = roadmap.sprints
166
+ .filter(sprint => isRoadmapSprintPending(sprint) && roadmapSprintOrderValue(roadmap, sprint.id) > fromOrder)
167
+ .filter(sprint => dependencyBlockers(roadmap, sprint, completed).length === 0);
168
+ const expectedNext = candidates.find(sprint => sprint.status === 'active') ?? candidates[0];
169
+ const blockers = toSprint ? dependencyBlockers(roadmap, toSprint, completed) : [];
170
+ if (toSprint && blockers.length > 0) {
171
+ issues.push({
172
+ code: 'target_dependency_blocked',
173
+ message: `${toLabel} is blocked by ${boundedSprintLabels(roadmap, blockers)}.`,
174
+ });
175
+ }
176
+ if (fromSprint && !expectedNext) {
177
+ issues.push({ code: 'no_eligible_successor', message: `No dependency-eligible pending sprint follows ${fromLabel}.` });
178
+ }
179
+ else if (toSprint && expectedNext && !roadmapIdsEqual(roadmap, toSprint.id, expectedNext.id)) {
180
+ issues.push({
181
+ code: 'target_not_next_eligible',
182
+ message: `${toLabel} is not the next dependency-eligible sprint; use ${formatRoadmapSprintLabel(roadmap, expectedNext.id)}.`,
183
+ });
184
+ }
185
+ return {
186
+ valid: issues.length === 0,
187
+ from: fromSprint ? roadmapSprintOrderValue(roadmap, fromSprint.id) : input.from,
188
+ to: toSprint ? roadmapSprintOrderValue(roadmap, toSprint.id) : input.to,
189
+ from_label: fromLabel,
190
+ to_label: toLabel,
191
+ from_terminal: terminal,
192
+ forced: force,
193
+ ...(reason ? { reason } : {}),
194
+ ...(expectedNext ? {
195
+ expected_next: roadmapSprintOrderValue(roadmap, expectedNext.id),
196
+ expected_next_label: formatRoadmapSprintLabel(roadmap, expectedNext.id),
197
+ } : {}),
198
+ blocking_dependencies: blockers.map(id => roadmapSprintOrderValue(roadmap, id)),
199
+ blocking_dependency_labels: blockers.map(id => formatRoadmapSprintLabel(roadmap, id)),
200
+ completion_evidence: {
201
+ roadmap_complete: roadmapComplete,
202
+ scorecards: scorecardCompletions,
203
+ local_terminal: terminal && fromSprint ? [roadmapSprintOrderValue(roadmap, fromSprint.id)] : [],
204
+ },
205
+ issues,
206
+ roadmap,
207
+ roadmap_path: roadmapPath,
208
+ roadmap_sha256: roadmapSha256,
209
+ from_sprint: fromSprint,
210
+ to_sprint: toSprint,
211
+ };
212
+ }
213
+ export function inspectSprintRollover(cwd, input) {
214
+ const loaded = loadRolloverRoadmap(cwd);
215
+ const stateResult = loadSprintStateResult(cwd);
216
+ if (stateResult.status === 'corrupt') {
217
+ throw new SprintRolloverError(`Sprint state is corrupt and was preserved at ${relative(cwd, stateResult.path)}.`);
218
+ }
219
+ const completed = loadCompletionEvidence(cwd).sprintIds;
220
+ return assessSprintRollover(stateResult.status === 'valid' ? stateResult.state : null, loaded.roadmap, loaded.path, input, completed, loaded.sha256);
221
+ }
222
+ function stateDigest(state) {
223
+ return createHash('sha256').update(JSON.stringify(state)).digest('hex');
224
+ }
225
+ function ensureTrackedPath(cwd, path) {
226
+ const root = resolve(cwd);
227
+ const resolvedPath = resolve(path);
228
+ const lexical = relative(root, resolvedPath);
229
+ if (lexical === '..' || lexical.startsWith(`..${process.platform === 'win32' ? '\\' : '/'}`) || isAbsolute(lexical)) {
230
+ throw new SprintRolloverError(`Tracked rollover audit path escapes the repository: ${resolvedPath}`);
231
+ }
232
+ const realRoot = realpathSync(root);
233
+ let existing = resolvedPath;
234
+ while (!existsSync(existing) && dirname(existing) !== existing)
235
+ existing = dirname(existing);
236
+ const realExisting = realpathSync(existing);
237
+ const realRel = relative(realRoot, realExisting);
238
+ if (realRel === '..' || realRel.startsWith(`..${process.platform === 'win32' ? '\\' : '/'}`) || isAbsolute(realRel)) {
239
+ throw new SprintRolloverError(`Tracked rollover audit path resolves outside the repository: ${realExisting}`);
240
+ }
241
+ return resolvedPath;
242
+ }
243
+ function transactionKey(priorState, input) {
244
+ return createHash('sha256').update(JSON.stringify({
245
+ prior_state_sha256: stateDigest(priorState),
246
+ requested_from: input.from,
247
+ requested_to: input.to,
248
+ force: input.force === true,
249
+ reason: input.reason?.trim() || null,
250
+ })).digest('hex').slice(0, 16);
251
+ }
252
+ function auditPathFor(cwd, input, key) {
253
+ const config = loadConfig(cwd);
254
+ const auditRoot = ensureTrackedPath(cwd, resolve(cwd, config.scorecardDir, 'rollovers'));
255
+ return ensureTrackedPath(cwd, join(auditRoot, `sprint-${input.from}-to-${input.to}-${key}.json`));
256
+ }
257
+ function auditIntegrityPayload(record) {
258
+ const rollover = record.next_state.rollover;
259
+ return {
260
+ version: record.version,
261
+ kind: record.kind,
262
+ from_sprint: record.from_sprint,
263
+ to_sprint: record.to_sprint,
264
+ from_label: record.from_label,
265
+ to_label: record.to_label,
266
+ recorded_at: record.recorded_at,
267
+ actor: record.actor,
268
+ request: record.request,
269
+ forced: record.forced,
270
+ reason: record.reason ?? null,
271
+ eligibility: record.eligibility,
272
+ roadmap: record.roadmap,
273
+ prior_state_sha256: record.prior_state_sha256,
274
+ prior_state: record.prior_state,
275
+ next_state: {
276
+ ...record.next_state,
277
+ ...(rollover ? { rollover: { ...rollover, transition_id: null } } : {}),
278
+ },
279
+ claims_policy: record.claims_policy,
280
+ sessions_policy: record.sessions_policy,
281
+ };
282
+ }
283
+ function auditTransitionId(record) {
284
+ return createHash('sha256').update(JSON.stringify(auditIntegrityPayload(record))).digest('hex').slice(0, 16);
285
+ }
286
+ function isCanonicalRolloverNextState(state) {
287
+ const allowedKeys = new Set([
288
+ 'sprint', 'phase', 'gates', 'review_gates', 'review_requirements',
289
+ 'started_at', 'updated_at', 'rollover',
290
+ ]);
291
+ if (Object.keys(state).some(key => !allowedKeys.has(key)))
292
+ return false;
293
+ if (state.phase !== 'planning' || state.started_at !== state.updated_at)
294
+ return false;
295
+ if (Object.values(state.gates).some(Boolean))
296
+ return false;
297
+ if (!state.review_gates || !state.review_requirements)
298
+ return false;
299
+ for (const gate of ['code_review', 'architect_review']) {
300
+ const review = state.review_gates[gate];
301
+ if (!review || review.provenance !== 'pending' || review.evidence.length !== 0
302
+ || review.reviewer !== undefined || review.notes !== undefined || review.updated_at !== undefined)
303
+ return false;
304
+ const requirement = state.review_requirements[gate];
305
+ if (!requirement || requirement.priority !== 'unspecified'
306
+ || requirement.reason !== undefined || requirement.source !== undefined || requirement.updated_at !== undefined)
307
+ return false;
308
+ }
309
+ return true;
310
+ }
311
+ function validScorecardArtifact(value) {
312
+ if (!value || typeof value !== 'object')
313
+ return false;
314
+ const artifact = value;
315
+ return typeof artifact.sprint === 'number' && Number.isFinite(artifact.sprint) && artifact.sprint > 0
316
+ && typeof artifact.path === 'string' && artifact.path.length > 0 && !isAbsolute(artifact.path)
317
+ && typeof artifact.sha256 === 'string' && /^[a-f0-9]{64}$/.test(artifact.sha256);
318
+ }
319
+ function readAudit(cwd, path) {
320
+ let raw;
321
+ try {
322
+ raw = JSON.parse(readFileSync(path, 'utf8'));
323
+ }
324
+ catch (error) {
325
+ throw new SprintRolloverError(`Existing rollover audit is unreadable: ${error.message}`);
326
+ }
327
+ const record = raw;
328
+ if (record.version !== 1 || record.kind !== 'sprint_rollover'
329
+ || typeof record.transition_id !== 'string'
330
+ || typeof record.from_sprint !== 'number' || typeof record.to_sprint !== 'number'
331
+ || typeof record.from_label !== 'string' || typeof record.to_label !== 'string'
332
+ || typeof record.recorded_at !== 'string'
333
+ || !Number.isFinite(Date.parse(record.recorded_at))
334
+ || !record.actor || typeof record.actor.name !== 'string' || record.actor.name.trim().length === 0
335
+ || typeof record.actor.source !== 'string' || record.actor.source.trim().length === 0
336
+ || !record.request || typeof record.request.from !== 'number' || typeof record.request.to !== 'number'
337
+ || typeof record.request.force !== 'boolean'
338
+ || (record.request.reason !== undefined && typeof record.request.reason !== 'string')
339
+ || typeof record.forced !== 'boolean'
340
+ || (record.reason !== undefined && typeof record.reason !== 'string')
341
+ || !record.eligibility || typeof record.eligibility.expected_next !== 'number'
342
+ || typeof record.eligibility.from_terminal !== 'boolean'
343
+ || typeof record.eligibility.target_dependency_eligible !== 'boolean'
344
+ || !Array.isArray(record.eligibility.blocking_dependencies)
345
+ || !Array.isArray(record.eligibility.target_dependencies)
346
+ || !record.eligibility.completion_evidence
347
+ || !Array.isArray(record.eligibility.completion_evidence.roadmap_complete)
348
+ || !Array.isArray(record.eligibility.completion_evidence.scorecards)
349
+ || !Array.isArray(record.eligibility.completion_evidence.local_terminal)
350
+ || !Array.isArray(record.eligibility.scorecard_artifacts)
351
+ || !record.eligibility.scorecard_artifacts.every(validScorecardArtifact)
352
+ || !record.roadmap || typeof record.roadmap.path !== 'string' || typeof record.roadmap.sha256 !== 'string'
353
+ || typeof record.prior_state_sha256 !== 'string'
354
+ || !isValidSprintStateEvidence(record.prior_state)
355
+ || !isValidSprintStateEvidence(record.next_state)
356
+ || record.claims_policy !== 'unchanged'
357
+ || record.sessions_policy !== 'unchanged') {
358
+ throw new SprintRolloverError('Existing rollover audit has an invalid shape; refusing to replace it.');
359
+ }
360
+ const complete = record;
361
+ ensureTrackedPath(cwd, resolve(cwd, complete.roadmap.path));
362
+ if (stateDigest(complete.prior_state) !== complete.prior_state_sha256
363
+ || complete.transition_id !== auditTransitionId(complete)
364
+ || !isCanonicalRolloverNextState(complete.next_state)
365
+ || complete.next_state.sprint !== complete.to_sprint
366
+ || complete.next_state.rollover?.transition_id !== complete.transition_id
367
+ || complete.next_state.rollover?.from_sprint !== complete.from_sprint
368
+ || complete.next_state.rollover?.recorded_at !== complete.recorded_at
369
+ || complete.next_state.rollover?.forced !== complete.forced
370
+ || (complete.next_state.rollover?.reason ?? '') !== (complete.reason ?? '')
371
+ || complete.request.force !== complete.forced
372
+ || (complete.request.reason?.trim() ?? '') !== (complete.reason ?? '')
373
+ || JSON.stringify(complete.eligibility.scorecard_artifacts.map(item => item.sprint))
374
+ !== JSON.stringify(complete.eligibility.completion_evidence.scorecards)) {
375
+ throw new SprintRolloverError('Existing rollover audit failed embedded state integrity checks.');
376
+ }
377
+ return complete;
378
+ }
379
+ function auditRequestMatches(record, input) {
380
+ return record.request.from === input.from
381
+ && record.request.to === input.to
382
+ && record.request.force === (input.force === true)
383
+ && (record.request.reason?.trim() ?? '') === (input.reason?.trim() ?? '');
384
+ }
385
+ function assertAuditPathIdentity(cwd, path, record) {
386
+ const recordedPath = record.next_state.rollover?.audit_path;
387
+ const expectedPath = relative(cwd, path).replaceAll('\\', '/');
388
+ if (!recordedPath || isAbsolute(recordedPath) || recordedPath.replaceAll('\\', '/') !== expectedPath) {
389
+ throw new SprintRolloverError('Existing rollover audit does not match its recorded tracked path.');
390
+ }
391
+ }
392
+ function assertRecordedScorecardEvidenceAvailable(cwd, record) {
393
+ for (const artifact of record.eligibility.scorecard_artifacts) {
394
+ const path = ensureTrackedPath(cwd, resolve(cwd, artifact.path));
395
+ if (!existsSync(path)) {
396
+ throw new SprintRolloverError(`Existing rollover audit references missing scorecard evidence: ${artifact.path}.`);
397
+ }
398
+ const digest = createHash('sha256').update(readFileSync(path)).digest('hex');
399
+ if (digest !== artifact.sha256) {
400
+ throw new SprintRolloverError(`Existing rollover audit scorecard evidence changed: ${artifact.path}.`);
401
+ }
402
+ }
403
+ }
404
+ function buildAuditRecord(assessment, priorState, nextState, actor, recordedAt, input, scorecards) {
405
+ const record = {
406
+ version: 1,
407
+ kind: 'sprint_rollover',
408
+ transition_id: '',
409
+ from_sprint: assessment.from,
410
+ to_sprint: assessment.to,
411
+ from_label: assessment.from_label,
412
+ to_label: assessment.to_label,
413
+ recorded_at: recordedAt,
414
+ actor: { name: actor.name, source: actor.source },
415
+ request: {
416
+ from: input.from,
417
+ to: input.to,
418
+ force: input.force === true,
419
+ ...(assessment.reason ? { reason: assessment.reason } : {}),
420
+ },
421
+ forced: assessment.forced,
422
+ ...(assessment.reason ? { reason: assessment.reason } : {}),
423
+ eligibility: {
424
+ from_terminal: assessment.from_terminal,
425
+ target_dependency_eligible: assessment.blocking_dependencies.length === 0,
426
+ blocking_dependencies: assessment.blocking_dependencies,
427
+ target_dependencies: (assessment.to_sprint?.depends_on ?? [])
428
+ .map(id => roadmapSprintOrderValue(assessment.roadmap, id)),
429
+ completion_evidence: assessment.completion_evidence,
430
+ scorecard_artifacts: scorecards,
431
+ expected_next: assessment.expected_next,
432
+ },
433
+ roadmap: {
434
+ path: assessment.roadmap_path,
435
+ sha256: assessment.roadmap_sha256,
436
+ ...(assessment.from_sprint?.status ? { from_status: assessment.from_sprint.status } : {}),
437
+ ...(assessment.to_sprint?.status ? { to_status: assessment.to_sprint.status } : {}),
438
+ },
439
+ prior_state_sha256: stateDigest(priorState),
440
+ prior_state: priorState,
441
+ next_state: nextState,
442
+ claims_policy: 'unchanged',
443
+ sessions_policy: 'unchanged',
444
+ };
445
+ record.transition_id = auditTransitionId(record);
446
+ record.next_state.rollover.transition_id = record.transition_id;
447
+ return record;
448
+ }
449
+ /** Verify that a rollover-linked state still has exact tracked audit evidence. */
450
+ export function verifySprintRolloverLineage(cwd, state) {
451
+ const lineage = state.rollover;
452
+ if (!lineage)
453
+ return null;
454
+ if (!lineage.audit_path || isAbsolute(lineage.audit_path)) {
455
+ throw new SprintRolloverError('Current rollover lineage does not contain a repository-relative audit path.');
456
+ }
457
+ const path = ensureTrackedPath(cwd, resolve(cwd, lineage.audit_path));
458
+ if (!existsSync(path))
459
+ throw new SprintRolloverError('Current rollover lineage audit is missing.');
460
+ const record = readAudit(cwd, path);
461
+ assertAuditPathIdentity(cwd, path, record);
462
+ assertRecordedScorecardEvidenceAvailable(cwd, record);
463
+ if (state.sprint !== record.next_state.sprint
464
+ || state.started_at !== record.next_state.started_at
465
+ || lineage.transition_id !== record.transition_id
466
+ || lineage.from_sprint !== record.from_sprint
467
+ || lineage.recorded_at !== record.recorded_at
468
+ || lineage.forced !== record.forced
469
+ || (lineage.reason ?? '') !== (record.reason ?? '')) {
470
+ throw new SprintRolloverError('Current rollover lineage does not match its tracked audit record.');
471
+ }
472
+ return record;
473
+ }
474
+ export function performSprintRollover(cwd, input, actor) {
475
+ if (!Number.isFinite(input.from) || input.from <= 0 || !Number.isFinite(input.to) || input.to <= 0) {
476
+ throw new SprintRolloverError('Rollover sprint ids must be positive finite numbers.');
477
+ }
478
+ if (input.reason?.trim() && input.force !== true) {
479
+ throw new SprintRolloverError('--reason is only valid with --force.');
480
+ }
481
+ const initialState = loadSprintStateResult(cwd);
482
+ if (initialState.status === 'missing') {
483
+ throw new SprintRolloverError('No sprint state exists to roll over.');
484
+ }
485
+ if (initialState.status === 'corrupt') {
486
+ throw new SprintRolloverError(`Sprint state is corrupt and was preserved at ${relative(cwd, initialState.path)}.`);
487
+ }
488
+ let record;
489
+ let alreadyApplied = false;
490
+ let resolvedAuditPath;
491
+ const replacement = replaceSprintState(cwd, current => {
492
+ const lineageRecord = verifySprintRolloverLineage(cwd, current);
493
+ if (lineageRecord && auditRequestMatches(lineageRecord, input)) {
494
+ record = lineageRecord;
495
+ resolvedAuditPath = ensureTrackedPath(cwd, resolve(cwd, current.rollover.audit_path));
496
+ alreadyApplied = true;
497
+ return null;
498
+ }
499
+ const key = transactionKey(current, input);
500
+ const auditPath = auditPathFor(cwd, input, key);
501
+ const auditRelativePath = relative(cwd, auditPath).replaceAll('\\', '/');
502
+ resolvedAuditPath = auditPath;
503
+ record = withFileLockSync(auditPath, () => {
504
+ if (existsSync(auditPath)) {
505
+ const existing = readAudit(cwd, auditPath);
506
+ assertAuditPathIdentity(cwd, auditPath, existing);
507
+ if (!auditRequestMatches(existing, input)) {
508
+ throw new SprintRolloverError('Existing rollover audit records different request evidence.');
509
+ }
510
+ if (existing.prior_state_sha256 !== stateDigest(current)) {
511
+ throw new SprintRolloverError('Existing rollover audit does not match the current prior sprint state.');
512
+ }
513
+ assertRecordedScorecardEvidenceAvailable(cwd, existing);
514
+ return existing;
515
+ }
516
+ // New transitions reload all mutable eligibility evidence under both the
517
+ // state and audit locks. Existing audited transitions recover from their
518
+ // immutable record even when the roadmap has since advanced.
519
+ const loaded = loadRolloverRoadmap(cwd);
520
+ const completion = loadCompletionEvidence(cwd);
521
+ const assessment = assessSprintRollover(current, loaded.roadmap, loaded.path, input, completion.sprintIds, loaded.sha256);
522
+ if (!assessment.valid) {
523
+ throw new SprintRolloverError(boundedMessages(assessment.issues.map(issue => issue.message)), assessment);
524
+ }
525
+ const recordedAt = new Date().toISOString();
526
+ const nextState = createSprintState(assessment.to, 'planning');
527
+ const usedScorecardOrders = new Set(assessment.completion_evidence.scorecards);
528
+ const usedScorecards = completion.scorecards.filter(item => usedScorecardOrders.has(roadmapSprintOrderValue(loaded.roadmap, item.sprint)));
529
+ const lineage = {
530
+ transition_id: '',
531
+ from_sprint: assessment.from,
532
+ audit_path: auditRelativePath,
533
+ recorded_at: recordedAt,
534
+ forced: assessment.forced,
535
+ ...(assessment.reason ? { reason: assessment.reason } : {}),
536
+ };
537
+ nextState.rollover = lineage;
538
+ const created = buildAuditRecord(assessment, current, nextState, actor, recordedAt, input, usedScorecards);
539
+ atomicWriteFileSync(auditPath, JSON.stringify(created, null, 2) + '\n');
540
+ assertRecordedScorecardEvidenceAvailable(cwd, created);
541
+ return created;
542
+ });
543
+ return record.next_state;
544
+ });
545
+ if (!replacement)
546
+ throw new SprintRolloverError('No sprint state exists to roll over.');
547
+ if (!record)
548
+ throw new SprintRolloverError('Rollover audit was not created or recovered.');
549
+ if (!resolvedAuditPath)
550
+ throw new SprintRolloverError('Rollover audit path was not resolved.');
551
+ return {
552
+ audit_path: relative(cwd, resolvedAuditPath).replaceAll('\\', '/'),
553
+ record,
554
+ state: replacement.current,
555
+ already_applied: alreadyApplied,
556
+ };
557
+ }
558
+ //# sourceMappingURL=sprint-rollover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sprint-rollover.js","sourceRoot":"","sources":["../../src/cli/sprint-rollover.ts"],"names":[],"mappings":"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"}