🚀 Socket Launch Week Day 5:Introducing Repository Access Permissions and Custom Roles.Learn more
Sign In

@bifos/dooray-cli

Package Overview
Dependencies
Maintainers
1
Versions
17
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@bifos/dooray-cli - npm Package Compare versions

Comparing version
0.5.4
to
0.6.0
+2
-2
package.json
{
"name": "@bifos/dooray-cli",
"version": "0.5.4",
"version": "0.6.0",
"description": "CLI tool for Dooray project management — AI agent & terminal friendly",

@@ -29,3 +29,3 @@ "keywords": [

"engines": {
"node": ">=18"
"node": ">=20"
},

@@ -32,0 +32,0 @@ "scripts": {

+151
-43
# dooray-cli
[![CI](https://github.com/jon890/dooray-cli/actions/workflows/ci.yml/badge.svg)](https://github.com/jon890/dooray-cli/actions/workflows/ci.yml)
NHN Dooray REST API를 래핑한 CLI 도구입니다. 터미널과 AI 에이전트 환경에서 Dooray 업무를 관리할 수 있습니다.

@@ -40,6 +42,6 @@

dooray project list --type private # 개인 프로젝트 목록
dooray project members tc-ocr # 멤버 목록
dooray project workflows tc-ocr # 워크플로우 목록
dooray project groups tc-ocr # 멤버 그룹 목록 (ID / Code)
dooray project tags tc-ocr # 태그 목록 (ID / Color / Name / Group / Mandatory)
dooray project members <project> # 멤버 목록
dooray project workflows <project> # 워크플로우 목록
dooray project groups <project> # 멤버 그룹 목록 (ID / Code)
dooray project tags <project> # 태그 목록 (ID / Color / Name / Group / Mandatory)
```

@@ -52,4 +54,11 @@

```bash
dooray member list tc-ocr # 프로젝트 멤버 목록 (이름·organizationMemberId)
dooray member get <organizationMemberId> # 멤버 상세 (cache 우회, ADR-021)
dooray member list <project> # 프로젝트 멤버 목록 (이름·organizationMemberId)
dooray member get <organizationMemberId> # 멤버 상세 (cache 우회, ADR-021)
# organization 전체 멤버 검색
dooray member search 홍길동 # 이름 검색
dooray member search --email user@example.com # 이메일 (정확히 일치)
dooray member search --user-code abc # 사번 like 검색
dooray member search --user-code-exact abc123 # 사번 exact match
dooray member search 김 --size 50 --page 1 # 페이지네이션
```

@@ -60,15 +69,16 @@

```bash
dooray post list tc-ocr # 업무 목록 (최신순)
dooray post search tc-ocr "키워드" # 제목 검색
dooray post get tc-ocr 42 # 업무 상세
dooray post get tc-ocr 42 --json # JSON 출력
dooray post list <project> # 업무 목록 (최신순)
dooray post search <project> "키워드" # 제목 검색
dooray post get <project> 42 # 업무 상세
dooray post get <project> 42 --json # JSON 출력
```
#### 업무 식별 방식 (post 하위 12개 명령 공통)
#### 업무 식별 방식 (post 하위 16개 명령 공통)
| 방식 | 예시 |
|---|---|
| `<project> <number>` | `dooray post get tc-ocr 42` |
| Dooray URL positional | `dooray post get https://x.dooray.com/task/to/4319587406666362045` |
| `--id <postId>` | `dooray post get --id 4319587406666362045` |
| `<project> <number>` | `dooray post get <project> 42` |
| Dooray URL positional (`/task/to/<postId>`) | `dooray post get https://x.dooray.com/task/to/<postId>` |
| Dooray URL positional (브라우저 주소창 복사본) | `dooray post get https://x.dooray.com/task/<projectId>/<postId>` |
| `--id <postId>` | `dooray post get --id <postId>` |
| `--url <url>` | `dooray post get --url https://x.dooray.com/task/to/...` |

@@ -81,3 +91,3 @@

```bash
dooray post create tc-ocr \
dooray post create <project> \
--title "업무 제목" \

@@ -89,9 +99,9 @@ --body "본문 마크다운" \

# 본문을 파일에서 읽기 (--body와 --body-file은 동시 사용 불가)
dooray post create tc-ocr --title "업무 제목" --body-file ./content.md
dooray post create <project> --title "업무 제목" --body-file ./content.md
# 메타 옵션: --tag(반복) / --parent / --workflow / --milestone
dooray post create tc-ocr \
dooray post create <project> \
--title "업무 제목" --body "본문" --to "담당자이름" \
--tag "버그" --tag "긴급" \
--parent "tc-ocr/337" \
--parent "<project>/337" \
--workflow "진행 중" \

@@ -101,3 +111,3 @@ --milestone "Sprint 12"

> mandatory-tag 정책 프로젝트(예: `tc-ocr`)에서는 mandatory 그룹마다 1개 이상 `--tag`로 지정해야 한다. 누락 시 클라이언트가 사전 검증으로 후보 목록과 함께 에러 출력.
> mandatory-tag 정책 프로젝트(예: `<project>`)에서는 mandatory 그룹마다 1개 이상 `--tag`로 지정해야 한다. 누락 시 클라이언트가 사전 검증으로 후보 목록과 함께 에러 출력.

@@ -108,9 +118,9 @@ ### 업무 수정

# 대화형 ($EDITOR)
dooray post edit tc-ocr 42
dooray post edit <project> 42
# 비대화형 (AI 에이전트 친화)
dooray post edit tc-ocr 42 --title "새 제목" --body "새 본문"
dooray post edit <project> 42 --title "새 제목" --body "새 본문"
# 본문을 파일에서 읽기
dooray post edit tc-ocr 42 --body-file ./updated.md
dooray post edit <project> 42 --body-file ./updated.md
```

@@ -121,5 +131,5 @@

```bash
dooray post comment list tc-ocr 42
dooray post comment add tc-ocr 42 --body "댓글 내용"
dooray post comment add tc-ocr 42 --body-file ./comment.md
dooray post comment list <project> 42
dooray post comment add <project> 42 --body "댓글 내용"
dooray post comment add <project> 42 --body-file ./comment.md
```

@@ -129,2 +139,28 @@

#### 멘션 (comment add / comment edit)
`--mention <name>` (반복), `--mention-group <code>` (반복)으로 본문 앞에 멘션 마크업을 자동 prepend한다.
```bash
# 멤버 멘션 1명
dooray post comment add P 1 --mention 홍길동 --body "확인 부탁드립니다"
# 여러 명
dooray post comment add P 1 --mention 홍길동 --mention 김철수 --body "..."
# 그룹 멘션
dooray post comment add P 1 --mention-group 개발 --body "검토 요청"
# 멤버 + 그룹 혼합
dooray post comment add P 1 \
--mention 홍길동 \
--mention-group 개발 \
--body "검토 부탁드립니다"
# comment edit에도 동일 옵션 사용 가능
dooray post comment edit P 1 <commentId> --mention 홍길동 --body "수정 내용"
```
> 이전 버전 캐시는 orgId가 없으므로 첫 호출 시 자동 갱신됩니다 (또는 `dooray cache clear`).
#### comment list 필터 옵션

@@ -134,14 +170,14 @@

# 최신 5개 (desc 정렬)
dooray post comment list tc-ocr 42 --latest 5
dooray post comment list <project> 42 --latest 5
# 특정 시간 이후 댓글만
dooray post comment list tc-ocr 42 --since 2026-04-27
dooray post comment list <project> 42 --since 2026-04-27
# 작성자 이름으로 필터 (부분일치)
dooray post comment list tc-ocr 42 --from-author 홍길동
dooray post comment list <project> 42 --from-author 홍길동
# 오름차순 / 내림차순 정렬
dooray post comment list tc-ocr 42 --sort asc
dooray post comment list tc-ocr 42 --sort desc
dooray post comment list tc-ocr 42 --reverse # --sort desc alias
dooray post comment list <project> 42 --sort asc
dooray post comment list <project> 42 --sort desc
dooray post comment list <project> 42 --reverse # --sort desc alias
```

@@ -155,6 +191,6 @@

# 최신 댓글 1개
dooray post comment latest tc-ocr 42
dooray post comment latest <project> 42
# 최신 3개
dooray post comment latest tc-ocr 42 -n 3
dooray post comment latest <project> 42 -n 3

@@ -168,4 +204,4 @@ # URL로도 가능

```bash
dooray post done tc-ocr 42 # 완료 처리
dooray post workflow tc-ocr 42 "진행 중" # 워크플로우 변경
dooray post done <project> 42 # 완료 처리
dooray post workflow <project> 42 "진행 중" # 워크플로우 변경
```

@@ -177,8 +213,8 @@

dooray wiki list # 위키 목록
dooray wiki pages tc-ocr # 페이지 목록
dooray wiki page get tc-ocr <page-id> # 페이지 상세
dooray wiki page create tc-ocr --title "..." [--parent <page-id>] [--body "..." | --body-file <path>]
dooray wiki page edit tc-ocr <page-id> --title "새 제목" # 제목만 (비대화형)
dooray wiki page edit tc-ocr <page-id> --body "..." | --body-file <path> # 본문만 (비대화형)
dooray wiki page edit tc-ocr <page-id> # $EDITOR (플래그 없을 때)
dooray wiki pages <project> # 페이지 목록
dooray wiki page get <project> <page-id> # 페이지 상세
dooray wiki page create <project> --title "..." [--parent <page-id>] [--body "..." | --body-file <path>]
dooray wiki page edit <project> <page-id> --title "새 제목" # 제목만 (비대화형)
dooray wiki page edit <project> <page-id> --body "..." | --body-file <path> # 본문만 (비대화형)
dooray wiki page edit <project> <page-id> # $EDITOR (플래그 없을 때)
```

@@ -243,2 +279,24 @@

### 댓글 첨부 파일 (`post comment file *`)
자동화로 댓글에 인라인 이미지 / 파일을 삽입할 때 사용. 4 명령 (list/upload/download/delete) 모두 `<project> <post-number> <comment-id>` 또는 `--id <postId> --comment-id <logId>` / `--url <url> --comment-id <logId>` 패턴 지원 (ADR-020).
```bash
# 첨부 목록
dooray post comment file list <project> <post-num> <comment-id>
# 업로드 (post-level files API 로 업로드 + 댓글 본문에 markdown reference append)
dooray post comment file upload <project> <post-num> <comment-id> ./screenshot.png
# 다운로드 (post-level 파일과 동일 — UX 일관성 wrapper)
dooray post comment file download <project> <post-num> <comment-id> <file-id> --out ./out.png
# 삭제 (댓글 본문 markdown 제거 + post-level 파일 삭제, --yes 로 confirm 생략)
dooray post comment file delete <project> <post-num> <comment-id> <file-id> --yes
```
> Dooray REST API 가 댓글 전용 attachment endpoint 를 제공하지 않아 내부적으로
> post-level files API 와 댓글 본문 PUT 의 합성으로 동작 (ADR-024). 단일 명령
> = 단일 파일 — 다중 파일은 호출자가 반복 호출.
## 출력 모드

@@ -254,4 +312,4 @@

# 파이프라인 예시
dooray post list tc-ocr --json | jq '.[] | select(.priority == "high")'
dooray post list tc-ocr --quiet | xargs -I{} dooray post done tc-ocr {}
dooray post list <project> --json | jq '.[] | select(.priority == "high")'
dooray post list <project> --quiet | xargs -I{} dooray post done <project> {}
```

@@ -268,2 +326,24 @@

## 피드백 (GitHub Issue 등록)
`dooray feedback` 명령으로 GitHub issue를 직접 등록할 수 있습니다 (`gh` CLI 위임).
```bash
# 인터랙티브 (제목/본문/라벨 대화형 입력)
dooray feedback
# 논인터랙티브
dooray feedback --title "버그 제목" --body "재현 방법"
# --last 모드 (직전 에러 자동 첨부)
dooray config set track-last-run true # 1회만, opt-in
dooray feedback --last # 직전 명령 + 에러 자동 첨부 + $EDITOR로 의견 추가
dooray feedback --last --title "재현" --body "추가 설명" --dry-run # 미리보기
# 미리보기 (gh 호출 없이 본문 확인)
dooray feedback --dry-run
```
> **개인정보 보호 (ADR-023)**: `--last` 모드에서 argv는 `--api-key`/`--token`/`Authorization` 등 시크릿 패턴을 자동 마스킹 후 저장합니다. cwd/env는 미저장.
## 캐시

@@ -298,4 +378,32 @@

## GitHub Actions
이 레포는 두 개의 워크플로를 사용합니다:
### CI (`.github/workflows/ci.yml`)
- 트리거: `main` 으로 push, `main` 대상 PR
- 동작: `pnpm install --frozen-lockfile` → `pnpm test` → `pnpm build` (Node 18, ubuntu-latest)
- 별도 secret 불필요
### Claude code review (`.github/workflows/claude-code-review.yml`)
- 트리거: PR opened, PR 댓글에 `/review` 포함
- 동작: 4 병렬 specialist 에이전트 (TypeScript / Conventions / Security / Architecture) 가 인라인 리뷰 + 요약 댓글 1개 게시
- 필요 secret: `CLAUDE_CODE_OAUTH_TOKEN`
#### Secret 셋업
1. https://github.com/jon890/dooray-cli/settings/secrets/actions 접속
2. `New repository secret` → 이름 `CLAUDE_CODE_OAUTH_TOKEN` + 값 (Anthropic 에서 발급한 OAuth 토큰)
3. PR 을 열거나 PR 댓글에 `/review` 작성하면 자동 실행
#### 비용 / 토큰
각 PR 당 4 specialist 가 모두 `haiku` 모델로 동작 — 평균 PR 1건 당 수십 센트 수준. PR 자동 트리거 비활성화하려면 `claude-code-review.yml` 의 `if:` 조건에서 `github.event_name == 'pull_request'` 분기를 제거하고 `/review` 댓글 트리거만 남길 수 있음.
#### Fork PR 제한
GitHub Actions 정책상 fork 에서 열린 PR 은 `secrets.CLAUDE_CODE_OAUTH_TOKEN` 에 접근 못 해 **자동 리뷰가 silent 하게 skip** 된다. fork 기여자가 리뷰를 받으려면 maintainer 가 PR 댓글에 `/review` 를 작성하여 base repo 컨텍스트로 워크플로를 트리거해야 한다.
## 라이센스
[MIT](LICENSE)

@@ -48,3 +48,3 @@ ---

> **공통 (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).
> **공통 (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).

@@ -60,2 +60,3 @@ | 의도 | 커맨드 |

| 멤버 상세 (organizationMemberId) | `dooray member get <organizationMemberId>` (cache 우회, ADR-021) |
| organization 전체 멤버 검색 | `dooray member search <keyword>` (이름 기본), `--email`(이메일 exact), `--user-code`(사번 like), `--user-code-exact`(사번 exact), `--page`/`--size` |
| 업무 목록 조회 | `dooray post list <project>` |

@@ -91,2 +92,6 @@ | 업무 검색 | `dooray post search <project> "<keyword>"` |

| 첨부파일 삭제 | `dooray post file delete <project> <number> <file-id>` |
| 댓글 첨부 목록 | `dooray post comment file list <project> <number> <comment-id>` |
| 댓글 파일 업로드 | `dooray post comment file upload <project> <number> <comment-id> <path>` |
| 댓글 파일 다운로드 | `dooray post comment file download <project> <number> <comment-id> <file-id>` |
| 댓글 파일 삭제 | `dooray post comment file delete <project> <number> <comment-id> <file-id> --yes` |

@@ -117,3 +122,4 @@ > **제목 옵션 네이밍**: `post` 와 `wiki page` 모두 `--title` 표준. `post`의 `--subject`는 deprecated alias로 당분간 동작하되, 새 코드에서는 `--title` 사용을 권장.

5. **멤버 이름을 모르면** → `dooray member list <project>` (또는 `dooray project members <project>`) 로 확인
6. **결과를 다음 액션에 사용하려면** → `--json` 플래그로 구조화된 데이터 획득
6. **org 전체 멤버를 찾으려면** → `dooray member search <keyword>` (이름), `--email <addr>`, `--user-code <code>` 중 하나 사용
7. **결과를 다음 액션에 사용하려면** → `--json` 플래그로 구조화된 데이터 획득

@@ -128,7 +134,7 @@ ---

# 1. 업무 검색으로 번호 확인
dooray post search tc-ocr "graceful shutdown" --json
dooray post search <project> "graceful shutdown" --json
# → [{ "number": 42, "subject": "graceful shutdown 구현", ... }]
# 2. 완료 처리
dooray post done tc-ocr 42
dooray post done <project> 42
```

@@ -154,8 +160,20 @@

# 1. 업무 조회
dooray post get tc-ocr 42 --json
dooray post get <project> 42 --json
# 2. 댓글 추가
dooray post comment add tc-ocr 42 --body "진행 상황 업데이트: 80% 완료"
dooray post comment add <project> 42 --body "진행 상황 업데이트: 80% 완료"
```
### 시나리오 — 댓글에 스크린샷 자동 첨부
스크립트가 스크린샷을 댓글에 삽입하거나, 에이전트가 결과 파일을 첨부 댓글로 보고할 때 사용. Dooray REST API 가 댓글 전용 attachment endpoint 를 미지원하므로 내부적으로 post-level files API + 댓글 본문 PUT 합성으로 동작 (ADR-024).
```bash
# 1. 댓글을 먼저 만든다 (텍스트만, --json 으로 commentId 획득)
COMMENT_ID=$(dooray post comment add <project> <post-num> --body "스크린샷 보고:" --json | jq -r '.id')
# 2. 그 댓글에 파일을 첨부 (post-level 업로드 + 댓글 본문 markdown 자동 추가)
dooray post comment file upload <project> <post-num> "$COMMENT_ID" ./screenshot.png
```
### 위키 페이지 조회

@@ -165,7 +183,7 @@

# 1. 위키 페이지 목록
dooray wiki pages tc-ocr --json
# → [{ "id": "3052841366755571094", "subject": "설계 문서", ... }]
dooray wiki pages <project> --json
# → [{ "id": "<pageId>", "subject": "설계 문서", ... }]
# 2. 페이지 내용 조회
dooray wiki page get tc-ocr 3052841366755571094 --json
dooray wiki page get <project> <pageId> --json
```

@@ -177,18 +195,18 @@

### 업무 식별 방식 (post 하위 12개 명령 공통, ADR-020)
### 업무 식별 방식 (post 하위 16개 명령 공통, ADR-020)
`post get`/`edit`/`done`/`workflow`, `post comment list`/`add`/`edit`/`delete`, `post file list`/`upload`/`download`/`download-all`/`delete`는 4가지 입력을 모두 받는다:
`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가지 입력을 모두 받는다:
```bash
# (1) 기존 positional — 가장 익숙한 형태
dooray post get tc-ocr 42
dooray post get <project> 42
# (2) Dooray URL을 첫 인자로 — 사용자 메시지에서 URL을 그대로 복사할 때 최적
dooray post get https://x.dooray.com/task/to/4319587406666362045
dooray post get https://x.dooray.com/task/to/<postId>
# (3) --id <postId>
dooray post get --id 4319587406666362045
dooray post get --id <postId>
# (4) --url <url>
dooray post get --url https://x.dooray.com/task/to/4319587406666362045
dooray post get --url https://x.dooray.com/task/to/<postId>
```

@@ -225,3 +243,3 @@

--tag "버그" --tag "긴급" \ # 반복 지정. mandatory 그룹은 클라이언트 사전 검증
--parent "tc-ocr/337" \ # "code/number" 또는 raw postId 두 형태만 허용
--parent "<project>/337" \ # "code/number" 또는 raw postId 두 형태만 허용
--workflow "진행 중" \ # 이름 또는 class (registered/working/closed). 부분일치 모호 시 후보 + 에러

@@ -273,2 +291,15 @@ --milestone "Sprint 12"

## 멘션 자동 작성 (post comment add/edit)
`--mention <name>` (반복) 또는 `--mention-group <code>` (반복)으로 본문 앞에 멘션 마크업을 자동 prepend한다. 아래 "Dooray 마크다운 링크 형식" 섹션의 URL 형식을 자동 출력한다.
```bash
dooray post comment add P 1 --mention 홍길동 --mention-group 개발 --body "..."
# 결과 본문: [@홍길동](dooray://orgId/members/m1 "member") [@P/개발](dooray://orgId/member-groups/g1) ...
```
- 이름 부분일치 지원 (모호하면 에러 + 후보 목록 출력)
- 멤버 먼저, 그룹 다음 순서 고정
- comment edit에도 동일 옵션 사용 (`$EDITOR` 모드에서는 EDITOR 진입 전에 prepend)
## Dooray 마크다운 링크 형식 (멤버·그룹·업무 멘션)

@@ -308,3 +339,3 @@

| `orgId` | Dooray 앱/웹 URL에서 추출 (`https://{org}.dooray.com/...`의 도메인 + 별도 확인 필요) |
| `memberId` | `dooray member get <id>` 또는 `dooray project members <project>` |
| `memberId` | `dooray member get <id>`, `dooray member search <name>`, `--email <addr>`, `--user-code <code>` 등으로 검색 |
| `groupId` | `dooray project groups <project>` |

@@ -315,2 +346,18 @@ | `postId` | `dooray post get <project> <number> --json` 의 `id` 필드 |

## 피드백 (GitHub Issue 등록)
`dooray feedback` 명령으로 dooray-cli GitHub issue를 직접 등록한다 (`gh` CLI 위임).
```bash
# 논인터랙티브 (non-interactive — 에이전트 자동화용)
dooray feedback --title "버그 제목" --body "재현 방법" --label "bug"
# --last 모드 (직전 에러 자동 첨부 — track-last-run 활성화 필요)
dooray config set track-last-run true
dooray feedback --last --title "에러 제목" --body "추가 설명" --dry-run # 미리보기
dooray feedback --last --title "에러 제목" --body "추가 설명" # 실제 등록
```
> **참고**: `--last` 모드는 `trackLastRun: true` (ADR-023 opt-in)가 설정된 경우에만 직전 실패 명령이 자동 기록됨. argv는 시크릿 패턴(`--api-key`/`--token`/`Authorization`) 마스킹 후 저장.
## 에러 핸들링

@@ -317,0 +364,0 @@

Sorry, the diff of this file is too big to display