@martini-film/cli 0.3.0 → 0.4.1

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.
Files changed (44) hide show
  1. package/README.md +169 -44
  2. package/dist/api.js +71 -23
  3. package/dist/api.js.map +1 -1
  4. package/dist/approve.js +16 -1
  5. package/dist/approve.js.map +1 -1
  6. package/dist/cli.js +487 -142
  7. package/dist/cli.js.map +1 -1
  8. package/dist/commands/assets.js +165 -29
  9. package/dist/commands/assets.js.map +1 -1
  10. package/dist/commands/call.js +131 -0
  11. package/dist/commands/call.js.map +1 -0
  12. package/dist/commands/context.js +11 -2
  13. package/dist/commands/context.js.map +1 -1
  14. package/dist/commands/files.js +117 -9
  15. package/dist/commands/files.js.map +1 -1
  16. package/dist/commands/guide.js +71 -0
  17. package/dist/commands/guide.js.map +1 -0
  18. package/dist/commands/init.js +213 -0
  19. package/dist/commands/init.js.map +1 -0
  20. package/dist/commands/login.js +37 -6
  21. package/dist/commands/login.js.map +1 -1
  22. package/dist/commands/tools.js +88 -80
  23. package/dist/commands/tools.js.map +1 -1
  24. package/dist/commands/use.js +148 -0
  25. package/dist/commands/use.js.map +1 -0
  26. package/dist/config.js +87 -6
  27. package/dist/config.js.map +1 -1
  28. package/dist/generated/guide.json +104 -0
  29. package/dist/generated/manifest.json +73 -24
  30. package/dist/guideCache.js +204 -0
  31. package/dist/guideCache.js.map +1 -0
  32. package/dist/help.js +391 -34
  33. package/dist/help.js.map +1 -1
  34. package/dist/manifest.js +27 -0
  35. package/dist/manifest.js.map +1 -1
  36. package/dist/manifestCache.js +196 -0
  37. package/dist/manifestCache.js.map +1 -0
  38. package/dist/output.js +289 -30
  39. package/dist/output.js.map +1 -1
  40. package/dist/schema.js +281 -16
  41. package/dist/schema.js.map +1 -1
  42. package/dist/wait.js +33 -2
  43. package/dist/wait.js.map +1 -1
  44. package/package.json +2 -2
@@ -0,0 +1,131 @@
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 unless asked. --project / --canvas / --run add projectId / canvasId / runId when typed on this command; --context adds the projectId in effect here (martini use, MARTINI_PROJECT_ID) when --args has none. Only projectId: whether the tool takes a canvasId or a runId is something only its schema knows. --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 get_asset --args \'{"assetId": "<id>"}\' --context # the project martini use set',
30
+ 'martini call <new_tool> --args @args.json',
31
+ ],
32
+ async run(context) {
33
+ const [name, ...extra] = context.positionals;
34
+ if (!name)
35
+ throw new ArgumentError("Name the tool: martini call <tool> --args '{…}'.");
36
+ if (!TOOL_NAME_PATTERN.test(name)) {
37
+ throw new ArgumentError(`"${name}" is not a tool name: tool names are snake_case, like get_asset.`);
38
+ }
39
+ if (extra.length > 0) {
40
+ 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 '{…}'.`);
41
+ }
42
+ if (flagBoolean(context.flags, 'wait')) {
43
+ throw new ArgumentError('martini call does not wait. Run martini wait <ids…> with the ids it returns.');
44
+ }
45
+ const out = flagString(context.flags, 'out') ?? context.output.out;
46
+ if (out !== undefined && isMediaOutPath(out) && flagBoolean(context.flags, 'raw') !== true) {
47
+ 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.` });
48
+ }
49
+ const args = callArguments(context);
50
+ for (const [flag, key] of FORWARDED_CONTEXT) {
51
+ const value = contextFlag(context.flags, flag);
52
+ if (value === undefined)
53
+ continue;
54
+ if (args[key] !== undefined && args[key] !== value) {
55
+ throw new ArgumentError(`${key} is given twice with different values, in --args and as --${flag}. Keep one.`);
56
+ }
57
+ args[key] = value;
58
+ }
59
+ if (flagBoolean(context.flags, 'context') === true && args.projectId === undefined && context.config.projectId) {
60
+ args.projectId = context.config.projectId;
61
+ }
62
+ try {
63
+ return await send(context, name, args);
64
+ }
65
+ catch (error) {
66
+ throw withContextHint(error, context, args);
67
+ }
68
+ },
69
+ };
70
+ async function send(context, name, args) {
71
+ if (flagBoolean(context.flags, 'raw')) {
72
+ assertRawDestination(context.output);
73
+ let raw;
74
+ try {
75
+ raw = await context.client.callToolRaw(name, args);
76
+ }
77
+ catch (error) {
78
+ if (error instanceof CliApiError && error.code === 'NOT_RAW_ELIGIBLE') {
79
+ throw new ArgumentError('This result cannot use --raw --out: it is not exactly one media block.');
80
+ }
81
+ throw error;
82
+ }
83
+ printBytes(raw.bytes, {
84
+ ...context.output,
85
+ contentType: raw.contentType,
86
+ meta: raw.meta,
87
+ fields: selectedFields(context),
88
+ wrote: true,
89
+ });
90
+ delete context.output.out;
91
+ context.output.quiet = true;
92
+ return undefined;
93
+ }
94
+ return context.client.callTool(name, args);
95
+ }
96
+ function withContextHint(error, context, args) {
97
+ const projectId = context.config.projectId;
98
+ if (!(error instanceof CliApiError) ||
99
+ error.code !== 'INVALID_ARGUMENTS' ||
100
+ !projectId ||
101
+ args.projectId !== undefined ||
102
+ !/\bprojectId\b/.test(error.message))
103
+ return error;
104
+ const where = context.config.context ? `${context.config.context.path}, set by martini use` : 'MARTINI_PROJECT_ID';
105
+ const hinted = new CliApiError(error.message, {
106
+ code: error.code,
107
+ status: error.status,
108
+ tool: error.tool,
109
+ hint: `martini call fills no context, so the project in effect here (${projectId}, from ${where}) was not sent. Add --context (or --project ${projectId}), or run the tool's own command, which fills it in.`,
110
+ });
111
+ if (error.result !== undefined)
112
+ hinted.result = error.result;
113
+ return hinted;
114
+ }
115
+ function callArguments(context) {
116
+ const given = ['args', 'json'].filter(flag => context.flags.has(flag));
117
+ if (given.length > 1)
118
+ throw new ArgumentError('Use either --args or --json (its alias), not both.');
119
+ const flag = given[0];
120
+ if (!flag)
121
+ return {};
122
+ const raw = flagString(context.flags, flag);
123
+ if (raw === undefined)
124
+ throw new ArgumentError(`--${flag} needs a value: a JSON object, or @file.`);
125
+ const value = readJsonArgument(raw, `--${flag}`);
126
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
127
+ throw new ArgumentError(`--${flag} must be a JSON object of tool arguments.`);
128
+ }
129
+ return value;
130
+ }
131
+ //# 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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"}
@@ -1,3 +1,4 @@
1
+ import { noApiKeyError } 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,25 @@ 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 noApiKeyError(context.config);
25
+ }
21
26
  export function requireProject(context) {
27
+ requireKey(context);
22
28
  const projectId = contextFlag(context.flags, 'project') ?? context.config.projectId;
23
29
  if (!projectId) {
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).');
30
+ throw new ArgumentError('A project is needed: pass --project <id>, or set it once for this directory with martini use <project-id|name>.', {
31
+ 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.',
32
+ });
25
33
  }
26
34
  return projectId;
27
35
  }
28
36
  export function requireCanvas(context) {
37
+ requireKey(context);
29
38
  const canvasId = contextFlag(context.flags, 'canvas') ?? context.config.canvasId;
30
39
  if (!canvasId) {
31
- throw new ArgumentError('A canvas is needed: pass --canvas <id>, or set it once with MARTINI_CANVAS_ID.');
40
+ 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
41
  }
33
42
  return canvasId;
34
43
  }
@@ -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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"}
@@ -1,11 +1,14 @@
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 EMPTY_PROJECT_FILES_NOTE = "No memory files yet. They are the project's notes for agents and people, kept across sessions: write one with martini files write notes.md @notes.md (or pull a directory, edit, push). project.md is the person's brief; an agent reads it and never writes it.";
11
+ export const FILES_CONFLICTS = join('.martini', 'conflicts');
9
12
  function sha256(content) {
10
13
  return createHash('sha256').update(content).digest('hex');
11
14
  }
@@ -52,6 +55,20 @@ function walk(dir, root = dir) {
52
55
  }
53
56
  return out;
54
57
  }
58
+ function readManifest(path) {
59
+ if (!existsSync(path))
60
+ return null;
61
+ try {
62
+ const parsed = JSON.parse(readFileSync(path, 'utf8'));
63
+ return parsed && typeof parsed === 'object' && parsed.files && typeof parsed.files === 'object' ? parsed : null;
64
+ }
65
+ catch {
66
+ return null;
67
+ }
68
+ }
69
+ function conflictCopyPath(dir, path) {
70
+ return join(dir, FILES_CONFLICTS, ...path.split('/'));
71
+ }
55
72
  function shellQuote(value) {
56
73
  return /^[A-Za-z0-9._\/-]+$/.test(value) ? value : `'${value.replace(/'/g, `'\\''`)}'`;
57
74
  }
@@ -59,7 +76,7 @@ export const files = {
59
76
  name: 'files',
60
77
  summary: 'Project memory files: ls, cat, write, pull <dir>, push <dir>',
61
78
  usage: 'martini files ls | cat <path> | write <path> <content|@file|-> [--append|--create-only] | pull <dir> | push <dir> [--force]',
62
- details: "The project's memory files as a directory. pull writes every file plus .martini/files.json (path → updatedAt, sha256); push sends only changed files, each guarded by expectedUpdatedAt, and refuses one edited server-side since the pull (PROJECT_FILE_CHANGED, reported under skipped) unless --force. 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.",
79
+ 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. behind that is not empty also prints a FILES_BEHIND warning on stderr. ls on a project with no memory files adds a note on what they are for. Results: ls { projectId, files: [{ path, bytes, updatedAt }], note? }; pull { projectId, dir, pulled, kept, conflicts: [{ path, serverCopy }], manifest }; push { projectId, dir, pushed: [path], unchanged: [path], skipped: [{ path, code, error }], behind }.",
63
80
  positionals: [
64
81
  {
65
82
  name: 'ls | cat <path> | write <path> <content|@file|-> | pull <dir> | push <dir>',
@@ -73,7 +90,7 @@ export const files = {
73
90
  {
74
91
  flag: 'force',
75
92
  kind: 'boolean',
76
- description: 'push: overwrite files changed server-side since the pull, and files that appeared meanwhile',
93
+ description: 'push: overwrite files changed server-side since the pull, and files that appeared meanwhile. pull: overwrite files edited here',
77
94
  },
78
95
  ],
79
96
  examples: [
@@ -87,7 +104,12 @@ export const files = {
87
104
  try {
88
105
  switch (sub) {
89
106
  case 'ls': {
90
- return { projectId, files: await listFiles(context, projectId) };
107
+ const listed = await listFiles(context, projectId);
108
+ return {
109
+ projectId,
110
+ files: listed,
111
+ ...(listed.length === 0 ? { note: EMPTY_PROJECT_FILES_NOTE } : {}),
112
+ };
91
113
  }
92
114
  case 'cat': {
93
115
  const path = rest[0];
@@ -111,21 +133,58 @@ export const files = {
111
133
  }
112
134
  case 'pull': {
113
135
  const dir = resolve(context.cwd, rest[0] ?? '.');
136
+ const force = flagBoolean(context.flags, 'force') ?? false;
114
137
  const listed = await listFiles(context, projectId);
138
+ const before = readManifest(join(dir, FILES_MANIFEST));
139
+ const base = before?.projectId === projectId ? before.files : {};
115
140
  const manifest = { projectId, pulledAt: new Date(context.now()).toISOString(), files: {} };
141
+ const kept = [];
142
+ const conflicts = [];
143
+ let pulled = 0;
116
144
  for (const entry of listed) {
117
145
  const file = await context.client.callTool('read_project_file', {
118
146
  projectId,
119
147
  path: entry.path,
120
148
  });
121
149
  const target = join(dir, ...entry.path.split('/'));
150
+ const copy = conflictCopyPath(dir, entry.path);
151
+ const serverSha = sha256(file.content);
152
+ const known = base[entry.path];
153
+ const localSha = existsSync(target) && statSync(target).isFile() ? sha256(readFileSync(target, 'utf8')) : null;
154
+ const editedHere = localSha !== null && localSha !== serverSha && localSha !== known?.sha256;
155
+ if (editedHere && !force) {
156
+ manifest.files[entry.path] = { updatedAt: file.updatedAt, sha256: serverSha };
157
+ if (known && known.sha256 === serverSha) {
158
+ if (existsSync(copy))
159
+ conflicts.push({ path: entry.path, serverCopy: copy });
160
+ else
161
+ kept.push(entry.path);
162
+ continue;
163
+ }
164
+ mkdirSync(dirname(copy), { recursive: true });
165
+ writeFileSync(copy, file.content);
166
+ conflicts.push({ path: entry.path, serverCopy: copy });
167
+ continue;
168
+ }
122
169
  mkdirSync(dirname(target), { recursive: true });
123
170
  writeFileSync(target, file.content);
124
- manifest.files[entry.path] = { updatedAt: file.updatedAt, sha256: sha256(file.content) };
171
+ rmSync(copy, { force: true });
172
+ manifest.files[entry.path] = { updatedAt: file.updatedAt, sha256: serverSha };
173
+ pulled += 1;
125
174
  }
126
175
  mkdirSync(join(dir, '.martini'), { recursive: true });
127
176
  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) };
177
+ const result = { projectId, dir, pulled, kept, conflicts, manifest: join(dir, FILES_MANIFEST) };
178
+ if (conflicts.length > 0) {
179
+ 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)}.`, {
180
+ code: 'PULL_CONFLICT',
181
+ status: 0,
182
+ 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.`,
183
+ });
184
+ error.result = result;
185
+ throw error;
186
+ }
187
+ return result;
129
188
  }
130
189
  case 'push': {
131
190
  const dir = resolve(context.cwd, rest[0] ?? '.');
@@ -141,7 +200,8 @@ export const files = {
141
200
  const pushed = [];
142
201
  const unchanged = [];
143
202
  const skipped = [];
144
- for (const path of walk(dir)) {
203
+ const local = walk(dir);
204
+ for (const path of local) {
145
205
  const abs = join(dir, ...path.split('/'));
146
206
  if (!statSync(abs).isFile())
147
207
  continue;
@@ -151,6 +211,15 @@ export const files = {
151
211
  unchanged.push(path);
152
212
  continue;
153
213
  }
214
+ const copy = conflictCopyPath(dir, path);
215
+ if (!force && existsSync(copy)) {
216
+ skipped.push({
217
+ path,
218
+ code: 'UNRESOLVED_CONFLICT',
219
+ error: `"${path}" still has the server's copy at ${copy}. Merge what you need from it, delete it, and push again.`,
220
+ });
221
+ continue;
222
+ }
154
223
  try {
155
224
  const written = await context.client.callTool('write_project_file', {
156
225
  projectId,
@@ -159,11 +228,18 @@ export const files = {
159
228
  ...(!force ? (known ? { expectedUpdatedAt: known.updatedAt } : { createOnly: true }) : {}),
160
229
  });
161
230
  manifest.files[path] = { updatedAt: written.updatedAt, sha256: sha256(content) };
231
+ rmSync(copy, { force: true });
162
232
  pushed.push(path);
163
233
  }
164
234
  catch (error) {
165
235
  if (error instanceof CliApiError && error.status < 500) {
166
- skipped.push({ path, code: error.code, error: error.message });
236
+ skipped.push({
237
+ path,
238
+ code: error.code,
239
+ error: error.code === 'PROJECT_FILE_CHANGED'
240
+ ? `"${path}" 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.`
241
+ : error.message,
242
+ });
167
243
  continue;
168
244
  }
169
245
  throw error;
@@ -171,7 +247,39 @@ export const files = {
171
247
  }
172
248
  manifest.pulledAt = new Date(context.now()).toISOString();
173
249
  writeFileSync(manifestPath, JSON.stringify(manifest, null, 2) + '\n');
174
- return { projectId, dir, pushed, unchanged: unchanged.length, skipped };
250
+ const here = new Set(local);
251
+ const untouched = new Set(unchanged);
252
+ let behind = null;
253
+ try {
254
+ behind = (await listFiles(context, projectId))
255
+ .filter(entry => here.has(entry.path)
256
+ ? untouched.has(entry.path) && manifest.files[entry.path]?.updatedAt !== entry.updatedAt
257
+ : true)
258
+ .map(entry => entry.path);
259
+ }
260
+ catch (error) {
261
+ 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);
262
+ }
263
+ const result = { projectId, dir, pushed, unchanged, skipped, behind };
264
+ if (behind && behind.length > 0) {
265
+ printWarning('FILES_BEHIND', `${behind.length} file${behind.length === 1 ? ' is' : 's are'} newer on the server than here: ${behind.join(', ')}. Run martini files pull ${shellQuote(rest[0] ?? '.')} to get ${behind.length === 1 ? 'it' : 'them'}.`, context.output);
266
+ }
267
+ if (skipped.length > 0) {
268
+ const codes = new Set(skipped.map(entry => entry.code));
269
+ const changed = skipped.filter(entry => entry.code === 'PROJECT_FILE_CHANGED').map(entry => entry.path);
270
+ 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.` : ''}`, {
271
+ code: codes.size === 1 ? [...codes][0] : 'FILES_NOT_PUSHED',
272
+ status: 0,
273
+ hint: changed.length
274
+ ? `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.`
275
+ : codes.has('UNRESOLVED_CONFLICT')
276
+ ? `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.`
277
+ : 'The reason for each file is under skipped in the result. Your local files are intact.',
278
+ });
279
+ error.result = result;
280
+ throw error;
281
+ }
282
+ return result;
175
283
  }
176
284
  default:
177
285
  throw new ArgumentError('martini files <ls | cat | write | pull | push>');
@@ -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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"}
@@ -0,0 +1,71 @@
1
+ import { flagBoolean } from '../args.js';
2
+ import { printNotice } from '../output.js';
3
+ import { ArgumentError } from '../schema.js';
4
+ export function renderGuideTopics(topics) {
5
+ return topics.map(topic => [`# ${topic.title} (martini guide ${topic.id})`, ...topic.lines].join('\n')).join('\n\n');
6
+ }
7
+ export function renderGuideList(topics) {
8
+ return topics
9
+ .map(topic => {
10
+ const bytes = Buffer.byteLength(renderGuideTopics([topic]));
11
+ const size = bytes < 1000 ? `${bytes} B` : `${(bytes / 1000).toFixed(1)} KB`;
12
+ return `${topic.id}\t${topic.title}\t${topic.lines.length} rule${topic.lines.length === 1 ? '' : 's'}\t${size}`;
13
+ })
14
+ .join('\n');
15
+ }
16
+ export function guideProvenance(state) {
17
+ const hash = state.guide.hash.slice(0, 12);
18
+ return state.source === 'cache' ? `guide: cache ${hash} fetched ${state.fetchedAt ?? ''}` : `guide: baked ${hash}`;
19
+ }
20
+ const LIST_ALIASES = new Set(['topics', 'list', '--list']);
21
+ export const guide = {
22
+ name: 'guide',
23
+ summary: 'The operator rules for working in Martini, by topic (read it once per session)',
24
+ usage: 'martini guide [topic] [--list] [--refresh]',
25
+ details: "Prints the rules a Martini MCP agent is given when it connects — orienting on a board, the library, the timeline, generating and reviewing shots, uploads and lineage, support, and working from the shell — as text: per topic a header line `# <title> (martini guide <id>)`, then its lines. With a topic, only that one; with --list, one line per topic: id, title, how many rules it has, and its size. Asks the server for its current guide first (one conditional request; MARTINI_MANIFEST_REFRESH=0 skips it) and keeps it in the local cache beside the tool list; offline, with no key, or inside a workflow run it prints this build's copy. One JSON notice on stderr says which copy was printed: { notice: { code: GUIDE_SOURCE, message, source, hash, fetchedAt? } }, where source is cache (the server's, fetched at fetchedAt) or baked (this build's). martini guide topics is the same as --list.",
26
+ positionals: [
27
+ {
28
+ name: 'topic',
29
+ description: 'One topic, such as orientation, generation, timeline, or shell (martini guide --list names them all); default every topic',
30
+ },
31
+ ],
32
+ flags: [
33
+ {
34
+ flag: 'list',
35
+ kind: 'boolean',
36
+ description: 'One line per topic: id, title, how many rules it has, and its size',
37
+ },
38
+ { flag: 'refresh', kind: 'boolean', description: "Fetch the server's whole guide, ignoring the cached one" },
39
+ ],
40
+ examples: ['martini guide', 'martini guide generation', 'martini guide --list'],
41
+ async run(context) {
42
+ const [requested, ...extra] = context.positionals;
43
+ if (extra.length > 0) {
44
+ throw new ArgumentError(`Unexpected argument${extra.length > 1 ? 's' : ''} ${extra.map(token => JSON.stringify(token)).join(' ')}: martini guide takes one topic.`);
45
+ }
46
+ const listWord = requested !== undefined && LIST_ALIASES.has(requested.trim().toLowerCase());
47
+ const list = flagBoolean(context.flags, 'list') === true || listWord;
48
+ if (list && requested !== undefined && !listWord)
49
+ throw new ArgumentError('Give either a topic or --list, not both.');
50
+ const runtime = context.guide();
51
+ await runtime.refresh({ force: flagBoolean(context.flags, 'refresh') === true });
52
+ const state = runtime.state;
53
+ const { topics } = state.guide;
54
+ let printed = topics;
55
+ if (requested !== undefined && !listWord) {
56
+ const id = requested.trim().toLowerCase();
57
+ const topic = topics.find(candidate => candidate.id === id);
58
+ if (!topic) {
59
+ throw new ArgumentError(`Unknown guide topic "${requested}". Topics: ${topics.map(candidate => candidate.id).join(', ')}.`, { hint: 'martini guide --list names each topic with its title; martini guide prints them all.' });
60
+ }
61
+ printed = [topic];
62
+ }
63
+ printNotice('GUIDE_SOURCE', guideProvenance(state), context.output, {
64
+ source: state.source,
65
+ hash: state.guide.hash.slice(0, 12),
66
+ ...(state.source === 'cache' && state.fetchedAt ? { fetchedAt: state.fetchedAt } : {}),
67
+ });
68
+ return `${list ? renderGuideList(topics) : renderGuideTopics(printed)}\n`;
69
+ },
70
+ };
71
+ //# sourceMappingURL=guide.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guide.js","sourceRoot":"","sources":["../../src/commands/guide.ts"],"names":[],"mappings":"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"}