Skip to content

feat(commits): support breaking-change marker and preserve git footers - #197

Open
iamlasse wants to merge 2 commits into
marcus:mainfrom
iamlasse:feat/commit-normalize-breaking-change
Open

feat(commits): support breaking-change marker and preserve git footers#197
iamlasse wants to merge 2 commits into
marcus:mainfrom
iamlasse:feat/commit-normalize-breaking-change

Conversation

@iamlasse

@iamlasse iamlasse commented Jul 26, 2026

Copy link
Copy Markdown

Summary

Closes two real Conventional Commits spec gaps in the existing normalizer (internal/commits/normalizer.go), which previously rejected the breaking-change marker as an unknown type and reflowed structured git footers into prose.

Breaking-change marker

  • Parse the ! marker that sits between the type/scope and the colon — feat!: and feat(scope)!: — in parseHeader, and carry a breaking flag through formatHeader so the canonical form preserves it. Without this, feat! was consumed into the type and rejected as unknown.
  • Accept the revert type.

Footer preservation

  • Detect a trailing footer block — paragraphs whose every line is a git footer (Fixes #123, BREAKING CHANGE:, Reviewed-by:, project trailers like Nightshift-Task:) — and emit it verbatim instead of hard-wrapping it. Prose paragraphs are still wrapped at 72 columns; only the structured trailer block is left untouched.

Tests & docs

  • Table-driven tests for the ! marker (with/without scope), revert, footer preservation, footer-line shape detection, and feat!: round-tripping; Normalize confirmed idempotent on all new forms.
  • New Commit messages section in README.md documenting <type>(<scope>)!: <subject>, the allowed type set, subject length, and how nightshift commit normalize / the commit-msg hook consume it.
  • commit-msg.sh help text now advertises ! and revert.

gofmt, go vet ./..., and go test ./... are green.

Nightshift-Task: commit-normalize
Nightshift-Ref: https://github.com/marcus/nightshift


Automated by nightshift

iamlasse added 2 commits June 28, 2026 02:10
Add internal/commits with pure Normalize/validate functions enforcing the project's Conventional Commits rules (known type set, lowercase type, lowercase subject, 72-char subject limit, whitespace trimming, and 72-column body wrapping). Wire it into the CLI as 'nightshift commit normalize' (positional, --file, and stdin sources; --check to validate only), ship a commit-msg git hook under scripts/, and document the format and installation in docs/commit-messages.md.

Nightshift-Task: commit-normalize
Nightshift-Ref: https://github.com/marcus/nightshift
Extend the Conventional Commits normalizer to close two spec gaps: the
breaking-change marker is now parsed and preserved, and structured git
footers are emitted verbatim instead of being reflowed into prose.

- parse the "!" breaking marker after the type or scope (feat!: /
feat(scope)!:) and round-trip it through the canonical header so the
marker survives normalization - accept the "revert" type - detect a
trailing footer block (Fixes marcus#123, BREAKING CHANGE:, Reviewed-by:,
project trailers) and emit it verbatim, while prose paragraphs are still
hard-wrapped at 72 columns - add table-driven tests for the new forms
and confirm Normalize stays idempotent - document the format and the CLI
/ commit-msg hook usage in README.md - update the commit-msg hook help
text to advertise "!" and "revert"

Nightshift-Task: commit-normalize
Nightshift-Ref: https://github.com/marcus/nightshift
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant