aiag-cli 2.2.3 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +72 -37
- package/dist/cli.js +30 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/feature.d.ts +11 -0
- package/dist/commands/feature.d.ts.map +1 -0
- package/dist/commands/feature.js +153 -0
- package/dist/commands/feature.js.map +1 -0
- package/dist/commands/init.d.ts +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +29 -78
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/prd.d.ts +12 -0
- package/dist/commands/prd.d.ts.map +1 -0
- package/dist/commands/prd.js +179 -0
- package/dist/commands/prd.js.map +1 -0
- package/dist/prompts/index.d.ts +2 -0
- package/dist/prompts/index.d.ts.map +1 -1
- package/dist/prompts/index.js +2 -0
- package/dist/prompts/index.js.map +1 -1
- package/dist/prompts/prd.d.ts +28 -0
- package/dist/prompts/prd.d.ts.map +1 -0
- package/dist/prompts/prd.js +105 -0
- package/dist/prompts/prd.js.map +1 -0
- package/dist/skills/index.d.ts +12 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +12 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/installer.d.ts +38 -0
- package/dist/skills/installer.d.ts.map +1 -0
- package/dist/skills/installer.js +153 -0
- package/dist/skills/installer.js.map +1 -0
- package/dist/skills/loader.d.ts +34 -0
- package/dist/skills/loader.d.ts.map +1 -0
- package/dist/skills/loader.js +134 -0
- package/dist/skills/loader.js.map +1 -0
- package/dist/skills/runner.d.ts +14 -0
- package/dist/skills/runner.d.ts.map +1 -0
- package/dist/skills/runner.js +238 -0
- package/dist/skills/runner.js.map +1 -0
- package/dist/types.d.ts +127 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/prd.d.ts +21 -0
- package/dist/utils/prd.d.ts.map +1 -1
- package/dist/utils/prd.js +69 -0
- package/dist/utils/prd.js.map +1 -1
- package/dist/utils/taskmasterConverter.d.ts +72 -0
- package/dist/utils/taskmasterConverter.d.ts.map +1 -0
- package/dist/utils/taskmasterConverter.js +401 -0
- package/dist/utils/taskmasterConverter.js.map +1 -0
- package/dist/utils/taskmasterParser.d.ts +35 -0
- package/dist/utils/taskmasterParser.d.ts.map +1 -0
- package/dist/utils/taskmasterParser.js +259 -0
- package/dist/utils/taskmasterParser.js.map +1 -0
- package/package.json +1 -1
- package/templates/skills/prd-taskmaster/.taskmaster/docs/prd.md +2571 -0
- package/templates/skills/prd-taskmaster/.taskmaster/scripts/execution-state.py +87 -0
- package/templates/skills/prd-taskmaster/.taskmaster/scripts/learn-accuracy.py +113 -0
- package/templates/skills/prd-taskmaster/.taskmaster/scripts/rollback.sh +71 -0
- package/templates/skills/prd-taskmaster/.taskmaster/scripts/security-audit.py +130 -0
- package/templates/skills/prd-taskmaster/.taskmaster/scripts/track-time.py +133 -0
- package/templates/skills/prd-taskmaster/LICENSE +21 -0
- package/templates/skills/prd-taskmaster/README.md +608 -0
- package/templates/skills/prd-taskmaster/SKILL.md +1258 -0
- package/templates/skills/prd-taskmaster/reference/taskmaster-integration-guide.md +645 -0
- package/templates/skills/prd-taskmaster/reference/validation-checklist.md +394 -0
- package/templates/skills/prd-taskmaster/scripts/setup-taskmaster.sh +112 -0
- package/templates/skills/prd-taskmaster/templates/CLAUDE.md.template +635 -0
- package/templates/skills/prd-taskmaster/templates/taskmaster-prd-comprehensive.md +983 -0
- package/templates/skills/prd-taskmaster/templates/taskmaster-prd-minimal.md +103 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* aiag prd 명령어
|
|
3
|
+
*
|
|
4
|
+
* prd-taskmaster 스킬을 사용하여 PRD를 생성합니다.
|
|
5
|
+
* --from 옵션으로 기존 요구사항 문서를 Taskmaster PRD로 변환할 수 있습니다.
|
|
6
|
+
*/
|
|
7
|
+
import type { PrdCommandOptions } from '../types.js';
|
|
8
|
+
/**
|
|
9
|
+
* PRD 생성 명령어
|
|
10
|
+
*/
|
|
11
|
+
export declare function prd(options?: PrdCommandOptions): Promise<void>;
|
|
12
|
+
//# sourceMappingURL=prd.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prd.d.ts","sourceRoot":"","sources":["../../src/commands/prd.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAkCrD;;GAEG;AACH,wBAAsB,GAAG,CAAC,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2JxE"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* aiag prd 명령어
|
|
3
|
+
*
|
|
4
|
+
* prd-taskmaster 스킬을 사용하여 PRD를 생성합니다.
|
|
5
|
+
* --from 옵션으로 기존 요구사항 문서를 Taskmaster PRD로 변환할 수 있습니다.
|
|
6
|
+
*/
|
|
7
|
+
import { spawn } from 'child_process';
|
|
8
|
+
import fs from 'fs';
|
|
9
|
+
import path from 'path';
|
|
10
|
+
import chalk from 'chalk';
|
|
11
|
+
import ora from 'ora';
|
|
12
|
+
import { skillExists } from '../skills/loader.js';
|
|
13
|
+
import { installSkillIfNeeded } from '../skills/installer.js';
|
|
14
|
+
import { runPrdSkill } from '../skills/runner.js';
|
|
15
|
+
import { printHeader, printSuccess, printError, printWarning, printInfo } from '../utils/output.js';
|
|
16
|
+
import { getPrdInfo } from '../utils/prd.js';
|
|
17
|
+
/**
|
|
18
|
+
* TaskMaster 설치 확인
|
|
19
|
+
*/
|
|
20
|
+
async function checkTaskMasterInstalled() {
|
|
21
|
+
return new Promise((resolve) => {
|
|
22
|
+
// CLI 버전 확인
|
|
23
|
+
const child = spawn('taskmaster', ['--version'], {
|
|
24
|
+
stdio: 'pipe',
|
|
25
|
+
shell: true,
|
|
26
|
+
});
|
|
27
|
+
child.on('close', (code) => {
|
|
28
|
+
resolve(code === 0);
|
|
29
|
+
});
|
|
30
|
+
child.on('error', () => {
|
|
31
|
+
resolve(false);
|
|
32
|
+
});
|
|
33
|
+
// 타임아웃
|
|
34
|
+
setTimeout(() => {
|
|
35
|
+
child.kill();
|
|
36
|
+
resolve(false);
|
|
37
|
+
}, 5000);
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* PRD 생성 명령어
|
|
42
|
+
*/
|
|
43
|
+
export async function prd(options = {}) {
|
|
44
|
+
const baseDir = process.cwd();
|
|
45
|
+
const outputPath = options.output || '.taskmaster/docs/prd.md';
|
|
46
|
+
const template = options.template || 'comprehensive';
|
|
47
|
+
const fromPath = options.from;
|
|
48
|
+
// 모드 결정: 변환 모드 vs 대화형 모드
|
|
49
|
+
const isConversionMode = !!fromPath;
|
|
50
|
+
printHeader(isConversionMode ? 'AIAG PRD Converter' : 'AIAG PRD Generator');
|
|
51
|
+
console.log();
|
|
52
|
+
// 1. --from 옵션: 기존 문서 로딩
|
|
53
|
+
let existingDocContent;
|
|
54
|
+
let existingDocPath;
|
|
55
|
+
if (isConversionMode) {
|
|
56
|
+
const fullFromPath = path.isAbsolute(fromPath) ? fromPath : path.join(baseDir, fromPath);
|
|
57
|
+
if (!fs.existsSync(fullFromPath)) {
|
|
58
|
+
printError(`파일을 찾을 수 없습니다: ${fromPath}`);
|
|
59
|
+
process.exit(1);
|
|
60
|
+
}
|
|
61
|
+
const docInfo = getPrdInfo(fullFromPath);
|
|
62
|
+
printInfo(`기존 문서 로드: ${docInfo.relativePath} (${docInfo.sizeKB} KB)`);
|
|
63
|
+
existingDocContent = fs.readFileSync(fullFromPath, 'utf-8');
|
|
64
|
+
existingDocPath = fromPath;
|
|
65
|
+
if (existingDocContent.length < 100) {
|
|
66
|
+
printWarning('문서 내용이 매우 짧습니다. 충분한 정보가 포함되어 있는지 확인하세요.');
|
|
67
|
+
}
|
|
68
|
+
console.log();
|
|
69
|
+
}
|
|
70
|
+
// 2. TaskMaster 확인 (필수)
|
|
71
|
+
const spinner = ora('TaskMaster 확인 중...').start();
|
|
72
|
+
const taskMasterInstalled = await checkTaskMasterInstalled();
|
|
73
|
+
if (!taskMasterInstalled) {
|
|
74
|
+
spinner.fail('TaskMaster가 설치되어 있지 않습니다.');
|
|
75
|
+
console.log();
|
|
76
|
+
printError('TaskMaster는 필수 의존성입니다.');
|
|
77
|
+
console.log();
|
|
78
|
+
printInfo('설치 방법:');
|
|
79
|
+
console.log(chalk.gray(' npm install -g task-master-ai'));
|
|
80
|
+
console.log(chalk.gray(' 또는 Claude Code MCP 설정에 TaskMaster 추가'));
|
|
81
|
+
console.log();
|
|
82
|
+
process.exit(1);
|
|
83
|
+
}
|
|
84
|
+
spinner.succeed('TaskMaster 설치 확인됨');
|
|
85
|
+
// 3. prd-taskmaster 스킬 확인 및 설치
|
|
86
|
+
spinner.start('prd-taskmaster 스킬 확인 중...');
|
|
87
|
+
if (!skillExists('prd-taskmaster')) {
|
|
88
|
+
spinner.text = 'prd-taskmaster 스킬 설치 중...';
|
|
89
|
+
const installResult = installSkillIfNeeded('prd-taskmaster');
|
|
90
|
+
if (installResult.status === 'failed') {
|
|
91
|
+
spinner.fail('스킬 설치 실패');
|
|
92
|
+
printError(installResult.error || '알 수 없는 오류');
|
|
93
|
+
process.exit(1);
|
|
94
|
+
}
|
|
95
|
+
spinner.succeed('prd-taskmaster 스킬 설치됨');
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
spinner.succeed('prd-taskmaster 스킬 확인됨');
|
|
99
|
+
}
|
|
100
|
+
// 4. 기존 PRD 확인
|
|
101
|
+
const fullOutputPath = path.join(baseDir, outputPath);
|
|
102
|
+
if (fs.existsSync(fullOutputPath)) {
|
|
103
|
+
console.log();
|
|
104
|
+
printWarning(`기존 PRD 발견: ${outputPath}`);
|
|
105
|
+
printInfo('새 PRD 생성 시 기존 파일이 백업됩니다.');
|
|
106
|
+
console.log();
|
|
107
|
+
}
|
|
108
|
+
// 5. Dry run 모드
|
|
109
|
+
if (options.dryRun) {
|
|
110
|
+
console.log();
|
|
111
|
+
printInfo('[DRY RUN] PRD 생성 시뮬레이션');
|
|
112
|
+
console.log(chalk.gray(` 모드: ${isConversionMode ? '변환 모드' : '대화형 모드'}`));
|
|
113
|
+
if (isConversionMode) {
|
|
114
|
+
console.log(chalk.gray(` 소스 문서: ${fromPath}`));
|
|
115
|
+
}
|
|
116
|
+
console.log(chalk.gray(` 출력 경로: ${outputPath}`));
|
|
117
|
+
console.log(chalk.gray(` 템플릿: ${template}`));
|
|
118
|
+
console.log(chalk.gray(` 작업 디렉토리: ${baseDir}`));
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
// 6. PRD 생성 실행
|
|
122
|
+
console.log();
|
|
123
|
+
if (isConversionMode) {
|
|
124
|
+
printInfo('PRD 변환을 시작합니다...');
|
|
125
|
+
printInfo('기존 문서를 분석하고, 누락된 정보가 있으면 질문합니다.');
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
printInfo('PRD 생성을 시작합니다...');
|
|
129
|
+
printInfo('prd-taskmaster 스킬의 질문에 답변해주세요.');
|
|
130
|
+
}
|
|
131
|
+
console.log();
|
|
132
|
+
const result = await runPrdSkill({
|
|
133
|
+
workingDirectory: baseDir,
|
|
134
|
+
template,
|
|
135
|
+
verbose: options.verbose,
|
|
136
|
+
existingDocContent,
|
|
137
|
+
existingDocPath,
|
|
138
|
+
onProgress: (message) => {
|
|
139
|
+
if (options.verbose) {
|
|
140
|
+
console.log(chalk.gray(`[진행] ${message}`));
|
|
141
|
+
}
|
|
142
|
+
},
|
|
143
|
+
});
|
|
144
|
+
console.log();
|
|
145
|
+
// 7. 결과 처리
|
|
146
|
+
if (result.success) {
|
|
147
|
+
printSuccess(isConversionMode ? 'PRD 변환 완료!' : 'PRD 생성 완료!');
|
|
148
|
+
console.log();
|
|
149
|
+
if (result.filesCreated && result.filesCreated.length > 0) {
|
|
150
|
+
printInfo('생성된 파일:');
|
|
151
|
+
for (const file of result.filesCreated) {
|
|
152
|
+
console.log(chalk.gray(` • ${file}`));
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
if (result.numTurns) {
|
|
156
|
+
console.log(chalk.gray(` 턴 수: ${result.numTurns}`));
|
|
157
|
+
}
|
|
158
|
+
if (result.costUsd) {
|
|
159
|
+
console.log(chalk.gray(` 비용: $${result.costUsd.toFixed(4)}`));
|
|
160
|
+
}
|
|
161
|
+
if (result.durationMs) {
|
|
162
|
+
const minutes = Math.floor(result.durationMs / 60000);
|
|
163
|
+
const seconds = Math.floor((result.durationMs % 60000) / 1000);
|
|
164
|
+
console.log(chalk.gray(` 소요 시간: ${minutes}분 ${seconds}초`));
|
|
165
|
+
}
|
|
166
|
+
console.log();
|
|
167
|
+
printInfo('다음 단계:');
|
|
168
|
+
console.log(chalk.cyan(' aiag feature ') + chalk.gray('# PRD에서 Feature 목록 생성'));
|
|
169
|
+
console.log(chalk.cyan(' aiag validate ') + chalk.gray('# Feature 목록 검증'));
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
printError(isConversionMode ? 'PRD 변환 실패' : 'PRD 생성 실패');
|
|
173
|
+
if (result.error) {
|
|
174
|
+
console.log(chalk.red(` ${result.error}`));
|
|
175
|
+
}
|
|
176
|
+
process.exit(1);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=prd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prd.js","sourceRoot":"","sources":["../../src/commands/prd.ts"],"names":[],"mappings":"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"}
|
package/dist/prompts/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC"}
|
package/dist/prompts/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PRD 생성 프롬프트 모듈
|
|
3
|
+
*
|
|
4
|
+
* prd-taskmaster 스킬과 함께 사용되는 프롬프트 생성
|
|
5
|
+
*/
|
|
6
|
+
export interface PrdPromptContext {
|
|
7
|
+
workingDirectory: string;
|
|
8
|
+
projectName?: string;
|
|
9
|
+
template?: 'minimal' | 'comprehensive';
|
|
10
|
+
existingFiles?: string[];
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* PRD 생성 시스템 프롬프트 생성
|
|
14
|
+
*/
|
|
15
|
+
export declare function getPrdSystemPrompt(): string;
|
|
16
|
+
/**
|
|
17
|
+
* PRD 생성 시작 프롬프트
|
|
18
|
+
*/
|
|
19
|
+
export declare function getPrdStartPrompt(context: PrdPromptContext): string;
|
|
20
|
+
/**
|
|
21
|
+
* TaskMaster 확인 프롬프트
|
|
22
|
+
*/
|
|
23
|
+
export declare function getTaskMasterCheckPrompt(): string;
|
|
24
|
+
/**
|
|
25
|
+
* PRD 검증 프롬프트
|
|
26
|
+
*/
|
|
27
|
+
export declare function getPrdValidationPrompt(prdPath: string): string;
|
|
28
|
+
//# sourceMappingURL=prd.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prd.d.ts","sourceRoot":"","sources":["../../src/prompts/prd.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,WAAW,gBAAgB;IAC/B,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,SAAS,GAAG,eAAe,CAAC;IACvC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAkB3C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAgCnE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CAUjD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CA2B9D"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PRD 생성 프롬프트 모듈
|
|
3
|
+
*
|
|
4
|
+
* prd-taskmaster 스킬과 함께 사용되는 프롬프트 생성
|
|
5
|
+
*/
|
|
6
|
+
import path from 'path';
|
|
7
|
+
/**
|
|
8
|
+
* PRD 생성 시스템 프롬프트 생성
|
|
9
|
+
*/
|
|
10
|
+
export function getPrdSystemPrompt() {
|
|
11
|
+
return `당신은 PRD(Product Requirements Document) 작성 전문가입니다.
|
|
12
|
+
사용자와 대화하며 프로젝트 요구사항을 수집하고, 구조화된 PRD를 생성합니다.
|
|
13
|
+
|
|
14
|
+
## 핵심 규칙
|
|
15
|
+
|
|
16
|
+
1. **모든 출력은 한국어로 작성하세요**
|
|
17
|
+
2. 질문할 때는 AskUserQuestion 도구를 사용하세요
|
|
18
|
+
3. 파일을 생성할 때는 Write 도구를 사용하세요
|
|
19
|
+
4. 기존 코드베이스가 있다면 분석하여 컨텍스트를 파악하세요
|
|
20
|
+
|
|
21
|
+
## PRD 품질 기준
|
|
22
|
+
|
|
23
|
+
1. 모든 요구사항은 테스트 가능해야 함
|
|
24
|
+
2. 우선순위가 명확해야 함 (P0, P1, P2)
|
|
25
|
+
3. 승인 기준(Acceptance Criteria)이 구체적이어야 함
|
|
26
|
+
4. 의존성이 명시되어야 함
|
|
27
|
+
5. 작업 분해 힌트가 포함되어야 함`;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* PRD 생성 시작 프롬프트
|
|
31
|
+
*/
|
|
32
|
+
export function getPrdStartPrompt(context) {
|
|
33
|
+
const lines = [];
|
|
34
|
+
lines.push('# PRD 생성 세션 시작');
|
|
35
|
+
lines.push('');
|
|
36
|
+
lines.push('## 프로젝트 정보');
|
|
37
|
+
lines.push(`- 작업 디렉토리: ${context.workingDirectory}`);
|
|
38
|
+
lines.push(`- 프로젝트 이름: ${context.projectName || path.basename(context.workingDirectory)}`);
|
|
39
|
+
if (context.template) {
|
|
40
|
+
lines.push(`- 템플릿: ${context.template}`);
|
|
41
|
+
}
|
|
42
|
+
if (context.existingFiles && context.existingFiles.length > 0) {
|
|
43
|
+
lines.push('');
|
|
44
|
+
lines.push('## 기존 파일');
|
|
45
|
+
for (const file of context.existingFiles.slice(0, 10)) {
|
|
46
|
+
lines.push(`- ${file}`);
|
|
47
|
+
}
|
|
48
|
+
if (context.existingFiles.length > 10) {
|
|
49
|
+
lines.push(`- ... 외 ${context.existingFiles.length - 10}개`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
lines.push('');
|
|
53
|
+
lines.push('## 시작');
|
|
54
|
+
lines.push('');
|
|
55
|
+
lines.push('prd-taskmaster 스킬의 워크플로우를 따라 PRD를 생성하세요.');
|
|
56
|
+
lines.push('Step 1부터 시작하여 사용자에게 질문하고, 답변을 수집하세요.');
|
|
57
|
+
lines.push('');
|
|
58
|
+
return lines.join('\n');
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* TaskMaster 확인 프롬프트
|
|
62
|
+
*/
|
|
63
|
+
export function getTaskMasterCheckPrompt() {
|
|
64
|
+
return `## TaskMaster 확인
|
|
65
|
+
|
|
66
|
+
TaskMaster가 설치되어 있는지 확인하세요:
|
|
67
|
+
1. MCP 서버로 설치된 경우: mcp__taskmaster 도구 확인
|
|
68
|
+
2. CLI로 설치된 경우: taskmaster --version 실행
|
|
69
|
+
|
|
70
|
+
TaskMaster가 없으면 사용자에게 설치 방법을 안내하세요:
|
|
71
|
+
- npm install -g task-master-ai
|
|
72
|
+
- 또는 Claude Code MCP 설정에 TaskMaster 추가`;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* PRD 검증 프롬프트
|
|
76
|
+
*/
|
|
77
|
+
export function getPrdValidationPrompt(prdPath) {
|
|
78
|
+
return `## PRD 검증
|
|
79
|
+
|
|
80
|
+
생성된 PRD (${prdPath})를 다음 13개 기준으로 검증하세요:
|
|
81
|
+
|
|
82
|
+
### 필수 요소 (5개)
|
|
83
|
+
1. ✅ Executive summary 존재
|
|
84
|
+
2. ✅ Problem statement에 사용자 & 비즈니스 영향 포함
|
|
85
|
+
3. ✅ 모든 목표에 SMART 메트릭 포함
|
|
86
|
+
4. ✅ User stories에 승인 기준 (최소 3개)
|
|
87
|
+
5. ✅ Out of scope 명시
|
|
88
|
+
|
|
89
|
+
### 기능 요구사항 (3개)
|
|
90
|
+
6. ✅ 테스트 가능한 요구사항
|
|
91
|
+
7. ✅ 우선순위 지정 (Must/Should/Could)
|
|
92
|
+
8. ✅ 번호 매김 (REQ-001 형식)
|
|
93
|
+
|
|
94
|
+
### 기술 고려 (2개)
|
|
95
|
+
9. ✅ 아키텍처 다룸
|
|
96
|
+
10. ✅ 구체적 목표값 (예: "< 200ms")
|
|
97
|
+
|
|
98
|
+
### TaskMaster 최적화 (3개)
|
|
99
|
+
11. ✅ 작업 분해 힌트 포함
|
|
100
|
+
12. ✅ 의존성 식별
|
|
101
|
+
13. ✅ 구체적 승인 기준
|
|
102
|
+
|
|
103
|
+
각 항목에 대해 통과(✓) 또는 실패(✗)를 표시하고 총점을 계산하세요.`;
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=prd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prd.js","sourceRoot":"","sources":["../../src/prompts/prd.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AASxB;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO;;;;;;;;;;;;;;;;qBAgBY,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAyB;IACzD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC7B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACzB,KAAK,CAAC,IAAI,CAAC,cAAc,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;IACrD,KAAK,CAAC,IAAI,CAAC,cAAc,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;IAE3F,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,UAAU,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACvB,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YACtD,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QAC1B,CAAC;QACD,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YACtC,KAAK,CAAC,IAAI,CAAC,WAAW,OAAO,CAAC,aAAa,CAAC,MAAM,GAAG,EAAE,GAAG,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;IACvD,KAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;IACnD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB;IACtC,OAAO;;;;;;;;uCAQ8B,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAe;IACpD,OAAO;;WAEE,OAAO;;;;;;;;;;;;;;;;;;;;;;;yCAuBuB,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 스킬 시스템 모듈
|
|
3
|
+
*
|
|
4
|
+
* Claude Code 스킬을 관리하고 실행하는 모듈
|
|
5
|
+
* - loader: SKILL.md 파싱 및 로딩
|
|
6
|
+
* - installer: 번들 스킬 설치
|
|
7
|
+
* - runner: SDK를 사용한 스킬 실행
|
|
8
|
+
*/
|
|
9
|
+
export * from './loader.js';
|
|
10
|
+
export * from './installer.js';
|
|
11
|
+
export * from './runner.js';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 스킬 시스템 모듈
|
|
3
|
+
*
|
|
4
|
+
* Claude Code 스킬을 관리하고 실행하는 모듈
|
|
5
|
+
* - loader: SKILL.md 파싱 및 로딩
|
|
6
|
+
* - installer: 번들 스킬 설치
|
|
7
|
+
* - runner: SDK를 사용한 스킬 실행
|
|
8
|
+
*/
|
|
9
|
+
export * from './loader.js';
|
|
10
|
+
export * from './installer.js';
|
|
11
|
+
export * from './runner.js';
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 스킬 설치 모듈
|
|
3
|
+
* 번들된 스킬을 ~/.claude/skills/ 디렉토리에 설치합니다.
|
|
4
|
+
*/
|
|
5
|
+
import type { SkillInstallResult } from '../types.js';
|
|
6
|
+
/**
|
|
7
|
+
* 스킬 디렉토리 생성 (없으면)
|
|
8
|
+
*/
|
|
9
|
+
export declare function ensureSkillsDir(): void;
|
|
10
|
+
/**
|
|
11
|
+
* 번들된 스킬 존재 여부 확인
|
|
12
|
+
*/
|
|
13
|
+
export declare function bundledSkillExists(skillName: string): boolean;
|
|
14
|
+
/**
|
|
15
|
+
* 번들된 스킬 목록 조회
|
|
16
|
+
*/
|
|
17
|
+
export declare function listBundledSkills(): string[];
|
|
18
|
+
/**
|
|
19
|
+
* 스킬 설치 (번들에서 복사)
|
|
20
|
+
*/
|
|
21
|
+
export declare function installSkill(skillName: string, options?: {
|
|
22
|
+
force?: boolean;
|
|
23
|
+
}): SkillInstallResult;
|
|
24
|
+
/**
|
|
25
|
+
* 스킬 설치 (필요한 경우에만)
|
|
26
|
+
*/
|
|
27
|
+
export declare function installSkillIfNeeded(skillName: string): SkillInstallResult;
|
|
28
|
+
/**
|
|
29
|
+
* 스킬 제거
|
|
30
|
+
*/
|
|
31
|
+
export declare function uninstallSkill(skillName: string): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* 모든 번들 스킬 설치
|
|
34
|
+
*/
|
|
35
|
+
export declare function installAllBundledSkills(options?: {
|
|
36
|
+
force?: boolean;
|
|
37
|
+
}): Map<string, SkillInstallResult>;
|
|
38
|
+
//# sourceMappingURL=installer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../src/skills/installer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAiCtD;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAItC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAG7D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,EAAE,CAS5C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAChC,kBAAkB,CAiDpB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,kBAAkB,CAW1E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAazD;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAChC,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAYjC"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 스킬 설치 모듈
|
|
3
|
+
* 번들된 스킬을 ~/.claude/skills/ 디렉토리에 설치합니다.
|
|
4
|
+
*/
|
|
5
|
+
import fs from 'fs';
|
|
6
|
+
import path from 'path';
|
|
7
|
+
import { fileURLToPath } from 'url';
|
|
8
|
+
import { SKILLS_DIR, skillExists, loadSkillMetadata } from './loader.js';
|
|
9
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
10
|
+
const __dirname = path.dirname(__filename);
|
|
11
|
+
/**
|
|
12
|
+
* 번들된 스킬 디렉토리 경로
|
|
13
|
+
*/
|
|
14
|
+
const BUNDLED_SKILLS_DIR = path.join(__dirname, '../../templates/skills');
|
|
15
|
+
/**
|
|
16
|
+
* 디렉토리 재귀 복사
|
|
17
|
+
*/
|
|
18
|
+
function copyDirSync(src, dest) {
|
|
19
|
+
if (!fs.existsSync(dest)) {
|
|
20
|
+
fs.mkdirSync(dest, { recursive: true });
|
|
21
|
+
}
|
|
22
|
+
const entries = fs.readdirSync(src, { withFileTypes: true });
|
|
23
|
+
for (const entry of entries) {
|
|
24
|
+
const srcPath = path.join(src, entry.name);
|
|
25
|
+
const destPath = path.join(dest, entry.name);
|
|
26
|
+
if (entry.isDirectory()) {
|
|
27
|
+
copyDirSync(srcPath, destPath);
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
fs.copyFileSync(srcPath, destPath);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* 스킬 디렉토리 생성 (없으면)
|
|
36
|
+
*/
|
|
37
|
+
export function ensureSkillsDir() {
|
|
38
|
+
if (!fs.existsSync(SKILLS_DIR)) {
|
|
39
|
+
fs.mkdirSync(SKILLS_DIR, { recursive: true });
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* 번들된 스킬 존재 여부 확인
|
|
44
|
+
*/
|
|
45
|
+
export function bundledSkillExists(skillName) {
|
|
46
|
+
const bundledPath = path.join(BUNDLED_SKILLS_DIR, skillName, 'SKILL.md');
|
|
47
|
+
return fs.existsSync(bundledPath);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* 번들된 스킬 목록 조회
|
|
51
|
+
*/
|
|
52
|
+
export function listBundledSkills() {
|
|
53
|
+
if (!fs.existsSync(BUNDLED_SKILLS_DIR)) {
|
|
54
|
+
return [];
|
|
55
|
+
}
|
|
56
|
+
return fs.readdirSync(BUNDLED_SKILLS_DIR, { withFileTypes: true })
|
|
57
|
+
.filter(entry => entry.isDirectory())
|
|
58
|
+
.filter(entry => fs.existsSync(path.join(BUNDLED_SKILLS_DIR, entry.name, 'SKILL.md')))
|
|
59
|
+
.map(entry => entry.name);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* 스킬 설치 (번들에서 복사)
|
|
63
|
+
*/
|
|
64
|
+
export function installSkill(skillName, options = {}) {
|
|
65
|
+
const bundledPath = path.join(BUNDLED_SKILLS_DIR, skillName);
|
|
66
|
+
const targetPath = path.join(SKILLS_DIR, skillName);
|
|
67
|
+
// 번들된 스킬 존재 확인
|
|
68
|
+
if (!fs.existsSync(path.join(bundledPath, 'SKILL.md'))) {
|
|
69
|
+
return {
|
|
70
|
+
status: 'failed',
|
|
71
|
+
path: targetPath,
|
|
72
|
+
error: `번들된 스킬을 찾을 수 없습니다: ${skillName}`,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
// 이미 설치되어 있고 force가 아니면 건너뛰기
|
|
76
|
+
if (skillExists(skillName) && !options.force) {
|
|
77
|
+
const metadata = loadSkillMetadata(skillName);
|
|
78
|
+
return {
|
|
79
|
+
status: 'skipped',
|
|
80
|
+
path: targetPath,
|
|
81
|
+
version: metadata?.version,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
try {
|
|
85
|
+
// 스킬 디렉토리 생성
|
|
86
|
+
ensureSkillsDir();
|
|
87
|
+
// 기존 스킬 백업 (force인 경우)
|
|
88
|
+
if (options.force && fs.existsSync(targetPath)) {
|
|
89
|
+
const backupPath = `${targetPath}.backup-${Date.now()}`;
|
|
90
|
+
fs.renameSync(targetPath, backupPath);
|
|
91
|
+
}
|
|
92
|
+
// 스킬 복사
|
|
93
|
+
copyDirSync(bundledPath, targetPath);
|
|
94
|
+
const metadata = loadSkillMetadata(skillName);
|
|
95
|
+
return {
|
|
96
|
+
status: skillExists(skillName) ? 'updated' : 'installed',
|
|
97
|
+
path: targetPath,
|
|
98
|
+
version: metadata?.version,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
return {
|
|
103
|
+
status: 'failed',
|
|
104
|
+
path: targetPath,
|
|
105
|
+
error: error instanceof Error ? error.message : String(error),
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* 스킬 설치 (필요한 경우에만)
|
|
111
|
+
*/
|
|
112
|
+
export function installSkillIfNeeded(skillName) {
|
|
113
|
+
if (skillExists(skillName)) {
|
|
114
|
+
const metadata = loadSkillMetadata(skillName);
|
|
115
|
+
return {
|
|
116
|
+
status: 'skipped',
|
|
117
|
+
path: path.join(SKILLS_DIR, skillName),
|
|
118
|
+
version: metadata?.version,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
return installSkill(skillName);
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* 스킬 제거
|
|
125
|
+
*/
|
|
126
|
+
export function uninstallSkill(skillName) {
|
|
127
|
+
const skillPath = path.join(SKILLS_DIR, skillName);
|
|
128
|
+
if (!fs.existsSync(skillPath)) {
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
try {
|
|
132
|
+
fs.rmSync(skillPath, { recursive: true, force: true });
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* 모든 번들 스킬 설치
|
|
141
|
+
*/
|
|
142
|
+
export function installAllBundledSkills(options = {}) {
|
|
143
|
+
const results = new Map();
|
|
144
|
+
const bundledSkills = listBundledSkills();
|
|
145
|
+
for (const skillName of bundledSkills) {
|
|
146
|
+
const result = options.force
|
|
147
|
+
? installSkill(skillName, { force: true })
|
|
148
|
+
: installSkillIfNeeded(skillName);
|
|
149
|
+
results.set(skillName, result);
|
|
150
|
+
}
|
|
151
|
+
return results;
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/skills/installer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEzE,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAE3C;;GAEG;AACH,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,wBAAwB,CAAC,CAAC;AAE1E;;GAEG;AACH,SAAS,WAAW,CAAC,GAAW,EAAE,IAAY;IAC5C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAE7D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAE7C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,SAAiB;IAClD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IACzE,OAAO,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACvC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,EAAE,CAAC,WAAW,CAAC,kBAAkB,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;SAC/D,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;SACpC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC;SACrF,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,SAAiB,EACjB,UAA+B,EAAE;IAEjC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC;IAC7D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IAEpD,eAAe;IACf,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC;QACvD,OAAO;YACL,MAAM,EAAE,QAAQ;YAChB,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,sBAAsB,SAAS,EAAE;SACzC,CAAC;IACJ,CAAC;IAED,6BAA6B;IAC7B,IAAI,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC7C,MAAM,QAAQ,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAC9C,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,QAAQ,EAAE,OAAO;SAC3B,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,aAAa;QACb,eAAe,EAAE,CAAC;QAElB,uBAAuB;QACvB,IAAI,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/C,MAAM,UAAU,GAAG,GAAG,UAAU,WAAW,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YACxD,EAAE,CAAC,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QACxC,CAAC;QAED,QAAQ;QACR,WAAW,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QAErC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAC9C,OAAO;YACL,MAAM,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW;YACxD,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,QAAQ,EAAE,OAAO;SAC3B,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,MAAM,EAAE,QAAQ;YAChB,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,SAAiB;IACpD,IAAI,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAC9C,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC;YACtC,OAAO,EAAE,QAAQ,EAAE,OAAO;SAC3B,CAAC;IACJ,CAAC;IAED,OAAO,YAAY,CAAC,SAAS,CAAC,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IAEnD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC;QACH,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CACrC,UAA+B,EAAE;IAEjC,MAAM,OAAO,GAAG,IAAI,GAAG,EAA8B,CAAC;IACtD,MAAM,aAAa,GAAG,iBAAiB,EAAE,CAAC;IAE1C,KAAK,MAAM,SAAS,IAAI,aAAa,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK;YAC1B,CAAC,CAAC,YAAY,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;YAC1C,CAAC,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACjC,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 스킬 로더 모듈
|
|
3
|
+
* SKILL.md 파일을 파싱하여 스킬 정보를 로드합니다.
|
|
4
|
+
*/
|
|
5
|
+
import type { LoadedSkill, SkillMetadata } from '../types.js';
|
|
6
|
+
/**
|
|
7
|
+
* 스킬 디렉토리 기본 경로
|
|
8
|
+
*/
|
|
9
|
+
export declare const SKILLS_DIR: string;
|
|
10
|
+
/**
|
|
11
|
+
* 스킬 존재 여부 확인
|
|
12
|
+
*/
|
|
13
|
+
export declare function skillExists(skillName: string): boolean;
|
|
14
|
+
/**
|
|
15
|
+
* 스킬 경로 반환
|
|
16
|
+
*/
|
|
17
|
+
export declare function getSkillPath(skillName: string): string;
|
|
18
|
+
/**
|
|
19
|
+
* 스킬 메타데이터만 로드 (빠른 조회용)
|
|
20
|
+
*/
|
|
21
|
+
export declare function loadSkillMetadata(skillName: string): SkillMetadata | null;
|
|
22
|
+
/**
|
|
23
|
+
* 스킬 전체 정보 로드
|
|
24
|
+
*/
|
|
25
|
+
export declare function loadSkill(skillName: string): LoadedSkill;
|
|
26
|
+
/**
|
|
27
|
+
* 설치된 모든 스킬 목록 조회
|
|
28
|
+
*/
|
|
29
|
+
export declare function listInstalledSkills(): SkillMetadata[];
|
|
30
|
+
/**
|
|
31
|
+
* 스킬 템플릿 내용 로드
|
|
32
|
+
*/
|
|
33
|
+
export declare function loadSkillTemplate(skillName: string, templateName: string): string | null;
|
|
34
|
+
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/skills/loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE9D;;GAEG;AACH,eAAO,MAAM,UAAU,QAA+C,CAAC;AAqCvE;;GAEG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAGtD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAqBzE;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,CA8BxD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,aAAa,EAAE,CAkBrD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQxF"}
|