Skip to content

feat: ship conductor as a Claude Code plugin marketplace#186

Merged
jrob5756 merged 3 commits into
mainfrom
feature/plugin-marketplace
May 14, 2026
Merged

feat: ship conductor as a Claude Code plugin marketplace#186
jrob5756 merged 3 commits into
mainfrom
feature/plugin-marketplace

Conversation

@jrob5756
Copy link
Copy Markdown
Collaborator

Summary

Make microsoft/conductor installable as a plugin in both Claude Code and GitHub Copilot CLI without maintaining a second repo.

Install commands users will run

Claude Code:

/plugin marketplace add microsoft/conductor
/plugin install conductor@conductor

Copilot CLI (requires gh ≥ 2.90):

gh skill install microsoft/conductor conductor

Layout

  • .claude-plugin/marketplace.json — single-plugin marketplace catalog (uses metadata.pluginRoot: \"./plugins\", fills in category/keywords/tags for discovery).
  • plugins/conductor/.claude-plugin/plugin.json — plugin manifest, version pinned to match pyproject.toml (0.1.15).
  • plugins/conductor/skills/conductor/canonical location of the skill files (real directory).
  • .claude/skills/conductorsymlink../../plugins/conductor/skills/conductor, so local Claude Code dev sessions still find the skill at the conventional path.
  • plugins/conductor/README.md — short plugin overview + trust note.
  • .github/workflows/validate-plugin.yml — JSON validation, symlink check, and version-parity check on PRs that touch the plugin files.
  • README.md — new "Use the Conductor skill in Claude Code or Copilot CLI" subsection under Installation.

Why the symlink direction matters

Initial draft had the symlink the other way (plugins/.../conductor.claude/skills/conductor). That works for Claude Code (its plugin installer clones the whole repo and follows symlinks), but it breaks gh skill install because GitHub's blob API doesn't dereference symlinks — the remote installer would receive a symlink blob instead of the SKILL.md tree. Flipping the canonical location to plugins/conductor/skills/conductor/ fixes this.

gh skill install discovery rules (verified in cli/cli source — pkg/cmd/skills/install/install.go):

  • ✅ Walks plugins/*/skills/*/SKILL.md automatically.
  • ❌ Skips dot-prefixed dirs like .claude/skills/ unless --allow-hidden-dirs is passed.
  • ❌ Does not follow symlinks for remote installs.

So the canonical-path rule is: real files live under plugins/conductor/skills/conductor/, the dotfile path is the convenience symlink.

Trust surface

The plugin ships markdown only — no bin/, hooks/, mcpServers/, or executables. Users can verify trust by reading the markdown directly.

Versioning

marketplace.json and plugin.json are both pinned to 0.1.15 to match pyproject.toml. Bumping all three together on releases keeps install detection working (without an explicit version, every commit looks like a new version to installed users).

Verification

  • python -c \"import json; json.load(...)\" parses both manifests cleanly.
  • test -f plugins/conductor/skills/conductor/SKILL.md passes (real file, not a broken symlink).
  • git ls-files -s confirms plugins/conductor/skills/conductor/SKILL.md is mode 100644 (regular file) and .claude/skills/conductor is mode 120000 (symlink).

Suggested follow-up (not in this PR)

  • Tag a release (v0.1.15) so users can pin via /plugin marketplace add microsoft/conductor@v0.1.15.
  • After merge, smoke-test in a clean Claude Code session.
  • Optional: gh skill publish to add it to Copilot CLI's discoverable index.

jrob5756 and others added 2 commits May 14, 2026 10:01
Add a single-plugin marketplace at the repo root so users can install the
conductor skill directly from microsoft/conductor:

  /plugin marketplace add microsoft/conductor
  /plugin install conductor@conductor

Layout:
  .claude-plugin/marketplace.json          - marketplace catalog
  plugins/conductor/.claude-plugin/        - plugin manifest
  plugins/conductor/skills/conductor       - symlink to .claude/skills/conductor
                                             so the existing skill stays canonical
  plugins/conductor/README.md              - plugin overview and trust note
  .github/workflows/validate-plugin.yml    - JSON + version-parity CI
  README.md                                - new 'Use as a Claude Code plugin'
                                             section under Installation

The plugin ships markdown only (no bin/, hooks/, mcpServers/, or executables),
keeping the trust surface minimal. The same SKILL.md remains usable via
`gh skill install microsoft/conductor conductor` for Copilot CLI users.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- CI: replace no-op symlink check with one that asserts `.claude/skills/conductor`
  is actually a symlink (the previous `test -f` would have passed even with the
  symlink missing entirely).
- CI: check version parity against pyproject.toml (the version that ships with
  the Python package), not against a redundant marketplace-entry version field.
- marketplace.json: remove redundant `version` field from the plugin entry; per
  Anthropic's spec the entry version is optional and overrides plugin.json, so
  having both at the same value just creates a coupling point with no benefit.
- README: bump gh CLI floor from 2.90 to 2.91 — the `--allow-hidden-dirs`
  reasoning in the PR description only holds from v2.91, and v2.91 also brought
  improved nested-skills discovery.
- SKILL.md: rewrite description so it actually contains "Conductor" (the
  previous wording would not reliably match "run my conductor workflow") and
  scope it to Conductor-specific terms instead of generic "YAML workflows"
  that overlap with Argo, Temporal, GH Actions, etc.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@jrob5756 jrob5756 force-pushed the feature/plugin-marketplace branch from eeb1c3a to 3dc36cc Compare May 14, 2026 14:01
…he skill

Per maintainer feedback: simpler to make conductor exclusively a plugin. The
symlink at .claude/skills/conductor was added so the same skill could be
discovered both as a local Claude Code skill and as a plugin export, but it
adds cross-platform fragility (Windows checkouts without symlink support, CI
clones, agents that don't follow symlinks) for marginal benefit.

Changes:
- Remove the .claude/skills/conductor symlink.
- CI: drop the symlink-resolves check and remove .claude/skills/** from path
  triggers.
- plugins/conductor/README.md: replace the symlink note with a short "Local
  development" section pointing at `claude --plugin-dir plugins/conductor`
  for testing edits to the skill from a clone.
- README.md: update the install subsection to reference the plugin path
  instead of the now-removed .claude/skills/conductor location.

Conductor maintainers who want the skill loaded while hacking on it should
either install the plugin from the marketplace or use --plugin-dir.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@jrob5756 jrob5756 merged commit dfc340c into main May 14, 2026
10 checks passed
@jrob5756 jrob5756 deleted the feature/plugin-marketplace branch May 14, 2026 17:03
@jrob5756 jrob5756 mentioned this pull request May 14, 2026
jrob5756 added a commit that referenced this pull request May 14, 2026
- feat(engine): registry references in sub-workflow workflow: field (#188)
- feat: Claude Code plugin marketplace (#186)
- docs(skill): refresh conductor skill with latest features (#187)
- docs: rewrite 'Why Conductor?' README section (#185)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
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.

1 participant