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.
- package/dist/application/SyncClaudeMdUseCase.d.ts +1 -1
- package/dist/application/SyncClaudeMdUseCase.d.ts.map +1 -1
- package/dist/application/SyncClaudeMdUseCase.js +33 -16
- package/dist/application/SyncClaudeMdUseCase.js.map +1 -1
- package/dist/infrastructure/skills/SkillsCliRunner.js +1 -1
- package/dist/infrastructure/skills/SkillsCliRunner.js.map +1 -1
- package/package.json +1 -1
- package/dist/application/OrganizeSkillsUseCase.d.ts +0 -24
- package/dist/application/OrganizeSkillsUseCase.d.ts.map +0 -1
- package/dist/application/OrganizeSkillsUseCase.js +0 -57
- package/dist/application/OrganizeSkillsUseCase.js.map +0 -1
- package/dist/domain/skill/Skill.d.ts +0 -12
- package/dist/domain/skill/Skill.d.ts.map +0 -1
- package/dist/domain/skill/Skill.js +0 -2
- package/dist/domain/skill/Skill.js.map +0 -1
- package/dist/domain/skill/SkillClassifier.d.ts +0 -12
- package/dist/domain/skill/SkillClassifier.d.ts.map +0 -1
- package/dist/domain/skill/SkillClassifier.js +0 -60
- package/dist/domain/skill/SkillClassifier.js.map +0 -1
- package/dist/domain/skill/SkillDomain.d.ts +0 -12
- package/dist/domain/skill/SkillDomain.d.ts.map +0 -1
- package/dist/domain/skill/SkillDomain.js +0 -142
- package/dist/domain/skill/SkillDomain.js.map +0 -1
- package/dist/infrastructure/config/PathResolver.d.ts +0 -8
- package/dist/infrastructure/config/PathResolver.d.ts.map +0 -1
- package/dist/infrastructure/config/PathResolver.js +0 -24
- package/dist/infrastructure/config/PathResolver.js.map +0 -1
- package/dist/infrastructure/fs/LibraryScanner.d.ts +0 -19
- package/dist/infrastructure/fs/LibraryScanner.d.ts.map +0 -1
- package/dist/infrastructure/fs/LibraryScanner.js +0 -94
- package/dist/infrastructure/fs/LibraryScanner.js.map +0 -1
- package/dist/infrastructure/fs/SymlinkManager.d.ts +0 -12
- package/dist/infrastructure/fs/SymlinkManager.d.ts.map +0 -1
- package/dist/infrastructure/fs/SymlinkManager.js +0 -111
- 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
|
|
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;
|
|
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
|
-
|
|
16
|
+
// 심볼릭 링크 (디렉토리 또는 파일)
|
|
19
17
|
if (entry.isSymbolicLink()) {
|
|
20
18
|
try {
|
|
21
|
-
await fs.stat(fullPath); // broken link이면 예외
|
|
22
|
-
const
|
|
23
|
-
const domain = this.
|
|
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
|
-
|
|
31
|
-
|
|
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
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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":"AAAA,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,GAAG,MAAM,UAAU,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAgB1E,MAAM,OAAO,mBAAmB;IAC9B,KAAK,CAAC,OAAO,CAAC,KAAwB;QACpC,MAAM,EAAE,WAAW,EAAE,eAAe,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;QACtD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QAE/D,MAAM,eAAe,GAAqB,EAAE,CAAC;QAC7C,MAAM,WAAW,GAAa,EAAE,CAAC;QAEjC,MAAM,eAAe,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QACzD,IAAI,eAAe,EAAE,CAAC;YACpB,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;
|
|
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,
|
|
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,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 +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 +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":"AAAA,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,GAAG,MAAM,UAAU,CAAC;AAC3B,OAAO,IAAI,MAAM,MAAM,CAAC;AAQxB,MAAM,OAAO,cAAc;IACzB,KAAK,CAAC,aAAa,CAAC,MAAc,EAAE,QAAgB;QAClD,aAAa;QACb,MAAM,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QAE5C,gBAAgB;QAChB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACtC,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;gBAC1B,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBAC7C,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;oBACxB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC;gBACrD,CAAC;gBACD,aAAa;gBACb,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC5B,CAAC;iBAAM,CAAC;gBACN,uBAAuB;gBACvB,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,MAAM,EAAE,SAAS;oBACjB,KAAK,EAAE,gCAAgC,QAAQ,EAAE;iBAClD,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,gBAAgB;QAClB,CAAC;QAED,WAAW;QACX,MAAM,YAAY,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAClD,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,SAAS;gBACjB,KAAK,EAAE,qBAAqB,MAAM,EAAE;aACrC,CAAC;QACJ,CAAC;QAED,kBAAkB;QAClB,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YACnC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QAC9C,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;QAED,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;YAC/C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;QAC/C,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QAED,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAC3C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,MAAM;gBACd,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC;aACnB,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,QAAgB;QAClC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACtC,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;gBAC1B,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAC1B,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,QAAgB;QACnC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACtC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;gBAAE,OAAO,KAAK,CAAC;YACzC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAC3C,OAAO,MAAM,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,GAAW;QAC/B,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC5C,IAAI,KAAK,CAAC,cAAc,EAAE,EAAE,CAAC;oBAC3B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;oBAClD,IAAI,CAAC,KAAK;wBAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACpC,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,iBAAiB;QACnB,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
|