@cat-factory/app 0.140.0 → 0.141.1

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.
@@ -0,0 +1,66 @@
1
+ import { describe, expect, it } from 'vitest'
2
+ import { pipelineAllowedForTaskType, purposeAllowsAgentCategory } from '@cat-factory/contracts'
3
+ import type { Block, Pipeline } from '~/types/domain'
4
+ import { pipelineAllowedForManualStart } from '~/utils/pipeline'
5
+
6
+ // A minimal pipeline: only the fields the launch/task-type filters read matter here.
7
+ function pipeline(over: Partial<Pipeline> = {}): Pipeline {
8
+ return { id: 'pl_x', name: 'X', agentKinds: ['coder'], ...over } as Pipeline
9
+ }
10
+
11
+ describe('pipelineAllowedForTaskType', () => {
12
+ it('a document task offers ONLY document-purpose pipelines', () => {
13
+ expect(pipelineAllowedForTaskType(pipeline({ purpose: 'document' }), 'document')).toBe(true)
14
+ expect(pipelineAllowedForTaskType(pipeline({ purpose: 'build' }), 'document')).toBe(false)
15
+ expect(pipelineAllowedForTaskType(pipeline({ purpose: 'research' }), 'document')).toBe(false)
16
+ // An unclassified pipeline is hidden from a document task (it requires the explicit classifier).
17
+ expect(pipelineAllowedForTaskType(pipeline({ purpose: undefined }), 'document')).toBe(false)
18
+ })
19
+
20
+ it('every non-document task type is unrestricted (any purpose, and undefined type)', () => {
21
+ for (const type of ['feature', 'bug', 'spike', 'review', 'ralph', undefined] as const) {
22
+ expect(pipelineAllowedForTaskType(pipeline({ purpose: 'build' }), type)).toBe(true)
23
+ expect(pipelineAllowedForTaskType(pipeline({ purpose: 'document' }), type)).toBe(true)
24
+ expect(pipelineAllowedForTaskType(pipeline({ purpose: undefined }), type)).toBe(true)
25
+ }
26
+ })
27
+ })
28
+
29
+ describe('purposeAllowsAgentCategory (builder palette gate)', () => {
30
+ it('a build (or unclassified) pipeline may use every category', () => {
31
+ for (const purpose of ['build', null, undefined] as const) {
32
+ for (const cat of ['review', 'design', 'build', 'test', 'docs', 'gates'] as const) {
33
+ expect(purposeAllowsAgentCategory(purpose, cat)).toBe(true)
34
+ }
35
+ }
36
+ })
37
+
38
+ it('a non-build pipeline hides the Implementation (build) and Testing (test) categories', () => {
39
+ for (const purpose of ['document', 'review', 'research', 'planning'] as const) {
40
+ expect(purposeAllowsAgentCategory(purpose, 'build')).toBe(false)
41
+ expect(purposeAllowsAgentCategory(purpose, 'test')).toBe(false)
42
+ // Non-code categories stay visible.
43
+ expect(purposeAllowsAgentCategory(purpose, 'docs')).toBe(true)
44
+ expect(purposeAllowsAgentCategory(purpose, 'review')).toBe(true)
45
+ expect(purposeAllowsAgentCategory(purpose, 'gates')).toBe(true)
46
+ }
47
+ })
48
+ })
49
+
50
+ describe('pipelineAllowedForManualStart composes the task-type gate', () => {
51
+ const noFrame = undefined
52
+ const blocks: Block[] = []
53
+
54
+ it('drops a non-document pipeline for a document task, keeps it for others', () => {
55
+ const build = pipeline({ purpose: 'build' })
56
+ expect(pipelineAllowedForManualStart(build, noFrame, blocks, 'document')).toBe(false)
57
+ expect(pipelineAllowedForManualStart(build, noFrame, blocks, 'feature')).toBe(true)
58
+ // No task type supplied ⇒ no task-type restriction.
59
+ expect(pipelineAllowedForManualStart(build, noFrame, blocks)).toBe(true)
60
+ })
61
+
62
+ it('still excludes recurring-only pipelines regardless of task type', () => {
63
+ const recurring = pipeline({ purpose: 'document', availability: 'recurring' })
64
+ expect(pipelineAllowedForManualStart(recurring, noFrame, blocks, 'document')).toBe(false)
65
+ })
66
+ })
@@ -1,4 +1,8 @@
1
- import { frameAllowsVisualPipeline, pipelineHasVisualStep } from '@cat-factory/contracts'
1
+ import {
2
+ frameAllowsVisualPipeline,
3
+ pipelineAllowedForTaskType,
4
+ pipelineHasVisualStep,
5
+ } from '@cat-factory/contracts'
2
6
  import type { AgentKind, Block, Pipeline } from '~/types/domain'
3
7
 
4
8
  /** One agent step of a pipeline as shown in a preview: its kind + whether it's a human-gated step. */
@@ -25,6 +29,10 @@ export function pipelineDisplaySteps(pipeline: Pipeline): PipelineDisplayStep[]
25
29
  .map(({ kind, gated }) => ({ kind, gated }))
26
30
  }
27
31
 
32
+ // Re-exported so a picker can import the task-type gate from the same module as the
33
+ // launch/frame gates it composes with (the classifier itself lives in `@cat-factory/contracts`).
34
+ export { pipelineAllowedForTaskType }
35
+
28
36
  // Surface counterpart to the backend's slice-4c run-start gate: a pipeline with a visual step
29
37
  // (`tester-ui` / `visual-confirmation`) may run only on a frame with a UI to exercise — a
30
38
  // `frontend` frame, or a frame a `frontend` frame links to. The SPA hides such pipelines from
@@ -53,14 +61,21 @@ export function pipelineAllowedForFrame(
53
61
  /**
54
62
  * Whether `pipeline` may be started as a MANUAL one-off task run (the board/inspector Run menus,
55
63
  * the add-task modal, the task run-settings default). Excludes `'recurring'`-only pipelines the
56
- * backend would refuse.
64
+ * backend would refuse, visual pipelines on a frame with no UI, and — when a `taskType` is given —
65
+ * pipelines whose `purpose` doesn't fit that task type (a `document` task offers only document
66
+ * pipelines). `taskType` omitted ⇒ no task-type restriction (an un-typed context shows all).
57
67
  */
58
68
  export function pipelineAllowedForManualStart(
59
69
  pipeline: Pipeline,
60
70
  frame: Block | undefined,
61
71
  blocks: readonly Block[],
72
+ taskType?: Block['taskType'],
62
73
  ): boolean {
63
- return pipeline.availability !== 'recurring' && pipelineAllowedForFrame(pipeline, frame, blocks)
74
+ return (
75
+ pipeline.availability !== 'recurring' &&
76
+ pipelineAllowedForFrame(pipeline, frame, blocks) &&
77
+ pipelineAllowedForTaskType(pipeline, taskType)
78
+ )
64
79
  }
65
80
 
66
81
  /**
@@ -2992,10 +2992,10 @@
2992
2992
  "heading": "Kontextdokumente",
2993
2993
  "hint": "Dokumente, die dieser Aufgabe als Kontext angehängt sind. Ihr Inhalt wird den Agents gegeben, die an der Aufgabe arbeiten.",
2994
2994
  "attach": "Anhängen",
2995
- "importPage": "Eine Seite importieren…",
2995
+ "connectSource": "Quelle verbinden",
2996
+ "connectSourceNamed": "{source} verbinden",
2996
2997
  "empty": "Hängen Sie eine Anforderung, ein RFC oder ein PRD an, damit Agents es beim Umsetzen dieser Aufgabe sehen.",
2997
- "attached": "Dokument angehängt",
2998
- "attachFailed": "Anhängen nicht möglich"
2998
+ "attached": "Dokument angehängt"
2999
2999
  },
3000
3000
  "templates": {
3001
3001
  "title": "Dokumentvorlagen & Beispiele",
@@ -3033,9 +3033,9 @@
3033
3033
  "title": "Kontext-Issues",
3034
3034
  "hint": "Tracker-Issues, die dieser Aufgabe als Kontext angehängt sind. Ihr Inhalt wird den Agents gegeben, die an der Aufgabe arbeiten.",
3035
3035
  "attach": "Anhängen",
3036
+ "connectSource": "Quelle verbinden",
3037
+ "connectSourceNamed": "{source} verbinden",
3036
3038
  "attached": "Issue angehängt",
3037
- "attachFailed": "Anhängen nicht möglich",
3038
- "importIssue": "Ein Issue importieren…",
3039
3039
  "emptyHint": "Hängen Sie ein Jira-Issue an, damit Agents seine Beschreibung und Kommentare beim Umsetzen dieser Aufgabe sehen."
3040
3040
  },
3041
3041
  "import": {
@@ -3142,6 +3142,15 @@
3142
3142
  "impactThreshold": "Auswirkung ≥",
3143
3143
  "strategy": "Strategie",
3144
3144
  "rounds": "Runden",
3145
+ "purposeLabel": "Zweck",
3146
+ "purposePlaceholder": "Zweck auswählen",
3147
+ "purposeOption": {
3148
+ "build": "Entwicklung",
3149
+ "document": "Dokumentation",
3150
+ "review": "Review",
3151
+ "research": "Recherche",
3152
+ "planning": "Planung"
3153
+ },
3145
3154
  "strategyOption": {
3146
3155
  "specialist-panel": "Spezialisten-Panel",
3147
3156
  "debate": "Debatte",
@@ -3195,7 +3204,8 @@
3195
3204
  "skillPlaceholder": "Skill auswählen",
3196
3205
  "skillNoneAvailable": "Keine Skills verfügbar. Verknüpfe eine Skill-Quelle in den Kontoeinstellungen.",
3197
3206
  "skillMissing": "Dieser Skill ist nicht mehr im Katalog; wähle einen anderen.",
3198
- "skillNeedsPick": "Ein Skill-Schritt braucht einen ausgewählten Skill, bevor du speichern kannst."
3207
+ "skillNeedsPick": "Ein Skill-Schritt braucht einen ausgewählten Skill, bevor du speichern kannst.",
3208
+ "purposeStepsConflict": "Dieser Zweck schreibt keinen Code und führt keine Tests aus, doch die Pipeline enthält noch Implementierungs- oder Testschritte. Entfernen Sie diese oder setzen Sie den Zweck auf Entwicklung."
3199
3209
  },
3200
3210
  "progress": {
3201
3211
  "status": {
@@ -3355,10 +3355,10 @@
3355
3355
  "heading": "Context documents",
3356
3356
  "hint": "Documents attached to this task as context. Their content is given to the agents that work on the task.",
3357
3357
  "attach": "Attach",
3358
- "importPage": "Import a page…",
3358
+ "connectSource": "Connect a source",
3359
+ "connectSourceNamed": "Connect {source}",
3359
3360
  "empty": "Attach a requirement, RFC or PRD so agents see it while implementing this task.",
3360
- "attached": "Document attached",
3361
- "attachFailed": "Could not attach"
3361
+ "attached": "Document attached"
3362
3362
  },
3363
3363
  "templates": {
3364
3364
  "title": "Document templates & examples",
@@ -3396,9 +3396,9 @@
3396
3396
  "title": "Context issues",
3397
3397
  "hint": "Tracker issues attached to this task as context. Their content is given to the agents that work on the task.",
3398
3398
  "attach": "Attach",
3399
+ "connectSource": "Connect a source",
3400
+ "connectSourceNamed": "Connect {source}",
3399
3401
  "attached": "Issue attached",
3400
- "attachFailed": "Could not attach",
3401
- "importIssue": "Import an issue…",
3402
3402
  "emptyHint": "Attach a Jira issue so agents see its description and comments while implementing this task."
3403
3403
  },
3404
3404
  "import": {
@@ -3508,6 +3508,15 @@
3508
3508
  "impactThreshold": "impact ≥",
3509
3509
  "strategy": "Strategy",
3510
3510
  "rounds": "Rounds",
3511
+ "purposeLabel": "Purpose",
3512
+ "purposePlaceholder": "Select a purpose",
3513
+ "purposeOption": {
3514
+ "build": "Build",
3515
+ "document": "Documentation",
3516
+ "review": "Review",
3517
+ "research": "Research",
3518
+ "planning": "Planning"
3519
+ },
3511
3520
  "strategyOption": {
3512
3521
  "specialist-panel": "Specialist panel",
3513
3522
  "debate": "Debate",
@@ -3561,7 +3570,8 @@
3561
3570
  "skillPlaceholder": "Select a skill",
3562
3571
  "skillNoneAvailable": "No skills available. Link a skill source in account settings.",
3563
3572
  "skillMissing": "This skill is no longer in the catalog; pick another.",
3564
- "skillNeedsPick": "A Skill step needs a skill selected before you can save."
3573
+ "skillNeedsPick": "A Skill step needs a skill selected before you can save.",
3574
+ "purposeStepsConflict": "This purpose writes no code and runs no tests, but the pipeline still has implementation or testing steps. Remove them or switch the purpose to Build."
3565
3575
  },
3566
3576
  "progress": {
3567
3577
  "status": {
@@ -3259,10 +3259,10 @@
3259
3259
  "heading": "Documentos de contexto",
3260
3260
  "hint": "Documentos adjuntos a esta tarea como contexto. Su contenido se entrega a los agentes que trabajan en la tarea.",
3261
3261
  "attach": "Adjuntar",
3262
- "importPage": "Importar una página…",
3262
+ "connectSource": "Conectar una fuente",
3263
+ "connectSourceNamed": "Conectar {source}",
3263
3264
  "empty": "Adjunta un requisito, RFC o PRD para que los agentes lo vean mientras implementan esta tarea.",
3264
- "attached": "Documento adjuntado",
3265
- "attachFailed": "No se pudo adjuntar"
3265
+ "attached": "Documento adjuntado"
3266
3266
  },
3267
3267
  "templates": {
3268
3268
  "title": "Plantillas y ejemplos de documentos",
@@ -3300,9 +3300,9 @@
3300
3300
  "title": "Incidencias de contexto",
3301
3301
  "hint": "Incidencias del tracker adjuntas a esta tarea como contexto. Su contenido se entrega a los agentes que trabajan en la tarea.",
3302
3302
  "attach": "Adjuntar",
3303
+ "connectSource": "Conectar una fuente",
3304
+ "connectSourceNamed": "Conectar {source}",
3303
3305
  "attached": "Incidencia adjuntada",
3304
- "attachFailed": "No se pudo adjuntar",
3305
- "importIssue": "Importar una incidencia…",
3306
3306
  "emptyHint": "Adjunta una incidencia de Jira para que los agentes vean su descripción y comentarios al implementar esta tarea."
3307
3307
  },
3308
3308
  "import": {
@@ -3409,6 +3409,15 @@
3409
3409
  "impactThreshold": "impacto ≥",
3410
3410
  "strategy": "Estrategia",
3411
3411
  "rounds": "Rondas",
3412
+ "purposeLabel": "Propósito",
3413
+ "purposePlaceholder": "Seleccionar un propósito",
3414
+ "purposeOption": {
3415
+ "build": "Desarrollo",
3416
+ "document": "Documentación",
3417
+ "review": "Revisión",
3418
+ "research": "Investigación",
3419
+ "planning": "Planificación"
3420
+ },
3412
3421
  "strategyOption": {
3413
3422
  "specialist-panel": "Panel de especialistas",
3414
3423
  "debate": "Debate",
@@ -3462,7 +3471,8 @@
3462
3471
  "skillPlaceholder": "Selecciona una habilidad",
3463
3472
  "skillNoneAvailable": "No hay habilidades disponibles. Vincula una fuente de habilidades en la configuración de la cuenta.",
3464
3473
  "skillMissing": "Esta habilidad ya no está en el catálogo; elige otra.",
3465
- "skillNeedsPick": "Un paso Skill necesita una habilidad seleccionada antes de poder guardar."
3474
+ "skillNeedsPick": "Un paso Skill necesita una habilidad seleccionada antes de poder guardar.",
3475
+ "purposeStepsConflict": "Este propósito no escribe código ni ejecuta pruebas, pero la canalización todavía tiene pasos de implementación o de prueba. Quítalos o cambia el propósito a Desarrollo."
3466
3476
  },
3467
3477
  "progress": {
3468
3478
  "status": {
@@ -3259,10 +3259,10 @@
3259
3259
  "heading": "Documents de contexte",
3260
3260
  "hint": "Documents joints à cette tâche comme contexte. Leur contenu est fourni aux agents qui travaillent sur la tâche.",
3261
3261
  "attach": "Joindre",
3262
- "importPage": "Importer une page…",
3262
+ "connectSource": "Connecter une source",
3263
+ "connectSourceNamed": "Connecter {source}",
3263
3264
  "empty": "Joignez une exigence, un RFC ou un PRD pour que les agents le voient pendant l'implémentation de cette tâche.",
3264
- "attached": "Document joint",
3265
- "attachFailed": "Impossible de joindre"
3265
+ "attached": "Document joint"
3266
3266
  },
3267
3267
  "templates": {
3268
3268
  "title": "Modèles et exemples de documents",
@@ -3300,9 +3300,9 @@
3300
3300
  "title": "Tickets de contexte",
3301
3301
  "hint": "Tickets du tracker joints à cette tâche comme contexte. Leur contenu est fourni aux agents qui travaillent sur la tâche.",
3302
3302
  "attach": "Joindre",
3303
+ "connectSource": "Connecter une source",
3304
+ "connectSourceNamed": "Connecter {source}",
3303
3305
  "attached": "Ticket joint",
3304
- "attachFailed": "Impossible de joindre",
3305
- "importIssue": "Importer un ticket…",
3306
3306
  "emptyHint": "Joignez un ticket Jira pour que les agents voient sa description et ses commentaires lors de l'implémentation de cette tâche."
3307
3307
  },
3308
3308
  "import": {
@@ -3409,6 +3409,15 @@
3409
3409
  "impactThreshold": "impact ≥",
3410
3410
  "strategy": "Stratégie",
3411
3411
  "rounds": "Tours",
3412
+ "purposeLabel": "Objectif",
3413
+ "purposePlaceholder": "Sélectionner un objectif",
3414
+ "purposeOption": {
3415
+ "build": "Développement",
3416
+ "document": "Documentation",
3417
+ "review": "Revue",
3418
+ "research": "Recherche",
3419
+ "planning": "Planification"
3420
+ },
3412
3421
  "strategyOption": {
3413
3422
  "specialist-panel": "Panel de spécialistes",
3414
3423
  "debate": "Débat",
@@ -3462,7 +3471,8 @@
3462
3471
  "skillPlaceholder": "Sélectionner une compétence",
3463
3472
  "skillNoneAvailable": "Aucune compétence disponible. Reliez une source de compétences dans les paramètres du compte.",
3464
3473
  "skillMissing": "Cette compétence n'est plus dans le catalogue ; choisissez-en une autre.",
3465
- "skillNeedsPick": "Une étape Skill a besoin d'une compétence sélectionnée avant de pouvoir enregistrer."
3474
+ "skillNeedsPick": "Une étape Skill a besoin d'une compétence sélectionnée avant de pouvoir enregistrer.",
3475
+ "purposeStepsConflict": "Cet objectif n'écrit aucun code et n'exécute aucun test, mais le pipeline contient encore des étapes d'implémentation ou de test. Supprimez-les ou définissez l'objectif sur Développement."
3466
3476
  },
3467
3477
  "progress": {
3468
3478
  "status": {
@@ -3270,10 +3270,10 @@
3270
3270
  "heading": "מסמכי הקשר",
3271
3271
  "hint": "מסמכים המצורפים למשימה זו כהקשר. תוכנם נמסר לסוכנים שעובדים על המשימה.",
3272
3272
  "attach": "צרף",
3273
- "importPage": "ייבא דף…",
3273
+ "connectSource": "חבר מקור",
3274
+ "connectSourceNamed": "חבר את {source}",
3274
3275
  "empty": "צרף דרישה, RFC או PRD כדי שהסוכנים יראו אותם בעת מימוש משימה זו.",
3275
- "attached": "המסמך צורף",
3276
- "attachFailed": "לא ניתן לצרף"
3276
+ "attached": "המסמך צורף"
3277
3277
  },
3278
3278
  "templates": {
3279
3279
  "title": "תבניות ודוגמאות למסמכים",
@@ -3311,9 +3311,9 @@
3311
3311
  "title": "ניושני הקשר",
3312
3312
  "hint": "כרטיסי ה-tracker המצורפים למשימה זו כהקשר. תוכנם נמסר לסוכנים שעובדים על המשימה.",
3313
3313
  "attach": "צרף",
3314
+ "connectSource": "חבר מקור",
3315
+ "connectSourceNamed": "חבר את {source}",
3314
3316
  "attached": "הניושן צורף",
3315
- "attachFailed": "לא ניתן היה לצרף",
3316
- "importIssue": "ייבא ניושן…",
3317
3317
  "emptyHint": "צרף ניושן Jira כדי שסוכנים יראו את התיאור וההערות שלו בעת מימוש משימה זו."
3318
3318
  },
3319
3319
  "import": {
@@ -3420,6 +3420,15 @@
3420
3420
  "impactThreshold": "השפעה ≥",
3421
3421
  "strategy": "אסטרטגיה",
3422
3422
  "rounds": "סבבים",
3423
+ "purposeLabel": "מטרה",
3424
+ "purposePlaceholder": "בחר מטרה",
3425
+ "purposeOption": {
3426
+ "build": "פיתוח",
3427
+ "document": "תיעוד",
3428
+ "review": "סקירה",
3429
+ "research": "מחקר",
3430
+ "planning": "תכנון"
3431
+ },
3423
3432
  "strategyOption": {
3424
3433
  "specialist-panel": "פאנל מומחים",
3425
3434
  "debate": "דיון",
@@ -3473,7 +3482,8 @@
3473
3482
  "skillPlaceholder": "בחר כישור",
3474
3483
  "skillNoneAvailable": "אין כישורים זמינים. קישר מקור כישורים בהגדרות החשבון.",
3475
3484
  "skillMissing": "כישור זה כבר אינו בקטלוג; בחר אחר.",
3476
- "skillNeedsPick": "שלב Skill דורש כישור נבחר לפני שתוכל לשמור."
3485
+ "skillNeedsPick": "שלב Skill דורש כישור נבחר לפני שתוכל לשמור.",
3486
+ "purposeStepsConflict": "מטרה זו אינה כותבת קוד ואינה מריצה בדיקות, אך הצינור עדיין כולל שלבי פיתוח או בדיקה. הסירו אותם או שנו את המטרה לפיתוח."
3477
3487
  },
3478
3488
  "progress": {
3479
3489
  "status": {
@@ -2992,10 +2992,10 @@
2992
2992
  "heading": "Documenti di contesto",
2993
2993
  "hint": "Documenti allegati a questa attività come contesto. Il loro contenuto viene fornito agli agenti che lavorano sull'attività.",
2994
2994
  "attach": "Allega",
2995
- "importPage": "Importa una pagina…",
2995
+ "connectSource": "Collega una fonte",
2996
+ "connectSourceNamed": "Collega {source}",
2996
2997
  "empty": "Allega un requisito, un RFC o un PRD così gli agenti lo vedono durante l'implementazione di questa attività.",
2997
- "attached": "Documento allegato",
2998
- "attachFailed": "Impossibile allegare"
2998
+ "attached": "Documento allegato"
2999
2999
  },
3000
3000
  "templates": {
3001
3001
  "title": "Modelli ed esempi di documenti",
@@ -3033,9 +3033,9 @@
3033
3033
  "title": "Issue di contesto",
3034
3034
  "hint": "Issue del tracker allegate a questa attività come contesto. Il loro contenuto viene fornito agli agenti che lavorano sull'attività.",
3035
3035
  "attach": "Allega",
3036
+ "connectSource": "Collega una fonte",
3037
+ "connectSourceNamed": "Collega {source}",
3036
3038
  "attached": "Issue allegata",
3037
- "attachFailed": "Impossibile allegare",
3038
- "importIssue": "Importa una issue…",
3039
3039
  "emptyHint": "Allega una issue Jira così gli agenti vedono la sua descrizione e i commenti durante l'implementazione di questa attività."
3040
3040
  },
3041
3041
  "import": {
@@ -3142,6 +3142,15 @@
3142
3142
  "impactThreshold": "impatto ≥",
3143
3143
  "strategy": "Strategia",
3144
3144
  "rounds": "Giri",
3145
+ "purposeLabel": "Scopo",
3146
+ "purposePlaceholder": "Seleziona uno scopo",
3147
+ "purposeOption": {
3148
+ "build": "Sviluppo",
3149
+ "document": "Documentazione",
3150
+ "review": "Revisione",
3151
+ "research": "Ricerca",
3152
+ "planning": "Pianificazione"
3153
+ },
3145
3154
  "strategyOption": {
3146
3155
  "specialist-panel": "Panel di specialisti",
3147
3156
  "debate": "Dibattito",
@@ -3195,7 +3204,8 @@
3195
3204
  "skillPlaceholder": "Seleziona una competenza",
3196
3205
  "skillNoneAvailable": "Nessuna competenza disponibile. Collega una fonte di competenze nelle impostazioni dell'account.",
3197
3206
  "skillMissing": "Questa competenza non è più nel catalogo; scegline un'altra.",
3198
- "skillNeedsPick": "Un passo Skill richiede una competenza selezionata prima di poter salvare."
3207
+ "skillNeedsPick": "Un passo Skill richiede una competenza selezionata prima di poter salvare.",
3208
+ "purposeStepsConflict": "Questo scopo non scrive codice né esegue test, ma la pipeline contiene ancora passaggi di implementazione o di test. Rimuovili o imposta lo scopo su Sviluppo."
3199
3209
  },
3200
3210
  "progress": {
3201
3211
  "status": {
@@ -3271,10 +3271,10 @@
3271
3271
  "heading": "コンテキストドキュメント",
3272
3272
  "hint": "このタスクにコンテキストとして添付されたドキュメント。その内容はタスクに取り組むエージェントに渡されます。",
3273
3273
  "attach": "添付",
3274
- "importPage": "ページをインポート…",
3274
+ "connectSource": "ソースを接続",
3275
+ "connectSourceNamed": "{source} を接続",
3275
3276
  "empty": "要件、RFC、PRD を添付すると、このタスクの実装中にエージェントが参照できます。",
3276
- "attached": "ドキュメントを添付しました",
3277
- "attachFailed": "添付できませんでした"
3277
+ "attached": "ドキュメントを添付しました"
3278
3278
  },
3279
3279
  "templates": {
3280
3280
  "title": "ドキュメントのテンプレートと例",
@@ -3312,9 +3312,9 @@
3312
3312
  "title": "コンテキスト課題",
3313
3313
  "hint": "このタスクにコンテキストとして添付されたトラッカーの課題。その内容はタスクに取り組むエージェントに渡されます。",
3314
3314
  "attach": "添付",
3315
+ "connectSource": "ソースを接続",
3316
+ "connectSourceNamed": "{source} を接続",
3315
3317
  "attached": "課題を添付しました",
3316
- "attachFailed": "添付できませんでした",
3317
- "importIssue": "課題をインポート…",
3318
3318
  "emptyHint": "Jira 課題を添付すると、このタスクの実装中にエージェントがその説明とコメントを参照できます。"
3319
3319
  },
3320
3320
  "import": {
@@ -3421,6 +3421,15 @@
3421
3421
  "impactThreshold": "影響度 ≥",
3422
3422
  "strategy": "戦略",
3423
3423
  "rounds": "ラウンド",
3424
+ "purposeLabel": "目的",
3425
+ "purposePlaceholder": "目的を選択",
3426
+ "purposeOption": {
3427
+ "build": "開発",
3428
+ "document": "ドキュメント",
3429
+ "review": "レビュー",
3430
+ "research": "調査",
3431
+ "planning": "計画"
3432
+ },
3424
3433
  "strategyOption": {
3425
3434
  "specialist-panel": "専門家パネル",
3426
3435
  "debate": "ディベート",
@@ -3474,7 +3483,8 @@
3474
3483
  "skillPlaceholder": "スキルを選択",
3475
3484
  "skillNoneAvailable": "利用できるスキルがありません。アカウント設定でスキルソースをリンクしてください。",
3476
3485
  "skillMissing": "このスキルはカタログに存在しません。別のスキルを選んでください。",
3477
- "skillNeedsPick": "Skill ステップを保存するにはスキルの選択が必要です。"
3486
+ "skillNeedsPick": "Skill ステップを保存するにはスキルの選択が必要です。",
3487
+ "purposeStepsConflict": "この目的はコードを書かず、テストも実行しませんが、パイプラインには実装またはテストのステップが残っています。それらを削除するか、目的を「開発」に切り替えてください。"
3478
3488
  },
3479
3489
  "progress": {
3480
3490
  "status": {
@@ -3259,10 +3259,10 @@
3259
3259
  "heading": "Dokumenty kontekstowe",
3260
3260
  "hint": "Dokumenty dołączone do tego zadania jako kontekst. Ich treść trafia do agentów pracujących nad zadaniem.",
3261
3261
  "attach": "Dołącz",
3262
- "importPage": "Importuj stronę…",
3262
+ "connectSource": "Połącz źródło",
3263
+ "connectSourceNamed": "Połącz {source}",
3263
3264
  "empty": "Dołącz wymaganie, dokument RFC lub PRD, aby agenci widzieli je podczas realizacji tego zadania.",
3264
- "attached": "Dokument dołączony",
3265
- "attachFailed": "Nie udało się dołączyć"
3265
+ "attached": "Dokument dołączony"
3266
3266
  },
3267
3267
  "templates": {
3268
3268
  "title": "Szablony i przykłady dokumentów",
@@ -3300,9 +3300,9 @@
3300
3300
  "title": "Zgłoszenia kontekstowe",
3301
3301
  "hint": "Zgłoszenia z trackera dołączone do tego zadania jako kontekst. Ich treść trafia do agentów pracujących nad zadaniem.",
3302
3302
  "attach": "Dołącz",
3303
+ "connectSource": "Połącz źródło",
3304
+ "connectSourceNamed": "Połącz {source}",
3303
3305
  "attached": "Dołączono zgłoszenie",
3304
- "attachFailed": "Nie można dołączyć",
3305
- "importIssue": "Importuj zgłoszenie…",
3306
3306
  "emptyHint": "Dołącz zgłoszenie Jira, aby agenci widzieli jego opis i komentarze podczas realizacji tego zadania."
3307
3307
  },
3308
3308
  "import": {
@@ -3409,6 +3409,15 @@
3409
3409
  "impactThreshold": "wpływ ≥",
3410
3410
  "strategy": "Strategia",
3411
3411
  "rounds": "Rundy",
3412
+ "purposeLabel": "Cel",
3413
+ "purposePlaceholder": "Wybierz cel",
3414
+ "purposeOption": {
3415
+ "build": "Programowanie",
3416
+ "document": "Dokumentacja",
3417
+ "review": "Przegląd",
3418
+ "research": "Badania",
3419
+ "planning": "Planowanie"
3420
+ },
3412
3421
  "strategyOption": {
3413
3422
  "specialist-panel": "Panel specjalistów",
3414
3423
  "debate": "Debata",
@@ -3462,7 +3471,8 @@
3462
3471
  "skillPlaceholder": "Wybierz umiejętność",
3463
3472
  "skillNoneAvailable": "Brak dostępnych umiejętności. Połącz źródło umiejętności w ustawieniach konta.",
3464
3473
  "skillMissing": "Tej umiejętności nie ma już w katalogu; wybierz inną.",
3465
- "skillNeedsPick": "Krok Skill wymaga wybranej umiejętności, zanim będzie można zapisać."
3474
+ "skillNeedsPick": "Krok Skill wymaga wybranej umiejętności, zanim będzie można zapisać.",
3475
+ "purposeStepsConflict": "To przeznaczenie nie tworzy kodu ani nie uruchamia testów, ale potok nadal zawiera kroki programowania lub testowania. Usuń je lub zmień przeznaczenie na Programowanie."
3466
3476
  },
3467
3477
  "progress": {
3468
3478
  "status": {
@@ -3271,10 +3271,10 @@
3271
3271
  "heading": "Bağlam belgeleri",
3272
3272
  "hint": "Bu göreve bağlam olarak eklenen belgeler. İçerikleri görev üzerinde çalışan ajanlara iletilir.",
3273
3273
  "attach": "Ekle",
3274
- "importPage": "Bir sayfa içe aktar…",
3274
+ "connectSource": "Bir kaynak bağla",
3275
+ "connectSourceNamed": "{source} bağla",
3275
3276
  "empty": "Agentların bu görevi uygularken görebilmesi için bir gereksinim, RFC veya PRD ekle.",
3276
- "attached": "Belge eklendi",
3277
- "attachFailed": "Eklenemedi"
3277
+ "attached": "Belge eklendi"
3278
3278
  },
3279
3279
  "templates": {
3280
3280
  "title": "Belge şablonları ve örnekleri",
@@ -3312,9 +3312,9 @@
3312
3312
  "title": "Bağlam sorunları",
3313
3313
  "hint": "Bu göreve bağlam olarak eklenen tracker sorunları. İçerikleri görev üzerinde çalışan ajanlara iletilir.",
3314
3314
  "attach": "Ekle",
3315
+ "connectSource": "Bir kaynak bağla",
3316
+ "connectSourceNamed": "{source} bağla",
3315
3317
  "attached": "Sorun eklendi",
3316
- "attachFailed": "Eklenemedi",
3317
- "importIssue": "Bir sorun içe aktar…",
3318
3318
  "emptyHint": "Agentların bu görevi uygularken açıklamasını ve yorumlarını görebilmesi için bir Jira sorunu ekle."
3319
3319
  },
3320
3320
  "import": {
@@ -3421,6 +3421,15 @@
3421
3421
  "impactThreshold": "etki ≥",
3422
3422
  "strategy": "Strateji",
3423
3423
  "rounds": "Tur",
3424
+ "purposeLabel": "Amaç",
3425
+ "purposePlaceholder": "Bir amaç seçin",
3426
+ "purposeOption": {
3427
+ "build": "Geliştirme",
3428
+ "document": "Dokümantasyon",
3429
+ "review": "İnceleme",
3430
+ "research": "Araştırma",
3431
+ "planning": "Planlama"
3432
+ },
3424
3433
  "strategyOption": {
3425
3434
  "specialist-panel": "Uzman paneli",
3426
3435
  "debate": "Tartışma",
@@ -3474,7 +3483,8 @@
3474
3483
  "skillPlaceholder": "Bir beceri seçin",
3475
3484
  "skillNoneAvailable": "Kullanılabilir beceri yok. Hesap ayarlarında bir beceri kaynağı bağlayın.",
3476
3485
  "skillMissing": "Bu beceri artık katalogda yok; başka birini seçin.",
3477
- "skillNeedsPick": "Bir Skill adımı, kaydedebilmeniz için seçilmiş bir beceri gerektirir."
3486
+ "skillNeedsPick": "Bir Skill adımı, kaydedebilmeniz için seçilmiş bir beceri gerektirir.",
3487
+ "purposeStepsConflict": "Bu amaç kod yazmaz ve test çalıştırmaz, ancak işlem hattında hâlâ uygulama veya test adımları var. Bunları kaldırın veya amacı Geliştirme olarak değiştirin."
3478
3488
  },
3479
3489
  "progress": {
3480
3490
  "status": {
@@ -3259,10 +3259,10 @@
3259
3259
  "heading": "Контекстні документи",
3260
3260
  "hint": "Документи, долучені до цього завдання як контекст. Їхній вміст передається агентам, що працюють над завданням.",
3261
3261
  "attach": "Долучити",
3262
- "importPage": "Імпортувати сторінку…",
3262
+ "connectSource": "Підключити джерело",
3263
+ "connectSourceNamed": "Підключити {source}",
3263
3264
  "empty": "Долучіть вимогу, RFC або PRD, щоб агенти бачили їх під час реалізації цього завдання.",
3264
- "attached": "Документ долучено",
3265
- "attachFailed": "Не вдалося долучити"
3265
+ "attached": "Документ долучено"
3266
3266
  },
3267
3267
  "templates": {
3268
3268
  "title": "Шаблони та приклади документів",
@@ -3300,9 +3300,9 @@
3300
3300
  "title": "Контекстні завдання",
3301
3301
  "hint": "Завдання з трекера, долучені до цього завдання як контекст. Їхній вміст передається агентам, що працюють над завданням.",
3302
3302
  "attach": "Прикріпити",
3303
+ "connectSource": "Підключити джерело",
3304
+ "connectSourceNamed": "Підключити {source}",
3303
3305
  "attached": "Завдання прикріплено",
3304
- "attachFailed": "Не вдалося прикріпити",
3305
- "importIssue": "Імпортувати завдання…",
3306
3306
  "emptyHint": "Прикріпіть завдання Jira, щоб агенти бачили його опис і коментарі під час реалізації цього завдання."
3307
3307
  },
3308
3308
  "import": {
@@ -3409,6 +3409,15 @@
3409
3409
  "impactThreshold": "вплив ≥",
3410
3410
  "strategy": "Стратегія",
3411
3411
  "rounds": "Раунди",
3412
+ "purposeLabel": "Призначення",
3413
+ "purposePlaceholder": "Виберіть призначення",
3414
+ "purposeOption": {
3415
+ "build": "Розробка",
3416
+ "document": "Документація",
3417
+ "review": "Рецензування",
3418
+ "research": "Дослідження",
3419
+ "planning": "Планування"
3420
+ },
3412
3421
  "strategyOption": {
3413
3422
  "specialist-panel": "Панель фахівців",
3414
3423
  "debate": "Дебати",
@@ -3462,7 +3471,8 @@
3462
3471
  "skillPlaceholder": "Виберіть навичку",
3463
3472
  "skillNoneAvailable": "Немає доступних навичок. Пов'яжіть джерело навичок у налаштуваннях облікового запису.",
3464
3473
  "skillMissing": "Цієї навички більше немає в каталозі; виберіть іншу.",
3465
- "skillNeedsPick": "Крок Skill потребує вибраної навички, перш ніж ви зможете зберегти."
3474
+ "skillNeedsPick": "Крок Skill потребує вибраної навички, перш ніж ви зможете зберегти.",
3475
+ "purposeStepsConflict": "Це призначення не пише код і не запускає тести, але конвеєр досі містить кроки програмування або тестування. Видаліть їх або змініть призначення на Розробку."
3466
3476
  },
3467
3477
  "progress": {
3468
3478
  "status": {