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
package/bin/orbital.js CHANGED
@@ -2,337 +2,118 @@
2
2
 
3
3
  import fs from 'fs';
4
4
  import path from 'path';
5
- import { spawn, execFileSync } from 'child_process';
6
- import crypto from 'crypto';
7
- import { fileURLToPath } from 'url';
5
+ import {
6
+ detectProjectRoot,
7
+ getPackageVersion,
8
+ isGitRepo,
9
+ requireGitRepo,
10
+ loadRegistry,
11
+ writeRegistryAtomic,
12
+ loadSharedModule,
13
+ loadWizardModule,
14
+ orbitalSetupDone,
15
+ stampTemplateVersion,
16
+ printHelp,
17
+ } from './lib/helpers.js';
18
+
19
+ import { cmdLaunchOrDev, cmdBuild } from './commands/launch.js';
20
+ import { cmdStatus, cmdValidate, cmdPin, cmdUnpin, cmdPins, cmdDiff, cmdReset } from './commands/manifest.js';
21
+ import { cmdRegister, cmdUnregister, cmdProjects } from './commands/registry.js';
22
+ import { cmdConfig, cmdDoctor } from './commands/config.js';
23
+ import { cmdEmit } from './commands/events.js';
24
+ import { cmdUpdate, cmdUninstall } from './commands/update.js';
8
25
 
9
26
  // ---------------------------------------------------------------------------
10
- // Paths
27
+ // Hub Flow — the primary entry point
11
28
  // ---------------------------------------------------------------------------
12
- const __filename = fileURLToPath(import.meta.url);
13
- const __dirname = path.dirname(__filename);
14
- const PACKAGE_ROOT = path.resolve(__dirname, '..');
15
29
 
16
- /**
17
- * Resolve a package binary (e.g. 'tsx', 'vite') to an absolute path.
18
- * Checks PACKAGE_ROOT/node_modules/.bin first (global installs, non-hoisted),
19
- * then the parent node_modules/.bin (hoisted local installs where deps are
20
- * lifted to <project>/node_modules/.bin/). Returns null to fall back to npx.
21
- */
22
- function resolveBin(name) {
23
- const local = path.join(PACKAGE_ROOT, 'node_modules', '.bin', name);
24
- if (fs.existsSync(local)) return local;
25
- const hoisted = path.join(PACKAGE_ROOT, '..', '.bin', name);
26
- if (fs.existsSync(hoisted)) return path.resolve(hoisted);
27
- return null;
28
- }
29
-
30
- // ---------------------------------------------------------------------------
31
- // CLI Helpers
32
- // ---------------------------------------------------------------------------
33
-
34
- function detectProjectRoot() {
35
- try {
36
- return execFileSync('git', ['rev-parse', '--show-toplevel'], { encoding: 'utf8' }).trim();
37
- } catch {
38
- return process.cwd();
30
+ async function runHubFlow() {
31
+ if (!process.stdout.isTTY || process.env.CI) {
32
+ printHelp();
33
+ return;
39
34
  }
40
- }
41
35
 
42
- function loadConfig(projectRoot) {
43
- const configPath = path.join(projectRoot, '.claude', 'orbital.config.json');
44
- if (fs.existsSync(configPath)) {
45
- try {
46
- return JSON.parse(fs.readFileSync(configPath, 'utf8'));
47
- } catch (err) {
48
- console.warn(`Warning: could not parse ${configPath}: ${err.message}`);
49
- }
50
- }
51
- return { serverPort: 4444, clientPort: 4445 };
52
- }
36
+ const wiz = await loadWizardModule();
37
+ const hubVersion = getPackageVersion();
53
38
 
54
- function getPackageVersion() {
55
- try {
56
- const pkg = JSON.parse(fs.readFileSync(path.join(PACKAGE_ROOT, 'package.json'), 'utf8'));
57
- return pkg.version || '0.0.0';
58
- } catch {
59
- return '0.0.0';
39
+ // First-time global setup — no menu, just run the wizard
40
+ if (!orbitalSetupDone()) {
41
+ await wiz.runSetupWizard(hubVersion);
42
+ return;
60
43
  }
61
- }
62
-
63
- function stampTemplateVersion(projectRoot) {
64
- const configPath = path.join(projectRoot, '.claude', 'orbital.config.json');
65
- if (!fs.existsSync(configPath)) return;
66
-
67
- try {
68
- const config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
69
- const version = getPackageVersion();
70
- if (config.templateVersion !== version) {
71
- config.templateVersion = version;
72
- fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n', 'utf8');
73
- console.log(` Stamped templateVersion: ${version}`);
74
- }
75
- } catch { /* ignore malformed config */ }
76
- }
77
-
78
- function checkTemplatesStaleness(projectRoot) {
79
- const configPath = path.join(projectRoot, '.claude', 'orbital.config.json');
80
- if (!fs.existsSync(configPath)) return;
81
-
82
- try {
83
- const config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
84
- const projectVersion = config.templateVersion || null;
85
- const packageVersion = getPackageVersion();
86
-
87
- if (projectVersion && projectVersion === packageVersion) return;
88
-
89
- if (projectVersion) {
90
- console.log(`\n ⚠ Templates outdated (project: v${projectVersion}, package: v${packageVersion})`);
91
- } else {
92
- console.log(`\n ⚠ Templates have no version stamp`);
93
- }
94
- console.log(` Run \`orbital update\` to refresh templates.\n`);
95
- } catch { /* ignore malformed config */ }
96
- }
97
44
 
98
- function openBrowser(url) {
99
- const platform = process.platform;
100
- if (platform === 'darwin') {
101
- spawn('open', [url], { detached: true, stdio: 'ignore' }).unref();
102
- } else if (platform === 'win32') {
103
- spawn('cmd', ['/c', 'start', url], { detached: true, stdio: 'ignore' }).unref();
104
- } else {
105
- spawn('xdg-open', [url], { detached: true, stdio: 'ignore' }).unref();
45
+ // Need a git repo for everything else
46
+ if (!isGitRepo()) {
47
+ requireGitRepo(); // exits with error
48
+ return;
106
49
  }
107
- }
108
-
109
- // ---------------------------------------------------------------------------
110
- // Shared Module Loader
111
- // ---------------------------------------------------------------------------
112
50
 
113
- /**
114
- * Load the shared init module. Tries compiled JS first (production/global
115
- * installs via npm publish), then TypeScript source (dev via tsx).
116
- */
117
- async function loadSharedModule() {
118
- try {
119
- // Production: compiled JS (tsconfig.server.json outputs to dist/server/server/)
120
- return await import('../dist/server/server/init.js');
121
- } catch {
122
- try {
123
- // Dev: TypeScript source loaded via tsx
124
- return await import('../server/init.js');
125
- } catch {
126
- console.error('Error: Orbital Command server module not found.');
127
- console.error('Try reinstalling: npm install -g orbital-command');
128
- console.error('For local development: npm run build:server');
129
- process.exit(1);
130
- }
51
+ const hubRoot = detectProjectRoot();
52
+ const isInitialized = fs.existsSync(
53
+ path.join(hubRoot, '.claude', 'orbital.config.json')
54
+ );
55
+ const hubRegistry = loadRegistry();
56
+ const projectNames = (hubRegistry.projects || []).map(p => p.name);
57
+
58
+ // Not initialized and no registered projects — just run setup wizard
59
+ if (!isInitialized && projectNames.length === 0) {
60
+ await wiz.runProjectSetup(hubRoot, hubVersion, []);
61
+ stampTemplateVersion(hubRoot);
62
+ return;
131
63
  }
132
- }
133
-
134
- // ---------------------------------------------------------------------------
135
- // Commands
136
- // ---------------------------------------------------------------------------
137
-
138
- async function cmdInit(args) {
139
- const force = args.includes('--force');
140
- const projectRoot = detectProjectRoot();
141
-
142
- const { runInit } = await loadSharedModule();
143
- runInit(projectRoot, { force });
144
-
145
- stampTemplateVersion(projectRoot);
146
- console.log(`Run \`orbital dev\` to start the development server.\n`);
147
- }
148
-
149
- function cmdDev() {
150
- const shouldOpen = process.argv.includes('--open');
151
- const forceVite = process.argv.includes('--vite');
152
- const projectRoot = detectProjectRoot();
153
- const config = loadConfig(projectRoot);
154
- const serverPort = config.serverPort || 4444;
155
- const clientPort = config.clientPort || 4445;
156
-
157
- // Detect packaged mode: dist/index.html exists → serve pre-built frontend
158
- const hasPrebuiltFrontend = fs.existsSync(path.join(PACKAGE_ROOT, 'dist', 'index.html'));
159
- const useVite = forceVite || !hasPrebuiltFrontend;
160
-
161
- console.log(`\nOrbital Command — dev`);
162
- console.log(`Project root: ${projectRoot}`);
163
- if (useVite) {
164
- console.log(`Server: http://localhost:${serverPort}`);
165
- console.log(`Client: http://localhost:${clientPort} (Vite dev server)\n`);
166
- } else {
167
- console.log(`Dashboard: http://localhost:${serverPort}\n`);
168
- }
169
-
170
- checkTemplatesStaleness(projectRoot);
171
64
 
172
- const env = {
173
- ...process.env,
174
- ORBITAL_PROJECT_ROOT: projectRoot,
175
- ORBITAL_SERVER_PORT: String(serverPort),
176
- };
177
-
178
- // Start the API server (serves pre-built frontend from dist/ when available)
179
- const tsxBin = resolveBin('tsx');
180
- const serverProcess = tsxBin
181
- ? spawn(tsxBin, ['watch', path.join(PACKAGE_ROOT, 'server', 'index.ts')],
182
- { stdio: 'inherit', env, cwd: PACKAGE_ROOT })
183
- : spawn('npx', ['tsx', 'watch', path.join(PACKAGE_ROOT, 'server', 'index.ts')],
184
- { stdio: 'inherit', env, cwd: PACKAGE_ROOT });
185
-
186
- let viteProcess = null;
187
-
188
- if (useVite) {
189
- // Development mode: spawn Vite for HMR
190
- const viteBin = resolveBin('vite');
191
- viteProcess = viteBin
192
- ? spawn(viteBin, ['--config', path.join(PACKAGE_ROOT, 'vite.config.ts'), '--port', String(clientPort)],
193
- { stdio: 'inherit', env, cwd: PACKAGE_ROOT })
194
- : spawn('npx', ['vite', '--config', path.join(PACKAGE_ROOT, 'vite.config.ts'), '--port', String(clientPort)],
195
- { stdio: 'inherit', env, cwd: PACKAGE_ROOT });
196
- }
197
-
198
- const dashboardUrl = useVite
199
- ? `http://localhost:${clientPort}`
200
- : `http://localhost:${serverPort}`;
65
+ // Show hub menu (initialized OR has registered projects)
66
+ const projects = (hubRegistry.projects || [])
67
+ .filter(p => p.enabled !== false)
68
+ .map(p => ({ name: p.name, path: p.path }));
69
+
70
+ const hubResult = await wiz.runHub({
71
+ packageVersion: hubVersion,
72
+ isProjectInitialized: isInitialized,
73
+ projectNames,
74
+ itermPromptShown: hubRegistry.itermPromptShown === true,
75
+ isMac: process.platform === 'darwin',
76
+ lastUpdateCheck: hubRegistry.lastUpdateCheck,
77
+ latestVersion: hubRegistry.latestVersion,
78
+ projectPaths: projects,
79
+ });
201
80
 
202
- if (shouldOpen) {
203
- setTimeout(() => openBrowser(dashboardUrl), 2000);
81
+ // Persist registry changes in one write
82
+ let registryChanged = false;
83
+ if (hubResult.setItermPromptShown) {
84
+ hubRegistry.itermPromptShown = true;
85
+ registryChanged = true;
204
86
  }
205
-
206
- let exiting = false;
207
-
208
- function cleanup() {
209
- if (exiting) return;
210
- exiting = true;
211
- serverProcess.kill();
212
- if (viteProcess) viteProcess.kill();
213
- process.exit(0);
87
+ if (hubResult.updateCache) {
88
+ hubRegistry.lastUpdateCheck = hubResult.updateCache.lastUpdateCheck;
89
+ hubRegistry.latestVersion = hubResult.updateCache.latestVersion;
90
+ registryChanged = true;
214
91
  }
215
- process.on('SIGINT', cleanup);
216
- process.on('SIGTERM', cleanup);
217
-
218
- serverProcess.on('exit', (code) => {
219
- if (exiting) return;
220
- exiting = true;
221
- console.log(`Server exited with code ${code}`);
222
- if (viteProcess) viteProcess.kill();
223
- process.exit(code || 0);
224
- });
225
- if (viteProcess) {
226
- viteProcess.on('exit', (code) => {
227
- if (exiting) return;
228
- exiting = true;
229
- console.log(`Vite exited with code ${code}`);
230
- serverProcess.kill();
231
- process.exit(code || 0);
232
- });
92
+ if (registryChanged) {
93
+ writeRegistryAtomic(hubRegistry);
233
94
  }
234
- }
235
-
236
- function cmdBuild() {
237
- console.log(`\nOrbital Command — build\n`);
238
95
 
239
- const viteBin = resolveBin('vite');
240
- const buildProcess = viteBin
241
- ? spawn(viteBin, ['build', '--config', path.join(PACKAGE_ROOT, 'vite.config.ts')],
242
- { stdio: 'inherit', cwd: PACKAGE_ROOT })
243
- : spawn('npx', ['vite', 'build', '--config', path.join(PACKAGE_ROOT, 'vite.config.ts')],
244
- { stdio: 'inherit', cwd: PACKAGE_ROOT });
245
-
246
- buildProcess.on('exit', (code) => {
247
- process.exit(code || 0);
248
- });
249
- }
250
-
251
- function cmdEmit(args) {
252
- const type = args[0];
253
- const jsonStr = args.slice(1).join(' ');
254
-
255
- if (!type) {
256
- console.error('Usage: orbital emit <TYPE> <JSON>');
257
- process.exit(1);
258
- }
259
-
260
- const projectRoot = detectProjectRoot();
261
- const eventsDir = path.join(projectRoot, '.claude', 'orbital-events');
262
- if (!fs.existsSync(eventsDir)) fs.mkdirSync(eventsDir, { recursive: true });
263
-
264
- let payload;
265
- try {
266
- payload = jsonStr ? JSON.parse(jsonStr) : {};
267
- } catch (err) {
268
- console.error(`Invalid JSON: ${err.message}`);
269
- process.exit(1);
96
+ // Route the chosen action
97
+ switch (hubResult.action) {
98
+ case 'launch': cmdLaunchOrDev(false); break;
99
+ case 'init':
100
+ await wiz.runProjectSetup(hubRoot, hubVersion, []);
101
+ stampTemplateVersion(hubRoot);
102
+ break;
103
+ case 'config': await cmdConfig([]); break;
104
+ case 'doctor': await cmdDoctor(); break;
105
+ case 'update': await cmdUpdate([]); break;
106
+ case 'status': await cmdStatus(); break;
107
+ case 'reset': {
108
+ const { runInit } = await loadSharedModule();
109
+ runInit(hubRoot, { force: true });
110
+ stampTemplateVersion(hubRoot);
111
+ break;
112
+ }
113
+ default:
114
+ console.error(`Unknown action: ${hubResult.action}`);
115
+ process.exit(1);
270
116
  }
271
-
272
- const eventId = crypto.randomUUID();
273
- const event = {
274
- ...payload,
275
- id: eventId,
276
- type,
277
- timestamp: new Date().toISOString(),
278
- };
279
-
280
- const filePath = path.join(eventsDir, `${eventId}.json`);
281
- fs.writeFileSync(filePath, JSON.stringify(event, null, 2) + '\n', 'utf8');
282
-
283
- console.log(`Event emitted: ${type} (${eventId})`);
284
- console.log(` File: ${path.relative(projectRoot, filePath)}`);
285
- }
286
-
287
- async function cmdUpdate() {
288
- const projectRoot = detectProjectRoot();
289
-
290
- const { runUpdate } = await loadSharedModule();
291
- runUpdate(projectRoot);
292
-
293
- stampTemplateVersion(projectRoot);
294
- }
295
-
296
- async function cmdUninstall() {
297
- const projectRoot = detectProjectRoot();
298
-
299
- const { runUninstall } = await loadSharedModule();
300
- runUninstall(projectRoot);
301
- }
302
-
303
- function printHelp() {
304
- console.log(`
305
- Orbital Command — CLI for the agentic project management system
306
-
307
- Usage:
308
- orbital <command> [options]
309
-
310
- Commands:
311
- init Scaffold Orbital Command into the current project
312
- dev Start the Orbital Command dashboard
313
- build Production build of the dashboard
314
- emit <TYPE> <JSON> Emit an orbital event
315
- update Re-copy hooks/skills/agents from package templates
316
- uninstall Remove Orbital artifacts from the project
317
-
318
- Init Options:
319
- --force Overwrite existing hooks, skills, and agents
320
- --skip-plugins Skip plugin installation
321
- --yes, -y Auto-accept all prompts
322
-
323
- Dev Options:
324
- --open Open the dashboard in the default browser
325
- --vite Force Vite dev server (for local development with HMR)
326
-
327
- Examples:
328
- orbital init
329
- orbital init --force
330
- orbital dev
331
- orbital dev --open
332
- orbital emit SCOPE_TRANSITION '{"scope":"042","from":"implementing","to":"review"}'
333
- orbital update
334
- orbital uninstall
335
- `);
336
117
  }
337
118
 
338
119
  // ---------------------------------------------------------------------------
@@ -343,11 +124,32 @@ const [command, ...args] = process.argv.slice(2);
343
124
 
344
125
  async function main() {
345
126
  switch (command) {
127
+ // Deprecated commands — silently redirect to hub
346
128
  case 'init':
347
- await cmdInit(args);
129
+ case 'setup':
130
+ case 'launch':
131
+ case undefined:
132
+ await runHubFlow();
133
+ break;
134
+
135
+ // Active commands
136
+ case 'config':
137
+ await cmdConfig(args);
138
+ break;
139
+ case 'doctor':
140
+ await cmdDoctor();
348
141
  break;
349
142
  case 'dev':
350
- cmdDev();
143
+ cmdLaunchOrDev(true);
144
+ break;
145
+ case 'register':
146
+ cmdRegister(args);
147
+ break;
148
+ case 'unregister':
149
+ cmdUnregister(args);
150
+ break;
151
+ case 'projects':
152
+ cmdProjects();
351
153
  break;
352
154
  case 'build':
353
155
  cmdBuild();
@@ -356,19 +158,45 @@ async function main() {
356
158
  cmdEmit(args);
357
159
  break;
358
160
  case 'update':
359
- await cmdUpdate();
161
+ await cmdUpdate(args);
360
162
  break;
361
163
  case 'uninstall':
362
- await cmdUninstall();
164
+ await cmdUninstall(args);
363
165
  break;
166
+ case 'status':
167
+ await cmdStatus();
168
+ break;
169
+ case 'validate':
170
+ await cmdValidate();
171
+ break;
172
+ case 'pin':
173
+ await cmdPin(args);
174
+ break;
175
+ case 'unpin':
176
+ await cmdUnpin(args);
177
+ break;
178
+ case 'pins':
179
+ await cmdPins();
180
+ break;
181
+ case 'diff':
182
+ await cmdDiff(args);
183
+ break;
184
+ case 'reset':
185
+ await cmdReset(args);
186
+ break;
187
+ case 'private': {
188
+ const registry = loadRegistry();
189
+ const enable = args[0] !== 'off';
190
+ registry.privateMode = enable;
191
+ writeRegistryAtomic(registry);
192
+ console.log(`Private mode ${enable ? 'enabled' : 'disabled'} globally.`);
193
+ break;
194
+ }
364
195
  case 'help':
365
196
  case '--help':
366
197
  case '-h':
367
198
  printHelp();
368
199
  break;
369
- case undefined:
370
- printHelp();
371
- break;
372
200
  default:
373
201
  console.error(`Unknown command: ${command}`);
374
202
  printHelp();
@@ -0,0 +1,11 @@
1
+ import{j as e}from"./ui-BmsSg9jU.js";import{a as c}from"./vendor-Bqt8AJn2.js";import{c as ee,aX as j,aY as O,aZ as te,a_ as Ne,a$ as we,b0 as ne,b1 as ke,b2 as Se,b3 as se,b4 as Ee,b5 as ze,b6 as W,b7 as V,b8 as Le,b9 as N,ba as ie,bb as G,bc as Ce,bd as I,be as u,G as T,bf as Ie,f as ae,J as re,C as Y,bg as le,S as oe,aV as ce,U as Ae,L as de,E as Me}from"./index-o4ScMAuR.js";import{Z as ue}from"./zap-C9wqYMpl.js";import{B as me}from"./bot-NFaJBDn_.js";import{R as H}from"./rocket-D_xvvNG6.js";import{R as he}from"./radio-xqZaR-Uk.js";import"./charts-LGLb8hyU.js";/**
2
+ * @license lucide-react v0.577.0 - ISC
3
+ *
4
+ * This source code is licensed under the ISC license.
5
+ * See the LICENSE file in the root directory of this source tree.
6
+ */const Re=[["path",{d:"M15 6v12a3 3 0 1 0 3-3H6a3 3 0 1 0 3 3V6a3 3 0 1 0-3 3h12a3 3 0 1 0-3-3",key:"11bfej"}]],fe=ee("command",Re);/**
7
+ * @license lucide-react v0.577.0 - ISC
8
+ *
9
+ * This source code is licensed under the ISC license.
10
+ * See the LICENSE file in the root directory of this source tree.
11
+ */const Te=[["path",{d:"M12 20v2",key:"1lh1kg"}],["path",{d:"M12 2v2",key:"tus03m"}],["path",{d:"M17 20v2",key:"1rnc9c"}],["path",{d:"M17 2v2",key:"11trls"}],["path",{d:"M2 12h2",key:"1t8f8n"}],["path",{d:"M2 17h2",key:"7oei6x"}],["path",{d:"M2 7h2",key:"asdhe0"}],["path",{d:"M20 12h2",key:"1q8mjw"}],["path",{d:"M20 17h2",key:"1fpfkl"}],["path",{d:"M20 7h2",key:"1o8tra"}],["path",{d:"M7 20v2",key:"4gnj0m"}],["path",{d:"M7 2v2",key:"1i4yhu"}],["rect",{x:"4",y:"4",width:"16",height:"16",rx:"2",key:"1vbyd7"}],["rect",{x:"8",y:"8",width:"8",height:"8",rx:"1",key:"z9xiuo"}]],ge=ee("cpu",Te);function xe(t,n){let a;const s=()=>{const{currentTime:i}=n,l=(i===null?0:i.value)/100;a!==l&&t(l),a=l};return j.update(s,!0),()=>O(s)}const z=new WeakMap;let p;function Fe(t,n){if(n){const{inlineSize:a,blockSize:s}=n[0];return{width:a,height:s}}else return t instanceof SVGElement&&"getBBox"in t?t.getBBox():{width:t.offsetWidth,height:t.offsetHeight}}function Oe({target:t,contentRect:n,borderBoxSize:a}){var s;(s=z.get(t))===null||s===void 0||s.forEach(i=>{i({target:t,contentSize:n,get size(){return Fe(t,a)}})})}function We(t){t.forEach(Oe)}function Ve(){typeof ResizeObserver>"u"||(p=new ResizeObserver(We))}function He(t,n){p||Ve();const a=te(t);return a.forEach(s=>{let i=z.get(s);i||(i=new Set,z.set(s,i)),i.add(n),p==null||p.observe(s)}),()=>{a.forEach(s=>{const i=z.get(s);i==null||i.delete(n),i!=null&&i.size||p==null||p.unobserve(s)})}}const L=new Set;let w;function Be(){w=()=>{const t={width:window.innerWidth,height:window.innerHeight},n={target:window,size:t,contentSize:t};L.forEach(a=>a(n))},window.addEventListener("resize",w)}function Pe(t){return L.add(t),w||Be(),()=>{L.delete(t),!L.size&&w&&(w=void 0)}}function De(t,n){return typeof t=="function"?Pe(t):He(t,n)}const _e=50,$=()=>({current:0,offset:[],progress:0,scrollLength:0,targetOffset:0,targetLength:0,containerLength:0,velocity:0}),Ge=()=>({time:0,x:$(),y:$()}),Ye={x:{length:"Width",position:"Left"},y:{length:"Height",position:"Top"}};function q(t,n,a,s){const i=a[n],{length:r,position:l}=Ye[n],o=i.current,m=a.time;i.current=t[`scroll${l}`],i.scrollLength=t[`scroll${r}`]-t[`client${r}`],i.offset.length=0,i.offset[0]=0,i.offset[1]=i.scrollLength,i.progress=Ne(0,i.scrollLength,i.current);const d=s-m;i.velocity=d>_e?0:we(i.current-o,d)}function $e(t,n,a){q(t,"x",n,a),q(t,"y",n,a),n.time=a}function qe(t,n){const a={x:0,y:0};let s=t;for(;s&&s!==n;)if(s instanceof HTMLElement)a.x+=s.offsetLeft,a.y+=s.offsetTop,s=s.offsetParent;else if(s.tagName==="svg"){const i=s.getBoundingClientRect();s=s.parentElement;const r=s.getBoundingClientRect();a.x+=i.left-r.left,a.y+=i.top-r.top}else if(s instanceof SVGGraphicsElement){const{x:i,y:r}=s.getBBox();a.x+=i,a.y+=r;let l=null,o=s.parentNode;for(;!l;)o.tagName==="svg"&&(l=o),o=s.parentNode;s=l}else break;return a}const F={start:0,center:.5,end:1};function X(t,n,a=0){let s=0;if(t in F&&(t=F[t]),typeof t=="string"){const i=parseFloat(t);t.endsWith("px")?s=i:t.endsWith("%")?t=i/100:t.endsWith("vw")?s=i/100*document.documentElement.clientWidth:t.endsWith("vh")?s=i/100*document.documentElement.clientHeight:t=i}return typeof t=="number"&&(s=n*t),a+s}const Xe=[0,0];function Ze(t,n,a,s){let i=Array.isArray(t)?t:Xe,r=0,l=0;return typeof t=="number"?i=[t,t]:typeof t=="string"&&(t=t.trim(),t.includes(" ")?i=t.split(" "):i=[t,F[t]?t:"0"]),r=X(i[0],a,s),l=X(i[1],n),r-l}const Ue={All:[[0,0],[1,1]]},Je={x:0,y:0};function Ke(t){return"getBBox"in t&&t.tagName!=="svg"?t.getBBox():{width:t.clientWidth,height:t.clientHeight}}function Qe(t,n,a){const{offset:s=Ue.All}=a,{target:i=t,axis:r="y"}=a,l=r==="y"?"height":"width",o=i!==t?qe(i,t):Je,m=i===t?{width:t.scrollWidth,height:t.scrollHeight}:Ke(i),d={width:t.clientWidth,height:t.clientHeight};n[r].offset.length=0;let h=!n[r].interpolate;const x=s.length;for(let f=0;f<x;f++){const _=Ze(s[f],d[l],m[l],o[r]);!h&&_!==n[r].interpolatorOffsets[f]&&(h=!0),n[r].offset[f]=_}h&&(n[r].interpolate=ne(n[r].offset,ke(s),{clamp:!1}),n[r].interpolatorOffsets=[...n[r].offset]),n[r].progress=Se(0,1,n[r].interpolate(n[r].current))}function et(t,n=t,a){if(a.x.targetOffset=0,a.y.targetOffset=0,n!==t){let s=n;for(;s&&s!==t;)a.x.targetOffset+=s.offsetLeft,a.y.targetOffset+=s.offsetTop,s=s.offsetParent}a.x.targetLength=n===t?n.scrollWidth:n.clientWidth,a.y.targetLength=n===t?n.scrollHeight:n.clientHeight,a.x.containerLength=t.clientWidth,a.y.containerLength=t.clientHeight}function tt(t,n,a,s={}){return{measure:()=>et(t,s.target,a),update:i=>{$e(t,a,i),(s.offset||s.target)&&Qe(t,a,s)},notify:()=>n(a)}}const v=new WeakMap,Z=new WeakMap,A=new WeakMap,U=t=>t===document.documentElement?window:t;function B(t,{container:n=document.documentElement,...a}={}){let s=A.get(n);s||(s=new Set,A.set(n,s));const i=Ge(),r=tt(n,t,i,a);if(s.add(r),!v.has(n)){const o=()=>{for(const f of s)f.measure()},m=()=>{for(const f of s)f.update(se.timestamp)},d=()=>{for(const f of s)f.notify()},h=()=>{j.read(o,!1,!0),j.read(m,!1,!0),j.update(d,!1,!0)};v.set(n,h);const x=U(n);window.addEventListener("resize",h,{passive:!0}),n!==document.documentElement&&Z.set(n,De(n,h)),x.addEventListener("scroll",h,{passive:!0})}const l=v.get(n);return j.read(l,!1,!0),()=>{var o;O(l);const m=A.get(n);if(!m||(m.delete(r),m.size))return;const d=v.get(n);v.delete(n),d&&(U(n).removeEventListener("scroll",d),(o=Z.get(n))===null||o===void 0||o(),window.removeEventListener("resize",d))}}function nt({source:t,container:n,axis:a="y"}){t&&(n=t);const s={value:0},i=B(r=>{s.value=r[a].progress*100},{container:n,axis:a});return{currentTime:s,cancel:i}}const M=new Map;function pe({source:t,container:n=document.documentElement,axis:a="y"}={}){t&&(n=t),M.has(n)||M.set(n,{});const s=M.get(n);return s[a]||(s[a]=ze()?new ScrollTimeline({source:n,axis:a}):nt({source:n,axis:a})),s[a]}function st(t){return t.length===2}function je(t){return t&&(t.target||t.offset)}function it(t,n){return st(t)||je(n)?B(a=>{t(a[n.axis].progress,a)},n):xe(t,pe(n))}function at(t,n){if(t.flatten(),je(n))return t.pause(),B(a=>{t.time=t.duration*a[n.axis].progress},n);{const a=pe(n);return t.attachTimeline?t.attachTimeline(a,s=>(s.pause(),xe(i=>{s.time=s.duration*i},a))):Ee}}function rt(t,{axis:n="y",...a}={}){const s={axis:n,...a};return typeof t=="function"?it(t,s):at(t,s)}function J(t,n){Le(!!(!n||n.current))}const lt=()=>({scrollX:N(0),scrollY:N(0),scrollXProgress:N(0),scrollYProgress:N(0)});function P({container:t,target:n,layoutEffect:a=!0,...s}={}){const i=W(lt);return(a?V:c.useEffect)(()=>(J("target",n),J("container",t),rt((l,{x:o,y:m})=>{i.scrollX.set(o.current),i.scrollXProgress.set(o.progress),i.scrollY.set(m.current),i.scrollYProgress.set(m.progress)},{...s,container:(t==null?void 0:t.current)||void 0,target:(n==null?void 0:n.current)||void 0})),[t,n,JSON.stringify(s.offset)]),i}function ye(t){const n=W(()=>N(t)),{isStatic:a}=c.useContext(ie);if(a){const[,s]=c.useState(t);c.useEffect(()=>n.on("change",s),[])}return n}function be(t,n){const a=ye(n()),s=()=>a.set(n());return s(),V(()=>{const i=()=>j.preRender(s,!1,!0),r=t.map(l=>l.on("change",i));return()=>{r.forEach(l=>l()),O(s)}}),a}function K(t){return typeof t=="number"?t:parseFloat(t)}function ot(t,n={}){const{isStatic:a}=c.useContext(ie),s=c.useRef(null),i=ye(G(t)?K(t.get()):t),r=c.useRef(i.get()),l=c.useRef(()=>{}),o=()=>{const d=s.current;d&&d.time===0&&d.sample(se.delta),m(),s.current=Ce({keyframes:[i.get(),r.current],velocity:i.getVelocity(),type:"spring",restDelta:.001,restSpeed:.01,...n,onUpdate:l.current})},m=()=>{s.current&&s.current.stop()};return c.useInsertionEffect(()=>i.attach((d,h)=>a?h(d):(r.current=d,l.current=h,j.update(o),i.get()),m),[JSON.stringify(n)]),V(()=>{if(G(t))return t.on("change",d=>i.set(K(d)))},[i]),i}const ct=t=>t&&typeof t=="object"&&t.mix,dt=t=>ct(t)?t.mix:void 0;function ut(...t){const n=!Array.isArray(t[0]),a=n?0:-1,s=t[0+a],i=t[1+a],r=t[2+a],l=t[3+a],o=ne(i,r,{mixer:dt(r[0]),...l});return n?o(s):o}function mt(t){I.current=[],t();const n=be(I.current,t);return I.current=void 0,n}function C(t,n,a,s){if(typeof t=="function")return mt(t);const i=typeof n=="function"?n:ut(n,a,s);return Array.isArray(t)?Q(t,i):Q([t],([r])=>i(r))}function Q(t,n){const a=W(()=>[]);return be(t,()=>{a.length=0;const s=t.length;for(let i=0;i<s;i++)a[i]=t[i].get();return n(a)})}const ht={some:0,all:1};function ft(t,n,{root:a,margin:s,amount:i="some"}={}){const r=te(t),l=new WeakMap,o=d=>{d.forEach(h=>{const x=l.get(h.target);if(h.isIntersecting!==!!x)if(h.isIntersecting){const f=n(h);typeof f=="function"?l.set(h.target,f):m.unobserve(h.target)}else typeof x=="function"&&(x(h),l.delete(h.target))})},m=new IntersectionObserver(o,{root:a,rootMargin:s,threshold:typeof i=="number"?i:ht[i]});return r.forEach(d=>m.observe(d)),()=>m.disconnect()}function ve(t,{root:n,margin:a,amount:s,once:i=!1}={}){const[r,l]=c.useState(!1);return c.useEffect(()=>{if(!t.current||i&&r)return;const o=()=>(l(!0),i?void 0:()=>l(!1)),m={root:n&&n.current||void 0,margin:a,amount:s};return ft(t.current,o,m)},[n,t,a,i,s]),r}const y=[.25,.46,.45,.94];function D(t,n=1500){const a=ve(t,{once:!0,amount:"some"}),[s,i]=c.useState(!1);return c.useEffect(()=>{const r=setTimeout(()=>i(!0),n);return()=>clearTimeout(r)},[n]),a||s}function g({children:t,delay:n=0,className:a=""}){const s=c.useRef(null),i=D(s);return e.jsx(u.div,{ref:s,initial:{opacity:0,y:48},animate:i?{opacity:1,y:0}:{},transition:{duration:.8,delay:n,ease:y},className:a,children:t})}function gt({children:t,delay:n=0,className:a=""}){const s=c.useRef(null),i=D(s);return e.jsx(u.div,{ref:s,initial:{opacity:0,scale:.85},animate:i?{opacity:1,scale:1}:{},transition:{duration:.7,delay:n,ease:y},className:a,children:t})}function k({children:t,delay:n=0,direction:a="left",className:s=""}){const i=c.useRef(null),r=D(i),l=a==="left"?-80:80;return e.jsx(u.div,{ref:i,initial:{opacity:0,x:l},animate:r?{opacity:1,x:0}:{},transition:{duration:.8,delay:n,ease:y},className:s,children:t})}function xt({text:t,className:n=""}){const a=t.split(" ");return e.jsx("span",{className:n,children:a.map((s,i)=>e.jsxs(c.Fragment,{children:[e.jsx(u.span,{initial:{opacity:0,y:40,filter:"blur(8px)"},animate:{opacity:1,y:0,filter:"blur(0px)"},transition:{duration:.6,delay:.15+i*.12,ease:y},className:"inline-block",children:s})," "]},i))})}function pt(){return e.jsxs("div",{className:"landing-orbital-rings",children:[e.jsxs(u.div,{className:"landing-ring landing-ring-1",animate:{rotate:360},transition:{duration:30,repeat:1/0,ease:"linear"},children:[e.jsx("div",{className:"landing-ring-dot",style:{top:"0%",left:"50%"}}),e.jsx("div",{className:"landing-ring-dot",style:{bottom:"0%",left:"50%"}})]}),e.jsx(u.div,{className:"landing-ring landing-ring-2",animate:{rotate:-360},transition:{duration:45,repeat:1/0,ease:"linear"},children:e.jsx("div",{className:"landing-ring-dot landing-ring-dot-pink",style:{top:"50%",right:"0%"}})}),e.jsxs(u.div,{className:"landing-ring landing-ring-3",animate:{rotate:360},transition:{duration:60,repeat:1/0,ease:"linear"},children:[e.jsx("div",{className:"landing-ring-dot landing-ring-dot-green",style:{top:"10%",left:"15%"}}),e.jsx("div",{className:"landing-ring-dot",style:{bottom:"15%",right:"10%"}})]}),e.jsx("div",{className:"landing-center-glow"})]})}const jt=Array.from({length:30},(t,n)=>({id:n,x:Math.random()*100,y:Math.random()*100,size:1+Math.random()*2,duration:15+Math.random()*25,delay:Math.random()*10}));function yt(){return e.jsx("div",{className:"absolute inset-0 overflow-hidden pointer-events-none",children:jt.map(t=>e.jsx(u.div,{className:"absolute rounded-full",style:{left:`${t.x}%`,top:`${t.y}%`,width:t.size,height:t.size,background:t.id%3===0?"rgba(0, 188, 212, 0.5)":t.id%3===1?"rgba(233, 30, 99, 0.4)":"rgba(255, 255, 255, 0.2)"},animate:{y:[-20,20,-20],x:[-10,10,-10],opacity:[.2,.7,.2]},transition:{duration:t.duration,delay:t.delay,repeat:1/0,ease:"easeInOut"}},t.id))})}function bt({value:t,suffix:n=""}){const[a,s]=c.useState(0);return c.useEffect(()=>{if(t===0)return;const i=setTimeout(()=>{const l=performance.now();function o(m){const d=m-l,h=Math.min(d/1500,1),x=1-Math.pow(1-h,3);s(Math.round(x*t)),h<1&&requestAnimationFrame(o)}requestAnimationFrame(o)},800);return()=>clearTimeout(i)},[t]),e.jsxs("span",{children:[a,n]})}function vt(){const{scrollYProgress:t}=P(),n=ot(t,{stiffness:100,damping:30});return e.jsx(u.div,{className:"fixed top-0 left-0 right-0 h-[2px] z-50 origin-left",style:{scaleX:n,background:"linear-gradient(90deg, #00bcd4, #e91e63, #00bcd4)"}})}function Nt(){const[t,n]=c.useState(!1);return c.useEffect(()=>{const a=()=>n(window.scrollY>50);return window.addEventListener("scroll",a,{passive:!0}),()=>window.removeEventListener("scroll",a)},[]),e.jsx(u.nav,{className:`fixed top-0 left-0 right-0 z-40 transition-all duration-500 ${t?"landing-nav-scrolled":"landing-nav-transparent"}`,initial:{y:-80},animate:{y:0},transition:{duration:.6,ease:y},children:e.jsxs("div",{className:"max-w-7xl mx-auto px-6 h-16 flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"landing-nav-logo",children:e.jsx(fe,{size:20,className:"text-[#00bcd4]"})}),e.jsx("span",{className:"text-base font-semibold tracking-tight text-white",children:"Orbital Command"})]}),e.jsxs("div",{className:"hidden md:flex items-center gap-8",children:[e.jsx("a",{href:"#features",className:"text-sm text-white/60 hover:text-white transition-colors",children:"Features"}),e.jsx("a",{href:"#how-it-works",className:"text-sm text-white/60 hover:text-white transition-colors",children:"How It Works"}),e.jsx("a",{href:"#architecture",className:"text-sm text-white/60 hover:text-white transition-colors",children:"Architecture"}),e.jsxs("a",{href:"https://github.com/SakaraLabs/orbital-command",target:"_blank",rel:"noopener noreferrer",className:"landing-nav-cta",children:[e.jsx(T,{size:14}),"GitHub"]})]})]})})}function wt(){const t=c.useRef(null),{scrollYProgress:n}=P({target:t,offset:["start start","end start"]}),a=C(n,[0,1],[0,200]),s=C(n,[0,.6],[1,0]),i=C(n,[0,1],[0,100]);return e.jsxs(e.Fragment,{children:[e.jsxs("section",{ref:t,className:"landing-hero",children:[e.jsx("div",{className:"landing-hero-orb landing-hero-orb-1"}),e.jsx("div",{className:"landing-hero-orb landing-hero-orb-2"}),e.jsx("div",{className:"landing-hero-orb landing-hero-orb-3"}),e.jsxs(u.div,{className:"landing-hero-content",style:{y:a,opacity:s},children:[e.jsxs(u.div,{className:"landing-badge",initial:{opacity:0,scale:.8},animate:{opacity:1,scale:1},transition:{duration:.5,delay:.1},children:[e.jsx(Ie,{size:14,className:"text-[#00bcd4]"}),e.jsx("span",{children:"Mission control for Claude Code"})]}),e.jsxs("h1",{className:"landing-headline",children:[e.jsx(xt,{text:"Command your"}),e.jsx("br",{}),e.jsx(u.span,{className:"landing-headline-gradient",initial:{opacity:0,y:40},animate:{opacity:1,y:0},transition:{duration:.7,delay:.5,ease:y},children:"AI fleet."})]}),e.jsxs(u.p,{className:"landing-subtitle",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.7,delay:.8},children:["Real-time project management dashboard for Claude Code.",e.jsx("br",{className:"hidden sm:block"}),"Kanban boards, sprint orchestration, quality gates, and deploy pipelines",e.jsx("br",{className:"hidden sm:block"}),"— all driven by a file-based event bus."]}),e.jsxs(u.div,{className:"landing-cta-row",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.7,delay:1},children:[e.jsxs("a",{href:"https://github.com/SakaraLabs/orbital-command",target:"_blank",rel:"noopener noreferrer",className:"landing-cta-primary group",children:[e.jsx(ae,{size:18}),"Get Started",e.jsx(re,{size:16,className:"ml-1 transition-transform group-hover:translate-x-1"})]}),e.jsxs("a",{href:"#features",className:"landing-cta-secondary",children:["See Features",e.jsx(Y,{size:16})]})]}),e.jsx(u.div,{className:"landing-install",initial:{opacity:0},animate:{opacity:1},transition:{duration:.6,delay:1.3},children:e.jsx("code",{children:"npm install orbital-command"})})]}),e.jsx(u.div,{className:"landing-hero-visual",initial:{opacity:0,scale:.8},animate:{opacity:1,scale:1},transition:{duration:1.2,delay:.5,ease:y},style:{y:i},children:e.jsx(pt,{})}),e.jsx(u.div,{className:"landing-scroll-indicator",animate:{y:[0,8,0]},transition:{duration:2,repeat:1/0,ease:"easeInOut"},children:e.jsx(Y,{size:20,className:"text-white/30"})})]}),e.jsx("section",{className:"landing-stats",children:e.jsx("div",{className:"landing-stats-inner",children:[{value:7,suffix:"",label:"Dashboard Views"},{value:100,suffix:"%",label:"File-Based"},{value:0,suffix:"",label:"Lock-in",staticText:"0"},{label:"Real-time Sync",staticText:"RT"}].map((r,l)=>e.jsxs("div",{className:"contents",children:[l>0&&e.jsx("div",{className:"landing-stat-divider"}),e.jsxs("div",{className:"landing-stat",children:[e.jsx("span",{className:"landing-stat-value",children:r.staticText??e.jsx(bt,{value:r.value,suffix:r.suffix})}),e.jsx("span",{className:"landing-stat-label",children:r.label})]})]},r.label))})})]})}const kt={cyan:{glow:"rgba(0,188,212,0.15)",border:"rgba(0,188,212,0.3)",text:"#00bcd4"},pink:{glow:"rgba(233,30,99,0.15)",border:"rgba(233,30,99,0.3)",text:"#e91e63"},green:{glow:"rgba(0,230,118,0.15)",border:"rgba(0,230,118,0.3)",text:"#00e676"},amber:{glow:"rgba(255,171,0,0.15)",border:"rgba(255,171,0,0.3)",text:"#ffab00"},purple:{glow:"rgba(117,109,158,0.2)",border:"rgba(117,109,158,0.4)",text:"#9c8fd4"}};function b({icon:t,title:n,description:a,color:s,delay:i=0}){const r=kt[s];return e.jsx(g,{delay:i,children:e.jsxs(u.div,{className:"landing-feature-card group",whileHover:{y:-8,transition:{duration:.3}},children:[e.jsx("div",{className:"landing-feature-icon-wrap",style:{background:r.glow,borderColor:r.border},children:e.jsx(t,{size:24,style:{color:r.text}})}),e.jsx("h3",{className:"landing-feature-title",children:n}),e.jsx("p",{className:"landing-feature-desc",children:a}),e.jsx("div",{className:"landing-feature-glow",style:{background:`radial-gradient(ellipse at center, ${r.glow}, transparent 70%)`}})]})})}function St(){return e.jsx("section",{id:"features",className:"landing-section",children:e.jsxs("div",{className:"landing-section-inner",children:[e.jsx(g,{children:e.jsx("p",{className:"landing-section-tag",children:"Features"})}),e.jsx(g,{delay:.1,children:e.jsxs("h2",{className:"landing-section-title",children:["Everything you need to",e.jsx("br",{})," ",e.jsx("span",{className:"landing-gradient-text",children:"orchestrate AI agents."})]})}),e.jsx(g,{delay:.2,children:e.jsx("p",{className:"landing-section-desc",children:"A complete mission control system that turns Claude Code sessions into observable, manageable workflows with real-time feedback."})}),e.jsxs("div",{className:"landing-features-grid",children:[e.jsx(b,{icon:le,title:"Visual Kanban",description:"Drag-and-drop scope cards across workflow columns. Real-time status updates as Claude agents work through tasks.",color:"cyan",delay:0}),e.jsx(b,{icon:ue,title:"Sprint Orchestration",description:"Batch scopes into sprints with automatic sequencing, dependency resolution, and parallel execution across agents.",color:"pink",delay:.08}),e.jsx(b,{icon:oe,title:"Quality Gates",description:"Enforce standards with configurable gates — typecheck, lint, test, build. Auto-block deployments that fail checks.",color:"green",delay:.16}),e.jsx(b,{icon:ce,title:"Workflow DAG Editor",description:"Visual directed acyclic graph editor for custom workflows. Define columns, transitions, hooks, and inference rules.",color:"purple",delay:.08}),e.jsx(b,{icon:me,title:"Agent Feed",description:"Live stream of all Claude Code events across every session. Filter by agent, scope, or event type. Full audit trail.",color:"amber",delay:.16}),e.jsx(b,{icon:H,title:"Deploy Pipeline",description:"Multi-stage deployment visualization from dev to staging to production. Rollback controls and promotion gates.",color:"cyan",delay:.24})]})]})})}const S=({color:t,children:n})=>e.jsx("span",{style:{color:t},children:n}),E=[{elements:e.jsx(e.Fragment,{children:"$ orbital"}),delay:400},{elements:e.jsx(e.Fragment,{children:" Scaffolding hooks, skills, and agents..."}),delay:800},{elements:e.jsx(e.Fragment,{children:" Writing .claude/hooks/on-scope-change.sh"}),delay:200},{elements:e.jsx(e.Fragment,{children:" Writing .claude/hooks/on-quality-gate.sh"}),delay:200},{elements:e.jsx(e.Fragment,{children:" Creating orbital.config.json"}),delay:300},{elements:e.jsxs(e.Fragment,{children:[" ",e.jsx(S,{color:"#00e676",children:"✓"})," Orbital Command initialized"]}),delay:600},{elements:e.jsx(e.Fragment,{children:" "}),delay:300},{elements:e.jsx(e.Fragment,{children:" Launching dashboard..."}),delay:500},{elements:e.jsx(e.Fragment,{children:" Server running on http://localhost:4444"}),delay:400},{elements:e.jsx(e.Fragment,{children:" Client running on http://localhost:4445"}),delay:200},{elements:e.jsxs(e.Fragment,{children:[" ",e.jsx(S,{color:"#00bcd4",children:"◉"})," Watching scopes/ for changes..."]}),delay:300},{elements:e.jsxs(e.Fragment,{children:[" ",e.jsx(S,{color:"#00bcd4",children:"◉"})," Watching .claude/orbital-events/ for events..."]}),delay:200},{elements:e.jsxs(e.Fragment,{children:[" ",e.jsx(S,{color:"#00e676",children:"✓"})," Dashboard ready — mission control is live"]}),delay:0}];function Et(){const t=c.useRef(null),n=ve(t,{once:!0,amount:.1}),[a,s]=c.useState(0);return c.useEffect(()=>{if(!n)return;let i,r=0;function l(){r>=E.length||(s(r+1),r++,r<E.length&&(i=setTimeout(l,E[r].delay)))}return i=setTimeout(l,600),()=>clearTimeout(i)},[n]),e.jsxs("div",{ref:t,className:"landing-terminal",children:[e.jsxs("div",{className:"landing-terminal-header",children:[e.jsx("div",{className:"landing-terminal-dot landing-terminal-dot-red"}),e.jsx("div",{className:"landing-terminal-dot landing-terminal-dot-yellow"}),e.jsx("div",{className:"landing-terminal-dot landing-terminal-dot-green"}),e.jsx("span",{className:"landing-terminal-title",children:"orbital-command"})]}),e.jsxs("div",{className:"landing-terminal-body",children:[E.slice(0,a).map((i,r)=>e.jsx(u.div,{initial:{opacity:0,x:-8},animate:{opacity:1,x:0},transition:{duration:.3},className:"landing-terminal-line",children:i.elements},r)),e.jsx(u.span,{className:"landing-terminal-cursor",animate:{opacity:[1,0,1]},transition:{duration:1,repeat:1/0},children:"▌"})]})]})}const zt=[{label:"Kanban Board",gradient:"from-cyan-500/20 to-blue-500/20",icon:le},{label:"Quality Gates",gradient:"from-green-500/20 to-emerald-500/20",icon:oe},{label:"Workflow DAG",gradient:"from-purple-500/20 to-pink-500/20",icon:ce},{label:"Agent Feed",gradient:"from-pink-500/20 to-red-500/20",icon:me},{label:"Sprint View",gradient:"from-amber-500/20 to-orange-500/20",icon:ue},{label:"Deploy Pipeline",gradient:"from-cyan-500/20 to-teal-500/20",icon:H}];function Lt(){const t=c.useRef(null),{scrollYProgress:n}=P({target:t,offset:["start end","end start"]}),a=C(n,[0,1],["5%","-15%"]);return e.jsxs("section",{className:"landing-section-full",children:[e.jsxs(g,{className:"text-center mb-12",children:[e.jsx("p",{className:"landing-section-tag",children:"Dashboard"}),e.jsxs("h2",{className:"landing-section-title",children:["Six views. ",e.jsx("span",{className:"landing-gradient-text",children:"One command center."})]})]}),e.jsx("div",{ref:t,className:"overflow-hidden py-8",children:e.jsx(u.div,{className:"flex gap-6 px-8",style:{x:a},children:zt.map(s=>e.jsxs(u.div,{className:`landing-showcase-card bg-gradient-to-br ${s.gradient}`,whileHover:{scale:1.03},transition:{duration:.3},children:[e.jsx(s.icon,{size:48,className:"text-white/30 mb-4"}),e.jsx("span",{className:"text-lg font-medium text-white/80",children:s.label})]},s.label))})})]})}function R({number:t,title:n,description:a,icon:s,delay:i}){return e.jsxs(g,{delay:i,className:"landing-step",children:[e.jsx("div",{className:"landing-step-number",children:t}),e.jsx("div",{className:"landing-step-icon",children:e.jsx(s,{size:28})}),e.jsx("h3",{className:"text-lg font-semibold text-white mt-4 mb-2",children:n}),e.jsx("p",{className:"text-sm text-white/50 leading-relaxed",children:a})]})}const Ct=[{label:"Frontend",sub:"React + Vite + Tailwind",color:"#00bcd4",icon:Me},{label:"Real-time",sub:"Socket.io Push",color:"#e91e63",icon:he},{label:"API",sub:"Express REST",color:"#ffab00",icon:de},{label:"Engine",sub:"Workflow + Events",color:"#00e676",icon:ge}];function It(){return e.jsx("div",{className:"landing-arch-stack",children:Ct.map(t=>e.jsxs(u.div,{className:"landing-arch-layer",whileHover:{x:8,transition:{duration:.2}},style:{borderLeftColor:t.color},children:[e.jsx("div",{className:"landing-arch-icon",style:{color:t.color},children:e.jsx(t.icon,{size:20})}),e.jsxs("div",{children:[e.jsx("div",{className:"text-sm font-semibold text-white",children:t.label}),e.jsx("div",{className:"text-xs text-white/40",children:t.sub})]})]},t.label))})}function Ht(){return e.jsxs("div",{className:"landing-root",children:[e.jsx(vt,{}),e.jsx(Nt,{}),e.jsx(yt,{}),e.jsx(wt,{}),e.jsx(St,{}),e.jsx(Lt,{}),e.jsx("section",{id:"how-it-works",className:"landing-section",children:e.jsxs("div",{className:"landing-section-inner",children:[e.jsx(g,{children:e.jsx("p",{className:"landing-section-tag",children:"How It Works"})}),e.jsx(g,{delay:.1,children:e.jsxs("h2",{className:"landing-section-title",children:["Three steps to",e.jsx("br",{})," ",e.jsx("span",{className:"landing-gradient-text",children:"mission control."})]})}),e.jsxs("div",{className:"landing-steps-grid",children:[e.jsx(R,{number:"01",title:"Initialize",description:"Run orbital in your project. The setup wizard scaffolds hooks, skills, agents, and config into your .claude/ directory. Zero lock-in — everything is plain files.",icon:ae,delay:0}),e.jsx(R,{number:"02",title:"Define Scopes",description:"Write markdown files with YAML frontmatter in scopes/. Each scope is a task card — title, status, category, priority, assignee. Claude reads and updates them.",icon:T,delay:.15}),e.jsx(R,{number:"03",title:"Launch",description:"Select Launch from the hub menu and open the dashboard. Watch your AI fleet in real-time as Claude agents pick up scopes, emit events, and progress through your workflow.",icon:H,delay:.3})]})]})}),e.jsx("section",{className:"landing-section",children:e.jsx("div",{className:"landing-section-inner",children:e.jsxs("div",{className:"landing-split",children:[e.jsxs(k,{direction:"left",className:"flex-1 min-w-0",children:[e.jsx("p",{className:"landing-section-tag",children:"Developer Experience"}),e.jsxs("h2",{className:"landing-section-title text-left",children:["Get running in",e.jsx("br",{})," ",e.jsx("span",{className:"landing-gradient-text",children:"under a minute."})]}),e.jsx("p",{className:"landing-section-desc text-left mt-4",children:"One command to scaffold. One command to launch. File-based architecture means everything is inspectable, versionable, and customizable."}),e.jsxs("div",{className:"landing-dx-features",children:[e.jsxs("div",{className:"landing-dx-item",children:[e.jsx(Ae,{size:16,className:"text-[#00bcd4]"}),e.jsx("span",{children:"Zero-config setup"})]}),e.jsxs("div",{className:"landing-dx-item",children:[e.jsx(de,{size:16,className:"text-[#e91e63]"}),e.jsx("span",{children:"File-based event bus"})]}),e.jsxs("div",{className:"landing-dx-item",children:[e.jsx(he,{size:16,className:"text-[#00e676]"}),e.jsx("span",{children:"Real-time Socket.io sync"})]}),e.jsxs("div",{className:"landing-dx-item",children:[e.jsx(ge,{size:16,className:"text-[#ffab00]"}),e.jsx("span",{children:"SQLite persistence"})]})]})]}),e.jsx(k,{direction:"right",className:"flex-1 min-w-0",children:e.jsx(Et,{})})]})})}),e.jsx("section",{id:"architecture",className:"landing-section",children:e.jsx("div",{className:"landing-section-inner",children:e.jsxs("div",{className:"landing-split",children:[e.jsxs(k,{direction:"left",className:"flex-1 min-w-0",children:[e.jsx("p",{className:"landing-section-tag",children:"Architecture"}),e.jsxs("h2",{className:"landing-section-title text-left",children:["Built on",e.jsx("br",{})," ",e.jsx("span",{className:"landing-gradient-text",children:"open primitives."})]}),e.jsx("p",{className:"landing-section-desc text-left mt-4",children:"Markdown files are tasks. JSON files are events. The workflow engine is pure TypeScript with zero I/O. Everything is observable and hackable."})]}),e.jsx(k,{direction:"right",className:"flex-1 min-w-0",children:e.jsx(It,{})})]})})}),e.jsxs("section",{className:"landing-final-cta",children:[e.jsx("div",{className:"landing-final-cta-bg"}),e.jsxs("div",{className:"relative z-10 max-w-3xl mx-auto text-center px-6",children:[e.jsx(gt,{children:e.jsxs("h2",{className:"landing-final-headline",children:["Ready for",e.jsx("br",{})," ",e.jsx("span",{className:"landing-gradient-text",children:"liftoff?"})]})}),e.jsx(g,{delay:.2,children:e.jsx("p",{className:"text-lg text-white/50 mb-10 leading-relaxed",children:"Install Orbital Command and take control of your AI-powered development workflow. Open source. Zero lock-in. Fully extensible."})}),e.jsx(g,{delay:.4,children:e.jsxs("div",{className:"flex flex-col sm:flex-row items-center justify-center gap-4",children:[e.jsxs("a",{href:"https://github.com/SakaraLabs/orbital-command",target:"_blank",rel:"noopener noreferrer",className:"landing-cta-primary group text-base px-8 py-4",children:[e.jsx(T,{size:18}),"View on GitHub",e.jsx(re,{size:16,className:"ml-1 transition-transform group-hover:translate-x-1"})]}),e.jsx("div",{className:"landing-install",children:e.jsx("code",{children:"npm install orbital-command"})})]})})]})]}),e.jsx("footer",{className:"landing-footer",children:e.jsxs("div",{className:"max-w-7xl mx-auto px-6 flex flex-col sm:flex-row items-center justify-between gap-4",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(fe,{size:16,className:"text-[#00bcd4]"}),e.jsx("span",{className:"text-sm text-white/40",children:"Orbital Command"})]}),e.jsxs("div",{className:"flex items-center gap-6",children:[e.jsx("a",{href:"https://github.com/SakaraLabs/orbital-command",target:"_blank",rel:"noopener noreferrer",className:"text-xs text-white/30 hover:text-white/60 transition-colors",children:"GitHub"}),e.jsx("span",{className:"text-xs text-white/20",children:"MIT License"})]})]})})]})}export{Ht as Landing,Ht as default};