@cat-factory/app 0.188.0 → 0.190.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app/components/pipeline/PipelineHealthModal.vue +68 -12
- package/app/components/settings/SharedStacksPanel.vue +52 -4
- package/app/composables/usePipelineErrorToast.ts +17 -0
- package/app/composables/usePipelineHealth.spec.ts +79 -7
- package/app/composables/usePipelineHealth.ts +70 -3
- package/app/stores/environmentWizard/save.ts +7 -1
- package/app/stores/pipelines.ts +21 -3
- package/app/stores/workspace/hydrate.ts +5 -1
- package/i18n/locales/de.json +16 -3
- package/i18n/locales/en.json +16 -3
- package/i18n/locales/es.json +16 -3
- package/i18n/locales/fr.json +16 -3
- package/i18n/locales/he.json +16 -3
- package/i18n/locales/it.json +16 -3
- package/i18n/locales/ja.json +16 -3
- package/i18n/locales/pl.json +16 -3
- package/i18n/locales/tr.json +16 -3
- package/i18n/locales/uk.json +16 -3
- package/package.json +2 -2
|
@@ -3,15 +3,22 @@
|
|
|
3
3
|
// `usePipelineHealth` reports any issue. Lists:
|
|
4
4
|
// • new built-in pipelines the workspace doesn't have yet (ADD them);
|
|
5
5
|
// • invalid pipelines (unknown agent kind / bad shape) — DELETE a custom one, RESEED a built-in;
|
|
6
|
-
// • outdated built-ins (a newer catalog definition is available) — RESEED to adopt it
|
|
6
|
+
// • outdated built-ins (a newer catalog definition is available) — RESEED to adopt it;
|
|
7
|
+
// • RETIRED built-ins (withdrawn from the catalog) — REMOVE them; there is nothing left to
|
|
8
|
+
// reseed from, which is why they are the one built-in the backend lets a delete through.
|
|
7
9
|
// Adding a new built-in and reseeding an existing one are the same reseed call (it creates or
|
|
8
10
|
// updates by catalog id). Detection is client-side (see usePipelineHealth); the actions hit the
|
|
9
11
|
// pipelines store.
|
|
10
12
|
const { t } = useI18n()
|
|
11
13
|
const ui = useUiStore()
|
|
12
14
|
const pipelines = usePipelinesStore()
|
|
13
|
-
const { invalid, outdated, newPipelines, hasIssues } = usePipelineHealth()
|
|
14
|
-
|
|
15
|
+
const { invalid, outdated, newPipelines, retired, hasIssues } = usePipelineHealth()
|
|
16
|
+
// Failures go through the shared conflict presenter rather than a raw `toast.add`: the refusals
|
|
17
|
+
// this screen actually provokes are 409s (a recurring schedule still points at the pipeline), and
|
|
18
|
+
// those carry a machine-readable `details.reason` the presenter turns into translated remedy copy.
|
|
19
|
+
// Dumping `error.message` instead would put untranslated backend prose in front of every non-English
|
|
20
|
+
// user — on the one screen whose whole purpose is telling them what to do next.
|
|
21
|
+
const { present } = usePipelineErrorToast()
|
|
15
22
|
|
|
16
23
|
const open = computed({
|
|
17
24
|
get: () => ui.pipelineHealthOpen,
|
|
@@ -25,17 +32,14 @@ const busy = ref<Set<string>>(new Set())
|
|
|
25
32
|
const isBusy = (id: string) => busy.value.has(id)
|
|
26
33
|
const anyBusy = computed(() => busy.value.size > 0)
|
|
27
34
|
|
|
28
|
-
|
|
35
|
+
/** `failTitleKey` is an i18n KEY (not resolved copy) — `present` uses it only when the failure has
|
|
36
|
+
* no mapped conflict reason of its own. */
|
|
37
|
+
async function run(id: string, action: () => Promise<unknown>, failTitleKey: string) {
|
|
29
38
|
busy.value = new Set(busy.value).add(id)
|
|
30
39
|
try {
|
|
31
40
|
await action()
|
|
32
41
|
} catch (e) {
|
|
33
|
-
|
|
34
|
-
title: failTitle,
|
|
35
|
-
description: e instanceof Error ? e.message : String(e),
|
|
36
|
-
icon: 'i-lucide-triangle-alert',
|
|
37
|
-
color: 'error',
|
|
38
|
-
})
|
|
42
|
+
present(e, failTitleKey)
|
|
39
43
|
} finally {
|
|
40
44
|
const next = new Set(busy.value)
|
|
41
45
|
next.delete(id)
|
|
@@ -44,9 +48,19 @@ async function run(id: string, action: () => Promise<unknown>, failTitle: string
|
|
|
44
48
|
}
|
|
45
49
|
|
|
46
50
|
const reseed = (id: string) =>
|
|
47
|
-
run(id, () => pipelines.reseed(id),
|
|
51
|
+
run(id, () => pipelines.reseed(id), 'pipeline.health.toast.reseedFailed')
|
|
48
52
|
const remove = (id: string) =>
|
|
49
|
-
run(id, () => pipelines.removePipeline(id),
|
|
53
|
+
run(id, () => pipelines.removePipeline(id), 'pipeline.health.toast.deleteFailed')
|
|
54
|
+
// Same call as `remove`, different failure copy: the retired section says "Remove" (the pipeline is
|
|
55
|
+
// gone from the catalog), so a failure toast reading "could not DELETE" would name an action the
|
|
56
|
+
// user was never offered. This is only the FALLBACK title — the likely failure here is a recurring
|
|
57
|
+
// schedule still pointing at the pipeline, which arrives as a 409 the presenter words itself.
|
|
58
|
+
const removeRetired = (id: string) =>
|
|
59
|
+
run(id, () => pipelines.removePipeline(id), 'pipeline.health.toast.removeFailed')
|
|
60
|
+
|
|
61
|
+
// Removals are deliberately per-row with no bulk twin, unlike the reseeds below: a reseed restores
|
|
62
|
+
// what the catalog says, while a delete is the one irreversible action on this screen (a built-in
|
|
63
|
+
// the catalog no longer defines cannot be reseeded back). One click per pipeline is the point.
|
|
50
64
|
|
|
51
65
|
/** Reseed every reseedable pipeline (new + outdated built-ins + invalid built-ins) in one go. */
|
|
52
66
|
async function reseedAll() {
|
|
@@ -179,6 +193,48 @@ const reseedableCount = computed(
|
|
|
179
193
|
</ul>
|
|
180
194
|
</section>
|
|
181
195
|
|
|
196
|
+
<!-- Retired built-ins: withdrawn from the catalog, so the only action is removal. -->
|
|
197
|
+
<section v-if="retired.length" class="space-y-2">
|
|
198
|
+
<div class="flex items-center gap-2">
|
|
199
|
+
<UIcon name="i-lucide-archive-x" class="h-4 w-4 text-slate-400" />
|
|
200
|
+
<h3 class="text-sm font-semibold text-slate-200">
|
|
201
|
+
{{ t('pipeline.health.retiredHeading') }}
|
|
202
|
+
</h3>
|
|
203
|
+
</div>
|
|
204
|
+
<p class="text-[11px] text-slate-500">{{ t('pipeline.health.retiredDescription') }}</p>
|
|
205
|
+
<ul class="space-y-2">
|
|
206
|
+
<li
|
|
207
|
+
v-for="r in retired"
|
|
208
|
+
:key="r.pipeline.id"
|
|
209
|
+
class="flex items-center justify-between gap-3 rounded-lg border border-slate-800 bg-slate-900/40 p-3"
|
|
210
|
+
>
|
|
211
|
+
<div class="min-w-0">
|
|
212
|
+
<span class="truncate text-sm font-medium text-slate-100">{{
|
|
213
|
+
r.pipeline.name
|
|
214
|
+
}}</span>
|
|
215
|
+
<p class="text-[11px] text-slate-400/80">
|
|
216
|
+
{{
|
|
217
|
+
r.replacement
|
|
218
|
+
? t('pipeline.health.retiredReplacedBy', { name: r.replacement.name })
|
|
219
|
+
: t('pipeline.health.retiredNote')
|
|
220
|
+
}}
|
|
221
|
+
</p>
|
|
222
|
+
</div>
|
|
223
|
+
<UButton
|
|
224
|
+
size="xs"
|
|
225
|
+
color="error"
|
|
226
|
+
variant="subtle"
|
|
227
|
+
icon="i-lucide-trash-2"
|
|
228
|
+
:loading="isBusy(r.pipeline.id)"
|
|
229
|
+
:disabled="anyBusy"
|
|
230
|
+
@click="removeRetired(r.pipeline.id)"
|
|
231
|
+
>
|
|
232
|
+
{{ t('pipeline.health.remove') }}
|
|
233
|
+
</UButton>
|
|
234
|
+
</li>
|
|
235
|
+
</ul>
|
|
236
|
+
</section>
|
|
237
|
+
|
|
182
238
|
<!-- Outdated built-ins: a newer catalog version is available. -->
|
|
183
239
|
<section v-if="outdated.length" class="space-y-2">
|
|
184
240
|
<div class="flex items-center gap-2">
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
// they succeed only on the local facade (elsewhere the backend returns a clear error surfaced as
|
|
7
7
|
// a toast). Renders inline inside the Infrastructure window's "Shared stacks" tab.
|
|
8
8
|
import { computed, reactive, ref } from 'vue'
|
|
9
|
+
import { describeComposeSource, normalizeComposeFileRefs } from '@cat-factory/contracts'
|
|
9
10
|
import type {
|
|
10
11
|
SharedStack,
|
|
11
12
|
SharedStackRecommendation,
|
|
@@ -76,8 +77,26 @@ function tokens(value: string): string[] {
|
|
|
76
77
|
.filter(Boolean)
|
|
77
78
|
}
|
|
78
79
|
|
|
80
|
+
// A stack's compose layers may be bare in-repo paths (what this form authors and what the
|
|
81
|
+
// autodetect scan returns) or explicit sources — an inline document, or a file in another repo —
|
|
82
|
+
// which arrive through the API / a deployment's programmatic seeds. The form edits only the
|
|
83
|
+
// former; a stack carrying any of the latter shows its layers read-only and its save omits
|
|
84
|
+
// `composeFiles` entirely, so editing the name or the profiles can never silently flatten a
|
|
85
|
+
// declaration this form has no editor for.
|
|
86
|
+
const editingStack = computed(() => stacks.value.find((s) => s.id === editingId.value) ?? null)
|
|
87
|
+
const advancedLayers = computed(() =>
|
|
88
|
+
(editingStack.value?.composeFiles ?? []).some((ref) => typeof ref !== 'string'),
|
|
89
|
+
)
|
|
90
|
+
const layerLabels = computed(() =>
|
|
91
|
+
normalizeComposeFileRefs(editingStack.value?.composeFiles ?? []).map(describeComposeSource),
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
// A repo-LESS stack (every layer inline / from another repo) needs no clone URL, so the form
|
|
95
|
+
// requires one only while the layers it can author — in-repo paths — are what is being saved.
|
|
79
96
|
const canSave = computed(
|
|
80
|
-
() =>
|
|
97
|
+
() =>
|
|
98
|
+
form.name.trim() &&
|
|
99
|
+
(advancedLayers.value || (form.cloneUrl.trim() && tokens(form.composeFiles).length > 0)),
|
|
81
100
|
)
|
|
82
101
|
|
|
83
102
|
function resetForm() {
|
|
@@ -97,10 +116,12 @@ function resetForm() {
|
|
|
97
116
|
function startEdit(stack: SharedStack) {
|
|
98
117
|
editingId.value = stack.id
|
|
99
118
|
form.name = stack.name
|
|
100
|
-
form.cloneUrl = stack.cloneUrl
|
|
119
|
+
form.cloneUrl = stack.cloneUrl ?? ''
|
|
101
120
|
form.gitRef = stack.gitRef ?? ''
|
|
102
121
|
form.directory = ''
|
|
103
|
-
|
|
122
|
+
// Only bare in-repo paths are editable here; a stack with richer layers renders them read-only
|
|
123
|
+
// below and keeps them untouched through the save.
|
|
124
|
+
form.composeFiles = stack.composeFiles.filter((ref) => typeof ref === 'string').join(', ')
|
|
104
125
|
form.composeProfiles = stack.composeProfiles.join(', ')
|
|
105
126
|
form.managedNetworks = stack.managedNetworks.join(', ')
|
|
106
127
|
form.allowHostCommands = stack.allowHostCommands
|
|
@@ -179,7 +200,17 @@ async function saveStack() {
|
|
|
179
200
|
}
|
|
180
201
|
try {
|
|
181
202
|
if (editing) {
|
|
182
|
-
|
|
203
|
+
// `composeFiles` is omitted when the stack carries layers this form can't author — the
|
|
204
|
+
// partial update preserves them, exactly as it already does for setup steps and the health
|
|
205
|
+
// gate. `cloneUrl` goes through as an explicit null when cleared, so a stack can be moved to
|
|
206
|
+
// the repo-less shape from here too.
|
|
207
|
+
const { composeFiles, ...rest } = payload
|
|
208
|
+
await store.update(editing, {
|
|
209
|
+
...rest,
|
|
210
|
+
cloneUrl: form.cloneUrl.trim() || null,
|
|
211
|
+
gitRef: form.gitRef.trim() || null,
|
|
212
|
+
...(advancedLayers.value ? {} : { composeFiles }),
|
|
213
|
+
})
|
|
183
214
|
} else {
|
|
184
215
|
await store.create(payload)
|
|
185
216
|
}
|
|
@@ -402,6 +433,23 @@ async function remove(stack: SharedStack) {
|
|
|
402
433
|
</p>
|
|
403
434
|
|
|
404
435
|
<UFormField
|
|
436
|
+
v-if="advancedLayers"
|
|
437
|
+
:label="t('settings.sharedStacks.add.composeFiles')"
|
|
438
|
+
:help="t('settings.sharedStacks.add.composeLayersManagedHelp')"
|
|
439
|
+
>
|
|
440
|
+
<ul class="space-y-1" data-testid="shared-stack-compose-layers">
|
|
441
|
+
<li
|
|
442
|
+
v-for="(label, index) in layerLabels"
|
|
443
|
+
:key="index"
|
|
444
|
+
class="font-mono text-[11px] text-slate-500"
|
|
445
|
+
>
|
|
446
|
+
{{ label }}
|
|
447
|
+
</li>
|
|
448
|
+
</ul>
|
|
449
|
+
</UFormField>
|
|
450
|
+
|
|
451
|
+
<UFormField
|
|
452
|
+
v-else
|
|
405
453
|
:label="t('settings.sharedStacks.add.composeFiles')"
|
|
406
454
|
:help="t('settings.sharedStacks.add.composeFilesHelp')"
|
|
407
455
|
>
|
|
@@ -195,6 +195,23 @@ const CONFLICT_INFO: Record<Exclude<ConflictReason, BespokeConflictReason>, Conf
|
|
|
195
195
|
titleKey: 'errors.conflict.title.prompt_revision_conflict',
|
|
196
196
|
descriptionKey: 'errors.conflict.description.prompt_revision_conflict',
|
|
197
197
|
},
|
|
198
|
+
// The three ways a recurring SCHEDULE blocks a pipeline edit (delete / make one-off / enable
|
|
199
|
+
// bug-intake). No jump action: a schedule is reached through its own frame's inspector, not from
|
|
200
|
+
// a workspace-level route, so there is no single target to deep-link to — the description names
|
|
201
|
+
// the remedy instead. What each one must convey is that the fix is on the SCHEDULE and not on the
|
|
202
|
+
// pipeline the user is looking at, which is the part the refusal alone doesn't make obvious.
|
|
203
|
+
pipeline_schedule_attached: {
|
|
204
|
+
titleKey: 'errors.conflict.title.pipeline_schedule_attached',
|
|
205
|
+
descriptionKey: 'errors.conflict.description.pipeline_schedule_attached',
|
|
206
|
+
},
|
|
207
|
+
pipeline_schedule_requires_recurring: {
|
|
208
|
+
titleKey: 'errors.conflict.title.pipeline_schedule_requires_recurring',
|
|
209
|
+
descriptionKey: 'errors.conflict.description.pipeline_schedule_requires_recurring',
|
|
210
|
+
},
|
|
211
|
+
pipeline_schedule_intake_unconfigured: {
|
|
212
|
+
titleKey: 'errors.conflict.title.pipeline_schedule_intake_unconfigured',
|
|
213
|
+
descriptionKey: 'errors.conflict.description.pipeline_schedule_intake_unconfigured',
|
|
214
|
+
},
|
|
198
215
|
}
|
|
199
216
|
|
|
200
217
|
/**
|
|
@@ -27,14 +27,26 @@ function builtin(agentKinds: string[], over: Partial<Pipeline> = {}): Pipeline {
|
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
-
/**
|
|
31
|
-
|
|
30
|
+
/**
|
|
31
|
+
* Seed the store with pipelines + their current catalog versions (and any RETIREMENTS), then scan.
|
|
32
|
+
* A retired id is dropped from the derived catalog versions, mirroring the backend where the two
|
|
33
|
+
* sets are disjoint by construction — a test that seeded both would assert against a snapshot the
|
|
34
|
+
* facade cannot produce.
|
|
35
|
+
*/
|
|
36
|
+
function scan(
|
|
37
|
+
pipelines: Pipeline[],
|
|
38
|
+
versions: Record<string, number> = {},
|
|
39
|
+
retired: { id: string; replacedBy?: string }[] = [],
|
|
40
|
+
) {
|
|
32
41
|
const store = usePipelinesStore()
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
42
|
+
const retiredIds = new Set(retired.map((r) => r.id))
|
|
43
|
+
const catalogVersions = Object.fromEntries(
|
|
44
|
+
Object.entries({
|
|
45
|
+
...Object.fromEntries(pipelines.filter((p) => p.builtin).map((p) => [p.id, p.version ?? 0])),
|
|
46
|
+
...versions,
|
|
47
|
+
}).filter(([id]) => !retiredIds.has(id)),
|
|
48
|
+
)
|
|
49
|
+
store.hydrate(pipelines, catalogVersions, retired)
|
|
38
50
|
return usePipelineHealth()
|
|
39
51
|
}
|
|
40
52
|
|
|
@@ -164,4 +176,64 @@ describe('usePipelineHealth', () => {
|
|
|
164
176
|
expect(newPipelines.value).toHaveLength(0)
|
|
165
177
|
expect(hasIssues.value).toBe(false)
|
|
166
178
|
})
|
|
179
|
+
it('reports a stored built-in the catalog retired, with no reseed offer', () => {
|
|
180
|
+
const stale = builtin(['coder', 'reviewer'], { id: 'pl_gone', name: 'Old flow', version: 1 })
|
|
181
|
+
const { retired, invalid, outdated, newPipelines, hasIssues } = scan([stale], {}, [
|
|
182
|
+
{ id: 'pl_gone' },
|
|
183
|
+
])
|
|
184
|
+
expect(retired.value).toHaveLength(1)
|
|
185
|
+
expect(retired.value[0]!.pipeline.id).toBe('pl_gone')
|
|
186
|
+
expect(retired.value[0]!.replacement).toBeUndefined()
|
|
187
|
+
expect(hasIssues.value).toBe(true)
|
|
188
|
+
// Retirement is answered by a REMOVAL, so the pipeline must appear in no reseed-shaped list.
|
|
189
|
+
expect(invalid.value).toHaveLength(0)
|
|
190
|
+
expect(outdated.value).toHaveLength(0)
|
|
191
|
+
expect(newPipelines.value).toHaveLength(0)
|
|
192
|
+
})
|
|
193
|
+
|
|
194
|
+
it('resolves a retirement replacement to the stored pipeline it names', () => {
|
|
195
|
+
const stale = builtin(['coder'], { id: 'pl_gone', name: 'Old flow', version: 1 })
|
|
196
|
+
const live = builtin(['coder', 'reviewer'], { id: 'pl_simple', name: 'Simple', version: 1 })
|
|
197
|
+
const { retired } = scan([stale, live], {}, [{ id: 'pl_gone', replacedBy: 'pl_simple' }])
|
|
198
|
+
expect(retired.value[0]!.replacement).toEqual({ id: 'pl_simple', name: 'Simple' })
|
|
199
|
+
})
|
|
200
|
+
|
|
201
|
+
it('names a replacement that is in the catalog but NOT yet stored on this board', () => {
|
|
202
|
+
// The canonical retirement: an old flow superseded by a NEWLY SHIPPED built-in. The replacement
|
|
203
|
+
// is in `catalogVersions` with no row until someone adds it — it is simultaneously a
|
|
204
|
+
// `newPipelines` entry — so resolving only against stored pipelines silently dropped the
|
|
205
|
+
// "Use X instead" sentence in exactly the case `replacedBy` exists to serve.
|
|
206
|
+
const stale = builtin(['coder'], { id: 'pl_gone', name: 'Old flow', version: 1 })
|
|
207
|
+
const { retired, newPipelines } = scan([stale], { pl_bug_triage: 1 }, [
|
|
208
|
+
{ id: 'pl_gone', replacedBy: 'pl_bug_triage' },
|
|
209
|
+
])
|
|
210
|
+
expect(newPipelines.value.map((p) => p.id)).toContain('pl_bug_triage')
|
|
211
|
+
expect(retired.value[0]!.replacement).toEqual({ id: 'pl_bug_triage', name: 'bug triage' })
|
|
212
|
+
})
|
|
213
|
+
|
|
214
|
+
it('leaves the replacement unnamed when the id resolves nowhere', () => {
|
|
215
|
+
// A SPA running against a newer backend can be handed a `replacedBy` it knows nothing about.
|
|
216
|
+
// The advisory falls back to the un-named copy rather than inventing a name for it.
|
|
217
|
+
const stale = builtin(['coder'], { id: 'pl_gone', name: 'Old flow', version: 1 })
|
|
218
|
+
const { retired } = scan([stale], {}, [{ id: 'pl_gone', replacedBy: 'pl_from_the_future' }])
|
|
219
|
+
expect(retired.value[0]!.replacement).toBeUndefined()
|
|
220
|
+
})
|
|
221
|
+
|
|
222
|
+
it('keeps an INVALID retired built-in out of the invalid list (its Reseed could only fail)', () => {
|
|
223
|
+
// The regression this pins: a retired pipeline that also references an unknown kind used to
|
|
224
|
+
// land in `invalid` with a built-in Reseed button, and reseed 422s for an id the catalog no
|
|
225
|
+
// longer defines — an advisory offering a fix that cannot work.
|
|
226
|
+
const broken = builtin(['coder', 'bogus-kind'], { id: 'pl_gone', version: 1 })
|
|
227
|
+
const { invalid, retired } = scan([broken], {}, [{ id: 'pl_gone' }])
|
|
228
|
+
expect(invalid.value).toHaveLength(0)
|
|
229
|
+
expect(retired.value).toHaveLength(1)
|
|
230
|
+
})
|
|
231
|
+
|
|
232
|
+
it('ignores a retirement for a pipeline this workspace never stored', () => {
|
|
233
|
+
// Nothing to clean up: the board was created after the withdrawal, so it was never seeded.
|
|
234
|
+
const stored = builtin(['coder', 'reviewer'], { id: 'pl_full', version: 1 })
|
|
235
|
+
const { retired, hasIssues } = scan([stored], { pl_full: 1 }, [{ id: 'pl_gone' }])
|
|
236
|
+
expect(retired.value).toHaveLength(0)
|
|
237
|
+
expect(hasIssues.value).toBe(false)
|
|
238
|
+
})
|
|
167
239
|
})
|
|
@@ -7,7 +7,7 @@ import { usePipelinesStore } from '~/stores/pipelines'
|
|
|
7
7
|
/** Estimate-gating consults a `task-estimator` step (mirrors the backend constant). */
|
|
8
8
|
const TASK_ESTIMATOR_KIND = 'task-estimator'
|
|
9
9
|
|
|
10
|
-
export type PipelineProblemType = 'unknown-kind' | 'shape' | 'outdated'
|
|
10
|
+
export type PipelineProblemType = 'unknown-kind' | 'shape' | 'outdated' | 'retired'
|
|
11
11
|
|
|
12
12
|
export interface PipelineProblem {
|
|
13
13
|
type: PipelineProblemType
|
|
@@ -23,6 +23,30 @@ export interface PipelineHealth {
|
|
|
23
23
|
outdated: boolean
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
+
/**
|
|
27
|
+
* A stored built-in that has been WITHDRAWN from the catalog — no longer relevant, and removable
|
|
28
|
+
* (the one case where deleting a built-in is allowed).
|
|
29
|
+
*
|
|
30
|
+
* It is a list of its own rather than a {@link PipelineProblem} on {@link PipelineHealth} because
|
|
31
|
+
* every problem there is answered by a RESEED, and a retired pipeline has no catalog definition
|
|
32
|
+
* left to reseed from. Keeping it separate is what guarantees the advisory can never offer both
|
|
33
|
+
* fixes for one row — a retired pipeline is skipped by the health scan entirely.
|
|
34
|
+
*/
|
|
35
|
+
export interface RetiredPipelineHealth {
|
|
36
|
+
pipeline: Pipeline
|
|
37
|
+
/**
|
|
38
|
+
* The live pipeline that supersedes it, when the catalog names one — resolved to a display name
|
|
39
|
+
* so the advisory can write "Use {name} instead".
|
|
40
|
+
*
|
|
41
|
+
* Deliberately NOT a {@link Pipeline}: the replacement usually is NOT one this workspace stores.
|
|
42
|
+
* The canonical retirement is "old flow superseded by a NEWLY SHIPPED built-in", and a new
|
|
43
|
+
* built-in lives in `catalogVersions` with no row until someone reseeds it — it is literally a
|
|
44
|
+
* {@link NewPipeline} at that moment. Typing this as a stored `Pipeline` made the replacement
|
|
45
|
+
* unresolvable in exactly the case `replacedBy` exists for, silently dropping the sentence.
|
|
46
|
+
*/
|
|
47
|
+
replacement?: { id: string; name: string }
|
|
48
|
+
}
|
|
49
|
+
|
|
26
50
|
/** A brand-new built-in pipeline that appeared in the catalog but isn't in the workspace yet. */
|
|
27
51
|
export interface NewPipeline {
|
|
28
52
|
/** The catalog (built-in) id — what the reseed endpoint is keyed by (it creates the row). */
|
|
@@ -117,9 +141,18 @@ function shapeProblem(p: Pipeline): string | null {
|
|
|
117
141
|
export function usePipelineHealth() {
|
|
118
142
|
const store = usePipelinesStore()
|
|
119
143
|
|
|
144
|
+
/** Catalog ids the backend reports as withdrawn, indexed to their (optional) replacement id. */
|
|
145
|
+
const retiredIds = computed(
|
|
146
|
+
() => new Map(store.retiredPipelines.map((p) => [p.id, p.replacedBy])),
|
|
147
|
+
)
|
|
148
|
+
|
|
120
149
|
const health = computed<PipelineHealth[]>(() => {
|
|
121
150
|
const out: PipelineHealth[] = []
|
|
122
151
|
for (const pipeline of store.pipelines) {
|
|
152
|
+
// A retired pipeline is reported by `retired` below, never here: every problem this scan
|
|
153
|
+
// raises is answered by a reseed, and there is no catalog definition left to reseed from.
|
|
154
|
+
// (An invalid retired pipeline would otherwise get a Reseed button that can only 422.)
|
|
155
|
+
if (retiredIds.value.has(pipeline.id)) continue
|
|
123
156
|
const problems: PipelineProblem[] = []
|
|
124
157
|
|
|
125
158
|
const unknown = [...new Set(pipeline.agentKinds.filter((k) => !isKnownAgentKind(k)))]
|
|
@@ -158,11 +191,45 @@ export function usePipelineHealth() {
|
|
|
158
191
|
.map((id) => ({ id, name: builtinPipelineName(id) }))
|
|
159
192
|
})
|
|
160
193
|
|
|
194
|
+
// Retired built-ins this workspace still stores: the ones seeded before the withdrawal. A
|
|
195
|
+
// retirement the board never had a row for is nothing to report — there is no cleanup to do.
|
|
196
|
+
const retired = computed<RetiredPipelineHealth[]>(() =>
|
|
197
|
+
store.pipelines
|
|
198
|
+
.filter((p) => retiredIds.value.has(p.id))
|
|
199
|
+
.map((pipeline) => {
|
|
200
|
+
const replacementId = retiredIds.value.get(pipeline.id)
|
|
201
|
+
const replacement = replacementId ? resolveReplacement(replacementId) : undefined
|
|
202
|
+
return { pipeline, ...(replacement ? { replacement } : {}) }
|
|
203
|
+
}),
|
|
204
|
+
)
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Name the pipeline a retirement points at. Two sources, in order, because a replacement is a
|
|
208
|
+
* LIVE catalog id and a live catalog id may or may not have been seeded into this workspace yet:
|
|
209
|
+
* the stored row's authored name when there is one, else the catalog-derived name — the same
|
|
210
|
+
* `builtinPipelineName` fallback `newPipelines` uses for exactly this "in the catalog, no row
|
|
211
|
+
* yet" state. Reading only the store would blank the replacement on the most common retirement
|
|
212
|
+
* (superseded by a newly shipped built-in, which by definition has no row until it is added).
|
|
213
|
+
*
|
|
214
|
+
* An id in neither returns undefined and the advisory falls back to the un-named copy: the
|
|
215
|
+
* backend guards `replacedBy` against naming a non-existent pipeline, but a SPA running against
|
|
216
|
+
* a newer backend can still be handed one it doesn't know, and inventing a name for it would be
|
|
217
|
+
* worse than saying nothing.
|
|
218
|
+
*/
|
|
219
|
+
function resolveReplacement(id: string): { id: string; name: string } | undefined {
|
|
220
|
+
const stored = store.getPipeline(id)
|
|
221
|
+
if (stored) return { id, name: stored.name }
|
|
222
|
+
if (id in store.catalogVersions) return { id, name: builtinPipelineName(id) }
|
|
223
|
+
return undefined
|
|
224
|
+
}
|
|
225
|
+
|
|
161
226
|
// An invalid built-in is reseeded (not deleted) and that also clears any "outdated" flag, so
|
|
162
227
|
// exclude it from the outdated list to avoid offering the same fix twice.
|
|
163
228
|
const invalid = computed(() => health.value.filter((h) => h.invalid))
|
|
164
229
|
const outdated = computed(() => health.value.filter((h) => h.outdated && !h.invalid))
|
|
165
|
-
const hasIssues = computed(
|
|
230
|
+
const hasIssues = computed(
|
|
231
|
+
() => health.value.length > 0 || newPipelines.value.length > 0 || retired.value.length > 0,
|
|
232
|
+
)
|
|
166
233
|
|
|
167
|
-
return { health, invalid, outdated, newPipelines, hasIssues }
|
|
234
|
+
return { health, invalid, outdated, newPipelines, retired, hasIssues }
|
|
168
235
|
}
|
|
@@ -95,7 +95,13 @@ export function createSaveActions(ctx: WizardContext) {
|
|
|
95
95
|
await board.updateBlock(id, {
|
|
96
96
|
provisioning: {
|
|
97
97
|
type: 'docker-compose',
|
|
98
|
-
|
|
98
|
+
// `composePath` is the single-file fallback the provider uses when a recipe declares no
|
|
99
|
+
// layers, so only a bare in-repo path can fill it. The wizard's layers always are ones
|
|
100
|
+
// (they come from the deterministic detector); an `inline` / other-repo layer, which the
|
|
101
|
+
// API can supply, simply leaves it unset — the recipe below already carries the layer.
|
|
102
|
+
...(typeof pruned.composeFiles?.[0] === 'string'
|
|
103
|
+
? { composePath: pruned.composeFiles[0] }
|
|
104
|
+
: {}),
|
|
99
105
|
...(build ? { composeBuild: true } : {}),
|
|
100
106
|
recipe: pruned,
|
|
101
107
|
},
|
package/app/stores/pipelines.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { defineStore } from 'pinia'
|
|
2
2
|
import { ref } from 'vue'
|
|
3
3
|
import type { Pipeline } from '~/types/domain'
|
|
4
|
-
import type { PipelinePurpose } from '@cat-factory/contracts'
|
|
4
|
+
import type { PipelinePurpose, RetiredPipelineWire } from '@cat-factory/contracts'
|
|
5
5
|
import { useUpsertList } from '~/composables/useUpsertList'
|
|
6
6
|
import { createDraftStepState, type PipelinesContext } from '~/stores/pipelines/context'
|
|
7
7
|
import { createPipelineDraftActions } from '~/stores/pipelines/draftActions'
|
|
@@ -32,6 +32,13 @@ export const usePipelinesStore = defineStore('pipelines', () => {
|
|
|
32
32
|
* a newer definition available (see `usePipelineHealth`).
|
|
33
33
|
*/
|
|
34
34
|
const catalogVersions = ref<Record<string, number>>({})
|
|
35
|
+
/**
|
|
36
|
+
* Built-in pipelines WITHDRAWN from the catalog (`retiredPipelines()`), from the workspace
|
|
37
|
+
* snapshot. A stored pipeline whose id appears here is no longer relevant and can be REMOVED —
|
|
38
|
+
* the opposite of a reseed, and the only case where deleting a built-in is allowed (see
|
|
39
|
+
* `usePipelineHealth`). Disjoint from {@link catalogVersions} by construction.
|
|
40
|
+
*/
|
|
41
|
+
const retiredPipelines = ref<RetiredPipelineWire[]>([])
|
|
35
42
|
|
|
36
43
|
// The per-step, index-aligned draft arrays (kept in lockstep — see `createDraftStepState`).
|
|
37
44
|
const {
|
|
@@ -60,10 +67,20 @@ export const usePipelinesStore = defineStore('pipelines', () => {
|
|
|
60
67
|
/** The id of the pipeline being edited, or null when assembling a brand-new one. */
|
|
61
68
|
const editingId = ref<string | null>(null)
|
|
62
69
|
|
|
63
|
-
/**
|
|
64
|
-
|
|
70
|
+
/**
|
|
71
|
+
* Replace the cached pipelines (and the current built-in catalog versions + retirements) from a
|
|
72
|
+
* snapshot. `retired` is applied even when EMPTY, unlike `versions`: an absent list means the
|
|
73
|
+
* facade shipped no retirements, and carrying the previous board's forward would offer a delete
|
|
74
|
+
* for a pipeline this deployment still ships.
|
|
75
|
+
*/
|
|
76
|
+
function hydrate(
|
|
77
|
+
next: Pipeline[],
|
|
78
|
+
versions?: Record<string, number>,
|
|
79
|
+
retired?: RetiredPipelineWire[],
|
|
80
|
+
) {
|
|
65
81
|
pipelines.value = next
|
|
66
82
|
if (versions) catalogVersions.value = versions
|
|
83
|
+
retiredPipelines.value = retired ?? []
|
|
67
84
|
}
|
|
68
85
|
|
|
69
86
|
function getPipeline(id: string) {
|
|
@@ -99,6 +116,7 @@ export const usePipelinesStore = defineStore('pipelines', () => {
|
|
|
99
116
|
return {
|
|
100
117
|
pipelines,
|
|
101
118
|
catalogVersions,
|
|
119
|
+
retiredPipelines,
|
|
102
120
|
draft,
|
|
103
121
|
draftGates,
|
|
104
122
|
draftEnabled,
|
|
@@ -62,7 +62,11 @@ export function applySnapshotToStores(snapshot: WorkspaceSnapshot, boardSince?:
|
|
|
62
62
|
useUserSettingsStore().hydrate(snapshot.userSettings ?? null)
|
|
63
63
|
useBoardStore().hydrate(snapshot.blocks, boardSince)
|
|
64
64
|
useBoardStore().hydrateArchived(snapshot.archivedServices ?? [])
|
|
65
|
-
usePipelinesStore().hydrate(
|
|
65
|
+
usePipelinesStore().hydrate(
|
|
66
|
+
snapshot.pipelines,
|
|
67
|
+
snapshot.pipelineCatalogVersions,
|
|
68
|
+
snapshot.retiredPipelines,
|
|
69
|
+
)
|
|
66
70
|
useExecutionStore().hydrate(snapshot.executions, snapshot.workspace.id)
|
|
67
71
|
useAgentRunsStore().hydrate(snapshot.bootstrapJobs ?? [], snapshot.workspace.id)
|
|
68
72
|
useAgentRunsStore().hydrateEnvConfigRepair(snapshot.envConfigRepairJobs ?? [])
|
package/i18n/locales/de.json
CHANGED
|
@@ -630,6 +630,7 @@
|
|
|
630
630
|
"directoryHelp": "Wird nur von der automatischen Erkennung verwendet: das Monorepo-Unterverzeichnis, in dem der Compose-Stack liegt.",
|
|
631
631
|
"composeFiles": "Compose-Dateien",
|
|
632
632
|
"composeFilesHelp": "Kommagetrennt, repo-relativ, in Override-Reihenfolge.",
|
|
633
|
+
"composeLayersManagedHelp": "Über die API verwaltet — dieser Stack hat Layer, die inline bereitgestellt oder aus einem anderen Repository gelesen werden; sie werden hier schreibgeschützt angezeigt und beim Speichern nicht verändert.",
|
|
633
634
|
"composeProfiles": "Compose-Profile (optional)",
|
|
634
635
|
"managedNetworks": "Verwaltete Netzwerke (optional)",
|
|
635
636
|
"managedNetworksHelp": "Netzwerke, die dieser Stack für Konsumenten erstellt und besitzt, um sich damit zu verbinden.",
|
|
@@ -3726,14 +3727,20 @@
|
|
|
3726
3727
|
"add": "Hinzufügen",
|
|
3727
3728
|
"reseed": "Neu aufsetzen",
|
|
3728
3729
|
"delete": "Löschen",
|
|
3730
|
+
"remove": "Entfernen",
|
|
3729
3731
|
"updatesHeading": "Updates verfügbar",
|
|
3730
3732
|
"updatesDescription": "Eine neuere Version dieser integrierten Pipelines wurde ausgeliefert. Setzen Sie sie neu auf, um sie zu übernehmen (Ihre Labels und der Archivstatus bleiben erhalten).",
|
|
3733
|
+
"retiredHeading": "Ausgemusterte Pipelines",
|
|
3734
|
+
"retiredDescription": "Diese integrierten Pipelines wurden aus dem Katalog zurückgezogen, es gibt also keine neuere Version zum Übernehmen. Entfernen Sie sie aus der Bibliothek dieses Boards.",
|
|
3735
|
+
"retiredNote": "Aus dem Katalog zurückgezogen.",
|
|
3736
|
+
"retiredReplacedBy": "Aus dem Katalog zurückgezogen. Verwenden Sie stattdessen {name}.",
|
|
3731
3737
|
"reseedAll": "Alle neu aufsetzen ({count})",
|
|
3732
3738
|
"dismiss": "Verwerfen",
|
|
3733
3739
|
"done": "Fertig",
|
|
3734
3740
|
"toast": {
|
|
3735
3741
|
"reseedFailed": "Pipeline konnte nicht neu aufgesetzt werden",
|
|
3736
|
-
"deleteFailed": "Pipeline konnte nicht gelöscht werden"
|
|
3742
|
+
"deleteFailed": "Pipeline konnte nicht gelöscht werden",
|
|
3743
|
+
"removeFailed": "Pipeline konnte nicht entfernt werden"
|
|
3737
3744
|
}
|
|
3738
3745
|
}
|
|
3739
3746
|
},
|
|
@@ -4630,7 +4637,10 @@
|
|
|
4630
4637
|
"env_test_not_provisionable": "Umgebungs-Handler nicht konfiguriert",
|
|
4631
4638
|
"env_test_no_vcs": "Git-Anbieter nicht verbunden",
|
|
4632
4639
|
"env_test_connection_failed": "Umgebungsverbindung fehlgeschlagen",
|
|
4633
|
-
"prompt_revision_conflict": "Prompt von jemand anderem geändert"
|
|
4640
|
+
"prompt_revision_conflict": "Prompt von jemand anderem geändert",
|
|
4641
|
+
"pipeline_schedule_attached": "Wiederkehrender Zeitplan nutzt diese Pipeline",
|
|
4642
|
+
"pipeline_schedule_requires_recurring": "Wiederkehrender Zeitplan braucht diese Pipeline",
|
|
4643
|
+
"pipeline_schedule_intake_unconfigured": "Zeitplan ohne Ticket-Erfassung"
|
|
4634
4644
|
},
|
|
4635
4645
|
"description": {
|
|
4636
4646
|
"dependencies_unmet": "Diese Aufgabe hängt von anderen ab, die noch nicht abgeschlossen sind. Schließe sie ab oder gib sie frei und starte dann erneut.",
|
|
@@ -4655,7 +4665,10 @@
|
|
|
4655
4665
|
"env_test_no_vcs": "Der Selbsttest benötigt einen Git-Anbieter, um seinen Wegwerf-Branch zu erstellen und zu löschen, aber dieser Workspace ist mit keinem verbunden.",
|
|
4656
4666
|
"env_test_connection_failed": "Der Umgebungs-Handler dieses Dienstes hat seinen Verbindungstest nicht bestanden. Prüfen Sie Endpunkt, Anmeldedaten und Projekteinstellungen und testen Sie die Verbindung erneut.",
|
|
4657
4667
|
"env_test_connection_failed_detail": "Der Umgebungs-Handler dieses Dienstes hat seinen Verbindungstest nicht bestanden: {detail}. Prüfen Sie Endpunkt, Anmeldedaten und Projekteinstellungen und testen Sie die Verbindung erneut.",
|
|
4658
|
-
"prompt_revision_conflict": "Eine andere Änderung an diesem Prompt war zuerst da. Laden Sie ihn neu und wenden Sie Ihre Änderung darauf erneut an."
|
|
4668
|
+
"prompt_revision_conflict": "Eine andere Änderung an diesem Prompt war zuerst da. Laden Sie ihn neu und wenden Sie Ihre Änderung darauf erneut an.",
|
|
4669
|
+
"pipeline_schedule_attached": "Ein wiederkehrender Zeitplan verweist noch auf diese Pipeline, und jeder von ihm gestartete Lauf löst die Pipeline über ihre ID auf. Lösen oder löschen Sie zuerst diesen Zeitplan und entfernen Sie danach die Pipeline.",
|
|
4670
|
+
"pipeline_schedule_requires_recurring": "Ein wiederkehrender Zeitplan verweist noch auf diese Pipeline. Sie nur einmalig zu machen würde jeden künftigen Lauf unterbrechen. Lösen Sie zuerst diesen Zeitplan.",
|
|
4671
|
+
"pipeline_schedule_intake_unconfigured": "Ein Bug-Intake-Schritt bezieht seine Arbeit aus der Ticket-Erfassung des Zeitplans, und der verknüpfte Zeitplan hat keine. Konfigurieren Sie zuerst die Ticket-Erfassung im Zeitplan."
|
|
4659
4672
|
},
|
|
4660
4673
|
"action": {
|
|
4661
4674
|
"connectGitHub": "GitHub verbinden",
|
package/i18n/locales/en.json
CHANGED
|
@@ -559,7 +559,10 @@
|
|
|
559
559
|
"env_test_not_provisionable": "Environment handler not configured",
|
|
560
560
|
"env_test_no_vcs": "Git provider not connected",
|
|
561
561
|
"env_test_connection_failed": "Environment connection failed",
|
|
562
|
-
"prompt_revision_conflict": "Prompt changed by someone else"
|
|
562
|
+
"prompt_revision_conflict": "Prompt changed by someone else",
|
|
563
|
+
"pipeline_schedule_attached": "Recurring schedule uses this pipeline",
|
|
564
|
+
"pipeline_schedule_requires_recurring": "Recurring schedule needs this pipeline",
|
|
565
|
+
"pipeline_schedule_intake_unconfigured": "Schedule has no issue intake"
|
|
563
566
|
},
|
|
564
567
|
"description": {
|
|
565
568
|
"dependencies_unmet": "This task depends on others that aren't finished yet. Complete or unblock them, then start it again.",
|
|
@@ -587,7 +590,10 @@
|
|
|
587
590
|
"@env_test_connection_failed_detail": {
|
|
588
591
|
"description": "Keep the named placeholder for the failure detail intact (the environment provider's connection-test error message, injected at runtime)."
|
|
589
592
|
},
|
|
590
|
-
"prompt_revision_conflict": "Another edit to this prompt landed first. Reload it and re-apply your change on top."
|
|
593
|
+
"prompt_revision_conflict": "Another edit to this prompt landed first. Reload it and re-apply your change on top.",
|
|
594
|
+
"pipeline_schedule_attached": "A recurring schedule still points at this pipeline, and every run it starts resolves the pipeline by id. Detach or delete that schedule first, then remove the pipeline.",
|
|
595
|
+
"pipeline_schedule_requires_recurring": "A recurring schedule still points at this pipeline, so making it one-off only would break every future run it starts. Detach that schedule first.",
|
|
596
|
+
"pipeline_schedule_intake_unconfigured": "A bug intake step draws its work from the schedule issue intake settings, and the attached schedule has none. Configure issue intake on the schedule first."
|
|
591
597
|
},
|
|
592
598
|
"action": {
|
|
593
599
|
"connectGitHub": "Connect GitHub",
|
|
@@ -2917,6 +2923,7 @@
|
|
|
2917
2923
|
"directoryHelp": "Used only by Autodetect: the monorepo subdirectory the compose stack lives in.",
|
|
2918
2924
|
"composeFiles": "Compose files",
|
|
2919
2925
|
"composeFilesHelp": "Comma-separated, repo-relative, in override order.",
|
|
2926
|
+
"composeLayersManagedHelp": "Managed through the API — this stack has layers supplied inline or read from another repo, so they are shown read-only here and left untouched when you save.",
|
|
2920
2927
|
"composeProfiles": "Compose profiles (optional)",
|
|
2921
2928
|
"managedNetworks": "Managed networks (optional)",
|
|
2922
2929
|
"managedNetworksHelp": "Networks this stack creates and owns for consumers to attach to.",
|
|
@@ -4157,14 +4164,20 @@
|
|
|
4157
4164
|
"add": "Add",
|
|
4158
4165
|
"reseed": "Reseed",
|
|
4159
4166
|
"delete": "Delete",
|
|
4167
|
+
"remove": "Remove",
|
|
4160
4168
|
"updatesHeading": "Updates available",
|
|
4161
4169
|
"updatesDescription": "A newer version of these built-in pipelines has shipped. Reseed to adopt it (your labels and archive state are kept).",
|
|
4170
|
+
"retiredHeading": "Retired pipelines",
|
|
4171
|
+
"retiredDescription": "These built-in pipelines have been withdrawn from the catalog, so there is no newer version to adopt. Remove them from this board library.",
|
|
4172
|
+
"retiredNote": "Retired from the catalog.",
|
|
4173
|
+
"retiredReplacedBy": "Retired from the catalog. Use {name} instead.",
|
|
4162
4174
|
"reseedAll": "Reseed all ({count})",
|
|
4163
4175
|
"dismiss": "Dismiss",
|
|
4164
4176
|
"done": "Done",
|
|
4165
4177
|
"toast": {
|
|
4166
4178
|
"reseedFailed": "Could not reseed pipeline",
|
|
4167
|
-
"deleteFailed": "Could not delete pipeline"
|
|
4179
|
+
"deleteFailed": "Could not delete pipeline",
|
|
4180
|
+
"removeFailed": "Could not remove pipeline"
|
|
4168
4181
|
}
|
|
4169
4182
|
}
|
|
4170
4183
|
},
|
package/i18n/locales/es.json
CHANGED
|
@@ -514,7 +514,10 @@
|
|
|
514
514
|
"env_test_not_provisionable": "Gestor de entorno no configurado",
|
|
515
515
|
"env_test_no_vcs": "Proveedor de Git no conectado",
|
|
516
516
|
"env_test_connection_failed": "Fallo de conexión del entorno",
|
|
517
|
-
"prompt_revision_conflict": "Otra persona cambió el prompt"
|
|
517
|
+
"prompt_revision_conflict": "Otra persona cambió el prompt",
|
|
518
|
+
"pipeline_schedule_attached": "Una programación recurrente usa esta canalización",
|
|
519
|
+
"pipeline_schedule_requires_recurring": "Una programación recurrente necesita esta canalización",
|
|
520
|
+
"pipeline_schedule_intake_unconfigured": "La programación no tiene entrada de incidencias"
|
|
518
521
|
},
|
|
519
522
|
"description": {
|
|
520
523
|
"dependencies_unmet": "Esta tarea depende de otras que aún no están terminadas. Complétalas o desbloquéalas y vuelve a iniciarla.",
|
|
@@ -539,7 +542,10 @@
|
|
|
539
542
|
"env_test_no_vcs": "La autoprueba necesita un proveedor de Git para crear y eliminar su rama desechable, pero este espacio de trabajo no está conectado a ninguno.",
|
|
540
543
|
"env_test_connection_failed": "El gestor de entornos de este servicio no superó su prueba de conexión. Revisa su endpoint, sus credenciales y la configuración del proyecto, y vuelve a probar la conexión.",
|
|
541
544
|
"env_test_connection_failed_detail": "El gestor de entornos de este servicio no superó su prueba de conexión: {detail}. Revisa su endpoint, sus credenciales y la configuración del proyecto, y vuelve a probar la conexión.",
|
|
542
|
-
"prompt_revision_conflict": "Otra edición de este prompt llegó primero. Recárgalo y vuelve a aplicar tu cambio encima."
|
|
545
|
+
"prompt_revision_conflict": "Otra edición de este prompt llegó primero. Recárgalo y vuelve a aplicar tu cambio encima.",
|
|
546
|
+
"pipeline_schedule_attached": "Una programación recurrente todavía apunta a esta canalización, y cada ejecución que inicia la resuelve por su id. Desvincule o elimine esa programación antes de quitar la canalización.",
|
|
547
|
+
"pipeline_schedule_requires_recurring": "Una programación recurrente todavía apunta a esta canalización, así que limitarla a un solo uso rompería cada ejecución futura. Desvincule primero esa programación.",
|
|
548
|
+
"pipeline_schedule_intake_unconfigured": "Un paso de entrada de errores toma su trabajo de la entrada de incidencias de la programación, y la programación vinculada no la tiene. Configure la entrada de incidencias en la programación primero."
|
|
543
549
|
},
|
|
544
550
|
"action": {
|
|
545
551
|
"connectGitHub": "Conectar GitHub",
|
|
@@ -2697,6 +2703,7 @@
|
|
|
2697
2703
|
"directoryHelp": "Solo lo usa la detección automática: el subdirectorio del monorepo donde se encuentra el stack de compose.",
|
|
2698
2704
|
"composeFiles": "Archivos de Compose",
|
|
2699
2705
|
"composeFilesHelp": "Separados por comas, relativos al repositorio, en orden de anulación.",
|
|
2706
|
+
"composeLayersManagedHelp": "Gestionado mediante la API: esta pila tiene capas suministradas en línea o leídas desde otro repositorio, por lo que aquí se muestran como solo lectura y no se modifican al guardar.",
|
|
2700
2707
|
"composeProfiles": "Perfiles de Compose (opcional)",
|
|
2701
2708
|
"managedNetworks": "Redes gestionadas (opcional)",
|
|
2702
2709
|
"managedNetworksHelp": "Redes que este stack crea y posee para que los consumidores se conecten.",
|
|
@@ -4042,14 +4049,20 @@
|
|
|
4042
4049
|
"add": "Añadir",
|
|
4043
4050
|
"reseed": "Regenerar",
|
|
4044
4051
|
"delete": "Eliminar",
|
|
4052
|
+
"remove": "Quitar",
|
|
4045
4053
|
"updatesHeading": "Actualizaciones disponibles",
|
|
4046
4054
|
"updatesDescription": "Se ha publicado una versión más reciente de estos pipelines integrados. Regenéralos para adoptarla (se conservan tus etiquetas y el estado de archivo).",
|
|
4055
|
+
"retiredHeading": "Pipelines retirados",
|
|
4056
|
+
"retiredDescription": "Estos pipelines integrados se han retirado del catálogo, así que no hay ninguna versión más reciente que adoptar. Quítalos de la biblioteca de este tablero.",
|
|
4057
|
+
"retiredNote": "Retirado del catálogo.",
|
|
4058
|
+
"retiredReplacedBy": "Retirado del catálogo. Usa {name} en su lugar.",
|
|
4047
4059
|
"reseedAll": "Regenerar todos ({count})",
|
|
4048
4060
|
"dismiss": "Descartar",
|
|
4049
4061
|
"done": "Hecho",
|
|
4050
4062
|
"toast": {
|
|
4051
4063
|
"reseedFailed": "No se pudo regenerar el pipeline",
|
|
4052
|
-
"deleteFailed": "No se pudo eliminar el pipeline"
|
|
4064
|
+
"deleteFailed": "No se pudo eliminar el pipeline",
|
|
4065
|
+
"removeFailed": "No se pudo quitar el pipeline"
|
|
4053
4066
|
}
|
|
4054
4067
|
}
|
|
4055
4068
|
},
|
package/i18n/locales/fr.json
CHANGED
|
@@ -514,7 +514,10 @@
|
|
|
514
514
|
"env_test_not_provisionable": "Gestionnaire d'environnement non configuré",
|
|
515
515
|
"env_test_no_vcs": "Fournisseur Git non connecté",
|
|
516
516
|
"env_test_connection_failed": "Échec de la connexion à l'environnement",
|
|
517
|
-
"prompt_revision_conflict": "Invite modifiée par quelqu'un d'autre"
|
|
517
|
+
"prompt_revision_conflict": "Invite modifiée par quelqu'un d'autre",
|
|
518
|
+
"pipeline_schedule_attached": "Une planification récurrente utilise ce pipeline",
|
|
519
|
+
"pipeline_schedule_requires_recurring": "Une planification récurrente exige ce pipeline",
|
|
520
|
+
"pipeline_schedule_intake_unconfigured": "La planification n'a pas de collecte de tickets"
|
|
518
521
|
},
|
|
519
522
|
"description": {
|
|
520
523
|
"dependencies_unmet": "Cette tâche dépend d'autres qui ne sont pas encore terminées. Terminez-les ou débloquez-les, puis relancez-la.",
|
|
@@ -539,7 +542,10 @@
|
|
|
539
542
|
"env_test_no_vcs": "L'auto-test a besoin d'un fournisseur Git pour créer et supprimer sa branche jetable, mais cet espace de travail n'est connecté à aucun.",
|
|
540
543
|
"env_test_connection_failed": "Le gestionnaire d'environnement de ce service a échoué à son test de connexion. Vérifiez son point de terminaison, ses identifiants et les paramètres du projet, puis retestez la connexion.",
|
|
541
544
|
"env_test_connection_failed_detail": "Le gestionnaire d'environnement de ce service a échoué à son test de connexion : {detail}. Vérifiez son point de terminaison, ses identifiants et les paramètres du projet, puis retestez la connexion.",
|
|
542
|
-
"prompt_revision_conflict": "Une autre modification de cette invite est arrivée en premier. Rechargez-la et réappliquez la vôtre par-dessus."
|
|
545
|
+
"prompt_revision_conflict": "Une autre modification de cette invite est arrivée en premier. Rechargez-la et réappliquez la vôtre par-dessus.",
|
|
546
|
+
"pipeline_schedule_attached": "Une planification récurrente pointe encore vers ce pipeline, et chaque exécution qu'elle lance le résout par son identifiant. Détachez ou supprimez d'abord cette planification, puis retirez le pipeline.",
|
|
547
|
+
"pipeline_schedule_requires_recurring": "Une planification récurrente pointe encore vers ce pipeline. Le limiter à une exécution unique casserait chaque exécution future. Détachez d'abord cette planification.",
|
|
548
|
+
"pipeline_schedule_intake_unconfigured": "Une étape de collecte de bogues tire son travail des réglages de collecte de tickets de la planification, et la planification associée n'en a aucun. Configurez d'abord la collecte de tickets sur la planification."
|
|
543
549
|
},
|
|
544
550
|
"action": {
|
|
545
551
|
"connectGitHub": "Connecter GitHub",
|
|
@@ -2697,6 +2703,7 @@
|
|
|
2697
2703
|
"directoryHelp": "Utilisé uniquement par la détection automatique : le sous-répertoire du monorepo où se trouve le stack compose.",
|
|
2698
2704
|
"composeFiles": "Fichiers Compose",
|
|
2699
2705
|
"composeFilesHelp": "Séparés par des virgules, relatifs au dépôt, dans l'ordre de surcharge.",
|
|
2706
|
+
"composeLayersManagedHelp": "Géré via l'API — cette pile comporte des couches fournies en ligne ou lues depuis un autre dépôt ; elles sont affichées en lecture seule ici et restent intactes à l'enregistrement.",
|
|
2700
2707
|
"composeProfiles": "Profils Compose (facultatif)",
|
|
2701
2708
|
"managedNetworks": "Réseaux gérés (facultatif)",
|
|
2702
2709
|
"managedNetworksHelp": "Réseaux que ce stack crée et possède pour que les consommateurs s'y connectent.",
|
|
@@ -4042,14 +4049,20 @@
|
|
|
4042
4049
|
"add": "Ajouter",
|
|
4043
4050
|
"reseed": "Régénérer",
|
|
4044
4051
|
"delete": "Supprimer",
|
|
4052
|
+
"remove": "Retirer",
|
|
4045
4053
|
"updatesHeading": "Mises à jour disponibles",
|
|
4046
4054
|
"updatesDescription": "Une version plus récente de ces pipelines intégrés est disponible. Régénérez-les pour l'adopter (vos étiquettes et l'état d'archivage sont conservés).",
|
|
4055
|
+
"retiredHeading": "Pipelines retirés",
|
|
4056
|
+
"retiredDescription": "Ces pipelines intégrés ont été retirés du catalogue, il n’y a donc aucune version plus récente à adopter. Retirez-les de la bibliothèque de ce tableau.",
|
|
4057
|
+
"retiredNote": "Retiré du catalogue.",
|
|
4058
|
+
"retiredReplacedBy": "Retiré du catalogue. Utilisez {name} à la place.",
|
|
4047
4059
|
"reseedAll": "Tout régénérer ({count})",
|
|
4048
4060
|
"dismiss": "Ignorer",
|
|
4049
4061
|
"done": "Terminé",
|
|
4050
4062
|
"toast": {
|
|
4051
4063
|
"reseedFailed": "Impossible de régénérer le pipeline",
|
|
4052
|
-
"deleteFailed": "Impossible de supprimer le pipeline"
|
|
4064
|
+
"deleteFailed": "Impossible de supprimer le pipeline",
|
|
4065
|
+
"removeFailed": "Impossible de retirer le pipeline"
|
|
4053
4066
|
}
|
|
4054
4067
|
}
|
|
4055
4068
|
},
|
package/i18n/locales/he.json
CHANGED
|
@@ -514,7 +514,10 @@
|
|
|
514
514
|
"env_test_not_provisionable": "מטפל הסביבה אינו מוגדר",
|
|
515
515
|
"env_test_no_vcs": "ספק Git אינו מחובר",
|
|
516
516
|
"env_test_connection_failed": "החיבור לסביבה נכשל",
|
|
517
|
-
"prompt_revision_conflict": "ההנחיה שונתה על ידי מישהו אחר"
|
|
517
|
+
"prompt_revision_conflict": "ההנחיה שונתה על ידי מישהו אחר",
|
|
518
|
+
"pipeline_schedule_attached": "תזמון חוזר משתמש בצינור הזה",
|
|
519
|
+
"pipeline_schedule_requires_recurring": "תזמון חוזר זקוק לצינור הזה",
|
|
520
|
+
"pipeline_schedule_intake_unconfigured": "לתזמון אין קליטת פניות"
|
|
518
521
|
},
|
|
519
522
|
"description": {
|
|
520
523
|
"dependencies_unmet": "משימה זו תלויה במשימות אחרות שטרם הושלמו. השלם או שחרר אותן, ולאחר מכן הפעל אותה שוב.",
|
|
@@ -539,7 +542,10 @@
|
|
|
539
542
|
"env_test_no_vcs": "הבדיקה העצמית זקוקה לספק Git כדי ליצור ולמחוק את הענף החד-פעמי שלה, אך סביבת עבודה זו אינה מחוברת לאף אחד.",
|
|
540
543
|
"env_test_connection_failed": "מנהל הסביבה של שירות זה נכשל בבדיקת החיבור. בדקו את נקודת הקצה, פרטי ההזדהות והגדרות הפרויקט, ולאחר מכן בדקו שוב את החיבור.",
|
|
541
544
|
"env_test_connection_failed_detail": "מנהל הסביבה של שירות זה נכשל בבדיקת החיבור: {detail}. בדקו את נקודת הקצה, פרטי ההזדהות והגדרות הפרויקט, ולאחר מכן בדקו שוב את החיבור.",
|
|
542
|
-
"prompt_revision_conflict": "עריכה אחרת של ההנחיה הזו נקלטה קודם. טענו אותה מחדש והחילו את השינוי שלכם מעליה."
|
|
545
|
+
"prompt_revision_conflict": "עריכה אחרת של ההנחיה הזו נקלטה קודם. טענו אותה מחדש והחילו את השינוי שלכם מעליה.",
|
|
546
|
+
"pipeline_schedule_attached": "תזמון חוזר עדיין מפנה לצינור הזה, וכל הרצה שהוא מתחיל מאתרת את הצינור לפי המזהה. נתקו או מחקו קודם את התזמון ההוא, ורק אז הסירו את הצינור.",
|
|
547
|
+
"pipeline_schedule_requires_recurring": "תזמון חוזר עדיין מפנה לצינור הזה, ולכן הפיכתו לחד פעמי בלבד תשבור כל הרצה עתידית. נתקו קודם את התזמון ההוא.",
|
|
548
|
+
"pipeline_schedule_intake_unconfigured": "שלב קליטת באגים שואב את עבודתו מהגדרות קליטת הפניות של התזמון, ולתזמון המקושר אין כאלה. הגדירו קודם קליטת פניות בתזמון."
|
|
543
549
|
},
|
|
544
550
|
"action": {
|
|
545
551
|
"connectGitHub": "חבר את GitHub",
|
|
@@ -2837,6 +2843,7 @@
|
|
|
2837
2843
|
"directoryHelp": "בשימוש רק על ידי הזיהוי האוטומטי: תת-הספרייה במונורפו שבה נמצא מקבץ ה-compose.",
|
|
2838
2844
|
"composeFiles": "קובצי Compose",
|
|
2839
2845
|
"composeFilesHelp": "מופרדים בפסיקים, יחסית למאגר, לפי סדר הדריסה.",
|
|
2846
|
+
"composeLayersManagedHelp": "מנוהל דרך ה-API — למחסנית הזו יש שכבות שסופקו בתוך ההגדרה או נקראות ממאגר אחר, ולכן הן מוצגות כאן לקריאה בלבד ונשארות ללא שינוי בשמירה.",
|
|
2840
2847
|
"composeProfiles": "פרופילי Compose (אופציונלי)",
|
|
2841
2848
|
"managedNetworks": "רשתות מנוהלות (אופציונלי)",
|
|
2842
2849
|
"managedNetworksHelp": "רשתות שהמקבץ יוצר ומחזיק כדי שצרכנים יתחברו אליהן.",
|
|
@@ -4053,14 +4060,20 @@
|
|
|
4053
4060
|
"add": "הוסף",
|
|
4054
4061
|
"reseed": "זרע מחדש",
|
|
4055
4062
|
"delete": "מחק",
|
|
4063
|
+
"remove": "הסר",
|
|
4056
4064
|
"updatesHeading": "עדכונים זמינים",
|
|
4057
4065
|
"updatesDescription": "גרסה חדשה יותר של צינורות מובנים אלה שוחררה. זרע מחדש כדי לאמץ אותה (התוויות ומצב הארכוב שלך נשמרים).",
|
|
4066
|
+
"retiredHeading": "צינורות שהוצאו משימוש",
|
|
4067
|
+
"retiredDescription": "צינורות מובנים אלה הוסרו מהקטלוג, ולכן אין גרסה חדשה יותר לאמץ. הסר אותם מספריית הלוח הזה.",
|
|
4068
|
+
"retiredNote": "הוצא משימוש מהקטלוג.",
|
|
4069
|
+
"retiredReplacedBy": "הוצא משימוש מהקטלוג. השתמש ב-{name} במקומו.",
|
|
4058
4070
|
"reseedAll": "זרע מחדש הכל ({count})",
|
|
4059
4071
|
"dismiss": "התעלם",
|
|
4060
4072
|
"done": "בוצע",
|
|
4061
4073
|
"toast": {
|
|
4062
4074
|
"reseedFailed": "לא ניתן לזרוע מחדש את הצינור",
|
|
4063
|
-
"deleteFailed": "לא ניתן למחוק את הצינור"
|
|
4075
|
+
"deleteFailed": "לא ניתן למחוק את הצינור",
|
|
4076
|
+
"removeFailed": "לא ניתן היה להסיר את הצינור"
|
|
4064
4077
|
}
|
|
4065
4078
|
}
|
|
4066
4079
|
},
|
package/i18n/locales/it.json
CHANGED
|
@@ -630,6 +630,7 @@
|
|
|
630
630
|
"directoryHelp": "Usato solo dal rilevamento automatico: la sottodirectory del monorepo in cui si trova lo stack compose.",
|
|
631
631
|
"composeFiles": "File compose",
|
|
632
632
|
"composeFilesHelp": "Separati da virgola, relativi al repository, in ordine di override.",
|
|
633
|
+
"composeLayersManagedHelp": "Gestito tramite API: questo stack ha livelli forniti inline o letti da un altro repository, quindi qui sono mostrati in sola lettura e restano invariati al salvataggio.",
|
|
633
634
|
"composeProfiles": "Profili compose (facoltativo)",
|
|
634
635
|
"managedNetworks": "Reti gestite (facoltativo)",
|
|
635
636
|
"managedNetworksHelp": "Reti che questo stack crea e possiede affinche i consumatori vi si colleghino.",
|
|
@@ -3726,14 +3727,20 @@
|
|
|
3726
3727
|
"add": "Aggiungi",
|
|
3727
3728
|
"reseed": "Ripristina",
|
|
3728
3729
|
"delete": "Elimina",
|
|
3730
|
+
"remove": "Rimuovi",
|
|
3729
3731
|
"updatesHeading": "Aggiornamenti disponibili",
|
|
3730
3732
|
"updatesDescription": "E stata rilasciata una versione piu recente di queste pipeline integrate. Ripristinale per adottarla (le tue etichette e lo stato di archiviazione vengono mantenuti).",
|
|
3733
|
+
"retiredHeading": "Pipeline ritirate",
|
|
3734
|
+
"retiredDescription": "Queste pipeline integrate sono state ritirate dal catalogo, quindi non esiste una versione piu recente da adottare. Rimuovile dalla libreria di questa board.",
|
|
3735
|
+
"retiredNote": "Ritirata dal catalogo.",
|
|
3736
|
+
"retiredReplacedBy": "Ritirata dal catalogo. Usa {name} al suo posto.",
|
|
3731
3737
|
"reseedAll": "Ripristina tutte ({count})",
|
|
3732
3738
|
"dismiss": "Ignora",
|
|
3733
3739
|
"done": "Fatto",
|
|
3734
3740
|
"toast": {
|
|
3735
3741
|
"reseedFailed": "Impossibile ripristinare la pipeline",
|
|
3736
|
-
"deleteFailed": "Impossibile eliminare la pipeline"
|
|
3742
|
+
"deleteFailed": "Impossibile eliminare la pipeline",
|
|
3743
|
+
"removeFailed": "Impossibile rimuovere la pipeline"
|
|
3737
3744
|
}
|
|
3738
3745
|
}
|
|
3739
3746
|
},
|
|
@@ -4630,7 +4637,10 @@
|
|
|
4630
4637
|
"env_test_not_provisionable": "Handler dell'ambiente non configurato",
|
|
4631
4638
|
"env_test_no_vcs": "Provider Git non connesso",
|
|
4632
4639
|
"env_test_connection_failed": "Connessione all'ambiente non riuscita",
|
|
4633
|
-
"prompt_revision_conflict": "Prompt modificato da qualcun altro"
|
|
4640
|
+
"prompt_revision_conflict": "Prompt modificato da qualcun altro",
|
|
4641
|
+
"pipeline_schedule_attached": "Una pianificazione ricorrente usa questa pipeline",
|
|
4642
|
+
"pipeline_schedule_requires_recurring": "Una pianificazione ricorrente richiede questa pipeline",
|
|
4643
|
+
"pipeline_schedule_intake_unconfigured": "La pianificazione non ha raccolta ticket"
|
|
4634
4644
|
},
|
|
4635
4645
|
"description": {
|
|
4636
4646
|
"dependencies_unmet": "Questa attività dipende da altre non ancora completate. Completale o sbloccale, poi avviala di nuovo.",
|
|
@@ -4655,7 +4665,10 @@
|
|
|
4655
4665
|
"env_test_no_vcs": "L'autotest ha bisogno di un provider Git per creare ed eliminare il suo branch usa e getta, ma questo workspace non è collegato a nessuno.",
|
|
4656
4666
|
"env_test_connection_failed": "Il gestore dell'ambiente di questo servizio non ha superato il test di connessione. Controlla endpoint, credenziali e impostazioni del progetto, poi ripeti il test della connessione.",
|
|
4657
4667
|
"env_test_connection_failed_detail": "Il gestore dell'ambiente di questo servizio non ha superato il test di connessione: {detail}. Controlla endpoint, credenziali e impostazioni del progetto, poi ripeti il test della connessione.",
|
|
4658
|
-
"prompt_revision_conflict": "Un'altra modifica a questo prompt è arrivata prima. Ricaricalo e riapplica la tua sopra."
|
|
4668
|
+
"prompt_revision_conflict": "Un'altra modifica a questo prompt è arrivata prima. Ricaricalo e riapplica la tua sopra.",
|
|
4669
|
+
"pipeline_schedule_attached": "Una pianificazione ricorrente punta ancora a questa pipeline e ogni esecuzione che avvia la risolve tramite id. Scollega o elimina prima quella pianificazione, poi rimuovi la pipeline.",
|
|
4670
|
+
"pipeline_schedule_requires_recurring": "Una pianificazione ricorrente punta ancora a questa pipeline, quindi renderla solo una tantum interromperebbe ogni esecuzione futura. Scollega prima quella pianificazione.",
|
|
4671
|
+
"pipeline_schedule_intake_unconfigured": "Un passo di raccolta bug prende il lavoro dalle impostazioni di raccolta ticket della pianificazione, e la pianificazione collegata non le ha. Configura prima la raccolta ticket sulla pianificazione."
|
|
4659
4672
|
},
|
|
4660
4673
|
"action": {
|
|
4661
4674
|
"connectGitHub": "Collega GitHub",
|
package/i18n/locales/ja.json
CHANGED
|
@@ -514,7 +514,10 @@
|
|
|
514
514
|
"env_test_not_provisionable": "環境ハンドラーが設定されていません",
|
|
515
515
|
"env_test_no_vcs": "Git プロバイダーが未接続です",
|
|
516
516
|
"env_test_connection_failed": "環境への接続に失敗しました",
|
|
517
|
-
"prompt_revision_conflict": "別のユーザーがプロンプトを変更しました"
|
|
517
|
+
"prompt_revision_conflict": "別のユーザーがプロンプトを変更しました",
|
|
518
|
+
"pipeline_schedule_attached": "定期スケジュールがこのパイプラインを使用しています",
|
|
519
|
+
"pipeline_schedule_requires_recurring": "定期スケジュールにこのパイプラインが必要です",
|
|
520
|
+
"pipeline_schedule_intake_unconfigured": "スケジュールに課題取り込み設定がありません"
|
|
518
521
|
},
|
|
519
522
|
"description": {
|
|
520
523
|
"dependencies_unmet": "このタスクは、まだ完了していない他のタスクに依存しています。それらを完了または解除してから、もう一度開始してください。",
|
|
@@ -539,7 +542,10 @@
|
|
|
539
542
|
"env_test_no_vcs": "セルフテストは使い捨てブランチの作成と削除のために Git プロバイダーを必要としますが、このワークスペースはいずれにも接続されていません。",
|
|
540
543
|
"env_test_connection_failed": "このサービスの環境ハンドラーが接続テストに失敗しました。エンドポイント、認証情報、プロジェクト設定を確認してから、接続を再テストしてください。",
|
|
541
544
|
"env_test_connection_failed_detail": "このサービスの環境ハンドラーが接続テストに失敗しました: {detail}。エンドポイント、認証情報、プロジェクト設定を確認してから、接続を再テストしてください。",
|
|
542
|
-
"prompt_revision_conflict": "このプロンプトへの別の編集が先に反映されました。読み込み直して、その上に変更をやり直してください。"
|
|
545
|
+
"prompt_revision_conflict": "このプロンプトへの別の編集が先に反映されました。読み込み直して、その上に変更をやり直してください。",
|
|
546
|
+
"pipeline_schedule_attached": "定期スケジュールがまだこのパイプラインを参照しており、開始する実行はすべて ID でパイプラインを解決します。先にそのスケジュールを解除または削除してから、パイプラインを削除してください。",
|
|
547
|
+
"pipeline_schedule_requires_recurring": "定期スケジュールがまだこのパイプラインを参照しているため、単発専用にすると今後の実行がすべて失敗します。先にそのスケジュールを解除してください。",
|
|
548
|
+
"pipeline_schedule_intake_unconfigured": "バグ取り込みステップはスケジュールの課題取り込み設定から作業を取得しますが、関連付けられたスケジュールにその設定がありません。先にスケジュールで課題取り込みを設定してください。"
|
|
543
549
|
},
|
|
544
550
|
"action": {
|
|
545
551
|
"connectGitHub": "GitHub に接続",
|
|
@@ -2838,6 +2844,7 @@
|
|
|
2838
2844
|
"directoryHelp": "自動検出でのみ使用されます。compose スタックが存在するモノレポのサブディレクトリです。",
|
|
2839
2845
|
"composeFiles": "Compose ファイル",
|
|
2840
2846
|
"composeFilesHelp": "カンマ区切り、リポジトリ相対、オーバーライド順。",
|
|
2847
|
+
"composeLayersManagedHelp": "API で管理されています。このスタックにはインラインで指定された層、または別のリポジトリから読み込まれる層があるため、ここでは読み取り専用で表示され、保存時にも変更されません。",
|
|
2841
2848
|
"composeProfiles": "Compose プロファイル(任意)",
|
|
2842
2849
|
"managedNetworks": "マネージドネットワーク(任意)",
|
|
2843
2850
|
"managedNetworksHelp": "コンシューマーが接続するために、このスタックが作成・所有するネットワーク。",
|
|
@@ -4054,14 +4061,20 @@
|
|
|
4054
4061
|
"add": "追加",
|
|
4055
4062
|
"reseed": "再シード",
|
|
4056
4063
|
"delete": "削除",
|
|
4064
|
+
"remove": "削除",
|
|
4057
4065
|
"updatesHeading": "更新あり",
|
|
4058
4066
|
"updatesDescription": "これらのビルトインパイプラインの新しいバージョンが提供されました。再シードして取り込んでください(ラベルとアーカイブ状態は維持されます)。",
|
|
4067
|
+
"retiredHeading": "廃止されたパイプライン",
|
|
4068
|
+
"retiredDescription": "これらの組み込みパイプラインはカタログから撤回されたため、取り込める新しいバージョンはありません。このボードのライブラリから削除してください。",
|
|
4069
|
+
"retiredNote": "カタログから廃止されました。",
|
|
4070
|
+
"retiredReplacedBy": "カタログから廃止されました。代わりに{name}を使用してください。",
|
|
4059
4071
|
"reseedAll": "すべて再シード ({count})",
|
|
4060
4072
|
"dismiss": "閉じる",
|
|
4061
4073
|
"done": "完了",
|
|
4062
4074
|
"toast": {
|
|
4063
4075
|
"reseedFailed": "パイプラインを再シードできませんでした",
|
|
4064
|
-
"deleteFailed": "パイプラインを削除できませんでした"
|
|
4076
|
+
"deleteFailed": "パイプラインを削除できませんでした",
|
|
4077
|
+
"removeFailed": "パイプラインを削除できませんでした"
|
|
4065
4078
|
}
|
|
4066
4079
|
}
|
|
4067
4080
|
},
|
package/i18n/locales/pl.json
CHANGED
|
@@ -514,7 +514,10 @@
|
|
|
514
514
|
"env_test_not_provisionable": "Handler środowiska nie jest skonfigurowany",
|
|
515
515
|
"env_test_no_vcs": "Dostawca Git nie jest połączony",
|
|
516
516
|
"env_test_connection_failed": "Połączenie ze środowiskiem nie powiodło się",
|
|
517
|
-
"prompt_revision_conflict": "Prompt zmieniony przez kogoś innego"
|
|
517
|
+
"prompt_revision_conflict": "Prompt zmieniony przez kogoś innego",
|
|
518
|
+
"pipeline_schedule_attached": "Harmonogram cykliczny używa tego potoku",
|
|
519
|
+
"pipeline_schedule_requires_recurring": "Harmonogram cykliczny wymaga tego potoku",
|
|
520
|
+
"pipeline_schedule_intake_unconfigured": "Harmonogram nie ma pobierania zgłoszeń"
|
|
518
521
|
},
|
|
519
522
|
"description": {
|
|
520
523
|
"dependencies_unmet": "To zadanie zależy od innych, które nie zostały jeszcze ukończone. Ukończ je lub odblokuj, a następnie uruchom je ponownie.",
|
|
@@ -539,7 +542,10 @@
|
|
|
539
542
|
"env_test_no_vcs": "Autotest potrzebuje dostawcy Git, aby utworzyć i usunąć swoją jednorazową gałąź, ale ta przestrzeń robocza nie jest połączona z żadnym.",
|
|
540
543
|
"env_test_connection_failed": "Obsługa środowiska dla tej usługi nie przeszła testu połączenia. Sprawdź jej punkt końcowy, poświadczenia i ustawienia projektu, a następnie ponownie przetestuj połączenie.",
|
|
541
544
|
"env_test_connection_failed_detail": "Obsługa środowiska dla tej usługi nie przeszła testu połączenia: {detail}. Sprawdź jej punkt końcowy, poświadczenia i ustawienia projektu, a następnie ponownie przetestuj połączenie.",
|
|
542
|
-
"prompt_revision_conflict": "Inna zmiana tego promptu trafiła pierwsza. Wczytaj go ponownie i nanieś swoją zmianę na wierzch."
|
|
545
|
+
"prompt_revision_conflict": "Inna zmiana tego promptu trafiła pierwsza. Wczytaj go ponownie i nanieś swoją zmianę na wierzch.",
|
|
546
|
+
"pipeline_schedule_attached": "Harmonogram cykliczny nadal wskazuje ten potok, a każde uruchomienie odnajduje go po identyfikatorze. Najpierw odłącz lub usuń ten harmonogram, a dopiero potem usuń potok.",
|
|
547
|
+
"pipeline_schedule_requires_recurring": "Harmonogram cykliczny nadal wskazuje ten potok, więc ograniczenie go do jednorazowego zepsułoby każde przyszłe uruchomienie. Najpierw odłącz ten harmonogram.",
|
|
548
|
+
"pipeline_schedule_intake_unconfigured": "Krok pobierania błędów czerpie pracę z ustawień pobierania zgłoszeń harmonogramu, a powiązany harmonogram ich nie ma. Najpierw skonfiguruj pobieranie zgłoszeń w harmonogramie."
|
|
543
549
|
},
|
|
544
550
|
"action": {
|
|
545
551
|
"connectGitHub": "Połącz GitHub",
|
|
@@ -2697,6 +2703,7 @@
|
|
|
2697
2703
|
"directoryHelp": "Używane tylko przez automatyczne wykrywanie: podkatalog monorepo, w którym znajduje się stos compose.",
|
|
2698
2704
|
"composeFiles": "Pliki Compose",
|
|
2699
2705
|
"composeFilesHelp": "Rozdzielone przecinkami, względem repozytorium, w kolejności nadpisywania.",
|
|
2706
|
+
"composeLayersManagedHelp": "Zarządzane przez API — ten stos ma warstwy podane bezpośrednio lub odczytywane z innego repozytorium, więc są tu tylko do odczytu i pozostają nietknięte przy zapisie.",
|
|
2700
2707
|
"composeProfiles": "Profile Compose (opcjonalnie)",
|
|
2701
2708
|
"managedNetworks": "Zarządzane sieci (opcjonalnie)",
|
|
2702
2709
|
"managedNetworksHelp": "Sieci, które ten stos tworzy i posiada, aby konsumenci mogli się z nimi łączyć.",
|
|
@@ -4042,14 +4049,20 @@
|
|
|
4042
4049
|
"add": "Dodaj",
|
|
4043
4050
|
"reseed": "Zregeneruj",
|
|
4044
4051
|
"delete": "Usuń",
|
|
4052
|
+
"remove": "Usuń",
|
|
4045
4053
|
"updatesHeading": "Dostępne aktualizacje",
|
|
4046
4054
|
"updatesDescription": "Pojawiła się nowsza wersja tych wbudowanych pipeline'ów. Zregeneruj je, aby ją przyjąć (Twoje etykiety i stan archiwum zostaną zachowane).",
|
|
4055
|
+
"retiredHeading": "Wycofane pipeline’y",
|
|
4056
|
+
"retiredDescription": "Te wbudowane pipeline’y zostały wycofane z katalogu, więc nie ma nowszej wersji do przyjęcia. Usuń je z biblioteki tej tablicy.",
|
|
4057
|
+
"retiredNote": "Wycofany z katalogu.",
|
|
4058
|
+
"retiredReplacedBy": "Wycofany z katalogu. Użyj zamiast niego {name}.",
|
|
4047
4059
|
"reseedAll": "Zregeneruj wszystkie ({count})",
|
|
4048
4060
|
"dismiss": "Odrzuć",
|
|
4049
4061
|
"done": "Gotowe",
|
|
4050
4062
|
"toast": {
|
|
4051
4063
|
"reseedFailed": "Nie udało się zregenerować pipeline'u",
|
|
4052
|
-
"deleteFailed": "Nie udało się usunąć pipeline'u"
|
|
4064
|
+
"deleteFailed": "Nie udało się usunąć pipeline'u",
|
|
4065
|
+
"removeFailed": "Nie udało się usunąć pipeline’u"
|
|
4053
4066
|
}
|
|
4054
4067
|
}
|
|
4055
4068
|
},
|
package/i18n/locales/tr.json
CHANGED
|
@@ -514,7 +514,10 @@
|
|
|
514
514
|
"env_test_not_provisionable": "Ortam işleyicisi yapılandırılmamış",
|
|
515
515
|
"env_test_no_vcs": "Git sağlayıcısı bağlı değil",
|
|
516
516
|
"env_test_connection_failed": "Ortam bağlantısı başarısız",
|
|
517
|
-
"prompt_revision_conflict": "İstem başka biri tarafından değiştirildi"
|
|
517
|
+
"prompt_revision_conflict": "İstem başka biri tarafından değiştirildi",
|
|
518
|
+
"pipeline_schedule_attached": "Yinelenen bir zamanlama bu hattı kullanıyor",
|
|
519
|
+
"pipeline_schedule_requires_recurring": "Yinelenen bir zamanlama bu hatta ihtiyaç duyuyor",
|
|
520
|
+
"pipeline_schedule_intake_unconfigured": "Zamanlamada sorun alımı yok"
|
|
518
521
|
},
|
|
519
522
|
"description": {
|
|
520
523
|
"dependencies_unmet": "Bu görev henüz tamamlanmamış başka görevlere bağlı. Onları tamamla veya engelini kaldır, ardından yeniden başlat.",
|
|
@@ -539,7 +542,10 @@
|
|
|
539
542
|
"env_test_no_vcs": "Öz test, tek kullanımlık dalını oluşturup silmek için bir Git sağlayıcısına ihtiyaç duyar ancak bu çalışma alanı hiçbirine bağlı değil.",
|
|
540
543
|
"env_test_connection_failed": "Bu hizmetin ortam işleyicisi bağlantı testini geçemedi. Uç noktasını, kimlik bilgilerini ve proje ayarlarını kontrol edin, ardından bağlantıyı yeniden test edin.",
|
|
541
544
|
"env_test_connection_failed_detail": "Bu hizmetin ortam işleyicisi bağlantı testini geçemedi: {detail}. Uç noktasını, kimlik bilgilerini ve proje ayarlarını kontrol edin, ardından bağlantıyı yeniden test edin.",
|
|
542
|
-
"prompt_revision_conflict": "Bu isteme yapılan başka bir düzenleme önce ulaştı. Yeniden yükleyip değişikliğinizi onun üzerine uygulayın."
|
|
545
|
+
"prompt_revision_conflict": "Bu isteme yapılan başka bir düzenleme önce ulaştı. Yeniden yükleyip değişikliğinizi onun üzerine uygulayın.",
|
|
546
|
+
"pipeline_schedule_attached": "Yinelenen bir zamanlama hâlâ bu hattı gösteriyor ve başlattığı her çalışma hattı kimliğiyle çözümlüyor. Önce o zamanlamayı ayırın veya silin, sonra hattı kaldırın.",
|
|
547
|
+
"pipeline_schedule_requires_recurring": "Yinelenen bir zamanlama hâlâ bu hattı gösteriyor, bu yüzden yalnızca tek seferlik yapmak gelecekteki her çalışmayı bozar. Önce o zamanlamayı ayırın.",
|
|
548
|
+
"pipeline_schedule_intake_unconfigured": "Hata alımı adımı işini zamanlamanın sorun alımı ayarlarından alır ve bağlı zamanlamada bu ayar yok. Önce zamanlamada sorun alımını yapılandırın."
|
|
543
549
|
},
|
|
544
550
|
"action": {
|
|
545
551
|
"connectGitHub": "GitHub'ı bağla",
|
|
@@ -2838,6 +2844,7 @@
|
|
|
2838
2844
|
"directoryHelp": "Yalnızca otomatik algılama tarafından kullanılır: compose yığınının bulunduğu monorepo alt dizini.",
|
|
2839
2845
|
"composeFiles": "Compose dosyaları",
|
|
2840
2846
|
"composeFilesHelp": "Virgülle ayrılmış, depoya göreli, geçersiz kılma sırasında.",
|
|
2847
|
+
"composeLayersManagedHelp": "API üzerinden yönetilir — bu yığında satır içi verilen veya başka bir depodan okunan katmanlar var; burada salt okunur gösterilir ve kaydettiğinizde değiştirilmez.",
|
|
2841
2848
|
"composeProfiles": "Compose profilleri (isteğe bağlı)",
|
|
2842
2849
|
"managedNetworks": "Yönetilen ağlar (isteğe bağlı)",
|
|
2843
2850
|
"managedNetworksHelp": "Tüketicilerin bağlanması için bu yığının oluşturup sahip olduğu ağlar.",
|
|
@@ -4054,14 +4061,20 @@
|
|
|
4054
4061
|
"add": "Ekle",
|
|
4055
4062
|
"reseed": "Yeniden tohumla",
|
|
4056
4063
|
"delete": "Sil",
|
|
4064
|
+
"remove": "Kaldır",
|
|
4057
4065
|
"updatesHeading": "Güncellemeler mevcut",
|
|
4058
4066
|
"updatesDescription": "Bu yerleşik pipeline'ların daha yeni bir sürümü yayınlandı. Benimsemek için yeniden tohumlayın (etiketleriniz ve arşiv durumunuz korunur).",
|
|
4067
|
+
"retiredHeading": "Kullanımdan kaldırılan pipeline’lar",
|
|
4068
|
+
"retiredDescription": "Bu yerleşik pipeline’lar katalogdan çekildi, dolayısıyla benimsenecek daha yeni bir sürüm yok. Bu panonun kütüphanesinden kaldırın.",
|
|
4069
|
+
"retiredNote": "Katalogdan kaldırıldı.",
|
|
4070
|
+
"retiredReplacedBy": "Katalogdan kaldırıldı. Bunun yerine {name} kullanın.",
|
|
4059
4071
|
"reseedAll": "Tümünü yeniden tohumla ({count})",
|
|
4060
4072
|
"dismiss": "Yoksay",
|
|
4061
4073
|
"done": "Tamam",
|
|
4062
4074
|
"toast": {
|
|
4063
4075
|
"reseedFailed": "Pipeline yeniden tohumlanamadı",
|
|
4064
|
-
"deleteFailed": "Pipeline silinemedi"
|
|
4076
|
+
"deleteFailed": "Pipeline silinemedi",
|
|
4077
|
+
"removeFailed": "Pipeline kaldırılamadı"
|
|
4065
4078
|
}
|
|
4066
4079
|
}
|
|
4067
4080
|
},
|
package/i18n/locales/uk.json
CHANGED
|
@@ -514,7 +514,10 @@
|
|
|
514
514
|
"env_test_not_provisionable": "Обробник середовища не налаштовано",
|
|
515
515
|
"env_test_no_vcs": "Провайдер Git не підключено",
|
|
516
516
|
"env_test_connection_failed": "Не вдалося підключитися до середовища",
|
|
517
|
-
"prompt_revision_conflict": "Промпт змінив хтось інший"
|
|
517
|
+
"prompt_revision_conflict": "Промпт змінив хтось інший",
|
|
518
|
+
"pipeline_schedule_attached": "Повторюваний розклад використовує цей конвеєр",
|
|
519
|
+
"pipeline_schedule_requires_recurring": "Повторюваний розклад потребує цього конвеєра",
|
|
520
|
+
"pipeline_schedule_intake_unconfigured": "У розкладі немає збору звернень"
|
|
518
521
|
},
|
|
519
522
|
"description": {
|
|
520
523
|
"dependencies_unmet": "Це завдання залежить від інших, які ще не завершені. Заверши або розблокуй їх, а потім запусти його знову.",
|
|
@@ -539,7 +542,10 @@
|
|
|
539
542
|
"env_test_no_vcs": "Самоперевірці потрібен постачальник Git, щоб створити та видалити свою тимчасову гілку, але цей робочий простір не під'єднано до жодного.",
|
|
540
543
|
"env_test_connection_failed": "Обробник середовища для цієї служби не пройшов перевірку підключення. Перевірте його кінцеву точку, облікові дані та налаштування проєкту, а потім повторіть перевірку підключення.",
|
|
541
544
|
"env_test_connection_failed_detail": "Обробник середовища для цієї служби не пройшов перевірку підключення: {detail}. Перевірте його кінцеву точку, облікові дані та налаштування проєкту, а потім повторіть перевірку підключення.",
|
|
542
|
-
"prompt_revision_conflict": "Інша правка цього промпту надійшла першою. Перезавантажте його й накладіть свою зміну зверху."
|
|
545
|
+
"prompt_revision_conflict": "Інша правка цього промпту надійшла першою. Перезавантажте його й накладіть свою зміну зверху.",
|
|
546
|
+
"pipeline_schedule_attached": "Повторюваний розклад досі посилається на цей конвеєр, і кожен запуск знаходить його за ідентифікатором. Спершу відʼєднайте або видаліть цей розклад, а потім вилучіть конвеєр.",
|
|
547
|
+
"pipeline_schedule_requires_recurring": "Повторюваний розклад досі посилається на цей конвеєр, тож зробити його лише одноразовим зламало б кожен майбутній запуск. Спершу відʼєднайте цей розклад.",
|
|
548
|
+
"pipeline_schedule_intake_unconfigured": "Крок збору помилок бере роботу з налаштувань збору звернень у розкладі, а привʼязаний розклад їх не має. Спершу налаштуйте збір звернень у розкладі."
|
|
543
549
|
},
|
|
544
550
|
"action": {
|
|
545
551
|
"connectGitHub": "Під'єднати GitHub",
|
|
@@ -2697,6 +2703,7 @@
|
|
|
2697
2703
|
"directoryHelp": "Використовується лише автовизначенням: підкаталог монорепозиторію, де розташований стек compose.",
|
|
2698
2704
|
"composeFiles": "Файли Compose",
|
|
2699
2705
|
"composeFilesHelp": "Через кому, відносно репозиторію, у порядку перевизначення.",
|
|
2706
|
+
"composeLayersManagedHelp": "Керується через API — цей стек має шари, задані безпосередньо або зчитані з іншого репозиторію, тож тут вони показані лише для читання й не змінюються під час збереження.",
|
|
2700
2707
|
"composeProfiles": "Профілі Compose (необов'язково)",
|
|
2701
2708
|
"managedNetworks": "Керовані мережі (необов'язково)",
|
|
2702
2709
|
"managedNetworksHelp": "Мережі, які цей стек створює й якими володіє, щоб споживачі під'єднувалися до них.",
|
|
@@ -4042,14 +4049,20 @@
|
|
|
4042
4049
|
"add": "Додати",
|
|
4043
4050
|
"reseed": "Перегенерувати",
|
|
4044
4051
|
"delete": "Видалити",
|
|
4052
|
+
"remove": "Вилучити",
|
|
4045
4053
|
"updatesHeading": "Доступні оновлення",
|
|
4046
4054
|
"updatesDescription": "Вийшла новіша версія цих вбудованих пайплайнів. Перегенеруйте їх, щоб прийняти її (ваші мітки та стан архіву збережуться).",
|
|
4055
|
+
"retiredHeading": "Вилучені пайплайни",
|
|
4056
|
+
"retiredDescription": "Ці вбудовані пайплайни вилучено з каталогу, тож новішої версії для прийняття немає. Вилучіть їх з бібліотеки цієї дошки.",
|
|
4057
|
+
"retiredNote": "Вилучено з каталогу.",
|
|
4058
|
+
"retiredReplacedBy": "Вилучено з каталогу. Використовуйте натомість {name}.",
|
|
4047
4059
|
"reseedAll": "Перегенерувати всі ({count})",
|
|
4048
4060
|
"dismiss": "Відхилити",
|
|
4049
4061
|
"done": "Готово",
|
|
4050
4062
|
"toast": {
|
|
4051
4063
|
"reseedFailed": "Не вдалося перегенерувати пайплайн",
|
|
4052
|
-
"deleteFailed": "Не вдалося видалити пайплайн"
|
|
4064
|
+
"deleteFailed": "Не вдалося видалити пайплайн",
|
|
4065
|
+
"removeFailed": "Не вдалося вилучити пайплайн"
|
|
4053
4066
|
}
|
|
4054
4067
|
}
|
|
4055
4068
|
},
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cat-factory/app",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.190.0",
|
|
4
4
|
"description": "Reusable Nuxt layer for the Agent Architecture Board SPA (components, stores, composables, pages). Consume it from a thin deployment app via `extends: ['@cat-factory/app']` and point it at your backend with NUXT_PUBLIC_API_BASE. See deploy/frontend for an example.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"valibot": "^1.4.2",
|
|
41
41
|
"vue": "3.5.40",
|
|
42
42
|
"wretch": "^3.0.9",
|
|
43
|
-
"@cat-factory/contracts": "0.
|
|
43
|
+
"@cat-factory/contracts": "0.197.0"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
46
|
"@toad-contracts/testing": "0.3.2",
|