This is a high-frequency, reproducible release entry point. Release orchestration still uses the
scripts/release-ai-plugins.ps1in the same directory; the default is DryRun, and only an explicit -Apply allows writing files.
ai-plugins/skill-registry.json The only canonical authority for
scripts/generate-skill-registry.mjsis scripts/generate-skill-registry.ps1
. The compatibility entry point -Check/-Apply parameters to Node, and must no longer contain SKILL.md parsing, JSON serialization, indentation,
escaping, or line-ending normalization logic. If any script fails, or final acceptance does not pass, release completion must not be claimed.
Fixed inputs
-Version: plugin major version, must beMAJOR.MINOR.PATCH。-Skill: names of skills that were actually modified, may be repeated or comma-separated; when omitted, the script automatically discovers them based on Git changes.-ChangeType:added、major、minororpatch, used to upgrade themetadata.version。-Summaryof each modified skill: a short description written to the three CHANGELOGs.-NewSkill: new skill names; the corresponding plugin root README must already contain those names.-Apply: explicitly allow writing files; when unspecified, it is DryRun.
-NewSkill version upgrade behavior
For the skills listed in -NewSkill , the scriptforces a patch upgrade of metadata.version(source semantics
if ($isNew) { $type = "patch" }),-ChangeType does not apply to new skills. This means that even if a new skill starts its first release at
1.0.0 , after Apply it will be upgraded to 1.0.1。
- Callers must anticipate this behavior: contract tests written for skills that assert version numbers should use a semantic version regex
(such as
/version: "1\.0\.\d+"/), and must not pin literal values, otherwise tests will turn red after release. - If a new skill must remain at
1.0.0for its first release: do not pass-NewSkill, pass only-Version+-Summaryto complete the release; the registry will still fully regenerate and include the new skill during Apply. In this case the script does not perform the new-skill README blocking validation, and the caller must verify on their own that the README already includes the skill name.
Enforced order
- Verify the inputs, the root each Skill belongs to, and the frontmatter of each
SKILL.md. - Only upgrade the Skill
metadata.versionthat actually changed this time; do not upgrade other Skills along the way. - Synchronize the nine
plugin.json, the two versioned marketplaces for Claude/Cursor; validate the Codex marketplace and the dedicated fields of the three Codex manifests. - Update the three plugin CHANGELOGs; new Skills must first pass the corresponding plugin README blocking validation.
- During Apply, after all Skill versions and release files are complete, call registry Apply only once, then call Check only once.
The release main script may continue to be invoked through the PowerShell compatibility entry point; actual generation and comparison must be completed by Node
.mjs. - Complete acceptance for the existing JSON, versions, README, CHANGELOG, installation docs, and
git diff --check.
Multi-Skill batch releases must not repeatedly generate the registry inside the changed-Skill loop. The Generator always fully scans the current working tree from the three Skill roots; additions, deletions, and renames appear as entries increasing, disappearing, and old ids disappearing/new ids appearing, respectively.
Registry file contract
ai-plugins/skill-registry.json is a generated discovery
manifest committed in the same Git commit as the Skill tree, not a manually maintained second source of truth. v1 contains only schemaVersion, fixed roots , and each Skill's
id、plugin、name、description、version、entry。
- The Node generator uses only built-in modules and does not depend on pnpm install or third-party serializers.
- Read
SKILL.mdThen first normalize CRLF/CR to LF; the frontmatter parser only supports the narrow subset actually used by this skill, and does not attempt to implement general-purpose YAML. Unknown or invalid structures fail directly. - To avoid changing existing discovery text at the same time as the infrastructure migration,
description's>/>-/|/|-block all follow the current registry's folding semantics: ordinary lines are joined with spaces, and empty paragraphs retain one newline marker; this is not a general-purpose YAML literal-block implementation. - Skill id only allows
[a-z0-9-], so fixed ordering uses direct string comparison and does not use locale-sensitive sorting. - The sole definition of canonical JSON is
JSON.stringify(registry, null, 2) + "\n"; no serializer patches are maintained for Windows PowerShell 5.1, PowerShell 7, or HTML-sensitive characters. - Output must be deterministic: UTF-8 without BOM, LF, two-space indentation, fixed attribute order, fixed id ordering, and one trailing newline.
- Must not write timestamps, the current branch, commit SHA, absolute paths, Cloudflare fields, or body copies.
- Do not enumerate
references、templates、examples; these files are read on demand by the cloud MCP after a Skill is selected, using the same exact commit SHA. - Node
--checkonly compares the generator's canonical text and does not write files; stale, missing, duplicate id, invalid frontmatter, invalid version, or invalid entry must all fail with a non-zero exit, and output the--applyrepair command; when stale, print the first differing line to aid localization. - PowerShell
-Check/-Applyis only a compatibility alias and must forward to the Node--check/--apply, and must not form a second set of generation logic. - Skill registry stale, entry/version inconsistent with
SKILL.md, or batch publishing repeatedly invoking the generator are all prohibited completion conditions.
CI Workflow Maintenance Contract
The fixed maintenance entry point is .github/workflows/ai-plugins-skill-registry-check.yml. It maintains the read-only -Check contract,
and covers the three Skill roots, the registry,.ps1 compatibility entry point,.mjs generator, and the workflow itself; Apply, commit, or push are not allowed.
- CI runs the same Node generator on Ubuntu and Windows, verifying that canonical output does not depend on the operating system.
- CI pins the repository's
engines.nodeminimum supported version; the generator uses only Node built-in modules and does not install project dependencies. - When only modifying Skill bodies,
metadata.version, references/templates/examples, the workflow does not need to be changed; the path filter will trigger the check, and the registry is generated centrally by release Apply. - When modifying the generator path, CLI arguments, scanned roots, registry schema, minimum Node version, CI permissions, or trigger scope, the workflow must be updated in the same change.
- The release main script's existing static gate continues to validate the wrapper path, read-only
-Checkandcontents: readand other core contracts;.mjs's own path is explicitly included in the trigger scope by the workflow, and the wrapper must also fail with a non-zero exit when the generator is missing.
Therefore future maintenance does not rely on "remembering one file": routine Skill updates are automatically covered by path-scoped CI; infrastructure contract changes must put the workflow, wrapper, Node generator, and registry in the same change. This does not expand the release main script's responsibilities to parse Node implementation details.
For independent diagnosis, prefer running the Node generator directly:
node ai-plugins/common-tools/skills/release-ai-plugins/scripts/generate-skill-registry.mjs --check
Compatibility with old callers:
powershell -NoProfile -ExecutionPolicy Bypass -File ai-plugins/common-tools/skills/release-ai-plugins/scripts/generate-skill-registry.ps1 -Check
Usage Boundaries
This skill is responsible for plugin version numbers, CHANGELOG, the three-platform manifests, README/installation documentation synchronization, and the generation and validation from the local working tree to the deterministic registry. PowerShell continues to handle release orchestration; Node only takes over the text parsing and JSON canonical ownership of the Skill Registry. This boundary does not expand to rewriting the entire release script, nor does it migrate other manifest JSON files to the new framework along the way.
It is not responsible for GitHub commit SHA parsing, Cloudflare KV/R2 publishing, Worker deployment, MCP session/cache, or the incremental registry database.
When marketplaces are involved, first establish the mapping of "client → marketplace → plugin manifest → published components → install/update/uninstall documentation → real verification commands → cleanup actions". The schemas, hooks, commands, agents, paths, and installation commands of Claude Code, Cursor, and Codex must be verified separately and must not be copied from one another. Static JSON/schema validation is only a preliminary gate; it can be marked as verified only after obtaining a real client CLI or official installation verification. When evidence cannot be obtained due to account, client, or environment limitations, "unverified" must be explicitly recorded.
Version and file contract
- The plugin major version source is
.claude-plugin/marketplace.jsoninmetadata.version, and must be synchronized to the Cursor marketplace and the nineplugin.json; the Codex marketplace must not fabricate a version field. - The Skill's
metadata.versionevolves independently and is upgraded only when that Skill actually changes. - Node
.mjsgenerator is the sole canonical writer of the registry; the PowerShell wrapper is only a compatibility adapter; the main release script only treats the registry as an expected artifact in a strict allowlist. - For the reference field matrix, CHANGELOG format, Codex smoke test, and exact-commit rules, see
references/release-contract.md。
Sole entry point
Execute in the repository root:
powershell -NoProfile -ExecutionPolicy Bypass -File ai-plugins/common-tools/skills/release-ai-plugins/scripts/release-ai-plugins.ps1 `
-Version 10.1.0 -ChangeType minor -Skill release-ai-plugins `
-Summary "强化发布流程并生成 Skill Registry" -DryRun
After confirming the DryRun output, append -Apply before writing is allowed. For major behavioral changes to this Skill itself,
-ChangeType major upgrade this Skill; the plugin major version is still determined separately according to the release level of the entire plugin system.
README and installation documentation
At release time, at least check:
ai-plugins/docs/README.mdai-plugins/docs/use-vercel-skills-install.md.claude-plugin/README.md.cursor-plugin/README.md.agents/plugins/README.mdai-plugins/low-frequency-skill/README.md- root
README.md
Installation commands and source paths must use ai-plugins/..., and must not retain claude-code-marketplace/; newly added Skills
must also appear in the corresponding plugin root README.
Prohibited completion conditions
- Missing changes to any manifest, marketplace, CHANGELOG, or newly added Skill README.
- The Skill tree has changed but the registry is stale, the registry is not the canonical output of the Node generator, or the entry/version is inconsistent with the real
SKILL.md. - The PowerShell wrapper once again contains JSON serializer, HTML escape, indentation recalculation, or CRLF canonicalization logic.
- Claiming completion based solely on a successful build, JSON parsing, verbal explanation, or
git status. - Using the registry's own fields to impersonate the source commit, or treating CI auto-fix/Cloudflare synchronization as a release step.
Acceptance checklist
- DryRun outputs the Skill, twelve JSON files, three CHANGELOGs, README, and registry plan with zero writes.
- After Apply, both the Node generator Apply and the final Check pass, and the batch is invoked only once each.
- The PowerShell compatibility entry point only forwards parameters and contains no registry text/JSON processing logic.
-
.github/workflows/ai-plugins-skill-registry-check.ymlMaintains a read-only core contract and explicitly listens for.mjsgenerator。 - Ubuntu and Windows both pass the registry Check when using the same Node version.
- The registry is parseable, deterministic regeneration produces no diff, and all entries are valid POSIX repo-relative
SKILL.mdpaths. - The Codex/Claude/Cursor field matrix, installation documentation, and real smoke test evidence have been verified; evidence that could not be obtained is marked as "unverified".
-
git diff --checkpassed, and the workspace contains only the files expected for this change.
Related Resources
scripts/release-ai-plugins.ps1: main release entry point.scripts/generate-skill-registry.mjs: the registry's sole canonical generator.scripts/generate-skill-registry.ps1: compatible with legacy-Check/-ApplyCLI thin adapter.references/release-contract.md: field matrix, CHANGELOG, and smoke test contract.- Semantic Versioning
- Keep a Changelog