@cat-factory/app 0.87.5 → 0.89.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.
@@ -3,12 +3,21 @@ import {
3
3
  cancelInitiativeContract,
4
4
  continueInitiativePlanningContract,
5
5
  createInitiativeContract,
6
+ dismissInitiativeFollowUpContract,
6
7
  getInitiativeByBlockContract,
7
8
  getInitiativeContract,
8
9
  listInitiativesContract,
9
10
  pauseInitiativeContract,
10
11
  proceedInitiativePlanningContract,
12
+ promoteInitiativeFollowUpContract,
11
13
  resumeInitiativeContract,
14
+ updateInitiativeItemContract,
15
+ updateInitiativePolicyContract,
16
+ } from '@cat-factory/contracts'
17
+ import type {
18
+ InitiativeExecutionPolicy,
19
+ PromoteInitiativeFollowUpInput,
20
+ UpdateInitiativeItemInput,
12
21
  } from '@cat-factory/contracts'
13
22
  import type { ApiContext } from './context'
14
23
 
@@ -66,5 +75,47 @@ export function initiativeApi({ send, ws }: ApiContext) {
66
75
 
67
76
  cancelInitiative: (workspaceId: string, blockId: string) =>
68
77
  send(cancelInitiativeContract, { pathPrefix: ws(workspaceId), pathParams: { blockId } }),
78
+
79
+ // Follow-up triage + item/policy editing (slice 4): keyed by initiative id.
80
+ promoteInitiativeFollowUp: (
81
+ workspaceId: string,
82
+ initiativeId: string,
83
+ followUpId: string,
84
+ body: PromoteInitiativeFollowUpInput,
85
+ ) =>
86
+ send(promoteInitiativeFollowUpContract, {
87
+ pathPrefix: ws(workspaceId),
88
+ pathParams: { initiativeId, followUpId },
89
+ body,
90
+ }),
91
+
92
+ dismissInitiativeFollowUp: (workspaceId: string, initiativeId: string, followUpId: string) =>
93
+ send(dismissInitiativeFollowUpContract, {
94
+ pathPrefix: ws(workspaceId),
95
+ pathParams: { initiativeId, followUpId },
96
+ }),
97
+
98
+ updateInitiativeItem: (
99
+ workspaceId: string,
100
+ initiativeId: string,
101
+ itemId: string,
102
+ body: UpdateInitiativeItemInput,
103
+ ) =>
104
+ send(updateInitiativeItemContract, {
105
+ pathPrefix: ws(workspaceId),
106
+ pathParams: { initiativeId, itemId },
107
+ body,
108
+ }),
109
+
110
+ updateInitiativePolicy: (
111
+ workspaceId: string,
112
+ initiativeId: string,
113
+ body: InitiativeExecutionPolicy,
114
+ ) =>
115
+ send(updateInitiativePolicyContract, {
116
+ pathPrefix: ws(workspaceId),
117
+ pathParams: { initiativeId },
118
+ body,
119
+ }),
69
120
  }
70
121
  }
@@ -1,6 +1,11 @@
1
1
  import { defineStore } from 'pinia'
2
2
  import { computed, ref } from 'vue'
3
- import type { Initiative } from '~/types/domain'
3
+ import type {
4
+ Initiative,
5
+ InitiativeExecutionPolicy,
6
+ PromoteInitiativeFollowUpInput,
7
+ UpdateInitiativeItemInput,
8
+ } from '~/types/domain'
4
9
  import { useWorkspaceStore } from '~/stores/workspace'
5
10
  import { useBoardStore } from '~/stores/board'
6
11
 
@@ -154,6 +159,77 @@ export const useInitiativesStore = defineStore('initiatives', () => {
154
159
  }
155
160
  }
156
161
 
162
+ /** True while a curation action (promote/dismiss/edit item/edit policy) is in flight. */
163
+ const curating = ref(false)
164
+
165
+ async function curate<T>(fn: () => Promise<T>): Promise<T> {
166
+ if (!workspace.workspaceId) throw new Error('No active workspace')
167
+ curating.value = true
168
+ try {
169
+ return await fn()
170
+ } finally {
171
+ curating.value = false
172
+ }
173
+ }
174
+
175
+ /** Promote an `open` harvested follow-up into a new pending tracker item. */
176
+ async function promoteFollowUp(
177
+ initiativeId: string,
178
+ followUpId: string,
179
+ input: PromoteInitiativeFollowUpInput,
180
+ ) {
181
+ return curate(async () => {
182
+ const updated = await api.promoteInitiativeFollowUp(
183
+ workspace.workspaceId!,
184
+ initiativeId,
185
+ followUpId,
186
+ input,
187
+ )
188
+ upsert(updated)
189
+ return updated
190
+ })
191
+ }
192
+
193
+ /** Dismiss a harvested follow-up. */
194
+ async function dismissFollowUp(initiativeId: string, followUpId: string) {
195
+ return curate(async () => {
196
+ const updated = await api.dismissInitiativeFollowUp(
197
+ workspace.workspaceId!,
198
+ initiativeId,
199
+ followUpId,
200
+ )
201
+ upsert(updated)
202
+ return updated
203
+ })
204
+ }
205
+
206
+ /** Edit one tracker item and/or drive its status (retry a blocked item / skip it). */
207
+ async function updateItem(
208
+ initiativeId: string,
209
+ itemId: string,
210
+ input: UpdateInitiativeItemInput,
211
+ ) {
212
+ return curate(async () => {
213
+ const updated = await api.updateInitiativeItem(
214
+ workspace.workspaceId!,
215
+ initiativeId,
216
+ itemId,
217
+ input,
218
+ )
219
+ upsert(updated)
220
+ return updated
221
+ })
222
+ }
223
+
224
+ /** Replace the execution policy (concurrency + pipeline rules). */
225
+ async function updatePolicy(initiativeId: string, policy: InitiativeExecutionPolicy) {
226
+ return curate(async () => {
227
+ const updated = await api.updateInitiativePolicy(workspace.workspaceId!, initiativeId, policy)
228
+ upsert(updated)
229
+ return updated
230
+ })
231
+ }
232
+
157
233
  function reset() {
158
234
  byBlock.value = {}
159
235
  }
@@ -165,6 +241,7 @@ export const useInitiativesStore = defineStore('initiatives', () => {
165
241
  creating,
166
242
  resuming,
167
243
  controlling,
244
+ curating,
168
245
  forBlock,
169
246
  hydrate,
170
247
  upsert,
@@ -174,6 +251,10 @@ export const useInitiativesStore = defineStore('initiatives', () => {
174
251
  continuePlanning,
175
252
  proceedPlanning,
176
253
  control,
254
+ promoteFollowUp,
255
+ dismissFollowUp,
256
+ updateItem,
257
+ updatePolicy,
177
258
  reset,
178
259
  }
179
260
  })
@@ -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 {
@@ -15,4 +15,7 @@ export type {
15
15
  InitiativePipelineRule,
16
16
  InitiativeQa,
17
17
  InitiativeStatus,
18
+ PromoteInitiativeFollowUpInput,
19
+ UpdateInitiativeItemInput,
20
+ UpdateInitiativePolicyInput,
18
21
  } from '@cat-factory/contracts'
@@ -9,6 +9,7 @@
9
9
  export type {
10
10
  ScheduleTemplate,
11
11
  Recurrence,
12
+ IssueIntakeConfig,
12
13
  PipelineSchedule,
13
14
  ScheduleRun,
14
15
  CreateScheduleInput,
@@ -51,16 +51,18 @@ export const AGENT_ARCHETYPES: AgentArchetype[] = [
51
51
  resultView: 'clarity-review',
52
52
  },
53
53
  {
54
- // A read-only `/explore` agent (like the architect), so it's a first-class palette block
55
- // a user can add to any pipeline — not just the `pl_bugfix` preset where it leads. No
56
- // `resultView`: the enriched report is prose, so it uses the generic step-detail panel.
54
+ // A read-only, structured `container-explore` agent, so it's a first-class palette block a
55
+ // user can add to any pipeline — not just the `pl_bugfix` preset where it leads. Its
56
+ // structured triage opens in the shared generic viewer; the clarity gate consumes its
57
+ // `clarity`/`questions` server-side.
57
58
  kind: 'bug-investigator',
58
59
  label: 'Bug Investigator',
59
60
  icon: 'i-lucide-search-code',
60
61
  color: '#38bdf8',
61
62
  category: 'review',
62
63
  description:
63
- 'Read-only codebase investigation that traces the bug to its root cause and produces an enriched report (no code changes).',
64
+ 'Read-only, multi-repo codebase investigation that traces the bug to its root cause and decides whether the report is fixable as-is or needs the reporter to clarify (no code changes).',
65
+ resultView: 'generic-structured',
64
66
  },
65
67
  {
66
68
  kind: 'task-estimator',
@@ -1,10 +1,19 @@
1
- import type { InitiativeItem, InitiativeItemStatus, InitiativeStatus } from '~/types/domain'
1
+ import type {
2
+ InitiativeFollowUp,
3
+ InitiativeItem,
4
+ InitiativeItemStatus,
5
+ InitiativeStatus,
6
+ } from '~/types/domain'
2
7
 
3
8
  // Shared initiative presentation vocabulary, so the board card, the inspector body and
4
9
  // the tracker window render statuses/progress from ONE source. The exhaustive
5
- // `Record<Enum, string>` maps keep the tier-2 typecheck guard live (a new status without
10
+ // `Record<Enum, …>` maps keep the tier-2 typecheck guard live (a new status without
6
11
  // a label/chip fails the build) without triplicating it across the components.
7
12
 
13
+ /** Nuxt UI badge/chip colour names — mirrors `UBadge`'s `color` prop union, so a chip map
14
+ * types its values against it and the `:color` binding needs no cast. */
15
+ type BadgeColor = 'error' | 'info' | 'primary' | 'secondary' | 'success' | 'warning' | 'neutral'
16
+
8
17
  /** Initiative lifecycle status → i18n label key. */
9
18
  export const INITIATIVE_STATUS_LABEL_KEYS: Record<InitiativeStatus, string> = {
10
19
  planning: 'initiative.status.planning',
@@ -16,7 +25,7 @@ export const INITIATIVE_STATUS_LABEL_KEYS: Record<InitiativeStatus, string> = {
16
25
  }
17
26
 
18
27
  /** Initiative lifecycle status → Nuxt UI badge colour. */
19
- export const INITIATIVE_STATUS_CHIPS: Record<InitiativeStatus, string> = {
28
+ export const INITIATIVE_STATUS_CHIPS: Record<InitiativeStatus, BadgeColor> = {
20
29
  planning: 'neutral',
21
30
  awaiting_approval: 'warning',
22
31
  executing: 'info',
@@ -36,7 +45,7 @@ export const INITIATIVE_ITEM_STATUS_LABEL_KEYS: Record<InitiativeItemStatus, str
36
45
  }
37
46
 
38
47
  /** Tracker item status → Nuxt UI badge colour. */
39
- export const INITIATIVE_ITEM_STATUS_CHIPS: Record<InitiativeItemStatus, string> = {
48
+ export const INITIATIVE_ITEM_STATUS_CHIPS: Record<InitiativeItemStatus, BadgeColor> = {
40
49
  pending: 'neutral',
41
50
  in_progress: 'info',
42
51
  pr_open: 'warning',
@@ -45,6 +54,20 @@ export const INITIATIVE_ITEM_STATUS_CHIPS: Record<InitiativeItemStatus, string>
45
54
  skipped: 'neutral',
46
55
  }
47
56
 
57
+ /** Follow-up triage status → i18n label key. Exhaustive so a new status fails the build. */
58
+ export const INITIATIVE_FOLLOWUP_STATUS_LABEL_KEYS: Record<InitiativeFollowUp['status'], string> = {
59
+ open: 'initiative.followUpStatus.open',
60
+ promoted: 'initiative.followUpStatus.promoted',
61
+ dismissed: 'initiative.followUpStatus.dismissed',
62
+ }
63
+
64
+ /** Follow-up triage status → Nuxt UI badge colour. */
65
+ export const INITIATIVE_FOLLOWUP_STATUS_CHIPS: Record<InitiativeFollowUp['status'], BadgeColor> = {
66
+ open: 'warning',
67
+ promoted: 'success',
68
+ dismissed: 'neutral',
69
+ }
70
+
48
71
  /** Item statuses that count as settled — mirrors the backend terminal-status set. */
49
72
  const SETTLED: ReadonlySet<InitiativeItemStatus> = new Set(['done', 'skipped'])
50
73
 
@@ -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",
@@ -219,7 +262,17 @@
219
262
  "submit": "Add recurring pipeline",
220
263
  "addFailedTitle": "Could not add recurring pipeline",
221
264
  "onDemand": "On-demand (manual only)",
222
- "onDemandHint": "Runs only when you trigger it, with no schedule. Because you are present each time, its task may use an individual-usage subscription model."
265
+ "onDemandHint": "Runs only when you trigger it, with no schedule. Because you are present each time, its task may use an individual-usage subscription model.",
266
+ "intake": "Issue intake",
267
+ "intakeHint": "Each run picks one matching open issue from the tracker and works it end to end.",
268
+ "intakeNoSources": "Connect a task source first to pull issues from it.",
269
+ "intakeGithubRepo": "Repository",
270
+ "intakeTitleFragment": "Title contains",
271
+ "intakeTitleFragmentPlaceholder": "e.g. crash",
272
+ "intakeLabels": "Labels",
273
+ "intakeLabelsPlaceholder": "comma-separated",
274
+ "intakeIssueType": "Issue type",
275
+ "intakeInProgressLabel": "In-progress label"
223
276
  },
224
277
  "failure": {
225
278
  "containerFailedToStart": "Container failed to start",
@@ -854,7 +907,8 @@
854
907
  "auto_merge_disabled": "The {preset} preset sends every PR to a human, so this one is waiting for review.",
855
908
  "no_rationale": "The merger scored the PR but gave no rationale, so the verdict could not be trusted to auto-merge; the PR is waiting for a human to merge.",
856
909
  "no_assessment": "The merger did not return a parseable assessment, so the PR is waiting for a human to merge.",
857
- "merge_failed": "The scores were within the {preset} thresholds, but the automatic merge could not complete (for example branch protection or a conflict), so the PR is waiting for a human to merge."
910
+ "merge_failed": "The scores were within the {preset} thresholds, but the automatic merge could not complete (for example branch protection or a conflict), so the PR is waiting for a human to merge.",
911
+ "merge_partial": "Some of the task's pull requests merged, but a later one could not, so the change is waiting for a human to finish or revert the multi-repo merge."
858
912
  },
859
913
  "scores": "Scores",
860
914
  "axis": {
@@ -4166,6 +4220,26 @@
4166
4220
  "hint": "Continue lets the planner ask follow-ups; Proceed plans with the answers so far.",
4167
4221
  "proceed": "Proceed to plan",
4168
4222
  "continue": "Continue"
4223
+ },
4224
+ "followUpStatus": {
4225
+ "open": "Open",
4226
+ "promoted": "Promoted",
4227
+ "dismissed": "Dismissed"
4228
+ },
4229
+ "curation": {
4230
+ "promote": "Promote to item",
4231
+ "promoteConfirm": "Create item",
4232
+ "dismiss": "Dismiss",
4233
+ "retry": "Retry",
4234
+ "skip": "Skip",
4235
+ "edit": "Edit",
4236
+ "save": "Save",
4237
+ "cancel": "Cancel",
4238
+ "phaseField": "Phase",
4239
+ "itemTitlePlaceholder": "Item title (defaults to the follow-up's)",
4240
+ "maxConcurrentField": "Max concurrent tasks",
4241
+ "defaultPipelineField": "Default pipeline",
4242
+ "failed": "Could not update the initiative"
4169
4243
  }
4170
4244
  }
4171
4245
  }
@@ -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",
@@ -198,7 +244,17 @@
198
244
  "submit": "Añadir pipeline recurrente",
199
245
  "addFailedTitle": "No se pudo añadir la pipeline recurrente",
200
246
  "onDemand": "Bajo demanda (solo manual)",
201
- "onDemandHint": "Se ejecuta solo cuando lo activas, sin programación. Como estás presente cada vez, su tarea puede usar un modelo de suscripción de uso individual."
247
+ "onDemandHint": "Se ejecuta solo cuando lo activas, sin programación. Como estás presente cada vez, su tarea puede usar un modelo de suscripción de uso individual.",
248
+ "intake": "Admisión de incidencias",
249
+ "intakeHint": "Cada ejecución toma una incidencia abierta que coincide del rastreador y la resuelve de principio a fin.",
250
+ "intakeNoSources": "Primero conecta una fuente de tareas para extraer incidencias de ella.",
251
+ "intakeGithubRepo": "Repositorio",
252
+ "intakeTitleFragment": "El título contiene",
253
+ "intakeTitleFragmentPlaceholder": "p. ej. crash",
254
+ "intakeLabels": "Etiquetas",
255
+ "intakeLabelsPlaceholder": "separadas por comas",
256
+ "intakeIssueType": "Tipo de incidencia",
257
+ "intakeInProgressLabel": "Etiqueta de en progreso"
202
258
  },
203
259
  "failure": {
204
260
  "containerFailedToStart": "El contenedor no pudo iniciarse",
@@ -811,7 +867,8 @@
811
867
  "auto_merge_disabled": "El preajuste {preset} envía todos los PR a una persona, así que este espera revisión.",
812
868
  "no_rationale": "El fusionador puntuó el PR pero no dio ninguna justificación, así que no se pudo confiar en el veredicto para fusionar automáticamente; el PR espera a que una persona lo fusione.",
813
869
  "no_assessment": "El fusionador no devolvió una evaluación analizable, por lo que el PR espera a que una persona lo fusione.",
814
- "merge_failed": "Las puntuaciones estaban dentro de los umbrales de {preset}, pero la fusión automática no pudo completarse (por ejemplo, protección de rama o un conflicto), por lo que el PR espera a que una persona lo fusione."
870
+ "merge_failed": "Las puntuaciones estaban dentro de los umbrales de {preset}, pero la fusión automática no pudo completarse (por ejemplo, protección de rama o un conflicto), por lo que el PR espera a que una persona lo fusione.",
871
+ "merge_partial": "Algunas de las solicitudes de incorporación de la tarea se fusionaron, pero una posterior no pudo, por lo que el cambio espera a que una persona termine o revierta la fusión multirrepositorio."
815
872
  },
816
873
  "scores": "Puntuaciones",
817
874
  "axis": {
@@ -4048,6 +4105,26 @@
4048
4105
  "hint": "Continuar permite al planificador hacer mas preguntas; Proceder planifica con las respuestas actuales.",
4049
4106
  "proceed": "Proceder a planificar",
4050
4107
  "continue": "Continuar"
4108
+ },
4109
+ "followUpStatus": {
4110
+ "open": "Abierto",
4111
+ "promoted": "Promovido",
4112
+ "dismissed": "Descartado"
4113
+ },
4114
+ "curation": {
4115
+ "promote": "Promover a elemento",
4116
+ "promoteConfirm": "Crear elemento",
4117
+ "dismiss": "Descartar",
4118
+ "retry": "Reintentar",
4119
+ "skip": "Omitir",
4120
+ "edit": "Editar",
4121
+ "save": "Guardar",
4122
+ "cancel": "Cancelar",
4123
+ "phaseField": "Fase",
4124
+ "itemTitlePlaceholder": "Titulo del elemento (por defecto el del seguimiento)",
4125
+ "maxConcurrentField": "Tareas concurrentes maximas",
4126
+ "defaultPipelineField": "Pipeline por defecto",
4127
+ "failed": "No se pudo actualizar la iniciativa"
4051
4128
  }
4052
4129
  }
4053
4130
  }
@@ -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",
@@ -198,7 +244,17 @@
198
244
  "submit": "Ajouter la pipeline récurrente",
199
245
  "addFailedTitle": "Impossible d’ajouter la pipeline récurrente",
200
246
  "onDemand": "À la demande (manuel uniquement)",
201
- "onDemandHint": "Ne s'exécute que lorsque vous le déclenchez, sans planification. Comme vous êtes présent à chaque fois, sa tâche peut utiliser un modèle d'abonnement à usage individuel."
247
+ "onDemandHint": "Ne s'exécute que lorsque vous le déclenchez, sans planification. Comme vous êtes présent à chaque fois, sa tâche peut utiliser un modèle d'abonnement à usage individuel.",
248
+ "intake": "Prise en charge des tickets",
249
+ "intakeHint": "Chaque exécution sélectionne un ticket ouvert correspondant dans le suivi et le traite de bout en bout.",
250
+ "intakeNoSources": "Connectez d'abord une source de tâches pour en extraire des tickets.",
251
+ "intakeGithubRepo": "Dépôt",
252
+ "intakeTitleFragment": "Le titre contient",
253
+ "intakeTitleFragmentPlaceholder": "ex. crash",
254
+ "intakeLabels": "Étiquettes",
255
+ "intakeLabelsPlaceholder": "séparées par des virgules",
256
+ "intakeIssueType": "Type de ticket",
257
+ "intakeInProgressLabel": "Étiquette en cours"
202
258
  },
203
259
  "failure": {
204
260
  "containerFailedToStart": "Le conteneur n’a pas pu démarrer",
@@ -811,7 +867,8 @@
811
867
  "auto_merge_disabled": "Le préréglage {preset} envoie chaque PR à une personne ; celle-ci attend donc une revue.",
812
868
  "no_rationale": "Le fusionneur a évalué la PR mais n'a donné aucune justification, le verdict n'a donc pas pu être approuvé pour une fusion automatique ; la PR attend une fusion par une personne.",
813
869
  "no_assessment": "Le fusionneur n'a pas renvoyé d'évaluation exploitable, la PR attend donc une fusion par une personne.",
814
- "merge_failed": "Les scores étaient dans les seuils de {preset}, mais la fusion automatique n'a pas pu aboutir (par exemple protection de branche ou conflit), la PR attend donc une fusion par une personne."
870
+ "merge_failed": "Les scores étaient dans les seuils de {preset}, mais la fusion automatique n'a pas pu aboutir (par exemple protection de branche ou conflit), la PR attend donc une fusion par une personne.",
871
+ "merge_partial": "Certaines des pull requests de la tâche ont été fusionnées, mais une suivante n'a pas pu l'être, le changement attend donc qu'une personne termine ou annule la fusion multi-dépôt."
815
872
  },
816
873
  "scores": "Scores",
817
874
  "axis": {
@@ -4048,6 +4105,26 @@
4048
4105
  "hint": "Continuer permet au planificateur de poser des questions complementaires ; Proceder planifie avec les reponses actuelles.",
4049
4106
  "proceed": "Proceder a la planification",
4050
4107
  "continue": "Continuer"
4108
+ },
4109
+ "followUpStatus": {
4110
+ "open": "Ouvert",
4111
+ "promoted": "Promu",
4112
+ "dismissed": "Rejete"
4113
+ },
4114
+ "curation": {
4115
+ "promote": "Promouvoir en element",
4116
+ "promoteConfirm": "Creer l'element",
4117
+ "dismiss": "Rejeter",
4118
+ "retry": "Reessayer",
4119
+ "skip": "Ignorer",
4120
+ "edit": "Modifier",
4121
+ "save": "Enregistrer",
4122
+ "cancel": "Annuler",
4123
+ "phaseField": "Phase",
4124
+ "itemTitlePlaceholder": "Titre de l'element (par defaut celui du suivi)",
4125
+ "maxConcurrentField": "Taches simultanees maximales",
4126
+ "defaultPipelineField": "Pipeline par defaut",
4127
+ "failed": "Impossible de mettre a jour l'initiative"
4051
4128
  }
4052
4129
  }
4053
4130
  }