Vectrum
Sign In

Module github.com/johannSo/codey, under the MIT license

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Jjonicommitted 1 parent 8fbd588commit56bb510

Showing 104 changed files with 262 additions and 241 deletions.

+21−0LICENSEaddedView File
@@ -0,0 +1,21 @@
1+ MIT License
2+
3+ Copyright (c) 2026 joni
4+
5+ Permission is hereby granted, free of charge, to any person obtaining a copy
6+ of this software and associated documentation files (the "Software"), to deal
7+ in the Software without restriction, including without limitation the rights
8+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+ copies of the Software, and to permit persons to whom the Software is
10+ furnished to do so, subject to the following conditions:
11+
12+ The above copyright notice and this permission notice shall be included in all
13+ copies or substantial portions of the Software.
14+
15+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21+ SOFTWARE.
+7−7cmd/codey/agentcmd.goView File
@@ -23,13 +23,13 @@ import (
2323 "strings"
2424 "time"
2525
26- "codey/internal/acp"
27- "codey/internal/agent"
28- "codey/internal/llm"
29- "codey/internal/metrics"
30- "codey/internal/serve"
31- "codey/internal/subagent"
32- "codey/internal/tools"
26+ "github.com/johannSo/codey/internal/acp"
27+ "github.com/johannSo/codey/internal/agent"
28+ "github.com/johannSo/codey/internal/llm"
29+ "github.com/johannSo/codey/internal/metrics"
30+ "github.com/johannSo/codey/internal/serve"
31+ "github.com/johannSo/codey/internal/subagent"
32+ "github.com/johannSo/codey/internal/tools"
3333 )
3434
3535 // invKind is which of the four things this command line is.
+2−2cmd/codey/agentcmd_test.goView File
@@ -9,8 +9,8 @@ import (
99 "strings"
1010 "testing"
1111
12- "codey/internal/llm"
13- "codey/internal/serve"
12+ "github.com/johannSo/codey/internal/llm"
13+ "github.com/johannSo/codey/internal/serve"
1414 )
1515
1616 // t3VersionPattern is the regular expression T3 Code parses `--version` with.
+1−1cmd/codey/auth_test.goView File
@@ -6,7 +6,7 @@ import (
66 "path/filepath"
77 "testing"
88
9- "codey/internal/llm"
9+ "github.com/johannSo/codey/internal/llm"
1010 )
1111
1212 // fakeHome writes a credentials file with a token that is not expired.
+19−19cmd/codey/main.goView File
@@ -14,25 +14,25 @@ import (
1414 "sync/atomic"
1515 "time"
1616
17- "codey/internal/agent"
18- "codey/internal/approval"
19- "codey/internal/ask"
20- "codey/internal/claudecode"
21- "codey/internal/config"
22- "codey/internal/diag"
23- "codey/internal/herdr"
24- "codey/internal/hooks"
25- "codey/internal/llm"
26- "codey/internal/mcp"
27- "codey/internal/metrics"
28- "codey/internal/serve"
29- "codey/internal/skills"
30- "codey/internal/statedir"
31- "codey/internal/subagent"
32- "codey/internal/tools"
33- "codey/internal/tui"
34- "codey/internal/ui"
35- "codey/internal/websearch"
17+ "github.com/johannSo/codey/internal/agent"
18+ "github.com/johannSo/codey/internal/approval"
19+ "github.com/johannSo/codey/internal/ask"
20+ "github.com/johannSo/codey/internal/claudecode"
21+ "github.com/johannSo/codey/internal/config"
22+ "github.com/johannSo/codey/internal/diag"
23+ "github.com/johannSo/codey/internal/herdr"
24+ "github.com/johannSo/codey/internal/hooks"
25+ "github.com/johannSo/codey/internal/llm"
26+ "github.com/johannSo/codey/internal/mcp"
27+ "github.com/johannSo/codey/internal/metrics"
28+ "github.com/johannSo/codey/internal/serve"
29+ "github.com/johannSo/codey/internal/skills"
30+ "github.com/johannSo/codey/internal/statedir"
31+ "github.com/johannSo/codey/internal/subagent"
32+ "github.com/johannSo/codey/internal/tools"
33+ "github.com/johannSo/codey/internal/tui"
34+ "github.com/johannSo/codey/internal/ui"
35+ "github.com/johannSo/codey/internal/websearch"
3636 )
3737
3838 // version is what the TUI's welcome block reports. It is a constant rather
+5−5evals/runner.goView File
@@ -19,11 +19,11 @@ import (
1919 "sync"
2020 "time"
2121
22- "codey/internal/agent"
23- "codey/internal/approval"
24- "codey/internal/llm"
25- "codey/internal/metrics"
26- "codey/internal/tools"
22+ "github.com/johannSo/codey/internal/agent"
23+ "github.com/johannSo/codey/internal/approval"
24+ "github.com/johannSo/codey/internal/llm"
25+ "github.com/johannSo/codey/internal/metrics"
26+ "github.com/johannSo/codey/internal/tools"
2727 )
2828
2929 // Task is one directory under evals/tasks.
+1−1go.modView File
@@ -1,4 +1,4 @@
1- module codey
1+ module github.com/johannSo/codey
22
33 go 1.26.8
44
+2−2internal/agent/compact.goView File
@@ -6,8 +6,8 @@ import (
66 "strconv"
77 "strings"
88
9- "codey/internal/llm"
10- "codey/internal/metrics"
9+ "github.com/johannSo/codey/internal/llm"
10+ "github.com/johannSo/codey/internal/metrics"
1111 )
1212
1313 // metricsCompaction records a compaction so its effect on later turns is
+1−1internal/agent/compact_test.goView File
@@ -10,7 +10,7 @@ import (
1010 "strings"
1111 "testing"
1212
13- "codey/internal/llm"
13+ "github.com/johannSo/codey/internal/llm"
1414 )
1515
1616 func TestCacheBreakpoints(t *testing.T) {
+1−1internal/agent/hooks_test.goView File
@@ -10,7 +10,7 @@ import (
1010 "testing"
1111 "time"
1212
13- "codey/internal/hooks"
13+ "github.com/johannSo/codey/internal/hooks"
1414 )
1515
1616 // recorder keeps every payload fired at it. It locks because Paused fires from
+1−1internal/agent/interrupt.goView File
@@ -1,6 +1,6 @@
11 package agent
22
3- import "codey/internal/llm"
3+ import "github.com/johannSo/codey/internal/llm"
44
55 // interruptedResult is what a tool call that never finished sends back. It is
66 // an error result rather than empty text because that is what happened, and
+3−3internal/agent/interrupt_test.goView File
@@ -9,9 +9,9 @@ import (
99 "testing"
1010 "time"
1111
12- "codey/internal/llm"
13- "codey/internal/metrics"
14- "codey/internal/tools"
12+ "github.com/johannSo/codey/internal/llm"
13+ "github.com/johannSo/codey/internal/metrics"
14+ "github.com/johannSo/codey/internal/tools"
1515 )
1616
1717 // newInterruptibleAgent wires an agent whose "wait" tool blocks until the
+5−5internal/agent/loop.goView File
@@ -9,11 +9,11 @@ import (
99 "strings"
1010 "sync"
1111
12- "codey/internal/hooks"
13- "codey/internal/llm"
14- "codey/internal/metrics"
15- "codey/internal/skills"
16- "codey/internal/tools"
12+ "github.com/johannSo/codey/internal/hooks"
13+ "github.com/johannSo/codey/internal/llm"
14+ "github.com/johannSo/codey/internal/metrics"
15+ "github.com/johannSo/codey/internal/skills"
16+ "github.com/johannSo/codey/internal/tools"
1717 )
1818
1919 // NoTurnLimit is what a non-positive MaxTurns means: the loop runs until the
+4−4internal/agent/loop_test.goView File
@@ -18,10 +18,10 @@ import (
1818 "testing"
1919 "time"
2020
21- "codey/internal/llm"
22- "codey/internal/metrics"
23- "codey/internal/skills"
24- "codey/internal/tools"
21+ "github.com/johannSo/codey/internal/llm"
22+ "github.com/johannSo/codey/internal/metrics"
23+ "github.com/johannSo/codey/internal/skills"
24+ "github.com/johannSo/codey/internal/tools"
2525 )
2626
2727 // fakeAPI serves a scripted sequence of responses and records every request
+3−3internal/agent/pause_test.goView File
@@ -14,9 +14,9 @@ import (
1414 "testing"
1515 "time"
1616
17- "codey/internal/llm"
18- "codey/internal/metrics"
19- "codey/internal/tools"
17+ "github.com/johannSo/codey/internal/llm"
18+ "github.com/johannSo/codey/internal/metrics"
19+ "github.com/johannSo/codey/internal/tools"
2020 )
2121
2222 // settle is how long a test waits before concluding that nothing is going to
+2−2internal/agent/session.goView File
@@ -10,8 +10,8 @@ import (
1010 "strings"
1111 "time"
1212
13- "codey/internal/llm"
14- "codey/internal/statedir"
13+ "github.com/johannSo/codey/internal/llm"
14+ "github.com/johannSo/codey/internal/statedir"
1515 )
1616
1717 // Session is a conversation saved to disk so --resume can pick it up.
+1−1internal/agent/session_test.goView File
@@ -10,7 +10,7 @@ import (
1010 "testing"
1111 "time"
1212
13- "codey/internal/llm"
13+ "github.com/johannSo/codey/internal/llm"
1414 )
1515
1616 func TestSaveAndResumeSession(t *testing.T) {
+2−2internal/agent/state.goView File
@@ -10,8 +10,8 @@ import (
1010 "sync"
1111 "time"
1212
13- "codey/internal/llm"
14- "codey/internal/tools"
13+ "github.com/johannSo/codey/internal/llm"
14+ "github.com/johannSo/codey/internal/tools"
1515 )
1616
1717 // ReadRecord lives in tools so the edit tool can query the tracker without
+1−1internal/approval/blocked_test.goView File
@@ -7,7 +7,7 @@ import (
77 "strings"
88 "testing"
99
10- "codey/internal/hooks"
10+ "github.com/johannSo/codey/internal/hooks"
1111 )
1212
1313 // recordHooks attaches a recorder and returns the payloads it will fill.
+1−1internal/approval/policy.goView File
@@ -8,7 +8,7 @@ import (
88 "strings"
99 "sync"
1010
11- "codey/internal/hooks"
11+ "github.com/johannSo/codey/internal/hooks"
1212 )
1313
1414 // Decision is the outcome of an approval prompt.
+1−1internal/ask/ask.goView File
@@ -21,7 +21,7 @@ import (
2121 "strings"
2222 "sync"
2323
24- "codey/internal/hooks"
24+ "github.com/johannSo/codey/internal/hooks"
2525 )
2626
2727 // The limits are the picker's, not the model's: four options fit on a screen
+1−1internal/ask/blocked_test.goView File
@@ -6,7 +6,7 @@ import (
66 "strings"
77 "testing"
88
9- "codey/internal/hooks"
9+ "github.com/johannSo/codey/internal/hooks"
1010 )
1111
1212 // recordHooks attaches a recorder and returns the payloads it will fill.
+1−1internal/ask/tool.goView File
@@ -5,7 +5,7 @@ import (
55 "errors"
66 "fmt"
77
8- "codey/internal/tools"
8+ "github.com/johannSo/codey/internal/tools"
99 )
1010
1111 // Name is the tool the model calls. It is snake_case like every other tool
+1−1internal/attach/attach.goView File
@@ -24,7 +24,7 @@ import (
2424 "strconv"
2525 "strings"
2626
27- "codey/internal/llm"
27+ "github.com/johannSo/codey/internal/llm"
2828 )
2929
3030 // MaxBytes caps one image. The API refuses anything over 5MB, and it counts
+1−1internal/attach/attach_test.goView File
@@ -12,7 +12,7 @@ import (
1212 "strings"
1313 "testing"
1414
15- "codey/internal/llm"
15+ "github.com/johannSo/codey/internal/llm"
1616 )
1717
1818 // tinyPNG is a real one-pixel PNG, encoded rather than pasted in as a literal
+2−2internal/config/config.goView File
@@ -18,8 +18,8 @@ import (
1818 "slices"
1919 "strings"
2020
21- "codey/internal/llm"
22- "codey/internal/websearch"
21+ "github.com/johannSo/codey/internal/llm"
22+ "github.com/johannSo/codey/internal/websearch"
2323 )
2424
2525 // Filename is the config's name inside Codey's config directory.
+1−1internal/config/config_test.goView File
@@ -1,7 +1,7 @@
11 package config
22
33 import (
4- "codey/internal/llm"
4+ "github.com/johannSo/codey/internal/llm"
55 "os"
66 "path/filepath"
77 "strings"
+1−1internal/herdr/herdr.goView File
@@ -32,7 +32,7 @@ import (
3232 "sync"
3333 "time"
3434
35- "codey/internal/hooks"
35+ "github.com/johannSo/codey/internal/hooks"
3636 )
3737
3838 // The identity Codey claims in a pane. Source must be stable across runs and
+1−1internal/herdr/herdr_test.goView File
@@ -8,7 +8,7 @@ import (
88 "sync"
99 "testing"
1010
11- "codey/internal/hooks"
11+ "github.com/johannSo/codey/internal/hooks"
1212 )
1313
1414 // pane is the environment of a process running inside a herdr pane.
+1−1internal/herdr/skill.goView File
@@ -11,7 +11,7 @@ import (
1111 "path/filepath"
1212 "time"
1313
14- "codey/internal/skills"
14+ "github.com/johannSo/codey/internal/skills"
1515 )
1616
1717 // SkillURL is where herdr publishes the skill that teaches a coding agent to
+1−1internal/herdr/skill_test.goView File
@@ -9,7 +9,7 @@ import (
99 "strings"
1010 "testing"
1111
12- "codey/internal/skills"
12+ "github.com/johannSo/codey/internal/skills"
1313 )
1414
1515 // realSkill is the shape of the file herdr publishes: frontmatter naming the
+1−1internal/mcp/client_test.goView File
@@ -14,7 +14,7 @@ import (
1414 "testing"
1515 "time"
1616
17- "codey/internal/config"
17+ "github.com/johannSo/codey/internal/config"
1818 )
1919
2020 // fakeServer is an MCP server that lives in the test process and speaks the
+1−1internal/mcp/tool.goView File
@@ -6,7 +6,7 @@ import (
66 "fmt"
77 "strings"
88
9- "codey/internal/tools"
9+ "github.com/johannSo/codey/internal/tools"
1010 )
1111
1212 // namePrefix and nameSep spell a tool's registered name as
+1−1internal/metrics/log.goView File
@@ -13,7 +13,7 @@ import (
1313 "sync"
1414 "time"
1515
16- "codey/internal/statedir"
16+ "github.com/johannSo/codey/internal/statedir"
1717 )
1818
1919 // DefaultPath is where Codey logs unless told otherwise.
+3−3internal/serve/agents.goView File
@@ -5,9 +5,9 @@ import (
55 "strings"
66 "time"
77
8- "codey/internal/acp"
9- "codey/internal/agent"
10- "codey/internal/subagent"
8+ "github.com/johannSo/codey/internal/acp"
9+ "github.com/johannSo/codey/internal/agent"
10+ "github.com/johannSo/codey/internal/subagent"
1111 )
1212
1313 // A subagent is shown as a tool call, because a tool call is the only
+6−6internal/serve/agents_test.goView File
@@ -8,12 +8,12 @@ import (
88 "testing"
99 "time"
1010
11- "codey/internal/acp"
12- "codey/internal/agent"
13- "codey/internal/llm"
14- "codey/internal/metrics"
15- "codey/internal/subagent"
16- "codey/internal/tools"
11+ "github.com/johannSo/codey/internal/acp"
12+ "github.com/johannSo/codey/internal/agent"
13+ "github.com/johannSo/codey/internal/llm"
14+ "github.com/johannSo/codey/internal/metrics"
15+ "github.com/johannSo/codey/internal/subagent"
16+ "github.com/johannSo/codey/internal/tools"
1717 )
1818
1919 // fakeAgents is a supervisor the test drives by hand: no children, no model
+1−1internal/serve/conformance_test.goView File
@@ -6,7 +6,7 @@ import (
66 "strings"
77 "testing"
88
9- "codey/internal/acp"
9+ "github.com/johannSo/codey/internal/acp"
1010 )
1111
1212 // The handshake T3 Code actually sends, byte for byte.
+5−5internal/serve/serve.goView File
@@ -25,11 +25,11 @@ import (
2525 "strings"
2626 "sync"
2727
28- "codey/internal/acp"
29- "codey/internal/agent"
30- "codey/internal/approval"
31- "codey/internal/llm"
32- "codey/internal/subagent"
28+ "github.com/johannSo/codey/internal/acp"
29+ "github.com/johannSo/codey/internal/agent"
30+ "github.com/johannSo/codey/internal/approval"
31+ "github.com/johannSo/codey/internal/llm"
32+ "github.com/johannSo/codey/internal/subagent"
3333 )
3434
3535 // PermissionMode is how tool calls are gated, chosen on the command line by
+5−5internal/serve/serve_test.goView File
@@ -15,11 +15,11 @@ import (
1515 "testing"
1616 "time"
1717
18- "codey/internal/acp"
19- "codey/internal/agent"
20- "codey/internal/llm"
21- "codey/internal/metrics"
22- "codey/internal/tools"
18+ "github.com/johannSo/codey/internal/acp"
19+ "github.com/johannSo/codey/internal/agent"
20+ "github.com/johannSo/codey/internal/llm"
21+ "github.com/johannSo/codey/internal/metrics"
22+ "github.com/johannSo/codey/internal/tools"
2323 )
2424
2525 // --- a fake Anthropic endpoint -------------------------------------------
+3−3internal/serve/session.goView File
@@ -6,9 +6,9 @@ import (
66 "encoding/hex"
77 "sync"
88
9- "codey/internal/acp"
10- "codey/internal/agent"
11- "codey/internal/approval"
9+ "github.com/johannSo/codey/internal/acp"
10+ "github.com/johannSo/codey/internal/agent"
11+ "github.com/johannSo/codey/internal/approval"
1212 )
1313
1414 // session is one conversation. A client may run several at once against the
+3−3internal/serve/update.goView File
@@ -6,9 +6,9 @@ import (
66 "sync"
77 "time"
88
9- "codey/internal/acp"
10- "codey/internal/agent"
11- "codey/internal/approval"
9+ "github.com/johannSo/codey/internal/acp"
10+ "github.com/johannSo/codey/internal/agent"
11+ "github.com/johannSo/codey/internal/approval"
1212 )
1313
1414 // flushAfter and flushBytes are when buffered text goes out. One notification
+2−2internal/serve/update_test.goView File
@@ -6,8 +6,8 @@ import (
66 "testing"
77 "time"
88
9- "codey/internal/acp"
10- "codey/internal/agent"
9+ "github.com/johannSo/codey/internal/acp"
10+ "github.com/johannSo/codey/internal/agent"
1111 )
1212
1313 // recorder collects the updates an emitter produces, and drives its clock, so
+4−4internal/subagent/control_test.goView File
@@ -7,10 +7,10 @@ import (
77 "testing"
88 "time"
99
10- "codey/internal/agent"
11- "codey/internal/approval"
12- "codey/internal/metrics"
13- "codey/internal/tools"
10+ "github.com/johannSo/codey/internal/agent"
11+ "github.com/johannSo/codey/internal/approval"
12+ "github.com/johannSo/codey/internal/metrics"
13+ "github.com/johannSo/codey/internal/tools"
1414 )
1515
1616 // Parallel agents are parallel spend, so only so many run at once and the rest
+5−5internal/subagent/supervisor.goView File
@@ -20,11 +20,11 @@ import (
2020 "sync"
2121 "time"
2222
23- "codey/internal/agent"
24- "codey/internal/approval"
25- "codey/internal/llm"
26- "codey/internal/metrics"
27- "codey/internal/tools"
23+ "github.com/johannSo/codey/internal/agent"
24+ "github.com/johannSo/codey/internal/approval"
25+ "github.com/johannSo/codey/internal/llm"
26+ "github.com/johannSo/codey/internal/metrics"
27+ "github.com/johannSo/codey/internal/tools"
2828 )
2929
3030 // Status is where one subagent is in its life.
+4−4internal/subagent/supervisor_test.goView File
@@ -13,10 +13,10 @@ import (
1313 "testing"
1414 "time"
1515
16- "codey/internal/agent"
17- "codey/internal/llm"
18- "codey/internal/metrics"
19- "codey/internal/tools"
16+ "github.com/johannSo/codey/internal/agent"
17+ "github.com/johannSo/codey/internal/llm"
18+ "github.com/johannSo/codey/internal/metrics"
19+ "github.com/johannSo/codey/internal/tools"
2020 )
2121
2222 // settle is how long a test waits before concluding nothing more is coming.
+1−1internal/subagent/tools.goView File
@@ -5,7 +5,7 @@ import (
55 "fmt"
66 "strings"
77
8- "codey/internal/tools"
8+ "github.com/johannSo/codey/internal/tools"
99 )
1010
1111 // spawnArgs is what the model sends to start an agent.
+2−2internal/subagent/tools_test.goView File
@@ -8,8 +8,8 @@ import (
88 "testing"
99 "time"
1010
11- "codey/internal/agent"
12- "codey/internal/tools"
11+ "github.com/johannSo/codey/internal/agent"
12+ "github.com/johannSo/codey/internal/tools"
1313 )
1414
1515 func toolNamed(t *testing.T, s *Supervisor, name string) tools.Tool {
+1−1internal/tools/diagnose_test.goView File
@@ -9,7 +9,7 @@ import (
99 "testing"
1010 "time"
1111
12- "codey/internal/diag"
12+ "github.com/johannSo/codey/internal/diag"
1313 )
1414
1515 // stubDiagnoser records what it was asked about and answers with a fixed
+1−1internal/tools/glob.goView File
@@ -11,7 +11,7 @@ import (
1111
1212 "github.com/bmatcuk/doublestar/v4"
1313
14- "codey/internal/statedir"
14+ "github.com/johannSo/codey/internal/statedir"
1515 )
1616
1717 // maxResults caps how many paths or matches a search tool returns. The count of
+1−1internal/tools/lsp.goView File
@@ -8,7 +8,7 @@ import (
88 "sort"
99 "strings"
1010
11- "codey/internal/diag"
11+ "github.com/johannSo/codey/internal/diag"
1212 )
1313
1414 // LanguageServer is what the lsp tool asks about code. *diag.Runner
+1−1internal/tools/read.goView File
@@ -15,7 +15,7 @@ import (
1515 "strings"
1616 "time"
1717
18- "codey/internal/llm"
18+ "github.com/johannSo/codey/internal/llm"
1919 )
2020
2121 // defaultReadLimit is how many lines read_file returns when the model does not
+1−1internal/tools/read_image_test.goView File
@@ -13,7 +13,7 @@ import (
1313 "strings"
1414 "testing"
1515
16- "codey/internal/llm"
16+ "github.com/johannSo/codey/internal/llm"
1717 )
1818
1919 func writePNG(t *testing.T, dir, name string, w, h int) string {
+2−2internal/tools/registry.goView File
@@ -13,8 +13,8 @@ import (
1313 "sync"
1414 "time"
1515
16- "codey/internal/llm"
17- "codey/internal/metrics"
16+ "github.com/johannSo/codey/internal/llm"
17+ "github.com/johannSo/codey/internal/metrics"
1818
1919 "github.com/invopop/jsonschema"
2020 )
+1−1internal/tools/registry_test.goView File
@@ -8,7 +8,7 @@ import (
88 "strings"
99 "testing"
1010
11- "codey/internal/metrics"
11+ "github.com/johannSo/codey/internal/metrics"
1212 )
1313
1414 type echoArgs struct {
+1−1internal/tools/skill.goView File
@@ -7,7 +7,7 @@ import (
77 "sort"
88 "strings"
99
10- "codey/internal/skills"
10+ "github.com/johannSo/codey/internal/skills"
1111 )
1212
1313 // SkillArgs is the skill input. The name is constrained to the discovered
+1−1internal/tools/skill_test.goView File
@@ -5,7 +5,7 @@ import (
55 "strings"
66 "testing"
77
8- "codey/internal/skills"
8+ "github.com/johannSo/codey/internal/skills"
99 )
1010
1111 func testSkills() []skills.Skill {
+1−1internal/tools/web.goView File
@@ -6,7 +6,7 @@ import (
66 "strings"
77 "sync"
88
9- "codey/internal/websearch"
9+ "github.com/johannSo/codey/internal/websearch"
1010 )
1111
1212 // Search budgets. Ten results is already more of a menu than anyone reads, and
+1−1internal/tools/web_test.goView File
@@ -12,7 +12,7 @@ import (
1212 "strings"
1313 "testing"
1414
15- "codey/internal/websearch"
15+ "github.com/johannSo/codey/internal/websearch"
1616 )
1717
1818 // stubSearcher stands in for a provider, so no test here runs a command or
+6−6internal/tui/agents_live_test.goView File
@@ -15,12 +15,12 @@ import (
1515 "github.com/charmbracelet/bubbles/spinner"
1616 tea "github.com/charmbracelet/bubbletea"
1717
18- "codey/internal/agent"
19- "codey/internal/approval"
20- "codey/internal/llm"
21- "codey/internal/metrics"
22- "codey/internal/subagent"
23- "codey/internal/tools"
18+ "github.com/johannSo/codey/internal/agent"
19+ "github.com/johannSo/codey/internal/approval"
20+ "github.com/johannSo/codey/internal/llm"
21+ "github.com/johannSo/codey/internal/metrics"
22+ "github.com/johannSo/codey/internal/subagent"
23+ "github.com/johannSo/codey/internal/tools"
2424 )
2525
2626 // scriptedAPI answers the main agent and its children differently, so one
+1−1internal/tui/ask.goView File
@@ -19,7 +19,7 @@ import (
1919 "github.com/charmbracelet/bubbles/textinput"
2020 tea "github.com/charmbracelet/bubbletea"
2121
22- "codey/internal/ask"
22+ "github.com/johannSo/codey/internal/ask"
2323 )
2424
2525 // askState is one question box: what was asked, where the cursor is, what has
+2−2internal/tui/ask_test.goView File
@@ -7,8 +7,8 @@ import (
77 tea "github.com/charmbracelet/bubbletea"
88 "github.com/charmbracelet/lipgloss"
99
10- "codey/internal/approval"
11- "codey/internal/ask"
10+ "github.com/johannSo/codey/internal/approval"
11+ "github.com/johannSo/codey/internal/ask"
1212 )
1313
1414 // question queues a question the way the bridge would and returns the channel
+5−5internal/tui/bridge.goView File
@@ -5,11 +5,11 @@ import (
55
66 tea "github.com/charmbracelet/bubbletea"
77
8- "codey/internal/agent"
9- "codey/internal/approval"
10- "codey/internal/ask"
11- "codey/internal/llm"
12- "codey/internal/subagent"
8+ "github.com/johannSo/codey/internal/agent"
9+ "github.com/johannSo/codey/internal/approval"
10+ "github.com/johannSo/codey/internal/ask"
11+ "github.com/johannSo/codey/internal/llm"
12+ "github.com/johannSo/codey/internal/subagent"
1313 )
1414
1515 // The agent loop runs on its own goroutine and must not know a UI exists. It
+3−3internal/tui/bridge_test.goView File
@@ -9,9 +9,9 @@ import (
99
1010 tea "github.com/charmbracelet/bubbletea"
1111
12- "codey/internal/agent"
13- "codey/internal/approval"
14- "codey/internal/ask"
12+ "github.com/johannSo/codey/internal/agent"
13+ "github.com/johannSo/codey/internal/approval"
14+ "github.com/johannSo/codey/internal/ask"
1515 )
1616
1717 // recorder stands in for tea.Program: it captures what the bridge sends
+1−1internal/tui/colour_test.goView File
@@ -8,7 +8,7 @@ import (
88 "github.com/charmbracelet/lipgloss"
99 "github.com/muesli/termenv"
1010
11- "codey/internal/llm"
11+ "github.com/johannSo/codey/internal/llm"
1212 )
1313
1414 // forceColour makes styles emit real escape sequences. Without it the test
+1−1internal/tui/commands.goView File
@@ -7,7 +7,7 @@ import (
77
88 "github.com/charmbracelet/lipgloss"
99
10- "codey/internal/skills"
10+ "github.com/johannSo/codey/internal/skills"
1111 )
1212
1313 // command is one thing the prompt box accepts with a leading slash: either a
+1−1internal/tui/commands_test.goView File
@@ -6,7 +6,7 @@ import (
66
77 "github.com/charmbracelet/lipgloss"
88
9- "codey/internal/skills"
9+ "github.com/johannSo/codey/internal/skills"
1010 )
1111
1212 // helpWidth is the narrowest terminal /help is meant to be read on. Eighty is
+1−1internal/tui/compact_test.goView File
@@ -5,7 +5,7 @@ import (
55 "strings"
66 "testing"
77
8- "codey/internal/agent"
8+ "github.com/johannSo/codey/internal/agent"
99 )
1010
1111 // /compact rewrites the history the in-flight request is built from, so it has
+1−1internal/tui/complete_test.goView File
@@ -6,7 +6,7 @@ import (
66
77 tea "github.com/charmbracelet/bubbletea"
88
9- "codey/internal/skills"
9+ "github.com/johannSo/codey/internal/skills"
1010 )
1111
1212 // The menu belongs to a slash command being typed, and to nothing else: a
+1−1internal/tui/effort.goView File
@@ -7,7 +7,7 @@ import (
77 tea "github.com/charmbracelet/bubbletea"
88 "github.com/charmbracelet/lipgloss"
99
10- "codey/internal/llm"
10+ "github.com/johannSo/codey/internal/llm"
1111 )
1212
1313 // defaultEffort is where the marker sits when nothing has been chosen. The
+1−1internal/tui/effort_test.goView File
@@ -6,7 +6,7 @@ import (
66
77 tea "github.com/charmbracelet/bubbletea"
88
9- "codey/internal/llm"
9+ "github.com/johannSo/codey/internal/llm"
1010 )
1111
1212 // levelAt is where a level sits on the track, so tests can talk about
+1−1internal/tui/format.goView File
@@ -8,7 +8,7 @@ import (
88 "time"
99 "unicode"
1010
11- "codey/internal/llm"
11+ "github.com/johannSo/codey/internal/llm"
1212 )
1313
1414 // human renders a token count the way a status bar wants to read it.
+1−1internal/tui/history.goView File
@@ -9,7 +9,7 @@ import (
99
1010 tea "github.com/charmbracelet/bubbletea"
1111
12- "codey/internal/statedir"
12+ "github.com/johannSo/codey/internal/statedir"
1313 )
1414
1515 // The prompt's memory. Everything submitted from the box — a prompt to the
+3−3internal/tui/history_test.goView File
@@ -11,9 +11,9 @@ import (
1111 tea "github.com/charmbracelet/bubbletea"
1212 "github.com/charmbracelet/lipgloss"
1313
14- "codey/internal/approval"
15- "codey/internal/llm"
16- "codey/internal/statedir"
14+ "github.com/johannSo/codey/internal/approval"
15+ "github.com/johannSo/codey/internal/llm"
16+ "github.com/johannSo/codey/internal/statedir"
1717 )
1818
1919 // newHistoryModel builds a model whose history has a real directory to live
+2−2internal/tui/local.goView File
@@ -10,8 +10,8 @@ import (
1010 tea "github.com/charmbracelet/bubbletea"
1111 "github.com/charmbracelet/lipgloss"
1212
13- "codey/internal/llm"
14- "codey/internal/tools"
13+ "github.com/johannSo/codey/internal/llm"
14+ "github.com/johannSo/codey/internal/tools"
1515 )
1616
1717 // localMode is which interpreter the prompt box is pointed at. Off is the
+4−4internal/tui/local_test.goView File
@@ -9,10 +9,10 @@ import (
99 "github.com/charmbracelet/bubbles/spinner"
1010 tea "github.com/charmbracelet/bubbletea"
1111
12- "codey/internal/agent"
13- "codey/internal/approval"
14- "codey/internal/llm"
15- "codey/internal/tools"
12+ "github.com/johannSo/codey/internal/agent"
13+ "github.com/johannSo/codey/internal/approval"
14+ "github.com/johannSo/codey/internal/llm"
15+ "github.com/johannSo/codey/internal/tools"
1616 )
1717
1818 // newLocalModel builds a model with a real agent behind it, so a local
+2−2internal/tui/look_test.goView File
@@ -8,8 +8,8 @@ import (
88 tea "github.com/charmbracelet/bubbletea"
99 "github.com/charmbracelet/lipgloss"
1010
11- "codey/internal/approval"
12- "codey/internal/llm"
11+ "github.com/johannSo/codey/internal/approval"
12+ "github.com/johannSo/codey/internal/llm"
1313 )
1414
1515 func TestPrettyModel(t *testing.T) {
+9−9internal/tui/model.goView File
@@ -14,15 +14,15 @@ import (
1414 tea "github.com/charmbracelet/bubbletea"
1515 "github.com/charmbracelet/lipgloss"
1616
17- "codey/internal/agent"
18- "codey/internal/approval"
19- "codey/internal/ask"
20- "codey/internal/attach"
21- "codey/internal/config"
22- "codey/internal/llm"
23- "codey/internal/skills"
24- "codey/internal/subagent"
25- "codey/internal/tools"
17+ "github.com/johannSo/codey/internal/agent"
18+ "github.com/johannSo/codey/internal/approval"
19+ "github.com/johannSo/codey/internal/ask"
20+ "github.com/johannSo/codey/internal/attach"
21+ "github.com/johannSo/codey/internal/config"
22+ "github.com/johannSo/codey/internal/llm"
23+ "github.com/johannSo/codey/internal/skills"
24+ "github.com/johannSo/codey/internal/subagent"
25+ "github.com/johannSo/codey/internal/tools"
2626 )
2727
2828 // Options wires the TUI to an already-built agent. The TUI owns no policy of
+1−1internal/tui/model_picker.goView File
@@ -10,7 +10,7 @@ import (
1010 tea "github.com/charmbracelet/bubbletea"
1111 "github.com/charmbracelet/lipgloss"
1212
13- "codey/internal/llm"
13+ "github.com/johannSo/codey/internal/llm"
1414 )
1515
1616 // modelFetchTimeout bounds the wait. Someone is sitting in front of a picker
+1−1internal/tui/model_picker_test.goView File
@@ -10,7 +10,7 @@ import (
1010
1111 tea "github.com/charmbracelet/bubbletea"
1212
13- "codey/internal/llm"
13+ "github.com/johannSo/codey/internal/llm"
1414 )
1515
1616 func someModels() []llm.Model {
+4−4internal/tui/model_test.goView File
@@ -7,10 +7,10 @@ import (
77
88 tea "github.com/charmbracelet/bubbletea"
99
10- "codey/internal/approval"
11- "codey/internal/config"
12- "codey/internal/llm"
13- "codey/internal/skills"
10+ "github.com/johannSo/codey/internal/approval"
11+ "github.com/johannSo/codey/internal/config"
12+ "github.com/johannSo/codey/internal/llm"
13+ "github.com/johannSo/codey/internal/skills"
1414 )
1515
1616 // newTestModel builds a model far enough to drive Update/View without a
+1−1internal/tui/mouse.goView File
@@ -7,7 +7,7 @@ import (
77 tea "github.com/charmbracelet/bubbletea"
88 "github.com/charmbracelet/lipgloss"
99
10- "codey/internal/llm"
10+ "github.com/johannSo/codey/internal/llm"
1111 )
1212
1313 // The mouse is handled here the way keys are handled in onKey: one entry
+2−2internal/tui/mouse_test.goView File
@@ -15,8 +15,8 @@ import (
1515
1616 "github.com/muesli/termenv"
1717
18- "codey/internal/approval"
19- "codey/internal/llm"
18+ "github.com/johannSo/codey/internal/approval"
19+ "github.com/johannSo/codey/internal/llm"
2020 )
2121
2222 func press(x, y int) tea.MouseMsg {
+1−1internal/tui/paste.goView File
@@ -7,7 +7,7 @@ import (
77 "github.com/atotto/clipboard"
88 tea "github.com/charmbracelet/bubbletea"
99
10- "codey/internal/attach"
10+ "github.com/johannSo/codey/internal/attach"
1111 )
1212
1313 // Pasting a picture into a terminal is not one gesture but three, because no
+2−2internal/tui/paste_test.goView File
@@ -13,8 +13,8 @@ import (
1313
1414 tea "github.com/charmbracelet/bubbletea"
1515
16- "codey/internal/attach"
17- "codey/internal/llm"
16+ "github.com/johannSo/codey/internal/attach"
17+ "github.com/johannSo/codey/internal/llm"
1818 )
1919
2020 func testPNG(t *testing.T) []byte {
+2−2internal/tui/session_picker.goView File
@@ -10,8 +10,8 @@ import (
1010 tea "github.com/charmbracelet/bubbletea"
1111 "github.com/charmbracelet/lipgloss"
1212
13- "codey/internal/agent"
14- "codey/internal/llm"
13+ "github.com/johannSo/codey/internal/agent"
14+ "github.com/johannSo/codey/internal/llm"
1515 )
1616
1717 // The session chooser is deliberately scoped to the working root. Sessions are
+5−5internal/tui/session_picker_test.goView File
@@ -12,11 +12,11 @@ import (
1212
1313 tea "github.com/charmbracelet/bubbletea"
1414
15- "codey/internal/agent"
16- "codey/internal/approval"
17- "codey/internal/llm"
18- "codey/internal/metrics"
19- "codey/internal/tools"
15+ "github.com/johannSo/codey/internal/agent"
16+ "github.com/johannSo/codey/internal/approval"
17+ "github.com/johannSo/codey/internal/llm"
18+ "github.com/johannSo/codey/internal/metrics"
19+ "github.com/johannSo/codey/internal/tools"
2020 )
2121
2222 // saveSession writes one session file directly, which is the same thing
+1−1internal/tui/settings.goView File
@@ -7,7 +7,7 @@ import (
77 tea "github.com/charmbracelet/bubbletea"
88 "github.com/charmbracelet/lipgloss"
99
10- "codey/internal/config"
10+ "github.com/johannSo/codey/internal/config"
1111 )
1212
1313 // The settings panel: /settings. One row per thing the config file holds,
+3−3internal/tui/settings_test.goView File
@@ -9,9 +9,9 @@ import (
99 tea "github.com/charmbracelet/bubbletea"
1010 "github.com/charmbracelet/lipgloss"
1111
12- "codey/internal/approval"
13- "codey/internal/config"
14- "codey/internal/llm"
12+ "github.com/johannSo/codey/internal/approval"
13+ "github.com/johannSo/codey/internal/config"
14+ "github.com/johannSo/codey/internal/llm"
1515 )
1616
1717 // newSettingsModel builds a chat model with a config already on disk and a
+3−3internal/tui/sidebar.goView File
@@ -9,9 +9,9 @@ import (
99 tea "github.com/charmbracelet/bubbletea"
1010 "github.com/charmbracelet/lipgloss"
1111
12- "codey/internal/agent"
13- "codey/internal/llm"
14- "codey/internal/subagent"
12+ "github.com/johannSo/codey/internal/agent"
13+ "github.com/johannSo/codey/internal/llm"
14+ "github.com/johannSo/codey/internal/subagent"
1515 )
1616
1717 // Agents is the part of the subagent supervisor the TUI uses: what is running,
+6−6internal/tui/sidebar_test.goView File
@@ -9,12 +9,12 @@ import (
99 tea "github.com/charmbracelet/bubbletea"
1010 "github.com/charmbracelet/lipgloss"
1111
12- "codey/internal/agent"
13- "codey/internal/approval"
14- "codey/internal/llm"
15- "codey/internal/metrics"
16- "codey/internal/subagent"
17- "codey/internal/tools"
12+ "github.com/johannSo/codey/internal/agent"
13+ "github.com/johannSo/codey/internal/approval"
14+ "github.com/johannSo/codey/internal/llm"
15+ "github.com/johannSo/codey/internal/metrics"
16+ "github.com/johannSo/codey/internal/subagent"
17+ "github.com/johannSo/codey/internal/tools"
1818 )
1919
2020 // fakeAgents stands in for the supervisor: the TUI only ever asks it for a
+2−2internal/tui/tabs_test.goView File
@@ -7,8 +7,8 @@ import (
77
88 tea "github.com/charmbracelet/bubbletea"
99
10- "codey/internal/approval"
11- "codey/internal/llm"
10+ "github.com/johannSo/codey/internal/approval"
11+ "github.com/johannSo/codey/internal/llm"
1212 )
1313
1414 // newTestTabs builds a strip whose NewSession hands back empty sessions: no
+1−1internal/tui/theme.goView File
@@ -3,7 +3,7 @@ package tui
33 import (
44 "github.com/charmbracelet/lipgloss"
55
6- "codey/internal/config"
6+ "github.com/johannSo/codey/internal/config"
77 )
88
99 // A theme is a palette, not a set of styles: the styles in styles.go are
+3−3internal/tui/wizard.goView File
@@ -9,9 +9,9 @@ import (
99 "github.com/charmbracelet/bubbles/textinput"
1010 tea "github.com/charmbracelet/bubbletea"
1111
12- "codey/internal/config"
13- "codey/internal/llm"
14- "codey/internal/skills"
12+ "github.com/johannSo/codey/internal/config"
13+ "github.com/johannSo/codey/internal/llm"
14+ "github.com/johannSo/codey/internal/skills"
1515 )
1616
1717 // The setup wizard: a full-screen, one-question-at-a-time interface that owns
+3−3internal/tui/wizard_test.goView File
@@ -10,9 +10,9 @@ import (
1010 tea "github.com/charmbracelet/bubbletea"
1111 "github.com/charmbracelet/lipgloss"
1212
13- "codey/internal/config"
14- "codey/internal/llm"
15- "codey/internal/skills"
13+ "github.com/johannSo/codey/internal/config"
14+ "github.com/johannSo/codey/internal/llm"
15+ "github.com/johannSo/codey/internal/skills"
1616 )
1717
1818 // newTestWizard builds a wizard on a comfortable screen with the catalogue
+1−1internal/tui/wizard_view.goView File
@@ -10,7 +10,7 @@ import (
1010
1111 "github.com/charmbracelet/lipgloss"
1212
13- "codey/internal/config"
13+ "github.com/johannSo/codey/internal/config"
1414 )
1515
1616 // ---- view ---------------------------------------------------------------
+2−2internal/tui/worktree.goView File
@@ -16,8 +16,8 @@ import (
1616
1717 tea "github.com/charmbracelet/bubbletea"
1818
19- "codey/internal/config"
20- "codey/internal/llm"
19+ "github.com/johannSo/codey/internal/config"
20+ "github.com/johannSo/codey/internal/llm"
2121 )
2222
2323 // defaultScript is what is written to ~/.config/codey/worktree.sh the first
+2−2internal/tui/worktree_picker.goView File
@@ -15,8 +15,8 @@ import (
1515 tea "github.com/charmbracelet/bubbletea"
1616 "github.com/charmbracelet/lipgloss"
1717
18- "codey/internal/agent"
19- "codey/internal/llm"
18+ "github.com/johannSo/codey/internal/agent"
19+ "github.com/johannSo/codey/internal/llm"
2020 )
2121
2222 // /worktree resume is the other half of /worktree: one makes a tree, this one
+4−4internal/tui/worktree_picker_test.goView File
@@ -12,10 +12,10 @@ import (
1212
1313 tea "github.com/charmbracelet/bubbletea"
1414
15- "codey/internal/agent"
16- "codey/internal/approval"
17- "codey/internal/llm"
18- "codey/internal/tools"
15+ "github.com/johannSo/codey/internal/agent"
16+ "github.com/johannSo/codey/internal/approval"
17+ "github.com/johannSo/codey/internal/llm"
18+ "github.com/johannSo/codey/internal/tools"
1919 )
2020
2121 // pickerModel is a model wired the way main.go wires one — an agent, a session
+5−5internal/tui/worktree_test.goView File
@@ -10,11 +10,11 @@ import (
1010
1111 tea "github.com/charmbracelet/bubbletea"
1212
13- "codey/internal/agent"
14- "codey/internal/approval"
15- "codey/internal/config"
16- "codey/internal/llm"
17- "codey/internal/tools"
13+ "github.com/johannSo/codey/internal/agent"
14+ "github.com/johannSo/codey/internal/approval"
15+ "github.com/johannSo/codey/internal/config"
16+ "github.com/johannSo/codey/internal/llm"
17+ "github.com/johannSo/codey/internal/tools"
1818 )
1919
2020 // isolateConfig points the config directory at a temp dir, so a test never
+1−1internal/ui/approve.goView File
@@ -7,7 +7,7 @@ import (
77 "io"
88 "strings"
99
10- "codey/internal/approval"
10+ "github.com/johannSo/codey/internal/approval"
1111 )
1212
1313 // Approver reads approval decisions from a terminal.
+1−1internal/ui/ask.goView File
@@ -8,7 +8,7 @@ import (
88 "strconv"
99 "strings"
1010
11- "codey/internal/ask"
11+ "github.com/johannSo/codey/internal/ask"
1212 )
1313
1414 // Asker puts the agent's questions to a terminal, one line at a time. It is
+1−1internal/ui/ask_test.goView File
@@ -7,7 +7,7 @@ import (
77 "strings"
88 "testing"
99
10- "codey/internal/ask"
10+ "github.com/johannSo/codey/internal/ask"
1111 )
1212
1313 func askOn(t *testing.T, input string, req ask.Request) (ask.Response, string) {
+2−2internal/ui/render.goView File
@@ -11,8 +11,8 @@ import (
1111 "sort"
1212 "strings"
1313
14- "codey/internal/agent"
15- "codey/internal/llm"
14+ "github.com/johannSo/codey/internal/agent"
15+ "github.com/johannSo/codey/internal/llm"
1616 )
1717
1818 // ANSI codes, blanked when the output is not a terminal or NO_COLOR is set.
+2−2internal/ui/render_test.goView File
@@ -6,8 +6,8 @@ import (
66 "strings"
77 "testing"
88
9- "codey/internal/agent"
10- "codey/internal/llm"
9+ "github.com/johannSo/codey/internal/agent"
10+ "github.com/johannSo/codey/internal/llm"
1111 )
1212
1313 func TestSummarizeInputIsSortedAndBounded(t *testing.T) {