orbital-command 0.1.4 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/orbital.js +676 -53
- 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 -49
|
@@ -1,321 +0,0 @@
|
|
|
1
|
-
import { useState, useCallback } from 'react';
|
|
2
|
-
import { Plus, Bot, Shield, Eye, Wrench, Search, Sparkles } from 'lucide-react';
|
|
3
|
-
import { Button } from '@/components/ui/button';
|
|
4
|
-
import {
|
|
5
|
-
Dialog,
|
|
6
|
-
DialogContent,
|
|
7
|
-
DialogDescription,
|
|
8
|
-
DialogHeader,
|
|
9
|
-
DialogTitle,
|
|
10
|
-
DialogTrigger,
|
|
11
|
-
} from '@/components/ui/dialog';
|
|
12
|
-
import { Badge } from '@/components/ui/badge';
|
|
13
|
-
import { cn } from '@/lib/utils';
|
|
14
|
-
|
|
15
|
-
interface AgentCreateDialogProps {
|
|
16
|
-
onCreated: () => void;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
interface Template {
|
|
20
|
-
id: string;
|
|
21
|
-
label: string;
|
|
22
|
-
icon: typeof Shield;
|
|
23
|
-
description: string;
|
|
24
|
-
scaffold: string;
|
|
25
|
-
defaultFolder: string;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
const TEMPLATES: Template[] = [
|
|
29
|
-
{
|
|
30
|
-
id: 'security',
|
|
31
|
-
label: 'Security',
|
|
32
|
-
icon: Shield,
|
|
33
|
-
description: 'Adversarial security review agent',
|
|
34
|
-
defaultFolder: 'red-team',
|
|
35
|
-
scaffold: `# {name}
|
|
36
|
-
|
|
37
|
-
{description}
|
|
38
|
-
|
|
39
|
-
## Role
|
|
40
|
-
|
|
41
|
-
You are a security-focused review agent. Your goal is to identify vulnerabilities, insecure patterns, and potential attack vectors in the code under review.
|
|
42
|
-
|
|
43
|
-
## Auto-triggered for:
|
|
44
|
-
- Security-sensitive file changes
|
|
45
|
-
- Authentication/authorization code
|
|
46
|
-
- Input handling and validation
|
|
47
|
-
|
|
48
|
-
## Review Checklist
|
|
49
|
-
- [ ] Input validation and sanitization
|
|
50
|
-
- [ ] Authentication/authorization checks
|
|
51
|
-
- [ ] Secrets and credential handling
|
|
52
|
-
- [ ] SQL/command injection risks
|
|
53
|
-
- [ ] XSS and CSRF protections
|
|
54
|
-
`,
|
|
55
|
-
},
|
|
56
|
-
{
|
|
57
|
-
id: 'reliability',
|
|
58
|
-
label: 'Reliability',
|
|
59
|
-
icon: Eye,
|
|
60
|
-
description: 'Production reliability review agent',
|
|
61
|
-
defaultFolder: 'blue-team',
|
|
62
|
-
scaffold: `# {name}
|
|
63
|
-
|
|
64
|
-
{description}
|
|
65
|
-
|
|
66
|
-
## Role
|
|
67
|
-
|
|
68
|
-
You are a reliability-focused review agent. Your goal is to ensure code changes are production-safe with proper error handling, observability, and graceful degradation.
|
|
69
|
-
|
|
70
|
-
## Auto-triggered for:
|
|
71
|
-
- Error handling changes
|
|
72
|
-
- Service boundary code
|
|
73
|
-
- Database operations
|
|
74
|
-
|
|
75
|
-
## Review Checklist
|
|
76
|
-
- [ ] Error handling completeness
|
|
77
|
-
- [ ] Timeout and retry logic
|
|
78
|
-
- [ ] Logging and observability
|
|
79
|
-
- [ ] Graceful degradation
|
|
80
|
-
`,
|
|
81
|
-
},
|
|
82
|
-
{
|
|
83
|
-
id: 'domain-expert',
|
|
84
|
-
label: 'Domain Expert',
|
|
85
|
-
icon: Search,
|
|
86
|
-
description: 'Domain-specific expertise agent',
|
|
87
|
-
defaultFolder: 'green-team',
|
|
88
|
-
scaffold: `# {name}
|
|
89
|
-
|
|
90
|
-
{description}
|
|
91
|
-
|
|
92
|
-
## Role
|
|
93
|
-
|
|
94
|
-
You are a domain expert review agent. Your goal is to ensure code changes correctly implement business logic and domain-specific requirements.
|
|
95
|
-
|
|
96
|
-
## Auto-triggered for:
|
|
97
|
-
- Business logic changes
|
|
98
|
-
- Domain model modifications
|
|
99
|
-
- API contract changes
|
|
100
|
-
|
|
101
|
-
## Review Checklist
|
|
102
|
-
- [ ] Business rule correctness
|
|
103
|
-
- [ ] Domain model integrity
|
|
104
|
-
- [ ] API contract compliance
|
|
105
|
-
`,
|
|
106
|
-
},
|
|
107
|
-
{
|
|
108
|
-
id: 'guardian',
|
|
109
|
-
label: 'Guardian',
|
|
110
|
-
icon: Wrench,
|
|
111
|
-
description: 'Code quality and standards agent',
|
|
112
|
-
defaultFolder: 'blue-team',
|
|
113
|
-
scaffold: `# {name}
|
|
114
|
-
|
|
115
|
-
{description}
|
|
116
|
-
|
|
117
|
-
## Role
|
|
118
|
-
|
|
119
|
-
You are a code quality guardian agent. Your goal is to ensure code follows project conventions, maintains consistency, and upholds quality standards.
|
|
120
|
-
|
|
121
|
-
## Auto-triggered for:
|
|
122
|
-
- All code changes
|
|
123
|
-
|
|
124
|
-
## Review Checklist
|
|
125
|
-
- [ ] Code style and conventions
|
|
126
|
-
- [ ] Test coverage
|
|
127
|
-
- [ ] Documentation completeness
|
|
128
|
-
- [ ] Performance implications
|
|
129
|
-
`,
|
|
130
|
-
},
|
|
131
|
-
{
|
|
132
|
-
id: 'custom',
|
|
133
|
-
label: 'Custom',
|
|
134
|
-
icon: Sparkles,
|
|
135
|
-
description: 'Start from a blank template',
|
|
136
|
-
defaultFolder: '',
|
|
137
|
-
scaffold: `# {name}
|
|
138
|
-
|
|
139
|
-
{description}
|
|
140
|
-
|
|
141
|
-
## Role
|
|
142
|
-
|
|
143
|
-
Describe this agent's role and responsibilities.
|
|
144
|
-
|
|
145
|
-
## Review Checklist
|
|
146
|
-
- [ ] Add review criteria here
|
|
147
|
-
`,
|
|
148
|
-
},
|
|
149
|
-
];
|
|
150
|
-
|
|
151
|
-
export function AgentCreateDialog({ onCreated }: AgentCreateDialogProps) {
|
|
152
|
-
const [open, setOpen] = useState(false);
|
|
153
|
-
const [selectedTemplate, setSelectedTemplate] = useState<string>('security');
|
|
154
|
-
const [name, setName] = useState('');
|
|
155
|
-
const [description, setDescription] = useState('');
|
|
156
|
-
const [folder, setFolder] = useState('');
|
|
157
|
-
const [creating, setCreating] = useState(false);
|
|
158
|
-
const [error, setError] = useState<string | null>(null);
|
|
159
|
-
|
|
160
|
-
const template = TEMPLATES.find(t => t.id === selectedTemplate) ?? TEMPLATES[0];
|
|
161
|
-
|
|
162
|
-
const handleCreate = useCallback(async () => {
|
|
163
|
-
if (!name.trim()) {
|
|
164
|
-
setError('Agent name is required');
|
|
165
|
-
return;
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
const slug = name.trim().toLowerCase().replace(/\s+/g, '-');
|
|
169
|
-
const folderPath = folder.trim() || template.defaultFolder;
|
|
170
|
-
const filePath = folderPath ? `${folderPath}/${slug}.md` : `${slug}.md`;
|
|
171
|
-
|
|
172
|
-
const content = `---\nname: ${name.trim()}\ndescription: ${description.trim() || template.description}\n---\n${template.scaffold
|
|
173
|
-
.replace(/\{name\}/g, name.trim())
|
|
174
|
-
.replace(/\{description\}/g, description.trim() || template.description)}`;
|
|
175
|
-
|
|
176
|
-
setCreating(true);
|
|
177
|
-
setError(null);
|
|
178
|
-
|
|
179
|
-
try {
|
|
180
|
-
const res = await fetch('/api/orbital/config/agents/file', {
|
|
181
|
-
method: 'POST',
|
|
182
|
-
headers: { 'Content-Type': 'application/json' },
|
|
183
|
-
body: JSON.stringify({ path: filePath, content }),
|
|
184
|
-
});
|
|
185
|
-
if (!res.ok) {
|
|
186
|
-
const json = await res.json().catch(() => ({ error: 'Create failed' }));
|
|
187
|
-
throw new Error(json.error ?? `HTTP ${res.status}`);
|
|
188
|
-
}
|
|
189
|
-
setOpen(false);
|
|
190
|
-
setName('');
|
|
191
|
-
setDescription('');
|
|
192
|
-
setFolder('');
|
|
193
|
-
onCreated();
|
|
194
|
-
} catch (err) {
|
|
195
|
-
setError(err instanceof Error ? err.message : 'Create failed');
|
|
196
|
-
} finally {
|
|
197
|
-
setCreating(false);
|
|
198
|
-
}
|
|
199
|
-
}, [name, description, folder, template, onCreated]);
|
|
200
|
-
|
|
201
|
-
return (
|
|
202
|
-
<Dialog open={open} onOpenChange={setOpen}>
|
|
203
|
-
<DialogTrigger asChild>
|
|
204
|
-
<Button variant="outline" size="sm" className="gap-1.5">
|
|
205
|
-
<Plus className="h-3.5 w-3.5" />
|
|
206
|
-
<Bot className="h-3.5 w-3.5" />
|
|
207
|
-
New Agent
|
|
208
|
-
</Button>
|
|
209
|
-
</DialogTrigger>
|
|
210
|
-
<DialogContent className="sm:max-w-[480px]">
|
|
211
|
-
<DialogHeader>
|
|
212
|
-
<DialogTitle className="flex items-center gap-2">
|
|
213
|
-
<Bot className="h-5 w-5" /> Create Agent
|
|
214
|
-
</DialogTitle>
|
|
215
|
-
<DialogDescription>
|
|
216
|
-
Choose a template and configure your new review agent.
|
|
217
|
-
</DialogDescription>
|
|
218
|
-
</DialogHeader>
|
|
219
|
-
|
|
220
|
-
<div className="space-y-4 py-2">
|
|
221
|
-
{/* Template selector */}
|
|
222
|
-
<div className="space-y-2">
|
|
223
|
-
<label className="text-xs font-medium text-muted-foreground">Template</label>
|
|
224
|
-
<div className="grid grid-cols-5 gap-1.5">
|
|
225
|
-
{TEMPLATES.map(t => {
|
|
226
|
-
const Icon = t.icon;
|
|
227
|
-
return (
|
|
228
|
-
<button
|
|
229
|
-
key={t.id}
|
|
230
|
-
type="button"
|
|
231
|
-
onClick={() => {
|
|
232
|
-
setSelectedTemplate(t.id);
|
|
233
|
-
setFolder(t.defaultFolder);
|
|
234
|
-
}}
|
|
235
|
-
className={cn(
|
|
236
|
-
'flex flex-col items-center gap-1 rounded-md border p-2 text-[10px] transition-colors',
|
|
237
|
-
selectedTemplate === t.id
|
|
238
|
-
? 'border-primary bg-primary/10 text-primary'
|
|
239
|
-
: 'border-border text-muted-foreground hover:border-muted-foreground/40',
|
|
240
|
-
)}
|
|
241
|
-
>
|
|
242
|
-
<Icon className="h-4 w-4" />
|
|
243
|
-
{t.label}
|
|
244
|
-
</button>
|
|
245
|
-
);
|
|
246
|
-
})}
|
|
247
|
-
</div>
|
|
248
|
-
</div>
|
|
249
|
-
|
|
250
|
-
{/* Name */}
|
|
251
|
-
<div className="space-y-1">
|
|
252
|
-
<label className="text-xs font-medium text-muted-foreground">Name</label>
|
|
253
|
-
<input
|
|
254
|
-
value={name}
|
|
255
|
-
onChange={(e) => setName(e.target.value)}
|
|
256
|
-
placeholder="e.g., API Security Reviewer"
|
|
257
|
-
className={cn(
|
|
258
|
-
'w-full rounded border border-border bg-surface px-2.5 py-1.5 text-sm text-foreground',
|
|
259
|
-
'outline-none focus:border-accent-blue/50 transition-colors',
|
|
260
|
-
)}
|
|
261
|
-
/>
|
|
262
|
-
</div>
|
|
263
|
-
|
|
264
|
-
{/* Description */}
|
|
265
|
-
<div className="space-y-1">
|
|
266
|
-
<label className="text-xs font-medium text-muted-foreground">Description</label>
|
|
267
|
-
<input
|
|
268
|
-
value={description}
|
|
269
|
-
onChange={(e) => setDescription(e.target.value)}
|
|
270
|
-
placeholder={template.description}
|
|
271
|
-
className={cn(
|
|
272
|
-
'w-full rounded border border-border bg-surface px-2.5 py-1.5 text-sm text-foreground',
|
|
273
|
-
'outline-none focus:border-accent-blue/50 transition-colors',
|
|
274
|
-
)}
|
|
275
|
-
/>
|
|
276
|
-
</div>
|
|
277
|
-
|
|
278
|
-
{/* Folder */}
|
|
279
|
-
<div className="space-y-1">
|
|
280
|
-
<label className="text-xs font-medium text-muted-foreground">
|
|
281
|
-
Team Folder
|
|
282
|
-
<span className="ml-1 text-muted-foreground/50">(optional)</span>
|
|
283
|
-
</label>
|
|
284
|
-
<input
|
|
285
|
-
value={folder}
|
|
286
|
-
onChange={(e) => setFolder(e.target.value)}
|
|
287
|
-
placeholder={template.defaultFolder || 'root'}
|
|
288
|
-
className={cn(
|
|
289
|
-
'w-full rounded border border-border bg-surface px-2.5 py-1.5 text-sm text-foreground font-mono',
|
|
290
|
-
'outline-none focus:border-accent-blue/50 transition-colors',
|
|
291
|
-
)}
|
|
292
|
-
/>
|
|
293
|
-
<div className="flex gap-1.5 mt-1">
|
|
294
|
-
{['red-team', 'blue-team', 'green-team'].map(f => (
|
|
295
|
-
<Badge
|
|
296
|
-
key={f}
|
|
297
|
-
variant={folder === f ? 'default' : 'secondary'}
|
|
298
|
-
className="text-[10px] cursor-pointer"
|
|
299
|
-
onClick={() => setFolder(f)}
|
|
300
|
-
>
|
|
301
|
-
{f}
|
|
302
|
-
</Badge>
|
|
303
|
-
))}
|
|
304
|
-
</div>
|
|
305
|
-
</div>
|
|
306
|
-
|
|
307
|
-
{error && (
|
|
308
|
-
<p className="text-xs text-destructive">{error}</p>
|
|
309
|
-
)}
|
|
310
|
-
</div>
|
|
311
|
-
|
|
312
|
-
<div className="flex justify-end gap-2 pt-2">
|
|
313
|
-
<Button variant="ghost" onClick={() => setOpen(false)}>Cancel</Button>
|
|
314
|
-
<Button onClick={handleCreate} disabled={creating}>
|
|
315
|
-
{creating ? 'Creating...' : 'Create Agent'}
|
|
316
|
-
</Button>
|
|
317
|
-
</div>
|
|
318
|
-
</DialogContent>
|
|
319
|
-
</Dialog>
|
|
320
|
-
);
|
|
321
|
-
}
|
|
@@ -1,175 +0,0 @@
|
|
|
1
|
-
import { useState, useMemo } from 'react';
|
|
2
|
-
import { Bot, Code2, Shield, Wrench, Search, Zap } from 'lucide-react';
|
|
3
|
-
import { Badge } from '@/components/ui/badge';
|
|
4
|
-
import { Button } from '@/components/ui/button';
|
|
5
|
-
import { cn } from '@/lib/utils';
|
|
6
|
-
|
|
7
|
-
interface AgentEditorProps {
|
|
8
|
-
frontmatter: Record<string, string>;
|
|
9
|
-
setFrontmatterField: (key: string, value: string) => void;
|
|
10
|
-
body: string;
|
|
11
|
-
setBody: (value: string) => void;
|
|
12
|
-
filePath: string;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
const TEAM_COLORS: Record<string, { bg: string; text: string; label: string }> = {
|
|
16
|
-
'red-team': { bg: 'bg-red-500/15', text: 'text-red-400', label: 'Red Team' },
|
|
17
|
-
'blue-team': { bg: 'bg-cyan-500/15', text: 'text-cyan-400', label: 'Blue Team' },
|
|
18
|
-
'green-team': { bg: 'bg-green-500/15', text: 'text-green-400', label: 'Green Team' },
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
function detectTeam(filePath: string): { bg: string; text: string; label: string } | null {
|
|
22
|
-
const lower = filePath.toLowerCase();
|
|
23
|
-
for (const [key, style] of Object.entries(TEAM_COLORS)) {
|
|
24
|
-
if (lower.includes(key)) return style;
|
|
25
|
-
}
|
|
26
|
-
return null;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/** Parse auto-trigger patterns from agent markdown body */
|
|
30
|
-
function parseAutoTriggers(body: string): string[] {
|
|
31
|
-
const triggers: string[] = [];
|
|
32
|
-
const lines = body.split('\n');
|
|
33
|
-
let inTriggerSection = false;
|
|
34
|
-
for (const line of lines) {
|
|
35
|
-
if (/auto[- ]?trigger/i.test(line) || /auto[- ]?invoke/i.test(line)) {
|
|
36
|
-
inTriggerSection = true;
|
|
37
|
-
continue;
|
|
38
|
-
}
|
|
39
|
-
if (inTriggerSection && line.trim().startsWith('-')) {
|
|
40
|
-
triggers.push(line.trim().replace(/^-\s*/, ''));
|
|
41
|
-
} else if (inTriggerSection && line.trim() === '') {
|
|
42
|
-
// blank line continues
|
|
43
|
-
} else if (inTriggerSection && !line.trim().startsWith('-')) {
|
|
44
|
-
inTriggerSection = false;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
return triggers;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
export function AgentEditor({ frontmatter, setFrontmatterField, body, setBody, filePath }: AgentEditorProps) {
|
|
51
|
-
const [rawMode, setRawMode] = useState(false);
|
|
52
|
-
const team = useMemo(() => detectTeam(filePath), [filePath]);
|
|
53
|
-
const triggers = useMemo(() => parseAutoTriggers(body), [body]);
|
|
54
|
-
|
|
55
|
-
if (rawMode) {
|
|
56
|
-
return (
|
|
57
|
-
<div className="space-y-2">
|
|
58
|
-
<div className="flex items-center justify-between">
|
|
59
|
-
<span className="text-xxs font-medium uppercase tracking-wider text-muted-foreground">
|
|
60
|
-
Raw Markdown
|
|
61
|
-
</span>
|
|
62
|
-
<Button variant="ghost" size="sm" onClick={() => setRawMode(false)} className="text-[10px] h-6">
|
|
63
|
-
Structured View
|
|
64
|
-
</Button>
|
|
65
|
-
</div>
|
|
66
|
-
<textarea
|
|
67
|
-
value={body}
|
|
68
|
-
onChange={(e) => setBody(e.target.value)}
|
|
69
|
-
className={cn(
|
|
70
|
-
'w-full min-h-[300px] resize-y rounded border border-border bg-surface p-3',
|
|
71
|
-
'font-mono text-xs text-foreground leading-relaxed',
|
|
72
|
-
'outline-none focus:border-accent-blue/50 transition-colors',
|
|
73
|
-
)}
|
|
74
|
-
spellCheck={false}
|
|
75
|
-
/>
|
|
76
|
-
</div>
|
|
77
|
-
);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
return (
|
|
81
|
-
<div className="space-y-4">
|
|
82
|
-
{/* Identity */}
|
|
83
|
-
<div className="space-y-2">
|
|
84
|
-
<div className="flex items-center justify-between">
|
|
85
|
-
<div className="flex items-center gap-2">
|
|
86
|
-
<Bot className="h-3.5 w-3.5 text-muted-foreground" />
|
|
87
|
-
<span className="text-xxs font-medium uppercase tracking-wider text-muted-foreground">
|
|
88
|
-
Agent Identity
|
|
89
|
-
</span>
|
|
90
|
-
</div>
|
|
91
|
-
<Button variant="ghost" size="sm" onClick={() => setRawMode(true)} className="text-[10px] h-6">
|
|
92
|
-
<Code2 className="mr-1 h-3 w-3" /> Raw
|
|
93
|
-
</Button>
|
|
94
|
-
</div>
|
|
95
|
-
|
|
96
|
-
<div className="grid gap-2">
|
|
97
|
-
{Object.keys(frontmatter).map((key) => (
|
|
98
|
-
<div key={key} className="flex items-center gap-2">
|
|
99
|
-
<label className="w-28 shrink-0 text-right text-xxs text-muted-foreground">
|
|
100
|
-
{key}
|
|
101
|
-
</label>
|
|
102
|
-
<input
|
|
103
|
-
value={frontmatter[key] ?? ''}
|
|
104
|
-
onChange={(e) => setFrontmatterField(key, e.target.value)}
|
|
105
|
-
className={cn(
|
|
106
|
-
'flex-1 rounded border border-border bg-surface px-2 py-1 text-xs text-foreground',
|
|
107
|
-
'outline-none focus:border-accent-blue/50 transition-colors',
|
|
108
|
-
)}
|
|
109
|
-
/>
|
|
110
|
-
</div>
|
|
111
|
-
))}
|
|
112
|
-
</div>
|
|
113
|
-
</div>
|
|
114
|
-
|
|
115
|
-
{/* Team & metadata */}
|
|
116
|
-
<div className="flex flex-wrap gap-2">
|
|
117
|
-
{team && (
|
|
118
|
-
<Badge className={cn('text-[10px]', team.bg, team.text, 'border-0')}>
|
|
119
|
-
<Shield className="mr-1 h-3 w-3" /> {team.label}
|
|
120
|
-
</Badge>
|
|
121
|
-
)}
|
|
122
|
-
{frontmatter.blocking === 'true' && (
|
|
123
|
-
<Badge variant="destructive" className="text-[10px]">
|
|
124
|
-
Blocking
|
|
125
|
-
</Badge>
|
|
126
|
-
)}
|
|
127
|
-
{frontmatter.priority && (
|
|
128
|
-
<Badge variant="secondary" className="text-[10px]">
|
|
129
|
-
Priority: {frontmatter.priority}
|
|
130
|
-
</Badge>
|
|
131
|
-
)}
|
|
132
|
-
</div>
|
|
133
|
-
|
|
134
|
-
{/* Auto-triggers */}
|
|
135
|
-
{triggers.length > 0 && (
|
|
136
|
-
<div className="space-y-1">
|
|
137
|
-
<div className="flex items-center gap-2">
|
|
138
|
-
<Zap className="h-3 w-3 text-muted-foreground" />
|
|
139
|
-
<span className="text-xxs font-medium uppercase tracking-wider text-muted-foreground">
|
|
140
|
-
Auto-Invoke Triggers
|
|
141
|
-
</span>
|
|
142
|
-
</div>
|
|
143
|
-
<div className="space-y-0.5 pl-5">
|
|
144
|
-
{triggers.map((t, i) => (
|
|
145
|
-
<div key={i} className="flex items-center gap-1.5 text-xs text-muted-foreground">
|
|
146
|
-
<Search className="h-2.5 w-2.5 shrink-0" />
|
|
147
|
-
<span>{t}</span>
|
|
148
|
-
</div>
|
|
149
|
-
))}
|
|
150
|
-
</div>
|
|
151
|
-
</div>
|
|
152
|
-
)}
|
|
153
|
-
|
|
154
|
-
{/* Body */}
|
|
155
|
-
<div className="space-y-2">
|
|
156
|
-
<div className="flex items-center gap-2">
|
|
157
|
-
<Wrench className="h-3 w-3 text-muted-foreground" />
|
|
158
|
-
<span className="text-xxs font-medium uppercase tracking-wider text-muted-foreground">
|
|
159
|
-
Agent Definition
|
|
160
|
-
</span>
|
|
161
|
-
</div>
|
|
162
|
-
<textarea
|
|
163
|
-
value={body}
|
|
164
|
-
onChange={(e) => setBody(e.target.value)}
|
|
165
|
-
className={cn(
|
|
166
|
-
'w-full min-h-[200px] resize-y rounded border border-border bg-surface p-3',
|
|
167
|
-
'font-mono text-xs text-foreground leading-relaxed',
|
|
168
|
-
'outline-none focus:border-accent-blue/50 transition-colors',
|
|
169
|
-
)}
|
|
170
|
-
spellCheck={false}
|
|
171
|
-
/>
|
|
172
|
-
</div>
|
|
173
|
-
</div>
|
|
174
|
-
);
|
|
175
|
-
}
|