feat!: rename Hawk to Rho; add Tau-style TUI and feature parity - #306
Merged
Merged
Conversation
Rename the product, module, binary, config surface, and docs from Hawk to Rho. The module path is now github.com/GrayCodeAI/rho, the binary and command directory are rho, and the environment prefix is RHO_. Compatibility shims keep existing installs working: - internal/env.GetenvRho reads RHO_<suffix> then falls back to HAWK_<suffix> - storage.ConfigDir/StateDir/CacheDir honor HAWK_*_DIR overrides and reuse an existing ~/.hawk directory when ~/.rho does not exist BREAKING CHANGE: module path, binary name, and default config directory changed from hawk to rho.
- Add a 'tau' theme palette (near-black surface, single muted blue accent, hairline separators) to the theme registry and picker. - Minimal chrome: the tau theme renders the input with a single bottom hairline instead of the default top+bottom box rules. - Document the StreamEvent frontend contract and add a testaudit guard that frontends (cmd/) never import engine internals (agent/code/prompt/async/ trajectory). - Add a plan doc at docs/plans/rho-tau-alignment.md.
- --cwd <dir>: run against another project directory (interactive, -p, exec) - --output-format transcript: plain timestamped transcript, no ANSI - Add docs/plans/tau-feature-parity.md tracking Tau feature parity
- /login [provider] routes to the config panel (Tau's auth entry point), preselecting a provider when given. - LoadAgentsMDFrom now also reads .agents/AGENTS.md, matching Tau's shared resource layout alongside the root-level AGENTS.md.
--cwd only ran in the root RunE, so 'rho --cwd X <subcommand>' silently ignored it (and an invalid path did not error). Move it to PersistentPreRunE so every subcommand honors it and the path is validated once. Also list 'transcript' in the --output-format help.
…rint name The product repo is still checked out as 'hawk' in CI while ecosystem.yaml lists 'rho', so generate-workspace.sh failed with 'directory rho does not exist'. Derive the self directory from the checkout and compare case-insensitively so the workspace generates before and after the rename. fingerprint_test asserted Name=='rho' but Generate derives the name from the checkout directory, so it failed under the 'hawk' checkout. Compare against the actual root basename instead.
The chrome tests used ApplyTheme("dark") as cleanup, which writes the dark
palette's values (e.g. textPrimary #ECECEE) rather than the init-time defaults
(#F0F0F0). Depending on test order this leaked into
TestAdaptiveNeutralsPreserveDarkAppearance, which locks the init values. Use
the existing restoreThemeGlobals helper instead.
- TerminalCreate/TerminalSend now run the full Bash safety stack (destructive/AST/obfuscation checks), scrub provider keys from the PTY environment, and are classified as shell tools so they require approval. - Extract the shared shell safety stack into validateShellCommand and reuse it from BashTool and the terminal tools. - Route model-facing git invocations through a new internal/gitcmd helper that disables repo-controlled program execution (diff.external, core.fsmonitor, core.pager, core.editor) and system config. - Download refuses sensitive paths (e.g. .env, provider.json). - Custom linter shell-quotes the file path to prevent command injection. - Wrap WebFetch/WebSearch/Browser output as untrusted external content before it enters the model context. - URLScraper uses the SSRF guard and IP-pinned client. - Token store rejects symlinks and repairs permissive modes.
- Tool event sends select on ctx.Done() so a consumer that stops draining (TUI quit, daemon disconnect) no longer blocks tool goroutines forever. - Background-task supervisor publishes cmd.Wait's error on a channel instead of reading cmd.ProcessState concurrently with Wait. - Guard the package-global lastAutoCommitHash with a mutex. - Track daemon review subprocesses in a WaitGroup, release the concurrency slot when the review finishes, and bound each run with a timeout. - Add timeouts to spec tool exec (go test/find/grep) and git context.
- Delete internal/jsonc and internal/providers: zero production importers. - Drop their references from the Makefile test-new/cover-new targets. - Add a non-mutating fmt-check target and use it in make ci. - Fix the fuzz job: each target now names a single package (./cmd/... had multiple, so the cmd target failed setup silently) and failures are no longer swallowed by || true.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Renames Hawk → Rho, adds a Tau-style theme and minimal chrome, and closes the
documented Tau feature gaps — all in Go (no Python/Textual port).
6 commits · 1,269 files. Rho still depends only on
eyrie.1. Rename Hawk → Rho
github.com/GrayCodeAI/rho, binaryrho,cmd/rho,RHO_*envenv.GetenvRhoreadsRHO_*then falls back toHAWK_*;storagehonorsHAWK_*_DIRoverrides and reuses an existing~/.hawkdirectory when~/.rhodoes not exist2. Tau-style TUI
tautheme palette (near-black surface, single muted blue accent)taurenders the input with a single bottom hairlinedocs/architecture/frontend-contract.md) andguarded by a
testaudittest thatcmd/never imports engine internals3. Tau feature parity (Go)
--cwd <dir>(all subcommands)/login [provider]--output-format transcript.agents/AGENTS.mdinstructionscustom_providersVerification
go build ./...,go vet ./..., golangci-lint (0 issues)--cwdvalidates paths (valid/invalid/file all correct),transcriptaccepted, invalid formats rejectedBreaking changes
--cwdmoved to PersistentPreRunE (now applies to subcommands)