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 CHANGED
@@ -2,22 +2,42 @@
2
2
 
3
3
  AI가 문서를 Push/Pull 할 수 있게 해주는 MCP 서버
4
4
 
5
- ## 설치
5
+ ## 설치 (글로벌 설치 권장)
6
6
 
7
7
  ```bash
8
- npx docuking-mcp
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": "npx",
20
- "args": ["-y", "docuking-mcp"]
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": "npx",
35
- "args": ["-y", "docuking-mcp"]
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 대화록 저장 (zz_ai_Talk/) |
54
- | docuking_plan | 작업 계획 관리 (zzz_ai_Plan/) |
88
+ | docuking_talk | AI 대화록 저장 (zz_ai_1_Talk/) |
89
+ | docuking_plan | 작업 계획 관리 (zz_ai_3_Plan/) |
55
90
  | docuking_done | 작업 완료 처리 |
56
- | docuking_todo | 킹투두 관리 (zz_ai_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
- ├── yy_All_Docu/ ← 동기화 대상 (Push/Pull)
63
- ├── yy_Coworker_{이름}/ 협업자 작업 폴더 (동기화 대상)
64
- ├── zz_ai_1_Talk/ 협업자의 AI 대화록 (동기화 대상)
65
- ├── zz_ai_2_Todo/ 협업자의 AI 투두 (동기화 대상)
66
- │ └── zz_ai_3_Plan/ 협업자의 AI 플랜 (동기화 대상)
67
- ├── zz_ai_1_Talk/ 오너의 AI 대화록 (동기화 대상)
68
- ├── zz_ai_2_Todo/ 오너의 AI 투두 (동기화 대상)
69
- └── zz_ai_3_Plan/ 오너의 AI 플랜 (동기화 대상)
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
- - `yy_*`: 사람용 폴더 (동기화 대상)
74
- - `zz_ai_*`: AI용 폴더 (동기화 대상)
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
- // MCP 서버 생성
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: '1.0.0',
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
- ### MCP 설정 (전역, 한 번만)
634
- - **목적**: MCP 서버를 AI 도구(Cursor, Claude Code 등)에 등록
635
- - **설정 파일 위치**:
636
- - Cursor: \`~/.cursor/mcp.json\` (Windows: \`%USERPROFILE%\\.cursor\\mcp.json\`)
637
- - Claude Code: \`~/.claude.json\`
638
- - 기타 VSCode 계열: 각각의 설정 파일
639
- - **설정 내용**: \`docuking\` 서버를 \`mcpServers\` 객체에 추가
640
- - **재시작 필요**: MCP 설정 파일을 처음 만들었을 때만 필요 (Cursor/Claude Code 재시작)
641
- - **중요**: 이미 다른 MCP 서버가 설정되어 있으면, 기존 설정을 덮어쓰지 말고 \`docuking\` 항목만 추가해야 함
642
-
643
- ### 프로젝트 연결 (각 폴더마다)
644
- - **목적**: 특정 로컬 폴더를 DocuKing 서버의 프로젝트 ID와 연결
645
- - **실행 방법**: \`docuking_init(projectId, localPath)\` 도구 호출
646
- - **결과**: 해당 폴더에 \`yy_All_Docu/\` 폴더 생성 및 프로젝트 매핑 저장
647
- - **재시작 불필요**: MCP가 이미 작동 중이면 바로 실행 가능
648
- - **다중 프로젝트**: 한 컴퓨터에서 여러 폴더를 각각 다른 DocuKing 프로젝트와 연결 가능
649
-
650
- **핵심 원칙:**
651
- 1. MCP 설정은 한 번만 (모든 폴더 공통)
652
- 2. 프로젝트 연결은 각 폴더마다 (폴더별로 다른 프로젝트 ID)
653
- 3. 이미 MCP가 작동 중이면 재시작 없이 바로 프로젝트 연결 가능
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. docuking_delete
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
- return await handleInit(args);
873
+ result = await handleInit(args);
874
+ break;
824
875
  case 'docuking_push':
825
- return await handlePush(args);
876
+ result = await handlePush(args);
877
+ break;
826
878
  case 'docuking_pull':
827
- return await handlePull(args);
879
+ result = await handlePull(args);
880
+ break;
828
881
  case 'docuking_list':
829
- return await handleList(args);
882
+ result = await handleList(args);
883
+ break;
830
884
  case 'docuking_status':
831
- return await handleStatus(args);
885
+ result = await handleStatus(args);
886
+ break;
832
887
  case 'docuking_log':
833
- return await handleLog(args);
888
+ result = await handleLog(args);
889
+ break;
834
890
  case 'docuking_diff':
835
- return await handleDiff(args);
891
+ result = await handleDiff(args);
892
+ break;
836
893
  case 'docuking_rollback':
837
- return await handleRollback(args);
894
+ result = await handleRollback(args);
895
+ break;
838
896
  case 'docuking_talk':
839
- return await handleTalk(args);
897
+ result = await handleTalk(args);
898
+ break;
840
899
  case 'docuking_plan':
841
- return await handlePlan(args);
900
+ result = await handlePlan(args);
901
+ break;
842
902
  case 'docuking_done':
843
- return await handleDone(args);
903
+ result = await handleDone(args);
904
+ break;
844
905
  case 'docuking_todo':
845
- return await handleTodo(args);
906
+ result = await handleTodo(args);
907
+ break;
846
908
  case 'docuking_urgent':
847
- return await handleUrgent(args);
909
+ result = await handleUrgent(args);
910
+ break;
848
911
  case 'docuking_delete':
849
- return await handleDelete(args);
912
+ result = await handleDelete(args);
913
+ break;
850
914
  case 'docuking_validate':
851
- return await handleValidate(args);
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
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "docuking-mcp",
3
- "version": "2.10.0",
3
+ "version": "2.11.0",
4
4
  "description": "DocuKing MCP Server - AI 시대의 문서 협업 플랫폼",
5
5
  "type": "module",
6
6
  "main": "index.js",