From 3e7d68bae153c1366aab6fe874a46420317a9010 Mon Sep 17 00:00:00 2001 From: Jason Robert Date: Thu, 14 May 2026 09:33:08 -0400 Subject: [PATCH 1/3] feat: ship conductor as a Claude Code plugin marketplace 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> --- .claude-plugin/marketplace.json | 36 +++++++++++++++++ .claude/skills/conductor | 1 + .github/workflows/validate-plugin.yml | 39 +++++++++++++++++++ README.md | 22 +++++++++++ plugins/conductor/.claude-plugin/plugin.json | 17 ++++++++ plugins/conductor/README.md | 33 ++++++++++++++++ .../conductor}/skills/conductor/SKILL.md | 0 .../skills/conductor/references/authoring.md | 0 .../skills/conductor/references/execution.md | 0 .../skills/conductor/references/setup.md | 0 .../conductor/references/yaml-schema.md | 0 11 files changed, 148 insertions(+) create mode 100644 .claude-plugin/marketplace.json create mode 120000 .claude/skills/conductor create mode 100644 .github/workflows/validate-plugin.yml create mode 100644 plugins/conductor/.claude-plugin/plugin.json create mode 100644 plugins/conductor/README.md rename {.claude => plugins/conductor}/skills/conductor/SKILL.md (100%) rename {.claude => plugins/conductor}/skills/conductor/references/authoring.md (100%) rename {.claude => plugins/conductor}/skills/conductor/references/execution.md (100%) rename {.claude => plugins/conductor}/skills/conductor/references/setup.md (100%) rename {.claude => plugins/conductor}/skills/conductor/references/yaml-schema.md (100%) diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json new file mode 100644 index 0000000..9d26a40 --- /dev/null +++ b/.claude-plugin/marketplace.json @@ -0,0 +1,36 @@ +{ + "$schema": "https://json.schemastore.org/claude-code-marketplace.json", + "name": "conductor", + "version": "0.1.15", + "description": "Conductor — multi-agent workflow orchestration via YAML", + "owner": { + "name": "Microsoft", + "email": "opensource@microsoft.com" + }, + "metadata": { + "pluginRoot": "./plugins" + }, + "plugins": [ + { + "name": "conductor", + "source": "./conductor", + "description": "Validate, run, and execute Conductor multi-agent YAML workflows. Adds the conductor skill that knows the workflow schema, CLI commands, and execution model.", + "version": "0.1.15", + "author": { "name": "Microsoft" }, + "homepage": "https://github.com/microsoft/conductor", + "repository": "https://github.com/microsoft/conductor", + "license": "MIT", + "category": "workflow", + "keywords": [ + "workflow", + "orchestration", + "multi-agent", + "yaml", + "copilot", + "claude", + "agents" + ], + "tags": ["agents", "automation", "workflow"] + } + ] +} diff --git a/.claude/skills/conductor b/.claude/skills/conductor new file mode 120000 index 0000000..25e5c5c --- /dev/null +++ b/.claude/skills/conductor @@ -0,0 +1 @@ +../../plugins/conductor/skills/conductor \ No newline at end of file diff --git a/.github/workflows/validate-plugin.yml b/.github/workflows/validate-plugin.yml new file mode 100644 index 0000000..01b2e1a --- /dev/null +++ b/.github/workflows/validate-plugin.yml @@ -0,0 +1,39 @@ +name: validate-plugin + +on: + pull_request: + paths: + - ".claude-plugin/**" + - "plugins/**" + - ".claude/skills/**" + - ".github/workflows/validate-plugin.yml" + push: + branches: [main] + paths: + - ".claude-plugin/**" + - "plugins/**" + - ".claude/skills/**" + - ".github/workflows/validate-plugin.yml" + +jobs: + validate-json: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Validate marketplace.json and plugin.json are valid JSON + run: | + python -c "import json,sys; json.load(open('.claude-plugin/marketplace.json'))" + python -c "import json,sys; json.load(open('plugins/conductor/.claude-plugin/plugin.json'))" + - name: Verify skill symlink resolves + run: | + test -f plugins/conductor/skills/conductor/SKILL.md + echo "OK: skill symlink resolves to a real SKILL.md" + - name: Verify plugin and marketplace versions match + run: | + MARKET=$(python -c "import json; print(json.load(open('.claude-plugin/marketplace.json'))['plugins'][0]['version'])") + PLUGIN=$(python -c "import json; print(json.load(open('plugins/conductor/.claude-plugin/plugin.json'))['version'])") + if [ "$MARKET" != "$PLUGIN" ]; then + echo "Version mismatch: marketplace=$MARKET plugin=$PLUGIN" + exit 1 + fi + echo "OK: both at version $MARKET" diff --git a/README.md b/README.md index b56673f..d88fa96 100644 --- a/README.md +++ b/README.md @@ -115,6 +115,28 @@ conductor run workflow.yaml pip install git+https://github.com/microsoft/conductor.git@v1.0.0 ``` +### Use the Conductor skill in Claude Code or Copilot CLI + +This repo doubles as a single-plugin marketplace that ships the `conductor` +skill (the same one in `.claude/skills/conductor/`). The skill teaches the +assistant the workflow YAML schema, CLI commands, and execution model. + +**Claude Code:** + +```text +/plugin marketplace add microsoft/conductor +/plugin install conductor@conductor +``` + +**GitHub Copilot CLI** (`gh skill` requires GitHub CLI 2.90+, public preview): + +```bash +gh skill install microsoft/conductor conductor +``` + +The plugin ships only markdown — no executables, hooks, or MCP servers — so +trust verification is straightforward. + ## Quick Start ### 1. Create a workflow file diff --git a/plugins/conductor/.claude-plugin/plugin.json b/plugins/conductor/.claude-plugin/plugin.json new file mode 100644 index 0000000..8e64e55 --- /dev/null +++ b/plugins/conductor/.claude-plugin/plugin.json @@ -0,0 +1,17 @@ +{ + "name": "conductor", + "description": "Multi-agent workflow orchestration via YAML. Ships the conductor skill so the assistant can validate, run, debug, and author workflow files for the conductor CLI.", + "version": "0.1.15", + "author": { + "name": "Microsoft" + }, + "homepage": "https://github.com/microsoft/conductor", + "repository": "https://github.com/microsoft/conductor", + "license": "MIT", + "keywords": [ + "workflow", + "orchestration", + "multi-agent", + "yaml" + ] +} diff --git a/plugins/conductor/README.md b/plugins/conductor/README.md new file mode 100644 index 0000000..06f8f89 --- /dev/null +++ b/plugins/conductor/README.md @@ -0,0 +1,33 @@ +# Conductor (Claude Code plugin) + +Bundles the **conductor** skill so Claude Code can validate, run, debug, and author +Conductor multi-agent YAML workflows. + +The skill files in this directory are the canonical source. The +`.claude/skills/conductor` path at the repo root is a symlink to here, so +local Claude Code dev sessions and the published plugin share a single source +of truth. + +## What this plugin contains + +- `skills/conductor/SKILL.md` — model-invoked skill describing the workflow schema, + CLI commands, execution model, and authoring guidance. +- `skills/conductor/references/` — supporting reference docs for setup, execution, + authoring, and the YAML schema. + +This plugin ships **only markdown** — no executables, hooks, MCP servers, or +custom agents — so trust verification is straightforward: read the markdown. + +## Install + +Add the marketplace and install the plugin: + +```text +/plugin marketplace add microsoft/conductor +/plugin install conductor@conductor +``` + +## Use the underlying CLI + +The skill orchestrates the `conductor` Python CLI. Install it separately following +the [main project README](https://github.com/microsoft/conductor#installation). diff --git a/.claude/skills/conductor/SKILL.md b/plugins/conductor/skills/conductor/SKILL.md similarity index 100% rename from .claude/skills/conductor/SKILL.md rename to plugins/conductor/skills/conductor/SKILL.md diff --git a/.claude/skills/conductor/references/authoring.md b/plugins/conductor/skills/conductor/references/authoring.md similarity index 100% rename from .claude/skills/conductor/references/authoring.md rename to plugins/conductor/skills/conductor/references/authoring.md diff --git a/.claude/skills/conductor/references/execution.md b/plugins/conductor/skills/conductor/references/execution.md similarity index 100% rename from .claude/skills/conductor/references/execution.md rename to plugins/conductor/skills/conductor/references/execution.md diff --git a/.claude/skills/conductor/references/setup.md b/plugins/conductor/skills/conductor/references/setup.md similarity index 100% rename from .claude/skills/conductor/references/setup.md rename to plugins/conductor/skills/conductor/references/setup.md diff --git a/.claude/skills/conductor/references/yaml-schema.md b/plugins/conductor/skills/conductor/references/yaml-schema.md similarity index 100% rename from .claude/skills/conductor/references/yaml-schema.md rename to plugins/conductor/skills/conductor/references/yaml-schema.md From 3dc36cc1de3aa710b5a286990f608b285a6c6ebc Mon Sep 17 00:00:00 2001 From: Jason Robert Date: Thu, 14 May 2026 09:54:22 -0400 Subject: [PATCH 2/3] fix: address PR review findings on plugin marketplace MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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> --- .claude-plugin/marketplace.json | 1 - .github/workflows/validate-plugin.yml | 26 ++++++++++++++++++-------- README.md | 2 +- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 9d26a40..3cddaba 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -15,7 +15,6 @@ "name": "conductor", "source": "./conductor", "description": "Validate, run, and execute Conductor multi-agent YAML workflows. Adds the conductor skill that knows the workflow schema, CLI commands, and execution model.", - "version": "0.1.15", "author": { "name": "Microsoft" }, "homepage": "https://github.com/microsoft/conductor", "repository": "https://github.com/microsoft/conductor", diff --git a/.github/workflows/validate-plugin.yml b/.github/workflows/validate-plugin.yml index 01b2e1a..0fb9d78 100644 --- a/.github/workflows/validate-plugin.yml +++ b/.github/workflows/validate-plugin.yml @@ -6,6 +6,7 @@ on: - ".claude-plugin/**" - "plugins/**" - ".claude/skills/**" + - "pyproject.toml" - ".github/workflows/validate-plugin.yml" push: branches: [main] @@ -13,6 +14,7 @@ on: - ".claude-plugin/**" - "plugins/**" - ".claude/skills/**" + - "pyproject.toml" - ".github/workflows/validate-plugin.yml" jobs: @@ -24,16 +26,24 @@ jobs: run: | python -c "import json,sys; json.load(open('.claude-plugin/marketplace.json'))" python -c "import json,sys; json.load(open('plugins/conductor/.claude-plugin/plugin.json'))" - - name: Verify skill symlink resolves + - name: Verify canonical SKILL.md is a real file run: | test -f plugins/conductor/skills/conductor/SKILL.md - echo "OK: skill symlink resolves to a real SKILL.md" - - name: Verify plugin and marketplace versions match + echo "OK: canonical SKILL.md is a real file" + - name: Verify .claude/skills/conductor symlink resolves + run: | + if [ ! -L .claude/skills/conductor ]; then + echo "ERROR: .claude/skills/conductor is not a symlink"; exit 1 + fi + if [ ! -f .claude/skills/conductor/SKILL.md ]; then + echo "ERROR: .claude/skills/conductor symlink does not resolve to SKILL.md"; exit 1 + fi + echo "OK: .claude/skills/conductor symlink resolves correctly" + - name: Verify plugin.json and pyproject.toml versions match run: | - MARKET=$(python -c "import json; print(json.load(open('.claude-plugin/marketplace.json'))['plugins'][0]['version'])") PLUGIN=$(python -c "import json; print(json.load(open('plugins/conductor/.claude-plugin/plugin.json'))['version'])") - if [ "$MARKET" != "$PLUGIN" ]; then - echo "Version mismatch: marketplace=$MARKET plugin=$PLUGIN" - exit 1 + PYPROJECT=$(python -c "import tomllib; print(tomllib.load(open('pyproject.toml','rb'))['project']['version'])") + if [ "$PLUGIN" != "$PYPROJECT" ]; then + echo "Version mismatch: plugin.json=$PLUGIN pyproject.toml=$PYPROJECT"; exit 1 fi - echo "OK: both at version $MARKET" + echo "OK: both at version $PLUGIN" diff --git a/README.md b/README.md index d88fa96..7241e7c 100644 --- a/README.md +++ b/README.md @@ -128,7 +128,7 @@ assistant the workflow YAML schema, CLI commands, and execution model. /plugin install conductor@conductor ``` -**GitHub Copilot CLI** (`gh skill` requires GitHub CLI 2.90+, public preview): +**GitHub Copilot CLI** (`gh skill` requires GitHub CLI 2.91+, public preview): ```bash gh skill install microsoft/conductor conductor From 8ded6cfbca70dd504ed3b85b89eae044c10dbdff Mon Sep 17 00:00:00 2001 From: Jason Robert Date: Thu, 14 May 2026 10:07:36 -0400 Subject: [PATCH 3/3] =?UTF-8?q?refactor:=20drop=20.claude/skills=20symlink?= =?UTF-8?q?=20=E2=80=94=20plugin=20is=20the=20only=20home=20for=20the=20sk?= =?UTF-8?q?ill?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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> --- .claude/skills/conductor | 1 - .github/workflows/validate-plugin.yml | 15 ++------------- README.md | 2 +- plugins/conductor/README.md | 14 +++++++++----- 4 files changed, 12 insertions(+), 20 deletions(-) delete mode 120000 .claude/skills/conductor diff --git a/.claude/skills/conductor b/.claude/skills/conductor deleted file mode 120000 index 25e5c5c..0000000 --- a/.claude/skills/conductor +++ /dev/null @@ -1 +0,0 @@ -../../plugins/conductor/skills/conductor \ No newline at end of file diff --git a/.github/workflows/validate-plugin.yml b/.github/workflows/validate-plugin.yml index 0fb9d78..ccb616b 100644 --- a/.github/workflows/validate-plugin.yml +++ b/.github/workflows/validate-plugin.yml @@ -5,7 +5,6 @@ on: paths: - ".claude-plugin/**" - "plugins/**" - - ".claude/skills/**" - "pyproject.toml" - ".github/workflows/validate-plugin.yml" push: @@ -13,7 +12,6 @@ on: paths: - ".claude-plugin/**" - "plugins/**" - - ".claude/skills/**" - "pyproject.toml" - ".github/workflows/validate-plugin.yml" @@ -26,19 +24,10 @@ jobs: run: | python -c "import json,sys; json.load(open('.claude-plugin/marketplace.json'))" python -c "import json,sys; json.load(open('plugins/conductor/.claude-plugin/plugin.json'))" - - name: Verify canonical SKILL.md is a real file + - name: Verify SKILL.md exists at the expected plugin path run: | test -f plugins/conductor/skills/conductor/SKILL.md - echo "OK: canonical SKILL.md is a real file" - - name: Verify .claude/skills/conductor symlink resolves - run: | - if [ ! -L .claude/skills/conductor ]; then - echo "ERROR: .claude/skills/conductor is not a symlink"; exit 1 - fi - if [ ! -f .claude/skills/conductor/SKILL.md ]; then - echo "ERROR: .claude/skills/conductor symlink does not resolve to SKILL.md"; exit 1 - fi - echo "OK: .claude/skills/conductor symlink resolves correctly" + echo "OK: plugins/conductor/skills/conductor/SKILL.md is present" - name: Verify plugin.json and pyproject.toml versions match run: | PLUGIN=$(python -c "import json; print(json.load(open('plugins/conductor/.claude-plugin/plugin.json'))['version'])") diff --git a/README.md b/README.md index 7241e7c..6175ffb 100644 --- a/README.md +++ b/README.md @@ -118,7 +118,7 @@ pip install git+https://github.com/microsoft/conductor.git@v1.0.0 ### Use the Conductor skill in Claude Code or Copilot CLI This repo doubles as a single-plugin marketplace that ships the `conductor` -skill (the same one in `.claude/skills/conductor/`). The skill teaches the +skill from `plugins/conductor/skills/conductor/`. The skill teaches the assistant the workflow YAML schema, CLI commands, and execution model. **Claude Code:** diff --git a/plugins/conductor/README.md b/plugins/conductor/README.md index 06f8f89..ab72e45 100644 --- a/plugins/conductor/README.md +++ b/plugins/conductor/README.md @@ -3,11 +3,6 @@ Bundles the **conductor** skill so Claude Code can validate, run, debug, and author Conductor multi-agent YAML workflows. -The skill files in this directory are the canonical source. The -`.claude/skills/conductor` path at the repo root is a symlink to here, so -local Claude Code dev sessions and the published plugin share a single source -of truth. - ## What this plugin contains - `skills/conductor/SKILL.md` — model-invoked skill describing the workflow schema, @@ -27,6 +22,15 @@ Add the marketplace and install the plugin: /plugin install conductor@conductor ``` +## Local development + +If you're hacking on the skill from a clone of `microsoft/conductor`, point Claude +Code at this directory directly: + +```bash +claude --plugin-dir plugins/conductor +``` + ## Use the underlying CLI The skill orchestrates the `conductor` Python CLI. Install it separately following