@slope-dev/slope 1.64.1 → 2.0.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 (461) hide show
  1. package/README.md +4 -0
  2. package/dist/cli/commands/agent.d.ts +3 -3
  3. package/dist/cli/commands/agent.d.ts.map +1 -1
  4. package/dist/cli/commands/agent.js +20 -12
  5. package/dist/cli/commands/agent.js.map +1 -1
  6. package/dist/cli/commands/auto-card.d.ts +2 -1
  7. package/dist/cli/commands/auto-card.d.ts.map +1 -1
  8. package/dist/cli/commands/auto-card.js +7 -7
  9. package/dist/cli/commands/auto-card.js.map +1 -1
  10. package/dist/cli/commands/briefing.d.ts.map +1 -1
  11. package/dist/cli/commands/briefing.js +16 -9
  12. package/dist/cli/commands/briefing.js.map +1 -1
  13. package/dist/cli/commands/claim.d.ts.map +1 -1
  14. package/dist/cli/commands/claim.js +6 -4
  15. package/dist/cli/commands/claim.js.map +1 -1
  16. package/dist/cli/commands/commit-ready.d.ts.map +1 -1
  17. package/dist/cli/commands/commit-ready.js.map +1 -1
  18. package/dist/cli/commands/context.d.ts.map +1 -1
  19. package/dist/cli/commands/context.js +2 -1
  20. package/dist/cli/commands/context.js.map +1 -1
  21. package/dist/cli/commands/dashboard.d.ts.map +1 -1
  22. package/dist/cli/commands/dashboard.js +3 -3
  23. package/dist/cli/commands/dashboard.js.map +1 -1
  24. package/dist/cli/commands/distill.d.ts.map +1 -1
  25. package/dist/cli/commands/distill.js +8 -20
  26. package/dist/cli/commands/distill.js.map +1 -1
  27. package/dist/cli/commands/enrich.d.ts.map +1 -1
  28. package/dist/cli/commands/enrich.js +2 -1
  29. package/dist/cli/commands/enrich.js.map +1 -1
  30. package/dist/cli/commands/escalate.d.ts.map +1 -1
  31. package/dist/cli/commands/escalate.js +11 -3
  32. package/dist/cli/commands/escalate.js.map +1 -1
  33. package/dist/cli/commands/extract.d.ts.map +1 -1
  34. package/dist/cli/commands/extract.js +20 -6
  35. package/dist/cli/commands/extract.js.map +1 -1
  36. package/dist/cli/commands/gate.d.ts.map +1 -1
  37. package/dist/cli/commands/gate.js +10 -7
  38. package/dist/cli/commands/gate.js.map +1 -1
  39. package/dist/cli/commands/index-cmd.d.ts.map +1 -1
  40. package/dist/cli/commands/index-cmd.js +2 -1
  41. package/dist/cli/commands/index-cmd.js.map +1 -1
  42. package/dist/cli/commands/init.d.ts.map +1 -1
  43. package/dist/cli/commands/init.js +26 -12
  44. package/dist/cli/commands/init.js.map +1 -1
  45. package/dist/cli/commands/initiative.d.ts.map +1 -1
  46. package/dist/cli/commands/initiative.js +9 -8
  47. package/dist/cli/commands/initiative.js.map +1 -1
  48. package/dist/cli/commands/inspirations.js +5 -5
  49. package/dist/cli/commands/inspirations.js.map +1 -1
  50. package/dist/cli/commands/interview.d.ts.map +1 -1
  51. package/dist/cli/commands/interview.js +2 -2
  52. package/dist/cli/commands/interview.js.map +1 -1
  53. package/dist/cli/commands/issue.d.ts.map +1 -1
  54. package/dist/cli/commands/issue.js +6 -9
  55. package/dist/cli/commands/issue.js.map +1 -1
  56. package/dist/cli/commands/map.d.ts +1 -1
  57. package/dist/cli/commands/map.d.ts.map +1 -1
  58. package/dist/cli/commands/map.js +34 -10
  59. package/dist/cli/commands/map.js.map +1 -1
  60. package/dist/cli/commands/next.js +2 -2
  61. package/dist/cli/commands/next.js.map +1 -1
  62. package/dist/cli/commands/now.d.ts +2 -2
  63. package/dist/cli/commands/now.d.ts.map +1 -1
  64. package/dist/cli/commands/now.js +23 -15
  65. package/dist/cli/commands/now.js.map +1 -1
  66. package/dist/cli/commands/pr.d.ts +3 -3
  67. package/dist/cli/commands/pr.d.ts.map +1 -1
  68. package/dist/cli/commands/pr.js +9 -8
  69. package/dist/cli/commands/pr.js.map +1 -1
  70. package/dist/cli/commands/prep.d.ts.map +1 -1
  71. package/dist/cli/commands/prep.js +2 -1
  72. package/dist/cli/commands/prep.js.map +1 -1
  73. package/dist/cli/commands/release.d.ts.map +1 -1
  74. package/dist/cli/commands/release.js +9 -11
  75. package/dist/cli/commands/release.js.map +1 -1
  76. package/dist/cli/commands/retro.d.ts +1 -1
  77. package/dist/cli/commands/retro.d.ts.map +1 -1
  78. package/dist/cli/commands/retro.js +35 -11
  79. package/dist/cli/commands/retro.js.map +1 -1
  80. package/dist/cli/commands/review-packet.d.ts +2 -2
  81. package/dist/cli/commands/review-packet.d.ts.map +1 -1
  82. package/dist/cli/commands/review-packet.js +3 -3
  83. package/dist/cli/commands/review-packet.js.map +1 -1
  84. package/dist/cli/commands/review-run.d.ts +3 -2
  85. package/dist/cli/commands/review-run.d.ts.map +1 -1
  86. package/dist/cli/commands/review-run.js +4 -4
  87. package/dist/cli/commands/review-run.js.map +1 -1
  88. package/dist/cli/commands/review-state.d.ts.map +1 -1
  89. package/dist/cli/commands/review-state.js +57 -30
  90. package/dist/cli/commands/review-state.js.map +1 -1
  91. package/dist/cli/commands/review.js +6 -6
  92. package/dist/cli/commands/review.js.map +1 -1
  93. package/dist/cli/commands/roadmap.d.ts.map +1 -1
  94. package/dist/cli/commands/roadmap.js +138 -78
  95. package/dist/cli/commands/roadmap.js.map +1 -1
  96. package/dist/cli/commands/session.d.ts.map +1 -1
  97. package/dist/cli/commands/session.js +47 -16
  98. package/dist/cli/commands/session.js.map +1 -1
  99. package/dist/cli/commands/sprint-plan.d.ts.map +1 -1
  100. package/dist/cli/commands/sprint-plan.js +10 -8
  101. package/dist/cli/commands/sprint-plan.js.map +1 -1
  102. package/dist/cli/commands/sprint.d.ts.map +1 -1
  103. package/dist/cli/commands/sprint.js +253 -38
  104. package/dist/cli/commands/sprint.js.map +1 -1
  105. package/dist/cli/commands/standup.d.ts.map +1 -1
  106. package/dist/cli/commands/standup.js +9 -4
  107. package/dist/cli/commands/standup.js.map +1 -1
  108. package/dist/cli/commands/start.js +2 -2
  109. package/dist/cli/commands/start.js.map +1 -1
  110. package/dist/cli/commands/stats.d.ts +4 -4
  111. package/dist/cli/commands/stats.d.ts.map +1 -1
  112. package/dist/cli/commands/stats.js +5 -5
  113. package/dist/cli/commands/stats.js.map +1 -1
  114. package/dist/cli/commands/status.d.ts +1 -1
  115. package/dist/cli/commands/status.d.ts.map +1 -1
  116. package/dist/cli/commands/status.js +12 -8
  117. package/dist/cli/commands/status.js.map +1 -1
  118. package/dist/cli/commands/store.d.ts +37 -0
  119. package/dist/cli/commands/store.d.ts.map +1 -1
  120. package/dist/cli/commands/store.js +262 -12
  121. package/dist/cli/commands/store.js.map +1 -1
  122. package/dist/cli/commands/ticket.d.ts.map +1 -1
  123. package/dist/cli/commands/ticket.js +4 -4
  124. package/dist/cli/commands/ticket.js.map +1 -1
  125. package/dist/cli/commands/tournament.d.ts.map +1 -1
  126. package/dist/cli/commands/tournament.js +7 -6
  127. package/dist/cli/commands/tournament.js.map +1 -1
  128. package/dist/cli/commands/validate.d.ts +4 -3
  129. package/dist/cli/commands/validate.d.ts.map +1 -1
  130. package/dist/cli/commands/validate.js +37 -10
  131. package/dist/cli/commands/validate.js.map +1 -1
  132. package/dist/cli/commands/version.d.ts +1 -1
  133. package/dist/cli/commands/version.d.ts.map +1 -1
  134. package/dist/cli/commands/version.js +13 -10
  135. package/dist/cli/commands/version.js.map +1 -1
  136. package/dist/cli/commands/worktree.d.ts.map +1 -1
  137. package/dist/cli/commands/worktree.js +36 -31
  138. package/dist/cli/commands/worktree.js.map +1 -1
  139. package/dist/cli/guards/claim-required.d.ts.map +1 -1
  140. package/dist/cli/guards/claim-required.js +2 -3
  141. package/dist/cli/guards/claim-required.js.map +1 -1
  142. package/dist/cli/guards/compaction.d.ts.map +1 -1
  143. package/dist/cli/guards/git-utils.d.ts +5 -0
  144. package/dist/cli/guards/git-utils.d.ts.map +1 -1
  145. package/dist/cli/guards/git-utils.js +36 -8
  146. package/dist/cli/guards/git-utils.js.map +1 -1
  147. package/dist/cli/guards/hazard.d.ts.map +1 -1
  148. package/dist/cli/guards/hazard.js +8 -7
  149. package/dist/cli/guards/hazard.js.map +1 -1
  150. package/dist/cli/guards/next-action.d.ts +5 -5
  151. package/dist/cli/guards/next-action.d.ts.map +1 -1
  152. package/dist/cli/guards/next-action.js +8 -8
  153. package/dist/cli/guards/next-action.js.map +1 -1
  154. package/dist/cli/guards/phase-boundary.d.ts.map +1 -1
  155. package/dist/cli/guards/phase-boundary.js +24 -14
  156. package/dist/cli/guards/phase-boundary.js.map +1 -1
  157. package/dist/cli/guards/post-hole-enforcement.d.ts.map +1 -1
  158. package/dist/cli/guards/post-hole-enforcement.js +9 -8
  159. package/dist/cli/guards/post-hole-enforcement.js.map +1 -1
  160. package/dist/cli/guards/post-push.d.ts.map +1 -1
  161. package/dist/cli/guards/post-push.js +7 -3
  162. package/dist/cli/guards/post-push.js.map +1 -1
  163. package/dist/cli/guards/review-stale.d.ts.map +1 -1
  164. package/dist/cli/guards/review-stale.js +6 -4
  165. package/dist/cli/guards/review-stale.js.map +1 -1
  166. package/dist/cli/guards/review-tier.d.ts.map +1 -1
  167. package/dist/cli/guards/review-tier.js +6 -7
  168. package/dist/cli/guards/review-tier.js.map +1 -1
  169. package/dist/cli/guards/roadmap-edit-shipped.d.ts.map +1 -1
  170. package/dist/cli/guards/roadmap-edit-shipped.js +34 -21
  171. package/dist/cli/guards/roadmap-edit-shipped.js.map +1 -1
  172. package/dist/cli/guards/scope-drift.d.ts.map +1 -1
  173. package/dist/cli/guards/scope-drift.js +2 -1
  174. package/dist/cli/guards/scope-drift.js.map +1 -1
  175. package/dist/cli/guards/session-briefing.d.ts.map +1 -1
  176. package/dist/cli/guards/session-briefing.js +34 -13
  177. package/dist/cli/guards/session-briefing.js.map +1 -1
  178. package/dist/cli/guards/sprint-completion.d.ts.map +1 -1
  179. package/dist/cli/guards/sprint-completion.js +32 -16
  180. package/dist/cli/guards/sprint-completion.js.map +1 -1
  181. package/dist/cli/guards/stop-check.d.ts.map +1 -1
  182. package/dist/cli/guards/stop-check.js +8 -10
  183. package/dist/cli/guards/stop-check.js.map +1 -1
  184. package/dist/cli/guards/transcript.d.ts.map +1 -1
  185. package/dist/cli/guards/transcript.js +2 -1
  186. package/dist/cli/guards/transcript.js.map +1 -1
  187. package/dist/cli/guards/workflow-step-gate.d.ts.map +1 -1
  188. package/dist/cli/guards/workflow-step-gate.js +25 -28
  189. package/dist/cli/guards/workflow-step-gate.js.map +1 -1
  190. package/dist/cli/guards/worktree-check.d.ts.map +1 -1
  191. package/dist/cli/guards/worktree-check.js +38 -13
  192. package/dist/cli/guards/worktree-check.js.map +1 -1
  193. package/dist/cli/hooks-config.d.ts.map +1 -1
  194. package/dist/cli/hooks-config.js +6 -4
  195. package/dist/cli/hooks-config.js.map +1 -1
  196. package/dist/cli/index.js +1 -1
  197. package/dist/cli/index.js.map +1 -1
  198. package/dist/cli/loop/executor.d.ts +1 -0
  199. package/dist/cli/loop/executor.d.ts.map +1 -1
  200. package/dist/cli/loop/executor.js +20 -13
  201. package/dist/cli/loop/executor.js.map +1 -1
  202. package/dist/cli/loop/pr-lifecycle.d.ts +2 -1
  203. package/dist/cli/loop/pr-lifecycle.d.ts.map +1 -1
  204. package/dist/cli/loop/pr-lifecycle.js +14 -8
  205. package/dist/cli/loop/pr-lifecycle.js.map +1 -1
  206. package/dist/cli/loop/worktree.d.ts.map +1 -1
  207. package/dist/cli/loop/worktree.js +1 -48
  208. package/dist/cli/loop/worktree.js.map +1 -1
  209. package/dist/cli/pr-closeout.d.ts +3 -2
  210. package/dist/cli/pr-closeout.d.ts.map +1 -1
  211. package/dist/cli/pr-closeout.js +14 -6
  212. package/dist/cli/pr-closeout.js.map +1 -1
  213. package/dist/cli/pr-review-state.d.ts +8 -7
  214. package/dist/cli/pr-review-state.d.ts.map +1 -1
  215. package/dist/cli/pr-review-state.js +3 -2
  216. package/dist/cli/pr-review-state.js.map +1 -1
  217. package/dist/cli/pre-sprint-reality.d.ts +4 -4
  218. package/dist/cli/pre-sprint-reality.d.ts.map +1 -1
  219. package/dist/cli/pre-sprint-reality.js +9 -2
  220. package/dist/cli/pre-sprint-reality.js.map +1 -1
  221. package/dist/cli/registries/api-registry.d.ts +2 -2
  222. package/dist/cli/registries/api-registry.d.ts.map +1 -1
  223. package/dist/cli/registries/api-registry.js +1 -1
  224. package/dist/cli/registries/api-registry.js.map +1 -1
  225. package/dist/cli/registries/file-registry.d.ts +3 -3
  226. package/dist/cli/registries/file-registry.d.ts.map +1 -1
  227. package/dist/cli/registries/file-registry.js +12 -2
  228. package/dist/cli/registries/file-registry.js.map +1 -1
  229. package/dist/cli/registries/index.d.ts +1 -1
  230. package/dist/cli/registries/index.d.ts.map +1 -1
  231. package/dist/cli/registries/index.js +2 -2
  232. package/dist/cli/registries/index.js.map +1 -1
  233. package/dist/cli/registry.d.ts.map +1 -1
  234. package/dist/cli/registry.js +4 -0
  235. package/dist/cli/registry.js.map +1 -1
  236. package/dist/cli/reviewer-agents.d.ts +2 -1
  237. package/dist/cli/reviewer-agents.d.ts.map +1 -1
  238. package/dist/cli/reviewer-agents.js.map +1 -1
  239. package/dist/cli/roadmap-source-migration.d.ts.map +1 -1
  240. package/dist/cli/roadmap-source-migration.js +15 -13
  241. package/dist/cli/roadmap-source-migration.js.map +1 -1
  242. package/dist/cli/roadmap-source-store.d.ts +4 -4
  243. package/dist/cli/roadmap-source-store.d.ts.map +1 -1
  244. package/dist/cli/roadmap-source-store.js +38 -32
  245. package/dist/cli/roadmap-source-store.js.map +1 -1
  246. package/dist/cli/session-heartbeat.d.ts +12 -0
  247. package/dist/cli/session-heartbeat.d.ts.map +1 -0
  248. package/dist/cli/session-heartbeat.js +46 -0
  249. package/dist/cli/session-heartbeat.js.map +1 -0
  250. package/dist/cli/session-scope.d.ts.map +1 -1
  251. package/dist/cli/session-scope.js +4 -16
  252. package/dist/cli/session-scope.js.map +1 -1
  253. package/dist/cli/session-state.js +5 -5
  254. package/dist/cli/session-state.js.map +1 -1
  255. package/dist/cli/sprint-inference.d.ts +5 -5
  256. package/dist/cli/sprint-inference.d.ts.map +1 -1
  257. package/dist/cli/sprint-inference.js +63 -33
  258. package/dist/cli/sprint-inference.js.map +1 -1
  259. package/dist/cli/sprint-resume.d.ts +7 -7
  260. package/dist/cli/sprint-resume.d.ts.map +1 -1
  261. package/dist/cli/sprint-resume.js +43 -21
  262. package/dist/cli/sprint-resume.js.map +1 -1
  263. package/dist/cli/sprint-rollover.d.ts +19 -19
  264. package/dist/cli/sprint-rollover.d.ts.map +1 -1
  265. package/dist/cli/sprint-rollover.js +116 -69
  266. package/dist/cli/sprint-rollover.js.map +1 -1
  267. package/dist/cli/sprint-state.d.ts +8 -6
  268. package/dist/cli/sprint-state.d.ts.map +1 -1
  269. package/dist/cli/sprint-state.js +39 -12
  270. package/dist/cli/sprint-state.js.map +1 -1
  271. package/dist/cli/store.d.ts.map +1 -1
  272. package/dist/cli/store.js +5 -3
  273. package/dist/cli/store.js.map +1 -1
  274. package/dist/cli/workflow-closeout.d.ts +11 -0
  275. package/dist/cli/workflow-closeout.d.ts.map +1 -0
  276. package/dist/cli/workflow-closeout.js +30 -0
  277. package/dist/cli/workflow-closeout.js.map +1 -0
  278. package/dist/cli/workflow-resync.d.ts +13 -9
  279. package/dist/cli/workflow-resync.d.ts.map +1 -1
  280. package/dist/cli/workflow-resync.js +75 -22
  281. package/dist/cli/workflow-resync.js.map +1 -1
  282. package/dist/core/advisor.d.ts.map +1 -1
  283. package/dist/core/advisor.js +5 -2
  284. package/dist/core/advisor.js.map +1 -1
  285. package/dist/core/analytics.d.ts +2 -2
  286. package/dist/core/analytics.d.ts.map +1 -1
  287. package/dist/core/analytics.js +4 -3
  288. package/dist/core/analytics.js.map +1 -1
  289. package/dist/core/analyzers/git.d.ts +3 -2
  290. package/dist/core/analyzers/git.d.ts.map +1 -1
  291. package/dist/core/analyzers/git.js +6 -5
  292. package/dist/core/analyzers/git.js.map +1 -1
  293. package/dist/core/briefing.d.ts +6 -5
  294. package/dist/core/briefing.d.ts.map +1 -1
  295. package/dist/core/briefing.js +52 -36
  296. package/dist/core/briefing.js.map +1 -1
  297. package/dist/core/builder.d.ts +3 -1
  298. package/dist/core/builder.d.ts.map +1 -1
  299. package/dist/core/builder.js +6 -4
  300. package/dist/core/builder.js.map +1 -1
  301. package/dist/core/config.d.ts +2 -1
  302. package/dist/core/config.d.ts.map +1 -1
  303. package/dist/core/config.js +26 -6
  304. package/dist/core/config.js.map +1 -1
  305. package/dist/core/dashboard.d.ts +2 -2
  306. package/dist/core/dashboard.d.ts.map +1 -1
  307. package/dist/core/dashboard.js +2 -1
  308. package/dist/core/dashboard.js.map +1 -1
  309. package/dist/core/deferred.d.ts +7 -6
  310. package/dist/core/deferred.d.ts.map +1 -1
  311. package/dist/core/deferred.js +30 -7
  312. package/dist/core/deferred.js.map +1 -1
  313. package/dist/core/enrich.d.ts +1 -1
  314. package/dist/core/escalation.d.ts +2 -1
  315. package/dist/core/escalation.d.ts.map +1 -1
  316. package/dist/core/escalation.js +3 -1
  317. package/dist/core/escalation.js.map +1 -1
  318. package/dist/core/event-ingestion.d.ts.map +1 -1
  319. package/dist/core/event-ingestion.js +8 -3
  320. package/dist/core/event-ingestion.js.map +1 -1
  321. package/dist/core/findings.d.ts +6 -4
  322. package/dist/core/findings.d.ts.map +1 -1
  323. package/dist/core/findings.js +30 -7
  324. package/dist/core/findings.js.map +1 -1
  325. package/dist/core/formatter.d.ts +2 -1
  326. package/dist/core/formatter.d.ts.map +1 -1
  327. package/dist/core/formatter.js.map +1 -1
  328. package/dist/core/generators/roadmap.js +2 -2
  329. package/dist/core/generators/roadmap.js.map +1 -1
  330. package/dist/core/index.d.ts +8 -5
  331. package/dist/core/index.d.ts.map +1 -1
  332. package/dist/core/index.js +4 -2
  333. package/dist/core/index.js.map +1 -1
  334. package/dist/core/initiative.d.ts +5 -4
  335. package/dist/core/initiative.d.ts.map +1 -1
  336. package/dist/core/initiative.js +39 -11
  337. package/dist/core/initiative.js.map +1 -1
  338. package/dist/core/inspirations.d.ts +4 -3
  339. package/dist/core/inspirations.d.ts.map +1 -1
  340. package/dist/core/inspirations.js +19 -4
  341. package/dist/core/inspirations.js.map +1 -1
  342. package/dist/core/interview-engine.d.ts +2 -1
  343. package/dist/core/interview-engine.d.ts.map +1 -1
  344. package/dist/core/interview-engine.js +26 -17
  345. package/dist/core/interview-engine.js.map +1 -1
  346. package/dist/core/interview-steps.d.ts.map +1 -1
  347. package/dist/core/interview-steps.js +7 -6
  348. package/dist/core/interview-steps.js.map +1 -1
  349. package/dist/core/interview.d.ts +2 -1
  350. package/dist/core/interview.d.ts.map +1 -1
  351. package/dist/core/interview.js +13 -7
  352. package/dist/core/interview.js.map +1 -1
  353. package/dist/core/issue-scout.d.ts +2 -1
  354. package/dist/core/issue-scout.d.ts.map +1 -1
  355. package/dist/core/issue-scout.js.map +1 -1
  356. package/dist/core/loader.d.ts +4 -4
  357. package/dist/core/loader.d.ts.map +1 -1
  358. package/dist/core/loader.js +71 -33
  359. package/dist/core/loader.js.map +1 -1
  360. package/dist/core/memory.d.ts.map +1 -1
  361. package/dist/core/memory.js +16 -6
  362. package/dist/core/memory.js.map +1 -1
  363. package/dist/core/org.d.ts +1 -1
  364. package/dist/core/org.d.ts.map +1 -1
  365. package/dist/core/org.js +2 -1
  366. package/dist/core/org.js.map +1 -1
  367. package/dist/core/pipeline.d.ts +1 -1
  368. package/dist/core/pipeline.d.ts.map +1 -1
  369. package/dist/core/pipeline.js +10 -6
  370. package/dist/core/pipeline.js.map +1 -1
  371. package/dist/core/player.d.ts.map +1 -1
  372. package/dist/core/player.js +2 -1
  373. package/dist/core/player.js.map +1 -1
  374. package/dist/core/prep.d.ts +3 -3
  375. package/dist/core/registry.d.ts +6 -2
  376. package/dist/core/registry.d.ts.map +1 -1
  377. package/dist/core/registry.js +2 -1
  378. package/dist/core/registry.js.map +1 -1
  379. package/dist/core/repo-state-scope.d.ts +27 -0
  380. package/dist/core/repo-state-scope.d.ts.map +1 -0
  381. package/dist/core/repo-state-scope.js +105 -0
  382. package/dist/core/repo-state-scope.js.map +1 -0
  383. package/dist/core/report.d.ts +1 -1
  384. package/dist/core/report.d.ts.map +1 -1
  385. package/dist/core/report.js +2 -1
  386. package/dist/core/report.js.map +1 -1
  387. package/dist/core/retro.d.ts +3 -2
  388. package/dist/core/retro.d.ts.map +1 -1
  389. package/dist/core/retro.js +6 -3
  390. package/dist/core/retro.js.map +1 -1
  391. package/dist/core/roadmap-focus.d.ts +8 -7
  392. package/dist/core/roadmap-focus.d.ts.map +1 -1
  393. package/dist/core/roadmap-focus.js +45 -34
  394. package/dist/core/roadmap-focus.js.map +1 -1
  395. package/dist/core/roadmap-migration.d.ts +2 -1
  396. package/dist/core/roadmap-migration.d.ts.map +1 -1
  397. package/dist/core/roadmap-migration.js +110 -51
  398. package/dist/core/roadmap-migration.js.map +1 -1
  399. package/dist/core/roadmap-source-patch.d.ts +2 -1
  400. package/dist/core/roadmap-source-patch.d.ts.map +1 -1
  401. package/dist/core/roadmap-source-patch.js +9 -4
  402. package/dist/core/roadmap-source-patch.js.map +1 -1
  403. package/dist/core/roadmap-sources.d.ts +2 -1
  404. package/dist/core/roadmap-sources.d.ts.map +1 -1
  405. package/dist/core/roadmap-sources.js +38 -26
  406. package/dist/core/roadmap-sources.js.map +1 -1
  407. package/dist/core/roadmap.d.ts +22 -16
  408. package/dist/core/roadmap.d.ts.map +1 -1
  409. package/dist/core/roadmap.js +152 -84
  410. package/dist/core/roadmap.js.map +1 -1
  411. package/dist/core/session-branch.d.ts +17 -0
  412. package/dist/core/session-branch.d.ts.map +1 -0
  413. package/dist/core/session-branch.js +85 -0
  414. package/dist/core/session-branch.js.map +1 -0
  415. package/dist/core/sprint-id.d.ts +13 -5
  416. package/dist/core/sprint-id.d.ts.map +1 -1
  417. package/dist/core/sprint-id.js +16 -0
  418. package/dist/core/sprint-id.js.map +1 -1
  419. package/dist/core/standup.d.ts +2 -1
  420. package/dist/core/standup.d.ts.map +1 -1
  421. package/dist/core/standup.js.map +1 -1
  422. package/dist/core/store.d.ts +16 -8
  423. package/dist/core/store.d.ts.map +1 -1
  424. package/dist/core/store.js +34 -0
  425. package/dist/core/store.js.map +1 -1
  426. package/dist/core/tournament.d.ts.map +1 -1
  427. package/dist/core/tournament.js +4 -3
  428. package/dist/core/tournament.js.map +1 -1
  429. package/dist/core/types.d.ts +9 -7
  430. package/dist/core/types.d.ts.map +1 -1
  431. package/dist/core/validation.d.ts +2 -1
  432. package/dist/core/validation.d.ts.map +1 -1
  433. package/dist/core/validation.js +2 -1
  434. package/dist/core/validation.js.map +1 -1
  435. package/dist/core/webhooks.d.ts +3 -2
  436. package/dist/core/webhooks.d.ts.map +1 -1
  437. package/dist/core/webhooks.js +9 -2
  438. package/dist/core/webhooks.js.map +1 -1
  439. package/dist/core/workflow-loader.d.ts.map +1 -1
  440. package/dist/core/workflow-loader.js +2 -1
  441. package/dist/core/workflow-loader.js.map +1 -1
  442. package/dist/mcp/index.d.ts +5 -1
  443. package/dist/mcp/index.d.ts.map +1 -1
  444. package/dist/mcp/index.js +97 -59
  445. package/dist/mcp/index.js.map +1 -1
  446. package/dist/mcp/index.test.js +14 -3
  447. package/dist/mcp/index.test.js.map +1 -1
  448. package/dist/mcp/registry.d.ts +1 -1
  449. package/dist/mcp/registry.d.ts.map +1 -1
  450. package/dist/mcp/registry.js +36 -28
  451. package/dist/mcp/registry.js.map +1 -1
  452. package/dist/store/index.d.ts +13 -11
  453. package/dist/store/index.d.ts.map +1 -1
  454. package/dist/store/index.js +217 -36
  455. package/dist/store/index.js.map +1 -1
  456. package/dist/store-pg/index.d.ts +18 -12
  457. package/dist/store-pg/index.d.ts.map +1 -1
  458. package/dist/store-pg/index.js +124 -38
  459. package/dist/store-pg/index.js.map +1 -1
  460. package/package.json +1 -1
  461. package/templates/codex/plugins/slope/.codex-plugin/plugin.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"review.js","sourceRoot":"","sources":["../../../src/cli/commands/review.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"review.js","sourceRoot":"","sources":["../../../src/cli/commands/review.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"roadmap.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/roadmap.ts"],"names":[],"mappings":"AAuqCA,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAwFlE"}
1
+ {"version":3,"file":"roadmap.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/roadmap.ts"],"names":[],"mappings":"AA4wCA,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAwFlE"}
@@ -1,6 +1,6 @@
1
1
  import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';
2
2
  import { dirname, join, relative, resolve } from 'node:path';
3
- import { parseRoadmap, validateRoadmap, castRoadmapStructure, findShippedSprintsOnMain, compareSprintIds, computeCriticalPath, findParallelOpportunities, formatSprintNumber, formatRoadmapSummary, formatStrategicContext, buildRoadmapFocus, formatRoadmapFocus, formatRoadmapSprintLabel, roadmapSprintOrderValue, isRoadmapSprintPending, loadScorecards, discoverScorecardFiles, sprintNumberFromScorecardFile, loadVision, parseSprintNumber, analyzeBacklog, mergeBacklogs, runAnalyzers, estimateComplexity, generateRoadmapFromVision, RoadmapGenerationError, normalizeDiagnosticPath, } from '../../core/index.js';
3
+ import { parseRoadmap, validateRoadmap, castRoadmapStructure, findShippedSprintsOnMain, computeCriticalPath, findParallelOpportunities, findRoadmapSprint, formatRoadmapSummary, formatStrategicContext, buildRoadmapFocus, formatRoadmapFocus, formatRoadmapSprintLabel, roadmapSprintKey, roadmapSprintKeyFromId, compareRoadmapSprintIds, isRoadmapSprintPending, loadScorecards, discoverScorecardFiles, sprintNumberFromScorecardFile, sprintIdKey, latestSprintIdKey, nextCanonicalSprintId, loadVision, analyzeBacklog, mergeBacklogs, runAnalyzers, estimateComplexity, generateRoadmapFromVision, RoadmapGenerationError, normalizeDiagnosticPath, } from '../../core/index.js';
4
4
  import { loadConfig } from '../config.js';
5
5
  import { buildRoadmapReality, formatRoadmapRealitySection, roadmapRealityIssues } from '../pre-sprint-reality.js';
6
6
  import { interviewCommand } from './interview.js';
@@ -23,20 +23,26 @@ const DEFAULT_UPCOMING_LIMIT = 3;
23
23
  function getRoadmapStatus(sprint) {
24
24
  return sprint.status;
25
25
  }
26
- function isTerminalRoadmapSprint(sprint, completedSprints) {
27
- return completedSprints.has(sprint.id) || TERMINAL_ROADMAP_STATUSES.has(getRoadmapStatus(sprint) ?? '');
26
+ function isTerminalRoadmapSprint(roadmap, sprint, completedSprints) {
27
+ return completedSprints.has(roadmapSprintKey(roadmap, sprint))
28
+ || TERMINAL_ROADMAP_STATUSES.has(getRoadmapStatus(sprint) ?? '');
28
29
  }
29
30
  function blockedByForSprint(roadmap, sprint, completedSprints) {
30
31
  return (sprint.depends_on ?? []).filter(dep => {
31
- const dependency = roadmap.sprints.find(s => s.id === dep);
32
- return dependency ? !isTerminalRoadmapSprint(dependency, completedSprints) : !completedSprints.has(dep);
33
- });
32
+ const dependency = findRoadmapSprint(roadmap, dep);
33
+ const key = roadmapSprintKeyFromId(roadmap, dep);
34
+ return dependency
35
+ ? !isTerminalRoadmapSprint(roadmap, dependency, completedSprints)
36
+ : key === null || !completedSprints.has(key);
37
+ }).map(dep => roadmapSprintKeyFromId(roadmap, dep) ?? String(dep));
34
38
  }
35
39
  function statusLabelForSprint(roadmap, sprint, currentSprint, completedSprints) {
36
40
  const explicitStatus = getRoadmapStatus(sprint);
37
- const isCompleted = completedSprints.has(sprint.id) || explicitStatus === 'complete';
41
+ const isCompleted = completedSprints.has(roadmapSprintKey(roadmap, sprint))
42
+ || explicitStatus === 'complete';
38
43
  const isSuperseded = explicitStatus === 'superseded';
39
- const isCurrent = sprint.id === currentSprint;
44
+ const isCurrent = roadmapSprintKey(roadmap, sprint)
45
+ === roadmapSprintKeyFromId(roadmap, currentSprint);
40
46
  const blockedBy = blockedByForSprint(roadmap, sprint, completedSprints);
41
47
  if (isSuperseded)
42
48
  return '\u21B7 superseded';
@@ -49,15 +55,21 @@ function statusLabelForSprint(roadmap, sprint, currentSprint, completedSprints)
49
55
  return '\u25CB pending';
50
56
  }
51
57
  function phaseForSprint(roadmap, sprintId) {
52
- return roadmap.phases.find(phase => phase.sprints?.includes(sprintId));
58
+ const key = roadmapSprintKeyFromId(roadmap, sprintId);
59
+ return roadmap.phases.find(phase => {
60
+ const ids = phase.sprint_keys ?? phase.sprints.map(String);
61
+ return ids.some(id => roadmapSprintKeyFromId(roadmap, id) === key);
62
+ });
53
63
  }
54
64
  function formatPhaseProgress(roadmap, phase, completedSprints) {
55
- const phaseSprints = roadmap.sprints.filter(s => phase.sprints.includes(s.id));
56
- const completed = phaseSprints.filter(s => isTerminalRoadmapSprint(s, completedSprints)).length;
65
+ const phaseKeys = new Set((phase.sprint_keys ?? phase.sprints.map(String))
66
+ .map(id => roadmapSprintKeyFromId(roadmap, id)));
67
+ const phaseSprints = roadmap.sprints.filter(sprint => phaseKeys.has(roadmapSprintKey(roadmap, sprint)));
68
+ const completed = phaseSprints.filter(sprint => isTerminalRoadmapSprint(roadmap, sprint, completedSprints)).length;
57
69
  return `${phase.name || 'Unnamed Phase'} (${completed}/${phaseSprints.length})`;
58
70
  }
59
71
  function sortedRoadmapSprints(roadmap) {
60
- return [...roadmap.sprints].sort((a, b) => compareSprintIds(a.id, b.id));
72
+ return [...roadmap.sprints].sort((a, b) => compareRoadmapSprintIds(roadmap, roadmapSprintKey(roadmap, a), roadmapSprintKey(roadmap, b)));
61
73
  }
62
74
  function resolveRoadmapPath(flags, cwd) {
63
75
  if (flags.path)
@@ -104,35 +116,36 @@ function loadRoadmapFile(flags, cwd) {
104
116
  }
105
117
  function resolveSprint(flags, cwd, roadmap, scorecards = []) {
106
118
  if (flags.sprint) {
107
- const parsed = parseSprintNumber(flags.sprint);
119
+ const parsed = sprintIdKey(flags.sprint);
108
120
  if (parsed == null) {
109
121
  console.error(`\nInvalid sprint number: ${flags.sprint}\n`);
110
122
  process.exit(1);
111
123
  }
112
- return parsed;
124
+ return roadmap ? roadmapSprintKeyFromId(roadmap, parsed) ?? parsed : parsed;
113
125
  }
114
- const completedSprints = new Set(scorecards.map(s => s.sprint_number));
126
+ const completedSprints = new Set(scorecards
127
+ .map(s => roadmap ? roadmapSprintKeyFromId(roadmap, s.sprint_number) : String(s.sprint_number))
128
+ .filter((key) => key !== null));
115
129
  const roadmapCurrent = resolveRoadmapCurrentSprint(roadmap, completedSprints);
116
130
  if (roadmapCurrent != null)
117
131
  return roadmapCurrent;
118
132
  const config = loadConfig(cwd);
119
- if (config.currentSprint && config.currentSprint > 0)
120
- return config.currentSprint;
121
- if (scorecards.length === 0)
122
- return 1;
123
- const sprintNumbers = scorecards.map(s => s.sprint_number).filter(n => typeof n === 'number' && n > 0);
124
- if (sprintNumbers.length === 0)
125
- return 1;
126
- return Math.max(...sprintNumbers) + 1;
133
+ const configured = config.currentSprint == null ? null : sprintIdKey(config.currentSprint);
134
+ if (configured != null) {
135
+ return roadmap ? roadmapSprintKeyFromId(roadmap, configured) ?? configured : configured;
136
+ }
137
+ const latest = latestSprintIdKey(scorecards.map(s => s.sprint_number), '');
138
+ return latest ? nextCanonicalSprintId(latest) : '1';
127
139
  }
128
140
  function resolveRoadmapCurrentSprint(roadmap, completedSprints) {
129
141
  const candidates = roadmap?.sprints
130
- .filter(sprint => isRoadmapSprintPending(sprint) && !completedSprints.has(sprint.id))
131
- .sort((a, b) => compareSprintIds(a.id, b.id)) ?? [];
142
+ .filter(sprint => isRoadmapSprintPending(sprint)
143
+ && !completedSprints.has(roadmapSprintKey(roadmap, sprint)))
144
+ .sort((a, b) => compareRoadmapSprintIds(roadmap, roadmapSprintKey(roadmap, a), roadmapSprintKey(roadmap, b))) ?? [];
132
145
  if (candidates.length === 0)
133
146
  return null;
134
147
  const active = candidates.find(sprint => getRoadmapStatus(sprint) === 'active');
135
- return (active ?? candidates[0]).id;
148
+ return roadmapSprintKey(roadmap, active ?? candidates[0]);
136
149
  }
137
150
  // --- Subcommands ---
138
151
  function validateSubcommand(flags, cwd) {
@@ -221,11 +234,12 @@ function reviewSubcommand(flags, cwd) {
221
234
  // Flag outliers
222
235
  for (const sprint of roadmap.sprints) {
223
236
  const ticketCount = sprint.tickets?.length ?? 0;
237
+ const sprintLabel = formatRoadmapSprintLabel(roadmap, roadmapSprintKey(roadmap, sprint));
224
238
  if (ticketCount > 4) {
225
- console.log(` \u26A0 S${sprint.id} has ${ticketCount} tickets (over recommended 4)`);
239
+ console.log(` \u26A0 ${sprintLabel} has ${ticketCount} tickets (over recommended 4)`);
226
240
  }
227
241
  if (ticketCount < 3) {
228
- console.log(` \u26A0 S${sprint.id} has ${ticketCount} tickets (under recommended 3)`);
242
+ console.log(` \u26A0 ${sprintLabel} has ${ticketCount} tickets (under recommended 3)`);
229
243
  }
230
244
  }
231
245
  // Club distribution
@@ -250,9 +264,9 @@ function reviewSubcommand(flags, cwd) {
250
264
  // Identify bottlenecks (sprints on critical path with many dependents)
251
265
  const criticalSet = new Set(criticalPath.path);
252
266
  for (const id of criticalPath.path) {
253
- const dependents = roadmap.sprints.filter(s => s.depends_on?.includes(id));
267
+ const dependents = roadmap.sprints.filter(s => s.depends_on?.some(dep => roadmapSprintKeyFromId(roadmap, dep) === id));
254
268
  if (dependents.length > 1) {
255
- console.log(` \u26A0 S${id} is a bottleneck — ${dependents.length} sprints depend on it`);
269
+ console.log(` \u26A0 ${formatRoadmapSprintLabel(roadmap, id)} is a bottleneck — ${dependents.length} sprints depend on it`);
256
270
  }
257
271
  }
258
272
  // 4. Parallel opportunities
@@ -271,9 +285,10 @@ function reviewSubcommand(flags, cwd) {
271
285
  console.log('\n## Dependency Analysis');
272
286
  for (const sprint of roadmap.sprints) {
273
287
  const fanIn = sprint.depends_on?.length ?? 0;
274
- const fanOut = roadmap.sprints.filter(s => s.depends_on?.includes(sprint.id)).length;
288
+ const sprintKey = roadmapSprintKey(roadmap, sprint);
289
+ const fanOut = roadmap.sprints.filter(s => s.depends_on?.some(dep => roadmapSprintKeyFromId(roadmap, dep) === sprintKey)).length;
275
290
  if (fanIn > 2 || fanOut > 2) {
276
- console.log(` S${sprint.id}: fan-in=${fanIn} fan-out=${fanOut}${fanIn > 2 ? ' (high fan-in)' : ''}${fanOut > 2 ? ' (high fan-out)' : ''}`);
291
+ console.log(` ${formatRoadmapSprintLabel(roadmap, sprintKey)}: fan-in=${fanIn} fan-out=${fanOut}${fanIn > 2 ? ' (high fan-in)' : ''}${fanOut > 2 ? ' (high fan-out)' : ''}`);
277
292
  }
278
293
  }
279
294
  // Summary verdict
@@ -296,7 +311,9 @@ function statusSubcommand(flags, cwd) {
296
311
  const config = loadConfig(cwd);
297
312
  const scorecards = loadScorecards(config, cwd);
298
313
  const currentSprint = resolveSprint(flags, cwd, roadmap, scorecards);
299
- const completedSprints = new Set(scorecards.map(s => s.sprint_number));
314
+ const completedSprints = new Set(scorecards
315
+ .map(s => roadmapSprintKeyFromId(roadmap, s.sprint_number))
316
+ .filter((key) => key !== null));
300
317
  if (flags.full === 'true' || flags.history === 'true') {
301
318
  printFullRoadmapStatus(roadmap, currentSprint, completedSprints);
302
319
  }
@@ -317,37 +334,39 @@ function displayPath(cwd, path) {
317
334
  * and mark the projection as generated and read-only (GH #636).
318
335
  */
319
336
  function roadmapSourceEvidence(cwd, flags, sprintId) {
337
+ const inputKey = sprintIdKey(sprintId) ?? String(sprintId);
320
338
  const projection = {
321
339
  kind: 'roadmap',
322
340
  label: 'Roadmap source',
323
341
  ref: displayPath(cwd, resolveRoadmapPath(flags, cwd)),
324
- sprint: sprintId,
342
+ sprint: inputKey,
325
343
  };
326
344
  // An explicit --path overrides federation: report exactly what was read.
327
345
  if (flags.path || !hasModularRoadmapSources(cwd))
328
346
  return [projection];
329
347
  try {
330
348
  const store = loadRoadmapSourceStore(cwd);
331
- const owner = store.sources.find(source => source.document.sprints.some(sprint => sprint.id === sprintId));
349
+ const canonicalKey = roadmapSprintKeyFromId(store.roadmap, sprintId) ?? inputKey;
350
+ const owner = store.sources.find(source => source.document.sprints.some(sprint => roadmapSprintKey(store.roadmap, sprint) === canonicalKey));
332
351
  const evidence = [{
333
352
  kind: 'roadmap',
334
353
  label: 'Roadmap source (canonical manifest)',
335
354
  ref: displayPath(cwd, store.manifestPath),
336
- sprint: sprintId,
355
+ sprint: canonicalKey,
337
356
  }];
338
357
  if (owner?.absolutePath) {
339
358
  evidence.push({
340
359
  kind: 'roadmap',
341
360
  label: `Owning source bundle (${owner.entry.kind})`,
342
361
  ref: displayPath(cwd, owner.absolutePath),
343
- sprint: sprintId,
362
+ sprint: canonicalKey,
344
363
  });
345
364
  }
346
365
  evidence.push({
347
366
  kind: 'roadmap',
348
367
  label: 'Compatibility projection (generated, read-only)',
349
368
  ref: displayPath(cwd, store.outputPath),
350
- sprint: sprintId,
369
+ sprint: canonicalKey,
351
370
  });
352
371
  return evidence;
353
372
  }
@@ -359,21 +378,31 @@ function roadmapSourceEvidence(cwd, flags, sprintId) {
359
378
  function focusEvidence(roadmap, sprintId, flags, cwd) {
360
379
  const config = loadConfig(cwd);
361
380
  const evidence = roadmapSourceEvidence(cwd, flags, sprintId);
362
- const selected = roadmap.sprints.find(sprint => sprint.id === sprintId);
363
- const phase = roadmap.phases.find(candidate => candidate.sprints.includes(sprintId));
364
- const phaseIndex = phase?.sprints.indexOf(sprintId) ?? -1;
365
- const contextIds = new Set([
366
- sprintId,
367
- ...(selected?.depends_on ?? []),
368
- ...(phaseIndex < 0 ? [] : phase.sprints.slice(Math.max(0, phaseIndex - 2), phaseIndex)),
381
+ const selected = findRoadmapSprint(roadmap, sprintId);
382
+ if (!selected)
383
+ return evidence;
384
+ const selectedKey = roadmapSprintKey(roadmap, selected);
385
+ const phase = roadmap.phases.find(candidate => {
386
+ const keys = candidate.sprint_keys ?? candidate.sprints;
387
+ return keys.some(id => roadmapSprintKeyFromId(roadmap, id) === selectedKey);
388
+ });
389
+ const phaseKeys = (phase?.sprint_keys ?? phase?.sprints ?? [])
390
+ .map(id => roadmapSprintKeyFromId(roadmap, id))
391
+ .filter((id) => id !== null);
392
+ const phaseIndex = phaseKeys.indexOf(selectedKey);
393
+ const contextKeys = new Set([
394
+ selectedKey,
395
+ ...(selected.depends_on ?? [])
396
+ .map(id => roadmapSprintKeyFromId(roadmap, id))
397
+ .filter((id) => id !== null),
398
+ ...(phaseIndex < 0 ? [] : phaseKeys.slice(Math.max(0, phaseIndex - 2), phaseIndex)),
369
399
  ]);
370
- const contextByValue = new Map([...contextIds].map(id => [roadmapSprintOrderValue(roadmap, id), id]));
371
400
  for (const path of discoverScorecardFiles(config, cwd)) {
372
401
  const scorecardSprint = sprintNumberFromScorecardFile(path, config);
373
402
  if (scorecardSprint == null)
374
403
  continue;
375
- const roadmapSprintId = contextByValue.get(roadmapSprintOrderValue(roadmap, scorecardSprint));
376
- if (roadmapSprintId == null)
404
+ const roadmapSprintId = roadmapSprintKeyFromId(roadmap, scorecardSprint);
405
+ if (roadmapSprintId == null || !contextKeys.has(roadmapSprintId))
377
406
  continue;
378
407
  evidence.push({
379
408
  kind: 'scorecard',
@@ -402,7 +431,7 @@ function focusSubcommand(flags, cwd) {
402
431
  process.exit(1);
403
432
  return;
404
433
  }
405
- const sprintId = parseSprintNumber(flags.sprint);
434
+ const sprintId = sprintIdKey(flags.sprint);
406
435
  if (sprintId == null) {
407
436
  console.error(`\nInvalid sprint number: ${flags.sprint || '(empty)'}`);
408
437
  console.error('Usage: slope roadmap focus --sprint=N [--path=<file>] [--json]\n');
@@ -414,25 +443,32 @@ function focusSubcommand(flags, cwd) {
414
443
  process.exit(1);
415
444
  return;
416
445
  }
446
+ const selected = findRoadmapSprint(roadmap, sprintId);
447
+ if (!selected) {
448
+ console.error(`\nSprint ${formatRoadmapSprintLabel(roadmap, sprintId)} was not found in the roadmap.\n`);
449
+ process.exit(1);
450
+ return;
451
+ }
452
+ const selectedKey = roadmapSprintKey(roadmap, selected);
417
453
  const config = loadConfig(cwd);
418
454
  const scorecards = loadScorecards(config, cwd);
419
455
  const completedSprintIds = scorecards.map(card => card.sprint_number);
420
- const hazards = roadmapRealityIssues(buildRoadmapReality(cwd, roadmap), sprintId)
456
+ const hazards = roadmapRealityIssues(buildRoadmapReality(cwd, roadmap), selectedKey)
421
457
  .map(issue => ({
422
- sprint: sprintId,
423
- sprint_label: formatRoadmapSprintLabel(roadmap, sprintId),
458
+ sprint: selectedKey,
459
+ sprint_label: formatRoadmapSprintLabel(roadmap, selectedKey),
424
460
  type: 'roadmap_reality',
425
461
  severity: issue.type === 'error' ? 'major' : 'minor',
426
462
  description: issue.message,
427
463
  }));
428
- const focus = buildRoadmapFocus(roadmap, sprintId, {
464
+ const focus = buildRoadmapFocus(roadmap, selectedKey, {
429
465
  completedSprintIds,
430
466
  hazards,
431
467
  scorecards,
432
- evidence: focusEvidence(roadmap, sprintId, flags, cwd),
468
+ evidence: focusEvidence(roadmap, selectedKey, flags, cwd),
433
469
  });
434
470
  if (!focus) {
435
- console.error(`\nSprint ${formatRoadmapSprintLabel(roadmap, sprintId)} was not found in the roadmap.\n`);
471
+ console.error(`\nSprint ${formatRoadmapSprintLabel(roadmap, selectedKey)} was not found in the roadmap.\n`);
436
472
  process.exit(1);
437
473
  return;
438
474
  }
@@ -485,7 +521,7 @@ function completeSourcesSubcommand(flags, cwd) {
485
521
  process.exit(1);
486
522
  return;
487
523
  }
488
- const sprint = parseSprintNumber(flags.sprint);
524
+ const sprint = sprintIdKey(flags.sprint);
489
525
  if (sprint == null) {
490
526
  console.error(`\nInvalid sprint number: ${flags.sprint || '(empty)'}`);
491
527
  console.error('Usage: slope roadmap complete --sprint=N [--source=<file>] [--scorecard=<path>] [--dry-run]\n');
@@ -510,7 +546,7 @@ function completeSourcesSubcommand(flags, cwd) {
510
546
  dryRun: flags['dry-run'] === 'true',
511
547
  force: true,
512
548
  });
513
- const label = `S${formatSprintNumber(sprint)}`;
549
+ const label = `S${sprint}`;
514
550
  if (flags['dry-run'] === 'true') {
515
551
  console.log(`\nRoadmap complete dry run: ${label} in ${result.source}`);
516
552
  console.log(` Would change source: ${result.changed ? 'yes' : 'no'}`);
@@ -671,14 +707,16 @@ function archiveSourcesSubcommand(flags, cwd) {
671
707
  process.exit(1);
672
708
  return;
673
709
  }
674
- const through = parseSprintNumber(flags.through);
675
- if (through == null) {
710
+ const requestedThrough = sprintIdKey(flags.through);
711
+ if (requestedThrough == null) {
676
712
  console.error(`\nInvalid archive boundary: ${flags.through || '(empty)'}\n`);
677
713
  process.exit(1);
678
714
  return;
679
715
  }
680
716
  try {
681
717
  const store = loadRoadmapSourceStore(cwd, flags.source);
718
+ const through = roadmapSprintKeyFromId(store.roadmap, requestedThrough) ?? requestedThrough;
719
+ assertCanonicalArchiveBoundary(store, through);
682
720
  const projectionBefore = existsSync(store.outputPath) ? readFileSync(store.outputPath, 'utf8') : null;
683
721
  const plan = planRoadmapSourceArchive(store, through);
684
722
  console.log(`\nRoadmap archive through Sprint ${through}:`);
@@ -705,6 +743,19 @@ function archiveSourcesSubcommand(flags, cwd) {
705
743
  process.exit(1);
706
744
  }
707
745
  }
746
+ function assertCanonicalArchiveBoundary(store, through) {
747
+ for (const source of store.sources) {
748
+ if (source.entry.kind !== 'phase')
749
+ continue;
750
+ const sprintIds = source.document.phase.sprint_keys
751
+ ?? source.document.phase.sprints;
752
+ const comparisons = sprintIds
753
+ .map(id => compareRoadmapSprintIds(store.roadmap, id, through));
754
+ if (comparisons.some(value => value <= 0) && comparisons.some(value => value > 0)) {
755
+ throw new Error(`--through would split phase "${source.document.phase.name}"; archive whole phases only`);
756
+ }
757
+ }
758
+ }
708
759
  function printFullRoadmapStatus(roadmap, currentSprint, completedSprints) {
709
760
  console.log(`\n# Roadmap Status — ${roadmap.name}`);
710
761
  console.log('\u2550'.repeat(40));
@@ -717,18 +768,25 @@ function printFullRoadmapStatus(roadmap, currentSprint, completedSprints) {
717
768
  console.log('');
718
769
  continue;
719
770
  }
720
- const phaseSprints = roadmap.sprints.filter(s => phase.sprints.includes(s.id));
721
- const completed = phaseSprints.filter(s => isTerminalRoadmapSprint(s, completedSprints)).length;
771
+ const phaseKeys = new Set((phase.sprint_keys ?? phase.sprints.map(String))
772
+ .map(id => roadmapSprintKeyFromId(roadmap, id)));
773
+ const phaseSprints = roadmap.sprints.filter(sprint => phaseKeys.has(roadmapSprintKey(roadmap, sprint)));
774
+ const completed = phaseSprints.filter(sprint => isTerminalRoadmapSprint(roadmap, sprint, completedSprints)).length;
722
775
  console.log(`## ${phase.name || 'Unnamed Phase'} (${completed}/${phaseSprints.length})`);
723
776
  for (const sprint of phaseSprints) {
724
777
  const explicitStatus = getRoadmapStatus(sprint);
725
- const isCompleted = completedSprints.has(sprint.id) || explicitStatus === 'complete';
778
+ const isCompleted = completedSprints.has(roadmapSprintKey(roadmap, sprint))
779
+ || explicitStatus === 'complete';
726
780
  const isSuperseded = explicitStatus === 'superseded';
727
- const isCurrent = sprint.id === currentSprint;
781
+ const isCurrent = roadmapSprintKey(roadmap, sprint)
782
+ === roadmapSprintKeyFromId(roadmap, currentSprint);
728
783
  // Check if blocked: all dependencies must be completed
729
784
  const blockedBy = (sprint.depends_on ?? []).filter(dep => {
730
- const dependency = roadmap.sprints.find(s => s.id === dep);
731
- return dependency ? !isTerminalRoadmapSprint(dependency, completedSprints) : !completedSprints.has(dep);
785
+ const dependency = findRoadmapSprint(roadmap, dep);
786
+ const key = roadmapSprintKeyFromId(roadmap, dep);
787
+ return dependency
788
+ ? !isTerminalRoadmapSprint(roadmap, dependency, completedSprints)
789
+ : key === null || !completedSprints.has(key);
732
790
  });
733
791
  const isBlocked = !isCompleted && !isSuperseded && blockedBy.length > 0;
734
792
  let status;
@@ -748,7 +806,7 @@ function printFullRoadmapStatus(roadmap, currentSprint, completedSprints) {
748
806
  status = '\u25CB pending';
749
807
  }
750
808
  const theme = sprint.theme || 'Untitled Sprint';
751
- console.log(` ${formatRoadmapSprintLabel(roadmap, sprint.id)} ${theme.padEnd(30)} ${status}`);
809
+ console.log(` ${formatRoadmapSprintLabel(roadmap, roadmapSprintKey(roadmap, sprint))} ${theme.padEnd(30)} ${status}`);
752
810
  }
753
811
  console.log('');
754
812
  }
@@ -761,14 +819,16 @@ function printFullRoadmapStatus(roadmap, currentSprint, completedSprints) {
761
819
  }
762
820
  }
763
821
  function printCompactRoadmapStatus(roadmap, currentSprint, completedSprints, cwd) {
764
- const current = roadmap.sprints.find(s => s.id === currentSprint);
822
+ const current = findRoadmapSprint(roadmap, currentSprint);
765
823
  const currentLabel = current
766
- ? `${formatRoadmapSprintLabel(roadmap, current.id)} ${current.theme || 'Untitled Sprint'}`
824
+ ? `${formatRoadmapSprintLabel(roadmap, roadmapSprintKey(roadmap, current))} ${current.theme || 'Untitled Sprint'}`
767
825
  : `${formatRoadmapSprintLabel(roadmap, currentSprint)} (not found in roadmap)`;
768
826
  const currentIsPending = current ? isRoadmapSprintPending(current) : false;
769
827
  const currentPhase = phaseForSprint(roadmap, currentSprint);
770
828
  const pendingAfterCurrent = sortedRoadmapSprints(roadmap)
771
- .filter(s => isRoadmapSprintPending(s) && s.id !== currentSprint && compareSprintIds(s.id, currentSprint) > 0);
829
+ .filter(s => isRoadmapSprintPending(s)
830
+ && roadmapSprintKey(roadmap, s) !== roadmapSprintKeyFromId(roadmap, currentSprint)
831
+ && compareRoadmapSprintIds(roadmap, roadmapSprintKey(roadmap, s), currentSprint) > 0);
772
832
  const nextReady = pendingAfterCurrent.find(s => blockedByForSprint(roadmap, s, completedSprints).length === 0);
773
833
  const upcoming = pendingAfterCurrent.slice(0, DEFAULT_UPCOMING_LIMIT);
774
834
  const realityLines = formatRoadmapRealitySection(buildRoadmapReality(cwd, roadmap), undefined, 5).slice(1);
@@ -790,10 +850,10 @@ function printCompactRoadmapStatus(roadmap, currentSprint, completedSprints, cwd
790
850
  console.log(` ${formatRoadmapSprintLabel(roadmap, currentSprint)} is not defined in the roadmap.`);
791
851
  }
792
852
  else {
793
- console.log(` ${formatRoadmapSprintLabel(roadmap, current.id)} ${current.theme || 'Untitled Sprint'} - ${statusLabelForSprint(roadmap, current, currentSprint, completedSprints)}`);
853
+ console.log(` ${formatRoadmapSprintLabel(roadmap, roadmapSprintKey(roadmap, current))} ${current.theme || 'Untitled Sprint'} - ${statusLabelForSprint(roadmap, current, currentSprint, completedSprints)}`);
794
854
  if ((current.depends_on ?? []).length > 0) {
795
855
  const deps = current.depends_on.map(dep => {
796
- const sprint = roadmap.sprints.find(s => s.id === dep);
856
+ const sprint = findRoadmapSprint(roadmap, dep);
797
857
  if (!sprint)
798
858
  return `${formatRoadmapSprintLabel(roadmap, dep)} missing`;
799
859
  return `${formatRoadmapSprintLabel(roadmap, dep)} ${statusLabelForSprint(roadmap, sprint, currentSprint, completedSprints).replace(/^[^\w]+ /, '')}`;
@@ -806,7 +866,7 @@ function printCompactRoadmapStatus(roadmap, currentSprint, completedSprints, cwd
806
866
  }
807
867
  console.log('\nNext ready:');
808
868
  if (nextReady) {
809
- console.log(` ${formatRoadmapSprintLabel(roadmap, nextReady.id)} ${nextReady.theme || 'Untitled Sprint'} - ${statusLabelForSprint(roadmap, nextReady, currentSprint, completedSprints)}`);
869
+ console.log(` ${formatRoadmapSprintLabel(roadmap, roadmapSprintKey(roadmap, nextReady))} ${nextReady.theme || 'Untitled Sprint'} - ${statusLabelForSprint(roadmap, nextReady, currentSprint, completedSprints)}`);
810
870
  }
811
871
  else {
812
872
  console.log(' None yet');
@@ -817,7 +877,7 @@ function printCompactRoadmapStatus(roadmap, currentSprint, completedSprints, cwd
817
877
  }
818
878
  else {
819
879
  for (const sprint of upcoming) {
820
- console.log(` ${formatRoadmapSprintLabel(roadmap, sprint.id)} ${sprint.theme || 'Untitled Sprint'} - ${statusLabelForSprint(roadmap, sprint, currentSprint, completedSprints)}`);
880
+ console.log(` ${formatRoadmapSprintLabel(roadmap, roadmapSprintKey(roadmap, sprint))} ${sprint.theme || 'Untitled Sprint'} - ${statusLabelForSprint(roadmap, sprint, currentSprint, completedSprints)}`);
821
881
  }
822
882
  }
823
883
  console.log('\nRecommended next action:');
@@ -829,7 +889,7 @@ function printCompactRoadmapStatus(roadmap, currentSprint, completedSprints, cwd
829
889
  console.log(` Work ${first.key}: ${first.title}`);
830
890
  }
831
891
  else if (nextReady) {
832
- console.log(` Start ${formatRoadmapSprintLabel(roadmap, nextReady.id)}: ${nextReady.theme || 'Untitled Sprint'}`);
892
+ console.log(` Start ${formatRoadmapSprintLabel(roadmap, roadmapSprintKey(roadmap, nextReady))}: ${nextReady.theme || 'Untitled Sprint'}`);
833
893
  }
834
894
  else {
835
895
  console.log(' No roadmap action is currently ready.');
@@ -865,7 +925,8 @@ function scorecardToSprint(card) {
865
925
  complexity: CLUB_TO_COMPLEXITY[shot.club] ?? 'standard',
866
926
  }));
867
927
  return {
868
- id: card.sprint_number,
928
+ id: Number(card.sprint_number),
929
+ id_key: card.sprint_number,
869
930
  theme: card.theme,
870
931
  par: card.par,
871
932
  slope: card.slope,
@@ -928,7 +989,7 @@ function syncSubcommand(flags, cwd) {
928
989
  process.exit(1);
929
990
  return; // unreachable but satisfies TS
930
991
  }
931
- const existingById = new Map(roadmap.sprints.map(s => [s.id, s]));
992
+ const existingById = new Map(roadmap.sprints.map(s => [roadmapSprintKey(roadmap, s), s]));
932
993
  let updated = 0;
933
994
  let added = 0;
934
995
  for (const card of scorecards) {
@@ -952,8 +1013,7 @@ function syncSubcommand(flags, cwd) {
952
1013
  added++;
953
1014
  }
954
1015
  }
955
- // Sort sprints by id
956
- roadmap.sprints.sort((a, b) => a.id - b.id);
1016
+ roadmap.sprints.sort((a, b) => compareRoadmapSprintIds(roadmap, roadmapSprintKey(roadmap, a), roadmapSprintKey(roadmap, b)));
957
1017
  // Build output
958
1018
  const output = JSON.stringify(roadmap, null, 2) + '\n';
959
1019
  console.log(`\nRoadmap sync: ${path}`);