`vp config` / `vp hooks enable` skip a clone where husky set `core.hooksPath`
Les mainteneurs répondent en général sous 1 jour
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 4/5
- Temps estimé
- 1-2 jours
- Accessibilité débutants
- 55/100
Piste de recherche
Start in packages/cli/src/config/hooks.ts, where install() skips an existing core.hooksPath, and inspect the command_config_replace_husky_hookspath snapshot referenced in the issue. Reproduce with the provided script using .husky/_, then compare the behavior when core.hooksPath is unset. Done means the intended husky migration behavior is decided and covered by a test showing whether Vite+ installs its dispatcher.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Describe the bug
After a repo moves from husky to Vite+ Git hooks (husky removed, .husky/commit-msg moved to .vite-hooks/commit-msg, "prepare": "vp config"), every existing clone still has core.hooksPath=.husky/_, which husky set. In those clones vp install (through prepare), vp config, vp config --hooks and vp hooks enable all print:
core.hooksPath is already set to ".husky/_", skipping
core.hooksPath stays .husky/_, no hook runs, and nothing exits non-zero. Only fresh clones get working hooks, so a migration quietly turns hooks off for everyone who already had the repo checked out.
The skip comes from install() in packages/cli/src/config/hooks.ts: any effective core.hooksPath that isn't the Vite+ target is left alone. #772 used to replace .husky/_ / .husky, but #2280 changed that, and the command_config_replace_husky_hookspath snapshot now expects the husky path to be kept. The docs say the same ("If core.hooksPath points to another hook directory, vp config skips dispatcher installation").
Expected: .husky/_ is a dispatcher husky generated, not one the project owns, and Vite+ already accepts husky's HUSKY=0 and husky/init.sh. So vp config / vp hooks enable should take over a .husky/_ (or .husky) hooksPath, at least when the project no longer depends on husky. Failing that, vp hooks enable --force (and something similar for vp config) would let prepare take it over explicitly. Explicit vp hooks enable has no way to override the skip today.
Reproduction
Self-contained script below (no repo needed).
Steps to reproduce
Run with bash repro.sh. It builds a throwaway repo in a temp dir with .vite-hooks/commit-msg (rejects messages not starting with feat), sets core.hooksPath the way husky leaves it, runs the commands and attempts a bad commit. bash repro.sh --unset clears core.hooksPath first, for contrast.
#!/usr/bin/env bash
# Usage: repro.sh [--unset] (--unset clears core.hooksPath before installing)
set -u
VP_VERSION="${VP_VERSION:-1.4.0}"
DIR="$(mktemp -d)"; cd "$DIR"
git init -q
cat > package.json <<JSON
{
"name": "hookspath-repro",
"private": true,
"packageManager": "[email protected]",
"scripts": { "prepare": "vp config" },
"devDependencies": { "vite-plus": "$VP_VERSION" }
}
JSON
mkdir -p .vite-hooks
cat > .vite-hooks/commit-msg <<'HOOK'
#!/usr/bin/env sh
head -1 "$1" | grep -q '^feat' || { echo "commit-msg hook: rejected" >&2; exit 1; }
HOOK
chmod +x .vite-hooks/commit-msg
# What husky leaves behind in an existing clone
git config core.hooksPath .husky/_
mkdir -p .husky/_
[ "${1:-}" = "--unset" ] && git config --unset core.hooksPath
show() { echo " core.hooksPath = $(git config --get core.hooksPath || echo '<unset>')"; }
echo "$ vp install"; vp install 2>&1 | grep -iE 'hooksPath|prepare|vp config|error' ; show
echo "$ vp --version"; vp --version | sed -n '1,4p'
echo "$ vp config"; vp config --no-agent 2>&1; show
echo "$ vp config --hooks"; vp config --hooks --no-agent 2>&1; show
echo "$ vp hooks enable"; vp hooks enable 2>&1; show
git add -A
echo "$ git commit -m 'bad message'"
if git -c user.name=repro -c [email protected] commit -q -m "bad message" 2>&1; then
echo "=> commit SUCCEEDED (hook did not run)"
else
echo "=> commit REJECTED by hook"
fi
rm -rf "$DIR"
Output with husky's hooksPath (bash repro.sh):
$ vp install
> hookspath-repro@ prepare <tmpdir>
> vp config
core.hooksPath is already set to ".husky/_", skipping
core.hooksPath = .husky/_
$ vp --version
vp v1.1.0
Local vite-plus:
vite-plus v1.4.0
$ vp config
core.hooksPath is already set to ".husky/_", skipping
core.hooksPath = .husky/_
$ vp config --hooks
core.hooksPath is already set to ".husky/_", skipping
core.hooksPath = .husky/_
$ vp hooks enable
core.hooksPath is already set to ".husky/_", skipping
core.hooksPath = .husky/_
$ git commit -m 'bad message'
=> commit SUCCEEDED (hook did not run)
Output with bash repro.sh --unset:
$ vp install
> hookspath-repro@ prepare <tmpdir>
> vp config
core.hooksPath = .vite-hooks/_
$ vp --version
vp v1.1.0
Local vite-plus:
vite-plus v1.4.0
$ vp config
core.hooksPath = .vite-hooks/_
$ vp config --hooks
core.hooksPath = .vite-hooks/_
$ vp hooks enable
Git hook dispatcher installed at .vite-hooks/_
core.hooksPath = .vite-hooks/_
$ git commit -m 'bad message'
commit-msg hook: rejected
VITE+ - commit-msg script failed (code 1)
=> commit REJECTED by hook
Workaround: clear husky's value before vp config in prepare:
"prepare": "git config --get core.hooksPath | grep -q '^\\.husky' && git config --unset core.hooksPath; vp config"
System Info
$ vp --version
vp v1.1.0
Local vite-plus:
vite-plus v1.4.0
Tools:
vite v8.3.5
rolldown v1.2.15
vitest v5.0.5
oxfmt v0.74.0
oxlint v1.89.0
oxlint-tsgolint v7.0.2004
tsdown v0.23.1
Environment:
Package manager pnpm v10.20.0
Node.js v24.19.0
$ vp env current
Node.js:
Version 24.19.0
Source default
Mode managed
Package Manager:
Name pnpm
Version 10.20.0
Source packageManager
Mode system_first
OS: Ubuntu 26.04.1 LTS (Linux 7.0.0 x86_64), git 2.53.0
vite-plus 1.4.0 is the latest release (npm latest dist-tag) as of this report.
Used Package Manager
pnpm
Validations
- Read the Contributing Guidelines.
- Check that there isn't already an issue for the same bug.
- Confirm this is a Vite+ issue and not an upstream issue.
- The provided reproduction is a minimal reproducible example.
Written by claude-opus-5-5 via Claude Code in T3 Code on goobles-agentbox.
- Langage dominant
- Rust
- Étoiles
- 6.5k
- Forks
- 296
- Merge moyen
- 1 j 59 min
- PR mergées (30 j)
- 235
Préparer son environnement
Lance le conteneur de développement du projet dans votre navigateur, avec votre propre compte GitHub.
- Aucun Dockerfile ni fichier Docker Compose
- Aucun modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de voidzero-dev/vite-plus
-
pending triage
Difficulté 2/5 1-3 heures Accessibilité débutants 63/100
voidzero-dev/vite-plus#3235 ·
Les mainteneurs répondent en général sous 1 jour
-
Docker guide: the runtime stage needs libatomic1 for Node.js 25 and laterPeut-être pris @kshanxs l’a pris il y a 6 jours. Ouvertedocumentation
Difficulté 2/5 1-3 heures Accessibilité débutants 84/100
voidzero-dev/vite-plus#3219 · 2 commentaires · 1 réaction ·
Les mainteneurs répondent en général sous 1 jour
-
pending triage
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
voidzero-dev/vite-plus#2882 · 2 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
vpx: support ECMAScript decorators after upstream Oxc support landsPeut-être pris @fengmk2 l’a pris aujourd’hui. Ouverte
voidzero-dev/vite-plus#3292 · 1 personne assignée ·
Les mainteneurs répondent en général sous 1 jour
-
Executables throwingPeut-être pris @voidzero-bot l’a pris aujourd’hui. Ouverte- P2: has workaround pending triage triage: fix verified
Difficulté 4/5 3-5 jours Accessibilité débutants 20/100
voidzero-dev/vite-plus#3290 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de voidzero-dev/vite-plus
Issues similaires
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 84/100
dekobon/big-code-analysis#1729 ·
Les mainteneurs répondent en général sous 1 jour
-
bug help wanted
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
Les mainteneurs répondent en général sous 3 jours
-
Cline: allowlist capture drops every event because the capture gate ignores `workspaceRoots`Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 88/100
akitaonrails/ai-memory#1888 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
peteonrails/voxtype#941 ·
Les mainteneurs répondent en général sous 4 jours
-
bug priority:medium triage:maintainable
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
ccusage/ccusage#2000 · 3 commentaires ·
Les mainteneurs répondent en général sous 1 jour