@jiawang1209/codex-hud 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/.codex-plugin/plugin.json +41 -0
  2. package/CHANGELOG.md +9 -0
  3. package/LICENSE +21 -0
  4. package/README.md +342 -0
  5. package/dist/cli.d.ts +2 -0
  6. package/dist/cli.js +206 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/codex-statusline.d.ts +9 -0
  9. package/dist/codex-statusline.js +96 -0
  10. package/dist/codex-statusline.js.map +1 -0
  11. package/dist/config.d.ts +62 -0
  12. package/dist/config.js +199 -0
  13. package/dist/config.js.map +1 -0
  14. package/dist/index.d.ts +2 -0
  15. package/dist/index.js +5 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/installer.d.ts +17 -0
  18. package/dist/installer.js +125 -0
  19. package/dist/installer.js.map +1 -0
  20. package/dist/native-runner.d.ts +28 -0
  21. package/dist/native-runner.js +122 -0
  22. package/dist/native-runner.js.map +1 -0
  23. package/dist/render.d.ts +11 -0
  24. package/dist/render.js +149 -0
  25. package/dist/render.js.map +1 -0
  26. package/dist/snapshot.d.ts +12 -0
  27. package/dist/snapshot.js +32 -0
  28. package/dist/snapshot.js.map +1 -0
  29. package/dist/sources/codex.d.ts +50 -0
  30. package/dist/sources/codex.js +182 -0
  31. package/dist/sources/codex.js.map +1 -0
  32. package/dist/sources/git.d.ts +2 -0
  33. package/dist/sources/git.js +37 -0
  34. package/dist/sources/git.js.map +1 -0
  35. package/dist/sources/session.d.ts +14 -0
  36. package/dist/sources/session.js +278 -0
  37. package/dist/sources/session.js.map +1 -0
  38. package/dist/tmux-runner.d.ts +26 -0
  39. package/dist/tmux-runner.js +203 -0
  40. package/dist/tmux-runner.js.map +1 -0
  41. package/dist/types.d.ts +42 -0
  42. package/dist/types.js +2 -0
  43. package/dist/types.js.map +1 -0
  44. package/docs/installation.md +42 -0
  45. package/docs/native-codex-cli-patch.md +55 -0
  46. package/docs/plugin-marketplace.md +42 -0
  47. package/docs/release.md +35 -0
  48. package/docs/superpowers/plans/2026-05-23-codex-hud-mvp.md +234 -0
  49. package/docs/superpowers/plans/2026-05-23-productized-native-bundle.md +431 -0
  50. package/docs/superpowers/specs/2026-05-23-codex-hud-design.md +197 -0
  51. package/docs/upstream/codex-command-backed-statusline.md +101 -0
  52. package/package.json +49 -0
  53. package/patches/codex-cli-command-statusline.patch +459 -0
  54. package/plugins/codex-hud/.codex-plugin/plugin.json +41 -0
  55. package/plugins/codex-hud/skills/codex-hud/SKILL.md +153 -0
  56. package/skills/codex-hud/SKILL.md +153 -0
@@ -0,0 +1,96 @@
1
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ export const CODEX_HUD_STATUS_LINE_ITEMS = [
5
+ "model-with-reasoning",
6
+ "task-progress",
7
+ "current-dir",
8
+ "git-branch",
9
+ "context-used",
10
+ "five-hour-limit",
11
+ "weekly-limit",
12
+ "fast-mode",
13
+ ];
14
+ export function resolveCodexConfigPath(explicitPath, homeDir = os.homedir()) {
15
+ return explicitPath ?? path.join(homeDir, ".codex", "config.toml");
16
+ }
17
+ export async function installCodexStatusLine(configPath) {
18
+ const resolvedPath = resolveCodexConfigPath(configPath);
19
+ const existing = await readOptionalText(resolvedPath);
20
+ const next = buildCodexStatusLineToml(existing);
21
+ if (next !== existing) {
22
+ await mkdir(path.dirname(resolvedPath), { recursive: true });
23
+ await writeFile(resolvedPath, next, "utf8");
24
+ }
25
+ return {
26
+ configPath: resolvedPath,
27
+ changed: next !== existing,
28
+ items: CODEX_HUD_STATUS_LINE_ITEMS,
29
+ };
30
+ }
31
+ export function buildCodexStatusLineToml(input) {
32
+ const normalized = input.length > 0 && !input.endsWith("\n") ? `${input}\n` : input;
33
+ const lines = normalized.split("\n");
34
+ const tuiRange = findTableRange(lines, "tui");
35
+ const statusLineToml = formatStatusLine();
36
+ if (!tuiRange) {
37
+ const prefix = normalized.trimEnd();
38
+ return `${prefix}${prefix ? "\n\n" : ""}[tui]\n${statusLineToml}\n`;
39
+ }
40
+ const existingRange = findKeyRange(lines, tuiRange.start + 1, tuiRange.end, "status_line");
41
+ if (existingRange) {
42
+ const nextLines = [
43
+ ...lines.slice(0, existingRange.start),
44
+ ...statusLineToml.split("\n"),
45
+ ...lines.slice(existingRange.end),
46
+ ];
47
+ return joinTomlLines(nextLines);
48
+ }
49
+ const nextLines = [
50
+ ...lines.slice(0, tuiRange.start + 1),
51
+ ...statusLineToml.split("\n"),
52
+ ...lines.slice(tuiRange.start + 1),
53
+ ];
54
+ return joinTomlLines(nextLines);
55
+ }
56
+ function formatStatusLine() {
57
+ const items = CODEX_HUD_STATUS_LINE_ITEMS.map((item) => ` "${item}",`).join("\n");
58
+ return `status_line = [\n${items}\n]`;
59
+ }
60
+ function findTableRange(lines, tableName) {
61
+ const header = `[${tableName}]`;
62
+ const start = lines.findIndex((line) => line.trim() === header);
63
+ if (start === -1)
64
+ return undefined;
65
+ const nextTable = lines.findIndex((line, index) => index > start && /^\s*\[[^\]]+\]\s*$/.test(line));
66
+ return {
67
+ start,
68
+ end: nextTable === -1 ? lines.length : nextTable,
69
+ };
70
+ }
71
+ function findKeyRange(lines, start, end, key) {
72
+ const keyPattern = new RegExp(`^\\s*${escapeRegExp(key)}\\s*=`);
73
+ const keyStart = lines.findIndex((line, index) => index >= start && index < end && keyPattern.test(line));
74
+ if (keyStart === -1)
75
+ return undefined;
76
+ if (!lines[keyStart].includes("[") || lines[keyStart].includes("]")) {
77
+ return { start: keyStart, end: keyStart + 1 };
78
+ }
79
+ const keyEnd = lines.findIndex((line, index) => index > keyStart && index < end && /^\s*\]/.test(line));
80
+ return { start: keyStart, end: keyEnd === -1 ? end : keyEnd + 1 };
81
+ }
82
+ function joinTomlLines(lines) {
83
+ return `${lines.join("\n").replace(/\n+$/u, "")}\n`;
84
+ }
85
+ async function readOptionalText(filePath) {
86
+ try {
87
+ return await readFile(filePath, "utf8");
88
+ }
89
+ catch {
90
+ return "";
91
+ }
92
+ }
93
+ function escapeRegExp(value) {
94
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
95
+ }
96
+ //# sourceMappingURL=codex-statusline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-statusline.js","sourceRoot":"","sources":["../src/codex-statusline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,MAAM,2BAA2B,GAAG;IACzC,sBAAsB;IACtB,eAAe;IACf,aAAa;IACb,YAAY;IACZ,cAAc;IACd,iBAAiB;IACjB,cAAc;IACd,WAAW;CACH,CAAC;AAQX,MAAM,UAAU,sBAAsB,CAAC,YAAqB,EAAE,UAAkB,EAAE,CAAC,OAAO,EAAE;IAC1F,OAAO,YAAY,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,UAAmB;IAC9D,MAAM,YAAY,GAAG,sBAAsB,CAAC,UAAU,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,YAAY,CAAC,CAAC;IACtD,MAAM,IAAI,GAAG,wBAAwB,CAAC,QAAQ,CAAC,CAAC;IAEhD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,MAAM,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO;QACL,UAAU,EAAE,YAAY;QACxB,OAAO,EAAE,IAAI,KAAK,QAAQ;QAC1B,KAAK,EAAE,2BAA2B;KACnC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,KAAa;IACpD,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;IACpF,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC9C,MAAM,cAAc,GAAG,gBAAgB,EAAE,CAAC;IAE1C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC;QACpC,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,UAAU,cAAc,IAAI,CAAC;IACtE,CAAC;IAED,MAAM,aAAa,GAAG,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,GAAG,CAAC,EAAE,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;IAC3F,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,SAAS,GAAG;YAChB,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,KAAK,CAAC;YACtC,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC;YAC7B,GAAG,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC;SAClC,CAAC;QACF,OAAO,aAAa,CAAC,SAAS,CAAC,CAAC;IAClC,CAAC;IAED,MAAM,SAAS,GAAG;QAChB,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC;QACrC,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC;QAC7B,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC;KACnC,CAAC;IACF,OAAO,aAAa,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,gBAAgB;IACvB,MAAM,KAAK,GAAG,2BAA2B,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnF,OAAO,oBAAoB,KAAK,KAAK,CAAC;AACxC,CAAC;AAED,SAAS,cAAc,CAAC,KAAe,EAAE,SAAiB;IACxD,MAAM,MAAM,GAAG,IAAI,SAAS,GAAG,CAAC;IAChC,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,MAAM,CAAC,CAAC;IAChE,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IAEnC,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,KAAK,IAAI,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACrG,OAAO;QACL,KAAK;QACL,GAAG,EAAE,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;KACjD,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CACnB,KAAe,EACf,KAAa,EACb,GAAW,EACX,GAAW;IAEX,MAAM,UAAU,GAAG,IAAI,MAAM,CAAC,QAAQ,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAChE,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,IAAI,KAAK,IAAI,KAAK,GAAG,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1G,IAAI,QAAQ,KAAK,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IAEtC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACpE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,GAAG,CAAC,EAAE,CAAC;IAChD,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,QAAQ,IAAI,KAAK,GAAG,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACxG,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;AACpE,CAAC;AAED,SAAS,aAAa,CAAC,KAAe;IACpC,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC;AACtD,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,QAAgB;IAC9C,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,KAAK,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AACtD,CAAC"}
@@ -0,0 +1,62 @@
1
+ export type HudLayout = "compact" | "expanded";
2
+ export type HudLanguage = "en" | "zh";
3
+ export type HudElement = "model" | "project" | "tools" | "context" | "usage" | "weekly" | "memory" | "environment" | "agents" | "todos" | "sessionTime";
4
+ export type HudColor = "black" | "red" | "green" | "yellow" | "blue" | "magenta" | "cyan" | "white" | "gray" | "dim" | `#${string}`;
5
+ export interface HudConfig {
6
+ layout: HudLayout;
7
+ lineLayout: HudLayout;
8
+ language: HudLanguage;
9
+ refreshIntervalMs: number;
10
+ pathLevels: 1 | 2 | 3;
11
+ codexHome?: string;
12
+ elementOrder: HudElement[];
13
+ gitStatus: {
14
+ enabled: boolean;
15
+ showDirty: boolean;
16
+ showAheadBehind: boolean;
17
+ showFileStats: boolean;
18
+ };
19
+ display: {
20
+ showModel: boolean;
21
+ showProject: boolean;
22
+ showGit: boolean;
23
+ showContext: boolean;
24
+ showUsage: boolean;
25
+ showWeekly: boolean;
26
+ showTools: boolean;
27
+ showAgents: boolean;
28
+ showTodos: boolean;
29
+ showConfigCounts: boolean;
30
+ showDuration: boolean;
31
+ showMemoryUsage: boolean;
32
+ showSession: boolean;
33
+ };
34
+ colors: {
35
+ barFilled: string;
36
+ barEmpty: string;
37
+ context: HudColor;
38
+ usage: HudColor;
39
+ weekly: HudColor;
40
+ warning: HudColor;
41
+ usageWarning: HudColor;
42
+ critical: HudColor;
43
+ model: HudColor;
44
+ project: HudColor;
45
+ git: HudColor;
46
+ gitBranch: HudColor;
47
+ tools: HudColor;
48
+ todos: HudColor;
49
+ label: HudColor;
50
+ barGood: HudColor;
51
+ barWarning: HudColor;
52
+ barCritical: HudColor;
53
+ custom: HudColor;
54
+ };
55
+ }
56
+ export declare const DEFAULT_CONFIG: HudConfig;
57
+ type JsonObject = Record<string, unknown>;
58
+ export declare function resolveConfigPath(explicitPath?: string, homeDir?: string): string;
59
+ export declare function loadConfig(configPath?: string): Promise<HudConfig>;
60
+ export declare function writeDefaultConfig(configPath?: string): Promise<string>;
61
+ export declare function mergeConfig(input: JsonObject): HudConfig;
62
+ export {};
package/dist/config.js ADDED
@@ -0,0 +1,199 @@
1
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import os from "node:os";
4
+ export const DEFAULT_CONFIG = {
5
+ layout: "expanded",
6
+ lineLayout: "expanded",
7
+ language: "en",
8
+ refreshIntervalMs: 1000,
9
+ pathLevels: 1,
10
+ elementOrder: ["model", "project", "context", "usage", "weekly", "todos", "tools"],
11
+ gitStatus: {
12
+ enabled: true,
13
+ showDirty: true,
14
+ showAheadBehind: true,
15
+ showFileStats: false,
16
+ },
17
+ display: {
18
+ showModel: true,
19
+ showProject: true,
20
+ showGit: true,
21
+ showContext: true,
22
+ showUsage: true,
23
+ showWeekly: true,
24
+ showTools: true,
25
+ showAgents: true,
26
+ showTodos: true,
27
+ showConfigCounts: true,
28
+ showDuration: true,
29
+ showMemoryUsage: true,
30
+ showSession: true,
31
+ },
32
+ colors: {
33
+ barFilled: "█",
34
+ barEmpty: "░",
35
+ context: "yellow",
36
+ usage: "magenta",
37
+ weekly: "magenta",
38
+ warning: "yellow",
39
+ usageWarning: "magenta",
40
+ critical: "red",
41
+ model: "magenta",
42
+ project: "cyan",
43
+ git: "magenta",
44
+ gitBranch: "cyan",
45
+ tools: "cyan",
46
+ todos: "yellow",
47
+ label: "dim",
48
+ barGood: "green",
49
+ barWarning: "yellow",
50
+ barCritical: "red",
51
+ custom: "#FF6600",
52
+ },
53
+ };
54
+ export function resolveConfigPath(explicitPath, homeDir = os.homedir()) {
55
+ return explicitPath ?? path.join(homeDir, ".codex-hud", "config.json");
56
+ }
57
+ export async function loadConfig(configPath) {
58
+ const resolvedPath = resolveConfigPath(configPath);
59
+ try {
60
+ const raw = await readFile(resolvedPath, "utf8");
61
+ const parsed = JSON.parse(raw);
62
+ return mergeConfig(isObject(parsed) ? parsed : {});
63
+ }
64
+ catch {
65
+ return mergeConfig({});
66
+ }
67
+ }
68
+ export async function writeDefaultConfig(configPath) {
69
+ const resolvedPath = resolveConfigPath(configPath);
70
+ await mkdir(path.dirname(resolvedPath), { recursive: true });
71
+ await writeFile(resolvedPath, `${JSON.stringify(DEFAULT_CONFIG, null, 2)}\n`, {
72
+ encoding: "utf8",
73
+ flag: "wx",
74
+ });
75
+ return resolvedPath;
76
+ }
77
+ export function mergeConfig(input) {
78
+ const displayInput = isObject(input.display) ? input.display : {};
79
+ const colorsInput = isObject(input.colors) ? input.colors : {};
80
+ return {
81
+ layout: validLayout(input.lineLayout) ? input.lineLayout : validLayout(input.layout) ? input.layout : DEFAULT_CONFIG.layout,
82
+ lineLayout: validLayout(input.lineLayout) ? input.lineLayout : validLayout(input.layout) ? input.layout : DEFAULT_CONFIG.lineLayout,
83
+ language: input.language === "zh" || input.language === "en" ? input.language : DEFAULT_CONFIG.language,
84
+ refreshIntervalMs: validInterval(input.refreshIntervalMs)
85
+ ? input.refreshIntervalMs
86
+ : DEFAULT_CONFIG.refreshIntervalMs,
87
+ pathLevels: validPathLevels(input.pathLevels)
88
+ ? input.pathLevels
89
+ : DEFAULT_CONFIG.pathLevels,
90
+ codexHome: typeof input.codexHome === "string" && input.codexHome.trim().length > 0
91
+ ? input.codexHome
92
+ : undefined,
93
+ elementOrder: validElementOrder(input.elementOrder) ? input.elementOrder : DEFAULT_CONFIG.elementOrder,
94
+ gitStatus: {
95
+ enabled: boolOrDefault((isObject(input.gitStatus) ? input.gitStatus : {}).enabled, DEFAULT_CONFIG.gitStatus.enabled),
96
+ showDirty: boolOrDefault((isObject(input.gitStatus) ? input.gitStatus : {}).showDirty, DEFAULT_CONFIG.gitStatus.showDirty),
97
+ showAheadBehind: boolOrDefault((isObject(input.gitStatus) ? input.gitStatus : {}).showAheadBehind, DEFAULT_CONFIG.gitStatus.showAheadBehind),
98
+ showFileStats: boolOrDefault((isObject(input.gitStatus) ? input.gitStatus : {}).showFileStats, DEFAULT_CONFIG.gitStatus.showFileStats),
99
+ },
100
+ display: {
101
+ showModel: boolOrDefault(displayInput.showModel ?? displayInput.model, DEFAULT_CONFIG.display.showModel),
102
+ showProject: boolOrDefault(displayInput.showProject, DEFAULT_CONFIG.display.showProject),
103
+ showGit: boolOrDefault(displayInput.showGit ?? displayInput.git, DEFAULT_CONFIG.display.showGit),
104
+ showContext: boolOrDefault(displayInput.showContext ?? displayInput.context, DEFAULT_CONFIG.display.showContext),
105
+ showUsage: boolOrDefault(displayInput.showUsage ?? displayInput.usage, DEFAULT_CONFIG.display.showUsage),
106
+ showWeekly: boolOrDefault(displayInput.showWeekly, DEFAULT_CONFIG.display.showWeekly),
107
+ showTools: boolOrDefault(displayInput.showTools ?? displayInput.tools, DEFAULT_CONFIG.display.showTools),
108
+ showAgents: boolOrDefault(displayInput.showAgents, DEFAULT_CONFIG.display.showAgents),
109
+ showTodos: boolOrDefault(displayInput.showTodos ?? displayInput.todos, DEFAULT_CONFIG.display.showTodos),
110
+ showConfigCounts: boolOrDefault(displayInput.showConfigCounts, DEFAULT_CONFIG.display.showConfigCounts),
111
+ showDuration: boolOrDefault(displayInput.showDuration, DEFAULT_CONFIG.display.showDuration),
112
+ showMemoryUsage: boolOrDefault(displayInput.showMemoryUsage, DEFAULT_CONFIG.display.showMemoryUsage),
113
+ showSession: boolOrDefault(displayInput.showSession ?? displayInput.session, DEFAULT_CONFIG.display.showSession),
114
+ },
115
+ colors: {
116
+ barFilled: validBarChar(colorsInput.barFilled)
117
+ ? colorsInput.barFilled
118
+ : DEFAULT_CONFIG.colors.barFilled,
119
+ barEmpty: validBarChar(colorsInput.barEmpty)
120
+ ? colorsInput.barEmpty
121
+ : DEFAULT_CONFIG.colors.barEmpty,
122
+ context: colorOrDefault(colorsInput.context, DEFAULT_CONFIG.colors.context),
123
+ usage: colorOrDefault(colorsInput.usage, DEFAULT_CONFIG.colors.usage),
124
+ weekly: colorOrDefault(colorsInput.weekly, DEFAULT_CONFIG.colors.weekly),
125
+ warning: colorOrDefault(colorsInput.warning, DEFAULT_CONFIG.colors.warning),
126
+ usageWarning: colorOrDefault(colorsInput.usageWarning, DEFAULT_CONFIG.colors.usageWarning),
127
+ critical: colorOrDefault(colorsInput.critical, DEFAULT_CONFIG.colors.critical),
128
+ model: colorOrDefault(colorsInput.model, DEFAULT_CONFIG.colors.model),
129
+ project: colorOrDefault(colorsInput.project, DEFAULT_CONFIG.colors.project),
130
+ git: colorOrDefault(colorsInput.git, DEFAULT_CONFIG.colors.git),
131
+ gitBranch: colorOrDefault(colorsInput.gitBranch, DEFAULT_CONFIG.colors.gitBranch),
132
+ tools: colorOrDefault(colorsInput.tools, DEFAULT_CONFIG.colors.tools),
133
+ todos: colorOrDefault(colorsInput.todos, DEFAULT_CONFIG.colors.todos),
134
+ label: colorOrDefault(colorsInput.label, DEFAULT_CONFIG.colors.label),
135
+ barGood: colorOrDefault(colorsInput.barGood, DEFAULT_CONFIG.colors.barGood),
136
+ barWarning: colorOrDefault(colorsInput.barWarning, DEFAULT_CONFIG.colors.barWarning),
137
+ barCritical: colorOrDefault(colorsInput.barCritical, DEFAULT_CONFIG.colors.barCritical),
138
+ custom: colorOrDefault(colorsInput.custom, DEFAULT_CONFIG.colors.custom),
139
+ },
140
+ };
141
+ }
142
+ function validLayout(value) {
143
+ return value === "expanded" || value === "compact";
144
+ }
145
+ function isObject(value) {
146
+ return value !== null && typeof value === "object" && !Array.isArray(value);
147
+ }
148
+ function boolOrDefault(value, fallback) {
149
+ return typeof value === "boolean" ? value : fallback;
150
+ }
151
+ function validInterval(value) {
152
+ return typeof value === "number" && Number.isInteger(value) && value >= 100 && value <= 60000;
153
+ }
154
+ function validPathLevels(value) {
155
+ return value === 1 || value === 2 || value === 3;
156
+ }
157
+ function validBarChar(value) {
158
+ return typeof value === "string" && value.length > 0 && value.length <= 4;
159
+ }
160
+ const VALID_ELEMENTS = new Set([
161
+ "model",
162
+ "project",
163
+ "tools",
164
+ "context",
165
+ "usage",
166
+ "weekly",
167
+ "memory",
168
+ "environment",
169
+ "agents",
170
+ "todos",
171
+ "sessionTime",
172
+ ]);
173
+ function validElementOrder(value) {
174
+ return Array.isArray(value)
175
+ && value.length > 0
176
+ && value.every((item) => typeof item === "string" && VALID_ELEMENTS.has(item));
177
+ }
178
+ function colorOrDefault(value, fallback) {
179
+ if (typeof value !== "string")
180
+ return fallback;
181
+ if (isNamedColor(value) || /^#[0-9A-Fa-f]{6}$/.test(value))
182
+ return value;
183
+ return fallback;
184
+ }
185
+ function isNamedColor(value) {
186
+ return [
187
+ "black",
188
+ "red",
189
+ "green",
190
+ "yellow",
191
+ "blue",
192
+ "magenta",
193
+ "cyan",
194
+ "white",
195
+ "gray",
196
+ "dim",
197
+ ].includes(value);
198
+ }
199
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+ import { runCli } from "./cli.js";
3
+ const exitCode = await runCli();
4
+ process.exitCode = exitCode;
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,MAAM,QAAQ,GAAG,MAAM,MAAM,EAAE,CAAC;AAChC,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC"}
@@ -0,0 +1,17 @@
1
+ export interface ProductInstallOptions {
2
+ dryRun: boolean;
3
+ codexSource?: string;
4
+ binDir?: string;
5
+ }
6
+ export interface ProductInstallPlan {
7
+ codexSource: string;
8
+ codexBinary: string;
9
+ shimPath: string;
10
+ commands: string[][];
11
+ }
12
+ export declare function parseInstallArgs(args: string[]): ProductInstallOptions;
13
+ export declare function defaultCodexSource(): string;
14
+ export declare function buildInstallPlan(options: ProductInstallOptions): ProductInstallPlan;
15
+ export type PatchAction = "apply" | "already-applied" | "conflict";
16
+ export declare function patchActionFromChecks(canApply: boolean, canReverseApply: boolean): PatchAction;
17
+ export declare function installProduct(options: ProductInstallOptions): Promise<number>;
@@ -0,0 +1,125 @@
1
+ import { existsSync } from "node:fs";
2
+ import { mkdir } from "node:fs/promises";
3
+ import { spawn } from "node:child_process";
4
+ import os from "node:os";
5
+ import path from "node:path";
6
+ import process from "node:process";
7
+ import { fileURLToPath } from "node:url";
8
+ import { defaultShimBinDir, installCodexShim } from "./native-runner.js";
9
+ import { shellQuote } from "./tmux-runner.js";
10
+ export function parseInstallArgs(args) {
11
+ let dryRun = false;
12
+ let codexSource;
13
+ let binDir;
14
+ for (let index = 0; index < args.length; index += 1) {
15
+ const arg = args[index];
16
+ if (arg === "--dry-run") {
17
+ dryRun = true;
18
+ continue;
19
+ }
20
+ if (arg === "--codex-source" && args[index + 1]) {
21
+ codexSource = args[index + 1];
22
+ index += 1;
23
+ continue;
24
+ }
25
+ if (arg === "--bin-dir" && args[index + 1]) {
26
+ binDir = args[index + 1];
27
+ index += 1;
28
+ }
29
+ }
30
+ return { dryRun, codexSource, binDir };
31
+ }
32
+ export function defaultCodexSource() {
33
+ return path.join(os.homedir(), ".codex-hud", "native", "openai-codex");
34
+ }
35
+ export function buildInstallPlan(options) {
36
+ const codexSource = options.codexSource ?? defaultCodexSource();
37
+ const codexBinary = path.join(codexSource, "codex-rs", "target", "debug", "codex");
38
+ const binDir = options.binDir ?? defaultShimBinDir();
39
+ return {
40
+ codexSource,
41
+ codexBinary,
42
+ shimPath: path.join(binDir, "codex"),
43
+ commands: [
44
+ ["git", "clone", "--depth", "1", "--branch", "rust-v0.131.0", "https://github.com/openai/codex.git", codexSource],
45
+ ["git", "apply", "patches/codex-cli-command-statusline.patch"],
46
+ ["cargo", "build", "-p", "codex-cli"],
47
+ ],
48
+ };
49
+ }
50
+ export function patchActionFromChecks(canApply, canReverseApply) {
51
+ if (canApply)
52
+ return "apply";
53
+ if (canReverseApply)
54
+ return "already-applied";
55
+ return "conflict";
56
+ }
57
+ export async function installProduct(options) {
58
+ const plan = buildInstallPlan(options);
59
+ if (options.dryRun) {
60
+ process.stdout.write(`${installPlanText(plan)}\n`);
61
+ return 0;
62
+ }
63
+ if (!existsSync(plan.codexSource)) {
64
+ await mkdir(path.dirname(plan.codexSource), { recursive: true });
65
+ const code = await spawnInherited(plan.commands[0][0], plan.commands[0].slice(1), process.cwd());
66
+ if (code !== 0)
67
+ return code;
68
+ }
69
+ const patchCode = await applyBundledPatch(plan.codexSource);
70
+ if (patchCode !== 0)
71
+ return patchCode;
72
+ const buildCode = await spawnInherited("cargo", ["build", "-p", "codex-cli"], path.join(plan.codexSource, "codex-rs"));
73
+ if (buildCode !== 0)
74
+ return buildCode;
75
+ const shim = await installCodexShim({ binDir: options.binDir, codexPath: plan.codexBinary });
76
+ const action = shim.changed ? "installed" : "already installed";
77
+ process.stdout.write(`codex-hud: native Codex adapter ready at ${plan.codexBinary}\n`);
78
+ process.stdout.write(`codex-hud: codex shim ${action} at ${shim.path}\n`);
79
+ process.stdout.write("codex-hud: run `codex` to launch Codex with the native HUD.\n");
80
+ return 0;
81
+ }
82
+ function packageRoot() {
83
+ return path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
84
+ }
85
+ async function applyBundledPatch(codexSource) {
86
+ const patchPath = path.join(packageRoot(), "patches", "codex-cli-command-statusline.patch");
87
+ const canApply = (await spawnQuiet("git", ["apply", "--check", patchPath], codexSource)) === 0;
88
+ const canReverseApply = (await spawnQuiet("git", ["apply", "--reverse", "--check", patchPath], codexSource)) === 0;
89
+ const action = patchActionFromChecks(canApply, canReverseApply);
90
+ if (action === "already-applied") {
91
+ process.stdout.write("codex-hud: native Codex patch already applied\n");
92
+ return 0;
93
+ }
94
+ if (action === "conflict") {
95
+ process.stderr.write(`codex-hud: cannot apply native Codex patch in ${codexSource}\n`);
96
+ process.stderr.write("codex-hud: try a clean Codex checkout or pass --codex-source to another directory.\n");
97
+ return 1;
98
+ }
99
+ return await spawnInherited("git", ["apply", patchPath], codexSource);
100
+ }
101
+ function installPlanText(plan) {
102
+ return [
103
+ "codex-hud install plan:",
104
+ ` codex source: ${plan.codexSource}`,
105
+ ` codex binary: ${plan.codexBinary}`,
106
+ ` shim path: ${plan.shimPath}`,
107
+ " commands:",
108
+ ...plan.commands.map((command) => ` ${command.map(shellQuote).join(" ")}`),
109
+ ].join("\n");
110
+ }
111
+ function spawnInherited(command, args, cwd) {
112
+ return new Promise((resolve) => {
113
+ const child = spawn(command, args, { cwd, stdio: "inherit" });
114
+ child.on("error", () => resolve(1));
115
+ child.on("exit", (code) => resolve(code ?? 1));
116
+ });
117
+ }
118
+ function spawnQuiet(command, args, cwd) {
119
+ return new Promise((resolve) => {
120
+ const child = spawn(command, args, { cwd, stdio: "ignore" });
121
+ child.on("error", () => resolve(1));
122
+ child.on("exit", (code) => resolve(code ?? 1));
123
+ });
124
+ }
125
+ //# sourceMappingURL=installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installer.js","sourceRoot":"","sources":["../src/installer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ export interface NativeOptions {
2
+ codexArgs: string[];
3
+ codexPath?: string;
4
+ dryRun: boolean;
5
+ }
6
+ export interface ShimOptions {
7
+ binDir?: string;
8
+ codexPath?: string;
9
+ }
10
+ export interface ShimResult {
11
+ changed: boolean;
12
+ path: string;
13
+ }
14
+ export interface RemoveShimResult {
15
+ path: string;
16
+ removed: boolean;
17
+ }
18
+ export declare function parseNativeArgs(args: string[]): NativeOptions;
19
+ export declare function parseShimArgs(args: string[]): ShimOptions;
20
+ export declare function buildNativeCodexArgs(codexArgs: string[]): string[];
21
+ export declare function resolveNativeCodexPath(explicitPath?: string): string;
22
+ export declare function runNativeCodex(options: NativeOptions): Promise<number>;
23
+ export declare function defaultShimBinDir(): string;
24
+ export declare function buildShimScript(options: {
25
+ codexPath: string;
26
+ }): string;
27
+ export declare function installCodexShim(options?: ShimOptions): Promise<ShimResult>;
28
+ export declare function removeCodexShim(options?: Pick<ShimOptions, "binDir">): Promise<RemoveShimResult>;