Skip to content

fix: remove existing marketplaces before adding to ensure fresh installation #889

Open
csy1204 wants to merge 2 commits intoanthropics:mainfrom
csy1204:fix/remove-marketplace-before-add
Open

fix: remove existing marketplaces before adding to ensure fresh installation #889
csy1204 wants to merge 2 commits intoanthropics:mainfrom
csy1204:fix/remove-marketplace-before-add

Conversation

@csy1204
Copy link
Contributor

@csy1204 csy1204 commented Feb 1, 2026

Summary

Fixes an issue on self-hosted runners where the Claude Code action fails with "Marketplace already installed" error because marketplaces from previous workflow runs persist in the runner's environment (~/.claude/).

Changes

Before adding marketplaces, the action now:

  1. Runs claude plugin marketplace list --json to get installed marketplaces
  2. Parses JSON output to extract marketplace names (robust, HUD-agnostic approach)
  3. Removes all existing marketplaces via claude plugin marketplace remove
  4. Adds the new marketplaces fresh

Key Improvement: JSON Output Instead of Arrow Parsing

Before (fragile):
Configured marketplaces:
❯ marketplace-name
Source: Git (url)
Parsing arrow () symbols is fragile and dependent on CLI display formatting.

After (robust):

  [                                                                                                                                                                                                                                             
    {                                                                                                                                                                                                                                           
      "name": "marketplace-name",                                                                                                                                                                                                               
      "source": "git",                                                                                                                                                                                                                          
      "url": "https://example.com/repo.git",                                                                                                                                                                                                    
      "installLocation": "/root/.claude/plugins/marketplaces/marketplace-name"                                                                                                                                                                  
    }                                                                                                                                                                                                                                           
  ]        

Using --json flag provides structured output that:

  • Is HUD-agnostic (works regardless of terminal styling)
  • Won't break if CLI output format changes
  • Is type-safe with proper TypeScript interface

Test Plan

  • All 661 tests pass
  • TypeScript typecheck passes
  • Code formatting check passes
  • Tested marketplace removal and re-add flow

Files Changed

  • base-action/src/install-plugins.ts - Added JSON parsing with MarketplaceEntry interface
  • base-action/test/install-plugins.test.ts - Updated tests to use JSON format

To ensure marketplaces are always up-to-date:
1. Get list of installed marketplaces via 'claude plugin marketplace list'
2. Parse output to extract names (lines starting with ❯)
3. Remove all existing marketplaces
4. Add the new marketplaces fresh

Also added comprehensive tests for marketplace removal functionality.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
ashwin-ant
ashwin-ant previously approved these changes Feb 1, 2026
@ashwin-ant
Copy link
Collaborator

@csy1204 mind fixing the type error?

Replace fragile arrow (❯) symbol parsing with structured JSON output
from `claude plugin marketplace list --json` command. This approach is:

- HUD-agnostic: Works regardless of terminal/HUD styling
- Robust: Won't break if CLI output format changes
- Type-safe: Properly typed MarketplaceEntry interface

Also fixes TypeScript type error in test mock function signature.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@csy1204
Copy link
Contributor Author

csy1204 commented Feb 2, 2026

@ashwin-ant Fixed! Also switched to using --json flag for marketplace list command, which is more reliable than parsing the arrow symbols.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants