Drop padding and terminal width detection

Output left + right with a single space separator instead of trying
to right-align to a detected terminal width. Terminal detection is
unreliable when all fds are piped by Claude Code, and hardcoding a
width defeats the purpose. Also removes the x/term dependency.
This commit is contained in:
2026-02-08 23:37:48 +01:00
parent 27128e2e3b
commit bca7b59248
3 changed files with 339 additions and 752 deletions

1
go.mod
View File

@@ -5,7 +5,6 @@ go 1.25.5
require (
github.com/go-git/go-git/v6 v6.0.0-20260206150416-f623c7555599
github.com/shirou/gopsutil/v4 v4.26.1
golang.org/x/term v0.39.0
)
require (

67
main.go
View File

@@ -3,7 +3,6 @@ package main
import (
"bufio"
"encoding/json"
"errors"
"fmt"
"os"
"path/filepath"
@@ -12,11 +11,8 @@ import (
"github.com/go-git/go-git/v6"
"github.com/shirou/gopsutil/v4/process"
"golang.org/x/term"
)
const defaultStatuslineWidth = 80
// TokenUsage tracks context window token consumption.
type TokenUsage struct {
InputTokens int `json:"input_tokens"`
@@ -72,36 +68,26 @@ func parseStatusInput(jsonStr string) (*StatusInput, error) {
return &data, nil
}
// buildStatusLine constructs the left and right parts of the status line.
func buildStatusLine(data *StatusInput) (left, right string) {
// buildStatusLine constructs the formatted status line.
func buildStatusLine(data *StatusInput) string {
contextInfo := formatContextInfo(data.ContextWindow.ContextWindowSize, data.ContextWindow.CurrentUsage)
dirName := filepath.Base(data.Workspace.CurrentDir)
giteaStatus := getGiteaStatus()
gitInfo := getGitInfo(data.Workspace.CurrentDir)
left = fmt.Sprintf("%s %s%s%s %s➜%s %s%s%s%s",
left := fmt.Sprintf("%s %s%s%s %s➜%s %s%s%s%s",
giteaStatus,
magenta, data.Model.DisplayName, reset,
boldGreen, reset,
cyan, dirName, reset,
gitInfo)
right = fmt.Sprintf("%s%s%s", yellow, contextInfo, reset)
return left, right
}
right := fmt.Sprintf("%s%s%s", yellow, contextInfo, reset)
// calculatePadding returns the number of spaces needed for padding.
func calculatePadding(leftVisible, rightVisible string, termWidth int) int {
return max(termWidth-len(leftVisible)-len(rightVisible), 1)
}
// formatOutput combines left, right, and padding into final output.
func formatOutput(left, right string, padding int) string {
return fmt.Sprintf("%s%s%s", left, strings.Repeat(" ", padding), right)
return left + " " + right
}
// run reads JSON from r, builds the statusline, and writes it to w.
// Returns an error if the input cannot be parsed.
func run(r *bufio.Reader, w *strings.Builder) error {
jsonStr := readInputFromStdin(r)
@@ -110,20 +96,7 @@ func run(r *bufio.Reader, w *strings.Builder) error {
return fmt.Errorf("error parsing JSON: %w", err)
}
left, right := buildStatusLine(data)
// Calculate visible lengths (strip ANSI)
leftVisible := stripANSI(left)
rightVisible := stripANSI(right)
// Get terminal width
termWidth := getTerminalWidth()
// Calculate and apply padding
padding := calculatePadding(leftVisible, rightVisible, termWidth)
output := formatOutput(left, right, padding)
w.WriteString(output)
w.WriteString(buildStatusLine(data))
return nil
}
@@ -212,34 +185,6 @@ func getGitInfo(cwd string) string {
return fmt.Sprintf(" git:(%s)", branch)
}
// termWidthFunc returns the usable status line width.
// Checks STATUSLINE_WIDTH env var first (set in Claude Code settings),
// then tries terminal detection on stderr/stdin/stdout, then falls back
// to defaultStatuslineWidth.
// Replaced in tests to avoid depending on a real TTY.
var termWidthFunc = func() (int, error) {
if sw := os.Getenv("STATUSLINE_WIDTH"); sw != "" {
var w int
if _, err := fmt.Sscanf(sw, "%d", &w); err == nil && w > 0 {
return w, nil
}
}
for _, fd := range []uintptr{os.Stderr.Fd(), os.Stdin.Fd(), os.Stdout.Fd()} {
if width, _, err := term.GetSize(int(fd)); err == nil {
return width, nil
}
}
return 0, errors.New("no terminal detected")
}
func getTerminalWidth() int {
width, err := termWidthFunc()
if err != nil {
return defaultStatuslineWidth
}
return width
}
var ansiRegex = regexp.MustCompile(`\x1b\[[0-9;]*m`)
func stripANSI(s string) string {

File diff suppressed because it is too large Load Diff