@cat-factory/app 0.196.1 → 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.
Files changed (41) hide show
  1. package/README.md +39 -0
  2. package/app/components/tutorial/TutorialOverlay.logic.spec.ts +126 -0
  3. package/app/components/tutorial/TutorialOverlay.logic.ts +92 -0
  4. package/app/components/tutorial/TutorialOverlay.vue +273 -0
  5. package/app/components/tutorial/TutorialPrompt.vue +102 -0
  6. package/app/composables/pipelineErrorToast/bespokeConflicts.ts +181 -0
  7. package/app/composables/useNavContributions.ts +1 -0
  8. package/app/composables/usePipelineErrorToast.ts +6 -164
  9. package/app/composables/useTutorialTours.ts +18 -0
  10. package/app/modular/nav-contributions.spec.ts +4 -0
  11. package/app/modular/nav-contributions.ts +35 -0
  12. package/app/modular/nav-gates.ts +7 -0
  13. package/app/modular/registry.spec.ts +1 -0
  14. package/app/modular/registry.ts +3 -1
  15. package/app/modular/slots.ts +7 -0
  16. package/app/modular/tutorial-tours.spec.ts +107 -0
  17. package/app/modular/tutorial-tours.ts +147 -0
  18. package/app/pages/index.vue +61 -0
  19. package/app/stores/board/dependencies.ts +52 -0
  20. package/app/stores/board/placement.ts +4 -37
  21. package/app/stores/execution/pendingGates.ts +109 -0
  22. package/app/stores/execution.ts +7 -94
  23. package/app/stores/requirements/recommendations.ts +77 -0
  24. package/app/stores/requirements.ts +17 -43
  25. package/app/stores/tutorial.spec.ts +135 -0
  26. package/app/stores/tutorial.ts +145 -0
  27. package/app/stores/workspace/commands.ts +77 -0
  28. package/app/stores/workspace.ts +11 -50
  29. package/app/utils/tutorial.spec.ts +68 -0
  30. package/app/utils/tutorial.ts +192 -0
  31. package/i18n/locales/de.json +89 -2
  32. package/i18n/locales/en.json +92 -2
  33. package/i18n/locales/es.json +89 -2
  34. package/i18n/locales/fr.json +89 -2
  35. package/i18n/locales/he.json +89 -2
  36. package/i18n/locales/it.json +89 -2
  37. package/i18n/locales/ja.json +89 -2
  38. package/i18n/locales/pl.json +89 -2
  39. package/i18n/locales/tr.json +89 -2
  40. package/i18n/locales/uk.json +89 -2
  41. 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
+ }
@@ -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": {
@@ -5906,5 +5908,90 @@
5906
5908
  "titleAny": "cat-factory mit Ihren Repositorys verbinden",
5907
5909
  "intro": "cat-factory funktioniert, indem es Pull Requests in Ihren Repositorys öffnet. Verbinden Sie Ihren Repository-Anbieter, um fortzufahren."
5908
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
+ }
5909
5996
  }
5910
5997
  }
@@ -2154,7 +2154,8 @@
2154
2154
  "sandbox": "Open Sandbox",
2155
2155
  "shortcuts": "Keyboard shortcuts",
2156
2156
  "bugHunt": "Bug hunt",
2157
- "toggleUiMode": "Switch interface mode"
2157
+ "toggleUiMode": "Switch interface mode",
2158
+ "tutorial": "Take a tour"
2158
2159
  },
2159
2160
  "keywords": {
2160
2161
  "newPipeline": "pipeline agents chain",
@@ -2176,7 +2177,8 @@
2176
2177
  "sandbox": "sandbox prompt model test experiment judge fixture benchmark evaluate",
2177
2178
  "shortcuts": "keyboard shortcuts keys hotkeys cheatsheet help",
2178
2179
  "bugHunt": "bug hunt triage backlog issue tracker unassigned",
2179
- "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"
2180
2182
  }
2181
2183
  },
2182
2184
  "shortcuts": {
@@ -6110,5 +6112,93 @@
6110
6112
  "titleAny": "Connect cat-factory to your repositories",
6111
6113
  "intro": "cat-factory works by opening pull requests on your repositories. Connect your repository host to continue."
6112
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
+ }
6113
6203
  }
6114
6204
  }
@@ -2072,7 +2072,8 @@
2072
2072
  "sandbox": "Abrir el entorno de pruebas",
2073
2073
  "shortcuts": "Atajos de teclado",
2074
2074
  "bugHunt": "Caza de errores",
2075
- "toggleUiMode": "Cambiar el modo de interfaz"
2075
+ "toggleUiMode": "Cambiar el modo de interfaz",
2076
+ "tutorial": "Hacer un recorrido"
2076
2077
  },
2077
2078
  "keywords": {
2078
2079
  "newPipeline": "canalización agentes cadena pipeline",
@@ -2094,7 +2095,8 @@
2094
2095
  "sandbox": "entorno de pruebas prompt modelo prueba experimento juez fixture benchmark evaluar",
2095
2096
  "shortcuts": "atajos teclado teclas ayuda",
2096
2097
  "bugHunt": "error bug caza triaje backlog incidencias sin asignar",
2097
- "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"
2098
2100
  }
2099
2101
  },
2100
2102
  "integrationsHub": {
@@ -5894,5 +5896,90 @@
5894
5896
  "titleAny": "Conecta cat-factory con tus repositorios",
5895
5897
  "intro": "cat-factory funciona abriendo solicitudes de incorporación de cambios en tus repositorios. Conecta tu proveedor de repositorios para continuar."
5896
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
+ }
5897
5984
  }
5898
5985
  }
@@ -2072,7 +2072,8 @@
2072
2072
  "sandbox": "Ouvrir le bac à sable",
2073
2073
  "shortcuts": "Raccourcis clavier",
2074
2074
  "bugHunt": "Chasse aux bugs",
2075
- "toggleUiMode": "Changer le mode d'interface"
2075
+ "toggleUiMode": "Changer le mode d'interface",
2076
+ "tutorial": "Faire une visite guidée"
2076
2077
  },
2077
2078
  "keywords": {
2078
2079
  "newPipeline": "pipeline agents chaîne",
@@ -2094,7 +2095,8 @@
2094
2095
  "sandbox": "bac à sable prompt modèle test expérience juge fixture benchmark évaluer",
2095
2096
  "shortcuts": "raccourcis clavier touches aide",
2096
2097
  "bugHunt": "bug chasse tri backlog tickets non assignés",
2097
- "toggleUiMode": "interface mode simple avancé afficher masquer"
2098
+ "toggleUiMode": "interface mode simple avancé afficher masquer",
2099
+ "tutorial": "tutoriel visite guide aide apprendre découverte"
2098
2100
  }
2099
2101
  },
2100
2102
  "integrationsHub": {
@@ -5894,5 +5896,90 @@
5894
5896
  "titleAny": "Connecter cat-factory à vos dépôts",
5895
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."
5896
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
+ }
5897
5984
  }
5898
5985
  }