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.

Files changed (27) hide show
  1. package/dist/application/DiagnoseProjectUseCase.d.ts +6 -3
  2. package/dist/application/DiagnoseProjectUseCase.d.ts.map +1 -1
  3. package/dist/application/DiagnoseProjectUseCase.js +23 -9
  4. package/dist/application/DiagnoseProjectUseCase.js.map +1 -1
  5. package/dist/application/SetupSkillsUseCase.d.ts +4 -1
  6. package/dist/application/SetupSkillsUseCase.d.ts.map +1 -1
  7. package/dist/application/SetupSkillsUseCase.js +37 -41
  8. package/dist/application/SetupSkillsUseCase.js.map +1 -1
  9. package/dist/index.js +4 -4
  10. package/dist/index.js.map +1 -1
  11. package/dist/infrastructure/skills/SkillsScorer.d.ts +17 -0
  12. package/dist/infrastructure/skills/SkillsScorer.d.ts.map +1 -0
  13. package/dist/infrastructure/skills/SkillsScorer.js +63 -0
  14. package/dist/infrastructure/skills/SkillsScorer.js.map +1 -0
  15. package/dist/infrastructure/skills/SkillsShClient.d.ts +24 -0
  16. package/dist/infrastructure/skills/SkillsShClient.d.ts.map +1 -0
  17. package/dist/infrastructure/skills/SkillsShClient.js +65 -0
  18. package/dist/infrastructure/skills/SkillsShClient.js.map +1 -0
  19. package/dist/infrastructure/skills/StackKeywords.d.ts +13 -0
  20. package/dist/infrastructure/skills/StackKeywords.d.ts.map +1 -0
  21. package/dist/infrastructure/skills/StackKeywords.js +43 -0
  22. package/dist/infrastructure/skills/StackKeywords.js.map +1 -0
  23. package/package.json +1 -1
  24. package/dist/infrastructure/skills/SkillsRegistry.d.ts +0 -15
  25. package/dist/infrastructure/skills/SkillsRegistry.d.ts.map +0 -1
  26. package/dist/infrastructure/skills/SkillsRegistry.js +0 -102
  27. package/dist/infrastructure/skills/SkillsRegistry.js.map +0 -1
@@ -1,19 +1,22 @@
1
- import { type SkillRef } from "../infrastructure/skills/SkillsRegistry.js";
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 SkillRef {
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: SkillRef[];
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":"AACA,OAAO,EAGL,KAAK,QAAQ,EACd,MAAM,4CAA4C,CAAC;AAEpD,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAiB,SAAQ,QAAQ;IAChD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;IACtC,UAAU,EAAE,QAAQ,EAAE,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,sBAAsB;IACjC,OAAO,CAAC,QAAQ,CAAyB;IAEnC,OAAO,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;CAiC7D"}
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 { STACK_TO_SKILL_REF, META_SKILLS, } from "../infrastructure/skills/SkillsRegistry.js";
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 seen = new Set();
13
+ const seenRefs = new Set();
10
14
  const recommendedSkills = [];
11
- for (const stack of project.detectedStack) {
12
- const skillRef = STACK_TO_SKILL_REF[stack];
13
- if (skillRef && !seen.has(skillRef.ref)) {
14
- seen.add(skillRef.ref);
15
- recommendedSkills.push({ ...skillRef, trigger: stack });
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}개 + 메타 스킬 ${META_SKILLS.length}개`;
36
+ `추천 스킬: ${recommendedSkills.length}개 + 메타 스킬 ${META_SKILL_REFS.length}개`;
23
37
  return {
24
38
  detectedStack: project.detectedStack,
25
39
  recommendedSkills,
26
- metaSkills: META_SKILLS,
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,EACL,kBAAkB,EAClB,WAAW,GAEZ,MAAM,4CAA4C,CAAC;AAkBpD,MAAM,OAAO,sBAAsB;IACzB,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAC;IAEzC,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,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,MAAM,iBAAiB,GAAuB,EAAE,CAAC;QAEjD,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YAC1C,MAAM,QAAQ,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAC3C,IAAI,QAAQ,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;gBACvB,iBAAiB,CAAC,IAAI,CAAC,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YAC1D,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,WAAW,CAAC,MAAM,GAAG,CAAC;QAEvE,OAAO;YACL,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,iBAAiB;YACjB,UAAU,EAAE,WAAW;YACvB,OAAO;SACR,CAAC;IACJ,CAAC;CACF"}
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
- updateClaudeMd?: boolean;
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":"AAQA,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,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,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;IAEnC,OAAO,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CA2FnE"}
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 { ClaudeMdUpdater } from "../infrastructure/fs/ClaudeMdUpdater.js";
4
- import { STACK_TO_SKILL_REF, META_SKILLS, } from "../infrastructure/skills/SkillsRegistry.js";
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, updateClaudeMd = true, dryRun = false, } = input;
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.map((ref) => ({
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 stack of project.detectedStack) {
25
- const skillRef = STACK_TO_SKILL_REF[stack];
26
- if (skillRef && !seen.has(skillRef.ref)) {
27
- seen.add(skillRef.ref);
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 META_SKILLS) {
35
- if (!refsToInstall.some((r) => r.ref === meta.ref)) {
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((r) => ({
43
- ref: r.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.ref}`).join("\n")}`,
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.map((r) => r.ref), projectPath);
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 (updateClaudeMd) {
56
- const successful = results
57
- .filter((r) => r.success)
58
- .map((r) => {
59
- const found = refsToInstall.find((s) => s.ref === r.ref);
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
- if (successful.length > 0) {
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":"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"}
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
- updateClaudeMd: z
44
+ syncClaudeMd: z
45
45
  .boolean()
46
46
  .optional()
47
- .describe("CLAUDE.md 자동 업데이트 여부 (기본값: true)"),
47
+ .describe("설치 후 실제 파일 기준으로 CLAUDE.md 동기화 여부 (기본값: true)"),
48
48
  dryRun: z
49
49
  .boolean()
50
50
  .optional()
51
51
  .describe("실제 설치 없이 설치될 스킬 목록만 미리보기 (기본값: false)"),
52
- }, async ({ projectPath, skillRefs, includeMetaSkills, updateClaudeMd, dryRun }) => {
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
- updateClaudeMd,
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":"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"}
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,6 +1,6 @@
1
1
  {
2
2
  "name": "oh-my-agent",
3
- "version": "1.0.2",
3
+ "version": "1.1.0",
4
4
  "description": "AI 스킬을 자동으로 진단·배포·관리하는 MCP 서버. 프로젝트 기술 스택을 분석해 적합한 AI 스킬을 추천·설치합니다.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -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"}