@codata-io/cli 0.3.2 → 0.4.2

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 (59) hide show
  1. package/dist/src/cli.js +360 -5
  2. package/dist/src/cli.js.map +1 -1
  3. package/dist/src/commands/api.d.ts +5 -1
  4. package/dist/src/commands/api.d.ts.map +1 -1
  5. package/dist/src/commands/api.js +153 -29
  6. package/dist/src/commands/api.js.map +1 -1
  7. package/dist/src/commands/chat.d.ts +9 -0
  8. package/dist/src/commands/chat.d.ts.map +1 -0
  9. package/dist/src/commands/chat.js +123 -0
  10. package/dist/src/commands/chat.js.map +1 -0
  11. package/dist/src/commands/completion.d.ts +2 -0
  12. package/dist/src/commands/completion.d.ts.map +1 -0
  13. package/dist/src/commands/completion.js +107 -0
  14. package/dist/src/commands/completion.js.map +1 -0
  15. package/dist/src/commands/conversations.d.ts +13 -0
  16. package/dist/src/commands/conversations.d.ts.map +1 -0
  17. package/dist/src/commands/conversations.js +90 -0
  18. package/dist/src/commands/conversations.js.map +1 -0
  19. package/dist/src/commands/costs.d.ts +7 -0
  20. package/dist/src/commands/costs.d.ts.map +1 -0
  21. package/dist/src/commands/costs.js +43 -0
  22. package/dist/src/commands/costs.js.map +1 -0
  23. package/dist/src/commands/doctor.d.ts +2 -0
  24. package/dist/src/commands/doctor.d.ts.map +1 -0
  25. package/dist/src/commands/doctor.js +142 -0
  26. package/dist/src/commands/doctor.js.map +1 -0
  27. package/dist/src/commands/endpoints.d.ts +10 -0
  28. package/dist/src/commands/endpoints.d.ts.map +1 -0
  29. package/dist/src/commands/endpoints.js +129 -0
  30. package/dist/src/commands/endpoints.js.map +1 -0
  31. package/dist/src/commands/files.d.ts +11 -0
  32. package/dist/src/commands/files.d.ts.map +1 -0
  33. package/dist/src/commands/files.js +84 -0
  34. package/dist/src/commands/files.js.map +1 -0
  35. package/dist/src/commands/integrationKit.d.ts +6 -0
  36. package/dist/src/commands/integrationKit.d.ts.map +1 -0
  37. package/dist/src/commands/integrationKit.js +71 -0
  38. package/dist/src/commands/integrationKit.js.map +1 -0
  39. package/dist/src/commands/lifecycle.d.ts +24 -0
  40. package/dist/src/commands/lifecycle.d.ts.map +1 -0
  41. package/dist/src/commands/lifecycle.js +84 -0
  42. package/dist/src/commands/lifecycle.js.map +1 -0
  43. package/dist/src/commands/tokens.d.ts +17 -0
  44. package/dist/src/commands/tokens.d.ts.map +1 -0
  45. package/dist/src/commands/tokens.js +112 -0
  46. package/dist/src/commands/tokens.js.map +1 -0
  47. package/dist/src/commands/versions.d.ts +8 -0
  48. package/dist/src/commands/versions.d.ts.map +1 -0
  49. package/dist/src/commands/versions.js +61 -0
  50. package/dist/src/commands/versions.js.map +1 -0
  51. package/dist/src/commands/workspaces.d.ts +8 -0
  52. package/dist/src/commands/workspaces.d.ts.map +1 -1
  53. package/dist/src/commands/workspaces.js +44 -1
  54. package/dist/src/commands/workspaces.js.map +1 -1
  55. package/dist/src/config.d.ts +11 -1
  56. package/dist/src/config.d.ts.map +1 -1
  57. package/dist/src/config.js +72 -3
  58. package/dist/src/config.js.map +1 -1
  59. package/package.json +2 -2
@@ -0,0 +1,7 @@
1
+ export declare function costsShowCommand(workspace: string, options: {
2
+ json?: boolean;
3
+ }): Promise<void>;
4
+ export declare function costsAggregateCommand(options: {
5
+ json?: boolean;
6
+ }): Promise<void>;
7
+ //# sourceMappingURL=costs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"costs.d.ts","sourceRoot":"","sources":["../../../src/commands/costs.ts"],"names":[],"mappings":"AAWA,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAC1B,OAAO,CAAC,IAAI,CAAC,CAkBf;AAED,wBAAsB,qBAAqB,CACzC,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAC1B,OAAO,CAAC,IAAI,CAAC,CAiBf"}
@@ -0,0 +1,43 @@
1
+ // ────────────────────────────────────────────────────────────────────────────
2
+ // Codata CLI — Workspace Costs (jwtAuth)
3
+ // ────────────────────────────────────────────────────────────────────────────
4
+ //
5
+ // codata costs <ws> # GET /:id/costs
6
+ // codata costs aggregate # GET /costs/aggregate (all workspaces)
7
+ //
8
+ import { createCliClient } from '../config.js';
9
+ import { heading, info, error as printError, printJson } from '../output.js';
10
+ export async function costsShowCommand(workspace, options) {
11
+ try {
12
+ const client = createCliClient();
13
+ const ws = await client.findWorkspace(workspace);
14
+ const data = await client.request('GET', `/api/workspaces/${ws.id}/costs`);
15
+ if (options.json) {
16
+ printJson(data);
17
+ return;
18
+ }
19
+ heading(`Costs for ${ws.name ?? ws.id}`);
20
+ info(JSON.stringify(data, null, 2));
21
+ }
22
+ catch (err) {
23
+ printError(err.message ?? String(err));
24
+ process.exit(1);
25
+ }
26
+ }
27
+ export async function costsAggregateCommand(options) {
28
+ try {
29
+ const client = createCliClient();
30
+ const data = await client.request('GET', `/api/workspaces/costs/aggregate`);
31
+ if (options.json) {
32
+ printJson(data);
33
+ return;
34
+ }
35
+ heading('Aggregate costs (all workspaces)');
36
+ info(JSON.stringify(data, null, 2));
37
+ }
38
+ catch (err) {
39
+ printError(err.message ?? String(err));
40
+ process.exit(1);
41
+ }
42
+ }
43
+ //# sourceMappingURL=costs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"costs.js","sourceRoot":"","sources":["../../../src/commands/costs.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,yCAAyC;AACzC,+EAA+E;AAC/E,EAAE;AACF,yDAAyD;AACzD,gFAAgF;AAChF,EAAE;AAEF,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,IAAI,UAAU,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE7E,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,SAAiB,EACjB,OAA2B;IAE3B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;QACjC,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QACjD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CAC/B,KAAK,EACL,mBAAmB,EAAE,CAAC,EAAE,QAAQ,CACjC,CAAC;QACF,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,SAAS,CAAC,IAAI,CAAC,CAAC;YAChB,OAAO;QACT,CAAC;QACD,OAAO,CAAC,aAAa,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,UAAU,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,OAA2B;IAE3B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CAC/B,KAAK,EACL,iCAAiC,CAClC,CAAC;QACF,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,SAAS,CAAC,IAAI,CAAC,CAAC;YAChB,OAAO;QACT,CAAC;QACD,OAAO,CAAC,kCAAkC,CAAC,CAAC;QAC5C,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,UAAU,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function doctorCommand(): Promise<void>;
2
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/commands/doctor.ts"],"names":[],"mappings":"AAmBA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAmGnD"}
@@ -0,0 +1,142 @@
1
+ // ────────────────────────────────────────────────────────────────────────────
2
+ // Codata CLI — Doctor (Diagnose Common Issues)
3
+ // ────────────────────────────────────────────────────────────────────────────
4
+ //
5
+ // Verifies the local CLI install can talk to the control plane and Gater,
6
+ // and reports auth state. Useful for triaging "fetch failed" / "401" reports.
7
+ //
8
+ // Usage: codata doctor
9
+ //
10
+ import { getConfig, getStoredKeys, isAuthenticated, createCliClient } from '../config.js';
11
+ import { heading, success, error as printError, info, warn, printTable } from '../output.js';
12
+ export async function doctorCommand() {
13
+ heading('Codata CLI Doctor');
14
+ const cfg = getConfig();
15
+ const checks = [];
16
+ // 1. Config
17
+ checks.push({
18
+ name: 'Config file',
19
+ status: 'ok',
20
+ detail: `serverUrl=${cfg.serverUrl}${cfg.gateUrl ? `, gateUrl=${cfg.gateUrl}` : ' (gateUrl derived)'}`,
21
+ });
22
+ // 2. Auth state
23
+ const tokens = isAuthenticated();
24
+ const stored = Object.keys(getStoredKeys());
25
+ if (tokens) {
26
+ checks.push({ name: 'CLI login', status: 'ok', detail: 'authenticated' });
27
+ }
28
+ else if (stored.length > 0) {
29
+ checks.push({
30
+ name: 'CLI login',
31
+ status: 'warn',
32
+ detail: `not logged in, but ${stored.length} workspace key(s) stored locally`,
33
+ });
34
+ }
35
+ else {
36
+ checks.push({
37
+ name: 'CLI login',
38
+ status: 'warn',
39
+ detail: "not logged in (run `codata login`) and no stored workspace keys",
40
+ });
41
+ }
42
+ // 3. Control plane reachability
43
+ const controlPlane = await pingUrl(cfg.serverUrl + '/api/health', 5000);
44
+ checks.push({
45
+ name: 'Control plane',
46
+ status: controlPlane.ok ? 'ok' : 'fail',
47
+ detail: controlPlane.ok
48
+ ? `${cfg.serverUrl} → ${controlPlane.status} (${controlPlane.ms}ms)`
49
+ : `${cfg.serverUrl} → ${controlPlane.error}`,
50
+ });
51
+ // 4. Derived / configured Gater reachability
52
+ const gateUrl = cfg.gateUrl ?? deriveGateUrl(cfg.serverUrl);
53
+ if (gateUrl) {
54
+ const gate = await pingUrl(gateUrl + '/health', 5000);
55
+ checks.push({
56
+ name: 'Gater',
57
+ status: gate.ok || gate.status === 404 ? 'ok' : 'fail',
58
+ detail: gate.ok || gate.status === 404
59
+ ? `${gateUrl} → ${gate.status} (${gate.ms}ms)`
60
+ : `${gateUrl} → ${gate.error ?? gate.status}`,
61
+ });
62
+ }
63
+ else {
64
+ checks.push({
65
+ name: 'Gater',
66
+ status: 'warn',
67
+ detail: 'cannot derive Gater URL from serverUrl; set gateUrl in ~/.codata/config.json',
68
+ });
69
+ }
70
+ // 5. Workspaces accessible (only if authenticated or has any stored key)
71
+ if (tokens || stored.length > 0) {
72
+ try {
73
+ const client = createCliClient();
74
+ const wss = await client.listWorkspaces();
75
+ checks.push({
76
+ name: 'Workspaces accessible',
77
+ status: 'ok',
78
+ detail: `${wss.length} workspace(s) visible to current auth`,
79
+ });
80
+ }
81
+ catch (err) {
82
+ checks.push({
83
+ name: 'Workspaces accessible',
84
+ status: 'fail',
85
+ detail: err.message ?? String(err),
86
+ });
87
+ }
88
+ }
89
+ // Render
90
+ console.log('');
91
+ printTable(['CHECK', 'STATUS', 'DETAIL'], checks.map((c) => [c.name, badge(c.status), c.detail]));
92
+ const failed = checks.filter((c) => c.status === 'fail');
93
+ const warned = checks.filter((c) => c.status === 'warn');
94
+ console.log('');
95
+ if (failed.length === 0 && warned.length === 0) {
96
+ success('All checks passed.');
97
+ }
98
+ else if (failed.length === 0) {
99
+ warn(`${warned.length} warning(s).`);
100
+ }
101
+ else {
102
+ printError(`${failed.length} check(s) failed.`);
103
+ process.exit(1);
104
+ }
105
+ info('');
106
+ }
107
+ function badge(s) {
108
+ if (s === 'ok')
109
+ return '✓ ok';
110
+ if (s === 'warn')
111
+ return '⚠ warn';
112
+ return '✗ fail';
113
+ }
114
+ function deriveGateUrl(baseUrl) {
115
+ try {
116
+ const u = new URL(baseUrl);
117
+ if (u.hostname.startsWith('www.')) {
118
+ u.hostname = 'api.' + u.hostname.slice(4);
119
+ return `${u.protocol}//${u.host}`;
120
+ }
121
+ }
122
+ catch {
123
+ /* ignore */
124
+ }
125
+ return null;
126
+ }
127
+ async function pingUrl(url, timeoutMs) {
128
+ const start = Date.now();
129
+ const controller = new AbortController();
130
+ const t = setTimeout(() => controller.abort(), timeoutMs);
131
+ try {
132
+ const res = await fetch(url, { method: 'GET', signal: controller.signal });
133
+ return { ok: res.ok, status: res.status, ms: Date.now() - start };
134
+ }
135
+ catch (err) {
136
+ return { ok: false, error: err?.message ?? String(err) };
137
+ }
138
+ finally {
139
+ clearTimeout(t);
140
+ }
141
+ }
142
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export declare function endpointsListCommand(workspace: string, options: {
2
+ json?: boolean;
3
+ key?: string;
4
+ }): Promise<void>;
5
+ export declare function endpointsShowCommand(workspace: string, selector: string, options: {
6
+ method?: string;
7
+ json?: boolean;
8
+ key?: string;
9
+ }): Promise<void>;
10
+ //# sourceMappingURL=endpoints.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"endpoints.d.ts","sourceRoot":"","sources":["../../../src/commands/endpoints.ts"],"names":[],"mappings":"AAuBA,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GACxC,OAAO,CAAC,IAAI,CAAC,CAoCf;AAED,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GACzD,OAAO,CAAC,IAAI,CAAC,CAuDf"}
@@ -0,0 +1,129 @@
1
+ // ────────────────────────────────────────────────────────────────────────────
2
+ // Codata CLI — Endpoints (Detailed Spec Inspection)
3
+ // ────────────────────────────────────────────────────────────────────────────
4
+ //
5
+ // `endpoints list <workspace>` → table of all endpoints
6
+ // `endpoints show <workspace> <op-or-path>` → full detail for one endpoint
7
+ //
8
+ // Sources the workspace spec (same data the `api` listing uses), so works
9
+ // against any backend that exposes the workspace spec via combinedAuth.
10
+ //
11
+ import { createCliClient } from '../config.js';
12
+ import { heading, printTable, printJson, info, warn, error as printError, methodColor, } from '../output.js';
13
+ export async function endpointsListCommand(workspace, options) {
14
+ try {
15
+ const client = createCliClient({ apiKey: options.key });
16
+ const ws = await client.findWorkspace(workspace);
17
+ const authedClient = options.key ? client : createCliClient({ workspaceId: ws.id });
18
+ const wsClient = authedClient.workspace(ws.id);
19
+ const spec = await wsClient.getSpec();
20
+ const endpoints = spec?.endpoints ?? [];
21
+ if (options.json) {
22
+ printJson(endpoints);
23
+ return;
24
+ }
25
+ heading(`Endpoints for ${ws.name ?? ws.id} (${endpoints.length})`);
26
+ if (endpoints.length === 0) {
27
+ warn('No endpoints. Has this workspace been generated yet?');
28
+ return;
29
+ }
30
+ printTable(['METHOD', 'PATH', 'OPERATION ID', 'SUMMARY'], endpoints
31
+ .slice()
32
+ .sort((a, b) => (a.path ?? '').localeCompare(b.path ?? ''))
33
+ .map((e) => [
34
+ methodColor((e.method ?? '').toUpperCase()),
35
+ e.path ?? '',
36
+ e.operationId ?? '',
37
+ e.summary ?? e.description ?? '',
38
+ ]));
39
+ }
40
+ catch (err) {
41
+ printError(err.message ?? String(err));
42
+ process.exit(1);
43
+ }
44
+ }
45
+ export async function endpointsShowCommand(workspace, selector, options) {
46
+ try {
47
+ const client = createCliClient({ apiKey: options.key });
48
+ const ws = await client.findWorkspace(workspace);
49
+ const authedClient = options.key ? client : createCliClient({ workspaceId: ws.id });
50
+ const wsClient = authedClient.workspace(ws.id);
51
+ const spec = await wsClient.getSpec();
52
+ const endpoints = spec?.endpoints ?? [];
53
+ const match = findEndpoint(endpoints, selector, options.method);
54
+ if (!match) {
55
+ printError(`No endpoint matched "${selector}"`);
56
+ info('List endpoints with: codata endpoints list ' + workspace);
57
+ process.exit(1);
58
+ }
59
+ if (options.json) {
60
+ printJson(match);
61
+ return;
62
+ }
63
+ heading(`${(match.method ?? '').toUpperCase()} ${match.path}`);
64
+ const rows = [];
65
+ if (match.operationId)
66
+ rows.push(['Operation ID', match.operationId]);
67
+ if (match.summary)
68
+ rows.push(['Summary', match.summary]);
69
+ if (match.description)
70
+ rows.push(['Description', match.description]);
71
+ if (match.flowId)
72
+ rows.push(['Flow ID', match.flowId]);
73
+ if (match.parameters?.length) {
74
+ rows.push([
75
+ 'Parameters',
76
+ match.parameters
77
+ .map((p) => `${p.in}:${p.name}${p.required ? '*' : ''}`)
78
+ .join(', '),
79
+ ]);
80
+ }
81
+ if (match.requestBody)
82
+ rows.push(['Request body', 'yes']);
83
+ printTable(['FIELD', 'VALUE'], rows);
84
+ if (match.parameters?.length) {
85
+ console.log('');
86
+ heading('Parameters');
87
+ printTable(['IN', 'NAME', 'REQUIRED', 'TYPE'], match.parameters.map((p) => [
88
+ String(p.in ?? ''),
89
+ String(p.name ?? ''),
90
+ p.required ? 'yes' : 'no',
91
+ String(p.schema?.type ?? p.type ?? ''),
92
+ ]));
93
+ }
94
+ }
95
+ catch (err) {
96
+ printError(err.message ?? String(err));
97
+ process.exit(1);
98
+ }
99
+ }
100
+ function findEndpoint(endpoints, selector, methodHint) {
101
+ const wantMethod = methodHint?.toUpperCase();
102
+ // 1. Exact operationId match
103
+ const byOp = endpoints.find((e) => e.operationId === selector);
104
+ if (byOp)
105
+ return byOp;
106
+ // 2. METHOD /path form (e.g. "GET /habits")
107
+ const m = /^([A-Za-z]+)\s+(.+)$/.exec(selector);
108
+ if (m) {
109
+ const [, method, p] = m;
110
+ const found = endpoints.find((e) => (e.method ?? '').toUpperCase() === method.toUpperCase() &&
111
+ e.path === p);
112
+ if (found)
113
+ return found;
114
+ }
115
+ // 3. Path match (with optional --method)
116
+ const matches = endpoints.filter((e) => e.path === selector);
117
+ if (matches.length === 1)
118
+ return matches[0];
119
+ if (matches.length > 1) {
120
+ if (!wantMethod) {
121
+ warn(`Multiple endpoints match path "${selector}". Disambiguate with --method ` +
122
+ `(${matches.map((e) => (e.method ?? '').toUpperCase()).join(', ')}).`);
123
+ return null;
124
+ }
125
+ return (matches.find((e) => (e.method ?? '').toUpperCase() === wantMethod) ?? null);
126
+ }
127
+ return null;
128
+ }
129
+ //# sourceMappingURL=endpoints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"endpoints.js","sourceRoot":"","sources":["../../../src/commands/endpoints.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export declare function filesListCommand(workspace: string, options: {
2
+ key?: string;
3
+ branch?: string;
4
+ json?: boolean;
5
+ }): Promise<void>;
6
+ export declare function filesGetCommand(workspace: string, filePath: string, options: {
7
+ key?: string;
8
+ branch?: string;
9
+ out?: string;
10
+ }): Promise<void>;
11
+ //# sourceMappingURL=files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../../src/commands/files.ts"],"names":[],"mappings":"AA6BA,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GACzD,OAAO,CAAC,IAAI,CAAC,CAkCf;AAED,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GACvD,OAAO,CAAC,IAAI,CAAC,CA4Cf"}
@@ -0,0 +1,84 @@
1
+ // ────────────────────────────────────────────────────────────────────────────
2
+ // Codata CLI — Handoff Files (list / get)
3
+ // ────────────────────────────────────────────────────────────────────────────
4
+ //
5
+ // codata files list <ws> # combinedAuth
6
+ // codata files get <ws> <path> [--out f]
7
+ //
8
+ import fs from 'fs';
9
+ import path from 'path';
10
+ import { createCliClient } from '../config.js';
11
+ import { heading, info, success, error as printError, printJson } from '../output.js';
12
+ export async function filesListCommand(workspace, options) {
13
+ try {
14
+ const client = createCliClient({ apiKey: options.key });
15
+ const ws = await client.findWorkspace(workspace);
16
+ const c = options.key ? client : createCliClient({ workspaceId: ws.id });
17
+ const data = await c.request('GET', `/api/workspaces/${ws.id}/handoff/files`, { query: options.branch ? { branch: options.branch } : undefined });
18
+ if (options.json) {
19
+ printJson(data);
20
+ return;
21
+ }
22
+ heading(`Handoff files for ${ws.name ?? ws.id} (branch ${data.branchName})`);
23
+ if (!data.files?.length) {
24
+ info('(no files — workspace may not be generated yet)');
25
+ return;
26
+ }
27
+ info(' PATH KIND ACTION SIZE');
28
+ for (const f of data.files) {
29
+ const p = (f.path ?? '').padEnd(42);
30
+ const kind = (f.kind ?? '?').padEnd(13);
31
+ const action = (f.writeAction ?? 'create').padEnd(19);
32
+ const size = String(f.sizeBytes ?? '?');
33
+ console.log(` ${p} ${kind} ${action} ${size}`);
34
+ }
35
+ }
36
+ catch (err) {
37
+ printError(err.message ?? String(err));
38
+ process.exit(1);
39
+ }
40
+ }
41
+ export async function filesGetCommand(workspace, filePath, options) {
42
+ try {
43
+ const client = createCliClient({ apiKey: options.key });
44
+ const ws = await client.findWorkspace(workspace);
45
+ const c = options.key ? client : createCliClient({ workspaceId: ws.id });
46
+ // Backend uses URL-encoded filePath; encodeURIComponent it before joining.
47
+ const encoded = encodeURIComponent(filePath);
48
+ // The download endpoint returns raw file content with a
49
+ // Content-Disposition attachment header (NOT an envelope). The SDK
50
+ // returns the parsed body as the data; for non-JSON content types it
51
+ // returns the raw text string.
52
+ const body = await c.request('GET', `/api/workspaces/${ws.id}/handoff/files/${encoded}`, { query: options.branch ? { branch: options.branch } : undefined });
53
+ const text = typeof body === 'string' ? body : JSON.stringify(body, null, 2);
54
+ if (options.out) {
55
+ // Default behaviour: respect parent directories. If --out is a dir, write
56
+ // using the original basename; otherwise treat it as a file path.
57
+ let target = options.out;
58
+ try {
59
+ const st = fs.statSync(target);
60
+ if (st.isDirectory()) {
61
+ target = path.join(target, path.basename(filePath));
62
+ }
63
+ }
64
+ catch {
65
+ // not an existing path — treat options.out as a file path
66
+ }
67
+ const dir = path.dirname(target);
68
+ if (dir && dir !== '.')
69
+ fs.mkdirSync(dir, { recursive: true });
70
+ fs.writeFileSync(target, text);
71
+ success(`Wrote ${target}`);
72
+ }
73
+ else {
74
+ process.stdout.write(text);
75
+ if (!text.endsWith('\n'))
76
+ process.stdout.write('\n');
77
+ }
78
+ }
79
+ catch (err) {
80
+ printError(err.message ?? String(err));
81
+ process.exit(1);
82
+ }
83
+ }
84
+ //# sourceMappingURL=files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../../../src/commands/files.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare function integrationKitCommand(workspace: string, options: {
2
+ out?: string;
3
+ json?: boolean;
4
+ key?: string;
5
+ }): Promise<void>;
6
+ //# sourceMappingURL=integrationKit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integrationKit.d.ts","sourceRoot":"","sources":["../../../src/commands/integrationKit.ts"],"names":[],"mappings":"AAsCA,wBAAsB,qBAAqB,CACzC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GACtD,OAAO,CAAC,IAAI,CAAC,CAmEf"}
@@ -0,0 +1,71 @@
1
+ // ────────────────────────────────────────────────────────────────────────────
2
+ // Codata CLI — Integration Kit
3
+ // ────────────────────────────────────────────────────────────────────────────
4
+ //
5
+ // Fetches the workspace integration kit (generated SDK / config files) and
6
+ // either prints the file manifest or writes every file to disk.
7
+ //
8
+ // Backend route (combinedAuth → wsk_* keys accepted):
9
+ // GET /api/workspaces/:id/integration-kit
10
+ //
11
+ import fs from 'fs';
12
+ import path from 'path';
13
+ import { createCliClient } from '../config.js';
14
+ import { heading, printTable, printJson, success, info, warn, error as printError, } from '../output.js';
15
+ export async function integrationKitCommand(workspace, options) {
16
+ try {
17
+ const client = createCliClient({ apiKey: options.key });
18
+ const ws = await client.findWorkspace(workspace);
19
+ const authedClient = options.key ? client : createCliClient({ workspaceId: ws.id });
20
+ const kit = await authedClient.request('GET', `/api/workspaces/${ws.id}/integration-kit`);
21
+ if (options.json) {
22
+ printJson(kit);
23
+ return;
24
+ }
25
+ const files = kit.files ?? [];
26
+ const manifest = kit.fileManifest ??
27
+ files.map((f) => ({ path: f.path, writeAction: f.writeAction ?? 'create' }));
28
+ if (!options.out) {
29
+ heading(`Integration kit for ${ws.name ?? ws.id}`);
30
+ if (manifest.length === 0) {
31
+ warn('No files in this integration kit.');
32
+ return;
33
+ }
34
+ printTable(['PATH', 'ACTION'], manifest.map((m) => [m.path, m.writeAction ?? 'create']));
35
+ console.log('');
36
+ info(`Write the kit to disk:`);
37
+ info(` codata integration-kit ${workspace} --out ./`);
38
+ return;
39
+ }
40
+ // ── Write mode ──────────────────────────────────────────────────────
41
+ if (files.length === 0) {
42
+ warn('Integration kit has no file contents to write.');
43
+ return;
44
+ }
45
+ const root = path.resolve(options.out);
46
+ let created = 0;
47
+ let appended = 0;
48
+ for (const f of files) {
49
+ if (!f.path || f.content === undefined)
50
+ continue;
51
+ const target = path.join(root, f.path);
52
+ fs.mkdirSync(path.dirname(target), { recursive: true });
53
+ if (f.writeAction === 'append_if_exists' && fs.existsSync(target)) {
54
+ fs.appendFileSync(target, f.content);
55
+ appended++;
56
+ }
57
+ else {
58
+ fs.writeFileSync(target, f.content);
59
+ created++;
60
+ }
61
+ }
62
+ success(`Wrote ${created} file(s)${appended ? `, appended to ${appended}` : ''} under ${root}`);
63
+ }
64
+ catch (err) {
65
+ printError(err.message ?? String(err));
66
+ process.exit(1);
67
+ }
68
+ }
69
+ // Suppress unused import warning when CodataClient is only used for typing
70
+ void null;
71
+ //# sourceMappingURL=integrationKit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integrationKit.js","sourceRoot":"","sources":["../../../src/commands/integrationKit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ export declare function generateCommand(workspace: string, options: {
2
+ branch?: string;
3
+ json?: boolean;
4
+ wait?: boolean;
5
+ timeout?: string;
6
+ }): Promise<void>;
7
+ export declare function activateCommand(workspace: string, options: {
8
+ branch?: string;
9
+ json?: boolean;
10
+ }): Promise<void>;
11
+ export declare function deactivateCommand(workspace: string, options: {
12
+ branch?: string;
13
+ json?: boolean;
14
+ }): Promise<void>;
15
+ export declare function rollbackCommand(workspace: string, version: string, options: {
16
+ branch?: string;
17
+ json?: boolean;
18
+ }): Promise<void>;
19
+ export declare function discardChangesCommand(workspace: string, options: {
20
+ branch?: string;
21
+ json?: boolean;
22
+ force?: boolean;
23
+ }): Promise<void>;
24
+ //# sourceMappingURL=lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../../src/commands/lifecycle.ts"],"names":[],"mappings":"AAkBA,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7E,OAAO,CAAC,IAAI,CAAC,CAOf;AAED,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAC3C,OAAO,CAAC,IAAI,CAAC,CAOf;AAED,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAC3C,OAAO,CAAC,IAAI,CAAC,CAOf;AAED,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAC3C,OAAO,CAAC,IAAI,CAAC,CAYf;AAED,wBAAsB,qBAAqB,CACzC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAC5D,OAAO,CAAC,IAAI,CAAC,CAWf"}