aws-samples / aws-samples/sample-autonomous-cloud-coding-agents
(tooling): astro check pre-commit hook fails under bare Node v20 (not mise-pinned Node 22)
- Langage dominant
- TypeScript
- Étoiles
- 143
- Forks
- 46
- Merge moyen
- 3 j 10 h
- PR mergées (30 j)
- 24
Description
## Component
Documentation — repo tooling (prek `astro check` hook)
## Describe the bug
The `docs-astro-check` pre-commit hook invokes `./node_modules/.bin/astro check` via a bare `bash -lc`, which resolves `node` from the login shell's `PATH`. When mise's shell hook isn't active in that shell (non-interactive shells, spawned/agent shells, and any environment where mise activation hasn't run), `node` is an older system version (e.g. v20), and the hook fails:
```
astro check (docs)....Failed
- hook id: docs-astro-check
- exit code: 1
Node.js v20.20.2 is not supported by Astro!
Please upgrade Node.js to a supported version: ">=22.12.0"
```
The repo pins Node 22 via mise (`node = "22"` in the root and `docs/mise.toml`), so the _intended_ Node is fine — the hook just doesn't guarantee it's the one on `PATH` at commit time.
## Expected behavior
`git commit` runs the `astro check` hook with the mise-pinned Node 22 regardless of whether the invoking shell has mise activated, so it passes in CI, interactive, and non-interactive/agent shells alike.
## Current behavior
The hook:
```yaml
entry: bash -lc 'cd "$(git rev-parse --show-toplevel)/docs" && ./node_modules/.bin/astro check'
```
`bash -lc` sources the login profile but does not necessarily activate mise (mise activation is a shell hook, not part of every profile). So the `node` that runs `astro check` is whatever's first on `PATH` — system v20 in a plain shell — and Astro rejects it (`>=22.12.0` required). Committing succeeds only when the invoking process already has mise's Node 22 on `PATH` (e.g. running the commit through `mise exec -- git commit`).
## Reproduction steps
1. In a shell **without** mise activation (or `node -v` showing v20), from the repo (or a worktree):
2. Edit any file under `docs/` so the hook's `files: ^docs/` pattern matches, and `git add` it.
3. `git commit -m "docs: test"`.
4. Observe the `astro check` hook fail with `Node.js v20.x is not supported by Astro`.
5. Compare: `mise exec -- git commit -m "docs: test"` passes the same hook (Node 22 on `PATH`).
## Possible solution
Pin the hook to the mise-managed Node so it doesn't depend on ambient shell activation, e.g. run the command under `mise exec` (mirroring how the eslint/agent hooks already invoke `mise` tasks):
```yaml
entry: bash -lc 'cd "$(git rev-parse --show-toplevel)/docs" && mise exec -- ./node_modules/.bin/astro check'
```
or route it through a mise task (e.g. `mise //docs:astro-check`) as the other language-specific hooks do (`mise //cli:eslint`, `mise run quality`). The eslint and agent hooks already prefix with `mise`, so this is a consistency gap in the docs hooks specifically.
## Node version
System `node` v20.20.2 (bare shell); mise-pinned v22.23.1 when activated.
## mise version
2026.7.13
## Additional context
Surfaced while committing from a worktree via the standard `AGENTS.md` workflow. The `docs-sync` hook in the same repo has a separate worktree-specific failure (filed separately). Both mean a plain `git commit` touching `docs/` currently needs `mise exec --` to succeed.
Guide de contribution
Ouvrir le guide de contribution
Piste de recherche
Localisez la configuration pre-commit contenant l’entrée docs-astro-check et comparez-la aux hooks eslint et agent existants préfixés par mise. Reproduisez l’échec avec un environnement Node v20 non activé, puis vérifiez que le hook utilise le Node 22 épinglé et qu’un commit simple modifiant docs passe.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- bash, node.js
- Domaine
- build-system, tooling
- Type d'issue
- Bug
- Difficulté
- 2/5
- Temps estimé
- 1-3 heures
- Activité
- Calme
- Clarté
- Clairement spécifiée
- Accessibilité débutants
- 78/100