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

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 (570) hide show
  1. package/.agents/skills/seven/SKILL.md +161 -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 +7 -0
  18. package/.agents/skills/seven/reference/document.md +36 -0
  19. package/.agents/skills/seven/reference/evaluations.md +38 -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 +38 -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/shape.md +85 -0
  36. package/.agents/skills/seven/reference/spatial-design.md +60 -0
  37. package/.agents/skills/seven/reference/typeset.md +28 -0
  38. package/.agents/skills/seven/reference/typography.md +43 -0
  39. package/.agents/skills/seven/reference/ux-writing.md +47 -0
  40. package/.agents/skills/seven/reference/visual-probes.md +36 -0
  41. package/.agents/skills/seven/scripts/context-signals.mjs +94 -0
  42. package/.agents/skills/seven/scripts/critique-storage.mjs +155 -0
  43. package/.agents/skills/seven/scripts/load-context.mjs +93 -0
  44. package/.agents/skills/seven/scripts/update-check.mjs +120 -0
  45. package/.claude/agents/seven-asset-producer.md +40 -0
  46. package/.claude/agents/seven-finish-reviewer.md +36 -0
  47. package/.claude/agents/seven-manual-edit-applier.md +46 -0
  48. package/.claude/skills/seven/SKILL.md +127 -130
  49. package/.claude/skills/seven/reference/adapt.md +34 -0
  50. package/.claude/skills/seven/reference/animate.md +31 -0
  51. package/.claude/skills/seven/reference/app-shell.md +100 -18
  52. package/.claude/skills/seven/reference/audit.md +6 -4
  53. package/.claude/skills/seven/reference/bolder.md +34 -0
  54. package/.claude/skills/seven/reference/brand.md +21 -14
  55. package/.claude/skills/seven/reference/clarify.md +2 -2
  56. package/.claude/skills/seven/reference/colorize.md +31 -0
  57. package/.claude/skills/seven/reference/critique.md +53 -0
  58. package/.claude/skills/seven/reference/delight.md +30 -0
  59. package/.claude/skills/seven/reference/distill.md +30 -0
  60. package/.claude/skills/seven/reference/doctor.md +7 -0
  61. package/.claude/skills/seven/reference/document.md +36 -0
  62. package/.claude/skills/seven/reference/evaluations.md +38 -0
  63. package/.claude/skills/seven/reference/exceptions.md +7 -0
  64. package/.claude/skills/seven/reference/extract.md +42 -0
  65. package/.claude/skills/seven/reference/harden.md +36 -0
  66. package/.claude/skills/seven/reference/hooks.md +11 -0
  67. package/.claude/skills/seven/reference/init.md +38 -0
  68. package/.claude/skills/seven/reference/layout.md +33 -0
  69. package/.claude/skills/seven/reference/live.md +106 -0
  70. package/.claude/skills/seven/reference/motion-design.md +1 -1
  71. package/.claude/skills/seven/reference/onboard.md +35 -0
  72. package/.claude/skills/seven/reference/optimize.md +34 -0
  73. package/.claude/skills/seven/reference/overdrive.md +32 -0
  74. package/.claude/skills/seven/reference/polish.md +5 -5
  75. package/.claude/skills/seven/reference/product.md +2 -4
  76. package/.claude/skills/seven/reference/quieter.md +31 -0
  77. package/.claude/skills/seven/reference/routing.md +28 -0
  78. package/.claude/skills/seven/reference/shape.md +5 -5
  79. package/.claude/skills/seven/reference/spatial-design.md +3 -3
  80. package/.claude/skills/seven/reference/typeset.md +28 -0
  81. package/.claude/skills/seven/reference/typography.md +1 -1
  82. package/.claude/skills/seven/reference/visual-probes.md +36 -0
  83. package/.claude/skills/seven/scripts/context-signals.mjs +94 -0
  84. package/.claude/skills/seven/scripts/critique-storage.mjs +155 -0
  85. package/.claude/skills/seven/scripts/load-context.mjs +68 -59
  86. package/.claude/skills/seven/scripts/update-check.mjs +120 -0
  87. package/.claude-plugin/marketplace.json +2 -2
  88. package/.claude-plugin/plugin.json +8 -3
  89. package/.cursor/skills/seven/SKILL.md +161 -0
  90. package/.cursor/skills/seven/reference/adapt.md +34 -0
  91. package/.cursor/skills/seven/reference/animate.md +31 -0
  92. package/.cursor/skills/seven/reference/app-shell.md +152 -0
  93. package/.cursor/skills/seven/reference/audit.md +122 -0
  94. package/.cursor/skills/seven/reference/bolder.md +34 -0
  95. package/.cursor/skills/seven/reference/brand.md +31 -0
  96. package/.cursor/skills/seven/reference/clarify.md +76 -0
  97. package/.cursor/skills/seven/reference/color-and-contrast.md +84 -0
  98. package/.cursor/skills/seven/reference/colorize.md +31 -0
  99. package/.cursor/skills/seven/reference/critique.md +53 -0
  100. package/.cursor/skills/seven/reference/delight.md +30 -0
  101. package/.cursor/skills/seven/reference/distill.md +30 -0
  102. package/.cursor/skills/seven/reference/doctor.md +7 -0
  103. package/.cursor/skills/seven/reference/document.md +36 -0
  104. package/.cursor/skills/seven/reference/evaluations.md +38 -0
  105. package/.cursor/skills/seven/reference/exceptions.md +7 -0
  106. package/.cursor/skills/seven/reference/extract.md +42 -0
  107. package/.cursor/skills/seven/reference/harden.md +36 -0
  108. package/.cursor/skills/seven/reference/hooks.md +11 -0
  109. package/.cursor/skills/seven/reference/init.md +38 -0
  110. package/.cursor/skills/seven/reference/layout.md +33 -0
  111. package/.cursor/skills/seven/reference/live.md +106 -0
  112. package/.cursor/skills/seven/reference/motion-design.md +71 -0
  113. package/.cursor/skills/seven/reference/onboard.md +35 -0
  114. package/.cursor/skills/seven/reference/optimize.md +34 -0
  115. package/.cursor/skills/seven/reference/overdrive.md +32 -0
  116. package/.cursor/skills/seven/reference/polish.md +55 -0
  117. package/.cursor/skills/seven/reference/product.md +43 -0
  118. package/.cursor/skills/seven/reference/quieter.md +31 -0
  119. package/.cursor/skills/seven/reference/routing.md +28 -0
  120. package/.cursor/skills/seven/reference/shape.md +85 -0
  121. package/.cursor/skills/seven/reference/spatial-design.md +60 -0
  122. package/.cursor/skills/seven/reference/typeset.md +28 -0
  123. package/.cursor/skills/seven/reference/typography.md +43 -0
  124. package/.cursor/skills/seven/reference/ux-writing.md +47 -0
  125. package/.cursor/skills/seven/reference/visual-probes.md +36 -0
  126. package/.cursor/skills/seven/scripts/context-signals.mjs +94 -0
  127. package/.cursor/skills/seven/scripts/critique-storage.mjs +155 -0
  128. package/.cursor/skills/seven/scripts/load-context.mjs +93 -0
  129. package/.cursor/skills/seven/scripts/update-check.mjs +120 -0
  130. package/.gemini/skills/seven/SKILL.md +160 -0
  131. package/.gemini/skills/seven/reference/adapt.md +34 -0
  132. package/.gemini/skills/seven/reference/animate.md +31 -0
  133. package/.gemini/skills/seven/reference/app-shell.md +152 -0
  134. package/.gemini/skills/seven/reference/audit.md +122 -0
  135. package/.gemini/skills/seven/reference/bolder.md +34 -0
  136. package/.gemini/skills/seven/reference/brand.md +31 -0
  137. package/.gemini/skills/seven/reference/clarify.md +76 -0
  138. package/.gemini/skills/seven/reference/color-and-contrast.md +84 -0
  139. package/.gemini/skills/seven/reference/colorize.md +31 -0
  140. package/.gemini/skills/seven/reference/critique.md +53 -0
  141. package/.gemini/skills/seven/reference/delight.md +30 -0
  142. package/.gemini/skills/seven/reference/distill.md +30 -0
  143. package/.gemini/skills/seven/reference/doctor.md +7 -0
  144. package/.gemini/skills/seven/reference/document.md +36 -0
  145. package/.gemini/skills/seven/reference/evaluations.md +38 -0
  146. package/.gemini/skills/seven/reference/exceptions.md +7 -0
  147. package/.gemini/skills/seven/reference/extract.md +42 -0
  148. package/.gemini/skills/seven/reference/harden.md +36 -0
  149. package/.gemini/skills/seven/reference/hooks.md +11 -0
  150. package/.gemini/skills/seven/reference/init.md +38 -0
  151. package/.gemini/skills/seven/reference/layout.md +33 -0
  152. package/.gemini/skills/seven/reference/live.md +106 -0
  153. package/.gemini/skills/seven/reference/motion-design.md +71 -0
  154. package/.gemini/skills/seven/reference/onboard.md +35 -0
  155. package/.gemini/skills/seven/reference/optimize.md +34 -0
  156. package/.gemini/skills/seven/reference/overdrive.md +32 -0
  157. package/.gemini/skills/seven/reference/polish.md +55 -0
  158. package/.gemini/skills/seven/reference/product.md +43 -0
  159. package/.gemini/skills/seven/reference/quieter.md +31 -0
  160. package/.gemini/skills/seven/reference/routing.md +28 -0
  161. package/.gemini/skills/seven/reference/shape.md +85 -0
  162. package/.gemini/skills/seven/reference/spatial-design.md +60 -0
  163. package/.gemini/skills/seven/reference/typeset.md +28 -0
  164. package/.gemini/skills/seven/reference/typography.md +43 -0
  165. package/.gemini/skills/seven/reference/ux-writing.md +47 -0
  166. package/.gemini/skills/seven/reference/visual-probes.md +36 -0
  167. package/.gemini/skills/seven/scripts/context-signals.mjs +94 -0
  168. package/.gemini/skills/seven/scripts/critique-storage.mjs +155 -0
  169. package/.gemini/skills/seven/scripts/load-context.mjs +93 -0
  170. package/.gemini/skills/seven/scripts/update-check.mjs +120 -0
  171. package/.grok/agents/seven-asset-producer.md +40 -0
  172. package/.grok/agents/seven-finish-reviewer.md +36 -0
  173. package/.grok/agents/seven-manual-edit-applier.md +46 -0
  174. package/.grok/skills/seven/SKILL.md +167 -0
  175. package/.grok/skills/seven/reference/adapt.md +34 -0
  176. package/.grok/skills/seven/reference/animate.md +31 -0
  177. package/.grok/skills/seven/reference/app-shell.md +152 -0
  178. package/.grok/skills/seven/reference/audit.md +122 -0
  179. package/.grok/skills/seven/reference/bolder.md +34 -0
  180. package/.grok/skills/seven/reference/brand.md +31 -0
  181. package/.grok/skills/seven/reference/clarify.md +76 -0
  182. package/.grok/skills/seven/reference/color-and-contrast.md +84 -0
  183. package/.grok/skills/seven/reference/colorize.md +31 -0
  184. package/.grok/skills/seven/reference/critique.md +53 -0
  185. package/.grok/skills/seven/reference/delight.md +30 -0
  186. package/.grok/skills/seven/reference/distill.md +30 -0
  187. package/.grok/skills/seven/reference/doctor.md +7 -0
  188. package/.grok/skills/seven/reference/document.md +36 -0
  189. package/.grok/skills/seven/reference/evaluations.md +38 -0
  190. package/.grok/skills/seven/reference/exceptions.md +7 -0
  191. package/.grok/skills/seven/reference/extract.md +42 -0
  192. package/.grok/skills/seven/reference/harden.md +36 -0
  193. package/.grok/skills/seven/reference/hooks.md +11 -0
  194. package/.grok/skills/seven/reference/init.md +38 -0
  195. package/.grok/skills/seven/reference/layout.md +33 -0
  196. package/.grok/skills/seven/reference/live.md +106 -0
  197. package/.grok/skills/seven/reference/motion-design.md +71 -0
  198. package/.grok/skills/seven/reference/onboard.md +35 -0
  199. package/.grok/skills/seven/reference/optimize.md +34 -0
  200. package/.grok/skills/seven/reference/overdrive.md +32 -0
  201. package/.grok/skills/seven/reference/polish.md +55 -0
  202. package/.grok/skills/seven/reference/product.md +43 -0
  203. package/.grok/skills/seven/reference/quieter.md +31 -0
  204. package/.grok/skills/seven/reference/routing.md +28 -0
  205. package/.grok/skills/seven/reference/shape.md +85 -0
  206. package/.grok/skills/seven/reference/spatial-design.md +60 -0
  207. package/.grok/skills/seven/reference/typeset.md +28 -0
  208. package/.grok/skills/seven/reference/typography.md +43 -0
  209. package/.grok/skills/seven/reference/ux-writing.md +47 -0
  210. package/.grok/skills/seven/reference/visual-probes.md +36 -0
  211. package/.grok/skills/seven/scripts/context-signals.mjs +94 -0
  212. package/.grok/skills/seven/scripts/critique-storage.mjs +155 -0
  213. package/.grok/skills/seven/scripts/load-context.mjs +93 -0
  214. package/.grok/skills/seven/scripts/update-check.mjs +120 -0
  215. package/.kiro/skills/seven/SKILL.md +161 -0
  216. package/.kiro/skills/seven/reference/adapt.md +34 -0
  217. package/.kiro/skills/seven/reference/animate.md +31 -0
  218. package/.kiro/skills/seven/reference/app-shell.md +152 -0
  219. package/.kiro/skills/seven/reference/audit.md +122 -0
  220. package/.kiro/skills/seven/reference/bolder.md +34 -0
  221. package/.kiro/skills/seven/reference/brand.md +31 -0
  222. package/.kiro/skills/seven/reference/clarify.md +76 -0
  223. package/.kiro/skills/seven/reference/color-and-contrast.md +84 -0
  224. package/.kiro/skills/seven/reference/colorize.md +31 -0
  225. package/.kiro/skills/seven/reference/critique.md +53 -0
  226. package/.kiro/skills/seven/reference/delight.md +30 -0
  227. package/.kiro/skills/seven/reference/distill.md +30 -0
  228. package/.kiro/skills/seven/reference/doctor.md +7 -0
  229. package/.kiro/skills/seven/reference/document.md +36 -0
  230. package/.kiro/skills/seven/reference/evaluations.md +38 -0
  231. package/.kiro/skills/seven/reference/exceptions.md +7 -0
  232. package/.kiro/skills/seven/reference/extract.md +42 -0
  233. package/.kiro/skills/seven/reference/harden.md +36 -0
  234. package/.kiro/skills/seven/reference/hooks.md +11 -0
  235. package/.kiro/skills/seven/reference/init.md +38 -0
  236. package/.kiro/skills/seven/reference/layout.md +33 -0
  237. package/.kiro/skills/seven/reference/live.md +106 -0
  238. package/.kiro/skills/seven/reference/motion-design.md +71 -0
  239. package/.kiro/skills/seven/reference/onboard.md +35 -0
  240. package/.kiro/skills/seven/reference/optimize.md +34 -0
  241. package/.kiro/skills/seven/reference/overdrive.md +32 -0
  242. package/.kiro/skills/seven/reference/polish.md +55 -0
  243. package/.kiro/skills/seven/reference/product.md +43 -0
  244. package/.kiro/skills/seven/reference/quieter.md +31 -0
  245. package/.kiro/skills/seven/reference/routing.md +28 -0
  246. package/.kiro/skills/seven/reference/shape.md +85 -0
  247. package/.kiro/skills/seven/reference/spatial-design.md +60 -0
  248. package/.kiro/skills/seven/reference/typeset.md +28 -0
  249. package/.kiro/skills/seven/reference/typography.md +43 -0
  250. package/.kiro/skills/seven/reference/ux-writing.md +47 -0
  251. package/.kiro/skills/seven/reference/visual-probes.md +36 -0
  252. package/.kiro/skills/seven/scripts/context-signals.mjs +94 -0
  253. package/.kiro/skills/seven/scripts/critique-storage.mjs +155 -0
  254. package/.kiro/skills/seven/scripts/load-context.mjs +93 -0
  255. package/.kiro/skills/seven/scripts/update-check.mjs +120 -0
  256. package/.opencode/skills/seven/SKILL.md +167 -0
  257. package/.opencode/skills/seven/reference/adapt.md +34 -0
  258. package/.opencode/skills/seven/reference/animate.md +31 -0
  259. package/.opencode/skills/seven/reference/app-shell.md +152 -0
  260. package/.opencode/skills/seven/reference/audit.md +122 -0
  261. package/.opencode/skills/seven/reference/bolder.md +34 -0
  262. package/.opencode/skills/seven/reference/brand.md +31 -0
  263. package/.opencode/skills/seven/reference/clarify.md +76 -0
  264. package/.opencode/skills/seven/reference/color-and-contrast.md +84 -0
  265. package/.opencode/skills/seven/reference/colorize.md +31 -0
  266. package/.opencode/skills/seven/reference/critique.md +53 -0
  267. package/.opencode/skills/seven/reference/delight.md +30 -0
  268. package/.opencode/skills/seven/reference/distill.md +30 -0
  269. package/.opencode/skills/seven/reference/doctor.md +7 -0
  270. package/.opencode/skills/seven/reference/document.md +36 -0
  271. package/.opencode/skills/seven/reference/evaluations.md +38 -0
  272. package/.opencode/skills/seven/reference/exceptions.md +7 -0
  273. package/.opencode/skills/seven/reference/extract.md +42 -0
  274. package/.opencode/skills/seven/reference/harden.md +36 -0
  275. package/.opencode/skills/seven/reference/hooks.md +11 -0
  276. package/.opencode/skills/seven/reference/init.md +38 -0
  277. package/.opencode/skills/seven/reference/layout.md +33 -0
  278. package/.opencode/skills/seven/reference/live.md +106 -0
  279. package/.opencode/skills/seven/reference/motion-design.md +71 -0
  280. package/.opencode/skills/seven/reference/onboard.md +35 -0
  281. package/.opencode/skills/seven/reference/optimize.md +34 -0
  282. package/.opencode/skills/seven/reference/overdrive.md +32 -0
  283. package/.opencode/skills/seven/reference/polish.md +55 -0
  284. package/.opencode/skills/seven/reference/product.md +43 -0
  285. package/.opencode/skills/seven/reference/quieter.md +31 -0
  286. package/.opencode/skills/seven/reference/routing.md +28 -0
  287. package/.opencode/skills/seven/reference/shape.md +85 -0
  288. package/.opencode/skills/seven/reference/spatial-design.md +60 -0
  289. package/.opencode/skills/seven/reference/typeset.md +28 -0
  290. package/.opencode/skills/seven/reference/typography.md +43 -0
  291. package/.opencode/skills/seven/reference/ux-writing.md +47 -0
  292. package/.opencode/skills/seven/reference/visual-probes.md +36 -0
  293. package/.opencode/skills/seven/scripts/context-signals.mjs +94 -0
  294. package/.opencode/skills/seven/scripts/critique-storage.mjs +155 -0
  295. package/.opencode/skills/seven/scripts/load-context.mjs +93 -0
  296. package/.opencode/skills/seven/scripts/update-check.mjs +120 -0
  297. package/.pi/skills/seven/SKILL.md +165 -0
  298. package/.pi/skills/seven/reference/adapt.md +34 -0
  299. package/.pi/skills/seven/reference/animate.md +31 -0
  300. package/.pi/skills/seven/reference/app-shell.md +152 -0
  301. package/.pi/skills/seven/reference/audit.md +122 -0
  302. package/.pi/skills/seven/reference/bolder.md +34 -0
  303. package/.pi/skills/seven/reference/brand.md +31 -0
  304. package/.pi/skills/seven/reference/clarify.md +76 -0
  305. package/.pi/skills/seven/reference/color-and-contrast.md +84 -0
  306. package/.pi/skills/seven/reference/colorize.md +31 -0
  307. package/.pi/skills/seven/reference/critique.md +53 -0
  308. package/.pi/skills/seven/reference/delight.md +30 -0
  309. package/.pi/skills/seven/reference/distill.md +30 -0
  310. package/.pi/skills/seven/reference/doctor.md +7 -0
  311. package/.pi/skills/seven/reference/document.md +36 -0
  312. package/.pi/skills/seven/reference/evaluations.md +38 -0
  313. package/.pi/skills/seven/reference/exceptions.md +7 -0
  314. package/.pi/skills/seven/reference/extract.md +42 -0
  315. package/.pi/skills/seven/reference/harden.md +36 -0
  316. package/.pi/skills/seven/reference/hooks.md +11 -0
  317. package/.pi/skills/seven/reference/init.md +38 -0
  318. package/.pi/skills/seven/reference/layout.md +33 -0
  319. package/.pi/skills/seven/reference/live.md +106 -0
  320. package/.pi/skills/seven/reference/motion-design.md +71 -0
  321. package/.pi/skills/seven/reference/onboard.md +35 -0
  322. package/.pi/skills/seven/reference/optimize.md +34 -0
  323. package/.pi/skills/seven/reference/overdrive.md +32 -0
  324. package/.pi/skills/seven/reference/polish.md +55 -0
  325. package/.pi/skills/seven/reference/product.md +43 -0
  326. package/.pi/skills/seven/reference/quieter.md +31 -0
  327. package/.pi/skills/seven/reference/routing.md +28 -0
  328. package/.pi/skills/seven/reference/shape.md +85 -0
  329. package/.pi/skills/seven/reference/spatial-design.md +60 -0
  330. package/.pi/skills/seven/reference/typeset.md +28 -0
  331. package/.pi/skills/seven/reference/typography.md +43 -0
  332. package/.pi/skills/seven/reference/ux-writing.md +47 -0
  333. package/.pi/skills/seven/reference/visual-probes.md +36 -0
  334. package/.pi/skills/seven/scripts/context-signals.mjs +94 -0
  335. package/.pi/skills/seven/scripts/critique-storage.mjs +155 -0
  336. package/.pi/skills/seven/scripts/load-context.mjs +93 -0
  337. package/.pi/skills/seven/scripts/update-check.mjs +120 -0
  338. package/.qoder/skills/seven/SKILL.md +167 -0
  339. package/.qoder/skills/seven/reference/adapt.md +34 -0
  340. package/.qoder/skills/seven/reference/animate.md +31 -0
  341. package/.qoder/skills/seven/reference/app-shell.md +152 -0
  342. package/.qoder/skills/seven/reference/audit.md +122 -0
  343. package/.qoder/skills/seven/reference/bolder.md +34 -0
  344. package/.qoder/skills/seven/reference/brand.md +31 -0
  345. package/.qoder/skills/seven/reference/clarify.md +76 -0
  346. package/.qoder/skills/seven/reference/color-and-contrast.md +84 -0
  347. package/.qoder/skills/seven/reference/colorize.md +31 -0
  348. package/.qoder/skills/seven/reference/critique.md +53 -0
  349. package/.qoder/skills/seven/reference/delight.md +30 -0
  350. package/.qoder/skills/seven/reference/distill.md +30 -0
  351. package/.qoder/skills/seven/reference/doctor.md +7 -0
  352. package/.qoder/skills/seven/reference/document.md +36 -0
  353. package/.qoder/skills/seven/reference/evaluations.md +38 -0
  354. package/.qoder/skills/seven/reference/exceptions.md +7 -0
  355. package/.qoder/skills/seven/reference/extract.md +42 -0
  356. package/.qoder/skills/seven/reference/harden.md +36 -0
  357. package/.qoder/skills/seven/reference/hooks.md +11 -0
  358. package/.qoder/skills/seven/reference/init.md +38 -0
  359. package/.qoder/skills/seven/reference/layout.md +33 -0
  360. package/.qoder/skills/seven/reference/live.md +106 -0
  361. package/.qoder/skills/seven/reference/motion-design.md +71 -0
  362. package/.qoder/skills/seven/reference/onboard.md +35 -0
  363. package/.qoder/skills/seven/reference/optimize.md +34 -0
  364. package/.qoder/skills/seven/reference/overdrive.md +32 -0
  365. package/.qoder/skills/seven/reference/polish.md +55 -0
  366. package/.qoder/skills/seven/reference/product.md +43 -0
  367. package/.qoder/skills/seven/reference/quieter.md +31 -0
  368. package/.qoder/skills/seven/reference/routing.md +28 -0
  369. package/.qoder/skills/seven/reference/shape.md +85 -0
  370. package/.qoder/skills/seven/reference/spatial-design.md +60 -0
  371. package/.qoder/skills/seven/reference/typeset.md +28 -0
  372. package/.qoder/skills/seven/reference/typography.md +43 -0
  373. package/.qoder/skills/seven/reference/ux-writing.md +47 -0
  374. package/.qoder/skills/seven/reference/visual-probes.md +36 -0
  375. package/.qoder/skills/seven/scripts/context-signals.mjs +94 -0
  376. package/.qoder/skills/seven/scripts/critique-storage.mjs +155 -0
  377. package/.qoder/skills/seven/scripts/load-context.mjs +93 -0
  378. package/.qoder/skills/seven/scripts/update-check.mjs +120 -0
  379. package/.rovodev/skills/seven/SKILL.md +167 -0
  380. package/.rovodev/skills/seven/reference/adapt.md +34 -0
  381. package/.rovodev/skills/seven/reference/animate.md +31 -0
  382. package/.rovodev/skills/seven/reference/app-shell.md +152 -0
  383. package/.rovodev/skills/seven/reference/audit.md +122 -0
  384. package/.rovodev/skills/seven/reference/bolder.md +34 -0
  385. package/.rovodev/skills/seven/reference/brand.md +31 -0
  386. package/.rovodev/skills/seven/reference/clarify.md +76 -0
  387. package/.rovodev/skills/seven/reference/color-and-contrast.md +84 -0
  388. package/.rovodev/skills/seven/reference/colorize.md +31 -0
  389. package/.rovodev/skills/seven/reference/critique.md +53 -0
  390. package/.rovodev/skills/seven/reference/delight.md +30 -0
  391. package/.rovodev/skills/seven/reference/distill.md +30 -0
  392. package/.rovodev/skills/seven/reference/doctor.md +7 -0
  393. package/.rovodev/skills/seven/reference/document.md +36 -0
  394. package/.rovodev/skills/seven/reference/evaluations.md +38 -0
  395. package/.rovodev/skills/seven/reference/exceptions.md +7 -0
  396. package/.rovodev/skills/seven/reference/extract.md +42 -0
  397. package/.rovodev/skills/seven/reference/harden.md +36 -0
  398. package/.rovodev/skills/seven/reference/hooks.md +11 -0
  399. package/.rovodev/skills/seven/reference/init.md +38 -0
  400. package/.rovodev/skills/seven/reference/layout.md +33 -0
  401. package/.rovodev/skills/seven/reference/live.md +106 -0
  402. package/.rovodev/skills/seven/reference/motion-design.md +71 -0
  403. package/.rovodev/skills/seven/reference/onboard.md +35 -0
  404. package/.rovodev/skills/seven/reference/optimize.md +34 -0
  405. package/.rovodev/skills/seven/reference/overdrive.md +32 -0
  406. package/.rovodev/skills/seven/reference/polish.md +55 -0
  407. package/.rovodev/skills/seven/reference/product.md +43 -0
  408. package/.rovodev/skills/seven/reference/quieter.md +31 -0
  409. package/.rovodev/skills/seven/reference/routing.md +28 -0
  410. package/.rovodev/skills/seven/reference/shape.md +85 -0
  411. package/.rovodev/skills/seven/reference/spatial-design.md +60 -0
  412. package/.rovodev/skills/seven/reference/typeset.md +28 -0
  413. package/.rovodev/skills/seven/reference/typography.md +43 -0
  414. package/.rovodev/skills/seven/reference/ux-writing.md +47 -0
  415. package/.rovodev/skills/seven/reference/visual-probes.md +36 -0
  416. package/.rovodev/skills/seven/scripts/context-signals.mjs +94 -0
  417. package/.rovodev/skills/seven/scripts/critique-storage.mjs +155 -0
  418. package/.rovodev/skills/seven/scripts/load-context.mjs +93 -0
  419. package/.rovodev/skills/seven/scripts/update-check.mjs +120 -0
  420. package/.trae/skills/seven/SKILL.md +163 -0
  421. package/.trae/skills/seven/reference/adapt.md +34 -0
  422. package/.trae/skills/seven/reference/animate.md +31 -0
  423. package/.trae/skills/seven/reference/app-shell.md +152 -0
  424. package/.trae/skills/seven/reference/audit.md +122 -0
  425. package/.trae/skills/seven/reference/bolder.md +34 -0
  426. package/.trae/skills/seven/reference/brand.md +31 -0
  427. package/.trae/skills/seven/reference/clarify.md +76 -0
  428. package/.trae/skills/seven/reference/color-and-contrast.md +84 -0
  429. package/.trae/skills/seven/reference/colorize.md +31 -0
  430. package/.trae/skills/seven/reference/critique.md +53 -0
  431. package/.trae/skills/seven/reference/delight.md +30 -0
  432. package/.trae/skills/seven/reference/distill.md +30 -0
  433. package/.trae/skills/seven/reference/doctor.md +7 -0
  434. package/.trae/skills/seven/reference/document.md +36 -0
  435. package/.trae/skills/seven/reference/evaluations.md +38 -0
  436. package/.trae/skills/seven/reference/exceptions.md +7 -0
  437. package/.trae/skills/seven/reference/extract.md +42 -0
  438. package/.trae/skills/seven/reference/harden.md +36 -0
  439. package/.trae/skills/seven/reference/hooks.md +11 -0
  440. package/.trae/skills/seven/reference/init.md +38 -0
  441. package/.trae/skills/seven/reference/layout.md +33 -0
  442. package/.trae/skills/seven/reference/live.md +106 -0
  443. package/.trae/skills/seven/reference/motion-design.md +71 -0
  444. package/.trae/skills/seven/reference/onboard.md +35 -0
  445. package/.trae/skills/seven/reference/optimize.md +34 -0
  446. package/.trae/skills/seven/reference/overdrive.md +32 -0
  447. package/.trae/skills/seven/reference/polish.md +55 -0
  448. package/.trae/skills/seven/reference/product.md +43 -0
  449. package/.trae/skills/seven/reference/quieter.md +31 -0
  450. package/.trae/skills/seven/reference/routing.md +28 -0
  451. package/.trae/skills/seven/reference/shape.md +85 -0
  452. package/.trae/skills/seven/reference/spatial-design.md +60 -0
  453. package/.trae/skills/seven/reference/typeset.md +28 -0
  454. package/.trae/skills/seven/reference/typography.md +43 -0
  455. package/.trae/skills/seven/reference/ux-writing.md +47 -0
  456. package/.trae/skills/seven/reference/visual-probes.md +36 -0
  457. package/.trae/skills/seven/scripts/context-signals.mjs +94 -0
  458. package/.trae/skills/seven/scripts/critique-storage.mjs +155 -0
  459. package/.trae/skills/seven/scripts/load-context.mjs +93 -0
  460. package/.trae/skills/seven/scripts/update-check.mjs +120 -0
  461. package/.trae-cn/skills/seven/SKILL.md +163 -0
  462. package/.trae-cn/skills/seven/reference/adapt.md +34 -0
  463. package/.trae-cn/skills/seven/reference/animate.md +31 -0
  464. package/.trae-cn/skills/seven/reference/app-shell.md +152 -0
  465. package/.trae-cn/skills/seven/reference/audit.md +122 -0
  466. package/.trae-cn/skills/seven/reference/bolder.md +34 -0
  467. package/.trae-cn/skills/seven/reference/brand.md +31 -0
  468. package/.trae-cn/skills/seven/reference/clarify.md +76 -0
  469. package/.trae-cn/skills/seven/reference/color-and-contrast.md +84 -0
  470. package/.trae-cn/skills/seven/reference/colorize.md +31 -0
  471. package/.trae-cn/skills/seven/reference/critique.md +53 -0
  472. package/.trae-cn/skills/seven/reference/delight.md +30 -0
  473. package/.trae-cn/skills/seven/reference/distill.md +30 -0
  474. package/.trae-cn/skills/seven/reference/doctor.md +7 -0
  475. package/.trae-cn/skills/seven/reference/document.md +36 -0
  476. package/.trae-cn/skills/seven/reference/evaluations.md +38 -0
  477. package/.trae-cn/skills/seven/reference/exceptions.md +7 -0
  478. package/.trae-cn/skills/seven/reference/extract.md +42 -0
  479. package/.trae-cn/skills/seven/reference/harden.md +36 -0
  480. package/.trae-cn/skills/seven/reference/hooks.md +11 -0
  481. package/.trae-cn/skills/seven/reference/init.md +38 -0
  482. package/.trae-cn/skills/seven/reference/layout.md +33 -0
  483. package/.trae-cn/skills/seven/reference/live.md +106 -0
  484. package/.trae-cn/skills/seven/reference/motion-design.md +71 -0
  485. package/.trae-cn/skills/seven/reference/onboard.md +35 -0
  486. package/.trae-cn/skills/seven/reference/optimize.md +34 -0
  487. package/.trae-cn/skills/seven/reference/overdrive.md +32 -0
  488. package/.trae-cn/skills/seven/reference/polish.md +55 -0
  489. package/.trae-cn/skills/seven/reference/product.md +43 -0
  490. package/.trae-cn/skills/seven/reference/quieter.md +31 -0
  491. package/.trae-cn/skills/seven/reference/routing.md +28 -0
  492. package/.trae-cn/skills/seven/reference/shape.md +85 -0
  493. package/.trae-cn/skills/seven/reference/spatial-design.md +60 -0
  494. package/.trae-cn/skills/seven/reference/typeset.md +28 -0
  495. package/.trae-cn/skills/seven/reference/typography.md +43 -0
  496. package/.trae-cn/skills/seven/reference/ux-writing.md +47 -0
  497. package/.trae-cn/skills/seven/reference/visual-probes.md +36 -0
  498. package/.trae-cn/skills/seven/scripts/context-signals.mjs +94 -0
  499. package/.trae-cn/skills/seven/scripts/critique-storage.mjs +155 -0
  500. package/.trae-cn/skills/seven/scripts/load-context.mjs +93 -0
  501. package/.trae-cn/skills/seven/scripts/update-check.mjs +120 -0
  502. package/.vibe/skills/seven/SKILL.md +166 -0
  503. package/.vibe/skills/seven/reference/adapt.md +34 -0
  504. package/.vibe/skills/seven/reference/animate.md +31 -0
  505. package/.vibe/skills/seven/reference/app-shell.md +152 -0
  506. package/.vibe/skills/seven/reference/audit.md +122 -0
  507. package/.vibe/skills/seven/reference/bolder.md +34 -0
  508. package/.vibe/skills/seven/reference/brand.md +31 -0
  509. package/.vibe/skills/seven/reference/clarify.md +76 -0
  510. package/.vibe/skills/seven/reference/color-and-contrast.md +84 -0
  511. package/.vibe/skills/seven/reference/colorize.md +31 -0
  512. package/.vibe/skills/seven/reference/critique.md +53 -0
  513. package/.vibe/skills/seven/reference/delight.md +30 -0
  514. package/.vibe/skills/seven/reference/distill.md +30 -0
  515. package/.vibe/skills/seven/reference/doctor.md +7 -0
  516. package/.vibe/skills/seven/reference/document.md +36 -0
  517. package/.vibe/skills/seven/reference/evaluations.md +38 -0
  518. package/.vibe/skills/seven/reference/exceptions.md +7 -0
  519. package/.vibe/skills/seven/reference/extract.md +42 -0
  520. package/.vibe/skills/seven/reference/harden.md +36 -0
  521. package/.vibe/skills/seven/reference/hooks.md +11 -0
  522. package/.vibe/skills/seven/reference/init.md +38 -0
  523. package/.vibe/skills/seven/reference/layout.md +33 -0
  524. package/.vibe/skills/seven/reference/live.md +106 -0
  525. package/.vibe/skills/seven/reference/motion-design.md +71 -0
  526. package/.vibe/skills/seven/reference/onboard.md +35 -0
  527. package/.vibe/skills/seven/reference/optimize.md +34 -0
  528. package/.vibe/skills/seven/reference/overdrive.md +32 -0
  529. package/.vibe/skills/seven/reference/polish.md +55 -0
  530. package/.vibe/skills/seven/reference/product.md +43 -0
  531. package/.vibe/skills/seven/reference/quieter.md +31 -0
  532. package/.vibe/skills/seven/reference/routing.md +28 -0
  533. package/.vibe/skills/seven/reference/shape.md +85 -0
  534. package/.vibe/skills/seven/reference/spatial-design.md +60 -0
  535. package/.vibe/skills/seven/reference/typeset.md +28 -0
  536. package/.vibe/skills/seven/reference/typography.md +43 -0
  537. package/.vibe/skills/seven/reference/ux-writing.md +47 -0
  538. package/.vibe/skills/seven/reference/visual-probes.md +36 -0
  539. package/.vibe/skills/seven/scripts/context-signals.mjs +94 -0
  540. package/.vibe/skills/seven/scripts/critique-storage.mjs +155 -0
  541. package/.vibe/skills/seven/scripts/load-context.mjs +93 -0
  542. package/.vibe/skills/seven/scripts/update-check.mjs +120 -0
  543. package/README.md +51 -90
  544. package/cli/bin/seven.mjs +0 -0
  545. package/cli/engine/browser/injected/index.mjs +62 -13
  546. package/cli/engine/detect-antipatterns-browser.js +4739 -19
  547. package/cli/engine/detect-antipatterns.mjs +1 -0
  548. package/cli/engine/engines/browser/detect-url.mjs +366 -3
  549. package/cli/engine/engines/regex/detect-text.mjs +469 -1
  550. package/cli/engine/engines/static-html/detect-html.mjs +131 -0
  551. package/cli/engine/registry/seven-antipatterns.mjs +379 -4
  552. package/cli/engine/rules/checks.mjs +360 -1
  553. package/cli/engine/shared/tokens.mjs +19 -0
  554. package/cli/engine/token-data.generated.mjs +4025 -0
  555. package/docs/detector-rules.md +277 -38
  556. package/docs/upstream-parity.json +242 -0
  557. package/extension/README.md +5 -0
  558. package/extension/background/service-worker.js +134 -0
  559. package/extension/content/content-script.js +340 -0
  560. package/extension/detector/detect.js +7816 -0
  561. package/extension/devtools/devtools.html +1 -0
  562. package/extension/devtools/devtools.js +3 -0
  563. package/extension/devtools/panel.css +66 -0
  564. package/extension/devtools/panel.html +3 -0
  565. package/extension/devtools/panel.js +37 -0
  566. package/extension/manifest.json +22 -0
  567. package/extension/popup/popup.css +106 -0
  568. package/extension/popup/popup.html +27 -0
  569. package/extension/popup/popup.js +74 -0
  570. package/package.json +19 -8
@@ -0,0 +1,85 @@
1
+ # Shape
2
+
3
+ Shape the UX of a feature before any code is written. This command produces a **design brief**: a structured artifact that guides implementation through discovery, not guesswork.
4
+
5
+ **Scope**: design planning only. Shape does not write code. It produces the thinking that makes code good.
6
+
7
+ **Output**: a design brief that can be handed off to a downstream command (`polish`, `audit`, or implementation by Claude). When a materially ambiguous visual decision remains, read [visual-probes.md](visual-probes.md); probes never authorize tokens, components, or variants outside Seven.
8
+
9
+ ## Philosophy
10
+
11
+ Most AI-generated UIs fail not because of bad code, but because of skipped thinking. They jump to "here is a card grid" without asking "what is the user trying to accomplish?" Shape inverts that: understand deeply first, so the implementation lands on the first pass.
12
+
13
+ ## Phase 1: Discovery interview
14
+
15
+ Do not write code or commit design decisions during this phase. ask the user directly for the missing product decision before editing UI
16
+
17
+ ### Interview cadence
18
+
19
+ - 2-3 questions per round. Stop and wait for answers.
20
+ - One round is the default. Add a second only if the first leaves material gaps.
21
+ - Use `PRODUCT.md`, `.seven/project.yml`, the release lock, and the matched surface brief as anchors. Never use a consumer `DESIGN.md` as visual authority.
22
+ - **Assert-then-confirm**, not menu-with-escape. When `PRODUCT.md` makes one path obvious, name it and ask the user to confirm or override. Avoid four-option menus when the answer is already clear.
23
+
24
+ ### Purpose and context
25
+
26
+ - What is this feature for? What problem does it solve?
27
+ - Who specifically uses it? Role, context, frequency.
28
+ - What does success look like? How does the team know the feature is working?
29
+ - What is the user's state of mind on this screen? Rushed, exploring, anxious, focused?
30
+
31
+ ### Content and data
32
+
33
+ - What content or data does the surface display or collect?
34
+ - Realistic ranges: minimum, typical, maximum (0 items, 5 items, 500 items).
35
+ - Edge cases: empty state, error state, first-time use, power user.
36
+ - Is content dynamic? What changes and how often?
37
+
38
+ ### Register and surface
39
+
40
+ For Seven, register is almost always `product`. Confirm once:
41
+
42
+ - Is this an app/admin/dashboard surface (`product`) or a public marketing/storytelling surface (`brand`)?
43
+ - What is the surface type? Page, panel, dialog, popover, table row, empty state, navigation.
44
+
45
+ ### Scope
46
+
47
+ - Fidelity: sketch, mid-fi, or production.
48
+ - Breadth: one component, one screen, a flow, a whole surface.
49
+ - Interactivity: static visual, interactive, shipped-quality.
50
+ - Time intent: quick exploration, or polish until it ships.
51
+
52
+ ### Constraints
53
+
54
+ - Technical: React 19, Tailwind v4, `@etus/ui`, `@etus/tokens`. Performance budget if relevant.
55
+ - Localization: pt-BR for chrome by default. English for code identifiers and docs.
56
+ - Responsive: mobile-first or desktop-first? Touch target minimum 44 x 44.
57
+ - Accessibility: WCAG 2.1 AA baseline always; document any AAA targets.
58
+
59
+ ### Anti-goals
60
+
61
+ - What should this NOT be? What direction would be wrong?
62
+ - What is the biggest risk if the implementation lands wrong?
63
+
64
+ ## Phase 2: Brief synthesis
65
+
66
+ After discovery, write a short brief (under one page) covering:
67
+
68
+ 1. **Surface description** in one sentence.
69
+ 2. **Register and scope** confirmed.
70
+ 3. **Component reuse plan**: which `@etus/ui` components are already in the surface. Which are missing.
71
+ 4. **Variant inventory**: for each component, which variant. If a variant is missing from the exact installed registry contract, flag it explicitly; do not invent or reach into a newer release.
72
+ 5. **State matrix**: idle, loading, empty, error, success, disabled. For each state, the visual approach.
73
+ 6. **Token plan**: which `@etus/tokens` variables compose the surface. Call out any place a token is missing and a hex would be needed; surface that as a question, do not invent.
74
+ 7. **Copy direction**: pt-BR examples for labels, buttons, empty state, errors. Sentence case, no trailing periods, imperative leads.
75
+ 8. **Open questions**: what is still uncertain after the interview.
76
+
77
+ ## Sub-command interaction
78
+
79
+ - After `shape`, the user can hand off to `polish` (refine an existing implementation), `audit` (check the implementation against the brief), or implement directly with the brief loaded as context.
80
+ - `shape` does not generate code. If the user requests code in this command, surface the boundary and recommend they re-invoke without the `shape` prefix.
81
+
82
+ ## Refusals
83
+
84
+ - "Just write the code, skip the brief" — Shape exists because skipping the brief produces generic output. Offer a 5-minute Quick Shape (3 questions instead of 8) as a middle ground; do not skip entirely.
85
+ - "Generate three visual variants" — Do so only when the decision is genuinely visual and the user asks. Keep the same Seven token/component authority in every probe, label the decision being tested, and discard probes that do not answer it.
@@ -0,0 +1,60 @@
1
+ # Spatial design
2
+
3
+ Seven runs two radius stacks. They are not interchangeable. Mixing them within the same surface produces the "almost looks right" drift that is the most common Seven anti-pattern.
4
+
5
+ ## Radius stacks
6
+
7
+ **Component scale** — `sm 4 / md 8 / lg 12`. Use for:
8
+
9
+ - Buttons (default `md`).
10
+ - Inputs, selects, textareas (`md`).
11
+ - Badges (`sm` for tags, `pill` for status).
12
+ - Checkboxes, radios, switches.
13
+ - Avatar squares.
14
+
15
+ **Surface scale** — `xl 16 / 2xl 20 / 3xl 24 / 4xl 32`. Use for:
16
+
17
+ - Cards, panels.
18
+ - Dialogs, sheets, drawers.
19
+ - Popovers, tooltips, dropdowns.
20
+ - Image containers, thumbnail tiles.
21
+
22
+ **Pill radius** — `9999`. Use only for:
23
+
24
+ - Badges and tags shaped as pills (`<Badge variant="pill">`).
25
+ - Avatar triggers in the topbar (round avatars).
26
+ - Status indicators (dots and pills).
27
+
28
+ Never pill on buttons. Buttons stay on the component scale. The detector ships a `pill-on-button` rule that catches drift.
29
+
30
+ ## Spacing
31
+
32
+ Seven spacing tokens come from `@etus/tokens`. The runtime is `--spacing-0` through `--spacing-12` in 4 px steps, then doubled steps (`--spacing-16`, `--spacing-20`, `--spacing-24`).
33
+
34
+ Use Tailwind's `p-`, `m-`, `gap-` utilities backed by the token ramp. Do not invent spacing values via arbitrary classes unless the design explicitly requires a non-token interval (rare; surface it).
35
+
36
+ Rhythm matters more than consistency: a dashboard with identical padding everywhere reads as a wireframe. Vary spacing intentionally — tighter inside a card, looser between cards, looser still between sections.
37
+
38
+ ## Borders
39
+
40
+ Borders carry hierarchy in Seven, not shadows.
41
+
42
+ - 1 px `var(--border)` is the workhorse. Cards, inputs, dividers, table rows all use it.
43
+ - 2 px borders are reserved for focus and active states (4 px on focus rings).
44
+ - Side-stripe borders (`border-left` or `border-right` greater than 1 px as a colored accent) are banned. The detector ships a `side-stripe-border` rule. Use full borders, background tints, leading icons, or restructure the element.
45
+
46
+ ## Shadows
47
+
48
+ Shadows in Seven are reserved for overlays:
49
+
50
+ - Modals, dialogs, sheets — `var(--shadow-overlay)`.
51
+ - Dropdowns, popovers, tooltips — `var(--shadow-popover)`.
52
+ - The brand logo plate — `var(--shadow-primary)` for the mint glow.
53
+
54
+ Card chrome uses borders, not shadows. If a card needs more weight, deepen the border color or tint the background, do not stack a shadow.
55
+
56
+ ## Refusals
57
+
58
+ - "Add a soft shadow under the card" — Seven cards use borders for hierarchy. Suggest a tinted background or a 2 px accent border. If the user insists, document the deviation in the audit.
59
+ - "Use a 16 px radius on the button" — Surface scale on a button reads as a chip from a different design system. Recommend `md 8` or surface as a Seven component-contract request.
60
+ - "Stack a card inside a card" — Nested cards are a Seven anti-pattern. Recommend a section divider, a labeled list, or a `Tabs` view instead.
@@ -0,0 +1,28 @@
1
+ # Typeset — Seven typography under stress
2
+
3
+ Refine hierarchy, readability, and delivery using the installed Seven Text component roles, Inter, and JetBrains Mono. Read [typography.md](typography.md) first.
4
+
5
+ ## Two-pass assessment
6
+
7
+ Keep these passes separate before synthesizing:
8
+
9
+ 1. Rendered typography: identify roles, hierarchy, reading measure, density, line breaks, numeric alignment, long pt-BR copy, zoom, and fallback behavior.
10
+ 2. Mechanical scan: run `seven check --file <target>` and inspect arbitrary/dynamic styles the detector cannot resolve.
11
+
12
+ For every claim, cite a component, selector, computed value, or screenshot state.
13
+
14
+ ## Apply
15
+
16
+ - Use the fewest Text variants that make heading, body, label, metadata, and numeric roles unmistakable.
17
+ - Reuse declared Text variants instead of rebuilding a type ramp with utilities.
18
+ - Keep product body text at the Seven base role; dense captions must remain readable and cannot become body copy by volume.
19
+ - Keep prose near 45–75 characters per line and adjust layout before inventing a font size.
20
+ - Use tabular figures for tables, KPIs, timestamps, and aligned numbers.
21
+ - Preserve browser zoom and user font scaling. Test long words, names, values, and localization expansion.
22
+ - Load only used Inter/JetBrains Mono assets and weights; avoid invisible text and disruptive metric changes.
23
+
24
+ Never introduce another font family, letter spacing for generic labels, extreme negative tracking, all-caps body copy, oversized H1s, or arbitrary scale values. A missing role is a Seven contract gap.
25
+
26
+ ## Verify
27
+
28
+ Confirm hierarchy without reading the words, long-content wrapping, 200% zoom, narrow containers, dark mode, and final detector output. Report each Text variant used and any unresolved contract gap.
@@ -0,0 +1,43 @@
1
+ # Typography
2
+
3
+ Inter is the only sans face in Seven. JetBrains Mono is the only mono face. Every other typeface decision routes back to one of these two.
4
+
5
+ ## Hard rules
6
+
7
+ - **Inter for everything sans-serif.** UI chrome, body, headings, display, numeric tabular figures. Use Inter's variable axes for weight (400 / 500 / 600 / 700) and width (`wdth` axis only if Figma uses it; Seven currently does not).
8
+ - **JetBrains Mono for code and keyboard glyphs.** Never DM Mono, never IBM Plex Mono, never the system mono fallback as a primary choice.
9
+ - **Reflex-reject in Seven**: Space Grotesk, Geist, DM Mono, Inter Tight, Inter Display. They appear in legacy Figma exploration on `Text/Display`, `Text/Heading`, `Dashboard/Dash-01-W`, `Timeline/StatusTitle`, `Feature-item`. They never shipped. Substitute Inter at the same size and surface the swap so the user knows.
10
+ - **Sentence case across every chrome surface.** Headings, labels, button text, menu items, table column headers, breadcrumbs, tabs. Acronyms (KPI, OTP, OIDC, OAuth) stay uppercase.
11
+ - **No trailing periods** on buttons, labels, breadcrumbs, captions, badge text, or short status messages. Periods belong in body prose, not in chrome.
12
+
13
+ ## Scale
14
+
15
+ Seven's scale lives in `@etus/tokens`:
16
+
17
+ - Body / `--text-base`: 16 px, line-height 1.5, Inter 400.
18
+ - Caption / `--text-sm`: 14 px, line-height 1.4.
19
+ - Label / `--text-xs`: 12 px, line-height 1.3 (uppercase only for monospaced data-table column headers).
20
+ - Headings / `--text-lg` through `--text-4xl`: walk the Figma `Text/Heading` ramp. Hierarchy via scale plus weight contrast, not via color.
21
+
22
+ Use the `<Text>` component variant API in `@etus/ui` rather than ad-hoc arbitrary classes. `<Text variant="h2">` is correct; `<h2 className="text-2xl font-semibold">` is drift.
23
+
24
+ ## Line-height and the Tailwind v4 trap
25
+
26
+ The combination `leading-none` plus `text-[length:var(--something)]` zeroes line-height in Tailwind v4 (Lightning CSS interprets the arbitrary value before applying `leading-none`'s `1`). Two safe paths:
27
+
28
+ - Use `leading-tight`, `leading-snug`, or a literal `leading-[1.1]`. They survive the Lightning CSS pass.
29
+ - Inline `style={{ fontSize, lineHeight }}` for any case where the variable approach falters.
30
+
31
+ ## Numeric figures
32
+
33
+ Inter ships tabular figures via the `tnum` feature. Apply `font-feature-settings: 'tnum' 1` to tables, data grids, KPI cards, and any column where digits need to line up vertically. The `<DataTable>` component does this for cells by default; manual KPI displays still need it.
34
+
35
+ ## Display surfaces
36
+
37
+ Display typography (hero headings and marketing pages) follows the brand register in [brand.md](brand.md), not product chrome. Do not import display treatment into application UI.
38
+
39
+ ## Refusals
40
+
41
+ - "Use Space Grotesk for the H1" — Inter is the only sans face. Substitute Inter Bold at the same size and surface the swap.
42
+ - "Add letter spacing to the labels" — Seven labels use Inter at default tracking. Letter-spacing belongs to Display only, defined by the brand layer.
43
+ - "Use the system font as a fallback" — Inter is loaded via `next/font` or equivalent. The system fallback is for SSR flash mitigation, never the primary stack.
@@ -0,0 +1,47 @@
1
+ # UX writing
2
+
3
+ Seven's product chrome speaks Brazilian Portuguese. Developer-facing docs and code identifiers stay in English. The voice is direct, decisive, and concrete.
4
+
5
+ ## Hard rules
6
+
7
+ - **Pt-BR for chrome.** Buttons, labels, menu items, navigation, table headers, breadcrumbs, tabs, status messages, empty states, toast text, error messages.
8
+ - **No European Portuguese vocabulary.** The detector ships a `pt-pt-vocab` rule that catches `ficheiro`, `telemóvel`, `ecrã`, `tu` (as a pronoun, not in code), and other catalogued pairs. Use the pt-BR equivalents.
9
+ - **Sentence case** across every chrome surface. Capitalize the first word and proper nouns; everything else lowercase. Acronyms stay uppercase.
10
+ - **No trailing periods** on buttons, labels, captions, badges, breadcrumbs, table column headers, menu items, tabs. Periods belong in body prose, never in chrome.
11
+ - **Imperative leads** for action buttons and menu items: `Procurar`, `Adicionar conta`, `Exportar relatório`, `Excluir item`. Avoid `Clique para`, `Você pode`, `Aqui você`.
12
+
13
+ ## Voice
14
+
15
+ Direct, decisive, brazilian. Three qualities to hold:
16
+
17
+ - **Direct.** No `clique aqui`, no `aprenda mais sobre`. The label says what the action does.
18
+ - **Decisive.** No `talvez`, `poderia`, `seria possível`. If the system is suggesting an action, it commits to the suggestion. If it does not know, it asks.
19
+ - **Concrete.** A token name beats an adjective. `Salvo às 14:32` beats `Alterações salvas com sucesso`. The user already knows it was successful, the timestamp tells them when.
20
+
21
+ ## Microcopy patterns
22
+
23
+ | Surface | Pattern | Example |
24
+ | ------------------- | -------------------------------------- | -------------------------------------------------- |
25
+ | Primary button | Verb + object, imperative | `Adicionar conta`, `Salvar alterações` |
26
+ | Secondary button | Verb only when context obvious | `Cancelar`, `Voltar` |
27
+ | Destructive button | Verb + object, no hedging | `Excluir conta` |
28
+ | Toast (success) | Past tense, short | `Conta criada` |
29
+ | Toast (error) | What broke + what to do | `Não foi possível salvar. Tente novamente.` |
30
+ | Empty state | What is missing + how to fix | `Nenhuma conta. Adicione a primeira para começar.` |
31
+ | Input placeholder | Hint, not instruction | `nome@email.com`, not `Digite o seu email` |
32
+ | Validation error | What is wrong, inline, below the field | `Email obrigatório` |
33
+ | Menu item | Verb in imperative | `Duplicar`, `Renomear`, `Arquivar` |
34
+ | Table column header | Noun, sentence case | `Nome`, `Última atividade`, `Status` |
35
+
36
+ ## Numbers and dates
37
+
38
+ - Numbers use the Brazilian convention: comma for decimals, period for thousands. `1.234,56` not `1,234.56`.
39
+ - Dates default to `dd/mm/yyyy` in chrome surfaces. ISO `yyyy-mm-dd` in data tables and developer-facing logs.
40
+ - Currency: `R$ 1.234,56` with non-breaking space.
41
+ - Relative time for recent events (`há 2 minutos`, `há 1 hora`), absolute date once it crosses 24 hours (`12/03/2026`).
42
+
43
+ ## Refusals
44
+
45
+ - "Use European Portuguese to match the parent company brand" — Pt-BR is non-negotiable for Seven chrome. Surface this to the user; if there is a legitimate need for pt-PT, it is a brand-layer decision documented separately.
46
+ - "Add a period to the button text for consistency with paragraphs" — Chrome and prose follow different rules. Buttons do not get periods.
47
+ - "Make all the labels uppercase for emphasis" — Sentence case is non-negotiable. Use weight or size for emphasis, not uppercase.
@@ -0,0 +1,36 @@
1
+ # Visual probes
2
+
3
+ Use probes only when a real product decision remains visually ambiguous after context and component-contract inspection. A probe answers one named question; it is not a license for arbitrary redesign.
4
+
5
+ ## Contract
6
+
7
+ - Keep the product job, information, behavior, states, content, and accessibility target constant across directions.
8
+ - Use the exact installed Seven components, declared variants, tokens, icon system, typography, radii, and motion language in every direction.
9
+ - Vary one decision family at a time: hierarchy, density, composition, disclosure, emphasis, or responsive reflow.
10
+ - Produce one strong default when evidence points clearly to it. Produce up to three directions only when comparison creates information.
11
+ - Label each direction by its tradeoff, not by generic adjectives such as "modern" or "clean".
12
+ - State what would falsify each direction and which user/job it benefits.
13
+
14
+ ## Direction shape
15
+
16
+ For every probe record:
17
+
18
+ 1. decision being tested;
19
+ 2. hypothesis and affected user job;
20
+ 3. composition/component changes;
21
+ 4. Seven contracts reused;
22
+ 5. behavior across mobile, desktop, keyboard, reduced motion, loading, empty, error, and long-content cases;
23
+ 6. cost/risk;
24
+ 7. verification criterion.
25
+
26
+ In Live Mode, deliver inert HTML/CSS previews only. Outside Live Mode, prefer a concise written probe or throwaway local mock; do not leave exploration code in production paths.
27
+
28
+ ## Anti-patterns
29
+
30
+ - Three variants that differ only by color, radius, or decoration.
31
+ - A "bold" direction that introduces tokens or variants absent from Seven.
32
+ - Comparing different content/data while claiming to compare layout.
33
+ - Selecting the most visually novel direction without product evidence.
34
+ - Treating accepted browser DOM as source code.
35
+
36
+ Finish with one recommendation and the evidence that selects it. If no direction is defensible, return to `shape` rather than averaging them.
@@ -0,0 +1,94 @@
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
+
13
+ function gitNames(root, args) {
14
+ const result = spawnSync('git', args, { cwd: root, encoding: 'utf8' })
15
+ if (result.status !== 0) return []
16
+ return result.stdout.split('\n').map((item) => item.trim()).filter(Boolean)
17
+ }
18
+
19
+ function changedUiFiles(root) {
20
+ const names = new Set([
21
+ ...gitNames(root, ['diff', '--name-only', '--diff-filter=ACMR']),
22
+ ...gitNames(root, ['diff', '--cached', '--name-only', '--diff-filter=ACMR']),
23
+ ...gitNames(root, ['ls-files', '--others', '--exclude-standard']),
24
+ ])
25
+ return [...names].filter((name) => UI_EXTENSIONS.has(path.extname(name).toLowerCase())).sort()
26
+ }
27
+
28
+ function latestReview(root) {
29
+ const directory = path.join(root, '.seven', 'reviews')
30
+ let names = []
31
+ try {
32
+ names = fs.readdirSync(directory).filter((name) => name.endsWith('.json'))
33
+ } catch {
34
+ return null
35
+ }
36
+ const candidates = names.map((name) => {
37
+ const filePath = path.join(directory, name)
38
+ try {
39
+ return { filePath, mtime: fs.statSync(filePath).mtimeMs, payload: JSON.parse(fs.readFileSync(filePath, 'utf8')) }
40
+ } catch {
41
+ return null
42
+ }
43
+ }).filter(Boolean).sort((left, right) => right.mtime - left.mtime)
44
+ if (!candidates[0]) return null
45
+ return {
46
+ path: path.relative(root, candidates[0].filePath).split(path.sep).join('/'),
47
+ createdAt: candidates[0].payload.createdAt || null,
48
+ score: candidates[0].payload.score ?? null,
49
+ p0: candidates[0].payload.summary?.p0 ?? 0,
50
+ p1: candidates[0].payload.summary?.p1 ?? 0,
51
+ target: candidates[0].payload.target || null,
52
+ }
53
+ }
54
+
55
+ function scanTargets(context, changed) {
56
+ if (changed.length > 0) return { via: 'git-changes', targets: changed.slice(0, 40) }
57
+ const roots = Array.isArray(context.project?.sourceRoots) ? context.project.sourceRoots : ['src']
58
+ const existing = roots.filter((entry) => fs.existsSync(path.join(context.projectRoot, entry)))
59
+ return { via: 'source-roots', targets: existing.slice(0, 8) }
60
+ }
61
+
62
+ export async function collectContextSignals(start = process.cwd(), { target = start } = {}) {
63
+ const context = await loadContext(start, { target })
64
+ const changed = changedUiFiles(context.projectRoot)
65
+ return {
66
+ schemaVersion: 1,
67
+ projectRoot: context.projectRoot,
68
+ target: path.resolve(target),
69
+ setup: {
70
+ hasProduct: context.hasProduct,
71
+ productPlaceholder: context.productPlaceholder,
72
+ hasRelease: Boolean(context.release),
73
+ register: context.register,
74
+ app: context.app?.id || null,
75
+ surface: context.surface?.id || null,
76
+ },
77
+ git: { changedFiles: changed },
78
+ critique: { latest: latestReview(context.projectRoot) },
79
+ scan: scanTargets(context, changed),
80
+ live: {
81
+ session: fs.existsSync(path.join(context.projectRoot, '.seven', 'live', 'session.json')),
82
+ journal: fs.existsSync(path.join(context.projectRoot, '.seven', 'live', 'journal.ndjson')),
83
+ extensionPathCommand: 'seven extension path',
84
+ },
85
+ }
86
+ }
87
+
88
+ export async function main(argv = process.argv) {
89
+ const target = argValue('--target', argv) || process.env.SEVEN_TARGET || process.cwd()
90
+ const signals = await collectContextSignals(target, { target })
91
+ process.stdout.write(`${JSON.stringify(signals, null, 2)}\n`)
92
+ }
93
+
94
+ 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
+ }
@@ -0,0 +1,93 @@
1
+ #!/usr/bin/env node
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ // ETUS Digital — Seven consumer context adapter.
4
+
5
+ import fs from 'node:fs'
6
+ import path from 'node:path'
7
+ import { createRequire } from 'node:module'
8
+ import { fileURLToPath, pathToFileURL } from 'node:url'
9
+
10
+ import { checkForUpdate } from './update-check.mjs'
11
+
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
17
+ }
18
+
19
+ export function findRoot(start) {
20
+ let current = path.resolve(start)
21
+ try {
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
31
+ }
32
+ return fallbackRoot
33
+ }
34
+
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) }
44
+ }
45
+ }
46
+
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
+ }
69
+ }
70
+
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
75
+ }
76
+
77
+ export async function main(argv = process.argv) {
78
+ const target = argValue('--target', argv) || process.env.SEVEN_TARGET || process.cwd()
79
+ const context = await loadContext(target, { target })
80
+ const update = await checkForUpdate(context.release?.sevenVersion || null)
81
+ process.stdout.write(`${JSON.stringify({ ...context, update }, null, 2)}\n`)
82
+ }
83
+
84
+ function isCliEntry() {
85
+ if (!process.argv[1]) return false
86
+ try {
87
+ return fs.realpathSync(fileURLToPath(import.meta.url)) === fs.realpathSync(process.argv[1])
88
+ } catch {
89
+ return false
90
+ }
91
+ }
92
+
93
+ if (isCliEntry()) await main()