nativeapptemplate-agent 0.3.1 → 0.4.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 (113) hide show
  1. package/AGENTS.md +1 -1
  2. package/README.md +45 -15
  3. package/dist/agents/judge.d.ts.map +1 -1
  4. package/dist/agents/judge.js +8 -2
  5. package/dist/agents/judge.js.map +1 -1
  6. package/dist/agents/repair.d.ts +5 -0
  7. package/dist/agents/repair.d.ts.map +1 -1
  8. package/dist/agents/repair.js +9 -1
  9. package/dist/agents/repair.js.map +1 -1
  10. package/dist/agents/types.d.ts +14 -0
  11. package/dist/agents/types.d.ts.map +1 -1
  12. package/dist/agents/workers/android.d.ts.map +1 -1
  13. package/dist/agents/workers/android.js +27 -3
  14. package/dist/agents/workers/android.js.map +1 -1
  15. package/dist/agents/workers/copy.d.ts +1 -0
  16. package/dist/agents/workers/copy.d.ts.map +1 -1
  17. package/dist/agents/workers/copy.js +23 -4
  18. package/dist/agents/workers/copy.js.map +1 -1
  19. package/dist/agents/workers/ios.d.ts.map +1 -1
  20. package/dist/agents/workers/ios.js +23 -3
  21. package/dist/agents/workers/ios.js.map +1 -1
  22. package/dist/agents/workers/rails.d.ts.map +1 -1
  23. package/dist/agents/workers/rails.js +6 -1
  24. package/dist/agents/workers/rails.js.map +1 -1
  25. package/dist/app-domain.d.ts +32 -0
  26. package/dist/app-domain.d.ts.map +1 -0
  27. package/dist/app-domain.js +93 -0
  28. package/dist/app-domain.js.map +1 -0
  29. package/dist/dispatch.d.ts +7 -0
  30. package/dist/dispatch.d.ts.map +1 -1
  31. package/dist/dispatch.js +61 -10
  32. package/dist/dispatch.js.map +1 -1
  33. package/dist/env-bridge.d.ts +1 -0
  34. package/dist/env-bridge.d.ts.map +1 -1
  35. package/dist/env-bridge.js +53 -16
  36. package/dist/env-bridge.js.map +1 -1
  37. package/dist/index.d.ts +4 -0
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +55 -9
  40. package/dist/index.js.map +1 -1
  41. package/dist/mcp.d.ts +5 -1
  42. package/dist/mcp.d.ts.map +1 -1
  43. package/dist/mcp.js +43 -16
  44. package/dist/mcp.js.map +1 -1
  45. package/dist/mobile.d.ts +1 -1
  46. package/dist/mobile.d.ts.map +1 -1
  47. package/dist/mobile.js +3 -3
  48. package/dist/mobile.js.map +1 -1
  49. package/dist/models.d.ts +6 -0
  50. package/dist/models.d.ts.map +1 -1
  51. package/dist/models.js +11 -0
  52. package/dist/models.js.map +1 -1
  53. package/dist/preflight.d.ts +27 -0
  54. package/dist/preflight.d.ts.map +1 -0
  55. package/dist/preflight.js +106 -0
  56. package/dist/preflight.js.map +1 -0
  57. package/dist/report/collect.d.ts +5 -0
  58. package/dist/report/collect.d.ts.map +1 -1
  59. package/dist/report/collect.js +15 -0
  60. package/dist/report/collect.js.map +1 -1
  61. package/dist/report/model.d.ts +14 -0
  62. package/dist/report/model.d.ts.map +1 -1
  63. package/dist/report/render.d.ts.map +1 -1
  64. package/dist/report/render.js +69 -6
  65. package/dist/report/render.js.map +1 -1
  66. package/dist/report/theme.d.ts +1 -1
  67. package/dist/report/theme.d.ts.map +1 -1
  68. package/dist/report/theme.js +1 -0
  69. package/dist/report/theme.js.map +1 -1
  70. package/dist/run-options.d.ts +7 -0
  71. package/dist/run-options.d.ts.map +1 -0
  72. package/dist/run-options.js +24 -0
  73. package/dist/run-options.js.map +1 -0
  74. package/dist/structured-output.d.ts +7 -0
  75. package/dist/structured-output.d.ts.map +1 -1
  76. package/dist/structured-output.js +10 -1
  77. package/dist/structured-output.js.map +1 -1
  78. package/dist/validation/autoformat.d.ts +9 -0
  79. package/dist/validation/autoformat.d.ts.map +1 -0
  80. package/dist/validation/autoformat.js +131 -0
  81. package/dist/validation/autoformat.js.map +1 -0
  82. package/dist/validation/launch.d.ts +23 -2
  83. package/dist/validation/launch.d.ts.map +1 -1
  84. package/dist/validation/launch.js +47 -18
  85. package/dist/validation/launch.js.map +1 -1
  86. package/dist/validation/layer1.d.ts.map +1 -1
  87. package/dist/validation/layer1.js +4 -0
  88. package/dist/validation/layer1.js.map +1 -1
  89. package/dist/validation/layer3.d.ts +1 -0
  90. package/dist/validation/layer3.d.ts.map +1 -1
  91. package/dist/validation/layer3.js +20 -3
  92. package/dist/validation/layer3.js.map +1 -1
  93. package/dist/validation/protected-references.d.ts +2 -0
  94. package/dist/validation/protected-references.d.ts.map +1 -0
  95. package/dist/validation/protected-references.js +18 -0
  96. package/dist/validation/protected-references.js.map +1 -0
  97. package/dist/validation/run-step.d.ts +16 -0
  98. package/dist/validation/run-step.d.ts.map +1 -0
  99. package/dist/validation/run-step.js +49 -0
  100. package/dist/validation/run-step.js.map +1 -0
  101. package/dist/validation/scenarios/queue.d.ts.map +1 -1
  102. package/dist/validation/scenarios/queue.js +7 -3
  103. package/dist/validation/scenarios/queue.js.map +1 -1
  104. package/dist/validation/stage2-judge.d.ts +4 -2
  105. package/dist/validation/stage2-judge.d.ts.map +1 -1
  106. package/dist/validation/stage2-judge.js +79 -4
  107. package/dist/validation/stage2-judge.js.map +1 -1
  108. package/dist/validation/test-suites.d.ts +10 -0
  109. package/dist/validation/test-suites.d.ts.map +1 -0
  110. package/dist/validation/test-suites.js +135 -0
  111. package/dist/validation/test-suites.js.map +1 -0
  112. package/package.json +1 -1
  113. package/scripts/ruby/rename.rb +97 -2
@@ -0,0 +1,49 @@
1
+ import { spawn } from "node:child_process";
2
+ import { scrubbedEnv } from "../env.js";
3
+ // Only the end of the output is ever reported; `xcodebuild test` alone can
4
+ // print tens of megabytes.
5
+ const MAX_OUTPUT_BYTES = 1_000_000;
6
+ export function runStep(cwd, argv, options) {
7
+ const [command, ...rest] = options.useMise ? ["mise", "exec", "--", ...argv] : argv;
8
+ const start = Date.now();
9
+ return new Promise((done) => {
10
+ // Never inherit stdout/stdin: under the MCP server those are the
11
+ // JSON-RPC channel.
12
+ const child = spawn(command, rest, { cwd, stdio: ["ignore", "pipe", "pipe"], env: scrubbedEnv(options.env) });
13
+ let chunks = [];
14
+ let size = 0;
15
+ const collect = (c) => {
16
+ chunks.push(c);
17
+ size += c.length;
18
+ if (size > MAX_OUTPUT_BYTES * 2) {
19
+ const all = Buffer.concat(chunks);
20
+ chunks = [all.subarray(all.length - MAX_OUTPUT_BYTES)];
21
+ size = MAX_OUTPUT_BYTES;
22
+ }
23
+ };
24
+ let timedOut = false;
25
+ const timer = setTimeout(() => { timedOut = true; child.kill("SIGTERM"); }, options.timeoutMs);
26
+ child.stdout?.on("data", collect);
27
+ child.stderr?.on("data", collect);
28
+ const finish = (exitCode, extra = "") => {
29
+ clearTimeout(timer);
30
+ done({ exitCode, durationMs: Date.now() - start, timedOut, output: Buffer.concat(chunks).toString("utf8") + extra });
31
+ };
32
+ child.on("close", (code) => finish(timedOut ? null : code, timedOut ? `\n(timed out after ${Math.round(options.timeoutMs / 1000)}s)` : ""));
33
+ child.on("error", (err) => finish(null, `\n${err.message}`));
34
+ });
35
+ }
36
+ export function commandAvailable(bin, env) {
37
+ return new Promise((done) => {
38
+ const c = spawn("which", [bin], { env: scrubbedEnv(env), stdio: "ignore" });
39
+ c.on("close", (code) => done(code === 0));
40
+ c.on("error", () => done(false));
41
+ });
42
+ }
43
+ export function tailLines(s, lines) {
44
+ return s.trimEnd().split("\n").slice(-lines).join("\n");
45
+ }
46
+ export function withMisePrefix(command, useMise) {
47
+ return useMise ? `mise exec -- ${command}` : command;
48
+ }
49
+ //# sourceMappingURL=run-step.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-step.js","sourceRoot":"","sources":["../../src/validation/run-step.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../../src/validation/scenarios/queue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAc,MAAM,cAAc,CAAC;AAuC/D,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IAEjB,mBAAmB,EAAE,MAAM,CAAC;IAI5B,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;AAEzC,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,mBAAmB,EAC3B,QAAQ,GAAE,QAAgB,GACzB,cAAc,CAyOhB"}
1
+ {"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../../src/validation/scenarios/queue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAc,MAAM,cAAc,CAAC;AAuC/D,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IAEjB,mBAAmB,EAAE,MAAM,CAAC;IAI5B,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;AAEzC,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,mBAAmB,EAC3B,QAAQ,GAAE,QAAgB,GACzB,cAAc,CA6OhB"}
@@ -52,9 +52,13 @@ export function buildQueueScenario(domain, inputs, platform = "ios") {
52
52
  { kind: "type", text: inputs.email },
53
53
  { kind: "tap_below_text", text: "Password" },
54
54
  // submit:true dismisses the on-screen keyboard after the last
55
- // field — without it, the keyboard occludes the bottom Sign Up
56
- // button and tap_text "Sign Up" hits the keyboard area instead.
57
- { kind: "type", text: inputs.password, submit: true },
55
+ // field on iOS — without it, the keyboard occludes the bottom Sign
56
+ // Up button and tap_text "Sign Up" hits the keyboard area instead.
57
+ // NOT on Android: mobile-mcp types a literal "\n" into the field
58
+ // there, so the account is created with password "<pw>\n" and the
59
+ // later Sign In (typed without it) gets 401. The press_button
60
+ // "BACK" below dismisses the Android keyboard instead.
61
+ { kind: "type", text: inputs.password, submit: platform === "ios" },
58
62
  // Dismiss the on-screen keyboard before tapping Sign Up. On
59
63
  // iOS the keychain dialog handler below catches things; on
60
64
  // Android the Sign Up submit button (Compose, rendered as
@@ -1 +1 @@
1
- {"version":3,"file":"queue.js","sourceRoot":"","sources":["../../../src/validation/scenarios/queue.ts"],"names":[],"mappings":"AAsDA,MAAM,UAAU,kBAAkB,CAChC,MAAkB,EAClB,MAA2B,EAC3B,WAAqB,KAAK;IAE1B,MAAM,cAAc,GAAG,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,SAAS,CAAC;IACjE,iEAAiE;IACjE,+DAA+D;IAC/D,iDAAiD;IACjD,MAAM,eAAe,GAAG,SAAS,CAAC,MAAM,EAAE,YAAY,CAAC,IAAI,YAAY,CAAC;IAExE,8DAA8D;IAC9D,kEAAkE;IAClE,+DAA+D;IAC/D,mEAAmE;IACnE,qDAAqD;IACrD,MAAM,cAAc,GAAiB,QAAQ,KAAK,KAAK;QACrD,CAAC,CAAC;YACE,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC,WAAW,EAAE,UAAU,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE;YACpE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE;YAClD,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC,iBAAiB,EAAE,UAAU,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE;YAC3E,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE;SACtD;QACH,CAAC,CAAC;YACE,8DAA8D;YAC9D,8DAA8D;YAC9D,0DAA0D;YAC1D,EAAE;YACF,+DAA+D;YAC/D,+DAA+D;YAC/D,4DAA4D;YAC5D,6DAA6D;YAC7D,4CAA4C;YAC5C,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE;YAChD,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE;YACpC,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;YACxD,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE;YACnD,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE;YACvC,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;SACzD,CAAC;IAEN,MAAM,KAAK,GAAiB;QAC1B,2DAA2D;QAE3D,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,YAAY,EAAE;QAC7C,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE;QAC3C,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE;QAEnC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,wBAAwB,EAAE;QACzD,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,gBAAgB,EAAE;QAC/C,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,wBAAwB,EAAE;QAEpD,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,WAAW,EAAE;QAC5C,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,gBAAgB,EAAE;QAC/C,iEAAiE;QACjE,+DAA+D;QAC/D,0DAA0D;QAC1D,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,WAAW,EAAE;QAC7C,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE;QAEvC,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,OAAO,EAAE;QACzC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE;QAEpC,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,UAAU,EAAE;QAC5C,8DAA8D;QAC9D,+DAA+D;QAC/D,gEAAgE;QAChE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE;QAErD,4DAA4D;QAC5D,2DAA2D;QAC3D,0DAA0D;QAC1D,gEAAgE;QAChE,iEAAiE;QACjE,6DAA6D;QAC7D,+DAA+D;QAC/D,iDAAiD;QACjD,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;QAExD,kEAAkE;QAClE,gEAAgE;QAChE,6DAA6D;QAC7D,gEAAgE;QAChE,gCAAgC;QAChC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE;QAErC,mEAAmE;QACnE,mEAAmE;QACnE,kEAAkE;QAClE,4DAA4D;QAC5D,8DAA8D;QAC9D,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE;QACrE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE;QAEvE,8DAA8D;QAC9D,iEAAiE;QACjE,yDAAyD;QACzD,gEAAgE;QAChE,2DAA2D;QAC3D,qCAAqC;QACrC;YACE,IAAI,EAAE,cAAc;YACpB,MAAM,EAAE,MAAM,CAAC,WAAW;YAC1B,IAAI,EAAE,GAAG,eAAe,mBAAmB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY;YACnF,KAAK,EAAE,aAAa;SACrB;QAED,kEAAkE;QAClE,kEAAkE;QAClE,8DAA8D;QAC9D,8DAA8D;QAC9D,8BAA8B;QAC9B,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE;QACrE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE;QACvE,wEAAwE;QACxE,wEAAwE;QACxE,2EAA2E;QAC3E,2EAA2E;QAC3E,6DAA6D;QAC7D,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE;QACrE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE;QACvE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,yBAAyB,EAAE;QACrD,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE;QAC3D,iEAAiE;QACjE,kEAAkE;QAClE,6DAA6D;QAC7D,iDAAiD;QACjD,GAAG,cAAc;QACjB,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE;QAErC,+DAA+D;QAC/D,sDAAsD;QACtD,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE;QACrE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE;QAEvE,6DAA6D;QAC7D,iEAAiE;QACjE,4DAA4D;QAC5D,gEAAgE;QAChE,8DAA8D;QAC9D,qDAAqD;QACrD,iDAAiD;QACjD,EAAE;QACF,0DAA0D;QAC1D,4DAA4D;QAC5D,8DAA8D;QAC9D,qBAAqB;QACrB,EAAE;QACF,+DAA+D;QAC/D,0DAA0D;QAC1D,2DAA2D;QAC3D,gEAAgE;QAChE,6CAA6C;QAC7C,EAAE;QACF,4DAA4D;QAC5D,gBAAgB;QAChB,+DAA+D;QAC/D,+DAA+D;QAC/D,oDAAoD;QACpD,sDAAsD;QACtD,+DAA+D;QAC/D,0DAA0D;QAC1D,4DAA4D;QAC5D,+BAA+B;QAC/B,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE;QAC/E,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE;QACnF,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE;QAEpF,iEAAiE;QAEjE,yDAAyD;QACzD,+DAA+D;QAC/D,0DAA0D;QAC1D,+DAA+D;QAC/D,6DAA6D;QAC7D,yDAAyD;QACzD,8DAA8D;QAC9D,gBAAgB;QAChB,EAAE;QACF,sEAAsE;QACtE,qEAAqE;QACrE,2EAA2E;QAC3E,qEAAqE;QACrE,gEAAgE;QAChE,yEAAyE;QACzE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE;QAC/E,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE;QAElF,0EAA0E;QAC1E,wEAAwE;QACxE,0EAA0E;QAC1E,mDAAmD;QACnD,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE;QACrE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE;QAEvE,wEAAwE;QACxE,0EAA0E;QAC1E,0EAA0E;QAC1E,gCAAgC;QAChC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE;QAC/E,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE;QAEnF,+DAA+D;QAC/D,+DAA+D;QAC/D,oDAAoD;QACpD,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE;QAC5D,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,6BAA6B,EAAE;QAE5D,gEAAgE;QAChE,2DAA2D;QAC3D,+DAA+D;QAC/D,+DAA+D;QAC/D,oDAAoD;QACpD,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE;QACpC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE;QAClE,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,qBAAqB,EAAE;QAEpD,4DAA4D;QAC5D,6DAA6D;QAC7D,6DAA6D;QAC7D,8DAA8D;QAC9D,8DAA8D;QAC9D,EAAE;QACF,8DAA8D;QAC9D,6DAA6D;QAC7D,8DAA8D;QAC9D,0DAA0D;QAC1D,6DAA6D;QAC7D,uDAAuD;QACvD,4DAA4D;QAC5D,iCAAiC;KAClC,CAAC;IAEF,OAAO;QACL,IAAI,EAAE,cAAc,MAAM,CAAC,IAAI,EAAE;QACjC,KAAK;KACN,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,MAAkB,EAAE,IAAY;IACjD,OAAO,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,EAAE,CAAC;AAC5D,CAAC"}
1
+ {"version":3,"file":"queue.js","sourceRoot":"","sources":["../../../src/validation/scenarios/queue.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import { type Stage2Scenario } from "./stage2.js";
1
+ import { type Stage2Result, type Stage2Scenario } from "./stage2.js";
2
2
  import { type Layer3Criterion } from "./layer3.js";
3
- import { type MobileClient } from "../mobile.js";
3
+ import { type MobileClient, type ScreenElement } from "../mobile.js";
4
4
  import type { Stage2PlatformReport } from "../agents/types.js";
5
5
  export type Stage2VisualInput = {
6
6
  iosScenario?: Stage2Scenario;
@@ -19,5 +19,7 @@ export type Stage2VisualResult = {
19
19
  };
20
20
  export declare const DEFAULT_STAGE2_RUBRIC: readonly Layer3Criterion[];
21
21
  export declare function runStage2Visual(input: Stage2VisualInput): Promise<Stage2VisualResult>;
22
+ export declare function nonEnglishUiError(client: MobileClient, platform: "ios" | "android", scenario: Stage2Result): Promise<string | undefined>;
23
+ export declare function nonLatinText(elements: readonly ScreenElement[]): string | undefined;
22
24
  export declare function selectDevice(client: MobileClient, platform: "ios" | "android"): Promise<string | undefined>;
23
25
  //# sourceMappingURL=stage2-judge.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"stage2-judge.d.ts","sourceRoot":"","sources":["../../src/validation/stage2-judge.ts"],"names":[],"mappings":"AAGA,OAAO,EAAgE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAChH,OAAO,EAAa,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9D,OAAO,EAAsB,KAAK,YAAY,EAAsB,MAAM,cAAc,CAAC;AACzF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAsB/D,MAAM,MAAM,iBAAiB,GAAG;IAI9B,WAAW,CAAC,EAAE,cAAc,CAAC;IAC7B,eAAe,CAAC,EAAE,cAAc,CAAC;IACjC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IAKpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IAGtB,SAAS,CAAC,EAAE,YAAY,CAAC;IACzB,aAAa,CAAC,EAAE,YAAY,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,GAAG,CAAC,EAAE,oBAAoB,CAAC;IAC3B,OAAO,CAAC,EAAE,oBAAoB,CAAC;CAChC,CAAC;AAMF,eAAO,MAAM,qBAAqB,EAAE,SAAS,eAAe,EAU3D,CAAC;AAEF,wBAAsB,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA6B3F;AA4GD,wBAAsB,YAAY,CAChC,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,KAAK,GAAG,SAAS,GAC1B,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAoD7B"}
1
+ {"version":3,"file":"stage2-judge.d.ts","sourceRoot":"","sources":["../../src/validation/stage2-judge.ts"],"names":[],"mappings":"AAGA,OAAO,EAA6C,KAAK,YAAY,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAChH,OAAO,EAAa,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9D,OAAO,EAAsB,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AACzF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAwB/D,MAAM,MAAM,iBAAiB,GAAG;IAI9B,WAAW,CAAC,EAAE,cAAc,CAAC;IAC7B,eAAe,CAAC,EAAE,cAAc,CAAC;IACjC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IAKpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IAGtB,SAAS,CAAC,EAAE,YAAY,CAAC;IACzB,aAAa,CAAC,EAAE,YAAY,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,GAAG,CAAC,EAAE,oBAAoB,CAAC;IAC3B,OAAO,CAAC,EAAE,oBAAoB,CAAC;CAChC,CAAC;AAMF,eAAO,MAAM,qBAAqB,EAAE,SAAS,eAAe,EAU3D,CAAC;AAEF,wBAAsB,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA6B3F;AA4GD,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,KAAK,GAAG,SAAS,EAC3B,QAAQ,EAAE,YAAY,GACrB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAgB7B;AAKD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,SAAS,aAAa,EAAE,GAAG,MAAM,GAAG,SAAS,CAQnF;AA0CD,wBAAsB,YAAY,CAChC,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,KAAK,GAAG,SAAS,GAC1B,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAoD7B"}
@@ -5,6 +5,8 @@ import { runStage2Scenario, recoverFromErrorScreen } from "./stage2.js";
5
5
  import { runLayer3 } from "./layer3.js";
6
6
  import { NO_SUBSTRATE_LEAK_QUESTION } from "./visual-judge.js";
7
7
  import { createMobileClient } from "../mobile.js";
8
+ import { trace } from "../trace.js";
9
+ import { APP_UNDER_TEST_LOCALE } from "./launch.js";
8
10
  // Stage 2 rubric — domain content (because we've now navigated to the
9
11
  // list/detail view past auth) plus a defensive substrate-leak check.
10
12
  // Stage 1's "renders cleanly" criterion is intentionally not repeated;
@@ -91,15 +93,16 @@ async function runOnePlatform(args) {
91
93
  // surface a clear error if the app still isn't up.
92
94
  if (args.appId) {
93
95
  try {
94
- await client.launchApp(args.appId);
95
- await sleep(2_000); // let it come to front + render before the first poll
96
+ await foregroundApp(client, args.platform, args.appId);
96
97
  // If the launch hit the intermittent "Something went wrong" error
97
98
  // screen, tap "Back to Start Screen" (logs out → welcome) before walking.
98
99
  if (await recoverFromErrorScreen(client))
99
100
  await sleep(1_500);
100
101
  }
101
- catch {
102
- // ignore — scenario steps below report if the app isn't foregrounded
102
+ catch (err) {
103
+ // Don't abort — the scenario's polling reports if the app isn't
104
+ // foregrounded — but leave the cause in the trace.
105
+ trace("judge", `Stage 2 ${args.platform}: foreground ${args.appId} failed: ${errorText(err)}`);
103
106
  }
104
107
  }
105
108
  const scenario = await runStage2Scenario({
@@ -108,6 +111,9 @@ async function runOnePlatform(args) {
108
111
  screenshotDir: args.screenshotDir,
109
112
  });
110
113
  const baseReport = toBaseReport(scenario);
114
+ const localized = await nonEnglishUiError(client, args.platform, scenario);
115
+ if (localized !== undefined)
116
+ baseReport.error = localized;
111
117
  // Run Layer 3 on the LAST captured screenshot even if a later
112
118
  // scenario step failed — a partial walk that reached the domain
113
119
  // content is still worth scoring. Stage2PlatformReport.pass
@@ -134,6 +140,75 @@ async function runOnePlatform(args) {
134
140
  await client.close();
135
141
  }
136
142
  }
143
+ // A text step that fails on a screen showing non-Latin text (e.g. "Orange
144
+ // Baton へようこそ") is the device language, not the app: say so instead of
145
+ // leaving an opaque wait_for_text error (#159). Only scripts other than Latin
146
+ // are detected — a French or German UI still reads as a plain step failure.
147
+ export async function nonEnglishUiError(client, platform, scenario) {
148
+ const failed = scenario.steps.find((s) => !s.ok);
149
+ if (!failed || (failed.step.kind !== "wait_for_text" && failed.step.kind !== "tap_text"))
150
+ return undefined;
151
+ let elements;
152
+ try {
153
+ elements = await client.listElements();
154
+ }
155
+ catch {
156
+ return undefined;
157
+ }
158
+ const sample = nonLatinText(elements);
159
+ if (sample === undefined)
160
+ return undefined;
161
+ const device = platform === "ios" ? "simulator" : "emulator";
162
+ const how = platform === "ios"
163
+ ? "-AppleLanguages (en)"
164
+ : `per-app locale ${APP_UNDER_TEST_LOCALE}, which needs Android 13+`;
165
+ return `environment: the app's UI is not in English (the screen shows "${sample}") although the agent launched it in English (${how}); the Stage 2 scenario walks English text. Set the ${device}'s language to English and re-run. (${failed.error ?? "step failed"})`;
166
+ }
167
+ const NON_LATIN_LETTER = /(?=\p{L})[^\p{Script=Latin}]/u;
168
+ const TEXT_KEYS = ["label", "text", "name", "value", "title"];
169
+ export function nonLatinText(elements) {
170
+ for (const el of elements) {
171
+ for (const key of TEXT_KEYS) {
172
+ const v = el[key];
173
+ if (typeof v === "string" && NON_LATIN_LETTER.test(v))
174
+ return v.length > 60 ? `${v.slice(0, 57)}...` : v;
175
+ }
176
+ }
177
+ return undefined;
178
+ }
179
+ // Launches the app and checks it actually came to front. Observed on iOS:
180
+ // Stage 2 step 0 still saw the springboard (17 "Icon" elements) after the
181
+ // launch, with nothing recorded about why. So: retry once if the launch
182
+ // throws or the screen still looks like the springboard, and trace what
183
+ // was seen so the next failure is diagnosable.
184
+ async function foregroundApp(client, platform, appId) {
185
+ for (let attempt = 1; attempt <= 2; attempt++) {
186
+ try {
187
+ // English, like Stage 1's launch — this also covers the relaunch retry
188
+ // when the first launch left the springboard up.
189
+ await client.launchApp(appId, APP_UNDER_TEST_LOCALE);
190
+ }
191
+ catch (err) {
192
+ trace("judge", `Stage 2 ${platform}: launch ${appId} (attempt ${attempt}) threw: ${errorText(err)}`);
193
+ if (attempt === 2)
194
+ throw err;
195
+ await sleep(2_000);
196
+ continue;
197
+ }
198
+ await sleep(2_000); // let it come to front + render before the first poll
199
+ const elements = await client.listElements();
200
+ if (!looksLikeHomeScreen(elements))
201
+ return;
202
+ trace("judge", `Stage 2 ${platform}: still on the home screen after launch attempt ${attempt} (${elements.length} elements)`);
203
+ }
204
+ }
205
+ // The iOS springboard lists app icons as type "Icon"; no app screen does.
206
+ function looksLikeHomeScreen(elements) {
207
+ return elements.some((el) => el.type === "Icon");
208
+ }
209
+ function errorText(err) {
210
+ return err instanceof Error ? err.message : String(err);
211
+ }
137
212
  // Picks the mobile-mcp device for a platform and sets it as active on
138
213
  // the wrapper. Returns undefined on success, an error string on
139
214
  // failure. Heuristic: filter listDevices() by platform field if
@@ -1 +1 @@
1
- {"version":3,"file":"stage2-judge.js","sourceRoot":"","sources":["../../src/validation/stage2-judge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stage2-judge.js","sourceRoot":"","sources":["../../src/validation/stage2-judge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { JudgeResult, Platform, StepResult } from "../agents/types.js";
2
+ export type TestSuiteOptions = {
3
+ useMise?: boolean;
4
+ env?: NodeJS.ProcessEnv;
5
+ };
6
+ export declare function testsEnabled(): boolean;
7
+ export declare function runTestSuite(platform: Platform, outDir: string, options?: TestSuiteOptions): Promise<StepResult>;
8
+ export declare function extractSummary(output: string): string | undefined;
9
+ export declare function applyTestResults(judge: JudgeResult, results: Partial<Record<Platform, StepResult>>): JudgeResult;
10
+ //# sourceMappingURL=test-suites.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-suites.d.ts","sourceRoot":"","sources":["../../src/validation/test-suites.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAiB5E,MAAM,MAAM,gBAAgB,GAAG;IAE7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB,CAAC;AAEF,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED,wBAAsB,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,UAAU,CAAC,CAM1H;AAsDD,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CASjE;AAkCD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,GAAG,WAAW,CAahH"}
@@ -0,0 +1,135 @@
1
+ import { access, readdir } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { iosSimulatorDestination } from "./ios-destination.js";
4
+ import { commandAvailable, runStep, tailLines, withMisePrefix } from "./run-step.js";
5
+ import { testsFromEnv } from "../run-options.js";
6
+ // SPEC §4 Operation 3: the generated apps' own test suites must pass. Layer 2
7
+ // only builds, and the suites take minutes (Rails ~650 tests, iOS ~1,100,
8
+ // Android ~900 on the paid substrates), so they run only when
9
+ // NATIVEAPPTEMPLATE_TESTS=1. A rename can break a test without breaking the
10
+ // build (#150: the iOS substrate's "unknown type" example became a real type).
11
+ const RAILS_TEST_TIMEOUT_MS = 1_800_000;
12
+ const IOS_TEST_TIMEOUT_MS = 2_700_000;
13
+ const ANDROID_TEST_TIMEOUT_MS = 1_800_000;
14
+ const DB_PREPARE_TIMEOUT_MS = 300_000;
15
+ const OUTPUT_TAIL_LINES = 60;
16
+ export function testsEnabled() {
17
+ return testsFromEnv();
18
+ }
19
+ export async function runTestSuite(platform, outDir, options = {}) {
20
+ switch (platform) {
21
+ case "rails": return runRailsTests(outDir, options);
22
+ case "ios": return runIosTests(outDir, options);
23
+ case "android": return runAndroidTests(outDir, options);
24
+ }
25
+ }
26
+ async function runRailsTests(outDir, options) {
27
+ if (!(await exists(join(outDir, "bin", "rails"))))
28
+ return skipped("bin/rails test", "no bin/rails in the generated app");
29
+ const useMise = options.useMise ?? (await commandAvailable("mise", options.env));
30
+ const env = options.env ? { env: options.env } : {};
31
+ // The generated app's own <slug>_api_test database; Layer 2's db:prepare
32
+ // only sets up development.
33
+ const prepare = await runStep(outDir, ["bin/rails", "db:test:prepare"], { timeoutMs: DB_PREPARE_TIMEOUT_MS, useMise, ...env });
34
+ if (prepare.exitCode !== 0) {
35
+ return fromRun(withMisePrefix("bin/rails db:test:prepare", useMise), prepare, "tests not run: db:test:prepare failed");
36
+ }
37
+ const run = await runStep(outDir, ["bin/rails", "test"], { timeoutMs: RAILS_TEST_TIMEOUT_MS, useMise, ...env });
38
+ return fromRun(withMisePrefix("bin/rails test", useMise), run);
39
+ }
40
+ async function runIosTests(outDir, options) {
41
+ let entries = [];
42
+ try {
43
+ entries = await readdir(outDir);
44
+ }
45
+ catch { /* reported below */ }
46
+ const xcodeproj = entries.find((e) => e.endsWith(".xcodeproj"));
47
+ if (!xcodeproj)
48
+ return skipped("xcodebuild test", `no .xcodeproj in ${outDir}`);
49
+ const scheme = xcodeproj.slice(0, -".xcodeproj".length);
50
+ // Same project, scheme, destination and configuration as Layer 2's build,
51
+ // so xcodebuild reuses that build.
52
+ const args = ["xcodebuild", "-project", xcodeproj, "-scheme", scheme, "-destination", iosSimulatorDestination(), "-configuration", "Debug", "test"];
53
+ const run = await runStep(outDir, args, { timeoutMs: IOS_TEST_TIMEOUT_MS, ...(options.env ? { env: options.env } : {}) });
54
+ return fromRun(`xcodebuild test -scheme ${scheme}`, run);
55
+ }
56
+ async function runAndroidTests(outDir, options) {
57
+ if (!(await exists(join(outDir, "gradlew"))))
58
+ return skipped("./gradlew testDebugUnitTest", "no ./gradlew wrapper in the generated app");
59
+ const run = await runStep(outDir, ["./gradlew", "testDebugUnitTest", "--no-daemon"], {
60
+ timeoutMs: ANDROID_TEST_TIMEOUT_MS,
61
+ ...(options.env ? { env: options.env } : {}),
62
+ });
63
+ return fromRun("./gradlew testDebugUnitTest", run);
64
+ }
65
+ // The last line each runner prints about the whole run:
66
+ // Minitest: "643 runs, 2108 assertions, 0 failures, 0 errors, 0 skips"
67
+ // XCTest: "Executed 1117 tests, with 1 failure (0 unexpected) in ..."
68
+ // Swift Testing: "✘ Test run with 1117 tests in 85 suites failed after ..."
69
+ // xcodebuild: "** TEST SUCCEEDED **" / "** TEST FAILED **"
70
+ // Gradle: "BUILD SUCCESSFUL in 1m 2s" / "BUILD FAILED in 40s",
71
+ // "888 tests completed, 1 failed"
72
+ const SUMMARY_PATTERNS = [
73
+ /^\d+ runs, \d+ assertions, \d+ failures, \d+ errors, \d+ skips$/,
74
+ /Executed \d+ tests?, with \d+ failures?.*$/,
75
+ /Test run with \d+ tests?.*$/,
76
+ /^\d+ tests completed, \d+ failed.*$/,
77
+ /^\*\* TEST (SUCCEEDED|FAILED) \*\*$/,
78
+ /^BUILD (SUCCESSFUL|FAILED) in .*$/,
79
+ ];
80
+ export function extractSummary(output) {
81
+ const lines = output.split("\n").map((l) => l.trim()).filter(Boolean);
82
+ for (const pattern of SUMMARY_PATTERNS) {
83
+ for (let i = lines.length - 1; i >= 0; i--) {
84
+ const m = lines[i].match(pattern);
85
+ if (m)
86
+ return m[0];
87
+ }
88
+ }
89
+ return undefined;
90
+ }
91
+ function fromRun(command, run, failNote) {
92
+ const pass = run.exitCode === 0;
93
+ const tail = tailLines(run.output, OUTPUT_TAIL_LINES);
94
+ const summary = extractSummary(run.output);
95
+ return {
96
+ status: pass ? "pass" : "fail",
97
+ command,
98
+ exitCode: run.exitCode,
99
+ durationMs: run.durationMs,
100
+ ...(tail ? { outputTail: tail } : {}),
101
+ ...(summary ? { summary } : {}),
102
+ ...(!pass && failNote ? { note: failNote } : {}),
103
+ ...(!pass && !failNote && run.timedOut ? { note: "timed out" } : {}),
104
+ };
105
+ }
106
+ function skipped(command, note) {
107
+ return { status: "skipped", command, exitCode: null, durationMs: 0, note };
108
+ }
109
+ async function exists(path) {
110
+ try {
111
+ await access(path);
112
+ return true;
113
+ }
114
+ catch {
115
+ return false;
116
+ }
117
+ }
118
+ // Fold suite results into the judge result: each platform carries its
119
+ // `tests`, and an opted-in suite that fails fails the run (SPEC §4
120
+ // Operation 3). Skipped suites are shown but don't count.
121
+ export function applyTestResults(judge, results) {
122
+ const platforms = (judge.platforms ?? []).map((p) => {
123
+ const tests = results[p.platform];
124
+ return tests ? { ...p, tests } : p;
125
+ });
126
+ const ran = platforms.filter((p) => p.tests && p.tests.status !== "skipped");
127
+ const passed = ran.filter((p) => p.tests.status === "pass").length;
128
+ return {
129
+ ...judge,
130
+ overallPass: judge.overallPass && passed === ran.length,
131
+ summary: `${judge.summary} · tests ${passed}/${ran.length} pass`,
132
+ platforms,
133
+ };
134
+ }
135
+ //# sourceMappingURL=test-suites.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-suites.js","sourceRoot":"","sources":["../../src/validation/test-suites.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nativeapptemplate-agent",
3
- "version": "0.3.1",
3
+ "version": "0.4.0",
4
4
  "description": "A Claude Code agent that turns a natural-language SaaS spec into a working three-platform implementation (Rails API + SwiftUI iOS + Jetpack Compose Android).",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -3,6 +3,9 @@
3
3
  # Apply a rename plan to a Rails project tree.
4
4
  # Stdin: { "renamePlan": [{"from":"Shop","to":"Clinic"}, ...],
5
5
  # "japaneseRenamePlan": [{"from":"店舗","to":"医院"}, ...], (optional)
6
+ # "appDomain": {"domain":"orangebaton.app", (optional)
7
+ # "bundleIdPrefix":"app.orangebaton",
8
+ # "androidPackagePrefix":"app.orangebaton"},
6
9
  # "root": "/abs/path" }
7
10
  # Stdout: { "files_scanned": N, "files_changed": N, "substitutions": N, "files_renamed": N }
8
11
  #
@@ -15,10 +18,12 @@
15
18
  # them from their (un-renamed) sources, e.g. Turbo's VisitState.completed.
16
19
 
17
20
  require "json"
21
+ require "fileutils"
18
22
 
19
23
  input = JSON.parse($stdin.read)
20
24
  plan = input.fetch("renamePlan")
21
25
  japanese_plan = input.fetch("japaneseRenamePlan", [])
26
+ app_domain = input["appDomain"]
22
27
  root = input.fetch("root")
23
28
 
24
29
  stats = { files_scanned: 0, files_changed: 0, substitutions: 0, files_renamed: 0 }
@@ -187,7 +192,32 @@ japanese_patterns = japanese_plan
187
192
  .sort_by { |p| -p.fetch("from").length }
188
193
  .map { |p| [/#{Regexp.escape(p.fetch("from"))}/, p.fetch("to")] }
189
194
 
190
- all_patterns = japanese_patterns + plan.flat_map { |p| build_patterns(p.fetch("from"), p.fetch("to")) }
195
+ # The template's domain and reverse-DNS prefix, when the app has a domain of
196
+ # its own (src/app-domain.ts). Matched whole before any product-name pattern
197
+ # can reach the `nativeapptemplate` inside them; the single-pass substitution
198
+ # below then renames what follows the prefix
199
+ # (com.nativeapptemplate.NativeAppTemplate.ios -> app.orangebaton.OrangeBaton.ios)
200
+ # and never re-scans the replaced text. The Android package (the lowercase
201
+ # product after the prefix, also in google-services.json and the API's FCM
202
+ # test) takes the Java-safe prefix; every other com.nativeapptemplate (iOS
203
+ # bundle IDs, keychain services, log subsystems) the plain reverse domain. Without appDomain these are absent and
204
+ # the flat product rule turns both into <flat product>.com / com.<flat product>.
205
+ def domain_patterns(app_domain)
206
+ return [] unless app_domain
207
+
208
+ domain = app_domain.fetch("domain")
209
+ bundle = app_domain.fetch("bundleIdPrefix")
210
+ package = app_domain.fetch("androidPackagePrefix")
211
+ android_product = "nativeapptemplate[a-z0-9]*(?![A-Za-z0-9_])"
212
+ [
213
+ [/(?<![A-Za-z0-9_-])nativeapptemplate\.com(?![A-Za-z0-9_-]|\.[A-Za-z0-9])/, domain],
214
+ [/(?<![A-Za-z0-9_.-])com\.nativeapptemplate(?=\.#{android_product})/, package],
215
+ [/(?<![A-Za-z0-9_-])com\/nativeapptemplate(?=\/#{android_product})/, package.tr(".", "/")],
216
+ [/(?<![A-Za-z0-9_.-])com\.nativeapptemplate(?![A-Za-z0-9_-])/, bundle],
217
+ ]
218
+ end
219
+
220
+ all_patterns = domain_patterns(app_domain) + japanese_patterns + plan.flat_map { |p| build_patterns(p.fetch("from"), p.fetch("to")) }
191
221
 
192
222
  # One combined regex, applied in a single pass, so a replacement is never
193
223
  # re-scanned by a later pair: with NativeAppTemplate→PetShop and Shop→Store,
@@ -207,6 +237,37 @@ def rename_all(text)
207
237
  [result, count]
208
238
  end
209
239
 
240
+ # References to the template's own GitHub repos and the agent's name are left
241
+ # byte-for-byte as they are: renamed, they become dead links
242
+ # (github.com/orangebaton/OrangeBaton-iOS) and a tool that doesn't exist
243
+ # (orangebaton-agent). They are masked with placeholders before the
244
+ # substitution and restored after it, so nothing inside them is renamed: not
245
+ # the product name, nor a Shop / ItemTag token in a URL path. The product's
246
+ # domains and emails (nativeapptemplate.com) are not protected; they become
247
+ # the app's own. Mirrored in src/validation/protected-references.ts, which
248
+ # keeps Layer 1 from flagging what is left here.
249
+ PROTECTED_REFERENCE = %r{
250
+ github\.com[/:]nativeapptemplate(?![A-Za-z0-9_-])(?:/[^\s)\]"'<>`]*)?
251
+ |
252
+ (?<![A-Za-z0-9_-])nativeapptemplate-agent(?:-mcp)?(?![A-Za-z0-9_])
253
+ }x
254
+ MASK_OPEN = "\u{E000}"
255
+ MASK_CLOSE = "\u{E001}"
256
+ MASK = /#{MASK_OPEN}(\d+)#{MASK_CLOSE}/
257
+
258
+ def rename_content(text)
259
+ # A file that already holds the sentinel can't be masked unambiguously.
260
+ return rename_all(text) if text.include?(MASK_OPEN)
261
+
262
+ spans = []
263
+ masked = text.gsub(PROTECTED_REFERENCE) do
264
+ spans << Regexp.last_match(0)
265
+ "#{MASK_OPEN}#{spans.length - 1}#{MASK_CLOSE}"
266
+ end
267
+ result, count = rename_all(masked)
268
+ [result.gsub(MASK) { spans[Regexp.last_match(1).to_i] }, count]
269
+ end
270
+
210
271
  def skip?(path, root)
211
272
  # Compare against the path RELATIVE to the project root, not the absolute
212
273
  # path. Otherwise SKIP_DIR_SEGMENTS like "tmp" / "log" / "build" silently
@@ -245,7 +306,7 @@ Dir.glob("#{root}/**/*", File::FNM_DOTMATCH).each do |path|
245
306
  next
246
307
  end
247
308
 
248
- content, local_subst = rename_all(original)
309
+ content, local_subst = rename_content(original)
249
310
  next if content == original
250
311
 
251
312
  File.write(path, content)
@@ -253,10 +314,44 @@ Dir.glob("#{root}/**/*", File::FNM_DOTMATCH).each do |path|
253
314
  stats[:substitutions] += local_subst
254
315
  end
255
316
 
317
+ # Pass 1.5 — move the Android package directories (<source root>/com/
318
+ # nativeapptemplate/nativeapptemplate) under the app's package prefix
319
+ # (app/orangebaton/nativeapptemplate; Pass 2 then renames the last segment).
320
+ # The directories made for the prefix are pinned so Pass 2 leaves them as they
321
+ # are even when a domain label happens to be a rename token (shop.example).
322
+ pinned = {}
323
+ if app_domain
324
+ package_dirs = app_domain.fetch("androidPackagePrefix").split(".")
325
+ Dir.glob("#{root}/**/com/nativeapptemplate", File::FNM_DOTMATCH).sort.each do |template_dir|
326
+ next if skip?(template_dir, root)
327
+ next unless File.directory?(template_dir) && !File.symlink?(template_dir)
328
+ next unless Dir.children(template_dir).any? { |c| c.match?(/\Anativeapptemplate[a-z0-9]*\z/) }
329
+
330
+ source_root = File.dirname(File.dirname(template_dir))
331
+ target = File.join(source_root, *package_dirs)
332
+ if File.exist?(target)
333
+ warn "rename.rb: not moving #{template_dir}: #{target} already exists"
334
+ next
335
+ end
336
+ FileUtils.mkdir_p(File.dirname(target))
337
+ File.rename(template_dir, target)
338
+ stats[:files_renamed] += 1
339
+ com_dir = File.dirname(template_dir)
340
+ # Finder's .DS_Store alone doesn't keep the template's com/ directory.
341
+ leftovers = Dir.children(com_dir)
342
+ if leftovers.all? { |c| c == ".DS_Store" }
343
+ leftovers.each { |c| File.delete(File.join(com_dir, c)) }
344
+ Dir.rmdir(com_dir)
345
+ end
346
+ package_dirs.each_index { |i| pinned[File.join(source_root, *package_dirs[0..i])] = true }
347
+ end
348
+ end
349
+
256
350
  # Pass 2 — rename paths. Deepest-first so renaming a parent directory
257
351
  # doesn't invalidate paths we haven't visited yet.
258
352
  Dir.glob("#{root}/**/*", File::FNM_DOTMATCH).sort_by { |p| -p.length }.each do |path|
259
353
  next if skip?(path, root)
354
+ next if pinned[path]
260
355
  next unless File.exist?(path)
261
356
 
262
357
  old_name = File.basename(path)