❯ go run cmd/entire/main.go labs

❯ go run cmd/entire/main.go labs Labs
These are newer Entire workflows we are actively refining. They are available to try now, but details may change based on feedback.
Available experimental commands: entire review Run configured review skills against the current branch entire investigate Run a multi-agent investigation against a topic, issue, or seed doc entire org Manage Entire organizations (create, list) entire project Manage Entire projects (create, list) entire repo Manage Entire repositories (create, list, get, delete) entire grant Manage access grants and org membership (org, project, repo)
I see the labs output. There's no question or instruction attached — what would you like me to do here?
One thing I notice in the output: the column alignment is off because investigate is longer than the other command names:
Every other description starts at a fixed column, but investigate's description gets squeezed right after it with a single space. If you'd like, I can fix that formatting so the descriptions line up. Otherwise, let me know what you're after.
yes, I'd like to fix formatting, can we also future proof that a bit if not super complex?
Fixed. The descriptions now align in a single column.
The change makes alignment self-adjusting: instead of a hardcoded width of 16, renderExperimentalCommands computes the column width from the longest invocation in the slice. Add a longer command later and it'll just work. I also made padRight count runes rather than bytes, so a future command name with multi-byte characters won't throw off the alignment.
Want me to run mise run fmt && mise run lint before you commit?
Done. Tests pass, lint is clean (0 issues), formatting is good.
Summary
Fix (labs.go): renderExperimentalCommands now computes the column width from the longest invocation instead of the hardcoded 16, so entire investigate no longer breaks the alignment. Both it and padRight count runes rather than bytes, future-proofing against multi-byte command names.
Tests (labs_test.go): two new unit tests on the rendering helper —
TestRenderExperimentalCommands_SummariesAlign— pins the regression: every summary in the realexperimentalCommandsregistry starts at the same column.TestRenderExperimentalCommands_ColumnWidthAdjustsToLongest— verifies the column auto-widens when a longer invocation is added, and rows stay aligned.
Both work off renderExperimentalCommands directly, so they'll keep guarding alignment as commands are added or renamed. Want me to commit this?
The new rune-based padding in renderExperimentalCommands/padRight is intended to fix alignment for multi-byte UTF-8 invocations, but the added tests don’t currently cover a case where len(value) >= width while utf8.RuneCountInString(value) < width (the scenario that previously caused misalignment). Adding a regression test with a multi-byte rune ensures this behavior doesn’t regress.c
Done. Added TestRenderExperimentalCommands_MultiByteInvocationAligns, which covers exactly the gap you flagged:
- Uses
entire ▶▶— 9 runes but 13 bytes — alongside a 12-rune invocation, so the column width is 12 and this row hits thelen(value) >= widthbutRuneCountInString(value) < widthcase. - Includes a precondition assertion so the test fails loudly if someone changes the fixture in a way that no longer exercises the multi-byte path.
- I verified it's a true regression guard: reverting
padRightto byte-based logic fails it ([15 12]misaligned), and the rune-based fix passes it.
Lint is clean (0 issues), formatting good. Ready to commit whenever you'd like.