@owloops/claude-powerline
Version:
Beautiful vim-style powerline statusline for Claude Code with real-time usage tracking, git integration, and custom themes
119 lines (99 loc) • 2.34 kB
text/typescript
import process from "node:process";
import tty from "node:tty";
export function getColorSupport(): "none" | "ansi" | "ansi256" | "truecolor" {
const { env } = process;
let colorEnabled = true;
if (env.NO_COLOR && env.NO_COLOR !== "") {
colorEnabled = false;
}
const forceColor = env.FORCE_COLOR;
if (forceColor && forceColor !== "") {
if (forceColor === "false" || forceColor === "0") {
return "none";
}
if (forceColor === "true" || forceColor === "1") {
return "ansi";
}
if (forceColor === "2") {
return "ansi256";
}
if (forceColor === "3") {
return "truecolor";
}
return "ansi";
}
if (!colorEnabled) {
return "none";
}
if (env.TERM === "dumb") {
return "none";
}
if (env.CI) {
if (
["GITHUB_ACTIONS", "GITEA_ACTIONS", "CIRCLECI"].some((key) => key in env)
) {
return "truecolor";
}
return "ansi";
}
if (env.COLORTERM === "truecolor") {
return "truecolor";
}
const truecolorTerminals = [
"xterm-kitty",
"xterm-ghostty",
"wezterm",
"alacritty",
"foot",
"contour",
];
if (truecolorTerminals.includes(env.TERM || "")) {
return "truecolor";
}
if (env.TERM_PROGRAM) {
switch (env.TERM_PROGRAM) {
case "iTerm.app":
return "truecolor";
case "Apple_Terminal":
return "ansi256";
case "vscode":
return "truecolor";
case "Tabby":
return "truecolor";
}
}
if (/-256(color)?$/i.test(env.TERM || "")) {
return "ansi256";
}
if (/-truecolor$/i.test(env.TERM || "")) {
return "truecolor";
}
if (
/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(
env.TERM || "",
)
) {
return "ansi";
}
if (env.COLORTERM) {
return "ansi";
}
if (tty?.WriteStream?.prototype?.hasColors) {
try {
const colors = tty.WriteStream.prototype.hasColors();
if (!colors) {
return "none";
}
const has256Colors = tty.WriteStream.prototype.hasColors(256);
const has16mColors = tty.WriteStream.prototype.hasColors(16777216);
if (has16mColors) {
return "truecolor";
} else if (has256Colors) {
return "ansi256";
} else {
return "ansi";
}
} catch {}
}
return "ansi";
}