ios-agent-mcp 2.7.0 → 2.7.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.
@@ -0,0 +1,16 @@
1
+ import { Options } from './model.js';
2
+ export declare function verifyPackage(dir: string): Promise<{
3
+ model: any;
4
+ manifest: any;
5
+ integrity: any;
6
+ }>;
7
+ export declare function prepareRelease(options: Options): Promise<{
8
+ releaseId: string;
9
+ path: string;
10
+ status: any;
11
+ reused: boolean;
12
+ reusedSections: string[];
13
+ model: import("./model.js").AppModel;
14
+ questions: import("./model.js").Question[];
15
+ }>;
16
+ export declare function appleCLI(args: string[]): Promise<void>;
@@ -0,0 +1,166 @@
1
+ /** Local immutable packages. No Apple, AI, browser or network client is imported. */
2
+ import { mkdir, lstat, readFile, writeFile, rename, rm, realpath, readdir } from 'node:fs/promises';
3
+ import { resolve, join } from 'node:path';
4
+ import { execFile } from 'node:child_process';
5
+ import { promisify } from 'node:util';
6
+ import { randomUUID } from 'node:crypto';
7
+ import { analyzeApp, canonical, digest, AppModelSchema } from './model.js';
8
+ import { VERSION } from '../version.js';
9
+ const files = ['app-model.json', 'requirements.json', 'questions.json', 'change-plan.json', 'manifest.json'];
10
+ async function directory(p) {
11
+ try {
12
+ const s = await lstat(p);
13
+ if (!s.isDirectory() || s.isSymbolicLink())
14
+ throw Error('Unsafe release directory');
15
+ }
16
+ catch (e) {
17
+ if (e.code !== 'ENOENT')
18
+ throw e;
19
+ await mkdir(p, { mode: 0o700 });
20
+ }
21
+ }
22
+ async function regular(p) {
23
+ const s = await lstat(p);
24
+ if (!s.isFile() || s.isSymbolicLink() || s.size > 16 * 1024 * 1024)
25
+ throw Error('Unsafe package artifact');
26
+ return readFile(p, 'utf8');
27
+ }
28
+ export async function verifyPackage(dir) {
29
+ const s = await lstat(dir);
30
+ if (!s.isDirectory() || s.isSymbolicLink())
31
+ throw Error('Unsafe package directory');
32
+ const integrity = JSON.parse(await regular(join(dir, 'integrity.json')));
33
+ if (canonical(Object.keys(integrity).sort()) !== canonical([...files].sort()))
34
+ throw Error('Invalid package integrity manifest');
35
+ for (const f of files)
36
+ if (digest(await regular(join(dir, f))) !== integrity[f])
37
+ throw Error('Package evidence changed; preserve it for inspection and use a new release directory.');
38
+ const model = JSON.parse(await regular(join(dir, 'app-model.json'))), manifest = JSON.parse(await regular(join(dir, 'manifest.json')));
39
+ if (model.schemaVersion !== 1 || manifest.packageSchemaVersion !== 1 || digest(canonical(model)) !== manifest.appModelHash)
40
+ throw Error('Invalid release package schema or model hash');
41
+ AppModelSchema.parse(model);
42
+ const { generatedAt: _at, semanticHash, ...semantic } = manifest;
43
+ if (digest(canonical(semantic)) !== semanticHash)
44
+ throw Error('Invalid semantic manifest hash');
45
+ return { model, manifest, integrity };
46
+ }
47
+ export async function prepareRelease(options) {
48
+ const analysis = await analyzeApp(options), root = await realpath(resolve(options.root));
49
+ const local = join(root, '.ios-agent'), releases = join(local, 'releases');
50
+ await directory(local);
51
+ await directory(releases);
52
+ const lock = join(releases, '.prepare-lock');
53
+ try {
54
+ await mkdir(lock, { mode: 0o700 });
55
+ }
56
+ catch {
57
+ throw Error('Preparation already locked. If interrupted, inspect and remove .ios-agent/releases/.prepare-lock before resuming.');
58
+ }
59
+ let stage;
60
+ try {
61
+ const ignore = join(releases, '.gitignore');
62
+ try {
63
+ if ((await regular(ignore)) !== '*\n')
64
+ throw Error('Release ignore file differs; refusing to write private artifacts.');
65
+ }
66
+ catch (e) {
67
+ if (e.code !== 'ENOENT')
68
+ throw e;
69
+ await writeFile(ignore, '*\n', { flag: 'wx', mode: 0o600 });
70
+ }
71
+ let revision = null;
72
+ try {
73
+ const r = await promisify(execFile)('git', ['--no-optional-locks', 'rev-parse', 'HEAD'], { cwd: root, timeout: 2000, maxBuffer: 1024, env: { ...process.env, GIT_OPTIONAL_LOCKS: '0' } });
74
+ if (/^[a-f0-9]{40,64}$/.test(r.stdout.trim()))
75
+ revision = r.stdout.trim();
76
+ }
77
+ catch { /* An untracked project still produces a package. */ }
78
+ const modelHash = digest(canonical(analysis.model));
79
+ const implementationHash = digest((await Promise.all(['./model.js', './package.js', './project.js', '../analyzers/launch-screen.js'].map(p => readFile(new URL(p, import.meta.url))))).map(b => digest(b)).join(':'));
80
+ const identity = { protocol: 1, implementationHash, sourceFingerprint: analysis.sourceFingerprint, modelHash, tool: VERSION, revision };
81
+ const releaseId = 'local-' + digest(canonical(identity)).slice(0, 24), dest = join(releases, releaseId);
82
+ try {
83
+ await lstat(dest);
84
+ const saved = await verifyPackage(dest);
85
+ return { releaseId, path: dest, status: saved.manifest.status, reused: true, reusedSections: Object.keys(analysis.model.sectionHashes), model: analysis.model, questions: analysis.questions };
86
+ }
87
+ catch (e) {
88
+ if (e.code !== 'ENOENT')
89
+ throw e;
90
+ }
91
+ // Reuse is evidence-level, not skipping input verification. Preserve unrelated stage objects.
92
+ const reusedSections = [];
93
+ const prior = (await readdir(releases)).filter(n => /^local-[a-f0-9]{24}$/.test(n)).sort();
94
+ for (const name of prior) {
95
+ const prev = await verifyPackage(join(releases, name));
96
+ if (canonical(prev.model.selection) !== canonical(analysis.model.selection))
97
+ continue;
98
+ for (const [section, hash] of Object.entries(analysis.model.sectionHashes))
99
+ if (prev.model.sectionHashes[section] === hash && !reusedSections.includes(section))
100
+ reusedSections.push(section);
101
+ }
102
+ // A second collection prevents packaging evidence from inputs changed during preparation.
103
+ if ((await analyzeApp(options)).sourceFingerprint !== analysis.sourceFingerprint)
104
+ throw Error('Project changed during analysis; rerun preparation.');
105
+ const manifest = { packageSchemaVersion: 1, appModelSchemaVersion: 1, releaseId, selection: analysis.model.selection, identity: analysis.model.claims.filter(c => ['bundleIdentifier', 'version', 'build'].includes(c.id)), sourceFingerprint: analysis.sourceFingerprint, repositoryRevision: revision, tools: { iosAgent: VERSION, implementationHash, node: process.version, xcode: 'NOT_CHECKED', swift: 'NOT_CHECKED' }, generatedAt: new Date().toISOString(), appModelHash: modelHash, sectionHashes: analysis.model.sectionHashes, evidenceHashes: Object.fromEntries(analysis.model.evidence.map(e => [e.id, e.sha256])), unresolvedBlockers: [...analysis.questions.filter(q => q.priority === 1).map(q => q.id), ...analysis.model.claims.filter(c => c.id.startsWith('launch-finding:')).map(c => c.id)], status: analysis.model.status === 'BLOCKED' ? 'BLOCKED' : 'DRAFT_LOCAL_ONLY', remoteState: 'NOT_CHECKED', buildTestsSigning: 'NOT_CHECKED' };
106
+ const { generatedAt: _timestamp, ...semanticManifest } = manifest;
107
+ const manifestWithHash = { ...manifest, semanticHash: digest(canonical(semanticManifest)) };
108
+ const artifacts = { 'app-model.json': analysis.model, 'requirements.json': analysis.requirements, 'questions.json': analysis.questions, 'change-plan.json': analysis.changePlan, 'manifest.json': manifestWithHash };
109
+ stage = join(releases, '.staging-' + randomUUID());
110
+ await mkdir(stage, { mode: 0o700 });
111
+ for (const dir of ['metadata', 'privacy', 'review', 'icons', 'screenshots', 'screenshots/raw', 'screenshots/composed', 'validation', 'evidence', 'approvals', 'operations'])
112
+ await mkdir(join(stage, dir), { recursive: true, mode: 0o700 });
113
+ const integrity = {};
114
+ for (const [f, v] of Object.entries(artifacts)) {
115
+ const content = canonical(v) + '\n';
116
+ await writeFile(join(stage, f), content, { flag: 'wx', mode: 0o600 });
117
+ integrity[f] = digest(content);
118
+ }
119
+ await writeFile(join(stage, 'integrity.json'), canonical(integrity) + '\n', { flag: 'wx', mode: 0o600 });
120
+ await rename(stage, dest);
121
+ stage = undefined;
122
+ await verifyPackage(dest);
123
+ return { releaseId, path: dest, status: manifest.status, reused: false, reusedSections: reusedSections.sort(), model: analysis.model, questions: analysis.questions };
124
+ }
125
+ finally {
126
+ if (stage)
127
+ await rm(stage, { recursive: true, force: true });
128
+ await rm(lock, { recursive: true, force: true });
129
+ }
130
+ }
131
+ export async function appleCLI(args) {
132
+ const command = args.shift();
133
+ if (!['analyze', 'prepare'].includes(command || ''))
134
+ throw Error('Usage: ios-agent-mcp apple analyze|prepare --project ROOT [--xcodeproj FILE] [--workspace FILE] [--target NAME] [--configuration Release] [--prompt TEXT] [--json]');
135
+ const options = { root: process.cwd() };
136
+ let json = false;
137
+ const keys = { '--project': 'root', '--xcodeproj': 'project', '--workspace': 'workspace', '--target': 'target', '--configuration': 'configuration', '--prompt': 'prompt' };
138
+ while (args.length) {
139
+ const a = args.shift();
140
+ if (a === '--json') {
141
+ json = true;
142
+ continue;
143
+ }
144
+ if (!keys[a] || !args.length || args[0].startsWith('--'))
145
+ throw Error('Unknown option or missing argument');
146
+ options[keys[a]] = args.shift();
147
+ }
148
+ const result = command === 'prepare' ? await prepareRelease(options) : await analyzeApp(options);
149
+ if (json)
150
+ console.log(canonical(result));
151
+ else {
152
+ console.log('TARGET ' + (result.model.selection.target || 'NEEDS SELECTION') + ' / ' + result.model.selection.configuration);
153
+ console.log('STATUS ' + result.model.status);
154
+ for (const c of result.model.claims.filter(c => ['bundleIdentifier', 'version', 'build', 'info-plist', 'launch-screen', 'app-icon-name'].includes(c.id)))
155
+ console.log(c.status + ' ' + c.id + ': ' + (c.value ?? 'not established'));
156
+ console.log('INFERRED ' + result.model.features.length + ' API-based feature candidates; ' + result.model.screens.length + ' screen candidates. Runtime NOT CHECKED.');
157
+ if ('releaseId' in result)
158
+ console.log((result.reused ? 'REUSED' : 'GENERATED') + ' local package: ' + result.path);
159
+ for (const q of result.questions)
160
+ console.log('NEEDS CONFIRMATION [' + q.priority + '] ' + q.question);
161
+ console.log('Build/signing NOT CHECKED. No credentials, AI provider or remote changes.');
162
+ }
163
+ if (result.model.status === 'BLOCKED')
164
+ process.exitCode = 2;
165
+ }
166
+ //# sourceMappingURL=package.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package.js","sourceRoot":"","sources":["../../src/release/package.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export type ObjectMap = Record<string, any>;
2
+ export declare const list: (v: any) => any[];
3
+ export declare function parsePropertyList(b: Buffer): ObjectMap;
4
+ export declare function projectPaths(objects: ObjectMap, base: string): (id: string, seen?: Set<string>) => string | undefined;
@@ -0,0 +1,45 @@
1
+ /** Shared static Xcode helpers. Never evaluates build scripts or resolves packages. */
2
+ import { posix } from 'node:path';
3
+ import * as plist from 'plist';
4
+ export const list = (v) => Array.isArray(v) ? v : v ? [v] : [];
5
+ export function parsePropertyList(b) {
6
+ const v = b.subarray(0, 6).toString() === 'bplist' ? plist.parseBinary(b) : plist.parse(b.toString());
7
+ if (!v || typeof v !== 'object' || Array.isArray(v))
8
+ throw Error('Expected a property dictionary');
9
+ return v;
10
+ }
11
+ export function projectPaths(objects, base) {
12
+ const parents = new Map();
13
+ for (const [id, ob] of Object.entries(objects))
14
+ for (const child of list(ob.children))
15
+ parents.set(child, [...(parents.get(child) || []), id]);
16
+ function filePath(id, seen = new Set()) {
17
+ if (seen.has(id))
18
+ return;
19
+ seen.add(id);
20
+ const ob = objects[id];
21
+ if (!ob)
22
+ return;
23
+ const name = ob.path || '';
24
+ if (typeof name !== 'string' || /\$[({]/.test(name) || name.startsWith('/'))
25
+ return;
26
+ let parent = base;
27
+ if (ob.sourceTree === '<group>') {
28
+ const ps = parents.get(id) || [];
29
+ if (ps.length > 1)
30
+ return;
31
+ if (ps.length === 1) {
32
+ const p = filePath(ps[0], seen);
33
+ if (p === undefined)
34
+ return;
35
+ parent = p;
36
+ }
37
+ }
38
+ else if (ob.sourceTree && ob.sourceTree !== 'SOURCE_ROOT')
39
+ return;
40
+ const p = posix.normalize(posix.join(parent, name));
41
+ return p === '..' || p.startsWith('../') ? undefined : p;
42
+ }
43
+ return filePath;
44
+ }
45
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/release/project.ts"],"names":[],"mappings":"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"}
package/dist/result.d.ts CHANGED
@@ -28,8 +28,8 @@ export declare const issueSchema: z.ZodObject<{
28
28
  excerpt: z.ZodString;
29
29
  }, "strip", z.ZodTypeAny, {
30
30
  message: string;
31
- file: string;
32
31
  severity: "blocker" | "serious" | "minor";
32
+ file: string;
33
33
  line: number;
34
34
  rule: string;
35
35
  consequence: string;
@@ -38,8 +38,8 @@ export declare const issueSchema: z.ZodObject<{
38
38
  excerpt: string;
39
39
  }, {
40
40
  message: string;
41
- file: string;
42
41
  severity: "blocker" | "serious" | "minor";
42
+ file: string;
43
43
  line: number;
44
44
  rule: string;
45
45
  consequence: string;
@@ -80,8 +80,8 @@ export declare const reviewOutputShape: {
80
80
  excerpt: z.ZodString;
81
81
  }, "strip", z.ZodTypeAny, {
82
82
  message: string;
83
- file: string;
84
83
  severity: "blocker" | "serious" | "minor";
84
+ file: string;
85
85
  line: number;
86
86
  rule: string;
87
87
  consequence: string;
@@ -90,8 +90,8 @@ export declare const reviewOutputShape: {
90
90
  excerpt: string;
91
91
  }, {
92
92
  message: string;
93
- file: string;
94
93
  severity: "blocker" | "serious" | "minor";
94
+ file: string;
95
95
  line: number;
96
96
  rule: string;
97
97
  consequence: string;
@@ -133,8 +133,8 @@ export declare const reviewOutputSchema: z.ZodObject<{
133
133
  excerpt: z.ZodString;
134
134
  }, "strip", z.ZodTypeAny, {
135
135
  message: string;
136
- file: string;
137
136
  severity: "blocker" | "serious" | "minor";
137
+ file: string;
138
138
  line: number;
139
139
  rule: string;
140
140
  consequence: string;
@@ -143,8 +143,8 @@ export declare const reviewOutputSchema: z.ZodObject<{
143
143
  excerpt: string;
144
144
  }, {
145
145
  message: string;
146
- file: string;
147
146
  severity: "blocker" | "serious" | "minor";
147
+ file: string;
148
148
  line: number;
149
149
  rule: string;
150
150
  consequence: string;
@@ -156,8 +156,8 @@ export declare const reviewOutputSchema: z.ZodObject<{
156
156
  }, "strip", z.ZodTypeAny, {
157
157
  issues: {
158
158
  message: string;
159
- file: string;
160
159
  severity: "blocker" | "serious" | "minor";
160
+ file: string;
161
161
  line: number;
162
162
  rule: string;
163
163
  consequence: string;
@@ -178,8 +178,8 @@ export declare const reviewOutputSchema: z.ZodObject<{
178
178
  }, {
179
179
  issues: {
180
180
  message: string;
181
- file: string;
182
181
  severity: "blocker" | "serious" | "minor";
182
+ file: string;
183
183
  line: number;
184
184
  rule: string;
185
185
  consequence: string;
package/dist/unified.js CHANGED
@@ -12,13 +12,23 @@ import { z } from 'zod';
12
12
  import { VERSION } from './version.js';
13
13
  import { withDevelopmentFeedback } from './development-feedback.js';
14
14
  import { issueReportTool, prepareIssueReport } from './issue-report.js';
15
+ import { privateFeedbackTool, createPrivateFeedback } from './private-feedback.js';
15
16
  const require = createRequire(import.meta.url);
16
17
  const args = process.argv.slice(2);
17
18
  const cli = () => require.resolve('@nagarjuna2002/ios-agent/dist/index.js');
18
19
  if (args.includes('--version'))
19
20
  console.log(VERSION);
20
21
  else if (args.includes('--help'))
21
- console.log(`ios-agent-mcp ${VERSION}\nOne MCP connection: Swift reviews, Apple references, app creation and simulator tools.\nRequires Node 20+. Simulator operations require macOS/Xcode.\nUsage: ios-agent-mcp [--project PATH]\n ios-agent-mcp new MyApp --brief "Your idea" --xcodegen\n ios-agent-mcp loop init --project PATH --brief BRIEF.md --checks checks.json\n ios-agent-mcp loop resume --project PATH\n ios-agent-mcp loop status --project PATH\nThe starter requires your coding agent to implement the app features.`);
22
+ console.log(`ios-agent-mcp ${VERSION}\nOne MCP connection: Swift reviews, Apple references, app creation and simulator tools.\nRequires Node 20+. Simulator operations require macOS/Xcode.\nUsage: ios-agent-mcp [--project PATH]\n ios-agent-mcp new MyApp --brief "Your idea" --xcodegen\n ios-agent-mcp loop init --project PATH --brief BRIEF.md --checks checks.json\n ios-agent-mcp loop resume --project PATH\n ios-agent-mcp loop status --project PATH\n ios-agent-mcp apple analyze|prepare --project PATH [--target NAME] [--configuration Release] [--json]\nThe starter requires your coding agent to implement the app features.`);
23
+ else if (args[0] === 'apple') {
24
+ try {
25
+ await (await import('./release/package.js')).appleCLI(args.slice(1));
26
+ }
27
+ catch {
28
+ console.error('Local Apple analysis failed. Check selection, file access and package integrity. No external action performed.');
29
+ process.exitCode = 1;
30
+ }
31
+ }
22
32
  else if (args[0] === 'loop') {
23
33
  try {
24
34
  await (await import('./app-loop.js')).appLoop(args.slice(1));
@@ -48,12 +58,21 @@ else {
48
58
  const tools = catalog.flatMap((list, i) => list.tools.map(tool => { if (owners.has(tool.name))
49
59
  throw Error(`Duplicate tool ${tool.name}`); owners.set(tool.name, clients[i]); return tool; }));
50
60
  tools.push({ name: 'create_app', description: 'Create an editable Swift app starter, implementation brief and optional XcodeGen specification/icon layers. Writes a NEW project; does not implement the full app idea. Then use source retrieval, review and simulator tools to implement and verify it.', inputSchema: { type: 'object', properties: { name: { type: 'string' }, directory: { type: 'string', description: 'Parent directory for the new project' }, brief: { type: 'string' }, xcodegen: { type: 'boolean', default: true } }, required: ['name', 'directory', 'brief'], additionalProperties: false } });
51
- tools.push(issueReportTool);
61
+ tools.push(issueReportTool, privateFeedbackTool);
62
+ const privateFeedback = createPrivateFeedback();
52
63
  const server = new Server({ name: 'ios-agent-mcp', version: VERSION }, { capabilities: { tools: {}, resources: {} } });
53
64
  server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools }));
54
65
  server.setRequestHandler(ListResourcesRequestSchema, () => clients[0].listResources());
55
66
  server.setRequestHandler(ReadResourceRequestSchema, request => clients[0].readResource(request.params));
56
67
  server.setRequestHandler(CallToolRequestSchema, async (request, extra) => {
68
+ if (request.params.name === 'private_feedback') {
69
+ try {
70
+ return { content: [{ type: 'text', text: JSON.stringify(await privateFeedback(request.params.arguments), null, 2) }] };
71
+ }
72
+ catch {
73
+ return { isError: true, content: [{ type: 'text', text: 'Private feedback rejected. Use a valid configured destination and preview, then obtain explicit approval. No arbitrary text or diagnostics accepted.' }] };
74
+ }
75
+ }
57
76
  if (request.params.name === 'prepare_issue_report') {
58
77
  try {
59
78
  return { content: [{ type: 'text', text: JSON.stringify(prepareIssueReport(request.params.arguments), null, 2) }] };
@@ -1 +1 @@
1
- {"version":3,"file":"unified.js","sourceRoot":"","sources":["../src/unified.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AAC1J,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACxE,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,MAAM,GAAG,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAC;AAC5E,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;IAAE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;KAChD,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,OAAO,4fAA4f,CAAC,CAAC;KAC/jB,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;IAC5B,IAAI,CAAC;QAAC,MAAM,CAAC,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAAC,CAAC;IAAC,OAAM,KAAK,EAAE,CAAC;QAAC,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAA,CAAC,CAAA,KAAK,CAAC,OAAO,CAAA,CAAC,CAAA,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAAA,OAAO,CAAC,QAAQ,GAAC,CAAC,CAAC;IAAC,CAAC;AAC9K,CAAC;KACI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,EAAE,CAAC;IACrD,MAAM,KAAK,GAAG,CAAC,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAC,CAAC,GAAG,EAAE,EAAC,GAAG,IAAI,CAAC,EAAC,EAAC,KAAK,EAAC,SAAS,EAAC,CAAC,CAAC;IAC7G,KAAK,CAAC,EAAE,CAAC,OAAO,EAAC,CAAC,CAAA,EAAE,GAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAA,OAAO,CAAC,QAAQ,GAAC,CAAC,CAAC,CAAA,CAAC,CAAC,CAAC;IACpE,KAAK,CAAC,EAAE,CAAC,MAAM,EAAC,IAAI,CAAA,EAAE,GAAC,OAAO,CAAC,QAAQ,GAAC,IAAI,IAAI,CAAC,CAAC,CAAA,CAAC,CAAC,CAAC;AACvD,CAAC;KAAM,CAAC;IACN,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,KAAK,IAAI,EAAE,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnF,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,YAAY,EAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAC,aAAa,CAAC,IAAI,GAAG,CAAC,uBAAuB,EAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAC,OAAO,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC,CAAC;QACzL,KAAK,MAAM,CAAC,CAAC,EAAC,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAC,IAAI,EAAC,mBAAmB,EAAC,OAAO,EAAC,OAAO,EAAC,CAAC,CAAC;YACtE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrB,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,oBAAoB,CAAC,EAAC,OAAO,EAAC,OAAO,CAAC,QAAQ,EAAC,IAAI,EAAC,CAAC,IAAI,EAAC,GAAG,CAAC,CAAC,KAAG,CAAC,CAAA,CAAC,CAAA,IAAI,CAAA,CAAC,CAAA,EAAE,CAAC,CAAC,EAAC,MAAM,EAAC,SAAS,EAAC,GAAG,EAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAA0B,EAAE,CAAA,IAAI,CAAC,CAAC,CAAC,KAAG,SAAS,CAAC,CAAC,EAAC,CAAC,CAAC,CAAC;QAC9O,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QACjE,MAAM,MAAM,GAAG,IAAI,GAAG,EAAiB,CAAC;QACxC,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,EAAC,CAAC,EAAC,EAAE,CAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAA,EAAE,GAAC,IAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;YAAC,MAAM,KAAK,CAAC,kBAAkB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAC,OAAO,CAAC,CAAC,CAAE,CAAC,CAAC,CAAA,OAAO,IAAI,CAAC,CAAA,CAAC,CAAC,CAAC,CAAC;QACpL,KAAK,CAAC,IAAI,CAAC,EAAC,IAAI,EAAC,YAAY,EAAC,WAAW,EAAC,2PAA2P,EAAC,WAAW,EAAC,EAAC,IAAI,EAAC,QAAQ,EAAC,UAAU,EAAC,EAAC,IAAI,EAAC,EAAC,IAAI,EAAC,QAAQ,EAAC,EAAC,SAAS,EAAC,EAAC,IAAI,EAAC,QAAQ,EAAC,WAAW,EAAC,sCAAsC,EAAC,EAAC,KAAK,EAAC,EAAC,IAAI,EAAC,QAAQ,EAAC,EAAC,QAAQ,EAAC,EAAC,IAAI,EAAC,SAAS,EAAC,OAAO,EAAC,IAAI,EAAC,EAAC,EAAC,QAAQ,EAAC,CAAC,MAAM,EAAC,WAAW,EAAC,OAAO,CAAC,EAAC,oBAAoB,EAAC,KAAK,EAAC,EAAC,CAAC,CAAC;QACjjB,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC5B,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAC,IAAI,EAAC,eAAe,EAAC,OAAO,EAAC,OAAO,EAAC,EAAC,EAAC,YAAY,EAAC,EAAC,KAAK,EAAC,EAAE,EAAC,SAAS,EAAC,EAAE,EAAC,EAAC,CAAC,CAAC;QACzG,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAC,KAAK,IAAE,EAAE,CAAA,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,CAAC;QACpE,MAAM,CAAC,iBAAiB,CAAC,0BAA0B,EAAC,GAAE,EAAE,CAAA,OAAO,CAAC,CAAC,CAAE,CAAC,aAAa,EAAE,CAAC,CAAC;QACrF,MAAM,CAAC,iBAAiB,CAAC,yBAAyB,EAAC,OAAO,CAAA,EAAE,CAAA,OAAO,CAAC,CAAC,CAAE,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QACtG,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAC,KAAK,EAAE,OAAO,EAAC,KAAK,EAAC,EAAE;YACpE,IAAG,OAAO,CAAC,MAAM,CAAC,IAAI,KAAG,sBAAsB,EAAE,CAAC;gBAChD,IAAI,CAAC;oBAAC,OAAO,EAAC,OAAO,EAAC,CAAC,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAAC,IAAI,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC;gBAAC,CAAC;gBAClH,MAAM,CAAC;oBAAC,OAAO,EAAC,OAAO,EAAC,IAAI,EAAC,OAAO,EAAC,CAAC,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,6FAA6F,EAAC,CAAC,EAAC,CAAC;gBAAC,CAAC;YAC7J,CAAC;YACD,IAAG,OAAO,CAAC,MAAM,CAAC,IAAI,KAAG,YAAY,EAAE,CAAC;gBACtC,IAAI,CAAC;oBACH,MAAM,KAAK,GAAC,CAAC,CAAC,MAAM,CAAC,EAAC,IAAI,EAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAC,SAAS,EAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAC,QAAQ,EAAC,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAC,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;oBAC/K,MAAM,MAAM,GAAC,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAC,CAAC,GAAG,EAAE,EAAC,KAAK,EAAC,KAAK,CAAC,IAAI,EAAC,QAAQ,EAAC,KAAK,CAAC,SAAS,EAAC,SAAS,EAAC,KAAK,CAAC,KAAK,EAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAA,CAAC,CAAA,CAAC,YAAY,CAAC,CAAA,CAAC,CAAA,EAAE,CAAC,CAAC,EAAC,EAAC,OAAO,EAAC,KAAK,EAAC,SAAS,EAAC,IAAI,GAAC,IAAI,EAAC,CAAC,CAAC;oBAC3M,OAAO,EAAC,OAAO,EAAC,CAAC,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,MAAM,CAAC,MAAM,IAAI,sBAAsB,EAAC,CAAC,EAAC,CAAC;gBAChF,CAAC;gBAAC,OAAM,KAAK,EAAE,CAAC;oBAAA,OAAO,uBAAuB,CAAC,EAAC,OAAO,EAAC,IAAI,EAAC,OAAO,EAAC,CAAC,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,KAAK,YAAY,KAAK,CAAA,CAAC,CAAA,KAAK,CAAC,OAAO,CAAA,CAAC,CAAA,MAAM,CAAC,KAAK,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;gBAAA,CAAC;YAClJ,CAAC;YACD,MAAM,KAAK,GAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC5C,IAAG,CAAC,KAAK;gBAAC,MAAM,KAAK,CAAC,cAAc,CAAC,CAAC;YACtC,MAAM,MAAM,GAAC,MAAM,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAC,SAAS,EAAC,EAAC,OAAO,EAAC,EAAE,GAAC,EAAE,GAAC,IAAI,EAAC,MAAM,EAAC,KAAK,CAAC,MAAM,EAAC,CAAC,CAAC;YACrG,OAAO,uBAAuB,CAAC,MAAM,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAC,GAAE,EAAE,GAAC,KAAK,KAAK,EAAE,CAAC,OAAO,CAAC,GAAE,EAAE,CAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA,CAAC,CAAC,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,SAAS,EAAC,GAAE,EAAE,GAAC,KAAK,KAAK,EAAE,CAAC,OAAO,CAAC,GAAE,EAAE,CAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA,CAAC,CAAC,CAAC;QACzE,MAAM,CAAC,OAAO,GAAC,GAAE,EAAE,GAAC,KAAK,KAAK,EAAE,CAAC,CAAA,CAAC,CAAC;QACnC,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAC;IACnD,CAAC;IAAC,OAAM,KAAK,EAAE,CAAC;QAAA,MAAM,KAAK,EAAE,CAAC;QAAA,MAAM,KAAK,CAAC;IAAA,CAAC;AAC7C,CAAC"}
1
+ {"version":3,"file":"unified.js","sourceRoot":"","sources":["../src/unified.ts"],"names":[],"mappings":"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"}
package/dist/version.d.ts CHANGED
@@ -1 +1 @@
1
- export declare const VERSION = "2.7.0";
1
+ export declare const VERSION = "2.7.1";
package/dist/version.js CHANGED
@@ -1,4 +1,4 @@
1
1
  // GENERATED by scripts/sync-version.mjs — do not edit.
2
2
  // The version lives in package.json. Run `npm run sync-version` after changing it.
3
- export const VERSION = "2.7.0";
3
+ export const VERSION = "2.7.1";
4
4
  //# sourceMappingURL=version.js.map
package/mcp.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "ios-agent-mcp",
3
3
  "displayName": "iOS Agent",
4
- "version": "2.7.0",
4
+ "version": "2.7.1",
5
5
  "description": "Unified iOS development tools: Swift reviews, Apple source retrieval, app scaffolding and Xcode simulator workflows.",
6
6
  "author": "Nagarjuna Reddy",
7
7
  "license": "MIT",
@@ -180,6 +180,10 @@
180
180
  {
181
181
  "name": "prepare_issue_report",
182
182
  "summary": "Local category-only issue preview; no network, diagnostics collection or submission. User reviews and signs in to GitHub to submit."
183
+ },
184
+ {
185
+ "name": "private_feedback",
186
+ "summary": "Source-preview consented category-only private feedback. Preview first, explicitly approve, then submit to configured HTTPS receiver; unavailable without backend. No public fallback."
183
187
  }
184
188
  ],
185
189
  "resources": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ios-agent-mcp",
3
- "version": "2.7.0",
3
+ "version": "2.7.1",
4
4
  "description": "MCP server for modern iOS/Swift development \u2014 concurrency isolation, architecture boundaries, SwiftUI, and App Store readiness analysis",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -41,9 +41,11 @@
41
41
  ],
42
42
  "dependencies": {
43
43
  "@modelcontextprotocol/sdk": "^1.30.0",
44
- "zod": "^3.23.8",
45
44
  "@nagarjuna2002/ios-agent": "0.3.0",
46
- "@nagarjuna2002/ios-simulator-mcp": "0.2.0"
45
+ "@nagarjuna2002/ios-simulator-mcp": "0.2.0",
46
+ "fast-xml-parser": "5.11.1",
47
+ "plist": "5.0.0",
48
+ "zod": "^3.23.8"
47
49
  },
48
50
  "devDependencies": {
49
51
  "@types/express": "^5.0.6",