@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,483 @@
1
+ import { isAbsolute, posix } from 'node:path';
2
+ import { parseDocument } from 'yaml';
3
+ import { castRoadmapStructure, getRoadmapTicketKey, validateRoadmap } from './roadmap.js';
4
+ import { compareRoadmapSprintIds, roadmapSprintOrderValue } from './roadmap.js';
5
+ export class RoadmapSourceError extends Error {
6
+ sourcePath;
7
+ constructor(message, sourcePath) {
8
+ super(sourcePath ? `${normalizeDiagnosticPath(sourcePath)}: ${message}` : message);
9
+ this.sourcePath = sourcePath;
10
+ this.name = 'RoadmapSourceError';
11
+ }
12
+ }
13
+ export function normalizeDiagnosticPath(path) {
14
+ return path.replace(/\\/g, '/');
15
+ }
16
+ export function normalizeRoadmapSourcePath(path, label = 'source path') {
17
+ const portable = normalizeDiagnosticPath(path).trim();
18
+ if (!portable)
19
+ throw new RoadmapSourceError(`${label} must not be empty`);
20
+ if (isAbsolute(portable) || /^[A-Za-z]:\//.test(portable)) {
21
+ throw new RoadmapSourceError(`${label} must be relative: ${portable}`);
22
+ }
23
+ const normalized = posix.normalize(portable).replace(/^\.\//, '');
24
+ if (normalized === '..' || normalized.startsWith('../')) {
25
+ throw new RoadmapSourceError(`${label} escapes its allowed root: ${portable}`);
26
+ }
27
+ return normalized;
28
+ }
29
+ function normalizeOutputPath(path) {
30
+ const portable = normalizeDiagnosticPath(path).trim();
31
+ if (!portable)
32
+ throw new RoadmapSourceError('output must not be empty');
33
+ if (isAbsolute(portable) || /^[A-Za-z]:\//.test(portable)) {
34
+ throw new RoadmapSourceError(`output must be relative: ${portable}`);
35
+ }
36
+ const normalized = posix.normalize(portable).replace(/^\.\//, '');
37
+ if (!normalized.endsWith('.json')) {
38
+ throw new RoadmapSourceError(`output must be a JSON compatibility artifact: ${portable}`);
39
+ }
40
+ const parentEscapes = normalized.split('/').filter(part => part === '..').length;
41
+ if (parentEscapes > 1) {
42
+ throw new RoadmapSourceError(`output escapes the roadmap compatibility area: ${portable}`);
43
+ }
44
+ return normalized;
45
+ }
46
+ function parseYamlMapping(yaml, sourcePath) {
47
+ const document = parseDocument(yaml, { schema: 'core', uniqueKeys: true });
48
+ if (document.errors.length > 0) {
49
+ throw new RoadmapSourceError(`YAML parse error: ${document.errors[0].message}`, sourcePath);
50
+ }
51
+ if (document.warnings.length > 0) {
52
+ throw new RoadmapSourceError(`YAML warning: ${document.warnings[0].message}`, sourcePath);
53
+ }
54
+ let value;
55
+ try {
56
+ value = document.toJS({ maxAliasCount: 100 });
57
+ }
58
+ catch (error) {
59
+ throw new RoadmapSourceError(`YAML expansion error: ${error.message}`, sourcePath);
60
+ }
61
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
62
+ throw new RoadmapSourceError('document must be a YAML mapping', sourcePath);
63
+ }
64
+ return value;
65
+ }
66
+ function parseVersion(value, sourcePath) {
67
+ if (value !== 1 && value !== '1') {
68
+ throw new RoadmapSourceError('version must be 1', sourcePath);
69
+ }
70
+ return '1';
71
+ }
72
+ function parseSourceKind(value, sourcePath, index) {
73
+ if (value === 'phase' || value === 'backlog' || value === 'archive')
74
+ return value;
75
+ throw new RoadmapSourceError(`sources[${index}].kind must be phase, backlog, or archive`, sourcePath);
76
+ }
77
+ export function parseRoadmapSourceProject(yaml, sourcePath = 'docs/roadmap/project.yaml') {
78
+ const raw = parseYamlMapping(yaml, sourcePath);
79
+ const version = parseVersion(raw.version, sourcePath);
80
+ if (typeof raw.name !== 'string' || !raw.name.trim()) {
81
+ throw new RoadmapSourceError('name must be a non-empty string', sourcePath);
82
+ }
83
+ if (raw.description != null && typeof raw.description !== 'string') {
84
+ throw new RoadmapSourceError('description must be a string when present', sourcePath);
85
+ }
86
+ if (typeof raw.output !== 'string') {
87
+ throw new RoadmapSourceError('output must be a relative path', sourcePath);
88
+ }
89
+ const output = normalizeOutputPath(raw.output);
90
+ if (!Array.isArray(raw.sources) || raw.sources.length === 0) {
91
+ throw new RoadmapSourceError('sources must be a non-empty sequence', sourcePath);
92
+ }
93
+ const sources = raw.sources.map((value, index) => {
94
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
95
+ throw new RoadmapSourceError(`sources[${index}] must be a mapping`, sourcePath);
96
+ }
97
+ const entry = value;
98
+ if (typeof entry.path !== 'string') {
99
+ throw new RoadmapSourceError(`sources[${index}].path must be a string`, sourcePath);
100
+ }
101
+ const path = normalizeRoadmapSourcePath(entry.path, `sources[${index}].path`);
102
+ const kind = parseSourceKind(entry.kind, sourcePath, index);
103
+ const expectedPrefix = kind === 'phase' ? 'phases/' : `${kind}/`;
104
+ if (!path.startsWith(expectedPrefix)) {
105
+ throw new RoadmapSourceError(`sources[${index}] kind ${kind} must use ${expectedPrefix} (received ${path})`, sourcePath);
106
+ }
107
+ return { path, kind };
108
+ });
109
+ const uniquePaths = new Set(sources.map(source => source.path));
110
+ if (uniquePaths.size !== sources.length) {
111
+ throw new RoadmapSourceError('sources contains duplicate paths', sourcePath);
112
+ }
113
+ return {
114
+ version,
115
+ name: raw.name.trim(),
116
+ ...(raw.description ? { description: raw.description } : {}),
117
+ output,
118
+ sources,
119
+ };
120
+ }
121
+ export function parseRoadmapSourceDocument(yaml, sourcePath) {
122
+ const raw = parseYamlMapping(yaml, sourcePath);
123
+ const version = parseVersion(raw.version, sourcePath);
124
+ if (!raw.phase || typeof raw.phase !== 'object' || Array.isArray(raw.phase)) {
125
+ throw new RoadmapSourceError('phase must be a mapping', sourcePath);
126
+ }
127
+ const phase = raw.phase;
128
+ if (typeof phase.name !== 'string' || !phase.name.trim()) {
129
+ throw new RoadmapSourceError('phase.name must be a non-empty string', sourcePath);
130
+ }
131
+ for (const field of ['description', 'status', 'note']) {
132
+ if (phase[field] != null && typeof phase[field] !== 'string') {
133
+ throw new RoadmapSourceError(`phase.${field} must be a string when present`, sourcePath);
134
+ }
135
+ }
136
+ if (!Array.isArray(phase.sprints)
137
+ || phase.sprints.some(id => typeof id !== 'number' || !Number.isFinite(id) || id <= 0)) {
138
+ throw new RoadmapSourceError('phase.sprints must be a sequence of positive numeric sprint IDs', sourcePath);
139
+ }
140
+ if (!Array.isArray(raw.sprints)) {
141
+ throw new RoadmapSourceError('sprints must be a sequence', sourcePath);
142
+ }
143
+ const validClubs = new Set(['driver', 'long_iron', 'short_iron', 'wedge', 'putter']);
144
+ // Pre-schema compatibility values are deliberately bounded rather than
145
+ // normalized: federation must reproduce accepted historical JSON exactly.
146
+ const validComplexities = new Set([
147
+ 'trivial',
148
+ 'small',
149
+ 'standard',
150
+ 'moderate',
151
+ 'multi_package',
152
+ 'multi-package',
153
+ 'risky',
154
+ ]);
155
+ for (const [sprintIndex, value] of raw.sprints.entries()) {
156
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
157
+ throw new RoadmapSourceError(`sprints[${sprintIndex}] must be a mapping`, sourcePath);
158
+ }
159
+ const sprint = value;
160
+ if (typeof sprint.id !== 'number' || !Number.isFinite(sprint.id) || sprint.id <= 0) {
161
+ throw new RoadmapSourceError(`sprints[${sprintIndex}].id must be a positive number`, sourcePath);
162
+ }
163
+ if (typeof sprint.theme !== 'string' || !sprint.theme.trim()) {
164
+ throw new RoadmapSourceError(`sprints[${sprintIndex}].theme must be a non-empty string`, sourcePath);
165
+ }
166
+ if (![3, 4, 5].includes(sprint.par)) {
167
+ throw new RoadmapSourceError(`sprints[${sprintIndex}].par must be 3, 4, or 5`, sourcePath);
168
+ }
169
+ if (typeof sprint.slope !== 'number' || !Number.isFinite(sprint.slope)) {
170
+ throw new RoadmapSourceError(`sprints[${sprintIndex}].slope must be numeric`, sourcePath);
171
+ }
172
+ if (typeof sprint.type !== 'string' || !sprint.type.trim()) {
173
+ throw new RoadmapSourceError(`sprints[${sprintIndex}].type must be a non-empty string`, sourcePath);
174
+ }
175
+ if (sprint.depends_on != null
176
+ && (!Array.isArray(sprint.depends_on)
177
+ || sprint.depends_on.some(id => typeof id !== 'number' || !Number.isFinite(id) || id <= 0))) {
178
+ throw new RoadmapSourceError(`sprints[${sprintIndex}].depends_on must contain numeric sprint IDs`, sourcePath);
179
+ }
180
+ for (const field of ['status', 'note', 'outcome', 'phase', 'wave']) {
181
+ if (sprint[field] != null && typeof sprint[field] !== 'string') {
182
+ throw new RoadmapSourceError(`sprints[${sprintIndex}].${field} must be a string when present`, sourcePath);
183
+ }
184
+ }
185
+ for (const field of ['artifacts', 'expected_artifacts', 'research']) {
186
+ if (sprint[field] != null
187
+ && (!Array.isArray(sprint[field]) || sprint[field].some(item => typeof item !== 'string'))) {
188
+ throw new RoadmapSourceError(`sprints[${sprintIndex}].${field} must contain string paths`, sourcePath);
189
+ }
190
+ }
191
+ if (!Array.isArray(sprint.tickets)) {
192
+ throw new RoadmapSourceError(`sprints[${sprintIndex}].tickets must be a sequence`, sourcePath);
193
+ }
194
+ for (const [ticketIndex, ticketValue] of sprint.tickets.entries()) {
195
+ if (!ticketValue || typeof ticketValue !== 'object' || Array.isArray(ticketValue)) {
196
+ throw new RoadmapSourceError(`sprints[${sprintIndex}].tickets[${ticketIndex}] must be a mapping`, sourcePath);
197
+ }
198
+ const ticket = ticketValue;
199
+ const key = typeof ticket.key === 'string' && ticket.key.trim()
200
+ ? ticket.key
201
+ : typeof ticket.id === 'string' && ticket.id.trim() ? ticket.id : null;
202
+ if (!key) {
203
+ throw new RoadmapSourceError(`sprints[${sprintIndex}].tickets[${ticketIndex}] requires key or id`, sourcePath);
204
+ }
205
+ if (typeof ticket.title !== 'string' || !ticket.title.trim()) {
206
+ throw new RoadmapSourceError(`sprints[${sprintIndex}].tickets[${ticketIndex}].title must be a non-empty string`, sourcePath);
207
+ }
208
+ if (!validClubs.has(String(ticket.club))) {
209
+ throw new RoadmapSourceError(`sprints[${sprintIndex}].tickets[${ticketIndex}].club is invalid`, sourcePath);
210
+ }
211
+ if (!validComplexities.has(String(ticket.complexity))) {
212
+ throw new RoadmapSourceError(`sprints[${sprintIndex}].tickets[${ticketIndex}].complexity is invalid`, sourcePath);
213
+ }
214
+ if (ticket.depends_on != null
215
+ && (!Array.isArray(ticket.depends_on)
216
+ || ticket.depends_on.some(id => typeof id !== 'string' || !id.trim()))) {
217
+ throw new RoadmapSourceError(`sprints[${sprintIndex}].tickets[${ticketIndex}].depends_on must contain ticket keys`, sourcePath);
218
+ }
219
+ const issueValues = Array.isArray(ticket.github_issue) ? ticket.github_issue : [ticket.github_issue];
220
+ if (ticket.github_issue != null
221
+ && (issueValues.length === 0
222
+ || issueValues.some(issue => typeof issue !== 'number' || !Number.isInteger(issue) || issue <= 0))) {
223
+ throw new RoadmapSourceError(`sprints[${sprintIndex}].tickets[${ticketIndex}].github_issue must be a positive integer or non-empty sequence of positive integers`, sourcePath);
224
+ }
225
+ if (ticket.note != null && typeof ticket.note !== 'string') {
226
+ throw new RoadmapSourceError(`sprints[${sprintIndex}].tickets[${ticketIndex}].note must be a string`, sourcePath);
227
+ }
228
+ }
229
+ }
230
+ const structural = castRoadmapStructure({
231
+ name: phase.name,
232
+ phases: [phase],
233
+ sprints: raw.sprints,
234
+ });
235
+ if (!structural) {
236
+ throw new RoadmapSourceError('sprints could not be read as roadmap definitions', sourcePath);
237
+ }
238
+ for (const [index, sprint] of structural.sprints.entries()) {
239
+ if (typeof sprint.id !== 'number' || !Number.isFinite(sprint.id)) {
240
+ throw new RoadmapSourceError(`sprints[${index}].id must be numeric`, sourcePath);
241
+ }
242
+ if (!Array.isArray(sprint.tickets)) {
243
+ throw new RoadmapSourceError(`sprints[${index}].tickets must be a sequence`, sourcePath);
244
+ }
245
+ }
246
+ let scorecards;
247
+ if (raw.scorecards != null) {
248
+ if (typeof raw.scorecards !== 'object' || Array.isArray(raw.scorecards)) {
249
+ throw new RoadmapSourceError('scorecards must be a mapping of sprint ID to repo-relative path', sourcePath);
250
+ }
251
+ scorecards = {};
252
+ for (const [sprint, value] of Object.entries(raw.scorecards)) {
253
+ if (!/^\d+(?:\.\d+)?$/.test(sprint) || Number(sprint) <= 0) {
254
+ throw new RoadmapSourceError(`scorecards key must be a positive sprint ID: ${sprint}`, sourcePath);
255
+ }
256
+ if (typeof value !== 'string') {
257
+ throw new RoadmapSourceError(`scorecards.${sprint} must be a string path`, sourcePath);
258
+ }
259
+ scorecards[sprint] = normalizeRoadmapSourcePath(value, `scorecards.${sprint}`);
260
+ }
261
+ }
262
+ return {
263
+ version,
264
+ phase: structural.phases[0],
265
+ sprints: structural.sprints,
266
+ ...(scorecards ? { scorecards } : {}),
267
+ };
268
+ }
269
+ export function sourceProjectToRoadmap(project) {
270
+ return {
271
+ name: project.name,
272
+ ...(project.description ? { description: project.description } : {}),
273
+ };
274
+ }
275
+ function clonePhase(phase) {
276
+ return { ...phase, sprints: [...phase.sprints] };
277
+ }
278
+ function cloneSprint(sprint) {
279
+ return {
280
+ ...sprint,
281
+ ...(sprint.depends_on ? { depends_on: [...sprint.depends_on] } : {}),
282
+ tickets: sprint.tickets.map(ticket => ({
283
+ ...ticket,
284
+ ...(ticket.depends_on ? { depends_on: [...ticket.depends_on] } : {}),
285
+ ...(Array.isArray(ticket.github_issue) ? { github_issue: [...ticket.github_issue] } : {}),
286
+ })),
287
+ ...(sprint.artifacts ? { artifacts: [...sprint.artifacts] } : {}),
288
+ ...(sprint.expected_artifacts ? { expected_artifacts: [...sprint.expected_artifacts] } : {}),
289
+ ...(sprint.research ? { research: [...sprint.research] } : {}),
290
+ };
291
+ }
292
+ /** Compile ordered authoring bundles into the existing roadmap compatibility shape. */
293
+ export function compileRoadmapSources(project, sources) {
294
+ const byPath = new Map();
295
+ for (const source of sources) {
296
+ if (byPath.has(source.entry.path)) {
297
+ throw new RoadmapSourceError(`Loaded source is duplicated: ${source.entry.path}`);
298
+ }
299
+ byPath.set(source.entry.path, source);
300
+ }
301
+ const manifestPaths = new Set(project.sources.map(source => source.path));
302
+ const unexpected = sources.find(source => !manifestPaths.has(source.entry.path));
303
+ if (unexpected)
304
+ throw new RoadmapSourceError(`Loaded source is not declared by the manifest: ${unexpected.entry.path}`);
305
+ const ordered = project.sources.map(entry => {
306
+ const source = byPath.get(entry.path);
307
+ if (!source)
308
+ throw new RoadmapSourceError(`Manifest source was not loaded: ${entry.path}`);
309
+ if (source.entry.kind !== entry.kind) {
310
+ throw new RoadmapSourceError(`Source kind mismatch for ${entry.path}: expected ${entry.kind}, received ${source.entry.kind}`);
311
+ }
312
+ return source;
313
+ });
314
+ const roadmap = {
315
+ name: project.name,
316
+ ...(project.description ? { description: project.description } : {}),
317
+ phases: ordered.map(source => clonePhase(source.document.phase)),
318
+ sprints: ordered.flatMap(source => source.document.sprints.map(cloneSprint)),
319
+ };
320
+ roadmap.sprints.sort((a, b) => compareRoadmapSprintIds(roadmap, a.id, b.id));
321
+ return roadmap;
322
+ }
323
+ export function serializeRoadmapProjection(roadmap) {
324
+ return `${JSON.stringify(roadmap, null, 2)}\n`;
325
+ }
326
+ function sourceLabel(source) {
327
+ return normalizeDiagnosticPath(source.entry.path);
328
+ }
329
+ /** Validate source federation invariants before any compatibility write. */
330
+ export function validateRoadmapSourceFederation(project, sources) {
331
+ const errors = [];
332
+ const warnings = [];
333
+ let roadmap;
334
+ try {
335
+ roadmap = compileRoadmapSources(project, sources);
336
+ }
337
+ catch (error) {
338
+ roadmap = { name: project.name, phases: [], sprints: [] };
339
+ errors.push({ code: 'manifest_fidelity', message: error.message });
340
+ return { valid: false, errors, warnings, roadmap };
341
+ }
342
+ const sourcePaths = new Map();
343
+ for (const source of sources) {
344
+ const prior = sourcePaths.get(source.entry.path);
345
+ if (prior != null) {
346
+ errors.push({
347
+ code: 'duplicate_source_path',
348
+ source: sourceLabel(source),
349
+ message: `Source path is listed more than once (entries ${prior + 1} and ${sourcePaths.size + 1}).`,
350
+ });
351
+ }
352
+ else {
353
+ sourcePaths.set(source.entry.path, sourcePaths.size);
354
+ }
355
+ }
356
+ const phaseNames = new Map();
357
+ const sprintDefinitions = new Map();
358
+ const sprintMemberships = new Map();
359
+ const ticketDefinitions = new Map();
360
+ for (const source of sources) {
361
+ const label = sourceLabel(source);
362
+ const priorPhase = phaseNames.get(source.document.phase.name);
363
+ if (priorPhase) {
364
+ errors.push({
365
+ code: 'duplicate_phase',
366
+ source: label,
367
+ message: `Phase "${source.document.phase.name}" is also defined in ${priorPhase}.`,
368
+ });
369
+ }
370
+ else {
371
+ phaseNames.set(source.document.phase.name, label);
372
+ }
373
+ const localMembership = source.document.phase.sprints;
374
+ const localDefinitions = source.document.sprints.map(sprint => sprint.id);
375
+ const membershipSet = new Set(localMembership);
376
+ const definitionSet = new Set(localDefinitions);
377
+ for (const id of localMembership) {
378
+ const memberships = sprintMemberships.get(id) ?? [];
379
+ memberships.push(label);
380
+ sprintMemberships.set(id, memberships);
381
+ if (!definitionSet.has(id)) {
382
+ errors.push({
383
+ code: 'missing_sprint_definition',
384
+ source: label,
385
+ sprint: id,
386
+ message: `Phase membership S${id} has no sprint definition in the same bundle.`,
387
+ });
388
+ }
389
+ }
390
+ for (const id of localDefinitions) {
391
+ if (!membershipSet.has(id)) {
392
+ errors.push({
393
+ code: 'orphan_sprint_definition',
394
+ source: label,
395
+ sprint: id,
396
+ message: `Sprint S${id} is defined but missing from phase.sprints in the same bundle.`,
397
+ });
398
+ }
399
+ }
400
+ if (membershipSet.size !== localMembership.length) {
401
+ errors.push({ code: 'duplicate_phase_membership', source: label, message: 'phase.sprints contains duplicate IDs.' });
402
+ }
403
+ if (definitionSet.size !== localDefinitions.length) {
404
+ errors.push({ code: 'duplicate_local_sprint', source: label, message: 'Bundle contains duplicate sprint definitions.' });
405
+ }
406
+ for (const sprint of source.document.sprints) {
407
+ const priorSprint = sprintDefinitions.get(sprint.id);
408
+ if (priorSprint) {
409
+ errors.push({
410
+ code: 'duplicate_sprint',
411
+ source: label,
412
+ sprint: sprint.id,
413
+ message: `Sprint S${sprint.id} is also defined in ${priorSprint}.`,
414
+ });
415
+ }
416
+ else {
417
+ sprintDefinitions.set(sprint.id, label);
418
+ }
419
+ for (const ticket of sprint.tickets) {
420
+ const key = getRoadmapTicketKey(ticket);
421
+ if (!key)
422
+ continue;
423
+ const priorTicket = ticketDefinitions.get(key);
424
+ if (priorTicket) {
425
+ errors.push({
426
+ code: 'duplicate_ticket',
427
+ source: label,
428
+ sprint: sprint.id,
429
+ ticket: key,
430
+ message: `Ticket ${key} is also defined in ${priorTicket}.`,
431
+ });
432
+ }
433
+ else {
434
+ ticketDefinitions.set(key, label);
435
+ }
436
+ }
437
+ }
438
+ }
439
+ for (const [sprint, memberships] of sprintMemberships) {
440
+ if (memberships.length > 1) {
441
+ errors.push({
442
+ code: 'multiple_phase_membership',
443
+ sprint,
444
+ message: `Sprint S${sprint} belongs to multiple phase bundles: ${memberships.join(', ')}.`,
445
+ });
446
+ }
447
+ }
448
+ const normalizedSprintIds = new Map();
449
+ for (const sprint of roadmap.sprints) {
450
+ const normalized = roadmapSprintOrderValue(roadmap, sprint.id);
451
+ const prior = normalizedSprintIds.get(normalized);
452
+ if (prior && prior.id !== sprint.id) {
453
+ errors.push({
454
+ code: 'logical_sprint_collision',
455
+ source: sprintDefinitions.get(sprint.id),
456
+ sprint: sprint.id,
457
+ message: `Sprint S${sprint.id} and Sprint S${prior.id} resolve to the same roadmap identity (${normalized}); first defined in ${prior.source ?? 'unknown source'}.`,
458
+ });
459
+ }
460
+ else {
461
+ normalizedSprintIds.set(normalized, { id: sprint.id, source: sprintDefinitions.get(sprint.id) });
462
+ }
463
+ }
464
+ const roadmapValidation = validateRoadmap(roadmap);
465
+ for (const issue of roadmapValidation.errors) {
466
+ errors.push({
467
+ code: 'roadmap_validation',
468
+ message: issue.message,
469
+ ...(issue.sprint != null ? { sprint: issue.sprint, source: sprintDefinitions.get(issue.sprint) } : {}),
470
+ ...(issue.ticket ? { ticket: issue.ticket } : {}),
471
+ });
472
+ }
473
+ for (const issue of roadmapValidation.warnings) {
474
+ warnings.push({
475
+ code: 'roadmap_validation',
476
+ message: issue.message,
477
+ ...(issue.sprint != null ? { sprint: issue.sprint, source: sprintDefinitions.get(issue.sprint) } : {}),
478
+ ...(issue.ticket ? { ticket: issue.ticket } : {}),
479
+ });
480
+ }
481
+ return { valid: errors.length === 0, errors, warnings, roadmap };
482
+ }
483
+ //# sourceMappingURL=roadmap-sources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roadmap-sources.js","sourceRoot":"","sources":["../../src/core/roadmap-sources.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,18 @@
1
1
  /** Club selection for a roadmap ticket (mirrors core ClubSelection) */
2
2
  export type RoadmapClub = 'driver' | 'long_iron' | 'short_iron' | 'wedge' | 'putter';
3
+ /** Canonical values plus bounded aliases retained by pre-schema roadmap history. */
4
+ export type RoadmapTicketComplexity = 'trivial' | 'small' | 'standard' | 'moderate' | 'multi_package' | 'multi-package' | 'risky';
3
5
  /** A single ticket within a sprint */
4
6
  export interface RoadmapTicket {
5
7
  key: string;
6
8
  id?: string;
7
9
  title: string;
8
10
  club: RoadmapClub;
9
- complexity: 'trivial' | 'small' | 'standard' | 'moderate';
11
+ complexity: RoadmapTicketComplexity;
10
12
  depends_on?: string[];
13
+ /** New tickets use one issue; legacy history may retain multiple issue links. */
14
+ github_issue?: number | number[];
15
+ note?: string;
11
16
  }
12
17
  /** A sprint within the roadmap */
13
18
  export interface RoadmapSprint {
@@ -18,11 +23,22 @@ export interface RoadmapSprint {
18
23
  type: string;
19
24
  tickets: RoadmapTicket[];
20
25
  depends_on?: number[];
26
+ status?: string;
27
+ note?: string;
28
+ outcome?: string;
29
+ phase?: string;
30
+ wave?: string;
31
+ artifacts?: string[];
32
+ expected_artifacts?: string[];
33
+ research?: string[];
21
34
  }
22
35
  /** A phase grouping sprints */
23
36
  export interface RoadmapPhase {
24
37
  name: string;
25
38
  sprints: number[];
39
+ description?: string;
40
+ status?: string;
41
+ note?: string;
26
42
  }
27
43
  /** Top-level roadmap definition */
28
44
  export interface RoadmapDefinition {
@@ -67,6 +83,9 @@ export declare function parseSprintNumber(value: string | number): number | null
67
83
  export declare function compareSprintIds(a: number, b: number): number;
68
84
  /** Return the next canonical sprint id after a completed sprint/inserted sprint. */
69
85
  export declare function nextCanonicalSprintId(id: number): number;
86
+ export declare const ROADMAP_TERMINAL_STATUSES: Set<string>;
87
+ /** Return true when a roadmap sprint has a durable terminal disposition. */
88
+ export declare function isRoadmapSprintTerminal(sprint: RoadmapSprint): boolean;
70
89
  /** Return true when a roadmap sprint should still be considered selectable work. */
71
90
  export declare function isRoadmapSprintPending(sprint: RoadmapSprint): boolean;
72
91
  type RoadmapTicketInput = Partial<RoadmapTicket> & {
@@ -74,6 +93,11 @@ type RoadmapTicketInput = Partial<RoadmapTicket> & {
74
93
  key?: unknown;
75
94
  };
76
95
  export declare function getRoadmapTicketKey(ticket: RoadmapTicketInput): string | null;
96
+ /** Resolve legacy encoded half-sprint IDs using evidence from one roadmap. */
97
+ export declare function isEncodedInsertedSprintInRoadmap(roadmap: RoadmapDefinition, id: number): boolean;
98
+ export declare function roadmapSprintOrderValue(roadmap: RoadmapDefinition, id: number): number;
99
+ export declare function compareRoadmapSprintIds(roadmap: RoadmapDefinition, a: number, b: number): number;
100
+ export declare function formatRoadmapSprintLabel(roadmap: RoadmapDefinition, id: number): string;
77
101
  /** Validate a roadmap definition for structural correctness.
78
102
  * Optionally cross-check sprint status against scorecards and/or shipped
79
103
  * sprint commits on main when provided. Caller is responsible for collecting
@@ -1 +1 @@
1
- {"version":3,"file":"roadmap.d.ts","sourceRoot":"","sources":["../../src/core/roadmap.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"roadmap.d.ts","sourceRoot":"","sources":["../../src/core/roadmap.ts"],"names":[],"mappings":"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"}