@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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bifos/dooray-cli",
3
- "version": "0.5.4",
3
+ "version": "0.7.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
  |------|--------|
@@ -56,6 +56,7 @@ dooray doctor # 설정 검증
56
56
  | 프로젝트 멤버 그룹 목록 | `dooray project groups <project>` (ID / Code) |
57
57
  | 프로젝트 태그 목록 | `dooray project tags <project>` (ID / Color / Name / Group / Mandatory) |
58
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` |
59
60
  | 업무 목록 조회 | `dooray post list <project>` |
60
61
  | 업무 검색 | `dooray post search <project> "<keyword>"` |
61
62
  | 업무 상세 보기 | `dooray post get <project> <number>` |
@@ -65,6 +66,7 @@ dooray doctor # 설정 검증
65
66
  | 업무 워크플로우 변경 | `dooray post workflow <project> <number> <workflow>` |
66
67
  | 댓글 조회 | `dooray post comment list <project> <number>` — `--sort asc\|desc`, `--reverse`, `--latest <n>`, `--since <iso>`, `--from-author <name>` 필터 지원. table 출력은 Creator 이름 자동 채움, `--json`은 raw 유지 (ADR-021) |
67
68
  | 최신 댓글 조회 | `dooray post comment latest <project> <number>` — 최신 댓글 1개 빠른 조회. `-n <N>`으로 N개 지정 |
69
+ | 단일 댓글 조회 | `dooray post comment get <project> <number> <comment-id> --json` — 단일 댓글 본문·메타·attachments 직접 fetch. `comment list` 후 jq 필터 우회 불필요. `--id <postId> --comment-id <id>` / `--url <url> --comment-id <id>` 모드 지원 |
68
70
  | 댓글 추가 | `dooray post comment add <project> <number> --body "..."` 또는 `--body-file <path>` |
69
71
  | 댓글 수정 | `dooray post comment edit <project> <number> <comment-id> --body "..."` 또는 `--body-file <path>` |
70
72
  | 댓글 삭제 | `dooray post comment delete <project> <number> <comment-id>` |
@@ -86,6 +88,10 @@ dooray doctor # 설정 검증
86
88
  | 전체 첨부파일 다운로드 | `dooray post file download-all <project> <number>` |
87
89
  | 첨부파일 업로드 | `dooray post file upload <project> <number> <file-path>` |
88
90
  | 첨부파일 삭제 | `dooray post file delete <project> <number> <file-id>` |
91
+ | 댓글 첨부 목록 | `dooray post comment file list <project> <number> <comment-id>` |
92
+ | 댓글 파일 업로드 | `dooray post comment file upload <project> <number> <comment-id> <path>` |
93
+ | 댓글 파일 다운로드 | `dooray post comment file download <project> <number> <comment-id> <file-id>` |
94
+ | 댓글 파일 삭제 | `dooray post comment file delete <project> <number> <comment-id> <file-id> --yes` |
89
95
 
90
96
  > **제목 옵션 네이밍**: `post` 와 `wiki page` 모두 `--title` 표준. `post`의 `--subject`는 deprecated alias로 당분간 동작하되, 새 코드에서는 `--title` 사용을 권장.
91
97
 
@@ -111,7 +117,8 @@ CLI로 처리 **불가능한** 작업. 아래 항목을 요청받으면 웹 UI
111
117
  3. **업무 번호를 모르면** → `dooray post search <project> "<keyword>"` 로 검색
112
118
  4. **워크플로우 이름을 모르면** → `dooray project workflows <project>` 로 확인
113
119
  5. **멤버 이름을 모르면** → `dooray member list <project>` (또는 `dooray project members <project>`) 로 확인
114
- 6. **결과를 다음 액션에 사용하려면**`--json` 플래그로 구조화된 데이터 획득
120
+ 6. **org 전체 멤버를 찾으려면** → `dooray member search <keyword>` (이름), `--email <addr>`, `--user-code <code>` 중 하나 사용
121
+ 7. **결과를 다음 액션에 사용하려면** → `--json` 플래그로 구조화된 데이터 획득
115
122
 
116
123
  ---
117
124
 
@@ -121,11 +128,11 @@ CLI로 처리 **불가능한** 작업. 아래 항목을 요청받으면 웹 UI
121
128
 
122
129
  ```bash
123
130
  # 1. 업무 검색으로 번호 확인
124
- dooray post search tc-ocr "graceful shutdown" --json
131
+ dooray post search <project> "graceful shutdown" --json
125
132
  # → [{ "number": 42, "subject": "graceful shutdown 구현", ... }]
126
133
 
127
134
  # 2. 완료 처리
128
- dooray post done tc-ocr 42
135
+ dooray post done <project> 42
129
136
  ```
130
137
 
131
138
  ### 프로젝트 찾아서 업무 생성
@@ -146,43 +153,76 @@ dooray post create ai-service-dev \
146
153
 
147
154
  ```bash
148
155
  # 1. 업무 조회
149
- dooray post get tc-ocr 42 --json
156
+ dooray post get <project> 42 --json
150
157
 
151
158
  # 2. 댓글 추가
152
- dooray post comment add tc-ocr 42 --body "진행 상황 업데이트: 80% 완료"
159
+ dooray post comment add <project> 42 --body "진행 상황 업데이트: 80% 완료"
160
+ ```
161
+
162
+ ### 시나리오 — 댓글에 스크린샷 자동 첨부
163
+
164
+ 스크립트가 스크린샷을 댓글에 삽입하거나, 에이전트가 결과 파일을 첨부 댓글로 보고할 때 사용. Dooray REST API 가 댓글 전용 attachment endpoint 를 미지원하므로 내부적으로 post-level files API + 댓글 본문 PUT 합성으로 동작 (ADR-024).
165
+
166
+ ```bash
167
+ # 1. 댓글을 먼저 만든다 (텍스트만, --json 으로 commentId 획득)
168
+ COMMENT_ID=$(dooray post comment add <project> <post-num> --body "스크린샷 보고:" --json | jq -r '.id')
169
+
170
+ # 2. 그 댓글에 파일을 첨부 (post-level 업로드 + 댓글 본문 markdown 자동 추가)
171
+ dooray post comment file upload <project> <post-num> "$COMMENT_ID" ./screenshot.png
153
172
  ```
154
173
 
155
174
  ### 위키 페이지 조회
156
175
 
157
176
  ```bash
158
177
  # 1. 위키 페이지 목록
159
- dooray wiki pages tc-ocr --json
160
- # → [{ "id": "3052841366755571094", "subject": "설계 문서", ... }]
178
+ dooray wiki pages <project> --json
179
+ # → [{ "id": "<pageId>", "subject": "설계 문서", ... }]
161
180
 
162
181
  # 2. 페이지 내용 조회
163
- dooray wiki page get tc-ocr 3052841366755571094 --json
182
+ dooray wiki page get <project> <pageId> --json
164
183
  ```
165
184
 
185
+ ## 단일 댓글 본문 fetch
186
+
187
+ `post comment get <project> <post-number> <comment-id> --json` 으로 단일 댓글의 본문 + attachments 를 곧장 fetch. `comment list` 후 jq 필터링 우회 불필요.
188
+
189
+ 본문 patch 흐름:
190
+ 1. `dooray post comment get <p> <n> <id> --json | jq -r '.body.content' > current.md`
191
+ 2. (편집)
192
+ 3. `dooray post comment edit <p> <n> <id> --body-file current.md --no-confirm` (attachment guard 통과)
193
+
194
+ ---
195
+
196
+ ## 본문 수정 (attachment 보호)
197
+
198
+ `post edit` / `post comment edit` 는 full-replace 방식이다. 자동화에서는 다음 중 하나를 선택:
199
+
200
+ 1. **기존 attachment 보존**:
201
+ - `post edit` 수정 전: `dooray post get <project> <post-number> --json` 으로 `.body.content` 에서 `/files/<id>` 패턴 추출
202
+ - `post comment edit` 수정 전: `dooray post comment list <project> <post-number> --json` 으로 해당 댓글 본문에서 `/files/<id>` 패턴 추출
203
+ 추출한 markdown reference 를 새 본문에 그대로 포함하여 전달
204
+ 2. **명시적 제거**: attachment 가 더 이상 필요 없다고 판단하면 `--no-confirm` 으로 진행. 누락이 의도한 결과임을 명시
205
+
166
206
  ---
167
207
 
168
208
  ## 커맨드 상세
169
209
 
170
- ### 업무 식별 방식 (post 하위 12개 명령 공통, ADR-020)
210
+ ### 업무 식별 방식 (post 하위 16개 명령 공통, ADR-020)
171
211
 
172
- `post get`/`edit`/`done`/`workflow`, `post comment list`/`add`/`edit`/`delete`, `post file list`/`upload`/`download`/`download-all`/`delete`는 4가지 입력을 모두 받는다:
212
+ `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가지 입력을 모두 받는다:
173
213
 
174
214
  ```bash
175
215
  # (1) 기존 positional — 가장 익숙한 형태
176
- dooray post get tc-ocr 42
216
+ dooray post get <project> 42
177
217
 
178
218
  # (2) Dooray URL을 첫 인자로 — 사용자 메시지에서 URL을 그대로 복사할 때 최적
179
- dooray post get https://x.dooray.com/task/to/4319587406666362045
219
+ dooray post get https://x.dooray.com/task/to/<postId>
180
220
 
181
221
  # (3) --id <postId>
182
- dooray post get --id 4319587406666362045
222
+ dooray post get --id <postId>
183
223
 
184
224
  # (4) --url <url>
185
- dooray post get --url https://x.dooray.com/task/to/4319587406666362045
225
+ dooray post get --url https://x.dooray.com/task/to/<postId>
186
226
  ```
187
227
 
188
228
  **우선순위 / 충돌 규칙**: `--id`+`--url` 동시 지정 → 에러. `--id`/`--url`+positional 동시 지정 → 에러. URL/`--id`/`--url` 모드는 standalone API(`getPost(postId)`)로 resolve 단계를 단축.
@@ -214,7 +254,7 @@ dooray post create <project> \
214
254
  --priority normal \ # highest, high, normal, low, lowest
215
255
  --due-date "2026-04-30T18:00:00+09:00" \
216
256
  --tag "버그" --tag "긴급" \ # 반복 지정. mandatory 그룹은 클라이언트 사전 검증
217
- --parent "tc-ocr/337" \ # "code/number" 또는 raw postId 두 형태만 허용
257
+ --parent "<project>/337" \ # "code/number" 또는 raw postId 두 형태만 허용
218
258
  --workflow "진행 중" \ # 이름 또는 class (registered/working/closed). 부분일치 모호 시 후보 + 에러
219
259
  --milestone "Sprint 12"
220
260
  ```
@@ -261,6 +301,24 @@ dooray post comment latest <project> <number>
261
301
 
262
302
  ---
263
303
 
304
+ ## 멘션·링크 자동 삽입 (first-class)
305
+
306
+ `post create`, `post edit`, `post comment add`, `post comment edit` 모두 지원:
307
+
308
+ - `--mention <name>` (반복) — 이름으로 멤버 resolve 후 dooray:// markdown prepend
309
+ - `--mention-group <code>` (반복) — 그룹 코드로 resolve
310
+ - `--link-task <project>/<number>` (반복) — 다른 업무 link 를 본문 끝에 append. 19자리 postId 도 가능
311
+ - `--dry-run` — API 호출 없이 합성 결과만 stdout. CI / 자동화 검증용
312
+
313
+ ```bash
314
+ dooray post comment add P 1 --mention 홍길동 --mention-group 개발 --body "..."
315
+ # 결과 본문: [@홍길동](dooray://orgId/members/m1 "member") [@P/개발](dooray://orgId/member-groups/g1) ...
316
+ ```
317
+
318
+ - 이름 부분일치 지원 (모호하면 에러 + 후보 목록 출력)
319
+ - 멤버 먼저, 그룹 다음 순서 고정
320
+ - interactive (`$EDITOR`) 모드의 `post edit` 는 mention/link-task 무시 + stderr 경고
321
+
264
322
  ## Dooray 마크다운 링크 형식 (멤버·그룹·업무 멘션)
265
323
 
266
324
  댓글/본문 작성 시 다음 형식으로 마크업하면 Dooray 앱이 인식해 inline 멘션·navigation으로 렌더링한다. ID는 본인 환경 값으로 채워 사용 — `dooray member get` / `project groups` / `post get` 등으로 조회.
@@ -295,12 +353,28 @@ dooray post comment latest <project> <number>
295
353
  | ID | 조회 |
296
354
  |---|---|
297
355
  | `orgId` | Dooray 앱/웹 URL에서 추출 (`https://{org}.dooray.com/...`의 도메인 + 별도 확인 필요) |
298
- | `memberId` | `dooray member get <id>` 또는 `dooray project members <project>` |
356
+ | `memberId` | `dooray member get <id>`, `dooray member search <name>`, `--email <addr>`, `--user-code <code>` 등으로 검색 |
299
357
  | `groupId` | `dooray project groups <project>` |
300
358
  | `postId` | `dooray post get <project> <number> --json` 의 `id` 필드 |
301
359
 
302
360
  ---
303
361
 
362
+ ## 피드백 (GitHub Issue 등록)
363
+
364
+ `dooray feedback` 명령으로 dooray-cli GitHub issue를 직접 등록한다 (`gh` CLI 위임).
365
+
366
+ ```bash
367
+ # 논인터랙티브 (non-interactive — 에이전트 자동화용)
368
+ dooray feedback --title "버그 제목" --body "재현 방법" --label "bug"
369
+
370
+ # --last 모드 (직전 에러 자동 첨부 — track-last-run 활성화 필요)
371
+ dooray config set track-last-run true
372
+ dooray feedback --last --title "에러 제목" --body "추가 설명" --dry-run # 미리보기
373
+ dooray feedback --last --title "에러 제목" --body "추가 설명" # 실제 등록
374
+ ```
375
+
376
+ > **참고**: `--last` 모드는 `trackLastRun: true` (ADR-023 opt-in)가 설정된 경우에만 직전 실패 명령이 자동 기록됨. argv는 시크릿 패턴(`--api-key`/`--token`/`Authorization`) 마스킹 후 저장.
377
+
304
378
  ## 에러 핸들링
305
379
 
306
380
  CLI 에러 발생 시 복구 방법: