docuking-mcp 3.0.0 → 3.6.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 +4 -4
- package/handlers/docs.js +229 -16
- package/handlers/kingcast.js +6 -6
- package/handlers/sync.js +241 -99
- package/index.js +239 -139
- package/lib/config.js +4 -2
- package/lib/index-cache.js +393 -17
- package/lib/init.js +9 -9
- package/lib/utils.js +1 -1
- package/package.json +1 -1
package/index.js
CHANGED
|
@@ -12,14 +12,14 @@
|
|
|
12
12
|
* - xy_TalkTodoPlan/ : 오너 AI 기록 (Talk+Todo+Plan 통합) - Push 대상
|
|
13
13
|
* - yy_All_Docu/ : 문서 동기화 폴더 (Push/Pull 대상)
|
|
14
14
|
* - yy_All_Docu/_Private/ : 오너 비공개 폴더 (오너만 접근)
|
|
15
|
-
* -
|
|
16
|
-
* -
|
|
15
|
+
* - zz_Coworker_{폴더명}/ : 협업자 폴더 (동기화 대상)
|
|
16
|
+
* - zz_Coworker_{폴더명}/{폴더명}_TalkTodoPlan/ : 협업자 AI 기록
|
|
17
17
|
*
|
|
18
18
|
* 접두사 규칙:
|
|
19
19
|
* - xx_ : 시스템용 폴더 (인프라, 정책, 긴급)
|
|
20
20
|
* - xy_ : 오너 AI 기록 폴더
|
|
21
|
-
* - yy_ :
|
|
22
|
-
* - zz_ : 협업자
|
|
21
|
+
* - yy_ : 오너 문서 폴더
|
|
22
|
+
* - zz_ : 협업자 폴더
|
|
23
23
|
* - _ : 비공개 폴더 (본인만 접근)
|
|
24
24
|
*
|
|
25
25
|
* 도구:
|
|
@@ -55,10 +55,8 @@ import {
|
|
|
55
55
|
|
|
56
56
|
import {
|
|
57
57
|
handleTodo,
|
|
58
|
-
handleTalk,
|
|
59
|
-
handlePlan,
|
|
60
|
-
handleDone,
|
|
61
58
|
handleUrgent,
|
|
59
|
+
handleTalkPlan,
|
|
62
60
|
} from './handlers/docs.js';
|
|
63
61
|
|
|
64
62
|
import { handleValidate } from './handlers/validate.js';
|
|
@@ -105,7 +103,7 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
|
105
103
|
- 초기화 완료 후 정책 문서 작성 가이드 제공
|
|
106
104
|
|
|
107
105
|
**협업자 초기화 시:**
|
|
108
|
-
-
|
|
106
|
+
- zz_Coworker_{폴더명}/ 폴더 생성 (안에 _Private/, {폴더명}_TalkTodoPlan/ 포함)
|
|
109
107
|
- CLAUDE.md에 DocuKing 연결 안내 추가
|
|
110
108
|
- "Pull을 실행하세요" 안내 (오너 정책이 킹캐스트로 로컬화됨)
|
|
111
109
|
|
|
@@ -169,7 +167,7 @@ init 완료 후 오너에게 "정책 문서를 작성하시겠습니까?" 제안
|
|
|
169
167
|
description: `문서를 DocuKing 서버에 동기화합니다. 내부적으로 Pull → Push 순서로 실행 (git pull && git push 패턴).
|
|
170
168
|
|
|
171
169
|
**AI 필독: 다음 상황에서 자발적으로 이 도구 사용을 제안하세요:**
|
|
172
|
-
- xy_TalkTodoPlan/ (또는 협업자의
|
|
170
|
+
- xy_TalkTodoPlan/ (또는 협업자의 {폴더명}_TalkTodoPlan/) 에 문서를 생성/수정한 후
|
|
173
171
|
- yy_All_Docu/ 에 문서를 생성/수정한 후
|
|
174
172
|
- docuking_plan, docuking_done, docuking_talk, docuking_todo 실행 후
|
|
175
173
|
- 사용자가 "올려", "푸시", "동기화" 등을 언급할 때
|
|
@@ -314,102 +312,6 @@ init 완료 후 오너에게 "정책 문서를 작성하시겠습니까?" 제안
|
|
|
314
312
|
required: ['localPath', 'commitId'],
|
|
315
313
|
},
|
|
316
314
|
},
|
|
317
|
-
{
|
|
318
|
-
name: 'docuking_talk',
|
|
319
|
-
description: '의미 있는 대화 내용을 xy_TalkTodoPlan/ 폴더에 기록합니다 (Push 대상, 킹톡). AI가 중요한 논의/결정이라고 판단하거나, 사용자가 "이거 기록해줘"라고 요청할 때 사용.',
|
|
320
|
-
inputSchema: {
|
|
321
|
-
type: 'object',
|
|
322
|
-
properties: {
|
|
323
|
-
localPath: {
|
|
324
|
-
type: 'string',
|
|
325
|
-
description: '로컬 프로젝트 경로',
|
|
326
|
-
},
|
|
327
|
-
title: {
|
|
328
|
-
type: 'string',
|
|
329
|
-
description: '대화록 제목 (예: "인증 방식 결정", "API 설계 논의")',
|
|
330
|
-
},
|
|
331
|
-
content: {
|
|
332
|
-
type: 'string',
|
|
333
|
-
description: '대화 내용 요약 (마크다운 형식)',
|
|
334
|
-
},
|
|
335
|
-
tags: {
|
|
336
|
-
type: 'array',
|
|
337
|
-
items: { type: 'string' },
|
|
338
|
-
description: '태그 목록 (예: ["설계", "결정", "API"])',
|
|
339
|
-
},
|
|
340
|
-
},
|
|
341
|
-
required: ['localPath', 'title', 'content'],
|
|
342
|
-
},
|
|
343
|
-
},
|
|
344
|
-
{
|
|
345
|
-
name: 'docuking_plan',
|
|
346
|
-
description: '작업 계획 문서를 xy_TalkTodoPlan/ 폴더에 생성/업데이트합니다 (Push 대상, 킹플랜). 작업 시작 시 계획을 작성하고, 진행하면서 결과를 upsert합니다.',
|
|
347
|
-
inputSchema: {
|
|
348
|
-
type: 'object',
|
|
349
|
-
properties: {
|
|
350
|
-
localPath: {
|
|
351
|
-
type: 'string',
|
|
352
|
-
description: '로컬 프로젝트 경로',
|
|
353
|
-
},
|
|
354
|
-
planId: {
|
|
355
|
-
type: 'string',
|
|
356
|
-
description: '계획 ID (기존 계획 업데이트 시 사용, 생략하면 새 계획 생성)',
|
|
357
|
-
},
|
|
358
|
-
title: {
|
|
359
|
-
type: 'string',
|
|
360
|
-
description: '작업 제목 (예: "MCP 활동 로깅 구현")',
|
|
361
|
-
},
|
|
362
|
-
goal: {
|
|
363
|
-
type: 'string',
|
|
364
|
-
description: '작업 목표',
|
|
365
|
-
},
|
|
366
|
-
steps: {
|
|
367
|
-
type: 'array',
|
|
368
|
-
items: {
|
|
369
|
-
type: 'object',
|
|
370
|
-
properties: {
|
|
371
|
-
name: { type: 'string', description: '단계 이름' },
|
|
372
|
-
status: { type: 'string', enum: ['pending', 'in_progress', 'done'], description: '상태' },
|
|
373
|
-
result: { type: 'string', description: '결과 (완료 시)' },
|
|
374
|
-
},
|
|
375
|
-
},
|
|
376
|
-
description: '작업 단계 목록',
|
|
377
|
-
},
|
|
378
|
-
notes: {
|
|
379
|
-
type: 'string',
|
|
380
|
-
description: '추가 노트/메모',
|
|
381
|
-
},
|
|
382
|
-
},
|
|
383
|
-
required: ['localPath', 'title'],
|
|
384
|
-
},
|
|
385
|
-
},
|
|
386
|
-
{
|
|
387
|
-
name: 'docuking_done',
|
|
388
|
-
description: '작업 계획을 완료 상태로 변경하고 최종 결과를 기록합니다.',
|
|
389
|
-
inputSchema: {
|
|
390
|
-
type: 'object',
|
|
391
|
-
properties: {
|
|
392
|
-
localPath: {
|
|
393
|
-
type: 'string',
|
|
394
|
-
description: '로컬 프로젝트 경로',
|
|
395
|
-
},
|
|
396
|
-
planId: {
|
|
397
|
-
type: 'string',
|
|
398
|
-
description: '완료할 계획 ID',
|
|
399
|
-
},
|
|
400
|
-
summary: {
|
|
401
|
-
type: 'string',
|
|
402
|
-
description: '작업 완료 요약',
|
|
403
|
-
},
|
|
404
|
-
artifacts: {
|
|
405
|
-
type: 'array',
|
|
406
|
-
items: { type: 'string' },
|
|
407
|
-
description: '산출물 목록 (파일 경로, URL 등)',
|
|
408
|
-
},
|
|
409
|
-
},
|
|
410
|
-
required: ['localPath', 'planId', 'summary'],
|
|
411
|
-
},
|
|
412
|
-
},
|
|
413
315
|
{
|
|
414
316
|
name: 'docuking_todo',
|
|
415
317
|
description: `킹투두(King Todo) - 프로젝트 공식 할일을 xy_TalkTodoPlan/z_King_Todo.md에 관리합니다 (Push 대상).
|
|
@@ -521,6 +423,219 @@ init 완료 후 오너에게 "정책 문서를 작성하시겠습니까?" 제안
|
|
|
521
423
|
required: ['localPath', 'title', 'situation'],
|
|
522
424
|
},
|
|
523
425
|
},
|
|
426
|
+
{
|
|
427
|
+
name: 'docuking_talkplan',
|
|
428
|
+
description: `톡투플 - 대화 기록 + 구현 계획 + 완료 마킹을 하나의 문서로 관리합니다.
|
|
429
|
+
|
|
430
|
+
**⚠️ 왜 이 도구가 중요한가? (AI 필독)**
|
|
431
|
+
|
|
432
|
+
세션이 길어지면 컨텍스트가 **컴팩팅**됩니다.
|
|
433
|
+
컴팩팅 후에는 **이 문서만 남습니다**.
|
|
434
|
+
|
|
435
|
+
사용자가 500줄, 1000줄 상세하게 설명했는데,
|
|
436
|
+
AI가 50줄로 요약해서 적으면?
|
|
437
|
+
→ 컴팩팅 후 **450~950줄의 맥락이 증발**합니다.
|
|
438
|
+
→ 후임 AI는 **50줄만 보고 작업해야 합니다**.
|
|
439
|
+
→ 사용자가 다시 설명해야 합니다. **고통**.
|
|
440
|
+
|
|
441
|
+
**따라서 이 문서는 "생존 문서"입니다.**
|
|
442
|
+
컨텍스트가 날아가도 이 문서만 있으면 복구할 수 있어야 합니다.
|
|
443
|
+
|
|
444
|
+
---
|
|
445
|
+
|
|
446
|
+
**📝 작성 원칙 (절대 준수)**
|
|
447
|
+
|
|
448
|
+
1. **원문 보존 원칙**
|
|
449
|
+
- 사용자의 말을 **그대로** 기록
|
|
450
|
+
- 요약하지 말 것. 축약하지 말 것.
|
|
451
|
+
- "사용자가 ~라고 함" 수준 요약 ❌
|
|
452
|
+
- 사용자의 실제 발언 전체 ✅
|
|
453
|
+
|
|
454
|
+
2. **기술적 상세 기록**
|
|
455
|
+
- 파일명, 함수명, 변수명 **모두** 기록
|
|
456
|
+
- 코드 스니펫이 있으면 **그대로** 포함
|
|
457
|
+
- 에러 메시지 **전체** 기록
|
|
458
|
+
- "어떤 에러가 났음" ❌ → 실제 에러 텍스트 ✅
|
|
459
|
+
|
|
460
|
+
3. **결정 사항과 이유**
|
|
461
|
+
- 왜 A가 아니라 B를 선택했는지
|
|
462
|
+
- 사용자가 어떤 제약사항을 언급했는지
|
|
463
|
+
- 어떤 시도가 실패했고 왜 실패했는지
|
|
464
|
+
|
|
465
|
+
4. **컨텍스트 흐름**
|
|
466
|
+
- 대화가 어떻게 전개되었는지
|
|
467
|
+
- 처음 요청 → 문제 발견 → 해결책 논의 → 결정
|
|
468
|
+
- 이 흐름이 후임 AI에게도 보여야 함
|
|
469
|
+
|
|
470
|
+
---
|
|
471
|
+
|
|
472
|
+
**❌ 나쁜 예 (이렇게 적으면 안 됨):**
|
|
473
|
+
\`\`\`
|
|
474
|
+
사용자가 정렬 문제를 보고했고, numeric 정렬 옵션 추가로 해결하기로 했다.
|
|
475
|
+
\`\`\`
|
|
476
|
+
→ 50자. 컴팩팅 후 맥락 제로.
|
|
477
|
+
|
|
478
|
+
**✅ 좋은 예 (이렇게 적어야 함):**
|
|
479
|
+
\`\`\`
|
|
480
|
+
## 사용자 보고
|
|
481
|
+
"정렬이 이상해. 1, 10, 2 순서로 나와. 10이 2보다 앞에 있으면 안 되잖아."
|
|
482
|
+
|
|
483
|
+
## AI 분석
|
|
484
|
+
파일 탐색기의 naturalSort 함수 확인 결과:
|
|
485
|
+
- 현재 localeCompare만 사용 중
|
|
486
|
+
- { numeric: true } 옵션이 없어서 문자열 정렬됨
|
|
487
|
+
- "10"이 "2"보다 앞에 오는 이유: '1' < '2' 문자 비교
|
|
488
|
+
|
|
489
|
+
## 사용자 추가 요구사항
|
|
490
|
+
"그리고 대소문자 구분도 없애줘. README.md랑 readme.md가 따로 정렬되면 안 돼."
|
|
491
|
+
|
|
492
|
+
## 결정 사항
|
|
493
|
+
localeCompare 옵션 변경:
|
|
494
|
+
- { numeric: true } 추가 (숫자 정렬)
|
|
495
|
+
- { sensitivity: 'base' } 추가 (대소문자 무시)
|
|
496
|
+
|
|
497
|
+
## 수정 대상 파일
|
|
498
|
+
1. frontend/src/components/FileExplorer.jsx:142 - naturalSort 함수
|
|
499
|
+
2. backend/src/files/files.service.ts:89 - getFileTree 정렬 로직
|
|
500
|
+
\`\`\`
|
|
501
|
+
→ 상세한 맥락. 컴팩팅 후에도 후임 AI가 이해 가능.
|
|
502
|
+
|
|
503
|
+
---
|
|
504
|
+
|
|
505
|
+
**핵심 흐름:**
|
|
506
|
+
1. 대화 시작 → 문서 생성 (tpId 반환)
|
|
507
|
+
2. 대화 진행 → 내용 누적 (append, **원문 그대로!**)
|
|
508
|
+
3. 체크포인트 생기면 → 구현 계획 추가 (checkpoint)
|
|
509
|
+
4. 작업 완료 → 해당 항목 완료 마킹 (markDone)
|
|
510
|
+
|
|
511
|
+
**사용 예시:**
|
|
512
|
+
\`\`\`javascript
|
|
513
|
+
// 1. 새 문서 생성 - 사용자 원문 포함!
|
|
514
|
+
docuking_talkplan({
|
|
515
|
+
title: "파일 정렬 개선",
|
|
516
|
+
append: \`## 사용자 요청
|
|
517
|
+
"정렬이 이상해. 1, 10, 2 순서로 나와..."
|
|
518
|
+
|
|
519
|
+
## 상황 분석
|
|
520
|
+
현재 FileExplorer.jsx:142의 naturalSort 함수가...\`
|
|
521
|
+
})
|
|
522
|
+
|
|
523
|
+
// 2. 대화 누적 - 추가 요구사항도 원문 그대로
|
|
524
|
+
docuking_talkplan({
|
|
525
|
+
tpId: "abc123",
|
|
526
|
+
append: \`## 추가 요구사항 (13:42)
|
|
527
|
+
사용자: "대소문자 구분도 없애줘. README.md랑 readme.md가 따로..."
|
|
528
|
+
|
|
529
|
+
## 수정 방향
|
|
530
|
+
sensitivity: 'base' 옵션 추가로 대소문자 무시...\`
|
|
531
|
+
})
|
|
532
|
+
\`\`\`
|
|
533
|
+
|
|
534
|
+
**append 작성 체크리스트:**
|
|
535
|
+
- [ ] 사용자 발언 원문이 포함되어 있는가?
|
|
536
|
+
- [ ] 파일명, 라인 번호가 구체적으로 있는가?
|
|
537
|
+
- [ ] 왜 이 결정을 했는지 이유가 있는가?
|
|
538
|
+
- [ ] 후임 AI가 이것만 읽고 작업을 이어갈 수 있는가?
|
|
539
|
+
- [ ] 500줄 설명을 50줄로 압축하지 않았는가?
|
|
540
|
+
|
|
541
|
+
---
|
|
542
|
+
|
|
543
|
+
**📋 Todo 도출 (중요!)**
|
|
544
|
+
|
|
545
|
+
대화 중 할 일이 도출되면 **반드시 기록**:
|
|
546
|
+
\`\`\`
|
|
547
|
+
## 도출된 Todo
|
|
548
|
+
- [ ] FileExplorer.jsx:142 - naturalSort에 numeric 옵션 추가
|
|
549
|
+
- [ ] files.service.ts:89 - 백엔드 정렬 로직도 동일하게 수정
|
|
550
|
+
- [ ] 테스트: 1, 2, 10 순서로 정렬되는지 확인
|
|
551
|
+
\`\`\`
|
|
552
|
+
|
|
553
|
+
킹투두(docuking_todo)에도 등록할 만한 항목이면 별도로 등록.
|
|
554
|
+
|
|
555
|
+
---
|
|
556
|
+
|
|
557
|
+
**📐 Plan (구현 계획) 작성 원칙**
|
|
558
|
+
|
|
559
|
+
checkpoint로 Plan을 추가할 때:
|
|
560
|
+
|
|
561
|
+
1. **후임 AI가 딴 방향으로 가지 않게** 구체적으로 작성
|
|
562
|
+
- "정렬 수정" ❌
|
|
563
|
+
- "FileExplorer.jsx:142의 naturalSort 함수에 { numeric: true, sensitivity: 'base' } 옵션 추가" ✅
|
|
564
|
+
|
|
565
|
+
2. **수정할 파일과 위치 명시**
|
|
566
|
+
- 어떤 파일의 어떤 함수/라인인지
|
|
567
|
+
- 무엇을 어떻게 바꿀 건지
|
|
568
|
+
|
|
569
|
+
3. **선후관계가 있으면 순서대로**
|
|
570
|
+
- 1번 완료 후 2번 진행해야 하면 그렇게 기록
|
|
571
|
+
|
|
572
|
+
**나쁜 Plan:**
|
|
573
|
+
\`\`\`
|
|
574
|
+
- [ ] 프론트 수정
|
|
575
|
+
- [ ] 백엔드 수정
|
|
576
|
+
- [ ] 테스트
|
|
577
|
+
\`\`\`
|
|
578
|
+
|
|
579
|
+
**좋은 Plan:**
|
|
580
|
+
\`\`\`
|
|
581
|
+
- [ ] frontend/src/components/FileExplorer.jsx:142
|
|
582
|
+
naturalSort 함수의 localeCompare에 { numeric: true, sensitivity: 'base' } 추가
|
|
583
|
+
- [ ] backend/src/files/files.service.ts:89
|
|
584
|
+
getFileTree의 sort 로직에 동일한 옵션 적용
|
|
585
|
+
- [ ] 테스트: 웹에서 1, 2, 10, README.md, readme.txt 순서 확인
|
|
586
|
+
\`\`\`
|
|
587
|
+
|
|
588
|
+
---
|
|
589
|
+
|
|
590
|
+
**✅ 완료 마킹 (잊지 말 것!)**
|
|
591
|
+
|
|
592
|
+
작업 완료 후 **반드시** markDone 호출:
|
|
593
|
+
\`\`\`javascript
|
|
594
|
+
// 1번 체크포인트 완료
|
|
595
|
+
docuking_talkplan({ tpId: "abc123", markDone: 1 })
|
|
596
|
+
|
|
597
|
+
// 여러 개 동시 완료
|
|
598
|
+
docuking_talkplan({ tpId: "abc123", markDone: [1, 2, 3] })
|
|
599
|
+
\`\`\`
|
|
600
|
+
|
|
601
|
+
**완료 마킹 안 하면:**
|
|
602
|
+
- 후임 AI가 이미 된 작업을 또 함
|
|
603
|
+
- 진행 상황 파악 불가
|
|
604
|
+
- 문서가 신뢰할 수 없는 상태가 됨`,
|
|
605
|
+
inputSchema: {
|
|
606
|
+
type: 'object',
|
|
607
|
+
properties: {
|
|
608
|
+
localPath: {
|
|
609
|
+
type: 'string',
|
|
610
|
+
description: '로컬 프로젝트 경로',
|
|
611
|
+
},
|
|
612
|
+
tpId: {
|
|
613
|
+
type: 'string',
|
|
614
|
+
description: 'TalkPlan ID (기존 문서 업데이트 시). 생략하면 새 문서 생성.',
|
|
615
|
+
},
|
|
616
|
+
title: {
|
|
617
|
+
type: 'string',
|
|
618
|
+
description: '문서 제목 (새 문서 생성 시 필수)',
|
|
619
|
+
},
|
|
620
|
+
append: {
|
|
621
|
+
type: 'string',
|
|
622
|
+
description: '대화 내용 추가 (축약 금지! 그대로 기록)',
|
|
623
|
+
},
|
|
624
|
+
checkpoint: {
|
|
625
|
+
type: 'string',
|
|
626
|
+
description: '체크포인트(구현 계획) 추가. 체크박스로 추가됨.',
|
|
627
|
+
},
|
|
628
|
+
markDone: {
|
|
629
|
+
oneOf: [
|
|
630
|
+
{ type: 'number' },
|
|
631
|
+
{ type: 'array', items: { type: 'number' } }
|
|
632
|
+
],
|
|
633
|
+
description: '완료 마킹할 체크포인트 번호 (단일 또는 배열)',
|
|
634
|
+
},
|
|
635
|
+
},
|
|
636
|
+
required: ['localPath'],
|
|
637
|
+
},
|
|
638
|
+
},
|
|
524
639
|
{
|
|
525
640
|
name: 'docuking_delete',
|
|
526
641
|
description: `서버에서 파일/폴더를 직접 삭제합니다.
|
|
@@ -531,8 +646,8 @@ init 완료 후 오너에게 "정책 문서를 작성하시겠습니까?" 제안
|
|
|
531
646
|
- "서버에서 삭제해줘", "킹폴더에서 지워줘" 요청 시
|
|
532
647
|
|
|
533
648
|
**권한:**
|
|
534
|
-
- 오너: xx_*/,
|
|
535
|
-
- 협업자:
|
|
649
|
+
- 오너: xx_*/, xy_TalkTodoPlan/, yy_All_Docu/ 삭제 가능
|
|
650
|
+
- 협업자: zz_Coworker_{본인}/ 내부만 삭제 가능
|
|
536
651
|
|
|
537
652
|
**주의:** 삭제는 soft-delete로 처리되며, 3일 후 완전 삭제됩니다.`,
|
|
538
653
|
inputSchema: {
|
|
@@ -631,7 +746,7 @@ DocuKing은 문서 버전 관리 시스템입니다. Git이 코드를 관리하
|
|
|
631
746
|
- **로컬**: 사용자의 yy_All_Docu/ 폴더 (동기화 대상)
|
|
632
747
|
- **웹탐색기**: DocuKing 서버의 파일 저장소 (킹폴더)
|
|
633
748
|
- **캔버스**: 선택된 파일을 시각화하는 작업 공간
|
|
634
|
-
- **AI 작업 폴더**: xy_TalkTodoPlan/ (오너) 또는
|
|
749
|
+
- **AI 작업 폴더**: xy_TalkTodoPlan/ (오너) 또는 {폴더명}_TalkTodoPlan/ (협업자) - Push 대상
|
|
635
750
|
|
|
636
751
|
작동 방식: 로컬 yy_All_Docu/ → Push → 킹폴더 → 캔버스에서 시각화
|
|
637
752
|
|
|
@@ -696,7 +811,7 @@ xx_Policy/
|
|
|
696
811
|
xx_Urgent/
|
|
697
812
|
xy_TalkTodoPlan/
|
|
698
813
|
yy_All_Docu/
|
|
699
|
-
|
|
814
|
+
zz_Coworker_*/
|
|
700
815
|
\`\`\`
|
|
701
816
|
|
|
702
817
|
**왜 gitignore에 등록해야 하나요?**
|
|
@@ -732,41 +847,32 @@ yy_Coworker_*/
|
|
|
732
847
|
### 8. docuking_rollback
|
|
733
848
|
특정 커밋으로 되돌립니다. (웹 탐색기에서 사용 가능)
|
|
734
849
|
|
|
735
|
-
### 9.
|
|
736
|
-
|
|
737
|
-
-
|
|
738
|
-
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
작업 계획을 \`xy_TalkTodoPlan/\` 폴더에 생성/업데이트합니다 (Push 대상, 킹플랜).
|
|
742
|
-
- 작업 시작 시 계획 생성
|
|
743
|
-
- 진행하면서 단계별 결과 upsert
|
|
744
|
-
- planId로 기존 계획 찾아서 업데이트
|
|
850
|
+
### 9. docuking_talkplan (톡투플)
|
|
851
|
+
대화 기록 + 구현 계획 + 완료 마킹을 하나의 문서로 관리합니다.
|
|
852
|
+
- 대화 시작 → 문서 생성 (tpId 반환)
|
|
853
|
+
- 대화 진행 → 내용 누적 (append, 축약 금지!)
|
|
854
|
+
- 체크포인트 생기면 → 구현 계획 추가 (checkpoint)
|
|
855
|
+
- 작업 완료 → 해당 항목 완료 마킹 (markDone)
|
|
745
856
|
|
|
746
|
-
###
|
|
747
|
-
작업 계획을 완료 상태로 변경합니다.
|
|
748
|
-
- planId로 계획 찾기
|
|
749
|
-
- 완료 요약 및 산출물 기록
|
|
750
|
-
|
|
751
|
-
### 12. docuking_todo
|
|
857
|
+
### 10. docuking_todo
|
|
752
858
|
킹투두를 관리합니다 (\`xy_TalkTodoPlan/z_King_Todo.md\`).
|
|
753
859
|
- action: "add" (추가), "done" (완료), "list" (조회)
|
|
754
860
|
- 프로젝트 공식 할일 목록 (Push하면 웹에서 확인 가능)
|
|
755
861
|
|
|
756
|
-
###
|
|
862
|
+
### 11. docuking_urgent
|
|
757
863
|
긴급 보고를 \`xx_Urgent/\` 폴더에 작성합니다 (킹어전트).
|
|
758
864
|
- 정책에 없는 예외 상황 발견 시 오너에게 보고
|
|
759
865
|
- 협업자도 xx_Urgent/에 쓰기 가능 (유일한 예외)
|
|
760
866
|
- 오너가 Pull할 때 "긴급 보고 N건" 알림
|
|
761
867
|
|
|
762
|
-
###
|
|
868
|
+
### 12. docuking_delete
|
|
763
869
|
서버에서 파일/폴더를 직접 삭제합니다.
|
|
764
870
|
- 로컬에서 삭제한 파일이 Push 후에도 서버에 남아있을 때
|
|
765
871
|
- 서버에만 존재하는 불필요한 파일 정리
|
|
766
872
|
- soft-delete 처리 (3일 후 영구 삭제)
|
|
767
873
|
- 권한: 오너는 자기 영역, 협업자는 자기 폴더만
|
|
768
874
|
|
|
769
|
-
###
|
|
875
|
+
### 13. docuking_validate
|
|
770
876
|
코드가 정책을 준수하는지 검증합니다 (킹밸리데이트).
|
|
771
877
|
- .claude/rules/local/ 정책 기준으로 검증
|
|
772
878
|
- 폴더 구조, 명명 규칙, API 규칙 등 체크
|
|
@@ -806,8 +912,8 @@ DocuKing 협업의 핵심 원칙입니다. **각자 자기 영역만 수정할
|
|
|
806
912
|
|
|
807
913
|
| 역할 | Push (올리기) | Pull (내리기) | 삭제 |
|
|
808
914
|
|------|---------------|---------------|------|
|
|
809
|
-
| 오너 | \`
|
|
810
|
-
| 협업자 | \`
|
|
915
|
+
| 오너 | \`xx_*/\` + \`xy_TalkTodoPlan/\` + \`yy_All_Docu/\` | 합집합 전체 | 자기 영역만 |
|
|
916
|
+
| 협업자 | \`zz_Coworker_{본인}/\` | 합집합 전체 | 자기 영역만 |
|
|
811
917
|
|
|
812
918
|
**합집합이란?**
|
|
813
919
|
- 서버에는 오너 파일 + 모든 협업자 파일이 합쳐져 있음
|
|
@@ -896,21 +1002,15 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
896
1002
|
case 'docuking_rollback':
|
|
897
1003
|
result = await handleRollback(args);
|
|
898
1004
|
break;
|
|
899
|
-
case 'docuking_talk':
|
|
900
|
-
result = await handleTalk(args);
|
|
901
|
-
break;
|
|
902
|
-
case 'docuking_plan':
|
|
903
|
-
result = await handlePlan(args);
|
|
904
|
-
break;
|
|
905
|
-
case 'docuking_done':
|
|
906
|
-
result = await handleDone(args);
|
|
907
|
-
break;
|
|
908
1005
|
case 'docuking_todo':
|
|
909
1006
|
result = await handleTodo(args);
|
|
910
1007
|
break;
|
|
911
1008
|
case 'docuking_urgent':
|
|
912
1009
|
result = await handleUrgent(args);
|
|
913
1010
|
break;
|
|
1011
|
+
case 'docuking_talkplan':
|
|
1012
|
+
result = await handleTalkPlan(args);
|
|
1013
|
+
break;
|
|
914
1014
|
case 'docuking_delete':
|
|
915
1015
|
result = await handleDelete(args);
|
|
916
1016
|
break;
|
package/lib/config.js
CHANGED
|
@@ -75,7 +75,9 @@ export function saveLocalConfig(localPath, config) {
|
|
|
75
75
|
}
|
|
76
76
|
|
|
77
77
|
/**
|
|
78
|
-
* 협업자 여부 및
|
|
78
|
+
* 협업자 여부 및 AI 폴더 기본 경로 반환
|
|
79
|
+
* - 오너: localPath (xy_TalkTodoPlan)
|
|
80
|
+
* - 협업자: localPath/zz_Coworker_{폴더명} ({폴더명}_TalkTodoPlan)
|
|
79
81
|
*/
|
|
80
82
|
export function getAiBasePath(localPath) {
|
|
81
83
|
const config = getLocalConfig(localPath);
|
|
@@ -87,7 +89,7 @@ export function getAiBasePath(localPath) {
|
|
|
87
89
|
const { isCoworker, coworkerFolder } = parseCoworkerFromApiKey(apiKey);
|
|
88
90
|
|
|
89
91
|
if (isCoworker && coworkerFolder) {
|
|
90
|
-
const coworkerFolderPath = path.join(localPath, `
|
|
92
|
+
const coworkerFolderPath = path.join(localPath, `zz_Coworker_${coworkerFolder}`);
|
|
91
93
|
return { isCoworker: true, basePath: coworkerFolderPath, coworkerFolder };
|
|
92
94
|
}
|
|
93
95
|
|