@cat-factory/app 0.174.0 → 0.178.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.
Files changed (34) hide show
  1. package/README.md +52 -13
  2. package/app/components/board/nodes/BlockNode.vue +30 -0
  3. package/app/components/environments/steps/EnvPickStep.vue +3 -0
  4. package/app/components/layout/IntegrationBackTitle.vue +11 -8
  5. package/app/components/layout/IntegrationsHub.vue +35 -56
  6. package/app/components/layout/ModelProvidersHub.vue +250 -0
  7. package/app/components/panels/InspectorPanel.vue +3 -28
  8. package/app/components/panels/inspector/ContainerSummary.vue +54 -62
  9. package/app/components/panels/inspector/ServiceReleaseHealthConfig.vue +11 -0
  10. package/app/components/panels/inspector/ServiceValidationConfig.vue +99 -1
  11. package/app/components/settings/ComposeEnvironmentSetupSection.vue +102 -0
  12. package/app/components/settings/InfrastructureWindow.vue +11 -1
  13. package/app/composables/api/validationChecks.ts +8 -0
  14. package/app/composables/useIntegrationBack.ts +5 -2
  15. package/app/composables/useNavContributions.ts +1 -1
  16. package/app/modular/nav-contributions.spec.ts +64 -21
  17. package/app/modular/nav-contributions.ts +59 -26
  18. package/app/pages/index.vue +4 -0
  19. package/app/stores/ui/modals.ts +32 -6
  20. package/app/stores/validationChecks.ts +17 -2
  21. package/app/types/validationChecks.ts +3 -0
  22. package/app/utils/validationDetection.spec.ts +51 -0
  23. package/app/utils/validationDetection.ts +67 -0
  24. package/i18n/locales/de.json +110 -33
  25. package/i18n/locales/en.json +110 -33
  26. package/i18n/locales/es.json +110 -33
  27. package/i18n/locales/fr.json +110 -33
  28. package/i18n/locales/he.json +110 -33
  29. package/i18n/locales/it.json +110 -33
  30. package/i18n/locales/ja.json +110 -33
  31. package/i18n/locales/pl.json +110 -33
  32. package/i18n/locales/tr.json +110 -33
  33. package/i18n/locales/uk.json +110 -33
  34. package/package.json +2 -2
@@ -658,6 +658,32 @@
658
658
  "removeFailed": "Der gemeinsame Stack konnte nicht gelöscht werden"
659
659
  }
660
660
  },
661
+ "composeEnvSetup": {
662
+ "title": "Geführte Docker-Compose-Einrichtung für einen Service",
663
+ "lead": "Führt einen Service Schritt für Schritt durch das Erstellen des Docker-Compose-Rezepts, aus dem seine Testumgebungen aufgebaut werden, statt Compose-Pfad und Setup-Schritte von Hand zu schreiben.",
664
+ "how": {
665
+ "title": "So funktioniert es",
666
+ "scan": "Durchsucht das verknüpfte Repository des Service nach Compose-Dateien, Profilen, Env-Dateien und Seed-Dumps.",
667
+ "analyse": "Führt optional den Umgebungsanalysten aus, der Setup-Schritte und ein Health-Gate aus den Skripten des Repositorys entwirft.",
668
+ "preflight": "Führt die Preflight-Prüfungen des Rezepts auf der Maschine aus, die es bereitstellen wird.",
669
+ "save": "Speichert das Rezept am Service und registriert den Docker-Compose-Handler des Workspace.",
670
+ "outcome": "Danach stellt der Deployer genau diesen Stack bereit, sobald eine Pipeline eine laufende Umgebung braucht, und der Tester testet dagegen. Bis zum Speichern wird nichts übernommen."
671
+ },
672
+ "needed": {
673
+ "title": "Sie brauchen das, wenn",
674
+ "running": "Die Tests des Service die laufende Anwendung benötigen: API- oder UI-Tests, Migrationen, Seed-Daten.",
675
+ "compose": "Der Service über Docker Compose bereitgestellt wird und noch kein Rezept gespeichert hat.",
676
+ "setup": "Das Hochfahren des Stacks mehr als einen Befehl erfordert: Profile, Env-Dateien, Seed-Daten oder eine Bereitschaftsprüfung."
677
+ },
678
+ "notNeeded": {
679
+ "title": "Sie können es überspringen, wenn",
680
+ "inContainer": "Die Pipeline nur lintet, baut oder Unit-Tests ausführt. Das läuft als Pre-PR-Validierung im Agenten-Container, ohne dass eine Umgebung bereitgestellt wird.",
681
+ "otherBackend": "Der Service anders bereitgestellt wird (Kubernetes, eine Cloud-Vorschau oder gar keine Infrastruktur). Konfigurieren Sie das stattdessen oben.",
682
+ "noRepo": "Der Service kein verknüpftes Repository hat, es also nichts zu durchsuchen gibt."
683
+ },
684
+ "start": "Geführte Einrichtung starten",
685
+ "rerunHint": "Jederzeit erneut ausführbar, um ein gespeichertes Rezept zu ändern."
686
+ },
661
687
  "localMode": {
662
688
  "title": "Lokaler Modus",
663
689
  "intro": "Feinabstimmung für den lokalen Container-Runner, gespeichert im Deployment dieser Maschine (er hat die Umgebungsvariablen {poolVars} / {harnessVars} ersetzt). Das Speichern passt den Warm-Pool live an, kein Neustart nötig; laufende Ausführungen behalten den Container, den sie bereits halten.",
@@ -948,12 +974,12 @@
948
974
  "inspector": {
949
975
  "detectRepoUnresolved": "Das Repository dieses Blocks gehört nicht zu den verbundenen GitHub-Repos und kann daher nicht gelesen werden. Verbinde oder synchronisiere GitHub dafür und versuche es erneut.",
950
976
  "container": {
951
- "title": "Inhalte",
952
- "hint": "Die Module und Aufgaben innerhalb dieses Blocks. Klicke auf einen Eintrag, um ihn auf dem Board auszuwählen.",
953
- "modules": "Module ({count})",
977
+ "modulesTitle": "Module",
978
+ "modulesHint": "Die Module innerhalb dieses Service. Klicke auf ein Modul, um es auf dem Board auszuwählen.",
954
979
  "taskCount": "{count} Aufgabe | {count} Aufgaben",
955
- "allTasks": "Alle Aufgaben ({count})",
956
- "tasks": "Aufgaben ({count})",
980
+ "tasksTitle": "Aufgaben",
981
+ "allTasksTitle": "Alle Aufgaben",
982
+ "tasksHint": "Die Aufgaben innerhalb dieses Blocks. Klicke auf eine Aufgabe, um sie auf dem Board auszuwählen.",
957
983
  "addTask": "Aufgabe hinzufügen",
958
984
  "noTasks": "Noch keine Aufgaben. Füge eine hinzu, um mit der Arbeit zu beginnen.",
959
985
  "servicesHint": "Services sind langlebig und werden nicht abgeschlossen. Die Arbeit findet in ihren Aufgaben und Modulen statt."
@@ -1419,7 +1445,34 @@
1419
1445
  "save": "Prüfungen speichern",
1420
1446
  "savedToast": "Prüfungen gespeichert",
1421
1447
  "saveFailed": "Prüfungen konnten nicht gespeichert werden",
1422
- "clearFailed": "Prüfungen konnten nicht geleert werden"
1448
+ "clearFailed": "Prüfungen konnten nicht geleert werden",
1449
+ "detect": {
1450
+ "action": "Erkennen",
1451
+ "hint": "Prüfungen aus dem Repository dieses Dienstes vorschlagen",
1452
+ "added": "{count} Prüfung hinzugefügt | {count} Prüfungen hinzugefügt",
1453
+ "found": "Erkannt: {ecosystems}.",
1454
+ "capped": "Einige Vorschläge wurden ausgelassen — ein Dienst nimmt höchstens {max} Prüfungen auf.",
1455
+ "nothingNew": "Nichts hinzuzufügen",
1456
+ "alreadyPresent": "Alle erkannten Befehle stehen bereits in der Liste.",
1457
+ "unrecognised": "Im Wurzelverzeichnis des Repositorys wurde kein bekanntes Ökosystem erkannt. Bitte die Befehle von Hand eintragen.",
1458
+ "repo_unavailable": "Diesem Dienst ist kein Repository zugeordnet, es gibt also nichts zu untersuchen.",
1459
+ "failed": "Das Repository konnte nicht gelesen werden"
1460
+ },
1461
+ "ecosystem": {
1462
+ "node": "Node.js",
1463
+ "python": "Python",
1464
+ "go": "Go",
1465
+ "rust": "Rust",
1466
+ "maven": "Maven",
1467
+ "gradle": "Gradle",
1468
+ "dotnet": ".NET",
1469
+ "ruby": "Ruby",
1470
+ "php": "PHP",
1471
+ "elixir": "Elixir",
1472
+ "make": "Make",
1473
+ "just": "just",
1474
+ "task": "Task"
1475
+ }
1423
1476
  }
1424
1477
  },
1425
1478
  "panels": {
@@ -1658,8 +1711,6 @@
1658
1711
  "lastIncorporatedRequirements": "Zuletzt eingearbeitete Anforderungen",
1659
1712
  "priorDocHint": "Aus der vorherigen Prüfung. Verwende es als Basis: bearbeite die Beschreibung oben und reiche erneut ein.",
1660
1713
  "bootstrapping": "Wird initialisiert…",
1661
- "importIssue": "Issue importieren",
1662
- "connectTracker": "Einen Tracker verbinden",
1663
1714
  "spawnFromDocument": "Aus Dokument erzeugen",
1664
1715
  "viewRequirements": "Anforderungen anzeigen",
1665
1716
  "reRun": "Erneut ausführen",
@@ -1670,8 +1721,7 @@
1670
1721
  "title": "Diesen Dienst archivieren?",
1671
1722
  "body": "„{name}“ und seine Aufgaben werden vom Board ausgeblendet. Du kannst den Dienst jederzeit wiederherstellen."
1672
1723
  },
1673
- "runBlocked": "Blockiert durch eine unerledigte Abhängigkeit: {names} | Blockiert durch {count} unerledigte Abhängigkeiten: {names}",
1674
- "huntBugs": "Fehler jagen"
1724
+ "runBlocked": "Blockiert durch eine unerledigte Abhängigkeit: {names} | Blockiert durch {count} unerledigte Abhängigkeiten: {names}"
1675
1725
  }
1676
1726
  },
1677
1727
  "layout": {
@@ -1978,7 +2028,8 @@
1978
2028
  },
1979
2029
  "integrationBack": {
1980
2030
  "backToMySetup": "Zurück zu Meine Einrichtung",
1981
- "backToIntegrations": "Zurück zu Integrationen"
2031
+ "backToIntegrations": "Zurück zu Integrationen",
2032
+ "backToModelProviders": "Zurück zu Modellanbieter"
1982
2033
  },
1983
2034
  "commandBar": {
1984
2035
  "searchPlaceholder": "Suchen oder einen Befehl ausführen…",
@@ -2046,23 +2097,21 @@
2046
2097
  },
2047
2098
  "integrationsHub": {
2048
2099
  "title": "Integrationen",
2049
- "intro": "Verbinden und verwalten Sie die externen Systeme, die dieser Workspace einbinden kann.",
2100
+ "intro": "Verbinden und verwalten Sie die optionalen externen Systeme, die dieser Workspace einbinden kann. Die Modelle, auf denen Ihre Agenten laufen, finden Sie unter Modellanbieter.",
2050
2101
  "searchPlaceholder": "Integrationen durchsuchen…",
2051
2102
  "noMatches": "Keine Integrationen passen zu \"{query}\".",
2052
2103
  "getStarted": {
2053
2104
  "title": "Erste Schritte",
2054
- "body": "Verbinden Sie eine Code-Quelle und einen Modellanbieter, um Ihre erste Pipeline auszuführen."
2105
+ "body": "Verbinden Sie eine Code-Quelle, damit Ihre Pipelines etwas zu bearbeiten haben."
2055
2106
  },
2056
2107
  "status": {
2057
2108
  "connected": "Verbunden",
2058
- "keyConnected": "Schlüssel verbunden",
2059
2109
  "notConnected": "Nicht verbunden",
2060
2110
  "needsAttention": "Benötigt Aufmerksamkeit",
2061
2111
  "disabled": "Deaktiviert",
2062
2112
  "recommended": "Empfohlen"
2063
2113
  },
2064
2114
  "groups": {
2065
- "models": "Modelle und Anbieter",
2066
2115
  "sourceControl": "Versionsverwaltung",
2067
2116
  "communication": "Kommunikation",
2068
2117
  "documents": "Dokumente",
@@ -2072,16 +2121,6 @@
2072
2121
  "personal": "Persönlich (nur Sie)"
2073
2122
  },
2074
2123
  "items": {
2075
- "openrouter": {
2076
- "description": "Ein Gateway zu über 300 Modellen. Fügen Sie Ihren Schlüssel hinzu und aktivieren Sie Modelle an einem Ort."
2077
- },
2078
- "vendors": {
2079
- "label": "Anbieter und Schlüssel",
2080
- "description": "Workspace-LLM-Abonnements und Anbieter-API-Schlüssel."
2081
- },
2082
- "personalSubs": {
2083
- "label": "Persönliche Abonnements (Claude, ChatGPT/Codex, GLM)"
2084
- },
2085
2124
  "github": {
2086
2125
  "description": "Verbinden Sie die GitHub-App des Workspace, durchsuchen Sie Repos, PRs und Issues."
2087
2126
  },
@@ -2121,10 +2160,6 @@
2121
2160
  "label": "Mein GitHub-Token",
2122
2161
  "description": "Ein Personal Access Token, der für von Ihnen gestartete Läufe verwendet wird (Pushes, PRs, CI, Merge)."
2123
2162
  },
2124
- "localRunners": {
2125
- "label": "Meine lokalen Runner",
2126
- "description": "Modell-Runner auf Ihrer eigenen Maschine (Ollama, LM Studio, vLLM…)."
2127
- },
2128
2163
  "documentTemplates": {
2129
2164
  "label": "Vorlagen & Beispiele"
2130
2165
  },
@@ -2134,6 +2169,45 @@
2134
2169
  }
2135
2170
  }
2136
2171
  },
2172
+ "modelProvidersHub": {
2173
+ "title": "Modellanbieter",
2174
+ "intro": "Die Engines, auf denen Ihre Agenten laufen. Mindestens ein Anbieter muss verbunden sein, bevor ein Pipeline-Schritt ausgeführt werden kann.",
2175
+ "searchPlaceholder": "Anbieter suchen…",
2176
+ "noMatches": "Keine Anbieter entsprechen \"{query}\".",
2177
+ "getStarted": {
2178
+ "title": "Noch kein Anbieter verbunden",
2179
+ "body": "Agentenschritte können erst laufen, wenn ein Modell erreichbar ist. Ein OpenRouter-Schlüssel ist der schnellste Weg zu einem großen Katalog, aber Anbieterschlüssel, ein persönliches Abonnement oder Ihr eigener lokaler Runner funktionieren genauso gut."
2180
+ },
2181
+ "status": {
2182
+ "connected": "Verbunden",
2183
+ "keyConnected": "Schlüssel verbunden",
2184
+ "notConnected": "Nicht verbunden",
2185
+ "recommended": "Empfohlen",
2186
+ "connectedCount": "keine verbunden | {count} verbunden | {count} verbunden"
2187
+ },
2188
+ "groups": {
2189
+ "workspace": "Workspace-Anbieter",
2190
+ "personal": "Persönlich (nur Sie)",
2191
+ "personalNote": "Diese gehören zu Ihrem Konto und nicht zum Workspace und werden nur für Läufe verwendet, die Sie starten. Sie sind auch unter Meine Einrichtung aufgeführt."
2192
+ },
2193
+ "items": {
2194
+ "openrouter": {
2195
+ "description": "Ein Gateway zu über 300 Modellen. Fügen Sie Ihren Schlüssel hinzu und aktivieren Sie Modelle an einem Ort."
2196
+ },
2197
+ "vendors": {
2198
+ "label": "Anbieter und Schlüssel",
2199
+ "description": "Workspace-LLM-Abonnements und Anbieter-API-Schlüssel."
2200
+ },
2201
+ "personalSubs": {
2202
+ "label": "Meine Abonnements",
2203
+ "description": "Pläne zur individuellen Nutzung, die Sie mit einem persönlichen Passwort freischalten (Claude, GLM, Codex)."
2204
+ },
2205
+ "localRunners": {
2206
+ "label": "Meine lokalen Runner",
2207
+ "description": "Modell-Runner auf Ihrer eigenen Maschine (Ollama, LM Studio, vLLM)."
2208
+ }
2209
+ }
2210
+ },
2137
2211
  "accountSkills": {
2138
2212
  "intro": "Verknüpfe Repositorys, in denen dein Team Claude Skills erstellt (ein SKILL.md-Ordner plus Ressourcendateien). Synchronisierte Skills landen im Katalog dieses Kontos, der von allen Boards geteilt wird, und der Skill-Schritt einer Pipeline führt einen davon für eine Aufgabe aus."
2139
2213
  },
@@ -2446,6 +2520,7 @@
2446
2520
  "dragToResize": "Zum Ändern der Größe ziehen",
2447
2521
  "addFirstTask": "Die erste Aufgabe hinzufügen",
2448
2522
  "createInitiativeTitle": "Initiative erstellen",
2523
+ "huntBugsTitle": "Fehler jagen",
2449
2524
  "accessDenied": {
2450
2525
  "title": "Zugriff verweigert",
2451
2526
  "hint": "Sie haben keinen Zugriff auf das Repository, das diesem Service zugrunde liegt."
@@ -4358,6 +4433,8 @@
4358
4433
  "repositories": "Repositories",
4359
4434
  "addFromRepo": "Aus vorhandenem Repo hinzufügen",
4360
4435
  "bootstrapRepo": "Repo bootstrappen",
4436
+ "models": "Modelle",
4437
+ "modelProviders": "Modellanbieter",
4361
4438
  "integrations": "Integrationen",
4362
4439
  "infrastructure": "Infrastruktur",
4363
4440
  "sandbox": "Sandbox",
@@ -4369,8 +4446,7 @@
4369
4446
  "modelConfiguration": "Modellkonfiguration",
4370
4447
  "accountSettings": "Kontoeinstellungen",
4371
4448
  "operatorDashboard": "Plattform-Observability",
4372
- "reports": "Berichte",
4373
- "environmentSetup": "Umgebungseinrichtung"
4449
+ "reports": "Berichte"
4374
4450
  },
4375
4451
  "errors": {
4376
4452
  "action": {
@@ -5265,8 +5341,8 @@
5265
5341
  },
5266
5342
  "environmentWizard": {
5267
5343
  "progress": "Schritt {index} von {total}",
5268
- "title": "Eine Testumgebung einrichten",
5269
- "subtitle": "Erkenne, prüfe und speichere ein Docker-Compose-Rezept, damit der Deployer es bereitstellt.",
5344
+ "title": "Docker-Compose-Umgebungseinrichtung",
5345
+ "subtitle": "Erstellen Sie das Docker-Compose-Rezept, aus dem die Testumgebungen eines Service aufgebaut werden: Repository durchsuchen, prüfen, Preflight, speichern.",
5270
5346
  "recommended": "empfohlen",
5271
5347
  "steps": {
5272
5348
  "pick": "Service auswählen",
@@ -5276,6 +5352,7 @@
5276
5352
  },
5277
5353
  "pick": {
5278
5354
  "intro": "Wähle den Service, für den eine Docker-Compose-Umgebung eingerichtet werden soll.",
5355
+ "scope": "Nur der ausgewählte Service wird geändert. Führen Sie dies später erneut aus, um sein Rezept zu bearbeiten.",
5279
5356
  "empty": "Noch keine Services. Füge zuerst einen Service hinzu."
5280
5357
  },
5281
5358
  "review": {
@@ -126,6 +126,8 @@
126
126
  "repositories": "Repositories",
127
127
  "addFromRepo": "Add from existing repo",
128
128
  "bootstrapRepo": "Bootstrap repo",
129
+ "models": "Models",
130
+ "modelProviders": "Model providers",
129
131
  "integrations": "Integrations",
130
132
  "infrastructure": "Infrastructure",
131
133
  "sandbox": "Sandbox",
@@ -143,8 +145,7 @@
143
145
  "modelConfiguration": "Model configuration",
144
146
  "accountSettings": "Account settings",
145
147
  "operatorDashboard": "Platform observability",
146
- "reports": "Reports",
147
- "environmentSetup": "Environment setup"
148
+ "reports": "Reports"
148
149
  },
149
150
  "board": {
150
151
  "toast": {
@@ -433,6 +434,7 @@
433
434
  "dragToResize": "Drag to resize",
434
435
  "addFirstTask": "Add the first task",
435
436
  "createInitiativeTitle": "Create initiative",
437
+ "huntBugsTitle": "Hunt bugs",
436
438
  "accessDenied": {
437
439
  "title": "Permission denied",
438
440
  "hint": "You don't have access to the repository backing this service."
@@ -694,12 +696,12 @@
694
696
  "inspector": {
695
697
  "detectRepoUnresolved": "This block's repository isn't among the connected GitHub repos, so it can't be read. Connect or sync GitHub for it, then retry.",
696
698
  "container": {
697
- "title": "Contents",
698
- "hint": "The modules and tasks inside this block. Click an entry to select it on the board.",
699
- "modules": "Modules ({count})",
699
+ "modulesTitle": "Modules",
700
+ "modulesHint": "The modules inside this service. Click one to select it on the board.",
700
701
  "taskCount": "{count} task | {count} tasks",
701
- "allTasks": "All tasks ({count})",
702
- "tasks": "Tasks ({count})",
702
+ "tasksTitle": "Tasks",
703
+ "allTasksTitle": "All tasks",
704
+ "tasksHint": "The tasks inside this block. Click one to select it on the board.",
703
705
  "addTask": "Add task",
704
706
  "noTasks": "No tasks yet. Add one to start work.",
705
707
  "servicesHint": "Services are long-lived and don't complete. Work happens in their tasks and modules."
@@ -1165,7 +1167,34 @@
1165
1167
  "save": "Save checks",
1166
1168
  "savedToast": "Validation checks saved",
1167
1169
  "saveFailed": "Could not save the validation checks",
1168
- "clearFailed": "Could not clear the validation checks"
1170
+ "clearFailed": "Could not clear the validation checks",
1171
+ "detect": {
1172
+ "action": "Detect",
1173
+ "hint": "Suggest checks from this service's repository",
1174
+ "added": "Added {count} check | Added {count} checks",
1175
+ "found": "Recognised {ecosystems}.",
1176
+ "capped": "Some suggestions were left out — a service takes at most {max} checks.",
1177
+ "nothingNew": "Nothing to add",
1178
+ "alreadyPresent": "Every detected command is already listed.",
1179
+ "unrecognised": "No known ecosystem was recognised at the repository root. Add the commands by hand.",
1180
+ "repo_unavailable": "This service has no repository linked, so there is nothing to inspect.",
1181
+ "failed": "The repository could not be read"
1182
+ },
1183
+ "ecosystem": {
1184
+ "node": "Node.js",
1185
+ "python": "Python",
1186
+ "go": "Go",
1187
+ "rust": "Rust",
1188
+ "maven": "Maven",
1189
+ "gradle": "Gradle",
1190
+ "dotnet": ".NET",
1191
+ "ruby": "Ruby",
1192
+ "php": "PHP",
1193
+ "elixir": "Elixir",
1194
+ "make": "Make",
1195
+ "just": "just",
1196
+ "task": "Task"
1197
+ }
1169
1198
  }
1170
1199
  },
1171
1200
  "panels": {
@@ -1404,8 +1433,6 @@
1404
1433
  "lastIncorporatedRequirements": "Last incorporated requirements",
1405
1434
  "priorDocHint": "From the previous review. Use it as a base: edit the description above and resubmit.",
1406
1435
  "bootstrapping": "Bootstrapping…",
1407
- "importIssue": "Import issue",
1408
- "connectTracker": "Connect a tracker",
1409
1436
  "spawnFromDocument": "Spawn from document",
1410
1437
  "viewRequirements": "View Requirements",
1411
1438
  "reRun": "Re-run",
@@ -1419,8 +1446,7 @@
1419
1446
  "runBlocked": "Blocked by an unfinished dependency: {names} | Blocked by {count} unfinished dependencies: {names}",
1420
1447
  "@runBlocked": {
1421
1448
  "description": "Count-driven plural: {count} unfinished dependencies, {names} their comma-joined titles. Languages with more than two plural forms (e.g. Polish, Ukrainian: one/few/many) need the extra pipe-separated forms."
1422
- },
1423
- "huntBugs": "Hunt bugs"
1449
+ }
1424
1450
  }
1425
1451
  },
1426
1452
  "observability": {
@@ -2005,7 +2031,8 @@
2005
2031
  },
2006
2032
  "integrationBack": {
2007
2033
  "backToMySetup": "Back to My setup",
2008
- "backToIntegrations": "Back to Integrations"
2034
+ "backToIntegrations": "Back to Integrations",
2035
+ "backToModelProviders": "Back to Model providers"
2009
2036
  },
2010
2037
  "commandBar": {
2011
2038
  "searchPlaceholder": "Search or run a command…",
@@ -2073,23 +2100,21 @@
2073
2100
  },
2074
2101
  "integrationsHub": {
2075
2102
  "title": "Integrations",
2076
- "intro": "Connect and manage the external systems this workspace can link in.",
2103
+ "intro": "Connect and manage the optional external systems this workspace can link in. The models your agents run on live under Model providers.",
2077
2104
  "searchPlaceholder": "Search integrations…",
2078
2105
  "noMatches": "No integrations match \"{query}\".",
2079
2106
  "getStarted": {
2080
2107
  "title": "Get started",
2081
- "body": "Connect a code source and a model provider to run your first pipeline."
2108
+ "body": "Connect a code source so your pipelines have something to work on."
2082
2109
  },
2083
2110
  "status": {
2084
2111
  "connected": "Connected",
2085
- "keyConnected": "Key connected",
2086
2112
  "notConnected": "Not connected",
2087
2113
  "needsAttention": "Needs attention",
2088
2114
  "disabled": "Disabled",
2089
2115
  "recommended": "Recommended"
2090
2116
  },
2091
2117
  "groups": {
2092
- "models": "Models and providers",
2093
2118
  "sourceControl": "Source control",
2094
2119
  "communication": "Communication",
2095
2120
  "documents": "Documents",
@@ -2099,16 +2124,6 @@
2099
2124
  "personal": "Personal (only you)"
2100
2125
  },
2101
2126
  "items": {
2102
- "openrouter": {
2103
- "description": "One gateway to 300+ models. Add your key and enable models in one place."
2104
- },
2105
- "vendors": {
2106
- "label": "Vendors and keys",
2107
- "description": "Workspace LLM subscriptions and provider API keys."
2108
- },
2109
- "personalSubs": {
2110
- "label": "Personal subscriptions (Claude, ChatGPT/Codex, GLM)"
2111
- },
2112
2127
  "github": {
2113
2128
  "description": "Connect the workspace's GitHub App, browse repos, PRs and issues."
2114
2129
  },
@@ -2148,10 +2163,6 @@
2148
2163
  "label": "My GitHub token",
2149
2164
  "description": "A personal access token used for runs you start (pushes, PRs, CI, merge)."
2150
2165
  },
2151
- "localRunners": {
2152
- "label": "My local runners",
2153
- "description": "Your own-machine model runners (Ollama, LM Studio, vLLM…)."
2154
- },
2155
2166
  "documentTemplates": {
2156
2167
  "label": "Templates & examples"
2157
2168
  },
@@ -2161,6 +2172,45 @@
2161
2172
  }
2162
2173
  }
2163
2174
  },
2175
+ "modelProvidersHub": {
2176
+ "title": "Model providers",
2177
+ "intro": "The engines your agents run on. At least one provider has to be connected before any pipeline step can run.",
2178
+ "searchPlaceholder": "Search providers…",
2179
+ "noMatches": "No providers match \"{query}\".",
2180
+ "getStarted": {
2181
+ "title": "No provider connected yet",
2182
+ "body": "Agent steps cannot run until a model is reachable. An OpenRouter key is the quickest way to unlock a wide catalogue, but vendor keys, a personal plan or your own local runner work just as well."
2183
+ },
2184
+ "status": {
2185
+ "connected": "Connected",
2186
+ "keyConnected": "Key connected",
2187
+ "notConnected": "Not connected",
2188
+ "recommended": "Recommended",
2189
+ "connectedCount": "none connected | {count} connected | {count} connected"
2190
+ },
2191
+ "groups": {
2192
+ "workspace": "Workspace providers",
2193
+ "personal": "Personal (only you)",
2194
+ "personalNote": "These belong to your account rather than the workspace, and are used only for runs you start. They are also listed under My setup."
2195
+ },
2196
+ "items": {
2197
+ "openrouter": {
2198
+ "description": "One gateway to 300+ models. Add your key and enable models in one place."
2199
+ },
2200
+ "vendors": {
2201
+ "label": "Vendors and keys",
2202
+ "description": "Workspace LLM subscriptions and provider API keys."
2203
+ },
2204
+ "personalSubs": {
2205
+ "label": "My subscriptions",
2206
+ "description": "Individual-usage plans you unlock with a personal password (Claude, GLM, Codex)."
2207
+ },
2208
+ "localRunners": {
2209
+ "label": "My local runners",
2210
+ "description": "Your own-machine model runners (Ollama, LM Studio, vLLM)."
2211
+ }
2212
+ }
2213
+ },
2164
2214
  "accountSkills": {
2165
2215
  "intro": "Link repos where your team authors Claude Skills (a SKILL.md folder plus resource files). Synced skills join this account's catalog, shared by every board, and a pipeline's Skill step runs one against a task."
2166
2216
  },
@@ -2872,6 +2922,32 @@
2872
2922
  "removeFailed": "Could not delete the shared stack"
2873
2923
  }
2874
2924
  },
2925
+ "composeEnvSetup": {
2926
+ "title": "Guided Docker Compose setup for a service",
2927
+ "lead": "Walks one service through building the Docker Compose recipe its test environments are stood up from, instead of hand-writing the compose path and setup steps.",
2928
+ "how": {
2929
+ "title": "How it works",
2930
+ "scan": "Scans the service's linked repository for compose files, profiles, env files and seed dumps.",
2931
+ "analyse": "Optionally runs the environment analyst agent to draft setup steps and a health gate from the repository's own scripts.",
2932
+ "preflight": "Runs the recipe's preflight checks on the machine that will provision it.",
2933
+ "save": "Saves the recipe onto the service and registers the workspace's Docker Compose handler.",
2934
+ "outcome": "After that the Deployer stands up exactly that stack whenever a pipeline needs a live environment, and the Tester runs against it. Nothing is applied until you save."
2935
+ },
2936
+ "needed": {
2937
+ "title": "You need this when",
2938
+ "running": "The service's tests need the app actually running: API or UI tests, migrations, seeded data.",
2939
+ "compose": "The service is provisioned as Docker Compose and has no recipe saved yet.",
2940
+ "setup": "Standing the stack up takes more than one command: profiles, env files, seed data or a readiness check."
2941
+ },
2942
+ "notNeeded": {
2943
+ "title": "You can skip it when",
2944
+ "inContainer": "The pipeline only lints, builds or runs unit tests. Those run inside the agent container as pre-PR validation checks, with no environment provisioned.",
2945
+ "otherBackend": "The service is provisioned some other way (Kubernetes, a cloud preview, or no infrastructure at all). Configure that above instead.",
2946
+ "noRepo": "The service has no linked repository, so there is nothing to scan."
2947
+ },
2948
+ "start": "Start guided setup",
2949
+ "rerunHint": "Re-run it any time to change a saved recipe."
2950
+ },
2875
2951
  "localMode": {
2876
2952
  "title": "Local mode",
2877
2953
  "intro": "Tuning for the local container runner, stored on this machine's deployment (it replaced the {poolVars} / {harnessVars} env vars). Saving resizes the warm pool live, no restart needed; in-flight runs keep the container they already hold.",
@@ -5422,8 +5498,8 @@
5422
5498
  },
5423
5499
  "environmentWizard": {
5424
5500
  "progress": "Step {index} of {total}",
5425
- "title": "Set up a test environment",
5426
- "subtitle": "Detect, review, and save a Docker Compose recipe so the Deployer provisions it.",
5501
+ "title": "Docker Compose environment setup",
5502
+ "subtitle": "Build the Docker Compose recipe one service's test environments are stood up from: scan the repository, review, preflight, save.",
5427
5503
  "recommended": "recommended",
5428
5504
  "steps": {
5429
5505
  "pick": "Pick service",
@@ -5433,6 +5509,7 @@
5433
5509
  },
5434
5510
  "pick": {
5435
5511
  "intro": "Choose the service to set up a Docker Compose environment for.",
5512
+ "scope": "Only the service you pick is changed. Run this again later to edit its recipe.",
5436
5513
  "empty": "No services yet. Add a service first."
5437
5514
  },
5438
5515
  "review": {