@su-record/vibe 3.2.0 → 3.2.2

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 (286) hide show
  1. package/CLAUDE.md +1 -1
  2. package/README.en.md +7 -6
  3. package/README.md +8 -5
  4. package/dist/__tests__/skill-namespace.test.d.ts +2 -0
  5. package/dist/__tests__/skill-namespace.test.d.ts.map +1 -0
  6. package/dist/__tests__/skill-namespace.test.js +60 -0
  7. package/dist/__tests__/skill-namespace.test.js.map +1 -0
  8. package/dist/__tests__/wiring-integrity.test.js +5 -5
  9. package/dist/__tests__/wiring-integrity.test.js.map +1 -1
  10. package/dist/cli/design/design-md-parser.test.js +2 -2
  11. package/dist/cli/design/design-md-parser.test.js.map +1 -1
  12. package/dist/cli/generate-release-notes.d.ts +3 -0
  13. package/dist/cli/generate-release-notes.d.ts.map +1 -0
  14. package/dist/cli/generate-release-notes.js +47 -0
  15. package/dist/cli/generate-release-notes.js.map +1 -0
  16. package/dist/cli/postinstall/constants.d.ts +6 -6
  17. package/dist/cli/postinstall/constants.d.ts.map +1 -1
  18. package/dist/cli/postinstall/constants.js +114 -46
  19. package/dist/cli/postinstall/constants.js.map +1 -1
  20. package/dist/cli/postinstall/fs-utils.d.ts +1 -0
  21. package/dist/cli/postinstall/fs-utils.d.ts.map +1 -1
  22. package/dist/cli/postinstall/fs-utils.js +25 -0
  23. package/dist/cli/postinstall/fs-utils.js.map +1 -1
  24. package/dist/cli/postinstall/fs-utils.test.js +46 -11
  25. package/dist/cli/postinstall/fs-utils.test.js.map +1 -1
  26. package/dist/cli/postinstall/main.d.ts.map +1 -1
  27. package/dist/cli/postinstall/main.js +3 -2
  28. package/dist/cli/postinstall/main.js.map +1 -1
  29. package/dist/cli/setup/Provisioner.d.ts.map +1 -1
  30. package/dist/cli/setup/Provisioner.js +23 -7
  31. package/dist/cli/setup/Provisioner.js.map +1 -1
  32. package/dist/cli/utils/cli-detector.d.ts +3 -3
  33. package/dist/cli/utils/cli-detector.d.ts.map +1 -1
  34. package/dist/cli/utils/cli-detector.js +7 -27
  35. package/dist/cli/utils/cli-detector.js.map +1 -1
  36. package/dist/cli/utils/cli-detector.test.js +3 -2
  37. package/dist/cli/utils/cli-detector.test.js.map +1 -1
  38. package/dist/infra/lib/llm-availability.d.ts.map +1 -1
  39. package/dist/infra/lib/llm-availability.js +2 -10
  40. package/dist/infra/lib/llm-availability.js.map +1 -1
  41. package/dist/infra/lib/llm-availability.test.js +3 -2
  42. package/dist/infra/lib/llm-availability.test.js.map +1 -1
  43. package/dist/infra/lib/utils.d.ts +6 -0
  44. package/dist/infra/lib/utils.d.ts.map +1 -1
  45. package/dist/infra/lib/utils.js +33 -0
  46. package/dist/infra/lib/utils.js.map +1 -1
  47. package/dist/tests/curated-release-notes.test.d.ts +2 -0
  48. package/dist/tests/curated-release-notes.test.d.ts.map +1 -0
  49. package/dist/tests/curated-release-notes.test.js +106 -0
  50. package/dist/tests/curated-release-notes.test.js.map +1 -0
  51. package/dist/tools/convention/validateCodeQuality.d.ts +1 -0
  52. package/dist/tools/convention/validateCodeQuality.d.ts.map +1 -1
  53. package/dist/tools/convention/validateCodeQuality.js +3 -2
  54. package/dist/tools/convention/validateCodeQuality.js.map +1 -1
  55. package/dist/tools/index.d.ts +2 -2
  56. package/dist/tools/index.d.ts.map +1 -1
  57. package/dist/tools/index.js +2 -0
  58. package/dist/tools/index.js.map +1 -1
  59. package/dist/tools/release/releaseNotes.d.ts +21 -0
  60. package/dist/tools/release/releaseNotes.d.ts.map +1 -0
  61. package/dist/tools/release/releaseNotes.js +105 -0
  62. package/dist/tools/release/releaseNotes.js.map +1 -0
  63. package/dist/tools/spec/executionPacket.d.ts +101 -0
  64. package/dist/tools/spec/executionPacket.d.ts.map +1 -0
  65. package/dist/tools/spec/executionPacket.js +394 -0
  66. package/dist/tools/spec/executionPacket.js.map +1 -0
  67. package/dist/tools/spec/executionPacket.test.d.ts +2 -0
  68. package/dist/tools/spec/executionPacket.test.d.ts.map +1 -0
  69. package/dist/tools/spec/executionPacket.test.js +360 -0
  70. package/dist/tools/spec/executionPacket.test.js.map +1 -0
  71. package/dist/tools/spec/index.d.ts +2 -0
  72. package/dist/tools/spec/index.d.ts.map +1 -1
  73. package/dist/tools/spec/index.js +2 -0
  74. package/dist/tools/spec/index.js.map +1 -1
  75. package/dist/tools/spec/specGenerator.d.ts +12 -0
  76. package/dist/tools/spec/specGenerator.d.ts.map +1 -1
  77. package/dist/tools/spec/specGenerator.js +96 -14
  78. package/dist/tools/spec/specGenerator.js.map +1 -1
  79. package/dist/tools/spec/specGenerator.test.d.ts +2 -0
  80. package/dist/tools/spec/specGenerator.test.d.ts.map +1 -0
  81. package/dist/tools/spec/specGenerator.test.js +130 -0
  82. package/dist/tools/spec/specGenerator.test.js.map +1 -0
  83. package/hooks/scripts/__tests__/.vibe/command-log.txt +3 -3
  84. package/hooks/scripts/__tests__/llm-orchestrate-antigravity.test.js +5 -2
  85. package/hooks/scripts/__tests__/run-ledger-verify-required.test.js +7 -2
  86. package/hooks/scripts/__tests__/run-ledger.test.js +161 -10
  87. package/hooks/scripts/__tests__/utils-npm-root.test.js +5 -4
  88. package/hooks/scripts/lib/run-ledger.js +123 -21
  89. package/hooks/scripts/verify-ledger.js +23 -3
  90. package/package.json +2 -2
  91. package/skills/{agents-md → vibe.agents-md}/SKILL.md +1 -1
  92. package/skills/{brand-assets → vibe.brand-assets}/SKILL.md +1 -1
  93. package/skills/{capability-loop → vibe.capability-loop}/SKILL.md +1 -1
  94. package/skills/{chub-usage → vibe.chub-usage}/SKILL.md +1 -1
  95. package/skills/vibe.clone/SKILL.md +295 -3
  96. package/skills/{commerce-patterns → vibe.commerce-patterns}/SKILL.md +1 -1
  97. package/skills/{commit-push-pr → vibe.commit-push-pr}/SKILL.md +2 -2
  98. package/skills/{context7-usage → vibe.context7-usage}/SKILL.md +1 -1
  99. package/skills/vibe.contract/SKILL.md +162 -1
  100. package/skills/{create-prd → vibe.create-prd}/SKILL.md +2 -2
  101. package/skills/{design-refine → vibe.design-refine}/SKILL.md +1 -1
  102. package/skills/{design-review → vibe.design-review}/SKILL.md +1 -1
  103. package/skills/{design-teach → vibe.design-teach}/SKILL.md +1 -1
  104. package/skills/{devlog → vibe.devlog}/SKILL.md +1 -1
  105. package/skills/vibe.docs/SKILL.md +256 -1
  106. package/skills/{e2e-commerce → vibe.e2e-commerce}/SKILL.md +1 -1
  107. package/skills/vibe.educational-content/SKILL.md +157 -0
  108. package/skills/vibe.educational-content/references/learning-design.md +81 -0
  109. package/skills/vibe.educational-content/references/output-patterns.md +109 -0
  110. package/skills/vibe.educational-content/references/source-method.md +40 -0
  111. package/skills/{event-comms → vibe.event-comms}/SKILL.md +1 -1
  112. package/skills/{event-ops → vibe.event-ops}/SKILL.md +1 -1
  113. package/skills/{event-planning → vibe.event-planning}/SKILL.md +1 -1
  114. package/skills/vibe.figma/SKILL.md +473 -21
  115. package/skills/vibe.figma/references/branch-phases.md +1 -1
  116. package/skills/{git-worktree → vibe.git-worktree}/SKILL.md +1 -1
  117. package/skills/{handoff → vibe.handoff}/SKILL.md +1 -1
  118. package/skills/{parallel-research → vibe.parallel-research}/SKILL.md +2 -2
  119. package/skills/{presentation → vibe.presentation}/SKILL.md +1 -1
  120. package/skills/{prioritization-frameworks → vibe.prioritization}/SKILL.md +2 -2
  121. package/skills/{priority-todos → vibe.priority-todos}/SKILL.md +1 -1
  122. package/skills/{vercel-react-best-practices → vibe.react-best-practices}/SKILL.md +1 -1
  123. package/skills/vibe.regress/SKILL.md +182 -2
  124. package/skills/vibe.run/SKILL.md +417 -7
  125. package/skills/{arch-guard → vibe.run/internal/arch-guard}/templates/violation-report.md +1 -1
  126. package/skills/{seo-checklist → vibe.seo-checklist}/SKILL.md +1 -1
  127. package/skills/vibe.spec/SKILL.md +122 -1
  128. package/skills/vibe.test/SKILL.md +138 -2
  129. package/skills/{tool-fallback → vibe.tool-fallback}/SKILL.md +1 -1
  130. package/skills/vibe.trace/SKILL.md +3 -3
  131. package/skills/{ui-ux-pro-max → vibe.ui-ux-pro-max}/SKILL.md +6 -6
  132. package/skills/{user-personas → vibe.user-personas}/SKILL.md +2 -2
  133. package/skills/vibe.verify/SKILL.md +12 -6
  134. package/skills/{video-production → vibe.video-production}/SKILL.md +1 -1
  135. package/vibe/rules/loop-contract.md +7 -3
  136. package/vibe/templates/spec-template.md +32 -5
  137. package/skills/arch-guard/SKILL.md +0 -183
  138. package/skills/clone/SKILL.md +0 -296
  139. package/skills/contract/SKILL.md +0 -165
  140. package/skills/docs/SKILL.md +0 -259
  141. package/skills/exec-plan/SKILL.md +0 -151
  142. package/skills/figma/SKILL.md +0 -456
  143. package/skills/regress/SKILL.md +0 -184
  144. package/skills/restraint/SKILL.md +0 -72
  145. package/skills/spec/SKILL.md +0 -118
  146. package/skills/test/SKILL.md +0 -140
  147. /package/skills/{agents-md → vibe.agents-md}/rubrics/what-to-keep.md +0 -0
  148. /package/skills/{agents-md → vibe.agents-md}/templates/agents-md.md +0 -0
  149. /package/skills/{agents-md → vibe.agents-md}/templates/claude-md.md +0 -0
  150. /package/skills/{brand-assets → vibe.brand-assets}/rubrics/asset-checklist.md +0 -0
  151. /package/skills/{brand-assets → vibe.brand-assets}/templates/brand-guide.md +0 -0
  152. /package/skills/{capability-loop → vibe.capability-loop}/agents/capability-designer.md +0 -0
  153. /package/skills/{capability-loop → vibe.capability-loop}/agents/failure-analyst.md +0 -0
  154. /package/skills/{capability-loop → vibe.capability-loop}/agents/implementer.md +0 -0
  155. /package/skills/{capability-loop → vibe.capability-loop}/agents/tester.md +0 -0
  156. /package/skills/{capability-loop → vibe.capability-loop}/templates/capability-spec.md +0 -0
  157. /package/skills/{capability-loop → vibe.capability-loop}/templates/failure-analysis.md +0 -0
  158. /package/skills/{clone → vibe.clone}/references/capture-rules.md +0 -0
  159. /package/skills/{clone → vibe.clone}/references/legal-and-error-recovery.md +0 -0
  160. /package/skills/{clone → vibe.clone}/references/refine-rules.md +0 -0
  161. /package/skills/{clone → vibe.clone}/references/scaffold-phases.md +0 -0
  162. /package/skills/{clone → vibe.clone}/references/setup-and-layout.md +0 -0
  163. /package/skills/{commerce-patterns → vibe.commerce-patterns}/rubrics/checkout-flow.md +0 -0
  164. /package/skills/{commerce-patterns → vibe.commerce-patterns}/templates/product-schema.md +0 -0
  165. /package/skills/{commit-push-pr → vibe.commit-push-pr}/agents/change-analyzer.md +0 -0
  166. /package/skills/{commit-push-pr → vibe.commit-push-pr}/agents/message-writer.md +0 -0
  167. /package/skills/{commit-push-pr → vibe.commit-push-pr}/agents/pr-writer.md +0 -0
  168. /package/skills/{commit-push-pr → vibe.commit-push-pr}/agents/reviewer.md +0 -0
  169. /package/skills/{commit-push-pr → vibe.commit-push-pr}/rubrics/commit-message.md +0 -0
  170. /package/skills/{commit-push-pr → vibe.commit-push-pr}/templates/pr-body.md +0 -0
  171. /package/skills/{context7-usage → vibe.context7-usage}/rubrics/when-to-use.md +0 -0
  172. /package/skills/{create-prd → vibe.create-prd}/agents/edge-case-finder.md +0 -0
  173. /package/skills/{create-prd → vibe.create-prd}/agents/prioritizer.md +0 -0
  174. /package/skills/{create-prd → vibe.create-prd}/agents/requirements-writer.md +0 -0
  175. /package/skills/{create-prd → vibe.create-prd}/agents/researcher.md +0 -0
  176. /package/skills/{create-prd → vibe.create-prd}/agents/reviewer.md +0 -0
  177. /package/skills/{create-prd → vibe.create-prd}/frameworks/jobs-to-be-done.md +0 -0
  178. /package/skills/{create-prd → vibe.create-prd}/frameworks/rice-scoring.md +0 -0
  179. /package/skills/{create-prd → vibe.create-prd}/orchestrator.md +0 -0
  180. /package/skills/{create-prd → vibe.create-prd}/rubrics/completeness.md +0 -0
  181. /package/skills/{create-prd → vibe.create-prd}/templates/prd.md +0 -0
  182. /package/skills/{design-refine → vibe.design-refine}/rubrics/polish-checklist.md +0 -0
  183. /package/skills/{design-refine → vibe.design-refine}/rubrics/token-naming.md +0 -0
  184. /package/skills/{design-refine → vibe.design-refine}/templates/design-system.md +0 -0
  185. /package/skills/{design-refine → vibe.design-refine}/templates/polish-report.md +0 -0
  186. /package/skills/{design-refine → vibe.design-refine}/templates/token-audit.md +0 -0
  187. /package/skills/{design-review → vibe.design-review}/agents/a11y-auditor.md +0 -0
  188. /package/skills/{design-review → vibe.design-review}/agents/performance-auditor.md +0 -0
  189. /package/skills/{design-review → vibe.design-review}/agents/responsive-auditor.md +0 -0
  190. /package/skills/{design-review → vibe.design-review}/agents/scorer.md +0 -0
  191. /package/skills/{design-review → vibe.design-review}/agents/slop-detector.md +0 -0
  192. /package/skills/{design-review → vibe.design-review}/frameworks/core-web-vitals.md +0 -0
  193. /package/skills/{design-review → vibe.design-review}/frameworks/wcag-checklist.md +0 -0
  194. /package/skills/{design-review → vibe.design-review}/orchestrator.md +0 -0
  195. /package/skills/{design-review → vibe.design-review}/rubrics/ai-slop-patterns.md +0 -0
  196. /package/skills/{design-review → vibe.design-review}/rubrics/scoring.md +0 -0
  197. /package/skills/{design-review → vibe.design-review}/rubrics/ux-heuristics.md +0 -0
  198. /package/skills/{design-review → vibe.design-review}/templates/critique-report.md +0 -0
  199. /package/skills/{design-review → vibe.design-review}/templates/report.md +0 -0
  200. /package/skills/{design-teach → vibe.design-teach}/rubrics/brand-personality.md +0 -0
  201. /package/skills/{design-teach → vibe.design-teach}/templates/design-context.json +0 -0
  202. /package/skills/{docs → vibe.docs}/references/api-docs-changelog.md +0 -0
  203. /package/skills/{docs → vibe.docs}/references/codemaps-output.md +0 -0
  204. /package/skills/{docs → vibe.docs}/references/diagram-spec.md +0 -0
  205. /package/skills/{docs → vibe.docs}/templates/architecture.md +0 -0
  206. /package/skills/{docs → vibe.docs}/templates/behavioral-principles.md +0 -0
  207. /package/skills/{docs → vibe.docs}/templates/readme.md +0 -0
  208. /package/skills/{docs → vibe.docs}/templates/release-notes.md +0 -0
  209. /package/skills/{e2e-commerce → vibe.e2e-commerce}/templates/test-scenarios.md +0 -0
  210. /package/skills/{event-comms → vibe.event-comms}/templates/email-invite.md +0 -0
  211. /package/skills/{event-comms → vibe.event-comms}/templates/sns-post.md +0 -0
  212. /package/skills/{event-ops → vibe.event-ops}/rubrics/contingency.md +0 -0
  213. /package/skills/{event-ops → vibe.event-ops}/templates/d-day-checklist.md +0 -0
  214. /package/skills/{event-planning → vibe.event-planning}/rubrics/timeline.md +0 -0
  215. /package/skills/{event-planning → vibe.event-planning}/templates/event-plan.md +0 -0
  216. /package/skills/{figma → vibe.figma}/rubrics/conversion-rules.md +0 -0
  217. /package/skills/{figma → vibe.figma}/rubrics/css-mapping.md +0 -0
  218. /package/skills/{figma → vibe.figma}/rubrics/extraction-checklist.md +0 -0
  219. /package/skills/{figma → vibe.figma}/rubrics/image-rules.md +0 -0
  220. /package/skills/{figma → vibe.figma}/templates/component-index.md +0 -0
  221. /package/skills/{figma → vibe.figma}/templates/component-spec.md +0 -0
  222. /package/skills/{figma → vibe.figma}/templates/component.md +0 -0
  223. /package/skills/{figma → vibe.figma}/templates/figma-handoff.md +0 -0
  224. /package/skills/{figma → vibe.figma}/templates/remapped-tree.md +0 -0
  225. /package/skills/{git-worktree → vibe.git-worktree}/rubrics/when-to-use.md +0 -0
  226. /package/skills/{handoff → vibe.handoff}/agents/context-summarizer.md +0 -0
  227. /package/skills/{handoff → vibe.handoff}/agents/document-writer.md +0 -0
  228. /package/skills/{handoff → vibe.handoff}/agents/state-collector.md +0 -0
  229. /package/skills/{handoff → vibe.handoff}/agents/verifier.md +0 -0
  230. /package/skills/{handoff → vibe.handoff}/rubrics/completeness.md +0 -0
  231. /package/skills/{handoff → vibe.handoff}/templates/handoff.md +0 -0
  232. /package/skills/{parallel-research → vibe.parallel-research}/agents/best-practices.md +0 -0
  233. /package/skills/{parallel-research → vibe.parallel-research}/agents/codebase-patterns.md +0 -0
  234. /package/skills/{parallel-research → vibe.parallel-research}/agents/framework-docs.md +0 -0
  235. /package/skills/{parallel-research → vibe.parallel-research}/agents/security-advisory.md +0 -0
  236. /package/skills/{parallel-research → vibe.parallel-research}/agents/synthesizer.md +0 -0
  237. /package/skills/{parallel-research → vibe.parallel-research}/experts/best-practices.md +0 -0
  238. /package/skills/{parallel-research → vibe.parallel-research}/experts/codebase-patterns.md +0 -0
  239. /package/skills/{parallel-research → vibe.parallel-research}/experts/framework-docs.md +0 -0
  240. /package/skills/{parallel-research → vibe.parallel-research}/experts/security-advisory.md +0 -0
  241. /package/skills/{parallel-research → vibe.parallel-research}/orchestrator.md +0 -0
  242. /package/skills/{parallel-research → vibe.parallel-research}/templates/awesome-list.md +0 -0
  243. /package/skills/{parallel-research → vibe.parallel-research}/templates/paper.md +0 -0
  244. /package/skills/{parallel-research → vibe.parallel-research}/templates/synthesis.md +0 -0
  245. /package/skills/{presentation → vibe.presentation}/references/style-presets.md +0 -0
  246. /package/skills/{prioritization-frameworks → vibe.prioritization}/rubrics/frameworks.md +0 -0
  247. /package/skills/{prioritization-frameworks → vibe.prioritization}/templates/scoring-matrix.md +0 -0
  248. /package/skills/{priority-todos → vibe.priority-todos}/rubrics/prioritization.md +0 -0
  249. /package/skills/{priority-todos → vibe.priority-todos}/templates/todo-board.md +0 -0
  250. /package/skills/{vercel-react-best-practices → vibe.react-best-practices}/rubrics/performance.md +0 -0
  251. /package/skills/{vercel-react-best-practices → vibe.react-best-practices}/rubrics/server-components.md +0 -0
  252. /package/skills/{regress → vibe.regress}/templates/bug.md +0 -0
  253. /package/skills/{regress → vibe.regress}/templates/test-jest.md +0 -0
  254. /package/skills/{regress → vibe.regress}/templates/test-vitest.md +0 -0
  255. /package/skills/{arch-guard → vibe.run/internal/arch-guard}/agents/detector.md +0 -0
  256. /package/skills/{arch-guard → vibe.run/internal/arch-guard}/agents/reporter.md +0 -0
  257. /package/skills/{arch-guard → vibe.run/internal/arch-guard}/agents/rule-generator.md +0 -0
  258. /package/skills/{arch-guard → vibe.run/internal/arch-guard}/agents/violation-checker.md +0 -0
  259. /package/skills/{arch-guard → vibe.run/internal/arch-guard}/frameworks/clean-architecture.md +0 -0
  260. /package/skills/{arch-guard → vibe.run/internal/arch-guard}/frameworks/solid.md +0 -0
  261. /package/skills/{arch-guard → vibe.run/internal/arch-guard}/scripts/check-boundaries.js +0 -0
  262. /package/skills/{arch-guard → vibe.run/internal/arch-guard}/templates/arch-rules.json +0 -0
  263. /package/skills/{exec-plan → vibe.run/internal/exec-plan}/agents/decomposer.md +0 -0
  264. /package/skills/{exec-plan → vibe.run/internal/exec-plan}/agents/dependency-mapper.md +0 -0
  265. /package/skills/{exec-plan → vibe.run/internal/exec-plan}/agents/estimator.md +0 -0
  266. /package/skills/{exec-plan → vibe.run/internal/exec-plan}/agents/validator.md +0 -0
  267. /package/skills/{exec-plan → vibe.run/internal/exec-plan}/orchestrator.md +0 -0
  268. /package/skills/{exec-plan → vibe.run/internal/exec-plan}/rubrics/complexity-scoring.md +0 -0
  269. /package/skills/{exec-plan → vibe.run/internal/exec-plan}/templates/plan.md +0 -0
  270. /package/skills/{seo-checklist → vibe.seo-checklist}/frameworks/structured-data.md +0 -0
  271. /package/skills/{seo-checklist → vibe.seo-checklist}/rubrics/content-seo.md +0 -0
  272. /package/skills/{seo-checklist → vibe.seo-checklist}/rubrics/technical-seo.md +0 -0
  273. /package/skills/{tool-fallback → vibe.tool-fallback}/rubrics/fallback-chain.md +0 -0
  274. /package/skills/{ui-ux-pro-max → vibe.ui-ux-pro-max}/reference/color-and-contrast.md +0 -0
  275. /package/skills/{ui-ux-pro-max → vibe.ui-ux-pro-max}/reference/interaction-design.md +0 -0
  276. /package/skills/{ui-ux-pro-max → vibe.ui-ux-pro-max}/reference/motion-design.md +0 -0
  277. /package/skills/{ui-ux-pro-max → vibe.ui-ux-pro-max}/reference/responsive-design.md +0 -0
  278. /package/skills/{ui-ux-pro-max → vibe.ui-ux-pro-max}/reference/spatial-design.md +0 -0
  279. /package/skills/{ui-ux-pro-max → vibe.ui-ux-pro-max}/reference/typography.md +0 -0
  280. /package/skills/{ui-ux-pro-max → vibe.ui-ux-pro-max}/reference/ux-writing.md +0 -0
  281. /package/skills/{ui-ux-pro-max → vibe.ui-ux-pro-max}/rubrics/interaction-states.md +0 -0
  282. /package/skills/{ui-ux-pro-max → vibe.ui-ux-pro-max}/rubrics/responsive-breakpoints.md +0 -0
  283. /package/skills/{user-personas → vibe.user-personas}/rubrics/research-methods.md +0 -0
  284. /package/skills/{user-personas → vibe.user-personas}/templates/persona.md +0 -0
  285. /package/skills/{video-production → vibe.video-production}/rubrics/quality-checklist.md +0 -0
  286. /package/skills/{video-production → vibe.video-production}/templates/production-plan.md +0 -0
@@ -2,7 +2,7 @@
2
2
  * Run Ledger — vibe.run 실행 및 vibe.verify 결과 추적.
3
3
  *
4
4
  * 파일 위치: <projectDir>/.vibe/metrics/run-ledger.json
5
- * 형식: { runStarted, runFeature, verifyPassed, verifyAt, stopWarned,
5
+ * 형식: { runId, runStarted, runFeature, verifyPassed, verifyAt, stopWarned,
6
6
  * verifyRequired, verifyRequiredReason }
7
7
  *
8
8
  * 모든 함수는 fail-open (try/catch, 오류 시 null/false 반환).
@@ -10,14 +10,56 @@
10
10
  */
11
11
 
12
12
  import fs from 'fs';
13
- import os from 'os';
13
+ import { randomUUID } from 'crypto';
14
14
  import path from 'path';
15
15
 
16
+ const EVIDENCE_SCHEMA_VERSION = '1.0.0';
17
+ const UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
18
+
16
19
  /** 레저 파일 경로 */
17
20
  function ledgerPath(projectDir) {
18
21
  return path.join(projectDir, '.vibe', 'metrics', 'run-ledger.json');
19
22
  }
20
23
 
24
+ function evidencePath(projectDir, runId) {
25
+ if (!UUID_PATTERN.test(runId)) return null;
26
+ const runsDir = path.resolve(projectDir, '.vibe', 'runs');
27
+ const target = path.resolve(runsDir, runId, 'evidence.json');
28
+ return target.startsWith(`${runsDir}${path.sep}`) ? target : null;
29
+ }
30
+
31
+ function writeJsonAtomic(targetPath, data) {
32
+ if (!targetPath) return false;
33
+ const dir = path.dirname(targetPath);
34
+ fs.mkdirSync(dir, { recursive: true });
35
+ const tmp = path.join(dir, `.${path.basename(targetPath)}.${process.pid}.${Date.now()}.tmp`);
36
+ try {
37
+ fs.writeFileSync(tmp, JSON.stringify(data, null, 2), 'utf-8');
38
+ fs.renameSync(tmp, targetPath);
39
+ return true;
40
+ } catch {
41
+ try { fs.rmSync(tmp, { force: true }); } catch { /* fail-open */ }
42
+ return false;
43
+ }
44
+ }
45
+
46
+ function withLedgerLock(projectDir, operation) {
47
+ const lockPath = path.join(projectDir, '.vibe', 'metrics', 'run-ledger.lock');
48
+ let descriptor;
49
+ try {
50
+ fs.mkdirSync(path.dirname(lockPath), { recursive: true });
51
+ descriptor = fs.openSync(lockPath, 'wx');
52
+ return operation();
53
+ } catch {
54
+ return false;
55
+ } finally {
56
+ if (descriptor !== undefined) {
57
+ fs.closeSync(descriptor);
58
+ try { fs.rmSync(lockPath, { force: true }); } catch { /* fail-open */ }
59
+ }
60
+ }
61
+ }
62
+
21
63
  /**
22
64
  * 레저 파일 읽기.
23
65
  * @param {string} projectDir
@@ -41,12 +83,61 @@ export function readLedger(projectDir) {
41
83
  */
42
84
  function writeLedger(projectDir, data) {
43
85
  try {
44
- const p = ledgerPath(projectDir);
45
- fs.mkdirSync(path.dirname(p), { recursive: true });
46
- const tmp = path.join(os.tmpdir(), `run-ledger-${process.pid}-${Date.now()}.tmp`);
47
- fs.writeFileSync(tmp, JSON.stringify(data, null, 2), 'utf-8');
48
- fs.renameSync(tmp, p);
49
- return true;
86
+ return writeJsonAtomic(ledgerPath(projectDir), data);
87
+ } catch {
88
+ return false;
89
+ }
90
+ }
91
+
92
+ function verificationResults(results) {
93
+ if (Array.isArray(results)) {
94
+ return results
95
+ .filter(item => item
96
+ && typeof item === 'object'
97
+ && typeof item.command === 'string'
98
+ && Number.isInteger(item.exitCode))
99
+ .map(item => ({
100
+ command: item.command,
101
+ exitCode: item.exitCode,
102
+ }));
103
+ }
104
+ return [];
105
+ }
106
+
107
+ function resolveSpecPath(projectDir, feature) {
108
+ if (typeof feature !== 'string' || feature.includes('..') || /[\\/]/.test(feature)) {
109
+ return null;
110
+ }
111
+ const flatPath = `.vibe/specs/${feature}.md`;
112
+ if (fs.existsSync(path.join(projectDir, flatPath))) return flatPath;
113
+ const splitPath = `.vibe/specs/${feature}/_index.md`;
114
+ return fs.existsSync(path.join(projectDir, splitPath)) ? splitPath : null;
115
+ }
116
+
117
+ function buildEvidence(projectDir, ledger, passed, generatedAt) {
118
+ return {
119
+ schemaVersion: EVIDENCE_SCHEMA_VERSION,
120
+ runId: ledger.runId,
121
+ specPath: resolveSpecPath(projectDir, ledger.runFeature),
122
+ generatedAt,
123
+ judges: {
124
+ deterministic: {
125
+ authority: 'blocking',
126
+ verifyPassed: Boolean(passed),
127
+ verificationResults: verificationResults(ledger.verificationResults),
128
+ },
129
+ model: { authority: 'advisory-only', canComplete: false },
130
+ humanTaste: { authority: 'release-only', canComplete: false },
131
+ },
132
+ };
133
+ }
134
+
135
+ function writeEvidence(projectDir, ledger, passed, generatedAt) {
136
+ try {
137
+ return writeJsonAtomic(
138
+ evidencePath(projectDir, ledger.runId),
139
+ buildEvidence(projectDir, ledger, passed, generatedAt),
140
+ );
50
141
  } catch {
51
142
  return false;
52
143
  }
@@ -59,10 +150,12 @@ function writeLedger(projectDir, data) {
59
150
  * @returns {boolean} 성공 여부
60
151
  */
61
152
  export function recordRunStart(projectDir, feature) {
62
- try {
153
+ return withLedgerLock(projectDir, () => {
63
154
  const existing = readLedger(projectDir) || {};
155
+ const { verificationResults: _results, verificationCommands: _commands, ...retained } = existing;
64
156
  const next = {
65
- ...existing,
157
+ ...retained,
158
+ runId: randomUUID(),
66
159
  runStarted: new Date().toISOString(),
67
160
  runFeature: feature || null,
68
161
  verifyPassed: false,
@@ -70,9 +163,7 @@ export function recordRunStart(projectDir, feature) {
70
163
  stopWarned: false,
71
164
  };
72
165
  return writeLedger(projectDir, next);
73
- } catch {
74
- return false;
75
- }
166
+ });
76
167
  }
77
168
 
78
169
  /**
@@ -80,25 +171,36 @@ export function recordRunStart(projectDir, feature) {
80
171
  * pass 시 verifyRequired 상태를 클리어한다.
81
172
  * @param {string} projectDir
82
173
  * @param {boolean} passed - 검증 통과 여부
174
+ * @param {{runId?: string, verificationResults?: object[]}} options
83
175
  * @returns {boolean} 성공 여부
84
176
  */
85
- export function recordVerify(projectDir, passed) {
86
- try {
177
+ export function recordVerify(projectDir, passed, options = {}) {
178
+ return withLedgerLock(projectDir, () => {
87
179
  const existing = readLedger(projectDir) || {};
180
+ const existingRunId = UUID_PATTERN.test(existing.runId || '') ? existing.runId : null;
181
+ if (existing.runId !== undefined && !existingRunId) return false;
182
+ if (existingRunId && options.runId !== existingRunId) return false;
183
+ const runId = existingRunId || randomUUID();
184
+ const results = verificationResults(options.verificationResults);
185
+ if (passed && (results.length === 0 || results.some(result => result.exitCode !== 0))) {
186
+ return false;
187
+ }
188
+ const generatedAt = new Date().toISOString();
88
189
  const next = {
89
190
  ...existing,
191
+ runId,
90
192
  verifyPassed: Boolean(passed),
91
- verifyAt: new Date().toISOString(),
193
+ verifyAt: generatedAt,
194
+ verificationResults: results,
92
195
  };
93
196
  // pass 시 verifyRequired 클리어
94
197
  if (passed) {
95
198
  next.verifyRequired = false;
96
199
  next.verifyRequiredReason = null;
97
200
  }
201
+ if (!writeEvidence(projectDir, next, passed, generatedAt)) return false;
98
202
  return writeLedger(projectDir, next);
99
- } catch {
100
- return false;
101
- }
203
+ });
102
204
  }
103
205
 
104
206
  /**
@@ -144,9 +246,9 @@ export function markStopWarned(projectDir) {
144
246
  */
145
247
  export function extractRunFeature(prompt) {
146
248
  try {
147
- const m = prompt.match(/(?:\/|\$)vibe\.run\s+([^\s]+)/i);
249
+ const m = prompt.match(/(?:\/|\$)vibe\.run\s+(?:"([^"]+)"|'([^']+)'|([^\s]+))/i);
148
250
  if (!m) return null;
149
- const token = m[1];
251
+ const token = m[1] || m[2] || m[3];
150
252
  // 플래그(-- 시작)나 키워드는 기능명이 아님
151
253
  if (token.startsWith('-')) return null;
152
254
  return token;
@@ -2,7 +2,7 @@
2
2
  /**
3
3
  * verify-ledger CLI — vibe.verify 결과를 run-ledger에 기록.
4
4
  *
5
- * 사용법: node hooks/scripts/verify-ledger.js pass|fail
5
+ * 사용법: node hooks/scripts/verify-ledger.js pass|fail <run-id> <results-json-path>
6
6
  *
7
7
  * vibe.verify/SKILL.md 에서 검증 완료 시 호출.
8
8
  * stdout 출력은 에이전트가 Bash로 실행하는 컨텍스트이므로 허용.
@@ -10,13 +10,33 @@
10
10
  */
11
11
 
12
12
  import { recordVerify } from './lib/run-ledger.js';
13
+ import fs from 'fs';
13
14
 
14
15
  const arg = process.argv[2];
16
+ const runId = process.argv[3];
17
+ const resultsPath = process.argv[4];
15
18
  const passed = arg === 'pass';
16
19
  const projectDir = process.env.CLAUDE_PROJECT_DIR || process.cwd();
17
20
 
18
- recordVerify(projectDir, passed);
21
+ function readResults(filePath) {
22
+ try {
23
+ if (!filePath) return [];
24
+ const parsed = JSON.parse(fs.readFileSync(filePath, 'utf-8'));
25
+ return Array.isArray(parsed) ? parsed : [];
26
+ } catch {
27
+ return [];
28
+ }
29
+ }
30
+
31
+ const recorded = recordVerify(projectDir, passed, {
32
+ runId,
33
+ verificationResults: readResults(resultsPath),
34
+ });
19
35
 
20
36
  const status = passed ? 'pass' : 'fail';
21
- process.stdout.write(`[verify-ledger] recorded: verifyPassed=${passed} (${status})\n`);
37
+ if (recorded) {
38
+ process.stdout.write(`[verify-ledger] recorded: verifyPassed=${passed} (${status})\n`);
39
+ } else {
40
+ process.stderr.write('[verify-ledger] WARNING: run-ledger or evidence.json write failed\n');
41
+ }
22
42
  process.exit(0);
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@su-record/vibe",
3
- "version": "3.2.0",
4
- "description": "AI Coding Framework for Claude Code — 7+ agents, 60 skills, multi-LLM orchestration",
3
+ "version": "3.2.2",
4
+ "description": "AI Coding Framework for Claude Code — 7+ agents, 51 skills, multi-LLM orchestration",
5
5
  "type": "module",
6
6
  "main": "dist/cli/index.js",
7
7
  "exports": {
@@ -1,5 +1,5 @@
1
1
  ---
2
- name: agents-md
2
+ name: vibe.agents-md
3
3
  user-invocable: false
4
4
  invocation: [auto, chain]
5
5
  tier: standard
@@ -1,5 +1,5 @@
1
1
  ---
2
- name: brand-assets
2
+ name: vibe.brand-assets
3
3
  invocation: [auto]
4
4
  tier: standard
5
5
  description: "Auto-generate app icons (iOS/Android/PWA), favicons, and OG images from SPEC brand information using the Antigravity image backend. Use when the project needs visual brand assets, when user mentions 'icon', 'favicon', 'logo', or 'brand assets', or when a SPEC defines brand colors/identity but no assets exist yet. Outputs multiple sizes and formats ready for deployment. Not for complex illustration or marketing graphics — focused on app identity assets."
@@ -1,5 +1,5 @@
1
1
  ---
2
- name: capability-loop
2
+ name: vibe.capability-loop
3
3
  user-invocable: false
4
4
  invocation: [auto]
5
5
  tier: standard
@@ -1,5 +1,5 @@
1
1
  ---
2
- name: chub-usage
2
+ name: vibe.chub-usage
3
3
  invocation: [auto]
4
4
  tier: optional
5
5
  description: "Context Hub (chub) — fetch vetted, up-to-date API documentation. Write accurate code based on the latest docs instead of training data when working with external APIs/SDKs."
@@ -49,14 +49,14 @@ Step 2.5) --sub URL 확장
49
49
  - 포함: 같은 origin + 같은 locale prefix의 하위 메뉴 URL
50
50
  - 제외: 외부 링크, 언어 전환, 검색, TOP, 푸터 정책/문의/파트너/뉴스룸 링크
51
51
 
52
- Step 3) 스킬 진입
53
- clone 스킬 Phase 0부터 순차 실행
52
+ Step 3) 실행 진입
53
+ 아래 Execution Plan Phase 0부터 순차 실행
54
54
  → URL 다중 입력 시 각 URL마다 별도 feature 디렉토리 (URL path 기반 suffix)
55
55
  ```
56
56
 
57
57
  ## Execution Plan
58
58
 
59
- `clone` 스킬을 로드한 뒤 다음을 순차 실행한다. **Phase 단계 건너뛰기 금지**.
59
+ 다음을 순차 실행한다. **Phase 단계 건너뛰기 금지**.
60
60
 
61
61
  ```
62
62
  Phase 0: Setup
@@ -157,3 +157,295 @@ Claude 기본 행동:
157
157
  - robots.txt 차단 경로 → 명시적 --ignore-robots 없으면 거부
158
158
  - 사용자 의도가 사칭/기만이면 즉시 거부
159
159
  ```
160
+
161
+ ## Bundled implementation
162
+
163
+
164
+ # vibe.clone — Markup-Level Website Clone
165
+
166
+ ## Core Principles
167
+
168
+ ```
169
+ The rendered DOM is the source of truth for markup. Screenshots are for pixel verification only.
170
+
171
+ ✅ Puppeteer-rendered DOM (post-JS) → HTML structural mapping
172
+ ✅ Computed CSS → SCSS direct conversion (no guessing)
173
+ ✅ All remote assets (images, fonts) → downloaded locally and rewritten to project paths
174
+ ✅ Claude handles semantic decisions only: tag selection, component splitting, interactions
175
+ ✅ Screenshots are used for verification only, not generation
176
+ ```
177
+
178
+ ## Immutable Rules
179
+
180
+ ```
181
+ 1. Do NOT generate CSS values by guessing or eyeballing screenshots.
182
+ ✅ clone-to-scss.js output is a DRAFT (skeleton), not a frozen artifact. You MAY
183
+ rewrite SCSS values/selectors — but ONLY with evidence cited from computed.json /
184
+ states.json / behaviors.json (value correction, dedupe, selector restructuring).
185
+ ✅ clone-validate.js PASS is the sole judge of value correctness — not self-report.
186
+ ❌ Do NOT invent values with no extraction evidence ("looks like 18px" is forbidden).
187
+ ❌ Do NOT write CSS values directly inside scoped <style> blocks — style LOCATION
188
+ rule: all values live in styles/{feature}/ SCSS (value authority and style
189
+ location are separate rules; both hold).
190
+
191
+ 2. Do NOT hotlink remote assets. All images/fonts must be downloaded and rewritten.
192
+
193
+ 3. Do NOT skip the pixel verification loop (Phase 5). The clone is incomplete without it.
194
+
195
+ 4. Do NOT copy textual content verbatim from copyrighted sources for production use.
196
+ This skill is for layout/markup learning ("클론 코딩"). Replace text with placeholders
197
+ or user-provided copy when shipping a real product.
198
+ Exception: `--real-content` — the user confirms (once, explicitly) they own the site
199
+ or have permission. Then keep text verbatim; clone-spec.js is invoked with
200
+ `--real-content` so specs mark copy as verbatim.
201
+
202
+ 5. Do NOT build a section without confirming its interaction model. The model in
203
+ sections.json is a static-DOM heuristic — verify scroll-driven vs click-driven vs
204
+ time-driven vs hover against the live site. Misidentifying it is the #1 clone failure mode.
205
+
206
+ 6. Do NOT ship default-state-only. Implement every harvested state (hover/focus/active/open/
207
+ tab-switch) from states.json / the section spec.
208
+
209
+ 7. Do NOT ignore behaviors.json. The ACTIVE interaction sweep (scroll-state diffs,
210
+ click-driven tab content-swap detection, hover diffs, in-view entrance animations,
211
+ time-driven mutation candidates, smooth-scroll-lib detection) catches JS-set state
212
+ that static CSS harvesting is blind to. When the spec's "Dynamic behaviors" block
213
+ conflicts with the static interaction heuristic, the active capture wins.
214
+ ```
215
+
216
+ ## Full Flow
217
+
218
+ ```
219
+ Input: a URL (or multiple URLs for multi-page clones)
220
+
221
+ → Phase 0: Setup (stack detection, feature naming, working dir)
222
+ → Phase 1: Capture (Puppeteer → rendered HTML + computed CSS + screenshots + assets)
223
+ → Phase 2: Refine (DOM → sections.json per breakpoint; + interaction model + states)
224
+ → Phase 2.5: Foundation (fonts / favicon / OG / SVG icons — sequential, before any section)
225
+ → Phase 3: Scaffold (spec gate → SCSS draft + builder dispatch, parallel per section)
226
+ → Phase 3C: Responsive merge (clone-merge-responsive.js — mobile-first @media)
227
+ → Phase 4: Compile gate
228
+ → Phase 5: Pixel verification loop (BOTH viewports after merge)
229
+ ```
230
+
231
+ > Read `references/setup-and-layout.md` for the working-directory layout and code-output paths.
232
+
233
+ ---
234
+
235
+ ## Phase 0: Setup
236
+
237
+ > Read `references/setup-and-layout.md` for the full Phase 0 setup steps (stack detection, feature naming, directories, component indexing, design token scan).
238
+
239
+ ---
240
+
241
+ ## Phase 1: Capture ← Headless browser (parallel MO/PC)
242
+
243
+ **Coordinator pattern: run MO/PC capture as parallel workers.**
244
+
245
+ ### BLOCKING Command — Use only clone-extract.js for capture
246
+
247
+ ```bash
248
+ # [CLONE_SCRIPT] = {{VIBE_PATH}}/hooks/scripts/clone-extract.js
249
+
250
+ # Mobile (375×812)
251
+ node {{VIBE_PATH}}/hooks/scripts/clone-extract.js capture <URL> \
252
+ --out=/tmp/{feature}/mo/ \
253
+ --viewport=375x812 \
254
+ --bp=mo
255
+
256
+ # Desktop (1440×900)
257
+ node {{VIBE_PATH}}/hooks/scripts/clone-extract.js capture <URL> \
258
+ --out=/tmp/{feature}/pc/ \
259
+ --viewport=1440x900 \
260
+ --bp=pc
261
+ ```
262
+
263
+ ⛔ **Writing custom capture scripts (puppeteer-fetch.mjs, etc.) is forbidden.**
264
+ ⛔ **Do NOT use WebFetch or curl** — they cannot render JS-driven SPAs.
265
+ ✅ Use clone-extract.js. If output is unsatisfactory, modify the script.
266
+
267
+ > Read `references/capture-rules.md` for the full per-breakpoint output directory listing and the deterministic capture rule set (networkidle wait, asset resolution, states/behaviors harvesting, SEO asset harvest).
268
+
269
+ ---
270
+
271
+ ## Phase 2: Refine ← DOM → sections.json (independent per BP)
272
+
273
+ ### BLOCKING Command — Writing custom refine scripts is forbidden
274
+
275
+ ```bash
276
+ # MO (--states is optional — auto-resolved as states.json next to computed.json)
277
+ node {{VIBE_PATH}}/hooks/scripts/clone-refine.js \
278
+ /tmp/{feature}/mo/rendered.html \
279
+ /tmp/{feature}/mo/computed.json \
280
+ --out=/tmp/{feature}/mo/sections.json \
281
+ --states=/tmp/{feature}/mo/states.json \
282
+ --bp=mo
283
+
284
+ # PC
285
+ node {{VIBE_PATH}}/hooks/scripts/clone-refine.js \
286
+ /tmp/{feature}/pc/rendered.html \
287
+ /tmp/{feature}/pc/computed.json \
288
+ --out=/tmp/{feature}/pc/sections.json \
289
+ --states=/tmp/{feature}/pc/states.json \
290
+ --bp=pc
291
+ ```
292
+
293
+ ⛔ **Phase 3 is blocked until refine completes for all required BPs.**
294
+ ⛔ **Do NOT parse rendered.html with custom Python/Node scripts.**
295
+ ✅ Use clone-refine.js output as-is. If unsatisfactory, modify the script.
296
+
297
+ > Read `references/refine-rules.md` for the full refinement rule set and the sections.json output schema.
298
+
299
+ ---
300
+
301
+ ## Phase 2.5: Foundation ← sequential, BEFORE any section build
302
+
303
+ Nothing renders right until the foundation exists. Do this yourself (not delegated) — it
304
+ touches shared files:
305
+
306
+ ```
307
+ 1. Fonts: verify _base.scss @font-face srcs point at downloaded assets/fonts/ files.
308
+ Next.js stack → wire via next/font/local in the layout instead of raw @font-face.
309
+ 2. Favicon / OG / manifest: copy assets/seo/* → public/ (project convention path),
310
+ wire metadata (layout.tsx metadata / <head>) to the local files.
311
+ 3. SVG icons: collect inline <svg> from rendered.html, dedupe by path data,
312
+ emit one stack-appropriate icon module (e.g. components/{feature}/icons.tsx).
313
+ Name by visual function (SearchIcon, ArrowRightIcon, LogoIcon).
314
+ 4. Global behaviors from behaviors.json: scrollLib detected → install/wire page-level
315
+ (Lenis etc.); global keyframes/scroll-snap → styles/{feature}/_shared.scss.
316
+ 5. Verify: compile passes before moving on.
317
+ ```
318
+
319
+ ---
320
+
321
+ ## Phase 3: Scaffold ← stack-specific code generation
322
+
323
+ **⛔ Implement MO fully first → pass verification → then PC. No responsive conversion in this phase.**
324
+ **⛔ CSS values must use computed.json output as-is. No vw/clamp/@media in this phase.**
325
+
326
+ ### BLOCKING Command — SCSS must only use script output
327
+
328
+ ```bash
329
+ # Step 0: Generate per-section build-contract specs (run once per BP)
330
+ node {{VIBE_PATH}}/hooks/scripts/clone-spec.js \
331
+ /tmp/{feature}/{bp}/sections.json \
332
+ --out=/path/to/project/components/{feature}/_specs/{bp}/ \
333
+ --feature={feature} [--real-content]
334
+
335
+ # Step A: Auto-generate SCSS draft (run once per BP — note the per-BP out dir)
336
+ node {{VIBE_PATH}}/hooks/scripts/clone-to-scss.js \
337
+ /tmp/{feature}/{bp}/sections.json \
338
+ --out=/path/to/project/styles/{feature}/{bp}/ \
339
+ --token-file=/tmp/{feature}/project-tokens.json
340
+
341
+ # Step B: Per-section validation (after writing each section's component code)
342
+ node {{VIBE_PATH}}/hooks/scripts/clone-validate.js \
343
+ /path/to/project/styles/{feature}/{bp}/ \
344
+ /tmp/{feature}/{bp}/sections.json \
345
+ --section={SectionName}
346
+ ```
347
+
348
+ ⛔ **No section is built without a completed spec.** Step 0 emits `_specs/{Section}.spec.md`
349
+ (interaction model + **active-capture Dynamic behaviors** (scroll/tab/hover/in-view/
350
+ time-driven/scroll-lib) + states + computed CSS + assets + text + checklist).
351
+ clone-spec.js auto-loads `behaviors.json` from the sections.json dir and attaches matching
352
+ behaviors per section. Before dispatching a section's builder, Claude reviews its spec and
353
+ resolves every `TODO` (confirm interaction model, list states to implement, choose tags,
354
+ replace copyrighted text — skipped with --real-content). The spec is the contract AND the
355
+ audit trail — it forces extraction rigor before any code is written.
356
+ ⛔ **clone-to-scss.js must run first (Step A) — its output is the DRAFT every section starts
357
+ from.** After that, SCSS edits are allowed per Immutable Rule 1 (evidence-cited only);
358
+ clone-validate.js PASS is the judge.
359
+ ⛔ **Do NOT write custom SCSS / spec generation scripts.**
360
+ ⛔ **Do NOT proceed past a section without a clone-validate.js PASS for it.**
361
+
362
+ Phase 3A: MO Scaffold — parallel builder dispatch
363
+ Input: /tmp/{feature}/mo/sections.json
364
+ → Phase 4 (MO compile) → Phase 5 (MO pixel verification)
365
+
366
+ Phase 3B: PC Scaffold
367
+ Same process as MO, input /tmp/{feature}/pc/sections.json → styles/{feature}/pc/
368
+ → Phase 4 (PC compile) → Phase 5 (PC pixel verification)
369
+
370
+ Phase 3C: Responsive Integration (after both MO+PC pass Phase 5)
371
+ 1. node {{VIBE_PATH}}/hooks/scripts/clone-merge-responsive.js \
372
+ --mo=/path/to/project/styles/{feature}/mo/ \
373
+ --pc=/path/to/project/styles/{feature}/pc/ \
374
+ --out=/path/to/project/styles/{feature}/ \
375
+ [--breakpoint=1024]
376
+ → mobile-first merge: MO declarations = base, PC diffs → @media (min-width) block
377
+ → Phase 4 (compile) → Phase 5 at BOTH viewports against each BP's screenshot.
378
+ ⛔ The clone is NOT complete until the MERGED build passes Phase 5 at both.
379
+ ```
380
+
381
+ > Read `references/scaffold-phases.md` for the full Phase 3A prep/dispatch/merge builder contract (framework mapping, 150-line split rule, clone-validate.js PASS/FAIL loop detail), Phase 3C steps 2–3 (import switch, pc-only/mo-only selector review), and Claude's role checklist.
382
+
383
+ ---
384
+
385
+ ## Phase 4: Compile Gate
386
+
387
+ ```
388
+ No round cap. Loop until compile succeeds (or stuck → ask user).
389
+
390
+ 0. Capture baseline (before Phase 3): record existing tsc + build errors
391
+ → Phase 4 only fixes NEW errors
392
+
393
+ 1. TypeScript: vue-tsc / svelte-check / tsc --noEmit
394
+ 2. Build: npm run build (120s timeout)
395
+ 3. Dev server: npm run dev → detect port → polling
396
+
397
+ On error: parse → auto-fix → re-check
398
+ Termination:
399
+ ✅ Success: all checks pass → enter Phase 5
400
+ ⚠️ Stuck: same errors as previous round → ask user
401
+ 1. Direct fix instructions → retry
402
+ 2. "proceed" — record remaining errors as TODO, proceed to Phase 5
403
+ 3. "abort" — halt
404
+ ultrawork mode: on stuck, record TODO without prompting and proceed
405
+
406
+ ⛔ Must enter Phase 5 after Phase 4 passes. Do NOT output a "completion summary".
407
+ ```
408
+
409
+ ---
410
+
411
+ ## Phase 5: Pixel Verification Loop ← MANDATORY
412
+
413
+ **⛔ Phase 5 is mandatory, not optional. Enter automatically after Phase 4.**
414
+ **⛔ Skipping Phase 5 makes the entire clone "incomplete".**
415
+
416
+ ```
417
+ No round cap. Loop until P1=0 (or stuck → ask user).
418
+ Infrastructure: src/infra/lib/browser/ (Puppeteer + CDP) — same as figma Phase 6.
419
+
420
+ 1. Render scaffolded page in dev server at matching viewport
421
+ 2. Capture screenshot → pixelmatch comparison against /tmp/{feature}/{bp}/screenshot.png
422
+ diffRatio > 0.05 (clone target is tighter than figma) → P1
423
+ 3. CSS comparison: live computed CSS vs /tmp/{feature}/{bp}/computed.json
424
+ delta > 2px → P1, ≤ 2px → P2
425
+ 4. Asset audit: every <img>/background-image resolves to local public/images/ path → else P1
426
+ 5. Fix P1 first (refer to computed.json, no guessing) → revalidate compile → reload
427
+
428
+ Narrowing scope:
429
+ Round 1: P1+P2+P3
430
+ Round 2: P1+P2
431
+ Round 3+: P1 only
432
+
433
+ Termination:
434
+ ✅ P1=0 AND no new findings → complete
435
+ ⚠️ Stuck: same findings → ask user (resolve / proceed / abort)
436
+ ultrawork mode: on stuck, record TODO without prompting and complete
437
+
438
+ Responsive: after MO verification → change viewport → repeat against PC screenshot
439
+ Post-merge (Phase 3C): re-run at BOTH viewports (375×812 vs mo/screenshot.png,
440
+ 1440×900 vs pc/screenshot.png) — either failing means the merge regressed; fix the
441
+ merged SCSS (evidence: the per-BP sections.json), never by re-guessing values
442
+ Cleanup: shut down browser + dev server
443
+
444
+ ⛔ "Completion summary" output only allowed after Phase 5 completes.
445
+ ```
446
+
447
+ ---
448
+
449
+ ## Legal, Ethical & Error Recovery Reference
450
+
451
+ > Read `references/legal-and-error-recovery.md` for the full legal/ethical usage notes (intended use, prohibited use, --real-content flow) and the Error Recovery troubleshooting table.
@@ -1,5 +1,5 @@
1
1
  ---
2
- name: commerce-patterns
2
+ name: vibe.commerce-patterns
3
3
  invocation: [auto]
4
4
  tier: core
5
5
  description: "E-commerce domain patterns — cart management, payment processing (Toss/Stripe/PG), inventory tracking, and order state machines with transaction safety. Use when implementing any shopping cart, checkout flow, payment integration, stock management, or order lifecycle. Covers idempotency keys, double-charge prevention, stock reservation, and refund flows. Must use this skill when the codebase involves e-commerce — even for seemingly simple 'add to cart' features."
@@ -1,6 +1,6 @@
1
1
  ---
2
- name: commit-push-pr
3
- invocation: [auto, chain]
2
+ name: vibe.commit-push-pr
3
+ invocation: [auto]
4
4
  tier: optional
5
5
  description: "Commit, push, and create PR in one go. Auto-activates on commit, PR, push keywords."
6
6
  triggers: [commit, push, PR, pull request, merge]
@@ -1,5 +1,5 @@
1
1
  ---
2
- name: context7-usage
2
+ name: vibe.context7-usage
3
3
  invocation: [auto]
4
4
  tier: optional
5
5
  description: "Context7 plugin for latest library documentation. Auto-activates when docs, documentation, latest version, official docs, API reference, or library help is needed."