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,373 @@
1
+ import { existsSync, mkdirSync, writeFileSync } from "node:fs";
2
+ import { dirname, resolve } from "node:path";
3
+ import { AxiError, mapXcodebuildError } from "./errors.js";
4
+ import { requireProject } from "./context.js";
5
+ import { requireScheme } from "./scheme.js";
6
+ import { destinationSlug, resolveDestination } from "./destination.js";
7
+ import { runBuild } from "./xcodebuild.js";
8
+ import { readBuildResults, toDiagnostics } from "./xcresult.js";
9
+ import { diagnosticsBlock, transcriptTail } from "./report.js";
10
+ import { duration, renderFields, renderHelp, renderOutput, tildePath, } from "./toon.js";
11
+ import { getFlag, getIntFlag, getListFlag, hasFlag } from "./args.js";
12
+ import { packageArgs, PACKAGE_FLAG_HELP, PACKAGE_FLAGS, PACKAGE_VALUE_FLAGS, } from "./packages.js";
13
+ /**
14
+ * The machinery shared by every command that runs an xcodebuild *action* —
15
+ * build, analyze, archive, clean, and the test family. They differ in which
16
+ * action word they pass and what they say afterwards; everything before that
17
+ * (finding the project, resolving the scheme and destination, assembling
18
+ * flags, streaming to a log, reading the bundle back) is identical, and was
19
+ * worth extracting the first time a second command needed it.
20
+ */
21
+ /** Flags every build-family command accepts. Keep in sync with `BUILD_FLAG_HELP`. */
22
+ export const SHARED_BUILD_FLAGS = [
23
+ "--scheme",
24
+ "--target",
25
+ "--all-targets",
26
+ "--device",
27
+ "--destination",
28
+ "--configuration",
29
+ "--sdk",
30
+ "--arch",
31
+ "--toolchain",
32
+ "--xcconfig",
33
+ "--derived-data",
34
+ "--jobs",
35
+ "--setting",
36
+ "--sign",
37
+ "--allow-provisioning",
38
+ "--sanitizer",
39
+ "--timing",
40
+ "--destination-timeout",
41
+ "--parallelize-targets",
42
+ "--hide-script-env",
43
+ "--skip-unavailable-actions",
44
+ "--max-errors",
45
+ "--full",
46
+ "--codesize",
47
+ "--log-level",
48
+ "--bundle-version",
49
+ "--stream",
50
+ ...PACKAGE_FLAGS,
51
+ ];
52
+ export const SHARED_BUILD_VALUE_FLAGS = [
53
+ "--scheme",
54
+ "--target",
55
+ "--device",
56
+ "--destination",
57
+ "--configuration",
58
+ "--sdk",
59
+ "--arch",
60
+ "--toolchain",
61
+ "--xcconfig",
62
+ "--derived-data",
63
+ "--jobs",
64
+ "--setting",
65
+ "--sanitizer",
66
+ "--destination-timeout",
67
+ "--max-errors",
68
+ "--codesize",
69
+ "--log-level",
70
+ "--bundle-version",
71
+ "--stream",
72
+ ...PACKAGE_VALUE_FLAGS,
73
+ ];
74
+ /** The shared flag block, so each command's `--help` stays consistent. */
75
+ export const BUILD_FLAG_HELP = ` --scheme <name> scheme to act on (required only when the project has more than one)
76
+ --target <name> build a target instead of a scheme; repeatable (project only)
77
+ --all-targets build every target in the project (project only)
78
+ --device <name> simulator or device name, e.g. "iPhone 17 Pro" (default: newest simulator)
79
+ --destination <spec> raw xcodebuild destination specifier, passed through untouched
80
+ --configuration <name> build configuration (default: the scheme's own)
81
+ --sdk <name> base SDK, e.g. iphonesimulator
82
+ --arch <arch> architecture to build; repeatable or comma-separated
83
+ --toolchain <name> toolchain identifier or name
84
+ --xcconfig <path> apply build settings from this file as overrides
85
+ --derived-data <path> derived data directory
86
+ --jobs <n> maximum concurrent build operations
87
+ --setting KEY=VALUE build setting override; repeatable or comma-separated
88
+ --sign allow code signing (off by default, so simulator builds need no team)
89
+ --allow-provisioning let xcodebuild talk to the developer portal for profiles
90
+ --sanitizer <name> address, thread, or undefined; repeatable or comma-separated
91
+ --timing report per-command build timings
92
+ --destination-timeout <secs> how long to wait for the destination device
93
+ --parallelize-targets build independent targets in parallel
94
+ --hide-script-env omit shell script environment variables from the log
95
+ --skip-unavailable-actions skip scheme actions that cannot run instead of failing
96
+ --max-errors <n> errors to list before summarizing the rest (default: 20)
97
+ --full list every warning instead of the first 10
98
+ --codesize <dir> write a code size profile to this directory
99
+ --log-level <level> quiet, normal, or verbose — how much lands in the log file
100
+ --bundle-version <n> result bundle format version (default: xcodebuild's own)
101
+ --stream <path> also write xcodebuild's live result stream here
102
+ ${PACKAGE_FLAG_HELP}`;
103
+ /**
104
+ * The flags that map straight onto an xcodebuild switch with no interpretation
105
+ * beyond validation. Grouped so they can be tested without a project.
106
+ */
107
+ export function buildPassthroughArgs(args, command) {
108
+ return [
109
+ ...codesizeArgs(args),
110
+ ...logLevelArgs(args, command),
111
+ ...streamArgs(args),
112
+ ...bundleVersionArgs(args),
113
+ ];
114
+ }
115
+ function bundleVersionArgs(args) {
116
+ const version = getIntFlag(args, "--bundle-version");
117
+ return version === undefined ? [] : ["-resultBundleVersion", String(version)];
118
+ }
119
+ const LOG_LEVELS = {
120
+ quiet: ["-quiet"],
121
+ normal: [],
122
+ verbose: ["-verbose"],
123
+ };
124
+ /**
125
+ * The log file is a real artifact with a real size, even though the report
126
+ * never comes from it. `--log-level quiet` shrinks it; `verbose` is for the
127
+ * failures the result bundle cannot explain on its own.
128
+ */
129
+ function logLevelArgs(args, command) {
130
+ const level = getFlag(args, "--log-level");
131
+ if (level === undefined)
132
+ return [];
133
+ const mapped = LOG_LEVELS[level];
134
+ if (mapped === undefined) {
135
+ throw new AxiError(`Unknown log level '${level}'`, "VALIDATION_ERROR", [
136
+ "valid levels are quiet, normal, verbose",
137
+ `xcodebuild-axi ${command} --log-level verbose`,
138
+ ]);
139
+ }
140
+ return mapped;
141
+ }
142
+ /**
143
+ * `-resultStreamPath` refuses a path that does not already exist, which is an
144
+ * odd contract to pass on to a caller — so create the file first.
145
+ */
146
+ function streamArgs(args) {
147
+ const path = getFlag(args, "--stream");
148
+ if (path === undefined)
149
+ return [];
150
+ const full = resolve(path);
151
+ mkdirSync(dirname(full), { recursive: true });
152
+ if (!existsSync(full))
153
+ writeFileSync(full, "");
154
+ return ["-resultStreamPath", full];
155
+ }
156
+ /** `-enableCodesizeProfile` is inert without an output directory, so one flag
157
+ * sets both rather than letting a build run and produce nothing. */
158
+ function codesizeArgs(args) {
159
+ const dir = getFlag(args, "--codesize");
160
+ return dir
161
+ ? ["-enableCodesizeProfile", "YES", "-codesizeProfileOutputDir", dir]
162
+ : [];
163
+ }
164
+ const SANITIZER_FLAGS = {
165
+ address: "-enableAddressSanitizer",
166
+ thread: "-enableThreadSanitizer",
167
+ undefined: "-enableUndefinedBehaviorSanitizer",
168
+ };
169
+ export async function resolveBuildContext(options) {
170
+ const { args, command } = options;
171
+ const project = requireProject();
172
+ const targets = getListFlag(args, "--target");
173
+ const allTargets = hasFlag(args, "--all-targets");
174
+ const targetMode = targets.length > 0 || allTargets;
175
+ if (targetMode && project.kind === "workspace") {
176
+ // xcodebuild's own refusal here is "-target is not supported with
177
+ // -workspace", issued only after it has resolved the package graph.
178
+ throw new AxiError("--target and --all-targets work against a project, not a workspace", "VALIDATION_ERROR", [
179
+ "Pass `--scheme <name>` instead, or cd to the directory holding the .xcodeproj",
180
+ ]);
181
+ }
182
+ if (targetMode && getFlag(args, "--scheme") !== undefined) {
183
+ throw new AxiError("--scheme and --target select different things to build, so only one can be used", "VALIDATION_ERROR", ["Drop one — a scheme already names the targets it builds"]);
184
+ }
185
+ const scheme = targetMode
186
+ ? allTargets
187
+ ? "all targets"
188
+ : targets.join(",")
189
+ : await requireScheme(project, getFlag(args, "--scheme"), command);
190
+ const rawDestination = getFlag(args, "--destination");
191
+ const device = getFlag(args, "--device");
192
+ const needsDestination = options.needsDestination !== false;
193
+ const destination = !targetMode &&
194
+ (needsDestination || rawDestination !== undefined || device !== undefined)
195
+ ? await resolveDestination({
196
+ project,
197
+ scheme,
198
+ ...(device !== undefined ? { device } : {}),
199
+ ...(rawDestination !== undefined ? { raw: rawDestination } : {}),
200
+ })
201
+ : undefined;
202
+ const sanitizers = getListFlag(args, "--sanitizer");
203
+ for (const sanitizer of sanitizers) {
204
+ if (!(sanitizer in SANITIZER_FLAGS)) {
205
+ throw new AxiError(`Unknown sanitizer '${sanitizer}'`, "VALIDATION_ERROR", ["valid sanitizers are address, thread, undefined"]);
206
+ }
207
+ }
208
+ const settings = getListFlag(args, "--setting");
209
+ for (const setting of settings) {
210
+ if (!setting.includes("=")) {
211
+ throw new AxiError(`--setting expects KEY=VALUE, got '${setting}'`, "VALIDATION_ERROR", [
212
+ "xcodebuild-axi " +
213
+ command +
214
+ " --setting SWIFT_STRICT_CONCURRENCY=complete",
215
+ ]);
216
+ }
217
+ }
218
+ const configuration = getFlag(args, "--configuration");
219
+ const sdk = getFlag(args, "--sdk");
220
+ const toolchain = getFlag(args, "--toolchain");
221
+ const xcconfig = getFlag(args, "--xcconfig");
222
+ const derivedData = getFlag(args, "--derived-data");
223
+ const jobs = getIntFlag(args, "--jobs");
224
+ const destinationTimeout = getIntFlag(args, "--destination-timeout");
225
+ const xcodebuildArgs = [
226
+ ...project.flags,
227
+ ...(targetMode
228
+ ? allTargets
229
+ ? ["-alltargets"]
230
+ : targets.flatMap((target) => ["-target", target])
231
+ : ["-scheme", scheme]),
232
+ ...(destination ? ["-destination", destination.specifier] : []),
233
+ ...(destinationTimeout !== undefined
234
+ ? ["-destination-timeout", String(destinationTimeout)]
235
+ : []),
236
+ ...(configuration ? ["-configuration", configuration] : []),
237
+ ...(sdk ? ["-sdk", sdk] : []),
238
+ ...getListFlag(args, "--arch").flatMap((arch) => ["-arch", arch]),
239
+ ...(toolchain ? ["-toolchain", toolchain] : []),
240
+ ...(xcconfig ? ["-xcconfig", xcconfig] : []),
241
+ ...(derivedData ? ["-derivedDataPath", derivedData] : []),
242
+ ...(jobs !== undefined ? ["-jobs", String(jobs)] : []),
243
+ ...sanitizers.flatMap((sanitizer) => [
244
+ SANITIZER_FLAGS[sanitizer],
245
+ "YES",
246
+ ]),
247
+ ...(hasFlag(args, "--timing") ? ["-showBuildTimingSummary"] : []),
248
+ ...(hasFlag(args, "--parallelize-targets") ? ["-parallelizeTargets"] : []),
249
+ ...(hasFlag(args, "--hide-script-env")
250
+ ? ["-hideShellScriptEnvironment"]
251
+ : []),
252
+ ...(hasFlag(args, "--skip-unavailable-actions")
253
+ ? ["-skipUnavailableActions"]
254
+ : []),
255
+ // Macro validation is an interactive trust prompt in disguise: unattended
256
+ // it fails the build outright on any package using macros.
257
+ "-skipMacroValidation",
258
+ ...(hasFlag(args, "--allow-provisioning")
259
+ ? ["-allowProvisioningUpdates"]
260
+ : []),
261
+ ...buildPassthroughArgs(args, command),
262
+ ...packageArgs(args),
263
+ ...(hasFlag(args, "--sign") ? [] : ["CODE_SIGNING_ALLOWED=NO"]),
264
+ ...settings,
265
+ ];
266
+ return {
267
+ project,
268
+ scheme,
269
+ destination: destination?.described,
270
+ xcodebuildArgs,
271
+ maxErrors: getIntFlag(args, "--max-errors") ?? 20,
272
+ full: hasFlag(args, "--full"),
273
+ };
274
+ }
275
+ /** A filesystem stem that distinguishes runs of different commands and devices. */
276
+ export function runLabel(context, command) {
277
+ const device = context.destination
278
+ ? `-${destinationSlug(context.destination)}`
279
+ : "";
280
+ return `${context.scheme}${device}-${command}`;
281
+ }
282
+ export function runAction(options) {
283
+ return runBuild({
284
+ args: [
285
+ ...options.context.xcodebuildArgs,
286
+ ...(options.extraArgs ?? []),
287
+ ...options.actions,
288
+ ],
289
+ label: runLabel(options.context, options.command),
290
+ project: options.context.project,
291
+ });
292
+ }
293
+ /**
294
+ * The shared report for any action that compiles something.
295
+ *
296
+ * Errors are the payload on failure, warnings on success, and the full
297
+ * transcript is always a path away.
298
+ */
299
+ export async function reportAction(options) {
300
+ const { run, context } = options;
301
+ const results = await readBuildResults(run.resultPath).catch(() => undefined);
302
+ const errors = toDiagnostics(results?.errors);
303
+ const analyzerWarnings = toDiagnostics(results?.analyzerWarnings);
304
+ const warnings = toDiagnostics([
305
+ ...(results?.warnings ?? []),
306
+ ...(options.analyzer ? [] : (results?.analyzerWarnings ?? [])),
307
+ ]);
308
+ const succeeded = run.exitCode === 0;
309
+ // A bundle that records no error for a nonzero exit means xcodebuild died
310
+ // before it built anything — a bad scheme, an unmatched destination, a
311
+ // missing signing team. The transcript is the only witness.
312
+ if (!succeeded && errors.length === 0) {
313
+ const mapped = mapXcodebuildError(run.tail);
314
+ if (mapped) {
315
+ throw new AxiError(mapped.message, mapped.code, [
316
+ ...mapped.suggestions,
317
+ `full transcript: ${tildePath(run.logPath)}`,
318
+ ]);
319
+ }
320
+ }
321
+ const blocks = [
322
+ renderFields({
323
+ [options.key]: succeeded ? options.ok : "failed",
324
+ scheme: context.scheme,
325
+ ...(context.destination ? { destination: context.destination } : {}),
326
+ duration: duration(run.seconds),
327
+ ...(options.extra ?? {}),
328
+ }),
329
+ ];
330
+ const errorBlock = diagnosticsBlock("errors", errors, context.maxErrors);
331
+ if (errorBlock.block)
332
+ blocks.push(errorBlock.block);
333
+ if (options.analyzer) {
334
+ if (analyzerWarnings.length > 0) {
335
+ blocks.push(diagnosticsBlock("issues", analyzerWarnings, context.full ? analyzerWarnings.length : 20).block);
336
+ }
337
+ else if (succeeded) {
338
+ blocks.push(renderFields({ issues: "0 analyzer issues found" }));
339
+ }
340
+ }
341
+ if (warnings.length > 0) {
342
+ blocks.push(diagnosticsBlock("warnings", warnings, context.full ? warnings.length : 10).block);
343
+ }
344
+ else if (succeeded && !options.analyzer) {
345
+ blocks.push(renderFields({ warnings: 0 }));
346
+ }
347
+ if (!succeeded && errors.length === 0) {
348
+ const tail = transcriptTail(run.tail);
349
+ if (tail)
350
+ blocks.push(tail);
351
+ }
352
+ blocks.push(renderFields({
353
+ log: tildePath(run.logPath),
354
+ result: tildePath(run.resultPath),
355
+ }));
356
+ const hints = [];
357
+ if (errorBlock.hidden > 0) {
358
+ hints.push(`Run \`xcodebuild-axi ${options.command} --max-errors ${errors.length}\` to list all ${errors.length} errors`);
359
+ }
360
+ if (!context.full && warnings.length > 10) {
361
+ hints.push(`Run \`xcodebuild-axi ${options.command} --full\` to list all ${warnings.length} warnings`);
362
+ }
363
+ if (!succeeded) {
364
+ hints.push(`Run \`xcodebuild-axi result ${tildePath(run.resultPath)}\` to re-read this run without rebuilding`);
365
+ }
366
+ blocks.push(renderHelp(hints));
367
+ // The agent asked for a build and did not get one. Exit non-zero so `&&`
368
+ // chains and CI stop, while the report itself still reaches stdout.
369
+ if (!succeeded)
370
+ process.exitCode = 1;
371
+ return renderOutput(blocks);
372
+ }
373
+ //# sourceMappingURL=action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action.js","sourceRoot":"","sources":["../../src/action.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Read the summary Xcode writes into an .xcarchive's Info.plist.
3
+ *
4
+ * The interesting part is `ApplicationProperties` — the bundle identifier,
5
+ * marketing version, and build number of the thing that was archived. An
6
+ * agent that just produced an archive almost always wants those next, and
7
+ * getting them otherwise means a second command against a plist inside a
8
+ * bundle (AXI principle 4).
9
+ */
10
+ export interface ArchiveInfo {
11
+ bundleIdentifier?: string;
12
+ marketingVersion?: string;
13
+ buildNumber?: string;
14
+ applicationPath?: string;
15
+ name?: string;
16
+ createdAt?: string;
17
+ }
18
+ export declare function readArchiveInfo(archivePath: string): Promise<ArchiveInfo | undefined>;
19
+ /** The `method` values Xcode 27 accepts in an export options plist. */
20
+ export declare const EXPORT_METHODS: readonly ["app-store-connect", "release-testing", "enterprise", "debugging", "developer-id", "mac-application", "validation"];
21
+ /**
22
+ * Build a minimal export options plist.
23
+ *
24
+ * `-exportArchive` requires one, and authoring XML by hand is exactly the kind
25
+ * of unguessable side quest an agent fails at. Given a method (and optionally
26
+ * a team), the plist is derivable, so derive it.
27
+ */
28
+ export declare function exportOptionsPlist(options: {
29
+ method: string;
30
+ teamID?: string;
31
+ signingStyle?: string;
32
+ uploadSymbols?: boolean;
33
+ }): string;
@@ -0,0 +1,77 @@
1
+ import { execFile } from "node:child_process";
2
+ import { join } from "node:path";
3
+ export function readArchiveInfo(archivePath) {
4
+ return new Promise((resolvePromise) => {
5
+ execFile("plutil", ["-convert", "json", "-o", "-", join(archivePath, "Info.plist")], { encoding: "utf-8" }, (error, stdout) => {
6
+ if (error) {
7
+ resolvePromise(undefined);
8
+ return;
9
+ }
10
+ try {
11
+ const parsed = JSON.parse(stdout);
12
+ const app = parsed.ApplicationProperties ?? {};
13
+ resolvePromise({
14
+ ...(parsed.Name !== undefined ? { name: parsed.Name } : {}),
15
+ ...(parsed.CreationDate !== undefined
16
+ ? { createdAt: parsed.CreationDate }
17
+ : {}),
18
+ ...(app.CFBundleIdentifier !== undefined
19
+ ? { bundleIdentifier: app.CFBundleIdentifier }
20
+ : {}),
21
+ ...(app.CFBundleShortVersionString !== undefined
22
+ ? { marketingVersion: app.CFBundleShortVersionString }
23
+ : {}),
24
+ ...(app.CFBundleVersion !== undefined
25
+ ? { buildNumber: app.CFBundleVersion }
26
+ : {}),
27
+ ...(app.ApplicationPath !== undefined
28
+ ? { applicationPath: app.ApplicationPath }
29
+ : {}),
30
+ });
31
+ }
32
+ catch {
33
+ resolvePromise(undefined);
34
+ }
35
+ });
36
+ });
37
+ }
38
+ /** The `method` values Xcode 27 accepts in an export options plist. */
39
+ export const EXPORT_METHODS = [
40
+ "app-store-connect",
41
+ "release-testing",
42
+ "enterprise",
43
+ "debugging",
44
+ "developer-id",
45
+ "mac-application",
46
+ "validation",
47
+ ];
48
+ /**
49
+ * Build a minimal export options plist.
50
+ *
51
+ * `-exportArchive` requires one, and authoring XML by hand is exactly the kind
52
+ * of unguessable side quest an agent fails at. Given a method (and optionally
53
+ * a team), the plist is derivable, so derive it.
54
+ */
55
+ export function exportOptionsPlist(options) {
56
+ const entries = [
57
+ ` <key>method</key>\n <string>${options.method}</string>`,
58
+ ];
59
+ if (options.teamID) {
60
+ entries.push(` <key>teamID</key>\n <string>${options.teamID}</string>`);
61
+ }
62
+ if (options.signingStyle) {
63
+ entries.push(` <key>signingStyle</key>\n <string>${options.signingStyle}</string>`);
64
+ }
65
+ if (options.uploadSymbols !== undefined) {
66
+ entries.push(` <key>uploadSymbols</key>\n <${options.uploadSymbols}/>`);
67
+ }
68
+ return `<?xml version="1.0" encoding="UTF-8"?>
69
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
70
+ <plist version="1.0">
71
+ <dict>
72
+ ${entries.join("\n")}
73
+ </dict>
74
+ </plist>
75
+ `;
76
+ }
77
+ //# sourceMappingURL=archive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/archive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Flag parsing with AXI principle 6's "fail loud on unrecognized input".
3
+ *
4
+ * Every command declares the flags it knows; anything else is rejected by name
5
+ * with the valid set listed inline, so the agent self-corrects in one turn
6
+ * rather than spending a round trip on `--help`.
7
+ */
8
+ /** Read `--flag value` or `--flag=value` without consuming it. */
9
+ export declare function getFlag(args: string[], name: string): string | undefined;
10
+ export declare function hasFlag(args: string[], name: string): boolean;
11
+ /** Read a `--flag a,b,c` list, also accepting the flag repeated. */
12
+ export declare function getListFlag(args: string[], name: string): string[];
13
+ /** Read an integer flag, rejecting values that are not numbers. */
14
+ export declare function getIntFlag(args: string[], name: string): number | undefined;
15
+ /** Positional arguments — everything that is not a flag or a flag's value. */
16
+ export declare function positionals(args: string[], valueFlags: readonly string[]): string[];
17
+ /**
18
+ * Reject unknown flags by name and list the valid ones inline.
19
+ *
20
+ * `--help` always passes (AXI principle 6). `valueFlags` are the flags that
21
+ * take a value, so their values are not mistaken for flags themselves.
22
+ */
23
+ export declare function rejectUnknownFlags(args: string[], command: string, known: readonly string[], valueFlags?: readonly string[]): void;
@@ -0,0 +1,123 @@
1
+ import { AxiError } from "./errors.js";
2
+ /**
3
+ * Flag parsing with AXI principle 6's "fail loud on unrecognized input".
4
+ *
5
+ * Every command declares the flags it knows; anything else is rejected by name
6
+ * with the valid set listed inline, so the agent self-corrects in one turn
7
+ * rather than spending a round trip on `--help`.
8
+ */
9
+ /** Read `--flag value` or `--flag=value` without consuming it. */
10
+ export function getFlag(args, name) {
11
+ const prefix = `${name}=`;
12
+ for (let i = 0; i < args.length; i++) {
13
+ const arg = args[i];
14
+ if (arg === undefined)
15
+ continue;
16
+ if (arg === name)
17
+ return args[i + 1];
18
+ if (arg.startsWith(prefix))
19
+ return arg.slice(prefix.length);
20
+ }
21
+ return undefined;
22
+ }
23
+ export function hasFlag(args, name) {
24
+ return args.includes(name);
25
+ }
26
+ /** Read a `--flag a,b,c` list, also accepting the flag repeated. */
27
+ export function getListFlag(args, name) {
28
+ const prefix = `${name}=`;
29
+ const out = [];
30
+ for (let i = 0; i < args.length; i++) {
31
+ const arg = args[i];
32
+ if (arg === undefined)
33
+ continue;
34
+ if (arg === name) {
35
+ const value = args[i + 1];
36
+ if (value !== undefined)
37
+ out.push(value);
38
+ i++;
39
+ }
40
+ else if (arg.startsWith(prefix)) {
41
+ out.push(arg.slice(prefix.length));
42
+ }
43
+ }
44
+ return out.flatMap((v) => v.split(",")).filter((v) => v.length > 0);
45
+ }
46
+ /** Read an integer flag, rejecting values that are not numbers. */
47
+ export function getIntFlag(args, name) {
48
+ const raw = getFlag(args, name);
49
+ if (raw === undefined)
50
+ return undefined;
51
+ const parsed = Number(raw);
52
+ if (!Number.isInteger(parsed) || parsed < 0) {
53
+ throw new AxiError(`${name} expects a non-negative integer, got "${raw}"`, "VALIDATION_ERROR");
54
+ }
55
+ return parsed;
56
+ }
57
+ /** Positional arguments — everything that is not a flag or a flag's value. */
58
+ export function positionals(args, valueFlags) {
59
+ const out = [];
60
+ for (let i = 0; i < args.length; i++) {
61
+ const arg = args[i];
62
+ if (arg === undefined)
63
+ continue;
64
+ if (arg === "--") {
65
+ out.push(...args.slice(i + 1));
66
+ break;
67
+ }
68
+ if (arg.startsWith("-")) {
69
+ const bare = arg.split("=")[0] ?? arg;
70
+ if (valueFlags.includes(bare) && !arg.includes("="))
71
+ i++;
72
+ continue;
73
+ }
74
+ out.push(arg);
75
+ }
76
+ return out;
77
+ }
78
+ /**
79
+ * Reject unknown flags by name and list the valid ones inline.
80
+ *
81
+ * `--help` always passes (AXI principle 6). `valueFlags` are the flags that
82
+ * take a value, so their values are not mistaken for flags themselves.
83
+ */
84
+ export function rejectUnknownFlags(args, command, known, valueFlags = []) {
85
+ for (let i = 0; i < args.length; i++) {
86
+ const arg = args[i];
87
+ if (arg === undefined)
88
+ continue;
89
+ if (arg === "--")
90
+ break;
91
+ if (!arg.startsWith("-") || arg === "-")
92
+ continue;
93
+ const bare = arg.split("=")[0] ?? arg;
94
+ if (bare === "--help")
95
+ continue;
96
+ if (!known.includes(bare)) {
97
+ const renamed = RENAMED_FLAGS[bare];
98
+ throw new AxiError(`unknown flag ${bare} for \`${command}\``, "VALIDATION_ERROR", renamed
99
+ ? [renamed]
100
+ : [
101
+ `valid flags for \`${command}\`: ${known.join(", ")} (--help always allowed)`,
102
+ ]);
103
+ }
104
+ if (valueFlags.includes(bare) && !arg.includes("=")) {
105
+ const value = args[i + 1];
106
+ if (value === undefined) {
107
+ throw new AxiError(`${bare} requires a value`, "VALIDATION_ERROR", [
108
+ `valid flags for \`${command}\`: ${known.join(", ")}`,
109
+ ]);
110
+ }
111
+ i++;
112
+ }
113
+ }
114
+ }
115
+ /**
116
+ * Flags this CLI used to accept, pointed at their replacement so a stale call
117
+ * site self-corrects in one step instead of reading the whole valid-flag list.
118
+ */
119
+ const RENAMED_FLAGS = {
120
+ "--simulator": "--simulator was renamed; use --device instead",
121
+ "--verbose": "--verbose was removed; the full transcript is always written to the log path in the output",
122
+ };
123
+ //# sourceMappingURL=args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/args.ts"],"names":[],"mappings":"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"}