xcodebuild-axi 0.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.
Files changed (131) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/LICENSE +21 -0
  3. package/README.md +304 -0
  4. package/dist/bin/xcodebuild-axi.d.ts +2 -0
  5. package/dist/bin/xcodebuild-axi.js +8 -0
  6. package/dist/bin/xcodebuild-axi.js.map +1 -0
  7. package/dist/src/action.d.ts +68 -0
  8. package/dist/src/action.js +373 -0
  9. package/dist/src/action.js.map +1 -0
  10. package/dist/src/archive.d.ts +33 -0
  11. package/dist/src/archive.js +77 -0
  12. package/dist/src/archive.js.map +1 -0
  13. package/dist/src/args.d.ts +23 -0
  14. package/dist/src/args.js +123 -0
  15. package/dist/src/args.js.map +1 -0
  16. package/dist/src/auth.d.ts +11 -0
  17. package/dist/src/auth.js +51 -0
  18. package/dist/src/auth.js.map +1 -0
  19. package/dist/src/cli.d.ts +20 -0
  20. package/dist/src/cli.js +132 -0
  21. package/dist/src/cli.js.map +1 -0
  22. package/dist/src/commands/analyze.d.ts +2 -0
  23. package/dist/src/commands/analyze.js +32 -0
  24. package/dist/src/commands/analyze.js.map +1 -0
  25. package/dist/src/commands/archive.d.ts +2 -0
  26. package/dist/src/commands/archive.js +63 -0
  27. package/dist/src/commands/archive.js.map +1 -0
  28. package/dist/src/commands/build.d.ts +2 -0
  29. package/dist/src/commands/build.js +60 -0
  30. package/dist/src/commands/build.js.map +1 -0
  31. package/dist/src/commands/clean.d.ts +2 -0
  32. package/dist/src/commands/clean.js +39 -0
  33. package/dist/src/commands/clean.js.map +1 -0
  34. package/dist/src/commands/coverage.d.ts +2 -0
  35. package/dist/src/commands/coverage.js +111 -0
  36. package/dist/src/commands/coverage.js.map +1 -0
  37. package/dist/src/commands/destinations.d.ts +2 -0
  38. package/dist/src/commands/destinations.js +56 -0
  39. package/dist/src/commands/destinations.js.map +1 -0
  40. package/dist/src/commands/export.d.ts +2 -0
  41. package/dist/src/commands/export.js +170 -0
  42. package/dist/src/commands/export.js.map +1 -0
  43. package/dist/src/commands/find.d.ts +2 -0
  44. package/dist/src/commands/find.js +70 -0
  45. package/dist/src/commands/find.js.map +1 -0
  46. package/dist/src/commands/home.d.ts +9 -0
  47. package/dist/src/commands/home.js +97 -0
  48. package/dist/src/commands/home.js.map +1 -0
  49. package/dist/src/commands/info.d.ts +2 -0
  50. package/dist/src/commands/info.js +95 -0
  51. package/dist/src/commands/info.js.map +1 -0
  52. package/dist/src/commands/localize.d.ts +2 -0
  53. package/dist/src/commands/localize.js +121 -0
  54. package/dist/src/commands/localize.js.map +1 -0
  55. package/dist/src/commands/migrate.d.ts +8 -0
  56. package/dist/src/commands/migrate.js +177 -0
  57. package/dist/src/commands/migrate.js.map +1 -0
  58. package/dist/src/commands/packages.d.ts +2 -0
  59. package/dist/src/commands/packages.js +108 -0
  60. package/dist/src/commands/packages.js.map +1 -0
  61. package/dist/src/commands/platforms.d.ts +2 -0
  62. package/dist/src/commands/platforms.js +379 -0
  63. package/dist/src/commands/platforms.js.map +1 -0
  64. package/dist/src/commands/result.d.ts +2 -0
  65. package/dist/src/commands/result.js +100 -0
  66. package/dist/src/commands/result.js.map +1 -0
  67. package/dist/src/commands/schemes.d.ts +2 -0
  68. package/dist/src/commands/schemes.js +39 -0
  69. package/dist/src/commands/schemes.js.map +1 -0
  70. package/dist/src/commands/settings.d.ts +2 -0
  71. package/dist/src/commands/settings.js +191 -0
  72. package/dist/src/commands/settings.js.map +1 -0
  73. package/dist/src/commands/setup.d.ts +2 -0
  74. package/dist/src/commands/setup.js +84 -0
  75. package/dist/src/commands/setup.js.map +1 -0
  76. package/dist/src/commands/sim.d.ts +2 -0
  77. package/dist/src/commands/sim.js +187 -0
  78. package/dist/src/commands/sim.js.map +1 -0
  79. package/dist/src/commands/test.d.ts +2 -0
  80. package/dist/src/commands/test.js +317 -0
  81. package/dist/src/commands/test.js.map +1 -0
  82. package/dist/src/commands/testplans.d.ts +8 -0
  83. package/dist/src/commands/testplans.js +75 -0
  84. package/dist/src/commands/testplans.js.map +1 -0
  85. package/dist/src/commands/tests.d.ts +13 -0
  86. package/dist/src/commands/tests.js +154 -0
  87. package/dist/src/commands/tests.js.map +1 -0
  88. package/dist/src/commands/xcframework.d.ts +2 -0
  89. package/dist/src/commands/xcframework.js +77 -0
  90. package/dist/src/commands/xcframework.js.map +1 -0
  91. package/dist/src/context.d.ts +23 -0
  92. package/dist/src/context.js +72 -0
  93. package/dist/src/context.js.map +1 -0
  94. package/dist/src/destination.d.ts +50 -0
  95. package/dist/src/destination.js +174 -0
  96. package/dist/src/destination.js.map +1 -0
  97. package/dist/src/errors.d.ts +6 -0
  98. package/dist/src/errors.js +55 -0
  99. package/dist/src/errors.js.map +1 -0
  100. package/dist/src/packages.d.ts +31 -0
  101. package/dist/src/packages.js +117 -0
  102. package/dist/src/packages.js.map +1 -0
  103. package/dist/src/report.d.ts +20 -0
  104. package/dist/src/report.js +39 -0
  105. package/dist/src/report.js.map +1 -0
  106. package/dist/src/scheme.d.ts +22 -0
  107. package/dist/src/scheme.js +66 -0
  108. package/dist/src/scheme.js.map +1 -0
  109. package/dist/src/simctl.d.ts +33 -0
  110. package/dist/src/simctl.js +85 -0
  111. package/dist/src/simctl.js.map +1 -0
  112. package/dist/src/surface.d.ts +55 -0
  113. package/dist/src/surface.js +350 -0
  114. package/dist/src/surface.js.map +1 -0
  115. package/dist/src/toon.d.ts +34 -0
  116. package/dist/src/toon.js +79 -0
  117. package/dist/src/toon.js.map +1 -0
  118. package/dist/src/version.d.ts +1 -0
  119. package/dist/src/version.js +24 -0
  120. package/dist/src/version.js.map +1 -0
  121. package/dist/src/xccov.d.ts +25 -0
  122. package/dist/src/xccov.js +78 -0
  123. package/dist/src/xccov.js.map +1 -0
  124. package/dist/src/xcodebuild.d.ts +65 -0
  125. package/dist/src/xcodebuild.js +163 -0
  126. package/dist/src/xcodebuild.js.map +1 -0
  127. package/dist/src/xcresult.d.ts +96 -0
  128. package/dist/src/xcresult.js +156 -0
  129. package/dist/src/xcresult.js.map +1 -0
  130. package/package.json +75 -0
  131. package/skills/xcodebuild-axi/SKILL.md +64 -0
@@ -0,0 +1,317 @@
1
+ import { AxiError, mapXcodebuildError } from "../errors.js";
2
+ import { BUILD_FLAG_HELP, resolveBuildContext, runAction, SHARED_BUILD_FLAGS, SHARED_BUILD_VALUE_FLAGS, } from "../action.js";
3
+ import { readBuildResults, readTestSummary, toDiagnostics, describeDevice, } from "../xcresult.js";
4
+ import { readCoverage, percent } from "../xccov.js";
5
+ import { diagnosticsBlock, transcriptTail } from "../report.js";
6
+ import { duration, renderFields, renderHelp, renderList, renderOutput, tildePath, truncate, } from "../toon.js";
7
+ import { getFlag, getIntFlag, getListFlag, hasFlag, rejectUnknownFlags, } from "../args.js";
8
+ export const TEST_HELP = `usage: xcodebuild-axi test [flags]
9
+ Runs a scheme's tests and reports the counts plus only the failures.
10
+ flags[66]:
11
+ ${BUILD_FLAG_HELP}
12
+ --test-plan <name> test plan to run
13
+ --only <id> run only this test/class/target; repeatable or comma-separated
14
+ --skip <id> skip this test/class/target; repeatable or comma-separated
15
+ --coverage collect code coverage and report the overall percentage
16
+ --without-building test already-built products (test-without-building)
17
+ --xctestrun <path> test from an .xctestrun file instead of a scheme
18
+ --parallel <n> exact number of parallel test runners
19
+ --no-parallel disable parallel testing
20
+ --iterations <n> run the tests this many times
21
+ --retry retry failures, up to --iterations (default 3)
22
+ --until-failure repeat until something fails, up to --iterations (default 100)
23
+ --language <iso639> run in this language
24
+ --region <iso3166> run in this region
25
+ --diagnostics collect verbose diagnostics on failure
26
+ --perf-diagnostics collect performance traces and memgraphs for performance tests
27
+ --relaunch relaunch the process between repetitions
28
+ --only-configuration <name> run only this test configuration; repeatable
29
+ --skip-configuration <name> skip this test configuration; repeatable
30
+ --max-workers <n> cap on parallel test runners
31
+ --max-sim-destinations <n> cap on simulator destinations tested concurrently
32
+ --max-device-destinations <n> cap on device destinations tested concurrently
33
+ --default-test-timeout <secs> default per-test allowance when timeouts are on
34
+ --test-products <path> where to find the built test products
35
+ --test-timeout <secs> per-test execution allowance (default: 300, 0 disables)
36
+ --max-failures <n> failures to list before summarizing the rest (default: 20)
37
+ exit:
38
+ 0 all tests passed, 1 a test or the build failed, 2 usage error
39
+ examples:
40
+ xcodebuild-axi test
41
+ xcodebuild-axi test --scheme MyApp --device "iPhone 17 Pro"
42
+ xcodebuild-axi test --scheme MyApp --only MyAppTests/CheckoutTests
43
+ xcodebuild-axi test --scheme MyApp --coverage
44
+ `;
45
+ const FLAGS = [
46
+ ...SHARED_BUILD_FLAGS,
47
+ "--test-plan",
48
+ "--only",
49
+ "--skip",
50
+ "--coverage",
51
+ "--without-building",
52
+ "--xctestrun",
53
+ "--parallel",
54
+ "--no-parallel",
55
+ "--iterations",
56
+ "--retry",
57
+ "--until-failure",
58
+ "--language",
59
+ "--region",
60
+ "--diagnostics",
61
+ "--perf-diagnostics",
62
+ "--relaunch",
63
+ "--only-configuration",
64
+ "--skip-configuration",
65
+ "--max-workers",
66
+ "--max-sim-destinations",
67
+ "--max-device-destinations",
68
+ "--default-test-timeout",
69
+ "--test-products",
70
+ "--test-timeout",
71
+ "--max-failures",
72
+ ];
73
+ const VALUE_FLAGS = [
74
+ ...SHARED_BUILD_VALUE_FLAGS,
75
+ "--test-plan",
76
+ "--only",
77
+ "--skip",
78
+ "--xctestrun",
79
+ "--parallel",
80
+ "--iterations",
81
+ "--language",
82
+ "--region",
83
+ "--only-configuration",
84
+ "--skip-configuration",
85
+ "--max-workers",
86
+ "--max-sim-destinations",
87
+ "--max-device-destinations",
88
+ "--default-test-timeout",
89
+ "--test-products",
90
+ "--test-timeout",
91
+ "--max-failures",
92
+ ];
93
+ export async function testCommand(args) {
94
+ rejectUnknownFlags(args, "test", FLAGS, VALUE_FLAGS);
95
+ if (hasFlag(args, "--retry") && hasFlag(args, "--until-failure")) {
96
+ // xcodebuild rejects this combination itself, but only after building.
97
+ throw new AxiError("--retry and --until-failure cannot be used together", "VALIDATION_ERROR", [
98
+ "--retry stops at the first success, --until-failure stops at the first failure",
99
+ ]);
100
+ }
101
+ const withoutBuilding = hasFlag(args, "--without-building") ||
102
+ getFlag(args, "--xctestrun") !== undefined;
103
+ const context = await resolveBuildContext({ args, command: "test" });
104
+ const coverage = hasFlag(args, "--coverage");
105
+ const run = await runAction({
106
+ context,
107
+ command: "test",
108
+ actions: [withoutBuilding ? "test-without-building" : "test"],
109
+ extraArgs: testArgs(args, coverage),
110
+ });
111
+ const summary = await readTestSummary(run.resultPath).catch(() => undefined);
112
+ // No test summary on a nonzero exit means the tests never ran — the build
113
+ // under them failed, or xcodebuild refused the invocation. Report that as a
114
+ // build failure rather than "0 tests", which reads like a passing run.
115
+ if (!summary || summary.totalTestCount === undefined) {
116
+ return renderTestsNeverRan(context, run);
117
+ }
118
+ return renderTestSummary({
119
+ context,
120
+ summary,
121
+ run,
122
+ maxFailures: getIntFlag(args, "--max-failures") ?? 20,
123
+ full: context.full,
124
+ coverage,
125
+ });
126
+ }
127
+ function testArgs(args, coverage) {
128
+ const testPlan = getFlag(args, "--test-plan");
129
+ const xctestrun = getFlag(args, "--xctestrun");
130
+ const timeout = getIntFlag(args, "--test-timeout") ?? 300;
131
+ const iterations = getIntFlag(args, "--iterations");
132
+ const parallel = getIntFlag(args, "--parallel");
133
+ const language = getFlag(args, "--language");
134
+ const region = getFlag(args, "--region");
135
+ const maxWorkers = getIntFlag(args, "--max-workers");
136
+ const maxSimDestinations = getIntFlag(args, "--max-sim-destinations");
137
+ const maxDeviceDestinations = getIntFlag(args, "--max-device-destinations");
138
+ const defaultTimeout = getIntFlag(args, "--default-test-timeout");
139
+ const testProducts = getFlag(args, "--test-products");
140
+ return [
141
+ ...(xctestrun ? ["-xctestrun", xctestrun] : []),
142
+ ...(testPlan ? ["-testPlan", testPlan] : []),
143
+ ...getListFlag(args, "--only").flatMap((id) => ["-only-testing", id]),
144
+ ...getListFlag(args, "--skip").flatMap((id) => ["-skip-testing", id]),
145
+ ...(coverage ? ["-enableCodeCoverage", "YES"] : []),
146
+ ...(parallel !== undefined
147
+ ? [
148
+ "-parallel-testing-enabled",
149
+ "YES",
150
+ "-parallel-testing-worker-count",
151
+ String(parallel),
152
+ ]
153
+ : []),
154
+ ...(hasFlag(args, "--no-parallel")
155
+ ? ["-parallel-testing-enabled", "NO"]
156
+ : []),
157
+ ...(iterations !== undefined
158
+ ? ["-test-iterations", String(iterations)]
159
+ : []),
160
+ ...(hasFlag(args, "--retry") ? ["-retry-tests-on-failure"] : []),
161
+ ...(hasFlag(args, "--until-failure") ? ["-run-tests-until-failure"] : []),
162
+ ...(language ? ["-testLanguage", language] : []),
163
+ ...(region ? ["-testRegion", region] : []),
164
+ ...(hasFlag(args, "--diagnostics")
165
+ ? ["-collect-test-diagnostics", "on-failure"]
166
+ : []),
167
+ ...(hasFlag(args, "--perf-diagnostics")
168
+ ? ["-enablePerformanceTestsDiagnostics", "YES"]
169
+ : []),
170
+ ...(hasFlag(args, "--relaunch")
171
+ ? ["-test-repetition-relaunch-enabled", "YES"]
172
+ : []),
173
+ ...getListFlag(args, "--only-configuration").flatMap((name) => [
174
+ "-only-test-configuration",
175
+ name,
176
+ ]),
177
+ ...getListFlag(args, "--skip-configuration").flatMap((name) => [
178
+ "-skip-test-configuration",
179
+ name,
180
+ ]),
181
+ ...(maxWorkers !== undefined
182
+ ? ["-maximum-parallel-testing-workers", String(maxWorkers)]
183
+ : []),
184
+ ...(maxSimDestinations !== undefined
185
+ ? [
186
+ "-maximum-concurrent-test-simulator-destinations",
187
+ String(maxSimDestinations),
188
+ ]
189
+ : []),
190
+ ...(maxDeviceDestinations !== undefined
191
+ ? [
192
+ "-maximum-concurrent-test-device-destinations",
193
+ String(maxDeviceDestinations),
194
+ ]
195
+ : []),
196
+ ...(defaultTimeout !== undefined
197
+ ? ["-default-test-execution-time-allowance", String(defaultTimeout)]
198
+ : []),
199
+ ...(testProducts ? ["-testProductsPath", testProducts] : []),
200
+ // A wedged test otherwise runs until the caller's own timeout kills it,
201
+ // with nothing in the output saying which one hung.
202
+ ...(timeout > 0
203
+ ? [
204
+ "-test-timeouts-enabled",
205
+ "YES",
206
+ "-maximum-test-execution-time-allowance",
207
+ String(timeout),
208
+ ]
209
+ : []),
210
+ ];
211
+ }
212
+ async function renderTestsNeverRan(context, run) {
213
+ const results = await readBuildResults(run.resultPath).catch(() => undefined);
214
+ const errors = toDiagnostics(results?.errors);
215
+ if (errors.length === 0) {
216
+ const mapped = mapXcodebuildError(run.tail);
217
+ if (mapped) {
218
+ throw new AxiError(mapped.message, mapped.code, [
219
+ ...mapped.suggestions,
220
+ `full transcript: ${tildePath(run.logPath)}`,
221
+ ]);
222
+ }
223
+ }
224
+ const blocks = [
225
+ renderFields({
226
+ test: "failed",
227
+ reason: "the build failed, so no test ran",
228
+ scheme: context.scheme,
229
+ ...(context.destination ? { destination: context.destination } : {}),
230
+ duration: duration(run.seconds),
231
+ }),
232
+ ];
233
+ const errorBlock = diagnosticsBlock("errors", errors, context.maxErrors);
234
+ if (errorBlock.block) {
235
+ blocks.push(errorBlock.block);
236
+ }
237
+ else {
238
+ const tail = transcriptTail(run.tail);
239
+ if (tail)
240
+ blocks.push(tail);
241
+ }
242
+ blocks.push(renderFields({
243
+ log: tildePath(run.logPath),
244
+ result: tildePath(run.resultPath),
245
+ }));
246
+ process.exitCode = 1;
247
+ return renderOutput(blocks);
248
+ }
249
+ async function renderTestSummary(options) {
250
+ const { summary, run, context } = options;
251
+ const failed = summary.failedTests ?? 0;
252
+ const passed = summary.passedTests ?? 0;
253
+ const skipped = summary.skippedTests ?? 0;
254
+ const succeeded = run.exitCode === 0 && failed === 0;
255
+ // Report the destination the run actually landed on, not the one requested:
256
+ // a name-based specifier can resolve to a different runtime than expected,
257
+ // and a pass on the wrong OS is a pass the agent should not trust.
258
+ const device = summary.devicesAndConfigurations?.[0]?.device;
259
+ const landed = device
260
+ ? describeDevice(device)
261
+ : (context.destination ?? "unknown");
262
+ const coverageReport = options.coverage
263
+ ? await readCoverage(run.resultPath).catch(() => undefined)
264
+ : undefined;
265
+ const blocks = [
266
+ renderFields({
267
+ test: succeeded ? "passed" : "failed",
268
+ scheme: context.scheme,
269
+ destination: landed,
270
+ // Slash-separated, not comma-separated: TOON quotes any scalar
271
+ // containing a comma, and the quotes cost more than the commas saved.
272
+ tests: `${passed} passed / ${failed} failed / ${skipped} skipped`,
273
+ duration: duration(run.seconds),
274
+ ...(coverageReport
275
+ ? { coverage: percent(coverageReport.lineCoverage) }
276
+ : {}),
277
+ }),
278
+ ];
279
+ const failures = summary.testFailures ?? [];
280
+ if (failures.length > 0) {
281
+ const shown = failures.slice(0, options.maxFailures).map((failure) => ({
282
+ test: failure.testIdentifierString ?? failure.testName ?? "unknown",
283
+ target: failure.targetName ?? "",
284
+ message: options.full
285
+ ? (failure.failureText ?? "").replace(/\s+/g, " ").trim()
286
+ : truncate((failure.failureText ?? "").replace(/\s+/g, " ").trim(), 300)
287
+ .text,
288
+ }));
289
+ blocks.push(renderList(failures.length > shown.length
290
+ ? `failures (${shown.length} of ${failures.length})`
291
+ : "failures", shown));
292
+ }
293
+ const runtimeWarnings = summary.runtimeWarnings ?? [];
294
+ if (runtimeWarnings.length > 0) {
295
+ blocks.push(renderFields({ runtime_warnings: runtimeWarnings.length }));
296
+ }
297
+ blocks.push(renderFields({
298
+ log: tildePath(run.logPath),
299
+ result: tildePath(run.resultPath),
300
+ }));
301
+ const hints = [];
302
+ if (failures.length > 0) {
303
+ const first = failures[0]?.testIdentifierString;
304
+ if (first) {
305
+ hints.push(`Run \`xcodebuild-axi test --only ${first}\` to re-run just this failure`);
306
+ }
307
+ hints.push(`Run \`xcodebuild-axi result ${tildePath(run.resultPath)} --failures --full\` for untruncated failure text`);
308
+ }
309
+ if (coverageReport) {
310
+ hints.push(`Run \`xcodebuild-axi coverage ${tildePath(run.resultPath)} --below 50\` for the files that need tests`);
311
+ }
312
+ blocks.push(renderHelp(hints));
313
+ if (!succeeded)
314
+ process.exitCode = 1;
315
+ return renderOutput(blocks);
316
+ }
317
+ //# sourceMappingURL=test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["../../../src/commands/test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export declare const TESTPLANS_HELP = "usage: xcodebuild-axi testplans [flags]\nLists the test plans a scheme is configured with.\nflags[1]:\n --scheme <name> scheme to inspect (required only when the project has more than one)\nexamples:\n xcodebuild-axi testplans\n xcodebuild-axi testplans --scheme MyApp\n";
2
+ export declare function testplansCommand(args: string[]): Promise<string>;
3
+ /**
4
+ * `-showTestPlans` prints a prose heading and then one indented plan per line.
5
+ * The first plan is the scheme's default, which xcodebuild does not mark, so
6
+ * neither do we rather than guess.
7
+ */
8
+ export declare function parseTestPlans(output: string): string[];
@@ -0,0 +1,75 @@
1
+ import { requireProject } from "../context.js";
2
+ import { requireScheme } from "../scheme.js";
3
+ import { runMetadata, stripPreamble } from "../xcodebuild.js";
4
+ import { renderFields, renderHelp, renderOutput } from "../toon.js";
5
+ import { getFlag, rejectUnknownFlags } from "../args.js";
6
+ export const TESTPLANS_HELP = `usage: xcodebuild-axi testplans [flags]
7
+ Lists the test plans a scheme is configured with.
8
+ flags[1]:
9
+ --scheme <name> scheme to inspect (required only when the project has more than one)
10
+ examples:
11
+ xcodebuild-axi testplans
12
+ xcodebuild-axi testplans --scheme MyApp
13
+ `;
14
+ export async function testplansCommand(args) {
15
+ rejectUnknownFlags(args, "testplans", ["--scheme"], ["--scheme"]);
16
+ const project = requireProject();
17
+ const scheme = await requireScheme(project, getFlag(args, "--scheme"), "testplans");
18
+ const { stdout, stderr } = await runMetadata([
19
+ ...project.flags,
20
+ "-scheme",
21
+ scheme,
22
+ "-showTestPlans",
23
+ ]);
24
+ const output = stripPreamble(`${stdout}\n${stderr}`);
25
+ // A scheme without test plans is a normal, common configuration — not a
26
+ // failure. Say so in the scheme's own words so the agent stops looking.
27
+ if (/not configured to use test plans/i.test(output)) {
28
+ return renderOutput([
29
+ renderFields({
30
+ scheme,
31
+ testplans: "none — this scheme does not use test plans",
32
+ }),
33
+ renderHelp([
34
+ `Run \`xcodebuild-axi test --scheme ${scheme}\` to run its tests directly`,
35
+ ]),
36
+ ]);
37
+ }
38
+ const plans = parseTestPlans(output);
39
+ if (plans.length === 0) {
40
+ return renderOutput([
41
+ renderFields({ scheme, testplans: "0 test plans found" }),
42
+ ]);
43
+ }
44
+ return renderOutput([
45
+ renderFields({ scheme, testplans: plans }),
46
+ renderHelp([
47
+ `Run \`xcodebuild-axi test --scheme ${scheme} --test-plan <name>\` to run one`,
48
+ ]),
49
+ ]);
50
+ }
51
+ /**
52
+ * `-showTestPlans` prints a prose heading and then one indented plan per line.
53
+ * The first plan is the scheme's default, which xcodebuild does not mark, so
54
+ * neither do we rather than guess.
55
+ */
56
+ export function parseTestPlans(output) {
57
+ const plans = [];
58
+ let inList = false;
59
+ for (const line of output.split("\n")) {
60
+ if (/Test plans? associated with the ".*" scheme:/i.test(line)) {
61
+ inList = true;
62
+ continue;
63
+ }
64
+ if (!inList)
65
+ continue;
66
+ const trimmed = line.trim();
67
+ if (trimmed.length === 0)
68
+ continue;
69
+ if (!/^\s/.test(line))
70
+ break;
71
+ plans.push(trimmed);
72
+ }
73
+ return plans;
74
+ }
75
+ //# sourceMappingURL=testplans.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testplans.js","sourceRoot":"","sources":["../../../src/commands/testplans.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEzD,MAAM,CAAC,MAAM,cAAc,GAAG;;;;;;;CAO7B,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAc;IACnD,kBAAkB,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAElE,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;IACjC,MAAM,MAAM,GAAG,MAAM,aAAa,CAChC,OAAO,EACP,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,EACzB,WAAW,CACZ,CAAC;IAEF,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC;QAC3C,GAAG,OAAO,CAAC,KAAK;QAChB,SAAS;QACT,MAAM;QACN,gBAAgB;KACjB,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,MAAM,KAAK,MAAM,EAAE,CAAC,CAAC;IAErD,wEAAwE;IACxE,wEAAwE;IACxE,IAAI,mCAAmC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACrD,OAAO,YAAY,CAAC;YAClB,YAAY,CAAC;gBACX,MAAM;gBACN,SAAS,EAAE,4CAA4C;aACxD,CAAC;YACF,UAAU,CAAC;gBACT,sCAAsC,MAAM,8BAA8B;aAC3E,CAAC;SACH,CAAC,CAAC;IACL,CAAC;IAED,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAErC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,YAAY,CAAC;YAClB,YAAY,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,oBAAoB,EAAE,CAAC;SAC1D,CAAC,CAAC;IACL,CAAC;IAED,OAAO,YAAY,CAAC;QAClB,YAAY,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QAC1C,UAAU,CAAC;YACT,sCAAsC,MAAM,kCAAkC;SAC/E,CAAC;KACH,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,IAAI,+CAA+C,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/D,MAAM,GAAG,IAAI,CAAC;YACd,SAAS;QACX,CAAC;QACD,IAAI,CAAC,MAAM;YAAE,SAAS;QACtB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACnC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,MAAM;QAC7B,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,13 @@
1
+ export declare const TESTS_HELP = "usage: xcodebuild-axi tests [flags]\nLists the tests a scheme would run, without running them. Grouped by suite,\nbecause a thousand identifiers is not an answer.\nflags[45]:\n --scheme <name> scheme to act on (required only when the project has more than one)\n --target <name> build a target instead of a scheme; repeatable (project only)\n --all-targets build every target in the project (project only)\n --device <name> simulator or device name, e.g. \"iPhone 17 Pro\" (default: newest simulator)\n --destination <spec> raw xcodebuild destination specifier, passed through untouched\n --configuration <name> build configuration (default: the scheme's own)\n --sdk <name> base SDK, e.g. iphonesimulator\n --arch <arch> architecture to build; repeatable or comma-separated\n --toolchain <name> toolchain identifier or name\n --xcconfig <path> apply build settings from this file as overrides\n --derived-data <path> derived data directory\n --jobs <n> maximum concurrent build operations\n --setting KEY=VALUE build setting override; repeatable or comma-separated\n --sign allow code signing (off by default, so simulator builds need no team)\n --allow-provisioning let xcodebuild talk to the developer portal for profiles\n --sanitizer <name> address, thread, or undefined; repeatable or comma-separated\n --timing report per-command build timings\n --destination-timeout <secs> how long to wait for the destination device\n --parallelize-targets build independent targets in parallel\n --hide-script-env omit shell script environment variables from the log\n --skip-unavailable-actions skip scheme actions that cannot run instead of failing\n --max-errors <n> errors to list before summarizing the rest (default: 20)\n --full list every warning instead of the first 10\n --codesize <dir> write a code size profile to this directory\n --log-level <level> quiet, normal, or verbose \u2014 how much lands in the log file\n --bundle-version <n> result bundle format version (default: xcodebuild's own)\n --stream <path> also write xcodebuild's live result stream here\n --offline resolve using only the versions already in Package.resolved\n --cache <path> clone remote packages into this directory\n --package-cache <path> shared package cache directory (across projects)\n --no-auto-resolve never resolve automatically; fail if Package.resolved is stale\n --skip-package-updates use the packages already cloned, without checking for updates\n --no-package-cache ignore the shared package repository cache\n --skip-plugin-validation trust build plugins without prompting\n --skip-signature-validation do not verify package signatures\n --package-auth <kind> keychain or netrc\n --registry-url <url> default package registry\n --scm-to-registry <kind> none, identity, or swift-package-registry\n --fingerprint-policy <kind> strict or warn\n --signing-entity-policy <kind> strict or warn\n --scm-provider <kind> system or xcode\n --test-plan <name> test plan to enumerate\n --filter <text> only suites or tests whose identifier contains this\n --list print every test identifier instead of per-suite counts\n --max <n> rows to list before summarizing the rest (default: 40)\nnote:\n Enumerating compiles the test bundle, so the first run is as slow as a build.\n It is still far cheaper than running the tests to find out what they are.\nexamples:\n xcodebuild-axi tests --scheme MyApp\n xcodebuild-axi tests --scheme MyApp --filter AppFeature --list\n";
2
+ export declare function testsCommand(args: string[]): Promise<string>;
3
+ /**
4
+ * Collapse `Target/Suite/testName()` identifiers into one row per suite.
5
+ *
6
+ * A scheme with a thousand tests produces a thousand unreadable rows; the
7
+ * shape an agent needs to pick what to run is the suite and how big it is
8
+ * (AXI principle 2).
9
+ */
10
+ export declare function groupBySuite(identifiers: string[]): {
11
+ suite: string;
12
+ tests: number;
13
+ }[];
@@ -0,0 +1,154 @@
1
+ import { readFileSync, rmSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { AxiError, mapXcodebuildError } from "../errors.js";
4
+ import { BUILD_FLAG_HELP, resolveBuildContext, runAction, runLabel, SHARED_BUILD_FLAGS, SHARED_BUILD_VALUE_FLAGS, } from "../action.js";
5
+ import { artifactDir } from "../xcodebuild.js";
6
+ import { duration, renderFields, renderHelp, renderList, renderOutput, tildePath, } from "../toon.js";
7
+ import { getFlag, getIntFlag, hasFlag, rejectUnknownFlags } from "../args.js";
8
+ export const TESTS_HELP = `usage: xcodebuild-axi tests [flags]
9
+ Lists the tests a scheme would run, without running them. Grouped by suite,
10
+ because a thousand identifiers is not an answer.
11
+ flags[45]:
12
+ ${BUILD_FLAG_HELP}
13
+ --test-plan <name> test plan to enumerate
14
+ --filter <text> only suites or tests whose identifier contains this
15
+ --list print every test identifier instead of per-suite counts
16
+ --max <n> rows to list before summarizing the rest (default: 40)
17
+ note:
18
+ Enumerating compiles the test bundle, so the first run is as slow as a build.
19
+ It is still far cheaper than running the tests to find out what they are.
20
+ examples:
21
+ xcodebuild-axi tests --scheme MyApp
22
+ xcodebuild-axi tests --scheme MyApp --filter AppFeature --list
23
+ `;
24
+ const FLAGS = [
25
+ ...SHARED_BUILD_FLAGS,
26
+ "--test-plan",
27
+ "--filter",
28
+ "--list",
29
+ "--max",
30
+ ];
31
+ const VALUE_FLAGS = [
32
+ ...SHARED_BUILD_VALUE_FLAGS,
33
+ "--test-plan",
34
+ "--filter",
35
+ "--max",
36
+ ];
37
+ export async function testsCommand(args) {
38
+ rejectUnknownFlags(args, "tests", FLAGS, VALUE_FLAGS);
39
+ const context = await resolveBuildContext({ args, command: "tests" });
40
+ const outputPath = join(artifactDir(context.project), `${runLabel(context, "tests")}.json`);
41
+ const testPlan = getFlag(args, "--test-plan");
42
+ // xcodebuild appends to an existing enumeration file rather than replacing
43
+ // it, so a stale one from a previous scheme would silently pad the list.
44
+ rmSync(outputPath, { force: true });
45
+ const run = await runAction({
46
+ context,
47
+ command: "tests",
48
+ // -enumerate-tests only takes effect alongside the `test` action; without
49
+ // it xcodebuild builds for testing and writes no enumeration at all.
50
+ actions: ["test"],
51
+ extraArgs: [
52
+ ...(testPlan ? ["-testPlan", testPlan] : []),
53
+ "-enumerate-tests",
54
+ "-test-enumeration-format",
55
+ "json",
56
+ "-test-enumeration-style",
57
+ "flat",
58
+ "-test-enumeration-output-path",
59
+ outputPath,
60
+ ],
61
+ });
62
+ const parsed = readEnumeration(outputPath);
63
+ if (!parsed) {
64
+ const mapped = mapXcodebuildError(run.tail);
65
+ throw new AxiError(mapped?.message ?? "xcodebuild enumerated no tests", mapped?.code ?? "UNKNOWN", [
66
+ ...(mapped?.suggestions ?? []),
67
+ `full transcript: ${tildePath(run.logPath)}`,
68
+ ]);
69
+ }
70
+ const filter = getFlag(args, "--filter")?.toLowerCase();
71
+ const max = getIntFlag(args, "--max") ?? 40;
72
+ const all = (parsed.values ?? []).flatMap((value) => value.enabledTests ?? []);
73
+ const disabled = (parsed.values ?? []).flatMap((value) => value.disabledTests ?? []);
74
+ let identifiers = all
75
+ .map((test) => test.identifier)
76
+ .filter((identifier) => identifier !== undefined);
77
+ if (filter) {
78
+ identifiers = identifiers.filter((identifier) => identifier.toLowerCase().includes(filter));
79
+ }
80
+ if (identifiers.length === 0) {
81
+ return renderOutput([
82
+ renderFields({
83
+ tests: filter
84
+ ? `0 tests match '${getFlag(args, "--filter")}' in scheme ${context.scheme}`
85
+ : `0 tests in scheme ${context.scheme}`,
86
+ }),
87
+ renderHelp([
88
+ "Run `xcodebuild-axi tests` without --filter to see every suite",
89
+ ]),
90
+ ]);
91
+ }
92
+ const blocks = [
93
+ renderFields({
94
+ scheme: context.scheme,
95
+ tests: identifiers.length,
96
+ ...(disabled.length > 0 ? { disabled: disabled.length } : {}),
97
+ duration: duration(run.seconds),
98
+ }),
99
+ ];
100
+ if (hasFlag(args, "--list")) {
101
+ const shown = identifiers
102
+ .slice(0, max)
103
+ .map((identifier) => ({ test: identifier }));
104
+ blocks.push(renderList(identifiers.length > shown.length
105
+ ? `test_list (${shown.length} of ${identifiers.length})`
106
+ : "test_list", shown));
107
+ if (identifiers.length > shown.length) {
108
+ blocks.push(renderHelp([
109
+ `Run \`xcodebuild-axi tests --list --max ${identifiers.length}\` for all of them`,
110
+ ]));
111
+ }
112
+ }
113
+ else {
114
+ const suites = groupBySuite(identifiers);
115
+ const shown = suites.slice(0, max);
116
+ blocks.push(renderList(suites.length > shown.length
117
+ ? `suites (${shown.length} of ${suites.length})`
118
+ : "suites", shown));
119
+ blocks.push(renderHelp([
120
+ "Run `xcodebuild-axi tests --list` to see individual test identifiers",
121
+ `Run \`xcodebuild-axi test --scheme ${context.scheme} --only <suite>\` to run one suite`,
122
+ ]));
123
+ }
124
+ return renderOutput(blocks);
125
+ }
126
+ /**
127
+ * Collapse `Target/Suite/testName()` identifiers into one row per suite.
128
+ *
129
+ * A scheme with a thousand tests produces a thousand unreadable rows; the
130
+ * shape an agent needs to pick what to run is the suite and how big it is
131
+ * (AXI principle 2).
132
+ */
133
+ export function groupBySuite(identifiers) {
134
+ const counts = new Map();
135
+ for (const identifier of identifiers) {
136
+ const parts = identifier.split("/");
137
+ // Drop the test method, keeping target and suite. A two-part identifier
138
+ // is already suite-level, so it stands for itself.
139
+ const suite = parts.length > 2 ? parts.slice(0, -1).join("/") : identifier;
140
+ counts.set(suite, (counts.get(suite) ?? 0) + 1);
141
+ }
142
+ return [...counts.entries()]
143
+ .map(([suite, tests]) => ({ suite, tests }))
144
+ .sort((a, b) => b.tests - a.tests || a.suite.localeCompare(b.suite));
145
+ }
146
+ function readEnumeration(path) {
147
+ try {
148
+ return JSON.parse(readFileSync(path, "utf-8"));
149
+ }
150
+ catch {
151
+ return undefined;
152
+ }
153
+ }
154
+ //# sourceMappingURL=tests.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tests.js","sourceRoot":"","sources":["../../../src/commands/tests.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const XCFRAMEWORK_HELP = "usage: xcodebuild-axi xcframework --output <path.xcframework> [flags]\nBundles prebuilt frameworks or libraries into one .xcframework.\nflags[4]:\n --output <path> the .xcframework to write (required)\n --framework <path> a built .framework to include; repeatable\n --library <path> a built static or dynamic library to include; repeatable\n --headers <path> headers for the library that precedes it; repeatable\nnote:\n --headers applies to the --library it follows, which is how xcodebuild pairs\n them. Give them in matching order.\nexamples:\n xcodebuild-axi xcframework --output Out.xcframework --framework A.framework --framework B.framework\n xcodebuild-axi xcframework --output Out.xcframework --library libA.a --headers include\n";
2
+ export declare function xcframeworkCommand(args: string[]): Promise<string>;