@thenavidm/apple-photos-mcp-cli 1.0.0 → 1.0.2

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 (38) hide show
  1. package/lib/bridge.d.ts +43 -0
  2. package/lib/bridge.js +91 -0
  3. package/lib/bridge.js.map +1 -0
  4. package/lib/cli.d.ts +92 -0
  5. package/lib/cli.js +634 -0
  6. package/lib/cli.js.map +1 -0
  7. package/lib/config.d.ts +19 -0
  8. package/lib/config.js +58 -0
  9. package/lib/config.js.map +1 -0
  10. package/lib/errors.d.ts +15 -0
  11. package/lib/errors.js +22 -0
  12. package/lib/errors.js.map +1 -0
  13. package/lib/index.d.ts +12 -0
  14. package/lib/index.js +117 -0
  15. package/lib/index.js.map +1 -0
  16. package/lib/safety.d.ts +27 -0
  17. package/lib/safety.js +70 -0
  18. package/lib/safety.js.map +1 -0
  19. package/lib/server.d.ts +10 -0
  20. package/lib/server.js +38 -0
  21. package/lib/server.js.map +1 -0
  22. package/lib/tools/index.d.ts +55 -0
  23. package/lib/tools/index.js +154 -0
  24. package/lib/tools/index.js.map +1 -0
  25. package/lib/tools/kit.d.ts +48 -0
  26. package/lib/tools/kit.js +64 -0
  27. package/lib/tools/kit.js.map +1 -0
  28. package/package.json +35 -10
  29. package/src/apple_photos_mcp/__pycache__/__init__.cpython-313.pyc +0 -0
  30. package/src/apple_photos_mcp/__pycache__/__main__.cpython-313.pyc +0 -0
  31. package/src/apple_photos_mcp/__pycache__/config.cpython-313.pyc +0 -0
  32. package/src/apple_photos_mcp/__pycache__/doctor.cpython-313.pyc +0 -0
  33. package/src/apple_photos_mcp/__pycache__/library.cpython-313.pyc +0 -0
  34. package/src/apple_photos_mcp/__pycache__/previews.cpython-313.pyc +0 -0
  35. package/src/apple_photos_mcp/__pycache__/safety.cpython-313.pyc +0 -0
  36. package/src/apple_photos_mcp/__pycache__/search.cpython-313.pyc +0 -0
  37. package/src/apple_photos_mcp/__pycache__/server.cpython-313.pyc +0 -0
  38. package/src/apple_photos_mcp/__pycache__/writes.cpython-313.pyc +0 -0
package/lib/cli.js ADDED
@@ -0,0 +1,634 @@
1
+ /**
2
+ * The CLI adapter.
3
+ *
4
+ * `register()` in tools/kit.ts turns a `ToolSpec` into an MCP tool. This turns
5
+ * the same spec into a shell command, from the same `ALL_TOOLS` array, through
6
+ * the same handler and the same `WriteGuard`. Nothing is described twice, so a
7
+ * tool added tomorrow is a command tomorrow and the two surfaces cannot drift.
8
+ *
9
+ * The command IS the tool name. `submit_imagine` runs as `submit-imagine`, and
10
+ * the underscore form works too. Inventing a prettier command tree would mean a
11
+ * hand-written mapping, which is exactly the drift this avoids, and it would
12
+ * force anyone reading the SKILL.md to learn two vocabularies for one action.
13
+ *
14
+ * Zod is the only schema: every flag, its placeholder, its help text and its
15
+ * validation come from the shape the MCP tool already declares.
16
+ */
17
+ import { z } from "zod";
18
+ import { PythonBridge } from "./bridge.js";
19
+ import { PhotosError } from "./errors.js";
20
+ import { loadConfig } from "./config.js";
21
+ import { WriteGuard } from "./safety.js";
22
+ import { ALL_TOOLS } from "./tools/index.js";
23
+ import { runTool } from "./tools/kit.js";
24
+ /**
25
+ * Peel `.optional()`, `.default()` and `.nullable()` to reach the real type.
26
+ *
27
+ * A description can sit on either the wrapper or the inner type depending on
28
+ * the order the tool author chained them, so both are collected on the way down
29
+ * and the outermost one wins.
30
+ */
31
+ function unwrap(schema) {
32
+ let inner = schema;
33
+ let optional = false;
34
+ let description = schema.description;
35
+ for (;;) {
36
+ const typeName = inner._def.typeName;
37
+ if (typeName === "ZodOptional" || typeName === "ZodDefault" || typeName === "ZodNullable") {
38
+ if (typeName !== "ZodNullable")
39
+ optional = true;
40
+ inner = inner._def.innerType;
41
+ description ??= inner.description;
42
+ continue;
43
+ }
44
+ return { inner, optional, description };
45
+ }
46
+ }
47
+ function kindOf(schema) {
48
+ const typeName = schema._def.typeName;
49
+ switch (typeName) {
50
+ case "ZodString":
51
+ return { kind: "string", repeatable: false };
52
+ case "ZodNumber":
53
+ return { kind: "number", repeatable: false };
54
+ case "ZodBoolean":
55
+ return { kind: "boolean", repeatable: false };
56
+ case "ZodEnum":
57
+ return {
58
+ kind: "enum",
59
+ choices: schema._def.values,
60
+ repeatable: false,
61
+ };
62
+ case "ZodArray": {
63
+ // An array of scalars is repeatable (`--style-refs a --style-refs b`). An
64
+ // array of objects is not worth flattening, so it takes JSON.
65
+ //
66
+ // The element kind has to be carried through, not flattened to a string:
67
+ // an array of numbers coerced as strings passes the parser and then fails
68
+ // Zod with "expected number, received string", which reads as the caller's
69
+ // mistake when it was ours.
70
+ const element = unwrap(schema._def.type).inner;
71
+ const elementKind = element._def.typeName;
72
+ if (elementKind === "ZodNumber")
73
+ return { kind: "number", repeatable: true };
74
+ if (elementKind === "ZodString")
75
+ return { kind: "string", repeatable: true };
76
+ if (elementKind === "ZodEnum") {
77
+ return {
78
+ kind: "enum",
79
+ choices: element._def.values,
80
+ repeatable: true,
81
+ };
82
+ }
83
+ return { kind: "json", repeatable: true };
84
+ }
85
+ default:
86
+ // Objects, unions, records and anything else take a JSON literal.
87
+ return { kind: "json", repeatable: false };
88
+ }
89
+ }
90
+ function toFlag(key, schema) {
91
+ const { inner, optional, description } = unwrap(schema);
92
+ const { kind, choices, repeatable } = kindOf(inner);
93
+ return {
94
+ key,
95
+ flag: `--${key.replace(/_/g, "-")}`,
96
+ kind,
97
+ required: !optional,
98
+ repeatable,
99
+ choices,
100
+ help: description ?? "",
101
+ };
102
+ }
103
+ export function flagsFor(shape) {
104
+ return Object.entries(shape).map(([key, schema]) => toFlag(key, schema));
105
+ }
106
+ /**
107
+ * Midjourney's own parameter spellings, accepted as flags.
108
+ *
109
+ * The schema names things in full because a tool description is read by a model
110
+ * that has never seen a Midjourney prompt. A person at a terminal has, and they
111
+ * will type `--ar 16:9`, because that is what the parameter is called
112
+ * everywhere Midjourney documents it. Refusing the name the whole ecosystem
113
+ * uses, to protect a naming convention nobody outside this repo can see, would
114
+ * be the wrong trade.
115
+ */
116
+ export const FLAG_ALIASES = {
117
+ ar: "aspect",
118
+ v: "version",
119
+ s: "stylize",
120
+ c: "chaos",
121
+ sref: "style_refs",
122
+ sw: "style_weight",
123
+ oref: "omni_refs",
124
+ ow: "omni_weight",
125
+ iw: "image_weight",
126
+ q: "quality",
127
+ no: "negative",
128
+ p: "profile",
129
+ r: "repeat",
130
+ id: "job_id",
131
+ job: "job_id",
132
+ };
133
+ class UsageError extends Error {
134
+ }
135
+ /** Accept a flag as `--foo-bar`, `--foo_bar`, or `foo_bar`. */
136
+ function normalize(token) {
137
+ return token.replace(/^--/, "").replace(/-/g, "_");
138
+ }
139
+ function coerce(flag, raw) {
140
+ switch (flag.kind) {
141
+ case "number": {
142
+ const value = Number(raw);
143
+ if (!Number.isFinite(value))
144
+ throw new UsageError(`${flag.flag} expects a number, got '${raw}'.`);
145
+ return value;
146
+ }
147
+ case "enum":
148
+ if (flag.choices && !flag.choices.includes(raw)) {
149
+ throw new UsageError(`${flag.flag} expects one of: ${flag.choices.join(", ")}. Got '${raw}'.`);
150
+ }
151
+ return raw;
152
+ case "json":
153
+ try {
154
+ return JSON.parse(raw);
155
+ }
156
+ catch {
157
+ throw new UsageError(`${flag.flag} expects JSON, got '${raw}'.`);
158
+ }
159
+ default:
160
+ return raw;
161
+ }
162
+ }
163
+ /**
164
+ * Parse argv against a tool's flags.
165
+ *
166
+ * Zod does the real validation afterwards, so this only has to get values into
167
+ * the right JavaScript types and catch the mistakes Zod would otherwise report
168
+ * in terms of a schema the person at the terminal never sees.
169
+ */
170
+ export function parseArgs(argv, flags) {
171
+ const byKey = new Map(flags.map((flag) => [flag.key, flag]));
172
+ const out = {};
173
+ const positional = [];
174
+ for (let index = 0; index < argv.length; index++) {
175
+ const token = argv[index];
176
+ if (!token.startsWith("--")) {
177
+ positional.push(token);
178
+ continue;
179
+ }
180
+ const equals = token.indexOf("=");
181
+ const name = normalize(equals === -1 ? token : token.slice(0, equals));
182
+ const flag = byKey.get(name) ?? byKey.get(FLAG_ALIASES[name] ?? "");
183
+ if (!flag)
184
+ throw new UsageError(`Unknown option ${token}.`);
185
+ if (flag.kind === "boolean") {
186
+ if (equals !== -1) {
187
+ const value = token.slice(equals + 1);
188
+ out[flag.key] = value !== "false" && value !== "0";
189
+ }
190
+ else {
191
+ out[flag.key] = true;
192
+ }
193
+ continue;
194
+ }
195
+ const raw = equals === -1 ? argv[++index] : token.slice(equals + 1);
196
+ if (raw === undefined)
197
+ throw new UsageError(`${flag.flag} expects a value.`);
198
+ const value = coerce(flag, raw);
199
+ if (flag.repeatable) {
200
+ out[flag.key] = [...(out[flag.key] ?? []), value];
201
+ }
202
+ else {
203
+ out[flag.key] = value;
204
+ }
205
+ }
206
+ // One bare argument fills the first flag that is waiting for one, so
207
+ // `search-photos "sunset"` works before anyone reads any help.
208
+ //
209
+ // Required flags come first, then the first unfilled one. Without that
210
+ // fallback a command whose arguments are all optional — search being the
211
+ // obvious one — refuses the single most natural way to call it.
212
+ if (positional.length > 0) {
213
+ const target = flags.find((flag) => flag.required && out[flag.key] === undefined) ??
214
+ flags.find((flag) => out[flag.key] === undefined && flag.kind !== "boolean");
215
+ if (!target)
216
+ throw new UsageError(`Unexpected argument '${positional[0]}'.`);
217
+ if (positional.length > 1)
218
+ throw new UsageError(`Unexpected argument '${positional[1]}'.`);
219
+ const value = coerce(target, positional[0]);
220
+ out[target.key] = target.repeatable ? [value] : value;
221
+ }
222
+ return out;
223
+ }
224
+ /**
225
+ * Keep only the named fields.
226
+ *
227
+ * These endpoints are verbose: one explore page is tens of kilobytes of JSON,
228
+ * most of it layout hints. An agent piping that into its own context pays for
229
+ * every byte. `--select id,status,images` cuts it to what was asked for.
230
+ * Dotted paths descend, and arrays are traversed element-wise.
231
+ */
232
+ export function selectFields(data, paths) {
233
+ if (paths.length === 0)
234
+ return data;
235
+ const pick = (value, segments) => {
236
+ if (segments.length === 0)
237
+ return value;
238
+ if (Array.isArray(value))
239
+ return value.map((item) => pick(item, segments));
240
+ if (value === null || typeof value !== "object")
241
+ return undefined;
242
+ const [head, ...tail] = segments;
243
+ return pick(value[head], tail);
244
+ };
245
+ const apply = (value) => {
246
+ if (Array.isArray(value))
247
+ return value.map(apply);
248
+ if (value === null || typeof value !== "object")
249
+ return value;
250
+ const out = {};
251
+ for (const path of paths) {
252
+ const segments = path.split(".");
253
+ const picked = pick(value, segments);
254
+ if (picked !== undefined)
255
+ out[path] = picked;
256
+ }
257
+ return out;
258
+ };
259
+ // A top-level object holding one array of RESULTS is the common shape, so
260
+ // select into the array rather than flattening the envelope away.
261
+ //
262
+ // The array has to hold objects to count. A single job carries an `images`
263
+ // array of plain URL strings, and treating that as the result set meant
264
+ // `--select id,status` returned the whole job untouched: the envelope was
265
+ // preserved, and the only thing selected was a list of strings that have no
266
+ // fields to select.
267
+ if (data !== null && typeof data === "object" && !Array.isArray(data)) {
268
+ const record = data;
269
+ const arrayKey = Object.keys(record).find((key) => {
270
+ const value = record[key];
271
+ return (Array.isArray(value) &&
272
+ value.length > 0 &&
273
+ value.every((item) => item !== null && typeof item === "object" && !Array.isArray(item)));
274
+ });
275
+ if (arrayKey)
276
+ return { ...record, [arrayKey]: apply(record[arrayKey]) };
277
+ }
278
+ return apply(data);
279
+ }
280
+ function emit(data, format, select) {
281
+ const shaped = selectFields(data, select);
282
+ if (format === "text" && typeof shaped === "string") {
283
+ process.stdout.write(shaped.endsWith("\n") ? shaped : `${shaped}\n`);
284
+ return;
285
+ }
286
+ const json = format === "compact" ? JSON.stringify(shaped) : JSON.stringify(shaped, null, 2);
287
+ process.stdout.write(`${json}\n`);
288
+ }
289
+ /** Errors are JSON on stderr, always, so a caller parses one shape. */
290
+ export function emitError(error) {
291
+ const payload = error instanceof PhotosError
292
+ ? error.toJSON()
293
+ : { error: error?.message ?? String(error) };
294
+ process.stderr.write(`${JSON.stringify(payload, null, 2)}\n`);
295
+ }
296
+ /* -------------------------------------------------------------------- help */
297
+ function commandName(tool) {
298
+ return tool.replace(/_/g, "-");
299
+ }
300
+ const COLUMN = 34;
301
+ /**
302
+ * The name this was invoked as, so examples are copy-pasteable.
303
+ *
304
+ * The package puts two binaries on the same file. Printing `apple-photos-mcp` at
305
+ * someone who typed `apple-photos-cli` hands them a command that works but is not
306
+ * the one in their fingers.
307
+ */
308
+ export function binName() {
309
+ const name = (process.argv[1] ?? "").split("/").pop() ?? "";
310
+ return name.startsWith("apple-photos-cli") ? "apple-photos-cli" : "apple-photos-mcp";
311
+ }
312
+ function renderToolHelp(spec) {
313
+ const flags = flagsFor(spec.schema);
314
+ const required = flags.filter((flag) => flag.required);
315
+ const optional = flags.filter((flag) => !flag.required);
316
+ const usage = [
317
+ `${binName()} ${commandName(spec.name)}`,
318
+ ...required.map((flag) => `${flag.flag} <${flag.kind}>`),
319
+ optional.length > 0 ? "[options]" : "",
320
+ ]
321
+ .filter(Boolean)
322
+ .join(" ");
323
+ const lines = [``, spec.description.trim(), ``, `Usage:`, ` ${usage}`, ``];
324
+ const describe = (list, heading) => {
325
+ if (list.length === 0)
326
+ return;
327
+ lines.push(`${heading}:`);
328
+ for (const flag of list) {
329
+ const placeholder = flag.kind === "boolean" ? "" : ` <${flag.choices ? flag.choices.join("|") : flag.kind}>`;
330
+ const alias = Object.entries(FLAG_ALIASES).find(([, key]) => key === flag.key)?.[0];
331
+ const left = ` ${flag.flag}${alias ? `, --${alias}` : ""}${placeholder}`;
332
+ const help = flag.repeatable ? `${flag.help} Repeatable.` : flag.help;
333
+ if (!help) {
334
+ lines.push(left);
335
+ }
336
+ else if (left.length < COLUMN) {
337
+ lines.push(`${left.padEnd(COLUMN)}${help}`);
338
+ }
339
+ else {
340
+ lines.push(left, `${" ".repeat(COLUMN)}${help}`);
341
+ }
342
+ }
343
+ lines.push(``);
344
+ };
345
+ describe(required, "Required");
346
+ describe(optional, "Options");
347
+ lines.push(`Output:`);
348
+ lines.push(` --json force JSON`);
349
+ lines.push(` --compact force single-line JSON`);
350
+ lines.push(` --select <a,b.c> keep only these fields`);
351
+ lines.push(` --agent compact JSON. Never implies --confirm.`);
352
+ lines.push(``);
353
+ lines.push(`Risk: ${spec.risk}`);
354
+ lines.push(``);
355
+ return lines.join("\n");
356
+ }
357
+ function renderToolList(tools) {
358
+ const width = Math.max(...tools.map((tool) => commandName(tool.name).length)) + 2;
359
+ const bin = binName();
360
+ const lines = [``, `${bin} commands (${tools.length})`, ``];
361
+ for (const tool of tools) {
362
+ const mark = tool.risk === "read" ? " " : tool.risk === "destructive" ? "!" : "*";
363
+ lines.push(` ${mark} ${commandName(tool.name).padEnd(width)}${tool.title}`);
364
+ }
365
+ lines.push(``);
366
+ lines.push(` * changes the library ! cannot be undone from here, needs --confirm`);
367
+ lines.push(``);
368
+ lines.push(` ${bin} which "<what you want>" find the right command`);
369
+ lines.push(` ${bin} <command> --help what it takes`);
370
+ lines.push(` ${bin} schema <command> the JSON schema an MCP client sees`);
371
+ lines.push(` ${bin} doctor check the setup`);
372
+ lines.push(` ${bin} login open the controlled window to sign in`);
373
+ lines.push(` ${bin} capture record what the web app calls, to extend this tool`);
374
+ lines.push(``);
375
+ return lines.join("\n");
376
+ }
377
+ /* ------------------------------------------------------------------- which */
378
+ const STOP_WORDS = new Set([
379
+ "a", "an", "the", "my", "me", "i", "to", "of", "for", "in", "on", "and", "or",
380
+ "how", "do", "does", "can", "get", "want", "with", "from", "is", "are", "it",
381
+ "that", "this", "what", "which", "all", "any", "some", "please",
382
+ ]);
383
+ /**
384
+ * Words people use mapped onto words the tools use.
385
+ *
386
+ * Without this, "make a picture" matches nothing, because every tool says
387
+ * "generate" and "image". A lookup that only works when you already know the
388
+ * vocabulary is not a lookup.
389
+ */
390
+ export const SYNONYMS = {
391
+ picture: ["image"],
392
+ pictures: ["image"],
393
+ photo: ["image"],
394
+ photos: ["image"],
395
+ pic: ["image"],
396
+ pics: ["image"],
397
+ art: ["image"],
398
+ artwork: ["image"],
399
+ render: ["generate", "imagine"],
400
+ renders: ["image"],
401
+ make: ["generate", "imagine"],
402
+ create: ["generate", "imagine"],
403
+ draw: ["generate", "imagine"],
404
+ generation: ["generate"],
405
+ imagining: ["imagine"],
406
+ save: ["download"],
407
+ saving: ["download"],
408
+ fetch: ["download"],
409
+ grab: ["download"],
410
+ disk: ["download"],
411
+ history: ["jobs"],
412
+ past: ["jobs"],
413
+ previous: ["jobs"],
414
+ recent: ["jobs"],
415
+ running: ["queue"],
416
+ rendering: ["queue"],
417
+ pending: ["queue"],
418
+ progress: ["queue"],
419
+ redo: ["rerun"],
420
+ again: ["rerun"],
421
+ reroll: ["rerun"],
422
+ retry: ["rerun"],
423
+ account: ["whoami"],
424
+ login: ["whoami"],
425
+ logged: ["whoami"],
426
+ signed: ["whoami"],
427
+ auth: ["whoami"],
428
+ session: ["whoami"],
429
+ who: ["whoami"],
430
+ style: ["explore"],
431
+ styles: ["explore"],
432
+ inspiration: ["explore"],
433
+ browse: ["explore"],
434
+ folder: ["folders"],
435
+ moodboard: ["moodboards"],
436
+ quota: ["storage"],
437
+ space: ["storage"],
438
+ };
439
+ function terms(text) {
440
+ const words = text
441
+ .toLowerCase()
442
+ .split(/[^a-z0-9]+/)
443
+ .filter((word) => word.length > 1 && !STOP_WORDS.has(word));
444
+ const out = new Set();
445
+ for (const word of words) {
446
+ out.add(word);
447
+ for (const mapped of SYNONYMS[word] ?? [])
448
+ out.add(mapped);
449
+ }
450
+ return [...out];
451
+ }
452
+ /**
453
+ * Resolve a capability described in words to the command that does it.
454
+ *
455
+ * An agent that knows what it wants but not what this tool calls it would
456
+ * otherwise read the full tool list to find out, which is the cost the CLI
457
+ * exists to avoid. Scoring is deliberately dumb: name and title carry the most
458
+ * weight, because a tool called `download_job` should win "download my images"
459
+ * without any cleverness.
460
+ */
461
+ export function whichCommand(query) {
462
+ const wanted = terms(query);
463
+ if (wanted.length === 0)
464
+ return [];
465
+ return ALL_TOOLS.map((tool) => {
466
+ const name = terms(tool.name);
467
+ const whole = tool.name.replace(/_/g, "");
468
+ const title = terms(tool.title);
469
+ const body = terms(tool.description);
470
+ let score = 0;
471
+ for (const word of wanted) {
472
+ // A term that IS the tool's name is not a hint, it is the answer.
473
+ // Without this, "make a picture" scores vary_image over imagine purely
474
+ // because `vary_image` contains the word "image".
475
+ if (word === tool.name || word === whole)
476
+ score += 20;
477
+ if (name.includes(word))
478
+ score += 6;
479
+ else if (name.some((part) => part.startsWith(word) || word.startsWith(part)))
480
+ score += 4;
481
+ if (title.includes(word))
482
+ score += 3;
483
+ if (body.includes(word))
484
+ score += 1;
485
+ }
486
+ return { tool, score };
487
+ })
488
+ .filter((entry) => entry.score > 0)
489
+ .sort((a, b) => b.score - a.score)
490
+ .slice(0, 5);
491
+ }
492
+ /* ---------------------------------------------------------------- dispatch */
493
+ /** The tools this process exposes, with READ_ONLY applied exactly as the server applies it. */
494
+ function visibleTools(guard) {
495
+ return ALL_TOOLS.filter((tool) => !guard.readOnly || tool.risk === "read");
496
+ }
497
+ export function isCliCommand(argv) {
498
+ const first = argv[0];
499
+ if (!first || first.startsWith("-"))
500
+ return false;
501
+ if (first === "tools" || first === "schema" || first === "which")
502
+ return true;
503
+ const name = normalize(first);
504
+ return ALL_TOOLS.some((tool) => tool.name === name);
505
+ }
506
+ export async function runCli(argv) {
507
+ const config = loadConfig();
508
+ const guard = new WriteGuard(config, "cli");
509
+ const tools = visibleTools(guard);
510
+ const command = argv[0];
511
+ const rest = argv.slice(1);
512
+ if (command === "tools") {
513
+ process.stdout.write(renderToolList(tools));
514
+ return 0;
515
+ }
516
+ if (command === "which") {
517
+ const query = rest.filter((token) => !token.startsWith("-")).join(" ");
518
+ const matches = whichCommand(query).filter((entry) => tools.some((tool) => tool.name === entry.tool.name));
519
+ if (rest.includes("--json") || rest.includes("--agent")) {
520
+ emit(matches.map((entry) => ({ command: commandName(entry.tool.name), title: entry.tool.title, risk: entry.tool.risk, score: entry.score })), "json", []);
521
+ }
522
+ else if (matches.length === 0) {
523
+ process.stderr.write(`No command matches "${query}". Run \`${binName()} tools\` for the full list.\n`);
524
+ }
525
+ else {
526
+ for (const entry of matches) {
527
+ process.stdout.write(` ${commandName(entry.tool.name).padEnd(22)}${entry.tool.title}\n`);
528
+ }
529
+ }
530
+ // 2 means no confident match, so a script can branch on it.
531
+ return matches.length > 0 ? 0 : 2;
532
+ }
533
+ if (command === "schema") {
534
+ const wanted = normalize(rest[0] ?? "");
535
+ const spec = tools.find((tool) => tool.name === wanted);
536
+ if (!spec) {
537
+ emitError(new Error(`Unknown command '${rest[0] ?? ""}'. Run \`${binName()} tools\`.`));
538
+ return 1;
539
+ }
540
+ // The same shape an MCP client receives, so the two surfaces are provably one.
541
+ emit(z.object(spec.schema).describe(spec.description), "json", []);
542
+ return 0;
543
+ }
544
+ const name = normalize(command);
545
+ const spec = tools.find((tool) => tool.name === name);
546
+ if (!spec) {
547
+ const hidden = ALL_TOOLS.find((tool) => tool.name === name);
548
+ emitError(new Error(hidden
549
+ ? `${name} is unavailable: this server is running with APPLE_PHOTOS_READ_ONLY=1.`
550
+ : `Unknown command '${command}'. Run \`${binName()} tools\`.`));
551
+ return 1;
552
+ }
553
+ if (rest.includes("--help") || rest.includes("-h")) {
554
+ process.stdout.write(renderToolHelp(spec));
555
+ return 0;
556
+ }
557
+ // `--agent` is one flag for "a program is reading this". It implies compact
558
+ // JSON and nothing else.
559
+ //
560
+ // The equivalent in the reference CLI for this API also implies `--yes`,
561
+ // which is right for a read-only tool and wrong here: this one can spend
562
+ // money, and a flag an agent passes by habit must never be what authorises a
563
+ // charge. Confirmation stays explicit, always.
564
+ const agentMode = rest.includes("--agent");
565
+ const format = agentMode || rest.includes("--compact")
566
+ ? "compact"
567
+ : rest.includes("--json")
568
+ ? "json"
569
+ : "text";
570
+ // `--select` is pulled out here rather than declared as a flag, because it is
571
+ // an output concern shared by every command, not part of any tool's schema.
572
+ const select = [];
573
+ const toolArgv = [];
574
+ for (let index = 0; index < rest.length; index++) {
575
+ const token = rest[index];
576
+ if (token === "--json" || token === "--compact" || token === "--agent")
577
+ continue;
578
+ if (token === "--select") {
579
+ const value = rest[++index];
580
+ if (value === undefined) {
581
+ emitError(new UsageError("--select expects a comma-separated list of fields."));
582
+ return 2;
583
+ }
584
+ select.push(...value.split(",").map((part) => part.trim()).filter(Boolean));
585
+ continue;
586
+ }
587
+ if (token.startsWith("--select=")) {
588
+ select.push(...token
589
+ .slice("--select=".length)
590
+ .split(",")
591
+ .map((part) => part.trim())
592
+ .filter(Boolean));
593
+ continue;
594
+ }
595
+ toolArgv.push(token);
596
+ }
597
+ let client;
598
+ try {
599
+ const parsed = parseArgs(toolArgv, flagsFor(spec.schema));
600
+ // Zod is the authority on validity, exactly as it is for an MCP call.
601
+ const args = z.object(spec.schema).parse(parsed);
602
+ client = new PythonBridge(config);
603
+ const ctx = { bridge: client, config, guard };
604
+ // runTool applies the same guard the MCP path applies, so --confirm,
605
+ // READ_ONLY, ALLOW_DESTRUCTIVE and the audit log behave identically here.
606
+ emit(await runTool(spec, args, ctx), format, select);
607
+ return 0;
608
+ }
609
+ catch (error) {
610
+ if (error instanceof UsageError) {
611
+ emitError(error);
612
+ return 2;
613
+ }
614
+ // A bad --ar or --sref is the caller typing it wrong, the same class of
615
+ // mistake as a missing flag, so it exits 2 rather than 1.
616
+ if (error instanceof PhotosError && error.name === "ValidationError") {
617
+ emitError(error);
618
+ return 2;
619
+ }
620
+ if (error instanceof z.ZodError) {
621
+ const first = error.issues[0];
622
+ emitError(new Error(first
623
+ ? `--${String(first.path.join(".")).replace(/_/g, "-")}: ${first.message}`
624
+ : error.message));
625
+ return 2;
626
+ }
627
+ emitError(error);
628
+ return 1;
629
+ }
630
+ finally {
631
+ void client?.close();
632
+ }
633
+ }
634
+ //# sourceMappingURL=cli.js.map
package/lib/cli.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src-ts/cli.ts"],"names":[],"mappings":"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"}