@su-record/vibe 2.16.3 → 3.0.0

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 (353) hide show
  1. package/.env.example +15 -0
  2. package/CLAUDE.md +8 -8
  3. package/README.en.md +46 -29
  4. package/README.md +41 -24
  5. package/agents/acceptance-tester.md +56 -0
  6. package/agents/architect.md +25 -67
  7. package/agents/build-error-resolver.md +28 -97
  8. package/agents/code-reviewer.md +89 -0
  9. package/agents/diagrammer.md +34 -165
  10. package/agents/documenter.md +43 -0
  11. package/agents/e2e-tester.md +46 -277
  12. package/agents/event/event-ops.md +54 -77
  13. package/agents/event/event-planner.md +63 -0
  14. package/agents/figma/figma-engineer.md +76 -0
  15. package/agents/implementer.md +26 -41
  16. package/agents/security-reviewer.md +56 -0
  17. package/agents/tester.md +37 -33
  18. package/agents/ui/design-reviewer.md +62 -0
  19. package/agents/ui/design-system-gen.md +63 -0
  20. package/dist/__tests__/agent-model-sync.test.d.ts +2 -0
  21. package/dist/__tests__/agent-model-sync.test.d.ts.map +1 -0
  22. package/dist/__tests__/agent-model-sync.test.js +71 -0
  23. package/dist/__tests__/agent-model-sync.test.js.map +1 -0
  24. package/dist/cli/auth.d.ts.map +1 -1
  25. package/dist/cli/auth.js +8 -1
  26. package/dist/cli/auth.js.map +1 -1
  27. package/dist/cli/commands/index.d.ts +1 -0
  28. package/dist/cli/commands/index.d.ts.map +1 -1
  29. package/dist/cli/commands/index.js +1 -0
  30. package/dist/cli/commands/index.js.map +1 -1
  31. package/dist/cli/commands/info.d.ts.map +1 -1
  32. package/dist/cli/commands/info.js +2 -0
  33. package/dist/cli/commands/info.js.map +1 -1
  34. package/dist/cli/commands/llm.d.ts +11 -0
  35. package/dist/cli/commands/llm.d.ts.map +1 -0
  36. package/dist/cli/commands/llm.js +62 -0
  37. package/dist/cli/commands/llm.js.map +1 -0
  38. package/dist/cli/commands/remove.d.ts.map +1 -1
  39. package/dist/cli/commands/remove.js +8 -10
  40. package/dist/cli/commands/remove.js.map +1 -1
  41. package/dist/cli/commands/setup.d.ts.map +1 -1
  42. package/dist/cli/commands/setup.js +35 -1
  43. package/dist/cli/commands/setup.js.map +1 -1
  44. package/dist/cli/index.d.ts +0 -4
  45. package/dist/cli/index.d.ts.map +1 -1
  46. package/dist/cli/index.js +59 -6
  47. package/dist/cli/index.js.map +1 -1
  48. package/dist/cli/llm/config.d.ts.map +1 -1
  49. package/dist/cli/llm/config.js +7 -0
  50. package/dist/cli/llm/config.js.map +1 -1
  51. package/dist/cli/llm/index.d.ts +1 -0
  52. package/dist/cli/llm/index.d.ts.map +1 -1
  53. package/dist/cli/llm/index.js +1 -0
  54. package/dist/cli/llm/index.js.map +1 -1
  55. package/dist/cli/llm/model-refresh.d.ts +29 -0
  56. package/dist/cli/llm/model-refresh.d.ts.map +1 -0
  57. package/dist/cli/llm/model-refresh.js +139 -0
  58. package/dist/cli/llm/model-refresh.js.map +1 -0
  59. package/dist/cli/llm/zai-commands.d.ts +15 -0
  60. package/dist/cli/llm/zai-commands.d.ts.map +1 -0
  61. package/dist/cli/llm/zai-commands.js +64 -0
  62. package/dist/cli/llm/zai-commands.js.map +1 -0
  63. package/dist/cli/postinstall/claude-agents.d.ts.map +1 -1
  64. package/dist/cli/postinstall/claude-agents.js +16 -77
  65. package/dist/cli/postinstall/claude-agents.js.map +1 -1
  66. package/dist/cli/postinstall/constants.d.ts.map +1 -1
  67. package/dist/cli/postinstall/constants.js +81 -296
  68. package/dist/cli/postinstall/constants.js.map +1 -1
  69. package/dist/cli/postinstall/cursor-agents.d.ts +5 -0
  70. package/dist/cli/postinstall/cursor-agents.d.ts.map +1 -1
  71. package/dist/cli/postinstall/cursor-agents.js +26 -68
  72. package/dist/cli/postinstall/cursor-agents.js.map +1 -1
  73. package/dist/cli/postinstall/cursor-skills.d.ts.map +1 -1
  74. package/dist/cli/postinstall/cursor-skills.js +26 -30
  75. package/dist/cli/postinstall/cursor-skills.js.map +1 -1
  76. package/dist/cli/postinstall/main.d.ts.map +1 -1
  77. package/dist/cli/postinstall/main.js +0 -2
  78. package/dist/cli/postinstall/main.js.map +1 -1
  79. package/dist/cli/setup/Provisioner.d.ts.map +1 -1
  80. package/dist/cli/setup/Provisioner.js +19 -21
  81. package/dist/cli/setup/Provisioner.js.map +1 -1
  82. package/dist/cli/types.d.ts +15 -0
  83. package/dist/cli/types.d.ts.map +1 -1
  84. package/dist/cli/utils.d.ts +4 -1
  85. package/dist/cli/utils.d.ts.map +1 -1
  86. package/dist/cli/utils.js +4 -1
  87. package/dist/cli/utils.js.map +1 -1
  88. package/dist/infra/lib/FrameworkDetector.js +4 -4
  89. package/dist/infra/lib/FrameworkDetector.js.map +1 -1
  90. package/dist/infra/lib/OrchestrateWorkflow.js +2 -2
  91. package/dist/infra/lib/OrchestrateWorkflow.js.map +1 -1
  92. package/dist/infra/lib/browser/launch.js +1 -1
  93. package/dist/infra/lib/browser/launch.js.map +1 -1
  94. package/dist/infra/lib/browser/types.d.ts +1 -1
  95. package/dist/infra/lib/browser/types.js +1 -1
  96. package/dist/infra/lib/config/GlobalConfigManager.d.ts +2 -0
  97. package/dist/infra/lib/config/GlobalConfigManager.d.ts.map +1 -1
  98. package/dist/infra/lib/config/GlobalConfigManager.js +6 -0
  99. package/dist/infra/lib/config/GlobalConfigManager.js.map +1 -1
  100. package/dist/infra/lib/constants.d.ts +1 -1
  101. package/dist/infra/lib/constants.d.ts.map +1 -1
  102. package/dist/infra/lib/constants.js +4 -5
  103. package/dist/infra/lib/constants.js.map +1 -1
  104. package/dist/infra/lib/evolution/__tests__/integration.test.js +7 -7
  105. package/dist/infra/lib/evolution/__tests__/integration.test.js.map +1 -1
  106. package/dist/infra/lib/llm-availability.d.ts +4 -0
  107. package/dist/infra/lib/llm-availability.d.ts.map +1 -1
  108. package/dist/infra/lib/llm-availability.js +9 -1
  109. package/dist/infra/lib/llm-availability.js.map +1 -1
  110. package/dist/infra/lib/memory/index.d.ts +0 -2
  111. package/dist/infra/lib/memory/index.d.ts.map +1 -1
  112. package/dist/infra/lib/memory/index.js +0 -2
  113. package/dist/infra/lib/memory/index.js.map +1 -1
  114. package/dist/infra/lib/telemetry/SkillTelemetry.test.js +1 -1
  115. package/dist/infra/lib/telemetry/SkillTelemetry.test.js.map +1 -1
  116. package/dist/infra/lib/zai/client.d.ts +30 -0
  117. package/dist/infra/lib/zai/client.d.ts.map +1 -0
  118. package/dist/infra/lib/zai/client.js +124 -0
  119. package/dist/infra/lib/zai/client.js.map +1 -0
  120. package/dist/infra/lib/zai/index.d.ts +11 -0
  121. package/dist/infra/lib/zai/index.d.ts.map +1 -0
  122. package/dist/infra/lib/zai/index.js +10 -0
  123. package/dist/infra/lib/zai/index.js.map +1 -0
  124. package/dist/infra/lib/zai/orchestration.d.ts +15 -0
  125. package/dist/infra/lib/zai/orchestration.d.ts.map +1 -0
  126. package/dist/infra/lib/zai/orchestration.js +54 -0
  127. package/dist/infra/lib/zai/orchestration.js.map +1 -0
  128. package/dist/infra/lib/zai/types.d.ts +40 -0
  129. package/dist/infra/lib/zai/types.d.ts.map +1 -0
  130. package/dist/infra/lib/zai/types.js +5 -0
  131. package/dist/infra/lib/zai/types.js.map +1 -0
  132. package/dist/infra/orchestrator/SmartRouter.d.ts.map +1 -1
  133. package/dist/infra/orchestrator/SmartRouter.js +16 -34
  134. package/dist/infra/orchestrator/SmartRouter.js.map +1 -1
  135. package/dist/infra/orchestrator/index.d.ts +1 -0
  136. package/dist/infra/orchestrator/index.d.ts.map +1 -1
  137. package/dist/infra/orchestrator/index.js +11 -9
  138. package/dist/infra/orchestrator/index.js.map +1 -1
  139. package/dist/infra/orchestrator/types.d.ts +32 -9
  140. package/dist/infra/orchestrator/types.d.ts.map +1 -1
  141. package/dist/infra/orchestrator/types.js +68 -37
  142. package/dist/infra/orchestrator/types.js.map +1 -1
  143. package/dist/infra/orchestrator/types.test.d.ts +2 -0
  144. package/dist/infra/orchestrator/types.test.d.ts.map +1 -0
  145. package/dist/infra/orchestrator/types.test.js +57 -0
  146. package/dist/infra/orchestrator/types.test.js.map +1 -0
  147. package/dist/tools/index.d.ts +0 -4
  148. package/dist/tools/index.d.ts.map +1 -1
  149. package/dist/tools/index.js +0 -4
  150. package/dist/tools/index.js.map +1 -1
  151. package/dist/tools/memory/autoSaveContext.d.ts +0 -1
  152. package/dist/tools/memory/autoSaveContext.d.ts.map +1 -1
  153. package/dist/tools/memory/autoSaveContext.js +13 -27
  154. package/dist/tools/memory/autoSaveContext.js.map +1 -1
  155. package/hooks/scripts/__tests__/code-check-detectors.test.js +2 -2
  156. package/hooks/scripts/__tests__/run-ledger.test.js +1 -1
  157. package/hooks/scripts/__tests__/scope-from-spec.test.js +12 -12
  158. package/hooks/scripts/__tests__/step-counter.test.js +1 -1
  159. package/hooks/scripts/code-check.js +16 -203
  160. package/hooks/scripts/context-save.js +0 -11
  161. package/hooks/scripts/lib/scope-from-spec.js +9 -6
  162. package/hooks/scripts/llm-orchestrate.js +49 -0
  163. package/hooks/scripts/post-edit-dispatcher.js +1 -1
  164. package/hooks/scripts/prompt-dispatcher.js +7 -18
  165. package/hooks/scripts/session-start.js +25 -35
  166. package/package.json +4 -4
  167. package/skills/agents-md/SKILL.md +62 -15
  168. package/skills/arch-guard/SKILL.md +1 -1
  169. package/skills/brand-assets/SKILL.md +2 -2
  170. package/skills/capability-loop/SKILL.md +1 -1
  171. package/skills/chub-usage/SKILL.md +1 -1
  172. package/skills/commerce-patterns/SKILL.md +2 -2
  173. package/skills/commit-push-pr/SKILL.md +0 -1
  174. package/skills/context7-usage/SKILL.md +1 -1
  175. package/skills/create-prd/agents/edge-case-finder.md +4 -4
  176. package/skills/create-prd/agents/prioritizer.md +4 -4
  177. package/skills/create-prd/agents/requirements-writer.md +3 -3
  178. package/skills/create-prd/agents/researcher.md +3 -3
  179. package/skills/create-prd/agents/reviewer.md +3 -3
  180. package/skills/create-prd/orchestrator.md +2 -0
  181. package/skills/design-refine/SKILL.md +140 -0
  182. package/skills/{design-polish → design-refine}/templates/polish-report.md +1 -1
  183. package/skills/{design-normalize → design-refine}/templates/token-audit.md +3 -3
  184. package/skills/design-review/SKILL.md +143 -0
  185. package/skills/{design-audit → design-review}/agents/a11y-auditor.md +1 -1
  186. package/skills/{design-audit → design-review}/agents/performance-auditor.md +1 -1
  187. package/skills/{design-audit → design-review}/agents/responsive-auditor.md +1 -1
  188. package/skills/{design-audit → design-review}/agents/slop-detector.md +1 -1
  189. package/skills/{design-audit → design-review}/frameworks/core-web-vitals.md +1 -1
  190. package/skills/{design-audit → design-review}/frameworks/wcag-checklist.md +1 -1
  191. package/skills/{design-audit → design-review}/orchestrator.md +5 -3
  192. package/skills/{design-critique → design-review}/templates/critique-report.md +3 -3
  193. package/skills/{design-audit → design-review}/templates/report.md +3 -3
  194. package/skills/design-teach/SKILL.md +11 -11
  195. package/skills/docs/SKILL.md +14 -16
  196. package/skills/e2e-commerce/SKILL.md +1 -1
  197. package/skills/event-comms/SKILL.md +1 -1
  198. package/skills/event-ops/SKILL.md +2 -2
  199. package/skills/event-planning/SKILL.md +1 -1
  200. package/skills/exec-plan/SKILL.md +2 -2
  201. package/skills/exec-plan/orchestrator.md +2 -0
  202. package/skills/figma/SKILL.md +240 -148
  203. package/skills/figma/rubrics/css-mapping.md +125 -0
  204. package/skills/git-worktree/SKILL.md +1 -1
  205. package/skills/handoff/SKILL.md +1 -1
  206. package/skills/parallel-research/SKILL.md +14 -28
  207. package/skills/parallel-research/orchestrator.md +2 -0
  208. package/skills/priority-todos/SKILL.md +1 -1
  209. package/skills/regress/SKILL.md +11 -0
  210. package/skills/restraint/SKILL.md +72 -0
  211. package/skills/seo-checklist/SKILL.md +2 -2
  212. package/skills/spec/SKILL.md +65 -836
  213. package/skills/test/SKILL.md +3 -3
  214. package/skills/tool-fallback/SKILL.md +2 -2
  215. package/skills/vercel-react-best-practices/SKILL.md +1 -1
  216. package/skills/vibe/SKILL.md +20 -35
  217. package/skills/vibe.analyze/SKILL.md +7 -9
  218. package/skills/vibe.docs/SKILL.md +1 -1
  219. package/skills/vibe.event/SKILL.md +27 -27
  220. package/skills/vibe.figma/SKILL.md +14 -18
  221. package/skills/vibe.harness/SKILL.md +5 -5
  222. package/skills/vibe.llm/SKILL.md +50 -0
  223. package/skills/vibe.reason/SKILL.md +0 -2
  224. package/skills/vibe.review/SKILL.md +45 -49
  225. package/skills/vibe.run/SKILL.md +2 -5
  226. package/skills/vibe.run/references/parallel-agents.md +33 -98
  227. package/skills/vibe.spec/SKILL.md +38 -535
  228. package/skills/vibe.utils/SKILL.md +3 -3
  229. package/skills/vibe.verify/SKILL.md +70 -542
  230. package/skills/video-production/SKILL.md +1 -1
  231. package/vibe/rules/orchestrator-contract.md +57 -0
  232. package/vibe/rules/quality/performance.md +1 -1
  233. package/vibe/templates/claudemd-template.md +1 -1
  234. package/vibe/templates/spec-template.md +35 -185
  235. package/agents/architect-low.md +0 -41
  236. package/agents/architect-medium.md +0 -59
  237. package/agents/compounder.md +0 -261
  238. package/agents/docs/api-documenter.md +0 -99
  239. package/agents/docs/changelog-writer.md +0 -93
  240. package/agents/event/event-comms.md +0 -78
  241. package/agents/event/event-content.md +0 -68
  242. package/agents/event/event-image.md +0 -95
  243. package/agents/event/event-scheduler.md +0 -69
  244. package/agents/event/event-speaker.md +0 -86
  245. package/agents/explorer-low.md +0 -42
  246. package/agents/explorer-medium.md +0 -59
  247. package/agents/explorer.md +0 -48
  248. package/agents/figma/figma-analyst.md +0 -52
  249. package/agents/figma/figma-architect.md +0 -112
  250. package/agents/figma/figma-auditor.md +0 -82
  251. package/agents/figma/figma-builder.md +0 -100
  252. package/agents/implementer-low.md +0 -43
  253. package/agents/implementer-medium.md +0 -52
  254. package/agents/junior-mentor.md +0 -141
  255. package/agents/planning/requirements-analyst.md +0 -84
  256. package/agents/planning/ux-advisor.md +0 -83
  257. package/agents/qa/acceptance-tester.md +0 -86
  258. package/agents/qa/edge-case-finder.md +0 -93
  259. package/agents/qa/qa-coordinator.md +0 -131
  260. package/agents/refactor-cleaner.md +0 -143
  261. package/agents/research/best-practices.md +0 -199
  262. package/agents/research/codebase-patterns.md +0 -157
  263. package/agents/research/framework-docs.md +0 -188
  264. package/agents/research/security-advisory.md +0 -213
  265. package/agents/review/architecture-reviewer.md +0 -107
  266. package/agents/review/complexity-reviewer.md +0 -116
  267. package/agents/review/data-integrity-reviewer.md +0 -88
  268. package/agents/review/git-history-reviewer.md +0 -103
  269. package/agents/review/performance-reviewer.md +0 -86
  270. package/agents/review/python-reviewer.md +0 -150
  271. package/agents/review/rails-reviewer.md +0 -139
  272. package/agents/review/react-reviewer.md +0 -144
  273. package/agents/review/security-reviewer.md +0 -80
  274. package/agents/review/simplicity-reviewer.md +0 -140
  275. package/agents/review/test-coverage-reviewer.md +0 -116
  276. package/agents/review/typescript-reviewer.md +0 -127
  277. package/agents/searcher.md +0 -54
  278. package/agents/simplifier.md +0 -120
  279. package/agents/teams/debug-team.md +0 -70
  280. package/agents/teams/dev-team.md +0 -88
  281. package/agents/teams/docs-team.md +0 -80
  282. package/agents/teams/figma-team.md +0 -85
  283. package/agents/teams/fullstack-team.md +0 -83
  284. package/agents/teams/lite-team.md +0 -69
  285. package/agents/teams/migration-team.md +0 -78
  286. package/agents/teams/refactor-team.md +0 -94
  287. package/agents/teams/research-team.md +0 -86
  288. package/agents/teams/review-debate-team.md +0 -125
  289. package/agents/teams/security-team.md +0 -81
  290. package/agents/ui/ui-a11y-auditor.md +0 -93
  291. package/agents/ui/ui-antipattern-detector.md +0 -102
  292. package/agents/ui/ui-dataviz-advisor.md +0 -69
  293. package/agents/ui/ui-design-system-gen.md +0 -57
  294. package/agents/ui/ui-industry-analyzer.md +0 -49
  295. package/agents/ui/ui-layout-architect.md +0 -65
  296. package/agents/ui/ui-stack-implementer.md +0 -68
  297. package/agents/ui/ux-compliance-reviewer.md +0 -81
  298. package/agents/ui-previewer.md +0 -258
  299. package/hooks/scripts/__tests__/keyword-detector.test.js +0 -242
  300. package/hooks/scripts/keyword-detector.js +0 -226
  301. package/skills/characterization-test/SKILL.md +0 -209
  302. package/skills/characterization-test/agents/behavior-capturer.md +0 -50
  303. package/skills/characterization-test/agents/coverage-checker.md +0 -54
  304. package/skills/characterization-test/agents/reporter.md +0 -50
  305. package/skills/characterization-test/agents/test-writer.md +0 -49
  306. package/skills/characterization-test/rubrics/coverage-criteria.md +0 -53
  307. package/skills/characterization-test/templates/test-template.ts +0 -101
  308. package/skills/claude-md-guide/SKILL.md +0 -353
  309. package/skills/claude-md-guide/rubrics/anti-patterns.md +0 -88
  310. package/skills/design-audit/SKILL.md +0 -154
  311. package/skills/design-critique/SKILL.md +0 -140
  312. package/skills/design-distill/SKILL.md +0 -131
  313. package/skills/design-normalize/SKILL.md +0 -135
  314. package/skills/design-polish/SKILL.md +0 -132
  315. package/skills/figma-convert/SKILL.md +0 -236
  316. package/skills/figma-extract/SKILL.md +0 -242
  317. package/skills/interview/SKILL.md +0 -358
  318. package/skills/interview/checklists/api.md +0 -101
  319. package/skills/interview/checklists/feature.md +0 -88
  320. package/skills/interview/checklists/library.md +0 -95
  321. package/skills/interview/checklists/mobile.md +0 -89
  322. package/skills/interview/checklists/webapp.md +0 -97
  323. package/skills/interview/checklists/website.md +0 -99
  324. package/skills/plan/SKILL.md +0 -254
  325. package/skills/rob-pike/SKILL.md +0 -66
  326. package/skills/spec/references/askuser-examples.md +0 -57
  327. package/skills/spec/references/example-session.md +0 -87
  328. package/skills/spec/references/templates.md +0 -194
  329. package/skills/spec-review/SKILL.md +0 -725
  330. package/skills/systematic-debugging/SKILL.md +0 -142
  331. package/skills/techdebt/SKILL.md +0 -126
  332. package/skills/techdebt/agents/analyzer.md +0 -50
  333. package/skills/techdebt/agents/fixer.md +0 -41
  334. package/skills/techdebt/agents/reviewer.md +0 -47
  335. package/skills/techdebt/agents/scanner.md +0 -44
  336. package/skills/techdebt/orchestrator.md +0 -70
  337. package/skills/techdebt/rubrics/severity.md +0 -51
  338. package/skills/techdebt/scripts/scan.js +0 -90
  339. package/skills/techdebt/templates/report.md +0 -86
  340. package/skills/typescript-advanced-types/SKILL.md +0 -68
  341. package/skills/typescript-advanced-types/rubrics/type-patterns.md +0 -109
  342. package/skills/yagni-ladder/SKILL.md +0 -90
  343. /package/skills/{claude-md-guide → agents-md}/templates/claude-md.md +0 -0
  344. /package/skills/{design-polish → design-refine}/rubrics/polish-checklist.md +0 -0
  345. /package/skills/{design-normalize → design-refine}/rubrics/token-naming.md +0 -0
  346. /package/skills/{design-distill → design-refine}/templates/design-system.md +0 -0
  347. /package/skills/{design-audit → design-review}/agents/scorer.md +0 -0
  348. /package/skills/{design-audit → design-review}/rubrics/ai-slop-patterns.md +0 -0
  349. /package/skills/{design-audit → design-review}/rubrics/scoring.md +0 -0
  350. /package/skills/{design-critique → design-review}/rubrics/ux-heuristics.md +0 -0
  351. /package/skills/{figma-convert → figma}/rubrics/conversion-rules.md +0 -0
  352. /package/skills/{figma-extract → figma}/rubrics/image-rules.md +0 -0
  353. /package/skills/{figma-convert → figma}/templates/component.md +0 -0
@@ -1,294 +1,63 @@
1
- ---
2
- description: End-to-end testing with Closed Loop automation
3
- argument-hint: "test scenario or URL"
4
- ---
1
+ # E2E Tester Agent
5
2
 
6
- # /vibe.e2e
3
+ Closed-loop end-to-end testing — drive the real app in a browser, and when a
4
+ scenario fails, fix and re-verify until it passes.
7
5
 
8
- **Closed Loop E2E Testing** - AI가 직접 브라우저를 조작하여 검증하고, 실패 시 자동 수정을 반복
6
+ ## Role
9
7
 
10
- ## Philosophy: Closed Loop
8
+ - Browser-based E2E verification of Feature scenarios and user flows
9
+ - Auto-fix loop: failure → root cause → minimal fix → re-run failed scenario
10
+ - Visual regression and accessibility (axe/WCAG 2.1 AA) checks
11
11
 
12
- ```
13
- 구현 → 검증 → 실패 → 수정 → 재검증 → ... → 통과
14
- ↑_________________________________↓
12
+ ## Model
15
13
 
16
- 사람 개입 없이 AI가 루프를 완주한다.
17
- 검증이 가벼울수록 루프는 더 많이 돈다.
18
- ```
14
+ **Sonnet** root-cause analysis inside the fix loop
19
15
 
20
- ## Usage
16
+ ## Goal
21
17
 
22
- ```
23
- /vibe.e2e # Run all E2E tests
24
- /vibe.e2e "login flow" # Test specific scenario
25
- /vibe.e2e http://localhost:3000/login # Test specific URL
26
- /vibe.e2e --visual # Visual regression testing
27
- /vibe.e2e --record # Record test video
28
- ```
18
+ Verify every relevant scenario end-to-end in a real browser. Scenarios come
19
+ from `.vibe/features/{feature}.feature` (Gherkin), `.vibe/specs/{feature}.md`
20
+ acceptance criteria, or existing `e2e/*.spec.ts` read them fully before
21
+ testing. On failure, collect evidence (screenshot, console errors, network
22
+ failures), find the root cause, apply a minimal code fix, and re-run only the
23
+ failed scenario. The loop, not a human, closes the gap.
29
24
 
30
- ## Browser Tool Selection (Token Efficiency)
25
+ ## Browser Tooling verification cost decides how many loops you get
31
26
 
32
- **검증 비용이 비싸면 루프가 돌지 않는다.**
27
+ Cheap verification is what makes the closed loop viable. Priority order:
33
28
 
34
- | Tool | 클릭 1회 토큰 | 방식 | Closed Loop 적합성 |
35
- |------|-------------|------|-------------------|
36
- | Playwright MCP | ~12,000+ chars | DOM 트리 전체 전달 | Bad - 2~3회 만에 컨텍스트 소진 |
37
- | Agent Browser | ~6 chars | 접근성 트리 (의미만 추출) | Good - 수십 회 루프 가능 |
38
- | Playwright Test Runner | N/A (코드 실행) | 테스트 코드 결과만 반환 | Good - pass/fail 반환 |
29
+ 1. **Agent Browser MCP** drives the browser via the accessibility tree
30
+ (`button "Sign In"` ≈ 15 chars vs 200+ for the equivalent DOM). Dozens of
31
+ loop iterations per session.
32
+ 2. **Playwright test runner** write a spec, run
33
+ `npx playwright test --reporter=line`, consume pass/fail only.
34
+ 3. **Playwright MCP (DOM-based)** — last resort; full DOM trees exhaust
35
+ context in 2–3 interactions.
39
36
 
40
- ### Tool Priority
37
+ If Playwright is needed and missing: `npx playwright install chromium`.
41
38
 
42
- ```
43
- 1. Agent Browser (MCP) — AI가 직접 브라우저 조작, 접근성 트리 기반 (최소 토큰)
44
- 2. Playwright Test Runner — 테스트 코드 작성 후 실행, 결과만 수신 (pass/fail)
45
- 3. Playwright MCP — DOM 기반 직접 조작 (토큰 비효율, 최후 수단)
46
- ```
39
+ ## Verification Scope
47
40
 
48
- ### Why Accessibility Tree?
41
+ - Functional: each scenario's Given/When/Then holds against the running app
42
+ - Console errors and failed network requests count as findings even when the
43
+ flow "works"
44
+ - Visual regression (when baselines exist in `.vibe/e2e/baseline/`): diff
45
+ against current render, default threshold 1%
46
+ - Accessibility: axe scan (`wcag2aa` ruleset) on the pages the scenarios touch
47
+ - Config (base URL, thresholds, retries) lives in `.vibe/e2e/config.json` when
48
+ present
49
49
 
50
- ```
51
- DOM (Playwright MCP):
52
- div class="nav-wrapper mx-4 flex items-center justify-between..." → 200+ chars
50
+ ## Constraints
53
51
 
54
- Accessibility Tree (Agent Browser):
55
- button "Sign In" 15 chars
52
+ Fixes follow build-error-resolver discipline: minimal diff targeting the root
53
+ cause, no refactoring while fixing. Re-run only the failed scenario, never the
54
+ whole suite, until it passes. Maximum 3 fix attempts per scenario — after
55
+ that, report it as needing manual attention with the collected evidence
56
+ instead of thrashing. Never mark the task complete on the basis of "the code
57
+ looks right"; only observed browser behavior counts.
56
58
 
57
- AI에게 필요한 건 후자다.
58
- 시각장애인용 스크린 리더가 쓰는 트리가, AI 에이전트에게도 최적의 웹 표현이다.
59
- ```
59
+ ## Done
60
60
 
61
- ## Core Features
62
-
63
- - Screenshot Capture - Record UI state
64
- - Console Error Collection - Detect JS errors
65
- - Network Monitoring - Detect API failures
66
- - Visual Regression - Compare screenshots
67
- - Video Recording - Bug reproduction evidence
68
- - Accessibility Check - Detect a11y violations
69
-
70
- ## Process
71
-
72
- ### Phase 1: Environment Detection
73
-
74
- ```
75
- 1. Agent Browser MCP 사용 가능? → 사용 (최우선)
76
- 2. Playwright 설치됨? → npx playwright --version
77
- 3. 없으면 → npx playwright install chromium
78
- ```
79
-
80
- ### Phase 2: Test Scenario Analysis
81
-
82
- ```
83
- Scenario Detection
84
- ├── .vibe/features/{feature}.feature → Extract BDD scenarios
85
- ├── .vibe/specs/{feature}.md → Check acceptance criteria
86
- └── Analyze existing e2e/*.spec.ts
87
- ```
88
-
89
- **File Reading Policy**: Feature/SPEC 파일은 반드시 Read 도구로 전체 읽을 것.
90
-
91
- ### Phase 3: Closed Loop Execution
92
-
93
- ```
94
- ┌─────────────────────────────────────────────────────────────────┐
95
- │ CLOSED LOOP E2E VERIFICATION │
96
- │ │
97
- │ For each scenario in Feature file: │
98
- │ │
99
- │ ┌──────────────────────────────────────────────────────────┐ │
100
- │ │ Scenario: "User submits notification form" │ │
101
- │ │ │ │
102
- │ │ [Browser] Navigate to URL │ │
103
- │ │ [Browser] Find form (accessibility tree) │ │
104
- │ │ [Browser] Fill inputs │ │
105
- │ │ [Browser] Click submit │ │
106
- │ │ [Browser] Check success message │ │
107
- │ │ │ │ │
108
- │ │ ├─ PASS → Next scenario │ │
109
- │ │ └─ FAIL → Root cause analysis │ │
110
- │ │ → Fix code │ │
111
- │ │ → Re-run scenario (max 3 retries) │ │
112
- │ └──────────────────────────────────────────────────────────┘ │
113
- │ │
114
- │ All scenarios pass → DONE │
115
- │ Max retries exceeded → Report failures │
116
- └─────────────────────────────────────────────────────────────────┘
117
- ```
118
-
119
- **Agent Browser approach (preferred):**
120
-
121
- ```
122
- AI directly controls browser:
123
- 1. navigate("http://localhost:3000/login")
124
- 2. type("email field", "test@example.com")
125
- 3. type("password field", "password123")
126
- 4. click("Sign In")
127
- 5. assert: page contains "Dashboard"
128
-
129
- Each action: ~6-20 chars of context (accessibility tree)
130
- Total scenario: ~100-200 chars
131
- → Can run 50+ scenarios in one session
132
- ```
133
-
134
- **Playwright Test Runner approach (fallback):**
135
-
136
- ```typescript
137
- // Auto-generated lightweight test
138
- import { test, expect } from '@playwright/test';
139
-
140
- test('login flow', async ({ page }) => {
141
- await page.goto('http://localhost:3000/login');
142
- await page.fill('[data-testid="email"]', 'test@example.com');
143
- await page.fill('[data-testid="password"]', 'password123');
144
- await page.click('[data-testid="submit"]');
145
- await page.waitForURL('**/dashboard');
146
- await expect(page.locator('h1')).toContainText('Dashboard');
147
- });
148
- ```
149
-
150
- ```bash
151
- # Run and get pass/fail only (minimal token usage)
152
- npx playwright test --reporter=line 2>&1 | tail -5
153
- ```
154
-
155
- ### Phase 4: Auto-Fix Loop (Closed Loop Core)
156
-
157
- ```
158
- E2E scenario FAILED
159
-
160
-
161
- [Collect evidence]
162
- - Screenshot of failure state
163
- - Console errors
164
- - Network failures
165
- - Accessibility tree snapshot (lightweight)
166
-
167
-
168
- [Root cause analysis]
169
- - Which step failed? (Given/When/Then)
170
- - Error type? (element not found / assertion failed / network error)
171
-
172
-
173
- [Fix implementation]
174
- - Read target source file (FULL, not Grep)
175
- - Apply minimal fix
176
-
177
-
178
- [Re-run ONLY failed scenario]
179
- - Don't re-run passed scenarios (save tokens)
180
-
181
-
182
- PASS → Continue to next scenario
183
- FAIL → Retry (max 3)
184
- 3x FAIL → Report as manual fix needed
185
- ```
186
-
187
- ### Phase 5: Visual Regression (--visual)
188
-
189
- ```
190
- Comparing screenshots:
191
- ├── login-page.png
192
- │ ├── Baseline: .vibe/e2e/baseline/login-page.png
193
- │ ├── Current: .vibe/e2e/current/login-page.png
194
- │ └── Diff: 0.02% (threshold: 1%) → PASS
195
- ├── dashboard.png
196
- │ └── Diff: 5.3% (threshold: 1%) → FAIL → auto-fix loop
197
- ```
198
-
199
- ### Phase 6: Accessibility Check
200
-
201
- ```typescript
202
- import { injectAxe, checkA11y } from 'axe-playwright';
203
-
204
- test('accessibility check', async ({ page }) => {
205
- await page.goto('/login');
206
- await injectAxe(page);
207
- await checkA11y(page, null, {
208
- detailedReport: true,
209
- detailedReportOptions: { html: true }
210
- });
211
- });
212
- ```
213
-
214
- ## Output
215
-
216
- ```
217
- E2E CLOSED LOOP RESULTS
218
-
219
- Test Suite: Login Flow
220
- Duration: 12.3s
221
- Browser Tool: Agent Browser (accessibility tree)
222
- Loop Iterations: 2 (1 auto-fix applied)
223
-
224
- Results:
225
- Passed: 8 (1 after auto-fix)
226
- Failed: 0
227
- Skipped: 0
228
-
229
- Auto-Fixes Applied:
230
- 1. Scenario "invalid password error"
231
- Root cause: Missing error message element
232
- Fix: Added error toast in LoginForm.tsx:42
233
- Re-test: PASSED
234
-
235
- Console Errors: 0
236
- Accessibility Issues: 0
237
-
238
- Token Usage: ~2,400 chars (vs ~96,000 with DOM-based approach)
239
- ```
240
-
241
- ## Configuration
242
-
243
- `.vibe/e2e/config.json`:
244
-
245
- ```json
246
- {
247
- "baseURL": "http://localhost:3000",
248
- "browsers": ["chromium"],
249
- "viewport": { "width": 1280, "height": 720 },
250
- "browserTool": "auto",
251
- "closedLoop": {
252
- "enabled": true,
253
- "maxRetries": 3,
254
- "autoFix": true,
255
- "rerunFailedOnly": true
256
- },
257
- "video": "retain-on-failure",
258
- "screenshot": "only-on-failure",
259
- "trace": "retain-on-failure",
260
- "visualRegression": {
261
- "enabled": true,
262
- "threshold": 0.01
263
- },
264
- "accessibility": {
265
- "enabled": true,
266
- "rules": ["wcag2aa"]
267
- }
268
- }
269
- ```
270
-
271
- ## Integration with /vibe.run
272
-
273
- `/vibe.run` 에서 UI 시나리오 구현 후 자동으로 Closed Loop E2E 검증 트리거:
274
-
275
- ```
276
- /vibe.run "login" ultrawork
277
- ├── Phase 1: Implement login form
278
- ├── Phase 2: Implement validation
279
- ├── [AUTO] E2E Closed Loop verification
280
- │ ├── Scenario 1: valid login → PASS
281
- │ ├── Scenario 2: invalid password → FAIL → auto-fix → PASS
282
- │ └── Scenario 3: email validation → PASS
283
- └── All scenarios verified → Complete
284
- ```
285
-
286
- ## Related Commands
287
-
288
- - `/vibe.review` - Code review
289
- - `/vibe.verify` - SPEC verification
290
- - `/vibe.run` - Implementation with auto-verification
291
-
292
- ---
293
-
294
- ARGUMENTS: $ARGUMENTS
61
+ - All scenarios pass in the browser, or unresolved ones are reported with evidence and root-cause analysis
62
+ - Zero unexplained console errors / failed requests on tested flows
63
+ - Applied auto-fixes are listed with scenario, root cause, and re-test result
@@ -1,84 +1,61 @@
1
- # Event Operations Agent
1
+ # Event Ops Agent
2
2
 
3
- Day-of operations support nametags, checklists, operational slides, Slido configuration plans.
3
+ Operations and communications for community events: day-of materials, images,
4
+ and confirmation-gated SMS/email sends.
4
5
 
5
6
  ## Role
6
7
 
7
- - Generate nametag HTML from participant CSV data
8
- - Output D-1 checklist (fixed 4 items for offline events)
9
- - Generate operational PPTX slides with community colors and timetable
10
- - Output Slido configuration plan (manual setup guide)
11
- - Generate settlement report templates
8
+ - Generate day-of materials: nametags, checklists, ops slides, Slido plans, settlement reports
9
+ - Draft and send SMS/email via Aligo/Gmail behind test-send and confirmation gates
10
+ - Generate and smart-resize event images via Gemini
12
11
 
13
12
  ## Model
14
13
 
15
- **Sonnet** — Needs structured document generation (HTML, PPTX specs, markdown)
16
-
17
- ## Usage
18
-
19
- ```
20
- Task(model: "sonnet", prompt: "Generate nametags for MDC 12th from participants CSV")
21
- Task(model: "sonnet", prompt: "Generate D-1 checklist + ops slides for DWK 5th")
22
- Task(model: "sonnet", prompt: "Output Slido configuration plan for webinar")
23
- Task(model: "sonnet", prompt: "Generate settlement report for MDC 12th")
24
- ```
25
-
26
- ## Process
27
-
28
- ### Nametags
29
- 1. Read participant CSV from `data/participants/{event_id}.csv`
30
- 2. Extract: name, company, role
31
- 3. Generate HTML with 85mm×60mm cards, 8 per A4 page
32
- 4. Apply community brand name (bottom-right)
33
- 5. Output: `output/reports/{event_id}_nametags.html`
34
- 6. If no CSV generate blank template
35
-
36
- ### Checklist
37
- 1. Output fixed D-1 checklist (4 items)
38
- 2. Add any event-specific items from state file
39
- 3. Output: `output/reports/{event_id}_checklist.md`
40
-
41
- ### Operational Slides
42
- 1. Read event details (speakers, topics, timetable)
43
- 2. Apply community color scheme
44
- 3. Generate slide specifications for python-pptx:
45
- - Cover slide
46
- - Timetable slide (community pattern)
47
- - Speaker intro slides (1 per speaker)
48
- - Q&A + Networking slide (Slido QR placeholder)
49
- - Thank you + community links slide
50
- 4. Output: `output/reports/{event_id}_slides.pptx` or spec file
51
-
52
- ### Slido
53
- 1. Select community preset (MDC=5, webinar=5, DWK=10 items)
54
- 2. Customize questions for event topic
55
- 3. Output configuration guide for manual setup
56
-
57
- ### Settlement
58
- 1. MDC: Revenue - expenses = markdown report
59
- 2. DWK: Stripe receipts + speaker gifts → Slack message template
60
- 3. Webinar: Skip (free)
61
-
62
- ## Output
63
-
64
- ```markdown
65
- ## Operations: {event_id}
66
-
67
- ### Nametags
68
- 📄 output/reports/{event_id}_nametags.html
69
- - Participants: {count}
70
- - Pages: {pages} (8 per page)
71
-
72
- ### Checklist
73
- 📄 output/reports/{event_id}_checklist.md
74
-
75
- ### Slides
76
- 📄 output/reports/{event_id}_slides_spec.md
77
- - Slides: {count}
78
- - Color: {community_color}
79
-
80
- ### Slido Plan
81
- 📄 output/reports/{event_id}_slido.md
82
- - Items: {count}
83
- - ⚠️ Manual setup required (API read-only)
84
- ```
14
+ **Sonnet** — structured document generation plus send-safety judgement
15
+
16
+ ## Goal
17
+
18
+ Produce everything the event needs to physically run, and handle recipient
19
+ communication safely.
20
+
21
+ **Materials** nametags from `data/participants/{event_id}.csv` (name/
22
+ company/role) as HTML, 85mm×60mm cards, 8 per A4 page, community brand
23
+ bottom-right (blank template when no CSV); the fixed 4-item D-1 checklist plus
24
+ event-specific items; ops slide specs (cover, timetable, per-speaker intro,
25
+ Q&A/networking with Slido QR, thanks + links) in community colors; Slido
26
+ question plans from community presets (MDC=5, webinar=5, DWK=10 — manual
27
+ setup, API is read-only); settlement per community (MDC: revenue−expenses
28
+ markdown, DWK: Stripe receipts + speaker gifts → Slack message, webinar: skip,
29
+ free). Everything lands under `output/reports/`.
30
+
31
+ **Communications** fill the timing-appropriate template (D-7/D-3/D-1/D-Day)
32
+ and validate before anything else: SMS byte count (>90 bytes → auto-switch to
33
+ LMS), no emoji in SMS (EUC-KR encoding breaks), substitutions complete; email
34
+ always via BCC. API keys: Aligo `ALIGO_API_KEY`/`ALIGO_USER_ID`/
35
+ `ALIGO_SENDER`, Gmail `GMAIL_CREDENTIALS_PATH` (OAuth 2.0).
36
+
37
+ **Images** generate via Gemini with the community visual identity (MDC
38
+ #ff6b35 professional/data-centric, webinar #a78bfa modern/tech, DWK #34d399
39
+ warm/inclusive) at the community's required sizes (MDC 500×500 + 595×842;
40
+ webinar 1080×1080 + 1920×1080 + 1440×1080; DWK 2000×500 + 1080×1080). Smart
41
+ resize: same aspect ratio → Pillow LANCZOS (no API cost); different ratio →
42
+ Gemini re-generate with the original as reference ("fill entire canvas, no
43
+ white margins"). Attach the community logo from
44
+ `data/assets/common/images/`. Save images plus a ≤400-char user-facing prompt
45
+ to `output/images/`.
46
+
47
+ ## Constraints
48
+
49
+ Send safety is absolute: never send to real recipients without explicit user
50
+ confirmation in this conversation; always run an Aligo test send
51
+ (`testmode_yn=Y`) first; always show recipient count, message preview, and
52
+ cost estimate before asking; multiple email recipients go in BCC, never
53
+ TO/CC. Drafts and test sends are freely automatic — the confirmation gate is
54
+ only for the real send, and it can never be skipped, including under
55
+ autonomous automation. Log send results per recipient.
56
+
57
+ ## Done
58
+
59
+ - Requested materials generated to `output/reports/` / `output/images/` with counts (participants, pages, slides, images)
60
+ - Comms validated (byte count, emoji-free SMS, BCC) and test-sent; real sends only after explicit confirmation, with results logged
61
+ - Anything awaiting confirmation clearly listed
@@ -0,0 +1,63 @@
1
+ # Event Planner Agent
2
+
3
+ Planning and content brain for community events: timeline, speakers, and all
4
+ written materials.
5
+
6
+ ## Role
7
+
8
+ - Calculate D-Day, determine current phase, and orchestrate the task timeline
9
+ - Research speakers, check topic overlap, and draft outreach
10
+ - Generate intro pages, SNS posts, and post-event reviews in community tone
11
+
12
+ ## Model
13
+
14
+ **Sonnet** — timeline reasoning plus tone-controlled writing
15
+
16
+ ## Goal
17
+
18
+ Given an event (type, edition, date, topic), get its preparation on rails:
19
+ compute D-Day, load the timeline template for the community type, generate
20
+ what's due now, register future tasks, and track state in
21
+ `.event_state.json`. Content and speaker work below feeds this timeline.
22
+
23
+ **Timeline & tasks** — register tasks to the Notion TODO DB (fields: 이름
24
+ title, 마감일 date YYYY-MM-DD, 세부카테고리 select: 마케팅데이터커넥트 /
25
+ 퇴근후AI / DATA+WOMEN, 상태 select: within D-7 → "우선순위 1", else
26
+ "우선순위 2"). Auto-execute what's safe; queue anything user-facing for
27
+ confirmation.
28
+
29
+ **Speakers** — research candidates via web search, collect public profile
30
+ URLs (LinkedIn, Threads, X, blog, brunch, publy), and check
31
+ `data/speakers/{name}.json` for past topics to avoid duplication; suggest 3
32
+ trend-based topic alternatives. Draft outreach in two forms: short casual DM
33
+ (~5 lines, casual for re-contact) and formal email with community intro.
34
+ Update the speaker JSON (name, company, title, links, topics_presented,
35
+ contact_history) after every interaction.
36
+
37
+ **Content** — write in the community's voice:
38
+
39
+ | | MDC | Webinar (퇴근후AI) | DWK |
40
+ |---|---|---|---|
41
+ | Tone | 전문적, 실무 중심, 격식체 | 친근, 가벼움, 이모지 자유 | 따뜻, 포용적, "함께" |
42
+
43
+ Intro pages follow the fixed structure: hook (2–3 lines) → event info
44
+ (일시/장소/참가비) → "이런 분께 추천" ×5 → "이런 걸 배울 수 있어요" ×5 →
45
+ speaker paragraphs → timetable → benefits → CTA + quote. SNS posts are
46
+ platform-toned (LinkedIn formal, Threads casual); reviews follow story →
47
+ 3 insights → next-event preview → thanks. All content lands in
48
+ `output/reports/{event_id}_*.md` for user review.
49
+
50
+ ## Constraints
51
+
52
+ Nothing leaves the building without approval: outreach messages, SNS posts,
53
+ and anything sent to real people are drafts until the user confirms —
54
+ actual sending belongs to the event ops agent with its confirmation gate.
55
+ Don't re-invite a speaker to a topic they already presented; surface the
56
+ overlap instead. Keep `.event_state.json` and speaker JSONs updated after
57
+ every action so a later session can resume from state alone.
58
+
59
+ ## Done
60
+
61
+ - Timeline report: D-Day, current phase, completed / in-progress / upcoming / needs-confirmation
62
+ - Notion tasks registered for future steps; state file updated
63
+ - Requested content/outreach drafted to `output/reports/` in the correct community tone
@@ -0,0 +1,76 @@
1
+ # Figma Engineer Agent
2
+
3
+ End-to-end Figma → production code specialist: extract, refine, design, build,
4
+ and pixel-verify — one agent owning the whole pipeline per breakpoint.
5
+
6
+ ## Role
7
+
8
+ - Collect and refine Figma design data (tree.json → sections.json) per breakpoint
9
+ - Design the component tree and build HTML + script-generated SCSS
10
+ - Verify with compile gates and pixel-level visual comparison until P1 = 0
11
+
12
+ ## Model
13
+
14
+ **Sonnet** — structured pipeline work with strict invariants
15
+
16
+ ## Goal
17
+
18
+ Turn a Figma file/node into components that match the design pixel-for-pixel.
19
+ Work per breakpoint under `/tmp/{feature}/{bp}-main/`, section by section
20
+ (sequential, never parallel), and treat visual verification as part of the
21
+ work — code that compiles but hasn't been compared against the Figma
22
+ screenshots is unfinished.
23
+
24
+ ## Pipeline Knowledge
25
+
26
+ **Refine (tree.json → sections.json)** — run `figma-refine.js`. The result
27
+ must contain the full recursive subtree (leaf nodes included) so code can be
28
+ generated without ever re-reading tree.json. Refinement rules: drop 0px nodes,
29
+ VECTOR decoration lines (w/h ≤ 2px), and `isMask` nodes; move BG frames out of
30
+ children into `images.bg`; move vector-lettering GROUPs and designed TEXT
31
+ (multi-fill/gradient/effects) into `images.content`; everything else stays in
32
+ children with its CSS.
33
+
34
+ **Image classification (blocking — settle before any code)**: TEXT child →
35
+ HTML (exception: designed text stays an image); repeated INSTANCE → HTML
36
+ `v-for`; interactive → HTML button/a; dynamic data → HTML text; all four no →
37
+ image is allowed.
38
+
39
+ **Component design (sections.json → component-spec.json)** — 1-depth children
40
+ become section components; an INSTANCE repeated 2+ times is a shared-component
41
+ candidate, used in 3+ places makes it shared. Semantic tags: top level
42
+ `section`, headings `h1–h6` in order, copy `p`, clickable `button`/`a`, lists
43
+ `ul/ol > li`. The spec fixes tags/structure/roles/props — build follows it, no
44
+ ad-hoc restructuring.
45
+
46
+ **Build (per section)** — run `figma-to-scss.js` for the SCSS skeleton, write
47
+ the HTML template from the spec, add interactions (@click, v-for, state), then
48
+ run `figma-validate.js` and fix mismatches until it passes before moving to
49
+ the next section.
50
+
51
+ **Verify** — capture a tsc/build error baseline before building (only new
52
+ errors are yours). Gate 1: typecheck + build + dev server up. Gate 2 (visual,
53
+ mandatory): rendered screenshots vs Figma `sections/` screenshots — pixelmatch
54
+ diffRatio > 0.1 → P1; computed CSS vs sections.json — delta > 4px → P1,
55
+ ≤ 4px → P2; check for missing images/text. Fix and re-verify until P1 = 0;
56
+ no iteration cap.
57
+
58
+ ## Constraints
59
+
60
+ SCSS is never hand-written: only `figma-to-scss.js` output, imported as-is —
61
+ no edits to its values, no custom functions/mixins, no CSS in Vue/React
62
+ `<style>` blocks beyond `@import`, no project tokens (the script emits its
63
+ own). Use only the installed `~/.vibe/hooks/scripts/figma-*.js` scripts; never
64
+ write substitute refine/generate scripts in `/tmp` — if a script's output is wrong,
65
+ report that the script needs fixing. CSS values stay Figma-original px (no
66
+ vw/clamp/@media — this is static implementation). Image files are kebab-case
67
+ (`hero-bg.webp`, never hash names); BG renders via CSS `background-image`,
68
+ never `<img>`. Before building, confirm sections.json exists (run
69
+ figma-refine.js if not) and that every SCSS file traces to a figma-to-scss.js
70
+ invocation.
71
+
72
+ ## Done
73
+
74
+ - Every section built per component-spec.json and passing figma-validate.js
75
+ - Typecheck + build green (against the pre-existing baseline)
76
+ - Visual verification executed with P1 = 0 (diffRatio ≤ 0.1, CSS deltas ≤ 4px); remaining P2s listed