@martini-film/cli 0.3.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.
Files changed (44) hide show
  1. package/README.md +165 -44
  2. package/dist/api.js +57 -17
  3. package/dist/api.js.map +1 -1
  4. package/dist/approve.js +2 -1
  5. package/dist/approve.js.map +1 -1
  6. package/dist/cli.js +429 -144
  7. package/dist/cli.js.map +1 -1
  8. package/dist/commands/assets.js +141 -25
  9. package/dist/commands/assets.js.map +1 -1
  10. package/dist/commands/call.js +99 -0
  11. package/dist/commands/call.js.map +1 -0
  12. package/dist/commands/context.js +15 -2
  13. package/dist/commands/context.js.map +1 -1
  14. package/dist/commands/files.js +100 -7
  15. package/dist/commands/files.js.map +1 -1
  16. package/dist/commands/guide.js +67 -0
  17. package/dist/commands/guide.js.map +1 -0
  18. package/dist/commands/init.js +196 -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 +63 -78
  23. package/dist/commands/tools.js.map +1 -1
  24. package/dist/commands/use.js +143 -0
  25. package/dist/commands/use.js.map +1 -0
  26. package/dist/config.js +82 -6
  27. package/dist/config.js.map +1 -1
  28. package/dist/generated/guide.json +104 -0
  29. package/dist/generated/manifest.json +10 -2
  30. package/dist/guideCache.js +204 -0
  31. package/dist/guideCache.js.map +1 -0
  32. package/dist/help.js +375 -32
  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 +210 -28
  39. package/dist/output.js.map +1 -1
  40. package/dist/schema.js +99 -14
  41. package/dist/schema.js.map +1 -1
  42. package/dist/wait.js +31 -1
  43. package/dist/wait.js.map +1 -1
  44. package/package.json +2 -2
@@ -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,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
  }
@@ -52,6 +54,20 @@ function walk(dir, root = dir) {
52
54
  }
53
55
  return out;
54
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
+ }
55
71
  function shellQuote(value) {
56
72
  return /^[A-Za-z0-9._\/-]+$/.test(value) ? value : `'${value.replace(/'/g, `'\\''`)}'`;
57
73
  }
@@ -59,7 +75,7 @@ export const files = {
59
75
  name: 'files',
60
76
  summary: 'Project memory files: ls, cat, write, pull <dir>, push <dir>',
61
77
  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.",
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 }.",
63
79
  positionals: [
64
80
  {
65
81
  name: 'ls | cat <path> | write <path> <content|@file|-> | pull <dir> | push <dir>',
@@ -73,7 +89,7 @@ export const files = {
73
89
  {
74
90
  flag: 'force',
75
91
  kind: 'boolean',
76
- 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',
77
93
  },
78
94
  ],
79
95
  examples: [
@@ -111,21 +127,58 @@ export const files = {
111
127
  }
112
128
  case 'pull': {
113
129
  const dir = resolve(context.cwd, rest[0] ?? '.');
130
+ const force = flagBoolean(context.flags, 'force') ?? false;
114
131
  const listed = await listFiles(context, projectId);
132
+ const before = readManifest(join(dir, FILES_MANIFEST));
133
+ const base = before?.projectId === projectId ? before.files : {};
115
134
  const manifest = { projectId, pulledAt: new Date(context.now()).toISOString(), files: {} };
135
+ const kept = [];
136
+ const conflicts = [];
137
+ let pulled = 0;
116
138
  for (const entry of listed) {
117
139
  const file = await context.client.callTool('read_project_file', {
118
140
  projectId,
119
141
  path: entry.path,
120
142
  });
121
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
+ }
122
163
  mkdirSync(dirname(target), { recursive: true });
123
164
  writeFileSync(target, file.content);
124
- manifest.files[entry.path] = { updatedAt: file.updatedAt, sha256: sha256(file.content) };
165
+ rmSync(copy, { force: true });
166
+ manifest.files[entry.path] = { updatedAt: file.updatedAt, sha256: serverSha };
167
+ pulled += 1;
125
168
  }
126
169
  mkdirSync(join(dir, '.martini'), { recursive: true });
127
170
  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) };
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;
129
182
  }
130
183
  case 'push': {
131
184
  const dir = resolve(context.cwd, rest[0] ?? '.');
@@ -141,7 +194,8 @@ export const files = {
141
194
  const pushed = [];
142
195
  const unchanged = [];
143
196
  const skipped = [];
144
- for (const path of walk(dir)) {
197
+ const local = walk(dir);
198
+ for (const path of local) {
145
199
  const abs = join(dir, ...path.split('/'));
146
200
  if (!statSync(abs).isFile())
147
201
  continue;
@@ -151,6 +205,15 @@ export const files = {
151
205
  unchanged.push(path);
152
206
  continue;
153
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
+ }
154
217
  try {
155
218
  const written = await context.client.callTool('write_project_file', {
156
219
  projectId,
@@ -159,6 +222,7 @@ export const files = {
159
222
  ...(!force ? (known ? { expectedUpdatedAt: known.updatedAt } : { createOnly: true }) : {}),
160
223
  });
161
224
  manifest.files[path] = { updatedAt: written.updatedAt, sha256: sha256(content) };
225
+ rmSync(copy, { force: true });
162
226
  pushed.push(path);
163
227
  }
164
228
  catch (error) {
@@ -171,7 +235,36 @@ export const files = {
171
235
  }
172
236
  manifest.pulledAt = new Date(context.now()).toISOString();
173
237
  writeFileSync(manifestPath, JSON.stringify(manifest, null, 2) + '\n');
174
- return { projectId, dir, pushed, unchanged: unchanged.length, skipped };
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;
265
+ throw error;
266
+ }
267
+ return result;
175
268
  }
176
269
  default:
177
270
  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,67 @@
1
+ import { flagBoolean } from '../args.js';
2
+ import { ArgumentError } from '../schema.js';
3
+ export function renderGuideTopics(topics) {
4
+ return topics.map(topic => [`# ${topic.title} (martini guide ${topic.id})`, ...topic.lines].join('\n')).join('\n\n');
5
+ }
6
+ export function renderGuideList(topics) {
7
+ return topics
8
+ .map(topic => {
9
+ const bytes = Buffer.byteLength(renderGuideTopics([topic]));
10
+ const size = bytes < 1000 ? `${bytes} B` : `${(bytes / 1000).toFixed(1)} KB`;
11
+ return `${topic.id}\t${topic.title}\t${topic.lines.length} rule${topic.lines.length === 1 ? '' : 's'}\t${size}`;
12
+ })
13
+ .join('\n');
14
+ }
15
+ export function guideProvenance(state) {
16
+ const hash = state.guide.hash.slice(0, 12);
17
+ return state.source === 'cache' ? `guide: cache ${hash} fetched ${state.fetchedAt ?? ''}` : `guide: baked ${hash}`;
18
+ }
19
+ export const guide = {
20
+ name: 'guide',
21
+ summary: 'The operator rules for working in Martini, by topic (read it once per session)',
22
+ usage: 'martini guide [topic] [--list] [--refresh]',
23
+ 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 line on stderr says which copy was printed (guide: cache <hash> fetched <time>, or guide: baked <hash>).",
24
+ positionals: [
25
+ {
26
+ name: 'topic',
27
+ description: 'One topic, such as orientation, generation, timeline, or shell (martini guide --list names them all); default every topic',
28
+ },
29
+ ],
30
+ flags: [
31
+ {
32
+ flag: 'list',
33
+ kind: 'boolean',
34
+ description: 'One line per topic: id, title, how many rules it has, and its size',
35
+ },
36
+ { flag: 'refresh', kind: 'boolean', description: "Fetch the server's whole guide, ignoring the cached one" },
37
+ ],
38
+ examples: ['martini guide', 'martini guide generation', 'martini guide --list'],
39
+ async run(context) {
40
+ const [requested, ...extra] = context.positionals;
41
+ if (extra.length > 0) {
42
+ throw new ArgumentError(`Unexpected argument${extra.length > 1 ? 's' : ''} ${extra.map(token => JSON.stringify(token)).join(' ')}: martini guide takes one topic.`);
43
+ }
44
+ const list = flagBoolean(context.flags, 'list') === true;
45
+ if (list && requested !== undefined)
46
+ throw new ArgumentError('Give either a topic or --list, not both.');
47
+ const runtime = context.guide();
48
+ await runtime.refresh({ force: flagBoolean(context.flags, 'refresh') === true });
49
+ const state = runtime.state;
50
+ const { topics } = state.guide;
51
+ let printed = topics;
52
+ if (requested !== undefined) {
53
+ const id = requested.trim().toLowerCase();
54
+ const topic = topics.find(candidate => candidate.id === id);
55
+ if (!topic) {
56
+ 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.' });
57
+ }
58
+ printed = [topic];
59
+ }
60
+ if (!context.output.quiet) {
61
+ ;
62
+ (context.output.stderr ?? (text => process.stderr.write(text)))(`${guideProvenance(state)}\n`);
63
+ }
64
+ return `${list ? renderGuideList(topics) : renderGuideTopics(printed)}\n`;
65
+ },
66
+ };
67
+ //# 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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"}
@@ -0,0 +1,196 @@
1
+ import { existsSync, lstatSync, mkdirSync, readFileSync, readlinkSync, realpathSync, statSync, writeFileSync, } from 'node:fs';
2
+ import { basename, dirname, join, resolve, sep } from 'node:path';
3
+ import { flagBoolean, flagString } from '../args.js';
4
+ import { ArgumentError } from '../schema.js';
5
+ export const SKILL_MD = `---
6
+ name: martini
7
+ description: Work on Martini (AI video production) projects from the shell with the martini CLI — read boards, upload and download material, generate and wait for shots, edit project memory files. Use for any Martini task when a shell is available.
8
+ ---
9
+
10
+ # Martini CLI
11
+
12
+ ## When to use
13
+
14
+ Any Martini task: projects, canvases, shots, the library, generation, timelines, project memory files. If the
15
+ Martini MCP connector is also installed, use the CLI anyway — every MCP tool is a \`martini\` command of the same
16
+ name, with its arguments as flags, and the CLI costs no tool-listing context.
17
+
18
+ ## Install and sign in
19
+
20
+ \`\`\`bash
21
+ npm install --global @martini-film/cli # installs the CLI on PATH (or run each command as npx @martini-film/cli <command>)
22
+ martini login # pair this device in the browser (as an agent: --no-wait, relay the code, rerun)
23
+ martini whoami # which organization and key the CLI acts as
24
+ \`\`\`
25
+
26
+ Inside a Martini workflow run the CLI is already signed in through \`.martini/config.json\`; never run
27
+ \`martini login\` there.
28
+
29
+ ## Start here
30
+
31
+ \`\`\`bash
32
+ martini guide # the operator rules: read them once per session, again on a GUIDE_CHANGED warning
33
+ martini guide generation # one topic: orientation, library, timeline, generation, storage, support, shell
34
+ martini use "<project name or id>" # this directory now works in that project
35
+ martini get_board_overview # canvases, shots, library, variables
36
+ \`\`\`
37
+
38
+ \`martini use\` writes \`.martini/context.json\`, which every later command here reads: your shell is new on each
39
+ command, so an exported variable would not last. \`--project\` / \`--canvas\` override it.
40
+
41
+ ## Finding commands
42
+
43
+ - \`martini --help\` lists every command; \`martini <tool> --help\` shows its flags, an example, and its result
44
+ fields. Read it before a tool's first call (\`--help --all\` prints a long page whole).
45
+ - \`martini <tool> --schema <flag> --keys\` lists the keys of a JSON argument (\`--nodes\`, \`--edit\`).
46
+ - \`martini tools\` compares the server's tool list with this build's; \`martini call <tool> --args '{…}'\` sends
47
+ any tool by name.
48
+
49
+ ## Compound commands
50
+
51
+ - \`martini upload <path…>\`: local files to canvas assets; \`referenceImages\` takes their \`assets[].imageUrl\`.
52
+ - \`martini download <asset-id…> --dir <dir>\`: completed assets to files.
53
+ - \`martini wait <asset-id…> --timeout N\`: block until assets (or \`--job\`, \`--run\`, \`--render\`) settle.
54
+ - \`martini files pull <dir>\` / \`martini files push <dir>\`: project memory files as a directory. Push exits 1
55
+ when a file changed on the server since the pull; pull keeps a file you edited.
56
+ - \`martini probe <path|asset-id>…\`: duration, resolution, fps, codecs, sha256 (needs ffprobe).
57
+
58
+ ## Looking at results
59
+
60
+ Nothing is shown until you open a file:
61
+
62
+ \`\`\`bash
63
+ martini inspect_video --video-asset-ids <id> <id> --out-dir review # a contact sheet per shot
64
+ martini view_asset --asset-id <id> --out still.webp # one image
65
+ \`\`\`
66
+
67
+ \`--out-dir\` prints \`{ dir, files: [{ path, about }] }\`; \`about\` names each file's asset, shot, and duration.
68
+
69
+ ## Output and arguments
70
+
71
+ - Results are JSON on stdout (\`guide\`, \`init\`, \`files cat\`, and \`--help\` print text); errors are one JSON
72
+ object on stderr. Exit 0 means the command did all you asked. Otherwise read \`error.code\`; work that was
73
+ done is still on stdout (a push's \`skipped\`, a wait's \`pending\`).
74
+ - \`--fields a,b.c\` keeps only those paths of the result; \`--out <path>\` writes the result to a file.
75
+ - Object arguments take JSON (\`--placement '{"rightOf": "<id>"}'\`), a list of objects takes \`@file\`
76
+ (\`--nodes @nodes.json\`), and \`--args @args.json\` passes the whole arguments object.
77
+ - An asset id works in either spelling: the bare id, or \`asset-<id>\`.
78
+
79
+ ## Waiting and approval
80
+
81
+ - Single-item generation and rendering wait by default (\`--wait\` / \`--no-wait\`). Fan a batch out, then run
82
+ \`martini wait <ids…> --timeout N\` once; a wait that runs out exits 4 and prints the resume command, and a
83
+ failed shot exits 1.
84
+ - Generations cost olives and cannot be undone: agree the plan with the user first. \`generate_nodes\`,
85
+ \`upscale_assets\`, and \`enhance_draft\` quote first; \`--approve --max-olives N\` approves under the cap in one
86
+ command. Over the cap nothing starts (exit 5): ask the user before raising it.
87
+
88
+ ## Exit codes
89
+
90
+ 0 done, all of it · 1 tool error · 2 usage · 3 auth · 4 not ready or timed out · 5 over budget (olives, or a quote over --max-olives)
91
+ `;
92
+ export const AGENTS_MD_MARKER = '## Martini CLI';
93
+ export const AGENTS_MD_POINTER = `${AGENTS_MD_MARKER}
94
+
95
+ Martini is available as the \`martini\` command; the skill at \`.agents/skills/martini/SKILL.md\` says how to use it. Start with \`martini guide\`.
96
+ `;
97
+ const SKILL_DIRECTORIES = ['.agents/skills', '.claude/skills'];
98
+ function resolveLinks(path, depth = 0) {
99
+ try {
100
+ return realpathSync(path);
101
+ }
102
+ catch {
103
+ }
104
+ if (depth < 40) {
105
+ try {
106
+ if (lstatSync(path).isSymbolicLink())
107
+ return resolveLinks(resolve(dirname(path), readlinkSync(path)), depth + 1);
108
+ }
109
+ catch {
110
+ }
111
+ }
112
+ const parent = dirname(path);
113
+ return parent === path ? path : join(resolveLinks(parent, depth + 1), basename(path));
114
+ }
115
+ function skillTargets(root) {
116
+ const [shared, claude] = SKILL_DIRECTORIES.map(directory => join(root, directory));
117
+ const sameDirectory = existsOrLinked(claude) && resolveLinks(claude) === resolveLinks(shared);
118
+ return (sameDirectory ? [shared] : [shared, claude]).map(directory => join(directory, 'martini', 'SKILL.md'));
119
+ }
120
+ function existsOrLinked(path) {
121
+ try {
122
+ lstatSync(path);
123
+ return true;
124
+ }
125
+ catch {
126
+ return false;
127
+ }
128
+ }
129
+ function writeSkill(path, force) {
130
+ if (existsSync(path)) {
131
+ if (readFileSync(path, 'utf8') === SKILL_MD)
132
+ return 'unchanged';
133
+ if (!force)
134
+ return 'kept';
135
+ }
136
+ mkdirSync(dirname(path), { recursive: true });
137
+ writeFileSync(path, SKILL_MD);
138
+ return 'written';
139
+ }
140
+ function writePointer(path) {
141
+ const existing = existsSync(path) ? readFileSync(path, 'utf8') : '';
142
+ if (existing.includes(AGENTS_MD_MARKER))
143
+ return 'unchanged';
144
+ writeFileSync(path, `${existing.trimEnd()}${existing.trim() ? '\n\n' : ''}${AGENTS_MD_POINTER}`);
145
+ return 'written';
146
+ }
147
+ export const init = {
148
+ name: 'init',
149
+ summary: 'Install the Martini agent skill and a three-line AGENTS.md pointer in a repository (prints them without --write)',
150
+ usage: 'martini init [--write] [--force] [--dir <repo>]',
151
+ details: 'Without --write, prints the skill file, a line ---, and the AGENTS.md pointer, and writes nothing. With --write, installs the skill at <repo>/.agents/skills/martini/SKILL.md (read by Codex, Cursor, and other agents) and <repo>/.claude/skills/martini/SKILL.md (Claude Code) — only the first when .claude/skills is a link to .agents/skills — and appends the pointer to <repo>/AGENTS.md (created if absent) unless it already has a "## Martini CLI" section. A skill file with other content is kept unless --force; nothing outside <repo> is written. The skill is short on purpose: it sends the agent to martini guide for the operator rules and to martini <tool> --help for flags. Result: { ok, skills: [{ path, status: written | unchanged | kept }], agentsMd: { path, status: written | unchanged } }.',
152
+ flags: [
153
+ { flag: 'write', kind: 'boolean', description: 'Install the skill and the pointer instead of printing them' },
154
+ {
155
+ flag: 'force',
156
+ kind: 'boolean',
157
+ description: 'With --write: overwrite a skill file whose content differs (an older or edited copy)',
158
+ },
159
+ {
160
+ flag: 'dir',
161
+ kind: 'string',
162
+ value: '<repo>',
163
+ description: 'With --write: the repository to install into (default: the working directory)',
164
+ },
165
+ ],
166
+ examples: ['martini init', 'martini init --write', 'martini init --write --force --dir ../my-film'],
167
+ async run(context) {
168
+ if (context.positionals.length > 0) {
169
+ throw new ArgumentError(`Unexpected argument ${JSON.stringify(context.positionals[0])}: martini init installs into a repository directory; name it with --dir <repo>.`);
170
+ }
171
+ const write = flagBoolean(context.flags, 'write') === true;
172
+ const force = flagBoolean(context.flags, 'force') === true;
173
+ const dir = flagString(context.flags, 'dir');
174
+ if (!write) {
175
+ if (force || dir !== undefined)
176
+ throw new ArgumentError('--force and --dir apply only with --write.');
177
+ return `${SKILL_MD}\n---\n\n${AGENTS_MD_POINTER}`;
178
+ }
179
+ const root = resolve(context.cwd, dir ?? '.');
180
+ if (!existsSync(root) || !statSync(root).isDirectory()) {
181
+ throw new ArgumentError(`--dir ${dir ?? root} is not a directory.`);
182
+ }
183
+ const agentsMd = join(root, 'AGENTS.md');
184
+ const targets = skillTargets(root);
185
+ const realRoot = realpathSync(root);
186
+ for (const path of [...targets, agentsMd]) {
187
+ const real = resolveLinks(path);
188
+ if (real !== realRoot && !real.startsWith(`${realRoot}${sep}`)) {
189
+ throw new ArgumentError(`${path} resolves to ${real}, outside ${root} (through a link); martini init writes only inside the repository. Nothing was written.`, { hint: 'Fix the link, or install by hand from what martini init prints.' });
190
+ }
191
+ }
192
+ const skills = targets.map(path => ({ path, status: writeSkill(path, force) }));
193
+ return { ok: true, skills, agentsMd: { path: agentsMd, status: writePointer(agentsMd) } };
194
+ },
195
+ };
196
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}