@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,122 @@
1
+ import { spawn } from "node:child_process";
2
+ import { chmod, mkdir, readFile, rm, writeFile } from "node:fs/promises";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ import process from "node:process";
6
+ import { shellQuote } from "./tmux-runner.js";
7
+ const HUD_STATUS_LINE_CONFIG = 'tui.status_line=["command: codex-hud status"]';
8
+ const SHIM_MARKER = "codex-hud shim";
9
+ export function parseNativeArgs(args) {
10
+ const separatorIndex = args.indexOf("--");
11
+ const wrapperArgs = separatorIndex === -1 ? args : args.slice(0, separatorIndex);
12
+ const codexArgs = separatorIndex === -1 ? [] : args.slice(separatorIndex + 1);
13
+ let codexPath;
14
+ let dryRun = false;
15
+ for (let index = 0; index < wrapperArgs.length; index += 1) {
16
+ const arg = wrapperArgs[index];
17
+ if (arg === "--dry-run") {
18
+ dryRun = true;
19
+ continue;
20
+ }
21
+ if (arg === "--codex" && wrapperArgs[index + 1]) {
22
+ codexPath = wrapperArgs[index + 1];
23
+ index += 1;
24
+ }
25
+ }
26
+ return { codexArgs, codexPath, dryRun };
27
+ }
28
+ export function parseShimArgs(args) {
29
+ let binDir;
30
+ let codexPath;
31
+ for (let index = 0; index < args.length; index += 1) {
32
+ const arg = args[index];
33
+ if (arg === "--bin-dir" && args[index + 1]) {
34
+ binDir = args[index + 1];
35
+ index += 1;
36
+ continue;
37
+ }
38
+ if (arg === "--codex" && args[index + 1]) {
39
+ codexPath = args[index + 1];
40
+ index += 1;
41
+ }
42
+ }
43
+ return { binDir, codexPath };
44
+ }
45
+ export function buildNativeCodexArgs(codexArgs) {
46
+ return ["-c", HUD_STATUS_LINE_CONFIG, ...codexArgs];
47
+ }
48
+ export function resolveNativeCodexPath(explicitPath) {
49
+ if (explicitPath)
50
+ return explicitPath;
51
+ if (process.env.CODEX_HUD_CODEX_PATH)
52
+ return process.env.CODEX_HUD_CODEX_PATH;
53
+ return path.join(os.homedir(), "Desktop", "Github_repos", "openai-codex", "codex-rs", "target", "debug", "codex");
54
+ }
55
+ export async function runNativeCodex(options) {
56
+ const codexPath = resolveNativeCodexPath(options.codexPath);
57
+ const args = buildNativeCodexArgs(options.codexArgs);
58
+ if (options.dryRun) {
59
+ process.stdout.write(`${[codexPath, ...args].map(shellQuote).join(" ")}\n`);
60
+ return 0;
61
+ }
62
+ return await spawnInherited(codexPath, args, {
63
+ ...process.env,
64
+ CODEX_HUD_FORCE_COLOR: "1",
65
+ });
66
+ }
67
+ export function defaultShimBinDir() {
68
+ return path.join(os.homedir(), ".local", "bin");
69
+ }
70
+ export function buildShimScript(options) {
71
+ return [
72
+ "#!/bin/sh",
73
+ `# ${SHIM_MARKER}`,
74
+ `exec codex-hud native --codex ${shellQuote(options.codexPath)} -- "$@"`,
75
+ "",
76
+ ].join("\n");
77
+ }
78
+ export async function installCodexShim(options = {}) {
79
+ const binDir = options.binDir ?? defaultShimBinDir();
80
+ const shimPath = path.join(binDir, "codex");
81
+ const codexPath = resolveNativeCodexPath(options.codexPath);
82
+ const script = buildShimScript({ codexPath });
83
+ await mkdir(binDir, { recursive: true });
84
+ const existing = await readOptionalFile(shimPath);
85
+ if (existing !== undefined) {
86
+ if (!existing.includes(SHIM_MARKER)) {
87
+ throw new Error(`codex already exists at ${shimPath}`);
88
+ }
89
+ if (existing === script) {
90
+ return { changed: false, path: shimPath };
91
+ }
92
+ }
93
+ await writeFile(shimPath, script, "utf8");
94
+ await chmod(shimPath, 0o755);
95
+ return { changed: true, path: shimPath };
96
+ }
97
+ export async function removeCodexShim(options = {}) {
98
+ const binDir = options.binDir ?? defaultShimBinDir();
99
+ const shimPath = path.join(binDir, "codex");
100
+ const existing = await readOptionalFile(shimPath);
101
+ if (existing === undefined || !existing.includes(SHIM_MARKER)) {
102
+ return { path: shimPath, removed: false };
103
+ }
104
+ await rm(shimPath, { force: true });
105
+ return { path: shimPath, removed: true };
106
+ }
107
+ async function readOptionalFile(filePath) {
108
+ try {
109
+ return await readFile(filePath, "utf8");
110
+ }
111
+ catch {
112
+ return undefined;
113
+ }
114
+ }
115
+ function spawnInherited(command, args, env = process.env) {
116
+ return new Promise((resolve) => {
117
+ const child = spawn(command, args, { env, stdio: "inherit" });
118
+ child.on("error", () => resolve(1));
119
+ child.on("exit", (code) => resolve(code ?? 1));
120
+ });
121
+ }
122
+ //# sourceMappingURL=native-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-runner.js","sourceRoot":"","sources":["../src/native-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { HudConfig } from "./config.js";
2
+ import type { HudSnapshot } from "./types.js";
3
+ export interface RenderOptions {
4
+ color?: boolean;
5
+ terminalWidth?: number;
6
+ }
7
+ export declare function renderHud({ config, options, snapshot, }: {
8
+ config: HudConfig;
9
+ options?: RenderOptions;
10
+ snapshot: HudSnapshot;
11
+ }): string;
package/dist/render.js ADDED
@@ -0,0 +1,149 @@
1
+ export function renderHud({ config, options = {}, snapshot, }) {
2
+ const output = config.layout === "expanded"
3
+ ? renderExpanded(config, snapshot, options)
4
+ : renderCompact(config, snapshot, options);
5
+ return truncateOutput(output, options.terminalWidth);
6
+ }
7
+ function renderCompact(config, snapshot, options) {
8
+ return orderedParts(config, snapshot, options).join(" | ");
9
+ }
10
+ function renderExpanded(config, snapshot, options) {
11
+ const separator = " │ ";
12
+ const identity = orderedParts(config, snapshot, options, ["model", "project"]).join(separator);
13
+ const progress = orderedParts(config, snapshot, options, ["context", "usage", "weekly"]).join(separator);
14
+ const activity = orderedParts(config, snapshot, options, ["todos", "tools", "agents", "memory", "environment", "sessionTime"]).join(separator);
15
+ return [identity, progress, activity].filter(Boolean).join("\n");
16
+ }
17
+ function orderedParts(config, snapshot, options, allowed) {
18
+ const allowedSet = allowed ? new Set(allowed) : undefined;
19
+ return config.elementOrder
20
+ .filter((element) => !allowedSet || allowedSet.has(element))
21
+ .flatMap((element) => elementPart(element, config, snapshot, options));
22
+ }
23
+ function elementPart(element, config, snapshot, options) {
24
+ if (element === "model" && config.display.showModel && snapshot.model) {
25
+ return [styleText(`[${[snapshot.model, snapshot.reasoningEffort].filter(Boolean).join(" ")}]`, config.colors.model, options)];
26
+ }
27
+ if (element === "project" && config.display.showProject) {
28
+ let project = styleText(snapshot.projectName, config.colors.project, options);
29
+ if (config.display.showGit && config.gitStatus.enabled && snapshot.git) {
30
+ const dirty = config.gitStatus.showDirty && snapshot.git.isDirty ? "*" : "";
31
+ const branch = styleText(`${snapshot.git.branch}${dirty}`, config.colors.gitBranch, options);
32
+ let git = `git:(${branch})`;
33
+ if (config.gitStatus.showAheadBehind && (snapshot.git.ahead > 0 || snapshot.git.behind > 0)) {
34
+ git += ` +${snapshot.git.ahead}/-${snapshot.git.behind}`;
35
+ }
36
+ project += ` ${styleText(git, config.colors.git, options)}`;
37
+ }
38
+ return [project];
39
+ }
40
+ if (element === "context" && config.display.showContext && snapshot.context) {
41
+ return [formatProgress(snapshot.context, "context", config, options)];
42
+ }
43
+ if (element === "usage" && config.display.showUsage && snapshot.usage) {
44
+ return [formatProgress(snapshot.usage, "usage", config, options)];
45
+ }
46
+ if (element === "weekly" && config.display.showWeekly && snapshot.weekly) {
47
+ return [formatProgress(snapshot.weekly, "weekly", config, options)];
48
+ }
49
+ if (element === "todos" && config.display.showTodos && snapshot.todos.total > 0) {
50
+ return [styleText(`Todos ${snapshot.todos.completed}/${snapshot.todos.total}`, config.colors.todos, options)];
51
+ }
52
+ if (element === "tools" && config.display.showTools && snapshot.tools.length > 0) {
53
+ return [styleText(snapshot.tools.map(formatTool).join(", "), config.colors.tools, options)];
54
+ }
55
+ return [];
56
+ }
57
+ function formatTool(tool) {
58
+ if (tool.status === "active") {
59
+ return `${tool.name} active`;
60
+ }
61
+ if (tool.count && tool.count > 1) {
62
+ return `${tool.name} x${tool.count}`;
63
+ }
64
+ return tool.name;
65
+ }
66
+ function clampPercent(value) {
67
+ if (!Number.isFinite(value))
68
+ return 0;
69
+ return Math.min(100, Math.max(0, Math.round(value)));
70
+ }
71
+ function formatProgress(progress, kind, config, options) {
72
+ const percent = clampPercent(progress.percent);
73
+ const width = 10;
74
+ const filled = Math.round((percent / 100) * width);
75
+ const empty = width - filled;
76
+ const bar = `${config.colors.barFilled.repeat(filled)}${config.colors.barEmpty.repeat(empty)}`;
77
+ const label = kind === "usage" && progress.windowMinutes ? "Usage" : progress.label;
78
+ const windowText = kind === "usage" && progress.windowMinutes
79
+ ? ` (${formatConsumedWindow(percent, progress.windowMinutes)} / ${progress.label})`
80
+ : "";
81
+ const labelColor = config.colors[kind];
82
+ return `${styleText(label, labelColor, options)} ${colorizeBar(bar, percent, config, options)} ${colorizeBar(`${percent}%`, percent, config, options)}${windowText}`;
83
+ }
84
+ function formatConsumedWindow(percent, windowMinutes) {
85
+ return formatDurationMinutes(Math.round((percent / 100) * windowMinutes));
86
+ }
87
+ function formatDurationMinutes(minutes) {
88
+ if (minutes < 60)
89
+ return `${minutes}m`;
90
+ const hours = Math.floor(minutes / 60);
91
+ const remainder = minutes % 60;
92
+ return remainder === 0 ? `${hours}h` : `${hours}h ${remainder}m`;
93
+ }
94
+ function colorizeBar(value, percent, config, options) {
95
+ if (!options.color)
96
+ return value;
97
+ const color = percent >= 85
98
+ ? config.colors.barCritical
99
+ : percent >= 70
100
+ ? config.colors.barWarning
101
+ : config.colors.barGood;
102
+ return styleText(value, color, options);
103
+ }
104
+ function styleText(value, color, options) {
105
+ if (!options.color)
106
+ return value;
107
+ const open = ansiOpen(color);
108
+ return open ? `${open}${value}\x1b[0m` : value;
109
+ }
110
+ function ansiOpen(color) {
111
+ const named = {
112
+ black: "\x1b[30m",
113
+ red: "\x1b[31m",
114
+ green: "\x1b[32m",
115
+ yellow: "\x1b[33m",
116
+ blue: "\x1b[34m",
117
+ magenta: "\x1b[35m",
118
+ cyan: "\x1b[36m",
119
+ white: "\x1b[37m",
120
+ gray: "\x1b[90m",
121
+ dim: "\x1b[2m",
122
+ };
123
+ if (named[color])
124
+ return named[color];
125
+ const match = /^#([0-9A-Fa-f]{6})$/.exec(color);
126
+ if (!match)
127
+ return undefined;
128
+ const hex = match[1];
129
+ const r = Number.parseInt(hex.slice(0, 2), 16);
130
+ const g = Number.parseInt(hex.slice(2, 4), 16);
131
+ const b = Number.parseInt(hex.slice(4, 6), 16);
132
+ return `\x1b[38;2;${r};${g};${b}m`;
133
+ }
134
+ function truncateOutput(output, terminalWidth) {
135
+ if (!terminalWidth || terminalWidth <= 0)
136
+ return output;
137
+ return output
138
+ .split("\n")
139
+ .map((line) => truncateLine(line, terminalWidth))
140
+ .join("\n");
141
+ }
142
+ function truncateLine(line, terminalWidth) {
143
+ if (line.length <= terminalWidth)
144
+ return line;
145
+ if (terminalWidth <= 3)
146
+ return ".".repeat(terminalWidth);
147
+ return `${line.slice(0, terminalWidth - 3)}...`;
148
+ }
149
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAQA,MAAM,UAAU,SAAS,CAAC,EACxB,MAAM,EACN,OAAO,GAAG,EAAE,EACZ,QAAQ,GAKT;IACC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,KAAK,UAAU;QACzC,CAAC,CAAC,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC;QAC3C,CAAC,CAAC,aAAa,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC7C,OAAO,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,aAAa,CAAC,MAAiB,EAAE,QAAqB,EAAE,OAAsB;IACrF,OAAO,YAAY,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC7D,CAAC;AAED,SAAS,cAAc,CAAC,MAAiB,EAAE,QAAqB,EAAE,OAAsB;IACtF,MAAM,SAAS,GAAG,KAAK,CAAC;IACxB,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/F,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACzG,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAE/I,OAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACnE,CAAC;AAED,SAAS,YAAY,CACnB,MAAiB,EACjB,QAAqB,EACrB,OAAsB,EACtB,OAAsB;IAEtB,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1D,OAAO,MAAM,CAAC,YAAY;SACvB,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,UAAU,IAAI,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;SAC3D,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,WAAW,CAClB,OAAmB,EACnB,MAAiB,EACjB,QAAqB,EACrB,OAAsB;IAEtB,IAAI,OAAO,KAAK,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QACtE,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IAChI,CAAC;IAED,IAAI,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QACxD,IAAI,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC9E,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC,SAAS,CAAC,OAAO,IAAI,QAAQ,CAAC,GAAG,EAAE,CAAC;YACvE,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,SAAS,IAAI,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5E,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,GAAG,KAAK,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAC7F,IAAI,GAAG,GAAG,QAAQ,MAAM,GAAG,CAAC;YAC5B,IAAI,MAAM,CAAC,SAAS,CAAC,eAAe,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;gBAC5F,GAAG,IAAI,KAAK,QAAQ,CAAC,GAAG,CAAC,KAAK,KAAK,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YAC3D,CAAC;YACD,OAAO,IAAI,IAAI,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,CAAC;QAC9D,CAAC;QACD,OAAO,CAAC,OAAO,CAAC,CAAC;IACnB,CAAC;IAED,IAAI,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QAC5E,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACxE,CAAC;IACD,IAAI,OAAO,KAAK,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QACtE,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACpE,CAAC;IACD,IAAI,OAAO,KAAK,QAAQ,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;QACzE,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,OAAO,KAAK,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,IAAI,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;QAChF,OAAO,CAAC,SAAS,CAAC,SAAS,QAAQ,CAAC,KAAK,CAAC,SAAS,IAAI,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IAChH,CAAC;IACD,IAAI,OAAO,KAAK,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjF,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IAC9F,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,UAAU,CAAC,IAAkB;IACpC,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,GAAG,IAAI,CAAC,IAAI,SAAS,CAAC;IAC/B,CAAC;IACD,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;QACjC,OAAO,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;IACvC,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC;AACnB,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACtC,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,cAAc,CACrB,QAA0B,EAC1B,IAAoC,EACpC,MAAiB,EACjB,OAAsB;IAEtB,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,EAAE,CAAC;IACjB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;IAC7B,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;IAC/F,MAAM,KAAK,GAAG,IAAI,KAAK,OAAO,IAAI,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;IACpF,MAAM,UAAU,GAAG,IAAI,KAAK,OAAO,IAAI,QAAQ,CAAC,aAAa;QAC3D,CAAC,CAAC,KAAK,oBAAoB,CAAC,OAAO,EAAE,QAAQ,CAAC,aAAa,CAAC,MAAM,QAAQ,CAAC,KAAK,GAAG;QACnF,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACvC,OAAO,GAAG,SAAS,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,CAAC,IAAI,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,WAAW,CAAC,GAAG,OAAO,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,UAAU,EAAE,CAAC;AACvK,CAAC;AAED,SAAS,oBAAoB,CAAC,OAAe,EAAE,aAAqB;IAClE,OAAO,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,GAAG,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC;AAC5E,CAAC;AAED,SAAS,qBAAqB,CAAC,OAAe;IAC5C,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,GAAG,OAAO,GAAG,CAAC;IACvC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,OAAO,GAAG,EAAE,CAAC;IAC/B,OAAO,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,KAAK,SAAS,GAAG,CAAC;AACnE,CAAC;AAED,SAAS,WAAW,CAAC,KAAa,EAAE,OAAe,EAAE,MAAiB,EAAE,OAAsB;IAC5F,IAAI,CAAC,OAAO,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACjC,MAAM,KAAK,GAAG,OAAO,IAAI,EAAE;QACzB,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW;QAC3B,CAAC,CAAC,OAAO,IAAI,EAAE;YACb,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU;YAC1B,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;IAC5B,OAAO,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,SAAS,CAAC,KAAa,EAAE,KAAe,EAAE,OAAsB;IACvE,IAAI,CAAC,OAAO,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACjC,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC7B,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;AACjD,CAAC;AAED,SAAS,QAAQ,CAAC,KAAe;IAC/B,MAAM,KAAK,GAA2B;QACpC,KAAK,EAAE,UAAU;QACjB,GAAG,EAAE,UAAU;QACf,KAAK,EAAE,UAAU;QACjB,MAAM,EAAE,UAAU;QAClB,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,UAAU;QACnB,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,UAAU;QACjB,IAAI,EAAE,UAAU;QAChB,GAAG,EAAE,SAAS;KACf,CAAC;IACF,IAAI,KAAK,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,KAAK,GAAG,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChD,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACrB,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/C,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/C,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/C,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;AACrC,CAAC;AAED,SAAS,cAAc,CAAC,MAAc,EAAE,aAAiC;IACvE,IAAI,CAAC,aAAa,IAAI,aAAa,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC;IACxD,OAAO,MAAM;SACV,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;SAChD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,SAAS,YAAY,CAAC,IAAY,EAAE,aAAqB;IACvD,IAAI,IAAI,CAAC,MAAM,IAAI,aAAa;QAAE,OAAO,IAAI,CAAC;IAC9C,IAAI,aAAa,IAAI,CAAC;QAAE,OAAO,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IACzD,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC;AAClD,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { HudConfig } from "./config.js";
2
+ import type { CodexInfo } from "./sources/codex.js";
3
+ import type { GitSnapshot, HudSnapshot } from "./types.js";
4
+ import { type SessionSignals } from "./sources/session.js";
5
+ export interface CreateHudSnapshotOptions {
6
+ cwd?: string;
7
+ config: HudConfig;
8
+ codexInfo?: Partial<CodexInfo>;
9
+ git?: GitSnapshot;
10
+ sessionSignals?: SessionSignals;
11
+ }
12
+ export declare function createHudSnapshot(options: CreateHudSnapshotOptions): Promise<HudSnapshot>;
@@ -0,0 +1,32 @@
1
+ import path from "node:path";
2
+ import { readCodexInfo } from "./sources/codex.js";
3
+ import { readGitSnapshot } from "./sources/git.js";
4
+ import { readLatestSessionSignals } from "./sources/session.js";
5
+ export async function createHudSnapshot(options) {
6
+ const cwd = options.cwd ?? process.cwd();
7
+ const [codexInfo, git] = await Promise.all([
8
+ options.codexInfo ? Promise.resolve(options.codexInfo) : readCodexInfo(options.config),
9
+ options.git ? Promise.resolve(options.git) : readGitSnapshot(cwd),
10
+ ]);
11
+ const sessionSignals = options.sessionSignals
12
+ ?? await readLatestSessionSignals(codexInfo.codexHome ?? options.config.codexHome ?? "", cwd);
13
+ return {
14
+ model: codexInfo.model,
15
+ reasoningEffort: codexInfo.reasoningEffort,
16
+ cwd,
17
+ projectName: projectName(cwd, options.config.pathLevels),
18
+ git,
19
+ context: sessionSignals.context,
20
+ usage: sessionSignals.usage,
21
+ weekly: sessionSignals.weekly,
22
+ tools: sessionSignals.tools,
23
+ todos: sessionSignals.todos,
24
+ warnings: [],
25
+ };
26
+ }
27
+ function projectName(cwd, pathLevels) {
28
+ const normalized = path.resolve(cwd);
29
+ const parts = normalized.split(path.sep).filter(Boolean);
30
+ return parts.slice(-pathLevels).join("/") || path.parse(normalized).root;
31
+ }
32
+ //# sourceMappingURL=snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../src/snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,wBAAwB,EAAuB,MAAM,sBAAsB,CAAC;AAUrF,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAiC;IACvE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACzC,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACzC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC;QACtF,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC;KAClE,CAAC,CAAC;IACH,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc;WACxC,MAAM,wBAAwB,CAAC,SAAS,CAAC,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC;IAEhG,OAAO;QACL,KAAK,EAAE,SAAS,CAAC,KAAK;QACtB,eAAe,EAAE,SAAS,CAAC,eAAe;QAC1C,GAAG;QACH,WAAW,EAAE,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC;QACxD,GAAG;QACH,OAAO,EAAE,cAAc,CAAC,OAAO;QAC/B,KAAK,EAAE,cAAc,CAAC,KAAK;QAC3B,MAAM,EAAE,cAAc,CAAC,MAAM;QAC7B,KAAK,EAAE,cAAc,CAAC,KAAK;QAC3B,KAAK,EAAE,cAAc,CAAC,KAAK;QAC3B,QAAQ,EAAE,EAAE;KACb,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,GAAW,EAAE,UAAkB;IAClD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACzD,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC;AAC3E,CAAC"}
@@ -0,0 +1,50 @@
1
+ import type { HudConfig } from "../config.js";
2
+ export interface CodexInfo {
3
+ model?: string;
4
+ reasoningEffort?: string;
5
+ version?: string;
6
+ codexPath?: string;
7
+ codexHome: string;
8
+ }
9
+ export interface DoctorReport {
10
+ ok: boolean;
11
+ codexCli: {
12
+ found: boolean;
13
+ path?: string;
14
+ version?: string;
15
+ };
16
+ codexHud: {
17
+ found: boolean;
18
+ path?: string;
19
+ };
20
+ codexShim: {
21
+ installed: boolean;
22
+ path: string;
23
+ };
24
+ patchedCodex: {
25
+ found: boolean;
26
+ path: string;
27
+ };
28
+ nativeStatusCommand: {
29
+ configured: boolean;
30
+ };
31
+ codexHome: string;
32
+ lines: string[];
33
+ }
34
+ export interface DoctorDeps {
35
+ resolveCodexPath?: () => Promise<string | undefined>;
36
+ readCodexVersion?: () => Promise<string | undefined>;
37
+ resolveCodexHudPath?: () => Promise<string | undefined>;
38
+ codexHome?: string;
39
+ shimPath?: string;
40
+ readTextFile?: (target: string) => Promise<string | undefined>;
41
+ pathExists?: (target: string) => Promise<boolean>;
42
+ }
43
+ export declare function getCodexHome(config?: HudConfig): string;
44
+ export declare function readCodexInfo(config?: HudConfig): Promise<CodexInfo>;
45
+ export declare function resolveCodexPath(): Promise<string | undefined>;
46
+ export declare function resolveCodexHudPath(): Promise<string | undefined>;
47
+ export declare function readCodexVersion(): Promise<string | undefined>;
48
+ export declare function parseCodexVersion(output: string): string | undefined;
49
+ export declare function parseCodexConfigText(text: string): Pick<CodexInfo, "model" | "reasoningEffort">;
50
+ export declare function createDoctorReport(deps?: DoctorDeps): Promise<DoctorReport>;
@@ -0,0 +1,182 @@
1
+ import { execFile } from "node:child_process";
2
+ import { access, readFile } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import os from "node:os";
5
+ import { promisify } from "node:util";
6
+ import { defaultShimBinDir, resolveNativeCodexPath } from "../native-runner.js";
7
+ const execFileAsync = promisify(execFile);
8
+ export function getCodexHome(config) {
9
+ return config?.codexHome ?? process.env.CODEX_HOME ?? path.join(os.homedir(), ".codex");
10
+ }
11
+ export async function readCodexInfo(config) {
12
+ const codexHome = getCodexHome(config);
13
+ const [codexPath, version, configText] = await Promise.all([
14
+ resolveCodexPath(),
15
+ readCodexVersion(),
16
+ readCodexConfigText(codexHome),
17
+ ]);
18
+ const parsedConfig = parseCodexConfigText(configText ?? "");
19
+ return {
20
+ ...parsedConfig,
21
+ version,
22
+ codexPath,
23
+ codexHome,
24
+ };
25
+ }
26
+ export async function resolveCodexPath() {
27
+ try {
28
+ const { stdout } = await execFileAsync("sh", ["-c", "command -v codex"], {
29
+ timeout: 1000,
30
+ encoding: "utf8",
31
+ });
32
+ return stdout.trim() || undefined;
33
+ }
34
+ catch {
35
+ return undefined;
36
+ }
37
+ }
38
+ export async function resolveCodexHudPath() {
39
+ try {
40
+ const { stdout } = await execFileAsync("sh", ["-c", "command -v codex-hud"], {
41
+ timeout: 1000,
42
+ encoding: "utf8",
43
+ });
44
+ return stdout.trim() || undefined;
45
+ }
46
+ catch {
47
+ return undefined;
48
+ }
49
+ }
50
+ export async function readCodexVersion() {
51
+ try {
52
+ const { stdout } = await execFileAsync("codex", ["--version"], {
53
+ timeout: 1000,
54
+ encoding: "utf8",
55
+ });
56
+ return parseCodexVersion(stdout);
57
+ }
58
+ catch {
59
+ return undefined;
60
+ }
61
+ }
62
+ export function parseCodexVersion(output) {
63
+ const match = output.match(/codex-cli\s+([0-9]+(?:\.[0-9]+){1,3}(?:[-+][^\s]+)?)/);
64
+ return match?.[1];
65
+ }
66
+ export function parseCodexConfigText(text) {
67
+ return {
68
+ model: parseTomlString(text, "model"),
69
+ reasoningEffort: parseTomlString(text, "model_reasoning_effort"),
70
+ };
71
+ }
72
+ export async function createDoctorReport(deps = {}) {
73
+ const codexHome = deps.codexHome ?? getCodexHome();
74
+ const codexPath = await (deps.resolveCodexPath ?? resolveCodexPath)();
75
+ const codexHudPath = await (deps.resolveCodexHudPath ?? resolveCodexHudPath)();
76
+ const version = codexPath ? await (deps.readCodexVersion ?? readCodexVersion)() : undefined;
77
+ const exists = deps.pathExists ?? pathExists;
78
+ const homeExists = await exists(codexHome);
79
+ const shimPath = deps.shimPath ?? path.join(defaultShimBinDir(), "codex");
80
+ const shimText = await (deps.readTextFile ?? readOptionalText)(shimPath);
81
+ const shimInstalled = Boolean(shimText?.includes("codex-hud shim"));
82
+ const patchedCodexPath = parseShimCodexPath(shimText) ?? resolveNativeCodexPath();
83
+ const patchedCodexFound = await exists(patchedCodexPath);
84
+ const nativeStatusCommandConfigured = Boolean(shimText?.includes("codex-hud native"));
85
+ const lines = [];
86
+ if (codexPath) {
87
+ lines.push(`Codex CLI: ${version ?? "found"} (${codexPath})`);
88
+ }
89
+ else {
90
+ lines.push("Codex CLI: not found");
91
+ }
92
+ if (codexHudPath) {
93
+ lines.push(`codex-hud binary found (${codexHudPath})`);
94
+ }
95
+ else {
96
+ lines.push("codex-hud binary: not found");
97
+ }
98
+ if (shimInstalled) {
99
+ lines.push(`codex shim installed at ${shimPath}`);
100
+ }
101
+ else {
102
+ lines.push(`codex shim: not installed at ${shimPath}`);
103
+ }
104
+ if (patchedCodexFound) {
105
+ lines.push(`patched Codex found at ${patchedCodexPath}`);
106
+ }
107
+ else {
108
+ lines.push(`patched Codex: not found at ${patchedCodexPath}`);
109
+ }
110
+ if (nativeStatusCommandConfigured) {
111
+ lines.push("native status command configured");
112
+ }
113
+ else {
114
+ lines.push("native status command: not configured");
115
+ }
116
+ lines.push(`Codex home: ${homeExists ? codexHome : `${codexHome} (missing)`}`);
117
+ lines.push(`Node.js: ${process.version}`);
118
+ return {
119
+ ok: Boolean(codexPath),
120
+ codexCli: {
121
+ found: Boolean(codexPath),
122
+ path: codexPath,
123
+ version,
124
+ },
125
+ codexHud: {
126
+ found: Boolean(codexHudPath),
127
+ path: codexHudPath,
128
+ },
129
+ codexShim: {
130
+ installed: shimInstalled,
131
+ path: shimPath,
132
+ },
133
+ patchedCodex: {
134
+ found: patchedCodexFound,
135
+ path: patchedCodexPath,
136
+ },
137
+ nativeStatusCommand: {
138
+ configured: nativeStatusCommandConfigured,
139
+ },
140
+ codexHome,
141
+ lines,
142
+ };
143
+ }
144
+ async function readOptionalText(target) {
145
+ try {
146
+ return await readFile(target, "utf8");
147
+ }
148
+ catch {
149
+ return undefined;
150
+ }
151
+ }
152
+ function parseShimCodexPath(text) {
153
+ if (!text)
154
+ return undefined;
155
+ const match = text.match(/--codex\s+(?:"([^"]+)"|'([^']+)'|([^\s]+))/);
156
+ return match?.[1] ?? match?.[2] ?? match?.[3];
157
+ }
158
+ async function readCodexConfigText(codexHome) {
159
+ try {
160
+ return await readFile(path.join(codexHome, "config.toml"), "utf8");
161
+ }
162
+ catch {
163
+ return undefined;
164
+ }
165
+ }
166
+ function parseTomlString(text, key) {
167
+ const pattern = new RegExp(`^\\s*${escapeRegExp(key)}\\s*=\\s*"([^"]+)"\\s*$`, "m");
168
+ return text.match(pattern)?.[1];
169
+ }
170
+ function escapeRegExp(value) {
171
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
172
+ }
173
+ async function pathExists(value) {
174
+ try {
175
+ await access(value);
176
+ return true;
177
+ }
178
+ catch {
179
+ return false;
180
+ }
181
+ }
182
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/sources/codex.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { GitSnapshot } from "../types.js";
2
+ export declare function readGitSnapshot(cwd: string): Promise<GitSnapshot | undefined>;
@@ -0,0 +1,37 @@
1
+ import { execFile } from "node:child_process";
2
+ import { promisify } from "node:util";
3
+ const execFileAsync = promisify(execFile);
4
+ export async function readGitSnapshot(cwd) {
5
+ try {
6
+ const [{ stdout: branchOut }, status] = await Promise.all([
7
+ execFileAsync("git", ["rev-parse", "--abbrev-ref", "HEAD"], {
8
+ cwd,
9
+ timeout: 1000,
10
+ encoding: "utf8",
11
+ }),
12
+ readDirty(cwd),
13
+ ]);
14
+ const branch = branchOut.trim();
15
+ if (!branch)
16
+ return undefined;
17
+ return {
18
+ branch,
19
+ isDirty: status,
20
+ ahead: 0,
21
+ behind: 0,
22
+ };
23
+ }
24
+ catch {
25
+ return undefined;
26
+ }
27
+ }
28
+ async function readDirty(cwd) {
29
+ try {
30
+ const { stdout } = await execFileAsync("git", ["--no-optional-locks", "status", "--porcelain"], { cwd, timeout: 1000, encoding: "utf8" });
31
+ return stdout.trim().length > 0;
32
+ }
33
+ catch {
34
+ return false;
35
+ }
36
+ }
37
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/sources/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGtC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAW;IAC/C,IAAI,CAAC;QACH,MAAM,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACxD,aAAa,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE;gBAC1D,GAAG;gBACH,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,MAAM;aACjB,CAAC;YACF,SAAS,CAAC,GAAG,CAAC;SACf,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;QAChC,IAAI,CAAC,MAAM;YAAE,OAAO,SAAS,CAAC;QAC9B,OAAO;YACL,MAAM;YACN,OAAO,EAAE,MAAM;YACf,KAAK,EAAE,CAAC;YACR,MAAM,EAAE,CAAC;SACV,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,GAAW;IAClC,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CACpC,KAAK,EACL,CAAC,qBAAqB,EAAE,QAAQ,EAAE,aAAa,CAAC,EAChD,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CACzC,CAAC;QACF,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}