opensrc

June 23, 2026 · View on GitHub

Give coding agents access to any package's source code. Resolves packages from registry APIs, shallow-clones at the correct version tag, and caches globally at ~/.opensrc/.

Install

npm install -g opensrc

Installing globally gives you the native Rust binary directly — no Node.js overhead on each run.

Usage

opensrc path prints the absolute path to a package's source, fetching on cache miss. Compose it with any tool:

rg "parse" $(opensrc path zod)
cat $(opensrc path zod)/src/types.ts
find $(opensrc path pypi:requests) -name "*.py"
ls $(opensrc path crates:serde)/src/
grep -r "Router" $(opensrc path vercel/next.js)/packages/next/src/

Multiple packages at once:

rg "parse" $(opensrc path zod react next)

Specific versions:

rg "ZodError" $(opensrc path zod@3.22.0)
cat $(opensrc path pypi:flask@3.0.0)/src/flask/app.py

Options:

  • --cwd <path> — working directory for lockfile version resolution
  • --verbose — show progress during fetch

Fetch source code

Pre-fetch one or more packages or repos into the cache without printing paths:

opensrc fetch zod
opensrc fetch pypi:requests crates:serde vercel/next.js

Options:

  • --cwd <path> — working directory for lockfile version resolution
  • --quiet / -q — suppress progress output

List cached sources

opensrc list          # human-readable
opensrc list --json   # JSON output

Remove cached sources

opensrc remove zod
opensrc remove vercel/next.js
opensrc rm pypi:requests

Clean cache

opensrc clean            # remove everything
opensrc clean --packages # only packages
opensrc clean --repos    # only repos
opensrc clean --npm      # only npm packages
opensrc clean --pypi     # only PyPI packages
opensrc clean --crates   # only crates.io packages

Supported Registries

RegistryPrefixExample
npm(default) or npm:opensrc path zod
PyPIpypi:, pip:, python:opensrc path pypi:requests
crates.iocrates:, cargo:, rust:opensrc path crates:serde
GitHubowner/repo or URLopensrc path vercel/next.js
GitLabgitlab: or URLopensrc path gitlab:owner/repo
Bitbucketbitbucket: or URLopensrc path bitbucket:owner/repo

How It Works

  1. Resolves the package to a git repository URL via registry APIs
  2. Detects the installed version from lockfiles (npm only) or uses latest
  3. Shallow-clones the repo at the matching version tag
  4. Caches in ~/.opensrc/repos/<host>/<owner>/<repo>/<version>/
  5. Tracks metadata in ~/.opensrc/sources.json

The OPENSRC_HOME environment variable overrides the default cache location.

Development

Requires Rust and Node.js 24+.

# Build
cargo build --manifest-path cli/Cargo.toml

# Run tests
cargo test --manifest-path cli/Cargo.toml

# Build release + copy to bin/
npm run build:native

# Format
cargo fmt --manifest-path cli/Cargo.toml

# Lint
cargo clippy --manifest-path cli/Cargo.toml -- -D warnings

License

Apache-2.0