fix(marketplace): use object source so Claude Cowork remote sync succeeds (#2542)#2555
Conversation
…eeds (affaan-m#2542) Adding the ECC marketplace in Claude Desktop (Cowork) fails with "Marketplace Sync failed. Check the repository-URL and try again." Cowork's remote (server-side clone) sync rejects string/relative plugin sources: External plugin sources must be objects with a 'source' field (github, url, or git-subdir). The local `/plugin marketplace add` in the Claude Code CLI tolerates the "./" shorthand, which is why the CLI succeeds while Cowork fails. Convert the single plugin entry's source from "./" to the github object form. The ecc plugin lives at the repo root, so github (whole-repo) is the correct object source; no path or git-subdir is needed. All other fields (name, version, description, ...) are unchanged. Adds a regression assertion in tests/plugin-manifest.test.js that the Claude marketplace source stays an object (github|url|git-subdir), mirroring the existing affaan-m#2128 Codex source-shape guard.
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: ASSERTIVE Plan: Pro Plus Run ID: 📒 Files selected for processing (1)
📜 Recent review details⏰ Context from checks skipped due to timeout. (27)
🔇 Additional comments (1)
📝 WalkthroughSummary by CodeRabbit
WalkthroughThe Claude marketplace manifest now points to the GitHub repository through a structured source object. Tests validate the object format, supported source providers, and expected repository. ChangesClaude marketplace integration
Estimated code review effort: 2 (Simple) | ~10 minutes Suggested reviewers: 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
| Filename | Overview |
|---|---|
| .claude-plugin/marketplace.json | Changes the source field for the ecc plugin entry from the string "./" to the object form { "source": "github", "repo": "affaan-m/ECC" }, which is required for Claude CoWork remote sync to succeed. |
| tests/plugin-manifest.test.js | Adds a regression test (#2542) that asserts plugins[0].source is an object with a valid source field (github, url, or git-subdir) and, when github, verifies the repo value matches this repository. Test coverage is thorough. |
Sequence Diagram
sequenceDiagram
participant Dev as Developer
participant CLI as Claude Code CLI
participant CoWork as Claude CoWork (Remote)
participant GH as GitHub (affaan-m/ECC)
Dev->>CLI: /plugin marketplace add affaan-m/ECC
CLI->>CLI: Validate marketplace.json (local, lenient)
CLI-->>Dev: Success (string "./" tolerated)
Dev->>CoWork: Add ECC marketplace (remote sync)
CoWork->>GH: Clone repo server-side
CoWork->>CoWork: Validate marketplace.json (strict)
Note over CoWork: Before fix: source = "./" REJECTED<br/>After fix: source = {source:"github", repo:"affaan-m/ECC"} ACCEPTED
CoWork-->>Dev: Sync succeeded (after fix)
Reviews (2): Last reviewed commit: "Merge remote-tracking branch 'upstream/m..." | Re-trigger Greptile
…e-sync-cowork-object-source # Conflicts: # .claude-plugin/marketplace.json
daltino
left a comment
There was a problem hiding this comment.
This PR fixes an issue with Claude Cowork's remote sync by updating the plugin source in marketplace.json to an object rather than a string, which matches the expected format for remote marketplace syncing. It also adds a test to validate this behavior moving forward, ensuring the source field is properly configured. The changes are clear, minimal, and align well with the contribution guidelines and repository's focus on reliable workflows.
Fixes #2542
What Changed
.claude-plugin/marketplace.json— the single plugin entry'ssourcechangesfrom the string
"./"to the object form:Plus a regression assertion in
tests/plugin-manifest.test.js.Why This Change
Adding the ECC marketplace in Claude Desktop (CoWork) fails with:
The manifest itself is not broken: a local
/plugin marketplace add affaan-m/ECC(andhttps://github.com/affaan-m/ECC) in the Claude Code CLIsucceeds, and
claude plugin validate .claude-plugin/marketplace.jsonpasses. The failure is specific to CoWork's remote sync, which clones the
repo server-side and validates with a stricter rule. Its logs
(
~/Library/Logs/Claude/claude.ai-web.log) report:Remote sync rejects string/relative plugin sources; it requires each
plugin's
sourceto be an object whosesourcefield is one ofgithub,url, orgit-subdir. The local CLI tolerates the"./"shorthand — which isexactly why the CLI works while CoWork does not. The ECC plugin lives at the
repository root, so
github(whole-repo) is the correct object source; nopath/git-subdiris needed.This is the same class of fix applied for Codex in #2128 (which moved
.agents/plugins/marketplace.jsonoff a"./"root source), now applied to theClaude manifest. Confirmed against the same failure/fix pattern reported in
other plugin repos (e.g.
Kntnt/kntnt-text-skills#46,Kntnt/kntnt-code-skills#11).Testing Done
node tests/plugin-manifest.test.js→ 64 passed (incl. new#2542source-shape assertion and all existing marketplace/version assertions).
node tests/docs/install-identifiers.test.js→ 26 passed.node scripts/ci/validate-install-manifests.js→ OK.node tests/ci/validators.test.js→ 166 passed.claude plugin validate .claude-plugin/marketplace.json→ Validation passed.CLAUDE_CONFIG_DIR):claude plugin marketplace add <clone>→ Successfully added; thenclaude plugin install ecc@ecc→ Successfully installed. No regression to thelocal add/install path.
Type of Change
Security & Quality Checklist
code paths touched.
keywords, category, tags, strict).
Documentation
No docs change required — install identifiers (
ecc@ecc) and the documented/plugin marketplace add https://github.com/affaan-m/ECCflow are unchanged;only the resolution shape used by CoWork's remote sync is corrected. Existing
install-identifiersdoc tests remain green.