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.
- package/LICENSE +21 -0
- package/README.md +154 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +244 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/clone-manager.d.ts +21 -0
- package/dist/core/clone-manager.js +229 -0
- package/dist/core/clone-manager.js.map +1 -0
- package/dist/core/clone-name.d.ts +8 -0
- package/dist/core/clone-name.js +93 -0
- package/dist/core/clone-name.js.map +1 -0
- package/dist/core/context.d.ts +6 -0
- package/dist/core/context.js +12 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/doctor.d.ts +10 -0
- package/dist/core/doctor.js +102 -0
- package/dist/core/doctor.js.map +1 -0
- package/dist/core/launcher.d.ts +7 -0
- package/dist/core/launcher.js +36 -0
- package/dist/core/launcher.js.map +1 -0
- package/dist/core/registry.d.ts +19 -0
- package/dist/core/registry.js +134 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/runtime-cloner.d.ts +10 -0
- package/dist/core/runtime-cloner.js +74 -0
- package/dist/core/runtime-cloner.js.map +1 -0
- package/dist/core/wrapper-manager.d.ts +15 -0
- package/dist/core/wrapper-manager.js +56 -0
- package/dist/core/wrapper-manager.js.map +1 -0
- package/dist/tui/index.d.ts +12 -0
- package/dist/tui/index.js +512 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/tui/menu.d.ts +71 -0
- package/dist/tui/menu.js +487 -0
- package/dist/tui/menu.js.map +1 -0
- package/dist/types.d.ts +43 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/fs.d.ts +9 -0
- package/dist/utils/fs.js +53 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/logger.d.ts +9 -0
- package/dist/utils/logger.js +22 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/process.d.ts +20 -0
- package/dist/utils/process.js +90 -0
- package/dist/utils/process.js.map +1 -0
- 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
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
|
package/dist/cli.js.map
ADDED
|
@@ -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;
|