Install
openclaw skills install @dennisrongo/conventional-commitsWrite git commit messages following the Conventional Commits specification, with an automatic ticket number pulled from the current branch and a project tag (API / CLIENT / CONSOLE / DB) when the project type can be detected from the diff. Use this skill whenever the user asks to write a commit message, asks for help committing changes, runs git commit, or mentions writing changelog entries — even if they don't explicitly say "conventional commits".
openclaw skills install @dennisrongo/conventional-commitsWrite commit messages that follow the Conventional Commits spec, prefixed with the ticket number (from the current branch) and the project tag (API / CLIENT / CONSOLE / DB) when those can be determined.
[#<ticket>] [(<PROJECT>)] <type>[(<scope>)][!]: <description>
[optional body]
[optional footer(s)]
Bracketed segments are included only when they apply (see Branch & project context). A fully-tagged example:
#12345 (CLIENT) fix: prevent modal z-index regression on settings page
Before composing the message, gather two pieces of context from the repo.
git rev-parse --abbrev-ref HEAD to get the current branch name./-separated segment of the branch (so feature/12345-fix_this_bug becomes 12345-fix_this_bug).-, _, or end-of-string, those leading digits are the ticket number.#<ticket> from the message entirely — do not invent one, do not guess one from conversation context, do not reuse a stale number mentioned earlier in the session, and do not prompt the user for it. The branch name is the only source of truth for the ticket.Examples:
| Branch | Extracted ticket |
|---|---|
feature/12345-fix_this_bug | 12345 |
12345-fix_this_bug | 12345 |
bugfix/9-typo | 9 |
main, release/v2, feature/redesign | (none — omit #) |
Pick ONE of API, CLIENT, CONSOLE, or DB based on what was actually changed in the diff:
api/, server/, backend/, services/api/, apps/api/; server framework code (Express, NestJS, FastAPI, Django, Rails, Spring); OpenAPI specs.client/, web/, frontend/, apps/web/, apps/client/, ui/; .tsx / .jsx / .vue / .svelte; React / Vue / Angular / Svelte component files; user-facing CSS / Tailwind / design assets..csproj files with <OutputType>Exe</OutputType> or Sdk="Microsoft.NET.Sdk" (and NOT Microsoft.NET.Sdk.Web); Program.cs without ASP.NET / web-host bootstrap; Microsoft.Extensions.Hosting worker or BackgroundService usage; CLI libraries like System.CommandLine, Spectre.Console, CommandLineParser, McMaster.Extensions.CommandLineUtils; project names ending in .Console, .Cli, .Worker, or .Tool; paths like console/, apps/console/, tools/, cli/.db/, migrations/, prisma/, schema.prisma, SQL files, alembic/, knex/, model-only changes.How to decide:
git diff --cached --name-only (fall back to git diff --name-only if nothing is staged).(PROJECT) — same fallback rule as the missing ticket.#12345 (CLIENT) prefix counts toward the 72-char header budget — keep the description tight.! after the type / scope (e.g., #12345 (API) feat!: drop support for Node 16) and a BREAKING CHANGE: footer.type(scope) is optional and usually redundant once (PROJECT) is present. Only use it when it adds real specificity beyond the project tag (e.g., #12345 (API) fix(auth): ... when "auth" narrows further than "API").fix: fix bug in loginfix: reject expired refresh tokens instead of issuing new access tokensfeat, not fix. Determine the type from git diff --staged output you actually read this session — never from the conversation summary or the user's wording alone.chore: various updates.When the user asks for a commit message:
git rev-parse --abbrev-ref HEAD and extract the ticket number per the rules above.git diff --cached (or git diff if nothing is staged).[#<ticket>] [(<PROJECT>)] <type>: <description>, including only the segments that apply.#12345 (CLIENT) fix: prevent modal z-index regression on settings page
#12345 (API) feat(auth): add OAuth2 PKCE flow for mobile clients
#987 (DB) chore: add index on users.created_at for analytics query
#42 (CONSOLE) feat: add bulk-export action to billing dashboard
(API) refactor: extract token validator into shared middleware
# ^ branch had no ticket — `#` omitted
#7 fix: correct off-by-one in pagination cursor
# ^ repo doesn't fit API / CLIENT / CONSOLE / DB — `(PROJECT)` omitted
fix: prevent race condition in cache invalidation
The previous implementation could double-invalidate when two requests
arrived within the lock window. Use a single atomic CAS.
Fixes #482
# ^ no ticket in branch, no project bucket fits — both prefixes omitted
#1024 (API) refactor!: rename `user.email` column to `user.email_address`
BREAKING CHANGE: clients reading `user.email` must update to `user.email_address`.
update stuff (no type, vague)Fix: Bug in login page. (capitalized, trailing period)feat: added the ability to export CSV files (past tense)#12345 (CLIENT) feat: added export. (past tense + trailing period)fix: quick fix per request when the staged diff adds a new endpoint (type from the user's phrasing, not the diff — should be feat)chore: various updates covering two unrelated changes — flag the split instead(PROJECT) tag when the diff doesn't actually map to API / CLIENT / CONSOLE / DB#12345 (CLIENT) feat: add CSV export