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:
Parley Hatch 2026-03-19 21:07:48 -06:00
commit 5e7054deb6
7 changed files with 314 additions and 0 deletions

View 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
View 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
View 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 |

View 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/"
}

View 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

View 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/"
}

View 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
```
```