@su-record/vibe 3.2.1 → 3.2.3
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.
- package/CLAUDE.md +1 -1
- package/README.en.md +4 -4
- package/README.md +4 -4
- package/dist/__tests__/skill-namespace.test.d.ts +2 -0
- package/dist/__tests__/skill-namespace.test.d.ts.map +1 -0
- package/dist/__tests__/skill-namespace.test.js +60 -0
- package/dist/__tests__/skill-namespace.test.js.map +1 -0
- package/dist/__tests__/stakes-contract.test.d.ts +2 -0
- package/dist/__tests__/stakes-contract.test.d.ts.map +1 -0
- package/dist/__tests__/stakes-contract.test.js +110 -0
- package/dist/__tests__/stakes-contract.test.js.map +1 -0
- package/dist/__tests__/wiring-integrity.test.js +5 -5
- package/dist/__tests__/wiring-integrity.test.js.map +1 -1
- package/dist/cli/generate-release-notes.d.ts +3 -0
- package/dist/cli/generate-release-notes.d.ts.map +1 -0
- package/dist/cli/generate-release-notes.js +47 -0
- package/dist/cli/generate-release-notes.js.map +1 -0
- package/dist/cli/postinstall/constants.d.ts +6 -6
- package/dist/cli/postinstall/constants.d.ts.map +1 -1
- package/dist/cli/postinstall/constants.js +114 -46
- package/dist/cli/postinstall/constants.js.map +1 -1
- package/dist/cli/postinstall/fs-utils.d.ts +1 -0
- package/dist/cli/postinstall/fs-utils.d.ts.map +1 -1
- package/dist/cli/postinstall/fs-utils.js +25 -0
- package/dist/cli/postinstall/fs-utils.js.map +1 -1
- package/dist/cli/postinstall/fs-utils.test.js +46 -11
- package/dist/cli/postinstall/fs-utils.test.js.map +1 -1
- package/dist/cli/postinstall/main.d.ts.map +1 -1
- package/dist/cli/postinstall/main.js +3 -2
- package/dist/cli/postinstall/main.js.map +1 -1
- package/dist/tests/curated-release-notes.test.d.ts +2 -0
- package/dist/tests/curated-release-notes.test.d.ts.map +1 -0
- package/dist/tests/curated-release-notes.test.js +106 -0
- package/dist/tests/curated-release-notes.test.js.map +1 -0
- package/dist/tools/release/releaseNotes.d.ts +21 -0
- package/dist/tools/release/releaseNotes.d.ts.map +1 -0
- package/dist/tools/release/releaseNotes.js +105 -0
- package/dist/tools/release/releaseNotes.js.map +1 -0
- package/hooks/scripts/__tests__/.vibe/command-log.txt +3 -3
- package/package.json +2 -2
- package/skills/vibe/SKILL.md +14 -0
- package/skills/{agents-md → vibe.agents-md}/SKILL.md +1 -1
- package/skills/{brand-assets → vibe.brand-assets}/SKILL.md +1 -1
- package/skills/{capability-loop → vibe.capability-loop}/SKILL.md +1 -1
- package/skills/{chub-usage → vibe.chub-usage}/SKILL.md +1 -1
- package/skills/vibe.clone/SKILL.md +295 -3
- package/skills/{commerce-patterns → vibe.commerce-patterns}/SKILL.md +1 -1
- package/skills/{commit-push-pr → vibe.commit-push-pr}/SKILL.md +2 -2
- package/skills/{context7-usage → vibe.context7-usage}/SKILL.md +1 -1
- package/skills/vibe.contract/SKILL.md +162 -1
- package/skills/{create-prd → vibe.create-prd}/SKILL.md +2 -2
- package/skills/{design-refine → vibe.design-refine}/SKILL.md +1 -1
- package/skills/{design-review → vibe.design-review}/SKILL.md +1 -1
- package/skills/{design-teach → vibe.design-teach}/SKILL.md +1 -1
- package/skills/{devlog → vibe.devlog}/SKILL.md +1 -1
- package/skills/vibe.docs/SKILL.md +256 -1
- package/skills/{e2e-commerce → vibe.e2e-commerce}/SKILL.md +1 -1
- package/skills/vibe.educational-content/SKILL.md +157 -0
- package/skills/vibe.educational-content/references/learning-design.md +81 -0
- package/skills/vibe.educational-content/references/output-patterns.md +109 -0
- package/skills/vibe.educational-content/references/source-method.md +40 -0
- package/skills/{event-comms → vibe.event-comms}/SKILL.md +1 -1
- package/skills/{event-ops → vibe.event-ops}/SKILL.md +1 -1
- package/skills/{event-planning → vibe.event-planning}/SKILL.md +1 -1
- package/skills/vibe.figma/SKILL.md +473 -21
- package/skills/vibe.figma/references/branch-phases.md +1 -1
- package/skills/{git-worktree → vibe.git-worktree}/SKILL.md +1 -1
- package/skills/{handoff → vibe.handoff}/SKILL.md +1 -1
- package/skills/{parallel-research → vibe.parallel-research}/SKILL.md +2 -2
- package/skills/{presentation → vibe.presentation}/SKILL.md +1 -1
- package/skills/{prioritization-frameworks → vibe.prioritization}/SKILL.md +2 -2
- package/skills/{priority-todos → vibe.priority-todos}/SKILL.md +1 -1
- package/skills/{vercel-react-best-practices → vibe.react-best-practices}/SKILL.md +1 -1
- package/skills/vibe.regress/SKILL.md +182 -2
- package/skills/vibe.review/SKILL.md +8 -0
- package/skills/vibe.run/SKILL.md +392 -1
- package/skills/{arch-guard → vibe.run/internal/arch-guard}/templates/violation-report.md +1 -1
- package/skills/{seo-checklist → vibe.seo-checklist}/SKILL.md +1 -1
- package/skills/vibe.spec/SKILL.md +123 -1
- package/skills/vibe.test/SKILL.md +138 -2
- package/skills/{tool-fallback → vibe.tool-fallback}/SKILL.md +1 -1
- package/skills/{ui-ux-pro-max → vibe.ui-ux-pro-max}/SKILL.md +6 -6
- package/skills/{user-personas → vibe.user-personas}/SKILL.md +2 -2
- package/skills/vibe.verify/SKILL.md +2 -2
- package/skills/{video-production → vibe.video-production}/SKILL.md +1 -1
- package/vibe/rules/loop-contract.md +18 -0
- package/skills/arch-guard/SKILL.md +0 -183
- package/skills/clone/SKILL.md +0 -296
- package/skills/contract/SKILL.md +0 -165
- package/skills/docs/SKILL.md +0 -259
- package/skills/exec-plan/SKILL.md +0 -151
- package/skills/figma/SKILL.md +0 -456
- package/skills/regress/SKILL.md +0 -184
- package/skills/restraint/SKILL.md +0 -72
- package/skills/spec/SKILL.md +0 -125
- package/skills/test/SKILL.md +0 -140
- /package/skills/{agents-md → vibe.agents-md}/rubrics/what-to-keep.md +0 -0
- /package/skills/{agents-md → vibe.agents-md}/templates/agents-md.md +0 -0
- /package/skills/{agents-md → vibe.agents-md}/templates/claude-md.md +0 -0
- /package/skills/{brand-assets → vibe.brand-assets}/rubrics/asset-checklist.md +0 -0
- /package/skills/{brand-assets → vibe.brand-assets}/templates/brand-guide.md +0 -0
- /package/skills/{capability-loop → vibe.capability-loop}/agents/capability-designer.md +0 -0
- /package/skills/{capability-loop → vibe.capability-loop}/agents/failure-analyst.md +0 -0
- /package/skills/{capability-loop → vibe.capability-loop}/agents/implementer.md +0 -0
- /package/skills/{capability-loop → vibe.capability-loop}/agents/tester.md +0 -0
- /package/skills/{capability-loop → vibe.capability-loop}/templates/capability-spec.md +0 -0
- /package/skills/{capability-loop → vibe.capability-loop}/templates/failure-analysis.md +0 -0
- /package/skills/{clone → vibe.clone}/references/capture-rules.md +0 -0
- /package/skills/{clone → vibe.clone}/references/legal-and-error-recovery.md +0 -0
- /package/skills/{clone → vibe.clone}/references/refine-rules.md +0 -0
- /package/skills/{clone → vibe.clone}/references/scaffold-phases.md +0 -0
- /package/skills/{clone → vibe.clone}/references/setup-and-layout.md +0 -0
- /package/skills/{commerce-patterns → vibe.commerce-patterns}/rubrics/checkout-flow.md +0 -0
- /package/skills/{commerce-patterns → vibe.commerce-patterns}/templates/product-schema.md +0 -0
- /package/skills/{commit-push-pr → vibe.commit-push-pr}/agents/change-analyzer.md +0 -0
- /package/skills/{commit-push-pr → vibe.commit-push-pr}/agents/message-writer.md +0 -0
- /package/skills/{commit-push-pr → vibe.commit-push-pr}/agents/pr-writer.md +0 -0
- /package/skills/{commit-push-pr → vibe.commit-push-pr}/agents/reviewer.md +0 -0
- /package/skills/{commit-push-pr → vibe.commit-push-pr}/rubrics/commit-message.md +0 -0
- /package/skills/{commit-push-pr → vibe.commit-push-pr}/templates/pr-body.md +0 -0
- /package/skills/{context7-usage → vibe.context7-usage}/rubrics/when-to-use.md +0 -0
- /package/skills/{create-prd → vibe.create-prd}/agents/edge-case-finder.md +0 -0
- /package/skills/{create-prd → vibe.create-prd}/agents/prioritizer.md +0 -0
- /package/skills/{create-prd → vibe.create-prd}/agents/requirements-writer.md +0 -0
- /package/skills/{create-prd → vibe.create-prd}/agents/researcher.md +0 -0
- /package/skills/{create-prd → vibe.create-prd}/agents/reviewer.md +0 -0
- /package/skills/{create-prd → vibe.create-prd}/frameworks/jobs-to-be-done.md +0 -0
- /package/skills/{create-prd → vibe.create-prd}/frameworks/rice-scoring.md +0 -0
- /package/skills/{create-prd → vibe.create-prd}/orchestrator.md +0 -0
- /package/skills/{create-prd → vibe.create-prd}/rubrics/completeness.md +0 -0
- /package/skills/{create-prd → vibe.create-prd}/templates/prd.md +0 -0
- /package/skills/{design-refine → vibe.design-refine}/rubrics/polish-checklist.md +0 -0
- /package/skills/{design-refine → vibe.design-refine}/rubrics/token-naming.md +0 -0
- /package/skills/{design-refine → vibe.design-refine}/templates/design-system.md +0 -0
- /package/skills/{design-refine → vibe.design-refine}/templates/polish-report.md +0 -0
- /package/skills/{design-refine → vibe.design-refine}/templates/token-audit.md +0 -0
- /package/skills/{design-review → vibe.design-review}/agents/a11y-auditor.md +0 -0
- /package/skills/{design-review → vibe.design-review}/agents/performance-auditor.md +0 -0
- /package/skills/{design-review → vibe.design-review}/agents/responsive-auditor.md +0 -0
- /package/skills/{design-review → vibe.design-review}/agents/scorer.md +0 -0
- /package/skills/{design-review → vibe.design-review}/agents/slop-detector.md +0 -0
- /package/skills/{design-review → vibe.design-review}/frameworks/core-web-vitals.md +0 -0
- /package/skills/{design-review → vibe.design-review}/frameworks/wcag-checklist.md +0 -0
- /package/skills/{design-review → vibe.design-review}/orchestrator.md +0 -0
- /package/skills/{design-review → vibe.design-review}/rubrics/ai-slop-patterns.md +0 -0
- /package/skills/{design-review → vibe.design-review}/rubrics/scoring.md +0 -0
- /package/skills/{design-review → vibe.design-review}/rubrics/ux-heuristics.md +0 -0
- /package/skills/{design-review → vibe.design-review}/templates/critique-report.md +0 -0
- /package/skills/{design-review → vibe.design-review}/templates/report.md +0 -0
- /package/skills/{design-teach → vibe.design-teach}/rubrics/brand-personality.md +0 -0
- /package/skills/{design-teach → vibe.design-teach}/templates/design-context.json +0 -0
- /package/skills/{docs → vibe.docs}/references/api-docs-changelog.md +0 -0
- /package/skills/{docs → vibe.docs}/references/codemaps-output.md +0 -0
- /package/skills/{docs → vibe.docs}/references/diagram-spec.md +0 -0
- /package/skills/{docs → vibe.docs}/templates/architecture.md +0 -0
- /package/skills/{docs → vibe.docs}/templates/behavioral-principles.md +0 -0
- /package/skills/{docs → vibe.docs}/templates/readme.md +0 -0
- /package/skills/{docs → vibe.docs}/templates/release-notes.md +0 -0
- /package/skills/{e2e-commerce → vibe.e2e-commerce}/templates/test-scenarios.md +0 -0
- /package/skills/{event-comms → vibe.event-comms}/templates/email-invite.md +0 -0
- /package/skills/{event-comms → vibe.event-comms}/templates/sns-post.md +0 -0
- /package/skills/{event-ops → vibe.event-ops}/rubrics/contingency.md +0 -0
- /package/skills/{event-ops → vibe.event-ops}/templates/d-day-checklist.md +0 -0
- /package/skills/{event-planning → vibe.event-planning}/rubrics/timeline.md +0 -0
- /package/skills/{event-planning → vibe.event-planning}/templates/event-plan.md +0 -0
- /package/skills/{figma → vibe.figma}/rubrics/conversion-rules.md +0 -0
- /package/skills/{figma → vibe.figma}/rubrics/css-mapping.md +0 -0
- /package/skills/{figma → vibe.figma}/rubrics/extraction-checklist.md +0 -0
- /package/skills/{figma → vibe.figma}/rubrics/image-rules.md +0 -0
- /package/skills/{figma → vibe.figma}/templates/component-index.md +0 -0
- /package/skills/{figma → vibe.figma}/templates/component-spec.md +0 -0
- /package/skills/{figma → vibe.figma}/templates/component.md +0 -0
- /package/skills/{figma → vibe.figma}/templates/figma-handoff.md +0 -0
- /package/skills/{figma → vibe.figma}/templates/remapped-tree.md +0 -0
- /package/skills/{git-worktree → vibe.git-worktree}/rubrics/when-to-use.md +0 -0
- /package/skills/{handoff → vibe.handoff}/agents/context-summarizer.md +0 -0
- /package/skills/{handoff → vibe.handoff}/agents/document-writer.md +0 -0
- /package/skills/{handoff → vibe.handoff}/agents/state-collector.md +0 -0
- /package/skills/{handoff → vibe.handoff}/agents/verifier.md +0 -0
- /package/skills/{handoff → vibe.handoff}/rubrics/completeness.md +0 -0
- /package/skills/{handoff → vibe.handoff}/templates/handoff.md +0 -0
- /package/skills/{parallel-research → vibe.parallel-research}/agents/best-practices.md +0 -0
- /package/skills/{parallel-research → vibe.parallel-research}/agents/codebase-patterns.md +0 -0
- /package/skills/{parallel-research → vibe.parallel-research}/agents/framework-docs.md +0 -0
- /package/skills/{parallel-research → vibe.parallel-research}/agents/security-advisory.md +0 -0
- /package/skills/{parallel-research → vibe.parallel-research}/agents/synthesizer.md +0 -0
- /package/skills/{parallel-research → vibe.parallel-research}/experts/best-practices.md +0 -0
- /package/skills/{parallel-research → vibe.parallel-research}/experts/codebase-patterns.md +0 -0
- /package/skills/{parallel-research → vibe.parallel-research}/experts/framework-docs.md +0 -0
- /package/skills/{parallel-research → vibe.parallel-research}/experts/security-advisory.md +0 -0
- /package/skills/{parallel-research → vibe.parallel-research}/orchestrator.md +0 -0
- /package/skills/{parallel-research → vibe.parallel-research}/templates/awesome-list.md +0 -0
- /package/skills/{parallel-research → vibe.parallel-research}/templates/paper.md +0 -0
- /package/skills/{parallel-research → vibe.parallel-research}/templates/synthesis.md +0 -0
- /package/skills/{presentation → vibe.presentation}/references/style-presets.md +0 -0
- /package/skills/{prioritization-frameworks → vibe.prioritization}/rubrics/frameworks.md +0 -0
- /package/skills/{prioritization-frameworks → vibe.prioritization}/templates/scoring-matrix.md +0 -0
- /package/skills/{priority-todos → vibe.priority-todos}/rubrics/prioritization.md +0 -0
- /package/skills/{priority-todos → vibe.priority-todos}/templates/todo-board.md +0 -0
- /package/skills/{vercel-react-best-practices → vibe.react-best-practices}/rubrics/performance.md +0 -0
- /package/skills/{vercel-react-best-practices → vibe.react-best-practices}/rubrics/server-components.md +0 -0
- /package/skills/{regress → vibe.regress}/templates/bug.md +0 -0
- /package/skills/{regress → vibe.regress}/templates/test-jest.md +0 -0
- /package/skills/{regress → vibe.regress}/templates/test-vitest.md +0 -0
- /package/skills/{arch-guard → vibe.run/internal/arch-guard}/agents/detector.md +0 -0
- /package/skills/{arch-guard → vibe.run/internal/arch-guard}/agents/reporter.md +0 -0
- /package/skills/{arch-guard → vibe.run/internal/arch-guard}/agents/rule-generator.md +0 -0
- /package/skills/{arch-guard → vibe.run/internal/arch-guard}/agents/violation-checker.md +0 -0
- /package/skills/{arch-guard → vibe.run/internal/arch-guard}/frameworks/clean-architecture.md +0 -0
- /package/skills/{arch-guard → vibe.run/internal/arch-guard}/frameworks/solid.md +0 -0
- /package/skills/{arch-guard → vibe.run/internal/arch-guard}/scripts/check-boundaries.js +0 -0
- /package/skills/{arch-guard → vibe.run/internal/arch-guard}/templates/arch-rules.json +0 -0
- /package/skills/{exec-plan → vibe.run/internal/exec-plan}/agents/decomposer.md +0 -0
- /package/skills/{exec-plan → vibe.run/internal/exec-plan}/agents/dependency-mapper.md +0 -0
- /package/skills/{exec-plan → vibe.run/internal/exec-plan}/agents/estimator.md +0 -0
- /package/skills/{exec-plan → vibe.run/internal/exec-plan}/agents/validator.md +0 -0
- /package/skills/{exec-plan → vibe.run/internal/exec-plan}/orchestrator.md +0 -0
- /package/skills/{exec-plan → vibe.run/internal/exec-plan}/rubrics/complexity-scoring.md +0 -0
- /package/skills/{exec-plan → vibe.run/internal/exec-plan}/templates/plan.md +0 -0
- /package/skills/{seo-checklist → vibe.seo-checklist}/frameworks/structured-data.md +0 -0
- /package/skills/{seo-checklist → vibe.seo-checklist}/rubrics/content-seo.md +0 -0
- /package/skills/{seo-checklist → vibe.seo-checklist}/rubrics/technical-seo.md +0 -0
- /package/skills/{tool-fallback → vibe.tool-fallback}/rubrics/fallback-chain.md +0 -0
- /package/skills/{ui-ux-pro-max → vibe.ui-ux-pro-max}/reference/color-and-contrast.md +0 -0
- /package/skills/{ui-ux-pro-max → vibe.ui-ux-pro-max}/reference/interaction-design.md +0 -0
- /package/skills/{ui-ux-pro-max → vibe.ui-ux-pro-max}/reference/motion-design.md +0 -0
- /package/skills/{ui-ux-pro-max → vibe.ui-ux-pro-max}/reference/responsive-design.md +0 -0
- /package/skills/{ui-ux-pro-max → vibe.ui-ux-pro-max}/reference/spatial-design.md +0 -0
- /package/skills/{ui-ux-pro-max → vibe.ui-ux-pro-max}/reference/typography.md +0 -0
- /package/skills/{ui-ux-pro-max → vibe.ui-ux-pro-max}/reference/ux-writing.md +0 -0
- /package/skills/{ui-ux-pro-max → vibe.ui-ux-pro-max}/rubrics/interaction-states.md +0 -0
- /package/skills/{ui-ux-pro-max → vibe.ui-ux-pro-max}/rubrics/responsive-breakpoints.md +0 -0
- /package/skills/{user-personas → vibe.user-personas}/rubrics/research-methods.md +0 -0
- /package/skills/{user-personas → vibe.user-personas}/templates/persona.md +0 -0
- /package/skills/{video-production → vibe.video-production}/rubrics/quality-checklist.md +0 -0
- /package/skills/{video-production → vibe.video-production}/templates/production-plan.md +0 -0
|
@@ -31,7 +31,7 @@ Figma와 코드 사이의 **양방향 라우터**. 인자 조합으로 분기를
|
|
|
31
31
|
/vibe.figma --teach # 어느 branch든 design-teach를 인터랙티브로 강제
|
|
32
32
|
```
|
|
33
33
|
|
|
34
|
-
> **URL 분류는
|
|
34
|
+
> **URL 분류는 자동 처리됩니다** — fileKey가 다른 URL은 스토리보드 vs 디자인으로, ROOT 노드 name의 "MO"/"PC"로 디바이스를 구분합니다. 사용자는 URL 종류를 신경 쓰지 않고 한 번에 던지면 됩니다.
|
|
35
35
|
|
|
36
36
|
## Branch Routing (필수: 첫 단계에서 결정)
|
|
37
37
|
|
|
@@ -120,18 +120,18 @@ AskUserQuestion 사용 시 절대 선택지(options) 제공 금지. 자유 텍
|
|
|
120
120
|
### Phase 0 — Setup + URL 수집 + Project Context
|
|
121
121
|
|
|
122
122
|
```
|
|
123
|
-
2.
|
|
123
|
+
2. Execute the bundled implementation below — Phase 0 Setup
|
|
124
124
|
→ 스택 감지, 디렉토리, 피처명, component-index.json, project-tokens.json
|
|
125
125
|
|
|
126
126
|
> Read `references/branch-phases.md` for URL pre-collection rules and the design-context loading algorithm (Phase 0, Branch 1).
|
|
127
127
|
|
|
128
|
-
- hasTeach == true → 이때만 Load skill `design-teach`로 인터랙티브 진입
|
|
128
|
+
- hasTeach == true → 이때만 Load skill `vibe.design-teach`로 인터랙티브 진입
|
|
129
129
|
```
|
|
130
130
|
|
|
131
131
|
### Phase 1 — Storyboard 분석 (선택)
|
|
132
132
|
|
|
133
133
|
```
|
|
134
|
-
|
|
134
|
+
Execute the bundled implementation below — Phase 1 Storyboard
|
|
135
135
|
```
|
|
136
136
|
|
|
137
137
|
> Read `references/branch-phases.md` for the storyboard auto-detect/auto-skip rule and output scope (Branch 1, Phase 1).
|
|
@@ -139,7 +139,7 @@ Load skill `figma` — Phase 1 Storyboard
|
|
|
139
139
|
### Phase 2 — 재료 확보
|
|
140
140
|
|
|
141
141
|
```
|
|
142
|
-
|
|
142
|
+
Execute the bundled implementation below — Phase 2 Extract Mode (코디네이터: MO/PC 병렬 워커)
|
|
143
143
|
→ tree.json + bg/ + content/ + sections/ (검증용)
|
|
144
144
|
```
|
|
145
145
|
|
|
@@ -148,7 +148,7 @@ Load skill `figma` — Phase 2 Extract Mode (코디네이터: MO/PC 병렬 워
|
|
|
148
148
|
### Phase 3 — 데이터 정제
|
|
149
149
|
|
|
150
150
|
```
|
|
151
|
-
|
|
151
|
+
Execute the bundled implementation below — Phase 3
|
|
152
152
|
⛔ figma-refine.js 강제 (자체 정제 스크립트 금지)
|
|
153
153
|
→ /tmp/{feature}/{bp}-main/sections.json
|
|
154
154
|
```
|
|
@@ -156,10 +156,10 @@ Load skill `figma` — Phase 3
|
|
|
156
156
|
### Phase 4 — BP별 스태틱 구현 (컨벤션 준수)
|
|
157
157
|
|
|
158
158
|
```
|
|
159
|
-
|
|
159
|
+
Execute the bundled implementation below — Phase 4 Convert Mode
|
|
160
160
|
|
|
161
161
|
⤵ Phase 4 후처리
|
|
162
|
-
Load skill `design-refine` — normalize 모드
|
|
162
|
+
Load skill `vibe.design-refine` — normalize 모드
|
|
163
163
|
→ 매칭 안 된 하드코딩 값 → MASTER.md 토큰으로 정렬
|
|
164
164
|
→ 새 토큰 필요 항목은 review 큐에 기록
|
|
165
165
|
```
|
|
@@ -169,17 +169,17 @@ Load skill `design-refine` — normalize 모드
|
|
|
169
169
|
### Phase 5 — 컴파일 게이트
|
|
170
170
|
|
|
171
171
|
```
|
|
172
|
-
|
|
172
|
+
Execute the bundled implementation below — Phase 5
|
|
173
173
|
→ tsc/build/dev 서버. P1=0까지 루프. Stuck → 사용자 질문.
|
|
174
174
|
```
|
|
175
175
|
|
|
176
176
|
### Phase 6 — 시각 검증 + 품질 점검 (MANDATORY)
|
|
177
177
|
|
|
178
178
|
```
|
|
179
|
-
|
|
179
|
+
Execute the bundled implementation below — Phase 6 (시각 검증 루프, P1=0까지)
|
|
180
180
|
|
|
181
181
|
⤵ Phase 6 후처리
|
|
182
|
-
Load skill `design-review` — audit 모드
|
|
182
|
+
Load skill `vibe.design-review` — audit 모드
|
|
183
183
|
→ 5-dimension 점검 (a11y, performance, responsive, theming, AI slop)
|
|
184
184
|
→ P1 finding은 review 큐에 기록 (read-only)
|
|
185
185
|
|
|
@@ -200,7 +200,7 @@ Load skill `design-review` — audit 모드
|
|
|
200
200
|
### Phase 0 — Setup (Lite) + URL 수집
|
|
201
201
|
|
|
202
202
|
```
|
|
203
|
-
2.
|
|
203
|
+
2. Execute the bundled implementation below — Phase 0 Setup
|
|
204
204
|
```
|
|
205
205
|
|
|
206
206
|
> Read `references/branch-phases.md` for the URL-reuse note and the Phase 0 (Lite) skip list (component-index/project-tokens).
|
|
@@ -208,14 +208,14 @@ Load skill `design-review` — audit 모드
|
|
|
208
208
|
### Phase 1 — Storyboard 분석 (선택)
|
|
209
209
|
|
|
210
210
|
```
|
|
211
|
-
|
|
211
|
+
Execute the bundled implementation below — Phase 1
|
|
212
212
|
→ Branch 1 Phase 1과 동일 (storyboard URL이 있으면 분석, 없으면 SKIP)
|
|
213
213
|
```
|
|
214
214
|
|
|
215
215
|
### Phase 2 — 재료 확보
|
|
216
216
|
|
|
217
217
|
```
|
|
218
|
-
|
|
218
|
+
Execute the bundled implementation below — Phase 2 Extract Mode
|
|
219
219
|
→ Branch 1 Phase 2와 동일 (design URL로 추출)
|
|
220
220
|
|
|
221
221
|
🚦 Audit gate: Branch 1과 동일하게 `auditSummary.p1 > 0` 이면 Phase 3 진입 금지.
|
|
@@ -224,13 +224,13 @@ Load skill `figma` — Phase 2 Extract Mode
|
|
|
224
224
|
### Phase 3 — 데이터 정제
|
|
225
225
|
|
|
226
226
|
```
|
|
227
|
-
|
|
227
|
+
Execute the bundled implementation below — Phase 3 (figma-refine.js 강제)
|
|
228
228
|
```
|
|
229
229
|
|
|
230
230
|
### Phase 4 — BP별 스태틱 구현 (Standalone 모드)
|
|
231
231
|
|
|
232
232
|
```
|
|
233
|
-
|
|
233
|
+
Execute the bundled implementation below — Phase 4 Convert Mode
|
|
234
234
|
```
|
|
235
235
|
|
|
236
236
|
> Read `references/branch-phases.md` for the Standalone-mode reuse/token rules (Branch 2, Phase 4).
|
|
@@ -238,16 +238,16 @@ Load skill `figma` — Phase 4 Convert Mode
|
|
|
238
238
|
### Phase 5 — 컴파일 게이트
|
|
239
239
|
|
|
240
240
|
```
|
|
241
|
-
|
|
241
|
+
Execute the bundled implementation below — Phase 5
|
|
242
242
|
```
|
|
243
243
|
|
|
244
244
|
### Phase 6 — 시각 검증 + a11y (MANDATORY)
|
|
245
245
|
|
|
246
246
|
```
|
|
247
|
-
|
|
247
|
+
Execute the bundled implementation below — Phase 6 (시각 검증 루프, P1=0까지)
|
|
248
248
|
|
|
249
249
|
⤵ Phase 6 후처리
|
|
250
|
-
Load skill `design-review` — audit 모드
|
|
250
|
+
Load skill `vibe.design-review` — audit 모드
|
|
251
251
|
→ a11y는 항상 검증. 컨벤션 무시 모드여도 접근성은 양보 불가.
|
|
252
252
|
|
|
253
253
|
⛔ Phase 6 + design-review(audit) 완료 전까지 "완료 요약" 출력 금지.
|
|
@@ -280,9 +280,9 @@ Load skill `design-review` — audit 모드
|
|
|
280
280
|
> Read `references/step-algorithms.md` for the full plan.md required-section extraction list, missing-section rejection message, feature-name rule, and design-context priority resolution.
|
|
281
281
|
|
|
282
282
|
```
|
|
283
|
-
- hasTeach == true 인 경우에만 Load skill `design-teach`로 인터랙티브 보강
|
|
283
|
+
- hasTeach == true 인 경우에만 Load skill `vibe.design-teach`로 인터랙티브 보강
|
|
284
284
|
|
|
285
|
-
3. Load skill `ui-ux-pro-max`
|
|
285
|
+
3. Load skill `vibe.ui-ux-pro-max`
|
|
286
286
|
→ plan.md의 분위기/타이포/컬러 키워드로 가이드 매칭
|
|
287
287
|
→ 컬러 팔레트, 폰트 페어링, UX 가이드 후보 생성
|
|
288
288
|
```
|
|
@@ -385,3 +385,455 @@ Load skill `figma:figma-generate-design` — Step 3+: Assemble Sections (디자
|
|
|
385
385
|
❌ Branch 3 도중 figma 스킬의 Extract/Convert Mode · figma-refine.js 호출 금지 (WRITE 모드)
|
|
386
386
|
❌ Branch 결정 후 다른 Branch의 Phase로 점프 금지
|
|
387
387
|
```
|
|
388
|
+
|
|
389
|
+
## Bundled implementation
|
|
390
|
+
|
|
391
|
+
|
|
392
|
+
# vibe.figma — Structural Code Generation
|
|
393
|
+
|
|
394
|
+
## Core Principles
|
|
395
|
+
|
|
396
|
+
```
|
|
397
|
+
The Figma tree is the source of truth for code. Screenshots are for verification only.
|
|
398
|
+
|
|
399
|
+
✅ Figma Auto Layout → CSS Flexbox 1:1 mechanical mapping
|
|
400
|
+
✅ Figma CSS properties → SCSS direct conversion (no guessing)
|
|
401
|
+
✅ Claude handles semantic decisions only: tag selection, component splitting, interactions
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
## Immutable Rules
|
|
405
|
+
|
|
406
|
+
```
|
|
407
|
+
1. Do NOT render content as images (frames with TEXT children, INSTANCEs, buttons/prices,
|
|
408
|
+
whole sections). Image rendering only for BG, vector-text GROUPs, verification screenshots.
|
|
409
|
+
2. BG must use CSS background-image only. <img> tag is forbidden.
|
|
410
|
+
3. No new screenshot calls during Phase 4. Use only Phase 2 materials —
|
|
411
|
+
no matter how complex, implement with HTML+CSS.
|
|
412
|
+
```
|
|
413
|
+
|
|
414
|
+
## Full Flow
|
|
415
|
+
|
|
416
|
+
```
|
|
417
|
+
Input: receive all URLs at once
|
|
418
|
+
Storyboard: figma.com/...?node-id=aaa (if present)
|
|
419
|
+
MO Design: figma.com/...?node-id=xxx
|
|
420
|
+
PC Design: figma.com/...?node-id=yyy (if present)
|
|
421
|
+
|
|
422
|
+
→ Phase 0: Setup
|
|
423
|
+
→ Phase 1: Storyboard analysis → functional spec document
|
|
424
|
+
→ Phase 2: Gather materials (→ Extract Mode section below)
|
|
425
|
+
→ Phase 3: Remapping (MO↔PC matching → remapped.json)
|
|
426
|
+
→ Phase 4: Sequential code generation (→ Convert Mode section below)
|
|
427
|
+
→ Phase 5: Compile gate
|
|
428
|
+
→ Phase 6: Visual verification loop
|
|
429
|
+
|
|
430
|
+
Working directory: /tmp/{feature}/{mo,pc}-main/{tree.json, bg/, content/, sections/}
|
|
431
|
+
+ remapped.json ← sole input for Phase 4
|
|
432
|
+
Code output: directly in the project — components/{feature}/, styles/{feature}/
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
---
|
|
436
|
+
|
|
437
|
+
## Phase 0: Setup
|
|
438
|
+
|
|
439
|
+
```
|
|
440
|
+
1. Stack detection: package.json → react/vue/svelte, next/nuxt, scss/tailwind
|
|
441
|
+
2. Feature name: Figma filename → kebab-case
|
|
442
|
+
3. Directories: components/{feature}/, public/images/{feature}/, styles/{feature}/
|
|
443
|
+
4. Component indexing → component-index.json (≤50 components, props/slots/classes, ≤2 min)
|
|
444
|
+
5. Hooks/Types/Constants → context-index.json
|
|
445
|
+
6. Design token scan → project-tokens.json (SCSS > CSS Variables > Tailwind > CSS-in-JS)
|
|
446
|
+
(all indexes under /tmp/{feature}/)
|
|
447
|
+
```
|
|
448
|
+
|
|
449
|
+
---
|
|
450
|
+
|
|
451
|
+
## Phase 1: Storyboard Analysis
|
|
452
|
+
|
|
453
|
+
```
|
|
454
|
+
User input: URLs or PDF/images separated by newlines
|
|
455
|
+
URL classification (automatic): different fileKey → storyboard vs design;
|
|
456
|
+
ROOT name contains "MO" → mobile, "PC" → desktop
|
|
457
|
+
|
|
458
|
+
Storyboard analysis: collect frames at depth=3 → classify by name pattern
|
|
459
|
+
SPEC (functional definition) → CONFIG (resolution) → PAGE (main sections) → SHARED (common)
|
|
460
|
+
PDF/images follow the same structural extraction
|
|
461
|
+
|
|
462
|
+
❌ No code file creation during Phase 1
|
|
463
|
+
|
|
464
|
+
Output (text only): section list table · per-section functional definition
|
|
465
|
+
([Function] + [Interaction] + [State]) · common component list · TS interface draft
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
---
|
|
469
|
+
|
|
470
|
+
## Phase 2: Gather Materials ← Research (parallel)
|
|
471
|
+
|
|
472
|
+
**→ Follow the Extract Mode rules below.**
|
|
473
|
+
**Coordinator pattern: run MO/PC extraction as parallel workers.**
|
|
474
|
+
|
|
475
|
+
```
|
|
476
|
+
# [FIGMA_SCRIPT] = {{VIBE_PATH}}/hooks/scripts/figma-extract.js
|
|
477
|
+
|
|
478
|
+
Simultaneous MO/PC extraction — each worker: screenshot → tree → images →
|
|
479
|
+
asset rendering → sections/. Proceed to Phase 3 only after both complete.
|
|
480
|
+
Single BP: run sequentially with 1 worker
|
|
481
|
+
Multi-frame (same BP, different pages): sequential (500ms interval), partial failure allowed
|
|
482
|
+
```
|
|
483
|
+
|
|
484
|
+
---
|
|
485
|
+
|
|
486
|
+
## Phase 3: Data Refinement ← Synthesis (independent per BP)
|
|
487
|
+
|
|
488
|
+
**Split and refine each BP's tree.json by section. MO↔PC matching is NOT done here.**
|
|
489
|
+
|
|
490
|
+
### BLOCKING Command — Writing custom refine scripts is strictly forbidden
|
|
491
|
+
|
|
492
|
+
```bash
|
|
493
|
+
# MO
|
|
494
|
+
node {{VIBE_PATH}}/hooks/scripts/figma-refine.js \
|
|
495
|
+
/tmp/{feature}/mo-main/tree.json \
|
|
496
|
+
--out=/tmp/{feature}/mo-main/sections.json \
|
|
497
|
+
--design-width=720 \
|
|
498
|
+
--bp=mo
|
|
499
|
+
|
|
500
|
+
# PC
|
|
501
|
+
node {{VIBE_PATH}}/hooks/scripts/figma-refine.js \
|
|
502
|
+
/tmp/{feature}/pc-main/tree.json \
|
|
503
|
+
--out=/tmp/{feature}/pc-main/sections.json \
|
|
504
|
+
--design-width=2560 \
|
|
505
|
+
--bp=pc
|
|
506
|
+
```
|
|
507
|
+
|
|
508
|
+
⛔ **Phase 4 is blocked until these commands are executed.**
|
|
509
|
+
⛔ **No custom refine scripts, no parsing tree.json directly to produce sections.json.**
|
|
510
|
+
✅ Use only figma-refine.js output. If unsatisfactory, modify figma-refine.js.
|
|
511
|
+
|
|
512
|
+
```
|
|
513
|
+
⛔ Refine each BP independently — do NOT mix MO and PC.
|
|
514
|
+
⛔ The refined JSON (full recursive subtree per section) is the sole input for Phase 4.
|
|
515
|
+
```
|
|
516
|
+
|
|
517
|
+
### Output
|
|
518
|
+
|
|
519
|
+
```
|
|
520
|
+
/tmp/{feature}/{mo,pc}-main/sections.json ← per-BP refinement result
|
|
521
|
+
|
|
522
|
+
sections.json structure:
|
|
523
|
+
{
|
|
524
|
+
meta: { feature, designWidth, bp },
|
|
525
|
+
sections: [{
|
|
526
|
+
name: "Hero", nodeId, type, size, css,
|
|
527
|
+
text, imageRef, fills, layoutSizingH, layoutSizingV,
|
|
528
|
+
children: [ ... ], // ⛔ full recursive subtree — down to leaf nodes
|
|
529
|
+
images: { bg: "bg/hero-bg.webp", content: ["content/hero-title.webp"] }
|
|
530
|
+
}]
|
|
531
|
+
}
|
|
532
|
+
```
|
|
533
|
+
|
|
534
|
+
### Node Refinement Rules (tree.json → sections.json)
|
|
535
|
+
|
|
536
|
+
```
|
|
537
|
+
1. size-0px nodes, VECTOR decorative lines (w/h ≤ 2px), isMask nodes → remove
|
|
538
|
+
2. BG frames → separate from children, move to images.bg
|
|
539
|
+
3. Vector-text GROUPs + design text (TEXT with multiple/gradient fills or effects)
|
|
540
|
+
→ separate from children, add to images.content
|
|
541
|
+
4. Remaining nodes → keep in children (with CSS, recursive)
|
|
542
|
+
|
|
543
|
+
Multi-frame (same BP, different pages): identify common elements → shared components;
|
|
544
|
+
union of common tokens → shared _tokens.scss
|
|
545
|
+
```
|
|
546
|
+
|
|
547
|
+
---
|
|
548
|
+
|
|
549
|
+
## Phase 4: Per-BP Static Implementation ← Implement (sequential per BP)
|
|
550
|
+
|
|
551
|
+
**→ Follow the Convert Mode rules below.**
|
|
552
|
+
**⛔ Implement MO fully first → pass verification → then implement PC. No responsive conversion.**
|
|
553
|
+
**⛔ CSS values must use Figma original px as-is. vw conversion, clamp, @media are forbidden.**
|
|
554
|
+
|
|
555
|
+
### BLOCKING Command — SCSS must only use script output
|
|
556
|
+
|
|
557
|
+
```bash
|
|
558
|
+
# Step A: Auto-generate SCSS skeleton (run once per BP)
|
|
559
|
+
node {{VIBE_PATH}}/hooks/scripts/figma-to-scss.js \
|
|
560
|
+
/tmp/{feature}/{bp}-main/sections.json \
|
|
561
|
+
--out=/path/to/project/assets/scss/{feature}/
|
|
562
|
+
|
|
563
|
+
# Step B: Per-section validation (after writing each section's code)
|
|
564
|
+
node {{VIBE_PATH}}/hooks/scripts/figma-validate.js \
|
|
565
|
+
/path/to/project/assets/scss/{feature}/ \
|
|
566
|
+
/tmp/{feature}/{bp}-main/sections.json \
|
|
567
|
+
--section={SectionName}
|
|
568
|
+
```
|
|
569
|
+
|
|
570
|
+
⛔ **Writing SCSS directly (or via custom generation scripts) invalidates Phase 4.**
|
|
571
|
+
⛔ **Do NOT proceed to the next section without a figma-validate.js PASS.**
|
|
572
|
+
⛔ **No CSS values inside scoped style blocks** — only @import/@use of external SCSS files.
|
|
573
|
+
✅ Use figma-to-scss.js output as-is. If unsatisfactory, modify figma-to-scss.js.
|
|
574
|
+
|
|
575
|
+
```
|
|
576
|
+
Phase 4A: MO Static Implementation (input: mo-main/sections.json)
|
|
577
|
+
⛔ No parallelism. Process one section at a time:
|
|
578
|
+
1. Read the target section from sections.json
|
|
579
|
+
2. Write an image vs HTML classification table (BLOCKING — see Convert Mode §C1)
|
|
580
|
+
3. figma-to-scss.js → auto-generate SCSS skeleton (px as-is) — Step A once
|
|
581
|
+
4. Claude: HTML structure + semantic tags + layout + interactions (Vue/React files only)
|
|
582
|
+
5. figma-validate.js — Step B: PASS → next section │ FAIL → fix → re-run
|
|
583
|
+
(repeat until P1=0, no round cap)
|
|
584
|
+
→ Phase 5 (MO compile) → Phase 6 (MO visual verification)
|
|
585
|
+
|
|
586
|
+
Phase 4B: PC Static Implementation (input: pc-main/sections.json)
|
|
587
|
+
Same process as MO → Phase 5 (PC compile) → Phase 6 (PC visual verification)
|
|
588
|
+
|
|
589
|
+
Phase 4C: Responsive Integration (after both MO+PC pass verification)
|
|
590
|
+
→ Separate flow to be established (TODO)
|
|
591
|
+
|
|
592
|
+
Claude's role (restricted): semantic decisions only (Convert Mode §C3) + image classification
|
|
593
|
+
+ executing figma-to-scss.js / figma-validate.js.
|
|
594
|
+
❌ No modifying SCSS values, no CSS in <style> blocks, no vw/clamp/@media,
|
|
595
|
+
no custom functions/mixins, no custom refine/generate scripts.
|
|
596
|
+
|
|
597
|
+
SCSS Setup (before the first section):
|
|
598
|
+
index.scss, _tokens.scss, _base.scss
|
|
599
|
+
Token mapping: reference existing tokens from project-tokens.json → create new ones if no match
|
|
600
|
+
|
|
601
|
+
Component matching (before each section):
|
|
602
|
+
Compare against component-index.json → import if matched, create new if not
|
|
603
|
+
|
|
604
|
+
Multi-frame:
|
|
605
|
+
Step 1: shared components first → components/shared/
|
|
606
|
+
Step 2: unique sections per frame
|
|
607
|
+
```
|
|
608
|
+
|
|
609
|
+
---
|
|
610
|
+
|
|
611
|
+
## Phase 5: Compile Gate
|
|
612
|
+
|
|
613
|
+
```
|
|
614
|
+
No round cap. Loop until compile succeeds (or stuck → ask user).
|
|
615
|
+
|
|
616
|
+
0. Capture baseline (before Phase 4): record existing tsc + build errors → fix NEW errors only
|
|
617
|
+
1. TypeScript: vue-tsc/svelte-check/tsc --noEmit
|
|
618
|
+
2. Build: npm run build (120s timeout)
|
|
619
|
+
3. Dev server: npm run dev → detect port → polling
|
|
620
|
+
|
|
621
|
+
On error: parse → auto-fix → re-check
|
|
622
|
+
Termination:
|
|
623
|
+
✅ Success: all checks pass → enter Phase 6
|
|
624
|
+
⚠️ Stuck (same errors as previous round) → ask user: fix instructions │ "proceed"
|
|
625
|
+
(record TODO, go to Phase 6) │ "abort". ultrawork: record TODO + proceed silently.
|
|
626
|
+
|
|
627
|
+
On completion: preserve dev server PID → used in Phase 6
|
|
628
|
+
|
|
629
|
+
⛔ After Phase 5 passes (or user proceeds), must enter Phase 6.
|
|
630
|
+
Do NOT output a "completion summary" or declare work complete without Phase 6.
|
|
631
|
+
```
|
|
632
|
+
|
|
633
|
+
---
|
|
634
|
+
|
|
635
|
+
## Phase 6: Visual Verification Loop ← Verify (parallel) MANDATORY
|
|
636
|
+
|
|
637
|
+
**⛔ Mandatory — enter automatically upon Phase 5 completion; skipping = task "incomplete".**
|
|
638
|
+
**Coordinator pattern: independent per-section verification can run as parallel workers.**
|
|
639
|
+
|
|
640
|
+
```
|
|
641
|
+
No round cap. Loop until P1=0 (or stuck → ask user).
|
|
642
|
+
Infrastructure: src/infra/lib/browser/ (Puppeteer + CDP)
|
|
643
|
+
|
|
644
|
+
1. Capture rendered screenshot → pixelmatch comparison against Figma screenshot
|
|
645
|
+
diffRatio > 0.1 → P1
|
|
646
|
+
2. CSS value comparison: computed CSS vs tree.json expected values
|
|
647
|
+
delta > 4px → P1, ≤ 4px → P2
|
|
648
|
+
3. Check for missing images and text
|
|
649
|
+
4. Fix P1 issues first (refer to tree.json, no guessing) → revalidate compile → reload
|
|
650
|
+
|
|
651
|
+
Narrowing scope: Round 1 P1+P2+P3 → Round 2 P1+P2 → Round 3+ P1 only (until P1=0)
|
|
652
|
+
|
|
653
|
+
Termination:
|
|
654
|
+
✅ Success: P1 = 0 AND no new findings → complete
|
|
655
|
+
⚠️ Stuck (same findings as previous round) → ask user: direct resolution │ "proceed"
|
|
656
|
+
(record TODO, complete) │ "abort". ultrawork: record TODO + complete silently.
|
|
657
|
+
|
|
658
|
+
Responsive: after MO verification, change viewport → same loop against PC screenshots
|
|
659
|
+
Cleanup: shut down browser + dev server
|
|
660
|
+
|
|
661
|
+
⛔ "Completion summary" output is only allowed after Phase 6 is complete (or user proceeds).
|
|
662
|
+
```
|
|
663
|
+
|
|
664
|
+
---
|
|
665
|
+
|
|
666
|
+
## Extract Mode (Phase 2 body) — Acquire Code Generation Data
|
|
667
|
+
|
|
668
|
+
Uses the Figma REST API (`src/infra/lib/figma/`) to extract **all data needed for structural code generation**. Priority: 1st node tree + CSS (PRIMARY source) → 2nd image assets → 3rd screenshots (Phase 6 validation only, never for generation).
|
|
669
|
+
|
|
670
|
+
### E1. Node Tree + CSS — Source of Truth
|
|
671
|
+
|
|
672
|
+
```
|
|
673
|
+
Bash:
|
|
674
|
+
node "{{VIBE_PATH}}/hooks/scripts/figma-extract.js" tree {fileKey} {nodeId}
|
|
675
|
+
|
|
676
|
+
Returns (FigmaNode JSON):
|
|
677
|
+
{ nodeId, name, type, size, css: { display, flexDirection, gap, ... },
|
|
678
|
+
text (TEXT only), imageRef, imageScaleMode (FILL/FIT/CROP/TILE),
|
|
679
|
+
layoutSizingH/V (FIXED/HUG/FILL), fills (only when 2+), isMask,
|
|
680
|
+
raw: { itemSpacing, padding*, cornerRadius, strokeWeight, strokeAlign, blendMode,
|
|
681
|
+
opacity, fontSize, lineHeightPx, letterSpacing, fontWeight, leadingTrim,
|
|
682
|
+
textBoxTrim }, ← Figma numbers for Phase 6 raw-vs-computed reconciliation
|
|
683
|
+
warnings: [{ property, value, severity: "P1"|"P2", reason }], ← translation-loss only
|
|
684
|
+
children: [...] }
|
|
685
|
+
|
|
686
|
+
Root node also carries:
|
|
687
|
+
auditSummary: { total, p1, p2, items: [{ nodeId, name, property, value, severity, reason }] }
|
|
688
|
+
|
|
689
|
+
→ Save to /tmp/{feature}/tree.json
|
|
690
|
+
|
|
691
|
+
Figma property → CSS mapping (what the extractor auto-converts): rubrics/css-mapping.md
|
|
692
|
+
```
|
|
693
|
+
|
|
694
|
+
### E2. Translation-loss Audit (Figma → CSS Incompatibilities)
|
|
695
|
+
|
|
696
|
+
The extractor flags properties CSS cannot reproduce cleanly (per-node `warnings[]`, rolled up as root `auditSummary`).
|
|
697
|
+
|
|
698
|
+
**P1 (block Phase 3 until resolved or waived):** `strokeAlign` ≠ `CENTER` (CSS border only renders centered strokes) · `blendMode` ∈ { `LINEAR_BURN`, `LINEAR_DODGE`, `PLUS_DARKER`, `PLUS_LIGHTER` } (no CSS equivalent).
|
|
699
|
+
|
|
700
|
+
**P2 (record + proceed):** `leadingTrim`/`textBoxTrim` ≠ `NONE` (limited `text-box-trim` support) · `constraints` ∈ { `SCALE`, `CENTER` } (no direct CSS layout mapping) · `individualStrokeWeights` with `strokeAlign` ≠ `CENTER`.
|
|
701
|
+
|
|
702
|
+
**Gate rule:** if `auditSummary.p1 > 0`, resolve each item (replace layer in Figma, accept approximation with user sign-off, or mark as known deviation) before Phase 3. Log P2 items into feature notes for Phase 6 reviewer attention.
|
|
703
|
+
|
|
704
|
+
### E3. Image Assets — Node Rendering Based
|
|
705
|
+
|
|
706
|
+
Full determination rules and real-world failure cases: `rubrics/image-rules.md`.
|
|
707
|
+
|
|
708
|
+
```
|
|
709
|
+
Do NOT download imageRef individually (shared texture fill → multi-MB originals).
|
|
710
|
+
All images are rendered as nodes:
|
|
711
|
+
node "{{VIBE_PATH}}/hooks/scripts/figma-extract.js" screenshot {fileKey} {nodeId} --out=...
|
|
712
|
+
|
|
713
|
+
BG frames → bg/{section}-bg.webp
|
|
714
|
+
Identification: name contains "BG"/"bg", OR same size as parent (±10%) + 3+ child images
|
|
715
|
+
Content nodes → content/{name}.webp
|
|
716
|
+
Icons (VECTOR/GROUP ≤ 64px) · item/reward/token/coin thumbnails
|
|
717
|
+
· vector-text GROUPs (3+ VECTORs, each <60px)
|
|
718
|
+
· design text (TEXT with 2+ fills, effects, GRADIENT fill, or non-web-font fontFamily)
|
|
719
|
+
→ must be rendered; placed as <img alt="text content">, never CSS text
|
|
720
|
+
· decorative panels (textured backgrounds) → render like BG frames
|
|
721
|
+
|
|
722
|
+
imageRef download is a fallback only (API failure, DOCUMENT level); >5MB → texture-fill warning.
|
|
723
|
+
Screenshots (validation only): full-screenshot.webp + per 1-depth child → sections/{name}.webp
|
|
724
|
+
```
|
|
725
|
+
|
|
726
|
+
### E4. Extraction Completion Validation (Required Before Phase 3)
|
|
727
|
+
|
|
728
|
+
```
|
|
729
|
+
If any item is missing → re-extract (do NOT proceed to Phase 3)
|
|
730
|
+
|
|
731
|
+
1. tree.json exists + root children > 0 · 2. BG per section exists in bg/
|
|
732
|
+
3. Every design-text TEXT node (2+ fills or effects) rendered in content/
|
|
733
|
+
4. Every vector-text GROUP (3+ VECTORs) rendered in content/
|
|
734
|
+
5. Per-section validation screenshots exist in sections/ · 6. All filenames kebab-case
|
|
735
|
+
```
|
|
736
|
+
|
|
737
|
+
---
|
|
738
|
+
|
|
739
|
+
## Convert Mode (Phase 4 body) — Tree-Based Structured Code Generation
|
|
740
|
+
|
|
741
|
+
**Mechanically map sections.json to HTML. Do not guess.**
|
|
742
|
+
**Claude handles only semantic decisions (tag selection, component separation, interactions). SCSS comes from figma-to-scss.js (Phase 4 blocking commands).**
|
|
743
|
+
|
|
744
|
+
### C0. Reuse Check (Before Writing Code)
|
|
745
|
+
|
|
746
|
+
```
|
|
747
|
+
Matching component in component-index.json?
|
|
748
|
+
✅ Import and customize via props — do not create a new one
|
|
749
|
+
❌ Never modify an existing component's internals or duplicate a 90%-similar one
|
|
750
|
+
```
|
|
751
|
+
|
|
752
|
+
### C1. Image vs HTML Determination (BLOCKING)
|
|
753
|
+
|
|
754
|
+
```
|
|
755
|
+
⛔ Before writing code: write the determination table first.
|
|
756
|
+
|
|
757
|
+
YES on any one → HTML:
|
|
758
|
+
Q1. TEXT children? · Q2. repeating INSTANCE? (→ v-for, inner assets only as <img>)
|
|
759
|
+
Q3. interactive? (btn, CTA → <button>) · Q4. dynamic data? (price, quantity, duration)
|
|
760
|
+
All NO → image rendering is acceptable
|
|
761
|
+
|
|
762
|
+
⛔ Design text (Q1 exception — must be image; D1–D5, same as Extract Mode E3):
|
|
763
|
+
D1. 2+ fills · D2. effects (DROP_SHADOW, stroke) · D3. GRADIENT fill
|
|
764
|
+
D4. parent GROUP/FRAME has 3+ VECTORs · D5. fontFamily not in project web fonts
|
|
765
|
+
→ <img src="content/{section}-{name}.webp" alt="text content"> — no CSS text attempt
|
|
766
|
+
|
|
767
|
+
BG frames: ❌ no <img> tags — parent SCSS background-image only
|
|
768
|
+
.section { background-image: url('bg.webp'); background-size: cover; }
|
|
769
|
+
```
|
|
770
|
+
|
|
771
|
+
### C2. Node → HTML Mapping (Mechanical)
|
|
772
|
+
|
|
773
|
+
```
|
|
774
|
+
FRAME + Auto Layout → <div> + flex (direction/gap/padding directly mapped)
|
|
775
|
+
FRAME + no Auto Layout → <div> + position:relative (children absolute)
|
|
776
|
+
TEXT → <span> (Claude promotes to h2/p/button)
|
|
777
|
+
IMAGE fill (passed determination) → <img>
|
|
778
|
+
VECTOR/GROUP ≤64px → icon <img>
|
|
779
|
+
INSTANCE repeated 2+ → v-for / .map()
|
|
780
|
+
Size 0px, VECTOR ≤2px → skip
|
|
781
|
+
```
|
|
782
|
+
|
|
783
|
+
CSS property mapping reference (grounding for figma-to-scss.js output review, plus legacy vw/responsive rules): `rubrics/css-mapping.md` — Phase 4 forbids hand-writing these values.
|
|
784
|
+
|
|
785
|
+
### C3. Claude Semantic Decisions (The Only Inference Area)
|
|
786
|
+
|
|
787
|
+
```
|
|
788
|
+
1. Tag promotion: <span> → <h2> (section title) / <p> (description) / <button> (clickable)
|
|
789
|
+
2. Component separation: 1st-depth children = sections, INSTANCE repetition = shared
|
|
790
|
+
3. Interactions: @click handlers, state variables, conditional rendering
|
|
791
|
+
4. Accessibility: decorative → alt="" aria-hidden="true" · content → alt="description"
|
|
792
|
+
· interactive → role, aria-label
|
|
793
|
+
5. Semantic HTML: top-level <section>, heading order h1~h6, lists <ul>/<ol>
|
|
794
|
+
```
|
|
795
|
+
|
|
796
|
+
Component skeleton template: `templates/component.md`.
|
|
797
|
+
|
|
798
|
+
### C4. SCSS File Structure
|
|
799
|
+
|
|
800
|
+
```
|
|
801
|
+
layout/ → position, display, flex, width, height, padding, gap, overflow, z-index
|
|
802
|
+
components/ → font, color, border, shadow, opacity, background
|
|
803
|
+
_base.scss → .{feature} { width: 100%; max-width: 720px; margin: 0 auto; overflow-x: hidden; }
|
|
804
|
+
_tokens.scss → reference existing tokens (@use); if no mapping, create a new
|
|
805
|
+
feature-scoped token ($feature-color-xxx)
|
|
806
|
+
```
|
|
807
|
+
|
|
808
|
+
### C5. Self-Validation
|
|
809
|
+
|
|
810
|
+
```
|
|
811
|
+
⛔ Any failure → rewrite that section's code (do not proceed to the next section)
|
|
812
|
+
|
|
813
|
+
1. All template classes defined in SCSS · 2. Image src files actually exist
|
|
814
|
+
3. Auto Layout node → flex present in SCSS
|
|
815
|
+
4. ⛔ No @function/@mixin defined in SCSS (existing token @use is allowed)
|
|
816
|
+
5. ⛔ Every SCSS property grounded in sections.json css object
|
|
817
|
+
(aspect-ratio, container queries, etc. not in the tree → FAIL)
|
|
818
|
+
6. ⛔ Image filenames kebab-case (hash filenames like 68ad470b.webp → FAIL)
|
|
819
|
+
```
|
|
820
|
+
|
|
821
|
+
---
|
|
822
|
+
|
|
823
|
+
## Error Recovery
|
|
824
|
+
|
|
825
|
+
| Failure | Recovery |
|
|
826
|
+
|---------|----------|
|
|
827
|
+
| figma-extract.js script error | Node.js >=18? API token in config? Retry once. |
|
|
828
|
+
| Figma API 401 | Prompt user to set FIGMA_ACCESS_TOKEN in env or ~/.vibe/config.json |
|
|
829
|
+
| Figma API 404 | Verify fileKey from URL; check file is shared/accessible |
|
|
830
|
+
| Figma API 429 (rate limit) | Wait 60s, retry with reduced node scope (single page) |
|
|
831
|
+
| API timeout on large file | Split request by page via nodeId parameter |
|
|
832
|
+
| Screenshot download failure | Proceed with tree.json only (visual verification → manual) |
|
|
833
|
+
| tree.json missing in Phase 4 | Run Extract Mode (Phase 2) first |
|
|
834
|
+
| component-index.json missing | Generate minimal index from tree.json section names |
|
|
835
|
+
| sections.json malformed | Regenerate from tree.json via figma-refine.js |
|
|
836
|
+
| SCSS output empty | Check sections.json for valid style nodes; else default reset styles |
|
|
837
|
+
| figma-to-scss.js parse failure | Validate tree.json structure; if malformed, re-run Extract Mode |
|
|
838
|
+
| figma-validate.js comparison failure | Skip automated validation; screenshot side-by-side manual review |
|
|
839
|
+
| Puppeteer/CDP not available | Skip visual verification; manual browser check |
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: parallel-research
|
|
2
|
+
name: vibe.parallel-research
|
|
3
3
|
user-invocable: false
|
|
4
4
|
invocation: [auto]
|
|
5
5
|
tier: standard
|
|
6
6
|
description: "Parallel research with 4 specialized agents (best-practices, framework-docs, codebase-patterns, security-advisory) running simultaneously. Use when facing unfamiliar technology, choosing between libraries/frameworks, designing architecture for a new feature, or investigating security implications. Must use this skill when user asks 'how should we build X', 'which library for Y', or when starting work on a complex feature with unknown requirements. Not for simple lookups — use web search directly for those."
|
|
7
7
|
triggers: [parallel research, complex feature, technology selection, architecture design, security critical]
|
|
8
8
|
priority: 60
|
|
9
|
-
chain-next: [
|
|
9
|
+
chain-next: [vibe.run]
|
|
10
10
|
---
|
|
11
11
|
# Parallel Research
|
|
12
12
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: presentation
|
|
2
|
+
name: vibe.presentation
|
|
3
3
|
invocation: [auto]
|
|
4
4
|
tier: optional
|
|
5
5
|
description: "소스 데이터(리서치/문서/지식그래프)를 16:9 HTML 슬라이드덱으로 생성한다. 디자인 시스템(타이포·색·그리드·1슬라이드1메시지)을 통째로 적용해 전문가 수준 결과를 뽑고, 1920×1080 PDF 로 발행한다. 사용자가 '슬라이드/PPT/프레젠테이션/덱 만들어줘' 라고 하면 이 스킬을 쓴다. 17종 스타일 프리셋은 references/style-presets.md 에서 style= 로 선택."
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: prioritization
|
|
2
|
+
name: vibe.prioritization
|
|
3
3
|
invocation: [auto, chain]
|
|
4
4
|
tier: standard
|
|
5
5
|
description: "Reference guide to 9 prioritization frameworks with formulas, when-to-use guidance, and templates — RICE, ICE, Kano, MoSCoW, Opportunity Score, and more."
|
|
6
6
|
triggers: [prioritize, prioritization, rice, ice, kano, moscow, opportunity score]
|
|
7
7
|
priority: 50
|
|
8
|
-
chain-next: [create-prd]
|
|
8
|
+
chain-next: [vibe.create-prd]
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
# Prioritization Frameworks Reference
|