@cat-factory/app 0.307.1 → 0.309.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 +21 -0
- 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 +3 -2
- package/app/components/auth/UserMenu.vue +1 -1
- package/app/components/binaryCandidates/BinaryCandidatesWindow.vue +15 -15
- package/app/components/binaryOutput/BinaryOutputReport.vue +10 -14
- package/app/components/binaryOutput/StoredAssetView.vue +5 -5
- package/app/components/board/AddTaskModal.vue +16 -14
- package/app/components/board/AgentFailureCard.vue +9 -9
- package/app/components/board/AgentFailureHistory.vue +1 -1
- package/app/components/board/CreateInitiativeModal.vue +2 -2
- package/app/components/board/FailureDetail.vue +1 -1
- package/app/components/board/FailureHistoryList.vue +5 -5
- package/app/components/board/RecurringPipelineModal.vue +12 -11
- package/app/components/board/ReviewFrictionDialog.vue +4 -3
- package/app/components/board/StepExecutionHistory.vue +8 -8
- package/app/components/board/nodes/AgentChip.vue +1 -1
- package/app/components/board/nodes/BlockNode.vue +8 -9
- package/app/components/board/nodes/EpicNode.vue +4 -4
- package/app/components/board/nodes/FrameSwimlanes.vue +4 -7
- 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 +8 -8
- package/app/components/board/nodes/TaskLane.vue +3 -3
- package/app/components/board/nodes/TaskPipelineMini.vue +13 -12
- package/app/components/bootstrap/AdoptionReviewModal.vue +7 -6
- package/app/components/bootstrap/BootstrapModal.vue +11 -10
- package/app/components/bootstrap/BootstrapRunSteps.vue +1 -1
- package/app/components/brainstorm/BrainstormWindow.vue +8 -7
- package/app/components/bugFishing/BugFishingWindow.vue +37 -36
- package/app/components/clarity/ClarityReviewWindow.vue +8 -7
- package/app/components/common/AsyncViewError.vue +1 -1
- package/app/components/common/ClarificationItem.vue +6 -6
- package/app/components/common/DescriptorFields.vue +1 -1
- package/app/components/common/EmptyState.vue +1 -1
- 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 +9 -8
- package/app/components/docs/DocInterviewWindow.vue +10 -9
- package/app/components/documents/ContextDocumentPicker.vue +10 -12
- package/app/components/documents/DocumentImportModal.vue +3 -2
- package/app/components/documents/DocumentSourceConnectModal.vue +2 -2
- package/app/components/documents/DocumentSyncState.vue +1 -1
- package/app/components/documents/DocumentTemplatesModal.vue +5 -4
- package/app/components/documents/RepoContextDocPicker.vue +3 -6
- 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 +11 -10
- 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 +10 -10
- package/app/components/forkDecision/ForkDecisionWindow.vue +23 -26
- package/app/components/foundational/FoundationalContractSummary.vue +2 -2
- package/app/components/foundational/FoundationalServiceCatalogList.vue +3 -3
- package/app/components/foundational/FoundationalServiceRegistry.vue +3 -3
- package/app/components/foundational/FoundationalSuppressions.vue +2 -2
- package/app/components/fragments/FragmentLibraryManager.vue +3 -3
- package/app/components/fragments/FragmentSelector.vue +10 -11
- package/app/components/gates/GateFailingCheckList.vue +3 -3
- package/app/components/gates/GateResultView.vue +39 -38
- package/app/components/github/AddServiceFromRepoModal.vue +5 -4
- package/app/components/github/BranchProtectionPreflight.vue +5 -5
- package/app/components/github/GitHubConnect.vue +5 -3
- package/app/components/github/GitHubPanel.vue +14 -13
- package/app/components/github/RepoTreeBrowser.vue +1 -1
- package/app/components/humanTest/HumanTestWindow.vue +18 -17
- package/app/components/initiative/InitiativePlanNotice.vue +3 -3
- package/app/components/initiative/InitiativePlanReview.vue +19 -21
- package/app/components/initiative/InitiativePlanningWindow.vue +5 -5
- package/app/components/initiative/InitiativeTrackerWindow.vue +54 -53
- package/app/components/judge/JudgeResultView.vue +24 -25
- package/app/components/kaizen/KaizenPanel.vue +4 -4
- 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 +4 -0
- package/app/components/layout/AiProvidersBanner.vue +1 -1
- package/app/components/layout/AppearanceSwitcher.vue +1 -1
- package/app/components/layout/BoardSwitcher.vue +3 -2
- package/app/components/layout/BoardToolbar.vue +6 -2
- package/app/components/layout/CommandBar.vue +4 -2
- package/app/components/layout/DefaultTestEnvBanner.vue +2 -2
- package/app/components/layout/IntegrationsHub.vue +4 -3
- package/app/components/layout/LanguageSwitcher.vue +1 -1
- package/app/components/layout/ModelProvidersHub.vue +6 -4
- package/app/components/layout/NotificationsInbox.vue +8 -7
- package/app/components/layout/PersonalSetupModal.vue +5 -3
- package/app/components/layout/RolePrompt.vue +1 -1
- package/app/components/layout/SideBar.vue +3 -5
- package/app/components/layout/SpendWarningBanner.vue +3 -3
- package/app/components/layout/TranslationWarningBanner.vue +1 -1
- package/app/components/layout/UiModeSwitcher.vue +7 -6
- package/app/components/layout/UiRoleSwitcher.vue +2 -2
- package/app/components/media/ArtifactLightbox.vue +6 -6
- package/app/components/media/ImageCompare.vue +16 -16
- package/app/components/merge/MergeEffortChips.vue +4 -6
- package/app/components/notifications/NotificationSettingsPanel.vue +6 -5
- package/app/components/observability/OutcomeFilterChips.vue +1 -1
- package/app/components/observability/RunFailureSummary.vue +14 -17
- package/app/components/observability/StepMetricsBar.vue +9 -8
- package/app/components/observability/StepModelActivity.vue +4 -3
- package/app/components/observability/ToolCallList.vue +15 -18
- package/app/components/outcome/OutcomeSummaryWindow.vue +43 -42
- package/app/components/palettes/AgentPalette.vue +7 -5
- package/app/components/palettes/AgentTierSelect.vue +1 -1
- package/app/components/palettes/PipelinePurposeSelect.vue +2 -1
- package/app/components/panels/AgentStepDetail.vue +27 -30
- 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 +66 -76
- package/app/components/panels/OperatorDashboardPanel.vue +27 -26
- package/app/components/panels/ReportsPanel.vue +26 -25
- package/app/components/panels/ReportsSpendBreakdown.vue +2 -2
- package/app/components/panels/ResultWindowShell.vue +19 -18
- package/app/components/panels/RunDetailLoadState.vue +1 -1
- package/app/components/panels/StepContainerStatus.vue +8 -7
- package/app/components/panels/StepDelegatedStatus.vue +13 -12
- 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/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 +8 -7
- package/app/components/panels/inspector/FrontendBindingsResolved.vue +5 -4
- package/app/components/panels/inspector/FrontendConfig.vue +26 -34
- package/app/components/panels/inspector/InitiativeInspector.vue +3 -3
- package/app/components/panels/inspector/InspectorSection.vue +7 -4
- package/app/components/panels/inspector/RecurringScheduleSettings.vue +9 -8
- 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 +9 -13
- package/app/components/panels/inspector/ServiceTestConfig.vue +41 -45
- 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 +13 -12
- package/app/components/panels/inspector/TaskRunSettings.vue +35 -38
- 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 +2 -2
- package/app/components/pipeline/GateConfigFields.vue +6 -6
- package/app/components/pipeline/IterationCapPrompt.vue +1 -1
- package/app/components/pipeline/PipelineBuilder.vue +28 -27
- package/app/components/pipeline/PipelineHealthModal.vue +7 -7
- package/app/components/pipeline/PipelinePicker.vue +3 -3
- package/app/components/pipeline/PipelinePreview.vue +6 -7
- package/app/components/pipeline/PipelineProgress.vue +23 -24
- package/app/components/prReview/PrReviewWindow.vue +42 -41
- package/app/components/providers/AiPresetMismatchDialog.vue +4 -3
- package/app/components/providers/AiProviderOnboardingModal.vue +2 -2
- package/app/components/providers/ApiKeysSection.vue +7 -6
- 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 +25 -26
- package/app/components/requirements/RequirementsReviewWindow.vue +13 -12
- package/app/components/riskPolicy/RiskPolicyPicker.vue +5 -5
- package/app/components/riskPolicy/RiskPolicyPreview.vue +16 -15
- package/app/components/sandbox/SandboxPanel.vue +21 -20
- 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 +16 -16
- package/app/components/settings/ComposeEnvironmentSetupSection.vue +14 -12
- package/app/components/settings/ConnectionTestVerdict.vue +1 -1
- package/app/components/settings/ConsensusGroupsSection.vue +21 -20
- package/app/components/settings/CustomManifestTypeEditor.vue +8 -7
- package/app/components/settings/DefaultProvisionTypeSection.vue +5 -5
- package/app/components/settings/InfraHandlersConfigurator.vue +14 -15
- package/app/components/settings/InfrastructureBackendPicker.vue +2 -2
- package/app/components/settings/IssueTrackerPanel.vue +9 -15
- 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 +10 -9
- package/app/components/settings/MergeClassRulesEditor.vue +6 -5
- package/app/components/settings/MergeRolePolicyEditor.vue +13 -12
- package/app/components/settings/ModelConfigurationPanel.vue +8 -11
- package/app/components/settings/ModelPresetHealthModal.vue +3 -3
- package/app/components/settings/ObservabilityConnectionPanel.vue +1 -1
- package/app/components/settings/OpenRouterCatalogPanel.vue +6 -5
- 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 +8 -7
- package/app/components/settings/RiskPolicyCreateForm.vue +40 -26
- package/app/components/settings/RiskPolicyEditorRow.vue +18 -17
- package/app/components/settings/RiskPolicyHealthModal.vue +3 -3
- package/app/components/settings/RiskPolicyPanel.vue +11 -13
- package/app/components/settings/ServiceFragmentDefaultsPanel.vue +5 -4
- 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 +8 -7
- package/app/components/skills/SkillLibraryManager.vue +2 -2
- package/app/components/slack/SlackPanel.vue +8 -7
- package/app/components/spec/ServiceSpecWindow.vue +15 -16
- package/app/components/tasks/BugHuntModal.vue +1 -1
- package/app/components/tasks/ContextIssuePicker.vue +4 -6
- package/app/components/tasks/TaskContextIssues.vue +1 -1
- package/app/components/tasks/TaskImportModal.vue +3 -2
- package/app/components/tasks/TaskSourceConnectModal.vue +5 -5
- package/app/components/testing/TestReportWindow.vue +54 -53
- 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 +23 -25
- package/app/composables/usePipelineErrorToast.ts +2 -0
- package/app/utils/catalog.ts +8 -0
- package/app/utils/theme/builtins.ts +7 -1
- package/i18n/locales/de.json +6 -3
- package/i18n/locales/en.json +6 -3
- package/i18n/locales/es.json +6 -3
- package/i18n/locales/fr.json +6 -3
- package/i18n/locales/he.json +6 -3
- package/i18n/locales/it.json +6 -3
- package/i18n/locales/ja.json +6 -3
- package/i18n/locales/pl.json +6 -3
- package/i18n/locales/tr.json +6 -3
- package/i18n/locales/uk.json +6 -3
- package/package.json +2 -2
|
@@ -24,6 +24,7 @@ import IntegrationBackTitle from '~/components/layout/IntegrationBackTitle.vue'
|
|
|
24
24
|
import type { AppSlots } from '~/modular/slots'
|
|
25
25
|
import { usePipelinesStore } from '~/stores/pipelines'
|
|
26
26
|
import { pipelineAllowedForTaskType } from '~/utils/pipeline'
|
|
27
|
+
import SectionLabel from '~/components/common/SectionLabel.vue'
|
|
27
28
|
|
|
28
29
|
const { t, te } = useI18n()
|
|
29
30
|
const ui = useUiStore()
|
|
@@ -360,7 +361,7 @@ async function save() {
|
|
|
360
361
|
<h3 class="text-sm font-semibold text-default">
|
|
361
362
|
{{ t('settings.workspaceSettings.waiting.heading') }}
|
|
362
363
|
</h3>
|
|
363
|
-
<p class="text-
|
|
364
|
+
<p class="text-2xs text-muted">
|
|
364
365
|
<i18n-t keypath="settings.workspaceSettings.waiting.body" tag="span" scope="global">
|
|
365
366
|
<template #overdue>
|
|
366
367
|
<span class="text-app-error-400">{{
|
|
@@ -369,11 +370,12 @@ async function save() {
|
|
|
369
370
|
</template>
|
|
370
371
|
</i18n-t>
|
|
371
372
|
</p>
|
|
372
|
-
<label class="block
|
|
373
|
-
<span class="mb-1 block
|
|
373
|
+
<label class="block">
|
|
374
|
+
<SectionLabel as="span" class="mb-1 block">
|
|
374
375
|
{{ t('settings.workspaceSettings.waiting.escalateAfter') }}
|
|
375
|
-
</
|
|
376
|
+
</SectionLabel>
|
|
376
377
|
<UInput
|
|
378
|
+
class="w-48"
|
|
377
379
|
v-model.number="draft.waitingEscalationMinutes"
|
|
378
380
|
type="number"
|
|
379
381
|
:min="1"
|
|
@@ -387,34 +389,40 @@ async function save() {
|
|
|
387
389
|
<h3 class="text-sm font-semibold text-default">
|
|
388
390
|
{{ t('settings.workspaceSettings.taskLimit.heading') }}
|
|
389
391
|
</h3>
|
|
390
|
-
<p class="text-
|
|
392
|
+
<p class="text-2xs text-muted">
|
|
391
393
|
{{ t('settings.workspaceSettings.taskLimit.body') }}
|
|
392
394
|
</p>
|
|
393
|
-
<label class="block
|
|
394
|
-
<span class="mb-1 block
|
|
395
|
+
<label class="block">
|
|
396
|
+
<SectionLabel as="span" class="mb-1 block">{{
|
|
395
397
|
t('settings.workspaceSettings.taskLimit.mode')
|
|
396
|
-
}}</
|
|
398
|
+
}}</SectionLabel>
|
|
397
399
|
<USelect
|
|
398
400
|
v-model="draft.taskLimitMode"
|
|
399
401
|
:items="MODES"
|
|
400
402
|
value-key="value"
|
|
401
403
|
size="sm"
|
|
402
|
-
class="w-
|
|
404
|
+
class="w-64"
|
|
403
405
|
/>
|
|
404
406
|
</label>
|
|
405
407
|
|
|
406
|
-
<label v-if="draft.taskLimitMode === 'shared'" class="block
|
|
407
|
-
<span class="mb-1 block
|
|
408
|
+
<label v-if="draft.taskLimitMode === 'shared'" class="block">
|
|
409
|
+
<SectionLabel as="span" class="mb-1 block">
|
|
408
410
|
{{ t('settings.workspaceSettings.taskLimit.maxRunning') }}
|
|
409
|
-
</
|
|
410
|
-
<UInput
|
|
411
|
+
</SectionLabel>
|
|
412
|
+
<UInput
|
|
413
|
+
class="w-48"
|
|
414
|
+
v-model.number="draft.taskLimitShared"
|
|
415
|
+
type="number"
|
|
416
|
+
:min="1"
|
|
417
|
+
size="sm"
|
|
418
|
+
/>
|
|
411
419
|
</label>
|
|
412
420
|
|
|
413
421
|
<div v-else-if="draft.taskLimitMode === 'per_type'" class="grid grid-cols-2 gap-3">
|
|
414
422
|
<label v-for="taskType in TASK_TYPES" :key="taskType" class="block">
|
|
415
|
-
<span class="mb-1 block
|
|
423
|
+
<SectionLabel as="span" class="mb-1 block">
|
|
416
424
|
{{ maxTaskTypeLabel(taskType) }}
|
|
417
|
-
</
|
|
425
|
+
</SectionLabel>
|
|
418
426
|
<UInput
|
|
419
427
|
v-model.number="draft.perType[taskType]"
|
|
420
428
|
type="number"
|
|
@@ -431,19 +439,19 @@ async function save() {
|
|
|
431
439
|
<h3 class="text-sm font-semibold text-default">
|
|
432
440
|
{{ t('settings.workspaceSettings.inputGate.heading') }}
|
|
433
441
|
</h3>
|
|
434
|
-
<p class="text-
|
|
442
|
+
<p class="text-2xs text-muted">
|
|
435
443
|
{{ t('settings.workspaceSettings.inputGate.body') }}
|
|
436
444
|
</p>
|
|
437
|
-
<label class="block
|
|
438
|
-
<span class="mb-1 block
|
|
445
|
+
<label class="block">
|
|
446
|
+
<SectionLabel as="span" class="mb-1 block">{{
|
|
439
447
|
t('settings.workspaceSettings.inputGate.mode')
|
|
440
|
-
}}</
|
|
448
|
+
}}</SectionLabel>
|
|
441
449
|
<USelect
|
|
442
450
|
v-model="draft.inputGateMode"
|
|
443
451
|
:items="INPUT_GATE_MODES"
|
|
444
452
|
value-key="value"
|
|
445
453
|
size="sm"
|
|
446
|
-
class="w-
|
|
454
|
+
class="w-64"
|
|
447
455
|
data-testid="input-gate-mode"
|
|
448
456
|
/>
|
|
449
457
|
</label>
|
|
@@ -454,27 +462,28 @@ async function save() {
|
|
|
454
462
|
<h3 class="text-sm font-semibold text-default">
|
|
455
463
|
{{ t('settings.workspaceSettings.reviewFriction.heading') }}
|
|
456
464
|
</h3>
|
|
457
|
-
<p class="text-
|
|
465
|
+
<p class="text-2xs text-muted">
|
|
458
466
|
{{ t('settings.workspaceSettings.reviewFriction.body') }}
|
|
459
467
|
</p>
|
|
460
|
-
<label class="block
|
|
461
|
-
<span class="mb-1 block
|
|
468
|
+
<label class="block">
|
|
469
|
+
<SectionLabel as="span" class="mb-1 block">{{
|
|
462
470
|
t('settings.workspaceSettings.reviewFriction.mode')
|
|
463
|
-
}}</
|
|
471
|
+
}}</SectionLabel>
|
|
464
472
|
<USelect
|
|
465
473
|
v-model="draft.reviewFrictionMode"
|
|
466
474
|
:items="REVIEW_FRICTION_MODES"
|
|
467
475
|
value-key="value"
|
|
468
476
|
size="sm"
|
|
469
|
-
class="w-
|
|
477
|
+
class="w-64"
|
|
470
478
|
/>
|
|
471
479
|
</label>
|
|
472
480
|
|
|
473
|
-
<label v-if="draft.reviewFrictionMode !== 'off'" class="block
|
|
474
|
-
<span class="mb-1 block
|
|
481
|
+
<label v-if="draft.reviewFrictionMode !== 'off'" class="block">
|
|
482
|
+
<SectionLabel as="span" class="mb-1 block">
|
|
475
483
|
{{ t('settings.workspaceSettings.reviewFriction.warnCount') }}
|
|
476
|
-
</
|
|
484
|
+
</SectionLabel>
|
|
477
485
|
<UInput
|
|
486
|
+
class="w-48"
|
|
478
487
|
v-model.number="draft.reviewFrictionWarnCount"
|
|
479
488
|
type="number"
|
|
480
489
|
:min="1"
|
|
@@ -483,20 +492,21 @@ async function save() {
|
|
|
483
492
|
</label>
|
|
484
493
|
|
|
485
494
|
<div v-if="draft.reviewFrictionMode === 'enforce'" class="space-y-2">
|
|
486
|
-
<p class="text-
|
|
495
|
+
<p class="text-2xs text-muted">
|
|
487
496
|
{{ t('settings.workspaceSettings.reviewFriction.enforceHint') }}
|
|
488
497
|
</p>
|
|
489
498
|
<label class="flex items-center gap-2">
|
|
490
499
|
<USwitch v-model="draft.reviewFrictionBlockCountEnabled" size="sm" />
|
|
491
|
-
<span class="text-
|
|
500
|
+
<span class="text-sm text-toned">{{
|
|
492
501
|
t('settings.workspaceSettings.reviewFriction.blockCountToggle')
|
|
493
502
|
}}</span>
|
|
494
503
|
</label>
|
|
495
|
-
<label v-if="draft.reviewFrictionBlockCountEnabled" class="block
|
|
496
|
-
<span class="mb-1 block
|
|
504
|
+
<label v-if="draft.reviewFrictionBlockCountEnabled" class="block">
|
|
505
|
+
<SectionLabel as="span" class="mb-1 block">
|
|
497
506
|
{{ t('settings.workspaceSettings.reviewFriction.blockCount') }}
|
|
498
|
-
</
|
|
507
|
+
</SectionLabel>
|
|
499
508
|
<UInput
|
|
509
|
+
class="w-48"
|
|
500
510
|
v-model.number="draft.reviewFrictionBlockCount"
|
|
501
511
|
type="number"
|
|
502
512
|
:min="1"
|
|
@@ -505,15 +515,16 @@ async function save() {
|
|
|
505
515
|
</label>
|
|
506
516
|
<label class="flex items-center gap-2">
|
|
507
517
|
<USwitch v-model="draft.reviewFrictionBlockStuckEnabled" size="sm" />
|
|
508
|
-
<span class="text-
|
|
518
|
+
<span class="text-sm text-toned">{{
|
|
509
519
|
t('settings.workspaceSettings.reviewFriction.blockStuckToggle')
|
|
510
520
|
}}</span>
|
|
511
521
|
</label>
|
|
512
|
-
<label v-if="draft.reviewFrictionBlockStuckEnabled" class="block
|
|
513
|
-
<span class="mb-1 block
|
|
522
|
+
<label v-if="draft.reviewFrictionBlockStuckEnabled" class="block">
|
|
523
|
+
<SectionLabel as="span" class="mb-1 block">
|
|
514
524
|
{{ t('settings.workspaceSettings.reviewFriction.blockStuckMinutes') }}
|
|
515
|
-
</
|
|
525
|
+
</SectionLabel>
|
|
516
526
|
<UInput
|
|
527
|
+
class="w-48"
|
|
517
528
|
v-model.number="draft.reviewFrictionBlockStuckMinutes"
|
|
518
529
|
type="number"
|
|
519
530
|
:min="1"
|
|
@@ -528,7 +539,7 @@ async function save() {
|
|
|
528
539
|
<h3 class="text-sm font-semibold text-default">
|
|
529
540
|
{{ t('settings.workspaceSettings.observability.heading') }}
|
|
530
541
|
</h3>
|
|
531
|
-
<p class="text-
|
|
542
|
+
<p class="text-2xs text-muted">
|
|
532
543
|
{{ t('settings.workspaceSettings.observability.body') }}
|
|
533
544
|
</p>
|
|
534
545
|
<label class="flex items-center gap-2">
|
|
@@ -544,7 +555,7 @@ async function save() {
|
|
|
544
555
|
<h3 class="text-sm font-semibold text-default">
|
|
545
556
|
{{ t('settings.workspaceSettings.prReport.heading') }}
|
|
546
557
|
</h3>
|
|
547
|
-
<p class="text-
|
|
558
|
+
<p class="text-2xs text-muted">
|
|
548
559
|
{{ t('settings.workspaceSettings.prReport.body') }}
|
|
549
560
|
</p>
|
|
550
561
|
<label class="flex items-center gap-2">
|
|
@@ -560,14 +571,15 @@ async function save() {
|
|
|
560
571
|
<h3 class="text-sm font-semibold text-default">
|
|
561
572
|
{{ t('settings.workspaceSettings.retention.heading') }}
|
|
562
573
|
</h3>
|
|
563
|
-
<p class="text-
|
|
574
|
+
<p class="text-2xs text-muted">
|
|
564
575
|
{{ t('settings.workspaceSettings.retention.body') }}
|
|
565
576
|
</p>
|
|
566
|
-
<label class="block
|
|
567
|
-
<span class="mb-1 block
|
|
577
|
+
<label class="block">
|
|
578
|
+
<SectionLabel as="span" class="mb-1 block">
|
|
568
579
|
{{ t('settings.workspaceSettings.retention.days') }}
|
|
569
|
-
</
|
|
580
|
+
</SectionLabel>
|
|
570
581
|
<UInput
|
|
582
|
+
class="w-48"
|
|
571
583
|
v-model.number="draft.artifactRetentionDays"
|
|
572
584
|
type="number"
|
|
573
585
|
:min="1"
|
|
@@ -582,14 +594,15 @@ async function save() {
|
|
|
582
594
|
<h3 class="text-sm font-semibold text-default">
|
|
583
595
|
{{ t('settings.workspaceSettings.doneLane.heading') }}
|
|
584
596
|
</h3>
|
|
585
|
-
<p class="text-
|
|
597
|
+
<p class="text-2xs text-muted">
|
|
586
598
|
{{ t('settings.workspaceSettings.doneLane.body') }}
|
|
587
599
|
</p>
|
|
588
|
-
<label class="block
|
|
589
|
-
<span class="mb-1 block
|
|
600
|
+
<label class="block">
|
|
601
|
+
<SectionLabel as="span" class="mb-1 block">
|
|
590
602
|
{{ t('settings.workspaceSettings.doneLane.maxItems') }}
|
|
591
|
-
</
|
|
603
|
+
</SectionLabel>
|
|
592
604
|
<UInput
|
|
605
|
+
class="w-48"
|
|
593
606
|
v-model.number="draft.doneLaneMaxItems"
|
|
594
607
|
type="number"
|
|
595
608
|
:min="0"
|
|
@@ -598,20 +611,21 @@ async function save() {
|
|
|
598
611
|
data-testid="done-lane-max-items"
|
|
599
612
|
/>
|
|
600
613
|
</label>
|
|
601
|
-
<p v-if="draft.doneLaneMaxItems === 0" class="text-
|
|
614
|
+
<p v-if="draft.doneLaneMaxItems === 0" class="text-2xs text-dimmed">
|
|
602
615
|
{{ t('settings.workspaceSettings.doneLane.zeroHint') }}
|
|
603
616
|
</p>
|
|
604
617
|
<label class="flex items-center gap-2">
|
|
605
618
|
<UCheckbox v-model="draft.doneLaneRetentionEnabled" size="sm" />
|
|
606
|
-
<span class="text-
|
|
619
|
+
<span class="text-2xs text-toned">{{
|
|
607
620
|
t('settings.workspaceSettings.doneLane.ageToggle')
|
|
608
621
|
}}</span>
|
|
609
622
|
</label>
|
|
610
|
-
<label v-if="draft.doneLaneRetentionEnabled" class="block
|
|
611
|
-
<span class="mb-1 block
|
|
623
|
+
<label v-if="draft.doneLaneRetentionEnabled" class="block">
|
|
624
|
+
<SectionLabel as="span" class="mb-1 block">
|
|
612
625
|
{{ t('settings.workspaceSettings.doneLane.days') }}
|
|
613
|
-
</
|
|
626
|
+
</SectionLabel>
|
|
614
627
|
<UInput
|
|
628
|
+
class="w-48"
|
|
615
629
|
v-model.number="draft.doneLaneRetentionDays"
|
|
616
630
|
type="number"
|
|
617
631
|
:min="1"
|
|
@@ -620,7 +634,7 @@ async function save() {
|
|
|
620
634
|
data-testid="done-lane-retention-days"
|
|
621
635
|
/>
|
|
622
636
|
</label>
|
|
623
|
-
<p class="text-
|
|
637
|
+
<p class="text-2xs text-dimmed">
|
|
624
638
|
{{ t('settings.workspaceSettings.doneLane.hidesOnlyHint') }}
|
|
625
639
|
</p>
|
|
626
640
|
</section>
|
|
@@ -630,7 +644,7 @@ async function save() {
|
|
|
630
644
|
<h3 class="text-sm font-semibold text-default">
|
|
631
645
|
{{ t('settings.workspaceSettings.runCredential.heading') }}
|
|
632
646
|
</h3>
|
|
633
|
-
<p class="text-
|
|
647
|
+
<p class="text-2xs text-muted">
|
|
634
648
|
{{ t('settings.workspaceSettings.runCredential.body') }}
|
|
635
649
|
</p>
|
|
636
650
|
<label class="flex items-center gap-2">
|
|
@@ -643,14 +657,14 @@ async function save() {
|
|
|
643
657
|
t('settings.workspaceSettings.runCredential.toggle')
|
|
644
658
|
}}</span>
|
|
645
659
|
</label>
|
|
646
|
-
<p v-if="!draft.allowInitiatorPat" class="text-
|
|
660
|
+
<p v-if="!draft.allowInitiatorPat" class="text-2xs text-app-warning-300">
|
|
647
661
|
{{ t('settings.workspaceSettings.runCredential.offHint') }}
|
|
648
662
|
</p>
|
|
649
663
|
<!-- Stated rather than read: the account floor lives behind an ACCOUNT-admin
|
|
650
664
|
endpoint, which a workspace admin may not hold, so probing it here would 403
|
|
651
665
|
for exactly the people this note is for. A static line sets the expectation
|
|
652
666
|
without pretending to report a value we cannot see. -->
|
|
653
|
-
<p v-if="draft.allowInitiatorPat" class="text-
|
|
667
|
+
<p v-if="draft.allowInitiatorPat" class="text-2xs text-dimmed">
|
|
654
668
|
{{ t('settings.workspaceSettings.runCredential.accountFloorNote') }}
|
|
655
669
|
</p>
|
|
656
670
|
</section>
|
|
@@ -662,7 +676,7 @@ async function save() {
|
|
|
662
676
|
<h3 class="text-sm font-semibold text-default">
|
|
663
677
|
{{ t('settings.workspaceSettings.bugFishing.heading') }}
|
|
664
678
|
</h3>
|
|
665
|
-
<p class="text-
|
|
679
|
+
<p class="text-2xs text-muted">
|
|
666
680
|
{{ t('settings.workspaceSettings.bugFishing.body') }}
|
|
667
681
|
</p>
|
|
668
682
|
<USelectMenu
|
|
@@ -680,7 +694,7 @@ async function save() {
|
|
|
680
694
|
<h3 class="text-sm font-semibold text-default">
|
|
681
695
|
{{ t('settings.workspaceSettings.kaizen.heading') }}
|
|
682
696
|
</h3>
|
|
683
|
-
<p class="text-
|
|
697
|
+
<p class="text-2xs text-muted">
|
|
684
698
|
{{ t('settings.workspaceSettings.kaizen.body') }}
|
|
685
699
|
</p>
|
|
686
700
|
<label class="flex items-center gap-2">
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
import { computed, ref } from 'vue'
|
|
18
18
|
import { MAX_REVIEW_SKILLS } from '@cat-factory/contracts'
|
|
19
19
|
import { useSkillsStore } from '~/stores/skills'
|
|
20
|
+
import SectionLabel from '~/components/common/SectionLabel.vue'
|
|
20
21
|
|
|
21
22
|
const props = defineProps<{
|
|
22
23
|
/** The queued skill ids, in the order the reviewer applies them (`v-model`). */
|
|
@@ -63,9 +64,9 @@ function toggle(id: string) {
|
|
|
63
64
|
<template>
|
|
64
65
|
<div>
|
|
65
66
|
<div class="mb-1 flex items-center justify-between gap-2">
|
|
66
|
-
<
|
|
67
|
+
<SectionLabel as="span">
|
|
67
68
|
{{ t('skills.reviewQueue.label') }}
|
|
68
|
-
</
|
|
69
|
+
</SectionLabel>
|
|
69
70
|
<UPopover v-model:open="open" :content="{ align: 'end' }">
|
|
70
71
|
<UButton
|
|
71
72
|
size="xs"
|
|
@@ -87,7 +88,7 @@ function toggle(id: string) {
|
|
|
87
88
|
v-for="s in offered"
|
|
88
89
|
:key="s.id"
|
|
89
90
|
type="button"
|
|
90
|
-
class="flex w-full items-start gap-2 rounded px-2 py-1.5 text-start text-sm hover:bg-elevated/60 disabled:cursor-not-allowed disabled:opacity-40"
|
|
91
|
+
class="flex w-full items-start gap-2 rounded-sm px-2 py-1.5 text-start text-sm hover:bg-elevated/60 disabled:cursor-not-allowed disabled:opacity-40"
|
|
91
92
|
:class="selectedSet.has(s.id) ? 'text-app-100' : 'text-toned'"
|
|
92
93
|
:disabled="atCap && !selectedSet.has(s.id)"
|
|
93
94
|
:aria-pressed="selectedSet.has(s.id)"
|
|
@@ -101,20 +102,20 @@ function toggle(id: string) {
|
|
|
101
102
|
/>
|
|
102
103
|
<span class="min-w-0 flex-1">
|
|
103
104
|
<span class="block truncate">{{ s.name }}</span>
|
|
104
|
-
<span class="block truncate text-
|
|
105
|
+
<span class="block truncate text-2xs text-dimmed">
|
|
105
106
|
{{ s.description }}
|
|
106
107
|
</span>
|
|
107
108
|
</span>
|
|
108
109
|
</button>
|
|
109
110
|
</template>
|
|
110
|
-
<p v-else class="px-2 py-3 text-
|
|
111
|
+
<p v-else class="px-2 py-3 text-xs text-dimmed">
|
|
111
112
|
{{ t('skills.reviewQueue.pickerEmpty') }}
|
|
112
113
|
</p>
|
|
113
114
|
</div>
|
|
114
115
|
|
|
115
116
|
<p
|
|
116
117
|
v-if="atCap"
|
|
117
|
-
class="border-t border-default px-2 py-1.5 text-
|
|
118
|
+
class="border-t border-default px-2 py-1.5 text-2xs text-app-warning-400"
|
|
118
119
|
>
|
|
119
120
|
{{ t('skills.reviewQueue.capped', { max: MAX_REVIEW_SKILLS }) }}
|
|
120
121
|
</p>
|
|
@@ -149,7 +150,7 @@ function toggle(id: string) {
|
|
|
149
150
|
{{ s.name }}<UIcon name="i-lucide-x" class="ms-0.5 h-3 w-3" />
|
|
150
151
|
</UBadge>
|
|
151
152
|
</div>
|
|
152
|
-
<p v-else class="text-
|
|
153
|
+
<p v-else class="text-2xs text-dimmed">
|
|
153
154
|
{{ t('skills.reviewQueue.hint') }}
|
|
154
155
|
</p>
|
|
155
156
|
</div>
|
|
@@ -181,10 +181,10 @@ async function unlinkSource(id: string) {
|
|
|
181
181
|
<!-- The manifest declared a group this build does not know (a typo, or a member
|
|
182
182
|
retired since the sync). It is filed under Other, and saying which value was
|
|
183
183
|
declared is what lets the author fix their frontmatter. -->
|
|
184
|
-
<p v-if="s.declaredGroup" class="mt-1 text-
|
|
184
|
+
<p v-if="s.declaredGroup" class="mt-1 text-2xs text-app-warning-400">
|
|
185
185
|
{{ t('skills.catalog.groupUnknown', { group: s.declaredGroup }) }}
|
|
186
186
|
</p>
|
|
187
|
-
<p class="mt-1 flex flex-wrap gap-x-3 text-
|
|
187
|
+
<p class="mt-1 flex flex-wrap gap-x-3 text-2xs text-dimmed">
|
|
188
188
|
<span v-if="s.resources.length">
|
|
189
189
|
{{ t('skills.catalog.resources', { count: s.resources.length }) }}
|
|
190
190
|
</span>
|
|
@@ -16,6 +16,7 @@ import {
|
|
|
16
16
|
} from '~/utils/slackMemberMapping'
|
|
17
17
|
import IntegrationBackTitle from '~/components/layout/IntegrationBackTitle.vue'
|
|
18
18
|
import SecretInput from '~/components/common/SecretInput.vue'
|
|
19
|
+
import SectionLabel from '~/components/common/SectionLabel.vue'
|
|
19
20
|
|
|
20
21
|
const ui = useUiStore()
|
|
21
22
|
const slack = useSlackStore()
|
|
@@ -224,9 +225,9 @@ async function saveMapping() {
|
|
|
224
225
|
{{ t('slack.connect.addToSlack') }}
|
|
225
226
|
</UButton>
|
|
226
227
|
<div class="space-y-1">
|
|
227
|
-
<span class="block
|
|
228
|
+
<SectionLabel as="span" class="block">
|
|
228
229
|
{{ t('slack.connect.orPasteToken') }}
|
|
229
|
-
</
|
|
230
|
+
</SectionLabel>
|
|
230
231
|
<div class="flex gap-2">
|
|
231
232
|
<SecretInput v-model="tokenInput" size="sm" class="flex-1" placeholder="xoxb-…" />
|
|
232
233
|
<UButton
|
|
@@ -267,9 +268,9 @@ async function saveMapping() {
|
|
|
267
268
|
|
|
268
269
|
<!-- routing -->
|
|
269
270
|
<div class="space-y-3">
|
|
270
|
-
<
|
|
271
|
+
<SectionLabel as="p">
|
|
271
272
|
{{ t('slack.routing.heading') }}
|
|
272
|
-
</
|
|
273
|
+
</SectionLabel>
|
|
273
274
|
<div
|
|
274
275
|
v-for="row in ROUTABLE"
|
|
275
276
|
:key="row.type"
|
|
@@ -311,10 +312,10 @@ async function saveMapping() {
|
|
|
311
312
|
|
|
312
313
|
<!-- member mapping -->
|
|
313
314
|
<div v-if="mentionsEnabled" class="space-y-2">
|
|
314
|
-
<
|
|
315
|
+
<SectionLabel as="p">
|
|
315
316
|
{{ t('slack.members.heading') }}
|
|
316
|
-
</
|
|
317
|
-
<p class="text-
|
|
317
|
+
</SectionLabel>
|
|
318
|
+
<p class="text-2xs leading-snug text-dimmed">
|
|
318
319
|
<i18n-t keypath="slack.members.hint" tag="span">
|
|
319
320
|
<template #product>
|
|
320
321
|
<span class="font-medium text-muted">{{ t('slack.members.productLabel') }}</span>
|
|
@@ -22,6 +22,7 @@ import {
|
|
|
22
22
|
type RequirementStateFilter,
|
|
23
23
|
} from './ServiceSpecWindow.logic'
|
|
24
24
|
import type { BadgeColor } from '~/utils/badge'
|
|
25
|
+
import SectionLabel from '~/components/common/SectionLabel.vue'
|
|
25
26
|
|
|
26
27
|
const { t } = useI18n()
|
|
27
28
|
const board = useBoardStore()
|
|
@@ -285,14 +286,14 @@ function kindLabel(item: RequirementItem): string {
|
|
|
285
286
|
{{ t('spec.overview') }}
|
|
286
287
|
</UButton>
|
|
287
288
|
<div v-for="(mod, mi) in modules" :key="mi" class="mb-3">
|
|
288
|
-
<
|
|
289
|
+
<SectionLabel class="px-2 pb-1">
|
|
289
290
|
{{ mod.name }}
|
|
290
|
-
</
|
|
291
|
+
</SectionLabel>
|
|
291
292
|
<ul class="space-y-0.5">
|
|
292
293
|
<li v-for="(group, gi) in mod.groups ?? []" :key="gi">
|
|
293
294
|
<button
|
|
294
295
|
type="button"
|
|
295
|
-
class="flex w-full items-center justify-between gap-2 rounded-md px-2 py-1.5 text-start text-
|
|
296
|
+
class="flex w-full items-center justify-between gap-2 rounded-md px-2 py-1.5 text-start text-sm transition"
|
|
296
297
|
:class="
|
|
297
298
|
selected?.m === mi && selected?.g === gi
|
|
298
299
|
? 'bg-primary/15 text-primary'
|
|
@@ -301,12 +302,12 @@ function kindLabel(item: RequirementItem): string {
|
|
|
301
302
|
@click="selectGroup(mi, gi)"
|
|
302
303
|
>
|
|
303
304
|
<span class="truncate">{{ group.name }}</span>
|
|
304
|
-
<span class="shrink-0 text-
|
|
305
|
+
<span class="shrink-0 text-3xs text-dimmed">{{ reqCount(group) }}</span>
|
|
305
306
|
</button>
|
|
306
307
|
</li>
|
|
307
308
|
<li
|
|
308
309
|
v-if="(mod.groups?.length ?? 0) === 0"
|
|
309
|
-
class="px-2 py-1 text-
|
|
310
|
+
class="px-2 py-1 text-2xs italic text-app-600"
|
|
310
311
|
>
|
|
311
312
|
{{ t('spec.noFeatureGroups') }}
|
|
312
313
|
</li>
|
|
@@ -352,9 +353,9 @@ function kindLabel(item: RequirementItem): string {
|
|
|
352
353
|
|
|
353
354
|
<!-- selected feature group -->
|
|
354
355
|
<template v-else-if="selectedGroup">
|
|
355
|
-
<
|
|
356
|
+
<SectionLabel class="mb-1">
|
|
356
357
|
{{ selectedModule?.name }}
|
|
357
|
-
</
|
|
358
|
+
</SectionLabel>
|
|
358
359
|
<h2 class="text-lg font-semibold text-highlighted">{{ selectedGroup.name }}</h2>
|
|
359
360
|
<p v-if="selectedGroup.summary" class="mt-1 max-w-3xl text-sm text-muted">
|
|
360
361
|
{{ selectedGroup.summary }}
|
|
@@ -364,7 +365,7 @@ function kindLabel(item: RequirementItem): string {
|
|
|
364
365
|
<template v-if="mode === 'gherkin'">
|
|
365
366
|
<pre
|
|
366
367
|
v-if="selectedFeature"
|
|
367
|
-
class="mt-4 overflow-x-auto rounded-lg border border-default bg-app-950/60 p-4 text-
|
|
368
|
+
class="mt-4 overflow-x-auto rounded-lg border border-default bg-app-950/60 p-4 text-xs leading-relaxed text-default"
|
|
368
369
|
><code>{{ selectedFeature.content }}</code></pre>
|
|
369
370
|
<div
|
|
370
371
|
v-else
|
|
@@ -385,7 +386,7 @@ function kindLabel(item: RequirementItem): string {
|
|
|
385
386
|
class="mt-4 flex flex-wrap items-center justify-between gap-2"
|
|
386
387
|
data-testid="spec-state-filter"
|
|
387
388
|
>
|
|
388
|
-
<div class="flex items-center gap-1.5 text-
|
|
389
|
+
<div class="flex items-center gap-1.5 text-2xs text-dimmed">
|
|
389
390
|
<UIcon
|
|
390
391
|
:name="STATE_META.established.icon"
|
|
391
392
|
class="h-3.5 w-3.5 text-app-success-400"
|
|
@@ -466,7 +467,7 @@ function kindLabel(item: RequirementItem): string {
|
|
|
466
467
|
<UBadge color="neutral" variant="subtle" size="sm">{{ kindLabel(req) }}</UBadge>
|
|
467
468
|
</div>
|
|
468
469
|
</div>
|
|
469
|
-
<p class="mt-1.5 whitespace-pre-line text-
|
|
470
|
+
<p class="mt-1.5 whitespace-pre-line text-sm leading-relaxed text-toned">
|
|
470
471
|
{{ req.statement }}
|
|
471
472
|
</p>
|
|
472
473
|
<!-- acceptance criteria (Given/When/Then) -->
|
|
@@ -474,7 +475,7 @@ function kindLabel(item: RequirementItem): string {
|
|
|
474
475
|
<div
|
|
475
476
|
v-for="ac in req.acceptance ?? []"
|
|
476
477
|
:key="ac.id"
|
|
477
|
-
class="rounded-md border border-default bg-app-950/50 px-3 py-2 text-
|
|
478
|
+
class="rounded-md border border-default bg-app-950/50 px-3 py-2 text-xs leading-relaxed"
|
|
478
479
|
>
|
|
479
480
|
<p class="text-toned">
|
|
480
481
|
<span class="font-semibold text-app-success-400">{{
|
|
@@ -501,17 +502,15 @@ function kindLabel(item: RequirementItem): string {
|
|
|
501
502
|
|
|
502
503
|
<!-- domain rules / invariants scoped to this group -->
|
|
503
504
|
<div v-if="(selectedGroup.rules?.length ?? 0) > 0" class="mt-6">
|
|
504
|
-
<
|
|
505
|
-
class="mb-2 flex items-center gap-1.5 text-[11px] font-semibold uppercase tracking-wide text-muted"
|
|
506
|
-
>
|
|
505
|
+
<SectionLabel class="mb-2 flex items-center gap-1.5">
|
|
507
506
|
<UIcon name="i-lucide-shield-check" class="h-3.5 w-3.5" />
|
|
508
507
|
{{ t('spec.domainRules') }}
|
|
509
|
-
</
|
|
508
|
+
</SectionLabel>
|
|
510
509
|
<ul class="max-w-3xl space-y-1.5">
|
|
511
510
|
<li
|
|
512
511
|
v-for="rule in selectedGroup.rules ?? []"
|
|
513
512
|
:key="rule.id"
|
|
514
|
-
class="rounded-md border border-default bg-default/60 px-3 py-2 text-
|
|
513
|
+
class="rounded-md border border-default bg-default/60 px-3 py-2 text-sm text-toned"
|
|
515
514
|
>
|
|
516
515
|
{{ rule.rule }}
|
|
517
516
|
<span v-if="rule.rationale" class="text-dimmed">{{
|
|
@@ -549,7 +549,7 @@ const STATUS_KEYS: Record<BugHuntAnalysisStatus, string> = {
|
|
|
549
549
|
<p v-if="candidate.analysis?.rationale" class="text-xs text-toned">
|
|
550
550
|
{{ candidate.analysis.rationale }}
|
|
551
551
|
</p>
|
|
552
|
-
<div class="flex flex-wrap items-center gap-2 text-
|
|
552
|
+
<div class="flex flex-wrap items-center gap-2 text-2xs text-dimmed">
|
|
553
553
|
<span v-if="candidate.priority">{{ candidate.priority }}</span>
|
|
554
554
|
<span v-for="label in candidate.labels" :key="label">{{ label }}</span>
|
|
555
555
|
<span v-if="createdAtDate(candidate.createdAt)">
|
|
@@ -28,6 +28,7 @@ import {
|
|
|
28
28
|
reconcileSource,
|
|
29
29
|
sourceMenuItems,
|
|
30
30
|
} from '~/utils/sourcePicker'
|
|
31
|
+
import SectionLabel from '~/components/common/SectionLabel.vue'
|
|
31
32
|
|
|
32
33
|
const props = defineProps<{
|
|
33
34
|
/** contextKeys already staged by the caller, so they're filtered out / not re-offered. */
|
|
@@ -291,12 +292,9 @@ onMounted(() => {
|
|
|
291
292
|
promises a choice that isn't there. `id` labels the trigger, whose own content is the
|
|
292
293
|
tracker name rather than what that name means. -->
|
|
293
294
|
<div class="flex items-center gap-1.5">
|
|
294
|
-
<span
|
|
295
|
-
:id="sourceLabelId"
|
|
296
|
-
class="shrink-0 text-[11px] font-semibold uppercase tracking-wide text-dimmed"
|
|
297
|
-
>
|
|
295
|
+
<SectionLabel as="span" :id="sourceLabelId" class="shrink-0">
|
|
298
296
|
{{ t('tasks.picker.sourceLabel') }}
|
|
299
|
-
</
|
|
297
|
+
</SectionLabel>
|
|
300
298
|
<UDropdownMenu
|
|
301
299
|
v-if="sourcePickable"
|
|
302
300
|
:items="sourceMenu"
|
|
@@ -335,7 +333,7 @@ onMounted(() => {
|
|
|
335
333
|
@keydown.enter="refRow && pickRef(refRow)"
|
|
336
334
|
/>
|
|
337
335
|
|
|
338
|
-
<p v-if="searchError" class="px-1 text-
|
|
336
|
+
<p v-if="searchError" class="px-1 text-2xs text-app-warning-400">
|
|
339
337
|
{{ searchError }}
|
|
340
338
|
</p>
|
|
341
339
|
|
|
@@ -17,6 +17,7 @@ import type { PendingContext } from '~/composables/useContextLinking'
|
|
|
17
17
|
import { type AddSourceLabels, addChoicesOf, buildSourceChoices } from '~/utils/sourcePicker'
|
|
18
18
|
import ContextIssuePicker from '~/components/tasks/ContextIssuePicker.vue'
|
|
19
19
|
import IntegrationBackTitle from '~/components/layout/IntegrationBackTitle.vue'
|
|
20
|
+
import SectionLabel from '~/components/common/SectionLabel.vue'
|
|
20
21
|
|
|
21
22
|
const { t } = useI18n()
|
|
22
23
|
const ui = useUiStore()
|
|
@@ -183,9 +184,9 @@ async function doSpawnEpic() {
|
|
|
183
184
|
|
|
184
185
|
<!-- Secondary: spawn a parent/epic issue as a whole linked task group. -->
|
|
185
186
|
<div class="space-y-2 border-t border-default pt-3">
|
|
186
|
-
<
|
|
187
|
+
<SectionLabel as="span">
|
|
187
188
|
{{ t('tasks.import.asEpic') }}
|
|
188
|
-
</
|
|
189
|
+
</SectionLabel>
|
|
189
190
|
<div class="flex items-end gap-2">
|
|
190
191
|
<UFormField :label="descriptor?.refLabel ?? t('tasks.import.refLabel')" class="flex-1">
|
|
191
192
|
<UInput
|