@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.
@@ -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 contentTypeFor(path, override) {
21
- if (override)
22
- return override;
23
- const type = CONTENT_TYPES[extname(path).toLowerCase()];
24
- if (!type)
25
- throw new ArgumentError(`Cannot infer a content type for ${path}; pass --content-type.`);
26
- return type;
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 (prepare → PUT → complete in one step)',
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 files = paths.map(path => {
83
- const size = statSync(path).size;
84
- return { path, filename: basename(path), contentType: contentTypeFor(path, contentTypeOverride), sizeBytes: size };
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
- const receipt = { projectId, canvasId, uploaded, failed, completed };
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 to files (one --out for a single asset, else into --dir)',
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 suggested filenames (default: the working directory)',
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
- const path = out ?? join(dir, link.suggestedFilename ?? assetId);
180
- if (!out)
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
- writeFileSync(path, bytes);
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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"}
@@ -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 run sandbox has it in .martini/config.json).');
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}"); the sandbox sets it per step — pass --timeout to override.`);
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":"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"}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"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"}
@@ -19,8 +19,25 @@ function readContentArgument(raw) {
19
19
  return raw;
20
20
  }
21
21
  async function listFiles(context, projectId) {
22
- const result = await context.client.callTool('list_project_files', { projectId });
23
- return result.files ?? [];
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
- switch (sub) {
68
- case 'ls': {
69
- return { projectId, files: await listFiles(context, projectId) };
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
- mkdirSync(join(dir, '.martini'), { recursive: true });
106
- writeFileSync(join(dir, FILES_MANIFEST), JSON.stringify(manifest, null, 2) + '\n');
107
- return { projectId, dir, pulled: Object.keys(manifest.files).length, manifest: join(dir, FILES_MANIFEST) };
108
- }
109
- case 'push': {
110
- const dir = resolve(context.cwd, rest[0] ?? '.');
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
- const manifest = JSON.parse(readFileSync(manifestPath, 'utf8'));
116
- if (manifest.projectId !== projectId) {
117
- throw new ArgumentError(`${dir} was pulled from project ${manifest.projectId}, not ${projectId}.`);
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
- const force = flagBoolean(context.flags, 'force') ?? false;
120
- const pushed = [];
121
- const unchanged = [];
122
- const skipped = [];
123
- for (const path of walk(dir)) {
124
- const abs = join(dir, ...path.split('/'));
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
- manifest.files[path] = { updatedAt: written.updatedAt, sha256: sha256(content) };
141
- pushed.push(path);
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
- catch (error) {
144
- if (error instanceof CliApiError && error.status < 500) {
145
- skipped.push({ path, code: error.code, error: error.message });
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
- manifest.pulledAt = new Date(context.now()).toISOString();
152
- writeFileSync(manifestPath, JSON.stringify(manifest, null, 2) + '\n');
153
- return { projectId, dir, pushed, unchanged: unchanged.length, skipped };
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
- default:
156
- throw new ArgumentError('martini files <ls | cat | write | pull | push>');
188
+ throw error;
157
189
  }
158
190
  },
159
191
  };