Tab korjaa kirjoitusvirheet + fuzzy-match alikomennoille

Tab-painallus yrittää ensin autokorjausta (typo-taulukko + Levenshtein),
sitten normaalia tab-completionia. Myös alikomennot korjautuvat
fuzzy-matchilla (esim. "kpn rnu" → "kpn run").

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-07 06:37:51 +03:00
parent b70cdbd24d
commit f1b57a6c53

View File

@@ -2264,11 +2264,26 @@ Files: ${Object.keys(generatedFiles).join(', ')}`;
} }
} }
// Levenshtein-etäisyys ensimmäiselle sanalle // Levenshtein-etäisyys ensimmäiselle sanalle
const firstWord = input.trim().split(/\s+/)[0].toLowerCase(); const words = input.trim().split(/\s+/);
const firstWord = words[0].toLowerCase();
if (firstWord !== 'kpn' && firstWord.length >= 2 && firstWord.length <= 5) { if (firstWord !== 'kpn' && firstWord.length >= 2 && firstWord.length <= 5) {
const dist = levenshtein(firstWord, 'kpn'); const dist = levenshtein(firstWord, 'kpn');
if (dist <= 2) return 'kpn' + input.slice(firstWord.length); if (dist <= 2) return 'kpn' + input.slice(firstWord.length);
} }
// Fuzzy-korjaus alikomentotasolla: "kpn rnu" → "kpn run"
if (firstWord === 'kpn' && words.length >= 2) {
const sub = words[1].toLowerCase();
const subCommands = ['help', 'run', 'project', 'pipeline', 'load', 'status', 'models', 'hello', 'clear'];
let bestMatch = null, bestDist = 3;
for (const cmd of subCommands) {
const d = levenshtein(sub, cmd);
if (d > 0 && d < bestDist) { bestDist = d; bestMatch = cmd; }
}
if (bestMatch) {
words[1] = bestMatch;
return words.join(' ');
}
}
return null; return null;
} }
@@ -2426,6 +2441,13 @@ Files: ${Object.keys(generatedFiles).join(', ')}`;
}; };
function tabComplete(input) { function tabComplete(input) {
// Autokorjaus ensin: korjaa typo ja palauta true jos korjattiin
const corrected = autocorrect(input.value.trim());
if (corrected && corrected !== input.value.trim()) {
input.value = corrected;
return true;
}
const val = input.value; const val = input.value;
const words = val.trimEnd().split(/\s+/); const words = val.trimEnd().split(/\s+/);