From f54079c1573452234e65c17cc3c8ee40b3d2e67e Mon Sep 17 00:00:00 2001 From: moneycaringcoder Date: Wed, 8 Apr 2026 20:14:17 +0200 Subject: [PATCH 1/6] fix: bump tuikit-go to v0.6.0 Picks up RelativeTime, OSC8Link, and OpenURL utilities now exported from tuikit-go. --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index a449303..bf7070d 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.26.1 require ( github.com/charmbracelet/bubbletea v1.3.10 github.com/charmbracelet/lipgloss v1.1.0 - github.com/moneycaringcoder/tuikit-go v0.5.4 + github.com/moneycaringcoder/tuikit-go v0.6.0 gopkg.in/yaml.v3 v3.0.1 ) @@ -30,5 +30,5 @@ require ( github.com/rivo/uniseg v0.4.7 // indirect github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect golang.org/x/sys v0.38.0 // indirect - golang.org/x/text v0.3.8 // indirect + golang.org/x/text v0.34.0 // indirect ) diff --git a/go.sum b/go.sum index 9884fea..9ff6aad 100644 --- a/go.sum +++ b/go.sum @@ -30,8 +30,8 @@ github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2J github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88= github.com/mattn/go-runewidth v0.0.19 h1:v++JhqYnZuu5jSKrk9RbgF5v4CGUjqRfBm05byFGLdw= github.com/mattn/go-runewidth v0.0.19/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs= -github.com/moneycaringcoder/tuikit-go v0.5.4 h1:JVd7C7k01NnT5btty6prc6oVTx3LWYJXM1HDtLnZSeU= -github.com/moneycaringcoder/tuikit-go v0.5.4/go.mod h1:NNJ8NSFnHrd4A7dqmb0DO1kA6vtk8jmdCTKYJFL+h50= +github.com/moneycaringcoder/tuikit-go v0.6.0 h1:Q0xGFjBFgwC5dEl4ILlyFV1irlnj3mi3K6CMEWA3a9g= +github.com/moneycaringcoder/tuikit-go v0.6.0/go.mod h1:2P2MPQGh/A+vpCcrgh5Taz+XqMlrpPgAsc2cd4W8ucg= github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 h1:ZK8zHtRHOkbHy6Mmr5D264iyp3TiX5OmNcI5cIARiQI= github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo= github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA= @@ -48,8 +48,8 @@ golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -golang.org/x/text v0.3.8 h1:nAL+RVCQ9uMn3vJZbV+MRnydTJFPf8qqY42YiA6MrqY= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.34.0 h1:oL/Qq0Kdaqxa1KbNeMKwQq0reLCCaFtqu2eNuSeNHbk= +golang.org/x/text v0.34.0/go.mod h1:homfLqTYRFyVYemLBFl5GgL/DWEiH5wcsQ5gSh1yziA= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= From 57d2c4b2f0c4327fd74ac7db9effa918d7a8be8e Mon Sep 17 00:00:00 2001 From: moneycaringcoder Date: Wed, 8 Apr 2026 20:14:22 +0200 Subject: [PATCH 2/6] refactor: replace duplicate utilities with tuikit imports MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remove local relativeTime(), osc8(), and OpenURL() from the ui package — now provided by tuikit.RelativeTime(), tuikit.OSC8Link(), and tuikit.OpenURL() respectively. --- cmd/gitstream/main.go | 2 +- internal/ui/render.go | 49 +++---------------------------------------- internal/ui/stream.go | 2 +- 3 files changed, 5 insertions(+), 48 deletions(-) diff --git a/cmd/gitstream/main.go b/cmd/gitstream/main.go index 59e5039..63bf409 100644 --- a/cmd/gitstream/main.go +++ b/cmd/gitstream/main.go @@ -92,7 +92,7 @@ func main() { OnKey: func(de ui.DisplayEvent, key tea.KeyMsg) tea.Cmd { if key.String() == "o" { if url := de.Event.URL(); url != "" { - ui.OpenURL(url) + tuikit.OpenURL(url) } return tuikit.Consumed() } diff --git a/internal/ui/render.go b/internal/ui/render.go index c7e08b5..bfb8a73 100644 --- a/internal/ui/render.go +++ b/internal/ui/render.go @@ -2,11 +2,10 @@ package ui import ( "fmt" - "os/exec" - "runtime" "time" "github.com/moneycaringcoder/gitstream-tui/internal/github" + tuikit "github.com/moneycaringcoder/tuikit-go" ) const flashDuration = 3 * time.Second @@ -17,34 +16,9 @@ type DisplayEvent struct { AddedAt time.Time } -func relativeTime(t time.Time, now time.Time) string { - d := now.Sub(t) - if d < 0 { - d = 0 - } - switch { - case d < time.Minute: - return fmt.Sprintf("%ds ago", int(d.Seconds())) - case d < time.Hour: - return fmt.Sprintf("%dm ago", int(d.Minutes())) - case d < 24*time.Hour: - return fmt.Sprintf("%dh ago", int(d.Hours())) - default: - return fmt.Sprintf("%dd ago", int(d.Hours()/24)) - } -} - -// osc8 wraps text in an OSC8 hyperlink escape sequence. -func osc8(url, text string) string { - if url == "" { - return text - } - return fmt.Sprintf("\x1b]8;;%s\x1b\\%s\x1b]8;;\x1b\\", url, text) -} - func renderEventLine(ev github.Event, now time.Time) string { t := ev.CreatedAt.Local().Format("15:04:05") - rel := relativeTime(ev.CreatedAt, now) + rel := tuikit.RelativeTime(ev.CreatedAt, now) timeStr := fmt.Sprintf("%s %s", t, rel) label := ev.Label() @@ -55,7 +29,7 @@ func renderEventLine(ev github.Event, now time.Time) string { detailRendered := DetailStyle.Render(detail) if url != "" { - detailRendered = osc8(url, detailRendered) + detailRendered = tuikit.OSC8Link(url, detailRendered) } line := fmt.Sprintf("%s %s %s %s %s", @@ -68,20 +42,3 @@ func renderEventLine(ev github.Event, now time.Time) string { return line } - -// OpenURL opens a URL in the default browser. -func OpenURL(url string) { - var cmd *exec.Cmd - switch runtime.GOOS { - case "darwin": - cmd = exec.Command("open", url) - case "windows": - cmd = exec.Command("rundll32", "url.dll,FileProtocolHandler", url) - default: - cmd = exec.Command("xdg-open", url) - } - if err := cmd.Start(); err != nil { - return - } - go cmd.Wait() -} diff --git a/internal/ui/stream.go b/internal/ui/stream.go index 347aa62..fdbe826 100644 --- a/internal/ui/stream.go +++ b/internal/ui/stream.go @@ -115,7 +115,7 @@ func (s *EventStream) Update(msg tea.Msg) (tuikit.Component, tea.Cmd) { if msg.String() == "o" { if item := s.listView.CursorItem(); item != nil { if url := item.Event.URL(); url != "" { - OpenURL(url) + tuikit.OpenURL(url) } return s, tuikit.Consumed() } From ff0446c94550294f6d84b9f91a8a449489b878a6 Mon Sep 17 00:00:00 2001 From: moneycaringcoder Date: Wed, 8 Apr 2026 21:13:17 +0200 Subject: [PATCH 3/6] refactor: use tuikit.Divider and tuikit.Truncate in detail bar Replace manual divider rendering and string truncation with tuikit utility helpers for consistency. --- internal/ui/stream.go | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/internal/ui/stream.go b/internal/ui/stream.go index fdbe826..1c46570 100644 --- a/internal/ui/stream.go +++ b/internal/ui/stream.go @@ -72,7 +72,7 @@ func NewEventStream(cfg *config.Config, debugLog *DebugLog) *EventStream { return s.renderHeader() }, DetailFunc: func(item DisplayEvent, theme tuikit.Theme) string { - return s.renderDetailBar(item) + return s.renderDetailBar(item, theme) }, FlashFunc: func(item DisplayEvent, now time.Time) bool { return !item.AddedAt.IsZero() && now.Before(item.AddedAt.Add(flashDuration)) @@ -293,9 +293,9 @@ func (s *EventStream) renderHeader() string { return lipgloss.JoinVertical(lipgloss.Left, title, repoList, status, "") } -func (s *EventStream) renderDetailBar(de DisplayEvent) string { +func (s *EventStream) renderDetailBar(de DisplayEvent, theme tuikit.Theme) string { ev := de.Event - divider := DividerStyle.Render(strings.Repeat("─", s.width)) + divider := tuikit.Divider(s.width, theme) repo := ev.Repo.Name label := ev.Label() @@ -310,14 +310,7 @@ func (s *EventStream) renderDetailBar(de DisplayEvent) string { DetailTimeStyle.Render(t), ) - detail := ev.Detail() - maxDetail := s.width - 20 - if maxDetail < 20 { - maxDetail = 20 - } - if len(detail) > maxDetail { - detail = detail[:maxDetail-1] + "…" - } + detail := tuikit.Truncate(ev.Detail(), s.width-20) urlHint := "" if url := ev.URL(); url != "" { urlHint = DetailTimeStyle.Render(" ↵ open") From 5788d816c17d7451eee152ec429bda4b15d35451 Mon Sep 17 00:00:00 2001 From: moneycaringcoder Date: Wed, 8 Apr 2026 21:28:08 +0200 Subject: [PATCH 4/6] chore: sync go.mod with local tuikit for cursor highlight support --- go.mod | 2 ++ go.sum | 2 -- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index bf7070d..e244ed7 100644 --- a/go.mod +++ b/go.mod @@ -32,3 +32,5 @@ require ( golang.org/x/sys v0.38.0 // indirect golang.org/x/text v0.34.0 // indirect ) + +replace github.com/moneycaringcoder/tuikit-go => ../tuikit-go diff --git a/go.sum b/go.sum index 9ff6aad..5d8917d 100644 --- a/go.sum +++ b/go.sum @@ -30,8 +30,6 @@ github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2J github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88= github.com/mattn/go-runewidth v0.0.19 h1:v++JhqYnZuu5jSKrk9RbgF5v4CGUjqRfBm05byFGLdw= github.com/mattn/go-runewidth v0.0.19/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs= -github.com/moneycaringcoder/tuikit-go v0.6.0 h1:Q0xGFjBFgwC5dEl4ILlyFV1irlnj3mi3K6CMEWA3a9g= -github.com/moneycaringcoder/tuikit-go v0.6.0/go.mod h1:2P2MPQGh/A+vpCcrgh5Taz+XqMlrpPgAsc2cd4W8ucg= github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 h1:ZK8zHtRHOkbHy6Mmr5D264iyp3TiX5OmNcI5cIARiQI= github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo= github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA= From 9fea959e1e37701971910166585c88b96e987313 Mon Sep 17 00:00:00 2001 From: moneycaringcoder Date: Wed, 8 Apr 2026 21:44:42 +0200 Subject: [PATCH 5/6] test: add tuitest integration tests for EventStream 10 screen-based tests covering rendering, cursor navigation, sort/filter toggles, pause/resume, empty state, and resize behavior using tuikit's tuitest package. --- go.mod | 1 + go.sum | 2 + internal/ui/stream_test.go | 222 +++++++++++++++++++++++++++++++++++++ 3 files changed, 225 insertions(+) create mode 100644 internal/ui/stream_test.go diff --git a/go.mod b/go.mod index e244ed7..db85a15 100644 --- a/go.mod +++ b/go.mod @@ -27,6 +27,7 @@ require ( github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect github.com/muesli/cancelreader v0.2.2 // indirect github.com/muesli/termenv v0.16.0 // indirect + github.com/rcarmo/go-te v0.1.0 // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect golang.org/x/sys v0.38.0 // indirect diff --git a/go.sum b/go.sum index 5d8917d..1768be4 100644 --- a/go.sum +++ b/go.sum @@ -36,6 +36,8 @@ github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELU github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= github.com/muesli/termenv v0.16.0 h1:S5AlUN9dENB57rsbnkPyfdGuWIlkmzJjbFf0Tf5FWUc= github.com/muesli/termenv v0.16.0/go.mod h1:ZRfOIKPFDYQoDFF4Olj7/QJbW60Ol/kL1pU3VfY/Cnk= +github.com/rcarmo/go-te v0.1.0 h1:BH9Ub+A0AVBY5Q00El4QMVaWAMbycVHgMHQI2Kz8J/o= +github.com/rcarmo/go-te v0.1.0/go.mod h1:cLsrtroxCubS+OHHwH0riB6xeNESfntaHEeI1jPAedk= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= diff --git a/internal/ui/stream_test.go b/internal/ui/stream_test.go new file mode 100644 index 0000000..4164080 --- /dev/null +++ b/internal/ui/stream_test.go @@ -0,0 +1,222 @@ +package ui + +import ( + "testing" + "time" + + tuikit "github.com/moneycaringcoder/tuikit-go" + "github.com/moneycaringcoder/tuikit-go/tuitest" + "github.com/moneycaringcoder/gitstream-tui/internal/config" + "github.com/moneycaringcoder/gitstream-tui/internal/github" +) + +// testConfig returns a minimal config for testing. +func testConfig() *config.Config { + return &config.Config{ + RepoEntries: []config.RepoEntry{ + {Name: "owner/repo-a"}, + {Name: "owner/repo-b"}, + }, + Interval: 30, + } +} + +// testEvents returns a set of fake events for testing. +func testEvents() []github.Event { + now := time.Now() + return []github.Event{ + { + ID: "1", + Type: "PushEvent", + Actor: github.Actor{Login: "alice"}, + Repo: github.Repo{Name: "owner/repo-a"}, + Payload: github.Payload{Ref: "refs/heads/main", Commits: []github.Commit{{SHA: "abc1234", Message: "feat: add feature"}}}, + CreatedAt: now.Add(-5 * time.Minute), + }, + { + ID: "2", + Type: "PullRequestEvent", + Actor: github.Actor{Login: "bob"}, + Repo: github.Repo{Name: "owner/repo-b"}, + Payload: github.Payload{Action: "opened", PullRequest: &github.PullRequest{Number: 42, Title: "Fix the bug"}}, + CreatedAt: now.Add(-3 * time.Minute), + }, + { + ID: "3", + Type: "IssuesEvent", + Actor: github.Actor{Login: "charlie"}, + Repo: github.Repo{Name: "owner/repo-a"}, + Payload: github.Payload{Action: "opened", Issue: &github.Issue{Number: 10, Title: "Something broken"}}, + CreatedAt: now.Add(-1 * time.Minute), + }, + } +} + +// testApp builds a tuikit.App wrapping an EventStream with injected events. +func testApp(t testing.TB, events []github.Event) (*tuitest.TestModel, *EventStream) { + t.Helper() + cfg := testConfig() + debugLog := NewDebugLog() + stream := NewEventStream(cfg, debugLog) + panel := NewStatusPanel() + + app := tuikit.NewApp( + tuikit.WithLayout(&tuikit.DualPane{ + Main: stream, + Side: panel, + SideWidth: 32, + MinMainWidth: 40, + SideRight: true, + }), + tuikit.WithStatusBar( + func() string { return " test status left" }, + func() string { return "test status right " }, + ), + ) + + tm := tuitest.NewTestModel(t, app.Model(), 120, 40) + + // Inject events directly + if len(events) > 0 { + tm.SendMsg(eventsMsg{events: events}) + } + + return tm, stream +} + +func TestStreamRendersEvents(t *testing.T) { + tm, _ := testApp(t, testEvents()) + s := tm.Screen() + + tuitest.AssertContains(t, s, "alice") + tuitest.AssertContains(t, s, "bob") + tuitest.AssertContains(t, s, "charlie") + tuitest.AssertContains(t, s, "repo-a") + tuitest.AssertContains(t, s, "repo-b") +} + +func TestStreamRendersHeader(t *testing.T) { + tm, _ := testApp(t, testEvents()) + s := tm.Screen() + + tuitest.AssertContains(t, s, "gitstream") + tuitest.AssertContains(t, s, "owner/repo-a") + tuitest.AssertContains(t, s, "owner/repo-b") +} + +func TestStreamCursorNavigation(t *testing.T) { + tm, _ := testApp(t, testEvents()) + + // Move cursor down + tm.SendKey("down") + tm.SendKey("down") + + s := tm.Screen() + // Should still render all events + tuitest.AssertContains(t, s, "alice") + tuitest.AssertContains(t, s, "charlie") +} + +func TestStreamSortToggle(t *testing.T) { + tm, stream := testApp(t, testEvents()) + + // Default is oldest first + if stream.IsNewestFirst() { + t.Error("should default to oldest first") + } + + // Send sort toggle via the stream method + stream.ToggleSort() + + s := tm.Screen() + if !stream.IsNewestFirst() { + t.Error("should be newest first after toggle") + } + // Events should still render + tuitest.AssertContains(t, s, "alice") +} + +func TestStreamTypeFilter(t *testing.T) { + tm, stream := testApp(t, testEvents()) + + // Cycle to PushEvent filter (second in list, after "all") + // typeFilters: "", "LocalPushEvent", "PushEvent", ... + stream.CycleTypeFilter(true) // -> LocalPushEvent + stream.CycleTypeFilter(true) // -> PushEvent + + s := tm.Screen() + tuitest.AssertContains(t, s, "alice") // alice has PushEvent + // bob's PR event should be filtered out + if s.Contains("bob") { + t.Error("bob's PullRequestEvent should be filtered when type=PushEvent") + } +} + +func TestStreamRepoFilter(t *testing.T) { + tm, stream := testApp(t, testEvents()) + + stream.SetRepoFilter("repo-b") + + s := tm.Screen() + tuitest.AssertContains(t, s, "bob") // bob is in repo-b + // alice and charlie are in repo-a, should be hidden + if s.Contains("alice") { + t.Error("alice should be filtered out when repo=repo-b") + } +} + +func TestStreamClearFilters(t *testing.T) { + _, stream := testApp(t, testEvents()) + + stream.SetRepoFilter("repo-b") + stream.CycleTypeFilter(true) + stream.ClearFilters() + + if stream.RepoFilter() != "" { + t.Error("repo filter should be cleared") + } + if stream.TypeFilter() != "" { + t.Error("type filter should be cleared") + } +} + +func TestStreamPauseToggle(t *testing.T) { + _, stream := testApp(t, testEvents()) + + if stream.IsPaused() { + t.Error("should not be paused initially") + } + stream.TogglePause() + if !stream.IsPaused() { + t.Error("should be paused after toggle") + } + stream.TogglePause() + if stream.IsPaused() { + t.Error("should be unpaused after second toggle") + } +} + +func TestStreamEmptyState(t *testing.T) { + tm, _ := testApp(t, nil) + s := tm.Screen() + + // Should still render header + tuitest.AssertContains(t, s, "gitstream") + tuitest.AssertNotEmpty(t, s) +} + +func TestStreamResize(t *testing.T) { + tm, _ := testApp(t, testEvents()) + + // Resize to small + tm.SendResize(60, 20) + s := tm.Screen() + tuitest.AssertNotEmpty(t, s) + tuitest.AssertContains(t, s, "gitstream") + + // Resize to large + tm.SendResize(200, 50) + s = tm.Screen() + tuitest.AssertNotEmpty(t, s) + tuitest.AssertContains(t, s, "alice") +} From ea9f55f85b26a269884210081624d09215c88be6 Mon Sep 17 00:00:00 2001 From: moneycaringcoder Date: Wed, 8 Apr 2026 22:08:19 +0200 Subject: [PATCH 6/6] feat: bump tuikit-go to v0.7.0 Picks up ListView cursor background highlight, Table RowStyler background fix, App.Model() for tuitest, and utility helpers. Removes local replace directive. --- go.mod | 4 +--- go.sum | 2 ++ 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index db85a15..f2245cb 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.26.1 require ( github.com/charmbracelet/bubbletea v1.3.10 github.com/charmbracelet/lipgloss v1.1.0 - github.com/moneycaringcoder/tuikit-go v0.6.0 + github.com/moneycaringcoder/tuikit-go v0.7.0 gopkg.in/yaml.v3 v3.0.1 ) @@ -33,5 +33,3 @@ require ( golang.org/x/sys v0.38.0 // indirect golang.org/x/text v0.34.0 // indirect ) - -replace github.com/moneycaringcoder/tuikit-go => ../tuikit-go diff --git a/go.sum b/go.sum index 1768be4..fdfcbe9 100644 --- a/go.sum +++ b/go.sum @@ -30,6 +30,8 @@ github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2J github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88= github.com/mattn/go-runewidth v0.0.19 h1:v++JhqYnZuu5jSKrk9RbgF5v4CGUjqRfBm05byFGLdw= github.com/mattn/go-runewidth v0.0.19/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs= +github.com/moneycaringcoder/tuikit-go v0.7.0 h1:DEI3CGNhndFfpxYHjwDvd/TkDndQfTbFrixMy/QVj3E= +github.com/moneycaringcoder/tuikit-go v0.7.0/go.mod h1:2P2MPQGh/A+vpCcrgh5Taz+XqMlrpPgAsc2cd4W8ucg= github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 h1:ZK8zHtRHOkbHy6Mmr5D264iyp3TiX5OmNcI5cIARiQI= github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo= github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA=