@martini-film/cli 0.2.0 → 0.4.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 +173 -56
- package/dist/api.js +69 -2
- package/dist/api.js.map +1 -1
- package/dist/approve.js +2 -1
- package/dist/approve.js.map +1 -1
- package/dist/args.js +31 -6
- package/dist/args.js.map +1 -1
- package/dist/cli.js +457 -110
- package/dist/cli.js.map +1 -1
- package/dist/commands/assets.js +297 -45
- package/dist/commands/assets.js.map +1 -1
- package/dist/commands/call.js +99 -0
- package/dist/commands/call.js.map +1 -0
- package/dist/commands/context.js +16 -3
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/files.js +208 -83
- package/dist/commands/files.js.map +1 -1
- package/dist/commands/guide.js +67 -0
- package/dist/commands/guide.js.map +1 -0
- package/dist/commands/init.js +196 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/login.js +69 -15
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/tools.js +63 -78
- package/dist/commands/tools.js.map +1 -1
- package/dist/commands/use.js +143 -0
- package/dist/commands/use.js.map +1 -0
- package/dist/config.js +87 -6
- package/dist/config.js.map +1 -1
- package/dist/generated/guide.json +104 -0
- package/dist/generated/manifest.json +3885 -241
- package/dist/guideCache.js +204 -0
- package/dist/guideCache.js.map +1 -0
- package/dist/help.js +391 -34
- package/dist/help.js.map +1 -1
- package/dist/manifest.js +34 -3
- package/dist/manifest.js.map +1 -1
- package/dist/manifestCache.js +196 -0
- package/dist/manifestCache.js.map +1 -0
- package/dist/output.js +251 -28
- package/dist/output.js.map +1 -1
- package/dist/schema.js +132 -15
- package/dist/schema.js.map +1 -1
- package/dist/wait.js +181 -8
- package/dist/wait.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { CliApiError } from '../api.js';
|
|
2
|
+
import { flagBoolean, flagString } from '../args.js';
|
|
3
|
+
import { assertRawDestination, isMediaOutPath, printBytes } from '../output.js';
|
|
4
|
+
import { TOOL_NAME_PATTERN } from '../manifest.js';
|
|
5
|
+
import { ArgumentError, readJsonArgument } from '../schema.js';
|
|
6
|
+
import { contextFlag, selectedFields } from './context.js';
|
|
7
|
+
const FORWARDED_CONTEXT = [
|
|
8
|
+
['project', 'projectId'],
|
|
9
|
+
['canvas', 'canvasId'],
|
|
10
|
+
['run', 'runId'],
|
|
11
|
+
];
|
|
12
|
+
export const call = {
|
|
13
|
+
name: 'call',
|
|
14
|
+
summary: "Call a tool by name with a raw arguments object (for a tool this build and the server's list lack)",
|
|
15
|
+
usage: "martini call <tool> [--args '{…}'|@file] [--project <id>] [--canvas <id>] [--run <id>] [--fields a,b]",
|
|
16
|
+
details: "Sends POST /v1/tools/<tool> with exactly the arguments given: no flags derived from a schema, no local checks, nothing filled in from MARTINI_PROJECT_ID, martini use, or .martini/config.json. --project / --canvas / --run add projectId / canvasId / runId only when typed on this command. --fields projects the result as on any tool that writes (paths that match nothing print it whole, with a warning); the call does not wait (martini wait <ids…> does). Use it when martini <tool> is an unknown command even after the CLI refreshed its tool list — a tool the server's published list does not show, or a refresh that could not run (offline, MARTINI_MANIFEST_REFRESH=0). For a tool the CLI knows, prefer martini <tool>: it checks flags before anything is sent and fills the context in. Result: the tool's result, as martini <tool> prints it.",
|
|
17
|
+
positionals: [{ name: 'tool', description: 'The tool name, as the MCP spells it (snake_case)', required: true }],
|
|
18
|
+
flags: [
|
|
19
|
+
{
|
|
20
|
+
flag: 'args',
|
|
21
|
+
kind: 'string',
|
|
22
|
+
value: '<object|@file>',
|
|
23
|
+
description: 'The arguments object as JSON, or @file to read it from a file (@- reads stdin); default {}',
|
|
24
|
+
},
|
|
25
|
+
{ flag: 'json', kind: 'string', value: '<object|@file>', description: 'Alias of --args' },
|
|
26
|
+
],
|
|
27
|
+
examples: [
|
|
28
|
+
'martini call get_asset --args \'{"assetId": "<id>"}\' --project <id> --fields asset.status',
|
|
29
|
+
'martini call <new_tool> --args @args.json',
|
|
30
|
+
],
|
|
31
|
+
async run(context) {
|
|
32
|
+
const [name, ...extra] = context.positionals;
|
|
33
|
+
if (!name)
|
|
34
|
+
throw new ArgumentError("Name the tool: martini call <tool> --args '{…}'.");
|
|
35
|
+
if (!TOOL_NAME_PATTERN.test(name)) {
|
|
36
|
+
throw new ArgumentError(`"${name}" is not a tool name: tool names are snake_case, like get_asset.`);
|
|
37
|
+
}
|
|
38
|
+
if (extra.length > 0) {
|
|
39
|
+
throw new ArgumentError(`Unexpected argument${extra.length > 1 ? 's' : ''} ${extra.map(token => JSON.stringify(token)).join(' ')}: martini call takes one tool name; the tool's arguments go in --args '{…}'.`);
|
|
40
|
+
}
|
|
41
|
+
if (flagBoolean(context.flags, 'wait')) {
|
|
42
|
+
throw new ArgumentError('martini call does not wait. Run martini wait <ids…> with the ids it returns.');
|
|
43
|
+
}
|
|
44
|
+
const out = context.output.out;
|
|
45
|
+
if (out !== undefined && isMediaOutPath(out) && flagBoolean(context.flags, 'raw') !== true) {
|
|
46
|
+
throw new ArgumentError(`--out ${out} names a media file, but martini call writes the JSON result there unless --raw asks for the bytes. Add --raw for the picture, or name a .json file.`, { hint: `martini ${name} --out ${out} (the tool's own command) works out which one you mean.` });
|
|
47
|
+
}
|
|
48
|
+
const args = callArguments(context);
|
|
49
|
+
for (const [flag, key] of FORWARDED_CONTEXT) {
|
|
50
|
+
const value = contextFlag(context.flags, flag);
|
|
51
|
+
if (value === undefined)
|
|
52
|
+
continue;
|
|
53
|
+
if (args[key] !== undefined && args[key] !== value) {
|
|
54
|
+
throw new ArgumentError(`${key} is given twice with different values, in --args and as --${flag}. Keep one.`);
|
|
55
|
+
}
|
|
56
|
+
args[key] = value;
|
|
57
|
+
}
|
|
58
|
+
if (flagBoolean(context.flags, 'raw')) {
|
|
59
|
+
assertRawDestination(context.output);
|
|
60
|
+
let raw;
|
|
61
|
+
try {
|
|
62
|
+
raw = await context.client.callToolRaw(name, args);
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
if (error instanceof CliApiError && error.code === 'NOT_RAW_ELIGIBLE') {
|
|
66
|
+
throw new ArgumentError('This result cannot use --raw --out: it is not exactly one media block.');
|
|
67
|
+
}
|
|
68
|
+
throw error;
|
|
69
|
+
}
|
|
70
|
+
printBytes(raw.bytes, {
|
|
71
|
+
...context.output,
|
|
72
|
+
contentType: raw.contentType,
|
|
73
|
+
meta: raw.meta,
|
|
74
|
+
fields: selectedFields(context),
|
|
75
|
+
});
|
|
76
|
+
delete context.output.out;
|
|
77
|
+
context.output.quiet = true;
|
|
78
|
+
return undefined;
|
|
79
|
+
}
|
|
80
|
+
return context.client.callTool(name, args);
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
function callArguments(context) {
|
|
84
|
+
const given = ['args', 'json'].filter(flag => context.flags.has(flag));
|
|
85
|
+
if (given.length > 1)
|
|
86
|
+
throw new ArgumentError('Use either --args or --json (its alias), not both.');
|
|
87
|
+
const flag = given[0];
|
|
88
|
+
if (!flag)
|
|
89
|
+
return {};
|
|
90
|
+
const raw = flagString(context.flags, flag);
|
|
91
|
+
if (raw === undefined)
|
|
92
|
+
throw new ArgumentError(`--${flag} needs a value: a JSON object, or @file.`);
|
|
93
|
+
const value = readJsonArgument(raw, `--${flag}`);
|
|
94
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
95
|
+
throw new ArgumentError(`--${flag} must be a JSON object of tool arguments.`);
|
|
96
|
+
}
|
|
97
|
+
return value;
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=call.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"call.js","sourceRoot":"","sources":["../../src/commands/call.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/context.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { CliApiError } from '../api.js';
|
|
1
2
|
import { flagBoolean, flagList, flagString } from '../args.js';
|
|
2
3
|
import { ArgumentError } from '../schema.js';
|
|
3
4
|
import { DEFAULT_WAIT_TIMEOUT_MS } from '../wait.js';
|
|
@@ -18,17 +19,29 @@ export const CONTEXT_FLAG_ALIASES = new Set(CONTEXT_FLAGS.map(name => `${name}-i
|
|
|
18
19
|
export function contextFlag(flags, name) {
|
|
19
20
|
return flagString(flags, name) ?? flagString(flags, `${name}-id`);
|
|
20
21
|
}
|
|
22
|
+
function requireKey(context) {
|
|
23
|
+
if (!context.config.apiKey) {
|
|
24
|
+
throw new CliApiError('No Martini API key. Run martini login, or set MARTINI_API_KEY.', {
|
|
25
|
+
code: 'NO_API_KEY',
|
|
26
|
+
status: 0,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
}
|
|
21
30
|
export function requireProject(context) {
|
|
31
|
+
requireKey(context);
|
|
22
32
|
const projectId = contextFlag(context.flags, 'project') ?? context.config.projectId;
|
|
23
33
|
if (!projectId) {
|
|
24
|
-
throw new ArgumentError('A project is needed: pass --project <id>, or set it once
|
|
34
|
+
throw new ArgumentError('A project is needed: pass --project <id>, or set it once for this directory with martini use <project-id|name>.', {
|
|
35
|
+
hint: 'martini use writes .martini/context.json, which every later command here reads; MARTINI_PROJECT_ID also works, and a Martini workflow run already has its project.',
|
|
36
|
+
});
|
|
25
37
|
}
|
|
26
38
|
return projectId;
|
|
27
39
|
}
|
|
28
40
|
export function requireCanvas(context) {
|
|
41
|
+
requireKey(context);
|
|
29
42
|
const canvasId = contextFlag(context.flags, 'canvas') ?? context.config.canvasId;
|
|
30
43
|
if (!canvasId) {
|
|
31
|
-
throw new ArgumentError('A canvas is needed: pass --canvas <id>, or set it once with
|
|
44
|
+
throw new ArgumentError('A canvas is needed: pass --canvas <id>, or set it once for this directory with martini use <project> --canvas <id|name>.', { hint: 'martini get_board_overview lists the canvases; martini create_canvas makes one.' });
|
|
32
45
|
}
|
|
33
46
|
return canvasId;
|
|
34
47
|
}
|
|
@@ -41,7 +54,7 @@ export function timeoutMs(context) {
|
|
|
41
54
|
return DEFAULT_WAIT_TIMEOUT_MS;
|
|
42
55
|
const fromEnv = Number(configured);
|
|
43
56
|
if (!Number.isFinite(fromEnv) || fromEnv <= 0) {
|
|
44
|
-
throw new ArgumentError(`${WAIT_TIMEOUT_ENV} must be a positive number of seconds (it is "${configured}");
|
|
57
|
+
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
58
|
}
|
|
46
59
|
return Math.round(fromEnv * 1000);
|
|
47
60
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/files.js
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { createHash } from 'node:crypto';
|
|
2
|
-
import { existsSync, mkdirSync, readFileSync, readdirSync, statSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, statSync, writeFileSync } from 'node:fs';
|
|
3
3
|
import { dirname, join, relative, resolve, sep } from 'node:path';
|
|
4
4
|
import { CliApiError } from '../api.js';
|
|
5
5
|
import { flagBoolean } from '../args.js';
|
|
6
|
+
import { printWarning } from '../output.js';
|
|
6
7
|
import { ArgumentError } from '../schema.js';
|
|
7
8
|
import { requireProject } from './context.js';
|
|
8
9
|
export const FILES_MANIFEST = join('.martini', 'files.json');
|
|
10
|
+
export const FILES_CONFLICTS = join('.martini', 'conflicts');
|
|
9
11
|
function sha256(content) {
|
|
10
12
|
return createHash('sha256').update(content).digest('hex');
|
|
11
13
|
}
|
|
@@ -19,8 +21,25 @@ function readContentArgument(raw) {
|
|
|
19
21
|
return raw;
|
|
20
22
|
}
|
|
21
23
|
async function listFiles(context, projectId) {
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
+
const files = [];
|
|
25
|
+
let after;
|
|
26
|
+
for (;;) {
|
|
27
|
+
const page = await context.client.callTool('list_project_files', {
|
|
28
|
+
projectId,
|
|
29
|
+
...(after === undefined ? {} : { after }),
|
|
30
|
+
});
|
|
31
|
+
files.push(...(page.files ?? []));
|
|
32
|
+
if (typeof page.nextAfter !== 'string' || page.nextAfter === '')
|
|
33
|
+
return files;
|
|
34
|
+
if (page.nextAfter === after) {
|
|
35
|
+
throw new CliApiError(`list_project_files answered the same nextAfter twice (${after}); the listing is incomplete.`, {
|
|
36
|
+
code: 'INVALID_RESPONSE',
|
|
37
|
+
status: 0,
|
|
38
|
+
tool: 'list_project_files',
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
after = page.nextAfter;
|
|
42
|
+
}
|
|
24
43
|
}
|
|
25
44
|
function walk(dir, root = dir) {
|
|
26
45
|
const out = [];
|
|
@@ -35,11 +54,28 @@ function walk(dir, root = dir) {
|
|
|
35
54
|
}
|
|
36
55
|
return out;
|
|
37
56
|
}
|
|
57
|
+
function readManifest(path) {
|
|
58
|
+
if (!existsSync(path))
|
|
59
|
+
return null;
|
|
60
|
+
try {
|
|
61
|
+
const parsed = JSON.parse(readFileSync(path, 'utf8'));
|
|
62
|
+
return parsed && typeof parsed === 'object' && parsed.files && typeof parsed.files === 'object' ? parsed : null;
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function conflictCopyPath(dir, path) {
|
|
69
|
+
return join(dir, FILES_CONFLICTS, ...path.split('/'));
|
|
70
|
+
}
|
|
71
|
+
function shellQuote(value) {
|
|
72
|
+
return /^[A-Za-z0-9._\/-]+$/.test(value) ? value : `'${value.replace(/'/g, `'\\''`)}'`;
|
|
73
|
+
}
|
|
38
74
|
export const files = {
|
|
39
75
|
name: 'files',
|
|
40
76
|
summary: 'Project memory files: ls, cat, write, pull <dir>, push <dir>',
|
|
41
77
|
usage: 'martini files ls | cat <path> | write <path> <content|@file|-> [--append|--create-only] | pull <dir> | push <dir> [--force]',
|
|
42
|
-
details: "The project's memory files as a directory. pull writes every file plus .martini/files.json (path → updatedAt, sha256)
|
|
78
|
+
details: "The project's memory files as a directory. pull writes every file plus .martini/files.json (path → updatedAt, sha256). It never overwrites a file you edited since the last pull: the file is kept (listed under kept), and when the server's copy changed as well, that copy is written to .martini/conflicts/<path>, the file is listed under conflicts, and the pull exits 1 (PULL_CONFLICT) — merge what you need, delete the copy, push. push sends only changed files, each guarded by expectedUpdatedAt, and refuses one edited server-side since the pull (PROJECT_FILE_CHANGED, listed under skipped) or one with an unmerged copy in .martini/conflicts (UNRESOLVED_CONFLICT); a push that skipped anything exits 1 with the result still on stdout. behind lists files the server has newer (or new) that you did not touch: pull to get them (null, with a BEHIND_UNKNOWN warning, when the listing failed after the push). --force overwrites, in either direction. project.md and Instructions files are read-only during a run and come back as skipped. Nothing is ever deleted. cat prints the raw content, not JSON. Results: pull { projectId, dir, pulled, kept, conflicts: [{ path, serverCopy }], manifest }; push { projectId, dir, pushed, unchanged, skipped: [{ path, code, error }], behind }.",
|
|
43
79
|
positionals: [
|
|
44
80
|
{
|
|
45
81
|
name: 'ls | cat <path> | write <path> <content|@file|-> | pull <dir> | push <dir>',
|
|
@@ -53,7 +89,7 @@ export const files = {
|
|
|
53
89
|
{
|
|
54
90
|
flag: 'force',
|
|
55
91
|
kind: 'boolean',
|
|
56
|
-
description: 'push: overwrite files changed server-side since the pull, and files that appeared meanwhile',
|
|
92
|
+
description: 'push: overwrite files changed server-side since the pull, and files that appeared meanwhile. pull: overwrite files edited here',
|
|
57
93
|
},
|
|
58
94
|
],
|
|
59
95
|
examples: [
|
|
@@ -64,96 +100,185 @@ export const files = {
|
|
|
64
100
|
async run(context) {
|
|
65
101
|
const [sub, ...rest] = context.positionals;
|
|
66
102
|
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) };
|
|
103
|
+
try {
|
|
104
|
+
switch (sub) {
|
|
105
|
+
case 'ls': {
|
|
106
|
+
return { projectId, files: await listFiles(context, projectId) };
|
|
104
107
|
}
|
|
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.`);
|
|
108
|
+
case 'cat': {
|
|
109
|
+
const path = rest[0];
|
|
110
|
+
if (!path)
|
|
111
|
+
throw new ArgumentError('martini files cat <path>');
|
|
112
|
+
const file = await context.client.callTool('read_project_file', { projectId, path });
|
|
113
|
+
return file.content;
|
|
114
114
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
115
|
+
case 'write': {
|
|
116
|
+
const path = rest[0];
|
|
117
|
+
if (!path)
|
|
118
|
+
throw new ArgumentError('martini files write <path> <content|@file|->');
|
|
119
|
+
const content = readContentArgument(rest[1]);
|
|
120
|
+
return context.client.callTool('write_project_file', {
|
|
121
|
+
projectId,
|
|
122
|
+
path,
|
|
123
|
+
content,
|
|
124
|
+
...(flagBoolean(context.flags, 'append') ? { append: true } : {}),
|
|
125
|
+
...(flagBoolean(context.flags, 'create-only') ? { createOnly: true } : {}),
|
|
126
|
+
});
|
|
118
127
|
}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
const
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
const
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
continue;
|
|
132
|
-
}
|
|
133
|
-
try {
|
|
134
|
-
const written = await context.client.callTool('write_project_file', {
|
|
128
|
+
case 'pull': {
|
|
129
|
+
const dir = resolve(context.cwd, rest[0] ?? '.');
|
|
130
|
+
const force = flagBoolean(context.flags, 'force') ?? false;
|
|
131
|
+
const listed = await listFiles(context, projectId);
|
|
132
|
+
const before = readManifest(join(dir, FILES_MANIFEST));
|
|
133
|
+
const base = before?.projectId === projectId ? before.files : {};
|
|
134
|
+
const manifest = { projectId, pulledAt: new Date(context.now()).toISOString(), files: {} };
|
|
135
|
+
const kept = [];
|
|
136
|
+
const conflicts = [];
|
|
137
|
+
let pulled = 0;
|
|
138
|
+
for (const entry of listed) {
|
|
139
|
+
const file = await context.client.callTool('read_project_file', {
|
|
135
140
|
projectId,
|
|
136
|
-
path,
|
|
137
|
-
content,
|
|
138
|
-
...(!force ? (known ? { expectedUpdatedAt: known.updatedAt } : { createOnly: true }) : {}),
|
|
141
|
+
path: entry.path,
|
|
139
142
|
});
|
|
140
|
-
|
|
141
|
-
|
|
143
|
+
const target = join(dir, ...entry.path.split('/'));
|
|
144
|
+
const copy = conflictCopyPath(dir, entry.path);
|
|
145
|
+
const serverSha = sha256(file.content);
|
|
146
|
+
const known = base[entry.path];
|
|
147
|
+
const localSha = existsSync(target) && statSync(target).isFile() ? sha256(readFileSync(target, 'utf8')) : null;
|
|
148
|
+
const editedHere = localSha !== null && localSha !== serverSha && localSha !== known?.sha256;
|
|
149
|
+
if (editedHere && !force) {
|
|
150
|
+
manifest.files[entry.path] = { updatedAt: file.updatedAt, sha256: serverSha };
|
|
151
|
+
if (known && known.sha256 === serverSha) {
|
|
152
|
+
if (existsSync(copy))
|
|
153
|
+
conflicts.push({ path: entry.path, serverCopy: copy });
|
|
154
|
+
else
|
|
155
|
+
kept.push(entry.path);
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
mkdirSync(dirname(copy), { recursive: true });
|
|
159
|
+
writeFileSync(copy, file.content);
|
|
160
|
+
conflicts.push({ path: entry.path, serverCopy: copy });
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
mkdirSync(dirname(target), { recursive: true });
|
|
164
|
+
writeFileSync(target, file.content);
|
|
165
|
+
rmSync(copy, { force: true });
|
|
166
|
+
manifest.files[entry.path] = { updatedAt: file.updatedAt, sha256: serverSha };
|
|
167
|
+
pulled += 1;
|
|
142
168
|
}
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
169
|
+
mkdirSync(join(dir, '.martini'), { recursive: true });
|
|
170
|
+
writeFileSync(join(dir, FILES_MANIFEST), JSON.stringify(manifest, null, 2) + '\n');
|
|
171
|
+
const result = { projectId, dir, pulled, kept, conflicts, manifest: join(dir, FILES_MANIFEST) };
|
|
172
|
+
if (conflicts.length > 0) {
|
|
173
|
+
const error = new CliApiError(`${conflicts.length} file${conflicts.length === 1 ? '' : 's'} changed both here and on the server: ${conflicts.map(conflict => conflict.path).join(', ')}. Your copies were kept; the server's are in ${join(dir, FILES_CONFLICTS)}.`, {
|
|
174
|
+
code: 'PULL_CONFLICT',
|
|
175
|
+
status: 0,
|
|
176
|
+
hint: `For each file: merge what you need from its copy under ${FILES_CONFLICTS}/ into your file, delete that copy, then run martini files push ${shellQuote(rest[0] ?? '.')}. martini files pull --force takes the server's version and drops yours.`,
|
|
177
|
+
});
|
|
178
|
+
error.result = result;
|
|
179
|
+
throw error;
|
|
180
|
+
}
|
|
181
|
+
return result;
|
|
182
|
+
}
|
|
183
|
+
case 'push': {
|
|
184
|
+
const dir = resolve(context.cwd, rest[0] ?? '.');
|
|
185
|
+
const manifestPath = join(dir, FILES_MANIFEST);
|
|
186
|
+
if (!existsSync(manifestPath)) {
|
|
187
|
+
throw new ArgumentError(`${dir} was not pulled with martini files pull (no ${FILES_MANIFEST}); pull first so pushes can detect concurrent edits.`);
|
|
188
|
+
}
|
|
189
|
+
const manifest = JSON.parse(readFileSync(manifestPath, 'utf8'));
|
|
190
|
+
if (manifest.projectId !== projectId) {
|
|
191
|
+
throw new ArgumentError(`${dir} was pulled from project ${manifest.projectId}, not ${projectId}.`);
|
|
192
|
+
}
|
|
193
|
+
const force = flagBoolean(context.flags, 'force') ?? false;
|
|
194
|
+
const pushed = [];
|
|
195
|
+
const unchanged = [];
|
|
196
|
+
const skipped = [];
|
|
197
|
+
const local = walk(dir);
|
|
198
|
+
for (const path of local) {
|
|
199
|
+
const abs = join(dir, ...path.split('/'));
|
|
200
|
+
if (!statSync(abs).isFile())
|
|
201
|
+
continue;
|
|
202
|
+
const content = readFileSync(abs, 'utf8');
|
|
203
|
+
const known = manifest.files[path];
|
|
204
|
+
if (known && known.sha256 === sha256(content)) {
|
|
205
|
+
unchanged.push(path);
|
|
146
206
|
continue;
|
|
147
207
|
}
|
|
208
|
+
const copy = conflictCopyPath(dir, path);
|
|
209
|
+
if (!force && existsSync(copy)) {
|
|
210
|
+
skipped.push({
|
|
211
|
+
path,
|
|
212
|
+
code: 'UNRESOLVED_CONFLICT',
|
|
213
|
+
error: `"${path}" still has the server's copy at ${copy}. Merge what you need from it, delete it, and push again.`,
|
|
214
|
+
});
|
|
215
|
+
continue;
|
|
216
|
+
}
|
|
217
|
+
try {
|
|
218
|
+
const written = await context.client.callTool('write_project_file', {
|
|
219
|
+
projectId,
|
|
220
|
+
path,
|
|
221
|
+
content,
|
|
222
|
+
...(!force ? (known ? { expectedUpdatedAt: known.updatedAt } : { createOnly: true }) : {}),
|
|
223
|
+
});
|
|
224
|
+
manifest.files[path] = { updatedAt: written.updatedAt, sha256: sha256(content) };
|
|
225
|
+
rmSync(copy, { force: true });
|
|
226
|
+
pushed.push(path);
|
|
227
|
+
}
|
|
228
|
+
catch (error) {
|
|
229
|
+
if (error instanceof CliApiError && error.status < 500) {
|
|
230
|
+
skipped.push({ path, code: error.code, error: error.message });
|
|
231
|
+
continue;
|
|
232
|
+
}
|
|
233
|
+
throw error;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
manifest.pulledAt = new Date(context.now()).toISOString();
|
|
237
|
+
writeFileSync(manifestPath, JSON.stringify(manifest, null, 2) + '\n');
|
|
238
|
+
const here = new Set(local);
|
|
239
|
+
const untouched = new Set(unchanged);
|
|
240
|
+
let behind = null;
|
|
241
|
+
try {
|
|
242
|
+
behind = (await listFiles(context, projectId))
|
|
243
|
+
.filter(entry => here.has(entry.path)
|
|
244
|
+
? untouched.has(entry.path) && manifest.files[entry.path]?.updatedAt !== entry.updatedAt
|
|
245
|
+
: true)
|
|
246
|
+
.map(entry => entry.path);
|
|
247
|
+
}
|
|
248
|
+
catch (error) {
|
|
249
|
+
printWarning('BEHIND_UNKNOWN', `The push is done, but listing the server's files failed (${error instanceof Error ? error.message : String(error)}), so behind is unknown. Run martini files pull to catch up.`, context.output);
|
|
250
|
+
}
|
|
251
|
+
const result = { projectId, dir, pushed, unchanged: unchanged.length, skipped, behind };
|
|
252
|
+
if (skipped.length > 0) {
|
|
253
|
+
const codes = new Set(skipped.map(entry => entry.code));
|
|
254
|
+
const changed = skipped.filter(entry => entry.code === 'PROJECT_FILE_CHANGED').map(entry => entry.path);
|
|
255
|
+
const error = new CliApiError(`${skipped.length} file${skipped.length === 1 ? ' was' : 's were'} not pushed: ${skipped.map(entry => `${entry.path} (${entry.code})`).join(', ')}.${pushed.length ? ` ${pushed.length} other${pushed.length === 1 ? ' was' : 's were'} pushed.` : ''}`, {
|
|
256
|
+
code: codes.size === 1 ? [...codes][0] : 'FILES_NOT_PUSHED',
|
|
257
|
+
status: 0,
|
|
258
|
+
hint: changed.length
|
|
259
|
+
? `Your local edits are intact. ${changed.join(', ')} changed on the server after your pull: run martini files pull ${shellQuote(rest[0] ?? '.')} (it keeps your copy and puts the server's in ${FILES_CONFLICTS}/), merge, and push again. --force overwrites the server's copy instead.`
|
|
260
|
+
: codes.has('UNRESOLVED_CONFLICT')
|
|
261
|
+
? `Your local files are intact. Merge what you need from each copy under ${FILES_CONFLICTS}/ into your file, delete the copy, and push again. --force pushes your file as it is.`
|
|
262
|
+
: 'The reason for each file is under skipped in the result. Your local files are intact.',
|
|
263
|
+
});
|
|
264
|
+
error.result = result;
|
|
148
265
|
throw error;
|
|
149
266
|
}
|
|
267
|
+
return result;
|
|
150
268
|
}
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
269
|
+
default:
|
|
270
|
+
throw new ArgumentError('martini files <ls | cat | write | pull | push>');
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
catch (error) {
|
|
274
|
+
if (sub === 'cat' &&
|
|
275
|
+
rest[0]?.startsWith('tools/') &&
|
|
276
|
+
error instanceof CliApiError &&
|
|
277
|
+
(/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) ||
|
|
278
|
+
/^(?:PROJECT_FILE_NOT_FOUND|FILE_NOT_FOUND|NOT_FOUND|INVALID_PATH|INVALID_PROJECT_FILE_PATH)$/.test(error.code))) {
|
|
279
|
+
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
280
|
}
|
|
155
|
-
|
|
156
|
-
throw new ArgumentError('martini files <ls | cat | write | pull | push>');
|
|
281
|
+
throw error;
|
|
157
282
|
}
|
|
158
283
|
},
|
|
159
284
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/commands/files.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/commands/files.ts"],"names":[],"mappings":"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"}
|