# lefthook.yml - git hooks for ego-lite # # Enable hooks: # cd package/ego-browser && npm install # # lefthook is a package/ego-browser devDependency. npm install runs the # prepare script, which installs hooks into the repository's .git/hooks. # # The git root is the repository root, while the JS package lives in # package/ego-browser. Commands cd into that package when needed. pre-commit: parallel: false commands: branch-up-to-date: run: | git fetch --quiet origin dev 2>/dev/null || { echo "⚠ skip branch-freshness check: cannot fetch origin/dev (offline?)"; exit 0; } if git merge-base --is-ancestor FETCH_HEAD HEAD; then exit 0 fi echo "✗ Your branch is behind origin/dev — sync before committing:" echo " git fetch origin dev && git rebase origin/dev # or: git merge origin/dev" exit 1 style-check: run: | files=$(git diff --cached --name-only --diff-filter=ACMR | grep -E '^(package/ego-browser|plugins)/.*\.(ts|mjs|js|json|md)$' | grep -v '^skills/ego-browser/learnings/' || true) [ -z "$files" ] && exit 0 package/ego-browser/node_modules/.bin/prettier --check $files vulnerability-audit: run: | git diff --cached --name-only --diff-filter=ACMR | grep -q '^package/ego-browser/' || exit 0 cd package/ego-browser && npm audit --registry=https://registry.npmjs.org --audit-level=moderate smoke-test: run: | git diff --cached --name-only --diff-filter=ACMR | grep -Eq '^(package/ego-browser/|skills/ego-browser/)' || exit 0 cd package/ego-browser && npm test site-skill-validation: run: | git diff --cached --name-only --diff-filter=ACMR | grep -Eq '^(package/ego-browser/(src/learning/|scripts/validate-site-skills\.ts)|skills/ego-browser/learnings/)' || exit 0 cd package/ego-browser && npm run validate:site-skills plugin-skill-sync: # Lefthook runs commands in name order, so this refreshes the plugin's # copy of the entry Skill before plugin-tests checks it. run: | git diff --cached --name-only | grep -q '^skills/ego-browser/' || exit 0 node plugins/scripts/sync-skills.mjs ego --staged plugin-tests: run: | git diff --cached --name-only --diff-filter=ACMR | grep -Eq '^(plugins/|skills/ego-browser/|package/ego-browser/skill-body/|\.agents/plugins/|\.claude-plugin/|\.cursor-plugin/)' || exit 0 npm --prefix plugins/ego test e2e-test: run: | git diff --cached --name-only --diff-filter=ACMR | grep -Eq '^(package/ego-browser/|skills/ego-browser/)' || exit 0 cd package/ego-browser && npm run e2e post-commit: commands: plugin-skill-index: # `git commit ` commits plugin-skill-sync's copy from a temporary # index, so the real index keeps the old copy. Point it back at HEAD. run: | copy=plugins/ego/skills/ego-browser if git diff --quiet HEAD -- "$copy" && ! git diff --cached --quiet -- "$copy"; then git reset -q -- "$copy" fi