@martini-film/cli 0.2.0 → 0.3.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 +13 -17
- package/dist/api.js +28 -1
- package/dist/api.js.map +1 -1
- package/dist/args.js +31 -6
- package/dist/args.js.map +1 -1
- package/dist/cli.js +86 -24
- package/dist/cli.js.map +1 -1
- package/dist/commands/assets.js +160 -24
- package/dist/commands/assets.js.map +1 -1
- package/dist/commands/context.js +2 -2
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/files.js +113 -81
- package/dist/commands/files.js.map +1 -1
- package/dist/commands/login.js +34 -11
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/tools.js +2 -2
- package/dist/commands/tools.js.map +1 -1
- package/dist/config.js +5 -0
- package/dist/config.js.map +1 -1
- package/dist/generated/manifest.json +3876 -240
- package/dist/help.js +18 -4
- package/dist/help.js.map +1 -1
- package/dist/manifest.js +7 -3
- package/dist/manifest.js.map +1 -1
- package/dist/output.js +43 -2
- package/dist/output.js.map +1 -1
- package/dist/schema.js +34 -2
- package/dist/schema.js.map +1 -1
- package/dist/wait.js +150 -7
- package/dist/wait.js.map +1 -1
- package/package.json +1 -1
package/dist/commands/assets.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { mkdirSync, readFileSync, statSync, writeFileSync } from 'node:fs';
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, statSync, writeFileSync } from 'node:fs';
|
|
2
2
|
import { basename, extname, join } from 'node:path';
|
|
3
3
|
import { CliApiError } from '../api.js';
|
|
4
|
-
import { flagString } from '../args.js';
|
|
4
|
+
import { flagBoolean, flagString } from '../args.js';
|
|
5
|
+
import { findTool } from '../manifest.js';
|
|
5
6
|
import { ArgumentError } from '../schema.js';
|
|
6
7
|
import { assetsOutcome, handleOutcome, waitForAssets, waitForDelivery, waitForJob, waitForRun, WaitTimeoutError, } from '../wait.js';
|
|
7
8
|
import { contextFlag, requireCanvas, requireProject, timeoutMs, wantsWait, } from './context.js';
|
|
@@ -11,19 +12,36 @@ const CONTENT_TYPES = {
|
|
|
11
12
|
'.jpeg': 'image/jpeg',
|
|
12
13
|
'.webp': 'image/webp',
|
|
13
14
|
'.mp4': 'video/mp4',
|
|
15
|
+
'.m4v': 'video/mp4',
|
|
14
16
|
'.mov': 'video/quicktime',
|
|
15
17
|
'.webm': 'video/webm',
|
|
16
18
|
'.mp3': 'audio/mpeg',
|
|
17
19
|
'.wav': 'audio/wav',
|
|
20
|
+
'.aac': 'audio/aac',
|
|
18
21
|
'.m4a': 'audio/mp4',
|
|
22
|
+
'.flac': 'audio/flac',
|
|
23
|
+
'.ogg': 'audio/ogg',
|
|
19
24
|
};
|
|
20
|
-
export function
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
export function acceptedUploadContentTypes(manifest) {
|
|
26
|
+
const values = findTool('upload_assets_prepare', manifest)?.inputSchema.properties?.files?.items?.properties
|
|
27
|
+
?.contentType?.enum;
|
|
28
|
+
return Array.isArray(values) ? values.filter((value) => typeof value === 'string') : undefined;
|
|
29
|
+
}
|
|
30
|
+
export function contentTypeFor(path, accepted, override) {
|
|
31
|
+
const isAccepted = (type) => !accepted || accepted.includes(type);
|
|
32
|
+
const refuse = (reason, next) => new ArgumentError(`Cannot upload ${path}: ${reason}.${accepted ? ` Accepted content types: ${accepted.join(', ')}.` : ''} ${next}`);
|
|
33
|
+
if (override) {
|
|
34
|
+
if (isAccepted(override))
|
|
35
|
+
return override;
|
|
36
|
+
throw refuse(`--content-type ${override} is not one upload accepts`, 'Pass one of them.');
|
|
37
|
+
}
|
|
38
|
+
const extension = extname(path).toLowerCase();
|
|
39
|
+
const type = CONTENT_TYPES[extension];
|
|
40
|
+
if (type && isAccepted(type))
|
|
41
|
+
return type;
|
|
42
|
+
if (type)
|
|
43
|
+
throw refuse(`${extension} files are ${type}, which upload does not accept`, 'Convert it to one of them.');
|
|
44
|
+
throw refuse(extension ? `the extension ${extension} does not name a content type` : 'it has no extension to infer a type from', 'Pass --content-type when the bytes are one of them.');
|
|
27
45
|
}
|
|
28
46
|
async function prepareUploads(context, args) {
|
|
29
47
|
for (let attempt = 0;; attempt += 1) {
|
|
@@ -39,9 +57,9 @@ async function prepareUploads(context, args) {
|
|
|
39
57
|
}
|
|
40
58
|
export const upload = {
|
|
41
59
|
name: 'upload',
|
|
42
|
-
summary: 'Upload local files as canvas assets
|
|
43
|
-
usage: 'martini upload <path…> [--canvas <id>] [--bin <id>] [--content-type <mime>] [--no-wait]',
|
|
44
|
-
details: 'Runs upload_assets_prepare, the PUT to storage, and upload_assets_complete from files on disk, then waits (on by default) until the assets are processed. Result: { projectId, canvasId, uploaded: [assetId…], failed: [{ filename, code, message }], completed, assets? }. When the wait times out the receipt is still printed, with the pending ids.',
|
|
60
|
+
summary: 'Upload local files as canvas assets, named after their basenames',
|
|
61
|
+
usage: 'martini upload <path…> [--canvas <id>] [--bin <id>] [--content-type <mime>] [--display-name <name> | --no-display-name] [--no-wait]',
|
|
62
|
+
details: 'Names files after their basenames without extensions (trimmed). Override one file with --display-name, or skip naming with --no-display-name. Runs upload_assets_prepare, the PUT to storage, and upload_assets_complete from files on disk, then waits (on by default) until the assets are processed. Result: { projectId, canvasId, uploaded: [assetId…], failed: [{ filename, code, message }], completed, named: [{ assetId, displayName }], namingError?, assets? }. When the wait times out the receipt is still printed, with the pending ids.',
|
|
45
63
|
positionals: [
|
|
46
64
|
{
|
|
47
65
|
name: 'path',
|
|
@@ -51,6 +69,13 @@ export const upload = {
|
|
|
51
69
|
},
|
|
52
70
|
],
|
|
53
71
|
flags: [
|
|
72
|
+
{ flag: 'no-display-name', kind: 'boolean', description: 'Skip naming uploaded assets' },
|
|
73
|
+
{
|
|
74
|
+
flag: 'display-name',
|
|
75
|
+
kind: 'string',
|
|
76
|
+
value: '<name>',
|
|
77
|
+
description: 'Override the basename for one file with a non-empty name',
|
|
78
|
+
},
|
|
54
79
|
{
|
|
55
80
|
flag: 'canvas',
|
|
56
81
|
kind: 'string',
|
|
@@ -67,6 +92,7 @@ export const upload = {
|
|
|
67
92
|
],
|
|
68
93
|
examples: [
|
|
69
94
|
'martini upload ./ref.png ./take.mp4 --canvas <canvas-id>',
|
|
95
|
+
'martini upload ./ref.png --display-name "Ref · Bugi turnaround"',
|
|
70
96
|
'martini upload out/*.mp4 --bin <bin-id> --no-wait',
|
|
71
97
|
],
|
|
72
98
|
async run(context) {
|
|
@@ -75,14 +101,28 @@ export const upload = {
|
|
|
75
101
|
throw new ArgumentError('Give at least one file path to upload.');
|
|
76
102
|
if (paths.length > 50)
|
|
77
103
|
throw new ArgumentError('At most 50 files per upload.');
|
|
104
|
+
const displayNameOverride = flagString(context.flags, 'display-name');
|
|
105
|
+
const skipNaming = flagBoolean(context.flags, 'no-display-name') ?? false;
|
|
106
|
+
if (skipNaming && context.flags.has('display-name'))
|
|
107
|
+
throw new ArgumentError('--display-name and --no-display-name are alternatives; pass one of them.');
|
|
108
|
+
if (context.flags.has('display-name') && displayNameOverride === undefined)
|
|
109
|
+
throw new ArgumentError('--display-name requires a value.');
|
|
110
|
+
if (displayNameOverride !== undefined && !displayNameOverride.trim())
|
|
111
|
+
throw new ArgumentError('--display-name must not be empty.');
|
|
112
|
+
if (context.flags.has('display-name') && paths.length !== 1)
|
|
113
|
+
throw new ArgumentError('--display-name requires exactly one file.');
|
|
78
114
|
const projectId = requireProject(context);
|
|
79
115
|
const canvasId = requireCanvas(context);
|
|
80
116
|
const binId = flagString(context.flags, 'bin');
|
|
81
117
|
const contentTypeOverride = flagString(context.flags, 'content-type');
|
|
82
|
-
const
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
118
|
+
const accepted = acceptedUploadContentTypes(context.manifest);
|
|
119
|
+
const contentTypes = paths.map(path => contentTypeFor(path, accepted, contentTypeOverride));
|
|
120
|
+
const files = paths.map((path, index) => ({
|
|
121
|
+
path,
|
|
122
|
+
filename: basename(path),
|
|
123
|
+
contentType: contentTypes[index],
|
|
124
|
+
sizeBytes: statSync(path).size,
|
|
125
|
+
}));
|
|
86
126
|
const prepared = await prepareUploads(context, {
|
|
87
127
|
projectId,
|
|
88
128
|
canvasId,
|
|
@@ -90,6 +130,7 @@ export const upload = {
|
|
|
90
130
|
files: files.map(({ filename, contentType, sizeBytes }) => ({ filename, contentType, sizeBytes })),
|
|
91
131
|
});
|
|
92
132
|
const uploaded = [];
|
|
133
|
+
const displayNames = [];
|
|
93
134
|
const failed = [];
|
|
94
135
|
for (const result of prepared.results) {
|
|
95
136
|
const file = files[result.index];
|
|
@@ -113,12 +154,36 @@ export const upload = {
|
|
|
113
154
|
}
|
|
114
155
|
await context.client.putBytes(result.uploadUrl, readFileSync(file.path), result.uploadHeaders);
|
|
115
156
|
uploaded.push(result.assetId);
|
|
157
|
+
if (!skipNaming) {
|
|
158
|
+
const displayName = (displayNameOverride ?? basename(file.path, extname(file.path))).trim();
|
|
159
|
+
if (displayName)
|
|
160
|
+
displayNames.push({ assetId: result.assetId, displayName });
|
|
161
|
+
}
|
|
116
162
|
}
|
|
117
163
|
let completed = null;
|
|
118
164
|
if (uploaded.length > 0) {
|
|
119
165
|
completed = await context.client.callTool('upload_assets_complete', { projectId, assetIds: uploaded });
|
|
120
166
|
}
|
|
121
|
-
|
|
167
|
+
let named = [];
|
|
168
|
+
let namingError;
|
|
169
|
+
if (displayNames.length > 0) {
|
|
170
|
+
try {
|
|
171
|
+
await context.client.callTool('set_asset_labels', { projectId, displayNames });
|
|
172
|
+
named = displayNames;
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
namingError = error instanceof Error ? error.message : String(error);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
const receipt = {
|
|
179
|
+
projectId,
|
|
180
|
+
canvasId,
|
|
181
|
+
uploaded,
|
|
182
|
+
failed,
|
|
183
|
+
completed,
|
|
184
|
+
named,
|
|
185
|
+
...(namingError !== undefined ? { namingError } : {}),
|
|
186
|
+
};
|
|
122
187
|
let assets = null;
|
|
123
188
|
if (uploaded.length > 0 && wantsWait(context, true)) {
|
|
124
189
|
try {
|
|
@@ -137,11 +202,38 @@ export const upload = {
|
|
|
137
202
|
return { ...receipt, ...(assets ? { assets } : {}) };
|
|
138
203
|
},
|
|
139
204
|
};
|
|
205
|
+
function safeFilename(value) {
|
|
206
|
+
return Array.from(value, char => '/\\<>:"|?*'.includes(char) || char.charCodeAt(0) < 32 || char.charCodeAt(0) === 127 ? '-' : char)
|
|
207
|
+
.join('')
|
|
208
|
+
.replace(/\s+/g, ' ')
|
|
209
|
+
.trim()
|
|
210
|
+
.replace(/^\.{1,2}$/, '');
|
|
211
|
+
}
|
|
212
|
+
const FILENAME_MAX_BYTES = 200;
|
|
213
|
+
export function uniqueFilename(stem, ext, isTaken) {
|
|
214
|
+
const fit = (suffix) => {
|
|
215
|
+
const budget = FILENAME_MAX_BYTES - Buffer.byteLength(suffix + ext);
|
|
216
|
+
let used = 0;
|
|
217
|
+
let kept = '';
|
|
218
|
+
for (const point of stem) {
|
|
219
|
+
const bytes = Buffer.byteLength(point);
|
|
220
|
+
if (used + bytes > budget)
|
|
221
|
+
break;
|
|
222
|
+
used += bytes;
|
|
223
|
+
kept += point;
|
|
224
|
+
}
|
|
225
|
+
return kept + suffix + ext;
|
|
226
|
+
};
|
|
227
|
+
let candidate = fit('');
|
|
228
|
+
for (let n = 2; isTaken(candidate); n += 1)
|
|
229
|
+
candidate = fit(` (${n})`);
|
|
230
|
+
return candidate;
|
|
231
|
+
}
|
|
140
232
|
export const download = {
|
|
141
233
|
name: 'download',
|
|
142
|
-
summary: 'Download completed assets
|
|
234
|
+
summary: 'Download completed assets by display name (or use --out for one file)',
|
|
143
235
|
usage: 'martini download <asset-id…> [--out <path> | --dir <directory>] [--no-wait]',
|
|
144
|
-
details: 'Waits for the assets to complete (on by default), fetches a presigned URL per asset (get_asset_download_url), and writes the bytes to disk. Result: { written: [{ assetId, path, bytes, contentType }] }; the JSON receipt goes to stdout even with --out, which here names the file for the bytes.',
|
|
236
|
+
details: 'Directory downloads use sanitised display names plus the suggested extension, falling back to the suggested filename or asset id; existing files and case-insensitive name collisions get numbered suffixes. Unsafe filename characters are replaced, Windows device names are prefixed with _, and stems are limited by UTF-8 bytes to leave room for extensions and numbered suffixes. Waits for the assets to complete (on by default), fetches a presigned URL per asset (get_asset_download_url), and writes the bytes to disk. Result: { written: [{ assetId, path, bytes, contentType }] }; the JSON receipt goes to stdout even with --out, which here names the file for the bytes.',
|
|
145
237
|
positionals: [{ name: 'asset-id', description: 'Assets to download', variadic: true, required: true }],
|
|
146
238
|
flags: [
|
|
147
239
|
{ flag: 'out', kind: 'string', value: '<path>', description: 'File to write when downloading a single asset' },
|
|
@@ -149,7 +241,7 @@ export const download = {
|
|
|
149
241
|
flag: 'dir',
|
|
150
242
|
kind: 'string',
|
|
151
243
|
value: '<directory>',
|
|
152
|
-
description: 'Directory for the files, named by their
|
|
244
|
+
description: 'Directory for the files, named by their display names (default: the working directory)',
|
|
153
245
|
},
|
|
154
246
|
],
|
|
155
247
|
examples: ['martini download <asset-id> --out ./take.mp4', 'martini download <id> <id> --dir ./out'],
|
|
@@ -162,24 +254,68 @@ export const download = {
|
|
|
162
254
|
const dir = flagString(context.flags, 'dir') ?? '.';
|
|
163
255
|
if (out && ids.length > 1)
|
|
164
256
|
throw new ArgumentError('--out names one file; use --dir for several assets.');
|
|
257
|
+
let assets = [];
|
|
165
258
|
if (wantsWait(context, true)) {
|
|
166
|
-
await waitForAssets(context.client, projectId, ids, {
|
|
259
|
+
assets = await waitForAssets(context.client, projectId, ids, {
|
|
167
260
|
timeoutMs: timeoutMs(context),
|
|
168
261
|
now: context.now,
|
|
169
262
|
sleep: context.sleep,
|
|
170
263
|
});
|
|
171
264
|
}
|
|
172
265
|
const written = [];
|
|
266
|
+
const used = new Set();
|
|
173
267
|
for (const assetId of ids) {
|
|
268
|
+
const asset = out
|
|
269
|
+
? undefined
|
|
270
|
+
: (assets.find(asset => asset.id === assetId) ??
|
|
271
|
+
(await context.client.callTool('get_asset', { projectId, assetId }))
|
|
272
|
+
.asset);
|
|
174
273
|
const link = await context.client.callTool('get_asset_download_url', {
|
|
175
274
|
projectId,
|
|
176
275
|
assetId,
|
|
177
276
|
});
|
|
178
277
|
const { bytes, contentType } = await context.client.fetchBytes(link.downloadUrl);
|
|
179
|
-
|
|
180
|
-
|
|
278
|
+
let filename = '';
|
|
279
|
+
let stem = '';
|
|
280
|
+
let ext = '';
|
|
281
|
+
if (!out) {
|
|
282
|
+
const extension = extname(link.suggestedFilename ?? '') ||
|
|
283
|
+
extname(typeof asset?.originalFilename === 'string' ? asset.originalFilename : '');
|
|
284
|
+
const name = safeFilename(typeof asset?.displayName === 'string' ? asset.displayName : '');
|
|
285
|
+
filename = name
|
|
286
|
+
? name + safeFilename(extension)
|
|
287
|
+
: safeFilename(link.suggestedFilename ?? '') || safeFilename(assetId);
|
|
288
|
+
const rawExt = extname(filename);
|
|
289
|
+
ext = Buffer.byteLength(rawExt) > 32 || /^[. ]*$/.test(rawExt) ? '' : rawExt.replace(/[. ]+$/, '');
|
|
290
|
+
stem = basename(filename, rawExt);
|
|
291
|
+
stem = stem.replace(/[. ]+$/, '');
|
|
292
|
+
if (!stem)
|
|
293
|
+
stem = safeFilename(assetId);
|
|
294
|
+
if (/^(?:CON|PRN|AUX|NUL|COM[1-9]|LPT[1-9])$/i.test(stem.split('.')[0] ?? ''))
|
|
295
|
+
stem = '_' + stem;
|
|
296
|
+
filename = uniqueFilename(stem, ext, candidate => used.has(candidate.toLowerCase()) || existsSync(join(dir, candidate)));
|
|
297
|
+
used.add(filename.toLowerCase());
|
|
298
|
+
}
|
|
299
|
+
let path = out ?? join(dir, filename);
|
|
300
|
+
if (out) {
|
|
301
|
+
writeFileSync(path, bytes);
|
|
302
|
+
}
|
|
303
|
+
else {
|
|
181
304
|
mkdirSync(dir, { recursive: true });
|
|
182
|
-
|
|
305
|
+
for (;;) {
|
|
306
|
+
try {
|
|
307
|
+
writeFileSync(path, bytes, { flag: 'wx' });
|
|
308
|
+
break;
|
|
309
|
+
}
|
|
310
|
+
catch (error) {
|
|
311
|
+
if (error.code !== 'EEXIST')
|
|
312
|
+
throw error;
|
|
313
|
+
used.add(filename.toLowerCase());
|
|
314
|
+
filename = uniqueFilename(stem, ext, candidate => used.has(candidate.toLowerCase()) || existsSync(join(dir, candidate)));
|
|
315
|
+
path = join(dir, filename);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
183
319
|
written.push({ assetId, path, bytes: bytes.byteLength, contentType });
|
|
184
320
|
}
|
|
185
321
|
delete context.output.out;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assets.js","sourceRoot":"","sources":["../../src/commands/assets.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"assets.js","sourceRoot":"","sources":["../../src/commands/assets.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/context.js
CHANGED
|
@@ -21,7 +21,7 @@ export function contextFlag(flags, name) {
|
|
|
21
21
|
export function requireProject(context) {
|
|
22
22
|
const projectId = contextFlag(context.flags, 'project') ?? context.config.projectId;
|
|
23
23
|
if (!projectId) {
|
|
24
|
-
throw new ArgumentError('A project is needed: pass --project <id>, or set it once with MARTINI_PROJECT_ID (a
|
|
24
|
+
throw new ArgumentError('A project is needed: pass --project <id>, or set it once with MARTINI_PROJECT_ID (inside a Martini workflow run it is already set in .martini/config.json).');
|
|
25
25
|
}
|
|
26
26
|
return projectId;
|
|
27
27
|
}
|
|
@@ -41,7 +41,7 @@ export function timeoutMs(context) {
|
|
|
41
41
|
return DEFAULT_WAIT_TIMEOUT_MS;
|
|
42
42
|
const fromEnv = Number(configured);
|
|
43
43
|
if (!Number.isFinite(fromEnv) || fromEnv <= 0) {
|
|
44
|
-
throw new ArgumentError(`${WAIT_TIMEOUT_ENV} must be a positive number of seconds (it is "${configured}");
|
|
44
|
+
throw new ArgumentError(`${WAIT_TIMEOUT_ENV} must be a positive number of seconds (it is "${configured}"); a Martini workflow run sets it per step — pass --timeout to override.`);
|
|
45
45
|
}
|
|
46
46
|
return Math.round(fromEnv * 1000);
|
|
47
47
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAI9D,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAA;AAsDpD,MAAM,UAAU,oBAAoB,CAAC,OAAwB;IAC3D,OAAO,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAC7F,CAAC;AAGD,MAAM,UAAU,gBAAgB,CAC9B,OAAwB,EACxB,KAA6B,EAC7B,MAA2B;IAE3B,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;IACnE,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAChC,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAQ;QACjD,MAAM,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC1D,MAAM,IAAI,aAAa,CACrB,kBAAkB,IAAI,gBAAgB,OAAO,CAAC,IAAI,YAAY,GAAG,IAAI,QAAQ,+FAA+F,OAAO,CAAC,IAAI,UAAU,CACnM,CAAA;IACH,CAAC;AACH,CAAC;AAOD,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,CAAU,CAAA;AAElE,MAAM,CAAC,MAAM,oBAAoB,GAAwB,IAAI,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,CAAC,CAAA;AAEzG,MAAM,UAAU,WAAW,CAAC,KAA6B,EAAE,IAAiB;IAC1E,OAAO,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,UAAU,CAAC,KAAK,EAAE,GAAG,IAAI,KAAK,CAAC,CAAA;AACnE,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAuB;IACpD,MAAM,SAAS,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,SAAS,CAAA;IACnF,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,aAAa,CACrB,
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/files.js
CHANGED
|
@@ -19,8 +19,25 @@ function readContentArgument(raw) {
|
|
|
19
19
|
return raw;
|
|
20
20
|
}
|
|
21
21
|
async function listFiles(context, projectId) {
|
|
22
|
-
const
|
|
23
|
-
|
|
22
|
+
const files = [];
|
|
23
|
+
let after;
|
|
24
|
+
for (;;) {
|
|
25
|
+
const page = await context.client.callTool('list_project_files', {
|
|
26
|
+
projectId,
|
|
27
|
+
...(after === undefined ? {} : { after }),
|
|
28
|
+
});
|
|
29
|
+
files.push(...(page.files ?? []));
|
|
30
|
+
if (typeof page.nextAfter !== 'string' || page.nextAfter === '')
|
|
31
|
+
return files;
|
|
32
|
+
if (page.nextAfter === after) {
|
|
33
|
+
throw new CliApiError(`list_project_files answered the same nextAfter twice (${after}); the listing is incomplete.`, {
|
|
34
|
+
code: 'INVALID_RESPONSE',
|
|
35
|
+
status: 0,
|
|
36
|
+
tool: 'list_project_files',
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
after = page.nextAfter;
|
|
40
|
+
}
|
|
24
41
|
}
|
|
25
42
|
function walk(dir, root = dir) {
|
|
26
43
|
const out = [];
|
|
@@ -35,6 +52,9 @@ function walk(dir, root = dir) {
|
|
|
35
52
|
}
|
|
36
53
|
return out;
|
|
37
54
|
}
|
|
55
|
+
function shellQuote(value) {
|
|
56
|
+
return /^[A-Za-z0-9._\/-]+$/.test(value) ? value : `'${value.replace(/'/g, `'\\''`)}'`;
|
|
57
|
+
}
|
|
38
58
|
export const files = {
|
|
39
59
|
name: 'files',
|
|
40
60
|
summary: 'Project memory files: ls, cat, write, pull <dir>, push <dir>',
|
|
@@ -64,96 +84,108 @@ export const files = {
|
|
|
64
84
|
async run(context) {
|
|
65
85
|
const [sub, ...rest] = context.positionals;
|
|
66
86
|
const projectId = requireProject(context);
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
case 'cat': {
|
|
72
|
-
const path = rest[0];
|
|
73
|
-
if (!path)
|
|
74
|
-
throw new ArgumentError('martini files cat <path>');
|
|
75
|
-
const file = await context.client.callTool('read_project_file', { projectId, path });
|
|
76
|
-
return file.content;
|
|
77
|
-
}
|
|
78
|
-
case 'write': {
|
|
79
|
-
const path = rest[0];
|
|
80
|
-
if (!path)
|
|
81
|
-
throw new ArgumentError('martini files write <path> <content|@file|->');
|
|
82
|
-
const content = readContentArgument(rest[1]);
|
|
83
|
-
return context.client.callTool('write_project_file', {
|
|
84
|
-
projectId,
|
|
85
|
-
path,
|
|
86
|
-
content,
|
|
87
|
-
...(flagBoolean(context.flags, 'append') ? { append: true } : {}),
|
|
88
|
-
...(flagBoolean(context.flags, 'create-only') ? { createOnly: true } : {}),
|
|
89
|
-
});
|
|
90
|
-
}
|
|
91
|
-
case 'pull': {
|
|
92
|
-
const dir = resolve(context.cwd, rest[0] ?? '.');
|
|
93
|
-
const listed = await listFiles(context, projectId);
|
|
94
|
-
const manifest = { projectId, pulledAt: new Date(context.now()).toISOString(), files: {} };
|
|
95
|
-
for (const entry of listed) {
|
|
96
|
-
const file = await context.client.callTool('read_project_file', {
|
|
97
|
-
projectId,
|
|
98
|
-
path: entry.path,
|
|
99
|
-
});
|
|
100
|
-
const target = join(dir, ...entry.path.split('/'));
|
|
101
|
-
mkdirSync(dirname(target), { recursive: true });
|
|
102
|
-
writeFileSync(target, file.content);
|
|
103
|
-
manifest.files[entry.path] = { updatedAt: file.updatedAt, sha256: sha256(file.content) };
|
|
87
|
+
try {
|
|
88
|
+
switch (sub) {
|
|
89
|
+
case 'ls': {
|
|
90
|
+
return { projectId, files: await listFiles(context, projectId) };
|
|
104
91
|
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
const manifestPath = join(dir, FILES_MANIFEST);
|
|
112
|
-
if (!existsSync(manifestPath)) {
|
|
113
|
-
throw new ArgumentError(`${dir} was not pulled with martini files pull (no ${FILES_MANIFEST}); pull first so pushes can detect concurrent edits.`);
|
|
92
|
+
case 'cat': {
|
|
93
|
+
const path = rest[0];
|
|
94
|
+
if (!path)
|
|
95
|
+
throw new ArgumentError('martini files cat <path>');
|
|
96
|
+
const file = await context.client.callTool('read_project_file', { projectId, path });
|
|
97
|
+
return file.content;
|
|
114
98
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
99
|
+
case 'write': {
|
|
100
|
+
const path = rest[0];
|
|
101
|
+
if (!path)
|
|
102
|
+
throw new ArgumentError('martini files write <path> <content|@file|->');
|
|
103
|
+
const content = readContentArgument(rest[1]);
|
|
104
|
+
return context.client.callTool('write_project_file', {
|
|
105
|
+
projectId,
|
|
106
|
+
path,
|
|
107
|
+
content,
|
|
108
|
+
...(flagBoolean(context.flags, 'append') ? { append: true } : {}),
|
|
109
|
+
...(flagBoolean(context.flags, 'create-only') ? { createOnly: true } : {}),
|
|
110
|
+
});
|
|
118
111
|
}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
if (!statSync(abs).isFile())
|
|
126
|
-
continue;
|
|
127
|
-
const content = readFileSync(abs, 'utf8');
|
|
128
|
-
const known = manifest.files[path];
|
|
129
|
-
if (known && known.sha256 === sha256(content)) {
|
|
130
|
-
unchanged.push(path);
|
|
131
|
-
continue;
|
|
132
|
-
}
|
|
133
|
-
try {
|
|
134
|
-
const written = await context.client.callTool('write_project_file', {
|
|
112
|
+
case 'pull': {
|
|
113
|
+
const dir = resolve(context.cwd, rest[0] ?? '.');
|
|
114
|
+
const listed = await listFiles(context, projectId);
|
|
115
|
+
const manifest = { projectId, pulledAt: new Date(context.now()).toISOString(), files: {} };
|
|
116
|
+
for (const entry of listed) {
|
|
117
|
+
const file = await context.client.callTool('read_project_file', {
|
|
135
118
|
projectId,
|
|
136
|
-
path,
|
|
137
|
-
content,
|
|
138
|
-
...(!force ? (known ? { expectedUpdatedAt: known.updatedAt } : { createOnly: true }) : {}),
|
|
119
|
+
path: entry.path,
|
|
139
120
|
});
|
|
140
|
-
|
|
141
|
-
|
|
121
|
+
const target = join(dir, ...entry.path.split('/'));
|
|
122
|
+
mkdirSync(dirname(target), { recursive: true });
|
|
123
|
+
writeFileSync(target, file.content);
|
|
124
|
+
manifest.files[entry.path] = { updatedAt: file.updatedAt, sha256: sha256(file.content) };
|
|
125
|
+
}
|
|
126
|
+
mkdirSync(join(dir, '.martini'), { recursive: true });
|
|
127
|
+
writeFileSync(join(dir, FILES_MANIFEST), JSON.stringify(manifest, null, 2) + '\n');
|
|
128
|
+
return { projectId, dir, pulled: Object.keys(manifest.files).length, manifest: join(dir, FILES_MANIFEST) };
|
|
129
|
+
}
|
|
130
|
+
case 'push': {
|
|
131
|
+
const dir = resolve(context.cwd, rest[0] ?? '.');
|
|
132
|
+
const manifestPath = join(dir, FILES_MANIFEST);
|
|
133
|
+
if (!existsSync(manifestPath)) {
|
|
134
|
+
throw new ArgumentError(`${dir} was not pulled with martini files pull (no ${FILES_MANIFEST}); pull first so pushes can detect concurrent edits.`);
|
|
135
|
+
}
|
|
136
|
+
const manifest = JSON.parse(readFileSync(manifestPath, 'utf8'));
|
|
137
|
+
if (manifest.projectId !== projectId) {
|
|
138
|
+
throw new ArgumentError(`${dir} was pulled from project ${manifest.projectId}, not ${projectId}.`);
|
|
142
139
|
}
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
140
|
+
const force = flagBoolean(context.flags, 'force') ?? false;
|
|
141
|
+
const pushed = [];
|
|
142
|
+
const unchanged = [];
|
|
143
|
+
const skipped = [];
|
|
144
|
+
for (const path of walk(dir)) {
|
|
145
|
+
const abs = join(dir, ...path.split('/'));
|
|
146
|
+
if (!statSync(abs).isFile())
|
|
146
147
|
continue;
|
|
148
|
+
const content = readFileSync(abs, 'utf8');
|
|
149
|
+
const known = manifest.files[path];
|
|
150
|
+
if (known && known.sha256 === sha256(content)) {
|
|
151
|
+
unchanged.push(path);
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
try {
|
|
155
|
+
const written = await context.client.callTool('write_project_file', {
|
|
156
|
+
projectId,
|
|
157
|
+
path,
|
|
158
|
+
content,
|
|
159
|
+
...(!force ? (known ? { expectedUpdatedAt: known.updatedAt } : { createOnly: true }) : {}),
|
|
160
|
+
});
|
|
161
|
+
manifest.files[path] = { updatedAt: written.updatedAt, sha256: sha256(content) };
|
|
162
|
+
pushed.push(path);
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
if (error instanceof CliApiError && error.status < 500) {
|
|
166
|
+
skipped.push({ path, code: error.code, error: error.message });
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
throw error;
|
|
147
170
|
}
|
|
148
|
-
throw error;
|
|
149
171
|
}
|
|
172
|
+
manifest.pulledAt = new Date(context.now()).toISOString();
|
|
173
|
+
writeFileSync(manifestPath, JSON.stringify(manifest, null, 2) + '\n');
|
|
174
|
+
return { projectId, dir, pushed, unchanged: unchanged.length, skipped };
|
|
150
175
|
}
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
176
|
+
default:
|
|
177
|
+
throw new ArgumentError('martini files <ls | cat | write | pull | push>');
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
if (sub === 'cat' &&
|
|
182
|
+
rest[0]?.startsWith('tools/') &&
|
|
183
|
+
error instanceof CliApiError &&
|
|
184
|
+
(/No project file|(?:file.*not found|not found.*file)|invalid.*path|path.*invalid|^File paths are relative|^The file path (?:is empty|is longer than|has more than)/i.test(error.message) ||
|
|
185
|
+
/^(?:PROJECT_FILE_NOT_FOUND|FILE_NOT_FOUND|NOT_FOUND|INVALID_PATH|INVALID_PROJECT_FILE_PATH)$/.test(error.code))) {
|
|
186
|
+
error.message += `\nKit files are not project files. Read them from the workflow's tools library in two steps: martini get_workflow_authoring --project ${projectId} --workflow-id <workflow-id> --sections workflow (read baseline.toolBundle.sha256), then martini get_workflow_authoring --project ${projectId} --workflow-id <workflow-id> --file-path=${shellQuote(rest[0].replace(/^tools\//, ''))} --expected-bundle-sha256 <that sha> (the workflow id comes from martini list_saved_workflows --project ${projectId}).`;
|
|
154
187
|
}
|
|
155
|
-
|
|
156
|
-
throw new ArgumentError('martini files <ls | cat | write | pull | push>');
|
|
188
|
+
throw error;
|
|
157
189
|
}
|
|
158
190
|
},
|
|
159
191
|
};
|