- Add Node version check to build-dist pre-commit hook - Create helper script to switch to Node 20 - Update documentation with clear instructions - Fix YAML syntax in pre-commit config This ensures dist is always built with Node 20, preventing CI failures due to version mismatches. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
3.9 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Overview
This is a GitHub Action written in Node.js that detects breaking API changes in Go code using the official golang.org/x/exp/cmd/apidiff tool. It analyzes Go API compatibility between commits and can comment on pull requests with detailed change reports.
Common Commands
Development
Important: Use Node.js v20 to match GitHub Actions runtime.
# Install dependencies
npm ci
# Run tests
npm test
# Run linting
npm run lint
# Run formatter
npm run format
# Build the action (compiles to dist/)
npm run build
# Run pre-commit hooks manually
pre-commit run --all-files
Testing the Action Locally
The action supports testing with environment variables:
# Test with directories
INPUT_OLD=testdata/break/old INPUT_NEW=testdata/break/new node index.js
# Test with git refs
INPUT_OLD=HEAD~1 INPUT_NEW=HEAD node index.js
Architecture
Core Components
-
index.js - Main entry point that:
- Reads GitHub Action inputs
- Determines which commits/directories to compare
- Orchestrates the apidiff run, parsing, and PR commenting
- Sets action outputs
-
lib/apidiff.js - Handles running the official apidiff tool:
- Installs
golang.org/x/exp/cmd/apidiffif not present - Supports both git refs and directory comparisons
- For directories: creates export files first, then compares them
- For git refs: runs apidiff directly on the commits
- Installs
-
lib/parser.js - Parses apidiff text output:
- Extracts breaking and compatible changes by package
- Converts to structured format
- Generates markdown reports for PR comments
-
lib/commenter.js - Manages PR comments:
- Creates or updates existing comments (identified by hidden tag)
- Requires
pull-requests: writepermission - Uses GitHub Actions toolkit for API access
Testing Structure
The testdata/ directory contains test cases:
clean/- No API changessafe/- Only compatible changes (additions)break/- Contains breaking changes
Each test case has old/ and new/ subdirectories with Go code.
Build Process
The action uses @vercel/ncc to compile all dependencies into a single dist/index.js file. This is required for GitHub Actions and must be committed to the repository. The dist/ folder is intentionally NOT in .gitignore.
Important: The dist must be built with Node.js v20 to match GitHub Actions runtime.
To build and commit dist after making changes:
# Method 1: Use the helper script
./scripts/use-node-20.sh # Switches to Node 20
npm run build
git add dist/index.js
git commit -m "Rebuild dist"
# Method 2: Manual with nvm
nvm use # Reads .nvmrc and switches to Node 20.9.0
node --version # Should show v20.x.x
npm run build
git add dist/index.js
git commit -m "Rebuild dist"
Important: The pre-commit hooks will:
- Verify you're using Node 20 before building dist
- Automatically rebuild dist when source files change
- Prevent commits if dist is out of date
If you get an error about Node version, switch to Node 20 using nvm use or ./scripts/use-node-20.sh.
Pre-commit Hooks
Configured with husky to run:
- ESLint and Prettier on JS files
- Pretty-format-json on JSON files (excluding package-lock.json)
- Builds dist/ and verifies it's up to date
Key Design Decisions
- Node.js wrapper around Go tool: Rather than reimplementing apidiff, this action wraps the official tool
- Support for both directories and git refs: Allows testing without git commits
- Structured parsing: Converts free-text apidiff output into structured data for better formatting
- Comment management: Updates existing comments rather than creating duplicates
Workflow Guidance
- When you open a PR, enable auto-merge, and watch CI checks until they complete and the PR merges. If CI fails, use the gh CLI to diagnose the error