orbital-command 0.1.4 → 0.3.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 (380) hide show
  1. package/bin/orbital.js +676 -53
  2. package/dist/assets/PrimitivesConfig-CrmQXYh4.js +32 -0
  3. package/dist/assets/QualityGates-BbasOsF3.js +21 -0
  4. package/dist/assets/SessionTimeline-CGeJsVvy.js +1 -0
  5. package/dist/assets/Settings-oiM496mc.js +12 -0
  6. package/dist/assets/SourceControl-B1fP2nJL.js +41 -0
  7. package/dist/assets/WorkflowVisualizer-CWLYf-f0.js +74 -0
  8. package/dist/assets/arrow-down-CPy85_J6.js +6 -0
  9. package/dist/assets/charts-DbDg0Psc.js +68 -0
  10. package/dist/assets/circle-x-Cwz6ZQDV.js +6 -0
  11. package/dist/assets/file-text-C46Xr65c.js +6 -0
  12. package/dist/assets/formatDistanceToNow-BMqsSP44.js +1 -0
  13. package/dist/assets/globe-Cn2yNZUD.js +6 -0
  14. package/dist/assets/index-Aj4sV8Al.css +1 -0
  15. package/dist/assets/index-Bc9dK3MW.js +354 -0
  16. package/dist/assets/key-OPaNTWJ5.js +6 -0
  17. package/dist/assets/minus-GMsbpKym.js +6 -0
  18. package/dist/assets/shield-DwAFkDYI.js +6 -0
  19. package/dist/assets/ui-BmsSg9jU.js +53 -0
  20. package/dist/assets/useWorkflowEditor-BJkTX_NR.js +16 -0
  21. package/dist/assets/{vendor-Dzv9lrRc.js → vendor-Bqt8AJn2.js} +1 -1
  22. package/dist/assets/zap-DfbUoOty.js +11 -0
  23. package/dist/favicon.svg +1 -0
  24. package/dist/index.html +6 -5
  25. package/dist/server/server/__tests__/data-routes.test.js +124 -0
  26. package/dist/server/server/__tests__/helpers/db.js +17 -0
  27. package/dist/server/server/__tests__/helpers/mock-emitter.js +8 -0
  28. package/dist/server/server/__tests__/scope-routes.test.js +137 -0
  29. package/dist/server/server/__tests__/sprint-routes.test.js +102 -0
  30. package/dist/server/server/__tests__/workflow-routes.test.js +107 -0
  31. package/dist/server/server/config-migrator.js +138 -0
  32. package/dist/server/server/config.js +17 -2
  33. package/dist/server/server/database.js +27 -12
  34. package/dist/server/server/global-config.js +143 -0
  35. package/dist/server/server/index.js +882 -252
  36. package/dist/server/server/init.js +579 -194
  37. package/dist/server/server/launch.js +29 -0
  38. package/dist/server/server/manifest-types.js +8 -0
  39. package/dist/server/server/manifest.js +454 -0
  40. package/dist/server/server/migrate-legacy.js +229 -0
  41. package/dist/server/server/parsers/event-parser.test.js +117 -0
  42. package/dist/server/server/parsers/scope-parser.js +74 -28
  43. package/dist/server/server/parsers/scope-parser.test.js +230 -0
  44. package/dist/server/server/project-context.js +255 -0
  45. package/dist/server/server/project-emitter.js +41 -0
  46. package/dist/server/server/project-manager.js +297 -0
  47. package/dist/server/server/routes/config-routes.js +1 -3
  48. package/dist/server/server/routes/data-routes.js +22 -110
  49. package/dist/server/server/routes/dispatch-routes.js +15 -9
  50. package/dist/server/server/routes/git-routes.js +74 -0
  51. package/dist/server/server/routes/manifest-routes.js +319 -0
  52. package/dist/server/server/routes/scope-routes.js +37 -23
  53. package/dist/server/server/routes/sync-routes.js +134 -0
  54. package/dist/server/server/routes/version-routes.js +1 -15
  55. package/dist/server/server/routes/workflow-routes.js +9 -3
  56. package/dist/server/server/schema.js +2 -0
  57. package/dist/server/server/services/batch-orchestrator.js +26 -16
  58. package/dist/server/server/services/claude-session-service.js +17 -14
  59. package/dist/server/server/services/deploy-service.test.js +119 -0
  60. package/dist/server/server/services/event-service.js +64 -1
  61. package/dist/server/server/services/event-service.test.js +191 -0
  62. package/dist/server/server/services/gate-service.test.js +105 -0
  63. package/dist/server/server/services/git-service.js +108 -4
  64. package/dist/server/server/services/github-service.js +110 -2
  65. package/dist/server/server/services/readiness-service.test.js +190 -0
  66. package/dist/server/server/services/scope-cache.js +5 -1
  67. package/dist/server/server/services/scope-cache.test.js +142 -0
  68. package/dist/server/server/services/scope-service.js +217 -126
  69. package/dist/server/server/services/scope-service.test.js +137 -0
  70. package/dist/server/server/services/sprint-orchestrator.js +7 -6
  71. package/dist/server/server/services/sprint-service.js +21 -1
  72. package/dist/server/server/services/sprint-service.test.js +238 -0
  73. package/dist/server/server/services/sync-service.js +434 -0
  74. package/dist/server/server/services/sync-types.js +2 -0
  75. package/dist/server/server/services/telemetry-service.js +143 -0
  76. package/dist/server/server/services/workflow-service.js +26 -5
  77. package/dist/server/server/services/workflow-service.test.js +159 -0
  78. package/dist/server/server/settings-sync.js +284 -0
  79. package/dist/server/server/update-planner.js +279 -0
  80. package/dist/server/server/utils/cc-hooks-parser.js +3 -0
  81. package/dist/server/server/utils/cc-hooks-parser.test.js +86 -0
  82. package/dist/server/server/utils/dispatch-utils.js +77 -20
  83. package/dist/server/server/utils/dispatch-utils.test.js +182 -0
  84. package/dist/server/server/utils/logger.js +37 -3
  85. package/dist/server/server/utils/package-info.js +30 -0
  86. package/dist/server/server/utils/route-helpers.js +10 -0
  87. package/dist/server/server/utils/terminal-launcher.js +79 -25
  88. package/dist/server/server/utils/worktree-manager.js +13 -4
  89. package/dist/server/server/validator.js +230 -0
  90. package/dist/server/server/watchers/global-watcher.js +63 -0
  91. package/dist/server/server/watchers/scope-watcher.js +27 -12
  92. package/dist/server/server/wizard/config-editor.js +237 -0
  93. package/dist/server/server/wizard/detect.js +96 -0
  94. package/dist/server/server/wizard/doctor.js +115 -0
  95. package/dist/server/server/wizard/index.js +155 -0
  96. package/dist/server/server/wizard/phases/confirm.js +39 -0
  97. package/dist/server/server/wizard/phases/project-setup.js +90 -0
  98. package/dist/server/server/wizard/phases/setup-wizard.js +66 -0
  99. package/dist/server/server/wizard/phases/welcome.js +35 -0
  100. package/dist/server/server/wizard/phases/workflow-setup.js +22 -0
  101. package/dist/server/server/wizard/types.js +29 -0
  102. package/dist/server/server/wizard/ui.js +74 -0
  103. package/dist/server/shared/__fixtures__/workflow-configs.js +75 -0
  104. package/dist/server/shared/default-workflow.json +65 -0
  105. package/dist/server/shared/onboarding-tour.test.js +81 -0
  106. package/dist/server/shared/project-colors.js +24 -0
  107. package/dist/server/shared/workflow-config.test.js +84 -0
  108. package/dist/server/shared/workflow-engine.test.js +302 -0
  109. package/dist/server/shared/workflow-normalizer.js +101 -0
  110. package/dist/server/shared/workflow-normalizer.test.js +100 -0
  111. package/dist/server/src/components/onboarding/tour-steps.js +84 -0
  112. package/package.json +20 -15
  113. package/schemas/orbital.config.schema.json +16 -1
  114. package/scripts/postinstall.js +55 -7
  115. package/server/__tests__/data-routes.test.ts +149 -0
  116. package/server/__tests__/helpers/db.ts +19 -0
  117. package/server/__tests__/helpers/mock-emitter.ts +10 -0
  118. package/server/__tests__/scope-routes.test.ts +157 -0
  119. package/server/__tests__/sprint-routes.test.ts +118 -0
  120. package/server/__tests__/workflow-routes.test.ts +120 -0
  121. package/server/config-migrator.ts +163 -0
  122. package/server/config.ts +26 -2
  123. package/server/database.ts +35 -18
  124. package/server/global-config.ts +200 -0
  125. package/server/index.ts +975 -287
  126. package/server/init.ts +625 -182
  127. package/server/launch.ts +32 -0
  128. package/server/manifest-types.ts +145 -0
  129. package/server/manifest.ts +494 -0
  130. package/server/migrate-legacy.ts +290 -0
  131. package/server/parsers/event-parser.test.ts +135 -0
  132. package/server/parsers/scope-parser.test.ts +270 -0
  133. package/server/parsers/scope-parser.ts +79 -31
  134. package/server/project-context.ts +309 -0
  135. package/server/project-emitter.ts +50 -0
  136. package/server/project-manager.ts +369 -0
  137. package/server/routes/config-routes.ts +3 -5
  138. package/server/routes/data-routes.ts +28 -141
  139. package/server/routes/dispatch-routes.ts +19 -11
  140. package/server/routes/git-routes.ts +77 -0
  141. package/server/routes/manifest-routes.ts +388 -0
  142. package/server/routes/scope-routes.ts +29 -25
  143. package/server/routes/sync-routes.ts +175 -0
  144. package/server/routes/version-routes.ts +1 -16
  145. package/server/routes/workflow-routes.ts +9 -3
  146. package/server/schema.ts +2 -0
  147. package/server/services/batch-orchestrator.ts +24 -16
  148. package/server/services/claude-session-service.ts +16 -14
  149. package/server/services/deploy-service.test.ts +145 -0
  150. package/server/services/deploy-service.ts +2 -2
  151. package/server/services/event-service.test.ts +242 -0
  152. package/server/services/event-service.ts +92 -3
  153. package/server/services/gate-service.test.ts +131 -0
  154. package/server/services/gate-service.ts +2 -2
  155. package/server/services/git-service.ts +137 -4
  156. package/server/services/github-service.ts +120 -2
  157. package/server/services/readiness-service.test.ts +217 -0
  158. package/server/services/scope-cache.test.ts +167 -0
  159. package/server/services/scope-cache.ts +4 -1
  160. package/server/services/scope-service.test.ts +169 -0
  161. package/server/services/scope-service.ts +220 -126
  162. package/server/services/sprint-orchestrator.ts +7 -7
  163. package/server/services/sprint-service.test.ts +271 -0
  164. package/server/services/sprint-service.ts +27 -3
  165. package/server/services/sync-service.ts +482 -0
  166. package/server/services/sync-types.ts +77 -0
  167. package/server/services/telemetry-service.ts +195 -0
  168. package/server/services/workflow-service.test.ts +190 -0
  169. package/server/services/workflow-service.ts +29 -9
  170. package/server/settings-sync.ts +359 -0
  171. package/server/update-planner.ts +346 -0
  172. package/server/utils/cc-hooks-parser.test.ts +96 -0
  173. package/server/utils/cc-hooks-parser.ts +4 -0
  174. package/server/utils/dispatch-utils.test.ts +245 -0
  175. package/server/utils/dispatch-utils.ts +97 -27
  176. package/server/utils/logger.ts +40 -3
  177. package/server/utils/package-info.ts +32 -0
  178. package/server/utils/route-helpers.ts +12 -0
  179. package/server/utils/terminal-launcher.ts +85 -25
  180. package/server/utils/worktree-manager.ts +9 -4
  181. package/server/validator.ts +270 -0
  182. package/server/watchers/global-watcher.ts +77 -0
  183. package/server/watchers/scope-watcher.ts +21 -9
  184. package/server/wizard/config-editor.ts +248 -0
  185. package/server/wizard/detect.ts +104 -0
  186. package/server/wizard/doctor.ts +114 -0
  187. package/server/wizard/index.ts +187 -0
  188. package/server/wizard/phases/confirm.ts +45 -0
  189. package/server/wizard/phases/project-setup.ts +106 -0
  190. package/server/wizard/phases/setup-wizard.ts +78 -0
  191. package/server/wizard/phases/welcome.ts +43 -0
  192. package/server/wizard/phases/workflow-setup.ts +28 -0
  193. package/server/wizard/types.ts +56 -0
  194. package/server/wizard/ui.ts +93 -0
  195. package/shared/__fixtures__/workflow-configs.ts +80 -0
  196. package/shared/default-workflow.json +65 -0
  197. package/shared/onboarding-tour.test.ts +94 -0
  198. package/shared/project-colors.ts +24 -0
  199. package/shared/workflow-config.test.ts +111 -0
  200. package/shared/workflow-config.ts +7 -0
  201. package/shared/workflow-engine.test.ts +388 -0
  202. package/shared/workflow-normalizer.test.ts +119 -0
  203. package/shared/workflow-normalizer.ts +118 -0
  204. package/templates/hooks/end-session.sh +3 -1
  205. package/templates/hooks/orbital-emit.sh +2 -2
  206. package/templates/hooks/orbital-report-deploy.sh +4 -4
  207. package/templates/hooks/orbital-report-gates.sh +4 -4
  208. package/templates/hooks/orbital-scope-update.sh +1 -1
  209. package/templates/hooks/scope-create-cleanup.sh +2 -2
  210. package/templates/hooks/scope-create-gate.sh +0 -1
  211. package/templates/hooks/scope-helpers.sh +18 -0
  212. package/templates/hooks/scope-prepare.sh +66 -11
  213. package/templates/migrations/renames.json +1 -0
  214. package/templates/orbital.config.json +7 -2
  215. package/templates/settings-hooks.json +1 -1
  216. package/templates/skills/git-commit/SKILL.md +9 -4
  217. package/templates/skills/git-dev/SKILL.md +8 -3
  218. package/templates/skills/git-main/SKILL.md +8 -2
  219. package/templates/skills/git-production/SKILL.md +6 -2
  220. package/templates/skills/git-staging/SKILL.md +8 -3
  221. package/templates/skills/scope-create/SKILL.md +17 -3
  222. package/templates/skills/scope-fix-review/SKILL.md +6 -3
  223. package/templates/skills/scope-implement/SKILL.md +4 -1
  224. package/templates/skills/scope-post-review/SKILL.md +63 -5
  225. package/templates/skills/scope-pre-review/SKILL.md +5 -2
  226. package/templates/skills/scope-verify/SKILL.md +5 -3
  227. package/templates/skills/test-code-review/SKILL.md +41 -33
  228. package/templates/skills/test-scaffold/SKILL.md +222 -0
  229. package/dist/assets/WorkflowVisualizer-BZ21PIIF.js +0 -84
  230. package/dist/assets/charts-D__PA1zp.js +0 -72
  231. package/dist/assets/index-D1G6i0nS.css +0 -1
  232. package/dist/assets/index-DpItvKpf.js +0 -419
  233. package/dist/assets/ui-BvF022GT.js +0 -53
  234. package/index.html +0 -15
  235. package/postcss.config.js +0 -6
  236. package/src/App.tsx +0 -33
  237. package/src/components/AgentBadge.tsx +0 -40
  238. package/src/components/BatchPreflightModal.tsx +0 -115
  239. package/src/components/CardDisplayToggle.tsx +0 -74
  240. package/src/components/ColumnHeaderActions.tsx +0 -55
  241. package/src/components/ColumnMenu.tsx +0 -99
  242. package/src/components/DeployHistory.tsx +0 -141
  243. package/src/components/DispatchModal.tsx +0 -164
  244. package/src/components/DispatchPopover.tsx +0 -139
  245. package/src/components/DragOverlay.tsx +0 -25
  246. package/src/components/DriftSidebar.tsx +0 -140
  247. package/src/components/EnvironmentStrip.tsx +0 -88
  248. package/src/components/ErrorBoundary.tsx +0 -62
  249. package/src/components/FilterChip.tsx +0 -105
  250. package/src/components/GateIndicator.tsx +0 -33
  251. package/src/components/IdeaDetailModal.tsx +0 -190
  252. package/src/components/IdeaFormDialog.tsx +0 -113
  253. package/src/components/KanbanColumn.tsx +0 -201
  254. package/src/components/MarkdownRenderer.tsx +0 -114
  255. package/src/components/NeonGrid.tsx +0 -128
  256. package/src/components/PromotionQueue.tsx +0 -89
  257. package/src/components/ScopeCard.tsx +0 -234
  258. package/src/components/ScopeDetailModal.tsx +0 -255
  259. package/src/components/ScopeFilterBar.tsx +0 -152
  260. package/src/components/SearchInput.tsx +0 -102
  261. package/src/components/SessionPanel.tsx +0 -335
  262. package/src/components/SprintContainer.tsx +0 -303
  263. package/src/components/SprintDependencyDialog.tsx +0 -78
  264. package/src/components/SprintPreflightModal.tsx +0 -138
  265. package/src/components/StatusBar.tsx +0 -168
  266. package/src/components/SwimCell.tsx +0 -67
  267. package/src/components/SwimLaneRow.tsx +0 -94
  268. package/src/components/SwimlaneBoardView.tsx +0 -108
  269. package/src/components/VersionBadge.tsx +0 -139
  270. package/src/components/ViewModeSelector.tsx +0 -114
  271. package/src/components/config/AgentChip.tsx +0 -53
  272. package/src/components/config/AgentCreateDialog.tsx +0 -321
  273. package/src/components/config/AgentEditor.tsx +0 -175
  274. package/src/components/config/DirectoryTree.tsx +0 -582
  275. package/src/components/config/FileEditor.tsx +0 -550
  276. package/src/components/config/HookChip.tsx +0 -50
  277. package/src/components/config/StageCard.tsx +0 -198
  278. package/src/components/config/TransitionZone.tsx +0 -173
  279. package/src/components/config/UnifiedWorkflowPipeline.tsx +0 -216
  280. package/src/components/config/WorkflowPipeline.tsx +0 -161
  281. package/src/components/source-control/BranchList.tsx +0 -93
  282. package/src/components/source-control/BranchPanel.tsx +0 -105
  283. package/src/components/source-control/CommitLog.tsx +0 -100
  284. package/src/components/source-control/CommitRow.tsx +0 -47
  285. package/src/components/source-control/GitHubPanel.tsx +0 -110
  286. package/src/components/source-control/GitHubSetupGuide.tsx +0 -52
  287. package/src/components/source-control/GitOverviewBar.tsx +0 -101
  288. package/src/components/source-control/PullRequestList.tsx +0 -69
  289. package/src/components/source-control/WorktreeList.tsx +0 -80
  290. package/src/components/ui/badge.tsx +0 -41
  291. package/src/components/ui/button.tsx +0 -55
  292. package/src/components/ui/card.tsx +0 -78
  293. package/src/components/ui/dialog.tsx +0 -94
  294. package/src/components/ui/popover.tsx +0 -33
  295. package/src/components/ui/scroll-area.tsx +0 -54
  296. package/src/components/ui/separator.tsx +0 -28
  297. package/src/components/ui/tabs.tsx +0 -52
  298. package/src/components/ui/toggle-switch.tsx +0 -35
  299. package/src/components/ui/tooltip.tsx +0 -27
  300. package/src/components/workflow/AddEdgeDialog.tsx +0 -217
  301. package/src/components/workflow/AddListDialog.tsx +0 -201
  302. package/src/components/workflow/ChecklistEditor.tsx +0 -239
  303. package/src/components/workflow/CommandPrefixManager.tsx +0 -118
  304. package/src/components/workflow/ConfigSettingsPanel.tsx +0 -189
  305. package/src/components/workflow/DirectionSelector.tsx +0 -133
  306. package/src/components/workflow/DispatchConfigPanel.tsx +0 -180
  307. package/src/components/workflow/EdgeDetailPanel.tsx +0 -236
  308. package/src/components/workflow/EdgePropertyEditor.tsx +0 -251
  309. package/src/components/workflow/EditToolbar.tsx +0 -138
  310. package/src/components/workflow/HookDetailPanel.tsx +0 -250
  311. package/src/components/workflow/HookExecutionLog.tsx +0 -24
  312. package/src/components/workflow/HookSourceModal.tsx +0 -129
  313. package/src/components/workflow/HooksDashboard.tsx +0 -363
  314. package/src/components/workflow/ListPropertyEditor.tsx +0 -251
  315. package/src/components/workflow/MigrationPreviewDialog.tsx +0 -237
  316. package/src/components/workflow/MovementRulesPanel.tsx +0 -188
  317. package/src/components/workflow/NodeDetailPanel.tsx +0 -245
  318. package/src/components/workflow/PresetSelector.tsx +0 -414
  319. package/src/components/workflow/SkillCommandBuilder.tsx +0 -174
  320. package/src/components/workflow/WorkflowEdgeComponent.tsx +0 -145
  321. package/src/components/workflow/WorkflowNode.tsx +0 -147
  322. package/src/components/workflow/graphLayout.ts +0 -186
  323. package/src/components/workflow/mergeHooks.ts +0 -85
  324. package/src/components/workflow/useEditHistory.ts +0 -88
  325. package/src/components/workflow/useWorkflowEditor.ts +0 -262
  326. package/src/components/workflow/validateConfig.ts +0 -70
  327. package/src/hooks/useActiveDispatches.ts +0 -198
  328. package/src/hooks/useBoardSettings.ts +0 -170
  329. package/src/hooks/useCardDisplay.ts +0 -57
  330. package/src/hooks/useCcHooks.ts +0 -24
  331. package/src/hooks/useConfigTree.ts +0 -51
  332. package/src/hooks/useEnforcementRules.ts +0 -46
  333. package/src/hooks/useEvents.ts +0 -59
  334. package/src/hooks/useFileEditor.ts +0 -165
  335. package/src/hooks/useGates.ts +0 -57
  336. package/src/hooks/useIdeaActions.ts +0 -53
  337. package/src/hooks/useKanbanDnd.ts +0 -410
  338. package/src/hooks/useOrbitalConfig.ts +0 -54
  339. package/src/hooks/usePipeline.ts +0 -47
  340. package/src/hooks/usePipelineData.ts +0 -338
  341. package/src/hooks/useReconnect.ts +0 -25
  342. package/src/hooks/useScopeFilters.ts +0 -125
  343. package/src/hooks/useScopeSessions.ts +0 -44
  344. package/src/hooks/useScopes.ts +0 -67
  345. package/src/hooks/useSearch.ts +0 -67
  346. package/src/hooks/useSettings.tsx +0 -187
  347. package/src/hooks/useSocket.ts +0 -25
  348. package/src/hooks/useSourceControl.ts +0 -105
  349. package/src/hooks/useSprintPreflight.ts +0 -55
  350. package/src/hooks/useSprints.ts +0 -154
  351. package/src/hooks/useStatusBarHighlight.ts +0 -18
  352. package/src/hooks/useSwimlaneBoardSettings.ts +0 -104
  353. package/src/hooks/useTheme.ts +0 -9
  354. package/src/hooks/useTransitionReadiness.ts +0 -53
  355. package/src/hooks/useVersion.ts +0 -155
  356. package/src/hooks/useViolations.ts +0 -65
  357. package/src/hooks/useWorkflow.tsx +0 -125
  358. package/src/hooks/useZoomModifier.ts +0 -19
  359. package/src/index.css +0 -797
  360. package/src/layouts/DashboardLayout.tsx +0 -113
  361. package/src/lib/collisionDetection.ts +0 -20
  362. package/src/lib/scope-fields.ts +0 -61
  363. package/src/lib/swimlane.ts +0 -146
  364. package/src/lib/utils.ts +0 -15
  365. package/src/main.tsx +0 -19
  366. package/src/socket.ts +0 -11
  367. package/src/types/index.ts +0 -497
  368. package/src/views/AgentFeed.tsx +0 -339
  369. package/src/views/DeployPipeline.tsx +0 -59
  370. package/src/views/EnforcementView.tsx +0 -378
  371. package/src/views/PrimitivesConfig.tsx +0 -500
  372. package/src/views/QualityGates.tsx +0 -1012
  373. package/src/views/ScopeBoard.tsx +0 -454
  374. package/src/views/SessionTimeline.tsx +0 -516
  375. package/src/views/Settings.tsx +0 -183
  376. package/src/views/SourceControl.tsx +0 -95
  377. package/src/views/WorkflowVisualizer.tsx +0 -382
  378. package/tailwind.config.js +0 -161
  379. package/tsconfig.json +0 -25
  380. package/vite.config.ts +0 -49
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Phase 1: Project configuration — name, commands, ports.
3
+ */
4
+
5
+ import * as p from '@clack/prompts';
6
+ import type { ProjectSetupState } from '../types.js';
7
+ import { NOTES, formatDetectedCommands } from '../ui.js';
8
+ import { detectProjectName, detectCommands, detectPortConflict } from '../detect.js';
9
+
10
+ export async function phaseProjectSetup(state: ProjectSetupState): Promise<void> {
11
+ p.note(NOTES.projectConfig, 'Project Configuration');
12
+
13
+ // 1. Project name
14
+ const defaultName = detectProjectName(state.projectRoot);
15
+ const name = await p.text({
16
+ message: 'Project name',
17
+ placeholder: defaultName,
18
+ defaultValue: defaultName,
19
+ });
20
+
21
+ if (p.isCancel(name)) {
22
+ p.cancel('Setup cancelled.');
23
+ process.exit(0);
24
+ }
25
+ state.projectName = name;
26
+
27
+ // 2. Command detection
28
+ const detected = detectCommands(state.projectRoot);
29
+ state.detectedCommands = detected;
30
+ const detectedCount = Object.values(detected).filter(v => v !== null).length;
31
+
32
+ if (detectedCount > 0) {
33
+ p.note(formatDetectedCommands(detected), `Detected ${detectedCount} command(s) from package.json`);
34
+
35
+ const useDetected = await p.confirm({
36
+ message: 'Use these detected commands for quality gates?',
37
+ initialValue: true,
38
+ });
39
+
40
+ if (p.isCancel(useDetected)) {
41
+ p.cancel('Setup cancelled.');
42
+ process.exit(0);
43
+ }
44
+
45
+ if (useDetected) {
46
+ state.selectedCommands = { ...detected };
47
+ } else {
48
+ state.selectedCommands = await promptCommands(detected);
49
+ }
50
+ } else {
51
+ p.log.info('No build commands detected from package.json. You can configure them later with `orbital config`.');
52
+ state.selectedCommands = detected;
53
+ }
54
+
55
+ // 3. Port conflict detection
56
+ const conflict = detectPortConflict(4444);
57
+ if (conflict) {
58
+ p.log.warn(`Port 4444 is already used by "${conflict}".`);
59
+
60
+ const serverPort = await p.text({
61
+ message: 'Server port',
62
+ placeholder: '4446',
63
+ defaultValue: '4446',
64
+ validate: (val) => {
65
+ const n = Number(val);
66
+ if (isNaN(n) || n < 1 || n > 65535) return 'Must be a valid port (1-65535)';
67
+ return undefined;
68
+ },
69
+ });
70
+
71
+ if (p.isCancel(serverPort)) {
72
+ p.cancel('Setup cancelled.');
73
+ process.exit(0);
74
+ }
75
+
76
+ state.serverPort = Number(serverPort);
77
+ state.clientPort = state.serverPort + 1;
78
+ }
79
+ }
80
+
81
+ async function promptCommands(defaults: Record<string, string | null>): Promise<Record<string, string | null>> {
82
+ const commands: Record<string, string | null> = {};
83
+ const labels: Record<string, string> = {
84
+ typeCheck: 'Type check command',
85
+ lint: 'Lint command',
86
+ build: 'Build command',
87
+ test: 'Test command',
88
+ };
89
+
90
+ for (const [key, defaultVal] of Object.entries(defaults)) {
91
+ const val = await p.text({
92
+ message: labels[key] || key,
93
+ placeholder: defaultVal || 'none',
94
+ defaultValue: defaultVal || '',
95
+ });
96
+
97
+ if (p.isCancel(val)) {
98
+ p.cancel('Setup cancelled.');
99
+ process.exit(0);
100
+ }
101
+
102
+ commands[key] = val || null;
103
+ }
104
+
105
+ return commands;
106
+ }
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Phase 1: Setup Wizard — runs on first install or when ~/.orbital/ is missing.
3
+ *
4
+ * Creates the Orbital home directory, seeds primitives, and optionally
5
+ * lets the user link projects immediately.
6
+ */
7
+
8
+ import fs from 'fs';
9
+ import * as p from '@clack/prompts';
10
+ import pc from 'picocolors';
11
+ import type { SetupState } from '../types.js';
12
+ import { NOTES } from '../ui.js';
13
+ import { isValidProjectPath, resolveProjectPath, ORBITAL_HOME } from '../detect.js';
14
+
15
+ export async function phaseSetupWizard(state: SetupState): Promise<void> {
16
+ // Welcome and core concepts
17
+ p.note(NOTES.setupWelcome, 'Welcome');
18
+
19
+ // Create ~/.orbital/ and seed primitives
20
+ const s = p.spinner();
21
+ s.start('Setting up Orbital Command...');
22
+
23
+ try {
24
+ const { ensureOrbitalHome } = await import('../../global-config.js');
25
+ const { seedGlobalPrimitives } = await import('../../init.js');
26
+
27
+ ensureOrbitalHome();
28
+ seedGlobalPrimitives();
29
+
30
+ // Create empty registry if it doesn't exist
31
+ const registryPath = `${ORBITAL_HOME}/config.json`;
32
+ if (!fs.existsSync(registryPath)) {
33
+ fs.writeFileSync(registryPath, JSON.stringify({ version: 1, projects: [] }, null, 2), 'utf8');
34
+ }
35
+
36
+ s.stop('Orbital Command is ready.');
37
+ } catch (err) {
38
+ s.stop('Setup failed.');
39
+ p.log.error(err instanceof Error ? err.message : String(err));
40
+ process.exit(1);
41
+ }
42
+
43
+ // Offer to link projects
44
+ p.note(NOTES.addProject, 'Projects');
45
+
46
+ let addMore = true;
47
+ while (addMore) {
48
+ const wantsProject = await p.confirm({
49
+ message: state.linkedProjects.length === 0
50
+ ? 'Add a project now?'
51
+ : 'Add another project?',
52
+ initialValue: state.linkedProjects.length === 0,
53
+ });
54
+
55
+ if (p.isCancel(wantsProject) || !wantsProject) {
56
+ addMore = false;
57
+ break;
58
+ }
59
+
60
+ const projectPath = await p.text({
61
+ message: 'Project path',
62
+ placeholder: '~/Code/my-project',
63
+ validate: (val) => {
64
+ if (!val || !val.trim()) return 'Path is required';
65
+ return isValidProjectPath(val.trim());
66
+ },
67
+ });
68
+
69
+ if (p.isCancel(projectPath)) {
70
+ addMore = false;
71
+ break;
72
+ }
73
+
74
+ const resolved = resolveProjectPath(projectPath.trim());
75
+ state.linkedProjects.push(resolved);
76
+ p.log.success(`Added: ${pc.cyan(resolved)}`);
77
+ }
78
+ }
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Phase 2 welcome gate — project-scoped only.
3
+ *
4
+ * If the project is already initialized, offers re-init or config editor.
5
+ * If not, returns false to continue the project setup flow.
6
+ */
7
+
8
+ import * as p from '@clack/prompts';
9
+ import pc from 'picocolors';
10
+ import type { ProjectSetupState } from '../types.js';
11
+ import { NOTES } from '../ui.js';
12
+ import { runConfigEditor } from '../config-editor.js';
13
+
14
+ export async function phaseWelcome(state: ProjectSetupState): Promise<boolean> {
15
+ if (state.isProjectInitialized) {
16
+ p.note(NOTES.reconfigure, pc.yellow('Already Initialized'));
17
+
18
+ const action = await p.select({
19
+ message: 'What would you like to do?',
20
+ options: [
21
+ { value: 'reinit', label: 'Re-initialize (--force)', hint: 'reset all templates to defaults' },
22
+ { value: 'configure', label: 'Open config editor', hint: 'modify settings without resetting' },
23
+ { value: 'cancel', label: 'Cancel' },
24
+ ],
25
+ });
26
+
27
+ if (p.isCancel(action) || action === 'cancel') {
28
+ p.cancel('Cancelled.');
29
+ process.exit(0);
30
+ }
31
+
32
+ if (action === 'configure') {
33
+ await runConfigEditor(state.projectRoot, state.packageVersion, []);
34
+ process.exit(0);
35
+ }
36
+
37
+ // Re-init — continue through the full project setup with force
38
+ return true;
39
+ }
40
+
41
+ // Not initialized — continue normally
42
+ return false;
43
+ }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Phase 2: Workflow preset selection.
3
+ */
4
+
5
+ import * as p from '@clack/prompts';
6
+ import type { ProjectSetupState } from '../types.js';
7
+ import { WORKFLOW_PRESETS } from '../types.js';
8
+ import { NOTES } from '../ui.js';
9
+
10
+ export async function phaseWorkflowSetup(state: ProjectSetupState): Promise<void> {
11
+ p.note(NOTES.workflow, 'Workflow Selection');
12
+
13
+ const preset = await p.select({
14
+ message: 'Choose a workflow preset',
15
+ options: WORKFLOW_PRESETS.map(p => ({
16
+ value: p.value,
17
+ label: p.label,
18
+ hint: p.hint,
19
+ })),
20
+ });
21
+
22
+ if (p.isCancel(preset)) {
23
+ p.cancel('Setup cancelled.');
24
+ process.exit(0);
25
+ }
26
+
27
+ state.workflowPreset = preset as string;
28
+ }
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Types for the interactive CLI wizard.
3
+ *
4
+ * Two wizard flows:
5
+ * Phase 1 (SetupState) — first-time Orbital setup, ~/.orbital/ creation
6
+ * Phase 2 (ProjectSetupState) — per-project scaffolding into .claude/
7
+ */
8
+
9
+ export interface SetupState {
10
+ packageVersion: string;
11
+ isFirstTime: boolean; // ~/.orbital/ doesn't exist yet
12
+ linkedProjects: string[]; // project paths added during setup
13
+ }
14
+
15
+ export interface ProjectSetupState {
16
+ projectRoot: string;
17
+ isProjectInitialized: boolean; // .claude/orbital.config.json exists
18
+ packageVersion: string;
19
+
20
+ // Collected from phases
21
+ projectName?: string;
22
+ serverPort?: number;
23
+ clientPort?: number;
24
+ detectedCommands?: Record<string, string | null>;
25
+ selectedCommands?: Record<string, string | null>;
26
+ workflowPreset?: string; // 'default' | 'minimal' | 'development' | 'gitflow'
27
+ }
28
+
29
+ export interface PresetInfo {
30
+ value: string;
31
+ label: string;
32
+ hint: string;
33
+ }
34
+
35
+ export const WORKFLOW_PRESETS: PresetInfo[] = [
36
+ {
37
+ value: 'default',
38
+ label: 'Default',
39
+ hint: '7 lists, trunk-based — Icebox → Planning → Backlog → Implementing → Review → Completed → Main',
40
+ },
41
+ {
42
+ value: 'minimal',
43
+ label: 'Minimal',
44
+ hint: '3 lists — To Do → In Progress → Done',
45
+ },
46
+ {
47
+ value: 'development',
48
+ label: 'Development',
49
+ hint: '5 lists, dev branch — Backlog → Implementing → Review → Completed → Dev',
50
+ },
51
+ {
52
+ value: 'gitflow',
53
+ label: 'Gitflow',
54
+ hint: '9 lists, multi-branch — Full pipeline with Dev, Staging, and Production',
55
+ },
56
+ ];
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Shared UI helpers, concept notes, and formatting for the wizard.
3
+ */
4
+
5
+ import pc from 'picocolors';
6
+
7
+ // ─── Concept Notes ──────────────────────────────────────────────
8
+
9
+ export const NOTES = {
10
+ // Phase 1: Setup wizard (runs on install / first use)
11
+ setupWelcome: `Orbital Command is a mission control layer for Claude Code.
12
+
13
+ It gives your projects a real-time dashboard with a Kanban board,
14
+ ${pc.cyan('scopes')} (work items), ${pc.cyan('workflow stages')}, ${pc.cyan('quality gates')},
15
+ ${pc.cyan('dispatches')} (automated Claude sessions), and a ${pc.cyan('sprint orchestrator')}.
16
+
17
+ Everything is driven by config files and hooks inside your project's
18
+ ${pc.cyan('.claude/')} directory — no database or external service required.`,
19
+
20
+ setupComplete: `${pc.bold('Setup complete.')}
21
+
22
+ ${pc.cyan('orbital init')} Add a project (run in a project directory)
23
+ ${pc.cyan('orbital launch --open')} Start the dashboard
24
+ ${pc.cyan('orbital doctor')} Health check & version info`,
25
+
26
+ addProject: `You can add projects now or later with ${pc.cyan('orbital init')}.
27
+ Each project gets its own workflow, scopes, and quality gates.`,
28
+
29
+ // Phase 2: Project setup (runs per-project)
30
+ reconfigure: `This project is already initialized with Orbital Command.
31
+ You can reconfigure settings or run ${pc.cyan('orbital init --force')} to reset.`,
32
+
33
+ projectConfig: `${pc.bold('Project Config')} ${pc.dim('(.claude/orbital.config.json)')}
34
+
35
+ Each project gets its own config inside ${pc.cyan('.claude/')}. The project
36
+ config controls the name shown in the dashboard, ports, build commands
37
+ used by quality gates, and agent definitions.`,
38
+
39
+ workflow: `${pc.bold('Workflows')} ${pc.dim('(Scopes, Lists, Dispatches)')}
40
+
41
+ Orbital organizes work into ${pc.cyan('scopes')} (cards) that move through
42
+ ${pc.cyan('lists')} (Kanban columns). Transitions between lists can trigger
43
+ commands, quality gates, and Claude Code sessions (${pc.cyan('dispatches')}).
44
+
45
+ Choose a preset to start — you can customize it later from the
46
+ dashboard's workflow editor or by editing ${pc.cyan('.claude/config/workflow.json')}.`,
47
+
48
+ postInstall: (counts: { hooks: number; skills: number; agents: number }) =>
49
+ `${pc.bold('What was just created')}
50
+
51
+ ${pc.cyan('Hooks')} (${counts.hooks}) Lifecycle scripts that enforce rules on transitions
52
+ ${pc.cyan('Skills')} (${counts.skills}) Slash commands for Claude (/scope-create, /git-commit, etc.)
53
+ ${pc.cyan('Agents')} (${counts.agents}) Team specifications for code review, architecture, security
54
+ ${pc.cyan('Workflow')} Your selected preset defining lists and transitions
55
+ ${pc.cyan('Quality Gates')} Automated checks (lint, typecheck, tests) before transitions`,
56
+
57
+ nextSteps: `${pc.bold('Next Steps')}
58
+
59
+ 1. ${pc.cyan('orbital launch --open')} Open the dashboard
60
+ 2. Create a scope from the board or use ${pc.cyan('/scope-create')}
61
+ 3. Use ${pc.cyan('/scope-implement')} to start working on a scope
62
+
63
+ ${pc.bold('Useful Commands')}
64
+
65
+ ${pc.cyan('orbital status')} See template sync status
66
+ ${pc.cyan('orbital config')} Modify project settings
67
+ ${pc.cyan('orbital update')} Sync to latest templates
68
+ ${pc.cyan('orbital doctor')} Health check & version info`,
69
+ };
70
+
71
+ // ─── Formatting Helpers ─────────────────────────────────────────
72
+
73
+ export function formatDetectedCommands(commands: Record<string, string | null>): string {
74
+ const entries = Object.entries(commands).filter(([, v]) => v !== null);
75
+ if (entries.length === 0) return pc.dim(' No commands detected');
76
+
77
+ return entries
78
+ .map(([key, val]) => ` ${pc.cyan(key.padEnd(12))} ${val}`)
79
+ .join('\n');
80
+ }
81
+
82
+ export function formatSummary(state: {
83
+ projectName?: string;
84
+ workflowPreset?: string;
85
+ serverPort?: number;
86
+ clientPort?: number;
87
+ }): string {
88
+ return [
89
+ ` Project: ${pc.cyan(state.projectName || 'Unknown')}`,
90
+ ` Workflow: ${pc.cyan(state.workflowPreset || 'default')}`,
91
+ ` Ports: ${pc.cyan(String(state.serverPort || 4444))} (server) / ${pc.cyan(String(state.clientPort || 4445))} (client)`,
92
+ ].join('\n');
93
+ }
@@ -0,0 +1,80 @@
1
+ import type { WorkflowConfig } from '../workflow-config.js';
2
+ import defaultWorkflowJson from '../default-workflow.json' with { type: 'json' };
3
+
4
+ /** The full 7-list trunk-based workflow from default-workflow.json */
5
+ export const DEFAULT_CONFIG = defaultWorkflowJson as unknown as WorkflowConfig;
6
+
7
+ /** Smallest valid config: 2 lists, 1 edge, 1 entry point */
8
+ export const MINIMAL_CONFIG: WorkflowConfig = {
9
+ version: 1,
10
+ name: 'Minimal',
11
+ lists: [
12
+ { id: 'todo', label: 'To Do', order: 0, color: '0 0% 50%', hex: '#808080', isEntryPoint: true, hasDirectory: true },
13
+ { id: 'done', label: 'Done', order: 1, color: '120 50% 50%', hex: '#40bf40', hasDirectory: true },
14
+ ],
15
+ edges: [
16
+ { from: 'todo', to: 'done', direction: 'forward', command: null, confirmLevel: 'quick', label: 'Complete', description: 'Mark as done' },
17
+ ],
18
+ terminalStatuses: ['done'],
19
+ allowedCommandPrefixes: ['/test-'],
20
+ };
21
+
22
+ /** Config with hooks for hook-related tests */
23
+ export const CONFIG_WITH_HOOKS: WorkflowConfig = {
24
+ version: 1,
25
+ name: 'With Hooks',
26
+ lists: [
27
+ { id: 'backlog', label: 'Backlog', order: 0, color: '0 0% 50%', hex: '#808080', isEntryPoint: true, hasDirectory: true, supportsSprint: true },
28
+ { id: 'active', label: 'Active', order: 1, color: '200 80% 50%', hex: '#1a8ccc', hasDirectory: true, sessionKey: 'implementScope' },
29
+ { id: 'review', label: 'Review', order: 2, color: '45 90% 50%', hex: '#f0c010', hasDirectory: true, supportsBatch: true, sessionKey: 'reviewGate' },
30
+ { id: 'shipped', label: 'Shipped', order: 3, color: '120 70% 40%', hex: '#30a030', hasDirectory: true, gitBranch: 'main' },
31
+ ],
32
+ edges: [
33
+ { from: 'backlog', to: 'active', direction: 'forward', command: '/scope-implement {id}', confirmLevel: 'quick', label: 'Start', description: 'Begin work', dispatchOnly: true, autoRevert: true, hooks: ['blocker-check'], agents: ['architect'] },
34
+ { from: 'active', to: 'review', direction: 'forward', command: '/scope-post-review {id}', confirmLevel: 'quick', label: 'Review', description: 'Submit for review', dispatchOnly: true, hooks: ['blocker-check', 'session-enforcer'] },
35
+ { from: 'review', to: 'shipped', direction: 'forward', command: '/git-main', confirmLevel: 'quick', label: 'Ship', description: 'Push to main', dispatchOnly: true },
36
+ { from: 'active', to: 'backlog', direction: 'backward', command: null, confirmLevel: 'quick', label: 'Revert', description: 'Back to backlog', humanOnly: true },
37
+ { from: 'review', to: 'active', direction: 'backward', command: null, confirmLevel: 'quick', label: 'Rework', description: 'Back to active' },
38
+ ],
39
+ hooks: [
40
+ { id: 'blocker-check', label: 'Blocker Check', timing: 'before', type: 'shell', target: '.claude/hooks/blocker-check.sh', blocking: false, category: 'gate', description: 'Checks for blockers' },
41
+ { id: 'session-enforcer', label: 'Session Auth', timing: 'before', type: 'shell', target: '.claude/hooks/session-enforcer.sh', blocking: true, category: 'guard', description: 'Enforces session auth' },
42
+ { id: 'scope-transition', label: 'File Mover', timing: 'before', type: 'shell', target: '.claude/hooks/scope-transition.sh', blocking: false, category: 'lifecycle' },
43
+ { id: 'dashboard-sync', label: 'Dashboard Sync', timing: 'after', type: 'shell', target: '.claude/hooks/dashboard-sync.sh', blocking: false, category: 'observer' },
44
+ ],
45
+ groups: [
46
+ { id: 'planning', label: 'Planning', order: 0 },
47
+ { id: 'development', label: 'Development', order: 1 },
48
+ ],
49
+ eventInference: [
50
+ { eventType: 'SCOPE_STATUS_CHANGED', targetStatus: '', dataField: 'to', forwardOnly: true },
51
+ { eventType: 'AGENT_STARTED', targetStatus: 'active', forwardOnly: true },
52
+ { eventType: 'AGENT_COMPLETED', targetStatus: '', conditions: { outcome: ['success', 'failure'], dispatchResolution: true }, forwardOnly: false },
53
+ ],
54
+ terminalStatuses: ['shipped'],
55
+ allowedCommandPrefixes: ['/scope-', '/git-'],
56
+ };
57
+
58
+ /** Named invalid configs for constructor error tests */
59
+ export const INVALID_CONFIGS = {
60
+ noLists: { version: 1 as const, name: 'No Lists', lists: [], edges: [{ from: 'a', to: 'b', direction: 'forward' as const, command: null, confirmLevel: 'quick' as const, label: 'X', description: 'X' }] } as WorkflowConfig,
61
+ noEdges: { version: 1 as const, name: 'No Edges', lists: [{ id: 'a', label: 'A', order: 0, color: '0 0% 0%', hex: '#000', isEntryPoint: true, hasDirectory: true }], edges: [] } as WorkflowConfig,
62
+ twoEntryPoints: {
63
+ version: 1 as const,
64
+ name: 'Two Entry Points',
65
+ lists: [
66
+ { id: 'a', label: 'A', order: 0, color: '0 0% 0%', hex: '#000', isEntryPoint: true, hasDirectory: true },
67
+ { id: 'b', label: 'B', order: 1, color: '0 0% 0%', hex: '#000', isEntryPoint: true, hasDirectory: true },
68
+ ],
69
+ edges: [{ from: 'a', to: 'b', direction: 'forward' as const, command: null, confirmLevel: 'quick' as const, label: 'X', description: 'X' }],
70
+ } as WorkflowConfig,
71
+ zeroEntryPoints: {
72
+ version: 1 as const,
73
+ name: 'Zero Entry Points',
74
+ lists: [
75
+ { id: 'a', label: 'A', order: 0, color: '0 0% 0%', hex: '#000', hasDirectory: true },
76
+ { id: 'b', label: 'B', order: 1, color: '0 0% 0%', hex: '#000', hasDirectory: true },
77
+ ],
78
+ edges: [{ from: 'a', to: 'b', direction: 'forward' as const, command: null, confirmLevel: 'quick' as const, label: 'X', description: 'X' }],
79
+ } as WorkflowConfig,
80
+ };
@@ -100,6 +100,7 @@
100
100
  "label": "Team Review",
101
101
  "description": "Runs full agent team review, locks spec, moves to backlog.",
102
102
  "dispatchOnly": true,
103
+ "autoRevert": true,
103
104
  "hooks": ["session-enforcer", "blocker-check", "dependency-check", "scope-transition", "orbital-scope-update"]
104
105
  },
105
106
  {
@@ -128,6 +129,7 @@
128
129
  "label": "Start Implementing",
129
130
  "description": "Opens a Claude session running /scope-implement.",
130
131
  "dispatchOnly": true,
132
+ "autoRevert": true,
131
133
  "hooks": ["session-enforcer", "blocker-check", "dependency-check", "scope-transition", "orbital-scope-update"]
132
134
  },
133
135
  {
@@ -139,6 +141,7 @@
139
141
  "label": "Launch Post-Review",
140
142
  "description": "Runs quality gates, formal verification, and code review.",
141
143
  "dispatchOnly": true,
144
+ "autoRevert": true,
142
145
  "hooks": ["session-enforcer", "review-gate-check", "blocker-check", "dependency-check", "scope-transition", "orbital-scope-update"]
143
146
  },
144
147
  {
@@ -179,6 +182,7 @@
179
182
  "label": "Commit",
180
183
  "description": "Commits scope work.",
181
184
  "dispatchOnly": true,
185
+ "autoRevert": true,
182
186
  "hooks": ["session-enforcer", "completion-checklist", "blocker-check", "dependency-check", "scope-transition", "orbital-scope-update", "scope-commit-logger"]
183
187
  },
184
188
  {
@@ -190,6 +194,7 @@
190
194
  "label": "Push to Main",
191
195
  "description": "Pushes or PRs scope work to the main branch.",
192
196
  "dispatchOnly": true,
197
+ "autoRevert": true,
193
198
  "hooks": ["session-enforcer", "blocker-check", "dependency-check", "scope-transition", "orbital-scope-update", "scope-commit-logger"]
194
199
  },
195
200
  {
@@ -248,6 +253,66 @@
248
253
  "dispatchOnly": false,
249
254
  "humanOnly": true,
250
255
  "hooks": ["session-enforcer", "scope-transition", "orbital-scope-update"]
256
+ },
257
+ {
258
+ "from": "backlog",
259
+ "to": "icebox",
260
+ "direction": "backward",
261
+ "command": null,
262
+ "confirmLevel": "quick",
263
+ "label": "Shelve to Icebox",
264
+ "description": "Shelves this scope back to the icebox for later consideration.",
265
+ "dispatchOnly": false,
266
+ "humanOnly": true,
267
+ "hooks": ["session-enforcer", "scope-transition", "orbital-scope-update"]
268
+ },
269
+ {
270
+ "from": "implementing",
271
+ "to": "icebox",
272
+ "direction": "backward",
273
+ "command": null,
274
+ "confirmLevel": "full",
275
+ "checklist": [
276
+ "No uncommitted work will be lost",
277
+ "This scope is being abandoned, not paused"
278
+ ],
279
+ "label": "Shelve to Icebox",
280
+ "description": "Abandons implementation and shelves this scope back to the icebox.",
281
+ "dispatchOnly": false,
282
+ "humanOnly": true,
283
+ "hooks": ["session-enforcer", "scope-transition", "orbital-scope-update"]
284
+ },
285
+ {
286
+ "from": "review",
287
+ "to": "icebox",
288
+ "direction": "backward",
289
+ "command": null,
290
+ "confirmLevel": "full",
291
+ "checklist": [
292
+ "No uncommitted work will be lost",
293
+ "This scope is being abandoned, not paused"
294
+ ],
295
+ "label": "Shelve to Icebox",
296
+ "description": "Abandons review and shelves this scope back to the icebox.",
297
+ "dispatchOnly": false,
298
+ "humanOnly": true,
299
+ "hooks": ["session-enforcer", "scope-transition", "orbital-scope-update"]
300
+ },
301
+ {
302
+ "from": "completed",
303
+ "to": "icebox",
304
+ "direction": "backward",
305
+ "command": null,
306
+ "confirmLevel": "full",
307
+ "checklist": [
308
+ "Committed work has been reverted or is acceptable to leave",
309
+ "This scope is being abandoned, not paused"
310
+ ],
311
+ "label": "Shelve to Icebox",
312
+ "description": "Shelves this completed scope back to the icebox.",
313
+ "dispatchOnly": false,
314
+ "humanOnly": true,
315
+ "hooks": ["session-enforcer", "scope-transition", "orbital-scope-update"]
251
316
  }
252
317
  ],
253
318
  "hooks": [