democut 0.2.0 → 0.3.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 +72 -43
- package/dist/cli.js +16457 -649
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -117,53 +117,82 @@ npm test
|
|
|
117
117
|
npm run build # dist/cli.js (bin: democut) 번들
|
|
118
118
|
```
|
|
119
119
|
|
|
120
|
+
## MCP 서버 (에이전트에 도구로 붙이기)
|
|
121
|
+
|
|
122
|
+
`democut mcp` 는 **stdio MCP 서버**다. Claude Code·Cursor 등 MCP 클라이언트에 붙이면
|
|
123
|
+
에이전트가 도구로 직접 영상을 만든다.
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
claude mcp add democut -- democut mcp
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
노출 도구 4개:
|
|
130
|
+
|
|
131
|
+
| 도구 | 부작용 |
|
|
132
|
+
|---|---|
|
|
133
|
+
| `democut_auth_status` | 없음 — 로그인·워크스페이스·티어 확인 |
|
|
134
|
+
| `democut_estimate_video_cost` | **없음** — 비용만 계산 |
|
|
135
|
+
| `democut_generate_video` | **과금** — `confirmed_cost_usd` 필수 |
|
|
136
|
+
| `democut_get_video_status` | 없음 — 상태 조회 + 선택적 저장 |
|
|
137
|
+
|
|
138
|
+
### 비용 승인이 프로토콜에 맞게 바뀐다
|
|
139
|
+
|
|
140
|
+
CLI 는 TTY 에 `y/N` 을 물어 사람을 막지만 MCP 에는 물어볼 화면이 없다. 대신 두 겹이다:
|
|
141
|
+
|
|
142
|
+
1. **호스트의 도구 승인** — Claude Code 등이 도구 호출 전에 사용자에게 확인을 받는다.
|
|
143
|
+
우리가 제어할 수 없으므로 이것만 믿지 않는다.
|
|
144
|
+
2. **`confirmed_cost_usd` 재확인** — 생성 도구는 호출자가 *직접 본* 추정 금액을 다시 실어
|
|
145
|
+
보내야 하고, 서버가 방금 계산한 값과 대조해 어긋나면 거부한다. 모델이 추정을 건너뛰고
|
|
146
|
+
바로 생성하는 것을 막고, 사람에게 보여준 금액과 실제 청구액이 갈라지지 않게 한다.
|
|
147
|
+
|
|
148
|
+
### 왜 원격 HTTP 가 아니라 stdio 인가
|
|
149
|
+
|
|
150
|
+
원격 MCP 서버로 만들면 클라이언트가 OAuth 2.1 discovery(RFC 9728 + RFC 8414 + PKCE +
|
|
151
|
+
동적 클라이언트 등록)를 요구한다. 우리가 가진 것은 device flow(RFC 8628)라 그 체인을 새로
|
|
152
|
+
쌓아야 하고, 정적 Bearer 를 클라이언트 설정에 박는 우회는 **access token 이 1시간이면
|
|
153
|
+
만료**돼 곧 깨진다.
|
|
154
|
+
|
|
155
|
+
stdio 는 그 문제가 통째로 사라진다 — 이 프로세스가 이미 `~/.democut/credentials.json` 을
|
|
156
|
+
읽고 만료 시 refresh 로 회전한다. **클라이언트 설정에 토큰이 남지 않고**, 서버에 새 인증
|
|
157
|
+
표면을 만들지 않으며, CLI 가 이미 검증해 둔 경로를 그대로 쓴다.
|
|
158
|
+
|
|
159
|
+
원격 HTTP 는 로컬 바이너리를 못 돌리는 클라이언트를 위해 나중에 별도로 얹는다.
|
|
160
|
+
|
|
120
161
|
## 게시 (npm publish)
|
|
121
162
|
|
|
122
|
-
|
|
123
|
-
게시는 사람이 한다(에이전트 범위 밖).
|
|
124
|
-
|
|
125
|
-
> ⚠️ **게시가 문서 승격보다 먼저다.** `democut` 은 **무스코프**라 우리가 게시하기 전까지
|
|
126
|
-
> **누구나 그 이름으로 올릴 수 있다**(스코프 패키지와 달리 네임스페이스 보호가 없다).
|
|
127
|
-
> `/docs/agents` 의 복사 버튼과 `/updates` 공지가 먼저 나가면, 그 사이 제3자가 악성
|
|
128
|
-
> `democut` 을 선점해 사용자가 그것을 설치하는 창이 열린다 —
|
|
129
|
-
> `democut auth login` 이 워크스페이스 토큰을 다루므로 토큰 탈취로 이어질 수 있다
|
|
130
|
-
> (CWE-829, faceta 리뷰 2026-08-21).
|
|
131
|
-
>
|
|
132
|
-
> 따라서 **머지 → npm publish → 승격(promote)** 순서를 지킨다. 승격 전에 확인:
|
|
133
|
-
> ```bash
|
|
134
|
-
> curl -s -o /dev/null -w '%{http_code}\n' https://registry.npmjs.org/democut # 200 이어야 한다
|
|
135
|
-
> ```
|
|
136
|
-
|
|
137
|
-
순서:
|
|
138
|
-
|
|
139
|
-
1. **서버 라우터가 프로덕션에 있어야 한다.** `democut video` 는 `/api/videogen` 을 호출하고
|
|
140
|
-
기본 base URL 이 프로덕션(`https://democut.ai`)이다. 그 라우터가 없으면 게시해도 모든
|
|
141
|
-
video 커맨드가 404 다. 확인:
|
|
142
|
-
```bash
|
|
143
|
-
curl -s -o /dev/null -w '%{http_code}\n' -X POST https://democut.ai/api/videogen/estimate
|
|
144
|
-
# 401 이면 배포됨(인증 필요) · 404 면 미승격
|
|
145
|
-
```
|
|
146
|
-
2. **org 는 필요 없다.** 이 패키지는 **무스코프**(`democut`)라 개인 계정으로 바로 게시되고,
|
|
147
|
-
무스코프는 기본이 public 이라 `--access public` 도 필요 없다.
|
|
163
|
+
**CI 가 자동으로 한다.** 사람이 순서를 기억할 필요가 없다.
|
|
148
164
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
> 향후 `@democut/mcp` 같은 스코프 패키지가 필요해지면 그 계정을 되찾아야 한다
|
|
153
|
-
> (이메일을 못 받는 미인증 계정이면 로그인 후 계정 설정에서 이메일을 교체하거나,
|
|
154
|
-
> 비밀번호를 모르면 npm Support 로 문의).
|
|
165
|
+
```
|
|
166
|
+
promote(사람이 누르는 버튼) → npm-publish-cli → deploy-dgx
|
|
167
|
+
```
|
|
155
168
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
169
|
+
`deploy-dgx` 가 게시 성공을 `needs` 로 요구하므로, **게시가 실패하면 문서가 프로덕션에
|
|
170
|
+
나가지 않는다.** `/docs/agents` 가 아직 없는 패키지를 안내하는 창이 구조적으로 열리지 않는다
|
|
171
|
+
(무스코프 이름이라 그 창에서 제3자가 선점하면 토큰 탈취로 이어질 수 있다 — CWE-829).
|
|
172
|
+
|
|
173
|
+
버전이 그대로면 잡은 "이미 게시됨" 으로 즉시 통과한다. 그러니 **게시하려면 `cli/package.json`
|
|
174
|
+
의 version 을 올리기만 하면 된다** — `VERSION` ↔ `package.json` 정합은 테스트가 강제하므로
|
|
175
|
+
`src/version.ts` 도 같이 올린다.
|
|
162
176
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
177
|
+
순서를 강제하는 것은 `.gitlab-ci.yml` 의 `deploy-dgx.needs` 하나뿐이고, 그것이 지워지면
|
|
178
|
+
아무 신호 없이 보장이 사라진다 — `scripts/tests/promote.sh` 가 지킨다(`make test-scripts`).
|
|
179
|
+
|
|
180
|
+
### 선행 설정 (1회)
|
|
181
|
+
|
|
182
|
+
npm **Automation token** 을 발급해(2FA 를 우회하도록 설계된 종류다) GitLab CI/CD 변수
|
|
183
|
+
`NPM_TOKEN` 에 **masked + protected** 로 넣는다. 토큰이 없으면 잡이 명확한 메시지로 실패한다.
|
|
184
|
+
|
|
185
|
+
> **토큰을 코드나 대화에 넣지 않는다.** 값은 GitLab 변수에만 두고, 레포에도 로컬 파일에도
|
|
186
|
+
> 남기지 않는다.
|
|
187
|
+
|
|
188
|
+
### 수동 게시 (긴급시)
|
|
189
|
+
|
|
190
|
+
```bash
|
|
191
|
+
cd cli
|
|
192
|
+
npm run build
|
|
193
|
+
npm publish # 무스코프는 기본 public — --access 불필요
|
|
194
|
+
```
|
|
167
195
|
|
|
168
|
-
|
|
196
|
+
2FA 가 보안 키(WebAuthn)면 `npm publish` 가 브라우저 승인 URL 을 띄운다.
|
|
197
|
+
게시되는 것은 `files` 에 적힌 **`dist/` 뿐**이다(소스·테스트 미포함).
|
|
169
198
|
`npm pack --dry-run` 으로 목록을 먼저 확인할 수 있다.
|