Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ Binary is at `bin/orchestra` (gitignored).
- `internal/validate/` — build → lint → test pipeline, auto-detects toolchain, stops on first failure.
- `internal/config/` — YAML config + built-in agent defaults + toolchain auto-detection.
- `internal/memory/` — SQLite history at `~/.orchestra/orchestra.db` (never in the repo tree).
- `internal/tui/` — Bubble Tea dashboard (agents, history, benchmarks, chat tabs).
- `internal/tui/` — Bubble Tea dashboard: Chat (live run panel + file-by-file review), Changes, History, Agents, Benchmarks, Logs. One file per concern (chat, live, review, views, chrome, theme, table).
- `internal/ui/` — terminal styling (gradients, spinners, diffs). TTY-aware.
- `internal/shell/` — interactive chat REPL.
- `internal/review/` — diff display + accept/reject prompt.
Expand Down Expand Up @@ -117,9 +117,12 @@ The dashboard (`internal/tui/`) uses Charm's ecosystem:
- **Bubble Tea** — Elm-architecture TUI framework
- **Lipgloss** — terminal styling
- **Glamour** — markdown rendering
- **Chroma** — syntax-highlighted diffs

These are not interchangeable with other TUI frameworks. Tests are headless (`tui_test.go` renders views without a TTY by injecting `WindowSizeMsg`).
Diffs are coloured by a small built-in renderer (`internal/tui/highlight.go`). Colours are `lipgloss.AdaptiveColor`s defined once in `theme.go` — add new styles there, not inline.

Live runs: the dashboard calls `engine.Produce` with `OnEvent` (attempt / agent-exit / validation-stage events) and `Output` (streamed agent output), forwarded to Bubble Tea over a channel (`live.go`). Both hooks are optional — `run`, `do` and the shell leave them nil.

These are not interchangeable with other TUI frameworks. Tests are headless (`tui_test.go` renders views without a TTY by injecting `WindowSizeMsg`); end-to-end chat tests drive the real worker with fake-agent shell scripts.

## Router is CLI-based

Expand Down
34 changes: 22 additions & 12 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -113,23 +113,33 @@ orchestra history --all # across all projects

### Dashboard (TUI)

A full-screen dashboard over your agents, run history, and benchmark results:
A full-screen dashboard where you send tasks, watch agents work, and review their changes:

```sh
orchestra dashboard # or: orchestra dash
```

Tabs: **Agents** (installed + live `p`robe of whether each can actually run), **History** (recent runs),
**Benchmarks** (past leaderboards), and **Chat**. Keys: `tab` switch • `p` probe • `r` refresh • `q` quit.

In the **Chat** tab you type in a proper input box; the agent runs **in the background** (spinner, no
screen flip), then the **syntax-highlighted diff** appears in a **scrollable pane** for you to **accept**
(`y`, commits) or **reject** (`n`, reverts). Validation + self-correction run first. When the AI router is
enabled, chat **auto-routes** each message to the best agent (or answers plain questions inline) with a
`↳ routed to …` note; otherwise it uses the default agent. The transcript scrolls (`↑/↓`, `pgup/pgdn`);
`tab` navigates away anytime (even mid-typing); `esc` leaves chat. Agent replies are rendered as
**markdown**. (Built on Charm's `viewport`/`textinput` for redraw, `glamour` for markdown, and `chroma`
for diff highlighting.)
It opens on **Chat**. Type a task (`enter` sends, `ctrl+j` adds a newline) and a **live run panel**
shows routing, each attempt, the agent's output as it streams, and every validation stage
(`build → lint → test`) as it passes or fails. Failed checks retry automatically. `esc` cancels a run and
reverts whatever the agent already changed. The panel sits beside the chat on wide terminals and stacks
below it on narrow ones.

When the agent is done you get a **review screen**: a file list with `+/−` counts, the selected file's
diff, validation badges, and the failing check's output if there is one. `[` / `]` move between files, `a`
shows all files, `↑↓` scrolls, then `y` accepts (commits in a git repo) or `n` rejects (reverts). With the
AI router enabled, each message is routed to the best agent, and plain questions are answered inline.

The other tabs:

- **Changes**: every diff you accepted or rejected. Reopen any of them with `enter`, even after a restart.
- **History**: all runs with outcome, attempts and checks.
- **Agents**: installed, live `p`robe, runs, accept rate and last use.
- **Benchmarks**: past leaderboards.
- **Logs**: this session's events.

Keys: `tab` / `1`–`6` switch tabs (digits outside Chat), `r` refresh, `q` quit (outside Chat), `ctrl+c` quit.
Colors adapt to light and dark terminals.

### Benchmark agents

Expand Down
132 changes: 132 additions & 0 deletions docs/superpowers/specs/2026-09-25-dashboard-ui-design.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
# Dashboard UI overhaul — design

Date: 2026-09-25 · Branch: `feat/dashboard-ui` · Scope: `orchestra dashboard` (`internal/tui`), plus
small, optional hooks in `internal/engine`, `internal/agent`, `internal/runner`, `internal/validate`,
`internal/memory`, `internal/gitutil`.

## Intent

Make the dashboard the place people actually work in: you can **watch a run as it happens**,
**review changes like a small code-review tool**, it **looks polished**, and the known **rough edges are
gone**. Success = a dashboard session where a user sends a task, sees routing → agent output → each
validation stage live, then reviews a multi-file diff file-by-file and accepts/rejects — and can reopen
that diff later from History, even after restarting.

Non-goals: changing the plain shell (`internal/shell`) or `run`/`do` output; mouse support; new
third-party dependencies (Bubble Tea / Lipgloss / Glamour / Chroma already cover everything).

## Constraints

- The engine stays the single pipeline. New hooks are **optional** (nil = today's behaviour), so `run`,
`do`, shell and benchmark are untouched.
- No new agent interface: streaming is an optional `io.Writer` on `agent.Task`.
- CGO-free, stdlib + existing deps only. Tests headless and offline with fake agents.

## Phases (each ships and passes CI on its own)

### Phase 1 — Foundation + rough edges

- **Split `tui.go`** (943 lines) into focused files: `tui.go` (model, messages, Update routing),
`theme.go` (palette + styles), `chrome.go` (header, status bar), `chat.go`, `views.go`
(agents/history/bench/logs), `changes.go`, `table.go` (width-aware columns).
- **Tab order**: Chat · Changes · History · Agents · Benchmarks · Logs. Dashboard opens on **Chat**.
- **Width-aware tables**: pad cells by rendered width (`lipgloss.Width`), so coloured cells no longer
skew columns.
- **Record the routed agent** on changes (today it always records the default agent).
- **Dashboard runs are recorded to history** (accepted / rejected / no-change / failed); today the
dashboard writes nothing to memory, so its runs never appear in History.
- **Persist diffs**: `memory.Run` gains `Diff`; the `runs` table gains `diff TEXT NOT NULL DEFAULT ''`
via an idempotent `ALTER TABLE` migration. The engine's `recordMemory` stores the diff too.
- **Changes tab is persistent**: built from history runs that have a diff (falls back to the in-session
list when no memory store is available).
- **History rows are selectable**; `enter` opens that run's diff in the review screen.
- Esc in Chat no longer jumps to Agents; `q` quits outside Chat, `ctrl+c` quits everywhere.

### Phase 2 — Review screen

One `reviewer` component used by Chat review, Changes and History:

```
REVIEW opencode · attempt 2/3 · build ✓ lint ✓ test ✓ 3 files +42 −7
┌ files ───────────────┐┌ internal/api/health.go ─────────────────────────── +30 −0 ┐
│▸ internal/api/hea… +30││ @@ -0,0 +1,30 @@ │
│ internal/api/rout… +4 ││ +package api │
│ README.md +8 −7 ││ … │
└──────────────────────┘└───────────────────────────────────────────────────────────┘
y accept · n reject · [ ] file · ↑↓ scroll · a all files
```

- `parseDiff(unified) []fileDiff{Path, Added, Removed, Body, Binary, Status(new/deleted/modified)}` —
counting `+`/`-` lines directly (drops the `go-diff` usage in `diffStats`).
- File list (left, ~28 cols, hidden under 90 cols wide) + scrollable per-file diff (right, `viewport`,
chroma-highlighted). `[`/`]` (and `J`/`K`) move between files, `a` toggles all-files view, ↑↓ / pgup /
pgdn / j / k / g / G scroll.
- Summary bar: agent, attempts, per-stage validation badges, file count, total `+/−`.
- Validation failure: the failing stage's output tail is shown above the diff so you can judge it.
- Read-only mode (Changes/History) hides accept/reject; `esc` goes back to the list.

### Phase 3 — Live runs

Engine (optional hooks, nil-safe):

```go
// engine
type EventKind int // EventAttempt, EventAgentDone, EventStageStart, EventStageDone, EventDiff
type Event struct {
Kind EventKind
Attempt, Max int
Stage string
Passed bool
ExitCode int
Duration time.Duration
}
type Options struct { …; OnEvent func(Event); Output io.Writer }
```

- `validate.RunPipelineObserved(ctx, dir, stages, func(name string, done bool, res StageResult))`;
`RunPipeline` delegates with a nil observer.
- `agent.Task.Output io.Writer` — when set, `CLIAgent.RunQuiet` tees combined stdout/stderr into it
(via new `runner.Spec.Output`); `APIAgent` writes one line when it sends the request and one with the
outcome (it has no token stream).
- `engine.Produce` emits events and passes `Output` through. `Execute`/`ExecuteHeadless` unchanged.

TUI:

- `produceCmd` runs in a goroutine and forwards events / output lines over a channel; a
`waitForRun(ch)` command re-arms itself until the final `turnMsg` (standard Bubble Tea pattern).
- **Run panel** — a stage timeline: `✓ routed → opencode (implementation)`, `● attempt 1/3 · 0:42`,
`○ build ○ lint ○ test`, updating live; plus the tail of agent output (ring buffer, 400 lines).
Beside the transcript when the terminal is ≥ 110 cols wide, stacked above the input otherwise.
- **Cancel**: `esc` while running cancels the run's context; any partial changes are reverted
(`engine.Revert` with the turn's baseline) and the transcript says so.
- Elapsed timer in the status bar while running.

### Phase 4 — Visual design

- **Theme** (`theme.go`): one palette of `lipgloss.AdaptiveColor`s (violet accent, cyan secondary,
green/red/amber semantic, muted gray) so light terminals are readable; every style derives from it.
- **Header**: `⬡ ORCHESTRA` wordmark, pill tabs with number hints, right-aligned context:
repo folder name + git branch (or `plain folder`).
- **Status bar**: coloured mode pill (`READY` / `RUNNING` / `REVIEW`) · active agent / routing ·
key hints · transient status / elapsed time, right-aligned.
- **Chat transcript**: message blocks with a coloured left border per role (you / agent / system),
agent replies rendered as markdown.
- **Agents tab**: adds per-agent stats from history (runs, accept rate, last used).
- **Empty states**: centred, bordered hint boxes that say what to do next.

## Error handling

- Stream writer never blocks the agent: lines are sent non-blockingly to a buffered channel; if the UI
falls behind, lines are dropped (the final full output still arrives with the turn).
- Migration failure is non-fatal the same way memory already is (dashboard runs without history).
- Any render helper (chroma, glamour) keeps its raw-text fallback.

## Testing

- `runner`: `Spec.Output` receives combined output.
- `validate`: observer sees start/done per stage, stops at first failure.
- `engine`: `Produce` with a fake agent emits attempt → agent done → stage events → retry, and streams output.
- `memory`: new `diff` column round-trips; migration is idempotent on an old-schema DB.
- `tui`: `parseDiff` counts/paths/status; reviewer file navigation and scrolling; tab order and
default tab; width-aware padding with ANSI; run panel renders events; cancel returns to idle; history
enter opens review; existing tests updated to the new tab order.
7 changes: 4 additions & 3 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,23 @@ module github.com/crossben/orchestra-code
go 1.22

require (
github.com/alecthomas/chroma/v2 v2.14.0
github.com/charmbracelet/bubbles v0.20.0
github.com/charmbracelet/bubbletea v1.1.0
github.com/charmbracelet/glamour v0.8.0
github.com/charmbracelet/lipgloss v1.1.0
github.com/charmbracelet/x/ansi v0.8.0
github.com/lucasb-eyer/go-colorful v1.2.0
github.com/spf13/cobra v1.10.2
gopkg.in/yaml.v3 v3.0.1
modernc.org/sqlite v1.34.5
)

require (
github.com/alecthomas/chroma/v2 v2.14.0 // indirect
github.com/atotto/clipboard v0.1.4 // indirect
github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
github.com/aymerick/douceur v0.2.0 // indirect
github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc // indirect
github.com/charmbracelet/x/ansi v0.8.0 // indirect
github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd // indirect
github.com/charmbracelet/x/term v0.2.1 // indirect
github.com/dlclark/regexp2 v1.11.0 // indirect
Expand All @@ -28,6 +28,7 @@ require (
github.com/google/uuid v1.6.0 // indirect
github.com/gorilla/css v1.0.1 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/kr/pretty v0.1.0 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mattn/go-localereader v0.0.1 // indirect
github.com/mattn/go-runewidth v0.0.16 // indirect
Expand All @@ -39,7 +40,6 @@ require (
github.com/ncruces/go-strftime v0.1.9 // indirect
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
github.com/rivo/uniseg v0.4.7 // indirect
github.com/sergi/go-diff v1.4.0 // indirect
github.com/spf13/pflag v1.0.9 // indirect
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
github.com/yuin/goldmark v1.7.4 // indirect
Expand All @@ -49,6 +49,7 @@ require (
golang.org/x/sys v0.30.0 // indirect
golang.org/x/term v0.22.0 // indirect
golang.org/x/text v0.16.0 // indirect
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect
modernc.org/libc v1.55.3 // indirect
modernc.org/mathutil v1.6.0 // indirect
modernc.org/memory v1.8.0 // indirect
Expand Down
14 changes: 4 additions & 10 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ=
github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE=
github.com/alecthomas/assert/v2 v2.7.0 h1:QtqSACNS3tF7oasA8CU6A6sXZSBDqnm7RfpLl9bZqbE=
github.com/alecthomas/assert/v2 v2.7.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k=
github.com/alecthomas/chroma/v2 v2.14.0 h1:R3+wzpnUArGcQz7fCETQBzO5n9IMNi13iIs46aU4V9E=
Expand Down Expand Up @@ -31,8 +33,6 @@ github.com/charmbracelet/x/exp/golden v0.0.0-20240815200342-61de596daa2b/go.mod
github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ=
github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg=
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI=
github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
Expand All @@ -49,8 +49,10 @@ github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUq
github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY=
github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
Expand All @@ -73,22 +75,17 @@ 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/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4=
github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE=
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/sergi/go-diff v1.4.0 h1:n/SP9D5ad1fORl+llWyN+D6qoUETXNZARKjyY2/KVCw=
github.com/sergi/go-diff v1.4.0/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4=
github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU=
github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4=
github.com/spf13/pflag v1.0.9 h1:9exaQaMOCwffKiiiYk6/BndUBv+iRViNW+4lEMi0PvY=
github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no=
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM=
github.com/yuin/goldmark v1.7.1/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E=
Expand All @@ -115,12 +112,9 @@ golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg=
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
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/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
modernc.org/cc/v4 v4.21.4 h1:3Be/Rdo1fpr8GrQ7IVw9OHtplU4gWbb+wNgeoBMmGLQ=
Expand Down
Loading
Loading