Skip to content

pre-bash-dep-guard.sh

来自 cli/templates/level-2/

bash
#!/usr/bin/env bash
set -euo pipefail
input=$(cat)
cmd=$(echo "$input" | jq -r '.tool_input.command // ""')

# Only intercept package install commands
if ! echo "$cmd" | grep -qE '(npm install|npm add|yarn add|pnpm add)'; then
  exit 0
fi

# Extract all package names (strip flags and versions)
pkgs=$(echo "$cmd" | sed -E 's/^(npm install|npm add|yarn add|pnpm add)[[:space:]]+//' | tr ' ' '\n' | grep -v '^-')

if [ -z "$pkgs" ]; then
  exit 0
fi

# Pass 1: Check all packages against banned list (blocking)
banned=("moment" "jquery" "lodash")
for pkg in $pkgs; do
  pkg=$(echo "$pkg" | sed 's/@.*//')
  [ -z "$pkg" ] && continue
  for b in "${banned[@]}"; do
    if [ "$pkg" = "$b" ]; then
      echo "BLOCKED: $pkg is in the banned dependency list. See docs/references/approved-deps.md for alternatives." >&2
      exit 2
    fi
  done
done

# Pass 2: Check allowlist (non-blocking warning)
if [ -f "docs/references/approved-deps.md" ]; then
  for pkg in $pkgs; do
    pkg=$(echo "$pkg" | sed 's/@.*//')
    [ -z "$pkg" ] && continue
    if ! grep -q "$pkg" docs/references/approved-deps.md; then
      echo "WARNING: $pkg is not in the approved dependency list. Evaluate before adding to docs/references/approved-deps.md." >&2
      exit 1
    fi
  done
fi

exit 0

面向个人开发者的 AI 辅助编程工程化方案