@su-record/vibe 2.5.10 → 2.5.12

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 (59) hide show
  1. package/CLAUDE.md +460 -117
  2. package/agents/architect-low.md +41 -0
  3. package/agents/architect-medium.md +59 -0
  4. package/agents/architect.md +80 -0
  5. package/agents/explorer-low.md +42 -0
  6. package/agents/explorer-medium.md +59 -0
  7. package/agents/implementer-low.md +43 -0
  8. package/agents/implementer-medium.md +52 -0
  9. package/commands/vibe.run.md +41 -21
  10. package/dist/cli/postinstall.js +180 -2
  11. package/dist/cli/postinstall.js.map +1 -1
  12. package/dist/lib/DeepInit.d.ts +60 -0
  13. package/dist/lib/DeepInit.d.ts.map +1 -0
  14. package/dist/lib/DeepInit.js +245 -0
  15. package/dist/lib/DeepInit.js.map +1 -0
  16. package/dist/lib/IterationTracker.d.ts +79 -0
  17. package/dist/lib/IterationTracker.d.ts.map +1 -0
  18. package/dist/lib/IterationTracker.js +188 -0
  19. package/dist/lib/IterationTracker.js.map +1 -0
  20. package/dist/lib/ModelRouter.d.ts +48 -0
  21. package/dist/lib/ModelRouter.d.ts.map +1 -0
  22. package/dist/lib/ModelRouter.js +216 -0
  23. package/dist/lib/ModelRouter.js.map +1 -0
  24. package/dist/lib/OrchestrateWorkflow.d.ts +88 -0
  25. package/dist/lib/OrchestrateWorkflow.d.ts.map +1 -0
  26. package/dist/lib/OrchestrateWorkflow.js +259 -0
  27. package/dist/lib/OrchestrateWorkflow.js.map +1 -0
  28. package/dist/lib/SkillFrontmatter.d.ts +62 -0
  29. package/dist/lib/SkillFrontmatter.d.ts.map +1 -0
  30. package/dist/lib/SkillFrontmatter.js +219 -0
  31. package/dist/lib/SkillFrontmatter.js.map +1 -0
  32. package/dist/lib/SkillQualityGate.d.ts +38 -0
  33. package/dist/lib/SkillQualityGate.d.ts.map +1 -0
  34. package/dist/lib/SkillQualityGate.js +216 -0
  35. package/dist/lib/SkillQualityGate.js.map +1 -0
  36. package/dist/lib/SkillRepository.d.ts +117 -0
  37. package/dist/lib/SkillRepository.d.ts.map +1 -0
  38. package/dist/lib/SkillRepository.js +477 -0
  39. package/dist/lib/SkillRepository.js.map +1 -0
  40. package/dist/lib/UltraQA.d.ts +68 -0
  41. package/dist/lib/UltraQA.d.ts.map +1 -0
  42. package/dist/lib/UltraQA.js +232 -0
  43. package/dist/lib/UltraQA.js.map +1 -0
  44. package/dist/orchestrator/backgroundAgent.d.ts +0 -1
  45. package/dist/orchestrator/backgroundAgent.d.ts.map +1 -1
  46. package/dist/orchestrator/backgroundAgent.js +0 -1
  47. package/dist/orchestrator/backgroundAgent.js.map +1 -1
  48. package/dist/tools/index.d.ts +9 -0
  49. package/dist/tools/index.d.ts.map +1 -1
  50. package/dist/tools/index.js +14 -0
  51. package/dist/tools/index.js.map +1 -1
  52. package/hooks/hooks.json +21 -3
  53. package/hooks/scripts/hud-multiline.js +262 -0
  54. package/hooks/scripts/hud-status.js +291 -0
  55. package/hooks/scripts/keyword-detector.js +214 -0
  56. package/hooks/scripts/post-tool-verify.js +210 -0
  57. package/hooks/scripts/pre-tool-guard.js +125 -0
  58. package/hooks/scripts/skill-injector.js +191 -0
  59. package/package.json +1 -1
@@ -0,0 +1,219 @@
1
+ /**
2
+ * Skill Frontmatter System
3
+ * YAML metadata for declarative skill configuration
4
+ */
5
+ /**
6
+ * Parse YAML frontmatter from skill file
7
+ */
8
+ export function parseSkillFrontmatter(content) {
9
+ // Check for frontmatter delimiter
10
+ if (!content.startsWith('---')) {
11
+ return null;
12
+ }
13
+ // Find end of frontmatter
14
+ const endIndex = content.indexOf('---', 3);
15
+ if (endIndex === -1) {
16
+ return null;
17
+ }
18
+ const frontmatter = content.slice(3, endIndex).trim();
19
+ const template = content.slice(endIndex + 3).trim();
20
+ // Parse YAML (simple implementation)
21
+ const metadata = parseSimpleYaml(frontmatter);
22
+ if (!metadata.name) {
23
+ return null;
24
+ }
25
+ return {
26
+ metadata: metadata,
27
+ template,
28
+ raw: content,
29
+ };
30
+ }
31
+ /**
32
+ * Simple YAML parser for frontmatter
33
+ */
34
+ function parseSimpleYaml(yaml) {
35
+ const result = {};
36
+ const lines = yaml.split('\n');
37
+ for (const line of lines) {
38
+ const trimmed = line.trim();
39
+ if (!trimmed || trimmed.startsWith('#'))
40
+ continue;
41
+ const colonIndex = trimmed.indexOf(':');
42
+ if (colonIndex === -1)
43
+ continue;
44
+ const key = trimmed.slice(0, colonIndex).trim();
45
+ let value = trimmed.slice(colonIndex + 1).trim();
46
+ // Handle different value types
47
+ if (value === 'true')
48
+ value = true;
49
+ else if (value === 'false')
50
+ value = false;
51
+ else if (/^\d+$/.test(value))
52
+ value = parseInt(value, 10);
53
+ else if (value.startsWith('[') && value.endsWith(']')) {
54
+ // Parse simple array
55
+ value = value
56
+ .slice(1, -1)
57
+ .split(',')
58
+ .map(v => v.trim().replace(/^["']|["']$/g, ''))
59
+ .filter(Boolean);
60
+ }
61
+ else if (value.startsWith('"') || value.startsWith("'")) {
62
+ // Remove quotes
63
+ value = value.slice(1, -1);
64
+ }
65
+ // Convert kebab-case to camelCase
66
+ const camelKey = key.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
67
+ result[camelKey] = value;
68
+ }
69
+ return result;
70
+ }
71
+ /**
72
+ * Generate skill frontmatter
73
+ */
74
+ export function generateSkillFrontmatter(metadata) {
75
+ const lines = ['---'];
76
+ lines.push(`name: ${metadata.name}`);
77
+ lines.push(`description: "${metadata.description}"`);
78
+ if (metadata.model) {
79
+ lines.push(`model: ${metadata.model}`);
80
+ }
81
+ if (metadata.agent) {
82
+ lines.push(`agent: ${metadata.agent}`);
83
+ }
84
+ if (metadata.argumentHint) {
85
+ lines.push(`argument-hint: "${metadata.argumentHint}"`);
86
+ }
87
+ if (metadata.userInvocable !== undefined) {
88
+ lines.push(`user-invocable: ${metadata.userInvocable}`);
89
+ }
90
+ if (metadata.subtask !== undefined) {
91
+ lines.push(`subtask: ${metadata.subtask}`);
92
+ }
93
+ if (metadata.allowedTools && metadata.allowedTools.length > 0) {
94
+ lines.push(`allowed-tools: [${metadata.allowedTools.join(', ')}]`);
95
+ }
96
+ if (metadata.triggers && metadata.triggers.length > 0) {
97
+ lines.push(`triggers: [${metadata.triggers.join(', ')}]`);
98
+ }
99
+ if (metadata.priority !== undefined) {
100
+ lines.push(`priority: ${metadata.priority}`);
101
+ }
102
+ lines.push('---');
103
+ return lines.join('\n');
104
+ }
105
+ /**
106
+ * Create full skill file content
107
+ */
108
+ export function createSkillFile(metadata, template) {
109
+ const frontmatter = generateSkillFrontmatter(metadata);
110
+ return `${frontmatter}\n\n${template}`;
111
+ }
112
+ /**
113
+ * Validate skill metadata
114
+ */
115
+ export function validateSkillMetadata(metadata) {
116
+ const errors = [];
117
+ if (!metadata.name) {
118
+ errors.push('Missing required field: name');
119
+ }
120
+ if (!metadata.description) {
121
+ errors.push('Missing required field: description');
122
+ }
123
+ if (metadata.model && !['haiku', 'sonnet', 'opus'].includes(metadata.model)) {
124
+ errors.push(`Invalid model: ${metadata.model}. Must be haiku, sonnet, or opus`);
125
+ }
126
+ if (metadata.priority !== undefined && (metadata.priority < 0 || metadata.priority > 100)) {
127
+ errors.push('Priority must be between 0 and 100');
128
+ }
129
+ return {
130
+ valid: errors.length === 0,
131
+ errors,
132
+ };
133
+ }
134
+ /**
135
+ * Merge skill metadata with defaults
136
+ */
137
+ export function mergeWithDefaults(metadata) {
138
+ return {
139
+ name: metadata.name || 'unnamed-skill',
140
+ description: metadata.description || 'No description',
141
+ model: metadata.model,
142
+ agent: metadata.agent,
143
+ argumentHint: metadata.argumentHint,
144
+ userInvocable: metadata.userInvocable ?? true,
145
+ subtask: metadata.subtask ?? false,
146
+ allowedTools: metadata.allowedTools,
147
+ triggers: metadata.triggers,
148
+ priority: metadata.priority ?? 50,
149
+ mcpConfig: metadata.mcpConfig,
150
+ };
151
+ }
152
+ /**
153
+ * Extract triggers from skill template
154
+ */
155
+ export function extractTriggersFromTemplate(template) {
156
+ const triggers = [];
157
+ // Look for keyword patterns in template
158
+ const keywordPatterns = [
159
+ /\bwhen\s+(\w+)/gi,
160
+ /\bif\s+(\w+)/gi,
161
+ /\b(\w+)\s+detected/gi,
162
+ /trigger:\s*(\w+)/gi,
163
+ ];
164
+ for (const pattern of keywordPatterns) {
165
+ let match;
166
+ while ((match = pattern.exec(template)) !== null) {
167
+ const keyword = match[1].toLowerCase();
168
+ if (keyword.length > 2 && !triggers.includes(keyword)) {
169
+ triggers.push(keyword);
170
+ }
171
+ }
172
+ }
173
+ return triggers;
174
+ }
175
+ /**
176
+ * Substitute template variables
177
+ */
178
+ export function substituteTemplateVars(template, vars) {
179
+ let result = template;
180
+ for (const [key, value] of Object.entries(vars)) {
181
+ // Support both {{VAR}} and $VAR patterns
182
+ result = result.replace(new RegExp(`\\{\\{${key}\\}\\}`, 'g'), value);
183
+ result = result.replace(new RegExp(`\\$${key}\\b`, 'g'), value);
184
+ }
185
+ return result;
186
+ }
187
+ /**
188
+ * Example skill template
189
+ */
190
+ export const SKILL_TEMPLATE_EXAMPLE = `---
191
+ name: example-skill
192
+ description: "An example skill demonstrating the frontmatter system"
193
+ model: sonnet
194
+ agent: implementer
195
+ argument-hint: "task description"
196
+ user-invocable: true
197
+ triggers: [example, demo, test]
198
+ priority: 50
199
+ ---
200
+
201
+ # Example Skill
202
+
203
+ This skill demonstrates the frontmatter metadata system.
204
+
205
+ ## Arguments
206
+
207
+ $ARGUMENTS
208
+
209
+ ## Process
210
+
211
+ 1. Parse the arguments
212
+ 2. Execute the task
213
+ 3. Return the result
214
+
215
+ ## Output
216
+
217
+ Provide a clear summary of what was done.
218
+ `;
219
+ //# sourceMappingURL=SkillFrontmatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SkillFrontmatter.js","sourceRoot":"","sources":["../../src/lib/SkillFrontmatter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Skill Quality Gate
3
+ * 저장할 메모리/스킬의 품질을 검증
4
+ */
5
+ export interface QualityCheckResult {
6
+ isValid: boolean;
7
+ score: number;
8
+ issues: string[];
9
+ suggestions: string[];
10
+ category: 'principle' | 'discovery' | 'decision' | 'code' | 'generic';
11
+ }
12
+ /**
13
+ * 메모리/스킬 품질 검증
14
+ */
15
+ export declare function validateSkillQuality(key: string, value: string, category?: string): QualityCheckResult;
16
+ /**
17
+ * 원칙 형태로 변환 도우미
18
+ */
19
+ export declare function suggestPrincipleFormat(value: string): string;
20
+ /**
21
+ * 스킬 분류
22
+ */
23
+ export declare function classifySkill(value: string): {
24
+ type: 'principle' | 'discovery' | 'decision' | 'reference' | 'generic';
25
+ confidence: number;
26
+ };
27
+ /**
28
+ * 저장 전 검증 래퍼
29
+ */
30
+ export declare function validateBeforeSave(key: string, value: string, options?: {
31
+ bypassValidation?: boolean;
32
+ minScore?: number;
33
+ }): {
34
+ canSave: boolean;
35
+ result: QualityCheckResult;
36
+ formattedFeedback: string;
37
+ };
38
+ //# sourceMappingURL=SkillQualityGate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SkillQualityGate.d.ts","sourceRoot":"","sources":["../../src/lib/SkillQualityGate.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,WAAW,GAAG,WAAW,GAAG,UAAU,GAAG,MAAM,GAAG,SAAS,CAAC;CACvE;AAoDD;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,GAChB,kBAAkB,CAyFpB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAiB5D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG;IAC5C,IAAI,EAAE,WAAW,GAAG,WAAW,GAAG,UAAU,GAAG,WAAW,GAAG,SAAS,CAAC;IACvE,UAAU,EAAE,MAAM,CAAC;CACpB,CAsCA;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;IAAE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1D;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,kBAAkB,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAA;CAAE,CA6B7E"}
@@ -0,0 +1,216 @@
1
+ /**
2
+ * Skill Quality Gate
3
+ * 저장할 메모리/스킬의 품질을 검증
4
+ */
5
+ // 거부할 패턴 (너무 일반적이거나 쉽게 검색 가능한 정보)
6
+ const REJECT_PATTERNS = [
7
+ // 일반적인 정보
8
+ /^(how to|what is|definition of)/i,
9
+ /^(npm install|pip install|cargo add)/i,
10
+ /^(import|from .* import|require\()/i,
11
+ // 단순 명령어
12
+ /^(git (add|commit|push|pull|merge|checkout))/i,
13
+ /^(docker (run|build|pull|push))/i,
14
+ /^(kubectl (get|apply|delete))/i,
15
+ // 너무 짧은 내용
16
+ /^.{0,20}$/,
17
+ // 일반적인 best practice (검색 가능)
18
+ /^(always use|never use|prefer|avoid)/i,
19
+ /^(use (async|await|promises))/i,
20
+ /^(handle (errors?|exceptions?))/i,
21
+ ];
22
+ // 가치 있는 패턴 (원칙, 발견, 결정)
23
+ const VALUE_PATTERNS = [
24
+ // 프로젝트 특정 결정
25
+ { pattern: /we (decided|chose|agreed|concluded)/i, category: 'decision', score: 20 },
26
+ { pattern: /after (debugging|investigating|researching)/i, category: 'discovery', score: 25 },
27
+ { pattern: /the root cause (is|was)/i, category: 'discovery', score: 30 },
28
+ // 원칙/휴리스틱
29
+ { pattern: /when .* then .* because/i, category: 'principle', score: 25 },
30
+ { pattern: /if .* fails?, (check|try|verify)/i, category: 'principle', score: 20 },
31
+ { pattern: /the trick (is|was) to/i, category: 'discovery', score: 25 },
32
+ // 구체적인 파일/라인 참조
33
+ { pattern: /in (file|path|line) [`"]?[\w/.:-]+[`"]?/i, category: 'code', score: 15 },
34
+ { pattern: /at line \d+/i, category: 'code', score: 10 },
35
+ { pattern: /error: .{20,}/i, category: 'discovery', score: 15 },
36
+ // 아키텍처/설계 결정
37
+ { pattern: /architecture|design pattern|trade-?off/i, category: 'decision', score: 20 },
38
+ { pattern: /because (performance|security|maintainability)/i, category: 'decision', score: 20 },
39
+ ];
40
+ // 필수 요소 체크
41
+ const REQUIRED_ELEMENTS = [
42
+ { name: 'context', pattern: /\b(when|if|because|since|after)\b/i, weight: 10 },
43
+ { name: 'specificity', pattern: /\b(this|our|my|the)\s+(project|codebase|repo|app)/i, weight: 15 },
44
+ { name: 'actionable', pattern: /\b(should|must|need to|have to|try|use|avoid)\b/i, weight: 10 },
45
+ ];
46
+ /**
47
+ * 메모리/스킬 품질 검증
48
+ */
49
+ export function validateSkillQuality(key, value, category) {
50
+ const issues = [];
51
+ const suggestions = [];
52
+ let score = 50; // 기본 점수
53
+ let detectedCategory = 'generic';
54
+ // 1. 거부 패턴 체크
55
+ for (const pattern of REJECT_PATTERNS) {
56
+ if (pattern.test(value)) {
57
+ issues.push(`Too generic or easily searchable: matches pattern ${pattern}`);
58
+ score -= 30;
59
+ }
60
+ }
61
+ // 2. 최소 길이 체크
62
+ if (value.length < 50) {
63
+ issues.push('Content too short (min 50 chars)');
64
+ score -= 20;
65
+ suggestions.push('Add more context: why, when, what was the situation?');
66
+ }
67
+ // 3. 가치 패턴 체크
68
+ for (const { pattern, category: cat, score: bonus } of VALUE_PATTERNS) {
69
+ if (pattern.test(value)) {
70
+ score += bonus;
71
+ detectedCategory = cat;
72
+ }
73
+ }
74
+ // 4. 필수 요소 체크
75
+ let hasRequiredElements = 0;
76
+ for (const { name, pattern, weight } of REQUIRED_ELEMENTS) {
77
+ if (pattern.test(value)) {
78
+ score += weight;
79
+ hasRequiredElements++;
80
+ }
81
+ else {
82
+ suggestions.push(`Consider adding ${name} (${pattern.source})`);
83
+ }
84
+ }
85
+ if (hasRequiredElements < 2) {
86
+ issues.push('Missing essential elements (context, specificity, or actionability)');
87
+ score -= 15;
88
+ }
89
+ // 5. 구체적인 참조 체크 (파일 경로, 라인 번호, 에러 메시지)
90
+ const hasFilePath = /[`"]?[\w/.-]+\.(ts|js|py|go|rs|java|tsx|jsx)[`"]?/i.test(value);
91
+ const hasLineNumber = /line\s*\d+|:\d+:/i.test(value);
92
+ const hasErrorMessage = /error:|exception:|failed:/i.test(value);
93
+ if (hasFilePath)
94
+ score += 10;
95
+ if (hasLineNumber)
96
+ score += 10;
97
+ if (hasErrorMessage)
98
+ score += 10;
99
+ if (!hasFilePath && !hasLineNumber && !hasErrorMessage) {
100
+ suggestions.push('Add specific references: file paths, line numbers, or error messages');
101
+ }
102
+ // 6. 원칙 형태 체크 ("when X, do Y because Z")
103
+ const isPrincipleForm = /when.*,.*because|if.*then.*because/i.test(value);
104
+ if (isPrincipleForm) {
105
+ score += 20;
106
+ detectedCategory = 'principle';
107
+ }
108
+ else {
109
+ suggestions.push('Consider reformulating as a principle: "When [situation], [action] because [reason]"');
110
+ }
111
+ // 7. 키 품질 체크
112
+ if (key.length < 5) {
113
+ issues.push('Key too short');
114
+ score -= 10;
115
+ }
116
+ if (!/^[a-z0-9-]+$/i.test(key.replace(/\s+/g, '-'))) {
117
+ suggestions.push('Use kebab-case for key (e.g., "auth-token-refresh-strategy")');
118
+ }
119
+ // 점수 정규화 (0-100)
120
+ score = Math.max(0, Math.min(100, score));
121
+ // 임계값: 60점 이상이면 통과
122
+ const isValid = score >= 60 && issues.length === 0;
123
+ return {
124
+ isValid,
125
+ score,
126
+ issues,
127
+ suggestions,
128
+ category: detectedCategory,
129
+ };
130
+ }
131
+ /**
132
+ * 원칙 형태로 변환 도우미
133
+ */
134
+ export function suggestPrincipleFormat(value) {
135
+ // 이미 원칙 형태면 그대로 반환
136
+ if (/when.*because|if.*then.*because/i.test(value)) {
137
+ return value;
138
+ }
139
+ // 변환 템플릿 제안
140
+ return `Consider reformulating as:
141
+
142
+ "When [describe the situation/trigger],
143
+ [describe the action to take]
144
+ because [explain the reasoning/tradeoff]"
145
+
146
+ Example:
147
+ "When the auth token expires during a request,
148
+ retry the request after refreshing the token (not before)
149
+ because refreshing preemptively causes race conditions with concurrent requests"`;
150
+ }
151
+ /**
152
+ * 스킬 분류
153
+ */
154
+ export function classifySkill(value) {
155
+ const scores = {
156
+ principle: 0,
157
+ discovery: 0,
158
+ decision: 0,
159
+ reference: 0,
160
+ generic: 20, // 기본
161
+ };
162
+ // 원칙
163
+ if (/when.*then|if.*should|always.*because|never.*because/i.test(value)) {
164
+ scores.principle += 30;
165
+ }
166
+ // 발견
167
+ if (/found|discovered|realized|root cause|after debugging/i.test(value)) {
168
+ scores.discovery += 30;
169
+ }
170
+ // 결정
171
+ if (/decided|chose|agreed|will use|architecture|design/i.test(value)) {
172
+ scores.decision += 30;
173
+ }
174
+ // 참조 (파일/코드 중심)
175
+ if (/\.(ts|js|py|go)\b.*:\d+|file:|path:/i.test(value)) {
176
+ scores.reference += 30;
177
+ }
178
+ // 최고 점수 타입 선택
179
+ const entries = Object.entries(scores);
180
+ entries.sort((a, b) => b[1] - a[1]);
181
+ const [type, score] = entries[0];
182
+ const total = Object.values(scores).reduce((a, b) => a + b, 0);
183
+ const confidence = Math.round((score / total) * 100);
184
+ return { type, confidence };
185
+ }
186
+ /**
187
+ * 저장 전 검증 래퍼
188
+ */
189
+ export function validateBeforeSave(key, value, options) {
190
+ if (options?.bypassValidation) {
191
+ return {
192
+ canSave: true,
193
+ result: { isValid: true, score: 100, issues: [], suggestions: [], category: 'generic' },
194
+ formattedFeedback: '⚠️ Validation bypassed',
195
+ };
196
+ }
197
+ const result = validateSkillQuality(key, value);
198
+ const minScore = options?.minScore ?? 60;
199
+ const canSave = result.score >= minScore && result.issues.length === 0;
200
+ let feedback = '';
201
+ if (canSave) {
202
+ feedback = `✅ Quality check passed (score: ${result.score}/100, category: ${result.category})`;
203
+ }
204
+ else {
205
+ feedback = `❌ Quality check failed (score: ${result.score}/100)\n`;
206
+ if (result.issues.length > 0) {
207
+ feedback += `\nIssues:\n${result.issues.map(i => ` - ${i}`).join('\n')}`;
208
+ }
209
+ if (result.suggestions.length > 0) {
210
+ feedback += `\n\nSuggestions:\n${result.suggestions.map(s => ` - ${s}`).join('\n')}`;
211
+ }
212
+ feedback += `\n\n${suggestPrincipleFormat(value)}`;
213
+ }
214
+ return { canSave, result, formattedFeedback: feedback };
215
+ }
216
+ //# sourceMappingURL=SkillQualityGate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SkillQualityGate.js","sourceRoot":"","sources":["../../src/lib/SkillQualityGate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Skill Repository - ~/.claude/vibe/skills/ 저장소 관리
3
+ *
4
+ * 기본 스킬 세트를 전역 위치에 설치하고 관리
5
+ */
6
+ import { SkillMetadata } from './SkillFrontmatter.js';
7
+ export interface SkillInfo {
8
+ id: string;
9
+ name: string;
10
+ description: string;
11
+ path: string;
12
+ source: 'user' | 'default';
13
+ metadata?: SkillMetadata;
14
+ }
15
+ export interface SkillRepositoryConfig {
16
+ userSkillsDir?: string;
17
+ bundledSkillsDir?: string;
18
+ }
19
+ /**
20
+ * 기본 전역 스킬 디렉토리 경로
21
+ */
22
+ export declare function getGlobalSkillsDir(): string;
23
+ /**
24
+ * 번들된 기본 스킬 디렉토리 (패키지 내부)
25
+ */
26
+ export declare function getBundledSkillsDir(): string;
27
+ /**
28
+ * Skill Repository 클래스
29
+ */
30
+ export declare class SkillRepository {
31
+ private userSkillsDir;
32
+ private bundledSkillsDir;
33
+ constructor(config?: SkillRepositoryConfig);
34
+ /**
35
+ * 스킬 디렉토리 초기화
36
+ */
37
+ ensureSkillsDir(): void;
38
+ /**
39
+ * 기본 스킬 세트 시딩 (없는 것만 복사)
40
+ */
41
+ seedDefaultSkills(): {
42
+ seeded: string[];
43
+ skipped: string[];
44
+ errors: string[];
45
+ };
46
+ /**
47
+ * 모든 스킬 목록 조회 (user + bundled fallback)
48
+ */
49
+ listSkills(): SkillInfo[];
50
+ /**
51
+ * 디렉토리에서 스킬 로드
52
+ */
53
+ private loadSkillsFromDir;
54
+ /**
55
+ * 콘텐츠에서 설명 추출 (frontmatter 없는 경우)
56
+ */
57
+ private extractDescription;
58
+ /**
59
+ * ID로 스킬 조회
60
+ */
61
+ getSkill(id: string): SkillInfo | null;
62
+ /**
63
+ * 스킬 파일 찾기
64
+ */
65
+ private findSkillFile;
66
+ /**
67
+ * 스킬 정보 로드
68
+ */
69
+ private loadSkillInfo;
70
+ /**
71
+ * 스킬 콘텐츠 읽기
72
+ */
73
+ getSkillContent(id: string): string | null;
74
+ /**
75
+ * 유저 스킬 저장
76
+ */
77
+ saveSkill(id: string, content: string): void;
78
+ /**
79
+ * 유저 스킬 삭제
80
+ */
81
+ deleteSkill(id: string): boolean;
82
+ /**
83
+ * 트리거 기반 스킬 검색
84
+ */
85
+ findSkillsByTrigger(input: string): SkillInfo[];
86
+ /**
87
+ * 저장소 경로 정보
88
+ */
89
+ getPaths(): {
90
+ userDir: string;
91
+ bundledDir: string;
92
+ };
93
+ }
94
+ /**
95
+ * 기본 스킬 세트 정의 (인라인)
96
+ * postinstall에서 skills/ 폴더가 없을 때 사용
97
+ */
98
+ export declare const DEFAULT_SKILLS: Array<{
99
+ id: string;
100
+ content: string;
101
+ }>;
102
+ /**
103
+ * 인라인 기본 스킬 시딩 (번들 폴더가 없을 때)
104
+ */
105
+ export declare function seedInlineDefaultSkills(targetDir: string): {
106
+ seeded: string[];
107
+ errors: string[];
108
+ };
109
+ /**
110
+ * 편의 함수: 기본 스킬 세트 설치
111
+ */
112
+ export declare function ensureDefaultSkills(): {
113
+ seeded: string[];
114
+ skipped: string[];
115
+ errors: string[];
116
+ };
117
+ //# sourceMappingURL=SkillRepository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SkillRepository.d.ts","sourceRoot":"","sources":["../../src/lib/SkillRepository.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,EAAsC,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAK1F,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC1B;AAED,MAAM,WAAW,qBAAqB;IACpC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAQ5C;AAED;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,gBAAgB,CAAS;gBAErB,MAAM,GAAE,qBAA0B;IAK9C;;OAEG;IACH,eAAe,IAAI,IAAI;IAMvB;;OAEG;IACH,iBAAiB,IAAI;QAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE;IA+C9E;;OAEG;IACH,UAAU,IAAI,SAAS,EAAE;IAgBzB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAoCzB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAY1B;;OAEG;IACH,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAgBtC;;OAEG;IACH,OAAO,CAAC,aAAa;IAarB;;OAEG;IACH,OAAO,CAAC,aAAa;IAkBrB;;OAEG;IACH,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAW1C;;OAEG;IACH,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAU5C;;OAEG;IACH,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAShC;;OAEG;IACH,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE;IAY/C;;OAEG;IACH,QAAQ,IAAI;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE;CAMpD;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAgLjE,CAAC;AAEF;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CA4BjG;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI;IAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAG/F"}