Skip to content

v2.58.0: fallow hooks namespace, source-maps upload, merge-base hook resolution

Choose a tag to compare

@BartWaardenburg BartWaardenburg released this 01 May 06:44
· 4118 commits to main since this release
v2.58.0
bf49e80

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 agent

fallow 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" --quiet

Previously 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