@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 +172 -43
- package/dist/index.js +1153 -166
- package/package.json +2 -2
- package/skills/dooray-cli/SKILL.md +91 -17
package/README.md
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
# dooray-cli
|
|
2
2
|
|
|
3
|
+
[](https://www.npmjs.com/package/@bifos/dooray-cli)
|
|
4
|
+
[](https://www.npmjs.com/package/@bifos/dooray-cli)
|
|
5
|
+
[](https://github.com/jon890/dooray-cli/actions/workflows/ci.yml)
|
|
6
|
+
[](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
|
|
41
|
-
dooray project workflows
|
|
42
|
-
dooray project groups
|
|
43
|
-
dooray project tags
|
|
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
|
|
52
|
-
dooray member get <organizationMemberId>
|
|
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
|
|
59
|
-
dooray post search
|
|
60
|
-
dooray post get
|
|
61
|
-
dooray post get
|
|
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 하위
|
|
76
|
+
#### 업무 식별 방식 (post 하위 16개 명령 공통)
|
|
65
77
|
|
|
66
78
|
| 방식 | 예시 |
|
|
67
79
|
|---|---|
|
|
68
|
-
| `<project> <number>` | `dooray post get
|
|
69
|
-
| Dooray URL positional | `dooray post get https://x.dooray.com/task/to
|
|
70
|
-
|
|
|
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
|
|
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
|
|
98
|
+
dooray post create <project> --title "업무 제목" --body-file ./content.md
|
|
86
99
|
|
|
87
100
|
# 메타 옵션: --tag(반복) / --parent / --workflow / --milestone
|
|
88
|
-
dooray post create
|
|
101
|
+
dooray post create <project> \
|
|
89
102
|
--title "업무 제목" --body "본문" --to "담당자이름" \
|
|
90
103
|
--tag "버그" --tag "긴급" \
|
|
91
|
-
--parent "
|
|
104
|
+
--parent "<project>/337" \
|
|
92
105
|
--workflow "진행 중" \
|
|
93
106
|
--milestone "Sprint 12"
|
|
94
107
|
```
|
|
95
108
|
|
|
96
|
-
> mandatory-tag 정책 프로젝트(예:
|
|
109
|
+
> mandatory-tag 정책 프로젝트(예: `<project>`)에서는 mandatory 그룹마다 1개 이상 `--tag`로 지정해야 한다. 누락 시 클라이언트가 사전 검증으로 후보 목록과 함께 에러 출력.
|
|
97
110
|
|
|
98
111
|
### 업무 수정
|
|
99
112
|
|
|
100
113
|
```bash
|
|
101
114
|
# 대화형 ($EDITOR)
|
|
102
|
-
dooray post edit
|
|
115
|
+
dooray post edit <project> 42
|
|
103
116
|
|
|
104
117
|
# 비대화형 (AI 에이전트 친화)
|
|
105
|
-
dooray post edit
|
|
118
|
+
dooray post edit <project> 42 --title "새 제목" --body "새 본문"
|
|
106
119
|
|
|
107
120
|
# 본문을 파일에서 읽기
|
|
108
|
-
dooray post edit
|
|
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(``)이 빠져 있으면 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
|
|
115
|
-
dooray post comment add
|
|
116
|
-
dooray post comment add
|
|
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
|
|
170
|
+
dooray post comment list <project> 42 --latest 5
|
|
126
171
|
|
|
127
172
|
# 특정 시간 이후 댓글만
|
|
128
|
-
dooray post comment list
|
|
173
|
+
dooray post comment list <project> 42 --since 2026-04-27
|
|
129
174
|
|
|
130
175
|
# 작성자 이름으로 필터 (부분일치)
|
|
131
|
-
dooray post comment list
|
|
176
|
+
dooray post comment list <project> 42 --from-author 홍길동
|
|
132
177
|
|
|
133
178
|
# 오름차순 / 내림차순 정렬
|
|
134
|
-
dooray post comment list
|
|
135
|
-
dooray post comment list
|
|
136
|
-
dooray post comment list
|
|
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
|
|
190
|
+
dooray post comment latest <project> 42
|
|
146
191
|
|
|
147
192
|
# 최신 3개
|
|
148
|
-
dooray post comment latest
|
|
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
|
|
158
|
-
dooray post workflow
|
|
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
|
|
166
|
-
dooray wiki page get
|
|
167
|
-
dooray wiki page create
|
|
168
|
-
dooray wiki page edit
|
|
169
|
-
dooray wiki page edit
|
|
170
|
-
dooray wiki page edit
|
|
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
|
|
241
|
-
dooray post list
|
|
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)
|