@cat-factory/app 0.302.2 → 0.303.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -0
- 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 +23 -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 +9 -8
|
@@ -311,9 +311,9 @@ function selectTask() {
|
|
|
311
311
|
:data-status="task.status"
|
|
312
312
|
:data-task-type="task.taskType"
|
|
313
313
|
data-testid="task-card"
|
|
314
|
-
class="nodrag w-full cursor-pointer rounded-lg border bg-
|
|
314
|
+
class="nodrag w-full cursor-pointer rounded-lg border bg-app-950/70 p-2 text-start transition"
|
|
315
315
|
:class="[
|
|
316
|
-
selected ? 'border-
|
|
316
|
+
selected ? 'border-inverted' : 'border-muted hover:border-app-500',
|
|
317
317
|
task.status === 'pr_ready' ? 'board-pulse-green' : attention ? 'board-pulse' : '',
|
|
318
318
|
]"
|
|
319
319
|
@click.stop="selectTask"
|
|
@@ -328,7 +328,7 @@ function selectTask() {
|
|
|
328
328
|
<span
|
|
329
329
|
v-if="typeBadge"
|
|
330
330
|
class="inline-flex h-3.5 w-3.5 shrink-0 items-center justify-center rounded"
|
|
331
|
-
:style="{ color: typeBadge.color, backgroundColor:
|
|
331
|
+
:style="{ color: typeBadge.color, backgroundColor: tint(typeBadge.color) }"
|
|
332
332
|
:title="typeBadge.label"
|
|
333
333
|
:data-task-type-badge="task.taskType"
|
|
334
334
|
data-testid="task-type-badge"
|
|
@@ -338,7 +338,7 @@ function selectTask() {
|
|
|
338
338
|
<UIcon
|
|
339
339
|
v-if="schedule"
|
|
340
340
|
name="i-lucide-repeat"
|
|
341
|
-
class="h-3 w-3 shrink-0 text-
|
|
341
|
+
class="h-3 w-3 shrink-0 text-primary"
|
|
342
342
|
:title="
|
|
343
343
|
schedule.enabled
|
|
344
344
|
? t('board.task.recurringPipeline')
|
|
@@ -349,12 +349,12 @@ function selectTask() {
|
|
|
349
349
|
class="ms-auto truncate text-[9px] uppercase tracking-wide"
|
|
350
350
|
:class="
|
|
351
351
|
runFailed
|
|
352
|
-
? 'text-
|
|
352
|
+
? 'text-app-error-400'
|
|
353
353
|
: reviewStage
|
|
354
|
-
? 'text-
|
|
354
|
+
? 'text-primary'
|
|
355
355
|
: attention
|
|
356
|
-
? 'text-
|
|
357
|
-
: 'text-
|
|
356
|
+
? 'text-app-warning-400'
|
|
357
|
+
: 'text-dimmed'
|
|
358
358
|
"
|
|
359
359
|
>
|
|
360
360
|
{{ statusText }}
|
|
@@ -362,7 +362,7 @@ function selectTask() {
|
|
|
362
362
|
<!-- drag-to-connect handle: drag onto another task to make it depend on this one -->
|
|
363
363
|
<button
|
|
364
364
|
type="button"
|
|
365
|
-
class="nodrag shrink-0 cursor-crosshair touch-none rounded-full p-0.5 text-
|
|
365
|
+
class="nodrag shrink-0 cursor-crosshair touch-none rounded-full p-0.5 text-dimmed hover:bg-elevated hover:text-app-warning-400 pointer-coarse:p-2.5"
|
|
366
366
|
:title="t('board.task.dragToConnect')"
|
|
367
367
|
@pointerdown.stop="startConnect(task.id, $event)"
|
|
368
368
|
@click.stop
|
|
@@ -379,7 +379,7 @@ function selectTask() {
|
|
|
379
379
|
title is the one always-rendered part of the body that no control can occupy. -->
|
|
380
380
|
<div
|
|
381
381
|
data-testid="task-title"
|
|
382
|
-
class="mt-1 line-clamp-2 break-words text-[11px] font-semibold leading-snug text-
|
|
382
|
+
class="mt-1 line-clamp-2 break-words text-[11px] font-semibold leading-snug text-app-100"
|
|
383
383
|
:title="task.title"
|
|
384
384
|
>
|
|
385
385
|
{{ task.title }}
|
|
@@ -410,13 +410,13 @@ function selectTask() {
|
|
|
410
410
|
<UIcon
|
|
411
411
|
:name="runnable ? 'i-lucide-link' : 'i-lucide-lock'"
|
|
412
412
|
class="h-3 w-3"
|
|
413
|
-
:class="runnable ? 'text-
|
|
413
|
+
:class="runnable ? 'text-dimmed' : 'text-app-warning-400'"
|
|
414
414
|
/>
|
|
415
415
|
<span
|
|
416
416
|
v-for="d in deps"
|
|
417
417
|
:key="d.id"
|
|
418
|
-
class="inline-flex items-center gap-0.5 rounded bg-
|
|
419
|
-
:class="d.status === 'done' ? 'text-
|
|
418
|
+
class="inline-flex items-center gap-0.5 rounded bg-elevated/80 px-1 py-0.5 text-[9px]"
|
|
419
|
+
:class="d.status === 'done' ? 'text-muted' : 'text-app-warning-300'"
|
|
420
420
|
:title="depLabel(d)"
|
|
421
421
|
>
|
|
422
422
|
<UIcon
|
|
@@ -431,7 +431,7 @@ function selectTask() {
|
|
|
431
431
|
<div class="nodrag mt-2 flex flex-wrap items-center gap-1">
|
|
432
432
|
<!-- a reviewer gate folding/re-reviewing in the background: a working indicator,
|
|
433
433
|
NOT a gate — the human is back on the board and summoned only if input is needed -->
|
|
434
|
-
<span v-if="reviewStage" class="inline-flex items-center gap-1 text-[9px] text-
|
|
434
|
+
<span v-if="reviewStage" class="inline-flex items-center gap-1 text-[9px] text-primary">
|
|
435
435
|
<UIcon name="i-lucide-loader-circle" class="h-3 w-3 animate-spin" />
|
|
436
436
|
{{ reviewStageLabel }}
|
|
437
437
|
</span>
|
|
@@ -481,7 +481,7 @@ function selectTask() {
|
|
|
481
481
|
</UButton>
|
|
482
482
|
<span
|
|
483
483
|
v-if="runnable && defaultPipeline"
|
|
484
|
-
class="inline-flex items-center gap-0.5 text-[9px] text-
|
|
484
|
+
class="inline-flex items-center gap-0.5 text-[9px] text-dimmed"
|
|
485
485
|
>
|
|
486
486
|
<UIcon name="i-lucide-workflow" class="h-2.5 w-2.5" />{{ defaultPipeline.name }}
|
|
487
487
|
</span>
|
|
@@ -539,7 +539,7 @@ function selectTask() {
|
|
|
539
539
|
<!-- A merged task is the one people come back to READ, so its result stays openable
|
|
540
540
|
rather than collapsing to a tick the moment it lands. -->
|
|
541
541
|
<template v-else-if="task.status === 'done'">
|
|
542
|
-
<span class="inline-flex items-center gap-1 text-[9px] text-
|
|
542
|
+
<span class="inline-flex items-center gap-1 text-[9px] text-app-success-400">
|
|
543
543
|
<UIcon name="i-lucide-check-check" class="h-3 w-3" /> {{ t('board.task.implemented') }}
|
|
544
544
|
</span>
|
|
545
545
|
<UButton
|
|
@@ -562,10 +562,10 @@ function selectTask() {
|
|
|
562
562
|
cost a row of card height each and add nothing. -->
|
|
563
563
|
<div
|
|
564
564
|
v-if="showModuleChip"
|
|
565
|
-
class="mt-2 flex flex-wrap items-center gap-1 border-t border-
|
|
565
|
+
class="mt-2 flex flex-wrap items-center gap-1 border-t border-default pt-2"
|
|
566
566
|
>
|
|
567
567
|
<span
|
|
568
|
-
class="inline-flex items-center gap-1 rounded bg-
|
|
568
|
+
class="inline-flex items-center gap-1 rounded bg-app-secondary-500/15 px-1.5 py-0.5 text-[9px] text-app-secondary-200"
|
|
569
569
|
:title="t('board.task.module', { name: task.moduleName })"
|
|
570
570
|
>
|
|
571
571
|
<UIcon :name="MODULE_META.icon" class="h-3 w-3" :style="{ color: MODULE_META.color }" />
|
|
@@ -36,20 +36,20 @@ const isEmpty = computed(() => props.rendered.groups.every((g) => g.entries.leng
|
|
|
36
36
|
|
|
37
37
|
<template>
|
|
38
38
|
<div
|
|
39
|
-
class="flex min-w-0 flex-col rounded-lg bg-
|
|
39
|
+
class="flex min-w-0 flex-col rounded-lg bg-default/40"
|
|
40
40
|
:style="{ width: LANE_GEOMETRY.laneWidth + 'px' }"
|
|
41
41
|
:data-lane="rendered.lane"
|
|
42
42
|
>
|
|
43
43
|
<!-- Lane header -->
|
|
44
44
|
<div
|
|
45
45
|
class="flex items-center gap-1.5 rounded-t-lg border-b px-2 py-1.5"
|
|
46
|
-
:style="{ borderColor: meta.color
|
|
46
|
+
:style="{ borderColor: tint(meta.color, 20) }"
|
|
47
47
|
>
|
|
48
48
|
<UIcon :name="meta.icon" class="h-3.5 w-3.5 shrink-0" :style="{ color: meta.color }" />
|
|
49
|
-
<span class="truncate text-[11px] font-semibold text-
|
|
49
|
+
<span class="truncate text-[11px] font-semibold text-default">{{ t(meta.labelKey) }}</span>
|
|
50
50
|
<span
|
|
51
51
|
class="ms-auto shrink-0 rounded px-1 text-[10px] font-semibold tabular-nums"
|
|
52
|
-
:style="{ backgroundColor: meta.color
|
|
52
|
+
:style="{ backgroundColor: tint(meta.color), color: meta.color }"
|
|
53
53
|
:data-testid="`lane-count-${rendered.lane}`"
|
|
54
54
|
>{{ rendered.total }}</span
|
|
55
55
|
>
|
|
@@ -65,7 +65,7 @@ const isEmpty = computed(() => props.rendered.groups.every((g) => g.entries.leng
|
|
|
65
65
|
<!-- An empty lane SAYS it is empty. Left blank, "nothing needs you" and "the lane failed
|
|
66
66
|
to render" look identical, and the first is worth stating: it is the answer a reader
|
|
67
67
|
scanning the needs-you column is hoping for. -->
|
|
68
|
-
<p v-if="isEmpty" class="px-1 pt-2 text-[10px] leading-snug text-
|
|
68
|
+
<p v-if="isEmpty" class="px-1 pt-2 text-[10px] leading-snug text-app-600">
|
|
69
69
|
{{ t(meta.emptyKey) }}
|
|
70
70
|
</p>
|
|
71
71
|
<LaneGroup
|
|
@@ -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>
|