CLI 레퍼런스

이 페이지

EmDash CLI는 데이터베이스 설정, 타입 생성, 콘텐츠 생성 및 편집, 스키마 관리, 미디어, 사이트 내보내기와 가져오기를 위한 명령을 제공합니다.

설치

CLI는 emdash 패키지에 포함되어 있습니다. 다음 명령으로 설치합니다.

npm install emdash

명령은 npx emdash로 실행하거나 package.json에 스크립트로 추가합니다. 바이너리는 줄여서 em으로도 사용할 수 있습니다.

pnpm dev 같은 패키지 스크립트로 사이트를 시작합니다. 패키지 스크립트는 Astro를 시작하고, EmDash 통합은 emdash-env.d.ts를 생성하며, 런타임은 첫 요청에서 대기 중인 마이그레이션을 실행하고 설정이 완료되기 전에는 번들된 시드의 스키마와 구조를 한 번 적용합니다. 시드의 샘플 콘텐츠는 관리자가 설정 마법사에서 선택한 경우에만 적용됩니다.

인증

실행 중인 EmDash 인스턴스에 연결하는 명령은 다음 순서로 인증을 확인합니다.

  1. --token 플래그 — 명령줄에서 명시적으로 지정한 토큰
  2. EMDASH_TOKEN 환경 변수
  3. 저장된 자격 증명 — ~/.config/emdash/auth.json(emdash login이 저장함)
  4. 개발용 우회 — URL이 localhost이고 사용할 수 있는 토큰이 없으면 개발용 우회 엔드포인트로 자동 인증합니다

types, whoami, content, schema, media, search, taxonomy, menu, site 명령은 실행 중인 인스턴스에 연결합니다. 인증 명령에는 자체 연결 옵션이 있습니다. 로컬 개발 서버를 대상으로 할 때는 토큰이 필요하지 않습니다.

공통 플래그

연결 플래그는 명령마다 다릅니다. 아래의 그룹 명령은 해당 그룹의 모든 하위 명령을 의미합니다.

플래그별칭사용 가능한 명령설명 및 기본값
--url-utypes, login, logout, whoami, content, schema, media, search, taxonomy, menu, site인스턴스 URL. 기본값은 EMDASH_URL 또는 http://localhost:4321
--token-ttypes, whoami, content, schema, media, search, taxonomy, menu, site플래그, EMDASH_TOKEN 또는 저장된 자격 증명의 토큰
--header "Name: Value"-Htypes, login, content, schema, media, search, taxonomy, menu, site반복 가능한 헤더. EMDASH_HEADERS 및 저장된 헤더와 병합됩니다
--jsonwhoami, content, schema, media, search, taxonomy, menu, site터미널용으로 서식을 맞춘 출력 대신 원시 JSON을 출력합니다

출력

명령이 결과를 대화형 터미널에 출력하면 읽기 좋게 서식을 맞춥니다. 위에서 --json이 나열된 명령은 플래그를 설정했거나 출력이 파이프로 전달될 때 원시 JSON을 출력합니다. emdash migrate는 명시적인 --json 옵션을 지정한 경우에만 JSON을 출력합니다.

명령

emdash init

package.json의 템플릿 메타데이터로 로컬 SQLite 데이터베이스를 초기화합니다. 이 명령은 코어 마이그레이션을 실행한 다음 emdash.schema에 지정된 선택적 SQL 파일을 적용합니다. JSON 시드 데이터는 emdash seed를 별도로 실행하세요.

npx emdash init [options]
옵션별칭설명기본값
--database-dSQLite 데이터베이스 경로./data.db
--cwd프로젝트 작업 디렉터리현재 디렉터리
--force-f컬렉션이 이미 있을 때 템플릿 스키마를 다시 적용합니다false

--force 없이는 이미 초기화된 데이터베이스가 변경되지 않습니다. 이 명령은 로컬 SQLite 파일을 직접 엽니다. 배포에서 관리하는 D1, PostgreSQL, libSQL, Hyperdrive 마이그레이션에는 emdash migrate를 사용하세요.

emdash doctor

로컬 SQLite 데이터베이스의 연결, 마이그레이션, 컬렉션, 테이블, 사용자 문제를 확인합니다. 프로젝트에 Wrangler 구성이 있으면 Cron Trigger와 EmDash scheduled() 핸들러가 함께 구성되어 있는지도 확인합니다.

npx emdash doctor [options]
옵션별칭설명기본값
--database-dSQLite 데이터베이스 경로./data.db
--cwd프로젝트 작업 디렉터리현재 디렉터리
--json구조화된 결과를 출력합니다false

이 명령은 각 검사를 통과, 경고, 실패로 보고하며, 검사가 실패하면 0이 아닌 코드로 종료합니다.

emdash seed

JSON 시드를 검증하거나 로컬 SQLite 데이터베이스에 적용합니다. 이 명령은 위치 인수로 경로가 주어지면 그 경로를, 없으면 .emdash/seed.json을, 그다음으로 package.json의 emdash.seed 경로를 사용합니다.

npx emdash seed [path] [options]
옵션별칭설명기본값
--database-dSQLite 데이터베이스 경로./data.db
--cwd프로젝트 작업 디렉터리현재 디렉터리
--validate데이터베이스를 변경하지 않고 시드를 검증합니다false
--no-content항목, 바이라인, 분류 용어를 건너뜁니다false
--on-conflict기존 레코드를 skip, update, error 중 하나로 처리합니다skip
--uploads-dir시드 미디어에 사용하는 로컬 디렉터리./uploads
--media-base-url로컬 시드 미디어에 저장하는 기본 URL/_emdash/api/media/file

시드를 적용하면 먼저 코어 마이그레이션이 실행됩니다. 데이터베이스를 열거나 만들지 않고 파일만 확인해야 할 때는 지속적 통합(CI)에서 --validate를 사용하세요.

emdash migrate

Astro 빌드가 내보내는 코어 마이그레이션 세트를 확인하거나 적용합니다.

npx emdash migrate [options]
npx emdash migrate --check [options]
npx emdash migrate --status --json [options]
npx emdash migrate --release-lock <id> [options]

기본적으로 이 명령은 프로젝트 루트를 찾아 .emdash/migrations.json을 읽습니다. 매니페스트를 프로젝트에 설치된 EmDash 패키지와 대조해 검증하고, 어댑터의 프로젝트 로컬 실행기를 확인하며, SQL을 실행하기 전에 변경할 수 없는 대상을 출력합니다.

옵션

옵션설명
--check아무것도 적용하지 않으며, 대기 중이거나 알 수 없는 마이그레이션 레코드가 있으면 0이 아닌 코드로 종료합니다
--status아무것도 적용하지 않고 정확한 상태를 보고하며, 보고에 성공하면 0으로 종료합니다
--json안정적인 마이그레이션 보고서를 JSON으로 출력합니다
--manifest <path>표준이 아닌 매니페스트 경로를 읽습니다
--from-config매니페스트 대신 신뢰할 수 있는 Astro 구성을 명시적으로 평가합니다
--config <path>--from-config와 함께 사용하는 Astro 구성 경로
--expected-target-fingerprint <sha256>비대화형 적용 또는 잠금 해제에 필요한 보호 장치입니다
--release-lock <id>--status가 보고한 ID의 D1 마이그레이션 잠금을 해제합니다. --check 또는 --status와 함께 쓸 수 없습니다
--database <path>SQLite 경로를 재정의합니다
--database-url-env <name>PostgreSQL 연결 변수 이름을 재정의합니다
--d1 <uuid-or-name>D1 데이터베이스를 명시적으로 선택합니다
--account-id <id>Cloudflare 계정을 명시적으로 선택합니다
--wrangler-config <path>명시적으로 지정한 Wrangler 구성에서 D1 바인딩 메타데이터를 읽습니다
--wrangler-env <name>환경을 선택합니다. --wrangler-config가 필요합니다

대화형이며 사람이 읽을 수 있는 적용 및 잠금 해제는 확인을 요청합니다. 비대화형 적용 또는 잠금 해제, 그리고 --json을 사용하는 모든 적용 또는 잠금 해제에는 대상에 대해 출력된 정확한 핑거프린트가 필요합니다. down이나 --dry-run은 없습니다. 작업이 필요한지 확인하려면 --check를 사용하세요.

종료 코드

코드의미
0성공(성공적인 --status 보고 포함)
1검증, 구성, 대상, 마이그레이션 또는 정리 오류
2--check가 대기 중인 알려진 마이그레이션을 발견함
3--check가 알 수 없는 적용 레코드를 발견함(대기 중인 것보다 우선)
4확인이 없거나 거부되었거나 대상 핑거프린트가 일치하지 않음
130실행기의 제한된 정리 후 중단됨

배포 순서, 대상 자격 증명, D1 마이그레이션 잠금은 코어 데이터베이스 마이그레이션 관리를 참고하세요.

emdash types

실행 중인 EmDash 인스턴스의 스키마에서 TypeScript 타입을 생성합니다.

npx emdash types [options]

옵션

옵션별칭설명기본값
--url-uEmDash 인스턴스 URLhttp://localhost:4321
--token-t인증 토큰환경 변수 또는 저장된 자격 증명
--header-H사용자 지정 요청 헤더. 반복 가능환경 변수 또는 저장된 자격 증명
--json허용되지만 이 명령의 파일이나 진행 상황 출력은 바뀌지 않습니다—
--output-o타입 출력 경로.emdash/types.ts
--cwd작업 디렉터리현재 디렉터리

예시

# Generate types from local dev server
npx emdash types

# Generate from remote instance
npx emdash types --url https://example.com

# Custom output path
npx emdash types --output src/types/emdash.ts

동작

  1. 인스턴스에서 스키마를 가져옵니다
  2. TypeScript 타입 정의를 생성합니다
  3. 타입을 출력 파일에 씁니다
  4. 참고용으로 옆에 schema.json도 씁니다

emdash login

OAuth Device Flow로 EmDash 인스턴스에 로그인합니다.

npx emdash login [options]

옵션

옵션별칭설명기본값
--url-uEmDash 인스턴스 URLhttp://localhost:4321
--header-H사용자 지정 요청 헤더. 반복 가능EMDASH_HEADERS의 값

동작

  1. 인스턴스에서 인증 엔드포인트를 찾습니다
  2. localhost이고 인증이 구성되어 있지 않으면 개발용 우회를 자동으로 사용합니다
  3. 그렇지 않으면 OAuth Device Flow를 시작하여 코드를 표시하고 브라우저를 엽니다. 코드를 입력하면 승인하기 전에 관리자 페이지에 CLI가 받게 될 권한과, 요청되었지만 사용자의 역할이 허용하지 않는 권한이 나열됩니다.
  4. 권한 부여를 폴링한 다음 자격 증명을 ~/.config/emdash/auth.json에 저장합니다

저장된 자격 증명은 같은 인스턴스를 대상으로 하는 이후의 모든 명령에서 자동으로 사용됩니다.

emdash logout

로그아웃하고 저장된 자격 증명을 제거합니다.

npx emdash logout [options]

옵션

옵션별칭설명기본값
--url-uEmDash 인스턴스 URLhttp://localhost:4321

emdash whoami

현재 인증된 사용자를 표시합니다.

npx emdash whoami [options]

옵션

옵션별칭설명기본값
--url-uEmDash 인스턴스 URLhttp://localhost:4321
--token-t인증 토큰환경 변수/저장된 자격 증명
--jsonJSON으로 출력합니다

이메일, 이름, 역할, 인증 방식, 인스턴스 URL을 표시합니다.

emdash content

콘텐츠 항목을 관리합니다. 모든 하위 명령은 EmDashClient를 통해 원격 API를 사용합니다.

content list <collection>

npx emdash content list posts
npx emdash content list posts --status published --limit 10
옵션설명
--status상태로 필터링합니다
--locale로케일로 필터링합니다
--limit최대 항목 수
--cursor페이지네이션 커서

content get <collection> <id>

npx emdash content get posts 01ABC123
npx emdash content get posts 01ABC123 --raw
옵션설명
--localeID 인수가 슬러그일 때 사용할 로케일
--rawMarkdown 대신 원시 Portable Text를 반환합니다
--published대기 중인 초안을 무시하고 게시된 데이터만 반환합니다

응답에는 _rev 토큰이 포함됩니다. 현재 상태를 확인했음을 알리기 위해, 덮어쓰기 전에 이 토큰을 content update에 전달하세요.

content create <collection>

npx emdash content create posts --data '{"title": "Hello"}'
npx emdash content create posts --file post.json --slug hello-world
cat post.json | npx emdash content create posts --stdin
옵션설명
--data콘텐츠 데이터가 담긴 JSON 문자열
--fileJSON 파일에서 데이터를 읽습니다
--stdin표준 입력에서 데이터를 읽습니다
--slug콘텐츠 슬러그
--locale콘텐츠 로케일
--translation-of이 항목을 번역본으로 연결할 콘텐츠 항목의 ID
--draft자동으로 게시하지 않고 초안으로 유지합니다

데이터는 --data, --file, --stdin 중 정확히 하나로 제공하세요. --draft를 설정하지 않으면 새 항목은 자동으로 게시됩니다.

content update <collection> <id>

현재 상태를 확인했음을 증명하려면 이전 get에서 받은 _rev 토큰을 제공해야 합니다. 이는 확인하지 못한 변경 사항을 덮어쓰지 않도록 막아 줍니다. 다음 단계는 항목을 읽은 다음 그 토큰으로 업데이트합니다.

# 1. Read the item, note the _rev
npx emdash content get posts 01ABC123

# 2. Update with the _rev from step 1
npx emdash content update posts 01ABC123 \
  --rev MToyMDI2LTAyLTE0... \
  --data '{"title": "Updated"}'
옵션설명
--revget에서 받은 리비전 토큰(필수)
--data콘텐츠 데이터가 담긴 JSON 문자열
--fileJSON 파일에서 데이터를 읽습니다
--localeID 인수가 슬러그일 때 사용할 로케일
--draft자동으로 게시하지 않고 업데이트를 초안으로 유지합니다
--override-lock다른 편집자가 항목을 열어 두었더라도 씁니다

get 이후에 항목이 변경되었다면 서버는 409 Conflict를 반환합니다. 다시 읽은 다음 재시도하세요.

누군가 관리자에서 항목을 열어 두었다면 서버는 코드 ENTRY_LOCKED와 잠금 보유자를 알려 주는 메시지와 함께 409를 반환합니다. 상대가 끝낼 때까지 기다리거나 --override-lock을 전달하세요. 같은 플래그를 content delete, content publish, content unpublish, content schedule에서도 사용할 수 있습니다.

content delete <collection> <id>

npx emdash content delete posts 01ABC123

콘텐츠 항목을 소프트 삭제합니다(휴지통으로 이동).

다른 편집자가 열어 둔 항목을 삭제하려면 --override-lock을 전달하세요.

content publish <collection> <id>

npx emdash content publish posts 01ABC123

다른 편집자가 열어 둔 항목을 게시하려면 --override-lock을 전달하세요.

content unpublish <collection> <id>

npx emdash content unpublish posts 01ABC123

다른 편집자가 열어 둔 항목의 게시를 취소하려면 --override-lock을 전달하세요.

content schedule <collection> <id>

npx emdash content schedule posts 01ABC123 --at 2026-03-01T09:00:00Z
옵션설명
--atZ 또는 명시적인 UTC 오프셋이 포함된 ISO 8601 날짜와 시간(필수)

다른 편집자가 열어 둔 항목을 예약하려면 --override-lock을 전달하세요.

content restore <collection> <id>

npx emdash content restore posts 01ABC123

휴지통에 있는 콘텐츠 항목을 복원합니다.

content translations <collection> <id>

항목의 번역 그룹에 있는 모든 번역을 나열합니다.

npx emdash content translations posts 01ABC123

결과에는 각 번역의 ID, 로케일, 슬러그, 상태, 그리고 요청한 항목인지 여부가 포함됩니다.

emdash schema

컬렉션과 필드를 관리합니다.

schema list

npx emdash schema list

모든 컬렉션을 나열합니다.

schema get <collection>

npx emdash schema get posts

컬렉션과 모든 필드를 표시합니다.

schema create <collection>

npx emdash schema create articles --label Articles
npx emdash schema create articles --label Articles --label-singular Article --description "Blog articles"
옵션설명
--label컬렉션 레이블(필수)
--label-singular단수형 레이블
--description컬렉션 설명

schema delete <collection>

npx emdash schema delete articles
npx emdash schema delete articles --force
옵션설명
--force확인을 건너뜁니다

--force를 설정하지 않으면 확인을 요청합니다.

schema add-field <collection> <field>

npx emdash schema add-field posts body --type portableText --label "Body Content"
npx emdash schema add-field posts featured --type boolean --required
옵션설명
--type필드 타입: string, text, url, number, integer, boolean, datetime, select, multiSelect, portableText, image, file, reference, json, slug, repeater 중 하나(필수)
--label필드 레이블(기본값은 필드 슬러그)
--required필드를 필수로 지정할지 여부

schema remove-field <collection> <field>

npx emdash schema remove-field posts featured

emdash media

미디어 항목을 관리합니다.

media list

npx emdash media list
npx emdash media list --mime image/png --limit 20
옵션설명
--mimeMIME 타입으로 필터링합니다
--limit항목 수
--cursor페이지네이션 커서

media upload <file>

npx emdash media upload ./photo.jpg
npx emdash media upload ./photo.jpg --alt "A sunset" --caption "Taken in Bristol"
옵션설명
--alt대체 텍스트
--caption캡션 텍스트

media get <id>

npx emdash media get 01MEDIA123

media delete <id>

npx emdash media delete 01MEDIA123

media repair-usage

하나의 컬렉션 또는 모든 콘텐츠 컬렉션에 대해 콘텐츠 미디어 사용 인덱스를 복구합니다. 가져오기나 데이터베이스 직접 쓰기 이후 사용 현황 범위가 오래되었거나 신뢰할 수 없을 때 사용하세요.

npx emdash media repair-usage --collection posts
npx emdash media repair-usage --all
npx emdash media repair-usage --all --json
옵션별칭설명
--collection-c하나의 콘텐츠 컬렉션을 복구합니다
--all모든 콘텐츠 컬렉션을 복구합니다

--collection과 --all 중 정확히 하나를 전달하세요. 원격 복구에는 Admin 사용자와 admin 범위를 가진 인증 토큰이 필요합니다.

모든 콘텐츠의 복구는 동기적으로 실행되며 대규모 사이트에서는 느리거나 비용이 클 수 있습니다. 컬렉션 하나만 복구하면 될 때는 --collection을 사용하는 것이 좋습니다.

구조화된 complete, partial, stale 복구 결과는 0으로 종료하고, 구조화된 failed 결과는 1로 종료합니다. 자동화와 cron 작업은 종료 코드 0을 완전한 범위로 간주하지 말고, --json을 사용해 status, failedSourceCount, skippedSourceCount, 컬렉션별 요약을 파싱해야 합니다.

콘텐츠 전반에 대한 전체 텍스트 검색입니다.

npx emdash search "hello world"
npx emdash search "hello" --collection posts --limit 5
옵션별칭설명
--collection-c컬렉션으로 필터링합니다
--locale로케일로 필터링합니다
--limit-l최대 결과 수

emdash taxonomy

분류 체계와 용어를 관리합니다.

taxonomy list

npx emdash taxonomy list

taxonomy terms <name>

npx emdash taxonomy terms categories
npx emdash taxonomy terms tags --limit 50
옵션별칭설명
--limit-l최대 용어 수
--cursor페이지네이션 커서

taxonomy add-term <taxonomy>

npx emdash taxonomy add-term categories --name "Tech" --slug tech
npx emdash taxonomy add-term categories --name "Frontend" --parent 01PARENT123
옵션설명
--name용어 레이블(필수)
--slug용어 슬러그(기본값은 이름을 슬러그화한 값)
--parent부모 용어 ID(계층형 분류 체계용)

emdash menu

탐색 메뉴를 관리합니다.

npx emdash menu list
npx emdash menu get primary

메뉴와 모든 항목을 반환합니다.

emdash site

사이트 전체를 .emdash 사이트 패키지로 내보내고, 패키지를 빈 사이트로 가져옵니다. 사이트 전송 가이드에서 패키지에 무엇이 들어 있는지, 대상 사이트에 무엇이 필요한지, 가져오기 계획을 어떻게 읽는지 설명합니다.

토큰에는 emdash login 토큰이 가진 admin 범위 또는 그에 해당하는 전송 범위가 필요합니다. 내보내기에는 transfer:export, 가져오기에는 transfer:analyze와 transfer:execute가 필요합니다. 이 범위가 없는 토큰은 INSUFFICIENT_SCOPE로 실패합니다.

진행 메시지는 항상 stderr로, 결과는 stdout으로 출력됩니다. --json을 사용하거나 stdout이 터미널이 아니면 stdout에는 JSON 결과만 담깁니다. 오류는 { "error": { "code": "…", "message": "…" } } 형식으로 출력됩니다. 코드는 서버의 오류 코드에 더해, 잘못된 플래그에는 INVALID_ARGUMENT, 재개한 가져오기에 여전히 패키지 파일이 필요할 때는 PACKAGE_FILE_REQUIRED, 그리고 UNKNOWN_ERROR가 있습니다.

이 명령은 네트워크 실패와 408, 429, 5xx 응답을 백오프를 두고 재시도합니다.

site export

사이트를 내보내 패키지 파일로 씁니다.

npx emdash site export --output site.emdash
옵션별칭설명기본값
--output-o쓸 패키지 파일(필수)
--no-comments댓글과 댓글 반응을 제외합니다댓글 포함

이 명령은 내보내기를 시작하고 완료될 때까지 진행시킨 다음 패키지 파일을 파일 단위로 다운로드합니다. 다운로드한 매니페스트가 내보내기의 패키지 다이제스트와 일치하는지 확인하며, 일치하지 않으면 아무것도 쓰기 전에 TRANSFER_PACKAGE_DIGEST_MISMATCH로 실패합니다. 각 파일을 쓰기 전에 크기와 SHA-256 다이제스트를 확인합니다. 패키지는 <output>.partial에 쓰여지고 완료되면 출력 경로로 이름이 바뀝니다.

명령은 진행 상황을 <output>.partial.json에, 다운로드한 파일을 <output>.parts/ 디렉터리에 보관합니다. 중단된 후 같은 명령을 다시 실행하면 같은 내보내기를 재개합니다. 이미 다운로드한 파일은 확인한 뒤 재사용하며, 명령은 몇 개를 재사용했는지 보고합니다. 패키지가 쓰여지면 둘 다 삭제됩니다. 진행 파일이 다른 URL이나 다른 댓글 설정으로 작성된 경우, 또는 해당 내보내기가 실패했거나 만료된 경우에는 무시되며, 이때 명령은 새 내보내기를 시작합니다.

JSON 결과에는 operationId, output, packageDigest, files, bytes, resumed가 들어 있습니다.

site import <file>

패키지를 두 단계로 가져옵니다. 먼저 분석한 다음, 분석이 출력한 계획 다이제스트를 확인합니다.

npx emdash site import site.emdash --analyze
npx emdash site import site.emdash --plan sha256:3f1c… --confirm
옵션설명
--analyze패키지를 업로드하고 분석한 다음 가져오기 계획을 출력합니다
--map-principal <from>=<to>--analyze와 함께 사용: 패키지의 주체(principal)를 ID 또는 이메일 주소로 지정해 사이트 사용자(ID 또는 이메일 주소) 또는 none에 매핑합니다. 반복 가능
--use-target-title--analyze와 함께 사용: 패키지의 제목 대신 이 사이트의 제목을 유지합니다
--use-target-tagline--analyze와 함께 사용: 패키지의 태그라인 대신 이 사이트의 태그라인을 유지합니다
--plan <digest>실행할 계획 다이제스트. sha256:<hex> 또는 16진수만 지정합니다. --confirm이 필요합니다
--confirm--plan으로 지정한 계획을 실행합니다. --plan이 필요합니다
--yes별칭은 -y. cancel 또는 abandon과 함께 사용: 확인 프롬프트를 건너뜁니다

--analyze는 패키지 파일 전체를 로컬에서 검증한 다음, 사이트에 같은 패키지의 기존 가져오기가 있으면 찾고 없으면 새로 만듭니다. 사이트에 아직 없는 파일을 업로드하고 분석을 실행한 뒤 계획을 출력합니다. 출력에는 패키지와 계획 다이제스트, 레코드 수, 크기, 제목과 태그라인 선택, 각 주체와 그 매핑, 「Differences from the source site」 아래의 변환 내용, 경고, 차단 요소가 포함됩니다. 같은 패키지의 이전 가져오기가 실패했거나, 취소되었거나 포기되었거나, 만료된 경우 명령은 경고를 표시하고 새 가져오기를 시작합니다.

결정 사항은 가져오기와 함께 저장되므로, 결정 플래그 없이 나중에 --analyze를 실행해도 그대로 유지됩니다. 결정 사항이 바뀔 때마다 새 계획 다이제스트가 만들어집니다. 결정 사항은 --plan과 함께 쓸 수 없으며, --plan은 --analyze와 함께 쓸 수 없습니다.

--plan <digest> --confirm은 다이제스트가 현재 계획과 일치할 때만 가져오기를 실행하고, 완료될 때까지 진행시킨 다음 영수증을 출력합니다. 검토한 이후 계획이 바뀌었다면 명령은 TRANSFER_PLAN_DIGEST_MISMATCH로 실패합니다. 다시 분석하고 새 다이제스트를 확인하세요.

--analyze의 JSON 결과에는 operationId, state, packageDigest, planDigest, executable, 전체 plan이 들어 있습니다. --confirm의 JSON 결과에는 operationId, state(complete), receipt, receiptDigestValid가 들어 있으며, receiptDigestValid는 영수증의 receiptDigest가 그 내용과 일치하는지를 알려 줍니다.

다음 형식은 작업 ID로 가져오기를 대상으로 동작합니다.

명령설명
emdash site import status <operation-id>가져오기의 상태, 단계, 진행률, 다이제스트, 오류와 업로드된 파일 수를 출력합니다. JSON 결과는 { operation, files: { declared, verified } }입니다.
emdash site import resume <operation-id> [file]현재 상태에서 가져오기를 이어서 진행합니다. 업로드를 마치거나, 분석을 마치고 계획을 출력하거나, 실행을 마치고 영수증을 출력합니다. 패키지 파일은 가져오기가 아직 업로드 중일 때만 전달하세요.
emdash site import receipt <operation-id>완료된 가져오기의 영수증을 --confirm과 같은 형태로 출력합니다.
emdash site import cancel <operation-id>가져오기를 취소합니다. 실행 중인 가져오기는 현재 배치가 끝난 뒤 멈추며, 이미 쓴 내용은 사이트에 남습니다.
emdash site import abandon <operation-id>실패했거나 취소된 가져오기가 사이트에 남긴 쓰기 차단을 해제합니다. 가져오기가 쓴 내용은 삭제되지 않으므로, 다시 가져오기 전에 사이트를 초기화하거나 새로 설정하세요.

cancel과 abandon은 확인을 요청합니다. 프롬프트를 건너뛰려면 --yes를 전달하세요. --json을 사용하거나 stdout이 터미널이 아닐 때도 프롬프트를 건너뜁니다. stdin이 터미널이 아니고 둘 중 어느 쪽에도 해당하지 않으면 명령은 INVALID_ARGUMENT로 실패합니다. 프롬프트를 거부하면 아무것도 바뀌지 않으며 종료 코드 1로 종료합니다. 둘 다 JSON 결과는 { operationId, state, operation }입니다.

가져오기 명령은 다음 코드로 종료합니다.

코드의미
0성공. status의 경우 진행 중이거나 완료된 가져오기
1오류, 거부된 프롬프트, 영수증 없이 끝난 가져오기, 또는 다이제스트가 일치하지 않는 영수증. status의 경우 실패했거나, 취소되었거나 포기되었거나, 만료된 가져오기
2분석은 끝났지만 계획에 차단 요소가 있음

emdash export-seed

데이터베이스 스키마와 콘텐츠를 시드 파일로 내보냅니다. 로컬 SQLite 파일에서 직접 동작합니다.

데이터베이스에는 설치된 EmDash 버전이 아는 모든 마이그레이션이 적용되어 있어야 합니다. 명령이 대기 중인 마이그레이션을 보고하면 npx emdash migrate를 실행한 다음 다시 내보내세요. 데이터베이스가 더 새로운 EmDash 버전으로 마이그레이션되었다면 내보내기 전에 설치된 버전을 업그레이드하세요. 내보내기는 데이터베이스를 읽기 전용으로 열며 스스로 마이그레이션을 적용하지 않습니다.

npx emdash export-seed [options] > seed.json

옵션

옵션별칭설명기본값
--database-d데이터베이스 파일 경로./data.db
--cwd작업 디렉터리현재 디렉터리
--with-content콘텐츠를 포함합니다(전체 또는 쉼표로 구분한 컬렉션)
--pretty / --no-pretty들여쓰기된 JSON 출력을 켜거나 끕니다보기 좋은 출력 사용
--media-base-url사이트의 공개 URL. 절대 $media URL을 쓰는 데 사용합니다

출력 형식

내보낸 시드 파일에는 다음이 포함됩니다.

  • 설정: 사이트 제목, 태그라인, 소셜 링크
  • 컬렉션: 필드를 포함한 모든 컬렉션 정의
  • 블록 타입: 보존된 모든 버전과 각 타입의 활성 버전 포인터
  • 분류 체계: 분류 체계 정의와 용어
  • 메뉴: 항목이 있는 탐색 메뉴
  • 리디렉션: 상태 301, 302, 307, 308의 리디렉션 규칙
  • 위젯 영역: 위젯 영역과 위젯
  • 섹션: 재사용 가능한 콘텐츠 블록
  • 콘텐츠(요청한 경우): 이식성을 위한 $media 참조와 $ref: 구문이 포함된 항목

시드에는 게시 시각을 위한 필드가 없으므로 예약된 항목은 초안으로 내보내집니다. 내보내기는 emdash seed가 거부할 항목을 stderr에 경고를 표시하고 제외합니다. 즉 상태 410 또는 451의 리디렉션 규칙, 소스를 공유하는 추가 규칙(이전 데이터베이스에서 가능), 슬러그에 소문자, 숫자, 하이픈 이외의 문자가 포함된 섹션입니다.

미디어 URL

emdash seed는 각 $media URL을 다운로드해 파일을 대상 사이트의 스토리지에 업로드하므로, 접근할 수 있는 절대 http 또는 https URL이 필요합니다. 소스 사이트의 공개 URL을 전달해 절대 URL을 쓰세요.

npx emdash export-seed --with-content=all --media-base-url=https://example.com > seed.json

시드를 적용하는 동안 사이트는 해당 URL 아래의 /_emdash/api/media/file/에서 미디어를 제공해야 하며, URL은 localhost나 사설 네트워크 주소를 가리켜서는 안 됩니다. emdash seed는 그런 주소에서의 다운로드를 거부합니다. --media-base-url이 없으면 $media URL은 사이트 상대 경로가 되어 emdash seed가 건너뛰고 필드가 빈 상태로 남으며, 내보내기는 stderr에 경고를 출력합니다.

이미지 및 파일 필드와 리피터의 이미지 하위 필드는 $media 참조로 내보내집니다. Portable Text 필드 안의 이미지는 저장된 미디어 ID와 URL을 그대로 유지하며, 이는 다른 사이트에서는 해석되지 않습니다.

emdash secrets

플러그인 시크릿을 암호화하는 데 사용하는 키를 생성하고 확인합니다.

secrets generate

배포용 EMDASH_ENCRYPTION_KEY를 생성합니다. 이 키는 플러그인 시크릿을 저장 시 암호화하는 데 사용됩니다.

npx emdash secrets generate

새 키를 stdout으로 출력합니다. 시크릿 저장소로 파이프하거나 --write로 로컬 .env 파일에 바로 쓸 수 있습니다. Wrangler와 Cloudflare Vite 플러그인은 로컬 개발에서 이 파일을 읽습니다. 독립 실행형 Node 서버는 .env를 자동으로 로드하지 않으므로, 프로세스 관리자를 통해 로드하거나 서버의 프로세스 환경으로 키를 제공하세요. Node.js 배포 가이드에 로컬 명령이 나와 있습니다.

npx emdash secrets generate --write .env

--write는 --force 없이는 기존 항목을 덮어쓰지 않습니다. 암호화된 데이터가 이미 있는 배포의 키를 교체하려면, 생성한 키를 기존 값 앞에 붙이고 키를 쉼표로 구분하세요. EmDash는 새 값을 첫 번째 키로 암호화하고, 이전 항목은 kid에 따라 복호화에 사용합니다. 이전 키를 제거하기 전에 모든 플러그인 시크릿을 다시 저장하세요. EmDash는 현재 저장된 설정이 아직 사용 중인 키 ID를 나열하지 않으므로, 다시 저장한 자격 증명의 목록을 관리하고 이전 키를 제거하기 전에 각 통합을 확인하세요.

secrets fingerprint <key>

키의 값을 노출하지 않고 8자리 핑거프린트(kid)를 출력합니다. CI에서 올바른 키가 배포되었는지 확인하는 데 유용합니다. 다음 명령은 키의 핑거프린트를 출력합니다.

npx emdash secrets fingerprint emdash_enc_v1_...

생성되는 파일

emdash-env.d.ts

Astro 통합은 로컬 개발 서버가 시작될 때 프로젝트 루트에 emdash-env.d.ts를 생성합니다. 실행 중인 개발 사이트를 통해 스키마를 변경하면 파일을 갱신합니다. 선언은 EmDashCollections를 확장하므로, getEmDashCollection("posts") 같은 호출이 로컬 데이터베이스에 정의된 필드를 추론합니다.

이 파일은 자동으로 생성되며 로컬 Astro 개발 워크플로의 일부입니다. 만들기 위해 emdash types를 실행할 필요는 없습니다.

.emdash/types.ts

emdash types 명령은 실행 중인 인스턴스의 스키마를 가져와 독립적인 TypeScript 인터페이스를 씁니다. 스키마가 원격 EmDash 인스턴스에 있을 때, 도구가 사용자 지정 경로의 파일을 필요로 할 때, 또는 로컬 Astro 개발 서버가 실행 중이지 않을 때 사용하세요.

// Generated by EmDash CLI
// Do not edit manually - run `emdash types` to regenerate

import type { PortableTextBlock } from "emdash";

export interface Post {
	id: string;
	slug: string | null;
	status: string;
	title: string;
	content?: PortableTextBlock[];
	createdAt: Date;
	updatedAt: Date;
	publishedAt: Date | null;
	bylines?: ContentBylineCredit[];
	terms?: Record<string, TaxonomyTerm[]>;
}

원격 출력에는 독립적인 컬렉션 인터페이스가 들어 있으며 EmDashCollections를 확장하지 않습니다. emdash types를 실행할 때만 바뀌며, emdash-env.d.ts는 모듈 확장을 사용하고 로컬 개발의 일부로 갱신됩니다.

.emdash/schema.json

이 명령은 선택한 TypeScript 출력 옆에 schema.json이라는 이름의 원시 스키마 내보내기도 씁니다. 기본 출력 경로에서는 파일이 .emdash/schema.json입니다.

{
  "version": "a1b2c3d4",
  "collections": [
    {
      "slug": "posts",
      "label": "Posts",
      "fields": [...]
    }
  ]
}

환경 변수

변수설명
EMDASH_DATABASE_URL데이터베이스 URL을 재정의합니다
EMDASH_TOKEN원격 작업용 인증 토큰
EMDASH_URL공유 원격 클라이언트를 사용하는 명령의 기본 URL
EMDASH_HEADERS공유 원격 클라이언트와 login에 쓰는, 줄바꿈으로 구분한 사용자 지정 요청 헤더
EMDASH_ENCRYPTION_KEY플러그인 시크릿을 저장 시 암호화하는 키. 운영자가 제공하며 데이터베이스에는 절대 저장되지 않습니다. emdash secrets generate로 생성합니다.
EMDASH_PREVIEW_SECRET미리 보기 HMAC 시크릿을 재정의하는 선택적 설정. 설정하지 않으면 EmDash가 하나를 생성해 options 테이블에 저장합니다.
EMDASH_IP_SALT댓글 작성자 IP 해시용 솔트를 재정의하는 선택적 설정. 설정하지 않으면 EmDash가 하나를 생성해 options 테이블에 저장합니다.
EMDASH_AUTH_SECRET레거시. 설정되어 있으면 IP 솔트의 원천으로 사용되어, 기존 설치가 업그레이드 후에도 안정적인 댓글 작성자 IP 해시를 유지하도록 합니다. 새 설치에서는 설정하지 마세요.

패키지 스크립트

자주 쓰는 명령은 편의를 위해 package.json 스크립트로 추가하세요.

{
	"scripts": {
		"dev": "astro dev",
		"types": "emdash types",
		"export-seed": "emdash export-seed",
		"db:reset": "rm -f data.db"
	}
}

일반 종료 코드

대부분의 명령은 성공에 0, 오류에 1을 사용합니다. emdash migrate는 종료 코드 표에 나열된 특정 결과에 대해 코드 2, 3, 4, 130도 사용합니다. emdash site import는 가져오기 계획에 차단 요소가 있을 때 2를 사용합니다.

코드설명
0성공
1오류(구성, 네트워크, 데이터베이스)