Skip to content

Conversation

@JacobPEvans
Copy link
Owner

@JacobPEvans JacobPEvans commented Feb 7, 2026

Summary

Adds pre-commit hooks and supporting configuration to enforce code quality standards, conventional commit messages, and branch naming conventions.

Changes

Pre-commit Hooks (.pre-commit-config.yaml)

  • File hygiene: YAML validation, trailing whitespace, line endings, merge conflicts, case conflicts
  • Markdown linting: markdownlint-cli2
  • Spell checking: cspell with project-specific allowlist
  • Link validation: markdown-link-check with retry and redirect handling
  • Commit messages: commitlint at commit-msg stage
  • Branch naming: commit-check at pre-push stage

Tool Configuration

File Purpose
.commitlintrc.yaml Conventional commit format — custom type list (adds breaking, removes build/revert/style), body-leading-blank and footer-leading-blank promoted to error
cchk.toml Branch naming — allows feat/, fix/, docs/, chore/, ci/, test/, refactor/, perf/, release/, hotfix/, claude/ prefixes plus main/develop
.cspell.json Spell checker — project word allowlist, ignores .git, node_modules, *.json, LICENSE
.markdown-link-check.json Link checker — retry on 429, accepts 2xx/3xx status codes, ignores # anchors and ../docs/ relative paths
.markdownlint.json Markdown rules — 160-char line length, 120 for headings, 200 for code blocks, siblings-only duplicate headings, allowed HTML elements

Other

  • Updated docs/CONTRIBUTING.md install instructions to include --hook-type commit-msg --hook-type pre-push
  • All hook versions pinned to latest: pre-commit-hooks v6.0.0, markdownlint-cli2 v0.20.0, cspell-cli v9.6.0, markdown-link-check v3.14.2, commitlint-pre-commit-hook v9.24.0, commit-check v2.4.1, @commitlint/config-conventional@20.4.1

Design Decisions

  • commitlint handles commit messages, commit-check handles branch names — no overlap
  • commitlint config only overrides 4 rules that differ from @commitlint/config-conventional defaults
  • body-max-line-length is a warning (not error) — v20+ ignores URL-containing lines
  • cchk.toml is auto-discovered by commit-check (default search path), no --config arg needed

Test Plan

  • All pre-commit hooks pass on commit
  • All pre-push hooks pass (including branch validation with correct config format)
  • cspell catches misspellings in TOML and YAML files
  • markdown-link-check ignores PR template relative paths

Closes #25, Closes #26, Closes #29, Closes #31, Closes #40, Closes #41, Closes #42

Copilot AI review requested due to automatic review settings February 7, 2026 19:03
Copy link

@ellipsis-dev ellipsis-dev bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Important

Looks good to me! 👍

Reviewed everything up to 7676081 in 7 seconds. Click for details.
  • Reviewed 285 lines of code in 6 files
  • Skipped 0 files when reviewing.
  • Skipped posting 0 draft comments. View those below.
  • Modify your settings and rules to customize what types of comments Ellipsis leaves. And don't forget to react with 👍 or 👎 to teach Ellipsis.

Workflow ID: wflow_39J2Cfqx5Fw1hdM0

You can customize Ellipsis by changing your verbosity settings, reacting with 👍 or 👎, replying to comments, or adding code review rules.

@gemini-code-assist
Copy link

Summary of Changes

Hello @JacobPEvans, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request significantly enhances the repository's development workflow by integrating a suite of code quality and consistency tools. It establishes robust configurations for commit message and branch naming conventions, alongside comprehensive pre-commit hooks for automated checks. The changes aim to improve code maintainability, readability, and adherence to project standards by catching issues early in the development cycle.

Highlights

  • Commit Message & Branch Validation: Introduced .commitlintrc.yaml to enforce conventional commit format with rules for type, scope, subject, header length, and body formatting. Additionally, cchk.toml was added to validate commit messages and branch naming conventions using regex, supporting a predefined set of conventional commit types.
  • Pre-commit Hooks Configuration: A new .pre-commit-config.yaml file sets up comprehensive pre-commit hooks. These include base file hygiene checks (YAML validation, trailing whitespace, line endings, merge conflict detection), Markdown linting via markdownlint-cli2, spell checking with cspell, link validation using markdown-link-check, and redundant commit message validation through commitlint and commit-check.
  • Enhanced Linting & Spell Check Configuration: The .markdownlint.json file was updated to enhance Markdown linting rules, introducing separate line length limits for headings and code blocks, duplicate heading validation, allowed HTML elements, and enforcing fenced code block style. New .cspell.json and .markdown-link-check.json files were added for project-specific spell checking with an allowlist and ignore patterns, and link checking with retry logic and timeout settings, respectively.
Changelog
  • .commitlintrc.yaml
    • Added configuration for commitlint to enforce conventional commit message standards.
    • Defined rules for commit type (enum, case, empty), scope (case), subject (case, empty, full stop), header max length (100), and body/footer leading blank and body max line length (200).
  • .cspell.json
    • Added a new spell checker configuration file.
    • Included a project-specific word allowlist for terms like 'commitlint', 'precommit', 'markdownlint', 'cspell', 'semver', etc.
    • Specified ignorePaths for common files and directories such as .git, node_modules, and various configuration file types (.json, .yml, .yaml, .toml, LICENSE).
  • .markdown-link-check.json
    • Added configuration for markdown-link-check to validate links within Markdown files.
    • Configured ignorePatterns for hash links, a timeout of '10s', retryOn429 to true, retryCount to 3, and aliveStatusCodes (200, 206, 301, 302).
  • .markdownlint.json
    • Modified existing Markdown linting rules.
    • Updated MD013 to include specific heading_line_length (120) and code_block_line_length (200).
    • Added MD024 with siblings_only: true for duplicate heading validation.
    • Included MD033 to allow specific HTML elements (br, details, summary, blockquote, sup).
    • Enabled MD041 to require the first line of a Markdown file to be a heading.
    • Added MD046 with style: "fenced" to enforce fenced code block styling.
  • .pre-commit-config.yaml
    • Added a new pre-commit configuration file to define automated hooks.
    • Included base hooks for file hygiene: check-yaml, end-of-file-fixer, trailing-whitespace, check-case-conflict, check-merge-conflict, and mixed-line-ending.
    • Integrated markdownlint-cli2 for Markdown linting.
    • Incorporated cspell for spell checking.
    • Added markdown-link-check for validating links in Markdown files, referencing .markdown-link-check.json.
    • Configured commitlint and commit-check to validate commit messages at the commit-msg stage.
  • cchk.toml
    • Added configuration for commit-check to enforce commit message and branch naming conventions.
    • Defined a regex for commit.message to ensure conventional commit types and a header length between 1 and 100 characters, along with a detailed error message.
    • Defined a regex for commit.branch to enforce branch naming conventions (e.g., feat/, fix/, main, develop), also with a detailed error message.
Activity
  • No human activity (comments, reviews, or progress updates) has been recorded on this pull request yet.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces a comprehensive set of development tools to enforce code quality, which is a great initiative. The configurations for commit message linting, pre-commit hooks, markdown linting, and spell checking are well-structured.

My review focuses on refining these configurations for better usability and correctness. Key feedback points include:

  • Correcting invalid version pins in .pre-commit-config.yaml which would prevent the hooks from being installed.
  • Removing redundant commit message validation to avoid confusion between commitlint and commit-check.
  • Adjusting commitlint rules to be less restrictive.
  • Improving the cspell configuration to actually check configuration files.
  • Minor enhancements to markdown linting and link checking rules.

Overall, these are excellent additions, and with a few adjustments, they will provide a solid foundation for maintaining code quality in the repository.

Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds repo-wide development tooling configuration intended to standardize commit conventions and run automated quality checks via pre-commit.

Changes:

  • Adds commit message and branch name validation via commitlint and commit-check.
  • Introduces a pre-commit hook set for YAML hygiene, Markdown linting, spell checking, link checking, and commit-msg validation.
  • Extends markdownlint settings and adds standalone configs for cspell and markdown-link-check.

Reviewed changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 6 comments.

Show a summary per file
File Description
cchk.toml Adds commit-check regex rules for commit messages and branch naming.
.pre-commit-config.yaml Defines pre-commit hooks for hygiene, linting, spell/link checks, and commit-msg validation.
.markdownlint.json Expands markdownlint rule configuration (lengths, headings, HTML allowlist, etc.).
.markdown-link-check.json Adds configuration for markdown-link-check behavior (ignore patterns, retries).
.cspell.json Adds cspell configuration with allowlist words and ignore paths.
.commitlintrc.yaml Adds commitlint rules enforcing conventional commit structure and limits.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

JacobPEvans pushed a commit that referenced this pull request Feb 7, 2026
Changes based on Gemini Code Assist and Copilot review of PR #58:

.pre-commit-config.yaml:
- Fix all rev versions to actual latest releases (v6.0.0, v0.20.0,
  v9.6.0, v3.14.2, v9.24.0, v2.4.1)
- Pin @commitlint/config-conventional to 19.8.0
- Simplify install comment to align with CONTRIBUTING.md
- Change commit-check to check-branch only (push stage)

.commitlintrc.yaml:
- Add 'breaking' to type-enum (matches CONTRIBUTING.md)
- Remove subject-case rule (too restrictive for acronyms)
- Lower body-max-line-length from 200 to 100

cchk.toml:
- Remove redundant [commit.message] section (commitlint handles this)
- Fix branch regex to match main/develop exactly and require
  prefix/ format for feature branches

.cspell.json:
- Remove 'endof' (unlikely to appear in prose)
- Keep 'precommit' (the whole point of cspell is to allow
  non-standard forms that ARE used in the project)
- Remove *.yml/*.yaml from ignorePaths so YAML descriptions
  get spell-checked

.markdown-link-check.json:
- Add 307/308 redirect status codes

.markdownlint.json:
- Add MD025 rule for single H1 per document

https://claude.ai/code/session_012pnq7NzqB4VkUyQTm9yc8u
Copy link

@ellipsis-dev ellipsis-dev bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Important

Looks good to me! 👍

Reviewed efe6137 in 10 seconds. Click for details.
  • Reviewed 182 lines of code in 6 files
  • Skipped 0 files when reviewing.
  • Skipped posting 0 draft comments. View those below.
  • Modify your settings and rules to customize what types of comments Ellipsis leaves. And don't forget to react with 👍 or 👎 to teach Ellipsis.

Workflow ID: wflow_DBaTPp6g1tR7MjZ4

You can customize Ellipsis by changing your verbosity settings, reacting with 👍 or 👎, replying to comments, or adding code review rules.

Copy link

@ellipsis-dev ellipsis-dev bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Important

Looks good to me! 👍

Reviewed f37051e in 8 seconds. Click for details.
  • Reviewed 13 lines of code in 1 files
  • Skipped 0 files when reviewing.
  • Skipped posting 0 draft comments. View those below.
  • Modify your settings and rules to customize what types of comments Ellipsis leaves. And don't forget to react with 👍 or 👎 to teach Ellipsis.

Workflow ID: wflow_EBWjZT6j0afXXOAe

You can customize Ellipsis by changing your verbosity settings, reacting with 👍 or 👎, replying to comments, or adding code review rules.

Copy link

@ellipsis-dev ellipsis-dev bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Important

Looks good to me! 👍

Reviewed b940ac1 in 10 seconds. Click for details.
  • Reviewed 41 lines of code in 3 files
  • Skipped 0 files when reviewing.
  • Skipped posting 0 draft comments. View those below.
  • Modify your settings and rules to customize what types of comments Ellipsis leaves. And don't forget to react with 👍 or 👎 to teach Ellipsis.

Workflow ID: wflow_qoZPf9YbqHYgmTnj

You can customize Ellipsis by changing your verbosity settings, reacting with 👍 or 👎, replying to comments, or adding code review rules.

@JacobPEvans
Copy link
Owner Author

Analytical Assessment: Is This the Best Approach?

What the PR Does Well

Clean tool separation — After the review fixes, each tool has a single responsibility:

  • commitlint → commit message format (commit-msg stage)
  • commit-check → branch naming only (pre-push stage)
  • cspell → spelling
  • markdownlint-cli2 → markdown formatting
  • markdown-link-check → link validation
  • pre-commit-hooks → file hygiene

No overlap. No redundancy. This is the right architecture.

Versions are all confirmed latest as of 2026-02-07:

Tool Version Status
pre-commit-hooks v6.0.0 Latest
markdownlint-cli2 v0.20.0 Latest
cspell-cli v9.6.0 Latest
markdown-link-check v3.14.2 Latest
commitlint-pre-commit-hook v9.24.0 Latest
commit-check v2.4.1 Latest
@commitlint/config-conventional 20.4.1 Latest

Commitlint config was simplified from 68 → 41 lines by removing 7 rules that just re-declared @commitlint/config-conventional defaults. Only 4 actual overrides remain (type-enum, body/footer-leading-blank promotion, body-max-line-length as warning).

What Was Fixed in This Pass

  1. commit-check wasn't reading cchk.toml — The check-branch hook was silently falling back to built-in defaults. Fixed by adding args: [--config, cchk.toml]. This means branch validation was not actually working before this fix.
  2. Deprecated stage name pushpre-push (pre-commit v4 compat).
  3. cspell caught 3 words in existing repo files (commitlintrc, agentsmd, frontmatter) — added to allowlist.
  4. Link checker false positives from PR template relative paths (../docs/LABELS.md) — these work on GitHub but not locally. Added ignore pattern.
  5. Removed *.toml from cspell ignorePaths so cchk.toml error messages get spell-checked.

Design Decision: body-max-line-length as Warning

Kept as warning (level 1) rather than error (level 2). With @commitlint/config-conventional v20+, body-max-line-length ignores lines containing URLs — so the 100-char limit won't block commits with long links. A warning catches genuine formatting issues without being a gate.

Could It Be Simpler?

The PR adds 5 new config files (+ enhances 1 existing). For a .github community health repo, this is justified:

  • The repo is primarily markdown — markdownlint, cspell, and link-check directly serve the content
  • Conventional commits are already documented in CONTRIBUTING.md — commitlint just enforces what's written
  • Branch naming matches the worktree conventions used across the organization

The only potential simplification would be removing commit-check entirely (branch naming could be a GitHub Action instead). But the local-first approach catches bad branch names before pushing, which is better UX.

Verdict: Good to merge. Clean separation, all latest versions, no redundancy, full pre-commit hook coverage verified (all hooks pass on push).

Copy link

@ellipsis-dev ellipsis-dev bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Important

Looks good to me! 👍

Reviewed 7b3cfe9 in 6 seconds. Click for details.
  • Reviewed 67 lines of code in 3 files
  • Skipped 0 files when reviewing.
  • Skipped posting 0 draft comments. View those below.
  • Modify your settings and rules to customize what types of comments Ellipsis leaves. And don't forget to react with 👍 or 👎 to teach Ellipsis.

Workflow ID: wflow_fIIUT5fSGbbUUC6C

You can customize Ellipsis by changing your verbosity settings, reacting with 👍 or 👎, replying to comments, or adding code review rules.

@JacobPEvans JacobPEvans changed the title Add development tooling configuration for code quality chore(.github): add pre-commit hooks and quality enforcement configs Feb 8, 2026
claude and others added 6 commits February 7, 2026 20:38
Add pre-commit framework configuration and supporting config files
that form the foundation for the Conventional Standards Enforcement
Framework (Epic #30).

New files:
- .pre-commit-config.yaml: Base hooks + commit-msg validation (#25, #26)
- .commitlintrc.yaml: Conventional commit rules (#29)
- cchk.toml: commit-check branch/message validation (#31)
- .cspell.json: Spell-check dictionary (#40)
- .markdown-link-check.json: Link checker config (#41)

Updated:
- .markdownlint.json: Enhanced rules for headings, code blocks,
  HTML elements, and fenced code style (#42)

Closes #25, Closes #26, Closes #29, Closes #31
Closes #40, Closes #41, Closes #42

https://claude.ai/code/session_012pnq7NzqB4VkUyQTm9yc8u
Changes based on Gemini Code Assist and Copilot review of PR #58:

.pre-commit-config.yaml:
- Fix all rev versions to actual latest releases (v6.0.0, v0.20.0,
  v9.6.0, v3.14.2, v9.24.0, v2.4.1)
- Pin @commitlint/config-conventional to 19.8.0
- Simplify install comment to align with CONTRIBUTING.md
- Change commit-check to check-branch only (push stage)

.commitlintrc.yaml:
- Add 'breaking' to type-enum (matches CONTRIBUTING.md)
- Remove subject-case rule (too restrictive for acronyms)
- Lower body-max-line-length from 200 to 100

cchk.toml:
- Remove redundant [commit.message] section (commitlint handles this)
- Fix branch regex to match main/develop exactly and require
  prefix/ format for feature branches

.cspell.json:
- Remove 'endof' (unlikely to appear in prose)
- Keep 'precommit' (the whole point of cspell is to allow
  non-standard forms that ARE used in the project)
- Remove *.yml/*.yaml from ignorePaths so YAML descriptions
  get spell-checked

.markdown-link-check.json:
- Add 307/308 redirect status codes

.markdownlint.json:
- Add MD025 rule for single H1 per document

https://claude.ai/code/session_012pnq7NzqB4VkUyQTm9yc8u
Bump from v19.8.0 to v20.4.1. The only breaking change in v20 is
that body-max-line-length now ignores lines containing URLs, which
is desirable behavior for this project.

https://claude.ai/code/session_012pnq7NzqB4VkUyQTm9yc8u
…rage

Remove 7 redundant rule declarations from .commitlintrc.yaml that
already match @commitlint/config-conventional defaults. Only 4 rules
that actually differ from defaults remain: type-enum, body-leading-blank,
footer-leading-blank, and body-max-line-length.

Remove *.toml from cspell ignorePaths so user-facing error messages
in cchk.toml get spell-checked. Add 'hotfix' to allowlist for the
branch naming regex.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add commitlintrc, agentsmd, frontmatter to cspell allowlist
  (words used in existing repo files caught by spell checker)
- Add ../docs/ ignore pattern to markdown-link-check config
  (PR templates use repo-relative paths that work on GitHub
  but not in local file resolution)
- Pass --config cchk.toml to check-branch hook so commit-check
  reads project config instead of falling back to built-in defaults
- Fix deprecated stage name: push → pre-push

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Critical fixes found during code review:

1. cchk.toml used wrong TOML section [commit.branch] with unsupported
   keys (regex, error). The tool reads config.get("branch", {}), expects
   allow_branch_types, allow_branch_names, conventional_branch. Rewrote
   to correct [branch] section format.

2. Pre-commit args [--config, cchk.toml] replaced the default [--branch]
   arg (pre-commit replaces, not merges). Without --branch, commit-check
   returned 0 without validating. Removed custom args since cchk.toml is
   auto-discovered from default search paths.

3. Install instructions said "pre-commit install" which only installs
   pre-commit hooks. commit-msg and pre-push stages need explicit
   --hook-type flags. Updated both .pre-commit-config.yaml header and
   docs/CONTRIBUTING.md.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@JacobPEvans JacobPEvans force-pushed the claude/combine-github-issues-rdNEz branch from 7b3cfe9 to e2e6949 Compare February 8, 2026 01:39
@JacobPEvans JacobPEvans merged commit e2e6949 into main Feb 8, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

2 participants