@bifos/dooray-cli 0.9.0 → 0.10.1

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bifos/dooray-cli",
3
- "version": "0.9.0",
3
+ "version": "0.10.1",
4
4
  "description": "CLI tool for Dooray project management — AI agent & terminal friendly",
5
5
  "keywords": [
6
6
  "dooray",
@@ -45,7 +45,10 @@ dooray doctor # 설정 검증
45
45
 
46
46
  자연어 요청을 커맨드로 변환할 때 아래 표를 참고한다.
47
47
 
48
- > **공통 (post 하위 16개 명령)**: `post get`/`edit`/`done`/`workflow`, `post comment list`/`add`/`edit`/`delete`, `post file list`/`upload`/`download`/`download-all`/`delete`, `post comment file list`/`upload`/`download`/`delete`는 `<project> <number>` 외에도 `--id <postId>`, `--url <url>`, 또는 첫 인자에 Dooray URL(`https://*.dooray.com/task/to/<postId>` 또는 브라우저 주소창 복사본 `https://*.dooray.com/task/<projectId>/<postId>`)을 직접 받는다. **사용자가 URL을 줬으면 그대로 첫 인자로 전달**하는 것이 가장 빠른 경로 (resolve 단계 단축, ADR-020).
48
+ > **공통 (post 하위 16개 명령)**: 아래 명령은 `<project> <number>` 외에도 `--id <postId>`, `--url <url>`, 또는 첫 인자에 Dooray URL 을 직접 받는다.
49
+ > `post get`/`edit`/`done`/`workflow`, `post comment list`/`add`/`edit`/`delete`, `post file list`/`upload`/`download`/`download-all`/`delete`, `post comment file list`/`upload`/`download`/`delete`.
50
+ > URL 형식: `https://*.dooray.com/task/to/<postId>` 또는 브라우저 주소창 복사본 `https://*.dooray.com/task/<projectId>/<postId>`.
51
+ > **사용자가 URL을 줬으면 그대로 첫 인자로 전달**하는 것이 가장 빠른 경로 (resolve 단계 단축, ADR-020).
49
52
 
50
53
  | 의도 | 커맨드 |
51
54
  |------|--------|
@@ -61,14 +64,14 @@ dooray doctor # 설정 검증
61
64
  | 업무 목록 조회 | `dooray post list <project>` |
62
65
  | 업무 검색 | `dooray post search <project> "<keyword>"` |
63
66
  | 업무 상세 보기 | `dooray post get <project> <number>` |
64
- | 업무 생성 | `dooray post create <project> --title "..." --body "..."` 또는 `--body-file <path>` (`--body`와 `--body-file`은 동시 사용 불가, `--tag`/`--parent`/`--workflow`/`--milestone` 지원) |
67
+ | 업무 생성 | `dooray post create <project> --title "..." [--body "..." \| --body-file <path>]` (`--tag`/`--parent`/`--workflow`/`--milestone` 지원) |
65
68
  | 템플릿 기반 업무 생성 | `dooray post create <project> --template <name\|id>` — body/users/tags 자동 채움 (사용자 옵션 우선 override, ADR-027) |
66
69
  | 업무 제목/본문 수정 | `dooray post edit <project> <number> --title "..." --body "..."` 또는 `--body-file <path>` |
67
70
  | 업무 완료 처리 | `dooray post done <project> <number>` |
68
71
  | 업무 워크플로우 변경 | `dooray post workflow <project> <number> <workflow>` |
69
- | 댓글 조회 | `dooray post comment list <project> <number>` `--sort asc\|desc`, `--reverse`, `--latest <n>`, `--since <iso>`, `--from-author <name>` 필터 지원. table 출력은 Creator 이름 자동 채움, `--json`은 raw 유지 (ADR-021) |
72
+ | 댓글 조회 | `dooray post comment list <project> <number>` (`--sort`, `--reverse`, `--latest`, `--since`, `--from-author` 필터. table: Creator 자동 채움, `--json`: raw, ADR-021) |
70
73
  | 최신 댓글 조회 | `dooray post comment latest <project> <number>` — 최신 댓글 1개 빠른 조회. `-n <N>`으로 N개 지정 |
71
- | 단일 댓글 조회 | `dooray post comment get <project> <number> <comment-id> --json` 단일 댓글 본문·메타·attachments 직접 fetch. `comment list` 후 jq 필터 우회 불필요. `--id <postId> --comment-id <id>` / `--url <url> --comment-id <id>` 모드 지원 |
74
+ | 단일 댓글 조회 | `dooray post comment get <project> <number> <comment-id>` — 본문·메타·attachments 직접 fetch. `--id`/`--url` + `--comment-id` 모드 지원 |
72
75
  | 댓글 추가 | `dooray post comment add <project> <number> --body "..."` 또는 `--body-file <path>` |
73
76
  | 댓글 수정 | `dooray post comment edit <project> <number> <comment-id> --body "..."` 또는 `--body-file <path>` |
74
77
  | 댓글 삭제 | `dooray post comment delete <project> <number> <comment-id>` |
@@ -79,6 +82,17 @@ dooray doctor # 설정 검증
79
82
  | 위키 페이지 수정 (제목) | `dooray wiki page edit <project> <page-id> --title "..."` |
80
83
  | 위키 페이지 수정 (본문) | `dooray wiki page edit <project> <page-id> --body "..."` 또는 `--body-file ./new.md` |
81
84
  | 위키 페이지 수정 (에디터) | `dooray wiki page edit <project> <page-id>` (플래그 없으면 $EDITOR 열림) |
85
+ | 위키 페이지 첨부 목록 | `dooray wiki page file list <project> <page-id>` (general + inline 합산, type 컬럼) |
86
+ | 위키 페이지 첨부 업로드 | `dooray wiki page file upload <project> <page-id> --file <path> [--type inline_image]` (multipart type 순서 ADR-029) |
87
+ | 위키 페이지 첨부 다운로드 | `dooray wiki page file download <project> <page-id> --file-id <id> -o <dir>` |
88
+ | 위키 페이지 첨부 일괄 다운로드 | `dooray wiki page file download-all <project> <page-id> -o <dir>` (files + images 전부) |
89
+ | 위키 페이지 첨부 삭제 | `dooray wiki page file delete <project> <page-id> --file-id <id>` (confirm 없음) |
90
+ | 위키 페이지 댓글 목록 | `dooray wiki page comment list <project> <page-id> [--latest N]` (최신순) |
91
+ | 위키 페이지 최신 댓글 | `dooray wiki page comment latest <project> <page-id>` |
92
+ | 위키 페이지 댓글 조회 | `dooray wiki page comment get <project> <page-id> <comment-id>` |
93
+ | 위키 페이지 댓글 추가 | `dooray wiki page comment add <project> <page-id> --body "..."` ($EDITOR fallback) |
94
+ | 위키 페이지 댓글 수정 | `dooray wiki page comment edit <project> <page-id> <comment-id> --body "..."` |
95
+ | 위키 페이지 댓글 삭제 | `dooray wiki page comment delete <project> <page-id> <comment-id>` (confirm 없음) |
82
96
  | 메일 목록 조회 | `dooray mail list` |
83
97
  | 안읽은 메일 | `dooray mail list --unread` |
84
98
  | 메일 제목 검색 | `dooray mail list --search "<keyword>"` |
@@ -97,7 +111,8 @@ dooray doctor # 설정 검증
97
111
  | 참조자(cc) 멤버/그룹 추가 | `dooray post edit <project> <number> --cc-group <code>` — 기존 참조자 유지 + 그룹 추가 (dedupe, ADR-025) |
98
112
  | 참조자 전체 교체 | `dooray post edit <project> <number> --cc-clear --cc <name>` — 기존 참조자 비우고 신규 멤버만 |
99
113
  | 신규 업무 + 그룹 cc | `dooray post create <project> --title "..." --cc-group <code>` — 생성 시 그룹 참조자 포함 |
100
- | 상위 업무 설정/변경 | `dooray post edit <project> <number> --title "<원제목>" --parent <ref>` `<ref>` `<project>/<number>` 또는 raw postId. `--title` 미동반 interactive 모드로 진입해 무시. unset 미지원 (Issue #60) |
114
+ | `--cc-group <code\|id>` / `--mention-group <code\|id>` | 그룹 매칭 15+자리 numeric id 직접 / code matchByName (부분일치, ADR-028) |
115
+ | 상위 업무 설정/변경 | `dooray post edit <project> <number> --title "<원제목>" --parent <ref>` (`<ref>`: `<project>/<number>` 또는 raw postId. `--title` 필수, unset 미지원) |
101
116
  | `dooray post edit --id <postId> --tag <name>` | 태그 추가 (반복, dedupe) |
102
117
  | `dooray post edit --id <postId> --tag-clear --tag <name>` | 태그 전체 교체 |
103
118
  | `dooray post edit --id <postId> --tag-remove <name>` | 특정 태그 제거 |
@@ -112,7 +127,7 @@ CLI로 처리 **불가능한** 작업. 아래 항목을 요청받으면 웹 UI
112
127
 
113
128
  | 작업 | 대체 경로 | 근거 |
114
129
  |---|---|---|
115
- | 위키 페이지 **삭제** | 웹 UI (`https://{tenant}.dooray.com/wiki/...`) | Dooray REST API 해당 엔드포인트 없음 (위키 댓글·첨부파일 삭제는 있지만 페이지 자체는 없음 — ADR 또는 Dooray 공식 API 문서 미제공) |
130
+ | 위키 페이지 **삭제** | 웹 UI (`https://{tenant}.dooray.com/wiki/...`) | Dooray REST API 미제공 (댓글·첨부파일 삭제는 있지만 페이지 삭제 endpoint 없음) |
116
131
  | 프로젝트 삭제 | 웹 UI (admin 페이지) | API 미지원 |
117
132
 
118
133
  위키 페이지를 잘못 만든 경우(테스트/중복) **soft delete(빈 제목·본문) 우회 금지** — 페이지가 트리에 남아 사용자 혼란 유발.
@@ -170,7 +185,8 @@ dooray post comment add <project> 42 --body "진행 상황 업데이트: 80% 완
170
185
 
171
186
  ### 시나리오 — 댓글에 스크린샷 자동 첨부
172
187
 
173
- 스크립트가 스크린샷을 댓글에 삽입하거나, 에이전트가 결과 파일을 첨부 댓글로 보고할 때 사용. Dooray REST API 가 댓글 전용 attachment endpoint 를 미지원하므로 내부적으로 post-level files API + 댓글 본문 PUT 합성으로 동작 (ADR-024).
188
+ 스크립트가 스크린샷을 댓글에 삽입하거나, 에이전트가 결과 파일을 첨부 댓글로 보고할 때 사용.
189
+ Dooray REST API 가 댓글 전용 attachment endpoint 를 미지원하므로 내부적으로 post-level files API + 댓글 본문 PUT 합성으로 동작 (ADR-024).
174
190
 
175
191
  ```bash
176
192
  # 1. 댓글을 먼저 만든다 (텍스트만, --json 으로 commentId 획득)
@@ -191,6 +207,36 @@ dooray wiki pages <project> --json
191
207
  dooray wiki page get <project> <pageId> --json
192
208
  ```
193
209
 
210
+ ### 위키 페이지 첨부파일 — 스킬 파일 팀 공유 (Issue #70)
211
+
212
+ **스킬 파일 팀 공유**: 팀 위키에 스킬 파일 (예: `SKILL.md`) 을 `wiki page file upload` 로 첨부 → 팀원이 `wiki page file download-all` 로 일괄 받아 `~/.claude/skills/` 에 그대로 설치.
213
+
214
+ ```bash
215
+ # 업로드 (일반 첨부)
216
+ dooray wiki page file upload <project> <page-id> --file ~/.claude/skills/my-skill/SKILL.md
217
+
218
+ # 팀원 쪽에서 일괄 다운로드
219
+ dooray wiki page file download-all <project> <page-id> -o ~/.claude/skills/my-skill/
220
+
221
+ # 첨부 목록 확인 (type 컬럼: general / inline_image)
222
+ dooray wiki page file list <project> <page-id>
223
+ ```
224
+
225
+ ### 위키 페이지 댓글 — 회의록 결정사항 자동 누적
226
+
227
+ **회의록 결정사항 자동 누적**: 회의록 위키 페이지에 자동화 봇이 `wiki page comment add` 로 결정사항을 댓글로 누적, `wiki page comment list --latest 20` 으로 최근 토론 흐름 추적.
228
+
229
+ ```bash
230
+ # 결정사항 댓글 추가
231
+ dooray wiki page comment add <project> <page-id> --body "결정: 배포일 2026-06-01 확정"
232
+
233
+ # 최근 20개 토론 흐름 조회
234
+ dooray wiki page comment list <project> <page-id> --latest 20
235
+
236
+ # 최신 댓글 1건 shortcut
237
+ dooray wiki page comment latest <project> <page-id>
238
+ ```
239
+
194
240
  ## 단일 댓글 본문 fetch
195
241
 
196
242
  `post comment get <project> <post-number> <comment-id> --json` 으로 단일 댓글의 본문 + attachments 를 곧장 fetch. `comment list` 후 jq 필터링 우회 불필요.
@@ -218,7 +264,8 @@ dooray wiki page get <project> <pageId> --json
218
264
 
219
265
  ### 업무 식별 방식 (post 하위 16개 명령 공통, ADR-020)
220
266
 
221
- `post get`/`edit`/`done`/`workflow`, `post comment list`/`add`/`edit`/`delete`, `post file list`/`upload`/`download`/`download-all`/`delete`, `post comment file list`/`upload`/`download`/`delete`는 4가지 입력을 모두 받는다:
267
+ 아래 16개 명령은 4가지 입력을 모두 받는다:
268
+ `post get`/`edit`/`done`/`workflow`, `post comment list`/`add`/`edit`/`delete`, `post file list`/`upload`/`download`/`download-all`/`delete`, `post comment file list`/`upload`/`download`/`delete`.
222
269
 
223
270
  ```bash
224
271
  # (1) 기존 positional — 가장 익숙한 형태
@@ -234,7 +281,9 @@ dooray post get --id <postId>
234
281
  dooray post get --url https://x.dooray.com/task/to/<postId>
235
282
  ```
236
283
 
237
- **우선순위 / 충돌 규칙**: `--id`+`--url` 동시 지정 → 에러. `--id`/`--url`+positional 동시 지정 → 에러. URL/`--id`/`--url` 모드는 standalone API(`getPost(postId)`)로 resolve 단계를 단축.
284
+ **우선순위 / 충돌 규칙**: `--id`+`--url` 동시 지정 → 에러.
285
+ `--id`/`--url`+positional 동시 지정 → 에러.
286
+ URL/`--id`/`--url` 모드는 standalone API(`getPost(postId)`)로 resolve 단계를 단축.
238
287
 
239
288
  **sub-id 옵션화** (URL/`--id`/`--url` 모드에서 필수):
240
289
  ```bash
@@ -273,7 +322,9 @@ dooray post create <project> \
273
322
  dooray post create <project> --title "제목" --body-file ./content.md
274
323
  ```
275
324
 
276
- > **`--workflow` 동작 주의**: 워크플로우 설정은 post 생성 *후속* 호출이므로, 워크플로우 resolve/설정에 실패해도 stderr 경고만 출력되고 **exit code는 0** (post는 이미 생성됨). 자동화 스크립트에서 워크플로우 적용 여부를 보장해야 하면 stderr를 별도 점검할 것.
325
+ > **`--workflow` 동작 주의**: 워크플로우 설정은 post 생성 *후속* 호출.
326
+ > resolve/설정에 실패해도 stderr 경고만 출력되고 **exit code는 0** (post는 이미 생성됨).
327
+ > 자동화 스크립트에서 워크플로우 적용 여부를 보장해야 하면 stderr를 별도 점검할 것.
277
328
 
278
329
  ### 업무 수정 (non-interactive)
279
330
 
@@ -323,11 +374,17 @@ MEMBER_ID=$(dooray member search 홍길동 --json | jq -r '.[] | select(.externa
323
374
  dooray post edit --id "$POST_ID" --cc "$MEMBER_ID"
324
375
  ```
325
376
 
326
- `--to` / `--mention` 동일 분기 (resolveMember 인프라). 분기 규칙: `^\d{15,}$` → memberId / 이메일 정규형 → searchMembers exact / 그 외 → 이름 부분일치.
377
+ `--to` / `--mention` 동일 분기 (resolveMember 인프라). 분기 규칙:
378
+ - `^\d{15,}$` — memberId 직접 사용
379
+ - 이메일 정규형 — searchMembers exact
380
+ - 그 외 — 이름 부분일치
327
381
 
328
382
  ## 신규 업무 생성 후 그룹 cc 첨부 (ADR-025)
329
383
 
330
- audit 리포트 분석 → 신규 업무 생성 → 후속으로 특정 그룹을 참조에 추가하는 자동화 패턴:
384
+ 자동화 패턴:
385
+ 1. audit 리포트 분석
386
+ 2. 신규 업무 생성
387
+ 3. 후속으로 특정 그룹을 참조에 추가
331
388
 
332
389
  ```bash
333
390
  # 1. 신규 업무 생성 (그룹 cc 포함)
@@ -395,6 +452,35 @@ dooray post comment latest <project> <number>
395
452
 
396
453
  ---
397
454
 
455
+ ## 그룹 멘션 / cc 시 AI agent 동선 (Issue #76, ADR-028)
456
+
457
+ 자연어 그룹명을 사용자가 지칭했을 때 AI agent 의 의사결정 순서:
458
+
459
+ 1. **사용자가 명확한 code 를 줬으면 바로 시도**
460
+ ```bash
461
+ dooray post create <project> --mention-group "<code>"
462
+ ```
463
+ 부분일치 가능 (예: "AI-Data" → "AI-Data파트" 매칭).
464
+
465
+ 2. **부분일치 모호 / 매칭 실패 시 후보 탐색**
466
+ ```bash
467
+ dooray project groups <project>
468
+ ```
469
+ ID + Code 표 출력.
470
+ AI agent 가 자연어 의도와 가장 가까운 code 선택 후 재시도.
471
+
472
+ 3. **모든 컬럼이 빈값일 때 (response shape 이상) 회피**
473
+ - ADR-028 fix 이후 거의 발생 안 함 (`fetchAllMemberGroups` 가 nested array 정규화)
474
+ - 만약 발생 시: 사용자에게 그룹 id (UI 의 그룹 URL 에서 19자리 numeric) 확인 요청
475
+ - `--cc-group <id>` / `--mention-group <id>` 직접 입력
476
+ - 또는 그룹 멤버를 개별 `--cc <member>` / `--mention <member>` 로 지정
477
+
478
+ 4. **모호한 자연어 매핑은 사용자에게 확인**
479
+ - 후보가 여러 개일 때 임의 선택 금지 — 사용자에게 선택지 제시
480
+ - 예: "AI-Data파트 / AI-Data실험팀 — 어느 그룹인가요?"
481
+
482
+ 순서 고정 — 멤버 먼저, 그룹 다음 (기존 정책 유지).
483
+
398
484
  ## 멘션·링크 자동 삽입 (first-class)
399
485
 
400
486
  `post create`, `post edit`, `post comment add`, `post comment edit` 모두 지원:
@@ -415,7 +501,8 @@ dooray post comment add P 1 --mention 홍길동 --mention-group 개발 --body ".
415
501
 
416
502
  ## Dooray 마크다운 링크 형식 (멤버·그룹·업무 멘션)
417
503
 
418
- 댓글/본문 작성 시 다음 형식으로 마크업하면 Dooray 앱이 인식해 inline 멘션·navigation으로 렌더링한다. ID는 본인 환경 값으로 채워 사용 — `dooray member get` / `project groups` / `post get` 등으로 조회.
504
+ 댓글/본문 작성 시 다음 형식으로 마크업하면 Dooray 앱이 인식해 inline 멘션·navigation으로 렌더링한다.
505
+ ID는 본인 환경 값으로 채워 사용 — `dooray member get` / `project groups` / `post get` 등으로 조회.
419
506
 
420
507
  ### 멤버 멘션
421
508
  ```markdown
@@ -467,7 +554,8 @@ dooray feedback --last --title "에러 제목" --body "추가 설명" --dry-run
467
554
  dooray feedback --last --title "에러 제목" --body "추가 설명" # 실제 등록
468
555
  ```
469
556
 
470
- > **참고**: `--last` 모드는 `trackLastRun: true` (ADR-023 opt-in)가 설정된 경우에만 직전 실패 명령이 자동 기록됨. argv는 시크릿 패턴(`--api-key`/`--token`/`Authorization`) 마스킹 후 저장.
557
+ > **참고**: `--last` 모드는 `trackLastRun: true` (ADR-023 opt-in)가 설정된 경우에만 직전 실패 명령이 자동 기록됨.
558
+ > argv는 시크릿 패턴(`--api-key`/`--token`/`Authorization`) 마스킹 후 저장.
471
559
 
472
560
  ## 에러 핸들링
473
561
 
@@ -496,7 +584,8 @@ POST_ID=$(dooray post create <project> \
496
584
  --json | jq -r '.id')
497
585
  ```
498
586
 
499
- 템플릿 본문의 `${year}` / `${month}` 등 매크로는 Dooray 가 자동 치환 (`interpolation=true` 기본). 사용자 정의 변수는 미지원 — 필요 시 client 측 string replace 로 처리.
587
+ 템플릿 본문의 `${year}` / `${month}` 등 매크로는 Dooray 가 자동 치환 (`interpolation=true` 기본).
588
+ 사용자 정의 변수는 미지원 — 필요 시 client 측 string replace 로 처리.
500
589
 
501
590
  ## 캐시
502
591