@cat-factory/app 0.68.0 → 0.69.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/board/AddTaskModal.vue +35 -8
- package/app/components/bootstrap/BootstrapModal.vue +16 -1
- package/app/components/github/AddServiceFromRepoModal.vue +16 -0
- package/app/components/settings/KubernetesEngineForm.vue +23 -1
- package/app/components/settings/KubernetesEnvironmentForm.vue +26 -1
- package/app/components/settings/KubernetesRunnerForm.vue +18 -1
- package/app/composables/useFrameRepoTypeItems.ts +29 -0
- package/app/stores/board.ts +9 -2
- package/app/types/domain.ts +1 -0
- package/app/utils/catalog.spec.ts +2 -0
- package/app/utils/catalog.ts +2 -0
- package/i18n/locales/en.json +18 -3
- package/i18n/locales/es.json +19 -4
- package/i18n/locales/fr.json +19 -4
- package/i18n/locales/he.json +19 -4
- package/i18n/locales/ja.json +19 -4
- package/i18n/locales/pl.json +19 -4
- package/i18n/locales/tr.json +19 -4
- package/i18n/locales/uk.json +19 -4
- package/package.json +2 -2
|
@@ -41,6 +41,16 @@ const container = computed(() =>
|
|
|
41
41
|
ui.addTaskContainerId ? board.getBlock(ui.addTaskContainerId) : undefined,
|
|
42
42
|
)
|
|
43
43
|
|
|
44
|
+
// The enclosing service frame: the container itself when it's a frame, else its parent
|
|
45
|
+
// frame (a module's parent). Drives which task types are offered — a document repository
|
|
46
|
+
// only authors documents/spikes, so the other kinds are hidden (and rejected server-side).
|
|
47
|
+
const frame = computed(() => {
|
|
48
|
+
const c = container.value
|
|
49
|
+
if (!c) return undefined
|
|
50
|
+
return c.level === 'frame' ? c : c.parentId ? board.getBlock(c.parentId) : undefined
|
|
51
|
+
})
|
|
52
|
+
const isDocRepo = computed(() => frame.value?.type === 'document')
|
|
53
|
+
|
|
44
54
|
const title = ref('')
|
|
45
55
|
const description = ref('')
|
|
46
56
|
const saving = ref(false)
|
|
@@ -53,13 +63,27 @@ const technical = ref(false)
|
|
|
53
63
|
// delegates to <RecurringPipelineModal> instead of creating a one-off task here.
|
|
54
64
|
type TaskTypeChoice = CreateTaskType | 'recurring'
|
|
55
65
|
const taskType = ref<TaskTypeChoice>('feature')
|
|
56
|
-
const TASK_TYPES = computed<{ value: TaskTypeChoice; label: string; icon: string }[]>(() =>
|
|
57
|
-
{ value:
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
66
|
+
const TASK_TYPES = computed<{ value: TaskTypeChoice; label: string; icon: string }[]>(() => {
|
|
67
|
+
const all: { value: TaskTypeChoice; label: string; icon: string }[] = [
|
|
68
|
+
{ value: 'feature', label: t('board.addTask.types.feature'), icon: 'i-lucide-sparkles' },
|
|
69
|
+
{ value: 'bug', label: t('board.addTask.types.bug'), icon: 'i-lucide-bug' },
|
|
70
|
+
{ value: 'document', label: t('board.addTask.types.document'), icon: 'i-lucide-file-text' },
|
|
71
|
+
{ value: 'spike', label: t('board.addTask.types.spike'), icon: 'i-lucide-flask-conical' },
|
|
72
|
+
{ value: 'recurring', label: t('board.addTask.types.recurring'), icon: 'i-lucide-repeat' },
|
|
73
|
+
]
|
|
74
|
+
// A document repository only accepts document/spike tasks (see BoardService.addTask).
|
|
75
|
+
return isDocRepo.value ? all.filter((k) => k.value === 'document' || k.value === 'spike') : all
|
|
76
|
+
})
|
|
77
|
+
// Keep the selection valid when the target is a document repo (default to document).
|
|
78
|
+
watch(
|
|
79
|
+
isDocRepo,
|
|
80
|
+
(doc) => {
|
|
81
|
+
if (doc && taskType.value !== 'document' && taskType.value !== 'spike') {
|
|
82
|
+
taskType.value = 'document'
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
{ immediate: true },
|
|
86
|
+
)
|
|
63
87
|
const isRecurring = computed(() => taskType.value === 'recurring')
|
|
64
88
|
|
|
65
89
|
// Per-type fields (only the ones relevant to the chosen type are shown / sent).
|
|
@@ -293,7 +317,10 @@ watch(open, (isOpen) => {
|
|
|
293
317
|
title.value = ''
|
|
294
318
|
description.value = ''
|
|
295
319
|
saving.value = false
|
|
296
|
-
|
|
320
|
+
// This reset runs after the `isDocRepo` watcher in the same open tick, so it must pick the
|
|
321
|
+
// doc-repo-aware default itself — a document frame only offers document/spike, so `feature`
|
|
322
|
+
// would leave the selector on a hidden, server-rejected value.
|
|
323
|
+
taskType.value = isDocRepo.value ? 'document' : 'feature'
|
|
297
324
|
technical.value = false
|
|
298
325
|
severity.value = ''
|
|
299
326
|
stepsToReproduce.value = ''
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
// adapt it (in a sandbox container) — either by cloning a chosen reference
|
|
5
5
|
// architecture, or from scratch following a freeform prompt. The modal pairs the
|
|
6
6
|
// launch form with the managed base list.
|
|
7
|
-
import type { BootstrapStatus, ReferenceArchitecture } from '~/types/domain'
|
|
7
|
+
import type { BootstrapStatus, FrameRepoType, ReferenceArchitecture } from '~/types/domain'
|
|
8
8
|
// Explicit import (see GitHubPanel): the auto-import name for github/GitHubConnect
|
|
9
9
|
// doesn't match the `<GitHubConnect>` tag, so bind it directly.
|
|
10
10
|
import GitHubConnect from '~/components/github/GitHubConnect.vue'
|
|
@@ -74,6 +74,11 @@ const isPrivate = ref(true)
|
|
|
74
74
|
const instructions = ref('')
|
|
75
75
|
const launching = ref(false)
|
|
76
76
|
|
|
77
|
+
// The behavioural repo role for the bootstrapped frame; `service` (backend) by default. The
|
|
78
|
+
// options are shared with the import modal via useFrameRepoTypeItems.
|
|
79
|
+
const selectedType = ref<FrameRepoType>('service')
|
|
80
|
+
const typeItems = useFrameRepoTypeItems()
|
|
81
|
+
|
|
77
82
|
const usingReference = computed(() => mode.value === 'reference')
|
|
78
83
|
|
|
79
84
|
// Mirror of the backend `slugField` rule (@cat-factory/contracts bootstrap
|
|
@@ -210,6 +215,7 @@ async function launch() {
|
|
|
210
215
|
description: description.value.trim(),
|
|
211
216
|
private: isPrivate.value,
|
|
212
217
|
instructions: instructions.value.trim(),
|
|
218
|
+
type: selectedType.value,
|
|
213
219
|
})
|
|
214
220
|
if (job.status === 'failed') {
|
|
215
221
|
// The container couldn't even start (pre-flight failure, e.g. the target
|
|
@@ -233,6 +239,8 @@ async function launch() {
|
|
|
233
239
|
repoName.value = ''
|
|
234
240
|
description.value = ''
|
|
235
241
|
instructions.value = ''
|
|
242
|
+
// Reset the repo role too, so a later bootstrap doesn't silently inherit this one's type.
|
|
243
|
+
selectedType.value = 'service'
|
|
236
244
|
// The run is now tracked on the board, so get out of the way: close the
|
|
237
245
|
// dialog as soon as bootstrapping has actually started.
|
|
238
246
|
ui.closeBootstrap()
|
|
@@ -469,6 +477,13 @@ const statusLabel = computed<Record<BootstrapStatus, string>>(() => ({
|
|
|
469
477
|
</div>
|
|
470
478
|
</UFormField>
|
|
471
479
|
|
|
480
|
+
<UFormField
|
|
481
|
+
:label="t('bootstrap.repoType.label')"
|
|
482
|
+
:description="t('bootstrap.repoType.help')"
|
|
483
|
+
>
|
|
484
|
+
<USelect v-model="selectedType" :items="typeItems" value-key="value" class="w-full" />
|
|
485
|
+
</UFormField>
|
|
486
|
+
|
|
472
487
|
<UFormField
|
|
473
488
|
:label="t('bootstrap.description.label')"
|
|
474
489
|
:description="t('bootstrap.description.help')"
|
|
@@ -11,12 +11,19 @@
|
|
|
11
11
|
// browses its tree and picks the service's directory before adding (and may add
|
|
12
12
|
// more than one, a subset of the repo's services).
|
|
13
13
|
import { refDebounced } from '@vueuse/core'
|
|
14
|
+
import type { FrameRepoType } from '~/types/domain'
|
|
14
15
|
import GitHubConnect from '~/components/github/GitHubConnect.vue'
|
|
15
16
|
import RepoTreeBrowser from '~/components/github/RepoTreeBrowser.vue'
|
|
16
17
|
import ServiceTestConfig from '~/components/panels/inspector/ServiceTestConfig.vue'
|
|
17
18
|
import ServiceFragments from '~/components/panels/inspector/ServiceFragments.vue'
|
|
18
19
|
|
|
19
20
|
const { t } = useI18n()
|
|
21
|
+
|
|
22
|
+
// The behavioural repo role for the imported frame. `service` (backend) is the default so
|
|
23
|
+
// existing muscle memory is unchanged; the options are the four onboardable roles (shared
|
|
24
|
+
// with the bootstrap modal via useFrameRepoTypeItems).
|
|
25
|
+
const selectedType = ref<FrameRepoType>('service')
|
|
26
|
+
const typeItems = useFrameRepoTypeItems()
|
|
20
27
|
const ui = useUiStore()
|
|
21
28
|
const github = useGitHubStore()
|
|
22
29
|
const board = useBoardStore()
|
|
@@ -157,6 +164,7 @@ function resetSelection() {
|
|
|
157
164
|
isMonorepo.value = false
|
|
158
165
|
configuredBlockId.value = undefined
|
|
159
166
|
repoSearch.value = ''
|
|
167
|
+
selectedType.value = 'service'
|
|
160
168
|
}
|
|
161
169
|
|
|
162
170
|
// Clear the current repo selection (the combobox's trailing ✕) so the user can pick a
|
|
@@ -219,6 +227,7 @@ async function add() {
|
|
|
219
227
|
const block = await board.addServiceFromRepo(selectedRepoId.value, {
|
|
220
228
|
directory: isMonorepo.value ? selectedDirectory.value : undefined,
|
|
221
229
|
isMonorepo: isMonorepo.value,
|
|
230
|
+
type: selectedType.value,
|
|
222
231
|
})
|
|
223
232
|
// Refresh the projection so the new repo↔block link is reflected locally.
|
|
224
233
|
await github.load()
|
|
@@ -324,6 +333,13 @@ function done() {
|
|
|
324
333
|
</div>
|
|
325
334
|
</UFormField>
|
|
326
335
|
|
|
336
|
+
<UFormField
|
|
337
|
+
:label="t('github.addService.repoType')"
|
|
338
|
+
:description="t('github.addService.repoTypeHint')"
|
|
339
|
+
>
|
|
340
|
+
<USelect v-model="selectedType" :items="typeItems" value-key="value" class="w-full" />
|
|
341
|
+
</UFormField>
|
|
342
|
+
|
|
327
343
|
<!-- monorepo handling: flag + directory picker -->
|
|
328
344
|
<div v-if="selectedRepoId !== undefined" class="space-y-3">
|
|
329
345
|
<USwitch
|
|
@@ -189,6 +189,25 @@ const canSave = computed(
|
|
|
189
189
|
!!form.label.trim() && !!form.apiServerUrl.trim() && !!apiToken.value.trim() && urlValid.value,
|
|
190
190
|
)
|
|
191
191
|
|
|
192
|
+
// Why the Connect button is disabled, surfaced as a red hint next to it so a mandatory-field gap
|
|
193
|
+
// is visible rather than a dead button. Lists the empty required fields by their on-screen label;
|
|
194
|
+
// falls back to the port-range message for the one non-empty invalidity `canSave` can carry.
|
|
195
|
+
const connectBlockedReason = computed(() => {
|
|
196
|
+
if (canSave.value) return ''
|
|
197
|
+
const missing: string[] = []
|
|
198
|
+
if (!form.label.trim()) missing.push(t('settings.infrastructure.kubernetesEngine.label'))
|
|
199
|
+
if (!form.apiServerUrl.trim())
|
|
200
|
+
missing.push(t('settings.infrastructure.kubernetesEngine.apiServerUrl'))
|
|
201
|
+
if (!apiToken.value.trim()) missing.push(t('settings.infrastructure.kubernetesEngine.apiToken'))
|
|
202
|
+
if (form.urlSource === 'ingressTemplate' && !form.hostTemplate.trim())
|
|
203
|
+
missing.push(t('settings.infrastructure.kubernetesEngine.hostTemplate'))
|
|
204
|
+
if (form.urlSource === 'serviceStatus' && !form.serviceName.trim())
|
|
205
|
+
missing.push(t('settings.infrastructure.kubernetesEngine.serviceName'))
|
|
206
|
+
if (missing.length)
|
|
207
|
+
return t('settings.providerConnection.form.missingFields', { fields: missing.join(', ') })
|
|
208
|
+
return t('settings.infrastructure.kubernetesEngine.invalidPort')
|
|
209
|
+
})
|
|
210
|
+
|
|
192
211
|
function buildUrl(): Record<string, unknown> {
|
|
193
212
|
const url: Record<string, unknown> = { source: form.urlSource }
|
|
194
213
|
if (form.urlSource === 'ingressTemplate') {
|
|
@@ -429,7 +448,10 @@ async function copyAutoSetupCommand() {
|
|
|
429
448
|
</span>
|
|
430
449
|
</div>
|
|
431
450
|
|
|
432
|
-
<div class="flex justify-end">
|
|
451
|
+
<div class="flex items-center justify-end gap-3">
|
|
452
|
+
<p v-if="connectBlockedReason" class="flex-1 text-left text-xs text-rose-400">
|
|
453
|
+
{{ connectBlockedReason }}
|
|
454
|
+
</p>
|
|
433
455
|
<UButton
|
|
434
456
|
color="primary"
|
|
435
457
|
size="sm"
|
|
@@ -151,6 +151,28 @@ const canSave = computed(
|
|
|
151
151
|
urlValid.value,
|
|
152
152
|
)
|
|
153
153
|
|
|
154
|
+
// Why the Connect button is disabled, surfaced as a red hint next to it so a mandatory-field gap
|
|
155
|
+
// is visible rather than a dead button. Lists the empty required fields by their on-screen label;
|
|
156
|
+
// falls back to a generic message for the format/range invalidities (repo shape, service port).
|
|
157
|
+
const connectBlockedReason = computed(() => {
|
|
158
|
+
if (canSave.value) return ''
|
|
159
|
+
const missing: string[] = []
|
|
160
|
+
if (!form.label.trim()) missing.push(t('settings.providerConnection.kubernetesEnv.label'))
|
|
161
|
+
if (!form.apiServerUrl.trim())
|
|
162
|
+
missing.push(t('settings.providerConnection.kubernetesEnv.apiServerUrl'))
|
|
163
|
+
if (!apiToken.value.trim()) missing.push(t('settings.providerConnection.kubernetesEnv.apiToken'))
|
|
164
|
+
if (form.manifestSourceType === 'separate' && !form.manifestRepo.trim())
|
|
165
|
+
missing.push(t('settings.providerConnection.kubernetesEnv.repo'))
|
|
166
|
+
if (!form.manifestPath.trim()) missing.push(t('settings.providerConnection.kubernetesEnv.path'))
|
|
167
|
+
if (form.urlSource === 'ingressTemplate' && !form.hostTemplate.trim())
|
|
168
|
+
missing.push(t('settings.providerConnection.kubernetesEnv.hostTemplate'))
|
|
169
|
+
if (form.urlSource === 'serviceStatus' && !form.serviceName.trim())
|
|
170
|
+
missing.push(t('settings.providerConnection.kubernetesEnv.serviceName'))
|
|
171
|
+
if (missing.length)
|
|
172
|
+
return t('settings.providerConnection.form.missingFields', { fields: missing.join(', ') })
|
|
173
|
+
return t('settings.providerConnection.kubernetesEnv.invalidFields')
|
|
174
|
+
})
|
|
175
|
+
|
|
154
176
|
function buildManifestSource(): Record<string, unknown> {
|
|
155
177
|
if (form.manifestSourceType === 'separate') {
|
|
156
178
|
const src: Record<string, unknown> = {
|
|
@@ -368,7 +390,10 @@ function optional(label: string): string {
|
|
|
368
390
|
</span>
|
|
369
391
|
</div>
|
|
370
392
|
|
|
371
|
-
<div class="flex justify-end">
|
|
393
|
+
<div class="flex items-center justify-end gap-3">
|
|
394
|
+
<p v-if="connectBlockedReason" class="flex-1 text-left text-xs text-rose-400">
|
|
395
|
+
{{ connectBlockedReason }}
|
|
396
|
+
</p>
|
|
372
397
|
<UButton
|
|
373
398
|
color="primary"
|
|
374
399
|
size="sm"
|
|
@@ -88,6 +88,20 @@ const canSave = computed(
|
|
|
88
88
|
!!apiToken.value.trim(),
|
|
89
89
|
)
|
|
90
90
|
|
|
91
|
+
// Why the Connect button is disabled, surfaced as a red hint next to it so a mandatory-field gap
|
|
92
|
+
// is visible rather than a dead button. Lists the empty required fields by their on-screen label.
|
|
93
|
+
const connectBlockedReason = computed(() => {
|
|
94
|
+
if (canSave.value) return ''
|
|
95
|
+
const missing: string[] = []
|
|
96
|
+
if (!form.label.trim()) missing.push(t('settings.providerConnection.kubernetes.label'))
|
|
97
|
+
if (!form.apiServerUrl.trim())
|
|
98
|
+
missing.push(t('settings.providerConnection.kubernetes.apiServerUrl'))
|
|
99
|
+
if (!form.namespace.trim()) missing.push(t('settings.providerConnection.kubernetes.namespace'))
|
|
100
|
+
if (!form.image.trim()) missing.push(t('settings.providerConnection.kubernetes.image'))
|
|
101
|
+
if (!apiToken.value.trim()) missing.push(t('settings.providerConnection.kubernetes.apiToken'))
|
|
102
|
+
return t('settings.providerConnection.form.missingFields', { fields: missing.join(', ') })
|
|
103
|
+
})
|
|
104
|
+
|
|
91
105
|
function buildPayload(): { config: Record<string, unknown>; secrets: Record<string, string> } {
|
|
92
106
|
const kubernetes: Record<string, unknown> = {
|
|
93
107
|
label: form.label.trim(),
|
|
@@ -216,7 +230,10 @@ function buildPayload(): { config: Record<string, unknown>; secrets: Record<stri
|
|
|
216
230
|
</span>
|
|
217
231
|
</div>
|
|
218
232
|
|
|
219
|
-
<div class="flex justify-end">
|
|
233
|
+
<div class="flex items-center justify-end gap-3">
|
|
234
|
+
<p v-if="connectBlockedReason" class="flex-1 text-left text-xs text-rose-400">
|
|
235
|
+
{{ connectBlockedReason }}
|
|
236
|
+
</p>
|
|
220
237
|
<UButton
|
|
221
238
|
color="primary"
|
|
222
239
|
size="sm"
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { FRAME_REPO_TYPES } from '@cat-factory/contracts'
|
|
2
|
+
import type { FrameRepoType } from '~/types/domain'
|
|
3
|
+
import { BLOCK_TYPE_META } from '~/utils/catalog'
|
|
4
|
+
|
|
5
|
+
// One static, typed message key per onboardable repo role. The exhaustive Record means adding
|
|
6
|
+
// a FrameRepoType fails typecheck until it has a label here (the tier-2 dynamic-lookup guard),
|
|
7
|
+
// and keeping the keys as literals lets the i18n drift check see them.
|
|
8
|
+
const REPO_TYPE_LABEL_KEYS: Record<FrameRepoType, string> = {
|
|
9
|
+
service: 'board.repoTypes.service',
|
|
10
|
+
frontend: 'board.repoTypes.frontend',
|
|
11
|
+
library: 'board.repoTypes.library',
|
|
12
|
+
document: 'board.repoTypes.document',
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* The repository-type options for the import + bootstrap selectors: one entry per
|
|
17
|
+
* FRAME_REPO_TYPES role (i18n label + the shared block-type icon). Shared so
|
|
18
|
+
* AddServiceFromRepoModal and BootstrapModal offer exactly the same set and can't drift.
|
|
19
|
+
*/
|
|
20
|
+
export function useFrameRepoTypeItems() {
|
|
21
|
+
const { t } = useI18n()
|
|
22
|
+
return computed(() =>
|
|
23
|
+
FRAME_REPO_TYPES.map((value) => ({
|
|
24
|
+
value,
|
|
25
|
+
label: t(REPO_TYPE_LABEL_KEYS[value]),
|
|
26
|
+
icon: BLOCK_TYPE_META[value].icon,
|
|
27
|
+
})),
|
|
28
|
+
)
|
|
29
|
+
}
|
package/app/stores/board.ts
CHANGED
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
import { defineStore } from 'pinia'
|
|
2
2
|
import { ref } from 'vue'
|
|
3
3
|
import type { UpdateBlockInput } from '@cat-factory/contracts'
|
|
4
|
-
import type {
|
|
4
|
+
import type {
|
|
5
|
+
Block,
|
|
6
|
+
BlockType,
|
|
7
|
+
CreateTaskType,
|
|
8
|
+
FrameRepoType,
|
|
9
|
+
TaskTypeFields,
|
|
10
|
+
} from '~/types/domain'
|
|
5
11
|
import { useServicesStore } from '~/stores/services'
|
|
6
12
|
import { useWorkspaceStore } from '~/stores/workspace'
|
|
7
13
|
import { useBlockQueries } from '~/composables/useBlockQueries'
|
|
@@ -79,12 +85,13 @@ export const useBoardStore = defineStore('board', () => {
|
|
|
79
85
|
*/
|
|
80
86
|
async function addServiceFromRepo(
|
|
81
87
|
repoGithubId: number,
|
|
82
|
-
opts?: { directory?: string; isMonorepo?: boolean },
|
|
88
|
+
opts?: { directory?: string; isMonorepo?: boolean; type?: FrameRepoType },
|
|
83
89
|
): Promise<Block> {
|
|
84
90
|
const block = await api.addServiceFromRepo(useWorkspaceStore().requireId(), {
|
|
85
91
|
repoGithubId,
|
|
86
92
|
...(opts?.directory ? { directory: opts.directory } : {}),
|
|
87
93
|
...(opts?.isMonorepo !== undefined ? { isMonorepo: opts.isMonorepo } : {}),
|
|
94
|
+
...(opts?.type ? { type: opts.type } : {}),
|
|
88
95
|
})
|
|
89
96
|
upsert(block)
|
|
90
97
|
return block
|
package/app/types/domain.ts
CHANGED
package/app/utils/catalog.ts
CHANGED
|
@@ -519,6 +519,8 @@ type BlockTypeMeta = { label: string; icon: string; accent: string }
|
|
|
519
519
|
export const BLOCK_TYPE_META: Record<BlockType, BlockTypeMeta> = {
|
|
520
520
|
frontend: { label: 'Frontend', icon: 'i-lucide-monitor', accent: '#60a5fa' },
|
|
521
521
|
service: { label: 'Service', icon: 'i-lucide-server', accent: '#a78bfa' },
|
|
522
|
+
library: { label: 'Library', icon: 'i-lucide-package', accent: '#f472b6' },
|
|
523
|
+
document: { label: 'Document repository', icon: 'i-lucide-book-text', accent: '#c084fc' },
|
|
522
524
|
api: { label: 'API', icon: 'i-lucide-route', accent: '#22d3ee' },
|
|
523
525
|
database: { label: 'Database', icon: 'i-lucide-database', accent: '#34d399' },
|
|
524
526
|
queue: { label: 'Queue', icon: 'i-lucide-list-ordered', accent: '#fbbf24' },
|
package/i18n/locales/en.json
CHANGED
|
@@ -51,6 +51,12 @@
|
|
|
51
51
|
"accountSettings": "Account settings"
|
|
52
52
|
},
|
|
53
53
|
"board": {
|
|
54
|
+
"repoTypes": {
|
|
55
|
+
"service": "Service",
|
|
56
|
+
"frontend": "Frontend",
|
|
57
|
+
"library": "Library",
|
|
58
|
+
"document": "Document repository"
|
|
59
|
+
},
|
|
54
60
|
"toolbar": {
|
|
55
61
|
"addService": "Add service",
|
|
56
62
|
"decisionWord": "decision | decisions",
|
|
@@ -1399,7 +1405,8 @@
|
|
|
1399
1405
|
"caCertPem": "CA certificate (PEM)",
|
|
1400
1406
|
"caCertPemHelp": "Verifies the apiserver TLS cert. Omit only for a publicly-trusted CA.",
|
|
1401
1407
|
"insecureSkipTlsVerify": "Skip TLS verification",
|
|
1402
|
-
"insecureSkipTlsVerifyHelp": "Strongly discouraged: dev/kind clusters only."
|
|
1408
|
+
"insecureSkipTlsVerifyHelp": "Strongly discouraged: dev/kind clusters only.",
|
|
1409
|
+
"invalidPort": "Enter a port between 1 and 65535."
|
|
1403
1410
|
},
|
|
1404
1411
|
"customType": {
|
|
1405
1412
|
"title": "Custom manifest types",
|
|
@@ -1497,7 +1504,8 @@
|
|
|
1497
1504
|
"caCertPem": "Cluster CA certificate (PEM)",
|
|
1498
1505
|
"caCertPemHelp": "Paste the cluster CA bundle so the apiserver's TLS certificate verifies. Omit only for a publicly-trusted CA.",
|
|
1499
1506
|
"insecureSkipTlsVerify": "Skip TLS verification",
|
|
1500
|
-
"insecureSkipTlsVerifyHelp": "Strongly discouraged. Disables apiserver TLS verification; use only for kind/dev clusters."
|
|
1507
|
+
"insecureSkipTlsVerifyHelp": "Strongly discouraged. Disables apiserver TLS verification; use only for kind/dev clusters.",
|
|
1508
|
+
"invalidFields": "Complete the required fields with valid values to connect."
|
|
1501
1509
|
},
|
|
1502
1510
|
"kubernetes": {
|
|
1503
1511
|
"label": "Name",
|
|
@@ -1540,7 +1548,8 @@
|
|
|
1540
1548
|
"@reenterSecrets": {
|
|
1541
1549
|
"description": "Count-based: how many write-only secret fields the user must re-supply before re-saving (count is always >= 1). Provide ALL plural forms your language needs (English has 2; Polish/Ukrainian need 3 - one/few/many - via the custom pluralRules in i18n.config.ts)."
|
|
1542
1550
|
},
|
|
1543
|
-
"optionalLabel": "{label} (optional)"
|
|
1551
|
+
"optionalLabel": "{label} (optional)",
|
|
1552
|
+
"missingFields": "Fill in the required fields to connect: {fields}."
|
|
1544
1553
|
},
|
|
1545
1554
|
"field": {
|
|
1546
1555
|
"defaultsTo": "Defaults to {value}"
|
|
@@ -2181,6 +2190,8 @@
|
|
|
2181
2190
|
"connectFirst": "Connect this workspace to GitHub first. Link an installation the App is already on, or install it.",
|
|
2182
2191
|
"repository": "Repository",
|
|
2183
2192
|
"repositoryHint": "Repositories the GitHub App can access. Don't see yours? Grant the App access below, then refresh.",
|
|
2193
|
+
"repoType": "Repository type",
|
|
2194
|
+
"repoTypeHint": "What this repo is: a backend service, a frontend app, a shared library, or a document repository (docs/spikes only).",
|
|
2184
2195
|
"noReposAvailable": "No repositories available yet. Grant the App access to one below, then refresh.",
|
|
2185
2196
|
"searchPlaceholder": "Search repositories by owner or name…",
|
|
2186
2197
|
"searchMinChars": "Type at least {min} character to search. | Type at least {min} characters to search.",
|
|
@@ -3610,6 +3621,10 @@
|
|
|
3610
3621
|
"label": "Grant the App access to this repo",
|
|
3611
3622
|
"title": "Open the App's installation settings to grant it access to the new repo"
|
|
3612
3623
|
},
|
|
3624
|
+
"repoType": {
|
|
3625
|
+
"label": "Repository type",
|
|
3626
|
+
"help": "What this repo is: a backend service, a frontend app, a shared library, or a document repository (docs/spikes only)."
|
|
3627
|
+
},
|
|
3613
3628
|
"description": {
|
|
3614
3629
|
"label": "Description",
|
|
3615
3630
|
"help": "Optional one-line summary for the repo."
|
package/i18n/locales/es.json
CHANGED
|
@@ -39,6 +39,12 @@
|
|
|
39
39
|
"infrastructure": "Infraestructura"
|
|
40
40
|
},
|
|
41
41
|
"board": {
|
|
42
|
+
"repoTypes": {
|
|
43
|
+
"service": "Servicio",
|
|
44
|
+
"frontend": "Frontend",
|
|
45
|
+
"library": "Biblioteca",
|
|
46
|
+
"document": "Repositorio de documentación"
|
|
47
|
+
},
|
|
42
48
|
"toolbar": {
|
|
43
49
|
"addService": "Añadir servicio",
|
|
44
50
|
"decisionWord": "decisión | decisiones",
|
|
@@ -1331,7 +1337,8 @@
|
|
|
1331
1337
|
"updateConfiguration": "Actualizar configuración",
|
|
1332
1338
|
"connect": "Conectar",
|
|
1333
1339
|
"reenterSecrets": "Vuelve a introducir el campo secreto para guardar los cambios: los secretos almacenados son de solo escritura y no se muestran. | Vuelve a introducir los campos secretos para guardar los cambios: los secretos almacenados son de solo escritura y no se muestran.",
|
|
1334
|
-
"optionalLabel": "{label} (opcional)"
|
|
1340
|
+
"optionalLabel": "{label} (opcional)",
|
|
1341
|
+
"missingFields": "Completa los campos obligatorios para conectar: {fields}."
|
|
1335
1342
|
},
|
|
1336
1343
|
"field": {
|
|
1337
1344
|
"defaultsTo": "Por defecto: {value}"
|
|
@@ -1382,7 +1389,8 @@
|
|
|
1382
1389
|
"caCertPem": "Certificado CA del clúster (PEM)",
|
|
1383
1390
|
"caCertPemHelp": "Pega el bundle CA del clúster para que el certificado TLS del apiserver se verifique. Omítelo solo para una CA de confianza pública.",
|
|
1384
1391
|
"insecureSkipTlsVerify": "Omitir verificación TLS",
|
|
1385
|
-
"insecureSkipTlsVerifyHelp": "Muy desaconsejado. Desactiva la verificación TLS del apiserver; úsalo solo para clústeres kind/dev."
|
|
1392
|
+
"insecureSkipTlsVerifyHelp": "Muy desaconsejado. Desactiva la verificación TLS del apiserver; úsalo solo para clústeres kind/dev.",
|
|
1393
|
+
"invalidFields": "Completa los campos obligatorios con valores válidos para conectar."
|
|
1386
1394
|
},
|
|
1387
1395
|
"kubernetes": {
|
|
1388
1396
|
"label": "Nombre",
|
|
@@ -1808,7 +1816,8 @@
|
|
|
1808
1816
|
"caCertPem": "Certificado CA (PEM)",
|
|
1809
1817
|
"caCertPemHelp": "Verifica el certificado TLS del apiserver. Omítelo solo con una CA de confianza pública.",
|
|
1810
1818
|
"insecureSkipTlsVerify": "Omitir la verificación TLS",
|
|
1811
|
-
"insecureSkipTlsVerifyHelp": "Muy desaconsejado: solo clústeres de desarrollo/kind."
|
|
1819
|
+
"insecureSkipTlsVerifyHelp": "Muy desaconsejado: solo clústeres de desarrollo/kind.",
|
|
1820
|
+
"invalidPort": "Introduce un puerto entre 1 y 65535."
|
|
1812
1821
|
},
|
|
1813
1822
|
"customType": {
|
|
1814
1823
|
"title": "Tipos de manifiesto personalizados",
|
|
@@ -2143,7 +2152,9 @@
|
|
|
2143
2152
|
"addedTitle": "Servicio añadido",
|
|
2144
2153
|
"addedDescription": "{title} está en el tablero, configúralo abajo.",
|
|
2145
2154
|
"addFailedTitle": "No se pudo añadir el servicio"
|
|
2146
|
-
}
|
|
2155
|
+
},
|
|
2156
|
+
"repoType": "Tipo de repositorio",
|
|
2157
|
+
"repoTypeHint": "Qué es este repositorio: un servicio backend, una aplicación frontend, una biblioteca compartida o un repositorio de documentación (solo documentos/spikes)."
|
|
2147
2158
|
},
|
|
2148
2159
|
"repoTree": {
|
|
2149
2160
|
"root": "raíz",
|
|
@@ -3534,6 +3545,10 @@
|
|
|
3534
3545
|
"bootstrapFailed": "No se pudo inicializar",
|
|
3535
3546
|
"saveArchFailed": "No se pudo guardar la arquitectura de referencia",
|
|
3536
3547
|
"deleteFailed": "No se pudo eliminar"
|
|
3548
|
+
},
|
|
3549
|
+
"repoType": {
|
|
3550
|
+
"label": "Tipo de repositorio",
|
|
3551
|
+
"help": "Qué es este repositorio: un servicio backend, una aplicación frontend, una biblioteca compartida o un repositorio de documentación (solo documentos/spikes)."
|
|
3537
3552
|
}
|
|
3538
3553
|
},
|
|
3539
3554
|
"mergePreset": {
|
package/i18n/locales/fr.json
CHANGED
|
@@ -39,6 +39,12 @@
|
|
|
39
39
|
"infrastructure": "Infrastructure"
|
|
40
40
|
},
|
|
41
41
|
"board": {
|
|
42
|
+
"repoTypes": {
|
|
43
|
+
"service": "Service",
|
|
44
|
+
"frontend": "Frontend",
|
|
45
|
+
"library": "Bibliothèque",
|
|
46
|
+
"document": "Dépôt de documentation"
|
|
47
|
+
},
|
|
42
48
|
"toolbar": {
|
|
43
49
|
"addService": "Ajouter un service",
|
|
44
50
|
"decisionWord": "décision | décisions",
|
|
@@ -1331,7 +1337,8 @@
|
|
|
1331
1337
|
"updateConfiguration": "Mettre à jour la configuration",
|
|
1332
1338
|
"connect": "Connecter",
|
|
1333
1339
|
"reenterSecrets": "Saisissez à nouveau le champ secret pour enregistrer les modifications : les secrets stockés sont en écriture seule et ne sont pas affichés. | Saisissez à nouveau les champs secrets pour enregistrer les modifications : les secrets stockés sont en écriture seule et ne sont pas affichés.",
|
|
1334
|
-
"optionalLabel": "{label} (facultatif)"
|
|
1340
|
+
"optionalLabel": "{label} (facultatif)",
|
|
1341
|
+
"missingFields": "Renseignez les champs obligatoires pour vous connecter : {fields}."
|
|
1335
1342
|
},
|
|
1336
1343
|
"field": {
|
|
1337
1344
|
"defaultsTo": "Valeur par défaut : {value}"
|
|
@@ -1382,7 +1389,8 @@
|
|
|
1382
1389
|
"caCertPem": "Certificat CA du cluster (PEM)",
|
|
1383
1390
|
"caCertPemHelp": "Collez le bundle CA du cluster pour que le certificat TLS de l'apiserver soit vérifié. À omettre uniquement pour une CA publiquement approuvée.",
|
|
1384
1391
|
"insecureSkipTlsVerify": "Ignorer la vérification TLS",
|
|
1385
|
-
"insecureSkipTlsVerifyHelp": "Fortement déconseillé. Désactive la vérification TLS de l'apiserver ; à utiliser uniquement pour des clusters kind/dev."
|
|
1392
|
+
"insecureSkipTlsVerifyHelp": "Fortement déconseillé. Désactive la vérification TLS de l'apiserver ; à utiliser uniquement pour des clusters kind/dev.",
|
|
1393
|
+
"invalidFields": "Renseignez les champs obligatoires avec des valeurs valides pour vous connecter."
|
|
1386
1394
|
},
|
|
1387
1395
|
"kubernetes": {
|
|
1388
1396
|
"label": "Nom",
|
|
@@ -1808,7 +1816,8 @@
|
|
|
1808
1816
|
"caCertPem": "Certificat CA (PEM)",
|
|
1809
1817
|
"caCertPemHelp": "Vérifie le certificat TLS de l'apiserver. À omettre uniquement pour une CA publiquement fiable.",
|
|
1810
1818
|
"insecureSkipTlsVerify": "Ignorer la vérification TLS",
|
|
1811
|
-
"insecureSkipTlsVerifyHelp": "Fortement déconseillé: clusters de dev/kind uniquement."
|
|
1819
|
+
"insecureSkipTlsVerifyHelp": "Fortement déconseillé: clusters de dev/kind uniquement.",
|
|
1820
|
+
"invalidPort": "Saisissez un port compris entre 1 et 65535."
|
|
1812
1821
|
},
|
|
1813
1822
|
"customType": {
|
|
1814
1823
|
"title": "Types de manifeste personnalisés",
|
|
@@ -2143,7 +2152,9 @@
|
|
|
2143
2152
|
"addedTitle": "Service ajouté",
|
|
2144
2153
|
"addedDescription": "{title} est sur le tableau, configurez-le ci-dessous.",
|
|
2145
2154
|
"addFailedTitle": "Impossible d'ajouter le service"
|
|
2146
|
-
}
|
|
2155
|
+
},
|
|
2156
|
+
"repoType": "Type de dépôt",
|
|
2157
|
+
"repoTypeHint": "Ce qu'est ce dépôt : un service backend, une application frontend, une bibliothèque partagée ou un dépôt de documentation (documents/spikes uniquement)."
|
|
2147
2158
|
},
|
|
2148
2159
|
"repoTree": {
|
|
2149
2160
|
"root": "racine",
|
|
@@ -3534,6 +3545,10 @@
|
|
|
3534
3545
|
"bootstrapFailed": "Impossible d'initialiser",
|
|
3535
3546
|
"saveArchFailed": "Impossible d'enregistrer l'architecture de référence",
|
|
3536
3547
|
"deleteFailed": "Impossible de supprimer"
|
|
3548
|
+
},
|
|
3549
|
+
"repoType": {
|
|
3550
|
+
"label": "Type de dépôt",
|
|
3551
|
+
"help": "Ce qu'est ce dépôt : un service backend, une application frontend, une bibliothèque partagée ou un dépôt de documentation (documents/spikes uniquement)."
|
|
3537
3552
|
}
|
|
3538
3553
|
},
|
|
3539
3554
|
"mergePreset": {
|
package/i18n/locales/he.json
CHANGED
|
@@ -39,6 +39,12 @@
|
|
|
39
39
|
"accountSettings": "הגדרות חשבון"
|
|
40
40
|
},
|
|
41
41
|
"board": {
|
|
42
|
+
"repoTypes": {
|
|
43
|
+
"service": "שירות",
|
|
44
|
+
"frontend": "פרונט-אנד",
|
|
45
|
+
"library": "ספרייה",
|
|
46
|
+
"document": "מאגר תיעוד"
|
|
47
|
+
},
|
|
42
48
|
"toolbar": {
|
|
43
49
|
"addService": "הוסף שירות",
|
|
44
50
|
"decisionWord": "החלטה | החלטות",
|
|
@@ -1357,7 +1363,8 @@
|
|
|
1357
1363
|
"caCertPem": "תעודת CA (PEM)",
|
|
1358
1364
|
"caCertPemHelp": "מאמתת את תעודת ה-TLS של ה-apiserver. השמט רק עבור CA מהימן ציבורית.",
|
|
1359
1365
|
"insecureSkipTlsVerify": "דלג על אימות TLS",
|
|
1360
|
-
"insecureSkipTlsVerifyHelp": "מומלץ מאוד להימנע: אשכולות פיתוח/kind בלבד."
|
|
1366
|
+
"insecureSkipTlsVerifyHelp": "מומלץ מאוד להימנע: אשכולות פיתוח/kind בלבד.",
|
|
1367
|
+
"invalidPort": "הזן פורט בין 1 ל-65535."
|
|
1361
1368
|
},
|
|
1362
1369
|
"customType": {
|
|
1363
1370
|
"title": "סוגי מניפסט מותאמים",
|
|
@@ -1455,7 +1462,8 @@
|
|
|
1455
1462
|
"caCertPem": "אישור CA של האשכול (PEM)",
|
|
1456
1463
|
"caCertPemHelp": "הדבק את חבילת ה-CA של האשכול כדי שאישור ה-TLS של ה-apiserver יאומת. השמט רק עבור CA נאמן ציבורית.",
|
|
1457
1464
|
"insecureSkipTlsVerify": "דלג על אימות TLS",
|
|
1458
|
-
"insecureSkipTlsVerifyHelp": "מומלץ בחום להימנע. מבטל את אימות ה-TLS של ה-apiserver; השתמש רק עבור אשכולות kind/פיתוח."
|
|
1465
|
+
"insecureSkipTlsVerifyHelp": "מומלץ בחום להימנע. מבטל את אימות ה-TLS של ה-apiserver; השתמש רק עבור אשכולות kind/פיתוח.",
|
|
1466
|
+
"invalidFields": "מלא את השדות הנדרשים בערכים תקינים כדי להתחבר."
|
|
1459
1467
|
},
|
|
1460
1468
|
"kubernetes": {
|
|
1461
1469
|
"label": "שם",
|
|
@@ -1495,7 +1503,8 @@
|
|
|
1495
1503
|
"updateConfiguration": "עדכן הגדרות",
|
|
1496
1504
|
"connect": "התחבר",
|
|
1497
1505
|
"reenterSecrets": "הזן מחדש את שדה הסוד כדי לשמור שינויים — סודות מאוחסנים הם לכתיבה בלבד ואינם מוצגים. | הזן מחדש את שדות הסוד כדי לשמור שינויים — סודות מאוחסנים הם לכתיבה בלבד ואינם מוצגים.",
|
|
1498
|
-
"optionalLabel": "{label} (אופציונלי)"
|
|
1506
|
+
"optionalLabel": "{label} (אופציונלי)",
|
|
1507
|
+
"missingFields": "מלא את השדות הנדרשים כדי להתחבר: {fields}."
|
|
1499
1508
|
},
|
|
1500
1509
|
"field": {
|
|
1501
1510
|
"defaultsTo": "ברירת מחדל היא {value}"
|
|
@@ -2154,7 +2163,9 @@
|
|
|
2154
2163
|
"addedTitle": "השירות נוסף",
|
|
2155
2164
|
"addedDescription": "{title} על הלוח, הגדר אותו למטה.",
|
|
2156
2165
|
"addFailedTitle": "לא ניתן היה להוסיף שירות"
|
|
2157
|
-
}
|
|
2166
|
+
},
|
|
2167
|
+
"repoType": "סוג המאגר",
|
|
2168
|
+
"repoTypeHint": "מה המאגר הזה: שירות בק-אנד, אפליקציית פרונט-אנד, ספרייה משותפת או מאגר תיעוד (מסמכים/ספייקים בלבד)."
|
|
2158
2169
|
},
|
|
2159
2170
|
"repoTree": {
|
|
2160
2171
|
"root": "שורש",
|
|
@@ -3545,6 +3556,10 @@
|
|
|
3545
3556
|
"bootstrapFailed": "לא ניתן היה לאתחל",
|
|
3546
3557
|
"saveArchFailed": "לא ניתן היה לשמור ארכיטקטורת ייחוס",
|
|
3547
3558
|
"deleteFailed": "לא ניתן היה למחוק"
|
|
3559
|
+
},
|
|
3560
|
+
"repoType": {
|
|
3561
|
+
"label": "סוג המאגר",
|
|
3562
|
+
"help": "מה המאגר הזה: שירות בק-אנד, אפליקציית פרונט-אנד, ספרייה משותפת או מאגר תיעוד (מסמכים/ספייקים בלבד)."
|
|
3548
3563
|
}
|
|
3549
3564
|
},
|
|
3550
3565
|
"mergePreset": {
|
package/i18n/locales/ja.json
CHANGED
|
@@ -39,6 +39,12 @@
|
|
|
39
39
|
"accountSettings": "アカウント設定"
|
|
40
40
|
},
|
|
41
41
|
"board": {
|
|
42
|
+
"repoTypes": {
|
|
43
|
+
"service": "サービス",
|
|
44
|
+
"frontend": "フロントエンド",
|
|
45
|
+
"library": "ライブラリ",
|
|
46
|
+
"document": "ドキュメントリポジトリ"
|
|
47
|
+
},
|
|
42
48
|
"toolbar": {
|
|
43
49
|
"addService": "サービスを追加",
|
|
44
50
|
"decisionWord": "決定 | 決定",
|
|
@@ -1359,7 +1365,8 @@
|
|
|
1359
1365
|
"caCertPem": "CA 証明書 (PEM)",
|
|
1360
1366
|
"caCertPemHelp": "apiserver の TLS 証明書を検証します。公的に信頼された CA の場合のみ省略します。",
|
|
1361
1367
|
"insecureSkipTlsVerify": "TLS 検証をスキップ",
|
|
1362
|
-
"insecureSkipTlsVerifyHelp": "強く非推奨: 開発/kind クラスターのみ。"
|
|
1368
|
+
"insecureSkipTlsVerifyHelp": "強く非推奨: 開発/kind クラスターのみ。",
|
|
1369
|
+
"invalidPort": "1〜65535 のポート番号を入力してください。"
|
|
1363
1370
|
},
|
|
1364
1371
|
"customType": {
|
|
1365
1372
|
"title": "カスタムマニフェストタイプ",
|
|
@@ -1457,7 +1464,8 @@
|
|
|
1457
1464
|
"caCertPem": "クラスター CA 証明書 (PEM)",
|
|
1458
1465
|
"caCertPemHelp": "apiserver の TLS 証明書を検証できるよう、クラスターの CA バンドルを貼り付けてください。公的に信頼された CA の場合のみ省略できます。",
|
|
1459
1466
|
"insecureSkipTlsVerify": "TLS 検証をスキップ",
|
|
1460
|
-
"insecureSkipTlsVerifyHelp": "強く非推奨です。apiserver の TLS 検証を無効にします。kind/開発クラスターでのみ使用してください。"
|
|
1467
|
+
"insecureSkipTlsVerifyHelp": "強く非推奨です。apiserver の TLS 検証を無効にします。kind/開発クラスターでのみ使用してください。",
|
|
1468
|
+
"invalidFields": "接続するには必須項目に有効な値を入力してください。"
|
|
1461
1469
|
},
|
|
1462
1470
|
"kubernetes": {
|
|
1463
1471
|
"label": "名前",
|
|
@@ -1497,7 +1505,8 @@
|
|
|
1497
1505
|
"updateConfiguration": "設定を更新",
|
|
1498
1506
|
"connect": "接続",
|
|
1499
1507
|
"reenterSecrets": "変更を保存するにはシークレットフィールドを再入力してください。保存済みのシークレットは書き込み専用で表示されません。 | 変更を保存するにはシークレットフィールドを再入力してください。保存済みのシークレットは書き込み専用で表示されません。",
|
|
1500
|
-
"optionalLabel": "{label} (任意)"
|
|
1508
|
+
"optionalLabel": "{label} (任意)",
|
|
1509
|
+
"missingFields": "接続するには必須項目を入力してください: {fields}。"
|
|
1501
1510
|
},
|
|
1502
1511
|
"field": {
|
|
1503
1512
|
"defaultsTo": "デフォルト値は {value}"
|
|
@@ -2156,7 +2165,9 @@
|
|
|
2156
2165
|
"addedTitle": "サービスを追加しました",
|
|
2157
2166
|
"addedDescription": "{title}がボードに追加されました。以下で設定してください。",
|
|
2158
2167
|
"addFailedTitle": "サービスを追加できませんでした"
|
|
2159
|
-
}
|
|
2168
|
+
},
|
|
2169
|
+
"repoType": "リポジトリの種類",
|
|
2170
|
+
"repoTypeHint": "このリポジトリの種類: バックエンドサービス、フロントエンドアプリ、共有ライブラリ、またはドキュメントリポジトリ(ドキュメント/スパイクのみ)。"
|
|
2160
2171
|
},
|
|
2161
2172
|
"repoTree": {
|
|
2162
2173
|
"root": "ルート",
|
|
@@ -3547,6 +3558,10 @@
|
|
|
3547
3558
|
"bootstrapFailed": "ブートストラップできませんでした",
|
|
3548
3559
|
"saveArchFailed": "リファレンスアーキテクチャを保存できませんでした",
|
|
3549
3560
|
"deleteFailed": "削除できませんでした"
|
|
3561
|
+
},
|
|
3562
|
+
"repoType": {
|
|
3563
|
+
"label": "リポジトリの種類",
|
|
3564
|
+
"help": "このリポジトリの種類: バックエンドサービス、フロントエンドアプリ、共有ライブラリ、またはドキュメントリポジトリ(ドキュメント/スパイクのみ)。"
|
|
3550
3565
|
}
|
|
3551
3566
|
},
|
|
3552
3567
|
"mergePreset": {
|
package/i18n/locales/pl.json
CHANGED
|
@@ -39,6 +39,12 @@
|
|
|
39
39
|
"infrastructure": "Infrastruktura"
|
|
40
40
|
},
|
|
41
41
|
"board": {
|
|
42
|
+
"repoTypes": {
|
|
43
|
+
"service": "Usługa",
|
|
44
|
+
"frontend": "Frontend",
|
|
45
|
+
"library": "Biblioteka",
|
|
46
|
+
"document": "Repozytorium dokumentacji"
|
|
47
|
+
},
|
|
42
48
|
"toolbar": {
|
|
43
49
|
"addService": "Dodaj usługę",
|
|
44
50
|
"decisionWord": "decyzja | decyzje | decyzji",
|
|
@@ -1331,7 +1337,8 @@
|
|
|
1331
1337
|
"updateConfiguration": "Zaktualizuj konfigurację",
|
|
1332
1338
|
"connect": "Połącz",
|
|
1333
1339
|
"reenterSecrets": "Wprowadź ponownie pole sekretne, aby zapisać zmiany — przechowywane sekrety są tylko do zapisu i nie są wyświetlane. | Wprowadź ponownie pola sekretne, aby zapisać zmiany — przechowywane sekrety są tylko do zapisu i nie są wyświetlane. | Wprowadź ponownie pola sekretne, aby zapisać zmiany — przechowywane sekrety są tylko do zapisu i nie są wyświetlane.",
|
|
1334
|
-
"optionalLabel": "{label} (opcjonalne)"
|
|
1340
|
+
"optionalLabel": "{label} (opcjonalne)",
|
|
1341
|
+
"missingFields": "Uzupełnij wymagane pola, aby połączyć: {fields}."
|
|
1335
1342
|
},
|
|
1336
1343
|
"field": {
|
|
1337
1344
|
"defaultsTo": "Wartość domyślna: {value}"
|
|
@@ -1382,7 +1389,8 @@
|
|
|
1382
1389
|
"caCertPem": "Certyfikat CA klastra (PEM)",
|
|
1383
1390
|
"caCertPemHelp": "Wklej pakiet CA klastra, aby certyfikat TLS apiservera został zweryfikowany. Pomiń tylko dla publicznie zaufanego CA.",
|
|
1384
1391
|
"insecureSkipTlsVerify": "Pomiń weryfikację TLS",
|
|
1385
|
-
"insecureSkipTlsVerifyHelp": "Zdecydowanie odradzane. Wyłącza weryfikację TLS apiservera; używaj tylko dla klastrów kind/dev."
|
|
1392
|
+
"insecureSkipTlsVerifyHelp": "Zdecydowanie odradzane. Wyłącza weryfikację TLS apiservera; używaj tylko dla klastrów kind/dev.",
|
|
1393
|
+
"invalidFields": "Uzupełnij wymagane pola prawidłowymi wartościami, aby połączyć."
|
|
1386
1394
|
},
|
|
1387
1395
|
"kubernetes": {
|
|
1388
1396
|
"label": "Nazwa",
|
|
@@ -1808,7 +1816,8 @@
|
|
|
1808
1816
|
"caCertPem": "Certyfikat CA (PEM)",
|
|
1809
1817
|
"caCertPemHelp": "Weryfikuje certyfikat TLS apiservera. Pomiń tylko dla publicznie zaufanego CA.",
|
|
1810
1818
|
"insecureSkipTlsVerify": "Pomiń weryfikację TLS",
|
|
1811
|
-
"insecureSkipTlsVerifyHelp": "Zdecydowanie odradzane: tylko klastry deweloperskie/kind."
|
|
1819
|
+
"insecureSkipTlsVerifyHelp": "Zdecydowanie odradzane: tylko klastry deweloperskie/kind.",
|
|
1820
|
+
"invalidPort": "Podaj port z zakresu od 1 do 65535."
|
|
1812
1821
|
},
|
|
1813
1822
|
"customType": {
|
|
1814
1823
|
"title": "Niestandardowe typy manifestów",
|
|
@@ -2143,7 +2152,9 @@
|
|
|
2143
2152
|
"addedTitle": "Dodano usługę",
|
|
2144
2153
|
"addedDescription": "{title} jest na tablicy, skonfiguruj ją poniżej.",
|
|
2145
2154
|
"addFailedTitle": "Nie udało się dodać usługi"
|
|
2146
|
-
}
|
|
2155
|
+
},
|
|
2156
|
+
"repoType": "Typ repozytorium",
|
|
2157
|
+
"repoTypeHint": "Czym jest to repozytorium: usługą backendową, aplikacją frontendową, współdzieloną biblioteką lub repozytorium dokumentacji (tylko dokumenty/spike'i)."
|
|
2147
2158
|
},
|
|
2148
2159
|
"repoTree": {
|
|
2149
2160
|
"root": "katalog główny",
|
|
@@ -3534,6 +3545,10 @@
|
|
|
3534
3545
|
"bootstrapFailed": "Nie udało się zainicjować",
|
|
3535
3546
|
"saveArchFailed": "Nie udało się zapisać architektury referencyjnej",
|
|
3536
3547
|
"deleteFailed": "Nie udało się usunąć"
|
|
3548
|
+
},
|
|
3549
|
+
"repoType": {
|
|
3550
|
+
"label": "Typ repozytorium",
|
|
3551
|
+
"help": "Czym jest to repozytorium: usługą backendową, aplikacją frontendową, współdzieloną biblioteką lub repozytorium dokumentacji (tylko dokumenty/spike'i)."
|
|
3537
3552
|
}
|
|
3538
3553
|
},
|
|
3539
3554
|
"mergePreset": {
|
package/i18n/locales/tr.json
CHANGED
|
@@ -39,6 +39,12 @@
|
|
|
39
39
|
"accountSettings": "Hesap ayarları"
|
|
40
40
|
},
|
|
41
41
|
"board": {
|
|
42
|
+
"repoTypes": {
|
|
43
|
+
"service": "Servis",
|
|
44
|
+
"frontend": "Frontend",
|
|
45
|
+
"library": "Kütüphane",
|
|
46
|
+
"document": "Doküman deposu"
|
|
47
|
+
},
|
|
42
48
|
"toolbar": {
|
|
43
49
|
"addService": "Servis ekle",
|
|
44
50
|
"decisionWord": "karar | karar",
|
|
@@ -1359,7 +1365,8 @@
|
|
|
1359
1365
|
"caCertPem": "CA sertifikası (PEM)",
|
|
1360
1366
|
"caCertPemHelp": "apiserver TLS sertifikasını doğrular. Yalnızca herkesçe güvenilen bir CA için atlayın.",
|
|
1361
1367
|
"insecureSkipTlsVerify": "TLS doğrulamasını atla",
|
|
1362
|
-
"insecureSkipTlsVerifyHelp": "Kesinlikle önerilmez: yalnızca geliştirme/kind kümeleri."
|
|
1368
|
+
"insecureSkipTlsVerifyHelp": "Kesinlikle önerilmez: yalnızca geliştirme/kind kümeleri.",
|
|
1369
|
+
"invalidPort": "1 ile 65535 arasında bir bağlantı noktası girin."
|
|
1363
1370
|
},
|
|
1364
1371
|
"customType": {
|
|
1365
1372
|
"title": "Özel manifest türleri",
|
|
@@ -1457,7 +1464,8 @@
|
|
|
1457
1464
|
"caCertPem": "Küme CA sertifikası (PEM)",
|
|
1458
1465
|
"caCertPemHelp": "apiserver'ın TLS sertifikasının doğrulanması için küme CA paketini yapıştırın. Yalnızca herkesçe güvenilen bir CA için boş bırakın.",
|
|
1459
1466
|
"insecureSkipTlsVerify": "TLS doğrulamasını atla",
|
|
1460
|
-
"insecureSkipTlsVerifyHelp": "Kesinlikle önerilmez. apiserver TLS doğrulamasını devre dışı bırakır; yalnızca kind/dev kümeleri için kullanın."
|
|
1467
|
+
"insecureSkipTlsVerifyHelp": "Kesinlikle önerilmez. apiserver TLS doğrulamasını devre dışı bırakır; yalnızca kind/dev kümeleri için kullanın.",
|
|
1468
|
+
"invalidFields": "Bağlanmak için zorunlu alanları geçerli değerlerle doldurun."
|
|
1461
1469
|
},
|
|
1462
1470
|
"kubernetes": {
|
|
1463
1471
|
"label": "Ad",
|
|
@@ -1497,7 +1505,8 @@
|
|
|
1497
1505
|
"updateConfiguration": "Yapılandırmayı güncelle",
|
|
1498
1506
|
"connect": "Bağlan",
|
|
1499
1507
|
"reenterSecrets": "Değişiklikleri kaydetmek için sır alanını yeniden girin — saklanan sırlar yalnızca yazılabilir ve gösterilmez. | Değişiklikleri kaydetmek için sır alanlarını yeniden girin — saklanan sırlar yalnızca yazılabilir ve gösterilmez.",
|
|
1500
|
-
"optionalLabel": "{label} (isteğe bağlı)"
|
|
1508
|
+
"optionalLabel": "{label} (isteğe bağlı)",
|
|
1509
|
+
"missingFields": "Bağlanmak için zorunlu alanları doldurun: {fields}."
|
|
1501
1510
|
},
|
|
1502
1511
|
"field": {
|
|
1503
1512
|
"defaultsTo": "Varsayılan: {value}"
|
|
@@ -2156,7 +2165,9 @@
|
|
|
2156
2165
|
"addedTitle": "Servis eklendi",
|
|
2157
2166
|
"addedDescription": "{title} panoda, aşağıdan yapılandırın.",
|
|
2158
2167
|
"addFailedTitle": "Servis eklenemedi"
|
|
2159
|
-
}
|
|
2168
|
+
},
|
|
2169
|
+
"repoType": "Depo türü",
|
|
2170
|
+
"repoTypeHint": "Bu deponun türü: bir backend servisi, bir frontend uygulaması, paylaşılan bir kütüphane veya bir doküman deposu (yalnızca doküman/spike)."
|
|
2160
2171
|
},
|
|
2161
2172
|
"repoTree": {
|
|
2162
2173
|
"root": "kök",
|
|
@@ -3547,6 +3558,10 @@
|
|
|
3547
3558
|
"bootstrapFailed": "Başlatılamadı",
|
|
3548
3559
|
"saveArchFailed": "Referans mimari kaydedilemedi",
|
|
3549
3560
|
"deleteFailed": "Silinemedi"
|
|
3561
|
+
},
|
|
3562
|
+
"repoType": {
|
|
3563
|
+
"label": "Depo türü",
|
|
3564
|
+
"help": "Bu deponun türü: bir backend servisi, bir frontend uygulaması, paylaşılan bir kütüphane veya bir doküman deposu (yalnızca doküman/spike)."
|
|
3550
3565
|
}
|
|
3551
3566
|
},
|
|
3552
3567
|
"mergePreset": {
|
package/i18n/locales/uk.json
CHANGED
|
@@ -39,6 +39,12 @@
|
|
|
39
39
|
"infrastructure": "Інфраструктура"
|
|
40
40
|
},
|
|
41
41
|
"board": {
|
|
42
|
+
"repoTypes": {
|
|
43
|
+
"service": "Сервіс",
|
|
44
|
+
"frontend": "Фронтенд",
|
|
45
|
+
"library": "Бібліотека",
|
|
46
|
+
"document": "Репозиторій документації"
|
|
47
|
+
},
|
|
42
48
|
"toolbar": {
|
|
43
49
|
"addService": "Додати сервіс",
|
|
44
50
|
"decisionWord": "рішення | рішення | рішень",
|
|
@@ -1331,7 +1337,8 @@
|
|
|
1331
1337
|
"updateConfiguration": "Оновити конфігурацію",
|
|
1332
1338
|
"connect": "Підключити",
|
|
1333
1339
|
"reenterSecrets": "Введіть секретне поле повторно, щоб зберегти зміни — збережені секрети доступні лише для запису й не показуються. | Введіть секретні поля повторно, щоб зберегти зміни — збережені секрети доступні лише для запису й не показуються. | Введіть секретні поля повторно, щоб зберегти зміни — збережені секрети доступні лише для запису й не показуються.",
|
|
1334
|
-
"optionalLabel": "{label} (необов'язково)"
|
|
1340
|
+
"optionalLabel": "{label} (необов'язково)",
|
|
1341
|
+
"missingFields": "Заповніть обовʼязкові поля, щоб підключитися: {fields}."
|
|
1335
1342
|
},
|
|
1336
1343
|
"field": {
|
|
1337
1344
|
"defaultsTo": "Типово: {value}"
|
|
@@ -1382,7 +1389,8 @@
|
|
|
1382
1389
|
"caCertPem": "Сертифікат CA кластера (PEM)",
|
|
1383
1390
|
"caCertPemHelp": "Вставте CA-набір кластера, щоб TLS-сертифікат apiserver проходив перевірку. Пропустіть лише для публічно довіреного CA.",
|
|
1384
1391
|
"insecureSkipTlsVerify": "Пропустити перевірку TLS",
|
|
1385
|
-
"insecureSkipTlsVerifyHelp": "Наполегливо не рекомендується. Вимикає перевірку TLS apiserver; використовуйте лише для кластерів kind/dev."
|
|
1392
|
+
"insecureSkipTlsVerifyHelp": "Наполегливо не рекомендується. Вимикає перевірку TLS apiserver; використовуйте лише для кластерів kind/dev.",
|
|
1393
|
+
"invalidFields": "Заповніть обовʼязкові поля правильними значеннями, щоб підключитися."
|
|
1386
1394
|
},
|
|
1387
1395
|
"kubernetes": {
|
|
1388
1396
|
"label": "Назва",
|
|
@@ -1808,7 +1816,8 @@
|
|
|
1808
1816
|
"caCertPem": "Сертифікат CA (PEM)",
|
|
1809
1817
|
"caCertPemHelp": "Перевіряє TLS-сертифікат apiserver. Пропускайте лише для публічно довіреного CA.",
|
|
1810
1818
|
"insecureSkipTlsVerify": "Пропустити перевірку TLS",
|
|
1811
|
-
"insecureSkipTlsVerifyHelp": "Наполегливо не рекомендується: лише кластери розробки/kind."
|
|
1819
|
+
"insecureSkipTlsVerifyHelp": "Наполегливо не рекомендується: лише кластери розробки/kind.",
|
|
1820
|
+
"invalidPort": "Введіть порт від 1 до 65535."
|
|
1812
1821
|
},
|
|
1813
1822
|
"customType": {
|
|
1814
1823
|
"title": "Власні типи маніфестів",
|
|
@@ -2143,7 +2152,9 @@
|
|
|
2143
2152
|
"addedTitle": "Сервіс додано",
|
|
2144
2153
|
"addedDescription": "{title} на дошці, налаштуйте його нижче.",
|
|
2145
2154
|
"addFailedTitle": "Не вдалося додати сервіс"
|
|
2146
|
-
}
|
|
2155
|
+
},
|
|
2156
|
+
"repoType": "Тип репозиторію",
|
|
2157
|
+
"repoTypeHint": "Що це за репозиторій: бекенд-сервіс, фронтенд-застосунок, спільна бібліотека або репозиторій документації (лише документи/спайки)."
|
|
2147
2158
|
},
|
|
2148
2159
|
"repoTree": {
|
|
2149
2160
|
"root": "корінь",
|
|
@@ -3534,6 +3545,10 @@
|
|
|
3534
3545
|
"bootstrapFailed": "Не вдалося ініціалізувати",
|
|
3535
3546
|
"saveArchFailed": "Не вдалося зберегти еталонну архітектуру",
|
|
3536
3547
|
"deleteFailed": "Не вдалося видалити"
|
|
3548
|
+
},
|
|
3549
|
+
"repoType": {
|
|
3550
|
+
"label": "Тип репозиторію",
|
|
3551
|
+
"help": "Що це за репозиторій: бекенд-сервіс, фронтенд-застосунок, спільна бібліотека або репозиторій документації (лише документи/спайки)."
|
|
3537
3552
|
}
|
|
3538
3553
|
},
|
|
3539
3554
|
"mergePreset": {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cat-factory/app",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.69.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",
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"valibot": "^1.4.2",
|
|
35
35
|
"vue": "^3.5.39",
|
|
36
36
|
"wretch": "^3.0.9",
|
|
37
|
-
"@cat-factory/contracts": "0.
|
|
37
|
+
"@cat-factory/contracts": "0.74.0"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"@toad-contracts/testing": "0.3.2",
|