algokit-mcp 1.0.2 → 1.0.4

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.
Files changed (102) hide show
  1. package/README.md +139 -17
  2. package/dist/api/boj-scraper.js +1 -1
  3. package/dist/api/boj-scraper.js.map +1 -1
  4. package/dist/api/programmers-scraper.d.ts +0 -5
  5. package/dist/api/programmers-scraper.d.ts.map +1 -1
  6. package/dist/api/programmers-scraper.js +59 -90
  7. package/dist/api/programmers-scraper.js.map +1 -1
  8. package/dist/index.js +38 -35
  9. package/dist/index.js.map +1 -1
  10. package/dist/tools/boj/analyze-code-submission-boj.d.ts +67 -0
  11. package/dist/tools/boj/analyze-code-submission-boj.d.ts.map +1 -0
  12. package/dist/tools/boj/analyze-code-submission-boj.js +91 -0
  13. package/dist/tools/boj/analyze-code-submission-boj.js.map +1 -0
  14. package/dist/tools/boj/analyze-problem-boj.d.ts +48 -0
  15. package/dist/tools/boj/analyze-problem-boj.d.ts.map +1 -0
  16. package/dist/tools/boj/analyze-problem-boj.js +52 -0
  17. package/dist/tools/boj/analyze-problem-boj.js.map +1 -0
  18. package/dist/tools/boj/fetch-problem-content-boj.d.ts +49 -0
  19. package/dist/tools/boj/fetch-problem-content-boj.d.ts.map +1 -0
  20. package/dist/tools/boj/fetch-problem-content-boj.js +95 -0
  21. package/dist/tools/boj/fetch-problem-content-boj.js.map +1 -0
  22. package/dist/tools/boj/generate-hint-boj.d.ts +42 -0
  23. package/dist/tools/boj/generate-hint-boj.d.ts.map +1 -0
  24. package/dist/tools/boj/generate-hint-boj.js +82 -0
  25. package/dist/tools/boj/generate-hint-boj.js.map +1 -0
  26. package/dist/tools/boj/generate-review-template-boj.d.ts +48 -0
  27. package/dist/tools/boj/generate-review-template-boj.d.ts.map +1 -0
  28. package/dist/tools/boj/generate-review-template-boj.js +52 -0
  29. package/dist/tools/boj/generate-review-template-boj.js.map +1 -0
  30. package/dist/tools/boj/get-problem-boj.d.ts +22 -0
  31. package/dist/tools/boj/get-problem-boj.d.ts.map +1 -0
  32. package/dist/tools/boj/get-problem-boj.js +89 -0
  33. package/dist/tools/boj/get-problem-boj.js.map +1 -0
  34. package/dist/tools/boj/search-problems-boj.d.ts +42 -0
  35. package/dist/tools/boj/search-problems-boj.d.ts.map +1 -0
  36. package/dist/tools/boj/search-problems-boj.js +143 -0
  37. package/dist/tools/boj/search-problems-boj.js.map +1 -0
  38. package/dist/tools/boj/search-tags-boj.d.ts +22 -0
  39. package/dist/tools/boj/search-tags-boj.d.ts.map +1 -0
  40. package/dist/tools/boj/search-tags-boj.js +70 -0
  41. package/dist/tools/boj/search-tags-boj.js.map +1 -0
  42. package/dist/tools/get-problem-boj.d.ts +22 -0
  43. package/dist/tools/get-problem-boj.d.ts.map +1 -0
  44. package/dist/tools/get-problem-boj.js +89 -0
  45. package/dist/tools/get-problem-boj.js.map +1 -0
  46. package/dist/tools/programmers/analyze-code-submission-programmers.d.ts +60 -0
  47. package/dist/tools/programmers/analyze-code-submission-programmers.d.ts.map +1 -0
  48. package/dist/tools/programmers/analyze-code-submission-programmers.js +85 -0
  49. package/dist/tools/programmers/analyze-code-submission-programmers.js.map +1 -0
  50. package/dist/tools/programmers/analyze-problem-programmers.d.ts +48 -0
  51. package/dist/tools/programmers/analyze-problem-programmers.d.ts.map +1 -0
  52. package/dist/tools/programmers/analyze-problem-programmers.js +53 -0
  53. package/dist/tools/programmers/analyze-problem-programmers.js.map +1 -0
  54. package/dist/tools/programmers/fetch-problem-content-programmers.d.ts +46 -0
  55. package/dist/tools/programmers/fetch-problem-content-programmers.d.ts.map +1 -0
  56. package/dist/tools/programmers/fetch-problem-content-programmers.js +76 -0
  57. package/dist/tools/programmers/fetch-problem-content-programmers.js.map +1 -0
  58. package/dist/tools/programmers/generate-hint-programmers.d.ts +42 -0
  59. package/dist/tools/programmers/generate-hint-programmers.d.ts.map +1 -0
  60. package/dist/tools/programmers/generate-hint-programmers.js +80 -0
  61. package/dist/tools/programmers/generate-hint-programmers.js.map +1 -0
  62. package/dist/tools/programmers/generate-review-template-programmers.d.ts +48 -0
  63. package/dist/tools/programmers/generate-review-template-programmers.d.ts.map +1 -0
  64. package/dist/tools/programmers/generate-review-template-programmers.js +53 -0
  65. package/dist/tools/programmers/generate-review-template-programmers.js.map +1 -0
  66. package/dist/tools/programmers/get-problem-programmers.d.ts +53 -0
  67. package/dist/tools/programmers/get-problem-programmers.d.ts.map +1 -0
  68. package/dist/tools/programmers/get-problem-programmers.js +163 -0
  69. package/dist/tools/programmers/get-problem-programmers.js.map +1 -0
  70. package/dist/tools/programmers/search-problems-programmers.d.ts +73 -0
  71. package/dist/tools/programmers/search-problems-programmers.d.ts.map +1 -0
  72. package/dist/tools/programmers/search-problems-programmers.js +173 -0
  73. package/dist/tools/programmers/search-problems-programmers.js.map +1 -0
  74. package/dist/tools/search-problems-boj.d.ts +42 -0
  75. package/dist/tools/search-problems-boj.d.ts.map +1 -0
  76. package/dist/tools/search-problems-boj.js +143 -0
  77. package/dist/tools/search-problems-boj.js.map +1 -0
  78. package/dist/tools/search-tags-boj.d.ts +22 -0
  79. package/dist/tools/search-tags-boj.d.ts.map +1 -0
  80. package/dist/tools/search-tags-boj.js +70 -0
  81. package/dist/tools/search-tags-boj.js.map +1 -0
  82. package/dist/utils/agent-skill-installer.d.ts +9 -0
  83. package/dist/utils/agent-skill-installer.d.ts.map +1 -0
  84. package/dist/utils/agent-skill-installer.js +94 -0
  85. package/dist/utils/agent-skill-installer.js.map +1 -0
  86. package/dist/utils/claudecode-skill-installer.d.ts +6 -0
  87. package/dist/utils/claudecode-skill-installer.d.ts.map +1 -0
  88. package/dist/utils/claudecode-skill-installer.js +70 -0
  89. package/dist/utils/claudecode-skill-installer.js.map +1 -0
  90. package/dist/utils/skill-installer.d.ts +6 -0
  91. package/dist/utils/skill-installer.d.ts.map +1 -0
  92. package/dist/utils/skill-installer.js +70 -0
  93. package/dist/utils/skill-installer.js.map +1 -0
  94. package/dist/utils/tier-converter.d.ts.map +1 -1
  95. package/dist/utils/tier-converter.js +3 -0
  96. package/dist/utils/tier-converter.js.map +1 -1
  97. package/package.json +3 -4
  98. package/skills/algo:code-review/SKILL.md +134 -0
  99. package/skills/algo:fetch/SKILL.md +102 -0
  100. package/skills/algo:hint/SKILL.md +111 -0
  101. package/skills/algo:review/SKILL.md +123 -0
  102. package/skills/algo:search/SKILL.md +122 -0
@@ -0,0 +1,70 @@
1
+ import { existsSync, readFileSync, writeFileSync, readdirSync } from 'fs';
2
+ import { mkdir, cp } from 'fs/promises';
3
+ import { join, dirname } from 'path';
4
+ import { fileURLToPath } from 'url';
5
+ import { homedir } from 'os';
6
+ const __filename = fileURLToPath(import.meta.url);
7
+ const __dirname = dirname(__filename);
8
+ /**
9
+ * MCP 등록 방식(로컬/전역)에 따라 스킬 설치 대상 디렉토리를 결정합니다.
10
+ *
11
+ * - `claude mcp add algokit ...` (로컬): 프로젝트 루트에 .mcp.json 존재
12
+ * → <cwd>/.claude/skills/
13
+ * - `claude mcp add --global algokit ...` (전역): .mcp.json 없음
14
+ * → ~/.claude/skills/
15
+ */
16
+ function detectInstallTarget() {
17
+ const localMcpJson = join(process.cwd(), '.mcp.json');
18
+ if (existsSync(localMcpJson)) {
19
+ return join(process.cwd(), '.claude', 'skills');
20
+ }
21
+ return join(homedir(), '.claude', 'skills');
22
+ }
23
+ /**
24
+ * Claude Code가 설치된 환경인지 확인합니다.
25
+ * skills는 Claude Code 전용 개념이므로 다른 클라이언트(Codex, Gemini 등)에서는 설치를 건너뜁니다.
26
+ *
27
+ * 감지 기준:
28
+ * - ~/.claude/ 디렉토리 존재 → Claude Code 전역 설치됨
29
+ * - 로컬 .mcp.json 존재 → Claude Code 로컬 프로젝트 설정
30
+ */
31
+ function isClaudeCodeEnvironment() {
32
+ const globalClaudeDir = join(homedir(), '.claude');
33
+ const localMcpJson = join(process.cwd(), '.mcp.json');
34
+ return existsSync(globalClaudeDir) || existsSync(localMcpJson);
35
+ }
36
+ /**
37
+ * 패키지에 동봉된 skills/를 적절한 위치에 설치합니다.
38
+ * Claude Code 환경이 아니거나 이미 같은 버전이 설치되어 있으면 건너뜁니다.
39
+ */
40
+ export async function ensureSkillsInstalled() {
41
+ if (!isClaudeCodeEnvironment())
42
+ return;
43
+ // dist/utils/ → ../../skills (패키지 루트의 skills 디렉토리)
44
+ const skillsSrc = join(__dirname, '../../skills');
45
+ if (!existsSync(skillsSrc))
46
+ return;
47
+ const targetDir = detectInstallTarget();
48
+ // 버전 파일로 중복 설치 방지
49
+ const pkgPath = join(__dirname, '../../package.json');
50
+ const { version } = JSON.parse(readFileSync(pkgPath, 'utf-8'));
51
+ const versionFile = join(targetDir, '.algokit-skills-version');
52
+ if (existsSync(versionFile)) {
53
+ const installedVersion = readFileSync(versionFile, 'utf-8').trim();
54
+ if (installedVersion === version)
55
+ return;
56
+ }
57
+ await mkdir(targetDir, { recursive: true });
58
+ // 기존 .claude/skills/에 다른 스킬이 있을 수 있으므로
59
+ // algokit 스킬 디렉토리(algo:*)만 선택적으로 복사
60
+ const skillDirs = readdirSync(skillsSrc);
61
+ for (const skillDir of skillDirs) {
62
+ await cp(join(skillsSrc, skillDir), join(targetDir, skillDir), {
63
+ recursive: true,
64
+ force: true,
65
+ });
66
+ }
67
+ writeFileSync(versionFile, version);
68
+ process.stderr.write(`[algokit] skills v${version} installed → ${targetDir}\n`);
69
+ }
70
+ //# sourceMappingURL=claudecode-skill-installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claudecode-skill-installer.js","sourceRoot":"","sources":["../../src/utils/claudecode-skill-installer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AAC1E,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAE7B,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC;;;;;;;GAOG;AACH,SAAS,mBAAmB;IAC1B,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC;IACtD,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AAC9C,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,uBAAuB;IAC9B,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;IACnD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC;IACtD,OAAO,UAAU,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,YAAY,CAAC,CAAC;AACjE,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACzC,IAAI,CAAC,uBAAuB,EAAE;QAAE,OAAO;IAEvC,mDAAmD;IACnD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAClD,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO;IAEnC,MAAM,SAAS,GAAG,mBAAmB,EAAE,CAAC;IAExC,kBAAkB;IAClB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;IACtD,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAC/D,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,yBAAyB,CAAC,CAAC;IAE/D,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,MAAM,gBAAgB,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QACnE,IAAI,gBAAgB,KAAK,OAAO;YAAE,OAAO;IAC3C,CAAC;IAED,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE5C,uCAAuC;IACvC,oCAAoC;IACpC,MAAM,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IACzC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE;YAC7D,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;IACL,CAAC;IAED,aAAa,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACpC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,OAAO,gBAAgB,SAAS,IAAI,CAAC,CAAC;AAClF,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * 패키지에 동봉된 skills/를 적절한 위치에 설치합니다.
3
+ * Claude Code 환경이 아니거나 이미 같은 버전이 설치되어 있으면 건너뜁니다.
4
+ */
5
+ export declare function ensureSkillsInstalled(): Promise<void>;
6
+ //# sourceMappingURL=skill-installer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-installer.d.ts","sourceRoot":"","sources":["../../src/utils/skill-installer.ts"],"names":[],"mappings":"AAuCA;;;GAGG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CAiC3D"}
@@ -0,0 +1,70 @@
1
+ import { existsSync, readFileSync, writeFileSync, readdirSync } from 'fs';
2
+ import { mkdir, cp } from 'fs/promises';
3
+ import { join, dirname } from 'path';
4
+ import { fileURLToPath } from 'url';
5
+ import { homedir } from 'os';
6
+ const __filename = fileURLToPath(import.meta.url);
7
+ const __dirname = dirname(__filename);
8
+ /**
9
+ * MCP 등록 방식(로컬/전역)에 따라 스킬 설치 대상 디렉토리를 결정합니다.
10
+ *
11
+ * - `claude mcp add algokit ...` (로컬): 프로젝트 루트에 .mcp.json 존재
12
+ * → <cwd>/.claude/skills/
13
+ * - `claude mcp add --global algokit ...` (전역): .mcp.json 없음
14
+ * → ~/.claude/skills/
15
+ */
16
+ function detectInstallTarget() {
17
+ const localMcpJson = join(process.cwd(), '.mcp.json');
18
+ if (existsSync(localMcpJson)) {
19
+ return join(process.cwd(), '.claude', 'skills');
20
+ }
21
+ return join(homedir(), '.claude', 'skills');
22
+ }
23
+ /**
24
+ * Claude Code가 설치된 환경인지 확인합니다.
25
+ * skills는 Claude Code 전용 개념이므로 다른 클라이언트(Codex, Gemini 등)에서는 설치를 건너뜁니다.
26
+ *
27
+ * 감지 기준:
28
+ * - ~/.claude/ 디렉토리 존재 → Claude Code 전역 설치됨
29
+ * - 로컬 .mcp.json 존재 → Claude Code 로컬 프로젝트 설정
30
+ */
31
+ function isClaudeCodeEnvironment() {
32
+ const globalClaudeDir = join(homedir(), '.claude');
33
+ const localMcpJson = join(process.cwd(), '.mcp.json');
34
+ return existsSync(globalClaudeDir) || existsSync(localMcpJson);
35
+ }
36
+ /**
37
+ * 패키지에 동봉된 skills/를 적절한 위치에 설치합니다.
38
+ * Claude Code 환경이 아니거나 이미 같은 버전이 설치되어 있으면 건너뜁니다.
39
+ */
40
+ export async function ensureSkillsInstalled() {
41
+ if (!isClaudeCodeEnvironment())
42
+ return;
43
+ // dist/utils/ → ../../skills (패키지 루트의 skills 디렉토리)
44
+ const skillsSrc = join(__dirname, '../../skills');
45
+ if (!existsSync(skillsSrc))
46
+ return;
47
+ const targetDir = detectInstallTarget();
48
+ // 버전 파일로 중복 설치 방지
49
+ const pkgPath = join(__dirname, '../../package.json');
50
+ const { version } = JSON.parse(readFileSync(pkgPath, 'utf-8'));
51
+ const versionFile = join(targetDir, '.algokit-skills-version');
52
+ if (existsSync(versionFile)) {
53
+ const installedVersion = readFileSync(versionFile, 'utf-8').trim();
54
+ if (installedVersion === version)
55
+ return;
56
+ }
57
+ await mkdir(targetDir, { recursive: true });
58
+ // 기존 .claude/skills/에 다른 스킬이 있을 수 있으므로
59
+ // algokit 스킬 디렉토리(algo:*)만 선택적으로 복사
60
+ const skillDirs = readdirSync(skillsSrc);
61
+ for (const skillDir of skillDirs) {
62
+ await cp(join(skillsSrc, skillDir), join(targetDir, skillDir), {
63
+ recursive: true,
64
+ force: true,
65
+ });
66
+ }
67
+ writeFileSync(versionFile, version);
68
+ process.stderr.write(`[algokit] skills v${version} installed → ${targetDir}\n`);
69
+ }
70
+ //# sourceMappingURL=skill-installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-installer.js","sourceRoot":"","sources":["../../src/utils/skill-installer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AAC1E,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAE7B,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC;;;;;;;GAOG;AACH,SAAS,mBAAmB;IAC1B,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC;IACtD,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AAC9C,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,uBAAuB;IAC9B,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;IACnD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC;IACtD,OAAO,UAAU,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,YAAY,CAAC,CAAC;AACjE,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACzC,IAAI,CAAC,uBAAuB,EAAE;QAAE,OAAO;IAEvC,mDAAmD;IACnD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAClD,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO;IAEnC,MAAM,SAAS,GAAG,mBAAmB,EAAE,CAAC;IAExC,kBAAkB;IAClB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;IACtD,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAC/D,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,yBAAyB,CAAC,CAAC;IAE/D,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,MAAM,gBAAgB,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QACnE,IAAI,gBAAgB,KAAK,OAAO;YAAE,OAAO;IAC3C,CAAC;IAED,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE5C,uCAAuC;IACvC,oCAAoC;IACpC,MAAM,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IACzC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE;YAC7D,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;IACL,CAAC;IAED,aAAa,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACpC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,OAAO,gBAAgB,SAAS,IAAI,CAAC,CAAC;AAClF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"tier-converter.d.ts","sourceRoot":"","sources":["../../src/utils/tier-converter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH;;GAEG;AACH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAOb,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,UAAU,CAAC;AAE/C;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAwBjD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAgB/D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAalD;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAqF1D"}
1
+ {"version":3,"file":"tier-converter.d.ts","sourceRoot":"","sources":["../../src/utils/tier-converter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH;;GAEG;AACH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAOb,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,UAAU,CAAC;AAE/C;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAwBjD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAgB/D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAgBlD;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAqF1D"}
@@ -92,6 +92,9 @@ export function tierToLevelRange(tier) {
92
92
  * getTierBadge(6) // "⚪ Silver V"
93
93
  */
94
94
  export function getTierBadge(level) {
95
+ // level 0 = 미분류(Unrated)
96
+ if (level === 0)
97
+ return '⬜ Unrated';
95
98
  // levelToTier에서 검증 수행
96
99
  const tierName = levelToTier(level);
97
100
  // 티어 그룹 찾기
@@ -1 +1 @@
1
- {"version":3,"file":"tier-converter.js","sourceRoot":"","sources":["../../src/utils/tier-converter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tier-converter.js","sourceRoot":"","sources":["../../src/utils/tier-converter.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "algokit-mcp",
3
- "version": "1.0.2",
3
+ "version": "1.0.4",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -26,7 +26,8 @@
26
26
  "study-helper"
27
27
  ],
28
28
  "files": [
29
- "dist"
29
+ "dist",
30
+ "skills"
30
31
  ],
31
32
  "author": "itsme-shawn <chs98105@gmail.com>",
32
33
  "license": "MIT",
@@ -45,14 +46,12 @@
45
46
  "dependencies": {
46
47
  "@modelcontextprotocol/sdk": "^1.26.0",
47
48
  "cheerio": "^1.2.0",
48
- "puppeteer": "^24.37.3",
49
49
  "zod": "3.25.76",
50
50
  "zod-to-json-schema": "^3.25.1"
51
51
  },
52
52
  "devDependencies": {
53
53
  "@types/cheerio": "^0.22.35",
54
54
  "@types/node": "^25.2.3",
55
- "@types/puppeteer": "^5.4.7",
56
55
  "@vitest/coverage-v8": "^4.0.18",
57
56
  "tsx": "^4.21.0",
58
57
  "typescript": "^5.9.3",
@@ -0,0 +1,134 @@
1
+ ---
2
+ name: algo:code-review
3
+ description: 백준(BOJ) 또는 프로그래머스 풀이 코드 분석 및 피드백. 정확성·복잡도 검토, 디버깅, 코드 리뷰가 필요할 때 사용.
4
+ ---
5
+
6
+ # algo:code-review - 알고리즘 코드 분석
7
+
8
+ 백준(BOJ)과 프로그래머스 문제 풀이 코드를 분석하고 개선점을 제안하는 스킬입니다.
9
+
10
+ ## 사용법
11
+
12
+ ```
13
+ /algo:code-review <문제식별자> [분석타입]
14
+ ```
15
+
16
+ **예시:**
17
+ - `/algo:code-review boj 1003` - BOJ 1003번 풀이 분석
18
+ - `/algo:code-review programmers 42748 ` - 프로그래머스 42748번 풀이 분석
19
+ - `/algo:code-review 1003` - 숫자만 입력 → 플랫폼 질문
20
+ - `/algo:code-review https://www.acmicpc.net/problem/1003` - URL → BOJ 확정, 전체 분석
21
+ - `/algo:code-review https://school.programmers.co.kr/learn/courses/30/lessons/42748 debug` - URL → 프로그래머스, 디버깅
22
+
23
+ ## 플랫폼 판별 규칙
24
+
25
+ | 입력 패턴 | 플랫폼 | 예시 |
26
+ |-----------|--------|------|
27
+ | `acmicpc.net` URL | BOJ | `https://www.acmicpc.net/problem/1003` |
28
+ | `school.programmers.co.kr` URL | Programmers | `https://school.programmers.co.kr/...` |
29
+ | **숫자만 입력** | **→ 반드시 되묻기** | `1003`, `42748` |
30
+
31
+ 단, **대화 맥락에서 플랫폼이 이미 확인된 경우** (예: "백준 1003번 풀다가 막혔어")에는 되묻지 않고 그 플랫폼으로 진행합니다.
32
+
33
+ > ⚠️ **맥락이 없는 숫자 입력은 절대 임의로 플랫폼을 추정하지 않습니다.**
34
+
35
+ ## 동작 방식
36
+
37
+ 1. **플랫폼 판별**: 위 규칙 적용 → 불명확하면 즉시 되묻기
38
+ 2. **사용자 코드 입력 요청**: 언어와 코드 받기
39
+ 3. **MCP 도구 실행**: 플랫폼별 `analyze_code_submission_*` 사용
40
+ 4. **분석 결과 제공**:
41
+ - 문제 요구사항과 비교
42
+ - 시간/공간 복잡도 분석
43
+ - 개선점 제안
44
+ - 디버깅 가이드
45
+
46
+ ## MCP 도구 사용
47
+
48
+ ### BOJ
49
+
50
+ ```
51
+ algokit/analyze_code_submission_boj {
52
+ problem_id: 1003,
53
+ code: "def fib(n):\n ...",
54
+ language: "python",
55
+ analysis_type: "full"
56
+ }
57
+ ```
58
+
59
+ ### 프로그래머스
60
+
61
+ ```
62
+ algokit/analyze_code_submission_programmers {
63
+ problem_id: 42748,
64
+ code: "def solution(array, commands):\n ...",
65
+ language: "python",
66
+ analysis_type: "full"
67
+ }
68
+ ```
69
+
70
+ ## 분석 타입
71
+
72
+ | 타입 | 설명 | 포함 내용 |
73
+ |------|------|-----------|
74
+ | `full` | 전체 분석 (기본값) | 정확성, 복잡도, 개선점, 스타일 |
75
+ | `hint` | 힌트 제공 | 핵심 개념, 접근 방법, 방향 제시 |
76
+ | `debug` | 디버깅 중심 | 에러 원인, 로직 오류, 엣지 케이스 |
77
+ | `review` | 코드 리뷰 | 스타일, 가독성, 네이밍, 구조 |
78
+
79
+
80
+ ## 대화형 프로세스
81
+
82
+ 1. **코드 요청**:
83
+ ```
84
+ AI: 분석할 코드를 보여주세요. 언어도 함께 알려주세요 (python/cpp/java/js/go)
85
+ ```
86
+
87
+ 2. **분석 타입 선택** (미지정 시):
88
+ ```
89
+ AI: 어떤 분석이 필요하신가요?
90
+ 1. 전체 분석 (정확성 + 복잡도 + 개선점)
91
+ 2. 디버깅 (왜 틀렸는지)
92
+ 3. 힌트 (어떻게 풀어야 하는지)
93
+ 4. 코드 리뷰 (스타일 개선)
94
+ ```
95
+
96
+ 3. **MCP 도구 실행 및 결과 제시**:
97
+ ```
98
+ ## 분석 결과
99
+
100
+ ### ✅ 정확성
101
+ - 문제 요구사항을 충족합니다
102
+
103
+ ### ⏱️ 복잡도
104
+ - 시간: O(n) ✅
105
+ - 공간: O(n)
106
+
107
+ ### 💡 개선점
108
+ 1. ...
109
+ ```
110
+
111
+ ## 주의사항
112
+
113
+ - ✅ 코드는 반드시 사용자에게 입력받기 (추측 금지)
114
+ - ✅ 숫자만 입력된 경우 플랫폼 확인 후 진행
115
+ - ✅ 대화 맥락에서 플랫폼이 이미 확인된 경우 그 맥락 활용
116
+ - ✅ 분석 결과는 건설적이고 친절하게
117
+ - ✅ 개선점 제안 시 "왜"를 설명
118
+ - ❌ 맥락 없이 플랫폼 임의 추정 금지
119
+ - ❌ 코드를 함부로 완전히 재작성하지 않기
120
+ - ❌ `hint` 타입 외에는 문제 정답 직접 제공 금지
121
+
122
+ ## 에러 처리
123
+
124
+ | 에러 | 원인 | 해결 |
125
+ |------|------|------|
126
+ | 언어 미지원 | 지원 언어 외 | 지원 언어로 변환 요청 |
127
+ | 코드 없음 | 코드 미제공 | 전체 코드 요청 |
128
+ | 문제 없음 | 잘못된 번호 | 번호/URL 확인 |
129
+
130
+ ## 관련 스킬
131
+
132
+ - `/algo:fetch` - 문제 본문 크롤링 (내부 자동 호출)
133
+ - `/algo:hint` - 코드 없이 힌트만 받기
134
+ - `/algo:review` - 풀이 후 복습 문서 작성
@@ -0,0 +1,102 @@
1
+ ---
2
+ name: algo:fetch
3
+ description: 백준(BOJ) 또는 프로그래머스 문제 본문 크롤링. 문제 내용, 입출력 형식, 예제를 확인할 때 사용.
4
+ ---
5
+
6
+ # algo:fetch - 알고리즘 문제 본문 크롤링
7
+
8
+ 백준(BOJ)과 프로그래머스 문제의 전문을 가져오는 스킬입니다.
9
+
10
+ ## 사용법
11
+
12
+ ```
13
+ /algo:fetch <문제식별자>
14
+ ```
15
+
16
+ **예시:**
17
+ - `/algo:fetch 1003` - 숫자만 입력 → 플랫폼 질문
18
+ - `/algo:fetch https://www.acmicpc.net/problem/1003` - URL → BOJ 확정
19
+ - `/algo:fetch https://school.programmers.co.kr/learn/courses/30/lessons/42748` - URL → 프로그래머스 확정
20
+
21
+ ## 플랫폼 판별 규칙
22
+
23
+ | 입력 패턴 | 플랫폼 | 예시 |
24
+ |-----------|--------|------|
25
+ | `acmicpc.net` URL | BOJ | `https://www.acmicpc.net/problem/1003` |
26
+ | `school.programmers.co.kr` URL | Programmers | `https://school.programmers.co.kr/...` |
27
+ | **숫자만 입력** | **→ 반드시 되묻기** | `1003`, `42748` |
28
+
29
+ 단, **대화 맥락에서 플랫폼이 이미 확인된 경우** (예: "백준 1003번 풀고 있어")에는 되묻지 않고 그 플랫폼으로 진행합니다.
30
+
31
+ > ⚠️ **맥락이 없는 숫자 입력은 절대 임의로 플랫폼을 추정하지 않습니다.**
32
+
33
+ ## 동작 방식
34
+
35
+ 1. **플랫폼 판별**: 위 규칙 적용 → 불명확하면 즉시 되묻기
36
+ 2. **MCP 도구 호출**: 플랫폼별 `fetch_problem_content_*` 실행
37
+ 3. **구조화된 데이터 반환**:
38
+ - 문제 제목, 설명
39
+ - 입출력 형식
40
+ - 예제 입출력
41
+ - 시간/메모리 제한 (BOJ) 또는 제한사항 (Programmers)
42
+ - 메타데이터
43
+
44
+ ## MCP 도구 사용
45
+
46
+ ### BOJ
47
+
48
+ ```
49
+ algokit/fetch_problem_content_boj { problem_id: 1003 }
50
+ ```
51
+
52
+ 크롤링 대상: `https://www.acmicpc.net/problem/{ID}`
53
+
54
+ ### 프로그래머스
55
+
56
+ ```
57
+ # 숫자 ID로
58
+ algokit/fetch_problem_content_programmers { problem_id: 42748 }
59
+
60
+ # URL로
61
+ algokit/fetch_problem_content_programmers {
62
+ problem_id: "https://school.programmers.co.kr/learn/courses/30/lessons/42748"
63
+ }
64
+ ```
65
+
66
+ 크롤링 대상: `https://school.programmers.co.kr/learn/courses/30/lessons/{ID}`
67
+
68
+ ## 크롤링 제한사항
69
+
70
+ | 항목 | BOJ | Programmers |
71
+ |------|-----|-------------|
72
+ | 타임아웃 | 10초 | 10초 |
73
+ | 재시도 | 최대 2회 | 최대 2회 |
74
+ | 캐시 | 30일 | 30일 |
75
+
76
+ ## 에러 처리
77
+
78
+ | 에러 | 원인 | 해결 |
79
+ |------|------|------|
80
+ | NOT_FOUND | 문제 번호가 없음 | 번호/URL 확인 |
81
+ | TIMEOUT | 10초 초과 | 재시도 |
82
+ | PARSE_ERROR | HTML 구조 변경 | 이슈 리포트 |
83
+
84
+ ## 사용 시나리오
85
+
86
+ 1. **문제 풀이 전 확인**: 입출력 예제, 제한 조건 파악
87
+ 2. **문제 복습 시 참조**: 요구사항 재확인
88
+ 3. **코드 분석 시 비교**: `/algo:code-review`와 연계
89
+
90
+ ## 주의사항
91
+
92
+ - ✅ 숫자만 입력된 경우 플랫폼 확인 후 진행
93
+ - ✅ 대화 맥락에서 플랫폼이 이미 확인된 경우 그 맥락 활용
94
+ - ✅ 문제 본문 필요 시에만 사용 (서버 부하 최소화)
95
+ - ❌ 맥락 없이 플랫폼 임의 추정 금지
96
+ - ⚠️ 웹사이트 HTML 구조 변경 시 파싱 실패 가능
97
+
98
+ ## 관련 스킬
99
+
100
+ - `/algo:hint` - 문제 힌트 생성 (내부적으로 fetch 활용)
101
+ - `/algo:code-review` - 코드와 문제 요구사항 비교 분석
102
+ - `/algo:review` - 복습 템플릿 생성
@@ -0,0 +1,111 @@
1
+ ---
2
+ name: algo:hint
3
+ description: 백준(BOJ) 또는 프로그래머스 알고리즘 문제의 단계별 힌트 생성. 문제가 막히거나 접근 방향이 필요할 때 사용.
4
+ ---
5
+
6
+ # algo:hint - 알고리즘 문제 힌트 생성
7
+
8
+ 백준(BOJ)과 프로그래머스 문제를 분석하고 단계별 힌트를 제공하는 스킬입니다.
9
+
10
+ ## 사용법
11
+
12
+ ```
13
+ /algo:hint <문제식별자>
14
+ ```
15
+
16
+ **예시:**
17
+ - `/algo:hint 1003` - 숫자만 입력 → 플랫폼 질문
18
+ - `/algo:hint https://school.programmers.co.kr/learn/courses/30/lessons/42748` - URL → 프로그래머스 확정
19
+ - `/algo:hint https://www.acmicpc.net/problem/1003` - URL → BOJ 확정
20
+
21
+ ## 플랫폼 판별 규칙
22
+
23
+ | 입력 패턴 | 플랫폼 | 예시 |
24
+ |-----------|--------|------|
25
+ | `acmicpc.net` URL | BOJ | `https://www.acmicpc.net/problem/1003` |
26
+ | `school.programmers.co.kr` URL | Programmers | `https://school.programmers.co.kr/...` |
27
+ | **숫자만 입력** | **→ 반드시 되묻기** | `1003`, `42748` |
28
+
29
+ 단, **대화 맥락에서 플랫폼이 이미 확인된 경우** (예: "백준 문제 풀고 있어", 직전에 BOJ 문제를 함께 논의 중)에는 되묻지 않고 그 플랫폼으로 진행합니다.
30
+
31
+ > ⚠️ **맥락이 없는 숫자 입력은 절대 임의로 플랫폼을 추정하지 않습니다.**
32
+
33
+ ## 동작 방식
34
+
35
+ 1. **플랫폼 판별**: 위 규칙 적용 → 불명확하면 즉시 되묻기
36
+ 2. **MCP 도구 호출**: 플랫폼별 `analyze_problem_*` 실행
37
+ 3. **분석 정보 수신**: 난이도, 태그, 힌트 가이드 프롬프트
38
+ 4. **사용자 상황 파악**: 현재 진행 상황 분석
39
+ 5. **단계별 힌트 제공** (한 번에 1개 레벨)
40
+
41
+ ## MCP 도구 사용
42
+
43
+ ### BOJ
44
+
45
+ ```
46
+ algokit/analyze_problem_boj { problem_id: 1003 }
47
+ ```
48
+
49
+ 필요 시 문제 본문도 확인:
50
+ ```
51
+ algokit/fetch_problem_content_boj { problem_id: 1003 }
52
+ ```
53
+
54
+ ### 프로그래머스
55
+
56
+ ```
57
+ algokit/analyze_problem_programmers { problem_id: 42748 }
58
+ ```
59
+
60
+ 필요 시 문제 본문도 확인:
61
+ ```
62
+ algokit/fetch_problem_content_programmers { problem_id: 42748 }
63
+ ```
64
+
65
+ ## 힌트 레벨 선택 가이드
66
+
67
+ 사용자 상황을 파악하고 **단 1개 레벨만** 제공:
68
+
69
+ | 상황 | 레벨 | 판단 기준 |
70
+ |------|------|-----------|
71
+ | 처음 시도 / 막힘 | Level 1 | 코드 없음, "어떻게 시작?", "접근법?" |
72
+ | 일부 구현 완료 | Level 2 | 코드 작성 중, "더 필요해", "구현 막힘" |
73
+ | 정답 요청 | Level 3 | "정답", "풀이", "코드 보여줘" 명시 |
74
+
75
+ ## 힌트 제공 프로세스
76
+
77
+ 1. **상황 파악**:
78
+ ```
79
+ AI: 어디서 막히셨나요? 코드가 있으시면 보여주세요.
80
+ ```
81
+
82
+ 2. **Level 1 제공** (처음 막힌 경우):
83
+ ```
84
+ hint_levels[0].prompt를 활용해 접근법 안내
85
+ ```
86
+
87
+ 3. **Level 2 제공** (추가 요청 시):
88
+ ```
89
+ hint_levels[1].prompt를 활용해 핵심 로직 안내
90
+ ```
91
+
92
+ 4. **Level 3 제공** (명시적 요청 시):
93
+ ```
94
+ hint_levels[2].prompt를 활용해 상세 구현 가이드 제공
95
+ ```
96
+
97
+ ## 주의사항
98
+
99
+ - ❌ 3개 레벨 동시 제공 금지
100
+ - ✅ 사용자 상황 분석 후 1개 레벨만 선택
101
+ - ✅ 프롬프트 가이드를 활용해 문제별 맞춤 힌트 생성
102
+ - ✅ 사용자가 "더 힌트" 요청 시 다음 레벨로 진행
103
+ - ✅ 숫자만 입력된 경우 플랫폼 확인 후 진행
104
+ - ✅ 대화 맥락에서 플랫폼이 이미 확인된 경우 그 맥락 활용
105
+ - ❌ 맥락 없이 플랫폼 임의 추정 금지
106
+
107
+ ## 관련 스킬
108
+
109
+ - `/algo:fetch` - 문제 본문 직접 확인
110
+ - `/algo:review` - 풀이 후 복습 템플릿 생성
111
+ - `/algo:search` - 유사 난이도 문제 검색