@slope-dev/slope 1.64.0 → 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 +144 -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 +13 -1
  129. package/dist/cli/commands/validate.d.ts.map +1 -1
  130. package/dist/cli/commands/validate.js +47 -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 +15 -4
  243. package/dist/cli/roadmap-source-store.d.ts.map +1 -1
  244. package/dist/cli/roadmap-source-store.js +79 -33
  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 +35 -17
  408. package/dist/core/roadmap.d.ts.map +1 -1
  409. package/dist/core/roadmap.js +167 -86
  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":"AAiqCA,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');
@@ -499,12 +535,18 @@ function completeSourcesSubcommand(flags, cwd) {
499
535
  .find(file => sprintNumberFromScorecardFile(file, config) === sprint);
500
536
  const scorecardPath = scorecard ? displayPath(cwd, scorecard) : undefined;
501
537
  try {
538
+ // `slope roadmap complete` is the explicit operator override — the escape
539
+ // hatch validate points at when it refuses to auto-promote a deliberate
540
+ // status (absorbed/blocked/deferred/...). Force the completion so the
541
+ // command still works on those statuses; the automatic validate path stays
542
+ // safe because it does not force (GH #660).
502
543
  const result = completeRoadmapSourceSprint(cwd, sprint, {
503
544
  sourceFlag: flags.source,
504
545
  scorecardPath,
505
546
  dryRun: flags['dry-run'] === 'true',
547
+ force: true,
506
548
  });
507
- const label = `S${formatSprintNumber(sprint)}`;
549
+ const label = `S${sprint}`;
508
550
  if (flags['dry-run'] === 'true') {
509
551
  console.log(`\nRoadmap complete dry run: ${label} in ${result.source}`);
510
552
  console.log(` Would change source: ${result.changed ? 'yes' : 'no'}`);
@@ -665,14 +707,16 @@ function archiveSourcesSubcommand(flags, cwd) {
665
707
  process.exit(1);
666
708
  return;
667
709
  }
668
- const through = parseSprintNumber(flags.through);
669
- if (through == null) {
710
+ const requestedThrough = sprintIdKey(flags.through);
711
+ if (requestedThrough == null) {
670
712
  console.error(`\nInvalid archive boundary: ${flags.through || '(empty)'}\n`);
671
713
  process.exit(1);
672
714
  return;
673
715
  }
674
716
  try {
675
717
  const store = loadRoadmapSourceStore(cwd, flags.source);
718
+ const through = roadmapSprintKeyFromId(store.roadmap, requestedThrough) ?? requestedThrough;
719
+ assertCanonicalArchiveBoundary(store, through);
676
720
  const projectionBefore = existsSync(store.outputPath) ? readFileSync(store.outputPath, 'utf8') : null;
677
721
  const plan = planRoadmapSourceArchive(store, through);
678
722
  console.log(`\nRoadmap archive through Sprint ${through}:`);
@@ -699,6 +743,19 @@ function archiveSourcesSubcommand(flags, cwd) {
699
743
  process.exit(1);
700
744
  }
701
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
+ }
702
759
  function printFullRoadmapStatus(roadmap, currentSprint, completedSprints) {
703
760
  console.log(`\n# Roadmap Status — ${roadmap.name}`);
704
761
  console.log('\u2550'.repeat(40));
@@ -711,18 +768,25 @@ function printFullRoadmapStatus(roadmap, currentSprint, completedSprints) {
711
768
  console.log('');
712
769
  continue;
713
770
  }
714
- const phaseSprints = roadmap.sprints.filter(s => phase.sprints.includes(s.id));
715
- 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;
716
775
  console.log(`## ${phase.name || 'Unnamed Phase'} (${completed}/${phaseSprints.length})`);
717
776
  for (const sprint of phaseSprints) {
718
777
  const explicitStatus = getRoadmapStatus(sprint);
719
- const isCompleted = completedSprints.has(sprint.id) || explicitStatus === 'complete';
778
+ const isCompleted = completedSprints.has(roadmapSprintKey(roadmap, sprint))
779
+ || explicitStatus === 'complete';
720
780
  const isSuperseded = explicitStatus === 'superseded';
721
- const isCurrent = sprint.id === currentSprint;
781
+ const isCurrent = roadmapSprintKey(roadmap, sprint)
782
+ === roadmapSprintKeyFromId(roadmap, currentSprint);
722
783
  // Check if blocked: all dependencies must be completed
723
784
  const blockedBy = (sprint.depends_on ?? []).filter(dep => {
724
- const dependency = roadmap.sprints.find(s => s.id === dep);
725
- 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);
726
790
  });
727
791
  const isBlocked = !isCompleted && !isSuperseded && blockedBy.length > 0;
728
792
  let status;
@@ -742,7 +806,7 @@ function printFullRoadmapStatus(roadmap, currentSprint, completedSprints) {
742
806
  status = '\u25CB pending';
743
807
  }
744
808
  const theme = sprint.theme || 'Untitled Sprint';
745
- console.log(` ${formatRoadmapSprintLabel(roadmap, sprint.id)} ${theme.padEnd(30)} ${status}`);
809
+ console.log(` ${formatRoadmapSprintLabel(roadmap, roadmapSprintKey(roadmap, sprint))} ${theme.padEnd(30)} ${status}`);
746
810
  }
747
811
  console.log('');
748
812
  }
@@ -755,14 +819,16 @@ function printFullRoadmapStatus(roadmap, currentSprint, completedSprints) {
755
819
  }
756
820
  }
757
821
  function printCompactRoadmapStatus(roadmap, currentSprint, completedSprints, cwd) {
758
- const current = roadmap.sprints.find(s => s.id === currentSprint);
822
+ const current = findRoadmapSprint(roadmap, currentSprint);
759
823
  const currentLabel = current
760
- ? `${formatRoadmapSprintLabel(roadmap, current.id)} ${current.theme || 'Untitled Sprint'}`
824
+ ? `${formatRoadmapSprintLabel(roadmap, roadmapSprintKey(roadmap, current))} ${current.theme || 'Untitled Sprint'}`
761
825
  : `${formatRoadmapSprintLabel(roadmap, currentSprint)} (not found in roadmap)`;
762
826
  const currentIsPending = current ? isRoadmapSprintPending(current) : false;
763
827
  const currentPhase = phaseForSprint(roadmap, currentSprint);
764
828
  const pendingAfterCurrent = sortedRoadmapSprints(roadmap)
765
- .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);
766
832
  const nextReady = pendingAfterCurrent.find(s => blockedByForSprint(roadmap, s, completedSprints).length === 0);
767
833
  const upcoming = pendingAfterCurrent.slice(0, DEFAULT_UPCOMING_LIMIT);
768
834
  const realityLines = formatRoadmapRealitySection(buildRoadmapReality(cwd, roadmap), undefined, 5).slice(1);
@@ -784,10 +850,10 @@ function printCompactRoadmapStatus(roadmap, currentSprint, completedSprints, cwd
784
850
  console.log(` ${formatRoadmapSprintLabel(roadmap, currentSprint)} is not defined in the roadmap.`);
785
851
  }
786
852
  else {
787
- 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)}`);
788
854
  if ((current.depends_on ?? []).length > 0) {
789
855
  const deps = current.depends_on.map(dep => {
790
- const sprint = roadmap.sprints.find(s => s.id === dep);
856
+ const sprint = findRoadmapSprint(roadmap, dep);
791
857
  if (!sprint)
792
858
  return `${formatRoadmapSprintLabel(roadmap, dep)} missing`;
793
859
  return `${formatRoadmapSprintLabel(roadmap, dep)} ${statusLabelForSprint(roadmap, sprint, currentSprint, completedSprints).replace(/^[^\w]+ /, '')}`;
@@ -800,7 +866,7 @@ function printCompactRoadmapStatus(roadmap, currentSprint, completedSprints, cwd
800
866
  }
801
867
  console.log('\nNext ready:');
802
868
  if (nextReady) {
803
- 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)}`);
804
870
  }
805
871
  else {
806
872
  console.log(' None yet');
@@ -811,7 +877,7 @@ function printCompactRoadmapStatus(roadmap, currentSprint, completedSprints, cwd
811
877
  }
812
878
  else {
813
879
  for (const sprint of upcoming) {
814
- 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)}`);
815
881
  }
816
882
  }
817
883
  console.log('\nRecommended next action:');
@@ -823,7 +889,7 @@ function printCompactRoadmapStatus(roadmap, currentSprint, completedSprints, cwd
823
889
  console.log(` Work ${first.key}: ${first.title}`);
824
890
  }
825
891
  else if (nextReady) {
826
- console.log(` Start ${formatRoadmapSprintLabel(roadmap, nextReady.id)}: ${nextReady.theme || 'Untitled Sprint'}`);
892
+ console.log(` Start ${formatRoadmapSprintLabel(roadmap, roadmapSprintKey(roadmap, nextReady))}: ${nextReady.theme || 'Untitled Sprint'}`);
827
893
  }
828
894
  else {
829
895
  console.log(' No roadmap action is currently ready.');
@@ -859,7 +925,8 @@ function scorecardToSprint(card) {
859
925
  complexity: CLUB_TO_COMPLEXITY[shot.club] ?? 'standard',
860
926
  }));
861
927
  return {
862
- id: card.sprint_number,
928
+ id: Number(card.sprint_number),
929
+ id_key: card.sprint_number,
863
930
  theme: card.theme,
864
931
  par: card.par,
865
932
  slope: card.slope,
@@ -922,7 +989,7 @@ function syncSubcommand(flags, cwd) {
922
989
  process.exit(1);
923
990
  return; // unreachable but satisfies TS
924
991
  }
925
- const existingById = new Map(roadmap.sprints.map(s => [s.id, s]));
992
+ const existingById = new Map(roadmap.sprints.map(s => [roadmapSprintKey(roadmap, s), s]));
926
993
  let updated = 0;
927
994
  let added = 0;
928
995
  for (const card of scorecards) {
@@ -946,8 +1013,7 @@ function syncSubcommand(flags, cwd) {
946
1013
  added++;
947
1014
  }
948
1015
  }
949
- // Sort sprints by id
950
- roadmap.sprints.sort((a, b) => a.id - b.id);
1016
+ roadmap.sprints.sort((a, b) => compareRoadmapSprintIds(roadmap, roadmapSprintKey(roadmap, a), roadmapSprintKey(roadmap, b)));
951
1017
  // Build output
952
1018
  const output = JSON.stringify(roadmap, null, 2) + '\n';
953
1019
  console.log(`\nRoadmap sync: ${path}`);