codex-mirror 0.1.1

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 (48) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +154 -0
  3. package/dist/cli.d.ts +2 -0
  4. package/dist/cli.js +244 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/core/clone-manager.d.ts +21 -0
  7. package/dist/core/clone-manager.js +229 -0
  8. package/dist/core/clone-manager.js.map +1 -0
  9. package/dist/core/clone-name.d.ts +8 -0
  10. package/dist/core/clone-name.js +93 -0
  11. package/dist/core/clone-name.js.map +1 -0
  12. package/dist/core/context.d.ts +6 -0
  13. package/dist/core/context.js +12 -0
  14. package/dist/core/context.js.map +1 -0
  15. package/dist/core/doctor.d.ts +10 -0
  16. package/dist/core/doctor.js +102 -0
  17. package/dist/core/doctor.js.map +1 -0
  18. package/dist/core/launcher.d.ts +7 -0
  19. package/dist/core/launcher.js +36 -0
  20. package/dist/core/launcher.js.map +1 -0
  21. package/dist/core/registry.d.ts +19 -0
  22. package/dist/core/registry.js +134 -0
  23. package/dist/core/registry.js.map +1 -0
  24. package/dist/core/runtime-cloner.d.ts +10 -0
  25. package/dist/core/runtime-cloner.js +74 -0
  26. package/dist/core/runtime-cloner.js.map +1 -0
  27. package/dist/core/wrapper-manager.d.ts +15 -0
  28. package/dist/core/wrapper-manager.js +56 -0
  29. package/dist/core/wrapper-manager.js.map +1 -0
  30. package/dist/tui/index.d.ts +12 -0
  31. package/dist/tui/index.js +512 -0
  32. package/dist/tui/index.js.map +1 -0
  33. package/dist/tui/menu.d.ts +71 -0
  34. package/dist/tui/menu.js +487 -0
  35. package/dist/tui/menu.js.map +1 -0
  36. package/dist/types.d.ts +43 -0
  37. package/dist/types.js +2 -0
  38. package/dist/types.js.map +1 -0
  39. package/dist/utils/fs.d.ts +9 -0
  40. package/dist/utils/fs.js +53 -0
  41. package/dist/utils/fs.js.map +1 -0
  42. package/dist/utils/logger.d.ts +9 -0
  43. package/dist/utils/logger.js +22 -0
  44. package/dist/utils/logger.js.map +1 -0
  45. package/dist/utils/process.d.ts +20 -0
  46. package/dist/utils/process.js +90 -0
  47. package/dist/utils/process.js.map +1 -0
  48. package/package.json +50 -0
@@ -0,0 +1,20 @@
1
+ export interface RunResult {
2
+ code: number;
3
+ signal: NodeJS.Signals | null;
4
+ }
5
+ export interface CaptureResult {
6
+ code: number;
7
+ stdout: string;
8
+ stderr: string;
9
+ timedOut: boolean;
10
+ }
11
+ export declare function runInteractive(command: string, args: string[], env?: NodeJS.ProcessEnv, cwd?: string): Promise<RunResult>;
12
+ interface SyncCaptureResult {
13
+ code: number;
14
+ stdout: string;
15
+ stderr: string;
16
+ }
17
+ export declare function runCapture(command: string, args: string[], env?: NodeJS.ProcessEnv, cwd?: string, timeoutMs?: number): Promise<CaptureResult>;
18
+ export declare function runCaptureSync(command: string, args: string[], env?: NodeJS.ProcessEnv, cwd?: string): SyncCaptureResult;
19
+ export declare function findCommand(command: string): string | null;
20
+ export {};
@@ -0,0 +1,90 @@
1
+ import { spawn, spawnSync } from "node:child_process";
2
+ export function runInteractive(command, args, env, cwd) {
3
+ return new Promise((resolve, reject) => {
4
+ const child = spawn(command, args, {
5
+ stdio: "inherit",
6
+ env,
7
+ cwd,
8
+ });
9
+ child.on("error", reject);
10
+ child.on("exit", (code, signal) => {
11
+ resolve({ code: code ?? 1, signal: signal ?? null });
12
+ });
13
+ });
14
+ }
15
+ export async function runCapture(command, args, env, cwd, timeoutMs = 10_000) {
16
+ return new Promise((resolve, reject) => {
17
+ const child = spawn(command, args, {
18
+ stdio: ["ignore", "pipe", "pipe"],
19
+ env,
20
+ cwd,
21
+ });
22
+ let stdout = "";
23
+ let stderr = "";
24
+ let timedOut = false;
25
+ const maxBytes = 1024 * 1024;
26
+ const timeout = timeoutMs > 0
27
+ ? setTimeout(() => {
28
+ timedOut = true;
29
+ child.kill("SIGTERM");
30
+ setTimeout(() => child.kill("SIGKILL"), 300).unref();
31
+ }, timeoutMs)
32
+ : undefined;
33
+ child.stdout?.on("data", (chunk) => {
34
+ stdout = appendWithLimit(stdout, chunk, maxBytes);
35
+ });
36
+ child.stderr?.on("data", (chunk) => {
37
+ stderr = appendWithLimit(stderr, chunk, maxBytes);
38
+ });
39
+ child.on("error", (error) => {
40
+ if (timeout) {
41
+ clearTimeout(timeout);
42
+ }
43
+ reject(error);
44
+ });
45
+ child.on("close", (code) => {
46
+ if (timeout) {
47
+ clearTimeout(timeout);
48
+ }
49
+ resolve({
50
+ code: code ?? 1,
51
+ stdout,
52
+ stderr,
53
+ timedOut,
54
+ });
55
+ });
56
+ });
57
+ }
58
+ export function runCaptureSync(command, args, env, cwd) {
59
+ const result = spawnSync(command, args, {
60
+ encoding: "utf8",
61
+ env,
62
+ cwd,
63
+ });
64
+ return {
65
+ code: result.status ?? 1,
66
+ stdout: result.stdout ?? "",
67
+ stderr: result.stderr ?? "",
68
+ };
69
+ }
70
+ export function findCommand(command) {
71
+ const lookup = process.platform === "win32" ? "where" : "which";
72
+ const result = runCaptureSync(lookup, [command], process.env);
73
+ if (result.code !== 0) {
74
+ return null;
75
+ }
76
+ const found = result.stdout
77
+ .split(/\r?\n/)
78
+ .map((line) => line.trim())
79
+ .find((line) => line.length > 0);
80
+ return found ?? null;
81
+ }
82
+ function appendWithLimit(existing, chunk, limit) {
83
+ const text = typeof chunk === "string" ? chunk : chunk.toString("utf8");
84
+ const combined = existing + text;
85
+ if (combined.length <= limit) {
86
+ return combined;
87
+ }
88
+ return combined.slice(combined.length - limit);
89
+ }
90
+ //# sourceMappingURL=process.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/utils/process.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "codex-mirror",
3
+ "version": "0.1.1",
4
+ "description": "Local multi-account manager for Codex CLI with isolated runtime/auth state and TUI clone management.",
5
+ "type": "module",
6
+ "files": [
7
+ "dist",
8
+ "README.md",
9
+ "LICENSE"
10
+ ],
11
+ "bin": {
12
+ "codex-mirror": "dist/cli.js"
13
+ },
14
+ "scripts": {
15
+ "build": "tsc -p tsconfig.json",
16
+ "typecheck": "tsc -p tsconfig.test.json",
17
+ "test": "vitest run",
18
+ "check": "npm run typecheck && npm run test && npm run build",
19
+ "dev": "tsx src/cli.ts",
20
+ "prepack": "npm run build",
21
+ "prepublishOnly": "npm run check"
22
+ },
23
+ "keywords": [
24
+ "codex",
25
+ "cli",
26
+ "mirror"
27
+ ],
28
+ "repository": {
29
+ "type": "git",
30
+ "url": "https://github.com/Mohit-Patil/codex-mirror"
31
+ },
32
+ "bugs": {
33
+ "url": "https://github.com/Mohit-Patil/codex-mirror/issues"
34
+ },
35
+ "homepage": "https://github.com/Mohit-Patil/codex-mirror",
36
+ "license": "MIT",
37
+ "engines": {
38
+ "node": ">=20"
39
+ },
40
+ "dependencies": {
41
+ "@inquirer/prompts": "^8.2.1",
42
+ "commander": "^14.0.1"
43
+ },
44
+ "devDependencies": {
45
+ "@types/node": "^25.2.3",
46
+ "tsx": "^4.20.4",
47
+ "typescript": "^5.9.2",
48
+ "vitest": "^4.0.18"
49
+ }
50
+ }