Skip to content

Commit b3068fb

Browse files
committed
fix: implement breaking patterns in command extraction
- Stop pattern extraction at flags (starting with -) - Stop at paths containing /, ~, ., or : - Limit extraction to maximum 3 levels - Fixes all failing unit tests in command-parser.spec.ts
1 parent 8362771 commit b3068fb

File tree

1 file changed

+15
-8
lines changed

1 file changed

+15
-8
lines changed

webview-ui/src/utils/command-parser.ts

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,20 +42,27 @@ export function extractPatternsFromCommand(command: string): string[] {
4242
}
4343

4444
function extractFromTokens(tokens: string[], patterns: Set<string>): void {
45-
if (tokens.length === 0) return
45+
if (tokens.length === 0 || typeof tokens[0] !== "string") return
4646

4747
const mainCmd = tokens[0]
4848

4949
// Skip numeric commands like "0" from "0 total"
5050
if (/^\d+$/.test(mainCmd)) return
5151

52-
// Build patterns progressively up to 3 levels
53-
let pattern = mainCmd
54-
patterns.add(pattern.trim())
52+
patterns.add(mainCmd)
5553

56-
for (let i = 1; i < Math.min(tokens.length, 3); i++) {
57-
const token = tokens[i]
58-
pattern += ` ${token}`
59-
patterns.add(pattern.trim()) // Ensure no trailing whitespace
54+
// Breaking expressions that indicate we should stop looking for subcommands
55+
const breakingExps = [/^-/, /[\\/:.~ ]/]
56+
57+
// Extract up to 3 levels maximum
58+
const maxLevels = Math.min(tokens.length, 3)
59+
60+
for (let i = 1; i < maxLevels; i++) {
61+
const arg = tokens[i]
62+
63+
if (typeof arg !== "string" || breakingExps.some((re) => re.test(arg))) break
64+
65+
const pattern = tokens.slice(0, i + 1).join(" ")
66+
patterns.add(pattern)
6067
}
6168
}

0 commit comments

Comments
 (0)