@mozole/cli 1.4.2 → 2.0.0-b

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 (229) hide show
  1. package/LICENSE +16 -4
  2. package/README.md +85 -89
  3. package/dist/cli.d.ts +2 -2
  4. package/dist/cli.d.ts.map +1 -1
  5. package/dist/cli.js +204 -157
  6. package/dist/cli.js.map +1 -1
  7. package/dist/commands/adopt.d.ts +5 -8
  8. package/dist/commands/adopt.d.ts.map +1 -1
  9. package/dist/commands/adopt.js +49 -812
  10. package/dist/commands/adopt.js.map +1 -1
  11. package/dist/commands/doctor.d.ts +1 -7
  12. package/dist/commands/doctor.d.ts.map +1 -1
  13. package/dist/commands/doctor.js +69 -377
  14. package/dist/commands/doctor.js.map +1 -1
  15. package/dist/commands/new.d.ts +8 -10
  16. package/dist/commands/new.d.ts.map +1 -1
  17. package/dist/commands/new.js +32 -149
  18. package/dist/commands/new.js.map +1 -1
  19. package/dist/commands/phase.d.ts +11 -0
  20. package/dist/commands/phase.d.ts.map +1 -0
  21. package/dist/commands/phase.js +106 -0
  22. package/dist/commands/phase.js.map +1 -0
  23. package/dist/commands/prototype.d.ts +6 -0
  24. package/dist/commands/prototype.d.ts.map +1 -0
  25. package/dist/commands/prototype.js +28 -0
  26. package/dist/commands/prototype.js.map +1 -0
  27. package/dist/commands/repomap.d.ts +6 -0
  28. package/dist/commands/repomap.d.ts.map +1 -0
  29. package/dist/commands/repomap.js +71 -0
  30. package/dist/commands/repomap.js.map +1 -0
  31. package/dist/commands/test.d.ts +6 -0
  32. package/dist/commands/test.d.ts.map +1 -0
  33. package/dist/commands/test.js +115 -0
  34. package/dist/commands/test.js.map +1 -0
  35. package/dist/commands/ui.d.ts +1 -37
  36. package/dist/commands/ui.d.ts.map +1 -1
  37. package/dist/commands/ui.js +75 -317
  38. package/dist/commands/ui.js.map +1 -1
  39. package/dist/commands/verify.d.ts +12 -7
  40. package/dist/commands/verify.d.ts.map +1 -1
  41. package/dist/commands/verify.js +148 -65
  42. package/dist/commands/verify.js.map +1 -1
  43. package/dist/qa/a11y.d.ts +24 -0
  44. package/dist/qa/a11y.d.ts.map +1 -0
  45. package/dist/qa/a11y.js +124 -0
  46. package/dist/qa/a11y.js.map +1 -0
  47. package/dist/qa/breakpoints.d.ts +16 -0
  48. package/dist/qa/breakpoints.d.ts.map +1 -0
  49. package/dist/qa/breakpoints.js +45 -0
  50. package/dist/qa/breakpoints.js.map +1 -0
  51. package/dist/qa/contract.d.ts +21 -0
  52. package/dist/qa/contract.d.ts.map +1 -0
  53. package/dist/qa/contract.js +116 -0
  54. package/dist/qa/contract.js.map +1 -0
  55. package/dist/qa/index.d.ts +6 -0
  56. package/dist/qa/index.d.ts.map +1 -0
  57. package/dist/qa/index.js +6 -0
  58. package/dist/qa/index.js.map +1 -0
  59. package/dist/qa/probe.d.ts +48 -0
  60. package/dist/qa/probe.d.ts.map +1 -0
  61. package/dist/qa/probe.js +206 -0
  62. package/dist/qa/probe.js.map +1 -0
  63. package/dist/qa/runner.d.ts +27 -32
  64. package/dist/qa/runner.d.ts.map +1 -1
  65. package/dist/qa/runner.js +286 -336
  66. package/dist/qa/runner.js.map +1 -1
  67. package/dist/scaffold/agents.d.ts +5 -0
  68. package/dist/scaffold/agents.d.ts.map +1 -0
  69. package/dist/scaffold/agents.js +84 -0
  70. package/dist/scaffold/agents.js.map +1 -0
  71. package/dist/scaffold/backend.d.ts +6 -8
  72. package/dist/scaffold/backend.d.ts.map +1 -1
  73. package/dist/scaffold/backend.js +318 -199
  74. package/dist/scaffold/backend.js.map +1 -1
  75. package/dist/scaffold/design.d.ts +4 -3
  76. package/dist/scaffold/design.d.ts.map +1 -1
  77. package/dist/scaffold/design.js +38 -47
  78. package/dist/scaffold/design.js.map +1 -1
  79. package/dist/scaffold/flagship.d.ts +8 -0
  80. package/dist/scaffold/flagship.d.ts.map +1 -0
  81. package/dist/scaffold/flagship.js +337 -0
  82. package/dist/scaffold/flagship.js.map +1 -0
  83. package/dist/scaffold/index.d.ts +9 -0
  84. package/dist/scaffold/index.d.ts.map +1 -0
  85. package/dist/scaffold/index.js +48 -0
  86. package/dist/scaffold/index.js.map +1 -0
  87. package/dist/scaffold/phases.d.ts +10 -0
  88. package/dist/scaffold/phases.d.ts.map +1 -0
  89. package/dist/scaffold/phases.js +165 -0
  90. package/dist/scaffold/phases.js.map +1 -0
  91. package/dist/scaffold/repomap.d.ts +6 -0
  92. package/dist/scaffold/repomap.d.ts.map +1 -0
  93. package/dist/scaffold/repomap.js +89 -0
  94. package/dist/scaffold/repomap.js.map +1 -0
  95. package/dist/scaffold/standard.d.ts +13 -0
  96. package/dist/scaffold/standard.d.ts.map +1 -0
  97. package/dist/scaffold/standard.js +371 -0
  98. package/dist/scaffold/standard.js.map +1 -0
  99. package/dist/scaffold/tokens.d.ts +3 -0
  100. package/dist/scaffold/tokens.d.ts.map +1 -0
  101. package/dist/scaffold/tokens.js +126 -0
  102. package/dist/scaffold/tokens.js.map +1 -0
  103. package/dist/server/manager.d.ts +23 -0
  104. package/dist/server/manager.d.ts.map +1 -0
  105. package/dist/server/manager.js +96 -0
  106. package/dist/server/manager.js.map +1 -0
  107. package/dist/utils/ai-trace.d.ts +8 -0
  108. package/dist/utils/ai-trace.d.ts.map +1 -0
  109. package/dist/utils/ai-trace.js +69 -0
  110. package/dist/utils/ai-trace.js.map +1 -0
  111. package/dist/utils/browser.d.ts +10 -0
  112. package/dist/utils/browser.d.ts.map +1 -0
  113. package/dist/utils/browser.js +127 -0
  114. package/dist/utils/browser.js.map +1 -0
  115. package/dist/utils/fs.d.ts +11 -0
  116. package/dist/utils/fs.d.ts.map +1 -0
  117. package/dist/utils/fs.js +166 -0
  118. package/dist/utils/fs.js.map +1 -0
  119. package/dist/utils/git.d.ts +9 -0
  120. package/dist/utils/git.d.ts.map +1 -0
  121. package/dist/utils/git.js +69 -0
  122. package/dist/utils/git.js.map +1 -0
  123. package/dist/utils/process.d.ts +21 -0
  124. package/dist/utils/process.d.ts.map +1 -0
  125. package/dist/utils/process.js +120 -0
  126. package/dist/utils/process.js.map +1 -0
  127. package/dist/version.d.ts +21 -36
  128. package/dist/version.d.ts.map +1 -1
  129. package/dist/version.js +21 -44
  130. package/dist/version.js.map +1 -1
  131. package/package.json +19 -38
  132. package/CHANGELOG.md +0 -30
  133. package/dist/commands/cce.d.ts +0 -7
  134. package/dist/commands/cce.d.ts.map +0 -1
  135. package/dist/commands/cce.js +0 -37
  136. package/dist/commands/cce.js.map +0 -1
  137. package/dist/commands/logs.d.ts +0 -3
  138. package/dist/commands/logs.d.ts.map +0 -1
  139. package/dist/commands/logs.js +0 -39
  140. package/dist/commands/logs.js.map +0 -1
  141. package/dist/commands/qa.d.ts +0 -12
  142. package/dist/commands/qa.d.ts.map +0 -1
  143. package/dist/commands/qa.js +0 -143
  144. package/dist/commands/qa.js.map +0 -1
  145. package/dist/commands/stats.d.ts +0 -37
  146. package/dist/commands/stats.d.ts.map +0 -1
  147. package/dist/commands/stats.js +0 -169
  148. package/dist/commands/stats.js.map +0 -1
  149. package/dist/config/project.d.ts +0 -51
  150. package/dist/config/project.d.ts.map +0 -1
  151. package/dist/config/project.js +0 -81
  152. package/dist/config/project.js.map +0 -1
  153. package/dist/context/cce.d.ts +0 -39
  154. package/dist/context/cce.d.ts.map +0 -1
  155. package/dist/context/cce.js +0 -455
  156. package/dist/context/cce.js.map +0 -1
  157. package/dist/governor/fingerprint.d.ts +0 -7
  158. package/dist/governor/fingerprint.d.ts.map +0 -1
  159. package/dist/governor/fingerprint.js +0 -129
  160. package/dist/governor/fingerprint.js.map +0 -1
  161. package/dist/governor/hook.d.ts +0 -13
  162. package/dist/governor/hook.d.ts.map +0 -1
  163. package/dist/governor/hook.js +0 -389
  164. package/dist/governor/hook.js.map +0 -1
  165. package/dist/governor/state.d.ts +0 -45
  166. package/dist/governor/state.d.ts.map +0 -1
  167. package/dist/governor/state.js +0 -60
  168. package/dist/governor/state.js.map +0 -1
  169. package/dist/integrations/antigravity.d.ts +0 -20
  170. package/dist/integrations/antigravity.d.ts.map +0 -1
  171. package/dist/integrations/antigravity.js +0 -153
  172. package/dist/integrations/antigravity.js.map +0 -1
  173. package/dist/output.d.ts +0 -5
  174. package/dist/output.d.ts.map +0 -1
  175. package/dist/output.js +0 -2
  176. package/dist/output.js.map +0 -1
  177. package/dist/platform/executable.d.ts +0 -11
  178. package/dist/platform/executable.d.ts.map +0 -1
  179. package/dist/platform/executable.js +0 -69
  180. package/dist/platform/executable.js.map +0 -1
  181. package/dist/platform/process.d.ts +0 -25
  182. package/dist/platform/process.d.ts.map +0 -1
  183. package/dist/platform/process.js +0 -179
  184. package/dist/platform/process.js.map +0 -1
  185. package/dist/progress.d.ts +0 -44
  186. package/dist/progress.d.ts.map +0 -1
  187. package/dist/progress.js +0 -123
  188. package/dist/progress.js.map +0 -1
  189. package/dist/qa/diff.d.ts +0 -10
  190. package/dist/qa/diff.d.ts.map +0 -1
  191. package/dist/qa/diff.js +0 -91
  192. package/dist/qa/diff.js.map +0 -1
  193. package/dist/qa/server.d.ts +0 -10
  194. package/dist/qa/server.d.ts.map +0 -1
  195. package/dist/qa/server.js +0 -127
  196. package/dist/qa/server.js.map +0 -1
  197. package/dist/scaffold/adoption.d.ts +0 -17
  198. package/dist/scaffold/adoption.d.ts.map +0 -1
  199. package/dist/scaffold/adoption.js +0 -279
  200. package/dist/scaffold/adoption.js.map +0 -1
  201. package/dist/scaffold/legacy.d.ts +0 -4
  202. package/dist/scaffold/legacy.d.ts.map +0 -1
  203. package/dist/scaffold/legacy.js +0 -139
  204. package/dist/scaffold/legacy.js.map +0 -1
  205. package/dist/scaffold/routes.d.ts +0 -3
  206. package/dist/scaffold/routes.d.ts.map +0 -1
  207. package/dist/scaffold/routes.js +0 -37
  208. package/dist/scaffold/routes.js.map +0 -1
  209. package/dist/scaffold/standalone.d.ts +0 -7
  210. package/dist/scaffold/standalone.d.ts.map +0 -1
  211. package/dist/scaffold/standalone.js +0 -294
  212. package/dist/scaffold/standalone.js.map +0 -1
  213. package/dist/scaffold/templates.d.ts +0 -8
  214. package/dist/scaffold/templates.d.ts.map +0 -1
  215. package/dist/scaffold/templates.js +0 -312
  216. package/dist/scaffold/templates.js.map +0 -1
  217. package/dist/scaffold/write.d.ts +0 -2
  218. package/dist/scaffold/write.d.ts.map +0 -1
  219. package/dist/scaffold/write.js +0 -38
  220. package/dist/scaffold/write.js.map +0 -1
  221. package/dist/telemetry/store.d.ts +0 -33
  222. package/dist/telemetry/store.d.ts.map +0 -1
  223. package/dist/telemetry/store.js +0 -75
  224. package/dist/telemetry/store.js.map +0 -1
  225. package/dist/verify/runner.d.ts +0 -15
  226. package/dist/verify/runner.d.ts.map +0 -1
  227. package/dist/verify/runner.js +0 -112
  228. package/dist/verify/runner.js.map +0 -1
  229. package/docs/agent-audit.md +0 -24
@@ -0,0 +1,116 @@
1
+ import postcss, { CssSyntaxError } from "postcss";
2
+ const LITERAL_COLOR_REGEX = /#[\da-f]{3,8}\b|\b(?:rgb|hsl|oklch|lab|lch|hwb|color|color-mix)a?\(/i;
3
+ const FIXED_FRAME_REGEX = /^(?:375|390|414|768|810|834|1024|1280|1440|1920)px$/i;
4
+ export function auditCssContracts(sources) {
5
+ const errors = [];
6
+ const warnings = [];
7
+ const parsedRoots = sources.map(({ file, css }) => {
8
+ try {
9
+ return { file, root: postcss.parse(css, { from: file }) };
10
+ }
11
+ catch (error) {
12
+ errors.push({
13
+ file,
14
+ line: error instanceof CssSyntaxError ? (error.line ?? 1) : 1,
15
+ selector: "<stylesheet>",
16
+ rule: "css-syntax",
17
+ severity: "error",
18
+ value: "",
19
+ message: error instanceof Error ? error.message : String(error),
20
+ });
21
+ return { file, root: postcss.root() };
22
+ }
23
+ });
24
+ const declaredTokens = new Set();
25
+ for (const { root } of parsedRoots) {
26
+ root.walkDecls(/^--/, (decl) => {
27
+ declaredTokens.add(decl.prop);
28
+ });
29
+ }
30
+ for (const { file, root } of parsedRoots) {
31
+ const isCanonicalTokenFile = file.replaceAll("\\", "/") === "src/styles/tokens.css";
32
+ root.walkDecls((decl) => {
33
+ const line = decl.source?.start?.line ?? 1;
34
+ const selector = decl.parent?.type === "rule"
35
+ ? decl.parent.selector
36
+ : `@${decl.parent.name ?? "at-rule"}`;
37
+ const addError = (rule, value, message) => {
38
+ errors.push({
39
+ file,
40
+ line,
41
+ selector,
42
+ rule,
43
+ severity: "error",
44
+ value,
45
+ message,
46
+ });
47
+ };
48
+ const addWarn = (rule, value, message) => {
49
+ warnings.push({
50
+ file,
51
+ line,
52
+ selector,
53
+ rule,
54
+ severity: "warn",
55
+ value,
56
+ message,
57
+ });
58
+ };
59
+ // Check for undefined custom properties
60
+ for (const match of decl.value.matchAll(/var\(\s*(--[\w-]+)\s*([,)])/g)) {
61
+ const tokenName = match[1];
62
+ const hasFallback = match[2] === ",";
63
+ if (!declaredTokens.has(tokenName) && !hasFallback) {
64
+ addError("undefined-token", tokenName, `Undefined token '${tokenName}' consumed without fallback.`);
65
+ }
66
+ }
67
+ // Check at-rules
68
+ let inFontFace = false;
69
+ let inThemeAtRule = false;
70
+ let p = decl.parent;
71
+ while (p) {
72
+ if (p.type === "atrule") {
73
+ if (p.name === "font-face")
74
+ inFontFace = true;
75
+ if (p.name === "theme")
76
+ inThemeAtRule = true;
77
+ }
78
+ p = p.parent;
79
+ }
80
+ const isExempt = inFontFace || (isCanonicalTokenFile && inThemeAtRule);
81
+ if (!isExempt) {
82
+ // 1. Literal color check
83
+ if (LITERAL_COLOR_REGEX.test(decl.value)) {
84
+ addError("literal-color", decl.value, "Literal color bypasses token palette. Define in src/styles/tokens.css and consume via semantic token or utility.");
85
+ }
86
+ // 2. Font family check
87
+ if (decl.prop === "font-family" &&
88
+ !/^(?:var\(--font-[\w-]+\)|inherit|system-ui)$/i.test(decl.value.trim())) {
89
+ addError("font-role", decl.value, "Use semantic font tokens (e.g. var(--font-display), var(--font-body)) instead of raw font families.");
90
+ }
91
+ // 3. Font size scale check
92
+ if (decl.prop === "font-size" &&
93
+ selector !== "html" &&
94
+ !/^(?:var\(--text-[\w-]+\)|inherit|0)$/i.test(decl.value.trim())) {
95
+ addError("font-size-token", decl.value, `Hardcoded font size '${decl.value}'. Consume semantic fluid scale tokens (var(--text-*)).`);
96
+ }
97
+ // 4. Fixed frame warning (WARN, not error, to accommodate device mockups)
98
+ if (/^(?:width|max-width|min-width|height)$/i.test(decl.prop) &&
99
+ FIXED_FRAME_REGEX.test(decl.value.trim())) {
100
+ addWarn("fixed-frame-dimension", decl.value, `Fixed canvas/mockup dimension '${decl.value}'. Ensure this is a deliberate device frame/mockup and not an unsemantic design-tool transcription.`);
101
+ }
102
+ }
103
+ // 5. Transition all check (always prohibited for mobile performance)
104
+ if (/^(?:transition|transition-property)$/i.test(decl.prop) &&
105
+ /(?:^|[\s,])all(?:$|[\s,])/i.test(decl.value)) {
106
+ addError("transition-all", decl.value, `'transition: all' degrades GPU performance. Declare explicit transition properties (e.g. transition-colors, transition-transform).`);
107
+ }
108
+ });
109
+ }
110
+ return {
111
+ errors,
112
+ warnings,
113
+ totalViolations: errors.length + warnings.length,
114
+ };
115
+ }
116
+ //# sourceMappingURL=contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.js","sourceRoot":"","sources":["../../src/qa/contract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export * from "./a11y.js";
2
+ export * from "./breakpoints.js";
3
+ export * from "./contract.js";
4
+ export * from "./probe.js";
5
+ export * from "./runner.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/qa/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC"}
@@ -0,0 +1,6 @@
1
+ export * from "./a11y.js";
2
+ export * from "./breakpoints.js";
3
+ export * from "./contract.js";
4
+ export * from "./probe.js";
5
+ export * from "./runner.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/qa/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC"}
@@ -0,0 +1,48 @@
1
+ export interface ProbeIssue {
2
+ selector: string;
3
+ text?: string;
4
+ problem?: string;
5
+ family?: string;
6
+ weight?: string;
7
+ size?: string | number;
8
+ width?: number;
9
+ height?: number;
10
+ left?: number;
11
+ right?: number;
12
+ viewport?: number;
13
+ ancestor?: string;
14
+ value?: string;
15
+ policy?: string;
16
+ animation?: string;
17
+ duration?: string;
18
+ line?: {
19
+ left: number;
20
+ right: number;
21
+ top: number;
22
+ bottom: number;
23
+ };
24
+ }
25
+ export interface ProbeResult {
26
+ url: string;
27
+ viewport: {
28
+ width: number;
29
+ height: number;
30
+ };
31
+ loadedFonts: string[];
32
+ issues: {
33
+ overflow: ProbeIssue[];
34
+ clipping: ProbeIssue[];
35
+ typography: ProbeIssue[];
36
+ shadows: ProbeIssue[];
37
+ targets: ProbeIssue[];
38
+ semantics: ProbeIssue[];
39
+ motion: ProbeIssue[];
40
+ };
41
+ }
42
+ /**
43
+ * Executes entirely inside browser context; zero screenshots, pixel comparisons,
44
+ * or external dependencies. Analyzes live DOM geometry, font metrics, and WCAG rules.
45
+ */
46
+ export declare function probeDOM(): ProbeResult;
47
+ export declare const PROBE_DOM_FN_STRING: string;
48
+ //# sourceMappingURL=probe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"probe.d.ts","sourceRoot":"","sources":["../../src/qa/probe.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CACrE;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,EAAE;QACN,QAAQ,EAAE,UAAU,EAAE,CAAC;QACvB,QAAQ,EAAE,UAAU,EAAE,CAAC;QACvB,UAAU,EAAE,UAAU,EAAE,CAAC;QACzB,OAAO,EAAE,UAAU,EAAE,CAAC;QACtB,OAAO,EAAE,UAAU,EAAE,CAAC;QACtB,SAAS,EAAE,UAAU,EAAE,CAAC;QACxB,MAAM,EAAE,UAAU,EAAE,CAAC;KACtB,CAAC;CACH;AAED;;;GAGG;AACH,wBAAgB,QAAQ,IAAI,WAAW,CAoPtC;AAED,eAAO,MAAM,mBAAmB,QAAsB,CAAC"}
@@ -0,0 +1,206 @@
1
+ /**
2
+ * Executes entirely inside browser context; zero screenshots, pixel comparisons,
3
+ * or external dependencies. Analyzes live DOM geometry, font metrics, and WCAG rules.
4
+ */
5
+ export function probeDOM() {
6
+ const issues = {
7
+ overflow: [],
8
+ clipping: [],
9
+ typography: [],
10
+ shadows: [],
11
+ targets: [],
12
+ semantics: [],
13
+ motion: [],
14
+ };
15
+ const identify = (el) => {
16
+ if (el.id)
17
+ return `#${el.id}`;
18
+ const classes = Array.from(el.classList);
19
+ return `${el.tagName.toLowerCase()}${classes.map((c) => `.${c}`).join("")}`;
20
+ };
21
+ const visible = (el) => {
22
+ if ("checkVisibility" in el && typeof el.checkVisibility === "function") {
23
+ if (!el.checkVisibility({
24
+ checkOpacity: true,
25
+ checkVisibilityCSS: true,
26
+ })) {
27
+ return false;
28
+ }
29
+ }
30
+ const rect = el.getBoundingClientRect();
31
+ return Boolean(rect.width && rect.height);
32
+ };
33
+ const ignored = (el) => {
34
+ return Boolean(el.closest('[aria-hidden="true"], [inert]'));
35
+ };
36
+ const add = (rule, el, detail) => {
37
+ const textSnippet = el.textContent?.trim().slice(0, 80);
38
+ issues[rule].push({
39
+ selector: identify(el),
40
+ text: textSnippet,
41
+ ...detail,
42
+ });
43
+ };
44
+ const root = document.documentElement;
45
+ if (root.scrollWidth > window.innerWidth + 1) {
46
+ issues.overflow.push({
47
+ selector: "html",
48
+ width: root.scrollWidth,
49
+ viewport: window.innerWidth,
50
+ problem: "page-horizontal-overflow",
51
+ });
52
+ }
53
+ const rootStyle = window.getComputedStyle(root);
54
+ const allowedFonts = ["--font-display", "--font-body", "--font-interface"].map((name) => rootStyle.getPropertyValue(name).trim().split(",")[0].replace(/["']/g, "").trim());
55
+ const fontSet = document.fonts;
56
+ const loadedFonts = [];
57
+ if (fontSet) {
58
+ for (const f of fontSet) {
59
+ if (f.status === "loaded") {
60
+ loadedFonts.push(f.family.replace(/["']/g, ""));
61
+ }
62
+ if (f.status === "error") {
63
+ issues.typography.push({
64
+ selector: "@font-face",
65
+ problem: "font-load-error",
66
+ family: f.family,
67
+ weight: f.weight,
68
+ });
69
+ }
70
+ }
71
+ }
72
+ const ids = new Set();
73
+ const elements = document.querySelectorAll("body *");
74
+ for (const el of Array.from(elements)) {
75
+ if (el.id) {
76
+ if (ids.has(el.id)) {
77
+ add("semantics", el, { problem: "duplicate-id" });
78
+ }
79
+ ids.add(el.id);
80
+ }
81
+ if (!visible(el) || ignored(el))
82
+ continue;
83
+ const style = window.getComputedStyle(el);
84
+ const rect = el.getBoundingClientRect();
85
+ // Accessible offscreen text is intentionally clipped (.sr-only or skip-link), not a defect
86
+ if ((rect.width <= 1 &&
87
+ rect.height <= 1 &&
88
+ (style.clip !== "auto" || style.clipPath !== "none")) ||
89
+ el.matches(".sr-only, .skip-link:not(:focus)")) {
90
+ continue;
91
+ }
92
+ const directText = Array.from(el.childNodes).filter((n) => n.nodeType === Node.TEXT_NODE && (n.textContent?.trim() ?? "").length > 0);
93
+ const meaningful = directText.length > 0 || el.matches("img, input, select, textarea, button, svg, canvas");
94
+ // Local scroll containers are legitimate reflow exceptions
95
+ let scrollContainer = null;
96
+ let parent = el.parentElement;
97
+ while (parent && parent !== document.body) {
98
+ const parentStyle = window.getComputedStyle(parent);
99
+ if (/(auto|scroll)/.test(parentStyle.overflowX) &&
100
+ parent.scrollWidth > parent.clientWidth + 1) {
101
+ scrollContainer = parent;
102
+ break;
103
+ }
104
+ parent = parent.parentElement;
105
+ }
106
+ if (meaningful && !scrollContainer && (rect.left < -1 || rect.right > window.innerWidth + 1)) {
107
+ add("overflow", el, {
108
+ left: rect.left,
109
+ right: rect.right,
110
+ viewport: window.innerWidth,
111
+ problem: "element-outside-viewport",
112
+ });
113
+ }
114
+ if (directText.length > 0) {
115
+ const size = Number.parseFloat(style.fontSize);
116
+ const family = style.fontFamily.split(",")[0].replace(/["']/g, "").trim();
117
+ if (size < 11.9) {
118
+ add("typography", el, { problem: "project-font-floor-12px", size });
119
+ }
120
+ if (allowedFonts.length > 0 &&
121
+ allowedFonts.some((f) => f.length > 0) &&
122
+ !allowedFonts.includes(family) &&
123
+ !family.includes("sans-serif") &&
124
+ !family.includes("system-ui")) {
125
+ add("typography", el, { problem: "non-token-font-family", family });
126
+ }
127
+ // Check text clipping against overflow:hidden / clip ancestors
128
+ for (const node of directText) {
129
+ const range = document.createRange();
130
+ range.selectNodeContents(node);
131
+ const clientRects = Array.from(range.getClientRects());
132
+ for (const line of clientRects) {
133
+ let ancestor = el.parentElement;
134
+ while (ancestor && ancestor !== document.documentElement) {
135
+ const aStyle = window.getComputedStyle(ancestor);
136
+ const aRect = ancestor.getBoundingClientRect();
137
+ const clipX = /^(hidden|clip)$/.test(aStyle.overflowX);
138
+ const clipY = /^(hidden|clip)$/.test(aStyle.overflowY);
139
+ if ((clipX && (line.left < aRect.left - 2 || line.right > aRect.right + 2)) ||
140
+ (clipY && (line.top < aRect.top - 2 || line.bottom > aRect.bottom + 2))) {
141
+ add("clipping", el, {
142
+ ancestor: identify(ancestor),
143
+ problem: "text-range-outside-clip",
144
+ line: {
145
+ left: line.left,
146
+ right: line.right,
147
+ top: line.top,
148
+ bottom: line.bottom,
149
+ },
150
+ });
151
+ break;
152
+ }
153
+ ancestor = ancestor.parentElement;
154
+ }
155
+ }
156
+ }
157
+ }
158
+ // Input font floor: 16px minimum on mobile prevents iOS auto-zoom
159
+ if (el.matches("input:not([type=hidden]):not([type=checkbox]):not([type=radio]), select, textarea") &&
160
+ Number.parseFloat(style.fontSize) < 16) {
161
+ add("typography", el, {
162
+ problem: "input-font-floor-16px",
163
+ size: style.fontSize,
164
+ });
165
+ }
166
+ // Touch targets: minimum 24px for standalone interactive controls (WCAG 2.5.8)
167
+ if (el.matches("button, input[type=button], input[type=submit], input[type=range], .btn") &&
168
+ (rect.width < 24 || rect.height < 24)) {
169
+ add("targets", el, {
170
+ width: rect.width,
171
+ height: rect.height,
172
+ policy: "24px-min-standalone-target",
173
+ });
174
+ }
175
+ // Prefers reduced motion check
176
+ if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) {
177
+ if (style.scrollBehavior === "smooth") {
178
+ add("motion", el, { problem: "smooth-scroll-under-reduced-motion" });
179
+ }
180
+ const durations = style.animationDuration.split(",").map(Number.parseFloat);
181
+ if (style.animationName !== "none" && durations.some((d) => d > 0.01)) {
182
+ add("motion", el, {
183
+ animation: style.animationName,
184
+ duration: style.animationDuration,
185
+ problem: "active-animation-under-reduced-motion",
186
+ });
187
+ }
188
+ }
189
+ }
190
+ // Deduplicate issues
191
+ for (const key of Object.keys(issues)) {
192
+ const map = new Map();
193
+ for (const item of issues[key]) {
194
+ map.set(JSON.stringify(item), item);
195
+ }
196
+ issues[key] = Array.from(map.values());
197
+ }
198
+ return {
199
+ url: window.location.pathname,
200
+ viewport: { width: window.innerWidth, height: window.innerHeight },
201
+ loadedFonts,
202
+ issues: issues,
203
+ };
204
+ }
205
+ export const PROBE_DOM_FN_STRING = probeDOM.toString();
206
+ //# sourceMappingURL=probe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"probe.js","sourceRoot":"","sources":["../../src/qa/probe.ts"],"names":[],"mappings":"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"}
@@ -1,37 +1,32 @@
1
- import type { MozoleConfig } from "../config/project.js";
2
- export interface QaIssue {
3
- viewport: string;
4
- route: string;
5
- kind: string;
6
- evidence: string;
1
+ import { type ProbeIssue } from "./probe.js";
2
+ export interface ViewportConfig {
3
+ height: number;
4
+ name?: string;
5
+ width: number;
7
6
  }
8
- export interface VisualDiff {
9
- viewport: string;
10
- route: string;
11
- ratio: number;
12
- changedPixels: number;
13
- totalPixels: number;
14
- diffPath: string;
7
+ export interface LiveProbeOptions {
8
+ cwd?: string;
9
+ port?: number;
10
+ routes?: string[];
11
+ saveTraceOnFailure?: boolean;
12
+ staticDir?: string;
13
+ tracePath?: string;
14
+ viewports?: ViewportConfig[];
15
15
  }
16
- export declare function formatVisualDiff(diff: VisualDiff): string;
17
- export interface QaSummary {
18
- passed: boolean;
19
- issues: QaIssue[];
20
- viewports: string[];
21
- consoleErrors: number;
22
- failedRequests: number;
23
- overflows: number;
24
- brokenLinks: number;
25
- probes: number;
26
- screenshots: number;
27
- visualDiffs: VisualDiff[];
28
- output: string;
16
+ export interface LiveProbeFinding {
17
+ issue: ProbeIssue;
18
+ route: string;
19
+ rule: string;
20
+ viewport: ViewportConfig;
29
21
  }
30
- export interface QaMode {
31
- interactive: boolean;
32
- visual: boolean;
33
- diff?: boolean | undefined;
22
+ export interface LiveProbeSummary {
23
+ browserName: string;
24
+ durationMs: number;
25
+ findings: LiveProbeFinding[];
26
+ routesChecked: string[];
27
+ success: boolean;
28
+ traceSavedTo?: string;
29
+ viewportsChecked: ViewportConfig[];
34
30
  }
35
- export declare function visualArtifactSlug(route: string): string;
36
- export declare function runQa(root: string, config: MozoleConfig, mode: QaMode, signal?: AbortSignal): Promise<QaSummary>;
31
+ export declare function runLiveGeometryProbe(options?: LiveProbeOptions): Promise<LiveProbeSummary>;
37
32
  //# 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":"AASA,OAAO,EAAE,KAAK,UAAU,EAA8B,MAAM,YAAY,CAAC;AAEzE,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,UAAU,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,cAAc,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,cAAc,EAAE,CAAC;CACpC;AAsKD,wBAAsB,oBAAoB,CACxC,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,gBAAgB,CAAC,CA2M3B"}