{"id":22194,"plugin_id":"plugins_6ab0101414c081918a43849ea9773344","kind":"skill","collection_source":null,"comparison_source":null,"observed_at":"2026-09-30T23:17:10.851Z","digest":"ac1eb1a209a665996bbfe5f43f2d2f58f981e9e611e073f6bb83e8953e17845c","against":null,"payload":{"name":"caveman-commit","description":"Use when the user asks for a concise Conventional Commit message or wants a commit message compressed to the change intent.","included_files":[{"relative_path":"README.md","size_in_bytes":1226},{"relative_path":"agents/openai.yaml","size_in_bytes":232}],"skill_md_contents":"---\nname: caveman-commit\ndescription: Use when the user asks for a concise Conventional Commit message or wants a commit message compressed to the\n  change intent.\n---\n\nWrite commit messages terse and exact. Conventional Commits format. No fluff. Why over what.\n\n## Rules\n\n**Subject line:**\n- `<type>(<scope>): <imperative summary>` — `<scope>` optional\n- Types: `feat`, `fix`, `refactor`, `perf`, `docs`, `test`, `chore`, `build`, `ci`, `style`, `revert`\n- Imperative mood: \"add\", \"fix\", \"remove\" — not \"added\", \"adds\", \"adding\"\n- ≤50 chars when possible, hard cap 72\n- No trailing period\n- Match project convention for capitalization after the colon\n\n**Body (only if needed):**\n- Skip entirely when subject is self-explanatory\n- Add body only for: non-obvious *why*, breaking changes, migration notes, linked issues\n- Wrap at 72 chars\n- Bullets `-` not `*`\n- Reference issues/PRs at end: `Closes #42`, `Refs #17`\n\n**What NEVER goes in:**\n- \"This commit does X\", \"I\", \"we\", \"now\", \"currently\" — the diff says what\n- \"As requested by...\" — use Co-authored-by trailer\n- \"Generated with Claude Code\" or any AI attribution — unless the user's own rule requires an `Assisted-by`/AI-attribution trailer, then add it as a trailer\n- Emoji (unless project convention requires)\n- Restating the file name when scope already says it\n\n## Examples\n\nDiff: new endpoint for user profile with body explaining the why\n- ❌ \"feat: add a new endpoint to get user profile information from the database\"\n- ✅\n  ```\n  feat(api): add GET /users/:id/profile\n\n  Mobile client needs profile data without the full user payload\n  to reduce LTE bandwidth on cold-launch screens.\n\n  Closes #128\n  ```\n\nDiff: breaking API change\n- ✅\n  ```\n  feat(api)!: rename /v1/orders to /v1/checkout\n\n  BREAKING CHANGE: clients on /v1/orders must migrate to /v1/checkout\n  before 2026-06-01. Old route returns 410 after that date.\n  ```\n\n## Auto-Clarity\n\nAlways include body for: breaking changes, security fixes, data migrations, anything reverting a prior commit. Never compress these into subject-only — future debuggers need the context.\n\n## Boundaries\n\nOnly generates the commit message. Does not run `git commit`, does not stage files, does not amend. Output the message as a code block ready to paste. \"stop caveman-commit\" or \"normal mode\": revert to verbose commit style.\n"},"changes":[],"summary":"First saved snapshot. No earlier version is available for comparison.","summary_kind":"deterministic","summary_metadata":{}}