oh-my-agent 1.0.2 → 1.1.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.
Potentially problematic release.
This version of oh-my-agent might be problematic. Click here for more details.
- package/dist/application/DiagnoseProjectUseCase.d.ts +6 -3
- package/dist/application/DiagnoseProjectUseCase.d.ts.map +1 -1
- package/dist/application/DiagnoseProjectUseCase.js +23 -9
- package/dist/application/DiagnoseProjectUseCase.js.map +1 -1
- package/dist/application/SetupSkillsUseCase.d.ts +4 -1
- package/dist/application/SetupSkillsUseCase.d.ts.map +1 -1
- package/dist/application/SetupSkillsUseCase.js +37 -41
- package/dist/application/SetupSkillsUseCase.js.map +1 -1
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/infrastructure/skills/SkillsScorer.d.ts +17 -0
- package/dist/infrastructure/skills/SkillsScorer.d.ts.map +1 -0
- package/dist/infrastructure/skills/SkillsScorer.js +63 -0
- package/dist/infrastructure/skills/SkillsScorer.js.map +1 -0
- package/dist/infrastructure/skills/SkillsShClient.d.ts +24 -0
- package/dist/infrastructure/skills/SkillsShClient.d.ts.map +1 -0
- package/dist/infrastructure/skills/SkillsShClient.js +65 -0
- package/dist/infrastructure/skills/SkillsShClient.js.map +1 -0
- package/dist/infrastructure/skills/StackKeywords.d.ts +13 -0
- package/dist/infrastructure/skills/StackKeywords.d.ts.map +1 -0
- package/dist/infrastructure/skills/StackKeywords.js +43 -0
- package/dist/infrastructure/skills/StackKeywords.js.map +1 -0
- package/package.json +1 -1
- package/dist/infrastructure/skills/SkillsRegistry.d.ts +0 -15
- package/dist/infrastructure/skills/SkillsRegistry.d.ts.map +0 -1
- package/dist/infrastructure/skills/SkillsRegistry.js +0 -102
- package/dist/infrastructure/skills/SkillsRegistry.js.map +0 -1
|
@@ -1,19 +1,22 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type ScoredSkill } from "../infrastructure/skills/SkillsScorer.js";
|
|
2
|
+
import { META_SKILL_REFS } from "../infrastructure/skills/StackKeywords.js";
|
|
2
3
|
export interface DiagnoseInput {
|
|
3
4
|
projectPath?: string;
|
|
4
5
|
includeDevDeps?: boolean;
|
|
5
6
|
}
|
|
6
|
-
export interface RecommendedSkill extends
|
|
7
|
+
export interface RecommendedSkill extends ScoredSkill {
|
|
7
8
|
trigger: string;
|
|
8
9
|
}
|
|
9
10
|
export interface DiagnoseOutput {
|
|
10
11
|
detectedStack: string[];
|
|
11
12
|
recommendedSkills: RecommendedSkill[];
|
|
12
|
-
metaSkills:
|
|
13
|
+
metaSkills: typeof META_SKILL_REFS;
|
|
13
14
|
summary: string;
|
|
14
15
|
}
|
|
15
16
|
export declare class DiagnoseProjectUseCase {
|
|
16
17
|
private analyzer;
|
|
18
|
+
private client;
|
|
19
|
+
private scorer;
|
|
17
20
|
execute(input: DiagnoseInput): Promise<DiagnoseOutput>;
|
|
18
21
|
}
|
|
19
22
|
//# sourceMappingURL=DiagnoseProjectUseCase.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DiagnoseProjectUseCase.d.ts","sourceRoot":"","sources":["../../src/application/DiagnoseProjectUseCase.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"DiagnoseProjectUseCase.d.ts","sourceRoot":"","sources":["../../src/application/DiagnoseProjectUseCase.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgB,KAAK,WAAW,EAAE,MAAM,0CAA0C,CAAC;AAC1F,OAAO,EAAqB,eAAe,EAAE,MAAM,2CAA2C,CAAC;AAE/F,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAiB,SAAQ,WAAW;IACnD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;IACtC,UAAU,EAAE,OAAO,eAAe,CAAC;IACnC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,sBAAsB;IACjC,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,MAAM,CAAsB;IAE9B,OAAO,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;CA6C7D"}
|
|
@@ -1,29 +1,43 @@
|
|
|
1
1
|
import { ProjectAnalyzer } from "../domain/project/ProjectAnalyzer.js";
|
|
2
|
-
import {
|
|
2
|
+
import { SkillsShClient } from "../infrastructure/skills/SkillsShClient.js";
|
|
3
|
+
import { SkillsScorer } from "../infrastructure/skills/SkillsScorer.js";
|
|
4
|
+
import { STACK_TO_KEYWORDS, META_SKILL_REFS } from "../infrastructure/skills/StackKeywords.js";
|
|
3
5
|
export class DiagnoseProjectUseCase {
|
|
4
6
|
analyzer = new ProjectAnalyzer();
|
|
7
|
+
client = new SkillsShClient();
|
|
8
|
+
scorer = new SkillsScorer();
|
|
5
9
|
async execute(input) {
|
|
6
10
|
const projectPath = input.projectPath ?? process.cwd();
|
|
7
11
|
const includeDevDeps = input.includeDevDeps ?? true;
|
|
8
12
|
const project = await this.analyzer.analyze(projectPath, includeDevDeps);
|
|
9
|
-
const
|
|
13
|
+
const seenRefs = new Set();
|
|
10
14
|
const recommendedSkills = [];
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
15
|
+
// 각 스택에 대해 병렬로 skills.sh 검색 + 점수화
|
|
16
|
+
const searchTasks = project.detectedStack.map(async (stack) => {
|
|
17
|
+
const keyword = STACK_TO_KEYWORDS[stack] ?? stack;
|
|
18
|
+
const candidates = await this.client.searchSkills(keyword, projectPath);
|
|
19
|
+
const best = this.scorer.pickBest(candidates);
|
|
20
|
+
if (best) {
|
|
21
|
+
return { ...best, trigger: stack };
|
|
22
|
+
}
|
|
23
|
+
return null;
|
|
24
|
+
});
|
|
25
|
+
const results = await Promise.all(searchTasks);
|
|
26
|
+
for (const result of results) {
|
|
27
|
+
if (result && !seenRefs.has(result.ref)) {
|
|
28
|
+
seenRefs.add(result.ref);
|
|
29
|
+
recommendedSkills.push(result);
|
|
16
30
|
}
|
|
17
31
|
}
|
|
18
32
|
const stackStr = project.detectedStack.length > 0
|
|
19
33
|
? project.detectedStack.join(", ")
|
|
20
34
|
: "감지된 스택 없음";
|
|
21
35
|
const summary = `감지된 스택: ${stackStr} | ` +
|
|
22
|
-
`추천 스킬: ${recommendedSkills.length}개 + 메타 스킬 ${
|
|
36
|
+
`추천 스킬: ${recommendedSkills.length}개 + 메타 스킬 ${META_SKILL_REFS.length}개`;
|
|
23
37
|
return {
|
|
24
38
|
detectedStack: project.detectedStack,
|
|
25
39
|
recommendedSkills,
|
|
26
|
-
metaSkills:
|
|
40
|
+
metaSkills: META_SKILL_REFS,
|
|
27
41
|
summary,
|
|
28
42
|
};
|
|
29
43
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DiagnoseProjectUseCase.js","sourceRoot":"","sources":["../../src/application/DiagnoseProjectUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,
|
|
1
|
+
{"version":3,"file":"DiagnoseProjectUseCase.js","sourceRoot":"","sources":["../../src/application/DiagnoseProjectUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,4CAA4C,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAoB,MAAM,0CAA0C,CAAC;AAC1F,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAC;AAkB/F,MAAM,OAAO,sBAAsB;IACzB,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAC;IACjC,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;IAC9B,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;IAEpC,KAAK,CAAC,OAAO,CAAC,KAAoB;QAChC,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QACvD,MAAM,cAAc,GAAG,KAAK,CAAC,cAAc,IAAI,IAAI,CAAC;QAEpD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;QAEzE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;QACnC,MAAM,iBAAiB,GAAuB,EAAE,CAAC;QAEjD,kCAAkC;QAClC,MAAM,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YAC5D,MAAM,OAAO,GAAG,iBAAiB,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC;YAClD,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;YACxE,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YAC9C,IAAI,IAAI,EAAE,CAAC;gBACT,OAAO,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;YACrC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAE/C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACzB,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GACZ,OAAO,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;YAC9B,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;YAClC,CAAC,CAAC,WAAW,CAAC;QAElB,MAAM,OAAO,GACX,WAAW,QAAQ,KAAK;YACxB,UAAU,iBAAiB,CAAC,MAAM,aAAa,eAAe,CAAC,MAAM,GAAG,CAAC;QAE3E,OAAO;YACL,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,iBAAiB;YACjB,UAAU,EAAE,eAAe;YAC3B,OAAO;SACR,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -4,7 +4,8 @@ export interface SetupSkillsInput {
|
|
|
4
4
|
/** 특정 스킬만 지정. 미입력 시 자동 진단 후 설치 */
|
|
5
5
|
skillRefs?: string[];
|
|
6
6
|
includeMetaSkills?: boolean;
|
|
7
|
-
|
|
7
|
+
/** CLAUDE.md 동기화 여부 (기본값: true). 실제 설치 파일 기준으로 동기화합니다. */
|
|
8
|
+
syncClaudeMd?: boolean;
|
|
8
9
|
dryRun?: boolean;
|
|
9
10
|
}
|
|
10
11
|
export interface SetupSkillsOutput {
|
|
@@ -15,6 +16,8 @@ export interface SetupSkillsOutput {
|
|
|
15
16
|
export declare class SetupSkillsUseCase {
|
|
16
17
|
private runner;
|
|
17
18
|
private analyzer;
|
|
19
|
+
private client;
|
|
20
|
+
private scorer;
|
|
18
21
|
execute(input: SetupSkillsInput): Promise<SetupSkillsOutput>;
|
|
19
22
|
}
|
|
20
23
|
//# sourceMappingURL=SetupSkillsUseCase.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SetupSkillsUseCase.d.ts","sourceRoot":"","sources":["../../src/application/SetupSkillsUseCase.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"SetupSkillsUseCase.d.ts","sourceRoot":"","sources":["../../src/application/SetupSkillsUseCase.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6CAA6C,CAAC;AAEtF,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,0DAA0D;IAC1D,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,eAAe,EAAE,OAAO,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,MAAM,CAAsB;IAE9B,OAAO,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAgFnE"}
|
|
@@ -1,80 +1,76 @@
|
|
|
1
1
|
import { ProjectAnalyzer } from "../domain/project/ProjectAnalyzer.js";
|
|
2
2
|
import { SkillsCliRunner } from "../infrastructure/skills/SkillsCliRunner.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { SkillsShClient } from "../infrastructure/skills/SkillsShClient.js";
|
|
4
|
+
import { SkillsScorer } from "../infrastructure/skills/SkillsScorer.js";
|
|
5
|
+
import { STACK_TO_KEYWORDS, META_SKILL_REFS } from "../infrastructure/skills/StackKeywords.js";
|
|
6
|
+
import { SyncClaudeMdUseCase } from "./SyncClaudeMdUseCase.js";
|
|
5
7
|
export class SetupSkillsUseCase {
|
|
6
8
|
runner = new SkillsCliRunner();
|
|
7
9
|
analyzer = new ProjectAnalyzer();
|
|
10
|
+
client = new SkillsShClient();
|
|
11
|
+
scorer = new SkillsScorer();
|
|
8
12
|
async execute(input) {
|
|
9
|
-
const { projectPath, skillRefs, includeMetaSkills = true,
|
|
10
|
-
// 설치할
|
|
13
|
+
const { projectPath, skillRefs, includeMetaSkills = true, syncClaudeMd = true, dryRun = false, } = input;
|
|
14
|
+
// 설치할 ref 목록 결정
|
|
11
15
|
let refsToInstall = [];
|
|
12
16
|
if (skillRefs && skillRefs.length > 0) {
|
|
13
17
|
// 명시적으로 지정된 스킬
|
|
14
|
-
refsToInstall = skillRefs
|
|
15
|
-
ref,
|
|
16
|
-
domain: "custom",
|
|
17
|
-
description: ref,
|
|
18
|
-
}));
|
|
18
|
+
refsToInstall = skillRefs;
|
|
19
19
|
}
|
|
20
20
|
else {
|
|
21
|
-
// 자동
|
|
21
|
+
// 자동 진단: 기술 스택 감지 → skills.sh 검색 → 점수화 → 최고 선택
|
|
22
22
|
const project = await this.analyzer.analyze(projectPath, true);
|
|
23
|
+
const searchTasks = project.detectedStack.map(async (stack) => {
|
|
24
|
+
const keyword = STACK_TO_KEYWORDS[stack] ?? stack;
|
|
25
|
+
const candidates = await this.client.searchSkills(keyword, projectPath);
|
|
26
|
+
const best = this.scorer.pickBest(candidates);
|
|
27
|
+
return best?.ref ?? null;
|
|
28
|
+
});
|
|
29
|
+
const bestRefs = await Promise.all(searchTasks);
|
|
23
30
|
const seen = new Set();
|
|
24
|
-
for (const
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
refsToInstall.push(skillRef);
|
|
31
|
+
for (const ref of bestRefs) {
|
|
32
|
+
if (ref && !seen.has(ref)) {
|
|
33
|
+
seen.add(ref);
|
|
34
|
+
refsToInstall.push(ref);
|
|
29
35
|
}
|
|
30
36
|
}
|
|
31
37
|
}
|
|
32
38
|
// 메타 스킬 추가
|
|
33
39
|
if (includeMetaSkills) {
|
|
34
|
-
for (const meta of
|
|
35
|
-
if (!refsToInstall.
|
|
36
|
-
refsToInstall.push(meta);
|
|
40
|
+
for (const meta of META_SKILL_REFS) {
|
|
41
|
+
if (!refsToInstall.includes(meta.ref)) {
|
|
42
|
+
refsToInstall.push(meta.ref);
|
|
37
43
|
}
|
|
38
44
|
}
|
|
39
45
|
}
|
|
40
46
|
if (dryRun) {
|
|
41
47
|
return {
|
|
42
|
-
results: refsToInstall.map((
|
|
43
|
-
ref
|
|
48
|
+
results: refsToInstall.map((ref) => ({
|
|
49
|
+
ref,
|
|
44
50
|
success: true,
|
|
45
51
|
output: "[dry-run] 실제 설치 없음",
|
|
46
52
|
})),
|
|
47
53
|
claudeMdUpdated: false,
|
|
48
|
-
summary: `[dry-run] ${refsToInstall.length}개 스킬 설치 예정\n${refsToInstall.map((r) => ` - ${r
|
|
54
|
+
summary: `[dry-run] ${refsToInstall.length}개 스킬 설치 예정\n${refsToInstall.map((r) => ` - ${r}`).join("\n")}`,
|
|
49
55
|
};
|
|
50
56
|
}
|
|
51
57
|
// 실제 설치 (npx skills add)
|
|
52
|
-
const results = await this.runner.installMany(refsToInstall
|
|
53
|
-
// CLAUDE.md
|
|
58
|
+
const results = await this.runner.installMany(refsToInstall, projectPath);
|
|
59
|
+
// CLAUDE.md 동기화: 실제 설치된 파일 기준으로 sync
|
|
60
|
+
// (하드코딩 레지스트리 대신 실제 .claude/skills/ 파일을 읽어 동기화)
|
|
54
61
|
let claudeMdUpdated = false;
|
|
55
|
-
if (
|
|
56
|
-
const
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
const parts = r.ref.split("@");
|
|
61
|
-
const skillName = parts[1] ?? r.ref;
|
|
62
|
-
return {
|
|
63
|
-
domain: found?.domain ?? "unknown",
|
|
64
|
-
skillName,
|
|
65
|
-
description: found?.description,
|
|
66
|
-
};
|
|
62
|
+
if (syncClaudeMd && results.some((r) => r.success)) {
|
|
63
|
+
const syncUseCase = new SyncClaudeMdUseCase();
|
|
64
|
+
const syncResult = await syncUseCase.execute({
|
|
65
|
+
projectPath,
|
|
66
|
+
createIfMissing: true,
|
|
67
67
|
});
|
|
68
|
-
|
|
69
|
-
const updater = new ClaudeMdUpdater(projectPath);
|
|
70
|
-
const updateResult = await updater.update(successful, true);
|
|
71
|
-
claudeMdUpdated = updateResult.action !== "no_change";
|
|
72
|
-
}
|
|
68
|
+
claudeMdUpdated = syncResult.action !== "no_change";
|
|
73
69
|
}
|
|
74
70
|
const successCount = results.filter((r) => r.success).length;
|
|
75
71
|
const failCount = results.filter((r) => !r.success).length;
|
|
76
72
|
const summary = `총 ${results.length}개 스킬 설치 시도 (성공: ${successCount}, 실패: ${failCount})` +
|
|
77
|
-
(claudeMdUpdated ? " | CLAUDE.md
|
|
73
|
+
(claudeMdUpdated ? " | CLAUDE.md 동기화됨" : "");
|
|
78
74
|
return { results, claudeMdUpdated, summary };
|
|
79
75
|
}
|
|
80
76
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SetupSkillsUseCase.js","sourceRoot":"","sources":["../../src/application/SetupSkillsUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAC9E,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"SetupSkillsUseCase.js","sourceRoot":"","sources":["../../src/application/SetupSkillsUseCase.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -41,21 +41,21 @@ find-skills, skill-creator 메타 스킬도 함께 설치됩니다.`, {
|
|
|
41
41
|
.boolean()
|
|
42
42
|
.optional()
|
|
43
43
|
.describe("find-skills, skill-creator 메타 스킬 포함 여부 (기본값: true)"),
|
|
44
|
-
|
|
44
|
+
syncClaudeMd: z
|
|
45
45
|
.boolean()
|
|
46
46
|
.optional()
|
|
47
|
-
.describe("CLAUDE.md
|
|
47
|
+
.describe("설치 후 실제 파일 기준으로 CLAUDE.md 동기화 여부 (기본값: true)"),
|
|
48
48
|
dryRun: z
|
|
49
49
|
.boolean()
|
|
50
50
|
.optional()
|
|
51
51
|
.describe("실제 설치 없이 설치될 스킬 목록만 미리보기 (기본값: false)"),
|
|
52
|
-
}, async ({ projectPath, skillRefs, includeMetaSkills,
|
|
52
|
+
}, async ({ projectPath, skillRefs, includeMetaSkills, syncClaudeMd, dryRun }) => {
|
|
53
53
|
const useCase = new SetupSkillsUseCase();
|
|
54
54
|
const result = await useCase.execute({
|
|
55
55
|
projectPath,
|
|
56
56
|
skillRefs,
|
|
57
57
|
includeMetaSkills,
|
|
58
|
-
|
|
58
|
+
syncClaudeMd,
|
|
59
59
|
dryRun,
|
|
60
60
|
});
|
|
61
61
|
return {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,4CAA4C,CAAC;AAE7E,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,aAAa;IACnB,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,gFAAgF;AAChF,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB;yDACuD,EACvD;IACE,WAAW,EAAE,CAAC;SACX,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,4BAA4B,CAAC;IACzC,cAAc,EAAE,CAAC;SACd,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CAAC,mCAAmC,CAAC;CACjD,EACD,KAAK,EAAE,EAAE,WAAW,EAAE,cAAc,EAAE,EAAE,EAAE;IACxC,MAAM,OAAO,GAAG,IAAI,sBAAsB,EAAE,CAAC;IAC7C,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC,CAAC;IACtE,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;KACnE,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,gFAAgF;AAChF,MAAM,CAAC,IAAI,CACT,eAAe,EACf;;4CAE0C,EAC1C;IACE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;IAC/C,SAAS,EAAE,CAAC;SACT,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACjB,QAAQ,EAAE;SACV,QAAQ,CACP,sFAAsF,CACvF;IACH,iBAAiB,EAAE,CAAC;SACjB,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CAAC,oDAAoD,CAAC;IACjE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { SkillCandidate } from "./SkillsShClient.js";
|
|
2
|
+
export interface ScoredSkill extends SkillCandidate {
|
|
3
|
+
score: number;
|
|
4
|
+
popularityScore: number;
|
|
5
|
+
credibilityScore: number;
|
|
6
|
+
}
|
|
7
|
+
export declare class SkillsScorer {
|
|
8
|
+
/**
|
|
9
|
+
* 후보 스킬들을 점수화하여 내림차순으로 반환합니다.
|
|
10
|
+
*/
|
|
11
|
+
score(candidates: SkillCandidate[]): ScoredSkill[];
|
|
12
|
+
/**
|
|
13
|
+
* 후보 중 최고 점수 스킬 1개를 반환합니다.
|
|
14
|
+
*/
|
|
15
|
+
pickBest(candidates: SkillCandidate[]): ScoredSkill | null;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=SkillsScorer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SkillsScorer.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/skills/SkillsScorer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,MAAM,WAAW,WAAY,SAAQ,cAAc;IACjD,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAsCD,qBAAa,YAAY;IACvB;;OAEG;IACH,KAAK,CAAC,UAAU,EAAE,cAAc,EAAE,GAAG,WAAW,EAAE;IAuBlD;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,cAAc,EAAE,GAAG,WAAW,GAAG,IAAI;CAI3D"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 배포자(owner) 신뢰도 등급
|
|
3
|
+
*
|
|
4
|
+
* Tier 1 (1.0 ~ 0.9): 공식 조직/기업
|
|
5
|
+
* Tier 2 (0.8 ~ 0.65): 검증된 OSS 개발자
|
|
6
|
+
* Tier 3 (0.5 ~ 0.4): 일반 배포자
|
|
7
|
+
*/
|
|
8
|
+
const PUBLISHER_CREDIBILITY = {
|
|
9
|
+
// Tier 1: Official organizations
|
|
10
|
+
anthropics: 1.0,
|
|
11
|
+
"vercel-labs": 1.0,
|
|
12
|
+
microsoft: 0.95,
|
|
13
|
+
clerk: 0.9,
|
|
14
|
+
callstackincubator: 0.9,
|
|
15
|
+
"remotion-dev": 0.88,
|
|
16
|
+
"browser-use": 0.82,
|
|
17
|
+
// Tier 2: Well-known community developers
|
|
18
|
+
antfu: 0.8,
|
|
19
|
+
wshobson: 0.65,
|
|
20
|
+
sickn33: 0.55,
|
|
21
|
+
};
|
|
22
|
+
const DEFAULT_CREDIBILITY = 0.4;
|
|
23
|
+
/**
|
|
24
|
+
* 점수 가중치
|
|
25
|
+
* - 인기도(설치 수): 50%
|
|
26
|
+
* - 배포자 신뢰도: 35%
|
|
27
|
+
* - 보안(신뢰도 대리 지표): 15%
|
|
28
|
+
*/
|
|
29
|
+
const WEIGHTS = {
|
|
30
|
+
popularity: 0.5,
|
|
31
|
+
credibility: 0.35,
|
|
32
|
+
security: 0.15,
|
|
33
|
+
};
|
|
34
|
+
export class SkillsScorer {
|
|
35
|
+
/**
|
|
36
|
+
* 후보 스킬들을 점수화하여 내림차순으로 반환합니다.
|
|
37
|
+
*/
|
|
38
|
+
score(candidates) {
|
|
39
|
+
if (candidates.length === 0)
|
|
40
|
+
return [];
|
|
41
|
+
const maxInstalls = Math.max(...candidates.map((c) => c.installs), 1);
|
|
42
|
+
return candidates
|
|
43
|
+
.map((candidate) => {
|
|
44
|
+
const popularityScore = candidate.installs / maxInstalls;
|
|
45
|
+
const credibilityScore = PUBLISHER_CREDIBILITY[candidate.owner] ?? DEFAULT_CREDIBILITY;
|
|
46
|
+
// 보안은 현재 신뢰도로 대리 평가 (공식 배포자 = 더 안전)
|
|
47
|
+
const securityScore = credibilityScore;
|
|
48
|
+
const score = popularityScore * WEIGHTS.popularity +
|
|
49
|
+
credibilityScore * WEIGHTS.credibility +
|
|
50
|
+
securityScore * WEIGHTS.security;
|
|
51
|
+
return { ...candidate, score, popularityScore, credibilityScore };
|
|
52
|
+
})
|
|
53
|
+
.sort((a, b) => b.score - a.score);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* 후보 중 최고 점수 스킬 1개를 반환합니다.
|
|
57
|
+
*/
|
|
58
|
+
pickBest(candidates) {
|
|
59
|
+
const scored = this.score(candidates);
|
|
60
|
+
return scored[0] ?? null;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=SkillsScorer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SkillsScorer.js","sourceRoot":"","sources":["../../../src/infrastructure/skills/SkillsScorer.ts"],"names":[],"mappings":"AAQA;;;;;;GAMG;AACH,MAAM,qBAAqB,GAA2B;IACpD,iCAAiC;IACjC,UAAU,EAAE,GAAG;IACf,aAAa,EAAE,GAAG;IAClB,SAAS,EAAE,IAAI;IACf,KAAK,EAAE,GAAG;IACV,kBAAkB,EAAE,GAAG;IACvB,cAAc,EAAE,IAAI;IACpB,aAAa,EAAE,IAAI;IACnB,0CAA0C;IAC1C,KAAK,EAAE,GAAG;IACV,QAAQ,EAAE,IAAI;IACd,OAAO,EAAE,IAAI;CACd,CAAC;AAEF,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAEhC;;;;;GAKG;AACH,MAAM,OAAO,GAAG;IACd,UAAU,EAAE,GAAG;IACf,WAAW,EAAE,IAAI;IACjB,QAAQ,EAAE,IAAI;CACN,CAAC;AAEX,MAAM,OAAO,YAAY;IACvB;;OAEG;IACH,KAAK,CAAC,UAA4B;QAChC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAEvC,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;QAEtE,OAAO,UAAU;aACd,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE;YACjB,MAAM,eAAe,GAAG,SAAS,CAAC,QAAQ,GAAG,WAAW,CAAC;YACzD,MAAM,gBAAgB,GACpB,qBAAqB,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,mBAAmB,CAAC;YAChE,oCAAoC;YACpC,MAAM,aAAa,GAAG,gBAAgB,CAAC;YAEvC,MAAM,KAAK,GACT,eAAe,GAAG,OAAO,CAAC,UAAU;gBACpC,gBAAgB,GAAG,OAAO,CAAC,WAAW;gBACtC,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC;YAEnC,OAAO,EAAE,GAAG,SAAS,EAAE,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,CAAC;QACpE,CAAC,CAAC;aACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,UAA4B;QACnC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACtC,OAAO,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IAC3B,CAAC;CACF"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export interface SkillCandidate {
|
|
2
|
+
ref: string;
|
|
3
|
+
owner: string;
|
|
4
|
+
repo: string;
|
|
5
|
+
skillId: string;
|
|
6
|
+
installs: number;
|
|
7
|
+
url: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* npx skills find <query> 를 호출하고 결과를 파싱해 후보 스킬 목록을 반환합니다.
|
|
11
|
+
*/
|
|
12
|
+
export declare class SkillsShClient {
|
|
13
|
+
searchSkills(query: string, cwd?: string): Promise<SkillCandidate[]>;
|
|
14
|
+
/**
|
|
15
|
+
* npx skills find 출력 파싱
|
|
16
|
+
* 형식:
|
|
17
|
+
* owner/repo@skill-name 5.1K installs
|
|
18
|
+
* └ https://skills.sh/owner/repo/skill-name
|
|
19
|
+
*/
|
|
20
|
+
private parseOutput;
|
|
21
|
+
/** "5.1K" → 5100, "2M" → 2000000 */
|
|
22
|
+
private parseInstallCount;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=SkillsShClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SkillsShClient.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/skills/SkillsShClient.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;GAEG;AACH,qBAAa,cAAc;IACnB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,SAAgB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAajF;;;;;OAKG;IACH,OAAO,CAAC,WAAW;IAoCnB,oCAAoC;IACpC,OAAO,CAAC,iBAAiB;CAQ1B"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { execFile } from "child_process";
|
|
2
|
+
import { promisify } from "util";
|
|
3
|
+
const execFileAsync = promisify(execFile);
|
|
4
|
+
/**
|
|
5
|
+
* npx skills find <query> 를 호출하고 결과를 파싱해 후보 스킬 목록을 반환합니다.
|
|
6
|
+
*/
|
|
7
|
+
export class SkillsShClient {
|
|
8
|
+
async searchSkills(query, cwd = process.cwd()) {
|
|
9
|
+
try {
|
|
10
|
+
const { stdout } = await execFileAsync("npx", ["--yes", "skills", "find", query], { cwd, timeout: 30_000, env: { ...process.env } });
|
|
11
|
+
return this.parseOutput(stdout);
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return [];
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* npx skills find 출력 파싱
|
|
19
|
+
* 형식:
|
|
20
|
+
* owner/repo@skill-name 5.1K installs
|
|
21
|
+
* └ https://skills.sh/owner/repo/skill-name
|
|
22
|
+
*/
|
|
23
|
+
parseOutput(output) {
|
|
24
|
+
const candidates = [];
|
|
25
|
+
const lines = output.split("\n");
|
|
26
|
+
for (const line of lines) {
|
|
27
|
+
// ANSI 이스케이프 코드 제거
|
|
28
|
+
const clean = line.replace(/\x1b\[[0-9;]*m/g, "").trim();
|
|
29
|
+
// "owner/repo@skill-name 5.1K installs" 패턴 매칭
|
|
30
|
+
const match = clean.match(/^([\w.-]+\/[\w.-]+@[\w.-]+)\s+([\d.]+[KMB]?)\s+installs$/i);
|
|
31
|
+
if (!match)
|
|
32
|
+
continue;
|
|
33
|
+
const ref = match[1];
|
|
34
|
+
const installs = this.parseInstallCount(match[2]);
|
|
35
|
+
const atIdx = ref.indexOf("@");
|
|
36
|
+
const sourcePart = ref.slice(0, atIdx);
|
|
37
|
+
const skillId = ref.slice(atIdx + 1);
|
|
38
|
+
const slashIdx = sourcePart.indexOf("/");
|
|
39
|
+
const owner = sourcePart.slice(0, slashIdx);
|
|
40
|
+
const repo = sourcePart.slice(slashIdx + 1);
|
|
41
|
+
candidates.push({
|
|
42
|
+
ref,
|
|
43
|
+
owner,
|
|
44
|
+
repo,
|
|
45
|
+
skillId,
|
|
46
|
+
installs,
|
|
47
|
+
url: `https://skills.sh/${owner}/${repo}/${skillId}`,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
return candidates;
|
|
51
|
+
}
|
|
52
|
+
/** "5.1K" → 5100, "2M" → 2000000 */
|
|
53
|
+
parseInstallCount(str) {
|
|
54
|
+
const num = parseFloat(str);
|
|
55
|
+
const suffix = str.slice(-1).toUpperCase();
|
|
56
|
+
if (suffix === "K")
|
|
57
|
+
return Math.round(num * 1_000);
|
|
58
|
+
if (suffix === "M")
|
|
59
|
+
return Math.round(num * 1_000_000);
|
|
60
|
+
if (suffix === "B")
|
|
61
|
+
return Math.round(num * 1_000_000_000);
|
|
62
|
+
return Math.round(num);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=SkillsShClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SkillsShClient.js","sourceRoot":"","sources":["../../../src/infrastructure/skills/SkillsShClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 기술 스택 → skills.sh 검색 키워드 매핑
|
|
3
|
+
* 각 스택에 대해 npx skills find <keyword> 로 후보 스킬을 검색합니다.
|
|
4
|
+
*/
|
|
5
|
+
export declare const STACK_TO_KEYWORDS: Record<string, string>;
|
|
6
|
+
/**
|
|
7
|
+
* 항상 설치하는 메타 스킬 (ref 형식: "owner/repo@skillId")
|
|
8
|
+
*/
|
|
9
|
+
export declare const META_SKILL_REFS: Array<{
|
|
10
|
+
ref: string;
|
|
11
|
+
description: string;
|
|
12
|
+
}>;
|
|
13
|
+
//# sourceMappingURL=StackKeywords.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StackKeywords.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/skills/StackKeywords.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA2BpD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CASvE,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 기술 스택 → skills.sh 검색 키워드 매핑
|
|
3
|
+
* 각 스택에 대해 npx skills find <keyword> 로 후보 스킬을 검색합니다.
|
|
4
|
+
*/
|
|
5
|
+
export const STACK_TO_KEYWORDS = {
|
|
6
|
+
// Frontend
|
|
7
|
+
next: "nextjs",
|
|
8
|
+
nextjs: "nextjs",
|
|
9
|
+
react: "react",
|
|
10
|
+
"react-native": "react-native",
|
|
11
|
+
vue: "vue",
|
|
12
|
+
nuxt: "nuxt",
|
|
13
|
+
svelte: "svelte",
|
|
14
|
+
angular: "angular",
|
|
15
|
+
// Testing
|
|
16
|
+
vitest: "vitest",
|
|
17
|
+
jest: "jest",
|
|
18
|
+
playwright: "playwright",
|
|
19
|
+
cypress: "cypress",
|
|
20
|
+
// Backend
|
|
21
|
+
prisma: "prisma",
|
|
22
|
+
express: "express",
|
|
23
|
+
fastify: "fastify",
|
|
24
|
+
trpc: "trpc",
|
|
25
|
+
graphql: "graphql",
|
|
26
|
+
// DevOps
|
|
27
|
+
docker: "docker",
|
|
28
|
+
kubernetes: "kubernetes",
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* 항상 설치하는 메타 스킬 (ref 형식: "owner/repo@skillId")
|
|
32
|
+
*/
|
|
33
|
+
export const META_SKILL_REFS = [
|
|
34
|
+
{
|
|
35
|
+
ref: "vercel-labs/skills@find-skills",
|
|
36
|
+
description: "skills.sh에서 스킬 탐색 및 설치",
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
ref: "anthropics/skills@skill-creator",
|
|
40
|
+
description: "새로운 스킬 생성 가이드",
|
|
41
|
+
},
|
|
42
|
+
];
|
|
43
|
+
//# sourceMappingURL=StackKeywords.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StackKeywords.js","sourceRoot":"","sources":["../../../src/infrastructure/skills/StackKeywords.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAA2B;IACvD,WAAW;IACX,IAAI,EAAE,QAAQ;IACd,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,OAAO;IACd,cAAc,EAAE,cAAc;IAC9B,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,SAAS;IAElB,UAAU;IACV,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,MAAM;IACZ,UAAU,EAAE,YAAY;IACxB,OAAO,EAAE,SAAS;IAElB,UAAU;IACV,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;IAClB,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,SAAS;IAElB,SAAS;IACT,MAAM,EAAE,QAAQ;IAChB,UAAU,EAAE,YAAY;CACzB,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAgD;IAC1E;QACE,GAAG,EAAE,gCAAgC;QACrC,WAAW,EAAE,wBAAwB;KACtC;IACD;QACE,GAAG,EAAE,iCAAiC;QACtC,WAAW,EAAE,eAAe;KAC7B;CACF,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 기술 스택 키워드 → skills.sh 스킬 레퍼런스 매핑
|
|
3
|
-
* 형식: "owner/repo@skill-name"
|
|
4
|
-
*/
|
|
5
|
-
export interface SkillRef {
|
|
6
|
-
ref: string;
|
|
7
|
-
domain: string;
|
|
8
|
-
description: string;
|
|
9
|
-
}
|
|
10
|
-
export declare const STACK_TO_SKILL_REF: Record<string, SkillRef>;
|
|
11
|
-
/**
|
|
12
|
-
* 항상 설치하는 메타 스킬 (스킬 탐색 및 생성 지원)
|
|
13
|
-
*/
|
|
14
|
-
export declare const META_SKILLS: SkillRef[];
|
|
15
|
-
//# sourceMappingURL=SkillsRegistry.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SkillsRegistry.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/skills/SkillsRegistry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAwFvD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,WAAW,EAAE,QAAQ,EAWjC,CAAC"}
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
export const STACK_TO_SKILL_REF = {
|
|
2
|
-
// Frontend
|
|
3
|
-
next: {
|
|
4
|
-
ref: "vercel-labs/next-skills@next-best-practices",
|
|
5
|
-
domain: "frontend",
|
|
6
|
-
description: "Next.js 모범 사례",
|
|
7
|
-
},
|
|
8
|
-
nextjs: {
|
|
9
|
-
ref: "vercel-labs/next-skills@next-best-practices",
|
|
10
|
-
domain: "frontend",
|
|
11
|
-
description: "Next.js 모범 사례",
|
|
12
|
-
},
|
|
13
|
-
react: {
|
|
14
|
-
ref: "vercel-labs/agent-skills@vercel-react-best-practices",
|
|
15
|
-
domain: "frontend",
|
|
16
|
-
description: "React 모범 사례",
|
|
17
|
-
},
|
|
18
|
-
"react-native": {
|
|
19
|
-
ref: "callstackincubator/agent-skills@react-native-best-practices",
|
|
20
|
-
domain: "frontend",
|
|
21
|
-
description: "React Native 모범 사례",
|
|
22
|
-
},
|
|
23
|
-
vue: {
|
|
24
|
-
ref: "antfu/skills@vue-testing-best-practices",
|
|
25
|
-
domain: "frontend",
|
|
26
|
-
description: "Vue 테스트 모범 사례",
|
|
27
|
-
},
|
|
28
|
-
// Testing
|
|
29
|
-
vitest: {
|
|
30
|
-
ref: "antfu/skills@vitest",
|
|
31
|
-
domain: "testing",
|
|
32
|
-
description: "Vitest 단위 테스트",
|
|
33
|
-
},
|
|
34
|
-
jest: {
|
|
35
|
-
ref: "wshobson/agents@javascript-testing-patterns",
|
|
36
|
-
domain: "testing",
|
|
37
|
-
description: "JavaScript 테스트 패턴",
|
|
38
|
-
},
|
|
39
|
-
playwright: {
|
|
40
|
-
ref: "anthropics/skills@webapp-testing",
|
|
41
|
-
domain: "testing",
|
|
42
|
-
description: "Playwright 웹 앱 테스팅",
|
|
43
|
-
},
|
|
44
|
-
cypress: {
|
|
45
|
-
ref: "wshobson/agents@e2e-testing-patterns",
|
|
46
|
-
domain: "testing",
|
|
47
|
-
description: "E2E 테스트 패턴",
|
|
48
|
-
},
|
|
49
|
-
// Backend
|
|
50
|
-
prisma: {
|
|
51
|
-
ref: "sickn33/antigravity-awesome-skills@prisma-expert",
|
|
52
|
-
domain: "backend",
|
|
53
|
-
description: "Prisma ORM 전문가",
|
|
54
|
-
},
|
|
55
|
-
express: {
|
|
56
|
-
ref: "wshobson/agents@nodejs-backend-patterns",
|
|
57
|
-
domain: "backend",
|
|
58
|
-
description: "Node.js 백엔드 패턴",
|
|
59
|
-
},
|
|
60
|
-
fastify: {
|
|
61
|
-
ref: "wshobson/agents@nodejs-backend-patterns",
|
|
62
|
-
domain: "backend",
|
|
63
|
-
description: "Node.js 백엔드 패턴",
|
|
64
|
-
},
|
|
65
|
-
graphql: {
|
|
66
|
-
ref: "wshobson/agents@nodejs-backend-patterns",
|
|
67
|
-
domain: "backend",
|
|
68
|
-
description: "Node.js 백엔드 패턴",
|
|
69
|
-
},
|
|
70
|
-
// DevOps
|
|
71
|
-
docker: {
|
|
72
|
-
ref: "sickn33/antigravity-awesome-skills@docker-expert",
|
|
73
|
-
domain: "devops",
|
|
74
|
-
description: "Docker 전문가",
|
|
75
|
-
},
|
|
76
|
-
kubernetes: {
|
|
77
|
-
ref: "wshobson/agents@k8s-manifest-generator",
|
|
78
|
-
domain: "devops",
|
|
79
|
-
description: "Kubernetes 매니페스트 생성",
|
|
80
|
-
},
|
|
81
|
-
"github-actions": {
|
|
82
|
-
ref: "wshobson/agents@github-actions-templates",
|
|
83
|
-
domain: "devops",
|
|
84
|
-
description: "GitHub Actions 템플릿",
|
|
85
|
-
},
|
|
86
|
-
};
|
|
87
|
-
/**
|
|
88
|
-
* 항상 설치하는 메타 스킬 (스킬 탐색 및 생성 지원)
|
|
89
|
-
*/
|
|
90
|
-
export const META_SKILLS = [
|
|
91
|
-
{
|
|
92
|
-
ref: "vercel-labs/skills@find-skills",
|
|
93
|
-
domain: "meta",
|
|
94
|
-
description: "skills.sh에서 스킬 탐색 및 설치",
|
|
95
|
-
},
|
|
96
|
-
{
|
|
97
|
-
ref: "anthropics/skills@skill-creator",
|
|
98
|
-
domain: "meta",
|
|
99
|
-
description: "새로운 스킬 생성 가이드",
|
|
100
|
-
},
|
|
101
|
-
];
|
|
102
|
-
//# sourceMappingURL=SkillsRegistry.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SkillsRegistry.js","sourceRoot":"","sources":["../../../src/infrastructure/skills/SkillsRegistry.ts"],"names":[],"mappings":"AAUA,MAAM,CAAC,MAAM,kBAAkB,GAA6B;IAC1D,WAAW;IACX,IAAI,EAAE;QACJ,GAAG,EAAE,6CAA6C;QAClD,MAAM,EAAE,UAAU;QAClB,WAAW,EAAE,eAAe;KAC7B;IACD,MAAM,EAAE;QACN,GAAG,EAAE,6CAA6C;QAClD,MAAM,EAAE,UAAU;QAClB,WAAW,EAAE,eAAe;KAC7B;IACD,KAAK,EAAE;QACL,GAAG,EAAE,sDAAsD;QAC3D,MAAM,EAAE,UAAU;QAClB,WAAW,EAAE,aAAa;KAC3B;IACD,cAAc,EAAE;QACd,GAAG,EAAE,6DAA6D;QAClE,MAAM,EAAE,UAAU;QAClB,WAAW,EAAE,oBAAoB;KAClC;IACD,GAAG,EAAE;QACH,GAAG,EAAE,yCAAyC;QAC9C,MAAM,EAAE,UAAU;QAClB,WAAW,EAAE,eAAe;KAC7B;IAED,UAAU;IACV,MAAM,EAAE;QACN,GAAG,EAAE,qBAAqB;QAC1B,MAAM,EAAE,SAAS;QACjB,WAAW,EAAE,eAAe;KAC7B;IACD,IAAI,EAAE;QACJ,GAAG,EAAE,6CAA6C;QAClD,MAAM,EAAE,SAAS;QACjB,WAAW,EAAE,mBAAmB;KACjC;IACD,UAAU,EAAE;QACV,GAAG,EAAE,kCAAkC;QACvC,MAAM,EAAE,SAAS;QACjB,WAAW,EAAE,oBAAoB;KAClC;IACD,OAAO,EAAE;QACP,GAAG,EAAE,sCAAsC;QAC3C,MAAM,EAAE,SAAS;QACjB,WAAW,EAAE,YAAY;KAC1B;IAED,UAAU;IACV,MAAM,EAAE;QACN,GAAG,EAAE,kDAAkD;QACvD,MAAM,EAAE,SAAS;QACjB,WAAW,EAAE,gBAAgB;KAC9B;IACD,OAAO,EAAE;QACP,GAAG,EAAE,yCAAyC;QAC9C,MAAM,EAAE,SAAS;QACjB,WAAW,EAAE,gBAAgB;KAC9B;IACD,OAAO,EAAE;QACP,GAAG,EAAE,yCAAyC;QAC9C,MAAM,EAAE,SAAS;QACjB,WAAW,EAAE,gBAAgB;KAC9B;IACD,OAAO,EAAE;QACP,GAAG,EAAE,yCAAyC;QAC9C,MAAM,EAAE,SAAS;QACjB,WAAW,EAAE,gBAAgB;KAC9B;IAED,SAAS;IACT,MAAM,EAAE;QACN,GAAG,EAAE,kDAAkD;QACvD,MAAM,EAAE,QAAQ;QAChB,WAAW,EAAE,YAAY;KAC1B;IACD,UAAU,EAAE;QACV,GAAG,EAAE,wCAAwC;QAC7C,MAAM,EAAE,QAAQ;QAChB,WAAW,EAAE,qBAAqB;KACnC;IACD,gBAAgB,EAAE;QAChB,GAAG,EAAE,0CAA0C;QAC/C,MAAM,EAAE,QAAQ;QAChB,WAAW,EAAE,oBAAoB;KAClC;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAe;IACrC;QACE,GAAG,EAAE,gCAAgC;QACrC,MAAM,EAAE,MAAM;QACd,WAAW,EAAE,wBAAwB;KACtC;IACD;QACE,GAAG,EAAE,iCAAiC;QACtC,MAAM,EAAE,MAAM;QACd,WAAW,EAAE,eAAe;KAC7B;CACF,CAAC"}
|