Skip to content

Commit 27f7bd1

Browse files
committed
fix(ci): ensure node is available in agent sandbox
Signed-off-by: Cory Rylan <crylan@nvidia.com>
1 parent 0c1812f commit 27f7bd1

5 files changed

Lines changed: 75 additions & 9 deletions

File tree

.agents/hooks/lib/node-env.sh

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
#!/usr/bin/env bash
2+
3+
get_hook_pnpm_spec() {
4+
local project_root package_manager
5+
6+
project_root="$1"
7+
package_manager=""
8+
9+
if [[ -f "$project_root/package.json" ]] && command -v node >/dev/null 2>&1; then
10+
package_manager=$(node -e "const { readFileSync } = require('node:fs'); const { packageManager } = JSON.parse(readFileSync(process.argv[1], 'utf8')); if (typeof packageManager === 'string' && packageManager.startsWith('pnpm@')) process.stdout.write(packageManager);" "$project_root/package.json")
11+
fi
12+
13+
printf '%s\n' "${package_manager:-pnpm@latest}"
14+
}
15+
16+
setup_hook_node_env() {
17+
local project_root node_version nvm_dir pnpm_spec
18+
19+
project_root="$1"
20+
nvm_dir="${NVM_DIR:-$HOME/.nvm}"
21+
22+
if [[ -s "$nvm_dir/nvm.sh" ]]; then
23+
source "$nvm_dir/nvm.sh"
24+
25+
if [[ -f "$project_root/.nvmrc" ]]; then
26+
node_version=$(<"$project_root/.nvmrc")
27+
nvm use --silent "$node_version" >/dev/null 2>&1 || true
28+
else
29+
nvm use --silent >/dev/null 2>&1 || true
30+
fi
31+
fi
32+
33+
if ! command -v pnpm >/dev/null 2>&1 && command -v corepack >/dev/null 2>&1; then
34+
pnpm_spec=$(get_hook_pnpm_spec "$project_root")
35+
(
36+
cd "$project_root"
37+
corepack enable
38+
corepack prepare "$pnpm_spec" --activate
39+
)
40+
fi
41+
}

.agents/hooks/post-tool-use-edit-write.sh

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ set -euo pipefail
44
INPUT=$(cat)
55
HOOK_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)
66
source "$HOOK_DIR/lib/project-root.sh"
7+
source "$HOOK_DIR/lib/node-env.sh"
78
PROJECT_ROOT=$(resolve_project_root "$INPUT" "$HOOK_DIR") || exit 0
89
FILE_PATHS=$(hook_file_paths_from_input "$INPUT")
910

@@ -13,6 +14,13 @@ fi
1314

1415
FAILED=0
1516

17+
setup_hook_node_env "$PROJECT_ROOT"
18+
19+
if ! command -v pnpm >/dev/null 2>&1; then
20+
echo "pnpm not found after loading the project Node environment." >&2
21+
exit 2
22+
fi
23+
1624
mark_failed() {
1725
FAILED=1
1826
}

.agents/hooks/pre-tool-use-bash.sh

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,10 @@ INPUT=$(cat)
55
HOOK_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)
66
source "$HOOK_DIR/lib/project-root.sh"
77
COMMAND=$(hook_command_from_input "$INPUT" || true)
8+
GIT_PREFIX='(^|[;&|][[:space:]]*)git([[:space:]]+(-C[[:space:]]+[^[:space:];&|]+|--no-pager|-c[[:space:]]+[^[:space:];&|]+|--work-tree(=|[[:space:]]+)[^[:space:];&|]+))*[[:space:]]+'
89

910
# Exit early if not a git command
10-
if [[ -z "$COMMAND" ]] || ! echo "$COMMAND" | grep -qE '^\s*git\s'; then
11+
if [[ -z "$COMMAND" ]] || ! echo "$COMMAND" | grep -qE '(^|[;&|][[:space:]]*)git([[:space:]]|$)'; then
1112
exit 0
1213
fi
1314

@@ -28,4 +29,12 @@ echo "$COMMAND" | grep -qF "clean -f" && block "git clean -f permanently
2829
echo "$COMMAND" | grep -qF "checkout -- ." && block "git checkout -- . discards all unstaged changes irreversibly"
2930
echo "$COMMAND" | grep -qF "branch -D" && block "git branch -D force-deletes a branch without merge checks"
3031

32+
echo "$COMMAND" | grep -qE "${GIT_PREFIX}(add|stage)([[:space:]]|$)" && block "git add/stage modifies the index"
33+
echo "$COMMAND" | grep -qE "${GIT_PREFIX}restore([[:space:]][^;&|]*)?[[:space:]]--staged([[:space:]]|$)" && block "git restore --staged removes files from the index"
34+
echo "$COMMAND" | grep -qE "${GIT_PREFIX}reset([[:space:]]|$)" && block "git reset modifies the index or moves HEAD"
35+
echo "$COMMAND" | grep -qE "${GIT_PREFIX}rm([[:space:]][^;&|]*)?[[:space:]]--cached([[:space:]]|$)" && block "git rm --cached removes files from the index"
36+
echo "$COMMAND" | grep -qE "${GIT_PREFIX}rm([[:space:]]|$)" && block "git rm stages file removals"
37+
echo "$COMMAND" | grep -qE "${GIT_PREFIX}mv([[:space:]]|$)" && block "git mv stages file renames"
38+
echo "$COMMAND" | grep -qE "${GIT_PREFIX}update-index([[:space:]]|$)" && block "git update-index modifies the index"
39+
3140
exit 0

.agents/hooks/session-start.sh

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,24 @@ set -euo pipefail
44
INPUT=$(cat)
55
HOOK_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)
66
source "$HOOK_DIR/lib/project-root.sh"
7+
source "$HOOK_DIR/lib/node-env.sh"
78
PROJECT_ROOT=$(resolve_project_root "$INPUT" "$HOOK_DIR") || {
89
echo "Could not resolve project root." >&2
910
exit 0
1011
}
1112

1213
NVM_DIR="${NVM_DIR:-$HOME/.nvm}"
13-
if [[ ! -s "$NVM_DIR/nvm.sh" ]]; then
14-
echo "nvm not found at $NVM_DIR/nvm.sh" >&2
15-
exit 0
14+
if [[ -s "$NVM_DIR/nvm.sh" ]]; then
15+
source "$NVM_DIR/nvm.sh"
1616
fi
1717

18-
source "$NVM_DIR/nvm.sh"
19-
2018
cd "$PROJECT_ROOT"
2119

22-
nvm install 2>&1 >/dev/null
23-
corepack enable 2>&1 >/dev/null
24-
corepack prepare --activate 2>&1 >/dev/null
20+
if command -v nvm >/dev/null 2>&1; then
21+
nvm install 2>&1 >/dev/null
22+
fi
23+
24+
setup_hook_node_env "$PROJECT_ROOT"
2525

2626
INSTALL_OUTPUT=$(pnpm i --frozen-lockfile --prefer-offline 2>&1) || {
2727
echo "pnpm install failed:" >&2

.agents/hooks/stop.sh

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ set -euo pipefail
33
INPUT=$(cat)
44
HOOK_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)
55
source "$HOOK_DIR/lib/project-root.sh"
6+
source "$HOOK_DIR/lib/node-env.sh"
67
PROJECT_ROOT=$(resolve_project_root "$INPUT" "$HOOK_DIR") || {
78
echo "Could not resolve project root." >&2
89
exit 1
@@ -23,6 +24,13 @@ if [[ -z "$CHANGED" ]]; then
2324
exit 0
2425
fi
2526

27+
setup_hook_node_env "$PROJECT_ROOT"
28+
29+
if ! command -v pnpm >/dev/null 2>&1; then
30+
echo "pnpm not found after loading the project Node environment." >&2
31+
exit 2
32+
fi
33+
2634
PROJECTS=(code cli core forms lint markdown media monaco)
2735
FAILED=()
2836

0 commit comments

Comments
 (0)