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
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 codex-mirror contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,154 @@
1
+ # codex-mirror
2
+
3
+ `codex-mirror` is a local multi-account manager for Codex.
4
+ It creates centrally stored clones, each with isolated runtime and isolated auth/session/config state.
5
+
6
+ This project currently targets **official Codex only** (Phase 1). Multi-provider support is planned for Phase 2.
7
+
8
+ > Unofficial community tool. Not affiliated with OpenAI.
9
+
10
+ ## What you get
11
+
12
+ - Screen-based TUI (`codex-mirror`) with clone lifecycle management
13
+ - Centralized clone storage under one global home
14
+ - Per-clone runtime pinning (copied from currently installed Codex)
15
+ - Per-clone isolated `HOME` and XDG directories
16
+ - Wrapper command per clone name
17
+ - Built-in diagnostics (`doctor`) for runtime/wrapper/writable/auth checks
18
+ - Safety protections:
19
+ - Strict clone-name validation
20
+ - Wrapper path confinement (no path traversal)
21
+ - Registry lock + atomic writes
22
+ - Transactional clone create/update/remove with rollback
23
+
24
+ ## Requirements
25
+
26
+ - macOS/Linux (Node.js 20+)
27
+ - `codex` available on `PATH`
28
+
29
+ ## Quick start
30
+
31
+ ```bash
32
+ npm install
33
+ npm run build
34
+ node dist/cli.js
35
+ ```
36
+
37
+ Global install (after publish):
38
+
39
+ ```bash
40
+ npm install -g codex-mirror
41
+ codex-mirror
42
+ ```
43
+
44
+ From the TUI:
45
+ 1. Choose `Quick Clone` or `New Clone Wizard`.
46
+ 2. Optionally run login for that clone.
47
+ 3. Use `Manage Clones` to run, update, remove.
48
+ 4. Use `Diagnostics` for health checks.
49
+
50
+ ## CLI usage
51
+
52
+ ```bash
53
+ # Create clone (default root: ~/.codex-mirror/clones/<name>)
54
+ node dist/cli.js create --name work
55
+
56
+ # List clones
57
+ node dist/cli.js list
58
+ node dist/cli.js list --full
59
+ node dist/cli.js list --json
60
+
61
+ # Run clone
62
+ node dist/cli.js run work
63
+ node dist/cli.js run work -- --model o3
64
+
65
+ # Login/logout
66
+ node dist/cli.js login work
67
+ node dist/cli.js logout work
68
+
69
+ # Health checks
70
+ node dist/cli.js doctor
71
+ node dist/cli.js doctor work --json
72
+
73
+ # Updates
74
+ node dist/cli.js update work
75
+ node dist/cli.js update --all
76
+
77
+ # Remove clone
78
+ node dist/cli.js remove work
79
+
80
+ # Reinstall wrappers
81
+ node dist/cli.js wrapper install
82
+ ```
83
+
84
+ ## Data layout
85
+
86
+ Default locations:
87
+
88
+ - Mirror home: `~/.codex-mirror`
89
+ - Registry: `~/.codex-mirror/registry.json`
90
+ - Clone root: `~/.codex-mirror/clones/<clone-name>`
91
+ - Wrapper binaries: `~/.local/bin/<clone-name>`
92
+
93
+ Per clone:
94
+
95
+ ```text
96
+ <clone-root>/
97
+ .codex-mirror/
98
+ clone.json
99
+ runtime/
100
+ home/
101
+ .codex/
102
+ .config/
103
+ .local/share/
104
+ .cache/
105
+ logs/
106
+ ```
107
+
108
+ Path overrides:
109
+
110
+ - `CODEX_MIRROR_HOME` (changes global root)
111
+ - `CODEX_MIRROR_BIN_DIR` (changes wrapper output dir)
112
+
113
+ ## Safety model
114
+
115
+ - Clone names are validated and must be filesystem-safe.
116
+ - Wrapper paths are forced to remain inside configured wrapper directory.
117
+ - Registry updates are lock-protected and written atomically.
118
+ - Create/update/remove operations include rollback to avoid partial state.
119
+ - Health checks use bounded concurrency and auth timeouts.
120
+
121
+ Detailed docs:
122
+
123
+ - `docs/ARCHITECTURE.md`
124
+ - `docs/SECURITY.md`
125
+ - `docs/OPERATIONS.md`
126
+ - `docs/TROUBLESHOOTING.md`
127
+ - `docs/ROADMAP.md`
128
+ - `docs/RELEASE.md`
129
+
130
+ ## Development
131
+
132
+ ```bash
133
+ npm run check
134
+ ```
135
+
136
+ ## Community
137
+
138
+ - Contributing guide: `CONTRIBUTING.md`
139
+ - Code of Conduct: `CODE_OF_CONDUCT.md`
140
+ - Security policy: `SECURITY.md`
141
+ - Support info: `SUPPORT.md`
142
+
143
+ ## Maintainer release flow
144
+
145
+ 1. Ensure `main` is green in CI.
146
+ 2. Update version:
147
+ ```bash
148
+ npm version patch
149
+ ```
150
+ 3. Push commit + tag:
151
+ ```bash
152
+ git push origin main --follow-tags
153
+ ```
154
+ 4. Tag trigger `v*` will run `.github/workflows/release.yml` and publish to npm.
package/dist/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/cli.js ADDED
@@ -0,0 +1,244 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ import { readFile } from "node:fs/promises";
4
+ import { resolve } from "node:path";
5
+ import { CloneManager } from "./core/clone-manager.js";
6
+ import { assertValidCloneName, sanitizeCloneName } from "./core/clone-name.js";
7
+ import { resolveContext } from "./core/context.js";
8
+ import { Doctor } from "./core/doctor.js";
9
+ import { Launcher } from "./core/launcher.js";
10
+ import { RegistryStore } from "./core/registry.js";
11
+ import { WrapperManager } from "./core/wrapper-manager.js";
12
+ import { runTui } from "./tui/index.js";
13
+ async function main() {
14
+ const cliVersion = await resolveCliVersion();
15
+ const context = resolveContext();
16
+ const wrapperRunner = resolveWrapperRunner();
17
+ const registry = new RegistryStore(context.registryPath);
18
+ const wrappers = new WrapperManager(context.defaultBinDir, wrapperRunner);
19
+ const cloneManager = new CloneManager(registry, wrappers);
20
+ const launcher = new Launcher();
21
+ const doctor = new Doctor(launcher);
22
+ const program = new Command();
23
+ program
24
+ .name("codex-mirror")
25
+ .version(cliVersion, "-V, --version", "Output version")
26
+ .description("Manage centrally-stored isolated Codex clones with independent auth/session state")
27
+ .option("--debug", "Enable debug logging")
28
+ .showHelpAfterError();
29
+ program
30
+ .command("create")
31
+ .description("Create a new clone")
32
+ .requiredOption("--name <name>", "Clone name")
33
+ .option("--root <path>", "Advanced: custom clone storage directory (default: ~/.codex-mirror/clones/<name>)")
34
+ .action(async (options) => {
35
+ const cloneName = assertValidCloneName(options.name);
36
+ const rootPath = options.root
37
+ ? options.root
38
+ : resolve(context.globalRoot, "clones", sanitizeCloneName(cloneName));
39
+ const clone = await cloneManager.createClone({
40
+ name: cloneName,
41
+ rootPath,
42
+ });
43
+ console.log(`Created clone '${clone.name}' at ${clone.rootPath}`);
44
+ console.log(`Wrapper: ${clone.wrapperPath}`);
45
+ });
46
+ program
47
+ .command("list")
48
+ .description("List clones")
49
+ .option("--json", "Emit JSON output")
50
+ .option("--full", "Show full metadata")
51
+ .action(async (options) => {
52
+ const clones = await cloneManager.listClones();
53
+ if (options.json) {
54
+ console.log(JSON.stringify(clones, null, 2));
55
+ return;
56
+ }
57
+ if (clones.length === 0) {
58
+ console.log("No clones found.");
59
+ return;
60
+ }
61
+ if (options.full) {
62
+ for (const clone of clones) {
63
+ console.log(`${clone.name}`);
64
+ console.log(` root: ${clone.rootPath}`);
65
+ console.log(` version: ${clone.codexVersionPinned}`);
66
+ console.log(` runtime: ${clone.runtimeEntryPath}`);
67
+ console.log(` wrapper: ${clone.wrapperPath}`);
68
+ console.log(` created: ${clone.createdAt}`);
69
+ console.log(` updated: ${clone.updatedAt}`);
70
+ console.log("");
71
+ }
72
+ return;
73
+ }
74
+ for (const clone of clones) {
75
+ console.log(`${clone.name}\t${clone.codexVersionPinned}\t${clone.rootPath}`);
76
+ }
77
+ });
78
+ program
79
+ .command("run")
80
+ .description("Run Codex inside a clone")
81
+ .argument("<name>", "Clone name")
82
+ .argument("[codexArgs...]", "Arguments passed to Codex")
83
+ .allowUnknownOption(true)
84
+ .action(async (name, codexArgs) => {
85
+ const clone = await cloneManager.getClone(name);
86
+ const forwarded = extractPassthroughArgs();
87
+ const args = forwarded.length > 0 ? forwarded : codexArgs;
88
+ const code = await launcher.run(clone, args, process.cwd());
89
+ process.exitCode = code;
90
+ });
91
+ program
92
+ .command("login")
93
+ .description("Run Codex login in clone context")
94
+ .argument("<name>", "Clone name")
95
+ .action(async (name) => {
96
+ const clone = await cloneManager.getClone(name);
97
+ const code = await launcher.run(clone, ["login"], process.cwd());
98
+ process.exitCode = code;
99
+ });
100
+ program
101
+ .command("logout")
102
+ .description("Run Codex logout in clone context")
103
+ .argument("<name>", "Clone name")
104
+ .action(async (name) => {
105
+ const clone = await cloneManager.getClone(name);
106
+ const code = await launcher.run(clone, ["logout"], process.cwd());
107
+ process.exitCode = code;
108
+ });
109
+ program
110
+ .command("doctor")
111
+ .description("Health check one or all clones")
112
+ .argument("[name]", "Clone name")
113
+ .option("--json", "Emit JSON output")
114
+ .action(async (name, options) => {
115
+ const clones = name
116
+ ? [await cloneManager.getClone(name)]
117
+ : await cloneManager.listClones();
118
+ const results = await doctor.checkMany(clones);
119
+ if (options.json) {
120
+ console.log(JSON.stringify(results, null, 2));
121
+ return;
122
+ }
123
+ printDoctor(results);
124
+ });
125
+ program
126
+ .command("update")
127
+ .description("Update one clone or all clones to current Codex version")
128
+ .argument("[name]", "Clone name")
129
+ .option("--all", "Update all clones")
130
+ .action(async (name, options) => {
131
+ if (options.all) {
132
+ const updated = await cloneManager.updateAll();
133
+ console.log(`Updated ${updated.length} clone(s).`);
134
+ return;
135
+ }
136
+ if (!name) {
137
+ throw new Error("Provide a clone name or use --all");
138
+ }
139
+ const updated = await cloneManager.updateClone(name);
140
+ console.log(`Updated clone '${updated.name}' to Codex ${updated.codexVersionPinned}`);
141
+ });
142
+ program
143
+ .command("remove")
144
+ .description("Remove a clone")
145
+ .argument("<name>", "Clone name")
146
+ .action(async (name) => {
147
+ const removed = await cloneManager.removeClone(name);
148
+ console.log(`Removed clone '${removed.name}' from ${removed.rootPath}`);
149
+ });
150
+ program
151
+ .command("wrapper")
152
+ .description("Install or refresh clone wrapper scripts")
153
+ .command("install")
154
+ .description("Install wrappers for all clones")
155
+ .option("--bin-dir <path>", "Target wrapper directory")
156
+ .action(async (options) => {
157
+ const targetDir = options.binDir ? resolve(options.binDir) : context.defaultBinDir;
158
+ const scopedWrappers = new WrapperManager(targetDir, wrapperRunner);
159
+ const clones = await cloneManager.listClones();
160
+ for (const clone of clones) {
161
+ clone.wrapperPath = await scopedWrappers.installWrapper(clone);
162
+ clone.updatedAt = new Date().toISOString();
163
+ await cloneManager.saveClone(clone);
164
+ }
165
+ console.log(`Installed ${clones.length} wrapper(s) in ${targetDir}`);
166
+ });
167
+ const argv = process.argv.slice(2);
168
+ const wantsMetaOutput = argv.includes("-h") ||
169
+ argv.includes("--help") ||
170
+ argv.includes("-V") ||
171
+ argv.includes("--version");
172
+ const hasCommand = argv.some((arg) => !arg.startsWith("-"));
173
+ if (!hasCommand && !wantsMetaOutput) {
174
+ await runTui({
175
+ cloneManager,
176
+ launcher,
177
+ doctor,
178
+ defaultCloneBaseDir: resolve(context.globalRoot, "clones"),
179
+ });
180
+ return;
181
+ }
182
+ await program.parseAsync(process.argv);
183
+ }
184
+ function resolveWrapperRunner() {
185
+ const scriptPath = process.argv[1];
186
+ if (!scriptPath) {
187
+ return { command: "codex-mirror", args: [] };
188
+ }
189
+ const resolvedScriptPath = resolve(scriptPath);
190
+ if (/\.m?js$|\.cjs$/.test(resolvedScriptPath)) {
191
+ return { command: process.execPath, args: [resolvedScriptPath] };
192
+ }
193
+ return { command: resolvedScriptPath, args: [] };
194
+ }
195
+ function extractPassthroughArgs() {
196
+ const index = process.argv.indexOf("--");
197
+ if (index === -1) {
198
+ return [];
199
+ }
200
+ return process.argv.slice(index + 1);
201
+ }
202
+ function printDoctor(results) {
203
+ if (results.length === 0) {
204
+ console.log("No clones found.");
205
+ return;
206
+ }
207
+ for (const result of results) {
208
+ console.log(`${result.ok ? "OK" : "FAIL"} ${result.name}`);
209
+ console.log(` runtime: ${result.runtimePath}`);
210
+ console.log(` wrapper: ${result.wrapperPath}`);
211
+ console.log(` auth: ${result.authStatus}`);
212
+ console.log(` writable: ${result.writable ? "yes" : "no"}`);
213
+ if (result.errors.length > 0) {
214
+ for (const error of result.errors) {
215
+ console.log(` error: ${error}`);
216
+ }
217
+ }
218
+ console.log("");
219
+ }
220
+ }
221
+ async function resolveCliVersion() {
222
+ const envVersion = process.env.npm_package_version;
223
+ if (envVersion && envVersion.trim().length > 0) {
224
+ return envVersion.trim();
225
+ }
226
+ try {
227
+ const packageJsonPath = new URL("../package.json", import.meta.url);
228
+ const raw = await readFile(packageJsonPath, "utf8");
229
+ const parsed = JSON.parse(raw);
230
+ if (parsed.version && parsed.version.trim().length > 0) {
231
+ return parsed.version.trim();
232
+ }
233
+ }
234
+ catch {
235
+ // Fallback below if package metadata cannot be read.
236
+ }
237
+ return "0.0.0";
238
+ }
239
+ main().catch((error) => {
240
+ const message = error instanceof Error ? error.message : String(error);
241
+ console.error(`Error: ${message}`);
242
+ process.exitCode = 1;
243
+ });
244
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAiB,MAAM,2BAA2B,CAAC;AAC1E,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAGxC,KAAK,UAAU,IAAI;IACjB,MAAM,UAAU,GAAG,MAAM,iBAAiB,EAAE,CAAC;IAC7C,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;IACjC,MAAM,aAAa,GAAG,oBAAoB,EAAE,CAAC;IAC7C,MAAM,QAAQ,GAAG,IAAI,aAAa,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IACzD,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,OAAO,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;IAC1E,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC;IAEpC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAC9B,OAAO;SACJ,IAAI,CAAC,cAAc,CAAC;SACpB,OAAO,CAAC,UAAU,EAAE,eAAe,EAAE,gBAAgB,CAAC;SACtD,WAAW,CAAC,mFAAmF,CAAC;SAChG,MAAM,CAAC,SAAS,EAAE,sBAAsB,CAAC;SACzC,kBAAkB,EAAE,CAAC;IAExB,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,oBAAoB,CAAC;SACjC,cAAc,CAAC,eAAe,EAAE,YAAY,CAAC;SAC7C,MAAM,CAAC,eAAe,EAAE,mFAAmF,CAAC;SAC5G,MAAM,CAAC,KAAK,EAAE,OAAwC,EAAE,EAAE;QACzD,MAAM,SAAS,GAAG,oBAAoB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI;YAC3B,CAAC,CAAC,OAAO,CAAC,IAAI;YACd,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC;QACxE,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,WAAW,CAAC;YAC3C,IAAI,EAAE,SAAS;YACf,QAAQ;SACT,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,CAAC,IAAI,QAAQ,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,aAAa,CAAC;SAC1B,MAAM,CAAC,QAAQ,EAAE,kBAAkB,CAAC;SACpC,MAAM,CAAC,QAAQ,EAAE,oBAAoB,CAAC;SACtC,MAAM,CAAC,KAAK,EAAE,OAA2C,EAAE,EAAE;QAC5D,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,UAAU,EAAE,CAAC;QAC/C,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC7C,OAAO;QACT,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;YAChC,OAAO;QACT,CAAC;QAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC7B,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;gBACzC,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,CAAC,kBAAkB,EAAE,CAAC,CAAC;gBACtD,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC;gBACpD,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;gBAC/C,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;gBAC7C,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;gBAC7C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAClB,CAAC;YACD,OAAO;QACT,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,kBAAkB,KAAK,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,0BAA0B,CAAC;SACvC,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;SAChC,QAAQ,CAAC,gBAAgB,EAAE,2BAA2B,CAAC;SACvD,kBAAkB,CAAC,IAAI,CAAC;SACxB,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,SAAmB,EAAE,EAAE;QAClD,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,SAAS,GAAG,sBAAsB,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1D,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAC5D,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,kCAAkC,CAAC;SAC/C,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;SAChC,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACjE,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,mCAAmC,CAAC;SAChD,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;SAChC,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAClE,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,gCAAgC,CAAC;SAC7C,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;SAChC,MAAM,CAAC,QAAQ,EAAE,kBAAkB,CAAC;SACpC,MAAM,CAAC,KAAK,EAAE,IAAwB,EAAE,OAA2B,EAAE,EAAE;QACtE,MAAM,MAAM,GAAG,IAAI;YACjB,CAAC,CAAC,CAAC,MAAM,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACrC,CAAC,CAAC,MAAM,YAAY,CAAC,UAAU,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC9C,OAAO;QACT,CAAC;QACD,WAAW,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,yDAAyD,CAAC;SACtE,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;SAChC,MAAM,CAAC,OAAO,EAAE,mBAAmB,CAAC;SACpC,MAAM,CAAC,KAAK,EAAE,IAAwB,EAAE,OAA0B,EAAE,EAAE;QACrE,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAChB,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,SAAS,EAAE,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,WAAW,OAAO,CAAC,MAAM,YAAY,CAAC,CAAC;YACnD,OAAO;QACT,CAAC;QAED,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACvD,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,kBAAkB,OAAO,CAAC,IAAI,cAAc,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACxF,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,gBAAgB,CAAC;SAC7B,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;SAChC,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE;QAC7B,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,kBAAkB,OAAO,CAAC,IAAI,UAAU,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,0CAA0C,CAAC;SACvD,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,iCAAiC,CAAC;SAC9C,MAAM,CAAC,kBAAkB,EAAE,0BAA0B,CAAC;SACtD,MAAM,CAAC,KAAK,EAAE,OAA4B,EAAE,EAAE;QAC7C,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC;QACnF,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QACpE,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,UAAU,EAAE,CAAC;QAC/C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,KAAK,CAAC,WAAW,GAAG,MAAM,cAAc,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;YAC/D,KAAK,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC3C,MAAM,YAAY,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,MAAM,kBAAkB,SAAS,EAAE,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEL,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,eAAe,GACnB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QACnB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACvB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QACnB,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IAE5D,IAAI,CAAC,UAAU,IAAI,CAAC,eAAe,EAAE,CAAC;QACpC,MAAM,MAAM,CAAC;YACX,YAAY;YACZ,QAAQ;YACR,MAAM;YACN,mBAAmB,EAAE,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC;SAC3D,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,oBAAoB;IAC3B,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IAC/C,CAAC;IAED,MAAM,kBAAkB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC/C,IAAI,gBAAgB,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC9C,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,kBAAkB,CAAC,EAAE,CAAC;IACnE,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;AACnD,CAAC;AAED,SAAS,sBAAsB;IAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;QACjB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,WAAW,CAAC,OAAuB;IAC1C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAChC,OAAO;IACT,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7D,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClC,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,EAAE,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB;IAC9B,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IACnD,IAAI,UAAU,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/C,OAAO,UAAU,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,IAAI,CAAC;QACH,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpE,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAyB,CAAC;QACvD,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvD,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAC/B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,qDAAqD;IACvD,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC9B,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO,CAAC,KAAK,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC;IACnC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { ClonePaths, CloneRecord } from "../types.js";
2
+ import { RegistryStore } from "./registry.js";
3
+ import { WrapperManager } from "./wrapper-manager.js";
4
+ export interface CreateCloneOptions {
5
+ name: string;
6
+ rootPath: string;
7
+ }
8
+ export declare class CloneManager {
9
+ private readonly registry;
10
+ private readonly wrappers;
11
+ constructor(registry: RegistryStore, wrappers: WrapperManager);
12
+ listClones(): Promise<CloneRecord[]>;
13
+ getClone(name: string): Promise<CloneRecord>;
14
+ createClone(options: CreateCloneOptions): Promise<CloneRecord>;
15
+ updateClone(name: string): Promise<CloneRecord>;
16
+ updateAll(): Promise<CloneRecord[]>;
17
+ removeClone(name: string): Promise<CloneRecord>;
18
+ saveClone(clone: CloneRecord): Promise<void>;
19
+ private writeCloneMetadata;
20
+ }
21
+ export declare function deriveClonePaths(rootPath: string): ClonePaths;