Skip to content
Skillv1.0.0

commit-validator

Validates commit messages against Conventional Commits specification using programmatic validation. Replaces the git-conventional-commit-messages text file with a tool that provides instant feedback.

by oimiragieo(0) 0 installs
Free
Sign in to install

Free account. Installing gives you the manifest plus copy-paste snippets.

See reviews

About

Imported from oimiragieo/agent-studio (.claude/skills/commit-validator/SKILL.md). Install upstream with npx skills add oimiragieo/agent-studio --skill commit-validator. Copyright stays with the author.

References (archive): SCAFFOLD_SKILLS_ARCHIVE_MAP.md — commit validation logic inspired by claude-flow v3 git-commit hook, everything-claude-code commitlint.

Step 1: Validate Commit Message

Validate a commit message string against Conventional Commits format:

Format: <type>(<scope>): <subject>

Types:

  • feat: A new feature
  • fix: A bug fix
  • docs: Documentation only changes
  • style: Code style changes (formatting, etc.)
  • refactor: Code refactoring
  • perf: Performance improvements
  • test: Adding or updating tests
  • chore: Maintenance tasks
  • ci: CI/CD changes
  • build: Build system changes
  • revert: Reverting a previous commit

Validation Rules:

  1. Must start with type (required)
  2. Scope is optional (in parentheses)
  3. Subject is required (after colon and space)
  4. Use imperative, present tense ("add" not "added")
  5. Don't capitalize first letter
  6. No period at end
  7. Can include body and footer (separated by blank line) </execution_process>

Use this regex pattern for validation:

const CONVENTIONAL_COMMIT_REGEX =
  /^(feat|fix|docs|style|refactor|perf|test|chore|ci|build|revert)(\(.+\))?: .{1,72}/;

function validateCommitMessage(message) {
  const lines = message.trim().split('\n');
  const header = lines[0];

  // Check format
  if (!CONVENTIONAL_COMMIT_REGEX.test(header)) {
    return {
      valid: false,
      error: 'Commit message does not follow Conventional Commits format',
    };
  }

  // Check length
  if (header.length > 72) {
    return {
      valid: false,
      error: 'Commit header exceeds 72 characters',
    };
  }

  return { valid: true };
}

</code_example>

<code_example> Valid Examples:

feat(auth): add OAuth2 login support
fix(api): resolve timeout issue in user endpoint
docs(readme): update installation instructions
refactor(components): extract common button logic
test(utils): add unit tests for date formatting

</code_example>

<code_example> Invalid Examples:

Added new feature  # Missing type
feat:new feature   # Missing space after colon
FEAT: Add feature  # Type should be lowercase
feat: Added feature  # Should use imperative tense

</code_example>

<code_example> Pre-commit Hook (.git/hooks/pre-commit):

#!/bin/bash
commit_msg=$(git log -1 --pretty=%B)
if ! node .claude/tools/cli/validate-commit.mjs "$commit_msg"; then
  echo "Commit message validation failed"
  exit 1
fi

</code_example>

<code_example> CI/CD Integration:

# .github/workflows/validate-commits.yml
- name: Validate commit messages
  run: |
    git log origin/main..HEAD --pretty=%B | while read msg; do
      node .claude/tools/cli/validate-commit.mjs "$msg" || exit 1
    done

</code_example>

Returns structured validation result:

{
  "valid": true,
  "type": "feat",
  "scope": "auth",
  "subject": "add OAuth2 login support",
  "warnings": []
}

Or for invalid messages:

{
  "valid": false,
  "error": "Commit message does not follow Conventional Commits format",
  "suggestions": [
    "Use format: <type>(<scope>): <subject>",
    "Valid types: feat, fix, docs, style, refactor, perf, test, chore, ci, build, revert"
  ]
}

</formatting_example>

# Validate a commit message
node .claude/tools/cli/validate-commit.mjs "feat(auth): implement jwt login"

# Validate from stdin (e.g. in a hook)
echo "fix: incorrect variable name" | node .claude/tools/cli/validate-commit.mjs

</usage_example>

Iron Laws

  1. ALWAYS validate commit messages in both pre-commit hook and CI — pre-commit catches local violations; CI catches cases where the hook was bypassed or not installed; both layers are required.
  2. NEVER accept commit messages without a type prefix — conventional commit format (type: subject) is the foundation; messages without a type are unparseable for changelog generation and semantic versioning.
  3. ALWAYS enforce subject line length limit (72 characters) — subjects over 72 characters are truncated in git log --oneline and GitHub PR views; conciseness is enforced, not just encouraged.
  4. NEVER block commits for body/footer format issues — only type, subject, and length are blocking; optional sections (body, footer, co-authorship) should warn, not block.
  5. ALWAYS provide the correct format example in rejection messages — error messages without examples cause developers to guess the format; show feat: add user authentication alongside every rejection.

Anti-Patterns

Anti-Pattern Why It Fails Correct Approach
Validating only in CI (not pre-commit) Developers don't discover format issues until after push Add pre-commit hook for local instant feedback
Blocking on body/footer format Excessive friction leads developers to bypass hooks Only block on missing type prefix and subject length
Rejection without format example Developer must guess the correct format Always show a passing example in the error message
Allowing freeform subject without type Breaks changelog generation and semantic versioning Require type: subject format unconditionally
Single-line validation (no body check) Missing Co-Authored-By and footer go undetected Validate presence of required footers when configured

Memory Protocol (MANDATORY)

Before starting: Read .claude/context/memory/learnings.md

After completing:

  • New pattern -> .claude/context/memory/learnings.md
  • Issue found -> .claude/context/memory/issues.md
  • Decision made -> .claude/context/memory/decisions.md

ASSUME INTERRUPTION: If it's not in memory, it didn't happen.

Use it

Copy one of these into your project. Installing also returns the manifest and these snippets.

yaml
targets:
  - https://api.opensmartroute.ai/api/v1/registry/oimiragieo-agent-studio-commit-validator/manifest   # or paste the manifest below

Manifest

An Open Capability Manifest: the router reads it to know what this does, what it costs and when to pick it.

oimiragieo-agent-studio-commit-validator.ocm.jsonjson
{
  "ocm": "1",
  "id": "oimiragieo-agent-studio-commit-validator",
  "kind": "skill",
  "name": "commit-validator",
  "description": "Validates commit messages against Conventional Commits specification using programmatic validation. Replaces the git-conventional-commit-messages text file with a tool that provides instant feedback.",
  "publisher": "oimiragieo",
  "version": "1.0.0",
  "capabilities": {
    "domains": [
      "coding"
    ],
    "tags": [
      "skill-md",
      "git",
      "commit",
      "conventional-commits",
      "validation",
      "pre-commit",
      "skills-sh"
    ],
    "languages": [
      "en"
    ]
  },
  "quality_prior": 0.6,
  "examples": [
    "Validates commit messages against Conventional Commits specification using programmatic validation. Replaces the git-conventional-commit-messages text file with a tool that provides instant feedback."
  ],
  "primary": false,
  "metadata": {
    "source": {
      "provider": "skills.sh",
      "repository": "https://github.com/oimiragieo/agent-studio",
      "path": ".claude/skills/commit-validator/SKILL.md",
      "ref": "HEAD",
      "url": "https://github.com/oimiragieo/agent-studio/blob/HEAD/.claude/skills/commit-validator/SKILL.md",
      "key": "oimiragieo/agent-studio/.claude/skills/commit-validator/SKILL.md"
    }
  },
  "instructions": "**References (archive):** [SCAFFOLD_SKILLS_ARCHIVE_MAP.md](../../docs/SCAFFOLD_SKILLS_ARCHIVE_MAP.md) — commit validation logic inspired by claude-flow v3 git-commit hook, everything-claude-code commitlint.\n\n<identity>\nCommit Message Validator - Programmatically validates commit messages against the [Conventional Commits](https://www.conventionalcommits.org/) specification.\n</identity>\n\n<capabilities>\n- Before committing code\n- In pre-commit hooks\n- In CI/CD pipelines\n- During code review\n- To enforce team standards\n</capabilities>\n\n<instructions>\n<execution_process>\n\n### Step 1: Validate Comm",
  "cost": {
    "context_tokens": 1744
  }
}

Fetch it by URL: GET /api/v1/registry/oimiragieo-agent-studio-commit-validator/manifest?version=1.0.0

Reviews

Star ratings from people who tried it. One review per account; edit yours any time.

No reviews yet. Install it, try it, and be the first to rate it.