@su-record/vibe 2.8.53 → 2.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/CLAUDE.md +1 -0
  2. package/README.ko.md +43 -128
  3. package/README.md +43 -128
  4. package/agents/teams/debug-team.md +70 -0
  5. package/agents/teams/dev-team.md +88 -0
  6. package/agents/teams/docs-team.md +80 -0
  7. package/agents/teams/figma/figma-analyst.md +52 -0
  8. package/agents/teams/figma/figma-architect.md +112 -0
  9. package/agents/teams/figma/figma-auditor.md +82 -0
  10. package/agents/teams/figma/figma-builder.md +72 -0
  11. package/agents/teams/figma-team.md +85 -0
  12. package/agents/teams/fullstack-team.md +83 -0
  13. package/agents/teams/lite-team.md +69 -0
  14. package/agents/teams/migration-team.md +78 -0
  15. package/agents/teams/refactor-team.md +94 -0
  16. package/agents/teams/research-team.md +86 -0
  17. package/agents/teams/review-debate-team.md +125 -0
  18. package/agents/teams/security-team.md +81 -0
  19. package/commands/vibe.review.md +1 -63
  20. package/commands/vibe.run.md +8 -376
  21. package/commands/vibe.spec.md +1 -59
  22. package/commands/vibe.spec.review.md +1 -45
  23. package/dist/cli/postinstall/main.d.ts.map +1 -1
  24. package/dist/cli/postinstall/main.js +40 -66
  25. package/dist/cli/postinstall/main.js.map +1 -1
  26. package/dist/infra/lib/CostAccumulator.d.ts +58 -0
  27. package/dist/infra/lib/CostAccumulator.d.ts.map +1 -0
  28. package/dist/infra/lib/CostAccumulator.js +131 -0
  29. package/dist/infra/lib/CostAccumulator.js.map +1 -0
  30. package/hooks/scripts/figma-refine.js +315 -0
  31. package/hooks/scripts/figma-to-scss.js +394 -0
  32. package/hooks/scripts/figma-validate.js +353 -0
  33. package/package.json +1 -1
  34. package/skills/vibe.figma/SKILL.md +92 -24
  35. package/skills/vibe.figma/templates/component-spec.md +168 -0
  36. package/skills/vibe.figma.convert/SKILL.md +39 -3
  37. package/skills/vibe.figma.convert/rubrics/conversion-rules.md +12 -0
  38. package/skills/vibe.figma.extract/SKILL.md +29 -1
  39. package/skills/vibe.figma.extract/rubrics/image-rules.md +15 -3
@@ -93,42 +93,21 @@ export function main() {
93
93
  }
94
94
  // 인라인 기본 스킬 추가 (번들에 없는 추가 스킬)
95
95
  seedInlineSkills(coreSkillsDir);
96
- // vibe/ui-ux-data 복사 (UI/UX Design Intelligence CSV 데이터)
97
- const uiUxDataSource = path.join(packageRoot, 'vibe', 'ui-ux-data');
98
- const globalUiUxDataDir = path.join(globalCoreAssetsDir, 'ui-ux-data');
99
- if (fs.existsSync(uiUxDataSource)) {
100
- if (fs.existsSync(globalUiUxDataDir)) {
101
- removeDirRecursive(globalUiUxDataDir);
96
+ // 독립 디렉토리 복사 — 병렬 실행 (서로 다른 대상 경로, 의존성 없음)
97
+ const parallelCopies = [
98
+ { source: path.join(packageRoot, 'vibe', 'ui-ux-data'), target: path.join(globalCoreAssetsDir, 'ui-ux-data'), label: 'ui-ux-data' },
99
+ { source: path.join(packageRoot, 'vibe', 'rules'), target: path.join(globalCoreAssetsDir, 'rules'), label: 'rules' },
100
+ { source: path.join(packageRoot, 'vibe', 'templates'), target: path.join(globalCoreAssetsDir, 'templates'), label: 'templates' },
101
+ { source: path.join(packageRoot, 'languages'), target: path.join(globalCoreAssetsDir, 'languages'), label: 'languages' },
102
+ ];
103
+ for (const { source, target } of parallelCopies) {
104
+ if (fs.existsSync(source)) {
105
+ if (fs.existsSync(target))
106
+ removeDirRecursive(target);
107
+ copyDirRecursive(source, target);
102
108
  }
103
- copyDirRecursive(uiUxDataSource, globalUiUxDataDir);
104
109
  }
105
- // vibe/rules 복사
106
- const rulesSource = path.join(packageRoot, 'vibe', 'rules');
107
- const globalRulesDir = path.join(globalCoreAssetsDir, 'rules');
108
- if (fs.existsSync(rulesSource)) {
109
- if (fs.existsSync(globalRulesDir)) {
110
- removeDirRecursive(globalRulesDir);
111
- }
112
- copyDirRecursive(rulesSource, globalRulesDir);
113
- }
114
- // vibe/templates 복사
115
- const templatesSource = path.join(packageRoot, 'vibe', 'templates');
116
- const globalTemplatesDir = path.join(globalCoreAssetsDir, 'templates');
117
- if (fs.existsSync(templatesSource)) {
118
- if (fs.existsSync(globalTemplatesDir)) {
119
- removeDirRecursive(globalTemplatesDir);
120
- }
121
- copyDirRecursive(templatesSource, globalTemplatesDir);
122
- }
123
- // languages 복사
124
- const languagesSource = path.join(packageRoot, 'languages');
125
110
  const globalLanguagesDir = path.join(globalCoreAssetsDir, 'languages');
126
- if (fs.existsSync(languagesSource)) {
127
- if (fs.existsSync(globalLanguagesDir)) {
128
- removeDirRecursive(globalLanguagesDir);
129
- }
130
- copyDirRecursive(languagesSource, globalLanguagesDir);
131
- }
132
111
  // 5-1. 레거시 설정 파일 → ~/.vibe/config.json 마이그레이션
133
112
  try {
134
113
  migrateLegacyFiles();
@@ -144,44 +123,39 @@ export function main() {
144
123
  // 모든 설정은 ~/.vibe/config.json에서 관리 (vibe gpt key, vibe gemini key)
145
124
  // 6-4. 전역 env 설정 (Agent Teams 등 모든 프로젝트에 필요한 환경변수)
146
125
  ensureGlobalEnvSettings();
147
- // 7. Cursor IDE 지원 - ~/.cursor/agents/에 변환된 서브에이전트 설치
126
+ // 7-9. IDE 지원: Cursor agents + rules + skills (독립 작업)
148
127
  const cursorAgentsDir = path.join(os.homedir(), '.cursor', 'agents');
149
- installCursorAgents(agentsSource, cursorAgentsDir);
150
- // 8. Cursor 프로젝트 룰 템플릿 생성 - ~/.cursor/rules-template/
151
- // 프로젝트별로 .cursor/rules/에 복사해서 사용
152
- // postinstall에서는 스택 감지 없이 공통 룰만 생성
153
128
  const cursorRulesTemplateDir = path.join(os.homedir(), '.cursor', 'rules-template');
154
- generateCursorRules(cursorRulesTemplateDir, [], globalLanguagesDir);
155
- // 9. Cursor Skills 생성 - ~/.cursor/skills/
156
- // VIBE 커맨드를 Cursor 스킬로 변환
157
129
  const cursorSkillsDir = path.join(os.homedir(), '.cursor', 'skills');
130
+ installCursorAgents(agentsSource, cursorAgentsDir);
131
+ generateCursorRules(cursorRulesTemplateDir, [], globalLanguagesDir);
158
132
  generateCursorSkills(cursorSkillsDir);
159
- // 10. Codex CLI 지원 (플러그인 시스템)
160
- try {
161
- const codexStatus = detectCodexCli();
162
- if (codexStatus.installed) {
163
- installCodexPlugin(agentsSource, skillsSource, codexStatus.configDir, packageRoot);
164
- console.log(`✅ codex plugin installed: ${codexStatus.pluginDir}`);
133
+ // 10-11. 외부 CLI 지원 (Codex + Gemini — 비필수, 실패 허용)
134
+ const cliPlugins = [];
135
+ cliPlugins.push({ name: 'codex', fn: () => {
136
+ const codexStatus = detectCodexCli();
137
+ if (codexStatus.installed) {
138
+ installCodexPlugin(agentsSource, skillsSource, codexStatus.configDir, packageRoot);
139
+ console.log(`✅ codex plugin installed: ${codexStatus.pluginDir}`);
140
+ }
141
+ } });
142
+ cliPlugins.push({ name: 'gemini', fn: () => {
143
+ const geminiStatus = detectGeminiCli();
144
+ if (geminiStatus.installed) {
145
+ const geminiAgentsDir = path.join(geminiStatus.configDir, 'agents');
146
+ installGeminiAgents(agentsSource, geminiAgentsDir);
147
+ const geminiSkillsDir = path.join(geminiStatus.configDir, 'skills');
148
+ removeLegacySkills(geminiSkillsDir, LEGACY_SKILL_DIRS);
149
+ copySkillsFiltered(skillsSource, geminiSkillsDir, GLOBAL_SKILLS);
150
+ generateGeminiMd(geminiStatus.configDir, packageRoot);
151
+ console.log(`✅ gemini agents/skills installed: ${geminiStatus.configDir}`);
152
+ }
153
+ } });
154
+ for (const plugin of cliPlugins) {
155
+ try {
156
+ plugin.fn();
165
157
  }
166
- }
167
- catch {
168
- // Non-critical — don't fail postinstall
169
- }
170
- // 11. Gemini CLI 지원
171
- try {
172
- const geminiStatus = detectGeminiCli();
173
- if (geminiStatus.installed) {
174
- const geminiAgentsDir = path.join(geminiStatus.configDir, 'agents');
175
- installGeminiAgents(agentsSource, geminiAgentsDir);
176
- const geminiSkillsDir = path.join(geminiStatus.configDir, 'skills');
177
- removeLegacySkills(geminiSkillsDir, LEGACY_SKILL_DIRS);
178
- copySkillsFiltered(skillsSource, geminiSkillsDir, GLOBAL_SKILLS);
179
- generateGeminiMd(geminiStatus.configDir, packageRoot);
180
- console.log(`✅ gemini agents/skills installed: ${geminiStatus.configDir}`);
181
- }
182
- }
183
- catch {
184
- // Non-critical — don't fail postinstall
158
+ catch { /* Non-critical */ }
185
159
  }
186
160
  // 12. Claude Code CLI 존재 확인 (인증은 vibe init에서)
187
161
  const claudeStatus = getClaudeCodeStatus(false);
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../../../src/cli/postinstall/main.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../../src/cli/postinstall/main.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * CostAccumulator — JSONL 비용 로그 조회 및 프로젝트별 예산 관리
3
+ * hooks/scripts/utils.js의 logLlmCost()가 기록한 ~/.vibe/llm-costs.jsonl을 읽는다.
4
+ */
5
+ export interface CostEntry {
6
+ ts: string;
7
+ provider: string;
8
+ model: string;
9
+ inputTokens: number;
10
+ outputTokens: number;
11
+ cost: number;
12
+ durationMs: number;
13
+ cached: boolean;
14
+ project: string;
15
+ }
16
+ export interface CostSummary {
17
+ totalCost: number;
18
+ totalEntries: number;
19
+ byModel: Record<string, number>;
20
+ byProvider: Record<string, number>;
21
+ period: {
22
+ from: string | null;
23
+ to: string | null;
24
+ };
25
+ }
26
+ export interface BudgetConfig {
27
+ monthlyLlmUsd: number;
28
+ alertThresholdPercent: number;
29
+ blockingThresholdPercent: number;
30
+ }
31
+ export interface BudgetCheck {
32
+ allowed: boolean;
33
+ currentSpend: number;
34
+ budget: number;
35
+ usagePercent: number;
36
+ level: 'ok' | 'alert' | 'blocking';
37
+ }
38
+ export declare class CostAccumulator {
39
+ /**
40
+ * 프로젝트별 비용 조회
41
+ */
42
+ static queryProjectCosts(projectPath: string, filter?: {
43
+ since?: Date;
44
+ model?: string;
45
+ provider?: string;
46
+ }): CostSummary;
47
+ /**
48
+ * 전체 비용 프로젝트별 집계
49
+ */
50
+ static queryAllCosts(since?: Date): Map<string, number>;
51
+ /**
52
+ * 이번 달 프로젝트 비용 vs 예산 확인
53
+ */
54
+ static checkBudget(projectPath: string, budget?: Partial<BudgetConfig>): BudgetCheck;
55
+ private static readEntries;
56
+ private static summarize;
57
+ }
58
+ //# sourceMappingURL=CostAccumulator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CostAccumulator.d.ts","sourceRoot":"","sources":["../../../src/infra/lib/CostAccumulator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;CACpD;AAED,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,wBAAwB,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,IAAI,GAAG,OAAO,GAAG,UAAU,CAAC;CACpC;AAmBD,qBAAa,eAAe;IAC1B;;OAEG;IACH,MAAM,CAAC,iBAAiB,CACtB,WAAW,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,IAAI,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAC3D,WAAW;IAYd;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,IAAI,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAWvD;;OAEG;IACH,MAAM,CAAC,WAAW,CAChB,WAAW,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAC7B,WAAW;IA8Bd,OAAO,CAAC,MAAM,CAAC,WAAW;IAqB1B,OAAO,CAAC,MAAM,CAAC,SAAS;CAuBzB"}
@@ -0,0 +1,131 @@
1
+ /**
2
+ * CostAccumulator — JSONL 비용 로그 조회 및 프로젝트별 예산 관리
3
+ * hooks/scripts/utils.js의 logLlmCost()가 기록한 ~/.vibe/llm-costs.jsonl을 읽는다.
4
+ */
5
+ import fs from 'fs';
6
+ import path from 'path';
7
+ import os from 'os';
8
+ // ============================================================================
9
+ // Constants
10
+ // ============================================================================
11
+ const COST_LOG_PATH = path.join(os.homedir(), '.vibe', 'llm-costs.jsonl');
12
+ const COST_LOG_PREV = COST_LOG_PATH + '.prev';
13
+ const DEFAULT_BUDGET = {
14
+ monthlyLlmUsd: 0, // 0 = unlimited
15
+ alertThresholdPercent: 80,
16
+ blockingThresholdPercent: 95,
17
+ };
18
+ // ============================================================================
19
+ // CostAccumulator
20
+ // ============================================================================
21
+ export class CostAccumulator {
22
+ /**
23
+ * 프로젝트별 비용 조회
24
+ */
25
+ static queryProjectCosts(projectPath, filter) {
26
+ const entries = CostAccumulator.readEntries();
27
+ const filtered = entries.filter((e) => {
28
+ if (e.project !== projectPath)
29
+ return false;
30
+ if (filter?.since && new Date(e.ts) < filter.since)
31
+ return false;
32
+ if (filter?.model && e.model !== filter.model)
33
+ return false;
34
+ if (filter?.provider && e.provider !== filter.provider)
35
+ return false;
36
+ return true;
37
+ });
38
+ return CostAccumulator.summarize(filtered);
39
+ }
40
+ /**
41
+ * 전체 비용 프로젝트별 집계
42
+ */
43
+ static queryAllCosts(since) {
44
+ const entries = CostAccumulator.readEntries();
45
+ const result = new Map();
46
+ for (const e of entries) {
47
+ if (since && new Date(e.ts) < since)
48
+ continue;
49
+ const current = result.get(e.project) || 0;
50
+ result.set(e.project, current + e.cost);
51
+ }
52
+ return result;
53
+ }
54
+ /**
55
+ * 이번 달 프로젝트 비용 vs 예산 확인
56
+ */
57
+ static checkBudget(projectPath, budget) {
58
+ const cfg = { ...DEFAULT_BUDGET, ...budget };
59
+ if (cfg.monthlyLlmUsd <= 0) {
60
+ return { allowed: true, currentSpend: 0, budget: 0, usagePercent: 0, level: 'ok' };
61
+ }
62
+ const monthStart = new Date();
63
+ monthStart.setDate(1);
64
+ monthStart.setHours(0, 0, 0, 0);
65
+ const summary = CostAccumulator.queryProjectCosts(projectPath, { since: monthStart });
66
+ const usagePercent = (summary.totalCost / cfg.monthlyLlmUsd) * 100;
67
+ let level = 'ok';
68
+ if (usagePercent >= cfg.blockingThresholdPercent)
69
+ level = 'blocking';
70
+ else if (usagePercent >= cfg.alertThresholdPercent)
71
+ level = 'alert';
72
+ return {
73
+ allowed: level !== 'blocking',
74
+ currentSpend: Math.round(summary.totalCost * 10000) / 10000,
75
+ budget: cfg.monthlyLlmUsd,
76
+ usagePercent: Math.round(usagePercent * 100) / 100,
77
+ level,
78
+ };
79
+ }
80
+ // ==========================================================================
81
+ // Private helpers
82
+ // ==========================================================================
83
+ static readEntries() {
84
+ const entries = [];
85
+ for (const filepath of [COST_LOG_PREV, COST_LOG_PATH]) {
86
+ if (!fs.existsSync(filepath))
87
+ continue;
88
+ try {
89
+ const content = fs.readFileSync(filepath, 'utf-8');
90
+ for (const line of content.split('\n')) {
91
+ if (!line.trim())
92
+ continue;
93
+ try {
94
+ entries.push(JSON.parse(line));
95
+ }
96
+ catch {
97
+ // skip malformed lines
98
+ }
99
+ }
100
+ }
101
+ catch {
102
+ // skip unreadable files
103
+ }
104
+ }
105
+ return entries;
106
+ }
107
+ static summarize(entries) {
108
+ const byModel = {};
109
+ const byProvider = {};
110
+ let totalCost = 0;
111
+ let from = null;
112
+ let to = null;
113
+ for (const e of entries) {
114
+ totalCost += e.cost;
115
+ byModel[e.model] = (byModel[e.model] || 0) + e.cost;
116
+ byProvider[e.provider] = (byProvider[e.provider] || 0) + e.cost;
117
+ if (!from || e.ts < from)
118
+ from = e.ts;
119
+ if (!to || e.ts > to)
120
+ to = e.ts;
121
+ }
122
+ return {
123
+ totalCost: Math.round(totalCost * 10000) / 10000,
124
+ totalEntries: entries.length,
125
+ byModel,
126
+ byProvider,
127
+ period: { from, to },
128
+ };
129
+ }
130
+ }
131
+ //# sourceMappingURL=CostAccumulator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CostAccumulator.js","sourceRoot":"","sources":["../../../src/infra/lib/CostAccumulator.ts"],"names":[],"mappings":"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"}