명령어
핵심 요약
목적에 따라 명령을 고르세요: init은 초기화, plan은 계획, apply는 적용, verify는 실행 검증입니다.
종료 코드 0은 해당 단계가 끝났다는 뜻이지 보안 검증 완료를 뜻하지 않습니다. 자동화에는 --json을 사용하세요.
전체 레퍼런스 — 아래 모든 명령과 플래그는 devpay.mjs의 USAGE/HELP에서 복사되었고 yp <cmd> --help 실행으로 검증되었습니다.
yp init
yp init [--yes] [--force] [--name n] [--target m.mjs] [--type t] [--api-base url]프로젝트 루트에 devpay.json + .devpay/ 워크스페이스를 스캐폴드하고 .devpay/를 .gitignore에 추가합니다.
| 플래그 | 의미 |
|---|---|
--yes | 비대화형; 감지된 기본값 수락. |
--force | 기존 devpay.json 덮어쓰기. |
--name n | 프로젝트 id/이름. |
--type t | js | nuxt | rust | unknown. |
--target m.mjs | 보호할 모듈(protect.target). |
--api-base url | api.base_url에 저장되는 DevPay API base. |
감지: nuxt.config.* → nuxt, Cargo.toml → rust(분석기는 js/wasm만 처리 — 주석에 명시됨), package.json/.mjs → js. protect.target이 없으면 null; 설정될 때까지 plan이 거부됩니다 — CLI는 유료 경계를 절대 추측하지 않습니다.
yp doctor
yp doctor [--api-base url]환경 검사: node ≥18.17, 보호 툴킷 존재, SDK 존재, devpay.json 존재, API 도달 가능성, git. FAIL이 하나라도 있으면 → exit 1.
yp protect plan
yp protect plan [--target m.mjs] [--driver d.mjs] [--spec s.json]
[--overrides o.json] [--no-dynamic]2
분석 → spec 초안 → ProtectionPlan. Plan-only: 아무것도 적용되지 않음.
| 플래그 | 의미 |
|---|---|
--target m.mjs | 유료 로직 모듈(devpay.json 오버라이드). |
--driver d.mjs | 동적 분석 드라이버 모듈. |
--spec s.json | 승인된 spec(초안 생성 건너뜀). |
--overrides o.json | spec 초안 오버라이드. |
--no-dynamic | 정적 분석만(드라이버 트레이스 건너뜀). |
.devpay/<name>.analysis.json, (필요시) .devpay/spec.draft.json, 그리고 spec/target/driver 바이트에 sha 바운드된 .devpay/plan.json을 씁니다.
yp protect review
yp protect review사람이 읽을 수 있는 §6.1 플랜 요약 — 에셋별 전략, 함수 변경, 서버 변경, 테스트 계획, 예상 서버 호출 수, 미검증 리스크. 플랜이 존재해야 합니다. PLAN ONLY 배너 아래에 출력됩니다.
yp protect apply
yp protect apply [--approve] [--vectors v.vectors.json] [--port n]
[--auth dev-open|yp-license] [--license-seed f.json]2
플랜을 실행합니다: AUTO → 파티셔너, AGENT → handoff 브리프, MANUAL_REVIEW → 건너뜀. spec/target/driver를 다시 해시하고 드리프트 시 거부합니다(exit 2).
| 플래그 | 의미 |
|---|---|
--approve | 미승인 spec 하에서 apply 허용 — handoff만, AUTO 불가(fail closed). |
--vectors v.vectors.json | 동등성 벡터 파일. |
--port n | 생성된 파티션 서버 루프백 포트(기본 4930). |
--auth dev-open|yp-license | 생성된 서버 인증 모드. |
--license-seed f.json | yp-license 모드에 필요한 시드 파일. |
거부(fail-closed 결정, 미승인 AUTO)는 exit 3입니다.
yp protect verify
yp protect verify [--vectors v.vectors.json] [--port n] [--asset id] [--api-base url]검증 레그(루프백을 통한 동등성, 라이선스/API 검사)를 실행하고 .devpay/evidence/ 아래에 스키마 유효 증거 레코드를 씁니다. --asset은 하나의 spec 에셋 id로 제한합니다. apply 리포트 없이는 거부 — verify는 적용된 작업을 입증합니다.
yp auth login
yp auth login [--email e] [--password p] [--api-base url]{email,password}를 {api}/api/v1/auth/login에 POST하고 자격 증명을 (0600) yp 설정 디렉터리에 저장합니다. 플래그/env (YP_EMAIL/YP_PASSWORD)이 우선이고, 마스킹된 TTY 프롬프트가 폴백입니다. --api-base는 이후 명령을 위해 저장됩니다. 비밀번호와 발급된 토큰을 절대 echo하지 않습니다.
yp auth status
yp auth status [--api-base url]저장된 자격 증명으로 GET /api/v1/me. 역할, seller_id, 토큰 만료를 출력합니다. 미인증이면 exit 1. (두 백엔드 모두 /api/v1/auth/me 라우트는 없습니다 — 명령은 /me를 사용합니다.)
yp project list / yp project inspect
yp project list [--api-base url]
yp project inspect <project_id> [--api-base url]2
GET /api/v1/projects와 GET /api/v1/projects/:id(인증 필요). 401/403 → 로그인 힌트와 함께 exit 3.
yp license status / yp license verify
yp license status <license_id|key> [--api-base url]
yp license verify <key> [--api-base url]2
status—GET /api/v1/licenses를 통한 셀러 라이선스 레코드(인증 필요)와 백엔드별 상세 프로브GET /licenses/:id/bindings및/usage로, 이들은 be-cloudflare 전용이며 Axum에서는NOT_AVAILABLE을 보고합니다. 셀러 목록에 없는 키 인자는 공개 verify 엔드포인트로 폴백합니다(source:"public-verify").verify—POST /api/v1/licenses/verify. 공개 — 로그인 불필요. 유효하면 exit0, 무효면1.
yp integration check
yp integration check <project_id> [--api-base url]GET /api/v1/projects/:id/integration(인증 필요). 상태: CONFIGURED / EMPTY / NOT_CONFIGURED / NOT_AVAILABLE.
백엔드 패리티 노트
이 라우트는 이제 양쪽 백엔드에 구현되어 있습니다 — d3 패리티 포트가 be-cloudflare에 추가했습니다(be-cloudflare/src/lib.rs/api/v1/projects/:id …/integration arm). CLI의 --help 텍스트는 여전히 "Axum-only"라고 말하지만(포트 이전의 오래된 문자열), NOT_AVAILABLE 디그레이드 경로는 라우트가 실제로 라우팅되지 않은 백엔드를 위해 남아 있습니다(Worker의 request_id 404 지문으로 감지).
엔드포인트 커버리지
| 명령 | 엔드포인트 | be/ (Axum) | be-cloudflare |
|---|---|---|---|
auth login | POST /api/v1/auth/login | ✓ (토큰 없음 — X-Dev-User dev 인증) | ✓ (JWT) |
auth status | GET /api/v1/me | ✓ | ✓ |
project list/inspect | GET /api/v1/projects[/:id] | ✓ | ✓ |
license status | GET /api/v1/licenses | ✓ | ✓ |
| — 상세 프로브 | GET /licenses/:id/bindings, /usage | NOT_AVAILABLE | ✓ |
license verify | POST /api/v1/licenses/verify | ✓ 공개 | ✓ 공개 |
integration check | GET /api/v1/projects/:id/integration | ✓ | ✓ (d3 포트) |
--json 출력
모든 명령은 기본으로 사람용 요약을, --json으로 단일 JSON 객체를 출력합니다:
yp license verify NG-AB12-CD34 --json
# {"command":"license verify","api_base":"…","valid":true,"result":{…}}2
yp-mcp는 정확히 이 모드를 소비합니다 — MCP 도구 결과는 CLI의 JSON 그대로에 cli_exit_code와 수신 영수증(receipt)이 붙은 것입니다.