Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
"name": "crew",
"source": {
"source": "git-subdir",
"url": "johantor/crew",
"url": "https://github.com/johantor/crew.git",
"path": "plugin"
},
"description": "Team-style feature delivery for Claude Code: a captain agent plans the work and delegates each step to backend, frontend, test, and design specialists behind hook-enforced guardrails, with a consolidated review gate before anything ships. Also pays down tech debt one verified, gated batch at a time."
Expand All @@ -18,7 +18,7 @@
"name": "board",
"source": {
"source": "git-subdir",
"url": "johantor/board",
"url": "https://github.com/johantor/board.git",
"path": "plugin"
},
"description": "A local kanban board of every Claude Code session: what needs you, what is running, what you closed today. Hooks log each session's state, a small Node server on 127.0.0.1 shows it as cards, and a click copies the resume command. Crew runs show their subagents on the session's card."
Expand Down
8 changes: 7 additions & 1 deletion .github/workflows/validate.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,13 @@ jobs:
while IFS=$'\x1f' read -r name kind repo path desc; do
case "$kind" in
github) url="https://raw.githubusercontent.com/$repo/HEAD/.claude-plugin/plugin.json" ;;
git-subdir) url="https://raw.githubusercontent.com/$repo/HEAD/$path/.claude-plugin/plugin.json" ;;
git-subdir)
# A short owner/repo url clones over SSH, which fails for users with no GitHub key.
case "$repo" in
https://github.com/*.git) repo="${repo#https://github.com/}"; repo="${repo%.git}" ;;
*) echo "FAIL: $name: git-subdir url must be https://github.com/<owner>/<repo>.git"; fail=1; continue ;;
esac
url="https://raw.githubusercontent.com/$repo/HEAD/$path/.claude-plugin/plugin.json" ;;
*) echo "FAIL: $name: unsupported source '$kind'"; fail=1; continue ;;
esac
manifest="$(curl -fsSL "$url")" || { echo "FAIL: $name: cannot fetch $url"; fail=1; continue; }
Expand Down
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,8 @@ claude plugin install crew@johantor # and board@johantor
## Maintaining

Each plugin lives in the `plugin/` folder of its repository, and the entries install that folder
only (`git-subdir`), so a repo's site and tooling never reach users.
only (`git-subdir`), so a repo's site and tooling never reach users. Each `url` is the full HTTPS
clone URL: the short `owner/repo` form clones over SSH and fails for users with no GitHub SSH key.

A plugin entry's `name` and `description` copy the plugin's own `plugin.json`, which is
canonical. CI (`validate.yml`) fetches each `plugin.json` from its repository and fails on a
Expand Down
Loading