From cb4dcf167f4a87db37dca349c1d4c5a8352820cd Mon Sep 17 00:00:00 2001 From: jreakin Date: Mon, 23 Mar 2026 03:18:04 -0500 Subject: [PATCH] chore: switch from .githooks to husky for pre-commit hooks Per maintainer request. Husky is activated via `cd .. && husky` in the prepare script. The pre-commit hook mirrors CI: typecheck + unit tests for both packages when relevant files are staged. Co-Authored-By: Claude Opus 4.6 (1M context) --- {.githooks => .husky}/pre-commit | 13 ++++--------- gitnexus/package-lock.json | 24 +++++++++++++++++------- gitnexus/package.json | 7 ++++--- 3 files changed, 25 insertions(+), 19 deletions(-) rename {.githooks => .husky}/pre-commit (68%) diff --git a/.githooks/pre-commit b/.husky/pre-commit similarity index 68% rename from .githooks/pre-commit rename to .husky/pre-commit index f19b14c7c7..36047caa52 100755 --- a/.githooks/pre-commit +++ b/.husky/pre-commit @@ -1,21 +1,16 @@ #!/usr/bin/env bash -# Pre-commit hook: typecheck + unit tests for both packages. +# Pre-commit hook (husky): typecheck + unit tests for both packages. # Mirrors CI checks from ci-quality.yml and ci-tests.yml. -# Installed automatically via: git config core.hooksPath .githooks -# Skip with: git commit --no-verify (use sparingly) +# Skip with: git commit --no-verify # -# CI coverage map: +# CI coverage: # quality / typecheck → tsc --noEmit in gitnexus/ # quality / typecheck-web → tsc -b --noEmit in gitnexus-web/ # tests / ubuntu+coverage → vitest run in gitnexus/ (all projects) -# tests / cross-platform → vitest run in gitnexus/ (macOS, Windows — can't replicate locally) -# e2e / chromium → playwright in gitnexus-web/ (requires servers — skipped in hook) - -set -e +# e2e / chromium → playwright (requires servers — skipped) ROOT="$(git rev-parse --show-toplevel)" -# Only run checks if relevant files are staged WEB_CHANGED=$(git diff --cached --name-only -- 'gitnexus-web/' | head -1) CLI_CHANGED=$(git diff --cached --name-only -- 'gitnexus/' | head -1) diff --git a/gitnexus/package-lock.json b/gitnexus/package-lock.json index 9e814e1a80..df0fdb0308 100644 --- a/gitnexus/package-lock.json +++ b/gitnexus/package-lock.json @@ -50,6 +50,7 @@ "@types/node": "^20.0.0", "@types/uuid": "^10.0.0", "@vitest/coverage-v8": "^4.0.18", + "husky": "^9.1.7", "tsx": "^4.0.0", "typescript": "^5.4.5", "vitest": "^4.0.18" @@ -3129,7 +3130,6 @@ "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", "license": "MIT", - "peer": true, "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -3586,6 +3586,22 @@ "url": "https://opencollective.com/express" } }, + "node_modules/husky": { + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", + "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", + "dev": true, + "license": "MIT", + "bin": { + "husky": "bin.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -4168,7 +4184,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -4948,7 +4963,6 @@ "integrity": "sha512-7dxoA6kYvtgWw80265MyqJlkRl4yawIjO7S5MigytjELkX43fV2WsAXzsNfO7sBpPPCF5Gp0+XzHk0DwLCq3xQ==", "hasInstallScript": true, "license": "MIT", - "peer": true, "dependencies": { "node-addon-api": "^8.0.0", "node-gyp-build": "^4.8.0" @@ -5351,7 +5365,6 @@ "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "~0.27.0", "get-tsconfig": "^4.7.5" @@ -5472,7 +5485,6 @@ "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", @@ -5548,7 +5560,6 @@ "integrity": "sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@vitest/expect": "4.0.18", "@vitest/mocker": "4.0.18", @@ -5832,7 +5843,6 @@ "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/gitnexus/package.json b/gitnexus/package.json index 9d6fc01e4b..cba1504603 100644 --- a/gitnexus/package.json +++ b/gitnexus/package.json @@ -45,13 +45,13 @@ "test:integration": "vitest run test/integration", "test:watch": "vitest", "test:coverage": "vitest run --coverage", - "prepare": "npm run build && git config core.hooksPath .githooks 2>/dev/null || true", + "prepare": "npm run build && cd .. && husky", "postinstall": "node scripts/patch-tree-sitter-swift.cjs", "prepack": "npm run build && chmod +x dist/cli/index.js" }, "dependencies": { "@huggingface/transformers": "^3.0.0", - "onnxruntime-node": "^1.24.0", + "@ladybugdb/core": "^0.15.2", "@modelcontextprotocol/sdk": "^1.0.0", "cli-progress": "^3.12.0", "commander": "^12.0.0", @@ -61,10 +61,10 @@ "graphology": "^0.25.4", "graphology-indices": "^0.17.0", "graphology-utils": "^2.3.0", - "@ladybugdb/core": "^0.15.2", "ignore": "^7.0.5", "lru-cache": "^11.0.0", "mnemonist": "^0.39.0", + "onnxruntime-node": "^1.24.0", "pandemonium": "^2.4.0", "tree-sitter": "^0.21.0", "tree-sitter-c": "^0.21.0", @@ -91,6 +91,7 @@ "@types/node": "^20.0.0", "@types/uuid": "^10.0.0", "@vitest/coverage-v8": "^4.0.18", + "husky": "^9.1.7", "tsx": "^4.0.0", "typescript": "^5.4.5", "vitest": "^4.0.18"