@cat-factory/app 0.199.0 → 0.200.2

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 (39) hide show
  1. package/app/components/foundational/FoundationalContractSummary.vue +36 -0
  2. package/app/components/foundational/FoundationalServiceCatalogList.vue +170 -0
  3. package/app/components/foundational/FoundationalServiceManager.vue +111 -0
  4. package/app/components/foundational/FoundationalServicePanel.vue +37 -0
  5. package/app/components/foundational/FoundationalServiceRegistry.vue +339 -0
  6. package/app/components/foundational/FoundationalServiceSources.vue +398 -0
  7. package/app/components/foundational/FoundationalSuppressions.vue +75 -0
  8. package/app/components/layout/AccountFoundationalSettings.vue +25 -0
  9. package/app/components/layout/AccountSkillSettings.vue +1 -1
  10. package/app/components/settings/AccountSettingsPanel.vue +17 -1
  11. package/app/components/skills/SkillLibraryManager.vue +1 -1
  12. package/app/composables/api/foundationalServices.ts +131 -0
  13. package/app/composables/api/skills.ts +1 -1
  14. package/app/composables/useApi.ts +2 -0
  15. package/app/composables/useNavContributions.ts +1 -0
  16. package/app/composables/usePipelineErrorToast.ts +8 -0
  17. package/app/modular/nav-contributions.spec.ts +6 -0
  18. package/app/modular/nav-contributions.ts +26 -0
  19. package/app/pages/index.vue +4 -0
  20. package/app/stores/foundationalServices.spec.ts +121 -0
  21. package/app/stores/foundationalServices.ts +276 -0
  22. package/app/stores/skillLibrary.ts +1 -1
  23. package/app/stores/skills.spec.ts +1 -1
  24. package/app/stores/skills.ts +1 -1
  25. package/app/stores/ui/modals.ts +12 -0
  26. package/app/types/domain.ts +1 -0
  27. package/app/types/foundationalServices.ts +32 -0
  28. package/app/types/skills.ts +1 -1
  29. package/i18n/locales/de.json +146 -6
  30. package/i18n/locales/en.json +146 -6
  31. package/i18n/locales/es.json +146 -6
  32. package/i18n/locales/fr.json +146 -6
  33. package/i18n/locales/he.json +146 -6
  34. package/i18n/locales/it.json +146 -6
  35. package/i18n/locales/ja.json +146 -6
  36. package/i18n/locales/pl.json +146 -6
  37. package/i18n/locales/tr.json +146 -6
  38. package/i18n/locales/uk.json +146 -6
  39. package/package.json +2 -2
@@ -8,7 +8,7 @@ const summary = (id: string, name = id): SkillSummary => ({ id, name, descriptio
8
8
  /**
9
9
  * The skill picker spans two stores: the snapshot-hydrated `useSkillsStore` (the catalog the
10
10
  * builder's `USelect` binds against) and the per-step `skillId` helpers on `usePipelinesStore`.
11
- * These pin the behaviours the builder relies on (docs/initiatives/repo-skills.md slice 3).
11
+ * These pin the behaviours the builder relies on (ADR 0024 slice 3).
12
12
  */
13
13
  describe('skills picker store — snapshot-hydrated catalog', () => {
14
14
  it('hydrate is a straight replace (a later hydrate does not merge with the earlier one)', () => {
@@ -3,7 +3,7 @@ import { ref } from 'vue'
3
3
  import type { SkillSummary } from '~/types/domain'
4
4
 
5
5
  /**
6
- * The account's repo-sourced Claude Skills catalog (docs/initiatives/repo-skills.md slice 3),
6
+ * The account's repo-sourced Claude Skills catalog (ADR 0024 slice 3),
7
7
  * hydrated from the workspace snapshot as lightweight `{ id, name, description }` summaries.
8
8
  * Drives the pipeline builder's per-step skill picker: a `skill` step binds its
9
9
  * `stepOptions.skillId` to one of these. Skills live in ONE tier (the account, shared across its
@@ -344,6 +344,9 @@ function createOverlayModals() {
344
344
  // Prompt-fragment library panel (manage the board's best-practice catalog +
345
345
  // linked guideline repos; ADR 0006).
346
346
  const fragmentLibraryOpen = ref(false)
347
+ // Foundational-services panel (register the shared capabilities the org already runs, and see
348
+ // the merged catalog an Architect designs against; backend/docs/adr/0031-foundational-services.md).
349
+ const foundationalServicesOpen = ref(false)
347
350
  // Command bar (⌘K) — searchable launcher for every navbar action.
348
351
  const commandBarOpen = ref(false)
349
352
  // Keyboard-shortcuts cheatsheet (?) — a modal listing every global shortcut.
@@ -373,6 +376,12 @@ function createOverlayModals() {
373
376
  function closeFragmentLibrary() {
374
377
  fragmentLibraryOpen.value = false
375
378
  }
379
+ function openFoundationalServices() {
380
+ foundationalServicesOpen.value = true
381
+ }
382
+ function closeFoundationalServices() {
383
+ foundationalServicesOpen.value = false
384
+ }
376
385
  function openCommandBar() {
377
386
  commandBarOpen.value = true
378
387
  }
@@ -411,6 +420,7 @@ function createOverlayModals() {
411
420
  bootstrapOpen,
412
421
  addServiceOpen,
413
422
  fragmentLibraryOpen,
423
+ foundationalServicesOpen,
414
424
  commandBarOpen,
415
425
  shortcutsHelpOpen,
416
426
  mobileNavOpen,
@@ -421,6 +431,8 @@ function createOverlayModals() {
421
431
  closeAddService,
422
432
  openFragmentLibrary,
423
433
  closeFragmentLibrary,
434
+ openFoundationalServices,
435
+ closeFoundationalServices,
424
436
  openCommandBar,
425
437
  closeCommandBar,
426
438
  toggleCommandBar,
@@ -177,6 +177,7 @@ export type * from './execution'
177
177
  export type * from './models'
178
178
  export type * from './fragments'
179
179
  export type * from './skills'
180
+ export type * from './foundationalServices'
180
181
  export type * from './documents'
181
182
  export type * from './tasks'
182
183
  export type * from './bugHunt'
@@ -0,0 +1,32 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Foundational services (backend/docs/adr/0031-foundational-services.md). Mirrors the
3
+ // `@cat-factory/contracts` schemas: the tiered catalog of shared capabilities an
4
+ // organisation already runs (file storage, notifications, audit …), each with its
5
+ // API contracts, plus the repo sources that feed it.
6
+ //
7
+ // Note `ApiContractSummary` (no body) and `ApiContractDocument` (with body) are two
8
+ // separate types on purpose — the catalog read never carries a document, and the
9
+ // management surface reads one only when a human opens it.
10
+ // ---------------------------------------------------------------------------
11
+ //
12
+ // All wire shapes are sourced from @cat-factory/contracts (single source of truth).
13
+
14
+ export type {
15
+ ApiContractDocument,
16
+ ApiContractFormat,
17
+ ApiContractSummary,
18
+ CreateFoundationalServiceInput,
19
+ FoundationalService,
20
+ FoundationalServiceOwnerKind,
21
+ FoundationalServiceSelection,
22
+ FoundationalServiceSource,
23
+ FoundationalServiceSourceMode,
24
+ FoundationalServiceSourceStatus,
25
+ FoundationalServiceSuppression,
26
+ FoundationalServiceSyncResult,
27
+ FoundationalServiceTier,
28
+ LinkFoundationalServiceSourceInput,
29
+ ResolvedFoundationalService,
30
+ UpdateFoundationalServiceInput,
31
+ UploadApiContract,
32
+ } from '@cat-factory/contracts'
@@ -1,5 +1,5 @@
1
1
  // ---------------------------------------------------------------------------
2
- // Repo-sourced Claude Skills library (docs/initiatives/repo-skills.md). Mirrors
2
+ // Repo-sourced Claude Skills library (ADR 0024). Mirrors
3
3
  // the `@cat-factory/contracts` skill-library schemas: the account skill catalog
4
4
  // (shared across the account's workspaces), the repo sources that feed it, and the
5
5
  // lightweight per-skill summary carried in the workspace snapshot for the picker.
@@ -51,7 +51,8 @@
51
51
  "tabs": {
52
52
  "team": "Team & Zugriff",
53
53
  "fragments": "Kontextfragmente",
54
- "skills": "Skills"
54
+ "skills": "Skills",
55
+ "foundational": "Basisdienste"
55
56
  }
56
57
  },
57
58
  "infrastructure": {
@@ -2141,7 +2142,8 @@
2141
2142
  "shortcuts": "Tastenkürzel",
2142
2143
  "bugHunt": "Fehlerjagd",
2143
2144
  "toggleUiMode": "Oberflächenmodus wechseln",
2144
- "tutorial": "Tour starten"
2145
+ "tutorial": "Tour starten",
2146
+ "foundationalServices": "Basisdienste"
2145
2147
  },
2146
2148
  "keywords": {
2147
2149
  "newPipeline": "pipeline agents chain",
@@ -2164,7 +2166,8 @@
2164
2166
  "shortcuts": "keyboard shortcuts keys hotkeys cheatsheet help",
2165
2167
  "bugHunt": "fehler bug jagd triage backlog tracker nicht zugewiesen",
2166
2168
  "toggleUiMode": "oberfläche modus einfach erweitert anzeigen ausblenden",
2167
- "tutorial": "tutorial tour einführung hilfe onboarding lernen grundlagen"
2169
+ "tutorial": "tutorial tour einführung hilfe onboarding lernen grundlagen",
2170
+ "foundationalServices": "gemeinsame Fähigkeit Plattform Dienst API Vertrag OpenAPI Katalog"
2168
2171
  }
2169
2172
  },
2170
2173
  "shortcuts": {
@@ -2324,6 +2327,9 @@
2324
2327
  "title": "Standard-Testumgebung wählen",
2325
2328
  "body": "Für dieses Board ist noch nicht festgelegt, wie seine Services eine Testumgebung erhalten. Wählen Sie einen Standard, dann startet jeder künftig hinzugefügte Service damit, statt einzeln eingerichtet zu werden. Pro Service lässt sich das weiterhin ändern.",
2326
2329
  "action": "Standard wählen"
2330
+ },
2331
+ "accountFoundational": {
2332
+ "intro": "Die gemeinsamen Fähigkeiten, die diese Organisation bereits betreibt - Dateiablage, Benachrichtigungen, Audit - samt ihren API-Verträgen. Jedes Board erbt sie, und einem Architekten wird gesagt, sie zu nutzen statt einen Neubau vorzuschlagen."
2327
2333
  }
2328
2334
  },
2329
2335
  "board": {
@@ -4211,6 +4217,135 @@
4211
4217
  },
4212
4218
  "unavailable": "Die Prompt-Fragment-Bibliothek ist für dieses Deployment nicht aktiviert."
4213
4219
  },
4220
+ "foundational": {
4221
+ "unavailable": "Der Katalog der Basisdienste ist für diese Installation nicht aktiviert.",
4222
+ "owner": {
4223
+ "workspace": "Dieses Board",
4224
+ "account": "Dieses Konto"
4225
+ },
4226
+ "tab": {
4227
+ "catalog": "Katalog",
4228
+ "sources": "Repo-Quellen"
4229
+ },
4230
+ "panel": {
4231
+ "title": "Basisdienste",
4232
+ "subtitle": "Die gemeinsamen Fähigkeiten, die eure Organisation bereits betreibt, damit ein Entwurf sie nutzt statt sie neu zu bauen."
4233
+ },
4234
+ "tier": {
4235
+ "account": "Konto",
4236
+ "workspace": "Board"
4237
+ },
4238
+ "format": {
4239
+ "openapi": "OpenAPI",
4240
+ "toadContract": "toad-contracts",
4241
+ "lokaliseApiContract": "lokalise/api-contract"
4242
+ },
4243
+ "contracts": {
4244
+ "omitted": "+{count} weitere nicht aufgeführt",
4245
+ "none": "Kein API-Vertrag hinterlegt. Einem Agenten wird gesagt, dass die Schnittstelle unbekannt ist, statt dass er sie errät."
4246
+ },
4247
+ "catalog": {
4248
+ "intro": "Was ein Architekt auf diesem Board erhält: Identität, Fähigkeits-Tags und Operationsnamen. Vertragsdokumente werden erst gelesen, wenn ein Entwurf den Dienst benennt.",
4249
+ "empty": "Noch keine Basisdienste. Registriere unten einen oder verknüpfe ein Repo, das sie beschreibt.",
4250
+ "suppress": "Diesen Dienst auf diesem Board nicht anbieten",
4251
+ "showDocuments": "Vertragsdokumente anzeigen",
4252
+ "hideDocuments": "Vertragsdokumente ausblenden"
4253
+ },
4254
+ "suppressions": {
4255
+ "title": "Auf diesem Board abgewählt",
4256
+ "intro": "Diese Kontodienste sind für Entwürfe auf diesem Board ausgeblendet. Nichts wurde gelöscht, und das Konto behält sie für alle anderen Boards.",
4257
+ "restore": "Wieder anbieten",
4258
+ "shadowsNothing": "Unter dieser ID wird derzeit nichts geerbt, diese Abwahl blendet also aktuell nichts aus."
4259
+ },
4260
+ "registry": {
4261
+ "empty": "In diesem Bereich ist noch nichts registriert.",
4262
+ "add": "Dienst registrieren",
4263
+ "addTitle": "Basisdienst registrieren",
4264
+ "editTitle": "Basisdienst bearbeiten",
4265
+ "edit": "Bearbeiten",
4266
+ "delete": "Löschen",
4267
+ "save": "Speichern",
4268
+ "cancel": "Abbrechen",
4269
+ "fromSource": "Aus einem verknüpften Repo synchronisiert ({path}). Bearbeite ihn im Repo; die nächste Synchronisierung überschreibt Änderungen von hier.",
4270
+ "idFixed": "die ID, die ein Architekt in seinem Entwurf schreibt - nach der Registrierung unveränderlich",
4271
+ "idPlaceholder": "ID (Kleinbuchstaben mit Bindestrich, z. B. file-storage)",
4272
+ "namePlaceholder": "Name (z. B. File Storage)",
4273
+ "summaryPlaceholder": "einzeilige Zusammenfassung - wofür er da ist",
4274
+ "descriptionPlaceholder": "was er tut, wann er zu nutzen ist und was er NICHT abdeckt",
4275
+ "capabilitiesPlaceholder": "Fähigkeits-Tags, durch Komma getrennt (z. B. file-storage, cdn)",
4276
+ "contractsTitle": "API-Verträge",
4277
+ "contractsKeep": "Unverändert lassen, um die gespeicherten Dokumente zu behalten.",
4278
+ "contractsReplace": "Beim Speichern wird der gesamte gespeicherte Satz durch das Hier-Aufgeführte ERSETZT.",
4279
+ "addContract": "Vertrag hinzufügen",
4280
+ "removeContract": "Diesen Vertrag entfernen",
4281
+ "contractIdPlaceholder": "Vertrags-ID (Kleinbuchstaben mit Bindestrich, z. B. openapi)",
4282
+ "contractTitlePlaceholder": "Titel (z. B. HTTP API)",
4283
+ "contractBodyPlaceholder": "Dokument einfügen: eine OpenAPI-3.x-Datei oder der Quelltext eines Vertragsmoduls"
4284
+ },
4285
+ "sources": {
4286
+ "empty": "Keine verknüpften Repos. Verknüpfe unten eines, um Dienstdefinitionen und ihre Vertragsdateien zu synchronisieren.",
4287
+ "linkTitle": "Repo-Quelle verknüpfen",
4288
+ "link": "Verknüpfen & synchronisieren",
4289
+ "metaSynced": "synchronisiert {date} · Ref {ref}",
4290
+ "metaNever": "nie synchronisiert · Ref {ref}",
4291
+ "metaFiles": "{service} · {count} Vertragsdateien",
4292
+ "metaDirectory": "ein Dienst je Unterverzeichnis",
4293
+ "changes": "Änderungen",
4294
+ "check": "Auf Änderungen prüfen",
4295
+ "sync": "Erneut synchronisieren",
4296
+ "unlink": "Verknüpfung lösen",
4297
+ "selectedDir": "Verzeichnis:",
4298
+ "selectedFiles": "Ausgewählte Dateien: {count}",
4299
+ "wholeRepo": "Gesamtes Repository (Wurzel).",
4300
+ "ownerPlaceholder": "Owner",
4301
+ "repoPlaceholder": "Repo",
4302
+ "dirPlaceholder": "Verzeichnispfad (z. B. foundational)",
4303
+ "filePathsPlaceholder": "Pfade der Vertragsdateien, einer pro Zeile",
4304
+ "refPlaceholder": "Ref (Standard HEAD)",
4305
+ "githubRequired": "Zum Verknüpfen eines Repos wird die Versionsverwaltungs-Integration benötigt. Verbinde sie zuerst auf einem Board.",
4306
+ "serviceIdPlaceholder": "Dienst-ID (Kleinbuchstaben mit Bindestrich)",
4307
+ "serviceNamePlaceholder": "Dienstname",
4308
+ "serviceSummaryPlaceholder": "einzeilige Zusammenfassung (optional)",
4309
+ "mode": {
4310
+ "directory": "Ein Ordner mit Diensten",
4311
+ "files": "Bestimmte Dateien, ein Dienst",
4312
+ "directoryHint": "Jedes Unterverzeichnis des verknüpften Pfads ist ein Dienst, beschrieben durch eine service.md mit den Vertragsdateien daneben.",
4313
+ "filesHint": "Die aufgeführten Dateien beschreiben alle den einen Dienst, den du hier benennst. Nutze das, wenn es keine Ordnerkonvention gibt."
4314
+ }
4315
+ },
4316
+ "confirmUnlinkSource": {
4317
+ "title": "Verknüpfung zu diesem Repo lösen?",
4318
+ "body": "\"{repo}\" und die daraus synchronisierten Dienste werden aus dem Katalog entfernt. Du kannst es später erneut verknüpfen.",
4319
+ "confirm": "Verknüpfung lösen"
4320
+ },
4321
+ "confirmDelete": {
4322
+ "title": "Diesen Dienst löschen?",
4323
+ "body": "\"{name}\" und die hochgeladenen Vertragsdokumente werden aus diesem Bereich entfernt.",
4324
+ "bodyWorkspace": "\"{name}\" und die hochgeladenen Vertragsdokumente werden von diesem Board entfernt. Falls das Konto einen Dienst unter derselben ID führt, erbt dieses Board ihn ebenfalls nicht mehr; rückgängig machen kannst du das unter \"Auf diesem Board abgewählt\".",
4325
+ "confirm": "Löschen"
4326
+ },
4327
+ "toast": {
4328
+ "created": "Dienst registriert",
4329
+ "updated": "Dienst aktualisiert",
4330
+ "deleted": "Dienst gelöscht",
4331
+ "saveFailed": "Dienst konnte nicht gespeichert werden",
4332
+ "deleteFailed": "Dienst konnte nicht gelöscht werden",
4333
+ "suppressed": "Für Entwürfe auf diesem Board ausgeblendet",
4334
+ "suppressFailed": "Dienst konnte nicht ausgeblendet werden",
4335
+ "restored": "Auf diesem Board wieder angeboten",
4336
+ "restoreFailed": "Dienst konnte nicht wiederhergestellt werden",
4337
+ "contractsFailed": "Vertragsdokumente konnten nicht geladen werden",
4338
+ "sourceLinked": "Repo verknüpft & synchronisiert",
4339
+ "linkSourceFailed": "Repo konnte nicht verknüpft werden",
4340
+ "synced": "Synchronisiert: {updated} aktualisiert, {removed} entfernt",
4341
+ "syncFailed": "Repo konnte nicht synchronisiert werden",
4342
+ "changesAvailable": "Stromaufwärts liegen Änderungen vor",
4343
+ "upToDate": "Bereits aktuell",
4344
+ "checkSourceFailed": "Repo konnte nicht geprüft werden",
4345
+ "sourceUnlinked": "Repo-Verknüpfung gelöst",
4346
+ "unlinkSourceFailed": "Repo-Verknüpfung konnte nicht gelöst werden"
4347
+ }
4348
+ },
4214
4349
  "brainstorm": {
4215
4350
  "title": {
4216
4351
  "architecture": "Architektur-Brainstorm",
@@ -4649,7 +4784,8 @@
4649
4784
  "modelConfiguration": "Modellkonfiguration",
4650
4785
  "accountSettings": "Kontoeinstellungen",
4651
4786
  "operatorDashboard": "Plattform-Observability",
4652
- "reports": "Berichte"
4787
+ "reports": "Berichte",
4788
+ "foundationalServices": "Basisdienste"
4653
4789
  },
4654
4790
  "errors": {
4655
4791
  "generic": {
@@ -4718,7 +4854,9 @@
4718
4854
  "pipeline_schedule_attached": "Wiederkehrender Zeitplan nutzt diese Pipeline",
4719
4855
  "pipeline_schedule_requires_recurring": "Wiederkehrender Zeitplan braucht diese Pipeline",
4720
4856
  "pipeline_schedule_intake_unconfigured": "Zeitplan ohne Ticket-Erfassung",
4721
- "foundational_service_exists": "Basisdienst existiert bereits"
4857
+ "foundational_service_exists": "Basisdienst existiert bereits",
4858
+ "binary_output_service_invalid": "Dienst für Binärausgaben nicht auflösbar",
4859
+ "foundational_service_not_inherited": "Dieses Board hat den Dienst registriert"
4722
4860
  },
4723
4861
  "description": {
4724
4862
  "dependencies_unmet": "Diese Aufgabe hängt von anderen ab, die noch nicht abgeschlossen sind. Schließe sie ab oder gib sie frei und starte dann erneut.",
@@ -4747,7 +4885,9 @@
4747
4885
  "pipeline_schedule_attached": "Ein wiederkehrender Zeitplan verweist noch auf diese Pipeline, und jeder von ihm gestartete Lauf löst die Pipeline über ihre ID auf. Lösen oder löschen Sie zuerst diesen Zeitplan und entfernen Sie danach die Pipeline.",
4748
4886
  "pipeline_schedule_requires_recurring": "Ein wiederkehrender Zeitplan verweist noch auf diese Pipeline. Sie nur einmalig zu machen würde jeden künftigen Lauf unterbrechen. Lösen Sie zuerst diesen Zeitplan.",
4749
4887
  "pipeline_schedule_intake_unconfigured": "Ein Bug-Intake-Schritt bezieht seine Arbeit aus der Ticket-Erfassung des Zeitplans, und der verknüpfte Zeitplan hat keine. Konfigurieren Sie zuerst die Ticket-Erfassung im Zeitplan.",
4750
- "foundational_service_exists": "Ein Basisdienst mit dieser ID ist in diesem Bereich bereits registriert. Öffnen Sie den vorhandenen Eintrag und bearbeiten Sie ihn — zwei Dienste können sich keine ID teilen, denn die ID ist der Name, den ein Architekt in seinem Entwurf verwendet."
4888
+ "foundational_service_exists": "Ein Basisdienst mit dieser ID ist in diesem Bereich bereits registriert. Öffnen Sie den vorhandenen Eintrag und bearbeiten Sie ihn — zwei Dienste können sich keine ID teilen, denn die ID ist der Name, den ein Architekt in seinem Entwurf verwendet.",
4889
+ "binary_output_service_invalid": "Ein Schritt, der Binärausgaben erzeugt, wählt einen Basisdienst aus, den der Katalog dieses Workspace nicht auflösen kann: Die ID ist unbekannt, oder der gewählte Speicherdienst trägt nicht die Fähigkeit asset-storage. Korrigieren Sie die Auswahl des Schritts oder registrieren Sie den Dienst und starten Sie erneut.",
4890
+ "foundational_service_not_inherited": "Abwählen gilt für einen vom Konto geerbten Dienst. Diese ID ist von diesem Board registriert, es gibt also nichts abzuwählen - lösche stattdessen den eigenen Eintrag des Boards."
4751
4891
  },
4752
4892
  "action": {
4753
4893
  "connectGitHub": "GitHub verbinden",
@@ -150,7 +150,8 @@
150
150
  "modelConfiguration": "Model configuration",
151
151
  "accountSettings": "Account settings",
152
152
  "operatorDashboard": "Platform observability",
153
- "reports": "Reports"
153
+ "reports": "Reports",
154
+ "foundationalServices": "Foundational services"
154
155
  },
155
156
  "board": {
156
157
  "toast": {
@@ -601,7 +602,9 @@
601
602
  "pipeline_schedule_attached": "Recurring schedule uses this pipeline",
602
603
  "pipeline_schedule_requires_recurring": "Recurring schedule needs this pipeline",
603
604
  "pipeline_schedule_intake_unconfigured": "Schedule has no issue intake",
604
- "foundational_service_exists": "Foundational service already exists"
605
+ "foundational_service_exists": "Foundational service already exists",
606
+ "binary_output_service_invalid": "Binary output service can't be resolved",
607
+ "foundational_service_not_inherited": "This board registered that service"
605
608
  },
606
609
  "description": {
607
610
  "dependencies_unmet": "This task depends on others that aren't finished yet. Complete or unblock them, then start it again.",
@@ -633,7 +636,9 @@
633
636
  "pipeline_schedule_attached": "A recurring schedule still points at this pipeline, and every run it starts resolves the pipeline by id. Detach or delete that schedule first, then remove the pipeline.",
634
637
  "pipeline_schedule_requires_recurring": "A recurring schedule still points at this pipeline, so making it one-off only would break every future run it starts. Detach that schedule first.",
635
638
  "pipeline_schedule_intake_unconfigured": "A bug intake step draws its work from the schedule issue intake settings, and the attached schedule has none. Configure issue intake on the schedule first.",
636
- "foundational_service_exists": "A foundational service with this id is already registered at this scope. Open the existing entry and edit it — two services cannot share an id, because the id is what an architect names in its design."
639
+ "foundational_service_exists": "A foundational service with this id is already registered at this scope. Open the existing entry and edit it — two services cannot share an id, because the id is what an architect names in its design.",
640
+ "binary_output_service_invalid": "A step that generates binary outputs selects a foundational service this workspace's catalog can't resolve: the id is unknown, or the chosen storage service doesn't carry the asset-storage capability. Fix the step's selection or register the service, then start again.",
641
+ "foundational_service_not_inherited": "Opting out applies to a service inherited from the account. This id is registered by this board, so there is nothing to opt out of - delete the board's own entry instead."
637
642
  },
638
643
  "action": {
639
644
  "connectGitHub": "Connect GitHub",
@@ -2159,7 +2164,8 @@
2159
2164
  "shortcuts": "Keyboard shortcuts",
2160
2165
  "bugHunt": "Bug hunt",
2161
2166
  "toggleUiMode": "Switch interface mode",
2162
- "tutorial": "Take a tour"
2167
+ "tutorial": "Take a tour",
2168
+ "foundationalServices": "Foundational services"
2163
2169
  },
2164
2170
  "keywords": {
2165
2171
  "newPipeline": "pipeline agents chain",
@@ -2182,7 +2188,8 @@
2182
2188
  "shortcuts": "keyboard shortcuts keys hotkeys cheatsheet help",
2183
2189
  "bugHunt": "bug hunt triage backlog issue tracker unassigned",
2184
2190
  "toggleUiMode": "interface mode basic advanced simple expert show hide",
2185
- "tutorial": "tutorial onboarding tour guide help learn basics"
2191
+ "tutorial": "tutorial onboarding tour guide help learn basics",
2192
+ "foundationalServices": "shared capability platform service api contract openapi catalog"
2186
2193
  }
2187
2194
  },
2188
2195
  "shortcuts": {
@@ -2342,6 +2349,9 @@
2342
2349
  "title": "Pick a default test environment",
2343
2350
  "body": "This board hasn't chosen how its services get a test environment. Pick a default and every service you add from now on starts with it, instead of being set up one at a time. You can still change it per service.",
2344
2351
  "action": "Choose default"
2352
+ },
2353
+ "accountFoundational": {
2354
+ "intro": "The shared capabilities this organisation already runs - file storage, notifications, audit - with their API contracts. Every board inherits them, and an architect is told to consume them instead of proposing a rebuild."
2345
2355
  }
2346
2356
  },
2347
2357
  "settings": {
@@ -2396,7 +2406,8 @@
2396
2406
  "tabs": {
2397
2407
  "team": "Team & access",
2398
2408
  "fragments": "Context fragments",
2399
- "skills": "Skills"
2409
+ "skills": "Skills",
2410
+ "foundational": "Foundational services"
2400
2411
  }
2401
2412
  },
2402
2413
  "infrastructure": {
@@ -5414,6 +5425,135 @@
5414
5425
  },
5415
5426
  "unavailable": "The prompt-fragment library isn't enabled for this deployment."
5416
5427
  },
5428
+ "foundational": {
5429
+ "unavailable": "The foundational-services catalog isn't enabled for this deployment.",
5430
+ "owner": {
5431
+ "workspace": "This board",
5432
+ "account": "This account"
5433
+ },
5434
+ "tab": {
5435
+ "catalog": "Catalog",
5436
+ "sources": "Repo sources"
5437
+ },
5438
+ "panel": {
5439
+ "title": "Foundational services",
5440
+ "subtitle": "The shared capabilities your organisation already runs, so a design consumes them instead of rebuilding them."
5441
+ },
5442
+ "tier": {
5443
+ "account": "Account",
5444
+ "workspace": "Board"
5445
+ },
5446
+ "format": {
5447
+ "openapi": "OpenAPI",
5448
+ "toadContract": "toad-contracts",
5449
+ "lokaliseApiContract": "lokalise/api-contract"
5450
+ },
5451
+ "contracts": {
5452
+ "omitted": "+{count} more not listed",
5453
+ "none": "No API contract attached. An agent will be told the interface is unknown rather than guessing at it."
5454
+ },
5455
+ "catalog": {
5456
+ "intro": "What an architect designing on this board is handed: identity, capability tags and operation names. Contract documents are read only when a design declares the service.",
5457
+ "empty": "No foundational services yet. Register one below, or link a repo that describes them.",
5458
+ "suppress": "Do not offer this service on this board",
5459
+ "showDocuments": "Show contract documents",
5460
+ "hideDocuments": "Hide contract documents"
5461
+ },
5462
+ "suppressions": {
5463
+ "title": "Opted out on this board",
5464
+ "intro": "These account services are hidden from designs on this board. Nothing was deleted, and the account keeps them for every other board.",
5465
+ "restore": "Offer again",
5466
+ "shadowsNothing": "Nothing is inherited under this id right now, so this opt-out currently hides nothing."
5467
+ },
5468
+ "registry": {
5469
+ "empty": "Nothing registered at this scope yet.",
5470
+ "add": "Register a service",
5471
+ "addTitle": "Register a foundational service",
5472
+ "editTitle": "Edit foundational service",
5473
+ "edit": "Edit",
5474
+ "delete": "Delete",
5475
+ "save": "Save",
5476
+ "cancel": "Cancel",
5477
+ "fromSource": "Synced from a linked repo ({path}). Edit it in the repo; the next sync overwrites changes made here.",
5478
+ "idFixed": "the id an architect writes in its design, fixed once registered",
5479
+ "idPlaceholder": "id (lower-kebab, e.g. file-storage)",
5480
+ "namePlaceholder": "name (e.g. File Storage)",
5481
+ "summaryPlaceholder": "one-line summary - what it is for",
5482
+ "descriptionPlaceholder": "what it does, when to use it, and what it does NOT cover",
5483
+ "capabilitiesPlaceholder": "capability tags, comma separated (e.g. file-storage, cdn)",
5484
+ "contractsTitle": "API contracts",
5485
+ "contractsKeep": "Leave untouched to keep the stored documents.",
5486
+ "contractsReplace": "Saving REPLACES the whole stored set with what is listed here.",
5487
+ "addContract": "Add a contract",
5488
+ "removeContract": "Remove this contract",
5489
+ "contractIdPlaceholder": "contract id (lower-kebab, e.g. openapi)",
5490
+ "contractTitlePlaceholder": "title (e.g. HTTP API)",
5491
+ "contractBodyPlaceholder": "paste the document: an OpenAPI 3.x file, or a contract module's source"
5492
+ },
5493
+ "sources": {
5494
+ "empty": "No linked repos. Link one below to sync service definitions and their contract files.",
5495
+ "linkTitle": "Link a repo source",
5496
+ "link": "Link & sync",
5497
+ "metaSynced": "synced {date} · ref {ref}",
5498
+ "metaNever": "never synced · ref {ref}",
5499
+ "metaFiles": "{service} · {count} contract files",
5500
+ "metaDirectory": "one service per subdirectory",
5501
+ "changes": "Changes",
5502
+ "check": "Check for changes",
5503
+ "sync": "Resync",
5504
+ "unlink": "Unlink",
5505
+ "selectedDir": "Directory:",
5506
+ "selectedFiles": "Files picked: {count}",
5507
+ "wholeRepo": "Whole repository (root).",
5508
+ "ownerPlaceholder": "owner",
5509
+ "repoPlaceholder": "repo",
5510
+ "dirPlaceholder": "dir path (e.g. foundational)",
5511
+ "filePathsPlaceholder": "contract file paths, one per line",
5512
+ "refPlaceholder": "ref (default HEAD)",
5513
+ "githubRequired": "Linking a repo requires the source-control integration. Connect it on a board first.",
5514
+ "serviceIdPlaceholder": "service id (lower-kebab)",
5515
+ "serviceNamePlaceholder": "service name",
5516
+ "serviceSummaryPlaceholder": "one-line summary (optional)",
5517
+ "mode": {
5518
+ "directory": "A folder of services",
5519
+ "files": "Specific files, one service",
5520
+ "directoryHint": "Every subdirectory of the linked path is one service, described by a service.md with its contract files beside it.",
5521
+ "filesHint": "The listed files all describe the one service you name here. Use this when there is no folder convention to adopt."
5522
+ }
5523
+ },
5524
+ "confirmUnlinkSource": {
5525
+ "title": "Unlink this repo?",
5526
+ "body": "\"{repo}\" and the services it synced will be removed from the catalog. You can link it again later.",
5527
+ "confirm": "Unlink"
5528
+ },
5529
+ "confirmDelete": {
5530
+ "title": "Delete this service?",
5531
+ "body": "\"{name}\" and its uploaded contract documents will be removed from this scope.",
5532
+ "bodyWorkspace": "\"{name}\" and its uploaded contract documents will be removed from this board. If the account registers a service under the same id, this board will also stop inheriting it; you can undo that under \"Opted out on this board\".",
5533
+ "confirm": "Delete"
5534
+ },
5535
+ "toast": {
5536
+ "created": "Service registered",
5537
+ "updated": "Service updated",
5538
+ "deleted": "Service deleted",
5539
+ "saveFailed": "Could not save the service",
5540
+ "deleteFailed": "Could not delete the service",
5541
+ "suppressed": "Hidden from designs on this board",
5542
+ "suppressFailed": "Could not hide the service",
5543
+ "restored": "Offered on this board again",
5544
+ "restoreFailed": "Could not restore the service",
5545
+ "contractsFailed": "Could not load the contract documents",
5546
+ "sourceLinked": "Repo linked & synced",
5547
+ "linkSourceFailed": "Could not link the repo",
5548
+ "synced": "Synced: {updated} updated, {removed} removed",
5549
+ "syncFailed": "Could not sync the repo",
5550
+ "changesAvailable": "Changes available upstream",
5551
+ "upToDate": "Already up to date",
5552
+ "checkSourceFailed": "Could not check the repo",
5553
+ "sourceUnlinked": "Repo unlinked",
5554
+ "unlinkSourceFailed": "Could not unlink the repo"
5555
+ }
5556
+ },
5417
5557
  "sandbox": {
5418
5558
  "title": "Sandbox: prompt and model testing",
5419
5559
  "description": "Try prompt versions and models against graded fixtures, scored by a judge model.",