orbital-command 0.2.0 → 1.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 (431) hide show
  1. package/README.md +67 -42
  2. package/bin/commands/config.js +19 -0
  3. package/bin/commands/events.js +40 -0
  4. package/bin/commands/launch.js +126 -0
  5. package/bin/commands/manifest.js +283 -0
  6. package/bin/commands/registry.js +104 -0
  7. package/bin/commands/update.js +24 -0
  8. package/bin/lib/helpers.js +229 -0
  9. package/bin/orbital.js +147 -319
  10. package/dist/assets/Landing-CfQdHR0N.js +11 -0
  11. package/dist/assets/PrimitivesConfig-DThSipFy.js +32 -0
  12. package/dist/assets/QualityGates-B4kxM5UU.js +26 -0
  13. package/dist/assets/SessionTimeline-Bz1iZnmg.js +1 -0
  14. package/dist/assets/Settings-DLcZwbCT.js +12 -0
  15. package/dist/assets/SourceControl-BMNIz7Lt.js +36 -0
  16. package/dist/assets/WorkflowVisualizer-CxuSBOYu.js +69 -0
  17. package/dist/assets/arrow-down-DVPp6_qp.js +6 -0
  18. package/dist/assets/bot-NFaJBDn_.js +6 -0
  19. package/dist/assets/charts-LGLb8hyU.js +68 -0
  20. package/dist/assets/circle-x-IsFCkBZu.js +6 -0
  21. package/dist/assets/file-text-J1cebZXF.js +6 -0
  22. package/dist/assets/globe-WzeyHsUc.js +6 -0
  23. package/dist/assets/index-BdJ57EhC.css +1 -0
  24. package/dist/assets/index-o4ScMAuR.js +349 -0
  25. package/dist/assets/key-CKR8JJSj.js +6 -0
  26. package/dist/assets/minus-CHBsJyjp.js +6 -0
  27. package/dist/assets/radio-xqZaR-Uk.js +6 -0
  28. package/dist/assets/rocket-D_xvvNG6.js +6 -0
  29. package/dist/assets/shield-TdB1yv_a.js +6 -0
  30. package/dist/assets/ui-BmsSg9jU.js +53 -0
  31. package/dist/assets/useSocketListener-0L5yiN5i.js +1 -0
  32. package/dist/assets/useWorkflowEditor-CqeRWVQX.js +11 -0
  33. package/dist/assets/{vendor-Dzv9lrRc.js → vendor-Bqt8AJn2.js} +1 -1
  34. package/dist/assets/workflow-constants-Rw-GmgHZ.js +6 -0
  35. package/dist/assets/zap-C9wqYMpl.js +6 -0
  36. package/dist/favicon.svg +1 -0
  37. package/dist/index.html +6 -5
  38. package/dist/server/server/__tests__/data-routes.test.js +126 -0
  39. package/dist/server/server/__tests__/helpers/db.js +17 -0
  40. package/dist/server/server/__tests__/helpers/mock-emitter.js +8 -0
  41. package/dist/server/server/__tests__/scope-routes.test.js +138 -0
  42. package/dist/server/server/__tests__/sprint-routes.test.js +102 -0
  43. package/dist/server/server/__tests__/workflow-routes.test.js +107 -0
  44. package/dist/server/server/config-migrator.js +135 -0
  45. package/dist/server/server/config.js +51 -7
  46. package/dist/server/server/database.js +21 -28
  47. package/dist/server/server/global-config.js +143 -0
  48. package/dist/server/server/index.js +118 -276
  49. package/dist/server/server/init.js +243 -225
  50. package/dist/server/server/launch.js +29 -0
  51. package/dist/server/server/manifest-types.js +8 -0
  52. package/dist/server/server/manifest.js +454 -0
  53. package/dist/server/server/migrate-legacy.js +229 -0
  54. package/dist/server/server/parsers/event-parser.js +4 -1
  55. package/dist/server/server/parsers/event-parser.test.js +117 -0
  56. package/dist/server/server/parsers/scope-parser.js +74 -28
  57. package/dist/server/server/parsers/scope-parser.test.js +230 -0
  58. package/dist/server/server/project-context.js +265 -0
  59. package/dist/server/server/project-emitter.js +41 -0
  60. package/dist/server/server/project-manager.js +297 -0
  61. package/dist/server/server/routes/aggregate-routes.js +871 -0
  62. package/dist/server/server/routes/config-routes.js +41 -90
  63. package/dist/server/server/routes/data-routes.js +25 -123
  64. package/dist/server/server/routes/dispatch-routes.js +37 -15
  65. package/dist/server/server/routes/git-routes.js +74 -0
  66. package/dist/server/server/routes/manifest-routes.js +319 -0
  67. package/dist/server/server/routes/scope-routes.js +45 -28
  68. package/dist/server/server/routes/sync-routes.js +134 -0
  69. package/dist/server/server/routes/version-routes.js +1 -15
  70. package/dist/server/server/routes/workflow-routes.js +9 -3
  71. package/dist/server/server/schema.js +3 -0
  72. package/dist/server/server/services/batch-orchestrator.js +41 -17
  73. package/dist/server/server/services/claude-session-service.js +17 -14
  74. package/dist/server/server/services/config-service.js +10 -1
  75. package/dist/server/server/services/deploy-service.test.js +119 -0
  76. package/dist/server/server/services/event-service.js +64 -1
  77. package/dist/server/server/services/event-service.test.js +191 -0
  78. package/dist/server/server/services/gate-service.test.js +105 -0
  79. package/dist/server/server/services/git-service.js +108 -4
  80. package/dist/server/server/services/github-service.js +110 -2
  81. package/dist/server/server/services/readiness-service.test.js +190 -0
  82. package/dist/server/server/services/scope-cache.js +5 -1
  83. package/dist/server/server/services/scope-cache.test.js +142 -0
  84. package/dist/server/server/services/scope-service.js +222 -131
  85. package/dist/server/server/services/scope-service.test.js +137 -0
  86. package/dist/server/server/services/sprint-orchestrator.js +29 -15
  87. package/dist/server/server/services/sprint-service.js +23 -3
  88. package/dist/server/server/services/sprint-service.test.js +238 -0
  89. package/dist/server/server/services/sync-service.js +434 -0
  90. package/dist/server/server/services/sync-types.js +2 -0
  91. package/dist/server/server/services/workflow-service.js +26 -5
  92. package/dist/server/server/services/workflow-service.test.js +159 -0
  93. package/dist/server/server/settings-sync.js +284 -0
  94. package/dist/server/server/uninstall.js +195 -0
  95. package/dist/server/server/update-planner.js +279 -0
  96. package/dist/server/server/update.js +212 -0
  97. package/dist/server/server/utils/cc-hooks-parser.js +3 -0
  98. package/dist/server/server/utils/cc-hooks-parser.test.js +86 -0
  99. package/dist/server/server/utils/dispatch-utils.js +83 -24
  100. package/dist/server/server/utils/dispatch-utils.test.js +182 -0
  101. package/dist/server/server/utils/flag-builder.js +54 -0
  102. package/dist/server/server/utils/json-fields.js +14 -0
  103. package/dist/server/server/utils/json-fields.test.js +73 -0
  104. package/dist/server/server/utils/logger.js +37 -3
  105. package/dist/server/server/utils/package-info.js +30 -0
  106. package/dist/server/server/utils/route-helpers.js +47 -0
  107. package/dist/server/server/utils/route-helpers.test.js +115 -0
  108. package/dist/server/server/utils/terminal-launcher.js +79 -25
  109. package/dist/server/server/utils/worktree-manager.js +13 -4
  110. package/dist/server/server/validator.js +230 -0
  111. package/dist/server/server/watchers/event-watcher.js +28 -13
  112. package/dist/server/server/watchers/global-watcher.js +63 -0
  113. package/dist/server/server/watchers/scope-watcher.js +27 -12
  114. package/dist/server/server/wizard/config-editor.js +237 -0
  115. package/dist/server/server/wizard/detect.js +96 -0
  116. package/dist/server/server/wizard/doctor.js +115 -0
  117. package/dist/server/server/wizard/index.js +340 -0
  118. package/dist/server/server/wizard/phases/confirm.js +39 -0
  119. package/dist/server/server/wizard/phases/project-setup.js +90 -0
  120. package/dist/server/server/wizard/phases/setup-wizard.js +66 -0
  121. package/dist/server/server/wizard/phases/welcome.js +32 -0
  122. package/dist/server/server/wizard/phases/workflow-setup.js +22 -0
  123. package/dist/server/server/wizard/types.js +29 -0
  124. package/dist/server/server/wizard/ui.js +73 -0
  125. package/dist/server/shared/__fixtures__/workflow-configs.js +75 -0
  126. package/dist/server/shared/api-types.js +80 -1
  127. package/dist/server/shared/default-workflow.json +65 -0
  128. package/dist/server/shared/onboarding-tour.test.js +81 -0
  129. package/dist/server/shared/project-colors.js +24 -0
  130. package/dist/server/shared/workflow-config.test.js +84 -0
  131. package/dist/server/shared/workflow-engine.js +1 -1
  132. package/dist/server/shared/workflow-engine.test.js +302 -0
  133. package/dist/server/shared/workflow-normalizer.js +101 -0
  134. package/dist/server/shared/workflow-normalizer.test.js +100 -0
  135. package/dist/server/src/components/onboarding/tour-steps.js +84 -0
  136. package/package.json +34 -29
  137. package/schemas/orbital.config.schema.json +2 -5
  138. package/scripts/postinstall.js +18 -6
  139. package/scripts/release.sh +53 -0
  140. package/server/__tests__/data-routes.test.ts +151 -0
  141. package/server/__tests__/helpers/db.ts +19 -0
  142. package/server/__tests__/helpers/mock-emitter.ts +10 -0
  143. package/server/__tests__/scope-routes.test.ts +158 -0
  144. package/server/__tests__/sprint-routes.test.ts +118 -0
  145. package/server/__tests__/workflow-routes.test.ts +120 -0
  146. package/server/config-migrator.ts +160 -0
  147. package/server/config.ts +64 -12
  148. package/server/database.ts +22 -31
  149. package/server/global-config.ts +204 -0
  150. package/server/index.ts +139 -316
  151. package/server/init.ts +266 -234
  152. package/server/launch.ts +32 -0
  153. package/server/manifest-types.ts +145 -0
  154. package/server/manifest.ts +494 -0
  155. package/server/migrate-legacy.ts +290 -0
  156. package/server/parsers/event-parser.test.ts +135 -0
  157. package/server/parsers/event-parser.ts +4 -1
  158. package/server/parsers/scope-parser.test.ts +270 -0
  159. package/server/parsers/scope-parser.ts +79 -31
  160. package/server/project-context.ts +325 -0
  161. package/server/project-emitter.ts +50 -0
  162. package/server/project-manager.ts +368 -0
  163. package/server/routes/aggregate-routes.ts +968 -0
  164. package/server/routes/config-routes.ts +43 -85
  165. package/server/routes/data-routes.ts +34 -156
  166. package/server/routes/dispatch-routes.ts +46 -17
  167. package/server/routes/git-routes.ts +77 -0
  168. package/server/routes/manifest-routes.ts +388 -0
  169. package/server/routes/scope-routes.ts +39 -30
  170. package/server/routes/sync-routes.ts +175 -0
  171. package/server/routes/version-routes.ts +1 -16
  172. package/server/routes/workflow-routes.ts +9 -3
  173. package/server/schema.ts +3 -0
  174. package/server/services/batch-orchestrator.ts +41 -17
  175. package/server/services/claude-session-service.ts +16 -14
  176. package/server/services/config-service.ts +10 -1
  177. package/server/services/deploy-service.test.ts +145 -0
  178. package/server/services/deploy-service.ts +2 -2
  179. package/server/services/event-service.test.ts +242 -0
  180. package/server/services/event-service.ts +92 -3
  181. package/server/services/gate-service.test.ts +131 -0
  182. package/server/services/gate-service.ts +2 -2
  183. package/server/services/git-service.ts +137 -4
  184. package/server/services/github-service.ts +120 -2
  185. package/server/services/readiness-service.test.ts +217 -0
  186. package/server/services/scope-cache.test.ts +167 -0
  187. package/server/services/scope-cache.ts +4 -1
  188. package/server/services/scope-service.test.ts +169 -0
  189. package/server/services/scope-service.ts +224 -130
  190. package/server/services/sprint-orchestrator.ts +30 -15
  191. package/server/services/sprint-service.test.ts +271 -0
  192. package/server/services/sprint-service.ts +29 -5
  193. package/server/services/sync-service.ts +482 -0
  194. package/server/services/sync-types.ts +77 -0
  195. package/server/services/workflow-service.test.ts +190 -0
  196. package/server/services/workflow-service.ts +29 -9
  197. package/server/settings-sync.ts +359 -0
  198. package/server/uninstall.ts +214 -0
  199. package/server/update-planner.ts +346 -0
  200. package/server/update.ts +263 -0
  201. package/server/utils/cc-hooks-parser.test.ts +96 -0
  202. package/server/utils/cc-hooks-parser.ts +4 -0
  203. package/server/utils/dispatch-utils.test.ts +245 -0
  204. package/server/utils/dispatch-utils.ts +102 -30
  205. package/server/utils/flag-builder.ts +56 -0
  206. package/server/utils/json-fields.test.ts +83 -0
  207. package/server/utils/json-fields.ts +14 -0
  208. package/server/utils/logger.ts +40 -3
  209. package/server/utils/package-info.ts +32 -0
  210. package/server/utils/route-helpers.test.ts +144 -0
  211. package/server/utils/route-helpers.ts +50 -0
  212. package/server/utils/terminal-launcher.ts +85 -25
  213. package/server/utils/worktree-manager.ts +9 -4
  214. package/server/validator.ts +270 -0
  215. package/server/watchers/event-watcher.ts +24 -12
  216. package/server/watchers/global-watcher.ts +77 -0
  217. package/server/watchers/scope-watcher.ts +21 -9
  218. package/server/wizard/config-editor.ts +248 -0
  219. package/server/wizard/detect.ts +104 -0
  220. package/server/wizard/doctor.ts +114 -0
  221. package/server/wizard/index.ts +438 -0
  222. package/server/wizard/phases/confirm.ts +45 -0
  223. package/server/wizard/phases/project-setup.ts +106 -0
  224. package/server/wizard/phases/setup-wizard.ts +78 -0
  225. package/server/wizard/phases/welcome.ts +39 -0
  226. package/server/wizard/phases/workflow-setup.ts +28 -0
  227. package/server/wizard/types.ts +56 -0
  228. package/server/wizard/ui.ts +92 -0
  229. package/shared/__fixtures__/workflow-configs.ts +80 -0
  230. package/shared/api-types.ts +106 -0
  231. package/shared/onboarding-tour.test.ts +94 -0
  232. package/shared/project-colors.ts +24 -0
  233. package/shared/workflow-config.test.ts +111 -0
  234. package/shared/workflow-config.ts +7 -0
  235. package/shared/workflow-engine.test.ts +388 -0
  236. package/shared/workflow-engine.ts +1 -1
  237. package/shared/workflow-normalizer.test.ts +119 -0
  238. package/shared/workflow-normalizer.ts +118 -0
  239. package/templates/agents/QUICK-REFERENCE.md +1 -0
  240. package/templates/agents/README.md +1 -0
  241. package/templates/agents/SKILL-TRIGGERS.md +11 -0
  242. package/templates/agents/green-team/deep-dive.md +361 -0
  243. package/templates/hooks/end-session.sh +4 -1
  244. package/templates/hooks/init-session.sh +1 -0
  245. package/templates/hooks/orbital-emit.sh +2 -2
  246. package/templates/hooks/orbital-report-deploy.sh +4 -4
  247. package/templates/hooks/orbital-report-gates.sh +4 -4
  248. package/templates/hooks/orbital-scope-update.sh +1 -1
  249. package/templates/hooks/scope-commit-logger.sh +2 -2
  250. package/templates/hooks/scope-create-cleanup.sh +2 -2
  251. package/templates/hooks/scope-create-gate.sh +2 -5
  252. package/templates/hooks/scope-gate.sh +4 -6
  253. package/templates/hooks/scope-helpers.sh +28 -1
  254. package/templates/hooks/scope-lifecycle-gate.sh +14 -5
  255. package/templates/hooks/scope-prepare.sh +67 -12
  256. package/templates/hooks/scope-transition.sh +14 -6
  257. package/templates/hooks/time-tracker.sh +2 -5
  258. package/templates/migrations/renames.json +1 -0
  259. package/templates/orbital.config.json +8 -6
  260. package/{shared/default-workflow.json → templates/presets/default.json} +65 -0
  261. package/templates/presets/development.json +4 -4
  262. package/templates/presets/gitflow.json +7 -0
  263. package/templates/prompts/README.md +23 -0
  264. package/templates/prompts/deep-dive-audit.md +94 -0
  265. package/templates/quick/rules.md +56 -5
  266. package/templates/settings-hooks.json +1 -1
  267. package/templates/skills/git-commit/SKILL.md +27 -7
  268. package/templates/skills/git-dev/SKILL.md +13 -4
  269. package/templates/skills/git-main/SKILL.md +13 -3
  270. package/templates/skills/git-production/SKILL.md +9 -2
  271. package/templates/skills/git-staging/SKILL.md +11 -3
  272. package/templates/skills/scope-create/SKILL.md +17 -3
  273. package/templates/skills/scope-fix-review/SKILL.md +14 -7
  274. package/templates/skills/scope-implement/SKILL.md +15 -4
  275. package/templates/skills/scope-post-review/SKILL.md +77 -7
  276. package/templates/skills/scope-pre-review/SKILL.md +11 -4
  277. package/templates/skills/scope-verify/SKILL.md +5 -3
  278. package/templates/skills/test-code-review/SKILL.md +41 -33
  279. package/templates/skills/test-scaffold/SKILL.md +222 -0
  280. package/dist/assets/WorkflowVisualizer-BZ21PIIF.js +0 -84
  281. package/dist/assets/charts-D__PA1zp.js +0 -72
  282. package/dist/assets/index-D1G6i0nS.css +0 -1
  283. package/dist/assets/index-DpItvKpf.js +0 -419
  284. package/dist/assets/ui-BvF022GT.js +0 -53
  285. package/index.html +0 -15
  286. package/postcss.config.js +0 -6
  287. package/src/App.tsx +0 -33
  288. package/src/components/AgentBadge.tsx +0 -40
  289. package/src/components/BatchPreflightModal.tsx +0 -115
  290. package/src/components/CardDisplayToggle.tsx +0 -74
  291. package/src/components/ColumnHeaderActions.tsx +0 -55
  292. package/src/components/ColumnMenu.tsx +0 -99
  293. package/src/components/DeployHistory.tsx +0 -141
  294. package/src/components/DispatchModal.tsx +0 -164
  295. package/src/components/DispatchPopover.tsx +0 -139
  296. package/src/components/DragOverlay.tsx +0 -25
  297. package/src/components/DriftSidebar.tsx +0 -140
  298. package/src/components/EnvironmentStrip.tsx +0 -88
  299. package/src/components/ErrorBoundary.tsx +0 -62
  300. package/src/components/FilterChip.tsx +0 -105
  301. package/src/components/GateIndicator.tsx +0 -33
  302. package/src/components/IdeaDetailModal.tsx +0 -190
  303. package/src/components/IdeaFormDialog.tsx +0 -113
  304. package/src/components/KanbanColumn.tsx +0 -201
  305. package/src/components/MarkdownRenderer.tsx +0 -114
  306. package/src/components/NeonGrid.tsx +0 -128
  307. package/src/components/PromotionQueue.tsx +0 -89
  308. package/src/components/ScopeCard.tsx +0 -234
  309. package/src/components/ScopeDetailModal.tsx +0 -255
  310. package/src/components/ScopeFilterBar.tsx +0 -152
  311. package/src/components/SearchInput.tsx +0 -102
  312. package/src/components/SessionPanel.tsx +0 -335
  313. package/src/components/SprintContainer.tsx +0 -303
  314. package/src/components/SprintDependencyDialog.tsx +0 -78
  315. package/src/components/SprintPreflightModal.tsx +0 -138
  316. package/src/components/StatusBar.tsx +0 -168
  317. package/src/components/SwimCell.tsx +0 -67
  318. package/src/components/SwimLaneRow.tsx +0 -94
  319. package/src/components/SwimlaneBoardView.tsx +0 -108
  320. package/src/components/VersionBadge.tsx +0 -139
  321. package/src/components/ViewModeSelector.tsx +0 -114
  322. package/src/components/config/AgentChip.tsx +0 -53
  323. package/src/components/config/AgentCreateDialog.tsx +0 -321
  324. package/src/components/config/AgentEditor.tsx +0 -175
  325. package/src/components/config/DirectoryTree.tsx +0 -582
  326. package/src/components/config/FileEditor.tsx +0 -550
  327. package/src/components/config/HookChip.tsx +0 -50
  328. package/src/components/config/StageCard.tsx +0 -198
  329. package/src/components/config/TransitionZone.tsx +0 -173
  330. package/src/components/config/UnifiedWorkflowPipeline.tsx +0 -216
  331. package/src/components/config/WorkflowPipeline.tsx +0 -161
  332. package/src/components/source-control/BranchList.tsx +0 -93
  333. package/src/components/source-control/BranchPanel.tsx +0 -105
  334. package/src/components/source-control/CommitLog.tsx +0 -100
  335. package/src/components/source-control/CommitRow.tsx +0 -47
  336. package/src/components/source-control/GitHubPanel.tsx +0 -110
  337. package/src/components/source-control/GitHubSetupGuide.tsx +0 -52
  338. package/src/components/source-control/GitOverviewBar.tsx +0 -101
  339. package/src/components/source-control/PullRequestList.tsx +0 -69
  340. package/src/components/source-control/WorktreeList.tsx +0 -80
  341. package/src/components/ui/badge.tsx +0 -41
  342. package/src/components/ui/button.tsx +0 -55
  343. package/src/components/ui/card.tsx +0 -78
  344. package/src/components/ui/dialog.tsx +0 -94
  345. package/src/components/ui/popover.tsx +0 -33
  346. package/src/components/ui/scroll-area.tsx +0 -54
  347. package/src/components/ui/separator.tsx +0 -28
  348. package/src/components/ui/tabs.tsx +0 -52
  349. package/src/components/ui/toggle-switch.tsx +0 -35
  350. package/src/components/ui/tooltip.tsx +0 -27
  351. package/src/components/workflow/AddEdgeDialog.tsx +0 -217
  352. package/src/components/workflow/AddListDialog.tsx +0 -201
  353. package/src/components/workflow/ChecklistEditor.tsx +0 -239
  354. package/src/components/workflow/CommandPrefixManager.tsx +0 -118
  355. package/src/components/workflow/ConfigSettingsPanel.tsx +0 -189
  356. package/src/components/workflow/DirectionSelector.tsx +0 -133
  357. package/src/components/workflow/DispatchConfigPanel.tsx +0 -180
  358. package/src/components/workflow/EdgeDetailPanel.tsx +0 -236
  359. package/src/components/workflow/EdgePropertyEditor.tsx +0 -251
  360. package/src/components/workflow/EditToolbar.tsx +0 -138
  361. package/src/components/workflow/HookDetailPanel.tsx +0 -250
  362. package/src/components/workflow/HookExecutionLog.tsx +0 -24
  363. package/src/components/workflow/HookSourceModal.tsx +0 -129
  364. package/src/components/workflow/HooksDashboard.tsx +0 -363
  365. package/src/components/workflow/ListPropertyEditor.tsx +0 -251
  366. package/src/components/workflow/MigrationPreviewDialog.tsx +0 -237
  367. package/src/components/workflow/MovementRulesPanel.tsx +0 -188
  368. package/src/components/workflow/NodeDetailPanel.tsx +0 -245
  369. package/src/components/workflow/PresetSelector.tsx +0 -414
  370. package/src/components/workflow/SkillCommandBuilder.tsx +0 -174
  371. package/src/components/workflow/WorkflowEdgeComponent.tsx +0 -145
  372. package/src/components/workflow/WorkflowNode.tsx +0 -147
  373. package/src/components/workflow/graphLayout.ts +0 -186
  374. package/src/components/workflow/mergeHooks.ts +0 -85
  375. package/src/components/workflow/useEditHistory.ts +0 -88
  376. package/src/components/workflow/useWorkflowEditor.ts +0 -262
  377. package/src/components/workflow/validateConfig.ts +0 -70
  378. package/src/hooks/useActiveDispatches.ts +0 -198
  379. package/src/hooks/useBoardSettings.ts +0 -170
  380. package/src/hooks/useCardDisplay.ts +0 -57
  381. package/src/hooks/useCcHooks.ts +0 -24
  382. package/src/hooks/useConfigTree.ts +0 -51
  383. package/src/hooks/useEnforcementRules.ts +0 -46
  384. package/src/hooks/useEvents.ts +0 -59
  385. package/src/hooks/useFileEditor.ts +0 -165
  386. package/src/hooks/useGates.ts +0 -57
  387. package/src/hooks/useIdeaActions.ts +0 -53
  388. package/src/hooks/useKanbanDnd.ts +0 -410
  389. package/src/hooks/useOrbitalConfig.ts +0 -54
  390. package/src/hooks/usePipeline.ts +0 -47
  391. package/src/hooks/usePipelineData.ts +0 -338
  392. package/src/hooks/useReconnect.ts +0 -25
  393. package/src/hooks/useScopeFilters.ts +0 -125
  394. package/src/hooks/useScopeSessions.ts +0 -44
  395. package/src/hooks/useScopes.ts +0 -67
  396. package/src/hooks/useSearch.ts +0 -67
  397. package/src/hooks/useSettings.tsx +0 -187
  398. package/src/hooks/useSocket.ts +0 -25
  399. package/src/hooks/useSourceControl.ts +0 -105
  400. package/src/hooks/useSprintPreflight.ts +0 -55
  401. package/src/hooks/useSprints.ts +0 -154
  402. package/src/hooks/useStatusBarHighlight.ts +0 -18
  403. package/src/hooks/useSwimlaneBoardSettings.ts +0 -104
  404. package/src/hooks/useTheme.ts +0 -9
  405. package/src/hooks/useTransitionReadiness.ts +0 -53
  406. package/src/hooks/useVersion.ts +0 -155
  407. package/src/hooks/useViolations.ts +0 -65
  408. package/src/hooks/useWorkflow.tsx +0 -125
  409. package/src/hooks/useZoomModifier.ts +0 -19
  410. package/src/index.css +0 -797
  411. package/src/layouts/DashboardLayout.tsx +0 -113
  412. package/src/lib/collisionDetection.ts +0 -20
  413. package/src/lib/scope-fields.ts +0 -61
  414. package/src/lib/swimlane.ts +0 -146
  415. package/src/lib/utils.ts +0 -15
  416. package/src/main.tsx +0 -19
  417. package/src/socket.ts +0 -11
  418. package/src/types/index.ts +0 -497
  419. package/src/views/AgentFeed.tsx +0 -339
  420. package/src/views/DeployPipeline.tsx +0 -59
  421. package/src/views/EnforcementView.tsx +0 -378
  422. package/src/views/PrimitivesConfig.tsx +0 -500
  423. package/src/views/QualityGates.tsx +0 -1012
  424. package/src/views/ScopeBoard.tsx +0 -454
  425. package/src/views/SessionTimeline.tsx +0 -516
  426. package/src/views/Settings.tsx +0 -183
  427. package/src/views/SourceControl.tsx +0 -95
  428. package/src/views/WorkflowVisualizer.tsx +0 -382
  429. package/tailwind.config.js +0 -161
  430. package/tsconfig.json +0 -25
  431. package/vite.config.ts +0 -38
@@ -0,0 +1,271 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
+ import { SprintService } from './sprint-service.js';
3
+ import { createTestDb } from '../__tests__/helpers/db.js';
4
+ import { createMockEmitter } from '../__tests__/helpers/mock-emitter.js';
5
+ import type Database from 'better-sqlite3';
6
+ import type { Emitter } from '../project-emitter.js';
7
+ import type { ParsedScope } from '../parsers/scope-parser.js';
8
+
9
+ function makeScope(overrides: Partial<ParsedScope> & { id: number }): ParsedScope {
10
+ return {
11
+ title: `Scope ${overrides.id}`,
12
+ slug: undefined,
13
+ status: 'backlog',
14
+ priority: null,
15
+ effort_estimate: null,
16
+ category: null,
17
+ tags: [],
18
+ blocked_by: [],
19
+ blocks: [],
20
+ file_path: `/scopes/backlog/${String(overrides.id).padStart(3, '0')}-test.md`,
21
+ created_at: null,
22
+ updated_at: null,
23
+ raw_content: '',
24
+ sessions: {},
25
+ is_ghost: false,
26
+ favourite: false,
27
+ ...overrides,
28
+ };
29
+ }
30
+
31
+ function createMockScopeService(scopes: ParsedScope[]) {
32
+ return { getById: (id: number) => scopes.find(s => s.id === id) } as unknown as ConstructorParameters<typeof SprintService>[2];
33
+ }
34
+
35
+ describe('SprintService', () => {
36
+ let db: Database.Database;
37
+ let cleanup: () => void;
38
+ let emitter: Emitter & { emit: ReturnType<typeof vi.fn> };
39
+ let service: SprintService;
40
+ const testScopes = [
41
+ makeScope({ id: 1, title: 'Scope 1', status: 'backlog' }),
42
+ makeScope({ id: 2, title: 'Scope 2', status: 'backlog' }),
43
+ makeScope({ id: 3, title: 'Scope 3', status: 'backlog', blocked_by: [99] }),
44
+ makeScope({ id: 4, title: 'Scope 4', status: 'implementing' }),
45
+ ];
46
+
47
+ beforeEach(() => {
48
+ ({ db, cleanup } = createTestDb());
49
+ // Add migration columns that SCHEMA_DDL may not include
50
+ try { db.prepare("ALTER TABLE sprints ADD COLUMN target_column TEXT DEFAULT 'backlog'").run(); } catch { /* already exists */ }
51
+ try { db.prepare("ALTER TABLE sprints ADD COLUMN group_type TEXT DEFAULT 'sprint'").run(); } catch { /* already exists */ }
52
+ try { db.prepare("ALTER TABLE sprints ADD COLUMN dispatch_result TEXT DEFAULT '{}'").run(); } catch { /* already exists */ }
53
+ emitter = createMockEmitter();
54
+ const mockScopeService = createMockScopeService(testScopes);
55
+ service = new SprintService(db, emitter, mockScopeService);
56
+ });
57
+
58
+ afterEach(() => {
59
+ cleanup?.();
60
+ });
61
+
62
+ // ─── create() ─────────────────────────────────────────────
63
+
64
+ describe('create()', () => {
65
+ it('creates sprint with default values', () => {
66
+ const sprint = service.create('Test Sprint');
67
+ expect(sprint.name).toBe('Test Sprint');
68
+ expect(sprint.status).toBe('assembling');
69
+ expect(sprint.concurrency_cap).toBe(5);
70
+ expect(sprint.group_type).toBe('sprint');
71
+ expect(sprint.target_column).toBe('backlog');
72
+ });
73
+
74
+ it('creates batch with custom options', () => {
75
+ const sprint = service.create('Test Batch', { group_type: 'batch', target_column: 'review' });
76
+ expect(sprint.group_type).toBe('batch');
77
+ expect(sprint.target_column).toBe('review');
78
+ });
79
+
80
+ it('emits sprint:created', () => {
81
+ service.create('Test Sprint');
82
+ expect(emitter.emit).toHaveBeenCalledWith('sprint:created', expect.objectContaining({ name: 'Test Sprint' }));
83
+ });
84
+ });
85
+
86
+ // ─── getAll() / getById() ─────────────────────────────────
87
+
88
+ describe('getAll() / getById()', () => {
89
+ it('returns all sprints', () => {
90
+ service.create('Sprint 1');
91
+ service.create('Sprint 2');
92
+ expect(service.getAll()).toHaveLength(2);
93
+ });
94
+
95
+ it('filters by status', () => {
96
+ service.create('Sprint 1');
97
+ const all = service.getAll('assembling');
98
+ expect(all).toHaveLength(1);
99
+ expect(service.getAll('dispatched')).toHaveLength(0);
100
+ });
101
+
102
+ it('returns null for unknown ID', () => {
103
+ expect(service.getById(999)).toBeNull();
104
+ });
105
+ });
106
+
107
+ // ─── rename() / delete() ──────────────────────────────────
108
+
109
+ describe('rename()', () => {
110
+ it('renames an assembling sprint', () => {
111
+ const sprint = service.create('Original');
112
+ const result = service.rename(sprint.id, 'Renamed');
113
+ expect(result).toBe(true);
114
+ expect(service.getById(sprint.id)!.name).toBe('Renamed');
115
+ });
116
+
117
+ it('returns false for non-assembling sprint', () => {
118
+ const sprint = service.create('Sprint');
119
+ service.updateStatus(sprint.id, 'dispatched');
120
+ expect(service.rename(sprint.id, 'New Name')).toBe(false);
121
+ });
122
+ });
123
+
124
+ describe('delete()', () => {
125
+ it('deletes sprint and emits event', () => {
126
+ const sprint = service.create('To Delete');
127
+ const result = service.delete(sprint.id);
128
+ expect(result).toBe(true);
129
+ expect(service.getById(sprint.id)).toBeNull();
130
+ expect(emitter.emit).toHaveBeenCalledWith('sprint:deleted', expect.objectContaining({ id: sprint.id }));
131
+ });
132
+ });
133
+
134
+ // ─── addScopes() ──────────────────────────────────────────
135
+
136
+ describe('addScopes()', () => {
137
+ it('adds scopes to assembling sprint', () => {
138
+ const sprint = service.create('Sprint');
139
+ const result = service.addScopes(sprint.id, [1, 2]);
140
+ expect(result).not.toBeNull();
141
+ expect(result!.added).toEqual([1, 2]);
142
+ });
143
+
144
+ it('returns null for non-existent sprint', () => {
145
+ expect(service.addScopes(999, [1])).toBeNull();
146
+ });
147
+
148
+ it('reports unmet dependencies', () => {
149
+ const sprint = service.create('Sprint');
150
+ const result = service.addScopes(sprint.id, [3]); // scope 3 is blocked_by [99]
151
+ expect(result).not.toBeNull();
152
+ expect(result!.unmet_dependencies.length).toBeGreaterThanOrEqual(0);
153
+ });
154
+
155
+ it('skips scopes that are already in the sprint', () => {
156
+ const sprint = service.create('Sprint');
157
+ service.addScopes(sprint.id, [1]);
158
+ const result = service.addScopes(sprint.id, [1, 2]);
159
+ expect(result).not.toBeNull();
160
+ expect(result!.added).toEqual([2]);
161
+ });
162
+ });
163
+
164
+ // ─── removeScopes() ──────────────────────────────────────
165
+
166
+ describe('removeScopes()', () => {
167
+ it('removes scopes from assembling sprint', () => {
168
+ const sprint = service.create('Sprint');
169
+ service.addScopes(sprint.id, [1, 2]);
170
+ const result = service.removeScopes(sprint.id, [1]);
171
+ expect(result).toBe(true);
172
+ const updated = service.getById(sprint.id)!;
173
+ expect(updated.scope_ids).not.toContain(1);
174
+ });
175
+ });
176
+
177
+ // ─── updateStatus() ──────────────────────────────────────
178
+
179
+ describe('updateStatus()', () => {
180
+ it('transitions to dispatched and sets dispatched_at', () => {
181
+ const sprint = service.create('Sprint');
182
+ service.addScopes(sprint.id, [1]);
183
+ service.updateStatus(sprint.id, 'dispatched');
184
+ const updated = service.getById(sprint.id)!;
185
+ expect(updated.status).toBe('dispatched');
186
+ expect(updated.dispatched_at).not.toBeNull();
187
+ });
188
+
189
+ it('transitions to completed and sets completed_at', () => {
190
+ const sprint = service.create('Sprint');
191
+ service.updateStatus(sprint.id, 'completed');
192
+ const updated = service.getById(sprint.id)!;
193
+ expect(updated.status).toBe('completed');
194
+ expect(updated.completed_at).not.toBeNull();
195
+ });
196
+
197
+ it('emits sprint:updated on status change', () => {
198
+ const sprint = service.create('Sprint');
199
+ emitter.emit.mockClear();
200
+ service.updateStatus(sprint.id, 'dispatched');
201
+ expect(emitter.emit).toHaveBeenCalledWith('sprint:updated', expect.objectContaining({ status: 'dispatched' }));
202
+ });
203
+ });
204
+
205
+ // ─── updateScopeStatus() ─────────────────────────────────
206
+
207
+ describe('updateScopeStatus()', () => {
208
+ it('updates dispatch_status for a scope in sprint', () => {
209
+ const sprint = service.create('Sprint');
210
+ service.addScopes(sprint.id, [1]);
211
+ service.updateScopeStatus(sprint.id, 1, 'in_progress');
212
+ const updated = service.getById(sprint.id)!;
213
+ const scope = updated.scopes.find(s => s.scope_id === 1);
214
+ expect(scope?.dispatch_status).toBe('in_progress');
215
+ });
216
+
217
+ it('records error for failed scopes', () => {
218
+ const sprint = service.create('Sprint');
219
+ service.addScopes(sprint.id, [1]);
220
+ service.updateScopeStatus(sprint.id, 1, 'failed', 'Timeout');
221
+ const rows = db.prepare('SELECT error FROM sprint_scopes WHERE scope_id = 1').all() as Array<{ error: string | null }>;
222
+ expect(rows[0].error).toBe('Timeout');
223
+ });
224
+ });
225
+
226
+ // ─── setLayers() ──────────────────────────────────────────
227
+
228
+ describe('setLayers()', () => {
229
+ it('stores layer assignment', () => {
230
+ const sprint = service.create('Sprint');
231
+ service.addScopes(sprint.id, [1, 2]);
232
+ service.setLayers(sprint.id, [[1], [2]]);
233
+ const updated = service.getById(sprint.id)!;
234
+ expect(updated.layers).toEqual([[1], [2]]);
235
+ });
236
+ });
237
+
238
+ // ─── findActiveSprintForScope() ───────────────────────────
239
+
240
+ describe('findActiveSprintForScope()', () => {
241
+ it('returns active sprint containing the scope', () => {
242
+ const sprint = service.create('Sprint');
243
+ service.addScopes(sprint.id, [1]);
244
+ service.updateStatus(sprint.id, 'dispatched');
245
+ const active = service.findActiveSprintForScope(1);
246
+ expect(active).not.toBeNull();
247
+ expect(active!.sprint_id).toBe(sprint.id);
248
+ });
249
+
250
+ it('returns null/undefined when scope is not in any active sprint', () => {
251
+ expect(service.findActiveSprintForScope(99)).toBeFalsy();
252
+ });
253
+ });
254
+
255
+ // ─── getActiveGroupForScope() ─────────────────────────────
256
+
257
+ describe('getActiveGroupForScope()', () => {
258
+ it('returns group info for scope in active sprint', () => {
259
+ const sprint = service.create('Batch', { group_type: 'batch' });
260
+ service.addScopes(sprint.id, [1]);
261
+ service.updateStatus(sprint.id, 'dispatched');
262
+ const group = service.getActiveGroupForScope(1);
263
+ expect(group).not.toBeNull();
264
+ expect(group!.group_type).toBe('batch');
265
+ });
266
+
267
+ it('returns null/undefined when scope is not in any active group', () => {
268
+ expect(service.getActiveGroupForScope(99)).toBeFalsy();
269
+ });
270
+ });
271
+ });
@@ -1,5 +1,5 @@
1
1
  import type Database from 'better-sqlite3';
2
- import type { Server } from 'socket.io';
2
+ import type { Emitter } from '../project-emitter.js';
3
3
  import type { ScopeService } from './scope-service.js';
4
4
  import { createLogger } from '../utils/logger.js';
5
5
 
@@ -84,7 +84,7 @@ export interface SprintDetail {
84
84
  export class SprintService {
85
85
  constructor(
86
86
  private db: Database.Database,
87
- private io: Server,
87
+ private io: Emitter,
88
88
  private scopeService: ScopeService,
89
89
  ) {}
90
90
 
@@ -129,7 +129,25 @@ export class SprintService {
129
129
  } else {
130
130
  rows = this.db.prepare('SELECT * FROM sprints ORDER BY created_at DESC').all() as SprintRow[];
131
131
  }
132
- return rows.map((row) => this.buildDetail(row));
132
+ if (rows.length === 0) return [];
133
+
134
+ // Batch-fetch all sprint_scopes in one query to avoid N+1
135
+ const sprintIds = rows.map(r => r.id);
136
+ const placeholders = sprintIds.map(() => '?').join(',');
137
+ const allScopeRows = this.db.prepare(
138
+ `SELECT sprint_id, scope_id, layer, dispatch_status FROM sprint_scopes
139
+ WHERE sprint_id IN (${placeholders}) ORDER BY layer ASC, scope_id ASC`,
140
+ ).all(...sprintIds) as Array<{ sprint_id: number; scope_id: number; layer: number | null; dispatch_status: SprintScopeStatus }>;
141
+
142
+ // Group by sprint_id
143
+ const scopesBySprintId = new Map<number, typeof allScopeRows>();
144
+ for (const ss of allScopeRows) {
145
+ let arr = scopesBySprintId.get(ss.sprint_id);
146
+ if (!arr) { arr = []; scopesBySprintId.set(ss.sprint_id, arr); }
147
+ arr.push(ss);
148
+ }
149
+
150
+ return rows.map((row) => this.buildDetailFromScopes(row, scopesBySprintId.get(row.id) ?? []));
133
151
  }
134
152
 
135
153
  /** Get full sprint detail by ID */
@@ -139,10 +157,10 @@ export class SprintService {
139
157
  return this.buildDetail(row);
140
158
  }
141
159
 
142
- /** Delete a sprint (only if assembling) */
160
+ /** Delete a sprint/batch (assembling, failed, or cancelled) */
143
161
  delete(id: number): boolean {
144
162
  const row = this.db.prepare('SELECT status FROM sprints WHERE id = ?').get(id) as { status: string } | undefined;
145
- if (!row || row.status !== 'assembling') return false;
163
+ if (!row || !['assembling', 'failed', 'cancelled', 'completed'].includes(row.status)) return false;
146
164
 
147
165
  this.db.prepare('DELETE FROM sprint_scopes WHERE sprint_id = ?').run(id);
148
166
  this.db.prepare('DELETE FROM sprints WHERE id = ?').run(id);
@@ -352,7 +370,13 @@ export class SprintService {
352
370
  `SELECT scope_id, layer, dispatch_status FROM sprint_scopes
353
371
  WHERE sprint_id = ? ORDER BY layer ASC, scope_id ASC`,
354
372
  ).all(row.id) as Array<{ scope_id: number; layer: number | null; dispatch_status: SprintScopeStatus }>;
373
+ return this.buildDetailFromScopes(row, ssRows);
374
+ }
355
375
 
376
+ private buildDetailFromScopes(
377
+ row: SprintRow,
378
+ ssRows: Array<{ scope_id: number; layer: number | null; dispatch_status: SprintScopeStatus }>,
379
+ ): SprintDetail {
356
380
  const progress = { pending: 0, in_progress: 0, completed: 0, failed: 0, skipped: 0 };
357
381
  const scopes: SprintDetail['scopes'] = [];
358
382