orbital-command 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/orbital.js +640 -37
- package/dist/assets/PrimitivesConfig-CrmQXYh4.js +32 -0
- package/dist/assets/QualityGates-BbasOsF3.js +21 -0
- package/dist/assets/SessionTimeline-CGeJsVvy.js +1 -0
- package/dist/assets/Settings-oiM496mc.js +12 -0
- package/dist/assets/SourceControl-B1fP2nJL.js +41 -0
- package/dist/assets/WorkflowVisualizer-CWLYf-f0.js +74 -0
- package/dist/assets/arrow-down-CPy85_J6.js +6 -0
- package/dist/assets/charts-DbDg0Psc.js +68 -0
- package/dist/assets/circle-x-Cwz6ZQDV.js +6 -0
- package/dist/assets/file-text-C46Xr65c.js +6 -0
- package/dist/assets/formatDistanceToNow-BMqsSP44.js +1 -0
- package/dist/assets/globe-Cn2yNZUD.js +6 -0
- package/dist/assets/index-Aj4sV8Al.css +1 -0
- package/dist/assets/index-Bc9dK3MW.js +354 -0
- package/dist/assets/key-OPaNTWJ5.js +6 -0
- package/dist/assets/minus-GMsbpKym.js +6 -0
- package/dist/assets/shield-DwAFkDYI.js +6 -0
- package/dist/assets/ui-BmsSg9jU.js +53 -0
- package/dist/assets/useWorkflowEditor-BJkTX_NR.js +16 -0
- package/dist/assets/{vendor-Dzv9lrRc.js → vendor-Bqt8AJn2.js} +1 -1
- package/dist/assets/zap-DfbUoOty.js +11 -0
- package/dist/favicon.svg +1 -0
- package/dist/index.html +6 -5
- package/dist/server/server/__tests__/data-routes.test.js +124 -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 +137 -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 +138 -0
- package/dist/server/server/config.js +17 -2
- package/dist/server/server/database.js +27 -12
- package/dist/server/server/global-config.js +143 -0
- package/dist/server/server/index.js +882 -252
- package/dist/server/server/init.js +579 -194
- 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.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 +255 -0
- package/dist/server/server/project-emitter.js +41 -0
- package/dist/server/server/project-manager.js +297 -0
- package/dist/server/server/routes/config-routes.js +1 -3
- package/dist/server/server/routes/data-routes.js +22 -110
- package/dist/server/server/routes/dispatch-routes.js +15 -9
- 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 +37 -23
- 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 +2 -0
- package/dist/server/server/services/batch-orchestrator.js +26 -16
- package/dist/server/server/services/claude-session-service.js +17 -14
- 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 +217 -126
- package/dist/server/server/services/scope-service.test.js +137 -0
- package/dist/server/server/services/sprint-orchestrator.js +7 -6
- package/dist/server/server/services/sprint-service.js +21 -1
- 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/telemetry-service.js +143 -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/update-planner.js +279 -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 +77 -20
- package/dist/server/server/utils/dispatch-utils.test.js +182 -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 +10 -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/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 +155 -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 +35 -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 +74 -0
- package/dist/server/shared/__fixtures__/workflow-configs.js +75 -0
- 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.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 +20 -15
- package/schemas/orbital.config.schema.json +16 -1
- package/scripts/postinstall.js +55 -7
- package/server/__tests__/data-routes.test.ts +149 -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 +157 -0
- package/server/__tests__/sprint-routes.test.ts +118 -0
- package/server/__tests__/workflow-routes.test.ts +120 -0
- package/server/config-migrator.ts +163 -0
- package/server/config.ts +26 -2
- package/server/database.ts +35 -18
- package/server/global-config.ts +200 -0
- package/server/index.ts +975 -287
- package/server/init.ts +625 -182
- 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/scope-parser.test.ts +270 -0
- package/server/parsers/scope-parser.ts +79 -31
- package/server/project-context.ts +309 -0
- package/server/project-emitter.ts +50 -0
- package/server/project-manager.ts +369 -0
- package/server/routes/config-routes.ts +3 -5
- package/server/routes/data-routes.ts +28 -141
- package/server/routes/dispatch-routes.ts +19 -11
- package/server/routes/git-routes.ts +77 -0
- package/server/routes/manifest-routes.ts +388 -0
- package/server/routes/scope-routes.ts +29 -25
- 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 +2 -0
- package/server/services/batch-orchestrator.ts +24 -16
- package/server/services/claude-session-service.ts +16 -14
- 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 +220 -126
- package/server/services/sprint-orchestrator.ts +7 -7
- package/server/services/sprint-service.test.ts +271 -0
- package/server/services/sprint-service.ts +27 -3
- package/server/services/sync-service.ts +482 -0
- package/server/services/sync-types.ts +77 -0
- package/server/services/telemetry-service.ts +195 -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/update-planner.ts +346 -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 +97 -27
- package/server/utils/logger.ts +40 -3
- package/server/utils/package-info.ts +32 -0
- package/server/utils/route-helpers.ts +12 -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/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 +187 -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 +43 -0
- package/server/wizard/phases/workflow-setup.ts +28 -0
- package/server/wizard/types.ts +56 -0
- package/server/wizard/ui.ts +93 -0
- package/shared/__fixtures__/workflow-configs.ts +80 -0
- package/shared/default-workflow.json +65 -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-normalizer.test.ts +119 -0
- package/shared/workflow-normalizer.ts +118 -0
- package/templates/hooks/end-session.sh +3 -1
- 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-create-cleanup.sh +2 -2
- package/templates/hooks/scope-create-gate.sh +0 -1
- package/templates/hooks/scope-helpers.sh +18 -0
- package/templates/hooks/scope-prepare.sh +66 -11
- package/templates/migrations/renames.json +1 -0
- package/templates/orbital.config.json +7 -2
- package/templates/settings-hooks.json +1 -1
- package/templates/skills/git-commit/SKILL.md +9 -4
- package/templates/skills/git-dev/SKILL.md +8 -3
- package/templates/skills/git-main/SKILL.md +8 -2
- package/templates/skills/git-production/SKILL.md +6 -2
- package/templates/skills/git-staging/SKILL.md +8 -3
- package/templates/skills/scope-create/SKILL.md +17 -3
- package/templates/skills/scope-fix-review/SKILL.md +6 -3
- package/templates/skills/scope-implement/SKILL.md +4 -1
- package/templates/skills/scope-post-review/SKILL.md +63 -5
- package/templates/skills/scope-pre-review/SKILL.md +5 -2
- 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
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase 1: Project configuration — name, commands, ports.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import * as p from '@clack/prompts';
|
|
6
|
+
import type { ProjectSetupState } from '../types.js';
|
|
7
|
+
import { NOTES, formatDetectedCommands } from '../ui.js';
|
|
8
|
+
import { detectProjectName, detectCommands, detectPortConflict } from '../detect.js';
|
|
9
|
+
|
|
10
|
+
export async function phaseProjectSetup(state: ProjectSetupState): Promise<void> {
|
|
11
|
+
p.note(NOTES.projectConfig, 'Project Configuration');
|
|
12
|
+
|
|
13
|
+
// 1. Project name
|
|
14
|
+
const defaultName = detectProjectName(state.projectRoot);
|
|
15
|
+
const name = await p.text({
|
|
16
|
+
message: 'Project name',
|
|
17
|
+
placeholder: defaultName,
|
|
18
|
+
defaultValue: defaultName,
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
if (p.isCancel(name)) {
|
|
22
|
+
p.cancel('Setup cancelled.');
|
|
23
|
+
process.exit(0);
|
|
24
|
+
}
|
|
25
|
+
state.projectName = name;
|
|
26
|
+
|
|
27
|
+
// 2. Command detection
|
|
28
|
+
const detected = detectCommands(state.projectRoot);
|
|
29
|
+
state.detectedCommands = detected;
|
|
30
|
+
const detectedCount = Object.values(detected).filter(v => v !== null).length;
|
|
31
|
+
|
|
32
|
+
if (detectedCount > 0) {
|
|
33
|
+
p.note(formatDetectedCommands(detected), `Detected ${detectedCount} command(s) from package.json`);
|
|
34
|
+
|
|
35
|
+
const useDetected = await p.confirm({
|
|
36
|
+
message: 'Use these detected commands for quality gates?',
|
|
37
|
+
initialValue: true,
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
if (p.isCancel(useDetected)) {
|
|
41
|
+
p.cancel('Setup cancelled.');
|
|
42
|
+
process.exit(0);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if (useDetected) {
|
|
46
|
+
state.selectedCommands = { ...detected };
|
|
47
|
+
} else {
|
|
48
|
+
state.selectedCommands = await promptCommands(detected);
|
|
49
|
+
}
|
|
50
|
+
} else {
|
|
51
|
+
p.log.info('No build commands detected from package.json. You can configure them later with `orbital config`.');
|
|
52
|
+
state.selectedCommands = detected;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// 3. Port conflict detection
|
|
56
|
+
const conflict = detectPortConflict(4444);
|
|
57
|
+
if (conflict) {
|
|
58
|
+
p.log.warn(`Port 4444 is already used by "${conflict}".`);
|
|
59
|
+
|
|
60
|
+
const serverPort = await p.text({
|
|
61
|
+
message: 'Server port',
|
|
62
|
+
placeholder: '4446',
|
|
63
|
+
defaultValue: '4446',
|
|
64
|
+
validate: (val) => {
|
|
65
|
+
const n = Number(val);
|
|
66
|
+
if (isNaN(n) || n < 1 || n > 65535) return 'Must be a valid port (1-65535)';
|
|
67
|
+
return undefined;
|
|
68
|
+
},
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
if (p.isCancel(serverPort)) {
|
|
72
|
+
p.cancel('Setup cancelled.');
|
|
73
|
+
process.exit(0);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
state.serverPort = Number(serverPort);
|
|
77
|
+
state.clientPort = state.serverPort + 1;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
async function promptCommands(defaults: Record<string, string | null>): Promise<Record<string, string | null>> {
|
|
82
|
+
const commands: Record<string, string | null> = {};
|
|
83
|
+
const labels: Record<string, string> = {
|
|
84
|
+
typeCheck: 'Type check command',
|
|
85
|
+
lint: 'Lint command',
|
|
86
|
+
build: 'Build command',
|
|
87
|
+
test: 'Test command',
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
for (const [key, defaultVal] of Object.entries(defaults)) {
|
|
91
|
+
const val = await p.text({
|
|
92
|
+
message: labels[key] || key,
|
|
93
|
+
placeholder: defaultVal || 'none',
|
|
94
|
+
defaultValue: defaultVal || '',
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
if (p.isCancel(val)) {
|
|
98
|
+
p.cancel('Setup cancelled.');
|
|
99
|
+
process.exit(0);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
commands[key] = val || null;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
return commands;
|
|
106
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase 1: Setup Wizard — runs on first install or when ~/.orbital/ is missing.
|
|
3
|
+
*
|
|
4
|
+
* Creates the Orbital home directory, seeds primitives, and optionally
|
|
5
|
+
* lets the user link projects immediately.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import fs from 'fs';
|
|
9
|
+
import * as p from '@clack/prompts';
|
|
10
|
+
import pc from 'picocolors';
|
|
11
|
+
import type { SetupState } from '../types.js';
|
|
12
|
+
import { NOTES } from '../ui.js';
|
|
13
|
+
import { isValidProjectPath, resolveProjectPath, ORBITAL_HOME } from '../detect.js';
|
|
14
|
+
|
|
15
|
+
export async function phaseSetupWizard(state: SetupState): Promise<void> {
|
|
16
|
+
// Welcome and core concepts
|
|
17
|
+
p.note(NOTES.setupWelcome, 'Welcome');
|
|
18
|
+
|
|
19
|
+
// Create ~/.orbital/ and seed primitives
|
|
20
|
+
const s = p.spinner();
|
|
21
|
+
s.start('Setting up Orbital Command...');
|
|
22
|
+
|
|
23
|
+
try {
|
|
24
|
+
const { ensureOrbitalHome } = await import('../../global-config.js');
|
|
25
|
+
const { seedGlobalPrimitives } = await import('../../init.js');
|
|
26
|
+
|
|
27
|
+
ensureOrbitalHome();
|
|
28
|
+
seedGlobalPrimitives();
|
|
29
|
+
|
|
30
|
+
// Create empty registry if it doesn't exist
|
|
31
|
+
const registryPath = `${ORBITAL_HOME}/config.json`;
|
|
32
|
+
if (!fs.existsSync(registryPath)) {
|
|
33
|
+
fs.writeFileSync(registryPath, JSON.stringify({ version: 1, projects: [] }, null, 2), 'utf8');
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
s.stop('Orbital Command is ready.');
|
|
37
|
+
} catch (err) {
|
|
38
|
+
s.stop('Setup failed.');
|
|
39
|
+
p.log.error(err instanceof Error ? err.message : String(err));
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Offer to link projects
|
|
44
|
+
p.note(NOTES.addProject, 'Projects');
|
|
45
|
+
|
|
46
|
+
let addMore = true;
|
|
47
|
+
while (addMore) {
|
|
48
|
+
const wantsProject = await p.confirm({
|
|
49
|
+
message: state.linkedProjects.length === 0
|
|
50
|
+
? 'Add a project now?'
|
|
51
|
+
: 'Add another project?',
|
|
52
|
+
initialValue: state.linkedProjects.length === 0,
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
if (p.isCancel(wantsProject) || !wantsProject) {
|
|
56
|
+
addMore = false;
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const projectPath = await p.text({
|
|
61
|
+
message: 'Project path',
|
|
62
|
+
placeholder: '~/Code/my-project',
|
|
63
|
+
validate: (val) => {
|
|
64
|
+
if (!val || !val.trim()) return 'Path is required';
|
|
65
|
+
return isValidProjectPath(val.trim());
|
|
66
|
+
},
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
if (p.isCancel(projectPath)) {
|
|
70
|
+
addMore = false;
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const resolved = resolveProjectPath(projectPath.trim());
|
|
75
|
+
state.linkedProjects.push(resolved);
|
|
76
|
+
p.log.success(`Added: ${pc.cyan(resolved)}`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase 2 welcome gate — project-scoped only.
|
|
3
|
+
*
|
|
4
|
+
* If the project is already initialized, offers re-init or config editor.
|
|
5
|
+
* If not, returns false to continue the project setup flow.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import * as p from '@clack/prompts';
|
|
9
|
+
import pc from 'picocolors';
|
|
10
|
+
import type { ProjectSetupState } from '../types.js';
|
|
11
|
+
import { NOTES } from '../ui.js';
|
|
12
|
+
import { runConfigEditor } from '../config-editor.js';
|
|
13
|
+
|
|
14
|
+
export async function phaseWelcome(state: ProjectSetupState): Promise<boolean> {
|
|
15
|
+
if (state.isProjectInitialized) {
|
|
16
|
+
p.note(NOTES.reconfigure, pc.yellow('Already Initialized'));
|
|
17
|
+
|
|
18
|
+
const action = await p.select({
|
|
19
|
+
message: 'What would you like to do?',
|
|
20
|
+
options: [
|
|
21
|
+
{ value: 'reinit', label: 'Re-initialize (--force)', hint: 'reset all templates to defaults' },
|
|
22
|
+
{ value: 'configure', label: 'Open config editor', hint: 'modify settings without resetting' },
|
|
23
|
+
{ value: 'cancel', label: 'Cancel' },
|
|
24
|
+
],
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
if (p.isCancel(action) || action === 'cancel') {
|
|
28
|
+
p.cancel('Cancelled.');
|
|
29
|
+
process.exit(0);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
if (action === 'configure') {
|
|
33
|
+
await runConfigEditor(state.projectRoot, state.packageVersion, []);
|
|
34
|
+
process.exit(0);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Re-init — continue through the full project setup with force
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Not initialized — continue normally
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase 2: Workflow preset selection.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import * as p from '@clack/prompts';
|
|
6
|
+
import type { ProjectSetupState } from '../types.js';
|
|
7
|
+
import { WORKFLOW_PRESETS } from '../types.js';
|
|
8
|
+
import { NOTES } from '../ui.js';
|
|
9
|
+
|
|
10
|
+
export async function phaseWorkflowSetup(state: ProjectSetupState): Promise<void> {
|
|
11
|
+
p.note(NOTES.workflow, 'Workflow Selection');
|
|
12
|
+
|
|
13
|
+
const preset = await p.select({
|
|
14
|
+
message: 'Choose a workflow preset',
|
|
15
|
+
options: WORKFLOW_PRESETS.map(p => ({
|
|
16
|
+
value: p.value,
|
|
17
|
+
label: p.label,
|
|
18
|
+
hint: p.hint,
|
|
19
|
+
})),
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
if (p.isCancel(preset)) {
|
|
23
|
+
p.cancel('Setup cancelled.');
|
|
24
|
+
process.exit(0);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
state.workflowPreset = preset as string;
|
|
28
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types for the interactive CLI wizard.
|
|
3
|
+
*
|
|
4
|
+
* Two wizard flows:
|
|
5
|
+
* Phase 1 (SetupState) — first-time Orbital setup, ~/.orbital/ creation
|
|
6
|
+
* Phase 2 (ProjectSetupState) — per-project scaffolding into .claude/
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export interface SetupState {
|
|
10
|
+
packageVersion: string;
|
|
11
|
+
isFirstTime: boolean; // ~/.orbital/ doesn't exist yet
|
|
12
|
+
linkedProjects: string[]; // project paths added during setup
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface ProjectSetupState {
|
|
16
|
+
projectRoot: string;
|
|
17
|
+
isProjectInitialized: boolean; // .claude/orbital.config.json exists
|
|
18
|
+
packageVersion: string;
|
|
19
|
+
|
|
20
|
+
// Collected from phases
|
|
21
|
+
projectName?: string;
|
|
22
|
+
serverPort?: number;
|
|
23
|
+
clientPort?: number;
|
|
24
|
+
detectedCommands?: Record<string, string | null>;
|
|
25
|
+
selectedCommands?: Record<string, string | null>;
|
|
26
|
+
workflowPreset?: string; // 'default' | 'minimal' | 'development' | 'gitflow'
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export interface PresetInfo {
|
|
30
|
+
value: string;
|
|
31
|
+
label: string;
|
|
32
|
+
hint: string;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export const WORKFLOW_PRESETS: PresetInfo[] = [
|
|
36
|
+
{
|
|
37
|
+
value: 'default',
|
|
38
|
+
label: 'Default',
|
|
39
|
+
hint: '7 lists, trunk-based — Icebox → Planning → Backlog → Implementing → Review → Completed → Main',
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
value: 'minimal',
|
|
43
|
+
label: 'Minimal',
|
|
44
|
+
hint: '3 lists — To Do → In Progress → Done',
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
value: 'development',
|
|
48
|
+
label: 'Development',
|
|
49
|
+
hint: '5 lists, dev branch — Backlog → Implementing → Review → Completed → Dev',
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
value: 'gitflow',
|
|
53
|
+
label: 'Gitflow',
|
|
54
|
+
hint: '9 lists, multi-branch — Full pipeline with Dev, Staging, and Production',
|
|
55
|
+
},
|
|
56
|
+
];
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared UI helpers, concept notes, and formatting for the wizard.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import pc from 'picocolors';
|
|
6
|
+
|
|
7
|
+
// ─── Concept Notes ──────────────────────────────────────────────
|
|
8
|
+
|
|
9
|
+
export const NOTES = {
|
|
10
|
+
// Phase 1: Setup wizard (runs on install / first use)
|
|
11
|
+
setupWelcome: `Orbital Command is a mission control layer for Claude Code.
|
|
12
|
+
|
|
13
|
+
It gives your projects a real-time dashboard with a Kanban board,
|
|
14
|
+
${pc.cyan('scopes')} (work items), ${pc.cyan('workflow stages')}, ${pc.cyan('quality gates')},
|
|
15
|
+
${pc.cyan('dispatches')} (automated Claude sessions), and a ${pc.cyan('sprint orchestrator')}.
|
|
16
|
+
|
|
17
|
+
Everything is driven by config files and hooks inside your project's
|
|
18
|
+
${pc.cyan('.claude/')} directory — no database or external service required.`,
|
|
19
|
+
|
|
20
|
+
setupComplete: `${pc.bold('Setup complete.')}
|
|
21
|
+
|
|
22
|
+
${pc.cyan('orbital init')} Add a project (run in a project directory)
|
|
23
|
+
${pc.cyan('orbital launch --open')} Start the dashboard
|
|
24
|
+
${pc.cyan('orbital doctor')} Health check & version info`,
|
|
25
|
+
|
|
26
|
+
addProject: `You can add projects now or later with ${pc.cyan('orbital init')}.
|
|
27
|
+
Each project gets its own workflow, scopes, and quality gates.`,
|
|
28
|
+
|
|
29
|
+
// Phase 2: Project setup (runs per-project)
|
|
30
|
+
reconfigure: `This project is already initialized with Orbital Command.
|
|
31
|
+
You can reconfigure settings or run ${pc.cyan('orbital init --force')} to reset.`,
|
|
32
|
+
|
|
33
|
+
projectConfig: `${pc.bold('Project Config')} ${pc.dim('(.claude/orbital.config.json)')}
|
|
34
|
+
|
|
35
|
+
Each project gets its own config inside ${pc.cyan('.claude/')}. The project
|
|
36
|
+
config controls the name shown in the dashboard, ports, build commands
|
|
37
|
+
used by quality gates, and agent definitions.`,
|
|
38
|
+
|
|
39
|
+
workflow: `${pc.bold('Workflows')} ${pc.dim('(Scopes, Lists, Dispatches)')}
|
|
40
|
+
|
|
41
|
+
Orbital organizes work into ${pc.cyan('scopes')} (cards) that move through
|
|
42
|
+
${pc.cyan('lists')} (Kanban columns). Transitions between lists can trigger
|
|
43
|
+
commands, quality gates, and Claude Code sessions (${pc.cyan('dispatches')}).
|
|
44
|
+
|
|
45
|
+
Choose a preset to start — you can customize it later from the
|
|
46
|
+
dashboard's workflow editor or by editing ${pc.cyan('.claude/config/workflow.json')}.`,
|
|
47
|
+
|
|
48
|
+
postInstall: (counts: { hooks: number; skills: number; agents: number }) =>
|
|
49
|
+
`${pc.bold('What was just created')}
|
|
50
|
+
|
|
51
|
+
${pc.cyan('Hooks')} (${counts.hooks}) Lifecycle scripts that enforce rules on transitions
|
|
52
|
+
${pc.cyan('Skills')} (${counts.skills}) Slash commands for Claude (/scope-create, /git-commit, etc.)
|
|
53
|
+
${pc.cyan('Agents')} (${counts.agents}) Team specifications for code review, architecture, security
|
|
54
|
+
${pc.cyan('Workflow')} Your selected preset defining lists and transitions
|
|
55
|
+
${pc.cyan('Quality Gates')} Automated checks (lint, typecheck, tests) before transitions`,
|
|
56
|
+
|
|
57
|
+
nextSteps: `${pc.bold('Next Steps')}
|
|
58
|
+
|
|
59
|
+
1. ${pc.cyan('orbital launch --open')} Open the dashboard
|
|
60
|
+
2. Create a scope from the board or use ${pc.cyan('/scope-create')}
|
|
61
|
+
3. Use ${pc.cyan('/scope-implement')} to start working on a scope
|
|
62
|
+
|
|
63
|
+
${pc.bold('Useful Commands')}
|
|
64
|
+
|
|
65
|
+
${pc.cyan('orbital status')} See template sync status
|
|
66
|
+
${pc.cyan('orbital config')} Modify project settings
|
|
67
|
+
${pc.cyan('orbital update')} Sync to latest templates
|
|
68
|
+
${pc.cyan('orbital doctor')} Health check & version info`,
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
// ─── Formatting Helpers ─────────────────────────────────────────
|
|
72
|
+
|
|
73
|
+
export function formatDetectedCommands(commands: Record<string, string | null>): string {
|
|
74
|
+
const entries = Object.entries(commands).filter(([, v]) => v !== null);
|
|
75
|
+
if (entries.length === 0) return pc.dim(' No commands detected');
|
|
76
|
+
|
|
77
|
+
return entries
|
|
78
|
+
.map(([key, val]) => ` ${pc.cyan(key.padEnd(12))} ${val}`)
|
|
79
|
+
.join('\n');
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export function formatSummary(state: {
|
|
83
|
+
projectName?: string;
|
|
84
|
+
workflowPreset?: string;
|
|
85
|
+
serverPort?: number;
|
|
86
|
+
clientPort?: number;
|
|
87
|
+
}): string {
|
|
88
|
+
return [
|
|
89
|
+
` Project: ${pc.cyan(state.projectName || 'Unknown')}`,
|
|
90
|
+
` Workflow: ${pc.cyan(state.workflowPreset || 'default')}`,
|
|
91
|
+
` Ports: ${pc.cyan(String(state.serverPort || 4444))} (server) / ${pc.cyan(String(state.clientPort || 4445))} (client)`,
|
|
92
|
+
].join('\n');
|
|
93
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { WorkflowConfig } from '../workflow-config.js';
|
|
2
|
+
import defaultWorkflowJson from '../default-workflow.json' with { type: 'json' };
|
|
3
|
+
|
|
4
|
+
/** The full 7-list trunk-based workflow from default-workflow.json */
|
|
5
|
+
export const DEFAULT_CONFIG = defaultWorkflowJson as unknown as WorkflowConfig;
|
|
6
|
+
|
|
7
|
+
/** Smallest valid config: 2 lists, 1 edge, 1 entry point */
|
|
8
|
+
export const MINIMAL_CONFIG: WorkflowConfig = {
|
|
9
|
+
version: 1,
|
|
10
|
+
name: 'Minimal',
|
|
11
|
+
lists: [
|
|
12
|
+
{ id: 'todo', label: 'To Do', order: 0, color: '0 0% 50%', hex: '#808080', isEntryPoint: true, hasDirectory: true },
|
|
13
|
+
{ id: 'done', label: 'Done', order: 1, color: '120 50% 50%', hex: '#40bf40', hasDirectory: true },
|
|
14
|
+
],
|
|
15
|
+
edges: [
|
|
16
|
+
{ from: 'todo', to: 'done', direction: 'forward', command: null, confirmLevel: 'quick', label: 'Complete', description: 'Mark as done' },
|
|
17
|
+
],
|
|
18
|
+
terminalStatuses: ['done'],
|
|
19
|
+
allowedCommandPrefixes: ['/test-'],
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
/** Config with hooks for hook-related tests */
|
|
23
|
+
export const CONFIG_WITH_HOOKS: WorkflowConfig = {
|
|
24
|
+
version: 1,
|
|
25
|
+
name: 'With Hooks',
|
|
26
|
+
lists: [
|
|
27
|
+
{ id: 'backlog', label: 'Backlog', order: 0, color: '0 0% 50%', hex: '#808080', isEntryPoint: true, hasDirectory: true, supportsSprint: true },
|
|
28
|
+
{ id: 'active', label: 'Active', order: 1, color: '200 80% 50%', hex: '#1a8ccc', hasDirectory: true, sessionKey: 'implementScope' },
|
|
29
|
+
{ id: 'review', label: 'Review', order: 2, color: '45 90% 50%', hex: '#f0c010', hasDirectory: true, supportsBatch: true, sessionKey: 'reviewGate' },
|
|
30
|
+
{ id: 'shipped', label: 'Shipped', order: 3, color: '120 70% 40%', hex: '#30a030', hasDirectory: true, gitBranch: 'main' },
|
|
31
|
+
],
|
|
32
|
+
edges: [
|
|
33
|
+
{ from: 'backlog', to: 'active', direction: 'forward', command: '/scope-implement {id}', confirmLevel: 'quick', label: 'Start', description: 'Begin work', dispatchOnly: true, autoRevert: true, hooks: ['blocker-check'], agents: ['architect'] },
|
|
34
|
+
{ from: 'active', to: 'review', direction: 'forward', command: '/scope-post-review {id}', confirmLevel: 'quick', label: 'Review', description: 'Submit for review', dispatchOnly: true, hooks: ['blocker-check', 'session-enforcer'] },
|
|
35
|
+
{ from: 'review', to: 'shipped', direction: 'forward', command: '/git-main', confirmLevel: 'quick', label: 'Ship', description: 'Push to main', dispatchOnly: true },
|
|
36
|
+
{ from: 'active', to: 'backlog', direction: 'backward', command: null, confirmLevel: 'quick', label: 'Revert', description: 'Back to backlog', humanOnly: true },
|
|
37
|
+
{ from: 'review', to: 'active', direction: 'backward', command: null, confirmLevel: 'quick', label: 'Rework', description: 'Back to active' },
|
|
38
|
+
],
|
|
39
|
+
hooks: [
|
|
40
|
+
{ id: 'blocker-check', label: 'Blocker Check', timing: 'before', type: 'shell', target: '.claude/hooks/blocker-check.sh', blocking: false, category: 'gate', description: 'Checks for blockers' },
|
|
41
|
+
{ id: 'session-enforcer', label: 'Session Auth', timing: 'before', type: 'shell', target: '.claude/hooks/session-enforcer.sh', blocking: true, category: 'guard', description: 'Enforces session auth' },
|
|
42
|
+
{ id: 'scope-transition', label: 'File Mover', timing: 'before', type: 'shell', target: '.claude/hooks/scope-transition.sh', blocking: false, category: 'lifecycle' },
|
|
43
|
+
{ id: 'dashboard-sync', label: 'Dashboard Sync', timing: 'after', type: 'shell', target: '.claude/hooks/dashboard-sync.sh', blocking: false, category: 'observer' },
|
|
44
|
+
],
|
|
45
|
+
groups: [
|
|
46
|
+
{ id: 'planning', label: 'Planning', order: 0 },
|
|
47
|
+
{ id: 'development', label: 'Development', order: 1 },
|
|
48
|
+
],
|
|
49
|
+
eventInference: [
|
|
50
|
+
{ eventType: 'SCOPE_STATUS_CHANGED', targetStatus: '', dataField: 'to', forwardOnly: true },
|
|
51
|
+
{ eventType: 'AGENT_STARTED', targetStatus: 'active', forwardOnly: true },
|
|
52
|
+
{ eventType: 'AGENT_COMPLETED', targetStatus: '', conditions: { outcome: ['success', 'failure'], dispatchResolution: true }, forwardOnly: false },
|
|
53
|
+
],
|
|
54
|
+
terminalStatuses: ['shipped'],
|
|
55
|
+
allowedCommandPrefixes: ['/scope-', '/git-'],
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
/** Named invalid configs for constructor error tests */
|
|
59
|
+
export const INVALID_CONFIGS = {
|
|
60
|
+
noLists: { version: 1 as const, name: 'No Lists', lists: [], edges: [{ from: 'a', to: 'b', direction: 'forward' as const, command: null, confirmLevel: 'quick' as const, label: 'X', description: 'X' }] } as WorkflowConfig,
|
|
61
|
+
noEdges: { version: 1 as const, name: 'No Edges', lists: [{ id: 'a', label: 'A', order: 0, color: '0 0% 0%', hex: '#000', isEntryPoint: true, hasDirectory: true }], edges: [] } as WorkflowConfig,
|
|
62
|
+
twoEntryPoints: {
|
|
63
|
+
version: 1 as const,
|
|
64
|
+
name: 'Two Entry Points',
|
|
65
|
+
lists: [
|
|
66
|
+
{ id: 'a', label: 'A', order: 0, color: '0 0% 0%', hex: '#000', isEntryPoint: true, hasDirectory: true },
|
|
67
|
+
{ id: 'b', label: 'B', order: 1, color: '0 0% 0%', hex: '#000', isEntryPoint: true, hasDirectory: true },
|
|
68
|
+
],
|
|
69
|
+
edges: [{ from: 'a', to: 'b', direction: 'forward' as const, command: null, confirmLevel: 'quick' as const, label: 'X', description: 'X' }],
|
|
70
|
+
} as WorkflowConfig,
|
|
71
|
+
zeroEntryPoints: {
|
|
72
|
+
version: 1 as const,
|
|
73
|
+
name: 'Zero Entry Points',
|
|
74
|
+
lists: [
|
|
75
|
+
{ id: 'a', label: 'A', order: 0, color: '0 0% 0%', hex: '#000', hasDirectory: true },
|
|
76
|
+
{ id: 'b', label: 'B', order: 1, color: '0 0% 0%', hex: '#000', hasDirectory: true },
|
|
77
|
+
],
|
|
78
|
+
edges: [{ from: 'a', to: 'b', direction: 'forward' as const, command: null, confirmLevel: 'quick' as const, label: 'X', description: 'X' }],
|
|
79
|
+
} as WorkflowConfig,
|
|
80
|
+
};
|
|
@@ -100,6 +100,7 @@
|
|
|
100
100
|
"label": "Team Review",
|
|
101
101
|
"description": "Runs full agent team review, locks spec, moves to backlog.",
|
|
102
102
|
"dispatchOnly": true,
|
|
103
|
+
"autoRevert": true,
|
|
103
104
|
"hooks": ["session-enforcer", "blocker-check", "dependency-check", "scope-transition", "orbital-scope-update"]
|
|
104
105
|
},
|
|
105
106
|
{
|
|
@@ -128,6 +129,7 @@
|
|
|
128
129
|
"label": "Start Implementing",
|
|
129
130
|
"description": "Opens a Claude session running /scope-implement.",
|
|
130
131
|
"dispatchOnly": true,
|
|
132
|
+
"autoRevert": true,
|
|
131
133
|
"hooks": ["session-enforcer", "blocker-check", "dependency-check", "scope-transition", "orbital-scope-update"]
|
|
132
134
|
},
|
|
133
135
|
{
|
|
@@ -139,6 +141,7 @@
|
|
|
139
141
|
"label": "Launch Post-Review",
|
|
140
142
|
"description": "Runs quality gates, formal verification, and code review.",
|
|
141
143
|
"dispatchOnly": true,
|
|
144
|
+
"autoRevert": true,
|
|
142
145
|
"hooks": ["session-enforcer", "review-gate-check", "blocker-check", "dependency-check", "scope-transition", "orbital-scope-update"]
|
|
143
146
|
},
|
|
144
147
|
{
|
|
@@ -179,6 +182,7 @@
|
|
|
179
182
|
"label": "Commit",
|
|
180
183
|
"description": "Commits scope work.",
|
|
181
184
|
"dispatchOnly": true,
|
|
185
|
+
"autoRevert": true,
|
|
182
186
|
"hooks": ["session-enforcer", "completion-checklist", "blocker-check", "dependency-check", "scope-transition", "orbital-scope-update", "scope-commit-logger"]
|
|
183
187
|
},
|
|
184
188
|
{
|
|
@@ -190,6 +194,7 @@
|
|
|
190
194
|
"label": "Push to Main",
|
|
191
195
|
"description": "Pushes or PRs scope work to the main branch.",
|
|
192
196
|
"dispatchOnly": true,
|
|
197
|
+
"autoRevert": true,
|
|
193
198
|
"hooks": ["session-enforcer", "blocker-check", "dependency-check", "scope-transition", "orbital-scope-update", "scope-commit-logger"]
|
|
194
199
|
},
|
|
195
200
|
{
|
|
@@ -248,6 +253,66 @@
|
|
|
248
253
|
"dispatchOnly": false,
|
|
249
254
|
"humanOnly": true,
|
|
250
255
|
"hooks": ["session-enforcer", "scope-transition", "orbital-scope-update"]
|
|
256
|
+
},
|
|
257
|
+
{
|
|
258
|
+
"from": "backlog",
|
|
259
|
+
"to": "icebox",
|
|
260
|
+
"direction": "backward",
|
|
261
|
+
"command": null,
|
|
262
|
+
"confirmLevel": "quick",
|
|
263
|
+
"label": "Shelve to Icebox",
|
|
264
|
+
"description": "Shelves this scope back to the icebox for later consideration.",
|
|
265
|
+
"dispatchOnly": false,
|
|
266
|
+
"humanOnly": true,
|
|
267
|
+
"hooks": ["session-enforcer", "scope-transition", "orbital-scope-update"]
|
|
268
|
+
},
|
|
269
|
+
{
|
|
270
|
+
"from": "implementing",
|
|
271
|
+
"to": "icebox",
|
|
272
|
+
"direction": "backward",
|
|
273
|
+
"command": null,
|
|
274
|
+
"confirmLevel": "full",
|
|
275
|
+
"checklist": [
|
|
276
|
+
"No uncommitted work will be lost",
|
|
277
|
+
"This scope is being abandoned, not paused"
|
|
278
|
+
],
|
|
279
|
+
"label": "Shelve to Icebox",
|
|
280
|
+
"description": "Abandons implementation and shelves this scope back to the icebox.",
|
|
281
|
+
"dispatchOnly": false,
|
|
282
|
+
"humanOnly": true,
|
|
283
|
+
"hooks": ["session-enforcer", "scope-transition", "orbital-scope-update"]
|
|
284
|
+
},
|
|
285
|
+
{
|
|
286
|
+
"from": "review",
|
|
287
|
+
"to": "icebox",
|
|
288
|
+
"direction": "backward",
|
|
289
|
+
"command": null,
|
|
290
|
+
"confirmLevel": "full",
|
|
291
|
+
"checklist": [
|
|
292
|
+
"No uncommitted work will be lost",
|
|
293
|
+
"This scope is being abandoned, not paused"
|
|
294
|
+
],
|
|
295
|
+
"label": "Shelve to Icebox",
|
|
296
|
+
"description": "Abandons review and shelves this scope back to the icebox.",
|
|
297
|
+
"dispatchOnly": false,
|
|
298
|
+
"humanOnly": true,
|
|
299
|
+
"hooks": ["session-enforcer", "scope-transition", "orbital-scope-update"]
|
|
300
|
+
},
|
|
301
|
+
{
|
|
302
|
+
"from": "completed",
|
|
303
|
+
"to": "icebox",
|
|
304
|
+
"direction": "backward",
|
|
305
|
+
"command": null,
|
|
306
|
+
"confirmLevel": "full",
|
|
307
|
+
"checklist": [
|
|
308
|
+
"Committed work has been reverted or is acceptable to leave",
|
|
309
|
+
"This scope is being abandoned, not paused"
|
|
310
|
+
],
|
|
311
|
+
"label": "Shelve to Icebox",
|
|
312
|
+
"description": "Shelves this completed scope back to the icebox.",
|
|
313
|
+
"dispatchOnly": false,
|
|
314
|
+
"humanOnly": true,
|
|
315
|
+
"hooks": ["session-enforcer", "scope-transition", "orbital-scope-update"]
|
|
251
316
|
}
|
|
252
317
|
],
|
|
253
318
|
"hooks": [
|