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
2 changes: 1 addition & 1 deletion .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
@@ -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"
Expand Down
4 changes: 1 addition & 3 deletions .github/ISSUE_TEMPLATE/plugin-submission.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,6 @@ assignees: ''
**Plugin name** (kebab-case):
<!-- e.g. my-awesome-plugin -->

**Category**:
<!-- productivity | git | code-quality | documentation | ai-agents | integrations | learning | security | devops | data -->

**Description** (one sentence):
<!-- What does this plugin do? -->

Expand All @@ -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)
4 changes: 2 additions & 2 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -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)
Expand Down
10 changes: 0 additions & 10 deletions .github/scripts/validate-plugin.js
Original file line number Diff line number Diff line change
Expand Up @@ -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)) {
Expand Down
18 changes: 16 additions & 2 deletions .github/workflows/validate-plugin.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down
10 changes: 7 additions & 3 deletions README.ko.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)을 확인하세요.*

Expand Down
10 changes: 7 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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).*

Expand Down
102 changes: 0 additions & 102 deletions docs/contributors/categories.md

This file was deleted.

4 changes: 2 additions & 2 deletions docs/contributors/contributing.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
12 changes: 6 additions & 6 deletions docs/contributors/plugin-spec.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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",
Expand All @@ -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.
Expand Down Expand Up @@ -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`
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand Down
1 change: 0 additions & 1 deletion docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
1 change: 0 additions & 1 deletion plugins/gh-cli/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
"name": "minsoo.web",
"github": "minsoo-web"
},
"category": "git",
"license": "MIT",
"keywords": ["github", "gh", "cli", "pull-request", "issues"],
"skills": "./skills/"
Expand Down
2 changes: 1 addition & 1 deletion plugins/skill-review/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -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",
Expand Down
8 changes: 8 additions & 0 deletions plugins/skill-review/skills/skill-review/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -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).
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 |

---

Expand Down
2 changes: 1 addition & 1 deletion plugins/vitest/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -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",
Expand Down
11 changes: 7 additions & 4 deletions plugins/vitest/skills/vitest/SKILL.md
Original file line number Diff line number Diff line change
@@ -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

Expand Down
Loading