@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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bifos/dooray-cli",
3
- "version": "0.5.3",
3
+ "version": "0.6.0",
4
4
  "description": "CLI tool for Dooray project management — AI agent & terminal friendly",
5
5
  "keywords": [
6
6
  "dooray",
@@ -26,7 +26,7 @@
26
26
  "README.md"
27
27
  ],
28
28
  "engines": {
29
- "node": ">=18"
29
+ "node": ">=20"
30
30
  },
31
31
  "scripts": {
32
32
  "build": "tsup",
@@ -45,7 +45,7 @@ dooray doctor # 설정 검증
45
45
 
46
46
  자연어 요청을 커맨드로 변환할 때 아래 표를 참고한다.
47
47
 
48
- > **공통 (post 하위 12개 명령)**: `post get`/`edit`/`done`/`workflow`, `post comment list`/`add`/`edit`/`delete`, `post file list`/`upload`/`download`/`download-all`/`delete`는 `<project> <number>` 외에도 `--id <postId>`, `--url <url>`, 또는 첫 인자에 Dooray URL(`https://*.dooray.com/task/to/<postId>`)을 직접 받는다. **사용자가 URL을 줬으면 그대로 첫 인자로 전달**하는 것이 가장 빠른 경로 (resolve 단계 단축, ADR-020).
48
+ > **공통 (post 하위 16개 명령)**: `post get`/`edit`/`done`/`workflow`, `post comment list`/`add`/`edit`/`delete`, `post file list`/`upload`/`download`/`download-all`/`delete`, `post comment file list`/`upload`/`download`/`delete`는 `<project> <number>` 외에도 `--id <postId>`, `--url <url>`, 또는 첫 인자에 Dooray URL(`https://*.dooray.com/task/to/<postId>` 또는 브라우저 주소창 복사본 `https://*.dooray.com/task/<projectId>/<postId>`)을 직접 받는다. **사용자가 URL을 줬으면 그대로 첫 인자로 전달**하는 것이 가장 빠른 경로 (resolve 단계 단축, ADR-020).
49
49
 
50
50
  | 의도 | 커맨드 |
51
51
  |------|--------|
@@ -53,7 +53,10 @@ dooray doctor # 설정 검증
53
53
  | 프로젝트 찾기 | `dooray project list --search <keyword>` |
54
54
  | 개인 프로젝트 목록 | `dooray project list --type private` |
55
55
  | 프로젝트 멤버 보기 | `dooray project members <project>` 또는 `dooray member list <project>` (이름·organizationMemberId) |
56
+ | 프로젝트 멤버 그룹 목록 | `dooray project groups <project>` (ID / Code) |
57
+ | 프로젝트 태그 목록 | `dooray project tags <project>` (ID / Color / Name / Group / Mandatory) |
56
58
  | 멤버 상세 (organizationMemberId) | `dooray member get <organizationMemberId>` (cache 우회, ADR-021) |
59
+ | organization 전체 멤버 검색 | `dooray member search <keyword>` (이름 기본), `--email`(이메일 exact), `--user-code`(사번 like), `--user-code-exact`(사번 exact), `--page`/`--size` |
57
60
  | 업무 목록 조회 | `dooray post list <project>` |
58
61
  | 업무 검색 | `dooray post search <project> "<keyword>"` |
59
62
  | 업무 상세 보기 | `dooray post get <project> <number>` |
@@ -61,7 +64,8 @@ dooray doctor # 설정 검증
61
64
  | 업무 제목/본문 수정 | `dooray post edit <project> <number> --title "..." --body "..."` 또는 `--body-file <path>` |
62
65
  | 업무 완료 처리 | `dooray post done <project> <number>` |
63
66
  | 업무 워크플로우 변경 | `dooray post workflow <project> <number> <workflow>` |
64
- | 댓글 조회 | `dooray post comment list <project> <number>` (table 출력은 Creator 이름 자동 채움, `--json`은 raw 유지 ADR-021) |
67
+ | 댓글 조회 | `dooray post comment list <project> <number>` — `--sort asc\|desc`, `--reverse`, `--latest <n>`, `--since <iso>`, `--from-author <name>` 필터 지원. table 출력은 Creator 이름 자동 채움, `--json`은 raw 유지 (ADR-021) |
68
+ | 최신 댓글 조회 | `dooray post comment latest <project> <number>` — 최신 댓글 1개 빠른 조회. `-n <N>`으로 N개 지정 |
65
69
  | 댓글 추가 | `dooray post comment add <project> <number> --body "..."` 또는 `--body-file <path>` |
66
70
  | 댓글 수정 | `dooray post comment edit <project> <number> <comment-id> --body "..."` 또는 `--body-file <path>` |
67
71
  | 댓글 삭제 | `dooray post comment delete <project> <number> <comment-id>` |
@@ -83,6 +87,10 @@ dooray doctor # 설정 검증
83
87
  | 전체 첨부파일 다운로드 | `dooray post file download-all <project> <number>` |
84
88
  | 첨부파일 업로드 | `dooray post file upload <project> <number> <file-path>` |
85
89
  | 첨부파일 삭제 | `dooray post file delete <project> <number> <file-id>` |
90
+ | 댓글 첨부 목록 | `dooray post comment file list <project> <number> <comment-id>` |
91
+ | 댓글 파일 업로드 | `dooray post comment file upload <project> <number> <comment-id> <path>` |
92
+ | 댓글 파일 다운로드 | `dooray post comment file download <project> <number> <comment-id> <file-id>` |
93
+ | 댓글 파일 삭제 | `dooray post comment file delete <project> <number> <comment-id> <file-id> --yes` |
86
94
 
87
95
  > **제목 옵션 네이밍**: `post` 와 `wiki page` 모두 `--title` 표준. `post`의 `--subject`는 deprecated alias로 당분간 동작하되, 새 코드에서는 `--title` 사용을 권장.
88
96
 
@@ -108,7 +116,8 @@ CLI로 처리 **불가능한** 작업. 아래 항목을 요청받으면 웹 UI
108
116
  3. **업무 번호를 모르면** → `dooray post search <project> "<keyword>"` 로 검색
109
117
  4. **워크플로우 이름을 모르면** → `dooray project workflows <project>` 로 확인
110
118
  5. **멤버 이름을 모르면** → `dooray member list <project>` (또는 `dooray project members <project>`) 로 확인
111
- 6. **결과를 다음 액션에 사용하려면**`--json` 플래그로 구조화된 데이터 획득
119
+ 6. **org 전체 멤버를 찾으려면** → `dooray member search <keyword>` (이름), `--email <addr>`, `--user-code <code>` 중 하나 사용
120
+ 7. **결과를 다음 액션에 사용하려면** → `--json` 플래그로 구조화된 데이터 획득
112
121
 
113
122
  ---
114
123
 
@@ -118,11 +127,11 @@ CLI로 처리 **불가능한** 작업. 아래 항목을 요청받으면 웹 UI
118
127
 
119
128
  ```bash
120
129
  # 1. 업무 검색으로 번호 확인
121
- dooray post search tc-ocr "graceful shutdown" --json
130
+ dooray post search <project> "graceful shutdown" --json
122
131
  # → [{ "number": 42, "subject": "graceful shutdown 구현", ... }]
123
132
 
124
133
  # 2. 완료 처리
125
- dooray post done tc-ocr 42
134
+ dooray post done <project> 42
126
135
  ```
127
136
 
128
137
  ### 프로젝트 찾아서 업무 생성
@@ -143,43 +152,55 @@ dooray post create ai-service-dev \
143
152
 
144
153
  ```bash
145
154
  # 1. 업무 조회
146
- dooray post get tc-ocr 42 --json
155
+ dooray post get <project> 42 --json
147
156
 
148
157
  # 2. 댓글 추가
149
- dooray post comment add tc-ocr 42 --body "진행 상황 업데이트: 80% 완료"
158
+ dooray post comment add <project> 42 --body "진행 상황 업데이트: 80% 완료"
159
+ ```
160
+
161
+ ### 시나리오 — 댓글에 스크린샷 자동 첨부
162
+
163
+ 스크립트가 스크린샷을 댓글에 삽입하거나, 에이전트가 결과 파일을 첨부 댓글로 보고할 때 사용. Dooray REST API 가 댓글 전용 attachment endpoint 를 미지원하므로 내부적으로 post-level files API + 댓글 본문 PUT 합성으로 동작 (ADR-024).
164
+
165
+ ```bash
166
+ # 1. 댓글을 먼저 만든다 (텍스트만, --json 으로 commentId 획득)
167
+ COMMENT_ID=$(dooray post comment add <project> <post-num> --body "스크린샷 보고:" --json | jq -r '.id')
168
+
169
+ # 2. 그 댓글에 파일을 첨부 (post-level 업로드 + 댓글 본문 markdown 자동 추가)
170
+ dooray post comment file upload <project> <post-num> "$COMMENT_ID" ./screenshot.png
150
171
  ```
151
172
 
152
173
  ### 위키 페이지 조회
153
174
 
154
175
  ```bash
155
176
  # 1. 위키 페이지 목록
156
- dooray wiki pages tc-ocr --json
157
- # → [{ "id": "3052841366755571094", "subject": "설계 문서", ... }]
177
+ dooray wiki pages <project> --json
178
+ # → [{ "id": "<pageId>", "subject": "설계 문서", ... }]
158
179
 
159
180
  # 2. 페이지 내용 조회
160
- dooray wiki page get tc-ocr 3052841366755571094 --json
181
+ dooray wiki page get <project> <pageId> --json
161
182
  ```
162
183
 
163
184
  ---
164
185
 
165
186
  ## 커맨드 상세
166
187
 
167
- ### 업무 식별 방식 (post 하위 12개 명령 공통, ADR-020)
188
+ ### 업무 식별 방식 (post 하위 16개 명령 공통, ADR-020)
168
189
 
169
- `post get`/`edit`/`done`/`workflow`, `post comment list`/`add`/`edit`/`delete`, `post file list`/`upload`/`download`/`download-all`/`delete`는 4가지 입력을 모두 받는다:
190
+ `post get`/`edit`/`done`/`workflow`, `post comment list`/`add`/`edit`/`delete`, `post file list`/`upload`/`download`/`download-all`/`delete`, `post comment file list`/`upload`/`download`/`delete`는 4가지 입력을 모두 받는다:
170
191
 
171
192
  ```bash
172
193
  # (1) 기존 positional — 가장 익숙한 형태
173
- dooray post get tc-ocr 42
194
+ dooray post get <project> 42
174
195
 
175
196
  # (2) Dooray URL을 첫 인자로 — 사용자 메시지에서 URL을 그대로 복사할 때 최적
176
- dooray post get https://x.dooray.com/task/to/4319587406666362045
197
+ dooray post get https://x.dooray.com/task/to/<postId>
177
198
 
178
199
  # (3) --id <postId>
179
- dooray post get --id 4319587406666362045
200
+ dooray post get --id <postId>
180
201
 
181
202
  # (4) --url <url>
182
- dooray post get --url https://x.dooray.com/task/to/4319587406666362045
203
+ dooray post get --url https://x.dooray.com/task/to/<postId>
183
204
  ```
184
205
 
185
206
  **우선순위 / 충돌 규칙**: `--id`+`--url` 동시 지정 → 에러. `--id`/`--url`+positional 동시 지정 → 에러. URL/`--id`/`--url` 모드는 standalone API(`getPost(postId)`)로 resolve 단계를 단축.
@@ -211,7 +232,7 @@ dooray post create <project> \
211
232
  --priority normal \ # highest, high, normal, low, lowest
212
233
  --due-date "2026-04-30T18:00:00+09:00" \
213
234
  --tag "버그" --tag "긴급" \ # 반복 지정. mandatory 그룹은 클라이언트 사전 검증
214
- --parent "tc-ocr/337" \ # "code/number" 또는 raw postId 두 형태만 허용
235
+ --parent "<project>/337" \ # "code/number" 또는 raw postId 두 형태만 허용
215
236
  --workflow "진행 중" \ # 이름 또는 class (registered/working/closed). 부분일치 모호 시 후보 + 에러
216
237
  --milestone "Sprint 12"
217
238
  ```
@@ -243,8 +264,90 @@ dooray post comment add <project> <number> --body "댓글 내용"
243
264
  dooray post comment add <project> <number> --body-file ./comment.md
244
265
  ```
245
266
 
267
+ ### 댓글 목록 필터 (non-interactive)
268
+
269
+ ```bash
270
+ # 최신 5개
271
+ dooray post comment list <project> <number> --latest 5
272
+ # 특정 날짜 이후
273
+ dooray post comment list <project> <number> --since 2026-04-27
274
+ # 작성자 필터
275
+ dooray post comment list <project> <number> --from-author 홍길동
276
+ # 최신 댓글 1개 빠른 조회
277
+ dooray post comment latest <project> <number>
278
+ ```
279
+
246
280
  ---
247
281
 
282
+ ## 멘션 자동 작성 (post comment add/edit)
283
+
284
+ `--mention <name>` (반복) 또는 `--mention-group <code>` (반복)으로 본문 앞에 멘션 마크업을 자동 prepend한다. 아래 "Dooray 마크다운 링크 형식" 섹션의 URL 형식을 자동 출력한다.
285
+
286
+ ```bash
287
+ dooray post comment add P 1 --mention 홍길동 --mention-group 개발 --body "..."
288
+ # 결과 본문: [@홍길동](dooray://orgId/members/m1 "member") [@P/개발](dooray://orgId/member-groups/g1) ...
289
+ ```
290
+
291
+ - 이름 부분일치 지원 (모호하면 에러 + 후보 목록 출력)
292
+ - 멤버 먼저, 그룹 다음 순서 고정
293
+ - comment edit에도 동일 옵션 사용 (`$EDITOR` 모드에서는 EDITOR 진입 전에 prepend)
294
+
295
+ ## Dooray 마크다운 링크 형식 (멤버·그룹·업무 멘션)
296
+
297
+ 댓글/본문 작성 시 다음 형식으로 마크업하면 Dooray 앱이 인식해 inline 멘션·navigation으로 렌더링한다. ID는 본인 환경 값으로 채워 사용 — `dooray member get` / `project groups` / `post get` 등으로 조회.
298
+
299
+ ### 멤버 멘션
300
+ ```markdown
301
+ [@본인이름](dooray://{orgId}/members/{memberId} "me")
302
+ [@타인이름](dooray://{orgId}/members/{memberId} "member")
303
+ ```
304
+ - title 속성: 본인은 `"me"`, 타인은 `"member"`
305
+ - URL: `dooray://{orgId}/members/{memberId}`
306
+
307
+ ### 그룹 멘션 (member-group)
308
+ ```markdown
309
+ [@projectCode/그룹명](dooray://{orgId}/member-groups/{groupId})
310
+ ```
311
+ - **`projects/{projectId}/` 경로 포함하지 않음** (직관과 반대 — 흔한 실수)
312
+ - title 속성 **없음**
313
+ - URL: `dooray://{orgId}/member-groups/{groupId}`
314
+
315
+ ### 업무(task) 링크
316
+ ```markdown
317
+ [projectCode/{number} {subject}](dooray://{orgId}/tasks/{postId} "registered")
318
+ ```
319
+ - 표시 텍스트: `{project}/{number} {subject}`
320
+ - URL: `dooray://{orgId}/tasks/{postId}`
321
+ - title: workflow class — `registered` / `working` / `closed` / `backlog`
322
+ - 클릭 시 외부 브라우저 안 열고 Dooray 앱 내부 navigation + workflow 상태 표시
323
+
324
+ ### 필요 ID 조회 명령
325
+
326
+ | ID | 조회 |
327
+ |---|---|
328
+ | `orgId` | Dooray 앱/웹 URL에서 추출 (`https://{org}.dooray.com/...`의 도메인 + 별도 확인 필요) |
329
+ | `memberId` | `dooray member get <id>`, `dooray member search <name>`, `--email <addr>`, `--user-code <code>` 등으로 검색 |
330
+ | `groupId` | `dooray project groups <project>` |
331
+ | `postId` | `dooray post get <project> <number> --json` 의 `id` 필드 |
332
+
333
+ ---
334
+
335
+ ## 피드백 (GitHub Issue 등록)
336
+
337
+ `dooray feedback` 명령으로 dooray-cli GitHub issue를 직접 등록한다 (`gh` CLI 위임).
338
+
339
+ ```bash
340
+ # 논인터랙티브 (non-interactive — 에이전트 자동화용)
341
+ dooray feedback --title "버그 제목" --body "재현 방법" --label "bug"
342
+
343
+ # --last 모드 (직전 에러 자동 첨부 — track-last-run 활성화 필요)
344
+ dooray config set track-last-run true
345
+ dooray feedback --last --title "에러 제목" --body "추가 설명" --dry-run # 미리보기
346
+ dooray feedback --last --title "에러 제목" --body "추가 설명" # 실제 등록
347
+ ```
348
+
349
+ > **참고**: `--last` 모드는 `trackLastRun: true` (ADR-023 opt-in)가 설정된 경우에만 직전 실패 명령이 자동 기록됨. argv는 시크릿 패턴(`--api-key`/`--token`/`Authorization`) 마스킹 후 저장.
350
+
248
351
  ## 에러 핸들링
249
352
 
250
353
  CLI 에러 발생 시 복구 방법: