Skip to content

Support promoting a forked plugin to its own marketplace repo #23

@albertgwo

Description

@albertgwo

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:

  1. Add a new marketplace entry in config.yaml pointing to the new repo
  2. Move the plugin from plugins.forked to plugins.upstream
  3. Remove the hardcoded hook path from config.yaml settings (the plugin's own hooks.json handles registration when installed from a marketplace)
  4. Delete the old embedded copy from ~/.claude-sync/plugins/
  5. 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:

  1. Registers ruminaider/bash-validator as a marketplace source
  2. Moves the plugin from forked to upstream in config.yaml
  3. Removes the hardcoded hook from settings (defers to the plugin's own hooks.json)
  4. Cleans up the old embedded copy from ~/.claude-sync/plugins/
  5. 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions