name: npm-restrictive
description: Restrictive sandbox policy for npm ecosystem (npm, pnpm, yarn, bun)
package_managers:
  - npm
  - pnpm
  - yarn
  - bun
  - npx
  - pnpx

# Optional security settings (uncomment to enable)
# allow_git_config: false  # Allow package managers to modify .git/config (default: false, blocks for security)

# Allow interactive terminal (PTY) operations
# Required for npx and pnpx to work, especially for commands like:
# npx create-next-app@latest
allow_pty: true

filesystem:
  allow_read:
    # Essential system paths for process execution
    - /
    - /usr/**
    - /var/**
    - /Library/**
    - /System/Library/**
    - /private/var/**
    # Project and user-specific paths
    - ${CWD}/**
    - ${HOME}/.npmrc
    - ${HOME}/.yarnrc
    - ${HOME}/.yarnrc.yml
    - ${HOME}/.bundle
    - ${HOME}/.npm/**
    - ${HOME}/.pnpm-store/**
    - ${HOME}/.cache/pnpm/**
    - ${HOME}/.cache/yarn/**
    - ${HOME}/.yarn/cache/**
    - ${HOME}/.bun/install/cache/**

  allow_write:
    # Note: ${TMPDIR} is automatically allowed when write restrictions are enabled (macOS)
    # Note: Patterns ending with /** automatically allow creating the parent directory.
    #       For example, ${CWD}/node_modules/** allows both:
    #         1. Creating the node_modules directory itself
    #         2. Writing any files/directories inside it
    # Temporary directories for shell scripts and package managers
    # Note: On macOS, /tmp is a symlink to /private/tmp, so we need both
    - /tmp/**
    - /private/tmp/**
    - /var/tmp/**
    # Project directories
    - ${CWD}/node_modules/**
    - ${CWD}/package-lock.json
    - ${CWD}/package.json
    - ${CWD}/yarn.lock
    - ${CWD}/pnpm-lock.yaml
    - ${CWD}/bun.lockb
    # Package manager caches and stores
    - ${HOME}/.npm/**
    - ${HOME}/.pnpm-store/**
    - ${HOME}/.cache/pnpm/**
    - ${HOME}/.cache/yarn/**
    - ${HOME}/.yarn/cache/**
    - ${HOME}/.bun/install/cache/**

  # Additional deny rules (optional - credentials are automatically blocked)
  # Automatically blocked for security:
  #   - .env, .env.*, .ssh/, .aws/, .gcloud/, .kube/, .gnupg/, .docker/config.json
  #   - .git/hooks/ (always blocked)
  #   - .git/config (blocked unless allow_git_config: true)
  deny_read: []

  deny_write:
    # Additional system directories to protect
    - /etc/**
    - /usr/**
    - /bin/**
    - /sbin/**
    # Additional deny rules for extra security
    - ${CWD}/.env
    - ${CWD}/.env.*

network:
  # MacOS sandbox-exec does not support network restrictions, so we allow all outbound traffic
  # when at least one allow outbound rule is present.
  allow_outbound:
    - registry.npmjs.org:443
    - registry.yarnpkg.com:443
    - npm.pkg.github.com:443
    - github.com:443

  deny_outbound:
    - "*:*"

process:
  allow_exec:
    - /usr/bin/node
    - /usr/local/bin/node
    - ${HOME}/.npm/**
    - ${HOME}/.pnpm-store/**
    - ${HOME}/.cache/pnpm/**
    - ${HOME}/.cache/yarn/**
    - ${HOME}/.yarn/cache/**
    - ${HOME}/.bun/install/cache/**
    - ${HOME}/.asdf/shims/npm
    - ${HOME}/.asdf/shims/pnpm
    - ${HOME}/.asdf/shims/yarn
    - ${HOME}/.asdf/shims/bun
    - /usr/bin/git
    - /usr/local/bin/git
    - /bin/bash
    - /bin/sh
    - /usr/bin/env

  deny_exec:
    - /usr/bin/curl
    - /usr/bin/wget
    - /usr/bin/python*
