@cat-factory/app 0.188.0 → 0.189.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/composables/usePipelineErrorToast.ts +17 -0
- package/app/composables/usePipelineHealth.spec.ts +79 -7
- package/app/composables/usePipelineHealth.ts +70 -3
- package/app/stores/pipelines.ts +21 -3
- package/app/stores/workspace/hydrate.ts +5 -1
- package/i18n/locales/de.json +15 -3
- package/i18n/locales/en.json +15 -3
- package/i18n/locales/es.json +15 -3
- package/i18n/locales/fr.json +15 -3
- package/i18n/locales/he.json +15 -3
- package/i18n/locales/it.json +15 -3
- package/i18n/locales/ja.json +15 -3
- package/i18n/locales/pl.json +15 -3
- package/i18n/locales/tr.json +15 -3
- package/i18n/locales/uk.json +15 -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">
|
|
@@ -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
|
}
|
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
|
@@ -3726,14 +3726,20 @@
|
|
|
3726
3726
|
"add": "Hinzufügen",
|
|
3727
3727
|
"reseed": "Neu aufsetzen",
|
|
3728
3728
|
"delete": "Löschen",
|
|
3729
|
+
"remove": "Entfernen",
|
|
3729
3730
|
"updatesHeading": "Updates verfügbar",
|
|
3730
3731
|
"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).",
|
|
3732
|
+
"retiredHeading": "Ausgemusterte Pipelines",
|
|
3733
|
+
"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.",
|
|
3734
|
+
"retiredNote": "Aus dem Katalog zurückgezogen.",
|
|
3735
|
+
"retiredReplacedBy": "Aus dem Katalog zurückgezogen. Verwenden Sie stattdessen {name}.",
|
|
3731
3736
|
"reseedAll": "Alle neu aufsetzen ({count})",
|
|
3732
3737
|
"dismiss": "Verwerfen",
|
|
3733
3738
|
"done": "Fertig",
|
|
3734
3739
|
"toast": {
|
|
3735
3740
|
"reseedFailed": "Pipeline konnte nicht neu aufgesetzt werden",
|
|
3736
|
-
"deleteFailed": "Pipeline konnte nicht gelöscht werden"
|
|
3741
|
+
"deleteFailed": "Pipeline konnte nicht gelöscht werden",
|
|
3742
|
+
"removeFailed": "Pipeline konnte nicht entfernt werden"
|
|
3737
3743
|
}
|
|
3738
3744
|
}
|
|
3739
3745
|
},
|
|
@@ -4630,7 +4636,10 @@
|
|
|
4630
4636
|
"env_test_not_provisionable": "Umgebungs-Handler nicht konfiguriert",
|
|
4631
4637
|
"env_test_no_vcs": "Git-Anbieter nicht verbunden",
|
|
4632
4638
|
"env_test_connection_failed": "Umgebungsverbindung fehlgeschlagen",
|
|
4633
|
-
"prompt_revision_conflict": "Prompt von jemand anderem geändert"
|
|
4639
|
+
"prompt_revision_conflict": "Prompt von jemand anderem geändert",
|
|
4640
|
+
"pipeline_schedule_attached": "Wiederkehrender Zeitplan nutzt diese Pipeline",
|
|
4641
|
+
"pipeline_schedule_requires_recurring": "Wiederkehrender Zeitplan braucht diese Pipeline",
|
|
4642
|
+
"pipeline_schedule_intake_unconfigured": "Zeitplan ohne Ticket-Erfassung"
|
|
4634
4643
|
},
|
|
4635
4644
|
"description": {
|
|
4636
4645
|
"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 +4664,10 @@
|
|
|
4655
4664
|
"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
4665
|
"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
4666
|
"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."
|
|
4667
|
+
"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
|
+
"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.",
|
|
4669
|
+
"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.",
|
|
4670
|
+
"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
4671
|
},
|
|
4660
4672
|
"action": {
|
|
4661
4673
|
"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",
|
|
@@ -4157,14 +4163,20 @@
|
|
|
4157
4163
|
"add": "Add",
|
|
4158
4164
|
"reseed": "Reseed",
|
|
4159
4165
|
"delete": "Delete",
|
|
4166
|
+
"remove": "Remove",
|
|
4160
4167
|
"updatesHeading": "Updates available",
|
|
4161
4168
|
"updatesDescription": "A newer version of these built-in pipelines has shipped. Reseed to adopt it (your labels and archive state are kept).",
|
|
4169
|
+
"retiredHeading": "Retired pipelines",
|
|
4170
|
+
"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.",
|
|
4171
|
+
"retiredNote": "Retired from the catalog.",
|
|
4172
|
+
"retiredReplacedBy": "Retired from the catalog. Use {name} instead.",
|
|
4162
4173
|
"reseedAll": "Reseed all ({count})",
|
|
4163
4174
|
"dismiss": "Dismiss",
|
|
4164
4175
|
"done": "Done",
|
|
4165
4176
|
"toast": {
|
|
4166
4177
|
"reseedFailed": "Could not reseed pipeline",
|
|
4167
|
-
"deleteFailed": "Could not delete pipeline"
|
|
4178
|
+
"deleteFailed": "Could not delete pipeline",
|
|
4179
|
+
"removeFailed": "Could not remove pipeline"
|
|
4168
4180
|
}
|
|
4169
4181
|
}
|
|
4170
4182
|
},
|
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",
|
|
@@ -4042,14 +4048,20 @@
|
|
|
4042
4048
|
"add": "Añadir",
|
|
4043
4049
|
"reseed": "Regenerar",
|
|
4044
4050
|
"delete": "Eliminar",
|
|
4051
|
+
"remove": "Quitar",
|
|
4045
4052
|
"updatesHeading": "Actualizaciones disponibles",
|
|
4046
4053
|
"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).",
|
|
4054
|
+
"retiredHeading": "Pipelines retirados",
|
|
4055
|
+
"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.",
|
|
4056
|
+
"retiredNote": "Retirado del catálogo.",
|
|
4057
|
+
"retiredReplacedBy": "Retirado del catálogo. Usa {name} en su lugar.",
|
|
4047
4058
|
"reseedAll": "Regenerar todos ({count})",
|
|
4048
4059
|
"dismiss": "Descartar",
|
|
4049
4060
|
"done": "Hecho",
|
|
4050
4061
|
"toast": {
|
|
4051
4062
|
"reseedFailed": "No se pudo regenerar el pipeline",
|
|
4052
|
-
"deleteFailed": "No se pudo eliminar el pipeline"
|
|
4063
|
+
"deleteFailed": "No se pudo eliminar el pipeline",
|
|
4064
|
+
"removeFailed": "No se pudo quitar el pipeline"
|
|
4053
4065
|
}
|
|
4054
4066
|
}
|
|
4055
4067
|
},
|
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",
|
|
@@ -4042,14 +4048,20 @@
|
|
|
4042
4048
|
"add": "Ajouter",
|
|
4043
4049
|
"reseed": "Régénérer",
|
|
4044
4050
|
"delete": "Supprimer",
|
|
4051
|
+
"remove": "Retirer",
|
|
4045
4052
|
"updatesHeading": "Mises à jour disponibles",
|
|
4046
4053
|
"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).",
|
|
4054
|
+
"retiredHeading": "Pipelines retirés",
|
|
4055
|
+
"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.",
|
|
4056
|
+
"retiredNote": "Retiré du catalogue.",
|
|
4057
|
+
"retiredReplacedBy": "Retiré du catalogue. Utilisez {name} à la place.",
|
|
4047
4058
|
"reseedAll": "Tout régénérer ({count})",
|
|
4048
4059
|
"dismiss": "Ignorer",
|
|
4049
4060
|
"done": "Terminé",
|
|
4050
4061
|
"toast": {
|
|
4051
4062
|
"reseedFailed": "Impossible de régénérer le pipeline",
|
|
4052
|
-
"deleteFailed": "Impossible de supprimer le pipeline"
|
|
4063
|
+
"deleteFailed": "Impossible de supprimer le pipeline",
|
|
4064
|
+
"removeFailed": "Impossible de retirer le pipeline"
|
|
4053
4065
|
}
|
|
4054
4066
|
}
|
|
4055
4067
|
},
|
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",
|
|
@@ -4053,14 +4059,20 @@
|
|
|
4053
4059
|
"add": "הוסף",
|
|
4054
4060
|
"reseed": "זרע מחדש",
|
|
4055
4061
|
"delete": "מחק",
|
|
4062
|
+
"remove": "הסר",
|
|
4056
4063
|
"updatesHeading": "עדכונים זמינים",
|
|
4057
4064
|
"updatesDescription": "גרסה חדשה יותר של צינורות מובנים אלה שוחררה. זרע מחדש כדי לאמץ אותה (התוויות ומצב הארכוב שלך נשמרים).",
|
|
4065
|
+
"retiredHeading": "צינורות שהוצאו משימוש",
|
|
4066
|
+
"retiredDescription": "צינורות מובנים אלה הוסרו מהקטלוג, ולכן אין גרסה חדשה יותר לאמץ. הסר אותם מספריית הלוח הזה.",
|
|
4067
|
+
"retiredNote": "הוצא משימוש מהקטלוג.",
|
|
4068
|
+
"retiredReplacedBy": "הוצא משימוש מהקטלוג. השתמש ב-{name} במקומו.",
|
|
4058
4069
|
"reseedAll": "זרע מחדש הכל ({count})",
|
|
4059
4070
|
"dismiss": "התעלם",
|
|
4060
4071
|
"done": "בוצע",
|
|
4061
4072
|
"toast": {
|
|
4062
4073
|
"reseedFailed": "לא ניתן לזרוע מחדש את הצינור",
|
|
4063
|
-
"deleteFailed": "לא ניתן למחוק את הצינור"
|
|
4074
|
+
"deleteFailed": "לא ניתן למחוק את הצינור",
|
|
4075
|
+
"removeFailed": "לא ניתן היה להסיר את הצינור"
|
|
4064
4076
|
}
|
|
4065
4077
|
}
|
|
4066
4078
|
},
|
package/i18n/locales/it.json
CHANGED
|
@@ -3726,14 +3726,20 @@
|
|
|
3726
3726
|
"add": "Aggiungi",
|
|
3727
3727
|
"reseed": "Ripristina",
|
|
3728
3728
|
"delete": "Elimina",
|
|
3729
|
+
"remove": "Rimuovi",
|
|
3729
3730
|
"updatesHeading": "Aggiornamenti disponibili",
|
|
3730
3731
|
"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).",
|
|
3732
|
+
"retiredHeading": "Pipeline ritirate",
|
|
3733
|
+
"retiredDescription": "Queste pipeline integrate sono state ritirate dal catalogo, quindi non esiste una versione piu recente da adottare. Rimuovile dalla libreria di questa board.",
|
|
3734
|
+
"retiredNote": "Ritirata dal catalogo.",
|
|
3735
|
+
"retiredReplacedBy": "Ritirata dal catalogo. Usa {name} al suo posto.",
|
|
3731
3736
|
"reseedAll": "Ripristina tutte ({count})",
|
|
3732
3737
|
"dismiss": "Ignora",
|
|
3733
3738
|
"done": "Fatto",
|
|
3734
3739
|
"toast": {
|
|
3735
3740
|
"reseedFailed": "Impossibile ripristinare la pipeline",
|
|
3736
|
-
"deleteFailed": "Impossibile eliminare la pipeline"
|
|
3741
|
+
"deleteFailed": "Impossibile eliminare la pipeline",
|
|
3742
|
+
"removeFailed": "Impossibile rimuovere la pipeline"
|
|
3737
3743
|
}
|
|
3738
3744
|
}
|
|
3739
3745
|
},
|
|
@@ -4630,7 +4636,10 @@
|
|
|
4630
4636
|
"env_test_not_provisionable": "Handler dell'ambiente non configurato",
|
|
4631
4637
|
"env_test_no_vcs": "Provider Git non connesso",
|
|
4632
4638
|
"env_test_connection_failed": "Connessione all'ambiente non riuscita",
|
|
4633
|
-
"prompt_revision_conflict": "Prompt modificato da qualcun altro"
|
|
4639
|
+
"prompt_revision_conflict": "Prompt modificato da qualcun altro",
|
|
4640
|
+
"pipeline_schedule_attached": "Una pianificazione ricorrente usa questa pipeline",
|
|
4641
|
+
"pipeline_schedule_requires_recurring": "Una pianificazione ricorrente richiede questa pipeline",
|
|
4642
|
+
"pipeline_schedule_intake_unconfigured": "La pianificazione non ha raccolta ticket"
|
|
4634
4643
|
},
|
|
4635
4644
|
"description": {
|
|
4636
4645
|
"dependencies_unmet": "Questa attività dipende da altre non ancora completate. Completale o sbloccale, poi avviala di nuovo.",
|
|
@@ -4655,7 +4664,10 @@
|
|
|
4655
4664
|
"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
4665
|
"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
4666
|
"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."
|
|
4667
|
+
"prompt_revision_conflict": "Un'altra modifica a questo prompt è arrivata prima. Ricaricalo e riapplica la tua sopra.",
|
|
4668
|
+
"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.",
|
|
4669
|
+
"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.",
|
|
4670
|
+
"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
4671
|
},
|
|
4660
4672
|
"action": {
|
|
4661
4673
|
"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 に接続",
|
|
@@ -4054,14 +4060,20 @@
|
|
|
4054
4060
|
"add": "追加",
|
|
4055
4061
|
"reseed": "再シード",
|
|
4056
4062
|
"delete": "削除",
|
|
4063
|
+
"remove": "削除",
|
|
4057
4064
|
"updatesHeading": "更新あり",
|
|
4058
4065
|
"updatesDescription": "これらのビルトインパイプラインの新しいバージョンが提供されました。再シードして取り込んでください(ラベルとアーカイブ状態は維持されます)。",
|
|
4066
|
+
"retiredHeading": "廃止されたパイプライン",
|
|
4067
|
+
"retiredDescription": "これらの組み込みパイプラインはカタログから撤回されたため、取り込める新しいバージョンはありません。このボードのライブラリから削除してください。",
|
|
4068
|
+
"retiredNote": "カタログから廃止されました。",
|
|
4069
|
+
"retiredReplacedBy": "カタログから廃止されました。代わりに{name}を使用してください。",
|
|
4059
4070
|
"reseedAll": "すべて再シード ({count})",
|
|
4060
4071
|
"dismiss": "閉じる",
|
|
4061
4072
|
"done": "完了",
|
|
4062
4073
|
"toast": {
|
|
4063
4074
|
"reseedFailed": "パイプラインを再シードできませんでした",
|
|
4064
|
-
"deleteFailed": "パイプラインを削除できませんでした"
|
|
4075
|
+
"deleteFailed": "パイプラインを削除できませんでした",
|
|
4076
|
+
"removeFailed": "パイプラインを削除できませんでした"
|
|
4065
4077
|
}
|
|
4066
4078
|
}
|
|
4067
4079
|
},
|
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",
|
|
@@ -4042,14 +4048,20 @@
|
|
|
4042
4048
|
"add": "Dodaj",
|
|
4043
4049
|
"reseed": "Zregeneruj",
|
|
4044
4050
|
"delete": "Usuń",
|
|
4051
|
+
"remove": "Usuń",
|
|
4045
4052
|
"updatesHeading": "Dostępne aktualizacje",
|
|
4046
4053
|
"updatesDescription": "Pojawiła się nowsza wersja tych wbudowanych pipeline'ów. Zregeneruj je, aby ją przyjąć (Twoje etykiety i stan archiwum zostaną zachowane).",
|
|
4054
|
+
"retiredHeading": "Wycofane pipeline’y",
|
|
4055
|
+
"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.",
|
|
4056
|
+
"retiredNote": "Wycofany z katalogu.",
|
|
4057
|
+
"retiredReplacedBy": "Wycofany z katalogu. Użyj zamiast niego {name}.",
|
|
4047
4058
|
"reseedAll": "Zregeneruj wszystkie ({count})",
|
|
4048
4059
|
"dismiss": "Odrzuć",
|
|
4049
4060
|
"done": "Gotowe",
|
|
4050
4061
|
"toast": {
|
|
4051
4062
|
"reseedFailed": "Nie udało się zregenerować pipeline'u",
|
|
4052
|
-
"deleteFailed": "Nie udało się usunąć pipeline'u"
|
|
4063
|
+
"deleteFailed": "Nie udało się usunąć pipeline'u",
|
|
4064
|
+
"removeFailed": "Nie udało się usunąć pipeline’u"
|
|
4053
4065
|
}
|
|
4054
4066
|
}
|
|
4055
4067
|
},
|
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",
|
|
@@ -4054,14 +4060,20 @@
|
|
|
4054
4060
|
"add": "Ekle",
|
|
4055
4061
|
"reseed": "Yeniden tohumla",
|
|
4056
4062
|
"delete": "Sil",
|
|
4063
|
+
"remove": "Kaldır",
|
|
4057
4064
|
"updatesHeading": "Güncellemeler mevcut",
|
|
4058
4065
|
"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).",
|
|
4066
|
+
"retiredHeading": "Kullanımdan kaldırılan pipeline’lar",
|
|
4067
|
+
"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.",
|
|
4068
|
+
"retiredNote": "Katalogdan kaldırıldı.",
|
|
4069
|
+
"retiredReplacedBy": "Katalogdan kaldırıldı. Bunun yerine {name} kullanın.",
|
|
4059
4070
|
"reseedAll": "Tümünü yeniden tohumla ({count})",
|
|
4060
4071
|
"dismiss": "Yoksay",
|
|
4061
4072
|
"done": "Tamam",
|
|
4062
4073
|
"toast": {
|
|
4063
4074
|
"reseedFailed": "Pipeline yeniden tohumlanamadı",
|
|
4064
|
-
"deleteFailed": "Pipeline silinemedi"
|
|
4075
|
+
"deleteFailed": "Pipeline silinemedi",
|
|
4076
|
+
"removeFailed": "Pipeline kaldırılamadı"
|
|
4065
4077
|
}
|
|
4066
4078
|
}
|
|
4067
4079
|
},
|
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",
|
|
@@ -4042,14 +4048,20 @@
|
|
|
4042
4048
|
"add": "Додати",
|
|
4043
4049
|
"reseed": "Перегенерувати",
|
|
4044
4050
|
"delete": "Видалити",
|
|
4051
|
+
"remove": "Вилучити",
|
|
4045
4052
|
"updatesHeading": "Доступні оновлення",
|
|
4046
4053
|
"updatesDescription": "Вийшла новіша версія цих вбудованих пайплайнів. Перегенеруйте їх, щоб прийняти її (ваші мітки та стан архіву збережуться).",
|
|
4054
|
+
"retiredHeading": "Вилучені пайплайни",
|
|
4055
|
+
"retiredDescription": "Ці вбудовані пайплайни вилучено з каталогу, тож новішої версії для прийняття немає. Вилучіть їх з бібліотеки цієї дошки.",
|
|
4056
|
+
"retiredNote": "Вилучено з каталогу.",
|
|
4057
|
+
"retiredReplacedBy": "Вилучено з каталогу. Використовуйте натомість {name}.",
|
|
4047
4058
|
"reseedAll": "Перегенерувати всі ({count})",
|
|
4048
4059
|
"dismiss": "Відхилити",
|
|
4049
4060
|
"done": "Готово",
|
|
4050
4061
|
"toast": {
|
|
4051
4062
|
"reseedFailed": "Не вдалося перегенерувати пайплайн",
|
|
4052
|
-
"deleteFailed": "Не вдалося видалити пайплайн"
|
|
4063
|
+
"deleteFailed": "Не вдалося видалити пайплайн",
|
|
4064
|
+
"removeFailed": "Не вдалося вилучити пайплайн"
|
|
4053
4065
|
}
|
|
4054
4066
|
}
|
|
4055
4067
|
},
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cat-factory/app",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.189.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.196.0"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
46
|
"@toad-contracts/testing": "0.3.2",
|