@cat-factory/app 0.312.0 → 0.314.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 +12 -0
- package/app/components/board/AddTaskModal.vue +29 -30
- package/app/components/board/ReviewFrictionDialog.vue +8 -5
- package/app/components/layout/AiProvidersBanner.vue +3 -2
- package/app/components/layout/GitHubPatBanner.vue +2 -2
- package/app/components/layout/GitHubPatPermissionsBanner.vue +4 -12
- package/app/components/layout/InfraSetupBanner.vue +6 -7
- package/app/components/pipeline/PipelinePicker.vue +8 -2
- package/app/components/queue/DescribeWorkModal.vue +367 -0
- package/app/components/queue/QueueView.vue +18 -0
- package/app/components/setup/SetupChecklistPanel.vue +340 -0
- package/app/composables/useNavContributions.ts +2 -0
- package/app/composables/useSetupChecklist.ts +122 -0
- package/app/composables/useSetupRemedies.ts +72 -0
- package/app/composables/useTaskActions.ts +51 -28
- package/app/modular/nav-contributions.spec.ts +3 -0
- package/app/modular/nav-contributions.ts +46 -0
- package/app/pages/index.vue +6 -0
- package/app/stores/github/context.ts +1 -0
- package/app/stores/github/probe.ts +7 -3
- package/app/stores/github.ts +9 -0
- package/app/stores/ui/modals.ts +42 -0
- package/app/utils/describeWork.spec.ts +76 -0
- package/app/utils/describeWork.ts +71 -0
- package/app/utils/reviewFriction.ts +47 -0
- package/app/utils/setupChecklist.spec.ts +184 -0
- package/app/utils/setupChecklist.ts +229 -0
- package/i18n/locales/de.json +97 -3
- package/i18n/locales/en.json +97 -3
- package/i18n/locales/es.json +97 -3
- package/i18n/locales/fr.json +97 -3
- package/i18n/locales/he.json +97 -3
- package/i18n/locales/it.json +97 -3
- package/i18n/locales/ja.json +97 -3
- package/i18n/locales/pl.json +97 -3
- package/i18n/locales/tr.json +97 -3
- package/i18n/locales/uk.json +97 -3
- package/package.json +1 -1
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import type { InfraSetup, InfraSetupOwners, InfraSetupStatus } from '@cat-factory/contracts'
|
|
2
|
+
import { isInfraSetupHealthStatus } from '@cat-factory/contracts'
|
|
3
|
+
import type { ProviderConnectionKind } from '~/types/providerConnections'
|
|
4
|
+
import {
|
|
5
|
+
canActOnSetup,
|
|
6
|
+
effectiveOwner,
|
|
7
|
+
type SetupActor,
|
|
8
|
+
type SetupRemedy,
|
|
9
|
+
} from '~/utils/setupAudience'
|
|
10
|
+
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
// The setup checklist: what this workspace needs before a task can run and merge, as ONE list.
|
|
13
|
+
//
|
|
14
|
+
// Every row is composed from a probe that already exists and already drives a banner or a
|
|
15
|
+
// startup dialog (`useAiReadiness`, the GitHub probe, `workspace.infraSetup`, the provider
|
|
16
|
+
// connections' missing-required fields). The checklist adds no probe of its own: it states the
|
|
17
|
+
// same facts in one place, with a finish line, instead of one interruption per missing piece.
|
|
18
|
+
// Who may act on a row is the banners' rule too (`utils/setupAudience.ts`).
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
|
|
21
|
+
/** The rows. The infrastructure rows are named by their `InfraSetupArea`, the server's vocabulary. */
|
|
22
|
+
export const SETUP_ROWS = [
|
|
23
|
+
'model',
|
|
24
|
+
'sourceControl',
|
|
25
|
+
'agentExecutor',
|
|
26
|
+
'ephemeralEnvironments',
|
|
27
|
+
'binaryStorage',
|
|
28
|
+
] as const
|
|
29
|
+
export type SetupRowId = (typeof SETUP_ROWS)[number]
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* A row's state. Five, because they need five different reactions:
|
|
33
|
+
*
|
|
34
|
+
* - `done`: nothing to do.
|
|
35
|
+
* - `missing`: never set up. The fix is to connect something.
|
|
36
|
+
* - `attention`: set up, but broken, unreachable or incomplete. The fix is to repair it, and
|
|
37
|
+
* saying "connect" would send the reader to create a second one. Its {@link SetupRowCause} says
|
|
38
|
+
* which, because each needs a different fix.
|
|
39
|
+
* - `checking`: the probe has not answered. Never rendered as missing: an unanswered probe and
|
|
40
|
+
* an absent capability are opposite facts.
|
|
41
|
+
* - `not_needed`: this deployment does not use the area at all. Left out of the count.
|
|
42
|
+
*/
|
|
43
|
+
export type SetupRowStatus = 'done' | 'missing' | 'attention' | 'checking' | 'not_needed'
|
|
44
|
+
|
|
45
|
+
/** Why a row needs attention. Each one names a different fix. */
|
|
46
|
+
export type SetupRowCause =
|
|
47
|
+
/** Configured, and its live probe says it cannot be reached. */
|
|
48
|
+
| 'unreachable'
|
|
49
|
+
/** Connected, but a mandatory provider field is unset. */
|
|
50
|
+
| 'incomplete'
|
|
51
|
+
/** GitHub refused the access token outright. */
|
|
52
|
+
| 'rejected'
|
|
53
|
+
/** The token authenticates but cannot push or open pull requests. */
|
|
54
|
+
| 'underscoped'
|
|
55
|
+
/** Usable models exist, but the default preset names one that is not. */
|
|
56
|
+
| 'presetBroken'
|
|
57
|
+
/** The probe itself failed, so the answer is unknown. The fix is to ask again. */
|
|
58
|
+
| 'probeFailed'
|
|
59
|
+
/** The workspace loaded, and this backend does not report the area at all. */
|
|
60
|
+
| 'notReported'
|
|
61
|
+
|
|
62
|
+
/** Whether a task can run without the row. An optional row only switches off the agents that use it. */
|
|
63
|
+
export const SETUP_ROW_REQUIRED: Record<SetupRowId, boolean> = {
|
|
64
|
+
model: true,
|
|
65
|
+
sourceControl: true,
|
|
66
|
+
agentExecutor: true,
|
|
67
|
+
ephemeralEnvironments: false,
|
|
68
|
+
binaryStorage: false,
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** Everything the checklist reads, resolved by the caller so this stays pure. */
|
|
72
|
+
export interface SetupProbeInput {
|
|
73
|
+
readonly model: {
|
|
74
|
+
/** The per-workspace model catalog has loaded for this workspace. */
|
|
75
|
+
readonly loaded: boolean
|
|
76
|
+
/** The last attempt to load it failed. */
|
|
77
|
+
readonly loadFailed: boolean
|
|
78
|
+
readonly usable: boolean
|
|
79
|
+
/** Usable models exist, but the default preset names one that is not. */
|
|
80
|
+
readonly presetBroken: boolean
|
|
81
|
+
}
|
|
82
|
+
readonly sourceControl: {
|
|
83
|
+
/** Null while the GitHub probe is in flight. */
|
|
84
|
+
readonly available: boolean | null
|
|
85
|
+
/** Why `available` is false: switched off by the deployment, or the probe failed. */
|
|
86
|
+
readonly unavailableCause: 'disabled' | 'failed' | null
|
|
87
|
+
readonly connected: boolean
|
|
88
|
+
/** Local mode with no personal access token set. */
|
|
89
|
+
readonly patMissing: boolean
|
|
90
|
+
/** The token check's verdict, when it needs attention. */
|
|
91
|
+
readonly patProblem: 'rejected' | 'underscoped' | null
|
|
92
|
+
}
|
|
93
|
+
/** Null until the workspace snapshot has delivered it, or from a backend that omits it. */
|
|
94
|
+
readonly infra: InfraSetup | null
|
|
95
|
+
/** The workspace snapshot has loaded, so a null `infra` is an answer, not a wait. */
|
|
96
|
+
readonly workspaceLoaded: boolean
|
|
97
|
+
/** Who can close each infrastructure gap; null from a backend that does not report it. */
|
|
98
|
+
readonly infraOwners: InfraSetupOwners | null
|
|
99
|
+
readonly providers: {
|
|
100
|
+
/** The provider connections have loaded, so `needingConfig` is an answer. */
|
|
101
|
+
readonly loaded: boolean
|
|
102
|
+
/** Provider connections that are wired but miss a mandatory field. */
|
|
103
|
+
readonly needingConfig: readonly ProviderConnectionKind[]
|
|
104
|
+
}
|
|
105
|
+
readonly actor: SetupActor
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/** A row's state and, exactly when it needs attention, why. */
|
|
109
|
+
export type SetupRowState =
|
|
110
|
+
| { readonly status: Exclude<SetupRowStatus, 'attention'>; readonly cause: null }
|
|
111
|
+
| { readonly status: 'attention'; readonly cause: SetupRowCause }
|
|
112
|
+
|
|
113
|
+
export type SetupRow = SetupRowState & {
|
|
114
|
+
readonly id: SetupRowId
|
|
115
|
+
readonly required: boolean
|
|
116
|
+
/** Null when this caller can act on the row; otherwise how the gap gets fixed. */
|
|
117
|
+
readonly remedy: SetupRemedy | null
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export interface SetupChecklist {
|
|
121
|
+
readonly rows: SetupRow[]
|
|
122
|
+
/** Rows that count toward the finish line (everything except `not_needed`). */
|
|
123
|
+
readonly total: number
|
|
124
|
+
readonly done: number
|
|
125
|
+
/** A counted row has not answered yet, so `done` is not a count of the finished rows yet. */
|
|
126
|
+
readonly checking: boolean
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
type RowState = SetupRowState
|
|
130
|
+
const state = (status: Exclude<SetupRowStatus, 'attention'>): RowState => ({ status, cause: null })
|
|
131
|
+
const attention = (cause: SetupRowCause): RowState => ({ status: 'attention', cause })
|
|
132
|
+
|
|
133
|
+
function infraRow(
|
|
134
|
+
status: InfraSetupStatus | undefined,
|
|
135
|
+
workspaceLoaded: boolean,
|
|
136
|
+
provider: { loaded: boolean; incomplete: boolean } | null,
|
|
137
|
+
): RowState {
|
|
138
|
+
if (status === undefined) return workspaceLoaded ? attention('notReported') : state('checking')
|
|
139
|
+
if (status === 'not_applicable') return state('not_needed')
|
|
140
|
+
if (status === 'not_defined') return state('missing')
|
|
141
|
+
if (isInfraSetupHealthStatus(status)) return attention('unreachable')
|
|
142
|
+
// Configured. Whether a mandatory field is unset is known only once the providers load; until
|
|
143
|
+
// then the row has not answered, rather than claiming done.
|
|
144
|
+
if (provider && !provider.loaded) return state('checking')
|
|
145
|
+
return provider?.incomplete ? attention('incomplete') : state('done')
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
function modelRow(m: SetupProbeInput['model']): RowState {
|
|
149
|
+
if (!m.loaded) return m.loadFailed ? attention('probeFailed') : state('checking')
|
|
150
|
+
if (!m.usable) return state('missing')
|
|
151
|
+
return m.presetBroken ? attention('presetBroken') : state('done')
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function sourceControlRow(s: SetupProbeInput['sourceControl']): RowState {
|
|
155
|
+
if (s.patMissing) return state('missing')
|
|
156
|
+
if (s.patProblem) return attention(s.patProblem)
|
|
157
|
+
if (s.connected) return state('done')
|
|
158
|
+
if (s.available === null) return state('checking')
|
|
159
|
+
if (s.available === false) {
|
|
160
|
+
if (s.unavailableCause === 'disabled') return state('not_needed')
|
|
161
|
+
if (s.unavailableCause === 'failed') return attention('probeFailed')
|
|
162
|
+
}
|
|
163
|
+
return state('missing')
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Who closes a row's gap. Infrastructure follows its reported owner. A personal access token is
|
|
168
|
+
* fixed by whoever holds it: the remedy is a token page, not a workspace setting, so every caller
|
|
169
|
+
* gets the link. A model or a GitHub connection is a workspace setting.
|
|
170
|
+
*/
|
|
171
|
+
function rowOwner(id: SetupRowId, input: SetupProbeInput): unknown {
|
|
172
|
+
switch (id) {
|
|
173
|
+
case 'agentExecutor':
|
|
174
|
+
return input.infraOwners?.agentExecutor
|
|
175
|
+
case 'ephemeralEnvironments':
|
|
176
|
+
return input.infraOwners?.ephemeralEnvironments
|
|
177
|
+
case 'binaryStorage':
|
|
178
|
+
return input.infraOwners?.binaryStorage
|
|
179
|
+
case 'model':
|
|
180
|
+
return 'workspace_admin'
|
|
181
|
+
case 'sourceControl':
|
|
182
|
+
return input.sourceControl.patMissing || input.sourceControl.patProblem
|
|
183
|
+
? null
|
|
184
|
+
: 'workspace_admin'
|
|
185
|
+
default: {
|
|
186
|
+
const unreachable: never = id
|
|
187
|
+
return unreachable
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
function remedyFor(owner: unknown, actor: SetupActor): SetupRemedy | null {
|
|
193
|
+
if (owner === null) return null
|
|
194
|
+
if (canActOnSetup(owner, actor)) return null
|
|
195
|
+
return canActOnSetup(owner, { ...actor, fullSurface: true })
|
|
196
|
+
? 'full_surface'
|
|
197
|
+
: effectiveOwner(owner)
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
export function deriveSetupChecklist(input: SetupProbeInput): SetupChecklist {
|
|
201
|
+
const { loaded, needingConfig } = input.providers
|
|
202
|
+
const states: Record<SetupRowId, RowState> = {
|
|
203
|
+
model: modelRow(input.model),
|
|
204
|
+
sourceControl: sourceControlRow(input.sourceControl),
|
|
205
|
+
agentExecutor: infraRow(input.infra?.agentExecutor, input.workspaceLoaded, {
|
|
206
|
+
loaded,
|
|
207
|
+
incomplete: needingConfig.includes('runner-pool'),
|
|
208
|
+
}),
|
|
209
|
+
ephemeralEnvironments: infraRow(input.infra?.ephemeralEnvironments, input.workspaceLoaded, {
|
|
210
|
+
loaded,
|
|
211
|
+
incomplete: needingConfig.includes('environment'),
|
|
212
|
+
}),
|
|
213
|
+
// Storage has no provider connection, so nothing about it waits on the providers.
|
|
214
|
+
binaryStorage: infraRow(input.infra?.binaryStorage, input.workspaceLoaded, null),
|
|
215
|
+
}
|
|
216
|
+
const rows = SETUP_ROWS.map((id) => ({
|
|
217
|
+
id,
|
|
218
|
+
...states[id],
|
|
219
|
+
required: SETUP_ROW_REQUIRED[id],
|
|
220
|
+
remedy: remedyFor(rowOwner(id, input), input.actor),
|
|
221
|
+
}))
|
|
222
|
+
const counted = rows.filter((r) => r.status !== 'not_needed')
|
|
223
|
+
return {
|
|
224
|
+
rows,
|
|
225
|
+
total: counted.length,
|
|
226
|
+
done: counted.filter((r) => r.status === 'done').length,
|
|
227
|
+
checking: counted.some((r) => r.status === 'checking'),
|
|
228
|
+
}
|
|
229
|
+
}
|
package/i18n/locales/de.json
CHANGED
|
@@ -2774,6 +2774,7 @@
|
|
|
2774
2774
|
"chooseRole": "Rolle wechseln",
|
|
2775
2775
|
"foundationalServices": "Basisdienste",
|
|
2776
2776
|
"notificationSettings": "Benachrichtigungs-Routing verwalten",
|
|
2777
|
+
"setupChecklist": "Einrichtungs-Checkliste",
|
|
2777
2778
|
"queueView": "Warteschlangen-Ansicht öffnen",
|
|
2778
2779
|
"boardView": "Board-Ansicht öffnen"
|
|
2779
2780
|
},
|
|
@@ -2804,8 +2805,10 @@
|
|
|
2804
2805
|
"tutorial": "tutorial tour einführung hilfe onboarding lernen grundlagen",
|
|
2805
2806
|
"foundationalServices": "gemeinsame Fähigkeit Plattform Dienst API Vertrag OpenAPI Katalog",
|
|
2806
2807
|
"notificationSettings": "benachrichtigungen e-mail routing kanäle posteingang",
|
|
2808
|
+
"setupChecklist": "einrichtung checkliste setup runner modell github speicher umgebung konfigurieren",
|
|
2807
2809
|
"queueView": "warteschlange ansicht wartet auf dich liste",
|
|
2808
|
-
"boardView": "board canvas karte ansicht planen"
|
|
2810
|
+
"boardView": "board canvas karte ansicht planen",
|
|
2811
|
+
"describeWork": "neue arbeit beschreiben aufgabe hinzufügen erstellen feature bug"
|
|
2809
2812
|
}
|
|
2810
2813
|
},
|
|
2811
2814
|
"shortcuts": {
|
|
@@ -6298,7 +6301,8 @@
|
|
|
6298
6301
|
"reports": "Berichte",
|
|
6299
6302
|
"foundationalServices": "Basisdienste",
|
|
6300
6303
|
"tutorials": "Tutorials",
|
|
6301
|
-
"help": "Hilfe"
|
|
6304
|
+
"help": "Hilfe",
|
|
6305
|
+
"setupChecklist": "Einrichtungs-Checkliste"
|
|
6302
6306
|
},
|
|
6303
6307
|
"errors": {
|
|
6304
6308
|
"generic": {
|
|
@@ -8743,6 +8747,73 @@
|
|
|
8743
8747
|
}
|
|
8744
8748
|
}
|
|
8745
8749
|
},
|
|
8750
|
+
"setup": {
|
|
8751
|
+
"title": "Einrichtung",
|
|
8752
|
+
"progress": "{done} von {total} erledigt",
|
|
8753
|
+
"intro": "Was dieser Workspace braucht, damit eine Aufgabe laufen und gemergt werden kann.",
|
|
8754
|
+
"required": "erforderlich",
|
|
8755
|
+
"optional": "optional",
|
|
8756
|
+
"action": {
|
|
8757
|
+
"change": "Ändern",
|
|
8758
|
+
"connect": "Einrichten",
|
|
8759
|
+
"fix": "Beheben",
|
|
8760
|
+
"review": "Prüfen",
|
|
8761
|
+
"retry": "Erneut versuchen"
|
|
8762
|
+
},
|
|
8763
|
+
"rows": {
|
|
8764
|
+
"checking": "Wird geprüft…",
|
|
8765
|
+
"notNeeded": "Diese Bereitstellung nutzt das nicht.",
|
|
8766
|
+
"model": {
|
|
8767
|
+
"title": "Modell",
|
|
8768
|
+
"done": "Ein Modell ist verfügbar.",
|
|
8769
|
+
"missing": "Kein Modell verfügbar. Kein Agent kann laufen, bis du einen Anbieter verbindest."
|
|
8770
|
+
},
|
|
8771
|
+
"sourceControl": {
|
|
8772
|
+
"title": "Quellcodeverwaltung",
|
|
8773
|
+
"done": "Verbunden. Agenten können Branches pushen und Pull Requests öffnen.",
|
|
8774
|
+
"missing": "Nicht verbunden. Agenten können keine Pull Requests öffnen."
|
|
8775
|
+
},
|
|
8776
|
+
"agentExecutor": {
|
|
8777
|
+
"title": "Wo Agenten laufen",
|
|
8778
|
+
"done": "Ein Runner ist konfiguriert.",
|
|
8779
|
+
"missing": "Kein Runner konfiguriert. Nichts kann laufen, bis du einen verbindest.",
|
|
8780
|
+
"notNeeded": "Diese Bereitstellung führt Agenten ohne Runner aus."
|
|
8781
|
+
},
|
|
8782
|
+
"ephemeralEnvironments": {
|
|
8783
|
+
"title": "Testumgebungen",
|
|
8784
|
+
"done": "Konfiguriert. Tester können eine Live-Vorschau nutzen.",
|
|
8785
|
+
"missing": "Nicht eingerichtet. Tester, die eine Live-Vorschau brauchen, laufen nicht. Alle anderen Agenten laufen."
|
|
8786
|
+
},
|
|
8787
|
+
"binaryStorage": {
|
|
8788
|
+
"title": "Screenshot-Speicher",
|
|
8789
|
+
"done": "Konfiguriert. Visuelle Prüfungen sind aktiv.",
|
|
8790
|
+
"missing": "Nicht eingerichtet. Visuelle Prüfungen sind aus."
|
|
8791
|
+
}
|
|
8792
|
+
},
|
|
8793
|
+
"causes": {
|
|
8794
|
+
"unreachable": "Eingerichtet, aber gerade nicht erreichbar.",
|
|
8795
|
+
"incomplete": "Verbunden, aber eine erforderliche Einstellung fehlt.",
|
|
8796
|
+
"rejected": "GitHub hat den Zugriffstoken abgelehnt.",
|
|
8797
|
+
"underscoped": "Der Zugriffstoken kann weder pushen noch Pull Requests öffnen.",
|
|
8798
|
+
"presetBroken": "Das Standard-Modell-Preset nennt ein Modell, das nicht verfügbar ist.",
|
|
8799
|
+
"probeFailed": "Die Prüfung hat nicht geantwortet.",
|
|
8800
|
+
"notReported": "Diese Bereitstellung meldet es nicht."
|
|
8801
|
+
},
|
|
8802
|
+
"also": {
|
|
8803
|
+
"title": "Außerdem hier",
|
|
8804
|
+
"pipelines": "Pipelines",
|
|
8805
|
+
"riskPolicies": "Merge-Richtlinien",
|
|
8806
|
+
"modelPresets": "Modell-Presets",
|
|
8807
|
+
"counts": {
|
|
8808
|
+
"repair": "Zu reparieren: {count}",
|
|
8809
|
+
"outdated": "Veraltet: {count}",
|
|
8810
|
+
"new": "Neu: {count}"
|
|
8811
|
+
},
|
|
8812
|
+
"settings": "Einstellungen und Verbindungen",
|
|
8813
|
+
"workspaceSettings": "Workspace-Einstellungen",
|
|
8814
|
+
"integrations": "Integrationen"
|
|
8815
|
+
}
|
|
8816
|
+
},
|
|
8746
8817
|
"queue": {
|
|
8747
8818
|
"title": "Warteschlange",
|
|
8748
8819
|
"summary": "{needsYou} warten auf dich · {ready} bereit zum Mergen",
|
|
@@ -8786,12 +8857,35 @@
|
|
|
8786
8857
|
"parked": "Der Durchlauf wartet auf einen Menschen. Öffne die Aufgabe, um zu sehen, was fehlt.",
|
|
8787
8858
|
"waitingOn": "Wartet auf {deps}",
|
|
8788
8859
|
"pr": "Pull Request #{number}"
|
|
8789
|
-
}
|
|
8860
|
+
},
|
|
8861
|
+
"describeWork": "Neue Arbeit beschreiben"
|
|
8790
8862
|
},
|
|
8791
8863
|
"views": {
|
|
8792
8864
|
"title": "Ansichten",
|
|
8793
8865
|
"queue": "Warteschlange",
|
|
8794
8866
|
"board": "Board",
|
|
8795
8867
|
"openQueue": "Warteschlangen-Ansicht öffnen"
|
|
8868
|
+
},
|
|
8869
|
+
"describeWork": {
|
|
8870
|
+
"title": "Neue Arbeit beschreiben",
|
|
8871
|
+
"textLabel": "Was zu tun ist",
|
|
8872
|
+
"textHint": "Ein Satz reicht. Füge mehr Details hinzu, wenn du welche hast.",
|
|
8873
|
+
"textPlaceholder": "Füge ein Audit-Log für Anmeldeereignisse hinzu. Erfasse jede Anmeldung mit Zeit, Benutzer und Ergebnis.",
|
|
8874
|
+
"savedAs": "Aufgabentitel: {title}",
|
|
8875
|
+
"serviceLabel": "Service",
|
|
8876
|
+
"servicePlaceholder": "Service auswählen",
|
|
8877
|
+
"kindLabel": "Art",
|
|
8878
|
+
"kind": {
|
|
8879
|
+
"feature": "Feature",
|
|
8880
|
+
"bug": "Bug"
|
|
8881
|
+
},
|
|
8882
|
+
"moreKinds": "Weitere Arten…",
|
|
8883
|
+
"changeHowItRuns": "Ablauf ändern",
|
|
8884
|
+
"workspaceDefault": "Workspace-Standard",
|
|
8885
|
+
"defaultPipelineHint": "Der Workspace-Standard: {name}. Eine hier gewählte Pipeline ersetzt ihn für diese Aufgabe.",
|
|
8886
|
+
"attachContext": "Kontext anhängen (öffnet das vollständige Formular)",
|
|
8887
|
+
"add": "Zur Warteschlange hinzufügen",
|
|
8888
|
+
"addAndStart": "Hinzufügen und starten",
|
|
8889
|
+
"addedToast": "„{title}“ zur Warteschlange hinzugefügt"
|
|
8796
8890
|
}
|
|
8797
8891
|
}
|
package/i18n/locales/en.json
CHANGED
|
@@ -180,7 +180,8 @@
|
|
|
180
180
|
"reports": "Reports",
|
|
181
181
|
"foundationalServices": "Foundational services",
|
|
182
182
|
"tutorials": "Tutorials",
|
|
183
|
-
"help": "Help"
|
|
183
|
+
"help": "Help",
|
|
184
|
+
"setupChecklist": "Setup checklist"
|
|
184
185
|
},
|
|
185
186
|
"board": {
|
|
186
187
|
"toast": {
|
|
@@ -2801,6 +2802,7 @@
|
|
|
2801
2802
|
"chooseRole": "Change your role",
|
|
2802
2803
|
"foundationalServices": "Foundational services",
|
|
2803
2804
|
"notificationSettings": "Manage notification routing",
|
|
2805
|
+
"setupChecklist": "Setup checklist",
|
|
2804
2806
|
"queueView": "Open the queue view",
|
|
2805
2807
|
"boardView": "Open the board view"
|
|
2806
2808
|
},
|
|
@@ -2831,8 +2833,10 @@
|
|
|
2831
2833
|
"tutorial": "tutorial onboarding tour guide help learn basics",
|
|
2832
2834
|
"foundationalServices": "shared capability platform service api contract openapi catalog",
|
|
2833
2835
|
"notificationSettings": "notifications email routing channels inbox",
|
|
2836
|
+
"setupChecklist": "setup checklist runner model github storage environment configure",
|
|
2834
2837
|
"queueView": "queue view needs you inbox list waiting",
|
|
2835
|
-
"boardView": "board canvas map view plan"
|
|
2838
|
+
"boardView": "board canvas map view plan",
|
|
2839
|
+
"describeWork": "describe new work task add create feature bug sentence"
|
|
2836
2840
|
}
|
|
2837
2841
|
},
|
|
2838
2842
|
"shortcuts": {
|
|
@@ -9074,6 +9078,73 @@
|
|
|
9074
9078
|
}
|
|
9075
9079
|
}
|
|
9076
9080
|
},
|
|
9081
|
+
"setup": {
|
|
9082
|
+
"title": "Setup",
|
|
9083
|
+
"progress": "{done} of {total} done",
|
|
9084
|
+
"intro": "What this workspace needs before a task can run and merge.",
|
|
9085
|
+
"required": "required",
|
|
9086
|
+
"optional": "optional",
|
|
9087
|
+
"action": {
|
|
9088
|
+
"change": "Change",
|
|
9089
|
+
"connect": "Set up",
|
|
9090
|
+
"fix": "Fix",
|
|
9091
|
+
"review": "Review",
|
|
9092
|
+
"retry": "Try again"
|
|
9093
|
+
},
|
|
9094
|
+
"rows": {
|
|
9095
|
+
"checking": "Checking…",
|
|
9096
|
+
"notNeeded": "This deployment does not use it.",
|
|
9097
|
+
"model": {
|
|
9098
|
+
"title": "Model",
|
|
9099
|
+
"done": "A model is available.",
|
|
9100
|
+
"missing": "No model is available. No agent can run until you connect a provider."
|
|
9101
|
+
},
|
|
9102
|
+
"sourceControl": {
|
|
9103
|
+
"title": "Source control",
|
|
9104
|
+
"done": "Connected. Agents can push branches and open pull requests.",
|
|
9105
|
+
"missing": "Not connected. Agents cannot open pull requests."
|
|
9106
|
+
},
|
|
9107
|
+
"agentExecutor": {
|
|
9108
|
+
"title": "Where agents run",
|
|
9109
|
+
"done": "A runner is configured.",
|
|
9110
|
+
"missing": "No runner is configured. Nothing can run until you connect one.",
|
|
9111
|
+
"notNeeded": "This deployment runs agents without a runner."
|
|
9112
|
+
},
|
|
9113
|
+
"ephemeralEnvironments": {
|
|
9114
|
+
"title": "Test environments",
|
|
9115
|
+
"done": "Configured. Testers can use a live preview.",
|
|
9116
|
+
"missing": "Not set up. Testers that need a live preview do not run. All other agents run."
|
|
9117
|
+
},
|
|
9118
|
+
"binaryStorage": {
|
|
9119
|
+
"title": "Screenshot storage",
|
|
9120
|
+
"done": "Configured. Visual checks are on.",
|
|
9121
|
+
"missing": "Not set up. Visual checks are off."
|
|
9122
|
+
}
|
|
9123
|
+
},
|
|
9124
|
+
"causes": {
|
|
9125
|
+
"unreachable": "Configured, but unreachable right now.",
|
|
9126
|
+
"incomplete": "Connected, but a required setting is missing.",
|
|
9127
|
+
"rejected": "GitHub rejected the access token.",
|
|
9128
|
+
"underscoped": "The access token cannot push or open pull requests.",
|
|
9129
|
+
"presetBroken": "The default model preset names a model that is not available.",
|
|
9130
|
+
"probeFailed": "The check did not answer.",
|
|
9131
|
+
"notReported": "This deployment does not report it."
|
|
9132
|
+
},
|
|
9133
|
+
"also": {
|
|
9134
|
+
"title": "Also here",
|
|
9135
|
+
"pipelines": "Pipelines",
|
|
9136
|
+
"riskPolicies": "Merge policies",
|
|
9137
|
+
"modelPresets": "Model presets",
|
|
9138
|
+
"counts": {
|
|
9139
|
+
"repair": "To repair: {count}",
|
|
9140
|
+
"outdated": "Outdated: {count}",
|
|
9141
|
+
"new": "New: {count}"
|
|
9142
|
+
},
|
|
9143
|
+
"settings": "Settings and connections",
|
|
9144
|
+
"workspaceSettings": "Workspace settings",
|
|
9145
|
+
"integrations": "Integrations"
|
|
9146
|
+
}
|
|
9147
|
+
},
|
|
9077
9148
|
"queue": {
|
|
9078
9149
|
"title": "Queue",
|
|
9079
9150
|
"summary": "{needsYou} need you · {ready} ready to merge",
|
|
@@ -9117,12 +9188,35 @@
|
|
|
9117
9188
|
"parked": "The run waits for a person. Open the task to see what it needs.",
|
|
9118
9189
|
"waitingOn": "Waits for {deps}",
|
|
9119
9190
|
"pr": "Pull request #{number}"
|
|
9120
|
-
}
|
|
9191
|
+
},
|
|
9192
|
+
"describeWork": "Describe new work"
|
|
9121
9193
|
},
|
|
9122
9194
|
"views": {
|
|
9123
9195
|
"title": "Views",
|
|
9124
9196
|
"queue": "Queue",
|
|
9125
9197
|
"board": "Board",
|
|
9126
9198
|
"openQueue": "Open the queue view"
|
|
9199
|
+
},
|
|
9200
|
+
"describeWork": {
|
|
9201
|
+
"title": "Describe new work",
|
|
9202
|
+
"textLabel": "What must be done",
|
|
9203
|
+
"textHint": "One sentence is enough. Add more detail if you have it.",
|
|
9204
|
+
"textPlaceholder": "Add an audit log for sign-in events. Record each sign-in with the time, the user and the result.",
|
|
9205
|
+
"savedAs": "Task title: {title}",
|
|
9206
|
+
"serviceLabel": "Service",
|
|
9207
|
+
"servicePlaceholder": "Select a service",
|
|
9208
|
+
"kindLabel": "Kind",
|
|
9209
|
+
"kind": {
|
|
9210
|
+
"feature": "Feature",
|
|
9211
|
+
"bug": "Bug"
|
|
9212
|
+
},
|
|
9213
|
+
"moreKinds": "More kinds…",
|
|
9214
|
+
"changeHowItRuns": "Change how this runs",
|
|
9215
|
+
"workspaceDefault": "Workspace default",
|
|
9216
|
+
"defaultPipelineHint": "The workspace default: {name}. A pipeline pinned here replaces it for this task.",
|
|
9217
|
+
"attachContext": "Attach context (opens the full form)",
|
|
9218
|
+
"add": "Add to queue",
|
|
9219
|
+
"addAndStart": "Add and start",
|
|
9220
|
+
"addedToast": "Added “{title}” to the queue"
|
|
9127
9221
|
}
|
|
9128
9222
|
}
|
package/i18n/locales/es.json
CHANGED
|
@@ -150,7 +150,8 @@
|
|
|
150
150
|
"infrastructure": "Infraestructura",
|
|
151
151
|
"foundationalServices": "Servicios fundamentales",
|
|
152
152
|
"tutorials": "Tutoriales",
|
|
153
|
-
"help": "Ayuda"
|
|
153
|
+
"help": "Ayuda",
|
|
154
|
+
"setupChecklist": "Lista de configuración"
|
|
154
155
|
},
|
|
155
156
|
"board": {
|
|
156
157
|
"toast": {
|
|
@@ -2646,6 +2647,7 @@
|
|
|
2646
2647
|
"chooseRole": "Cambiar tu rol",
|
|
2647
2648
|
"foundationalServices": "Servicios fundamentales",
|
|
2648
2649
|
"notificationSettings": "Gestionar el enrutamiento de notificaciones",
|
|
2650
|
+
"setupChecklist": "Lista de configuración",
|
|
2649
2651
|
"queueView": "Abrir la vista de cola",
|
|
2650
2652
|
"boardView": "Abrir la vista de tablero"
|
|
2651
2653
|
},
|
|
@@ -2676,8 +2678,10 @@
|
|
|
2676
2678
|
"tutorial": "tutorial recorrido guía ayuda aprender introducción",
|
|
2677
2679
|
"foundationalServices": "capacidad compartida plataforma servicio api contrato openapi catálogo",
|
|
2678
2680
|
"notificationSettings": "notificaciones correo enrutamiento canales bandeja",
|
|
2681
|
+
"setupChecklist": "configuración lista setup runner modelo github almacenamiento entorno",
|
|
2679
2682
|
"queueView": "cola vista te necesita lista pendiente",
|
|
2680
|
-
"boardView": "tablero lienzo mapa vista planificar"
|
|
2683
|
+
"boardView": "tablero lienzo mapa vista planificar",
|
|
2684
|
+
"describeWork": "describir nuevo trabajo tarea añadir crear funcionalidad error"
|
|
2681
2685
|
}
|
|
2682
2686
|
},
|
|
2683
2687
|
"integrationsHub": {
|
|
@@ -8743,6 +8747,73 @@
|
|
|
8743
8747
|
}
|
|
8744
8748
|
}
|
|
8745
8749
|
},
|
|
8750
|
+
"setup": {
|
|
8751
|
+
"title": "Configuración",
|
|
8752
|
+
"progress": "{done} de {total} hechas",
|
|
8753
|
+
"intro": "Lo que este workspace necesita para que una tarea se ejecute y se fusione.",
|
|
8754
|
+
"required": "obligatorio",
|
|
8755
|
+
"optional": "opcional",
|
|
8756
|
+
"action": {
|
|
8757
|
+
"change": "Cambiar",
|
|
8758
|
+
"connect": "Configurar",
|
|
8759
|
+
"fix": "Corregir",
|
|
8760
|
+
"review": "Revisar",
|
|
8761
|
+
"retry": "Reintentar"
|
|
8762
|
+
},
|
|
8763
|
+
"rows": {
|
|
8764
|
+
"checking": "Comprobando…",
|
|
8765
|
+
"notNeeded": "Este despliegue no lo usa.",
|
|
8766
|
+
"model": {
|
|
8767
|
+
"title": "Modelo",
|
|
8768
|
+
"done": "Hay un modelo disponible.",
|
|
8769
|
+
"missing": "No hay ningún modelo disponible. Ningún agente puede ejecutarse hasta que conectes un proveedor."
|
|
8770
|
+
},
|
|
8771
|
+
"sourceControl": {
|
|
8772
|
+
"title": "Control de código fuente",
|
|
8773
|
+
"done": "Conectado. Los agentes pueden subir ramas y abrir pull requests.",
|
|
8774
|
+
"missing": "No conectado. Los agentes no pueden abrir pull requests."
|
|
8775
|
+
},
|
|
8776
|
+
"agentExecutor": {
|
|
8777
|
+
"title": "Dónde se ejecutan los agentes",
|
|
8778
|
+
"done": "Hay un runner configurado.",
|
|
8779
|
+
"missing": "No hay ningún runner configurado. Nada puede ejecutarse hasta que conectes uno.",
|
|
8780
|
+
"notNeeded": "Este despliegue ejecuta agentes sin runner."
|
|
8781
|
+
},
|
|
8782
|
+
"ephemeralEnvironments": {
|
|
8783
|
+
"title": "Entornos de prueba",
|
|
8784
|
+
"done": "Configurado. Los probadores pueden usar una vista previa en vivo.",
|
|
8785
|
+
"missing": "Sin configurar. Los probadores que necesitan una vista previa en vivo no se ejecutan. Los demás agentes sí."
|
|
8786
|
+
},
|
|
8787
|
+
"binaryStorage": {
|
|
8788
|
+
"title": "Almacenamiento de capturas",
|
|
8789
|
+
"done": "Configurado. Las comprobaciones visuales están activas.",
|
|
8790
|
+
"missing": "Sin configurar. Las comprobaciones visuales están desactivadas."
|
|
8791
|
+
}
|
|
8792
|
+
},
|
|
8793
|
+
"causes": {
|
|
8794
|
+
"unreachable": "Configurado, pero ahora mismo no responde.",
|
|
8795
|
+
"incomplete": "Conectado, pero falta un ajuste obligatorio.",
|
|
8796
|
+
"rejected": "GitHub rechazó el token de acceso.",
|
|
8797
|
+
"underscoped": "El token de acceso no puede subir cambios ni abrir pull requests.",
|
|
8798
|
+
"presetBroken": "El preajuste de modelo predeterminado nombra un modelo que no está disponible.",
|
|
8799
|
+
"probeFailed": "La comprobación no respondió.",
|
|
8800
|
+
"notReported": "Este despliegue no lo informa."
|
|
8801
|
+
},
|
|
8802
|
+
"also": {
|
|
8803
|
+
"title": "También aquí",
|
|
8804
|
+
"pipelines": "Pipelines",
|
|
8805
|
+
"riskPolicies": "Políticas de fusión",
|
|
8806
|
+
"modelPresets": "Preajustes de modelo",
|
|
8807
|
+
"counts": {
|
|
8808
|
+
"repair": "Por reparar: {count}",
|
|
8809
|
+
"outdated": "Desactualizados: {count}",
|
|
8810
|
+
"new": "Nuevos: {count}"
|
|
8811
|
+
},
|
|
8812
|
+
"settings": "Ajustes y conexiones",
|
|
8813
|
+
"workspaceSettings": "Ajustes del workspace",
|
|
8814
|
+
"integrations": "Integraciones"
|
|
8815
|
+
}
|
|
8816
|
+
},
|
|
8746
8817
|
"queue": {
|
|
8747
8818
|
"title": "Cola",
|
|
8748
8819
|
"summary": "{needsYou} te necesitan · {ready} listas para fusionar",
|
|
@@ -8786,12 +8857,35 @@
|
|
|
8786
8857
|
"parked": "La ejecución espera a una persona. Abre la tarea para ver qué necesita.",
|
|
8787
8858
|
"waitingOn": "Espera a {deps}",
|
|
8788
8859
|
"pr": "Pull request #{number}"
|
|
8789
|
-
}
|
|
8860
|
+
},
|
|
8861
|
+
"describeWork": "Describir trabajo nuevo"
|
|
8790
8862
|
},
|
|
8791
8863
|
"views": {
|
|
8792
8864
|
"title": "Vistas",
|
|
8793
8865
|
"queue": "Cola",
|
|
8794
8866
|
"board": "Tablero",
|
|
8795
8867
|
"openQueue": "Abrir la vista de cola"
|
|
8868
|
+
},
|
|
8869
|
+
"describeWork": {
|
|
8870
|
+
"title": "Describir trabajo nuevo",
|
|
8871
|
+
"textLabel": "Qué hay que hacer",
|
|
8872
|
+
"textHint": "Una frase basta. Añade más detalle si lo tienes.",
|
|
8873
|
+
"textPlaceholder": "Añade un registro de auditoría para los inicios de sesión. Registra cada inicio con la hora, el usuario y el resultado.",
|
|
8874
|
+
"savedAs": "Título de la tarea: {title}",
|
|
8875
|
+
"serviceLabel": "Servicio",
|
|
8876
|
+
"servicePlaceholder": "Selecciona un servicio",
|
|
8877
|
+
"kindLabel": "Tipo",
|
|
8878
|
+
"kind": {
|
|
8879
|
+
"feature": "Funcionalidad",
|
|
8880
|
+
"bug": "Error"
|
|
8881
|
+
},
|
|
8882
|
+
"moreKinds": "Más tipos…",
|
|
8883
|
+
"changeHowItRuns": "Cambiar cómo se ejecuta",
|
|
8884
|
+
"workspaceDefault": "Predeterminado del workspace",
|
|
8885
|
+
"defaultPipelineHint": "El predeterminado del workspace: {name}. Un pipeline elegido aquí lo sustituye para esta tarea.",
|
|
8886
|
+
"attachContext": "Adjuntar contexto (abre el formulario completo)",
|
|
8887
|
+
"add": "Añadir a la cola",
|
|
8888
|
+
"addAndStart": "Añadir e iniciar",
|
|
8889
|
+
"addedToast": "Se añadió «{title}» a la cola"
|
|
8796
8890
|
}
|
|
8797
8891
|
}
|