@cat-factory/app 0.116.10 → 0.117.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.
@@ -76,6 +76,11 @@ const TASK_TYPES = computed<{ value: TaskTypeChoice; label: string; icon: string
76
76
  { value: 'bug', label: t('board.addTask.types.bug'), icon: 'i-lucide-bug' },
77
77
  { value: 'document', label: t('board.addTask.types.document'), icon: 'i-lucide-file-text' },
78
78
  { value: 'spike', label: t('board.addTask.types.spike'), icon: 'i-lucide-flask-conical' },
79
+ {
80
+ value: 'review',
81
+ label: t('board.addTask.types.review'),
82
+ icon: 'i-lucide-clipboard-check',
83
+ },
79
84
  { value: 'recurring', label: t('board.addTask.types.recurring'), icon: 'i-lucide-repeat' },
80
85
  ]
81
86
  // A document repository only accepts document/spike tasks (see BoardService.addTask).
@@ -103,6 +108,25 @@ const docKind = ref<DocKind | ''>('')
103
108
  const docAudience = ref('')
104
109
  const docTargetPath = ref('')
105
110
  const docOutlineHints = ref('')
111
+ // Review-task fields: the target PR (entered as a full URL or a bare #number) + optional
112
+ // review focus. The single input is parsed into the contract's `prUrl`/`prNumber` fields.
113
+ const reviewPrRef = ref('')
114
+ const reviewFocus = ref('')
115
+
116
+ // Parse the PR-reference input into the contract fields: a bare positive integer (optionally
117
+ // `#`-prefixed) becomes `prNumber` (a PR on the service's linked repo); anything else is taken
118
+ // as a full URL (`prUrl`). Returns undefined when blank or unparseable — the caller uses that
119
+ // to require a target on a review task.
120
+ function parseReviewPrRef(raw: string): Pick<TaskTypeFields, 'prUrl' | 'prNumber'> | undefined {
121
+ const trimmed = raw.trim()
122
+ if (!trimmed) return undefined
123
+ const bareNumber = /^#?(\d+)$/.exec(trimmed)
124
+ if (bareNumber) {
125
+ const n = Number(bareNumber[1])
126
+ return Number.isSafeInteger(n) && n >= 1 ? { prNumber: n } : undefined
127
+ }
128
+ return { prUrl: trimmed }
129
+ }
106
130
  // Per-kind specific fields (see DOC_KIND_FIELDS). Held in one keyed record; only the fields
107
131
  // for the selected kind are shown and submitted, so a value from a previously-selected kind is
108
132
  // never sent. The catalog keys below keep the labels/placeholders i18n and drift-guarded.
@@ -168,6 +192,11 @@ function buildTypeFields(): TaskTypeFields | undefined {
168
192
  }
169
193
  return Object.keys(f).length ? f : undefined
170
194
  }
195
+ if (taskType.value === 'review') {
196
+ const f: TaskTypeFields = { ...parseReviewPrRef(reviewPrRef.value) }
197
+ if (reviewFocus.value.trim()) f.reviewFocus = reviewFocus.value.trim()
198
+ return Object.keys(f).length ? f : undefined
199
+ }
171
200
  return undefined
172
201
  }
173
202
 
@@ -381,6 +410,8 @@ watch(open, (isOpen) => {
381
410
  docAudience.value = ''
382
411
  docTargetPath.value = ''
383
412
  docOutlineHints.value = ''
413
+ reviewPrRef.value = ''
414
+ reviewFocus.value = ''
384
415
  for (const key of Object.keys(docKindFieldValues) as DocKindFieldKey[])
385
416
  delete docKindFieldValues[key]
386
417
  riskPolicyId.value = ''
@@ -434,10 +465,13 @@ const { requestClose } = useUnsavedGuard({
434
465
  })
435
466
 
436
467
  // A recurring task only needs a target frame (its details are filled in the schedule
437
- // modal); every other type needs a title.
438
- const canAdd = computed(() =>
439
- isRecurring.value ? recurringFrameId.value !== null : title.value.trim().length > 0,
440
- )
468
+ // modal); every other type needs a title. A review task additionally needs a target PR.
469
+ const canAdd = computed(() => {
470
+ if (isRecurring.value) return recurringFrameId.value !== null
471
+ if (title.value.trim().length === 0) return false
472
+ if (taskType.value === 'review' && !parseReviewPrRef(reviewPrRef.value)) return false
473
+ return true
474
+ })
441
475
 
442
476
  async function add() {
443
477
  const containerId = ui.addTaskContainerId
@@ -720,6 +754,31 @@ async function add() {
720
754
  </UFormField>
721
755
  </div>
722
756
 
757
+ <div v-else-if="taskType === 'review'" class="space-y-3">
758
+ <UFormField
759
+ :label="t('board.addTask.review.prUrl')"
760
+ :hint="t('board.addTask.review.prUrlHint')"
761
+ required
762
+ >
763
+ <UInput
764
+ v-model="reviewPrRef"
765
+ placeholder="https://github.com/owner/repo/pull/123"
766
+ class="w-full"
767
+ />
768
+ </UFormField>
769
+ <UFormField
770
+ :label="t('board.addTask.review.focus')"
771
+ :hint="t('board.addTask.optional')"
772
+ >
773
+ <UTextarea
774
+ v-model="reviewFocus"
775
+ :rows="2"
776
+ :placeholder="t('board.addTask.review.focusPlaceholder')"
777
+ class="w-full"
778
+ />
779
+ </UFormField>
780
+ </div>
781
+
723
782
  <div class="grid grid-cols-2 gap-3">
724
783
  <UFormField :label="t('board.addTask.pipeline')">
725
784
  <UDropdownMenu :items="pipelineMenu" class="w-full">
@@ -98,6 +98,7 @@ const TASK_TYPE_KEYS: Record<CreateTaskType, string> = {
98
98
  bug: 'settings.workspaceSettings.taskTypes.bug',
99
99
  document: 'settings.workspaceSettings.taskTypes.document',
100
100
  spike: 'settings.workspaceSettings.taskTypes.spike',
101
+ review: 'settings.workspaceSettings.taskTypes.review',
101
102
  }
102
103
 
103
104
  const MODES = computed<{ value: TaskLimitMode; label: string }[]>(() => [
@@ -693,7 +693,8 @@
693
693
  "feature": "Feature",
694
694
  "bug": "Bug",
695
695
  "document": "Dokument",
696
- "spike": "Spike"
696
+ "spike": "Spike",
697
+ "review": "Review"
697
698
  },
698
699
  "observability": {
699
700
  "heading": "Agenten-Observability",
@@ -1989,7 +1990,8 @@
1989
1990
  "bug": "Bug",
1990
1991
  "document": "Dokument",
1991
1992
  "spike": "Spike",
1992
- "recurring": "Wiederkehrend"
1993
+ "recurring": "Wiederkehrend",
1994
+ "review": "Review"
1993
1995
  },
1994
1996
  "recurringWithFrame": "Eine wiederkehrende Aufgabe führt eine Pipeline in einem Takt aus. Fahren Sie fort, um Zeitplan + Prompt festzulegen.",
1995
1997
  "recurringNoFrame": "Eine wiederkehrende Aufgabe muss auf einem Service liegen. Fügen Sie sie aus einem Service-Frame (oder einem darin enthaltenen Modul) hinzu.",
@@ -2085,7 +2087,13 @@
2085
2087
  "continue": "Weiter",
2086
2088
  "submit": "Aufgabe hinzufügen",
2087
2089
  "addFailedTitle": "Aufgabe konnte nicht hinzugefügt werden",
2088
- "linkFailed": "Aufgabe hinzugefügt, aber {count} Anhang konnte nicht verknüpft werden | Aufgabe hinzugefügt, aber {count} Anhänge konnten nicht verknüpft werden"
2090
+ "linkFailed": "Aufgabe hinzugefügt, aber {count} Anhang konnte nicht verknüpft werden | Aufgabe hinzugefügt, aber {count} Anhänge konnten nicht verknüpft werden",
2091
+ "review": {
2092
+ "prUrl": "Pull Request",
2093
+ "prUrlHint": "URL oder Nummer des zu prüfenden Pull Requests",
2094
+ "focus": "Prüfungsschwerpunkt",
2095
+ "focusPlaceholder": "z. B. Fokus auf die Auth-Änderungen und Fehlerbehandlung"
2096
+ }
2089
2097
  },
2090
2098
  "recurring": {
2091
2099
  "title": "Eine wiederkehrende Pipeline hinzufügen",
@@ -185,7 +185,8 @@
185
185
  "bug": "Bug",
186
186
  "document": "Document",
187
187
  "spike": "Spike",
188
- "recurring": "Recurring"
188
+ "recurring": "Recurring",
189
+ "review": "Review"
189
190
  },
190
191
  "recurringWithFrame": "A recurring task runs a pipeline on a cadence. Continue to set the schedule + prompt.",
191
192
  "recurringNoFrame": "A recurring task must live on a service. Add it from a service frame (or a module inside one).",
@@ -284,6 +285,12 @@
284
285
  "linkFailed": "Task added, but {count} attachment could not be linked | Task added, but {count} attachments could not be linked",
285
286
  "@linkFailed": {
286
287
  "description": "Count-based: how many context attachments (docs/issues) failed to link after the task was created (count is always >= 1). Provide ALL plural forms your language needs (English has 2; Polish/Ukrainian need 3 - one/few/many - via the custom pluralRules in i18n.config.ts)."
288
+ },
289
+ "review": {
290
+ "prUrl": "Pull request",
291
+ "prUrlHint": "URL or number of the pull request to review",
292
+ "focus": "Review focus",
293
+ "focusPlaceholder": "e.g. focus on the auth changes and error handling"
287
294
  }
288
295
  },
289
296
  "recurring": {
@@ -2548,7 +2555,8 @@
2548
2555
  "feature": "feature",
2549
2556
  "bug": "bug",
2550
2557
  "document": "document",
2551
- "spike": "spike"
2558
+ "spike": "spike",
2559
+ "review": "review"
2552
2560
  },
2553
2561
  "observability": {
2554
2562
  "heading": "Agent observability",
@@ -167,7 +167,8 @@
167
167
  "bug": "Error",
168
168
  "document": "Documento",
169
169
  "spike": "Spike",
170
- "recurring": "Recurrente"
170
+ "recurring": "Recurrente",
171
+ "review": "Revisión"
171
172
  },
172
173
  "recurringWithFrame": "Una tarea recurrente ejecuta una pipeline con cierta cadencia. Continúa para definir el horario y el prompt.",
173
174
  "recurringNoFrame": "Una tarea recurrente debe vivir en un servicio. Añádela desde un marco de servicio (o un módulo dentro de él).",
@@ -263,7 +264,13 @@
263
264
  "continue": "Continuar",
264
265
  "submit": "Añadir tarea",
265
266
  "addFailedTitle": "No se pudo añadir la tarea",
266
- "linkFailed": "Tarea añadida, pero no se pudo vincular {count} adjunto | Tarea añadida, pero no se pudieron vincular {count} adjuntos"
267
+ "linkFailed": "Tarea añadida, pero no se pudo vincular {count} adjunto | Tarea añadida, pero no se pudieron vincular {count} adjuntos",
268
+ "review": {
269
+ "prUrl": "Pull request",
270
+ "prUrlHint": "URL o número de la pull request a revisar",
271
+ "focus": "Enfoque de la revisión",
272
+ "focusPlaceholder": "p. ej., céntrate en los cambios de autenticación y el manejo de errores"
273
+ }
267
274
  },
268
275
  "recurring": {
269
276
  "title": "Añadir una pipeline recurrente",
@@ -2363,7 +2370,8 @@
2363
2370
  "feature": "función",
2364
2371
  "bug": "error",
2365
2372
  "document": "documento",
2366
- "spike": "spike"
2373
+ "spike": "spike",
2374
+ "review": "revisión"
2367
2375
  },
2368
2376
  "observability": {
2369
2377
  "heading": "Observabilidad del agente",
@@ -167,7 +167,8 @@
167
167
  "bug": "Bug",
168
168
  "document": "Document",
169
169
  "spike": "Spike",
170
- "recurring": "Récurrent"
170
+ "recurring": "Récurrent",
171
+ "review": "Revue"
171
172
  },
172
173
  "recurringWithFrame": "Une tâche récurrente exécute une pipeline selon une cadence. Continuez pour définir le calendrier et le prompt.",
173
174
  "recurringNoFrame": "Une tâche récurrente doit appartenir à un service. Ajoutez-la depuis un cadre de service (ou un module à l’intérieur).",
@@ -263,7 +264,13 @@
263
264
  "continue": "Continuer",
264
265
  "submit": "Ajouter la tâche",
265
266
  "addFailedTitle": "Impossible d’ajouter la tâche",
266
- "linkFailed": "Tâche ajoutée, mais {count} pièce jointe n’a pas pu être liée | Tâche ajoutée, mais {count} pièces jointes n’ont pas pu être liées"
267
+ "linkFailed": "Tâche ajoutée, mais {count} pièce jointe n’a pas pu être liée | Tâche ajoutée, mais {count} pièces jointes n’ont pas pu être liées",
268
+ "review": {
269
+ "prUrl": "Pull request",
270
+ "prUrlHint": "URL ou numéro de la pull request à examiner",
271
+ "focus": "Objet de la revue",
272
+ "focusPlaceholder": "p. ex. concentrez-vous sur les changements d'authentification et la gestion des erreurs"
273
+ }
267
274
  },
268
275
  "recurring": {
269
276
  "title": "Ajouter une pipeline récurrente",
@@ -2363,7 +2370,8 @@
2363
2370
  "feature": "fonctionnalité",
2364
2371
  "bug": "bug",
2365
2372
  "document": "document",
2366
- "spike": "spike"
2373
+ "spike": "spike",
2374
+ "review": "revue"
2367
2375
  },
2368
2376
  "observability": {
2369
2377
  "heading": "Observabilité de l'agent",
@@ -167,7 +167,8 @@
167
167
  "bug": "באג",
168
168
  "document": "מסמך",
169
169
  "spike": "ספייק",
170
- "recurring": "מחזורי"
170
+ "recurring": "מחזורי",
171
+ "review": "סקירה"
171
172
  },
172
173
  "recurringWithFrame": "משימה מחזורית מריצה צינור במרווחים קבועים. המשך כדי להגדיר את התזמון והפרומפט.",
173
174
  "recurringNoFrame": "משימה מחזורית חייבת להתקיים על שירות. הוסף אותה ממסגרת שירות (או ממודול בתוכה).",
@@ -263,7 +264,13 @@
263
264
  "continue": "המשך",
264
265
  "submit": "הוסף משימה",
265
266
  "addFailedTitle": "לא ניתן היה להוסיף משימה",
266
- "linkFailed": "המשימה נוספה, אך {count} צרופה לא ניתנה לקישור | המשימה נוספה, אך {count} צרופות לא ניתנו לקישור"
267
+ "linkFailed": "המשימה נוספה, אך {count} צרופה לא ניתנה לקישור | המשימה נוספה, אך {count} צרופות לא ניתנו לקישור",
268
+ "review": {
269
+ "prUrl": "בקשת משיכה",
270
+ "prUrlHint": "כתובת או מספר של בקשת המשיכה לסקירה",
271
+ "focus": "מוקד הסקירה",
272
+ "focusPlaceholder": "לדוגמה, להתמקד בשינויי האימות ובטיפול בשגיאות"
273
+ }
267
274
  },
268
275
  "recurring": {
269
276
  "title": "הוסף צינור מחזורי",
@@ -2484,7 +2491,8 @@
2484
2491
  "feature": "תכונה",
2485
2492
  "bug": "באג",
2486
2493
  "document": "מסמך",
2487
- "spike": "חקירה"
2494
+ "spike": "חקירה",
2495
+ "review": "סקירה"
2488
2496
  },
2489
2497
  "observability": {
2490
2498
  "heading": "תצפיתיות סוכנים",
@@ -693,7 +693,8 @@
693
693
  "feature": "feature",
694
694
  "bug": "bug",
695
695
  "document": "documento",
696
- "spike": "spike"
696
+ "spike": "spike",
697
+ "review": "revisione"
697
698
  },
698
699
  "observability": {
699
700
  "heading": "Osservabilita degli agenti",
@@ -1989,7 +1990,8 @@
1989
1990
  "bug": "Bug",
1990
1991
  "document": "Documento",
1991
1992
  "spike": "Spike",
1992
- "recurring": "Ricorrente"
1993
+ "recurring": "Ricorrente",
1994
+ "review": "Revisione"
1993
1995
  },
1994
1996
  "recurringWithFrame": "Un'attività ricorrente esegue una pipeline a cadenza regolare. Continua per impostare la pianificazione e il prompt.",
1995
1997
  "recurringNoFrame": "Un'attività ricorrente deve risiedere su un servizio. Aggiungila da un frame di servizio (o da un modulo al suo interno).",
@@ -2085,7 +2087,13 @@
2085
2087
  "continue": "Continua",
2086
2088
  "submit": "Aggiungi attività",
2087
2089
  "addFailedTitle": "Impossibile aggiungere l'attività",
2088
- "linkFailed": "Attività aggiunta, ma {count} allegato non è stato collegato | Attività aggiunta, ma {count} allegati non sono stati collegati"
2090
+ "linkFailed": "Attività aggiunta, ma {count} allegato non è stato collegato | Attività aggiunta, ma {count} allegati non sono stati collegati",
2091
+ "review": {
2092
+ "prUrl": "Pull request",
2093
+ "prUrlHint": "URL o numero della pull request da revisionare",
2094
+ "focus": "Focus della revisione",
2095
+ "focusPlaceholder": "es. concentrati sulle modifiche di autenticazione e sulla gestione degli errori"
2096
+ }
2089
2097
  },
2090
2098
  "recurring": {
2091
2099
  "title": "Aggiungi una pipeline ricorrente",
@@ -167,7 +167,8 @@
167
167
  "bug": "バグ",
168
168
  "document": "ドキュメント",
169
169
  "spike": "スパイク",
170
- "recurring": "繰り返し"
170
+ "recurring": "繰り返し",
171
+ "review": "レビュー"
171
172
  },
172
173
  "recurringWithFrame": "繰り返しタスクは一定の周期でパイプラインを実行します。続行してスケジュールとプロンプトを設定してください。",
173
174
  "recurringNoFrame": "繰り返しタスクはサービス上に配置する必要があります。サービスフレーム(またはその中のモジュール)から追加してください。",
@@ -263,7 +264,13 @@
263
264
  "continue": "続行",
264
265
  "submit": "タスクを追加",
265
266
  "addFailedTitle": "タスクを追加できませんでした",
266
- "linkFailed": "タスクを追加しましたが、{count} 件の添付をリンクできませんでした | タスクを追加しましたが、{count} 件の添付をリンクできませんでした"
267
+ "linkFailed": "タスクを追加しましたが、{count} 件の添付をリンクできませんでした | タスクを追加しましたが、{count} 件の添付をリンクできませんでした",
268
+ "review": {
269
+ "prUrl": "プルリクエスト",
270
+ "prUrlHint": "レビュー対象のプルリクエストのURLまたは番号",
271
+ "focus": "レビューの重点",
272
+ "focusPlaceholder": "例: 認証の変更とエラー処理に注目"
273
+ }
267
274
  },
268
275
  "recurring": {
269
276
  "title": "繰り返しパイプラインを追加",
@@ -2485,7 +2492,8 @@
2485
2492
  "feature": "機能",
2486
2493
  "bug": "バグ",
2487
2494
  "document": "ドキュメント",
2488
- "spike": "スパイク"
2495
+ "spike": "スパイク",
2496
+ "review": "レビュー"
2489
2497
  },
2490
2498
  "observability": {
2491
2499
  "heading": "エージェントの可観測性",
@@ -167,7 +167,8 @@
167
167
  "bug": "Błąd",
168
168
  "document": "Dokument",
169
169
  "spike": "Spike",
170
- "recurring": "Cykliczne"
170
+ "recurring": "Cykliczne",
171
+ "review": "Przegląd"
171
172
  },
172
173
  "recurringWithFrame": "Zadanie cykliczne uruchamia pipeline w określonym rytmie. Kontynuuj, aby ustawić harmonogram i prompt.",
173
174
  "recurringNoFrame": "Zadanie cykliczne musi należeć do usługi. Dodaj je z ramki usługi (lub modułu w jej obrębie).",
@@ -263,7 +264,13 @@
263
264
  "continue": "Dalej",
264
265
  "submit": "Dodaj zadanie",
265
266
  "addFailedTitle": "Nie udało się dodać zadania",
266
- "linkFailed": "Zadanie dodane, ale nie udało się powiązać {count} załącznika | Zadanie dodane, ale nie udało się powiązać {count} załączników | Zadanie dodane, ale nie udało się powiązać {count} załączników"
267
+ "linkFailed": "Zadanie dodane, ale nie udało się powiązać {count} załącznika | Zadanie dodane, ale nie udało się powiązać {count} załączników | Zadanie dodane, ale nie udało się powiązać {count} załączników",
268
+ "review": {
269
+ "prUrl": "Pull request",
270
+ "prUrlHint": "URL lub numer pull requesta do przeglądu",
271
+ "focus": "Zakres przeglądu",
272
+ "focusPlaceholder": "np. skup się na zmianach uwierzytelniania i obsłudze błędów"
273
+ }
267
274
  },
268
275
  "recurring": {
269
276
  "title": "Dodaj cykliczny pipeline",
@@ -2363,7 +2370,8 @@
2363
2370
  "feature": "funkcja",
2364
2371
  "bug": "błąd",
2365
2372
  "document": "dokument",
2366
- "spike": "spike"
2373
+ "spike": "spike",
2374
+ "review": "przegląd"
2367
2375
  },
2368
2376
  "observability": {
2369
2377
  "heading": "Obserwowalność agenta",
@@ -167,7 +167,8 @@
167
167
  "bug": "Hata",
168
168
  "document": "Belge",
169
169
  "spike": "Spike",
170
- "recurring": "Yinelenen"
170
+ "recurring": "Yinelenen",
171
+ "review": "İnceleme"
171
172
  },
172
173
  "recurringWithFrame": "Yinelenen bir görev, bir işlem hattını belirli bir aralıkta çalıştırır. Programı ve istemi ayarlamak için devam edin.",
173
174
  "recurringNoFrame": "Yinelenen bir görev bir serviste bulunmalıdır. Bir servis çerçevesinden (veya içindeki bir modülden) ekleyin.",
@@ -263,7 +264,13 @@
263
264
  "continue": "Devam",
264
265
  "submit": "Görev ekle",
265
266
  "addFailedTitle": "Görev eklenemedi",
266
- "linkFailed": "Görev eklendi, ancak {count} ek bağlanamadı | Görev eklendi, ancak {count} ek bağlanamadı"
267
+ "linkFailed": "Görev eklendi, ancak {count} ek bağlanamadı | Görev eklendi, ancak {count} ek bağlanamadı",
268
+ "review": {
269
+ "prUrl": "Pull request",
270
+ "prUrlHint": "İncelenecek pull request'in URL'si veya numarası",
271
+ "focus": "İnceleme odağı",
272
+ "focusPlaceholder": "örn. kimlik doğrulama değişikliklerine ve hata yönetimine odaklan"
273
+ }
267
274
  },
268
275
  "recurring": {
269
276
  "title": "Yinelenen bir işlem hattı ekle",
@@ -2485,7 +2492,8 @@
2485
2492
  "feature": "özellik",
2486
2493
  "bug": "hata",
2487
2494
  "document": "belge",
2488
- "spike": "inceleme"
2495
+ "spike": "inceleme",
2496
+ "review": "inceleme"
2489
2497
  },
2490
2498
  "observability": {
2491
2499
  "heading": "Agent gözlemlenebilirliği",
@@ -167,7 +167,8 @@
167
167
  "bug": "Помилка",
168
168
  "document": "Документ",
169
169
  "spike": "Spike",
170
- "recurring": "Періодичне"
170
+ "recurring": "Періодичне",
171
+ "review": "Огляд"
171
172
  },
172
173
  "recurringWithFrame": "Періодичне завдання запускає конвеєр із заданою періодичністю. Продовжте, щоб задати розклад і промпт.",
173
174
  "recurringNoFrame": "Періодичне завдання має належати сервісу. Додайте його з рамки сервісу (або модуля всередині неї).",
@@ -263,7 +264,13 @@
263
264
  "continue": "Продовжити",
264
265
  "submit": "Додати завдання",
265
266
  "addFailedTitle": "Не вдалося додати завдання",
266
- "linkFailed": "Завдання додано, але не вдалося прив’язати {count} вкладення | Завдання додано, але не вдалося прив’язати {count} вкладення | Завдання додано, але не вдалося прив’язати {count} вкладень"
267
+ "linkFailed": "Завдання додано, але не вдалося прив’язати {count} вкладення | Завдання додано, але не вдалося прив’язати {count} вкладення | Завдання додано, але не вдалося прив’язати {count} вкладень",
268
+ "review": {
269
+ "prUrl": "Pull request",
270
+ "prUrlHint": "URL або номер pull request для огляду",
271
+ "focus": "Фокус огляду",
272
+ "focusPlaceholder": "напр. зосередься на змінах автентифікації та обробці помилок"
273
+ }
267
274
  },
268
275
  "recurring": {
269
276
  "title": "Додати періодичний конвеєр",
@@ -2363,7 +2370,8 @@
2363
2370
  "feature": "функція",
2364
2371
  "bug": "помилка",
2365
2372
  "document": "документ",
2366
- "spike": "spike"
2373
+ "spike": "spike",
2374
+ "review": "огляд"
2367
2375
  },
2368
2376
  "observability": {
2369
2377
  "heading": "Спостережуваність агента",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cat-factory/app",
3
- "version": "0.116.10",
3
+ "version": "0.117.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",
@@ -34,7 +34,7 @@
34
34
  "valibot": "^1.4.2",
35
35
  "vue": "3.5.39",
36
36
  "wretch": "^3.0.9",
37
- "@cat-factory/contracts": "0.129.0"
37
+ "@cat-factory/contracts": "0.130.0"
38
38
  },
39
39
  "devDependencies": {
40
40
  "@toad-contracts/testing": "0.3.2",