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.
- package/README.md +67 -42
- package/bin/commands/config.js +19 -0
- package/bin/commands/events.js +40 -0
- package/bin/commands/launch.js +126 -0
- package/bin/commands/manifest.js +283 -0
- package/bin/commands/registry.js +104 -0
- package/bin/commands/update.js +24 -0
- package/bin/lib/helpers.js +229 -0
- package/bin/orbital.js +147 -319
- package/dist/assets/Landing-CfQdHR0N.js +11 -0
- package/dist/assets/PrimitivesConfig-DThSipFy.js +32 -0
- package/dist/assets/QualityGates-B4kxM5UU.js +26 -0
- package/dist/assets/SessionTimeline-Bz1iZnmg.js +1 -0
- package/dist/assets/Settings-DLcZwbCT.js +12 -0
- package/dist/assets/SourceControl-BMNIz7Lt.js +36 -0
- package/dist/assets/WorkflowVisualizer-CxuSBOYu.js +69 -0
- package/dist/assets/arrow-down-DVPp6_qp.js +6 -0
- package/dist/assets/bot-NFaJBDn_.js +6 -0
- package/dist/assets/charts-LGLb8hyU.js +68 -0
- package/dist/assets/circle-x-IsFCkBZu.js +6 -0
- package/dist/assets/file-text-J1cebZXF.js +6 -0
- package/dist/assets/globe-WzeyHsUc.js +6 -0
- package/dist/assets/index-BdJ57EhC.css +1 -0
- package/dist/assets/index-o4ScMAuR.js +349 -0
- package/dist/assets/key-CKR8JJSj.js +6 -0
- package/dist/assets/minus-CHBsJyjp.js +6 -0
- package/dist/assets/radio-xqZaR-Uk.js +6 -0
- package/dist/assets/rocket-D_xvvNG6.js +6 -0
- package/dist/assets/shield-TdB1yv_a.js +6 -0
- package/dist/assets/ui-BmsSg9jU.js +53 -0
- package/dist/assets/useSocketListener-0L5yiN5i.js +1 -0
- package/dist/assets/useWorkflowEditor-CqeRWVQX.js +11 -0
- package/dist/assets/{vendor-Dzv9lrRc.js → vendor-Bqt8AJn2.js} +1 -1
- package/dist/assets/workflow-constants-Rw-GmgHZ.js +6 -0
- package/dist/assets/zap-C9wqYMpl.js +6 -0
- package/dist/favicon.svg +1 -0
- package/dist/index.html +6 -5
- package/dist/server/server/__tests__/data-routes.test.js +126 -0
- package/dist/server/server/__tests__/helpers/db.js +17 -0
- package/dist/server/server/__tests__/helpers/mock-emitter.js +8 -0
- package/dist/server/server/__tests__/scope-routes.test.js +138 -0
- package/dist/server/server/__tests__/sprint-routes.test.js +102 -0
- package/dist/server/server/__tests__/workflow-routes.test.js +107 -0
- package/dist/server/server/config-migrator.js +135 -0
- package/dist/server/server/config.js +51 -7
- package/dist/server/server/database.js +21 -28
- package/dist/server/server/global-config.js +143 -0
- package/dist/server/server/index.js +118 -276
- package/dist/server/server/init.js +243 -225
- package/dist/server/server/launch.js +29 -0
- package/dist/server/server/manifest-types.js +8 -0
- package/dist/server/server/manifest.js +454 -0
- package/dist/server/server/migrate-legacy.js +229 -0
- package/dist/server/server/parsers/event-parser.js +4 -1
- package/dist/server/server/parsers/event-parser.test.js +117 -0
- package/dist/server/server/parsers/scope-parser.js +74 -28
- package/dist/server/server/parsers/scope-parser.test.js +230 -0
- package/dist/server/server/project-context.js +265 -0
- package/dist/server/server/project-emitter.js +41 -0
- package/dist/server/server/project-manager.js +297 -0
- package/dist/server/server/routes/aggregate-routes.js +871 -0
- package/dist/server/server/routes/config-routes.js +41 -90
- package/dist/server/server/routes/data-routes.js +25 -123
- package/dist/server/server/routes/dispatch-routes.js +37 -15
- package/dist/server/server/routes/git-routes.js +74 -0
- package/dist/server/server/routes/manifest-routes.js +319 -0
- package/dist/server/server/routes/scope-routes.js +45 -28
- package/dist/server/server/routes/sync-routes.js +134 -0
- package/dist/server/server/routes/version-routes.js +1 -15
- package/dist/server/server/routes/workflow-routes.js +9 -3
- package/dist/server/server/schema.js +3 -0
- package/dist/server/server/services/batch-orchestrator.js +41 -17
- package/dist/server/server/services/claude-session-service.js +17 -14
- package/dist/server/server/services/config-service.js +10 -1
- package/dist/server/server/services/deploy-service.test.js +119 -0
- package/dist/server/server/services/event-service.js +64 -1
- package/dist/server/server/services/event-service.test.js +191 -0
- package/dist/server/server/services/gate-service.test.js +105 -0
- package/dist/server/server/services/git-service.js +108 -4
- package/dist/server/server/services/github-service.js +110 -2
- package/dist/server/server/services/readiness-service.test.js +190 -0
- package/dist/server/server/services/scope-cache.js +5 -1
- package/dist/server/server/services/scope-cache.test.js +142 -0
- package/dist/server/server/services/scope-service.js +222 -131
- package/dist/server/server/services/scope-service.test.js +137 -0
- package/dist/server/server/services/sprint-orchestrator.js +29 -15
- package/dist/server/server/services/sprint-service.js +23 -3
- package/dist/server/server/services/sprint-service.test.js +238 -0
- package/dist/server/server/services/sync-service.js +434 -0
- package/dist/server/server/services/sync-types.js +2 -0
- package/dist/server/server/services/workflow-service.js +26 -5
- package/dist/server/server/services/workflow-service.test.js +159 -0
- package/dist/server/server/settings-sync.js +284 -0
- package/dist/server/server/uninstall.js +195 -0
- package/dist/server/server/update-planner.js +279 -0
- package/dist/server/server/update.js +212 -0
- package/dist/server/server/utils/cc-hooks-parser.js +3 -0
- package/dist/server/server/utils/cc-hooks-parser.test.js +86 -0
- package/dist/server/server/utils/dispatch-utils.js +83 -24
- package/dist/server/server/utils/dispatch-utils.test.js +182 -0
- package/dist/server/server/utils/flag-builder.js +54 -0
- package/dist/server/server/utils/json-fields.js +14 -0
- package/dist/server/server/utils/json-fields.test.js +73 -0
- package/dist/server/server/utils/logger.js +37 -3
- package/dist/server/server/utils/package-info.js +30 -0
- package/dist/server/server/utils/route-helpers.js +47 -0
- package/dist/server/server/utils/route-helpers.test.js +115 -0
- package/dist/server/server/utils/terminal-launcher.js +79 -25
- package/dist/server/server/utils/worktree-manager.js +13 -4
- package/dist/server/server/validator.js +230 -0
- package/dist/server/server/watchers/event-watcher.js +28 -13
- package/dist/server/server/watchers/global-watcher.js +63 -0
- package/dist/server/server/watchers/scope-watcher.js +27 -12
- package/dist/server/server/wizard/config-editor.js +237 -0
- package/dist/server/server/wizard/detect.js +96 -0
- package/dist/server/server/wizard/doctor.js +115 -0
- package/dist/server/server/wizard/index.js +340 -0
- package/dist/server/server/wizard/phases/confirm.js +39 -0
- package/dist/server/server/wizard/phases/project-setup.js +90 -0
- package/dist/server/server/wizard/phases/setup-wizard.js +66 -0
- package/dist/server/server/wizard/phases/welcome.js +32 -0
- package/dist/server/server/wizard/phases/workflow-setup.js +22 -0
- package/dist/server/server/wizard/types.js +29 -0
- package/dist/server/server/wizard/ui.js +73 -0
- package/dist/server/shared/__fixtures__/workflow-configs.js +75 -0
- package/dist/server/shared/api-types.js +80 -1
- package/dist/server/shared/default-workflow.json +65 -0
- package/dist/server/shared/onboarding-tour.test.js +81 -0
- package/dist/server/shared/project-colors.js +24 -0
- package/dist/server/shared/workflow-config.test.js +84 -0
- package/dist/server/shared/workflow-engine.js +1 -1
- package/dist/server/shared/workflow-engine.test.js +302 -0
- package/dist/server/shared/workflow-normalizer.js +101 -0
- package/dist/server/shared/workflow-normalizer.test.js +100 -0
- package/dist/server/src/components/onboarding/tour-steps.js +84 -0
- package/package.json +34 -29
- package/schemas/orbital.config.schema.json +2 -5
- package/scripts/postinstall.js +18 -6
- package/scripts/release.sh +53 -0
- package/server/__tests__/data-routes.test.ts +151 -0
- package/server/__tests__/helpers/db.ts +19 -0
- package/server/__tests__/helpers/mock-emitter.ts +10 -0
- package/server/__tests__/scope-routes.test.ts +158 -0
- package/server/__tests__/sprint-routes.test.ts +118 -0
- package/server/__tests__/workflow-routes.test.ts +120 -0
- package/server/config-migrator.ts +160 -0
- package/server/config.ts +64 -12
- package/server/database.ts +22 -31
- package/server/global-config.ts +204 -0
- package/server/index.ts +139 -316
- package/server/init.ts +266 -234
- package/server/launch.ts +32 -0
- package/server/manifest-types.ts +145 -0
- package/server/manifest.ts +494 -0
- package/server/migrate-legacy.ts +290 -0
- package/server/parsers/event-parser.test.ts +135 -0
- package/server/parsers/event-parser.ts +4 -1
- package/server/parsers/scope-parser.test.ts +270 -0
- package/server/parsers/scope-parser.ts +79 -31
- package/server/project-context.ts +325 -0
- package/server/project-emitter.ts +50 -0
- package/server/project-manager.ts +368 -0
- package/server/routes/aggregate-routes.ts +968 -0
- package/server/routes/config-routes.ts +43 -85
- package/server/routes/data-routes.ts +34 -156
- package/server/routes/dispatch-routes.ts +46 -17
- package/server/routes/git-routes.ts +77 -0
- package/server/routes/manifest-routes.ts +388 -0
- package/server/routes/scope-routes.ts +39 -30
- package/server/routes/sync-routes.ts +175 -0
- package/server/routes/version-routes.ts +1 -16
- package/server/routes/workflow-routes.ts +9 -3
- package/server/schema.ts +3 -0
- package/server/services/batch-orchestrator.ts +41 -17
- package/server/services/claude-session-service.ts +16 -14
- package/server/services/config-service.ts +10 -1
- package/server/services/deploy-service.test.ts +145 -0
- package/server/services/deploy-service.ts +2 -2
- package/server/services/event-service.test.ts +242 -0
- package/server/services/event-service.ts +92 -3
- package/server/services/gate-service.test.ts +131 -0
- package/server/services/gate-service.ts +2 -2
- package/server/services/git-service.ts +137 -4
- package/server/services/github-service.ts +120 -2
- package/server/services/readiness-service.test.ts +217 -0
- package/server/services/scope-cache.test.ts +167 -0
- package/server/services/scope-cache.ts +4 -1
- package/server/services/scope-service.test.ts +169 -0
- package/server/services/scope-service.ts +224 -130
- package/server/services/sprint-orchestrator.ts +30 -15
- package/server/services/sprint-service.test.ts +271 -0
- package/server/services/sprint-service.ts +29 -5
- package/server/services/sync-service.ts +482 -0
- package/server/services/sync-types.ts +77 -0
- package/server/services/workflow-service.test.ts +190 -0
- package/server/services/workflow-service.ts +29 -9
- package/server/settings-sync.ts +359 -0
- package/server/uninstall.ts +214 -0
- package/server/update-planner.ts +346 -0
- package/server/update.ts +263 -0
- package/server/utils/cc-hooks-parser.test.ts +96 -0
- package/server/utils/cc-hooks-parser.ts +4 -0
- package/server/utils/dispatch-utils.test.ts +245 -0
- package/server/utils/dispatch-utils.ts +102 -30
- package/server/utils/flag-builder.ts +56 -0
- package/server/utils/json-fields.test.ts +83 -0
- package/server/utils/json-fields.ts +14 -0
- package/server/utils/logger.ts +40 -3
- package/server/utils/package-info.ts +32 -0
- package/server/utils/route-helpers.test.ts +144 -0
- package/server/utils/route-helpers.ts +50 -0
- package/server/utils/terminal-launcher.ts +85 -25
- package/server/utils/worktree-manager.ts +9 -4
- package/server/validator.ts +270 -0
- package/server/watchers/event-watcher.ts +24 -12
- package/server/watchers/global-watcher.ts +77 -0
- package/server/watchers/scope-watcher.ts +21 -9
- package/server/wizard/config-editor.ts +248 -0
- package/server/wizard/detect.ts +104 -0
- package/server/wizard/doctor.ts +114 -0
- package/server/wizard/index.ts +438 -0
- package/server/wizard/phases/confirm.ts +45 -0
- package/server/wizard/phases/project-setup.ts +106 -0
- package/server/wizard/phases/setup-wizard.ts +78 -0
- package/server/wizard/phases/welcome.ts +39 -0
- package/server/wizard/phases/workflow-setup.ts +28 -0
- package/server/wizard/types.ts +56 -0
- package/server/wizard/ui.ts +92 -0
- package/shared/__fixtures__/workflow-configs.ts +80 -0
- package/shared/api-types.ts +106 -0
- package/shared/onboarding-tour.test.ts +94 -0
- package/shared/project-colors.ts +24 -0
- package/shared/workflow-config.test.ts +111 -0
- package/shared/workflow-config.ts +7 -0
- package/shared/workflow-engine.test.ts +388 -0
- package/shared/workflow-engine.ts +1 -1
- package/shared/workflow-normalizer.test.ts +119 -0
- package/shared/workflow-normalizer.ts +118 -0
- package/templates/agents/QUICK-REFERENCE.md +1 -0
- package/templates/agents/README.md +1 -0
- package/templates/agents/SKILL-TRIGGERS.md +11 -0
- package/templates/agents/green-team/deep-dive.md +361 -0
- package/templates/hooks/end-session.sh +4 -1
- package/templates/hooks/init-session.sh +1 -0
- package/templates/hooks/orbital-emit.sh +2 -2
- package/templates/hooks/orbital-report-deploy.sh +4 -4
- package/templates/hooks/orbital-report-gates.sh +4 -4
- package/templates/hooks/orbital-scope-update.sh +1 -1
- package/templates/hooks/scope-commit-logger.sh +2 -2
- package/templates/hooks/scope-create-cleanup.sh +2 -2
- package/templates/hooks/scope-create-gate.sh +2 -5
- package/templates/hooks/scope-gate.sh +4 -6
- package/templates/hooks/scope-helpers.sh +28 -1
- package/templates/hooks/scope-lifecycle-gate.sh +14 -5
- package/templates/hooks/scope-prepare.sh +67 -12
- package/templates/hooks/scope-transition.sh +14 -6
- package/templates/hooks/time-tracker.sh +2 -5
- package/templates/migrations/renames.json +1 -0
- package/templates/orbital.config.json +8 -6
- package/{shared/default-workflow.json → templates/presets/default.json} +65 -0
- package/templates/presets/development.json +4 -4
- package/templates/presets/gitflow.json +7 -0
- package/templates/prompts/README.md +23 -0
- package/templates/prompts/deep-dive-audit.md +94 -0
- package/templates/quick/rules.md +56 -5
- package/templates/settings-hooks.json +1 -1
- package/templates/skills/git-commit/SKILL.md +27 -7
- package/templates/skills/git-dev/SKILL.md +13 -4
- package/templates/skills/git-main/SKILL.md +13 -3
- package/templates/skills/git-production/SKILL.md +9 -2
- package/templates/skills/git-staging/SKILL.md +11 -3
- package/templates/skills/scope-create/SKILL.md +17 -3
- package/templates/skills/scope-fix-review/SKILL.md +14 -7
- package/templates/skills/scope-implement/SKILL.md +15 -4
- package/templates/skills/scope-post-review/SKILL.md +77 -7
- package/templates/skills/scope-pre-review/SKILL.md +11 -4
- package/templates/skills/scope-verify/SKILL.md +5 -3
- package/templates/skills/test-code-review/SKILL.md +41 -33
- package/templates/skills/test-scaffold/SKILL.md +222 -0
- package/dist/assets/WorkflowVisualizer-BZ21PIIF.js +0 -84
- package/dist/assets/charts-D__PA1zp.js +0 -72
- package/dist/assets/index-D1G6i0nS.css +0 -1
- package/dist/assets/index-DpItvKpf.js +0 -419
- package/dist/assets/ui-BvF022GT.js +0 -53
- package/index.html +0 -15
- package/postcss.config.js +0 -6
- package/src/App.tsx +0 -33
- package/src/components/AgentBadge.tsx +0 -40
- package/src/components/BatchPreflightModal.tsx +0 -115
- package/src/components/CardDisplayToggle.tsx +0 -74
- package/src/components/ColumnHeaderActions.tsx +0 -55
- package/src/components/ColumnMenu.tsx +0 -99
- package/src/components/DeployHistory.tsx +0 -141
- package/src/components/DispatchModal.tsx +0 -164
- package/src/components/DispatchPopover.tsx +0 -139
- package/src/components/DragOverlay.tsx +0 -25
- package/src/components/DriftSidebar.tsx +0 -140
- package/src/components/EnvironmentStrip.tsx +0 -88
- package/src/components/ErrorBoundary.tsx +0 -62
- package/src/components/FilterChip.tsx +0 -105
- package/src/components/GateIndicator.tsx +0 -33
- package/src/components/IdeaDetailModal.tsx +0 -190
- package/src/components/IdeaFormDialog.tsx +0 -113
- package/src/components/KanbanColumn.tsx +0 -201
- package/src/components/MarkdownRenderer.tsx +0 -114
- package/src/components/NeonGrid.tsx +0 -128
- package/src/components/PromotionQueue.tsx +0 -89
- package/src/components/ScopeCard.tsx +0 -234
- package/src/components/ScopeDetailModal.tsx +0 -255
- package/src/components/ScopeFilterBar.tsx +0 -152
- package/src/components/SearchInput.tsx +0 -102
- package/src/components/SessionPanel.tsx +0 -335
- package/src/components/SprintContainer.tsx +0 -303
- package/src/components/SprintDependencyDialog.tsx +0 -78
- package/src/components/SprintPreflightModal.tsx +0 -138
- package/src/components/StatusBar.tsx +0 -168
- package/src/components/SwimCell.tsx +0 -67
- package/src/components/SwimLaneRow.tsx +0 -94
- package/src/components/SwimlaneBoardView.tsx +0 -108
- package/src/components/VersionBadge.tsx +0 -139
- package/src/components/ViewModeSelector.tsx +0 -114
- package/src/components/config/AgentChip.tsx +0 -53
- package/src/components/config/AgentCreateDialog.tsx +0 -321
- package/src/components/config/AgentEditor.tsx +0 -175
- package/src/components/config/DirectoryTree.tsx +0 -582
- package/src/components/config/FileEditor.tsx +0 -550
- package/src/components/config/HookChip.tsx +0 -50
- package/src/components/config/StageCard.tsx +0 -198
- package/src/components/config/TransitionZone.tsx +0 -173
- package/src/components/config/UnifiedWorkflowPipeline.tsx +0 -216
- package/src/components/config/WorkflowPipeline.tsx +0 -161
- package/src/components/source-control/BranchList.tsx +0 -93
- package/src/components/source-control/BranchPanel.tsx +0 -105
- package/src/components/source-control/CommitLog.tsx +0 -100
- package/src/components/source-control/CommitRow.tsx +0 -47
- package/src/components/source-control/GitHubPanel.tsx +0 -110
- package/src/components/source-control/GitHubSetupGuide.tsx +0 -52
- package/src/components/source-control/GitOverviewBar.tsx +0 -101
- package/src/components/source-control/PullRequestList.tsx +0 -69
- package/src/components/source-control/WorktreeList.tsx +0 -80
- package/src/components/ui/badge.tsx +0 -41
- package/src/components/ui/button.tsx +0 -55
- package/src/components/ui/card.tsx +0 -78
- package/src/components/ui/dialog.tsx +0 -94
- package/src/components/ui/popover.tsx +0 -33
- package/src/components/ui/scroll-area.tsx +0 -54
- package/src/components/ui/separator.tsx +0 -28
- package/src/components/ui/tabs.tsx +0 -52
- package/src/components/ui/toggle-switch.tsx +0 -35
- package/src/components/ui/tooltip.tsx +0 -27
- package/src/components/workflow/AddEdgeDialog.tsx +0 -217
- package/src/components/workflow/AddListDialog.tsx +0 -201
- package/src/components/workflow/ChecklistEditor.tsx +0 -239
- package/src/components/workflow/CommandPrefixManager.tsx +0 -118
- package/src/components/workflow/ConfigSettingsPanel.tsx +0 -189
- package/src/components/workflow/DirectionSelector.tsx +0 -133
- package/src/components/workflow/DispatchConfigPanel.tsx +0 -180
- package/src/components/workflow/EdgeDetailPanel.tsx +0 -236
- package/src/components/workflow/EdgePropertyEditor.tsx +0 -251
- package/src/components/workflow/EditToolbar.tsx +0 -138
- package/src/components/workflow/HookDetailPanel.tsx +0 -250
- package/src/components/workflow/HookExecutionLog.tsx +0 -24
- package/src/components/workflow/HookSourceModal.tsx +0 -129
- package/src/components/workflow/HooksDashboard.tsx +0 -363
- package/src/components/workflow/ListPropertyEditor.tsx +0 -251
- package/src/components/workflow/MigrationPreviewDialog.tsx +0 -237
- package/src/components/workflow/MovementRulesPanel.tsx +0 -188
- package/src/components/workflow/NodeDetailPanel.tsx +0 -245
- package/src/components/workflow/PresetSelector.tsx +0 -414
- package/src/components/workflow/SkillCommandBuilder.tsx +0 -174
- package/src/components/workflow/WorkflowEdgeComponent.tsx +0 -145
- package/src/components/workflow/WorkflowNode.tsx +0 -147
- package/src/components/workflow/graphLayout.ts +0 -186
- package/src/components/workflow/mergeHooks.ts +0 -85
- package/src/components/workflow/useEditHistory.ts +0 -88
- package/src/components/workflow/useWorkflowEditor.ts +0 -262
- package/src/components/workflow/validateConfig.ts +0 -70
- package/src/hooks/useActiveDispatches.ts +0 -198
- package/src/hooks/useBoardSettings.ts +0 -170
- package/src/hooks/useCardDisplay.ts +0 -57
- package/src/hooks/useCcHooks.ts +0 -24
- package/src/hooks/useConfigTree.ts +0 -51
- package/src/hooks/useEnforcementRules.ts +0 -46
- package/src/hooks/useEvents.ts +0 -59
- package/src/hooks/useFileEditor.ts +0 -165
- package/src/hooks/useGates.ts +0 -57
- package/src/hooks/useIdeaActions.ts +0 -53
- package/src/hooks/useKanbanDnd.ts +0 -410
- package/src/hooks/useOrbitalConfig.ts +0 -54
- package/src/hooks/usePipeline.ts +0 -47
- package/src/hooks/usePipelineData.ts +0 -338
- package/src/hooks/useReconnect.ts +0 -25
- package/src/hooks/useScopeFilters.ts +0 -125
- package/src/hooks/useScopeSessions.ts +0 -44
- package/src/hooks/useScopes.ts +0 -67
- package/src/hooks/useSearch.ts +0 -67
- package/src/hooks/useSettings.tsx +0 -187
- package/src/hooks/useSocket.ts +0 -25
- package/src/hooks/useSourceControl.ts +0 -105
- package/src/hooks/useSprintPreflight.ts +0 -55
- package/src/hooks/useSprints.ts +0 -154
- package/src/hooks/useStatusBarHighlight.ts +0 -18
- package/src/hooks/useSwimlaneBoardSettings.ts +0 -104
- package/src/hooks/useTheme.ts +0 -9
- package/src/hooks/useTransitionReadiness.ts +0 -53
- package/src/hooks/useVersion.ts +0 -155
- package/src/hooks/useViolations.ts +0 -65
- package/src/hooks/useWorkflow.tsx +0 -125
- package/src/hooks/useZoomModifier.ts +0 -19
- package/src/index.css +0 -797
- package/src/layouts/DashboardLayout.tsx +0 -113
- package/src/lib/collisionDetection.ts +0 -20
- package/src/lib/scope-fields.ts +0 -61
- package/src/lib/swimlane.ts +0 -146
- package/src/lib/utils.ts +0 -15
- package/src/main.tsx +0 -19
- package/src/socket.ts +0 -11
- package/src/types/index.ts +0 -497
- package/src/views/AgentFeed.tsx +0 -339
- package/src/views/DeployPipeline.tsx +0 -59
- package/src/views/EnforcementView.tsx +0 -378
- package/src/views/PrimitivesConfig.tsx +0 -500
- package/src/views/QualityGates.tsx +0 -1012
- package/src/views/ScopeBoard.tsx +0 -454
- package/src/views/SessionTimeline.tsx +0 -516
- package/src/views/Settings.tsx +0 -183
- package/src/views/SourceControl.tsx +0 -95
- package/src/views/WorkflowVisualizer.tsx +0 -382
- package/tailwind.config.js +0 -161
- package/tsconfig.json +0 -25
- 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 {
|
|
6
|
-
|
|
7
|
-
|
|
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
|
-
//
|
|
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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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
|
-
|
|
43
|
-
const
|
|
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
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
return
|
|
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
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
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
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
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
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
:
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
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
|
-
|
|
203
|
-
|
|
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
|
-
|
|
207
|
-
|
|
208
|
-
|
|
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
|
-
|
|
216
|
-
|
|
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
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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};
|