claude plugin install <name>@<local-marketplace> hangs indefinitely on CLI 2.1.112

Resolved 💬 1 comment Opened Apr 17, 2026 by MrGTV-love Closed May 26, 2026

Draft GitHub issue — Anthropic Claude Code

Status: draft; user must file on anthropics/claude-code manually (I cannot open GitHub issues on the user's behalf).

Suggested title: claude plugin install <name>@<local-marketplace> hangs indefinitely on local-path marketplace

Suggested labels: bug, plugins, cli

---

Environment

  • CLI version: claude --version2.1.112 (Claude Code)
  • Platform: macOS (Darwin 25.4.0, Apple Silicon)
  • Shell: zsh

Summary

claude plugin install <plugin>@<marketplace-name> --scope user blocks indefinitely with no progress output when <marketplace-name> is a local-path marketplace registered via claude plugin marketplace add <local-repo-path>. No error, no progress indicator, no timeout signal — the command hangs until killed. subprocess.TimeoutExpired fires at 60 seconds.

Reproduction steps

  1. In any repo root, create a minimal .claude-plugin/plugin.json (valid per claude plugin validate).
  2. Create .claude-plugin/marketplace.json:

``json
{
"name": "vernant-local",
"owner": { "name": "Test Owner", "email": "test@example.com" },
"plugins": [
{ "name": "<plugin-name>", "source": "./", "description": "local dev test", "version": "1.0.0" }
]
}
``

  1. claude plugin validate <repo-root>PASS (confirms manifests are well-formed; marketplace validates with a benign "no description" warning).
  2. claude plugin marketplace add <repo-root> --scope userPASS (returncode 0; visible in claude plugin marketplace list).
  3. claude plugin install <plugin-name>@vernant-local --scope userHANGS (no output, no progress, no exit). Timeout-killed at 60s.

Expected behavior

Either:

  • Install succeeds with progress output and returncode 0, or
  • Install fails with a descriptive error and non-zero returncode (e.g., "local-path marketplace install not supported; use --plugin-dir on enable instead").

Observed behavior

Silent hang. No stdout, no stderr, no progress indication. Forcing SIGTERM leaves the marketplace registered (claude plugin marketplace remove <name> restores clean state).

Impact

Blocks populated-project rollback testing for plugins-in-development. The conventional "verify plugin disable is a clean one-command revert" workflow (marketplace add → install → enable → disable → uninstall → marketplace remove) is not exercisable from CI or pytest fixtures, because step 2 (install) hangs. Downstream: CI jobs that attempt this flow consume runner time until timeout or killed; developers fall back to validate-only coverage, which is strictly weaker than enable/disable invariant verification.

Suggested fix directions

  1. Add a non-blocking timeout + clear error path to plugin install when the marketplace source is a local path that doesn't support the expected remote protocol.
  2. Or: add a claude plugin enable --plugin-dir <path> local-enable flag that bypasses the marketplace install step entirely (the install step's job is to cache the plugin; for a local path there is nothing to cache).
  3. Or: document in plugins-reference that local-path marketplaces are for listing/discovery only and not for install — and have plugin install fail fast with that message when the source resolves to a local directory.

Workaround

Fall back to claude plugin validate <path> as the sole invariant check; skip the enable/disable cycle with a per-session note in test output documenting the CLI blocker. See tests/plugin/test_rollback_canonical_sessions.py in this repo for the measured-caveat pattern.

View original on GitHub ↗

This issue has 1 comment on GitHub. Read the full discussion on GitHub ↗