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