@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
|
@@ -143,37 +143,37 @@ const STATUS_META = computed<
|
|
|
143
143
|
label: t('gates.status.passed'),
|
|
144
144
|
badge: 'success',
|
|
145
145
|
icon: 'i-lucide-circle-check',
|
|
146
|
-
text: 'text-
|
|
146
|
+
text: 'text-app-success-300',
|
|
147
147
|
},
|
|
148
148
|
'gave-up': {
|
|
149
149
|
label: t('gates.status.gaveUp'),
|
|
150
150
|
badge: 'error',
|
|
151
151
|
icon: 'i-lucide-circle-x',
|
|
152
|
-
text: 'text-
|
|
152
|
+
text: 'text-app-error-300',
|
|
153
153
|
},
|
|
154
154
|
fixing: {
|
|
155
155
|
label: t('gates.status.fixing'),
|
|
156
156
|
badge: 'warning',
|
|
157
157
|
icon: 'i-lucide-loader',
|
|
158
|
-
text: 'text-
|
|
158
|
+
text: 'text-app-warning-300',
|
|
159
159
|
},
|
|
160
160
|
failing: {
|
|
161
161
|
label: t('gates.status.failing'),
|
|
162
162
|
badge: 'error',
|
|
163
163
|
icon: 'i-lucide-circle-x',
|
|
164
|
-
text: 'text-
|
|
164
|
+
text: 'text-app-error-300',
|
|
165
165
|
},
|
|
166
166
|
pending: {
|
|
167
167
|
label: t('gates.status.pending'),
|
|
168
168
|
badge: 'neutral',
|
|
169
169
|
icon: 'i-lucide-clock',
|
|
170
|
-
text: 'text-
|
|
170
|
+
text: 'text-toned',
|
|
171
171
|
},
|
|
172
172
|
checking: {
|
|
173
173
|
label: t('gates.status.checking'),
|
|
174
174
|
badge: 'neutral',
|
|
175
175
|
icon: 'i-lucide-loader',
|
|
176
|
-
text: 'text-
|
|
176
|
+
text: 'text-toned',
|
|
177
177
|
},
|
|
178
178
|
}))
|
|
179
179
|
|
|
@@ -191,7 +191,7 @@ const conflictVerdict = computed(() => {
|
|
|
191
191
|
<ResultWindowShell
|
|
192
192
|
:open="open"
|
|
193
193
|
:icon="meta.icon"
|
|
194
|
-
icon-class="bg-
|
|
194
|
+
icon-class="bg-app-info-500/15 text-app-info-300"
|
|
195
195
|
:title="headerTitle"
|
|
196
196
|
:subtitle="subtitle"
|
|
197
197
|
:step-ref="{ instanceId, stepIndex }"
|
|
@@ -214,11 +214,11 @@ const conflictVerdict = computed(() => {
|
|
|
214
214
|
<div class="min-w-0 flex-1 overflow-y-auto px-5 py-4">
|
|
215
215
|
<div
|
|
216
216
|
v-if="!gate"
|
|
217
|
-
class="flex h-full flex-col items-center justify-center gap-2 text-center text-
|
|
217
|
+
class="flex h-full flex-col items-center justify-center gap-2 text-center text-muted"
|
|
218
218
|
>
|
|
219
219
|
<UIcon :name="meta.icon" class="h-8 w-8 opacity-40" />
|
|
220
220
|
<p class="text-sm">{{ t('gates.noActivity') }}</p>
|
|
221
|
-
<p class="max-w-sm text-[11px] text-
|
|
221
|
+
<p class="max-w-sm text-[11px] text-dimmed">
|
|
222
222
|
{{ t('gates.noActivityHint') }}
|
|
223
223
|
</p>
|
|
224
224
|
</div>
|
|
@@ -227,10 +227,13 @@ const conflictVerdict = computed(() => {
|
|
|
227
227
|
<!-- Passed -->
|
|
228
228
|
<div
|
|
229
229
|
v-if="status === 'passed'"
|
|
230
|
-
class="flex items-start gap-2 rounded-lg border border-
|
|
230
|
+
class="flex items-start gap-2 rounded-lg border border-app-success-500/30 bg-app-success-500/10 px-3 py-2.5"
|
|
231
231
|
>
|
|
232
|
-
<UIcon
|
|
233
|
-
|
|
232
|
+
<UIcon
|
|
233
|
+
name="i-lucide-circle-check"
|
|
234
|
+
class="mt-0.5 h-4 w-4 shrink-0 text-app-success-400"
|
|
235
|
+
/>
|
|
236
|
+
<p class="text-[13px] leading-relaxed text-app-success-200">
|
|
234
237
|
{{ step?.output || (isCi ? t('gates.passedCi') : t('gates.passedConflicts')) }}
|
|
235
238
|
</p>
|
|
236
239
|
</div>
|
|
@@ -238,10 +241,10 @@ const conflictVerdict = computed(() => {
|
|
|
238
241
|
<!-- Human review: approval progress, the feedback being fixed, freeform fix box -->
|
|
239
242
|
<template v-else-if="isHumanReview">
|
|
240
243
|
<div
|
|
241
|
-
class="flex items-center gap-2 rounded-md border border-
|
|
244
|
+
class="flex items-center gap-2 rounded-md border border-default bg-app-950/40 px-3 py-2"
|
|
242
245
|
>
|
|
243
|
-
<UIcon name="i-lucide-users" class="h-4 w-4 shrink-0 text-
|
|
244
|
-
<span class="text-[13px] text-
|
|
246
|
+
<UIcon name="i-lucide-users" class="h-4 w-4 shrink-0 text-app-secondary-300" />
|
|
247
|
+
<span class="text-[13px] text-default">
|
|
245
248
|
{{
|
|
246
249
|
t(
|
|
247
250
|
'gates.humanReview.approvals',
|
|
@@ -260,10 +263,10 @@ const conflictVerdict = computed(() => {
|
|
|
260
263
|
</div>
|
|
261
264
|
<div
|
|
262
265
|
v-if="gate.lastFailureSummary"
|
|
263
|
-
class="relative mt-2 rounded-md border border-
|
|
266
|
+
class="relative mt-2 rounded-md border border-default bg-app-950/40 px-3 py-2"
|
|
264
267
|
>
|
|
265
268
|
<CopyButton :text="gate.lastFailureSummary" class="absolute end-1 top-1" />
|
|
266
|
-
<p class="whitespace-pre-wrap pe-8 text-[12px] leading-relaxed text-
|
|
269
|
+
<p class="whitespace-pre-wrap pe-8 text-[12px] leading-relaxed text-toned">
|
|
267
270
|
{{ gate.lastFailureSummary }}
|
|
268
271
|
</p>
|
|
269
272
|
</div>
|
|
@@ -272,7 +275,7 @@ const conflictVerdict = computed(() => {
|
|
|
272
275
|
:href="prUrl"
|
|
273
276
|
target="_blank"
|
|
274
277
|
rel="noopener"
|
|
275
|
-
class="mt-2 inline-flex items-center gap-1 text-[12px] text-
|
|
278
|
+
class="mt-2 inline-flex items-center gap-1 text-[12px] text-app-info-300 hover:text-app-info-200 hover:underline"
|
|
276
279
|
>
|
|
277
280
|
{{ t('gates.humanReview.reviewPr') }}
|
|
278
281
|
<UIcon name="i-lucide-external-link" class="h-3 w-3" />
|
|
@@ -280,10 +283,10 @@ const conflictVerdict = computed(() => {
|
|
|
280
283
|
|
|
281
284
|
<!-- Freeform fix request: dispatch the fixer now with these instructions. -->
|
|
282
285
|
<section v-if="status !== 'gave-up'" class="mt-4">
|
|
283
|
-
<h3 class="mb-1.5 text-[11px] font-semibold uppercase tracking-wide text-
|
|
286
|
+
<h3 class="mb-1.5 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
|
|
284
287
|
{{ t('gates.humanReview.requestFixHeading') }}
|
|
285
288
|
</h3>
|
|
286
|
-
<p class="mb-2 text-[11px] leading-relaxed text-
|
|
289
|
+
<p class="mb-2 text-[11px] leading-relaxed text-dimmed">
|
|
287
290
|
{{ t('gates.humanReview.requestFixDescription') }}
|
|
288
291
|
</p>
|
|
289
292
|
<textarea
|
|
@@ -291,7 +294,7 @@ const conflictVerdict = computed(() => {
|
|
|
291
294
|
rows="3"
|
|
292
295
|
:disabled="fixBusy"
|
|
293
296
|
:placeholder="t('gates.humanReview.requestFixPlaceholder')"
|
|
294
|
-
class="w-full resize-y rounded-md border border-
|
|
297
|
+
class="w-full resize-y rounded-md border border-default bg-app-950/60 px-3 py-2 text-[13px] text-default placeholder:text-app-600 focus:border-app-secondary-500/60 focus:outline-none focus-visible:ring-2 focus-visible:ring-app-secondary-500/60"
|
|
295
298
|
/>
|
|
296
299
|
<div class="mt-2 flex justify-end">
|
|
297
300
|
<UButton
|
|
@@ -313,30 +316,30 @@ const conflictVerdict = computed(() => {
|
|
|
313
316
|
|
|
314
317
|
<!-- CI: failing checks -->
|
|
315
318
|
<template v-else-if="isCi">
|
|
316
|
-
<h3 class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-
|
|
319
|
+
<h3 class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
|
|
317
320
|
{{ t('gates.ci.failingChecks') }}
|
|
318
321
|
</h3>
|
|
319
322
|
<GateFailingCheckList v-if="failingChecks.length" :checks="failingChecks" />
|
|
320
|
-
<p v-else class="text-[13px] leading-relaxed text-
|
|
323
|
+
<p v-else class="text-[13px] leading-relaxed text-toned">
|
|
321
324
|
{{ gate.lastFailureSummary || t('gates.ci.failureFallback') }}
|
|
322
325
|
</p>
|
|
323
326
|
</template>
|
|
324
327
|
|
|
325
328
|
<!-- Doc quality: the deterministic structural findings the gate raised -->
|
|
326
329
|
<template v-else-if="isDocQuality">
|
|
327
|
-
<h3 class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-
|
|
330
|
+
<h3 class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
|
|
328
331
|
{{ t('gates.docQuality.findings') }}
|
|
329
332
|
</h3>
|
|
330
333
|
<div
|
|
331
334
|
v-if="gate.lastFailureSummary"
|
|
332
|
-
class="relative rounded-md border border-
|
|
335
|
+
class="relative rounded-md border border-default bg-app-950/40 px-3 py-2"
|
|
333
336
|
>
|
|
334
337
|
<CopyButton :text="gate.lastFailureSummary" class="absolute end-1 top-1" />
|
|
335
|
-
<p class="whitespace-pre-wrap pe-8 text-[12px] leading-relaxed text-
|
|
338
|
+
<p class="whitespace-pre-wrap pe-8 text-[12px] leading-relaxed text-toned">
|
|
336
339
|
{{ gate.lastFailureSummary }}
|
|
337
340
|
</p>
|
|
338
341
|
</div>
|
|
339
|
-
<p v-else class="text-[13px] leading-relaxed text-
|
|
342
|
+
<p v-else class="text-[13px] leading-relaxed text-toned">
|
|
340
343
|
{{ t('gates.docQuality.findingsFallback') }}
|
|
341
344
|
</p>
|
|
342
345
|
<a
|
|
@@ -344,7 +347,7 @@ const conflictVerdict = computed(() => {
|
|
|
344
347
|
:href="prUrl"
|
|
345
348
|
target="_blank"
|
|
346
349
|
rel="noopener"
|
|
347
|
-
class="mt-2 inline-flex items-center gap-1 text-[12px] text-
|
|
350
|
+
class="mt-2 inline-flex items-center gap-1 text-[12px] text-app-info-300 hover:text-app-info-200 hover:underline"
|
|
348
351
|
>
|
|
349
352
|
{{ t('gates.docQuality.viewPr') }}
|
|
350
353
|
<UIcon name="i-lucide-external-link" class="h-3 w-3" />
|
|
@@ -353,28 +356,28 @@ const conflictVerdict = computed(() => {
|
|
|
353
356
|
|
|
354
357
|
<!-- Conflicts: verdict + the resolver's account of what it left -->
|
|
355
358
|
<template v-else>
|
|
356
|
-
<h3 class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-
|
|
359
|
+
<h3 class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
|
|
357
360
|
{{ t('gates.conflicts.mergeability') }}
|
|
358
361
|
</h3>
|
|
359
362
|
<div
|
|
360
|
-
class="flex items-center gap-2 rounded-md border border-
|
|
363
|
+
class="flex items-center gap-2 rounded-md border border-default bg-app-950/40 px-3 py-2"
|
|
361
364
|
>
|
|
362
365
|
<UIcon
|
|
363
366
|
:name="STATUS_META[status].icon"
|
|
364
367
|
class="h-4 w-4 shrink-0"
|
|
365
368
|
:class="STATUS_META[status].text"
|
|
366
369
|
/>
|
|
367
|
-
<span class="text-[13px] text-
|
|
370
|
+
<span class="text-[13px] text-default">{{ conflictVerdict }}</span>
|
|
368
371
|
</div>
|
|
369
372
|
<!-- GitHub's API reports mergeability as a single bit (no file list), but the
|
|
370
373
|
conflict resolver discovers the conflicting files in the container and
|
|
371
374
|
reports them back — surface that account here. -->
|
|
372
375
|
<div
|
|
373
376
|
v-if="gate.lastFailureSummary"
|
|
374
|
-
class="relative mt-2 rounded-md border border-
|
|
377
|
+
class="relative mt-2 rounded-md border border-default bg-app-950/40 px-3 py-2"
|
|
375
378
|
>
|
|
376
379
|
<CopyButton :text="gate.lastFailureSummary" class="absolute end-1 top-1" />
|
|
377
|
-
<p class="whitespace-pre-wrap pe-8 text-[12px] leading-relaxed text-
|
|
380
|
+
<p class="whitespace-pre-wrap pe-8 text-[12px] leading-relaxed text-toned">
|
|
378
381
|
{{ gate.lastFailureSummary }}
|
|
379
382
|
</p>
|
|
380
383
|
</div>
|
|
@@ -383,7 +386,7 @@ const conflictVerdict = computed(() => {
|
|
|
383
386
|
:href="prUrl"
|
|
384
387
|
target="_blank"
|
|
385
388
|
rel="noopener"
|
|
386
|
-
class="mt-2 inline-flex items-center gap-1 text-[12px] text-
|
|
389
|
+
class="mt-2 inline-flex items-center gap-1 text-[12px] text-app-info-300 hover:text-app-info-200 hover:underline"
|
|
387
390
|
>
|
|
388
391
|
{{ t('gates.conflicts.viewPr') }}
|
|
389
392
|
<UIcon name="i-lucide-external-link" class="h-3 w-3" />
|
|
@@ -392,14 +395,14 @@ const conflictVerdict = computed(() => {
|
|
|
392
395
|
|
|
393
396
|
<!-- Attempt history (both gates): what each helper run did and how it ended. -->
|
|
394
397
|
<section v-if="attempts.length" class="mt-5">
|
|
395
|
-
<h3 class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-
|
|
398
|
+
<h3 class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
|
|
396
399
|
{{ t('gates.attemptsHeading', { helper: helperMeta.label }) }}
|
|
397
400
|
</h3>
|
|
398
401
|
<ol class="space-y-2">
|
|
399
402
|
<li
|
|
400
403
|
v-for="a in attempts"
|
|
401
404
|
:key="a.attempt"
|
|
402
|
-
class="rounded-md border border-
|
|
405
|
+
class="rounded-md border border-default bg-app-950/40 px-3 py-2"
|
|
403
406
|
>
|
|
404
407
|
<AttemptEntryHeader
|
|
405
408
|
:label="t('gates.attempt', { number: a.attempt })"
|
|
@@ -415,7 +418,7 @@ const conflictVerdict = computed(() => {
|
|
|
415
418
|
v-if="a.instructions || (a.failingChecks && a.failingChecks.length)"
|
|
416
419
|
class="mt-1.5"
|
|
417
420
|
>
|
|
418
|
-
<p class="text-[11px] text-
|
|
421
|
+
<p class="text-[11px] text-dimmed">
|
|
419
422
|
{{ t('gates.attemptInstructions', { helper: helperMeta.label }) }}
|
|
420
423
|
</p>
|
|
421
424
|
<GateFailingCheckList
|
|
@@ -426,17 +429,17 @@ const conflictVerdict = computed(() => {
|
|
|
426
429
|
/>
|
|
427
430
|
<p
|
|
428
431
|
v-else-if="a.instructions"
|
|
429
|
-
class="mt-1 whitespace-pre-wrap text-[12px] leading-relaxed text-
|
|
432
|
+
class="mt-1 whitespace-pre-wrap text-[12px] leading-relaxed text-toned"
|
|
430
433
|
>
|
|
431
434
|
{{ a.instructions }}
|
|
432
435
|
</p>
|
|
433
436
|
</div>
|
|
434
437
|
<!-- The helper's own report of what it did / what remains. -->
|
|
435
438
|
<template v-if="a.summary">
|
|
436
|
-
<p class="mt-1.5 text-[11px] text-
|
|
439
|
+
<p class="mt-1.5 text-[11px] text-dimmed">
|
|
437
440
|
{{ t('gates.attemptReport', { helper: helperMeta.label }) }}
|
|
438
441
|
</p>
|
|
439
|
-
<p class="mt-1 whitespace-pre-wrap text-[12px] leading-relaxed text-
|
|
442
|
+
<p class="mt-1 whitespace-pre-wrap text-[12px] leading-relaxed text-muted">
|
|
440
443
|
{{ a.summary }}
|
|
441
444
|
</p>
|
|
442
445
|
</template>
|
|
@@ -448,10 +451,10 @@ const conflictVerdict = computed(() => {
|
|
|
448
451
|
|
|
449
452
|
<!-- Sidebar: gate state -->
|
|
450
453
|
<aside
|
|
451
|
-
class="hidden w-60 shrink-0 flex-col gap-4 border-s border-
|
|
454
|
+
class="hidden w-60 shrink-0 flex-col gap-4 border-s border-default bg-default/50 px-4 py-4 lg:flex"
|
|
452
455
|
>
|
|
453
456
|
<div v-if="gate">
|
|
454
|
-
<h4 class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-
|
|
457
|
+
<h4 class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
|
|
455
458
|
{{ t('gates.sidebar.state') }}
|
|
456
459
|
</h4>
|
|
457
460
|
<div class="flex items-center gap-2 text-[13px]">
|
|
@@ -465,10 +468,10 @@ const conflictVerdict = computed(() => {
|
|
|
465
468
|
</div>
|
|
466
469
|
|
|
467
470
|
<div v-if="gate">
|
|
468
|
-
<h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-
|
|
471
|
+
<h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
|
|
469
472
|
{{ helperMeta.label }}
|
|
470
473
|
</h4>
|
|
471
|
-
<p class="text-[12px] text-
|
|
474
|
+
<p class="text-[12px] text-toned">
|
|
472
475
|
<!-- The human-review gate's budget is effectively unbounded (it waits for a human
|
|
473
476
|
indefinitely), so render a plain round count rather than "0/9007199254740991". -->
|
|
474
477
|
<template v-if="isHumanReview">
|
|
@@ -493,10 +496,10 @@ const conflictVerdict = computed(() => {
|
|
|
493
496
|
</div>
|
|
494
497
|
|
|
495
498
|
<div v-if="shortSha">
|
|
496
|
-
<h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-
|
|
499
|
+
<h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
|
|
497
500
|
{{ t('gates.sidebar.gatedCommit') }}
|
|
498
501
|
</h4>
|
|
499
|
-
<p class="font-mono text-[12px] text-
|
|
502
|
+
<p class="font-mono text-[12px] text-toned">{{ shortSha }}</p>
|
|
500
503
|
</div>
|
|
501
504
|
|
|
502
505
|
<!-- Shared run metadata + embedded observability (model, run id, timing,
|
|
@@ -511,7 +514,7 @@ const conflictVerdict = computed(() => {
|
|
|
511
514
|
:failure-at="instance?.failure?.occurredAt"
|
|
512
515
|
/>
|
|
513
516
|
|
|
514
|
-
<p class="mt-auto text-[10px] leading-relaxed text-
|
|
517
|
+
<p class="mt-auto text-[10px] leading-relaxed text-app-600">
|
|
515
518
|
{{ t('gates.sidebar.footer', { helper: helperMeta.label }) }}
|
|
516
519
|
</p>
|
|
517
520
|
</aside>
|
|
@@ -442,7 +442,7 @@ function done() {
|
|
|
442
442
|
<UModal v-model:open="open" :title="t('github.addService.title')" :ui="{ content: 'max-w-xl' }">
|
|
443
443
|
<template #body>
|
|
444
444
|
<div class="space-y-6">
|
|
445
|
-
<p class="text-sm text-
|
|
445
|
+
<p class="text-sm text-muted">
|
|
446
446
|
{{
|
|
447
447
|
introProvider
|
|
448
448
|
? t('vcs.addService.intro', { provider: VCS_PROVIDER_LABELS[introProvider] })
|
|
@@ -454,11 +454,11 @@ function done() {
|
|
|
454
454
|
offer whichever connect methods the deployment serves (never just the App) -->
|
|
455
455
|
<div
|
|
456
456
|
v-if="needsConnection"
|
|
457
|
-
class="space-y-3 rounded-md border border-
|
|
457
|
+
class="space-y-3 rounded-md border border-app-warning-500/30 bg-app-warning-500/5 p-3"
|
|
458
458
|
>
|
|
459
459
|
<div class="flex items-start gap-2">
|
|
460
|
-
<UIcon name="i-lucide-plug-zap" class="mt-0.5 h-4 w-4 shrink-0 text-
|
|
461
|
-
<p class="text-sm text-
|
|
460
|
+
<UIcon name="i-lucide-plug-zap" class="mt-0.5 h-4 w-4 shrink-0 text-app-warning-400" />
|
|
461
|
+
<p class="text-sm text-app-warning-200/90">
|
|
462
462
|
{{ t('vcs.addService.connectFirst') }}
|
|
463
463
|
</p>
|
|
464
464
|
</div>
|
|
@@ -531,9 +531,9 @@ function done() {
|
|
|
531
531
|
|
|
532
532
|
<div
|
|
533
533
|
v-if="isMonorepo"
|
|
534
|
-
class="space-y-3 rounded-md border border-
|
|
534
|
+
class="space-y-3 rounded-md border border-muted/60 bg-default/40 p-3"
|
|
535
535
|
>
|
|
536
|
-
<p class="text-xs text-
|
|
536
|
+
<p class="text-xs text-muted">
|
|
537
537
|
{{ t('github.addService.monorepoBrowseHint') }}
|
|
538
538
|
</p>
|
|
539
539
|
<RepoTreeBrowser
|
|
@@ -547,20 +547,20 @@ function done() {
|
|
|
547
547
|
|
|
548
548
|
<!-- the selection cart + the add action sit right beside the tree, so the
|
|
549
549
|
picked services and the button that adds them are never scrolled apart -->
|
|
550
|
-
<div class="space-y-2 rounded-md border border-
|
|
551
|
-
<p class="text-[11px] font-semibold uppercase tracking-wide text-
|
|
550
|
+
<div class="space-y-2 rounded-md border border-default bg-app-950/40 p-2.5">
|
|
551
|
+
<p class="text-[11px] font-semibold uppercase tracking-wide text-muted">
|
|
552
552
|
{{ t('github.addService.selectedServices') }}
|
|
553
553
|
</p>
|
|
554
554
|
<div v-if="selectedDirectories.length" class="flex flex-wrap gap-1.5">
|
|
555
555
|
<span
|
|
556
556
|
v-for="dir in selectedDirectories"
|
|
557
557
|
:key="dir"
|
|
558
|
-
class="inline-flex items-center gap-1 rounded bg-
|
|
558
|
+
class="inline-flex items-center gap-1 rounded bg-elevated px-2 py-0.5 text-xs text-default"
|
|
559
559
|
>
|
|
560
|
-
<code class="text-
|
|
560
|
+
<code class="text-default">{{ dir }}</code>
|
|
561
561
|
<button
|
|
562
562
|
type="button"
|
|
563
|
-
class="text-
|
|
563
|
+
class="text-muted hover:text-app-100"
|
|
564
564
|
:aria-label="t('github.addService.removeService', { directory: dir })"
|
|
565
565
|
@click="removeSelected(dir)"
|
|
566
566
|
>
|
|
@@ -568,7 +568,7 @@ function done() {
|
|
|
568
568
|
</button>
|
|
569
569
|
</span>
|
|
570
570
|
</div>
|
|
571
|
-
<p v-else class="text-xs text-
|
|
571
|
+
<p v-else class="text-xs text-dimmed">
|
|
572
572
|
{{ t('github.addService.noServicesSelected') }}
|
|
573
573
|
</p>
|
|
574
574
|
|
|
@@ -617,10 +617,10 @@ function done() {
|
|
|
617
617
|
<!-- just-added service: configure it with the same controls as the inspector -->
|
|
618
618
|
<div
|
|
619
619
|
v-if="configuredBlock"
|
|
620
|
-
class="space-y-4 rounded-md border border-
|
|
620
|
+
class="space-y-4 rounded-md border border-app-success-900/50 bg-app-success-950/20 p-3"
|
|
621
621
|
>
|
|
622
622
|
<div
|
|
623
|
-
class="flex items-center gap-1.5 text-[11px] font-semibold uppercase tracking-wide text-
|
|
623
|
+
class="flex items-center gap-1.5 text-[11px] font-semibold uppercase tracking-wide text-app-success-400"
|
|
624
624
|
>
|
|
625
625
|
<UIcon name="i-lucide-check" class="h-3.5 w-3.5" />
|
|
626
626
|
{{ t('github.addService.addedConfigure', { title: configuredBlock.title }) }}
|
|
@@ -48,9 +48,9 @@ const exposedCount = computed(
|
|
|
48
48
|
)
|
|
49
49
|
|
|
50
50
|
const STATE_STYLE: Record<BranchProtectionStateValue, string> = {
|
|
51
|
-
unprotected: 'text-
|
|
52
|
-
unknown: 'text-
|
|
53
|
-
protected: 'text-
|
|
51
|
+
unprotected: 'text-app-error-300',
|
|
52
|
+
unknown: 'text-app-warning-300',
|
|
53
|
+
protected: 'text-app-success-400',
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
// Exhaustive Records of LITERAL keys, not an assembled `\`…\${state}\`` lookup: the typed-key
|
|
@@ -115,8 +115,8 @@ async function check() {
|
|
|
115
115
|
|
|
116
116
|
<template>
|
|
117
117
|
<section class="space-y-2" data-testid="branch-protection-preflight">
|
|
118
|
-
<h3 class="text-sm font-semibold text-
|
|
119
|
-
<p class="text-[11px] text-
|
|
118
|
+
<h3 class="text-sm font-semibold text-default">{{ t('vcs.branchProtection.heading') }}</h3>
|
|
119
|
+
<p class="text-[11px] text-muted">{{ t('vcs.branchProtection.body') }}</p>
|
|
120
120
|
|
|
121
121
|
<UButton
|
|
122
122
|
color="neutral"
|
|
@@ -131,7 +131,7 @@ async function check() {
|
|
|
131
131
|
</UButton>
|
|
132
132
|
|
|
133
133
|
<div v-if="failure" class="space-y-1" data-testid="branch-protection-failure">
|
|
134
|
-
<p class="text-xs text-
|
|
134
|
+
<p class="text-xs text-app-error-400">{{ t(failure.descriptionKey) }}</p>
|
|
135
135
|
<!-- The raw prose stays reachable, never dropped: the backend's messages here name the
|
|
136
136
|
operator remedy, and the request id is the join to the one server log line that
|
|
137
137
|
explains it. One click away, so it is never what a user is shown FIRST. -->
|
|
@@ -146,7 +146,7 @@ async function check() {
|
|
|
146
146
|
>
|
|
147
147
|
{{ t('errors.generic.showDetail') }}
|
|
148
148
|
</UButton>
|
|
149
|
-
<p v-if="showFailureDetail" class="font-mono text-[10px] break-all text-
|
|
149
|
+
<p v-if="showFailureDetail" class="font-mono text-[10px] break-all text-dimmed">
|
|
150
150
|
{{ failure.detail }}
|
|
151
151
|
</p>
|
|
152
152
|
</div>
|
|
@@ -155,7 +155,7 @@ async function check() {
|
|
|
155
155
|
would otherwise read exactly like a clean bill of health. -->
|
|
156
156
|
<p
|
|
157
157
|
v-else-if="report && report.capability === 'unavailable'"
|
|
158
|
-
class="text-xs text-
|
|
158
|
+
class="text-xs text-app-warning-300"
|
|
159
159
|
data-testid="branch-protection-unavailable"
|
|
160
160
|
>
|
|
161
161
|
{{ t('vcs.branchProtection.unavailable') }}
|
|
@@ -164,7 +164,7 @@ async function check() {
|
|
|
164
164
|
<template v-else-if="report">
|
|
165
165
|
<p
|
|
166
166
|
class="text-xs"
|
|
167
|
-
:class="exposedCount ? 'text-
|
|
167
|
+
:class="exposedCount ? 'text-app-error-300' : 'text-app-success-400'"
|
|
168
168
|
data-testid="branch-protection-summary"
|
|
169
169
|
>
|
|
170
170
|
{{
|
|
@@ -178,15 +178,15 @@ async function check() {
|
|
|
178
178
|
<li
|
|
179
179
|
v-for="row in rows"
|
|
180
180
|
:key="row.repoGithubId"
|
|
181
|
-
class="rounded-md border border-
|
|
181
|
+
class="rounded-md border border-default bg-default/40 px-2 py-1.5"
|
|
182
182
|
>
|
|
183
183
|
<div class="flex items-baseline justify-between gap-2">
|
|
184
|
-
<span class="font-mono text-xs text-
|
|
184
|
+
<span class="font-mono text-xs text-toned">{{ row.owner }}/{{ row.name }}</span>
|
|
185
185
|
<span class="text-[11px]" :class="STATE_STYLE[row.protection.state]">
|
|
186
186
|
{{ STATE_LABEL[row.protection.state]() }}
|
|
187
187
|
</span>
|
|
188
188
|
</div>
|
|
189
|
-
<p class="text-[10px] text-
|
|
189
|
+
<p class="text-[10px] text-dimmed">
|
|
190
190
|
{{ row.defaultBranch }}<span v-if="detailLine(row)"> — {{ detailLine(row) }}</span>
|
|
191
191
|
</p>
|
|
192
192
|
</li>
|
|
@@ -194,7 +194,7 @@ async function check() {
|
|
|
194
194
|
|
|
195
195
|
<!-- A cap that truncated silently would read as "these are all your repositories", which
|
|
196
196
|
on a security report is the same failure as calling an unprobed repo protected. -->
|
|
197
|
-
<p v-if="report.omittedRepos > 0" class="text-[11px] text-
|
|
197
|
+
<p v-if="report.omittedRepos > 0" class="text-[11px] text-app-warning-300">
|
|
198
198
|
{{ t('vcs.branchProtection.omitted', { count: report.omittedRepos }, report.omittedRepos) }}
|
|
199
199
|
</p>
|
|
200
200
|
</template>
|
|
@@ -73,7 +73,7 @@ async function connectManually() {
|
|
|
73
73
|
<!-- discovered installations: pick one the App is already on -->
|
|
74
74
|
<section class="space-y-2">
|
|
75
75
|
<div class="flex items-center justify-between">
|
|
76
|
-
<span class="text-xs font-medium uppercase tracking-wide text-
|
|
76
|
+
<span class="text-xs font-medium uppercase tracking-wide text-dimmed">
|
|
77
77
|
{{ t('github.connect.yourInstallations') }}
|
|
78
78
|
</span>
|
|
79
79
|
<UButton
|
|
@@ -90,7 +90,7 @@ async function connectManually() {
|
|
|
90
90
|
|
|
91
91
|
<div
|
|
92
92
|
v-if="github.loadingInstallations && !github.installations.length"
|
|
93
|
-
class="flex items-center gap-2 py-3 text-sm text-
|
|
93
|
+
class="flex items-center gap-2 py-3 text-sm text-muted"
|
|
94
94
|
>
|
|
95
95
|
<UIcon name="i-lucide-loader" class="h-4 w-4 animate-spin" />
|
|
96
96
|
{{ t('github.connect.lookingForInstallations') }}
|
|
@@ -98,7 +98,7 @@ async function connectManually() {
|
|
|
98
98
|
|
|
99
99
|
<p
|
|
100
100
|
v-else-if="!github.installations.length"
|
|
101
|
-
class="rounded-md border border-dashed border-
|
|
101
|
+
class="rounded-md border border-dashed border-default px-3 py-3 text-sm text-muted"
|
|
102
102
|
>
|
|
103
103
|
{{ t('github.connect.noInstallations') }}
|
|
104
104
|
</p>
|
|
@@ -106,7 +106,7 @@ async function connectManually() {
|
|
|
106
106
|
<div
|
|
107
107
|
v-for="inst in github.installations"
|
|
108
108
|
:key="inst.installationId"
|
|
109
|
-
class="flex items-center justify-between gap-2 rounded-md border border-
|
|
109
|
+
class="flex items-center justify-between gap-2 rounded-md border border-default bg-default/60 px-3 py-2"
|
|
110
110
|
>
|
|
111
111
|
<div class="flex min-w-0 items-center gap-2">
|
|
112
112
|
<UAvatar
|
|
@@ -115,10 +115,10 @@ async function connectManually() {
|
|
|
115
115
|
size="2xs"
|
|
116
116
|
:alt="inst.accountLogin"
|
|
117
117
|
/>
|
|
118
|
-
<UIcon v-else name="i-lucide-github" class="h-4 w-4 text-
|
|
118
|
+
<UIcon v-else name="i-lucide-github" class="h-4 w-4 text-muted" />
|
|
119
119
|
<div class="min-w-0">
|
|
120
|
-
<div class="truncate text-sm text-
|
|
121
|
-
<div class="text-[11px] text-
|
|
120
|
+
<div class="truncate text-sm text-default">{{ inst.accountLogin }}</div>
|
|
121
|
+
<div class="text-[11px] text-dimmed">
|
|
122
122
|
{{
|
|
123
123
|
t('github.connect.installationMeta', {
|
|
124
124
|
targetType: inst.targetType,
|
|
@@ -24,15 +24,15 @@ const title = computed(() =>
|
|
|
24
24
|
|
|
25
25
|
<template>
|
|
26
26
|
<div
|
|
27
|
-
class="flex h-full w-full items-center justify-center overflow-y-auto bg-
|
|
27
|
+
class="flex h-full w-full items-center justify-center overflow-y-auto bg-app-950 text-app-100"
|
|
28
28
|
>
|
|
29
29
|
<div
|
|
30
|
-
class="my-8 w-full max-w-md rounded-xl border border-
|
|
30
|
+
class="my-8 w-full max-w-md rounded-xl border border-default bg-default/80 p-8 backdrop-blur"
|
|
31
31
|
>
|
|
32
32
|
<div class="mb-5 text-center">
|
|
33
|
-
<UIcon :name="icon" class="mx-auto mb-3 h-10 w-10 text-
|
|
34
|
-
<h1 class="mb-1 text-lg font-semibold text-
|
|
35
|
-
<p class="text-sm text-
|
|
33
|
+
<UIcon :name="icon" class="mx-auto mb-3 h-10 w-10 text-primary" />
|
|
34
|
+
<h1 class="mb-1 text-lg font-semibold text-highlighted">{{ title }}</h1>
|
|
35
|
+
<p class="text-sm text-muted">
|
|
36
36
|
{{ t('vcs.onboarding.intro') }}
|
|
37
37
|
</p>
|
|
38
38
|
</div>
|
|
@@ -41,10 +41,10 @@ const title = computed(() =>
|
|
|
41
41
|
|
|
42
42
|
<p
|
|
43
43
|
v-if="auth.required && auth.user"
|
|
44
|
-
class="mt-6 border-t border-
|
|
44
|
+
class="mt-6 border-t border-default pt-4 text-center text-xs text-dimmed"
|
|
45
45
|
>
|
|
46
46
|
{{ t('github.onboarding.signedInAs', { login: auth.user.login }) }} ·
|
|
47
|
-
<button class="text-
|
|
47
|
+
<button class="text-toned underline-offset-2 hover:underline" @click="auth.logout()">
|
|
48
48
|
{{ t('github.onboarding.signOut') }}
|
|
49
49
|
</button>
|
|
50
50
|
</p>
|