@cat-factory/app 0.308.0 → 0.310.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 +32 -2
- package/app/assets/css/main.css +22 -0
- package/app/assets/css/prose.css +4 -4
- package/app/assets/css/type.css +24 -0
- package/app/components/assistant/AssistantModal.vue +8 -6
- package/app/components/auth/BackendMisconfiguredScreen.vue +4 -3
- package/app/components/auth/LoginScreen.vue +40 -26
- package/app/components/auth/ResetPasswordScreen.vue +9 -4
- package/app/components/auth/UserMenu.vue +5 -4
- package/app/components/binaryCandidates/BinaryCandidatesWindow.vue +48 -37
- package/app/components/binaryOutput/BinaryOutputReport.vue +10 -14
- package/app/components/binaryOutput/StoredAssetView.vue +13 -11
- package/app/components/board/AddTaskModal.vue +30 -27
- package/app/components/board/AgentFailureCard.vue +21 -18
- package/app/components/board/AgentFailureHistory.vue +18 -9
- package/app/components/board/CreateInitiativeModal.vue +7 -6
- package/app/components/board/FailureDetail.vue +22 -12
- package/app/components/board/FailureHistoryList.vue +5 -5
- package/app/components/board/RecurringPipelineModal.vue +12 -11
- package/app/components/board/ReviewFrictionDialog.vue +8 -6
- package/app/components/board/StepExecutionHistory.vue +8 -8
- package/app/components/board/nodes/AgentChip.vue +1 -1
- package/app/components/board/nodes/BlockNode.vue +25 -24
- package/app/components/board/nodes/DecisionBadge.vue +4 -3
- package/app/components/board/nodes/EpicNode.vue +4 -4
- package/app/components/board/nodes/FrameSwimlanes.vue +8 -10
- package/app/components/board/nodes/InitiativeCard.vue +4 -4
- package/app/components/board/nodes/LaneGroup.vue +3 -5
- package/app/components/board/nodes/TaskCard.vue +20 -15
- package/app/components/board/nodes/TaskLane.vue +3 -3
- package/app/components/board/nodes/TaskPipelineMini.vue +21 -18
- package/app/components/bootstrap/AdoptionReviewModal.vue +36 -26
- package/app/components/bootstrap/BootstrapModal.vue +14 -13
- package/app/components/bootstrap/BootstrapRunSteps.vue +1 -1
- package/app/components/brainstorm/BrainstormWindow.vue +13 -10
- package/app/components/bugFishing/BugFishingWindow.vue +81 -58
- package/app/components/clarity/ClarityReviewWindow.vue +13 -10
- package/app/components/common/AsyncViewError.vue +1 -1
- package/app/components/common/ClarificationItem.vue +6 -6
- package/app/components/common/CopyButton.vue +12 -11
- package/app/components/common/DescriptorFields.vue +1 -1
- package/app/components/common/EmptyState.vue +1 -1
- package/app/components/common/IconButton.vue +34 -9
- package/app/components/common/InterviewGateNotice.vue +4 -4
- package/app/components/common/MarkdownProse.vue +8 -2
- package/app/components/common/SectionLabel.vue +38 -0
- package/app/components/consensus/ConsensusSessionWindow.vue +10 -9
- package/app/components/context/ContextAttachmentFields.vue +32 -20
- package/app/components/docs/DocInterviewWindow.vue +10 -9
- package/app/components/documents/ContextDocumentPicker.vue +22 -21
- package/app/components/documents/DocumentImportModal.vue +7 -5
- package/app/components/documents/DocumentOriginLink.vue +12 -9
- package/app/components/documents/DocumentSourceConnectModal.vue +2 -2
- package/app/components/documents/DocumentSyncState.vue +4 -4
- package/app/components/documents/DocumentTemplatesModal.vue +5 -4
- package/app/components/documents/RepoContextDocPicker.vue +7 -9
- package/app/components/documents/StartFromDesignModal.vue +4 -4
- package/app/components/documents/TaskContextDocs.vue +1 -1
- package/app/components/environments/EnvSetupStepper.vue +3 -3
- package/app/components/environments/EnvironmentStatusPanel.vue +15 -13
- package/app/components/environments/steps/EnvPreflightStep.vue +8 -8
- package/app/components/environments/steps/EnvReviewStep.vue +23 -22
- package/app/components/environments/steps/EnvSaveStep.vue +5 -5
- package/app/components/focus/BlockFocusView.vue +11 -10
- package/app/components/followUp/FollowUpWindow.vue +18 -15
- package/app/components/forkDecision/ForkDecisionWindow.vue +85 -97
- package/app/components/foundational/FoundationalContractSummary.vue +2 -2
- package/app/components/foundational/FoundationalServiceCatalogList.vue +6 -5
- package/app/components/foundational/FoundationalServiceRegistry.vue +10 -9
- package/app/components/foundational/FoundationalServiceSources.vue +7 -6
- package/app/components/foundational/FoundationalSuppressions.vue +2 -2
- package/app/components/fragments/FragmentLibraryManager.vue +8 -7
- package/app/components/fragments/FragmentSelector.vue +22 -20
- package/app/components/gates/GateFailingCheckList.vue +7 -6
- package/app/components/gates/GateResultView.vue +55 -49
- package/app/components/github/AddServiceFromRepoModal.vue +16 -11
- package/app/components/github/BranchProtectionPreflight.vue +5 -5
- package/app/components/github/GitHubConnect.vue +5 -3
- package/app/components/github/GitHubOnboarding.vue +7 -2
- package/app/components/github/GitHubPanel.vue +23 -19
- package/app/components/github/RepoTreeBrowser.vue +16 -13
- package/app/components/humanTest/HumanTestWindow.vue +29 -24
- package/app/components/initiative/InitiativePlanNotice.vue +3 -3
- package/app/components/initiative/InitiativePlanReview.vue +46 -38
- package/app/components/initiative/InitiativePlanningWindow.vue +5 -5
- package/app/components/initiative/InitiativeTrackerWindow.vue +213 -165
- package/app/components/judge/JudgeResultView.vue +28 -27
- package/app/components/kaizen/KaizenPanel.vue +70 -56
- package/app/components/kaizen/KaizenStepStatus.vue +7 -6
- package/app/components/layout/AccountAuditLog.vue +1 -1
- package/app/components/layout/AccountDeploymentSettings.vue +10 -10
- 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 +7 -7
- package/app/components/layout/AccountPlatformAlertSettings.vue +8 -8
- package/app/components/layout/AccountRiskPolicySettings.vue +2 -2
- package/app/components/layout/AccountRunCredentialSettings.vue +3 -3
- package/app/components/layout/AccountSkillSettings.vue +1 -1
- package/app/components/layout/AccountTeamSettings.vue +13 -9
- package/app/components/layout/AiProvidersBanner.vue +1 -1
- package/app/components/layout/AppearanceSwitcher.vue +5 -4
- package/app/components/layout/BoardSwitcher.vue +13 -10
- package/app/components/layout/BoardToolbar.vue +10 -5
- package/app/components/layout/CommandBar.vue +8 -5
- package/app/components/layout/DefaultTestEnvBanner.vue +6 -5
- package/app/components/layout/IntegrationsHub.vue +12 -9
- package/app/components/layout/LanguageSwitcher.vue +5 -4
- package/app/components/layout/ModelProvidersHub.vue +10 -7
- package/app/components/layout/NotificationsInbox.vue +47 -36
- package/app/components/layout/PersonalSetupModal.vue +9 -6
- package/app/components/layout/RolePrompt.vue +5 -4
- package/app/components/layout/SideBar.vue +7 -8
- package/app/components/layout/SpendWarningBanner.vue +3 -3
- package/app/components/layout/TranslationWarningBanner.vue +5 -4
- package/app/components/layout/UiModeSwitcher.vue +15 -12
- package/app/components/layout/UiRoleSwitcher.vue +10 -8
- package/app/components/layout/WorkspaceMembersSettings.vue +2 -2
- package/app/components/media/ArtifactLightbox.vue +74 -44
- package/app/components/media/ImageCompare.vue +80 -85
- package/app/components/merge/MergeEffortChips.vue +4 -6
- package/app/components/notifications/NotificationSettingsPanel.vue +6 -5
- package/app/components/observability/OutcomeFilterChips.vue +6 -5
- package/app/components/observability/RunFailureSummary.vue +22 -23
- package/app/components/observability/StepMetricsBar.vue +9 -8
- package/app/components/observability/StepModelActivity.vue +8 -5
- package/app/components/observability/ToolCallList.vue +19 -20
- package/app/components/outcome/OutcomeSummaryWindow.vue +48 -46
- package/app/components/palettes/AgentPalette.vue +21 -15
- package/app/components/palettes/AgentTierSelect.vue +1 -1
- package/app/components/palettes/PipelinePurposeSelect.vue +1 -1
- package/app/components/panels/AgentStepDetail.vue +57 -49
- package/app/components/panels/AttemptEntryHeader.vue +2 -2
- package/app/components/panels/DecisionModal.vue +1 -1
- package/app/components/panels/GenericStructuredResultView.vue +6 -5
- package/app/components/panels/InspectorPanel.vue +15 -13
- package/app/components/panels/MergerResultView.vue +10 -9
- package/app/components/panels/ObservabilityPanel.vue +211 -186
- package/app/components/panels/OperatorDashboardPanel.vue +124 -115
- package/app/components/panels/ReportsPanel.vue +87 -83
- package/app/components/panels/ReportsSpendBreakdown.vue +2 -2
- package/app/components/panels/ResultWindowShell.vue +152 -137
- package/app/components/panels/RunDetailLoadState.vue +1 -1
- package/app/components/panels/StepContainerStatus.vue +17 -16
- package/app/components/panels/StepDelegatedStatus.vue +24 -21
- package/app/components/panels/StepEffortReport.vue +12 -17
- package/app/components/panels/StepFragmentAdherence.vue +9 -10
- package/app/components/panels/StepMetadataCard.vue +41 -43
- package/app/components/panels/StepReproductionReport.vue +18 -20
- package/app/components/panels/StepRestartControl.vue +3 -2
- package/app/components/panels/StepRunMeta.vue +27 -26
- package/app/components/panels/StepTestReport.vue +16 -15
- package/app/components/panels/StepToolServers.vue +7 -8
- package/app/components/panels/StepValidationReport.vue +5 -5
- package/app/components/panels/inspector/ContainerSummary.vue +4 -4
- package/app/components/panels/inspector/DocReferenceRepos.vue +5 -4
- package/app/components/panels/inspector/EnvProbeReport.vue +16 -13
- package/app/components/panels/inspector/EpicChildren.vue +12 -10
- package/app/components/panels/inspector/FrontendBindingsResolved.vue +5 -4
- package/app/components/panels/inspector/FrontendConfig.vue +29 -36
- package/app/components/panels/inspector/InitiativeInspector.vue +3 -3
- package/app/components/panels/inspector/InspectorSection.vue +25 -17
- package/app/components/panels/inspector/RecurringScheduleSettings.vue +9 -8
- package/app/components/panels/inspector/ServiceConnections.vue +5 -4
- package/app/components/panels/inspector/ServiceReleaseHealthConfig.vue +2 -2
- package/app/components/panels/inspector/ServiceSelfTests.vue +9 -13
- package/app/components/panels/inspector/ServiceTestConfig.vue +46 -49
- package/app/components/panels/inspector/ServiceTestSecrets.vue +3 -3
- package/app/components/panels/inspector/ServiceTestingContext.vue +2 -2
- package/app/components/panels/inspector/ServiceValidationConfig.vue +2 -2
- package/app/components/panels/inspector/TaskAgentConfig.vue +2 -2
- package/app/components/panels/inspector/TaskAprioriBranches.vue +6 -5
- package/app/components/panels/inspector/TaskDependencies.vue +1 -1
- package/app/components/panels/inspector/TaskEstimateBadge.vue +3 -7
- package/app/components/panels/inspector/TaskExecution.vue +18 -16
- package/app/components/panels/inspector/TaskRunSettings.vue +45 -44
- package/app/components/panels/inspector/TaskStructure.vue +5 -4
- package/app/components/pipeline/AgentPromptEditor.vue +15 -14
- package/app/components/pipeline/BinaryOutputStepPicker.vue +42 -52
- package/app/components/pipeline/EstimateThresholdFields.vue +14 -11
- package/app/components/pipeline/GateConfigFields.vue +19 -23
- package/app/components/pipeline/IterationCapPrompt.vue +1 -1
- package/app/components/pipeline/PipelineBuilder.vue +113 -99
- package/app/components/pipeline/PipelineHealthModal.vue +7 -7
- package/app/components/pipeline/PipelinePicker.vue +11 -9
- package/app/components/pipeline/PipelinePreview.vue +6 -7
- package/app/components/pipeline/PipelineProgress.vue +49 -45
- package/app/components/prReview/PrReviewWindow.vue +87 -65
- package/app/components/providers/AiPresetMismatchDialog.vue +4 -3
- package/app/components/providers/AiProviderOnboardingModal.vue +2 -2
- package/app/components/providers/ApiKeysSection.vue +11 -9
- package/app/components/providers/PersonalSubscriptionSection.vue +4 -3
- package/app/components/providers/VendorCredentialsModal.vue +5 -4
- package/app/components/provisioning/ProvisioningLogsDrawer.vue +10 -9
- package/app/components/ralph/RalphLoopResultView.vue +29 -29
- package/app/components/requirements/RequirementsReviewWindow.vue +22 -17
- package/app/components/riskPolicy/RiskPolicyPicker.vue +13 -11
- package/app/components/riskPolicy/RiskPolicyPreview.vue +16 -15
- package/app/components/sandbox/SandboxPanel.vue +93 -73
- package/app/components/settings/ApiTokensPanel.vue +1 -1
- package/app/components/settings/BudgetSettings.vue +18 -17
- package/app/components/settings/CapabilityCredentialsPanel.vue +5 -5
- package/app/components/settings/CloudflareHandlerSection.vue +44 -41
- package/app/components/settings/ComposeEnvironmentSetupSection.vue +14 -12
- package/app/components/settings/ConnectionTestVerdict.vue +1 -1
- package/app/components/settings/ConsensusGroupsSection.vue +58 -47
- package/app/components/settings/CustomManifestTypeEditor.vue +8 -7
- package/app/components/settings/DefaultProvisionTypeSection.vue +5 -5
- package/app/components/settings/InfraHandlersConfigurator.vue +26 -24
- package/app/components/settings/InfrastructureBackendPicker.vue +18 -18
- package/app/components/settings/IssueTrackerPanel.vue +30 -21
- package/app/components/settings/KubernetesEngineForm.vue +9 -8
- package/app/components/settings/KubernetesEnvironmentForm.vue +4 -3
- package/app/components/settings/LocalContainerPoolSettings.vue +2 -2
- package/app/components/settings/LocalModelEndpointsPanel.vue +13 -11
- package/app/components/settings/MergeClassRulesEditor.vue +6 -5
- package/app/components/settings/MergeRolePolicyEditor.vue +13 -12
- package/app/components/settings/ModelConfigurationPanel.vue +17 -19
- package/app/components/settings/ModelPresetHealthModal.vue +3 -3
- package/app/components/settings/ObservabilityConnectionPanel.vue +1 -1
- package/app/components/settings/OpenRouterCatalogPanel.vue +10 -8
- package/app/components/settings/PackageRegistriesPanel.vue +4 -4
- package/app/components/settings/ProviderConnectionTab.vue +5 -4
- package/app/components/settings/ProviderManifestEditor.vue +9 -8
- package/app/components/settings/ProviderPreferenceEditor.vue +13 -13
- package/app/components/settings/RiskPolicyCreateForm.vue +40 -26
- package/app/components/settings/RiskPolicyEditorRow.vue +21 -19
- package/app/components/settings/RiskPolicyHealthModal.vue +3 -3
- package/app/components/settings/RiskPolicyPanel.vue +11 -13
- package/app/components/settings/ServiceFragmentDefaultsPanel.vue +15 -12
- package/app/components/settings/SharedStacksPanel.vue +5 -5
- package/app/components/settings/TaskSourceCard.vue +2 -2
- package/app/components/settings/TaskTypeSuppressionsPanel.vue +4 -4
- package/app/components/settings/ToolServerChecklist.vue +22 -22
- package/app/components/settings/UsageSettings.vue +13 -13
- package/app/components/settings/UserSecretsSection.vue +4 -3
- package/app/components/settings/WorkspaceMetadataSettings.vue +6 -5
- package/app/components/settings/WorkspaceSettingsPanel.vue +72 -58
- package/app/components/skills/ReviewSkillQueue.vue +12 -10
- package/app/components/skills/SkillLibraryManager.vue +9 -8
- package/app/components/slack/SlackPanel.vue +17 -12
- package/app/components/spec/ServiceSpecWindow.vue +19 -19
- package/app/components/tasks/BugHuntModal.vue +1 -1
- package/app/components/tasks/ContextIssuePicker.vue +16 -15
- package/app/components/tasks/TaskContextIssues.vue +5 -4
- package/app/components/tasks/TaskImportModal.vue +3 -2
- package/app/components/tasks/TaskSourceConnectModal.vue +5 -5
- package/app/components/testing/TestReportWindow.vue +67 -60
- package/app/components/theme/ThemeImportModal.vue +2 -2
- package/app/components/tutorial/TutorialNudge.vue +3 -2
- package/app/components/tutorial/TutorialOverlay.vue +3 -2
- package/app/components/vcs/GitLabConnect.vue +1 -1
- package/app/components/visualConfirm/VisualConfirmationWindow.vue +79 -54
- package/app/utils/theme/builtins.ts +7 -1
- package/i18n/locales/de.json +7 -3
- package/i18n/locales/en.json +7 -3
- package/i18n/locales/es.json +7 -3
- package/i18n/locales/fr.json +7 -3
- package/i18n/locales/he.json +7 -3
- package/i18n/locales/it.json +7 -3
- package/i18n/locales/ja.json +7 -3
- package/i18n/locales/pl.json +7 -3
- package/i18n/locales/tr.json +7 -3
- package/i18n/locales/uk.json +7 -3
- package/package.json +1 -1
|
@@ -12,6 +12,7 @@ import {
|
|
|
12
12
|
import { lodAtLeast } from '~/composables/useSemanticZoom'
|
|
13
13
|
import { prReviewPhase } from '~/utils/prReviewProgress'
|
|
14
14
|
import PrReviewPhaseBadge from '~/components/prReview/PrReviewPhaseBadge.vue'
|
|
15
|
+
import SectionLabel from '~/components/common/SectionLabel.vue'
|
|
15
16
|
|
|
16
17
|
// Drill-down inside a task card: the task's build-pipeline steps appear on hover (at any
|
|
17
18
|
// zoom level) or once the `steps` zoom band is reached, and one band deeper (`subtasks`)
|
|
@@ -101,14 +102,15 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
101
102
|
|
|
102
103
|
<template>
|
|
103
104
|
<div v-if="showSteps" class="mt-2 space-y-1 border-t border-default pt-2">
|
|
104
|
-
<
|
|
105
|
+
<SectionLabel class="flex items-center gap-1">
|
|
105
106
|
<UIcon name="i-lucide-workflow" class="h-2.5 w-2.5" />
|
|
106
107
|
{{ t('board.task.buildSteps') }}
|
|
107
|
-
</
|
|
108
|
-
<div v-for="(s, i) in steps" :key="i" class="rounded bg-default/60 px-1.5 py-1">
|
|
109
|
-
<
|
|
110
|
-
|
|
111
|
-
|
|
108
|
+
</SectionLabel>
|
|
109
|
+
<div v-for="(s, i) in steps" :key="i" class="rounded-sm bg-default/60 px-1.5 py-1">
|
|
110
|
+
<UButton
|
|
111
|
+
color="neutral"
|
|
112
|
+
variant="ghost"
|
|
113
|
+
class="flex w-full cursor-pointer items-center gap-1 rounded-sm p-0 text-start hover:bg-transparent"
|
|
112
114
|
:title="`${agentKindMeta(s.agentKind).label} — ${agentKindMeta(s.agentKind).description}\n${t('board.task.clickToViewStep')}`"
|
|
113
115
|
@click.stop="openStep(i)"
|
|
114
116
|
>
|
|
@@ -117,7 +119,7 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
117
119
|
class="h-3 w-3 shrink-0"
|
|
118
120
|
:style="{ color: agentKindMeta(s.agentKind).color }"
|
|
119
121
|
/>
|
|
120
|
-
<span class="truncate text-
|
|
122
|
+
<span class="truncate text-3xs text-default">
|
|
121
123
|
{{ agentKindMeta(s.agentKind).label }}
|
|
122
124
|
</span>
|
|
123
125
|
<UIcon
|
|
@@ -129,7 +131,7 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
129
131
|
live — its slice progress reads better as Slicing… / Reviewing X/Y slices. -->
|
|
130
132
|
<span
|
|
131
133
|
v-if="s.subtasks && s.subtasks.total > 0 && !prPhaseActive(s)"
|
|
132
|
-
class="ms-auto shrink-0 font-mono text-
|
|
134
|
+
class="ms-auto shrink-0 font-mono text-3xs tabular-nums text-muted"
|
|
133
135
|
>
|
|
134
136
|
{{ s.subtasks.completed }}/{{ s.subtasks.total }}
|
|
135
137
|
</span>
|
|
@@ -140,7 +142,7 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
140
142
|
:class="stepSpinning(s) ? 'animate-spin' : ''"
|
|
141
143
|
:style="{ color: stepVisual(s).color }"
|
|
142
144
|
/>
|
|
143
|
-
</
|
|
145
|
+
</UButton>
|
|
144
146
|
|
|
145
147
|
<!-- PR reviewer: the precise sub-phase (slicing vs reviewing N/M slices), so the board
|
|
146
148
|
card tells the reviewer's progress apart from a bare subtask count. Self-hides once
|
|
@@ -149,33 +151,34 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
149
151
|
v-if="prPhaseActive(s)"
|
|
150
152
|
:step="s"
|
|
151
153
|
:run-failed="runFailed"
|
|
152
|
-
class="ms-4 mt-1 text-
|
|
154
|
+
class="ms-4 mt-1 text-3xs"
|
|
153
155
|
/>
|
|
154
156
|
|
|
155
157
|
<!-- pending approval gate: jump straight to the conclusions reader. Suppressed
|
|
156
158
|
while a reviewer gate is folding/re-reviewing in the background (no human needed). -->
|
|
157
|
-
<
|
|
159
|
+
<UButton
|
|
160
|
+
color="neutral"
|
|
161
|
+
variant="ghost"
|
|
158
162
|
v-if="
|
|
159
163
|
s.approval &&
|
|
160
164
|
s.approval.status === 'pending' &&
|
|
161
165
|
instance &&
|
|
162
166
|
!reviews.isBackground(s.agentKind, props.taskId)
|
|
163
167
|
"
|
|
164
|
-
|
|
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"
|
|
168
|
+
class="mt-1 flex w-full items-center justify-center gap-1 rounded-sm bg-app-warning-500 px-1.5 py-0.5 text-3xs font-semibold text-app-warning-50 dark:text-app-warning-950 transition hover:bg-app-warning-400"
|
|
166
169
|
@click.stop="ui.openApprovalDetail(instance.id, s.approval.id)"
|
|
167
170
|
>
|
|
168
171
|
<UIcon name="i-lucide-shield-check" class="h-2.5 w-2.5" />
|
|
169
172
|
{{ t('board.task.reviewAndApprove') }}
|
|
170
|
-
</
|
|
173
|
+
</UButton>
|
|
171
174
|
|
|
172
175
|
<!-- per-step subtask progress bar -->
|
|
173
176
|
<div
|
|
174
177
|
v-if="s.subtasks && s.subtasks.total > 0"
|
|
175
|
-
class="mt-1 h-0.5 w-full overflow-hidden rounded bg-accented/60"
|
|
178
|
+
class="mt-1 h-0.5 w-full overflow-hidden rounded-sm bg-accented/60"
|
|
176
179
|
>
|
|
177
180
|
<div
|
|
178
|
-
class="h-full rounded bg-primary transition-all"
|
|
181
|
+
class="h-full rounded-sm bg-primary transition-all"
|
|
179
182
|
:style="{ width: `${(s.subtasks.completed / s.subtasks.total) * 100}%` }"
|
|
180
183
|
/>
|
|
181
184
|
</div>
|
|
@@ -183,7 +186,7 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
183
186
|
<!-- conditionally-run companion (the gate's ci-fixer / conflict-resolver, or the
|
|
184
187
|
Tester's fixer): a compact running/ran/skipped line, so a gate that's working
|
|
185
188
|
its helper reads as actively fixing rather than a frozen subtask list. -->
|
|
186
|
-
<div v-if="companionByStep[i]" class="mt-1 flex items-center gap-1 text-
|
|
189
|
+
<div v-if="companionByStep[i]" class="mt-1 flex items-center gap-1 text-3xs">
|
|
187
190
|
<UIcon
|
|
188
191
|
:name="agentKindMeta(companionByStep[i]!.kind).icon"
|
|
189
192
|
class="h-2.5 w-2.5 shrink-0"
|
|
@@ -208,7 +211,7 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
208
211
|
<li
|
|
209
212
|
v-for="(item, j) in s.subtasks.items"
|
|
210
213
|
:key="j"
|
|
211
|
-
class="flex items-start gap-1 text-
|
|
214
|
+
class="flex items-start gap-1 text-3xs"
|
|
212
215
|
:class="
|
|
213
216
|
item.status === 'completed'
|
|
214
217
|
? 'text-dimmed line-through'
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
// is no suggestion at all as its own state, because "the two repositories agreed on everything"
|
|
10
10
|
// and "the analysis never ran" would otherwise look identical and lead to opposite conclusions.
|
|
11
11
|
import type { AdoptionSource, BootstrapJob } from '~/types/domain'
|
|
12
|
+
import SectionLabel from '~/components/common/SectionLabel.vue'
|
|
12
13
|
|
|
13
14
|
const props = defineProps<{ job: BootstrapJob }>()
|
|
14
15
|
const emit = defineEmits<{ close: [] }>()
|
|
@@ -224,31 +225,40 @@ watch(open, (isOpen) => {
|
|
|
224
225
|
<p v-if="recordsDropped > 0" class="text-app-warning-300/90">
|
|
225
226
|
{{ t('bootstrap.adoption.survey.truncated', { count: recordsDropped }) }}
|
|
226
227
|
</p>
|
|
227
|
-
<
|
|
228
|
-
<
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
228
|
+
<UCollapsible>
|
|
229
|
+
<template #default="{ open }">
|
|
230
|
+
<UButton
|
|
231
|
+
variant="link"
|
|
232
|
+
color="neutral"
|
|
233
|
+
size="xs"
|
|
234
|
+
:icon="open ? 'i-lucide-chevron-down' : 'i-lucide-chevron-right'"
|
|
235
|
+
:label="t('bootstrap.adoption.survey.show')"
|
|
236
|
+
:ui="{ base: 'w-full justify-start gap-1 p-0 text-dimmed hover:text-toned' }"
|
|
237
|
+
/>
|
|
238
|
+
</template>
|
|
239
|
+
<template #content>
|
|
240
|
+
<ul class="mt-2 space-y-1">
|
|
241
|
+
<!-- Keyed by POSITION: the transcript is append-only and rendered in order, and
|
|
233
242
|
the same path legitimately appears twice (a body refused by the seed and then
|
|
234
243
|
served to the model, a path the model retried). Keying on the path patched
|
|
235
244
|
those two rows against each other and rendered a note beside the wrong one. -->
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
>
|
|
241
|
-
<span
|
|
242
|
-
class="shrink-0 font-mono text-[10px] uppercase"
|
|
243
|
-
:class="entry.outcome === 'read' ? 'text-dimmed' : 'text-app-warning-400/80'"
|
|
245
|
+
<li
|
|
246
|
+
v-for="(entry, index) in surveyReads"
|
|
247
|
+
:key="index"
|
|
248
|
+
class="flex items-baseline gap-2"
|
|
244
249
|
>
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
250
|
+
<span
|
|
251
|
+
class="shrink-0 font-mono text-3xs uppercase"
|
|
252
|
+
:class="entry.outcome === 'read' ? 'text-dimmed' : 'text-app-warning-400/80'"
|
|
253
|
+
>
|
|
254
|
+
{{ t(`bootstrap.adoption.survey.outcome.${entry.outcome}`) }}
|
|
255
|
+
</span>
|
|
256
|
+
<span class="font-mono text-muted">{{ entry.path }}</span>
|
|
257
|
+
<span v-if="entry.note" class="text-app-600">{{ entry.note }}</span>
|
|
258
|
+
</li>
|
|
259
|
+
</ul>
|
|
260
|
+
</template>
|
|
261
|
+
</UCollapsible>
|
|
252
262
|
</div>
|
|
253
263
|
|
|
254
264
|
<!-- The reviewer's own instructions, on BOTH paths. With no suggestion to answer this is
|
|
@@ -289,9 +299,9 @@ watch(open, (isOpen) => {
|
|
|
289
299
|
<div class="flex items-start justify-between gap-3">
|
|
290
300
|
<div>
|
|
291
301
|
<p class="text-sm font-medium text-app-100">{{ decision.title }}</p>
|
|
292
|
-
<
|
|
302
|
+
<SectionLabel as="p">
|
|
293
303
|
{{ t(`bootstrap.adoption.area.${decision.area}`) }}
|
|
294
|
-
</
|
|
304
|
+
</SectionLabel>
|
|
295
305
|
</div>
|
|
296
306
|
<UBadge v-if="!touched.has(decision.id)" color="warning" variant="subtle" size="sm">
|
|
297
307
|
{{ t('bootstrap.adoption.needsYou') }}
|
|
@@ -299,7 +309,7 @@ watch(open, (isOpen) => {
|
|
|
299
309
|
</div>
|
|
300
310
|
|
|
301
311
|
<div class="grid gap-2 text-xs sm:grid-cols-2">
|
|
302
|
-
<div class="rounded bg-default/60 p-2">
|
|
312
|
+
<div class="rounded-sm bg-default/60 p-2">
|
|
303
313
|
<p class="mb-1 font-semibold text-toned">
|
|
304
314
|
{{ t('bootstrap.adoption.side.monorepo') }}
|
|
305
315
|
</p>
|
|
@@ -307,7 +317,7 @@ watch(open, (isOpen) => {
|
|
|
307
317
|
{{ decision.monorepoPractice ?? t('bootstrap.adoption.side.nothing') }}
|
|
308
318
|
</p>
|
|
309
319
|
</div>
|
|
310
|
-
<div class="rounded bg-default/60 p-2">
|
|
320
|
+
<div class="rounded-sm bg-default/60 p-2">
|
|
311
321
|
<p class="mb-1 font-semibold text-toned">
|
|
312
322
|
{{ t('bootstrap.adoption.side.template') }}
|
|
313
323
|
</p>
|
|
@@ -321,7 +331,7 @@ watch(open, (isOpen) => {
|
|
|
321
331
|
|
|
322
332
|
<!-- The evidence is what makes the suggestion checkable rather than an assertion,
|
|
323
333
|
so it is shown, not tucked away. -->
|
|
324
|
-
<p v-if="decision.evidence.length" class="text-
|
|
334
|
+
<p v-if="decision.evidence.length" class="text-2xs text-dimmed">
|
|
325
335
|
{{ t('bootstrap.adoption.evidence') }}
|
|
326
336
|
<span class="font-mono">{{ decision.evidence.join(', ') }}</span>
|
|
327
337
|
</p>
|
|
@@ -21,6 +21,8 @@ import {
|
|
|
21
21
|
import RepoTreeBrowser from '~/components/github/RepoTreeBrowser.vue'
|
|
22
22
|
import VcsConnectSurfaces from '~/components/vcs/VcsConnectSurfaces.vue'
|
|
23
23
|
import { appInstallationManageUrl, newRepoUrl, VCS_PROVIDER_LABELS } from '~/utils/vcs'
|
|
24
|
+
import SectionLabel from '~/components/common/SectionLabel.vue'
|
|
25
|
+
import IconButton from '~/components/common/IconButton.vue'
|
|
24
26
|
|
|
25
27
|
const ui = useUiStore()
|
|
26
28
|
const bootstrap = useBootstrapStore()
|
|
@@ -648,9 +650,9 @@ const statusLabel = computed<Record<BootstrapStatus, string>>(() => ({
|
|
|
648
650
|
|
|
649
651
|
<!-- launch -->
|
|
650
652
|
<section class="space-y-4">
|
|
651
|
-
<
|
|
653
|
+
<SectionLabel as="h3">
|
|
652
654
|
{{ t('bootstrap.section.newRepo') }}
|
|
653
|
-
</
|
|
655
|
+
</SectionLabel>
|
|
654
656
|
|
|
655
657
|
<UFormField :label="t('bootstrap.target.label')" required>
|
|
656
658
|
<URadioGroup v-model="target" :items="targetItems" />
|
|
@@ -700,13 +702,12 @@ const statusLabel = computed<Record<BootstrapStatus, string>>(() => ({
|
|
|
700
702
|
:placeholder="t('bootstrap.monorepo.directory.placeholder')"
|
|
701
703
|
class="flex-1"
|
|
702
704
|
/>
|
|
703
|
-
<
|
|
705
|
+
<IconButton
|
|
704
706
|
v-if="monorepoRepoId !== undefined"
|
|
705
707
|
variant="soft"
|
|
706
708
|
color="neutral"
|
|
707
709
|
icon="i-lucide-folder-search"
|
|
708
|
-
:
|
|
709
|
-
:aria-label="t('bootstrap.monorepo.directory.browse')"
|
|
710
|
+
:label="t('bootstrap.monorepo.directory.browse')"
|
|
710
711
|
data-testid="bootstrap-directory-browse"
|
|
711
712
|
@click="toggleDirectoryBrowse()"
|
|
712
713
|
/>
|
|
@@ -912,9 +913,9 @@ const statusLabel = computed<Record<BootstrapStatus, string>>(() => ({
|
|
|
912
913
|
|
|
913
914
|
<!-- recent jobs -->
|
|
914
915
|
<section v-if="agentRuns.bootstrapJobs.length" class="space-y-2">
|
|
915
|
-
<
|
|
916
|
+
<SectionLabel as="h3">
|
|
916
917
|
{{ t('bootstrap.recent.title') }}
|
|
917
|
-
</
|
|
918
|
+
</SectionLabel>
|
|
918
919
|
<div
|
|
919
920
|
v-for="job in agentRuns.bootstrapJobs.slice(0, 5)"
|
|
920
921
|
:key="job.id"
|
|
@@ -922,7 +923,7 @@ const statusLabel = computed<Record<BootstrapStatus, string>>(() => ({
|
|
|
922
923
|
>
|
|
923
924
|
<div class="min-w-0">
|
|
924
925
|
<div class="truncate text-default">{{ job.repoName }}</div>
|
|
925
|
-
<div class="truncate text-
|
|
926
|
+
<div class="truncate text-2xs text-dimmed">
|
|
926
927
|
{{
|
|
927
928
|
job.referenceArchitectureName
|
|
928
929
|
? t('bootstrap.recent.fromArch', { name: job.referenceArchitectureName })
|
|
@@ -935,7 +936,7 @@ const statusLabel = computed<Record<BootstrapStatus, string>>(() => ({
|
|
|
935
936
|
v-if="job.repoUrl"
|
|
936
937
|
:to="job.repoUrl"
|
|
937
938
|
target="_blank"
|
|
938
|
-
class="text-
|
|
939
|
+
class="text-2xs text-primary hover:underline"
|
|
939
940
|
>
|
|
940
941
|
{{ t('bootstrap.recent.open') }}
|
|
941
942
|
</ULink>
|
|
@@ -947,7 +948,7 @@ const statusLabel = computed<Record<BootstrapStatus, string>>(() => ({
|
|
|
947
948
|
v-if="job.prUrl"
|
|
948
949
|
:to="job.prUrl"
|
|
949
950
|
target="_blank"
|
|
950
|
-
class="text-
|
|
951
|
+
class="text-2xs text-primary hover:underline"
|
|
951
952
|
>
|
|
952
953
|
{{ t('bootstrap.recent.openPr') }}
|
|
953
954
|
</ULink>
|
|
@@ -963,9 +964,9 @@ const statusLabel = computed<Record<BootstrapStatus, string>>(() => ({
|
|
|
963
964
|
<!-- reference architecture management -->
|
|
964
965
|
<section class="space-y-3">
|
|
965
966
|
<div class="flex items-center justify-between">
|
|
966
|
-
<
|
|
967
|
+
<SectionLabel as="h3">
|
|
967
968
|
{{ t('bootstrap.arch.title') }}
|
|
968
|
-
</
|
|
969
|
+
</SectionLabel>
|
|
969
970
|
<UButton
|
|
970
971
|
size="xs"
|
|
971
972
|
color="neutral"
|
|
@@ -984,7 +985,7 @@ const statusLabel = computed<Record<BootstrapStatus, string>>(() => ({
|
|
|
984
985
|
>
|
|
985
986
|
<div class="min-w-0">
|
|
986
987
|
<div class="truncate text-sm text-default">{{ a.name }}</div>
|
|
987
|
-
<div class="truncate text-
|
|
988
|
+
<div class="truncate text-2xs text-dimmed">{{ a.repoOwner }}/{{ a.repoName }}</div>
|
|
988
989
|
</div>
|
|
989
990
|
<div class="flex items-center gap-1">
|
|
990
991
|
<UButton
|
|
@@ -19,6 +19,7 @@ import type {
|
|
|
19
19
|
ReviewItemSeverity,
|
|
20
20
|
ReviewItemStatus,
|
|
21
21
|
} from '~/types/brainstorm'
|
|
22
|
+
import SectionLabel from '~/components/common/SectionLabel.vue'
|
|
22
23
|
|
|
23
24
|
const board = useBoardStore()
|
|
24
25
|
const brainstorm = useBrainstormStore()
|
|
@@ -384,9 +385,9 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
384
385
|
v-if="item.reply"
|
|
385
386
|
class="mt-2 max-w-3xl rounded-md border-s-2 border-muted bg-app-950/40 px-3 py-1.5 text-sm text-toned"
|
|
386
387
|
>
|
|
387
|
-
<
|
|
388
|
+
<SectionLabel as="span">
|
|
388
389
|
{{ t('brainstorm.yourChoice') }}
|
|
389
|
-
</
|
|
390
|
+
</SectionLabel>
|
|
390
391
|
<p class="whitespace-pre-line">{{ item.reply }}</p>
|
|
391
392
|
</div>
|
|
392
393
|
|
|
@@ -454,7 +455,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
454
455
|
|
|
455
456
|
<!-- converged document: the standard-format direction -->
|
|
456
457
|
<section v-if="outline" class="mt-6 border-t border-default pt-5">
|
|
457
|
-
<div class="mb-3 flex items-center gap-1.5 text-
|
|
458
|
+
<div class="mb-3 flex items-center gap-1.5 text-2xs text-app-success-400">
|
|
458
459
|
<UIcon name="i-lucide-file-check-2" class="h-3.5 w-3.5" />
|
|
459
460
|
<span class="font-semibold uppercase tracking-wide">
|
|
460
461
|
{{ incorporated ? docNoun : t('brainstorm.docDraft', { doc: docNoun }) }}
|
|
@@ -464,9 +465,11 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
464
465
|
`width` prop): the window is `full`-width now, and this is continuous prose that
|
|
465
466
|
would otherwise run to 200-character lines. -->
|
|
466
467
|
<div v-for="s in outline.sections" :key="s.id" class="mb-2 max-w-3xl">
|
|
467
|
-
<
|
|
468
|
+
<UButton
|
|
469
|
+
color="neutral"
|
|
470
|
+
variant="ghost"
|
|
468
471
|
v-if="s.title"
|
|
469
|
-
class="group flex w-full items-center gap-2 text-start"
|
|
472
|
+
class="group flex w-full items-center gap-2 p-0 text-start hover:bg-transparent"
|
|
470
473
|
@click="toggle(s.id)"
|
|
471
474
|
>
|
|
472
475
|
<UIcon
|
|
@@ -479,10 +482,10 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
479
482
|
:class="s.depth <= 1 ? 'text-base' : s.depth === 2 ? 'text-sm' : 'text-xs'"
|
|
480
483
|
v-html="s.titleHtml"
|
|
481
484
|
/>
|
|
482
|
-
</
|
|
485
|
+
</UButton>
|
|
483
486
|
<div
|
|
484
487
|
v-show="!s.title || !collapsed[s.id]"
|
|
485
|
-
class="reader-prose mt-1 ps-5.5 text-
|
|
488
|
+
class="reader-prose mt-1 ps-5.5 text-sm leading-relaxed text-toned"
|
|
486
489
|
v-html="s.bodyHtml"
|
|
487
490
|
/>
|
|
488
491
|
</div>
|
|
@@ -541,7 +544,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
541
544
|
>
|
|
542
545
|
{{ t('brainstorm.incorporateChoices') }}
|
|
543
546
|
</UButton>
|
|
544
|
-
<p class="text-
|
|
547
|
+
<p class="text-2xs leading-relaxed text-dimmed">
|
|
545
548
|
<template v-if="canProceed">
|
|
546
549
|
{{ t('brainstorm.hint.allDismissed') }}
|
|
547
550
|
</template>
|
|
@@ -603,14 +606,14 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
603
606
|
{{ t('brainstorm.redoWithDirection') }}
|
|
604
607
|
</UButton>
|
|
605
608
|
</div>
|
|
606
|
-
<p class="text-
|
|
609
|
+
<p class="text-2xs leading-relaxed text-dimmed">
|
|
607
610
|
{{ t('brainstorm.mergedHint') }}
|
|
608
611
|
</p>
|
|
609
612
|
</div>
|
|
610
613
|
|
|
611
614
|
<div
|
|
612
615
|
v-if="session && incorporated"
|
|
613
|
-
class="border-t border-default pt-4 text-
|
|
616
|
+
class="border-t border-default pt-4 text-2xs leading-relaxed text-dimmed"
|
|
614
617
|
>
|
|
615
618
|
{{ t('brainstorm.incorporatedFooter') }}
|
|
616
619
|
</div>
|