Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 21 additions & 4 deletions .STATUS
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,23 @@
## Priority: 2
## Progress: 100

## Current Session (2026-06-04) — post-release docs polish + Node 20 CI fix
## Current Session (2026-06-05) — obs dispatcher shadowing: plan → review → merge [dev]

**Session activity:**
- **Phase 1 — removed dead `obs` dispatcher** (`222c43b2`): it shadowed the real `/opt/homebrew/bin/obs` (obsidian-cli-ops) but needed a `python/obs_cli.py` flow-cli never ships, so a function-beats-binary lookup made the broken dispatcher win in every shell. Deleted `lib/dispatchers/obs.zsh`, `zsh/functions/obs.zsh` (symlink), `man/man1/obs.1`, `tests/test-obs-dispatcher.zsh`; scrubbed obs from inventories (`flow.plugin.zsh`, help-compliance/browser, `commands/{flow,alias,doctor,tutorial}.zsh`) + dangling SEE ALSO obs(1) refs. **15 → 14 dispatchers.** Verified: `type obs` → binary, not function.
- **Phase 2 — B3 binary-precedence guard** (`f28b7007`): `flow.plugin.zsh` wraps each `lib/dispatchers/*.zsh` source in `_flow_load_dispatcher` — diffs `${(k)functions}` and `unfunction`s any new command resolving to a PATH binary, unless in `FLOW_INTENTIONAL_SHADOWS=(r mcp cc)` or `FLOW_FORCE_DISPATCHER_<NAME>=1`. Keys on real defined names (skips `_*` helpers, no filename convention — chosen over spec B1 which broke on `em`/`email-dispatcher`). New guard test `test-dispatcher-binary-precedence.zsh` (16/16); net test files unchanged (211). Reviewed: scope is dispatcher files only, so `at` (shadows `/usr/bin/at`, defined in `atlas-bridge.zsh`) is correctly untouched.
- **Docs** (`67b0071d`): 15 → 14 dispatcher sweep across ~30 active files + repaired mkdocs nav (tutorial 41 deleted); `mkdocs build --strict` ✅. Historical CHANGELOG/RELEASES/specs/.archive left frozen per convention.
- **Note:** a second concurrent session shared this worktree and authored the Phase 1/Phase 2 commits in parallel (stopped mid-session by user); this session verified all three commits and added the docs commit.

**Dev-session arc (this session):**
- **Planned** the fix: `/brainstorm` → caught that spec's Option B keyed the guard on *filename* (only correct for `obs`; `em`↔`email-dispatcher` + helper files break it) → corrected spec to B3; man-page ownership handoff to obsidian-cli-ops; worktree + ORCHESTRATE plan.
- **Reviewed PR #460** → applied review fixes on the feature branch: guard perf (batch `${(k)functions}` snapshot once + fork-free `${commands}` → ~10ms startup cost eliminated), doc scrub (3 stray obs refs), documented `FLOW_INTENTIONAL_SHADOWS`/`FLOW_FORCE_DISPATCHER_*` env vars, **added empty-array footgun regression test → 16→18 checks**.
- **Merged** PR #460 (`fc00837f`) + PR #459 (`d611e370`, clears the pre-existing `dogfood-scholar-config-sync` fail) → worktrees removed, remote branches deleted, dev synced. Suite now fully green (1 expected `e2e-em-dispatcher` timeout only).
- **`/craft:site:update`:** drift scan clean (obs sweep already landed), `mkdocs --strict` clean, bumped one `.TH` example 7.8.0→7.8.1 (`be5bbd06`).
- **Memory:** updated merge-policy (Claude may merge feature+release PRs when asked; two-tier guardrail behavior), obs guard (merged state + perf + `${+arr}`/define-once gotchas), 2 ZSH gotchas, 2 workflow notes.
- Companion: obsidian-cli-ops `obs.1` man page already merged (PR #25 + tap #110).

## Previous Session (2026-06-04) — post-release docs polish + Node 20 CI fix

**Session activity:**
- Audited `docs/index.md` admonition boxes against v7.8.1 — all accurate (links/assets resolve, counts match `.STATUS`); bumped "What's New" header v7.8 → v7.8.1 (944f1617)
Expand All @@ -20,6 +36,7 @@
- **Fixed at root** (148e257a): replaced caching step in `test.yml` with preinstall-aware `command -v zsh ||` install guard — drops a third-party action, no Node-24 opt-in flag needed; verified green on dev (`Ensure zsh is installed` ✅, no warning)
- **PR #457** (dev→main CI fix) → CI CLEAN → merged main → main CI green (sha 37779584), `Ensure zsh is installed` success → dev re-synced (0 ahead)
- Cross-repo cache-action audit (grep all dev-tools siblings): craft `actions/cache@v4` already current (no change); **scribe `actions/cache@v3` → @v4** bumped + pushed to scribe dev (a8aff56) — v3 backend sunsetting. Left `peaceiris/actions-gh-pages@v3` (v3 is its current major). No deprecated cache actions remain workspace-wide.
- **Debugged `ccy` "garbled prompt at startup"** (systematic): bisected through fzf → zsh-state → Ghostty → **Bun's startup kitty-PROBE** (Claude 2.1.x is a Bun binary). **NOT a flow-cli/fzf/ccy bug** — plain `claude` garbles too; terminal read flags=0 before launch. Fix = `export BUN_DISABLE_KITTY_PROBE=1` (personal `.zshrc`, verified clean). Two zsh precmd-reset attempts failed (wrong layer) and were removed. Created→dropped `feature/csi-u-diagnostic` worktree (premise obsolete once fix = 1 env var). Memory `ccy-garble-kitty-protocol.md` records cause + bisect. **Future: don't re-blame fzf/ccy for Claude startup garble.**

## Previous Session (2026-06-03) — tok auto-sync spec + craft drive spec

Expand Down Expand Up @@ -317,7 +334,7 @@

| Worktree | Branch | Status |
|----------|--------|--------|
| Main repo | `dev` | v7.8.1 — man-page set merged (#454); releasing |
| Main repo | `dev` | obs removed + B3 binary-precedence guard merged (#460, fc00837f); 14 dispatchers |

---

Expand Down Expand Up @@ -353,6 +370,6 @@

**Last Updated:** 2026-06-02
**Status:** v7.8.1 SHIPPED | 59/59 tests passing (1 expected interactive/tmux timeout) | 15 dispatchers + at bridge | 211 test files | 12000+ test functions | 0 lint errors | 0 broken links
## wins: Fixed the regression bug (2026-06-03), --category fix squashed the bug (2026-06-03), fixed the bug (2026-06-03), Fixed the regression bug (2026-05-15), --category fix squashed the bug (2026-05-15)
## wins: Fixed the regression bug (2026-06-05), --category fix squashed the bug (2026-06-05), fixed the bug (2026-06-05), Fixed the regression bug (2026-06-03), --category fix squashed the bug (2026-06-03)
## streak: 1
## last_active: 2026-06-03 23:12
## last_active: 2026-06-05 00:32
35 changes: 35 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,41 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [7.9.0] — 2026-06-05 — obs dispatcher removed + binary-precedence guard

### Removed

- **`obs` dispatcher** — flow-cli's `obs` shadowed the real Homebrew `obs` binary
(obsidian-cli-ops) but required a `python/obs_cli.py` flow-cli never shipped, so a
function-beats-binary lookup made the broken dispatcher win in every interactive
shell. Deleted the dispatcher, its `man/man1/obs.1`, and its test, and scrubbed
`obs` from all inventories. **15 → 14 dispatchers** (+ the `at` bridge). The
canonical `obs` man page now lives in obsidian-cli-ops.

### Added

- **Binary-precedence guard** (`_flow_load_dispatcher` in `flow.plugin.zsh`) — after
sourcing the dispatcher files, drops (`unfunction`) any newly-defined command that
shadows an external `$PATH` binary, so a broken dispatcher can never again mask a
working tool. Keys on the real defined function name (skips `_`-prefixed helpers;
no filename convention). Escape hatches: `FLOW_INTENTIONAL_SHADOWS` (default
`r mcp cc` — commands that legitimately shadow R / mcp / the C compiler) and
`FLOW_FORCE_DISPATCHER_<NAME>=1`; set `FLOW_DEBUG` to see skip logs. New regression
test `tests/test-dispatcher-binary-precedence.zsh` (18 checks).

### Fixed

- **Dogfood scholar-config check** — match the condensed CLAUDE.md format in the
scholar-config assertion (#459).
- **CI Node 20 deprecation** — dropped the deprecated `cache-apt-pkgs-action` (which
pulled in the Node 20 `actions/cache/restore`); replaced with a preinstall-aware
`zsh` install guard (#457).

### Changed

- Dependency bumps: prettier 3.8.3, `actions/checkout` v6, lint-staged 17,
`actions/create-github-app-token` v3; dropped unused eslint + eslint-config-prettier.

## [7.8.1] — 2026-06-04 — full man-page set + version-sync guard

### Added
Expand Down
21 changes: 13 additions & 8 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ This file provides guidance to Claude Code when working with code in this reposi
**flow-cli** - Pure ZSH plugin for ADHD-optimized workflow management. Zero dependencies. Standalone (works without Oh-My-Zsh or any plugin manager).

- **Architecture:** Pure ZSH plugin (no Node.js runtime required)
- **Current Version:** v7.8.1
- **Current Version:** v7.9.0
- **Install:** Homebrew (recommended), or any plugin manager
- **Source:** `source /opt/homebrew/opt/flow-cli/flow.plugin.zsh` (via Homebrew)
- **Optional:** Atlas integration for enhanced state management
Expand All @@ -17,7 +17,7 @@ This file provides guidance to Claude Code when working with code in this reposi
### What It Does

- Instant workflow commands: `work`, `dash`, `finish`, `hop`
- 15 smart dispatchers: `g`, `mcp`, `obs`, `qu`, `r`, `cc`, `tm`, `wt`, `dots`, `sec`, `tok`, `teach`, `prompt`, `v`, `em`
- 14 smart dispatchers: `g`, `mcp`, `qu`, `r`, `cc`, `tm`, `wt`, `dots`, `sec`, `tok`, `teach`, `prompt`, `v`, `em`
- ADHD-friendly design (sub-10ms response, smart defaults)
- Session tracking, project switching, quick capture
- Teaching workflow with Scholar integration
Expand Down Expand Up @@ -87,12 +87,11 @@ yay --week # Weekly summary + graph
flow goal set 3 # Set daily win target
```

### Active Dispatchers (15)
### Active Dispatchers (14)

```bash
g <cmd> # Git workflows
mcp <cmd> # MCP server management
obs <cmd> # Obsidian notes
qu <cmd> # Quarto publishing
r <cmd> # R package dev
cc [cmd] # Claude Code launcher
Expand Down Expand Up @@ -128,7 +127,7 @@ flow-cli/
│ ├── git-helpers.zsh # Git integration + smart commits
│ ├── keychain-helpers.zsh # macOS Keychain secrets
│ ├── tui.zsh # Terminal UI components
│ └── dispatchers/ # 15 smart command dispatchers
│ └── dispatchers/ # 14 smart command dispatchers
├── commands/ # 31 command files (work, dash, doctor, teach-*, etc.)
├── setup/ # Installation & setup
├── completions/ # ZSH completions
Expand All @@ -147,7 +146,7 @@ flow-cli/
| ------------------------------------------- | ----------------------------------------- |
| `flow.plugin.zsh` | Plugin entry point (source to load) |
| `lib/core.zsh` | Core utilities (logging, colors, helpers) |
| `lib/dispatchers/*.zsh` | 15 smart dispatchers |
| `lib/dispatchers/*.zsh` | 14 smart dispatchers |
| `commands/*.zsh` | Core commands (work, dash, finish, etc.) |
| `docs/reference/MASTER-DISPATCHER-GUIDE.md` | Complete dispatcher docs |
| `docs/reference/MASTER-API-REFERENCE.md` | API function reference |
Expand Down Expand Up @@ -203,14 +202,20 @@ export FLOW_PROJECTS_ROOT="$HOME/projects" # Project root
export FLOW_ATLAS_ENABLED="auto" # Atlas (auto|yes|no)
export FLOW_QUIET=1 # Suppress welcome
export FLOW_DEBUG=1 # Debug mode

# Binary-precedence guard (drops a dispatcher that shadows a PATH binary)
export FLOW_INTENTIONAL_SHADOWS=(r mcp cc) # Commands kept even when a same-named binary exists
export FLOW_FORCE_DISPATCHER_OBS=1 # Force-keep one dispatcher (FLOW_FORCE_DISPATCHER_<NAME>)
```

> **Guard caveat:** `FLOW_INTENTIONAL_SHADOWS` defaults to `(r mcp cc)` only when unset. Setting it to an empty array (`=()`) is treated as an explicit override, so `cc` (vs `/usr/bin/cc`) etc. would then be dropped — append (`+=(...)`) rather than reassign if you only want to add entries.

---

## Current Status

**Version:** v7.8.1 | **Tests:** 12000+ (59/59 suite, 1 interactive timeout) | **Docs:** https://Data-Wise.github.io/flow-cli/
**Version:** v7.9.0 | **Tests:** 12000+ (59/59 suite, 1 interactive timeout) | **Docs:** https://Data-Wise.github.io/flow-cli/

---

**Last Updated:** 2026-06-04 (v7.8.1)
**Last Updated:** 2026-06-04 (v7.9.0)
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 +217,7 @@ Each dispatcher has built-in help: `cc help`, `dots help`, `r help`, `em help`,
**✨ v7.4.2:** Atlas bridge (`at`) — project intelligence, context parking, quick capture
**✨ v7.4.0:** 38 email commands — read, reply, forward, AI compose, organize, manage
**✨ v7.1.0:** Dispatcher split — `dot` → `dots` (dotfiles) + `sec` (secrets) + `tok` (tokens)
**✨ 15 dispatchers + Atlas bridge** with unified grammar, built-in help, and fzf integration
**✨ 14 dispatchers + Atlas bridge** with unified grammar, built-in help, and fzf integration

---

Expand Down
4 changes: 2 additions & 2 deletions commands/alias.zsh
Original file line number Diff line number Diff line change
Expand Up @@ -141,8 +141,8 @@ _flow_alias_show_all() {
echo " ${FLOW_COLORS[muted]}cat → bat (syntax highlighting)${FLOW_COLORS[reset]}"
echo ""

echo "${FLOW_COLORS[success]}🎯 Dispatchers${FLOW_COLORS[reset]} (8 smart functions)"
echo " ${FLOW_COLORS[muted]}g, cc, wt, mcp, r, qu, obs, tm${FLOW_COLORS[reset]}"
echo "${FLOW_COLORS[success]}🎯 Dispatchers${FLOW_COLORS[reset]} (7 smart functions)"
echo " ${FLOW_COLORS[muted]}g, cc, wt, mcp, r, qu, tm${FLOW_COLORS[reset]}"
echo " ${FLOW_COLORS[cmd]}flow alias dispatchers${FLOW_COLORS[reset]} for full list"
echo ""

Expand Down
2 changes: 1 addition & 1 deletion commands/doctor.zsh
Original file line number Diff line number Diff line change
Expand Up @@ -1007,7 +1007,7 @@ _doctor_update_docs() {
# Dispatchers
echo "## Dispatchers"
echo ""
local -a dispatchers=(g r qu mcp obs)
local -a dispatchers=(g r qu mcp)
for cmd in "${dispatchers[@]}"; do
echo "### \`$cmd\`"
echo ""
Expand Down
5 changes: 1 addition & 4 deletions commands/flow.zsh
Original file line number Diff line number Diff line change
Expand Up @@ -171,9 +171,6 @@ flow() {
mcp)
mcp "$@"
;;
obs|obsidian)
obs "$@"
;;
cc|claude)
cc "$@"
;;
Expand Down Expand Up @@ -386,7 +383,7 @@ ${_C_DIM}SHORTCUTS: Most commands work directly too:${_C_NC}
work foo = flow work foo
js = flow start

${_C_DIM}See also:${_C_NC} man flow, r help, g help, qu help, mcp help, obs help
${_C_DIM}See also:${_C_NC} man flow, r help, g help, qu help, mcp help

${_C_BOLD}Version:${_C_NC} flow-cli v\${FLOW_VERSION:-3.2.0}
"
Expand Down
4 changes: 2 additions & 2 deletions commands/tutorial.zsh
Original file line number Diff line number Diff line change
Expand Up @@ -343,7 +343,7 @@ _tutorial_advanced() {
echo ""
echo " Lessons:"
echo " 9. Atlas integration"
echo " 10. Smart dispatchers (g, v, mcp, obs)"
echo " 10. Smart dispatchers (g, v, mcp, cc)"
echo " 11. Customization and hooks"
echo " 12. Morning routine"
echo ""
Expand Down Expand Up @@ -440,7 +440,7 @@ _tutorial_advanced() {
echo " Focus: timer, focus, brk"
echo " ADHD: js, next, stuck"
echo " Status: status, morning"
echo " Dispatchers: g, v, mcp, obs"
echo " Dispatchers: g, v, mcp, cc"
echo ""
echo " Get help: <command> help (e.g., 'pick help')"
echo " Reset: tutorial reset"
Expand Down
35 changes: 35 additions & 0 deletions docs/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,41 @@ The format follows [Keep a Changelog](https://keepachangelog.com/), and this pro

## [Unreleased]

## [7.9.0] — 2026-06-05 — obs dispatcher removed + binary-precedence guard

### Removed

- **`obs` dispatcher** — flow-cli's `obs` shadowed the real Homebrew `obs` binary
(obsidian-cli-ops) but required a `python/obs_cli.py` flow-cli never shipped, so a
function-beats-binary lookup made the broken dispatcher win in every interactive
shell. Deleted the dispatcher, its `man/man1/obs.1`, and its test, and scrubbed
`obs` from all inventories. **15 → 14 dispatchers** (+ the `at` bridge). The
canonical `obs` man page now lives in obsidian-cli-ops.

### Added

- **Binary-precedence guard** (`_flow_load_dispatcher` in `flow.plugin.zsh`) — after
sourcing the dispatcher files, drops (`unfunction`) any newly-defined command that
shadows an external `$PATH` binary, so a broken dispatcher can never again mask a
working tool. Keys on the real defined function name (skips `_`-prefixed helpers;
no filename convention). Escape hatches: `FLOW_INTENTIONAL_SHADOWS` (default
`r mcp cc` — commands that legitimately shadow R / mcp / the C compiler) and
`FLOW_FORCE_DISPATCHER_<NAME>=1`; set `FLOW_DEBUG` to see skip logs. New regression
test `tests/test-dispatcher-binary-precedence.zsh` (18 checks).

### Fixed

- **Dogfood scholar-config check** — match the condensed CLAUDE.md format in the
scholar-config assertion (#459).
- **CI Node 20 deprecation** — dropped the deprecated `cache-apt-pkgs-action` (which
pulled in the Node 20 `actions/cache/restore`); replaced with a preinstall-aware
`zsh` install guard (#457).

### Changed

- Dependency bumps: prettier 3.8.3, `actions/checkout` v6, lint-staged 17,
`actions/create-github-app-token` v3; dropped unused eslint + eslint-config-prettier.

## [7.8.1] — 2026-06-04 — full man-page set + version-sync guard

### Added
Expand Down
2 changes: 1 addition & 1 deletion docs/CONVENTIONS.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
| Frequency | Style | Examples |
| ----------------- | ------------- | ---------------------- |
| Daily (50+ times) | Single letter | `r`, `g` |
| Frequent (10-50) | Two letters | `qu`, `mcp`, `obs` |
| Frequent (10-50) | Two letters | `qu`, `mcp`, `tm` |
| Occasional (<10) | Full word | `work`, `dash`, `pick` |

**Note (2025-12-25):** `v` dispatcher was deprecated. Use `flow` command directly.
Expand Down
2 changes: 1 addition & 1 deletion docs/DOC-DASHBOARD.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@
## Quick Links

- [MASTER-API-REFERENCE.md](reference/MASTER-API-REFERENCE.md) - Complete API documentation
- [MASTER-DISPATCHER-GUIDE.md](reference/MASTER-DISPATCHER-GUIDE.md) - All 15 dispatchers
- [MASTER-DISPATCHER-GUIDE.md](reference/MASTER-DISPATCHER-GUIDE.md) - All 14 dispatchers
- [MASTER-ARCHITECTURE.md](reference/MASTER-ARCHITECTURE.md) - System architecture
- [QUICK-REFERENCE.md](help/QUICK-REFERENCE.md) - Command quick reference
- [TROUBLESHOOTING.md](help/TROUBLESHOOTING.md) - Common issues
Expand Down
5 changes: 2 additions & 3 deletions docs/PHILOSOPHY.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,13 @@ r test # R package: run tests
g push # Git: push to remote
qu preview # Quarto: preview document
mcp status # MCP: server status
obs daily # Obsidian: daily note
wt create feat/x # Worktree: create branch worktree
```

**Rules:**

- Single letter for high-frequency domains: `r`, `g`
- Two letters for medium-frequency: `qu`, `mcp`, `obs`
- Two letters for medium-frequency: `qu`, `mcp`, `tm`
- Full words for low-frequency: `work`, `dash`, `pick`

**Note (2025-12-25):** `v`/`vibe` dispatcher was deprecated. Use `flow` command directly for workflow operations.
Expand Down Expand Up @@ -187,7 +187,6 @@ TIER 1: Daily Drivers (muscle memory)

TIER 2: Frequent (weekly)
├── mcp MCP server management
├── obs Obsidian notes
├── work Start session
├── dash Dashboard
└── pick FZF picker
Expand Down
4 changes: 2 additions & 2 deletions docs/architecture/SCHOLAR-ENHANCEMENT-ARCHITECTURE.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Scholar Enhancement Architecture

**Feature:** Teaching Content Generation System
**Version:** v7.8.1
**Version:** v7.9.0
**Date:** 2026-01-17

---
Expand Down Expand Up @@ -747,4 +747,4 @@ teach slides -w 8 --style computational

**Last Updated:** 2026-02-27
**Status:** Production Ready
**Version:** v7.8.1
**Version:** v7.9.0
4 changes: 2 additions & 2 deletions docs/architecture/TEACHING-DATES-ARCHITECTURE.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Teaching Dates Architecture

**Version:** v7.8.1
**Version:** v7.9.0
**Status:** Complete
**Last Updated:** 2026-02-27

Expand Down Expand Up @@ -966,5 +966,5 @@ teach dates import-calendar university-calendar.ics
---

**Last Updated:** 2026-02-27
**Version:** v7.8.1
**Version:** v7.9.0
**Status:** Complete
3 changes: 1 addition & 2 deletions docs/commands/alias.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,8 @@ flow alias help # Show all commands
| `mcp` | 1 | MCP server shortcuts |
| `quarto` | 2 | Quarto publishing shortcuts |
| `r` | 4 | R package development shortcuts |
| `obs` | 1 | Obsidian shortcuts |

**Total:** 29 custom aliases
**Total:** 28 custom aliases

---

Expand Down
2 changes: 1 addition & 1 deletion docs/commands/at.md
Original file line number Diff line number Diff line change
Expand Up @@ -247,7 +247,7 @@ The `at` bridge integrates with flow-cli's core commands:
| `catch <text>` | Calls `_flow_catch` which uses `atlas catch` |
| `crumb <text>` | Calls `_flow_crumb` which uses `atlas crumb` |
| `flow doctor` | Shows Atlas version, backend, project count, MCP status |
| Help browser | Lists `at` with all 15 dispatchers, shows preview via `at help` |
| Help browser | Lists `at` with all 14 dispatchers, shows preview via `at help` |

---

Expand Down
Loading