Project name: claude-code-marketplace
Marketplace name: hg-pyun-plugins
Repository: hg-pyun/claude-code-marketplace (Public)
License: MIT
A static GitHub repository for the Claude Code plugin marketplace. Starting as personal use, but maintaining a structure that can be gradually shared with teams or the community in the future.
| Item | Decision | Rationale |
|---|---|---|
| Project type | Static repository (marketplace.json + plugin files) | Minimal structure suitable for personal use |
| Source management | Monorepo (all plugins included in this repository) | Consistent management in a single repository |
| Directory structure | Separated by plugin (plugins/plugin-name/) | Simple and intuitive structure |
| pluginRoot | Set to ./plugins |
Simplifies source paths |
| Versioning | Date-based (YYYY.MM[.patch] format) | Intuitive versioning scheme suitable for personal projects |
| Templates | Not included | Claude Code can help when needed |
| Automation scripts | Not included | Manual management + Claude Code assistance |
| Target users | Personal → gradual sharing | Use the same plugin set across multiple environments |
claude-code-marketplace/
├── .claude-plugin/
│ └── marketplace.json # Marketplace catalog (core file)
├── plugins/ # Root directory for all plugins
│ ├── git/ # Git workflow automation plugin
│ │ ├── .claude-plugin/
│ │ │ └── plugin.json
│ │ ├── commands/
│ │ │ ├── git-commit.md
│ │ │ ├── github-pr.md
│ │ │ └── git-rebase-stack.md
│ │ └── README.md
│ ├── linear/ # Linear ticket enrichment plugin
│ │ ├── .claude-plugin/
│ │ │ └── plugin.json
│ │ ├── commands/
│ │ │ └── enrich-ticket.md
│ │ └── README.md
│ └── plan/ # Project planning plugin
│ ├── .claude-plugin/
│ │ └── plugin.json
│ ├── commands/
│ │ └── deep-interview.md
│ └── README.md
├── LICENSE # MIT License
├── README.md # Project description and usage
└── SPEC.md # This spec document
{
"name": "hg-pyun-plugins",
"owner": {
"name": "hg-pyun"
},
"metadata": {
"description": "Personal Claude Code plugin marketplace by hg-pyun",
"version": "2026.02",
"pluginRoot": "./plugins"
},
"plugins": [
{
"name": "git",
"source": "./plugins/git",
"description": "Analyzes git diff/log to auto-generate Korean conventional commit messages, create GitHub PRs, and handle stacked PR rebase",
"version": "2026.02",
"keywords": ["git", "commit", "pull-request", "conventional-commit", "korean", "rebase", "stacked-pr"]
},
{
"name": "plan",
"source": "./plugins/plan",
"description": "Auto-generates project spec documents through in-depth interviews",
"version": "2026.02",
"keywords": ["interview", "spec", "requirements", "planning"]
},
{
"name": "linear",
"source": "./plugins/linear",
"description": "Analyzes Linear tickets and fills in missing information through interviews",
"version": "2026.02",
"keywords": ["linear", "ticket", "interview"]
}
]
}| Field | Required | Description |
|---|---|---|
name |
Y | Plugin identifier (kebab-case) |
source |
Y | Plugin directory path (./plugins/<name> format) |
description |
Y | Plugin description |
version |
Y | Date-based version (YYYY.MM[.patch]) |
keywords |
N | Array of search keywords |
- Format:
YYYY.MM(first release of the month) orYYYY.MM.patch(additional changes in the same month) - When a plugin is changed, its version must be bumped.
versioninplugins/<name>/.claude-plugin/plugin.jsonversionof the corresponding plugin in.claude-plugin/marketplace.json
- The versions in both locations must always be kept in sync.
- The marketplace metadata version is only bumped when the overall catalog changes.
- Reserved names: Names like
claude-code-marketplace,claude-code-plugins,anthropic-marketplacecannot be used as marketplace names - File references: Plugins cannot reference files outside their own directory using
../paths (because they are copied to a cache directory during installation) - Path traversal:
..cannot be included in the source path - Plugin names: kebab-case, no spaces
${CLAUDE_PLUGIN_ROOT}: Used to reference the plugin installation path in hooks and MCP server configurations
Add a configurable language setting to all plugins so that generated output can be written in Korean, English, or other languages. This replaces the current hard-coded Korean requirement across all plugins. Each plugin manages its own settings.language independently.
Add a settings field to each plugin's .claude-plugin/plugin.json:
{
"name": "<plugin-name>",
"version": "2026.02",
"settings": {
"language": "Korean"
}
}- Simple string value — stores the default language
- Preset languages and parsing logic are managed in the command md files, not in plugin.json
- Default value: Korean (backward compatible with existing behavior)
Both full language names and ISO 639-1 codes are accepted:
| Full Name | ISO Code |
|---|---|
| Korean | ko |
| English | en |
| Japanese | ja |
| Chinese | zh |
Custom values (e.g., Spanish, Bahasa Indonesia) are also accepted as free text.
Presets: Korean, English, Japanese, Chinese. Any other value is treated as a custom language name and passed through as-is.
Two mechanisms, used together:
- plugin.json default: Edit
settings.languagein the plugin's.claude-plugin/plugin.jsonto change the persistent default. - Command argument override: Pass
--lang=<value>to override the default for a single invocation.- The argument takes precedence over plugin.json when provided.
Each affected command md file will be updated with:
-
Settings Reference section at the top of the file:
## Settings Reference - `$LANGUAGE`: The language setting from plugin.json `settings.language`. Override with `--lang=<value>` argument. Presets: Korean, English, Japanese, Chinese. Custom values also accepted (e.g., Spanish, Bahasa Indonesia).
-
$LANGUAGE variable replaces all hard-coded "Korean" references in the body:
- **Must be written in $LANGUAGE.**
-
Examples: Replace Korean examples with English examples to match the English documentation language. The
$LANGUAGEinstruction is sufficient to guide output language regardless of example language.
| Item | Decision | Rationale |
|---|---|---|
| Setting level | Plugin-level unified setting | All 3 commands share one language setting |
| Affected output | Artifacts only | Commit messages, PR title/body. Conversational output (questions, guidance, reports) is NOT affected |
| Affected commands | git-commit, github-pr | git-rebase-stack is excluded (no artifacts; its Ground Rules for Korean conversation remain unchanged) |
git-commit
| Part | Language Behavior |
|---|---|
| type | English (fixed, e.g., feat, fix) |
| scope | English (fixed, inferred from paths) |
| subject description | Written in $LANGUAGE |
| body | Written in $LANGUAGE |
| footer (BREAKING CHANGE keyword) | English (fixed) |
| footer (BREAKING CHANGE description) | English (fixed) |
github-pr
| Part | Language Behavior |
|---|---|
| PR title: type(scope) | English (fixed) |
| PR title: description | Written in $LANGUAGE |
| PR body: section headers (## Summary, ## Changes) | English (fixed) |
| PR body: section content | Written in $LANGUAGE |
| Issue linking (Closes #123) | English (fixed) |
git-rebase-stack
No artifacts — excluded from language setting. The existing Ground Rules ("All guidance, questions, and reports must be output in Korean") remain unchanged.
For git-commit (currently accepts no $ARGUMENTS):
- Now accepts optional
--lang=<value>flag. - If
$ARGUMENTScontains--lang=<value>, extract and use as language override. - All other arguments are ignored (same as before).
For github-pr (currently accepts --draft):
- Now additionally accepts
--lang=<value>flag. - Both flags can coexist:
/pr --draft --lang=en
For git-rebase-stack:
- No change. Does not accept
--lang.
- Add
settings.languagefield toplugins/git/.claude-plugin/plugin.json - Update
git-commit.md: add Settings Reference, replace hard-coded Korean with$LANGUAGE, replace Korean examples with English, add--langargument support - Update
github-pr.md: add Settings Reference, replace hard-coded Korean with$LANGUAGE, replace Korean examples with English, add--langargument support - Update
plugins/git/README.md: document language setting and--langflag - Bump plugin version in both
plugin.jsonandmarketplace.json
| Item | Decision | Rationale |
|---|---|---|
| Setting level | Plugin-level setting | enrich-ticket command uses the setting |
| Affected output | Interview questions + ticket content | Both the interview questions asked to the user and the content written back to the Linear ticket are language-dependent |
| Affected commands | enrich-ticket | Only command in this plugin |
enrich-ticket
| Part | Language Behavior |
|---|---|
| Interview questions (AskUserQuestion) | Written in $LANGUAGE |
| Enriched ticket content written to Linear | Written in $LANGUAGE |
For enrich-ticket (currently accepts a Linear ticket URL as $ARGUMENTS):
- Now additionally accepts optional
--lang=<value>flag. - The URL and
--langflag can coexist:/linear:enrich-ticket <URL> --lang=en - If
--langis not provided, uses the default from plugin.json.
- Add
settings.languagefield toplugins/linear/.claude-plugin/plugin.json - Update
enrich-ticket.md: add Settings Reference, replace hard-coded "Korean" Ground Rule with$LANGUAGE, add--langargument support - Update
plugins/linear/README.md: document language setting and--langflag - Bump plugin version in both
plugin.jsonandmarketplace.json
| Item | Decision | Rationale |
|---|---|---|
| Setting level | Plugin-level setting | deep-interview command uses the setting |
| Affected output | Interview questions + spec document | Both the interview questions and the generated spec document are language-dependent |
| Affected commands | deep-interview | Only command in this plugin |
deep-interview
| Part | Language Behavior |
|---|---|
| Interview questions (AskUserQuestion) | Written in $LANGUAGE |
| Generated spec document | Written in $LANGUAGE |
For deep-interview (currently accepts a request description as $ARGUMENTS):
- Now additionally accepts optional
--lang=<value>flag. - The request and
--langflag can coexist:/plan:deep-interview <request> --lang=en - If
--langis not provided, uses the default from plugin.json.
- Add
settings.languagefield toplugins/plan/.claude-plugin/plugin.json - Update
deep-interview.md: add Settings Reference, add$LANGUAGEdirective for interview and spec output, add--langargument support - Update
plugins/plan/README.md: document language setting and--langflag - Bump plugin version in both
plugin.jsonandmarketplace.json