docuking-mcp 2.10.0 → 2.11.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.
- package/README.md +62 -20
- package/index.js +125 -41
- package/lib/version-check.js +119 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,22 +2,42 @@
|
|
|
2
2
|
|
|
3
3
|
AI가 문서를 Push/Pull 할 수 있게 해주는 MCP 서버
|
|
4
4
|
|
|
5
|
-
## 설치
|
|
5
|
+
## 설치 (글로벌 설치 권장)
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
|
-
|
|
8
|
+
# 1. 글로벌 설치
|
|
9
|
+
npm install -g docuking-mcp
|
|
10
|
+
|
|
11
|
+
# 2. MCP 등록 (Claude Code)
|
|
12
|
+
claude mcp add docuking -s user -- docuking-mcp
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
### 업데이트
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm update -g docuking-mcp
|
|
9
19
|
```
|
|
10
20
|
|
|
21
|
+
> **참고**: MCP는 새 버전이 있으면 첫 도구 호출 시 자동으로 알려줍니다.
|
|
22
|
+
|
|
11
23
|
## MCP 설정
|
|
12
24
|
|
|
13
|
-
### Claude Code
|
|
25
|
+
### Claude Code (CLI로 등록)
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
claude mcp add docuking -s user -- docuking-mcp
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### Claude Code (JSON으로 등록)
|
|
32
|
+
|
|
33
|
+
`~/.claude.json`에 추가:
|
|
14
34
|
|
|
15
35
|
```json
|
|
16
36
|
{
|
|
17
37
|
"mcpServers": {
|
|
18
38
|
"docuking": {
|
|
19
|
-
"command": "
|
|
20
|
-
"args": [
|
|
39
|
+
"command": "docuking-mcp",
|
|
40
|
+
"args": []
|
|
21
41
|
}
|
|
22
42
|
}
|
|
23
43
|
}
|
|
@@ -31,8 +51,23 @@ npx docuking-mcp
|
|
|
31
51
|
{
|
|
32
52
|
"mcpServers": {
|
|
33
53
|
"docuking": {
|
|
34
|
-
"command": "
|
|
35
|
-
"args": [
|
|
54
|
+
"command": "docuking-mcp",
|
|
55
|
+
"args": []
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### Gemini CLI
|
|
62
|
+
|
|
63
|
+
`~/.gemini/antigravity/mcp_config.json`에 추가:
|
|
64
|
+
|
|
65
|
+
```json
|
|
66
|
+
{
|
|
67
|
+
"mcpServers": {
|
|
68
|
+
"docuking": {
|
|
69
|
+
"command": "docuking-mcp",
|
|
70
|
+
"args": []
|
|
36
71
|
}
|
|
37
72
|
}
|
|
38
73
|
}
|
|
@@ -50,28 +85,35 @@ npx docuking-mcp
|
|
|
50
85
|
| docuking_log | 커밋 히스토리 조회 |
|
|
51
86
|
| docuking_diff | 버전 간 차이 비교 |
|
|
52
87
|
| docuking_rollback | 특정 커밋으로 롤백 |
|
|
53
|
-
| docuking_talk | AI 대화록 저장 (
|
|
54
|
-
| docuking_plan | 작업 계획 관리 (
|
|
88
|
+
| docuking_talk | AI 대화록 저장 (zz_ai_1_Talk/) |
|
|
89
|
+
| docuking_plan | 작업 계획 관리 (zz_ai_3_Plan/) |
|
|
55
90
|
| docuking_done | 작업 완료 처리 |
|
|
56
|
-
| docuking_todo | 킹투두 관리 (
|
|
91
|
+
| docuking_todo | 킹투두 관리 (zz_ai_2_Todo/) |
|
|
92
|
+
| docuking_urgent | 긴급 보고 (xx_Urgent/) |
|
|
93
|
+
| docuking_delete | 서버 파일 삭제 |
|
|
94
|
+
| docuking_validate | 정책 준수 검증 |
|
|
57
95
|
|
|
58
96
|
## 폴더 구조
|
|
59
97
|
|
|
60
98
|
```
|
|
61
99
|
프로젝트/
|
|
62
|
-
├──
|
|
63
|
-
├──
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
├── zz_ai_1_Talk/
|
|
68
|
-
├── zz_ai_2_Todo/
|
|
69
|
-
└── zz_ai_3_Plan/
|
|
100
|
+
├── xx_Infra_Config/ ← 시스템 설정 (동기화 대상)
|
|
101
|
+
├── xx_Policy/ ← 정책 문서 (동기화 대상, 킹캐스트)
|
|
102
|
+
├── xx_Urgent/ ← 긴급 보고 (동기화 대상)
|
|
103
|
+
├── yy_All_Docu/ ← 문서 허브 (동기화 대상)
|
|
104
|
+
├── yy_Coworker_{이름}/ ← 협업자 작업 폴더 (동기화 대상)
|
|
105
|
+
│ ├── zz_ai_1_Talk/ ← 협업자의 AI 대화록
|
|
106
|
+
│ ├── zz_ai_2_Todo/ ← 협업자의 AI 투두
|
|
107
|
+
│ └── zz_ai_3_Plan/ ← 협업자의 AI 플랜
|
|
108
|
+
├── zz_ai_1_Talk/ ← 오너의 AI 대화록 (동기화 대상)
|
|
109
|
+
├── zz_ai_2_Todo/ ← 오너의 AI 투두 (동기화 대상)
|
|
110
|
+
└── zz_ai_3_Plan/ ← 오너의 AI 플랜 (동기화 대상)
|
|
70
111
|
```
|
|
71
112
|
|
|
72
113
|
**접두사 규칙:**
|
|
73
|
-
- `
|
|
74
|
-
- `
|
|
114
|
+
- `xx_*`: 시스템/인프라 폴더
|
|
115
|
+
- `yy_*`: 사람용 폴더
|
|
116
|
+
- `zz_ai_*`: AI용 폴더
|
|
75
117
|
|
|
76
118
|
## 웹사이트
|
|
77
119
|
|
package/index.js
CHANGED
|
@@ -62,11 +62,17 @@ import {
|
|
|
62
62
|
|
|
63
63
|
import { handleValidate } from './handlers/validate.js';
|
|
64
64
|
|
|
65
|
-
//
|
|
65
|
+
// 버전 체크 모듈
|
|
66
|
+
import { checkForUpdates, getVersionWarningMessage, getCurrentVersion } from './lib/version-check.js';
|
|
67
|
+
|
|
68
|
+
// 세션당 1회 알림 플래그
|
|
69
|
+
let versionWarningShown = false;
|
|
70
|
+
|
|
71
|
+
// MCP 서버 생성 (package.json에서 버전 읽기)
|
|
66
72
|
const server = new Server(
|
|
67
73
|
{
|
|
68
74
|
name: 'docuking-mcp',
|
|
69
|
-
version:
|
|
75
|
+
version: getCurrentVersion(),
|
|
70
76
|
},
|
|
71
77
|
{
|
|
72
78
|
capabilities: {
|
|
@@ -628,29 +634,55 @@ DocuKing은 문서 버전 관리 시스템입니다. Git이 코드를 관리하
|
|
|
628
634
|
|
|
629
635
|
작동 방식: 로컬 yy_All_Docu/ → Push → 킹폴더 → 캔버스에서 시각화
|
|
630
636
|
|
|
631
|
-
## MCP
|
|
632
|
-
|
|
633
|
-
###
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
637
|
+
## MCP 설치 및 설정 (매우 중요!)
|
|
638
|
+
|
|
639
|
+
### 1단계: 글로벌 설치 (필수)
|
|
640
|
+
\`\`\`bash
|
|
641
|
+
npm install -g docuking-mcp
|
|
642
|
+
\`\`\`
|
|
643
|
+
|
|
644
|
+
### 2단계: MCP 등록 (AI 도구별)
|
|
645
|
+
|
|
646
|
+
**Claude Code:**
|
|
647
|
+
\`\`\`bash
|
|
648
|
+
claude mcp add docuking -s user -- docuking-mcp
|
|
649
|
+
\`\`\`
|
|
650
|
+
|
|
651
|
+
**Cursor:** \`~/.cursor/mcp.json\`에 추가
|
|
652
|
+
\`\`\`json
|
|
653
|
+
{
|
|
654
|
+
"mcpServers": {
|
|
655
|
+
"docuking": {
|
|
656
|
+
"command": "docuking-mcp",
|
|
657
|
+
"args": []
|
|
658
|
+
}
|
|
659
|
+
}
|
|
660
|
+
}
|
|
661
|
+
\`\`\`
|
|
662
|
+
|
|
663
|
+
**Gemini CLI:** \`~/.gemini/antigravity/mcp_config.json\`에 추가
|
|
664
|
+
\`\`\`json
|
|
665
|
+
{
|
|
666
|
+
"mcpServers": {
|
|
667
|
+
"docuking": {
|
|
668
|
+
"command": "docuking-mcp",
|
|
669
|
+
"args": []
|
|
670
|
+
}
|
|
671
|
+
}
|
|
672
|
+
}
|
|
673
|
+
\`\`\`
|
|
674
|
+
|
|
675
|
+
### 업데이트
|
|
676
|
+
새 버전이 있으면 첫 도구 호출 시 자동으로 알려줍니다.
|
|
677
|
+
\`\`\`bash
|
|
678
|
+
npm update -g docuking-mcp
|
|
679
|
+
\`\`\`
|
|
680
|
+
|
|
681
|
+
### MCP 설정 vs 프로젝트 연결
|
|
682
|
+
- **MCP 설정**: 전역, 한 번만 (위의 설치/등록)
|
|
683
|
+
- **프로젝트 연결**: 각 폴더마다 \`docuking_init\` 실행
|
|
684
|
+
- **중요**: 이미 다른 MCP 서버가 있으면 덮어쓰지 말고 \`docuking\` 항목만 추가
|
|
685
|
+
|
|
654
686
|
|
|
655
687
|
## .gitignore 설정 (중요!)
|
|
656
688
|
|
|
@@ -713,13 +745,30 @@ zz_ai_3_Plan/
|
|
|
713
745
|
- planId로 계획 찾기
|
|
714
746
|
- 완료 요약 및 산출물 기록
|
|
715
747
|
|
|
716
|
-
### 12.
|
|
748
|
+
### 12. docuking_todo
|
|
749
|
+
킹투두를 관리합니다 (\`zz_ai_2_Todo/z_King_Todo.md\`).
|
|
750
|
+
- action: "add" (추가), "done" (완료), "list" (조회)
|
|
751
|
+
- 프로젝트 공식 할일 목록 (Push하면 웹에서 확인 가능)
|
|
752
|
+
|
|
753
|
+
### 13. docuking_urgent
|
|
754
|
+
긴급 보고를 \`xx_Urgent/\` 폴더에 작성합니다 (킹어전트).
|
|
755
|
+
- 정책에 없는 예외 상황 발견 시 오너에게 보고
|
|
756
|
+
- 협업자도 xx_Urgent/에 쓰기 가능 (유일한 예외)
|
|
757
|
+
- 오너가 Pull할 때 "긴급 보고 N건" 알림
|
|
758
|
+
|
|
759
|
+
### 14. docuking_delete
|
|
717
760
|
서버에서 파일/폴더를 직접 삭제합니다.
|
|
718
761
|
- 로컬에서 삭제한 파일이 Push 후에도 서버에 남아있을 때
|
|
719
762
|
- 서버에만 존재하는 불필요한 파일 정리
|
|
720
763
|
- soft-delete 처리 (3일 후 영구 삭제)
|
|
721
764
|
- 권한: 오너는 자기 영역, 협업자는 자기 폴더만
|
|
722
765
|
|
|
766
|
+
### 15. docuking_validate
|
|
767
|
+
코드가 정책을 준수하는지 검증합니다 (킹밸리데이트).
|
|
768
|
+
- .claude/rules/local/ 정책 기준으로 검증
|
|
769
|
+
- 폴더 구조, 명명 규칙, API 규칙 등 체크
|
|
770
|
+
- 위반 목록과 수정 제안 반환
|
|
771
|
+
|
|
723
772
|
## Git과의 유사성
|
|
724
773
|
|
|
725
774
|
| DocuKing | Git | 설명 |
|
|
@@ -818,40 +867,75 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
818
867
|
const { name, arguments: args } = request.params;
|
|
819
868
|
|
|
820
869
|
try {
|
|
870
|
+
let result;
|
|
821
871
|
switch (name) {
|
|
822
872
|
case 'docuking_init':
|
|
823
|
-
|
|
873
|
+
result = await handleInit(args);
|
|
874
|
+
break;
|
|
824
875
|
case 'docuking_push':
|
|
825
|
-
|
|
876
|
+
result = await handlePush(args);
|
|
877
|
+
break;
|
|
826
878
|
case 'docuking_pull':
|
|
827
|
-
|
|
879
|
+
result = await handlePull(args);
|
|
880
|
+
break;
|
|
828
881
|
case 'docuking_list':
|
|
829
|
-
|
|
882
|
+
result = await handleList(args);
|
|
883
|
+
break;
|
|
830
884
|
case 'docuking_status':
|
|
831
|
-
|
|
885
|
+
result = await handleStatus(args);
|
|
886
|
+
break;
|
|
832
887
|
case 'docuking_log':
|
|
833
|
-
|
|
888
|
+
result = await handleLog(args);
|
|
889
|
+
break;
|
|
834
890
|
case 'docuking_diff':
|
|
835
|
-
|
|
891
|
+
result = await handleDiff(args);
|
|
892
|
+
break;
|
|
836
893
|
case 'docuking_rollback':
|
|
837
|
-
|
|
894
|
+
result = await handleRollback(args);
|
|
895
|
+
break;
|
|
838
896
|
case 'docuking_talk':
|
|
839
|
-
|
|
897
|
+
result = await handleTalk(args);
|
|
898
|
+
break;
|
|
840
899
|
case 'docuking_plan':
|
|
841
|
-
|
|
900
|
+
result = await handlePlan(args);
|
|
901
|
+
break;
|
|
842
902
|
case 'docuking_done':
|
|
843
|
-
|
|
903
|
+
result = await handleDone(args);
|
|
904
|
+
break;
|
|
844
905
|
case 'docuking_todo':
|
|
845
|
-
|
|
906
|
+
result = await handleTodo(args);
|
|
907
|
+
break;
|
|
846
908
|
case 'docuking_urgent':
|
|
847
|
-
|
|
909
|
+
result = await handleUrgent(args);
|
|
910
|
+
break;
|
|
848
911
|
case 'docuking_delete':
|
|
849
|
-
|
|
912
|
+
result = await handleDelete(args);
|
|
913
|
+
break;
|
|
850
914
|
case 'docuking_validate':
|
|
851
|
-
|
|
915
|
+
result = await handleValidate(args);
|
|
916
|
+
break;
|
|
852
917
|
default:
|
|
853
918
|
throw new Error(`Unknown tool: ${name}`);
|
|
854
919
|
}
|
|
920
|
+
|
|
921
|
+
// 버전 체크 알림 (세션당 1회)
|
|
922
|
+
if (!versionWarningShown) {
|
|
923
|
+
try {
|
|
924
|
+
const updateInfo = await checkForUpdates();
|
|
925
|
+
const warning = getVersionWarningMessage(updateInfo);
|
|
926
|
+
if (warning) {
|
|
927
|
+
versionWarningShown = true;
|
|
928
|
+
result.content.push({
|
|
929
|
+
type: 'text',
|
|
930
|
+
text: warning
|
|
931
|
+
});
|
|
932
|
+
}
|
|
933
|
+
} catch (e) {
|
|
934
|
+
// 버전 체크 실패해도 무시 (서버 작동에 영향 없음)
|
|
935
|
+
}
|
|
936
|
+
}
|
|
937
|
+
|
|
938
|
+
return result;
|
|
855
939
|
} catch (error) {
|
|
856
940
|
return {
|
|
857
941
|
content: [
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DocuKing MCP 버전 체크 모듈
|
|
3
|
+
*
|
|
4
|
+
* npm registry에서 최신 버전을 확인하고,
|
|
5
|
+
* 현재 버전과 비교하여 업데이트 필요 여부를 알려줍니다.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { readFileSync } from 'fs';
|
|
9
|
+
import { fileURLToPath } from 'url';
|
|
10
|
+
import { dirname, join } from 'path';
|
|
11
|
+
|
|
12
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
13
|
+
const __dirname = dirname(__filename);
|
|
14
|
+
|
|
15
|
+
// 캐시 (세션 동안 유지)
|
|
16
|
+
let cachedUpdateInfo = null;
|
|
17
|
+
let lastCheckTime = 0;
|
|
18
|
+
const CHECK_INTERVAL = 60 * 60 * 1000; // 1시간
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* npm registry에서 최신 버전 확인 후 업데이트 필요 여부 반환
|
|
22
|
+
* - 1시간 캐시
|
|
23
|
+
* - 네트워크 오류 시 graceful degradation
|
|
24
|
+
*/
|
|
25
|
+
export async function checkForUpdates() {
|
|
26
|
+
const now = Date.now();
|
|
27
|
+
|
|
28
|
+
// 1시간 내 체크했으면 캐시 반환
|
|
29
|
+
if (cachedUpdateInfo && (now - lastCheckTime) < CHECK_INTERVAL) {
|
|
30
|
+
return cachedUpdateInfo;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
try {
|
|
34
|
+
const current = getCurrentVersion();
|
|
35
|
+
const latest = await getLatestVersion();
|
|
36
|
+
|
|
37
|
+
cachedUpdateInfo = {
|
|
38
|
+
current,
|
|
39
|
+
latest,
|
|
40
|
+
available: compareVersions(latest, current) > 0
|
|
41
|
+
};
|
|
42
|
+
lastCheckTime = now;
|
|
43
|
+
|
|
44
|
+
if (cachedUpdateInfo.available) {
|
|
45
|
+
console.error(`[DocuKing MCP] 새 버전 ${latest} 출시! (현재: ${current})`);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return cachedUpdateInfo;
|
|
49
|
+
} catch (error) {
|
|
50
|
+
// 네트워크 오류 등은 무시 (서버 작동에 영향 없음)
|
|
51
|
+
console.error('[DocuKing MCP] 버전 체크 실패:', error.message);
|
|
52
|
+
return { available: false };
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* package.json에서 현재 버전 읽기
|
|
58
|
+
*/
|
|
59
|
+
export function getCurrentVersion() {
|
|
60
|
+
const pkgPath = join(__dirname, '..', 'package.json');
|
|
61
|
+
const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
|
|
62
|
+
return pkg.version;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* npm registry에서 최신 버전 조회
|
|
67
|
+
*/
|
|
68
|
+
async function getLatestVersion() {
|
|
69
|
+
const controller = new AbortController();
|
|
70
|
+
const timeout = setTimeout(() => controller.abort(), 5000); // 5초 타임아웃
|
|
71
|
+
|
|
72
|
+
try {
|
|
73
|
+
const response = await fetch('https://registry.npmjs.org/docuking-mcp/latest', {
|
|
74
|
+
signal: controller.signal
|
|
75
|
+
});
|
|
76
|
+
const data = await response.json();
|
|
77
|
+
return data.version;
|
|
78
|
+
} finally {
|
|
79
|
+
clearTimeout(timeout);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* 버전 비교 (semver 단순 비교)
|
|
85
|
+
* @returns 1 if a > b, -1 if a < b, 0 if equal
|
|
86
|
+
*/
|
|
87
|
+
function compareVersions(a, b) {
|
|
88
|
+
const partsA = a.split('.').map(Number);
|
|
89
|
+
const partsB = b.split('.').map(Number);
|
|
90
|
+
|
|
91
|
+
for (let i = 0; i < 3; i++) {
|
|
92
|
+
const numA = partsA[i] || 0;
|
|
93
|
+
const numB = partsB[i] || 0;
|
|
94
|
+
if (numA > numB) return 1;
|
|
95
|
+
if (numA < numB) return -1;
|
|
96
|
+
}
|
|
97
|
+
return 0;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* AI에게 보여줄 업데이트 경고 메시지 생성
|
|
102
|
+
*/
|
|
103
|
+
export function getVersionWarningMessage(updateInfo) {
|
|
104
|
+
if (!updateInfo || !updateInfo.available) return null;
|
|
105
|
+
|
|
106
|
+
return `
|
|
107
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
108
|
+
⚠️ DocuKing MCP 업데이트 필요
|
|
109
|
+
|
|
110
|
+
현재 버전: ${updateInfo.current}
|
|
111
|
+
최신 버전: ${updateInfo.latest}
|
|
112
|
+
|
|
113
|
+
업데이트 명령어:
|
|
114
|
+
npm update -g docuking-mcp
|
|
115
|
+
|
|
116
|
+
새 버전에서 버그 수정 및 기능 개선이 있습니다.
|
|
117
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
118
|
+
`;
|
|
119
|
+
}
|