@cat-factory/app 0.88.0 → 0.90.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.
@@ -11,8 +11,14 @@
11
11
  // button is disabled with a hint. Linking needs the block id,
12
12
  // so chosen items are staged locally and import-and-linked once the task is created
13
13
  // (see useContextLinking) — the same context the agents see for every step of the run.
14
- import type { CreateTaskType, DocKind, TaskSourceKind, TaskTypeFields } from '~/types/domain'
15
- import { DOC_KINDS } from '~/types/domain'
14
+ import type {
15
+ CreateTaskType,
16
+ DocKind,
17
+ DocKindFieldKey,
18
+ TaskSourceKind,
19
+ TaskTypeFields,
20
+ } from '~/types/domain'
21
+ import { DOC_KINDS, DOC_KIND_FIELDS } from '~/types/domain'
16
22
  import ContextDocumentPicker from '~/components/documents/ContextDocumentPicker.vue'
17
23
  import ContextIssuePicker from '~/components/tasks/ContextIssuePicker.vue'
18
24
  import { mergePresetOptionLabel, mergePresetThresholds } from '~/utils/mergePreset'
@@ -97,6 +103,40 @@ const docKind = ref<DocKind | ''>('')
97
103
  const docAudience = ref('')
98
104
  const docTargetPath = ref('')
99
105
  const docOutlineHints = ref('')
106
+ // Per-kind specific fields (see DOC_KIND_FIELDS). Held in one keyed record; only the fields
107
+ // for the selected kind are shown and submitted, so a value from a previously-selected kind is
108
+ // never sent. The catalog keys below keep the labels/placeholders i18n and drift-guarded.
109
+ const docKindFieldValues = reactive<Partial<Record<DocKindFieldKey, string>>>({})
110
+ const docKindFields = computed(() => (docKind.value ? (DOC_KIND_FIELDS[docKind.value] ?? []) : []))
111
+ // Exhaustive Record<DocKindFieldKey, key> of catalog keys — the initiative's drift guard for a
112
+ // dynamic enum→key lookup (a missing enum member is a compile error here; a locale that omits a
113
+ // key falls back via `te()` rather than leaking a raw key). Do NOT inline as bare template keys.
114
+ const DOC_FIELD_LABEL_KEYS: Record<DocKindFieldKey, string> = {
115
+ targetUsers: 'board.addTask.docFields.targetUsers.label',
116
+ successMetrics: 'board.addTask.docFields.successMetrics.label',
117
+ alternativesConsidered: 'board.addTask.docFields.alternativesConsidered.label',
118
+ rolloutConcerns: 'board.addTask.docFields.rolloutConcerns.label',
119
+ decisionDrivers: 'board.addTask.docFields.decisionDrivers.label',
120
+ consideredOptions: 'board.addTask.docFields.consideredOptions.label',
121
+ whenToUse: 'board.addTask.docFields.whenToUse.label',
122
+ escalationPath: 'board.addTask.docFields.escalationPath.label',
123
+ researchQuestion: 'board.addTask.docFields.researchQuestion.label',
124
+ optionsToCompare: 'board.addTask.docFields.optionsToCompare.label',
125
+ apiSurface: 'board.addTask.docFields.apiSurface.label',
126
+ }
127
+ const DOC_FIELD_PLACEHOLDER_KEYS: Record<DocKindFieldKey, string> = {
128
+ targetUsers: 'board.addTask.docFields.targetUsers.placeholder',
129
+ successMetrics: 'board.addTask.docFields.successMetrics.placeholder',
130
+ alternativesConsidered: 'board.addTask.docFields.alternativesConsidered.placeholder',
131
+ rolloutConcerns: 'board.addTask.docFields.rolloutConcerns.placeholder',
132
+ decisionDrivers: 'board.addTask.docFields.decisionDrivers.placeholder',
133
+ consideredOptions: 'board.addTask.docFields.consideredOptions.placeholder',
134
+ whenToUse: 'board.addTask.docFields.whenToUse.placeholder',
135
+ escalationPath: 'board.addTask.docFields.escalationPath.placeholder',
136
+ researchQuestion: 'board.addTask.docFields.researchQuestion.placeholder',
137
+ optionsToCompare: 'board.addTask.docFields.optionsToCompare.placeholder',
138
+ apiSurface: 'board.addTask.docFields.apiSurface.placeholder',
139
+ }
100
140
  const SEVERITIES = ['low', 'medium', 'high', 'critical'] as const
101
141
 
102
142
  function buildTypeFields(): TaskTypeFields | undefined {
@@ -121,6 +161,11 @@ function buildTypeFields(): TaskTypeFields | undefined {
121
161
  if (docAudience.value.trim()) f.audience = docAudience.value.trim()
122
162
  if (docTargetPath.value.trim()) f.targetPath = docTargetPath.value.trim()
123
163
  if (docOutlineHints.value.trim()) f.outlineHints = docOutlineHints.value.trim()
164
+ // Only the selected kind's fields are read, so a stale value for another kind is dropped.
165
+ for (const spec of docKindFields.value) {
166
+ const value = docKindFieldValues[spec.key]?.trim()
167
+ if (value) f[spec.key] = value
168
+ }
124
169
  return Object.keys(f).length ? f : undefined
125
170
  }
126
171
  return undefined
@@ -336,6 +381,8 @@ watch(open, (isOpen) => {
336
381
  docAudience.value = ''
337
382
  docTargetPath.value = ''
338
383
  docOutlineHints.value = ''
384
+ for (const key of Object.keys(docKindFieldValues) as DocKindFieldKey[])
385
+ delete docKindFieldValues[key]
339
386
  mergePresetId.value = ''
340
387
  modelPresetId.value = ''
341
388
  pipelineId.value = ''
@@ -610,6 +657,27 @@ async function add() {
610
657
  class="w-full"
611
658
  />
612
659
  </UFormField>
660
+ <!-- Kind-specific fields — only those relevant to the selected docKind are shown. -->
661
+ <UFormField
662
+ v-for="spec in docKindFields"
663
+ :key="spec.key"
664
+ :label="t(DOC_FIELD_LABEL_KEYS[spec.key])"
665
+ :hint="t('board.addTask.optional')"
666
+ >
667
+ <UTextarea
668
+ v-if="spec.multiline"
669
+ v-model="docKindFieldValues[spec.key]"
670
+ :rows="2"
671
+ :placeholder="t(DOC_FIELD_PLACEHOLDER_KEYS[spec.key])"
672
+ class="w-full"
673
+ />
674
+ <UInput
675
+ v-else
676
+ v-model="docKindFieldValues[spec.key]"
677
+ :placeholder="t(DOC_FIELD_PLACEHOLDER_KEYS[spec.key])"
678
+ class="w-full"
679
+ />
680
+ </UFormField>
613
681
  </div>
614
682
 
615
683
  <div class="grid grid-cols-2 gap-3">
@@ -35,9 +35,16 @@ const gate = computed<GateStepState | null>(() => step.value?.gate ?? null)
35
35
 
36
36
  const isCi = computed(() => step.value?.agentKind === 'ci')
37
37
  const isHumanReview = computed(() => step.value?.agentKind === 'human-review')
38
+ const isDocQuality = computed(() => step.value?.agentKind === 'doc-quality')
38
39
  const meta = computed(() => agentKindMeta(step.value?.agentKind ?? 'ci'))
39
40
  const helperKind = computed(() =>
40
- isHumanReview.value ? 'fixer' : isCi.value ? 'ci-fixer' : 'conflict-resolver',
41
+ isHumanReview.value
42
+ ? 'fixer'
43
+ : isCi.value
44
+ ? 'ci-fixer'
45
+ : isDocQuality.value
46
+ ? 'doc-fixer'
47
+ : 'conflict-resolver',
41
48
  )
42
49
  const helperMeta = computed(() => agentKindMeta(helperKind.value))
43
50
 
@@ -46,7 +53,9 @@ const subtitle = computed(() =>
46
53
  ? t('gates.subtitle.humanReview')
47
54
  : isCi.value
48
55
  ? t('gates.subtitle.ci')
49
- : t('gates.subtitle.conflicts'),
56
+ : isDocQuality.value
57
+ ? t('gates.subtitle.docQuality')
58
+ : t('gates.subtitle.conflicts'),
50
59
  )
51
60
 
52
61
  // Human-review: approval progress + the freeform "request a fix" control.
@@ -316,6 +325,35 @@ const conflictVerdict = computed(() => {
316
325
  </p>
317
326
  </template>
318
327
 
328
+ <!-- Doc quality: the deterministic structural findings the gate raised -->
329
+ <template v-else-if="isDocQuality">
330
+ <h3 class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-slate-500">
331
+ {{ t('gates.docQuality.findings') }}
332
+ </h3>
333
+ <div
334
+ v-if="gate.lastFailureSummary"
335
+ class="relative rounded-md border border-slate-800 bg-slate-950/40 px-3 py-2"
336
+ >
337
+ <CopyButton :text="gate.lastFailureSummary" class="absolute end-1 top-1" />
338
+ <p class="whitespace-pre-wrap pe-8 text-[12px] leading-relaxed text-slate-300">
339
+ {{ gate.lastFailureSummary }}
340
+ </p>
341
+ </div>
342
+ <p v-else class="text-[13px] leading-relaxed text-slate-300">
343
+ {{ t('gates.docQuality.findingsFallback') }}
344
+ </p>
345
+ <a
346
+ v-if="prUrl"
347
+ :href="prUrl"
348
+ target="_blank"
349
+ rel="noopener"
350
+ class="mt-2 inline-flex items-center gap-1 text-[12px] text-sky-300 hover:text-sky-200 hover:underline"
351
+ >
352
+ {{ t('gates.docQuality.viewPr') }}
353
+ <UIcon name="i-lucide-external-link" class="h-3 w-3" />
354
+ </a>
355
+ </template>
356
+
319
357
  <!-- Conflicts: verdict + the resolver's account of what it left -->
320
358
  <template v-else>
321
359
  <h3 class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-slate-500">
@@ -24,6 +24,8 @@ export type {
24
24
  CreateTaskType,
25
25
  TaskTypeFields,
26
26
  DocKind,
27
+ DocKindFieldKey,
28
+ DocKindFieldSpec,
27
29
  Block,
28
30
  PullRequestRef,
29
31
  CloudProvider,
@@ -74,9 +76,10 @@ export type {
74
76
 
75
77
  import type { AgentCategory, AgentKind } from '@cat-factory/contracts'
76
78
 
77
- // The document-kind list is a runtime value (used to render the picker), so it is re-exported
78
- // as a value the single source of truth lives in the contracts package.
79
- export { DOC_KINDS } from '@cat-factory/contracts'
79
+ // The document-kind list + the per-kind field descriptors are runtime values (used to render
80
+ // the picker and the conditional per-kind inputs), so they are re-exported as values — the
81
+ // single source of truth lives in the contracts package.
82
+ export { DOC_KINDS, DOC_KIND_FIELDS } from '@cat-factory/contracts'
80
83
 
81
84
  /** A draggable agent definition shown in the agent palette. Frontend-only. */
82
85
  export interface AgentArchetype {
@@ -437,6 +437,20 @@ export const SYSTEM_AGENT_META: Record<string, AgentArchetype> = {
437
437
  // of the generic prose step-detail panel. Shared with the conflicts gate.
438
438
  resultView: 'gate',
439
439
  },
440
+ // The forward document pipelines' structural gate. Seed-only (no `category`, like ci /
441
+ // conflicts) — it's part of `pl_document(_quick)`, not a standing palette block — but it
442
+ // needs display metadata so timelines/saved pipelines render it. Its helper `doc-fixer`
443
+ // is a registered kind, so it arrives via the workspace snapshot's `customAgentKinds`.
444
+ 'doc-quality': {
445
+ kind: 'doc-quality',
446
+ label: 'Doc Quality Gate',
447
+ icon: 'i-lucide-file-check-2',
448
+ color: '#818cf8',
449
+ description:
450
+ 'Checks the drafted document for required sections, placeholders, links and heading structure, looping the doc fixer on problems.',
451
+ // Opens the dedicated gate window (verdict, attempts, the document findings).
452
+ resultView: 'gate',
453
+ },
440
454
  'ci-fixer': {
441
455
  kind: 'ci-fixer',
442
456
  label: 'CI Fixer',
@@ -169,6 +169,49 @@
169
169
  "targetPathPlaceholder": "e.g. docs/rfcs/0001-foo.md",
170
170
  "outlineHints": "Outline hints",
171
171
  "outlineHintsPlaceholder": "Sections or points the document should cover",
172
+ "docFields": {
173
+ "targetUsers": {
174
+ "label": "Target users",
175
+ "placeholder": "Who the document is for and the jobs they're doing"
176
+ },
177
+ "successMetrics": {
178
+ "label": "Success metrics",
179
+ "placeholder": "Measurable outcomes that show it's working"
180
+ },
181
+ "alternativesConsidered": {
182
+ "label": "Alternatives considered",
183
+ "placeholder": "Other approaches weighed and why they were ruled out"
184
+ },
185
+ "rolloutConcerns": {
186
+ "label": "Rollout concerns",
187
+ "placeholder": "Migration and rollout risks to address"
188
+ },
189
+ "decisionDrivers": {
190
+ "label": "Decision drivers",
191
+ "placeholder": "The forces and constraints driving the decision"
192
+ },
193
+ "consideredOptions": {
194
+ "label": "Considered options",
195
+ "placeholder": "The options evaluated, each with its trade-offs"
196
+ },
197
+ "whenToUse": {
198
+ "label": "When to use",
199
+ "placeholder": "The trigger or situation this runbook applies to"
200
+ },
201
+ "escalationPath": {
202
+ "label": "Escalation path",
203
+ "placeholder": "Who to contact and how to escalate on failure"
204
+ },
205
+ "researchQuestion": {
206
+ "label": "Research question",
207
+ "placeholder": "The question or hypothesis to answer"
208
+ },
209
+ "optionsToCompare": {
210
+ "label": "Options to compare",
211
+ "placeholder": "The options to weigh against each other"
212
+ },
213
+ "apiSurface": { "label": "API surface", "placeholder": "The endpoints or surface in scope" }
214
+ },
172
215
  "optional": "optional",
173
216
  "pipeline": "Pipeline",
174
217
  "chooseAtRunTime": "Choose at run time",
@@ -2987,7 +3030,8 @@
2987
3030
  "subtitle": {
2988
3031
  "humanReview": "Waits for a human code review on the PR, looping the fixer on comments",
2989
3032
  "ci": "Gates the PR on green CI, looping the CI fixer on failure",
2990
- "conflicts": "Gates the PR on a clean merge, looping the resolver on conflicts"
3033
+ "conflicts": "Gates the PR on a clean merge, looping the resolver on conflicts",
3034
+ "docQuality": "Checks the drafted document's structure, looping the doc fixer on problems"
2991
3035
  },
2992
3036
  "status": {
2993
3037
  "passed": "Passed",
@@ -3028,6 +3072,11 @@
3028
3072
  "mergeability": "Mergeability",
3029
3073
  "viewPr": "View pull request on GitHub"
3030
3074
  },
3075
+ "docQuality": {
3076
+ "findings": "Document issues",
3077
+ "findingsFallback": "The document passed the structural checks.",
3078
+ "viewPr": "View pull request on GitHub"
3079
+ },
3031
3080
  "attemptsHeading": "{helper} attempts",
3032
3081
  "attempt": "Attempt {number}",
3033
3082
  "attemptInstructions": "Handed to {helper}",
@@ -151,6 +151,52 @@
151
151
  "targetPathPlaceholder": "p. ej. docs/rfcs/0001-foo.md",
152
152
  "outlineHints": "Sugerencias de esquema",
153
153
  "outlineHintsPlaceholder": "Secciones o puntos que el documento debería cubrir",
154
+ "docFields": {
155
+ "targetUsers": {
156
+ "label": "Usuarios objetivo",
157
+ "placeholder": "Para quién es el documento y las tareas que realizan"
158
+ },
159
+ "successMetrics": {
160
+ "label": "Métricas de éxito",
161
+ "placeholder": "Resultados medibles que indican que funciona"
162
+ },
163
+ "alternativesConsidered": {
164
+ "label": "Alternativas consideradas",
165
+ "placeholder": "Otros enfoques evaluados y por qué se descartaron"
166
+ },
167
+ "rolloutConcerns": {
168
+ "label": "Consideraciones de despliegue",
169
+ "placeholder": "Riesgos de migración y despliegue a tener en cuenta"
170
+ },
171
+ "decisionDrivers": {
172
+ "label": "Factores de decisión",
173
+ "placeholder": "Las fuerzas y restricciones que motivan la decisión"
174
+ },
175
+ "consideredOptions": {
176
+ "label": "Opciones consideradas",
177
+ "placeholder": "Las opciones evaluadas, cada una con sus ventajas y desventajas"
178
+ },
179
+ "whenToUse": {
180
+ "label": "Cuándo usarlo",
181
+ "placeholder": "El desencadenante o la situación en que aplica este runbook"
182
+ },
183
+ "escalationPath": {
184
+ "label": "Ruta de escalado",
185
+ "placeholder": "A quién contactar y cómo escalar si falla"
186
+ },
187
+ "researchQuestion": {
188
+ "label": "Pregunta de investigación",
189
+ "placeholder": "La pregunta o hipótesis a responder"
190
+ },
191
+ "optionsToCompare": {
192
+ "label": "Opciones a comparar",
193
+ "placeholder": "Las opciones a sopesar entre sí"
194
+ },
195
+ "apiSurface": {
196
+ "label": "Superficie de API",
197
+ "placeholder": "Los endpoints o la superficie dentro del alcance"
198
+ }
199
+ },
154
200
  "optional": "opcional",
155
201
  "pipeline": "Pipeline",
156
202
  "chooseAtRunTime": "Elegir al ejecutar",
@@ -2892,7 +2938,8 @@
2892
2938
  "subtitle": {
2893
2939
  "humanReview": "Espera una revisión de código humana en el PR, repitiendo el corrector ante los comentarios",
2894
2940
  "ci": "Bloquea el PR hasta que la CI esté verde, repitiendo el corrector de CI ante los fallos",
2895
- "conflicts": "Bloquea el PR hasta una fusión limpia, repitiendo el resolutor ante los conflictos"
2941
+ "conflicts": "Bloquea el PR hasta una fusión limpia, repitiendo el resolutor ante los conflictos",
2942
+ "docQuality": "Comprueba la estructura del documento redactado, repitiendo el corrector de documentos ante los problemas"
2896
2943
  },
2897
2944
  "status": {
2898
2945
  "passed": "Aprobado",
@@ -2933,6 +2980,11 @@
2933
2980
  "mergeability": "Fusionabilidad",
2934
2981
  "viewPr": "Ver la pull request en GitHub"
2935
2982
  },
2983
+ "docQuality": {
2984
+ "findings": "Problemas del documento",
2985
+ "findingsFallback": "El documento superó las comprobaciones estructurales.",
2986
+ "viewPr": "Ver la pull request en GitHub"
2987
+ },
2936
2988
  "attemptsHeading": "Intentos de {helper}",
2937
2989
  "attempt": "Intento {number}",
2938
2990
  "attemptInstructions": "Entregado a {helper}",
@@ -151,6 +151,52 @@
151
151
  "targetPathPlaceholder": "ex. docs/rfcs/0001-foo.md",
152
152
  "outlineHints": "Indications de plan",
153
153
  "outlineHintsPlaceholder": "Sections ou points que le document devrait couvrir",
154
+ "docFields": {
155
+ "targetUsers": {
156
+ "label": "Utilisateurs cibles",
157
+ "placeholder": "À qui s'adresse le document et les tâches qu'ils accomplissent"
158
+ },
159
+ "successMetrics": {
160
+ "label": "Indicateurs de réussite",
161
+ "placeholder": "Résultats mesurables qui montrent que ça fonctionne"
162
+ },
163
+ "alternativesConsidered": {
164
+ "label": "Alternatives envisagées",
165
+ "placeholder": "Les autres approches évaluées et pourquoi elles ont été écartées"
166
+ },
167
+ "rolloutConcerns": {
168
+ "label": "Points de déploiement",
169
+ "placeholder": "Risques de migration et de déploiement à traiter"
170
+ },
171
+ "decisionDrivers": {
172
+ "label": "Facteurs de décision",
173
+ "placeholder": "Les forces et contraintes qui motivent la décision"
174
+ },
175
+ "consideredOptions": {
176
+ "label": "Options envisagées",
177
+ "placeholder": "Les options évaluées, chacune avec ses compromis"
178
+ },
179
+ "whenToUse": {
180
+ "label": "Quand l'utiliser",
181
+ "placeholder": "Le déclencheur ou la situation à laquelle ce runbook s'applique"
182
+ },
183
+ "escalationPath": {
184
+ "label": "Chemin d'escalade",
185
+ "placeholder": "Qui contacter et comment escalader en cas d'échec"
186
+ },
187
+ "researchQuestion": {
188
+ "label": "Question de recherche",
189
+ "placeholder": "La question ou l'hypothèse à laquelle répondre"
190
+ },
191
+ "optionsToCompare": {
192
+ "label": "Options à comparer",
193
+ "placeholder": "Les options à mettre en balance"
194
+ },
195
+ "apiSurface": {
196
+ "label": "Surface d'API",
197
+ "placeholder": "Les endpoints ou la surface concernés"
198
+ }
199
+ },
154
200
  "optional": "optionnel",
155
201
  "pipeline": "Pipeline",
156
202
  "chooseAtRunTime": "Choisir au lancement",
@@ -2892,7 +2938,8 @@
2892
2938
  "subtitle": {
2893
2939
  "humanReview": "Attend une revue de code humaine sur la PR, en relançant le correcteur à chaque commentaire",
2894
2940
  "ci": "Bloque la PR jusqu'à une CI verte, en relançant le correcteur de CI en cas d'échec",
2895
- "conflicts": "Bloque la PR jusqu'à une fusion propre, en relançant le résolveur en cas de conflits"
2941
+ "conflicts": "Bloque la PR jusqu'à une fusion propre, en relançant le résolveur en cas de conflits",
2942
+ "docQuality": "Vérifie la structure du document rédigé, en relançant le correcteur de documents en cas de problème"
2896
2943
  },
2897
2944
  "status": {
2898
2945
  "passed": "Réussi",
@@ -2933,6 +2980,11 @@
2933
2980
  "mergeability": "Fusionnabilité",
2934
2981
  "viewPr": "Voir la pull request sur GitHub"
2935
2982
  },
2983
+ "docQuality": {
2984
+ "findings": "Problèmes du document",
2985
+ "findingsFallback": "Le document a réussi les vérifications structurelles.",
2986
+ "viewPr": "Voir la pull request sur GitHub"
2987
+ },
2936
2988
  "attemptsHeading": "Tentatives du {helper}",
2937
2989
  "attempt": "Tentative {number}",
2938
2990
  "attemptInstructions": "Transmis à {helper}",
@@ -151,6 +151,46 @@
151
151
  "targetPathPlaceholder": "למשל docs/rfcs/0001-foo.md",
152
152
  "outlineHints": "רמזים למתווה",
153
153
  "outlineHintsPlaceholder": "סעיפים או נקודות שהמסמך צריך לכסות",
154
+ "docFields": {
155
+ "targetUsers": {
156
+ "label": "משתמשי היעד",
157
+ "placeholder": "למי מיועד המסמך ואילו משימות הם מבצעים"
158
+ },
159
+ "successMetrics": { "label": "מדדי הצלחה", "placeholder": "תוצאות מדידות שמראות שזה עובד" },
160
+ "alternativesConsidered": {
161
+ "label": "חלופות שנשקלו",
162
+ "placeholder": "גישות אחרות שנשקלו ומדוע נפסלו"
163
+ },
164
+ "rolloutConcerns": {
165
+ "label": "שיקולי הטמעה",
166
+ "placeholder": "סיכוני מיגרציה והשקה שיש לטפל בהם"
167
+ },
168
+ "decisionDrivers": {
169
+ "label": "גורמי ההחלטה",
170
+ "placeholder": "הכוחות והאילוצים שמניעים את ההחלטה"
171
+ },
172
+ "consideredOptions": {
173
+ "label": "אפשרויות שנשקלו",
174
+ "placeholder": "האפשרויות שהוערכו, כל אחת עם היתרונות והחסרונות שלה"
175
+ },
176
+ "whenToUse": {
177
+ "label": "מתי להשתמש",
178
+ "placeholder": "הטריגר או המצב שאליו חל ה-runbook הזה"
179
+ },
180
+ "escalationPath": {
181
+ "label": "נתיב הסלמה",
182
+ "placeholder": "למי לפנות וכיצד להסלים במקרה של כשל"
183
+ },
184
+ "researchQuestion": {
185
+ "label": "שאלת המחקר",
186
+ "placeholder": "השאלה או ההשערה שיש לענות עליה"
187
+ },
188
+ "optionsToCompare": {
189
+ "label": "אפשרויות להשוואה",
190
+ "placeholder": "האפשרויות שיש לשקול זו מול זו"
191
+ },
192
+ "apiSurface": { "label": "משטח ה-API", "placeholder": "נקודות הקצה או המשטח שבתחום" }
193
+ },
154
194
  "optional": "אופציונלי",
155
195
  "pipeline": "צינור",
156
196
  "chooseAtRunTime": "בחר בזמן הריצה",
@@ -2903,7 +2943,8 @@
2903
2943
  "subtitle": {
2904
2944
  "humanReview": "ממתין לסקירת קוד אנושית על ה-PR, ומפעיל בלולאה את המתקן על הערות",
2905
2945
  "ci": "מגדר את ה-PR על CI ירוק, ומפעיל בלולאה את מתקן ה-CI בכישלון",
2906
- "conflicts": "מגדר את ה-PR על מיזוג נקי, ומפעיל בלולאה את הפותר בהתנגשויות"
2946
+ "conflicts": "מגדר את ה-PR על מיזוג נקי, ומפעיל בלולאה את הפותר בהתנגשויות",
2947
+ "docQuality": "בודק את מבנה המסמך שנוסח, ומפעיל בלולאה את מתקן המסמכים בבעיות"
2907
2948
  },
2908
2949
  "status": {
2909
2950
  "passed": "עבר",
@@ -2944,6 +2985,11 @@
2944
2985
  "mergeability": "יכולת מיזוג",
2945
2986
  "viewPr": "הצג את בקשת המשיכה ב-GitHub"
2946
2987
  },
2988
+ "docQuality": {
2989
+ "findings": "בעיות במסמך",
2990
+ "findingsFallback": "המסמך עבר את בדיקות המבנה.",
2991
+ "viewPr": "הצג את בקשת המשיכה ב-GitHub"
2992
+ },
2947
2993
  "attemptsHeading": "ניסיונות {helper}",
2948
2994
  "attempt": "ניסיון {number}",
2949
2995
  "attemptInstructions": "נמסר ל־{helper}",
@@ -151,6 +151,49 @@
151
151
  "targetPathPlaceholder": "例: docs/rfcs/0001-foo.md",
152
152
  "outlineHints": "アウトラインのヒント",
153
153
  "outlineHintsPlaceholder": "ドキュメントがカバーすべきセクションや要点",
154
+ "docFields": {
155
+ "targetUsers": {
156
+ "label": "対象ユーザー",
157
+ "placeholder": "ドキュメントの対象者と、その人が行うタスク"
158
+ },
159
+ "successMetrics": {
160
+ "label": "成功指標",
161
+ "placeholder": "機能していることを示す測定可能な成果"
162
+ },
163
+ "alternativesConsidered": {
164
+ "label": "検討した代替案",
165
+ "placeholder": "検討した他のアプローチと却下した理由"
166
+ },
167
+ "rolloutConcerns": {
168
+ "label": "展開時の懸念",
169
+ "placeholder": "対処すべき移行・展開のリスク"
170
+ },
171
+ "decisionDrivers": {
172
+ "label": "意思決定の要因",
173
+ "placeholder": "意思決定を左右する要因と制約"
174
+ },
175
+ "consideredOptions": {
176
+ "label": "検討した選択肢",
177
+ "placeholder": "評価した各選択肢とそのトレードオフ"
178
+ },
179
+ "whenToUse": {
180
+ "label": "使用するタイミング",
181
+ "placeholder": "このランブックが適用されるトリガーや状況"
182
+ },
183
+ "escalationPath": {
184
+ "label": "エスカレーション経路",
185
+ "placeholder": "失敗時の連絡先とエスカレーション方法"
186
+ },
187
+ "researchQuestion": { "label": "リサーチの問い", "placeholder": "答えるべき問いや仮説" },
188
+ "optionsToCompare": {
189
+ "label": "比較する選択肢",
190
+ "placeholder": "互いに比較検討する選択肢"
191
+ },
192
+ "apiSurface": {
193
+ "label": "API のサーフェス",
194
+ "placeholder": "対象となるエンドポイントや範囲"
195
+ }
196
+ },
154
197
  "optional": "任意",
155
198
  "pipeline": "パイプライン",
156
199
  "chooseAtRunTime": "実行時に選択",
@@ -2904,7 +2947,8 @@
2904
2947
  "subtitle": {
2905
2948
  "humanReview": "PR の人によるコードレビューを待ち、コメントに応じて fixer をループします",
2906
2949
  "ci": "CI がグリーンになるまで PR をゲートし、失敗時に CI fixer をループします",
2907
- "conflicts": "クリーンなマージになるまで PR をゲートし、コンフリクト時に resolver をループします"
2950
+ "conflicts": "クリーンなマージになるまで PR をゲートし、コンフリクト時に resolver をループします",
2951
+ "docQuality": "作成された文書の構造をチェックし、問題があれば doc fixer をループします"
2908
2952
  },
2909
2953
  "status": {
2910
2954
  "passed": "合格",
@@ -2945,6 +2989,11 @@
2945
2989
  "mergeability": "マージ可能性",
2946
2990
  "viewPr": "GitHub でプルリクエストを表示"
2947
2991
  },
2992
+ "docQuality": {
2993
+ "findings": "文書の問題",
2994
+ "findingsFallback": "文書は構造チェックに合格しました。",
2995
+ "viewPr": "GitHub でプルリクエストを表示"
2996
+ },
2948
2997
  "attemptsHeading": "{helper} の試行",
2949
2998
  "attempt": "試行 {number}",
2950
2999
  "attemptInstructions": "{helper} への指示",
@@ -151,6 +151,52 @@
151
151
  "targetPathPlaceholder": "np. docs/rfcs/0001-foo.md",
152
152
  "outlineHints": "Wskazówki do konspektu",
153
153
  "outlineHintsPlaceholder": "Sekcje lub punkty, które dokument powinien obejmować",
154
+ "docFields": {
155
+ "targetUsers": {
156
+ "label": "Użytkownicy docelowi",
157
+ "placeholder": "Dla kogo jest dokument i jakie zadania wykonują"
158
+ },
159
+ "successMetrics": {
160
+ "label": "Metryki sukcesu",
161
+ "placeholder": "Mierzalne wyniki potwierdzające, że to działa"
162
+ },
163
+ "alternativesConsidered": {
164
+ "label": "Rozważane alternatywy",
165
+ "placeholder": "Inne podejścia i powody ich odrzucenia"
166
+ },
167
+ "rolloutConcerns": {
168
+ "label": "Kwestie wdrożenia",
169
+ "placeholder": "Ryzyka migracji i wdrożenia do rozważenia"
170
+ },
171
+ "decisionDrivers": {
172
+ "label": "Czynniki decyzji",
173
+ "placeholder": "Siły i ograniczenia kształtujące decyzję"
174
+ },
175
+ "consideredOptions": {
176
+ "label": "Rozważane opcje",
177
+ "placeholder": "Ocenione opcje wraz z ich kompromisami"
178
+ },
179
+ "whenToUse": {
180
+ "label": "Kiedy stosować",
181
+ "placeholder": "Wyzwalacz lub sytuacja, w której obowiązuje ten runbook"
182
+ },
183
+ "escalationPath": {
184
+ "label": "Ścieżka eskalacji",
185
+ "placeholder": "Z kim się kontaktować i jak eskalować w razie awarii"
186
+ },
187
+ "researchQuestion": {
188
+ "label": "Pytanie badawcze",
189
+ "placeholder": "Pytanie lub hipoteza do rozstrzygnięcia"
190
+ },
191
+ "optionsToCompare": {
192
+ "label": "Opcje do porównania",
193
+ "placeholder": "Opcje do porównania między sobą"
194
+ },
195
+ "apiSurface": {
196
+ "label": "Powierzchnia API",
197
+ "placeholder": "Endpointy lub zakres objęty dokumentem"
198
+ }
199
+ },
154
200
  "optional": "opcjonalne",
155
201
  "pipeline": "Pipeline",
156
202
  "chooseAtRunTime": "Wybierz przy uruchomieniu",
@@ -2892,7 +2938,8 @@
2892
2938
  "subtitle": {
2893
2939
  "humanReview": "Czeka na recenzję kodu przez człowieka na PR, ponawiając korektora po komentarzach",
2894
2940
  "ci": "Blokuje PR do zielonego CI, ponawiając korektora CI przy niepowodzeniu",
2895
- "conflicts": "Blokuje PR do czystego scalenia, ponawiając rozwiązywacza przy konfliktach"
2941
+ "conflicts": "Blokuje PR do czystego scalenia, ponawiając rozwiązywacza przy konfliktach",
2942
+ "docQuality": "Sprawdza strukturę przygotowanego dokumentu, ponawiając korektora dokumentów przy problemach"
2896
2943
  },
2897
2944
  "status": {
2898
2945
  "passed": "Zaliczono",
@@ -2933,6 +2980,11 @@
2933
2980
  "mergeability": "Możliwość scalenia",
2934
2981
  "viewPr": "Zobacz pull request na GitHub"
2935
2982
  },
2983
+ "docQuality": {
2984
+ "findings": "Problemy dokumentu",
2985
+ "findingsFallback": "Dokument przeszedł kontrole strukturalne.",
2986
+ "viewPr": "Zobacz pull request na GitHub"
2987
+ },
2936
2988
  "attemptsHeading": "Próby: {helper}",
2937
2989
  "attempt": "Próba {number}",
2938
2990
  "attemptInstructions": "Przekazano do: {helper}",
@@ -151,6 +151,49 @@
151
151
  "targetPathPlaceholder": "ör. docs/rfcs/0001-foo.md",
152
152
  "outlineHints": "Ana hat ipuçları",
153
153
  "outlineHintsPlaceholder": "Belgenin kapsaması gereken bölümler veya noktalar",
154
+ "docFields": {
155
+ "targetUsers": {
156
+ "label": "Hedef kullanıcılar",
157
+ "placeholder": "Belgenin kime yönelik olduğu ve yaptıkları işler"
158
+ },
159
+ "successMetrics": {
160
+ "label": "Başarı ölçütleri",
161
+ "placeholder": "İşe yaradığını gösteren ölçülebilir sonuçlar"
162
+ },
163
+ "alternativesConsidered": {
164
+ "label": "Değerlendirilen alternatifler",
165
+ "placeholder": "Tartılan diğer yaklaşımlar ve neden elendikleri"
166
+ },
167
+ "rolloutConcerns": {
168
+ "label": "Dağıtım kaygıları",
169
+ "placeholder": "Ele alınacak geçiş ve dağıtım riskleri"
170
+ },
171
+ "decisionDrivers": {
172
+ "label": "Karar etkenleri",
173
+ "placeholder": "Kararı yönlendiren güçler ve kısıtlar"
174
+ },
175
+ "consideredOptions": {
176
+ "label": "Değerlendirilen seçenekler",
177
+ "placeholder": "Değerlendirilen seçenekler ve ödünleşimleri"
178
+ },
179
+ "whenToUse": {
180
+ "label": "Ne zaman kullanılır",
181
+ "placeholder": "Bu runbook'un geçerli olduğu tetikleyici veya durum"
182
+ },
183
+ "escalationPath": {
184
+ "label": "Yükseltme yolu",
185
+ "placeholder": "Kiminle iletişime geçileceği ve arıza durumunda nasıl yükseltileceği"
186
+ },
187
+ "researchQuestion": {
188
+ "label": "Araştırma sorusu",
189
+ "placeholder": "Yanıtlanacak soru veya hipotez"
190
+ },
191
+ "optionsToCompare": {
192
+ "label": "Karşılaştırılacak seçenekler",
193
+ "placeholder": "Birbirine karşı tartılacak seçenekler"
194
+ },
195
+ "apiSurface": { "label": "API yüzeyi", "placeholder": "Kapsamdaki uç noktalar veya yüzey" }
196
+ },
154
197
  "optional": "isteğe bağlı",
155
198
  "pipeline": "İşlem hattı",
156
199
  "chooseAtRunTime": "Çalıştırma sırasında seç",
@@ -2904,7 +2947,8 @@
2904
2947
  "subtitle": {
2905
2948
  "humanReview": "PR üzerinde bir insan kod incelemesini bekler, yorumlar üzerine düzelticiyi döngüye alır",
2906
2949
  "ci": "PR'ı yeşil CI üzerinde kapı altına alır, başarısızlıkta CI düzelticiyi döngüye alır",
2907
- "conflicts": "PR'ı temiz bir birleştirme üzerinde kapı altına alır, çakışmalarda çözücüyü döngüye alır"
2950
+ "conflicts": "PR'ı temiz bir birleştirme üzerinde kapı altına alır, çakışmalarda çözücüyü döngüye alır",
2951
+ "docQuality": "Hazırlanan belgenin yapısını denetler, sorunlarda belge düzelticiyi döngüye alır"
2908
2952
  },
2909
2953
  "status": {
2910
2954
  "passed": "Geçti",
@@ -2945,6 +2989,11 @@
2945
2989
  "mergeability": "Birleştirilebilirlik",
2946
2990
  "viewPr": "Çekme isteğini GitHub'da görüntüle"
2947
2991
  },
2992
+ "docQuality": {
2993
+ "findings": "Belge sorunları",
2994
+ "findingsFallback": "Belge yapısal denetimleri geçti.",
2995
+ "viewPr": "Çekme isteğini GitHub'da görüntüle"
2996
+ },
2948
2997
  "attemptsHeading": "{helper} denemeleri",
2949
2998
  "attempt": "Deneme {number}",
2950
2999
  "attemptInstructions": "{helper}'a iletildi",
@@ -151,6 +151,52 @@
151
151
  "targetPathPlaceholder": "напр. docs/rfcs/0001-foo.md",
152
152
  "outlineHints": "Підказки для плану",
153
153
  "outlineHintsPlaceholder": "Розділи або пункти, які має охопити документ",
154
+ "docFields": {
155
+ "targetUsers": {
156
+ "label": "Цільові користувачі",
157
+ "placeholder": "Для кого документ і які завдання вони виконують"
158
+ },
159
+ "successMetrics": {
160
+ "label": "Метрики успіху",
161
+ "placeholder": "Вимірювані результати, що підтверджують працездатність"
162
+ },
163
+ "alternativesConsidered": {
164
+ "label": "Розглянуті альтернативи",
165
+ "placeholder": "Інші підходи та причини їх відхилення"
166
+ },
167
+ "rolloutConcerns": {
168
+ "label": "Питання розгортання",
169
+ "placeholder": "Ризики міграції та розгортання, які слід врахувати"
170
+ },
171
+ "decisionDrivers": {
172
+ "label": "Чинники рішення",
173
+ "placeholder": "Сили та обмеження, що визначають рішення"
174
+ },
175
+ "consideredOptions": {
176
+ "label": "Розглянуті варіанти",
177
+ "placeholder": "Оцінені варіанти з їхніми компромісами"
178
+ },
179
+ "whenToUse": {
180
+ "label": "Коли застосовувати",
181
+ "placeholder": "Тригер або ситуація, до якої застосовний цей runbook"
182
+ },
183
+ "escalationPath": {
184
+ "label": "Шлях ескалації",
185
+ "placeholder": "До кого звертатися та як ескалювати в разі збою"
186
+ },
187
+ "researchQuestion": {
188
+ "label": "Дослідницьке питання",
189
+ "placeholder": "Питання або гіпотеза, на яку слід відповісти"
190
+ },
191
+ "optionsToCompare": {
192
+ "label": "Варіанти для порівняння",
193
+ "placeholder": "Варіанти для зважування між собою"
194
+ },
195
+ "apiSurface": {
196
+ "label": "Поверхня API",
197
+ "placeholder": "Кінцеві точки або поверхня в межах обсягу"
198
+ }
199
+ },
154
200
  "optional": "необов’язково",
155
201
  "pipeline": "Конвеєр",
156
202
  "chooseAtRunTime": "Обрати під час запуску",
@@ -2892,7 +2938,8 @@
2892
2938
  "subtitle": {
2893
2939
  "humanReview": "Чекає на огляд коду людиною в PR, повторюючи виправлювача після коментарів",
2894
2940
  "ci": "Блокує PR до зеленого CI, повторюючи виправлювача CI у разі помилки",
2895
- "conflicts": "Блокує PR до чистого злиття, повторюючи розв'язувача у разі конфліктів"
2941
+ "conflicts": "Блокує PR до чистого злиття, повторюючи розв'язувача у разі конфліктів",
2942
+ "docQuality": "Перевіряє структуру підготовленого документа, повторюючи виправлювача документів у разі проблем"
2896
2943
  },
2897
2944
  "status": {
2898
2945
  "passed": "Пройдено",
@@ -2933,6 +2980,11 @@
2933
2980
  "mergeability": "Можливість злиття",
2934
2981
  "viewPr": "Переглянути pull request на GitHub"
2935
2982
  },
2983
+ "docQuality": {
2984
+ "findings": "Проблеми документа",
2985
+ "findingsFallback": "Документ пройшов структурні перевірки.",
2986
+ "viewPr": "Переглянути pull request на GitHub"
2987
+ },
2936
2988
  "attemptsHeading": "Спроби: {helper}",
2937
2989
  "attempt": "Спроба {number}",
2938
2990
  "attemptInstructions": "Передано: {helper}",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cat-factory/app",
3
- "version": "0.88.0",
3
+ "version": "0.90.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.96.0"
37
+ "@cat-factory/contracts": "0.97.0"
38
38
  },
39
39
  "devDependencies": {
40
40
  "@toad-contracts/testing": "0.3.2",