The server links ~/.local/bin/owt from a clone of this repository and carries the owt wrapper and hook. Its repositories are on GitHub, which tea cannot query, so owt done there sees merge-commit PRs as merged and needs --force after a squash merge.
mosh drops the OSC 777 banner that omo-notify posts, so omo sessions on the server only reached the phone through ntfy. The server's omo-notify now writes the session state into its tmux client's terminal title (omo:<state>:<time>:<project>), which mosh and ssh carry. A pane-title-changed hook hands it to the new omo-remote, which runs omo-notify for the local mosh pane through the new OMO_NOTIFY_PANE override, so remote sessions get the same sound, tab marker and banner as local ones.
Sessions that no terminal is showing come through ntfy instead: omo-remote install starts a launchd agent running ntfy subscribe, which plays the sound and posts the banner for omo pushes the server did not tag attached. Brewfile gains ntfy; the token lives in ~/.config/ntfy/omo-remote.env, outside the repository.
Points the submodule at absolute-vim 2d427aa and updates the README: snacks.nvim replaces Telescope, nvim-notify and dressing, blink.cmp replaces nvim-cmp, and the removed AI plugins are no longer listed.
owt title names the tmux windows of the current workspace with one to three words and saves the title in the worktree's git dir so owt open reuses it. owt hook runs on omo's UserPromptSubmit and reminds the agent of the current title so it retitles the tab as the work changes.
tmux-open-path takes the path under the mouse, strips :line:col, #L, @ and file:// decorations, and resolves it against the pane directory and then its git root. Markdown opens in Markdown Preview (added to Brewfile.apps), images, PDFs and directories in yazi, and everything else in nvim at the clicked line, both in a split beside the pane.
tma and tml now complete session names with window counts on Tab. When no tmux server is up, tma starts a new session named after the argument or the current directory, and tml and completion report it instead of erroring. tma switches the client inside tmux, matches names exactly and ignores a cancelled fzf pick; tml takes an optional prefix filter.
- Move the vendored skills from .config/opencode/skills to
.config/omo/skills, with provenance and local changes in its README
- Rewrite Impeccable's script paths to ~/.omo/agent/skills/impeccable so
its detector and live-server verbs resolve under omo
- frontend-workflow hands screenshots to a visual-engineering task
instead of opencode run
- Move the notes commands and /impeccable to .config/omo/prompts as omo
prompt templates; setup-mcp stays behind because it writes
opencode.json
- Archive DEVELOPMENT-WORKFLOW.md and UI-WORKFLOW.md under
.config/omo/archive; nothing loads them
- link-ai-configs.sh links the skills into omo and Claude Code only and
stops linking OpenCode's config, TUI, plugins and workflow docs
- setup-mac.sh and Brewfile.apps stop installing OpenCode; README and
.withcontextconfig.jsonc follow the new layout
~/.config/opencode/AGENTS.md stays linked: omo's rules engine reads it
before ~/.claude/CLAUDE.md and stops at the first hit, so it carries the
shared preferences and keeps OMC's instructions out of omo.
A tab renamed in Ghostty ignores the title tmux sends, so it stops
showing its session name. omo-status focus now clears that override
through Ghostty's set_tab_title action, finding the tab by its terminal
title, so every tab shows its tmux session again.
omo-notify now drives three signals from omo's UserPromptSubmit, Stop
and Notification hooks:
- A sound through afplay, so Focus modes cannot mute it
- A Ghostty notification (OSC 777) written to the session's tmux client
terminal, so clicking it opens the tab it came from. This replaces the
osascript banner, which opened Script Editor's file picker on click
- omo-status markers in front of the tab title: red error, amber
waiting for input, green finished, blue working. A tab shows its most
urgent agent; focusing it clears red, amber and green and selects the
pane that sent the banner
tmux puts @omo_status in the title and runs omo-status on client focus.
The old script stopped on a syntax error (unclosed if blocks) and had
drifted from the machine: it installed Anaconda, AeroSpace and Oh My
Posh, and linked nothing.
- Eight named steps (xcode homebrew brew links shell runtimes ai apps)
that check what is in place first, run on their own by name, and
preview with --dry-run; a failed step is reported while the rest run
- Brewfile holds the CLI tools, fonts and terminals, Brewfile.apps the
GUI casks and App Store apps; installs never upgrade existing packages
and skip apps already installed outside Homebrew
- links symlinks the configs and .local/bin scripts, backing up what it
replaces, and fetches the nvim submodule only on a fresh clone
- Guard .zshrc's ~/.deno/env source for machines without it
- Document the steps in the README
- owt all lists the workspaces of every repo with their branch and
source checkout, from any directory
- owt cd jumps into a workspace by name, repo/name or an fzf picker
that starts filtered to the current repo
- An owt function in .zshrc performs the cd, since a script cannot
change its parent shell's directory
Adds .config/ai/AGENTS.md, Claude's global CLAUDE.md, settings and OMC
preferences, a script that symlinks them into HOME with backups, and the
README section that documents the restore.
- Create .tmux-server.conf for remote servers (plugin-free, minimal)
- Prefix key set to Ctrl+/ (C-_) instead of Ctrl+b
- Status bar positioned at bottom with simple catppuccin-inspired theme
- Include all essential keybindings without TPM dependencies
- Add README section with one-liner download/setup instructions