diff --git a/internal/server/handlers_file.go b/internal/server/handlers_file.go index ed2a4e1..cf3f2ea 100644 --- a/internal/server/handlers_file.go +++ b/internal/server/handlers_file.go @@ -326,9 +326,13 @@ type lineNumberOpts struct { // resolveLineNumberOpts resolves per-call vs session-pref line-number options. func (s *Server) resolveLineNumberOpts(request mcp.CallToolRequest) lineNumberOpts { opts := lineNumberOpts{ - noLineNumbers: request.GetBool("no_line_numbers", false), - lineInterval: request.GetInt("line_number_interval", 1), - compactLineNums: request.GetBool("compact_line_numbers", false), + noLineNumbers: request.GetBool("no_line_numbers", false), + lineInterval: request.GetInt("line_number_interval", 1), + // Compact prefix ("12│content") is the default — it drops the 4-wide + // padding and trailing space of the legacy " 12│ " form, saving ~3 + // chars/line with no information loss. Pass compact_line_numbers=false + // (or mode/line_numbers="full") to restore the padded alignment. + compactLineNums: request.GetBool("compact_line_numbers", true), } // Apply session line_numbers pref when no explicit per-call override was supplied. diff --git a/internal/server/handlers_file_test.go b/internal/server/handlers_file_test.go index 871cf68..b61385c 100644 --- a/internal/server/handlers_file_test.go +++ b/internal/server/handlers_file_test.go @@ -589,19 +589,23 @@ func TestCompactLineNumbers(t *testing.T) { } } -func TestCompactLineNumbersOffByDefault(t *testing.T) { +func TestCompactLineNumbersDefaultAndOptOut(t *testing.T) { tmpDir := t.TempDir() srv := newTestServer(t, tmpDir) content := "line one\nline two\n" f := writeFile(t, tmpDir, "test.txt", content) - // Default: no compact_line_numbers - out := callRead(t, srv, map[string]interface{}{"path": f}) + // Default is now the compact prefix (token-saving): "1│line one". + def := callRead(t, srv, map[string]interface{}{"path": f}) + if !strings.Contains(def, "1│line one") || strings.Contains(def, " 1│ line one") { + t.Errorf("default should use compact prefix, got:\n%s", def) + } - // Should have padded format - if !strings.Contains(out, " 1│ line one") { - t.Errorf("default should have padded format, got:\n%s", out) + // Explicit opt-out restores the padded alignment. + padded := callRead(t, srv, map[string]interface{}{"path": f, "compact_line_numbers": false}) + if !strings.Contains(padded, " 1│ line one") { + t.Errorf("compact_line_numbers=false should restore padded format, got:\n%s", padded) } } @@ -679,9 +683,9 @@ func Hello() { if !strings.Contains(out, `println("hello")`) { t.Errorf("full mode missing body, got:\n%s", out) } - // Padded line numbers - if !strings.Contains(out, " 1│ package main") { - t.Errorf("default should have padded line numbers, got:\n%s", out) + // Default line numbers use the compact prefix. + if !strings.Contains(out, "1│package main") { + t.Errorf("default should have compact line numbers, got:\n%s", out) } // etag present if !strings.Contains(out, "[etag:") { diff --git a/internal/server/server.go b/internal/server/server.go index e0c11b1..fa9e479 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -206,7 +206,7 @@ func (s *Server) registerTools() { mcp.Description("Print line numbers only every N lines (default: 1 = every line). E.g. 10 = anchor every 10th line plus first/last. 0 = no line numbers."), ), mcp.WithBoolean("compact_line_numbers", - mcp.Description("Use compact line prefix '12\u2502' instead of ' 12\u2502 ' (no padding, no trailing space). Works with line_number_interval. Default off."), + mcp.Description("Use compact line prefix '12\u2502' instead of padded ' 12\u2502 ' (no padding, no trailing space). Works with line_number_interval. Default true; set false to restore padded alignment."), ), mcp.WithBoolean("collapse_blank_lines", mcp.Description("Collapse runs of consecutive blank lines to a single blank line. Useful for token savings on heavily-spaced code."), diff --git a/internal/server/session_integration_test.go b/internal/server/session_integration_test.go index 41a6d1b..12df5b7 100644 --- a/internal/server/session_integration_test.go +++ b/internal/server/session_integration_test.go @@ -48,7 +48,7 @@ func TestSessionPrefsFileReadLineNumbersNone(t *testing.T) { t.Fatalf("handleFileRead: %v", err) } text := result.Content[0].(mcp.TextContent).Text - // Standard line-number format is " 1│ "; with no_line_numbers it's absent. + // line_numbers=none suppresses the prefix entirely (no "│" gutter at all). if strings.Contains(text, " 1│") { t.Errorf("session line_numbers=none: expected no line-number prefix, got:\n%s", text) } @@ -87,7 +87,7 @@ func TestSessionPrefsFileReadLineNumbersCompact(t *testing.T) { req.Params.Arguments = map[string]interface{}{"path": testFile} result, _ := srv.handleFileRead(ctx, req) text := result.Content[0].(mcp.TextContent).Text - // Standard padded prefix is " 1│ "; compact is "1│". + // Padded prefix is " 1│ "; compact is "1│". if strings.Contains(text, " 1\u2502") { t.Errorf("session line_numbers=compact should use compact prefix, got:\n%s", text) }