oh-my-agent 1.0.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of oh-my-agent might be problematic. Click here for more details.

Files changed (35) hide show
  1. package/dist/application/SyncClaudeMdUseCase.d.ts +1 -1
  2. package/dist/application/SyncClaudeMdUseCase.d.ts.map +1 -1
  3. package/dist/application/SyncClaudeMdUseCase.js +33 -16
  4. package/dist/application/SyncClaudeMdUseCase.js.map +1 -1
  5. package/dist/infrastructure/skills/SkillsCliRunner.js +1 -1
  6. package/dist/infrastructure/skills/SkillsCliRunner.js.map +1 -1
  7. package/package.json +1 -1
  8. package/dist/application/OrganizeSkillsUseCase.d.ts +0 -24
  9. package/dist/application/OrganizeSkillsUseCase.d.ts.map +0 -1
  10. package/dist/application/OrganizeSkillsUseCase.js +0 -57
  11. package/dist/application/OrganizeSkillsUseCase.js.map +0 -1
  12. package/dist/domain/skill/Skill.d.ts +0 -12
  13. package/dist/domain/skill/Skill.d.ts.map +0 -1
  14. package/dist/domain/skill/Skill.js +0 -2
  15. package/dist/domain/skill/Skill.js.map +0 -1
  16. package/dist/domain/skill/SkillClassifier.d.ts +0 -12
  17. package/dist/domain/skill/SkillClassifier.d.ts.map +0 -1
  18. package/dist/domain/skill/SkillClassifier.js +0 -60
  19. package/dist/domain/skill/SkillClassifier.js.map +0 -1
  20. package/dist/domain/skill/SkillDomain.d.ts +0 -12
  21. package/dist/domain/skill/SkillDomain.d.ts.map +0 -1
  22. package/dist/domain/skill/SkillDomain.js +0 -142
  23. package/dist/domain/skill/SkillDomain.js.map +0 -1
  24. package/dist/infrastructure/config/PathResolver.d.ts +0 -8
  25. package/dist/infrastructure/config/PathResolver.d.ts.map +0 -1
  26. package/dist/infrastructure/config/PathResolver.js +0 -24
  27. package/dist/infrastructure/config/PathResolver.js.map +0 -1
  28. package/dist/infrastructure/fs/LibraryScanner.d.ts +0 -19
  29. package/dist/infrastructure/fs/LibraryScanner.d.ts.map +0 -1
  30. package/dist/infrastructure/fs/LibraryScanner.js +0 -94
  31. package/dist/infrastructure/fs/LibraryScanner.js.map +0 -1
  32. package/dist/infrastructure/fs/SymlinkManager.d.ts +0 -12
  33. package/dist/infrastructure/fs/SymlinkManager.d.ts.map +0 -1
  34. package/dist/infrastructure/fs/SymlinkManager.js +0 -111
  35. package/dist/infrastructure/fs/SymlinkManager.js.map +0 -1
@@ -12,6 +12,6 @@ export interface SyncClaudeMdOutput {
12
12
  }
13
13
  export declare class SyncClaudeMdUseCase {
14
14
  execute(input: SyncClaudeMdInput): Promise<SyncClaudeMdOutput>;
15
- private extractDomainFromSkillsRef;
15
+ private extractDomain;
16
16
  }
17
17
  //# sourceMappingURL=SyncClaudeMdUseCase.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SyncClaudeMdUseCase.d.ts","sourceRoot":"","sources":["../../src/application/SyncClaudeMdUseCase.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAE9E,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,qBAAa,mBAAmB;IACxB,OAAO,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IA0CpE,OAAO,CAAC,0BAA0B;CAWnC"}
1
+ {"version":3,"file":"SyncClaudeMdUseCase.d.ts","sourceRoot":"","sources":["../../src/application/SyncClaudeMdUseCase.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAE9E,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,qBAAa,mBAAmB;IACxB,OAAO,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;YAyDtD,aAAa;CAgB5B"}
@@ -12,23 +12,33 @@ export class SyncClaudeMdUseCase {
12
12
  if (skillsDirExists) {
13
13
  const entries = await fs.readdir(skillsPath, { withFileTypes: true });
14
14
  for (const entry of entries) {
15
- if (!entry.name.endsWith(".md"))
16
- continue;
17
15
  const fullPath = path.join(skillsPath, entry.name);
18
- const skillName = entry.name.replace(/\.md$/, "");
16
+ // 심볼릭 링크 (디렉토리 또는 파일)
19
17
  if (entry.isSymbolicLink()) {
20
18
  try {
21
- await fs.stat(fullPath); // broken link이면 예외 발생
22
- const target = await fs.readlink(fullPath);
23
- const domain = this.extractDomainFromSkillsRef(target, skillName);
19
+ await fs.stat(fullPath); // broken link이면 예외
20
+ const skillName = entry.name.replace(/\.md$/, "");
21
+ const domain = await this.extractDomain(fullPath);
24
22
  installedSkills.push({ domain, skillName });
25
23
  }
26
24
  catch {
27
25
  brokenLinks.push(fullPath);
28
26
  }
27
+ continue;
28
+ }
29
+ // 일반 .md 파일
30
+ if (entry.isFile() && entry.name.endsWith(".md")) {
31
+ installedSkills.push({
32
+ domain: "skills",
33
+ skillName: entry.name.replace(/\.md$/, ""),
34
+ });
29
35
  }
30
- else if (entry.isFile()) {
31
- installedSkills.push({ domain: "unknown", skillName });
36
+ // 일반 디렉토리 (SKILL.md 포함 여부 확인)
37
+ if (entry.isDirectory()) {
38
+ const skillMdPath = path.join(fullPath, "SKILL.md");
39
+ if (await fse.pathExists(skillMdPath)) {
40
+ installedSkills.push({ domain: "skills", skillName: entry.name });
41
+ }
32
42
  }
33
43
  }
34
44
  }
@@ -42,14 +52,21 @@ export class SyncClaudeMdUseCase {
42
52
  brokenLinks,
43
53
  };
44
54
  }
45
- extractDomainFromSkillsRef(targetPath, skillName) {
46
- // npx skills가 설치한 파일 경로에서 도메인 추출 시도
47
- const normalized = targetPath.replace(/\\/g, "/");
48
- // skills.sh 구조: ~/.agents/skills/{owner}/{repo}/{skill}.md
49
- const parts = normalized.split("/");
50
- const agentsIdx = parts.findIndex((p) => p === ".agents");
51
- if (agentsIdx !== -1 && parts[agentsIdx + 2]) {
52
- return parts[agentsIdx + 2]; // repo name을 도메인으로 활용
55
+ async extractDomain(linkPath) {
56
+ try {
57
+ const target = await fs.readlink(linkPath);
58
+ // .agents/skills/{skill-name} 구조에서 도메인 파악
59
+ // SKILL.md frontmatter의 name 필드 활용
60
+ const skillMdPath = path.join(target, "SKILL.md");
61
+ if (await fse.pathExists(skillMdPath)) {
62
+ const content = await fs.readFile(skillMdPath, "utf-8");
63
+ const domainMatch = content.match(/^domain:\s*(.+)$/m);
64
+ if (domainMatch)
65
+ return domainMatch[1].trim();
66
+ }
67
+ }
68
+ catch {
69
+ // 무시
53
70
  }
54
71
  return "skills";
55
72
  }
@@ -1 +1 @@
1
- {"version":3,"file":"SyncClaudeMdUseCase.js","sourceRoot":"","sources":["../../src/application/SyncClaudeMdUseCase.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SyncClaudeMdUseCase.js","sourceRoot":"","sources":["../../src/application/SyncClaudeMdUseCase.ts"],"names":[],"mappings":"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"}
@@ -9,7 +9,7 @@ export class SkillsCliRunner {
9
9
  */
10
10
  async install(ref, projectPath) {
11
11
  try {
12
- const { stdout, stderr } = await execFileAsync("npx", ["--yes", "skills", "add", ref], {
12
+ const { stdout, stderr } = await execFileAsync("npx", ["--yes", "skills", "add", ref, "--agent", "claude-code", "--yes"], {
13
13
  cwd: projectPath,
14
14
  timeout: 60_000,
15
15
  env: { ...process.env },
@@ -1 +1 @@
1
- {"version":3,"file":"SkillsCliRunner.js","sourceRoot":"","sources":["../../../src/infrastructure/skills/SkillsCliRunner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEjC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAS1C,MAAM,OAAO,eAAe;IAC1B;;;;OAIG;IACH,KAAK,CAAC,OAAO,CAAC,GAAW,EAAE,WAAmB;QAC5C,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAC5C,KAAK,EACL,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,EAC/B;gBACE,GAAG,EAAE,WAAW;gBAChB,OAAO,EAAE,MAAM;gBACf,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE;aACxB,CACF,CAAC;YACF,OAAO;gBACL,GAAG;gBACH,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,MAAM,IAAI,MAAM;aACzB,CAAC;QACJ,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,KAAK,GAAG,GAA6D,CAAC;YAC5E,OAAO;gBACL,GAAG;gBACH,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC;aACpD,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CACf,IAAc,EACd,WAAmB;QAEnB,MAAM,OAAO,GAAyB,EAAE,CAAC;QACzC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;YACpD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,KAAa,EAAE,WAAmB;QAC3C,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CACpC,KAAK,EACL,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAClC;gBACE,GAAG,EAAE,WAAW;gBAChB,OAAO,EAAE,MAAM;gBACf,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE;aACxB,CACF,CAAC;YACF,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,KAAK,GAAG,GAA2B,CAAC;YAC1C,MAAM,IAAI,KAAK,CAAC,mBAAmB,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"SkillsCliRunner.js","sourceRoot":"","sources":["../../../src/infrastructure/skills/SkillsCliRunner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEjC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAS1C,MAAM,OAAO,eAAe;IAC1B;;;;OAIG;IACH,KAAK,CAAC,OAAO,CAAC,GAAW,EAAE,WAAmB;QAC5C,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAC5C,KAAK,EACL,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,CAAC,EAClE;gBACE,GAAG,EAAE,WAAW;gBAChB,OAAO,EAAE,MAAM;gBACf,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE;aACxB,CACF,CAAC;YACF,OAAO;gBACL,GAAG;gBACH,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,MAAM,IAAI,MAAM;aACzB,CAAC;QACJ,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,KAAK,GAAG,GAA6D,CAAC;YAC5E,OAAO;gBACL,GAAG;gBACH,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC;aACpD,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CACf,IAAc,EACd,WAAmB;QAEnB,MAAM,OAAO,GAAyB,EAAE,CAAC;QACzC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;YACpD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,KAAa,EAAE,WAAmB;QAC3C,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CACpC,KAAK,EACL,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAClC;gBACE,GAAG,EAAE,WAAW;gBAChB,OAAO,EAAE,MAAM;gBACf,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE;aACxB,CACF,CAAC;YACF,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,KAAK,GAAG,GAA2B,CAAC;YAC1C,MAAM,IAAI,KAAK,CAAC,mBAAmB,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oh-my-agent",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "description": "AI 스킬을 자동으로 진단·배포·관리하는 MCP 서버. 프로젝트 기술 스택을 분석해 적합한 AI 스킬을 추천·설치합니다.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1,24 +0,0 @@
1
- import type { Domain } from "../domain/skill/SkillDomain.js";
2
- export interface OrganizeSkillsInput {
3
- libraryPath?: string;
4
- autoFix?: boolean;
5
- targetDomain?: string;
6
- }
7
- export interface MisplacedSkill {
8
- skillName: string;
9
- currentDomain: string;
10
- predictedDomain: Domain | "unknown";
11
- confidence: number;
12
- filePath: string;
13
- }
14
- export interface OrganizeSkillsOutput {
15
- misplaced: MisplacedSkill[];
16
- correctlyPlaced: number;
17
- autoFixed: number;
18
- summary: string;
19
- }
20
- export declare class OrganizeSkillsUseCase {
21
- private classifier;
22
- execute(input: OrganizeSkillsInput): Promise<OrganizeSkillsOutput>;
23
- }
24
- //# sourceMappingURL=OrganizeSkillsUseCase.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"OrganizeSkillsUseCase.d.ts","sourceRoot":"","sources":["../../src/application/OrganizeSkillsUseCase.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gCAAgC,CAAC;AAE7D,MAAM,WAAW,mBAAmB;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,qBAAqB;IAChC,OAAO,CAAC,UAAU,CAAyB;IAErC,OAAO,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC;CA0DzE"}
@@ -1,57 +0,0 @@
1
- import fs from "fs/promises";
2
- import path from "path";
3
- import fse from "fs-extra";
4
- import { SkillClassifier } from "../domain/skill/SkillClassifier.js";
5
- import { LibraryScanner } from "../infrastructure/fs/LibraryScanner.js";
6
- import { PathResolver } from "../infrastructure/config/PathResolver.js";
7
- export class OrganizeSkillsUseCase {
8
- classifier = new SkillClassifier();
9
- async execute(input) {
10
- const libraryPath = input.libraryPath
11
- ? PathResolver.resolveHome(input.libraryPath)
12
- : PathResolver.getLibraryPath();
13
- const autoFix = input.autoFix ?? false;
14
- const targetDomain = input.targetDomain;
15
- const scanner = new LibraryScanner(libraryPath);
16
- const allSkills = await scanner.scanAll(true);
17
- const filtered = targetDomain
18
- ? allSkills.filter((s) => s.domain === targetDomain)
19
- : allSkills;
20
- const misplaced = [];
21
- let correctlyPlaced = 0;
22
- let autoFixed = 0;
23
- for (const skill of filtered) {
24
- const result = this.classifier.classify(skill.skillName, skill.content);
25
- if (result.predictedDomain === "unknown" ||
26
- result.predictedDomain === skill.domain) {
27
- correctlyPlaced++;
28
- continue;
29
- }
30
- misplaced.push({
31
- skillName: skill.skillName,
32
- currentDomain: skill.domain,
33
- predictedDomain: result.predictedDomain,
34
- confidence: result.confidence,
35
- filePath: skill.filePath,
36
- });
37
- if (autoFix) {
38
- const targetDir = path.join(libraryPath, result.predictedDomain);
39
- const targetPath = path.join(targetDir, `${skill.skillName}.md`);
40
- try {
41
- await fse.ensureDir(targetDir);
42
- await fs.rename(skill.filePath, targetPath);
43
- autoFixed++;
44
- }
45
- catch {
46
- // 이동 실패 → 무시
47
- }
48
- }
49
- }
50
- const summary = `총 ${filtered.length}개 스킬 분석 | ` +
51
- `올바른 위치: ${correctlyPlaced}개 | ` +
52
- `잘못된 위치: ${misplaced.length}개` +
53
- (autoFix ? ` | 자동 수정: ${autoFixed}개` : "");
54
- return { misplaced, correctlyPlaced, autoFixed, summary };
55
- }
56
- }
57
- //# sourceMappingURL=OrganizeSkillsUseCase.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"OrganizeSkillsUseCase.js","sourceRoot":"","sources":["../../src/application/OrganizeSkillsUseCase.ts"],"names":[],"mappings":"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"}
@@ -1,12 +0,0 @@
1
- export interface Skill {
2
- domain: string;
3
- skillName: string;
4
- filePath: string;
5
- description?: string;
6
- confidence?: number;
7
- }
8
- export interface SkillReference {
9
- domain: string;
10
- skillName: string;
11
- }
12
- //# sourceMappingURL=Skill.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Skill.d.ts","sourceRoot":"","sources":["../../../src/domain/skill/Skill.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,KAAK;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=Skill.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Skill.js","sourceRoot":"","sources":["../../../src/domain/skill/Skill.ts"],"names":[],"mappings":""}
@@ -1,12 +0,0 @@
1
- import { type Domain } from "./SkillDomain.js";
2
- export interface ClassificationResult {
3
- predictedDomain: Domain | "unknown";
4
- confidence: number;
5
- scores: Record<string, number>;
6
- }
7
- export declare class SkillClassifier {
8
- classify(skillName: string, content?: string): ClassificationResult;
9
- private tokenize;
10
- private countMatches;
11
- }
12
- //# sourceMappingURL=SkillClassifier.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SkillClassifier.d.ts","sourceRoot":"","sources":["../../../src/domain/skill/SkillClassifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,KAAK,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAEzE,MAAM,WAAW,oBAAoB;IACnC,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,qBAAa,eAAe;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,oBAAoB;IAsDnE,OAAO,CAAC,QAAQ;IAQhB,OAAO,CAAC,YAAY;CAOrB"}
@@ -1,60 +0,0 @@
1
- import { DOMAINS, DOMAIN_KEYWORDS } from "./SkillDomain.js";
2
- export class SkillClassifier {
3
- classify(skillName, content) {
4
- const tokens = this.tokenize(skillName);
5
- // frontmatter description 추출 (1.5× 가중치 적용)
6
- let descriptionTokens = [];
7
- if (content) {
8
- const descMatch = content.match(/^description:\s*(.+)$/m);
9
- if (descMatch) {
10
- descriptionTokens = this.tokenize(descMatch[1]);
11
- }
12
- // 나머지 content 토큰 추가
13
- tokens.push(...this.tokenize(content));
14
- }
15
- const scores = {};
16
- let totalScore = 0;
17
- for (const domain of DOMAINS) {
18
- const keywords = DOMAIN_KEYWORDS[domain];
19
- let score = 0;
20
- for (const { keyword, weight } of keywords) {
21
- const keyTokens = this.tokenize(keyword);
22
- // 일반 토큰에서 매칭
23
- const nameMatches = this.countMatches(tokens, keyTokens);
24
- score += nameMatches * weight;
25
- // description 토큰에서 매칭 (1.5× 가중치)
26
- const descMatches = this.countMatches(descriptionTokens, keyTokens);
27
- score += descMatches * weight * 1.5;
28
- }
29
- scores[domain] = score;
30
- totalScore += score;
31
- }
32
- if (totalScore === 0) {
33
- return { predictedDomain: "unknown", confidence: 0, scores };
34
- }
35
- const bestDomain = (Object.entries(scores).sort(([, a], [, b]) => b - a)[0][0]);
36
- const bestScore = scores[bestDomain];
37
- const confidence = bestScore / totalScore;
38
- return {
39
- predictedDomain: confidence >= 0.4 ? bestDomain : "unknown",
40
- confidence,
41
- scores,
42
- };
43
- }
44
- tokenize(text) {
45
- return text
46
- .toLowerCase()
47
- .replace(/[_\-./\\]/g, " ")
48
- .split(/\s+/)
49
- .filter((t) => t.length > 0);
50
- }
51
- countMatches(tokens, keywords) {
52
- let count = 0;
53
- for (const keyword of keywords) {
54
- if (tokens.includes(keyword))
55
- count++;
56
- }
57
- return count;
58
- }
59
- }
60
- //# sourceMappingURL=SkillClassifier.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SkillClassifier.js","sourceRoot":"","sources":["../../../src/domain/skill/SkillClassifier.ts"],"names":[],"mappings":"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"}
@@ -1,12 +0,0 @@
1
- export declare const DOMAINS: readonly ["frontend", "testing", "security", "backend", "devops", "manager"];
2
- export type Domain = (typeof DOMAINS)[number];
3
- export interface KeywordEntry {
4
- keyword: string;
5
- weight: 1 | 2 | 3;
6
- }
7
- export declare const DOMAIN_KEYWORDS: Record<Domain, KeywordEntry[]>;
8
- export declare const STACK_TO_SKILL: Record<string, {
9
- domain: string;
10
- skillName: string;
11
- }>;
12
- //# sourceMappingURL=SkillDomain.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SkillDomain.d.ts","sourceRoot":"","sources":["../../../src/domain/skill/SkillDomain.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,8EAOV,CAAC;AAEX,MAAM,MAAM,MAAM,GAAG,CAAC,OAAO,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9C,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CACnB;AAED,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,CAgH1D,CAAC;AAGF,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAkBhF,CAAC"}
@@ -1,142 +0,0 @@
1
- export const DOMAINS = [
2
- "frontend",
3
- "testing",
4
- "security",
5
- "backend",
6
- "devops",
7
- "manager",
8
- ];
9
- export const DOMAIN_KEYWORDS = {
10
- frontend: [
11
- // weight 3 — 프레임워크 정확 매칭
12
- { keyword: "next", weight: 3 },
13
- { keyword: "nextjs", weight: 3 },
14
- { keyword: "react", weight: 3 },
15
- { keyword: "vue", weight: 3 },
16
- { keyword: "nuxt", weight: 3 },
17
- { keyword: "svelte", weight: 3 },
18
- { keyword: "angular", weight: 3 },
19
- { keyword: "vite", weight: 3 },
20
- // weight 2 — 도구/개념
21
- { keyword: "tailwind", weight: 2 },
22
- { keyword: "css", weight: 2 },
23
- { keyword: "ui", weight: 2 },
24
- { keyword: "component", weight: 2 },
25
- { keyword: "storybook", weight: 2 },
26
- { keyword: "webpack", weight: 2 },
27
- { keyword: "typescript", weight: 2 },
28
- // weight 1 — 일반 용어
29
- { keyword: "web", weight: 1 },
30
- { keyword: "html", weight: 1 },
31
- { keyword: "spa", weight: 1 },
32
- { keyword: "ssr", weight: 1 },
33
- { keyword: "client", weight: 1 },
34
- ],
35
- testing: [
36
- { keyword: "vitest", weight: 3 },
37
- { keyword: "jest", weight: 3 },
38
- { keyword: "cypress", weight: 3 },
39
- { keyword: "playwright", weight: 3 },
40
- { keyword: "testing-library", weight: 3 },
41
- { keyword: "mocha", weight: 3 },
42
- { keyword: "e2e", weight: 2 },
43
- { keyword: "unit", weight: 2 },
44
- { keyword: "mock", weight: 2 },
45
- { keyword: "coverage", weight: 2 },
46
- { keyword: "assertion", weight: 2 },
47
- { keyword: "test", weight: 1 },
48
- { keyword: "spec", weight: 1 },
49
- { keyword: "qa", weight: 1 },
50
- ],
51
- security: [
52
- { keyword: "owasp", weight: 3 },
53
- { keyword: "jwt", weight: 3 },
54
- { keyword: "jose", weight: 3 },
55
- { keyword: "oauth", weight: 3 },
56
- { keyword: "xss", weight: 3 },
57
- { keyword: "csrf", weight: 3 },
58
- { keyword: "cors", weight: 2 },
59
- { keyword: "auth", weight: 2 },
60
- { keyword: "authentication", weight: 2 },
61
- { keyword: "authorization", weight: 2 },
62
- { keyword: "ssl", weight: 2 },
63
- { keyword: "tls", weight: 2 },
64
- { keyword: "encryption", weight: 2 },
65
- { keyword: "security", weight: 1 },
66
- { keyword: "permission", weight: 1 },
67
- { keyword: "role", weight: 1 },
68
- ],
69
- backend: [
70
- { keyword: "prisma", weight: 3 },
71
- { keyword: "express", weight: 3 },
72
- { keyword: "trpc", weight: 3 },
73
- { keyword: "fastify", weight: 3 },
74
- { keyword: "nestjs", weight: 3 },
75
- { keyword: "graphql", weight: 3 },
76
- { keyword: "rest", weight: 2 },
77
- { keyword: "api", weight: 2 },
78
- { keyword: "database", weight: 2 },
79
- { keyword: "postgresql", weight: 2 },
80
- { keyword: "mysql", weight: 2 },
81
- { keyword: "mongodb", weight: 2 },
82
- { keyword: "orm", weight: 2 },
83
- { keyword: "server", weight: 1 },
84
- { keyword: "endpoint", weight: 1 },
85
- { keyword: "http", weight: 1 },
86
- { keyword: "middleware", weight: 1 },
87
- ],
88
- devops: [
89
- { keyword: "docker", weight: 3 },
90
- { keyword: "kubernetes", weight: 3 },
91
- { keyword: "k8s", weight: 3 },
92
- { keyword: "terraform", weight: 3 },
93
- { keyword: "github-actions", weight: 3 },
94
- { keyword: "ci", weight: 2 },
95
- { keyword: "cd", weight: 2 },
96
- { keyword: "pipeline", weight: 2 },
97
- { keyword: "deploy", weight: 2 },
98
- { keyword: "container", weight: 2 },
99
- { keyword: "helm", weight: 2 },
100
- { keyword: "aws", weight: 2 },
101
- { keyword: "gcp", weight: 2 },
102
- { keyword: "azure", weight: 2 },
103
- { keyword: "infra", weight: 1 },
104
- { keyword: "devops", weight: 1 },
105
- { keyword: "monitoring", weight: 1 },
106
- ],
107
- manager: [
108
- { keyword: "agile", weight: 3 },
109
- { keyword: "scrum", weight: 3 },
110
- { keyword: "kanban", weight: 3 },
111
- { keyword: "sprint", weight: 2 },
112
- { keyword: "roadmap", weight: 2 },
113
- { keyword: "backlog", weight: 2 },
114
- { keyword: "milestone", weight: 2 },
115
- { keyword: "jira", weight: 2 },
116
- { keyword: "project", weight: 1 },
117
- { keyword: "planning", weight: 1 },
118
- { keyword: "meeting", weight: 1 },
119
- { keyword: "standup", weight: 1 },
120
- ],
121
- };
122
- // 기술 스택 → 스킬 매핑 테이블
123
- export const STACK_TO_SKILL = {
124
- next: { domain: "frontend", skillName: "next-best-practices" },
125
- nextjs: { domain: "frontend", skillName: "next-best-practices" },
126
- react: { domain: "frontend", skillName: "vercel-react-best-practices" },
127
- "react-native": { domain: "frontend", skillName: "vercel-react-native-skills" },
128
- vue: { domain: "frontend", skillName: "vue-best-practices" },
129
- vitest: { domain: "testing", skillName: "vitest-practices" },
130
- jest: { domain: "testing", skillName: "jest-practices" },
131
- cypress: { domain: "testing", skillName: "e2e-testing" },
132
- playwright: { domain: "testing", skillName: "playwright-testing" },
133
- prisma: { domain: "backend", skillName: "prisma-best-practices" },
134
- express: { domain: "backend", skillName: "express-api-patterns" },
135
- trpc: { domain: "backend", skillName: "trpc-patterns" },
136
- graphql: { domain: "backend", skillName: "graphql-api-patterns" },
137
- jsonwebtoken: { domain: "security", skillName: "jwt-auth-practices" },
138
- jose: { domain: "security", skillName: "jwt-auth-practices" },
139
- docker: { domain: "devops", skillName: "docker-deployment" },
140
- kubernetes: { domain: "devops", skillName: "kubernetes-deployment" },
141
- };
142
- //# sourceMappingURL=SkillDomain.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SkillDomain.js","sourceRoot":"","sources":["../../../src/domain/skill/SkillDomain.ts"],"names":[],"mappings":"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"}
@@ -1,8 +0,0 @@
1
- export declare class PathResolver {
2
- static resolveHome(inputPath: string): string;
3
- static getLibraryPath(): string;
4
- static getSkillsPath(projectPath: string): string;
5
- static getClaudeMdPath(projectPath: string): string;
6
- static normalize(inputPath: string): string;
7
- }
8
- //# sourceMappingURL=PathResolver.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PathResolver.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/config/PathResolver.ts"],"names":[],"mappings":"AAGA,qBAAa,YAAY;IACvB,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAQ7C,MAAM,CAAC,cAAc,IAAI,MAAM;IAI/B,MAAM,CAAC,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAIjD,MAAM,CAAC,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAInD,MAAM,CAAC,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;CAG5C"}
@@ -1,24 +0,0 @@
1
- import os from "os";
2
- import path from "path";
3
- export class PathResolver {
4
- static resolveHome(inputPath) {
5
- if (inputPath.startsWith("~/") || inputPath === "~") {
6
- const home = process.env.HOME || process.env.USERPROFILE || os.homedir();
7
- return path.join(home, inputPath.slice(2));
8
- }
9
- return inputPath;
10
- }
11
- static getLibraryPath() {
12
- return this.resolveHome("~/oh-my-agent-library");
13
- }
14
- static getSkillsPath(projectPath) {
15
- return path.join(projectPath, ".claude", "skills");
16
- }
17
- static getClaudeMdPath(projectPath) {
18
- return path.join(projectPath, "CLAUDE.md");
19
- }
20
- static normalize(inputPath) {
21
- return path.normalize(inputPath).replace(/\\/g, "/");
22
- }
23
- }
24
- //# sourceMappingURL=PathResolver.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PathResolver.js","sourceRoot":"","sources":["../../../src/infrastructure/config/PathResolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,OAAO,YAAY;IACvB,MAAM,CAAC,WAAW,CAAC,SAAiB;QAClC,IAAI,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;YACpD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;YACzE,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,CAAC,cAAc;QACnB,OAAO,IAAI,CAAC,WAAW,CAAC,uBAAuB,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,CAAC,aAAa,CAAC,WAAmB;QACtC,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,CAAC,eAAe,CAAC,WAAmB;QACxC,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,CAAC,SAAS,CAAC,SAAiB;QAChC,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACvD,CAAC;CACF"}
@@ -1,19 +0,0 @@
1
- export interface SkillFile {
2
- domain: string;
3
- skillName: string;
4
- filePath: string;
5
- content?: string;
6
- }
7
- export declare class LibraryScanner {
8
- private libraryPath;
9
- constructor(libraryPath?: string);
10
- exists(): Promise<boolean>;
11
- getDomains(): Promise<string[]>;
12
- scanAll(includeContent?: boolean): Promise<SkillFile[]>;
13
- scanDomain(domain: string, includeContent?: boolean): Promise<SkillFile[]>;
14
- getSkillPath(domain: string, skillName: string): Promise<string>;
15
- skillExists(domain: string, skillName: string): Promise<boolean>;
16
- readSkillContent(domain: string, skillName: string): Promise<string | null>;
17
- getLibraryPath(): string;
18
- }
19
- //# sourceMappingURL=LibraryScanner.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"LibraryScanner.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/fs/LibraryScanner.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,WAAW,CAAS;gBAEhB,WAAW,CAAC,EAAE,MAAM;IAI1B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAI1B,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAY/B,OAAO,CAAC,cAAc,UAAQ,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IA2BrD,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,UAAQ,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAwBxE,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKhE,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKhE,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IASjF,cAAc,IAAI,MAAM;CAGzB"}
@@ -1,94 +0,0 @@
1
- import fs from "fs/promises";
2
- import path from "path";
3
- import fse from "fs-extra";
4
- import { PathResolver } from "../config/PathResolver.js";
5
- export class LibraryScanner {
6
- libraryPath;
7
- constructor(libraryPath) {
8
- this.libraryPath = libraryPath ?? PathResolver.getLibraryPath();
9
- }
10
- async exists() {
11
- return fse.pathExists(this.libraryPath);
12
- }
13
- async getDomains() {
14
- if (!(await this.exists()))
15
- return [];
16
- try {
17
- const entries = await fs.readdir(this.libraryPath, { withFileTypes: true });
18
- return entries
19
- .filter((e) => e.isDirectory())
20
- .map((e) => e.name);
21
- }
22
- catch {
23
- return [];
24
- }
25
- }
26
- async scanAll(includeContent = false) {
27
- const domains = await this.getDomains();
28
- const skills = [];
29
- for (const domain of domains) {
30
- const domainPath = path.join(this.libraryPath, domain);
31
- try {
32
- const entries = await fs.readdir(domainPath, { withFileTypes: true });
33
- for (const entry of entries) {
34
- if (entry.isFile() && entry.name.endsWith(".md")) {
35
- const filePath = path.join(domainPath, entry.name);
36
- const skillName = entry.name.replace(/\.md$/, "");
37
- let content;
38
- if (includeContent) {
39
- content = await fs.readFile(filePath, "utf-8");
40
- }
41
- skills.push({ domain, skillName, filePath, content });
42
- }
43
- }
44
- }
45
- catch {
46
- // 도메인 폴더 읽기 실패 → 스킵
47
- }
48
- }
49
- return skills;
50
- }
51
- async scanDomain(domain, includeContent = false) {
52
- const domainPath = path.join(this.libraryPath, domain);
53
- const skills = [];
54
- try {
55
- const entries = await fs.readdir(domainPath, { withFileTypes: true });
56
- for (const entry of entries) {
57
- if (entry.isFile() && entry.name.endsWith(".md")) {
58
- const filePath = path.join(domainPath, entry.name);
59
- const skillName = entry.name.replace(/\.md$/, "");
60
- let content;
61
- if (includeContent) {
62
- content = await fs.readFile(filePath, "utf-8");
63
- }
64
- skills.push({ domain, skillName, filePath, content });
65
- }
66
- }
67
- }
68
- catch {
69
- // 도메인 없음
70
- }
71
- return skills;
72
- }
73
- async getSkillPath(domain, skillName) {
74
- const fileName = skillName.endsWith(".md") ? skillName : `${skillName}.md`;
75
- return path.join(this.libraryPath, domain, fileName);
76
- }
77
- async skillExists(domain, skillName) {
78
- const skillPath = await this.getSkillPath(domain, skillName);
79
- return fse.pathExists(skillPath);
80
- }
81
- async readSkillContent(domain, skillName) {
82
- const skillPath = await this.getSkillPath(domain, skillName);
83
- try {
84
- return await fs.readFile(skillPath, "utf-8");
85
- }
86
- catch {
87
- return null;
88
- }
89
- }
90
- getLibraryPath() {
91
- return this.libraryPath;
92
- }
93
- }
94
- //# sourceMappingURL=LibraryScanner.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"LibraryScanner.js","sourceRoot":"","sources":["../../../src/infrastructure/fs/LibraryScanner.ts"],"names":[],"mappings":"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"}
@@ -1,12 +0,0 @@
1
- export interface SymlinkResult {
2
- success: boolean;
3
- method: "symlink" | "junction" | "copy" | "already_exists";
4
- error?: string;
5
- }
6
- export declare class SymlinkManager {
7
- createSymlink(target: string, linkPath: string): Promise<SymlinkResult>;
8
- removeSymlink(linkPath: string): Promise<boolean>;
9
- isValidSymlink(linkPath: string): Promise<boolean>;
10
- listBrokenLinks(dir: string): Promise<string[]>;
11
- }
12
- //# sourceMappingURL=SymlinkManager.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SymlinkManager.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/fs/SymlinkManager.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,MAAM,GAAG,gBAAgB,CAAC;IAC3D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,cAAc;IACnB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IA+DvE,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAajD,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWlD,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAgBtD"}
@@ -1,111 +0,0 @@
1
- import fs from "fs/promises";
2
- import fse from "fs-extra";
3
- import path from "path";
4
- export class SymlinkManager {
5
- async createSymlink(target, linkPath) {
6
- // 링크 디렉토리 생성
7
- await fse.ensureDir(path.dirname(linkPath));
8
- // 이미 존재하는 경우 확인
9
- try {
10
- const stat = await fs.lstat(linkPath);
11
- if (stat.isSymbolicLink()) {
12
- const existing = await fs.readlink(linkPath);
13
- if (existing === target) {
14
- return { success: true, method: "already_exists" };
15
- }
16
- // 다른 타겟 → 교체
17
- await fs.unlink(linkPath);
18
- }
19
- else {
20
- // 일반 파일/디렉토리 → 건드리지 않음
21
- return {
22
- success: false,
23
- method: "symlink",
24
- error: `링크 경로에 이미 일반 파일/디렉토리가 존재합니다: ${linkPath}`,
25
- };
26
- }
27
- }
28
- catch {
29
- // 파일이 없으면 정상 진행
30
- }
31
- // 타겟 존재 확인
32
- const targetExists = await fse.pathExists(target);
33
- if (!targetExists) {
34
- return {
35
- success: false,
36
- method: "symlink",
37
- error: `타겟 경로가 존재하지 않습니다: ${target}`,
38
- };
39
- }
40
- // POSIX 심볼릭 링크 시도
41
- try {
42
- await fs.symlink(target, linkPath);
43
- return { success: true, method: "symlink" };
44
- }
45
- catch {
46
- // junction 시도 (Windows)
47
- }
48
- try {
49
- await fs.symlink(target, linkPath, "junction");
50
- return { success: true, method: "junction" };
51
- }
52
- catch {
53
- // 폴백: 복사
54
- }
55
- try {
56
- await fse.copy(target, linkPath);
57
- return { success: true, method: "copy" };
58
- }
59
- catch (err) {
60
- return {
61
- success: false,
62
- method: "copy",
63
- error: String(err),
64
- };
65
- }
66
- }
67
- async removeSymlink(linkPath) {
68
- try {
69
- const stat = await fs.lstat(linkPath);
70
- if (stat.isSymbolicLink()) {
71
- await fs.unlink(linkPath);
72
- return true;
73
- }
74
- return false;
75
- }
76
- catch {
77
- return false;
78
- }
79
- }
80
- async isValidSymlink(linkPath) {
81
- try {
82
- const stat = await fs.lstat(linkPath);
83
- if (!stat.isSymbolicLink())
84
- return false;
85
- const target = await fs.readlink(linkPath);
86
- return await fse.pathExists(target);
87
- }
88
- catch {
89
- return false;
90
- }
91
- }
92
- async listBrokenLinks(dir) {
93
- const broken = [];
94
- try {
95
- const entries = await fs.readdir(dir, { withFileTypes: true });
96
- for (const entry of entries) {
97
- const fullPath = path.join(dir, entry.name);
98
- if (entry.isSymbolicLink()) {
99
- const valid = await this.isValidSymlink(fullPath);
100
- if (!valid)
101
- broken.push(fullPath);
102
- }
103
- }
104
- }
105
- catch {
106
- // 디렉토리가 없으면 빈 배열
107
- }
108
- return broken;
109
- }
110
- }
111
- //# sourceMappingURL=SymlinkManager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SymlinkManager.js","sourceRoot":"","sources":["../../../src/infrastructure/fs/SymlinkManager.ts"],"names":[],"mappings":"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"}