@martini-film/cli 0.1.0 → 0.2.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/README.md +41 -16
- package/dist/api.js +11 -14
- package/dist/api.js.map +1 -1
- package/dist/approve.js +83 -0
- package/dist/approve.js.map +1 -0
- package/dist/args.js +3 -7
- package/dist/args.js.map +1 -1
- package/dist/cli.js +124 -48
- package/dist/cli.js.map +1 -1
- package/dist/commands/assets.js +100 -27
- package/dist/commands/assets.js.map +1 -1
- package/dist/commands/context.js +42 -8
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/files.js +23 -15
- package/dist/commands/files.js.map +1 -1
- package/dist/commands/login.js +145 -27
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/tools.js +71 -10
- package/dist/commands/tools.js.map +1 -1
- package/dist/config.js +5 -19
- package/dist/config.js.map +1 -1
- package/dist/generated/manifest.json +10118 -792
- package/dist/help.js +188 -17
- package/dist/help.js.map +1 -1
- package/dist/host.js +0 -6
- package/dist/host.js.map +1 -1
- package/dist/manifest.js +4 -9
- package/dist/manifest.js.map +1 -1
- package/dist/output.js +107 -19
- package/dist/output.js.map +1 -1
- package/dist/schema.js +70 -29
- package/dist/schema.js.map +1 -1
- package/dist/wait.js +62 -23
- package/dist/wait.js.map +1 -1
- package/package.json +1 -1
package/dist/commands/login.js
CHANGED
|
@@ -1,70 +1,177 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
1
2
|
import { hostname } from 'node:os';
|
|
3
|
+
import { dirname, join } from 'node:path';
|
|
2
4
|
import { CliApiError } from '../api.js';
|
|
3
5
|
import { flagBoolean, flagString } from '../args.js';
|
|
4
|
-
import { removeProfile, saveProfile } from '../config.js';
|
|
6
|
+
import { readJsonFile, removeProfile, saveProfile, userConfigPath } from '../config.js';
|
|
5
7
|
import { detectHostAgent } from '../host.js';
|
|
8
|
+
import { timeoutMs, wantsWait } from './context.js';
|
|
6
9
|
export function defaultDeviceLabel(env = process.env) {
|
|
7
10
|
const host = detectHostAgent(env);
|
|
8
11
|
return `${hostname()}${host ? ` (${host})` : ''}`;
|
|
9
12
|
}
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
export function pendingLoginPath(env = process.env) {
|
|
14
|
+
return join(dirname(userConfigPath(env)), 'login-pending.json');
|
|
15
|
+
}
|
|
16
|
+
function readPendingLogin(env, apiUrl, now) {
|
|
17
|
+
const pending = readJsonFile(pendingLoginPath(env));
|
|
18
|
+
if (!pending || pending.apiUrl !== apiUrl || typeof pending.pollToken !== 'string')
|
|
19
|
+
return null;
|
|
20
|
+
if (new Date(pending.expiresAt).getTime() <= now) {
|
|
21
|
+
clearPendingLogin(env);
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
return pending;
|
|
25
|
+
}
|
|
26
|
+
function writePendingLogin(env, pending) {
|
|
27
|
+
const path = pendingLoginPath(env);
|
|
28
|
+
mkdirSync(dirname(path), { recursive: true, mode: 0o700 });
|
|
29
|
+
writeFileSync(path, JSON.stringify(pending, null, 2) + '\n', { mode: 0o600 });
|
|
30
|
+
}
|
|
31
|
+
function clearPendingLogin(env) {
|
|
32
|
+
const path = pendingLoginPath(env);
|
|
33
|
+
if (existsSync(path))
|
|
34
|
+
unlinkSync(path);
|
|
35
|
+
}
|
|
36
|
+
export function profileNameFor(organizationName, organizationId, existing) {
|
|
37
|
+
const slug = (organizationName ?? '')
|
|
38
|
+
.toLowerCase()
|
|
39
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
40
|
+
.replace(/^-+|-+$/g, '');
|
|
41
|
+
if (!slug)
|
|
42
|
+
return organizationId;
|
|
43
|
+
const taken = existing?.profiles?.[slug];
|
|
44
|
+
if (taken?.organizationId && taken.organizationId !== organizationId)
|
|
45
|
+
return `${slug}-${organizationId.slice(0, 8)}`;
|
|
46
|
+
return slug;
|
|
47
|
+
}
|
|
15
48
|
export const login = {
|
|
16
49
|
name: 'login',
|
|
17
50
|
summary: 'Sign in: pair this device through the browser and save a 90-day key',
|
|
18
|
-
usage: 'martini login [--device <label>] [--profile <name>] [--no-default]',
|
|
51
|
+
usage: 'martini login [--device <label>] [--profile <name>] [--no-default] [--no-wait] [--timeout <seconds>]',
|
|
52
|
+
details: 'Prints a URL and a code. Open the URL, enter the code, pick the organization, approve; the CLI collects the key and saves it as a profile named after the organization (the first profile becomes the default). The pairing is remembered until it expires (10 minutes), so running martini login again resumes it instead of starting over — after --no-wait, a --timeout, or a shell step that was killed while the person was still approving. An agent therefore runs martini login --no-wait, tells the person the code, and runs martini login again once they have approved.',
|
|
53
|
+
flags: [
|
|
54
|
+
{
|
|
55
|
+
flag: 'device',
|
|
56
|
+
kind: 'string',
|
|
57
|
+
value: '<label>',
|
|
58
|
+
description: 'How this device is listed under Settings → Martini API (default: the hostname, plus the host agent when known)',
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
flag: 'profile',
|
|
62
|
+
kind: 'string',
|
|
63
|
+
value: '<name>',
|
|
64
|
+
description: "Save the key under this name instead of the organization's",
|
|
65
|
+
},
|
|
66
|
+
{ flag: 'default', kind: 'boolean', description: '--no-default keeps the current default profile' },
|
|
67
|
+
],
|
|
68
|
+
examples: [
|
|
69
|
+
'martini login',
|
|
70
|
+
'martini login --no-wait # print the code and return; run martini login again after approval',
|
|
71
|
+
'martini login --profile studio --no-default',
|
|
72
|
+
],
|
|
19
73
|
async run(context) {
|
|
20
|
-
const
|
|
21
|
-
const
|
|
74
|
+
const env = context.env;
|
|
75
|
+
const apiUrl = context.config.apiUrl;
|
|
22
76
|
const stderr = context.output.stderr ?? (text => process.stderr.write(text));
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
77
|
+
let pending = readPendingLogin(env, apiUrl, context.now());
|
|
78
|
+
if (pending) {
|
|
79
|
+
stderr([
|
|
80
|
+
'',
|
|
81
|
+
` Resuming the pairing started ${pending.startedAt}:`,
|
|
82
|
+
` open ${pending.verificationUrl}`,
|
|
83
|
+
` and enter the code ${pending.code}`,
|
|
84
|
+
'',
|
|
85
|
+
].join('\n'));
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
const deviceLabel = flagString(context.flags, 'device') ?? defaultDeviceLabel(env);
|
|
89
|
+
const started = await context.client.startLogin(deviceLabel);
|
|
90
|
+
pending = {
|
|
91
|
+
apiUrl,
|
|
92
|
+
code: started.code,
|
|
93
|
+
pollToken: started.pollToken,
|
|
94
|
+
verificationUrl: started.verificationUrl,
|
|
95
|
+
expiresAt: started.expiresAt,
|
|
96
|
+
intervalSec: started.interval,
|
|
97
|
+
deviceLabel,
|
|
98
|
+
startedAt: new Date(context.now()).toISOString(),
|
|
99
|
+
};
|
|
100
|
+
writePendingLogin(env, pending);
|
|
101
|
+
stderr(['', ` Open ${started.verificationUrl}`, ` and enter the code ${started.code}`, ''].join('\n'));
|
|
102
|
+
}
|
|
103
|
+
if (!wantsWait(context, true)) {
|
|
104
|
+
return {
|
|
105
|
+
status: 'pending',
|
|
106
|
+
code: pending.code,
|
|
107
|
+
verificationUrl: pending.verificationUrl,
|
|
108
|
+
expiresAt: pending.expiresAt,
|
|
109
|
+
next: 'Approve the code in the browser, then run martini login again to collect the key.',
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
stderr(` Waiting for approval (until ${pending.expiresAt}; if this is interrupted, martini login resumes it)…\n\n`);
|
|
113
|
+
const expiry = new Date(pending.expiresAt).getTime();
|
|
114
|
+
const budget = flagString(context.flags, 'timeout') === undefined ? Infinity : context.now() + timeoutMs(context);
|
|
115
|
+
const intervalMs = Math.max(1000, (pending.intervalSec || 3) * 1000);
|
|
32
116
|
for (;;) {
|
|
33
|
-
|
|
34
|
-
|
|
117
|
+
if (context.now() >= budget) {
|
|
118
|
+
throw new CliApiError('Still waiting for the login to be approved in the browser.', {
|
|
119
|
+
code: 'LOGIN_PENDING',
|
|
120
|
+
status: 0,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
await context.sleep(intervalMs);
|
|
124
|
+
const polled = await context.client.pollLogin(pending.pollToken);
|
|
35
125
|
if (polled.status === 'pending') {
|
|
36
|
-
if (context.now() >
|
|
126
|
+
if (context.now() > expiry) {
|
|
127
|
+
clearPendingLogin(env);
|
|
37
128
|
throw new CliApiError('The login request expired before it was approved.', {
|
|
38
129
|
code: 'LOGIN_EXPIRED',
|
|
39
130
|
status: 0,
|
|
40
131
|
});
|
|
132
|
+
}
|
|
41
133
|
continue;
|
|
42
134
|
}
|
|
43
|
-
if (polled.status === 'denied')
|
|
135
|
+
if (polled.status === 'denied') {
|
|
136
|
+
clearPendingLogin(env);
|
|
44
137
|
throw new CliApiError('The login was denied in the browser.', { code: 'LOGIN_DENIED', status: 0 });
|
|
45
|
-
|
|
138
|
+
}
|
|
139
|
+
if (polled.status === 'expired') {
|
|
140
|
+
clearPendingLogin(env);
|
|
46
141
|
throw new CliApiError('The login request expired. Run martini login again.', {
|
|
47
142
|
code: 'LOGIN_EXPIRED',
|
|
48
143
|
status: 0,
|
|
49
144
|
});
|
|
50
|
-
|
|
145
|
+
}
|
|
146
|
+
if (polled.status === 'claimed') {
|
|
147
|
+
clearPendingLogin(env);
|
|
51
148
|
throw new CliApiError('This login was already collected elsewhere. Run martini login again.', {
|
|
52
149
|
code: 'LOGIN_CLAIMED',
|
|
53
150
|
status: 0,
|
|
54
151
|
});
|
|
152
|
+
}
|
|
55
153
|
if (polled.status !== 'approved')
|
|
56
154
|
continue;
|
|
57
|
-
const
|
|
155
|
+
const me = await context
|
|
156
|
+
.clientFor({ ...context.config, apiKey: polled.key })
|
|
157
|
+
.me()
|
|
158
|
+
.catch(() => null);
|
|
159
|
+
const organizationName = me?.organization.name ?? null;
|
|
160
|
+
const profileName = flagString(context.flags, 'profile') ??
|
|
161
|
+
profileNameFor(organizationName, polled.organizationId, readJsonFile(userConfigPath(env)));
|
|
58
162
|
const path = saveProfile(profileName, {
|
|
59
163
|
apiKey: polled.key,
|
|
60
|
-
apiUrl
|
|
164
|
+
apiUrl,
|
|
61
165
|
organizationId: polled.organizationId,
|
|
166
|
+
...(organizationName ? { organizationName } : {}),
|
|
62
167
|
...(polled.expiresAt ? { expiresAt: polled.expiresAt } : {}),
|
|
63
|
-
}, { env
|
|
168
|
+
}, { env, makeDefault: flagBoolean(context.flags, 'default') ?? true });
|
|
169
|
+
clearPendingLogin(env);
|
|
64
170
|
return {
|
|
65
171
|
ok: true,
|
|
66
172
|
profile: profileName,
|
|
67
173
|
organizationId: polled.organizationId,
|
|
174
|
+
organizationName,
|
|
68
175
|
keyId: polled.keyId,
|
|
69
176
|
expiresAt: polled.expiresAt,
|
|
70
177
|
savedTo: path,
|
|
@@ -76,6 +183,14 @@ export const logout = {
|
|
|
76
183
|
name: 'logout',
|
|
77
184
|
summary: 'Forget a saved profile (the key itself is revoked from Settings → Martini API)',
|
|
78
185
|
usage: 'martini logout [--profile <name>]',
|
|
186
|
+
flags: [
|
|
187
|
+
{
|
|
188
|
+
flag: 'profile',
|
|
189
|
+
kind: 'string',
|
|
190
|
+
value: '<name>',
|
|
191
|
+
description: 'The profile to forget (default: the active one)',
|
|
192
|
+
},
|
|
193
|
+
],
|
|
79
194
|
async run(context) {
|
|
80
195
|
const name = flagString(context.flags, 'profile');
|
|
81
196
|
if (!name) {
|
|
@@ -92,6 +207,7 @@ export const whoami = {
|
|
|
92
207
|
name: 'whoami',
|
|
93
208
|
summary: 'Which organization and key this CLI acts as, and where the config came from',
|
|
94
209
|
usage: 'martini whoami',
|
|
210
|
+
details: 'Result: { organization, key, apiVersion, apiUrl, projectId, canvasId, runId, configSource }.',
|
|
95
211
|
async run(context) {
|
|
96
212
|
const me = await context.client.me();
|
|
97
213
|
return {
|
|
@@ -102,6 +218,8 @@ export const whoami = {
|
|
|
102
218
|
projectId: context.config.projectId ?? null,
|
|
103
219
|
canvasId: context.config.canvasId ?? null,
|
|
104
220
|
runId: context.config.runId ?? null,
|
|
221
|
+
executionId: context.config.executionId ?? null,
|
|
222
|
+
workerId: context.config.workerId ?? null,
|
|
105
223
|
configSource: context.config.source,
|
|
106
224
|
};
|
|
107
225
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAC1E,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEzC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AACpD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAuB,MAAM,cAAc,CAAA;AAC5G,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAE,SAAS,EAA6C,MAAM,cAAc,CAAA;AAE9F,MAAM,UAAU,kBAAkB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACrE,MAAM,IAAI,GAAG,eAAe,CAAC,GAAG,CAAC,CAAA;IACjC,OAAO,GAAG,QAAQ,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAA;AACnD,CAAC;AAmBD,MAAM,UAAU,gBAAgB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACnE,OAAO,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAA;AACjE,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAsB,EAAE,MAAc,EAAE,GAAW;IAC3E,MAAM,OAAO,GAAG,YAAY,CAAe,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAA;IACjE,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,IAAI,OAAO,OAAO,CAAC,SAAS,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAA;IAC/F,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,IAAI,GAAG,EAAE,CAAC;QACjD,iBAAiB,CAAC,GAAG,CAAC,CAAA;QACtB,OAAO,IAAI,CAAA;IACb,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAsB,EAAE,OAAqB;IACtE,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAA;IAClC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;IAC1D,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;AAC/E,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAsB;IAC/C,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAA;IAClC,IAAI,UAAU,CAAC,IAAI,CAAC;QAAE,UAAU,CAAC,IAAI,CAAC,CAAA;AACxC,CAAC;AAGD,MAAM,UAAU,cAAc,CAC5B,gBAA2C,EAC3C,cAAsB,EACtB,QAA+B;IAE/B,MAAM,IAAI,GAAG,CAAC,gBAAgB,IAAI,EAAE,CAAC;SAClC,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAA;IAC1B,IAAI,CAAC,IAAI;QAAE,OAAO,cAAc,CAAA;IAChC,MAAM,KAAK,GAAG,QAAQ,EAAE,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAA;IACxC,IAAI,KAAK,EAAE,cAAc,IAAI,KAAK,CAAC,cAAc,KAAK,cAAc;QAAE,OAAO,GAAG,IAAI,IAAI,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAA;IACpH,OAAO,IAAI,CAAA;AACb,CAAC;AAOD,MAAM,CAAC,MAAM,KAAK,GAAoB;IACpC,IAAI,EAAE,OAAO;IACb,OAAO,EAAE,qEAAqE;IAC9E,KAAK,EAAE,sGAAsG;IAC7G,OAAO,EACL,qjBAAqjB;IACvjB,KAAK,EAAE;QACL;YACE,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,SAAS;YAChB,WAAW,EACT,gHAAgH;SACnH;QACD;YACE,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,QAAQ;YACf,WAAW,EAAE,4DAA4D;SAC1E;QACD,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,gDAAgD,EAAE;KACpG;IACD,QAAQ,EAAE;QACR,eAAe;QACf,kGAAkG;QAClG,6CAA6C;KAC9C;IACD,KAAK,CAAC,GAAG,CAAC,OAAuB;QAC/B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAA;QACvB,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAA;QACpC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;QAE5E,IAAI,OAAO,GAAG,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;QAC1D,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,CACJ;gBACE,EAAE;gBACF,kCAAkC,OAAO,CAAC,SAAS,GAAG;gBACtD,UAAU,OAAO,CAAC,eAAe,EAAE;gBACnC,yBAAyB,OAAO,CAAC,IAAI,EAAE;gBACvC,EAAE;aACH,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAA;QACH,CAAC;aAAM,CAAC;YACN,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,kBAAkB,CAAC,GAAG,CAAC,CAAA;YAClF,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAA;YAC5D,OAAO,GAAG;gBACR,MAAM;gBACN,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,eAAe,EAAE,OAAO,CAAC,eAAe;gBACxC,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,WAAW,EAAE,OAAO,CAAC,QAAQ;gBAC7B,WAAW;gBACX,SAAS,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,WAAW,EAAE;aACjD,CAAA;YACD,iBAAiB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;YAC/B,MAAM,CAAC,CAAC,EAAE,EAAE,UAAU,OAAO,CAAC,eAAe,EAAE,EAAE,yBAAyB,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QAC3G,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC;YAC9B,OAAO;gBACL,MAAM,EAAE,SAAS;gBACjB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,eAAe,EAAE,OAAO,CAAC,eAAe;gBACxC,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,IAAI,EAAE,mFAAmF;aAC1F,CAAA;QACH,CAAC;QAED,MAAM,CAAC,iCAAiC,OAAO,CAAC,SAAS,0DAA0D,CAAC,CAAA;QACpH,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAA;QACpD,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,CAAA;QACjH,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;QACpE,SAAS,CAAC;YACR,IAAI,OAAO,CAAC,GAAG,EAAE,IAAI,MAAM,EAAE,CAAC;gBAC5B,MAAM,IAAI,WAAW,CAAC,4DAA4D,EAAE;oBAClF,IAAI,EAAE,eAAe;oBACrB,MAAM,EAAE,CAAC;iBACV,CAAC,CAAA;YACJ,CAAC;YACD,MAAM,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;YAC/B,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;YAChE,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAChC,IAAI,OAAO,CAAC,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;oBAC3B,iBAAiB,CAAC,GAAG,CAAC,CAAA;oBACtB,MAAM,IAAI,WAAW,CAAC,mDAAmD,EAAE;wBACzE,IAAI,EAAE,eAAe;wBACrB,MAAM,EAAE,CAAC;qBACV,CAAC,CAAA;gBACJ,CAAC;gBACD,SAAQ;YACV,CAAC;YACD,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC/B,iBAAiB,CAAC,GAAG,CAAC,CAAA;gBACtB,MAAM,IAAI,WAAW,CAAC,sCAAsC,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAA;YACpG,CAAC;YACD,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAChC,iBAAiB,CAAC,GAAG,CAAC,CAAA;gBACtB,MAAM,IAAI,WAAW,CAAC,qDAAqD,EAAE;oBAC3E,IAAI,EAAE,eAAe;oBACrB,MAAM,EAAE,CAAC;iBACV,CAAC,CAAA;YACJ,CAAC;YACD,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAChC,iBAAiB,CAAC,GAAG,CAAC,CAAA;gBACtB,MAAM,IAAI,WAAW,CAAC,sEAAsE,EAAE;oBAC5F,IAAI,EAAE,eAAe;oBACrB,MAAM,EAAE,CAAC;iBACV,CAAC,CAAA;YACJ,CAAC;YACD,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU;gBAAE,SAAQ;YAG1C,MAAM,EAAE,GAAG,MAAM,OAAO;iBACrB,SAAS,CAAC,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC;iBACpD,EAAE,EAAE;iBACJ,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;YACpB,MAAM,gBAAgB,GAAG,EAAE,EAAE,YAAY,CAAC,IAAI,IAAI,IAAI,CAAA;YACtD,MAAM,WAAW,GACf,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC;gBACpC,cAAc,CAAC,gBAAgB,EAAE,MAAM,CAAC,cAAc,EAAE,YAAY,CAAiB,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;YAC5G,MAAM,IAAI,GAAG,WAAW,CACtB,WAAW,EACX;gBACE,MAAM,EAAE,MAAM,CAAC,GAAG;gBAClB,MAAM;gBACN,cAAc,EAAE,MAAM,CAAC,cAAc;gBACrC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjD,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC7D,EACD,EAAE,GAAG,EAAE,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,IAAI,EAAE,CACpE,CAAA;YAED,iBAAiB,CAAC,GAAG,CAAC,CAAA;YACtB,OAAO;gBACL,EAAE,EAAE,IAAI;gBACR,OAAO,EAAE,WAAW;gBACpB,cAAc,EAAE,MAAM,CAAC,cAAc;gBACrC,gBAAgB;gBAChB,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,OAAO,EAAE,IAAI;aACd,CAAA;QACH,CAAC;IACH,CAAC;CACF,CAAA;AAED,MAAM,CAAC,MAAM,MAAM,GAAoB;IACrC,IAAI,EAAE,QAAQ;IACd,OAAO,EAAE,gFAAgF;IACzF,KAAK,EAAE,mCAAmC;IAC1C,KAAK,EAAE;QACL;YACE,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,QAAQ;YACf,WAAW,EAAE,iDAAiD;SAC/D;KACF;IACD,KAAK,CAAC,GAAG,CAAC,OAAuB;QAC/B,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA;QACjD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAA;YACpC,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YAC9C,IAAI,CAAC,KAAK;gBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,8CAA8C,EAAE,CAAA;YACzF,OAAO,EAAE,EAAE,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;QAClF,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,aAAa,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;IACzE,CAAC;CACF,CAAA;AAED,MAAM,CAAC,MAAM,MAAM,GAAoB;IACrC,IAAI,EAAE,QAAQ;IACd,OAAO,EAAE,6EAA6E;IACtF,KAAK,EAAE,gBAAgB;IACvB,OAAO,EAAE,8FAA8F;IACvG,KAAK,CAAC,GAAG,CAAC,OAAuB;QAC/B,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,CAAA;QACpC,OAAO;YACL,YAAY,EAAE,EAAE,CAAC,YAAY;YAC7B,GAAG,EAAE,EAAE,CAAC,GAAG;YACX,UAAU,EAAE,EAAE,CAAC,UAAU;YACzB,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM;YAC7B,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,IAAI,IAAI;YAC3C,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,IAAI,IAAI;YACzC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI;YACnC,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,IAAI,IAAI;YAC/C,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,IAAI,IAAI;YACzC,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM;SACpC,CAAA;IACH,CAAC;CACF,CAAA"}
|
package/dist/commands/tools.js
CHANGED
|
@@ -6,14 +6,23 @@ import { join } from 'node:path';
|
|
|
6
6
|
import { CLI_VERSION, CliApiError } from '../api.js';
|
|
7
7
|
import { flagBoolean, flagString } from '../args.js';
|
|
8
8
|
import { userConfigPath } from '../config.js';
|
|
9
|
+
import { SUPERSEDED_BY_COMPOUND } from '../help.js';
|
|
9
10
|
import { loadManifest } from '../manifest.js';
|
|
10
11
|
import { ArgumentError } from '../schema.js';
|
|
11
12
|
import { requireProject } from './context.js';
|
|
12
|
-
/** `martini tools`: the manifest this build carries, and whether the server's differs. */
|
|
13
13
|
export const tools = {
|
|
14
14
|
name: 'tools',
|
|
15
15
|
summary: 'List the tools this build knows (and warn when the server has a newer manifest)',
|
|
16
|
-
usage: 'martini tools [--remote] [--fields name,description]',
|
|
16
|
+
usage: 'martini tools [--remote] [--fields tools.name,tools.description]',
|
|
17
|
+
details: 'Result: { hash, serverHash, upToDate, tools: [{ name, description, readOnly, requiresActions, supersededBy? }] }. supersededBy names the compound command to prefer (upload, download). upToDate false means the server has tools or arguments this build does not know: pass such arguments with --json, or update with npx @martini-film/cli@latest.',
|
|
18
|
+
flags: [
|
|
19
|
+
{
|
|
20
|
+
flag: 'remote',
|
|
21
|
+
kind: 'boolean',
|
|
22
|
+
description: "Print the server's manifest (full JSON Schemas) instead of this build's list",
|
|
23
|
+
},
|
|
24
|
+
],
|
|
25
|
+
examples: ['martini tools --fields upToDate,tools.name'],
|
|
17
26
|
async run(context) {
|
|
18
27
|
const local = loadManifest();
|
|
19
28
|
if (flagBoolean(context.flags, 'remote'))
|
|
@@ -34,16 +43,40 @@ export const tools = {
|
|
|
34
43
|
description: tool.description,
|
|
35
44
|
readOnly: tool.annotations.readOnlyHint,
|
|
36
45
|
requiresActions: tool.requiresActions,
|
|
46
|
+
...(SUPERSEDED_BY_COMPOUND[tool.name] ? { supersededBy: SUPERSEDED_BY_COMPOUND[tool.name] } : {}),
|
|
37
47
|
})),
|
|
38
48
|
};
|
|
39
49
|
},
|
|
40
50
|
};
|
|
41
51
|
const MODELS_CACHE_TTL_MS = 60 * 60 * 1000;
|
|
42
|
-
/** `martini models`: get_models with a one-hour local cache — the catalog is ~10 KB and was fetched in 153 of 194 runs. */
|
|
43
52
|
export const models = {
|
|
44
53
|
name: 'models',
|
|
45
54
|
summary: 'The model catalog (cached for an hour; --refresh to refetch; --query/--capability to narrow)',
|
|
46
55
|
usage: 'martini models [--query <text>] [--capability <name>] [--detail summary|full] [--refresh]',
|
|
56
|
+
details: 'get_models with a one-hour local cache per argument set (the catalog is ~10 KB and rarely changes).',
|
|
57
|
+
flags: [
|
|
58
|
+
{
|
|
59
|
+
flag: 'query',
|
|
60
|
+
kind: 'string',
|
|
61
|
+
value: '<text>',
|
|
62
|
+
description: 'Narrow by a natural-language model or provider name',
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
flag: 'capability',
|
|
66
|
+
kind: 'string',
|
|
67
|
+
value: '<name>',
|
|
68
|
+
description: 'Narrow to one capability (generate-video, generate-still, generate-audio, …)',
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
flag: 'detail',
|
|
72
|
+
kind: 'string',
|
|
73
|
+
value: 'summary|full',
|
|
74
|
+
enum: ['summary', 'full'],
|
|
75
|
+
description: 'How much of each model to print',
|
|
76
|
+
},
|
|
77
|
+
{ flag: 'refresh', kind: 'boolean', description: 'Ignore the cache and refetch' },
|
|
78
|
+
],
|
|
79
|
+
examples: ['martini models --capability generate-video --fields models.id,models.name'],
|
|
47
80
|
async run(context) {
|
|
48
81
|
const args = {};
|
|
49
82
|
const query = flagString(context.flags, 'query');
|
|
@@ -64,7 +97,6 @@ export const models = {
|
|
|
64
97
|
return cached.result;
|
|
65
98
|
}
|
|
66
99
|
catch {
|
|
67
|
-
// A corrupt cache is just a miss.
|
|
68
100
|
}
|
|
69
101
|
}
|
|
70
102
|
const result = await context.client.callTool('get_models', args);
|
|
@@ -73,11 +105,16 @@ export const models = {
|
|
|
73
105
|
return result;
|
|
74
106
|
},
|
|
75
107
|
};
|
|
76
|
-
/** Run ffprobe on one local file and reduce its JSON to what a session usually wants. */
|
|
77
108
|
export function probeFile(path, run = spawnSync) {
|
|
78
109
|
const probe = run('ffprobe', ['-v', 'quiet', '-print_format', 'json', '-show_format', '-show_streams', path], {
|
|
79
110
|
encoding: 'utf8',
|
|
80
111
|
});
|
|
112
|
+
if (probe.error?.code === 'ENOENT') {
|
|
113
|
+
throw new CliApiError('ffprobe is not installed or not on PATH; martini probe needs it.', {
|
|
114
|
+
code: 'FFPROBE_MISSING',
|
|
115
|
+
status: 0,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
81
118
|
if (probe.error || probe.status !== 0) {
|
|
82
119
|
throw new CliApiError(`ffprobe failed for ${path}${probe.stderr ? `: ${String(probe.stderr).trim()}` : ''}`, {
|
|
83
120
|
code: 'PROBE_FAILED',
|
|
@@ -109,14 +146,28 @@ export function probeFile(path, run = spawnSync) {
|
|
|
109
146
|
sha256: createHash('sha256').update(bytes).digest('hex'),
|
|
110
147
|
};
|
|
111
148
|
}
|
|
112
|
-
/**
|
|
113
|
-
* `martini probe <path|asset-id>…`: the measurement loop (download, ffprobe,
|
|
114
|
-
* checksum) in one command, so a session stops re-deriving it in shell steps.
|
|
115
|
-
*/
|
|
116
149
|
export const probe = {
|
|
117
150
|
name: 'probe',
|
|
118
151
|
summary: 'Measure local files or assets: duration, resolution, fps, codecs, channels, sha256 (needs ffprobe)',
|
|
119
152
|
usage: 'martini probe <path|asset-id>… [--dir <download-dir>]',
|
|
153
|
+
details: 'Result: { reports: [{ path, assetId?, bytes, durationSec, width, height, fps, videoCodec, audioCodec, audioChannels, sampleRate, sha256 }] }. An argument that is not an existing file is treated as an asset id and downloaded first (needs a project).',
|
|
154
|
+
positionals: [
|
|
155
|
+
{
|
|
156
|
+
name: 'path|asset-id',
|
|
157
|
+
description: 'Local files, or asset ids to download and measure',
|
|
158
|
+
variadic: true,
|
|
159
|
+
required: true,
|
|
160
|
+
},
|
|
161
|
+
],
|
|
162
|
+
flags: [
|
|
163
|
+
{
|
|
164
|
+
flag: 'dir',
|
|
165
|
+
kind: 'string',
|
|
166
|
+
value: '<download-dir>',
|
|
167
|
+
description: 'Where downloaded assets are kept (default: martini-probe under the temp dir)',
|
|
168
|
+
},
|
|
169
|
+
],
|
|
170
|
+
examples: ['martini probe ./take.mp4 <asset-id>'],
|
|
120
171
|
async run(context) {
|
|
121
172
|
if (context.positionals.length === 0)
|
|
122
173
|
throw new ArgumentError('Give file paths or asset ids to probe.');
|
|
@@ -151,14 +202,23 @@ Martini is available as the \`martini\` command (every MCP tool is a subcommand;
|
|
|
151
202
|
- \`martini <generation tool> … --wait\` blocks until the asset is ready; \`martini wait <ids…>\` resumes a wait.
|
|
152
203
|
- \`martini files pull dir/\` / \`martini files push dir/\` edit project memory files locally with conflict checks.
|
|
153
204
|
- Any argument can be JSON: \`--json @args.json\`. Results are JSON on stdout; \`--fields a,b\` trims them; \`--out f\` writes them.
|
|
205
|
+
- A wait stops at \`--timeout\` (default 50 s) with exit 4 but still prints the result and the pending ids; resume with \`martini wait <ids…> --timeout N\`, sized to your shell step.
|
|
206
|
+
- Tools that quote first (\`generate_nodes\`, \`upscale_assets\`, \`enhance_draft\`): \`--approve --max-olives N\` takes the quote and approves it under the cap in one command; over the cap nothing starts.
|
|
154
207
|
|
|
155
208
|
Exit codes: 0 ok · 1 tool error · 2 usage · 3 auth · 4 not ready or timed out · 5 insufficient olives.
|
|
156
209
|
`;
|
|
157
|
-
/** `martini init`: the AGENTS.md snippet that teaches a repo's agents to use the CLI. */
|
|
158
210
|
export const init = {
|
|
159
211
|
name: 'init',
|
|
160
212
|
summary: 'Print (or append to AGENTS.md with --write) the snippet that teaches agents to use the CLI',
|
|
161
213
|
usage: 'martini init [--write [path]]',
|
|
214
|
+
positionals: [{ name: 'path', description: 'With --write: the file to append to (default ./AGENTS.md)' }],
|
|
215
|
+
flags: [
|
|
216
|
+
{
|
|
217
|
+
flag: 'write',
|
|
218
|
+
kind: 'boolean',
|
|
219
|
+
description: 'Append the snippet to the file instead of printing it (skipped when already present)',
|
|
220
|
+
},
|
|
221
|
+
],
|
|
162
222
|
async run(context) {
|
|
163
223
|
if (flagBoolean(context.flags, 'write')) {
|
|
164
224
|
const target = context.positionals[0] ?? join(context.cwd, 'AGENTS.md');
|
|
@@ -175,6 +235,7 @@ export const version = {
|
|
|
175
235
|
name: 'version',
|
|
176
236
|
summary: 'The CLI version, the manifest hash it was built from, and the config file paths',
|
|
177
237
|
usage: 'martini version',
|
|
238
|
+
details: 'Result: { version, manifestHash, tools, userConfig }. martini --version prints the same.',
|
|
178
239
|
async run(context) {
|
|
179
240
|
const manifest = loadManifest();
|
|
180
241
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/commands/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAC5E,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AACpD,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,cAAc,EAA6C,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/commands/tools.ts"],"names":[],"mappings":"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"}
|
package/dist/config.js
CHANGED
|
@@ -1,17 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Where the CLI's credential and context come from, most specific first:
|
|
3
|
-
*
|
|
4
|
-
* 1. flags --api-key, --api-url, --project, --canvas, --run, --profile
|
|
5
|
-
* 2. environment MARTINI_API_KEY, MARTINI_API_URL, MARTINI_PROJECT_ID, MARTINI_CANVAS_ID,
|
|
6
|
-
* MARTINI_RUN_ID, MARTINI_PROFILE, MARTINI_CONFIG_FILE
|
|
7
|
-
* 3. the nearest .martini/config.json above the working directory — what the workflow
|
|
8
|
-
* workspace file harness writes into a run's sandbox (a `run` profile)
|
|
9
|
-
* 4. the user file ~/.config/martini/config.json — profiles `martini login` saves, one per
|
|
10
|
-
* organization, with a default
|
|
11
|
-
*
|
|
12
|
-
* A run's sandbox therefore needs nothing but its working directory; a laptop
|
|
13
|
-
* needs one `martini login`; a script sets two environment variables.
|
|
14
|
-
*/
|
|
15
1
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
16
2
|
import { homedir } from 'node:os';
|
|
17
3
|
import { dirname, join, resolve } from 'node:path';
|
|
@@ -35,7 +21,6 @@ export function readJsonFile(path) {
|
|
|
35
21
|
return null;
|
|
36
22
|
}
|
|
37
23
|
}
|
|
38
|
-
/** The closest `.martini/config.json` at or above `cwd`. */
|
|
39
24
|
export function findWorkspaceConfig(cwd) {
|
|
40
25
|
let dir = resolve(cwd);
|
|
41
26
|
for (;;) {
|
|
@@ -56,9 +41,9 @@ export function resolveConfig(flags, options = {}) {
|
|
|
56
41
|
const fromFlags = defined({
|
|
57
42
|
apiKey: flagString(flags, 'api-key'),
|
|
58
43
|
apiUrl: flagString(flags, 'api-url'),
|
|
59
|
-
projectId: flagString(flags, 'project'),
|
|
60
|
-
canvasId: flagString(flags, 'canvas'),
|
|
61
|
-
runId: flagString(flags, 'run'),
|
|
44
|
+
projectId: flagString(flags, 'project') ?? flagString(flags, 'project-id'),
|
|
45
|
+
canvasId: flagString(flags, 'canvas') ?? flagString(flags, 'canvas-id'),
|
|
46
|
+
runId: flagString(flags, 'run') ?? flagString(flags, 'run-id'),
|
|
62
47
|
});
|
|
63
48
|
const fromEnv = defined({
|
|
64
49
|
apiKey: env.MARTINI_API_KEY,
|
|
@@ -94,10 +79,11 @@ export function resolveConfig(flags, options = {}) {
|
|
|
94
79
|
projectId: merged.projectId,
|
|
95
80
|
canvasId: merged.canvasId,
|
|
96
81
|
runId: merged.runId,
|
|
82
|
+
executionId: merged.executionId,
|
|
83
|
+
workerId: merged.workerId,
|
|
97
84
|
source,
|
|
98
85
|
};
|
|
99
86
|
}
|
|
100
|
-
/** Save a profile from `martini login`; the first saved profile becomes the default. */
|
|
101
87
|
export function saveProfile(name, profile, options = {}) {
|
|
102
88
|
const path = userConfigPath(options.env ?? process.env);
|
|
103
89
|
const current = readJsonFile(path) ?? {};
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|