@ebowwa/mcp-ios-devices 1.0.7 → 1.1.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.
package/dist/index.d.ts CHANGED
@@ -22,6 +22,6 @@ import './tools/simulator.js';
22
22
  import './tools/backup.js';
23
23
  import './tools/location.js';
24
24
  import './tools/screenshot.js';
25
- import './tools/diagnostics.js';
26
25
  import './tools/profile.js';
26
+ import './tools/build.js';
27
27
  //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -29,8 +29,8 @@ import './tools/simulator.js';
29
29
  import './tools/backup.js';
30
30
  import './tools/location.js';
31
31
  import './tools/screenshot.js';
32
- import './tools/diagnostics.js';
33
32
  import './tools/profile.js';
33
+ import './tools/build.js';
34
34
  // Create MCP server
35
35
  const server = new Server({
36
36
  name: '@ebowwa/mcp-ios-devices',
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=build.d.ts.map
@@ -0,0 +1,281 @@
1
+ /**
2
+ * Build, Test & Debug Tools
3
+ * Xcode build, test, debug, and performance profiling operations
4
+ */
5
+ import { z } from 'zod';
6
+ import { registerTool } from '../registry.js';
7
+ import { xcodeTools } from '@ebowwa/ios-devices';
8
+ // ============================================================================
9
+ // Build Tools
10
+ // ============================================================================
11
+ registerTool({
12
+ name: 'ios_build_app',
13
+ description: `Build an iOS app using xcodebuild.
14
+
15
+ Supports building for device or simulator. Returns build status, warnings, errors, and app path.
16
+
17
+ Examples:
18
+ - Build for simulator: { scheme: "MyApp", destination: "platform=iOS Simulator,name=iPhone 15" }
19
+ - Build for device: { scheme: "MyApp", destination: "platform=iOS,name=Starlink" }
20
+ - Build with workspace: { workspace: "MyApp.xcworkspace", scheme: "MyApp" }`,
21
+ inputSchema: z.object({
22
+ project: z.string().optional().describe('Path to .xcodeproj file'),
23
+ workspace: z.string().optional().describe('Path to .xcworkspace file'),
24
+ scheme: z.string().describe('Build scheme name'),
25
+ configuration: z.enum(['Debug', 'Release']).optional().default('Debug'),
26
+ destination: z.string().optional().describe('Build destination (e.g., "platform=iOS,name=Starlink")'),
27
+ sdk: z.string().optional().describe('SDK to use (e.g., "iphoneos", "iphonesimulator")'),
28
+ derivedDataPath: z.string().optional().describe('Path for derived data'),
29
+ codeSignIdentity: z.string().optional().describe('Code signing identity'),
30
+ provisioningProfile: z.string().optional().describe('Provisioning profile UUID'),
31
+ extraArgs: z.array(z.string()).optional().describe('Additional xcodebuild arguments'),
32
+ }),
33
+ handler: async (options) => {
34
+ return xcodeTools.buildApp(options);
35
+ },
36
+ });
37
+ registerTool({
38
+ name: 'ios_archive_app',
39
+ description: `Archive an iOS app for distribution.
40
+
41
+ Creates an .xcarchive that can be exported to IPA.
42
+
43
+ Examples:
44
+ - Archive for release: { scheme: "MyApp", archivePath: "/tmp/MyApp.xcarchive", configuration: "Release" }`,
45
+ inputSchema: z.object({
46
+ project: z.string().optional().describe('Path to .xcodeproj file'),
47
+ workspace: z.string().optional().describe('Path to .xcworkspace file'),
48
+ scheme: z.string().describe('Build scheme name'),
49
+ configuration: z.enum(['Debug', 'Release']).optional().default('Release'),
50
+ archivePath: z.string().describe('Path for the .xcarchive'),
51
+ destination: z.string().optional().describe('Build destination'),
52
+ }),
53
+ handler: async (options) => {
54
+ return xcodeTools.archiveApp(options);
55
+ },
56
+ });
57
+ registerTool({
58
+ name: 'ios_export_ipa',
59
+ description: `Export IPA from archive for distribution.
60
+
61
+ Requires an export options plist for code signing configuration.
62
+
63
+ Examples:
64
+ - Export for App Store: { archivePath: "/tmp/MyApp.xcarchive", exportPath: "/tmp/export", exportOptionsPlist: "/tmp/ExportOptions.plist" }`,
65
+ inputSchema: z.object({
66
+ archivePath: z.string().describe('Path to .xcarchive'),
67
+ exportPath: z.string().describe('Directory for exported IPA'),
68
+ exportOptionsPlist: z.string().describe('Path to ExportOptions.plist'),
69
+ }),
70
+ handler: async (options) => {
71
+ return xcodeTools.exportIPA(options);
72
+ },
73
+ });
74
+ // ============================================================================
75
+ // Test Tools
76
+ // ============================================================================
77
+ registerTool({
78
+ name: 'ios_run_tests',
79
+ description: `Run unit/UI tests using xcodebuild test.
80
+
81
+ Returns test results with pass/fail counts and individual test outcomes.
82
+
83
+ Examples:
84
+ - Run all tests: { scheme: "MyAppTests", destination: "platform=iOS Simulator,name=iPhone 15" }
85
+ - Run specific test: { scheme: "MyAppTests", onlyTesting: ["MyAppTests/MyTestClass/testMethod"] }
86
+ - Run test plan: { scheme: "MyApp", testPlan: "AllTests" }`,
87
+ inputSchema: z.object({
88
+ project: z.string().optional().describe('Path to .xcodeproj file'),
89
+ workspace: z.string().optional().describe('Path to .xcworkspace file'),
90
+ scheme: z.string().describe('Test scheme name'),
91
+ configuration: z.enum(['Debug', 'Release']).optional().default('Debug'),
92
+ destination: z.string().optional().describe('Test destination (device or simulator)'),
93
+ testPlan: z.string().optional().describe('Test plan name'),
94
+ onlyTesting: z.array(z.string()).optional().describe('Specific tests to run (e.g., ["TestClass/testMethod"])'),
95
+ skipTesting: z.array(z.string()).optional().describe('Tests to skip'),
96
+ parallelTesting: z.boolean().optional().default(false).describe('Enable parallel testing'),
97
+ retryCount: z.number().optional().describe('Number of times to retry failed tests'),
98
+ }),
99
+ handler: async (options) => {
100
+ return xcodeTools.runTests(options);
101
+ },
102
+ });
103
+ // ============================================================================
104
+ // Debug Tools
105
+ // ============================================================================
106
+ registerTool({
107
+ name: 'ios_debug_app',
108
+ description: `Start debugging an app on device using lldb.
109
+
110
+ Launches the app and attaches the debugger. Use for debugging crashes, breakpoints, etc.
111
+
112
+ Examples:
113
+ - Debug app: { deviceId: "00008030-00146...", bundleId: "com.myapp.ios" }
114
+ - Wait for debugger: { deviceId: "...", bundleId: "com.myapp.ios", waitForDebugger: true }
115
+ - With environment: { deviceId: "...", bundleId: "com.myapp.ios", environment: { "DEBUG": "1" } }`,
116
+ inputSchema: z.object({
117
+ deviceId: z.string().describe('Device UDID'),
118
+ bundleId: z.string().describe('App bundle identifier'),
119
+ waitForDebugger: z.boolean().optional().default(false).describe('Wait for debugger to attach before launching'),
120
+ environment: z.record(z.string()).optional().describe('Environment variables to set'),
121
+ arguments: z.array(z.string()).optional().describe('Command line arguments'),
122
+ }),
123
+ handler: async (options) => {
124
+ return xcodeTools.startDebugServer(options);
125
+ },
126
+ });
127
+ registerTool({
128
+ name: 'ios_attach_debugger',
129
+ description: `Attach debugger to a running process.
130
+
131
+ Attaches lldb to an already running app for debugging.
132
+
133
+ Examples:
134
+ - Attach by bundle ID: { deviceId: "...", bundleId: "com.myapp.ios" }
135
+ - Attach by PID: { deviceId: "...", bundleId: "com.myapp.ios", pid: 12345 }`,
136
+ inputSchema: z.object({
137
+ deviceId: z.string().describe('Device UDID'),
138
+ bundleId: z.string().describe('App bundle identifier'),
139
+ pid: z.number().optional().describe('Process ID (optional, uses bundle ID if omitted)'),
140
+ }),
141
+ handler: async (options) => {
142
+ return xcodeTools.attachToProcess(options);
143
+ },
144
+ });
145
+ // ============================================================================
146
+ // App Console (Filtered Logs)
147
+ // ============================================================================
148
+ registerTool({
149
+ name: 'ios_app_console',
150
+ description: `Stream console logs for a specific app.
151
+
152
+ Filters device logs to show only messages from the specified app. Useful for debugging app behavior.
153
+
154
+ Examples:
155
+ - Stream app logs for 30s: { deviceId: "...", bundleId: "com.myapp.ios" }
156
+ - Extended logging: { deviceId: "...", bundleId: "com.myapp.ios", timeoutSeconds: 60, maxLines: 2000 }`,
157
+ inputSchema: z.object({
158
+ deviceId: z.string().describe('Device UDID'),
159
+ bundleId: z.string().describe('App bundle identifier to filter logs'),
160
+ timeoutSeconds: z.number().min(5).max(300).default(30).describe('How long to collect logs'),
161
+ maxLines: z.number().min(10).max(5000).default(500).optional().describe('Maximum log lines'),
162
+ includeSystem: z.boolean().optional().default(false).describe('Include system logs (not just app)'),
163
+ }),
164
+ handler: async ({ deviceId, bundleId, timeoutSeconds, maxLines, includeSystem }) => {
165
+ const result = await xcodeTools.streamAppConsole({
166
+ deviceId,
167
+ bundleId,
168
+ timeoutMs: timeoutSeconds * 1000,
169
+ maxLines,
170
+ includeSystem,
171
+ });
172
+ return {
173
+ logCount: result.logs.length,
174
+ truncated: result.truncated,
175
+ logs: result.logs,
176
+ bundleId,
177
+ };
178
+ },
179
+ });
180
+ // ============================================================================
181
+ // Performance Profiling (Instruments)
182
+ // ============================================================================
183
+ registerTool({
184
+ name: 'ios_list_instruments_templates',
185
+ description: `List available Instruments templates for profiling.
186
+
187
+ Returns all available profiling templates like Time Profiler, Allocations, Leaks, etc.
188
+
189
+ Example:
190
+ - List templates: {}`,
191
+ inputSchema: z.object({}),
192
+ handler: async () => {
193
+ return xcodeTools.listInstrumentsTemplates();
194
+ },
195
+ });
196
+ registerTool({
197
+ name: 'ios_run_instruments',
198
+ description: `Run Instruments profiling on device.
199
+
200
+ Profiles app performance using the specified template. Results saved to trace file.
201
+
202
+ Examples:
203
+ - Time profile: { deviceId: "...", bundleId: "com.myapp.ios", template: "Time Profiler", outputPath: "/tmp/trace.trace" }
204
+ - Memory profile: { deviceId: "...", bundleId: "com.myapp.ios", template: "Allocations", outputPath: "/tmp/alloc.trace" }
205
+ - Leaks check: { deviceId: "...", bundleId: "com.myapp.ios", template: "Leaks", outputPath: "/tmp/leaks.trace" }`,
206
+ inputSchema: z.object({
207
+ deviceId: z.string().describe('Device UDID'),
208
+ template: z.string().describe('Instruments template name (e.g., "Time Profiler", "Allocations", "Leaks")'),
209
+ bundleId: z.string().optional().describe('App bundle identifier'),
210
+ appPath: z.string().optional().describe('Path to .app bundle'),
211
+ outputPath: z.string().describe('Path for output .trace file'),
212
+ duration: z.number().optional().default(60).describe('Profiling duration in seconds'),
213
+ extraArgs: z.array(z.string()).optional().describe('Additional instruments arguments'),
214
+ }),
215
+ handler: async (options) => {
216
+ return xcodeTools.runInstruments({
217
+ deviceId: options.deviceId,
218
+ template: options.template,
219
+ bundleId: options.bundleId,
220
+ appPath: options.appPath,
221
+ outputPath: options.outputPath,
222
+ duration: options.duration,
223
+ extraArgs: options.extraArgs,
224
+ });
225
+ },
226
+ });
227
+ registerTool({
228
+ name: 'ios_profile_time',
229
+ description: `Run Time Profiler on app.
230
+
231
+ Profiles CPU usage to identify performance bottlenecks.
232
+
233
+ Examples:
234
+ - Profile for 60s: { deviceId: "...", bundleId: "com.myapp.ios", outputPath: "/tmp/time-profile.trace" }`,
235
+ inputSchema: z.object({
236
+ deviceId: z.string().describe('Device UDID'),
237
+ bundleId: z.string().describe('App bundle identifier'),
238
+ outputPath: z.string().describe('Path for output .trace file'),
239
+ duration: z.number().optional().default(60).describe('Profiling duration in seconds'),
240
+ }),
241
+ handler: async (options) => {
242
+ return xcodeTools.runTimeProfiler(options);
243
+ },
244
+ });
245
+ registerTool({
246
+ name: 'ios_profile_memory',
247
+ description: `Run Allocations profiler on app.
248
+
249
+ Tracks memory allocations to identify memory usage patterns.
250
+
251
+ Examples:
252
+ - Profile memory: { deviceId: "...", bundleId: "com.myapp.ios", outputPath: "/tmp/allocations.trace" }`,
253
+ inputSchema: z.object({
254
+ deviceId: z.string().describe('Device UDID'),
255
+ bundleId: z.string().describe('App bundle identifier'),
256
+ outputPath: z.string().describe('Path for output .trace file'),
257
+ duration: z.number().optional().default(60).describe('Profiling duration in seconds'),
258
+ }),
259
+ handler: async (options) => {
260
+ return xcodeTools.runAllocationsProfiler(options);
261
+ },
262
+ });
263
+ registerTool({
264
+ name: 'ios_profile_leaks',
265
+ description: `Run Leaks profiler on app.
266
+
267
+ Detects memory leaks in the application.
268
+
269
+ Examples:
270
+ - Check for leaks: { deviceId: "...", bundleId: "com.myapp.ios", outputPath: "/tmp/leaks.trace" }`,
271
+ inputSchema: z.object({
272
+ deviceId: z.string().describe('Device UDID'),
273
+ bundleId: z.string().describe('App bundle identifier'),
274
+ outputPath: z.string().describe('Path for output .trace file'),
275
+ duration: z.number().optional().default(60).describe('Profiling duration in seconds'),
276
+ }),
277
+ handler: async (options) => {
278
+ return xcodeTools.runLeaksProfiler(options);
279
+ },
280
+ });
281
+ //# sourceMappingURL=build.js.map
@@ -2,80 +2,7 @@
2
2
  * Diagnostics Tools
3
3
  * Device diagnostics and information
4
4
  */
5
- import { z } from 'zod';
6
- import { registerTool } from '../registry.js';
7
- import { LibIMobileDevice } from '@ebowwa/ios-devices';
8
- registerTool({
9
- name: 'ios_get_diagnostics',
10
- description: 'Get device diagnostics (WiFi, Battery, NAND, etc.)',
11
- inputSchema: z.object({
12
- deviceId: z.string().describe('Device UDID'),
13
- type: z.enum(['All', 'WiFi', 'GasGauge', 'NAND', 'Battery', 'HDMI']).default('All'),
14
- }),
15
- handler: async ({ deviceId, type }) => {
16
- const lib = new LibIMobileDevice({ udid: deviceId });
17
- return lib.getDiagnostics(type);
18
- },
19
- });
20
- registerTool({
21
- name: 'ios_get_ioreg',
22
- description: 'Get IO Registry information',
23
- inputSchema: z.object({
24
- deviceId: z.string().describe('Device UDID'),
25
- plane: z.enum(['IODeviceTree', 'IOPower', 'IOService']).optional(),
26
- }),
27
- handler: async ({ deviceId, plane }) => {
28
- const lib = new LibIMobileDevice({ udid: deviceId });
29
- return lib.getIORegistry(plane);
30
- },
31
- });
32
- registerTool({
33
- name: 'ios_get_mobilegestalt',
34
- description: 'Get MobileGestalt values from device',
35
- inputSchema: z.object({
36
- deviceId: z.string().describe('Device UDID'),
37
- keys: z.array(z.string()).describe('Keys to query'),
38
- }),
39
- handler: async ({ deviceId, keys }) => {
40
- const lib = new LibIMobileDevice({ udid: deviceId });
41
- return lib.getMobileGestalt(...keys);
42
- },
43
- });
44
- registerTool({
45
- name: 'ios_mount_image',
46
- description: 'Mount developer disk image on device',
47
- inputSchema: z.object({
48
- deviceId: z.string().describe('Device UDID'),
49
- imagePath: z.string().describe('Path to developer disk image'),
50
- signaturePath: z.string().optional().describe('Path to signature file'),
51
- }),
52
- handler: async ({ deviceId, imagePath, signaturePath }) => {
53
- const lib = new LibIMobileDevice({ udid: deviceId });
54
- return lib.mountImage(imagePath, signaturePath);
55
- },
56
- });
57
- registerTool({
58
- name: 'ios_start_debug_server',
59
- description: 'Start debug server proxy for remote debugging',
60
- inputSchema: z.object({
61
- deviceId: z.string().describe('Device UDID'),
62
- port: z.number().default(6666).describe('Port for debug server'),
63
- }),
64
- handler: async ({ deviceId, port }) => {
65
- const lib = new LibIMobileDevice({ udid: deviceId });
66
- return lib.startDebugServerProxy(port);
67
- },
68
- });
69
- registerTool({
70
- name: 'ios_start_bluetooth_logger',
71
- description: 'Start Bluetooth packet logging',
72
- inputSchema: z.object({
73
- deviceId: z.string().describe('Device UDID'),
74
- outputPath: z.string().optional().describe('Output file path'),
75
- }),
76
- handler: async ({ deviceId, outputPath }) => {
77
- const lib = new LibIMobileDevice({ udid: deviceId });
78
- return lib.startBluetoothLogging(outputPath);
79
- },
80
- });
5
+ from;
6
+ '@ebowwa/ios-devices';
7
+ export {};
81
8
  //# sourceMappingURL=diagnostics.js.map
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Logging & Diagnostics Tools
3
- * Collect logs and diagnostic information from iOS devices
3
+ * Collect logs and diagnostic information from iOS device
4
4
  */
5
5
  export {};
6
6
  //# sourceMappingURL=log.d.ts.map
package/dist/tools/log.js CHANGED
@@ -1,10 +1,36 @@
1
1
  /**
2
2
  * Logging & Diagnostics Tools
3
- * Collect logs and diagnostic information from iOS devices
3
+ * Collect logs and diagnostic information from iOS device
4
4
  */
5
5
  import { z } from 'zod';
6
6
  import { registerTool } from '../registry.js';
7
7
  import { LibIMobileDevice, DeviceCtl } from '@ebowwa/ios-devices';
8
+ registerTool({
9
+ name: 'ios_get_device_logs',
10
+ description: `Get device logs via xcrun devicectl (iOS 17+).
11
+
12
+ Retrieves log information and entries from the device using devicectl.
13
+ Works with modern devices that support devicectl.
14
+
15
+ Examples:
16
+ - Get logs from device: { deviceId: "00008030-00146..." }
17
+ - With custom timeout: { deviceId: "...", timeout: 60 }`,
18
+ inputSchema: z.object({
19
+ deviceId: z.string().describe('Device UDID'),
20
+ timeout: z.number().min(10).max(300).default(60).optional().describe('Timeout in seconds (default 120)'),
21
+ }),
22
+ handler: async ({ deviceId, timeout }) => {
23
+ const deviceCtl = new DeviceCtl();
24
+ const result = await deviceCtl.getDeviceLogs(deviceId, {
25
+ timeout: (timeout ?? 120) * 1000,
26
+ });
27
+ return {
28
+ success: result.success,
29
+ logs: result.stdout,
30
+ error: result.stderr || undefined,
31
+ };
32
+ },
33
+ });
8
34
  registerTool({
9
35
  name: 'ios_stream_syslog',
10
36
  description: `Stream syslog from device with timeout control.
@@ -35,7 +61,7 @@ Examples:
35
61
  logCount: result.logs.length,
36
62
  truncated: result.truncated,
37
63
  logs: result.logs,
38
- rawOutput: result.rawOutput.slice(0, 5000), // Include first 5000 chars of raw output
64
+ rawOutput: result.rawOutput.slice(0, 5000),
39
65
  };
40
66
  },
41
67
  });
@@ -51,6 +77,20 @@ registerTool({
51
77
  return lib.getSyslogArchive(outputPath);
52
78
  },
53
79
  });
80
+ registerTool({
81
+ name: 'ios_download_crash_reports',
82
+ description: 'Download crash reports from device',
83
+ inputSchema: z.object({
84
+ deviceId: z.string().describe('Device UDID'),
85
+ outputDirectory: z.string().describe('Directory to save crash reports'),
86
+ extract: z.boolean().optional().describe('Extract crash reports'),
87
+ keep: z.boolean().optional().describe('Keep reports on device'),
88
+ }),
89
+ handler: async ({ deviceId, outputDirectory, extract, keep }) => {
90
+ const lib = new LibIMobileDevice({ udid: deviceId });
91
+ return lib.downloadCrashReports(outputDirectory, { extract, keep });
92
+ },
93
+ });
54
94
  registerTool({
55
95
  name: 'ios_collect_diagnostics',
56
96
  description: `Collect diagnostic information from device(s).
@@ -69,30 +109,34 @@ Examples:
69
109
  const deviceCtl = new DeviceCtl();
70
110
  const result = await deviceCtl.collectDiagnostics({
71
111
  devices: deviceId,
72
- archiveDestination
112
+ archiveDestination,
73
113
  });
114
+ if (!result.success) {
115
+ return {
116
+ success: false,
117
+ stdout: '',
118
+ stderr: result.stderr,
119
+ exitCode: result.exitCode,
120
+ };
121
+ }
122
+ try {
123
+ const parsed = JSON.parse(result.stdout);
124
+ if (parsed?.diagnosticEntries) {
125
+ return parsed.diagnosticEntries;
126
+ }
127
+ }
128
+ catch {
129
+ // Not valid JSON, return raw output
130
+ }
74
131
  return {
75
132
  success: result.success,
76
- archivePath: archiveDestination || '/tmp/devicectl_diagnose_<timestamp>.zip',
133
+ archivePath: archiveDestination || `/tmp/devicectl_diagnose_${new Date().toISOString()}.zip`,
77
134
  stdout: result.stdout,
78
135
  stderr: result.stderr,
136
+ exitCode: result.exitCode,
79
137
  };
80
138
  },
81
139
  });
82
- registerTool({
83
- name: 'ios_download_crash_reports',
84
- description: 'Download crash reports from device',
85
- inputSchema: z.object({
86
- deviceId: z.string().describe('Device UDID'),
87
- outputDirectory: z.string().describe('Directory to save crash reports'),
88
- extract: z.boolean().optional().describe('Extract crash reports'),
89
- keep: z.boolean().optional().describe('Keep reports on device'),
90
- }),
91
- handler: async ({ deviceId, outputDirectory, extract, keep }) => {
92
- const lib = new LibIMobileDevice({ udid: deviceId });
93
- return lib.downloadCrashReports(outputDirectory, { extract, keep });
94
- },
95
- });
96
140
  registerTool({
97
141
  name: 'ios_get_diagnostics',
98
142
  description: 'Get diagnostics information (WiFi, Battery, NAND, etc.)',
package/head ADDED
@@ -0,0 +1,50 @@
1
+ error: unknown switch `5'
2
+ error: unknown switch `5'
3
+ usage: git status [<options>] [--] [<pathspec>...]
4
+
5
+ -v, --[no-]verbose be verbose
6
+ -s, --[no-]short show status concisely
7
+ -b, --[no-]branch show branch information
8
+ --[no-]show-stash show stash information
9
+ --[no-]ahead-behind compute full ahead/behind values
10
+ --[no-]porcelainusage: git status [<options>] [--] [<pathspec>...]
11
+
12
+ -v, --[no-]verbose be verbose
13
+ -s, --[no-]short show status concisely
14
+ -b, --[no-]branch show branch information
15
+ --[no-]show-stash show stash information
16
+ --[no-]ahead-behind compute full ahead/behind values
17
+ --[no-]porcelain[=<version>][=<version>]
18
+ machine-readable output
19
+ --[no-]long show status in long format (default)
20
+ -z, --[no-]null
21
+ machine-readable output
22
+ --[no-]long show status in long format (default)
23
+ -z, --[no-]null terminate entries with NUL
24
+ -u, --[no-]untracked-files[=<mode>] terminate entries with NUL
25
+ -u, --[no-]untracked-files[=<mode>]
26
+ show untracked files, optional modes: all, normal, no. (Default: all)
27
+ --[no-]ignored[=<mode>]
28
+ show untracked files, optional modes: all, normal, no. (Default: all)
29
+ --[no-]ignored[=<mode>]
30
+ show ignored files, optional modes: traditional, matching, no. (Default: traditional)
31
+ --[no-]ignore-submodules[=<when>]
32
+ show ignored files, optional modes: traditional, matching, no. (Default: traditional)
33
+ --[no-]ignore-submodules[=<when>]
34
+ ignore changes to submodules, optional when: all, dirty, untracked. (Default: all)
35
+ --[no-]column[=<style>]
36
+ ignore changes to submodules, optional when: all, dirty, untracked. (Default: all)
37
+ --[no-]column[=<style>]
38
+ list untracked files in columns
39
+ --no-renames do not detect renames
40
+
41
+ list untracked files in columns
42
+ --no-renames do not detect renames
43
+ --renames opposite of --no-renames --renames opposite of --no-renames
44
+ -M, --find-renames
45
+ -M, --find-renames[=<n>]
46
+ detect renames, optionally set similarity index
47
+
48
+ [=<n>]
49
+ detect renames, optionally set similarity index
50
+
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ebowwa/mcp-ios-devices",
3
- "version": "1.0.7",
3
+ "version": "1.1.2",
4
4
  "description": "MCP server for iOS device control - devicectl, libimobiledevice, simctl",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -31,7 +31,7 @@
31
31
  "license": "MIT",
32
32
  "dependencies": {
33
33
  "@anthropic-ai/sdk": "^0.39.0",
34
- "@ebowwa/ios-devices": "^1.0.5",
34
+ "@ebowwa/ios-devices": "^1.1.0",
35
35
  "@modelcontextprotocol/sdk": "^1.0.0",
36
36
  "zod": "^3.22.0"
37
37
  },
package/src/index.ts CHANGED
@@ -38,8 +38,8 @@ import './tools/simulator.js';
38
38
  import './tools/backup.js';
39
39
  import './tools/location.js';
40
40
  import './tools/screenshot.js';
41
- import './tools/diagnostics.js';
42
41
  import './tools/profile.js';
42
+ import './tools/build.js';
43
43
 
44
44
  // Create MCP server
45
45
  const server = new Server(