Problem
When a forked plugin outgrows its embedded location in the config repo and gets published to its own GitHub repo, claude-sync has no mechanism to handle the transition. The user must manually:
- Add a new marketplace entry in
config.yaml pointing to the new repo
- Move the plugin from
plugins.forked to plugins.upstream
- Remove the hardcoded hook path from
config.yaml settings (the plugin's own hooks.json handles registration when installed from a marketplace)
- Delete the old embedded copy from
~/.claude-sync/plugins/
- Run
claude-sync pull to regenerate settings
This is error-prone and breaks the sync workflow — other machines pulling the config will still reference the old embedded path until manually updated.
Context
Concrete case: bash-validator started as a forked plugin embedded at ~/.claude-sync/plugins/bash-validator/. After adding documentation and a skill, it was published to its own repo at ruminaider/bash-validator. The config still has:
plugins:
forked:
- bash-validator # still points to embedded copy
hooks:
PreToolUse: |
...
"command": "python3 ~/.claude-sync/plugins/bash-validator/hooks/bash-validator.py"
...
This hardcoded path will break on any machine that doesn't have the embedded copy.
Expected Behavior
A command like claude-sync promote bash-validator --repo ruminaider/bash-validator that:
- Registers
ruminaider/bash-validator as a marketplace source
- Moves the plugin from
forked to upstream in config.yaml
- Removes the hardcoded hook from settings (defers to the plugin's own
hooks.json)
- Cleans up the old embedded copy from
~/.claude-sync/plugins/
- Updates
settings.json so the change takes effect immediately
Related Issues
These all touch the fork/marketplace lifecycle — this issue is the missing "unfork" direction.
Problem
When a forked plugin outgrows its embedded location in the config repo and gets published to its own GitHub repo, claude-sync has no mechanism to handle the transition. The user must manually:
config.yamlpointing to the new repoplugins.forkedtoplugins.upstreamconfig.yamlsettings (the plugin's ownhooks.jsonhandles registration when installed from a marketplace)~/.claude-sync/plugins/claude-sync pullto regenerate settingsThis is error-prone and breaks the sync workflow — other machines pulling the config will still reference the old embedded path until manually updated.
Context
Concrete case:
bash-validatorstarted as a forked plugin embedded at~/.claude-sync/plugins/bash-validator/. After adding documentation and a skill, it was published to its own repo atruminaider/bash-validator. The config still has:This hardcoded path will break on any machine that doesn't have the embedded copy.
Expected Behavior
A command like
claude-sync promote bash-validator --repo ruminaider/bash-validatorthat:ruminaider/bash-validatoras a marketplace sourceforkedtoupstreaminconfig.yamlhooks.json)~/.claude-sync/plugins/settings.jsonso the change takes effect immediatelyRelated Issues
These all touch the fork/marketplace lifecycle — this issue is the missing "unfork" direction.