Skip to content

feat!: rename Hawk to Rho; add Tau-style TUI and feature parity - #306

Merged
Patel230 merged 11 commits into
mainfrom
feat/rename-rho
Sep 14, 2026
Merged

Patel230 merged 11 commits into
mainfrom
feat/rename-rho

Conversation

@Patel230

Copy link
Copy Markdown
Contributor

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

  • Module path github.com/GrayCodeAI/rho, binary rho, cmd/rho, RHO_* env
  • Compatibility shims: env.GetenvRho reads RHO_* then falls back to
    HAWK_*; storage honors HAWK_*_DIR overrides and reuses an existing
    ~/.hawk directory when ~/.rho does not exist

2. Tau-style TUI

  • tau theme palette (near-black surface, single muted blue accent)
  • Minimal chrome: tau renders the input with a single bottom hairline
  • Frontend contract documented (docs/architecture/frontend-contract.md) and
    guarded by a testaudit test that cmd/ never imports engine internals

3. Tau feature parity (Go)

Feature Status
--cwd <dir> (all subcommands) added
/login [provider] added (routes to config panel)
--output-format transcript added
.agents/AGENTS.md instructions added
Custom providers, no code changes already via custom_providers
TUI, print mode, sessions, skills, themes, compaction already present

Verification

  • go build ./..., go vet ./..., golangci-lint (0 issues)
  • gofumpt v0.10.0 + goimports clean
  • Binary smoke-tested: --cwd validates paths (valid/invalid/file all correct),
    transcript accepted, invalid formats rejected
  • Targeted tests for theme, env, storage, testaudit, cmd
  • Boundary guards pass

Breaking changes

  • Module path, binary name, and default config directory changed from hawk to rho
  • --cwd moved to PersistentPreRunE (now applies to subcommands)

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.
@Patel230
Patel230 merged commit b36d3c0 into main Sep 14, 2026
25 checks passed
@Patel230
Patel230 deleted the feat/rename-rho branch September 14, 2026 23:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant