@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
@@ -0,0 +1,95 @@
1
+ #!/usr/bin/env node
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import { spawnSync } from 'node:child_process'
5
+ import fs from 'node:fs'
6
+ import path from 'node:path'
7
+ import { fileURLToPath } from 'node:url'
8
+
9
+ import { argValue, loadContext } from './load-context.mjs'
10
+
11
+ const UI_EXTENSIONS = new Set(['.css', '.html', '.js', '.jsx', '.less', '.mdx', '.scss', '.ts', '.tsx'])
12
+ const scriptsDirectory = path.dirname(fileURLToPath(import.meta.url))
13
+
14
+ function gitNames(root, args) {
15
+ const result = spawnSync('git', args, { cwd: root, encoding: 'utf8' })
16
+ if (result.status !== 0) return []
17
+ return result.stdout.split('\n').map((item) => item.trim()).filter(Boolean)
18
+ }
19
+
20
+ function changedUiFiles(root) {
21
+ const names = new Set([
22
+ ...gitNames(root, ['diff', '--name-only', '--diff-filter=ACMR']),
23
+ ...gitNames(root, ['diff', '--cached', '--name-only', '--diff-filter=ACMR']),
24
+ ...gitNames(root, ['ls-files', '--others', '--exclude-standard']),
25
+ ])
26
+ return [...names].filter((name) => UI_EXTENSIONS.has(path.extname(name).toLowerCase())).sort()
27
+ }
28
+
29
+ function latestReview(root) {
30
+ const directory = path.join(root, '.seven', 'reviews')
31
+ let names = []
32
+ try {
33
+ names = fs.readdirSync(directory).filter((name) => name.endsWith('.json'))
34
+ } catch {
35
+ return null
36
+ }
37
+ const candidates = names.map((name) => {
38
+ const filePath = path.join(directory, name)
39
+ try {
40
+ return { filePath, mtime: fs.statSync(filePath).mtimeMs, payload: JSON.parse(fs.readFileSync(filePath, 'utf8')) }
41
+ } catch {
42
+ return null
43
+ }
44
+ }).filter(Boolean).sort((left, right) => right.mtime - left.mtime)
45
+ if (!candidates[0]) return null
46
+ return {
47
+ path: path.relative(root, candidates[0].filePath).split(path.sep).join('/'),
48
+ createdAt: candidates[0].payload.createdAt || null,
49
+ score: candidates[0].payload.score ?? null,
50
+ p0: candidates[0].payload.summary?.p0 ?? 0,
51
+ p1: candidates[0].payload.summary?.p1 ?? 0,
52
+ target: candidates[0].payload.target || null,
53
+ }
54
+ }
55
+
56
+ function scanTargets(context, changed) {
57
+ if (changed.length > 0) return { via: 'git-changes', targets: changed.slice(0, 40) }
58
+ const roots = Array.isArray(context.project?.sourceRoots) ? context.project.sourceRoots : ['src']
59
+ const existing = roots.filter((entry) => fs.existsSync(path.join(context.projectRoot, entry)))
60
+ return { via: 'source-roots', targets: existing.slice(0, 8) }
61
+ }
62
+
63
+ export async function collectContextSignals(start = process.cwd(), { target = start } = {}) {
64
+ const context = await loadContext(start, { target })
65
+ const changed = changedUiFiles(context.projectRoot)
66
+ return {
67
+ schemaVersion: 1,
68
+ projectRoot: context.projectRoot,
69
+ target: path.resolve(target),
70
+ setup: {
71
+ hasProduct: context.hasProduct,
72
+ productPlaceholder: context.productPlaceholder,
73
+ hasRelease: Boolean(context.release),
74
+ register: context.register,
75
+ app: context.app?.id || null,
76
+ surface: context.surface?.id || null,
77
+ },
78
+ git: { changedFiles: changed },
79
+ critique: { latest: latestReview(context.projectRoot) },
80
+ scan: scanTargets(context, changed),
81
+ live: {
82
+ session: fs.existsSync(path.join(context.projectRoot, '.seven', 'live', 'session.json')),
83
+ journal: fs.existsSync(path.join(context.projectRoot, '.seven', 'live', 'journal.ndjson')),
84
+ extensionPathCommand: `node ${JSON.stringify(path.join(scriptsDirectory, 'run-seven.mjs'))} extension path`,
85
+ },
86
+ }
87
+ }
88
+
89
+ export async function main(argv = process.argv) {
90
+ const target = argValue('--target', argv) || process.env.SEVEN_TARGET || process.cwd()
91
+ const signals = await collectContextSignals(target, { target })
92
+ process.stdout.write(`${JSON.stringify(signals, null, 2)}\n`)
93
+ }
94
+
95
+ if (process.argv[1] && path.resolve(process.argv[1]) === path.resolve(fileURLToPath(import.meta.url))) await main()
@@ -0,0 +1,155 @@
1
+ #!/usr/bin/env node
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import fs from 'node:fs'
5
+ import path from 'node:path'
6
+ import { fileURLToPath } from 'node:url'
7
+
8
+ import { argValue, findRoot, loadContext } from './load-context.mjs'
9
+
10
+ const PRIORITIES = new Set(['P0', 'P1', 'P2', 'P3'])
11
+ const SENSITIVE_KEY = /(?:authorization|cookie|password|secret|token|api[-_]?key|session[-_]?id)/i
12
+
13
+ function slug(value) {
14
+ return String(value || 'review')
15
+ .toLowerCase()
16
+ .normalize('NFD')
17
+ .replace(/[\u0300-\u036f]/g, '')
18
+ .replace(/[^a-z0-9]+/g, '-')
19
+ .replace(/^-|-$/g, '')
20
+ .slice(0, 60) || 'review'
21
+ }
22
+
23
+ function assertNoSensitiveKeys(value, trail = []) {
24
+ if (Array.isArray(value)) {
25
+ value.forEach((entry, index) => assertNoSensitiveKeys(entry, [...trail, String(index)]))
26
+ return
27
+ }
28
+ if (!value || typeof value !== 'object') return
29
+ for (const [key, entry] of Object.entries(value)) {
30
+ if (SENSITIVE_KEY.test(key)) throw new Error(`critique input contains a forbidden sensitive field: ${[...trail, key].join('.')}`)
31
+ assertNoSensitiveKeys(entry, [...trail, key])
32
+ }
33
+ }
34
+
35
+ function validateReview(input) {
36
+ if (!input || typeof input !== 'object' || Array.isArray(input)) throw new Error('critique input must be a JSON object')
37
+ if (!Number.isFinite(input.score) || input.score < 0 || input.score > 100) throw new Error('critique score must be between 0 and 100')
38
+ if (!Array.isArray(input.findings)) throw new Error('critique findings must be an array')
39
+ for (const [index, finding] of input.findings.entries()) {
40
+ if (!finding || typeof finding !== 'object') throw new Error(`finding ${index + 1} must be an object`)
41
+ if (!PRIORITIES.has(finding.priority)) throw new Error(`finding ${index + 1} has invalid priority`)
42
+ for (const field of ['title', 'evidence', 'recommendation']) {
43
+ if (typeof finding[field] !== 'string' || !finding[field].trim()) throw new Error(`finding ${index + 1} requires ${field}`)
44
+ }
45
+ }
46
+ assertNoSensitiveKeys(input)
47
+ }
48
+
49
+ function readInput(inputPath) {
50
+ const text = inputPath === '-' ? fs.readFileSync(0, 'utf8') : fs.readFileSync(path.resolve(inputPath), 'utf8')
51
+ if (Buffer.byteLength(text) > 1_000_000) throw new Error('critique input exceeds 1 MB')
52
+ return JSON.parse(text)
53
+ }
54
+
55
+ function counts(findings) {
56
+ const summary = { p0: 0, p1: 0, p2: 0, p3: 0 }
57
+ for (const finding of findings) summary[finding.priority.toLowerCase()]++
58
+ return summary
59
+ }
60
+
61
+ function markdown(review) {
62
+ const lines = [
63
+ `# Seven critique — ${review.target}`,
64
+ '',
65
+ `- Created: ${review.createdAt}`,
66
+ `- Seven release: ${review.release?.sevenVersion || 'unknown'}`,
67
+ `- Surface: ${review.surface || 'unresolved'}`,
68
+ `- Score: ${review.score}/100`,
69
+ `- Priorities: P0 ${review.summary.p0}, P1 ${review.summary.p1}, P2 ${review.summary.p2}, P3 ${review.summary.p3}`,
70
+ '',
71
+ ]
72
+ if (review.strengths?.length) {
73
+ lines.push('## Strengths to preserve', '')
74
+ for (const strength of review.strengths) lines.push(`- ${strength}`)
75
+ lines.push('')
76
+ }
77
+ lines.push('## Findings', '')
78
+ if (review.findings.length === 0) lines.push('No active findings.', '')
79
+ for (const finding of review.findings) {
80
+ lines.push(`### ${finding.priority} — ${finding.title}`, '')
81
+ lines.push(`**Evidence:** ${finding.evidence}`, '')
82
+ if (finding.impact) lines.push(`**Impact:** ${finding.impact}`, '')
83
+ if (finding.rootCause) lines.push(`**Root cause:** ${finding.rootCause}`, '')
84
+ lines.push(`**Direction:** ${finding.recommendation}`, '')
85
+ if (finding.verification) lines.push(`**Verify:** ${finding.verification}`, '')
86
+ }
87
+ if (review.verification) lines.push('## Verification evidence', '', review.verification, '')
88
+ lines.push('This review is evidence, not a visual authority. The installed Seven release remains canonical.', '')
89
+ return lines.join('\n')
90
+ }
91
+
92
+ function atomicWrite(filePath, content) {
93
+ fs.mkdirSync(path.dirname(filePath), { recursive: true })
94
+ const temporary = `${filePath}.tmp-${process.pid}-${Date.now()}`
95
+ fs.writeFileSync(temporary, content)
96
+ fs.renameSync(temporary, filePath)
97
+ }
98
+
99
+ export async function writeReview(start, target, input) {
100
+ validateReview(input)
101
+ const root = findRoot(start)
102
+ const context = await loadContext(root, { target })
103
+ let resolvedTarget = target
104
+ if (!/^https?:\/\//i.test(target)) {
105
+ const absolute = path.resolve(root, target)
106
+ const relative = path.relative(root, absolute)
107
+ if (relative.startsWith('..') || path.isAbsolute(relative)) throw new Error('critique target escapes the Seven project root')
108
+ resolvedTarget = relative.split(path.sep).join('/') || '.'
109
+ }
110
+ const createdAt = new Date().toISOString()
111
+ const review = {
112
+ schemaVersion: 1,
113
+ createdAt,
114
+ target: resolvedTarget,
115
+ surface: context.surface?.id || null,
116
+ release: context.release ? {
117
+ sevenVersion: context.release.sevenVersion,
118
+ skillVersion: context.release.skillVersion,
119
+ registrySha256: context.release.registrySha256,
120
+ } : null,
121
+ score: input.score,
122
+ summary: counts(input.findings),
123
+ renderedEvidence: input.renderedEvidence || null,
124
+ mechanicalEvidence: input.mechanicalEvidence || null,
125
+ strengths: Array.isArray(input.strengths) ? input.strengths : [],
126
+ findings: input.findings,
127
+ verification: input.verification || null,
128
+ }
129
+ const stamp = createdAt.replace(/[:.]/g, '-').replace(/-000Z$/, 'Z')
130
+ const base = path.join(root, '.seven', 'reviews', `${stamp}-${slug(context.surface?.id || resolvedTarget)}`)
131
+ atomicWrite(`${base}.json`, `${JSON.stringify(review, null, 2)}\n`)
132
+ atomicWrite(`${base}.md`, markdown(review))
133
+ return {
134
+ review,
135
+ json: path.relative(root, `${base}.json`).split(path.sep).join('/'),
136
+ markdown: path.relative(root, `${base}.md`).split(path.sep).join('/'),
137
+ }
138
+ }
139
+
140
+ export async function main(argv = process.argv) {
141
+ const action = argv[2]
142
+ if (action !== 'write') throw new Error('usage: critique-storage.mjs write --target <target> --input <review.json|->')
143
+ const target = argValue('--target', argv)
144
+ const inputPath = argValue('--input', argv)
145
+ if (!target || !inputPath) throw new Error('write requires --target and --input')
146
+ const result = await writeReview(process.cwd(), target, readInput(inputPath))
147
+ process.stdout.write(`${JSON.stringify({ json: result.json, markdown: result.markdown, summary: result.review.summary }, null, 2)}\n`)
148
+ }
149
+
150
+ if (process.argv[1] && path.resolve(process.argv[1]) === path.resolve(fileURLToPath(import.meta.url))) {
151
+ main().catch((error) => {
152
+ process.stderr.write(`${error.message}\n`)
153
+ process.exitCode = 1
154
+ })
155
+ }
@@ -1,84 +1,111 @@
1
1
  #!/usr/bin/env node
2
2
  // SPDX-License-Identifier: Apache-2.0
3
- // ETUS Digital — Seven Design System. Loader shape adapted from impeccable.
3
+ // ETUS Digital — Seven consumer context adapter.
4
4
 
5
5
  import fs from 'node:fs'
6
6
  import path from 'node:path'
7
+ import { createRequire } from 'node:module'
8
+ import { fileURLToPath, pathToFileURL } from 'node:url'
7
9
 
8
- const PRODUCT_NAMES = ['PRODUCT.md', 'Product.md', 'product.md']
9
- const DESIGN_NAMES = ['DESIGN.md', 'Design.md', 'design.md']
10
- const FALLBACK_DIRS = ['.agents/context', 'docs']
10
+ import { checkForUpdate } from './update-check.mjs'
11
11
 
12
- function firstExisting(dir, names) {
13
- for (const name of names) {
14
- const abs = path.join(dir, name)
15
- if (fs.existsSync(abs)) return abs
16
- }
17
- return null
12
+ export function argValue(name, argv = process.argv) {
13
+ const direct = argv.find((arg) => arg.startsWith(`${name}=`))
14
+ if (direct) return direct.slice(name.length + 1)
15
+ const index = argv.indexOf(name)
16
+ return index >= 0 ? argv[index + 1] : null
18
17
  }
19
18
 
20
- function safeRead(filePath) {
19
+ export function findRoot(start) {
20
+ let current = path.resolve(start)
21
21
  try {
22
- return fs.readFileSync(filePath, 'utf8')
23
- } catch {
24
- return null
22
+ if (fs.statSync(current).isFile()) current = path.dirname(current)
23
+ } catch {}
24
+ const fallbackRoot = current
25
+ while (true) {
26
+ if (fs.existsSync(path.join(current, '.seven', 'project.yml'))) return current
27
+ if (fs.existsSync(path.join(current, 'seven.json'))) return current
28
+ const parent = path.dirname(current)
29
+ if (parent === current) break
30
+ current = parent
25
31
  }
32
+ return fallbackRoot
26
33
  }
27
34
 
28
- function resolveMaybeRelative(cwd, value) {
29
- const trimmed = value.trim()
30
- return path.isAbsolute(trimmed) ? trimmed : path.resolve(cwd, trimmed)
31
- }
32
-
33
- export function resolveContextDir(cwd = process.cwd()) {
34
- const envDir = process.env.SEVEN_CONTEXT_DIR
35
- if (envDir?.trim()) return resolveMaybeRelative(cwd, envDir)
36
-
37
- if (firstExisting(cwd, [...PRODUCT_NAMES, ...DESIGN_NAMES])) return cwd
38
-
39
- for (const rel of FALLBACK_DIRS) {
40
- const candidate = path.resolve(cwd, rel)
41
- if (firstExisting(candidate, [...PRODUCT_NAMES, ...DESIGN_NAMES])) return candidate
35
+ export async function loadFromInstalledRuntime(root, target) {
36
+ try {
37
+ const require = createRequire(path.join(root, 'package.json'))
38
+ const manifest = require.resolve('@etus/seven/package.json')
39
+ const moduleUrl = pathToFileURL(path.join(path.dirname(manifest), 'lib', 'context.mjs')).href
40
+ const runtime = await import(moduleUrl)
41
+ return runtime.loadConsumerContext(root, { target })
42
+ } catch (error) {
43
+ return { runtimeError: error instanceof Error ? error.message : String(error) }
42
44
  }
43
-
44
- return cwd
45
45
  }
46
46
 
47
- function extractRegister(product) {
48
- if (!product) return null
49
- const heading = product.match(/^##\s+Register\s*\n+([\s\S]*?)(?=\n##\s+|\s*$)/im)
50
- const value = heading?.[1]?.split('\n').map((line) => line.trim()).find(Boolean)
51
- if (!value) return null
52
- return value.replace(/^[-*]\s*/, '').toLowerCase()
47
+ export function fallback(root, target, runtimeError) {
48
+ const productPath = path.join(root, 'PRODUCT.md')
49
+ const product = fs.existsSync(productPath) ? fs.readFileSync(productPath, 'utf8') : null
50
+ let release = null
51
+ try {
52
+ release = JSON.parse(fs.readFileSync(path.join(root, '.seven', 'release.lock.json'), 'utf8'))
53
+ } catch {}
54
+ return {
55
+ schemaVersion: 1,
56
+ projectRoot: root,
57
+ target: path.resolve(target),
58
+ hasProduct: Boolean(product),
59
+ product,
60
+ productPath: product ? 'PRODUCT.md' : null,
61
+ productPlaceholder: !product || product.trim().length < 200 || /\b(?:TODO|TBD|placeholder)\b/i.test(product),
62
+ register: null,
63
+ project: null,
64
+ release,
65
+ surface: null,
66
+ runtimeAvailable: false,
67
+ runtimeError,
68
+ }
53
69
  }
54
70
 
55
- function isPlaceholderProduct(product) {
56
- if (!product) return false
57
- return product.trim().length < 200 || /\b(?:todo|tbd|placeholder|\[todo\])\b/i.test(product)
71
+ export async function loadContext(start = process.cwd(), { target = start } = {}) {
72
+ const root = findRoot(start)
73
+ const loaded = await loadFromInstalledRuntime(root, target)
74
+ return loaded.runtimeError ? fallback(root, target, loaded.runtimeError) : loaded
58
75
  }
59
76
 
60
- export function loadContext(cwd = process.cwd()) {
61
- const contextDir = resolveContextDir(cwd)
62
- const productPath = firstExisting(contextDir, PRODUCT_NAMES)
63
- const designPath = firstExisting(contextDir, DESIGN_NAMES)
64
- const product = productPath ? safeRead(productPath) : null
65
- const design = designPath ? safeRead(designPath) : null
66
-
77
+ export function contextForAgent(context) {
78
+ const artifacts = context.release?.artifacts
79
+ if (!artifacts || typeof artifacts !== 'object') return context
80
+ const { artifacts: _artifacts, ...release } = context.release
81
+ const entries = Object.values(artifacts)
67
82
  return {
68
- hasProduct: !!product,
69
- product,
70
- productPath: productPath ? path.relative(cwd, productPath) : null,
71
- productPlaceholder: isPlaceholderProduct(product),
72
- register: extractRegister(product),
73
- hasDesign: !!design,
74
- design,
75
- designPath: designPath ? path.relative(cwd, designPath) : null,
76
- contextDir,
83
+ ...context,
84
+ release: {
85
+ ...release,
86
+ artifactSummary: {
87
+ total: entries.length,
88
+ managed: entries.filter((entry) => entry?.kind === 'managed').length,
89
+ scaffold: entries.filter((entry) => entry?.kind === 'scaffold').length,
90
+ },
91
+ },
77
92
  }
78
93
  }
79
94
 
80
- function cli() {
81
- process.stdout.write(`${JSON.stringify(loadContext(process.cwd()), null, 2)}\n`)
95
+ export async function main(argv = process.argv) {
96
+ const target = argValue('--target', argv) || process.env.SEVEN_TARGET || process.cwd()
97
+ const context = await loadContext(target, { target })
98
+ const update = await checkForUpdate(context.release?.sevenVersion || null)
99
+ process.stdout.write(`${JSON.stringify({ ...contextForAgent(context), update }, null, 2)}\n`)
100
+ }
101
+
102
+ function isCliEntry() {
103
+ if (!process.argv[1]) return false
104
+ try {
105
+ return fs.realpathSync(fileURLToPath(import.meta.url)) === fs.realpathSync(process.argv[1])
106
+ } catch {
107
+ return false
108
+ }
82
109
  }
83
110
 
84
- if (process.argv[1]?.endsWith('load-context.mjs')) cli()
111
+ if (isCliEntry()) await main()
@@ -0,0 +1,47 @@
1
+ #!/usr/bin/env node
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ // ETUS Digital — package-manager-independent Seven CLI runner.
4
+
5
+ import fs from 'node:fs'
6
+ import path from 'node:path'
7
+ import { spawnSync } from 'node:child_process'
8
+ import { createRequire } from 'node:module'
9
+ import { fileURLToPath } from 'node:url'
10
+
11
+ import { findRoot } from './load-context.mjs'
12
+
13
+ export function resolveSevenCli(start = process.cwd()) {
14
+ const root = findRoot(start)
15
+ const require = createRequire(path.join(root, 'package.json'))
16
+ const manifestPath = require.resolve('@etus/seven/package.json')
17
+ const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8'))
18
+ const bin = typeof manifest.bin === 'string' ? manifest.bin : manifest.bin?.seven
19
+ if (!bin) throw new Error(`@etus/seven at ${manifestPath} does not declare the seven binary`)
20
+ return {
21
+ binPath: path.resolve(path.dirname(manifestPath), bin),
22
+ root,
23
+ }
24
+ }
25
+
26
+ export function runSeven(argv = process.argv.slice(2), start = process.cwd()) {
27
+ if (argv.length === 0) throw new Error('usage: run-seven.mjs <seven-command> [arguments]')
28
+ const { binPath, root } = resolveSevenCli(start)
29
+ const result = spawnSync(process.execPath, [binPath, ...argv], {
30
+ cwd: root,
31
+ env: process.env,
32
+ stdio: 'inherit',
33
+ })
34
+ if (result.error) throw result.error
35
+ return result.status ?? 1
36
+ }
37
+
38
+ function isCliEntry() {
39
+ if (!process.argv[1]) return false
40
+ try {
41
+ return fs.realpathSync(fileURLToPath(import.meta.url)) === fs.realpathSync(process.argv[1])
42
+ } catch {
43
+ return false
44
+ }
45
+ }
46
+
47
+ if (isCliEntry()) process.exitCode = runSeven()
@@ -0,0 +1,120 @@
1
+ #!/usr/bin/env node
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import fs from 'node:fs'
5
+ import os from 'node:os'
6
+ import path from 'node:path'
7
+
8
+ const DAY_MS = 24 * 60 * 60 * 1000
9
+ const WEEK_MS = 7 * DAY_MS
10
+
11
+ function cachePath(env = process.env) {
12
+ return env.SEVEN_UPDATE_CACHE || path.join(os.homedir(), '.seven', 'update-check.json')
13
+ }
14
+
15
+ function readCache(env) {
16
+ try {
17
+ const parsed = JSON.parse(fs.readFileSync(cachePath(env), 'utf8'))
18
+ return parsed && typeof parsed === 'object' ? parsed : {}
19
+ } catch {
20
+ return {}
21
+ }
22
+ }
23
+
24
+ function writeCache(cache, env) {
25
+ try {
26
+ const destination = cachePath(env)
27
+ fs.mkdirSync(path.dirname(destination), { recursive: true })
28
+ fs.writeFileSync(destination, `${JSON.stringify(cache, null, 2)}\n`)
29
+ } catch {
30
+ // Update discovery is best-effort and must never block the UI workflow.
31
+ }
32
+ }
33
+
34
+ function semverParts(value) {
35
+ const match = String(value || '').trim().match(/^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?$/)
36
+ if (!match) return null
37
+ return {
38
+ core: [Number(match[1]), Number(match[2]), Number(match[3])],
39
+ prerelease: match[4] ? match[4].split('.') : [],
40
+ }
41
+ }
42
+
43
+ function compareIdentifier(left, right) {
44
+ const leftNumber = /^\d+$/.test(left) ? Number(left) : null
45
+ const rightNumber = /^\d+$/.test(right) ? Number(right) : null
46
+ if (leftNumber != null && rightNumber != null) return Math.sign(leftNumber - rightNumber)
47
+ if (leftNumber != null) return -1
48
+ if (rightNumber != null) return 1
49
+ return left.localeCompare(right)
50
+ }
51
+
52
+ export function compareSemver(left, right) {
53
+ const a = semverParts(left)
54
+ const b = semverParts(right)
55
+ if (!a || !b) return 0
56
+ for (let index = 0; index < 3; index++) {
57
+ if (a.core[index] !== b.core[index]) return Math.sign(a.core[index] - b.core[index])
58
+ }
59
+ if (a.prerelease.length === 0 && b.prerelease.length > 0) return 1
60
+ if (b.prerelease.length === 0 && a.prerelease.length > 0) return -1
61
+ for (let index = 0; index < Math.max(a.prerelease.length, b.prerelease.length); index++) {
62
+ if (a.prerelease[index] == null) return -1
63
+ if (b.prerelease[index] == null) return 1
64
+ const compared = compareIdentifier(a.prerelease[index], b.prerelease[index])
65
+ if (compared !== 0) return compared
66
+ }
67
+ return 0
68
+ }
69
+
70
+ async function fetchLatest(env) {
71
+ const registry = (env.SEVEN_UPDATE_REGISTRY || 'https://registry.npmjs.org').replace(/\/$/, '')
72
+ const controller = new AbortController()
73
+ const timeout = setTimeout(() => controller.abort(), 1500)
74
+ try {
75
+ const response = await fetch(`${registry}/%40etus%2Fseven/latest`, {
76
+ headers: { accept: 'application/json' },
77
+ signal: controller.signal,
78
+ })
79
+ if (!response.ok) return null
80
+ const payload = await response.json()
81
+ return typeof payload?.version === 'string' ? payload.version : null
82
+ } catch {
83
+ return null
84
+ } finally {
85
+ clearTimeout(timeout)
86
+ }
87
+ }
88
+
89
+ export async function checkForUpdate(currentVersion, { env = process.env, now = Date.now() } = {}) {
90
+ if (!currentVersion || env.SEVEN_NO_UPDATE_CHECK) return null
91
+ const cache = readCache(env)
92
+ const fresh = typeof cache.checkedAt === 'number' && now - cache.checkedAt < DAY_MS
93
+ let latestVersion = fresh ? cache.latestVersion : await fetchLatest(env)
94
+ if (!latestVersion) latestVersion = cache.latestVersion || null
95
+ if (!fresh && latestVersion) {
96
+ cache.checkedAt = now
97
+ cache.latestVersion = latestVersion
98
+ }
99
+ if (!latestVersion) return null
100
+
101
+ const available = compareSemver(latestVersion, currentVersion) > 0
102
+ const notify = available && (
103
+ cache.notifiedVersion !== latestVersion ||
104
+ typeof cache.notifiedAt !== 'number' ||
105
+ now - cache.notifiedAt >= WEEK_MS
106
+ )
107
+ if (notify) {
108
+ cache.notifiedVersion = latestVersion
109
+ cache.notifiedAt = now
110
+ }
111
+ writeCache(cache, env)
112
+ return {
113
+ package: '@etus/seven',
114
+ currentVersion,
115
+ latestVersion,
116
+ available,
117
+ notify,
118
+ command: `pnpm add -D @etus/seven@${latestVersion} && pnpm exec seven update`,
119
+ }
120
+ }
@@ -11,8 +11,8 @@
11
11
  "plugins": [
12
12
  {
13
13
  "name": "seven",
14
- "description": "Seven Design System skill, plugin, and CLI detector for AI coding agents — ETUS Digital",
15
- "version": "0.1.0-beta.3",
14
+ "description": "Provider-native Seven Design System skills and deterministic UI detector runtime for @etus/seven consumers — ETUS Digital",
15
+ "version": "0.1.0-beta.5",
16
16
  "author": {
17
17
  "name": "ETUS Digital",
18
18
  "url": "https://github.com/etusdigital"
@@ -1,12 +1,17 @@
1
1
  {
2
2
  "name": "seven",
3
- "description": "Seven Design System skill, plugin, and CLI detector for AI coding agents — ETUS Digital",
4
- "version": "0.1.0-beta.3",
3
+ "description": "Provider-native Seven Design System skills and deterministic UI detector runtime for @etus/seven consumers — ETUS Digital",
4
+ "version": "0.1.0-beta.5",
5
5
  "author": {
6
6
  "name": "ETUS Digital",
7
7
  "url": "https://github.com/etusdigital"
8
8
  },
9
9
  "homepage": "https://github.com/etusdigital/seven#readme",
10
10
  "repository": "https://github.com/etusdigital/seven.git",
11
- "skills": "./.claude/skills/"
11
+ "skills": "./.claude/skills/",
12
+ "agents": [
13
+ "./.claude/agents/seven-asset-producer.md",
14
+ "./.claude/agents/seven-finish-reviewer.md",
15
+ "./.claude/agents/seven-manual-edit-applier.md"
16
+ ]
12
17
  }