@cat-factory/app 0.199.0 → 0.200.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 (32) 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/settings/AccountSettingsPanel.vue +17 -1
  10. package/app/composables/api/foundationalServices.ts +131 -0
  11. package/app/composables/useApi.ts +2 -0
  12. package/app/composables/useNavContributions.ts +1 -0
  13. package/app/composables/usePipelineErrorToast.ts +4 -0
  14. package/app/modular/nav-contributions.spec.ts +6 -0
  15. package/app/modular/nav-contributions.ts +26 -0
  16. package/app/pages/index.vue +4 -0
  17. package/app/stores/foundationalServices.spec.ts +121 -0
  18. package/app/stores/foundationalServices.ts +276 -0
  19. package/app/stores/ui/modals.ts +12 -0
  20. package/app/types/domain.ts +1 -0
  21. package/app/types/foundationalServices.ts +32 -0
  22. package/i18n/locales/de.json +144 -6
  23. package/i18n/locales/en.json +144 -6
  24. package/i18n/locales/es.json +144 -6
  25. package/i18n/locales/fr.json +144 -6
  26. package/i18n/locales/he.json +144 -6
  27. package/i18n/locales/it.json +144 -6
  28. package/i18n/locales/ja.json +144 -6
  29. package/i18n/locales/pl.json +144 -6
  30. package/i18n/locales/tr.json +144 -6
  31. package/i18n/locales/uk.json +144 -6
  32. package/package.json +2 -2
@@ -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,8 @@
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
+ "foundational_service_not_inherited": "Dieses Board hat den Dienst registriert"
4722
4859
  },
4723
4860
  "description": {
4724
4861
  "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 +4884,8 @@
4747
4884
  "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
4885
  "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
4886
  "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."
4887
+ "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_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
4889
  },
4752
4890
  "action": {
4753
4891
  "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,8 @@
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
+ "foundational_service_not_inherited": "This board registered that service"
605
607
  },
606
608
  "description": {
607
609
  "dependencies_unmet": "This task depends on others that aren't finished yet. Complete or unblock them, then start it again.",
@@ -633,7 +635,8 @@
633
635
  "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
636
  "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
637
  "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."
638
+ "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_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
640
  },
638
641
  "action": {
639
642
  "connectGitHub": "Connect GitHub",
@@ -2159,7 +2162,8 @@
2159
2162
  "shortcuts": "Keyboard shortcuts",
2160
2163
  "bugHunt": "Bug hunt",
2161
2164
  "toggleUiMode": "Switch interface mode",
2162
- "tutorial": "Take a tour"
2165
+ "tutorial": "Take a tour",
2166
+ "foundationalServices": "Foundational services"
2163
2167
  },
2164
2168
  "keywords": {
2165
2169
  "newPipeline": "pipeline agents chain",
@@ -2182,7 +2186,8 @@
2182
2186
  "shortcuts": "keyboard shortcuts keys hotkeys cheatsheet help",
2183
2187
  "bugHunt": "bug hunt triage backlog issue tracker unassigned",
2184
2188
  "toggleUiMode": "interface mode basic advanced simple expert show hide",
2185
- "tutorial": "tutorial onboarding tour guide help learn basics"
2189
+ "tutorial": "tutorial onboarding tour guide help learn basics",
2190
+ "foundationalServices": "shared capability platform service api contract openapi catalog"
2186
2191
  }
2187
2192
  },
2188
2193
  "shortcuts": {
@@ -2342,6 +2347,9 @@
2342
2347
  "title": "Pick a default test environment",
2343
2348
  "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
2349
  "action": "Choose default"
2350
+ },
2351
+ "accountFoundational": {
2352
+ "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
2353
  }
2346
2354
  },
2347
2355
  "settings": {
@@ -2396,7 +2404,8 @@
2396
2404
  "tabs": {
2397
2405
  "team": "Team & access",
2398
2406
  "fragments": "Context fragments",
2399
- "skills": "Skills"
2407
+ "skills": "Skills",
2408
+ "foundational": "Foundational services"
2400
2409
  }
2401
2410
  },
2402
2411
  "infrastructure": {
@@ -5414,6 +5423,135 @@
5414
5423
  },
5415
5424
  "unavailable": "The prompt-fragment library isn't enabled for this deployment."
5416
5425
  },
5426
+ "foundational": {
5427
+ "unavailable": "The foundational-services catalog isn't enabled for this deployment.",
5428
+ "owner": {
5429
+ "workspace": "This board",
5430
+ "account": "This account"
5431
+ },
5432
+ "tab": {
5433
+ "catalog": "Catalog",
5434
+ "sources": "Repo sources"
5435
+ },
5436
+ "panel": {
5437
+ "title": "Foundational services",
5438
+ "subtitle": "The shared capabilities your organisation already runs, so a design consumes them instead of rebuilding them."
5439
+ },
5440
+ "tier": {
5441
+ "account": "Account",
5442
+ "workspace": "Board"
5443
+ },
5444
+ "format": {
5445
+ "openapi": "OpenAPI",
5446
+ "toadContract": "toad-contracts",
5447
+ "lokaliseApiContract": "lokalise/api-contract"
5448
+ },
5449
+ "contracts": {
5450
+ "omitted": "+{count} more not listed",
5451
+ "none": "No API contract attached. An agent will be told the interface is unknown rather than guessing at it."
5452
+ },
5453
+ "catalog": {
5454
+ "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.",
5455
+ "empty": "No foundational services yet. Register one below, or link a repo that describes them.",
5456
+ "suppress": "Do not offer this service on this board",
5457
+ "showDocuments": "Show contract documents",
5458
+ "hideDocuments": "Hide contract documents"
5459
+ },
5460
+ "suppressions": {
5461
+ "title": "Opted out on this board",
5462
+ "intro": "These account services are hidden from designs on this board. Nothing was deleted, and the account keeps them for every other board.",
5463
+ "restore": "Offer again",
5464
+ "shadowsNothing": "Nothing is inherited under this id right now, so this opt-out currently hides nothing."
5465
+ },
5466
+ "registry": {
5467
+ "empty": "Nothing registered at this scope yet.",
5468
+ "add": "Register a service",
5469
+ "addTitle": "Register a foundational service",
5470
+ "editTitle": "Edit foundational service",
5471
+ "edit": "Edit",
5472
+ "delete": "Delete",
5473
+ "save": "Save",
5474
+ "cancel": "Cancel",
5475
+ "fromSource": "Synced from a linked repo ({path}). Edit it in the repo; the next sync overwrites changes made here.",
5476
+ "idFixed": "the id an architect writes in its design, fixed once registered",
5477
+ "idPlaceholder": "id (lower-kebab, e.g. file-storage)",
5478
+ "namePlaceholder": "name (e.g. File Storage)",
5479
+ "summaryPlaceholder": "one-line summary - what it is for",
5480
+ "descriptionPlaceholder": "what it does, when to use it, and what it does NOT cover",
5481
+ "capabilitiesPlaceholder": "capability tags, comma separated (e.g. file-storage, cdn)",
5482
+ "contractsTitle": "API contracts",
5483
+ "contractsKeep": "Leave untouched to keep the stored documents.",
5484
+ "contractsReplace": "Saving REPLACES the whole stored set with what is listed here.",
5485
+ "addContract": "Add a contract",
5486
+ "removeContract": "Remove this contract",
5487
+ "contractIdPlaceholder": "contract id (lower-kebab, e.g. openapi)",
5488
+ "contractTitlePlaceholder": "title (e.g. HTTP API)",
5489
+ "contractBodyPlaceholder": "paste the document: an OpenAPI 3.x file, or a contract module's source"
5490
+ },
5491
+ "sources": {
5492
+ "empty": "No linked repos. Link one below to sync service definitions and their contract files.",
5493
+ "linkTitle": "Link a repo source",
5494
+ "link": "Link & sync",
5495
+ "metaSynced": "synced {date} · ref {ref}",
5496
+ "metaNever": "never synced · ref {ref}",
5497
+ "metaFiles": "{service} · {count} contract files",
5498
+ "metaDirectory": "one service per subdirectory",
5499
+ "changes": "Changes",
5500
+ "check": "Check for changes",
5501
+ "sync": "Resync",
5502
+ "unlink": "Unlink",
5503
+ "selectedDir": "Directory:",
5504
+ "selectedFiles": "Files picked: {count}",
5505
+ "wholeRepo": "Whole repository (root).",
5506
+ "ownerPlaceholder": "owner",
5507
+ "repoPlaceholder": "repo",
5508
+ "dirPlaceholder": "dir path (e.g. foundational)",
5509
+ "filePathsPlaceholder": "contract file paths, one per line",
5510
+ "refPlaceholder": "ref (default HEAD)",
5511
+ "githubRequired": "Linking a repo requires the source-control integration. Connect it on a board first.",
5512
+ "serviceIdPlaceholder": "service id (lower-kebab)",
5513
+ "serviceNamePlaceholder": "service name",
5514
+ "serviceSummaryPlaceholder": "one-line summary (optional)",
5515
+ "mode": {
5516
+ "directory": "A folder of services",
5517
+ "files": "Specific files, one service",
5518
+ "directoryHint": "Every subdirectory of the linked path is one service, described by a service.md with its contract files beside it.",
5519
+ "filesHint": "The listed files all describe the one service you name here. Use this when there is no folder convention to adopt."
5520
+ }
5521
+ },
5522
+ "confirmUnlinkSource": {
5523
+ "title": "Unlink this repo?",
5524
+ "body": "\"{repo}\" and the services it synced will be removed from the catalog. You can link it again later.",
5525
+ "confirm": "Unlink"
5526
+ },
5527
+ "confirmDelete": {
5528
+ "title": "Delete this service?",
5529
+ "body": "\"{name}\" and its uploaded contract documents will be removed from this scope.",
5530
+ "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\".",
5531
+ "confirm": "Delete"
5532
+ },
5533
+ "toast": {
5534
+ "created": "Service registered",
5535
+ "updated": "Service updated",
5536
+ "deleted": "Service deleted",
5537
+ "saveFailed": "Could not save the service",
5538
+ "deleteFailed": "Could not delete the service",
5539
+ "suppressed": "Hidden from designs on this board",
5540
+ "suppressFailed": "Could not hide the service",
5541
+ "restored": "Offered on this board again",
5542
+ "restoreFailed": "Could not restore the service",
5543
+ "contractsFailed": "Could not load the contract documents",
5544
+ "sourceLinked": "Repo linked & synced",
5545
+ "linkSourceFailed": "Could not link the repo",
5546
+ "synced": "Synced: {updated} updated, {removed} removed",
5547
+ "syncFailed": "Could not sync the repo",
5548
+ "changesAvailable": "Changes available upstream",
5549
+ "upToDate": "Already up to date",
5550
+ "checkSourceFailed": "Could not check the repo",
5551
+ "sourceUnlinked": "Repo unlinked",
5552
+ "unlinkSourceFailed": "Could not unlink the repo"
5553
+ }
5554
+ },
5417
5555
  "sandbox": {
5418
5556
  "title": "Sandbox: prompt and model testing",
5419
5557
  "description": "Try prompt versions and models against graded fixtures, scored by a judge model.",
@@ -126,7 +126,8 @@
126
126
  "accountSettings": "Ajustes de la cuenta",
127
127
  "operatorDashboard": "Observabilidad de la plataforma",
128
128
  "reports": "Informes",
129
- "infrastructure": "Infraestructura"
129
+ "infrastructure": "Infraestructura",
130
+ "foundationalServices": "Servicios fundamentales"
130
131
  },
131
132
  "board": {
132
133
  "toast": {
@@ -544,7 +545,8 @@
544
545
  "pipeline_schedule_attached": "Una programación recurrente usa esta canalización",
545
546
  "pipeline_schedule_requires_recurring": "Una programación recurrente necesita esta canalización",
546
547
  "pipeline_schedule_intake_unconfigured": "La programación no tiene entrada de incidencias",
547
- "foundational_service_exists": "El servicio fundacional ya existe"
548
+ "foundational_service_exists": "El servicio fundacional ya existe",
549
+ "foundational_service_not_inherited": "Este tablero registró ese servicio"
548
550
  },
549
551
  "description": {
550
552
  "dependencies_unmet": "Esta tarea depende de otras que aún no están terminadas. Complétalas o desbloquéalas y vuelve a iniciarla.",
@@ -573,7 +575,8 @@
573
575
  "pipeline_schedule_attached": "Una programación recurrente todavía apunta a esta canalización, y cada ejecución que inicia la resuelve por su id. Desvincule o elimine esa programación antes de quitar la canalización.",
574
576
  "pipeline_schedule_requires_recurring": "Una programación recurrente todavía apunta a esta canalización, así que limitarla a un solo uso rompería cada ejecución futura. Desvincule primero esa programación.",
575
577
  "pipeline_schedule_intake_unconfigured": "Un paso de entrada de errores toma su trabajo de la entrada de incidencias de la programación, y la programación vinculada no la tiene. Configure la entrada de incidencias en la programación primero.",
576
- "foundational_service_exists": "Ya hay un servicio fundacional con este identificador registrado en este ámbito. Abre la entrada existente y edítala: dos servicios no pueden compartir un identificador, porque es el nombre que un arquitecto usa en su diseño."
578
+ "foundational_service_exists": "Ya hay un servicio fundacional con este identificador registrado en este ámbito. Abre la entrada existente y edítala: dos servicios no pueden compartir un identificador, porque es el nombre que un arquitecto usa en su diseño.",
579
+ "foundational_service_not_inherited": "La exclusión se aplica a un servicio heredado de la cuenta. Este id está registrado por este tablero, así que no hay nada que excluir: elimina la entrada propia del tablero."
577
580
  },
578
581
  "action": {
579
582
  "connectGitHub": "Conectar GitHub",
@@ -2077,7 +2080,8 @@
2077
2080
  "shortcuts": "Atajos de teclado",
2078
2081
  "bugHunt": "Caza de errores",
2079
2082
  "toggleUiMode": "Cambiar el modo de interfaz",
2080
- "tutorial": "Hacer un recorrido"
2083
+ "tutorial": "Hacer un recorrido",
2084
+ "foundationalServices": "Servicios fundamentales"
2081
2085
  },
2082
2086
  "keywords": {
2083
2087
  "newPipeline": "canalización agentes cadena pipeline",
@@ -2100,7 +2104,8 @@
2100
2104
  "shortcuts": "atajos teclado teclas ayuda",
2101
2105
  "bugHunt": "error bug caza triaje backlog incidencias sin asignar",
2102
2106
  "toggleUiMode": "interfaz modo básico avanzado mostrar ocultar",
2103
- "tutorial": "tutorial recorrido guía ayuda aprender introducción"
2107
+ "tutorial": "tutorial recorrido guía ayuda aprender introducción",
2108
+ "foundationalServices": "capacidad compartida plataforma servicio api contrato openapi catálogo"
2104
2109
  }
2105
2110
  },
2106
2111
  "integrationsHub": {
@@ -2260,6 +2265,9 @@
2260
2265
  "title": "Elige un entorno de pruebas predeterminado",
2261
2266
  "body": "Este tablero aún no ha definido cómo obtienen un entorno de pruebas sus servicios. Elige un valor predeterminado y todos los servicios que añadas a partir de ahora empezarán con él, en lugar de configurarse uno a uno. Podrás cambiarlo en cada servicio.",
2262
2267
  "action": "Elegir predeterminado"
2268
+ },
2269
+ "accountFoundational": {
2270
+ "intro": "Las capacidades compartidas que esta organización ya opera - almacenamiento de archivos, notificaciones, auditoría - con sus contratos de API. Todos los tableros las heredan, y a un arquitecto se le indica que las consuma en lugar de proponer reconstruirlas."
2263
2271
  }
2264
2272
  },
2265
2273
  "settings": {
@@ -2314,7 +2322,8 @@
2314
2322
  "tabs": {
2315
2323
  "team": "Equipo y acceso",
2316
2324
  "fragments": "Fragmentos de contexto",
2317
- "skills": "Habilidades"
2325
+ "skills": "Habilidades",
2326
+ "foundational": "Servicios fundamentales"
2318
2327
  }
2319
2328
  },
2320
2329
  "providerConnection": {
@@ -5165,6 +5174,135 @@
5165
5174
  },
5166
5175
  "unavailable": "La biblioteca de fragmentos de prompt no está habilitada en esta implementación."
5167
5176
  },
5177
+ "foundational": {
5178
+ "unavailable": "El catálogo de servicios fundamentales no está habilitado en esta instalación.",
5179
+ "owner": {
5180
+ "workspace": "Este tablero",
5181
+ "account": "Esta cuenta"
5182
+ },
5183
+ "tab": {
5184
+ "catalog": "Catálogo",
5185
+ "sources": "Repos vinculados"
5186
+ },
5187
+ "panel": {
5188
+ "title": "Servicios fundamentales",
5189
+ "subtitle": "Las capacidades compartidas que tu organización ya opera, para que un diseño las consuma en lugar de reconstruirlas."
5190
+ },
5191
+ "tier": {
5192
+ "account": "Cuenta",
5193
+ "workspace": "Tablero"
5194
+ },
5195
+ "format": {
5196
+ "openapi": "OpenAPI",
5197
+ "toadContract": "toad-contracts",
5198
+ "lokaliseApiContract": "lokalise/api-contract"
5199
+ },
5200
+ "contracts": {
5201
+ "omitted": "+{count} más sin listar",
5202
+ "none": "No hay contrato de API adjunto. Al agente se le dirá que la interfaz es desconocida en lugar de dejar que la adivine."
5203
+ },
5204
+ "catalog": {
5205
+ "intro": "Lo que recibe un arquitecto que diseña en este tablero: identidad, etiquetas de capacidad y nombres de operaciones. Los documentos de contrato solo se leen cuando un diseño declara el servicio.",
5206
+ "empty": "Todavía no hay servicios fundamentales. Registra uno abajo o vincula un repositorio que los describa.",
5207
+ "suppress": "No ofrecer este servicio en este tablero",
5208
+ "showDocuments": "Mostrar documentos de contrato",
5209
+ "hideDocuments": "Ocultar documentos de contrato"
5210
+ },
5211
+ "suppressions": {
5212
+ "title": "Excluidos en este tablero",
5213
+ "intro": "Estos servicios de la cuenta están ocultos para los diseños de este tablero. No se ha borrado nada y la cuenta los conserva para los demás tableros.",
5214
+ "restore": "Volver a ofrecer",
5215
+ "shadowsNothing": "Ahora mismo no se hereda nada con este id, así que esta exclusión no oculta nada."
5216
+ },
5217
+ "registry": {
5218
+ "empty": "Todavía no hay nada registrado en este ámbito.",
5219
+ "add": "Registrar un servicio",
5220
+ "addTitle": "Registrar un servicio fundamental",
5221
+ "editTitle": "Editar servicio fundamental",
5222
+ "edit": "Editar",
5223
+ "delete": "Eliminar",
5224
+ "save": "Guardar",
5225
+ "cancel": "Cancelar",
5226
+ "fromSource": "Sincronizado desde un repositorio vinculado ({path}). Edítalo en el repositorio; la próxima sincronización sobrescribirá los cambios hechos aquí.",
5227
+ "idFixed": "el id que un arquitecto escribe en su diseño, fijo una vez registrado",
5228
+ "idPlaceholder": "id (minúsculas con guiones, p. ej. file-storage)",
5229
+ "namePlaceholder": "nombre (p. ej. File Storage)",
5230
+ "summaryPlaceholder": "resumen de una línea: para qué sirve",
5231
+ "descriptionPlaceholder": "qué hace, cuándo usarlo y qué NO cubre",
5232
+ "capabilitiesPlaceholder": "etiquetas de capacidad separadas por comas (p. ej. file-storage, cdn)",
5233
+ "contractsTitle": "Contratos de API",
5234
+ "contractsKeep": "Déjalo sin tocar para conservar los documentos guardados.",
5235
+ "contractsReplace": "Al guardar se SUSTITUYE todo el conjunto guardado por lo que aparece aquí.",
5236
+ "addContract": "Añadir un contrato",
5237
+ "removeContract": "Quitar este contrato",
5238
+ "contractIdPlaceholder": "id de contrato (minúsculas con guiones, p. ej. openapi)",
5239
+ "contractTitlePlaceholder": "título (p. ej. HTTP API)",
5240
+ "contractBodyPlaceholder": "pega el documento: un archivo OpenAPI 3.x o el código de un módulo de contrato"
5241
+ },
5242
+ "sources": {
5243
+ "empty": "No hay repositorios vinculados. Vincula uno abajo para sincronizar definiciones de servicio y sus archivos de contrato.",
5244
+ "linkTitle": "Vincular un repositorio",
5245
+ "link": "Vincular y sincronizar",
5246
+ "metaSynced": "sincronizado {date} · ref {ref}",
5247
+ "metaNever": "nunca sincronizado · ref {ref}",
5248
+ "metaFiles": "{service} · {count} archivos de contrato",
5249
+ "metaDirectory": "un servicio por subdirectorio",
5250
+ "changes": "Cambios",
5251
+ "check": "Buscar cambios",
5252
+ "sync": "Volver a sincronizar",
5253
+ "unlink": "Desvincular",
5254
+ "selectedDir": "Directorio:",
5255
+ "selectedFiles": "Archivos elegidos: {count}",
5256
+ "wholeRepo": "Todo el repositorio (raíz).",
5257
+ "ownerPlaceholder": "propietario",
5258
+ "repoPlaceholder": "repo",
5259
+ "dirPlaceholder": "ruta del directorio (p. ej. foundational)",
5260
+ "filePathsPlaceholder": "rutas de los archivos de contrato, una por línea",
5261
+ "refPlaceholder": "ref (por defecto HEAD)",
5262
+ "githubRequired": "Vincular un repositorio requiere la integración de control de versiones. Conéctala primero en un tablero.",
5263
+ "serviceIdPlaceholder": "id del servicio (minúsculas con guiones)",
5264
+ "serviceNamePlaceholder": "nombre del servicio",
5265
+ "serviceSummaryPlaceholder": "resumen de una línea (opcional)",
5266
+ "mode": {
5267
+ "directory": "Una carpeta de servicios",
5268
+ "files": "Archivos concretos, un servicio",
5269
+ "directoryHint": "Cada subdirectorio de la ruta vinculada es un servicio, descrito por un service.md con sus archivos de contrato al lado.",
5270
+ "filesHint": "Los archivos listados describen el único servicio que nombras aquí. Úsalo cuando no haya una convención de carpetas que adoptar."
5271
+ }
5272
+ },
5273
+ "confirmUnlinkSource": {
5274
+ "title": "¿Desvincular este repositorio?",
5275
+ "body": "\"{repo}\" y los servicios que sincronizó se quitarán del catálogo. Podrás volver a vincularlo más adelante.",
5276
+ "confirm": "Desvincular"
5277
+ },
5278
+ "confirmDelete": {
5279
+ "title": "¿Eliminar este servicio?",
5280
+ "body": "\"{name}\" y sus documentos de contrato subidos se quitarán de este ámbito.",
5281
+ "bodyWorkspace": "\"{name}\" y sus documentos de contrato subidos se quitarán de este tablero. Si la cuenta registra un servicio con el mismo id, este tablero también dejará de heredarlo; puedes deshacerlo en \"Excluidos en este tablero\".",
5282
+ "confirm": "Eliminar"
5283
+ },
5284
+ "toast": {
5285
+ "created": "Servicio registrado",
5286
+ "updated": "Servicio actualizado",
5287
+ "deleted": "Servicio eliminado",
5288
+ "saveFailed": "No se pudo guardar el servicio",
5289
+ "deleteFailed": "No se pudo eliminar el servicio",
5290
+ "suppressed": "Oculto para los diseños de este tablero",
5291
+ "suppressFailed": "No se pudo ocultar el servicio",
5292
+ "restored": "Vuelve a ofrecerse en este tablero",
5293
+ "restoreFailed": "No se pudo restaurar el servicio",
5294
+ "contractsFailed": "No se pudieron cargar los documentos de contrato",
5295
+ "sourceLinked": "Repositorio vinculado y sincronizado",
5296
+ "linkSourceFailed": "No se pudo vincular el repositorio",
5297
+ "synced": "Sincronizado: {updated} actualizados, {removed} eliminados",
5298
+ "syncFailed": "No se pudo sincronizar el repositorio",
5299
+ "changesAvailable": "Hay cambios en el origen",
5300
+ "upToDate": "Ya está actualizado",
5301
+ "checkSourceFailed": "No se pudo comprobar el repositorio",
5302
+ "sourceUnlinked": "Repositorio desvinculado",
5303
+ "unlinkSourceFailed": "No se pudo desvincular el repositorio"
5304
+ }
5305
+ },
5168
5306
  "sandbox": {
5169
5307
  "title": "Sandbox: pruebas de prompts y modelos",
5170
5308
  "description": "Prueba versiones de prompts y modelos contra fixtures calificados, evaluados por un modelo juez.",