ios-agent-mcp 2.0.0 → 2.1.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.
- package/README.md +64 -7
- package/dist/analyzers/memory.d.ts +12 -0
- package/dist/analyzers/memory.js +81 -0
- package/dist/analyzers/memory.js.map +1 -0
- package/dist/analyzers/performance.d.ts +10 -0
- package/dist/analyzers/performance.js +106 -0
- package/dist/analyzers/performance.js.map +1 -0
- package/dist/analyzers/security.d.ts +2 -0
- package/dist/analyzers/security.js +82 -0
- package/dist/analyzers/security.js.map +1 -0
- package/dist/analyzers/skill.d.ts +34 -0
- package/dist/analyzers/skill.js +483 -0
- package/dist/analyzers/skill.js.map +1 -0
- package/dist/analyzers/testing.d.ts +16 -0
- package/dist/analyzers/testing.js +135 -0
- package/dist/analyzers/testing.js.map +1 -0
- package/dist/analyzers/types.d.ts +19 -1
- package/dist/analyzers/types.js +65 -3
- package/dist/analyzers/types.js.map +1 -1
- package/dist/index.js +159 -4
- package/dist/index.js.map +1 -1
- package/dist/report.d.ts +10 -0
- package/dist/report.js +40 -0
- package/dist/report.js.map +1 -1
- package/dist/resources.d.ts +67 -0
- package/dist/resources.js +222 -0
- package/dist/resources.js.map +1 -0
- package/dist/result.d.ts +203 -0
- package/dist/result.js +135 -0
- package/dist/result.js.map +1 -0
- package/dist/scan.d.ts +9 -0
- package/dist/scan.js +110 -0
- package/dist/scan.js.map +1 -1
- package/dist/version.d.ts +1 -0
- package/dist/version.js +4 -0
- package/dist/version.js.map +1 -0
- package/mcp.json +76 -11
- package/package.json +6 -5
package/dist/scan.js
CHANGED
|
@@ -103,6 +103,97 @@ export async function readProjectContext(root) {
|
|
|
103
103
|
const isApp = plists.length > 0 || xcodeprojs.length > 0;
|
|
104
104
|
return { infoPlist, hasPrivacyManifest: manifests.length > 0, isApp };
|
|
105
105
|
}
|
|
106
|
+
/**
|
|
107
|
+
* Infer the architecture from file naming and type shape.
|
|
108
|
+
*
|
|
109
|
+
* Deliberately reports EVIDENCE rather than a bare verdict. "MVVM" with nothing
|
|
110
|
+
* behind it is a guess presented as a fact; "MVVM — 12 *ViewModel/*Model types,
|
|
111
|
+
* Views/ and ViewModels/ directories" is a claim the reader can check. When the
|
|
112
|
+
* signals are weak it says so instead of picking the most popular answer.
|
|
113
|
+
*/
|
|
114
|
+
function inferArchitecture(files) {
|
|
115
|
+
const paths = files.map((f) => f.path);
|
|
116
|
+
const evidence = [];
|
|
117
|
+
const count = (test) => paths.filter((p) => test.test(p)).length;
|
|
118
|
+
const typeCount = (test) => files.filter((f) => test.test(f.content)).length;
|
|
119
|
+
const viewModels = typeCount(/\b(?:final\s+)?class\s+\w*(?:ViewModel|Model)\b/);
|
|
120
|
+
const useCases = count(/UseCases?\//i) + typeCount(/protocol\s+\w*UseCase\b/);
|
|
121
|
+
const repositories = typeCount(/protocol\s+\w*Repository\b/);
|
|
122
|
+
const coordinators = typeCount(/\bclass\s+\w*Coordinator\b/);
|
|
123
|
+
const stores = typeCount(/\b(?:struct|enum)\s+\w*(?:Reducer|Feature)\b/) +
|
|
124
|
+
typeCount(/import\s+ComposableArchitecture/);
|
|
125
|
+
const hasLayerDirs = count(/(^|\/)(Domain|Data|Presentation)\//i) >= 2;
|
|
126
|
+
const hasMVVMDirs = count(/(^|\/)ViewModels?\//i) > 0 && count(/(^|\/)Views?\//i) > 0;
|
|
127
|
+
if (stores > 0) {
|
|
128
|
+
evidence.push(`${stores} Reducer/Feature type(s) or a ComposableArchitecture import`);
|
|
129
|
+
return { architecture: "The Composable Architecture", evidence };
|
|
130
|
+
}
|
|
131
|
+
if (hasLayerDirs || (useCases > 0 && repositories > 0)) {
|
|
132
|
+
if (hasLayerDirs)
|
|
133
|
+
evidence.push("Domain/, Data/, and Presentation/ directories");
|
|
134
|
+
if (useCases > 0)
|
|
135
|
+
evidence.push(`${useCases} use-case protocol(s) or a UseCases/ directory`);
|
|
136
|
+
if (repositories > 0)
|
|
137
|
+
evidence.push(`${repositories} repository protocol(s)`);
|
|
138
|
+
return { architecture: "Clean Architecture", evidence };
|
|
139
|
+
}
|
|
140
|
+
if (coordinators > 0) {
|
|
141
|
+
evidence.push(`${coordinators} Coordinator type(s)`);
|
|
142
|
+
if (viewModels > 0)
|
|
143
|
+
evidence.push(`${viewModels} view-model type(s)`);
|
|
144
|
+
return { architecture: "MVVM + Coordinator", evidence };
|
|
145
|
+
}
|
|
146
|
+
if (viewModels > 0 || hasMVVMDirs) {
|
|
147
|
+
if (viewModels > 0)
|
|
148
|
+
evidence.push(`${viewModels} ViewModel/Model type(s)`);
|
|
149
|
+
if (hasMVVMDirs)
|
|
150
|
+
evidence.push("Views/ and ViewModels/ directories");
|
|
151
|
+
return { architecture: "MVVM", evidence };
|
|
152
|
+
}
|
|
153
|
+
return {
|
|
154
|
+
architecture: "not determined",
|
|
155
|
+
evidence: ["no view-model, use-case, repository, or coordinator types found"],
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
/** Third-party package names from whichever manifest the project uses. */
|
|
159
|
+
async function readDependencies(root) {
|
|
160
|
+
const found = new Set();
|
|
161
|
+
for (const path of await walk(root, (p) => p.endsWith("Package.swift"), 5)) {
|
|
162
|
+
try {
|
|
163
|
+
const content = await readFile(path, "utf8");
|
|
164
|
+
for (const match of content.matchAll(/url:\s*"https?:\/\/[^"]*\/([\w.-]+?)(?:\.git)?"/g)) {
|
|
165
|
+
found.add(match[1]);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
// ignore
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
// SwiftPM through Xcode records resolved packages here.
|
|
173
|
+
for (const path of await walk(root, (p) => p.endsWith("Package.resolved"), 5)) {
|
|
174
|
+
try {
|
|
175
|
+
const content = await readFile(path, "utf8");
|
|
176
|
+
for (const match of content.matchAll(/"(?:identity|package)"\s*:\s*"([^"]+)"/g)) {
|
|
177
|
+
found.add(match[1]);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
// ignore
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
for (const path of await walk(root, (p) => /(^|\/)Podfile$/.test(p), 3)) {
|
|
185
|
+
try {
|
|
186
|
+
const content = await readFile(path, "utf8");
|
|
187
|
+
for (const match of content.matchAll(/^\s*pod\s+['"]([^'"\/]+)/gm)) {
|
|
188
|
+
found.add(match[1]);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
// ignore
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return [...found].sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase()));
|
|
196
|
+
}
|
|
106
197
|
/** A structural overview of the project, independent of rule violations. */
|
|
107
198
|
export async function summarizeProject(root, files) {
|
|
108
199
|
const frameworks = new Set();
|
|
@@ -139,6 +230,20 @@ export async function summarizeProject(root, files) {
|
|
|
139
230
|
}
|
|
140
231
|
}
|
|
141
232
|
const xcodeprojs = await walk(root, (p) => p.endsWith(".pbxproj"), 3);
|
|
233
|
+
const { architecture, evidence } = inferArchitecture(files);
|
|
234
|
+
const dependencies = await readDependencies(root);
|
|
235
|
+
const usesSwiftUI = frameworks.has("SwiftUI");
|
|
236
|
+
const usesUIKit = frameworks.has("UIKit");
|
|
237
|
+
const uiFramework = usesSwiftUI && usesUIKit
|
|
238
|
+
? "SwiftUI + UIKit"
|
|
239
|
+
: usesSwiftUI
|
|
240
|
+
? "SwiftUI"
|
|
241
|
+
: usesUIKit
|
|
242
|
+
? "UIKit"
|
|
243
|
+
: "unknown";
|
|
244
|
+
// An injected protocol existential in an initializer is the signal. A project
|
|
245
|
+
// that only ever constructs concrete types has no seam, whatever it is called.
|
|
246
|
+
const usesDependencyInjection = files.some((file) => /init\s*\([^)]*:\s*any\s+\w+/.test(file.content));
|
|
142
247
|
return {
|
|
143
248
|
swiftFileCount: files.length,
|
|
144
249
|
lineCount,
|
|
@@ -148,6 +253,11 @@ export async function summarizeProject(root, files) {
|
|
|
148
253
|
hasTests: files.some((f) => /Tests?\.swift$/.test(f.path)),
|
|
149
254
|
hasPackageSwift: packages.length > 0,
|
|
150
255
|
hasXcodeProject: xcodeprojs.length > 0,
|
|
256
|
+
uiFramework,
|
|
257
|
+
architecture,
|
|
258
|
+
architectureEvidence: evidence,
|
|
259
|
+
dependencies,
|
|
260
|
+
usesDependencyInjection,
|
|
151
261
|
};
|
|
152
262
|
}
|
|
153
263
|
//# sourceMappingURL=scan.js.map
|
package/dist/scan.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../src/scan.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../src/scan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const VERSION = "2.1.0";
|
package/dist/version.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,mFAAmF;AACnF,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC"}
|
package/mcp.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ios-agent-mcp",
|
|
3
3
|
"displayName": "iOS Agent",
|
|
4
|
-
"version": "1.0
|
|
5
|
-
"description": "Static analysis for modern iOS/Swift projects — Swift 6 actor isolation, architecture boundaries, SwiftUI, availability guards, and App Store readiness.",
|
|
4
|
+
"version": "2.1.0",
|
|
5
|
+
"description": "Static analysis for modern iOS/Swift projects — Swift 6 actor isolation, architecture boundaries, SwiftUI, availability guards, and App Store readiness — plus a linter for Agent Skill repositories.",
|
|
6
6
|
"author": "Nagarjuna Reddy",
|
|
7
7
|
"license": "MIT",
|
|
8
8
|
"homepage": "https://github.com/Nagarjuna2997/ios-agent-skill",
|
|
@@ -11,13 +11,25 @@
|
|
|
11
11
|
"url": "https://github.com/Nagarjuna2997/ios-agent-skill.git",
|
|
12
12
|
"directory": "mcp-server"
|
|
13
13
|
},
|
|
14
|
-
"keywords": [
|
|
14
|
+
"keywords": [
|
|
15
|
+
"ios",
|
|
16
|
+
"swift",
|
|
17
|
+
"swiftui",
|
|
18
|
+
"xcode",
|
|
19
|
+
"apple",
|
|
20
|
+
"static-analysis",
|
|
21
|
+
"code-review",
|
|
22
|
+
"agent-skills"
|
|
23
|
+
],
|
|
15
24
|
"runtime": {
|
|
16
25
|
"type": "node",
|
|
17
26
|
"minimumVersion": "18",
|
|
18
27
|
"transport": "stdio",
|
|
19
28
|
"command": "npx",
|
|
20
|
-
"args": [
|
|
29
|
+
"args": [
|
|
30
|
+
"-y",
|
|
31
|
+
"ios-agent-mcp"
|
|
32
|
+
]
|
|
21
33
|
},
|
|
22
34
|
"permissions": {
|
|
23
35
|
"filesystem": "read",
|
|
@@ -25,11 +37,64 @@
|
|
|
25
37
|
"notes": "Reads .swift, Info.plist, Package.swift, and project.pbxproj files under the path you pass to a tool. Makes no network requests and writes nothing."
|
|
26
38
|
},
|
|
27
39
|
"tools": [
|
|
28
|
-
{
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
{
|
|
33
|
-
|
|
34
|
-
|
|
40
|
+
{
|
|
41
|
+
"name": "analyze_swift_project",
|
|
42
|
+
"summary": "Project overview plus a finding count for every rule category."
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"name": "review_swift_concurrency",
|
|
46
|
+
"summary": "Swift 6 actor isolation and concurrency defects."
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"name": "review_swift_architecture",
|
|
50
|
+
"summary": "Architecture boundaries, dependency injection, testability."
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"name": "review_swiftui",
|
|
54
|
+
"summary": "SwiftUI view and state defects, Dynamic Type, design tokens."
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"name": "check_availability_guards",
|
|
58
|
+
"summary": "Missing and over-restrictive @available guards."
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"name": "audit_app_store_readiness",
|
|
62
|
+
"summary": "Purpose strings, privacy manifest, accessibility, localization."
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"name": "review_swift_memory",
|
|
66
|
+
"summary": "Retain cycles, weak/unowned usage, closure and Task lifetime."
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"name": "review_swift_security",
|
|
70
|
+
"summary": "Hardcoded secrets, insecure storage, ATS, TLS, weak crypto, Keychain accessibility."
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"name": "review_swift_testing",
|
|
74
|
+
"summary": "Flaky patterns, vacuous tests, live network in tests, missing coverage."
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"name": "review_swift_performance",
|
|
78
|
+
"summary": "Work inside body, eager stacks, unstable ForEach identity, blocking I/O."
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
"name": "lint_skill",
|
|
82
|
+
"summary": "Agent Skill metadata: frontmatter, subagent tool grants, mirror sync, doc references."
|
|
83
|
+
}
|
|
84
|
+
],
|
|
85
|
+
"resources": [
|
|
86
|
+
{
|
|
87
|
+
"uri": "ios://project/info",
|
|
88
|
+
"summary": "Structure, architecture with evidence, DI, frameworks."
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
"uri": "ios://project/dependencies",
|
|
92
|
+
"summary": "Third-party packages and Apple frameworks."
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"uri": "ios://project/issues",
|
|
96
|
+
"summary": "Every finding across all nine categories."
|
|
97
|
+
}
|
|
98
|
+
],
|
|
99
|
+
"notes": "Resources require a project root: pass --project PATH or set IOS_AGENT_PROJECT. Tools take an explicit path argument and need no configuration."
|
|
35
100
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ios-agent-mcp",
|
|
3
|
-
"version": "2.
|
|
4
|
-
"description": "MCP server for modern iOS/Swift development
|
|
3
|
+
"version": "2.1.0",
|
|
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",
|
|
7
7
|
"bin": {
|
|
@@ -17,10 +17,11 @@
|
|
|
17
17
|
"node": ">=18"
|
|
18
18
|
},
|
|
19
19
|
"scripts": {
|
|
20
|
-
"build": "tsc",
|
|
20
|
+
"build": "node scripts/sync-version.mjs && tsc",
|
|
21
21
|
"test": "node --test test/*.test.js",
|
|
22
|
-
"typecheck": "tsc --noEmit",
|
|
23
|
-
"prepublishOnly": "npm run build && npm test"
|
|
22
|
+
"typecheck": "node scripts/sync-version.mjs && tsc --noEmit",
|
|
23
|
+
"prepublishOnly": "npm run build && npm test",
|
|
24
|
+
"sync-version": "node scripts/sync-version.mjs"
|
|
24
25
|
},
|
|
25
26
|
"keywords": [
|
|
26
27
|
"mcp",
|