@bifos/dooray-cli 0.5.4 → 0.7.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
@@ -1,5 +1,10 @@
1
1
  # dooray-cli
2
2
 
3
+ [![npm version](https://img.shields.io/npm/v/@bifos/dooray-cli.svg)](https://www.npmjs.com/package/@bifos/dooray-cli)
4
+ [![npm downloads](https://img.shields.io/npm/dm/@bifos/dooray-cli.svg)](https://www.npmjs.com/package/@bifos/dooray-cli)
5
+ [![CI](https://github.com/jon890/dooray-cli/actions/workflows/ci.yml/badge.svg)](https://github.com/jon890/dooray-cli/actions/workflows/ci.yml)
6
+ [![license](https://img.shields.io/npm/l/@bifos/dooray-cli.svg)](https://github.com/jon890/dooray-cli/blob/main/LICENSE)
7
+
3
8
  NHN Dooray REST API를 래핑한 CLI 도구입니다. 터미널과 AI 에이전트 환경에서 Dooray 업무를 관리할 수 있습니다.
4
9
 
5
10
  > A CLI tool wrapping the NHN Dooray REST API. Manage Dooray tasks from your terminal or AI agent workflows.
@@ -37,10 +42,10 @@ dooray doctor
37
42
  dooray project list # 프로젝트 목록 (기본: public)
38
43
  dooray project list --search ocr # 코드로 검색
39
44
  dooray project list --type private # 개인 프로젝트 목록
40
- dooray project members tc-ocr # 멤버 목록
41
- dooray project workflows tc-ocr # 워크플로우 목록
42
- dooray project groups tc-ocr # 멤버 그룹 목록 (ID / Code)
43
- dooray project tags tc-ocr # 태그 목록 (ID / Color / Name / Group / Mandatory)
45
+ dooray project members <project> # 멤버 목록
46
+ dooray project workflows <project> # 워크플로우 목록
47
+ dooray project groups <project> # 멤버 그룹 목록 (ID / Code)
48
+ dooray project tags <project> # 태그 목록 (ID / Color / Name / Group / Mandatory)
44
49
  ```
45
50
 
46
51
  > **태그 캐시 갱신**: 이전 버전에서 캐시한 태그가 색상 없이 표시되면 `dooray cache clear` 실행 후 다시 조회하세요.
@@ -48,26 +53,34 @@ dooray project tags tc-ocr # 태그 목록 (ID / Color / Name / G
48
53
  ### 멤버
49
54
 
50
55
  ```bash
51
- dooray member list tc-ocr # 프로젝트 멤버 목록 (이름·organizationMemberId)
52
- dooray member get <organizationMemberId> # 멤버 상세 (cache 우회, ADR-021)
56
+ dooray member list <project> # 프로젝트 멤버 목록 (이름·organizationMemberId)
57
+ dooray member get <organizationMemberId> # 멤버 상세 (cache 우회, ADR-021)
58
+
59
+ # organization 전체 멤버 검색
60
+ dooray member search 홍길동 # 이름 검색
61
+ dooray member search --email user@example.com # 이메일 (정확히 일치)
62
+ dooray member search --user-code abc # 사번 like 검색
63
+ dooray member search --user-code-exact abc123 # 사번 exact match
64
+ dooray member search 김 --size 50 --page 1 # 페이지네이션
53
65
  ```
54
66
 
55
67
  ### 업무
56
68
 
57
69
  ```bash
58
- dooray post list tc-ocr # 업무 목록 (최신순)
59
- dooray post search tc-ocr "키워드" # 제목 검색
60
- dooray post get tc-ocr 42 # 업무 상세
61
- dooray post get tc-ocr 42 --json # JSON 출력
70
+ dooray post list <project> # 업무 목록 (최신순)
71
+ dooray post search <project> "키워드" # 제목 검색
72
+ dooray post get <project> 42 # 업무 상세
73
+ dooray post get <project> 42 --json # JSON 출력
62
74
  ```
63
75
 
64
- #### 업무 식별 방식 (post 하위 12개 명령 공통)
76
+ #### 업무 식별 방식 (post 하위 16개 명령 공통)
65
77
 
66
78
  | 방식 | 예시 |
67
79
  |---|---|
68
- | `<project> <number>` | `dooray post get tc-ocr 42` |
69
- | Dooray URL positional | `dooray post get https://x.dooray.com/task/to/4319587406666362045` |
70
- | `--id <postId>` | `dooray post get --id 4319587406666362045` |
80
+ | `<project> <number>` | `dooray post get <project> 42` |
81
+ | Dooray URL positional (`/task/to/<postId>`) | `dooray post get https://x.dooray.com/task/to/<postId>` |
82
+ | Dooray URL positional (브라우저 주소창 복사본) | `dooray post get https://x.dooray.com/task/<projectId>/<postId>` |
83
+ | `--id <postId>` | `dooray post get --id <postId>` |
71
84
  | `--url <url>` | `dooray post get --url https://x.dooray.com/task/to/...` |
72
85
 
73
86
  대상: `post get`/`edit`/`done`/`workflow`, `post comment list`/`add`/`edit`/`delete`, `post file list`/`upload`/`download`/`download-all`/`delete`. AI 에이전트는 사용자 메시지의 Dooray URL을 그대로 첫 인자로 전달하면 가장 빠르다 (ADR-020).
@@ -75,65 +88,97 @@ dooray post get tc-ocr 42 --json # JSON 출력
75
88
  ### 업무 생성
76
89
 
77
90
  ```bash
78
- dooray post create tc-ocr \
91
+ dooray post create <project> \
79
92
  --title "업무 제목" \
80
93
  --body "본문 마크다운" \
81
94
  --to "담당자이름" \
82
95
  --priority normal
83
96
 
84
97
  # 본문을 파일에서 읽기 (--body와 --body-file은 동시 사용 불가)
85
- dooray post create tc-ocr --title "업무 제목" --body-file ./content.md
98
+ dooray post create <project> --title "업무 제목" --body-file ./content.md
86
99
 
87
100
  # 메타 옵션: --tag(반복) / --parent / --workflow / --milestone
88
- dooray post create tc-ocr \
101
+ dooray post create <project> \
89
102
  --title "업무 제목" --body "본문" --to "담당자이름" \
90
103
  --tag "버그" --tag "긴급" \
91
- --parent "tc-ocr/337" \
104
+ --parent "<project>/337" \
92
105
  --workflow "진행 중" \
93
106
  --milestone "Sprint 12"
94
107
  ```
95
108
 
96
- > mandatory-tag 정책 프로젝트(예: `tc-ocr`)에서는 mandatory 그룹마다 1개 이상 `--tag`로 지정해야 한다. 누락 시 클라이언트가 사전 검증으로 후보 목록과 함께 에러 출력.
109
+ > mandatory-tag 정책 프로젝트(예: `<project>`)에서는 mandatory 그룹마다 1개 이상 `--tag`로 지정해야 한다. 누락 시 클라이언트가 사전 검증으로 후보 목록과 함께 에러 출력.
97
110
 
98
111
  ### 업무 수정
99
112
 
100
113
  ```bash
101
114
  # 대화형 ($EDITOR)
102
- dooray post edit tc-ocr 42
115
+ dooray post edit <project> 42
103
116
 
104
117
  # 비대화형 (AI 에이전트 친화)
105
- dooray post edit tc-ocr 42 --title "새 제목" --body "새 본문"
118
+ dooray post edit <project> 42 --title "새 제목" --body "새 본문"
106
119
 
107
120
  # 본문을 파일에서 읽기
108
- dooray post edit tc-ocr 42 --body-file ./updated.md
121
+ dooray post edit <project> 42 --body-file ./updated.md
122
+ ```
123
+
124
+ #### 본문 변경 시 attachment 보호
125
+
126
+ `post edit` 와 `post comment edit` 는 본문을 통째로 replace 합니다. 새 본문에 기존 inline attachment markdown(`![](/files/<id>)`)이 빠져 있으면 stderr 에 경고를 띄우고 (y/N) 로 물어봅니다.
127
+
128
+ 자동화 환경 (pipe / non-TTY) 에서는 그대로 abort 됩니다. 의도한 변경이면 `--no-confirm` 으로 다시 실행하세요.
129
+
130
+ ```bash
131
+ echo "new body" | dooray post comment edit <project> <post-number> <comment-id> --body - --no-confirm
109
132
  ```
110
133
 
111
134
  ### 댓글
112
135
 
113
136
  ```bash
114
- dooray post comment list tc-ocr 42
115
- dooray post comment add tc-ocr 42 --body "댓글 내용"
116
- dooray post comment add tc-ocr 42 --body-file ./comment.md
137
+ dooray post comment list <project> 42
138
+ dooray post comment add <project> 42 --body "댓글 내용"
139
+ dooray post comment add <project> 42 --body-file ./comment.md
117
140
  ```
118
141
 
119
142
  > table 출력의 Creator 컬럼은 프로젝트 멤버 캐시로 자동 enrich되며, `--json`은 raw 응답을 유지한다 (ADR-021).
120
143
 
144
+ #### 멘션·내부 링크 자동 삽입
145
+
146
+ ```bash
147
+ # 댓글에 멤버·그룹 멘션
148
+ dooray post comment add <project> <post-number> \
149
+ --body "주간 리포트 첨부" \
150
+ --mention "홍길동" \
151
+ --mention-group <project>/dev
152
+
153
+ # 본문에 다른 업무 링크 append
154
+ dooray post create <project> \
155
+ --title "이번 주 작업" \
156
+ --body "관련 이슈" \
157
+ --link-task <project>/470
158
+
159
+ # 송신 전 합성 결과 미리보기
160
+ dooray post comment add <project> <post-number> --body "..." --link-task <project>/470 --dry-run
161
+ ```
162
+
163
+ > `--mention` / `--mention-group` / `--link-task` / `--dry-run` 은 `post create`, `post edit`, `post comment add`, `post comment edit` 4 명령 모두 지원.
164
+ > 이전 버전 캐시는 orgId가 없으므로 첫 호출 시 자동 갱신됩니다 (또는 `dooray cache clear`).
165
+
121
166
  #### comment list 필터 옵션
122
167
 
123
168
  ```bash
124
169
  # 최신 5개 (desc 정렬)
125
- dooray post comment list tc-ocr 42 --latest 5
170
+ dooray post comment list <project> 42 --latest 5
126
171
 
127
172
  # 특정 시간 이후 댓글만
128
- dooray post comment list tc-ocr 42 --since 2026-04-27
173
+ dooray post comment list <project> 42 --since 2026-04-27
129
174
 
130
175
  # 작성자 이름으로 필터 (부분일치)
131
- dooray post comment list tc-ocr 42 --from-author 홍길동
176
+ dooray post comment list <project> 42 --from-author 홍길동
132
177
 
133
178
  # 오름차순 / 내림차순 정렬
134
- dooray post comment list tc-ocr 42 --sort asc
135
- dooray post comment list tc-ocr 42 --sort desc
136
- dooray post comment list tc-ocr 42 --reverse # --sort desc alias
179
+ dooray post comment list <project> 42 --sort asc
180
+ dooray post comment list <project> 42 --sort desc
181
+ dooray post comment list <project> 42 --reverse # --sort desc alias
137
182
  ```
138
183
 
139
184
  #### comment latest
@@ -142,32 +187,44 @@ dooray post comment list tc-ocr 42 --reverse # --sort desc alias
142
187
 
143
188
  ```bash
144
189
  # 최신 댓글 1개
145
- dooray post comment latest tc-ocr 42
190
+ dooray post comment latest <project> 42
146
191
 
147
192
  # 최신 3개
148
- dooray post comment latest tc-ocr 42 -n 3
193
+ dooray post comment latest <project> 42 -n 3
149
194
 
150
195
  # URL로도 가능
151
196
  dooray post comment latest --url <dooray-url>
152
197
  ```
153
198
 
199
+ #### comment get
200
+
201
+ 단일 댓글 ID 로 본문·메타·attachments 를 직접 fetch. `comment list` 후 jq 필터링 없이 바로 사용할 수 있어 자동화 파이프라인에 적합하다.
202
+
203
+ ```bash
204
+ # 단일 댓글 조회 (자동화 친화)
205
+ dooray post comment get <project> <post-number> <comment-id> --json | jq -r '.body.content'
206
+
207
+ # ID / URL 모드
208
+ dooray post comment get --id <postId> --comment-id <commentId> --json
209
+ ```
210
+
154
211
  ### 상태 변경
155
212
 
156
213
  ```bash
157
- dooray post done tc-ocr 42 # 완료 처리
158
- dooray post workflow tc-ocr 42 "진행 중" # 워크플로우 변경
214
+ dooray post done <project> 42 # 완료 처리
215
+ dooray post workflow <project> 42 "진행 중" # 워크플로우 변경
159
216
  ```
160
217
 
161
218
  ### 위키
162
219
 
163
220
  ```bash
164
221
  dooray wiki list # 위키 목록
165
- dooray wiki pages tc-ocr # 페이지 목록
166
- dooray wiki page get tc-ocr <page-id> # 페이지 상세
167
- dooray wiki page create tc-ocr --title "..." [--parent <page-id>] [--body "..." | --body-file <path>]
168
- dooray wiki page edit tc-ocr <page-id> --title "새 제목" # 제목만 (비대화형)
169
- dooray wiki page edit tc-ocr <page-id> --body "..." | --body-file <path> # 본문만 (비대화형)
170
- dooray wiki page edit tc-ocr <page-id> # $EDITOR (플래그 없을 때)
222
+ dooray wiki pages <project> # 페이지 목록
223
+ dooray wiki page get <project> <page-id> # 페이지 상세
224
+ dooray wiki page create <project> --title "..." [--parent <page-id>] [--body "..." | --body-file <path>]
225
+ dooray wiki page edit <project> <page-id> --title "새 제목" # 제목만 (비대화형)
226
+ dooray wiki page edit <project> <page-id> --body "..." | --body-file <path> # 본문만 (비대화형)
227
+ dooray wiki page edit <project> <page-id> # $EDITOR (플래그 없을 때)
171
228
  ```
172
229
 
173
230
  ### 메일
@@ -227,6 +284,28 @@ dooray post comment edit --url <url> --comment-id <commentId> --body "..."
227
284
  dooray post comment delete --url <url> --comment-id <commentId>
228
285
  ```
229
286
 
287
+ ### 댓글 첨부 파일 (`post comment file *`)
288
+
289
+ 자동화로 댓글에 인라인 이미지 / 파일을 삽입할 때 사용. 4 명령 (list/upload/download/delete) 모두 `<project> <post-number> <comment-id>` 또는 `--id <postId> --comment-id <logId>` / `--url <url> --comment-id <logId>` 패턴 지원 (ADR-020).
290
+
291
+ ```bash
292
+ # 첨부 목록
293
+ dooray post comment file list <project> <post-num> <comment-id>
294
+
295
+ # 업로드 (post-level files API 로 업로드 + 댓글 본문에 markdown reference append)
296
+ dooray post comment file upload <project> <post-num> <comment-id> ./screenshot.png
297
+
298
+ # 다운로드 (post-level 파일과 동일 — UX 일관성 wrapper)
299
+ dooray post comment file download <project> <post-num> <comment-id> <file-id> --out ./out.png
300
+
301
+ # 삭제 (댓글 본문 markdown 제거 + post-level 파일 삭제, --yes 로 confirm 생략)
302
+ dooray post comment file delete <project> <post-num> <comment-id> <file-id> --yes
303
+ ```
304
+
305
+ > Dooray REST API 가 댓글 전용 attachment endpoint 를 제공하지 않아 내부적으로
306
+ > post-level files API 와 댓글 본문 PUT 의 합성으로 동작 (ADR-024). 단일 명령
307
+ > = 단일 파일 — 다중 파일은 호출자가 반복 호출.
308
+
230
309
  ## 출력 모드
231
310
 
232
311
  | 플래그 | 설명 | 용도 |
@@ -237,8 +316,8 @@ dooray post comment delete --url <url> --comment-id <commentId>
237
316
 
238
317
  ```bash
239
318
  # 파이프라인 예시
240
- dooray post list tc-ocr --json | jq '.[] | select(.priority == "high")'
241
- dooray post list tc-ocr --quiet | xargs -I{} dooray post done tc-ocr {}
319
+ dooray post list <project> --json | jq '.[] | select(.priority == "high")'
320
+ dooray post list <project> --quiet | xargs -I{} dooray post done <project> {}
242
321
  ```
243
322
 
244
323
  ## AI 에이전트 연동
@@ -250,6 +329,28 @@ dooray post list tc-ocr --quiet | xargs -I{} dooray post done tc-ocr {}
250
329
  cp -r skills/dooray-cli ~/.claude/skills/
251
330
  ```
252
331
 
332
+ ## 피드백 (GitHub Issue 등록)
333
+
334
+ `dooray feedback` 명령으로 GitHub issue를 직접 등록할 수 있습니다 (`gh` CLI 위임).
335
+
336
+ ```bash
337
+ # 인터랙티브 (제목/본문/라벨 대화형 입력)
338
+ dooray feedback
339
+
340
+ # 논인터랙티브
341
+ dooray feedback --title "버그 제목" --body "재현 방법"
342
+
343
+ # --last 모드 (직전 에러 자동 첨부)
344
+ dooray config set track-last-run true # 1회만, opt-in
345
+ dooray feedback --last # 직전 명령 + 에러 자동 첨부 + $EDITOR로 의견 추가
346
+ dooray feedback --last --title "재현" --body "추가 설명" --dry-run # 미리보기
347
+
348
+ # 미리보기 (gh 호출 없이 본문 확인)
349
+ dooray feedback --dry-run
350
+ ```
351
+
352
+ > **개인정보 보호 (ADR-023)**: `--last` 모드에서 argv는 `--api-key`/`--token`/`Authorization` 등 시크릿 패턴을 자동 마스킹 후 저장합니다. cwd/env는 미저장.
353
+
253
354
  ## 캐시
254
355
 
255
356
  프로젝트, 멤버, 워크플로우, 위키 정보는 `~/.dooray/cache/`에 캐시됩니다.
@@ -279,6 +380,34 @@ pnpm link --global
279
380
  dooray --help
280
381
  ```
281
382
 
383
+ ## GitHub Actions
384
+
385
+ 이 레포는 두 개의 워크플로를 사용합니다:
386
+
387
+ ### CI (`.github/workflows/ci.yml`)
388
+ - 트리거: `main` 으로 push, `main` 대상 PR
389
+ - 동작: `pnpm install --frozen-lockfile` → `pnpm test` → `pnpm build` (Node 18, ubuntu-latest)
390
+ - 별도 secret 불필요
391
+
392
+ ### Claude code review (`.github/workflows/claude-code-review.yml`)
393
+ - 트리거: PR opened, PR 댓글에 `/review` 포함
394
+ - 동작: 4 병렬 specialist 에이전트 (TypeScript / Conventions / Security / Architecture) 가 인라인 리뷰 + 요약 댓글 1개 게시
395
+ - 필요 secret: `CLAUDE_CODE_OAUTH_TOKEN`
396
+
397
+ #### Secret 셋업
398
+
399
+ 1. https://github.com/jon890/dooray-cli/settings/secrets/actions 접속
400
+ 2. `New repository secret` → 이름 `CLAUDE_CODE_OAUTH_TOKEN` + 값 (Anthropic 에서 발급한 OAuth 토큰)
401
+ 3. PR 을 열거나 PR 댓글에 `/review` 작성하면 자동 실행
402
+
403
+ #### 비용 / 토큰
404
+
405
+ 각 PR 당 4 specialist 가 모두 `haiku` 모델로 동작 — 평균 PR 1건 당 수십 센트 수준. PR 자동 트리거 비활성화하려면 `claude-code-review.yml` 의 `if:` 조건에서 `github.event_name == 'pull_request'` 분기를 제거하고 `/review` 댓글 트리거만 남길 수 있음.
406
+
407
+ #### Fork PR 제한
408
+
409
+ GitHub Actions 정책상 fork 에서 열린 PR 은 `secrets.CLAUDE_CODE_OAUTH_TOKEN` 에 접근 못 해 **자동 리뷰가 silent 하게 skip** 된다. fork 기여자가 리뷰를 받으려면 maintainer 가 PR 댓글에 `/review` 를 작성하여 base repo 컨텍스트로 워크플로를 트리거해야 한다.
410
+
282
411
  ## 라이센스
283
412
 
284
413
  [MIT](LICENSE)