@su-record/vibe 2.7.19 → 2.7.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/README.md +178 -77
  2. package/agents/qa/qa-coordinator.md +131 -0
  3. package/commands/vibe.review.md +79 -0
  4. package/commands/vibe.run.md +68 -9
  5. package/commands/vibe.spec.review.md +48 -8
  6. package/commands/vibe.verify.md +26 -0
  7. package/dist/cli/commands/init.d.ts.map +1 -1
  8. package/dist/cli/commands/init.js +4 -12
  9. package/dist/cli/commands/init.js.map +1 -1
  10. package/dist/cli/postinstall/claude-agents.d.ts.map +1 -1
  11. package/dist/cli/postinstall/claude-agents.js +1 -0
  12. package/dist/cli/postinstall/claude-agents.js.map +1 -1
  13. package/dist/cli/postinstall/codex-agents.d.ts +18 -6
  14. package/dist/cli/postinstall/codex-agents.d.ts.map +1 -1
  15. package/dist/cli/postinstall/codex-agents.js +78 -16
  16. package/dist/cli/postinstall/codex-agents.js.map +1 -1
  17. package/dist/cli/postinstall/constants.d.ts.map +1 -1
  18. package/dist/cli/postinstall/constants.js +17 -14
  19. package/dist/cli/postinstall/constants.js.map +1 -1
  20. package/dist/cli/postinstall/index.d.ts +1 -1
  21. package/dist/cli/postinstall/index.d.ts.map +1 -1
  22. package/dist/cli/postinstall/index.js +1 -1
  23. package/dist/cli/postinstall/index.js.map +1 -1
  24. package/dist/cli/postinstall/main.d.ts.map +1 -1
  25. package/dist/cli/postinstall/main.js +4 -8
  26. package/dist/cli/postinstall/main.js.map +1 -1
  27. package/dist/cli/postinstall.d.ts +1 -1
  28. package/dist/cli/postinstall.d.ts.map +1 -1
  29. package/dist/cli/postinstall.js +1 -1
  30. package/dist/cli/postinstall.js.map +1 -1
  31. package/dist/cli/types.d.ts +1 -0
  32. package/dist/cli/types.d.ts.map +1 -1
  33. package/dist/cli/utils/cli-detector.d.ts +1 -0
  34. package/dist/cli/utils/cli-detector.d.ts.map +1 -1
  35. package/dist/cli/utils/cli-detector.js +1 -0
  36. package/dist/cli/utils/cli-detector.js.map +1 -1
  37. package/dist/infra/lib/ComponentRegistry.d.ts +35 -0
  38. package/dist/infra/lib/ComponentRegistry.d.ts.map +1 -0
  39. package/dist/infra/lib/ComponentRegistry.js +59 -0
  40. package/dist/infra/lib/ComponentRegistry.js.map +1 -0
  41. package/dist/infra/lib/ReviewRace.d.ts.map +1 -1
  42. package/dist/infra/lib/ReviewRace.js +11 -7
  43. package/dist/infra/lib/ReviewRace.js.map +1 -1
  44. package/dist/infra/lib/__tests__/ComponentRegistry.test.d.ts +2 -0
  45. package/dist/infra/lib/__tests__/ComponentRegistry.test.d.ts.map +1 -0
  46. package/dist/infra/lib/__tests__/ComponentRegistry.test.js +99 -0
  47. package/dist/infra/lib/__tests__/ComponentRegistry.test.js.map +1 -0
  48. package/dist/infra/lib/embedding/__tests__/EmbeddingProvider.test.js +4 -0
  49. package/dist/infra/lib/embedding/__tests__/EmbeddingProvider.test.js.map +1 -1
  50. package/dist/infra/lib/evolution/DescriptionOptimizer.d.ts +45 -0
  51. package/dist/infra/lib/evolution/DescriptionOptimizer.d.ts.map +1 -1
  52. package/dist/infra/lib/evolution/DescriptionOptimizer.js +151 -0
  53. package/dist/infra/lib/evolution/DescriptionOptimizer.js.map +1 -1
  54. package/dist/infra/lib/evolution/__tests__/eval.test.js +64 -0
  55. package/dist/infra/lib/evolution/__tests__/eval.test.js.map +1 -1
  56. package/dist/infra/lib/gpt/chat.d.ts.map +1 -1
  57. package/dist/infra/lib/gpt/chat.js +8 -0
  58. package/dist/infra/lib/gpt/chat.js.map +1 -1
  59. package/dist/infra/lib/gpt/specializations.d.ts.map +1 -1
  60. package/dist/infra/lib/gpt/specializations.js +5 -0
  61. package/dist/infra/lib/gpt/specializations.js.map +1 -1
  62. package/dist/infra/lib/llm-availability.d.ts +21 -0
  63. package/dist/infra/lib/llm-availability.d.ts.map +1 -0
  64. package/dist/infra/lib/llm-availability.js +57 -0
  65. package/dist/infra/lib/llm-availability.js.map +1 -0
  66. package/dist/infra/lib/memory/IMemoryStorage.d.ts +16 -0
  67. package/dist/infra/lib/memory/IMemoryStorage.d.ts.map +1 -0
  68. package/dist/infra/lib/memory/IMemoryStorage.js +7 -0
  69. package/dist/infra/lib/memory/IMemoryStorage.js.map +1 -0
  70. package/dist/infra/lib/memory/InMemoryStorage.d.ts +13 -0
  71. package/dist/infra/lib/memory/InMemoryStorage.d.ts.map +1 -0
  72. package/dist/infra/lib/memory/InMemoryStorage.js +44 -0
  73. package/dist/infra/lib/memory/InMemoryStorage.js.map +1 -0
  74. package/dist/infra/lib/memory/MemoryStorage.d.ts +2 -1
  75. package/dist/infra/lib/memory/MemoryStorage.d.ts.map +1 -1
  76. package/dist/infra/lib/memory/MemoryStorage.js.map +1 -1
  77. package/dist/infra/lib/memory/__tests__/InMemoryStorage.test.d.ts +2 -0
  78. package/dist/infra/lib/memory/__tests__/InMemoryStorage.test.d.ts.map +1 -0
  79. package/dist/infra/lib/memory/__tests__/InMemoryStorage.test.js +114 -0
  80. package/dist/infra/lib/memory/__tests__/InMemoryStorage.test.js.map +1 -0
  81. package/dist/infra/lib/memory/index.d.ts +2 -0
  82. package/dist/infra/lib/memory/index.d.ts.map +1 -1
  83. package/dist/infra/lib/memory/index.js +1 -0
  84. package/dist/infra/lib/memory/index.js.map +1 -1
  85. package/dist/infra/lib/telemetry/SkillTelemetry.d.ts +8 -0
  86. package/dist/infra/lib/telemetry/SkillTelemetry.d.ts.map +1 -1
  87. package/dist/infra/lib/telemetry/SkillTelemetry.js +40 -0
  88. package/dist/infra/lib/telemetry/SkillTelemetry.js.map +1 -1
  89. package/dist/infra/lib/telemetry/SkillTelemetry.test.js +33 -0
  90. package/dist/infra/lib/telemetry/SkillTelemetry.test.js.map +1 -1
  91. package/dist/infra/lib/telemetry/VibeSpan.d.ts +20 -0
  92. package/dist/infra/lib/telemetry/VibeSpan.d.ts.map +1 -0
  93. package/dist/infra/lib/telemetry/VibeSpan.js +26 -0
  94. package/dist/infra/lib/telemetry/VibeSpan.js.map +1 -0
  95. package/dist/infra/orchestrator/BackgroundManager.d.ts.map +1 -1
  96. package/dist/infra/orchestrator/BackgroundManager.js +2 -0
  97. package/dist/infra/orchestrator/BackgroundManager.js.map +1 -1
  98. package/dist/infra/orchestrator/MultiLlmResearch.d.ts.map +1 -1
  99. package/dist/infra/orchestrator/MultiLlmResearch.js +49 -40
  100. package/dist/infra/orchestrator/MultiLlmResearch.js.map +1 -1
  101. package/dist/infra/orchestrator/SmartRouter.d.ts.map +1 -1
  102. package/dist/infra/orchestrator/SmartRouter.js +4 -3
  103. package/dist/infra/orchestrator/SmartRouter.js.map +1 -1
  104. package/dist/infra/orchestrator/types.d.ts +8 -0
  105. package/dist/infra/orchestrator/types.d.ts.map +1 -1
  106. package/dist/infra/orchestrator/types.js +36 -0
  107. package/dist/infra/orchestrator/types.js.map +1 -1
  108. package/dist/tools/index.d.ts +6 -0
  109. package/dist/tools/index.d.ts.map +1 -1
  110. package/dist/tools/index.js +5 -0
  111. package/dist/tools/index.js.map +1 -1
  112. package/hooks/hooks.json +4 -0
  113. package/hooks/scripts/codex-detect.js +46 -0
  114. package/hooks/scripts/codex-review-gate.js +80 -0
  115. package/hooks/scripts/evolution-engine.js +69 -0
  116. package/hooks/scripts/llm-orchestrate.js +9 -5
  117. package/hooks/scripts/skill-injector.js +83 -0
  118. package/package.json +1 -1
  119. package/skills/arch-guard/SKILL.md +1 -1
  120. package/skills/brand-assets/SKILL.md +1 -1
  121. package/skills/capability-loop/SKILL.md +1 -1
  122. package/skills/characterization-test/SKILL.md +1 -1
  123. package/skills/commerce-patterns/SKILL.md +1 -1
  124. package/skills/e2e-commerce/SKILL.md +1 -1
  125. package/skills/exec-plan/SKILL.md +1 -1
  126. package/skills/parallel-research/SKILL.md +1 -1
  127. package/skills/seo-checklist/SKILL.md +1 -1
  128. package/skills/ui-ux-pro-max/SKILL.md +1 -1
  129. package/skills/video-production/SKILL.md +1 -1
@@ -0,0 +1,46 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Codex 플러그인 감지 유틸
4
+ *
5
+ * 워크플로우 스킬(.md)에서 Bash로 호출하여 Codex 사용 가능 여부 확인.
6
+ *
7
+ * 사용법 (스킬 마크다운에서):
8
+ * node {{VIBE_PATH}}/hooks/scripts/codex-detect.js
9
+ *
10
+ * 출력:
11
+ * "available" — Codex CLI 설치 + auth 존재
12
+ * "unavailable" — 미설치 또는 미인증
13
+ *
14
+ * 종료 코드:
15
+ * 0 — available
16
+ * 1 — unavailable
17
+ */
18
+
19
+ import fs from 'fs';
20
+ import path from 'path';
21
+ import { execSync } from 'child_process';
22
+ import os from 'os';
23
+
24
+ const codexDir = process.env.CODEX_HOME || path.join(os.homedir(), '.codex');
25
+
26
+ // CLI 설치 확인
27
+ let cliInstalled = fs.existsSync(codexDir);
28
+ if (!cliInstalled) {
29
+ try {
30
+ execSync('which codex', { stdio: 'ignore' });
31
+ cliInstalled = true;
32
+ } catch {
33
+ // not found
34
+ }
35
+ }
36
+
37
+ // 인증 확인
38
+ const authExists = fs.existsSync(path.join(codexDir, 'auth.json'));
39
+
40
+ if (cliInstalled && authExists) {
41
+ console.log('available');
42
+ process.exit(0);
43
+ } else {
44
+ console.log('unavailable');
45
+ process.exit(1);
46
+ }
@@ -0,0 +1,80 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Codex Review Gate — Stop 훅에서 자동 실행
4
+ *
5
+ * Claude Code 작업 완료(Stop) 시 Codex 플러그인이 설치되어 있으면
6
+ * /codex:review를 자동 트리거하여 최종 코드 리뷰 게이트 역할.
7
+ *
8
+ * 동작 조건:
9
+ * - Codex 플러그인 설치됨 (which codex 또는 ~/.codex/ 존재)
10
+ * - Stop 이벤트가 코드 변경을 포함 (Write/Edit 도구 사용됨)
11
+ * - config.json에서 codexReviewGate가 비활성화되지 않음
12
+ *
13
+ * 출력:
14
+ * - stdout로 Claude에게 /codex:review 호출 지시
15
+ * - 조건 미충족 시 빈 출력 (스킵)
16
+ */
17
+
18
+ import fs from 'fs';
19
+ import path from 'path';
20
+ import { execSync } from 'child_process';
21
+ import os from 'os';
22
+
23
+ // stdin 읽기
24
+ let input = '';
25
+ for await (const chunk of process.stdin) {
26
+ input += chunk;
27
+ }
28
+
29
+ // Codex CLI/플러그인 설치 여부 확인
30
+ function isCodexAvailable() {
31
+ const codexDir = path.join(os.homedir(), '.codex');
32
+ if (fs.existsSync(codexDir)) return true;
33
+
34
+ try {
35
+ execSync('which codex', { stdio: 'ignore' });
36
+ return true;
37
+ } catch {
38
+ return false;
39
+ }
40
+ }
41
+
42
+ // 프로젝트 config에서 codexReviewGate 설정 확인
43
+ function isCodexReviewGateEnabled() {
44
+ try {
45
+ const configPath = path.join(process.cwd(), '.claude', 'vibe', 'config.json');
46
+ if (!fs.existsSync(configPath)) return true; // 기본: 활성화
47
+ const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
48
+ // 명시적으로 false일 때만 비활성화
49
+ return config.codexReviewGate !== false;
50
+ } catch {
51
+ return true;
52
+ }
53
+ }
54
+
55
+ // Stop 이벤트에 코드 변경이 포함되었는지 확인
56
+ function hasCodeChanges() {
57
+ try {
58
+ const parsed = JSON.parse(input);
59
+ const toolUses = parsed.tool_uses || parsed.tools_used || [];
60
+
61
+ // Write 또는 Edit 도구가 사용되었으면 코드 변경 있음
62
+ if (Array.isArray(toolUses)) {
63
+ return toolUses.some(t => {
64
+ const name = t.tool || t.name || '';
65
+ return name === 'Write' || name === 'Edit';
66
+ });
67
+ }
68
+
69
+ // 파싱 실패 시 항상 실행 (안전한 방향)
70
+ return true;
71
+ } catch {
72
+ // stdin 파싱 실패 시 항상 실행
73
+ return true;
74
+ }
75
+ }
76
+
77
+ // 메인 로직
78
+ if (isCodexAvailable() && isCodexReviewGateEnabled() && hasCodeChanges()) {
79
+ console.log('[CODEX REVIEW GATE] Run /codex:review for final code review before completing.');
80
+ }
@@ -0,0 +1,69 @@
1
+ /**
2
+ * PostToolUse Hook - Evolution Engine
3
+ * Write/Edit 이벤트 후 인사이트 추출 및 자동 생성 파이프라인 트리거
4
+ */
5
+ import { getLibBaseUrl, PROJECT_DIR } from './utils.js';
6
+ import fs from 'fs';
7
+ import path from 'path';
8
+
9
+ async function main() {
10
+ // Evolution 활성화 여부 확인
11
+ const configPath = path.join(PROJECT_DIR, '.claude', 'vibe', 'config.json');
12
+ let config = { mode: 'suggest', enabled: false };
13
+
14
+ try {
15
+ if (fs.existsSync(configPath)) {
16
+ const raw = JSON.parse(fs.readFileSync(configPath, 'utf8'));
17
+ config = {
18
+ mode: raw.evolution?.mode || 'suggest',
19
+ enabled: raw.evolution?.enabled === true,
20
+ };
21
+ }
22
+ } catch { /* ignore */ }
23
+
24
+ if (!config.enabled) return;
25
+
26
+ // 비동기로 파이프라인 실행 (메인 훅 흐름 차단 안 함)
27
+ setImmediate(async () => {
28
+ try {
29
+ const LIB_BASE = getLibBaseUrl();
30
+ const [memMod, extractorMod, orchestratorMod] = await Promise.all([
31
+ import(`${LIB_BASE}memory/MemoryStorage.js`),
32
+ import(`${LIB_BASE}evolution/InsightExtractor.js`),
33
+ import(`${LIB_BASE}evolution/EvolutionOrchestrator.js`),
34
+ ]);
35
+
36
+ const storage = new memMod.MemoryStorage(PROJECT_DIR);
37
+
38
+ // Phase 2: 인사이트 추출
39
+ const extractor = new extractorMod.InsightExtractor(storage);
40
+ const extractResult = extractor.extractFromRecent(20);
41
+
42
+ if (extractResult.newInsights.length === 0 && extractResult.mergedInsights.length === 0) {
43
+ storage.close();
44
+ return;
45
+ }
46
+
47
+ // Phase 3: config.mode에 따라 생성
48
+ if (config.mode === 'suggest' || config.mode === 'auto') {
49
+ const orchestrator = new orchestratorMod.EvolutionOrchestrator(storage, {
50
+ mode: config.mode,
51
+ });
52
+ const genResult = orchestrator.generate();
53
+
54
+ if (genResult.generated.length > 0) {
55
+ const label = config.mode === 'auto' ? 'auto-generated' : 'suggested';
56
+ process.stderr.write(
57
+ `[Evolution] ${genResult.generated.length} artifacts ${label}\n`
58
+ );
59
+ }
60
+ }
61
+
62
+ storage.close();
63
+ } catch (e) {
64
+ process.stderr.write(`[Evolution] Engine error: ${e.message}\n`);
65
+ }
66
+ });
67
+ }
68
+
69
+ main();
@@ -222,11 +222,15 @@ function callGeminiCli(prompt, sysPrompt, jsonMode, model) {
222
222
  async function callProvider(providerName, prompt, sysPrompt, jsonMode) {
223
223
  const vibeConfig = readVibeConfig();
224
224
 
225
- if (providerName === 'gpt' || providerName === 'gpt-codex') {
226
- const isCodex = providerName === 'gpt-codex';
227
- const model = isCodex
228
- ? (vibeConfig.models?.gptCodex || process.env.GPT_CODEX_MODEL || 'gpt-5.3-codex')
229
- : (vibeConfig.models?.gpt || process.env.GPT_MODEL || 'gpt-5.4');
225
+ if (providerName === 'gpt' || providerName === 'gpt-codex' || providerName === 'gpt-spark') {
226
+ let model;
227
+ if (providerName === 'gpt-spark') {
228
+ model = vibeConfig.models?.gptCodexSpark || process.env.GPT_CODEX_SPARK_MODEL || 'gpt-5.3-codex-spark';
229
+ } else if (providerName === 'gpt-codex') {
230
+ model = vibeConfig.models?.gptCodex || process.env.GPT_CODEX_MODEL || 'gpt-5.3-codex';
231
+ } else {
232
+ model = vibeConfig.models?.gpt || process.env.GPT_MODEL || 'gpt-5.4';
233
+ }
230
234
  return await callCodexCli(prompt, sysPrompt, jsonMode, model);
231
235
  }
232
236
 
@@ -0,0 +1,83 @@
1
+ /**
2
+ * SessionStart Hook - Auto-generated skill/agent/rule 주입
3
+ * auto/ 디렉토리를 스캔하여 .disabled가 아닌 파일을 로드하고 사용량 추적
4
+ */
5
+ import fs from 'fs';
6
+ import path from 'path';
7
+ import os from 'os';
8
+ import { getLibBaseUrl, PROJECT_DIR } from './utils.js';
9
+
10
+ const HOME = os.homedir();
11
+
12
+ // auto/ 디렉토리 경로
13
+ const AUTO_DIRS = {
14
+ 'user-auto': {
15
+ skills: path.join(HOME, '.claude', 'vibe', 'skills', 'auto'),
16
+ agents: path.join(HOME, '.claude', 'agents', 'auto'),
17
+ rules: path.join(HOME, '.claude', 'vibe', 'rules', 'auto'),
18
+ },
19
+ 'project-auto': {
20
+ skills: path.join(PROJECT_DIR, '.claude', 'vibe', 'skills', 'auto'),
21
+ agents: path.join(PROJECT_DIR, '.claude', 'agents', 'auto'),
22
+ rules: path.join(PROJECT_DIR, '.claude', 'vibe', 'rules', 'auto'),
23
+ },
24
+ };
25
+
26
+ /**
27
+ * 디렉토리에서 .md 파일 스캔 (.disabled 제외)
28
+ */
29
+ function scanAutoDir(dirPath) {
30
+ if (!fs.existsSync(dirPath)) return [];
31
+
32
+ return fs.readdirSync(dirPath)
33
+ .filter(f => f.endsWith('.md') && !f.endsWith('.disabled'))
34
+ .map(f => ({
35
+ name: f.replace(/\.md$/, ''),
36
+ path: path.join(dirPath, f),
37
+ content: fs.readFileSync(path.join(dirPath, f), 'utf8'),
38
+ }));
39
+ }
40
+
41
+ async function main() {
42
+ const allSkills = [];
43
+
44
+ for (const [source, dirs] of Object.entries(AUTO_DIRS)) {
45
+ for (const [type, dirPath] of Object.entries(dirs)) {
46
+ const files = scanAutoDir(dirPath);
47
+ for (const file of files) {
48
+ allSkills.push({ ...file, source, type, generated: true });
49
+ }
50
+ }
51
+ }
52
+
53
+ if (allSkills.length === 0) return;
54
+
55
+ // 사용량 추적
56
+ try {
57
+ const LIB_BASE = getLibBaseUrl();
58
+ const [memMod, trackerMod] = await Promise.all([
59
+ import(`${LIB_BASE}memory/MemoryStorage.js`),
60
+ import(`${LIB_BASE}evolution/UsageTracker.js`),
61
+ ]);
62
+
63
+ const storage = new memMod.MemoryStorage(PROJECT_DIR);
64
+ const tracker = new trackerMod.UsageTracker(storage);
65
+
66
+ for (const skill of allSkills) {
67
+ tracker.recordUsage({
68
+ generationId: skill.name,
69
+ event: 'injected',
70
+ metadata: { source: skill.source, type: skill.type, generated: skill.generated },
71
+ });
72
+ }
73
+
74
+ storage.close();
75
+ } catch {
76
+ // 추적 실패해도 주입은 계속
77
+ }
78
+
79
+ const summary = allSkills.map(s => `${s.source}/${s.type}/${s.name}`).join(', ');
80
+ process.stderr.write(`[Evolution] Injected ${allSkills.length} auto skills: ${summary}\n`);
81
+ }
82
+
83
+ main();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@su-record/vibe",
3
- "version": "2.7.19",
3
+ "version": "2.7.21",
4
4
  "description": "AI Coding Framework for Claude Code — 49 agents, 41+ tools, multi-LLM orchestration",
5
5
  "type": "module",
6
6
  "main": "dist/cli/index.js",
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: arch-guard
3
- description: "Generate architecture boundary tests that mechanically enforce layer constraints."
3
+ description: "Generate architecture boundary tests that mechanically enforce layer constraints. Use when adding new modules, refactoring layers, or after detecting circular dependencies. Creates import-rule tests (e.g., 'UI must not import DB') that fail CI on violation. Must use this skill when user mentions layer enforcement, dependency rules, or architectural boundaries — even casually like 'make sure services don't import controllers'."
4
4
  triggers: [arch guard, architecture test, layer test, boundary test, structural test, arch validation]
5
5
  priority: 60
6
6
  ---
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: brand-assets
3
- description: "Auto-generate app icons and favicons from SPEC brand information using Gemini Image API"
3
+ description: "Auto-generate app icons (iOS/Android/PWA), favicons, and OG images from SPEC brand information using Gemini Image API. Use when the project needs visual brand assets, when user mentions 'icon', 'favicon', 'logo', or 'brand assets', or when a SPEC defines brand colors/identity but no assets exist yet. Outputs multiple sizes and formats ready for deployment. Not for complex illustration or marketing graphics — focused on app identity assets."
4
4
  triggers: [icon, favicon, brand, logo, app icon, branding, assets]
5
5
  priority: 65
6
6
  ---
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: capability-loop
3
- description: "When an agent fails, diagnose which capability is missing and build it into the repo."
3
+ description: "When an agent fails, diagnose which capability is missing and build it into the repo. Activates after repeated agent failures, tool errors, or when a task keeps failing in the same way. Analyzes failure transcripts, identifies the missing guardrail/tool/abstraction/doc, and creates it permanently. Use this skill whenever you see 3+ similar failures, an agent hitting the same wall repeatedly, or the user asking 'why does this keep failing'."
4
4
  triggers: [capability loop, failure loop, build capability, missing capability, agent failed, why did it fail]
5
5
  priority: 75
6
6
  ---
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: characterization-test
3
- description: "Lock existing behavior with characterization tests before modifying code."
3
+ description: "Lock existing behavior with characterization tests before modifying code. Use BEFORE any refactor, rewrite, or large-scale modification of existing code — especially legacy code without tests. Captures current input/output behavior as test cases so regressions are caught immediately. Must use this skill when touching files >200 lines with no existing tests, when user says 'refactor', 'rewrite', 'modernize', or 'clean up' existing code."
4
4
  triggers: [legacy, characterization test, lock behavior, regression prevention, before refactor, large file]
5
5
  priority: 65
6
6
  ---
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: commerce-patterns
3
- description: "E-commerce domain patterns - cart, payment, inventory with transaction safety"
3
+ description: "E-commerce domain patterns cart management, payment processing (Toss/Stripe/PG), inventory tracking, and order state machines with transaction safety. Use when implementing any shopping cart, checkout flow, payment integration, stock management, or order lifecycle. Covers idempotency keys, double-charge prevention, stock reservation, and refund flows. Must use this skill when the codebase involves e-commerce — even for seemingly simple 'add to cart' features."
4
4
  triggers: [commerce, ecommerce, cart, payment, checkout, inventory, stock, order, pg, toss, stripe]
5
5
  priority: 70
6
6
  ---
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: e2e-commerce
3
- description: "E2E test scenarios for commerce checkout and payment flows"
3
+ description: "E2E test scenarios for commerce checkout and payment flows. Provides ready-made Playwright test templates for cart→checkout→payment→confirmation flows, including PG sandbox testing (Toss/Stripe), error scenarios (payment failure, timeout, stock exhaustion), and idempotency verification. Use when writing E2E tests for any e-commerce feature — checkout, payment, order status, or refund flows."
4
4
  triggers: [e2e commerce, checkout test, payment test, order flow test]
5
5
  priority: 65
6
6
  ---
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: exec-plan
3
- description: "Convert SPEC into a self-contained execution plan that agents can run autonomously for hours."
3
+ description: "Convert SPEC into a self-contained execution plan that agents can run autonomously for hours. Use when a SPEC has 3+ phases, multiple files to change, or complex dependencies between tasks. Produces a plan with explicit file paths, interface extracts, and acceptance criteria so agents never need to 'figure out' context. Must use this skill when launching long-running autonomous work, parallelizing implementation across agents, or when user says 'execute this spec' or 'run this plan'."
4
4
  triggers: [exec plan, execution plan, autonomous plan, self-contained plan, long-running]
5
5
  priority: 70
6
6
  ---
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: parallel-research
3
- description: "Parallel research guide. Auto-activates for complex features, new technologies, security-critical work, architecture design, or technology selection decisions."
3
+ 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."
4
4
  triggers: [parallel research, complex feature, technology selection, architecture design, security critical]
5
5
  priority: 60
6
6
  ---
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: seo-checklist
3
- description: "SEO gotchas for web development - easy-to-miss items that hurt search ranking"
3
+ description: "SEO gotchas for web development easy-to-miss items that hurt search ranking. Covers meta tags, Open Graph, structured data (JSON-LD), sitemap, robots.txt, canonical URLs, and Naver/Google-specific requirements. Use when building or reviewing any public-facing web page, landing page, or marketing site. Must use this skill when user mentions SEO, search ranking, meta tags, or when deploying a web app that needs to be discoverable."
4
4
  triggers: [seo, search, meta, sitemap, schema, structured data, og, opengraph, google, naver]
5
5
  priority: 65
6
6
  ---
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: ui-ux-pro-max
3
- description: "UI/UX design intelligence with bold aesthetic direction. 50+ styles, 97 palettes, 57 font pairings, 99 UX guidelines, 25 chart types across 9 stacks."
3
+ description: "UI/UX design intelligence with bold aesthetic direction. Searchable database: 50+ styles, 97 color palettes, 57 font pairings, 99 UX guidelines, 25 chart types across 9 stacks (React, Vue, Svelte, Angular, Astro, Next.js, Flutter, Swift, Kotlin). Use when building any UI component, choosing color schemes, selecting typography, applying design patterns, or reviewing UX compliance. Must use this skill when user builds frontend — pages, components, dashboards, or landing pages — to ensure design quality beyond generic AI output."
4
4
  ---
5
5
 
6
6
  # UI/UX Pro Max - Design Intelligence
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: video-production
3
- description: "Video processing gotchas — FFmpeg, transcoding, streaming, subtitles."
3
+ description: "Video processing gotchas — FFmpeg commands, transcoding pipelines, HLS/DASH streaming setup, subtitle embedding (SRT/VTT), and thumbnail extraction. Use when the project involves any video manipulation, media processing, or streaming infrastructure. Covers codec selection, bitrate optimization, and common FFmpeg pitfalls. Must use this skill when user works with video files, mentions FFmpeg, or needs media processing — even for simple tasks like 'generate a thumbnail'."
4
4
  triggers: [video, ffmpeg, transcode, encode, stream, media, subtitle, thumbnail, hls, dash]
5
5
  priority: 60
6
6
  ---