| name | claude-plugin-submitter-cmux |
| description | Submit a Claude Code plugin to the official Anthropic marketplace via cmux browser automation. Triggers when the user asks to "submit my plugin", "publish to marketplace", or invokes /claude-plugin-submitter-cmux:submit / :check. Reads plugin.json from the cwd, runs pre-submission self-checks, drives the claude.ai submission form (Introduction â Plugin information â Submission details), and stops before final submit for human confirmation. |
claude-plugin-submitter-cmux
Anthropic å
¬åŒ Claude Code plugin marketplace ãžã®ç³è«ã cmux browser çµç±ã§èªååããã¹ãã«ã
ãã€èµ·åããã
以äžã®ããããã§ããªã¬ãŒ:
/claude-plugin-submitter-cmux:submit ãŸã㯠/claude-plugin-submitter-cmux:check
- ãããŒã±ãããã¬ã€ã¹ã«ç³è«ãããããå
¬åŒã«æåºãããããsubmit my pluginãçã®çºè©±
- ãŠãŒã¶ãŒã
claude.ai/settings/plugins/submit ãéããŠå
¥åæ¯æŽãæ±ãã
åææ¡ä»¶
- çŸåš cmux ã»ãã·ã§ã³å
ã§åäœããŠããïŒ
CMUX_SOCKET_PATH ãååšïŒ
using-cmux ãã©ã°ã€ã³ãã€ã³ã¹ããŒã«æžã¿
- cwd ãç³è«å¯Ÿè±¡ã®ãã©ã°ã€ã³ãªããžããª
plugin.json ã .claude-plugin/plugin.json ãŸã㯠plugin.json ã«ååš
- ãã©ãŠã¶ã® Claude.ai ã»ãã·ã§ã³ããã°ã€ã³æžã¿
å
šäœãããŒ
1. cwd ãã plugin.json ãèªã
2. éä¿¡åã»ã«ããã§ã㯠(presence + format)
3. äžè¶³æ
å ±ã察話ã§è£å®
4. æ° surface ã§ claude.ai/settings/plugins/submit ãéã
5. Introduction ã§èŠçŽ checkbox ã«åæ â æ¬¡ãž
6. Plugin information ãåãã â æ¬¡ãž
7. Submission details ãåãã
8. å
šãã£ãŒã«ãã human ã«æç€ºããŠç¢ºèª
9. æ¿èªåŸãã¬ãã¥ãŒã«æåºããã¯ãªãã¯
10. å®äºç»é¢ã®ç¢ºèª
Step 1: plugin.json ã®èªã¿åã
PLUGIN_JSON=$([ -f .claude-plugin/plugin.json ] && echo .claude-plugin/plugin.json || echo plugin.json)
NAME=$(jq -r '.name' "$PLUGIN_JSON")
VERSION=$(jq -r '.version // "0.1.0"' "$PLUGIN_JSON")
DESCRIPTION=$(jq -r '.description // ""' "$PLUGIN_JSON")
REPOSITORY=$(jq -r '.repository // ""' "$PLUGIN_JSON")
LICENSE=$(jq -r '.license // ""' "$PLUGIN_JSON")
HOMEPAGE=$(jq -r '.homepage // ""' "$PLUGIN_JSON")
AUTHOR=$(jq -r '.author // ""' "$PLUGIN_JSON")
repository ããªããžã§ã¯ãåœ¢åŒ ({"type":"git","url":"..."}) ã®å Žå㯠.repository.url ã詊ãã
homepage 㯠optionalã空ã§ãèŠåã ãã«ãšã©ããïŒãã©ãŒã äž Docs URL ã®ãã©ãŒã«ããã¯åè£ãšããŠæ±ããïŒã
Step 2: éä¿¡åã»ã«ããã§ãã¯
| é
ç® | ãã§ã㯠| 倱ææã®æå |
|---|
plugin.json ã® name | å¿
é ã»kebab-case ã®ã¿ (^[a-z][a-z0-9-]*$) | ãšã©ãŒè¡šç€ºã»åæ¢ |
plugin.json ã® description | å¿
é ã»30ã500 æåç®å® | <30: warning / >500: warning / 空: 忢 |
plugin.json ã® version | å¿
é ã»semver | warning |
plugin.json ã® repository | å¿
é ã»GitHub URL (https://github.com/...) | ãšã©ãŒè¡šç€ºã»åæ¢ |
plugin.json ã® homepage | ä»»æãããã° URL åœ¢åŒ | warning |
LICENSE ãã¡ã€ã« | ååš | warning |
README.md | ååš | ãšã©ãŒè¡šç€ºã»åæ¢ |
PRIVACY.md | ååš | warningïŒãã©ãŒã å
¥åæã« Privacy URL ã空ã«ã§ããïŒ |
å
¬åŒããŒã±ãããã¬ã€ã¹ç¹æã®å¶çŽïŒæšæž¬å€ããïŒ:
- Plugin name 㯠claude.ai åŽã§ kebab-case ã®ã¿èš±å¯ãããå¯èœæ§ãé«ãã
my_plugin ã MyPlugin ã¯ããªããŒã·ã§ã³ã§åŒŸãããåæã§ããŒã«ã«åŽã§ãæ¢ããã
- Description ã®æåæ° 30ã500 ã¯çµéšåïŒclaude.ai åŽã®æ£ç¢ºãªäžéã¯æªå
¬éïŒãçããã / é·ãããå Žå㯠warning ã«ãšã©ãããŠãŒã¶ãŒã«èª¿æŽãä¿ãã
/claude-plugin-submitter-cmux:check ã¯ãããŸã§å®è¡ããŠçµæãåºåããã ãã
Step 3: äžè¶³æ
å ±ã®å¯Ÿè©±è£å®
äžè¶³é
ç®ãããã°ãŠãŒã¶ãŒã«èããæäœéå¿
èŠãªã®ã¯:
- Plugin name (form ã® "Plugin details" ã® input)
- Description (form ã® "Description" textarea)
- Examples (form ã® "Examples" textarea â 詳现㯠Step 6 ã®ãExamples ã®æœåºæ¹æ³ã)
- Repository URL
- Documentation URLïŒREADME.md ã® raw URL ãææ¡ããªããã°
homepage ããã©ãŒã«ããã¯ïŒ
- License (plugin.json ãã)
- Privacy policy URL (PRIVACY.md ã® raw URL ãææ¡ããªããã°ç©º)
- Submitter emailïŒClaude.ai ã®ãã°ã€ã³ã¢ã«ãŠã³ããèªåå
¥åãããã確èªïŒ
Step 4: ãã©ãŠã¶ã§ç³è«ããŒãžãéã
using-cmux/SKILL.md ã®ããã©ãŠã¶èªååãã»ã¯ã·ã§ã³åç
§ã
BSURF=$(cmux browser open https://claude.ai/settings/plugins/submit | awk '{print $2}' | sed 's/surface=//')
cmux browser --surface $BSURF wait --load-state complete --timeout 15
Step 5: Introduction ããŒãž â èŠçŽåæ
â ïž éèŠ: Introduction ã®èŠçŽ checkbox ã«åæããªããšãæçµ submit æã« "You must acknowledge the terms to continue." ã§ Introduction ã«æ»ããããæåã®ããŒãžã§å¿
ããã§ãã¯ãå
¥ããã
cmux browser --surface $BSURF snapshot --selector "main" --max-depth 100
cmux browser --surface $BSURF click <checkbox-ref>
cmux browser --surface $BSURF is checked <checkbox-ref>
cmux browser --surface $BSURF click <次ãž-button-ref>
ãšã©ãŒå埩
is checked ã 0 ãè¿ããå Žå:
- checkbox èªäœã§ã¯ãªã label ãã¯ãªãã¯ããŠããå¯èœæ§ â snapshot ãåãçŽããrole ã
checkbox ã®è¡ã® ref ãåååŸ
- ããã§ã 0 ãªã
cmux browser get html <ref> ã§èŠçŽ çš®å¥ã確èª
- label ãå«ã芪èŠçŽ ã® ref ã click ããŠã¿ã
- 3 å倱æããããŠãŒã¶ãŒã«ããã©ãŠã¶ç»é¢ã§æåã§ãã§ãã¯ããŠããããŸããããšäŸé ŒïŒãã®ãšã
cmux browser screenshot ã§ç»é¢ãæç€ºïŒ
Step 6: Plugin information ããŒãž
5 ã€ã®å
¥åãã£ãŒã«ã:
| ãã£ãŒã«ã | placeholder ã§èå¥ | å€ã®åºæ |
|---|
| GitHub repo URL | https://github.com/your-org/your-plugin | plugin.json ã® repository |
| Docs URL | https://your-plugin-docs.com | README.md ã® raw URL |
| Plugin name (input) | (placeholder ãªãã<input>) | plugin.json ã® name |
| Description (textarea) | Describe what your plugin does... | plugin.json ã® description + README ã®åé |
| Examples (textarea) | Example 1: ...\nExample 2: ... | README ãããŠãŒã¹ã±ãŒã¹ã 3 〠|
placeholder ãã ref ãåŒããã«ããŒãã¿ãŒã³
cmux browser snapshot --interactive ã®åºåã¯æŠã次ã®åœ¢ïŒç°¡ç¥åïŒ:
- textbox "GitHub repository URL" [ref=e42] placeholder="https://github.com/your-org/your-plugin"
- textbox "Documentation URL" [ref=e43] placeholder="https://your-plugin-docs.com"
- textbox "Plugin name" [ref=e44]
- textbox "Description" [ref=e45] placeholder="Describe what your plugin does..."
- textbox "Examples" [ref=e46] placeholder="Example 1: ..."
placeholder ãå«ãè¡ãã ref ãæœåºããå
žåãã¿ãŒã³:
SNAP=$(cmux browser --surface $BSURF snapshot --selector "main" --max-depth 100)
ref_repo=$(echo "$SNAP" | grep -E 'placeholder=".*github\.com/your-org' | grep -oE 'ref=e[0-9]+' | head -1 | cut -d= -f2)
ref_docs=$(echo "$SNAP" | grep -E 'placeholder=".*your-plugin-docs' | grep -oE 'ref=e[0-9]+' | head -1 | cut -d= -f2)
ref_desc=$(echo "$SNAP" | grep -E 'placeholder=".*Describe what your plugin' | grep -oE 'ref=e[0-9]+' | head -1 | cut -d= -f2)
ref_examples=$(echo "$SNAP" | grep -E 'placeholder=".*Example 1' | grep -oE 'ref=e[0-9]+' | head -1 | cut -d= -f2)
ref_name=$(echo "$SNAP" | grep -E 'textbox "Plugin name"' | grep -oE 'ref=e[0-9]+' | head -1 | cut -d= -f2)
snapshot ã®å®éã®åºåãã©ãŒããã㯠using-cmux/SKILL.md ã®ãsnapshot åºåäŸããäžæ¬¡æ
å ±æºãšãããäžèšã¯æ¬äŒŒã³ãŒãã§ããããã©ãŒããããå€ãã£ããé©å® grep ã®ãã¿ãŒã³ã調æŽããã
Examples ã®æœåºæ¹æ³
README ã® ## Usage / ## äœ¿ãæ¹ ã»ã¯ã·ã§ã³ãã 3 ã€ã®ãŠãŒã¹ã±ãŒã¹ãæœåºããã
USAGE=$(awk '/^## (Usage|äœ¿ãæ¹)/{flag=1; next} /^## /{flag=0} flag' README.md)
æœåºã«å€±æãããã3 ä»¶ã«æºããªãå Žåã®ãã©ãŒã«ããã¯:
plugin.json ã® description ãããŒã¹ã« Example 1 ãçæ
- ãŠãŒã¶ãŒã«ãExamples ã«å
¥ãã代衚çãªäœ¿ãæ¹ã 3 ã€æããŠãã ããããšå¯Ÿè©±ã§ç¢ºèª
- æäœ 1 ä»¶ããã°éä¿¡ã¯éãæ³å®ïŒclaude.ai åŽã®ããªããŒã·ã§ã³æåã¯æªç¢ºå® â warning ã«ãšã©ããïŒ
å
¥åãšæ€èšŒ
cmux browser --surface $BSURF fill e$ref_repo "$REPOSITORY"
cmux browser --surface $BSURF fill e$ref_docs "$DOCS_URL"
cmux browser --surface $BSURF fill e$ref_name "$NAME"
cmux browser --surface $BSURF fill e$ref_desc "$DESCRIPTION"
cmux browser --surface $BSURF fill e$ref_examples "$EXAMPLES"
for r in $ref_repo $ref_docs $ref_name $ref_desc $ref_examples; do
v=$(cmux browser --surface $BSURF get value e$r)
echo "ref=$r value=${v:0:60}"
done
cmux browser --surface $BSURF click <次ãž-button-ref>
ãšã©ãŒå埩
get value ã空ãè¿ããå Žå:
- snapshot ãåãçŽããref ãå€ãã£ãŠããªãã確èªïŒDOM åæ§ç¯ã§çªå·ãå€ããããšãããïŒ
cmux browser get html e$ref ã§èŠçŽ çš®å¥ãç¢ºèª â <input> ã§ã¯ãªã <textarea> ã ã£ãããããã¯ã©ãã㌠<div> ãæŽãã§ããã±ãŒã¹ãã
- å¥ refïŒåã placeholder ãæã€å¥èŠçŽ ïŒãååšããå Žåã¯
head -1 ã§ã¯ãªã tail -1 ã§åãçŽã
- ããã§ã空ãªã
cmux browser type e$ref "$VALUE" ã詊ãïŒfill ã§ã¯ãªã type ã§ããŒå
¥åãã·ãã¥ã¬ãŒãïŒ
- 3 å倱æããããŠãŒã¶ãŒã«è©²åœãã£ãŒã«ããæåå
¥åããããäŸé Œ
Step 7: Submission details ããŒãž
| ãã£ãŒã«ã | èå¥ | å€ |
|---|
| Supported platforms (Claude Code) | checkbox 1 ã€ç® | â |
| Supported platforms (Claude Cowork) | checkbox 2 ã€ç® | éåžž âïŒã¿ãŒããã«ç³»ãã©ã°ã€ã³ã¯ Claude Code ã®ã¿ïŒ |
| License type | placeholder MIT, Apache 2.0, proprietary, etc. | plugin.json ã® license |
| Privacy policy URL | placeholder https://your-company.com/privacy | PRIVACY.md ã® raw URLïŒä»»æïŒ |
| Submitter email | placeholder contact@your-company.com | Claude.ai ãã°ã€ã³ã¢ã«ãŠã³ããèªåå
¥åããã |
"Supported platforms" 㯠OS éžæã§ã¯ãªãããã©ã°ã€ã³ãåäœãã Claude ã®ãµãŒãã§ã¹ïŒClaude Code / Claude CoworkïŒãäžè¬ç㪠Claude Code plugin ã§ããã° Claude Code ã®ã¿ãã§ãã¯ããã
ref ååŸã¯ Step 6 ãšåã placeholder ããŒã¹ã®ãã¿ãŒã³ã䜿ãã
SNAP=$(cmux browser --surface $BSURF snapshot --selector "main" --max-depth 100)
ref_license=$(echo "$SNAP" | grep -E 'placeholder=".*MIT, Apache' | grep -oE 'ref=e[0-9]+' | head -1 | cut -d= -f2)
ref_privacy=$(echo "$SNAP" | grep -E 'placeholder=".*your-company\.com/privacy' | grep -oE 'ref=e[0-9]+' | head -1 | cut -d= -f2)
ref_email=$(echo "$SNAP" | grep -E 'placeholder=".*contact@your-company' | grep -oE 'ref=e[0-9]+' | head -1 | cut -d= -f2)
Submitter email ãªã»ãã察ç
â ïž Submitter email ã¯ããŒãžãè¡ãæ¥ãããšãã°ã€ã³ã¢ã«ãŠã³ãã®å€ã«æ»ãããšããããåžæã®ã¡ãŒã«ã¢ãã¬ã¹ãããå Žåã¯ãStep 8 ã®æçµç¢ºèªã®çŽåã«å¿
ãå確èªã»åå
¥åããã
current_email=$(cmux browser --surface $BSURF get value e$ref_email)
if [ "$current_email" != "$DESIRED_EMAIL" ]; then
cmux browser --surface $BSURF fill e$ref_email "$DESIRED_EMAIL"
cmux browser --surface $BSURF get value e$ref_email
fi
Step 8: æçµç¢ºèªïŒå¿
é ïŒ
get value ã§å
šãã£ãŒã«ãã®å€ãååŸãã以äžã® Markdown ãã³ãã¬ãŒãã§ãŠãŒã¶ãŒã«æç€ºããïŒscreenshot ã¯æçµææ®µãsnapshot + get value ã§ååïŒã
## ç³è«å
å®¹ã®æçµç¢ºèª
### Plugin information
- **Repository**: <REPOSITORY>
- **Docs URL**: <DOCS_URL>
- **Plugin name**: <NAME>
- **Description** (<LEN> æå):
> <DESCRIPTION ã®å
é 200 æåããã以äžã¯ ...>
- **Examples**:
> <EXAMPLES ã®å
é 200 æåããã以äžã¯ ...>
### Submission details
- **Supported platforms**: Claude Code <â or â> / Claude Cowork <â or â>
- **License**: <LICENSE>
- **Privacy policy URL**: <PRIVACY_URL or "(空)">
- **Submitter email**: <SUBMITTER_EMAIL>
---
äžèšã®å
容ã§ãã¬ãã¥ãŒã«æåºããæŒããŠããããã§ããïŒ (yes / no / ä¿®æ£ãããé
ç®)
ãŠãŒã¶ãŒããä¿®æ£ãããããšèšã£ãå Žåã¯ã該åœã¹ãããã«æ»ã£ãŠ fill ãçŽãã
Step 9: æåº
ãŠãŒã¶ãŒãæ¿èªããã:
cmux browser --surface $BSURF get value e$ref_email
cmux browser --surface $BSURF click <ã¬ãã¥ãŒã«æåº-button-ref>
sleep 2
cmux browser --surface $BSURF snapshot --selector "main" --max-depth 80
ãšã©ãŒå埩
snapshot ã®çµæã« "Introduction" heading ãèŠçŽ checkbox ãåã³å«ãŸããŠããå Žå = èŠçŽæªåæãšããŠãªãã©ã€ãããããç¶æ
:
- ãŠãŒã¶ãŒã«ãèŠçŽ checkbox ã®åæç¶æ
ããªã»ãããããããååæããŸãããšéç¥
- Step 5 ãå®è¡ïŒèŠçŽ checkbox ã clickïŒ
- åããŒãžã®å€ãä¿æãããŠããã snapshot ã§ç¢ºèª â æ¶ããŠããã Step 6/7 ãåå®è¡
- Step 9 ãå詊è¡
snapshot ã« "You must acknowledge the terms" ã®æååãèŠããå Žå ãåæ§ã« Step 5 ããããçŽãã
snapshot ã«ä»ã®ããªããŒã·ã§ã³ãšã©ãŒïŒ"required field" çïŒãèŠããå Žå:
- ãšã©ãŒæèšã® near ã«ãã field ã® ref ãååŸ
- ãŠãŒã¶ãŒã«ãšã©ãŒå
容ãæç€ºããåœè©²ãã£ãŒã«ããåå
¥å
- Step 9 ãå詊è¡
Step 10: å®äºã®æ€èšŒ
snapshot ã« ãã©ã°ã€ã³ãã¬ãã¥ãŒã«éä¿¡ããŸãã (ãŸãã¯è±èªç Plugin submitted for review) ã® heading ãå«ãŸããŠããã°æåã
å«ãŸããŠããªããã° Step 9 ã®ãšã©ãŒå埩ã«åŸãã3 åé£ç¶ã§å€±æãããèªååã諊ããcmux browser screenshot ãæ®ã£ãŠãŠãŒã¶ãŒã«ç¶æ
ãæç€ºããæåæäœãäŸé Œããã
ref ã«é¢ããéèŠãªæ³šæ
cmux browser snapshot --interactive ã® [ref=eN] 㯠ããŒãžé·ç§»ã»DOM æŽæ°ããšã«åçºçªããããåããŒãžã«ç§»åããçŽåŸã«å¿
ã snapshot ãåãçŽããŠææ° ref ã䜿ãããšã
cmux browser --surface $BSURF click e123
cmux browser --surface $BSURF click <next-button-ref>
sleep 1
cmux browser --surface $BSURF snapshot --selector "main" --max-depth 100
cmux browser --surface $BSURF fill <new-ref> "..."
DOM ãåããªãå Žå
cmux browser eval 㯠WKWebView ã®å¶çŽã§åããªãã±ãŒã¹ããããä»£æ¿ææ®µ:
| ååŸãããæ
å ± | ä»£æ¿ |
|---|
| èŠçŽ ã®å€ | cmux browser get value <ref> |
| 屿§ | cmux browser get attr <ref> <name> |
| HTML | cmux browser get html <ref> |
| ãã§ãã¯ç¶æ
| cmux browser is checked <ref> |
| placeholder ã®ãªããã£ãŒã«ãã®æ£äœ | get html <ref> ã§ <input> ã <textarea> ãç¢ºèª |
ãããããã¹
| ãã¹ | æ£ããæ¹æ³ |
|---|
| Introduction ã®èŠçŽåæãé£ã°ã | å¿
ã checkbox ã click ã is checked ã§ 1 ã確èªããŠããå
ãžé²ã |
| å€ã ref ã䜿ãåã | ããŒãžé·ç§»åŸã¯å¿
ã snapshot ãåãçŽã |
| Submitter email ã確èªãã submit | æçµéä¿¡åã« get value ã§å確èªãå¿
èŠãªãåå
¥å |
| èŠèŠç¢ºèªã®ããæ¯å screenshot ãæ®ã | snapshot + get value ã§ã»ãŒå
šãŠååŸå¯èœãscreenshot ã¯ããŒã¯ã³æ¶è²»ã倧ããã®ã§æçµææ®µ |
| eval ã§ DOM ååŸã詊ã¿ã | WKWebView ã§ã¯å€±æãããget value / get attr / get html ã䜿ã |
--surface ã§ä»ã¯ãŒã¯ã¹ããŒã¹ãæäœ | using-cmux ã® cmux-send çãçµç±ããïŒèªåè§£æ±ºïŒ |
| Plugin name ã« snake_case ã CamelCase ã䜿ã | kebab-case ã®ã¿ãäºåãã§ãã¯ã§ããŒã«ã«åŽã§ãæ¢ãã |
using-cmux ãžã®åç
§
cmux browser ã®åºæ¬æäœïŒsnapshot, fill, click, wait, get value çïŒã¯ using-cmux/SKILL.md ã®ããã©ãŠã¶èªååãã»ã¯ã·ã§ã³ãäžæ¬¡æ
å ±æºãæ¬ã¹ãã«ã§ã¯ç³è«ãã©ãŒã åºæã®æäœæé ãšãšã©ãŒå埩ã®ã¿ãèšè¿°ããã