Package agent skills as a Claude Code plugin#232
Conversation
Migrate the two standalone SKILL.md skills into a single distributable
Claude Code plugin "sidemantic" with a marketplace manifest.
- Move skills/sidemantic-modeler -> plugins/sidemantic/skills/modeler
- Move skills/sidemantic-webapp-builder -> plugins/sidemantic/skills/webapp-builder
- Add plugins/sidemantic/.claude-plugin/plugin.json and
.claude-plugin/marketplace.json (marketplace "sidequery")
- Rename skill frontmatter to modeler / webapp-builder so invocations are
/sidemantic:modeler and /sidemantic:webapp-builder
- Rewrite webapp-builder script paths to ${CLAUDE_PLUGIN_ROOT}/skills/...
so they resolve for both --plugin-dir and installed use
- Drop skills/install.sh and the curl/npx install instructions; README now
documents /plugin marketplace add + install
- Repoint test paths, the wasm-demo README, and the pyproject sdist exclude
to the new plugins/ layout
agents/openai.yaml is preserved as a skill resource for the Codex pass.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 07edc974a1
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| function usage() { | ||
| return `Usage: | ||
| bunx --bun -p playwright node skills/sidemantic-webapp-builder/scripts/verify_static_interactions.mjs --url http://127.0.0.1:4519/ | ||
| bunx --bun -p playwright node ${CLAUDE_PLUGIN_ROOT}/skills/webapp-builder/scripts/verify_static_interactions.mjs --url http://127.0.0.1:4519/ |
There was a problem hiding this comment.
Escape the plugin-root placeholder in usage text
When --help is passed or --url is omitted, usage() evaluates this JavaScript template literal and treats ${CLAUDE_PLUGIN_ROOT} as a JS identifier, so Node throws ReferenceError: CLAUDE_PLUGIN_ROOT is not defined instead of printing help or the missing-URL message. Escape the placeholder or build the string without template interpolation so the usage path remains literal.
Useful? React with 👍 / 👎.
The path rewrite landed inside usage()'s template literal, so
${CLAUDE_PLUGIN_ROOT} was interpreted as JS interpolation and threw
ReferenceError on the --help and missing-url paths. Escape the $ so the
placeholder prints literally.
What
Migrates the two standalone
SKILL.mdskills underskills/into a single distributable Claude Code plugin namedsidemantic, with a marketplace manifest so it can be installed via/plugin.Layout
Skills are now namespaced:
/sidemantic:modelerand/sidemantic:webapp-builder.Changes
git mvboth skill folders into the plugin (history preserved).plugin.json+marketplace.json.name:tomodeler/webapp-builder(the plugin namespace supplies thesidemantic:prefix).webapp-builderscript invocations to${CLAUDE_PLUGIN_ROOT}/skills/webapp-builder/scripts/...so they resolve both under--plugin-dirtesting and a real install.skills/install.shand the curl/npx install one-liners; README now documents/plugin marketplace add sidequery/sidemantic+/plugin install sidemantic@sidequery, plus the local--plugin-dirpath.tests/test_sidemantic_webapp_builder_scripts.py, the wasm-demo README, and thepyproject.tomlsdist exclude (/skills->/plugins).agents/openai.yamlis intentionally kept as a skill resource for a later Codex pass.Install / try
Verification
claude plugin validate ./plugins/sidemanticpassesruff checkandruff format --checkclean