Jamie-BitFlight/commitlint

Lors de la configuration de la validation des messages de commit pour un projet. Lorsque le projet contient des fichiers commitlint.config.js ou .commitlintrc. Lors de la configuration de l'intégration continue/déploiement continu (CI/CD) pour imposer un format de commit. Lors de l'extraction de règles de commit pour la génération de prompts LLM. Lors du débogage d'erreurs de rejet de messages de commit.

Qu'est-ce que commitlint ?

Cette compétence permet de configurer et utiliser commitlint pour valider les messages de commit selon le format Conventional Commits. Elle est utile pour les développeurs et les équipes qui souhaitent standardiser les messages de commit dans un dépôt, en utilisant des configurations personnalisées ou partagées comme @commitlint/config-conventional. La compétence prend en charge la détection automatique des fichiers de configuration via cosmiconfig, propose des règles configurables avec des niveaux de sévérité (désactivé, avertissement, erreur) et s'intègre avec les hooks pre-commit et les pipelines CI/CD. Grâce à son architecture flexible, elle permet également d'extraire les règles de commitlint pour générer des prompts destinés aux modèles de langage (LLM) pour la génération automatisée de messages de commit.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Jamie-BitFlight/claude_skills/tree/main/plugins/commitlint/skills/commitlint

Installed? Explore more Développement et programmation skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Que fait commitlint ?

Valide les messages de commit au format Conventional Commits à l'aide de la configuration et des règles commitlint.

Quand utiliser cette compétence

Utilisez cette compétence lorsque :

  • Vous configurez commitlint pour un dépôt
  • Vous configurez des règles commitlint et des configurations partageables
  • Vous intégrez commitlint avec des hooks pre-commit ou des pipelines CI/CD
  • Vous extrayez des règles de la configuration commitlint pour générer des invites LLM pour la génération de messages de commit
  • Vous validez programmatiquement des messages de commit
  • Vous résolvez des problèmes de configuration ou de validation commitlint
  • Vous comprenez la syntaxe des règles commitlint et les niveaux de sévérité
  • Vous détectez les fichiers de configuration commitlint dans un dépôt

Fonctionnalités principales

Détection de configuration

Commitlint utilise cosmiconfig pour trouver les fichiers de configuration dans cet ordre de priorité :

Fichiers de configuration dédiés :

.commitlintrc
.commitlintrc.json
.commitlintrc.yaml
.commitlintrc.yml
.commitlintrc.js
.commitlintrc.cjs
.commitlintrc.mjs
.commitlintrc.ts
.commitlintrc.cts
commitlint.config.js
commitlint.config.cjs
commitlint.config.mjs
commitlint.config.ts
commitlint.config.cts

Fichiers de package :

  • package.json avec le champ commitlint
  • package.yaml (PNPM) avec le champ commitlint

Formats de configuration

JavaScript ES Modules (Recommandé) :

// commitlint.config.js ou commitlint.config.mjs
export default {
  extends: ['@commitlint/config-conventional'],
};

TypeScript :

// commitlint.config.ts
import type { UserConfig } from '@commitlint/types';
import { RuleConfigSeverity } from '@commitlint/types';

const config: UserConfig = {
  extends: ['@commitlint/config-conventional'],
  rules: {
    'type-enum': [RuleConfigSeverity.Error, 'always', ['feat', 'fix', 'docs']],
  },
};

export default config;

JSON :

{
  "extends": ["@commitlint/config-conventional"]
}

YAML :

extends:
  - "@commitlint/config-conventional"

Configuration des règles

Les règles sont configurées sous forme de tableaux : [niveau, applicabilité, valeur]

Niveaux de sévérité :

NiveauSignificationEnum TypeScript
0DésactivéeRuleConfigSeverity.Disabled
1AvertissementRuleConfigSeverity.Warning
2ErreurRuleConfigSeverity.Error

Applicabilité :

  • 'always' - La règle doit correspondre
  • 'never' - La règle ne doit pas correspondre

Exemples de règles :

rules: {
  // Erreur si le type n'est pas dans l'énumération
  'type-enum': [2, 'always', ['feat', 'fix', 'docs', 'style', 'refactor', 'perf', 'test', 'build', 'ci', 'chore', 'revert']],

  // Erreur si le type est vide
  'type-empty': [2, 'never'],

  // Erreur si le sujet est vide
  'subject-empty': [2, 'never'],

  // Erreur si l'en-tête dépasse 100 caractères
  'header-max-length': [2, 'always', 100],

  // Erreur si le sujet se termine par un point
  'subject-full-stop': [2, 'never', '.'],

  // Avertissement si le corps n'a pas de ligne vide initiale
  'body-leading-blank': [1, 'always'],
}

Configurations courantes

@commitlint/config-conventional

La configuration partageable la plus utilisée. Règles par défaut avec niveau d'erreur :

RègleConfigurationExemple réussiExemple échoué
type-enum['build', 'chore', 'ci', 'docs', 'feat', 'fix', 'perf', 'refactor', 'revert', 'style', 'test']fix: messagefoo: message
type-case'lowerCase'fix: messageFIX: message
type-emptyneverfix: message: message
subject-casenever + ['sentence-case', 'start-case', 'pascal-case', 'upper-case']fix: some messagefix: Some Message
subject-emptyneverfix: messagefix:
subject-full-stopnever, '.'fix: messagefix: message.
header-max-length100En-tête courtEn-tête > 100 car.
body-leading-blankalways (avertissement)Ligne vide avant le corpsPas de ligne vide
body-max-line-length100Lignes <= 100 car.Ligne > 100 car.
footer-leading-blankalways (avertissement)Ligne vide avant le piedPas de ligne vide
footer-max-line-length100Lignes <= 100 car.Ligne > 100 car.

Schéma de configuration complet

// commitlint.config.js
export default {
  // Étendre les configurations partageables (résolues via la résolution de modules node)
  extends: ['@commitlint/config-conventional'],

  // Présélection d'analyseur pour analyser les messages de commit
  parserPreset: 'conventional-changelog-atom',

  // Formateur de sortie
  formatter: '@commitlint/format',

  // Règles personnalisées (remplacent les règles héritées)
  rules: {
    'type-enum': [2, 'always', ['feat', 'fix', 'docs', 'style', 'refactor', 'test', 'chore']],
  },

  // Fonctions qui renvoient true pour ignorer des commits spécifiques
  // Fusionnées avec les ignorations par défaut (commits de fusion, retours, tags semver)
  ignores: [(commit) => commit.includes('WIP')],

  // Utiliser ou non les motifs d'ignorance par défaut
  // Motifs par défaut : 'Merge pull request', 'Revert X', 'v1.2.3', etc.
  defaultIgnores: true,

  // URL d'aide personnalisée affichée en cas d'échec
  helpUrl: 'https://example.com/commit-guidelines',

  // Configuration de l'invite (pour @commitlint/cz-commitlint)
  prompt: {
    messages: {},
    questions: {
      type: {
        description: 'Sélectionnez le type de changement :',
      },
    },
  },
};

Utilisation en CLI

Installation

# npm
npm install -D @commitlint/cli @commitlint/config-conventional

# yarn
yarn add -D @commitlint/cli @commitlint/config-conventional

# pnpm
pnpm add -D @commitlint/cli @commitlint/config-conventional

Commandes courantes

# Analyser le dernier commit
npx commitlint --last

# Analyser une plage de commits
npx commitlint --from HEAD~5

# Analyser à partir d'un commit spécifique
npx commitlint --from abc1234

# Analyser un message depuis l'entrée standard
echo "feat: add feature" | npx commitlint

# Analyser un message depuis un fichier
npx commitlint < .git/COMMIT_EDITMSG

# Analyser avec le drapeau edit (lit .git/COMMIT_EDITMSG)
npx commitlint --edit

# Analyser avec un chemin de configuration personnalisé
npx commitlint --config ./custom-commitlint.config.js

# Afficher la configuration résolue
npx commitlint --print-config

# Mode strict (les avertissements deviennent un code de sortie 2)
npx commitlint --last --strict

Codes de sortie

CodeSignification
0Succès (aucune erreur)
1Erreurs d'analyse trouvées
2Avertissements trouvés (mode strict)
3Erreurs trouvées (mode strict)
9Fichier de configuration manquant (avec -g)

Référence des règles

Règles de type

RègleConditionApplicabilité par défaut
type-enumtype se trouve dans la valeuralways
type-casetype est en casse valeuralways, 'lower-case'
type-emptytype est videnever
type-max-lengthtype a valeur ou moins de car.always, Infinity
type-min-lengthtype a valeur ou plus de car.always, 0

Règles de sujet

RègleConditionApplicabilité par défaut
subject-casesubject est en casse valeuralways
subject-emptysubject est videnever
subject-full-stopsubject se termine par valeurnever, '.'
subject-max-lengthsubject a valeur ou moins de car.always, Infinity
subject-min-lengthsubject a valeur ou plus de car.always, 0
subject-exclamation-marksubject a un point d'exclamation avant :never

Règles de portée

RègleConditionApplicabilité par défaut
scope-enumscope se trouve dans la valeuralways, []
scope-casescope est en casse valeuralways, 'lower-case'
scope-emptyscope est videnever
scope-max-lengthscope a valeur ou moins de car.always, Infinity
scope-min-lengthscope a valeur ou plus de car.always, 0

Règles d'en-tête

RègleConditionApplicabilité par défaut
header-caseheader est en casse valeuralways, 'lower-case'
header-full-stopheader se termine par valeurnever, '.'
header-max-lengthheader a valeur ou moins de car.always, 72
header-min-lengthheader a valeur ou plus de car.always, 0
header-trimheader n'a pas d'espace début/finalways

Règles de corps

RègleConditionApplicabilité par défaut
body-leading-blankbody commence par une ligne videalways
body-emptybody est videnever
body-max-lengthbody a valeur ou moins de car.always, Infinity
body-max-line-lengthLes lignes de body ont valeur ou moins de car. (URL exclues)always, Infinity
body-min-lengthbody a valeur ou plus de car.always, 0
body-casebody est en casse valeuralways, 'lower-case'
body-full-stopbody se termine par valeurnever, '.'

Règles de pied

RègleConditionApplicabilité par défaut
footer-leading-blankfooter commence par une ligne videalways
footer-emptyfooter est videnever
footer-max-lengthfooter a valeur ou moins de car.always, Infinity
footer-max-line-lengthLes lignes de footer ont valeur ou moins de car.always, Infinity
footer-min-lengthfooter a valeur ou plus de car.always, 0

Valeurs de casse

Pour les règles qui vérifient la casse (*-case) :

[
  'lower-case',    // minuscules
  'upper-case',    // MAJUSCULES
  'camel-case',    // camelCase
  'kebab-case',    // kebab-case
  'pascal-case',   // PascalCase
  'sentence-case', // Phrase
  'snake-case',    // snake_case
  'start-case',    // Commencer Par Maj
]

Utilisation programmatique

Chargement de la configuration

import load from '@commitlint/load';

async function getCommitlintConfig() {
  const config = await load();
  console.log(config.rules);
  return config;
}

Validation d'un message

import load from '@commitlint/load';
import lint from '@commitlint/lint';

async function validateMessage(message) {
  const config = await load();
  const result = await lint(message, config.rules);

  return {
    valid: result.valid,
    errors: result.errors,
    warnings: result.warnings,
  };
}

Modèles d'intégration LLM

Extraire les règles pour la génération d'invite

Générer des contraintes adaptées aux LLM à partir de la configuration commitlint :

def extract_rules_for_prompt(config: dict) -> str:
    """Extrait les règles commitlint dans un format adapté aux LLM."""
    rules = config.get("rules", {})
    prompt_parts = []

    # Extraire type-enum s'il est présent
    if "type-enum" in rules:
        level, applicability, types = rules["type-enum"]
        if level > 0 and applicability == "always":
            prompt_parts.append(f"Types de commit autorisés : {', '.join(types)}")

    # Extraire scope-enum s'il est présent
    if "scope-enum" in rules:
        level, applicability, scopes = rules["scope-enum"]
        if level > 0 and applicability == "always":
            prompt_parts.append(f"Portées autorisées : {', '.join(scopes)}")

    # Extraire les limites de longueur
    if "header-max-length" in rules:
        level, applicability, max_len = rules["header-max-length"]
        if level > 0 and applicability == "always":
            prompt_parts.append(f"Longueur maximale de l'en-tête : {max_len} caractères")

    # Extraire les vérifications de contenu
    if "subject-empty" in rules:
        level, applicability = rules["subject-empty"]
        if level > 0 and applicability == "never":
            prompt_parts.append("Le sujet ne doit pas être vide")

    if "type-empty" in rules:
        level, applicability = rules["type-empty"]
        if level > 0 and applicability == "never":
            prompt_parts.append("Le type ne doit pas être vide")

    return "\n".join(prompt_parts)

Construire une invite LLM pour la génération de messages de commit

def build_commit_prompt(config: dict, diff_context: str) -> str:
    """Construit une invite pour un LLM afin de générer un message de commit valide."""
    rules_text = extract_rules_for_prompt(config)

    return f"""Générer un message de commit au format Conventional Commits.

Règles :
{rules_text}

Contexte du diff :
{diff_context}

Format attendu :
<type>(<portée>): <sujet>

<corps optionnel>

<pied optionnel>
"""

Intégration CI/CD

Intégration avec Husky et lint-staged

# Installer Husky
npx husky init

# Ajouter un hook pre-commit
npx husky add .husky/pre-commit "npx lint-staged"

package.json :

{
  "lint-staged": {
    "*.{js,ts,tsx}": ["eslint --fix", "prettier --write"],
    "*.{md,json,yaml}": ["prettier --write"]
  }
}

Hook commit-msg

# .husky/commit-msg
echo "${1}" | npx commitlint --edit "${1}"

Utilisation avec GitHub Actions

name: Valider les messages de commit
on: [pull_request]

jobs:
  commitlint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
        with:
          fetch-depth: 0
      - uses: actions/setup-node@v3
        with:
          node-version: 18
      - run: npm ci
      - name: Analyser la plage de commits
        run: npx commitlint --from ${{ github.event.pull_request.base.sha }} --to ${{ github.event.pull_request.head.sha }} --verbose

Utilisation avec GitLab CI

stages:
  - validation

commitlint:
  stage: validation
  image: node:18
  script:
    - npm ci
    - npx commitlint --from $CI_MERGE_REQUEST_DIFF_BASE_SHA --to $CI_MERGE_REQUEST_DIFF_HEAD_SHA
  only:
    - merge_requests

Dépannage

Problèmes courants

  1. Fichier de configuration non trouvé

    • Vérifier que le fichier de configuration existe dans le répertoire racine
    • Utiliser npx commitlint --print-config pour voir la configuration résolue
  2. Règles non appliquées

    • Vérifier l'ordre de résolution des fichiers de configuration
    • Utiliser le paramètre extends correctement
  3. Erreurs de commutation de version

    • Exécuter npx commitlint --version pour vérifier la version installée
    • Mettre à jour @commitlint/cli et les configurations partagées
  4. Problèmes de hook

    • Vérifier que les hooks sont installés : npx husky install
    • Vérifier les permissions des hooks : chmod +x .husky/*

Obtenir de l'aide

  • Vérifier la configuration : npx commitlint --print-config
  • Exécuter avec sortie verbeuse pour plus de détails : npx commitlint --last --verbose
  • Consulter la documentation du projet : https://commitlint.js.org

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

Jamie-BitFlight/agentskill-kaizen-meta-docs

Agentskill kaizen plugin documentation index. Load when needing to read about cross-platform notes, improvement plans, or DuckDB integration.

Jamie-BitFlight/bash-51-features

Bash 5.1 release features and improvements with practical examples. Use when working with Bash 5.1 features, epoch time variables, redirection enhancements, or when user asks about Bash 5.1 changes, new features, or version-specific capabilities.

Jamie-BitFlight/bash-52-features

Bash 5.2 release features and improvements with practical examples. Use when working with Bash 5.2 features, variable handling enhancements, readline improvements, or when user asks about Bash 5.2 changes, new features, or version-specific capabilities.

Jamie-BitFlight/bash-53-features

Bash 5.3 release features and improvements with practical examples. Use when working with Bash 5.3 features, new command substitution, GLOBSORT, loadable builtins, or when user asks about Bash 5.3 changes, new features, or version-specific capabilities.

Jamie-BitFlight/bash-development

This skill should be used when the user asks to "write a bash script", "create a shell script", "implement bash function", "parse arguments in bash", "handle errors in bash", or mentions bash development, shell scripting, script templates, or modern bash patterns.

Jamie-BitFlight/bash-lint

This skill should be used when the user asks to "lint bash script", "run shellcheck", "format shell script", "use shfmt", "fix shellcheck errors", or mentions shell script linting, formatting, code quality, or pre-commit hooks for bash.

Jamie-BitFlight/bash-logging

This skill should be used when the user asks to "add logging to bash script", "colorize output", "implement log levels", "CI/CD sections", "terminal colors in bash", or mentions logging functions, emoji output, collapsible CI sections, or shlocksmith.

Jamie-BitFlight/bash-portability

This skill should be used when the user asks about "POSIX compatibility", "portable shell scripts", "cross-shell compatibility", "bashisms", "shebang selection", or mentions writing scripts that work on different shells (bash, sh, dash, zsh) or different systems.

Jamie-BitFlight/bash-testing

This skill should be used when the user asks to "test bash script", "write shell tests", "use shunit2", "use shellspec", "create test suite for bash", or mentions unit testing, test frameworks, mocking, or test-driven development for shell scripts.

Jamie-BitFlight/brainstorming-skill

You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or when users request help with ideation, marketing, and strategic planning. Explores user intent, requirements, and design before implementation using research-validated prompt patterns.

Jamie-BitFlight/clang-format

Configure clang-format code formatting. Use when: user mentions clang-format or .clang-format, analyzing code style/patterns, creating/modifying formatting config, troubleshooting formatting, brace styles/indentation/spacing/alignment/pointer alignment, or codifying conventions.

Jamie-BitFlight/conventional-commits

When writing a git commit message. When task completes and changes need committing. When project uses semantic-release, commitizen, git-cliff. When choosing between feat/fix/chore/docs types. When indicating breaking changes. When generating changelogs from commit history.

Jamie-BitFlight/dasel-reference

Use when querying, modifying, or converting JSON, YAML, TOML, XML, CSV, HCL, or INI with dasel v3. Complete reference for selectors, functions, conditionals, variables, spread operator, type casting, and format-specific patterns.

Jamie-BitFlight/data-exploration

Use when exploring unknown structured data files with dasel v3 — discover schema, list keys, find nested values, sample arrays, identify data types across JSON, YAML, TOML, XML, CSV, HCL, INI formats

Jamie-BitFlight/data-transformation

Use when modifying, converting, or transforming structured data with dasel v3 — in-place mutations, format conversion, batch operations, array manipulation, object construction, and merge patterns across JSON, YAML, TOML, XML, CSV, HCL, INI

Jamie-BitFlight/delegate

Decompose substantive work into phases, dispatch each phase to a sub-agent, and adjudicate what comes back. Use whenever a request asks for implementation, investigation, a fix, a review, or any change to files — including small ones — and whenever you are about to read source or run a diagnostic yourself instead of handing it off. Also use when a report from a sub-agent needs judging, when a phase needs re-dispatching, or when a user names one instance of a pattern. Does not apply when your own prompt begins "Your ROLE_TYPE is sub-agent." — then follow references/sub-agent-contract.md instead.

Jamie-BitFlight/enterprise-hibernate-hbm

Dasel v3 query patterns for Hibernate .hbm.xml mapping files — entity-table binding, Java property-to-column extraction, one-to-many set/list/bag relationship tracing, many-to-one foreign key discovery, batch scanning across 60+ HBM files. Use when querying Hibernate ORM class mappings, extracting schema metadata from Java persistence layer, or auditing entity-column relationships in enterprise legacy codebases.

Jamie-BitFlight/enterprise-installanywhere

Dasel v3 query patterns for InstallAnywhere .iap_xml installer definitions — use when querying action sequences, discovering variables, resolving platform conditions, navigating panels, or comparing installer variants. Files are 2.5+ MB, 65,000+ lines — too large for context reads, requires structural dasel queries.

Jamie-BitFlight/enterprise-maven-pom

Dasel v3 selector patterns for Maven POM XML files — use when querying dependency versions, filtering by groupId or scope, extracting module hierarchy from parent POMs, or detecting version conflicts across enterprise multi-module Java projects. Load this skill when working with pom.xml files using dasel.

Jamie-BitFlight/enterprise-spring-xml

Dasel v3 selectors for Spring bean factory XML — use when querying any Spring ApplicationContext XML for bean discovery, dependency wiring, JMS destination mapping, property injection extraction, or cross-bean reference tracing. Load this skill before writing dasel selectors against Spring bean XML files (applicationContext.xml, *_beans.xml, spring-*.xml).

Skills associés