@su-record/vibe 2.8.52 → 2.8.53
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 +37 -37
- package/CLAUDE.md +169 -169
- package/LICENSE +21 -21
- package/agents/architect-low.md +41 -41
- package/agents/architect-medium.md +59 -59
- package/agents/architect.md +80 -80
- package/agents/build-error-resolver.md +115 -115
- package/agents/compounder.md +261 -261
- package/agents/diagrammer.md +178 -178
- package/agents/docs/api-documenter.md +99 -99
- package/agents/docs/changelog-writer.md +93 -93
- package/agents/e2e-tester.md +294 -294
- package/agents/event/event-comms.md +78 -78
- package/agents/event/event-content.md +68 -68
- package/agents/event/event-image.md +95 -95
- package/agents/event/event-ops.md +84 -84
- package/agents/event/event-scheduler.md +69 -69
- package/agents/event/event-speaker.md +86 -86
- package/agents/explorer-low.md +42 -42
- package/agents/explorer-medium.md +59 -59
- package/agents/explorer.md +48 -48
- package/agents/implementer-low.md +43 -43
- package/agents/implementer-medium.md +52 -52
- package/agents/implementer.md +54 -54
- package/agents/junior-mentor.md +141 -141
- package/agents/planning/requirements-analyst.md +84 -84
- package/agents/planning/ux-advisor.md +83 -83
- package/agents/qa/acceptance-tester.md +86 -86
- package/agents/qa/edge-case-finder.md +93 -93
- package/agents/qa/qa-coordinator.md +131 -131
- package/agents/refactor-cleaner.md +143 -143
- package/agents/research/best-practices-agent.md +199 -199
- package/agents/research/codebase-patterns-agent.md +157 -157
- package/agents/research/framework-docs-agent.md +188 -188
- package/agents/research/security-advisory-agent.md +213 -213
- package/agents/review/architecture-reviewer.md +107 -107
- package/agents/review/complexity-reviewer.md +116 -116
- package/agents/review/data-integrity-reviewer.md +88 -88
- package/agents/review/git-history-reviewer.md +103 -103
- package/agents/review/performance-reviewer.md +86 -86
- package/agents/review/python-reviewer.md +150 -150
- package/agents/review/rails-reviewer.md +139 -139
- package/agents/review/react-reviewer.md +144 -144
- package/agents/review/security-reviewer.md +80 -80
- package/agents/review/simplicity-reviewer.md +140 -140
- package/agents/review/test-coverage-reviewer.md +116 -116
- package/agents/review/typescript-reviewer.md +127 -127
- package/agents/searcher.md +54 -54
- package/agents/simplifier.md +120 -120
- package/agents/tester.md +49 -49
- package/agents/ui/ui-a11y-auditor.md +93 -93
- package/agents/ui/ui-antipattern-detector.md +102 -102
- package/agents/ui/ui-dataviz-advisor.md +69 -69
- package/agents/ui/ui-design-system-gen.md +57 -57
- package/agents/ui/ui-industry-analyzer.md +49 -49
- package/agents/ui/ui-layout-architect.md +65 -65
- package/agents/ui/ui-stack-implementer.md +68 -68
- package/agents/ui/ux-compliance-reviewer.md +81 -81
- package/agents/ui-previewer.md +258 -258
- package/commands/vibe.analyze.md +379 -379
- package/commands/vibe.docs.md +32 -32
- package/commands/vibe.event.md +163 -163
- package/commands/vibe.figma.md +69 -69
- package/commands/vibe.review.md +686 -686
- package/commands/vibe.run.md +2276 -2276
- package/commands/vibe.spec.md +1195 -1195
- package/commands/vibe.spec.review.md +609 -609
- package/commands/vibe.trace.md +259 -259
- package/commands/vibe.utils.md +413 -413
- package/commands/vibe.verify.md +510 -510
- package/dist/cli/collaborator.js +52 -52
- package/dist/cli/commands/config.js +9 -9
- package/dist/cli/commands/evolution.js +12 -12
- package/dist/cli/commands/figma.js +20 -20
- package/dist/cli/commands/info.js +53 -53
- package/dist/cli/commands/init.js +5 -5
- package/dist/cli/commands/remove.js +14 -14
- package/dist/cli/commands/sentinel.js +27 -27
- package/dist/cli/commands/skills.js +5 -5
- package/dist/cli/commands/slack.js +10 -10
- package/dist/cli/commands/stats.js +6 -6
- package/dist/cli/commands/telegram.js +12 -12
- package/dist/cli/detect.js +32 -32
- package/dist/cli/index.js +51 -51
- package/dist/cli/llm/claude-commands.js +16 -16
- package/dist/cli/llm/config.js +18 -18
- package/dist/cli/llm/gemini-commands.js +16 -16
- package/dist/cli/llm/gpt-commands.js +19 -19
- package/dist/cli/llm/help.js +21 -21
- package/dist/cli/postinstall/cursor-agents.js +32 -32
- package/dist/cli/postinstall/cursor-rules.js +83 -83
- package/dist/cli/postinstall/cursor-skills.js +743 -743
- package/dist/cli/setup/Provisioner.js +42 -42
- package/dist/infra/lib/DeepInit.js +24 -24
- package/dist/infra/lib/IterationTracker.js +11 -11
- package/dist/infra/lib/PythonParser.js +108 -108
- package/dist/infra/lib/ReviewRace.js +96 -96
- package/dist/infra/lib/SkillFrontmatter.js +28 -28
- package/dist/infra/lib/SkillQualityGate.js +9 -9
- package/dist/infra/lib/SkillRepository.js +159 -159
- package/dist/infra/lib/TokenBudgetTracker.d.ts +13 -0
- package/dist/infra/lib/TokenBudgetTracker.d.ts.map +1 -1
- package/dist/infra/lib/TokenBudgetTracker.js +44 -3
- package/dist/infra/lib/TokenBudgetTracker.js.map +1 -1
- package/dist/infra/lib/UltraQA.js +99 -99
- package/dist/infra/lib/autonomy/AuditStore.js +41 -41
- package/dist/infra/lib/autonomy/ConfirmationStore.js +30 -30
- package/dist/infra/lib/autonomy/EventOutbox.js +38 -38
- package/dist/infra/lib/autonomy/PolicyEngine.d.ts +3 -3
- package/dist/infra/lib/autonomy/PolicyEngine.js +18 -18
- package/dist/infra/lib/autonomy/SecuritySentinel.js +1 -1
- package/dist/infra/lib/autonomy/SuggestionStore.js +33 -33
- package/dist/infra/lib/embedding/VectorStore.js +22 -22
- package/dist/infra/lib/evolution/AgentAnalyzer.js +10 -10
- package/dist/infra/lib/evolution/DescriptionOptimizer.js +21 -21
- package/dist/infra/lib/evolution/GenerationRegistry.js +36 -36
- package/dist/infra/lib/evolution/InsightStore.js +90 -90
- package/dist/infra/lib/evolution/ParityTester.js +57 -57
- package/dist/infra/lib/evolution/RollbackManager.js +5 -5
- package/dist/infra/lib/evolution/SkillBenchmark.js +23 -23
- package/dist/infra/lib/evolution/SkillEvalRunner.js +50 -50
- package/dist/infra/lib/evolution/SkillGapDetector.js +10 -10
- package/dist/infra/lib/evolution/UsageTracker.js +28 -28
- package/dist/infra/lib/gemini/orchestration.js +5 -5
- package/dist/infra/lib/gpt/orchestration.js +4 -4
- package/dist/infra/lib/memory/KnowledgeGraph.js +4 -4
- package/dist/infra/lib/memory/MemorySearch.js +57 -57
- package/dist/infra/lib/memory/MemoryStorage.js +181 -181
- package/dist/infra/lib/memory/ObservationStore.js +28 -28
- package/dist/infra/lib/memory/ReflectionStore.js +30 -30
- package/dist/infra/lib/memory/SessionRAGRetriever.js +7 -7
- package/dist/infra/lib/memory/SessionRAGStore.js +225 -225
- package/dist/infra/lib/memory/SessionSummarizer.js +9 -9
- package/dist/infra/orchestrator/AgentManager.js +12 -12
- package/dist/infra/orchestrator/AgentRegistry.js +65 -65
- package/dist/infra/orchestrator/MultiLlmResearch.js +8 -8
- package/dist/infra/orchestrator/SwarmOrchestrator.test.js +16 -16
- package/dist/infra/orchestrator/parallelResearch.js +24 -24
- package/dist/tools/convention/analyzeComplexity.test.js +115 -115
- package/dist/tools/convention/validateCodeQuality.test.js +104 -104
- package/dist/tools/memory/createMemoryTimeline.js +10 -10
- package/dist/tools/memory/getMemoryGraph.js +12 -12
- package/dist/tools/memory/getSessionContext.js +9 -9
- package/dist/tools/memory/linkMemories.js +14 -14
- package/dist/tools/memory/listMemories.js +4 -4
- package/dist/tools/memory/recallMemory.js +4 -4
- package/dist/tools/memory/saveMemory.js +4 -4
- package/dist/tools/memory/searchMemoriesAdvanced.js +23 -23
- package/dist/tools/semantic/analyzeDependencyGraph.js +12 -12
- package/dist/tools/semantic/astGrep.test.js +6 -6
- package/dist/tools/spec/prdParser.test.js +171 -171
- package/dist/tools/spec/specGenerator.js +169 -169
- package/dist/tools/spec/traceabilityMatrix.js +64 -64
- package/dist/tools/spec/traceabilityMatrix.test.js +28 -28
- package/hooks/gemini-hooks.json +73 -73
- package/hooks/hooks.json +174 -174
- package/hooks/scripts/__tests__/keyword-detector.test.js +199 -199
- package/hooks/scripts/__tests__/pre-tool-guard.test.js +286 -286
- package/hooks/scripts/__tests__/sentinel-guard.test.js +210 -210
- package/hooks/scripts/auto-commit.js +97 -97
- package/hooks/scripts/auto-format.js +64 -64
- package/hooks/scripts/auto-test.js +81 -81
- package/hooks/scripts/code-check.js +268 -268
- package/hooks/scripts/codex-detect.js +46 -46
- package/hooks/scripts/codex-review-gate.js +80 -80
- package/hooks/scripts/command-log.js +32 -32
- package/hooks/scripts/context-save.js +353 -353
- package/hooks/scripts/evolution-engine.js +91 -91
- package/hooks/scripts/figma-extract.js +635 -477
- package/hooks/scripts/hud-status.js +321 -321
- package/hooks/scripts/keyword-detector.js +214 -214
- package/hooks/scripts/llm-orchestrate.js +572 -572
- package/hooks/scripts/post-edit.js +32 -32
- package/hooks/scripts/pr-test-gate.js +52 -52
- package/hooks/scripts/pre-tool-guard.js +214 -159
- package/hooks/scripts/prompt-dispatcher.js +185 -185
- package/hooks/scripts/sentinel-guard.js +131 -131
- package/hooks/scripts/session-start.js +177 -177
- package/hooks/scripts/skill-injector.js +83 -83
- package/hooks/scripts/stop-notify.js +209 -209
- package/hooks/scripts/utils.js +243 -243
- package/languages/csharp-unity.md +515 -515
- package/languages/gdscript-godot.md +470 -470
- package/languages/ruby-rails.md +489 -489
- package/languages/typescript-angular.md +433 -433
- package/languages/typescript-astro.md +416 -416
- package/languages/typescript-electron.md +406 -406
- package/languages/typescript-nestjs.md +524 -524
- package/languages/typescript-svelte.md +407 -407
- package/languages/typescript-tauri.md +365 -365
- package/package.json +101 -101
- package/skills/agents-md/SKILL.md +121 -121
- package/skills/agents-md/rubrics/what-to-keep.md +49 -49
- package/skills/agents-md/templates/agents-md.md +36 -36
- package/skills/arch-guard/SKILL.md +181 -181
- package/skills/arch-guard/agents/detector.md +48 -48
- package/skills/arch-guard/agents/reporter.md +48 -48
- package/skills/arch-guard/agents/rule-generator.md +49 -49
- package/skills/arch-guard/agents/violation-checker.md +51 -51
- package/skills/arch-guard/frameworks/clean-architecture.md +108 -108
- package/skills/arch-guard/frameworks/solid.md +102 -102
- package/skills/arch-guard/scripts/check-boundaries.js +90 -90
- package/skills/arch-guard/templates/arch-rules.json +47 -47
- package/skills/arch-guard/templates/violation-report.md +53 -53
- package/skills/brand-assets/SKILL.md +147 -147
- package/skills/brand-assets/rubrics/asset-checklist.md +98 -98
- package/skills/brand-assets/templates/brand-guide.md +161 -161
- package/skills/capability-loop/SKILL.md +168 -168
- package/skills/capability-loop/agents/capability-designer.md +61 -61
- package/skills/capability-loop/agents/failure-analyst.md +55 -55
- package/skills/capability-loop/agents/implementer.md +50 -50
- package/skills/capability-loop/agents/tester.md +53 -53
- package/skills/capability-loop/templates/capability-spec.md +118 -118
- package/skills/capability-loop/templates/failure-analysis.md +118 -118
- package/skills/characterization-test/SKILL.md +207 -207
- package/skills/characterization-test/agents/behavior-capturer.md +50 -50
- package/skills/characterization-test/agents/coverage-checker.md +54 -54
- package/skills/characterization-test/agents/reporter.md +50 -50
- package/skills/characterization-test/agents/test-writer.md +49 -49
- package/skills/characterization-test/rubrics/coverage-criteria.md +53 -53
- package/skills/characterization-test/templates/test-template.ts +101 -101
- package/skills/chub-usage/SKILL.md +139 -139
- package/skills/claude-md-guide/SKILL.md +351 -351
- package/skills/claude-md-guide/rubrics/anti-patterns.md +88 -88
- package/skills/claude-md-guide/templates/claude-md.md +54 -54
- package/skills/commerce-patterns/SKILL.md +64 -64
- package/skills/commerce-patterns/rubrics/checkout-flow.md +48 -48
- package/skills/commerce-patterns/templates/product-schema.md +85 -85
- package/skills/commit-push-pr/SKILL.md +77 -77
- package/skills/commit-push-pr/agents/change-analyzer.md +55 -55
- package/skills/commit-push-pr/agents/message-writer.md +50 -50
- package/skills/commit-push-pr/agents/pr-writer.md +58 -58
- package/skills/commit-push-pr/agents/reviewer.md +52 -52
- package/skills/commit-push-pr/rubrics/commit-message.md +73 -73
- package/skills/commit-push-pr/templates/pr-body.md +63 -63
- package/skills/context7-usage/SKILL.md +106 -106
- package/skills/context7-usage/rubrics/when-to-use.md +50 -50
- package/skills/create-prd/SKILL.md +90 -90
- package/skills/create-prd/agents/edge-case-finder.md +48 -48
- package/skills/create-prd/agents/prioritizer.md +60 -60
- package/skills/create-prd/agents/requirements-writer.md +48 -48
- package/skills/create-prd/agents/researcher.md +55 -55
- package/skills/create-prd/agents/reviewer.md +54 -54
- package/skills/create-prd/frameworks/jobs-to-be-done.md +96 -96
- package/skills/create-prd/frameworks/rice-scoring.md +97 -97
- package/skills/create-prd/orchestrator.md +70 -70
- package/skills/create-prd/rubrics/completeness.md +58 -58
- package/skills/create-prd/templates/prd.md +139 -139
- package/skills/design-audit/SKILL.md +152 -152
- package/skills/design-audit/agents/a11y-auditor.md +43 -43
- package/skills/design-audit/agents/performance-auditor.md +46 -46
- package/skills/design-audit/agents/responsive-auditor.md +46 -46
- package/skills/design-audit/agents/scorer.md +47 -47
- package/skills/design-audit/agents/slop-detector.md +47 -47
- package/skills/design-audit/frameworks/core-web-vitals.md +107 -107
- package/skills/design-audit/frameworks/wcag-checklist.md +64 -64
- package/skills/design-audit/orchestrator.md +64 -64
- package/skills/design-audit/rubrics/ai-slop-patterns.md +83 -83
- package/skills/design-audit/rubrics/scoring.md +63 -63
- package/skills/design-audit/templates/report.md +88 -88
- package/skills/design-critique/SKILL.md +139 -139
- package/skills/design-critique/rubrics/ux-heuristics.md +143 -143
- package/skills/design-critique/templates/critique-report.md +86 -86
- package/skills/design-distill/SKILL.md +130 -130
- package/skills/design-distill/templates/design-system.md +132 -132
- package/skills/design-normalize/SKILL.md +133 -133
- package/skills/design-normalize/rubrics/token-naming.md +117 -117
- package/skills/design-normalize/templates/token-audit.md +89 -89
- package/skills/design-polish/SKILL.md +131 -131
- package/skills/design-polish/rubrics/polish-checklist.md +68 -68
- package/skills/design-polish/templates/polish-report.md +64 -64
- package/skills/design-teach/SKILL.md +182 -182
- package/skills/design-teach/rubrics/brand-personality.md +73 -73
- package/skills/design-teach/templates/design-context.json +36 -36
- package/skills/e2e-commerce/SKILL.md +62 -62
- package/skills/e2e-commerce/templates/test-scenarios.md +170 -170
- package/skills/event-comms/SKILL.md +162 -162
- package/skills/event-comms/templates/email-invite.md +99 -99
- package/skills/event-comms/templates/sns-post.md +133 -133
- package/skills/event-ops/SKILL.md +198 -198
- package/skills/event-ops/rubrics/contingency.md +85 -85
- package/skills/event-ops/templates/d-day-checklist.md +65 -65
- package/skills/event-planning/SKILL.md +132 -132
- package/skills/event-planning/rubrics/timeline.md +70 -70
- package/skills/event-planning/templates/event-plan.md +91 -91
- package/skills/exec-plan/SKILL.md +149 -149
- package/skills/exec-plan/agents/decomposer.md +47 -47
- package/skills/exec-plan/agents/dependency-mapper.md +44 -44
- package/skills/exec-plan/agents/estimator.md +43 -43
- package/skills/exec-plan/agents/validator.md +55 -55
- package/skills/exec-plan/orchestrator.md +70 -70
- package/skills/exec-plan/rubrics/complexity-scoring.md +75 -75
- package/skills/exec-plan/templates/plan.md +147 -147
- package/skills/git-worktree/SKILL.md +73 -73
- package/skills/git-worktree/rubrics/when-to-use.md +55 -55
- package/skills/handoff/SKILL.md +110 -110
- package/skills/handoff/agents/context-summarizer.md +51 -51
- package/skills/handoff/agents/document-writer.md +63 -63
- package/skills/handoff/agents/state-collector.md +53 -53
- package/skills/handoff/agents/verifier.md +48 -48
- package/skills/handoff/rubrics/completeness.md +62 -62
- package/skills/handoff/templates/handoff.md +107 -107
- package/skills/parallel-research/SKILL.md +89 -89
- package/skills/parallel-research/agents/best-practices.md +43 -43
- package/skills/parallel-research/agents/codebase-patterns.md +46 -46
- package/skills/parallel-research/agents/framework-docs.md +45 -45
- package/skills/parallel-research/agents/security-advisory.md +46 -46
- package/skills/parallel-research/agents/synthesizer.md +52 -52
- package/skills/parallel-research/experts/best-practices.md +50 -50
- package/skills/parallel-research/experts/codebase-patterns.md +70 -70
- package/skills/parallel-research/experts/framework-docs.md +65 -65
- package/skills/parallel-research/experts/security-advisory.md +69 -69
- package/skills/parallel-research/orchestrator.md +65 -65
- package/skills/parallel-research/templates/synthesis.md +101 -101
- package/skills/prioritization-frameworks/SKILL.md +87 -87
- package/skills/prioritization-frameworks/rubrics/frameworks.md +79 -79
- package/skills/prioritization-frameworks/templates/scoring-matrix.md +69 -69
- package/skills/priority-todos/SKILL.md +64 -64
- package/skills/priority-todos/rubrics/prioritization.md +70 -70
- package/skills/priority-todos/templates/todo-board.md +59 -59
- package/skills/seo-checklist/SKILL.md +58 -58
- package/skills/seo-checklist/frameworks/structured-data.md +153 -153
- package/skills/seo-checklist/rubrics/content-seo.md +42 -42
- package/skills/seo-checklist/rubrics/technical-seo.md +48 -48
- package/skills/techdebt/SKILL.md +124 -124
- package/skills/techdebt/agents/analyzer.md +50 -50
- package/skills/techdebt/agents/fixer.md +41 -41
- package/skills/techdebt/agents/reviewer.md +47 -47
- package/skills/techdebt/agents/scanner.md +44 -44
- package/skills/techdebt/orchestrator.md +70 -70
- package/skills/techdebt/rubrics/severity.md +51 -51
- package/skills/techdebt/scripts/scan.js +90 -90
- package/skills/techdebt/templates/report.md +86 -86
- package/skills/tool-fallback/SKILL.md +104 -104
- package/skills/tool-fallback/rubrics/fallback-chain.md +58 -58
- package/skills/typescript-advanced-types/SKILL.md +67 -67
- package/skills/typescript-advanced-types/rubrics/type-patterns.md +109 -109
- package/skills/ui-ux-pro-max/SKILL.md +236 -236
- package/skills/ui-ux-pro-max/reference/color-and-contrast.md +517 -517
- package/skills/ui-ux-pro-max/reference/interaction-design.md +544 -544
- package/skills/ui-ux-pro-max/reference/motion-design.md +591 -591
- package/skills/ui-ux-pro-max/reference/responsive-design.md +463 -463
- package/skills/ui-ux-pro-max/reference/spatial-design.md +390 -390
- package/skills/ui-ux-pro-max/reference/typography.md +455 -455
- package/skills/ui-ux-pro-max/reference/ux-writing.md +469 -469
- package/skills/ui-ux-pro-max/rubrics/interaction-states.md +83 -83
- package/skills/ui-ux-pro-max/rubrics/responsive-breakpoints.md +99 -99
- package/skills/user-personas/SKILL.md +75 -75
- package/skills/user-personas/rubrics/research-methods.md +56 -56
- package/skills/user-personas/templates/persona.md +89 -89
- package/skills/vercel-react-best-practices/SKILL.md +60 -60
- package/skills/vercel-react-best-practices/rubrics/performance.md +82 -82
- package/skills/vercel-react-best-practices/rubrics/server-components.md +86 -86
- package/skills/vibe.docs/SKILL.md +171 -171
- package/skills/vibe.docs/templates/architecture.md +80 -80
- package/skills/vibe.docs/templates/readme.md +84 -84
- package/skills/vibe.docs/templates/release-notes.md +74 -74
- package/skills/vibe.figma/SKILL.md +215 -982
- package/skills/vibe.figma/rubrics/extraction-checklist.md +51 -51
- package/skills/vibe.figma/templates/component-index.md +126 -126
- package/skills/vibe.figma/templates/figma-handoff.md +100 -100
- package/skills/vibe.figma/templates/remapped-tree.md +277 -277
- package/skills/vibe.figma.convert/SKILL.md +188 -511
- package/skills/vibe.figma.convert/rubrics/conversion-rules.md +129 -113
- package/skills/vibe.figma.convert/templates/component.md +140 -140
- package/skills/vibe.figma.extract/SKILL.md +179 -300
- package/skills/vibe.figma.extract/rubrics/image-rules.md +145 -137
- package/skills/video-production/SKILL.md +52 -52
- package/skills/video-production/rubrics/quality-checklist.md +58 -58
- package/skills/video-production/templates/production-plan.md +104 -104
- package/vibe/config.json +29 -29
- package/vibe/constitution.md +227 -227
- package/vibe/rules/principles/communication-guide.md +98 -98
- package/vibe/rules/principles/development-philosophy.md +52 -52
- package/vibe/rules/principles/quick-start.md +102 -102
- package/vibe/rules/quality/bdd-contract-testing.md +393 -393
- package/vibe/rules/quality/checklist.md +276 -276
- package/vibe/rules/quality/performance.md +236 -236
- package/vibe/rules/quality/testing-strategy.md +440 -440
- package/vibe/rules/standards/anti-patterns.md +541 -541
- package/vibe/rules/standards/code-structure.md +291 -291
- package/vibe/rules/standards/complexity-metrics.md +313 -313
- package/vibe/rules/standards/git-workflow.md +237 -237
- package/vibe/rules/standards/naming-conventions.md +198 -198
- package/vibe/rules/standards/security.md +305 -305
- package/vibe/rules/writing/document-style.md +74 -74
- package/vibe/setup.sh +31 -31
- package/vibe/templates/constitution-template.md +252 -252
- package/vibe/templates/contract-backend-template.md +526 -526
- package/vibe/templates/contract-frontend-template.md +599 -599
- package/vibe/templates/feature-template.md +96 -96
- package/vibe/templates/spec-template.md +221 -221
- package/vibe/ui-ux-data/charts.csv +26 -26
- package/vibe/ui-ux-data/colors.csv +97 -97
- package/vibe/ui-ux-data/icons.csv +101 -101
- package/vibe/ui-ux-data/landing.csv +31 -31
- package/vibe/ui-ux-data/products.csv +96 -96
- package/vibe/ui-ux-data/react-performance.csv +45 -45
- package/vibe/ui-ux-data/stacks/astro.csv +54 -54
- package/vibe/ui-ux-data/stacks/flutter.csv +53 -53
- package/vibe/ui-ux-data/stacks/html-tailwind.csv +56 -56
- package/vibe/ui-ux-data/stacks/jetpack-compose.csv +53 -53
- package/vibe/ui-ux-data/stacks/nextjs.csv +53 -53
- package/vibe/ui-ux-data/stacks/nuxt-ui.csv +51 -51
- package/vibe/ui-ux-data/stacks/nuxtjs.csv +59 -59
- package/vibe/ui-ux-data/stacks/react-native.csv +52 -52
- package/vibe/ui-ux-data/stacks/react.csv +54 -54
- package/vibe/ui-ux-data/stacks/shadcn.csv +61 -61
- package/vibe/ui-ux-data/stacks/svelte.csv +54 -54
- package/vibe/ui-ux-data/stacks/swiftui.csv +51 -51
- package/vibe/ui-ux-data/stacks/vue.csv +50 -50
- package/vibe/ui-ux-data/styles.csv +68 -68
- package/vibe/ui-ux-data/typography.csv +57 -57
- package/vibe/ui-ux-data/ui-reasoning.csv +101 -101
- package/vibe/ui-ux-data/ux-guidelines.csv +99 -99
- package/vibe/ui-ux-data/version.json +31 -31
- package/vibe/ui-ux-data/web-interface.csv +31 -31
|
@@ -1,170 +1,170 @@
|
|
|
1
|
-
# E2E Commerce Test Scenario Template
|
|
2
|
-
|
|
3
|
-
## Setup
|
|
4
|
-
|
|
5
|
-
```typescript
|
|
6
|
-
// {{TEST_FILE}}.spec.ts
|
|
7
|
-
import { test, expect } from "@playwright/test";
|
|
8
|
-
import { setupServer } from "msw/node";
|
|
9
|
-
import { http, HttpResponse } from "msw";
|
|
10
|
-
|
|
11
|
-
// Seed test data once per suite — clean up in afterAll
|
|
12
|
-
test.beforeAll(async ({ request }) => {
|
|
13
|
-
await request.post("/api/test/seed", {
|
|
14
|
-
data: {
|
|
15
|
-
product: { id: "{{PRODUCT_ID}}", stock: 10, price: {{PRICE}} },
|
|
16
|
-
user: { email: "{{TEST_USER_EMAIL}}", password: "{{TEST_USER_PASSWORD}}" },
|
|
17
|
-
coupon: { code: "{{COUPON_CODE}}", type: "percentage", value: 10 },
|
|
18
|
-
},
|
|
19
|
-
});
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
test.afterAll(async ({ request }) => {
|
|
23
|
-
await request.post("/api/test/cleanup", { data: { scope: "{{TEST_SUITE_ID}}" } });
|
|
24
|
-
});
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
## P0 — Happy Path Checkout
|
|
28
|
-
|
|
29
|
-
```typescript
|
|
30
|
-
test("happy path: cart → checkout → payment → confirmation", async ({ page }) => {
|
|
31
|
-
// 1. Add to cart
|
|
32
|
-
await page.goto("/products/{{PRODUCT_SLUG}}");
|
|
33
|
-
await page.getByRole("button", { name: "Add to Cart" }).click();
|
|
34
|
-
await page.getByRole("link", { name: "View Cart" }).click();
|
|
35
|
-
|
|
36
|
-
// 2. Proceed to checkout
|
|
37
|
-
await expect(page.getByText("{{PRODUCT_NAME}}")).toBeVisible();
|
|
38
|
-
await page.getByRole("button", { name: "Checkout" }).click();
|
|
39
|
-
|
|
40
|
-
// 3. Fill shipping
|
|
41
|
-
await page.fill('[name="address"]', "{{TEST_ADDRESS}}");
|
|
42
|
-
await page.fill('[name="city"]', "{{TEST_CITY}}");
|
|
43
|
-
await page.getByRole("button", { name: "Continue to Payment" }).click();
|
|
44
|
-
|
|
45
|
-
// 4. Pay (use PG sandbox card)
|
|
46
|
-
await page.fill('[name="cardNumber"]', "{{SANDBOX_CARD_NUMBER}}");
|
|
47
|
-
await page.fill('[name="expiry"]', "{{SANDBOX_CARD_EXPIRY}}");
|
|
48
|
-
await page.fill('[name="cvv"]', "{{SANDBOX_CARD_CVV}}");
|
|
49
|
-
await page.getByRole("button", { name: "Place Order" }).click();
|
|
50
|
-
|
|
51
|
-
// 5. Confirm — verify order status text, not just URL
|
|
52
|
-
await page.waitForURL("**/order-confirmation/**");
|
|
53
|
-
await expect(page.getByText("Order Confirmed")).toBeVisible();
|
|
54
|
-
await expect(page.getByTestId("order-id")).not.toBeEmpty();
|
|
55
|
-
});
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
## P0 — Payment Failure + Stock Release
|
|
59
|
-
|
|
60
|
-
```typescript
|
|
61
|
-
test("payment failure releases reserved stock", async ({ page, request }) => {
|
|
62
|
-
const stockBefore = await request
|
|
63
|
-
.get("/api/products/{{PRODUCT_ID}}/stock")
|
|
64
|
-
.then((r) => r.json());
|
|
65
|
-
|
|
66
|
-
await page.goto("/products/{{PRODUCT_SLUG}}");
|
|
67
|
-
await page.getByRole("button", { name: "Add to Cart" }).click();
|
|
68
|
-
await page.goto("/checkout");
|
|
69
|
-
await page.fill('[name="cardNumber"]', "4000000000000002"); // Decline card
|
|
70
|
-
|
|
71
|
-
await page.getByRole("button", { name: "Place Order" }).click();
|
|
72
|
-
await expect(page.getByText(/payment failed|declined/i)).toBeVisible();
|
|
73
|
-
|
|
74
|
-
// Verify stock is released — not just error shown
|
|
75
|
-
const stockAfter = await request
|
|
76
|
-
.get("/api/products/{{PRODUCT_ID}}/stock")
|
|
77
|
-
.then((r) => r.json());
|
|
78
|
-
expect(stockAfter.available).toBe(stockBefore.available);
|
|
79
|
-
});
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
## P0 — Duplicate Payment Prevention
|
|
83
|
-
|
|
84
|
-
```typescript
|
|
85
|
-
test("double-click does not create duplicate order", async ({ page, request }) => {
|
|
86
|
-
await page.goto("/checkout?prefilled=true");
|
|
87
|
-
const submitBtn = page.getByRole("button", { name: "Place Order" });
|
|
88
|
-
|
|
89
|
-
// Simulate double-click simultaneously
|
|
90
|
-
await Promise.all([submitBtn.click(), submitBtn.click()]);
|
|
91
|
-
await page.waitForURL("**/order-confirmation/**");
|
|
92
|
-
|
|
93
|
-
const orderId = await page.getByTestId("order-id").textContent();
|
|
94
|
-
|
|
95
|
-
// Verify only one order was created via API
|
|
96
|
-
const orders = await request
|
|
97
|
-
.get(`/api/orders?reference={{TEST_IDEMPOTENCY_KEY}}`)
|
|
98
|
-
.then((r) => r.json());
|
|
99
|
-
expect(orders.total).toBe(1);
|
|
100
|
-
});
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
## P0 — Out-of-Stock Blocks Checkout
|
|
104
|
-
|
|
105
|
-
```typescript
|
|
106
|
-
test("out-of-stock product blocks checkout with clear message", async ({ page, request }) => {
|
|
107
|
-
// Deplete stock via test API
|
|
108
|
-
await request.post("/api/test/deplete-stock", { data: { productId: "{{PRODUCT_ID}}" } });
|
|
109
|
-
|
|
110
|
-
await page.goto("/checkout?prefilled=true");
|
|
111
|
-
await page.getByRole("button", { name: "Place Order" }).click();
|
|
112
|
-
|
|
113
|
-
await expect(page.getByText(/out of stock|unavailable/i)).toBeVisible();
|
|
114
|
-
await expect(page).not.toHaveURL("**/order-confirmation/**");
|
|
115
|
-
});
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
## P1 — Coupon Calculation
|
|
119
|
-
|
|
120
|
-
```typescript
|
|
121
|
-
test("percentage coupon applies correct discount", async ({ page }) => {
|
|
122
|
-
await page.goto("/cart");
|
|
123
|
-
await page.fill('[name="couponCode"]', "{{COUPON_CODE}}");
|
|
124
|
-
await page.getByRole("button", { name: "Apply" }).click();
|
|
125
|
-
|
|
126
|
-
const total = await page.getByTestId("cart-total").textContent();
|
|
127
|
-
// {{PRICE}} * (1 - 0.10) = expected total
|
|
128
|
-
await expect(page.getByTestId("discount-amount")).toContainText("{{EXPECTED_DISCOUNT}}");
|
|
129
|
-
});
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
## P1 — Cart Merge on Login
|
|
133
|
-
|
|
134
|
-
```typescript
|
|
135
|
-
test("guest cart merges into user cart on login", async ({ page }) => {
|
|
136
|
-
// Add item as guest
|
|
137
|
-
await page.goto("/products/{{PRODUCT_SLUG}}");
|
|
138
|
-
await page.getByRole("button", { name: "Add to Cart" }).click();
|
|
139
|
-
|
|
140
|
-
// Login
|
|
141
|
-
await page.goto("/login");
|
|
142
|
-
await page.fill('[name="email"]', "{{TEST_USER_EMAIL}}");
|
|
143
|
-
await page.fill('[name="password"]', "{{TEST_USER_PASSWORD}}");
|
|
144
|
-
await page.getByRole("button", { name: "Sign In" }).click();
|
|
145
|
-
|
|
146
|
-
// Guest cart item should appear in user cart
|
|
147
|
-
await page.goto("/cart");
|
|
148
|
-
await expect(page.getByText("{{PRODUCT_NAME}}")).toBeVisible();
|
|
149
|
-
});
|
|
150
|
-
```
|
|
151
|
-
|
|
152
|
-
## MSW Mock PG Server (CI)
|
|
153
|
-
|
|
154
|
-
```typescript
|
|
155
|
-
// mocks/pg-server.ts
|
|
156
|
-
export const pgHandlers = [
|
|
157
|
-
http.post("{{PG_ENDPOINT}}", async ({ request }) => {
|
|
158
|
-
const body = await request.json() as Record<string, unknown>;
|
|
159
|
-
const card = body.cardNumber as string;
|
|
160
|
-
|
|
161
|
-
if (card === "4000000000000002") {
|
|
162
|
-
return HttpResponse.json({ status: "FAILED", code: "CARD_DECLINED" }, { status: 400 });
|
|
163
|
-
}
|
|
164
|
-
return HttpResponse.json({
|
|
165
|
-
status: "APPROVED",
|
|
166
|
-
transactionId: `mock_${Date.now()}`,
|
|
167
|
-
});
|
|
168
|
-
}),
|
|
169
|
-
];
|
|
170
|
-
```
|
|
1
|
+
# E2E Commerce Test Scenario Template
|
|
2
|
+
|
|
3
|
+
## Setup
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
// {{TEST_FILE}}.spec.ts
|
|
7
|
+
import { test, expect } from "@playwright/test";
|
|
8
|
+
import { setupServer } from "msw/node";
|
|
9
|
+
import { http, HttpResponse } from "msw";
|
|
10
|
+
|
|
11
|
+
// Seed test data once per suite — clean up in afterAll
|
|
12
|
+
test.beforeAll(async ({ request }) => {
|
|
13
|
+
await request.post("/api/test/seed", {
|
|
14
|
+
data: {
|
|
15
|
+
product: { id: "{{PRODUCT_ID}}", stock: 10, price: {{PRICE}} },
|
|
16
|
+
user: { email: "{{TEST_USER_EMAIL}}", password: "{{TEST_USER_PASSWORD}}" },
|
|
17
|
+
coupon: { code: "{{COUPON_CODE}}", type: "percentage", value: 10 },
|
|
18
|
+
},
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
test.afterAll(async ({ request }) => {
|
|
23
|
+
await request.post("/api/test/cleanup", { data: { scope: "{{TEST_SUITE_ID}}" } });
|
|
24
|
+
});
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## P0 — Happy Path Checkout
|
|
28
|
+
|
|
29
|
+
```typescript
|
|
30
|
+
test("happy path: cart → checkout → payment → confirmation", async ({ page }) => {
|
|
31
|
+
// 1. Add to cart
|
|
32
|
+
await page.goto("/products/{{PRODUCT_SLUG}}");
|
|
33
|
+
await page.getByRole("button", { name: "Add to Cart" }).click();
|
|
34
|
+
await page.getByRole("link", { name: "View Cart" }).click();
|
|
35
|
+
|
|
36
|
+
// 2. Proceed to checkout
|
|
37
|
+
await expect(page.getByText("{{PRODUCT_NAME}}")).toBeVisible();
|
|
38
|
+
await page.getByRole("button", { name: "Checkout" }).click();
|
|
39
|
+
|
|
40
|
+
// 3. Fill shipping
|
|
41
|
+
await page.fill('[name="address"]', "{{TEST_ADDRESS}}");
|
|
42
|
+
await page.fill('[name="city"]', "{{TEST_CITY}}");
|
|
43
|
+
await page.getByRole("button", { name: "Continue to Payment" }).click();
|
|
44
|
+
|
|
45
|
+
// 4. Pay (use PG sandbox card)
|
|
46
|
+
await page.fill('[name="cardNumber"]', "{{SANDBOX_CARD_NUMBER}}");
|
|
47
|
+
await page.fill('[name="expiry"]', "{{SANDBOX_CARD_EXPIRY}}");
|
|
48
|
+
await page.fill('[name="cvv"]', "{{SANDBOX_CARD_CVV}}");
|
|
49
|
+
await page.getByRole("button", { name: "Place Order" }).click();
|
|
50
|
+
|
|
51
|
+
// 5. Confirm — verify order status text, not just URL
|
|
52
|
+
await page.waitForURL("**/order-confirmation/**");
|
|
53
|
+
await expect(page.getByText("Order Confirmed")).toBeVisible();
|
|
54
|
+
await expect(page.getByTestId("order-id")).not.toBeEmpty();
|
|
55
|
+
});
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## P0 — Payment Failure + Stock Release
|
|
59
|
+
|
|
60
|
+
```typescript
|
|
61
|
+
test("payment failure releases reserved stock", async ({ page, request }) => {
|
|
62
|
+
const stockBefore = await request
|
|
63
|
+
.get("/api/products/{{PRODUCT_ID}}/stock")
|
|
64
|
+
.then((r) => r.json());
|
|
65
|
+
|
|
66
|
+
await page.goto("/products/{{PRODUCT_SLUG}}");
|
|
67
|
+
await page.getByRole("button", { name: "Add to Cart" }).click();
|
|
68
|
+
await page.goto("/checkout");
|
|
69
|
+
await page.fill('[name="cardNumber"]', "4000000000000002"); // Decline card
|
|
70
|
+
|
|
71
|
+
await page.getByRole("button", { name: "Place Order" }).click();
|
|
72
|
+
await expect(page.getByText(/payment failed|declined/i)).toBeVisible();
|
|
73
|
+
|
|
74
|
+
// Verify stock is released — not just error shown
|
|
75
|
+
const stockAfter = await request
|
|
76
|
+
.get("/api/products/{{PRODUCT_ID}}/stock")
|
|
77
|
+
.then((r) => r.json());
|
|
78
|
+
expect(stockAfter.available).toBe(stockBefore.available);
|
|
79
|
+
});
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## P0 — Duplicate Payment Prevention
|
|
83
|
+
|
|
84
|
+
```typescript
|
|
85
|
+
test("double-click does not create duplicate order", async ({ page, request }) => {
|
|
86
|
+
await page.goto("/checkout?prefilled=true");
|
|
87
|
+
const submitBtn = page.getByRole("button", { name: "Place Order" });
|
|
88
|
+
|
|
89
|
+
// Simulate double-click simultaneously
|
|
90
|
+
await Promise.all([submitBtn.click(), submitBtn.click()]);
|
|
91
|
+
await page.waitForURL("**/order-confirmation/**");
|
|
92
|
+
|
|
93
|
+
const orderId = await page.getByTestId("order-id").textContent();
|
|
94
|
+
|
|
95
|
+
// Verify only one order was created via API
|
|
96
|
+
const orders = await request
|
|
97
|
+
.get(`/api/orders?reference={{TEST_IDEMPOTENCY_KEY}}`)
|
|
98
|
+
.then((r) => r.json());
|
|
99
|
+
expect(orders.total).toBe(1);
|
|
100
|
+
});
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## P0 — Out-of-Stock Blocks Checkout
|
|
104
|
+
|
|
105
|
+
```typescript
|
|
106
|
+
test("out-of-stock product blocks checkout with clear message", async ({ page, request }) => {
|
|
107
|
+
// Deplete stock via test API
|
|
108
|
+
await request.post("/api/test/deplete-stock", { data: { productId: "{{PRODUCT_ID}}" } });
|
|
109
|
+
|
|
110
|
+
await page.goto("/checkout?prefilled=true");
|
|
111
|
+
await page.getByRole("button", { name: "Place Order" }).click();
|
|
112
|
+
|
|
113
|
+
await expect(page.getByText(/out of stock|unavailable/i)).toBeVisible();
|
|
114
|
+
await expect(page).not.toHaveURL("**/order-confirmation/**");
|
|
115
|
+
});
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## P1 — Coupon Calculation
|
|
119
|
+
|
|
120
|
+
```typescript
|
|
121
|
+
test("percentage coupon applies correct discount", async ({ page }) => {
|
|
122
|
+
await page.goto("/cart");
|
|
123
|
+
await page.fill('[name="couponCode"]', "{{COUPON_CODE}}");
|
|
124
|
+
await page.getByRole("button", { name: "Apply" }).click();
|
|
125
|
+
|
|
126
|
+
const total = await page.getByTestId("cart-total").textContent();
|
|
127
|
+
// {{PRICE}} * (1 - 0.10) = expected total
|
|
128
|
+
await expect(page.getByTestId("discount-amount")).toContainText("{{EXPECTED_DISCOUNT}}");
|
|
129
|
+
});
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
## P1 — Cart Merge on Login
|
|
133
|
+
|
|
134
|
+
```typescript
|
|
135
|
+
test("guest cart merges into user cart on login", async ({ page }) => {
|
|
136
|
+
// Add item as guest
|
|
137
|
+
await page.goto("/products/{{PRODUCT_SLUG}}");
|
|
138
|
+
await page.getByRole("button", { name: "Add to Cart" }).click();
|
|
139
|
+
|
|
140
|
+
// Login
|
|
141
|
+
await page.goto("/login");
|
|
142
|
+
await page.fill('[name="email"]', "{{TEST_USER_EMAIL}}");
|
|
143
|
+
await page.fill('[name="password"]', "{{TEST_USER_PASSWORD}}");
|
|
144
|
+
await page.getByRole("button", { name: "Sign In" }).click();
|
|
145
|
+
|
|
146
|
+
// Guest cart item should appear in user cart
|
|
147
|
+
await page.goto("/cart");
|
|
148
|
+
await expect(page.getByText("{{PRODUCT_NAME}}")).toBeVisible();
|
|
149
|
+
});
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
## MSW Mock PG Server (CI)
|
|
153
|
+
|
|
154
|
+
```typescript
|
|
155
|
+
// mocks/pg-server.ts
|
|
156
|
+
export const pgHandlers = [
|
|
157
|
+
http.post("{{PG_ENDPOINT}}", async ({ request }) => {
|
|
158
|
+
const body = await request.json() as Record<string, unknown>;
|
|
159
|
+
const card = body.cardNumber as string;
|
|
160
|
+
|
|
161
|
+
if (card === "4000000000000002") {
|
|
162
|
+
return HttpResponse.json({ status: "FAILED", code: "CARD_DECLINED" }, { status: 400 });
|
|
163
|
+
}
|
|
164
|
+
return HttpResponse.json({
|
|
165
|
+
status: "APPROVED",
|
|
166
|
+
transactionId: `mock_${Date.now()}`,
|
|
167
|
+
});
|
|
168
|
+
}),
|
|
169
|
+
];
|
|
170
|
+
```
|
|
@@ -1,162 +1,162 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: event-comms
|
|
3
|
-
tier: standard
|
|
4
|
-
description: "Event communication automation — SMS via Aligo, email via Gmail OAuth, SNS posts for LinkedIn/Threads. Handles templates, BCC rules, and confirmation protocol."
|
|
5
|
-
triggers: [sms, aligo, gmail, event email, event sms, 문자 발송, 메일 발송, SNS 홍보]
|
|
6
|
-
priority: 65
|
|
7
|
-
---
|
|
8
|
-
# Event Communications
|
|
9
|
-
|
|
10
|
-
SMS, email, and SNS content generation for community events.
|
|
11
|
-
|
|
12
|
-
## SMS (Aligo API)
|
|
13
|
-
|
|
14
|
-
### Rules
|
|
15
|
-
- Auto-switch to LMS when >90 bytes
|
|
16
|
-
- Use `%고객명%` substitution
|
|
17
|
-
- Always test with `testmode_yn=Y` first
|
|
18
|
-
- **Emoji strictly forbidden** (EUC-KR encoding)
|
|
19
|
-
|
|
20
|
-
### SMS Types
|
|
21
|
-
|
|
22
|
-
| Timing | Type | Content |
|
|
23
|
-
|--------|------|---------|
|
|
24
|
-
| D-7~D-3 | Notification LMS | Event name, datetime, venue, fee, registration URL |
|
|
25
|
-
| D-3 | Confirmation SMS | Attendance confirmed + detailed venue |
|
|
26
|
-
| D-1 | Reminder SMS | Tomorrow schedule reminder + venue |
|
|
27
|
-
| D-Day | Day-of SMS | Today schedule reminder |
|
|
28
|
-
|
|
29
|
-
### Templates
|
|
30
|
-
|
|
31
|
-
**Notification LMS (D-7~D-3)**
|
|
32
|
-
```
|
|
33
|
-
%고객명%님 안녕하세요.
|
|
34
|
-
|
|
35
|
-
{event_name} {edition}회 안내드립니다.
|
|
36
|
-
|
|
37
|
-
일시: {date} {time}
|
|
38
|
-
장소: {venue}
|
|
39
|
-
참가비: {fee}
|
|
40
|
-
|
|
41
|
-
신청: {url}
|
|
42
|
-
|
|
43
|
-
{community_name}
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
**Confirmation SMS (D-3)**
|
|
47
|
-
```
|
|
48
|
-
%고객명%님, {event_name} 참가가 확정되었습니다.
|
|
49
|
-
|
|
50
|
-
일시: {date} {time}
|
|
51
|
-
장소: {venue_detail}
|
|
52
|
-
|
|
53
|
-
당일 뵙겠습니다.
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
**Reminder SMS (D-1)**
|
|
57
|
-
```
|
|
58
|
-
%고객명%님, 내일 {event_name}이 있습니다.
|
|
59
|
-
|
|
60
|
-
일시: {date} {time}
|
|
61
|
-
장소: {venue}
|
|
62
|
-
|
|
63
|
-
내일 뵙겠습니다!
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
**Day-of SMS (D-Day)**
|
|
67
|
-
```
|
|
68
|
-
%고객명%님, 오늘 {time} {event_name}입니다.
|
|
69
|
-
|
|
70
|
-
장소: {venue}
|
|
71
|
-
|
|
72
|
-
오늘 뵙겠습니다!
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
## Email (Gmail OAuth 2.0)
|
|
76
|
-
|
|
77
|
-
### Rules
|
|
78
|
-
- **MUST use BCC** — never expose attendee emails to each other
|
|
79
|
-
- D-3 confirmation email includes: venue details, timetable, Slido link
|
|
80
|
-
|
|
81
|
-
### Confirmation Email Template (D-3)
|
|
82
|
-
```
|
|
83
|
-
Subject: [{event_name}] 참가 확정 안내
|
|
84
|
-
|
|
85
|
-
{attendee_name}님 안녕하세요.
|
|
86
|
-
|
|
87
|
-
{event_name} {edition}회 참가가 확정되었습니다.
|
|
88
|
-
|
|
89
|
-
■ 일시: {date} {time}
|
|
90
|
-
■ 장소: {venue_detail}
|
|
91
|
-
■ 프로그램:
|
|
92
|
-
{timetable}
|
|
93
|
-
|
|
94
|
-
■ 실시간 질문: {slido_link}
|
|
95
|
-
|
|
96
|
-
당일 뵙겠습니다.
|
|
97
|
-
감사합니다.
|
|
98
|
-
|
|
99
|
-
{community_name}
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
## SNS Posts
|
|
103
|
-
|
|
104
|
-
### Platform Tone
|
|
105
|
-
|
|
106
|
-
| Platform | Tone | Length | Style |
|
|
107
|
-
|----------|------|--------|-------|
|
|
108
|
-
| LinkedIn | Professional, formal | 300+ chars | Expert participation encouragement |
|
|
109
|
-
| Threads | Casual, hooking | 150-200 chars | "아직 안 봤어?" style |
|
|
110
|
-
|
|
111
|
-
### Post Types
|
|
112
|
-
|
|
113
|
-
| Timing | Type | Content |
|
|
114
|
-
|--------|------|---------|
|
|
115
|
-
| Open | Promo post | Event intro + CTA |
|
|
116
|
-
| D-14 | Deadline remind | Urgency + remaining spots |
|
|
117
|
-
| D+1 | Review post | Story → 3 insights → next event preview |
|
|
118
|
-
|
|
119
|
-
### LinkedIn Promo Template
|
|
120
|
-
```
|
|
121
|
-
{hook_sentence}
|
|
122
|
-
|
|
123
|
-
{event_name} {edition}회를 소개합니다.
|
|
124
|
-
|
|
125
|
-
📅 {date} {time}
|
|
126
|
-
📍 {venue}
|
|
127
|
-
|
|
128
|
-
이번 주제: {topic}
|
|
129
|
-
|
|
130
|
-
{speaker_intro}
|
|
131
|
-
|
|
132
|
-
{cta}
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
### Threads Promo Template
|
|
136
|
-
```
|
|
137
|
-
{hook_casual}
|
|
138
|
-
|
|
139
|
-
{event_name} {edition}회 열린다!
|
|
140
|
-
|
|
141
|
-
{date} {time}
|
|
142
|
-
{venue_short}
|
|
143
|
-
|
|
144
|
-
{topic_casual}
|
|
145
|
-
|
|
146
|
-
{cta_casual}
|
|
147
|
-
```
|
|
148
|
-
|
|
149
|
-
### Review Post Structure
|
|
150
|
-
1. Story (emotional hook)
|
|
151
|
-
2. Key insights (3 items)
|
|
152
|
-
3. Next event preview
|
|
153
|
-
4. Thank you + community link
|
|
154
|
-
|
|
155
|
-
## API Keys Required
|
|
156
|
-
|
|
157
|
-
| Key | Service | Required |
|
|
158
|
-
|-----|---------|----------|
|
|
159
|
-
| `ALIGO_API_KEY` | Aligo SMS | ✅ (for send) |
|
|
160
|
-
| `ALIGO_USER_ID` | Aligo SMS | ✅ (for send) |
|
|
161
|
-
| `ALIGO_SENDER` | Aligo SMS | ✅ (for send) |
|
|
162
|
-
| `GMAIL_CREDENTIALS_PATH` | Gmail OAuth | ✅ (for email) |
|
|
1
|
+
---
|
|
2
|
+
name: event-comms
|
|
3
|
+
tier: standard
|
|
4
|
+
description: "Event communication automation — SMS via Aligo, email via Gmail OAuth, SNS posts for LinkedIn/Threads. Handles templates, BCC rules, and confirmation protocol."
|
|
5
|
+
triggers: [sms, aligo, gmail, event email, event sms, 문자 발송, 메일 발송, SNS 홍보]
|
|
6
|
+
priority: 65
|
|
7
|
+
---
|
|
8
|
+
# Event Communications
|
|
9
|
+
|
|
10
|
+
SMS, email, and SNS content generation for community events.
|
|
11
|
+
|
|
12
|
+
## SMS (Aligo API)
|
|
13
|
+
|
|
14
|
+
### Rules
|
|
15
|
+
- Auto-switch to LMS when >90 bytes
|
|
16
|
+
- Use `%고객명%` substitution
|
|
17
|
+
- Always test with `testmode_yn=Y` first
|
|
18
|
+
- **Emoji strictly forbidden** (EUC-KR encoding)
|
|
19
|
+
|
|
20
|
+
### SMS Types
|
|
21
|
+
|
|
22
|
+
| Timing | Type | Content |
|
|
23
|
+
|--------|------|---------|
|
|
24
|
+
| D-7~D-3 | Notification LMS | Event name, datetime, venue, fee, registration URL |
|
|
25
|
+
| D-3 | Confirmation SMS | Attendance confirmed + detailed venue |
|
|
26
|
+
| D-1 | Reminder SMS | Tomorrow schedule reminder + venue |
|
|
27
|
+
| D-Day | Day-of SMS | Today schedule reminder |
|
|
28
|
+
|
|
29
|
+
### Templates
|
|
30
|
+
|
|
31
|
+
**Notification LMS (D-7~D-3)**
|
|
32
|
+
```
|
|
33
|
+
%고객명%님 안녕하세요.
|
|
34
|
+
|
|
35
|
+
{event_name} {edition}회 안내드립니다.
|
|
36
|
+
|
|
37
|
+
일시: {date} {time}
|
|
38
|
+
장소: {venue}
|
|
39
|
+
참가비: {fee}
|
|
40
|
+
|
|
41
|
+
신청: {url}
|
|
42
|
+
|
|
43
|
+
{community_name}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
**Confirmation SMS (D-3)**
|
|
47
|
+
```
|
|
48
|
+
%고객명%님, {event_name} 참가가 확정되었습니다.
|
|
49
|
+
|
|
50
|
+
일시: {date} {time}
|
|
51
|
+
장소: {venue_detail}
|
|
52
|
+
|
|
53
|
+
당일 뵙겠습니다.
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
**Reminder SMS (D-1)**
|
|
57
|
+
```
|
|
58
|
+
%고객명%님, 내일 {event_name}이 있습니다.
|
|
59
|
+
|
|
60
|
+
일시: {date} {time}
|
|
61
|
+
장소: {venue}
|
|
62
|
+
|
|
63
|
+
내일 뵙겠습니다!
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
**Day-of SMS (D-Day)**
|
|
67
|
+
```
|
|
68
|
+
%고객명%님, 오늘 {time} {event_name}입니다.
|
|
69
|
+
|
|
70
|
+
장소: {venue}
|
|
71
|
+
|
|
72
|
+
오늘 뵙겠습니다!
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Email (Gmail OAuth 2.0)
|
|
76
|
+
|
|
77
|
+
### Rules
|
|
78
|
+
- **MUST use BCC** — never expose attendee emails to each other
|
|
79
|
+
- D-3 confirmation email includes: venue details, timetable, Slido link
|
|
80
|
+
|
|
81
|
+
### Confirmation Email Template (D-3)
|
|
82
|
+
```
|
|
83
|
+
Subject: [{event_name}] 참가 확정 안내
|
|
84
|
+
|
|
85
|
+
{attendee_name}님 안녕하세요.
|
|
86
|
+
|
|
87
|
+
{event_name} {edition}회 참가가 확정되었습니다.
|
|
88
|
+
|
|
89
|
+
■ 일시: {date} {time}
|
|
90
|
+
■ 장소: {venue_detail}
|
|
91
|
+
■ 프로그램:
|
|
92
|
+
{timetable}
|
|
93
|
+
|
|
94
|
+
■ 실시간 질문: {slido_link}
|
|
95
|
+
|
|
96
|
+
당일 뵙겠습니다.
|
|
97
|
+
감사합니다.
|
|
98
|
+
|
|
99
|
+
{community_name}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## SNS Posts
|
|
103
|
+
|
|
104
|
+
### Platform Tone
|
|
105
|
+
|
|
106
|
+
| Platform | Tone | Length | Style |
|
|
107
|
+
|----------|------|--------|-------|
|
|
108
|
+
| LinkedIn | Professional, formal | 300+ chars | Expert participation encouragement |
|
|
109
|
+
| Threads | Casual, hooking | 150-200 chars | "아직 안 봤어?" style |
|
|
110
|
+
|
|
111
|
+
### Post Types
|
|
112
|
+
|
|
113
|
+
| Timing | Type | Content |
|
|
114
|
+
|--------|------|---------|
|
|
115
|
+
| Open | Promo post | Event intro + CTA |
|
|
116
|
+
| D-14 | Deadline remind | Urgency + remaining spots |
|
|
117
|
+
| D+1 | Review post | Story → 3 insights → next event preview |
|
|
118
|
+
|
|
119
|
+
### LinkedIn Promo Template
|
|
120
|
+
```
|
|
121
|
+
{hook_sentence}
|
|
122
|
+
|
|
123
|
+
{event_name} {edition}회를 소개합니다.
|
|
124
|
+
|
|
125
|
+
📅 {date} {time}
|
|
126
|
+
📍 {venue}
|
|
127
|
+
|
|
128
|
+
이번 주제: {topic}
|
|
129
|
+
|
|
130
|
+
{speaker_intro}
|
|
131
|
+
|
|
132
|
+
{cta}
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### Threads Promo Template
|
|
136
|
+
```
|
|
137
|
+
{hook_casual}
|
|
138
|
+
|
|
139
|
+
{event_name} {edition}회 열린다!
|
|
140
|
+
|
|
141
|
+
{date} {time}
|
|
142
|
+
{venue_short}
|
|
143
|
+
|
|
144
|
+
{topic_casual}
|
|
145
|
+
|
|
146
|
+
{cta_casual}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### Review Post Structure
|
|
150
|
+
1. Story (emotional hook)
|
|
151
|
+
2. Key insights (3 items)
|
|
152
|
+
3. Next event preview
|
|
153
|
+
4. Thank you + community link
|
|
154
|
+
|
|
155
|
+
## API Keys Required
|
|
156
|
+
|
|
157
|
+
| Key | Service | Required |
|
|
158
|
+
|-----|---------|----------|
|
|
159
|
+
| `ALIGO_API_KEY` | Aligo SMS | ✅ (for send) |
|
|
160
|
+
| `ALIGO_USER_ID` | Aligo SMS | ✅ (for send) |
|
|
161
|
+
| `ALIGO_SENDER` | Aligo SMS | ✅ (for send) |
|
|
162
|
+
| `GMAIL_CREDENTIALS_PATH` | Gmail OAuth | ✅ (for email) |
|