@cat-factory/app 0.302.2 → 0.303.1
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 +99 -14
- package/app/app.config.ts +19 -10
- package/app/assets/css/main.css +13 -13
- package/app/assets/css/prose.css +22 -22
- package/app/assets/css/tokens.css +298 -0
- package/app/components/assistant/AssistantModal.vue +22 -22
- package/app/components/auth/AuthGate.vue +1 -1
- package/app/components/auth/BackendMisconfiguredScreen.vue +10 -10
- package/app/components/auth/LoginScreen.vue +34 -36
- package/app/components/auth/ResetPasswordScreen.vue +12 -12
- package/app/components/auth/UserMenu.vue +4 -4
- package/app/components/binaryCandidates/BinaryCandidatesWindow.vue +27 -25
- package/app/components/binaryOutput/BinaryOutputReport.vue +15 -15
- package/app/components/binaryOutput/StoredAssetView.vue +5 -5
- package/app/components/board/AddTaskModal.vue +17 -20
- package/app/components/board/AgentFailureCard.vue +11 -11
- package/app/components/board/AgentFailureHistory.vue +2 -2
- package/app/components/board/BoardCanvas.vue +6 -5
- package/app/components/board/CreateInitiativeModal.vue +8 -10
- package/app/components/board/DependencyConnectOverlay.vue +1 -1
- package/app/components/board/FailureHistoryList.vue +7 -7
- package/app/components/board/RecurringPipelineModal.vue +17 -17
- package/app/components/board/ReviewFrictionDialog.vue +6 -6
- package/app/components/board/StepExecutionHistory.vue +13 -13
- package/app/components/board/TaskDependencyEdges.vue +8 -8
- package/app/components/board/nodes/AgentChip.vue +10 -10
- package/app/components/board/nodes/BlockNode.vue +29 -29
- package/app/components/board/nodes/DecisionBadge.vue +2 -2
- package/app/components/board/nodes/EpicNode.vue +14 -10
- package/app/components/board/nodes/FrameSwimlanes.vue +7 -9
- package/app/components/board/nodes/InitiativeCard.vue +8 -8
- package/app/components/board/nodes/LaneGroup.vue +1 -1
- package/app/components/board/nodes/LaneTask.vue +2 -2
- package/app/components/board/nodes/ResizeGrips.vue +4 -4
- package/app/components/board/nodes/TaskCard.vue +18 -18
- package/app/components/board/nodes/TaskLane.vue +5 -5
- package/app/components/board/nodes/TaskPipelineMini.vue +18 -18
- package/app/components/bootstrap/AdoptionReviewModal.vue +29 -26
- package/app/components/bootstrap/BootstrapModal.vue +21 -23
- package/app/components/bootstrap/BootstrapRunSteps.vue +1 -1
- package/app/components/brainstorm/BrainstormWindow.vue +30 -33
- package/app/components/bugFishing/BugFishingWindow.vue +49 -49
- package/app/components/clarity/ClarityReviewWindow.vue +30 -30
- package/app/components/common/AsyncViewError.vue +5 -5
- package/app/components/common/ClarificationItem.vue +8 -13
- package/app/components/common/ConfirmDialog.vue +4 -2
- package/app/components/common/DescriptorFields.vue +1 -1
- package/app/components/common/EmptyState.vue +3 -3
- package/app/components/common/InterviewGateNotice.vue +7 -7
- package/app/components/common/KeyboardShortcutsHelp.vue +1 -1
- package/app/components/common/MarkdownProse.vue +14 -13
- package/app/components/consensus/ConsensusSessionWindow.vue +26 -26
- package/app/components/context/ContextAttachmentFields.vue +17 -17
- package/app/components/docs/DocInterviewWindow.vue +14 -14
- package/app/components/documents/ContextDocumentPicker.vue +17 -17
- package/app/components/documents/DocumentImportModal.vue +7 -7
- package/app/components/documents/DocumentSourceConnectModal.vue +3 -3
- package/app/components/documents/DocumentSyncState.vue +5 -5
- package/app/components/documents/DocumentTemplatesModal.vue +15 -15
- package/app/components/documents/RepoContextDocPicker.vue +5 -5
- package/app/components/documents/SpawnPreviewModal.vue +12 -12
- package/app/components/documents/StartFromDesignModal.vue +11 -11
- package/app/components/documents/TaskContextDocs.vue +5 -5
- package/app/components/environments/EnvSetupStepper.vue +6 -6
- package/app/components/environments/EnvironmentStatusPanel.vue +17 -17
- package/app/components/environments/steps/EnvPickStep.vue +3 -3
- package/app/components/environments/steps/EnvPreflightStep.vue +9 -9
- package/app/components/environments/steps/EnvReviewStep.vue +25 -22
- package/app/components/environments/steps/EnvSaveStep.vue +7 -5
- package/app/components/environments/steps/JourneyStepNav.vue +1 -1
- package/app/components/focus/BlockFocusView.vue +17 -19
- package/app/components/followUp/FollowUpWindow.vue +23 -23
- package/app/components/forkDecision/ForkDecisionWindow.vue +37 -39
- package/app/components/foundational/FoundationalContractSummary.vue +7 -7
- package/app/components/foundational/FoundationalServiceCatalogList.vue +11 -11
- package/app/components/foundational/FoundationalServiceManager.vue +1 -1
- package/app/components/foundational/FoundationalServiceRegistry.vue +13 -13
- package/app/components/foundational/FoundationalServiceSources.vue +13 -13
- package/app/components/foundational/FoundationalSuppressions.vue +7 -7
- package/app/components/foundational/ServiceCatalogConnection.vue +10 -10
- package/app/components/fragments/FragmentLibraryManager.vue +41 -44
- package/app/components/fragments/FragmentSelector.vue +13 -13
- package/app/components/fragments/GitHubDocUrlImport.vue +1 -1
- package/app/components/gates/GateFailingCheckList.vue +5 -5
- package/app/components/gates/GateResultView.vue +50 -47
- package/app/components/github/AddServiceFromRepoModal.vue +14 -14
- package/app/components/github/BranchProtectionPreflight.vue +13 -13
- package/app/components/github/GitHubConnect.vue +7 -7
- package/app/components/github/GitHubOnboarding.vue +7 -7
- package/app/components/github/GitHubPanel.vue +37 -40
- package/app/components/github/RepoTreeBrowser.vue +18 -18
- package/app/components/humanTest/HumanTestWindow.vue +30 -33
- package/app/components/initiative/InitiativePlanNotice.vue +5 -5
- package/app/components/initiative/InitiativePlanReview.vue +27 -29
- package/app/components/initiative/InitiativePlanningWindow.vue +10 -10
- package/app/components/initiative/InitiativeTrackerWindow.vue +71 -65
- package/app/components/inputGate/InputGateNotice.vue +2 -4
- package/app/components/judge/JudgeResultView.vue +30 -32
- package/app/components/kaizen/KaizenPanel.vue +40 -36
- package/app/components/kaizen/KaizenStepStatus.vue +21 -21
- package/app/components/layout/AccountAuditLog.vue +10 -10
- package/app/components/layout/AccountDeploymentSettings.vue +20 -20
- package/app/components/layout/AccountFailureKindRules.vue +13 -13
- package/app/components/layout/AccountFoundationalSettings.vue +1 -1
- package/app/components/layout/AccountFragmentSettings.vue +1 -1
- package/app/components/layout/AccountModelPolicySettings.vue +9 -9
- package/app/components/layout/AccountPlatformAlertSettings.vue +11 -11
- package/app/components/layout/AccountRiskPolicySettings.vue +2 -2
- package/app/components/layout/AccountRunCredentialSettings.vue +5 -5
- package/app/components/layout/AccountSkillSettings.vue +1 -1
- package/app/components/layout/AccountTeamSettings.vue +23 -15
- package/app/components/layout/AiProvidersBanner.vue +11 -8
- package/app/components/layout/AppearanceSwitcher.vue +108 -0
- package/app/components/layout/BoardSwitcher.vue +8 -11
- package/app/components/layout/BoardToolbar.vue +3 -3
- package/app/components/layout/CommandBar.vue +7 -9
- package/app/components/layout/ConnectionStatusBanner.vue +2 -2
- package/app/components/layout/DefaultTestEnvBanner.vue +5 -5
- package/app/components/layout/GitHubPatBanner.vue +5 -5
- package/app/components/layout/GitHubPatPermissionsBanner.vue +16 -10
- package/app/components/layout/InfraSetupBanner.vue +6 -6
- package/app/components/layout/IntegrationsHub.vue +15 -15
- package/app/components/layout/LanguageSwitcher.vue +5 -5
- package/app/components/layout/ModelProvidersHub.vue +13 -16
- package/app/components/layout/NotificationsInbox.vue +10 -10
- package/app/components/layout/PersonalSetupModal.vue +8 -8
- package/app/components/layout/ProviderConfigBanner.vue +4 -4
- package/app/components/layout/RolePrompt.vue +7 -7
- package/app/components/layout/SideBar.vue +6 -4
- package/app/components/layout/SpendWarningBanner.vue +17 -14
- package/app/components/layout/TranslationWarningBanner.vue +4 -4
- package/app/components/layout/UiModeSwitcher.vue +13 -13
- package/app/components/layout/UiRoleSwitcher.vue +8 -8
- package/app/components/layout/WorkspaceMembersSettings.vue +15 -11
- package/app/components/media/ArtifactLightbox.vue +13 -13
- package/app/components/media/ImageCompare.vue +31 -24
- package/app/components/merge/MergeEffortChips.vue +2 -2
- package/app/components/notifications/NotificationSettingsPanel.vue +14 -12
- package/app/components/observability/OutcomeFilterChips.vue +6 -6
- package/app/components/observability/RunFailureSummary.vue +28 -25
- package/app/components/observability/StepMetricsBar.vue +26 -28
- package/app/components/observability/StepModelActivity.vue +2 -2
- package/app/components/observability/ToolCallList.vue +24 -24
- package/app/components/outcome/OutcomeSummaryWindow.vue +47 -47
- package/app/components/palettes/AgentPalette.vue +8 -8
- package/app/components/palettes/AgentTierSelect.vue +1 -1
- package/app/components/palettes/PipelinePurposeSelect.vue +1 -1
- package/app/components/panels/AgentStepDetail.vue +52 -51
- package/app/components/panels/AttemptEntryHeader.vue +4 -6
- package/app/components/panels/DecisionModal.vue +7 -7
- package/app/components/panels/GenericStructuredResultView.vue +7 -7
- package/app/components/panels/InspectorPanel.vue +17 -17
- package/app/components/panels/MergerResultView.vue +19 -19
- package/app/components/panels/ObservabilityPanel.vue +115 -123
- package/app/components/panels/OperatorDashboardPanel.vue +89 -97
- package/app/components/panels/ReportsPanel.vue +69 -66
- package/app/components/panels/ReportsSpendBreakdown.vue +9 -9
- package/app/components/panels/ResultWindowShell.vue +38 -38
- package/app/components/panels/RunDetailLoadState.vue +2 -2
- package/app/components/panels/StepContainerStatus.vue +9 -9
- package/app/components/panels/StepDelegatedStatus.logic.spec.ts +135 -0
- package/app/components/panels/StepDelegatedStatus.logic.ts +160 -0
- package/app/components/panels/StepDelegatedStatus.vue +181 -0
- package/app/components/panels/StepEffortReport.vue +16 -15
- package/app/components/panels/StepFragmentAdherence.vue +14 -10
- package/app/components/panels/StepMetadataCard.vue +74 -45
- package/app/components/panels/StepReproductionReport.vue +25 -21
- package/app/components/panels/StepRunMeta.vue +20 -20
- package/app/components/panels/StepTestReport.logic.spec.ts +8 -3
- package/app/components/panels/StepTestReport.logic.ts +4 -4
- package/app/components/panels/StepTestReport.vue +28 -28
- package/app/components/panels/StepToolServers.vue +14 -11
- package/app/components/panels/StepValidationReport.vue +7 -7
- package/app/components/panels/inspector/ContainerSummary.vue +9 -9
- package/app/components/panels/inspector/DocReferenceRepos.vue +3 -3
- package/app/components/panels/inspector/EnvProbeReport.vue +24 -27
- package/app/components/panels/inspector/EpicChildren.vue +8 -12
- package/app/components/panels/inspector/FrontendBindingsResolved.vue +11 -11
- package/app/components/panels/inspector/FrontendConfig.vue +37 -41
- package/app/components/panels/inspector/InitiativeInspector.vue +3 -3
- package/app/components/panels/inspector/InspectorSection.vue +6 -6
- package/app/components/panels/inspector/RecurringScheduleSettings.vue +16 -19
- package/app/components/panels/inspector/ServiceConnections.vue +2 -2
- package/app/components/panels/inspector/ServiceReleaseHealthConfig.vue +2 -2
- package/app/components/panels/inspector/ServiceSelfTests.vue +21 -17
- package/app/components/panels/inspector/ServiceTestConfig.vue +51 -59
- package/app/components/panels/inspector/ServiceTestSecrets.vue +5 -5
- package/app/components/panels/inspector/ServiceTestingContext.vue +3 -3
- package/app/components/panels/inspector/ServiceValidationConfig.vue +2 -2
- package/app/components/panels/inspector/TaskAgentConfig.vue +3 -3
- package/app/components/panels/inspector/TaskAprioriBranches.vue +8 -5
- package/app/components/panels/inspector/TaskDependencies.vue +1 -1
- package/app/components/panels/inspector/TaskEstimateBadge.vue +11 -11
- package/app/components/panels/inspector/TaskExecution.vue +17 -17
- package/app/components/panels/inspector/TaskReviewTarget.vue +2 -2
- package/app/components/panels/inspector/TaskRunSettings.vue +35 -37
- package/app/components/panels/inspector/TaskStructure.vue +3 -3
- package/app/components/pipeline/AgentKindIcon.vue +1 -1
- package/app/components/pipeline/AgentPromptEditor.vue +17 -17
- package/app/components/pipeline/BinaryOutputStepPicker.vue +42 -56
- package/app/components/pipeline/EstimateThresholdFields.vue +4 -4
- package/app/components/pipeline/GateConfigFields.vue +13 -10
- package/app/components/pipeline/IterationCapPrompt.vue +4 -2
- package/app/components/pipeline/PipelineBuilder.vue +47 -55
- package/app/components/pipeline/PipelineHealthModal.vue +27 -29
- package/app/components/pipeline/PipelinePicker.vue +10 -10
- package/app/components/pipeline/PipelinePreview.vue +10 -10
- package/app/components/pipeline/PipelineProgress.vue +64 -67
- package/app/components/prReview/PrReviewPhaseBadge.vue +7 -7
- package/app/components/prReview/PrReviewWindow.vue +75 -77
- package/app/components/providers/AiPresetMismatchDialog.vue +5 -5
- package/app/components/providers/AiProviderOnboardingModal.vue +9 -9
- package/app/components/providers/ApiKeysSection.vue +13 -13
- package/app/components/providers/PersonalCredentialModal.vue +2 -2
- package/app/components/providers/PersonalSubscriptionSection.vue +10 -10
- package/app/components/providers/SignInRequiredNotice.vue +1 -1
- package/app/components/providers/VendorCredentialsModal.vue +10 -10
- package/app/components/provisioning/ProvisioningLogsDrawer.vue +13 -13
- package/app/components/ralph/RalphLoopResultView.vue +28 -30
- package/app/components/recurring/RecurrenceEditor.vue +2 -2
- package/app/components/requirements/RequirementsReviewWindow.vue +51 -58
- package/app/components/riskPolicy/RiskPolicyPicker.vue +12 -15
- package/app/components/riskPolicy/RiskPolicyPreview.vue +14 -14
- package/app/components/sandbox/SandboxPanel.vue +58 -59
- package/app/components/settings/AccountSettingsPanel.vue +1 -1
- package/app/components/settings/ApiTokensPanel.vue +10 -10
- package/app/components/settings/BudgetSettings.vue +18 -22
- package/app/components/settings/CapabilityCredentialsPanel.vue +15 -15
- package/app/components/settings/CloudflareHandlerSection.vue +20 -20
- package/app/components/settings/ComposeEnvironmentSetupSection.vue +13 -13
- package/app/components/settings/ConnectionTestVerdict.vue +3 -3
- package/app/components/settings/ConnectionWarnings.vue +1 -1
- package/app/components/settings/ConsensusGroupsSection.vue +27 -35
- package/app/components/settings/CustomManifestTypeEditor.vue +10 -10
- package/app/components/settings/DefaultProvisionTypeSection.vue +6 -6
- package/app/components/settings/InfraHandlersConfigurator.vue +24 -22
- package/app/components/settings/InfrastructureBackendPicker.vue +6 -6
- package/app/components/settings/InfrastructureWindow.vue +5 -5
- package/app/components/settings/IssueTrackerPanel.vue +29 -23
- package/app/components/settings/KubernetesEngineForm.vue +11 -11
- package/app/components/settings/KubernetesEnvironmentForm.vue +4 -4
- package/app/components/settings/LocalContainerPoolSettings.vue +6 -11
- package/app/components/settings/LocalModelEndpointsPanel.vue +20 -18
- package/app/components/settings/McpAuthorizeScreen.vue +13 -15
- package/app/components/settings/McpOAuthCallbackScreen.vue +16 -10
- package/app/components/settings/MergeClassRulesEditor.vue +6 -9
- package/app/components/settings/MergeRolePolicyEditor.vue +16 -16
- package/app/components/settings/ModelConfigurationPanel.vue +23 -30
- package/app/components/settings/ModelPresetHealthModal.vue +15 -13
- package/app/components/settings/ObservabilityConnectionPanel.vue +4 -4
- package/app/components/settings/OpenRouterCatalogPanel.vue +26 -19
- package/app/components/settings/PackageRegistriesPanel.vue +8 -8
- package/app/components/settings/ProviderConnectionTab.vue +8 -11
- package/app/components/settings/ProviderManifestEditor.vue +9 -9
- package/app/components/settings/ProviderPreferenceEditor.vue +8 -8
- package/app/components/settings/RiskPolicyCreateForm.vue +10 -10
- package/app/components/settings/RiskPolicyEditorRow.vue +14 -14
- package/app/components/settings/RiskPolicyHealthModal.vue +15 -13
- package/app/components/settings/RiskPolicyInheritedRow.vue +1 -1
- package/app/components/settings/RiskPolicyPanel.vue +10 -15
- package/app/components/settings/ServiceFragmentDefaultsPanel.vue +7 -7
- package/app/components/settings/SharedStacksPanel.vue +9 -12
- package/app/components/settings/TaskSourceCard.vue +4 -4
- package/app/components/settings/TaskTypeSuppressionsPanel.vue +6 -6
- package/app/components/settings/ToolServerChecklist.vue +36 -29
- package/app/components/settings/UsageSettings.vue +15 -15
- package/app/components/settings/UserSecretsSection.vue +9 -12
- package/app/components/settings/WorkspaceMetadataSettings.vue +5 -5
- package/app/components/settings/WorkspaceSettingsPanel.vue +47 -47
- package/app/components/skills/ReviewSkillQueue.vue +10 -10
- package/app/components/skills/SkillLibraryManager.vue +23 -20
- package/app/components/slack/SlackPanel.vue +13 -17
- package/app/components/spec/ServiceSpecWindow.vue +45 -42
- package/app/components/tasks/BugHuntModal.vue +24 -27
- package/app/components/tasks/ContextIssuePicker.vue +11 -11
- package/app/components/tasks/TaskContextIssues.vue +3 -3
- package/app/components/tasks/TaskImportModal.vue +7 -7
- package/app/components/tasks/TaskSourceConnectModal.vue +10 -8
- package/app/components/testing/TestReportWindow.vue +99 -82
- package/app/components/theme/ThemeImportModal.vue +115 -0
- package/app/components/tutorial/TutorialCatalogue.vue +9 -9
- package/app/components/tutorial/TutorialNudge.vue +5 -5
- package/app/components/tutorial/TutorialOverlay.vue +12 -12
- package/app/components/tutorial/TutorialPrompt.vue +6 -9
- package/app/components/vcs/GitLabConnect.vue +4 -4
- package/app/components/vcs/VcsConnectSurfaces.vue +2 -2
- package/app/components/visualConfirm/VisualConfirmationWindow.vue +36 -36
- package/app/composables/api/client.ts +6 -1
- package/app/composables/usePipelineErrorToast.ts +17 -0
- package/app/modular/agent-kinds.ts +24 -0
- package/app/pages/index.vue +5 -5
- package/app/plugins/theme.client.ts +125 -0
- package/app/spa-loading-template.html +52 -14
- package/app/stores/agents.ts +1 -1
- package/app/stores/theme.spec.ts +56 -0
- package/app/stores/theme.ts +87 -0
- package/app/types/domain.ts +19 -0
- package/app/types/execution.ts +4 -0
- package/app/utils/agentOutput.ts +1 -1
- package/app/utils/binaryOutput.ts +6 -6
- package/app/utils/bootstrapSteps.ts +14 -14
- package/app/utils/catalog.ts +87 -83
- package/app/utils/colorTint.ts +10 -0
- package/app/utils/failureKinds.ts +1 -0
- package/app/utils/observability.ts +3 -3
- package/app/utils/pipelineRender.ts +13 -17
- package/app/utils/swimlanes.ts +4 -4
- package/app/utils/theme/bootPalette.spec.ts +54 -0
- package/app/utils/theme/bootPalette.ts +108 -0
- package/app/utils/theme/builtins.spec.ts +38 -0
- package/app/utils/theme/builtins.ts +55 -0
- package/app/utils/theme/css.ts +162 -0
- package/app/utils/theme/doc.ts +353 -0
- package/app/utils/theme/link.ts +93 -0
- package/app/utils/theme/presets.ts +509 -0
- package/app/utils/theme/theme.spec.ts +224 -0
- package/i18n/locales/de.json +61 -4
- package/i18n/locales/en.json +70 -4
- package/i18n/locales/es.json +61 -4
- package/i18n/locales/fr.json +61 -4
- package/i18n/locales/he.json +61 -4
- package/i18n/locales/it.json +61 -4
- package/i18n/locales/ja.json +61 -4
- package/i18n/locales/pl.json +61 -4
- package/i18n/locales/tr.json +61 -4
- package/i18n/locales/uk.json +61 -4
- package/nuxt.config.ts +37 -11
- package/package.json +10 -9
|
@@ -57,10 +57,10 @@ function openStep(i: number) {
|
|
|
57
57
|
|
|
58
58
|
/** Per-state accent, matching the inspector/focus pipeline views. */
|
|
59
59
|
const STATE_META: Record<AgentState, { color: string; icon: string }> = {
|
|
60
|
-
pending: { color: '
|
|
61
|
-
working: { color: '
|
|
62
|
-
waiting_decision: { color: '
|
|
63
|
-
done: { color: '
|
|
60
|
+
pending: { color: 'var(--ui-text-muted)', icon: 'i-lucide-circle-dashed' },
|
|
61
|
+
working: { color: 'var(--ui-primary)', icon: 'i-lucide-loader' },
|
|
62
|
+
waiting_decision: { color: 'var(--ui-warning)', icon: 'i-lucide-circle-help' },
|
|
63
|
+
done: { color: 'var(--ui-success)', icon: 'i-lucide-circle-check' },
|
|
64
64
|
}
|
|
65
65
|
|
|
66
66
|
// A reviewer gate (requirements-review / clarity-review) folding answers or re-reviewing in
|
|
@@ -100,15 +100,15 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
100
100
|
</script>
|
|
101
101
|
|
|
102
102
|
<template>
|
|
103
|
-
<div v-if="showSteps" class="mt-2 space-y-1 border-t border-
|
|
104
|
-
<div class="flex items-center gap-1 text-[9px] uppercase tracking-wide text-
|
|
103
|
+
<div v-if="showSteps" class="mt-2 space-y-1 border-t border-default pt-2">
|
|
104
|
+
<div class="flex items-center gap-1 text-[9px] uppercase tracking-wide text-dimmed">
|
|
105
105
|
<UIcon name="i-lucide-workflow" class="h-2.5 w-2.5" />
|
|
106
106
|
{{ t('board.task.buildSteps') }}
|
|
107
107
|
</div>
|
|
108
|
-
<div v-for="(s, i) in steps" :key="i" class="rounded bg-
|
|
108
|
+
<div v-for="(s, i) in steps" :key="i" class="rounded bg-default/60 px-1.5 py-1">
|
|
109
109
|
<button
|
|
110
110
|
type="button"
|
|
111
|
-
class="flex w-full cursor-pointer items-center gap-1 rounded text-start focus:outline-none focus-visible:ring-2 focus-visible:ring-
|
|
111
|
+
class="flex w-full cursor-pointer items-center gap-1 rounded text-start focus:outline-none focus-visible:ring-2 focus-visible:ring-primary/60"
|
|
112
112
|
:title="`${agentKindMeta(s.agentKind).label} — ${agentKindMeta(s.agentKind).description}\n${t('board.task.clickToViewStep')}`"
|
|
113
113
|
@click.stop="openStep(i)"
|
|
114
114
|
>
|
|
@@ -117,19 +117,19 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
117
117
|
class="h-3 w-3 shrink-0"
|
|
118
118
|
:style="{ color: agentKindMeta(s.agentKind).color }"
|
|
119
119
|
/>
|
|
120
|
-
<span class="truncate text-[10px] text-
|
|
120
|
+
<span class="truncate text-[10px] text-default">
|
|
121
121
|
{{ agentKindMeta(s.agentKind).label }}
|
|
122
122
|
</span>
|
|
123
123
|
<UIcon
|
|
124
124
|
v-if="stepHasOutput(s)"
|
|
125
125
|
name="i-lucide-file-text"
|
|
126
|
-
class="h-2.5 w-2.5 shrink-0 text-
|
|
126
|
+
class="h-2.5 w-2.5 shrink-0 text-dimmed"
|
|
127
127
|
/>
|
|
128
128
|
<!-- The plain N/M count, replaced by the phase line below while a `pr-reviewer` step is
|
|
129
129
|
live — its slice progress reads better as Slicing… / Reviewing X/Y slices. -->
|
|
130
130
|
<span
|
|
131
131
|
v-if="s.subtasks && s.subtasks.total > 0 && !prPhaseActive(s)"
|
|
132
|
-
class="ms-auto shrink-0 font-mono text-[9px] tabular-nums text-
|
|
132
|
+
class="ms-auto shrink-0 font-mono text-[9px] tabular-nums text-muted"
|
|
133
133
|
>
|
|
134
134
|
{{ s.subtasks.completed }}/{{ s.subtasks.total }}
|
|
135
135
|
</span>
|
|
@@ -162,7 +162,7 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
162
162
|
!reviews.isBackground(s.agentKind, props.taskId)
|
|
163
163
|
"
|
|
164
164
|
type="button"
|
|
165
|
-
class="mt-1 flex w-full items-center justify-center gap-1 rounded bg-
|
|
165
|
+
class="mt-1 flex w-full items-center justify-center gap-1 rounded bg-app-warning-500 px-1.5 py-0.5 text-[9px] font-semibold text-app-warning-50 dark:text-app-warning-950 transition hover:bg-app-warning-400"
|
|
166
166
|
@click.stop="ui.openApprovalDetail(instance.id, s.approval.id)"
|
|
167
167
|
>
|
|
168
168
|
<UIcon name="i-lucide-shield-check" class="h-2.5 w-2.5" />
|
|
@@ -172,10 +172,10 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
172
172
|
<!-- per-step subtask progress bar -->
|
|
173
173
|
<div
|
|
174
174
|
v-if="s.subtasks && s.subtasks.total > 0"
|
|
175
|
-
class="mt-1 h-0.5 w-full overflow-hidden rounded bg-
|
|
175
|
+
class="mt-1 h-0.5 w-full overflow-hidden rounded bg-accented/60"
|
|
176
176
|
>
|
|
177
177
|
<div
|
|
178
|
-
class="h-full rounded bg-
|
|
178
|
+
class="h-full rounded bg-primary transition-all"
|
|
179
179
|
:style="{ width: `${(s.subtasks.completed / s.subtasks.total) * 100}%` }"
|
|
180
180
|
/>
|
|
181
181
|
</div>
|
|
@@ -192,7 +192,7 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
192
192
|
companionByStep[i]!.state === 'running' ? 'animate-spin' : '',
|
|
193
193
|
]"
|
|
194
194
|
/>
|
|
195
|
-
<span class="truncate text-
|
|
195
|
+
<span class="truncate text-muted">
|
|
196
196
|
{{ agentKindMeta(companionByStep[i]!.kind).label }}
|
|
197
197
|
</span>
|
|
198
198
|
<span
|
|
@@ -211,10 +211,10 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
211
211
|
class="flex items-start gap-1 text-[9px]"
|
|
212
212
|
:class="
|
|
213
213
|
item.status === 'completed'
|
|
214
|
-
? 'text-
|
|
214
|
+
? 'text-dimmed line-through'
|
|
215
215
|
: item.status === 'in_progress'
|
|
216
|
-
? 'text-
|
|
217
|
-
: 'text-
|
|
216
|
+
? 'text-app-100'
|
|
217
|
+
: 'text-muted'
|
|
218
218
|
"
|
|
219
219
|
>
|
|
220
220
|
<UIcon
|
|
@@ -182,11 +182,14 @@ watch(open, (isOpen) => {
|
|
|
182
182
|
presenting an empty list, which would read as "there was nothing to decide". -->
|
|
183
183
|
<div
|
|
184
184
|
v-if="unavailable"
|
|
185
|
-
class="space-y-2 rounded-md border border-
|
|
185
|
+
class="space-y-2 rounded-md border border-app-warning-500/30 bg-app-warning-500/5 p-3"
|
|
186
186
|
>
|
|
187
187
|
<div class="flex items-start gap-2">
|
|
188
|
-
<UIcon
|
|
189
|
-
|
|
188
|
+
<UIcon
|
|
189
|
+
name="i-lucide-triangle-alert"
|
|
190
|
+
class="mt-0.5 h-4 w-4 shrink-0 text-app-warning-400"
|
|
191
|
+
/>
|
|
192
|
+
<p class="text-sm text-app-warning-200/90">
|
|
190
193
|
{{
|
|
191
194
|
t(
|
|
192
195
|
`bootstrap.adoption.unavailable.${plan?.unavailableReason ?? 'analysis_unusable'}`,
|
|
@@ -194,7 +197,7 @@ watch(open, (isOpen) => {
|
|
|
194
197
|
}}
|
|
195
198
|
</p>
|
|
196
199
|
</div>
|
|
197
|
-
<p v-if="plan?.unavailableDetail" class="pl-6 text-xs text-
|
|
200
|
+
<p v-if="plan?.unavailableDetail" class="pl-6 text-xs text-muted">
|
|
198
201
|
{{ plan.unavailableDetail }}
|
|
199
202
|
</p>
|
|
200
203
|
</div>
|
|
@@ -204,7 +207,7 @@ watch(open, (isOpen) => {
|
|
|
204
207
|
exhausted budget is called out rather than left for someone to infer from a short
|
|
205
208
|
list: it is the difference between a thin read and a thin reading. -->
|
|
206
209
|
<div v-if="surveyReads.length" class="space-y-2 text-xs">
|
|
207
|
-
<p class="text-
|
|
210
|
+
<p class="text-muted">
|
|
208
211
|
{{
|
|
209
212
|
t('bootstrap.adoption.survey.summary', {
|
|
210
213
|
read: readSummary.read,
|
|
@@ -212,17 +215,17 @@ watch(open, (isOpen) => {
|
|
|
212
215
|
})
|
|
213
216
|
}}
|
|
214
217
|
</p>
|
|
215
|
-
<p v-if="readSummary.missed > 0" class="text-
|
|
218
|
+
<p v-if="readSummary.missed > 0" class="text-dimmed">
|
|
216
219
|
{{ t('bootstrap.adoption.survey.missed', { count: readSummary.missed }) }}
|
|
217
220
|
</p>
|
|
218
|
-
<p v-if="exhausted" class="text-
|
|
221
|
+
<p v-if="exhausted" class="text-app-warning-300/90">
|
|
219
222
|
{{ t(`bootstrap.adoption.survey.exhausted.${exhausted}`) }}
|
|
220
223
|
</p>
|
|
221
|
-
<p v-if="recordsDropped > 0" class="text-
|
|
224
|
+
<p v-if="recordsDropped > 0" class="text-app-warning-300/90">
|
|
222
225
|
{{ t('bootstrap.adoption.survey.truncated', { count: recordsDropped }) }}
|
|
223
226
|
</p>
|
|
224
227
|
<details>
|
|
225
|
-
<summary class="cursor-pointer text-
|
|
228
|
+
<summary class="cursor-pointer text-dimmed hover:text-toned">
|
|
226
229
|
{{ t('bootstrap.adoption.survey.show') }}
|
|
227
230
|
</summary>
|
|
228
231
|
<ul class="mt-2 space-y-1">
|
|
@@ -237,12 +240,12 @@ watch(open, (isOpen) => {
|
|
|
237
240
|
>
|
|
238
241
|
<span
|
|
239
242
|
class="shrink-0 font-mono text-[10px] uppercase"
|
|
240
|
-
:class="entry.outcome === 'read' ? 'text-
|
|
243
|
+
:class="entry.outcome === 'read' ? 'text-dimmed' : 'text-app-warning-400/80'"
|
|
241
244
|
>
|
|
242
245
|
{{ t(`bootstrap.adoption.survey.outcome.${entry.outcome}`) }}
|
|
243
246
|
</span>
|
|
244
|
-
<span class="font-mono text-
|
|
245
|
-
<span v-if="entry.note" class="text-
|
|
247
|
+
<span class="font-mono text-muted">{{ entry.path }}</span>
|
|
248
|
+
<span v-if="entry.note" class="text-app-600">{{ entry.note }}</span>
|
|
246
249
|
</li>
|
|
247
250
|
</ul>
|
|
248
251
|
</details>
|
|
@@ -260,7 +263,7 @@ watch(open, (isOpen) => {
|
|
|
260
263
|
|
|
261
264
|
<template v-else>
|
|
262
265
|
<div class="flex items-center justify-between gap-3">
|
|
263
|
-
<p class="text-sm text-
|
|
266
|
+
<p class="text-sm text-muted">{{ t('bootstrap.adoption.intro') }}</p>
|
|
264
267
|
<UButton
|
|
265
268
|
color="neutral"
|
|
266
269
|
variant="subtle"
|
|
@@ -279,14 +282,14 @@ watch(open, (isOpen) => {
|
|
|
279
282
|
class="space-y-3 rounded-md border p-3"
|
|
280
283
|
:class="
|
|
281
284
|
touched.has(decision.id)
|
|
282
|
-
? 'border-
|
|
283
|
-
: 'border-
|
|
285
|
+
? 'border-muted bg-default/40'
|
|
286
|
+
: 'border-app-warning-500/40 bg-app-warning-500/5'
|
|
284
287
|
"
|
|
285
288
|
>
|
|
286
289
|
<div class="flex items-start justify-between gap-3">
|
|
287
290
|
<div>
|
|
288
|
-
<p class="text-sm font-medium text-
|
|
289
|
-
<p class="text-[11px] uppercase tracking-wide text-
|
|
291
|
+
<p class="text-sm font-medium text-app-100">{{ decision.title }}</p>
|
|
292
|
+
<p class="text-[11px] uppercase tracking-wide text-dimmed">
|
|
290
293
|
{{ t(`bootstrap.adoption.area.${decision.area}`) }}
|
|
291
294
|
</p>
|
|
292
295
|
</div>
|
|
@@ -296,29 +299,29 @@ watch(open, (isOpen) => {
|
|
|
296
299
|
</div>
|
|
297
300
|
|
|
298
301
|
<div class="grid gap-2 text-xs sm:grid-cols-2">
|
|
299
|
-
<div class="rounded bg-
|
|
300
|
-
<p class="mb-1 font-semibold text-
|
|
302
|
+
<div class="rounded bg-default/60 p-2">
|
|
303
|
+
<p class="mb-1 font-semibold text-toned">
|
|
301
304
|
{{ t('bootstrap.adoption.side.monorepo') }}
|
|
302
305
|
</p>
|
|
303
|
-
<p class="text-
|
|
306
|
+
<p class="text-muted">
|
|
304
307
|
{{ decision.monorepoPractice ?? t('bootstrap.adoption.side.nothing') }}
|
|
305
308
|
</p>
|
|
306
309
|
</div>
|
|
307
|
-
<div class="rounded bg-
|
|
308
|
-
<p class="mb-1 font-semibold text-
|
|
310
|
+
<div class="rounded bg-default/60 p-2">
|
|
311
|
+
<p class="mb-1 font-semibold text-toned">
|
|
309
312
|
{{ t('bootstrap.adoption.side.template') }}
|
|
310
313
|
</p>
|
|
311
|
-
<p class="text-
|
|
314
|
+
<p class="text-muted">
|
|
312
315
|
{{ decision.templatePractice ?? t('bootstrap.adoption.side.nothing') }}
|
|
313
316
|
</p>
|
|
314
317
|
</div>
|
|
315
318
|
</div>
|
|
316
319
|
|
|
317
|
-
<p class="text-xs text-
|
|
320
|
+
<p class="text-xs text-muted">{{ decision.rationale }}</p>
|
|
318
321
|
|
|
319
322
|
<!-- The evidence is what makes the suggestion checkable rather than an assertion,
|
|
320
323
|
so it is shown, not tucked away. -->
|
|
321
|
-
<p v-if="decision.evidence.length" class="text-[11px] text-
|
|
324
|
+
<p v-if="decision.evidence.length" class="text-[11px] text-dimmed">
|
|
322
325
|
{{ t('bootstrap.adoption.evidence') }}
|
|
323
326
|
<span class="font-mono">{{ decision.evidence.join(', ') }}</span>
|
|
324
327
|
</p>
|
|
@@ -365,7 +368,7 @@ watch(open, (isOpen) => {
|
|
|
365
368
|
|
|
366
369
|
<template #footer>
|
|
367
370
|
<div class="flex w-full items-center justify-between gap-3">
|
|
368
|
-
<p v-if="!unavailable && remaining > 0" class="text-xs text-
|
|
371
|
+
<p v-if="!unavailable && remaining > 0" class="text-xs text-app-warning-300/90">
|
|
369
372
|
{{ t('bootstrap.adoption.remaining', { count: remaining }) }}
|
|
370
373
|
</p>
|
|
371
374
|
<span v-else />
|
|
@@ -619,7 +619,7 @@ const statusLabel = computed<Record<BootstrapStatus, string>>(() => ({
|
|
|
619
619
|
the user creates it in one click on a host we can name; or the user creates it
|
|
620
620
|
themselves somewhere we cannot name, where promising a click below would be a lie
|
|
621
621
|
(the button is absent for exactly the same reason). -->
|
|
622
|
-
<p class="text-sm text-
|
|
622
|
+
<p class="text-sm text-muted">
|
|
623
623
|
{{
|
|
624
624
|
intoMonorepo
|
|
625
625
|
? t('bootstrap.monorepo.intro')
|
|
@@ -635,11 +635,11 @@ const statusLabel = computed<Record<BootstrapStatus, string>>(() => ({
|
|
|
635
635
|
whichever methods the deployment serves, never just the GitHub App. -->
|
|
636
636
|
<div
|
|
637
637
|
v-if="needsConnection"
|
|
638
|
-
class="space-y-3 rounded-md border border-
|
|
638
|
+
class="space-y-3 rounded-md border border-app-warning-500/30 bg-app-warning-500/5 p-3"
|
|
639
639
|
>
|
|
640
640
|
<div class="flex items-start gap-2">
|
|
641
|
-
<UIcon name="i-lucide-plug-zap" class="mt-0.5 h-4 w-4 shrink-0 text-
|
|
642
|
-
<p class="text-sm text-
|
|
641
|
+
<UIcon name="i-lucide-plug-zap" class="mt-0.5 h-4 w-4 shrink-0 text-app-warning-400" />
|
|
642
|
+
<p class="text-sm text-app-warning-200/90">
|
|
643
643
|
{{ t('vcs.bootstrap.connectPrompt') }}
|
|
644
644
|
</p>
|
|
645
645
|
</div>
|
|
@@ -648,7 +648,7 @@ const statusLabel = computed<Record<BootstrapStatus, string>>(() => ({
|
|
|
648
648
|
|
|
649
649
|
<!-- launch -->
|
|
650
650
|
<section class="space-y-4">
|
|
651
|
-
<h3 class="text-[11px] font-semibold uppercase tracking-wide text-
|
|
651
|
+
<h3 class="text-[11px] font-semibold uppercase tracking-wide text-muted">
|
|
652
652
|
{{ t('bootstrap.section.newRepo') }}
|
|
653
653
|
</h3>
|
|
654
654
|
|
|
@@ -676,7 +676,7 @@ const statusLabel = computed<Record<BootstrapStatus, string>>(() => ({
|
|
|
676
676
|
:description="t('bootstrap.monorepo.repo.description')"
|
|
677
677
|
required
|
|
678
678
|
>
|
|
679
|
-
<div v-if="!monorepoRepoItems.length" class="text-sm text-
|
|
679
|
+
<div v-if="!monorepoRepoItems.length" class="text-sm text-muted">
|
|
680
680
|
{{ t('bootstrap.monorepo.repo.empty') }}
|
|
681
681
|
</div>
|
|
682
682
|
<USelect
|
|
@@ -716,9 +716,9 @@ const statusLabel = computed<Record<BootstrapStatus, string>>(() => ({
|
|
|
716
716
|
decide nothing, so say that instead of listing a repo for nothing. -->
|
|
717
717
|
<div
|
|
718
718
|
v-if="browsingDirectory && monorepoRepoId !== undefined"
|
|
719
|
-
class="rounded-md border border-
|
|
719
|
+
class="rounded-md border border-default bg-default/40 p-2"
|
|
720
720
|
>
|
|
721
|
-
<p class="mb-2 text-xs text-
|
|
721
|
+
<p class="mb-2 text-xs text-muted">
|
|
722
722
|
{{
|
|
723
723
|
directoryLeaf
|
|
724
724
|
? t('bootstrap.monorepo.directory.browseHint')
|
|
@@ -749,7 +749,7 @@ const statusLabel = computed<Record<BootstrapStatus, string>>(() => ({
|
|
|
749
749
|
:description="t('bootstrap.reference.description')"
|
|
750
750
|
required
|
|
751
751
|
>
|
|
752
|
-
<div v-if="!bootstrap.hasArchitectures" class="text-sm text-
|
|
752
|
+
<div v-if="!bootstrap.hasArchitectures" class="text-sm text-muted">
|
|
753
753
|
{{ t('bootstrap.reference.empty') }}
|
|
754
754
|
</div>
|
|
755
755
|
<USelect
|
|
@@ -893,7 +893,7 @@ const statusLabel = computed<Record<BootstrapStatus, string>>(() => ({
|
|
|
893
893
|
<UFormField :label="t('bootstrap.visibility.label')">
|
|
894
894
|
<div class="flex items-center gap-2">
|
|
895
895
|
<USwitch v-model="isPrivate" />
|
|
896
|
-
<span class="text-sm text-
|
|
896
|
+
<span class="text-sm text-toned">{{ t('bootstrap.visibility.private') }}</span>
|
|
897
897
|
</div>
|
|
898
898
|
</UFormField>
|
|
899
899
|
|
|
@@ -912,17 +912,17 @@ const statusLabel = computed<Record<BootstrapStatus, string>>(() => ({
|
|
|
912
912
|
|
|
913
913
|
<!-- recent jobs -->
|
|
914
914
|
<section v-if="agentRuns.bootstrapJobs.length" class="space-y-2">
|
|
915
|
-
<h3 class="text-[11px] font-semibold uppercase tracking-wide text-
|
|
915
|
+
<h3 class="text-[11px] font-semibold uppercase tracking-wide text-muted">
|
|
916
916
|
{{ t('bootstrap.recent.title') }}
|
|
917
917
|
</h3>
|
|
918
918
|
<div
|
|
919
919
|
v-for="job in agentRuns.bootstrapJobs.slice(0, 5)"
|
|
920
920
|
:key="job.id"
|
|
921
|
-
class="flex items-center justify-between gap-2 rounded-md border border-
|
|
921
|
+
class="flex items-center justify-between gap-2 rounded-md border border-default bg-default/60 px-3 py-2 text-sm"
|
|
922
922
|
>
|
|
923
923
|
<div class="min-w-0">
|
|
924
|
-
<div class="truncate text-
|
|
925
|
-
<div class="truncate text-[11px] text-
|
|
924
|
+
<div class="truncate text-default">{{ job.repoName }}</div>
|
|
925
|
+
<div class="truncate text-[11px] text-dimmed">
|
|
926
926
|
{{
|
|
927
927
|
job.referenceArchitectureName
|
|
928
928
|
? t('bootstrap.recent.fromArch', { name: job.referenceArchitectureName })
|
|
@@ -935,7 +935,7 @@ const statusLabel = computed<Record<BootstrapStatus, string>>(() => ({
|
|
|
935
935
|
v-if="job.repoUrl"
|
|
936
936
|
:to="job.repoUrl"
|
|
937
937
|
target="_blank"
|
|
938
|
-
class="text-[11px] text-
|
|
938
|
+
class="text-[11px] text-primary hover:underline"
|
|
939
939
|
>
|
|
940
940
|
{{ t('bootstrap.recent.open') }}
|
|
941
941
|
</ULink>
|
|
@@ -947,7 +947,7 @@ const statusLabel = computed<Record<BootstrapStatus, string>>(() => ({
|
|
|
947
947
|
v-if="job.prUrl"
|
|
948
948
|
:to="job.prUrl"
|
|
949
949
|
target="_blank"
|
|
950
|
-
class="text-[11px] text-
|
|
950
|
+
class="text-[11px] text-primary hover:underline"
|
|
951
951
|
>
|
|
952
952
|
{{ t('bootstrap.recent.openPr') }}
|
|
953
953
|
</ULink>
|
|
@@ -963,7 +963,7 @@ const statusLabel = computed<Record<BootstrapStatus, string>>(() => ({
|
|
|
963
963
|
<!-- reference architecture management -->
|
|
964
964
|
<section class="space-y-3">
|
|
965
965
|
<div class="flex items-center justify-between">
|
|
966
|
-
<h3 class="text-[11px] font-semibold uppercase tracking-wide text-
|
|
966
|
+
<h3 class="text-[11px] font-semibold uppercase tracking-wide text-muted">
|
|
967
967
|
{{ t('bootstrap.arch.title') }}
|
|
968
968
|
</h3>
|
|
969
969
|
<UButton
|
|
@@ -980,13 +980,11 @@ const statusLabel = computed<Record<BootstrapStatus, string>>(() => ({
|
|
|
980
980
|
<div
|
|
981
981
|
v-for="a in bootstrap.architectures"
|
|
982
982
|
:key="a.id"
|
|
983
|
-
class="flex items-center justify-between gap-2 rounded-md border border-
|
|
983
|
+
class="flex items-center justify-between gap-2 rounded-md border border-default bg-default/60 px-3 py-2"
|
|
984
984
|
>
|
|
985
985
|
<div class="min-w-0">
|
|
986
|
-
<div class="truncate text-sm text-
|
|
987
|
-
<div class="truncate text-[11px] text-
|
|
988
|
-
{{ a.repoOwner }}/{{ a.repoName }}
|
|
989
|
-
</div>
|
|
986
|
+
<div class="truncate text-sm text-default">{{ a.name }}</div>
|
|
987
|
+
<div class="truncate text-[11px] text-dimmed">{{ a.repoOwner }}/{{ a.repoName }}</div>
|
|
990
988
|
</div>
|
|
991
989
|
<div class="flex items-center gap-1">
|
|
992
990
|
<UButton
|
|
@@ -1009,7 +1007,7 @@ const statusLabel = computed<Record<BootstrapStatus, string>>(() => ({
|
|
|
1009
1007
|
<!-- add / edit form -->
|
|
1010
1008
|
<div
|
|
1011
1009
|
v-if="showArchForm"
|
|
1012
|
-
class="space-y-3 rounded-md border border-
|
|
1010
|
+
class="space-y-3 rounded-md border border-muted bg-default/80 p-3"
|
|
1013
1011
|
>
|
|
1014
1012
|
<!-- The options come from the connected projection, so a repo to pick means a
|
|
1015
1013
|
connection exists and `providerLabel` names it rather than guessing. -->
|
|
@@ -44,7 +44,7 @@ function stateLabel(state: BootstrapStepState): string {
|
|
|
44
44
|
:class="BOOTSTRAP_STEP_STYLE[step.state].iconClass"
|
|
45
45
|
/>
|
|
46
46
|
<span :class="BOOTSTRAP_STEP_STYLE[step.state].labelClass">{{ stepLabel(step.id) }}</span>
|
|
47
|
-
<span class="ms-auto shrink-0 text-
|
|
47
|
+
<span class="ms-auto shrink-0 text-dimmed">{{ stateLabel(step.state) }}</span>
|
|
48
48
|
</li>
|
|
49
49
|
</ol>
|
|
50
50
|
</template>
|
|
@@ -258,7 +258,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
258
258
|
<ResultWindowShell
|
|
259
259
|
:open="open"
|
|
260
260
|
:icon="isArchitecture ? 'i-lucide-drafting-compass' : 'i-lucide-lightbulb'"
|
|
261
|
-
icon-class="bg-
|
|
261
|
+
icon-class="bg-app-warning-500/15 text-app-warning-300"
|
|
262
262
|
:title="
|
|
263
263
|
isArchitecture ? t('brainstorm.title.architecture') : t('brainstorm.title.requirements')
|
|
264
264
|
"
|
|
@@ -276,15 +276,15 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
276
276
|
<div class="flex min-h-0 flex-1">
|
|
277
277
|
<!-- main column -->
|
|
278
278
|
<div class="min-w-0 flex-1 overflow-y-auto px-6 py-5">
|
|
279
|
-
<p class="mb-4 text-sm text-
|
|
279
|
+
<p class="mb-4 text-sm text-muted">
|
|
280
280
|
<i18n-t keypath="brainstorm.intro" tag="span" scope="global">
|
|
281
281
|
<template #subject>{{ subjectNoun }}</template>
|
|
282
282
|
<template #doc>{{ docNoun }}</template>
|
|
283
283
|
<template #choose>
|
|
284
|
-
<span class="text-
|
|
284
|
+
<span class="text-toned">{{ t('brainstorm.introChoose') }}</span>
|
|
285
285
|
</template>
|
|
286
286
|
<template #dismiss>
|
|
287
|
-
<span class="text-
|
|
287
|
+
<span class="text-toned">{{ t('brainstorm.introDismiss') }}</span>
|
|
288
288
|
</template>
|
|
289
289
|
</i18n-t>
|
|
290
290
|
</p>
|
|
@@ -292,7 +292,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
292
292
|
<!-- empty state -->
|
|
293
293
|
<div
|
|
294
294
|
v-if="!session && !busy && !loading"
|
|
295
|
-
class="rounded-lg border border-dashed border-
|
|
295
|
+
class="rounded-lg border border-dashed border-muted p-8 text-center text-sm text-dimmed"
|
|
296
296
|
>
|
|
297
297
|
{{ t('brainstorm.empty') }}
|
|
298
298
|
</div>
|
|
@@ -300,7 +300,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
300
300
|
<!-- working state (initial fetch on open, or an agent pass running) -->
|
|
301
301
|
<div
|
|
302
302
|
v-else-if="(busy || loading) && !session"
|
|
303
|
-
class="flex items-center justify-center gap-2 p-8 text-sm text-
|
|
303
|
+
class="flex items-center justify-center gap-2 p-8 text-sm text-muted"
|
|
304
304
|
>
|
|
305
305
|
<UIcon name="i-lucide-loader-circle" class="h-4 w-4 animate-spin" />
|
|
306
306
|
{{ loading && !busy ? t('brainstorm.loading') : t('brainstorm.generating') }}
|
|
@@ -310,7 +310,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
310
310
|
<!-- converged -->
|
|
311
311
|
<div
|
|
312
312
|
v-if="incorporated"
|
|
313
|
-
class="mb-4 flex items-center gap-2 rounded-lg border border-
|
|
313
|
+
class="mb-4 flex items-center gap-2 rounded-lg border border-app-success-900/60 bg-app-success-950/30 p-4 text-sm text-app-success-300"
|
|
314
314
|
>
|
|
315
315
|
<UIcon name="i-lucide-circle-check" class="h-5 w-5 shrink-0" />
|
|
316
316
|
{{ t('brainstorm.settledBanner', { doc: docNoun }) }}
|
|
@@ -329,7 +329,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
329
329
|
<!-- working: the async cycle is running in the driver -->
|
|
330
330
|
<div
|
|
331
331
|
v-else-if="working"
|
|
332
|
-
class="mb-4 flex items-center gap-2 rounded-lg border border-
|
|
332
|
+
class="mb-4 flex items-center gap-2 rounded-lg border border-app-warning-900/60 bg-app-warning-950/30 p-4 text-sm text-app-warning-200"
|
|
333
333
|
>
|
|
334
334
|
<UIcon name="i-lucide-loader-circle" class="h-5 w-5 shrink-0 animate-spin" />
|
|
335
335
|
<span v-if="incorporating">
|
|
@@ -345,17 +345,17 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
345
345
|
<div
|
|
346
346
|
v-for="item in sortedItems"
|
|
347
347
|
:key="item.id"
|
|
348
|
-
class="rounded-lg border border-
|
|
348
|
+
class="rounded-lg border border-default bg-default/60 p-3"
|
|
349
349
|
:class="{ 'opacity-60': item.status === 'dismissed' }"
|
|
350
350
|
>
|
|
351
351
|
<div class="flex items-start gap-2">
|
|
352
352
|
<UIcon
|
|
353
353
|
:name="CATEGORY_ICON[item.category]"
|
|
354
|
-
class="mt-0.5 h-4 w-4 shrink-0 text-
|
|
354
|
+
class="mt-0.5 h-4 w-4 shrink-0 text-muted"
|
|
355
355
|
/>
|
|
356
356
|
<div class="min-w-0 flex-1">
|
|
357
357
|
<div class="flex flex-wrap items-center gap-1.5">
|
|
358
|
-
<span class="text-sm font-medium text-
|
|
358
|
+
<span class="text-sm font-medium text-highlighted">{{ item.title }}</span>
|
|
359
359
|
<UBadge size="xs" variant="subtle" :color="SEVERITY_COLOR[item.severity]">
|
|
360
360
|
{{ t(SEVERITY_LABELS[item.severity]) }}
|
|
361
361
|
</UBadge>
|
|
@@ -375,16 +375,16 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
375
375
|
around it takes the span (see the shell's `width` prop: the unit is the
|
|
376
376
|
paragraph, not the section). The badge row above and the choose/dismiss
|
|
377
377
|
control below are what the full width is actually for. -->
|
|
378
|
-
<p class="mt-1 max-w-3xl whitespace-pre-line text-sm text-
|
|
378
|
+
<p class="mt-1 max-w-3xl whitespace-pre-line text-sm text-muted">
|
|
379
379
|
{{ item.detail }}
|
|
380
380
|
</p>
|
|
381
381
|
|
|
382
382
|
<!-- recorded choice -->
|
|
383
383
|
<div
|
|
384
384
|
v-if="item.reply"
|
|
385
|
-
class="mt-2 max-w-3xl rounded-md border-s-2 border-
|
|
385
|
+
class="mt-2 max-w-3xl rounded-md border-s-2 border-muted bg-app-950/40 px-3 py-1.5 text-sm text-toned"
|
|
386
386
|
>
|
|
387
|
-
<span class="text-[10px] uppercase tracking-wide text-
|
|
387
|
+
<span class="text-[10px] uppercase tracking-wide text-dimmed">
|
|
388
388
|
{{ t('brainstorm.yourChoice') }}
|
|
389
389
|
</span>
|
|
390
390
|
<p class="whitespace-pre-line">{{ item.reply }}</p>
|
|
@@ -453,8 +453,8 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
453
453
|
</div>
|
|
454
454
|
|
|
455
455
|
<!-- converged document: the standard-format direction -->
|
|
456
|
-
<section v-if="outline" class="mt-6 border-t border-
|
|
457
|
-
<div class="mb-3 flex items-center gap-1.5 text-[11px] text-
|
|
456
|
+
<section v-if="outline" class="mt-6 border-t border-default pt-5">
|
|
457
|
+
<div class="mb-3 flex items-center gap-1.5 text-[11px] text-app-success-400">
|
|
458
458
|
<UIcon name="i-lucide-file-check-2" class="h-3.5 w-3.5" />
|
|
459
459
|
<span class="font-semibold uppercase tracking-wide">
|
|
460
460
|
{{ incorporated ? docNoun : t('brainstorm.docDraft', { doc: docNoun }) }}
|
|
@@ -471,18 +471,18 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
471
471
|
>
|
|
472
472
|
<UIcon
|
|
473
473
|
name="i-lucide-chevron-right"
|
|
474
|
-
class="h-3.5 w-3.5 shrink-0 text-
|
|
474
|
+
class="h-3.5 w-3.5 shrink-0 text-dimmed transition-transform"
|
|
475
475
|
:class="collapsed[s.id] ? '' : 'rotate-90'"
|
|
476
476
|
/>
|
|
477
477
|
<span
|
|
478
|
-
class="font-semibold text-
|
|
478
|
+
class="font-semibold text-highlighted"
|
|
479
479
|
:class="s.depth <= 1 ? 'text-base' : s.depth === 2 ? 'text-sm' : 'text-xs'"
|
|
480
480
|
v-html="s.titleHtml"
|
|
481
481
|
/>
|
|
482
482
|
</button>
|
|
483
483
|
<div
|
|
484
484
|
v-show="!s.title || !collapsed[s.id]"
|
|
485
|
-
class="reader-prose mt-1 ps-5.5 text-[13px] leading-relaxed text-
|
|
485
|
+
class="reader-prose mt-1 ps-5.5 text-[13px] leading-relaxed text-toned"
|
|
486
486
|
v-html="s.bodyHtml"
|
|
487
487
|
/>
|
|
488
488
|
</div>
|
|
@@ -491,32 +491,29 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
491
491
|
</div>
|
|
492
492
|
|
|
493
493
|
<!-- right action rail -->
|
|
494
|
-
<aside class="hidden w-72 shrink-0 flex-col border-s border-
|
|
494
|
+
<aside class="hidden w-72 shrink-0 flex-col border-s border-default lg:flex">
|
|
495
495
|
<div class="flex flex-col gap-4 px-4 py-5">
|
|
496
|
-
<div v-if="session" class="space-y-2 text-xs text-
|
|
496
|
+
<div v-if="session" class="space-y-2 text-xs text-muted">
|
|
497
497
|
<div class="flex items-center justify-between">
|
|
498
498
|
<span>{{ t('brainstorm.rail.options') }}</span>
|
|
499
|
-
<span class="text-
|
|
499
|
+
<span class="text-toned">{{ session.items.length }}</span>
|
|
500
500
|
</div>
|
|
501
501
|
<div class="flex items-center justify-between">
|
|
502
502
|
<span>{{ t('brainstorm.rail.open') }}</span>
|
|
503
|
-
<span class="text-
|
|
503
|
+
<span class="text-toned">{{ openCount }}</span>
|
|
504
504
|
</div>
|
|
505
505
|
<div class="flex items-center justify-between">
|
|
506
506
|
<span>{{ t('brainstorm.rail.chosen') }}</span>
|
|
507
|
-
<span class="text-
|
|
507
|
+
<span class="text-toned">{{ answeredCount }}</span>
|
|
508
508
|
</div>
|
|
509
509
|
<div v-if="session.model" class="flex items-center justify-between">
|
|
510
510
|
<span>{{ t('brainstorm.rail.model') }}</span>
|
|
511
|
-
<span class="truncate ps-2 text-
|
|
511
|
+
<span class="truncate ps-2 text-dimmed">{{ session.model }}</span>
|
|
512
512
|
</div>
|
|
513
513
|
</div>
|
|
514
514
|
|
|
515
515
|
<!-- action: ready (choose → incorporate / proceed) -->
|
|
516
|
-
<div
|
|
517
|
-
v-if="session && status === 'ready'"
|
|
518
|
-
class="space-y-2 border-t border-slate-800 pt-4"
|
|
519
|
-
>
|
|
516
|
+
<div v-if="session && status === 'ready'" class="space-y-2 border-t border-default pt-4">
|
|
520
517
|
<UButton
|
|
521
518
|
v-if="canProceed"
|
|
522
519
|
color="primary"
|
|
@@ -544,7 +541,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
544
541
|
>
|
|
545
542
|
{{ t('brainstorm.incorporateChoices') }}
|
|
546
543
|
</UButton>
|
|
547
|
-
<p class="text-[11px] leading-relaxed text-
|
|
544
|
+
<p class="text-[11px] leading-relaxed text-dimmed">
|
|
548
545
|
<template v-if="canProceed">
|
|
549
546
|
{{ t('brainstorm.hint.allDismissed') }}
|
|
550
547
|
</template>
|
|
@@ -556,7 +553,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
556
553
|
</div>
|
|
557
554
|
|
|
558
555
|
<!-- action: merged (inspect → re-run / redo) -->
|
|
559
|
-
<div v-if="session && merged" class="space-y-2 border-t border-
|
|
556
|
+
<div v-if="session && merged" class="space-y-2 border-t border-default pt-4">
|
|
560
557
|
<UButton
|
|
561
558
|
color="primary"
|
|
562
559
|
size="sm"
|
|
@@ -606,14 +603,14 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
606
603
|
{{ t('brainstorm.redoWithDirection') }}
|
|
607
604
|
</UButton>
|
|
608
605
|
</div>
|
|
609
|
-
<p class="text-[11px] leading-relaxed text-
|
|
606
|
+
<p class="text-[11px] leading-relaxed text-dimmed">
|
|
610
607
|
{{ t('brainstorm.mergedHint') }}
|
|
611
608
|
</p>
|
|
612
609
|
</div>
|
|
613
610
|
|
|
614
611
|
<div
|
|
615
612
|
v-if="session && incorporated"
|
|
616
|
-
class="border-t border-
|
|
613
|
+
class="border-t border-default pt-4 text-[11px] leading-relaxed text-dimmed"
|
|
617
614
|
>
|
|
618
615
|
{{ t('brainstorm.incorporatedFooter') }}
|
|
619
616
|
</div>
|