fix(read/edit): make compact line prefix unambiguous for tab-indented files (#613)

This commit is contained in:
Jeevan Mohan Pawar
2026-04-12 18:00:33 +01:00
committed by GitHub
parent 84fcc7f7e0
commit 08cc6f3287
3 changed files with 54 additions and 3 deletions

View File

@@ -11,7 +11,7 @@ export function getEditToolDescription(): string {
function getDefaultEditDescription(): string { function getDefaultEditDescription(): string {
const prefixFormat = isCompactLinePrefixEnabled() const prefixFormat = isCompactLinePrefixEnabled()
? 'line number + tab' ? 'line number + arrow'
: 'spaces + line number + arrow' : 'spaces + line number + arrow'
const minimalUniquenessHint = const minimalUniquenessHint =
process.env.USER_TYPE === 'ant' process.env.USER_TYPE === 'ant'

51
src/utils/file.test.ts Normal file
View File

@@ -0,0 +1,51 @@
import { afterEach, describe, expect, mock, test } from 'bun:test'
async function importFileModuleWithKillswitchEnabled(
killswitchEnabled: boolean,
) {
mock.module('../services/analytics/growthbook.js', () => ({
getFeatureValue_CACHED_MAY_BE_STALE: () => killswitchEnabled,
}))
return import(`./file.js?ts=${Date.now()}-${Math.random()}`)
}
afterEach(() => {
mock.restore()
})
describe('addLineNumbers', () => {
test('uses unambiguous arrow compact prefix and preserves leading tabs', async () => {
const { addLineNumbers } = await importFileModuleWithKillswitchEnabled(false)
const result = addLineNumbers({
content: '\tfirst\n\t\tsecond',
startLine: 41,
})
expect(result).toBe('41→\tfirst\n42→\t\tsecond')
})
test('keeps padded arrow format when compact mode is disabled', async () => {
const { addLineNumbers } = await importFileModuleWithKillswitchEnabled(true)
const result = addLineNumbers({
content: 'alpha\nbeta',
startLine: 1,
})
expect(result).toBe(' 1→alpha\n 2→beta')
})
})
describe('stripLineNumberPrefix', () => {
test('strips compact arrow, padded arrow, and legacy tab prefixes', async () => {
const { stripLineNumberPrefix } = await importFileModuleWithKillswitchEnabled(
false,
)
expect(stripLineNumberPrefix('41→\tfirst')).toBe('\tfirst')
expect(stripLineNumberPrefix(' 2→beta')).toBe('beta')
expect(stripLineNumberPrefix('7\t\tlegacy-tab')).toBe('\tlegacy-tab')
})
})

View File

@@ -267,7 +267,7 @@ export async function suggestPathUnderCwd(
} }
/** /**
* Whether to use the compact line-number prefix format (`N\t` instead of * Whether to use the compact line-number prefix format (`N` instead of
* ` N→`). The padded-arrow format costs 9 bytes/line overhead; at * ` N→`). The padded-arrow format costs 9 bytes/line overhead; at
* 1.35B Read calls × 132 lines avg this is 2.18% of fleet uncached input * 1.35B Read calls × 132 lines avg this is 2.18% of fleet uncached input
* (bq-queries/read_line_prefix_overhead_verify.sql). * (bq-queries/read_line_prefix_overhead_verify.sql).
@@ -303,7 +303,7 @@ export function addLineNumbers({
if (isCompactLinePrefixEnabled()) { if (isCompactLinePrefixEnabled()) {
return lines return lines
.map((line, index) => `${index + startLine}\t${line}`) .map((line, index) => `${index + startLine}${line}`)
.join('\n') .join('\n')
} }