ios-agent-mcp 2.5.0 → 2.6.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.
@@ -0,0 +1,548 @@
1
+ import { spawn } from "node:child_process";
2
+ import { createHash } from "node:crypto";
3
+ import { mkdir, readFile, writeFile, rename, readdir, stat, lstat, open, rm, } from "node:fs/promises";
4
+ import { resolve, join, relative, isAbsolute } from "node:path";
5
+ import { z } from "zod";
6
+ const Check = z
7
+ .object({
8
+ id: z.string().regex(/^[a-z0-9-]+$/),
9
+ description: z.string().min(1),
10
+ command: z.string().min(1),
11
+ args: z.array(z.string()),
12
+ timeoutSeconds: z.number().int().min(1).max(1800).default(600),
13
+ artifacts: z.array(z.string()).default([]),
14
+ })
15
+ .strict();
16
+ const Config = z
17
+ .object({
18
+ protectedFiles: z.array(z.string().min(1)).min(1),
19
+ checks: z.array(Check).min(1),
20
+ screens: z
21
+ .array(z.object({
22
+ name: z.string().min(1),
23
+ checkId: z.string(),
24
+ artifact: z.string().min(1),
25
+ }))
26
+ .min(1),
27
+ })
28
+ .strict();
29
+ const Plan = z.object({
30
+ summary: z.string().min(1),
31
+ screens: z.array(z.string()).min(1),
32
+ features: z.array(z.string()).min(1),
33
+ criteria: z
34
+ .array(z.object({
35
+ id: z.string(),
36
+ description: z.string().min(1),
37
+ checkIds: z.array(z.string()).min(1),
38
+ }))
39
+ .min(1),
40
+ });
41
+ const hash = (text) => createHash("sha256").update(text).digest("hex");
42
+ async function save(path, data) {
43
+ await writeFile(path + ".tmp", JSON.stringify(data, null, 2) + "\n");
44
+ await rename(path + ".tmp", path);
45
+ }
46
+ function local(root, path) {
47
+ if (path.replaceAll("\\", "/").startsWith(".ios-agent/loop"))
48
+ throw Error("Artifacts cannot target loop state");
49
+ const full = resolve(root, path);
50
+ const rel = relative(root, full);
51
+ if (isAbsolute(path) ||
52
+ rel.startsWith("..") ||
53
+ !rel ||
54
+ rel.replaceAll("\\", "/").startsWith(".ios-agent/loop"))
55
+ throw Error(`Expected project-relative artifact: ${path}`);
56
+ return full;
57
+ }
58
+ function validate(config, plan) {
59
+ const artifacts = config.checks.flatMap((c) => c.artifacts);
60
+ for (const artifact of artifacts) {
61
+ if (!artifact.startsWith(".ios-agent/evidence/") ||
62
+ artifact
63
+ .split("/")
64
+ .some((part) => !part || part === "." || part === "..") ||
65
+ artifact.includes("\\"))
66
+ throw Error("Artifacts must use canonical paths inside .ios-agent/evidence/");
67
+ }
68
+ if (new Set(artifacts).size !== artifacts.length)
69
+ throw Error("Duplicate artifact ownership");
70
+ const ids = new Set(config.checks.map((c) => c.id));
71
+ if (ids.size !== config.checks.length)
72
+ throw Error("Duplicate check IDs");
73
+ for (const screen of config.screens) {
74
+ const check = config.checks.find((c) => c.id === screen.checkId);
75
+ if (!check?.artifacts.includes(screen.artifact))
76
+ throw Error(`Screen ${screen.name} lacks a producing check/artifact`);
77
+ }
78
+ if (plan) {
79
+ if (plan.screens.some((name) => !config.screens.some((screen) => screen.name === name)) ||
80
+ config.screens.some((screen) => !plan.screens.includes(screen.name)))
81
+ throw Error("Plan must cover exactly the configured screens");
82
+ }
83
+ if (plan)
84
+ for (const criterion of plan.criteria)
85
+ for (const id of criterion.checkIds)
86
+ if (!ids.has(id))
87
+ throw Error(`Unknown acceptance check ${id}`);
88
+ }
89
+ // Spawn argv directly: no shell interpretation. Logs are bounded; long processes have a hard deadline.
90
+ export async function runProcess(command, args, cwd, timeoutSeconds, log, input) {
91
+ const handle = await open(log, "w");
92
+ let bytes = 0;
93
+ let stdout = "";
94
+ const writes = [];
95
+ try {
96
+ return await new Promise((done) => {
97
+ const child = spawn(command, args, {
98
+ cwd,
99
+ stdio: ["pipe", "pipe", "pipe"],
100
+ detached: process.platform !== "win32",
101
+ });
102
+ let timedOut = false;
103
+ let interrupted = false;
104
+ let settled = false;
105
+ let escalation;
106
+ const kill = (signal) => {
107
+ try {
108
+ if (process.platform !== "win32" && child.pid)
109
+ process.kill(-child.pid, signal);
110
+ else
111
+ child.kill(signal);
112
+ }
113
+ catch { }
114
+ };
115
+ const stop = () => {
116
+ kill("SIGTERM");
117
+ escalation ??= setTimeout(() => kill("SIGKILL"), 5000);
118
+ escalation.unref();
119
+ };
120
+ const interrupt = () => {
121
+ interrupted = true;
122
+ stop();
123
+ };
124
+ process.once("SIGINT", interrupt);
125
+ process.once("SIGTERM", interrupt);
126
+ const timer = setTimeout(() => {
127
+ timedOut = true;
128
+ stop();
129
+ }, timeoutSeconds * 1000);
130
+ const record = (data) => {
131
+ if (bytes < 4 * 1024 * 1024) {
132
+ bytes += data.length;
133
+ writes.push(handle.write(data));
134
+ }
135
+ };
136
+ child.stdout.on("data", (data) => {
137
+ if (stdout.length < 4 * 1024 * 1024)
138
+ stdout += data.toString();
139
+ record(data);
140
+ });
141
+ child.stderr.on("data", record);
142
+ const finish = (exitCode) => {
143
+ if (settled)
144
+ return;
145
+ settled = true;
146
+ clearTimeout(timer);
147
+ if (escalation)
148
+ clearTimeout(escalation);
149
+ process.removeListener("SIGINT", interrupt);
150
+ process.removeListener("SIGTERM", interrupt);
151
+ done({ exitCode, timedOut, stdout, interrupted });
152
+ };
153
+ child.on("error", (error) => {
154
+ record(Buffer.from(error.message));
155
+ finish(null);
156
+ });
157
+ child.on("close", finish);
158
+ child.stdin.on("error", () => { });
159
+ child.stdin.end(input);
160
+ });
161
+ }
162
+ finally {
163
+ await Promise.all(writes);
164
+ await handle.close();
165
+ }
166
+ }
167
+ async function safeArtifact(root, path) {
168
+ const full = local(root, path);
169
+ let part = root;
170
+ for (const component of relative(root, full).split("/")) {
171
+ part = join(part, component);
172
+ try {
173
+ if ((await lstat(part)).isSymbolicLink())
174
+ throw Error(`Symlink evidence path rejected: ${path}`);
175
+ }
176
+ catch (e) {
177
+ if (e.code !== "ENOENT")
178
+ throw e;
179
+ }
180
+ }
181
+ return full;
182
+ }
183
+ async function fingerprint(root) {
184
+ const entries = [];
185
+ async function walk(dir) {
186
+ for (const ent of (await readdir(dir, { withFileTypes: true })).sort((a, b) => a.name.localeCompare(b.name))) {
187
+ if ([
188
+ ".git",
189
+ ".ios-agent",
190
+ "node_modules",
191
+ ".build",
192
+ "DerivedData",
193
+ "build",
194
+ "xcuserdata",
195
+ "project.xcworkspace",
196
+ ].includes(ent.name) ||
197
+ ent.name.endsWith(".xcresult"))
198
+ continue;
199
+ const path = join(dir, ent.name);
200
+ if (ent.isDirectory())
201
+ await walk(path);
202
+ else if (ent.isSymbolicLink())
203
+ throw Error(`Symlink source not supported: ${path}`);
204
+ else if (ent.isFile())
205
+ entries.push(relative(root, path) + ":" + hash(await readFile(path)));
206
+ }
207
+ }
208
+ await walk(root);
209
+ return hash(entries.join("\n"));
210
+ }
211
+ async function claude(root, prompt, log, planning) {
212
+ const args = [
213
+ "-p",
214
+ "--output-format",
215
+ "json",
216
+ "--max-turns",
217
+ "12",
218
+ "--strict-mcp-config",
219
+ "--mcp-config",
220
+ '{"mcpServers":{}}',
221
+ "--tools",
222
+ planning ? "Read,Glob,Grep" : "Read,Glob,Grep,Edit,Write",
223
+ "--allowedTools",
224
+ planning ? "Read,Glob,Grep" : "Read,Glob,Grep,Edit,Write",
225
+ "--permission-mode",
226
+ planning ? "default" : "acceptEdits",
227
+ ];
228
+ const result = await runProcess("claude", args, root, 600, log, prompt);
229
+ if (result.exitCode !== 0 || result.timedOut || result.interrupted)
230
+ throw Error(`Claude did not finish. See ${log}`);
231
+ const raw = JSON.parse(result.stdout);
232
+ if (raw.is_error)
233
+ throw Error(`Claude returned an error. See ${log}`);
234
+ return String(raw.result ?? "");
235
+ }
236
+ export async function appLoop(argv) {
237
+ const action = argv[0];
238
+ const value = (flag) => {
239
+ const i = argv.indexOf(flag);
240
+ return i < 0 ? undefined : argv[i + 1];
241
+ };
242
+ const root = resolve(value("--project") ?? process.cwd());
243
+ const directory = join(root, ".ios-agent", "loop");
244
+ await mkdir(directory, { recursive: true });
245
+ const statePath = join(directory, "state.json");
246
+ if (action === "status") {
247
+ console.log(await readFile(statePath, "utf8"));
248
+ return;
249
+ }
250
+ const lockPath = join(directory, "lock");
251
+ let lock;
252
+ try {
253
+ lock = await open(lockPath, "wx");
254
+ }
255
+ catch (e) {
256
+ if (e.code !== "EEXIST")
257
+ throw e;
258
+ const pid = Number(await readFile(lockPath, "utf8"));
259
+ if (!Number.isInteger(pid) || pid <= 0)
260
+ throw Error("Unrecognized loop lock; inspect before removing it.");
261
+ let alive = true;
262
+ try {
263
+ process.kill(pid, 0);
264
+ }
265
+ catch (error) {
266
+ if (error.code === "ESRCH")
267
+ alive = false;
268
+ }
269
+ if (alive)
270
+ throw Error("Another loop is active.");
271
+ await rm(lockPath);
272
+ lock = await open(lockPath, "wx");
273
+ }
274
+ await lock.writeFile(String(process.pid));
275
+ try {
276
+ if (action === "init") {
277
+ try {
278
+ await stat(statePath);
279
+ throw Error("A saved loop already exists; use resume.");
280
+ }
281
+ catch (e) {
282
+ if (e.code !== "ENOENT")
283
+ throw e;
284
+ }
285
+ const briefPath = value("--brief");
286
+ const configPath = value("--checks");
287
+ if (!briefPath || !configPath)
288
+ throw Error("init requires --brief brief.md --checks checks.json");
289
+ const brief = await readFile(resolve(root, briefPath), "utf8");
290
+ const config = Config.parse(JSON.parse(await readFile(resolve(root, configPath), "utf8")));
291
+ validate(config);
292
+ for (const c of config.checks)
293
+ for (const a of c.artifacts)
294
+ local(root, a);
295
+ const prompt = `Plan an iOS app from this brief. Do not edit files. Return ONLY JSON, no markdown, shaped {"summary":"...","screens":["..."],"features":["..."],"criteria":[{"id":"...","description":"...","checkIds":["existing-check-id"]}]}. Every criterion needs supplied check IDs. Use exactly the supplied screen names in screens. Do not invent verification claims.\nBRIEF:\n${brief}\nCHECKS:\n${JSON.stringify(config)}`;
296
+ const response = value("--plan")
297
+ ? await readFile(resolve(root, value("--plan")), "utf8")
298
+ : await claude(root, prompt, join(directory, "plan.log"), true);
299
+ const plan = Plan.parse(JSON.parse(response.replace(/^```(?:json)?\s*|\s*```$/g, "")));
300
+ validate(config, plan);
301
+ const limit = Number(value("--attempts") ?? 3);
302
+ if (!Number.isInteger(limit) || limit < 1 || limit > 10)
303
+ throw Error("Attempts must be 1–10");
304
+ const protectedHashes = {};
305
+ for (const file of config.protectedFiles)
306
+ protectedHashes[file] = hash(await readFile(local(root, file), "utf8"));
307
+ const state = {
308
+ version: 1,
309
+ protectedHashes,
310
+ brief,
311
+ plan,
312
+ config,
313
+ attempts: 0,
314
+ limit,
315
+ status: "planned",
316
+ results: [],
317
+ events: [],
318
+ };
319
+ await save(statePath, state);
320
+ console.log(`Plan saved: ${statePath}. Review checks/plan, then run loop resume.`);
321
+ return;
322
+ }
323
+ if (action !== "resume")
324
+ throw Error("Usage: ios-agent-mcp loop init|resume|status --project PATH [--brief brief.md --checks checks.json --attempts 3] [--verify-only]");
325
+ const parsed = JSON.parse(await readFile(statePath, "utf8"));
326
+ const StateSchema = z
327
+ .object({
328
+ version: z.literal(1),
329
+ protectedHashes: z.record(z.string()),
330
+ brief: z.string(),
331
+ plan: Plan,
332
+ config: Config,
333
+ attempts: z.number().int().min(0).max(10),
334
+ limit: z.number().int().min(1).max(10),
335
+ status: z.enum([
336
+ "planned",
337
+ "implementing",
338
+ "checking",
339
+ "blocked",
340
+ "complete",
341
+ ]),
342
+ reason: z.string().optional(),
343
+ fingerprint: z.string().optional(),
344
+ results: z.array(z.object({
345
+ id: z.string(),
346
+ passed: z.boolean(),
347
+ exitCode: z.number().int().nullable(),
348
+ log: z.string(),
349
+ logHash: z.string().optional(),
350
+ artifacts: z.array(z.string()),
351
+ artifactHashes: z.record(z.string()).optional(),
352
+ reason: z.string().optional(),
353
+ })),
354
+ events: z.array(z.object({ at: z.string(), message: z.string() })),
355
+ })
356
+ .strict();
357
+ const state = StateSchema.parse(parsed);
358
+ if (new Set(state.results.map((r) => r.id)).size !== state.results.length ||
359
+ state.results.some((r) => !state.config.checks.some((c) => c.id === r.id &&
360
+ JSON.stringify(c.artifacts) === JSON.stringify(r.artifacts))))
361
+ throw Error("Invalid saved check results");
362
+ state.config = Config.parse(state.config);
363
+ state.plan = Plan.parse(state.plan);
364
+ validate(state.config, state.plan);
365
+ if (!Number.isInteger(state.limit) ||
366
+ state.limit < 1 ||
367
+ state.limit > 10 ||
368
+ !Number.isInteger(state.attempts) ||
369
+ state.attempts < 0)
370
+ throw Error("Invalid saved retry budget");
371
+ const checkProtected = async () => {
372
+ for (const file of state.config.protectedFiles)
373
+ if (hash(await readFile(local(root, file), "utf8")) !==
374
+ state.protectedHashes[file])
375
+ throw Error(`Frozen verification file changed: ${file}. Restore it before resuming.`);
376
+ };
377
+ await checkProtected();
378
+ const evidenceValid = async (r) => {
379
+ try {
380
+ if (!r.log.startsWith(".ios-agent/loop/") ||
381
+ hash(await readFile(resolve(root, r.log))) !== r.logHash)
382
+ return false;
383
+ }
384
+ catch {
385
+ return false;
386
+ }
387
+ for (const file of r.artifacts) {
388
+ try {
389
+ if (hash(await readFile(await safeArtifact(root, file), "base64")) !==
390
+ r.artifactHashes?.[file])
391
+ return false;
392
+ }
393
+ catch {
394
+ return false;
395
+ }
396
+ }
397
+ return true;
398
+ };
399
+ for (const r of state.results)
400
+ if (r.passed && !(await evidenceValid(r)))
401
+ r.passed = false;
402
+ const event = async (message) => {
403
+ state.events.push({ at: new Date().toISOString(), message });
404
+ await save(statePath, state);
405
+ console.log(message);
406
+ };
407
+ const resolvedArtifacts = state.config.checks.flatMap((c) => c.artifacts.map((a) => local(root, a)));
408
+ if (new Set(resolvedArtifacts).size !== resolvedArtifacts.length)
409
+ throw Error("Duplicate resolved artifact paths");
410
+ const initialFingerprint = await fingerprint(root);
411
+ if (state.status === "complete" &&
412
+ state.fingerprint === initialFingerprint &&
413
+ state.results.length === state.config.checks.length &&
414
+ state.results.every((r) => r.passed)) {
415
+ console.log("Already complete; source unchanged. Saved evidence retained.");
416
+ return;
417
+ }
418
+ if (state.fingerprint !== initialFingerprint)
419
+ state.results = [];
420
+ const verify = async () => {
421
+ await checkProtected();
422
+ state.fingerprint = await fingerprint(root);
423
+ const before = state.fingerprint;
424
+ state.status = "checking";
425
+ await event("Running acceptance checks");
426
+ for (const check of state.config.checks) {
427
+ if (state.results.some((r) => r.id === check.id && r.passed))
428
+ continue;
429
+ const log = join(directory, `${state.attempts}-${check.id}.log`);
430
+ for (const a of check.artifacts)
431
+ await rm(await safeArtifact(root, a), { force: true });
432
+ const output = await runProcess(check.command, check.args, root, check.timeoutSeconds, log);
433
+ if (output.interrupted)
434
+ throw Error("Interrupted; saved checks can be resumed.");
435
+ let passed = output.exitCode === 0 && !output.timedOut;
436
+ let reason = output.timedOut ? "Timed out" : undefined;
437
+ for (const a of check.artifacts) {
438
+ try {
439
+ const info = await stat(await safeArtifact(root, a));
440
+ if (!info.isFile() || !info.size)
441
+ throw Error("empty");
442
+ }
443
+ catch {
444
+ passed = false;
445
+ reason = `Missing/nonempty artifact required: ${a}`;
446
+ }
447
+ }
448
+ const artifactHashes = {};
449
+ if (passed)
450
+ for (const a of check.artifacts)
451
+ artifactHashes[a] = hash(await readFile(await safeArtifact(root, a), "base64"));
452
+ const result = {
453
+ logHash: hash(await readFile(log)),
454
+ artifactHashes,
455
+ id: check.id,
456
+ passed,
457
+ exitCode: output.exitCode,
458
+ log: relative(root, log),
459
+ artifacts: check.artifacts,
460
+ reason,
461
+ };
462
+ state.results = state.results
463
+ .filter((r) => r.id !== check.id)
464
+ .concat(result);
465
+ await event(`${check.id}: ${passed ? "PASS" : "FAIL"}`);
466
+ }
467
+ if ((await fingerprint(root)) !== before) {
468
+ state.results = [];
469
+ state.fingerprint = undefined;
470
+ await save(statePath, state);
471
+ throw Error("Source changed during verification; rerun checks.");
472
+ }
473
+ return (state.results.length === state.config.checks.length &&
474
+ state.results.every((r) => r.passed));
475
+ };
476
+ while (true) {
477
+ if (await verify()) {
478
+ await checkProtected();
479
+ state.status = "complete";
480
+ state.reason = undefined;
481
+ await event("Complete: every configured acceptance check passed. Screenshots are evidence, not automatic visual judgment.");
482
+ return;
483
+ }
484
+ if (argv.includes("--verify-only") || state.attempts >= state.limit) {
485
+ state.status = "blocked";
486
+ state.reason = argv.includes("--verify-only")
487
+ ? "Verification failed; no agent changes requested."
488
+ : "Retry limit reached.";
489
+ await event(state.reason);
490
+ process.exitCode = 1;
491
+ return;
492
+ }
493
+ state.attempts++;
494
+ state.status = "implementing";
495
+ await event(`Implementation attempt ${state.attempts}/${state.limit}`);
496
+ const contract = JSON.stringify({
497
+ brief: state.brief,
498
+ plan: state.plan,
499
+ config: state.config,
500
+ protectedHashes: state.protectedHashes,
501
+ });
502
+ const failures = await Promise.all(state.results
503
+ .filter((r) => !r.passed)
504
+ .map(async (r) => ({
505
+ check: r.id,
506
+ reason: r.reason,
507
+ output: (await readFile(resolve(root, r.log), "utf8")).slice(-14000),
508
+ })));
509
+ try {
510
+ await claude(root, `Implement/fix this iOS app. Edit implementation source within this project only. Never edit frozen files: ${state.config.protectedFiles.join(", ")}. Never weaken checks or edit .ios-agent/loop, the check configuration or verification scripts. No git commits, publishing, or dependency installation. Your edits will be independently verified.\n${contract}\nFAILURES:\n${JSON.stringify(failures)}`, join(directory, `agent-${state.attempts}.log`), false);
511
+ }
512
+ catch (e) {
513
+ state.status = "blocked";
514
+ state.reason = String(e);
515
+ await event(state.reason);
516
+ process.exitCode = 1;
517
+ return;
518
+ }
519
+ const disk = JSON.parse(await readFile(statePath, "utf8"));
520
+ if (JSON.stringify({
521
+ brief: disk.brief,
522
+ plan: disk.plan,
523
+ config: disk.config,
524
+ protectedHashes: disk.protectedHashes,
525
+ }) !== contract)
526
+ throw Error("Agent changed frozen acceptance contract; inspect before resuming.");
527
+ await checkProtected();
528
+ state.results = [];
529
+ state.fingerprint = undefined;
530
+ await save(statePath, state);
531
+ }
532
+ }
533
+ catch (error) {
534
+ try {
535
+ const existing = JSON.parse(await readFile(statePath, "utf8"));
536
+ existing.status = "blocked";
537
+ existing.reason = error instanceof Error ? error.message : String(error);
538
+ await save(statePath, existing);
539
+ }
540
+ catch { }
541
+ throw error;
542
+ }
543
+ finally {
544
+ await lock.close();
545
+ await rm(join(directory, "lock"), { force: true });
546
+ }
547
+ }
548
+ //# sourceMappingURL=app-loop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-loop.js","sourceRoot":"","sources":["../src/app-loop.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -3,6 +3,7 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
3
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
4
  import { z } from "zod";
5
5
  import { VERSION } from "./version.js";
6
+ import { analyzeAppIntents } from "./analyzers/app-intents.js";
6
7
  import { analyzeConcurrency } from "./analyzers/concurrency.js";
7
8
  import { analyzeArchitecture } from "./analyzers/architecture.js";
8
9
  import { analyzeSwiftUI } from "./analyzers/swiftui.js";
@@ -54,6 +55,7 @@ function handleCLIFlags(argv) {
54
55
  "",
55
56
  "TOOLS",
56
57
  " analyze_swift_project Overview plus findings per category",
58
+ " review_app_intents SiriKit migration and opt-in entity/onscreen review",
57
59
  " review_swift_concurrency Actor isolation and Swift 6 concurrency",
58
60
  " review_swift_architecture Layer boundaries and testability",
59
61
  " review_swiftui Views, state, Dynamic Type, tokens",
@@ -65,7 +67,7 @@ function handleCLIFlags(argv) {
65
67
  " review_swift_performance Work on the render path",
66
68
  " lint_skill Skill metadata, agent tool grants, mirrors",
67
69
  "",
68
- "Each tool takes one argument: an absolute path. The first ten want a",
70
+ "Each tool takes one argument: an absolute path. The review tools want a",
69
71
  "Swift project root; lint_skill wants an Agent Skill repository root.",
70
72
  "",
71
73
  "RESOURCES (root: --project, IOS_AGENT_PROJECT, or a .ios-agent/ marker)",
@@ -128,6 +130,15 @@ async function scanAndRender(path, title, analyze) {
128
130
  };
129
131
  }
130
132
  }
133
+ server.registerTool("review_app_intents", {
134
+ title: "Review App Intents integration",
135
+ description: "Review SiriKit/INIntent migration opportunities and, when explicitly requested, missing Apple Intelligence entity schemas or onscreen entity associations. Findings are heuristic advisories, not blanket deprecations or proof of invalid code. Use when integrating Siri, Shortcuts or Apple Intelligence.",
136
+ inputSchema: { ...pathInput,
137
+ appleIntelligence: z.boolean().default(false).describe("Review entity schemas for a requested Apple Intelligence integration; not required for ordinary intents."),
138
+ onscreenContent: z.boolean().default(false).describe("Review onscreen entity association only when Siri should reference visible content.") },
139
+ outputSchema: reviewOutputShape,
140
+ annotations: { readOnlyHint: true, destructiveHint: false, openWorldHint: false },
141
+ }, async ({ path, appleIntelligence, onscreenContent }) => scanAndRender(path, "App Intents Review", files => analyzeAppIntents(files, { appleIntelligence, onscreenContent })));
131
142
  server.registerTool("review_swift_concurrency", {
132
143
  title: "Review Swift concurrency and actor isolation",
133
144
  description: "Check a Swift project for Swift 6 concurrency and isolation defects: @Observable types missing @MainActor, Task.detached, DispatchQueue.main.async in async code, @unchecked Sendable, nonisolated(unsafe), unstructured Tasks in onAppear, empty catch blocks, and types named Task that shadow _Concurrency.Task. Use when reviewing Swift code, migrating to Swift 6, or diagnosing a data race.",
@@ -201,6 +212,7 @@ server.registerTool("analyze_swift_project", {
201
212
  ]);
202
213
  const summary = await summarizeProject(root, files);
203
214
  const categories = {
215
+ "App Intents": analyzeAppIntents(files),
204
216
  Concurrency: files.flatMap(analyzeConcurrency),
205
217
  Architecture: files.flatMap(analyzeArchitecture),
206
218
  SwiftUI: files.flatMap(analyzeSwiftUI),
@@ -243,6 +255,7 @@ server.registerTool("analyze_swift_project", {
243
255
  "|---|---:|---:|---:|---|",
244
256
  ];
245
257
  const toolFor = {
258
+ "App Intents": "review_app_intents",
246
259
  Concurrency: "review_swift_concurrency",
247
260
  Architecture: "review_swift_architecture",
248
261
  SwiftUI: "review_swiftui",