@elaraai/e3-cloud-cli 0.0.0-stage → 1.0.89-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +54 -0
- package/README.md +433 -2
- package/dist/src/app-source.d.ts +16 -0
- package/dist/src/app-source.d.ts.map +1 -0
- package/dist/src/app-source.js +112 -0
- package/dist/src/app-source.js.map +1 -0
- package/dist/src/cli.d.ts +7 -0
- package/dist/src/cli.d.ts.map +1 -0
- package/dist/src/cli.js +472 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/commands/app.d.ts +28 -0
- package/dist/src/commands/app.d.ts.map +1 -0
- package/dist/src/commands/app.js +286 -0
- package/dist/src/commands/app.js.map +1 -0
- package/dist/src/commands/compute.d.ts +16 -0
- package/dist/src/commands/compute.d.ts.map +1 -0
- package/dist/src/commands/compute.js +110 -0
- package/dist/src/commands/compute.js.map +1 -0
- package/dist/src/commands/feedback.d.ts +27 -0
- package/dist/src/commands/feedback.d.ts.map +1 -0
- package/dist/src/commands/feedback.js +197 -0
- package/dist/src/commands/feedback.js.map +1 -0
- package/dist/src/commands/records.d.ts +42 -0
- package/dist/src/commands/records.d.ts.map +1 -0
- package/dist/src/commands/records.js +301 -0
- package/dist/src/commands/records.js.map +1 -0
- package/dist/src/commands/release.d.ts +39 -0
- package/dist/src/commands/release.d.ts.map +1 -0
- package/dist/src/commands/release.js +219 -0
- package/dist/src/commands/release.js.map +1 -0
- package/dist/src/commands/role.d.ts +24 -0
- package/dist/src/commands/role.d.ts.map +1 -0
- package/dist/src/commands/role.js +94 -0
- package/dist/src/commands/role.js.map +1 -0
- package/dist/src/commands/schedule.d.ts +18 -0
- package/dist/src/commands/schedule.d.ts.map +1 -0
- package/dist/src/commands/schedule.js +128 -0
- package/dist/src/commands/schedule.js.map +1 -0
- package/dist/src/commands/secrets.d.ts +15 -0
- package/dist/src/commands/secrets.d.ts.map +1 -0
- package/dist/src/commands/secrets.js +82 -0
- package/dist/src/commands/secrets.js.map +1 -0
- package/dist/src/commands/staging.d.ts +36 -0
- package/dist/src/commands/staging.d.ts.map +1 -0
- package/dist/src/commands/staging.js +98 -0
- package/dist/src/commands/staging.js.map +1 -0
- package/dist/src/commands/timeout.d.ts +16 -0
- package/dist/src/commands/timeout.d.ts.map +1 -0
- package/dist/src/commands/timeout.js +124 -0
- package/dist/src/commands/timeout.js.map +1 -0
- package/dist/src/commands/user-settings.d.ts +15 -0
- package/dist/src/commands/user-settings.d.ts.map +1 -0
- package/dist/src/commands/user-settings.js +74 -0
- package/dist/src/commands/user-settings.js.map +1 -0
- package/dist/src/commands/user.d.ts +26 -0
- package/dist/src/commands/user.d.ts.map +1 -0
- package/dist/src/commands/user.js +206 -0
- package/dist/src/commands/user.js.map +1 -0
- package/dist/src/commands/whoami.d.ts +6 -0
- package/dist/src/commands/whoami.d.ts.map +1 -0
- package/dist/src/commands/whoami.js +38 -0
- package/dist/src/commands/whoami.js.map +1 -0
- package/dist/src/credentials.d.ts +100 -0
- package/dist/src/credentials.d.ts.map +1 -0
- package/dist/src/credentials.js +164 -0
- package/dist/src/credentials.js.map +1 -0
- package/dist/src/utils.d.ts +38 -0
- package/dist/src/utils.d.ts.map +1 -0
- package/dist/src/utils.js +73 -0
- package/dist/src/utils.js.map +1 -0
- package/package.json +32 -3
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Releases:
|
|
7
|
+
*
|
|
8
|
+
* - `e3-cloud release <repo-url> <from> <to> [--plan] [--carry <path...>] [--remove-apps]`
|
|
9
|
+
* - `e3-cloud rollback <repo-url> <workspace> [<history-id>] [--plan]`
|
|
10
|
+
* - `e3-cloud history <repo-url> <workspace> [--limit <n>]`
|
|
11
|
+
*
|
|
12
|
+
* A release and a rollback print their plan first, always; `--plan` stops
|
|
13
|
+
* there. One that deploys its package waits for its deploy job. A workspace
|
|
14
|
+
* is released to only by its staging (`e3-cloud staging`);
|
|
15
|
+
* the plan names any change an admin forced onto it since its last release,
|
|
16
|
+
* which the release undoes.
|
|
17
|
+
*/
|
|
18
|
+
import { appDeployWait, releasePlanRefusalLines, releaseWorkspace, rollbackWorkspace, workspaceHistory, } from '@elaraai/e3-cloud-client';
|
|
19
|
+
import { none, some } from '@elaraai/east';
|
|
20
|
+
import { getValidToken } from '../credentials.js';
|
|
21
|
+
import { exitError, formatError, parseRepoUrl } from '../utils.js';
|
|
22
|
+
/** A package, as people name it: `acme@1.5.0`. */
|
|
23
|
+
function packageWords(pkg) {
|
|
24
|
+
return `${pkg.name}@${pkg.version}`;
|
|
25
|
+
}
|
|
26
|
+
/** When, in UTC, as the CLI prints it: `2026-10-12 14:02`. */
|
|
27
|
+
function when(at) {
|
|
28
|
+
return at.toISOString().replace('T', ' ').slice(0, 16);
|
|
29
|
+
}
|
|
30
|
+
/** The plan a response carries. */
|
|
31
|
+
function planOf(response) {
|
|
32
|
+
return response.type === 'releasing' ? response.value.plan : response.value;
|
|
33
|
+
}
|
|
34
|
+
/** What a plan does, a line for each part. */
|
|
35
|
+
export function planLines(plan) {
|
|
36
|
+
const head = plan.source.type === 'workspace'
|
|
37
|
+
? `Release ${plan.source.value} to ${plan.target}`
|
|
38
|
+
: `Roll ${plan.target} back to the entry of ${when(plan.source.value.at)}`;
|
|
39
|
+
const lines = [head];
|
|
40
|
+
const row = (label, words) => lines.push(` ${label.padEnd(9)} ${words}`);
|
|
41
|
+
const from = plan.package.from.type === 'some' ? plan.package.from.value : null;
|
|
42
|
+
const to = plan.package.to.type === 'some' ? plan.package.to.value : null;
|
|
43
|
+
if (to !== null)
|
|
44
|
+
row('Package', from === null ? packageWords(to) : from.hash === to.hash ? `${packageWords(to)}, as it runs` : `${packageWords(from)} → ${packageWords(to)}`);
|
|
45
|
+
const theirs = plan.source.type === 'workspace' ? `${plan.source.value}'s ` : '';
|
|
46
|
+
const apps = plan.apps.map((app) => {
|
|
47
|
+
switch (app.change.type) {
|
|
48
|
+
case 'added': return `${app.name} added (${theirs}v${app.change.value.to.number})`;
|
|
49
|
+
case 'updated': return `${app.name} v${app.change.value.from.number} → ${theirs}v${app.change.value.to.number}`;
|
|
50
|
+
case 'unchanged': return `${app.name} unchanged`;
|
|
51
|
+
case 'removed': return `${app.name} removed`;
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
if (apps.length > 0)
|
|
55
|
+
row('Apps', apps.join(' · '));
|
|
56
|
+
// The bundles staged for the platform's next e3 that go with the apps
|
|
57
|
+
const staged = plan.apps.flatMap((app) => {
|
|
58
|
+
const { from: was, to: now } = app.stagedFor;
|
|
59
|
+
if (was.type === now.type && (was.type === 'none' || (now.type === 'some' && was.value === now.value)))
|
|
60
|
+
return [];
|
|
61
|
+
return [now.type === 'some' ? `${app.name}'s bundle for e3 ${now.value} staged` : `${app.name}'s bundle for e3 ${was.type === 'some' ? was.value : ''} cleared`];
|
|
62
|
+
});
|
|
63
|
+
if (staged.length > 0)
|
|
64
|
+
row('Staged', staged.join(' · '));
|
|
65
|
+
const records = plan.records.map((record) => {
|
|
66
|
+
const name = record.record.replace(/^records\//, '');
|
|
67
|
+
switch (record.action.type) {
|
|
68
|
+
case 'mint': return `${name} new`;
|
|
69
|
+
case 'keep': return `${name} kept`;
|
|
70
|
+
case 'migrate': return `${name} migrates (${record.action.value.steps.length} step${record.action.value.steps.length === 1 ? '' : 's'})`;
|
|
71
|
+
case 'reset': return `${name} reset: ${record.action.value.reason}`;
|
|
72
|
+
case 'drop': return `${name} dropped`;
|
|
73
|
+
case 'refused': return `${name} refused`;
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
if (records.length > 0)
|
|
77
|
+
row('Records', records.join(' · '));
|
|
78
|
+
const built = plan.indexes.filter((index) => index.action.type === 'build').map((index) => index.index);
|
|
79
|
+
if (built.length > 0)
|
|
80
|
+
row('Indexes', `${built.join(', ')} built`);
|
|
81
|
+
const kept = plan.inputs.filter((input) => input.action.type === 'keep').map((input) => input.input);
|
|
82
|
+
const reset = plan.inputs.filter((input) => input.action.type === 'reset').map((input) => input.input);
|
|
83
|
+
const inputs = [
|
|
84
|
+
...(kept.length > 0 ? [`${plan.target}'s kept: ${kept.join(', ')}`] : []),
|
|
85
|
+
...(reset.length > 0 ? [`reset: ${reset.join(', ')}`] : []),
|
|
86
|
+
];
|
|
87
|
+
if (inputs.length > 0)
|
|
88
|
+
row('Inputs', inputs.join(' · '));
|
|
89
|
+
if (plan.carry.length > 0)
|
|
90
|
+
row('Carry', plan.carry.map((ref) => ref.path).join(' · '));
|
|
91
|
+
if (to !== null)
|
|
92
|
+
row('Checks', plan.checks.length === 0 ? `every app fits ${packageWords(to)}` : `${plan.checks.length} app${plan.checks.length === 1 ? '' : 's'} would not fit`);
|
|
93
|
+
// The changes forced onto the target past its protection, which this undoes
|
|
94
|
+
for (const [i, undone] of plan.undoes.entries()) {
|
|
95
|
+
row(i === 0 ? 'Undoes' : '', `${undone.summary} (forced by ${undone.actor}, ${when(undone.at)})`);
|
|
96
|
+
}
|
|
97
|
+
return lines;
|
|
98
|
+
}
|
|
99
|
+
/** Shows a plan, ends with its refusal if it has one, and applies it once shown unless asked only for the plan. */
|
|
100
|
+
async function planThenApply(plan, apply, planOnly, wait) {
|
|
101
|
+
const planned = planOf(await plan());
|
|
102
|
+
console.log(planLines(planned).join('\n'));
|
|
103
|
+
const refusal = releasePlanRefusalLines(planned);
|
|
104
|
+
if (refusal.length > 0) {
|
|
105
|
+
console.error(['Refused:', ...refusal.map((line) => ` ${line}`)].join('\n'));
|
|
106
|
+
process.exit(1);
|
|
107
|
+
}
|
|
108
|
+
if (planOnly)
|
|
109
|
+
return;
|
|
110
|
+
const response = await apply(planned);
|
|
111
|
+
switch (response.type) {
|
|
112
|
+
case 'refused':
|
|
113
|
+
console.error(['Refused:', ...releasePlanRefusalLines(response.value).map((line) => ` ${line}`)].join('\n'));
|
|
114
|
+
process.exit(1);
|
|
115
|
+
break;
|
|
116
|
+
case 'released':
|
|
117
|
+
console.log(`Done: ${response.value.target}'s apps switched`);
|
|
118
|
+
break;
|
|
119
|
+
case 'releasing':
|
|
120
|
+
await wait(response.value.job);
|
|
121
|
+
break;
|
|
122
|
+
case 'planned':
|
|
123
|
+
break;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/** Waits for a release's deploy job, saying what it is at, then what it kept. */
|
|
127
|
+
async function waitFor(baseUrl, repo, workspace, job, token) {
|
|
128
|
+
console.log(`Deploying to ${workspace} (job ${job})…`);
|
|
129
|
+
let said = '';
|
|
130
|
+
const result = await appDeployWait(baseUrl, repo, workspace, job, { token }, {
|
|
131
|
+
// The token read afresh for each poll: a long deploy outlives it
|
|
132
|
+
refresh: async () => ({ token: await getValidToken(baseUrl) }),
|
|
133
|
+
onProgress: (progress) => {
|
|
134
|
+
const now = progress.type === 'pending' ? 'waiting for the workspace' : 'deploying';
|
|
135
|
+
if (now !== said)
|
|
136
|
+
console.log(` ${now}…`);
|
|
137
|
+
said = now;
|
|
138
|
+
},
|
|
139
|
+
});
|
|
140
|
+
const kept = result.inputs.filter((input) => input.action.type === 'keep').map((input) => input.input);
|
|
141
|
+
if (kept.length > 0)
|
|
142
|
+
console.log(` ${workspace} kept the ${kept.length === 1 ? 'input' : 'inputs'} people set: ${kept.join(', ')}`);
|
|
143
|
+
console.log(`Done: ${workspace} runs what was released`);
|
|
144
|
+
}
|
|
145
|
+
/** What an entry of a workspace's history did, in a few words. */
|
|
146
|
+
export function entryKindWords(kind) {
|
|
147
|
+
switch (kind.type) {
|
|
148
|
+
case 'release': return `release from ${kind.value.from}`;
|
|
149
|
+
case 'rollback': return 'rollback';
|
|
150
|
+
case 'copy': return `copy from ${kind.value.from}`;
|
|
151
|
+
case 'app_deploy': return 'app deploy';
|
|
152
|
+
case 'deploy': return 'deploy';
|
|
153
|
+
case 'staging_added': return `staging ${kind.value.staging} added`;
|
|
154
|
+
case 'staging_stopped': return `staging ${kind.value.staging} stopped`;
|
|
155
|
+
case 'staging_skipped': return kind.value.type === 'app_deploy' ? 'app deploy, forced' : `${kind.value.value.app} removed, forced`;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/** An entry of a workspace's history, as a line. */
|
|
159
|
+
function entryLine(entry) {
|
|
160
|
+
const kind = entryKindWords(entry.kind);
|
|
161
|
+
const pkg = entry.package.type === 'some' ? packageWords(entry.package.value) : 'no package';
|
|
162
|
+
const apps = entry.apps.map((app) => `${app.name} v${app.number}`).join(', ');
|
|
163
|
+
const outcome = entry.outcome.type === 'failed' ? `failed: ${entry.outcome.value}` : entry.outcome.type;
|
|
164
|
+
return `${when(entry.at)} ${kind.padEnd(24)} ${pkg}${apps === '' ? '' : ` ${apps}`} ${outcome}\n ${entry.id}`;
|
|
165
|
+
}
|
|
166
|
+
export const releaseCommand = {
|
|
167
|
+
/** e3-cloud release <repoUrl> <from> <to> [--plan] [--carry <path...>] [--remove-apps] */
|
|
168
|
+
async release(url, from, to, options) {
|
|
169
|
+
try {
|
|
170
|
+
const { baseUrl, repo } = parseRepoUrl(url);
|
|
171
|
+
const token = await getValidToken(baseUrl);
|
|
172
|
+
const request = { from, carry: options.carry ?? [], removeApps: options.removeApps === true };
|
|
173
|
+
await planThenApply(() => releaseWorkspace(baseUrl, repo, to, { ...request, plan: true }, { token }), () => releaseWorkspace(baseUrl, repo, to, { ...request, plan: false }, { token }), options.plan === true, (job) => waitFor(baseUrl, repo, to, job, token));
|
|
174
|
+
}
|
|
175
|
+
catch (err) {
|
|
176
|
+
exitError(formatError(err));
|
|
177
|
+
}
|
|
178
|
+
},
|
|
179
|
+
/** e3-cloud rollback <repoUrl> <workspace> [historyId] [--plan] */
|
|
180
|
+
async rollback(url, workspace, id, options) {
|
|
181
|
+
try {
|
|
182
|
+
const { baseUrl, repo } = parseRepoUrl(url);
|
|
183
|
+
const token = await getValidToken(baseUrl);
|
|
184
|
+
const to = id === undefined ? none : some(id);
|
|
185
|
+
await planThenApply(() => rollbackWorkspace(baseUrl, repo, workspace, { to, plan: true }, { token }),
|
|
186
|
+
// Back to the entry the plan shown named, not to whatever differs by then
|
|
187
|
+
(planned) => rollbackWorkspace(baseUrl, repo, workspace, {
|
|
188
|
+
to: planned.source.type === 'history' ? some(planned.source.value.id) : to,
|
|
189
|
+
plan: false,
|
|
190
|
+
}, { token }), options.plan === true, (job) => waitFor(baseUrl, repo, workspace, job, token));
|
|
191
|
+
}
|
|
192
|
+
catch (err) {
|
|
193
|
+
exitError(formatError(err));
|
|
194
|
+
}
|
|
195
|
+
},
|
|
196
|
+
/** e3-cloud history <repoUrl> <workspace> [--limit <n>] */
|
|
197
|
+
async history(url, workspace, options) {
|
|
198
|
+
try {
|
|
199
|
+
const { baseUrl, repo } = parseRepoUrl(url);
|
|
200
|
+
const token = await getValidToken(baseUrl);
|
|
201
|
+
const limit = options.limit === undefined ? undefined : Number(options.limit);
|
|
202
|
+
if (limit !== undefined && (!Number.isInteger(limit) || limit < 1))
|
|
203
|
+
exitError(`--limit is a whole number from 1, not '${options.limit}'`);
|
|
204
|
+
const page = await workspaceHistory(baseUrl, repo, workspace, { token }, limit === undefined ? {} : { limit });
|
|
205
|
+
if (page.entries.length === 0) {
|
|
206
|
+
console.log(`${workspace} has no history yet`);
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
for (const entry of page.entries)
|
|
210
|
+
console.log(entryLine(entry));
|
|
211
|
+
if (page.next.type === 'some')
|
|
212
|
+
console.log(`… older entries follow (${page.entries.length} shown)`);
|
|
213
|
+
}
|
|
214
|
+
catch (err) {
|
|
215
|
+
exitError(formatError(err));
|
|
216
|
+
}
|
|
217
|
+
},
|
|
218
|
+
};
|
|
219
|
+
//# sourceMappingURL=release.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release.js","sourceRoot":"","sources":["../../../src/commands/release.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
import { type RoleGrant } from '@elaraai/e3-cloud-types';
|
|
6
|
+
/**
|
|
7
|
+
* A grant as `--grant` writes it: `workspace/app` for every page, or
|
|
8
|
+
* `workspace/app:page,page` for those pages.
|
|
9
|
+
*
|
|
10
|
+
* @param text - The option's value
|
|
11
|
+
* @returns The grant, or null when it is not one
|
|
12
|
+
*/
|
|
13
|
+
export declare function parseGrant(text: string): RoleGrant | null;
|
|
14
|
+
/** A grant in words, as `--grant` writes it. */
|
|
15
|
+
export declare function grantWords(grant: RoleGrant): string;
|
|
16
|
+
export declare const roleCommand: {
|
|
17
|
+
list(url: string): Promise<void>;
|
|
18
|
+
show(url: string, name: string): Promise<void>;
|
|
19
|
+
set(url: string, name: string, options: {
|
|
20
|
+
grant: string[];
|
|
21
|
+
}): Promise<void>;
|
|
22
|
+
remove(url: string, name: string): Promise<void>;
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=role.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"role.d.ts","sourceRoot":"","sources":["../../../src/commands/role.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,OAAO,EAAoC,KAAK,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAI3F;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAOzD;AAED,gDAAgD;AAChD,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAEnD;AAOD,eAAO,MAAM,WAAW;cACN,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;cAYtB,MAAM,QAAQ,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;aAUrC,MAAM,QAAQ,MAAM,WAAW;QAAE,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;gBAiB/D,MAAM,QAAQ,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAUvD,CAAC"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* e3-cloud role: a repository's business roles, the jobs
|
|
7
|
+
* its users do, each granting apps, every page of each or some. A person
|
|
8
|
+
* holds them through `e3-cloud user add --role user --roles …`.
|
|
9
|
+
*/
|
|
10
|
+
import { variant } from '@elaraai/east';
|
|
11
|
+
import { deleteRole, getRole, listRoles, putRole } from '@elaraai/e3-cloud-client';
|
|
12
|
+
import { ALL_APPS_ROLE } from '@elaraai/e3-cloud-types';
|
|
13
|
+
import { getValidToken } from '../credentials.js';
|
|
14
|
+
import { parseRepoUrl, formatError, exitError } from '../utils.js';
|
|
15
|
+
/**
|
|
16
|
+
* A grant as `--grant` writes it: `workspace/app` for every page, or
|
|
17
|
+
* `workspace/app:page,page` for those pages.
|
|
18
|
+
*
|
|
19
|
+
* @param text - The option's value
|
|
20
|
+
* @returns The grant, or null when it is not one
|
|
21
|
+
*/
|
|
22
|
+
export function parseGrant(text) {
|
|
23
|
+
const match = /^([^/:]+)\/([^/:]+)(?::(.+))?$/.exec(text.trim());
|
|
24
|
+
if (match === null)
|
|
25
|
+
return null;
|
|
26
|
+
const [, workspace, app, pages] = match;
|
|
27
|
+
if (pages === undefined)
|
|
28
|
+
return { workspace: workspace, app: app, pages: variant('all', null) };
|
|
29
|
+
const named = pages.split(',').map((page) => page.trim()).filter((page) => page !== '');
|
|
30
|
+
return named.length === 0 ? null : { workspace: workspace, app: app, pages: variant('some', named) };
|
|
31
|
+
}
|
|
32
|
+
/** A grant in words, as `--grant` writes it. */
|
|
33
|
+
export function grantWords(grant) {
|
|
34
|
+
return `${grant.workspace}/${grant.app}${grant.pages.type === 'all' ? '' : `:${grant.pages.value.join(',')}`}`;
|
|
35
|
+
}
|
|
36
|
+
/** A role in words: its name, and what it grants. */
|
|
37
|
+
function roleLine(role) {
|
|
38
|
+
return `${role.name.padEnd(28)} ${role.grants.length === 0 ? '(grants nothing)' : role.grants.map(grantWords).join(' ')}`;
|
|
39
|
+
}
|
|
40
|
+
export const roleCommand = {
|
|
41
|
+
async list(url) {
|
|
42
|
+
try {
|
|
43
|
+
const { baseUrl, repo } = parseRepoUrl(url);
|
|
44
|
+
const token = await getValidToken(baseUrl);
|
|
45
|
+
const roles = await listRoles(baseUrl, repo, { token });
|
|
46
|
+
console.log(`${ALL_APPS_ROLE.padEnd(28)} every app of the live workspaces (built in)`);
|
|
47
|
+
for (const role of roles)
|
|
48
|
+
console.log(roleLine(role));
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
exitError(formatError(err));
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
async show(url, name) {
|
|
55
|
+
try {
|
|
56
|
+
const { baseUrl, repo } = parseRepoUrl(url);
|
|
57
|
+
const token = await getValidToken(baseUrl);
|
|
58
|
+
console.log(roleLine(await getRole(baseUrl, repo, name, { token })));
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
exitError(formatError(err));
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
async set(url, name, options) {
|
|
65
|
+
try {
|
|
66
|
+
const { baseUrl, repo } = parseRepoUrl(url);
|
|
67
|
+
const token = await getValidToken(baseUrl);
|
|
68
|
+
const grants = [];
|
|
69
|
+
for (const text of options.grant) {
|
|
70
|
+
const grant = parseGrant(text);
|
|
71
|
+
if (grant === null)
|
|
72
|
+
exitError(`'${text}' is no grant: write workspace/app, or workspace/app:page,page`);
|
|
73
|
+
grants.push(grant);
|
|
74
|
+
}
|
|
75
|
+
const role = await putRole(baseUrl, repo, { name, grants }, { token });
|
|
76
|
+
console.log(`Set ${roleLine(role)}`);
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
exitError(formatError(err));
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
async remove(url, name) {
|
|
83
|
+
try {
|
|
84
|
+
const { baseUrl, repo } = parseRepoUrl(url);
|
|
85
|
+
const token = await getValidToken(baseUrl);
|
|
86
|
+
await deleteRole(baseUrl, repo, name, { token });
|
|
87
|
+
console.log(`Removed ${name}`);
|
|
88
|
+
}
|
|
89
|
+
catch (err) {
|
|
90
|
+
exitError(formatError(err));
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
//# sourceMappingURL=role.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"role.js","sourceRoot":"","sources":["../../../src/commands/role.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
export declare const scheduleCommand: {
|
|
6
|
+
set(url: string, options: {
|
|
7
|
+
cron?: string;
|
|
8
|
+
forceTasks?: string;
|
|
9
|
+
forceRegex?: string;
|
|
10
|
+
timezone?: string;
|
|
11
|
+
description?: string;
|
|
12
|
+
enabled?: string;
|
|
13
|
+
}): Promise<void>;
|
|
14
|
+
get(url: string): Promise<void>;
|
|
15
|
+
remove(url: string): Promise<void>;
|
|
16
|
+
list(url: string): Promise<void>;
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=schedule.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schedule.d.ts","sourceRoot":"","sources":["../../../src/commands/schedule.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAiBH,eAAO,MAAM,eAAe;aAEnB,MAAM,WACF;QACP,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GACA,OAAO,CAAC,IAAI,CAAC;aA8DD,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;gBA0BnB,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;cAYxB,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CA4BvC,CAAC"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Schedule management commands — set, get, remove, list schedules.
|
|
7
|
+
*/
|
|
8
|
+
import { some, none } from '@elaraai/east';
|
|
9
|
+
import { getSchedule, setSchedule, removeSchedule, listSchedules, } from '@elaraai/e3-cloud-client';
|
|
10
|
+
import { taskList } from '@elaraai/e3-api-client';
|
|
11
|
+
import { getValidToken } from '../credentials.js';
|
|
12
|
+
import { parseWorkspaceUrl, parseRepoUrl, formatError, exitError, confirm } from '../utils.js';
|
|
13
|
+
export const scheduleCommand = {
|
|
14
|
+
async set(url, options) {
|
|
15
|
+
try {
|
|
16
|
+
const { baseUrl, repo, workspace } = parseWorkspaceUrl(url);
|
|
17
|
+
const token = await getValidToken(baseUrl);
|
|
18
|
+
// Build request — for updates, first fetch existing values
|
|
19
|
+
const existing = await getSchedule(baseUrl, repo, workspace, { token });
|
|
20
|
+
const cronExpression = options.cron ?? existing?.cronExpression;
|
|
21
|
+
if (!cronExpression) {
|
|
22
|
+
exitError('--cron is required when creating a new schedule');
|
|
23
|
+
}
|
|
24
|
+
let forceTasks;
|
|
25
|
+
if (options.forceRegex) {
|
|
26
|
+
// Resolve regex against deployed task list
|
|
27
|
+
const tasks = await taskList(baseUrl, repo, workspace, { token });
|
|
28
|
+
const regex = new RegExp(options.forceRegex);
|
|
29
|
+
const matched = tasks.filter(t => regex.test(t.name)).map(t => t.name);
|
|
30
|
+
if (matched.length === 0) {
|
|
31
|
+
exitError(`No tasks matched pattern: ${options.forceRegex}`);
|
|
32
|
+
}
|
|
33
|
+
console.log(`Matched ${matched.length} tasks: ${matched.join(', ')}`);
|
|
34
|
+
if (!await confirm('Use these as force-tasks?'))
|
|
35
|
+
return;
|
|
36
|
+
forceTasks = matched;
|
|
37
|
+
}
|
|
38
|
+
else if (options.forceTasks) {
|
|
39
|
+
forceTasks = options.forceTasks.split(',').map(s => s.trim());
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
forceTasks = existing?.forceTasks ?? [];
|
|
43
|
+
}
|
|
44
|
+
const enabled = options.enabled !== undefined
|
|
45
|
+
? options.enabled !== 'false'
|
|
46
|
+
: (existing?.enabled ?? true);
|
|
47
|
+
const schedule = await setSchedule(baseUrl, repo, workspace, {
|
|
48
|
+
cronExpression,
|
|
49
|
+
timezone: options.timezone ? some(options.timezone) : none,
|
|
50
|
+
forceTasks,
|
|
51
|
+
enabled,
|
|
52
|
+
description: options.description ? some(options.description) : (existing?.description ?? none),
|
|
53
|
+
}, { token });
|
|
54
|
+
console.log(`Schedule ${existing ? 'updated' : 'created'} for ${repo}/${workspace}:`);
|
|
55
|
+
console.log(` Cron: ${schedule.cronExpression}`);
|
|
56
|
+
console.log(` Timezone: ${schedule.timezone}`);
|
|
57
|
+
console.log(` Force tasks: ${schedule.forceTasks.join(', ') || '(none)'}`);
|
|
58
|
+
console.log(` Status: ${schedule.enabled ? 'enabled' : 'disabled'}`);
|
|
59
|
+
if (schedule.description.type === 'some') {
|
|
60
|
+
console.log(` Description: ${schedule.description.value}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
exitError(formatError(err));
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
async get(url) {
|
|
68
|
+
try {
|
|
69
|
+
const { baseUrl, repo, workspace } = parseWorkspaceUrl(url);
|
|
70
|
+
const token = await getValidToken(baseUrl);
|
|
71
|
+
const schedule = await getSchedule(baseUrl, repo, workspace, { token });
|
|
72
|
+
if (!schedule) {
|
|
73
|
+
console.log(`No schedule configured for ${repo}/${workspace}`);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
console.log(`Schedule for ${repo}/${workspace}:`);
|
|
77
|
+
console.log(` Cron: ${schedule.cronExpression}`);
|
|
78
|
+
console.log(` Timezone: ${schedule.timezone}`);
|
|
79
|
+
console.log(` Force tasks: ${schedule.forceTasks.join(', ') || '(none)'}`);
|
|
80
|
+
console.log(` Status: ${schedule.enabled ? 'enabled' : 'disabled'}`);
|
|
81
|
+
if (schedule.description.type === 'some') {
|
|
82
|
+
console.log(` Description: ${schedule.description.value}`);
|
|
83
|
+
}
|
|
84
|
+
console.log(` Last updated: ${schedule.updatedAt}`);
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
exitError(formatError(err));
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
async remove(url) {
|
|
91
|
+
try {
|
|
92
|
+
const { baseUrl, repo, workspace } = parseWorkspaceUrl(url);
|
|
93
|
+
const token = await getValidToken(baseUrl);
|
|
94
|
+
await removeSchedule(baseUrl, repo, workspace, { token });
|
|
95
|
+
console.log(`Schedule removed for ${repo}/${workspace}`);
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
exitError(formatError(err));
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
async list(url) {
|
|
102
|
+
try {
|
|
103
|
+
const { baseUrl, repo } = parseRepoUrl(url);
|
|
104
|
+
const token = await getValidToken(baseUrl);
|
|
105
|
+
const schedules = await listSchedules(baseUrl, repo, { token });
|
|
106
|
+
if (schedules.length === 0) {
|
|
107
|
+
console.log(`No schedules configured for ${repo}`);
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
console.log(`Schedules for ${repo}:`);
|
|
111
|
+
for (const s of schedules) {
|
|
112
|
+
const desc = s.description.type === 'some' ? s.description.value : '';
|
|
113
|
+
const row = [
|
|
114
|
+
` ${s.workspace.padEnd(16)}`,
|
|
115
|
+
`${s.cronExpression.padEnd(16)}`,
|
|
116
|
+
`${s.timezone.padEnd(20)}`,
|
|
117
|
+
`${(s.enabled ? 'enabled' : 'disabled').padEnd(12)}`,
|
|
118
|
+
desc,
|
|
119
|
+
].join('');
|
|
120
|
+
console.log(row);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
catch (err) {
|
|
124
|
+
exitError(formatError(err));
|
|
125
|
+
}
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
//# sourceMappingURL=schedule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schedule.js","sourceRoot":"","sources":["../../../src/commands/schedule.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
export declare const secretsCommand: {
|
|
6
|
+
/** e3-cloud secrets set <repoUrl> <NAME> [--value v] (value via stdin otherwise) */
|
|
7
|
+
set(url: string, name: string, options: {
|
|
8
|
+
value?: string;
|
|
9
|
+
}): Promise<void>;
|
|
10
|
+
/** e3-cloud secrets list <repoUrl> */
|
|
11
|
+
list(url: string): Promise<void>;
|
|
12
|
+
/** e3-cloud secrets rm <repoUrl> <NAME> */
|
|
13
|
+
rm(url: string, name: string): Promise<void>;
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=secrets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../../../src/commands/secrets.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAwBH,eAAO,MAAM,cAAc;IACzB,oFAAoF;aACrE,MAAM,QAAQ,MAAM,WAAW;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBhF,sCAAsC;cACtB,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBtC,2CAA2C;YAC7B,MAAM,QAAQ,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAWnD,CAAC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Secrets commands — set, list, rm.
|
|
7
|
+
*
|
|
8
|
+
* Manages per-repo secrets: credentials task code reads at runtime with
|
|
9
|
+
* `Env.get("NAME")` (east-node-std). Values are write-only — they can be set
|
|
10
|
+
* and deleted here but never read back; `list` shows names and modification
|
|
11
|
+
* times only. The value for `set` comes from `--value` or, preferably, stdin
|
|
12
|
+
* (keeps it out of shell history and process listings). Values are never
|
|
13
|
+
* echoed by any command.
|
|
14
|
+
*/
|
|
15
|
+
import { listSecrets, putSecret, deleteSecret } from '@elaraai/e3-cloud-client';
|
|
16
|
+
import { getValidToken } from '../credentials.js';
|
|
17
|
+
import { parseRepoUrl, formatError, exitError } from '../utils.js';
|
|
18
|
+
/** Read all of stdin as a UTF-8 string. */
|
|
19
|
+
async function readStdin() {
|
|
20
|
+
const chunks = [];
|
|
21
|
+
for await (const chunk of process.stdin)
|
|
22
|
+
chunks.push(chunk);
|
|
23
|
+
return Buffer.concat(chunks).toString('utf-8');
|
|
24
|
+
}
|
|
25
|
+
export const secretsCommand = {
|
|
26
|
+
/** e3-cloud secrets set <repoUrl> <NAME> [--value v] (value via stdin otherwise) */
|
|
27
|
+
async set(url, name, options) {
|
|
28
|
+
try {
|
|
29
|
+
const { baseUrl, repo } = parseRepoUrl(url);
|
|
30
|
+
const token = await getValidToken(baseUrl);
|
|
31
|
+
let value = options.value;
|
|
32
|
+
if (value === undefined) {
|
|
33
|
+
if (process.stdin.isTTY) {
|
|
34
|
+
exitError('No value given. Pipe it on stdin (e.g. `printf %s "$VALUE" | e3-cloud secrets set …`) or pass --value.');
|
|
35
|
+
}
|
|
36
|
+
value = await readStdin();
|
|
37
|
+
// Trim exactly one trailing newline — `echo` and heredocs append one.
|
|
38
|
+
if (value.endsWith('\n'))
|
|
39
|
+
value = value.slice(0, -1);
|
|
40
|
+
}
|
|
41
|
+
if (value.length === 0)
|
|
42
|
+
exitError('Secret value must not be empty.');
|
|
43
|
+
await putSecret(baseUrl, repo, name, value, { token });
|
|
44
|
+
console.log(`Set secret ${name} (takes effect on the next task run)`);
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
exitError(formatError(err));
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
/** e3-cloud secrets list <repoUrl> */
|
|
51
|
+
async list(url) {
|
|
52
|
+
try {
|
|
53
|
+
const { baseUrl, repo } = parseRepoUrl(url);
|
|
54
|
+
const token = await getValidToken(baseUrl);
|
|
55
|
+
const entries = await listSecrets(baseUrl, repo, { token });
|
|
56
|
+
if (entries.length === 0) {
|
|
57
|
+
console.log('No secrets.');
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
for (const entry of entries) {
|
|
61
|
+
console.log(`${entry.lastModified.toISOString()} ${entry.name}`);
|
|
62
|
+
}
|
|
63
|
+
console.log(`${entries.length} secret${entries.length === 1 ? '' : 's'} (values are write-only and never shown)`);
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
exitError(formatError(err));
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
/** e3-cloud secrets rm <repoUrl> <NAME> */
|
|
70
|
+
async rm(url, name) {
|
|
71
|
+
try {
|
|
72
|
+
const { baseUrl, repo } = parseRepoUrl(url);
|
|
73
|
+
const token = await getValidToken(baseUrl);
|
|
74
|
+
await deleteSecret(baseUrl, repo, name, { token });
|
|
75
|
+
console.log(`Deleted secret ${name}`);
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
exitError(formatError(err));
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
//# sourceMappingURL=secrets.js.map
|