# Default clone target is ~/resq; override with RESQ_DIR=...
curl -fsSL https://raw.githubusercontent.com/resq-software/dev/main/install.sh | shWhat happens, in order:
- Installs
gh(GitHub CLI) if missing - Authenticates with GitHub
- Installs Nix via the Determinate Systems installer for reproducible toolchains
- Lets you choose which repo to clone
- Runs
nix developto build the dev environment - Installs the canonical git hooks (delegating to
resq pre-commit) - Offers to scaffold a repo-type-specific
local-pre-push(auto-detects Rust / Python / Node / .NET / C++ / Nix)
Run unattended (CI / provisioning):
REPO=npm YES=1 RESQ_DIR=/srv/work \
curl -fsSL https://raw.githubusercontent.com/resq-software/dev/main/install.sh | sh| Repo | What | Languages |
|---|---|---|
programs |
Solana on-chain programs | Rust (Anchor) |
dotnet-sdk |
.NET client libraries | C# |
pypi |
Python packages (MCP + DSA) | Python |
crates |
Rust workspace (CLI + DSA + resq binary) |
Rust |
npm |
TypeScript packages (UI + DSA) | TypeScript |
vcpkg |
C++ libraries | C++ |
viz |
Visualization library (.NET) | C# |
landing |
Marketing site | TypeScript |
docs |
Documentation site | MDX |
dev |
This repo — install scripts and onboarding | Shell / PowerShell |
Public repos sync to the monorepo automatically.
Each script can be run on its own without going through the full onboarding flow.
| Script | Use case | Bootstrap |
|---|---|---|
install.sh / install.ps1 |
Full onboarding — installs prereqs, clones a repo, sets up dev env + hooks | curl -fsSL .../install.sh | sh |
install-hooks.sh / install-hooks.ps1 |
Drop the canonical git hooks into any repo. Asks to scaffold local-pre-push if resq is on PATH |
cd <repo> && curl -fsSL .../install-hooks.sh | sh |
install-resq.sh |
Install the resq CLI binary from the latest GitHub Release (SHA256-verified). Falls back to cargo install --git if no release asset matches the host platform |
curl -fsSL .../install-resq.sh | sh |
Common env vars across all of them:
RESQ_DEV_REF=<sha\|tag>— pin to a specific revision instead of rollingmainYES=1— skip prompts (CI / provisioning)GIT_HOOKS_SKIP=1— disable installed hooks for a sessionRESQ_SKIP_LOCAL_SCAFFOLD=1— opt out of thelocal-pre-pushscaffold prompt
| Repo | Language | Setup |
|---|---|---|
| programs | Rust / Anchor | anchor build |
| dotnet-sdk | C# / .NET 9 | dotnet restore |
| pypi | Python | uv sync |
| crates | Rust | cargo build |
| npm | TypeScript | bun install |
| vcpkg | C++ | cmake --preset default |
| viz | C# / .NET 9 | dotnet restore |
| landing | Next.js | bun install && bun dev |
| docs | MDX / Mintlify | mintlify dev |
Every ResQ repo ships an AGENTS.md at the root — the canonical plain-text dev guide. That's where the build/test/lint commands, architecture notes, and standards for that specific repo live. Read it first.
Org-wide guidance (onboarding, hooks contract, commit format, PR process) lives in the .github org repo: CONTRIBUTING.md, SECURITY.md, CODE_OF_CONDUCT.md. Every public repo falls back to those automatically.
Everything is pinned via Nix flakes. No "works on my machine" issues.
| Language | Tools |
|---|---|
| Rust | rustc, cargo, clippy, rustfmt, cargo-deny |
| TypeScript | bun, node, turbo |
| Python | python 3.12, uv, ruff, mypy |
| C# | dotnet 9 |
| C++ | gcc, cmake, clang-format |
| Protobuf | buf, protoc |
| Solana | solana-cli, anchor |
Six hook shims live in resq-software/crates — embedded in the resq binary and served at a stable raw URL. install-hooks.sh picks the best path automatically:
resqon PATH → callsresq hooks install, which scaffolds the 6 canonical hooks from the templates embedded in the binary. Offline, versioned with the installedresq.- No
resq→ falls back tocurlfromresq-software/crates/master/.../templates/git-hooks/.
The hooks delegate logic back to the resq binary (resq pre-commit, etc.), so updates roll out via cargo install --git (or install-resq.sh) without editing every repo.
| Hook | What it gates |
|---|---|
pre-commit |
resq pre-commit — copyright, secrets, audit, polyglot format |
commit-msg |
Conventional Commits + ! marker; blocks WIP: / fixup! / squash! on main |
prepare-commit-msg |
Prepends [TICKET-123] from branch name |
pre-push |
Force-push guard, branch-naming convention (feat/, fix/, …, changeset-release/* allowed) |
post-checkout / post-merge |
Notifies on lock-file changes (Cargo, bun, uv, flake) |
Each hook then dispatches to .git-hooks/local-<hook-name> (if executable) — the only place a repo commits hook customization. Generate one with the right language template:
resq hooks scaffold-local --kind auto # detects rust/python/node/dotnet/cpp/nixresq hooks doctor reports drift, resq hooks update re-syncs from the embedded canonical, resq hooks status prints a one-line shell-friendly summary.
The canonical content lives in exactly one place: crates/resq-cli/templates/git-hooks/. The crates repo's own .git-hooks/ (for dog-fooding) is kept identical via hooks-sync.yml. The dev/ repo used to ship a third copy and was retired in Phase 4 — install-hooks.sh now fetches from the crates source (or lets resq hooks install do it offline). Bats + Rust integration tests cover the hook behavior end-to-end.
Apache License 2.0