Skip to content

Releases: Data-Wise/flow-cli

v7.9.0 — obs dispatcher removed + binary-precedence guard

05 Jun 19:30
981fe1a

Choose a tag to compare

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: obs dispatcher + man/man1/obs.1 + its test; scrubbed all inventories
  • Added: _flow_load_dispatcher binary-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

04 Jun 05:50
3a5dccf

Choose a tag to compare

Highlights

Full man-page setman/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 guardtests/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

04 Jun 04:34
2d21b13

Choose a tag to compare

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 sync shell completion now offers gh/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

02 Jun 18:12
0ecf2bb

Choose a tag to compare

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-cli

v7.7.0 — doctor cache + zsh-scope hardening

15 May 18:16
92315f4

Choose a tag to compare

Highlights

  • flow doctor GitHub token validation cache (1h TTL, fingerprint-keyed by sha256 prefix of the token). Subsequent invocations skip the GitHub /user API call — saves ~5–8s per warm flow doctor run. Auto-invalidates on token rotation. Bypass with flow 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 doctor GitHub token validation cache + --no-cache flag
  • tests/test-readonly-scope-regression.zsh — five-test guard against the bare-readonly zsh function-scope trap, including a functional proof that the trap still exists in current zsh

Fixed

  • doctor-cache silent write failureslib/doctor-cache.zsh constants were declared with readonly instead of typeset -gr. When the lib was sourced from inside a function (e.g., a test harness setup()), 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 to 0, the lock-acquire loop ran zero iterations, and _doctor_cache_set failed with "Failed to acquire cache lock for writing."
  • Preventive: same fix in lib/analysis-cache.zsh and lib/macro-parser.zsh — same pattern, not yet bitten in practice.
  • create_mock save/restore destroyed originalstests/test-framework.zsh used whence -f $fn | tail -n +2 to capture function bodies, but tail -n +2 left 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_mocks couldn't find the saved original → fell into unset -f → original function permanently destroyed. Replaced with zsh's \${functions[name]} associative array, which round-trips losslessly.

Changed

  • Removed the CACHED_DOCTOR_VERBOSE workaround in tests/test-doctor.zsh — the production cache wired in v7.6.0's PR #446 already deduplicates doctor --verbose calls.

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...v7.7.0

v7.6.0 — em --prompt + Scholar Config Sync

27 Feb 21:43
b8c45d1

Choose a tag to compare

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 --prompt support
  • Scholar Config Sync--config flag auto-appended to all Scholar commands when .flow/teach-config.yml exists
  • Config subcommandsteach config check, teach config diff, teach config show, teach config scaffold
  • New teach wrappersteach 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

27 Feb 01:32
5255b26

Choose a tag to compare

Highlights

em v2.0 — Major email dispatcher upgrade with safety-first design:

  • Two-phase safety gate for em send and em reply — preview before sending
  • ICS calendar integrationem calendar with event extraction
  • IMAP watchem watch for real-time inbox monitoring
  • Folder CRUDem create-folder, em delete-folder
  • Enhanced attachmentsem attach list, get-by-filename support

Security Hardening

  • Safe config parser (no source of untrusted files)
  • Message ID validation & folder name sanitization
  • --argjson for 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.0...v7.5.0

v7.4.2 — Atlas Integration + Homebrew Cleanup

22 Feb 23:26
20aefd7

Choose a tag to compare

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

  • at bridge 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 em dispatcher
  • 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

21 Feb 19:32
06a5637

Choose a tag to compare

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 GNU grep -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

21 Feb 04:52
68bd87b

Choose a tag to compare

Highlights

  • 31 em commands — 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: --pick mode 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_reminder and _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