@bifos/dooray-cli 0.15.0 → 0.16.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 +131 -659
- package/dist/index.js +243 -89
- package/package.json +1 -1
- package/skills/dooray-cli/SKILL.md +204 -47
- package/skills/dooray-cli/references/comment.md +21 -17
- package/skills/dooray-cli/references/common.md +22 -20
- package/skills/dooray-cli/references/mention-link.md +49 -73
- package/skills/dooray-cli/references/post.md +76 -149
- package/skills/dooray-cli/references/wiki.md +32 -64
- package/skills/dooray-cli/references/workflow.md +24 -63
- package/skills/dooray-cli/references/intent-map.md +0 -92
package/package.json
CHANGED
|
@@ -5,50 +5,207 @@ description: Dooray 업무 관리 CLI. 프로젝트/업무/댓글/위키 조회
|
|
|
5
5
|
|
|
6
6
|
# dooray-cli
|
|
7
7
|
|
|
8
|
-
NHN Dooray REST API를 래핑한 CLI
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
|
15
|
-
|
|
16
|
-
|
|
|
17
|
-
|
|
|
18
|
-
|
|
|
19
|
-
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
-
|
|
27
|
-
-
|
|
28
|
-
-
|
|
29
|
-
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
8
|
+
NHN Dooray REST API 를 래핑한 CLI 다. 이 파일은 라우터이므로, 작업 영역에 맞는 reference 를 먼저 읽는다.
|
|
9
|
+
|
|
10
|
+
## 어느 reference 를 읽을지
|
|
11
|
+
|
|
12
|
+
| 하려는 일 | reference |
|
|
13
|
+
| --- | --- |
|
|
14
|
+
| 설치·초기 설정, 출력 모드, API 제약, 에러 처리, 캐시, 피드백 등록 | [common.md](references/common.md) |
|
|
15
|
+
| 업무 식별·생성·수정·삭제, 참조자·담당자 변경, 첨부 보호, 부모 지정, 태그 | [post.md](references/post.md) |
|
|
16
|
+
| 업무 댓글 추가·필터·조회 | [comment.md](references/comment.md) |
|
|
17
|
+
| 위키 페이지 조회·트리·삭제, 첨부와 인라인 이미지, 위키 댓글 | [wiki.md](references/wiki.md) |
|
|
18
|
+
| 그룹 멘션·cc 판단, 멘션·링크 자동 삽입, Dooray 마크다운 링크 | [mention-link.md](references/mention-link.md) |
|
|
19
|
+
| 워크플로우 판단 기준, 정형 task 자동화, 명령 체이닝 | [workflow.md](references/workflow.md) |
|
|
20
|
+
|
|
21
|
+
## 대상 지정 방법
|
|
22
|
+
|
|
23
|
+
`post get`/`edit`/`done`/`workflow`, `post comment` 전체, `post file` 전체, `post comment file` 전체,
|
|
24
|
+
`wiki page file` 과 `wiki page comment` 전체, 그리고 `wiki page delete` 가 네 가지 형태를 모두 받는다.
|
|
25
|
+
|
|
26
|
+
- `<project> <number>` — 업무는 번호, 위키는 `<project> <page-id>`
|
|
27
|
+
- `--id <postId>` / `--id <pageId>` — 위키는 `--project` 를 함께 줘야 한다 (API 가 page 단독 조회를 지원하지 않는다)
|
|
28
|
+
- `--url <url>`
|
|
29
|
+
- 첫 인자에 Dooray URL 을 직접
|
|
30
|
+
|
|
31
|
+
받아들이는 URL 형식은 셋이다.
|
|
32
|
+
|
|
33
|
+
- `https://*.dooray.com/task/to/<postId>`
|
|
34
|
+
- `https://*.dooray.com/task/<projectId>/<postId>` — 브라우저 주소창 복사본
|
|
35
|
+
- `https://*.dooray.com/project/tasks/<postId>` — 업무 목록에서 업무를 열었을 때
|
|
36
|
+
|
|
37
|
+
## 실행 규칙
|
|
38
|
+
|
|
39
|
+
- 사용자가 Dooray URL 을 줬으면 그대로 첫 인자로 넘긴다 — resolve 단계를 건너뛰어 가장 빠르다
|
|
40
|
+
- 구조화 결과가 필요하면 `--json`, 다음 명령에 ID 만 넘길 때는 `--quiet` 를 쓴다
|
|
41
|
+
- 조회는 `--json` 으로 먼저 실행해 응답 구조를 확인한 뒤 쓰기 명령으로 넘어간다
|
|
42
|
+
- 쓰기 명령은 대상 ID 를 명시하고, 지원하면 `--dry-run` 으로 먼저 확인한다
|
|
43
|
+
- 이름 기반 조회(멤버·그룹·워크플로우·태그)는 부분일치를 지원한다. 모호하면 에러와 후보 목록이 나오므로 임의로 고르지 말고 사용자에게 확인한다
|
|
44
|
+
- 실패하면 [common.md](references/common.md) 의 에러 처리 표와 대조한다
|
|
45
|
+
|
|
46
|
+
## 파일 명령의 `--json` 스키마
|
|
47
|
+
|
|
48
|
+
`post file` 과 `wiki page file` 이 같은 스키마를 쓴다. 한쪽 파싱 코드를 다른 쪽에 그대로 쓸 수 있다.
|
|
49
|
+
|
|
50
|
+
| 명령 | `--json` | `--quiet` |
|
|
51
|
+
| --- | --- | --- |
|
|
52
|
+
| `upload` | API 응답의 `result` 원형 | `id` |
|
|
53
|
+
| `download` | `{outputPath, fileName, size}` | `outputPath` |
|
|
54
|
+
| `download-all` | `{count, succeeded: [{path, fileName}], failed: [{fileId, error}]}` | — |
|
|
55
|
+
| `delete` | `{fileId, status: "deleted"}` | `fileId` |
|
|
56
|
+
|
|
57
|
+
`download-all` 은 일부만 실패해도 나머지를 계속 내려받고 **종료 코드 1** 을 반환한다.
|
|
58
|
+
성공과 실패를 갈라 처리해야 하므로 종료 코드만 보고 전체 실패로 판단하지 않는다.
|
|
59
|
+
|
|
60
|
+
`wiki page file upload --type inline_image` 는 `--json` 에 `markdownSnippet` 이 더 붙는다.
|
|
61
|
+
본문에 그대로 넣을 수 있는 markdown 이며, `general` 타입과 `--quiet` 에는 없다.
|
|
62
|
+
|
|
63
|
+
## 삭제 명령의 확인 동작
|
|
64
|
+
|
|
65
|
+
여섯 삭제 명령은 같은 안전 확인 정책을 따른다.
|
|
66
|
+
|
|
67
|
+
| 명령 | 확인 | 자동화 |
|
|
68
|
+
| --- | --- | --- |
|
|
69
|
+
| `wiki page delete` | 있음 | `-y`, `--yes` |
|
|
70
|
+
| `post comment file delete` | 있음 | `-y`, `--yes` |
|
|
71
|
+
| `post file delete` | 있음 | `-y`, `--yes` |
|
|
72
|
+
| `wiki page file delete` | 있음 | `-y`, `--yes` |
|
|
73
|
+
| `post comment delete` | 있음 | `-y`, `--yes` |
|
|
74
|
+
| `wiki page comment delete` | 있음 | `-y`, `--yes` |
|
|
75
|
+
|
|
76
|
+
- TTY 확인은 기본값이 아니오다.
|
|
77
|
+
- non-TTY에서 플래그가 없으면 설정 조회나 삭제 API 호출 전에 종료 코드 3으로 중단한다.
|
|
78
|
+
- 자동화에서는 `-y` 또는 `--yes`를 반드시 붙인다.
|
|
79
|
+
|
|
80
|
+
# 의도별 커맨드
|
|
81
|
+
|
|
82
|
+
자연어 요청을 커맨드로 옮길 때 해당 영역의 절만 본다.
|
|
83
|
+
|
|
84
|
+
## 설정
|
|
85
|
+
|
|
86
|
+
| 의도 | 커맨드 |
|
|
87
|
+
| --- | --- |
|
|
88
|
+
| 초기 설정 (대화형) | `dooray setup` |
|
|
89
|
+
|
|
90
|
+
## 프로젝트와 멤버
|
|
91
|
+
|
|
92
|
+
| 의도 | 커맨드 |
|
|
93
|
+
| --- | --- |
|
|
94
|
+
| 프로젝트 찾기 | `dooray project list --search <keyword>` |
|
|
95
|
+
| 개인 프로젝트 목록 | `dooray project list --type private` |
|
|
96
|
+
| 프로젝트 멤버 보기 | `dooray project members <project>` 또는 `dooray member list <project>` |
|
|
97
|
+
| 프로젝트 멤버 그룹 목록 | `dooray project groups <project>` |
|
|
98
|
+
| 프로젝트 태그 목록 | `dooray project tags <project>` |
|
|
99
|
+
| 프로젝트 템플릿 목록 | `dooray project templates <project>` |
|
|
100
|
+
| 멤버 상세 | `dooray member get <organizationMemberId>` (캐시 우회) |
|
|
101
|
+
| organization 전체 멤버 검색 | `dooray member search <keyword>` — 옵션은 [common.md](references/common.md) |
|
|
102
|
+
|
|
103
|
+
## 업무 조회와 생성
|
|
104
|
+
|
|
105
|
+
| 의도 | 커맨드 |
|
|
106
|
+
| --- | --- |
|
|
107
|
+
| 업무 목록 | `dooray post list <project>` |
|
|
108
|
+
| 업무 검색 | `dooray post search <project> "<keyword>"` — projectId(15자리 이상 numeric) 를 넣으면 캐시를 우회한다 |
|
|
109
|
+
| 업무 상세 | `dooray post get <project> <number>` 또는 `dooray post get --id <postId>` |
|
|
110
|
+
| 업무 생성 | `dooray post create <project> --title "..." [--body "..." \| --body-file <path>]` — 담당자는 `--to <name\|email>`, 참조자는 `--cc`, 둘 다 여러 명 가능 |
|
|
111
|
+
| 템플릿으로 생성 | `dooray post create <project> --template <name\|id>` — 본문·담당자·태그가 채워지고 사용자 옵션이 우선한다 |
|
|
112
|
+
| 제목·본문 수정 | `dooray post edit <project> <number> --title "..." --body "..."` |
|
|
113
|
+
| 완료 처리 | `dooray post done <project> <number>` |
|
|
114
|
+
| 워크플로우 변경 | `dooray post workflow <project> <number> <workflow>` |
|
|
115
|
+
|
|
116
|
+
## 업무 메타 변경
|
|
117
|
+
|
|
118
|
+
자세한 동작은 [post.md](references/post.md) 를 읽는다.
|
|
119
|
+
|
|
120
|
+
| 의도 | 커맨드 |
|
|
121
|
+
| --- | --- |
|
|
122
|
+
| 참조자에 그룹 추가 | `dooray post edit <project> <number> --cc-group <code>` — 기존 참조자를 유지하고 추가한다 |
|
|
123
|
+
| 참조자 전체 교체 | `dooray post edit <project> <number> --cc-clear --cc <name>` |
|
|
124
|
+
| 생성 시 그룹 참조자 | `dooray post create <project> --title "..." --cc-group <code>` |
|
|
125
|
+
| 상위 업무 지정·변경 | `dooray post edit <project> <number> --title "<원제목>" --parent <ref>` — `--title` 이 필수이고 해제는 지원하지 않는다 |
|
|
126
|
+
| 태그 추가 | `dooray post edit --id <postId> --tag <name>` (반복 가능, 중복 제거) |
|
|
127
|
+
| 태그 전체 교체 | `dooray post edit --id <postId> --tag-clear --tag <name>` |
|
|
128
|
+
| 태그 제거 | `dooray post edit --id <postId> --tag-remove <name>` |
|
|
129
|
+
|
|
130
|
+
참조자·담당자 옵션만 지정하면 `$EDITOR`를 열지 않고 기존 제목·본문·태그를 보존한 채 참여자만 바꾼다.
|
|
131
|
+
|
|
132
|
+
그룹 지정(`--cc-group`, `--mention-group`)은 15자리 이상 numeric 이면 ID 로, 그 외에는 code 부분일치로 찾는다.
|
|
133
|
+
|
|
134
|
+
## 업무 댓글
|
|
135
|
+
|
|
136
|
+
| 의도 | 커맨드 |
|
|
137
|
+
| --- | --- |
|
|
138
|
+
| 댓글 조회 | `dooray post comment list <project> <number>` — 필터는 [comment.md](references/comment.md) |
|
|
139
|
+
| 최신 댓글 | `dooray post comment latest <project> <number>` (`-n <N>` 으로 개수 지정) |
|
|
140
|
+
| 단일 댓글 | `dooray post comment get <project> <number> <comment-id>` |
|
|
141
|
+
| 댓글 추가 | `dooray post comment add <project> <number> --body "..."` |
|
|
142
|
+
| 댓글 수정 | `dooray post comment edit <project> <number> <comment-id> --body "..."` |
|
|
143
|
+
| 댓글 삭제 | `dooray post comment delete <project> <number> <comment-id>` — 확인 있음, `-y`/`--yes`로 생략 |
|
|
144
|
+
|
|
145
|
+
## 업무 첨부
|
|
146
|
+
|
|
147
|
+
`--json` 출력 스키마는 [post.md](references/post.md) 를 읽는다.
|
|
148
|
+
|
|
149
|
+
| 의도 | 커맨드 |
|
|
150
|
+
| --- | --- |
|
|
151
|
+
| 첨부 목록 | `dooray post file list <project> <number>` |
|
|
152
|
+
| 첨부 다운로드 | `dooray post file download <project> <number> <file-id>` |
|
|
153
|
+
| 첨부 일괄 다운로드 | `dooray post file download-all <project> <number>` |
|
|
154
|
+
| 첨부 업로드 | `dooray post file upload <project> <number> <file-path>` |
|
|
155
|
+
| 첨부 삭제 | `dooray post file delete <project> <number> <file-id>` — 확인 있음, `-y`/`--yes`로 생략 |
|
|
156
|
+
| 댓글 첨부 목록 | `dooray post comment file list <project> <number> <comment-id>` |
|
|
157
|
+
| 댓글 첨부 업로드 | `dooray post comment file upload <project> <number> <comment-id> <path>` |
|
|
158
|
+
| 댓글 첨부 다운로드 | `dooray post comment file download <project> <number> <comment-id> <file-id>` |
|
|
159
|
+
| 댓글 첨부 삭제 | `dooray post comment file delete <project> <number> <comment-id> <file-id>` — 확인 있음, `-y`/`--yes`로 생략 |
|
|
160
|
+
|
|
161
|
+
- 댓글 파일 업로드는 이미지 확장자면 이미지 마크다운을, 그 외에는 일반 링크를 만든다.
|
|
162
|
+
- `comment file list`가 비어도 웹 UI 첨부가 없다고 단정하지 말고 `post file list`로 확인한다.
|
|
163
|
+
|
|
164
|
+
## 위키
|
|
165
|
+
|
|
166
|
+
| 의도 | 커맨드 |
|
|
167
|
+
| --- | --- |
|
|
168
|
+
| 위키 목록 | `dooray wiki list` |
|
|
169
|
+
| 페이지 목록 | `dooray wiki pages <project>` |
|
|
170
|
+
| 페이지 트리 | `dooray wiki tree <project>` (`--depth N` 으로 상한, `--json` 은 flat) |
|
|
171
|
+
| 페이지 상세 | `dooray wiki page get <project> <page-id>` |
|
|
172
|
+
| 페이지 생성 | `dooray wiki page create <project> --title "..." [--parent <page-id>] [--body "..."]` — `--parent` 를 생략하면 위키 home 아래에 만든다 |
|
|
173
|
+
| 페이지 제목 수정 | `dooray wiki page edit <project> <page-id> --title "..."` |
|
|
174
|
+
| 페이지 본문 수정 | `dooray wiki page edit <project> <page-id> --body "..."` 또는 `--body-file ./new.md` |
|
|
175
|
+
| 페이지 에디터로 수정 | `dooray wiki page edit <project> <page-id>` — 플래그가 없으면 `$EDITOR` 가 열린다 |
|
|
176
|
+
| 페이지 삭제 | `dooray wiki page delete <project> <page-id>` — 확인 있음, `-y`/`--yes`로 생략. 하위 페이지는 삭제한 페이지의 부모 아래로 재부착되어 orphan 이 생기지 않는다 |
|
|
177
|
+
| 첨부 목록 | `dooray wiki page file list <project> <page-id>` — general 과 inline 을 합쳐 보여준다 |
|
|
178
|
+
| 첨부 업로드 | `dooray wiki page file upload <project> <page-id> --file <path> [--type inline_image]` |
|
|
179
|
+
| 첨부 다운로드 | `dooray wiki page file download <project> <page-id> --file-id <id> -o <dir>` |
|
|
180
|
+
| 첨부 일괄 다운로드 | `dooray wiki page file download-all <project> <page-id> -o <dir>` |
|
|
181
|
+
| 첨부 삭제 | `dooray wiki page file delete <project> <page-id> --file-id <id>` — 확인 있음, `-y`/`--yes`로 생략 |
|
|
182
|
+
| 댓글 목록 | `dooray wiki page comment list <project> <page-id> [--latest N]` (최신순) |
|
|
183
|
+
| 최신 댓글 | `dooray wiki page comment latest <project> <page-id>` |
|
|
184
|
+
| 단일 댓글 | `dooray wiki page comment get <project> <page-id> <comment-id>` |
|
|
185
|
+
| 댓글 추가 | `dooray wiki page comment add <project> <page-id> --body "..."` (`$EDITOR` fallback) |
|
|
186
|
+
| 댓글 수정 | `dooray wiki page comment edit <project> <page-id> <comment-id> --body "..."` |
|
|
187
|
+
| 댓글 삭제 | `dooray wiki page comment delete <project> <page-id> <comment-id>` — 확인 있음, `-y`/`--yes`로 생략 |
|
|
188
|
+
|
|
189
|
+
## 메일
|
|
190
|
+
|
|
191
|
+
| 의도 | 커맨드 |
|
|
192
|
+
| --- | --- |
|
|
193
|
+
| 메일 목록 | `dooray mail list` |
|
|
194
|
+
| 안 읽은 메일 | `dooray mail list --unread` |
|
|
195
|
+
| 제목 검색 | `dooray mail list --search "<keyword>"` |
|
|
196
|
+
| 메일 상세 | `dooray mail get <uid>` |
|
|
197
|
+
| 메일 발송 | `dooray mail send --to "..." --subject "..." --body "..."` |
|
|
198
|
+
| 메일 답장 | `dooray mail reply <uid> --body "..."` |
|
|
199
|
+
| 저장된 인증정보 제거 | `dooray mail logout` (비대화형 환경은 `--yes`) |
|
|
200
|
+
|
|
201
|
+
## 메신저
|
|
202
|
+
|
|
203
|
+
| 의도 | 커맨드 |
|
|
204
|
+
| --- | --- |
|
|
205
|
+
| 1:1 다이렉트 메시지 | `dooray messenger send --to "<id\|email>" --body "..."` — `--to` 는 ID 나 이메일만 받고 이름은 지원하지 않는다 |
|
|
206
|
+
| 대화방 메시지 | `dooray messenger channel-send --channel "<channelId\|이름>" --body "..."` — 이름으로는 자신이 속한 방만 찾는다 |
|
|
207
|
+
|
|
208
|
+
## 옵션 이름
|
|
209
|
+
|
|
210
|
+
`post` 와 `wiki page` 모두 제목은 `--title` 이다.
|
|
211
|
+
`post` 의 `--subject` 는 deprecated alias 로 아직 동작하지만 경고가 나온다.
|
|
@@ -1,39 +1,43 @@
|
|
|
1
1
|
# comment
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
### 댓글 추가 (non-interactive)
|
|
3
|
+
## 댓글 추가
|
|
6
4
|
|
|
7
5
|
```bash
|
|
8
6
|
dooray post comment add <project> <number> --body "댓글 내용"
|
|
9
7
|
dooray post comment add <project> <number> --body-file ./comment.md
|
|
10
8
|
```
|
|
11
9
|
|
|
10
|
+
## 목록 필터
|
|
12
11
|
|
|
13
|
-
|
|
12
|
+
| 옵션 | 동작 |
|
|
13
|
+
| --- | --- |
|
|
14
|
+
| `--sort <asc\|desc>` | 정렬. 기본 `asc` |
|
|
15
|
+
| `--reverse` | `--sort desc` 의 alias |
|
|
16
|
+
| `--latest <n>` | 최신 N개. `--sort desc` 와 `--size N` 을 합친 단축이며 최대 100 |
|
|
17
|
+
| `--since <iso>` | 이 시각 이후만. ISO 8601 또는 `YYYY-MM-DD` |
|
|
18
|
+
| `--from-author <name>` | 작성자 이름 부분일치 |
|
|
19
|
+
| `--page <n>` / `--size <n>` | 페이지 번호와 크기. 기본 0 과 20 |
|
|
14
20
|
|
|
15
21
|
```bash
|
|
16
|
-
# 최신 5개
|
|
17
22
|
dooray post comment list <project> <number> --latest 5
|
|
18
|
-
# 특정 날짜 이후
|
|
19
23
|
dooray post comment list <project> <number> --since 2026-04-27
|
|
20
|
-
# 작성자 필터
|
|
21
24
|
dooray post comment list <project> <number> --from-author 홍길동
|
|
22
|
-
# 최신 댓글 1개 빠른 조회
|
|
23
|
-
dooray post comment latest <project> <number>
|
|
24
25
|
```
|
|
25
26
|
|
|
27
|
+
table 출력은 Creator 컬럼을 프로젝트 멤버 캐시로 채운다. `--json` 은 raw 응답을 유지한다.
|
|
26
28
|
|
|
27
|
-
|
|
29
|
+
## 단일 댓글 본문 가져오기
|
|
28
30
|
|
|
29
|
-
|
|
31
|
+
`post comment get <project> <number> <comment-id> --json` 으로 본문과 댓글 조회 API가 노출한 파일을 `attachments`로 받는다.
|
|
32
|
+
웹 UI에서 직접 첨부한 파일은 누락될 수 있다.
|
|
33
|
+
`comment list` 를 받아 jq 로 걸러낼 필요가 없다.
|
|
30
34
|
|
|
31
|
-
|
|
35
|
+
상세 파일 조작 규칙과 대체 확인 경로는 [post.md](post.md)를 따른다.
|
|
32
36
|
|
|
33
|
-
|
|
34
|
-
1. `dooray post comment get <p> <n> <id> --json | jq -r '.body.content' > current.md`
|
|
35
|
-
2. (편집)
|
|
36
|
-
3. `dooray post comment edit <p> <n> <id> --body-file current.md --no-confirm` (attachment guard 통과)
|
|
37
|
+
본문을 고칠 때는 이 순서로 한다.
|
|
37
38
|
|
|
38
|
-
|
|
39
|
+
1. `dooray post comment get <p> <n> <id> --json | jq -r '.body.content' > current.md`
|
|
40
|
+
2. 파일을 편집한다
|
|
41
|
+
3. `dooray post comment edit <p> <n> <id> --body-file current.md --no-confirm`
|
|
39
42
|
|
|
43
|
+
3번의 `--no-confirm` 은 첨부 보호 확인을 건너뛴다. 본문에서 기존 첨부 markdown 을 지우지 않았을 때만 쓴다.
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
# common
|
|
2
2
|
|
|
3
|
-
설치, 초기 설정, 출력 모드, Dooray API 제약사항, 피드백 등록, 에러 핸들링, 캐시, projectId 직접 입력을 다룬다.
|
|
4
|
-
|
|
5
3
|
## 설치
|
|
6
4
|
|
|
7
5
|
```bash
|
|
@@ -46,16 +44,9 @@ dooray skill status --quiet # 상태 토큰만 출력
|
|
|
46
44
|
| `unmanaged` | 직접 만든 파일·디렉터리 또는 알 수 없는 링크 | 내용 확인 후 `dooray skill update --force` |
|
|
47
45
|
| `modified` | 관리형 저장소 전환 뒤 사용자 수정이 감지된 상태 | 내용 확인 후 `dooray skill update --force` |
|
|
48
46
|
|
|
49
|
-
`
|
|
50
|
-
스킬은 npm 패키지 경로를 직접 가리키지 않고 관리 저장소를 거쳐 연결된다.
|
|
51
|
-
절대 경로 `XDG_DATA_HOME`이 있으면 `$XDG_DATA_HOME/dooray-cli/skills/`를 사용하고, 없거나 상대 경로이면 `~/.local/share/dooray-cli/skills/`를 사용한다.
|
|
52
|
-
Node 버전 관리자로 전역 npm 설치 경로가 바뀌어도 활성 링크는 관리 저장소를 계속 가리킨다.
|
|
53
|
-
관리되지 않는 기존 항목, 수정된 관리 저장소, 손상된 manifest는 기본적으로 덮어쓰지 않는다.
|
|
54
|
-
`--force`를 사용하면 기존 활성 항목을 `.backup-<timestamp>` 경로로 옮긴 뒤 현재 CLI 스킬 링크로 교체한다.
|
|
55
|
-
같은 관리 저장소 경로가 수정되었거나 손상되었으면 별도 격리 백업을 만든 뒤 새 저장소로 복구한다.
|
|
47
|
+
`--force` 는 기존 항목을 `.backup-<timestamp>` 로 옮긴 뒤 교체한다. 내용을 확인한 다음에만 쓴다.
|
|
56
48
|
|
|
57
|
-
|
|
58
|
-
CLI를 최신 버전으로 다시 설치한 뒤에는 `dooray skill update`를 명시적으로 실행해 새 스킬 파일을 반영한다.
|
|
49
|
+
CLI 를 새 버전으로 설치했으면 `dooray skill update` 를 직접 실행해야 스킬 파일이 갱신된다.
|
|
59
50
|
|
|
60
51
|
## 출력 모드
|
|
61
52
|
|
|
@@ -65,7 +56,21 @@ CLI를 최신 버전으로 다시 설치한 뒤에는 `dooray skill update`를
|
|
|
65
56
|
| `--json` | JSON 출력 (stdout) | 파싱, 체이닝 |
|
|
66
57
|
| `--quiet` | ID만 출력 | 스크립팅 |
|
|
67
58
|
|
|
68
|
-
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## 멤버 검색 (`member search`)
|
|
62
|
+
|
|
63
|
+
organization 전체를 검색한다. 프로젝트 멤버 목록(`project members`)과 달리 프로젝트 범위에 묶이지 않는다.
|
|
64
|
+
|
|
65
|
+
| 옵션 | 동작 |
|
|
66
|
+
| --- | --- |
|
|
67
|
+
| (기본) | 이름으로 검색 |
|
|
68
|
+
| `--email <email>` | 외부 이메일 exact 매칭. 콤마로 여러 개 |
|
|
69
|
+
| `--user-code <code>` | 사번 like 검색 |
|
|
70
|
+
| `--user-code-exact <code>` | 사번 exact 매칭 |
|
|
71
|
+
| `--page <n>` / `--size <n>` | 페이지 번호와 크기. 기본 0 과 20, 최대 100 |
|
|
72
|
+
|
|
73
|
+
`--to` 와 `--cc` 에 넣을 organizationMemberId 를 찾을 때 쓴다.
|
|
69
74
|
|
|
70
75
|
---
|
|
71
76
|
|
|
@@ -78,8 +83,6 @@ CLI로 처리 **불가능한** 작업. 아래 항목을 요청받으면 웹 UI
|
|
|
78
83
|
| 위키 페이지 이동 (상위 페이지 변경) | 웹 UI (`https://{tenant}.dooray.com/wiki/...`) | Dooray REST API 미지원 |
|
|
79
84
|
| 프로젝트 삭제 | 웹 UI (admin 페이지) | API 미지원 |
|
|
80
85
|
|
|
81
|
-
위키 페이지를 잘못 만든 경우(테스트/중복)는 `dooray wiki page delete <project> <page-id>` 로 정리한다.
|
|
82
|
-
공식 문서화된 endpoint 가 아니라 서버 정책이 바뀌면 동작이 달라질 수 있음에 유의한다.
|
|
83
86
|
|
|
84
87
|
---
|
|
85
88
|
|
|
@@ -97,8 +100,6 @@ dooray feedback --last --title "에러 제목" --body "추가 설명" --dry-run
|
|
|
97
100
|
dooray feedback --last --title "에러 제목" --body "추가 설명" # 실제 등록
|
|
98
101
|
```
|
|
99
102
|
|
|
100
|
-
> **참고**: `--last` 모드는 `trackLastRun: true` (opt-in)가 설정된 경우에만 직전 실패 명령이 자동 기록됨.
|
|
101
|
-
> argv는 시크릿 패턴(`--api-key`/`--token`/`Authorization`) 마스킹 후 저장.
|
|
102
103
|
|
|
103
104
|
|
|
104
105
|
## 에러 핸들링
|
|
@@ -112,6 +113,7 @@ CLI 에러 발생 시 복구 방법:
|
|
|
112
113
|
| `멤버를 찾을 수 없습니다: xxx` | 해당 프로젝트에 멤버 없음 | `dooray project members <project>` 로 멤버 목록 확인 |
|
|
113
114
|
| `워크플로우를 찾을 수 없습니다: xxx` | 워크플로우 이름 오류 | `dooray project workflows <project>` 로 확인 |
|
|
114
115
|
| `API 호출 실패 (401)` | API 키 만료/오류 | `dooray doctor` 로 설정 검증 |
|
|
116
|
+
| non-TTY 삭제 실행이 종료 코드 3으로 중단됨 | 삭제 확인용 yes 플래그가 없음 | `-y` 또는 `--yes`를 붙여 다시 실행 |
|
|
115
117
|
|
|
116
118
|
---
|
|
117
119
|
|
|
@@ -129,14 +131,14 @@ AI agent 가 `member=me` 응답에 없는 프로젝트의 업무를 다뤄야
|
|
|
129
131
|
- 사용자에게 "프로젝트 ID 가 필요합니다 — Dooray UI 의 프로젝트 URL 에서 확인 가능" 요청
|
|
130
132
|
- 또는 `dooray project list --type private` 로 private 캐시 갱신 시도
|
|
131
133
|
|
|
132
|
-
3. **권한 없는 projectId
|
|
133
|
-
|
|
134
|
-
권한 검증이 resolver 단보다 한 단계 지연되는 trade-off — AI 친화적 자동화 우선.
|
|
134
|
+
3. **권한 없는 projectId**: 4xx 로 실패한다. 에러 메시지를 사용자에게 그대로 보고한다.
|
|
135
135
|
|
|
136
136
|
|
|
137
137
|
## 캐시
|
|
138
138
|
|
|
139
|
-
|
|
139
|
+
이름 기반 조회 대상(프로젝트·멤버·태그·템플릿 등)은 `~/.dooray/cache/` 에 캐시된다.
|
|
140
|
+
전체 목록과 TTL 은 `docs/data-schema.md` 에 있다.
|
|
141
|
+
|
|
140
142
|
캐시가 오래된 것 같으면:
|
|
141
143
|
|
|
142
144
|
```bash
|
|
@@ -1,104 +1,80 @@
|
|
|
1
1
|
# mention-link
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
## 멘션·링크 옵션
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
`post create`, `post edit`, `post comment add`, `post comment edit` 이 모두 지원한다.
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
부분일치 가능 (예: "AI-Data" → "AI-Data파트" 매칭).
|
|
14
|
-
|
|
15
|
-
2. **부분일치 모호 / 매칭 실패 시 후보 탐색**
|
|
16
|
-
```bash
|
|
17
|
-
dooray project groups <project>
|
|
18
|
-
```
|
|
19
|
-
ID + Code 표 출력.
|
|
20
|
-
AI agent 가 자연어 의도와 가장 가까운 code 선택 후 재시도.
|
|
21
|
-
|
|
22
|
-
3. **모든 컬럼이 빈값일 때 (response shape 이상) 회피**
|
|
23
|
-
- 최근 수정 이후 거의 발생 안 함 (`fetchAllMemberGroups` 가 nested array 정규화)
|
|
24
|
-
- 만약 발생 시: 사용자에게 그룹 id (UI 의 그룹 URL 에서 19자리 numeric) 확인 요청
|
|
25
|
-
- `--cc-group <id>` / `--mention-group <id>` 직접 입력
|
|
26
|
-
- 또는 그룹 멤버를 개별 `--cc <member>` / `--mention <member>` 로 지정
|
|
27
|
-
|
|
28
|
-
4. **모호한 자연어 매핑은 사용자에게 확인**
|
|
29
|
-
- 후보가 여러 개일 때 임의 선택 금지 — 사용자에게 선택지 제시
|
|
30
|
-
- 예: "AI-Data파트 / AI-Data실험팀 — 어느 그룹인가요?"
|
|
31
|
-
|
|
32
|
-
순서 고정 — 멤버 먼저, 그룹 다음 (기존 정책 유지).
|
|
7
|
+
| 옵션 | 동작 |
|
|
8
|
+
| --- | --- |
|
|
9
|
+
| `--mention <name>` | 이름으로 멤버를 찾아 본문 앞에 멘션을 붙인다 (반복 가능) |
|
|
10
|
+
| `--mention-group <code>` | 그룹 코드로 찾아 멘션을 붙인다 (반복 가능) |
|
|
11
|
+
| `--link-task <ref>` | 다른 업무 링크를 본문 끝에 붙인다. `<project>/<number>` 또는 postId (반복 가능) |
|
|
12
|
+
| `--dry-run` | API 를 호출하지 않고 합성된 본문만 stdout 에 출력한다 |
|
|
33
13
|
|
|
14
|
+
```bash
|
|
15
|
+
dooray post comment add <project> 1 --mention 홍길동 --mention-group 개발 --body "..."
|
|
16
|
+
# 본문 앞에: [@홍길동](dooray://<orgId>/members/<memberId> "member") [@<project>/개발](dooray://<orgId>/member-groups/<groupId>)
|
|
17
|
+
```
|
|
34
18
|
|
|
35
|
-
|
|
19
|
+
멘션 순서는 멤버가 먼저, 그룹이 다음으로 고정이다.
|
|
20
|
+
`$EDITOR` 로 여는 interactive 모드의 `post edit` 는 이 옵션들을 무시하고 경고만 낸다.
|
|
36
21
|
|
|
37
|
-
|
|
22
|
+
쓰기 전에 `--dry-run` 으로 합성 결과를 확인하면 잘못된 멤버를 멘션하는 일을 막을 수 있다.
|
|
38
23
|
|
|
39
|
-
|
|
40
|
-
- `--mention-group <code>` (반복) — 그룹 코드로 resolve
|
|
41
|
-
- `--link-task <project>/<number>` (반복) — 다른 업무 link 를 본문 끝에 append. 19자리 postId 도 가능
|
|
42
|
-
- `--dry-run` — API 호출 없이 합성 결과만 stdout. CI / 자동화 검증용
|
|
24
|
+
## 그룹을 못 찾을 때
|
|
43
25
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
# 결과 본문: [@홍길동](dooray://orgId/members/m1 "member") [@P/개발](dooray://orgId/member-groups/g1) ...
|
|
47
|
-
```
|
|
26
|
+
`--mention-group` 과 `--cc-group` 은 code 부분일치로 찾는다 ("AI-Data" → "AI-Data파트").
|
|
27
|
+
실패하거나 후보가 여러 개면 `dooray project groups <project>` 로 ID 와 Code 를 확인한다.
|
|
48
28
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
- interactive (`$EDITOR`) 모드의 `post edit` 는 mention/link-task 무시 + stderr 경고
|
|
29
|
+
후보가 여러 개일 때 임의로 고르지 않고 사용자에게 어느 그룹인지 묻는다.
|
|
30
|
+
code 로 못 찾으면 15자리 이상 numeric ID 를 직접 넣을 수도 있다.
|
|
52
31
|
|
|
32
|
+
## Dooray 마크다운 링크 형식
|
|
53
33
|
|
|
54
|
-
|
|
34
|
+
CLI 옵션(`--mention` 등)을 쓰면 아래 markdown 을 자동으로 만들어 주므로 직접 조립할 필요가 없다.
|
|
35
|
+
본문을 손으로 쓸 때만 이 형식을 쓴다. Dooray 앱이 inline 멘션과 내부 이동으로 렌더링한다.
|
|
55
36
|
|
|
56
|
-
|
|
57
|
-
ID는 본인 환경 값으로 채워 사용 — `dooray member get` / `project groups` / `post get` 등으로 조회.
|
|
37
|
+
### 멤버
|
|
58
38
|
|
|
59
|
-
### 멤버 멘션
|
|
60
39
|
```markdown
|
|
61
40
|
[@본인이름](dooray://{orgId}/members/{memberId} "me")
|
|
62
41
|
[@타인이름](dooray://{orgId}/members/{memberId} "member")
|
|
63
42
|
```
|
|
64
|
-
- title 속성: 본인은 `"me"`, 타인은 `"member"`
|
|
65
|
-
- URL: `dooray://{orgId}/members/{memberId}`
|
|
66
43
|
|
|
67
|
-
|
|
44
|
+
title 은 본인이면 `"me"`, 그 외에는 `"member"` 다.
|
|
45
|
+
|
|
46
|
+
### 그룹
|
|
47
|
+
|
|
68
48
|
```markdown
|
|
69
49
|
[@projectCode/그룹명](dooray://{orgId}/member-groups/{groupId})
|
|
70
50
|
```
|
|
71
|
-
- **`projects/{projectId}/` 경로 포함하지 않음** (직관과 반대 — 흔한 실수)
|
|
72
|
-
- title 속성 **없음**
|
|
73
|
-
- URL: `dooray://{orgId}/member-groups/{groupId}`
|
|
74
51
|
|
|
75
|
-
|
|
52
|
+
`projects/{projectId}/` 경로를 **넣지 않는다** — 직관과 반대라 흔히 틀리는 지점이다.
|
|
53
|
+
title 속성도 없다.
|
|
54
|
+
|
|
55
|
+
### 업무
|
|
56
|
+
|
|
76
57
|
```markdown
|
|
77
58
|
[projectCode/{number} {subject}](dooray://{orgId}/tasks/{postId} "registered")
|
|
78
59
|
```
|
|
79
|
-
- 표시 텍스트: `{project}/{number} {subject}`
|
|
80
|
-
- URL: `dooray://{orgId}/tasks/{postId}`
|
|
81
|
-
- title: workflow class — `registered` / `working` / `closed` / `backlog`
|
|
82
|
-
- 클릭 시 외부 브라우저 안 열고 Dooray 앱 내부 navigation + workflow 상태 표시
|
|
83
60
|
|
|
84
|
-
|
|
61
|
+
title 은 workflow class 다 — `registered` / `working` / `closed` / `backlog`.
|
|
62
|
+
클릭하면 브라우저가 아니라 Dooray 앱 안에서 이동하며 workflow 상태가 함께 보인다.
|
|
63
|
+
|
|
64
|
+
### 위키 페이지
|
|
65
|
+
|
|
85
66
|
```markdown
|
|
86
67
|
[표시텍스트](dooray://{orgId}/pages/{pageId} "publish")
|
|
87
68
|
```
|
|
88
|
-
- URL: `dooray://{orgId}/pages/{pageId}`
|
|
89
|
-
- title: 페이지 상태 (`publish` 등) — 업무 링크의 workflow class 자리에 대응
|
|
90
|
-
- 업무(task) 링크와 대칭 구조
|
|
91
|
-
- `orgId` 동일
|
|
92
|
-
- 경로만 `pages/{pageId}` 로 차이
|
|
93
|
-
|
|
94
|
-
### 필요 ID 조회 명령
|
|
95
|
-
|
|
96
|
-
| ID | 조회 |
|
|
97
|
-
|---|---|
|
|
98
|
-
| `orgId` | Dooray 앱/웹 URL에서 추출 (`https://{org}.dooray.com/...`의 도메인 + 별도 확인 필요) |
|
|
99
|
-
| `memberId` | `dooray member get <id>`, `dooray member search <name>`, `--email <addr>`, `--user-code <code>` 등으로 검색 |
|
|
100
|
-
| `groupId` | `dooray project groups <project>` |
|
|
101
|
-
| `postId` | `dooray post get <project> <number> --json` 의 `id` 필드 |
|
|
102
|
-
| `pageId` | `dooray wiki page get <project> <page-id> --json` 의 `id` 필드 |
|
|
103
69
|
|
|
104
|
-
|
|
70
|
+
업무 링크와 같은 구조이고 경로만 `pages/{pageId}` 로 다르다. title 은 페이지 상태다.
|
|
71
|
+
|
|
72
|
+
### ID 를 얻는 곳
|
|
73
|
+
|
|
74
|
+
| ID | 얻는 방법 |
|
|
75
|
+
| --- | --- |
|
|
76
|
+
| `orgId` | `~/.dooray/cache/me.json` 의 `data.orgId` |
|
|
77
|
+
| `memberId` | `dooray member search <name>` 또는 `dooray member get <id>` |
|
|
78
|
+
| `groupId` | `dooray project groups <project>` |
|
|
79
|
+
| `postId` | `dooray post get <project> <number> --json` 의 `id` |
|
|
80
|
+
| `pageId` | `dooray wiki page get <project> <page-id> --json` 의 `id` |
|