How to Set Up Pre-Commit Hooks in OpenWork: A Complete Guide
OpenWork does not include active pre-commit hooks by default; you'll need to manually create and configure them using Git's sample hooks as a starting point.
The OpenWork repository (different-ai/openwork) ships without any enforced pre-commit checks. While the dev branch contains Git's default sample hook files, none are active. This guide explains what's currently in place and how to add your own pre-commit hooks for linting, testing, or custom validation.
What Pre-Commit Hooks Exist in OpenWork Today
A review of the source code reveals only inactive sample files provided by Git during repository initialization:
.git/hooks/pre-commit.sample— The standard Git template that must be renamed topre-committo become active..git/hooks/pre-applypatch.sample— Contains a reference to apre-commithook, but only as a placeholder comment..git/hooks/pre-merge-commit.sample— Includes conditional logic to callpre-commitif it existed, but does not create it.
No .pre-commit-config.yaml, Husky configuration, or custom hook scripts are present anywhere in the codebase. Consequently, developers can commit code without any automated checks running first.
How to Create and Enable a Pre-Commit Hook in OpenWork
Since OpenWork uses pnpm for package management, your pre-commit hook will likely run scripts defined in package.json. Here's how to set one up from scratch.
Step 1: Create the Hook Script
Git hooks live in .git/hooks/ and must be executable shell scripts. Create a pre-commit file that runs your linting or tests:
cat > .git/hooks/pre-commit <<'EOF'
#!/bin/sh
# OpenWork pre-commit hook: run linting before each commit
echo "Running pre-commit checks..."
pnpm lint
if [ $? -ne 0 ]; then
echo "ERROR: Linting failed – commit aborted"
exit 1
fi
echo "All checks passed – proceeding with commit"
EOF
Step 2: Make It Executable
Git ignores hook files without execute permissions:
chmod +x .git/hooks/pre-commit
Step 3: Test the Hook Manually
Before committing, verify your hook works by running it directly:
.git/hooks/pre-commit
If your linting fails, the script exits with code 1 and blocks the commit. Fix the errors, then retry.
Alternative: Using the Pre-Commit Framework
For more robust hook management, install the pre-commit framework instead of writing raw shell scripts:
# Install the pre-commit tool
pip install pre-commit
# Create configuration file
cat > .pre-commit-config.yaml <<'EOF'
repos:
- repo: local
hooks:
- id: pnpm-lint
name: pnpm lint
entry: pnpm lint
language: system
pass_filenames: false
EOF
# Install hooks into Git
pre-commit install
This creates a .pre-commit-config.yaml at the repository root and automatically generates .git/hooks/pre-commit as a wrapper.
Key Differences: Raw Git Hooks vs. Pre-Commit Framework
| Approach | Best For | Setup Complexity | Portability |
|---|---|---|---|
| Raw Git hook | Simple, single-script checks | Low (one shell file) | Must manually copy to each clone |
| Pre-commit framework | Multiple hooks, complex logic, team sharing | Medium (config file + tool) | Config file committed to repo |
For OpenWork's current structure, a raw Git hook suffices for individual developers. For team-wide enforcement, add .pre-commit-config.yaml to version control and document the setup in CONTRIBUTING.md.
Persisting Hooks Across Team Members
Git hooks in .git/hooks/ are not tracked by Git. To share hooks with collaborators, store them elsewhere in the repository and copy or symlink them during setup:
# Store hooks in the repo
mkdir -p scripts/git-hooks
cp .git/hooks/pre-commit scripts/git-hooks/
# Add to package.json scripts for easy installation
# "prepare": "cp scripts/git-hooks/pre-commit .git/hooks/pre-commit && chmod +x .git/hooks/pre-commit"
Then teammates run pnpm prepare after cloning to activate the same hooks you use.
Common Pre-Commit Checks for OpenWork Projects
Based on typical monorepo patterns, consider adding these checks to your OpenWork pre-commit hook:
pnpm lint— Run ESLint across modified files.pnpm typecheck— Validate TypeScript compilation.pnpm test:changed— Execute only tests affected by your changes.
Chain multiple checks with logical operators, exiting immediately on any failure:
#!/bin/sh
pnpm lint || exit 1
pnpm typecheck || exit 1
pnpm test:changed || exit 1
Summary
- OpenWork's
devbranch contains only inactive Git sample hooks — no enforcement exists by default. - Active hooks require manually creating
.git/hooks/pre-commitand marking it executable. - The repository uses pnpm, so hook scripts typically invoke
pnpm lintor similar commands. - For team-wide consistency, store hook scripts in a tracked directory and automate installation via
package.jsonscripts or the pre-commit framework.
Frequently Asked Questions
Does OpenWork come with pre-commit hooks enabled?
No. The repository includes only Git's default sample files — .git/hooks/pre-commit.sample, .git/hooks/pre-applypatch.sample, and .git/hooks/pre-merge-commit.sample. These must be renamed or replaced to become functional. No .pre-commit-config.yaml or similar configuration exists.
Where should I place custom pre-commit hooks in OpenWork?
Create your hook directly at .git/hooks/pre-commit and run chmod +x to make it executable. For portability, store the script elsewhere in the repository (e.g., scripts/git-hooks/) and copy or symlink it during project setup.
Can I use Husky with OpenWork?
Yes, though it requires installation. Run pnpm add -D husky and add "prepare": "husky install" to your package.json scripts. Then create hooks with npx husky add .husky/pre-commit "pnpm lint". Since Husky manages .git/hooks/ for you, raw Git hooks and Husky should not be mixed on the same repository clone.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →