@emdash-cms/plugin-cli는 작성 툴체인입니다: scaffold, build, watch, validate, bundle, publish, 그리고 ID 및 검색 기능. 바이너리는 emdash-plugin입니다.
명령어
CLI는 다음 명령어를 제공합니다:
emdash-plugin init [name] Scaffold a new sandboxed plugin
emdash-plugin build Build dist/ (plugin.mjs, manifest.json, index.mjs)
emdash-plugin dev Watch sources and rebuild on change
emdash-plugin bundle Pack dist/ + assets into a registry tarball
emdash-plugin validate [path] Validate emdash-plugin.jsonc against the schema
emdash-plugin publish --url <url> Publish a release pointing at a hosted tarball
emdash-plugin login <handle-or-did> Sign in with your Atmosphere account
emdash-plugin logout [--did <did>] Revoke the active session
emdash-plugin whoami Show stored sessions
emdash-plugin switch <did> Switch the active publisher session
emdash-plugin search <query> Free-text registry search
emdash-plugin info <handle-or-did> <slug> Show package details
비대화형 출력 명령어(whoami, validate, search, info, login, publish)는 기계 판독 가능한 출력을 위해 --json을 허용합니다. 검색 명령어(search, info)는 --registry-url <url> (또는 EMDASH_REGISTRY_URL)을 허용합니다.
다음 예제는 대부분의 플러그인이 package.json에 추가하는 두 가지 스크립트를 보여줍니다:
{
"scripts": {
"build": "emdash-plugin build",
"dev": "emdash-plugin dev"
}
}
init
init으로 새 플러그인을 만듭니다:
npx @emdash-cms/plugin-cli init my-plugin
이것은 자체 포함 플러그인을 생성합니다: emdash-plugin.jsonc, src/plugin.ts (satisfies SandboxedPlugin 형식의 예제 라우트 하나), package.json, tsconfig.json, 테스트, README 및 .gitignore. 슬러그는 유일한 필수 입력입니다. 슬러그만으로 생성된 스캐폴드는 유효한 시작점입니다: 매니페스트에는 플러그인이 로드되거나 게시되기 전에 작성해야 하는 몇 가지 필드(게시자, 저자 및 보안 연락처)에 대한 TODO: 주석이 포함되어 있습니다.
build
build는 emdash-plugin.jsonc, src/plugin.ts 및 선택적 형제 package.json을 읽고 다음 파일을 생성합니다:
| 아티팩트 | 설명 |
|---|---|
dist/plugin.mjs (+ dist/plugin.d.mts) | 훅과 라우트. 프로세스 내에서 로드되고(plugins: []) 샌드박스 로더에 의해 로드됩니다(sandboxed: []). |
dist/manifest.json | src/plugin.ts에서 읽은 훅과 라우트를 포함하는 플러그인의 매니페스트. bundle은 이 파일을 그대로 포함합니다. npm 소비자는 JSONC 소스를 파싱하지 않고 읽습니다. |
dist/index.mjs (+ dist/index.d.mts) | 사이트가 astro.config.mjs에서 가져오는 설명자 모듈. 형제 package.json이 존재할 때만 생성됩니다. 레지스트리 전용 플러그인은 아무것도 가져오지 않으므로 이를 건너뜁니다. |
dist/는 빌드 출력입니다. 커밋하지 마십시오. 스캐폴드의 .gitignore가 이를 제외하고, 설치 시 다시 빌드됩니다.
dev
src/**, emdash-plugin.jsonc 및 package.json을 감시하고 150ms마다 재빌드를 디바운스합니다. 재빌드는 직렬화됩니다. 실패한 재빌드 시 마지막으로 정상적인 dist/를 그대로 유지하므로 워크스페이스/파일 링크를 통해 플러그인을 가져오는 사이트는 다음 성공적인 빌드까지 계속 작동합니다. Ctrl-C는 깔끔하게 종료됩니다.
여기서 pnpm dev를 실행하고 사이트에서 pnpm add file:../path/to/this를 실행한 다음 플러그인의 기본 내보내기를 emdash({ sandboxed: [...] })로 가져와서 실제 사이트에 대해 개발합니다.
validate
emdash-plugin validate # ./emdash-plugin.jsonc
emdash-plugin validate path/ # a specific directory
매니페스트의 교차 필드 규칙을 포함한 tsc 스타일 file:line:column 진단으로 오프라인 스키마 검사. 네트워크 없음. 프리 커밋 또는 CI 게이트로 적합합니다. 매니페스트 참조를 참조하세요.
bundle
bundle은 build 위의 얇은 패키징 단계입니다:
dist/를 생성하기 위해build를 실행합니다.- 번들 유효성 검사: Node 내장 가져오기 없음, 과대 파일 없음, 기능 정상성.
- 선택적 자산 수집 — README, 아이콘, 스크린샷.
- tarball 생성. tarball 내에서
plugin.mjs는backend.js로 패킹됩니다(레지스트리가 기대하는 파일 이름). 출력은dist/<slug>-<version>.tar.gz입니다.
--validate-only는 tarball 생성을 건너뛰지만 여전히 dist/ 아티팩트를 생성합니다 — “validate”는 “build first”를 의미합니다.
publish
CLI는 아티팩트를 호스팅하지 않습니다. 공개적으로 어디서든 호스팅하는 것은 귀하입니다.
emdash-plugin login # if not already logged in
emdash-plugin bundle # produces dist/<slug>-<version>.tar.gz
# upload that tarball to a public URL, then:
emdash-plugin publish --url https://your-host/my-plugin-1.0.0.tar.gz
publish는 프로필 필드에 대한 매니페스트를 읽고 게시자 고정을 강제합니다. 첫 번째 게시 시 --license 및 보안 연락처를 전달합니다(또는 매니페스트에 보관). 명시적 플래그는 매니페스트 값을 재정의하며, 이는 CI에서 유용합니다. --no-manifest는 완전히 선택 해제합니다.
전체 안내: 번들링 및 게시.
프로그래매틱 API
import { buildPlugin, bundlePlugin } from "@emdash-cms/plugin-cli";
await buildPlugin({ dir: "./my-plugin" });
const result = await bundlePlugin({ dir: "./my-plugin" });
검색 및 자격 증명 도우미의 경우 @emdash-cms/registry-client에서 가져옵니다.