@vibesdotdev/integrations-kubernetes 0.0.0-stage → 1.0.0-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/README.md +19 -2
  2. package/dist/helm-chart.d.ts +13 -0
  3. package/dist/helm-chart.d.ts.map +1 -0
  4. package/dist/helm-chart.js +508 -0
  5. package/dist/helm-chart.js.map +1 -0
  6. package/dist/index.d.ts +2 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +2 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/k8s-configmap.d.ts +25 -0
  11. package/dist/k8s-configmap.d.ts.map +1 -0
  12. package/dist/k8s-configmap.js +168 -0
  13. package/dist/k8s-configmap.js.map +1 -0
  14. package/dist/k8s-gpu-operator.d.ts +3 -0
  15. package/dist/k8s-gpu-operator.d.ts.map +1 -0
  16. package/dist/k8s-gpu-operator.js +53 -0
  17. package/dist/k8s-gpu-operator.js.map +1 -0
  18. package/dist/k8s-namespace.d.ts +51 -0
  19. package/dist/k8s-namespace.d.ts.map +1 -0
  20. package/dist/k8s-namespace.js +280 -0
  21. package/dist/k8s-namespace.js.map +1 -0
  22. package/dist/k8s-pod-health.d.ts +60 -0
  23. package/dist/k8s-pod-health.d.ts.map +1 -0
  24. package/dist/k8s-pod-health.js +376 -0
  25. package/dist/k8s-pod-health.js.map +1 -0
  26. package/dist/k8s-secret.d.ts +55 -0
  27. package/dist/k8s-secret.d.ts.map +1 -0
  28. package/dist/k8s-secret.js +391 -0
  29. package/dist/k8s-secret.js.map +1 -0
  30. package/dist/kind-cluster.d.ts +84 -0
  31. package/dist/kind-cluster.d.ts.map +1 -0
  32. package/dist/kind-cluster.js +694 -0
  33. package/dist/kind-cluster.js.map +1 -0
  34. package/dist/kubectl-budget.client.d.ts +13 -0
  35. package/dist/kubectl-budget.client.d.ts.map +1 -0
  36. package/dist/kubectl-budget.client.js +38 -0
  37. package/dist/kubectl-budget.client.js.map +1 -0
  38. package/dist/kubectl.d.ts +59 -0
  39. package/dist/kubectl.d.ts.map +1 -0
  40. package/dist/kubectl.js +121 -0
  41. package/dist/kubectl.js.map +1 -0
  42. package/dist/port-forward-command.d.ts +6 -0
  43. package/dist/port-forward-command.d.ts.map +1 -0
  44. package/dist/port-forward-command.js +24 -0
  45. package/dist/port-forward-command.js.map +1 -0
  46. package/dist/port-forward-compat.d.ts +11 -0
  47. package/dist/port-forward-compat.d.ts.map +1 -0
  48. package/dist/port-forward-compat.js +21 -0
  49. package/dist/port-forward-compat.js.map +1 -0
  50. package/dist/port-forward-identity.d.ts +23 -0
  51. package/dist/port-forward-identity.d.ts.map +1 -0
  52. package/dist/port-forward-identity.js +72 -0
  53. package/dist/port-forward-identity.js.map +1 -0
  54. package/dist/port-forward.consumer.plugin.d.ts +3 -0
  55. package/dist/port-forward.consumer.plugin.d.ts.map +1 -0
  56. package/dist/port-forward.consumer.plugin.js +10 -0
  57. package/dist/port-forward.consumer.plugin.js.map +1 -0
  58. package/dist/port-forward.d.ts +18 -0
  59. package/dist/port-forward.d.ts.map +1 -0
  60. package/dist/port-forward.descriptor.d.ts +7 -0
  61. package/dist/port-forward.descriptor.d.ts.map +1 -0
  62. package/dist/port-forward.descriptor.js +3 -0
  63. package/dist/port-forward.descriptor.js.map +1 -0
  64. package/dist/port-forward.impl.consumer.d.ts +22 -0
  65. package/dist/port-forward.impl.consumer.d.ts.map +1 -0
  66. package/dist/port-forward.impl.consumer.js +32 -0
  67. package/dist/port-forward.impl.consumer.js.map +1 -0
  68. package/dist/port-forward.js +26 -0
  69. package/dist/port-forward.js.map +1 -0
  70. package/dist/port-forward.kind.d.ts +13 -0
  71. package/dist/port-forward.kind.d.ts.map +1 -0
  72. package/dist/port-forward.kind.js +12 -0
  73. package/dist/port-forward.kind.js.map +1 -0
  74. package/dist/resource-providers.consumer.plugin.d.ts +3 -0
  75. package/dist/resource-providers.consumer.plugin.d.ts.map +1 -0
  76. package/dist/resource-providers.consumer.plugin.js +56 -0
  77. package/dist/resource-providers.consumer.plugin.js.map +1 -0
  78. package/dist/schemas/helm-chart.d.ts +14 -0
  79. package/dist/schemas/helm-chart.d.ts.map +1 -0
  80. package/dist/schemas/helm-chart.js +12 -0
  81. package/dist/schemas/helm-chart.js.map +1 -0
  82. package/dist/schemas/k8s-pod-health.d.ts +17 -0
  83. package/dist/schemas/k8s-pod-health.d.ts.map +1 -0
  84. package/dist/schemas/k8s-pod-health.js +21 -0
  85. package/dist/schemas/k8s-pod-health.js.map +1 -0
  86. package/dist/schemas/port-forward.d.ts +62 -0
  87. package/dist/schemas/port-forward.d.ts.map +1 -0
  88. package/dist/schemas/port-forward.js +24 -0
  89. package/dist/schemas/port-forward.js.map +1 -0
  90. package/dist/tool-env.d.ts +19 -0
  91. package/dist/tool-env.d.ts.map +1 -0
  92. package/dist/tool-env.js +32 -0
  93. package/dist/tool-env.js.map +1 -0
  94. package/package.json +80 -4
@@ -0,0 +1,391 @@
1
+ /**
2
+ * Kubernetes Secret Resource Providers
3
+ *
4
+ * Three providers in one file (they share kubectl plumbing):
5
+ * - `k8s/secret` — Opaque secret from key/value pairs
6
+ * - `k8s/secret-tls` — kubernetes.io/tls secret from cert+key files
7
+ * - `k8s/secret-docker-registry` — kubernetes.io/dockerconfigjson secret
8
+ *
9
+ * Each replaces a slice of the prior bash-script `k8s/secret-setup` provider,
10
+ * which had a single readiness check ("any secret exists in namespace") that
11
+ * could not detect a silently-skipped TLS secret. These typed providers each
12
+ * verify their own secret by name (and by type, where it matters), so a
13
+ * partial failure surfaces at the resource that owns it.
14
+ */
15
+ import { CapabilityError } from '@vibesdotdev/kernel';
16
+ import * as z from 'zod/v4';
17
+ import { readJsonObject, setupErrorResult, toolFailure, toolOutputExcerpt } from '@vibesdotdev/pm/resources/tool-env';
18
+ import { runKubeCapture } from "./tool-env.js";
19
+ import { attempt } from '@vibesdotdev/pm/utils/attempt';
20
+ import { pmFileSystem } from '@vibesdotdev/pm/helpers/runtime-files';
21
+ import { JsonObjectSchema } from '@vibesdotdev/kernel/schemas/json';
22
+ const KUBECTL_REQUEST_TIMEOUT = '5s';
23
+ /**
24
+ * Apply a Secret manifest on stdin. kubectl's rejection can echo the object it
25
+ * was handed, so its output reaches the failure only as a bounded excerpt with
26
+ * every `secrets` value (as given and base64) removed, or not at all
27
+ * (`'value-free'`) when the manifest holds values PM never saw.
28
+ */
29
+ async function applyManifest(runtime, manifest, opts, secrets) {
30
+ const cmd = ['kubectl', 'apply', '-f', '-', '--namespace', opts.namespace];
31
+ if (opts.context)
32
+ cmd.push('--context', opts.context);
33
+ const outcome = await runKubeCapture(runtime, cmd[0], cmd.slice(1), { stdin: manifest });
34
+ if (outcome.exitCode !== 0) {
35
+ throw toolFailure({ tool: 'kubectl', action: 'apply', outcome, secrets });
36
+ }
37
+ }
38
+ /** Delete a secret by name; an absent secret is the goal, any other failure is typed. */
39
+ async function deleteSecret(runtime, name, opts) {
40
+ const cmd = ['kubectl', 'delete', 'secret', name, '--namespace', opts.namespace, '--ignore-not-found=true'];
41
+ if (opts.context)
42
+ cmd.push('--context', opts.context);
43
+ const outcome = await runKubeCapture(runtime, cmd[0], cmd.slice(1));
44
+ if (outcome.exitCode !== 0)
45
+ throw toolFailure({ tool: 'kubectl', action: 'delete secret', outcome });
46
+ }
47
+ async function generateManifest(runtime, createArgs, opts) {
48
+ const cmd = ['kubectl', 'create', ...createArgs, '--namespace', opts.namespace];
49
+ if (opts.context)
50
+ cmd.push('--context', opts.context);
51
+ cmd.push('--dry-run=client', '-o', 'yaml');
52
+ const outcome = await runKubeCapture(runtime, cmd[0], cmd.slice(1));
53
+ if (outcome.exitCode !== 0) {
54
+ // The generator read the key material from files: none of its output is kept.
55
+ throw toolFailure({ tool: 'kubectl', action: 'create --dry-run', outcome, secrets: 'value-free' });
56
+ }
57
+ return outcome.stdout;
58
+ }
59
+ /** `value`'s UTF-8 bytes as base64 (a Secret's `data` encoding). */
60
+ function base64Utf8(value) {
61
+ let binary = '';
62
+ for (const byte of new TextEncoder().encode(value))
63
+ binary += String.fromCharCode(byte);
64
+ return btoa(binary);
65
+ }
66
+ /**
67
+ * A Secret manifest built in-process and handed to `kubectl apply -f -` on
68
+ * stdin. Secret values never go on a command line, where every process on the
69
+ * host can read them (pm.md R2); kubectl's own `create --dry-run` generator
70
+ * takes them only as argv, so it is not used for literal values.
71
+ */
72
+ export function buildSecretManifest(name, namespace, type, stringData) {
73
+ const data = Object.fromEntries(Object.entries(stringData).map(([key, value]) => [key, base64Utf8(value)]));
74
+ return JSON.stringify({ apiVersion: 'v1', kind: 'Secret', metadata: { name, namespace }, type, data });
75
+ }
76
+ /** The `.dockerconfigjson` payload `kubectl create secret docker-registry` writes. */
77
+ export function dockerConfigJson(server, username, password, email) {
78
+ const auth = base64Utf8(`${username}:${password}`);
79
+ return JSON.stringify({ auths: { [server]: { username, password, email, auth } } });
80
+ }
81
+ const SecretObjectSchema = z.object({ type: z.string().optional(), data: JsonObjectSchema.optional() });
82
+ async function inspectSecret(runtime, name, opts) {
83
+ const cmd = [
84
+ 'kubectl',
85
+ 'get',
86
+ 'secret',
87
+ name,
88
+ '--namespace',
89
+ opts.namespace,
90
+ '--request-timeout',
91
+ KUBECTL_REQUEST_TIMEOUT,
92
+ '-o',
93
+ 'json'
94
+ ];
95
+ if (opts.context)
96
+ cmd.push('--context', opts.context);
97
+ const { exitCode, stdout, stderr } = await runKubeCapture(runtime, cmd[0], cmd.slice(1));
98
+ if (exitCode !== 0) {
99
+ if (stderr.includes('NotFound') || stderr.includes('not found')) {
100
+ return { exists: false, dataKeys: [] };
101
+ }
102
+ return { exists: false, dataKeys: [], error: toolOutputExcerpt(stderr) };
103
+ }
104
+ // The object kubectl printed carries the secret's data: only its type and key names are read.
105
+ const object = readJsonObject(SecretObjectSchema, stdout);
106
+ if (!object) {
107
+ return { exists: false, dataKeys: [], error: `kubectl get secret ${name} answered an unreadable object` };
108
+ }
109
+ return { exists: true, type: object.type, dataKeys: Object.keys(object.data ?? {}) };
110
+ }
111
+ function readyState(config, metadata) {
112
+ return {
113
+ state: {
114
+ id: config.id,
115
+ type: config.type,
116
+ status: 'ready',
117
+ createdAt: new Date(),
118
+ lastChecked: new Date(),
119
+ metadata
120
+ }
121
+ };
122
+ }
123
+ // ──────────────────────────────────────────────────────────────────────────
124
+ // k8s/secret — Opaque secret from key/value pairs (manifest on stdin)
125
+ // ──────────────────────────────────────────────────────────────────────────
126
+ const SecretConfigSchema = z.object({
127
+ name: z.string().min(1),
128
+ namespace: z.string().min(1),
129
+ context: z.string().optional(),
130
+ data: z.record(z.string().min(1), z.string()).refine((d) => Object.keys(d).length > 0, {
131
+ message: 'data must contain at least one key/value pair'
132
+ })
133
+ });
134
+ /** The refusal for a secret whose post-apply check failed: what is wrong, and where. */
135
+ function secretCheckFailed(message, reason, name, namespace) {
136
+ return new CapabilityError(message, 'UNAVAILABLE', { reason, retryable: true, details: { name, namespace } });
137
+ }
138
+ /** Apply the Opaque secret manifest on stdin, then verify the secret is visible with every declared key. */
139
+ async function applyOpaqueSecret(runtime, config, cfg) {
140
+ const manifest = buildSecretManifest(cfg.name, cfg.namespace, 'Opaque', cfg.data);
141
+ await applyManifest(runtime, manifest, cfg, Object.values(cfg.data));
142
+ // Verify post-apply: the secret exists with the expected keys.
143
+ const info = await inspectSecret(runtime, cfg.name, cfg);
144
+ if (!info.exists) {
145
+ throw secretCheckFailed(`Secret '${cfg.name}' was applied but is not visible to kubectl get`, 'pm-secret-not-visible', cfg.name, cfg.namespace);
146
+ }
147
+ const expected = new Set(Object.keys(cfg.data));
148
+ const missing = [...expected].filter((k) => !info.dataKeys.includes(k));
149
+ if (missing.length > 0) {
150
+ throw secretCheckFailed(`Secret '${cfg.name}' is missing expected keys: ${missing.join(', ')}`, 'pm-secret-keys-missing', cfg.name, cfg.namespace);
151
+ }
152
+ return readyState(config, {
153
+ name: cfg.name,
154
+ namespace: cfg.namespace,
155
+ keys: info.dataKeys
156
+ });
157
+ }
158
+ export const k8sSecretProvider = {
159
+ type: 'k8s/secret',
160
+ async setup(config, { runtime }) {
161
+ const cfg = SecretConfigSchema.parse(config.config);
162
+ const applied = await attempt(() => applyOpaqueSecret(runtime, config, cfg));
163
+ return applied.ok ? applied.value : setupErrorResult(config, applied.failure);
164
+ },
165
+ async teardown(id, _state, { runtime, config: providerConfig }) {
166
+ const stored = providerConfig;
167
+ if (!stored)
168
+ return;
169
+ const cfg = SecretConfigSchema.parse(stored.config);
170
+ await deleteSecret(runtime, cfg.name, cfg);
171
+ },
172
+ async status(id, { runtime, config: providerConfig }) {
173
+ const stored = providerConfig;
174
+ if (!stored)
175
+ return { status: 'missing' };
176
+ const cfg = SecretConfigSchema.parse(stored.config);
177
+ const info = await inspectSecret(runtime, cfg.name, cfg);
178
+ if (info.error)
179
+ return { status: 'error', error: info.error };
180
+ if (!info.exists)
181
+ return { status: 'missing' };
182
+ const expected = Object.keys(cfg.data);
183
+ const missing = expected.filter((k) => !info.dataKeys.includes(k));
184
+ if (missing.length > 0) {
185
+ return {
186
+ status: 'error',
187
+ error: `Secret exists but is missing keys: ${missing.join(', ')}`
188
+ };
189
+ }
190
+ return { status: 'ready', metadata: { keys: info.dataKeys } };
191
+ },
192
+ async checkReady(config, _state, { runtime }) {
193
+ const cfg = SecretConfigSchema.parse(config.config);
194
+ const info = await inspectSecret(runtime, cfg.name, cfg);
195
+ if (!info.exists) {
196
+ return { ready: false, reason: `Secret '${cfg.name}' not found in ${cfg.namespace}` };
197
+ }
198
+ const missing = Object.keys(cfg.data).filter((k) => !info.dataKeys.includes(k));
199
+ if (missing.length > 0) {
200
+ return { ready: false, reason: `Secret missing keys: ${missing.join(', ')}` };
201
+ }
202
+ return { ready: true };
203
+ },
204
+ validateConfig(config) {
205
+ return SecretConfigSchema.parse(config);
206
+ },
207
+ describe(config) {
208
+ const cfg = SecretConfigSchema.parse(config.config);
209
+ return `k8s Opaque secret '${cfg.name}' in ${cfg.namespace}`;
210
+ }
211
+ };
212
+ // ──────────────────────────────────────────────────────────────────────────
213
+ // k8s/secret-tls — kubernetes.io/tls from cert + key files
214
+ // ──────────────────────────────────────────────────────────────────────────
215
+ const TlsSecretConfigSchema = z.object({
216
+ name: z.string().min(1),
217
+ namespace: z.string().min(1),
218
+ context: z.string().optional(),
219
+ certPath: z.string().min(1),
220
+ keyPath: z.string().min(1)
221
+ });
222
+ /** Generate the TLS secret manifest from the cert and key files, apply it, then verify the secret and its type. */
223
+ async function applyTlsSecret(runtime, config, cfg) {
224
+ const files = await pmFileSystem(runtime);
225
+ if (!(await files.exists(cfg.certPath))) {
226
+ throw new CapabilityError(`Cert file not found: ${cfg.certPath}`, 'NOT_FOUND', {
227
+ reason: 'pm-secret-tls-cert-missing',
228
+ details: { path: cfg.certPath }
229
+ });
230
+ }
231
+ if (!(await files.exists(cfg.keyPath))) {
232
+ throw new CapabilityError(`Key file not found: ${cfg.keyPath}`, 'NOT_FOUND', {
233
+ reason: 'pm-secret-tls-key-missing',
234
+ details: { path: cfg.keyPath }
235
+ });
236
+ }
237
+ const args = ['secret', 'tls', cfg.name, `--cert=${cfg.certPath}`, `--key=${cfg.keyPath}`];
238
+ const manifest = await generateManifest(runtime, args, cfg);
239
+ await applyManifest(runtime, manifest, cfg, 'value-free');
240
+ const info = await inspectSecret(runtime, cfg.name, cfg);
241
+ if (!info.exists) {
242
+ throw secretCheckFailed(`TLS secret '${cfg.name}' was applied but is not visible`, 'pm-secret-not-visible', cfg.name, cfg.namespace);
243
+ }
244
+ if (info.type !== 'kubernetes.io/tls') {
245
+ throw secretCheckFailed(`TLS secret '${cfg.name}' has unexpected type '${info.type}' (want kubernetes.io/tls)`, 'pm-secret-type-mismatch', cfg.name, cfg.namespace);
246
+ }
247
+ return readyState(config, {
248
+ name: cfg.name,
249
+ namespace: cfg.namespace,
250
+ certPath: cfg.certPath,
251
+ keyPath: cfg.keyPath
252
+ });
253
+ }
254
+ export const k8sSecretTlsProvider = {
255
+ type: 'k8s/secret-tls',
256
+ async setup(config, { runtime }) {
257
+ const cfg = TlsSecretConfigSchema.parse(config.config);
258
+ const applied = await attempt(() => applyTlsSecret(runtime, config, cfg));
259
+ return applied.ok ? applied.value : setupErrorResult(config, applied.failure);
260
+ },
261
+ async teardown(id, _state, { runtime, config: providerConfig }) {
262
+ const stored = providerConfig;
263
+ if (!stored)
264
+ return;
265
+ const cfg = TlsSecretConfigSchema.parse(stored.config);
266
+ await deleteSecret(runtime, cfg.name, cfg);
267
+ },
268
+ async status(id, { runtime, config: providerConfig }) {
269
+ const stored = providerConfig;
270
+ if (!stored)
271
+ return { status: 'missing' };
272
+ const cfg = TlsSecretConfigSchema.parse(stored.config);
273
+ const info = await inspectSecret(runtime, cfg.name, cfg);
274
+ if (info.error)
275
+ return { status: 'error', error: info.error };
276
+ if (!info.exists)
277
+ return { status: 'missing' };
278
+ if (info.type !== 'kubernetes.io/tls') {
279
+ return {
280
+ status: 'error',
281
+ error: `Secret exists but has type '${info.type}' (want kubernetes.io/tls)`
282
+ };
283
+ }
284
+ return { status: 'ready', metadata: { type: info.type } };
285
+ },
286
+ async checkReady(config, _state, { runtime }) {
287
+ const cfg = TlsSecretConfigSchema.parse(config.config);
288
+ const info = await inspectSecret(runtime, cfg.name, cfg);
289
+ if (!info.exists) {
290
+ return { ready: false, reason: `TLS secret '${cfg.name}' not found in ${cfg.namespace}` };
291
+ }
292
+ if (info.type !== 'kubernetes.io/tls') {
293
+ return {
294
+ ready: false,
295
+ reason: `Secret has wrong type '${info.type}' (want kubernetes.io/tls)`
296
+ };
297
+ }
298
+ return { ready: true };
299
+ },
300
+ validateConfig(config) {
301
+ return TlsSecretConfigSchema.parse(config);
302
+ },
303
+ describe(config) {
304
+ const cfg = TlsSecretConfigSchema.parse(config.config);
305
+ return `k8s TLS secret '${cfg.name}' in ${cfg.namespace}`;
306
+ }
307
+ };
308
+ // ──────────────────────────────────────────────────────────────────────────
309
+ // k8s/secret-docker-registry — kubernetes.io/dockerconfigjson
310
+ // ──────────────────────────────────────────────────────────────────────────
311
+ const DockerRegistryConfigSchema = z.object({
312
+ name: z.string().min(1),
313
+ namespace: z.string().min(1),
314
+ context: z.string().optional(),
315
+ server: z.string().min(1),
316
+ username: z.string().min(1),
317
+ password: z.string().min(1),
318
+ email: z.string().min(1)
319
+ });
320
+ /** Apply the docker-registry secret manifest on stdin, then verify the secret and its type. */
321
+ async function applyRegistrySecret(runtime, config, cfg) {
322
+ const dockerConfig = dockerConfigJson(cfg.server, cfg.username, cfg.password, cfg.email);
323
+ const manifest = buildSecretManifest(cfg.name, cfg.namespace, 'kubernetes.io/dockerconfigjson', {
324
+ '.dockerconfigjson': dockerConfig
325
+ });
326
+ await applyManifest(runtime, manifest, cfg, [cfg.password, dockerConfig, base64Utf8(`${cfg.username}:${cfg.password}`)]);
327
+ const info = await inspectSecret(runtime, cfg.name, cfg);
328
+ if (!info.exists) {
329
+ throw secretCheckFailed(`Registry secret '${cfg.name}' was applied but is not visible`, 'pm-secret-not-visible', cfg.name, cfg.namespace);
330
+ }
331
+ if (info.type !== 'kubernetes.io/dockerconfigjson') {
332
+ throw secretCheckFailed(`Registry secret '${cfg.name}' has unexpected type '${info.type}' (want kubernetes.io/dockerconfigjson)`, 'pm-secret-type-mismatch', cfg.name, cfg.namespace);
333
+ }
334
+ return readyState(config, {
335
+ name: cfg.name,
336
+ namespace: cfg.namespace,
337
+ server: cfg.server
338
+ });
339
+ }
340
+ export const k8sSecretDockerRegistryProvider = {
341
+ type: 'k8s/secret-docker-registry',
342
+ async setup(config, { runtime }) {
343
+ const cfg = DockerRegistryConfigSchema.parse(config.config);
344
+ const applied = await attempt(() => applyRegistrySecret(runtime, config, cfg));
345
+ return applied.ok ? applied.value : setupErrorResult(config, applied.failure);
346
+ },
347
+ async teardown(id, _state, { runtime, config: providerConfig }) {
348
+ const stored = providerConfig;
349
+ if (!stored)
350
+ return;
351
+ const cfg = DockerRegistryConfigSchema.parse(stored.config);
352
+ await deleteSecret(runtime, cfg.name, cfg);
353
+ },
354
+ async status(id, { runtime, config: providerConfig }) {
355
+ const stored = providerConfig;
356
+ if (!stored)
357
+ return { status: 'missing' };
358
+ const cfg = DockerRegistryConfigSchema.parse(stored.config);
359
+ const info = await inspectSecret(runtime, cfg.name, cfg);
360
+ if (info.error)
361
+ return { status: 'error', error: info.error };
362
+ if (!info.exists)
363
+ return { status: 'missing' };
364
+ if (info.type !== 'kubernetes.io/dockerconfigjson') {
365
+ return {
366
+ status: 'error',
367
+ error: `Secret exists but has type '${info.type}' (want kubernetes.io/dockerconfigjson)`
368
+ };
369
+ }
370
+ return { status: 'ready', metadata: { type: info.type } };
371
+ },
372
+ async checkReady(config, _state, { runtime }) {
373
+ const cfg = DockerRegistryConfigSchema.parse(config.config);
374
+ const info = await inspectSecret(runtime, cfg.name, cfg);
375
+ if (!info.exists) {
376
+ return {
377
+ ready: false,
378
+ reason: `Registry secret '${cfg.name}' not found in ${cfg.namespace}`
379
+ };
380
+ }
381
+ return { ready: true };
382
+ },
383
+ validateConfig(config) {
384
+ return DockerRegistryConfigSchema.parse(config);
385
+ },
386
+ describe(config) {
387
+ const cfg = DockerRegistryConfigSchema.parse(config.config);
388
+ return `k8s docker-registry secret '${cfg.name}' in ${cfg.namespace}`;
389
+ }
390
+ };
391
+ //# sourceMappingURL=k8s-secret.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"k8s-secret.js","sourceRoot":"","sources":["../src/k8s-secret.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Kind Cluster Resource Provider
3
+ * Manages Kind (Kubernetes in Docker) cluster lifecycle including local registry
4
+ *
5
+ * Handles:
6
+ * - Cluster creation with local registry
7
+ * - Orphaned registry detection and cleanup
8
+ * - Cluster recovery (restart vs recreate)
9
+ * - Full lifecycle management
10
+ */
11
+ import type { ResourceProviderRuntime } from '@vibesdotdev/pm/resources/provider';
12
+ import * as z from 'zod/v4';
13
+ import type { ResourceProvider, ResourceProviderContext, ResourceSetupResult, ResourceStatusResult, ResourceReadyCheckResult } from '@vibesdotdev/pm/resources/provider';
14
+ import type { ProviderPayload, ResourceConfig, ResourceState } from '@vibesdotdev/pm/schemas/resource';
15
+ /**
16
+ * Kind cluster provider configuration schema
17
+ */
18
+ declare const KindClusterConfigSchema: z.ZodObject<{
19
+ name: z.ZodOptional<z.ZodString>;
20
+ registry: z.ZodDefault<z.ZodBoolean>;
21
+ registryPort: z.ZodDefault<z.ZodNumber>;
22
+ registryName: z.ZodDefault<z.ZodString>;
23
+ configFile: z.ZodOptional<z.ZodString>;
24
+ nodeImage: z.ZodOptional<z.ZodString>;
25
+ waitTimeout: z.ZodDefault<z.ZodNumber>;
26
+ }, z.core.$strip>;
27
+ type KindClusterConfig = z.infer<typeof KindClusterConfigSchema>;
28
+ /**
29
+ * List PersistentVolumeClaims in the cluster whose underlying storage
30
+ * would be lost on `kind delete cluster`. By default, kind uses the
31
+ * local-path-provisioner which writes data into the kind container's
32
+ * filesystem — NOT a host bind mount — so PVCs are destroyed with the
33
+ * cluster. Returns a list of `<namespace>/<name>` strings.
34
+ *
35
+ * Returns an empty list when kubectl is unavailable, the context doesn't
36
+ * exist, or there are no PVCs — the recreate command treats that as
37
+ * "no stateful data at risk".
38
+ */
39
+ export declare function listAtRiskPVCs(runtime: ResourceProviderRuntime, clusterName: string): Promise<string[]>;
40
+ /**
41
+ * Kind Cluster Provider
42
+ * Creates and manages Kind clusters with local registry support
43
+ */
44
+ export declare class KindClusterProvider implements ResourceProvider<KindClusterConfig> {
45
+ readonly type = "kind";
46
+ readonly subType = "cluster";
47
+ private readonly configStore;
48
+ /**
49
+ * Setup (create or ensure) a kind cluster
50
+ */
51
+ setup(config: ResourceConfig, { runtime }: ResourceProviderContext): Promise<ResourceSetupResult>;
52
+ /**
53
+ * Create success result
54
+ */
55
+ private createSuccessResult;
56
+ /**
57
+ * Teardown (delete) cluster and registry
58
+ */
59
+ teardown(id: string, state: ResourceState | undefined, { runtime }: ResourceProviderContext): Promise<void>;
60
+ /**
61
+ * Get status of cluster
62
+ */
63
+ status(id: string, { runtime }: ResourceProviderContext): Promise<ResourceStatusResult>;
64
+ /**
65
+ * Check if cluster is ready
66
+ */
67
+ checkReady(config: ResourceConfig, _state: ResourceState, { runtime }: ResourceProviderContext): Promise<ResourceReadyCheckResult>;
68
+ /**
69
+ * Validate provider-specific configuration
70
+ */
71
+ validateConfig(config: ProviderPayload): KindClusterConfig;
72
+ /**
73
+ * Get human-readable description
74
+ */
75
+ describe(config: ResourceConfig): string;
76
+ /**
77
+ * Data a `kind delete cluster` would destroy: the cluster's PVCs on
78
+ * kind's default local-path provisioner (see {@link listAtRiskPVCs}).
79
+ */
80
+ listAtRiskData(config: ResourceConfig, { runtime }: ResourceProviderContext): Promise<string[]>;
81
+ computeSourceHash(config: ResourceConfig, { runtime }: ResourceProviderContext): Promise<string | null>;
82
+ }
83
+ export {};
84
+ //# sourceMappingURL=kind-cluster.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kind-cluster.d.ts","sourceRoot":"","sources":["../src/kind-cluster.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAClF,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;AAE5B,OAAO,KAAK,EACX,gBAAgB,EAChB,uBAAuB,EACvB,mBAAmB,EACnB,oBAAoB,EACpB,wBAAwB,EACxB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAUvG;;GAEG;AACH,QAAA,MAAM,uBAAuB;;;;;;;;iBAe3B,CAAC;AAEH,KAAK,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAuVjE;;;;;;;;;;GAUG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,uBAAuB,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAwC7G;AA+HD;;;GAGG;AACH,qBAAa,mBAAoB,YAAW,gBAAgB,CAAC,iBAAiB,CAAC;IAC9E,QAAQ,CAAC,IAAI,UAAU;IACvB,QAAQ,CAAC,OAAO,aAAa;IAC7B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqC;IAEjE;;OAEG;IACG,KAAK,CAAC,MAAM,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,EAAE,uBAAuB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAyDvG;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAsC3B;;OAEG;IACG,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,SAAS,EAAE,EAAE,OAAO,EAAE,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BjH;;OAEG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,uBAAuB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA0B7F;;OAEG;IACG,UAAU,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,OAAO,EAAE,EAAE,uBAAuB,GAAG,OAAO,CAAC,wBAAwB,CAAC;IA2BxI;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,eAAe,GAAG,iBAAiB;IAI1D;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM;IASxC;;;OAGG;IACG,cAAc,CAAC,MAAM,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,EAAE,uBAAuB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAK/F,iBAAiB,CAAC,MAAM,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,EAAE,uBAAuB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAwB7G"}