diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 000000000..06c026bd7 --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,82 @@ +FROM mcr.microsoft.com/devcontainers/base:debian + +# Set non-interactive frontend for apt +ENV DEBIAN_FRONTEND=noninteractive + +# Switch to root for installing packages +USER root + +RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - + +# Install additional dependencies +RUN apt update && apt install -y \ + build-essential \ + nodejs \ + jq \ + python3 \ + python3-pip \ + python3-venv \ + pipx \ + && apt clean \ + && rm -rf /var/lib/apt/lists/* + +# Install Node.js +RUN npm install -g n && n 20.12.0 + +# Install Solidity compiler using pipx (isolated environment) +RUN pipx install solc-select && \ + pipx ensurepath && \ + /root/.local/bin/solc-select install 0.8.27 && \ + /root/.local/bin/solc-select use 0.8.27 && \ + # Copy binaries to /usr/local/bin with proper permissions (not symlinks) + cp /root/.local/bin/solc /usr/local/bin/solc && \ + cp /root/.local/bin/solc-select /usr/local/bin/solc-select && \ + chmod 755 /usr/local/bin/solc && \ + chmod 755 /usr/local/bin/solc-select && \ + # Make sure pipx directory is accessible + chmod -R a+rx /root/.local/pipx && \ + # Set up for vscode user + mkdir -p /home/vscode/.solc-select && \ + cp -r /root/.solc-select/* /home/vscode/.solc-select/ && \ + chown -R vscode:vscode /home/vscode/.solc-select + +# Install Hardhat and related tools as root +RUN npm install -g hardhat@2.22.16 @nomicfoundation/hardhat-ethers@3.0.8 ethers@6.13.4 && \ + ln -sf /usr/local/lib/node_modules/hardhat/internal/cli/cli.js /usr/local/bin/hardhat && \ + chmod +x /usr/local/bin/hardhat + +# Install Foundry for Anvil (as root for global installation) +RUN curl -L https://foundry.paradigm.xyz | bash && \ + /root/.foundry/bin/foundryup && \ + # Copy binaries to /usr/local/bin with proper permissions + cp /root/.foundry/bin/anvil /usr/local/bin/anvil && \ + cp /root/.foundry/bin/cast /usr/local/bin/cast && \ + cp /root/.foundry/bin/forge /usr/local/bin/forge && \ + cp /root/.foundry/bin/chisel /usr/local/bin/chisel && \ + # Ensure proper permissions + chmod 755 /usr/local/bin/anvil && \ + chmod 755 /usr/local/bin/cast && \ + chmod 755 /usr/local/bin/forge && \ + chmod 755 /usr/local/bin/chisel + +# Set up yarn +RUN corepack enable && \ + corepack prepare yarn@4.0.2 --activate + +# Ensure all users have access to the tools +RUN chmod 755 /usr/local/bin/* && \ + # Create a directory for vscode user's binaries + mkdir -p /home/vscode/.local/bin && \ + chown -R vscode:vscode /home/vscode/.local/bin + +# Switch back to vscode user +USER vscode + +# Set environment variables +ENV PATH="/usr/local/bin:/home/vscode/.foundry/bin:/home/vscode/.local/bin:/root/.local/bin:$PATH" + +# Create .bashrc additions for PATH +RUN echo 'export PATH="/usr/local/bin:$HOME/.local/bin:$PATH"' >> $HOME/.bashrc + +# Set the default command +CMD ["sleep", "infinity"] diff --git a/.devcontainer/README.md b/.devcontainer/README.md new file mode 100644 index 000000000..f0079a7b7 --- /dev/null +++ b/.devcontainer/README.md @@ -0,0 +1,115 @@ +# Graph Protocol Contracts Dev Container + +This directory contains configuration files for the Graph Protocol contracts development container. + +> **Note:** This dev container setup is a work in progress and will not be fully portable. + +## Overview + +The dev container provides a consistent development environment with caching to improve performance. + +### Key Components + +1. **Docker Compose Configuration**: Defines the container setup, volume mounts, and environment variables +2. **Dockerfile**: Specifies the container image and installed tools +3. **project-setup.sh**: Configures the environment after container creation +4. **host-setup.sh**: Sets up the host environment before starting the container +5. **setup-git-signing.sh**: Automatically configures Git to use SSH signing with forwarded SSH keys + +## Cache System + +The container uses a simple caching system: + +1. **Host Cache Directories**: Created on the host and mounted into the container + - `/cache/vscode-cache` → `/home/vscode/.cache` + - `/cache/vscode-config` → `/home/vscode/.config` + - `/cache/vscode-data` → `/home/vscode/.local/share` + - `/cache/vscode-bin` → `/home/vscode/.local/bin` + - `/cache/*` → Tool-specific cache directories + +2. **Package Cache Symlinks**: Created inside the container by project-setup.sh + - Each package's cache directory is symlinked to a subdirectory in `/cache/hardhat` + +## Setup Instructions + +### 1. Host Setup (One-time) + +Before starting the dev container for the first time, run the included host setup script to create the necessary cache directories on the host: + +```bash +sudo /git/graphprotocol/contracts/.devcontainer/host-setup.sh +``` + +This script creates all required cache directories on the host, including: + +- Standard VS Code directories (for .cache, .config, etc.) +- Tool-specific cache directories (for npm, yarn, cargo, etc.) + +The script is idempotent and can be run multiple times without issues. + +### 2. Start the Dev Container + +After creating the cache directories, you can start the dev container: + +1. Open VS Code +2. Use the "Remote-Containers: Open Folder in Container" command +3. Select the repository directory + +When the container starts, the `project-setup.sh` script will automatically run and: + +- Create package-specific cache directories +- Set up symlinks for package cache directories +- Install project dependencies using yarn +- Configure Git to use SSH signing with your forwarded SSH key +- Source shell customizations if available in PATH (currently depends on base image configuration) + +## Environment Variables + +Environment variables are defined in two places: + +1. **docker-compose.yml**: Contains most of the environment variables for tools and caching +2. **Environment File**: Personal settings are stored in `/opt/configs/graphprotocol/contracts.env` + +### Git Configuration + +To enable Git commit signing, add the following settings to your environment file: + +```env +# Git settings for commit signing +GIT_USER_NAME=Your Name +GIT_USER_EMAIL=your.email@example.com +``` + +These environment variables are needed for Git commit signing to work properly. If they are not defined, Git commit signing will not be configured, but the container will still work for other purposes. + +## Troubleshooting + +If you encounter permission denied errors when trying to access directories, make sure you've run the `host-setup.sh` script on the host before starting the container: + +```bash +sudo .devcontainer/host-setup.sh +``` + +### Git SSH Signing Issues + +If you encounter issues with Git SSH signing: + +1. **SSH Agent Forwarding**: Make sure SSH agent forwarding is properly set up in your VS Code settings +2. **GitHub Configuration**: Ensure your SSH key is added to GitHub as a signing key in your account settings +3. **Manual Setup**: If automatic setup fails, you can manually configure SSH signing: + +```bash +# Check available SSH keys +ssh-add -l + +# Configure Git to use SSH signing +git config --global gpg.format ssh +git config --global user.signingkey "key::ssh-ed25519 YOUR_KEY_CONTENT" +git config --global gpg.ssh.allowedSignersFile ~/.ssh/allowed_signers +git config --global commit.gpgsign true + +# Create allowed signers file +echo "your.email@example.com ssh-ed25519 YOUR_KEY_CONTENT" > ~/.ssh/allowed_signers +``` + +For other issues, check the `project-setup.sh` and `setup-git-signing.sh` scripts for any errors. diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 000000000..8bb295680 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,44 @@ +{ + "name": "graph contracts", + "dockerComposeFile": [ + "docker-compose.yml" + ], + "service": "dev-graph-contracts", + "features": { + "ghcr.io/devcontainers/features/git:1": { + "configureGitHubCLI": true, + "gitCredentialHelper": "cache" + }, + "ghcr.io/devcontainers/features/github-cli:1": {}, + "ghcr.io/devcontainers/features/common-utils:2.5.3": {}, + "ghcr.io/devcontainers/features/node:1": { + "version": "20" + }, + "ghcr.io/devcontainers/features/docker-outside-of-docker:1": {} + }, + "postCreateCommand": ".devcontainer/project-setup.sh", + "remoteUser": "vscode", + "workspaceFolder": "${localWorkspaceFolder}", + "customizations": { + "vscode": { + "extensions": [ + "rust-lang.rust-analyzer", + "tamasfe.even-better-toml", + "usernamehw.errorlens", + "yzhang.markdown-all-in-one", + "DavidAnson.vscode-markdownlint", + "shd101wyy.markdown-preview-enhanced", + "bierner.markdown-preview-github-styles", + "Gruntfuggly.todo-tree", + "ms-azuretools.vscode-docker", + "donjayamanne.githistory", + "eamodio.gitlens", + "fill-labs.dependi", + "streetsidesoftware.code-spell-checker", + "Augment.vscode-augment", + "NomicFoundation.hardhat-solidity", + "foundry-rs.foundry-vscode" + ] + } + } +} diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml new file mode 100644 index 000000000..293c78c92 --- /dev/null +++ b/.devcontainer/docker-compose.yml @@ -0,0 +1,62 @@ +services: + dev-graph-contracts: + container_name: dev-graph-contracts + build: + context: . + dockerfile: Dockerfile + x-bake: + cache-from: + - type=local,src=/cache/docker + cache-to: + - type=local,dest=/cache/docker,mode=max + env_file: + - /opt/configs/graphprotocol/contracts.env + environment: + # Cache directories + - FOUNDRY_CACHE_DIR=/cache/foundry + - SOLC_CACHE=/cache/solidity + + # GitHub + - GH_CONFIG_DIR=/cache/github + + # XDG standard directories + - XDG_CACHE_HOME=/home/vscode/.cache + - XDG_CONFIG_HOME=/home/vscode/.config + - XDG_DATA_HOME=/home/vscode/.local/share + + # Tool-specific settings + - HARDHAT_CACHE_DIR=/cache/hardhat + - HARDHAT_ANALYTICS=true + - HARDHAT_NO_ANALYTICS_PROMPT=true + + # Node.js settings + - NPM_CONFIG_CACHE=/cache/npm + - YARN_CACHE_FOLDER=/cache/yarn + - NODE_OPTIONS=--max-old-space-size=4096 + + # Python settings + - PIP_CACHE_DIR=/cache/pip + - PYTHONPYCACHEPREFIX=/cache/pycache + - PYTHONDONTWRITEBYTECODE=1 + networks: + - shared + volumes: + # Mount cache directory + - /cache:/cache + + # System-specific mounts that need specific locations + - /cache/apt:/var/cache/apt + - /cache/apt-lib:/var/lib/apt + + # Git repo root + - /git:/git + + # Local cache directories for XDG standards + - /cache/vscode-cache:/home/vscode/.cache + - /cache/vscode-config:/home/vscode/.config + - /cache/vscode-data:/home/vscode/.local/share + - /cache/vscode-bin:/home/vscode/.local/bin + +networks: + shared: + external: true diff --git a/.devcontainer/host-setup.sh b/.devcontainer/host-setup.sh new file mode 100755 index 000000000..b85093826 --- /dev/null +++ b/.devcontainer/host-setup.sh @@ -0,0 +1,48 @@ +#!/usr/bin/env bash +# Host setup script for Graph Protocol Contracts dev container +# Run this script on the host before starting the dev container +# Usage: sudo .devcontainer/host-setup.sh + +set -euo pipefail + +echo "Setting up host environment for Graph Protocol Contracts dev container..." + +# Check if running as root +if [ "$(id -u)" -ne 0 ]; then + echo "Error: This script must be run as root (sudo)" >&2 + exit 1 +fi + +CACHE_DIRS=( + "/cache/vscode-cache" + "/cache/vscode-config" + "/cache/vscode-data" + "/cache/vscode-bin" + "/cache/hardhat" + "/cache/npm" + "/cache/yarn" + "/cache/pip" + "/cache/pycache" + "/cache/solidity" + "/cache/foundry" + "/cache/github" + "/cache/apt" + "/cache/apt-lib" +) + +echo "Creating cache directories..." +for dir in "${CACHE_DIRS[@]}"; do + if [ ! -d "$dir" ]; then + echo "Creating $dir" + mkdir -p "$dir" + chmod 777 "$dir" + else + echo "$dir already exists" + fi +done + +# Note: Package-specific directories will be created by the project-setup.sh script +# inside the container, as they are tied to the project structure + +echo "Host setup completed successfully!" +echo "You can now start or rebuild your dev container." diff --git a/.devcontainer/project-setup.sh b/.devcontainer/project-setup.sh new file mode 100755 index 000000000..05b05dfb0 --- /dev/null +++ b/.devcontainer/project-setup.sh @@ -0,0 +1,141 @@ +#!/bin/bash +# Project-specific setup script for graph +set -euo pipefail + +echo "Running project-specific setup for graph..." + +# Get the script directory and repository root +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" + +echo "Script directory: $SCRIPT_DIR" +echo "Repository root: $REPO_ROOT" + +# Check if cache directories exist +echo "Checking if cache directories exist..." + +# Required cache directories +REQUIRED_DIRS=( + "/cache/hardhat" + "/cache/npm" + "/cache/yarn" +) + +# Check if required directories exist +missing_dirs=() +for dir in "${REQUIRED_DIRS[@]}"; do + if [ ! -d "$dir" ]; then + missing_dirs+=("$dir") + fi +done + +# If any required directories are missing, show a warning +# Note: With set -u, we need to ensure missing_dirs is always initialized +if [ "${#missing_dirs[@]}" -gt 0 ]; then + echo "WARNING: The following required cache directories are missing:" + for dir in "${missing_dirs[@]}"; do + echo " - $dir" + done + echo "Please run the host setup script before starting the container:" + echo " sudo .devcontainer/host-setup.sh" + echo "Continuing anyway, but you may encounter issues..." +fi + +# Set up cache symlinks +echo "Setting up cache symlinks..." + +# Function to create symlinks for package cache directories +setup_cache_symlink() { + # With set -u, we need to ensure all parameters are provided + if [ "$#" -ne 1 ]; then + echo "Error: setup_cache_symlink requires exactly 1 argument (package_name)" + return 1 + fi + + local package_name=$1 + local cache_path="$REPO_ROOT/packages/${package_name}/cache" + local cache_dest="/cache/hardhat/${package_name}" + + # Skip if the package directory doesn't exist + if [ ! -d "$REPO_ROOT/packages/${package_name}" ]; then + return + fi + + # Create the package-specific cache directory if it doesn't exist + if [ ! -d "$cache_dest" ]; then + echo "Creating package-specific cache directory: $cache_dest" + mkdir -p "$cache_dest" + chmod -R 777 "$cache_dest" + fi + + # Create the symlink (will replace existing symlink if it exists) + ln -sf "$cache_dest" "$cache_path" + echo "Created symlink for ${package_name} cache" +} + +# Set up cache symlinks for main packages +setup_cache_symlink "contracts" +setup_cache_symlink "horizon" +setup_cache_symlink "subgraph-service" +setup_cache_symlink "data-edge" + +# Install project dependencies +echo "Installing project dependencies..." +if [ -f "$REPO_ROOT/package.json" ]; then + echo "Running yarn to install dependencies..." + cd "$REPO_ROOT" + # Note: With set -e, if yarn fails, the script will exit + # This is desirable as we want to ensure dependencies are properly installed + yarn +else + echo "No package.json found in the root directory, skipping dependency installation" +fi + +# Add CONTAINER_BIN_PATH to PATH if it's set +if [ -n "${CONTAINER_BIN_PATH:-}" ]; then + echo "CONTAINER_BIN_PATH is set to: $CONTAINER_BIN_PATH" + echo "Adding CONTAINER_BIN_PATH to PATH..." + + # Add to current PATH + export PATH="$CONTAINER_BIN_PATH:$PATH" + + # Add to .bashrc if not already there + if ! grep -q "export PATH=\"\$CONTAINER_BIN_PATH:\$PATH\"" "$HOME/.bashrc"; then + echo "Adding CONTAINER_BIN_PATH to .bashrc..." + echo ' +# Add CONTAINER_BIN_PATH to PATH if set +if [ -n "${CONTAINER_BIN_PATH:-}" ]; then + export PATH="$CONTAINER_BIN_PATH:$PATH" +fi' >> "$HOME/.bashrc" + fi + + echo "CONTAINER_BIN_PATH added to PATH" +else + echo "CONTAINER_BIN_PATH is not set, skipping PATH modification" +fi + +# Source shell customizations if available in PATH +if command -v shell-customizations &> /dev/null; then + SHELL_CUSTOMIZATIONS_PATH=$(command -v shell-customizations) + echo "Found shell customizations in PATH at: ${SHELL_CUSTOMIZATIONS_PATH}" + echo "Sourcing shell customizations..." + source "${SHELL_CUSTOMIZATIONS_PATH}" + + # Add to .bashrc if not already there + if ! grep -q "source.*shell-customizations" "$HOME/.bashrc"; then + echo "Adding shell customizations to .bashrc..." + echo "source ${SHELL_CUSTOMIZATIONS_PATH}" >> "$HOME/.bashrc" + fi +else + echo "Shell customizations not found in PATH, skipping..." +fi + +# Set up Git SSH signing +echo "Setting up Git SSH signing..." +if [ -f "$SCRIPT_DIR/setup-git-signing.sh" ]; then + "$SCRIPT_DIR/setup-git-signing.sh" +else + echo "WARNING: setup-git-signing.sh not found, skipping Git SSH signing setup" +fi + +echo "Project-specific setup completed" diff --git a/.devcontainer/sample-graph.env b/.devcontainer/sample-graph.env new file mode 100644 index 000000000..b6eab6144 --- /dev/null +++ b/.devcontainer/sample-graph.env @@ -0,0 +1,12 @@ +# Sample environment file for Graph Protocol contracts development +# Copy the Git settings below to your actual environment file at: +# /opt/configs/graphprotocol/contracts.env + +# Git settings for commit signing +# Add these settings if you want to enable Git commit signing +GIT_USER_NAME=Your Name +GIT_USER_EMAIL=your.email@example.com + +# Custom binary path +# Add this setting if you want to add a custom binary path to the PATH inside the container +# CONTAINER_BIN_PATH=/path/to/your/binaries diff --git a/.devcontainer/setup-git-signing.sh b/.devcontainer/setup-git-signing.sh new file mode 100755 index 000000000..3764c50a6 --- /dev/null +++ b/.devcontainer/setup-git-signing.sh @@ -0,0 +1,76 @@ +#!/bin/env bash +# Automatically configure Git to use SSH signing with forwarded SSH keys +set -euo pipefail + +echo "Setting up Git SSH signing..." + +# Check if SSH agent forwarding is working +if ! ssh-add -l &>/dev/null; then + echo "ERROR: No SSH keys found in agent. SSH agent forwarding is not set up correctly." + echo "SSH signing will not work without SSH agent forwarding." + exit 1 +fi + +# Get the first SSH key from the agent +SSH_KEY=$(ssh-add -L | head -n 1) +if [ -z "$SSH_KEY" ]; then + echo "ERROR: No SSH keys found in agent. SSH signing will not work." + exit 1 +fi + +# Extract the key type and key content +KEY_TYPE=$(echo "$SSH_KEY" | awk '{print $1}') +KEY_CONTENT=$(echo "$SSH_KEY" | awk '{print $2}') + +# Check if Git user settings are available +if [[ -z "${GIT_USER_NAME:-}" || -z "${GIT_USER_EMAIL:-}" ]]; then + echo "WARNING: Git user settings (GIT_USER_NAME and/or GIT_USER_EMAIL) are not set." + echo "Git commit signing will not be configured." + echo "If you need Git commit signing, add these variables to your environment file." + exit 0 +fi + +# Set Git user name from environment variable +echo "Setting Git user.name: $GIT_USER_NAME" +git config --global user.name "$GIT_USER_NAME" + +# Set Git user email from environment variable +echo "Setting Git user.email: $GIT_USER_EMAIL" +git config --global user.email "$GIT_USER_EMAIL" + +# Create the .ssh directory if it doesn't exist +mkdir -p ~/.ssh +chmod 700 ~/.ssh + +# Create or update the allowed signers file +echo "Updating allowed signers file..." +ALLOWED_SIGNERS_FILE=~/.ssh/allowed_signers +SIGNER_LINE="$GIT_USER_EMAIL $KEY_TYPE $KEY_CONTENT" + +# Create the file if it doesn't exist +if [ ! -f "$ALLOWED_SIGNERS_FILE" ]; then + echo "$SIGNER_LINE" > "$ALLOWED_SIGNERS_FILE" + echo "Created new allowed signers file." +else + # Check if the key is already in the file + if ! grep -q "$KEY_CONTENT" "$ALLOWED_SIGNERS_FILE"; then + # Append the key if it's not already there + echo "$SIGNER_LINE" >> "$ALLOWED_SIGNERS_FILE" + echo "Added new key to allowed signers file." + else + echo "Key already exists in allowed signers file." + fi +fi + +chmod 600 "$ALLOWED_SIGNERS_FILE" + +# Configure Git to use SSH signing +echo "Configuring Git to use SSH signing..." +git config --global gpg.format ssh +git config --global user.signingkey "key::$KEY_TYPE $KEY_CONTENT" +git config --global gpg.ssh.allowedSignersFile ~/.ssh/allowed_signers +git config --global commit.gpgsign true + +echo "Git SSH signing setup complete!" +echo "Your commits will now be automatically signed using your SSH key." +echo "Make sure this key is added to GitHub as a signing key in your account settings." diff --git a/.gitignore b/.gitignore index ecd5f0d2c..45e325072 100644 --- a/.gitignore +++ b/.gitignore @@ -17,10 +17,13 @@ node_modules/ artifacts/ cache/ cached/ +cache # Build artifacts dist/ build/ +typechain/ +typechain-types/ deployments/hardhat/ # Ignore solc bin output @@ -32,8 +35,10 @@ bin/ .vscode # Coverage and other reports +coverage/ reports/ coverage.json +lcov.info # Local test files addresses-local.json @@ -45,8 +50,20 @@ addresses-fork.json # Keys .keystore +# Forge artifacts +cache_forge + # Graph client .graphclient tx-builder-*.json -!tx-builder-template.json \ No newline at end of file +!tx-builder-template.json + +# Hardhat Ignition +**/chain-31337/ +**/chain-1377/ +**/horizon-localhost/ +**/horizon-hardhat/ +**/subgraph-service-localhost/ +**/subgraph-service-hardhat/ +!**/ignition/**/artifacts/ diff --git a/.husky/commit-msg b/.husky/commit-msg index fe4c17a22..dab272daf 100755 --- a/.husky/commit-msg +++ b/.husky/commit-msg @@ -1,4 +1 @@ -#!/bin/sh -. "$(dirname "$0")/_/husky.sh" - npx --no-install commitlint --edit "" diff --git a/.husky/pre-commit b/.husky/pre-commit index 487427eda..0cc5fa1a9 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,12 +1,2 @@ -#!/usr/bin/env sh -. "$(dirname -- "$0")/_/husky.sh" - -# contracts -pushd packages/contracts -npx --no-install lint-staged -popd - -# data-edge -pushd packages/data-edge -npx --no-install lint-staged -popd \ No newline at end of file +(cd packages/contracts && npx --no-install lint-staged) +(cd packages/data-edge && npx --no-install lint-staged) diff --git a/package.json b/package.json index 4f1c06aa7..8073c6d82 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,6 @@ "@changesets/cli": "^2.27.1", "@commitlint/cli": "^18.4.3", "@commitlint/config-conventional": "^18.4.3", - "husky": "^8.0.3" + "husky": "^9.1.7" } } diff --git a/yarn.lock b/yarn.lock index ff0f7312d..fe31d62d2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2781,7 +2781,7 @@ __metadata: "@changesets/cli": "npm:^2.27.1" "@commitlint/cli": "npm:^18.4.3" "@commitlint/config-conventional": "npm:^18.4.3" - husky: "npm:^8.0.3" + husky: "npm:^9.1.7" languageName: unknown linkType: soft @@ -14380,12 +14380,12 @@ __metadata: languageName: node linkType: hard -"husky@npm:^8.0.3": - version: 8.0.3 - resolution: "husky@npm:8.0.3" +"husky@npm:^9.1.7": + version: 9.1.7 + resolution: "husky@npm:9.1.7" bin: - husky: lib/bin.js - checksum: 6722591771c657b91a1abb082e07f6547eca79144d678e586828ae806499d90dce2a6aee08b66183fd8b085f19d20e0990a2ad396961746b4c8bd5bdb619d668 + husky: bin.js + checksum: 35bb110a71086c48906aa7cd3ed4913fb913823715359d65e32e0b964cb1e255593b0ae8014a5005c66a68e6fa66c38dcfa8056dbbdfb8b0187c0ffe7ee3a58f languageName: node linkType: hard