The comment said a release of an existing plugin leaves the catalogue byte-identical "because entries carry no version and npm resolves latest", so the dispatch existed only to surface a *new* plugin promptly. The generator now records the resolved version in the codex manifest, so a release does change the catalogue's bytes. That was the point of pinning: without a version, codex compared byte-identical documents, concluded the catalogue had not moved, and left the installed plugin on whatever it first resolved. Comment only — the step already behaved correctly for both cases. Worth fixing because the old wording invites the reader to skip wiring up marketplace_dispatch_url unless they are adding a plugin, which is how one consumer ended up without it. Co-Authored-By: Claude Opus 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01MgsFmepr9FxbFkax5Y2h6z
Common Agent Marketplace Workflows
Public reusable GitHub Actions workflows and validation actions for repositories that publish agent skills and plugins.
This repository intentionally contains only generic marketplace automation:
- skill and plugin manifest validation
- pull-request preview archives
- release archives and installation summaries
- optional catalog metadata published beside release artifacts
- optional npm registry publishing for agents that support npm catalogs
Container, infrastructure, deployment, and environment-specific workflows are
kept in the private Walter0697/common-workflow repository.
Reuse
Reference the workflows from a repository workflow with a version tag or commit SHA, for example:
jobs:
validate:
uses: walter-base/common-workflow/.github/workflows/agent-marketplace-ci.yaml@master
The validator is also available as:
uses: walter-base/common-workflow/actions/validate-agent-marketplace@master
Publishing to an npm registry
The generic archive and its installer are opaque to coding agents: something has to download and unpack them, which is what the generated installer script does. Agents can, however, resolve npm packages on their own, so publishing the same release contents to an npm registry lets them install and update without an installer.
Release callers may pass catalog_file to publish a validated catalog.json
beside the Generic package archive and installer. The file is also included in
the archive when its path is listed in package_paths.
Enable it on the release workflow:
with:
publish_npm: true
npm_package_name: "@acme/agent-skills"
# npm_registry defaults to the Gitea npm registry for gitea_user
secrets:
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
Notes:
- the package is built from the same staged directory as the generic archive, so the two can never drift apart
package.jsonis generated at publish time with the release version, which keeps it in step with the plugin manifest versions that release-please bumpsnpm_package_namemust be scoped, because the scope is what routes installs to the registry in.npmrc. The scope does not have to match the registry owner: Gitea's own example maps an@testscope to atestuserregistry URLNPM_TOKENis used when set; otherwiseGITEA_TOKENis reused- publishing fails if any released path is absent from the packed tarball, which
guards against npm's ignore rules silently dropping
.agents/or.claude-plugin/