@cat-factory/app 0.293.1 → 0.294.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 (37) hide show
  1. package/app/components/board/AddTaskModal.vue +80 -0
  2. package/app/components/board/RecurringPipelineModal.vue +34 -20
  3. package/app/components/bootstrap/BootstrapModal.logic.spec.ts +43 -0
  4. package/app/components/bootstrap/BootstrapModal.logic.ts +28 -0
  5. package/app/components/bootstrap/BootstrapModal.vue +82 -15
  6. package/app/components/bugFishing/BugFishingWindow.vue +524 -0
  7. package/app/components/focus/BlockFocusView.vue +2 -0
  8. package/app/components/github/RepoTreeBrowser.vue +89 -6
  9. package/app/components/layout/NotificationsInbox.vue +15 -0
  10. package/app/components/panels/ResultWindowDrafts.logic.spec.ts +25 -3
  11. package/app/components/panels/ResultWindowShell.logic.spec.ts +4 -0
  12. package/app/components/settings/WorkspaceSettingsPanel.vue +46 -1
  13. package/app/components/slack/SlackPanel.vue +1 -0
  14. package/app/composables/api/bugFishing.ts +52 -0
  15. package/app/composables/useApi.ts +2 -0
  16. package/app/composables/usePipelineErrorToast.ts +21 -0
  17. package/app/modular/result-views.ts +6 -0
  18. package/app/stores/bugFishing.ts +143 -0
  19. package/app/stores/ui/resultViews.ts +14 -7
  20. package/app/stores/ui/runStepOpeners.ts +29 -1
  21. package/app/stores/workspaceSettings.ts +1 -0
  22. package/app/types/execution.ts +9 -0
  23. package/app/utils/catalog.spec.ts +1 -0
  24. package/app/utils/catalog.ts +25 -0
  25. package/app/utils/repoPath.spec.ts +49 -0
  26. package/app/utils/repoPath.ts +28 -0
  27. package/i18n/locales/de.json +103 -6
  28. package/i18n/locales/en.json +102 -5
  29. package/i18n/locales/es.json +103 -6
  30. package/i18n/locales/fr.json +103 -6
  31. package/i18n/locales/he.json +103 -6
  32. package/i18n/locales/it.json +103 -6
  33. package/i18n/locales/ja.json +103 -6
  34. package/i18n/locales/pl.json +103 -6
  35. package/i18n/locales/tr.json +103 -6
  36. package/i18n/locales/uk.json +103 -6
  37. package/package.json +2 -2
@@ -0,0 +1,49 @@
1
+ import { describe, expect, it } from 'vitest'
2
+ import { joinRepoPath, normalizeRepoPath, repoPathSegments } from '~/utils/repoPath'
3
+
4
+ // These two helpers are what lets the bootstrap service-directory field be BROWSED rather than
5
+ // only typed: the segments say what the typed path is called and where it sits, and the join
6
+ // puts a not-yet-existing name under the folder a person opened in the repo tree. Both have to
7
+ // read a hand-typed value the way `normalizeServiceDirectory` will read it server-side, or the
8
+ // field composes a path the API then rewrites underneath it.
9
+
10
+ describe('normalizeRepoPath', () => {
11
+ it('trims surrounding slashes', () => {
12
+ expect(normalizeRepoPath('/services/payments/')).toBe('services/payments')
13
+ expect(normalizeRepoPath('services/payments')).toBe('services/payments')
14
+ expect(normalizeRepoPath('/')).toBe('')
15
+ })
16
+ })
17
+
18
+ describe('repoPathSegments', () => {
19
+ it('folds separators and drops blank / `.` segments', () => {
20
+ expect(repoPathSegments(' packages/./api ')).toEqual(['packages', 'api'])
21
+ expect(repoPathSegments('/packages//api/')).toEqual(['packages', 'api'])
22
+ })
23
+
24
+ it('reads a Windows-shaped path the same way the API will', () => {
25
+ expect(repoPathSegments('packages\\api')).toEqual(['packages', 'api'])
26
+ })
27
+
28
+ it('is empty for a path with nothing in it', () => {
29
+ expect(repoPathSegments('')).toEqual([])
30
+ expect(repoPathSegments(' ')).toEqual([])
31
+ expect(repoPathSegments('./')).toEqual([])
32
+ })
33
+
34
+ it('KEEPS `..` so a caller can refuse an escaping path', () => {
35
+ expect(repoPathSegments('packages/../../etc')).toEqual(['packages', '..', '..', 'etc'])
36
+ })
37
+ })
38
+
39
+ describe('joinRepoPath', () => {
40
+ it('places a child under a folder', () => {
41
+ expect(joinRepoPath('services', 'payments')).toBe('services/payments')
42
+ expect(joinRepoPath('/services/', 'payments')).toBe('services/payments')
43
+ })
44
+
45
+ it('makes the child the whole path at the repo root (no leading slash)', () => {
46
+ expect(joinRepoPath('', 'payments')).toBe('payments')
47
+ expect(joinRepoPath(' ', 'payments')).toBe('payments')
48
+ })
49
+ })
@@ -8,3 +8,31 @@
8
8
  export function normalizeRepoPath(p: string): string {
9
9
  return p.replace(/^\/+|\/+$/g, '')
10
10
  }
11
+
12
+ /**
13
+ * The meaningful segments of a hand-typed repo path: separators folded, blank and `.`
14
+ * segments dropped, nothing else touched.
15
+ *
16
+ * Mirrors the reduction `normalizeServiceDirectory` performs server-side, so a field that
17
+ * validates or splits a path here reaches the same reading the API will. `..` is DELIBERATELY
18
+ * kept: it is what a caller checking for an escaping path has to see.
19
+ */
20
+ export function repoPathSegments(p: string): string[] {
21
+ return p
22
+ .trim()
23
+ .replace(/\\/g, '/')
24
+ .split('/')
25
+ .filter((s) => s !== '' && s !== '.')
26
+ }
27
+
28
+ /**
29
+ * Join a child name onto a repo-root-relative parent.
30
+ *
31
+ * An empty parent is the repo ROOT, where the child IS the whole path: a bare
32
+ * `${parent}/${child}` emits a leading slash there, which is not the shape
33
+ * `normalizeRepoPath` compares against and not what the API stores.
34
+ */
35
+ export function joinRepoPath(parent: string, child: string): string {
36
+ const base = normalizeRepoPath(parent.trim())
37
+ return base ? `${base}/${child}` : child
38
+ }
@@ -1175,6 +1175,11 @@
1175
1175
  "ageToggle": "Außerdem länger abgeschlossene Aufgaben verbergen",
1176
1176
  "days": "Aufbewahren (Tage)",
1177
1177
  "hidesOnlyHint": "Es wird nichts gelöscht. Aufgaben ohne erfasstes Abschlussdatum werden nie wegen ihres Alters verborgen."
1178
+ },
1179
+ "bugFishing": {
1180
+ "heading": "Pipeline für Fehlerbehebungen aus der Fehlersuche",
1181
+ "body": "Die Pipeline, auf der eine Behebungsaufgabe läuft, wenn Sie einen Befund aus einer Fehlersuche markieren. Jeder markierte Befund wird zu einer eigenen Aufgabe auf dieser Pipeline; wer markiert, kann die Auswahl für einen Durchgang überschreiben.",
1182
+ "builtInDefault": "Die integrierte Fehlerbehebungs-Vorlage verwenden"
1178
1183
  }
1179
1184
  },
1180
1185
  "localModelEndpoints": {
@@ -2533,7 +2538,8 @@
2533
2538
  "budget_paused": "Als gelesen markieren",
2534
2539
  "budget_threshold": "Als gelesen markieren",
2535
2540
  "key_drift": "Veraltete Zugangsdaten entfernen",
2536
- "merge_tag_request": "Aufwand erfassen"
2541
+ "merge_tag_request": "Aufwand erfassen",
2542
+ "bug_fishing_triage": "Als gelesen markieren"
2537
2543
  },
2538
2544
  "failingRun": "{kind} · {at}",
2539
2545
  "failingRunsMore": "{count} weitere nicht angezeigt",
@@ -2999,7 +3005,8 @@
2999
3005
  "media": "Medien",
3000
3006
  "recurring": "Wiederkehrend",
3001
3007
  "review": "Review",
3002
- "ralph": "Ralph-Schleife"
3008
+ "ralph": "Ralph-Schleife",
3009
+ "bugFishing": "Fehlersuche"
3003
3010
  },
3004
3011
  "recurringWithFrame": "Eine wiederkehrende Aufgabe führt eine Pipeline in einem Takt aus. Fahren Sie fort, um Zeitplan + Prompt festzulegen.",
3005
3012
  "recurringNoFrame": "Eine wiederkehrende Aufgabe muss auf einem Service liegen. Fügen Sie sie aus einem Service-Frame (oder einem darin enthaltenen Modul) hinzu.",
@@ -3114,7 +3121,18 @@
3114
3121
  "prNotFound": "Pull Request #{number} wurde im Repository dieses Service nicht gefunden. Prüfe die Nummer, oder verknüpfe den Service mit dem Repository, in dem der Pull Request liegt.",
3115
3122
  "prRepoMismatch": "Dieser Pull Request liegt in einem anderen Repository. Dieser Service prüft {repo}; lege die Prüfaufgabe unter dem Service an, der mit dem Repository des Pull Requests verknüpft ist."
3116
3123
  },
3117
- "contextFailed": "Aufgabe nicht erstellt: {count} Anhang konnte nicht gelesen werden | Aufgabe nicht erstellt: {count} Anhänge konnten nicht gelesen werden"
3124
+ "contextFailed": "Aufgabe nicht erstellt: {count} Anhang konnte nicht gelesen werden | Aufgabe nicht erstellt: {count} Anhänge konnten nicht gelesen werden",
3125
+ "bugFishingFields": {
3126
+ "angles": {
3127
+ "label": "Zu untersuchende Blickwinkel",
3128
+ "hint": "Jeder Blickwinkel ist ein eigener Durchgang durch die Codebasis mit einer anderen Fragestellung. Lassen Sie alle Felder leer, um alle zu untersuchen.",
3129
+ "allSelected": "Es werden alle Blickwinkel untersucht."
3130
+ },
3131
+ "focus": {
3132
+ "label": "Worauf konzentrieren",
3133
+ "placeholder": "Teilsysteme, Verzeichnisse oder die Fehlerart, die dieses Team bisher Zeit gekostet hat"
3134
+ }
3135
+ }
3118
3136
  },
3119
3137
  "recurring": {
3120
3138
  "title": "Eine wiederkehrende Pipeline hinzufügen",
@@ -3700,6 +3718,10 @@
3700
3718
  "selected": "Ausgewählt",
3701
3719
  "added": "Hinzugefügt",
3702
3720
  "useThisFolder": "Diesen Ordner verwenden",
3721
+ "createHere": "Hier anlegen",
3722
+ "newDirTarget": "Neues Verzeichnis:",
3723
+ "nameTaken": "{name} existiert hier bereits. Wähle einen anderen Ordner oder ändere den Namen oben.",
3724
+ "exists": "Existiert",
3703
3725
  "errors": {
3704
3726
  "listDirectory": "Verzeichnis konnte nicht aufgelistet werden"
3705
3727
  },
@@ -5133,8 +5155,11 @@
5133
5155
  },
5134
5156
  "directory": {
5135
5157
  "label": "Serviceverzeichnis",
5136
- "description": "Wo der Service liegt, relativ zum Repository-Wurzelverzeichnis. Es darf noch nicht existieren.",
5158
+ "description": "Wo der Service liegt, relativ zum Repo-Root. Der Lauf legt es an, es darf also noch nicht existieren.",
5137
5159
  "placeholder": "services/payments",
5160
+ "browse": "Repository erkunden",
5161
+ "browseHint": "Öffne den Ordner, in dem der Service liegen soll. Der Name oben wird darin angelegt, im Baum gibt es also nichts auszuwählen.",
5162
+ "browseNeedsName": "Gib zuerst oben ein Verzeichnis an (oder unten den Servicenamen). Das Erkunden entscheidet, wohin dieser Name kommt, nicht wie er lautet.",
5138
5163
  "error": {
5139
5164
  "empty": "Gib ein Verzeichnis innerhalb des Repositories an.",
5140
5165
  "escapes": "Das Verzeichnis muss innerhalb des Repositories bleiben."
@@ -6109,7 +6134,11 @@
6109
6134
  "kaizen_entry_not_settled": "Der Kaizen-Eintrag wurde noch nicht bewertet",
6110
6135
  "bootstrap_not_awaiting_review": "Dieses Bootstrap wartet auf keine Prüfung",
6111
6136
  "adoption_plan_unavailable": "Es gibt keinen Plan zum Freigeben",
6112
- "monorepo_directory_taken": "Dieses Verzeichnis existiert bereits"
6137
+ "monorepo_directory_taken": "Dieses Verzeichnis existiert bereits",
6138
+ "no_expedition": "Dieser Lauf enthält keine Fehlersuch-Expedition",
6139
+ "not_awaiting_triage": "Diese Expedition wartet nicht auf eine Sichtung",
6140
+ "already_addressed": "Für einige Befunde gibt es bereits eine Behebungsaufgabe",
6141
+ "no_host_frame": "Diese Expedition liegt unter keinem Service"
6113
6142
  },
6114
6143
  "description": {
6115
6144
  "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.",
@@ -6154,7 +6183,11 @@
6154
6183
  "kaizen_entry_not_settled": "Die Bewertung steht noch aus oder läuft gerade, es gibt also keine Empfehlungen zum Bestätigen. Versuchen Sie es erneut, sobald sie abgeschlossen ist.",
6155
6184
  "bootstrap_not_awaiting_review": "Der Lauf ist weitergegangen, seit diese Prüfung geöffnet wurde. Lade das Board neu.",
6156
6185
  "adoption_plan_unavailable": "Die Analyse konnte keinen erstellen, also gibt es keine Entscheidungen zum Absenden.",
6157
- "monorepo_directory_taken": "Ein Bootstrap legt einen neuen Service an. Wähle ein noch nicht vorhandenes Verzeichnis oder importiere das bestehende als Service."
6186
+ "monorepo_directory_taken": "Ein Bootstrap legt einen neuen Service an. Wähle ein noch nicht vorhandenes Verzeichnis oder importiere das bestehende als Service.",
6187
+ "no_expedition": "Der Lauf, den Sie ansehen, enthält keinen Expeditionszustand, es gibt also nichts zu sichten. Laden Sie den Lauf neu und versuchen Sie es erneut.",
6188
+ "not_awaiting_triage": "Sie untersucht entweder noch einen weiteren Blickwinkel oder wurde bereits abgeschlossen. Laden Sie den Lauf neu, um den Stand zu sehen.",
6189
+ "already_addressed": "Dafür wurde bereits früher eine Behebungsaufgabe erstellt, es wurde also nichts neu angelegt. Öffnen Sie den Befund, um zur vorhandenen Aufgabe zu gelangen.",
6190
+ "no_host_frame": "Eine Behebungsaufgabe braucht einen Service als Zuhause und ein Repository zum Beheben. Verschieben Sie die Expeditionsaufgabe unter einen Service-Rahmen und versuchen Sie es erneut."
6158
6191
  },
6159
6192
  "action": {
6160
6193
  "connectGitHub": "GitHub verbinden",
@@ -8298,5 +8331,69 @@
8298
8331
  "disconnected": "Servicekatalog getrennt",
8299
8332
  "disconnectFailed": "Servicekatalog konnte nicht getrennt werden"
8300
8333
  }
8334
+ },
8335
+ "bugFishing": {
8336
+ "title": "Fehlersuch-Expedition",
8337
+ "titleWithBlock": "Fehlersuche: {title}",
8338
+ "subtitle": "Markieren Sie die Befunde, die behoben werden sollen — aus jedem wird eine eigene Aufgabe.",
8339
+ "stillFishing": "Suche läuft noch — {done} von {total} Blickwinkeln sind eingetroffen. Alles unten kann bereits bearbeitet werden.",
8340
+ "counts": "{untriaged} zu sichten, {spawned} zur Behebung geschickt",
8341
+ "showTriaged": "Entschiedene anzeigen",
8342
+ "phases": {
8343
+ "heading": "Blickwinkel",
8344
+ "all": "Alle Funde ({count})",
8345
+ "found": "{count} gefunden",
8346
+ "failedNote": "Dieser Blickwinkel wurde nicht abgeschlossen: {reason}",
8347
+ "status": {
8348
+ "pending": "In Warteschlange",
8349
+ "fishing": "Suche läuft…",
8350
+ "completed": "Fertig",
8351
+ "failed": "Fehlgeschlagen"
8352
+ }
8353
+ },
8354
+ "fixPipeline": {
8355
+ "label": "Behebungen laufen auf",
8356
+ "boardDefault": "Standard des Boards",
8357
+ "hint": "Ab jetzt markierte Befunde laufen auf {pipeline}."
8358
+ },
8359
+ "empty": {
8360
+ "nothingCaught": "Diese Expedition hat bisher nichts gefunden.",
8361
+ "allTriaged": "Über jeden Befund wurde entschieden."
8362
+ },
8363
+ "finding": {
8364
+ "failureScenario": "Wie es auftritt",
8365
+ "evidence": "Belege, die die Expedition angeführt hat",
8366
+ "suggestedFix": "Vorgeschlagene Behebung",
8367
+ "fixThis": "Beheben",
8368
+ "dismiss": "Verwerfen",
8369
+ "spawned": "Eine Behebungsaufgabe läuft auf {pipeline}",
8370
+ "spawning": "Behebungsaufgabe wird erstellt …",
8371
+ "spawnFailed": "Die Behebungsaufgabe konnte nicht erstellt werden: {reason} Markieren Sie den Befund erneut, um es noch einmal zu versuchen.",
8372
+ "openTask": "Aufgabe öffnen"
8373
+ },
8374
+ "severity": {
8375
+ "critical": "Kritisch",
8376
+ "high": "Hoch",
8377
+ "medium": "Mittel",
8378
+ "low": "Niedrig"
8379
+ },
8380
+ "kind": {
8381
+ "bug": "Fehler",
8382
+ "logic-gap": "Logiklücke",
8383
+ "edge-case": "Randfall",
8384
+ "footgun": "Stolperfalle",
8385
+ "requirement-gap": "Anforderungslücke",
8386
+ "other": "Sonstiges"
8387
+ },
8388
+ "confidence": {
8389
+ "high": "Hohe Sicherheit",
8390
+ "medium": "Mittlere Sicherheit",
8391
+ "low": "Geringe Sicherheit"
8392
+ },
8393
+ "footer": {
8394
+ "parked": "Alle Blickwinkel wurden untersucht.",
8395
+ "parkedWithUntriaged": "Über {count} Befund(e) wurde noch nicht entschieden.",
8396
+ "finish": "Sichtung abschließen"
8397
+ }
8301
8398
  }
8302
8399
  }
@@ -259,7 +259,8 @@
259
259
  "media": "Media",
260
260
  "recurring": "Recurring",
261
261
  "review": "Review",
262
- "ralph": "Ralph loop"
262
+ "ralph": "Ralph loop",
263
+ "bugFishing": "Bug fishing"
263
264
  },
264
265
  "recurringWithFrame": "A recurring task runs a pipeline on a cadence. Continue to set the schedule + prompt.",
265
266
  "recurringNoFrame": "A recurring task must live on a service. Add it from a service frame (or a module inside one).",
@@ -383,6 +384,17 @@
383
384
  "contextFailed": "Task not created: {count} attachment could not be read | Task not created: {count} attachments could not be read",
384
385
  "@contextFailed": {
385
386
  "description": "Count-based: how many context attachments (docs/issues) could not be fetched, which is why nothing was created (count is always >= 1). Provide ALL plural forms your language needs (English has 2; Polish/Ukrainian need 3 - one/few/many - via the custom pluralRules in i18n.config.ts)."
387
+ },
388
+ "bugFishingFields": {
389
+ "angles": {
390
+ "label": "Angles to fish",
391
+ "hint": "Each angle is its own pass over the codebase, asking a different question. Leave every box clear to fish all of them.",
392
+ "allSelected": "All angles will be fished."
393
+ },
394
+ "focus": {
395
+ "label": "Where to concentrate",
396
+ "placeholder": "Subsystems, directories, or the kind of defect that has been costing this team"
397
+ }
386
398
  }
387
399
  },
388
400
  "recurring": {
@@ -765,7 +777,11 @@
765
777
  "kaizen_entry_not_settled": "The Kaizen entry has not been graded yet",
766
778
  "bootstrap_not_awaiting_review": "This bootstrap is not waiting for a review",
767
779
  "adoption_plan_unavailable": "There is no adoption plan to approve",
768
- "monorepo_directory_taken": "That directory already exists"
780
+ "monorepo_directory_taken": "That directory already exists",
781
+ "no_expedition": "This run has no bug-fishing expedition",
782
+ "not_awaiting_triage": "This expedition is not waiting on triage",
783
+ "already_addressed": "Some findings already have a fix task",
784
+ "no_host_frame": "This expedition is not under a service"
769
785
  },
770
786
  "description": {
771
787
  "dependencies_unmet": "This task depends on others that aren't finished yet. Complete or unblock them, then start it again.",
@@ -813,7 +829,11 @@
813
829
  "kaizen_entry_not_settled": "Its grading is still queued or running, so there are no recommendations to acknowledge. Try again once it finishes.",
814
830
  "bootstrap_not_awaiting_review": "The run has moved on since this review was opened. Reload the board to see where it is now.",
815
831
  "adoption_plan_unavailable": "The survey could not produce one, so there are no decisions to submit.",
816
- "monorepo_directory_taken": "Bootstrapping creates a new service. Pick a directory that does not exist yet, or import the existing one as a service."
832
+ "monorepo_directory_taken": "Bootstrapping creates a new service. Pick a directory that does not exist yet, or import the existing one as a service.",
833
+ "no_expedition": "The run you are looking at carries no expedition state, so there is nothing to triage. Refresh the run and try again.",
834
+ "not_awaiting_triage": "It is either still fishing a later angle or it has already been finished. Refresh the run to see where it is.",
835
+ "already_addressed": "A fix task was created for them earlier, so nothing was created again. Open the finding to reach the task it already has.",
836
+ "no_host_frame": "A fix task needs a service to live under and a repository to fix. Move the expedition task under a service frame and try again."
817
837
  },
818
838
  "action": {
819
839
  "connectGitHub": "Connect GitHub",
@@ -2463,7 +2483,8 @@
2463
2483
  "budget_paused": "Mark read",
2464
2484
  "budget_threshold": "Mark read",
2465
2485
  "key_drift": "Drop stale credentials",
2466
- "merge_tag_request": "Record effort"
2486
+ "merge_tag_request": "Record effort",
2487
+ "bug_fishing_triage": "Mark read"
2467
2488
  },
2468
2489
  "failingRun": "{kind} · {at}",
2469
2490
  "failingRunsMore": "{count} more not shown",
@@ -4066,6 +4087,11 @@
4066
4087
  "ageToggle": "Also hide tasks completed long ago",
4067
4088
  "days": "Keep for (days)",
4068
4089
  "hidesOnlyHint": "Nothing is deleted. Tasks with no recorded completion date are never hidden by age."
4090
+ },
4091
+ "bugFishing": {
4092
+ "heading": "Bug-fishing fix pipeline",
4093
+ "body": "The pipeline a bug-fix task runs when you mark a finding from a bug-fishing expedition. Each marked finding becomes its own task on this pipeline; whoever marks it can override the choice for one batch.",
4094
+ "builtInDefault": "Use the built-in bug-fix preset"
4069
4095
  }
4070
4096
  },
4071
4097
  "localModelEndpoints": {
@@ -4647,6 +4673,10 @@
4647
4673
  "selected": "Selected",
4648
4674
  "added": "Added",
4649
4675
  "useThisFolder": "Use this folder",
4676
+ "createHere": "Create here",
4677
+ "newDirTarget": "New directory:",
4678
+ "nameTaken": "{name} already exists here. Pick another folder, or change the name above.",
4679
+ "exists": "Exists",
4650
4680
  "errors": {
4651
4681
  "listDirectory": "Could not list directory"
4652
4682
  },
@@ -7315,8 +7345,11 @@
7315
7345
  },
7316
7346
  "directory": {
7317
7347
  "label": "Service directory",
7318
- "description": "Where the service lives, relative to the repository root. It must not exist yet.",
7348
+ "description": "Where the service lives, relative to the repo root. The run creates it, so it must not exist yet.",
7319
7349
  "placeholder": "services/payments",
7350
+ "browse": "Explore the repository",
7351
+ "browseHint": "Open the folder the service should sit in. The name above is created inside it, so there is nothing in the tree to select.",
7352
+ "browseNeedsName": "Name the directory above (or the service below) first. Exploring decides where that name goes, not what it is called.",
7320
7353
  "error": {
7321
7354
  "empty": "Name a directory inside the repository.",
7322
7355
  "escapes": "The directory must stay inside the repository."
@@ -8587,5 +8620,69 @@
8587
8620
  "disconnected": "Service catalog disconnected",
8588
8621
  "disconnectFailed": "Could not disconnect the service catalog"
8589
8622
  }
8623
+ },
8624
+ "bugFishing": {
8625
+ "title": "Bug fishing expedition",
8626
+ "titleWithBlock": "Bug fishing: {title}",
8627
+ "subtitle": "Mark the findings worth fixing — each one becomes its own bug-fix task.",
8628
+ "stillFishing": "Still fishing — {done} of {total} angles have landed. Everything below is ready to act on now.",
8629
+ "counts": "{untriaged} to triage, {spawned} sent for a fix",
8630
+ "showTriaged": "Show decided",
8631
+ "phases": {
8632
+ "heading": "Angles",
8633
+ "all": "Everything caught ({count})",
8634
+ "found": "{count} found",
8635
+ "failedNote": "This angle did not complete: {reason}",
8636
+ "status": {
8637
+ "pending": "Queued",
8638
+ "fishing": "Fishing…",
8639
+ "completed": "Done",
8640
+ "failed": "Failed"
8641
+ }
8642
+ },
8643
+ "fixPipeline": {
8644
+ "label": "Fixes run on",
8645
+ "boardDefault": "The board's default",
8646
+ "hint": "Marks you make from now on run on {pipeline}."
8647
+ },
8648
+ "empty": {
8649
+ "nothingCaught": "This expedition has caught nothing so far.",
8650
+ "allTriaged": "Every finding has been decided."
8651
+ },
8652
+ "finding": {
8653
+ "failureScenario": "How it fires",
8654
+ "evidence": "Evidence the expedition cited",
8655
+ "suggestedFix": "Suggested fix",
8656
+ "fixThis": "Fix this",
8657
+ "dismiss": "Dismiss",
8658
+ "spawned": "A fix task is running on {pipeline}",
8659
+ "spawning": "Creating the fix task…",
8660
+ "spawnFailed": "The fix task could not be created: {reason} Mark it again to retry.",
8661
+ "openTask": "Open the task"
8662
+ },
8663
+ "severity": {
8664
+ "critical": "Critical",
8665
+ "high": "High",
8666
+ "medium": "Medium",
8667
+ "low": "Low"
8668
+ },
8669
+ "kind": {
8670
+ "bug": "Bug",
8671
+ "logic-gap": "Logic gap",
8672
+ "edge-case": "Edge case",
8673
+ "footgun": "Footgun",
8674
+ "requirement-gap": "Requirement gap",
8675
+ "other": "Other"
8676
+ },
8677
+ "confidence": {
8678
+ "high": "High confidence",
8679
+ "medium": "Medium confidence",
8680
+ "low": "Low confidence"
8681
+ },
8682
+ "footer": {
8683
+ "parked": "Every angle has been fished.",
8684
+ "parkedWithUntriaged": "{count} finding(s) still undecided.",
8685
+ "finish": "Finish triage"
8686
+ }
8590
8687
  }
8591
8688
  }
@@ -223,7 +223,8 @@
223
223
  "media": "Medios",
224
224
  "recurring": "Recurrente",
225
225
  "review": "Revisión",
226
- "ralph": "Bucle Ralph"
226
+ "ralph": "Bucle Ralph",
227
+ "bugFishing": "Pesca de errores"
227
228
  },
228
229
  "recurringWithFrame": "Una tarea recurrente ejecuta una pipeline con cierta cadencia. Continúa para definir el horario y el prompt.",
229
230
  "recurringNoFrame": "Una tarea recurrente debe vivir en un servicio. Añádela desde un marco de servicio (o un módulo dentro de él).",
@@ -338,7 +339,18 @@
338
339
  "prNotFound": "No se encontró la pull request n.º {number} en el repositorio de este servicio. Comprueba el número, o vincula el servicio al repositorio en el que está esa pull request.",
339
340
  "prRepoMismatch": "Esa pull request está en otro repositorio. Este servicio revisa {repo}, así que crea la tarea de revisión en el servicio vinculado al repositorio de la pull request."
340
341
  },
341
- "contextFailed": "Tarea no creada: no se pudo leer {count} adjunto | Tarea no creada: no se pudieron leer {count} adjuntos"
342
+ "contextFailed": "Tarea no creada: no se pudo leer {count} adjunto | Tarea no creada: no se pudieron leer {count} adjuntos",
343
+ "bugFishingFields": {
344
+ "angles": {
345
+ "label": "Ángulos a explorar",
346
+ "hint": "Cada ángulo es su propia pasada por el código, con una pregunta distinta. Deje todas las casillas sin marcar para explorarlos todos.",
347
+ "allSelected": "Se explorarán todos los ángulos."
348
+ },
349
+ "focus": {
350
+ "label": "Dónde concentrarse",
351
+ "placeholder": "Subsistemas, directorios o el tipo de defecto que más tiempo le está costando a este equipo"
352
+ }
353
+ }
342
354
  },
343
355
  "recurring": {
344
356
  "title": "Añadir una pipeline recurrente",
@@ -690,7 +702,11 @@
690
702
  "kaizen_entry_not_settled": "La entrada de Kaizen aún no se ha evaluado",
691
703
  "bootstrap_not_awaiting_review": "Este bootstrap no está esperando una revisión",
692
704
  "adoption_plan_unavailable": "No hay ningún plan que aprobar",
693
- "monorepo_directory_taken": "Ese directorio ya existe"
705
+ "monorepo_directory_taken": "Ese directorio ya existe",
706
+ "no_expedition": "Esta ejecución no tiene una pesca de errores",
707
+ "not_awaiting_triage": "Esta expedición no está esperando triaje",
708
+ "already_addressed": "Algunos hallazgos ya tienen tarea de corrección",
709
+ "no_host_frame": "Esta expedición no está bajo un servicio"
694
710
  },
695
711
  "description": {
696
712
  "dependencies_unmet": "Esta tarea depende de otras que aún no están terminadas. Complétalas o desbloquéalas y vuelve a iniciarla.",
@@ -735,7 +751,11 @@
735
751
  "kaizen_entry_not_settled": "Su evaluación sigue en cola o en curso, así que no hay recomendaciones que confirmar. Inténtalo de nuevo cuando termine.",
736
752
  "bootstrap_not_awaiting_review": "La ejecución avanzó desde que se abrió esta revisión. Recarga el tablero.",
737
753
  "adoption_plan_unavailable": "El análisis no pudo producir uno, así que no hay decisiones que enviar.",
738
- "monorepo_directory_taken": "Un bootstrap crea un servicio nuevo. Elige un directorio que aún no exista, o importa el existente como servicio."
754
+ "monorepo_directory_taken": "Un bootstrap crea un servicio nuevo. Elige un directorio que aún no exista, o importa el existente como servicio.",
755
+ "no_expedition": "La ejecución que está viendo no lleva estado de expedición, así que no hay nada que triar. Recargue la ejecución e inténtelo de nuevo.",
756
+ "not_awaiting_triage": "O sigue explorando otro ángulo o ya se ha terminado. Recargue la ejecución para ver en qué punto está.",
757
+ "already_addressed": "Ya se creó antes una tarea de corrección para ellos, así que no se ha creado nada nuevo. Abra el hallazgo para llegar a la tarea que ya tiene.",
758
+ "no_host_frame": "Una tarea de corrección necesita un servicio donde vivir y un repositorio que arreglar. Mueva la tarea de la expedición bajo un marco de servicio e inténtelo de nuevo."
739
759
  },
740
760
  "action": {
741
761
  "connectGitHub": "Conectar GitHub",
@@ -2344,7 +2364,8 @@
2344
2364
  "budget_paused": "Marcar como leída",
2345
2365
  "budget_threshold": "Marcar como leída",
2346
2366
  "key_drift": "Descartar credenciales obsoletas",
2347
- "merge_tag_request": "Registrar esfuerzo"
2367
+ "merge_tag_request": "Registrar esfuerzo",
2368
+ "bug_fishing_triage": "Marcar como leído"
2348
2369
  },
2349
2370
  "toast": {
2350
2371
  "acted": "Marcado como resuelto",
@@ -3778,6 +3799,11 @@
3778
3799
  "ageToggle": "Ocultar también las tareas terminadas hace tiempo",
3779
3800
  "days": "Conservar (días)",
3780
3801
  "hidesOnlyHint": "No se elimina nada. Las tareas sin fecha de finalización registrada nunca se ocultan por antigüedad."
3802
+ },
3803
+ "bugFishing": {
3804
+ "heading": "Pipeline de corrección de la pesca de errores",
3805
+ "body": "La pipeline con la que se ejecuta una tarea de corrección cuando marca un hallazgo de una pesca de errores. Cada hallazgo marcado se convierte en su propia tarea sobre esta pipeline; quien lo marca puede cambiar la elección para un lote.",
3806
+ "builtInDefault": "Usar la plantilla de corrección integrada"
3781
3807
  }
3782
3808
  },
3783
3809
  "localModelEndpoints": {
@@ -4486,6 +4512,10 @@
4486
4512
  "selected": "Seleccionado",
4487
4513
  "added": "Añadido",
4488
4514
  "useThisFolder": "Usar esta carpeta",
4515
+ "createHere": "Crear aquí",
4516
+ "newDirTarget": "Nuevo directorio:",
4517
+ "nameTaken": "{name} ya existe aquí. Elige otra carpeta o cambia el nombre de arriba.",
4518
+ "exists": "Existe",
4489
4519
  "errors": {
4490
4520
  "listDirectory": "No se pudo listar el directorio"
4491
4521
  },
@@ -6995,8 +7025,11 @@
6995
7025
  },
6996
7026
  "directory": {
6997
7027
  "label": "Directorio del servicio",
6998
- "description": "Dónde vive el servicio, relativo a la raíz del repositorio. Todavía no debe existir.",
7028
+ "description": "Dónde vive el servicio, relativo a la raíz del repo. La ejecución lo crea, así que todavía no debe existir.",
6999
7029
  "placeholder": "services/payments",
7030
+ "browse": "Explorar el repositorio",
7031
+ "browseHint": "Abre la carpeta donde debe ir el servicio. El nombre de arriba se crea dentro de ella, así que no hay nada que elegir en el árbol.",
7032
+ "browseNeedsName": "Primero indica un directorio arriba (o el nombre del servicio abajo). Explorar decide dónde va ese nombre, no cómo se llama.",
7000
7033
  "error": {
7001
7034
  "empty": "Indica un directorio dentro del repositorio.",
7002
7035
  "escapes": "El directorio debe quedarse dentro del repositorio."
@@ -8298,5 +8331,69 @@
8298
8331
  "disconnected": "Catálogo de servicios desconectado",
8299
8332
  "disconnectFailed": "No se pudo desconectar el catálogo de servicios"
8300
8333
  }
8334
+ },
8335
+ "bugFishing": {
8336
+ "title": "Expedición de pesca de errores",
8337
+ "titleWithBlock": "Pesca de errores: {title}",
8338
+ "subtitle": "Marque los hallazgos que merezcan corrección; cada uno se convierte en su propia tarea.",
8339
+ "stillFishing": "Aún explorando: han llegado {done} de {total} ángulos. Todo lo de abajo ya se puede tratar.",
8340
+ "counts": "{untriaged} por triar, {spawned} enviados a corrección",
8341
+ "showTriaged": "Mostrar los decididos",
8342
+ "phases": {
8343
+ "heading": "Ángulos",
8344
+ "all": "Todo lo hallado ({count})",
8345
+ "found": "{count} hallados",
8346
+ "failedNote": "Este ángulo no se completó: {reason}",
8347
+ "status": {
8348
+ "pending": "En cola",
8349
+ "fishing": "Explorando…",
8350
+ "completed": "Hecho",
8351
+ "failed": "Fallido"
8352
+ }
8353
+ },
8354
+ "fixPipeline": {
8355
+ "label": "Las correcciones se ejecutan en",
8356
+ "boardDefault": "El valor por defecto del tablero",
8357
+ "hint": "Los hallazgos que marque a partir de ahora se ejecutan en {pipeline}."
8358
+ },
8359
+ "empty": {
8360
+ "nothingCaught": "Esta expedición no ha hallado nada por ahora.",
8361
+ "allTriaged": "Se ha decidido sobre todos los hallazgos."
8362
+ },
8363
+ "finding": {
8364
+ "failureScenario": "Cómo se manifiesta",
8365
+ "evidence": "Pruebas citadas por la expedición",
8366
+ "suggestedFix": "Corrección sugerida",
8367
+ "fixThis": "Corregir esto",
8368
+ "dismiss": "Descartar",
8369
+ "spawned": "Una tarea de corrección se ejecuta en {pipeline}",
8370
+ "spawning": "Creando la tarea de corrección…",
8371
+ "spawnFailed": "No se pudo crear la tarea de corrección: {reason} Márcalo de nuevo para reintentarlo.",
8372
+ "openTask": "Abrir la tarea"
8373
+ },
8374
+ "severity": {
8375
+ "critical": "Crítica",
8376
+ "high": "Alta",
8377
+ "medium": "Media",
8378
+ "low": "Baja"
8379
+ },
8380
+ "kind": {
8381
+ "bug": "Error",
8382
+ "logic-gap": "Hueco lógico",
8383
+ "edge-case": "Caso límite",
8384
+ "footgun": "Trampa",
8385
+ "requirement-gap": "Hueco de requisito",
8386
+ "other": "Otro"
8387
+ },
8388
+ "confidence": {
8389
+ "high": "Confianza alta",
8390
+ "medium": "Confianza media",
8391
+ "low": "Confianza baja"
8392
+ },
8393
+ "footer": {
8394
+ "parked": "Se han explorado todos los ángulos.",
8395
+ "parkedWithUntriaged": "Quedan {count} hallazgo(s) sin decidir.",
8396
+ "finish": "Terminar el triaje"
8397
+ }
8301
8398
  }
8302
8399
  }