diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 38d397a..a8e1fb6 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -36,7 +36,7 @@ With the following content: The `tags` field is **required** and must include **at least one** of the component types below. It tells users what your plugin provides: -- `skills` — skill directories with `SKILL.md` +- `skills` — skill directories with `SKILL.md`, at `skills//SKILL.md` in the plugin or wherever its `plugin.json` `skills` field points. The weekly audit flags a plugin tagged `skills` that ships none there, since apps that install skills from AgentHub filter on this tag - `agents` — subagent markdown files - `commands` — slash command markdown files - `hooks` — event hooks (`hooks.json`) diff --git a/plugins/ask-questions-if-underspecified.json b/plugins/ask-questions-if-underspecified.json deleted file mode 100644 index d2ba634..0000000 --- a/plugins/ask-questions-if-underspecified.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "ask-questions-if-underspecified", - "source": { - "source": "git-subdir", - "url": "https://github.com/trailofbits/skills.git", - "path": "plugins/ask-questions-if-underspecified" - }, - "description": "Clarify ambiguous requirements by asking questions before implementing. Only when invoked explicitly.", - "version": "1.0.1", - "author": { - "username": "trailofbits", - "name": "Kevin Valerio" - }, - "category": "development", - "tags": [ - "skills" - ], - "license": "MIT" -} diff --git a/plugins/axiom-apple-skills.json b/plugins/axiom-apple-skills.json index bf32d04..60c167c 100644 --- a/plugins/axiom-apple-skills.json +++ b/plugins/axiom-apple-skills.json @@ -1,8 +1,9 @@ { "name": "axiom-apple-skills", "source": { - "source": "github", - "repo": "CharlesWiltgen/Axiom" + "source": "git-subdir", + "url": "https://github.com/CharlesWiltgen/Axiom.git", + "path": ".claude-plugin/plugins/axiom" }, "description": "Battle-tested skills for iOS, iPadOS, watchOS, and tvOS development", "version": "1.0.0", diff --git a/plugins/c4-architecture.json b/plugins/c4-architecture.json index 356416c..28b0791 100644 --- a/plugins/c4-architecture.json +++ b/plugins/c4-architecture.json @@ -13,7 +13,8 @@ }, "category": "documentation", "tags": [ - "skills" + "agents", + "commands" ], "license": "MIT" } diff --git a/plugins/ccpm.json b/plugins/ccpm.json index fe9fa0a..9b37c76 100644 --- a/plugins/ccpm.json +++ b/plugins/ccpm.json @@ -1,8 +1,9 @@ { "name": "ccpm", "source": { - "source": "github", - "repo": "automazeio/ccpm" + "source": "git-subdir", + "url": "https://github.com/automazeio/ccpm.git", + "path": "skill/ccpm" }, "description": "Project management for Claude Code using GitHub Issues", "version": "1.0.0", diff --git a/plugins/claude-aws-cost-saver.json b/plugins/claude-aws-cost-saver.json index 26898e1..dbd37db 100644 --- a/plugins/claude-aws-cost-saver.json +++ b/plugins/claude-aws-cost-saver.json @@ -1,8 +1,9 @@ { "name": "claude-aws-cost-saver", "source": { - "source": "github", - "repo": "prajapatimehul/claude-aws-cost-saver" + "source": "git-subdir", + "url": "https://github.com/prajapatimehul/claude-aws-cost-saver.git", + "path": "plugins/aws-cost-saver" }, "description": "Finds AWS cost savings with 163 checks across 30+ services", "version": "1.0.0", diff --git a/plugins/coding-tutor.json b/plugins/coding-tutor.json deleted file mode 100644 index 27e48d7..0000000 --- a/plugins/coding-tutor.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "name": "coding-tutor", - "source": { - "source": "git-subdir", - "url": "https://github.com/EveryInc/compound-engineering-plugin.git", - "path": "plugins/coding-tutor" - }, - "description": "Personalized coding tutorials that build on your existing knowledge and use your actual codebase for examples. Includes spaced repetition quizzes to reinforce learning. Includes 3 commands and 1 skill.", - "version": "1.0.0", - "author": { - "username": "EveryInc", - "name": "Nityesh Agarwal" - }, - "category": "documentation", - "tags": [ - "coding", - "programming", - "tutorial", - "learning", - "spaced-repetition", - "education", - "other" - ], - "license": "MIT" -} diff --git a/plugins/compound-engineering.json b/plugins/compound-engineering.json index 777971c..c9f3723 100644 --- a/plugins/compound-engineering.json +++ b/plugins/compound-engineering.json @@ -1,9 +1,8 @@ { "name": "compound-engineering", "source": { - "source": "git-subdir", - "url": "https://github.com/EveryInc/compound-engineering-plugin.git", - "path": "plugins/compound-engineering" + "source": "github", + "repo": "EveryInc/compound-engineering-plugin" }, "description": "AI-powered development tools that get smarter with every use. Make each unit of engineering work easier than the last.", "version": "1.0.0", diff --git a/plugins/cto-toolkit.json b/plugins/cto-toolkit.json index 1783360..7892053 100644 --- a/plugins/cto-toolkit.json +++ b/plugins/cto-toolkit.json @@ -12,7 +12,6 @@ }, "category": "development", "tags": [ - "skills", "agents", "hooks", "commands" diff --git a/plugins/debug-buttercup.json b/plugins/debug-buttercup.json deleted file mode 100644 index 3cea1fe..0000000 --- a/plugins/debug-buttercup.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "debug-buttercup", - "source": { - "source": "git-subdir", - "url": "https://github.com/trailofbits/skills.git", - "path": "plugins/debug-buttercup" - }, - "description": "Debug Buttercup Kubernetes deployments", - "version": "1.0.0", - "author": { - "username": "trailofbits", - "name": "Ronald Eytchison" - }, - "category": "devops", - "tags": [ - "skills" - ], - "license": "MIT" -} diff --git a/plugins/dev-skills.json b/plugins/dev-skills.json index 9096152..5d368c6 100644 --- a/plugins/dev-skills.json +++ b/plugins/dev-skills.json @@ -3,7 +3,7 @@ "source": { "source": "git-subdir", "url": "https://github.com/shinpr/claude-code-workflows.git", - "path": "skills-only" + "path": "dev-skills" }, "description": "Lightweight skills for users with existing workflows - coding best practices, testing principles, and design guidelines without recipe workflows or agents", "version": "1.0.0", diff --git a/plugins/dev-workflows-frontend.json b/plugins/dev-workflows-frontend.json index 3ed29ee..fc22a6c 100644 --- a/plugins/dev-workflows-frontend.json +++ b/plugins/dev-workflows-frontend.json @@ -3,7 +3,7 @@ "source": { "source": "git-subdir", "url": "https://github.com/shinpr/claude-code-workflows.git", - "path": "frontend" + "path": "dev-workflows-frontend" }, "description": "Skills + Subagents for React/TypeScript - Use skills for coding guidance, or run recipe workflows for full orchestrated agentic coding with specialized agents", "version": "1.0.0", diff --git a/plugins/dev-workflows.json b/plugins/dev-workflows.json index 412eb63..744a779 100644 --- a/plugins/dev-workflows.json +++ b/plugins/dev-workflows.json @@ -3,7 +3,7 @@ "source": { "source": "git-subdir", "url": "https://github.com/shinpr/claude-code-workflows.git", - "path": "backend" + "path": "dev-workflows" }, "description": "Skills + Subagents for backend development - Use skills for coding guidance, or run recipe workflows for full orchestrated agentic coding with specialized agents", "version": "1.0.0", diff --git a/plugins/developer-kit-devops.json b/plugins/developer-kit-devops.json index 9faf82d..15b2ed5 100644 --- a/plugins/developer-kit-devops.json +++ b/plugins/developer-kit-devops.json @@ -13,7 +13,7 @@ }, "category": "devops", "tags": [ - "skills" + "agents" ], "license": "MIT" } diff --git a/plugins/developer-kit-project-management.json b/plugins/developer-kit-project-management.json index 6086801..63d1b73 100644 --- a/plugins/developer-kit-project-management.json +++ b/plugins/developer-kit-project-management.json @@ -13,7 +13,7 @@ }, "category": "productivity", "tags": [ - "skills" + "commands" ], "license": "MIT" } diff --git a/plugins/elastic-cloud.json b/plugins/elastic-cloud.json index 55cc7e7..913cb25 100644 --- a/plugins/elastic-cloud.json +++ b/plugins/elastic-cloud.json @@ -3,9 +3,9 @@ "source": { "source": "git-subdir", "url": "https://github.com/elastic/agent-skills.git", - "path": "skills/cloud" + "path": "plugins/cloud" }, - "description": "Elastic Cloud skills \u2014 project setup, access management, network security, and Serverless project lifecycle", + "description": "Elastic Cloud skills — project setup, access management, network security, and Serverless project lifecycle", "version": "0.2.1", "author": { "username": "elastic", diff --git a/plugins/elastic-elasticsearch.json b/plugins/elastic-elasticsearch.json index 008e517..65683ab 100644 --- a/plugins/elastic-elasticsearch.json +++ b/plugins/elastic-elasticsearch.json @@ -3,9 +3,9 @@ "source": { "source": "git-subdir", "url": "https://github.com/elastic/agent-skills.git", - "path": "skills/elasticsearch" + "path": "plugins/elasticsearch" }, - "description": "Elasticsearch skills \u2014 ES|QL queries, data ingestion, security (authn, authz, audit), and troubleshooting", + "description": "Elasticsearch skills — ES|QL queries, data ingestion, security (authn, authz, audit), and troubleshooting", "version": "0.2.1", "author": { "username": "elastic", diff --git a/plugins/elastic-kibana.json b/plugins/elastic-kibana.json index da0e568..72efa11 100644 --- a/plugins/elastic-kibana.json +++ b/plugins/elastic-kibana.json @@ -3,9 +3,9 @@ "source": { "source": "git-subdir", "url": "https://github.com/elastic/agent-skills.git", - "path": "skills/kibana" + "path": "plugins/kibana" }, - "description": "Kibana skills \u2014 dashboards, alerting rules, connectors, Vega visualizations, Agent Builder, streams, and audit logging", + "description": "Kibana skills — dashboards, alerting rules, connectors, Vega visualizations, Agent Builder, streams, and audit logging", "version": "0.2.1", "author": { "username": "elastic", diff --git a/plugins/elastic-observability.json b/plugins/elastic-observability.json index a7888e3..ba5cebc 100644 --- a/plugins/elastic-observability.json +++ b/plugins/elastic-observability.json @@ -3,9 +3,9 @@ "source": { "source": "git-subdir", "url": "https://github.com/elastic/agent-skills.git", - "path": "skills/observability" + "path": "plugins/observability" }, - "description": "Elastic Observability skills \u2014 OpenTelemetry instrumentation and migration (.NET, Java, Python), LLM observability, log search, SLOs, and service health", + "description": "Elastic Observability skills — OpenTelemetry instrumentation and migration (.NET, Java, Python), LLM observability, log search, SLOs, and service health", "version": "0.2.1", "author": { "username": "elastic", diff --git a/plugins/elastic-security.json b/plugins/elastic-security.json index 42fe111..bcbdaf0 100644 --- a/plugins/elastic-security.json +++ b/plugins/elastic-security.json @@ -3,9 +3,9 @@ "source": { "source": "git-subdir", "url": "https://github.com/elastic/agent-skills.git", - "path": "skills/security" + "path": "plugins/security" }, - "description": "Elastic Security skills \u2014 alert triage, case management, detection rule management, and sample data generation", + "description": "Elastic Security skills — alert triage, case management, detection rule management, and sample data generation", "version": "0.2.1", "author": { "username": "elastic", diff --git a/plugins/flow.json b/plugins/flow.json deleted file mode 100644 index 5f718a6..0000000 --- a/plugins/flow.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "name": "flow", - "source": { - "source": "git-subdir", - "url": "https://github.com/gmickel/flow-next.git", - "path": "plugins/flow" - }, - "description": "Two-step planning + execution workflow with optional Beads integration. Includes 6 subagents, 5 commands, 7 skills.", - "version": "0.8.4", - "author": { - "username": "gmickel", - "name": "Gordon Mickel" - }, - "category": "productivity", - "tags": [ - "claude-code", - "plugin", - "workflow", - "planning", - "execution", - "other" - ], - "license": "MIT" -} diff --git a/plugins/git-cleanup.json b/plugins/git-cleanup.json index 9f993b8..e2f5aa5 100644 --- a/plugins/git-cleanup.json +++ b/plugins/git-cleanup.json @@ -13,7 +13,7 @@ }, "category": "development", "tags": [ - "skills" + "commands" ], "license": "MIT" } diff --git a/plugins/github-spec-kit.json b/plugins/github-spec-kit.json index 3c87537..febf143 100644 --- a/plugins/github-spec-kit.json +++ b/plugins/github-spec-kit.json @@ -13,7 +13,7 @@ }, "category": "development", "tags": [ - "skills" + "commands" ], "license": "MIT" } diff --git a/plugins/gt-sdlc.json b/plugins/gt-sdlc.json index 7d49b78..28bf5c7 100644 --- a/plugins/gt-sdlc.json +++ b/plugins/gt-sdlc.json @@ -13,7 +13,7 @@ }, "category": "development", "tags": [ - "skills" + "commands" ], "license": "MIT" } diff --git a/plugins/herald.json b/plugins/herald.json index f1c739c..cf31aee 100644 --- a/plugins/herald.json +++ b/plugins/herald.json @@ -13,7 +13,7 @@ }, "category": "development", "tags": [ - "skills" + "hooks" ], "license": "MIT" } diff --git a/plugins/insecure-defaults.json b/plugins/insecure-defaults.json index c946d30..f64b176 100644 --- a/plugins/insecure-defaults.json +++ b/plugins/insecure-defaults.json @@ -13,7 +13,7 @@ }, "category": "security", "tags": [ - "skills" + "commands" ], "license": "MIT" } diff --git a/plugins/learning-opportunities-auto.json b/plugins/learning-opportunities-auto.json index f6367e1..cc31608 100644 --- a/plugins/learning-opportunities-auto.json +++ b/plugins/learning-opportunities-auto.json @@ -13,7 +13,7 @@ }, "category": "productivity", "tags": [ - "skills" + "hooks" ], "license": "CC-BY-4.0" } diff --git a/plugins/mcp-toolkit.json b/plugins/mcp-toolkit.json index fc34a93..341cbca 100644 --- a/plugins/mcp-toolkit.json +++ b/plugins/mcp-toolkit.json @@ -13,7 +13,8 @@ }, "category": "development", "tags": [ - "skills" + "mcp-servers", + "commands" ], "license": "MIT" } diff --git a/plugins/meigen-ai-design.json b/plugins/meigen-ai-design.json index 4de512e..88efddc 100644 --- a/plugins/meigen-ai-design.json +++ b/plugins/meigen-ai-design.json @@ -13,7 +13,8 @@ }, "category": "design", "tags": [ - "skills" + "agents", + "commands" ], "license": "MIT" } diff --git a/plugins/metronome.json b/plugins/metronome.json index 95fadc2..77bfaf0 100644 --- a/plugins/metronome.json +++ b/plugins/metronome.json @@ -12,7 +12,7 @@ }, "category": "productivity", "tags": [ - "skills" + "hooks" ], "license": "MIT" } diff --git a/plugins/nothing-design-skill.json b/plugins/nothing-design-skill.json index 39801ec..8d33af4 100644 --- a/plugins/nothing-design-skill.json +++ b/plugins/nothing-design-skill.json @@ -1,8 +1,9 @@ { "name": "nothing-design-skill", "source": { - "source": "github", - "repo": "dominikmartn/nothing-design-skill" + "source": "git-subdir", + "url": "https://github.com/dominikmartn/nothing-design-skill.git", + "path": "nothing-design" }, "description": "UI generation skill in Nothing design language with dot matrix aesthetics", "version": "1.0.0", diff --git a/plugins/oh-my-paper.json b/plugins/oh-my-paper.json index 2246667..c574948 100644 --- a/plugins/oh-my-paper.json +++ b/plugins/oh-my-paper.json @@ -12,7 +12,6 @@ }, "category": "other", "tags": [ - "skills", "agents", "commands", "hooks" diff --git a/plugins/sdlc.json b/plugins/sdlc.json index 66e0c6e..2c0fd2b 100644 --- a/plugins/sdlc.json +++ b/plugins/sdlc.json @@ -13,7 +13,8 @@ }, "category": "productivity", "tags": [ - "skills" + "agents", + "commands" ], "license": "MIT" } diff --git a/plugins/seatbelt-sandboxer.json b/plugins/seatbelt-sandboxer.json deleted file mode 100644 index 6fecb5a..0000000 --- a/plugins/seatbelt-sandboxer.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "seatbelt-sandboxer", - "source": { - "source": "git-subdir", - "url": "https://github.com/trailofbits/skills.git", - "path": "plugins/seatbelt-sandboxer" - }, - "description": "Generate minimal macOS Seatbelt sandbox configurations for applications", - "version": "1.0.0", - "author": { - "username": "trailofbits", - "name": "Spencer Michaels" - }, - "category": "development", - "tags": [ - "skills" - ], - "license": "MIT" -} diff --git a/plugins/skill-improver.json b/plugins/skill-improver.json deleted file mode 100644 index d646c84..0000000 --- a/plugins/skill-improver.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "skill-improver", - "source": { - "source": "git-subdir", - "url": "https://github.com/trailofbits/skills.git", - "path": "plugins/skill-improver" - }, - "description": "Automatically reviews and fixes Claude Code skills through iterative refinement until they meet quality standards. Requires plugin-dev plugin.", - "version": "1.0.1", - "author": { - "username": "trailofbits", - "name": "Pawe\u0142 P\u0142atek" - }, - "category": "development", - "tags": [ - "skills" - ], - "license": "MIT" -} diff --git a/plugins/understand-anything.json b/plugins/understand-anything.json index 429bf7c..a882455 100644 --- a/plugins/understand-anything.json +++ b/plugins/understand-anything.json @@ -1,8 +1,9 @@ { "name": "understand-anything", "source": { - "source": "github", - "repo": "Lum1104/Understand-Anything" + "source": "git-subdir", + "url": "https://github.com/Lum1104/Understand-Anything.git", + "path": "understand-anything-plugin" }, "description": "Skills that turn any codebase into an interactive knowledge graph", "version": "1.0.0", diff --git a/plugins/workflow-skill-design.json b/plugins/workflow-skill-design.json deleted file mode 100644 index a043b47..0000000 --- a/plugins/workflow-skill-design.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "workflow-skill-design", - "source": { - "source": "git-subdir", - "url": "https://github.com/trailofbits/skills.git", - "path": "plugins/workflow-skill-design" - }, - "description": "Teaches design patterns for workflow-based Claude Code skills and provides a review agent for auditing existing skills", - "version": "1.0.1", - "author": { - "username": "trailofbits", - "name": "Benjamin Samuels" - }, - "category": "security", - "tags": [ - "skills" - ], - "license": "MIT" -} diff --git a/plugins/wshobson-agent-orchestration.json b/plugins/wshobson-agent-orchestration.json index 7064395..b14cfc7 100644 --- a/plugins/wshobson-agent-orchestration.json +++ b/plugins/wshobson-agent-orchestration.json @@ -13,7 +13,8 @@ }, "category": "data", "tags": [ - "skills" + "agents", + "commands" ], "license": "MIT" } diff --git a/plugins/wshobson-api-testing-observability.json b/plugins/wshobson-api-testing-observability.json index 2d6f890..16659a0 100644 --- a/plugins/wshobson-api-testing-observability.json +++ b/plugins/wshobson-api-testing-observability.json @@ -13,7 +13,8 @@ }, "category": "development", "tags": [ - "skills" + "agents", + "commands" ], "license": "MIT" } diff --git a/plugins/wshobson-application-performance.json b/plugins/wshobson-application-performance.json index 5c9bb10..7229ff8 100644 --- a/plugins/wshobson-application-performance.json +++ b/plugins/wshobson-application-performance.json @@ -13,7 +13,8 @@ }, "category": "development", "tags": [ - "skills" + "agents", + "commands" ], "license": "MIT" } diff --git a/plugins/wshobson-arm-cortex-microcontrollers.json b/plugins/wshobson-arm-cortex-microcontrollers.json index 4532614..b13231e 100644 --- a/plugins/wshobson-arm-cortex-microcontrollers.json +++ b/plugins/wshobson-arm-cortex-microcontrollers.json @@ -13,7 +13,7 @@ }, "category": "development", "tags": [ - "skills" + "agents" ], "license": "MIT" } diff --git a/plugins/wshobson-backend-api-security.json b/plugins/wshobson-backend-api-security.json index 595e8dc..6a6fbac 100644 --- a/plugins/wshobson-backend-api-security.json +++ b/plugins/wshobson-backend-api-security.json @@ -13,7 +13,7 @@ }, "category": "security", "tags": [ - "skills" + "agents" ], "license": "MIT" } diff --git a/plugins/wshobson-code-documentation.json b/plugins/wshobson-code-documentation.json index b97e9bc..4684fc1 100644 --- a/plugins/wshobson-code-documentation.json +++ b/plugins/wshobson-code-documentation.json @@ -13,7 +13,8 @@ }, "category": "documentation", "tags": [ - "skills" + "agents", + "commands" ], "license": "MIT" } diff --git a/plugins/wshobson-code-refactoring.json b/plugins/wshobson-code-refactoring.json index 6df19dc..2facb3d 100644 --- a/plugins/wshobson-code-refactoring.json +++ b/plugins/wshobson-code-refactoring.json @@ -13,7 +13,8 @@ }, "category": "development", "tags": [ - "skills" + "agents", + "commands" ], "license": "MIT" } diff --git a/plugins/wshobson-codebase-cleanup.json b/plugins/wshobson-codebase-cleanup.json index 461180e..d9d8953 100644 --- a/plugins/wshobson-codebase-cleanup.json +++ b/plugins/wshobson-codebase-cleanup.json @@ -13,7 +13,8 @@ }, "category": "development", "tags": [ - "skills" + "agents", + "commands" ], "license": "MIT" } diff --git a/plugins/wshobson-comprehensive-review.json b/plugins/wshobson-comprehensive-review.json index e3a6427..0cc35c2 100644 --- a/plugins/wshobson-comprehensive-review.json +++ b/plugins/wshobson-comprehensive-review.json @@ -13,7 +13,8 @@ }, "category": "testing", "tags": [ - "skills" + "agents", + "commands" ], "license": "MIT" } diff --git a/plugins/wshobson-content-marketing.json b/plugins/wshobson-content-marketing.json index 132aac6..0f77164 100644 --- a/plugins/wshobson-content-marketing.json +++ b/plugins/wshobson-content-marketing.json @@ -13,7 +13,7 @@ }, "category": "productivity", "tags": [ - "skills" + "agents" ], "license": "MIT" } diff --git a/plugins/wshobson-context-management.json b/plugins/wshobson-context-management.json index 3a5b802..e01522f 100644 --- a/plugins/wshobson-context-management.json +++ b/plugins/wshobson-context-management.json @@ -13,7 +13,8 @@ }, "category": "data", "tags": [ - "skills" + "agents", + "commands" ], "license": "MIT" } diff --git a/plugins/wshobson-customer-sales-automation.json b/plugins/wshobson-customer-sales-automation.json index ce31b08..dd12b42 100644 --- a/plugins/wshobson-customer-sales-automation.json +++ b/plugins/wshobson-customer-sales-automation.json @@ -13,7 +13,7 @@ }, "category": "productivity", "tags": [ - "skills" + "agents" ], "license": "MIT" } diff --git a/plugins/wshobson-data-validation-suite.json b/plugins/wshobson-data-validation-suite.json index 031d08a..1b83a0f 100644 --- a/plugins/wshobson-data-validation-suite.json +++ b/plugins/wshobson-data-validation-suite.json @@ -13,7 +13,7 @@ }, "category": "data", "tags": [ - "skills" + "agents" ], "license": "MIT" } diff --git a/plugins/wshobson-database-cloud-optimization.json b/plugins/wshobson-database-cloud-optimization.json index 12562ba..d86f936 100644 --- a/plugins/wshobson-database-cloud-optimization.json +++ b/plugins/wshobson-database-cloud-optimization.json @@ -13,7 +13,8 @@ }, "category": "development", "tags": [ - "skills" + "agents", + "commands" ], "license": "MIT" } diff --git a/plugins/wshobson-database-migrations.json b/plugins/wshobson-database-migrations.json index 5df53a1..f1354ab 100644 --- a/plugins/wshobson-database-migrations.json +++ b/plugins/wshobson-database-migrations.json @@ -13,7 +13,8 @@ }, "category": "data", "tags": [ - "skills" + "agents", + "commands" ], "license": "MIT" } diff --git a/plugins/wshobson-debugging-toolkit.json b/plugins/wshobson-debugging-toolkit.json index d61fea3..7942281 100644 --- a/plugins/wshobson-debugging-toolkit.json +++ b/plugins/wshobson-debugging-toolkit.json @@ -13,7 +13,8 @@ }, "category": "development", "tags": [ - "skills" + "agents", + "commands" ], "license": "MIT" } diff --git a/plugins/wshobson-dependency-management.json b/plugins/wshobson-dependency-management.json index dcf0d2b..cd859f7 100644 --- a/plugins/wshobson-dependency-management.json +++ b/plugins/wshobson-dependency-management.json @@ -13,7 +13,8 @@ }, "category": "development", "tags": [ - "skills" + "agents", + "commands" ], "license": "MIT" } diff --git a/plugins/wshobson-deployment-strategies.json b/plugins/wshobson-deployment-strategies.json index 408db95..851fe73 100644 --- a/plugins/wshobson-deployment-strategies.json +++ b/plugins/wshobson-deployment-strategies.json @@ -13,7 +13,7 @@ }, "category": "devops", "tags": [ - "skills" + "agents" ], "license": "MIT" } diff --git a/plugins/wshobson-deployment-validation.json b/plugins/wshobson-deployment-validation.json index 90a2985..b6b6ef5 100644 --- a/plugins/wshobson-deployment-validation.json +++ b/plugins/wshobson-deployment-validation.json @@ -13,7 +13,8 @@ }, "category": "devops", "tags": [ - "skills" + "agents", + "commands" ], "license": "MIT" } diff --git a/plugins/wshobson-distributed-debugging.json b/plugins/wshobson-distributed-debugging.json index 06684ab..9930f08 100644 --- a/plugins/wshobson-distributed-debugging.json +++ b/plugins/wshobson-distributed-debugging.json @@ -13,7 +13,8 @@ }, "category": "productivity", "tags": [ - "skills" + "agents", + "commands" ], "license": "MIT" } diff --git a/plugins/wshobson-error-debugging.json b/plugins/wshobson-error-debugging.json index f24cbf3..14d224d 100644 --- a/plugins/wshobson-error-debugging.json +++ b/plugins/wshobson-error-debugging.json @@ -13,7 +13,8 @@ }, "category": "development", "tags": [ - "skills" + "agents", + "commands" ], "license": "MIT" } diff --git a/plugins/wshobson-error-diagnostics.json b/plugins/wshobson-error-diagnostics.json index d1bbd13..8b43009 100644 --- a/plugins/wshobson-error-diagnostics.json +++ b/plugins/wshobson-error-diagnostics.json @@ -13,7 +13,8 @@ }, "category": "productivity", "tags": [ - "skills" + "agents", + "commands" ], "license": "MIT" } diff --git a/plugins/wshobson-frontend-mobile-security.json b/plugins/wshobson-frontend-mobile-security.json index 53355d9..5165ea4 100644 --- a/plugins/wshobson-frontend-mobile-security.json +++ b/plugins/wshobson-frontend-mobile-security.json @@ -13,7 +13,8 @@ }, "category": "security", "tags": [ - "skills" + "agents", + "commands" ], "license": "MIT" } diff --git a/plugins/wshobson-full-stack-orchestration.json b/plugins/wshobson-full-stack-orchestration.json index cfaf8d9..82d9bef 100644 --- a/plugins/wshobson-full-stack-orchestration.json +++ b/plugins/wshobson-full-stack-orchestration.json @@ -13,7 +13,8 @@ }, "category": "productivity", "tags": [ - "skills" + "agents", + "commands" ], "license": "MIT" } diff --git a/plugins/wshobson-functional-programming.json b/plugins/wshobson-functional-programming.json index 5b6fd6c..a20a6a7 100644 --- a/plugins/wshobson-functional-programming.json +++ b/plugins/wshobson-functional-programming.json @@ -13,7 +13,7 @@ }, "category": "development", "tags": [ - "skills" + "agents" ], "license": "MIT" } diff --git a/plugins/wshobson-git-pr-workflows.json b/plugins/wshobson-git-pr-workflows.json index 15a5682..37446e0 100644 --- a/plugins/wshobson-git-pr-workflows.json +++ b/plugins/wshobson-git-pr-workflows.json @@ -13,7 +13,8 @@ }, "category": "productivity", "tags": [ - "skills" + "agents", + "commands" ], "license": "MIT" } diff --git a/plugins/wshobson-julia-development.json b/plugins/wshobson-julia-development.json index e9d9ffe..77069f4 100644 --- a/plugins/wshobson-julia-development.json +++ b/plugins/wshobson-julia-development.json @@ -13,7 +13,7 @@ }, "category": "development", "tags": [ - "skills" + "agents" ], "license": "MIT" } diff --git a/plugins/wshobson-jvm-languages.json b/plugins/wshobson-jvm-languages.json index e330cc6..1d4a623 100644 --- a/plugins/wshobson-jvm-languages.json +++ b/plugins/wshobson-jvm-languages.json @@ -13,7 +13,7 @@ }, "category": "development", "tags": [ - "skills" + "agents" ], "license": "MIT" } diff --git a/plugins/wshobson-multi-platform-apps.json b/plugins/wshobson-multi-platform-apps.json index 205bdba..6d602d8 100644 --- a/plugins/wshobson-multi-platform-apps.json +++ b/plugins/wshobson-multi-platform-apps.json @@ -13,7 +13,8 @@ }, "category": "development", "tags": [ - "skills" + "agents", + "commands" ], "license": "MIT" } diff --git a/plugins/wshobson-performance-testing-review.json b/plugins/wshobson-performance-testing-review.json index 58f4a6b..9825c70 100644 --- a/plugins/wshobson-performance-testing-review.json +++ b/plugins/wshobson-performance-testing-review.json @@ -13,7 +13,8 @@ }, "category": "testing", "tags": [ - "skills" + "agents", + "commands" ], "license": "MIT" } diff --git a/plugins/wshobson-security-compliance.json b/plugins/wshobson-security-compliance.json index 7607031..cbb86a2 100644 --- a/plugins/wshobson-security-compliance.json +++ b/plugins/wshobson-security-compliance.json @@ -13,7 +13,8 @@ }, "category": "security", "tags": [ - "skills" + "agents", + "commands" ], "license": "MIT" } diff --git a/plugins/wshobson-seo-analysis-monitoring.json b/plugins/wshobson-seo-analysis-monitoring.json index 05ec583..cfae615 100644 --- a/plugins/wshobson-seo-analysis-monitoring.json +++ b/plugins/wshobson-seo-analysis-monitoring.json @@ -13,7 +13,7 @@ }, "category": "productivity", "tags": [ - "skills" + "agents" ], "license": "MIT" } diff --git a/plugins/wshobson-seo-content-creation.json b/plugins/wshobson-seo-content-creation.json index b13a9ae..1937143 100644 --- a/plugins/wshobson-seo-content-creation.json +++ b/plugins/wshobson-seo-content-creation.json @@ -13,7 +13,7 @@ }, "category": "productivity", "tags": [ - "skills" + "agents" ], "license": "MIT" } diff --git a/plugins/wshobson-seo-technical-optimization.json b/plugins/wshobson-seo-technical-optimization.json index 7443660..d9727c9 100644 --- a/plugins/wshobson-seo-technical-optimization.json +++ b/plugins/wshobson-seo-technical-optimization.json @@ -13,7 +13,7 @@ }, "category": "productivity", "tags": [ - "skills" + "agents" ], "license": "MIT" } diff --git a/plugins/wshobson-tdd-workflows.json b/plugins/wshobson-tdd-workflows.json index d84270b..0c94990 100644 --- a/plugins/wshobson-tdd-workflows.json +++ b/plugins/wshobson-tdd-workflows.json @@ -13,7 +13,8 @@ }, "category": "productivity", "tags": [ - "skills" + "agents", + "commands" ], "license": "MIT" } diff --git a/plugins/wshobson-team-collaboration.json b/plugins/wshobson-team-collaboration.json index 3aaefa5..3b9423a 100644 --- a/plugins/wshobson-team-collaboration.json +++ b/plugins/wshobson-team-collaboration.json @@ -13,7 +13,8 @@ }, "category": "development", "tags": [ - "skills" + "agents", + "commands" ], "license": "MIT" } diff --git a/plugins/wshobson-unit-testing.json b/plugins/wshobson-unit-testing.json index 276ae30..f666338 100644 --- a/plugins/wshobson-unit-testing.json +++ b/plugins/wshobson-unit-testing.json @@ -13,7 +13,8 @@ }, "category": "testing", "tags": [ - "skills" + "agents", + "commands" ], "license": "MIT" } diff --git a/plugins/wshobson-web-scripting.json b/plugins/wshobson-web-scripting.json index 5834f42..f687347 100644 --- a/plugins/wshobson-web-scripting.json +++ b/plugins/wshobson-web-scripting.json @@ -13,7 +13,7 @@ }, "category": "development", "tags": [ - "skills" + "agents" ], "license": "MIT" } diff --git a/scripts/audit-plugins.js b/scripts/audit-plugins.js index 6ee8bd6..5bd9585 100644 --- a/scripts/audit-plugins.js +++ b/scripts/audit-plugins.js @@ -2,6 +2,12 @@ // Check every plugin source for accessibility and open/update a GitHub issue // listing any that return 404 or are otherwise unreachable. Designed to run // weekly in CI so stale plugins are caught before users notice. +// +// For plugins on GitHub it also reads the repo tree and flags two kinds of +// drift: a git-subdir `path` that no longer exists, and a `skills` tag on a +// plugin that ships no SKILL.md where Claude Code looks for one. Apps that +// install skills from the catalogue filter on that tag, so a wrong one shows +// users plugins they cannot install anything from. import { readFileSync, readdirSync } from "node:fs"; import { resolve, dirname } from "node:path"; @@ -54,6 +60,66 @@ async function checkGitHub(repo) { return { ok: true, archived: Boolean(data.archived) }; } +/** Every path in the repo at `at`, or null when the tree is too big to list. */ +async function readTree(repo, at) { + const res = await fetch( + `https://api.github.com/repos/${repo}/git/trees/${encodeURIComponent(at)}?recursive=1`, + { headers: ghHeaders }, + ); + if (!res.ok) return { ok: false, reason: `tree at ${at}: HTTP ${res.status}` }; + const data = await res.json(); + if (data.truncated) return { ok: true, tree: null }; + return { ok: true, tree: data.tree }; +} + +async function readBlob(repo, sha) { + const res = await fetch(`https://api.github.com/repos/${repo}/git/blobs/${sha}`, { + headers: ghHeaders, + }); + if (!res.ok) return null; + const data = await res.json(); + return Buffer.from(data.content, "base64").toString("utf-8"); +} + +const clean = (path) => (path || "").trim().replace(/^(\.\/)+/, "").replace(/^\/+|\/+$/g, ""); + +/** + * Whether the plugin at `root` ships a skill, the way Claude Code finds one: + * each place the manifest's `skills` field names, or `skills/` when it names + * none, is either a skill folder itself or holds `/SKILL.md`. A lone + * SKILL.md at the plugin root also counts. + */ +async function hasSkills(repo, tree, root) { + const prefix = root ? `${root}/` : ""; + const files = new Set( + tree.filter((e) => e.type === "blob" && e.path.startsWith(prefix)).map((e) => e.path.slice(prefix.length)), + ); + + let places = ["skills"]; + const manifest = tree.find((e) => e.path === `${prefix}.claude-plugin/plugin.json`); + if (manifest) { + try { + const declared = JSON.parse((await readBlob(repo, manifest.sha)) ?? "{}").skills; + const list = typeof declared === "string" ? [declared] : Array.isArray(declared) ? declared : []; + const paths = list.filter((p) => typeof p === "string").map(clean); + if (paths.length > 0) places = paths; + } catch { + // An unreadable manifest is Claude Code's problem to report; fall back to the default. + } + } + + for (const place of places) { + const at = place ? `${place}/` : ""; + if (files.has(`${at}SKILL.md`)) return true; + for (const file of files) { + if (!file.startsWith(at)) continue; + const rest = file.slice(at.length).split("/"); + if (rest.length === 2 && rest[1] === "SKILL.md") return true; + } + } + return files.has("SKILL.md"); +} + async function checkNpm(pkg) { const res = await fetch( `https://registry.npmjs.org/${encodeURIComponent(pkg)}`, @@ -66,6 +132,7 @@ async function checkNpm(pkg) { const failures = []; const archived = []; +const mistagged = []; for (const plugin of plugins) { const { file, name, source } = plugin; @@ -81,6 +148,20 @@ for (const plugin of plugins) { continue; } result = await checkGitHub(repo); + if (result.ok) { + const at = source.sha || source.ref || "HEAD"; + const read = await readTree(repo, at); + const root = source.source === "git-subdir" ? clean(source.path) : ""; + if (!read.ok) { + result = { ok: false, reason: read.reason }; + } else if (read.tree) { + if (root && !read.tree.some((e) => e.path.startsWith(`${root}/`))) { + result = { ok: false, reason: `folder \`${root}\` not found in ${repo}` }; + } else if (plugin.tags?.includes("skills") && !(await hasSkills(repo, read.tree, root))) { + mistagged.push({ file, name }); + } + } + } } } catch (e) { result = { ok: false, reason: e.message }; @@ -94,10 +175,12 @@ for (const plugin of plugins) { } console.log( - `Audited ${plugins.length} plugins — ${failures.length} unreachable, ${archived.length} archived`, + `Audited ${plugins.length} plugins — ${failures.length} unreachable, ${archived.length} archived, ${mistagged.length} mistagged`, ); +for (const { file, reason } of failures) console.log(` unreachable ${file}: ${reason}`); +for (const { file } of mistagged) console.log(` mistagged ${file}: tagged skills, ships none`); -if (failures.length === 0 && archived.length === 0) { +if (failures.length === 0 && archived.length === 0 && mistagged.length === 0) { console.log("All plugins OK."); process.exit(0); } @@ -115,6 +198,15 @@ if (failures.length > 0) { body += "\n"; } +if (mistagged.length > 0) { + body += `### Tagged \`skills\` but ship none (${mistagged.length})\n\n`; + body += `No SKILL.md where Claude Code looks for one (\`skills//SKILL.md\`, or the paths in the manifest's \`skills\` field). Drop the \`skills\` tag or point the source at the right folder:\n\n`; + for (const { file, name } of mistagged) { + body += `- [ ] \`${file}\` (**${name}**)\n`; + } + body += "\n"; +} + if (archived.length > 0) { body += `### Archived repos (${archived.length})\n\n`; body += `These plugins still exist but their source repo is archived. No action required unless you want to remove them.\n\n`; @@ -126,7 +218,7 @@ if (archived.length > 0) { body += `_Generated by the [weekly plugin audit](../../actions/workflows/plugin-audit.yml)._`; -const issueTitle = `Plugin audit (${date}): ${failures.length} unreachable`; +const issueTitle = `Plugin audit (${date}): ${failures.length} unreachable, ${mistagged.length} mistagged`; // Create or update the open audit issue if (GH_REPO) {