claude plugin install <name>@<local-marketplace> hangs indefinitely on CLI 2.1.112
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 --version→2.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
- In any repo root, create a minimal
.claude-plugin/plugin.json(valid perclaude plugin validate). - 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" }
]
}
claude plugin validate <repo-root>→ PASS (confirms manifests are well-formed; marketplace validates with a benign "no description" warning).claude plugin marketplace add <repo-root> --scope user→ PASS (returncode 0; visible inclaude plugin marketplace list).claude plugin install <plugin-name>@vernant-local --scope user→ HANGS (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
- Add a non-blocking timeout + clear error path to
plugin installwhen the marketplace source is a local path that doesn't support the expected remote protocol. - 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). - Or: document in
plugins-referencethat local-path marketplaces are for listing/discovery only and not for install — and haveplugin installfail 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.
This issue has 1 comment on GitHub. Read the full discussion on GitHub ↗