Releases: Data-Wise/flow-cli
v7.9.0 — obs dispatcher removed + binary-precedence guard
Highlights
obs dispatcher removed — flow-cli's obs shadowed (and broke) the real Homebrew obs binary from obsidian-cli-ops. Typing obs now runs the real tool. 15 → 14 dispatchers (+ the at bridge); the canonical obs man page now lives in obsidian-cli-ops.
Binary-precedence guard — the dispatcher loader now drops any command that would shadow an installed $PATH binary, so no dispatcher can silently mask a working tool again. Allowlist legitimate shadows via FLOW_INTENTIONAL_SHADOWS (default r mcp cc) or force-keep one with FLOW_FORCE_DISPATCHER_<NAME>=1; FLOW_DEBUG shows skip logs.
Changes
- Removed:
obsdispatcher +man/man1/obs.1+ its test; scrubbed all inventories - Added:
_flow_load_dispatcherbinary-precedence guard +test-dispatcher-binary-precedence.zsh(18 checks) - Fixed: dogfood scholar-config assertion (#459); CI Node 20 deprecation (#457)
- Changed: dependency bumps (prettier, checkout v6, lint-staged 17, app-token v3); dropped unused eslint
Stats
59 test suites passing (211 files, 12000+ assertions), 1 expected interactive timeout.
Full changelog: https://github.com/Data-Wise/flow-cli/blob/main/CHANGELOG.md
v7.8.1 — full man-page set + version-sync guard
Highlights
Full man-page set — man/man1/ now covers all 15 dispatchers + the at bridge (was frozen at flow-cli 3.0.0 with only 5 pages). man tok documents tok sync push/repos/gh, --no-sync, and FLOW_TOK_AUTOSYNC.
Anti-drift guard — tests/test-manpage-version-sync.zsh fails CI if any man page's .TH version diverges from FLOW_VERSION, and enforces coverage (every dispatcher has a page, no orphans). release.sh auto-bumps .TH, so the pages can't silently re-freeze.
Patch release (docs + tooling). Upgrade: brew upgrade data-wise/tap/flow-cli.
v7.8.0 — token auto-sync + fzf terminal-hygiene
Highlights
tok sync — auto-sync tokens to GitHub Actions secrets (#452)
After tok github/npm/pypi, tok rotate, or tok <name> --refresh, fan a token out to mapped repo Actions secrets via gh secret set (stdin only — never argv). New tok sync push <name> / tok sync repos <name> (dry-run inspect); chezmoi-managed flat config ~/.config/flow/tok-sync.conf; OIDC-flagged targets get a Trusted-Publishing recommendation instead of a push; confirm-once gate; --no-sync / FLOW_TOK_AUTOSYNC=0 disable the auto-hook.
fzf→exec terminal-hygiene, fixed across all pickers
The v7.7.1 cleanup lived only in pick(); cc wt pick / ccy wt pick / work + ccy still corrupted Claude's prompt. Extracted _flow_tty_handoff_cleanup into lib/core.zsh (guards on /dev/tty, not stdout — these pickers are command-substituted) and call it from all three pickers; refactored pick() to use the shared helper. Regression guard enforces any new fzf→exec picker calls it.
Also
tok syncshell completion now offersgh/push/repos.
Stats
- 58/58 test suites passing (1 expected interactive/tmux timeout)
- Pure ZSH, zero dependencies
Full changelog: https://github.com/Data-Wise/flow-cli/blob/main/CHANGELOG.md
v7.7.1 — terminal-handoff hygiene
What's New
Bug Fixes
- fix(pick): restore terminal state after fzf to prevent TUI handoff corruption — resets focus-reporting, mouse modes, and bracket-paste (
\e[?1004l\e[?1000l\e[?1002l\e[?1003l\e[?1006l\e[?2004l) and drains pending input before exec - fix(zsh): gate iTerm2 shell integration to iTerm2 only — no longer injected in Warp, Ghostty, or other non-iTerm2 terminals
Tests
- test(pick): terminal-hygiene regression guard — source-scan tests anchored on code landmarks (
fzf_exit=,2004l), mutation-verified against both false positives and true regressions
Docs
- docs(site): Visual Workflows hub with 5 mermaid flowcharts (onboarding, daily loop, project switching, git workflow, dopamine loop)
- docs(site): TL;DR admonitions on 4 high-traffic entry pages
- style(docs): Mermaid diagrams scroll horizontally on mobile
Chores
- chore: gitignore zsh backup files (
*.bak,*.bak-*,*-bak)
Upgrading
brew upgrade data-wise/tap/flow-cliv7.7.0 — doctor cache + zsh-scope hardening
Highlights
flow doctorGitHub token validation cache (1h TTL, fingerprint-keyed by sha256 prefix of the token). Subsequent invocations skip the GitHub/userAPI call — saves ~5–8s per warmflow doctorrun. Auto-invalidates on token rotation. Bypass withflow doctor --no-cache.- Three latent zsh bugs fixed — all surfaced through test harnesses; production was unaffected (top-level sourcing keeps zsh globals intact).
Added
flow doctorGitHub token validation cache +--no-cacheflagtests/test-readonly-scope-regression.zsh— five-test guard against the bare-readonlyzsh function-scope trap, including a functional proof that the trap still exists in current zsh
Fixed
- doctor-cache silent write failures —
lib/doctor-cache.zshconstants were declared withreadonlyinstead oftypeset -gr. When the lib was sourced from inside a function (e.g., a test harnesssetup()), zsh treated the declarations as function-local; they vanished when the caller returned. The persistent load-guard then suppressed re-initialization. Symptom:max_attempts=$((DOCTOR_CACHE_LOCK_TIMEOUT * 10))evaluated to0, the lock-acquire loop ran zero iterations, and_doctor_cache_setfailed with "Failed to acquire cache lock for writing." - Preventive: same fix in
lib/analysis-cache.zshandlib/macro-parser.zsh— same pattern, not yet bitten in practice. create_mocksave/restore destroyed originals —tests/test-framework.zshusedwhence -f $fn | tail -n +2to capture function bodies, buttail -n +2left the trailing}in the body. Wrapping it in a new template produced unbalanced braces and a silent eval parse error. The cascade: silent save failure →reset_mockscouldn't find the saved original → fell intounset -f→ original function permanently destroyed. Replaced with zsh's\${functions[name]}associative array, which round-trips losslessly.
Changed
- Removed the
CACHED_DOCTOR_VERBOSEworkaround intests/test-doctor.zsh— the production cache wired in v7.6.0's PR #446 already deduplicatesdoctor --verbosecalls.
Stats
- 56 files changed (47 are mechanical version-display sweeps in docs)
- Test suite: 53/53 → 54/54 (+1 file: 205 → 206 test files)
- All passing under
./tests/run-all.sh(1 expected IMAP timeout)
Compare
v7.6.0 — em --prompt + Scholar Config Sync
Highlights
- em --prompt flag — Natural-language instructions for AI-drafted replies, sends, and forwards (
em reply 123 --prompt 'decline politely') - em --backend flag — Per-command AI backend override (
--backend claude|gemini) - em forward command — Forward emails with optional AI body and
--promptsupport - Scholar Config Sync —
--configflag auto-appended to all Scholar commands when.flow/teach-config.ymlexists - Config subcommands —
teach config check,teach config diff,teach config show,teach config scaffold - New teach wrappers —
teach solution,teach sync,teach validate-r
Changes
Added
- em --prompt, --backend, forward, smart TTY detection
- Scholar Config Sync: 4-layer config auto-injection
- teach config check/diff/show/scaffold subcommands
- teach solution, sync, validate-r wrappers
- Help guards on all 34 em subcommand functions
- Scholar config section in teach doctor (quick mode)
Documentation
- 4 new dispatcher refcards (g, wt, dots, sec)
- Stale version sweep: v5.x/v6.x references updated to v7.6.0
- Broken anchor fixes across 5 files
- Tutorial renaming: 27 -> 45 (lint-quickstart), 37 -> 46 (em-v2-features)
- Help files updated: TROUBLESHOOTING, WORKFLOWS
Stats
- 53/53 test suites passing (205 files, 12000+ assertions)
- 1 expected timeout (IMAP IDLE)
- 15 dispatchers + Atlas bridge
- 0 lint errors, 0 broken anchors
Full Changelog: v7.5.0...v7.6.0
v7.5.0 — em v2.0: Safety Gate, Calendar & Watch
Highlights
em v2.0 — Major email dispatcher upgrade with safety-first design:
- Two-phase safety gate for
em sendandem reply— preview before sending - ICS calendar integration —
em calendarwith event extraction - IMAP watch —
em watchfor real-time inbox monitoring - Folder CRUD —
em create-folder,em delete-folder - Enhanced attachments —
em attach list, get-by-filename support
Security Hardening
- Safe config parser (no
sourceof untrusted files) - Message ID validation & folder name sanitization
--argjsonfor jq (no string interpolation injection)- Terminal-notifier subject sanitization
- AI extra args validation
Bug Fixes
- Macro parser now supports both
{=tex}and{=latex}Quarto blocks - Concept graph builder handles simple YAML format (not just array-of-objects)
- 8 integration test suites fixed (variable shadowing, stale paths, format mismatches)
Testing
- 47 test suites passing (0 failures, 2 expected timeouts)
- 12,000+ test functions across 196 test files
- New: dogfood quality tests, safety gate tests, ICS/watch tests
Full Changelog
v7.4.2 — Atlas Integration + Homebrew Cleanup
Highlights
- Atlas bridge (
at) — Enhanced bridge to Atlas CLI with styled help page, 10 warm-path commands, and 4 ZSH-native fallbacks - Atlas API contract — Formal interface specification (
docs/ATLAS-CONTRACT.md) - 77 new tests — Contract (18), e2e (30), dogfood (29) for Atlas bridge
- Homebrew formula — Selective install reduces 74MB to ~4MB
Changes
Added
atbridge command with_at_help()styled help page- Atlas API contract and integration guide
- CI version guard workflow
- 77 new test functions across 3 test files
Fixed
- Help browser includes all 15 dispatchers + at (was 8)
- Help compliance checker includes
emdispatcher - Dispatcher counts updated "12" → "15" across docs
- Homebrew selective install (74MB → ~4MB)
- 10295 markdownlint errors → 0
Stats
- Tests: 196 files, 12000+ functions, 46/46 suites
- Dispatchers: 15 + at bridge
Full Changelog: v7.4.1...v7.4.2
v7.4.1 — Homebrew Cleanup
Highlights
- Homebrew install size: 74MB → ~4MB (selective formula install)
- Repo cleanup: 62 stale files removed (-21k lines)
- CI version guard: prevents FLOW_VERSION/tag mismatches on release
Changes
Fixed
- Homebrew formula: selective install replaces blanket
Dir["*"] - Repo cleanup: deleted 62 stale root-level planning docs, debug scripts, test scripts
- Version guard uses portable POSIX
grep -oE(not GNUgrep -oP) - Markdownlint errors resolved across docs
Added
.github/workflows/version-guard.yml— blocks releases on version mismatch
Stats
- Tests: 45/45 passing (1 expected timeout)
- Dispatchers: 15
- Test files: 195 (12000+ functions)
Full Changelog: v7.4.0...v7.4.1
v7.4.0 — 31 Email Commands
Highlights
- 31
emcommands — complete email management from the terminal - Organize:
em star,em thread,em snooze,em digest - Manage:
em delete,em move,em restore,em flag,em todo,em event - Multi-select:
--pickmode with fzf across all management commands - 10 tutorials — step-by-step guides for every em subcommand
Security Fixes
- Fixed jq type mismatch in
_em_star(string vs number ID comparison) - Fixed printf format injection in
_em_move - Sanitized AppleScript inputs in
_em_create_reminderand_em_create_calendar_event - Removed 686 lines of dead code (duplicate function definitions)
Changes
See full changelog for details.
Full diff: v7.3.0...v7.4.0