Marketplace distribution
The marketplace repository (dfg-inc/praxis-marketplace, marketplace name praxis) is exclusively the Claude plugin marketplace: .claude-plugin/marketplace.json and plugins/ with ready-to-install builds. The website and this documentation live only in the praxis-website repository. The marketplace does not own the plugins: it stages copies of them from the role repositories and the Runtime repository. Scripts live in praxis-marketplace/tools/scripts.
The plugin directories are real, prebuilt copies, not links to the source repositories: the sources do not contain the generated build outputs an installed plugin needs (see Generated build outputs).
Sources
| Marketplace plugin | Source repository | Source directory |
|---|---|---|
praxis | praxis-marketplace | plugins/praxis (authored in the marketplace) |
praxis-ba | praxis-ba | plugins/ba |
praxis-architect | praxis-architect | plugins/architect |
praxis-developer | praxis-developer | plugins/developer |
praxis-quality | praxis-quality | plugins/quality |
praxis-runtime | praxis-runtime | plugins/runtime (contains the bundled server/praxis-mcp.cjs) |
Scripts
| Script | What it does | Publishes? |
|---|---|---|
stage-portable-plugins.mjs | Replaces the marketplace's plugins/ entries (except praxis) with self-contained copies from the source directories (no node_modules, no .git). For praxis-ba it also bundles the canon-graph CLI into a self-contained bin/praxis-ba.cjs, the path the BA skills call. For every plugin with tools/session-bootstrap.mjs it bundles a standalone tools/session-bootstrap.cjs with esbuild, because an installed plugin does not have the @praxis/plugin-sdk the source imports. Checks that every marketplace source is relative, stays inside the repository and has a plugin.json. Writes plugins/.staged-at. Runs claude plugin validate on the marketplace. | No |
build-release-candidate.mjs | Builds release-candidate/ from the six source directories: copies each plugin, writes FILES.sha256.json per plugin, copies the real marketplace.json, and writes manifest.json (contract praxis.marketplace.release-candidate): host (Node, platform, Claude Code version), required host versions, per plugin source revision, branch, dirty flag, skills, whether it has a server and .mcp.json, artifact checksum and file count. Records dirty working trees explicitly and sets a warning instead of claiming a clean revision. Runs claude plugin validate on the result. | No |
verify-release-candidate.mjs | Compares the release candidate with each source directory file by file. Any changed, missing or extra file means STALE and exit code 1: rebuild. Optionally compares an installed Desktop extension (--installed-extension) and installed role plugins (--installed-plugins) with source; those are warnings unless --strict-installed. --json prints the report. | No |
| check-marketplace.mjs | Manifest consistency: names, versions, dependencies (the bundle depends on the other five, every role on praxis-runtime), exactly one MCP server, no secrets or developer paths. | No | | check-plugin-outputs.mjs | Generated outputs: every file under plugins/ is tracked (nothing ignored), the BA CLI and every role's session-bootstrap.cjs run with no node_modules, the Runtime bundle starts, and every ${CLAUDE_PLUGIN_ROOT}/... path in a skill resolves. | No |
npm entry points: npm run check:marketplace, npm run check:outputs, npm run check:rc and npm run test:rc; npm run verify runs them. There is no site build in this repository.
Generated build outputs
The role plugins ship outputs that are build products, not source, so they exist only in the staged copies:
- BA
canon-graph/dist(compiled validator) andbin/praxis-ba.cjs(self-contained CLI; its dependencieszod,yamlandgray-matterare bundled). The BA skills (ba-lint,approve-plan, ...) call${CLAUDE_PLUGIN_ROOT}/bin/praxis-ba.cjs. tools/session-bootstrap.cjsof every role (bundled from the source.mjs, which imports a package an installed plugin does not have).- The Runtime bundle
server/praxis-mcp.cjs(self-contained: nonpm install).
A .gitignore rule for dist/ once dropped the BA outputs silently; the marketplace now un-ignores plugins/**/dist/ and check-plugin-outputs.mjs fails if anything under plugins/ is untracked or ignored.
Release candidate
The release candidate is a complete marketplace tree under release-candidate/ that can be validated and installed from locally before anything is published. Read dirtySources and warning in its manifest.json: a dirty source means the build must not be described as a published revision. The claude CLI must be on the path (claude plugin validate).
What gets published
Nothing in these scripts pushes, tags or uploads. Publishing is a separate owner decision (see Release process). The target repositories are under the dfg-inc GitHub organisation:
| Repository | Published artifact |
|---|---|
dfg-inc/praxis-core | Source; the Release workflow publishes the @praxis/* vendor tarballs, vendor-checksums.json and release-meta.json |
dfg-inc/praxis-runtime | Release asset praxis-runtime.mcpb and release-meta.json |
dfg-inc/praxis-ba, praxis-architect, praxis-developer, praxis-quality | Release asset praxis-<role>.zip and release-meta.json |
dfg-inc/praxis-marketplace | The marketplace itself: users add it as dfg-inc/praxis-marketplace. CI only (check:marketplace, check:outputs, release-candidate tests); no release workflow |
dfg-inc/praxis-website | This website and documentation (private repository, flagridge.com); every push to main deploys production |
Order, because each step feeds the next:
- praxis-core (source and vendor tarballs).
- praxis-runtime and the four role repositories, each vendoring that Core.
- praxis-marketplace: restage from the released sources, rebuild and verify the release candidate, then publish the marketplace repository. The marketplace must be updated after the plugins it contains.
Claude Desktop Chat: the MCPB
The marketplace plugin praxis-runtime is a Claude Code style plugin with a stdio server. Claude Desktop Chat does not automatically get a plugin's local Runtime as a Chat tool, so Chat uses praxis-runtime.mcpb, built from the same Runtime sources by npm run pack:mcpb in praxis-runtime and installed in Settings, Extensions. The MCPB manifest (version 0.4, extension id praxis-runtime) adds a settings form (Configuration). Role ZIPs (praxis-<role>.zip, skills only) can still be uploaded manually in Desktop Chat, but that is not the install path for Code or Cowork, where the marketplace is used.
Not verified: Claude Desktop Chat installing skills from the marketplace.