commit 5e7054deb6830a0d9ae279210918888c87118f65 Author: Parley Hatch Date: Thu Mar 19 21:07:48 2026 -0600 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 diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json new file mode 100644 index 0000000..9566dcf --- /dev/null +++ b/.claude-plugin/marketplace.json @@ -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" + } + ] +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..696cce8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,20 @@ +# OS +.DS_Store +Thumbs.db + +# Editor +*.swp +*.swo +*~ +.vscode/ +.idea/ + +# Temp +*.tmp +.claude/temp/ + +# Local environment +.claude/ +docs/ +CLAUDE.md + diff --git a/README.md b/README.md new file mode 100644 index 0000000..3566d7c --- /dev/null +++ b/README.md @@ -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 @numencore-toolkit + +# Disable/enable +claude plugin disable @numencore-toolkit +claude plugin enable @numencore-toolkit + +# Uninstall +claude plugin uninstall @numencore-toolkit +``` + +## Development + +After editing skills in the source directory, reinstall the plugin to update the cache: + +```bash +claude plugin install @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/ +``` + +### Structure + +``` +plugins// +├── .claude-plugin/plugin.json +└── skills//SKILL.md +``` + +### Adding a new plugin + +1. Create `plugins//.claude-plugin/plugin.json` +2. Add skills under `plugins//skills//SKILL.md` +3. Register in `.claude-plugin/marketplace.json` +4. Run `claude plugin marketplace update numencore-toolkit` +5. Run `claude plugin install @numencore-toolkit` + +## Plugins + +| Plugin | Description | +|--------|-------------| +| `numencore-core` | Core toolkit — skill authoring, project scaffolding | +| `git-tools` | Git workflow — commit formatting, branch management | diff --git a/plugins/git-tools/.claude-plugin/plugin.json b/plugins/git-tools/.claude-plugin/plugin.json new file mode 100644 index 0000000..376efa4 --- /dev/null +++ b/plugins/git-tools/.claude-plugin/plugin.json @@ -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/" +} diff --git a/plugins/git-tools/skills/commit-format/SKILL.md b/plugins/git-tools/skills/commit-format/SKILL.md new file mode 100644 index 0000000..e925615 --- /dev/null +++ b/plugins/git-tools/skills/commit-format/SKILL.md @@ -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 diff --git a/plugins/numencore-core/.claude-plugin/plugin.json b/plugins/numencore-core/.claude-plugin/plugin.json new file mode 100644 index 0000000..ce6682e --- /dev/null +++ b/plugins/numencore-core/.claude-plugin/plugin.json @@ -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/" +} diff --git a/plugins/numencore-core/skills/skill-creator/SKILL.md b/plugins/numencore-core/skills/skill-creator/SKILL.md new file mode 100644 index 0000000..722b540 --- /dev/null +++ b/plugins/numencore-core/skills/skill-creator/SKILL.md @@ -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//skills//` +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 +``` +```