claude-in-mobile 3.12.0 → 3.13.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 (64) hide show
  1. package/dist/constants/timeouts.d.ts +10 -0
  2. package/dist/constants/timeouts.d.ts.map +1 -1
  3. package/dist/constants/timeouts.js +10 -0
  4. package/dist/constants/timeouts.js.map +1 -1
  5. package/dist/errors/asc.d.ts +31 -0
  6. package/dist/errors/asc.d.ts.map +1 -0
  7. package/dist/errors/asc.js +59 -0
  8. package/dist/errors/asc.js.map +1 -0
  9. package/dist/errors/base.d.ts.map +1 -1
  10. package/dist/errors/base.js +10 -0
  11. package/dist/errors/base.js.map +1 -1
  12. package/dist/errors/index.d.ts +1 -0
  13. package/dist/errors/index.d.ts.map +1 -1
  14. package/dist/errors/index.js +1 -0
  15. package/dist/errors/index.js.map +1 -1
  16. package/dist/index.js +0 -0
  17. package/dist/ios/build/classify-build-error.d.ts +31 -0
  18. package/dist/ios/build/classify-build-error.d.ts.map +1 -0
  19. package/dist/ios/build/classify-build-error.js +115 -0
  20. package/dist/ios/build/classify-build-error.js.map +1 -0
  21. package/dist/ios/build/exec.d.ts +24 -0
  22. package/dist/ios/build/exec.d.ts.map +1 -0
  23. package/dist/ios/build/exec.js +33 -0
  24. package/dist/ios/build/exec.js.map +1 -0
  25. package/dist/ios/build/export-options.d.ts +23 -0
  26. package/dist/ios/build/export-options.d.ts.map +1 -0
  27. package/dist/ios/build/export-options.js +48 -0
  28. package/dist/ios/build/export-options.js.map +1 -0
  29. package/dist/ios/build/index.d.ts +14 -0
  30. package/dist/ios/build/index.d.ts.map +1 -0
  31. package/dist/ios/build/index.js +14 -0
  32. package/dist/ios/build/index.js.map +1 -0
  33. package/dist/ios/build/project-detector.d.ts +30 -0
  34. package/dist/ios/build/project-detector.d.ts.map +1 -0
  35. package/dist/ios/build/project-detector.js +148 -0
  36. package/dist/ios/build/project-detector.js.map +1 -0
  37. package/dist/ios/build/upload.d.ts +30 -0
  38. package/dist/ios/build/upload.d.ts.map +1 -0
  39. package/dist/ios/build/upload.js +113 -0
  40. package/dist/ios/build/upload.js.map +1 -0
  41. package/dist/ios/build/xcode-build.d.ts +35 -0
  42. package/dist/ios/build/xcode-build.d.ts.map +1 -0
  43. package/dist/ios/build/xcode-build.js +109 -0
  44. package/dist/ios/build/xcode-build.js.map +1 -0
  45. package/dist/store/app-store-connect.d.ts +64 -0
  46. package/dist/store/app-store-connect.d.ts.map +1 -0
  47. package/dist/store/app-store-connect.js +196 -0
  48. package/dist/store/app-store-connect.js.map +1 -0
  49. package/dist/store/asc-jwt.d.ts +36 -0
  50. package/dist/store/asc-jwt.d.ts.map +1 -0
  51. package/dist/store/asc-jwt.js +50 -0
  52. package/dist/store/asc-jwt.js.map +1 -0
  53. package/dist/tools/appstore-tools.d.ts +13 -0
  54. package/dist/tools/appstore-tools.d.ts.map +1 -0
  55. package/dist/tools/appstore-tools.js +268 -0
  56. package/dist/tools/appstore-tools.js.map +1 -0
  57. package/dist/tools/meta/store-meta.d.ts.map +1 -1
  58. package/dist/tools/meta/store-meta.js +40 -9
  59. package/dist/tools/meta/store-meta.js.map +1 -1
  60. package/dist/utils/sanitize.d.ts +4 -0
  61. package/dist/utils/sanitize.d.ts.map +1 -1
  62. package/dist/utils/sanitize.js +31 -1
  63. package/dist/utils/sanitize.js.map +1 -1
  64. package/package.json +1 -1
@@ -46,4 +46,14 @@ export declare const CLIPBOARD: {
46
46
  readonly POLL_MS: 100;
47
47
  readonly SETTLE_MS: 200;
48
48
  };
49
+ export declare const XCODE: {
50
+ /** `xcodebuild archive` of a real app can take 10+ min on cold DerivedData. */
51
+ readonly ARCHIVE_TIMEOUT_MS: number;
52
+ /** `-exportArchive` re-signs the bundle; usually < 2 min, 10 gives headroom. */
53
+ readonly EXPORT_TIMEOUT_MS: number;
54
+ /** altool upload to App Store Connect — network-bound for large IPAs. */
55
+ readonly UPLOAD_TIMEOUT_MS: number;
56
+ /** `xcodebuild -list -json` resolves SPM deps on first run — not instant. */
57
+ readonly LIST_TIMEOUT_MS: 60000;
58
+ };
49
59
  //# sourceMappingURL=timeouts.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"timeouts.d.ts","sourceRoot":"","sources":["../../src/constants/timeouts.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,GAAG;;;CAGN,CAAC;AAEX,eAAO,MAAM,OAAO;;;;CAIV,CAAC;AAEX,eAAO,MAAM,GAAG;;;;CAIN,CAAC;AAEX,eAAO,MAAM,MAAM;;;CAGT,CAAC;AAEX,eAAO,MAAM,IAAI;;;;;;CAMP,CAAC;AAEX,eAAO,MAAM,QAAQ;;CAEX,CAAC;AAEX,eAAO,MAAM,IAAI;;CAEP,CAAC;AAEX,eAAO,MAAM,WAAW;;;CAGd,CAAC;AAEX,eAAO,MAAM,MAAM;IACjB,2DAA2D;;;CAGnD,CAAC;AAEX,eAAO,MAAM,SAAS;;;CAGZ,CAAC"}
1
+ {"version":3,"file":"timeouts.d.ts","sourceRoot":"","sources":["../../src/constants/timeouts.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,GAAG;;;CAGN,CAAC;AAEX,eAAO,MAAM,OAAO;;;;CAIV,CAAC;AAEX,eAAO,MAAM,GAAG;;;;CAIN,CAAC;AAEX,eAAO,MAAM,MAAM;;;CAGT,CAAC;AAEX,eAAO,MAAM,IAAI;;;;;;CAMP,CAAC;AAEX,eAAO,MAAM,QAAQ;;CAEX,CAAC;AAEX,eAAO,MAAM,IAAI;;CAEP,CAAC;AAEX,eAAO,MAAM,WAAW;;;CAGd,CAAC;AAEX,eAAO,MAAM,MAAM;IACjB,2DAA2D;;;CAGnD,CAAC;AAEX,eAAO,MAAM,SAAS;;;CAGZ,CAAC;AAEX,eAAO,MAAM,KAAK;IAChB,+EAA+E;;IAE/E,gFAAgF;;IAEhF,yEAAyE;;IAEzE,6EAA6E;;CAErE,CAAC"}
@@ -46,4 +46,14 @@ export const CLIPBOARD = {
46
46
  POLL_MS: 100,
47
47
  SETTLE_MS: 200,
48
48
  };
49
+ export const XCODE = {
50
+ /** `xcodebuild archive` of a real app can take 10+ min on cold DerivedData. */
51
+ ARCHIVE_TIMEOUT_MS: 15 * 60_000,
52
+ /** `-exportArchive` re-signs the bundle; usually < 2 min, 10 gives headroom. */
53
+ EXPORT_TIMEOUT_MS: 10 * 60_000,
54
+ /** altool upload to App Store Connect — network-bound for large IPAs. */
55
+ UPLOAD_TIMEOUT_MS: 10 * 60_000,
56
+ /** `xcodebuild -list -json` resolves SPM deps on first run — not instant. */
57
+ LIST_TIMEOUT_MS: 60_000,
58
+ };
49
59
  //# sourceMappingURL=timeouts.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"timeouts.js","sourceRoot":"","sources":["../../src/constants/timeouts.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,eAAe,EAAE,MAAM;IACvB,YAAY,EAAE,MAAM;CACZ,CAAC;AAEX,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,cAAc,EAAE,MAAM;IACtB,kBAAkB,EAAE,KAAK;IACzB,gBAAgB,EAAE,GAAG;CACb,CAAC;AAEX,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,iBAAiB,EAAE,MAAM;IACzB,OAAO,EAAE,OAAO;IAChB,UAAU,EAAE,MAAM;CACV,CAAC;AAEX,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,cAAc,EAAE,MAAM;IACtB,iBAAiB,EAAE,KAAK;CAChB,CAAC;AAEX,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB,SAAS,EAAE,EAAE;IACb,eAAe,EAAE,MAAM;IACvB,kBAAkB,EAAE,GAAG;IACvB,mBAAmB,EAAE,GAAG;IACxB,oBAAoB,EAAE,GAAG;CACjB,CAAC;AAEX,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,4BAA4B,EAAE,MAAM;CAC5B,CAAC;AAEX,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB,kBAAkB,EAAE,MAAM;CAClB,CAAC;AAEX,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,uBAAuB,EAAE,MAAM;IAC/B,gBAAgB,EAAE,GAAG;CACb,CAAC;AAEX,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,2DAA2D;IAC3D,kBAAkB,EAAE,GAAG;IACvB,kBAAkB,EAAE,CAAC;CACb,CAAC;AAEX,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,OAAO,EAAE,GAAG;IACZ,SAAS,EAAE,GAAG;CACN,CAAC"}
1
+ {"version":3,"file":"timeouts.js","sourceRoot":"","sources":["../../src/constants/timeouts.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,eAAe,EAAE,MAAM;IACvB,YAAY,EAAE,MAAM;CACZ,CAAC;AAEX,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,cAAc,EAAE,MAAM;IACtB,kBAAkB,EAAE,KAAK;IACzB,gBAAgB,EAAE,GAAG;CACb,CAAC;AAEX,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,iBAAiB,EAAE,MAAM;IACzB,OAAO,EAAE,OAAO;IAChB,UAAU,EAAE,MAAM;CACV,CAAC;AAEX,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,cAAc,EAAE,MAAM;IACtB,iBAAiB,EAAE,KAAK;CAChB,CAAC;AAEX,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB,SAAS,EAAE,EAAE;IACb,eAAe,EAAE,MAAM;IACvB,kBAAkB,EAAE,GAAG;IACvB,mBAAmB,EAAE,GAAG;IACxB,oBAAoB,EAAE,GAAG;CACjB,CAAC;AAEX,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,4BAA4B,EAAE,MAAM;CAC5B,CAAC;AAEX,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB,kBAAkB,EAAE,MAAM;CAClB,CAAC;AAEX,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,uBAAuB,EAAE,MAAM;IAC/B,gBAAgB,EAAE,GAAG;CACb,CAAC;AAEX,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,2DAA2D;IAC3D,kBAAkB,EAAE,GAAG;IACvB,kBAAkB,EAAE,CAAC;CACb,CAAC;AAEX,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,OAAO,EAAE,GAAG;IACZ,SAAS,EAAE,GAAG;CACN,CAAC;AAEX,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,+EAA+E;IAC/E,kBAAkB,EAAE,EAAE,GAAG,MAAM;IAC/B,gFAAgF;IAChF,iBAAiB,EAAE,EAAE,GAAG,MAAM;IAC9B,yEAAyE;IACzE,iBAAiB,EAAE,EAAE,GAAG,MAAM;IAC9B,6EAA6E;IAC7E,eAAe,EAAE,MAAM;CACf,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { MobileError } from "./base.js";
2
+ /**
3
+ * App Store Connect / TestFlight error classes.
4
+ * Detail strings passed into these constructors MUST already be sanitized
5
+ * (sanitizeErrorMessage + slice) by the caller — see store/app-store-connect.ts.
6
+ */
7
+ export declare class AscKeyMissingError extends MobileError {
8
+ constructor();
9
+ }
10
+ export declare class AscAuthError extends MobileError {
11
+ constructor(detail: string);
12
+ }
13
+ export declare class AscUploadError extends MobileError {
14
+ constructor(detail: string);
15
+ }
16
+ export declare class AscRateLimitError extends MobileError {
17
+ constructor(detail?: string);
18
+ }
19
+ export declare class IpaValidationError extends MobileError {
20
+ constructor(detail: string);
21
+ }
22
+ export declare class TestflightVersionCollisionError extends MobileError {
23
+ constructor(version: string);
24
+ }
25
+ export declare class TestflightSigningError extends MobileError {
26
+ constructor(detail: string);
27
+ }
28
+ export declare class TestflightProcessingFailedError extends MobileError {
29
+ constructor(buildId: string, state: string);
30
+ }
31
+ //# sourceMappingURL=asc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asc.d.ts","sourceRoot":"","sources":["../../src/errors/asc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC;;;;GAIG;AAEH,qBAAa,kBAAmB,SAAQ,WAAW;;CAUlD;AAED,qBAAa,YAAa,SAAQ,WAAW;gBAC/B,MAAM,EAAE,MAAM;CAQ3B;AAED,qBAAa,cAAe,SAAQ,WAAW;gBACjC,MAAM,EAAE,MAAM;CAG3B;AAED,qBAAa,iBAAkB,SAAQ,WAAW;gBACpC,MAAM,SAAK;CAOxB;AAED,qBAAa,kBAAmB,SAAQ,WAAW;gBACrC,MAAM,EAAE,MAAM;CAQ3B;AAED,qBAAa,+BAAgC,SAAQ,WAAW;gBAClD,OAAO,EAAE,MAAM;CAO5B;AAED,qBAAa,sBAAuB,SAAQ,WAAW;gBACzC,MAAM,EAAE,MAAM;CAO3B;AAED,qBAAa,+BAAgC,SAAQ,WAAW;gBAClD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;CAQ3C"}
@@ -0,0 +1,59 @@
1
+ import { MobileError } from "./base.js";
2
+ /**
3
+ * App Store Connect / TestFlight error classes.
4
+ * Detail strings passed into these constructors MUST already be sanitized
5
+ * (sanitizeErrorMessage + slice) by the caller — see store/app-store-connect.ts.
6
+ */
7
+ export class AscKeyMissingError extends MobileError {
8
+ constructor() {
9
+ super("App Store Connect API key is not configured.\n\n" +
10
+ "Set ASC_KEY_ID, ASC_ISSUER_ID and ASC_KEY_FILE (path to the .p8 key) environment variables.\n" +
11
+ "Alternatively set ASC_PRIVATE_KEY with the inline PEM content.\n" +
12
+ "Create a key in App Store Connect → Users and Access → Integrations.", "ASC_KEY_MISSING");
13
+ }
14
+ }
15
+ export class AscAuthError extends MobileError {
16
+ constructor(detail) {
17
+ super(`App Store Connect authentication failed: ${detail}\n\n` +
18
+ "Check ASC_KEY_ID / ASC_ISSUER_ID and that the .p8 key is valid, not revoked, " +
19
+ "and has sufficient role (App Manager or Admin).", "ASC_AUTH_ERROR");
20
+ }
21
+ }
22
+ export class AscUploadError extends MobileError {
23
+ constructor(detail) {
24
+ super(`App Store Connect upload failed: ${detail}`, "ASC_UPLOAD_ERROR");
25
+ }
26
+ }
27
+ export class AscRateLimitError extends MobileError {
28
+ constructor(detail = "") {
29
+ super(`App Store Connect rate limit exceeded (HTTP 429).${detail ? ` ${detail}` : ""} ` +
30
+ "Retry after a short delay.", "ASC_RATE_LIMIT");
31
+ }
32
+ }
33
+ export class IpaValidationError extends MobileError {
34
+ constructor(detail) {
35
+ super(`IPA failed App Store validation — Apple would silently drop this package ` +
36
+ `after upload (it never appears in TestFlight builds):\n${detail}\n\n` +
37
+ "Fix the issues above, rebuild, and upload again.", "IPA_VALIDATION_FAILED");
38
+ }
39
+ }
40
+ export class TestflightVersionCollisionError extends MobileError {
41
+ constructor(version) {
42
+ super(`TestFlight build with version ${version} already exists.\n\n` +
43
+ "Increment CFBundleVersion (build number) and re-upload.", "TESTFLIGHT_VERSION_COLLISION");
44
+ }
45
+ }
46
+ export class TestflightSigningError extends MobileError {
47
+ constructor(detail) {
48
+ super(`TestFlight signing failed: ${detail}\n\n` +
49
+ "Check signing identities: security find-identity -v -p codesigning", "TESTFLIGHT_SIGNING_ERROR");
50
+ }
51
+ }
52
+ export class TestflightProcessingFailedError extends MobileError {
53
+ constructor(buildId, state) {
54
+ super(`TestFlight build ${buildId} processing failed (state: ${state}).\n\n` +
55
+ "Check App Store Connect for details — common causes: missing export compliance, " +
56
+ "invalid Info.plist, asset validation failure.", "TESTFLIGHT_PROCESSING_FAILED");
57
+ }
58
+ }
59
+ //# sourceMappingURL=asc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asc.js","sourceRoot":"","sources":["../../src/errors/asc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC;;;;GAIG;AAEH,MAAM,OAAO,kBAAmB,SAAQ,WAAW;IACjD;QACE,KAAK,CACH,kDAAkD;YAChD,+FAA+F;YAC/F,kEAAkE;YAClE,sEAAsE,EACxE,iBAAiB,CAClB,CAAC;IACJ,CAAC;CACF;AAED,MAAM,OAAO,YAAa,SAAQ,WAAW;IAC3C,YAAY,MAAc;QACxB,KAAK,CACH,4CAA4C,MAAM,MAAM;YACtD,+EAA+E;YAC/E,iDAAiD,EACnD,gBAAgB,CACjB,CAAC;IACJ,CAAC;CACF;AAED,MAAM,OAAO,cAAe,SAAQ,WAAW;IAC7C,YAAY,MAAc;QACxB,KAAK,CAAC,oCAAoC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC;IAC1E,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,WAAW;IAChD,YAAY,MAAM,GAAG,EAAE;QACrB,KAAK,CACH,oDAAoD,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG;YAC/E,4BAA4B,EAC9B,gBAAgB,CACjB,CAAC;IACJ,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,WAAW;IACjD,YAAY,MAAc;QACxB,KAAK,CACH,2EAA2E;YACzE,0DAA0D,MAAM,MAAM;YACtE,kDAAkD,EACpD,uBAAuB,CACxB,CAAC;IACJ,CAAC;CACF;AAED,MAAM,OAAO,+BAAgC,SAAQ,WAAW;IAC9D,YAAY,OAAe;QACzB,KAAK,CACH,iCAAiC,OAAO,sBAAsB;YAC5D,yDAAyD,EAC3D,8BAA8B,CAC/B,CAAC;IACJ,CAAC;CACF;AAED,MAAM,OAAO,sBAAuB,SAAQ,WAAW;IACrD,YAAY,MAAc;QACxB,KAAK,CACH,8BAA8B,MAAM,MAAM;YACxC,oEAAoE,EACtE,0BAA0B,CAC3B,CAAC;IACJ,CAAC;CACF;AAED,MAAM,OAAO,+BAAgC,SAAQ,WAAW;IAC9D,YAAY,OAAe,EAAE,KAAa;QACxC,KAAK,CACH,oBAAoB,OAAO,8BAA8B,KAAK,QAAQ;YACpE,kFAAkF;YAClF,+CAA+C,EACjD,8BAA8B,CAC/B,CAAC;IACJ,CAAC;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/errors/base.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,qBAAa,WAAY,SAAQ,KAAK;aAES,IAAI,EAAE,MAAM;IADzD,SAAS,CAAC,EAAE,MAAM,CAAC;gBACP,OAAO,EAAE,MAAM,EAAkB,IAAI,EAAE,MAAM;CAI1D;AAED,sEAAsE;AACtE,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,EAAE,CAU3F,CAAC;AAEF,mFAAmF;AACnF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,EAAE,CAYjG;AAOD,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAEnD"}
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/errors/base.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,qBAAa,WAAY,SAAQ,KAAK;aAES,IAAI,EAAE,MAAM;IADzD,SAAS,CAAC,EAAE,MAAM,CAAC;gBACP,OAAO,EAAE,MAAM,EAAkB,IAAI,EAAE,MAAM;CAI1D;AAED,sEAAsE;AACtE,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,EAAE,CAmB3F,CAAC;AAEF,mFAAmF;AACnF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,EAAE,CAYjG;AAQD,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAEnD"}
@@ -21,6 +21,15 @@ export const RECOVERY_HINTS = {
21
21
  BROWSER_SESSION_NOT_FOUND: [{ tool: "browser", args: { action: "open" } }],
22
22
  SCENARIO_NOT_FOUND: [{ tool: "recorder", args: { action: "list" } }],
23
23
  BASELINE_NOT_FOUND: [{ tool: "visual", args: { action: "baseline_save" } }],
24
+ // App Store Connect / TestFlight — recovery is a manual user action, so no
25
+ // tool call applies; the full hint text lives in the error message (errors/asc.ts):
26
+ // ASC_KEY_MISSING → "Set ASC_KEY_ID, ASC_ISSUER_ID and ASC_KEY_FILE env vars —
27
+ // create a key in App Store Connect → Users and Access → Integrations"
28
+ // TESTFLIGHT_VERSION_COLLISION → "Increment CFBundleVersion"
29
+ // TESTFLIGHT_SIGNING_ERROR → "Check signing: security find-identity -v -p codesigning"
30
+ ASC_KEY_MISSING: [],
31
+ TESTFLIGHT_VERSION_COLLISION: [],
32
+ TESTFLIGHT_SIGNING_ERROR: [],
24
33
  };
25
34
  /** Get recovery hints for an error, with dynamic handling for MODULE_NOT_LOADED */
26
35
  export function getRecoveryHints(error) {
@@ -38,6 +47,7 @@ export function getRecoveryHints(error) {
38
47
  const RETRYABLE_CODES = new Set([
39
48
  "DEVICE_OFFLINE", "COMMAND_TIMEOUT", "ADB_ERROR",
40
49
  "SYNC_BARRIER_TIMEOUT",
50
+ "ASC_RATE_LIMIT",
41
51
  ]);
42
52
  export function isRetryable(error) {
43
53
  return error instanceof MobileError && RETRYABLE_CODES.has(error.code);
@@ -1 +1 @@
1
- {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/errors/base.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,OAAO,WAAY,SAAQ,KAAK;IAES;IAD7C,SAAS,CAAU;IACnB,YAAY,OAAe,EAAkB,IAAY;QACvD,KAAK,CAAC,OAAO,CAAC,CAAC;QAD4B,SAAI,GAAJ,IAAI,CAAQ;QAEvD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;IACpC,CAAC;CACF;AAED,sEAAsE;AACtE,MAAM,CAAC,MAAM,cAAc,GAAqE;IAC9F,iBAAiB,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;IAC7D,qBAAqB,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,CAAC;IAC1E,gBAAgB,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;IAChE,cAAc,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;IAC9D,iBAAiB,EAAE,EAAE,EAAE,wCAAwC;IAC/D,kBAAkB,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;IACnE,yBAAyB,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;IAC1E,kBAAkB,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;IACpE,kBAAkB,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,EAAE,CAAC;CAC5E,CAAC;AAEF,mFAAmF;AACnF,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,IAAI,CAAC,CAAC,KAAK,YAAY,WAAW,CAAC;QAAE,OAAO,EAAE,CAAC;IAE/C,IAAI,KAAK,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;QACvC,wEAAwE;QACxE,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACpD,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;IAED,OAAO,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;AAC1C,CAAC;AAED,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC9B,gBAAgB,EAAE,iBAAiB,EAAE,WAAW;IAChD,sBAAsB;CACvB,CAAC,CAAC;AAEH,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,OAAO,KAAK,YAAY,WAAW,IAAI,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACzE,CAAC"}
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/errors/base.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,OAAO,WAAY,SAAQ,KAAK;IAES;IAD7C,SAAS,CAAU;IACnB,YAAY,OAAe,EAAkB,IAAY;QACvD,KAAK,CAAC,OAAO,CAAC,CAAC;QAD4B,SAAI,GAAJ,IAAI,CAAQ;QAEvD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;IACpC,CAAC;CACF;AAED,sEAAsE;AACtE,MAAM,CAAC,MAAM,cAAc,GAAqE;IAC9F,iBAAiB,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;IAC7D,qBAAqB,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,CAAC;IAC1E,gBAAgB,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;IAChE,cAAc,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;IAC9D,iBAAiB,EAAE,EAAE,EAAE,wCAAwC;IAC/D,kBAAkB,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;IACnE,yBAAyB,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;IAC1E,kBAAkB,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;IACpE,kBAAkB,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,EAAE,CAAC;IAC3E,2EAA2E;IAC3E,oFAAoF;IACpF,8FAA8F;IAC9F,yGAAyG;IACzG,+DAA+D;IAC/D,6FAA6F;IAC7F,eAAe,EAAE,EAAE;IACnB,4BAA4B,EAAE,EAAE;IAChC,wBAAwB,EAAE,EAAE;CAC7B,CAAC;AAEF,mFAAmF;AACnF,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,IAAI,CAAC,CAAC,KAAK,YAAY,WAAW,CAAC;QAAE,OAAO,EAAE,CAAC;IAE/C,IAAI,KAAK,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;QACvC,wEAAwE;QACxE,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACpD,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;IAED,OAAO,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;AAC1C,CAAC;AAED,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC9B,gBAAgB,EAAE,iBAAiB,EAAE,WAAW;IAChD,sBAAsB;IACtB,gBAAgB;CACjB,CAAC,CAAC;AAEH,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,OAAO,KAAK,YAAY,WAAW,IAAI,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACzE,CAAC"}
@@ -6,6 +6,7 @@
6
6
  * or `./errors/index.js`; both are equivalent.
7
7
  */
8
8
  export * from "./base.js";
9
+ export * from "./asc.js";
9
10
  export * from "./device.js";
10
11
  export * from "./adb.js";
11
12
  export * from "./ios.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC"}
@@ -6,6 +6,7 @@
6
6
  * or `./errors/index.js`; both are equivalent.
7
7
  */
8
8
  export * from "./base.js";
9
+ export * from "./asc.js";
9
10
  export * from "./device.js";
10
11
  export * from "./adb.js";
11
12
  export * from "./ios.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC"}
package/dist/index.js CHANGED
File without changes
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Classify xcodebuild / altool failures into typed errors with stable codes,
3
+ * redacting signing identities and key-file names before anything reaches the
4
+ * caller (LLM context = untrusted sink for secrets).
5
+ *
6
+ * Mapping (codes carried by the typed classes, see src/errors/asc.ts):
7
+ * TESTFLIGHT_SIGNING_ERROR -> TestflightSigningError
8
+ * TESTFLIGHT_VERSION_COLLISION -> TestflightVersionCollisionError
9
+ * ASC_AUTH_ERROR -> AscAuthError
10
+ * ASC_UPLOAD_ERROR -> AscUploadError
11
+ */
12
+ import { MobileError } from "../../errors.js";
13
+ /**
14
+ * App Store bundle-reject patterns observed in real altool validate/upload
15
+ * runs, with actionable recovery hints. Matched against individual validation
16
+ * `detail :` lines (upload.ts) and against whole stderr (classifyXcodeError).
17
+ */
18
+ export declare const BUNDLE_REJECT_HINTS: ReadonlyArray<{
19
+ pattern: RegExp;
20
+ hint: string;
21
+ }>;
22
+ /** First matching recovery hint for a bundle-reject message, if any. */
23
+ export declare function bundleRejectHint(text: string): string | undefined;
24
+ export declare function redactSigningInfo(text: string): string;
25
+ /**
26
+ * Map raw stderr to a typed error. Patterns match against the RAW stderr
27
+ * (redaction may drop the very line that identifies the failure class), but
28
+ * the resulting message only ever contains redacted content.
29
+ */
30
+ export declare function classifyXcodeError(stderr: string, context: string): MobileError;
31
+ //# sourceMappingURL=classify-build-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classify-build-error.d.ts","sourceRoot":"","sources":["../../../src/ios/build/classify-build-error.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAGL,WAAW,EAGZ,MAAM,iBAAiB,CAAC;AAwBzB;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,EAAE,aAAa,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAiBhF,CAAC;AAEF,wEAAwE;AACxE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEjE;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMtD;AAoBD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW,CAqC/E"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Classify xcodebuild / altool failures into typed errors with stable codes,
3
+ * redacting signing identities and key-file names before anything reaches the
4
+ * caller (LLM context = untrusted sink for secrets).
5
+ *
6
+ * Mapping (codes carried by the typed classes, see src/errors/asc.ts):
7
+ * TESTFLIGHT_SIGNING_ERROR -> TestflightSigningError
8
+ * TESTFLIGHT_VERSION_COLLISION -> TestflightVersionCollisionError
9
+ * ASC_AUTH_ERROR -> AscAuthError
10
+ * ASC_UPLOAD_ERROR -> AscUploadError
11
+ */
12
+ import { AscAuthError, AscUploadError, TestflightSigningError, TestflightVersionCollisionError, } from "../../errors.js";
13
+ /** Max tail of (redacted) stderr that may appear in an error message. */
14
+ const MAX_DETAIL_CHARS = 200;
15
+ /** Max number of extracted `error:` / `e: ` lines in the default message. */
16
+ const MAX_ERROR_LINES = 5;
17
+ /**
18
+ * Compiler/linker error lines buried mid-log: xcodebuild `error:`, clang
19
+ * `<file>: error:`, gradle/Kotlin `e: `. The build-system tail ("Script-*.sh
20
+ * ... (2 failures)") is noise — these lines carry the actual cause.
21
+ */
22
+ const ERROR_LINE_RE = /^(.*error:|e: |error: )/;
23
+ /**
24
+ * Lines carrying signing identities or API-key material. Dropped wholesale —
25
+ * partial redaction of "Apple Distribution: Real Name (TEAMID)" still leaks PII.
26
+ */
27
+ const SIGNING_IDENTITY_LINE = /Apple Distribution:|Developer ID|AuthKey_|\.p8/;
28
+ /** Belt-and-suspenders token redaction for anything the line filter missed. */
29
+ const KEY_TOKEN = /(?:AuthKey_[A-Za-z0-9._-]+|\S*\.p8\b)/g;
30
+ /**
31
+ * App Store bundle-reject patterns observed in real altool validate/upload
32
+ * runs, with actionable recovery hints. Matched against individual validation
33
+ * `detail :` lines (upload.ts) and against whole stderr (classifyXcodeError).
34
+ */
35
+ export const BUNDLE_REJECT_HINTS = [
36
+ {
37
+ pattern: /LaunchScreen|UILaunchScreen/,
38
+ hint: 'Add "UILaunchScreen": {} to Info.plist (iOS 14+) or include a LaunchScreen.storyboard',
39
+ },
40
+ {
41
+ pattern: /CFBundleIconName/,
42
+ hint: "Add a 1024x1024 AppIcon to Assets.xcassets and ensure CFBundleIconName is set " +
43
+ "(Xcode does this when the asset catalog has an AppIcon)",
44
+ },
45
+ {
46
+ pattern: /UISupportedInterfaceOrientations/,
47
+ hint: "iPad multitasking requires all four orientations in UISupportedInterfaceOrientations, " +
48
+ "or set UIRequiresFullScreen=true",
49
+ },
50
+ ];
51
+ /** First matching recovery hint for a bundle-reject message, if any. */
52
+ export function bundleRejectHint(text) {
53
+ return BUNDLE_REJECT_HINTS.find(({ pattern }) => pattern.test(text))?.hint;
54
+ }
55
+ export function redactSigningInfo(text) {
56
+ return text
57
+ .split("\n")
58
+ .filter((line) => !SIGNING_IDENTITY_LINE.test(line))
59
+ .join("\n")
60
+ .replace(KEY_TOKEN, "[REDACTED-KEY]");
61
+ }
62
+ function tail(text) {
63
+ const trimmed = text.trim();
64
+ return trimmed.length <= MAX_DETAIL_CHARS ? trimmed : trimmed.slice(-MAX_DETAIL_CHARS);
65
+ }
66
+ /**
67
+ * Pull actual `error:` / `e: ` lines out of REDACTED stderr. Returns undefined
68
+ * when none are present (then the caller falls back to the stderr tail).
69
+ */
70
+ function extractErrorLines(redacted) {
71
+ const lines = redacted.split("\n").filter((line) => ERROR_LINE_RE.test(line));
72
+ if (lines.length === 0)
73
+ return undefined;
74
+ return lines
75
+ .slice(0, MAX_ERROR_LINES)
76
+ .map((line) => line.trim().slice(0, MAX_DETAIL_CHARS))
77
+ .join("\n");
78
+ }
79
+ /**
80
+ * Map raw stderr to a typed error. Patterns match against the RAW stderr
81
+ * (redaction may drop the very line that identifies the failure class), but
82
+ * the resulting message only ever contains redacted content.
83
+ */
84
+ export function classifyXcodeError(stderr, context) {
85
+ const redacted = redactSigningInfo(stderr);
86
+ const detail = tail(redacted);
87
+ if (/No signing certificate|CODE_SIGN/i.test(stderr)) {
88
+ return new TestflightSigningError(`${context}: code signing failed. Ensure automatic signing is enabled and the ` +
89
+ `App Store Connect API key has the App Manager role. Details: ${detail}`);
90
+ }
91
+ if (/already been uploaded|DUPLICATE/i.test(stderr)) {
92
+ // The collision class wants the colliding version; best-effort extraction
93
+ // from the RAW stderr (never echoed back — only the parsed version is).
94
+ const version = /bundle version\s+"?([\w.]+)"?/i.exec(stderr)?.[1] ?? "(unknown)";
95
+ return new TestflightVersionCollisionError(version);
96
+ }
97
+ if (/Authentication credentials|401/i.test(stderr)) {
98
+ return new AscAuthError(`${context}: ${detail}`);
99
+ }
100
+ if (/Missing Compliance/i.test(stderr)) {
101
+ return new AscUploadError(`${context}: upload flagged "Missing Compliance". Set ` +
102
+ `ITSAppUsesNonExemptEncryption=false in Info.plist (if you only use exempt ` +
103
+ `encryption) or answer the export-compliance question in App Store Connect. ` +
104
+ `Details: ${detail}`);
105
+ }
106
+ const hint = bundleRejectHint(stderr);
107
+ if (hint) {
108
+ return new AscUploadError(`${context}: bundle rejected by App Store validation. Fix: ${hint}. Details: ${detail}`);
109
+ }
110
+ const errorLines = extractErrorLines(redacted);
111
+ return errorLines
112
+ ? new AscUploadError(`${context} failed:\n${errorLines}`)
113
+ : new AscUploadError(`${context} failed: ${detail}`);
114
+ }
115
+ //# sourceMappingURL=classify-build-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classify-build-error.js","sourceRoot":"","sources":["../../../src/ios/build/classify-build-error.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Internal execFile wrapper for the build pipeline.
3
+ *
4
+ * SECURITY: everything routes through execFile (argv form) — /bin/sh is never
5
+ * spawned, so shell metacharacters in paths/schemes are literal argv slots
6
+ * (CWE-78 mitigation, same contract as src/ios/simctl-exec.ts and src/adb/exec.ts).
7
+ *
8
+ * Returns a Result instead of throwing: callers need raw stderr to classify
9
+ * (and redact) build failures — see classify-build-error.ts.
10
+ */
11
+ export type ToolResult = {
12
+ ok: true;
13
+ stdout: string;
14
+ } | {
15
+ ok: false;
16
+ timedOut: boolean;
17
+ stderr: string;
18
+ stdout: string;
19
+ };
20
+ export declare function runTool(file: string, args: string[], options: {
21
+ timeoutMs: number;
22
+ cwd?: string;
23
+ }): Promise<ToolResult>;
24
+ //# sourceMappingURL=exec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../../src/ios/build/exec.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAUH,MAAM,MAAM,UAAU,GAClB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAG5B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAUrE,wBAAsB,OAAO,CAC3B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3C,OAAO,CAAC,UAAU,CAAC,CAerB"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Internal execFile wrapper for the build pipeline.
3
+ *
4
+ * SECURITY: everything routes through execFile (argv form) — /bin/sh is never
5
+ * spawned, so shell metacharacters in paths/schemes are literal argv slots
6
+ * (CWE-78 mitigation, same contract as src/ios/simctl-exec.ts and src/adb/exec.ts).
7
+ *
8
+ * Returns a Result instead of throwing: callers need raw stderr to classify
9
+ * (and redact) build failures — see classify-build-error.ts.
10
+ */
11
+ import { execFile } from "child_process";
12
+ import { promisify } from "util";
13
+ const execFileAsync = promisify(execFile);
14
+ /** xcodebuild logs are huge; 50 MiB matches the other exec wrappers. */
15
+ const MAX_BUFFER = 50 * 1024 * 1024;
16
+ export async function runTool(file, args, options) {
17
+ try {
18
+ const { stdout } = await execFileAsync(file, args, {
19
+ encoding: "utf-8",
20
+ timeout: options.timeoutMs,
21
+ maxBuffer: MAX_BUFFER,
22
+ cwd: options.cwd,
23
+ });
24
+ return { ok: true, stdout: stdout.toString() };
25
+ }
26
+ catch (error) {
27
+ const e = error;
28
+ const timedOut = e.killed === true || e.signal === "SIGTERM";
29
+ const stderr = e.stderr?.toString() || e.message || String(error);
30
+ return { ok: false, timedOut, stderr, stdout: e.stdout?.toString() ?? "" };
31
+ }
32
+ }
33
+ //# sourceMappingURL=exec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.js","sourceRoot":"","sources":["../../../src/ios/build/exec.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEjC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,wEAAwE;AACxE,MAAM,UAAU,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAgBpC,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,IAAY,EACZ,IAAc,EACd,OAA4C;IAE5C,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE;YACjD,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,OAAO,CAAC,SAAS;YAC1B,SAAS,EAAE,UAAU;YACrB,GAAG,EAAE,OAAO,CAAC,GAAG;SACjB,CAAC,CAAC;QACH,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;IACjD,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,MAAM,CAAC,GAAG,KAAkB,CAAC;QAC7B,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC;QAC7D,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;QAClE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC;IAC7E,CAAC;AACH,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Generate ExportOptions.plist for `xcodebuild -exportArchive`.
3
+ *
4
+ * Fixed policy: automatic signing + generateAppStoreInformation — the pipeline
5
+ * targets App Store Connect / TestFlight uploads exclusively.
6
+ */
7
+ export interface ExportOptionsConfig {
8
+ /** Only App Store Connect is supported by this pipeline. */
9
+ method?: "app-store-connect";
10
+ /** "upload" sends straight to ASC; "export" leaves the .ipa on disk. */
11
+ destination?: "upload" | "export";
12
+ /** Let Xcode bump CFBundleVersion on collision (default: true). */
13
+ manageVersion?: boolean;
14
+ }
15
+ /** Deterministic plist body — exported separately so tests can snapshot it. */
16
+ export declare function renderExportOptionsPlist(config?: ExportOptionsConfig): string;
17
+ /**
18
+ * Write the plist to a uniquely-named temp file inside `dir` and return its
19
+ * absolute path. Containment is validated so a hostile `dir` cannot place the
20
+ * file outside itself.
21
+ */
22
+ export declare function writeExportOptionsPlist(dir: string, config?: ExportOptionsConfig): Promise<string>;
23
+ //# sourceMappingURL=export-options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-options.d.ts","sourceRoot":"","sources":["../../../src/ios/build/export-options.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,MAAM,WAAW,mBAAmB;IAClC,4DAA4D;IAC5D,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,wEAAwE;IACxE,WAAW,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAClC,mEAAmE;IACnE,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAID,+EAA+E;AAC/E,wBAAgB,wBAAwB,CAAC,MAAM,GAAE,mBAAwB,GAAG,MAAM,CAsBjF;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,MAAM,EACX,MAAM,GAAE,mBAAwB,GAC/B,OAAO,CAAC,MAAM,CAAC,CAOjB"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Generate ExportOptions.plist for `xcodebuild -exportArchive`.
3
+ *
4
+ * Fixed policy: automatic signing + generateAppStoreInformation — the pipeline
5
+ * targets App Store Connect / TestFlight uploads exclusively.
6
+ */
7
+ import { randomBytes } from "crypto";
8
+ import { writeFile } from "fs/promises";
9
+ import { join } from "path";
10
+ import { validatePath, validatePathContainment } from "../../utils/sanitize.js";
11
+ const PLIST_BOOL = (value) => (value ? "<true/>" : "<false/>");
12
+ /** Deterministic plist body — exported separately so tests can snapshot it. */
13
+ export function renderExportOptionsPlist(config = {}) {
14
+ const method = config.method ?? "app-store-connect";
15
+ const destination = config.destination ?? "upload";
16
+ const manageVersion = config.manageVersion ?? true;
17
+ return `<?xml version="1.0" encoding="UTF-8"?>
18
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
19
+ <plist version="1.0">
20
+ <dict>
21
+ \t<key>method</key>
22
+ \t<string>${method}</string>
23
+ \t<key>destination</key>
24
+ \t<string>${destination}</string>
25
+ \t<key>signingStyle</key>
26
+ \t<string>automatic</string>
27
+ \t<key>generateAppStoreInformation</key>
28
+ \t${PLIST_BOOL(true)}
29
+ \t<key>manageAppVersionAndBuildNumber</key>
30
+ \t${PLIST_BOOL(manageVersion)}
31
+ </dict>
32
+ </plist>
33
+ `;
34
+ }
35
+ /**
36
+ * Write the plist to a uniquely-named temp file inside `dir` and return its
37
+ * absolute path. Containment is validated so a hostile `dir` cannot place the
38
+ * file outside itself.
39
+ */
40
+ export async function writeExportOptionsPlist(dir, config = {}) {
41
+ validatePath(dir, "export options directory");
42
+ const fileName = `ExportOptions-${randomBytes(4).toString("hex")}.plist`;
43
+ const filePath = join(dir, fileName);
44
+ validatePathContainment(filePath, dir);
45
+ await writeFile(filePath, renderExportOptionsPlist(config), "utf-8");
46
+ return filePath;
47
+ }
48
+ //# sourceMappingURL=export-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-options.js","sourceRoot":"","sources":["../../../src/ios/build/export-options.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAWhF,MAAM,UAAU,GAAG,CAAC,KAAc,EAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;AAEhF,+EAA+E;AAC/E,MAAM,UAAU,wBAAwB,CAAC,SAA8B,EAAE;IACvE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,mBAAmB,CAAC;IACpD,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,QAAQ,CAAC;IACnD,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,IAAI,IAAI,CAAC;IAEnD,OAAO;;;;;YAKG,MAAM;;YAEN,WAAW;;;;IAInB,UAAU,CAAC,IAAI,CAAC;;IAEhB,UAAU,CAAC,aAAa,CAAC;;;CAG5B,CAAC;AACF,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,GAAW,EACX,SAA8B,EAAE;IAEhC,YAAY,CAAC,GAAG,EAAE,0BAA0B,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,iBAAiB,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC;IACzE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACrC,uBAAuB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IACvC,MAAM,SAAS,CAAC,QAAQ,EAAE,wBAAwB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;IACrE,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * iOS build + TestFlight upload pipeline.
3
+ *
4
+ * Typical flow:
5
+ * detectIosProject -> listSchemes -> pickReleaseScheme ->
6
+ * archiveApp -> writeExportOptionsPlist -> exportArchive -> uploadIpa
7
+ * (Flutter projects short-circuit via buildFlutterIpa -> uploadIpa.)
8
+ */
9
+ export { detectIosProject, listSchemes, pickReleaseScheme, xcodeTargetArgs, type ProjectInfo, type ProjectKind, } from "./project-detector.js";
10
+ export { renderExportOptionsPlist, writeExportOptionsPlist, type ExportOptionsConfig, } from "./export-options.js";
11
+ export { archiveApp, exportArchive, buildFlutterIpa, type AscApiAuth, } from "./xcode-build.js";
12
+ export { uploadIpa, validateIpa } from "./upload.js";
13
+ export { bundleRejectHint, classifyXcodeError, redactSigningInfo, } from "./classify-build-error.js";
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ios/build/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,iBAAiB,EACjB,eAAe,EACf,KAAK,WAAW,EAChB,KAAK,WAAW,GACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,wBAAwB,EACxB,uBAAuB,EACvB,KAAK,mBAAmB,GACzB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,UAAU,EACV,aAAa,EACb,eAAe,EACf,KAAK,UAAU,GAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * iOS build + TestFlight upload pipeline.
3
+ *
4
+ * Typical flow:
5
+ * detectIosProject -> listSchemes -> pickReleaseScheme ->
6
+ * archiveApp -> writeExportOptionsPlist -> exportArchive -> uploadIpa
7
+ * (Flutter projects short-circuit via buildFlutterIpa -> uploadIpa.)
8
+ */
9
+ export { detectIosProject, listSchemes, pickReleaseScheme, xcodeTargetArgs, } from "./project-detector.js";
10
+ export { renderExportOptionsPlist, writeExportOptionsPlist, } from "./export-options.js";
11
+ export { archiveApp, exportArchive, buildFlutterIpa, } from "./xcode-build.js";
12
+ export { uploadIpa, validateIpa } from "./upload.js";
13
+ export { bundleRejectHint, classifyXcodeError, redactSigningInfo, } from "./classify-build-error.js";
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ios/build/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,iBAAiB,EACjB,eAAe,GAGhB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,wBAAwB,EACxB,uBAAuB,GAExB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,UAAU,EACV,aAAa,EACb,eAAe,GAEhB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Detect what kind of iOS project lives in a directory and resolve the
3
+ * workspace/project xcodebuild should be pointed at.
4
+ *
5
+ * Detection order (first match wins):
6
+ * 1. flutter — pubspec.yaml + ios/
7
+ * 2. react-native — package.json with a react-native dep + ios/*.xcworkspace
8
+ * 3. kmp — iosApp/*.xcodeproj (Kotlin Multiplatform layout)
9
+ * 4. xcode — *.xcworkspace (preferred) or *.xcodeproj in the dir itself
10
+ */
11
+ export type ProjectKind = "flutter" | "react-native" | "kmp" | "xcode";
12
+ export interface ProjectInfo {
13
+ kind: ProjectKind;
14
+ /** Absolute path to *.xcworkspace, when one exists (takes priority). */
15
+ workspacePath?: string;
16
+ /** Absolute path to *.xcodeproj, when no workspace is available. */
17
+ projectPath?: string;
18
+ /** Directory xcodebuild/flutter should run relative to. */
19
+ buildDir: string;
20
+ }
21
+ export declare function detectIosProject(dir: string): Promise<ProjectInfo>;
22
+ /** `-workspace <ws>` or `-project <proj>` argv slice for xcodebuild. */
23
+ export declare function xcodeTargetArgs(info: ProjectInfo): string[];
24
+ export declare function listSchemes(info: ProjectInfo): Promise<string[]>;
25
+ /**
26
+ * Pick the scheme to archive: exact "Release" > "<x>-Release" suffix > first
27
+ * scheme that is neither a test nor a debug scheme > first scheme.
28
+ */
29
+ export declare function pickReleaseScheme(schemes: string[]): string;
30
+ //# sourceMappingURL=project-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-detector.d.ts","sourceRoot":"","sources":["../../../src/ios/build/project-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAUH,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,cAAc,GAAG,KAAK,GAAG,OAAO,CAAC;AAEvE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,WAAW,CAAC;IAClB,wEAAwE;IACxE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oEAAoE;IACpE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAC;CAClB;AA0CD,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CA2DxE;AAED,wEAAwE;AACxE,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,EAAE,CAO3D;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAuBtE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAa3D"}