@mozole/cli 1.4.2 → 1.4.3

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 (75) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +25 -2
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +49 -22
  5. package/dist/cli.js.map +1 -1
  6. package/dist/commands/adopt.d.ts +2 -0
  7. package/dist/commands/adopt.d.ts.map +1 -1
  8. package/dist/commands/adopt.js +53 -16
  9. package/dist/commands/adopt.js.map +1 -1
  10. package/dist/commands/logs.d.ts.map +1 -1
  11. package/dist/commands/logs.js +2 -1
  12. package/dist/commands/logs.js.map +1 -1
  13. package/dist/commands/new.d.ts.map +1 -1
  14. package/dist/commands/new.js +63 -15
  15. package/dist/commands/new.js.map +1 -1
  16. package/dist/commands/template.d.ts +8 -0
  17. package/dist/commands/template.d.ts.map +1 -0
  18. package/dist/commands/template.js +392 -0
  19. package/dist/commands/template.js.map +1 -0
  20. package/dist/commands/ui.d.ts +5 -0
  21. package/dist/commands/ui.d.ts.map +1 -1
  22. package/dist/commands/ui.js +159 -9
  23. package/dist/commands/ui.js.map +1 -1
  24. package/dist/config/project.d.ts +3 -0
  25. package/dist/config/project.d.ts.map +1 -1
  26. package/dist/config/project.js +21 -2
  27. package/dist/config/project.js.map +1 -1
  28. package/dist/governor/fingerprint.d.ts.map +1 -1
  29. package/dist/governor/fingerprint.js +19 -28
  30. package/dist/governor/fingerprint.js.map +1 -1
  31. package/dist/output-safety.d.ts +3 -0
  32. package/dist/output-safety.d.ts.map +1 -0
  33. package/dist/output-safety.js +44 -0
  34. package/dist/output-safety.js.map +1 -0
  35. package/dist/platform/process.d.ts +2 -0
  36. package/dist/platform/process.d.ts.map +1 -1
  37. package/dist/platform/process.js +16 -6
  38. package/dist/platform/process.js.map +1 -1
  39. package/dist/qa/artifacts.d.ts +3 -0
  40. package/dist/qa/artifacts.d.ts.map +1 -0
  41. package/dist/qa/artifacts.js +15 -0
  42. package/dist/qa/artifacts.js.map +1 -0
  43. package/dist/qa/diff.d.ts.map +1 -1
  44. package/dist/qa/diff.js +0 -1
  45. package/dist/qa/diff.js.map +1 -1
  46. package/dist/qa/runner.d.ts +3 -2
  47. package/dist/qa/runner.d.ts.map +1 -1
  48. package/dist/qa/runner.js +12 -16
  49. package/dist/qa/runner.js.map +1 -1
  50. package/dist/qa/server.d.ts.map +1 -1
  51. package/dist/qa/server.js +7 -7
  52. package/dist/qa/server.js.map +1 -1
  53. package/dist/scaffold/standalone.d.ts +1 -1
  54. package/dist/scaffold/standalone.d.ts.map +1 -1
  55. package/dist/scaffold/standalone.js +82 -2
  56. package/dist/scaffold/standalone.js.map +1 -1
  57. package/dist/scaffold/templates.d.ts +1 -0
  58. package/dist/scaffold/templates.d.ts.map +1 -1
  59. package/dist/scaffold/templates.js +6 -1
  60. package/dist/scaffold/templates.js.map +1 -1
  61. package/dist/template/servers.d.ts +21 -0
  62. package/dist/template/servers.d.ts.map +1 -0
  63. package/dist/template/servers.js +193 -0
  64. package/dist/template/servers.js.map +1 -0
  65. package/dist/template/workspace.d.ts +23 -0
  66. package/dist/template/workspace.d.ts.map +1 -0
  67. package/dist/template/workspace.js +152 -0
  68. package/dist/template/workspace.js.map +1 -0
  69. package/dist/verify/runner.d.ts +2 -1
  70. package/dist/verify/runner.d.ts.map +1 -1
  71. package/dist/verify/runner.js +2 -2
  72. package/dist/verify/runner.js.map +1 -1
  73. package/dist/version.d.ts +2 -2
  74. package/dist/version.js +1 -1
  75. package/package.json +1 -1
@@ -1,6 +1,16 @@
1
1
  import { spawn } from "node:child_process";
2
2
  import { mkdir, rename, writeFile } from "node:fs/promises";
3
3
  import path from "node:path";
4
+ import { sanitizeTerminalText } from "../output-safety.js";
5
+ export const MAX_CAPTURE_CHARS = 1_000_000;
6
+ export function appendBoundedOutput(current, chunk, limit = MAX_CAPTURE_CHARS) {
7
+ const combined = current + sanitizeTerminalText(chunk);
8
+ if (combined.length <= limit)
9
+ return combined;
10
+ const marker = "[... truncated ...]\n";
11
+ const prefix = marker.slice(0, Math.min(marker.length, Math.floor(limit / 2)));
12
+ return prefix + combined.slice(-(limit - prefix.length));
13
+ }
4
14
  import { resolveExecutableSync } from "./executable.js";
5
15
  const windowsMeta = /([()%!^"<>&|;, *?])/g;
6
16
  function escapeWindowsCommand(command) {
@@ -46,12 +56,12 @@ export async function run(command, args, options) {
46
56
  let spawnFailed = false;
47
57
  let stdout = "";
48
58
  let stderr = "";
49
- child.stdout
50
- .setEncoding("utf8")
51
- .on("data", (chunk) => (stdout += chunk));
52
- child.stderr
53
- .setEncoding("utf8")
54
- .on("data", (chunk) => (stderr += chunk));
59
+ child.stdout.setEncoding("utf8").on("data", (chunk) => {
60
+ stdout = appendBoundedOutput(stdout, chunk);
61
+ });
62
+ child.stderr.setEncoding("utf8").on("data", (chunk) => {
63
+ stderr = appendBoundedOutput(stderr, chunk);
64
+ });
55
65
  let forceTimer;
56
66
  const stop = () => {
57
67
  terminateProcess(child.pid);
@@ -1 +1 @@
1
- {"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/platform/process.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/platform/process.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function visualArtifactSlug(route: string): string;
2
+ export declare function visualArtifactKey(route: string): string;
3
+ //# sourceMappingURL=artifacts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifacts.d.ts","sourceRoot":"","sources":["../../src/qa/artifacts.ts"],"names":[],"mappings":"AAAA,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CASxD;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEvD"}
@@ -0,0 +1,15 @@
1
+ export function visualArtifactSlug(route) {
2
+ if (route === "/")
3
+ return "index";
4
+ const slug = route
5
+ .replace(/^\/+/, "")
6
+ .replaceAll("/", "-")
7
+ .replace(/[^a-zA-Z0-9._-]+/g, "-")
8
+ .replace(/-+/g, "-")
9
+ .replace(/^-+|-+$/g, "");
10
+ return slug || "route";
11
+ }
12
+ export function visualArtifactKey(route) {
13
+ return visualArtifactSlug(route);
14
+ }
15
+ //# sourceMappingURL=artifacts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../../src/qa/artifacts.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,IAAI,KAAK,KAAK,GAAG;QAAE,OAAO,OAAO,CAAC;IAClC,MAAM,IAAI,GAAG,KAAK;SACf,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;SACnB,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC;SACpB,OAAO,CAAC,mBAAmB,EAAE,GAAG,CAAC;SACjC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC3B,OAAO,IAAI,IAAI,OAAO,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/qa/diff.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B;AAqBD,wBAAsB,qBAAqB,CACzC,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,kBAAkB,CAAC,CA0E7B"}
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/qa/diff.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B;AAqBD,wBAAsB,qBAAqB,CACzC,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,kBAAkB,CAAC,CAyE7B"}
package/dist/qa/diff.js CHANGED
@@ -74,7 +74,6 @@ export async function compareVisualArtifact(baselinePath, actualBuffer, threshol
74
74
  }
75
75
  const ratio = totalPixels === 0 ? 0 : changedPixels / totalPixels;
76
76
  const exceeded = ratio > threshold;
77
- await writeFile(baselinePath, actualBuffer);
78
77
  if (exceeded)
79
78
  await writeFile(diffPath, PNG.sync.write(diff));
80
79
  else
@@ -1 +1 @@
1
- {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/qa/diff.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/qa/diff.ts"],"names":[],"mappings":"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"}
@@ -11,7 +11,7 @@ export interface VisualDiff {
11
11
  ratio: number;
12
12
  changedPixels: number;
13
13
  totalPixels: number;
14
- diffPath: string;
14
+ diffPath?: string | undefined;
15
15
  }
16
16
  export declare function formatVisualDiff(diff: VisualDiff): string;
17
17
  export interface QaSummary {
@@ -32,6 +32,7 @@ export interface QaMode {
32
32
  visual: boolean;
33
33
  diff?: boolean | undefined;
34
34
  }
35
- export declare function visualArtifactSlug(route: string): string;
35
+ export declare function qaResultPassed(issues: readonly QaIssue[], visualDiffs: readonly VisualDiff[]): boolean;
36
+ export { visualArtifactSlug } from "./artifacts.js";
36
37
  export declare function runQa(root: string, config: MozoleConfig, mode: QaMode, signal?: AbortSignal): Promise<QaSummary>;
37
38
  //# sourceMappingURL=runner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/qa/runner.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAY,MAAM,sBAAsB,CAAC;AAKnE,MAAM,WAAW,OAAO;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AACD,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AACD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAGzD;AACD,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;CAChB;AACD,MAAM,WAAW,MAAM;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC5B;AAKD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CASxD;AA2ND,wBAAsB,KAAK,CACzB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,SAAS,CAAC,CAqKpB"}
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/qa/runner.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAY,MAAM,sBAAsB,CAAC;AAMnE,MAAM,WAAW,OAAO;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AACD,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B;AACD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAGzD;AACD,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;CAChB;AACD,MAAM,WAAW,MAAM;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC5B;AAED,wBAAgB,cAAc,CAC5B,MAAM,EAAE,SAAS,OAAO,EAAE,EAC1B,WAAW,EAAE,SAAS,UAAU,EAAE,GACjC,OAAO,CAET;AAMD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AA4NpD,wBAAsB,KAAK,CACzB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,SAAS,CAAC,CAuKpB"}
package/dist/qa/runner.js CHANGED
@@ -2,26 +2,20 @@ import { mkdir, writeFile } from "node:fs/promises";
2
2
  import path from "node:path";
3
3
  import { chromium } from "playwright";
4
4
  import { updateTelemetry } from "../telemetry/store.js";
5
+ import { visualArtifactKey } from "./artifacts.js";
5
6
  import { compareVisualArtifact } from "./diff.js";
6
7
  import { acquireServer } from "./server.js";
7
8
  export function formatVisualDiff(diff) {
8
9
  const percent = (diff.ratio * 100).toFixed(2);
9
- return `${diff.viewport.padEnd(11)} ${diff.route.padEnd(12)} ${percent}% changed (${diff.changedPixels}/${diff.totalPixels} px) -> ${diff.diffPath}`;
10
+ return `${diff.viewport.padEnd(11)} ${diff.route.padEnd(12)} ${percent}% changed (${diff.changedPixels}/${diff.totalPixels} px)${diff.diffPath ? ` -> ${diff.diffPath}` : ""}`;
11
+ }
12
+ export function qaResultPassed(issues, visualDiffs) {
13
+ return issues.length === 0 && visualDiffs.length === 0;
10
14
  }
11
15
  function label(viewport) {
12
16
  return `${viewport.width}x${viewport.height}`;
13
17
  }
14
- export function visualArtifactSlug(route) {
15
- if (route === "/")
16
- return "index";
17
- const slug = route
18
- .replace(/^\/+/, "")
19
- .replaceAll("/", "-")
20
- .replace(/[^a-zA-Z0-9._-]+/g, "-")
21
- .replace(/-+/g, "-")
22
- .replace(/^-+|-+$/g, "");
23
- return slug || "route";
24
- }
18
+ export { visualArtifactSlug } from "./artifacts.js";
25
19
  async function inspectPage(page, baseUrl, route, viewport) {
26
20
  const issues = [];
27
21
  let probes = 0;
@@ -296,18 +290,20 @@ export async function runQa(root, config, mode, signal) {
296
290
  probes += interacted.probes;
297
291
  }
298
292
  if (mode.visual) {
299
- const screenshotPath = path.join(artifactRoot, `${viewportName}-${visualArtifactSlug(route)}.png`);
293
+ const screenshotPath = path.join(artifactRoot, `${viewportName}-${visualArtifactKey(route)}.png`);
300
294
  const screenshot = await page.screenshot({ fullPage: true });
301
295
  if (mode.diff) {
302
296
  const comparison = await compareVisualArtifact(screenshotPath, screenshot, config.qa.visualDiffThreshold ?? 0.01);
303
- if (comparison.exceeded && comparison.diffPath) {
297
+ if (comparison.exceeded) {
304
298
  visualDiffs.push({
305
299
  viewport: viewportName,
306
300
  route,
307
301
  ratio: comparison.ratio,
308
302
  changedPixels: comparison.changedPixels,
309
303
  totalPixels: comparison.totalPixels,
310
- diffPath: path.relative(root, comparison.diffPath),
304
+ diffPath: comparison.diffPath
305
+ ? path.relative(root, comparison.diffPath)
306
+ : undefined,
311
307
  });
312
308
  }
313
309
  }
@@ -330,7 +326,7 @@ export async function runQa(root, config, mode, signal) {
330
326
  issue,
331
327
  ])).values(),
332
328
  ];
333
- const passed = unique.length === 0;
329
+ const passed = qaResultPassed(unique, visualDiffs);
334
330
  const diffOutput = mode.diff
335
331
  ? visualDiffs.length
336
332
  ? `\n\nVISUAL DIFFS\n${visualDiffs.map(formatVisualDiff).join("\n")}`
@@ -1 +1 @@
1
- {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/qa/runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/qa/runner.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/qa/server.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAIzD,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AACD,wBAAsB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAW5D;AACD,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAkBtE;AAcD,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,YAAY,EACpB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,QAAQ,CAAC,CAqFnB"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/qa/server.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAQzD,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AACD,wBAAsB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAW5D;AACD,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAkBtE;AAcD,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,YAAY,EACpB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,QAAQ,CAAC,CAqFnB"}
package/dist/qa/server.js CHANGED
@@ -3,7 +3,7 @@ import { mkdir, writeFile } from "node:fs/promises";
3
3
  import { createServer } from "node:net";
4
4
  import path from "node:path";
5
5
  import { npmExecutable } from "../platform/executable.js";
6
- import { prepareSpawn, terminateProcess } from "../platform/process.js";
6
+ import { appendBoundedOutput, prepareSpawn, terminateProcess, } from "../platform/process.js";
7
7
  export async function responds(url) {
8
8
  try {
9
9
  const response = await fetch(url, { signal: AbortSignal.timeout(1_000) });
@@ -73,12 +73,12 @@ export async function acquireServer(root, config, signal) {
73
73
  spawnError = error;
74
74
  });
75
75
  let logs = "";
76
- child.stdout
77
- ?.setEncoding("utf8")
78
- .on("data", (chunk) => (logs += chunk));
79
- child.stderr
80
- ?.setEncoding("utf8")
81
- .on("data", (chunk) => (logs += chunk));
76
+ child.stdout?.setEncoding("utf8").on("data", (chunk) => {
77
+ logs = appendBoundedOutput(logs, chunk);
78
+ });
79
+ child.stderr?.setEncoding("utf8").on("data", (chunk) => {
80
+ logs = appendBoundedOutput(logs, chunk);
81
+ });
82
82
  let stopPromise;
83
83
  const stop = () => {
84
84
  stopPromise ??= (async () => {
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/qa/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/qa/server.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  /** Standalone project tooling: no dependency on the generator at runtime. */
2
2
  export declare const backendCheckScript = "import { spawnSync } from \"node:child_process\";\nimport { readdir } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nfunction php(args) {\n const result = spawnSync(\"php\", args, {\n encoding: \"utf8\",\n shell: false,\n timeout: 10000,\n });\n if (result.error || result.status !== 0)\n throw new Error(result.error?.message || result.stderr || result.stdout);\n return result.stdout.trim();\n}\nasync function lint(directory) {\n for (const entry of await readdir(directory, { withFileTypes: true })) {\n const file = path.join(directory, entry.name);\n if (entry.isDirectory()) await lint(file);\n else if (entry.isFile() && entry.name.endsWith(\".php\")) php([\"-l\", file]);\n }\n}\ntry {\n const version = Number(php([\"-r\", \"echo PHP_VERSION_ID;\"]));\n if (!Number.isInteger(version) || version < 80000)\n throw new Error(\"PHP 8.0 or newer is required.\");\n await lint(\"api\");\n console.log(\"PHP PASS\");\n} catch (error) {\n console.error(`PHP FAIL\\n${error.message}`);\n process.exitCode = 1;\n}\n";
3
3
  export declare const deployScript = "import { cp, lstat, mkdir, rename, rm } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nconst target = path.resolve(\"deploy\");\nconst staging = `${target}.${process.pid}.tmp`;\nconst backup = `${target}.${process.pid}.backup`;\nlet backedUp = false;\ntry {\n await mkdir(staging);\n await cp(\"build/client\", staging, { recursive: true, errorOnExist: true });\n await cp(\"api\", path.join(staging, \"api\"), { recursive: true });\n await cp(\".htaccess\", path.join(staging, \".htaccess\"));\n try {\n await lstat(target);\n await rename(target, backup);\n backedUp = true;\n } catch (error) {\n if (error.code !== \"ENOENT\") throw error;\n }\n try {\n await rename(staging, target);\n } catch (error) {\n if (backedUp) await rename(backup, target);\n throw error;\n }\n if (backedUp) await rm(backup, { recursive: true });\n console.log(\"DEPLOY READY: deploy/\");\n} finally {\n await rm(staging, { recursive: true, force: true });\n}\n";
4
- export declare const qaScript = "import { spawn, spawnSync } from \"node:child_process\";\nimport { mkdir, readFile } from \"node:fs/promises\";\nimport net from \"node:net\";\nimport { chromium } from \"playwright\";\n\nconst flags = process.argv.slice(2);\nif (\n flags.some((flag) => ![\"--visual\", \"--interactive\", \"--force\"].includes(flag))\n)\n throw new Error(\"Unknown QA option\");\nconst config = JSON.parse(await readFile(\".mozole/project.json\", \"utf8\"));\nconst socket = net.createServer();\nawait new Promise((resolve, reject) => {\n socket.once(\"error\", reject);\n socket.listen(0, \"127.0.0.1\", resolve);\n});\nconst port = socket.address().port;\nawait new Promise((resolve) => socket.close(resolve));\nconst configured = config.qa.server;\nconst npmCli = process.env.npm_execpath;\nif (configured.command === \"npm\" && !npmCli) {\n throw new Error(\n \"Run QA through npm run qa so npm can be resolved without a shell.\",\n );\n}\nconst command =\n configured.command === \"npm\" ? process.execPath : configured.command;\nconst args = [\n ...(configured.command === \"npm\" ? [npmCli] : []),\n ...configured.args,\n \"--port\",\n String(port),\n \"--strictPort\",\n];\nconst child = spawn(command, args, {\n shell: false,\n detached: process.platform !== \"win32\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n});\nlet serverLog = \"\";\nfor (const stream of [child.stdout, child.stderr])\n stream.on(\"data\", (data) => {\n serverLog = (serverLog + data).slice(-4000);\n });\nlet serverError;\nchild.on(\"error\", (error) => {\n serverError = error;\n});\nlet browser;\nlet stopping = false;\nasync function cleanup() {\n if (stopping) return;\n stopping = true;\n await browser?.close().catch(() => {});\n if (child.pid) {\n if (process.platform === \"win32\")\n spawnSync(\"taskkill\", [\"/pid\", String(child.pid), \"/T\", \"/F\"], {\n shell: false,\n stdio: \"ignore\",\n });\n else {\n try {\n process.kill(-child.pid, \"SIGTERM\");\n } catch {}\n }\n }\n}\nconst interrupted = () => {\n void cleanup().finally(() => process.exit(130));\n};\nprocess.once(\"SIGINT\", interrupted);\nprocess.once(\"SIGTERM\", interrupted);\nconst deadline = setTimeout(() => {\n console.error(\"QA timed out\");\n void cleanup().finally(() => process.exit(1));\n}, 120000);\nconst base = `http://127.0.0.1:${port}`;\ntry {\n let ready = false;\n for (let attempt = 0; attempt < 300; attempt++) {\n if (serverError || child.exitCode !== null)\n throw new Error(serverError?.message || serverLog);\n try {\n ready = (\n await fetch(base + config.qa.server.readinessPath, {\n signal: AbortSignal.timeout(1000),\n })\n ).ok;\n } catch {}\n if (ready) break;\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n if (!ready)\n throw new Error(`Development server did not become ready.\\n${serverLog}`);\n browser = await chromium.launch();\n const failures = [];\n for (const viewport of config.qa.viewports) {\n const page = await browser.newPage({ viewport });\n page.on(\"pageerror\", (error) => failures.push(error.message));\n page.on(\"console\", (message) => {\n if (message.type() === \"error\") failures.push(message.text());\n });\n page.on(\"requestfailed\", (request) => {\n if (request.failure()?.errorText !== \"net::ERR_ABORTED\")\n failures.push(request.url());\n });\n page.on(\"response\", (response) => {\n if (response.status() >= 400)\n failures.push(`${response.status()} ${response.url()}`);\n });\n for (const route of config.routes) {\n const response = await page.goto(base + route, {\n waitUntil: \"networkidle\",\n });\n if (!response?.ok()) failures.push(`${route}: HTTP failure`);\n const issues = await page.evaluate(() => {\n const found = [];\n if (!document.documentElement.lang) found.push(\"missing lang\");\n if (!document.title.trim()) found.push(\"missing title\");\n if (!document.querySelector(\"h1\")) found.push(\"missing h1\");\n if (document.documentElement.scrollWidth > innerWidth + 1)\n found.push(\"horizontal overflow\");\n for (const element of document.querySelectorAll(\n \"a, button, input:not([type=hidden]), select, textarea\",\n )) {\n if (!element.getClientRects().length) continue;\n const labelled = (element.getAttribute(\"aria-labelledby\") || \"\")\n .split(/\\s+/)\n .some((id) => document.getElementById(id)?.textContent?.trim());\n if (\n !element.textContent?.trim() &&\n !element.getAttribute(\"aria-label\") &&\n !labelled &&\n !element.labels?.length &&\n !element.getAttribute(\"title\") &&\n !element.getAttribute(\"alt\") &&\n !element.querySelector(\"img[alt]\")\n )\n found.push(\"unnamed control\");\n }\n return found;\n });\n failures.push(...issues.map((issue) => `${route}: ${issue}`));\n const links = await page\n .locator(\"a[href]\")\n .evaluateAll((anchors) => anchors.map((anchor) => anchor.href));\n for (const href of new Set(links)) {\n if (\n new URL(href).origin === base &&\n !(await page.request.get(href)).ok()\n )\n failures.push(`broken link: ${href}`);\n }\n if (flags.includes(\"--interactive\")) {\n await page.keyboard.press(\"Tab\");\n if (\n !(await page.evaluate(() => document.activeElement !== document.body))\n )\n failures.push(`${route}: keyboard focus missing`);\n }\n if (flags.includes(\"--visual\")) {\n await mkdir(\".mozole/qa\", { recursive: true });\n const name = route.replace(/[^a-z0-9_-]/gi, \"-\") || \"index\";\n await page.screenshot({\n path:\n \".mozole/qa/\" +\n viewport.width +\n \"x\" +\n viewport.height +\n \"-\" +\n name +\n \".png\",\n fullPage: true,\n });\n }\n }\n await page.close();\n }\n if (failures.length) throw new Error([...new Set(failures)].join(\"\\n\"));\n console.log(\n \"QA PASS: \" +\n config.routes.length +\n \" routes, \" +\n config.qa.viewports.length +\n \" viewports\",\n );\n} catch (error) {\n console.error(`QA FAIL\\n${error.message}`);\n process.exitCode = 1;\n} finally {\n clearTimeout(deadline);\n process.removeListener(\"SIGINT\", interrupted);\n process.removeListener(\"SIGTERM\", interrupted);\n await cleanup();\n}\n";
4
+ export declare const qaScript = "import { spawn, spawnSync } from \"node:child_process\";\nimport { mkdir, readFile } from \"node:fs/promises\";\nimport net from \"node:net\";\nimport { chromium } from \"playwright\";\n\nconst flags = process.argv.slice(2);\nif (\n flags.some((flag) => ![\"--visual\", \"--interactive\", \"--force\"].includes(flag))\n)\n throw new Error(\"Unknown QA option\");\nconst config = JSON.parse(await readFile(\".mozole/project.json\", \"utf8\"));\nconst routes = config.routes;\nconst viewports = config.qa?.viewports;\nconst artifactName = (route) =>\n route === \"/\"\n ? \"index\"\n : route\n .replace(/^\\/+/, \"\")\n .replaceAll(\"/\", \"-\")\n .replace(/[^a-zA-Z0-9._-]+/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-+|-+$/g, \"\") || \"route\";\nif (\n !Array.isArray(routes) ||\n routes.length === 0 ||\n routes.length > 100 ||\n new Set(routes).size !== routes.length ||\n new Set(routes.map(artifactName)).size !== routes.length ||\n !routes.every(\n (route) =>\n typeof route === \"string\" &&\n route.startsWith(\"/\") &&\n !route.startsWith(\"//\") &&\n route.length <= 2048,\n ) ||\n !Array.isArray(viewports) ||\n viewports.length === 0 ||\n viewports.length > 20 ||\n new Set(\n viewports.map(({ width, height }) => `${String(width)}x${String(height)}`),\n ).size !== viewports.length ||\n !viewports.every(\n ({ width, height }) =>\n Number.isInteger(width) &&\n width > 0 &&\n width <= 7680 &&\n Number.isInteger(height) &&\n height > 0 &&\n height <= 7680,\n )\n)\n throw new Error(\"Invalid QA routes or viewports\");\nfunction safe(value) {\n value = String(value);\n let output = \"\";\n for (let index = 0; index < value.length; index++) {\n const code = value.charCodeAt(index);\n if (code === 27) {\n const kind = value[index + 1];\n if (kind === \"[\") {\n index += 2;\n while (index < value.length) {\n const byte = value.charCodeAt(index);\n if (byte >= 64 && byte <= 126) break;\n index++;\n }\n } else if (kind === \"]\") {\n index += 2;\n while (index < value.length) {\n if (value.charCodeAt(index) === 7) break;\n if (value.charCodeAt(index) === 27 && value[index + 1] === \"\\\\\") {\n index++;\n break;\n }\n index++;\n }\n } else if (kind !== undefined) index++;\n continue;\n }\n if (\n (code >= 0 && code <= 8) ||\n code === 11 ||\n code === 12 ||\n (code >= 14 && code <= 31) ||\n (code >= 127 && code <= 159)\n )\n continue;\n output += value[index];\n }\n return output;\n}\nconst socket = net.createServer();\nawait new Promise((resolve, reject) => {\n socket.once(\"error\", reject);\n socket.listen(0, \"127.0.0.1\", resolve);\n});\nconst port = socket.address().port;\nawait new Promise((resolve) => socket.close(resolve));\nconst configured = config.qa.server;\nconst npmCli = process.env.npm_execpath;\nif (configured.command === \"npm\" && !npmCli) {\n throw new Error(\n \"Run QA through npm run qa so npm can be resolved without a shell.\",\n );\n}\nconst command =\n configured.command === \"npm\" ? process.execPath : configured.command;\nconst args = [\n ...(configured.command === \"npm\" ? [npmCli] : []),\n ...configured.args,\n \"--port\",\n String(port),\n \"--strictPort\",\n];\nconst child = spawn(command, args, {\n shell: false,\n detached: process.platform !== \"win32\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n});\nlet serverLog = \"\";\nfor (const stream of [child.stdout, child.stderr])\n stream.on(\"data\", (data) => {\n serverLog = (serverLog + data).slice(-4000);\n });\nlet serverError;\nchild.on(\"error\", (error) => {\n serverError = error;\n});\nlet browser;\nlet stopping = false;\nasync function cleanup() {\n if (stopping) return;\n stopping = true;\n await browser?.close().catch(() => {});\n if (child.pid) {\n if (process.platform === \"win32\")\n spawnSync(\"taskkill\", [\"/pid\", String(child.pid), \"/T\", \"/F\"], {\n shell: false,\n stdio: \"ignore\",\n });\n else {\n try {\n process.kill(-child.pid, \"SIGTERM\");\n } catch {}\n }\n }\n}\nconst interrupted = () => {\n void cleanup().finally(() => process.exit(130));\n};\nprocess.once(\"SIGINT\", interrupted);\nprocess.once(\"SIGTERM\", interrupted);\nconst deadline = setTimeout(() => {\n console.error(\"QA timed out\");\n void cleanup().finally(() => process.exit(1));\n}, 120000);\nconst base = `http://127.0.0.1:${port}`;\ntry {\n let ready = false;\n for (let attempt = 0; attempt < 300; attempt++) {\n if (serverError || child.exitCode !== null)\n throw new Error(serverError?.message || serverLog);\n try {\n ready = (\n await fetch(base + config.qa.server.readinessPath, {\n signal: AbortSignal.timeout(1000),\n })\n ).ok;\n } catch {}\n if (ready) break;\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n if (!ready)\n throw new Error(`Development server did not become ready.\\n${serverLog}`);\n browser = await chromium.launch();\n const failures = [];\n for (const viewport of config.qa.viewports) {\n const page = await browser.newPage({ viewport });\n page.on(\"pageerror\", (error) => failures.push(error.message));\n page.on(\"console\", (message) => {\n if (message.type() === \"error\") failures.push(message.text());\n });\n page.on(\"requestfailed\", (request) => {\n if (request.failure()?.errorText !== \"net::ERR_ABORTED\")\n failures.push(request.url());\n });\n page.on(\"response\", (response) => {\n if (response.status() >= 400)\n failures.push(`${response.status()} ${response.url()}`);\n });\n for (const route of config.routes) {\n const response = await page.goto(base + route, {\n waitUntil: \"networkidle\",\n });\n if (!response?.ok()) failures.push(`${route}: HTTP failure`);\n const issues = await page.evaluate(() => {\n const found = [];\n if (!document.documentElement.lang) found.push(\"missing lang\");\n if (!document.title.trim()) found.push(\"missing title\");\n if (!document.querySelector(\"h1\")) found.push(\"missing h1\");\n if (document.documentElement.scrollWidth > innerWidth + 1)\n found.push(\"horizontal overflow\");\n for (const element of document.querySelectorAll(\n \"a, button, input:not([type=hidden]), select, textarea\",\n )) {\n if (!element.getClientRects().length) continue;\n const labelled = (element.getAttribute(\"aria-labelledby\") || \"\")\n .split(/\\s+/)\n .some((id) => document.getElementById(id)?.textContent?.trim());\n if (\n !element.textContent?.trim() &&\n !element.getAttribute(\"aria-label\") &&\n !labelled &&\n !element.labels?.length &&\n !element.getAttribute(\"title\") &&\n !element.getAttribute(\"alt\") &&\n !element.querySelector(\"img[alt]\")\n )\n found.push(\"unnamed control\");\n }\n return found;\n });\n failures.push(...issues.map((issue) => `${route}: ${issue}`));\n const links = await page\n .locator(\"a[href]\")\n .evaluateAll((anchors) => anchors.map((anchor) => anchor.href));\n for (const href of new Set(links)) {\n if (\n new URL(href).origin === base &&\n !(await page.request.get(href)).ok()\n )\n failures.push(`broken link: ${href}`);\n }\n if (flags.includes(\"--interactive\")) {\n await page.keyboard.press(\"Tab\");\n if (\n !(await page.evaluate(() => document.activeElement !== document.body))\n )\n failures.push(`${route}: keyboard focus missing`);\n }\n if (flags.includes(\"--visual\")) {\n await mkdir(\".mozole/qa\", { recursive: true });\n const name = artifactName(route);\n await page.screenshot({\n path:\n \".mozole/qa/\" +\n viewport.width +\n \"x\" +\n viewport.height +\n \"-\" +\n name +\n \".png\",\n fullPage: true,\n });\n }\n }\n await page.close();\n }\n if (failures.length) throw new Error([...new Set(failures)].join(\"\\n\"));\n console.log(\n \"QA PASS: \" +\n config.routes.length +\n \" routes, \" +\n config.qa.viewports.length +\n \" viewports\",\n );\n} catch (error) {\n console.error(`QA FAIL\\n${safe(error.message)}`);\n process.exitCode = 1;\n} finally {\n clearTimeout(deadline);\n process.removeListener(\"SIGINT\", interrupted);\n process.removeListener(\"SIGTERM\", interrupted);\n await cleanup();\n}\n";
5
5
  export declare function basicAgentGuide(backend: boolean): string;
6
6
  export declare const extraVerifierScript = "import { spawnSync } from \"node:child_process\";\nimport { readFile } from \"node:fs/promises\";\n\nconst config = JSON.parse(await readFile(\".mozole/project.json\", \"utf8\"));\nfor (const check of config.verifiers ?? []) {\n if (\n typeof check.command !== \"string\" ||\n !Array.isArray(check.args) ||\n !check.args.every((arg) => typeof arg === \"string\")\n )\n throw new Error(\"Invalid extra verifier\");\n const npm = check.command === \"npm\";\n if (npm && !process.env.npm_execpath)\n throw new Error(\"Run verification through npm run verify\");\n const result = spawnSync(\n npm ? process.execPath : check.command,\n npm ? [process.env.npm_execpath, ...check.args] : check.args,\n { shell: false, stdio: \"inherit\", timeout: 600000 },\n );\n if (result.error || result.status !== 0) {\n console.error(\n \"Extra verifier failed:\",\n check.name,\n result.error?.message ?? result.status,\n );\n process.exit(result.status || 1);\n }\n}\n";
7
7
  //# sourceMappingURL=standalone.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"standalone.d.ts","sourceRoot":"","sources":["../../src/scaffold/standalone.ts"],"names":[],"mappings":"AAEA,6EAA6E;AAC7E,eAAO,MAAM,kBAAkB,ijCA+B9B,CAAC;AAEF,eAAO,MAAM,YAAY,q+BA8BxB,CAAC;AAEF,eAAO,MAAM,QAAQ,qlNAmMpB,CAAC;AAEF,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAExD;AAED,eAAO,MAAM,mBAAmB,q/BA4B/B,CAAC"}
1
+ {"version":3,"file":"standalone.d.ts","sourceRoot":"","sources":["../../src/scaffold/standalone.ts"],"names":[],"mappings":"AAEA,6EAA6E;AAC7E,eAAO,MAAM,kBAAkB,ijCA+B9B,CAAC;AAEF,eAAO,MAAM,YAAY,q+BA8BxB,CAAC;AAEF,eAAO,MAAM,QAAQ,gzRAmRpB,CAAC;AAEF,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAExD;AAED,eAAO,MAAM,mBAAmB,q/BA4B/B,CAAC"}
@@ -74,6 +74,86 @@ if (
74
74
  )
75
75
  throw new Error("Unknown QA option");
76
76
  const config = JSON.parse(await readFile(".mozole/project.json", "utf8"));
77
+ const routes = config.routes;
78
+ const viewports = config.qa?.viewports;
79
+ const artifactName = (route) =>
80
+ route === "/"
81
+ ? "index"
82
+ : route
83
+ .replace(/^\\/+/, "")
84
+ .replaceAll("/", "-")
85
+ .replace(/[^a-zA-Z0-9._-]+/g, "-")
86
+ .replace(/-+/g, "-")
87
+ .replace(/^-+|-+$/g, "") || "route";
88
+ if (
89
+ !Array.isArray(routes) ||
90
+ routes.length === 0 ||
91
+ routes.length > 100 ||
92
+ new Set(routes).size !== routes.length ||
93
+ new Set(routes.map(artifactName)).size !== routes.length ||
94
+ !routes.every(
95
+ (route) =>
96
+ typeof route === "string" &&
97
+ route.startsWith("/") &&
98
+ !route.startsWith("//") &&
99
+ route.length <= 2048,
100
+ ) ||
101
+ !Array.isArray(viewports) ||
102
+ viewports.length === 0 ||
103
+ viewports.length > 20 ||
104
+ new Set(
105
+ viewports.map(({ width, height }) => \`\${String(width)}x\${String(height)}\`),
106
+ ).size !== viewports.length ||
107
+ !viewports.every(
108
+ ({ width, height }) =>
109
+ Number.isInteger(width) &&
110
+ width > 0 &&
111
+ width <= 7680 &&
112
+ Number.isInteger(height) &&
113
+ height > 0 &&
114
+ height <= 7680,
115
+ )
116
+ )
117
+ throw new Error("Invalid QA routes or viewports");
118
+ function safe(value) {
119
+ value = String(value);
120
+ let output = "";
121
+ for (let index = 0; index < value.length; index++) {
122
+ const code = value.charCodeAt(index);
123
+ if (code === 27) {
124
+ const kind = value[index + 1];
125
+ if (kind === "[") {
126
+ index += 2;
127
+ while (index < value.length) {
128
+ const byte = value.charCodeAt(index);
129
+ if (byte >= 64 && byte <= 126) break;
130
+ index++;
131
+ }
132
+ } else if (kind === "]") {
133
+ index += 2;
134
+ while (index < value.length) {
135
+ if (value.charCodeAt(index) === 7) break;
136
+ if (value.charCodeAt(index) === 27 && value[index + 1] === "\\\\") {
137
+ index++;
138
+ break;
139
+ }
140
+ index++;
141
+ }
142
+ } else if (kind !== undefined) index++;
143
+ continue;
144
+ }
145
+ if (
146
+ (code >= 0 && code <= 8) ||
147
+ code === 11 ||
148
+ code === 12 ||
149
+ (code >= 14 && code <= 31) ||
150
+ (code >= 127 && code <= 159)
151
+ )
152
+ continue;
153
+ output += value[index];
154
+ }
155
+ return output;
156
+ }
77
157
  const socket = net.createServer();
78
158
  await new Promise((resolve, reject) => {
79
159
  socket.once("error", reject);
@@ -225,7 +305,7 @@ try {
225
305
  }
226
306
  if (flags.includes("--visual")) {
227
307
  await mkdir(".mozole/qa", { recursive: true });
228
- const name = route.replace(/[^a-z0-9_-]/gi, "-") || "index";
308
+ const name = artifactName(route);
229
309
  await page.screenshot({
230
310
  path:
231
311
  ".mozole/qa/" +
@@ -250,7 +330,7 @@ try {
250
330
  " viewports",
251
331
  );
252
332
  } catch (error) {
253
- console.error(\`QA FAIL\\n\${error.message}\`);
333
+ console.error(\`QA FAIL\\n\${safe(error.message)}\`);
254
334
  process.exitCode = 1;
255
335
  } finally {
256
336
  clearTimeout(deadline);
@@ -1 +1 @@
1
- {"version":3,"file":"standalone.js","sourceRoot":"","sources":["../../src/scaffold/standalone.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,6EAA6E;AAC7E,MAAM,CAAC,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+BjC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8B3B,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmMvB,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC9C,OAAO,0TAA0T,OAAO,CAAC,CAAC,CAAC,+LAA+L,CAAC,CAAC,CAAC,EAAE,mKAAmK,OAAO,CAAC,CAAC,CAAC,wHAAwH,CAAC,CAAC,CAAC,EAAE,kRAAkR,gBAAgB,EAAE,CAAC;AAChmC,CAAC;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BlC,CAAC"}
1
+ {"version":3,"file":"standalone.js","sourceRoot":"","sources":["../../src/scaffold/standalone.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,6EAA6E;AAC7E,MAAM,CAAC,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+BjC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8B3B,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmRvB,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC9C,OAAO,0TAA0T,OAAO,CAAC,CAAC,CAAC,+LAA+L,CAAC,CAAC,CAAC,EAAE,mKAAmK,OAAO,CAAC,CAAC,CAAC,wHAAwH,CAAC,CAAC,CAAC,EAAE,kRAAkR,gBAAgB,EAAE,CAAC;AAChmC,CAAC;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BlC,CAAC"}
@@ -2,6 +2,7 @@ import type { MozoleConfig } from "../config/project.js";
2
2
  export interface ProjectTemplateOptions {
3
3
  scaffold?: boolean | undefined;
4
4
  backend?: boolean | undefined;
5
+ sharedDependencies?: boolean | undefined;
5
6
  }
6
7
  export declare function projectConfig(name: string, options?: ProjectTemplateOptions): MozoleConfig;
7
8
  export declare function projectTemplates(name: string, options?: ProjectTemplateOptions): Record<string, string>;
@@ -1 +1 @@
1
- {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/scaffold/templates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAczD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC/B,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC/B;AAED,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,sBAA2B,GACnC,YAAY,CAiDd;AAID,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,sBAA2B,GACnC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAmTxB"}
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/scaffold/templates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAczD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC/B,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,kBAAkB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC1C;AAED,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,sBAA2B,GACnC,YAAY,CAmDd;AAID,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,sBAA2B,GACnC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAsTxB"}
@@ -28,6 +28,8 @@ export function projectConfig(name, options = {}) {
28
28
  },
29
29
  verifiers: [],
30
30
  };
31
+ if (options.sharedDependencies)
32
+ config.workspace = { sharedDependencies: true };
31
33
  if (!isScaffold) {
32
34
  config.cce = {
33
35
  enabled: true,
@@ -55,6 +57,9 @@ const json = (value) => `${JSON.stringify(value, null, 2)}\n`;
55
57
  export function projectTemplates(name, options = {}) {
56
58
  const isScaffold = options.scaffold !== false;
57
59
  const cliSpec = process.env.MOZOLE_CLI_SPEC ?? TOOLCHAIN.mozoleCli;
60
+ const dependencyGuide = options.sharedDependencies
61
+ ? "Dependencies and test tools are provided by the parent Mozole template workspace; do not create a project-local node_modules tree."
62
+ : "Dependencies and test tools are pre-installed by `mozole new`.";
58
63
  const scripts = {
59
64
  build: "react-router build",
60
65
  dev: "react-router dev",
@@ -230,7 +235,7 @@ export function projectTemplates(name, options = {}) {
230
235
  "AGENTS.md": "# Project guide\n\n## Commands\n\n- `npm run dev` — local app\n- `npm run verify` — lint, typecheck, tests, production build\n- `npm run qa` — deterministic browser QA (no screenshots)\n- `npm run qa:interactive` — adds safe interaction probes\n- `npm run qa:visual` — explicit screenshot review\n- `mozole cce install` — install persistent CCE and required uv runtime\n- `mozole ui` — full-screen terminal dashboard\n\n## Architecture\n\nReact Router Framework Mode lives in `app/`; routes are in `app/routes.ts`; static output is `build/client/`. Mozole settings are in `.mozole/`; Antigravity integration is in `.agents/`; deeper decisions belong in `docs/`.\n\n## Mandatory CCE contract\n\nRepository reads are forbidden by default. Allowed retrieval order:\n\n1. CCE `context_search`\n2. additional CCE search, `expand_chunk`, or `related_context`\n3. bounded line-range read only when CCE output is insufficient\n4. full-file read only after explicit escalation\n\nEditing a file is NOT sufficient justification for reading it in full. If CCE is unavailable, stop and report the blocker instead of falling back to repository reads. Prefer localized patches and inspect `git diff`. Keep narration and successful logs concise. Routine browser validation uses screenshot-free `mozole qa`; visual QA requires an explicit user request or confirmed deterministic failure. Stop after requested work, `mozole verify`, and relevant routine QA pass.\n",
231
236
  "CLAUDE.md": "@AGENTS.md\n\n## Claude Code CCE contract\n\nRepository reads are forbidden by default. Use `context_search`, then additional CCE retrieval. Read may use a bounded line range only when CCE is insufficient; a full-file Read requires explicit escalation. Editing is not justification. If CCE is unavailable, report the blocker; do not fall back.\n",
232
237
  "docs/architecture.md": "# Architecture\n\nThe app uses React Router Framework Mode with Vite. `ssr: false` and `prerender: true` emit real HTML for every statically declared route. Static files in `build/client/` can be served beside a future PHP backend without a production Node process. Mozole fingerprints relevant inputs under `.mozole/state/`; unchanged successful verification and QA are reused, while `--force` requests fresh evidence. Codex and Claude Code use the shared root instructions; Antigravity workspace MCP, rules, and workflows live under `.agents/` and share the same CCE index.\n",
233
- "README.md": `# ${name}\n\nStatic-first React Router Framework Mode project generated by Mozole for Codex, Claude Code, and Google Antigravity.\n\n## Start\n\n\`\`\`sh\nnpm run dev\n\`\`\`\n\nDependencies and test tools are pre-installed by \`mozole new\`. Run \`npm run verify\` before handoff and \`npm run qa\` for screenshot-free browser checks. Unchanged successful checks are reused; use \`--force\` for intentionally fresh evidence. Visual QA is explicit only. Antigravity workspace integration is under \`.agents/\`. Production files are emitted to \`build/client/\`.\n`,
238
+ "README.md": `# ${name}\n\nStatic-first React Router Framework Mode project generated by Mozole for Codex, Claude Code, and Google Antigravity.\n\n## Start\n\n\`\`\`sh\nnpm run dev\n\`\`\`\n\n${dependencyGuide} Run \`npm run verify\` before handoff and \`npm run qa\` for screenshot-free browser checks. Unchanged successful checks are reused; use \`--force\` for intentionally fresh evidence. Visual QA is explicit only. Antigravity workspace integration is under \`.agents/\`. Production files are emitted to \`build/client/\`.\n`,
234
239
  };
235
240
  if (!isScaffold) {
236
241
  for (const [file, agent] of [