@cat-factory/app 0.293.1 → 0.295.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.
- package/app/components/board/AddTaskModal.vue +80 -0
- package/app/components/board/RecurringPipelineModal.vue +34 -20
- package/app/components/bootstrap/BootstrapModal.logic.spec.ts +54 -0
- package/app/components/bootstrap/BootstrapModal.logic.ts +44 -0
- package/app/components/bootstrap/BootstrapModal.vue +155 -16
- package/app/components/bugFishing/BugFishingWindow.vue +524 -0
- package/app/components/focus/BlockFocusView.vue +2 -0
- package/app/components/github/RepoTreeBrowser.vue +89 -6
- package/app/components/layout/NotificationsInbox.vue +15 -0
- package/app/components/panels/ResultWindowDrafts.logic.spec.ts +25 -3
- package/app/components/panels/ResultWindowShell.logic.spec.ts +4 -0
- package/app/components/settings/WorkspaceSettingsPanel.vue +46 -1
- package/app/components/slack/SlackPanel.vue +1 -0
- package/app/composables/api/bugFishing.ts +52 -0
- package/app/composables/useApi.ts +2 -0
- package/app/composables/usePipelineErrorToast.ts +21 -0
- package/app/modular/result-views.ts +6 -0
- package/app/stores/agentRuns.spec.ts +1 -0
- package/app/stores/bugFishing.ts +143 -0
- package/app/stores/ui/resultViews.ts +14 -7
- package/app/stores/ui/runStepOpeners.ts +29 -1
- package/app/stores/workspaceSettings.ts +1 -0
- package/app/types/bootstrap.ts +1 -0
- package/app/types/execution.ts +9 -0
- package/app/utils/catalog.spec.ts +1 -0
- package/app/utils/catalog.ts +25 -0
- package/app/utils/repoPath.spec.ts +49 -0
- package/app/utils/repoPath.ts +28 -0
- package/i18n/locales/de.json +121 -10
- package/i18n/locales/en.json +120 -9
- package/i18n/locales/es.json +121 -10
- package/i18n/locales/fr.json +121 -10
- package/i18n/locales/he.json +121 -10
- package/i18n/locales/it.json +121 -10
- package/i18n/locales/ja.json +121 -10
- package/i18n/locales/pl.json +121 -10
- package/i18n/locales/tr.json +121 -10
- package/i18n/locales/uk.json +121 -10
- 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
|
+
})
|
package/app/utils/repoPath.ts
CHANGED
|
@@ -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
|
+
}
|
package/i18n/locales/de.json
CHANGED
|
@@ -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
|
},
|
|
@@ -5064,7 +5086,8 @@
|
|
|
5064
5086
|
"title": "Letzte Läufe",
|
|
5065
5087
|
"fromArch": "aus {name}",
|
|
5066
5088
|
"fromScratch": "von Grund auf",
|
|
5067
|
-
"open": "Öffnen"
|
|
5089
|
+
"open": "Öffnen",
|
|
5090
|
+
"openPr": "Pull Request"
|
|
5068
5091
|
},
|
|
5069
5092
|
"status": {
|
|
5070
5093
|
"pending": "ausstehend",
|
|
@@ -5112,11 +5135,24 @@
|
|
|
5112
5135
|
"label": "Wo der Service entsteht",
|
|
5113
5136
|
"newRepo": {
|
|
5114
5137
|
"label": "Ein neues Repository",
|
|
5115
|
-
"description": "Ein eigenes Repository anlegen und den Service
|
|
5138
|
+
"description": "Ein eigenes Repository anlegen und den Service hineinschreiben."
|
|
5116
5139
|
},
|
|
5117
5140
|
"monorepo": {
|
|
5118
5141
|
"label": "Ein Verzeichnis in einem bestehenden Monorepo",
|
|
5119
|
-
"description": "Den Service einem
|
|
5142
|
+
"description": "Den Service einem Repository hinzufügen, das du bereits hast."
|
|
5143
|
+
}
|
|
5144
|
+
},
|
|
5145
|
+
"delivery": {
|
|
5146
|
+
"label": "Wie die Arbeit ankommt",
|
|
5147
|
+
"pullRequest": {
|
|
5148
|
+
"label": "Pull Request öffnen",
|
|
5149
|
+
"descNewRepo": "Einen Branch pushen und einen Pull Request gegen den ersten Commit des Repositories öffnen, damit jemand das Gerüst prüft, bevor es zum Default-Branch wird. Das Repository muss bereits einen Commit haben.",
|
|
5150
|
+
"descMonorepo": "Einen Branch pushen und einen Pull Request öffnen. Es wird nichts für dich gemergt."
|
|
5151
|
+
},
|
|
5152
|
+
"directPush": {
|
|
5153
|
+
"label": "Direkt pushen",
|
|
5154
|
+
"descNewRepo": "Den Service direkt als ersten Commit auf den Default-Branch schreiben.",
|
|
5155
|
+
"descMonorepo": "Während der Agent arbeitet, direkt auf den Default-Branch committen. Bei einem Fehlschlag bleibt liegen, was bereits geschrieben wurde."
|
|
5120
5156
|
}
|
|
5121
5157
|
},
|
|
5122
5158
|
"serviceName": {
|
|
@@ -5124,7 +5160,7 @@
|
|
|
5124
5160
|
"description": "Benennt den Service auf dem Board und schlägt sein Verzeichnis vor."
|
|
5125
5161
|
},
|
|
5126
5162
|
"monorepo": {
|
|
5127
|
-
"intro": "Der Service wird in ein Verzeichnis eines bestehenden Repositories geschrieben
|
|
5163
|
+
"intro": "Der Service wird in ein Verzeichnis eines bestehenden Repositories geschrieben; außerhalb dieses Verzeichnisses wird nichts geändert.",
|
|
5128
5164
|
"repo": {
|
|
5129
5165
|
"label": "Monorepo",
|
|
5130
5166
|
"description": "Das Repository, in dem der neue Service liegt. Es muss bereits mit diesem Workspace verknüpft sein.",
|
|
@@ -5133,8 +5169,11 @@
|
|
|
5133
5169
|
},
|
|
5134
5170
|
"directory": {
|
|
5135
5171
|
"label": "Serviceverzeichnis",
|
|
5136
|
-
"description": "Wo der Service liegt, relativ zum
|
|
5172
|
+
"description": "Wo der Service liegt, relativ zum Repo-Root. Der Lauf legt es an, es darf also noch nicht existieren.",
|
|
5137
5173
|
"placeholder": "services/payments",
|
|
5174
|
+
"browse": "Repository erkunden",
|
|
5175
|
+
"browseHint": "Öffne den Ordner, in dem der Service liegen soll. Der Name oben wird darin angelegt, im Baum gibt es also nichts auszuwählen.",
|
|
5176
|
+
"browseNeedsName": "Gib zuerst oben ein Verzeichnis an (oder unten den Servicenamen). Das Erkunden entscheidet, wohin dieser Name kommt, nicht wie er lautet.",
|
|
5138
5177
|
"error": {
|
|
5139
5178
|
"empty": "Gib ein Verzeichnis innerhalb des Repositories an.",
|
|
5140
5179
|
"escapes": "Das Verzeichnis muss innerhalb des Repositories bleiben."
|
|
@@ -6109,7 +6148,11 @@
|
|
|
6109
6148
|
"kaizen_entry_not_settled": "Der Kaizen-Eintrag wurde noch nicht bewertet",
|
|
6110
6149
|
"bootstrap_not_awaiting_review": "Dieses Bootstrap wartet auf keine Prüfung",
|
|
6111
6150
|
"adoption_plan_unavailable": "Es gibt keinen Plan zum Freigeben",
|
|
6112
|
-
"monorepo_directory_taken": "Dieses Verzeichnis existiert bereits"
|
|
6151
|
+
"monorepo_directory_taken": "Dieses Verzeichnis existiert bereits",
|
|
6152
|
+
"no_expedition": "Dieser Lauf enthält keine Fehlersuch-Expedition",
|
|
6153
|
+
"not_awaiting_triage": "Diese Expedition wartet nicht auf eine Sichtung",
|
|
6154
|
+
"already_addressed": "Für einige Befunde gibt es bereits eine Behebungsaufgabe",
|
|
6155
|
+
"no_host_frame": "Diese Expedition liegt unter keinem Service"
|
|
6113
6156
|
},
|
|
6114
6157
|
"description": {
|
|
6115
6158
|
"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 +6197,11 @@
|
|
|
6154
6197
|
"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
6198
|
"bootstrap_not_awaiting_review": "Der Lauf ist weitergegangen, seit diese Prüfung geöffnet wurde. Lade das Board neu.",
|
|
6156
6199
|
"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."
|
|
6200
|
+
"monorepo_directory_taken": "Ein Bootstrap legt einen neuen Service an. Wähle ein noch nicht vorhandenes Verzeichnis oder importiere das bestehende als Service.",
|
|
6201
|
+
"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.",
|
|
6202
|
+
"not_awaiting_triage": "Sie untersucht entweder noch einen weiteren Blickwinkel oder wurde bereits abgeschlossen. Laden Sie den Lauf neu, um den Stand zu sehen.",
|
|
6203
|
+
"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.",
|
|
6204
|
+
"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
6205
|
},
|
|
6159
6206
|
"action": {
|
|
6160
6207
|
"connectGitHub": "GitHub verbinden",
|
|
@@ -8298,5 +8345,69 @@
|
|
|
8298
8345
|
"disconnected": "Servicekatalog getrennt",
|
|
8299
8346
|
"disconnectFailed": "Servicekatalog konnte nicht getrennt werden"
|
|
8300
8347
|
}
|
|
8348
|
+
},
|
|
8349
|
+
"bugFishing": {
|
|
8350
|
+
"title": "Fehlersuch-Expedition",
|
|
8351
|
+
"titleWithBlock": "Fehlersuche: {title}",
|
|
8352
|
+
"subtitle": "Markieren Sie die Befunde, die behoben werden sollen — aus jedem wird eine eigene Aufgabe.",
|
|
8353
|
+
"stillFishing": "Suche läuft noch — {done} von {total} Blickwinkeln sind eingetroffen. Alles unten kann bereits bearbeitet werden.",
|
|
8354
|
+
"counts": "{untriaged} zu sichten, {spawned} zur Behebung geschickt",
|
|
8355
|
+
"showTriaged": "Entschiedene anzeigen",
|
|
8356
|
+
"phases": {
|
|
8357
|
+
"heading": "Blickwinkel",
|
|
8358
|
+
"all": "Alle Funde ({count})",
|
|
8359
|
+
"found": "{count} gefunden",
|
|
8360
|
+
"failedNote": "Dieser Blickwinkel wurde nicht abgeschlossen: {reason}",
|
|
8361
|
+
"status": {
|
|
8362
|
+
"pending": "In Warteschlange",
|
|
8363
|
+
"fishing": "Suche läuft…",
|
|
8364
|
+
"completed": "Fertig",
|
|
8365
|
+
"failed": "Fehlgeschlagen"
|
|
8366
|
+
}
|
|
8367
|
+
},
|
|
8368
|
+
"fixPipeline": {
|
|
8369
|
+
"label": "Behebungen laufen auf",
|
|
8370
|
+
"boardDefault": "Standard des Boards",
|
|
8371
|
+
"hint": "Ab jetzt markierte Befunde laufen auf {pipeline}."
|
|
8372
|
+
},
|
|
8373
|
+
"empty": {
|
|
8374
|
+
"nothingCaught": "Diese Expedition hat bisher nichts gefunden.",
|
|
8375
|
+
"allTriaged": "Über jeden Befund wurde entschieden."
|
|
8376
|
+
},
|
|
8377
|
+
"finding": {
|
|
8378
|
+
"failureScenario": "Wie es auftritt",
|
|
8379
|
+
"evidence": "Belege, die die Expedition angeführt hat",
|
|
8380
|
+
"suggestedFix": "Vorgeschlagene Behebung",
|
|
8381
|
+
"fixThis": "Beheben",
|
|
8382
|
+
"dismiss": "Verwerfen",
|
|
8383
|
+
"spawned": "Eine Behebungsaufgabe läuft auf {pipeline}",
|
|
8384
|
+
"spawning": "Behebungsaufgabe wird erstellt …",
|
|
8385
|
+
"spawnFailed": "Die Behebungsaufgabe konnte nicht erstellt werden: {reason} Markieren Sie den Befund erneut, um es noch einmal zu versuchen.",
|
|
8386
|
+
"openTask": "Aufgabe öffnen"
|
|
8387
|
+
},
|
|
8388
|
+
"severity": {
|
|
8389
|
+
"critical": "Kritisch",
|
|
8390
|
+
"high": "Hoch",
|
|
8391
|
+
"medium": "Mittel",
|
|
8392
|
+
"low": "Niedrig"
|
|
8393
|
+
},
|
|
8394
|
+
"kind": {
|
|
8395
|
+
"bug": "Fehler",
|
|
8396
|
+
"logic-gap": "Logiklücke",
|
|
8397
|
+
"edge-case": "Randfall",
|
|
8398
|
+
"footgun": "Stolperfalle",
|
|
8399
|
+
"requirement-gap": "Anforderungslücke",
|
|
8400
|
+
"other": "Sonstiges"
|
|
8401
|
+
},
|
|
8402
|
+
"confidence": {
|
|
8403
|
+
"high": "Hohe Sicherheit",
|
|
8404
|
+
"medium": "Mittlere Sicherheit",
|
|
8405
|
+
"low": "Geringe Sicherheit"
|
|
8406
|
+
},
|
|
8407
|
+
"footer": {
|
|
8408
|
+
"parked": "Alle Blickwinkel wurden untersucht.",
|
|
8409
|
+
"parkedWithUntriaged": "Über {count} Befund(e) wurde noch nicht entschieden.",
|
|
8410
|
+
"finish": "Sichtung abschließen"
|
|
8411
|
+
}
|
|
8301
8412
|
}
|
|
8302
8413
|
}
|
package/i18n/locales/en.json
CHANGED
|
@@ -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
|
},
|
|
@@ -7246,7 +7276,8 @@
|
|
|
7246
7276
|
"title": "Recent runs",
|
|
7247
7277
|
"fromArch": "from {name}",
|
|
7248
7278
|
"fromScratch": "from scratch",
|
|
7249
|
-
"open": "Open"
|
|
7279
|
+
"open": "Open",
|
|
7280
|
+
"openPr": "Pull request"
|
|
7250
7281
|
},
|
|
7251
7282
|
"status": {
|
|
7252
7283
|
"pending": "pending",
|
|
@@ -7294,11 +7325,24 @@
|
|
|
7294
7325
|
"label": "Where the service goes",
|
|
7295
7326
|
"newRepo": {
|
|
7296
7327
|
"label": "A new repository",
|
|
7297
|
-
"description": "Create a repository of its own and
|
|
7328
|
+
"description": "Create a repository of its own and write the service into it."
|
|
7298
7329
|
},
|
|
7299
7330
|
"monorepo": {
|
|
7300
7331
|
"label": "A directory in an existing monorepo",
|
|
7301
|
-
"description": "Add the service to a repository you already have
|
|
7332
|
+
"description": "Add the service to a repository you already have."
|
|
7333
|
+
}
|
|
7334
|
+
},
|
|
7335
|
+
"delivery": {
|
|
7336
|
+
"label": "How the work lands",
|
|
7337
|
+
"pullRequest": {
|
|
7338
|
+
"label": "Open a pull request",
|
|
7339
|
+
"descNewRepo": "Push a branch and open a pull request against the repository's first commit, so someone reviews the scaffold before it becomes the default branch. The repository must already have a commit.",
|
|
7340
|
+
"descMonorepo": "Push a branch and open a pull request. Nothing is merged for you."
|
|
7341
|
+
},
|
|
7342
|
+
"directPush": {
|
|
7343
|
+
"label": "Push directly",
|
|
7344
|
+
"descNewRepo": "Write the service straight onto the default branch as the repository's first commit.",
|
|
7345
|
+
"descMonorepo": "Commit onto the default branch as the agent works. A run that fails leaves what it had already written behind."
|
|
7302
7346
|
}
|
|
7303
7347
|
},
|
|
7304
7348
|
"serviceName": {
|
|
@@ -7306,7 +7350,7 @@
|
|
|
7306
7350
|
"description": "Names the service on the board and seeds its directory."
|
|
7307
7351
|
},
|
|
7308
7352
|
"monorepo": {
|
|
7309
|
-
"intro": "The service is written into a directory of an existing repository
|
|
7353
|
+
"intro": "The service is written into a directory of an existing repository, and nothing outside that directory is changed.",
|
|
7310
7354
|
"repo": {
|
|
7311
7355
|
"label": "Monorepo",
|
|
7312
7356
|
"description": "The repository the new service lives in. It must already be linked to this workspace.",
|
|
@@ -7315,8 +7359,11 @@
|
|
|
7315
7359
|
},
|
|
7316
7360
|
"directory": {
|
|
7317
7361
|
"label": "Service directory",
|
|
7318
|
-
"description": "Where the service lives, relative to the
|
|
7362
|
+
"description": "Where the service lives, relative to the repo root. The run creates it, so it must not exist yet.",
|
|
7319
7363
|
"placeholder": "services/payments",
|
|
7364
|
+
"browse": "Explore the repository",
|
|
7365
|
+
"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.",
|
|
7366
|
+
"browseNeedsName": "Name the directory above (or the service below) first. Exploring decides where that name goes, not what it is called.",
|
|
7320
7367
|
"error": {
|
|
7321
7368
|
"empty": "Name a directory inside the repository.",
|
|
7322
7369
|
"escapes": "The directory must stay inside the repository."
|
|
@@ -8587,5 +8634,69 @@
|
|
|
8587
8634
|
"disconnected": "Service catalog disconnected",
|
|
8588
8635
|
"disconnectFailed": "Could not disconnect the service catalog"
|
|
8589
8636
|
}
|
|
8637
|
+
},
|
|
8638
|
+
"bugFishing": {
|
|
8639
|
+
"title": "Bug fishing expedition",
|
|
8640
|
+
"titleWithBlock": "Bug fishing: {title}",
|
|
8641
|
+
"subtitle": "Mark the findings worth fixing — each one becomes its own bug-fix task.",
|
|
8642
|
+
"stillFishing": "Still fishing — {done} of {total} angles have landed. Everything below is ready to act on now.",
|
|
8643
|
+
"counts": "{untriaged} to triage, {spawned} sent for a fix",
|
|
8644
|
+
"showTriaged": "Show decided",
|
|
8645
|
+
"phases": {
|
|
8646
|
+
"heading": "Angles",
|
|
8647
|
+
"all": "Everything caught ({count})",
|
|
8648
|
+
"found": "{count} found",
|
|
8649
|
+
"failedNote": "This angle did not complete: {reason}",
|
|
8650
|
+
"status": {
|
|
8651
|
+
"pending": "Queued",
|
|
8652
|
+
"fishing": "Fishing…",
|
|
8653
|
+
"completed": "Done",
|
|
8654
|
+
"failed": "Failed"
|
|
8655
|
+
}
|
|
8656
|
+
},
|
|
8657
|
+
"fixPipeline": {
|
|
8658
|
+
"label": "Fixes run on",
|
|
8659
|
+
"boardDefault": "The board's default",
|
|
8660
|
+
"hint": "Marks you make from now on run on {pipeline}."
|
|
8661
|
+
},
|
|
8662
|
+
"empty": {
|
|
8663
|
+
"nothingCaught": "This expedition has caught nothing so far.",
|
|
8664
|
+
"allTriaged": "Every finding has been decided."
|
|
8665
|
+
},
|
|
8666
|
+
"finding": {
|
|
8667
|
+
"failureScenario": "How it fires",
|
|
8668
|
+
"evidence": "Evidence the expedition cited",
|
|
8669
|
+
"suggestedFix": "Suggested fix",
|
|
8670
|
+
"fixThis": "Fix this",
|
|
8671
|
+
"dismiss": "Dismiss",
|
|
8672
|
+
"spawned": "A fix task is running on {pipeline}",
|
|
8673
|
+
"spawning": "Creating the fix task…",
|
|
8674
|
+
"spawnFailed": "The fix task could not be created: {reason} Mark it again to retry.",
|
|
8675
|
+
"openTask": "Open the task"
|
|
8676
|
+
},
|
|
8677
|
+
"severity": {
|
|
8678
|
+
"critical": "Critical",
|
|
8679
|
+
"high": "High",
|
|
8680
|
+
"medium": "Medium",
|
|
8681
|
+
"low": "Low"
|
|
8682
|
+
},
|
|
8683
|
+
"kind": {
|
|
8684
|
+
"bug": "Bug",
|
|
8685
|
+
"logic-gap": "Logic gap",
|
|
8686
|
+
"edge-case": "Edge case",
|
|
8687
|
+
"footgun": "Footgun",
|
|
8688
|
+
"requirement-gap": "Requirement gap",
|
|
8689
|
+
"other": "Other"
|
|
8690
|
+
},
|
|
8691
|
+
"confidence": {
|
|
8692
|
+
"high": "High confidence",
|
|
8693
|
+
"medium": "Medium confidence",
|
|
8694
|
+
"low": "Low confidence"
|
|
8695
|
+
},
|
|
8696
|
+
"footer": {
|
|
8697
|
+
"parked": "Every angle has been fished.",
|
|
8698
|
+
"parkedWithUntriaged": "{count} finding(s) still undecided.",
|
|
8699
|
+
"finish": "Finish triage"
|
|
8700
|
+
}
|
|
8590
8701
|
}
|
|
8591
8702
|
}
|