Compare commits

...
2 changed files with 58 additions and 0 deletions

No files matched your search

+7
View File
@@ -100,6 +100,12 @@ const OH_MY_ZSH_YS_HOST_LINE_PATTERN = /^#\s+[^\s@]+\s+@\s+[^\s]+(?:\s+[^\n\r]+)
// within the path so partially entered commands do not count as idle prompts.
const ALPINE_PROMPT_PATTERN = /^[A-Za-z0-9_][A-Za-z0-9_.-]*:(?:~(?:\/[^#$\n\r]*)?|\/[^#$\n\r]*)[#$]$/;
// Default macOS bash PS1 `\h:\W \u\$` (also seen after `sudo -i`),
// e.g. `ChrisdeMacBook-Air:~ root#`. Pure shape only; no shellKind gate.
// Require a username after the path so Alpine `host:~#` / `host:/path#`
// stay separate; the hostname excludes `@` so POSIX `user@host:...` stays separate.
const MACOS_SUDO_ROOT_PROMPT_PATTERN = /^[A-Za-z0-9_][A-Za-z0-9_.-]*:(?:~|\/|[^\s:#$]+)\s+[A-Za-z0-9_.-]+[#$]$/;
// Powerlevel10k / similar Unicode prompt-ending ❯ (U+276F). Common idle forms:
// `~ ❯`, `~/path ❯`, `/tmp ❯`, short-dir `proj ❯`, optional `user@host `
// prefix (`alice@host ~ ❯`). Require a non-empty prefix and whitespace before
@@ -138,6 +144,7 @@ function isDefaultPosixPromptLine(line) {
POSIX_PROMPT_PATTERN.test(withoutEnvPrefix) ||
PAREN_POSIX_PROMPT_PATTERN.test(withoutEnvPrefix) ||
ALPINE_PROMPT_PATTERN.test(withoutEnvPrefix) ||
MACOS_SUDO_ROOT_PROMPT_PATTERN.test(withoutEnvPrefix) ||
ZSH_PROMPT_PATTERN.test(withoutEnvPrefix) ||
POWERLEVEL10K_PROMPT_PATTERN.test(withoutEnvPrefix) ||
OH_MY_ZSH_ROBBYRUSSELL_PROMPT_PATTERN.test(withoutEnvPrefix)
+51
View File
@@ -298,6 +298,57 @@ test("extracts an Alpine idle prompt while preserving its trailing whitespace",
assert.equal(extractTrailingIdlePrompt("localhost:~# \r\n"), "");
});
test("isDefaultPosixPromptLine matches macOS bash host:dir user prompts", () => {
for (const prompt of [
"ChrisdeMacBook-Air:~ root#",
"ChrisdeMacBook-Air:~ root# ",
"host:/tmp root#",
"host:tmp root#",
"host:/ root#",
"SomeHost:~ alice$",
"(venv) ChrisdeMacBook-Air:~ root# ",
]) {
assert.equal(isDefaultPosixPromptLine(prompt), true, prompt);
}
});
test("macOS bash prompt recognition rejects authentication output and pending input", () => {
for (const line of [
"Password:",
"Sorry, try again.",
"ChrisdeMacBook-Air:~ root# ls",
"ChrisdeMacBook-Air:~ root# echo #",
"ChrisdeMacBook-Air:~root#",
]) {
assert.equal(isDefaultPosixPromptLine(line), false, line);
assert.equal(extractTrailingIdlePrompt(`welcome\r\n${line}`), "", line);
}
for (const line of ["PS C:\\Users\\alice>", "C:\\Users\\alice>"]) {
assert.equal(isDefaultPosixPromptLine(line), false, line);
}
});
test("extracts a macOS bash idle prompt while preserving its trailing whitespace", () => {
assert.equal(
extractTrailingIdlePrompt("Welcome\r\n\x1b[32mChrisdeMacBook-Air:~ root# \x1b[0m"),
"ChrisdeMacBook-Air:~ root# ",
);
assert.equal(
extractTrailingIdlePrompt("(venv) ChrisdeMacBook-Air:~ root# "),
"(venv) ChrisdeMacBook-Air:~ root# ",
);
});
test("extracts the macOS root idle prompt after sudo -i finishes authentication", () => {
const transcript = "user@MacBook-Pro ~ % sudo -i\r\nPassword:";
assert.equal(extractTrailingIdlePrompt(transcript), "");
assert.equal(extractTrailingIdlePrompt(`${transcript}\r\nSorry, try again.`), "");
assert.equal(
extractTrailingIdlePrompt(`${transcript}\r\nChrisdeMacBook-Air:~ root# `),
"ChrisdeMacBook-Air:~ root# ",
);
});
test("isDefaultPosixPromptLine matches Powerlevel10k ❯ idle prompts", () => {
for (const prompt of [
"~ ❯",