@kimchi-dev/kimchictl 0.0.7 → 0.0.8
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/dist/api/templates.d.ts +46 -0
- package/dist/api/templates.d.ts.map +1 -0
- package/dist/api/templates.js +110 -0
- package/dist/api/templates.js.map +1 -0
- package/dist/commands/guard.d.ts.map +1 -1
- package/dist/commands/guard.js +3 -0
- package/dist/commands/guard.js.map +1 -1
- package/dist/commands/workspace.d.ts.map +1 -1
- package/dist/commands/workspace.js +173 -4
- package/dist/commands/workspace.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
- package/src/api/templates.ts +187 -0
- package/src/commands/guard.ts +3 -0
- package/src/commands/workspace.test.ts +93 -0
- package/src/commands/workspace.ts +193 -4
- package/src/version.ts +1 -1
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { ApiOptions } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Workspace-template client — read-only surface against the
|
|
4
|
+
* WorkspaceTemplatesAPI (proto: workspacetemplates_api.proto).
|
|
5
|
+
*
|
|
6
|
+
* Templates are named, organization-scoped presets of workspace creation
|
|
7
|
+
* parameters (resources, dependencies, egress policy, init script). They are
|
|
8
|
+
* curated by admins; `workspace create --template <name>` resolves them.
|
|
9
|
+
*/
|
|
10
|
+
export interface WorkspaceTemplateSpec {
|
|
11
|
+
resources?: {
|
|
12
|
+
cpu?: string;
|
|
13
|
+
memory?: string;
|
|
14
|
+
pvcSize?: string;
|
|
15
|
+
};
|
|
16
|
+
dependencies?: string[];
|
|
17
|
+
egressPolicy?: {
|
|
18
|
+
denyByDefault?: boolean;
|
|
19
|
+
allowed?: string[];
|
|
20
|
+
denied?: string[];
|
|
21
|
+
};
|
|
22
|
+
initScript?: string;
|
|
23
|
+
}
|
|
24
|
+
export interface WorkspaceTemplate {
|
|
25
|
+
id: string;
|
|
26
|
+
organizationId: string;
|
|
27
|
+
name: string;
|
|
28
|
+
description: string;
|
|
29
|
+
spec?: WorkspaceTemplateSpec;
|
|
30
|
+
createdBy: string;
|
|
31
|
+
updatedBy: string;
|
|
32
|
+
createTime: Date;
|
|
33
|
+
updateTime: Date;
|
|
34
|
+
}
|
|
35
|
+
export interface WorkspaceTemplateOptions extends ApiOptions {
|
|
36
|
+
orgId?: string;
|
|
37
|
+
}
|
|
38
|
+
export declare class TemplateNotFoundError extends Error {
|
|
39
|
+
constructor(ref: string);
|
|
40
|
+
}
|
|
41
|
+
export declare class AmbiguousTemplateError extends Error {
|
|
42
|
+
constructor(ref: string, candidates: string[]);
|
|
43
|
+
}
|
|
44
|
+
export declare function listWorkspaceTemplates(apiKey: string, options?: WorkspaceTemplateOptions): Promise<WorkspaceTemplate[]>;
|
|
45
|
+
export declare function getWorkspaceTemplate(apiKey: string, id: string, options?: WorkspaceTemplateOptions): Promise<WorkspaceTemplate>;
|
|
46
|
+
//# sourceMappingURL=templates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"../src/","sources":["api/templates.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAG5C;;;;;;;GAOG;AAEH,MAAM,WAAW,qBAAqB;IACrC,SAAS,CAAC,EAAE;QACX,GAAG,CAAC,EAAE,MAAM,CAAA;QACZ,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,OAAO,CAAC,EAAE,MAAM,CAAA;KAChB,CAAA;IACD,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,YAAY,CAAC,EAAE;QACd,aAAa,CAAC,EAAE,OAAO,CAAA;QACvB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;QAClB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;KACjB,CAAA;IACD,UAAU,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,iBAAiB;IACjC,EAAE,EAAE,MAAM,CAAA;IACV,cAAc,EAAE,MAAM,CAAA;IACtB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,CAAC,EAAE,qBAAqB,CAAA;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,IAAI,CAAA;IAChB,UAAU,EAAE,IAAI,CAAA;CAChB;AAED,MAAM,WAAW,wBAAyB,SAAQ,UAAU;IAC3D,KAAK,CAAC,EAAE,MAAM,CAAA;CACd;AAMD,qBAAa,qBAAsB,SAAQ,KAAK;gBACnC,GAAG,EAAE,MAAM;CAIvB;AAED,qBAAa,sBAAuB,SAAQ,KAAK;gBACpC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE;CAI7C;AAED,wBAAsB,sBAAsB,CAC3C,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,wBAAwB,GAChC,OAAO,CAAC,iBAAiB,EAAE,CAAC,CA2B9B;AAED,wBAAsB,oBAAoB,CACzC,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE,wBAAwB,GAChC,OAAO,CAAC,iBAAiB,CAAC,CAiB5B"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { checkResponse, fetchWithTimeout, resolveEndpoint } from "./http.js";
|
|
2
|
+
import { verifyApiKey } from "./keys.js";
|
|
3
|
+
import { RemoteNetworkError } from "./types.js";
|
|
4
|
+
async function resolveOrgId(apiKey, options) {
|
|
5
|
+
return options?.orgId ?? (await verifyApiKey(apiKey, options));
|
|
6
|
+
}
|
|
7
|
+
export class TemplateNotFoundError extends Error {
|
|
8
|
+
constructor(ref) {
|
|
9
|
+
super(`No workspace template matches "${ref}" — list with: kimchictl workspace templates list`);
|
|
10
|
+
this.name = "TemplateNotFoundError";
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export class AmbiguousTemplateError extends Error {
|
|
14
|
+
constructor(ref, candidates) {
|
|
15
|
+
super(`Multiple workspace templates match "${ref}": ${candidates.join(", ")} — use the full name`);
|
|
16
|
+
this.name = "AmbiguousTemplateError";
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export async function listWorkspaceTemplates(apiKey, options) {
|
|
20
|
+
const fetchImpl = options?.fetch ?? globalThis.fetch;
|
|
21
|
+
const endpoint = resolveEndpoint(options);
|
|
22
|
+
const orgId = await resolveOrgId(apiKey, options);
|
|
23
|
+
const params = new URLSearchParams();
|
|
24
|
+
params.set("page.limit", "200");
|
|
25
|
+
const url = `${endpoint}/ai-optimizer/v1beta/organizations/${encodeURIComponent(orgId)}/workspace-templates?${params}`;
|
|
26
|
+
const resp = await fetchWithTimeout(url, { method: "GET", headers: { Authorization: `Bearer ${apiKey}`, Accept: "application/json" } }, fetchImpl, 30_000, options?.signal);
|
|
27
|
+
await checkResponse(resp, url);
|
|
28
|
+
const data = await resp.json().catch(() => undefined);
|
|
29
|
+
if (typeof data !== "object" || data === null) {
|
|
30
|
+
throw new RemoteNetworkError(`Unexpected response from ${endpoint}`);
|
|
31
|
+
}
|
|
32
|
+
const items = data.items;
|
|
33
|
+
if (!Array.isArray(items)) {
|
|
34
|
+
throw new RemoteNetworkError(`Missing items array in workspace-templates response from ${endpoint}`);
|
|
35
|
+
}
|
|
36
|
+
return items.map((item) => mapWorkspaceTemplate(item, endpoint));
|
|
37
|
+
}
|
|
38
|
+
export async function getWorkspaceTemplate(apiKey, id, options) {
|
|
39
|
+
const fetchImpl = options?.fetch ?? globalThis.fetch;
|
|
40
|
+
const endpoint = resolveEndpoint(options);
|
|
41
|
+
const orgId = await resolveOrgId(apiKey, options);
|
|
42
|
+
const url = `${endpoint}/ai-optimizer/v1beta/organizations/${encodeURIComponent(orgId)}/workspace-templates/${encodeURIComponent(id)}`;
|
|
43
|
+
const resp = await fetchWithTimeout(url, { method: "GET", headers: { Authorization: `Bearer ${apiKey}` } }, fetchImpl, 30_000, options?.signal);
|
|
44
|
+
await checkResponse(resp, url);
|
|
45
|
+
const data = await resp.json().catch(() => undefined);
|
|
46
|
+
return mapWorkspaceTemplate(data, endpoint);
|
|
47
|
+
}
|
|
48
|
+
function mapWorkspaceTemplate(raw, endpoint) {
|
|
49
|
+
if (typeof raw !== "object" || raw === null) {
|
|
50
|
+
throw new RemoteNetworkError(`Invalid workspace-template entry in response from ${endpoint}`);
|
|
51
|
+
}
|
|
52
|
+
const r = raw;
|
|
53
|
+
const id = typeof r.id === "string" && r.id.length > 0 ? r.id : undefined;
|
|
54
|
+
if (!id) {
|
|
55
|
+
throw new RemoteNetworkError(`Missing workspace-template id in response from ${endpoint}`);
|
|
56
|
+
}
|
|
57
|
+
let createTime = new Date(0);
|
|
58
|
+
if (typeof r.createTime === "string") {
|
|
59
|
+
const parsed = new Date(r.createTime);
|
|
60
|
+
if (!Number.isNaN(parsed.getTime()))
|
|
61
|
+
createTime = parsed;
|
|
62
|
+
}
|
|
63
|
+
let updateTime = new Date(0);
|
|
64
|
+
if (typeof r.updateTime === "string") {
|
|
65
|
+
const parsed = new Date(r.updateTime);
|
|
66
|
+
if (!Number.isNaN(parsed.getTime()))
|
|
67
|
+
updateTime = parsed;
|
|
68
|
+
}
|
|
69
|
+
return {
|
|
70
|
+
id,
|
|
71
|
+
organizationId: typeof r.organizationId === "string" ? r.organizationId : "",
|
|
72
|
+
name: typeof r.name === "string" ? r.name : "",
|
|
73
|
+
description: typeof r.description === "string" ? r.description : "",
|
|
74
|
+
spec: mapTemplateSpec(r.spec),
|
|
75
|
+
createdBy: typeof r.createdBy === "string" ? r.createdBy : "",
|
|
76
|
+
updatedBy: typeof r.updatedBy === "string" ? r.updatedBy : "",
|
|
77
|
+
createTime,
|
|
78
|
+
updateTime,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
function mapTemplateSpec(raw) {
|
|
82
|
+
if (typeof raw !== "object" || raw === null)
|
|
83
|
+
return undefined;
|
|
84
|
+
const s = raw;
|
|
85
|
+
const spec = {};
|
|
86
|
+
if (typeof s.resources === "object" && s.resources !== null) {
|
|
87
|
+
const res = s.resources;
|
|
88
|
+
spec.resources = {
|
|
89
|
+
cpu: typeof res.cpu === "string" ? res.cpu : undefined,
|
|
90
|
+
memory: typeof res.memory === "string" ? res.memory : undefined,
|
|
91
|
+
pvcSize: typeof res.pvcSize === "string" ? res.pvcSize : undefined,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
if (Array.isArray(s.dependencies)) {
|
|
95
|
+
spec.dependencies = s.dependencies.filter((d) => typeof d === "string");
|
|
96
|
+
}
|
|
97
|
+
if (typeof s.egressPolicy === "object" && s.egressPolicy !== null) {
|
|
98
|
+
const eg = s.egressPolicy;
|
|
99
|
+
spec.egressPolicy = {
|
|
100
|
+
denyByDefault: typeof eg.denyByDefault === "boolean" ? eg.denyByDefault : undefined,
|
|
101
|
+
allowed: Array.isArray(eg.allowed) ? eg.allowed.filter((d) => typeof d === "string") : undefined,
|
|
102
|
+
denied: Array.isArray(eg.denied) ? eg.denied.filter((d) => typeof d === "string") : undefined,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
if (typeof s.initScript === "string") {
|
|
106
|
+
spec.initScript = s.initScript;
|
|
107
|
+
}
|
|
108
|
+
return Object.keys(spec).length > 0 ? spec : undefined;
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"../src/","sources":["api/templates.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guard.d.ts","sourceRoot":"../src/","sources":["commands/guard.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"guard.d.ts","sourceRoot":"../src/","sources":["commands/guard.ts"],"names":[],"mappings":"AAQA;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,KAAK,EACjC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,KAAK,KAAK,OAAO,CAAC,MAAM,CAAC,GACxD,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,KAAK,KAAK,OAAO,CAAC,MAAM,CAAC,CA0BnD"}
|
package/dist/commands/guard.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { AmbiguousWorkspaceError, WorkspaceNotFoundError } from "../api/resolver.js";
|
|
2
|
+
import { AmbiguousTemplateError, TemplateNotFoundError } from "../api/templates.js";
|
|
2
3
|
import { RemoteAuthError, RemoteNetworkError } from "../api/types.js";
|
|
3
4
|
import { ModelsFetchError } from "../auth/models-providers.js";
|
|
4
5
|
import { NotLoggedInError } from "../auth/resolve.js";
|
|
@@ -26,6 +27,8 @@ export function guardCommand(handler) {
|
|
|
26
27
|
err instanceof ModelsFetchError ||
|
|
27
28
|
err instanceof WorkspaceNotFoundError ||
|
|
28
29
|
err instanceof AmbiguousWorkspaceError ||
|
|
30
|
+
err instanceof TemplateNotFoundError ||
|
|
31
|
+
err instanceof AmbiguousTemplateError ||
|
|
29
32
|
err instanceof BridgeError ||
|
|
30
33
|
err instanceof RemoteAuthError ||
|
|
31
34
|
err instanceof RemoteNetworkError) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guard.js","sourceRoot":"../src/","sources":["commands/guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AACpF,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAEvC;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAC3B,OAA0D;IAE1D,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QAC3B,IAAI,CAAC;YACJ,OAAO,MAAM,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QACjC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,IAAI,GAAG,YAAY,UAAU,EAAE,CAAC;gBAC/B,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;gBAC1B,OAAO,CAAC,CAAA;YACT,CAAC;YACD,IACC,GAAG,YAAY,gBAAgB;gBAC/B,GAAG,YAAY,gBAAgB;gBAC/B,GAAG,YAAY,sBAAsB;gBACrC,GAAG,YAAY,uBAAuB;gBACtC,GAAG,YAAY,WAAW;gBAC1B,GAAG,YAAY,eAAe;gBAC9B,GAAG,YAAY,kBAAkB,EAChC,CAAC;gBACF,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;gBACjC,OAAO,CAAC,CAAA;YACT,CAAC;YACD,MAAM,GAAG,CAAA;QACV,CAAC;IACF,CAAC,CAAA;AACF,CAAC"}
|
|
1
|
+
{"version":3,"file":"guard.js","sourceRoot":"../src/","sources":["commands/guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AACpF,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AACnF,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAEvC;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAC3B,OAA0D;IAE1D,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QAC3B,IAAI,CAAC;YACJ,OAAO,MAAM,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QACjC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,IAAI,GAAG,YAAY,UAAU,EAAE,CAAC;gBAC/B,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;gBAC1B,OAAO,CAAC,CAAA;YACT,CAAC;YACD,IACC,GAAG,YAAY,gBAAgB;gBAC/B,GAAG,YAAY,gBAAgB;gBAC/B,GAAG,YAAY,sBAAsB;gBACrC,GAAG,YAAY,uBAAuB;gBACtC,GAAG,YAAY,qBAAqB;gBACpC,GAAG,YAAY,sBAAsB;gBACrC,GAAG,YAAY,WAAW;gBAC1B,GAAG,YAAY,eAAe;gBAC9B,GAAG,YAAY,kBAAkB,EAChC,CAAC;gBACF,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;gBACjC,OAAO,CAAC,CAAA;YACT,CAAC;YACD,MAAM,GAAG,CAAA;QACV,CAAC;IACF,CAAC,CAAA;AACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace.d.ts","sourceRoot":"../src/","sources":["commands/workspace.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"workspace.d.ts","sourceRoot":"../src/","sources":["commands/workspace.ts"],"names":[],"mappings":"AA0BA,MAAM,WAAW,aAAa;IAC7B,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAA;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;IACvB,oDAAoD;IACpD,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,qCAAqC;IACrC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IAChD,4DAA4D;IAC5D,GAAG,CAAC,EAAE,MAAM,IAAI,CAAA;IAChB,uDAAuD;IACvD,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACrC,qEAAqE;IACrE,KAAK,CAAC,EAAE,OAAO,CAAA;CACf;AA8BD,yFAAyF;AACzF,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CA2B5F;AA4fD;;;;;GAKG;AACH,eAAO,MAAM,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,aAAa,KAAK,OAAO,CAAC,MAAM,CAA8B,CAAA"}
|
|
@@ -2,6 +2,7 @@ import { readFileSync } from "node:fs";
|
|
|
2
2
|
import { resolve } from "node:path";
|
|
3
3
|
import { resolveWorkspace } from "../api/resolver.js";
|
|
4
4
|
import { formatAge, formatBytes, formatMillicores } from "../api/resources.js";
|
|
5
|
+
import { AmbiguousTemplateError, getWorkspaceTemplate, listWorkspaceTemplates, TemplateNotFoundError, } from "../api/templates.js";
|
|
5
6
|
import { waitForWorkspaceActive } from "../api/wait.js";
|
|
6
7
|
import { createWorkspace, deleteWorkspace, listWorkspaces, } from "../api/workspaces.js";
|
|
7
8
|
import { requireApiKey } from "../auth/resolve.js";
|
|
@@ -14,10 +15,11 @@ const GROUP_USAGE = `Usage:
|
|
|
14
15
|
kimchictl workspace <verb> [options]
|
|
15
16
|
|
|
16
17
|
Verbs:
|
|
17
|
-
create
|
|
18
|
-
list
|
|
19
|
-
get
|
|
20
|
-
delete
|
|
18
|
+
create Create a workspace (server generates the alias)
|
|
19
|
+
list List workspaces (alias: ls)
|
|
20
|
+
get Show workspace details
|
|
21
|
+
delete Delete a workspace (alias: rm)
|
|
22
|
+
templates Browse workspace templates (list | get)
|
|
21
23
|
|
|
22
24
|
Create options:
|
|
23
25
|
--desc <text> Description
|
|
@@ -50,6 +52,9 @@ export async function runWorkspace(args, deps = {}) {
|
|
|
50
52
|
case "delete":
|
|
51
53
|
case "rm":
|
|
52
54
|
return runDelete(rest, deps);
|
|
55
|
+
case "templates":
|
|
56
|
+
case "template":
|
|
57
|
+
return runTemplates(rest, deps);
|
|
53
58
|
case "help":
|
|
54
59
|
case "--help":
|
|
55
60
|
case "-h":
|
|
@@ -275,6 +280,170 @@ async function runDelete(args, deps) {
|
|
|
275
280
|
console.log(`✓ deleted ${workspace.alias}`);
|
|
276
281
|
return 0;
|
|
277
282
|
}
|
|
283
|
+
// ---------------------------------------------------------------- templates
|
|
284
|
+
async function runTemplates(args, deps) {
|
|
285
|
+
const [verb, ...rest] = args;
|
|
286
|
+
switch (verb) {
|
|
287
|
+
case "list":
|
|
288
|
+
case "ls":
|
|
289
|
+
return runTemplatesList(rest, deps);
|
|
290
|
+
case "get":
|
|
291
|
+
return runTemplatesGet(rest, deps);
|
|
292
|
+
case "help":
|
|
293
|
+
case "--help":
|
|
294
|
+
case "-h":
|
|
295
|
+
console.log(TEMPLATES_USAGE);
|
|
296
|
+
return 0;
|
|
297
|
+
case undefined:
|
|
298
|
+
console.error(TEMPLATES_USAGE);
|
|
299
|
+
return 2;
|
|
300
|
+
default:
|
|
301
|
+
console.error(`kimchictl workspace templates: unknown verb "${verb}"`);
|
|
302
|
+
console.error(TEMPLATES_USAGE);
|
|
303
|
+
return 2;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
const TEMPLATES_USAGE = `Usage:
|
|
307
|
+
kimchictl workspace templates <verb> [options]
|
|
308
|
+
|
|
309
|
+
Verbs:
|
|
310
|
+
list List workspace templates (alias: ls)
|
|
311
|
+
get Show template details
|
|
312
|
+
|
|
313
|
+
Options:
|
|
314
|
+
--help Show this help`;
|
|
315
|
+
async function runTemplatesList(args, deps) {
|
|
316
|
+
const { values, positionals } = parseFlags("workspace templates list", args, {
|
|
317
|
+
output: { type: "string", short: "o", default: "table" },
|
|
318
|
+
});
|
|
319
|
+
if (positionals.length > 0) {
|
|
320
|
+
throw new UsageError("kimchictl workspace templates list: unexpected positional argument");
|
|
321
|
+
}
|
|
322
|
+
if (values.output !== "json" && values.output !== "table") {
|
|
323
|
+
throw new UsageError(`kimchictl workspace templates list: unsupported --output "${String(values.output)}" (expected table|json)`);
|
|
324
|
+
}
|
|
325
|
+
const { key } = requireApiKey(deps.env);
|
|
326
|
+
const templates = await listWorkspaceTemplates(key, { fetch: deps.fetch });
|
|
327
|
+
if (values.output === "json") {
|
|
328
|
+
console.log(JSON.stringify(templates.map(serializeTemplate), null, 2));
|
|
329
|
+
return 0;
|
|
330
|
+
}
|
|
331
|
+
const now = deps.now?.() ?? new Date();
|
|
332
|
+
const rows = templates.map((t) => [
|
|
333
|
+
t.name || t.id.slice(0, 12),
|
|
334
|
+
t.description.length > 40 ? `${t.description.slice(0, 37)}…` : t.description || "-",
|
|
335
|
+
formatMillicores(t.spec?.resources?.cpu ? parseQuantity(t.spec.resources.cpu) : undefined),
|
|
336
|
+
formatBytes(t.spec?.resources?.memory ? parseByteQuantity(t.spec.resources.memory) : undefined),
|
|
337
|
+
formatBytes(t.spec?.resources?.pvcSize ? parseByteQuantity(t.spec.resources.pvcSize) : undefined),
|
|
338
|
+
formatAge(t.createTime, now),
|
|
339
|
+
]);
|
|
340
|
+
console.log(formatTable(["NAME", "DESCRIPTION", "CPU", "MEMORY", "STORAGE", "AGE"], rows));
|
|
341
|
+
return 0;
|
|
342
|
+
}
|
|
343
|
+
async function runTemplatesGet(args, deps) {
|
|
344
|
+
const { values, positionals } = parseFlags("workspace templates get", args, {
|
|
345
|
+
output: { type: "string", short: "o", default: "text" },
|
|
346
|
+
});
|
|
347
|
+
if (positionals.length !== 1) {
|
|
348
|
+
throw new UsageError("kimchictl workspace templates get: expected exactly one template name or ID");
|
|
349
|
+
}
|
|
350
|
+
if (values.output !== "json" && values.output !== "text") {
|
|
351
|
+
throw new UsageError(`kimchictl workspace templates get: unsupported --output "${String(values.output)}" (expected text|json)`);
|
|
352
|
+
}
|
|
353
|
+
const { key } = requireApiKey(deps.env);
|
|
354
|
+
const ref = positionals[0] ?? "";
|
|
355
|
+
// Templates are addressed by ID in the API; when the ref is a name,
|
|
356
|
+
// list-and-match (the API has no by-name lookup).
|
|
357
|
+
let template;
|
|
358
|
+
if (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(ref)) {
|
|
359
|
+
template = await getWorkspaceTemplate(key, ref, { fetch: deps.fetch });
|
|
360
|
+
}
|
|
361
|
+
else {
|
|
362
|
+
const all = await listWorkspaceTemplates(key, { fetch: deps.fetch });
|
|
363
|
+
const matches = all.filter((t) => t.name === ref || t.name.startsWith(ref));
|
|
364
|
+
if (matches.length === 0)
|
|
365
|
+
throw new TemplateNotFoundError(ref);
|
|
366
|
+
if (matches.length > 1)
|
|
367
|
+
throw new AmbiguousTemplateError(ref, matches.map((t) => t.name));
|
|
368
|
+
template = matches[0];
|
|
369
|
+
}
|
|
370
|
+
if (!template)
|
|
371
|
+
throw new TemplateNotFoundError(ref);
|
|
372
|
+
if (values.output === "json") {
|
|
373
|
+
console.log(JSON.stringify(serializeTemplate(template), null, 2));
|
|
374
|
+
return 0;
|
|
375
|
+
}
|
|
376
|
+
for (const line of renderTemplateCard(template, deps.color ?? false, deps.now?.() ?? new Date())) {
|
|
377
|
+
console.log(line);
|
|
378
|
+
}
|
|
379
|
+
return 0;
|
|
380
|
+
}
|
|
381
|
+
function renderTemplateCard(template, color, now) {
|
|
382
|
+
const lines = [`${template.name || template.id.slice(0, 12)} ${dim("template", color)}`];
|
|
383
|
+
if (template.description)
|
|
384
|
+
lines.push(dim(` ${template.description}`, color));
|
|
385
|
+
const parts = [];
|
|
386
|
+
const res = template.spec?.resources;
|
|
387
|
+
if (res) {
|
|
388
|
+
if (res.cpu)
|
|
389
|
+
parts.push(formatMillicores(parseQuantity(res.cpu)));
|
|
390
|
+
if (res.memory)
|
|
391
|
+
parts.push(formatBytes(parseByteQuantity(res.memory)));
|
|
392
|
+
}
|
|
393
|
+
if (parts.length > 0) {
|
|
394
|
+
lines.push(dim(` ${parts.join(" · ")}`, color));
|
|
395
|
+
}
|
|
396
|
+
const deps = template.spec?.dependencies;
|
|
397
|
+
if (deps && deps.length > 0) {
|
|
398
|
+
lines.push(` deps ${deps.join(", ")}`);
|
|
399
|
+
}
|
|
400
|
+
const eg = template.spec?.egressPolicy;
|
|
401
|
+
if (eg) {
|
|
402
|
+
const egParts = [];
|
|
403
|
+
if (eg.denyByDefault === false)
|
|
404
|
+
egParts.push("default-allow");
|
|
405
|
+
if (eg.allowed && eg.allowed.length > 0)
|
|
406
|
+
egParts.push(`allow: ${eg.allowed.join(", ")}`);
|
|
407
|
+
if (eg.denied && eg.denied.length > 0)
|
|
408
|
+
egParts.push(`deny: ${eg.denied.join(", ")}`);
|
|
409
|
+
if (egParts.length > 0)
|
|
410
|
+
lines.push(dim(` egress ${egParts.join(" · ")}`, color));
|
|
411
|
+
}
|
|
412
|
+
lines.push(dim(` updated ${formatAge(template.updateTime, now)} ago`, color));
|
|
413
|
+
return lines;
|
|
414
|
+
}
|
|
415
|
+
function serializeTemplate(t) {
|
|
416
|
+
return {
|
|
417
|
+
id: t.id,
|
|
418
|
+
name: t.name,
|
|
419
|
+
...(t.description ? { description: t.description } : {}),
|
|
420
|
+
spec: t.spec,
|
|
421
|
+
...(t.createdBy ? { createdBy: t.createdBy } : {}),
|
|
422
|
+
...(t.updateTime.getTime() > 0 ? { updateTime: t.updateTime.toISOString() } : {}),
|
|
423
|
+
};
|
|
424
|
+
}
|
|
425
|
+
/** Parse a k8s CPU quantity string ("500m", "2") to millicores. */
|
|
426
|
+
function parseQuantity(q) {
|
|
427
|
+
const value = Number.parseFloat(q.replace(/m$/, ""));
|
|
428
|
+
if (Number.isNaN(value))
|
|
429
|
+
return undefined;
|
|
430
|
+
return q.endsWith("m") ? value : value * 1000;
|
|
431
|
+
}
|
|
432
|
+
/** Parse a k8s memory/storage quantity string ("1Gi", "512Mi") to bytes. */
|
|
433
|
+
function parseByteQuantity(q) {
|
|
434
|
+
const units = { Ki: 1024, Mi: 1024 ** 2, Gi: 1024 ** 3, Ti: 1024 ** 4 };
|
|
435
|
+
for (const [suffix, mult] of Object.entries(units)) {
|
|
436
|
+
if (q.endsWith(suffix)) {
|
|
437
|
+
const value = Number.parseFloat(q.slice(0, -suffix.length));
|
|
438
|
+
if (!Number.isNaN(value))
|
|
439
|
+
return value * mult;
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
const value = Number.parseFloat(q);
|
|
443
|
+
if (!Number.isNaN(value))
|
|
444
|
+
return value;
|
|
445
|
+
return undefined;
|
|
446
|
+
}
|
|
278
447
|
// ---------------------------------------------------------------- shared
|
|
279
448
|
/** Tinted status dot: green=active, yellow=transitional/suspended, dim=terminated. */
|
|
280
449
|
function statusDot(status, color) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace.js","sourceRoot":"../src/","sources":["commands/workspace.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"workspace.js","sourceRoot":"../src/","sources":["commands/workspace.ts"],"names":[],"mappings":"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"}
|
package/dist/version.d.ts
CHANGED
package/dist/version.js
CHANGED
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"//name": "Scoped under the kimchi-dev npm org (the GitHub org is getkimchi)",
|
|
3
3
|
"name": "@kimchi-dev/kimchictl",
|
|
4
4
|
"//version": "Placeholder, never bumped: the git tag is the version, stamped by release.yml at publish time",
|
|
5
|
-
"version": "0.0.
|
|
5
|
+
"version": "0.0.8",
|
|
6
6
|
"description": "Create and connect to kimchi remote workspaces from the terminal.",
|
|
7
7
|
"keywords": [
|
|
8
8
|
"kimchi",
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { checkResponse, fetchWithTimeout, resolveEndpoint } from "./http.js"
|
|
2
|
+
import { verifyApiKey } from "./keys.js"
|
|
3
|
+
import type { ApiOptions } from "./types.js"
|
|
4
|
+
import { RemoteNetworkError } from "./types.js"
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Workspace-template client — read-only surface against the
|
|
8
|
+
* WorkspaceTemplatesAPI (proto: workspacetemplates_api.proto).
|
|
9
|
+
*
|
|
10
|
+
* Templates are named, organization-scoped presets of workspace creation
|
|
11
|
+
* parameters (resources, dependencies, egress policy, init script). They are
|
|
12
|
+
* curated by admins; `workspace create --template <name>` resolves them.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
export interface WorkspaceTemplateSpec {
|
|
16
|
+
resources?: {
|
|
17
|
+
cpu?: string
|
|
18
|
+
memory?: string
|
|
19
|
+
pvcSize?: string
|
|
20
|
+
}
|
|
21
|
+
dependencies?: string[]
|
|
22
|
+
egressPolicy?: {
|
|
23
|
+
denyByDefault?: boolean
|
|
24
|
+
allowed?: string[]
|
|
25
|
+
denied?: string[]
|
|
26
|
+
}
|
|
27
|
+
initScript?: string
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface WorkspaceTemplate {
|
|
31
|
+
id: string
|
|
32
|
+
organizationId: string
|
|
33
|
+
name: string
|
|
34
|
+
description: string
|
|
35
|
+
spec?: WorkspaceTemplateSpec
|
|
36
|
+
createdBy: string
|
|
37
|
+
updatedBy: string
|
|
38
|
+
createTime: Date
|
|
39
|
+
updateTime: Date
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export interface WorkspaceTemplateOptions extends ApiOptions {
|
|
43
|
+
orgId?: string
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
async function resolveOrgId(apiKey: string, options?: WorkspaceTemplateOptions): Promise<string> {
|
|
47
|
+
return options?.orgId ?? (await verifyApiKey(apiKey, options))
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export class TemplateNotFoundError extends Error {
|
|
51
|
+
constructor(ref: string) {
|
|
52
|
+
super(`No workspace template matches "${ref}" — list with: kimchictl workspace templates list`)
|
|
53
|
+
this.name = "TemplateNotFoundError"
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export class AmbiguousTemplateError extends Error {
|
|
58
|
+
constructor(ref: string, candidates: string[]) {
|
|
59
|
+
super(`Multiple workspace templates match "${ref}": ${candidates.join(", ")} — use the full name`)
|
|
60
|
+
this.name = "AmbiguousTemplateError"
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export async function listWorkspaceTemplates(
|
|
65
|
+
apiKey: string,
|
|
66
|
+
options?: WorkspaceTemplateOptions,
|
|
67
|
+
): Promise<WorkspaceTemplate[]> {
|
|
68
|
+
const fetchImpl = options?.fetch ?? globalThis.fetch
|
|
69
|
+
const endpoint = resolveEndpoint(options)
|
|
70
|
+
const orgId = await resolveOrgId(apiKey, options)
|
|
71
|
+
|
|
72
|
+
const params = new URLSearchParams()
|
|
73
|
+
params.set("page.limit", "200")
|
|
74
|
+
|
|
75
|
+
const url = `${endpoint}/ai-optimizer/v1beta/organizations/${encodeURIComponent(orgId)}/workspace-templates?${params}`
|
|
76
|
+
const resp = await fetchWithTimeout(
|
|
77
|
+
url,
|
|
78
|
+
{ method: "GET", headers: { Authorization: `Bearer ${apiKey}`, Accept: "application/json" } },
|
|
79
|
+
fetchImpl,
|
|
80
|
+
30_000,
|
|
81
|
+
options?.signal,
|
|
82
|
+
)
|
|
83
|
+
await checkResponse(resp, url)
|
|
84
|
+
|
|
85
|
+
const data: unknown = await resp.json().catch(() => undefined)
|
|
86
|
+
if (typeof data !== "object" || data === null) {
|
|
87
|
+
throw new RemoteNetworkError(`Unexpected response from ${endpoint}`)
|
|
88
|
+
}
|
|
89
|
+
const items = (data as { items?: unknown }).items
|
|
90
|
+
if (!Array.isArray(items)) {
|
|
91
|
+
throw new RemoteNetworkError(`Missing items array in workspace-templates response from ${endpoint}`)
|
|
92
|
+
}
|
|
93
|
+
return items.map((item) => mapWorkspaceTemplate(item, endpoint))
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export async function getWorkspaceTemplate(
|
|
97
|
+
apiKey: string,
|
|
98
|
+
id: string,
|
|
99
|
+
options?: WorkspaceTemplateOptions,
|
|
100
|
+
): Promise<WorkspaceTemplate> {
|
|
101
|
+
const fetchImpl = options?.fetch ?? globalThis.fetch
|
|
102
|
+
const endpoint = resolveEndpoint(options)
|
|
103
|
+
const orgId = await resolveOrgId(apiKey, options)
|
|
104
|
+
|
|
105
|
+
const url = `${endpoint}/ai-optimizer/v1beta/organizations/${encodeURIComponent(orgId)}/workspace-templates/${encodeURIComponent(id)}`
|
|
106
|
+
const resp = await fetchWithTimeout(
|
|
107
|
+
url,
|
|
108
|
+
{ method: "GET", headers: { Authorization: `Bearer ${apiKey}` } },
|
|
109
|
+
fetchImpl,
|
|
110
|
+
30_000,
|
|
111
|
+
options?.signal,
|
|
112
|
+
)
|
|
113
|
+
await checkResponse(resp, url)
|
|
114
|
+
|
|
115
|
+
const data: unknown = await resp.json().catch(() => undefined)
|
|
116
|
+
return mapWorkspaceTemplate(data, endpoint)
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function mapWorkspaceTemplate(raw: unknown, endpoint: string): WorkspaceTemplate {
|
|
120
|
+
if (typeof raw !== "object" || raw === null) {
|
|
121
|
+
throw new RemoteNetworkError(`Invalid workspace-template entry in response from ${endpoint}`)
|
|
122
|
+
}
|
|
123
|
+
const r = raw as Record<string, unknown>
|
|
124
|
+
|
|
125
|
+
const id = typeof r.id === "string" && r.id.length > 0 ? r.id : undefined
|
|
126
|
+
if (!id) {
|
|
127
|
+
throw new RemoteNetworkError(`Missing workspace-template id in response from ${endpoint}`)
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
let createTime: Date = new Date(0)
|
|
131
|
+
if (typeof r.createTime === "string") {
|
|
132
|
+
const parsed = new Date(r.createTime)
|
|
133
|
+
if (!Number.isNaN(parsed.getTime())) createTime = parsed
|
|
134
|
+
}
|
|
135
|
+
let updateTime: Date = new Date(0)
|
|
136
|
+
if (typeof r.updateTime === "string") {
|
|
137
|
+
const parsed = new Date(r.updateTime)
|
|
138
|
+
if (!Number.isNaN(parsed.getTime())) updateTime = parsed
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
return {
|
|
142
|
+
id,
|
|
143
|
+
organizationId: typeof r.organizationId === "string" ? r.organizationId : "",
|
|
144
|
+
name: typeof r.name === "string" ? r.name : "",
|
|
145
|
+
description: typeof r.description === "string" ? r.description : "",
|
|
146
|
+
spec: mapTemplateSpec(r.spec),
|
|
147
|
+
createdBy: typeof r.createdBy === "string" ? r.createdBy : "",
|
|
148
|
+
updatedBy: typeof r.updatedBy === "string" ? r.updatedBy : "",
|
|
149
|
+
createTime,
|
|
150
|
+
updateTime,
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function mapTemplateSpec(raw: unknown): WorkspaceTemplateSpec | undefined {
|
|
155
|
+
if (typeof raw !== "object" || raw === null) return undefined
|
|
156
|
+
const s = raw as Record<string, unknown>
|
|
157
|
+
|
|
158
|
+
const spec: WorkspaceTemplateSpec = {}
|
|
159
|
+
|
|
160
|
+
if (typeof s.resources === "object" && s.resources !== null) {
|
|
161
|
+
const res = s.resources as Record<string, unknown>
|
|
162
|
+
spec.resources = {
|
|
163
|
+
cpu: typeof res.cpu === "string" ? res.cpu : undefined,
|
|
164
|
+
memory: typeof res.memory === "string" ? res.memory : undefined,
|
|
165
|
+
pvcSize: typeof res.pvcSize === "string" ? res.pvcSize : undefined,
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
if (Array.isArray(s.dependencies)) {
|
|
170
|
+
spec.dependencies = s.dependencies.filter((d): d is string => typeof d === "string")
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
if (typeof s.egressPolicy === "object" && s.egressPolicy !== null) {
|
|
174
|
+
const eg = s.egressPolicy as Record<string, unknown>
|
|
175
|
+
spec.egressPolicy = {
|
|
176
|
+
denyByDefault: typeof eg.denyByDefault === "boolean" ? eg.denyByDefault : undefined,
|
|
177
|
+
allowed: Array.isArray(eg.allowed) ? eg.allowed.filter((d): d is string => typeof d === "string") : undefined,
|
|
178
|
+
denied: Array.isArray(eg.denied) ? eg.denied.filter((d): d is string => typeof d === "string") : undefined,
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
if (typeof s.initScript === "string") {
|
|
183
|
+
spec.initScript = s.initScript
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
return Object.keys(spec).length > 0 ? spec : undefined
|
|
187
|
+
}
|
package/src/commands/guard.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { AmbiguousWorkspaceError, WorkspaceNotFoundError } from "../api/resolver.js"
|
|
2
|
+
import { AmbiguousTemplateError, TemplateNotFoundError } from "../api/templates.js"
|
|
2
3
|
import { RemoteAuthError, RemoteNetworkError } from "../api/types.js"
|
|
3
4
|
import { ModelsFetchError } from "../auth/models-providers.js"
|
|
4
5
|
import { NotLoggedInError } from "../auth/resolve.js"
|
|
@@ -29,6 +30,8 @@ export function guardCommand<TDeps>(
|
|
|
29
30
|
err instanceof ModelsFetchError ||
|
|
30
31
|
err instanceof WorkspaceNotFoundError ||
|
|
31
32
|
err instanceof AmbiguousWorkspaceError ||
|
|
33
|
+
err instanceof TemplateNotFoundError ||
|
|
34
|
+
err instanceof AmbiguousTemplateError ||
|
|
32
35
|
err instanceof BridgeError ||
|
|
33
36
|
err instanceof RemoteAuthError ||
|
|
34
37
|
err instanceof RemoteNetworkError
|
|
@@ -429,6 +429,99 @@ describe("kimchictl workspace get", () => {
|
|
|
429
429
|
|
|
430
430
|
// ---------------------------------------------------------------- delete
|
|
431
431
|
|
|
432
|
+
describe("kimchictl workspace templates", () => {
|
|
433
|
+
const TEMPLATE_JSON = {
|
|
434
|
+
id: "aaaa1111-2222-3333-4444-555555555555",
|
|
435
|
+
organizationId: "org-1",
|
|
436
|
+
name: "rust",
|
|
437
|
+
description: "Rust workspace",
|
|
438
|
+
spec: {
|
|
439
|
+
resources: { cpu: "2", memory: "4Gi", pvcSize: "20Gi" },
|
|
440
|
+
dependencies: ["jq", "node@22"],
|
|
441
|
+
egressPolicy: { denyByDefault: true, allowed: ["*.github.com"] },
|
|
442
|
+
initScript: "echo hi",
|
|
443
|
+
},
|
|
444
|
+
createdBy: "user-1",
|
|
445
|
+
updatedBy: "user-1",
|
|
446
|
+
createTime: "2026-01-01T00:00:00Z",
|
|
447
|
+
updateTime: "2026-01-01T00:00:00Z",
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
function templateFetch(items: unknown[]): typeof globalThis.fetch {
|
|
451
|
+
return stubFetch(async (url, init) => {
|
|
452
|
+
if (init?.method === "POST" || (init?.method ?? "GET") === "POST") {
|
|
453
|
+
if (url.endsWith("workspace-tokens:verifyKey")) return jsonResponse({ organizationId: "org-1" })
|
|
454
|
+
}
|
|
455
|
+
if (url.endsWith("workspace-tokens:verifyKey")) return jsonResponse({ organizationId: "org-1" })
|
|
456
|
+
if (url.includes("workspace-templates?")) return jsonResponse({ items })
|
|
457
|
+
if (url.endsWith("/workspace-templates/aaaa1111-2222-3333-4444-555555555555")) {
|
|
458
|
+
return jsonResponse(items[0])
|
|
459
|
+
}
|
|
460
|
+
throw new Error(`unexpected: ${init?.method ?? "GET"} ${url}`)
|
|
461
|
+
}) as typeof globalThis.fetch
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
it("prints group usage on help / missing verb", async () => {
|
|
465
|
+
const { code, lines } = await run(["templates", "help"], templateFetch([]))
|
|
466
|
+
expect(code).toBe(0)
|
|
467
|
+
expect(lines[0]).toContain("kimchictl workspace templates <verb>")
|
|
468
|
+
})
|
|
469
|
+
|
|
470
|
+
it("renders the template table", async () => {
|
|
471
|
+
const { code, lines } = await run(["templates", "list"], templateFetch([TEMPLATE_JSON]), {
|
|
472
|
+
now: () => new Date("2026-01-01T03:00:00Z"),
|
|
473
|
+
})
|
|
474
|
+
expect(code).toBe(0)
|
|
475
|
+
const table = lines[0]?.split("\n") ?? []
|
|
476
|
+
expect(table[0]).toMatch(/^NAME\s+DESCRIPTION\s+CPU\s+MEMORY\s+STORAGE\s+AGE$/)
|
|
477
|
+
expect(table[1]).toMatch(/^rust\s+Rust workspace\s+2\s+4Gi\s+20Gi\s+3h$/)
|
|
478
|
+
})
|
|
479
|
+
|
|
480
|
+
it("renders json output", async () => {
|
|
481
|
+
const { code, lines } = await run(["templates", "list", "--output", "json"], templateFetch([TEMPLATE_JSON]))
|
|
482
|
+
expect(code).toBe(0)
|
|
483
|
+
const parsed = JSON.parse(lines.join(""))
|
|
484
|
+
expect(parsed[0]).toMatchObject({ name: "rust", description: "Rust workspace" })
|
|
485
|
+
})
|
|
486
|
+
|
|
487
|
+
it("renders the template detail card by name", async () => {
|
|
488
|
+
const { code, lines } = await run(["templates", "get", "rust"], templateFetch([TEMPLATE_JSON]), {
|
|
489
|
+
now: () => new Date("2026-01-01T03:00:00Z"),
|
|
490
|
+
})
|
|
491
|
+
expect(code).toBe(0)
|
|
492
|
+
const text = lines.join("\n")
|
|
493
|
+
expect(text).toContain("rust template")
|
|
494
|
+
expect(text).toContain("Rust workspace")
|
|
495
|
+
expect(text).toContain("deps jq, node@22")
|
|
496
|
+
expect(text).toContain("egress allow: *.github.com")
|
|
497
|
+
})
|
|
498
|
+
|
|
499
|
+
it("resolves by UUID without listing", async () => {
|
|
500
|
+
const fetch = templateFetch([TEMPLATE_JSON])
|
|
501
|
+
const calls: string[] = []
|
|
502
|
+
const trackedFetch = stubFetch(async (url, init) => {
|
|
503
|
+
calls.push(url)
|
|
504
|
+
return fetch(url, init)
|
|
505
|
+
}) as typeof globalThis.fetch
|
|
506
|
+
|
|
507
|
+
const { code } = await run(["templates", "get", "aaaa1111-2222-3333-4444-555555555555"], trackedFetch)
|
|
508
|
+
expect(code).toBe(0)
|
|
509
|
+
// No list call — the UUID went straight to GET
|
|
510
|
+
expect(calls.some((u) => u.includes("workspace-templates?"))).toBe(false)
|
|
511
|
+
})
|
|
512
|
+
|
|
513
|
+
it("errors on unknown template", async () => {
|
|
514
|
+
const { code, errors } = await run(["templates", "get", "nope"], templateFetch([]))
|
|
515
|
+
expect(code).toBe(1)
|
|
516
|
+
expect(errors[0]).toContain('No workspace template matches "nope"')
|
|
517
|
+
})
|
|
518
|
+
|
|
519
|
+
it("rejects unknown verbs and bad output", async () => {
|
|
520
|
+
expect((await run(["templates", "frobnicate"], templateFetch([]))).code).toBe(2)
|
|
521
|
+
expect((await run(["templates", "list", "--output", "yaml"], templateFetch([]))).code).toBe(2)
|
|
522
|
+
})
|
|
523
|
+
})
|
|
524
|
+
|
|
432
525
|
describe("kimchictl workspace delete", () => {
|
|
433
526
|
it("deletes after an affirmative confirmation", async () => {
|
|
434
527
|
const fetch = apiFetch([
|
|
@@ -2,6 +2,13 @@ import { readFileSync } from "node:fs"
|
|
|
2
2
|
import { resolve } from "node:path"
|
|
3
3
|
import { resolveWorkspace } from "../api/resolver.js"
|
|
4
4
|
import { formatAge, formatBytes, formatMillicores } from "../api/resources.js"
|
|
5
|
+
import {
|
|
6
|
+
AmbiguousTemplateError,
|
|
7
|
+
getWorkspaceTemplate,
|
|
8
|
+
listWorkspaceTemplates,
|
|
9
|
+
TemplateNotFoundError,
|
|
10
|
+
type WorkspaceTemplate,
|
|
11
|
+
} from "../api/templates.js"
|
|
5
12
|
import { waitForWorkspaceActive } from "../api/wait.js"
|
|
6
13
|
import {
|
|
7
14
|
type CreateWorkspaceSpec,
|
|
@@ -36,10 +43,11 @@ const GROUP_USAGE = `Usage:
|
|
|
36
43
|
kimchictl workspace <verb> [options]
|
|
37
44
|
|
|
38
45
|
Verbs:
|
|
39
|
-
create
|
|
40
|
-
list
|
|
41
|
-
get
|
|
42
|
-
delete
|
|
46
|
+
create Create a workspace (server generates the alias)
|
|
47
|
+
list List workspaces (alias: ls)
|
|
48
|
+
get Show workspace details
|
|
49
|
+
delete Delete a workspace (alias: rm)
|
|
50
|
+
templates Browse workspace templates (list | get)
|
|
43
51
|
|
|
44
52
|
Create options:
|
|
45
53
|
--desc <text> Description
|
|
@@ -73,6 +81,9 @@ export async function runWorkspace(args: string[], deps: WorkspaceDeps = {}): Pr
|
|
|
73
81
|
case "delete":
|
|
74
82
|
case "rm":
|
|
75
83
|
return runDelete(rest, deps)
|
|
84
|
+
case "templates":
|
|
85
|
+
case "template":
|
|
86
|
+
return runTemplates(rest, deps)
|
|
76
87
|
case "help":
|
|
77
88
|
case "--help":
|
|
78
89
|
case "-h":
|
|
@@ -338,6 +349,184 @@ async function runDelete(args: string[], deps: WorkspaceDeps): Promise<number> {
|
|
|
338
349
|
return 0
|
|
339
350
|
}
|
|
340
351
|
|
|
352
|
+
// ---------------------------------------------------------------- templates
|
|
353
|
+
|
|
354
|
+
async function runTemplates(args: string[], deps: WorkspaceDeps): Promise<number> {
|
|
355
|
+
const [verb, ...rest] = args
|
|
356
|
+
switch (verb) {
|
|
357
|
+
case "list":
|
|
358
|
+
case "ls":
|
|
359
|
+
return runTemplatesList(rest, deps)
|
|
360
|
+
case "get":
|
|
361
|
+
return runTemplatesGet(rest, deps)
|
|
362
|
+
case "help":
|
|
363
|
+
case "--help":
|
|
364
|
+
case "-h":
|
|
365
|
+
console.log(TEMPLATES_USAGE)
|
|
366
|
+
return 0
|
|
367
|
+
case undefined:
|
|
368
|
+
console.error(TEMPLATES_USAGE)
|
|
369
|
+
return 2
|
|
370
|
+
default:
|
|
371
|
+
console.error(`kimchictl workspace templates: unknown verb "${verb}"`)
|
|
372
|
+
console.error(TEMPLATES_USAGE)
|
|
373
|
+
return 2
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
const TEMPLATES_USAGE = `Usage:
|
|
378
|
+
kimchictl workspace templates <verb> [options]
|
|
379
|
+
|
|
380
|
+
Verbs:
|
|
381
|
+
list List workspace templates (alias: ls)
|
|
382
|
+
get Show template details
|
|
383
|
+
|
|
384
|
+
Options:
|
|
385
|
+
--help Show this help`
|
|
386
|
+
|
|
387
|
+
async function runTemplatesList(args: string[], deps: WorkspaceDeps): Promise<number> {
|
|
388
|
+
const { values, positionals } = parseFlags("workspace templates list", args, {
|
|
389
|
+
output: { type: "string", short: "o", default: "table" },
|
|
390
|
+
})
|
|
391
|
+
if (positionals.length > 0) {
|
|
392
|
+
throw new UsageError("kimchictl workspace templates list: unexpected positional argument")
|
|
393
|
+
}
|
|
394
|
+
if (values.output !== "json" && values.output !== "table") {
|
|
395
|
+
throw new UsageError(
|
|
396
|
+
`kimchictl workspace templates list: unsupported --output "${String(values.output)}" (expected table|json)`,
|
|
397
|
+
)
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
const { key } = requireApiKey(deps.env)
|
|
401
|
+
const templates = await listWorkspaceTemplates(key, { fetch: deps.fetch })
|
|
402
|
+
|
|
403
|
+
if (values.output === "json") {
|
|
404
|
+
console.log(JSON.stringify(templates.map(serializeTemplate), null, 2))
|
|
405
|
+
return 0
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
const now = deps.now?.() ?? new Date()
|
|
409
|
+
const rows = templates.map((t) => [
|
|
410
|
+
t.name || t.id.slice(0, 12),
|
|
411
|
+
t.description.length > 40 ? `${t.description.slice(0, 37)}…` : t.description || "-",
|
|
412
|
+
formatMillicores(t.spec?.resources?.cpu ? parseQuantity(t.spec.resources.cpu) : undefined),
|
|
413
|
+
formatBytes(t.spec?.resources?.memory ? parseByteQuantity(t.spec.resources.memory) : undefined),
|
|
414
|
+
formatBytes(t.spec?.resources?.pvcSize ? parseByteQuantity(t.spec.resources.pvcSize) : undefined),
|
|
415
|
+
formatAge(t.createTime, now),
|
|
416
|
+
])
|
|
417
|
+
console.log(formatTable(["NAME", "DESCRIPTION", "CPU", "MEMORY", "STORAGE", "AGE"], rows))
|
|
418
|
+
return 0
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
async function runTemplatesGet(args: string[], deps: WorkspaceDeps): Promise<number> {
|
|
422
|
+
const { values, positionals } = parseFlags("workspace templates get", args, {
|
|
423
|
+
output: { type: "string", short: "o", default: "text" },
|
|
424
|
+
})
|
|
425
|
+
if (positionals.length !== 1) {
|
|
426
|
+
throw new UsageError("kimchictl workspace templates get: expected exactly one template name or ID")
|
|
427
|
+
}
|
|
428
|
+
if (values.output !== "json" && values.output !== "text") {
|
|
429
|
+
throw new UsageError(
|
|
430
|
+
`kimchictl workspace templates get: unsupported --output "${String(values.output)}" (expected text|json)`,
|
|
431
|
+
)
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
const { key } = requireApiKey(deps.env)
|
|
435
|
+
const ref = positionals[0] ?? ""
|
|
436
|
+
|
|
437
|
+
// Templates are addressed by ID in the API; when the ref is a name,
|
|
438
|
+
// list-and-match (the API has no by-name lookup).
|
|
439
|
+
let template: WorkspaceTemplate | undefined
|
|
440
|
+
if (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(ref)) {
|
|
441
|
+
template = await getWorkspaceTemplate(key, ref, { fetch: deps.fetch })
|
|
442
|
+
} else {
|
|
443
|
+
const all = await listWorkspaceTemplates(key, { fetch: deps.fetch })
|
|
444
|
+
const matches = all.filter((t) => t.name === ref || t.name.startsWith(ref))
|
|
445
|
+
if (matches.length === 0) throw new TemplateNotFoundError(ref)
|
|
446
|
+
if (matches.length > 1)
|
|
447
|
+
throw new AmbiguousTemplateError(
|
|
448
|
+
ref,
|
|
449
|
+
matches.map((t) => t.name),
|
|
450
|
+
)
|
|
451
|
+
template = matches[0]
|
|
452
|
+
}
|
|
453
|
+
if (!template) throw new TemplateNotFoundError(ref)
|
|
454
|
+
|
|
455
|
+
if (values.output === "json") {
|
|
456
|
+
console.log(JSON.stringify(serializeTemplate(template), null, 2))
|
|
457
|
+
return 0
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
for (const line of renderTemplateCard(template, deps.color ?? false, deps.now?.() ?? new Date())) {
|
|
461
|
+
console.log(line)
|
|
462
|
+
}
|
|
463
|
+
return 0
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
function renderTemplateCard(template: WorkspaceTemplate, color: boolean, now: Date): string[] {
|
|
467
|
+
const lines: string[] = [`${template.name || template.id.slice(0, 12)} ${dim("template", color)}`]
|
|
468
|
+
if (template.description) lines.push(dim(` ${template.description}`, color))
|
|
469
|
+
|
|
470
|
+
const parts: string[] = []
|
|
471
|
+
const res = template.spec?.resources
|
|
472
|
+
if (res) {
|
|
473
|
+
if (res.cpu) parts.push(formatMillicores(parseQuantity(res.cpu)))
|
|
474
|
+
if (res.memory) parts.push(formatBytes(parseByteQuantity(res.memory)))
|
|
475
|
+
}
|
|
476
|
+
if (parts.length > 0) {
|
|
477
|
+
lines.push(dim(` ${parts.join(" · ")}`, color))
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
const deps = template.spec?.dependencies
|
|
481
|
+
if (deps && deps.length > 0) {
|
|
482
|
+
lines.push(` deps ${deps.join(", ")}`)
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
const eg = template.spec?.egressPolicy
|
|
486
|
+
if (eg) {
|
|
487
|
+
const egParts: string[] = []
|
|
488
|
+
if (eg.denyByDefault === false) egParts.push("default-allow")
|
|
489
|
+
if (eg.allowed && eg.allowed.length > 0) egParts.push(`allow: ${eg.allowed.join(", ")}`)
|
|
490
|
+
if (eg.denied && eg.denied.length > 0) egParts.push(`deny: ${eg.denied.join(", ")}`)
|
|
491
|
+
if (egParts.length > 0) lines.push(dim(` egress ${egParts.join(" · ")}`, color))
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
lines.push(dim(` updated ${formatAge(template.updateTime, now)} ago`, color))
|
|
495
|
+
return lines
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
function serializeTemplate(t: WorkspaceTemplate): Record<string, unknown> {
|
|
499
|
+
return {
|
|
500
|
+
id: t.id,
|
|
501
|
+
name: t.name,
|
|
502
|
+
...(t.description ? { description: t.description } : {}),
|
|
503
|
+
spec: t.spec,
|
|
504
|
+
...(t.createdBy ? { createdBy: t.createdBy } : {}),
|
|
505
|
+
...(t.updateTime.getTime() > 0 ? { updateTime: t.updateTime.toISOString() } : {}),
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
/** Parse a k8s CPU quantity string ("500m", "2") to millicores. */
|
|
510
|
+
function parseQuantity(q: string): number | undefined {
|
|
511
|
+
const value = Number.parseFloat(q.replace(/m$/, ""))
|
|
512
|
+
if (Number.isNaN(value)) return undefined
|
|
513
|
+
return q.endsWith("m") ? value : value * 1000
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
/** Parse a k8s memory/storage quantity string ("1Gi", "512Mi") to bytes. */
|
|
517
|
+
function parseByteQuantity(q: string): number | undefined {
|
|
518
|
+
const units: Record<string, number> = { Ki: 1024, Mi: 1024 ** 2, Gi: 1024 ** 3, Ti: 1024 ** 4 }
|
|
519
|
+
for (const [suffix, mult] of Object.entries(units)) {
|
|
520
|
+
if (q.endsWith(suffix)) {
|
|
521
|
+
const value = Number.parseFloat(q.slice(0, -suffix.length))
|
|
522
|
+
if (!Number.isNaN(value)) return value * mult
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
const value = Number.parseFloat(q)
|
|
526
|
+
if (!Number.isNaN(value)) return value
|
|
527
|
+
return undefined
|
|
528
|
+
}
|
|
529
|
+
|
|
341
530
|
// ---------------------------------------------------------------- shared
|
|
342
531
|
|
|
343
532
|
/** Tinted status dot: green=active, yellow=transitional/suspended, dim=terminated. */
|
package/src/version.ts
CHANGED