@cat-factory/app 0.196.0 → 0.197.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/README.md +49 -3
- package/app/components/brainstorm/BrainstormWindow.vue +11 -4
- package/app/components/clarity/ClarityReviewWindow.vue +11 -4
- package/app/components/initiative/InitiativePlanReview.vue +44 -37
- package/app/components/initiative/InitiativeTrackerWindow.vue +12 -9
- package/app/components/layout/SideBar.vue +13 -2
- package/app/components/layout/UiModeSwitcher.vue +66 -39
- package/app/components/panels/ResultWindowShell.logic.spec.ts +174 -0
- package/app/components/panels/ResultWindowShell.logic.ts +31 -0
- package/app/components/panels/ResultWindowShell.vue +37 -8
- package/app/components/prReview/PrReviewWindow.vue +15 -7
- package/app/components/requirements/RequirementsReviewWindow.vue +15 -5
- package/app/components/spec/ServiceSpecWindow.vue +7 -4
- package/app/components/testing/TestReportWindow.vue +11 -6
- package/app/components/tutorial/TutorialOverlay.logic.spec.ts +126 -0
- package/app/components/tutorial/TutorialOverlay.logic.ts +92 -0
- package/app/components/tutorial/TutorialOverlay.vue +273 -0
- package/app/components/tutorial/TutorialPrompt.vue +102 -0
- package/app/composables/pipelineErrorToast/bespokeConflicts.ts +181 -0
- package/app/composables/useNavContributions.ts +1 -0
- package/app/composables/usePipelineErrorToast.ts +6 -164
- package/app/composables/useTutorialTours.ts +18 -0
- package/app/modular/nav-contributions.spec.ts +4 -0
- package/app/modular/nav-contributions.ts +38 -3
- package/app/modular/nav-gates.ts +7 -0
- package/app/modular/registry.spec.ts +1 -0
- package/app/modular/registry.ts +3 -1
- package/app/modular/slots.ts +7 -0
- package/app/modular/tutorial-tours.spec.ts +107 -0
- package/app/modular/tutorial-tours.ts +147 -0
- package/app/pages/index.vue +61 -0
- package/app/stores/board/dependencies.ts +52 -0
- package/app/stores/board/placement.ts +4 -37
- package/app/stores/execution/pendingGates.ts +109 -0
- package/app/stores/execution.ts +7 -94
- package/app/stores/requirements/recommendations.ts +77 -0
- package/app/stores/requirements.ts +17 -43
- package/app/stores/tutorial.spec.ts +135 -0
- package/app/stores/tutorial.ts +145 -0
- package/app/stores/workspace/commands.ts +77 -0
- package/app/stores/workspace.ts +11 -50
- package/app/utils/tutorial.spec.ts +68 -0
- package/app/utils/tutorial.ts +192 -0
- package/i18n/locales/de.json +90 -2
- package/i18n/locales/en.json +96 -2
- package/i18n/locales/es.json +90 -2
- package/i18n/locales/fr.json +90 -2
- package/i18n/locales/he.json +90 -2
- package/i18n/locales/it.json +90 -2
- package/i18n/locales/ja.json +90 -2
- package/i18n/locales/pl.json +90 -2
- package/i18n/locales/tr.json +90 -2
- package/i18n/locales/uk.json +90 -2
- package/package.json +1 -1
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import type { NavGates } from '~/modular/nav-contributions'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* In-app tutorial tours: the pure data model + geometry, shared by the tour catalog
|
|
5
|
+
* (`modular/tutorial-tours.ts`), the tutorial store, and the coach-mark overlay
|
|
6
|
+
* (`components/tutorial/TutorialOverlay.vue`).
|
|
7
|
+
*
|
|
8
|
+
* A tour is DATA, not components: an ordered list of steps, each pointing at an existing
|
|
9
|
+
* on-screen control by its `data-testid` and carrying i18n keys for what to tell the user.
|
|
10
|
+
* That keeps tours declarative (a consumer deployment contributes its own through the
|
|
11
|
+
* `tutorialTours` slot via `registerAppModule`, exactly like nav items) and keeps the whole
|
|
12
|
+
* runtime — anchor tracking, tooltip placement, advance handling — in ONE overlay component
|
|
13
|
+
* that every tour shares.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
/** How a step advances to the next one. */
|
|
17
|
+
export type TutorialAdvance =
|
|
18
|
+
/** The user reads and presses the tooltip's Next button (the default). */
|
|
19
|
+
| 'next'
|
|
20
|
+
/**
|
|
21
|
+
* The user clicks the highlighted control itself — the "now click this" steps. The
|
|
22
|
+
* tooltip shows a click hint instead of a Next button, so the app reacts to the real
|
|
23
|
+
* click (opening the real modal, creating the real task) and the tour follows along.
|
|
24
|
+
*/
|
|
25
|
+
| 'target-click'
|
|
26
|
+
|
|
27
|
+
/** Preferred tooltip side relative to the anchor; the overlay falls back when it can't fit. */
|
|
28
|
+
export type TutorialPlacement = 'top' | 'bottom' | 'left' | 'right'
|
|
29
|
+
|
|
30
|
+
export interface TutorialStep {
|
|
31
|
+
/** Stable id, unique within the tour (progress display + specs key off it). */
|
|
32
|
+
id: string
|
|
33
|
+
/**
|
|
34
|
+
* `data-testid` of the control this step points at. Absent = a centered card (intro /
|
|
35
|
+
* wrap-up steps). Reusing the e2e anchor vocabulary is deliberate: those ids are already
|
|
36
|
+
* the stable, behaviour-neutral way to name a control, and a tour stop is the same kind
|
|
37
|
+
* of consumer as a spec.
|
|
38
|
+
*
|
|
39
|
+
* A target names a KIND of control, not one instance: where several are on screen (one
|
|
40
|
+
* `task-card` per task, one `frame-add-task` per service) the first VISIBLE match wins,
|
|
41
|
+
* which may not be the one the user just produced. That is accepted rather than worked
|
|
42
|
+
* around — a tour teaches an affordance, and every match demonstrates the same one — so
|
|
43
|
+
* step copy must read correctly against any of them ("this is a task card", not "this is
|
|
44
|
+
* the task you just made").
|
|
45
|
+
*/
|
|
46
|
+
target?: string
|
|
47
|
+
/**
|
|
48
|
+
* Fallback `data-testid`s tried in order when {@link target} is absent from the DOM —
|
|
49
|
+
* for controls that render under a different id in some states (e.g. a frame's add-task
|
|
50
|
+
* button on an empty frame).
|
|
51
|
+
*/
|
|
52
|
+
altTargets?: readonly string[]
|
|
53
|
+
titleKey: string
|
|
54
|
+
bodyKey: string
|
|
55
|
+
placement?: TutorialPlacement
|
|
56
|
+
/** Defaults to `'next'`. */
|
|
57
|
+
advanceOn?: TutorialAdvance
|
|
58
|
+
/**
|
|
59
|
+
* How long the overlay waits for the target to appear before SKIPPING the step
|
|
60
|
+
* (ms, default {@link DEFAULT_TARGET_WAIT_MS}). A missing anchor is expected, not an
|
|
61
|
+
* error: the control may be RBAC-hidden, tier-hidden, or simply not part of this
|
|
62
|
+
* deployment, and a tour must degrade to the steps that do apply. Steps whose target
|
|
63
|
+
* only appears after the previous step's click (inside a just-opened modal) may need a
|
|
64
|
+
* longer wait.
|
|
65
|
+
*/
|
|
66
|
+
waitForTargetMs?: number
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export interface TutorialTour {
|
|
70
|
+
/** Stable id; completion is persisted against it, so renaming one resets its state. */
|
|
71
|
+
id: string
|
|
72
|
+
titleKey: string
|
|
73
|
+
descriptionKey: string
|
|
74
|
+
icon?: string
|
|
75
|
+
/** Sort key in the tour list; ties break on `id` so the order is deterministic. */
|
|
76
|
+
order: number
|
|
77
|
+
/**
|
|
78
|
+
* Availability gate over the same reactive {@link NavGates} the nav catalog uses, so a
|
|
79
|
+
* tour about a surface the caller can't reach (no board write, no GitHub) never shows.
|
|
80
|
+
* Absent = always offered.
|
|
81
|
+
*/
|
|
82
|
+
when?: (gates: NavGates) => boolean
|
|
83
|
+
steps: readonly TutorialStep[]
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** How long the overlay polls for a step's anchor before auto-skipping the step. */
|
|
87
|
+
export const DEFAULT_TARGET_WAIT_MS = 4000
|
|
88
|
+
|
|
89
|
+
/** How often the overlay re-queries / re-measures its anchor (canvas pans, panels open). */
|
|
90
|
+
export const TARGET_TRACK_INTERVAL_MS = 150
|
|
91
|
+
|
|
92
|
+
/** Deterministic tour-list order: `order`, then `id`. */
|
|
93
|
+
export function sortTours(tours: readonly TutorialTour[]): TutorialTour[] {
|
|
94
|
+
return [...tours].sort((a, b) => a.order - b.order || a.id.localeCompare(b.id))
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/** A DOMRect-shaped box, structurally typed so the geometry below is unit-testable. */
|
|
98
|
+
export interface TutorialRect {
|
|
99
|
+
top: number
|
|
100
|
+
left: number
|
|
101
|
+
width: number
|
|
102
|
+
height: number
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export interface CoachMarkLayout {
|
|
106
|
+
top: number
|
|
107
|
+
left: number
|
|
108
|
+
/** The side actually used (a preferred side that doesn't fit falls back), or centered. */
|
|
109
|
+
placement: TutorialPlacement | 'center'
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/** Gap between the anchor's highlight ring and the tooltip card. */
|
|
113
|
+
const TOOLTIP_GAP = 12
|
|
114
|
+
/** Minimum distance the tooltip keeps from the viewport edges. */
|
|
115
|
+
const VIEWPORT_MARGIN = 8
|
|
116
|
+
|
|
117
|
+
const clamp = (value: number, min: number, max: number) =>
|
|
118
|
+
Math.min(Math.max(value, min), Math.max(min, max))
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Where the tooltip card goes for a given anchor. Pure geometry so the fallback rules are
|
|
122
|
+
* pinned by unit tests rather than eyeballed:
|
|
123
|
+
*
|
|
124
|
+
* - no anchor ⇒ centered (intro / wrap-up steps);
|
|
125
|
+
* - the preferred side is used when the card fits between anchor and viewport edge,
|
|
126
|
+
* otherwise sides are tried `bottom → top → right → left`;
|
|
127
|
+
* - nothing fits (tiny viewport) ⇒ the bottom position, clamped — partially covering the
|
|
128
|
+
* anchor beats disappearing off-screen;
|
|
129
|
+
* - the cross-axis is centered on the anchor and clamped to the viewport margin.
|
|
130
|
+
*/
|
|
131
|
+
export function computeCoachMarkLayout(
|
|
132
|
+
target: TutorialRect | null,
|
|
133
|
+
tooltip: { width: number; height: number },
|
|
134
|
+
viewport: { width: number; height: number },
|
|
135
|
+
preferred?: TutorialPlacement,
|
|
136
|
+
): CoachMarkLayout {
|
|
137
|
+
if (!target) {
|
|
138
|
+
return {
|
|
139
|
+
top: Math.max(VIEWPORT_MARGIN, (viewport.height - tooltip.height) / 2),
|
|
140
|
+
left: Math.max(VIEWPORT_MARGIN, (viewport.width - tooltip.width) / 2),
|
|
141
|
+
placement: 'center',
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
const fits: Record<TutorialPlacement, boolean> = {
|
|
146
|
+
top: target.top - TOOLTIP_GAP - tooltip.height >= VIEWPORT_MARGIN,
|
|
147
|
+
bottom:
|
|
148
|
+
target.top + target.height + TOOLTIP_GAP + tooltip.height <=
|
|
149
|
+
viewport.height - VIEWPORT_MARGIN,
|
|
150
|
+
left: target.left - TOOLTIP_GAP - tooltip.width >= VIEWPORT_MARGIN,
|
|
151
|
+
right:
|
|
152
|
+
target.left + target.width + TOOLTIP_GAP + tooltip.width <= viewport.width - VIEWPORT_MARGIN,
|
|
153
|
+
}
|
|
154
|
+
const fallbackOrder: TutorialPlacement[] = ['bottom', 'top', 'right', 'left']
|
|
155
|
+
const placement =
|
|
156
|
+
preferred && fits[preferred]
|
|
157
|
+
? preferred
|
|
158
|
+
: (fallbackOrder.find((side) => fits[side]) ?? 'bottom')
|
|
159
|
+
|
|
160
|
+
const centeredLeft = target.left + target.width / 2 - tooltip.width / 2
|
|
161
|
+
const centeredTop = target.top + target.height / 2 - tooltip.height / 2
|
|
162
|
+
const maxLeft = viewport.width - tooltip.width - VIEWPORT_MARGIN
|
|
163
|
+
const maxTop = viewport.height - tooltip.height - VIEWPORT_MARGIN
|
|
164
|
+
|
|
165
|
+
switch (placement) {
|
|
166
|
+
case 'top':
|
|
167
|
+
return {
|
|
168
|
+
top: target.top - TOOLTIP_GAP - tooltip.height,
|
|
169
|
+
left: clamp(centeredLeft, VIEWPORT_MARGIN, maxLeft),
|
|
170
|
+
placement,
|
|
171
|
+
}
|
|
172
|
+
case 'bottom':
|
|
173
|
+
return {
|
|
174
|
+
// Clamped: this is also the "nothing fits" fallback, where overlap is accepted.
|
|
175
|
+
top: clamp(target.top + target.height + TOOLTIP_GAP, VIEWPORT_MARGIN, maxTop),
|
|
176
|
+
left: clamp(centeredLeft, VIEWPORT_MARGIN, maxLeft),
|
|
177
|
+
placement,
|
|
178
|
+
}
|
|
179
|
+
case 'left':
|
|
180
|
+
return {
|
|
181
|
+
top: clamp(centeredTop, VIEWPORT_MARGIN, maxTop),
|
|
182
|
+
left: target.left - TOOLTIP_GAP - tooltip.width,
|
|
183
|
+
placement,
|
|
184
|
+
}
|
|
185
|
+
case 'right':
|
|
186
|
+
return {
|
|
187
|
+
top: clamp(centeredTop, VIEWPORT_MARGIN, maxTop),
|
|
188
|
+
left: target.left + target.width + TOOLTIP_GAP,
|
|
189
|
+
placement,
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
package/i18n/locales/de.json
CHANGED
|
@@ -2132,7 +2132,8 @@
|
|
|
2132
2132
|
"sandbox": "Sandbox öffnen",
|
|
2133
2133
|
"shortcuts": "Tastenkürzel",
|
|
2134
2134
|
"bugHunt": "Fehlerjagd",
|
|
2135
|
-
"toggleUiMode": "Oberflächenmodus wechseln"
|
|
2135
|
+
"toggleUiMode": "Oberflächenmodus wechseln",
|
|
2136
|
+
"tutorial": "Tour starten"
|
|
2136
2137
|
},
|
|
2137
2138
|
"keywords": {
|
|
2138
2139
|
"newPipeline": "pipeline agents chain",
|
|
@@ -2154,7 +2155,8 @@
|
|
|
2154
2155
|
"sandbox": "sandbox prompt model test experiment judge fixture benchmark evaluate",
|
|
2155
2156
|
"shortcuts": "keyboard shortcuts keys hotkeys cheatsheet help",
|
|
2156
2157
|
"bugHunt": "fehler bug jagd triage backlog tracker nicht zugewiesen",
|
|
2157
|
-
"toggleUiMode": "oberfläche modus einfach erweitert anzeigen ausblenden"
|
|
2158
|
+
"toggleUiMode": "oberfläche modus einfach erweitert anzeigen ausblenden",
|
|
2159
|
+
"tutorial": "tutorial tour einführung hilfe onboarding lernen grundlagen"
|
|
2158
2160
|
}
|
|
2159
2161
|
},
|
|
2160
2162
|
"shortcuts": {
|
|
@@ -4542,6 +4544,7 @@
|
|
|
4542
4544
|
"advanced": "Erweitert",
|
|
4543
4545
|
"basicHint": "Nur die alltäglichen Werkzeuge. Für alles auf „Erweitert“ umschalten.",
|
|
4544
4546
|
"advancedHint": "Alle Bereiche und alle Ausführungsoptionen.",
|
|
4547
|
+
"switchTo": "Zu „{mode}“ wechseln",
|
|
4545
4548
|
"pinned": "Von dieser Installation festgelegt"
|
|
4546
4549
|
},
|
|
4547
4550
|
"common": {
|
|
@@ -5905,5 +5908,90 @@
|
|
|
5905
5908
|
"titleAny": "cat-factory mit Ihren Repositorys verbinden",
|
|
5906
5909
|
"intro": "cat-factory funktioniert, indem es Pull Requests in Ihren Repositorys öffnet. Verbinden Sie Ihren Repository-Anbieter, um fortzufahren."
|
|
5907
5910
|
}
|
|
5911
|
+
},
|
|
5912
|
+
"tutorial": {
|
|
5913
|
+
"prompt": {
|
|
5914
|
+
"title": "Eine kurze Tour machen?",
|
|
5915
|
+
"intro": "Geführte Touren zeigen dir die App direkt auf diesem Bildschirm: Sie heben die echten Bedienelemente hervor und sagen dir, was du anklicken sollst.",
|
|
5916
|
+
"start": "Starten",
|
|
5917
|
+
"restart": "Wiederholen",
|
|
5918
|
+
"completed": "Abgeschlossen",
|
|
5919
|
+
"decline": "Nein danke",
|
|
5920
|
+
"later": "Vielleicht später",
|
|
5921
|
+
"empty": "Für deine Rolle auf diesem Board sind noch keine Touren verfügbar."
|
|
5922
|
+
},
|
|
5923
|
+
"overlay": {
|
|
5924
|
+
"next": "Weiter",
|
|
5925
|
+
"back": "Zurück",
|
|
5926
|
+
"skip": "Tour beenden",
|
|
5927
|
+
"done": "Fertig",
|
|
5928
|
+
"progress": "Schritt {current} von {total}",
|
|
5929
|
+
"ariaLabel": "Tutorial-Schritt",
|
|
5930
|
+
"abridged": "1 Schritt wurde übersprungen: dieses Element gehört nicht zu diesem Board. | {count} Schritte wurden übersprungen: diese Elemente gehören nicht zu diesem Board.",
|
|
5931
|
+
"searching": "Suche das hervorgehobene Element...",
|
|
5932
|
+
"clickHint": "Klicke auf das hervorgehobene Element, um fortzufahren"
|
|
5933
|
+
},
|
|
5934
|
+
"tours": {
|
|
5935
|
+
"boardBasics": {
|
|
5936
|
+
"title": "Board-Grundlagen",
|
|
5937
|
+
"description": "Orientierung: das Board, die Seitenleiste und die Befehlspalette.",
|
|
5938
|
+
"steps": {
|
|
5939
|
+
"welcome": {
|
|
5940
|
+
"title": "Willkommen!",
|
|
5941
|
+
"body": "Das ist dein Delivery-Board: Hier planst du Arbeit, Agenten übernehmen sie, und du prüfst die Ergebnisse. Diese kurze Tour zeigt dir die wichtigsten Bedienelemente."
|
|
5942
|
+
},
|
|
5943
|
+
"canvas": {
|
|
5944
|
+
"title": "Das Board",
|
|
5945
|
+
"body": "Services, Module und Aufgaben liegen auf dieser Fläche. Ziehe zum Verschieben, scrolle zum Zoomen und klicke auf eine Karte, um Details zu sehen."
|
|
5946
|
+
},
|
|
5947
|
+
"sidebar": {
|
|
5948
|
+
"title": "Die Seitenleiste",
|
|
5949
|
+
"body": "Alles Weitere findest du hier: Pipelines erstellen, Repositories und Integrationen verbinden, Workspace-Einstellungen."
|
|
5950
|
+
},
|
|
5951
|
+
"commandBar": {
|
|
5952
|
+
"title": "Die Befehlspalette",
|
|
5953
|
+
"body": "Der schnellste Weg zu jeder Aktion: öffnen und lostippen. Von dort kannst du dieses Tutorial jederzeit neu starten."
|
|
5954
|
+
},
|
|
5955
|
+
"toolbar": {
|
|
5956
|
+
"title": "Board-Steuerung",
|
|
5957
|
+
"body": "Mit diesen Steuerelementen zoomst du hinein und heraus oder bringst das ganze Board ins Bild."
|
|
5958
|
+
},
|
|
5959
|
+
"finish": {
|
|
5960
|
+
"title": "Das war die Übersicht",
|
|
5961
|
+
"body": "Jetzt kennst du dich aus. Probiere die nächste Tour, um deine erste Aufgabe zu erstellen und auszuführen, oder komm später über die Befehlspalette zurück."
|
|
5962
|
+
}
|
|
5963
|
+
}
|
|
5964
|
+
},
|
|
5965
|
+
"firstTask": {
|
|
5966
|
+
"title": "Erstelle deine erste Aufgabe",
|
|
5967
|
+
"description": "Füge einem Service eine Aufgabe hinzu und sieh zu, wie sie auf dem Board erscheint.",
|
|
5968
|
+
"steps": {
|
|
5969
|
+
"intro": {
|
|
5970
|
+
"title": "Lass uns eine Aufgabe erstellen",
|
|
5971
|
+
"body": "Eine Aufgabe beschreibt ein gewünschtes Ergebnis; eine Agenten-Pipeline liefert es. Diese Tour führt dich Schritt für Schritt durch das Erstellen einer echten Aufgabe."
|
|
5972
|
+
},
|
|
5973
|
+
"addTask": {
|
|
5974
|
+
"title": "Aufgabe hinzufügen",
|
|
5975
|
+
"body": "Jeder Service-Rahmen hat einen Hinzufügen-Button in seiner Kopfzeile."
|
|
5976
|
+
},
|
|
5977
|
+
"describe": {
|
|
5978
|
+
"title": "Beschreibe das Ergebnis",
|
|
5979
|
+
"body": "Gib der Aufgabe einen kurzen Titel, der sagt, was am Ende erreicht sein soll. Normale Sprache genügt."
|
|
5980
|
+
},
|
|
5981
|
+
"create": {
|
|
5982
|
+
"title": "Erstelle die Aufgabe",
|
|
5983
|
+
"body": "Wenn die Beschreibung passt, erstelle die Aufgabe."
|
|
5984
|
+
},
|
|
5985
|
+
"card": {
|
|
5986
|
+
"title": "Aufgabenkarten",
|
|
5987
|
+
"body": "Das ist eine Aufgabenkarte. Von ihr aus startest du die Pipeline, verfolgst den Fortschritt und öffnest Ergebnisse."
|
|
5988
|
+
},
|
|
5989
|
+
"finish": {
|
|
5990
|
+
"title": "Gut gemacht",
|
|
5991
|
+
"body": "Das ist der Kernablauf: Aufgabe beschreiben, ausführen, Ergebnis prüfen. Entdecke die weiteren Touren, wann immer du magst."
|
|
5992
|
+
}
|
|
5993
|
+
}
|
|
5994
|
+
}
|
|
5995
|
+
}
|
|
5908
5996
|
}
|
|
5909
5997
|
}
|
package/i18n/locales/en.json
CHANGED
|
@@ -32,6 +32,10 @@
|
|
|
32
32
|
"advanced": "Advanced",
|
|
33
33
|
"basicHint": "Everyday tools only. Switch to Advanced to see everything.",
|
|
34
34
|
"advancedHint": "Every destination and every run option.",
|
|
35
|
+
"switchTo": "Switch to {mode}",
|
|
36
|
+
"@switchTo": {
|
|
37
|
+
"description": "Tooltip on the collapsed-sidebar tier button. {mode} is the OTHER interface tier name, i.e. the Basic or Advanced value from this same section - inflect the surrounding words to agree with it."
|
|
38
|
+
},
|
|
35
39
|
"pinned": "Set by this deployment"
|
|
36
40
|
},
|
|
37
41
|
"common": {
|
|
@@ -2150,7 +2154,8 @@
|
|
|
2150
2154
|
"sandbox": "Open Sandbox",
|
|
2151
2155
|
"shortcuts": "Keyboard shortcuts",
|
|
2152
2156
|
"bugHunt": "Bug hunt",
|
|
2153
|
-
"toggleUiMode": "Switch interface mode"
|
|
2157
|
+
"toggleUiMode": "Switch interface mode",
|
|
2158
|
+
"tutorial": "Take a tour"
|
|
2154
2159
|
},
|
|
2155
2160
|
"keywords": {
|
|
2156
2161
|
"newPipeline": "pipeline agents chain",
|
|
@@ -2172,7 +2177,8 @@
|
|
|
2172
2177
|
"sandbox": "sandbox prompt model test experiment judge fixture benchmark evaluate",
|
|
2173
2178
|
"shortcuts": "keyboard shortcuts keys hotkeys cheatsheet help",
|
|
2174
2179
|
"bugHunt": "bug hunt triage backlog issue tracker unassigned",
|
|
2175
|
-
"toggleUiMode": "interface mode basic advanced simple expert show hide"
|
|
2180
|
+
"toggleUiMode": "interface mode basic advanced simple expert show hide",
|
|
2181
|
+
"tutorial": "tutorial onboarding tour guide help learn basics"
|
|
2176
2182
|
}
|
|
2177
2183
|
},
|
|
2178
2184
|
"shortcuts": {
|
|
@@ -6106,5 +6112,93 @@
|
|
|
6106
6112
|
"titleAny": "Connect cat-factory to your repositories",
|
|
6107
6113
|
"intro": "cat-factory works by opening pull requests on your repositories. Connect your repository host to continue."
|
|
6108
6114
|
}
|
|
6115
|
+
},
|
|
6116
|
+
"tutorial": {
|
|
6117
|
+
"prompt": {
|
|
6118
|
+
"title": "Take a quick tour?",
|
|
6119
|
+
"intro": "Guided tours walk you through the app right on this screen: they highlight the actual controls and tell you what to click.",
|
|
6120
|
+
"start": "Start",
|
|
6121
|
+
"restart": "Repeat",
|
|
6122
|
+
"completed": "Completed",
|
|
6123
|
+
"decline": "No thanks",
|
|
6124
|
+
"later": "Maybe later",
|
|
6125
|
+
"empty": "No tours are available for your role on this board yet."
|
|
6126
|
+
},
|
|
6127
|
+
"overlay": {
|
|
6128
|
+
"next": "Next",
|
|
6129
|
+
"back": "Back",
|
|
6130
|
+
"skip": "End tour",
|
|
6131
|
+
"done": "Finish",
|
|
6132
|
+
"progress": "Step {current} of {total}",
|
|
6133
|
+
"ariaLabel": "Tutorial step",
|
|
6134
|
+
"abridged": "1 step was skipped: that control is not part of this board. | {count} steps were skipped: those controls are not part of this board.",
|
|
6135
|
+
"@abridged": {
|
|
6136
|
+
"description": "Shown on a tour's final card when steps were skipped. Needs the plural forms of the target language (pl/uk take three: one | few | many); {count} is the number of skipped steps."
|
|
6137
|
+
},
|
|
6138
|
+
"searching": "Looking for the highlighted control...",
|
|
6139
|
+
"clickHint": "Click the highlighted control to continue"
|
|
6140
|
+
},
|
|
6141
|
+
"tours": {
|
|
6142
|
+
"boardBasics": {
|
|
6143
|
+
"title": "Board basics",
|
|
6144
|
+
"description": "Find your way around: the board, the sidebar, and the command palette.",
|
|
6145
|
+
"steps": {
|
|
6146
|
+
"welcome": {
|
|
6147
|
+
"title": "Welcome!",
|
|
6148
|
+
"body": "This is your delivery board: you plan work here, agents pick it up, and you review the results. This short tour points out the main controls."
|
|
6149
|
+
},
|
|
6150
|
+
"canvas": {
|
|
6151
|
+
"title": "The board",
|
|
6152
|
+
"body": "Services, modules, and tasks live on this canvas. Drag to pan, scroll to zoom, and click any card to inspect it."
|
|
6153
|
+
},
|
|
6154
|
+
"sidebar": {
|
|
6155
|
+
"title": "The sidebar",
|
|
6156
|
+
"body": "Everything else lives here: building pipelines, connecting repositories and integrations, and workspace settings."
|
|
6157
|
+
},
|
|
6158
|
+
"commandBar": {
|
|
6159
|
+
"title": "The command palette",
|
|
6160
|
+
"body": "The fastest way to reach any action: open it and start typing. You can restart this tutorial from there at any time."
|
|
6161
|
+
},
|
|
6162
|
+
"toolbar": {
|
|
6163
|
+
"title": "Board controls",
|
|
6164
|
+
"body": "Zoom in and out or fit the whole board into view with these controls."
|
|
6165
|
+
},
|
|
6166
|
+
"finish": {
|
|
6167
|
+
"title": "That's the layout",
|
|
6168
|
+
"body": "You know your way around now. Try the next tour to create and run your first task, or come back later via the command palette."
|
|
6169
|
+
}
|
|
6170
|
+
}
|
|
6171
|
+
},
|
|
6172
|
+
"firstTask": {
|
|
6173
|
+
"title": "Create your first task",
|
|
6174
|
+
"description": "Add a task to a service and see it appear on the board.",
|
|
6175
|
+
"steps": {
|
|
6176
|
+
"intro": {
|
|
6177
|
+
"title": "Let's create a task",
|
|
6178
|
+
"body": "A task describes an outcome you want; an agent pipeline delivers it. This tour walks you through creating one for real."
|
|
6179
|
+
},
|
|
6180
|
+
"addTask": {
|
|
6181
|
+
"title": "Add a task",
|
|
6182
|
+
"body": "Every service frame has an add button in its header."
|
|
6183
|
+
},
|
|
6184
|
+
"describe": {
|
|
6185
|
+
"title": "Describe the outcome",
|
|
6186
|
+
"body": "Give the task a short title that says what should be true when it is done. Plain language is fine."
|
|
6187
|
+
},
|
|
6188
|
+
"create": {
|
|
6189
|
+
"title": "Create it",
|
|
6190
|
+
"body": "When the description feels right, create the task."
|
|
6191
|
+
},
|
|
6192
|
+
"card": {
|
|
6193
|
+
"title": "Task cards",
|
|
6194
|
+
"body": "This is a task card. From one you can start the pipeline, watch progress, and open the results."
|
|
6195
|
+
},
|
|
6196
|
+
"finish": {
|
|
6197
|
+
"title": "Nice work",
|
|
6198
|
+
"body": "That is the core loop: describe a task, run it, review the result. Explore the other tours whenever you like."
|
|
6199
|
+
}
|
|
6200
|
+
}
|
|
6201
|
+
}
|
|
6202
|
+
}
|
|
6109
6203
|
}
|
|
6110
6204
|
}
|
package/i18n/locales/es.json
CHANGED
|
@@ -29,6 +29,7 @@
|
|
|
29
29
|
"advanced": "Avanzada",
|
|
30
30
|
"basicHint": "Solo las herramientas del día a día. Cambia a Avanzada para verlo todo.",
|
|
31
31
|
"advancedHint": "Todas las secciones y todas las opciones de ejecución.",
|
|
32
|
+
"switchTo": "Cambiar a {mode}",
|
|
32
33
|
"pinned": "Definido por este despliegue"
|
|
33
34
|
},
|
|
34
35
|
"common": {
|
|
@@ -2071,7 +2072,8 @@
|
|
|
2071
2072
|
"sandbox": "Abrir el entorno de pruebas",
|
|
2072
2073
|
"shortcuts": "Atajos de teclado",
|
|
2073
2074
|
"bugHunt": "Caza de errores",
|
|
2074
|
-
"toggleUiMode": "Cambiar el modo de interfaz"
|
|
2075
|
+
"toggleUiMode": "Cambiar el modo de interfaz",
|
|
2076
|
+
"tutorial": "Hacer un recorrido"
|
|
2075
2077
|
},
|
|
2076
2078
|
"keywords": {
|
|
2077
2079
|
"newPipeline": "canalización agentes cadena pipeline",
|
|
@@ -2093,7 +2095,8 @@
|
|
|
2093
2095
|
"sandbox": "entorno de pruebas prompt modelo prueba experimento juez fixture benchmark evaluar",
|
|
2094
2096
|
"shortcuts": "atajos teclado teclas ayuda",
|
|
2095
2097
|
"bugHunt": "error bug caza triaje backlog incidencias sin asignar",
|
|
2096
|
-
"toggleUiMode": "interfaz modo básico avanzado mostrar ocultar"
|
|
2098
|
+
"toggleUiMode": "interfaz modo básico avanzado mostrar ocultar",
|
|
2099
|
+
"tutorial": "tutorial recorrido guía ayuda aprender introducción"
|
|
2097
2100
|
}
|
|
2098
2101
|
},
|
|
2099
2102
|
"integrationsHub": {
|
|
@@ -5893,5 +5896,90 @@
|
|
|
5893
5896
|
"titleAny": "Conecta cat-factory con tus repositorios",
|
|
5894
5897
|
"intro": "cat-factory funciona abriendo solicitudes de incorporación de cambios en tus repositorios. Conecta tu proveedor de repositorios para continuar."
|
|
5895
5898
|
}
|
|
5899
|
+
},
|
|
5900
|
+
"tutorial": {
|
|
5901
|
+
"prompt": {
|
|
5902
|
+
"title": "¿Hacer un recorrido rápido?",
|
|
5903
|
+
"intro": "Los recorridos guiados te muestran la aplicación directamente en esta pantalla: resaltan los controles reales y te dicen dónde hacer clic.",
|
|
5904
|
+
"start": "Empezar",
|
|
5905
|
+
"restart": "Repetir",
|
|
5906
|
+
"completed": "Completado",
|
|
5907
|
+
"decline": "No, gracias",
|
|
5908
|
+
"later": "Quizás más tarde",
|
|
5909
|
+
"empty": "Todavía no hay recorridos disponibles para tu rol en este tablero."
|
|
5910
|
+
},
|
|
5911
|
+
"overlay": {
|
|
5912
|
+
"next": "Siguiente",
|
|
5913
|
+
"back": "Atrás",
|
|
5914
|
+
"skip": "Terminar recorrido",
|
|
5915
|
+
"done": "Finalizar",
|
|
5916
|
+
"progress": "Paso {current} de {total}",
|
|
5917
|
+
"ariaLabel": "Paso del tutorial",
|
|
5918
|
+
"abridged": "Se omitió 1 paso: ese control no forma parte de este tablero. | Se omitieron {count} pasos: esos controles no forman parte de este tablero.",
|
|
5919
|
+
"searching": "Buscando el control resaltado...",
|
|
5920
|
+
"clickHint": "Haz clic en el control resaltado para continuar"
|
|
5921
|
+
},
|
|
5922
|
+
"tours": {
|
|
5923
|
+
"boardBasics": {
|
|
5924
|
+
"title": "Conceptos básicos del tablero",
|
|
5925
|
+
"description": "Orientación básica: el tablero, la barra lateral y la paleta de comandos.",
|
|
5926
|
+
"steps": {
|
|
5927
|
+
"welcome": {
|
|
5928
|
+
"title": "Te damos la bienvenida",
|
|
5929
|
+
"body": "Este es tu tablero de entrega: aquí planificas el trabajo, los agentes lo ejecutan y tú revisas los resultados. Este breve recorrido muestra los controles principales."
|
|
5930
|
+
},
|
|
5931
|
+
"canvas": {
|
|
5932
|
+
"title": "El tablero",
|
|
5933
|
+
"body": "Los servicios, módulos y tareas viven en este lienzo. Arrastra para desplazarte, usa la rueda para hacer zoom y haz clic en cualquier tarjeta para inspeccionarla."
|
|
5934
|
+
},
|
|
5935
|
+
"sidebar": {
|
|
5936
|
+
"title": "La barra lateral",
|
|
5937
|
+
"body": "Aquí está todo lo demás: crear canalizaciones, conectar repositorios e integraciones y los ajustes del espacio de trabajo."
|
|
5938
|
+
},
|
|
5939
|
+
"commandBar": {
|
|
5940
|
+
"title": "La paleta de comandos",
|
|
5941
|
+
"body": "La forma más rápida de llegar a cualquier acción: ábrela y empieza a escribir. Desde ahí puedes reiniciar este tutorial en cualquier momento."
|
|
5942
|
+
},
|
|
5943
|
+
"toolbar": {
|
|
5944
|
+
"title": "Controles del tablero",
|
|
5945
|
+
"body": "Con estos controles acercas, alejas o ajustas todo el tablero a la vista."
|
|
5946
|
+
},
|
|
5947
|
+
"finish": {
|
|
5948
|
+
"title": "Eso es todo",
|
|
5949
|
+
"body": "Ya sabes orientarte. Prueba el siguiente recorrido para crear y ejecutar tu primera tarea, o vuelve más tarde desde la paleta de comandos."
|
|
5950
|
+
}
|
|
5951
|
+
}
|
|
5952
|
+
},
|
|
5953
|
+
"firstTask": {
|
|
5954
|
+
"title": "Crea tu primera tarea",
|
|
5955
|
+
"description": "Añade una tarea a un servicio y mírala aparecer en el tablero.",
|
|
5956
|
+
"steps": {
|
|
5957
|
+
"intro": {
|
|
5958
|
+
"title": "Vamos a crear una tarea",
|
|
5959
|
+
"body": "Una tarea describe un resultado que quieres; una canalización de agentes lo entrega. Este recorrido te guía para crear una de verdad."
|
|
5960
|
+
},
|
|
5961
|
+
"addTask": {
|
|
5962
|
+
"title": "Añadir una tarea",
|
|
5963
|
+
"body": "Cada marco de servicio tiene un botón de añadir en su cabecera."
|
|
5964
|
+
},
|
|
5965
|
+
"describe": {
|
|
5966
|
+
"title": "Describe el resultado",
|
|
5967
|
+
"body": "Da a la tarea un título corto que diga qué debe cumplirse cuando esté terminada. El lenguaje normal es suficiente."
|
|
5968
|
+
},
|
|
5969
|
+
"create": {
|
|
5970
|
+
"title": "Créala",
|
|
5971
|
+
"body": "Cuando la descripción te convenza, crea la tarea."
|
|
5972
|
+
},
|
|
5973
|
+
"card": {
|
|
5974
|
+
"title": "Tarjetas de tarea",
|
|
5975
|
+
"body": "Esta es una tarjeta de tarea. Desde ella puedes iniciar la canalización, seguir el progreso y abrir los resultados."
|
|
5976
|
+
},
|
|
5977
|
+
"finish": {
|
|
5978
|
+
"title": "Buen trabajo",
|
|
5979
|
+
"body": "Ese es el ciclo principal: describir una tarea, ejecutarla y revisar el resultado. Explora los demás recorridos cuando quieras."
|
|
5980
|
+
}
|
|
5981
|
+
}
|
|
5982
|
+
}
|
|
5983
|
+
}
|
|
5896
5984
|
}
|
|
5897
5985
|
}
|
package/i18n/locales/fr.json
CHANGED
|
@@ -29,6 +29,7 @@
|
|
|
29
29
|
"advanced": "Avancée",
|
|
30
30
|
"basicHint": "Uniquement les outils du quotidien. Passez en mode avancé pour tout afficher.",
|
|
31
31
|
"advancedHint": "Toutes les sections et toutes les options d’exécution.",
|
|
32
|
+
"switchTo": "Passer en {mode}",
|
|
32
33
|
"pinned": "Défini par ce déploiement"
|
|
33
34
|
},
|
|
34
35
|
"common": {
|
|
@@ -2071,7 +2072,8 @@
|
|
|
2071
2072
|
"sandbox": "Ouvrir le bac à sable",
|
|
2072
2073
|
"shortcuts": "Raccourcis clavier",
|
|
2073
2074
|
"bugHunt": "Chasse aux bugs",
|
|
2074
|
-
"toggleUiMode": "Changer le mode d'interface"
|
|
2075
|
+
"toggleUiMode": "Changer le mode d'interface",
|
|
2076
|
+
"tutorial": "Faire une visite guidée"
|
|
2075
2077
|
},
|
|
2076
2078
|
"keywords": {
|
|
2077
2079
|
"newPipeline": "pipeline agents chaîne",
|
|
@@ -2093,7 +2095,8 @@
|
|
|
2093
2095
|
"sandbox": "bac à sable prompt modèle test expérience juge fixture benchmark évaluer",
|
|
2094
2096
|
"shortcuts": "raccourcis clavier touches aide",
|
|
2095
2097
|
"bugHunt": "bug chasse tri backlog tickets non assignés",
|
|
2096
|
-
"toggleUiMode": "interface mode simple avancé afficher masquer"
|
|
2098
|
+
"toggleUiMode": "interface mode simple avancé afficher masquer",
|
|
2099
|
+
"tutorial": "tutoriel visite guide aide apprendre découverte"
|
|
2097
2100
|
}
|
|
2098
2101
|
},
|
|
2099
2102
|
"integrationsHub": {
|
|
@@ -5893,5 +5896,90 @@
|
|
|
5893
5896
|
"titleAny": "Connecter cat-factory à vos dépôts",
|
|
5894
5897
|
"intro": "cat-factory fonctionne en ouvrant des pull requests sur vos dépôts. Connectez votre hébergeur de dépôts pour continuer."
|
|
5895
5898
|
}
|
|
5899
|
+
},
|
|
5900
|
+
"tutorial": {
|
|
5901
|
+
"prompt": {
|
|
5902
|
+
"title": "Faire une visite rapide ?",
|
|
5903
|
+
"intro": "Les visites guidées vous montrent l'application directement à l'écran : elles mettent en évidence les vrais contrôles et vous indiquent où cliquer.",
|
|
5904
|
+
"start": "Commencer",
|
|
5905
|
+
"restart": "Refaire",
|
|
5906
|
+
"completed": "Terminée",
|
|
5907
|
+
"decline": "Non merci",
|
|
5908
|
+
"later": "Peut-être plus tard",
|
|
5909
|
+
"empty": "Aucune visite n'est encore disponible pour votre rôle sur ce tableau."
|
|
5910
|
+
},
|
|
5911
|
+
"overlay": {
|
|
5912
|
+
"next": "Suivant",
|
|
5913
|
+
"back": "Retour",
|
|
5914
|
+
"skip": "Terminer la visite",
|
|
5915
|
+
"done": "Terminer",
|
|
5916
|
+
"progress": "Étape {current} sur {total}",
|
|
5917
|
+
"ariaLabel": "Étape du tutoriel",
|
|
5918
|
+
"abridged": "1 étape a été ignorée : ce contrôle ne fait pas partie de ce tableau. | {count} étapes ont été ignorées : ces contrôles ne font pas partie de ce tableau.",
|
|
5919
|
+
"searching": "Recherche du contrôle mis en évidence...",
|
|
5920
|
+
"clickHint": "Cliquez sur le contrôle mis en évidence pour continuer"
|
|
5921
|
+
},
|
|
5922
|
+
"tours": {
|
|
5923
|
+
"boardBasics": {
|
|
5924
|
+
"title": "Les bases du tableau",
|
|
5925
|
+
"description": "Repérez-vous : le tableau, la barre latérale et la palette de commandes.",
|
|
5926
|
+
"steps": {
|
|
5927
|
+
"welcome": {
|
|
5928
|
+
"title": "Bienvenue !",
|
|
5929
|
+
"body": "Voici votre tableau de livraison : vous y planifiez le travail, les agents l'exécutent et vous vérifiez les résultats. Cette courte visite présente les principaux contrôles."
|
|
5930
|
+
},
|
|
5931
|
+
"canvas": {
|
|
5932
|
+
"title": "Le tableau",
|
|
5933
|
+
"body": "Les services, modules et tâches vivent sur ce canevas. Faites glisser pour vous déplacer, faites défiler pour zoomer et cliquez sur une carte pour l'inspecter."
|
|
5934
|
+
},
|
|
5935
|
+
"sidebar": {
|
|
5936
|
+
"title": "La barre latérale",
|
|
5937
|
+
"body": "Tout le reste se trouve ici : créer des pipelines, connecter des dépôts et des intégrations, et les paramètres de l'espace de travail."
|
|
5938
|
+
},
|
|
5939
|
+
"commandBar": {
|
|
5940
|
+
"title": "La palette de commandes",
|
|
5941
|
+
"body": "Le moyen le plus rapide d'atteindre n'importe quelle action : ouvrez-la et commencez à taper. Vous pouvez y relancer ce tutoriel à tout moment."
|
|
5942
|
+
},
|
|
5943
|
+
"toolbar": {
|
|
5944
|
+
"title": "Contrôles du tableau",
|
|
5945
|
+
"body": "Ces contrôles permettent de zoomer ou d'ajuster tout le tableau à la vue."
|
|
5946
|
+
},
|
|
5947
|
+
"finish": {
|
|
5948
|
+
"title": "Voilà pour la disposition",
|
|
5949
|
+
"body": "Vous savez maintenant vous repérer. Essayez la visite suivante pour créer et lancer votre première tâche, ou revenez plus tard via la palette de commandes."
|
|
5950
|
+
}
|
|
5951
|
+
}
|
|
5952
|
+
},
|
|
5953
|
+
"firstTask": {
|
|
5954
|
+
"title": "Créez votre première tâche",
|
|
5955
|
+
"description": "Ajoutez une tâche à un service et regardez-la apparaître sur le tableau.",
|
|
5956
|
+
"steps": {
|
|
5957
|
+
"intro": {
|
|
5958
|
+
"title": "Créons une tâche",
|
|
5959
|
+
"body": "Une tâche décrit un résultat souhaité ; un pipeline d'agents le livre. Cette visite vous guide pour en créer une pour de vrai."
|
|
5960
|
+
},
|
|
5961
|
+
"addTask": {
|
|
5962
|
+
"title": "Ajouter une tâche",
|
|
5963
|
+
"body": "Chaque cadre de service a un bouton d'ajout dans son en-tête."
|
|
5964
|
+
},
|
|
5965
|
+
"describe": {
|
|
5966
|
+
"title": "Décrivez le résultat",
|
|
5967
|
+
"body": "Donnez à la tâche un titre court qui dit ce qui doit être vrai une fois terminée. Un langage simple suffit."
|
|
5968
|
+
},
|
|
5969
|
+
"create": {
|
|
5970
|
+
"title": "Créez-la",
|
|
5971
|
+
"body": "Quand la description vous convient, créez la tâche."
|
|
5972
|
+
},
|
|
5973
|
+
"card": {
|
|
5974
|
+
"title": "Cartes de tâche",
|
|
5975
|
+
"body": "Voici une carte de tâche. Depuis une carte, vous pouvez lancer le pipeline, suivre la progression et ouvrir les résultats."
|
|
5976
|
+
},
|
|
5977
|
+
"finish": {
|
|
5978
|
+
"title": "Bien joué",
|
|
5979
|
+
"body": "C'est la boucle principale : décrire une tâche, la lancer, vérifier le résultat. Explorez les autres visites quand vous voulez."
|
|
5980
|
+
}
|
|
5981
|
+
}
|
|
5982
|
+
}
|
|
5983
|
+
}
|
|
5896
5984
|
}
|
|
5897
5985
|
}
|