feat: initialize plugin marketplace with core plugins
- add marketplace.json, README, and .gitignore - add git-tools plugin with commit-format skill - add numencore-core plugin with skill-creator skill
This commit is contained in:
commit
5e7054deb6
7 changed files with 314 additions and 0 deletions
22
.claude-plugin/marketplace.json
Normal file
22
.claude-plugin/marketplace.json
Normal file
|
|
@ -0,0 +1,22 @@
|
||||||
|
{
|
||||||
|
"name": "numencore-toolkit",
|
||||||
|
"description": "Personal plugin marketplace — phatch",
|
||||||
|
"owner": {
|
||||||
|
"name": "Parley Hatch",
|
||||||
|
"email": "parley.hatch@gmail.com"
|
||||||
|
},
|
||||||
|
"plugins": [
|
||||||
|
{
|
||||||
|
"name": "numencore-core",
|
||||||
|
"description": "Core toolkit skills — skill authoring, project scaffolding",
|
||||||
|
"category": "development",
|
||||||
|
"source": "./plugins/numencore-core"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "git-tools",
|
||||||
|
"description": "Git workflow skills — commit formatting, branch management",
|
||||||
|
"category": "development",
|
||||||
|
"source": "./plugins/git-tools"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
20
.gitignore
vendored
Normal file
20
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
# OS
|
||||||
|
.DS_Store
|
||||||
|
Thumbs.db
|
||||||
|
|
||||||
|
# Editor
|
||||||
|
*.swp
|
||||||
|
*.swo
|
||||||
|
*~
|
||||||
|
.vscode/
|
||||||
|
.idea/
|
||||||
|
|
||||||
|
# Temp
|
||||||
|
*.tmp
|
||||||
|
.claude/temp/
|
||||||
|
|
||||||
|
# Local environment
|
||||||
|
.claude/
|
||||||
|
docs/
|
||||||
|
CLAUDE.md
|
||||||
|
|
||||||
73
README.md
Normal file
73
README.md
Normal file
|
|
@ -0,0 +1,73 @@
|
||||||
|
# numencore-toolkit
|
||||||
|
|
||||||
|
Personal Claude Code plugin marketplace. Self-hosted on Forgejo.
|
||||||
|
|
||||||
|
## Install
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone ssh://git@git.numencore.com:2222/phatch/numencore-toolkit.git
|
||||||
|
claude plugin marketplace add ~/numencore-toolkit
|
||||||
|
claude plugin install numencore-core@numencore-toolkit
|
||||||
|
claude plugin install git-tools@numencore-toolkit
|
||||||
|
```
|
||||||
|
|
||||||
|
Verify with `claude plugin list` or `/reload-plugins` in an active session.
|
||||||
|
|
||||||
|
## Plugin management
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# List installed
|
||||||
|
claude plugin list
|
||||||
|
|
||||||
|
# Update marketplace (re-reads from disk)
|
||||||
|
claude plugin marketplace update numencore-toolkit
|
||||||
|
|
||||||
|
# Reinstall after editing skills (re-caches)
|
||||||
|
claude plugin install <plugin>@numencore-toolkit
|
||||||
|
|
||||||
|
# Disable/enable
|
||||||
|
claude plugin disable <plugin>@numencore-toolkit
|
||||||
|
claude plugin enable <plugin>@numencore-toolkit
|
||||||
|
|
||||||
|
# Uninstall
|
||||||
|
claude plugin uninstall <plugin>@numencore-toolkit
|
||||||
|
```
|
||||||
|
|
||||||
|
## Development
|
||||||
|
|
||||||
|
After editing skills in the source directory, reinstall the plugin to update the cache:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
claude plugin install <plugin>@numencore-toolkit
|
||||||
|
```
|
||||||
|
|
||||||
|
In an active session, run `/reload-plugins` to pick up changes.
|
||||||
|
|
||||||
|
For faster iteration, bypass the cache entirely:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
claude --plugin-dir ~/numencore-toolkit/plugins/<plugin-name>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Structure
|
||||||
|
|
||||||
|
```
|
||||||
|
plugins/<plugin-name>/
|
||||||
|
├── .claude-plugin/plugin.json
|
||||||
|
└── skills/<skill-name>/SKILL.md
|
||||||
|
```
|
||||||
|
|
||||||
|
### Adding a new plugin
|
||||||
|
|
||||||
|
1. Create `plugins/<name>/.claude-plugin/plugin.json`
|
||||||
|
2. Add skills under `plugins/<name>/skills/<skill-name>/SKILL.md`
|
||||||
|
3. Register in `.claude-plugin/marketplace.json`
|
||||||
|
4. Run `claude plugin marketplace update numencore-toolkit`
|
||||||
|
5. Run `claude plugin install <name>@numencore-toolkit`
|
||||||
|
|
||||||
|
## Plugins
|
||||||
|
|
||||||
|
| Plugin | Description |
|
||||||
|
|--------|-------------|
|
||||||
|
| `numencore-core` | Core toolkit — skill authoring, project scaffolding |
|
||||||
|
| `git-tools` | Git workflow — commit formatting, branch management |
|
||||||
12
plugins/git-tools/.claude-plugin/plugin.json
Normal file
12
plugins/git-tools/.claude-plugin/plugin.json
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
{
|
||||||
|
"name": "git-tools",
|
||||||
|
"version": "0.1.0",
|
||||||
|
"description": "Git workflow skills — commit formatting, branch management",
|
||||||
|
"author": {
|
||||||
|
"name": "Parley Hatch",
|
||||||
|
"email": "parley.hatch@gmail.com"
|
||||||
|
},
|
||||||
|
"repository": "ssh://git@git.numencore.com:2222/phatch/numencore-toolkit.git",
|
||||||
|
"license": "MIT",
|
||||||
|
"skills": "./skills/"
|
||||||
|
}
|
||||||
54
plugins/git-tools/skills/commit-format/SKILL.md
Normal file
54
plugins/git-tools/skills/commit-format/SKILL.md
Normal file
|
|
@ -0,0 +1,54 @@
|
||||||
|
---
|
||||||
|
name: commit-format
|
||||||
|
description: Generate a conventional commit message from staged changes and commit after user approval. Use when the user wants to commit staged work.
|
||||||
|
user-invocable: true
|
||||||
|
argument-hint: "[type] [scope] [description]"
|
||||||
|
allowed-tools: Bash(git *)
|
||||||
|
---
|
||||||
|
|
||||||
|
# Commit Format
|
||||||
|
|
||||||
|
## Steps
|
||||||
|
|
||||||
|
1. Read the staged change summary:
|
||||||
|
- `git diff --cached --stat` for file summary
|
||||||
|
- Do NOT read the full diff — infer intent from the stat summary and file names
|
||||||
|
- If nothing is staged, run `git status --short` and offer:
|
||||||
|
- Stage all changes
|
||||||
|
- Stage by file type or directory
|
||||||
|
- Let the user specify which files
|
||||||
|
- Wait for the user's choice and stage accordingly before continuing
|
||||||
|
|
||||||
|
2. Determine commit metadata:
|
||||||
|
- If arguments were provided, use them as type/scope/description
|
||||||
|
- If no arguments, infer from the diff:
|
||||||
|
- **type**: `feat`, `fix`, `refactor`, `docs`, `test`, `chore`, `build`, `ci`, `perf`, `style`
|
||||||
|
- **scope**: infer from the primary area of change (module, component, file group) — omit if unclear
|
||||||
|
- **description**: one line summarizing what changed
|
||||||
|
|
||||||
|
3. Build the commit message:
|
||||||
|
- Subject line: `type(scope): description` or `type: description` if no scope
|
||||||
|
- Subject line must be under 72 characters
|
||||||
|
- If the change warrants it, add a body separated by a blank line — short bullet points only
|
||||||
|
- No emojis, no attributions, no co-authored-by lines
|
||||||
|
- Body is for non-obvious context only — skip it if the subject says enough
|
||||||
|
|
||||||
|
4. Present the message to the user in a fenced block:
|
||||||
|
```
|
||||||
|
feat(parser): add support for nested expressions
|
||||||
|
|
||||||
|
- handle recursive descent for grouped terms
|
||||||
|
- update token precedence table
|
||||||
|
```
|
||||||
|
|
||||||
|
5. Wait for user response:
|
||||||
|
- If confirmed: run `git commit -m` with the message (use HEREDOC for multiline)
|
||||||
|
- If edits requested: revise and present again
|
||||||
|
- Never commit without explicit approval
|
||||||
|
|
||||||
|
## Constraints
|
||||||
|
|
||||||
|
- One sentence subject lines — not paragraphs
|
||||||
|
- Prefer active voice, imperative mood ("add", "fix", "remove" — not "added", "fixes", "removing")
|
||||||
|
- If the diff is large, focus the message on intent, not listing every file
|
||||||
|
- When in doubt about type, ask the user rather than guess wrong
|
||||||
12
plugins/numencore-core/.claude-plugin/plugin.json
Normal file
12
plugins/numencore-core/.claude-plugin/plugin.json
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
{
|
||||||
|
"name": "numencore-core",
|
||||||
|
"version": "0.1.0",
|
||||||
|
"description": "Core toolkit skills — skill authoring, project scaffolding",
|
||||||
|
"author": {
|
||||||
|
"name": "Parley Hatch",
|
||||||
|
"email": "parley.hatch@gmail.com"
|
||||||
|
},
|
||||||
|
"repository": "ssh://git@git.numencore.com:2222/phatch/numencore-toolkit.git",
|
||||||
|
"license": "MIT",
|
||||||
|
"skills": "./skills/"
|
||||||
|
}
|
||||||
121
plugins/numencore-core/skills/skill-creator/SKILL.md
Normal file
121
plugins/numencore-core/skills/skill-creator/SKILL.md
Normal file
|
|
@ -0,0 +1,121 @@
|
||||||
|
---
|
||||||
|
name: skill-creator
|
||||||
|
description: Build a new Claude Code skill from a user's description. Use when the user wants to create, author, or write a new skill or slash command.
|
||||||
|
user-invocable: true
|
||||||
|
argument-hint: "[what the skill should do]"
|
||||||
|
allowed-tools: Read, Write, Bash(mkdir *), Glob, Grep
|
||||||
|
---
|
||||||
|
|
||||||
|
# Skill Creator
|
||||||
|
|
||||||
|
You are building a Claude Code skill to the numencore-toolkit standard.
|
||||||
|
|
||||||
|
## Phase 1: Understand
|
||||||
|
|
||||||
|
Extract these six answers from the user's input. Ask for missing answers ONE AT A TIME. Do not proceed until all six are resolved.
|
||||||
|
|
||||||
|
1. **What does it do?** — One sentence. If it takes more, the skill is too broad.
|
||||||
|
2. **What does it take in?** — Arguments shape, or none.
|
||||||
|
3. **What does it produce?** — File, diff, terminal output. Where does it go?
|
||||||
|
4. **What tools does it need?** — Explicit list (Read, Write, Bash, Grep, Glob, etc).
|
||||||
|
5. **What is the interaction shape?** — Execute immediately, or back-and-forth with user?
|
||||||
|
6. **Does output have a specific format?** — If yes, define the shape.
|
||||||
|
|
||||||
|
If the user is vague, push for clarity. If they say red, do not build blue.
|
||||||
|
|
||||||
|
When all six are answered, play back a tight spec:
|
||||||
|
|
||||||
|
```
|
||||||
|
Skill: [name]
|
||||||
|
Does: [one sentence]
|
||||||
|
Input: [arguments or none]
|
||||||
|
Output: [what and where]
|
||||||
|
Tools: [list]
|
||||||
|
Interaction: [shape]
|
||||||
|
Format: [description or "none"]
|
||||||
|
```
|
||||||
|
|
||||||
|
Wait for explicit confirmation before proceeding.
|
||||||
|
|
||||||
|
## Phase 2: Write
|
||||||
|
|
||||||
|
Build the skill following these principles. Every line must earn its place.
|
||||||
|
|
||||||
|
### Frontmatter rules
|
||||||
|
|
||||||
|
- `name`: lowercase, hyphens, max 64 chars
|
||||||
|
- `description`: pushy and specific — this is a routing mechanism, not documentation
|
||||||
|
- `allowed-tools`: explicit list, never implicit
|
||||||
|
- `argument-hint`: include if skill takes arguments
|
||||||
|
- `disable-model-invocation`: set `true` for side-effect skills (deploy, send, delete)
|
||||||
|
- Only include fields that have non-default values
|
||||||
|
|
||||||
|
### Body rules
|
||||||
|
|
||||||
|
- Every line is HOW or WHERE
|
||||||
|
- Constraint-level WHY is allowed when it prevents bad judgment calls — but it earns its place
|
||||||
|
- No filler, no commentary, no emojis, no preamble
|
||||||
|
- Never repeat what frontmatter already declares
|
||||||
|
- If output has a specific format, include ONE example of good output
|
||||||
|
- Use `${CLAUDE_SKILL_DIR}` to reference bundled templates or scripts
|
||||||
|
- Use `!`command`` preprocessor for dynamic context injection
|
||||||
|
- Use `$ARGUMENTS`, `$0`, `$1` for argument substitution
|
||||||
|
|
||||||
|
### Size rules
|
||||||
|
|
||||||
|
- Target under 200 lines
|
||||||
|
- If exceeding 200, move reference material to supporting files
|
||||||
|
- Supporting files go in the skill directory alongside SKILL.md
|
||||||
|
- Reference them with markdown links — they load on demand, not automatically
|
||||||
|
|
||||||
|
### Structure rules
|
||||||
|
|
||||||
|
- Self-contained — one job, no skill chaining
|
||||||
|
- Instruction sections use `##` headers
|
||||||
|
- Steps within sections are numbered
|
||||||
|
- Constraints within steps are bulleted
|
||||||
|
|
||||||
|
## Phase 3: Place
|
||||||
|
|
||||||
|
1. Determine which plugin the skill belongs in
|
||||||
|
2. Create the directory: `plugins/<plugin>/skills/<skill-name>/`
|
||||||
|
3. Write `SKILL.md`
|
||||||
|
4. Write any supporting files (templates, scripts, examples)
|
||||||
|
5. Update `plugin.json` if this is a new plugin
|
||||||
|
|
||||||
|
## Example Output
|
||||||
|
|
||||||
|
A well-formed skill:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
---
|
||||||
|
name: changelog
|
||||||
|
description: Generate a changelog entry from staged git changes. Use when committing features, fixes, or breaking changes.
|
||||||
|
user-invocable: true
|
||||||
|
argument-hint: "[version]"
|
||||||
|
allowed-tools: Bash(git *), Read, Write
|
||||||
|
---
|
||||||
|
|
||||||
|
# Changelog Generator
|
||||||
|
|
||||||
|
## Steps
|
||||||
|
|
||||||
|
1. Read staged diff: `git diff --cached --stat`
|
||||||
|
2. Read recent changelog format from `CHANGELOG.md` if it exists
|
||||||
|
3. Categorize changes into: Added, Changed, Fixed, Removed
|
||||||
|
4. Write entry under `## [$0]` header at top of CHANGELOG.md
|
||||||
|
|
||||||
|
Only include categories that have entries.
|
||||||
|
|
||||||
|
## Format
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
## [1.2.0]
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- User authentication via OAuth2
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- Connection timeout on large file uploads
|
||||||
|
```
|
||||||
|
```
|
||||||
Loading…
Reference in a new issue