This release includes 3 breaking changes for platform teams planning a safe upgrade.
✓ No known CVEs patched in this version
Topics
Affected surfaces
Summary
AI summaryUpdates Minor Changes, Patch Changes, and https://github.com/ascorbic across a mixed release.
Changes in this release
| Type | Severity | Summary | CVE |
|---|---|---|---|
| Breaking | Medium |
Renames `@emdash-cms/registry-cli` to `@emdash-cms/plugin-cli` and binary from `emdash-registry` to `emdash-plugin`. Renames `@emdash-cms/registry-cli` to `@emdash-cms/plugin-cli` and binary from `emdash-registry` to `emdash-plugin`. Source: granite4.1:8b-q6_K@2026-05-20 Confidence: high |
— |
| Feature | Medium |
Adds `emdash-plugin.jsonc` manifest support for plugin authors. Adds `emdash-plugin.jsonc` manifest support for plugin authors. Source: granite4.1:8b-q6_K@2026-05-20 Confidence: high |
— |
| Feature | Medium |
Manifest's optional `publisher` field pins publishing identity, preventing cross-account publishes. Manifest's optional `publisher` field pins publishing identity, preventing cross-account publishes. Source: granite4.1:8b-q6_K@2026-05-20 Confidence: high |
— |
| Feature | Medium |
Adds `emdash-plugin build` and `emdash-plugin dev` commands for plugin authoring. Adds `emdash-plugin build` and `emdash-plugin dev` commands for plugin authoring. Source: granite4.1:8b-q6_K@2026-05-20 Confidence: high |
— |
| Feature | Medium |
`emdash-plugin build` emits runtime bytes, manifest JSON, and descriptor module. `emdash-plugin build` emits runtime bytes, manifest JSON, and descriptor module. Source: granite4.1:8b-q6_K@2026-05-20 Confidence: high |
— |
| Feature | Medium |
Version in `emdash-plugin.jsonc` is now optional; build reconciles version between manifest and package.json. Version in `emdash-plugin.jsonc` is now optional; build reconciles version between manifest and package.json. Source: granite4.1:8b-q6_K@2026-05-20 Confidence: high |
— |
| Feature | Medium |
`emdash-plugin bundle` reduced to packaging step, validates contents, renames plugin.mjs to backend.js inside tarball. `emdash-plugin bundle` reduced to packaging step, validates contents, renames plugin.mjs to backend.js inside tarball. Source: granite4.1:8b-q6_K@2026-05-20 Confidence: high |
— |
| Feature | Medium |
New `emdash-plugin validate` command checks manifest against schema offline. New `emdash-plugin validate` command checks manifest against schema offline. Source: granite4.1:8b-q6_K@2026-05-20 Confidence: low |
— |
| Feature | Medium |
`emdash-plugin dev` watches sources with 150ms debounce, leaves last good dist on rebuild failure. `emdash-plugin dev` watches sources with 150ms debounce, leaves last good dist on rebuild failure. Source: granite4.1:8b-q6_K@2026-05-20 Confidence: low |
— |
| Feature | Medium |
JSON Schema for IDE completion ships at `schemas/emdash-plugin.schema.json`. JSON Schema for IDE completion ships at `schemas/emdash-plugin.schema.json`. Source: granite4.1:8b-q6_K@2026-05-20 Confidence: low |
— |
| Feature | Medium |
Introduces `emdash-plugin validate` command to offline schema validation with diagnostics. Introduces `emdash-plugin validate` command to offline schema validation with diagnostics. Source: granite4.1:30b@2026-05-20-audit Confidence: low |
— |
| Feature | Medium |
'emdash-plugin dev' watches source files with 150 ms debounce and retains last successful `dist/` on rebuild failure. 'emdash-plugin dev' watches source files with 150 ms debounce and retains last successful `dist/` on rebuild failure. Source: granite4.1:30b@2026-05-20-audit Confidence: low |
— |
| Bugfix | Medium |
Renames multi-word flags on `build`, `dev`, and `bundle` from camelCase to kebab-case. Renames multi-word flags on `build`, `dev`, and `bundle` from camelCase to kebab-case. Source: granite4.1:8b-q6_K@2026-05-20 Confidence: low |
— |
| Bugfix | Medium |
Renames `--aggregator` flag on `search` and `info` to `--registry-url` for consistency. Renames `--aggregator` flag on `search` and `info` to `--registry-url` for consistency. Source: granite4.1:8b-q6_K@2026-05-20 Confidence: low |
— |
Full changelog
Minor Changes
-
#1040
e6f7311Thanks @ascorbic! - Addsemdash-plugin.jsoncmanifest support. Plugin authors can now declare profile fields (license, author, security contact, name, description, keywords, repo) once in a hand-edited JSONC file instead of passing them as flags on every publish. The CLI loads./emdash-plugin.jsoncautomatically; explicit flags still win for CI use.New
emdash-plugin validatecommand checks a manifest against the schema offline withtsc-style file:line:column diagnostics.The manifest's optional
publisherfield pins the publishing identity. On first successful publish, the CLI writes the active session's DID back to the manifest. Subsequent publishes verify the active session matches the pinned publisher and refuse on mismatch to prevent accidental cross-account publishes.JSON Schema for IDE completion ships in the package at
schemas/emdash-plugin.schema.json; reference it via"$schema": "./node_modules/@emdash-cms/plugin-cli/schemas/emdash-plugin.schema.json". -
#1057
c0ce915Thanks @ascorbic! - Renames@emdash-cms/registry-clito@emdash-cms/plugin-cliand the binary fromemdash-registrytoemdash-plugin. The package's job has outgrown the original name —init,build,dev,bundle,publish,search,info,login,logout,whoami, andswitchcover plugin authoring + identity + discovery, not just registry interaction. Adopt the new name on first install; the old package is no longer published.This release also adds
emdash-plugin buildandemdash-plugin devand consolidates the build pipeline sobundleis a thin packaging step on top ofbuild.emdash-plugin buildreadsemdash-plugin.jsoncandsrc/plugin.ts, then emits:dist/plugin.mjs(+dist/plugin.d.mts) — runtime bytes (hooks + routes). The same artifact is consumed both in-process (when the plugin is inplugins: []) and by the sandbox loader (when insandboxed: []).dist/manifest.json— wire-shapePluginManifestincluding hooks + routes harvested from probingsrc/plugin.ts.bundlepacks this verbatim into the registry tarball; on the npm path it's metadata that consumers can read without parsing JSONC.dist/index.mjs(+dist/index.d.mts) — descriptor module that default-exports a barePluginDescriptorobject. Emitted only when a siblingpackage.jsonexists (registry-only plugins skip this, since nothing would import it).
emdash-plugin devwatchessrc/**,emdash-plugin.jsonc, andpackage.json, debouncing rebuilds at 150ms. On a failed rebuild it leaves the last gooddist/in place so a downstream site importing the plugin keeps working until the next successful build. Stop with Ctrl-C.A typical plugin
package.json:{ "scripts": { "build": "emdash-plugin build", "dev": "emdash-plugin dev" } }versioninemdash-plugin.jsoncis now optional. The build reconciles the manifest'sversionwithpackage.json#version:- Both set and matching → fine.
- Both set and different → hard error.
- One set → that value wins.
- Neither set → hard error.
The recommended pattern for npm-distributed plugins is to omit
versionfrom the manifest and letpackage.jsonbe the source of truth. Registry-only plugins (nopackage.json) must setversionin the manifest.emdash-plugin bundlehas been reduced to a packaging step: it now callsbuildto producedist/, validates the bundle contents (no Node-builtin imports, no oversized files, capability sanity), collects optional assets (README, icon, screenshots), and tarballs. Inside the tarball,plugin.mjsis renamed tobackend.jsto match the registry's wire-side filename.validateOnlystill skips tarball creation but now produces thedist/artifacts (since "validate" implies "build first").
Patch Changes
-
#1091
6725e91Thanks @ascorbic! - Renames the multi-word flags onbuild,dev, andbundlefrom camelCase to kebab-case for consistency withpublishand standard Unix CLI convention.--outDir->--out-dir--validateOnly->--validate-only
The short alias
-ofor--out-diris unchanged. -
#1092
6788829Thanks @ascorbic! - Renames the--aggregatorflag onsearchandinfoto--registry-urlfor consistency with theEMDASH_REGISTRY_URLenv var and the rest of the user-facing surface. Internally the override still selects the aggregator service to query — the rename only affects what users type.Old:
emdash-plugin search "image" --aggregator https://registry.example.comNew:
emdash-plugin search "image" --registry-url https://registry.example.com
Breaking Changes
- Package `@emdash-cms/registry-cli` renamed to `@emdash-cms/plugin-cli` with binary rename from `emdash-registry` to `emdash-plugin`.
- Multi‑word flags on `build`, `dev`, and `bundle` changed: `--outDir` → `--out-dir`; `--validateOnly` → `--validate-only` (short alias `-o` unchanged).
- Flag `--aggregator` on `search` and `info` renamed to `--registry-url`.
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
About emdash
All releases →Related context
Earlier breaking changes
- [email protected] Schema migration adds `locale` and `translation_group` columns to `_emdash_bylines`.
- [email protected] Byline hydration now strictly per-locale, suppressing cross‑locale fallback.
- v@emdash-cms/[email protected] Changes `_emdash_content_bylines.byline_id` to store translation_group instead of row id, enforcing strict per-locale credit hydration.
- v@emdash-cms/[email protected] Registry install handler fails closed on non-conforming aggregator release records.
- v@emdash-cms/[email protected] Menu and menu-item API responses now camelCase, breaking clients expecting snake_case keys.
Beta — feedback welcome: [email protected]