@bifos/dooray-cli 0.13.0 → 0.14.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 +2 -0
- package/dist/index.js +160 -68
- package/package.json +1 -1
- package/skills/dooray-cli/SKILL.md +31 -672
- package/skills/dooray-cli/references/comment.md +39 -0
- package/skills/dooray-cli/references/common.md +111 -0
- package/skills/dooray-cli/references/intent-map.md +92 -0
- package/skills/dooray-cli/references/mention-link.md +104 -0
- package/skills/dooray-cli/references/post.md +218 -0
- package/skills/dooray-cli/references/wiki.md +77 -0
- package/skills/dooray-cli/references/workflow.md +106 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# comment
|
|
2
|
+
|
|
3
|
+
업무 댓글 추가, 목록 필터, 단일 댓글 본문 조회를 다룬다.
|
|
4
|
+
|
|
5
|
+
### 댓글 추가 (non-interactive)
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
dooray post comment add <project> <number> --body "댓글 내용"
|
|
9
|
+
dooray post comment add <project> <number> --body-file ./comment.md
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### 댓글 목록 필터 (non-interactive)
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
# 최신 5개
|
|
17
|
+
dooray post comment list <project> <number> --latest 5
|
|
18
|
+
# 특정 날짜 이후
|
|
19
|
+
dooray post comment list <project> <number> --since 2026-04-27
|
|
20
|
+
# 작성자 필터
|
|
21
|
+
dooray post comment list <project> <number> --from-author 홍길동
|
|
22
|
+
# 최신 댓글 1개 빠른 조회
|
|
23
|
+
dooray post comment latest <project> <number>
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## 단일 댓글 본문 fetch
|
|
30
|
+
|
|
31
|
+
`post comment get <project> <post-number> <comment-id> --json` 으로 단일 댓글의 본문 + attachments 를 곧장 fetch. `comment list` 후 jq 필터링 우회 불필요.
|
|
32
|
+
|
|
33
|
+
본문 patch 흐름:
|
|
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
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# common
|
|
2
|
+
|
|
3
|
+
설치, 초기 설정, 출력 모드, Dooray API 제약사항, 피드백 등록, 에러 핸들링, 캐시, projectId 직접 입력을 다룬다.
|
|
4
|
+
|
|
5
|
+
## 설치
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g @bifos/dooray-cli
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## 초기 설정
|
|
12
|
+
|
|
13
|
+
대화형 마법사로 한 번에 설정:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
dooray setup # API endpoint 선택, API key 입력, 메일 설정까지 대화형으로 진행
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
또는 개별 수동 설정:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
dooray config set base-url https://api.dooray.com
|
|
23
|
+
dooray config set api-key <YOUR_API_TOKEN> # https://{org}.dooray.com/setting/api/token
|
|
24
|
+
dooray doctor # 설정 검증
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## 출력 모드
|
|
28
|
+
|
|
29
|
+
| 플래그 | 설명 | 용도 |
|
|
30
|
+
|--------|------|------|
|
|
31
|
+
| (없음) | 사람이 읽기 좋은 테이블 | 기본 |
|
|
32
|
+
| `--json` | JSON 출력 (stdout) | 파싱, 체이닝 |
|
|
33
|
+
| `--quiet` | ID만 출력 | 스크립팅 |
|
|
34
|
+
|
|
35
|
+
**AI 에이전트는 `--json`을 사용하여 구조화된 데이터를 파싱하라.**
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## 제약사항 (Dooray API 한계)
|
|
40
|
+
|
|
41
|
+
CLI로 처리 **불가능한** 작업. 아래 항목을 요청받으면 웹 UI 사용을 안내할 것.
|
|
42
|
+
|
|
43
|
+
| 작업 | 대체 경로 | 근거 |
|
|
44
|
+
|---|---|---|
|
|
45
|
+
| 위키 페이지 이동 (상위 페이지 변경) | 웹 UI (`https://{tenant}.dooray.com/wiki/...`) | Dooray REST API 미지원 |
|
|
46
|
+
| 프로젝트 삭제 | 웹 UI (admin 페이지) | API 미지원 |
|
|
47
|
+
|
|
48
|
+
위키 페이지를 잘못 만든 경우(테스트/중복)는 `dooray wiki page delete <project> <page-id>` 로 정리한다.
|
|
49
|
+
공식 문서화된 endpoint 가 아니라 서버 정책이 바뀌면 동작이 달라질 수 있음에 유의한다.
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## 피드백 (GitHub Issue 등록)
|
|
54
|
+
|
|
55
|
+
`dooray feedback` 명령으로 dooray-cli GitHub issue를 직접 등록한다 (`gh` CLI 위임).
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
# 논인터랙티브 (non-interactive — 에이전트 자동화용)
|
|
59
|
+
dooray feedback --title "버그 제목" --body "재현 방법" --label "bug"
|
|
60
|
+
|
|
61
|
+
# --last 모드 (직전 에러 자동 첨부 — track-last-run 활성화 필요)
|
|
62
|
+
dooray config set track-last-run true
|
|
63
|
+
dooray feedback --last --title "에러 제목" --body "추가 설명" --dry-run # 미리보기
|
|
64
|
+
dooray feedback --last --title "에러 제목" --body "추가 설명" # 실제 등록
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
> **참고**: `--last` 모드는 `trackLastRun: true` (opt-in)가 설정된 경우에만 직전 실패 명령이 자동 기록됨.
|
|
68
|
+
> argv는 시크릿 패턴(`--api-key`/`--token`/`Authorization`) 마스킹 후 저장.
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
## 에러 핸들링
|
|
72
|
+
|
|
73
|
+
CLI 에러 발생 시 복구 방법:
|
|
74
|
+
|
|
75
|
+
| 에러 메시지 | 원인 | 복구 방법 |
|
|
76
|
+
|------------|------|-----------|
|
|
77
|
+
| `프로젝트를 찾을 수 없습니다: xxx` | 프로젝트 코드/ID 오류 | `dooray project list --search "xxx"` 로 정확한 코드 확인 |
|
|
78
|
+
| `복수의 멤버가 매칭됩니다: "김"` | 이름이 모호함 | 에러 메시지의 후보 목록에서 정확한 이름으로 재시도 |
|
|
79
|
+
| `멤버를 찾을 수 없습니다: xxx` | 해당 프로젝트에 멤버 없음 | `dooray project members <project>` 로 멤버 목록 확인 |
|
|
80
|
+
| `워크플로우를 찾을 수 없습니다: xxx` | 워크플로우 이름 오류 | `dooray project workflows <project>` 로 확인 |
|
|
81
|
+
| `API 호출 실패 (401)` | API 키 만료/오류 | `dooray doctor` 로 설정 검증 |
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## projectId 직접 입력 시나리오
|
|
86
|
+
|
|
87
|
+
AI agent 가 `member=me` 응답에 없는 프로젝트의 업무를 다뤄야 할 때:
|
|
88
|
+
|
|
89
|
+
1. **사용자가 projectId (15+자리 numeric) 를 줬으면 그대로 명령에 사용**:
|
|
90
|
+
```bash
|
|
91
|
+
dooray post search 1234567890123456789 "keyword"
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
2. **사용자가 코드만 줬고 cache 매칭 실패 (member 아닌 프로젝트)**:
|
|
95
|
+
- 에러 메시지의 안내 확인
|
|
96
|
+
- 사용자에게 "프로젝트 ID 가 필요합니다 — Dooray UI 의 프로젝트 URL 에서 확인 가능" 요청
|
|
97
|
+
- 또는 `dooray project list --type private` 로 private 캐시 갱신 시도
|
|
98
|
+
|
|
99
|
+
3. **권한 없는 projectId 입력 시**: resolver 통과 후 후속 API 4xx 발생 — 에러 메시지에서 권한 부재 확인 후 사용자에게 보고
|
|
100
|
+
|
|
101
|
+
권한 검증이 resolver 단보다 한 단계 지연되는 trade-off — AI 친화적 자동화 우선.
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
## 캐시
|
|
105
|
+
|
|
106
|
+
프로젝트, 멤버, 워크플로우, 위키 정보는 `~/.dooray/cache/`에 캐시된다.
|
|
107
|
+
캐시가 오래된 것 같으면:
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
dooray cache clear # 전체 캐시 삭제 (다음 실행 시 자동 갱신)
|
|
111
|
+
```
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# intent-map
|
|
2
|
+
|
|
3
|
+
자연어 요청을 dooray-cli 커맨드로 변환할 때 참고하는 마스터 표.
|
|
4
|
+
|
|
5
|
+
## 의도 → 커맨드 매핑
|
|
6
|
+
|
|
7
|
+
자연어 요청을 커맨드로 변환할 때 아래 표를 참고한다.
|
|
8
|
+
|
|
9
|
+
> **공통 (post 하위 16개 명령)**: 아래 명령은 `<project> <number>` 외에도 `--id <postId>`, `--url <url>`, 또는 첫 인자에 Dooray URL 을 직접 받는다.
|
|
10
|
+
> `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`.
|
|
11
|
+
>
|
|
12
|
+
> 지원 URL 형식 3종 (positional 첫 인자 / `--url` 공통):
|
|
13
|
+
> - `https://*.dooray.com/task/to/<postId>`
|
|
14
|
+
> - `https://*.dooray.com/task/<projectId>/<postId>` — 브라우저 주소창 복사본
|
|
15
|
+
> - `https://*.dooray.com/project/tasks/<postId>` — 프로젝트 업무 목록 → 업무 열기
|
|
16
|
+
>
|
|
17
|
+
> **사용자가 URL을 줬으면 그대로 첫 인자로 전달**하는 것이 가장 빠른 경로 (resolve 단계 단축).
|
|
18
|
+
|
|
19
|
+
| 의도 | 커맨드 |
|
|
20
|
+
|------|--------|
|
|
21
|
+
| 초기 설정 (대화형) | `dooray setup` |
|
|
22
|
+
| 프로젝트 찾기 | `dooray project list --search <keyword>` |
|
|
23
|
+
| 개인 프로젝트 목록 | `dooray project list --type private` |
|
|
24
|
+
| 프로젝트 멤버 보기 | `dooray project members <project>` 또는 `dooray member list <project>` (이름·organizationMemberId) |
|
|
25
|
+
| 프로젝트 멤버 그룹 목록 | `dooray project groups <project>` (ID / Code) |
|
|
26
|
+
| 프로젝트 태그 목록 | `dooray project tags <project>` (ID / Color / Name / Group / Mandatory) |
|
|
27
|
+
| 프로젝트 템플릿 목록 | `dooray project templates <project>` (id / templateName) |
|
|
28
|
+
| 멤버 상세 (organizationMemberId) | `dooray member get <organizationMemberId>` (cache 우회) |
|
|
29
|
+
| organization 전체 멤버 검색 | `dooray member search <keyword>` (이름 기본), `--email`(이메일 exact), `--user-code`(사번 like), `--user-code-exact`(사번 exact), `--page`/`--size` |
|
|
30
|
+
| 업무 목록 조회 | `dooray post list <project>` |
|
|
31
|
+
| 업무 검색 | `dooray post search <project|projectId> "<keyword>"` — projectId (15+자리 numeric) 직접 입력 시 cache 우회 |
|
|
32
|
+
| 업무 상세 보기 | `dooray post get <project> <number>` (번호) / `dooray post get --id <postId>` (internal ID) |
|
|
33
|
+
| 업무 생성 | `dooray post create <project> --title "..." [--body "..." \| --body-file <path>]` (`--tag`/`--parent`/`--workflow`/`--milestone` 지원) |
|
|
34
|
+
| 템플릿 기반 업무 생성 | `dooray post create <project> --template <name\|id>` — body/users/tags 자동 채움 (사용자 옵션 우선 override) |
|
|
35
|
+
| 업무 제목/본문 수정 | `dooray post edit <project> <number> --title "..." --body "..."` 또는 `--body-file <path>` |
|
|
36
|
+
| 업무 완료 처리 | `dooray post done <project> <number>` |
|
|
37
|
+
| 업무 워크플로우 변경 | `dooray post workflow <project> <number> <workflow>` |
|
|
38
|
+
| 댓글 조회 | `dooray post comment list <project> <number>` (`--sort`, `--reverse`, `--latest`, `--since`, `--from-author` 필터. table: Creator 자동 채움, `--json`: raw) |
|
|
39
|
+
| 최신 댓글 조회 | `dooray post comment latest <project> <number>` — 최신 댓글 1개 빠른 조회. `-n <N>`으로 N개 지정 |
|
|
40
|
+
| 단일 댓글 조회 | `dooray post comment get <project> <number> <comment-id>` — 본문·메타·attachments 직접 fetch. `--id`/`--url` + `--comment-id` 모드 지원 |
|
|
41
|
+
| 댓글 추가 | `dooray post comment add <project> <number> --body "..."` 또는 `--body-file <path>` |
|
|
42
|
+
| 댓글 수정 | `dooray post comment edit <project> <number> <comment-id> --body "..."` 또는 `--body-file <path>` |
|
|
43
|
+
| 댓글 삭제 | `dooray post comment delete <project> <number> <comment-id>` |
|
|
44
|
+
| 위키 목록 | `dooray wiki list` |
|
|
45
|
+
| 위키 페이지 목록 | `dooray wiki pages <project>` |
|
|
46
|
+
| 위키 페이지 트리 | `dooray wiki tree <project>` (계층 트리, `--depth N` 상한, `--json` 은 flat) |
|
|
47
|
+
| 위키 페이지 상세 | `dooray wiki page get <project> <page-id>` |
|
|
48
|
+
| 위키 페이지 생성 | `dooray wiki page create <project> --title "..." [--parent <page-id>] [--body "..."]` (--parent 생략 시 위키 home 페이지 아래 생성) |
|
|
49
|
+
| 위키 페이지 수정 (제목) | `dooray wiki page edit <project> <page-id> --title "..."` |
|
|
50
|
+
| 위키 페이지 수정 (본문) | `dooray wiki page edit <project> <page-id> --body "..."` 또는 `--body-file ./new.md` |
|
|
51
|
+
| 위키 페이지 수정 (에디터) | `dooray wiki page edit <project> <page-id>` (플래그 없으면 $EDITOR 열림) |
|
|
52
|
+
| 위키 페이지 삭제 | `dooray wiki page delete <project> <page-id>` (y/N 확인 기본, `--yes`로 자동화 시 생략. 하위 페이지는 상위 페이지로 재부착) |
|
|
53
|
+
| 위키 페이지 첨부 목록 | `dooray wiki page file list <project> <page-id>` (general + inline 합산, type 컬럼) |
|
|
54
|
+
| 위키 페이지 첨부 업로드 | `dooray wiki page file upload <project> <page-id> --file <path> [--type inline_image]` (multipart `type` 필드를 `file` 앞에 전송) |
|
|
55
|
+
| 위키 페이지 첨부 다운로드 | `dooray wiki page file download <project> <page-id> --file-id <id> -o <dir>` |
|
|
56
|
+
| 위키 페이지 첨부 일괄 다운로드 | `dooray wiki page file download-all <project> <page-id> -o <dir>` (files + images 전부) |
|
|
57
|
+
| 위키 페이지 첨부 삭제 | `dooray wiki page file delete <project> <page-id> --file-id <id>` (confirm 없음) |
|
|
58
|
+
| 위키 페이지 댓글 목록 | `dooray wiki page comment list <project> <page-id> [--latest N]` (최신순) |
|
|
59
|
+
| 위키 페이지 최신 댓글 | `dooray wiki page comment latest <project> <page-id>` |
|
|
60
|
+
| 위키 페이지 댓글 조회 | `dooray wiki page comment get <project> <page-id> <comment-id>` |
|
|
61
|
+
| 위키 페이지 댓글 추가 | `dooray wiki page comment add <project> <page-id> --body "..."` ($EDITOR fallback) |
|
|
62
|
+
| 위키 페이지 댓글 수정 | `dooray wiki page comment edit <project> <page-id> <comment-id> --body "..."` |
|
|
63
|
+
| 위키 페이지 댓글 삭제 | `dooray wiki page comment delete <project> <page-id> <comment-id>` (confirm 없음) |
|
|
64
|
+
| 메일 목록 조회 | `dooray mail list` |
|
|
65
|
+
| 안읽은 메일 | `dooray mail list --unread` |
|
|
66
|
+
| 메일 제목 검색 | `dooray mail list --search "<keyword>"` |
|
|
67
|
+
| 메일 상세 | `dooray mail get <uid>` |
|
|
68
|
+
| 메일 발송 | `dooray mail send --to "..." --subject "..." --body "..."` |
|
|
69
|
+
| 메일 답장 | `dooray mail reply <uid> --body "..."` |
|
|
70
|
+
| 메신저 1:1 다이렉트 메시지 | `dooray messenger send --to "<id\|email>" --body "..."` (`--to`는 id/이메일만, 이름 미지원) |
|
|
71
|
+
| 메신저 대화방 메시지 | `dooray messenger channel-send --channel "<channelId\|이름>" --body "..."` (이름은 자신이 속한 방만 검색) |
|
|
72
|
+
| 첨부파일 목록 | `dooray post file list <project> <number>` |
|
|
73
|
+
| 첨부파일 다운로드 | `dooray post file download <project> <number> <file-id>` |
|
|
74
|
+
| 전체 첨부파일 다운로드 | `dooray post file download-all <project> <number>` |
|
|
75
|
+
| 첨부파일 업로드 | `dooray post file upload <project> <number> <file-path>` |
|
|
76
|
+
| 첨부파일 삭제 | `dooray post file delete <project> <number> <file-id>` |
|
|
77
|
+
| file 명령군 자동화 파싱 | `dooray post file <verb> ... --json` — `download` = `{outputPath,fileName,size}`, `download-all` = `{count,succeeded,failed}` (부분 실패 시 exit 1), `delete` = `{fileId,status}`, `upload` = `res.result` raw |
|
|
78
|
+
| 댓글 첨부 목록 | `dooray post comment file list <project> <number> <comment-id>` |
|
|
79
|
+
| 댓글 파일 업로드 | `dooray post comment file upload <project> <number> <comment-id> <path>` |
|
|
80
|
+
| 댓글 파일 다운로드 | `dooray post comment file download <project> <number> <comment-id> <file-id>` |
|
|
81
|
+
| 댓글 파일 삭제 | `dooray post comment file delete <project> <number> <comment-id> <file-id> --yes` |
|
|
82
|
+
| 참조자(cc) 멤버/그룹 추가 | `dooray post edit <project> <number> --cc-group <code>` — 기존 참조자 유지 + 그룹 추가 (dedupe) |
|
|
83
|
+
| 참조자 전체 교체 | `dooray post edit <project> <number> --cc-clear --cc <name>` — 기존 참조자 비우고 신규 멤버만 |
|
|
84
|
+
| 신규 업무 + 그룹 cc | `dooray post create <project> --title "..." --cc-group <code>` — 생성 시 그룹 참조자 포함 |
|
|
85
|
+
| `--cc-group <code\|id>` / `--mention-group <code\|id>` | 그룹 매칭 — 15+자리 numeric → id 직접 / 그 외 → code matchByName (부분일치) |
|
|
86
|
+
| 상위 업무 설정/변경 | `dooray post edit <project> <number> --title "<원제목>" --parent <ref>` (`<ref>`: `<project>/<number>` 또는 raw postId. `--title` 필수, unset 미지원) |
|
|
87
|
+
| `dooray post edit --id <postId> --tag <name>` | 태그 추가 (반복, dedupe) |
|
|
88
|
+
| `dooray post edit --id <postId> --tag-clear --tag <name>` | 태그 전체 교체 |
|
|
89
|
+
| `dooray post edit --id <postId> --tag-remove <name>` | 특정 태그 제거 |
|
|
90
|
+
|
|
91
|
+
> **제목 옵션 네이밍**: `post` 와 `wiki page` 모두 `--title` 표준. `post`의 `--subject`는 deprecated alias로 당분간 동작하되, 새 코드에서는 `--title` 사용을 권장.
|
|
92
|
+
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# mention-link
|
|
2
|
+
|
|
3
|
+
그룹 멘션/cc 의사결정, 멘션·링크 자동 삽입, Dooray 마크다운 링크 형식(멤버/그룹/업무/위키 페이지)을 다룬다.
|
|
4
|
+
|
|
5
|
+
## 그룹 멘션 / cc 시 AI agent 동선
|
|
6
|
+
|
|
7
|
+
자연어 그룹명을 사용자가 지칭했을 때 AI agent 의 의사결정 순서:
|
|
8
|
+
|
|
9
|
+
1. **사용자가 명확한 code 를 줬으면 바로 시도**
|
|
10
|
+
```bash
|
|
11
|
+
dooray post create <project> --mention-group "<code>"
|
|
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
|
+
순서 고정 — 멤버 먼저, 그룹 다음 (기존 정책 유지).
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
## 멘션·링크 자동 삽입 (first-class)
|
|
36
|
+
|
|
37
|
+
`post create`, `post edit`, `post comment add`, `post comment edit` 모두 지원:
|
|
38
|
+
|
|
39
|
+
- `--mention <name>` (반복) — 이름으로 멤버 resolve 후 dooray:// markdown prepend
|
|
40
|
+
- `--mention-group <code>` (반복) — 그룹 코드로 resolve
|
|
41
|
+
- `--link-task <project>/<number>` (반복) — 다른 업무 link 를 본문 끝에 append. 19자리 postId 도 가능
|
|
42
|
+
- `--dry-run` — API 호출 없이 합성 결과만 stdout. CI / 자동화 검증용
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
dooray post comment add P 1 --mention 홍길동 --mention-group 개발 --body "..."
|
|
46
|
+
# 결과 본문: [@홍길동](dooray://orgId/members/m1 "member") [@P/개발](dooray://orgId/member-groups/g1) ...
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
- 이름 부분일치 지원 (모호하면 에러 + 후보 목록 출력)
|
|
50
|
+
- 멤버 먼저, 그룹 다음 순서 고정
|
|
51
|
+
- interactive (`$EDITOR`) 모드의 `post edit` 는 mention/link-task 무시 + stderr 경고
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
## Dooray 마크다운 링크 형식 (멤버·그룹·업무·위키 페이지 멘션)
|
|
55
|
+
|
|
56
|
+
댓글/본문 작성 시 다음 형식으로 마크업하면 Dooray 앱이 인식해 inline 멘션·navigation으로 렌더링한다.
|
|
57
|
+
ID는 본인 환경 값으로 채워 사용 — `dooray member get` / `project groups` / `post get` 등으로 조회.
|
|
58
|
+
|
|
59
|
+
### 멤버 멘션
|
|
60
|
+
```markdown
|
|
61
|
+
[@본인이름](dooray://{orgId}/members/{memberId} "me")
|
|
62
|
+
[@타인이름](dooray://{orgId}/members/{memberId} "member")
|
|
63
|
+
```
|
|
64
|
+
- title 속성: 본인은 `"me"`, 타인은 `"member"`
|
|
65
|
+
- URL: `dooray://{orgId}/members/{memberId}`
|
|
66
|
+
|
|
67
|
+
### 그룹 멘션 (member-group)
|
|
68
|
+
```markdown
|
|
69
|
+
[@projectCode/그룹명](dooray://{orgId}/member-groups/{groupId})
|
|
70
|
+
```
|
|
71
|
+
- **`projects/{projectId}/` 경로 포함하지 않음** (직관과 반대 — 흔한 실수)
|
|
72
|
+
- title 속성 **없음**
|
|
73
|
+
- URL: `dooray://{orgId}/member-groups/{groupId}`
|
|
74
|
+
|
|
75
|
+
### 업무(task) 링크
|
|
76
|
+
```markdown
|
|
77
|
+
[projectCode/{number} {subject}](dooray://{orgId}/tasks/{postId} "registered")
|
|
78
|
+
```
|
|
79
|
+
- 표시 텍스트: `{project}/{number} {subject}`
|
|
80
|
+
- URL: `dooray://{orgId}/tasks/{postId}`
|
|
81
|
+
- title: workflow class — `registered` / `working` / `closed` / `backlog`
|
|
82
|
+
- 클릭 시 외부 브라우저 안 열고 Dooray 앱 내부 navigation + workflow 상태 표시
|
|
83
|
+
|
|
84
|
+
### 위키 페이지 링크
|
|
85
|
+
```markdown
|
|
86
|
+
[표시텍스트](dooray://{orgId}/pages/{pageId} "publish")
|
|
87
|
+
```
|
|
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
|
+
|
|
104
|
+
---
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
# post
|
|
2
|
+
|
|
3
|
+
업무(post) 식별 방식, 생성, 수정, 참조자/담당자 변경, 본문 수정 시 attachment 보호, 동명이인 우회, 부모 업무 지정, 태그 자동화를 다룬다.
|
|
4
|
+
|
|
5
|
+
## 커맨드 상세
|
|
6
|
+
|
|
7
|
+
### 업무 식별 방식 (post 하위 16개 명령 공통)
|
|
8
|
+
|
|
9
|
+
아래 16개 명령은 4가지 입력을 모두 받는다:
|
|
10
|
+
`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`.
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
# (1) 기존 positional — 가장 익숙한 형태 (<number> 는 업무 번호 #N)
|
|
14
|
+
dooray post get <project> 42
|
|
15
|
+
|
|
16
|
+
# (2) Dooray URL을 첫 인자로 — 사용자 메시지에서 URL을 그대로 복사할 때 최적
|
|
17
|
+
# 지원 형식 3종 모두 동일하게 작동
|
|
18
|
+
dooray post get https://x.dooray.com/task/to/<postId>
|
|
19
|
+
dooray post get https://x.dooray.com/task/<projectId>/<postId>
|
|
20
|
+
dooray post get https://x.dooray.com/project/tasks/<postId>
|
|
21
|
+
|
|
22
|
+
# (3) --id <postId> — post create 결과의 .id 를 그대로 전달
|
|
23
|
+
dooray post get --id <postId>
|
|
24
|
+
|
|
25
|
+
# (4) --url <url> — URL 형식 3종 모두 지원
|
|
26
|
+
dooray post get --url https://x.dooray.com/task/to/<postId>
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
> ⚠️ **`post create` 결과 `.id` 는 internal postId (19자리 숫자)입니다.**
|
|
30
|
+
> 이 숫자를 `<project> <업무번호>` 의 번호 자리에 넣으면 안내 에러가 발생합니다.
|
|
31
|
+
> 후속 조회·수정·댓글은 반드시 **`--id <postId>`** 를 사용하세요.
|
|
32
|
+
>
|
|
33
|
+
> ```bash
|
|
34
|
+
> POST_ID=$(dooray post create <project> --title "..." --json | jq -r '.id')
|
|
35
|
+
> dooray post get --id "$POST_ID" # ✅ --id 사용
|
|
36
|
+
> dooray post comment add --id "$POST_ID" --body "댓글" # ✅ --id 사용
|
|
37
|
+
> # dooray post get <project> "$POST_ID" # ❌ 안내 에러 발생
|
|
38
|
+
> ```
|
|
39
|
+
|
|
40
|
+
**우선순위 / 충돌 규칙**: `--id`+`--url` 동시 지정 → 에러.
|
|
41
|
+
`--id`/`--url`+positional 동시 지정 → 에러.
|
|
42
|
+
URL/`--id`/`--url` 모드는 standalone API(`getPost(postId)`)로 resolve 단계를 단축.
|
|
43
|
+
|
|
44
|
+
**sub-id 옵션화** (URL/`--id`/`--url` 모드에서 필수):
|
|
45
|
+
```bash
|
|
46
|
+
# comment edit/delete: --comment-id
|
|
47
|
+
dooray post comment edit --url <url> --comment-id <commentId> --body "..."
|
|
48
|
+
dooray post comment delete --url <url> --comment-id <commentId>
|
|
49
|
+
|
|
50
|
+
# file download/delete: --file-id
|
|
51
|
+
dooray post file download --url <url> --file-id <fileId> -o ./downloads
|
|
52
|
+
dooray post file delete --url <url> --file-id <fileId>
|
|
53
|
+
|
|
54
|
+
# file upload: --file (로컬 경로)
|
|
55
|
+
dooray post file upload --url <url> --file ./report.pdf
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
기존 positional 3-arg(`comment edit <project> <number> <comment-id>`, `file upload <project> <number> <path>`)는 그대로 유지.
|
|
59
|
+
|
|
60
|
+
### 업무 생성 (non-interactive)
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
dooray post create <project> \
|
|
64
|
+
--title "제목" \
|
|
65
|
+
--body "본문 마크다운" \
|
|
66
|
+
--to "담당자이름" \ # 여러 명: --to "김철수" --to "이영희"
|
|
67
|
+
--cc "참조자이름" \
|
|
68
|
+
--priority normal \ # highest, high, normal, low, lowest
|
|
69
|
+
--due-date "2026-04-30T18:00:00+09:00" \
|
|
70
|
+
--tag "버그" --tag "긴급" \ # 반복 지정. mandatory 그룹은 클라이언트 사전 검증
|
|
71
|
+
--parent "<project>/337" \ # "code/number" 또는 raw postId 두 형태만 허용
|
|
72
|
+
--workflow "진행 중" \ # 이름 또는 class (registered/working/closed). 부분일치 모호 시 후보 + 에러
|
|
73
|
+
--milestone "Sprint 12"
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
본문이 길면 파일로 (`--body`와 `--body-file`은 함께 사용 불가):
|
|
77
|
+
```bash
|
|
78
|
+
dooray post create <project> --title "제목" --body-file ./content.md
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
> **`--workflow` 동작 주의**: 워크플로우 설정은 post 생성 *후속* 호출.
|
|
82
|
+
> resolve/설정에 실패해도 stderr 경고만 출력되고 **exit code는 0** (post는 이미 생성됨).
|
|
83
|
+
> 자동화 스크립트에서 워크플로우 적용 여부를 보장해야 하면 stderr를 별도 점검할 것.
|
|
84
|
+
|
|
85
|
+
### 업무 수정 (non-interactive)
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
# 제목만 변경
|
|
89
|
+
dooray post edit <project> <number> --title "새 제목"
|
|
90
|
+
|
|
91
|
+
# 본문만 변경
|
|
92
|
+
dooray post edit <project> <number> --body "새 본문"
|
|
93
|
+
|
|
94
|
+
# 제목 + 본문 동시 변경
|
|
95
|
+
dooray post edit <project> <number> --title "새 제목" --body-file ./updated.md
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### 참조자(cc) / 담당자(to) 변경 — 멤버 · 그룹
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
# 기존 참조자 유지 + 그룹 추가 (dedupe: organizationMemberId / projectMemberGroupId)
|
|
102
|
+
dooray post edit <project> <number> --cc-group dev-team
|
|
103
|
+
|
|
104
|
+
# 기존 참조자 전부 비우고 신규 멤버만
|
|
105
|
+
dooray post edit <project> <number> --cc-clear --cc 홍길동
|
|
106
|
+
|
|
107
|
+
# 담당자(to)도 동일 패턴: --to / --to-group / --to-clear
|
|
108
|
+
dooray post edit <project> <number> --to 김철수 --to-group qa-team
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
dry-run 으로 변경 결과 미리보기 (API 호출 없음):
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
dooray post edit --id "$POST_ID" --cc-group qa-team --dry-run --json \
|
|
115
|
+
| jq '.users.cc'
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
> interactive (`$EDITOR`) 모드에서는 위 옵션이 무시되고 stderr 경고가 출력됩니다.
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## 본문 수정 (attachment 보호)
|
|
124
|
+
|
|
125
|
+
`post edit` / `post comment edit` 는 full-replace 방식이다. 자동화에서는 다음 중 하나를 선택:
|
|
126
|
+
|
|
127
|
+
1. **기존 attachment 보존**:
|
|
128
|
+
- `post edit` 수정 전: `dooray post get <project> <post-number> --json` 으로 `.body.content` 에서 `/files/<id>` 패턴 추출
|
|
129
|
+
- `post comment edit` 수정 전: `dooray post comment list <project> <post-number> --json` 으로 해당 댓글 본문에서 `/files/<id>` 패턴 추출
|
|
130
|
+
추출한 markdown reference 를 새 본문에 그대로 포함하여 전달
|
|
131
|
+
2. **명시적 제거**: attachment 가 더 이상 필요 없다고 판단하면 `--no-confirm` 으로 진행. 누락이 의도한 결과임을 명시
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## 동명이인 우회 — 이메일 / memberId 직접
|
|
136
|
+
|
|
137
|
+
이름이 동일한 멤버가 여러 명이라 `--cc 홍길동` 이 모호로 실패할 때:
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
# 1) 이메일로 우회
|
|
141
|
+
dooray post edit --id "$POST_ID" --cc user.specific@example.com
|
|
142
|
+
|
|
143
|
+
# 2) 사전에 member search 로 ID 확보 후 직접
|
|
144
|
+
MEMBER_ID=$(dooray member search 홍길동 --json | jq -r '.[] | select(.externalEmailAddress=="user.specific@example.com") | .id')
|
|
145
|
+
dooray post edit --id "$POST_ID" --cc "$MEMBER_ID"
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
`--to` / `--mention` 동일 분기 (resolveMember 인프라). 분기 규칙:
|
|
149
|
+
- `^\d{15,}$` — memberId 직접 사용
|
|
150
|
+
- 이메일 정규형 — searchMembers exact
|
|
151
|
+
- 그 외 — 이름 부분일치
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## 신규 업무 생성 후 그룹 cc 첨부
|
|
157
|
+
|
|
158
|
+
자동화 패턴:
|
|
159
|
+
1. audit 리포트 분석
|
|
160
|
+
2. 신규 업무 생성
|
|
161
|
+
3. 후속으로 특정 그룹을 참조에 추가
|
|
162
|
+
|
|
163
|
+
```bash
|
|
164
|
+
# 1. 신규 업무 생성 (그룹 cc 포함)
|
|
165
|
+
POST_ID=$(dooray post create <project> \
|
|
166
|
+
--title "주간 audit 리포트" \
|
|
167
|
+
--body-file ./report.md \
|
|
168
|
+
--cc-group dev-team \
|
|
169
|
+
--json | jq -r '.id')
|
|
170
|
+
|
|
171
|
+
# 2. (필요 시) 후속으로 cc 추가
|
|
172
|
+
dooray post edit --id "$POST_ID" --cc-group qa-team
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## 자식 업무 먼저 → 후속 부모 지정
|
|
178
|
+
|
|
179
|
+
```bash
|
|
180
|
+
# 1. 자식 업무 생성 (parent 모르고)
|
|
181
|
+
CHILD_ID=$(dooray post create <project> --title "subtask A" --json | jq -r '.id')
|
|
182
|
+
|
|
183
|
+
# 2. 부모 결정 후 후속 지정
|
|
184
|
+
dooray post edit --id "$CHILD_ID" --title "subtask A" --parent <project>/<parent-number>
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
**한계** (cmux-browser spike 결과): Dooray API 가 `unset-parent-post` 미제공 → CLI 로 parent 해제 불가. 필요 시 웹 UI 에서 처리.
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
## 태그 사후 분류 자동화
|
|
192
|
+
|
|
193
|
+
분류 분석 결과를 받아 태그를 재분류하는 자동화는 단독 호출 패턴이 효율적:
|
|
194
|
+
|
|
195
|
+
```bash
|
|
196
|
+
# 분석 스크립트가 분류한 태그 이름을 cli 로 적용 — body fetch 불요
|
|
197
|
+
POST_ID=$(...)
|
|
198
|
+
CATEGORY=$(...)
|
|
199
|
+
dooray post edit --id "$POST_ID" --tag "분류: $CATEGORY"
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
태그만 변경하는 시나리오에서 `--title` / `--body` 강제 없음.
|
|
203
|
+
mandatory 그룹은 친절한 에러 메시지로 안내.
|
|
204
|
+
|
|
205
|
+
---
|
|
206
|
+
|
|
207
|
+
## 첨부파일 일괄 다운로드 후 실패 분리
|
|
208
|
+
|
|
209
|
+
```bash
|
|
210
|
+
# --json 으로 구조화 출력 → jq 로 성공/실패 분리
|
|
211
|
+
RESULT=$(dooray post file download-all <project> <number> -o ./ --json)
|
|
212
|
+
echo "$RESULT" | jq -r '.failed[] | "\(.fileId): \(.error)"' >&2
|
|
213
|
+
echo "$RESULT" | jq -r '.succeeded[].path'
|
|
214
|
+
# exit code 1 이 설정되어 있으면 실패 있는 상태
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
---
|
|
218
|
+
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# wiki
|
|
2
|
+
|
|
3
|
+
위키 페이지 조회(트리 포함), 첨부파일 다운로드/공유, 인라인 이미지 업로드, 댓글 누적 시나리오를 다룬다.
|
|
4
|
+
|
|
5
|
+
## 체이닝 예시 — 위키
|
|
6
|
+
|
|
7
|
+
### 위키 페이지 조회
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
# 1. 위키 페이지 목록
|
|
11
|
+
dooray wiki pages <project> --json
|
|
12
|
+
# → [{ "id": "<pageId>", "subject": "설계 문서", ... }]
|
|
13
|
+
|
|
14
|
+
# 2. 페이지 내용 조회
|
|
15
|
+
dooray wiki page get <project> <pageId> --json
|
|
16
|
+
|
|
17
|
+
# 3. 전체 계층을 트리로 훑기 (--json 은 flat 배열 — wiki pages 와 동일 스키마로 파싱)
|
|
18
|
+
dooray wiki tree <project> --json
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
### 위키 페이지 첨부파일 — 스킬 파일 팀 공유
|
|
23
|
+
|
|
24
|
+
**스킬 파일 팀 공유**: 팀 위키에 스킬 파일 (예: `SKILL.md`) 을 `wiki page file upload` 로 첨부 → 팀원이 `wiki page file download-all` 로 일괄 받아 `~/.claude/skills/` 에 그대로 설치.
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
# 업로드 (일반 첨부)
|
|
28
|
+
dooray wiki page file upload <project> <page-id> --file ~/.claude/skills/my-skill/SKILL.md
|
|
29
|
+
|
|
30
|
+
# 팀원 쪽에서 일괄 다운로드
|
|
31
|
+
dooray wiki page file download-all <project> <page-id> -o ~/.claude/skills/my-skill/
|
|
32
|
+
|
|
33
|
+
# 첨부 목록 확인 (type 컬럼: general / inline_image)
|
|
34
|
+
dooray wiki page file list <project> <page-id>
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
### 위키 페이지 인라인 이미지 업로드 후 본문 자동 삽입
|
|
39
|
+
|
|
40
|
+
`--type inline_image` 로 업로드 시 `--json` 응답에 `markdownSnippet` 필드가 포함됩니다.
|
|
41
|
+
jq 로 추출해 본문에 바로 삽입하는 자동화가 가능합니다.
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
# 1. 인라인 이미지 업로드 — --json 으로 markdownSnippet 추출
|
|
45
|
+
SNIPPET=$(dooray wiki page file upload <project> <page-id> \
|
|
46
|
+
--file ./diagram.png --type inline_image --json \
|
|
47
|
+
| jq -r '.markdownSnippet')
|
|
48
|
+
# SNIPPET = ""
|
|
49
|
+
|
|
50
|
+
# 2. 기존 본문 조회
|
|
51
|
+
CURRENT_BODY=$(dooray wiki page get <project> <page-id> --json | jq -r '.body.content')
|
|
52
|
+
|
|
53
|
+
# 3. snippet 을 본문 끝에 추가해 업데이트
|
|
54
|
+
NEW_BODY="${CURRENT_BODY}
|
|
55
|
+
|
|
56
|
+
${SNIPPET}"
|
|
57
|
+
dooray wiki page edit <project> <page-id> --body "$NEW_BODY"
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
**참고**: `general` 타입은 `markdownSnippet` 없음. `--quiet` 은 id 만 출력 (snippet 미포함).
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
### 위키 페이지 댓글 — 회의록 결정사항 자동 누적
|
|
64
|
+
|
|
65
|
+
**회의록 결정사항 자동 누적**: 회의록 위키 페이지에 자동화 봇이 `wiki page comment add` 로 결정사항을 댓글로 누적, `wiki page comment list --latest 20` 으로 최근 토론 흐름 추적.
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
# 결정사항 댓글 추가
|
|
69
|
+
dooray wiki page comment add <project> <page-id> --body "결정: 배포일 2026-06-01 확정"
|
|
70
|
+
|
|
71
|
+
# 최근 20개 토론 흐름 조회
|
|
72
|
+
dooray wiki page comment list <project> <page-id> --latest 20
|
|
73
|
+
|
|
74
|
+
# 최신 댓글 1건 shortcut
|
|
75
|
+
dooray wiki page comment latest <project> <page-id>
|
|
76
|
+
```
|
|
77
|
+
|