Skip to content

Commit 9fcfef5

Browse files
authored
feat!: rename Hawk to Rho; add Tau-style TUI and feature parity (#306)
* refactor!: rename Hawk to Rho 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. * feat(tui): add Tau-style theme and frontend contract - 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. * feat(cli): add --cwd flag and transcript output format - --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 * feat(cli): add /login and .agents instruction resources - /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. * fix(cli): apply --cwd for subcommands and document transcript --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. * test: regenerate golden help for --cwd and transcript * fix(ci): generate workspace from checkout dir and de-hardcode fingerprint 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. * fix(test): restore theme globals in chrome tests 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. * fix(security): harden shell, git, path, and external-content boundaries - 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. * fix(concurrency): make tool events cancellable and close data races - 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. * chore: remove dead packages and make the CI fuzz gate real - 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.
1 parent 5e3fb1e commit 9fcfef5

1,288 files changed

Lines changed: 7945 additions & 8858 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.dockerignore‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
.factory
66
Dockerfile
77
.dockerignore
8-
hawk_bin
9-
hawk_test_bin
8+
rho_bin
9+
rho_test_bin
1010
coverage.out
1111
coverage.html
1212
go.work

‎.env.example‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
# hawk daemon environment variables — copy to .env and fill in.
2-
# Only HAWK_DAEMON_API_KEY is consumed from the environment.
3-
HAWK_DAEMON_API_KEY=
1+
# rho daemon environment variables — copy to .env and fill in.
2+
# Only RHO_DAEMON_API_KEY is consumed from the environment.
3+
RHO_DAEMON_API_KEY=
44

5-
# The following are NOT read by hawk — setting them has no effect:
6-
# HAWK_DAEMON_PORT / HAWK_DAEMON_HOST — daemon binds 127.0.0.1:4590;
7-
# override with the --host / --port flags (see `hawk daemon start --help`)
5+
# The following are NOT read by rho — setting them has no effect:
6+
# RHO_DAEMON_PORT / RHO_DAEMON_HOST — daemon binds 127.0.0.1:4590;
7+
# override with the --host / --port flags (see `rho daemon start --help`)
88
# EYRIE_API_KEY / EYRIE_BASE_URL, HARRIER_API_KEY / HARRIER_ADDR —
99
# consumed by sibling services, not by this binary
1010
# See docs/user-guide/05-configuration.md for the full precedence chain.

‎.github/CODEOWNERS‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# CODEOWNERS for hawk
1+
# CODEOWNERS for rho
22
#
33
# These owners will be the default owners for everything in the repo. Unless
44
# a later match takes precedence, they will be requested for review when

‎.github/ISSUE_TEMPLATE/bug_report.yml‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,15 @@ body:
1111
of the form as you can — the more we know, the faster we can fix it.
1212
1313
Before submitting:
14-
- Search [existing issues](https://github.com/GrayCodeAI/hawk/issues) to avoid duplicates.
14+
- Search [existing issues](https://github.com/GrayCodeAI/rho/issues) to avoid duplicates.
1515
- If this is a security issue, please **do not** file a public issue. See `SECURITY.md`.
1616
1717
- type: textarea
1818
id: what-happened
1919
attributes:
2020
label: What happened?
2121
description: A clear, concise description of the bug.
22-
placeholder: When I run `hawk ...`, I expected X but got Y.
22+
placeholder: When I run `rho ...`, I expected X but got Y.
2323
validations:
2424
required: true
2525

@@ -29,7 +29,7 @@ body:
2929
label: Steps to reproduce
3030
description: Minimal steps that reliably reproduce the problem.
3131
placeholder: |
32-
1. Run `hawk ...`
32+
1. Run `rho ...`
3333
2. Type `...`
3434
3. See error `...`
3535
validations:
@@ -44,10 +44,10 @@ body:
4444
required: true
4545

4646
- type: input
47-
id: hawk-version
47+
id: rho-version
4848
attributes:
49-
label: hawk version
50-
description: Output of `hawk version` (or `hawk --version`).
49+
label: rho version
50+
description: Output of `rho version` (or `rho --version`).
5151
placeholder: "0.1.0"
5252
validations:
5353
required: true

‎.github/ISSUE_TEMPLATE/config.yml‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
blank_issues_enabled: false
22
contact_links:
33
- name: Security vulnerability
4-
url: https://github.com/GrayCodeAI/hawk/security/advisories/new
4+
url: https://github.com/GrayCodeAI/rho/security/advisories/new
55
about: Please report security issues privately via a GitHub Security Advisory. See SECURITY.md.
66
- name: Question / discussion
7-
url: https://github.com/GrayCodeAI/hawk/discussions
7+
url: https://github.com/GrayCodeAI/rho/discussions
88
about: Have a question or want to discuss an idea? Open a discussion instead of an issue.

‎.github/ISSUE_TEMPLATE/feature_request.yml‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,35 @@
11
name: Feature request
2-
description: Suggest an improvement or new capability for hawk.
2+
description: Suggest an improvement or new capability for rho.
33
title: "feat: <one-line summary>"
44
labels: ["enhancement", "triage"]
55

66
body:
77
- type: markdown
88
attributes:
99
value: |
10-
Thanks for proposing a feature. hawk is built **for developers first**
10+
Thanks for proposing a feature. rho is built **for developers first**
1111
(one machine, local config, keychain credentials) — teams and enterprise
1212
come later. We evaluate every request against: _"would a single
1313
developer on their own machine benefit from this?"_
1414
1515
Before submitting:
16-
- Search [existing issues](https://github.com/GrayCodeAI/hawk/issues) to avoid duplicates.
16+
- Search [existing issues](https://github.com/GrayCodeAI/rho/issues) to avoid duplicates.
1717
- For large changes, consider opening a discussion first.
1818
1919
- type: textarea
2020
id: problem
2121
attributes:
2222
label: What problem are you trying to solve?
2323
description: Describe the user problem first. Solutions can come later.
24-
placeholder: When I'm doing X, hawk makes me do Y, which is painful because Z.
24+
placeholder: When I'm doing X, rho makes me do Y, which is painful because Z.
2525
validations:
2626
required: true
2727

2828
- type: textarea
2929
id: proposal
3030
attributes:
3131
label: Proposed solution
32-
description: How would you like hawk to behave? CLI flags, output, config, etc.
32+
description: How would you like rho to behave? CLI flags, output, config, etc.
3333
validations:
3434
required: true
3535

@@ -55,7 +55,7 @@ body:
5555
id: principles
5656
attributes:
5757
label: Developer fit
58-
description: hawk avoids enterprise scope for now. Confirm this feature respects that.
58+
description: rho avoids enterprise scope for now. Confirm this feature respects that.
5959
options:
6060
- label: Works with zero configuration (sensible defaults).
6161
- label: Works offline / does not require a cloud account.

‎.github/actions/checkout-eyrie/action.yml‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name: Checkout ecosystem
2-
description: Clone graycode-eco sibling repos into the workspace parent for hawk's go.work
2+
description: Clone graycode-eco sibling repos into the workspace parent for rho's go.work
33

44
inputs:
55
ref:
@@ -24,7 +24,7 @@ runs:
2424
# ecosystem migration; downstream guards skip absent checkouts too).
2525
ws_parent="$(cd "${GITHUB_WORKSPACE}/.." && pwd)"
2626
while IFS= read -r repo; do
27-
[ "$repo" = hawk ] && continue
27+
[ "$repo" = rho ] && continue
2828
dest="${ws_parent}/${repo}"
2929
if [ -d "$dest/.git" ]; then
3030
echo "$repo already present at $dest"

0 commit comments

Comments
 (0)