diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index d6f412e..4f60f97 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -1,7 +1,7 @@ { "name": "kit", "description": "Community plugin & skills marketplace for Claude Code", - "version": "1.4.0", + "version": "1.4.1", "owner": { "name": "hamsurang", "email": "zlemzlem5656@naver.com" diff --git a/.github/ISSUE_TEMPLATE/plugin-submission.md b/.github/ISSUE_TEMPLATE/plugin-submission.md index 806387b..cd19d39 100644 --- a/.github/ISSUE_TEMPLATE/plugin-submission.md +++ b/.github/ISSUE_TEMPLATE/plugin-submission.md @@ -11,9 +11,6 @@ assignees: '' **Plugin name** (kebab-case): -**Category**: - - **Description** (one sentence): @@ -37,6 +34,7 @@ claude plugin install YOUR_PLUGIN_NAME@hamsurang/kit - [ ] I have tested this plugin locally - [ ] `plugin.json` has all required fields +- [ ] Markdown frontmatter has required fields (`commands`: `description`, `skills`/`agents`: `name`, `description`) - [ ] `README.md` is present with usage examples - [ ] No secrets or credentials are hardcoded - [ ] The plugin follows [PLUGIN_SPEC.md](../../docs/contributors/plugin-spec.md) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index a6be921..ded0d29 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,9 +1,9 @@ ## Plugin Submission Checklist - [ ] Plugin name is unique and kebab-case (lowercase, hyphens only) -- [ ] `.claude-plugin/plugin.json` has all required fields: `name`, `version`, `description`, `author`, `category`, `license` +- [ ] `.claude-plugin/plugin.json` has all required fields: `name`, `version`, `description`, `author`, `license` - [ ] `README.md` is present and explains what the plugin does -- [ ] Frontmatter in command/skill/agent `.md` files is valid YAML +- [ ] Frontmatter has required fields (`commands`: `description`, `skills`/`agents`: `name`, `description`) - [ ] No hardcoded secrets or credentials in any file - [ ] Version follows semantic versioning (e.g. `1.0.0`) - [ ] MCP server URLs use HTTPS (if applicable) diff --git a/.github/scripts/validate-plugin.js b/.github/scripts/validate-plugin.js index 913f45f..dc04fec 100644 --- a/.github/scripts/validate-plugin.js +++ b/.github/scripts/validate-plugin.js @@ -41,16 +41,6 @@ if (!manifest.author) { } } -// Category validation -const validCategories = [ - 'productivity', 'git', 'code-quality', 'documentation', - 'ai-agents', 'integrations', 'learning', 'security', 'devops', 'data' -]; -if (manifest.category && !validCategories.includes(manifest.category)) { - console.error('Invalid category: ' + manifest.category + '. Must be one of: ' + validCategories.join(', ')); - failed = true; -} - // Name format: kebab-case only const nameRegex = /^[a-z0-9-]+$/; if (manifest.name && !nameRegex.test(manifest.name)) { diff --git a/.github/workflows/validate-plugin.yml b/.github/workflows/validate-plugin.yml index cc4ccc5..76b7ad2 100644 --- a/.github/workflows/validate-plugin.yml +++ b/.github/workflows/validate-plugin.yml @@ -123,6 +123,7 @@ jobs: for md_file in $MD_FILES; do [ -f "$md_file" ] || continue echo "Checking frontmatter in $md_file..." + FILE_FAILED=0 # Check file starts with --- if ! head -1 "$md_file" | grep -q '^---$'; then @@ -138,12 +139,25 @@ jobs: continue fi - # Extract frontmatter and check for description field + # Extract frontmatter and check required fields by file type FRONTMATTER=$(awk '/^---$/{if(++c==2)exit} c==1' "$md_file") if ! printf "%s" "$FRONTMATTER" | grep -qE '^description:'; then echo "::error file=$md_file::Frontmatter missing required field: description" FAILED=1 - else + FILE_FAILED=1 + fi + + case "$md_file" in + plugins/*/skills/*/SKILL.md|plugins/*/agents/*.md) + if ! printf "%s" "$FRONTMATTER" | grep -qE '^name:'; then + echo "::error file=$md_file::Frontmatter missing required field: name" + FAILED=1 + FILE_FAILED=1 + fi + ;; + esac + + if [ "$FILE_FAILED" -eq 0 ]; then echo "OK: $md_file" fi done diff --git a/README.ko.md b/README.ko.md index 3c82d5a..86065fd 100644 --- a/README.ko.md +++ b/README.ko.md @@ -75,9 +75,13 @@ bash scripts/scaffold-plugin.sh ## 플러그인 & 스킬 목록 -| 플러그인 | 카테고리 | 설명 | 작성자 | -|---------|---------|------|--------| -| [vitest](./plugins/vitest) | code-quality | Vitest 테스트 작성·디버깅·설정을 위한 자동 활성화 스킬 | [hamsurang](https://github.com/hamsurang) | +| 플러그인 | 설명 | 작성자 | +| --------- | ------ | -------- | +| [vitest](./plugins/vitest) | Vite 기반 프로젝트에서 Vitest 테스트 작성, 디버깅, 설정을 지원하는 자동 활성화 스킬 | [minsoo.web](https://github.com/minsoo-web) | +| [skill-review](./plugins/skill-review) | SKILL.md를 베스트 프랙티스 기준으로 리뷰하고 pass/fail 리포트를 생성하는 슬래시 커맨드 스킬 | [minsoo.web](https://github.com/minsoo-web) | +| [gh-cli](./plugins/gh-cli) | gh CLI로 GitHub 작업을 수행할 때 자동으로 활성화되는 스킬 | [minsoo.web](https://github.com/minsoo-web) | +| [personal-tutor](./plugins/personal-tutor) | 세션 간 학습자 프로필과 지식 그래프를 유지하는 적응형 기술 튜터링 스킬 | [minsoo.web](https://github.com/minsoo-web) | +| [deepwiki-cli](./plugins/deepwiki-cli) | MCP 토큰 오버헤드 없이 DeepWiki CLI로 GitHub 저장소 위키를 조회하는 스킬 | [minsoo.web](https://github.com/minsoo-web) | *플러그인을 기여하고 싶으신가요? [기여 방법](docs/contributors/contributing.md)을 확인하세요.* diff --git a/README.md b/README.md index d7ab2e6..54f718f 100644 --- a/README.md +++ b/README.md @@ -75,9 +75,13 @@ bash scripts/scaffold-plugin.sh ## Plugin & Skills Directory -| Plugin | Category | Description | Author | -|--------|----------|-------------|--------| -| [vitest](./plugins/vitest) | code-quality | Auto-invoked skill for writing, debugging, and configuring Vitest tests | [hamsurang](https://github.com/hamsurang) | +| Plugin | Description | Author | +| -------- | ----------- | -------- | +| [vitest](./plugins/vitest) | Auto-invoked skill for writing, debugging, and configuring Vitest tests in Vite-based projects | [minsoo.web](https://github.com/minsoo-web) | +| [skill-review](./plugins/skill-review) | Slash-command skill that reviews any SKILL.md against best practices and outputs a structured pass/fail report | [minsoo.web](https://github.com/minsoo-web) | +| [gh-cli](./plugins/gh-cli) | Auto-invoked skill for working with GitHub from the command line using the gh CLI tool | [minsoo.web](https://github.com/minsoo-web) | +| [personal-tutor](./plugins/personal-tutor) | Adaptive technical tutoring skill that builds a persistent knowledge graph and learner profile across sessions | [minsoo.web](https://github.com/minsoo-web) | +| [deepwiki-cli](./plugins/deepwiki-cli) | Query GitHub repository wikis via DeepWiki CLI without MCP token overhead. | [minsoo.web](https://github.com/minsoo-web) | *Have a plugin to share? See [Contributing](docs/contributors/contributing.md).* diff --git a/docs/contributors/categories.md b/docs/contributors/categories.md deleted file mode 100644 index a716b69..0000000 --- a/docs/contributors/categories.md +++ /dev/null @@ -1,102 +0,0 @@ -# Plugin Categories - -kit organizes plugins into 10 categories. Choose the category that best describes your plugin's primary purpose. - -## Category Reference - -### `productivity` -**Workflow automation, time-saving commands** - -Tools that help developers work faster by automating repetitive tasks, organizing workflows, or providing shortcuts. - -*Examples:* task runners, clipboard managers, snippet inserters, project scaffolders - ---- - -### `git` -**Version control, commit, PR, and branch management** - -Plugins focused on Git workflows — from commit message generation to PR review automation. - -*Examples:* conventional commit helpers, PR description generators, branch cleanup tools, git log analyzers - ---- - -### `code-quality` -**Linting, review, refactoring, testing aids** - -Tools that help maintain high code quality through automated review, refactoring suggestions, and testing support. - -*Examples:* code reviewers, complexity analyzers, refactoring assistants, test generators - ---- - -### `documentation` -**Docs generation, README helpers, comment writers** - -Plugins that assist with creating and maintaining documentation, README files, inline comments, and API docs. - -*Examples:* JSDoc generators, README templates, changelog writers, API documentation tools - ---- - -### `ai-agents` -**Multi-agent orchestration and agent definitions** - -Plugins providing specialized AI agent definitions, orchestration patterns, or multi-agent workflows for Claude Code. - -*Examples:* custom agent definitions, orchestration frameworks, specialized reasoning agents - ---- - -### `integrations` -**Third-party service and API connectors (via MCP)** - -Plugins that connect Claude Code to external services and APIs via the Model Context Protocol (MCP). - -*Examples:* GitHub connector, Jira integration, Slack messenger, database query tools - ---- - -### `learning` -**Tutorials, onboarding, knowledge transfer** - -Plugins designed to teach, onboard, or help users understand codebases, technologies, or workflows. - -*Examples:* codebase explainers, language tutors, onboarding guides, documentation walkthroughs - ---- - -### `security` -**Security review, secrets scanning, audit tools** - -Tools focused on identifying security vulnerabilities, scanning for exposed secrets, and auditing code safety. - -*Examples:* OWASP scanners, secrets detectors, dependency auditors, permission analyzers - ---- - -### `devops` -**CI/CD, deployment, infrastructure tooling** - -Plugins that assist with continuous integration, deployment pipelines, and infrastructure management. - -*Examples:* deployment assistants, CI config generators, Dockerfile writers, Kubernetes helpers - ---- - -### `data` -**Data analysis, transformation, visualization** - -Tools for working with data — querying, transforming, analyzing, and visualizing datasets. - -*Examples:* SQL query builders, CSV analyzers, data pipeline helpers, chart generators - ---- - -## Choosing a Category - -- Pick the **single best category** — plugins should have one primary category -- If your plugin fits multiple categories, pick the most prominent one -- Use `keywords` in `plugin.json` for secondary topics (see [plugin-spec.md](./plugin-spec.md)) -- When in doubt, use `productivity` diff --git a/docs/contributors/contributing.md b/docs/contributors/contributing.md index 06dcd89..c352d56 100644 --- a/docs/contributors/contributing.md +++ b/docs/contributors/contributing.md @@ -54,10 +54,10 @@ Your PR will be automatically validated by CI and reviewed by a maintainer withi Before submitting, verify all items: -- [ ] `plugin.json` has all required fields: `name`, `version`, `description`, `author`, `category`, `license` +- [ ] `plugin.json` has all required fields: `name`, `version`, `description`, `author`, `license` - [ ] Plugin name is unique and kebab-case (no spaces, lowercase) - [ ] `README.md` is present and explains what the plugin does -- [ ] Markdown files have valid YAML frontmatter (no syntax errors) +- [ ] Markdown frontmatter has required fields (`commands`: `description`, `skills`/`agents`: `name`, `description`) - [ ] No hardcoded secrets or credentials in any file - [ ] MCP server URLs use HTTPS (except `localhost` / `127.0.0.1`) - [ ] License is declared and compatible with open source distribution diff --git a/docs/contributors/plugin-spec.md b/docs/contributors/plugin-spec.md index e2c74f2..fb545f7 100644 --- a/docs/contributors/plugin-spec.md +++ b/docs/contributors/plugin-spec.md @@ -34,7 +34,6 @@ The manifest lives at `.claude-plugin/plugin.json` inside the plugin directory. | `description` | string | One clear sentence describing what the plugin does. Max 200 chars. | | `author.name` | string | Human-readable author name. | | `author.github` | string | GitHub username for attribution and contact. | -| `category` | string | One of the defined category slugs. See [categories.md](./categories.md). | | `license` | string | SPDX license identifier (e.g. `MIT`, `Apache-2.0`). | ### Optional Fields @@ -58,7 +57,6 @@ The manifest lives at `.claude-plugin/plugin.json` inside the plugin directory. "name": "Your Name", "github": "your-github-username" }, - "category": "productivity", "license": "MIT", "keywords": ["automation", "workflow"], "repository": "https://github.com/you/my-plugin", @@ -81,6 +79,8 @@ model: sonnet # Optional: haiku, sonnet, opus --- ``` +`commands/*.md` frontmatter requires only `description`. + ### Body The body is the command's prompt template. Use `$ARGUMENTS` to reference user-provided arguments. @@ -116,11 +116,11 @@ Skills are automatically invoked by Claude when the conversation context matches name: skill-name # Required: unique identifier description: > # Required: trigger conditions (used by Claude to decide when to activate) This skill should be used when... -version: 1.0.0 # Required: semantic version -license: MIT # Required: SPDX identifier --- ``` +`skills/*/SKILL.md` frontmatter requires both `name` and `description`. + The `description` field is critical — it's what Claude reads to decide whether to activate this skill. Write it as trigger scenarios starting with "This skill should be used when...". ### Example: `skills/code-explainer/SKILL.md` @@ -132,8 +132,6 @@ description: > This skill should be used when the user asks to "explain this code", "what does this do", "help me understand", or asks questions about how a specific piece of code works. -version: 1.0.0 -license: MIT --- # Code Explainer @@ -164,6 +162,8 @@ description: > # Required: when/how to invoke this agent --- ``` +`agents/*.md` frontmatter requires both `name` and `description`. + ### Example: `agents/reviewer.md` ```markdown diff --git a/docs/index.md b/docs/index.md index 626bae8..a8e3e24 100644 --- a/docs/index.md +++ b/docs/index.md @@ -8,4 +8,3 @@ - [Contributing Guide](./contributors/contributing.md) — How to submit a plugin - [Plugin Spec](./contributors/plugin-spec.md) — Plugin format reference -- [Categories](./contributors/categories.md) — Category taxonomy diff --git a/plugins/gh-cli/.claude-plugin/plugin.json b/plugins/gh-cli/.claude-plugin/plugin.json index 9405c92..eb7398b 100644 --- a/plugins/gh-cli/.claude-plugin/plugin.json +++ b/plugins/gh-cli/.claude-plugin/plugin.json @@ -6,7 +6,6 @@ "name": "minsoo.web", "github": "minsoo-web" }, - "category": "git", "license": "MIT", "keywords": ["github", "gh", "cli", "pull-request", "issues"], "skills": "./skills/" diff --git a/plugins/skill-review/.claude-plugin/plugin.json b/plugins/skill-review/.claude-plugin/plugin.json index d59d6c6..4e8f8cc 100644 --- a/plugins/skill-review/.claude-plugin/plugin.json +++ b/plugins/skill-review/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "skill-review", - "version": "1.0.1", + "version": "1.0.2", "description": "Slash-command skill that reviews any SKILL.md against best practices and outputs a structured pass/fail report", "author": { "name": "minsoo.web", diff --git a/plugins/skill-review/skills/skill-review/SKILL.md b/plugins/skill-review/skills/skill-review/SKILL.md index 2bbd5c0..5ac7eca 100644 --- a/plugins/skill-review/skills/skill-review/SKILL.md +++ b/plugins/skill-review/skills/skill-review/SKILL.md @@ -11,6 +11,14 @@ description: > Reviews a `SKILL.md` against established best practices and outputs a structured pass/fail report with prioritized recommendations. +## Contents + +- [Locating the Target Skill](#locating-the-target-skill) +- [Review Workflow](#review-workflow) +- [Output Format](#output-format) +- [Severity Definitions](#severity-definitions) +- [Full Rubric](#full-rubric) + ## Locating the Target Skill **With explicit path:** Use the provided path directly (supports both `SKILL.md` files and plugin directories). diff --git a/plugins/skill-review/skills/skill-review/references/checklist.md b/plugins/skill-review/skills/skill-review/references/checklist.md index 32caae8..ec77dda 100644 --- a/plugins/skill-review/skills/skill-review/references/checklist.md +++ b/plugins/skill-review/skills/skill-review/references/checklist.md @@ -103,7 +103,6 @@ Only applies if the skill is part of a plugin (includes `plugin.json`). | `plugin.json` has `version` field (semver) | ❌ Error | Required for update management | | `plugin.json` has `description` field | ❌ Error | Required for marketplace display | | `plugin.json` has `author` field | ⚠️ Warning | Strongly recommended for attribution and support | -| `plugin.json` has `category` field | ⚠️ Warning | Required for marketplace categorization | --- diff --git a/plugins/vitest/.claude-plugin/plugin.json b/plugins/vitest/.claude-plugin/plugin.json index 9b38620..fc1b0e5 100644 --- a/plugins/vitest/.claude-plugin/plugin.json +++ b/plugins/vitest/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "vitest", - "version": "1.0.1", + "version": "1.0.2", "description": "Auto-invoked skill for writing, debugging, and configuring Vitest tests in Vite-based projects", "author": { "name": "minsoo.web", diff --git a/plugins/vitest/skills/vitest/SKILL.md b/plugins/vitest/skills/vitest/SKILL.md index e83ed03..9eb986c 100644 --- a/plugins/vitest/skills/vitest/SKILL.md +++ b/plugins/vitest/skills/vitest/SKILL.md @@ -1,18 +1,21 @@ --- name: vitest description: > - This skill should be used when the user asks to write, run, or debug tests using Vitest, + Use when the user asks to write, run, or debug tests using Vitest, asks about vitest.config.ts or vite.config.ts test configuration, asks how to mock modules, functions, timers, or globals with the `vi` utility, asks about test coverage setup or thresholds, references Vitest API (describe, it, test, expect, beforeEach, afterAll, etc.), or encounters failing Vitest tests and needs help diagnosing them. -version: 1.0.0 -license: MIT --- # Vitest Skill -Vitest is a blazing-fast unit test framework built on top of Vite. It shares the same config, transforms, and module resolution as your Vite project, giving you zero-config testing for most setups. +## Contents + +- [Quick Start](#quick-start) +- [When This Skill Activates](#when-this-skill-activates) +- [Behavior Guidelines](#behavior-guidelines) +- [References Loading Guide](#references-loading-guide) ## Quick Start diff --git a/scripts/scaffold-plugin.sh b/scripts/scaffold-plugin.sh index f48911f..edb1f19 100755 --- a/scripts/scaffold-plugin.sh +++ b/scripts/scaffold-plugin.sh @@ -178,40 +178,6 @@ while true; do break done -# Category (selected from fixed list — no injection possible) -printf "\nCategories:\n" -CATEGORIES=("productivity" "git" "code-quality" "documentation" "ai-agents" "integrations" "learning" "security" "devops" "data") -CATEGORY_DESCS=( - "Workflow automation, time-saving commands" - "Version control, commit, PR, and branch management" - "Linting, review, refactoring, testing aids" - "Docs generation, README helpers, comment writers" - "Multi-agent orchestration and agent definitions" - "Third-party service and API connectors (via MCP)" - "Tutorials, onboarding, knowledge transfer" - "Security review, secrets scanning, audit tools" - "CI/CD, deployment, infrastructure tooling" - "Data analysis, transformation, visualization" -) -for i in "${!CATEGORIES[@]}"; do - printf " %2d) %-18s %s\n" "$((i+1))" "${CATEGORIES[$i]}" "${CATEGORY_DESCS[$i]}" -done -printf "\n" - -while true; do - CATEGORY_NUM=$(prompt "Category number" "1") - if ! printf "%s" "$CATEGORY_NUM" | grep -qE '^[0-9]+$'; then - error "Enter a number between 1 and ${#CATEGORIES[@]}." - continue - fi - if [ "$CATEGORY_NUM" -lt 1 ] || [ "$CATEGORY_NUM" -gt "${#CATEGORIES[@]}" ]; then - error "Enter a number between 1 and ${#CATEGORIES[@]}." - continue - fi - CATEGORY="${CATEGORIES[$((CATEGORY_NUM-1))]}" - break -done - # License (SPDX identifier — alphanumeric + hyphens + dots) while true; do LICENSE=$(prompt "License (SPDX identifier)" "MIT") @@ -249,7 +215,6 @@ printf " Name: %s\n" "$PLUGIN_NAME" printf " Display: %s\n" "$DISPLAY_NAME" printf " Desc: %s\n" "$DESCRIPTION" printf " Author: %s (@%s)\n" "$AUTHOR_NAME" "$AUTHOR_GITHUB" -printf " Category: %s\n" "$CATEGORY" printf " License: %s\n" "$LICENSE" printf " Includes:" $INCLUDE_COMMANDS && printf " commands" @@ -274,18 +239,17 @@ mkdir -p "$PLUGIN_DIR/.claude-plugin" # This prevents JSON corruption and shell injection from special chars in free-text fields. if command -v python3 >/dev/null 2>&1; then python3 - "$PLUGIN_NAME" "$DESCRIPTION" "$AUTHOR_NAME" "$AUTHOR_GITHUB" \ - "$CATEGORY" "$LICENSE" \ + "$LICENSE" \ "$INCLUDE_COMMANDS" "$INCLUDE_SKILLS" "$INCLUDE_AGENTS" "$INCLUDE_MCP" \ "$PLUGIN_DIR/.claude-plugin/plugin.json" <<'PYEOF' import json, sys -name, desc, author_name, author_github, category, license_, \ +name, desc, author_name, author_github, license_, \ inc_commands, inc_skills, inc_agents, inc_mcp, outfile = sys.argv[1:] data = { "name": name, "version": "1.0.0", "description": desc, "author": {"name": author_name, "github": author_github}, - "category": category, "license": license_, "keywords": [] } @@ -305,7 +269,6 @@ else printf ' "version": "1.0.0",\n' printf ' "description": "%s",\n' "$DESCRIPTION" printf ' "author": {\n "name": "%s",\n "github": "%s"\n },\n' "$AUTHOR_NAME" "$AUTHOR_GITHUB" - printf ' "category": "%s",\n' "$CATEGORY" printf ' "license": "%s",\n' "$LICENSE" if $INCLUDE_COMMANDS; then printf ' "commands": "./commands/",\n'; fi if $INCLUDE_SKILLS; then printf ' "skills": "./skills/",\n'; fi @@ -381,8 +344,6 @@ name: PLUGIN_NAME_PLACEHOLDER-skill description: > This skill should be used when the user asks about "". -version: 1.0.0 -license: LICENSE_PLACEHOLDER --- # DISPLAY_NAME_PLACEHOLDER Skill @@ -398,7 +359,6 @@ SKILLEOF sed -i.bak \ -e "s|PLUGIN_NAME_PLACEHOLDER|$PLUGIN_NAME|g" \ -e "s|DISPLAY_NAME_PLACEHOLDER|$DISPLAY_NAME|g" \ - -e "s|LICENSE_PLACEHOLDER|$LICENSE|g" \ "$PLUGIN_DIR/skills/$PLUGIN_NAME-skill/SKILL.md" && rm -f "$PLUGIN_DIR/skills/$PLUGIN_NAME-skill/SKILL.md.bak" fi