@cat-factory/app 0.142.0 → 0.143.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/app/components/board/AddTaskModal.vue +137 -7
- package/app/stores/board.ts +2 -0
- package/i18n/locales/de.json +6 -1
- package/i18n/locales/en.json +6 -1
- package/i18n/locales/es.json +6 -1
- package/i18n/locales/fr.json +6 -1
- package/i18n/locales/he.json +6 -1
- package/i18n/locales/it.json +6 -1
- package/i18n/locales/ja.json +6 -1
- package/i18n/locales/pl.json +6 -1
- package/i18n/locales/tr.json +6 -1
- package/i18n/locales/uk.json +6 -1
- package/package.json +2 -2
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
2
|
// Create a new task on the board. The user names the task and writes its
|
|
3
|
-
// description themselves
|
|
3
|
+
// description themselves (a REVIEW task is the one exception — its title is optional
|
|
4
|
+
// and derived from the target PR when left blank, since the PR is the subject). The
|
|
4
5
|
// task lands in `planned` state; it is never launched here. The user starts a
|
|
5
6
|
// pipeline on it explicitly (and can keep editing it until they do).
|
|
6
7
|
//
|
|
@@ -19,10 +20,12 @@ import type {
|
|
|
19
20
|
TaskTypeFields,
|
|
20
21
|
} from '~/types/domain'
|
|
21
22
|
import { DOC_KINDS, DOC_KIND_FIELDS } from '~/types/domain'
|
|
23
|
+
import type { DropdownMenuItem } from '@nuxt/ui'
|
|
22
24
|
import ContextDocumentPicker from '~/components/documents/ContextDocumentPicker.vue'
|
|
23
25
|
import ContextIssuePicker from '~/components/tasks/ContextIssuePicker.vue'
|
|
24
26
|
import { riskPolicyOptionLabel, riskPolicySummary } from '~/utils/riskPolicy'
|
|
25
27
|
import { pipelineAllowedForManualStart } from '~/utils/pipeline'
|
|
28
|
+
import { buildFragmentPickerGroups } from '~/utils/fragmentPicker'
|
|
26
29
|
|
|
27
30
|
const ui = useUiStore()
|
|
28
31
|
const board = useBoardStore()
|
|
@@ -32,6 +35,8 @@ const riskPolicies = useRiskPoliciesStore()
|
|
|
32
35
|
const modelPresets = useModelPresetsStore()
|
|
33
36
|
const pipelines = usePipelinesStore()
|
|
34
37
|
const agentConfig = useAgentConfigStore()
|
|
38
|
+
const fragments = useFragmentsStore()
|
|
39
|
+
const accounts = useAccountsStore()
|
|
35
40
|
const toast = useToast()
|
|
36
41
|
const { t } = useI18n()
|
|
37
42
|
|
|
@@ -121,6 +126,12 @@ const docOutlineHints = ref('')
|
|
|
121
126
|
const reviewPrRef = ref('')
|
|
122
127
|
const reviewFocus = ref('')
|
|
123
128
|
|
|
129
|
+
// Best-practice prompt fragments the user pins on the task up front (folded into its agents
|
|
130
|
+
// on top of the service-level standards, exactly like the inspector's picker). Chosen from the
|
|
131
|
+
// resolved catalog, filtered to the enclosing frame's block type ("appropriate scope").
|
|
132
|
+
const fragmentIds = ref<string[]>([])
|
|
133
|
+
const isReview = computed(() => taskType.value === 'review')
|
|
134
|
+
|
|
124
135
|
// Parse the PR-reference input into the contract fields: a bare positive integer (optionally
|
|
125
136
|
// `#`-prefixed) becomes `prNumber` (a PR on the service's linked repo); anything else is taken
|
|
126
137
|
// as a full URL (`prUrl`). Returns undefined when blank or unparseable — the caller uses that
|
|
@@ -135,6 +146,21 @@ function parseReviewPrRef(raw: string): Pick<TaskTypeFields, 'prUrl' | 'prNumber
|
|
|
135
146
|
}
|
|
136
147
|
return { prUrl: trimmed }
|
|
137
148
|
}
|
|
149
|
+
|
|
150
|
+
// A review task doesn't require a title (the PR reference IS the subject), so when the user
|
|
151
|
+
// leaves it blank we derive a concise one from the parsed PR ref — `owner/repo#123` from a
|
|
152
|
+
// GitHub-style URL, else `#number`, else a bare label — so the board card still reads sensibly.
|
|
153
|
+
function deriveReviewTitle(raw: string): string {
|
|
154
|
+
const parsed = parseReviewPrRef(raw)
|
|
155
|
+
if (parsed?.prNumber)
|
|
156
|
+
return t('board.addTask.review.derivedTitle', { ref: `#${parsed.prNumber}` })
|
|
157
|
+
if (parsed?.prUrl) {
|
|
158
|
+
const m = /github\.com\/([^/]+)\/([^/]+)\/pull\/(\d+)/.exec(parsed.prUrl)
|
|
159
|
+
const refLabel = m ? `${m[1]}/${m[2]}#${m[3]}` : parsed.prUrl
|
|
160
|
+
return t('board.addTask.review.derivedTitle', { ref: refLabel })
|
|
161
|
+
}
|
|
162
|
+
return t('board.addTask.review.derivedTitleFallback')
|
|
163
|
+
}
|
|
138
164
|
// Per-kind specific fields (see DOC_KIND_FIELDS). Held in one keyed record; only the fields
|
|
139
165
|
// for the selected kind are shown and submitted, so a value from a previously-selected kind is
|
|
140
166
|
// never sent. The catalog keys below keep the labels/placeholders i18n and drift-guarded.
|
|
@@ -286,6 +312,52 @@ const selectedModelPresetLabel = computed(() => {
|
|
|
286
312
|
)
|
|
287
313
|
})
|
|
288
314
|
|
|
315
|
+
// ---- best-practice prompt fragments (pinned at creation) -------------------
|
|
316
|
+
// The fragments already chosen, resolved against the catalog. An id the catalog no longer
|
|
317
|
+
// resolves still renders (labelled by its raw id) so it stays visible and removable — mirrors
|
|
318
|
+
// the inspector's TaskStructure picker.
|
|
319
|
+
const selectedFragments = computed(() =>
|
|
320
|
+
fragmentIds.value.map((id) => fragments.getFragment(id) ?? { id, title: id, summary: '' }),
|
|
321
|
+
)
|
|
322
|
+
// A trailing group linking out to the fragment library (board tier always; account tier when
|
|
323
|
+
// enabled) — managing fragments is open to every member, exactly like the inspector picker.
|
|
324
|
+
const fragmentManageItems = computed<DropdownMenuItem[]>(() => {
|
|
325
|
+
const items: DropdownMenuItem[] = [
|
|
326
|
+
{
|
|
327
|
+
label: t('inspector.fragments.manageBoard'),
|
|
328
|
+
icon: 'i-lucide-book-marked',
|
|
329
|
+
onSelect: () => ui.openFragmentLibrary(),
|
|
330
|
+
},
|
|
331
|
+
]
|
|
332
|
+
if (accounts.enabled) {
|
|
333
|
+
items.push({
|
|
334
|
+
label: t('inspector.fragments.manageAccount'),
|
|
335
|
+
icon: 'i-lucide-users',
|
|
336
|
+
onSelect: () => ui.openAccountSettings('fragments'),
|
|
337
|
+
})
|
|
338
|
+
}
|
|
339
|
+
return items
|
|
340
|
+
})
|
|
341
|
+
// Picker menu: fragments appropriate to the enclosing frame's block type (the "scope"), not
|
|
342
|
+
// already selected, grouped by category, with the management links appended as the final group.
|
|
343
|
+
// Falls back to `service` before a frame resolves so the catalog is still browsable.
|
|
344
|
+
const fragmentMenu = computed<DropdownMenuItem[][]>(() => {
|
|
345
|
+
const selected = new Set(fragmentIds.value)
|
|
346
|
+
return [
|
|
347
|
+
...buildFragmentPickerGroups(
|
|
348
|
+
fragments.forBlockType(frame.value?.type ?? 'service'),
|
|
349
|
+
(id) => selected.has(id),
|
|
350
|
+
(id) => {
|
|
351
|
+
if (!fragmentIds.value.includes(id)) fragmentIds.value = [...fragmentIds.value, id]
|
|
352
|
+
},
|
|
353
|
+
),
|
|
354
|
+
fragmentManageItems.value,
|
|
355
|
+
]
|
|
356
|
+
})
|
|
357
|
+
function removeFragment(id: string) {
|
|
358
|
+
fragmentIds.value = fragmentIds.value.filter((x) => x !== id)
|
|
359
|
+
}
|
|
360
|
+
|
|
289
361
|
// Hide UI-testing pipelines (`tester-ui` / `visual-confirmation`) when the target frame has no
|
|
290
362
|
// UI to exercise — they'd be refused server-side (see utils/pipeline + the backend gate). Also
|
|
291
363
|
// hide `'recurring'`-only pipelines (a one-off task start of one is refused at run start) and,
|
|
@@ -471,6 +543,7 @@ watch(open, (isOpen) => {
|
|
|
471
543
|
docOutlineHints.value = ''
|
|
472
544
|
reviewPrRef.value = ''
|
|
473
545
|
reviewFocus.value = ''
|
|
546
|
+
fragmentIds.value = []
|
|
474
547
|
for (const key of Object.keys(docKindFieldValues) as DocKindFieldKey[])
|
|
475
548
|
delete docKindFieldValues[key]
|
|
476
549
|
riskPolicyId.value = ''
|
|
@@ -494,6 +567,8 @@ watch(open, (isOpen) => {
|
|
|
494
567
|
}
|
|
495
568
|
documents.loadDocuments().catch(() => {})
|
|
496
569
|
tasks.loadTasks().catch(() => {})
|
|
570
|
+
// Load the best-practice fragment catalog so the picker is populated (no-op while current).
|
|
571
|
+
fragments.ensureLoaded().catch(() => {})
|
|
497
572
|
// Fetch any staged search-hit issue's body so its description shows read-only below.
|
|
498
573
|
resolvePendingIssueBodies().catch(() => {})
|
|
499
574
|
})
|
|
@@ -526,6 +601,7 @@ const { requestClose } = useUnsavedGuard({
|
|
|
526
601
|
modelPresetId: modelPresetId.value,
|
|
527
602
|
pipelineId: pipelineId.value,
|
|
528
603
|
agentConfig: { ...agentConfigValues.value },
|
|
604
|
+
fragmentIds: [...fragmentIds.value],
|
|
529
605
|
context: pendingContext.value.map(contextKey),
|
|
530
606
|
}),
|
|
531
607
|
})
|
|
@@ -539,8 +615,10 @@ const RALPH_VALIDATION_COMMAND_ID = 'ralph.validationCommand'
|
|
|
539
615
|
|
|
540
616
|
const canAdd = computed(() => {
|
|
541
617
|
if (isRecurring.value) return recurringFrameId.value !== null
|
|
618
|
+
// A review task doesn't require a title (the PR reference is the subject — we derive one),
|
|
619
|
+
// so it only needs a valid target PR. Every other type still requires a title.
|
|
620
|
+
if (isReview.value) return parseReviewPrRef(reviewPrRef.value) !== undefined
|
|
542
621
|
if (title.value.trim().length === 0) return false
|
|
543
|
-
if (taskType.value === 'review' && !parseReviewPrRef(reviewPrRef.value)) return false
|
|
544
622
|
if (
|
|
545
623
|
taskType.value === 'ralph' &&
|
|
546
624
|
configValue(RALPH_VALIDATION_COMMAND_ID, '').trim().length === 0
|
|
@@ -571,15 +649,21 @@ async function add() {
|
|
|
571
649
|
const fullDescription =
|
|
572
650
|
[...linkedIssueBodies.value.map((b) => b.body), notes].filter(Boolean).join('\n\n') ||
|
|
573
651
|
undefined
|
|
574
|
-
|
|
652
|
+
// A review task's title is optional; when blank we derive one from the PR reference so the
|
|
653
|
+
// board card still reads sensibly (the backend also folds the PR ref into the description).
|
|
654
|
+
const effectiveTitle =
|
|
655
|
+
title.value.trim() || (isReview.value ? deriveReviewTitle(reviewPrRef.value) : '')
|
|
656
|
+
const block = await board.addTask(containerId, effectiveTitle, fullDescription, {
|
|
575
657
|
taskType: taskType.value as CreateTaskType,
|
|
576
658
|
...(typeFields ? { taskTypeFields: typeFields } : {}),
|
|
577
|
-
|
|
659
|
+
// A review task merges nothing, so its risk (merge) policy is meaningless — never send it.
|
|
660
|
+
...(riskPolicyId.value && !isReview.value ? { riskPolicyId: riskPolicyId.value } : {}),
|
|
578
661
|
...(modelPresetId.value ? { modelPresetId: modelPresetId.value } : {}),
|
|
579
662
|
...(pipelineId.value ? { pipelineId: pipelineId.value } : {}),
|
|
580
663
|
...(Object.keys(agentConfigValues.value).length
|
|
581
664
|
? { agentConfig: agentConfigValues.value }
|
|
582
665
|
: {}),
|
|
666
|
+
...(fragmentIds.value.length ? { fragmentIds: [...fragmentIds.value] } : {}),
|
|
583
667
|
...(technical.value ? { technical: true } : {}),
|
|
584
668
|
})
|
|
585
669
|
if (block) {
|
|
@@ -648,11 +732,19 @@ async function add() {
|
|
|
648
732
|
</div>
|
|
649
733
|
|
|
650
734
|
<template v-if="!isRecurring">
|
|
651
|
-
<UFormField
|
|
735
|
+
<UFormField
|
|
736
|
+
:label="t('board.addTask.titleField')"
|
|
737
|
+
:required="!isReview"
|
|
738
|
+
:hint="isReview ? t('board.addTask.optional') : undefined"
|
|
739
|
+
>
|
|
652
740
|
<UInput
|
|
653
741
|
v-model="title"
|
|
654
742
|
data-testid="add-task-title"
|
|
655
|
-
:placeholder="
|
|
743
|
+
:placeholder="
|
|
744
|
+
isReview
|
|
745
|
+
? t('board.addTask.titlePlaceholderReview')
|
|
746
|
+
: t('board.addTask.titlePlaceholder')
|
|
747
|
+
"
|
|
656
748
|
autofocus
|
|
657
749
|
class="w-full"
|
|
658
750
|
@keydown.enter="add"
|
|
@@ -905,7 +997,8 @@ async function add() {
|
|
|
905
997
|
/>
|
|
906
998
|
</UFormField>
|
|
907
999
|
|
|
908
|
-
|
|
1000
|
+
<!-- A review task merges nothing, so its risk (merge) policy is meaningless — omit it. -->
|
|
1001
|
+
<UFormField v-if="!isReview" :label="t('board.addTask.mergePolicy')">
|
|
909
1002
|
<UDropdownMenu :items="presetMenu" class="w-full">
|
|
910
1003
|
<UButton
|
|
911
1004
|
color="neutral"
|
|
@@ -967,6 +1060,43 @@ async function add() {
|
|
|
967
1060
|
</div>
|
|
968
1061
|
</div>
|
|
969
1062
|
|
|
1063
|
+
<!-- Best-practice fragments pinned on the task at creation, scoped to the frame's type. -->
|
|
1064
|
+
<div class="space-y-2">
|
|
1065
|
+
<div class="flex items-center justify-between">
|
|
1066
|
+
<span class="text-[11px] font-semibold uppercase tracking-wide text-slate-400">
|
|
1067
|
+
{{ t('board.addTask.bestPractices') }}
|
|
1068
|
+
</span>
|
|
1069
|
+
<UDropdownMenu :items="fragmentMenu">
|
|
1070
|
+
<UButton
|
|
1071
|
+
color="neutral"
|
|
1072
|
+
variant="soft"
|
|
1073
|
+
size="xs"
|
|
1074
|
+
icon="i-lucide-plus"
|
|
1075
|
+
trailing-icon="i-lucide-chevron-down"
|
|
1076
|
+
>
|
|
1077
|
+
{{ t('board.addTask.attach') }}
|
|
1078
|
+
</UButton>
|
|
1079
|
+
</UDropdownMenu>
|
|
1080
|
+
</div>
|
|
1081
|
+
<div v-if="selectedFragments.length" class="flex flex-wrap gap-1">
|
|
1082
|
+
<UBadge
|
|
1083
|
+
v-for="f in selectedFragments"
|
|
1084
|
+
:key="f.id"
|
|
1085
|
+
color="primary"
|
|
1086
|
+
variant="subtle"
|
|
1087
|
+
size="sm"
|
|
1088
|
+
class="cursor-pointer"
|
|
1089
|
+
:title="f.summary"
|
|
1090
|
+
@click="removeFragment(f.id)"
|
|
1091
|
+
>
|
|
1092
|
+
{{ f.title }}<UIcon name="i-lucide-x" class="ms-0.5 h-3 w-3" />
|
|
1093
|
+
</UBadge>
|
|
1094
|
+
</div>
|
|
1095
|
+
<p v-else class="text-[11px] text-slate-500">
|
|
1096
|
+
{{ t('board.addTask.bestPracticesHint') }}
|
|
1097
|
+
</p>
|
|
1098
|
+
</div>
|
|
1099
|
+
|
|
970
1100
|
<!-- Context documents (ungated; Attach disabled until a source is connected). -->
|
|
971
1101
|
<div class="space-y-2">
|
|
972
1102
|
<div class="flex items-center justify-between">
|
package/app/stores/board.ts
CHANGED
|
@@ -227,6 +227,7 @@ export const useBoardStore = defineStore('board', () => {
|
|
|
227
227
|
modelPresetId?: string
|
|
228
228
|
pipelineId?: string
|
|
229
229
|
agentConfig?: Record<string, string>
|
|
230
|
+
fragmentIds?: string[]
|
|
230
231
|
technical?: boolean
|
|
231
232
|
},
|
|
232
233
|
): Promise<Block | undefined> {
|
|
@@ -240,6 +241,7 @@ export const useBoardStore = defineStore('board', () => {
|
|
|
240
241
|
...(options?.modelPresetId ? { modelPresetId: options.modelPresetId } : {}),
|
|
241
242
|
...(options?.pipelineId ? { pipelineId: options.pipelineId } : {}),
|
|
242
243
|
...(options?.agentConfig ? { agentConfig: options.agentConfig } : {}),
|
|
244
|
+
...(options?.fragmentIds?.length ? { fragmentIds: options.fragmentIds } : {}),
|
|
243
245
|
...(options?.technical ? { technical: true } : {}),
|
|
244
246
|
})
|
|
245
247
|
upsert(block)
|
package/i18n/locales/de.json
CHANGED
|
@@ -2084,6 +2084,7 @@
|
|
|
2084
2084
|
"recurringNoFrame": "Eine wiederkehrende Aufgabe muss auf einem Service liegen. Fügen Sie sie aus einem Service-Frame (oder einem darin enthaltenen Modul) hinzu.",
|
|
2085
2085
|
"titleField": "Titel",
|
|
2086
2086
|
"titlePlaceholder": "Was muss getan werden?",
|
|
2087
|
+
"titlePlaceholderReview": "Optional – wird aus dem Pull Request abgeleitet",
|
|
2087
2088
|
"issueIncluded": "{title} (aus Issue, enthalten)",
|
|
2088
2089
|
"loadingIssue": "Beschreibung des verknüpften Issues wird geladen…",
|
|
2089
2090
|
"additionalNotes": "Zusätzliche Notizen",
|
|
@@ -2172,6 +2173,8 @@
|
|
|
2172
2173
|
"defaultPreset": "Standard ({name}) — {thresholds}",
|
|
2173
2174
|
"defaultModelPreset": "Standard ({name})",
|
|
2174
2175
|
"modelPreset": "Modell-Preset",
|
|
2176
|
+
"bestPractices": "Best Practices",
|
|
2177
|
+
"bestPracticesHint": "Best-Practice-Fragmente anheften, damit die Agenten dieser Aufgabe sie zusätzlich zu den Standards auf Service-Ebene befolgen.",
|
|
2175
2178
|
"agentConfiguration": "Agent-Konfiguration",
|
|
2176
2179
|
"contextDocuments": "Kontextdokumente",
|
|
2177
2180
|
"contextIssues": "Kontext-Issues",
|
|
@@ -2195,7 +2198,9 @@
|
|
|
2195
2198
|
"prUrl": "Pull Request",
|
|
2196
2199
|
"prUrlHint": "URL oder Nummer des zu prüfenden Pull Requests",
|
|
2197
2200
|
"focus": "Prüfungsschwerpunkt",
|
|
2198
|
-
"focusPlaceholder": "z. B. Fokus auf die Auth-Änderungen und Fehlerbehandlung"
|
|
2201
|
+
"focusPlaceholder": "z. B. Fokus auf die Auth-Änderungen und Fehlerbehandlung",
|
|
2202
|
+
"derivedTitle": "{ref} prüfen",
|
|
2203
|
+
"derivedTitleFallback": "Pull Request prüfen"
|
|
2199
2204
|
}
|
|
2200
2205
|
},
|
|
2201
2206
|
"recurring": {
|
package/i18n/locales/en.json
CHANGED
|
@@ -203,6 +203,7 @@
|
|
|
203
203
|
"recurringNoFrame": "A recurring task must live on a service. Add it from a service frame (or a module inside one).",
|
|
204
204
|
"titleField": "Title",
|
|
205
205
|
"titlePlaceholder": "What needs to be done?",
|
|
206
|
+
"titlePlaceholderReview": "Optional — derived from the pull request",
|
|
206
207
|
"issueIncluded": "{title} (from issue, included)",
|
|
207
208
|
"loadingIssue": "Loading the linked issue's description…",
|
|
208
209
|
"additionalNotes": "Additional notes",
|
|
@@ -291,6 +292,8 @@
|
|
|
291
292
|
"defaultPreset": "Default ({name}) — {thresholds}",
|
|
292
293
|
"defaultModelPreset": "Default ({name})",
|
|
293
294
|
"modelPreset": "Model preset",
|
|
295
|
+
"bestPractices": "Best practices",
|
|
296
|
+
"bestPracticesHint": "Pin best-practice fragments so this task's agents follow them, on top of the service-level standards.",
|
|
294
297
|
"agentConfiguration": "Agent configuration",
|
|
295
298
|
"contextDocuments": "Context documents",
|
|
296
299
|
"contextIssues": "Context issues",
|
|
@@ -317,7 +320,9 @@
|
|
|
317
320
|
"prUrl": "Pull request",
|
|
318
321
|
"prUrlHint": "URL or number of the pull request to review",
|
|
319
322
|
"focus": "Review focus",
|
|
320
|
-
"focusPlaceholder": "e.g. focus on the auth changes and error handling"
|
|
323
|
+
"focusPlaceholder": "e.g. focus on the auth changes and error handling",
|
|
324
|
+
"derivedTitle": "Review {ref}",
|
|
325
|
+
"derivedTitleFallback": "Review pull request"
|
|
321
326
|
}
|
|
322
327
|
},
|
|
323
328
|
"recurring": {
|
package/i18n/locales/es.json
CHANGED
|
@@ -182,6 +182,7 @@
|
|
|
182
182
|
"recurringNoFrame": "Una tarea recurrente debe vivir en un servicio. Añádela desde un marco de servicio (o un módulo dentro de él).",
|
|
183
183
|
"titleField": "Título",
|
|
184
184
|
"titlePlaceholder": "¿Qué hay que hacer?",
|
|
185
|
+
"titlePlaceholderReview": "Opcional: se deriva de la pull request",
|
|
185
186
|
"issueIncluded": "{title} (de la incidencia, incluida)",
|
|
186
187
|
"loadingIssue": "Cargando la descripción de la incidencia vinculada…",
|
|
187
188
|
"additionalNotes": "Notas adicionales",
|
|
@@ -270,6 +271,8 @@
|
|
|
270
271
|
"defaultPreset": "Predeterminado ({name}): {thresholds}",
|
|
271
272
|
"defaultModelPreset": "Predeterminado ({name})",
|
|
272
273
|
"modelPreset": "Preset de modelo",
|
|
274
|
+
"bestPractices": "Buenas prácticas",
|
|
275
|
+
"bestPracticesHint": "Fija fragmentos de buenas prácticas para que los agentes de esta tarea los sigan, además de los estándares del servicio.",
|
|
273
276
|
"agentConfiguration": "Configuración del agente",
|
|
274
277
|
"contextDocuments": "Documentos de contexto",
|
|
275
278
|
"contextIssues": "Incidencias de contexto",
|
|
@@ -293,7 +296,9 @@
|
|
|
293
296
|
"prUrl": "Pull request",
|
|
294
297
|
"prUrlHint": "URL o número de la pull request a revisar",
|
|
295
298
|
"focus": "Enfoque de la revisión",
|
|
296
|
-
"focusPlaceholder": "p. ej., céntrate en los cambios de autenticación y el manejo de errores"
|
|
299
|
+
"focusPlaceholder": "p. ej., céntrate en los cambios de autenticación y el manejo de errores",
|
|
300
|
+
"derivedTitle": "Revisar {ref}",
|
|
301
|
+
"derivedTitleFallback": "Revisar la pull request"
|
|
297
302
|
}
|
|
298
303
|
},
|
|
299
304
|
"recurring": {
|
package/i18n/locales/fr.json
CHANGED
|
@@ -182,6 +182,7 @@
|
|
|
182
182
|
"recurringNoFrame": "Une tâche récurrente doit appartenir à un service. Ajoutez-la depuis un cadre de service (ou un module à l’intérieur).",
|
|
183
183
|
"titleField": "Titre",
|
|
184
184
|
"titlePlaceholder": "Que faut-il faire ?",
|
|
185
|
+
"titlePlaceholderReview": "Facultatif — dérivé de la pull request",
|
|
185
186
|
"issueIncluded": "{title} (depuis le ticket, incluse)",
|
|
186
187
|
"loadingIssue": "Chargement de la description du ticket lié…",
|
|
187
188
|
"additionalNotes": "Notes supplémentaires",
|
|
@@ -270,6 +271,8 @@
|
|
|
270
271
|
"defaultPreset": "Par défaut ({name}) : {thresholds}",
|
|
271
272
|
"defaultModelPreset": "Par défaut ({name})",
|
|
272
273
|
"modelPreset": "Préréglage de modèle",
|
|
274
|
+
"bestPractices": "Bonnes pratiques",
|
|
275
|
+
"bestPracticesHint": "Épinglez des fragments de bonnes pratiques pour que les agents de cette tâche les suivent, en plus des standards au niveau du service.",
|
|
273
276
|
"agentConfiguration": "Configuration de l’agent",
|
|
274
277
|
"contextDocuments": "Documents de contexte",
|
|
275
278
|
"contextIssues": "Tickets de contexte",
|
|
@@ -293,7 +296,9 @@
|
|
|
293
296
|
"prUrl": "Pull request",
|
|
294
297
|
"prUrlHint": "URL ou numéro de la pull request à examiner",
|
|
295
298
|
"focus": "Objet de la revue",
|
|
296
|
-
"focusPlaceholder": "p. ex. concentrez-vous sur les changements d'authentification et la gestion des erreurs"
|
|
299
|
+
"focusPlaceholder": "p. ex. concentrez-vous sur les changements d'authentification et la gestion des erreurs",
|
|
300
|
+
"derivedTitle": "Examiner {ref}",
|
|
301
|
+
"derivedTitleFallback": "Examiner la pull request"
|
|
297
302
|
}
|
|
298
303
|
},
|
|
299
304
|
"recurring": {
|
package/i18n/locales/he.json
CHANGED
|
@@ -182,6 +182,7 @@
|
|
|
182
182
|
"recurringNoFrame": "משימה מחזורית חייבת להתקיים על שירות. הוסף אותה ממסגרת שירות (או ממודול בתוכה).",
|
|
183
183
|
"titleField": "כותרת",
|
|
184
184
|
"titlePlaceholder": "מה צריך לעשות?",
|
|
185
|
+
"titlePlaceholderReview": "אופציונלי — נגזר מבקשת המשיכה",
|
|
185
186
|
"issueIncluded": "{title} (מהאישיו, כלול)",
|
|
186
187
|
"loadingIssue": "טוען את תיאור האישיו המקושר…",
|
|
187
188
|
"additionalNotes": "הערות נוספות",
|
|
@@ -270,6 +271,8 @@
|
|
|
270
271
|
"defaultPreset": "ברירת מחדל ({name}) — {thresholds}",
|
|
271
272
|
"defaultModelPreset": "ברירת מחדל ({name})",
|
|
272
273
|
"modelPreset": "הגדרה קבועה של מודל",
|
|
274
|
+
"bestPractices": "מומלצות עבודה",
|
|
275
|
+
"bestPracticesHint": "הצמידו מקטעי מומלצות עבודה כדי שסוכני המשימה יפעלו לפיהם, בנוסף לסטנדרטים ברמת השירות.",
|
|
273
276
|
"agentConfiguration": "תצורת סוכן",
|
|
274
277
|
"contextDocuments": "מסמכי הקשר",
|
|
275
278
|
"contextIssues": "אישיו הקשר",
|
|
@@ -293,7 +296,9 @@
|
|
|
293
296
|
"prUrl": "בקשת משיכה",
|
|
294
297
|
"prUrlHint": "כתובת או מספר של בקשת המשיכה לסקירה",
|
|
295
298
|
"focus": "מוקד הסקירה",
|
|
296
|
-
"focusPlaceholder": "לדוגמה, להתמקד בשינויי האימות ובטיפול בשגיאות"
|
|
299
|
+
"focusPlaceholder": "לדוגמה, להתמקד בשינויי האימות ובטיפול בשגיאות",
|
|
300
|
+
"derivedTitle": "סקירת {ref}",
|
|
301
|
+
"derivedTitleFallback": "סקירת בקשת המשיכה"
|
|
297
302
|
}
|
|
298
303
|
},
|
|
299
304
|
"recurring": {
|
package/i18n/locales/it.json
CHANGED
|
@@ -2084,6 +2084,7 @@
|
|
|
2084
2084
|
"recurringNoFrame": "Un'attività ricorrente deve risiedere su un servizio. Aggiungila da un frame di servizio (o da un modulo al suo interno).",
|
|
2085
2085
|
"titleField": "Titolo",
|
|
2086
2086
|
"titlePlaceholder": "Cosa bisogna fare?",
|
|
2087
|
+
"titlePlaceholderReview": "Facoltativo — derivato dalla pull request",
|
|
2087
2088
|
"issueIncluded": "{title} (dall'issue, incluso)",
|
|
2088
2089
|
"loadingIssue": "Caricamento della descrizione dell'issue collegata…",
|
|
2089
2090
|
"additionalNotes": "Note aggiuntive",
|
|
@@ -2172,6 +2173,8 @@
|
|
|
2172
2173
|
"defaultPreset": "Predefinito ({name}) — {thresholds}",
|
|
2173
2174
|
"defaultModelPreset": "Predefinito ({name})",
|
|
2174
2175
|
"modelPreset": "Preset di modello",
|
|
2176
|
+
"bestPractices": "Best practice",
|
|
2177
|
+
"bestPracticesHint": "Fissa i frammenti di best practice affinché gli agenti di questa attività li seguano, oltre agli standard a livello di servizio.",
|
|
2175
2178
|
"agentConfiguration": "Configurazione dell'agente",
|
|
2176
2179
|
"contextDocuments": "Documenti di contesto",
|
|
2177
2180
|
"contextIssues": "Issue di contesto",
|
|
@@ -2195,7 +2198,9 @@
|
|
|
2195
2198
|
"prUrl": "Pull request",
|
|
2196
2199
|
"prUrlHint": "URL o numero della pull request da revisionare",
|
|
2197
2200
|
"focus": "Focus della revisione",
|
|
2198
|
-
"focusPlaceholder": "es. concentrati sulle modifiche di autenticazione e sulla gestione degli errori"
|
|
2201
|
+
"focusPlaceholder": "es. concentrati sulle modifiche di autenticazione e sulla gestione degli errori",
|
|
2202
|
+
"derivedTitle": "Rivedi {ref}",
|
|
2203
|
+
"derivedTitleFallback": "Rivedi la pull request"
|
|
2199
2204
|
}
|
|
2200
2205
|
},
|
|
2201
2206
|
"recurring": {
|
package/i18n/locales/ja.json
CHANGED
|
@@ -182,6 +182,7 @@
|
|
|
182
182
|
"recurringNoFrame": "繰り返しタスクはサービス上に配置する必要があります。サービスフレーム(またはその中のモジュール)から追加してください。",
|
|
183
183
|
"titleField": "タイトル",
|
|
184
184
|
"titlePlaceholder": "何を実施する必要がありますか?",
|
|
185
|
+
"titlePlaceholderReview": "任意 — プルリクエストから生成されます",
|
|
185
186
|
"issueIncluded": "{title}(issue から、含む)",
|
|
186
187
|
"loadingIssue": "リンクされた issue の説明を読み込み中…",
|
|
187
188
|
"additionalNotes": "追加メモ",
|
|
@@ -270,6 +271,8 @@
|
|
|
270
271
|
"defaultPreset": "既定({name})— {thresholds}",
|
|
271
272
|
"defaultModelPreset": "既定({name})",
|
|
272
273
|
"modelPreset": "モデルプリセット",
|
|
274
|
+
"bestPractices": "ベストプラクティス",
|
|
275
|
+
"bestPracticesHint": "サービスレベルの標準に加えて、このタスクのエージェントが従うようにベストプラクティスのフラグメントを固定します。",
|
|
273
276
|
"agentConfiguration": "エージェント設定",
|
|
274
277
|
"contextDocuments": "コンテキストドキュメント",
|
|
275
278
|
"contextIssues": "コンテキスト issue",
|
|
@@ -293,7 +296,9 @@
|
|
|
293
296
|
"prUrl": "プルリクエスト",
|
|
294
297
|
"prUrlHint": "レビュー対象のプルリクエストのURLまたは番号",
|
|
295
298
|
"focus": "レビューの重点",
|
|
296
|
-
"focusPlaceholder": "例: 認証の変更とエラー処理に注目"
|
|
299
|
+
"focusPlaceholder": "例: 認証の変更とエラー処理に注目",
|
|
300
|
+
"derivedTitle": "{ref} をレビュー",
|
|
301
|
+
"derivedTitleFallback": "プルリクエストをレビュー"
|
|
297
302
|
}
|
|
298
303
|
},
|
|
299
304
|
"recurring": {
|
package/i18n/locales/pl.json
CHANGED
|
@@ -182,6 +182,7 @@
|
|
|
182
182
|
"recurringNoFrame": "Zadanie cykliczne musi należeć do usługi. Dodaj je z ramki usługi (lub modułu w jej obrębie).",
|
|
183
183
|
"titleField": "Tytuł",
|
|
184
184
|
"titlePlaceholder": "Co trzeba zrobić?",
|
|
185
|
+
"titlePlaceholderReview": "Opcjonalnie — tworzony na podstawie pull requesta",
|
|
185
186
|
"issueIncluded": "{title} (ze zgłoszenia, dołączone)",
|
|
186
187
|
"loadingIssue": "Wczytywanie opisu powiązanego zgłoszenia…",
|
|
187
188
|
"additionalNotes": "Dodatkowe uwagi",
|
|
@@ -270,6 +271,8 @@
|
|
|
270
271
|
"defaultPreset": "Domyślny ({name}): {thresholds}",
|
|
271
272
|
"defaultModelPreset": "Domyślny ({name})",
|
|
272
273
|
"modelPreset": "Preset modelu",
|
|
274
|
+
"bestPractices": "Dobre praktyki",
|
|
275
|
+
"bestPracticesHint": "Przypnij fragmenty dobrych praktyk, aby agenci tego zadania stosowali je oprócz standardów na poziomie usługi.",
|
|
273
276
|
"agentConfiguration": "Konfiguracja agenta",
|
|
274
277
|
"contextDocuments": "Dokumenty kontekstu",
|
|
275
278
|
"contextIssues": "Zgłoszenia kontekstu",
|
|
@@ -293,7 +296,9 @@
|
|
|
293
296
|
"prUrl": "Pull request",
|
|
294
297
|
"prUrlHint": "URL lub numer pull requesta do przeglądu",
|
|
295
298
|
"focus": "Zakres przeglądu",
|
|
296
|
-
"focusPlaceholder": "np. skup się na zmianach uwierzytelniania i obsłudze błędów"
|
|
299
|
+
"focusPlaceholder": "np. skup się na zmianach uwierzytelniania i obsłudze błędów",
|
|
300
|
+
"derivedTitle": "Przegląd {ref}",
|
|
301
|
+
"derivedTitleFallback": "Przegląd pull requesta"
|
|
297
302
|
}
|
|
298
303
|
},
|
|
299
304
|
"recurring": {
|
package/i18n/locales/tr.json
CHANGED
|
@@ -182,6 +182,7 @@
|
|
|
182
182
|
"recurringNoFrame": "Yinelenen bir görev bir serviste bulunmalıdır. Bir servis çerçevesinden (veya içindeki bir modülden) ekleyin.",
|
|
183
183
|
"titleField": "Başlık",
|
|
184
184
|
"titlePlaceholder": "Ne yapılması gerekiyor?",
|
|
185
|
+
"titlePlaceholderReview": "İsteğe bağlı — pull request'ten türetilir",
|
|
185
186
|
"issueIncluded": "{title} (sorundan, dahil edildi)",
|
|
186
187
|
"loadingIssue": "Bağlantılı sorunun açıklaması yükleniyor…",
|
|
187
188
|
"additionalNotes": "Ek notlar",
|
|
@@ -270,6 +271,8 @@
|
|
|
270
271
|
"defaultPreset": "Varsayılan ({name}) — {thresholds}",
|
|
271
272
|
"defaultModelPreset": "Varsayılan ({name})",
|
|
272
273
|
"modelPreset": "Model ön ayarı",
|
|
274
|
+
"bestPractices": "En iyi uygulamalar",
|
|
275
|
+
"bestPracticesHint": "Bu görevin ajanlarının hizmet düzeyindeki standartlara ek olarak uygulaması için en iyi uygulama parçacıklarını sabitleyin.",
|
|
273
276
|
"agentConfiguration": "Ajan yapılandırması",
|
|
274
277
|
"contextDocuments": "Bağlam belgeleri",
|
|
275
278
|
"contextIssues": "Bağlam sorunları",
|
|
@@ -293,7 +296,9 @@
|
|
|
293
296
|
"prUrl": "Pull request",
|
|
294
297
|
"prUrlHint": "İncelenecek pull request'in URL'si veya numarası",
|
|
295
298
|
"focus": "İnceleme odağı",
|
|
296
|
-
"focusPlaceholder": "örn. kimlik doğrulama değişikliklerine ve hata yönetimine odaklan"
|
|
299
|
+
"focusPlaceholder": "örn. kimlik doğrulama değişikliklerine ve hata yönetimine odaklan",
|
|
300
|
+
"derivedTitle": "{ref} incele",
|
|
301
|
+
"derivedTitleFallback": "Pull request'i incele"
|
|
297
302
|
}
|
|
298
303
|
},
|
|
299
304
|
"recurring": {
|
package/i18n/locales/uk.json
CHANGED
|
@@ -182,6 +182,7 @@
|
|
|
182
182
|
"recurringNoFrame": "Періодичне завдання має належати сервісу. Додайте його з рамки сервісу (або модуля всередині неї).",
|
|
183
183
|
"titleField": "Назва",
|
|
184
184
|
"titlePlaceholder": "Що потрібно зробити?",
|
|
185
|
+
"titlePlaceholderReview": "Необов’язково — формується з pull request",
|
|
185
186
|
"issueIncluded": "{title} (зі звернення, включено)",
|
|
186
187
|
"loadingIssue": "Завантаження опису пов’язаного звернення…",
|
|
187
188
|
"additionalNotes": "Додаткові примітки",
|
|
@@ -270,6 +271,8 @@
|
|
|
270
271
|
"defaultPreset": "Типовий ({name}): {thresholds}",
|
|
271
272
|
"defaultModelPreset": "Типовий ({name})",
|
|
272
273
|
"modelPreset": "Пресет моделі",
|
|
274
|
+
"bestPractices": "Найкращі практики",
|
|
275
|
+
"bestPracticesHint": "Закріпіть фрагменти найкращих практик, щоб агенти цього завдання дотримувалися їх додатково до стандартів рівня сервісу.",
|
|
273
276
|
"agentConfiguration": "Налаштування агента",
|
|
274
277
|
"contextDocuments": "Документи контексту",
|
|
275
278
|
"contextIssues": "Звернення контексту",
|
|
@@ -293,7 +296,9 @@
|
|
|
293
296
|
"prUrl": "Pull request",
|
|
294
297
|
"prUrlHint": "URL або номер pull request для огляду",
|
|
295
298
|
"focus": "Фокус огляду",
|
|
296
|
-
"focusPlaceholder": "напр. зосередься на змінах автентифікації та обробці помилок"
|
|
299
|
+
"focusPlaceholder": "напр. зосередься на змінах автентифікації та обробці помилок",
|
|
300
|
+
"derivedTitle": "Огляд {ref}",
|
|
301
|
+
"derivedTitleFallback": "Огляд pull request"
|
|
297
302
|
}
|
|
298
303
|
},
|
|
299
304
|
"recurring": {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cat-factory/app",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.143.0",
|
|
4
4
|
"description": "Reusable Nuxt layer for the Agent Architecture Board SPA (components, stores, composables, pages). Consume it from a thin deployment app via `extends: ['@cat-factory/app']` and point it at your backend with NUXT_PUBLIC_API_BASE. See deploy/frontend for an example.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"valibot": "^1.4.2",
|
|
41
41
|
"vue": "3.5.40",
|
|
42
42
|
"wretch": "^3.0.9",
|
|
43
|
-
"@cat-factory/contracts": "0.
|
|
43
|
+
"@cat-factory/contracts": "0.152.0"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
46
|
"@toad-contracts/testing": "0.3.2",
|