@bifos/dooray-cli 0.11.0 → 0.13.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 +81 -24
- package/dist/index.js +330 -78
- package/package.json +17 -17
- package/skills/dooray-cli/SKILL.md +96 -33
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bifos/dooray-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.13.0",
|
|
4
4
|
"description": "CLI tool for Dooray project management — AI agent & terminal friendly",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"dooray",
|
|
@@ -11,14 +11,14 @@
|
|
|
11
11
|
],
|
|
12
12
|
"repository": {
|
|
13
13
|
"type": "git",
|
|
14
|
-
"url": "https://github.com/jon890/dooray-cli.git"
|
|
14
|
+
"url": "git+https://github.com/jon890/dooray-cli.git"
|
|
15
15
|
},
|
|
16
16
|
"homepage": "https://github.com/jon890/dooray-cli#readme",
|
|
17
17
|
"bugs": {
|
|
18
18
|
"url": "https://github.com/jon890/dooray-cli/issues"
|
|
19
19
|
},
|
|
20
20
|
"bin": {
|
|
21
|
-
"dooray": "
|
|
21
|
+
"dooray": "dist/index.js"
|
|
22
22
|
},
|
|
23
23
|
"files": [
|
|
24
24
|
"dist",
|
|
@@ -28,6 +28,7 @@
|
|
|
28
28
|
"engines": {
|
|
29
29
|
"node": ">=20"
|
|
30
30
|
},
|
|
31
|
+
"packageManager": "pnpm@11.11.0",
|
|
31
32
|
"scripts": {
|
|
32
33
|
"build": "tsup",
|
|
33
34
|
"dev": "tsup --watch",
|
|
@@ -36,26 +37,25 @@
|
|
|
36
37
|
},
|
|
37
38
|
"license": "MIT",
|
|
38
39
|
"dependencies": {
|
|
39
|
-
"@inquirer/prompts": "^8.
|
|
40
|
+
"@inquirer/prompts": "^8.5.2",
|
|
40
41
|
"chalk": "^5.6.2",
|
|
41
42
|
"cli-table3": "^0.6.5",
|
|
42
|
-
"commander": "^
|
|
43
|
-
"imapflow": "^1.
|
|
44
|
-
"js-yaml": "^
|
|
45
|
-
"ky": "^
|
|
46
|
-
"mailparser": "^3.9.
|
|
47
|
-
"nodemailer": "^
|
|
48
|
-
"ora": "^9.
|
|
49
|
-
"tmp": "^0.2.
|
|
43
|
+
"commander": "^15.0.0",
|
|
44
|
+
"imapflow": "^1.4.6",
|
|
45
|
+
"js-yaml": "^5.2.1",
|
|
46
|
+
"ky": "^2.0.2",
|
|
47
|
+
"mailparser": "^3.9.14",
|
|
48
|
+
"nodemailer": "^9.0.3",
|
|
49
|
+
"ora": "^9.4.1",
|
|
50
|
+
"tmp": "^0.2.7"
|
|
50
51
|
},
|
|
51
52
|
"devDependencies": {
|
|
52
|
-
"@types/js-yaml": "^4.0.9",
|
|
53
53
|
"@types/mailparser": "^3.4.6",
|
|
54
|
-
"@types/node": "^
|
|
55
|
-
"@types/nodemailer": "^
|
|
54
|
+
"@types/node": "^26.1.1",
|
|
55
|
+
"@types/nodemailer": "^8.0.1",
|
|
56
56
|
"@types/tmp": "^0.2.6",
|
|
57
57
|
"tsup": "^8.5.1",
|
|
58
|
-
"typescript": "^
|
|
59
|
-
"vitest": "^4.1.
|
|
58
|
+
"typescript": "^7.0.2",
|
|
59
|
+
"vitest": "^4.1.10"
|
|
60
60
|
}
|
|
61
61
|
}
|
|
@@ -47,8 +47,13 @@ dooray doctor # 설정 검증
|
|
|
47
47
|
|
|
48
48
|
> **공통 (post 하위 16개 명령)**: 아래 명령은 `<project> <number>` 외에도 `--id <postId>`, `--url <url>`, 또는 첫 인자에 Dooray URL 을 직접 받는다.
|
|
49
49
|
> `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`.
|
|
50
|
-
>
|
|
51
|
-
>
|
|
50
|
+
>
|
|
51
|
+
> 지원 URL 형식 3종 (positional 첫 인자 / `--url` 공통):
|
|
52
|
+
> - `https://*.dooray.com/task/to/<postId>`
|
|
53
|
+
> - `https://*.dooray.com/task/<projectId>/<postId>` — 브라우저 주소창 복사본
|
|
54
|
+
> - `https://*.dooray.com/project/tasks/<postId>` — 프로젝트 업무 목록 → 업무 열기
|
|
55
|
+
>
|
|
56
|
+
> **사용자가 URL을 줬으면 그대로 첫 인자로 전달**하는 것이 가장 빠른 경로 (resolve 단계 단축).
|
|
52
57
|
|
|
53
58
|
| 의도 | 커맨드 |
|
|
54
59
|
|------|--------|
|
|
@@ -59,17 +64,17 @@ dooray doctor # 설정 검증
|
|
|
59
64
|
| 프로젝트 멤버 그룹 목록 | `dooray project groups <project>` (ID / Code) |
|
|
60
65
|
| 프로젝트 태그 목록 | `dooray project tags <project>` (ID / Color / Name / Group / Mandatory) |
|
|
61
66
|
| 프로젝트 템플릿 목록 | `dooray project templates <project>` (id / templateName) |
|
|
62
|
-
| 멤버 상세 (organizationMemberId) | `dooray member get <organizationMemberId>` (cache
|
|
67
|
+
| 멤버 상세 (organizationMemberId) | `dooray member get <organizationMemberId>` (cache 우회) |
|
|
63
68
|
| organization 전체 멤버 검색 | `dooray member search <keyword>` (이름 기본), `--email`(이메일 exact), `--user-code`(사번 like), `--user-code-exact`(사번 exact), `--page`/`--size` |
|
|
64
69
|
| 업무 목록 조회 | `dooray post list <project>` |
|
|
65
|
-
| 업무 검색 | `dooray post search <project|projectId> "<keyword>"` — projectId (15+자리 numeric) 직접 입력 시 cache 우회
|
|
66
|
-
| 업무 상세 보기 | `dooray post get <project> <number>` |
|
|
70
|
+
| 업무 검색 | `dooray post search <project|projectId> "<keyword>"` — projectId (15+자리 numeric) 직접 입력 시 cache 우회 |
|
|
71
|
+
| 업무 상세 보기 | `dooray post get <project> <number>` (번호) / `dooray post get --id <postId>` (internal ID) |
|
|
67
72
|
| 업무 생성 | `dooray post create <project> --title "..." [--body "..." \| --body-file <path>]` (`--tag`/`--parent`/`--workflow`/`--milestone` 지원) |
|
|
68
|
-
| 템플릿 기반 업무 생성 | `dooray post create <project> --template <name\|id>` — body/users/tags 자동 채움 (사용자 옵션 우선 override
|
|
73
|
+
| 템플릿 기반 업무 생성 | `dooray post create <project> --template <name\|id>` — body/users/tags 자동 채움 (사용자 옵션 우선 override) |
|
|
69
74
|
| 업무 제목/본문 수정 | `dooray post edit <project> <number> --title "..." --body "..."` 또는 `--body-file <path>` |
|
|
70
75
|
| 업무 완료 처리 | `dooray post done <project> <number>` |
|
|
71
76
|
| 업무 워크플로우 변경 | `dooray post workflow <project> <number> <workflow>` |
|
|
72
|
-
| 댓글 조회 | `dooray post comment list <project> <number>` (`--sort`, `--reverse`, `--latest`, `--since`, `--from-author` 필터. table: Creator 자동 채움, `--json`: raw
|
|
77
|
+
| 댓글 조회 | `dooray post comment list <project> <number>` (`--sort`, `--reverse`, `--latest`, `--since`, `--from-author` 필터. table: Creator 자동 채움, `--json`: raw) |
|
|
73
78
|
| 최신 댓글 조회 | `dooray post comment latest <project> <number>` — 최신 댓글 1개 빠른 조회. `-n <N>`으로 N개 지정 |
|
|
74
79
|
| 단일 댓글 조회 | `dooray post comment get <project> <number> <comment-id>` — 본문·메타·attachments 직접 fetch. `--id`/`--url` + `--comment-id` 모드 지원 |
|
|
75
80
|
| 댓글 추가 | `dooray post comment add <project> <number> --body "..."` 또는 `--body-file <path>` |
|
|
@@ -82,8 +87,9 @@ dooray doctor # 설정 검증
|
|
|
82
87
|
| 위키 페이지 수정 (제목) | `dooray wiki page edit <project> <page-id> --title "..."` |
|
|
83
88
|
| 위키 페이지 수정 (본문) | `dooray wiki page edit <project> <page-id> --body "..."` 또는 `--body-file ./new.md` |
|
|
84
89
|
| 위키 페이지 수정 (에디터) | `dooray wiki page edit <project> <page-id>` (플래그 없으면 $EDITOR 열림) |
|
|
90
|
+
| 위키 페이지 삭제 | `dooray wiki page delete <project> <page-id>` (y/N 확인 기본, `--yes`로 자동화 시 생략. 하위 페이지는 상위 페이지로 재부착) |
|
|
85
91
|
| 위키 페이지 첨부 목록 | `dooray wiki page file list <project> <page-id>` (general + inline 합산, type 컬럼) |
|
|
86
|
-
| 위키 페이지 첨부 업로드 | `dooray wiki page file upload <project> <page-id> --file <path> [--type inline_image]` (multipart type
|
|
92
|
+
| 위키 페이지 첨부 업로드 | `dooray wiki page file upload <project> <page-id> --file <path> [--type inline_image]` (multipart `type` 필드를 `file` 앞에 전송) |
|
|
87
93
|
| 위키 페이지 첨부 다운로드 | `dooray wiki page file download <project> <page-id> --file-id <id> -o <dir>` |
|
|
88
94
|
| 위키 페이지 첨부 일괄 다운로드 | `dooray wiki page file download-all <project> <page-id> -o <dir>` (files + images 전부) |
|
|
89
95
|
| 위키 페이지 첨부 삭제 | `dooray wiki page file delete <project> <page-id> --file-id <id>` (confirm 없음) |
|
|
@@ -99,20 +105,22 @@ dooray doctor # 설정 검증
|
|
|
99
105
|
| 메일 상세 | `dooray mail get <uid>` |
|
|
100
106
|
| 메일 발송 | `dooray mail send --to "..." --subject "..." --body "..."` |
|
|
101
107
|
| 메일 답장 | `dooray mail reply <uid> --body "..."` |
|
|
108
|
+
| 메신저 1:1 다이렉트 메시지 | `dooray messenger send --to "<id\|email>" --body "..."` (`--to`는 id/이메일만, 이름 미지원) |
|
|
109
|
+
| 메신저 대화방 메시지 | `dooray messenger channel-send --channel "<channelId\|이름>" --body "..."` (이름은 자신이 속한 방만 검색) |
|
|
102
110
|
| 첨부파일 목록 | `dooray post file list <project> <number>` |
|
|
103
111
|
| 첨부파일 다운로드 | `dooray post file download <project> <number> <file-id>` |
|
|
104
112
|
| 전체 첨부파일 다운로드 | `dooray post file download-all <project> <number>` |
|
|
105
113
|
| 첨부파일 업로드 | `dooray post file upload <project> <number> <file-path>` |
|
|
106
114
|
| 첨부파일 삭제 | `dooray post file delete <project> <number> <file-id>` |
|
|
107
|
-
| file 명령군 자동화 파싱 | `dooray post file <verb> ... --json` — `download` = `{outputPath,fileName,size}`, `download-all` = `{count,succeeded,failed}` (부분 실패 시 exit 1), `delete` = `{fileId,status}`, `upload` = `res.result` raw
|
|
115
|
+
| file 명령군 자동화 파싱 | `dooray post file <verb> ... --json` — `download` = `{outputPath,fileName,size}`, `download-all` = `{count,succeeded,failed}` (부분 실패 시 exit 1), `delete` = `{fileId,status}`, `upload` = `res.result` raw |
|
|
108
116
|
| 댓글 첨부 목록 | `dooray post comment file list <project> <number> <comment-id>` |
|
|
109
117
|
| 댓글 파일 업로드 | `dooray post comment file upload <project> <number> <comment-id> <path>` |
|
|
110
118
|
| 댓글 파일 다운로드 | `dooray post comment file download <project> <number> <comment-id> <file-id>` |
|
|
111
119
|
| 댓글 파일 삭제 | `dooray post comment file delete <project> <number> <comment-id> <file-id> --yes` |
|
|
112
|
-
| 참조자(cc) 멤버/그룹 추가 | `dooray post edit <project> <number> --cc-group <code>` — 기존 참조자 유지 + 그룹 추가 (dedupe
|
|
120
|
+
| 참조자(cc) 멤버/그룹 추가 | `dooray post edit <project> <number> --cc-group <code>` — 기존 참조자 유지 + 그룹 추가 (dedupe) |
|
|
113
121
|
| 참조자 전체 교체 | `dooray post edit <project> <number> --cc-clear --cc <name>` — 기존 참조자 비우고 신규 멤버만 |
|
|
114
122
|
| 신규 업무 + 그룹 cc | `dooray post create <project> --title "..." --cc-group <code>` — 생성 시 그룹 참조자 포함 |
|
|
115
|
-
| `--cc-group <code\|id>` / `--mention-group <code\|id>` | 그룹 매칭 — 15+자리 numeric → id 직접 / 그 외 → code matchByName (
|
|
123
|
+
| `--cc-group <code\|id>` / `--mention-group <code\|id>` | 그룹 매칭 — 15+자리 numeric → id 직접 / 그 외 → code matchByName (부분일치) |
|
|
116
124
|
| 상위 업무 설정/변경 | `dooray post edit <project> <number> --title "<원제목>" --parent <ref>` (`<ref>`: `<project>/<number>` 또는 raw postId. `--title` 필수, unset 미지원) |
|
|
117
125
|
| `dooray post edit --id <postId> --tag <name>` | 태그 추가 (반복, dedupe) |
|
|
118
126
|
| `dooray post edit --id <postId> --tag-clear --tag <name>` | 태그 전체 교체 |
|
|
@@ -128,10 +136,11 @@ CLI로 처리 **불가능한** 작업. 아래 항목을 요청받으면 웹 UI
|
|
|
128
136
|
|
|
129
137
|
| 작업 | 대체 경로 | 근거 |
|
|
130
138
|
|---|---|---|
|
|
131
|
-
| 위키 페이지
|
|
139
|
+
| 위키 페이지 이동 (상위 페이지 변경) | 웹 UI (`https://{tenant}.dooray.com/wiki/...`) | Dooray REST API 미지원 |
|
|
132
140
|
| 프로젝트 삭제 | 웹 UI (admin 페이지) | API 미지원 |
|
|
133
141
|
|
|
134
|
-
위키 페이지를 잘못 만든 경우(테스트/중복)
|
|
142
|
+
위키 페이지를 잘못 만든 경우(테스트/중복)는 `dooray wiki page delete <project> <page-id>` 로 정리한다.
|
|
143
|
+
공식 문서화된 endpoint 가 아니라 서버 정책이 바뀌면 동작이 달라질 수 있음에 유의한다.
|
|
135
144
|
|
|
136
145
|
---
|
|
137
146
|
|
|
@@ -187,7 +196,7 @@ dooray post comment add <project> 42 --body "진행 상황 업데이트: 80% 완
|
|
|
187
196
|
### 시나리오 — 댓글에 스크린샷 자동 첨부
|
|
188
197
|
|
|
189
198
|
스크립트가 스크린샷을 댓글에 삽입하거나, 에이전트가 결과 파일을 첨부 댓글로 보고할 때 사용.
|
|
190
|
-
Dooray REST API 가 댓글 전용 attachment endpoint 를 미지원하므로 내부적으로 post-level files API + 댓글 본문 PUT 합성으로
|
|
199
|
+
Dooray REST API 가 댓글 전용 attachment endpoint 를 미지원하므로 내부적으로 post-level files API + 댓글 본문 PUT 합성으로 동작한다.
|
|
191
200
|
|
|
192
201
|
```bash
|
|
193
202
|
# 1. 댓글을 먼저 만든다 (텍스트만, --json 으로 commentId 획득)
|
|
@@ -197,6 +206,22 @@ COMMENT_ID=$(dooray post comment add <project> <post-num> --body "스크린샷
|
|
|
197
206
|
dooray post comment file upload <project> <post-num> "$COMMENT_ID" ./screenshot.png
|
|
198
207
|
```
|
|
199
208
|
|
|
209
|
+
### 시나리오 — 배포 알림 메신저 자동 전송
|
|
210
|
+
|
|
211
|
+
CI/배포 스크립트가 완료 알림을 담당자 DM 또는 팀 대화방에 자동으로 보낼 때 사용.
|
|
212
|
+
전송은 API 토큰 소유자 명의로 나가며, 본문은 plain text 만 지원한다.
|
|
213
|
+
|
|
214
|
+
```bash
|
|
215
|
+
# 담당자 DM (id 또는 이메일만 가능 — 이름 검색 미지원)
|
|
216
|
+
dooray messenger send --to "user@example.com" --body "배포가 완료되었습니다 (v1.2.3)."
|
|
217
|
+
|
|
218
|
+
# 팀 대화방 (channelId 또는 자신이 속한 대화방 이름)
|
|
219
|
+
dooray messenger channel-send --channel "배포 알림방" --body-file ./release-note.md
|
|
220
|
+
|
|
221
|
+
# --json 으로 log-id 확인 (자동화 파이프라인에서 후속 처리 시)
|
|
222
|
+
dooray messenger send --to <memberId> --body "..." --json
|
|
223
|
+
```
|
|
224
|
+
|
|
200
225
|
### 위키 페이지 조회
|
|
201
226
|
|
|
202
227
|
```bash
|
|
@@ -208,7 +233,7 @@ dooray wiki pages <project> --json
|
|
|
208
233
|
dooray wiki page get <project> <pageId> --json
|
|
209
234
|
```
|
|
210
235
|
|
|
211
|
-
### 첨부파일 일괄 다운로드 후 실패 분리
|
|
236
|
+
### 첨부파일 일괄 다운로드 후 실패 분리
|
|
212
237
|
|
|
213
238
|
```bash
|
|
214
239
|
# --json 으로 구조화 출력 → jq 로 성공/실패 분리
|
|
@@ -218,7 +243,7 @@ echo "$RESULT" | jq -r '.succeeded[].path'
|
|
|
218
243
|
# exit code 1 이 설정되어 있으면 실패 있는 상태
|
|
219
244
|
```
|
|
220
245
|
|
|
221
|
-
### 위키 페이지 첨부파일 — 스킬 파일 팀 공유
|
|
246
|
+
### 위키 페이지 첨부파일 — 스킬 파일 팀 공유
|
|
222
247
|
|
|
223
248
|
**스킬 파일 팀 공유**: 팀 위키에 스킬 파일 (예: `SKILL.md`) 을 `wiki page file upload` 로 첨부 → 팀원이 `wiki page file download-all` 로 일괄 받아 `~/.claude/skills/` 에 그대로 설치.
|
|
224
249
|
|
|
@@ -233,6 +258,30 @@ dooray wiki page file download-all <project> <page-id> -o ~/.claude/skills/my-sk
|
|
|
233
258
|
dooray wiki page file list <project> <page-id>
|
|
234
259
|
```
|
|
235
260
|
|
|
261
|
+
### 위키 페이지 인라인 이미지 업로드 후 본문 자동 삽입
|
|
262
|
+
|
|
263
|
+
`--type inline_image` 로 업로드 시 `--json` 응답에 `markdownSnippet` 필드가 포함됩니다.
|
|
264
|
+
jq 로 추출해 본문에 바로 삽입하는 자동화가 가능합니다.
|
|
265
|
+
|
|
266
|
+
```bash
|
|
267
|
+
# 1. 인라인 이미지 업로드 — --json 으로 markdownSnippet 추출
|
|
268
|
+
SNIPPET=$(dooray wiki page file upload <project> <page-id> \
|
|
269
|
+
--file ./diagram.png --type inline_image --json \
|
|
270
|
+
| jq -r '.markdownSnippet')
|
|
271
|
+
# SNIPPET = ""
|
|
272
|
+
|
|
273
|
+
# 2. 기존 본문 조회
|
|
274
|
+
CURRENT_BODY=$(dooray wiki page get <project> <page-id> --json | jq -r '.body.content')
|
|
275
|
+
|
|
276
|
+
# 3. snippet 을 본문 끝에 추가해 업데이트
|
|
277
|
+
NEW_BODY="${CURRENT_BODY}
|
|
278
|
+
|
|
279
|
+
${SNIPPET}"
|
|
280
|
+
dooray wiki page edit <project> <page-id> --body "$NEW_BODY"
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
**참고**: `general` 타입은 `markdownSnippet` 없음. `--quiet` 은 id 만 출력 (snippet 미포함).
|
|
284
|
+
|
|
236
285
|
### 위키 페이지 댓글 — 회의록 결정사항 자동 누적
|
|
237
286
|
|
|
238
287
|
**회의록 결정사항 자동 누적**: 회의록 위키 페이지에 자동화 봇이 `wiki page comment add` 로 결정사항을 댓글로 누적, `wiki page comment list --latest 20` 으로 최근 토론 흐름 추적.
|
|
@@ -273,25 +322,39 @@ dooray wiki page comment latest <project> <page-id>
|
|
|
273
322
|
|
|
274
323
|
## 커맨드 상세
|
|
275
324
|
|
|
276
|
-
### 업무 식별 방식 (post 하위 16개 명령
|
|
325
|
+
### 업무 식별 방식 (post 하위 16개 명령 공통)
|
|
277
326
|
|
|
278
327
|
아래 16개 명령은 4가지 입력을 모두 받는다:
|
|
279
328
|
`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`.
|
|
280
329
|
|
|
281
330
|
```bash
|
|
282
|
-
# (1) 기존 positional — 가장 익숙한 형태
|
|
331
|
+
# (1) 기존 positional — 가장 익숙한 형태 (<number> 는 업무 번호 #N)
|
|
283
332
|
dooray post get <project> 42
|
|
284
333
|
|
|
285
334
|
# (2) Dooray URL을 첫 인자로 — 사용자 메시지에서 URL을 그대로 복사할 때 최적
|
|
335
|
+
# 지원 형식 3종 모두 동일하게 작동
|
|
286
336
|
dooray post get https://x.dooray.com/task/to/<postId>
|
|
337
|
+
dooray post get https://x.dooray.com/task/<projectId>/<postId>
|
|
338
|
+
dooray post get https://x.dooray.com/project/tasks/<postId>
|
|
287
339
|
|
|
288
|
-
# (3) --id <postId>
|
|
340
|
+
# (3) --id <postId> — post create 결과의 .id 를 그대로 전달
|
|
289
341
|
dooray post get --id <postId>
|
|
290
342
|
|
|
291
|
-
# (4) --url <url>
|
|
343
|
+
# (4) --url <url> — URL 형식 3종 모두 지원
|
|
292
344
|
dooray post get --url https://x.dooray.com/task/to/<postId>
|
|
293
345
|
```
|
|
294
346
|
|
|
347
|
+
> ⚠️ **`post create` 결과 `.id` 는 internal postId (19자리 숫자)입니다.**
|
|
348
|
+
> 이 숫자를 `<project> <업무번호>` 의 번호 자리에 넣으면 안내 에러가 발생합니다.
|
|
349
|
+
> 후속 조회·수정·댓글은 반드시 **`--id <postId>`** 를 사용하세요.
|
|
350
|
+
>
|
|
351
|
+
> ```bash
|
|
352
|
+
> POST_ID=$(dooray post create <project> --title "..." --json | jq -r '.id')
|
|
353
|
+
> dooray post get --id "$POST_ID" # ✅ --id 사용
|
|
354
|
+
> dooray post comment add --id "$POST_ID" --body "댓글" # ✅ --id 사용
|
|
355
|
+
> # dooray post get <project> "$POST_ID" # ❌ 안내 에러 발생
|
|
356
|
+
> ```
|
|
357
|
+
|
|
295
358
|
**우선순위 / 충돌 규칙**: `--id`+`--url` 동시 지정 → 에러.
|
|
296
359
|
`--id`/`--url`+positional 동시 지정 → 에러.
|
|
297
360
|
URL/`--id`/`--url` 모드는 standalone API(`getPost(postId)`)로 resolve 단계를 단축.
|
|
@@ -350,7 +413,7 @@ dooray post edit <project> <number> --body "새 본문"
|
|
|
350
413
|
dooray post edit <project> <number> --title "새 제목" --body-file ./updated.md
|
|
351
414
|
```
|
|
352
415
|
|
|
353
|
-
### 참조자(cc) / 담당자(to) 변경 — 멤버 · 그룹
|
|
416
|
+
### 참조자(cc) / 담당자(to) 변경 — 멤버 · 그룹
|
|
354
417
|
|
|
355
418
|
```bash
|
|
356
419
|
# 기존 참조자 유지 + 그룹 추가 (dedupe: organizationMemberId / projectMemberGroupId)
|
|
@@ -372,7 +435,7 @@ dooray post edit --id "$POST_ID" --cc-group qa-team --dry-run --json \
|
|
|
372
435
|
|
|
373
436
|
> interactive (`$EDITOR`) 모드에서는 위 옵션이 무시되고 stderr 경고가 출력됩니다.
|
|
374
437
|
|
|
375
|
-
## 동명이인 우회 — 이메일 / memberId 직접
|
|
438
|
+
## 동명이인 우회 — 이메일 / memberId 직접
|
|
376
439
|
|
|
377
440
|
이름이 동일한 멤버가 여러 명이라 `--cc 홍길동` 이 모호로 실패할 때:
|
|
378
441
|
|
|
@@ -390,7 +453,7 @@ dooray post edit --id "$POST_ID" --cc "$MEMBER_ID"
|
|
|
390
453
|
- 이메일 정규형 — searchMembers exact
|
|
391
454
|
- 그 외 — 이름 부분일치
|
|
392
455
|
|
|
393
|
-
## 신규 업무 생성 후 그룹 cc 첨부
|
|
456
|
+
## 신규 업무 생성 후 그룹 cc 첨부
|
|
394
457
|
|
|
395
458
|
자동화 패턴:
|
|
396
459
|
1. audit 리포트 분석
|
|
@@ -411,7 +474,7 @@ dooray post edit --id "$POST_ID" --cc-group qa-team
|
|
|
411
474
|
|
|
412
475
|
---
|
|
413
476
|
|
|
414
|
-
## 자식 업무 먼저 → 후속 부모 지정
|
|
477
|
+
## 자식 업무 먼저 → 후속 부모 지정
|
|
415
478
|
|
|
416
479
|
```bash
|
|
417
480
|
# 1. 자식 업무 생성 (parent 모르고)
|
|
@@ -425,7 +488,7 @@ dooray post edit --id "$CHILD_ID" --title "subtask A" --parent <project>/<parent
|
|
|
425
488
|
|
|
426
489
|
---
|
|
427
490
|
|
|
428
|
-
## 태그 사후 분류 자동화
|
|
491
|
+
## 태그 사후 분류 자동화
|
|
429
492
|
|
|
430
493
|
분류 분석 결과를 받아 태그를 재분류하는 자동화는 단독 호출 패턴이 효율적:
|
|
431
494
|
|
|
@@ -437,7 +500,7 @@ dooray post edit --id "$POST_ID" --tag "분류: $CATEGORY"
|
|
|
437
500
|
```
|
|
438
501
|
|
|
439
502
|
태그만 변경하는 시나리오에서 `--title` / `--body` 강제 없음.
|
|
440
|
-
mandatory 그룹은 친절한 에러 메시지로
|
|
503
|
+
mandatory 그룹은 친절한 에러 메시지로 안내.
|
|
441
504
|
|
|
442
505
|
---
|
|
443
506
|
|
|
@@ -463,7 +526,7 @@ dooray post comment latest <project> <number>
|
|
|
463
526
|
|
|
464
527
|
---
|
|
465
528
|
|
|
466
|
-
## 그룹 멘션 / cc 시 AI agent 동선
|
|
529
|
+
## 그룹 멘션 / cc 시 AI agent 동선
|
|
467
530
|
|
|
468
531
|
자연어 그룹명을 사용자가 지칭했을 때 AI agent 의 의사결정 순서:
|
|
469
532
|
|
|
@@ -481,7 +544,7 @@ dooray post comment latest <project> <number>
|
|
|
481
544
|
AI agent 가 자연어 의도와 가장 가까운 code 선택 후 재시도.
|
|
482
545
|
|
|
483
546
|
3. **모든 컬럼이 빈값일 때 (response shape 이상) 회피**
|
|
484
|
-
-
|
|
547
|
+
- 최근 수정 이후 거의 발생 안 함 (`fetchAllMemberGroups` 가 nested array 정규화)
|
|
485
548
|
- 만약 발생 시: 사용자에게 그룹 id (UI 의 그룹 URL 에서 19자리 numeric) 확인 요청
|
|
486
549
|
- `--cc-group <id>` / `--mention-group <id>` 직접 입력
|
|
487
550
|
- 또는 그룹 멤버를 개별 `--cc <member>` / `--mention <member>` 로 지정
|
|
@@ -565,7 +628,7 @@ dooray feedback --last --title "에러 제목" --body "추가 설명" --dry-run
|
|
|
565
628
|
dooray feedback --last --title "에러 제목" --body "추가 설명" # 실제 등록
|
|
566
629
|
```
|
|
567
630
|
|
|
568
|
-
> **참고**: `--last` 모드는 `trackLastRun: true` (
|
|
631
|
+
> **참고**: `--last` 모드는 `trackLastRun: true` (opt-in)가 설정된 경우에만 직전 실패 명령이 자동 기록됨.
|
|
569
632
|
> argv는 시크릿 패턴(`--api-key`/`--token`/`Authorization`) 마스킹 후 저장.
|
|
570
633
|
|
|
571
634
|
## 에러 핸들링
|
|
@@ -582,7 +645,7 @@ CLI 에러 발생 시 복구 방법:
|
|
|
582
645
|
|
|
583
646
|
---
|
|
584
647
|
|
|
585
|
-
## 정형 task 자동화
|
|
648
|
+
## 정형 task 자동화
|
|
586
649
|
|
|
587
650
|
매주 같은 형식의 task 를 만드는 자동화는 템플릿 + override 패턴이 효율적:
|
|
588
651
|
|
|
@@ -598,7 +661,7 @@ POST_ID=$(dooray post create <project> \
|
|
|
598
661
|
템플릿 본문의 `${year}` / `${month}` 등 매크로는 Dooray 가 자동 치환 (`interpolation=true` 기본).
|
|
599
662
|
사용자 정의 변수는 미지원 — 필요 시 client 측 string replace 로 처리.
|
|
600
663
|
|
|
601
|
-
## projectId 직접 입력 시나리오
|
|
664
|
+
## projectId 직접 입력 시나리오
|
|
602
665
|
|
|
603
666
|
AI agent 가 `member=me` 응답에 없는 프로젝트의 업무를 다뤄야 할 때:
|
|
604
667
|
|
|
@@ -608,13 +671,13 @@ AI agent 가 `member=me` 응답에 없는 프로젝트의 업무를 다뤄야
|
|
|
608
671
|
```
|
|
609
672
|
|
|
610
673
|
2. **사용자가 코드만 줬고 cache 매칭 실패 (member 아닌 프로젝트)**:
|
|
611
|
-
- 에러 메시지의
|
|
674
|
+
- 에러 메시지의 안내 확인
|
|
612
675
|
- 사용자에게 "프로젝트 ID 가 필요합니다 — Dooray UI 의 프로젝트 URL 에서 확인 가능" 요청
|
|
613
676
|
- 또는 `dooray project list --type private` 로 private 캐시 갱신 시도
|
|
614
677
|
|
|
615
678
|
3. **권한 없는 projectId 입력 시**: resolver 통과 후 후속 API 4xx 발생 — 에러 메시지에서 권한 부재 확인 후 사용자에게 보고
|
|
616
679
|
|
|
617
|
-
권한 검증이 resolver 단보다 한 단계 지연되는 trade-off — AI 친화적 자동화
|
|
680
|
+
권한 검증이 resolver 단보다 한 단계 지연되는 trade-off — AI 친화적 자동화 우선.
|
|
618
681
|
|
|
619
682
|
## 캐시
|
|
620
683
|
|