@etus/seven-skill 0.1.0-beta.3 → 0.1.0-beta.5

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 (596) hide show
  1. package/.agents/skills/seven/SKILL.md +172 -0
  2. package/.agents/skills/seven/agents/seven_asset_producer.toml +37 -0
  3. package/.agents/skills/seven/agents/seven_finish_reviewer.toml +33 -0
  4. package/.agents/skills/seven/agents/seven_manual_edit_applier.toml +43 -0
  5. package/.agents/skills/seven/reference/adapt.md +34 -0
  6. package/.agents/skills/seven/reference/animate.md +31 -0
  7. package/.agents/skills/seven/reference/app-shell.md +152 -0
  8. package/.agents/skills/seven/reference/audit.md +122 -0
  9. package/.agents/skills/seven/reference/bolder.md +34 -0
  10. package/.agents/skills/seven/reference/brand.md +31 -0
  11. package/.agents/skills/seven/reference/clarify.md +76 -0
  12. package/.agents/skills/seven/reference/color-and-contrast.md +84 -0
  13. package/.agents/skills/seven/reference/colorize.md +31 -0
  14. package/.agents/skills/seven/reference/critique.md +53 -0
  15. package/.agents/skills/seven/reference/delight.md +30 -0
  16. package/.agents/skills/seven/reference/distill.md +30 -0
  17. package/.agents/skills/seven/reference/doctor.md +9 -0
  18. package/.agents/skills/seven/reference/document.md +36 -0
  19. package/.agents/skills/seven/reference/evaluations.md +44 -0
  20. package/.agents/skills/seven/reference/exceptions.md +7 -0
  21. package/.agents/skills/seven/reference/extract.md +42 -0
  22. package/.agents/skills/seven/reference/harden.md +36 -0
  23. package/.agents/skills/seven/reference/hooks.md +11 -0
  24. package/.agents/skills/seven/reference/init.md +5 -0
  25. package/.agents/skills/seven/reference/layout.md +33 -0
  26. package/.agents/skills/seven/reference/live.md +106 -0
  27. package/.agents/skills/seven/reference/motion-design.md +71 -0
  28. package/.agents/skills/seven/reference/onboard.md +35 -0
  29. package/.agents/skills/seven/reference/optimize.md +34 -0
  30. package/.agents/skills/seven/reference/overdrive.md +32 -0
  31. package/.agents/skills/seven/reference/polish.md +55 -0
  32. package/.agents/skills/seven/reference/product.md +43 -0
  33. package/.agents/skills/seven/reference/quieter.md +31 -0
  34. package/.agents/skills/seven/reference/routing.md +28 -0
  35. package/.agents/skills/seven/reference/setup.md +38 -0
  36. package/.agents/skills/seven/reference/shape.md +85 -0
  37. package/.agents/skills/seven/reference/spatial-design.md +60 -0
  38. package/.agents/skills/seven/reference/typeset.md +28 -0
  39. package/.agents/skills/seven/reference/typography.md +43 -0
  40. package/.agents/skills/seven/reference/ux-writing.md +47 -0
  41. package/.agents/skills/seven/reference/visual-probes.md +36 -0
  42. package/.agents/skills/seven/scripts/context-signals.mjs +95 -0
  43. package/.agents/skills/seven/scripts/critique-storage.mjs +155 -0
  44. package/.agents/skills/seven/scripts/load-context.mjs +111 -0
  45. package/.agents/skills/seven/scripts/run-seven.mjs +47 -0
  46. package/.agents/skills/seven/scripts/update-check.mjs +120 -0
  47. package/.claude/agents/seven-asset-producer.md +40 -0
  48. package/.claude/agents/seven-finish-reviewer.md +36 -0
  49. package/.claude/agents/seven-manual-edit-applier.md +46 -0
  50. package/.claude/skills/seven/SKILL.md +134 -123
  51. package/.claude/skills/seven/reference/adapt.md +34 -0
  52. package/.claude/skills/seven/reference/animate.md +31 -0
  53. package/.claude/skills/seven/reference/app-shell.md +100 -18
  54. package/.claude/skills/seven/reference/audit.md +6 -4
  55. package/.claude/skills/seven/reference/bolder.md +34 -0
  56. package/.claude/skills/seven/reference/brand.md +21 -14
  57. package/.claude/skills/seven/reference/clarify.md +2 -2
  58. package/.claude/skills/seven/reference/colorize.md +31 -0
  59. package/.claude/skills/seven/reference/critique.md +53 -0
  60. package/.claude/skills/seven/reference/delight.md +30 -0
  61. package/.claude/skills/seven/reference/distill.md +30 -0
  62. package/.claude/skills/seven/reference/doctor.md +9 -0
  63. package/.claude/skills/seven/reference/document.md +36 -0
  64. package/.claude/skills/seven/reference/evaluations.md +44 -0
  65. package/.claude/skills/seven/reference/exceptions.md +7 -0
  66. package/.claude/skills/seven/reference/extract.md +42 -0
  67. package/.claude/skills/seven/reference/harden.md +36 -0
  68. package/.claude/skills/seven/reference/hooks.md +11 -0
  69. package/.claude/skills/seven/reference/init.md +5 -0
  70. package/.claude/skills/seven/reference/layout.md +33 -0
  71. package/.claude/skills/seven/reference/live.md +106 -0
  72. package/.claude/skills/seven/reference/motion-design.md +1 -1
  73. package/.claude/skills/seven/reference/onboard.md +35 -0
  74. package/.claude/skills/seven/reference/optimize.md +34 -0
  75. package/.claude/skills/seven/reference/overdrive.md +32 -0
  76. package/.claude/skills/seven/reference/polish.md +5 -5
  77. package/.claude/skills/seven/reference/product.md +2 -4
  78. package/.claude/skills/seven/reference/quieter.md +31 -0
  79. package/.claude/skills/seven/reference/routing.md +28 -0
  80. package/.claude/skills/seven/reference/setup.md +38 -0
  81. package/.claude/skills/seven/reference/shape.md +5 -5
  82. package/.claude/skills/seven/reference/spatial-design.md +3 -3
  83. package/.claude/skills/seven/reference/typeset.md +28 -0
  84. package/.claude/skills/seven/reference/typography.md +1 -1
  85. package/.claude/skills/seven/reference/visual-probes.md +36 -0
  86. package/.claude/skills/seven/scripts/context-signals.mjs +95 -0
  87. package/.claude/skills/seven/scripts/critique-storage.mjs +155 -0
  88. package/.claude/skills/seven/scripts/load-context.mjs +85 -58
  89. package/.claude/skills/seven/scripts/run-seven.mjs +47 -0
  90. package/.claude/skills/seven/scripts/update-check.mjs +120 -0
  91. package/.claude-plugin/marketplace.json +2 -2
  92. package/.claude-plugin/plugin.json +8 -3
  93. package/.cursor/skills/seven/SKILL.md +172 -0
  94. package/.cursor/skills/seven/reference/adapt.md +34 -0
  95. package/.cursor/skills/seven/reference/animate.md +31 -0
  96. package/.cursor/skills/seven/reference/app-shell.md +152 -0
  97. package/.cursor/skills/seven/reference/audit.md +122 -0
  98. package/.cursor/skills/seven/reference/bolder.md +34 -0
  99. package/.cursor/skills/seven/reference/brand.md +31 -0
  100. package/.cursor/skills/seven/reference/clarify.md +76 -0
  101. package/.cursor/skills/seven/reference/color-and-contrast.md +84 -0
  102. package/.cursor/skills/seven/reference/colorize.md +31 -0
  103. package/.cursor/skills/seven/reference/critique.md +53 -0
  104. package/.cursor/skills/seven/reference/delight.md +30 -0
  105. package/.cursor/skills/seven/reference/distill.md +30 -0
  106. package/.cursor/skills/seven/reference/doctor.md +9 -0
  107. package/.cursor/skills/seven/reference/document.md +36 -0
  108. package/.cursor/skills/seven/reference/evaluations.md +44 -0
  109. package/.cursor/skills/seven/reference/exceptions.md +7 -0
  110. package/.cursor/skills/seven/reference/extract.md +42 -0
  111. package/.cursor/skills/seven/reference/harden.md +36 -0
  112. package/.cursor/skills/seven/reference/hooks.md +11 -0
  113. package/.cursor/skills/seven/reference/init.md +5 -0
  114. package/.cursor/skills/seven/reference/layout.md +33 -0
  115. package/.cursor/skills/seven/reference/live.md +106 -0
  116. package/.cursor/skills/seven/reference/motion-design.md +71 -0
  117. package/.cursor/skills/seven/reference/onboard.md +35 -0
  118. package/.cursor/skills/seven/reference/optimize.md +34 -0
  119. package/.cursor/skills/seven/reference/overdrive.md +32 -0
  120. package/.cursor/skills/seven/reference/polish.md +55 -0
  121. package/.cursor/skills/seven/reference/product.md +43 -0
  122. package/.cursor/skills/seven/reference/quieter.md +31 -0
  123. package/.cursor/skills/seven/reference/routing.md +28 -0
  124. package/.cursor/skills/seven/reference/setup.md +38 -0
  125. package/.cursor/skills/seven/reference/shape.md +85 -0
  126. package/.cursor/skills/seven/reference/spatial-design.md +60 -0
  127. package/.cursor/skills/seven/reference/typeset.md +28 -0
  128. package/.cursor/skills/seven/reference/typography.md +43 -0
  129. package/.cursor/skills/seven/reference/ux-writing.md +47 -0
  130. package/.cursor/skills/seven/reference/visual-probes.md +36 -0
  131. package/.cursor/skills/seven/scripts/context-signals.mjs +95 -0
  132. package/.cursor/skills/seven/scripts/critique-storage.mjs +155 -0
  133. package/.cursor/skills/seven/scripts/load-context.mjs +111 -0
  134. package/.cursor/skills/seven/scripts/run-seven.mjs +47 -0
  135. package/.cursor/skills/seven/scripts/update-check.mjs +120 -0
  136. package/.gemini/skills/seven/SKILL.md +171 -0
  137. package/.gemini/skills/seven/reference/adapt.md +34 -0
  138. package/.gemini/skills/seven/reference/animate.md +31 -0
  139. package/.gemini/skills/seven/reference/app-shell.md +152 -0
  140. package/.gemini/skills/seven/reference/audit.md +122 -0
  141. package/.gemini/skills/seven/reference/bolder.md +34 -0
  142. package/.gemini/skills/seven/reference/brand.md +31 -0
  143. package/.gemini/skills/seven/reference/clarify.md +76 -0
  144. package/.gemini/skills/seven/reference/color-and-contrast.md +84 -0
  145. package/.gemini/skills/seven/reference/colorize.md +31 -0
  146. package/.gemini/skills/seven/reference/critique.md +53 -0
  147. package/.gemini/skills/seven/reference/delight.md +30 -0
  148. package/.gemini/skills/seven/reference/distill.md +30 -0
  149. package/.gemini/skills/seven/reference/doctor.md +9 -0
  150. package/.gemini/skills/seven/reference/document.md +36 -0
  151. package/.gemini/skills/seven/reference/evaluations.md +44 -0
  152. package/.gemini/skills/seven/reference/exceptions.md +7 -0
  153. package/.gemini/skills/seven/reference/extract.md +42 -0
  154. package/.gemini/skills/seven/reference/harden.md +36 -0
  155. package/.gemini/skills/seven/reference/hooks.md +11 -0
  156. package/.gemini/skills/seven/reference/init.md +5 -0
  157. package/.gemini/skills/seven/reference/layout.md +33 -0
  158. package/.gemini/skills/seven/reference/live.md +106 -0
  159. package/.gemini/skills/seven/reference/motion-design.md +71 -0
  160. package/.gemini/skills/seven/reference/onboard.md +35 -0
  161. package/.gemini/skills/seven/reference/optimize.md +34 -0
  162. package/.gemini/skills/seven/reference/overdrive.md +32 -0
  163. package/.gemini/skills/seven/reference/polish.md +55 -0
  164. package/.gemini/skills/seven/reference/product.md +43 -0
  165. package/.gemini/skills/seven/reference/quieter.md +31 -0
  166. package/.gemini/skills/seven/reference/routing.md +28 -0
  167. package/.gemini/skills/seven/reference/setup.md +38 -0
  168. package/.gemini/skills/seven/reference/shape.md +85 -0
  169. package/.gemini/skills/seven/reference/spatial-design.md +60 -0
  170. package/.gemini/skills/seven/reference/typeset.md +28 -0
  171. package/.gemini/skills/seven/reference/typography.md +43 -0
  172. package/.gemini/skills/seven/reference/ux-writing.md +47 -0
  173. package/.gemini/skills/seven/reference/visual-probes.md +36 -0
  174. package/.gemini/skills/seven/scripts/context-signals.mjs +95 -0
  175. package/.gemini/skills/seven/scripts/critique-storage.mjs +155 -0
  176. package/.gemini/skills/seven/scripts/load-context.mjs +111 -0
  177. package/.gemini/skills/seven/scripts/run-seven.mjs +47 -0
  178. package/.gemini/skills/seven/scripts/update-check.mjs +120 -0
  179. package/.grok/agents/seven-asset-producer.md +40 -0
  180. package/.grok/agents/seven-finish-reviewer.md +36 -0
  181. package/.grok/agents/seven-manual-edit-applier.md +46 -0
  182. package/.grok/skills/seven/SKILL.md +176 -0
  183. package/.grok/skills/seven/reference/adapt.md +34 -0
  184. package/.grok/skills/seven/reference/animate.md +31 -0
  185. package/.grok/skills/seven/reference/app-shell.md +152 -0
  186. package/.grok/skills/seven/reference/audit.md +122 -0
  187. package/.grok/skills/seven/reference/bolder.md +34 -0
  188. package/.grok/skills/seven/reference/brand.md +31 -0
  189. package/.grok/skills/seven/reference/clarify.md +76 -0
  190. package/.grok/skills/seven/reference/color-and-contrast.md +84 -0
  191. package/.grok/skills/seven/reference/colorize.md +31 -0
  192. package/.grok/skills/seven/reference/critique.md +53 -0
  193. package/.grok/skills/seven/reference/delight.md +30 -0
  194. package/.grok/skills/seven/reference/distill.md +30 -0
  195. package/.grok/skills/seven/reference/doctor.md +9 -0
  196. package/.grok/skills/seven/reference/document.md +36 -0
  197. package/.grok/skills/seven/reference/evaluations.md +44 -0
  198. package/.grok/skills/seven/reference/exceptions.md +7 -0
  199. package/.grok/skills/seven/reference/extract.md +42 -0
  200. package/.grok/skills/seven/reference/harden.md +36 -0
  201. package/.grok/skills/seven/reference/hooks.md +11 -0
  202. package/.grok/skills/seven/reference/init.md +5 -0
  203. package/.grok/skills/seven/reference/layout.md +33 -0
  204. package/.grok/skills/seven/reference/live.md +106 -0
  205. package/.grok/skills/seven/reference/motion-design.md +71 -0
  206. package/.grok/skills/seven/reference/onboard.md +35 -0
  207. package/.grok/skills/seven/reference/optimize.md +34 -0
  208. package/.grok/skills/seven/reference/overdrive.md +32 -0
  209. package/.grok/skills/seven/reference/polish.md +55 -0
  210. package/.grok/skills/seven/reference/product.md +43 -0
  211. package/.grok/skills/seven/reference/quieter.md +31 -0
  212. package/.grok/skills/seven/reference/routing.md +28 -0
  213. package/.grok/skills/seven/reference/setup.md +38 -0
  214. package/.grok/skills/seven/reference/shape.md +85 -0
  215. package/.grok/skills/seven/reference/spatial-design.md +60 -0
  216. package/.grok/skills/seven/reference/typeset.md +28 -0
  217. package/.grok/skills/seven/reference/typography.md +43 -0
  218. package/.grok/skills/seven/reference/ux-writing.md +47 -0
  219. package/.grok/skills/seven/reference/visual-probes.md +36 -0
  220. package/.grok/skills/seven/scripts/context-signals.mjs +95 -0
  221. package/.grok/skills/seven/scripts/critique-storage.mjs +155 -0
  222. package/.grok/skills/seven/scripts/load-context.mjs +111 -0
  223. package/.grok/skills/seven/scripts/run-seven.mjs +47 -0
  224. package/.grok/skills/seven/scripts/update-check.mjs +120 -0
  225. package/.kiro/skills/seven/SKILL.md +172 -0
  226. package/.kiro/skills/seven/reference/adapt.md +34 -0
  227. package/.kiro/skills/seven/reference/animate.md +31 -0
  228. package/.kiro/skills/seven/reference/app-shell.md +152 -0
  229. package/.kiro/skills/seven/reference/audit.md +122 -0
  230. package/.kiro/skills/seven/reference/bolder.md +34 -0
  231. package/.kiro/skills/seven/reference/brand.md +31 -0
  232. package/.kiro/skills/seven/reference/clarify.md +76 -0
  233. package/.kiro/skills/seven/reference/color-and-contrast.md +84 -0
  234. package/.kiro/skills/seven/reference/colorize.md +31 -0
  235. package/.kiro/skills/seven/reference/critique.md +53 -0
  236. package/.kiro/skills/seven/reference/delight.md +30 -0
  237. package/.kiro/skills/seven/reference/distill.md +30 -0
  238. package/.kiro/skills/seven/reference/doctor.md +9 -0
  239. package/.kiro/skills/seven/reference/document.md +36 -0
  240. package/.kiro/skills/seven/reference/evaluations.md +44 -0
  241. package/.kiro/skills/seven/reference/exceptions.md +7 -0
  242. package/.kiro/skills/seven/reference/extract.md +42 -0
  243. package/.kiro/skills/seven/reference/harden.md +36 -0
  244. package/.kiro/skills/seven/reference/hooks.md +11 -0
  245. package/.kiro/skills/seven/reference/init.md +5 -0
  246. package/.kiro/skills/seven/reference/layout.md +33 -0
  247. package/.kiro/skills/seven/reference/live.md +106 -0
  248. package/.kiro/skills/seven/reference/motion-design.md +71 -0
  249. package/.kiro/skills/seven/reference/onboard.md +35 -0
  250. package/.kiro/skills/seven/reference/optimize.md +34 -0
  251. package/.kiro/skills/seven/reference/overdrive.md +32 -0
  252. package/.kiro/skills/seven/reference/polish.md +55 -0
  253. package/.kiro/skills/seven/reference/product.md +43 -0
  254. package/.kiro/skills/seven/reference/quieter.md +31 -0
  255. package/.kiro/skills/seven/reference/routing.md +28 -0
  256. package/.kiro/skills/seven/reference/setup.md +38 -0
  257. package/.kiro/skills/seven/reference/shape.md +85 -0
  258. package/.kiro/skills/seven/reference/spatial-design.md +60 -0
  259. package/.kiro/skills/seven/reference/typeset.md +28 -0
  260. package/.kiro/skills/seven/reference/typography.md +43 -0
  261. package/.kiro/skills/seven/reference/ux-writing.md +47 -0
  262. package/.kiro/skills/seven/reference/visual-probes.md +36 -0
  263. package/.kiro/skills/seven/scripts/context-signals.mjs +95 -0
  264. package/.kiro/skills/seven/scripts/critique-storage.mjs +155 -0
  265. package/.kiro/skills/seven/scripts/load-context.mjs +111 -0
  266. package/.kiro/skills/seven/scripts/run-seven.mjs +47 -0
  267. package/.kiro/skills/seven/scripts/update-check.mjs +120 -0
  268. package/.opencode/skills/seven/SKILL.md +176 -0
  269. package/.opencode/skills/seven/reference/adapt.md +34 -0
  270. package/.opencode/skills/seven/reference/animate.md +31 -0
  271. package/.opencode/skills/seven/reference/app-shell.md +152 -0
  272. package/.opencode/skills/seven/reference/audit.md +122 -0
  273. package/.opencode/skills/seven/reference/bolder.md +34 -0
  274. package/.opencode/skills/seven/reference/brand.md +31 -0
  275. package/.opencode/skills/seven/reference/clarify.md +76 -0
  276. package/.opencode/skills/seven/reference/color-and-contrast.md +84 -0
  277. package/.opencode/skills/seven/reference/colorize.md +31 -0
  278. package/.opencode/skills/seven/reference/critique.md +53 -0
  279. package/.opencode/skills/seven/reference/delight.md +30 -0
  280. package/.opencode/skills/seven/reference/distill.md +30 -0
  281. package/.opencode/skills/seven/reference/doctor.md +9 -0
  282. package/.opencode/skills/seven/reference/document.md +36 -0
  283. package/.opencode/skills/seven/reference/evaluations.md +44 -0
  284. package/.opencode/skills/seven/reference/exceptions.md +7 -0
  285. package/.opencode/skills/seven/reference/extract.md +42 -0
  286. package/.opencode/skills/seven/reference/harden.md +36 -0
  287. package/.opencode/skills/seven/reference/hooks.md +11 -0
  288. package/.opencode/skills/seven/reference/init.md +5 -0
  289. package/.opencode/skills/seven/reference/layout.md +33 -0
  290. package/.opencode/skills/seven/reference/live.md +106 -0
  291. package/.opencode/skills/seven/reference/motion-design.md +71 -0
  292. package/.opencode/skills/seven/reference/onboard.md +35 -0
  293. package/.opencode/skills/seven/reference/optimize.md +34 -0
  294. package/.opencode/skills/seven/reference/overdrive.md +32 -0
  295. package/.opencode/skills/seven/reference/polish.md +55 -0
  296. package/.opencode/skills/seven/reference/product.md +43 -0
  297. package/.opencode/skills/seven/reference/quieter.md +31 -0
  298. package/.opencode/skills/seven/reference/routing.md +28 -0
  299. package/.opencode/skills/seven/reference/setup.md +38 -0
  300. package/.opencode/skills/seven/reference/shape.md +85 -0
  301. package/.opencode/skills/seven/reference/spatial-design.md +60 -0
  302. package/.opencode/skills/seven/reference/typeset.md +28 -0
  303. package/.opencode/skills/seven/reference/typography.md +43 -0
  304. package/.opencode/skills/seven/reference/ux-writing.md +47 -0
  305. package/.opencode/skills/seven/reference/visual-probes.md +36 -0
  306. package/.opencode/skills/seven/scripts/context-signals.mjs +95 -0
  307. package/.opencode/skills/seven/scripts/critique-storage.mjs +155 -0
  308. package/.opencode/skills/seven/scripts/load-context.mjs +111 -0
  309. package/.opencode/skills/seven/scripts/run-seven.mjs +47 -0
  310. package/.opencode/skills/seven/scripts/update-check.mjs +120 -0
  311. package/.pi/skills/seven/SKILL.md +174 -0
  312. package/.pi/skills/seven/reference/adapt.md +34 -0
  313. package/.pi/skills/seven/reference/animate.md +31 -0
  314. package/.pi/skills/seven/reference/app-shell.md +152 -0
  315. package/.pi/skills/seven/reference/audit.md +122 -0
  316. package/.pi/skills/seven/reference/bolder.md +34 -0
  317. package/.pi/skills/seven/reference/brand.md +31 -0
  318. package/.pi/skills/seven/reference/clarify.md +76 -0
  319. package/.pi/skills/seven/reference/color-and-contrast.md +84 -0
  320. package/.pi/skills/seven/reference/colorize.md +31 -0
  321. package/.pi/skills/seven/reference/critique.md +53 -0
  322. package/.pi/skills/seven/reference/delight.md +30 -0
  323. package/.pi/skills/seven/reference/distill.md +30 -0
  324. package/.pi/skills/seven/reference/doctor.md +9 -0
  325. package/.pi/skills/seven/reference/document.md +36 -0
  326. package/.pi/skills/seven/reference/evaluations.md +44 -0
  327. package/.pi/skills/seven/reference/exceptions.md +7 -0
  328. package/.pi/skills/seven/reference/extract.md +42 -0
  329. package/.pi/skills/seven/reference/harden.md +36 -0
  330. package/.pi/skills/seven/reference/hooks.md +11 -0
  331. package/.pi/skills/seven/reference/init.md +5 -0
  332. package/.pi/skills/seven/reference/layout.md +33 -0
  333. package/.pi/skills/seven/reference/live.md +106 -0
  334. package/.pi/skills/seven/reference/motion-design.md +71 -0
  335. package/.pi/skills/seven/reference/onboard.md +35 -0
  336. package/.pi/skills/seven/reference/optimize.md +34 -0
  337. package/.pi/skills/seven/reference/overdrive.md +32 -0
  338. package/.pi/skills/seven/reference/polish.md +55 -0
  339. package/.pi/skills/seven/reference/product.md +43 -0
  340. package/.pi/skills/seven/reference/quieter.md +31 -0
  341. package/.pi/skills/seven/reference/routing.md +28 -0
  342. package/.pi/skills/seven/reference/setup.md +38 -0
  343. package/.pi/skills/seven/reference/shape.md +85 -0
  344. package/.pi/skills/seven/reference/spatial-design.md +60 -0
  345. package/.pi/skills/seven/reference/typeset.md +28 -0
  346. package/.pi/skills/seven/reference/typography.md +43 -0
  347. package/.pi/skills/seven/reference/ux-writing.md +47 -0
  348. package/.pi/skills/seven/reference/visual-probes.md +36 -0
  349. package/.pi/skills/seven/scripts/context-signals.mjs +95 -0
  350. package/.pi/skills/seven/scripts/critique-storage.mjs +155 -0
  351. package/.pi/skills/seven/scripts/load-context.mjs +111 -0
  352. package/.pi/skills/seven/scripts/run-seven.mjs +47 -0
  353. package/.pi/skills/seven/scripts/update-check.mjs +120 -0
  354. package/.qoder/skills/seven/SKILL.md +176 -0
  355. package/.qoder/skills/seven/reference/adapt.md +34 -0
  356. package/.qoder/skills/seven/reference/animate.md +31 -0
  357. package/.qoder/skills/seven/reference/app-shell.md +152 -0
  358. package/.qoder/skills/seven/reference/audit.md +122 -0
  359. package/.qoder/skills/seven/reference/bolder.md +34 -0
  360. package/.qoder/skills/seven/reference/brand.md +31 -0
  361. package/.qoder/skills/seven/reference/clarify.md +76 -0
  362. package/.qoder/skills/seven/reference/color-and-contrast.md +84 -0
  363. package/.qoder/skills/seven/reference/colorize.md +31 -0
  364. package/.qoder/skills/seven/reference/critique.md +53 -0
  365. package/.qoder/skills/seven/reference/delight.md +30 -0
  366. package/.qoder/skills/seven/reference/distill.md +30 -0
  367. package/.qoder/skills/seven/reference/doctor.md +9 -0
  368. package/.qoder/skills/seven/reference/document.md +36 -0
  369. package/.qoder/skills/seven/reference/evaluations.md +44 -0
  370. package/.qoder/skills/seven/reference/exceptions.md +7 -0
  371. package/.qoder/skills/seven/reference/extract.md +42 -0
  372. package/.qoder/skills/seven/reference/harden.md +36 -0
  373. package/.qoder/skills/seven/reference/hooks.md +11 -0
  374. package/.qoder/skills/seven/reference/init.md +5 -0
  375. package/.qoder/skills/seven/reference/layout.md +33 -0
  376. package/.qoder/skills/seven/reference/live.md +106 -0
  377. package/.qoder/skills/seven/reference/motion-design.md +71 -0
  378. package/.qoder/skills/seven/reference/onboard.md +35 -0
  379. package/.qoder/skills/seven/reference/optimize.md +34 -0
  380. package/.qoder/skills/seven/reference/overdrive.md +32 -0
  381. package/.qoder/skills/seven/reference/polish.md +55 -0
  382. package/.qoder/skills/seven/reference/product.md +43 -0
  383. package/.qoder/skills/seven/reference/quieter.md +31 -0
  384. package/.qoder/skills/seven/reference/routing.md +28 -0
  385. package/.qoder/skills/seven/reference/setup.md +38 -0
  386. package/.qoder/skills/seven/reference/shape.md +85 -0
  387. package/.qoder/skills/seven/reference/spatial-design.md +60 -0
  388. package/.qoder/skills/seven/reference/typeset.md +28 -0
  389. package/.qoder/skills/seven/reference/typography.md +43 -0
  390. package/.qoder/skills/seven/reference/ux-writing.md +47 -0
  391. package/.qoder/skills/seven/reference/visual-probes.md +36 -0
  392. package/.qoder/skills/seven/scripts/context-signals.mjs +95 -0
  393. package/.qoder/skills/seven/scripts/critique-storage.mjs +155 -0
  394. package/.qoder/skills/seven/scripts/load-context.mjs +111 -0
  395. package/.qoder/skills/seven/scripts/run-seven.mjs +47 -0
  396. package/.qoder/skills/seven/scripts/update-check.mjs +120 -0
  397. package/.rovodev/skills/seven/SKILL.md +176 -0
  398. package/.rovodev/skills/seven/reference/adapt.md +34 -0
  399. package/.rovodev/skills/seven/reference/animate.md +31 -0
  400. package/.rovodev/skills/seven/reference/app-shell.md +152 -0
  401. package/.rovodev/skills/seven/reference/audit.md +122 -0
  402. package/.rovodev/skills/seven/reference/bolder.md +34 -0
  403. package/.rovodev/skills/seven/reference/brand.md +31 -0
  404. package/.rovodev/skills/seven/reference/clarify.md +76 -0
  405. package/.rovodev/skills/seven/reference/color-and-contrast.md +84 -0
  406. package/.rovodev/skills/seven/reference/colorize.md +31 -0
  407. package/.rovodev/skills/seven/reference/critique.md +53 -0
  408. package/.rovodev/skills/seven/reference/delight.md +30 -0
  409. package/.rovodev/skills/seven/reference/distill.md +30 -0
  410. package/.rovodev/skills/seven/reference/doctor.md +9 -0
  411. package/.rovodev/skills/seven/reference/document.md +36 -0
  412. package/.rovodev/skills/seven/reference/evaluations.md +44 -0
  413. package/.rovodev/skills/seven/reference/exceptions.md +7 -0
  414. package/.rovodev/skills/seven/reference/extract.md +42 -0
  415. package/.rovodev/skills/seven/reference/harden.md +36 -0
  416. package/.rovodev/skills/seven/reference/hooks.md +11 -0
  417. package/.rovodev/skills/seven/reference/init.md +5 -0
  418. package/.rovodev/skills/seven/reference/layout.md +33 -0
  419. package/.rovodev/skills/seven/reference/live.md +106 -0
  420. package/.rovodev/skills/seven/reference/motion-design.md +71 -0
  421. package/.rovodev/skills/seven/reference/onboard.md +35 -0
  422. package/.rovodev/skills/seven/reference/optimize.md +34 -0
  423. package/.rovodev/skills/seven/reference/overdrive.md +32 -0
  424. package/.rovodev/skills/seven/reference/polish.md +55 -0
  425. package/.rovodev/skills/seven/reference/product.md +43 -0
  426. package/.rovodev/skills/seven/reference/quieter.md +31 -0
  427. package/.rovodev/skills/seven/reference/routing.md +28 -0
  428. package/.rovodev/skills/seven/reference/setup.md +38 -0
  429. package/.rovodev/skills/seven/reference/shape.md +85 -0
  430. package/.rovodev/skills/seven/reference/spatial-design.md +60 -0
  431. package/.rovodev/skills/seven/reference/typeset.md +28 -0
  432. package/.rovodev/skills/seven/reference/typography.md +43 -0
  433. package/.rovodev/skills/seven/reference/ux-writing.md +47 -0
  434. package/.rovodev/skills/seven/reference/visual-probes.md +36 -0
  435. package/.rovodev/skills/seven/scripts/context-signals.mjs +95 -0
  436. package/.rovodev/skills/seven/scripts/critique-storage.mjs +155 -0
  437. package/.rovodev/skills/seven/scripts/load-context.mjs +111 -0
  438. package/.rovodev/skills/seven/scripts/run-seven.mjs +47 -0
  439. package/.rovodev/skills/seven/scripts/update-check.mjs +120 -0
  440. package/.trae/skills/seven/SKILL.md +174 -0
  441. package/.trae/skills/seven/reference/adapt.md +34 -0
  442. package/.trae/skills/seven/reference/animate.md +31 -0
  443. package/.trae/skills/seven/reference/app-shell.md +152 -0
  444. package/.trae/skills/seven/reference/audit.md +122 -0
  445. package/.trae/skills/seven/reference/bolder.md +34 -0
  446. package/.trae/skills/seven/reference/brand.md +31 -0
  447. package/.trae/skills/seven/reference/clarify.md +76 -0
  448. package/.trae/skills/seven/reference/color-and-contrast.md +84 -0
  449. package/.trae/skills/seven/reference/colorize.md +31 -0
  450. package/.trae/skills/seven/reference/critique.md +53 -0
  451. package/.trae/skills/seven/reference/delight.md +30 -0
  452. package/.trae/skills/seven/reference/distill.md +30 -0
  453. package/.trae/skills/seven/reference/doctor.md +9 -0
  454. package/.trae/skills/seven/reference/document.md +36 -0
  455. package/.trae/skills/seven/reference/evaluations.md +44 -0
  456. package/.trae/skills/seven/reference/exceptions.md +7 -0
  457. package/.trae/skills/seven/reference/extract.md +42 -0
  458. package/.trae/skills/seven/reference/harden.md +36 -0
  459. package/.trae/skills/seven/reference/hooks.md +11 -0
  460. package/.trae/skills/seven/reference/init.md +5 -0
  461. package/.trae/skills/seven/reference/layout.md +33 -0
  462. package/.trae/skills/seven/reference/live.md +106 -0
  463. package/.trae/skills/seven/reference/motion-design.md +71 -0
  464. package/.trae/skills/seven/reference/onboard.md +35 -0
  465. package/.trae/skills/seven/reference/optimize.md +34 -0
  466. package/.trae/skills/seven/reference/overdrive.md +32 -0
  467. package/.trae/skills/seven/reference/polish.md +55 -0
  468. package/.trae/skills/seven/reference/product.md +43 -0
  469. package/.trae/skills/seven/reference/quieter.md +31 -0
  470. package/.trae/skills/seven/reference/routing.md +28 -0
  471. package/.trae/skills/seven/reference/setup.md +38 -0
  472. package/.trae/skills/seven/reference/shape.md +85 -0
  473. package/.trae/skills/seven/reference/spatial-design.md +60 -0
  474. package/.trae/skills/seven/reference/typeset.md +28 -0
  475. package/.trae/skills/seven/reference/typography.md +43 -0
  476. package/.trae/skills/seven/reference/ux-writing.md +47 -0
  477. package/.trae/skills/seven/reference/visual-probes.md +36 -0
  478. package/.trae/skills/seven/scripts/context-signals.mjs +95 -0
  479. package/.trae/skills/seven/scripts/critique-storage.mjs +155 -0
  480. package/.trae/skills/seven/scripts/load-context.mjs +111 -0
  481. package/.trae/skills/seven/scripts/run-seven.mjs +47 -0
  482. package/.trae/skills/seven/scripts/update-check.mjs +120 -0
  483. package/.trae-cn/skills/seven/SKILL.md +174 -0
  484. package/.trae-cn/skills/seven/reference/adapt.md +34 -0
  485. package/.trae-cn/skills/seven/reference/animate.md +31 -0
  486. package/.trae-cn/skills/seven/reference/app-shell.md +152 -0
  487. package/.trae-cn/skills/seven/reference/audit.md +122 -0
  488. package/.trae-cn/skills/seven/reference/bolder.md +34 -0
  489. package/.trae-cn/skills/seven/reference/brand.md +31 -0
  490. package/.trae-cn/skills/seven/reference/clarify.md +76 -0
  491. package/.trae-cn/skills/seven/reference/color-and-contrast.md +84 -0
  492. package/.trae-cn/skills/seven/reference/colorize.md +31 -0
  493. package/.trae-cn/skills/seven/reference/critique.md +53 -0
  494. package/.trae-cn/skills/seven/reference/delight.md +30 -0
  495. package/.trae-cn/skills/seven/reference/distill.md +30 -0
  496. package/.trae-cn/skills/seven/reference/doctor.md +9 -0
  497. package/.trae-cn/skills/seven/reference/document.md +36 -0
  498. package/.trae-cn/skills/seven/reference/evaluations.md +44 -0
  499. package/.trae-cn/skills/seven/reference/exceptions.md +7 -0
  500. package/.trae-cn/skills/seven/reference/extract.md +42 -0
  501. package/.trae-cn/skills/seven/reference/harden.md +36 -0
  502. package/.trae-cn/skills/seven/reference/hooks.md +11 -0
  503. package/.trae-cn/skills/seven/reference/init.md +5 -0
  504. package/.trae-cn/skills/seven/reference/layout.md +33 -0
  505. package/.trae-cn/skills/seven/reference/live.md +106 -0
  506. package/.trae-cn/skills/seven/reference/motion-design.md +71 -0
  507. package/.trae-cn/skills/seven/reference/onboard.md +35 -0
  508. package/.trae-cn/skills/seven/reference/optimize.md +34 -0
  509. package/.trae-cn/skills/seven/reference/overdrive.md +32 -0
  510. package/.trae-cn/skills/seven/reference/polish.md +55 -0
  511. package/.trae-cn/skills/seven/reference/product.md +43 -0
  512. package/.trae-cn/skills/seven/reference/quieter.md +31 -0
  513. package/.trae-cn/skills/seven/reference/routing.md +28 -0
  514. package/.trae-cn/skills/seven/reference/setup.md +38 -0
  515. package/.trae-cn/skills/seven/reference/shape.md +85 -0
  516. package/.trae-cn/skills/seven/reference/spatial-design.md +60 -0
  517. package/.trae-cn/skills/seven/reference/typeset.md +28 -0
  518. package/.trae-cn/skills/seven/reference/typography.md +43 -0
  519. package/.trae-cn/skills/seven/reference/ux-writing.md +47 -0
  520. package/.trae-cn/skills/seven/reference/visual-probes.md +36 -0
  521. package/.trae-cn/skills/seven/scripts/context-signals.mjs +95 -0
  522. package/.trae-cn/skills/seven/scripts/critique-storage.mjs +155 -0
  523. package/.trae-cn/skills/seven/scripts/load-context.mjs +111 -0
  524. package/.trae-cn/skills/seven/scripts/run-seven.mjs +47 -0
  525. package/.trae-cn/skills/seven/scripts/update-check.mjs +120 -0
  526. package/.vibe/skills/seven/SKILL.md +175 -0
  527. package/.vibe/skills/seven/reference/adapt.md +34 -0
  528. package/.vibe/skills/seven/reference/animate.md +31 -0
  529. package/.vibe/skills/seven/reference/app-shell.md +152 -0
  530. package/.vibe/skills/seven/reference/audit.md +122 -0
  531. package/.vibe/skills/seven/reference/bolder.md +34 -0
  532. package/.vibe/skills/seven/reference/brand.md +31 -0
  533. package/.vibe/skills/seven/reference/clarify.md +76 -0
  534. package/.vibe/skills/seven/reference/color-and-contrast.md +84 -0
  535. package/.vibe/skills/seven/reference/colorize.md +31 -0
  536. package/.vibe/skills/seven/reference/critique.md +53 -0
  537. package/.vibe/skills/seven/reference/delight.md +30 -0
  538. package/.vibe/skills/seven/reference/distill.md +30 -0
  539. package/.vibe/skills/seven/reference/doctor.md +9 -0
  540. package/.vibe/skills/seven/reference/document.md +36 -0
  541. package/.vibe/skills/seven/reference/evaluations.md +44 -0
  542. package/.vibe/skills/seven/reference/exceptions.md +7 -0
  543. package/.vibe/skills/seven/reference/extract.md +42 -0
  544. package/.vibe/skills/seven/reference/harden.md +36 -0
  545. package/.vibe/skills/seven/reference/hooks.md +11 -0
  546. package/.vibe/skills/seven/reference/init.md +5 -0
  547. package/.vibe/skills/seven/reference/layout.md +33 -0
  548. package/.vibe/skills/seven/reference/live.md +106 -0
  549. package/.vibe/skills/seven/reference/motion-design.md +71 -0
  550. package/.vibe/skills/seven/reference/onboard.md +35 -0
  551. package/.vibe/skills/seven/reference/optimize.md +34 -0
  552. package/.vibe/skills/seven/reference/overdrive.md +32 -0
  553. package/.vibe/skills/seven/reference/polish.md +55 -0
  554. package/.vibe/skills/seven/reference/product.md +43 -0
  555. package/.vibe/skills/seven/reference/quieter.md +31 -0
  556. package/.vibe/skills/seven/reference/routing.md +28 -0
  557. package/.vibe/skills/seven/reference/setup.md +38 -0
  558. package/.vibe/skills/seven/reference/shape.md +85 -0
  559. package/.vibe/skills/seven/reference/spatial-design.md +60 -0
  560. package/.vibe/skills/seven/reference/typeset.md +28 -0
  561. package/.vibe/skills/seven/reference/typography.md +43 -0
  562. package/.vibe/skills/seven/reference/ux-writing.md +47 -0
  563. package/.vibe/skills/seven/reference/visual-probes.md +36 -0
  564. package/.vibe/skills/seven/scripts/context-signals.mjs +95 -0
  565. package/.vibe/skills/seven/scripts/critique-storage.mjs +155 -0
  566. package/.vibe/skills/seven/scripts/load-context.mjs +111 -0
  567. package/.vibe/skills/seven/scripts/run-seven.mjs +47 -0
  568. package/.vibe/skills/seven/scripts/update-check.mjs +120 -0
  569. package/README.md +53 -88
  570. package/cli/bin/seven.mjs +0 -0
  571. package/cli/engine/browser/injected/index.mjs +62 -13
  572. package/cli/engine/detect-antipatterns-browser.js +4739 -19
  573. package/cli/engine/detect-antipatterns.mjs +1 -0
  574. package/cli/engine/engines/browser/detect-url.mjs +366 -3
  575. package/cli/engine/engines/regex/detect-text.mjs +469 -1
  576. package/cli/engine/engines/static-html/detect-html.mjs +131 -0
  577. package/cli/engine/registry/seven-antipatterns.mjs +379 -4
  578. package/cli/engine/rules/checks.mjs +360 -1
  579. package/cli/engine/shared/tokens.mjs +19 -0
  580. package/cli/engine/token-data.generated.mjs +4025 -0
  581. package/docs/detector-rules.md +277 -38
  582. package/docs/upstream-parity.json +242 -0
  583. package/extension/README.md +5 -0
  584. package/extension/background/service-worker.js +134 -0
  585. package/extension/content/content-script.js +340 -0
  586. package/extension/detector/detect.js +7816 -0
  587. package/extension/devtools/devtools.html +1 -0
  588. package/extension/devtools/devtools.js +3 -0
  589. package/extension/devtools/panel.css +66 -0
  590. package/extension/devtools/panel.html +3 -0
  591. package/extension/devtools/panel.js +37 -0
  592. package/extension/manifest.json +22 -0
  593. package/extension/popup/popup.css +106 -0
  594. package/extension/popup/popup.html +27 -0
  595. package/extension/popup/popup.js +74 -0
  596. package/package.json +19 -8
@@ -22,6 +22,7 @@ export {
22
22
  } from './registry/seven-antipatterns.mjs'
23
23
  export { CHECKS, runChecks } from './rules/checks.mjs'
24
24
  export { finding } from './findings.mjs'
25
+ export { allTokenVars, browserTokenProfile, isKnownTokenVar } from './shared/tokens.mjs'
25
26
  export { detectText } from './engines/regex/detect-text.mjs'
26
27
  export { detectHtml } from './engines/static-html/detect-html.mjs'
27
28
  export { detectUrl, createBrowserDetector } from './engines/browser/detect-url.mjs'
@@ -7,6 +7,7 @@ import path from 'node:path'
7
7
  import { fileURLToPath } from 'node:url'
8
8
 
9
9
  import { finding } from '../../findings.mjs'
10
+ import { browserTokenProfile } from '../../shared/tokens.mjs'
10
11
 
11
12
  // ─── Browser engine ─────────────────────────────────────────────────────────
12
13
  // Live-URL detector. Renders the page with Puppeteer (an optionalDependency),
@@ -46,6 +47,361 @@ function launchArgs() {
46
47
  return process.env['CI'] ? ['--no-sandbox', '--disable-setuid-sandbox'] : []
47
48
  }
48
49
 
50
+ const RUNTIME_RULE_IDS = new Set([
51
+ 'broken-image',
52
+ 'script-error',
53
+ 'content-hidden-at-rest',
54
+ 'edge-flush-cards',
55
+ 'text-occlusion',
56
+ 'heading-rhythm',
57
+ 'text-overflow',
58
+ 'clipped-overflow-container',
59
+ 'design-system-font',
60
+ 'design-system-color',
61
+ 'design-system-radius',
62
+ 'design-system-font-size',
63
+ 'first-viewport-column-overflow',
64
+ 'undersized-ui-text',
65
+ 'repeated-container-text',
66
+ 'gpt-thin-border-wide-shadow',
67
+ ])
68
+
69
+ async function scanRuntimeQuality(page, restrict = null) {
70
+ const enabled = restrict && restrict.length > 0
71
+ ? restrict.filter((id) => RUNTIME_RULE_IDS.has(id))
72
+ : [...RUNTIME_RULE_IDS]
73
+ if (enabled.length === 0) return []
74
+
75
+ return page.evaluate(async ({ enabledRules, tokens }) => {
76
+ const enabled = new Set(enabledRules)
77
+ const results = []
78
+ const seen = new Set()
79
+ const push = (type, detail) => {
80
+ if (!enabled.has(type)) return
81
+ const key = `${type}|${detail}`
82
+ if (seen.has(key)) return
83
+ seen.add(key)
84
+ if (results.filter((item) => item.type === type).length < 20) results.push({ type, detail })
85
+ }
86
+ const label = (element) => {
87
+ if (!element || !element.tagName) return 'element'
88
+ const id = element.id ? `#${element.id}` : ''
89
+ const classes = [...element.classList].slice(0, 2).map((name) => `.${name}`).join('')
90
+ return `${element.tagName.toLowerCase()}${id}${classes}`
91
+ }
92
+ const directText = (element) => [...element.childNodes]
93
+ .filter((node) => node.nodeType === Node.TEXT_NODE)
94
+ .map((node) => node.textContent || '')
95
+ .join(' ')
96
+ .replace(/\s+/g, ' ')
97
+ .trim()
98
+ const structurallyVisible = (element, includeTransparent = false) => {
99
+ for (let current = element; current; current = current.parentElement) {
100
+ if (current.hidden || current.getAttribute('aria-hidden') === 'true') return false
101
+ const style = getComputedStyle(current)
102
+ if (style.display === 'none' || style.visibility === 'collapse') return false
103
+ if (!includeTransparent && (style.visibility === 'hidden' || Number(style.opacity) <= 0.01)) return false
104
+ }
105
+ return true
106
+ }
107
+ const waitFrame = () => new Promise((resolve) => requestAnimationFrame(() => requestAnimationFrame(resolve)))
108
+
109
+ if (enabled.has('content-hidden-at-rest')) {
110
+ const originalBehavior = document.documentElement.style.scrollBehavior
111
+ document.documentElement.style.scrollBehavior = 'auto'
112
+ const maxScroll = Math.max(0, document.documentElement.scrollHeight - innerHeight)
113
+ const steps = Math.min(16, Math.max(1, Math.ceil(maxScroll / Math.max(innerHeight * 0.8, 400))))
114
+ for (let index = 0; index <= steps; index++) {
115
+ scrollTo(0, Math.round((maxScroll * index) / steps))
116
+ await waitFrame()
117
+ }
118
+ scrollTo(0, 0)
119
+ await waitFrame()
120
+ document.documentElement.style.scrollBehavior = originalBehavior
121
+
122
+ const walker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT)
123
+ let totalChars = 0
124
+ let hiddenChars = 0
125
+ const samples = []
126
+ let node
127
+ while ((node = walker.nextNode())) {
128
+ const text = (node.textContent || '').replace(/\s+/g, ' ').trim()
129
+ if (!text || text.length < 2) continue
130
+ const owner = node.parentElement
131
+ if (!owner || /^(script|style|noscript|template)$/i.test(owner.tagName)) continue
132
+ if (!structurallyVisible(owner, true)) continue
133
+ totalChars += text.length
134
+ let hidden = false
135
+ for (let current = owner; current; current = current.parentElement) {
136
+ const style = getComputedStyle(current)
137
+ if (style.visibility === 'hidden' || Number(style.opacity) <= 0.01 || style.contentVisibility === 'hidden') {
138
+ hidden = true
139
+ break
140
+ }
141
+ }
142
+ if (hidden) {
143
+ hiddenChars += text.length
144
+ if (samples.length < 2) samples.push(text.slice(0, 60))
145
+ }
146
+ }
147
+ if (totalChars >= 200 && hiddenChars >= 150 && hiddenChars / totalChars > 0.3) {
148
+ push('content-hidden-at-rest', `${Math.round((hiddenChars / totalChars) * 100)}% of page text remains hidden after reveal (${hiddenChars}/${totalChars} chars${samples[0] ? `; “${samples[0]}”` : ''})`)
149
+ }
150
+ }
151
+
152
+ if (enabled.has('broken-image')) {
153
+ for (const image of document.images) {
154
+ const source = image.currentSrc || image.getAttribute('src') || ''
155
+ if (!source || /^(?:#|about:blank)$|(?:placehold|placeholder|example)\./i.test(source) || (image.complete && image.naturalWidth === 0)) {
156
+ push('broken-image', `${label(image)} has no loadable image source${source ? ` (${source.slice(0, 100)})` : ''}`)
157
+ }
158
+ }
159
+ }
160
+
161
+ const elements = [...document.body.querySelectorAll('*')].slice(0, 6000)
162
+
163
+ if (enabled.has('text-overflow')) {
164
+ const skipped = new Set(['PRE', 'CODE', 'TEXTAREA', 'SVG', 'CANVAS', 'SELECT', 'OPTION'])
165
+ for (const element of elements) {
166
+ if (skipped.has(element.tagName) || !directText(element) || !structurallyVisible(element)) continue
167
+ const style = getComputedStyle(element)
168
+ if (/(auto|scroll)/.test(`${style.overflow} ${style.overflowX}`)) continue
169
+ let scrollAncestor = false
170
+ for (let parent = element.parentElement; parent; parent = parent.parentElement) {
171
+ const parentStyle = getComputedStyle(parent)
172
+ if (/(auto|scroll)/.test(`${parentStyle.overflow} ${parentStyle.overflowX}`)) {
173
+ scrollAncestor = true
174
+ break
175
+ }
176
+ }
177
+ if (scrollAncestor) continue
178
+ const overflow = element.clientWidth > 0 ? element.scrollWidth - element.clientWidth : 0
179
+ if (overflow >= 16) push('text-overflow', `${label(element)} overflows its box by ${Math.round(overflow)}px`)
180
+ }
181
+ }
182
+
183
+ if (enabled.has('clipped-overflow-container')) {
184
+ for (const container of elements) {
185
+ const style = getComputedStyle(container)
186
+ if (!/(hidden|clip)/.test(`${style.overflow} ${style.overflowX} ${style.overflowY}`)) continue
187
+ const containerRect = container.getBoundingClientRect()
188
+ if (containerRect.width < 8 || containerRect.height < 8) continue
189
+ for (const child of container.querySelectorAll('*')) {
190
+ const childStyle = getComputedStyle(child)
191
+ if (childStyle.position !== 'absolute') continue
192
+ if (!directText(child) && child.getAttribute('role') !== 'menu' && !/tooltip|popover|menu/i.test(`${child.className} ${child.getAttribute('data-slot') || ''}`)) continue
193
+ const childRect = child.getBoundingClientRect()
194
+ const escapes = childRect.left < containerRect.left - 2 || childRect.right > containerRect.right + 2 || childRect.top < containerRect.top - 2 || childRect.bottom > containerRect.bottom + 2
195
+ if (escapes) {
196
+ push('clipped-overflow-container', `${label(container)} clips positioned ${label(child)}`)
197
+ break
198
+ }
199
+ }
200
+ }
201
+ }
202
+
203
+ if (enabled.has('edge-flush-cards')) {
204
+ for (const scroller of elements) {
205
+ const style = getComputedStyle(scroller)
206
+ if (scroller.scrollWidth <= scroller.clientWidth + 8 || !/(auto|scroll)/.test(`${style.overflowX} ${style.overflow}`)) continue
207
+ const scrollerRect = scroller.getBoundingClientRect()
208
+ const children = [...scroller.children].filter((child) => {
209
+ const rect = child.getBoundingClientRect()
210
+ return rect.width > 80 && rect.right > scrollerRect.left && rect.left < scrollerRect.right
211
+ })
212
+ if (children.length === 0) continue
213
+ const first = children.sort((left, right) => left.getBoundingClientRect().left - right.getBoundingClientRect().left)[0]
214
+ const firstRect = first.getBoundingClientRect()
215
+ const radius = parseFloat(getComputedStyle(first).borderRadius) || 0
216
+ const inset = firstRect.left - scrollerRect.left
217
+ if (radius >= 4 && inset >= -2 && inset < 4 && (parseFloat(style.paddingLeft) || 0) < 4) {
218
+ push('edge-flush-cards', `${label(first)} is flush against the left edge of ${label(scroller)} (${Math.round(inset)}px inset)`)
219
+ }
220
+ }
221
+ }
222
+
223
+ if (enabled.has('heading-rhythm')) {
224
+ for (const heading of document.querySelectorAll('h2,h3,h4,h5,h6')) {
225
+ if (!structurallyVisible(heading)) continue
226
+ const previous = heading.previousElementSibling
227
+ const next = heading.nextElementSibling
228
+ if (!previous || !next || !structurallyVisible(previous) || !structurallyVisible(next)) continue
229
+ const headingRect = heading.getBoundingClientRect()
230
+ const previousRect = previous.getBoundingClientRect()
231
+ const nextRect = next.getBoundingClientRect()
232
+ const above = headingRect.top - previousRect.bottom
233
+ const below = nextRect.top - headingRect.bottom
234
+ if (above >= -1 && below >= 0 && above <= below + 2) {
235
+ push('heading-rhythm', `${label(heading)} has ${Math.round(above)}px above and ${Math.round(below)}px below; it reads with the previous block`)
236
+ }
237
+ }
238
+ }
239
+
240
+ if (enabled.has('text-occlusion')) {
241
+ for (const element of elements) {
242
+ const text = directText(element)
243
+ if (text.length < 6 || !structurallyVisible(element)) continue
244
+ const rect = element.getBoundingClientRect()
245
+ if (rect.width < 20 || rect.height < 10 || rect.bottom < 0 || rect.top > innerHeight) continue
246
+ const points = [
247
+ [rect.left + Math.min(6, rect.width / 2), rect.top + rect.height / 2],
248
+ [rect.left + rect.width / 2, rect.top + rect.height / 2],
249
+ [rect.right - Math.min(6, rect.width / 2), rect.top + rect.height / 2],
250
+ ]
251
+ const blockers = []
252
+ for (const [x, y] of points) {
253
+ if (x < 0 || y < 0 || x > innerWidth || y > innerHeight) continue
254
+ const top = document.elementFromPoint(x, y)
255
+ if (!top || top === element || element.contains(top) || top.contains(element)) continue
256
+ const blockerStyle = getComputedStyle(top)
257
+ const background = blockerStyle.backgroundColor || ''
258
+ const transparent = background === 'transparent' || /rgba\([^)]*,\s*0(?:\.0+)?\s*\)/.test(background)
259
+ if (!transparent && Number(blockerStyle.opacity) > 0.5) blockers.push(top)
260
+ }
261
+ if (blockers.length >= 2) push('text-occlusion', `${label(element)} text “${text.slice(0, 45)}” is covered by ${label(blockers[0])}`)
262
+ }
263
+ }
264
+
265
+ if (enabled.has('undersized-ui-text')) {
266
+ const functional = document.querySelectorAll('a,button,label,th,td,time,option,summary,[role="button"],[role="link"],[role="menuitem"],[role="tab"]')
267
+ for (const element of functional) {
268
+ if (!structurallyVisible(element)) continue
269
+ const identity = `${element.className || ''} ${element.getAttribute('data-slot') || ''}`
270
+ if (/(?:sr-only|visually-hidden|legal|smallprint|code|terminal)/i.test(identity)) continue
271
+ const text = directText(element)
272
+ const size = parseFloat(getComputedStyle(element).fontSize)
273
+ if (!text || !Number.isFinite(size) || size >= 11 || size <= 0) continue
274
+ push('undersized-ui-text', `${label(element)} renders functional text at ${size}px: “${text.slice(0, 60)}”`)
275
+ }
276
+ }
277
+
278
+ if (enabled.has('gpt-thin-border-wide-shadow')) {
279
+ for (const element of elements) {
280
+ if (!structurallyVisible(element)) continue
281
+ const identity = `${element.className || ''} ${element.getAttribute('data-slot') || ''} ${element.getAttribute('role') || ''}`
282
+ if (/(?:dialog|popover|menu|tooltip|overlay)/i.test(identity)) continue
283
+ const style = getComputedStyle(element)
284
+ const borders = [style.borderTopWidth, style.borderRightWidth, style.borderBottomWidth, style.borderLeftWidth]
285
+ .map((value) => parseFloat(value) || 0)
286
+ .filter((value) => value > 0)
287
+ if (borders.length === 0 || Math.max(...borders) > 1.1 || !style.boxShadow || style.boxShadow === 'none') continue
288
+ const lengths = [...style.boxShadow.matchAll(/(-?[\d.]+)px/g)].map((match) => Math.abs(Number(match[1])))
289
+ if (lengths.length >= 3 && lengths[2] >= 16) {
290
+ push('gpt-thin-border-wide-shadow', `${label(element)} combines a ${Math.max(...borders)}px border with ${lengths[2]}px shadow blur`)
291
+ }
292
+ }
293
+ }
294
+
295
+ if (enabled.has('repeated-container-text')) {
296
+ for (const container of elements) {
297
+ const identity = `${container.className || ''} ${container.getAttribute('data-slot') || ''} ${container.getAttribute('role') || ''}`
298
+ if (!/(?:card|panel|dialog|sheet|sidebar|region)/i.test(identity) && !/^(ARTICLE|ASIDE)$/.test(container.tagName)) continue
299
+ const occurrences = new Map()
300
+ for (const element of container.querySelectorAll('span,p,small,strong,em,label,div')) {
301
+ const text = directText(element).toLocaleLowerCase('pt-BR')
302
+ if (text.length < 2 || text.length > 80) continue
303
+ const structure = `${element.tagName}.${String(element.className || '').split(/\s+/)[0] || ''}`
304
+ const entry = occurrences.get(text) || []
305
+ entry.push(structure)
306
+ occurrences.set(text, entry)
307
+ }
308
+ for (const [text, structures] of occurrences) {
309
+ if (structures.length < 3 || new Set(structures).size < 2) continue
310
+ push('repeated-container-text', `${label(container)} repeats “${text.slice(0, 60)}” ${structures.length} times`)
311
+ break
312
+ }
313
+ }
314
+ }
315
+
316
+ if (enabled.has('first-viewport-column-overflow')) {
317
+ const candidates = elements.filter((element) => {
318
+ if (!structurallyVisible(element)) return false
319
+ const rect = element.getBoundingClientRect()
320
+ if (rect.top < -20 || rect.top > innerHeight * 0.8 || rect.width < Math.min(640, innerWidth * 0.7)) return false
321
+ const style = getComputedStyle(element)
322
+ return style.display === 'grid' || style.display === 'flex'
323
+ })
324
+ for (const container of candidates) {
325
+ const children = [...container.children]
326
+ .map((element) => ({ element, rect: element.getBoundingClientRect() }))
327
+ .filter(({ rect }) => rect.width >= 180 && rect.height >= 80 && rect.top < innerHeight)
328
+ if (children.length < 2) continue
329
+ const row = children.filter(({ rect }) => Math.abs(rect.top - children[0].rect.top) <= 80)
330
+ if (row.length < 2) continue
331
+ const heights = row.map(({ rect }) => rect.height).sort((a, b) => a - b)
332
+ const shortest = heights[0]
333
+ const tallest = heights[heights.length - 1]
334
+ if (shortest <= innerHeight * 1.1 && tallest >= innerHeight * 1.5 && tallest - shortest >= innerHeight * 0.75) {
335
+ push('first-viewport-column-overflow', `${label(container)} opening columns are ${Math.round(shortest)}px and ${Math.round(tallest)}px tall in a ${innerHeight}px viewport`)
336
+ }
337
+ }
338
+ }
339
+
340
+ const profileRules = ['design-system-font', 'design-system-color', 'design-system-radius', 'design-system-font-size']
341
+ if (profileRules.some((rule) => enabled.has(rule))) {
342
+ const fonts = new Set(tokens.fontFamilies.map((font) => font.toLowerCase()))
343
+ const fontSizes = tokens.fontSizesPx
344
+ const radii = tokens.radiiPx
345
+ const closeTo = (value, values, tolerance = 0.2) => values.some((allowed) => Math.abs(value - allowed) <= tolerance)
346
+ const normalizedColor = (value) => String(value || '').toLowerCase().replace(/\s+/g, '')
347
+ const allowedColors = new Set()
348
+ if (enabled.has('design-system-color')) {
349
+ const probe = document.createElement('span')
350
+ probe.hidden = true
351
+ document.body.appendChild(probe)
352
+ for (const variable of tokens.colorVars) {
353
+ probe.style.color = 'rgb(1, 2, 3)'
354
+ probe.style.color = `var(${variable}, rgb(1, 2, 3))`
355
+ const resolved = normalizedColor(getComputedStyle(probe).color)
356
+ if (resolved && resolved !== 'rgb(1,2,3)') allowedColors.add(resolved)
357
+ }
358
+ probe.remove()
359
+ }
360
+ const reported = { font: new Set(), color: new Set(), radius: new Set(), size: new Set() }
361
+ for (const element of elements) {
362
+ if (!structurallyVisible(element)) continue
363
+ const style = getComputedStyle(element)
364
+ const text = directText(element)
365
+ if (enabled.has('design-system-font') && text) {
366
+ const primary = (style.fontFamily.split(',')[0] || '').replace(/["']/g, '').trim().toLowerCase()
367
+ if (primary && !fonts.has(primary) && !reported.font.has(primary)) {
368
+ reported.font.add(primary)
369
+ push('design-system-font', `${label(element)} uses ${primary}; allowed: ${[...fonts].join(', ')}`)
370
+ }
371
+ }
372
+ if (enabled.has('design-system-font-size') && text) {
373
+ const size = parseFloat(style.fontSize)
374
+ if (Number.isFinite(size) && !closeTo(size, fontSizes) && !reported.size.has(size)) {
375
+ reported.size.add(size)
376
+ push('design-system-font-size', `${label(element)} renders at ${size}px, outside the Seven type ramp`)
377
+ }
378
+ }
379
+ if (enabled.has('design-system-radius')) {
380
+ const radius = parseFloat(style.borderTopLeftRadius)
381
+ if (radius > 0 && !closeTo(radius, radii) && !reported.radius.has(radius)) {
382
+ reported.radius.add(radius)
383
+ push('design-system-radius', `${label(element)} renders with ${radius}px radius, outside the Seven scale`)
384
+ }
385
+ }
386
+ if (enabled.has('design-system-color') && allowedColors.size > 0) {
387
+ const candidates = []
388
+ if (text) candidates.push(['text', style.color])
389
+ if (style.backgroundColor && !/^(?:transparent|rgba\([^)]*,\s*0(?:\.0+)?\s*\))$/i.test(style.backgroundColor)) candidates.push(['background', style.backgroundColor])
390
+ for (const [kind, raw] of candidates) {
391
+ const color = normalizedColor(raw)
392
+ const key = `${kind}:${color}`
393
+ if (!color || allowedColors.has(color) || reported.color.has(key)) continue
394
+ reported.color.add(key)
395
+ push('design-system-color', `${label(element)} ${kind} resolves to ${raw}, outside the active Seven token palette`)
396
+ }
397
+ }
398
+ }
399
+ }
400
+
401
+ return results
402
+ }, { enabledRules: enabled, tokens: browserTokenProfile() })
403
+ }
404
+
49
405
  /**
50
406
  * Scan one already-loaded page: inject the bundle, run the in-browser
51
407
  * detector, normalize the findings. Shared by the one-shot and reusable paths.
@@ -58,7 +414,9 @@ async function scanPage(page, url, browserBundle, options = {}) {
58
414
  return window.sevenDetect()
59
415
  })
60
416
  const restrict = ruleIds || only
61
- let findings = raw.map((f) => finding(f.type, url, f.detail))
417
+ const runtime = await scanRuntimeQuality(page, restrict)
418
+ const pageErrors = (options.pageErrors || []).slice(0, 5).map((detail) => ({ type: 'script-error', detail }))
419
+ let findings = [...raw, ...runtime, ...pageErrors].map((f) => finding(f.type, url, f.detail))
62
420
  if (restrict && restrict.length > 0) {
63
421
  findings = findings.filter((f) => restrict.includes(f.antipattern))
64
422
  }
@@ -78,10 +436,15 @@ export async function createBrowserDetector(options = {}) {
78
436
  browser,
79
437
  async detectUrl(url, scanOptions = {}) {
80
438
  const page = await browser.newPage()
439
+ const pageErrors = []
440
+ page.on('pageerror', (error) => {
441
+ const message = String(error?.message || error).split('\n')[0].trim().slice(0, 200)
442
+ if (message && !pageErrors.includes(message)) pageErrors.push(message)
443
+ })
81
444
  try {
82
445
  await page.setViewport(viewport)
83
- await page.goto(url, { waitUntil: 'networkidle2', timeout: 30000 })
84
- return await scanPage(page, url, browserBundle, scanOptions)
446
+ await page.goto(url, { waitUntil: scanOptions.waitUntil || options.waitUntil || 'networkidle2', timeout: 30000 })
447
+ return await scanPage(page, url, browserBundle, { ...scanOptions, pageErrors })
85
448
  } finally {
86
449
  await page.close().catch(() => {})
87
450
  }