@bifos/dooray-cli 0.5.3 → 0.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 CHANGED
@@ -1,5 +1,7 @@
1
1
  # dooray-cli
2
2
 
3
+ [![CI](https://github.com/jon890/dooray-cli/actions/workflows/ci.yml/badge.svg)](https://github.com/jon890/dooray-cli/actions/workflows/ci.yml)
4
+
3
5
  NHN Dooray REST API를 래핑한 CLI 도구입니다. 터미널과 AI 에이전트 환경에서 Dooray 업무를 관리할 수 있습니다.
4
6
 
5
7
  > A CLI tool wrapping the NHN Dooray REST API. Manage Dooray tasks from your terminal or AI agent workflows.
@@ -37,33 +39,45 @@ dooray doctor
37
39
  dooray project list # 프로젝트 목록 (기본: public)
38
40
  dooray project list --search ocr # 코드로 검색
39
41
  dooray project list --type private # 개인 프로젝트 목록
40
- dooray project members tc-ocr # 멤버 목록
41
- dooray project workflows tc-ocr # 워크플로우 목록
42
+ dooray project members <project> # 멤버 목록
43
+ dooray project workflows <project> # 워크플로우 목록
44
+ dooray project groups <project> # 멤버 그룹 목록 (ID / Code)
45
+ dooray project tags <project> # 태그 목록 (ID / Color / Name / Group / Mandatory)
42
46
  ```
43
47
 
48
+ > **태그 캐시 갱신**: 이전 버전에서 캐시한 태그가 색상 없이 표시되면 `dooray cache clear` 실행 후 다시 조회하세요.
49
+
44
50
  ### 멤버
45
51
 
46
52
  ```bash
47
- dooray member list tc-ocr # 프로젝트 멤버 목록 (이름·organizationMemberId)
48
- dooray member get <organizationMemberId> # 멤버 상세 (cache 우회, ADR-021)
53
+ dooray member list <project> # 프로젝트 멤버 목록 (이름·organizationMemberId)
54
+ dooray member get <organizationMemberId> # 멤버 상세 (cache 우회, ADR-021)
55
+
56
+ # organization 전체 멤버 검색
57
+ dooray member search 홍길동 # 이름 검색
58
+ dooray member search --email user@example.com # 이메일 (정확히 일치)
59
+ dooray member search --user-code abc # 사번 like 검색
60
+ dooray member search --user-code-exact abc123 # 사번 exact match
61
+ dooray member search 김 --size 50 --page 1 # 페이지네이션
49
62
  ```
50
63
 
51
64
  ### 업무
52
65
 
53
66
  ```bash
54
- dooray post list tc-ocr # 업무 목록 (최신순)
55
- dooray post search tc-ocr "키워드" # 제목 검색
56
- dooray post get tc-ocr 42 # 업무 상세
57
- dooray post get tc-ocr 42 --json # JSON 출력
67
+ dooray post list <project> # 업무 목록 (최신순)
68
+ dooray post search <project> "키워드" # 제목 검색
69
+ dooray post get <project> 42 # 업무 상세
70
+ dooray post get <project> 42 --json # JSON 출력
58
71
  ```
59
72
 
60
- #### 업무 식별 방식 (post 하위 12개 명령 공통)
73
+ #### 업무 식별 방식 (post 하위 16개 명령 공통)
61
74
 
62
75
  | 방식 | 예시 |
63
76
  |---|---|
64
- | `<project> <number>` | `dooray post get tc-ocr 42` |
65
- | Dooray URL positional | `dooray post get https://x.dooray.com/task/to/4319587406666362045` |
66
- | `--id <postId>` | `dooray post get --id 4319587406666362045` |
77
+ | `<project> <number>` | `dooray post get <project> 42` |
78
+ | Dooray URL positional (`/task/to/<postId>`) | `dooray post get https://x.dooray.com/task/to/<postId>` |
79
+ | Dooray URL positional (브라우저 주소창 복사본) | `dooray post get https://x.dooray.com/task/<projectId>/<postId>` |
80
+ | `--id <postId>` | `dooray post get --id <postId>` |
67
81
  | `--url <url>` | `dooray post get --url https://x.dooray.com/task/to/...` |
68
82
 
69
83
  대상: `post get`/`edit`/`done`/`workflow`, `post comment list`/`add`/`edit`/`delete`, `post file list`/`upload`/`download`/`download-all`/`delete`. AI 에이전트는 사용자 메시지의 Dooray URL을 그대로 첫 인자로 전달하면 가장 빠르다 (ADR-020).
@@ -71,66 +85,125 @@ dooray post get tc-ocr 42 --json # JSON 출력
71
85
  ### 업무 생성
72
86
 
73
87
  ```bash
74
- dooray post create tc-ocr \
88
+ dooray post create <project> \
75
89
  --title "업무 제목" \
76
90
  --body "본문 마크다운" \
77
91
  --to "담당자이름" \
78
92
  --priority normal
79
93
 
80
94
  # 본문을 파일에서 읽기 (--body와 --body-file은 동시 사용 불가)
81
- dooray post create tc-ocr --title "업무 제목" --body-file ./content.md
95
+ dooray post create <project> --title "업무 제목" --body-file ./content.md
82
96
 
83
97
  # 메타 옵션: --tag(반복) / --parent / --workflow / --milestone
84
- dooray post create tc-ocr \
98
+ dooray post create <project> \
85
99
  --title "업무 제목" --body "본문" --to "담당자이름" \
86
100
  --tag "버그" --tag "긴급" \
87
- --parent "tc-ocr/337" \
101
+ --parent "<project>/337" \
88
102
  --workflow "진행 중" \
89
103
  --milestone "Sprint 12"
90
104
  ```
91
105
 
92
- > mandatory-tag 정책 프로젝트(예: `tc-ocr`)에서는 mandatory 그룹마다 1개 이상 `--tag`로 지정해야 한다. 누락 시 클라이언트가 사전 검증으로 후보 목록과 함께 에러 출력.
106
+ > mandatory-tag 정책 프로젝트(예: `<project>`)에서는 mandatory 그룹마다 1개 이상 `--tag`로 지정해야 한다. 누락 시 클라이언트가 사전 검증으로 후보 목록과 함께 에러 출력.
93
107
 
94
108
  ### 업무 수정
95
109
 
96
110
  ```bash
97
111
  # 대화형 ($EDITOR)
98
- dooray post edit tc-ocr 42
112
+ dooray post edit <project> 42
99
113
 
100
114
  # 비대화형 (AI 에이전트 친화)
101
- dooray post edit tc-ocr 42 --title "새 제목" --body "새 본문"
115
+ dooray post edit <project> 42 --title "새 제목" --body "새 본문"
102
116
 
103
117
  # 본문을 파일에서 읽기
104
- dooray post edit tc-ocr 42 --body-file ./updated.md
118
+ dooray post edit <project> 42 --body-file ./updated.md
105
119
  ```
106
120
 
107
121
  ### 댓글
108
122
 
109
123
  ```bash
110
- dooray post comment list tc-ocr 42
111
- dooray post comment add tc-ocr 42 --body "댓글 내용"
112
- dooray post comment add tc-ocr 42 --body-file ./comment.md
124
+ dooray post comment list <project> 42
125
+ dooray post comment add <project> 42 --body "댓글 내용"
126
+ dooray post comment add <project> 42 --body-file ./comment.md
113
127
  ```
114
128
 
115
129
  > table 출력의 Creator 컬럼은 프로젝트 멤버 캐시로 자동 enrich되며, `--json`은 raw 응답을 유지한다 (ADR-021).
116
130
 
131
+ #### 멘션 (comment add / comment edit)
132
+
133
+ `--mention <name>` (반복), `--mention-group <code>` (반복)으로 본문 앞에 멘션 마크업을 자동 prepend한다.
134
+
135
+ ```bash
136
+ # 멤버 멘션 1명
137
+ dooray post comment add P 1 --mention 홍길동 --body "확인 부탁드립니다"
138
+
139
+ # 여러 명
140
+ dooray post comment add P 1 --mention 홍길동 --mention 김철수 --body "..."
141
+
142
+ # 그룹 멘션
143
+ dooray post comment add P 1 --mention-group 개발 --body "검토 요청"
144
+
145
+ # 멤버 + 그룹 혼합
146
+ dooray post comment add P 1 \
147
+ --mention 홍길동 \
148
+ --mention-group 개발 \
149
+ --body "검토 부탁드립니다"
150
+
151
+ # comment edit에도 동일 옵션 사용 가능
152
+ dooray post comment edit P 1 <commentId> --mention 홍길동 --body "수정 내용"
153
+ ```
154
+
155
+ > 이전 버전 캐시는 orgId가 없으므로 첫 호출 시 자동 갱신됩니다 (또는 `dooray cache clear`).
156
+
157
+ #### comment list 필터 옵션
158
+
159
+ ```bash
160
+ # 최신 5개 (desc 정렬)
161
+ dooray post comment list <project> 42 --latest 5
162
+
163
+ # 특정 시간 이후 댓글만
164
+ dooray post comment list <project> 42 --since 2026-04-27
165
+
166
+ # 작성자 이름으로 필터 (부분일치)
167
+ dooray post comment list <project> 42 --from-author 홍길동
168
+
169
+ # 오름차순 / 내림차순 정렬
170
+ dooray post comment list <project> 42 --sort asc
171
+ dooray post comment list <project> 42 --sort desc
172
+ dooray post comment list <project> 42 --reverse # --sort desc alias
173
+ ```
174
+
175
+ #### comment latest
176
+
177
+ 최신 댓글 1개(또는 N개)를 빠르게 조회한다.
178
+
179
+ ```bash
180
+ # 최신 댓글 1개
181
+ dooray post comment latest <project> 42
182
+
183
+ # 최신 3개
184
+ dooray post comment latest <project> 42 -n 3
185
+
186
+ # URL로도 가능
187
+ dooray post comment latest --url <dooray-url>
188
+ ```
189
+
117
190
  ### 상태 변경
118
191
 
119
192
  ```bash
120
- dooray post done tc-ocr 42 # 완료 처리
121
- dooray post workflow tc-ocr 42 "진행 중" # 워크플로우 변경
193
+ dooray post done <project> 42 # 완료 처리
194
+ dooray post workflow <project> 42 "진행 중" # 워크플로우 변경
122
195
  ```
123
196
 
124
197
  ### 위키
125
198
 
126
199
  ```bash
127
200
  dooray wiki list # 위키 목록
128
- dooray wiki pages tc-ocr # 페이지 목록
129
- dooray wiki page get tc-ocr <page-id> # 페이지 상세
130
- dooray wiki page create tc-ocr --title "..." [--parent <page-id>] [--body "..." | --body-file <path>]
131
- dooray wiki page edit tc-ocr <page-id> --title "새 제목" # 제목만 (비대화형)
132
- dooray wiki page edit tc-ocr <page-id> --body "..." | --body-file <path> # 본문만 (비대화형)
133
- dooray wiki page edit tc-ocr <page-id> # $EDITOR (플래그 없을 때)
201
+ dooray wiki pages <project> # 페이지 목록
202
+ dooray wiki page get <project> <page-id> # 페이지 상세
203
+ dooray wiki page create <project> --title "..." [--parent <page-id>] [--body "..." | --body-file <path>]
204
+ dooray wiki page edit <project> <page-id> --title "새 제목" # 제목만 (비대화형)
205
+ dooray wiki page edit <project> <page-id> --body "..." | --body-file <path> # 본문만 (비대화형)
206
+ dooray wiki page edit <project> <page-id> # $EDITOR (플래그 없을 때)
134
207
  ```
135
208
 
136
209
  ### 메일
@@ -190,6 +263,28 @@ dooray post comment edit --url <url> --comment-id <commentId> --body "..."
190
263
  dooray post comment delete --url <url> --comment-id <commentId>
191
264
  ```
192
265
 
266
+ ### 댓글 첨부 파일 (`post comment file *`)
267
+
268
+ 자동화로 댓글에 인라인 이미지 / 파일을 삽입할 때 사용. 4 명령 (list/upload/download/delete) 모두 `<project> <post-number> <comment-id>` 또는 `--id <postId> --comment-id <logId>` / `--url <url> --comment-id <logId>` 패턴 지원 (ADR-020).
269
+
270
+ ```bash
271
+ # 첨부 목록
272
+ dooray post comment file list <project> <post-num> <comment-id>
273
+
274
+ # 업로드 (post-level files API 로 업로드 + 댓글 본문에 markdown reference append)
275
+ dooray post comment file upload <project> <post-num> <comment-id> ./screenshot.png
276
+
277
+ # 다운로드 (post-level 파일과 동일 — UX 일관성 wrapper)
278
+ dooray post comment file download <project> <post-num> <comment-id> <file-id> --out ./out.png
279
+
280
+ # 삭제 (댓글 본문 markdown 제거 + post-level 파일 삭제, --yes 로 confirm 생략)
281
+ dooray post comment file delete <project> <post-num> <comment-id> <file-id> --yes
282
+ ```
283
+
284
+ > Dooray REST API 가 댓글 전용 attachment endpoint 를 제공하지 않아 내부적으로
285
+ > post-level files API 와 댓글 본문 PUT 의 합성으로 동작 (ADR-024). 단일 명령
286
+ > = 단일 파일 — 다중 파일은 호출자가 반복 호출.
287
+
193
288
  ## 출력 모드
194
289
 
195
290
  | 플래그 | 설명 | 용도 |
@@ -200,8 +295,8 @@ dooray post comment delete --url <url> --comment-id <commentId>
200
295
 
201
296
  ```bash
202
297
  # 파이프라인 예시
203
- dooray post list tc-ocr --json | jq '.[] | select(.priority == "high")'
204
- dooray post list tc-ocr --quiet | xargs -I{} dooray post done tc-ocr {}
298
+ dooray post list <project> --json | jq '.[] | select(.priority == "high")'
299
+ dooray post list <project> --quiet | xargs -I{} dooray post done <project> {}
205
300
  ```
206
301
 
207
302
  ## AI 에이전트 연동
@@ -213,6 +308,28 @@ dooray post list tc-ocr --quiet | xargs -I{} dooray post done tc-ocr {}
213
308
  cp -r skills/dooray-cli ~/.claude/skills/
214
309
  ```
215
310
 
311
+ ## 피드백 (GitHub Issue 등록)
312
+
313
+ `dooray feedback` 명령으로 GitHub issue를 직접 등록할 수 있습니다 (`gh` CLI 위임).
314
+
315
+ ```bash
316
+ # 인터랙티브 (제목/본문/라벨 대화형 입력)
317
+ dooray feedback
318
+
319
+ # 논인터랙티브
320
+ dooray feedback --title "버그 제목" --body "재현 방법"
321
+
322
+ # --last 모드 (직전 에러 자동 첨부)
323
+ dooray config set track-last-run true # 1회만, opt-in
324
+ dooray feedback --last # 직전 명령 + 에러 자동 첨부 + $EDITOR로 의견 추가
325
+ dooray feedback --last --title "재현" --body "추가 설명" --dry-run # 미리보기
326
+
327
+ # 미리보기 (gh 호출 없이 본문 확인)
328
+ dooray feedback --dry-run
329
+ ```
330
+
331
+ > **개인정보 보호 (ADR-023)**: `--last` 모드에서 argv는 `--api-key`/`--token`/`Authorization` 등 시크릿 패턴을 자동 마스킹 후 저장합니다. cwd/env는 미저장.
332
+
216
333
  ## 캐시
217
334
 
218
335
  프로젝트, 멤버, 워크플로우, 위키 정보는 `~/.dooray/cache/`에 캐시됩니다.
@@ -242,6 +359,34 @@ pnpm link --global
242
359
  dooray --help
243
360
  ```
244
361
 
362
+ ## GitHub Actions
363
+
364
+ 이 레포는 두 개의 워크플로를 사용합니다:
365
+
366
+ ### CI (`.github/workflows/ci.yml`)
367
+ - 트리거: `main` 으로 push, `main` 대상 PR
368
+ - 동작: `pnpm install --frozen-lockfile` → `pnpm test` → `pnpm build` (Node 18, ubuntu-latest)
369
+ - 별도 secret 불필요
370
+
371
+ ### Claude code review (`.github/workflows/claude-code-review.yml`)
372
+ - 트리거: PR opened, PR 댓글에 `/review` 포함
373
+ - 동작: 4 병렬 specialist 에이전트 (TypeScript / Conventions / Security / Architecture) 가 인라인 리뷰 + 요약 댓글 1개 게시
374
+ - 필요 secret: `CLAUDE_CODE_OAUTH_TOKEN`
375
+
376
+ #### Secret 셋업
377
+
378
+ 1. https://github.com/jon890/dooray-cli/settings/secrets/actions 접속
379
+ 2. `New repository secret` → 이름 `CLAUDE_CODE_OAUTH_TOKEN` + 값 (Anthropic 에서 발급한 OAuth 토큰)
380
+ 3. PR 을 열거나 PR 댓글에 `/review` 작성하면 자동 실행
381
+
382
+ #### 비용 / 토큰
383
+
384
+ 각 PR 당 4 specialist 가 모두 `haiku` 모델로 동작 — 평균 PR 1건 당 수십 센트 수준. PR 자동 트리거 비활성화하려면 `claude-code-review.yml` 의 `if:` 조건에서 `github.event_name == 'pull_request'` 분기를 제거하고 `/review` 댓글 트리거만 남길 수 있음.
385
+
386
+ #### Fork PR 제한
387
+
388
+ GitHub Actions 정책상 fork 에서 열린 PR 은 `secrets.CLAUDE_CODE_OAUTH_TOKEN` 에 접근 못 해 **자동 리뷰가 silent 하게 skip** 된다. fork 기여자가 리뷰를 받으려면 maintainer 가 PR 댓글에 `/review` 를 작성하여 base repo 컨텍스트로 워크플로를 트리거해야 한다.
389
+
245
390
  ## 라이센스
246
391
 
247
392
  [MIT](LICENSE)