oh-my-agent 1.0.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 (59) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +119 -0
  3. package/dist/application/DiagnoseProjectUseCase.d.ts +17 -0
  4. package/dist/application/DiagnoseProjectUseCase.d.ts.map +1 -0
  5. package/dist/application/DiagnoseProjectUseCase.js +34 -0
  6. package/dist/application/DiagnoseProjectUseCase.js.map +1 -0
  7. package/dist/application/OrganizeSkillsUseCase.d.ts +24 -0
  8. package/dist/application/OrganizeSkillsUseCase.d.ts.map +1 -0
  9. package/dist/application/OrganizeSkillsUseCase.js +57 -0
  10. package/dist/application/OrganizeSkillsUseCase.js.map +1 -0
  11. package/dist/application/SetupSkillsUseCase.d.ts +25 -0
  12. package/dist/application/SetupSkillsUseCase.d.ts.map +1 -0
  13. package/dist/application/SetupSkillsUseCase.js +58 -0
  14. package/dist/application/SetupSkillsUseCase.js.map +1 -0
  15. package/dist/application/SyncClaudeMdUseCase.d.ts +19 -0
  16. package/dist/application/SyncClaudeMdUseCase.d.ts.map +1 -0
  17. package/dist/application/SyncClaudeMdUseCase.js +62 -0
  18. package/dist/application/SyncClaudeMdUseCase.js.map +1 -0
  19. package/dist/domain/project/Project.d.ts +8 -0
  20. package/dist/domain/project/Project.d.ts.map +1 -0
  21. package/dist/domain/project/Project.js +2 -0
  22. package/dist/domain/project/Project.js.map +1 -0
  23. package/dist/domain/project/ProjectAnalyzer.d.ts +8 -0
  24. package/dist/domain/project/ProjectAnalyzer.d.ts.map +1 -0
  25. package/dist/domain/project/ProjectAnalyzer.js +87 -0
  26. package/dist/domain/project/ProjectAnalyzer.js.map +1 -0
  27. package/dist/domain/skill/Skill.d.ts +12 -0
  28. package/dist/domain/skill/Skill.d.ts.map +1 -0
  29. package/dist/domain/skill/Skill.js +2 -0
  30. package/dist/domain/skill/Skill.js.map +1 -0
  31. package/dist/domain/skill/SkillClassifier.d.ts +12 -0
  32. package/dist/domain/skill/SkillClassifier.d.ts.map +1 -0
  33. package/dist/domain/skill/SkillClassifier.js +60 -0
  34. package/dist/domain/skill/SkillClassifier.js.map +1 -0
  35. package/dist/domain/skill/SkillDomain.d.ts +12 -0
  36. package/dist/domain/skill/SkillDomain.d.ts.map +1 -0
  37. package/dist/domain/skill/SkillDomain.js +142 -0
  38. package/dist/domain/skill/SkillDomain.js.map +1 -0
  39. package/dist/index.d.ts +3 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +125 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/infrastructure/config/PathResolver.d.ts +8 -0
  44. package/dist/infrastructure/config/PathResolver.d.ts.map +1 -0
  45. package/dist/infrastructure/config/PathResolver.js +24 -0
  46. package/dist/infrastructure/config/PathResolver.js.map +1 -0
  47. package/dist/infrastructure/fs/ClaudeMdUpdater.d.ts +21 -0
  48. package/dist/infrastructure/fs/ClaudeMdUpdater.d.ts.map +1 -0
  49. package/dist/infrastructure/fs/ClaudeMdUpdater.js +101 -0
  50. package/dist/infrastructure/fs/ClaudeMdUpdater.js.map +1 -0
  51. package/dist/infrastructure/fs/LibraryScanner.d.ts +19 -0
  52. package/dist/infrastructure/fs/LibraryScanner.d.ts.map +1 -0
  53. package/dist/infrastructure/fs/LibraryScanner.js +94 -0
  54. package/dist/infrastructure/fs/LibraryScanner.js.map +1 -0
  55. package/dist/infrastructure/fs/SymlinkManager.d.ts +12 -0
  56. package/dist/infrastructure/fs/SymlinkManager.d.ts.map +1 -0
  57. package/dist/infrastructure/fs/SymlinkManager.js +111 -0
  58. package/dist/infrastructure/fs/SymlinkManager.js.map +1 -0
  59. package/package.json +55 -0
@@ -0,0 +1,94 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LibraryScanner.js","sourceRoot":"","sources":["../../../src/infrastructure/fs/LibraryScanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,111 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SymlinkManager.js","sourceRoot":"","sources":["../../../src/infrastructure/fs/SymlinkManager.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "oh-my-agent",
3
+ "version": "1.0.0",
4
+ "description": "AI 스킬을 자동으로 진단·배포·관리하는 MCP 서버. 프로젝트 기술 스택을 분석해 적합한 AI 스킬을 추천·설치합니다.",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "oh-my-agent": "dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist",
12
+ "README.md",
13
+ "LICENSE"
14
+ ],
15
+ "scripts": {
16
+ "build": "tsc",
17
+ "dev": "tsx src/index.ts",
18
+ "start": "node dist/index.js",
19
+ "prepublishOnly": "npm run build"
20
+ },
21
+ "keywords": [
22
+ "mcp",
23
+ "claude",
24
+ "ai",
25
+ "agent",
26
+ "skills",
27
+ "claude-code",
28
+ "model-context-protocol",
29
+ "developer-tools"
30
+ ],
31
+ "author": "tkyoun0421",
32
+ "license": "MIT",
33
+ "repository": {
34
+ "type": "git",
35
+ "url": "https://github.com/tkyoun0421/oh-my-agent.git"
36
+ },
37
+ "homepage": "https://github.com/tkyoun0421/oh-my-agent#readme",
38
+ "bugs": {
39
+ "url": "https://github.com/tkyoun0421/oh-my-agent/issues"
40
+ },
41
+ "engines": {
42
+ "node": ">=18.0.0"
43
+ },
44
+ "dependencies": {
45
+ "@modelcontextprotocol/sdk": "^1.26.0",
46
+ "fs-extra": "^11.3.0",
47
+ "zod": "^3.24.0"
48
+ },
49
+ "devDependencies": {
50
+ "@types/fs-extra": "^11.0.4",
51
+ "@types/node": "^22.0.0",
52
+ "tsx": "^4.19.0",
53
+ "typescript": "^5.7.0"
54
+ }
55
+ }