@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/README.md CHANGED
@@ -23,7 +23,11 @@ npm install -g @bifos/dooray-cli
23
23
  dooray setup
24
24
  ```
25
25
 
26
- API Endpoint 선택 → API Key 입력 → 연결 테스트 → 메일 설정(선택)을 순서대로 진행합니다.
26
+ 아래 순서로 진행합니다:
27
+ 1. API Endpoint 선택
28
+ 2. API Key 입력
29
+ 3. 연결 테스트
30
+ 4. 메일 설정 (선택)
27
31
  API 토큰은 `https://{tenant}.dooray.com/setting/api/token`에서 발급할 수 있습니다.
28
32
 
29
33
  수동 설정도 가능합니다:
@@ -84,7 +88,8 @@ dooray post get <project> 42 --json # JSON 출력
84
88
  | `--id <postId>` | `dooray post get --id <postId>` |
85
89
  | `--url <url>` | `dooray post get --url https://x.dooray.com/task/to/...` |
86
90
 
87
- 대상: `post get`/`edit`/`done`/`workflow`, `post comment list`/`add`/`edit`/`delete`, `post file list`/`upload`/`download`/`download-all`/`delete`. AI 에이전트는 사용자 메시지의 Dooray URL을 그대로 첫 인자로 전달하면 가장 빠르다 (ADR-020).
91
+ 대상: `post get`/`edit`/`done`/`workflow`, `post comment list`/`add`/`edit`/`delete`, `post file list`/`upload`/`download`/`download-all`/`delete`.
92
+ AI 에이전트는 사용자 메시지의 Dooray URL을 그대로 첫 인자로 전달하면 가장 빠르다 (ADR-020).
88
93
 
89
94
  ### 업무 생성
90
95
 
@@ -107,7 +112,8 @@ dooray post create <project> \
107
112
  --milestone "Sprint 12"
108
113
  ```
109
114
 
110
- > mandatory-tag 정책 프로젝트(예: `<project>`)에서는 mandatory 그룹마다 1개 이상 `--tag`로 지정해야 한다. 누락 시 클라이언트가 사전 검증으로 후보 목록과 함께 에러 출력.
115
+ > mandatory-tag 정책 프로젝트(예: `<project>`)에서는 mandatory 그룹마다 1개 이상 `--tag`로 지정해야 한다.
116
+ > 누락 시 클라이언트가 사전 검증으로 후보 목록과 함께 에러 출력.
111
117
 
112
118
  #### 템플릿 기반 정형 task (ADR-027)
113
119
 
@@ -125,7 +131,8 @@ dooray post create <project> --template "릴리스 플랜" --title "v0.9 릴리
125
131
  dooray post create <project> --template 1234567890123456789 --title "by id"
126
132
  ```
127
133
 
128
- `interpolation=true` 가 기본 — Dooray 가 `${year}`, `${month}` 같은 시스템 매크로를 응답에서 자동 치환. 사용자 정의 변수 (`--field key=value`) 는 본 release scope 외.
134
+ `interpolation=true` 가 기본 — Dooray 가 `${year}`, `${month}` 같은 시스템 매크로를 응답에서 자동 치환.
135
+ 사용자 정의 변수 (`--field key=value`) 는 본 release scope 외.
129
136
 
130
137
  ### 업무 수정
131
138
 
@@ -142,7 +149,8 @@ dooray post edit <project> 42 --body-file ./updated.md
142
149
 
143
150
  #### 본문 변경 시 attachment 보호
144
151
 
145
- `post edit` 와 `post comment edit` 는 본문을 통째로 replace 합니다. 새 본문에 기존 inline attachment markdown(`![](/files/<id>)`)이 빠져 있으면 stderr 에 경고를 띄우고 (y/N) 로 물어봅니다.
152
+ `post edit` 와 `post comment edit` 는 본문을 통째로 replace 합니다.
153
+ 새 본문에 기존 inline attachment markdown(`![](/files/<id>)`)이 빠져 있으면 stderr 에 경고를 띄우고 (y/N) 로 물어봅니다.
146
154
 
147
155
  자동화 환경 (pipe / non-TTY) 에서는 그대로 abort 됩니다. 의도한 변경이면 `--no-confirm` 으로 다시 실행하세요.
148
156
 
@@ -198,7 +206,24 @@ dooray post create <project> --title "주간 audit" --cc-group dev-team
198
206
  ```
199
207
 
200
208
  interactive ($EDITOR) 모드에서는 위 6개 옵션이 무시되고 stderr 경고가 출력됩니다.
201
- `post edit --dry-run --json` 사용 시 출력에 `users: { to, cc }` 가 포함되어 API 호출 없이 변경 결과 미리보기 가능. (`post create --dry-run` 은 본문만 출력하며 `users` 는 포함하지 않음.)
209
+ `post edit --dry-run --json` 사용 시 출력에 `users: { to, cc }` 가 포함되어 API 호출 없이 변경 결과 미리보기 가능.
210
+ `post create --dry-run` 은 본문만 출력하며 `users` 는 포함하지 않음.
211
+
212
+ **그룹 cc / mention 사용 예 (Issue #76 fix)**:
213
+
214
+ ```bash
215
+ # code 부분일치
216
+ dooray post create <project> ... --cc-group "개발"
217
+
218
+ # code 정확 일치
219
+ dooray post create <project> ... --mention-group "all"
220
+
221
+ # 19자리 id 직접 입력 (response shape robustness 또는 code 누락 그룹 회피)
222
+ dooray post create <project> ... --cc-group "<19자리 group id>"
223
+
224
+ # 후보 탐색
225
+ dooray project groups <project>
226
+ ```
202
227
 
203
228
  ```bash
204
229
  dooray post edit <project> <post-number> --cc-group dev-team --dry-run --json | jq '.users.cc'
@@ -231,11 +256,16 @@ dooray post edit <project> <child-number> --title "<원제목>" --parent <projec
231
256
  dooray post edit --id <postId> --title "<원제목>" --parent <other-parent-postId>
232
257
  ```
233
258
 
234
- 내부적으로 `client.updatePost` 호출 후 별도 `POST .../set-parent-post` endpoint 추가 호출. **parent 해제 (top-level 화)** 는 Dooray API 가 미지원이라 웹 UI 에서 수동 처리.
259
+ 내부적으로 `client.updatePost` 호출 후 별도 `POST .../set-parent-post` endpoint 추가 호출.
260
+ **parent 해제 (top-level 화)** 는 Dooray API 가 미지원이라 웹 UI 에서 수동 처리.
235
261
 
236
- interactive ($EDITOR) 모드에서 `--parent` 사용 시 무시 + stderr 경고. **parent 만 단독 변경하려면 `--title "<원제목>"` 동반 필요** — `post edit` 가 본문 변경(`--title`/`--body`) 동반 시에만 non-interactive 분기로 들어가며, parent 변경은 그 분기 안에서만 수행됨. (Issue #60)
262
+ interactive ($EDITOR) 모드에서 `--parent` 사용 시 무시 + stderr 경고.
263
+ **parent 만 단독 변경하려면 `--title "<원제목>"` 동반 필요** — `post edit` 는 본문 변경(`--title`/`--body`) 동반 시에만 non-interactive 분기로 들어감.
264
+ parent 변경은 그 분기 안에서만 수행됨. (Issue #60)
237
265
 
238
- `--dry-run --json` 출력의 `parentChange` 필드는 **사용자 입력 원문 그대로** (`<project>/<number>` 또는 raw postId) — resolver 처리 전 미리보기 값이며 실제 호출 대상 `postId` 가 아님. dry-run 은 API 미호출 원칙을 유지해 `resolvePostRef` 도 건너뜀.
266
+ `--dry-run --json` 출력의 `parentChange` 필드는 **사용자 입력 원문 그대로** (`<project>/<number>` 또는 raw postId).
267
+ resolver 처리 전 미리보기 값이며 실제 호출 대상 `postId` 가 아님.
268
+ dry-run 은 API 미호출 원칙을 유지해 `resolvePostRef` 도 건너뜀.
239
269
 
240
270
  #### `--to` / `--cc` / `--mention` 입력 형식 (자동 분기)
241
271
 
@@ -252,7 +282,12 @@ dooray post create <project> --title "..." --cc user@example.com
252
282
  dooray post create <project> --title "..." --cc 1234567890123456789
253
283
  ```
254
284
 
255
- 분기 규칙: `^\d{15,}$` → memberId / `^[^\s@]+@[^\s@]+\.[^\s@]+$` → 이메일 / 그 외 → 이름 부분일치. `member search --email` 인프라 재사용.
285
+ 분기 규칙 (`resolveMember` 자동 판단):
286
+ - `^\d{15,}$` — memberId 직접 사용
287
+ - `^[^\s@]+@[^\s@]+\.[^\s@]+$` — 이메일, `searchMembers` exact 조회
288
+ - 그 외 — 이름 부분일치
289
+
290
+ `member search --email` 의 인프라 재사용.
256
291
 
257
292
  #### comment list 필터 옵션
258
293
 
@@ -318,6 +353,79 @@ dooray wiki page edit <project> <page-id> --body "..." | --body-file <path> #
318
353
  dooray wiki page edit <project> <page-id> # $EDITOR (플래그 없을 때)
319
354
  ```
320
355
 
356
+ #### 위키 페이지 첨부파일 (Issue #70)
357
+
358
+ post 의 `post file` 명령군과 동일 패턴 — `<project> <page-id>` 외에도 `--id`/`--url`/positional URL 지원.
359
+
360
+ ```bash
361
+ # 목록 (general 첨부 + inline image 둘 다 표시, type 컬럼)
362
+ dooray wiki page file list <project> <page-id>
363
+
364
+ # 업로드 (기본 general — 페이지 하단 첨부 영역)
365
+ dooray wiki page file upload <project> <page-id> --file ./SKILL.md
366
+ # stdout: attachFileId + 파일 메타 출력
367
+
368
+ # 인라인 이미지 업로드 (본문 markdown 은 사용자가 직접 박음)
369
+ dooray wiki page file upload <project> <page-id> --file ./diagram.png --type inline_image
370
+ # stdout 에 본문 삽입용 markdown snippet 안내
371
+
372
+ # 다운로드
373
+ dooray wiki page file download <project> <page-id> --file-id <id> -o ./
374
+
375
+ # 페이지 모든 첨부 (files + images) 일괄 다운로드
376
+ dooray wiki page file download-all <project> <page-id> -o ./attachments/
377
+
378
+ # 삭제 (confirm 없이 즉시)
379
+ dooray wiki page file delete <project> <page-id> --file-id <id>
380
+
381
+ # URL 모드 (--id 모드는 --project 동반 필요)
382
+ dooray wiki page file list "https://<tenant>.dooray.com/wiki/<wikiId>/<pageId>"
383
+ dooray wiki page file upload --id <pageId> --project <project> --file ./README.md
384
+ ```
385
+
386
+ **주의**:
387
+ - `upload` 시 multipart 필드 순서 (`type` → `file`) 가 중요.
388
+ 클라이언트가 자동으로 강제 (ADR-029 참조)
389
+ - `inline_image` 로 올린 파일은 본문에 markdown 으로 박혀야 위키에서 보임.
390
+ upload stdout 의 snippet 을 복사해서 `dooray wiki page edit` 으로 본문에 직접 추가
391
+ - `delete` 는 confirm 없이 즉시 삭제 (실수 방지 책임은 호출자)
392
+
393
+ #### 위키 페이지 댓글
394
+
395
+ post 의 `post comment` 명령군과 동일 패턴 — `<project> <page-id>` 외에도 `--id`/`--url`/positional URL 지원.
396
+
397
+ ```bash
398
+ # 목록 (최신순)
399
+ dooray wiki page comment list <project> <page-id>
400
+ dooray wiki page comment list <project> <page-id> --latest 5
401
+
402
+ # 최신 1건 shortcut
403
+ dooray wiki page comment latest <project> <page-id>
404
+
405
+ # 단일 조회
406
+ dooray wiki page comment get <project> <page-id> <comment-id>
407
+
408
+ # 추가 — interactive ($EDITOR) 또는 옵션
409
+ dooray wiki page comment add <project> <page-id> # $EDITOR
410
+ dooray wiki page comment add <project> <page-id> --body "회의 결정 사항"
411
+ dooray wiki page comment add <project> <page-id> --body-file ./note.md
412
+ echo "댓글" | dooray wiki page comment add <project> <page-id> --body -
413
+
414
+ # 수정 — interactive ($EDITOR, 기존 본문 prefill) 또는 옵션
415
+ dooray wiki page comment edit <project> <page-id> <comment-id> --body "..."
416
+
417
+ # 삭제 (confirm 없이 즉시)
418
+ dooray wiki page comment delete <project> <page-id> <comment-id>
419
+
420
+ # URL 모드
421
+ dooray wiki page comment list "https://<tenant>.dooray.com/wiki/<wikiId>/<pageId>"
422
+ ```
423
+
424
+ **post comment 와의 차이**:
425
+ - mention / cc / 받는 사람 미지원 — wiki API 부재
426
+ - 첨부 파일 미지원 — wiki comment 전용 endpoint 부재 (페이지 본문 파일은 `wiki page file` 사용)
427
+ - 본문은 markdown 그대로 전송 (mimeType 자동)
428
+
321
429
  ### 메일
322
430
 
323
431
  IMAP을 통해 Dooray 메일을 조회할 수 있습니다. 메일 설정은 `dooray setup`에서 한 번에 진행하거나, 수동으로 설정할 수 있습니다.
@@ -377,7 +485,8 @@ dooray post comment delete --url <url> --comment-id <commentId>
377
485
 
378
486
  ### 댓글 첨부 파일 (`post comment file *`)
379
487
 
380
- 자동화로 댓글에 인라인 이미지 / 파일을 삽입할 때 사용. 4 명령 (list/upload/download/delete) 모두 `<project> <post-number> <comment-id>` 또는 `--id <postId> --comment-id <logId>` / `--url <url> --comment-id <logId>` 패턴 지원 (ADR-020).
488
+ 자동화로 댓글에 인라인 이미지 / 파일을 삽입할 때 사용.
489
+ 4 명령 (list/upload/download/delete) 모두 `<project> <post-number> <comment-id>` 또는 `--id <postId> --comment-id <logId>` / `--url <url> --comment-id <logId>` 패턴 지원 (ADR-020).
381
490
 
382
491
  ```bash
383
492
  # 첨부 목록
@@ -413,7 +522,8 @@ dooray post list <project> --quiet | xargs -I{} dooray post done <project> {}
413
522
 
414
523
  ## AI 에이전트 연동
415
524
 
416
- `skills/dooray-cli/SKILL.md`에 AI 에이전트를 위한 스킬 파일이 포함되어 있습니다. Claude Code 등의 AI 에이전트에서 dooray-cli를 자동으로 활용할 수 있도록 의도→커맨드 매핑, 체이닝 예시, 에러 핸들링 가이드가 포함되어 있습니다.
525
+ `skills/dooray-cli/SKILL.md`에 AI 에이전트를 위한 스킬 파일이 포함되어 있습니다.
526
+ Claude Code 등의 AI 에이전트에서 dooray-cli를 자동으로 활용할 수 있도록 의도→커맨드 매핑, 체이닝 예시, 에러 핸들링 가이드가 포함되어 있습니다.
417
527
 
418
528
  ```bash
419
529
  # 스킬 파일 복사 (Claude Code 예시)
@@ -477,7 +587,7 @@ dooray --help
477
587
 
478
588
  ### CI (`.github/workflows/ci.yml`)
479
589
  - 트리거: `main` 으로 push, `main` 대상 PR
480
- - 동작: `pnpm install --frozen-lockfile` `pnpm test` `pnpm build` (Node 18, ubuntu-latest)
590
+ - 동작: `pnpm install --frozen-lockfile`, `pnpm test`, `pnpm build` (Node 18, ubuntu-latest)
481
591
  - 별도 secret 불필요
482
592
 
483
593
  ### Claude code review (`.github/workflows/claude-code-review.yml`)
@@ -493,11 +603,13 @@ dooray --help
493
603
 
494
604
  #### 비용 / 토큰
495
605
 
496
- 각 PR 당 4 specialist 가 모두 `haiku` 모델로 동작 — 평균 PR 1건 당 수십 센트 수준. PR 자동 트리거 비활성화하려면 `claude-code-review.yml` 의 `if:` 조건에서 `github.event_name == 'pull_request'` 분기를 제거하고 `/review` 댓글 트리거만 남길 수 있음.
606
+ 각 PR 당 4 specialist 가 모두 `haiku` 모델로 동작 — 평균 PR 1건 당 수십 센트 수준.
607
+ PR 자동 트리거 비활성화하려면 `claude-code-review.yml` 의 `if:` 조건에서 `github.event_name == 'pull_request'` 분기를 제거하고 `/review` 댓글 트리거만 남길 수 있음.
497
608
 
498
609
  #### Fork PR 제한
499
610
 
500
- GitHub Actions 정책상 fork 에서 열린 PR 은 `secrets.CLAUDE_CODE_OAUTH_TOKEN` 에 접근 못 해 **자동 리뷰가 silent 하게 skip** 된다. fork 기여자가 리뷰를 받으려면 maintainer 가 PR 댓글에 `/review` 를 작성하여 base repo 컨텍스트로 워크플로를 트리거해야 한다.
611
+ GitHub Actions 정책상 fork 에서 열린 PR 은 `secrets.CLAUDE_CODE_OAUTH_TOKEN` 에 접근 못 해 **자동 리뷰가 silent 하게 skip** 된다.
612
+ fork 기여자가 리뷰를 받으려면 maintainer 가 PR 댓글에 `/review` 를 작성하여 base repo 컨텍스트로 워크플로를 트리거해야 한다.
501
613
 
502
614
  ## 라이센스
503
615