Conventional commits
Construct a valid Conventional Commits message for this repo before running `git commit`, covering type/scope, the "!" breaking-change marker, description rules, and the required trailing beads issue id. Use whenever writing or reviewing a commit message, or when a commit is rejected by the commit-msg/beads-commit-msg hooks.From its SKILL.md
npx -y skills add niksavis/basicly --skill conventional-commitsAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
7.0 KB, ~1.7k tokens by cl100k_base, as published. Nobody here has run it
Conventional Commits
Scope
Owns constructing a single-line commit subject that passes this repo's commit-msg and
beads-commit-msg git hooks on the first attempt.
It is not for:
- Deciding whether to commit, what to stage, or how to split a diff (see
tool-git). - Creating or managing beads issues (see
tool-br); this skill only covers referencing an existing id in the message. - Body/footer content — the hooks here only validate the subject line.
Inputs
- The change being committed (already staged, or about to be).
- An existing (or just-created) beads issue id — see
tool-brto resolve or create one.
Outputs
- A single commit subject line that passes
commit-msg.pyandbeads-commit-msg.pyon the first attempt, with no--no-verifyneeded.
Format
type(scope)!: description (issue-id[, issue-id...])
type— one of: feat, fix, docs, style, refactor, perf, test, build, ci, chore, revert.(scope)— optional, lowercase-kebab-case, e.g.(basicly).!— optional, immediately before the colon, marks a breaking change.description— required: entirely lowercase, not just the first letter — proper nouns and acronyms get lowercased too ("json", "conventional commits", not "JSON", "Conventional Commits"). Letters/digits/space/hyphen only — no underscores (writetest-cli, nottest_cli) and no other punctuation. No trailing punctuation, at least 3 characters. This means version strings, filenames, and proper nouns (0.2.0,AGENTS.md,Font Awesome) can never appear verbatim in the subject — dots and uppercase are rejected. Keep the exact form in the free-form commit body (the hooks validate only the subject line), or reword the subject ("the first release", "agents-md", "font awesome"). A rejected commit prints the offending character(s) — lowercase them or move them to the body.(issue-id[, issue-id...])— required by this repo'sbeads-commit-msghook: one or more known beads (br) issue ids, comma-separated in a single trailing parenthetical. An id is<prefix>-<base>with optional dotted hierarchy levels — e.g.basicly-q49,basicly-zrj.8,basicly-zrj.4.1— where<prefix>is your repo's configured beads prefix. The dotted forms are howbrnames child issues and are accepted here. The hook matches the id prefix-anchored, by word boundary anywhere in the message (mirroringbr's own commit scanner), so ordinary hyphenated words in the description are never mistaken for ids, and a git-trailer footer (Refs: basicly-q49) is recognized too — the trailing parenthetical above stays the default.
Workflow
Default to basicly commit "<description>": it derives the type from the bead's work
class, the scope from the staged paths, and the trailing bead id from the branch's
worktree binding, then commits — so only the description is yours to write, and a
description the charset rules reject is refused with the offending character named
before any commit is attempted. --body carries the capitals, dots, and filenames;
--type/--scope/--issue override one derived part; --dry-run prints the message
without committing.
Compose the subject by hand only when there is no envelope to derive from — a commit outside a bead's worktree, or a message the command cannot assemble:
- Pick the type that matches the change's intent (feat/fix/docs/...).
- Resolve or create a beads issue first (see
tool-br) — never invent an id. - Add
!only when the change is a breaking API/behavior change. - Write the description in the imperative, lowercase, no trailing period.
- Append the issue id(s) as a single trailing parenthetical.
- Run
git commit -m "..."— the hooks re-validate; if rejected, read the hook's error output rather than guessing at the fix.
Examples
Valid:
feat(basicly): add fragment loader (basicly-idr)fix: correct sorting order in planner (basicly-abc)feat(basicly)!: remove deprecated config format (basicly-idr)fix: correct sorting order (basicly-idr, basicly-abc)docs: document the update flow (basicly-zrj.8)— dotted child id is allowed.
Invalid:
Fixed the bug— no type/colon.chore(scope): Message— description starts uppercase.feat: support Conventional Commits marker— description has an uppercase proper noun mid-string; must befeat: support conventional commits marker.fix: fix test_cli mutation bug— underscore isn't allowed; must befix: fix test-cli mutation bug.docs: update AGENTS.md for v0.1.0— dots and uppercase aren't allowed; must be reworded, e.g.docs: update agents-md for the first release.feat: add Font Awesome v4 icons— capitals aren't allowed; lowercase the subject (feat: add font awesome v4 icons) and keep the exact "Font Awesome v4" in the body.chore: restamp the install to 0.2.0— the dots aren't allowed; move the version to the body, e.g.chore: restamp the installwithRestamp to 0.2.0.in the body.fix: correct sorting order (not an id)— trailing parenthetical isn't an issue-id list.chore(word description): message— scope contains a space.
Guardrails
- This is a stricter-than-spec profile: it enforces the Conventional Commits v1.0.0 header structure plus the house description rules above (lowercase, restricted charset, no trailing punctuation). Passing plain CC is necessary but not sufficient.
- The same
commit-msg.pyandbeads-commit-msg.pyrun as your local git hook and in CI, so a subject that passes locally passes CI — but only if the hooks are actually installed. Runpre-commit install -t pre-commit -t commit-msg -t pre-pushonce per clone/worktree; an uninstalled hook silently lets a bad message through to CI. - Never bypass the hooks (
--no-verify) to force a non-conforming message through. - Never invent a beads issue id that doesn't exist in
.beads/issues.jsonl. - Merge commits and
Revert "..."auto-generated subjects are exempt from this format.
Enforcement
This format is mechanically enforced by:
.basicly/core/hooks/commit-msg.py— type/scope/!/description rules..basicly/core/hooks/beads-commit-msg.py— issue id presence and existence.
This skill exists to get the message right on the first attempt; the hooks are the
actual gate. basicly commit (src/basicly/commit.py) is the mechanical path to the
same result: it assembles the derivable envelope and applies the description rules
above before invoking git commit, so the rules below are what to reason about only
when a message has to be hand-composed.
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.