From 49ecdca8cb6cfa0c0f78c09292b9b57679eb0689 Mon Sep 17 00:00:00 2001 From: Lakshman Patel Date: Sun, 14 Jun 2026 11:29:00 +0530 Subject: [PATCH 01/10] chore: update .gitignore with timestamped cache dirs --- .gitignore | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.gitignore b/.gitignore index fccaf9d4..71806478 100644 --- a/.gitignore +++ b/.gitignore @@ -10,9 +10,16 @@ hawk .commandcode/ .hawk/ .yaad/ +.openclaude/ +.grok/ +.hermes/ +.qoder/ # Cache / local data .gocache/ +.gocache-*/ +.gomodcache/ +.gomodcache-*/ *.codegraph.db .DS_Store From 8aa42fd67e8be185bc7d0054b9e0267eeacddea8 Mon Sep 17 00:00:00 2001 From: Lakshman Patel Date: Mon, 15 Jun 2026 02:52:59 +0530 Subject: [PATCH 02/10] feat: sync eyrie submodule + config updates for Xiaomi/MiniMax per-plan naming --- external/eyrie | 2 +- internal/config/catalog_api.go | 2 +- internal/config/catalog_gateways_test.go | 10 +++++----- internal/config/settings.go | 2 +- internal/config/xiaomi_setup.go | 12 ++++++------ 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/external/eyrie b/external/eyrie index dce29ff9..9a362bde 160000 --- a/external/eyrie +++ b/external/eyrie @@ -1 +1 @@ -Subproject commit dce29ff995f63b9a84dae6750d438636f1de1a3f +Subproject commit 9a362bde5ca5623c9773754fa20602dcd54a1a6a diff --git a/internal/config/catalog_api.go b/internal/config/catalog_api.go index 95c43025..0a0a2928 100644 --- a/internal/config/catalog_api.go +++ b/internal/config/catalog_api.go @@ -86,7 +86,7 @@ func setupGatewayRegistryID(provider string) string { } } -// SetupGatewayCredentialEnv returns the registry env var for a setup gateway (e.g. XIAOMI_MIMO_API_KEY). +// SetupGatewayCredentialEnv returns the registry env var for a setup gateway (e.g. XIAOMI_MIMO_PAYG_API_KEY). func SetupGatewayCredentialEnv(providerID string) string { spec, ok := registry.DefaultRegistry.Get(setupGatewayRegistryID(providerID)) if !ok || !spec.RequiresKey { diff --git a/internal/config/catalog_gateways_test.go b/internal/config/catalog_gateways_test.go index 052d458e..e025cff5 100644 --- a/internal/config/catalog_gateways_test.go +++ b/internal/config/catalog_gateways_test.go @@ -11,15 +11,15 @@ import ( func TestAllSetupGateways_RegistryOnly(t *testing.T) { gws := AllSetupGateways() - if len(gws) != 16 { - t.Fatalf("expected 16 setup gateways, got %d: %v", len(gws), gws) + if len(gws) != 18 { + t.Fatalf("expected 18 setup gateways, got %d: %v", len(gws), gws) } for _, id := range gws { if id == "ai21" || id == "alibaba" { t.Fatalf("owner slug %q should not be a gateway", id) } } - want := map[string]bool{"azure": true, "bedrock": true, "gemini": true, "grok": true, "openrouter": true, "kimi": true, "vertex": true, "xiaomi_mimo_payg": true, "xiaomi_mimo_token_plan": true, "deepseek": true} + want := map[string]bool{"azure": true, "bedrock": true, "gemini": true, "grok": true, "openrouter": true, "kimi": true, "vertex": true, "xiaomi_mimo_payg": true, "xiaomi_mimo_token_plan": true, "deepseek": true, "minimax_token_plan": true, "minimax_payg": true} for id := range want { found := false for _, gw := range gws { @@ -100,10 +100,10 @@ func TestGatewayDisplayName(t *testing.T) { if got := GatewayDisplayName("openrouter"); got != "OpenRouter" { t.Fatalf("display name = %q", got) } - if got := GatewayDisplayName("google"); got != "Google Gemini" { + if got := GatewayDisplayName("google"); got != "Gemini API" { t.Fatalf("google alias display = %q", got) } - if got := GatewayDisplayName("gemini"); got != "Google Gemini" { + if got := GatewayDisplayName("gemini"); got != "Gemini API" { t.Fatalf("gemini display = %q", got) } } diff --git a/internal/config/settings.go b/internal/config/settings.go index 45b2e03a..c9cc0108 100644 --- a/internal/config/settings.go +++ b/internal/config/settings.go @@ -614,7 +614,7 @@ func providerCredentialEnvAliases(provider string) []string { case "grok", "xai": return nil case "xiaomi_mimo", "xiaomi_mimo_payg": - return []string{"XIAOMI_MIMO_API_KEY"} + return []string{"XIAOMI_MIMO_PAYG_API_KEY"} default: return nil } diff --git a/internal/config/xiaomi_setup.go b/internal/config/xiaomi_setup.go index 3819c0b4..e3aa269a 100644 --- a/internal/config/xiaomi_setup.go +++ b/internal/config/xiaomi_setup.go @@ -38,10 +38,10 @@ func SetXiaomiTokenPlanRegion(region string) error { if saveErr := eyriecfg.SaveProviderConfig(cfg, ""); saveErr != nil { return saveErr } - _ = os.Setenv(eyriecfg.EnvXiaomiTokenPlanRegion, string(normalized)) - base, err := eyriecfg.ResolveXiaomiOpenAIBase(ProviderXiaomiTokenPlan, cfg) + _ = os.Setenv(eyriecfg.EnvXiaomiMimoTokenPlanRegion, string(normalized)) + base, err := eyriecfg.ResolveXiaomiMimoOpenAIBase(ProviderXiaomiTokenPlan, cfg) if err == nil && base != "" { - _ = os.Setenv(eyriecfg.EnvXiaomiTokenPlanBaseURL, base) + _ = os.Setenv(eyriecfg.EnvXiaomiMimoTokenPlanBaseURL, base) cfg.XiaomiMimoTokenPlanBaseURL = base _ = eyriecfg.SaveProviderConfig(cfg, "") } @@ -69,9 +69,9 @@ func ApplyXiaomiTokenPlanRegionEnv(ctx context.Context) { return } if r := strings.TrimSpace(cfg.XiaomiMimoTokenPlanRegion); r != "" { - _ = os.Setenv(eyriecfg.EnvXiaomiTokenPlanRegion, r) + _ = os.Setenv(eyriecfg.EnvXiaomiMimoTokenPlanRegion, r) } - if base, err := eyriecfg.ResolveXiaomiOpenAIBase(ProviderXiaomiTokenPlan, cfg); err == nil && base != "" { - _ = os.Setenv(eyriecfg.EnvXiaomiTokenPlanBaseURL, base) + if base, err := eyriecfg.ResolveXiaomiMimoOpenAIBase(ProviderXiaomiTokenPlan, cfg); err == nil && base != "" { + _ = os.Setenv(eyriecfg.EnvXiaomiMimoTokenPlanBaseURL, base) } } From 4ecd2914a4d1f711e30998ee2e188723d266875f Mon Sep 17 00:00:00 2001 From: Lakshman Patel Date: Mon, 15 Jun 2026 03:33:17 +0530 Subject: [PATCH 03/10] fix(cmd): align GatewayDisplayName test with eyrie per-plan naming refactor --- cmd/chat_status_metadata_test.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cmd/chat_status_metadata_test.go b/cmd/chat_status_metadata_test.go index 39c9158e..4eb2c472 100644 --- a/cmd/chat_status_metadata_test.go +++ b/cmd/chat_status_metadata_test.go @@ -123,10 +123,11 @@ func TestConnectionStatusParts_MimoShowsPlatformContext_HyphenProvider(t *testin } func TestGatewayDisplayName_XiaomiTokenPlanHyphen(t *testing.T) { - if got := hawkconfig.GatewayDisplayName("xiaomi-mimo-token-plan"); got != "Xiaomi (MiMo) — Token Plan" { + if got := hawkconfig.GatewayDisplayName("xiaomi-mimo-token-plan"); got != "Xiaomi MiMo — Token Plan" { t.Fatalf("GatewayDisplayName(hyphen) = %q, want nice name", got) } - if got := hawkconfig.GatewayDisplayName("xiaomi_mimo_token_plan"); got != "Xiaomi (MiMo) — Token Plan" { + if got := hawkconfig.GatewayDisplayName("xiaomi_mimo_token_plan"); got != "Xiaomi MiMo — Token Plan" { t.Fatalf("GatewayDisplayName(underscore) = %q, want nice name", got) } } + From d83cc9fc901ab43a90497ecb20847b3e4edfee8b Mon Sep 17 00:00:00 2001 From: Lakshman Patel Date: Mon, 15 Jun 2026 03:41:10 +0530 Subject: [PATCH 04/10] style: fix trailing newline --- cmd/chat_status_metadata_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/cmd/chat_status_metadata_test.go b/cmd/chat_status_metadata_test.go index 4eb2c472..4d9f4aac 100644 --- a/cmd/chat_status_metadata_test.go +++ b/cmd/chat_status_metadata_test.go @@ -130,4 +130,3 @@ func TestGatewayDisplayName_XiaomiTokenPlanHyphen(t *testing.T) { t.Fatalf("GatewayDisplayName(underscore) = %q, want nice name", got) } } - From 76a8d150b61e8d40cfc3c1f101c83bd6e2e3f9d6 Mon Sep 17 00:00:00 2001 From: Lakshman Patel Date: Mon, 15 Jun 2026 03:41:48 +0530 Subject: [PATCH 05/10] chore(submodule): update eyrie to ea9747b (formatting) --- external/eyrie | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/external/eyrie b/external/eyrie index 9a362bde..ea9747b8 160000 --- a/external/eyrie +++ b/external/eyrie @@ -1 +1 @@ -Subproject commit 9a362bde5ca5623c9773754fa20602dcd54a1a6a +Subproject commit ea9747b8334c46489852184cc3f4c088f9ba7219 From 7e4ec85d2b9c45c0c8fc7c6819d25a9bc25e9345 Mon Sep 17 00:00:00 2001 From: Lakshman Patel Date: Mon, 15 Jun 2026 10:05:14 +0530 Subject: [PATCH 06/10] chore(submodule): update eyrie to 04b2cda (lint + test fixes) --- external/eyrie | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/external/eyrie b/external/eyrie index ea9747b8..04b2cda3 160000 --- a/external/eyrie +++ b/external/eyrie @@ -1 +1 @@ -Subproject commit ea9747b8334c46489852184cc3f4c088f9ba7219 +Subproject commit 04b2cda307665b426040274392098e0d901f65ca From ac11a9023332d39881fecad6ae950c412beebccb Mon Sep 17 00:00:00 2001 From: Lakshman Patel Date: Mon, 15 Jun 2026 10:11:52 +0530 Subject: [PATCH 07/10] chore(submodule): update eyrie to merged main --- external/eyrie | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/external/eyrie b/external/eyrie index 04b2cda3..c0e27790 160000 --- a/external/eyrie +++ b/external/eyrie @@ -1 +1 @@ -Subproject commit 04b2cda307665b426040274392098e0d901f65ca +Subproject commit c0e2779031a9b6d17cd2897399c29236835934b1 From a32d533b59d4083507ea34535bc043b09d875755 Mon Sep 17 00:00:00 2001 From: Lakshman Patel Date: Mon, 15 Jun 2026 10:41:36 +0530 Subject: [PATCH 08/10] fix(readme): replace broken external hawk image with improved local SVG logo - Removed unreliable openclipart.org hotlink (frequently failed to render on GitHub) - Switched to assets/logo.svg with proper light/dark theme support via CSS prefers-color-scheme - Simplified illustration for better scalability at small sizes while retaining character - Added subtle adaptive frame, refined typography balance and spacing - Removed duplicate heading for cleaner header - Updated display width for the new logo This makes the project branding reliably visible in both GitHub light and dark modes. --- README.md | 4 +- assets/logo.svg | 232 ++++++++++++++++++------------------------------ 2 files changed, 85 insertions(+), 151 deletions(-) diff --git a/README.md b/README.md index 27715c11..87d6d5d1 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,7 @@

- hawk + hawk

-

AI Coding Agent for Your Terminal

-

AI coding agent for your terminal — built for developers, not teams or enterprises (yet).

diff --git a/assets/logo.svg b/assets/logo.svg index 31c0f1d9..b31f564d 100644 --- a/assets/logo.svg +++ b/assets/logo.svg @@ -1,155 +1,91 @@ - - - - - - - - - - - - - - - - - - - - - - - - + + hawk + AI Coding Agent — terminal-first, developer-focused. + + + + + + + + - - - - - - - - - - - - - - - + + + + + - - - - - - - - - + + + + - - - - - - - - - - + + + + + + + + + + - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + - - - hawk - - - AI CODING AGENT + + + hawk + AI CODING AGENT From eb2a5f624ebd4498e999a410a246abac554baf31 Mon Sep 17 00:00:00 2001 From: Lakshman Patel Date: Mon, 15 Jun 2026 11:40:15 +0530 Subject: [PATCH 09/10] fix(ci): update checkout-eyrie action to support submodule commits for sync PRs - Clone using the exact commit from git ls-tree for external repos when present (for submodule updates in sync PRs) - Falls back to branch clone otherwise - This fixes the undefined symbols and missing go.mod in CI for sync PRs that update eyrie and xiaomi support --- .github/actions/checkout-eyrie/action.yml | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/.github/actions/checkout-eyrie/action.yml b/.github/actions/checkout-eyrie/action.yml index 87c6a294..26bdca1e 100644 --- a/.github/actions/checkout-eyrie/action.yml +++ b/.github/actions/checkout-eyrie/action.yml @@ -21,12 +21,19 @@ runs: echo "$repo already present at $dest" continue fi - ref="${{ inputs.ref }}" - # Fall back to main if the branch doesn't exist on the dependency repo. - if ! git ls-remote --heads "https://github.com/GrayCodeAI/${repo}.git" "$ref" | grep -q .; then - echo "Branch '$ref' not found on $repo, falling back to main" - ref="main" + commit=$(git ls-tree HEAD "external/${repo}" | awk '{print $3}' || true) + if [ -n "$commit" ]; then + echo "Cloning $repo at submodule commit $commit" + git clone --depth=1 "https://github.com/GrayCodeAI/${repo}.git" "$dest" + (cd "$dest" && git checkout --quiet "$commit") + else + ref="${{ inputs.ref }}" + # Fall back to main if the branch doesn't exist on the dependency repo. + if ! git ls-remote --heads "https://github.com/GrayCodeAI/${repo}.git" "$ref" | grep -q .; then + echo "Branch '$ref' not found on $repo, falling back to main" + ref="main" + fi + git clone --depth=1 --branch "$ref" \ + "https://github.com/GrayCodeAI/${repo}.git" "$dest" fi - git clone --depth=1 --branch "$ref" \ - "https://github.com/GrayCodeAI/${repo}.git" "$dest" done From daa4dc550a27f13eff73aba9cf529eaf02cee82d Mon Sep 17 00:00:00 2001 From: Lakshman Patel Date: Mon, 15 Jun 2026 12:46:53 +0530 Subject: [PATCH 10/10] fix(config): align xiaomi token plan env/resolve identifiers with eyrie per-plan naming --- internal/config/xiaomi_setup.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/internal/config/xiaomi_setup.go b/internal/config/xiaomi_setup.go index e3aa269a..3819c0b4 100644 --- a/internal/config/xiaomi_setup.go +++ b/internal/config/xiaomi_setup.go @@ -38,10 +38,10 @@ func SetXiaomiTokenPlanRegion(region string) error { if saveErr := eyriecfg.SaveProviderConfig(cfg, ""); saveErr != nil { return saveErr } - _ = os.Setenv(eyriecfg.EnvXiaomiMimoTokenPlanRegion, string(normalized)) - base, err := eyriecfg.ResolveXiaomiMimoOpenAIBase(ProviderXiaomiTokenPlan, cfg) + _ = os.Setenv(eyriecfg.EnvXiaomiTokenPlanRegion, string(normalized)) + base, err := eyriecfg.ResolveXiaomiOpenAIBase(ProviderXiaomiTokenPlan, cfg) if err == nil && base != "" { - _ = os.Setenv(eyriecfg.EnvXiaomiMimoTokenPlanBaseURL, base) + _ = os.Setenv(eyriecfg.EnvXiaomiTokenPlanBaseURL, base) cfg.XiaomiMimoTokenPlanBaseURL = base _ = eyriecfg.SaveProviderConfig(cfg, "") } @@ -69,9 +69,9 @@ func ApplyXiaomiTokenPlanRegionEnv(ctx context.Context) { return } if r := strings.TrimSpace(cfg.XiaomiMimoTokenPlanRegion); r != "" { - _ = os.Setenv(eyriecfg.EnvXiaomiMimoTokenPlanRegion, r) + _ = os.Setenv(eyriecfg.EnvXiaomiTokenPlanRegion, r) } - if base, err := eyriecfg.ResolveXiaomiMimoOpenAIBase(ProviderXiaomiTokenPlan, cfg); err == nil && base != "" { - _ = os.Setenv(eyriecfg.EnvXiaomiMimoTokenPlanBaseURL, base) + if base, err := eyriecfg.ResolveXiaomiOpenAIBase(ProviderXiaomiTokenPlan, cfg); err == nil && base != "" { + _ = os.Setenv(eyriecfg.EnvXiaomiTokenPlanBaseURL, base) } }