@bifos/dooray-cli 0.5.4 → 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,10 +39,10 @@ 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 groups tc-ocr # 멤버 그룹 목록 (ID / Code)
43
- dooray project tags tc-ocr # 태그 목록 (ID / Color / Name / Group / Mandatory)
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)
44
46
  ```
45
47
 
46
48
  > **태그 캐시 갱신**: 이전 버전에서 캐시한 태그가 색상 없이 표시되면 `dooray cache clear` 실행 후 다시 조회하세요.
@@ -48,26 +50,34 @@ dooray project tags tc-ocr # 태그 목록 (ID / Color / Name / G
48
50
  ### 멤버
49
51
 
50
52
  ```bash
51
- dooray member list tc-ocr # 프로젝트 멤버 목록 (이름·organizationMemberId)
52
- 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 # 페이지네이션
53
62
  ```
54
63
 
55
64
  ### 업무
56
65
 
57
66
  ```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 출력
67
+ dooray post list <project> # 업무 목록 (최신순)
68
+ dooray post search <project> "키워드" # 제목 검색
69
+ dooray post get <project> 42 # 업무 상세
70
+ dooray post get <project> 42 --json # JSON 출력
62
71
  ```
63
72
 
64
- #### 업무 식별 방식 (post 하위 12개 명령 공통)
73
+ #### 업무 식별 방식 (post 하위 16개 명령 공통)
65
74
 
66
75
  | 방식 | 예시 |
67
76
  |---|---|
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` |
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>` |
71
81
  | `--url <url>` | `dooray post get --url https://x.dooray.com/task/to/...` |
72
82
 
73
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).
@@ -75,65 +85,91 @@ dooray post get tc-ocr 42 --json # JSON 출력
75
85
  ### 업무 생성
76
86
 
77
87
  ```bash
78
- dooray post create tc-ocr \
88
+ dooray post create <project> \
79
89
  --title "업무 제목" \
80
90
  --body "본문 마크다운" \
81
91
  --to "담당자이름" \
82
92
  --priority normal
83
93
 
84
94
  # 본문을 파일에서 읽기 (--body와 --body-file은 동시 사용 불가)
85
- dooray post create tc-ocr --title "업무 제목" --body-file ./content.md
95
+ dooray post create <project> --title "업무 제목" --body-file ./content.md
86
96
 
87
97
  # 메타 옵션: --tag(반복) / --parent / --workflow / --milestone
88
- dooray post create tc-ocr \
98
+ dooray post create <project> \
89
99
  --title "업무 제목" --body "본문" --to "담당자이름" \
90
100
  --tag "버그" --tag "긴급" \
91
- --parent "tc-ocr/337" \
101
+ --parent "<project>/337" \
92
102
  --workflow "진행 중" \
93
103
  --milestone "Sprint 12"
94
104
  ```
95
105
 
96
- > mandatory-tag 정책 프로젝트(예: `tc-ocr`)에서는 mandatory 그룹마다 1개 이상 `--tag`로 지정해야 한다. 누락 시 클라이언트가 사전 검증으로 후보 목록과 함께 에러 출력.
106
+ > mandatory-tag 정책 프로젝트(예: `<project>`)에서는 mandatory 그룹마다 1개 이상 `--tag`로 지정해야 한다. 누락 시 클라이언트가 사전 검증으로 후보 목록과 함께 에러 출력.
97
107
 
98
108
  ### 업무 수정
99
109
 
100
110
  ```bash
101
111
  # 대화형 ($EDITOR)
102
- dooray post edit tc-ocr 42
112
+ dooray post edit <project> 42
103
113
 
104
114
  # 비대화형 (AI 에이전트 친화)
105
- dooray post edit tc-ocr 42 --title "새 제목" --body "새 본문"
115
+ dooray post edit <project> 42 --title "새 제목" --body "새 본문"
106
116
 
107
117
  # 본문을 파일에서 읽기
108
- dooray post edit tc-ocr 42 --body-file ./updated.md
118
+ dooray post edit <project> 42 --body-file ./updated.md
109
119
  ```
110
120
 
111
121
  ### 댓글
112
122
 
113
123
  ```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
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
117
127
  ```
118
128
 
119
129
  > table 출력의 Creator 컬럼은 프로젝트 멤버 캐시로 자동 enrich되며, `--json`은 raw 응답을 유지한다 (ADR-021).
120
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
+
121
157
  #### comment list 필터 옵션
122
158
 
123
159
  ```bash
124
160
  # 최신 5개 (desc 정렬)
125
- dooray post comment list tc-ocr 42 --latest 5
161
+ dooray post comment list <project> 42 --latest 5
126
162
 
127
163
  # 특정 시간 이후 댓글만
128
- dooray post comment list tc-ocr 42 --since 2026-04-27
164
+ dooray post comment list <project> 42 --since 2026-04-27
129
165
 
130
166
  # 작성자 이름으로 필터 (부분일치)
131
- dooray post comment list tc-ocr 42 --from-author 홍길동
167
+ dooray post comment list <project> 42 --from-author 홍길동
132
168
 
133
169
  # 오름차순 / 내림차순 정렬
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
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
137
173
  ```
138
174
 
139
175
  #### comment latest
@@ -142,10 +178,10 @@ dooray post comment list tc-ocr 42 --reverse # --sort desc alias
142
178
 
143
179
  ```bash
144
180
  # 최신 댓글 1개
145
- dooray post comment latest tc-ocr 42
181
+ dooray post comment latest <project> 42
146
182
 
147
183
  # 최신 3개
148
- dooray post comment latest tc-ocr 42 -n 3
184
+ dooray post comment latest <project> 42 -n 3
149
185
 
150
186
  # URL로도 가능
151
187
  dooray post comment latest --url <dooray-url>
@@ -154,20 +190,20 @@ dooray post comment latest --url <dooray-url>
154
190
  ### 상태 변경
155
191
 
156
192
  ```bash
157
- dooray post done tc-ocr 42 # 완료 처리
158
- dooray post workflow tc-ocr 42 "진행 중" # 워크플로우 변경
193
+ dooray post done <project> 42 # 완료 처리
194
+ dooray post workflow <project> 42 "진행 중" # 워크플로우 변경
159
195
  ```
160
196
 
161
197
  ### 위키
162
198
 
163
199
  ```bash
164
200
  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 (플래그 없을 때)
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 (플래그 없을 때)
171
207
  ```
172
208
 
173
209
  ### 메일
@@ -227,6 +263,28 @@ dooray post comment edit --url <url> --comment-id <commentId> --body "..."
227
263
  dooray post comment delete --url <url> --comment-id <commentId>
228
264
  ```
229
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
+
230
288
  ## 출력 모드
231
289
 
232
290
  | 플래그 | 설명 | 용도 |
@@ -237,8 +295,8 @@ dooray post comment delete --url <url> --comment-id <commentId>
237
295
 
238
296
  ```bash
239
297
  # 파이프라인 예시
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 {}
298
+ dooray post list <project> --json | jq '.[] | select(.priority == "high")'
299
+ dooray post list <project> --quiet | xargs -I{} dooray post done <project> {}
242
300
  ```
243
301
 
244
302
  ## AI 에이전트 연동
@@ -250,6 +308,28 @@ dooray post list tc-ocr --quiet | xargs -I{} dooray post done tc-ocr {}
250
308
  cp -r skills/dooray-cli ~/.claude/skills/
251
309
  ```
252
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
+
253
333
  ## 캐시
254
334
 
255
335
  프로젝트, 멤버, 워크플로우, 위키 정보는 `~/.dooray/cache/`에 캐시됩니다.
@@ -279,6 +359,34 @@ pnpm link --global
279
359
  dooray --help
280
360
  ```
281
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
+
282
390
  ## 라이센스
283
391
 
284
392
  [MIT](LICENSE)