Repository navigation
v2.58.0: fallow hooks namespace, source-maps upload, merge-base hook resolution
A two-feature release: a new unified fallow hooks command surface and a new CI subcommand for uploading bundled source maps to fallow cloud, plus a long-asked fix to the generated Git pre-commit hook so it does the right thing on repos with multiple long-lived integration branches.
Highlights
fallow hooks install --target {git,agent} namespace
A single command surface for both the shell-level Git pre-commit hook scaffolder and the Claude Code / Codex agent gate.
# Git pre-commit hook (shell, runs on `git commit`)
fallow hooks install --target git
# Agent gate (Claude Code / Codex, runs before agent-issued git commit / git push)
fallow hooks install --target agentfallow init --hooks and fallow setup-hooks continue to work as compatibility aliases that delegate to the same engine. Both install and uninstall accept --dry-run and --force; uninstall --target git preserves user-authored pre-commit scripts unless --force is passed (managed scripts carry a # Generated by fallow hooks install --target git. marker).
Generated Git hook compares against merge-base @{upstream} HEAD
The generated pre-commit hook now resolves the base ref at commit time:
UPSTREAM="$(git rev-parse --abbrev-ref --symbolic-full-name '@{upstream}' 2>/dev/null || true)"
if [ -n "$UPSTREAM" ]; then
BASE="$(git merge-base "$UPSTREAM" HEAD 2>/dev/null || echo "$UPSTREAM")"
else
BASE="<fallback>"
fi
fallow audit --base "$BASE" --quietPreviously the auto-detected default branch was baked into the script literally, which broke on repos with multiple long-lived integration branches (next-release / hotfix / LTS) where the right base depends on which branch the feature targets. Diffing against the merge-base with the upstream is the topology-agnostic answer: a feature branch forked off a non-default integration branch now compares against the actual fork point, not against its own remote tracking branch. --branch is repurposed as the fallback used only when no upstream is set.
Existing on-disk hook scripts are unchanged; the new behaviour applies after re-running fallow init --hooks or fallow hooks install --target git.
Thanks @OmerGronich for the report. (#242)
fallow coverage upload-source-maps CI subcommand
Uploads JavaScript source maps from a build output directory to fallow cloud so cloud-mode runtime coverage can resolve bundled paths back to original source files.
# Typical CI usage (after `npm run build`)
export FALLOW_API_KEY=fal_...
fallow coverage upload-source-maps # defaults to dist/**/*.map
fallow coverage upload-source-maps --strip-path=false # for monorepo bundlers| Flag | Purpose |
|---|---|
--dir |
Build output directory to scan recursively (default: dist) |
--include / --exclude |
Glob filters relative to --dir |
--repo |
Auto: package.json repository.url → git remote get-url origin |
--git-sha |
Auto: $GITHUB_SHA → $CI_COMMIT_SHA → $COMMIT_SHA → git rev-parse HEAD |
--strip-path |
Send only basename as fileName (default true); set false for bundlers that report assets/app.js |
--concurrency |
Parallel uploads (default 4) |
--dry-run, --fail-fast |
Standard CI ergonomics |
The API key is read only from $FALLOW_API_KEY (no flag form, intentional, keeps the secret out of argv). Per-map retry on transient 429 / 5xx; maps over 10 MiB warn, over 100 MiB are rejected. Exit codes: 0 ok · 1 partial-failure · 2 validation.
Full Changelog: v2.57.0...v2.58.0