플러그인을 만든 뒤 EmDash Marketplace에 게시하면 다른 사이트가 관리 대시보드에서 설치할 수 있습니다.
사전 요건
게시 전에 플러그인이 다음을 만족하는지 확인하세요.
- 플러그인 진입점을 가리키는
"."export가 있는 유효한package.json - 고유한
id와 올바른 semverversion으로definePlugin()사용 - 필요한 API를
capabilities로 선언
번들 형식
게시된 플러그인은 다음을 담은 .tar.gz tarball로 배포됩니다.
| 파일 | 필수 | 설명 |
|---|---|---|
manifest.json | 예 | definePlugin()에서 추출한 플러그인 메타데이터 |
backend.js | 아니오 | 번들된 샌드박스 코드(자체 포함 ES 모듈) |
admin.js | 아니오 | 번들된 관리 UI 코드 |
README.md | 아니오 | 플러그인 문서 |
icon.png | 아니오 | 플러그인 아이콘(256x256 PNG) |
screenshots/ | 아니오 | 최대 5개 스크린샷(PNG/JPEG, 최대 1920x1080) |
manifest.json은 definePlugin() 호출에서 자동 생성됩니다. 플러그인 ID, 버전, capabilities, 훅 이름, 라우트 이름, 관리 설정이 포함되며 실행 코드는 없습니다.
번들 만들기
emdash plugin bundle 명령이 플러그인 소스에서 tarball을 만듭니다.
cd packages/plugins/my-plugin
emdash plugin bundle
수행 내용:
package.json을 읽어 진입점을 찾습니다- tsdown으로 메인 진입점을 빌드해 manifest를 추출합니다
backend.js를 번들합니다(minify, tree-shake, 자체 포함)"./admin"export가 있으면admin.js를 번들합니다- 자산(README, 아이콘, 스크린샷)을 수집합니다
- 번들을 검증합니다(크기 제한, backend에 Node.js builtin 없음)
dist/에{id}-{version}.tar.gz를 씁니다
진입점 해석
bundle 명령은 package.json의 exports로 코드를 찾습니다.
{
"exports": {
".": { "import": "./dist/index.mjs" },
"./sandbox": { "import": "./dist/sandbox-entry.mjs" },
"./admin": { "import": "./dist/admin.mjs" }
}
}
| Export | 용도 | 빌드 방식 |
|---|---|---|
"." | 메인 진입점 — manifest 추출용 | Externals: emdash, @emdash-cms/* |
"./sandbox" | 샌드박스에서 실행되는 백엔드 코드 | 완전 자체 포함(externals 없음) |
"./admin" | 관리 UI 컴포넌트 | 완전 자체 포함 |
"./sandbox"가 없으면 대체로 src/sandbox-entry.ts를 찾습니다.
옵션
emdash plugin bundle [--dir <path>] [--outDir <path>]
| 플래그 | 기본값 | 설명 |
|---|---|---|
--dir | 현재 디렉터리 | 플러그인 소스 디렉터리 |
--outDir, -o | dist | tarball 출력 디렉터리 |
검증
bundle 명령은 다음을 확인합니다.
- 크기 제한 — 전체 번들이 5MB 미만
- Node.js builtin 금지 —
backend.js는fs,path,child_process등을 import할 수 없음(샌드박스 코드는 Node.js가 아닌 V8 isolate에서 실행) - 아이콘 크기 —
icon.png는 256x256 권장(다르면 경고 후 포함) - 스크린샷 제한 — 최대 5개, 최대 1920x1080
게시
emdash plugin publish 명령이 tarball을 마켓플레이스에 업로드합니다.
emdash plugin publish
dist/에서 가장 최근 .tar.gz를 찾아 업로드합니다. tarball을 직접 지정하거나 게시 전에 빌드할 수도 있습니다.
# tarball 경로 명시
emdash plugin publish --tarball dist/my-plugin-1.0.0.tar.gz
# 먼저 빌드 후 게시
emdash plugin publish --build
인증
처음 게시할 때 CLI는 GitHub으로 인증합니다.
- CLI가 브라우저에서 GitHub 디바이스 인증 페이지를 엽니다
- 터미널에 표시된 코드를 입력합니다
- GitHub이 access token을 발급합니다
- CLI가 marketplace JWT로 교환합니다(
~/.config/emdash/auth.json에 저장)
토큰은 30일간 유효합니다. 만료 후 다음 publish 시 재인증을 요청받습니다.
인증은 별도로 관리할 수 있습니다.
# 게시 없이 로그인
emdash plugin login
# 로그아웃(저장된 토큰 삭제)
emdash plugin logout
최초 등록
플러그인 ID가 마켓플레이스에 아직 없으면 emdash plugin publish가 첫 버전 업로드 전에 자동 등록합니다.
버전 요구사항
게시하는 각 버전은 이전보다 높은 semver여야 합니다. 기존 버전을 덮어쓰거나 다시 게시할 수 없습니다.
보안 감사
게시되는 각 버전은 자동 보안 감사를 거칩니다. 마켓플레이스는 backend.js와 admin.js를 스캔하여 다음을 찾습니다.
- 데이터 유출 패턴
- 설정을 통한 자격 증명 수집
- 난독화 코드
- 리소스 남용(암호화폐 채굴 등)
- 의심스러운 네트워크 활동
감사는 pass, warn, fail 판정을 내리며 플러그인 마켓플레이스 목록에 표시됩니다. 마켓플레이스 enforcement 수준에 따라 fail은 게시 전체를 막을 수 있습니다.
옵션
emdash plugin publish [--tarball <path>] [--build] [--dir <path>] [--registry <url>]
| 플래그 | 기본값 | 설명 |
|---|---|---|
--tarball | dist/의 최신 .tar.gz | tarball 명시 경로 |
--build | false | 게시 전 emdash plugin bundle 실행 |
--dir | 현재 디렉터리 | 플러그인 디렉터리(--build와 함께) |
--registry | https://marketplace.emdashcms.com | 마켓플레이스 URL |
전체 워크플로
일반적인 게시 주기:
# 1. 변경 사항 적용
# 2. definePlugin()과 package.json에서 버전 올리기
# 3. 한 번에 번들 + 게시
emdash plugin publish --build
번들을 먼저 확인하려면:
# tarball 빌드
emdash plugin bundle
# 출력 확인
tar tzf dist/my-plugin-1.1.0.tar.gz
# 게시
emdash plugin publish