{"id":"3219b13f-85a5-4d1c-9538-cff5dc42093e","shortId":"nknTjQ","kind":"skill","title":"git-hooks-automation","tagline":"Master Git hooks setup with Husky, lint-staged, pre-commit framework, and commitlint. Automate code quality gates, formatting, linting, and commit message enforcement before code reaches CI.","description":"# Git Hooks Automation\n\nAutomate code quality enforcement at the Git level. Set up hooks that lint, format, test, and validate before commits and pushes ever reach your CI pipeline — catching issues in seconds instead of minutes.\n\n## When to Use This Skill\n\n- User asks to \"set up git hooks\" or \"add pre-commit hooks\"\n- Configuring Husky, lint-staged, or the pre-commit framework\n- Enforcing commit message conventions (Conventional Commits, commitlint)\n- Automating linting, formatting, or type-checking before commits\n- Setting up pre-push hooks for test runners\n- Migrating from Husky v4 to v9+ or adopting hooks from scratch\n- User mentions \"pre-commit\", \"commit-msg\", \"pre-push\", \"lint-staged\", or \"githooks\"\n\n## Git Hooks Fundamentals\n\nGit hooks are scripts that run automatically at specific points in the Git workflow. They live in `.git/hooks/` and are not version-controlled by default — which is why tools like Husky exist.\n\n### Hook Types & When They Fire\n\n| Hook | Fires When | Common Use |\n|---|---|---|\n| `pre-commit` | Before commit is created | Lint, format, type-check staged files |\n| `prepare-commit-msg` | After default msg, before editor | Auto-populate commit templates |\n| `commit-msg` | After user writes commit message | Enforce commit message format |\n| `post-commit` | After commit is created | Notifications, logging |\n| `pre-push` | Before push to remote | Run tests, check branch policies |\n| `pre-rebase` | Before rebase starts | Prevent rebase on protected branches |\n| `post-merge` | After merge completes | Install deps, run migrations |\n| `post-checkout` | After checkout/switch | Install deps, rebuild assets |\n\n### Native Git Hooks (No Framework)\n\n```bash\n# Create a pre-commit hook manually\ncat > .git/hooks/pre-commit << 'EOF'\n#!/bin/sh\nset -e\n\n# Run linter on staged files only\nSTAGED_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep -E '\\.(js|ts|jsx|tsx)$' || true)\n\nif [ -n \"$STAGED_FILES\" ]; then\n  echo \"🔍 Linting staged files...\"\n  echo \"$STAGED_FILES\" | xargs npx eslint --fix\n  echo \"$STAGED_FILES\" | xargs git add  # Re-stage after fixes\nfi\nEOF\nchmod +x .git/hooks/pre-commit\n```\n\n**Problem**: `.git/hooks/` is local-only and not shared with the team. Use a framework instead.\n\n## Husky + lint-staged (Node.js Projects)\n\nThe modern standard for JavaScript/TypeScript projects. Husky manages Git hooks; lint-staged runs commands only on staged files for speed.\n\n### Quick Setup (Husky v9+)\n\n```bash\n# Install\nnpm install --save-dev husky lint-staged\n\n# Initialize Husky (creates .husky/ directory)\nnpx husky init\n\n# The init command creates a pre-commit hook — edit it:\necho \"npx lint-staged\" > .husky/pre-commit\n```\n\n### Configure lint-staged in `package.json`\n\n```json\n{\n  \"lint-staged\": {\n    \"*.{js,jsx,ts,tsx}\": [\n      \"eslint --fix --max-warnings=0\",\n      \"prettier --write\"\n    ],\n    \"*.{css,scss}\": [\n      \"prettier --write\",\n      \"stylelint --fix\"\n    ],\n    \"*.{json,md,yml,yaml}\": [\n      \"prettier --write\"\n    ]\n  }\n}\n```\n\n### Add Commit Message Linting\n\n```bash\n# Install commitlint\nnpm install --save-dev @commitlint/cli @commitlint/config-conventional\n\n# Create commitlint config\ncat > commitlint.config.js << 'EOF'\nmodule.exports = {\n  extends: ['@commitlint/config-conventional'],\n  rules: {\n    'type-enum': [2, 'always', [\n      'feat', 'fix', 'docs', 'style', 'refactor',\n      'perf', 'test', 'build', 'ci', 'chore', 'revert'\n    ]],\n    'subject-max-length': [2, 'always', 72],\n    'body-max-line-length': [2, 'always', 100]\n  }\n};\nEOF\n\n# Add commit-msg hook\necho \"npx --no -- commitlint --edit \\$1\" > .husky/commit-msg\n```\n\n### Add Pre-Push Hook\n\n```bash\n# Run tests before pushing\necho \"npm test\" > .husky/pre-push\n```\n\n### Complete Husky Directory Structure\n\n```\nproject/\n├── .husky/\n│   ├── pre-commit        # npx lint-staged\n│   ├── commit-msg        # npx --no -- commitlint --edit $1\n│   └── pre-push          # npm test\n├── commitlint.config.js\n├── package.json          # lint-staged config here\n└── ...\n```\n\n## pre-commit Framework (Python / Polyglot)\n\nLanguage-agnostic framework that works with any project. Hooks are defined in YAML and run in isolated environments.\n\n### Setup\n\n```bash\n# Install (Python required)\npip install pre-commit\n\n# Create config\ncat > .pre-commit-config.yaml << 'EOF'\nrepos:\n  # Built-in checks\n  - repo: https://github.com/pre-commit/pre-commit-hooks\n    rev: v4.6.0\n    hooks:\n      - id: trailing-whitespace\n      - id: end-of-file-fixer\n      - id: check-yaml\n      - id: check-json\n      - id: check-added-large-files\n        args: ['--maxkb=500']\n      - id: check-merge-conflict\n      - id: detect-private-key\n\n  # Python formatting\n  - repo: https://github.com/psf/black\n    rev: 24.4.2\n    hooks:\n      - id: black\n\n  # Python linting\n  - repo: https://github.com/astral-sh/ruff-pre-commit\n    rev: v0.4.4\n    hooks:\n      - id: ruff\n        args: ['--fix']\n      - id: ruff-format\n\n  # Shell script linting\n  - repo: https://github.com/shellcheck-py/shellcheck-py\n    rev: v0.10.0.1\n    hooks:\n      - id: shellcheck\n\n  # Commit message format\n  - repo: https://github.com/compilerla/conventional-pre-commit\n    rev: v3.2.0\n    hooks:\n      - id: conventional-pre-commit\n        stages: [commit-msg]\nEOF\n\n# Install hooks into .git/hooks/\npre-commit install\npre-commit install --hook-type commit-msg\n\n# Run against all files (first time)\npre-commit run --all-files\n```\n\n### Key Commands\n\n```bash\npre-commit install              # Install hooks\npre-commit run --all-files      # Run on everything (CI or first setup)\npre-commit autoupdate           # Update hook versions\npre-commit run <hook-id>        # Run a specific hook\npre-commit clean                # Clear cached environments\n```\n\n## Custom Hook Scripts (Any Language)\n\nFor projects not using Node or Python, write hooks directly in shell.\n\n### Portable Pre-Commit Hook\n\n```bash\n#!/bin/sh\n# .githooks/pre-commit — Team-shared hooks directory\nset -e\n\necho \"=== Pre-Commit Checks ===\"\n\n# 1. Prevent commits to main/master\nBRANCH=$(git symbolic-ref --short HEAD 2>/dev/null || echo \"detached\")\nif [ \"$BRANCH\" = \"main\" ] || [ \"$BRANCH\" = \"master\" ]; then\n  echo \"❌ Direct commits to $BRANCH are not allowed. Use a feature branch.\"\n  exit 1\nfi\n\n# 2. Check for debugging artifacts\nif git diff --cached --diff-filter=ACM | grep -nE '(console\\.log|debugger|binding\\.pry|import pdb)' > /dev/null 2>&1; then\n  echo \"⚠️  Debug statements found in staged files:\"\n  git diff --cached --diff-filter=ACM | grep -nE '(console\\.log|debugger|binding\\.pry|import pdb)'\n  echo \"Remove them or use git commit --no-verify to bypass.\"\n  exit 1\nfi\n\n# 3. Check for large files (>1MB)\nLARGE_FILES=$(git diff --cached --name-only --diff-filter=ACM | while read f; do\n  size=$(wc -c < \"$f\" 2>/dev/null || echo 0)\n  if [ \"$size\" -gt 1048576 ]; then echo \"$f ($((size/1024))KB)\"; fi\ndone)\nif [ -n \"$LARGE_FILES\" ]; then\n  echo \"❌ Large files detected:\"\n  echo \"$LARGE_FILES\"\n  exit 1\nfi\n\n# 4. Check for secrets patterns\nif git diff --cached --diff-filter=ACM | grep -nEi '(AKIA[0-9A-Z]{16}|sk-[a-zA-Z0-9]{48}|ghp_[a-zA-Z0-9]{36}|password\\s*=\\s*[\"\\x27][^\"\\x27]+[\"\\x27])' > /dev/null 2>&1; then\n  echo \"🚨 Potential secrets detected in staged changes! Review before committing.\"\n  exit 1\nfi\n\necho \"✅ All pre-commit checks passed\"\n```\n\n### Share Custom Hooks via `core.hooksPath`\n\n```bash\n# In your repo, set a shared hooks directory\ngit config core.hooksPath .githooks\n\n# Add to project setup docs or Makefile\n# Makefile\nsetup:\n\tgit config core.hooksPath .githooks\n\tchmod +x .githooks/*\n```\n\n## CI Integration\n\nHooks are a first line of defense, but CI is the source of truth.\n\n### Run pre-commit in CI (GitHub Actions)\n\n```yaml\n# .github/workflows/lint.yml\nname: Lint\non: [push, pull_request]\njobs:\n  pre-commit:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n      - uses: actions/setup-python@v5\n        with:\n          python-version: '3.12'\n      - uses: pre-commit/action@v3.0.1\n```\n\n### Run lint-staged in CI (Validation Only)\n\n```yaml\n# Validate that lint-staged would pass (catch bypassed hooks)\nname: Lint Check\non: [pull_request]\njobs:\n  lint:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n      - uses: actions/setup-node@v4\n        with:\n          node-version: 20\n      - run: npm ci\n      - run: npx eslint . --max-warnings=0\n      - run: npx prettier --check .\n```\n\n## Common Pitfalls & Fixes\n\n### Hooks Not Running\n\n| Symptom | Cause | Fix |\n|---|---|---|\n| Hooks silently skipped | Not installed in `.git/hooks/` | Run `npx husky init` or `pre-commit install` |\n| \"Permission denied\" | Hook file not executable | `chmod +x .husky/pre-commit` |\n| Hooks run but wrong ones | Stale hooks from old setup | Delete `.git/hooks/` contents, reinstall |\n| Works locally, fails in CI | Different Node/Python versions | Pin versions in CI config |\n\n### Performance Issues\n\n```json\n// ❌ Slow: runs on ALL files every commit\n{\n  \"scripts\": {\n    \"precommit\": \"eslint src/ && prettier --write src/\"\n  }\n}\n\n// ✅ Fast: lint-staged runs ONLY on staged files\n{\n  \"lint-staged\": {\n    \"*.{js,ts}\": [\"eslint --fix\", \"prettier --write\"]\n  }\n}\n```\n\n### Bypassing Hooks (When Needed)\n\n```bash\n# Skip all hooks for a single commit\ngit commit --no-verify -m \"wip: quick save\"\n\n# Skip pre-push only\ngit push --no-verify\n\n# Skip specific pre-commit hooks\nSKIP=eslint git commit -m \"fix: update config\"\n```\n\n> **Warning**: Bypassing hooks should be rare. If your team frequently bypasses, the hooks are too slow or too strict — fix them.\n\n## Migration Guide\n\n### Husky v4 → v9 Migration\n\n```bash\n# 1. Remove old Husky\nnpm uninstall husky\nrm -rf .husky\n\n# 2. Remove old config from package.json\n# Delete \"husky\": { \"hooks\": { ... } } section\n\n# 3. Install fresh\nnpm install --save-dev husky\nnpx husky init\n\n# 4. Recreate hooks\necho \"npx lint-staged\" > .husky/pre-commit\necho \"npx --no -- commitlint --edit \\$1\" > .husky/commit-msg\n\n# 5. Clean up — old Husky used package.json config,\n#    new Husky uses .husky/ directory with plain scripts\n```\n\n### Adopting Hooks on an Existing Project\n\n```bash\n# Step 1: Start with formatting only (low friction)\n# lint-staged config:\n{ \"*.{js,ts}\": [\"prettier --write\"] }\n\n# Step 2: Add linting after team adjusts (1-2 weeks later)\n{ \"*.{js,ts}\": [\"eslint --fix\", \"prettier --write\"] }\n\n# Step 3: Add commit message linting\n# Step 4: Add pre-push test runner\n\n# Gradual adoption prevents team resistance\n```\n\n## Key Principles\n\n- **Staged files only** — Never lint the entire codebase on every commit\n- **Auto-fix when possible** — `--fix` flags reduce developer friction\n- **Fast hooks** — Pre-commit should complete in < 5 seconds\n- **Fail loud** — Clear error messages with actionable fixes\n- **Team-shared** — Use Husky or `core.hooksPath` so hooks are version-controlled\n- **CI as backup** — Hooks are convenience; CI is the enforcer\n- **Gradual adoption** — Start with formatting, add linting, then testing\n\n## Related Skills\n\n- `@codebase-audit-pre-push` - Deep audit before GitHub push\n- `@verification-before-completion` - Verification before claiming work is done\n- `@bash-pro` - Advanced shell scripting for custom hooks\n- `@github-actions-templates` - CI/CD workflow templates\n\n## Limitations\n- Use this skill only when the task clearly matches the scope described above.\n- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.\n- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.","tags":["git","hooks","automation","antigravity","awesome","skills","sickn33","agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding"],"capabilities":["skill","source-sickn33","skill-git-hooks-automation","topic-agent-skills","topic-agentic-skills","topic-ai-agent-skills","topic-ai-agents","topic-ai-coding","topic-ai-workflows","topic-antigravity","topic-antigravity-skills","topic-claude-code","topic-claude-code-skills","topic-codex-cli","topic-codex-skills"],"categories":["antigravity-awesome-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/sickn33/antigravity-awesome-skills/git-hooks-automation","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add sickn33/antigravity-awesome-skills","source_repo":"https://github.com/sickn33/antigravity-awesome-skills","install_from":"skills.sh"}},"qualityScore":"0.700","qualityRationale":"deterministic score 0.70 from registry signals: · indexed on github topic:agent-skills · 34768 github stars · SKILL.md body (11,551 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-23T18:51:22.398Z","embedding":null,"createdAt":"2026-04-18T21:37:54.050Z","updatedAt":"2026-04-23T18:51:22.398Z","lastSeenAt":"2026-04-23T18:51:22.398Z","tsv":"'-2':1498 '-9':1032 '/action':1173 '/astral-sh/ruff-pre-commit':701 '/bin/sh':304,844 '/compilerla/conventional-pre-commit':731 '/dev/null':871,917,986,1057 '/pre-commit/pre-commit-hooks':644 '/psf/black':690 '/shellcheck-py/shellcheck-py':719 '0':466,988,1031,1229 '1':547,583,858,893,919,957,1013,1059,1072,1403,1449,1475,1497 '100':535 '1048576':992 '16':1036 '1mb':964 '2':508,525,533,870,895,918,985,1058,1413,1491 '20':1219 '24.4.2':692 '3':959,1423,1508 '3.12':1168 '36':1050 '4':1015,1435,1514 '48':1043 '5':1451,1557 '500':674 '72':527 '9':1042,1049 'a-z':1033 'a-za-z0':1038,1045 'acm':324,907,934,976,1027 'action':1138,1565,1632 'actions/checkout':1159,1210 'actions/setup-node':1213 'actions/setup-python':1162 'ad':669 'add':83,353,481,537,549,1099,1492,1509,1515,1595 'adjust':1496 'adopt':131,1467,1522,1591 'advanc':1624 'agnost':604 'akia':1030 'all-fil':773,789 'allow':887 'alway':509,526,534 'arg':672,707 'artifact':899 'ask':76,1670 'asset':287 'audit':1603,1607 'auto':221,1540 'auto-fix':1539 'auto-popul':220 'autom':4,20,36,37,106 'automat':160 'autoupd':802 'backup':1582 'bash':293,411,485,554,622,778,843,1086,1334,1402,1473,1622 'bash-pro':1621 'bind':913,940 'black':695 'bodi':529 'body-max-line-length':528 'boundari':1678 'branch':256,268,863,875,877,884,891 'build':517 'built':638 'built-in':637 'bypass':955,1192,1330,1376,1385 'c':983 'cach':317,819,903,930,969,1023 'cat':301,498,633 'catch':63,1191 'caus':1241 'chang':1067 'check':112,208,255,640,660,664,668,677,857,896,960,1016,1079,1196,1233 'check-added-large-fil':667 'check-json':663 'check-merge-conflict':676 'check-yaml':659 'checkout':281 'checkout/switch':283 'chmod':361,1112,1265 'chore':519 'ci':33,61,518,795,1115,1125,1136,1180,1222,1286,1293,1580,1586 'ci/cd':1634 'claim':1617 'clarif':1672 'clean':817,1452 'clear':818,1561,1645 'code':21,31,38 'codebas':1535,1602 'codebase-audit-pre-push':1601 'command':400,432,777 'commit':16,27,55,86,97,100,104,114,139,141,199,201,213,223,226,231,234,239,241,298,437,482,539,571,577,598,630,725,739,742,751,755,761,771,781,787,801,808,816,841,856,860,882,950,1070,1078,1134,1150,1172,1257,1304,1341,1343,1365,1370,1510,1538,1553 'commit-msg':140,225,538,576,741,760 'commitlint':19,105,487,496,545,581,1447 'commitlint.config.js':499,589 'commitlint/cli':493 'commitlint/config-conventional':494,503 'common':195,1234 'complet':274,563,1555,1614 'config':497,594,632,1096,1109,1294,1374,1416,1458,1485 'configur':88,447 'conflict':679 'consol':910,937 'content':1280 'control':177,1579 'conveni':1585 'convent':102,103,737 'conventional-pre-commit':736 'core.hookspath':1085,1097,1110,1573 'creat':203,243,294,424,433,495,631 'criteria':1681 'css':469 'custom':821,1082,1628 'debug':898,922 'debugg':912,939 'deep':1606 'default':179,216 'defens':1123 'defin':613 'delet':1278,1419 'deni':1260 'dep':276,285 'describ':1649 'detach':873 'detect':682,1008,1064 'detect-private-key':681 'dev':417,492,1430 'develop':1547 'diff':316,322,902,905,929,932,968,974,1022,1025 'diff-filt':321,904,931,973,1024 'differ':1287 'direct':835,881 'directori':426,565,850,1094,1463 'doc':512,1103 'done':999,1620 'e':306,326,852 'echo':337,341,348,441,542,559,853,872,880,921,944,987,994,1005,1009,1061,1074,1438,1444 'edit':439,546,582,1448 'editor':219 'end':654 'end-of-file-fix':653 'enforc':29,40,99,233,1589 'entir':1534 'enum':507 'environ':620,820,1661 'environment-specif':1660 'eof':303,360,500,536,635,744 'error':1562 'eslint':346,461,1225,1307,1326,1368,1503 'ever':58 'everi':1303,1537 'everyth':794 'execut':1264 'exist':186,1471 'exit':892,956,1012,1071 'expert':1666 'extend':502 'f':979,984,995 'fail':1284,1559 'fast':1312,1549 'feat':510 'featur':890 'fi':359,894,958,998,1014,1073 'file':210,311,314,335,340,343,350,404,656,671,766,775,791,927,963,966,1003,1007,1011,1262,1302,1320,1529 'filter':323,906,933,975,1026 'fire':191,193 'first':767,797,1120 'fix':347,358,462,474,511,708,1236,1242,1327,1372,1394,1504,1541,1544,1566 'fixer':657 'flag':1545 'format':24,50,108,205,236,686,712,727,1478,1594 'found':924 'framework':17,98,292,378,599,605 'frequent':1384 'fresh':1425 'friction':1481,1548 'fundament':153 'gate':23 'ghp':1044 'git':2,6,34,43,80,151,154,166,289,315,352,394,864,901,928,949,967,1021,1095,1108,1342,1356,1369 'git-hooks-autom':1 'git/hooks':171,365,748,1249,1279 'git/hooks/pre-commit':302,363 'githook':150,1098,1111,1114 'githooks/pre-commit':845 'github':1137,1609,1631 'github-actions-templ':1630 'github.com':643,689,700,718,730 'github.com/astral-sh/ruff-pre-commit':699 'github.com/compilerla/conventional-pre-commit':729 'github.com/pre-commit/pre-commit-hooks':642 'github.com/psf/black':688 'github.com/shellcheck-py/shellcheck-py':717 'github/workflows/lint.yml':1140 'gradual':1521,1590 'grep':325,908,935,1028 'gt':991 'guid':1397 'head':869 'hook':3,7,35,47,81,87,120,132,152,155,187,192,290,299,395,438,541,553,611,647,693,704,722,734,746,758,784,804,813,822,834,842,849,1083,1093,1117,1193,1237,1243,1261,1268,1274,1331,1337,1366,1377,1387,1421,1437,1468,1550,1575,1583,1629 'hook-typ':757 'huski':10,89,126,185,380,392,409,418,423,425,428,564,568,1252,1398,1406,1409,1412,1420,1431,1433,1455,1460,1462,1571 'husky/commit-msg':548,1450 'husky/pre-commit':446,1267,1443 'husky/pre-push':562 'id':648,652,658,662,666,675,680,694,705,709,723,735 'import':915,942 'init':429,431,1253,1434 'initi':422 'input':1675 'instal':275,284,412,414,486,489,623,627,745,752,756,782,783,1247,1258,1424,1427 'instead':67,379 'integr':1116 'isol':619 'issu':64,1296 'javascript/typescript':390 'job':1147,1200 'js':327,457,1324,1486,1501 'json':453,475,665,1297 'jsx':329,458 'kb':997 'key':684,776,1526 'languag':603,825 'language-agnost':602 'larg':670,962,965,1002,1006,1010 'later':1500 'latest':1156,1207 'length':524,532 'level':44 'like':184 'limit':1637 'line':531,1121 'lint':12,25,49,91,107,147,204,338,382,397,420,444,449,455,484,574,592,697,715,1142,1177,1187,1195,1201,1314,1322,1441,1483,1493,1512,1532,1596 'lint-stag':11,90,146,381,396,419,443,448,454,573,591,1176,1186,1313,1321,1440,1482 'linter':308 'live':169 'local':368,1283 'local-on':367 'log':245,911,938 'loud':1560 'low':1480 'm':1347,1371 'main':876 'main/master':862 'makefil':1105,1106 'manag':393 'manual':300 'master':5,878 'match':1646 'max':464,523,530,1227 'max-warn':463,1226 'maxkb':673 'md':476 'mention':136 'merg':271,273,678 'messag':28,101,232,235,483,726,1511,1563 'migrat':124,278,1396,1401 'minut':69 'miss':1683 'modern':387 'module.exports':501 'msg':142,214,217,227,540,578,743,762 'n':333,1001 'name':319,971,1141,1194 'name-on':318,970 'nativ':288 'ne':909,936 'need':1333 'nei':1029 'never':1531 'new':1459 'no-verifi':951,1344,1358 'node':830,1217 'node-vers':1216 'node.js':384 'node/python':1288 'notif':244 'npm':413,488,560,587,1221,1407,1426 'npx':345,427,442,543,572,579,1224,1231,1251,1432,1439,1445 'old':1276,1405,1415,1454 'one':1272 'output':1655 'package.json':452,590,1418,1457 'pass':1080,1190 'password':1051 'pattern':1019 'pdb':916,943 'perf':515 'perform':1295 'permiss':1259,1676 'pin':1290 'pip':626 'pipelin':62 'pitfal':1235 'plain':1465 'point':163 'polici':257 'polyglot':601 'popul':222 'portabl':838 'possibl':1543 'post':238,270,280 'post-checkout':279 'post-commit':237 'post-merg':269 'potenti':1062 'pre':15,85,96,118,138,144,198,247,259,297,436,551,570,585,597,629,738,750,754,770,780,786,800,807,815,840,855,1077,1133,1149,1171,1256,1353,1364,1517,1552,1604 'pre-commit':14,84,95,137,197,296,435,569,596,628,749,753,769,779,785,799,806,814,839,854,1076,1132,1148,1170,1255,1363,1551 'pre-commit-config.yaml':634 'pre-push':117,143,246,550,584,1352,1516 'pre-rebas':258 'precommit':1306 'prepar':212 'prepare-commit-msg':211 'prettier':467,471,479,1232,1309,1328,1488,1505 'prevent':264,859,1523 'pri':914,941 'principl':1527 'privat':683 'pro':1623 'problem':364 'project':385,391,567,610,827,1101,1472 'protect':267 'pull':1145,1198 'push':57,119,145,248,250,552,558,586,1144,1354,1357,1518,1605,1610 'python':600,624,685,696,832,1166 'python-vers':1165 'qualiti':22,39 'quick':407,1349 'rare':1380 're':355 're-stag':354 'reach':32,59 'read':978 'rebas':260,262,265 'rebuild':286 'recreat':1436 'reduc':1546 'ref':867 'refactor':514 'reinstal':1281 'relat':1599 'remot':252 'remov':945,1404,1414 'repo':636,641,687,698,716,728,1089 'request':1146,1199 'requir':625,1674 'resist':1525 'rev':645,691,702,720,732 'revert':520 'review':1068,1667 'rf':1411 'rm':1410 'ruff':706,711 'ruff-format':710 'rule':504 'run':159,253,277,307,399,555,617,763,772,788,792,809,810,1131,1152,1175,1203,1220,1223,1230,1239,1250,1269,1299,1316 'runner':123,1520 'runs-on':1151,1202 'safeti':1677 'save':416,491,1350,1429 'save-dev':415,490,1428 'scope':1648 'scratch':134 'script':157,714,823,1305,1466,1626 'scss':470 'second':66,1558 'secret':1018,1063 'section':1422 'set':45,78,115,305,851,1090 'setup':8,408,621,798,1102,1107,1277 'share':372,848,1081,1092,1569 'shell':713,837,1625 'shellcheck':724 'short':868 'silent':1244 'singl':1340 'size':981,990 'size/1024':996 'sk':1037 'skill':74,1600,1640 'skill-git-hooks-automation' 'skip':1245,1335,1351,1361,1367 'slow':1298,1390 'sourc':1128 'source-sickn33' 'specif':162,812,1362,1662 'speed':406 'src':1308,1311 'stage':13,92,148,209,310,313,334,339,342,349,356,383,398,403,421,445,450,456,575,593,740,926,1066,1178,1188,1315,1319,1323,1442,1484,1528 'stale':1273 'standard':388 'start':263,1476,1592 'statement':923 'step':1157,1208,1474,1490,1507,1513 'stop':1668 'strict':1393 'structur':566 'style':513 'stylelint':473 'subject':522 'subject-max-length':521 'substitut':1658 'success':1680 'symbol':866 'symbolic-ref':865 'symptom':1240 'task':1644 'team':375,847,1383,1495,1524,1568 'team-shar':846,1567 'templat':224,1633,1636 'test':51,122,254,516,556,561,588,1519,1598,1664 'time':768 'tool':183 'topic-agent-skills' 'topic-agentic-skills' 'topic-ai-agent-skills' 'topic-ai-agents' 'topic-ai-coding' 'topic-ai-workflows' 'topic-antigravity' 'topic-antigravity-skills' 'topic-claude-code' 'topic-claude-code-skills' 'topic-codex-cli' 'topic-codex-skills' 'trail':650 'trailing-whitespac':649 'treat':1653 'true':331 'truth':1130 'ts':328,459,1325,1487,1502 'tsx':330,460 'type':111,188,207,506,759 'type-check':110,206 'type-enum':505 'ubuntu':1155,1206 'ubuntu-latest':1154,1205 'uninstal':1408 'updat':803,1373 'use':72,196,376,829,888,948,1158,1161,1169,1209,1212,1456,1461,1570,1638 'user':75,135,229 'v0.10.0.1':721 'v0.4.4':703 'v3.0.1':1174 'v3.2.0':733 'v4':127,1160,1211,1214,1399 'v4.6.0':646 'v5':1163 'v9':129,410,1400 'valid':53,1181,1184,1663 'verif':1612,1615 'verifi':953,1346,1360 'verification-before-complet':1611 'version':176,805,1167,1218,1289,1291,1578 'version-control':175,1577 'via':1084 'warn':465,1228,1375 'wc':982 'week':1499 'whitespac':651 'wip':1348 'work':607,1282,1618 'workflow':167,1635 'would':1189 'write':230,468,472,480,833,1310,1329,1489,1506 'wrong':1271 'x':362,1113,1266 'x27':1054,1055,1056 'xarg':344,351 'yaml':478,615,661,1139,1183 'yml':477 'z':1035 'z0':1041,1048 'za':1040,1047","prices":[{"id":"9f47b69f-6789-49bf-940a-dfde21c8e832","listingId":"3219b13f-85a5-4d1c-9538-cff5dc42093e","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"sickn33","category":"antigravity-awesome-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T21:37:54.050Z"}],"sources":[{"listingId":"3219b13f-85a5-4d1c-9538-cff5dc42093e","source":"github","sourceId":"sickn33/antigravity-awesome-skills/git-hooks-automation","sourceUrl":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/git-hooks-automation","isPrimary":false,"firstSeenAt":"2026-04-18T21:37:54.050Z","lastSeenAt":"2026-04-23T18:51:22.398Z"}],"details":{"listingId":"3219b13f-85a5-4d1c-9538-cff5dc42093e","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"sickn33","slug":"git-hooks-automation","github":{"repo":"sickn33/antigravity-awesome-skills","stars":34768,"topics":["agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding","ai-workflows","antigravity","antigravity-skills","claude-code","claude-code-skills","codex-cli","codex-skills","cursor","cursor-skills","developer-tools","gemini-cli","gemini-skills","kiro","mcp","skill-library"],"license":"mit","html_url":"https://github.com/sickn33/antigravity-awesome-skills","pushed_at":"2026-04-23T06:41:03Z","description":"Installable GitHub library of 1,400+ agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and more. Includes installer CLI, bundles, workflows, and official/community skill collections.","skill_md_sha":"a27eb621bd88ff2588233e575c7fa7da907fec26","skill_md_path":"skills/git-hooks-automation/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/git-hooks-automation"},"layout":"multi","source":"github","category":"antigravity-awesome-skills","frontmatter":{"name":"git-hooks-automation","description":"Master Git hooks setup with Husky, lint-staged, pre-commit framework, and commitlint. Automate code quality gates, formatting, linting, and commit message enforcement before code reaches CI."},"skills_sh_url":"https://skills.sh/sickn33/antigravity-awesome-skills/git-hooks-automation"},"updatedAt":"2026-04-23T18:51:22.398Z"}}