@solaqua/gji 0.12.2 → 0.12.3
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/dist/bootstrap-output.d.ts +3 -2
- package/dist/bootstrap-output.js +1 -16
- package/dist/bootstrap-preview.d.ts +2 -3
- package/dist/bootstrap-preview.js +1 -11
- package/dist/cli.js +5 -1
- package/dist/config.d.ts +3 -13
- package/dist/config.js +12 -59
- package/dist/dependency-bootstrap.d.ts +11 -45
- package/dist/dependency-bootstrap.js +142 -608
- package/dist/gji-bundle.mjs +567 -2367
- package/dist/new.d.ts +4 -5
- package/dist/new.js +10 -45
- package/dist/pr.d.ts +4 -5
- package/dist/pr.js +9 -69
- package/dist/shell-completion.js +7 -5
- package/dist/uv-validation.d.ts +4 -0
- package/dist/uv-validation.js +210 -0
- package/dist/worktree-bootstrap.d.ts +5 -16
- package/dist/worktree-bootstrap.js +1 -24
- package/man/man1/gji-back.1 +1 -1
- package/man/man1/gji-clean.1 +1 -1
- package/man/man1/gji-completion.1 +1 -1
- package/man/man1/gji-config.1 +1 -1
- package/man/man1/gji-doctor.1 +1 -1
- package/man/man1/gji-done.1 +1 -1
- package/man/man1/gji-go.1 +1 -1
- package/man/man1/gji-history.1 +1 -1
- package/man/man1/gji-init.1 +1 -1
- package/man/man1/gji-ls.1 +1 -1
- package/man/man1/gji-new.1 +8 -5
- package/man/man1/gji-open.1 +1 -1
- package/man/man1/gji-pr.1 +6 -3
- package/man/man1/gji-remove.1 +1 -1
- package/man/man1/gji-root.1 +1 -1
- package/man/man1/gji-run-hook.1 +1 -1
- package/man/man1/gji-status.1 +1 -1
- package/man/man1/gji-sync-files.1 +1 -1
- package/man/man1/gji-sync.1 +1 -1
- package/man/man1/gji-task.1 +1 -1
- package/man/man1/gji-undo.1 +1 -1
- package/man/man1/gji-warp.1 +1 -1
- package/man/man1/gji.1 +2 -2
- package/package.json +1 -1
- package/dist/dependency-bootstrap-prompt.d.ts +0 -24
- package/dist/dependency-bootstrap-prompt.js +0 -103
- package/dist/dir-clone.d.ts +0 -32
- package/dist/dir-clone.js +0 -641
- package/dist/install-prompt.d.ts +0 -12
- package/dist/install-prompt.js +0 -127
- package/dist/package-manager.d.ts +0 -5
- package/dist/package-manager.js +0 -159
- package/dist/sync-directories.d.ts +0 -29
- package/dist/sync-directories.js +0 -77
- package/dist/sync-plan.d.ts +0 -16
- package/dist/sync-plan.js +0 -128
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
import type { DependencyBootstrapReporter } from "./dependency-bootstrap.js";
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
export declare function createBootstrapReporter(write: (chunk: string) => void, json: boolean): DependencyBootstrapReporter & {
|
|
3
|
+
write: (chunk: string) => void;
|
|
4
|
+
};
|
package/dist/bootstrap-output.js
CHANGED
|
@@ -1,18 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
export function createBootstrapReporter(write, json, measureCloneSize = false) {
|
|
1
|
+
export function createBootstrapReporter(write, json) {
|
|
3
2
|
return {
|
|
4
|
-
measureCloneSize: measureCloneSize && !json,
|
|
5
3
|
write,
|
|
6
|
-
cloned: (directory) => {
|
|
7
|
-
if (json)
|
|
8
|
-
return;
|
|
9
|
-
write(`⚡ cloned ${directory.dir} (${formatBytes(directory.bytes)} → ${formatDuration(directory.ms)})\n`);
|
|
10
|
-
},
|
|
11
|
-
skipped: (directory) => {
|
|
12
|
-
if (json)
|
|
13
|
-
return;
|
|
14
|
-
write(`gji: skipped ${directory.dir} — ${directory.reason}\n`);
|
|
15
|
-
},
|
|
16
4
|
dependency: (event) => {
|
|
17
5
|
if (json)
|
|
18
6
|
return;
|
|
@@ -21,6 +9,3 @@ export function createBootstrapReporter(write, json, measureCloneSize = false) {
|
|
|
21
9
|
},
|
|
22
10
|
};
|
|
23
11
|
}
|
|
24
|
-
function formatDuration(ms) {
|
|
25
|
-
return `${(ms / 1000).toFixed(1)}s`;
|
|
26
|
-
}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import type { DependencyBootstrapMode } from "./
|
|
2
|
-
import { type
|
|
1
|
+
import type { DependencyBootstrapMode } from "./dependency-bootstrap.js";
|
|
2
|
+
import { type DependencyBootstrapPreview } from "./dependency-bootstrap.js";
|
|
3
3
|
export declare function createDependencyBootstrapPreview(mode: DependencyBootstrapMode, context: {
|
|
4
4
|
repoRoot: string;
|
|
5
5
|
currentRoot?: string;
|
|
6
6
|
worktreePath: string;
|
|
7
7
|
cargoBuildCommand?: string;
|
|
8
|
-
checkUvRuntime?: (target: BootstrapTarget) => Promise<boolean>;
|
|
9
8
|
}): Promise<DependencyBootstrapPreview>;
|
|
10
9
|
export declare function formatDependencyBootstrapPreview(preview: DependencyBootstrapPreview | undefined): string;
|
|
@@ -6,16 +6,6 @@ export function formatDependencyBootstrapPreview(preview) {
|
|
|
6
6
|
if (!preview)
|
|
7
7
|
return "";
|
|
8
8
|
return preview.targets
|
|
9
|
-
.map(({ adapter, target,
|
|
9
|
+
.map(({ adapter, target, command }) => `Would install ${target || "dependencies"} with ${adapter}: ${command}\n`)
|
|
10
10
|
.join("");
|
|
11
11
|
}
|
|
12
|
-
function formatBootstrapStrategy(strategy) {
|
|
13
|
-
switch (strategy) {
|
|
14
|
-
case "cow-then-repair":
|
|
15
|
-
return "seed and repair";
|
|
16
|
-
case "repair-only":
|
|
17
|
-
return "repair";
|
|
18
|
-
case "install-only":
|
|
19
|
-
return "install";
|
|
20
|
-
}
|
|
21
|
-
}
|
package/dist/cli.js
CHANGED
|
@@ -155,7 +155,7 @@ async function maybeRegisterCurrentRepo(cwd) {
|
|
|
155
155
|
function registerCommands(program) {
|
|
156
156
|
program
|
|
157
157
|
.command("new [branch]")
|
|
158
|
-
.description("create a new branch or detached linked worktree
|
|
158
|
+
.description("create a new branch or detached linked worktree")
|
|
159
159
|
.option("-f, --force", "remove and recreate the worktree if the target path already exists")
|
|
160
160
|
.option("--detached", "create a detached worktree without a branch")
|
|
161
161
|
.option("--from-current", "base the new branch on the current worktree instead of the main worktree (cannot be combined with --detached)")
|
|
@@ -166,6 +166,7 @@ function registerCommands(program) {
|
|
|
166
166
|
.option("--open", "open the new worktree in an editor after creation")
|
|
167
167
|
.option("--editor <cli>", "editor CLI to use with --open (code, cursor, zed, …)")
|
|
168
168
|
.option("--dry-run", "show what would be created without executing any git commands or writing files")
|
|
169
|
+
.option("--no-install", "skip automatic dependency setup in the new worktree")
|
|
169
170
|
.option("--json", "emit JSON on success or error instead of human-readable output")
|
|
170
171
|
.action(notImplemented("new"));
|
|
171
172
|
program
|
|
@@ -203,6 +204,7 @@ function registerCommands(program) {
|
|
|
203
204
|
.usage("[options] <ref>")
|
|
204
205
|
.description("fetch a pull request by number, #number, or URL into a linked worktree")
|
|
205
206
|
.option("--dry-run", "show what would be created without executing any git commands or writing files")
|
|
207
|
+
.option("--no-install", "skip automatic dependency setup in the PR worktree")
|
|
206
208
|
.option("--json", "emit JSON on success or error instead of human-readable output")
|
|
207
209
|
.action(notImplemented("pr"));
|
|
208
210
|
prCommand
|
|
@@ -347,6 +349,7 @@ function attachCommandActions(program, options) {
|
|
|
347
349
|
force: commandOptions.force,
|
|
348
350
|
noFetch: commandOptions.fetch === false,
|
|
349
351
|
json: commandOptions.json,
|
|
352
|
+
noInstall: commandOptions.install === false,
|
|
350
353
|
open: commandOptions.open,
|
|
351
354
|
take: commandOptions.take,
|
|
352
355
|
task: commandOptions.task,
|
|
@@ -433,6 +436,7 @@ function attachCommandActions(program, options) {
|
|
|
433
436
|
cwd: options.cwd,
|
|
434
437
|
dryRun: commandOptions.dryRun,
|
|
435
438
|
json: commandOptions.json,
|
|
439
|
+
noInstall: commandOptions.install === false,
|
|
436
440
|
number,
|
|
437
441
|
stderr: options.stderr,
|
|
438
442
|
stdout: options.stdout,
|
package/dist/config.d.ts
CHANGED
|
@@ -4,17 +4,15 @@ export declare const GLOBAL_CONFIG_NAME = "config.json";
|
|
|
4
4
|
export declare const KNOWN_CONFIG_KEYS: ReadonlySet<string>;
|
|
5
5
|
export declare const KNOWN_GLOBAL_CONFIG_KEYS: ReadonlySet<string>;
|
|
6
6
|
export type GjiConfig = Record<string, unknown>;
|
|
7
|
-
export type
|
|
7
|
+
export type DependencyBootstrapSetting = "off";
|
|
8
8
|
export interface EffectiveGjiConfig extends GjiConfig {
|
|
9
9
|
branchPrefix?: string;
|
|
10
10
|
dependencyBuildCommand?: string;
|
|
11
|
-
dependencyBootstrap?:
|
|
11
|
+
dependencyBootstrap?: DependencyBootstrapSetting;
|
|
12
12
|
editor?: string;
|
|
13
13
|
hooks?: Record<string, unknown>;
|
|
14
14
|
installSaveTarget?: string;
|
|
15
15
|
shellIntegration?: string;
|
|
16
|
-
skipInstallPrompt?: boolean;
|
|
17
|
-
syncDirs?: readonly string[];
|
|
18
16
|
syncFiles?: readonly string[];
|
|
19
17
|
syncDefaultBranch?: string;
|
|
20
18
|
syncRemote?: string;
|
|
@@ -25,14 +23,9 @@ export interface LoadedConfig {
|
|
|
25
23
|
exists: boolean;
|
|
26
24
|
path: string;
|
|
27
25
|
}
|
|
28
|
-
export interface EffectiveConfigResult {
|
|
29
|
-
config: EffectiveGjiConfig;
|
|
30
|
-
dependencyBootstrapExplicit: boolean;
|
|
31
|
-
}
|
|
32
26
|
export declare const DEFAULT_CONFIG: GjiConfig;
|
|
33
27
|
export declare function loadConfig(root: string): Promise<LoadedConfig>;
|
|
34
28
|
export declare function loadEffectiveConfig(root: string, home?: string, onWarning?: (message: string) => void): Promise<EffectiveGjiConfig>;
|
|
35
|
-
export declare function loadEffectiveConfigResult(root: string, home?: string, onWarning?: (message: string) => void): Promise<EffectiveConfigResult>;
|
|
36
29
|
export declare function loadGlobalConfig(home?: string): Promise<LoadedConfig>;
|
|
37
30
|
export declare function saveLocalConfig(root: string, config: GjiConfig): Promise<string>;
|
|
38
31
|
export declare function updateLocalConfigKey(root: string, key: string, value: unknown): Promise<GjiConfig>;
|
|
@@ -43,7 +36,4 @@ export declare function updateGlobalRepoConfigKey(repoRoot: string, key: string,
|
|
|
43
36
|
export declare function GLOBAL_CONFIG_FILE_PATH(home?: string): string;
|
|
44
37
|
export declare function parseConfigValue(value: string): unknown;
|
|
45
38
|
export declare function resolveConfigString(config: GjiConfig, key: string): string | undefined;
|
|
46
|
-
export declare function
|
|
47
|
-
export declare function normalizeDependencyBootstrap(value: unknown): DependencyBootstrapMode | undefined;
|
|
48
|
-
export declare function normalizeSyncDirsConfig(value: unknown): readonly string[] | undefined;
|
|
49
|
-
export declare function validateSyncDirPattern(pattern: string): string;
|
|
39
|
+
export declare function normalizeDependencyBootstrap(value: unknown): DependencyBootstrapSetting | undefined;
|
package/dist/config.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
2
2
|
import { homedir } from "node:os";
|
|
3
|
-
import { dirname,
|
|
3
|
+
import { dirname, join, resolve } from "node:path";
|
|
4
4
|
export const CONFIG_FILE_NAME = ".gji.json";
|
|
5
5
|
export const GLOBAL_CONFIG_DIRECTORY = ".config/gji";
|
|
6
6
|
export const GLOBAL_CONFIG_NAME = "config.json";
|
|
@@ -12,8 +12,6 @@ export const KNOWN_CONFIG_KEYS = new Set([
|
|
|
12
12
|
"hooks",
|
|
13
13
|
"installSaveTarget",
|
|
14
14
|
"shellIntegration",
|
|
15
|
-
"skipInstallPrompt",
|
|
16
|
-
"syncDirs",
|
|
17
15
|
"syncDefaultBranch",
|
|
18
16
|
"syncFiles",
|
|
19
17
|
"syncRemote",
|
|
@@ -23,15 +21,13 @@ export const KNOWN_GLOBAL_CONFIG_KEYS = new Set([
|
|
|
23
21
|
...KNOWN_CONFIG_KEYS,
|
|
24
22
|
"repos",
|
|
25
23
|
]);
|
|
24
|
+
const REMOVED_CONFIG_KEYS = new Set(["syncDirs"]);
|
|
26
25
|
export const DEFAULT_CONFIG = Object.freeze({});
|
|
27
26
|
export async function loadConfig(root) {
|
|
28
27
|
const path = join(root, CONFIG_FILE_NAME);
|
|
29
28
|
return loadConfigFile(path);
|
|
30
29
|
}
|
|
31
30
|
export async function loadEffectiveConfig(root, home = homedir(), onWarning) {
|
|
32
|
-
return (await loadEffectiveConfigResult(root, home, onWarning)).config;
|
|
33
|
-
}
|
|
34
|
-
export async function loadEffectiveConfigResult(root, home = homedir(), onWarning) {
|
|
35
31
|
const [globalConfig, localConfig] = await Promise.all([
|
|
36
32
|
loadGlobalConfig(home),
|
|
37
33
|
loadConfig(root),
|
|
@@ -42,7 +38,6 @@ export async function loadEffectiveConfigResult(root, home = homedir(), onWarnin
|
|
|
42
38
|
const perRepoConfig = isPlainObject(repos)
|
|
43
39
|
? findPerRepoConfig(repos, root, home)
|
|
44
40
|
: {};
|
|
45
|
-
validateSyncDirsConfig(perRepoConfig.syncDirs);
|
|
46
41
|
// Strip the internal `repos` registry from the global base before merging.
|
|
47
42
|
const globalBase = { ...globalConfig.config };
|
|
48
43
|
delete globalBase.repos;
|
|
@@ -83,12 +78,7 @@ export async function loadEffectiveConfigResult(root, home = homedir(), onWarnin
|
|
|
83
78
|
Object.keys(localHooks).length > 0) {
|
|
84
79
|
merged.hooks = { ...globalHooks, ...perRepoHooks, ...localHooks };
|
|
85
80
|
}
|
|
86
|
-
return
|
|
87
|
-
config: toEffectiveConfig(merged),
|
|
88
|
-
dependencyBootstrapExplicit: Object.hasOwn(globalBase, "dependencyBootstrap") ||
|
|
89
|
-
Object.hasOwn(perRepoConfig, "dependencyBootstrap") ||
|
|
90
|
-
Object.hasOwn(localConfig.config, "dependencyBootstrap"),
|
|
91
|
-
};
|
|
81
|
+
return toEffectiveConfig(merged);
|
|
92
82
|
}
|
|
93
83
|
export async function loadGlobalConfig(home = homedir()) {
|
|
94
84
|
return loadConfigFile(GLOBAL_CONFIG_FILE_PATH(home));
|
|
@@ -100,6 +90,7 @@ export async function saveLocalConfig(root, config) {
|
|
|
100
90
|
return path;
|
|
101
91
|
}
|
|
102
92
|
export async function updateLocalConfigKey(root, key, value) {
|
|
93
|
+
assertConfigKeySupported(key);
|
|
103
94
|
const loaded = await loadConfig(root);
|
|
104
95
|
const nextConfig = {
|
|
105
96
|
...loaded.config,
|
|
@@ -123,6 +114,7 @@ export async function unsetGlobalConfigKey(key, home = homedir()) {
|
|
|
123
114
|
return nextConfig;
|
|
124
115
|
}
|
|
125
116
|
export async function updateGlobalConfigKey(key, value, home = homedir()) {
|
|
117
|
+
assertConfigKeySupported(key);
|
|
126
118
|
const loaded = await loadGlobalConfig(home);
|
|
127
119
|
const nextConfig = {
|
|
128
120
|
...loaded.config,
|
|
@@ -132,6 +124,7 @@ export async function updateGlobalConfigKey(key, value, home = homedir()) {
|
|
|
132
124
|
return nextConfig;
|
|
133
125
|
}
|
|
134
126
|
export async function updateGlobalRepoConfigKey(repoRoot, key, value, home = homedir()) {
|
|
127
|
+
assertConfigKeySupported(key);
|
|
135
128
|
const loaded = await loadGlobalConfig(home);
|
|
136
129
|
const repos = isPlainObject(loaded.config.repos)
|
|
137
130
|
? { ...loaded.config.repos }
|
|
@@ -163,34 +156,20 @@ export function resolveConfigString(config, key) {
|
|
|
163
156
|
const value = config[key];
|
|
164
157
|
return typeof value === "string" && value.length > 0 ? value : undefined;
|
|
165
158
|
}
|
|
166
|
-
|
|
167
|
-
|
|
159
|
+
function assertConfigKeySupported(key) {
|
|
160
|
+
if (REMOVED_CONFIG_KEYS.has(key)) {
|
|
161
|
+
throw new Error(`configuration key "${key}" is no longer supported`);
|
|
162
|
+
}
|
|
168
163
|
}
|
|
169
164
|
export function normalizeDependencyBootstrap(value) {
|
|
170
165
|
if (value === undefined)
|
|
171
166
|
return;
|
|
172
|
-
if (value !== "off"
|
|
173
|
-
|
|
174
|
-
value !== "install-only") {
|
|
175
|
-
throw new Error('dependencyBootstrap: expected "off", "cow-then-repair", or "install-only"');
|
|
167
|
+
if (value !== "off") {
|
|
168
|
+
throw new Error('dependencyBootstrap: expected "off"');
|
|
176
169
|
}
|
|
177
170
|
return value;
|
|
178
171
|
}
|
|
179
|
-
export function normalizeSyncDirsConfig(value) {
|
|
180
|
-
if (value === undefined)
|
|
181
|
-
return;
|
|
182
|
-
if (!Array.isArray(value)) {
|
|
183
|
-
throw new Error("syncDirs: expected an array of relative directory paths");
|
|
184
|
-
}
|
|
185
|
-
return value.map((pattern) => {
|
|
186
|
-
if (typeof pattern !== "string") {
|
|
187
|
-
throw new Error("syncDirs: every entry must be a string");
|
|
188
|
-
}
|
|
189
|
-
return validateSyncDirPattern(pattern);
|
|
190
|
-
});
|
|
191
|
-
}
|
|
192
172
|
function validateConfigValues(config) {
|
|
193
|
-
validateSyncDirsConfig(config.syncDirs);
|
|
194
173
|
normalizeDependencyBootstrap(config.dependencyBootstrap);
|
|
195
174
|
const repos = config.repos;
|
|
196
175
|
if (!isPlainObject(repos))
|
|
@@ -201,25 +180,6 @@ function validateConfigValues(config) {
|
|
|
201
180
|
}
|
|
202
181
|
}
|
|
203
182
|
}
|
|
204
|
-
export function validateSyncDirPattern(pattern) {
|
|
205
|
-
if (pattern.length === 0 ||
|
|
206
|
-
isAbsolute(pattern) ||
|
|
207
|
-
win32.isAbsolute(pattern)) {
|
|
208
|
-
throw new Error(`syncDirs: pattern must be a relative path, got: ${pattern}`);
|
|
209
|
-
}
|
|
210
|
-
const segments = pattern.split(/[\\/]+/u);
|
|
211
|
-
if (segments.includes("..")) {
|
|
212
|
-
throw new Error(`syncDirs: pattern must not contain '..' segments, got: ${pattern}`);
|
|
213
|
-
}
|
|
214
|
-
if (segments.some((segment) => segment.toLowerCase() === ".git")) {
|
|
215
|
-
throw new Error(`syncDirs: pattern must not include .git, got: ${pattern}`);
|
|
216
|
-
}
|
|
217
|
-
const normalized = normalize(pattern);
|
|
218
|
-
if (normalized === ".") {
|
|
219
|
-
throw new Error(`syncDirs: pattern must name a directory below the repository root, got: ${pattern}`);
|
|
220
|
-
}
|
|
221
|
-
return normalized;
|
|
222
|
-
}
|
|
223
183
|
async function loadConfigFile(path) {
|
|
224
184
|
try {
|
|
225
185
|
const rawConfig = await readFile(path, "utf8");
|
|
@@ -264,13 +224,6 @@ function toEffectiveConfig(config) {
|
|
|
264
224
|
delete effective[key];
|
|
265
225
|
}
|
|
266
226
|
}
|
|
267
|
-
if (effective.skipInstallPrompt !== undefined &&
|
|
268
|
-
typeof effective.skipInstallPrompt !== "boolean") {
|
|
269
|
-
delete effective.skipInstallPrompt;
|
|
270
|
-
}
|
|
271
|
-
if (config.syncDirs !== undefined) {
|
|
272
|
-
effective.syncDirs = normalizeSyncDirsConfig(config.syncDirs);
|
|
273
|
-
}
|
|
274
227
|
if (Array.isArray(config.syncFiles)) {
|
|
275
228
|
effective.syncFiles = config.syncFiles.filter((value) => typeof value === "string");
|
|
276
229
|
}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { type CommandRunner } from "./command-runner.js";
|
|
2
|
-
import type { DependencyBootstrapMode } from "./config.js";
|
|
3
|
-
import { type CloneDirectory } from "./dir-clone.js";
|
|
4
2
|
export type BootstrapKind = "dependency" | "build-cache" | "sync-file";
|
|
5
|
-
export type BootstrapState = "
|
|
6
|
-
export type
|
|
3
|
+
export type BootstrapState = "installed" | "failed";
|
|
4
|
+
export type DependencyBootstrapMode = "off" | "install";
|
|
7
5
|
export type BootstrapCommandRunner = CommandRunner;
|
|
6
|
+
export declare function resolveDependencyBootstrapMode(dependencyBootstrap: "off" | undefined, noInstall?: boolean): DependencyBootstrapMode;
|
|
8
7
|
export interface BootstrapPreparationContext {
|
|
9
8
|
detectionRoot?: string;
|
|
10
9
|
sourceRoot: string;
|
|
@@ -19,42 +18,31 @@ export interface BootstrapExecutionContext extends BootstrapCommandExecutionCont
|
|
|
19
18
|
input: BootstrapTargetInput;
|
|
20
19
|
}
|
|
21
20
|
export interface BootstrapTarget {
|
|
22
|
-
adapter: string;
|
|
23
21
|
kind: BootstrapKind;
|
|
24
22
|
relativePath: string;
|
|
25
23
|
sourceRoot: string;
|
|
24
|
+
detectionRoot?: string;
|
|
26
25
|
worktreePath: string;
|
|
27
|
-
sourcePath
|
|
28
|
-
targetPath
|
|
29
|
-
|
|
30
|
-
repairState: "repaired" | "installed";
|
|
26
|
+
sourcePath?: string;
|
|
27
|
+
targetPath?: string;
|
|
28
|
+
installCommand: string;
|
|
31
29
|
shell: boolean;
|
|
32
|
-
initialInput: Exclude<BootstrapTargetInput, "seed">;
|
|
33
|
-
}
|
|
34
|
-
export type BootstrapTargetInput = "clean" | "preserve" | "seed";
|
|
35
|
-
export interface BootstrapRepairFailureContext {
|
|
36
|
-
input: BootstrapTargetInput;
|
|
37
|
-
target: BootstrapTarget;
|
|
38
30
|
}
|
|
31
|
+
export type BootstrapTargetInput = "clean" | "preserve";
|
|
39
32
|
export interface BootstrapAdapter {
|
|
40
33
|
readonly kind: BootstrapKind;
|
|
41
|
-
readonly lockfile: string;
|
|
42
34
|
readonly name: string;
|
|
43
35
|
readonly relativePath: string;
|
|
44
36
|
detect(context: BootstrapPreparationContext): Promise<BootstrapTarget | null>;
|
|
45
|
-
|
|
46
|
-
repair(target: BootstrapTarget, context: BootstrapExecutionContext): Promise<void>;
|
|
47
|
-
canSeed(target: BootstrapTarget): Promise<boolean>;
|
|
48
|
-
shouldRetryAfterRepairFailure(context: BootstrapRepairFailureContext): boolean;
|
|
49
|
-
cleanupAfterRepairFailure(context: BootstrapRepairFailureContext): Promise<void>;
|
|
37
|
+
install(target: BootstrapTarget, context: BootstrapExecutionContext): Promise<void>;
|
|
50
38
|
}
|
|
51
39
|
export interface DependencyBootstrapPlan {
|
|
52
40
|
mode: DependencyBootstrapMode;
|
|
53
41
|
targets: readonly PlannedBootstrapTarget[];
|
|
54
42
|
}
|
|
55
43
|
export interface PlannedBootstrapTarget {
|
|
44
|
+
adapter: BootstrapAdapter;
|
|
56
45
|
target: BootstrapTarget;
|
|
57
|
-
seedable: boolean;
|
|
58
46
|
}
|
|
59
47
|
export interface BootstrapEvent {
|
|
60
48
|
adapter: string;
|
|
@@ -65,7 +53,6 @@ export interface BootstrapEvent {
|
|
|
65
53
|
message: string;
|
|
66
54
|
}
|
|
67
55
|
export interface DependencyBootstrapReporter {
|
|
68
|
-
readonly measureCloneSize: boolean;
|
|
69
56
|
dependency(event: BootstrapEvent): void;
|
|
70
57
|
}
|
|
71
58
|
export interface DependencyBootstrapReport {
|
|
@@ -74,11 +61,9 @@ export interface DependencyBootstrapReport {
|
|
|
74
61
|
events: readonly BootstrapEvent[];
|
|
75
62
|
}
|
|
76
63
|
export interface DependencyBootstrapDependencies {
|
|
77
|
-
cloneDirectory?: CloneDirectory;
|
|
78
64
|
runCommand?: BootstrapCommandRunner;
|
|
79
65
|
stderr?: (chunk: string) => void;
|
|
80
66
|
stdout?: (chunk: string) => void;
|
|
81
|
-
seededDirectories?: readonly string[];
|
|
82
67
|
}
|
|
83
68
|
export interface DependencyBootstrapPreview {
|
|
84
69
|
mode: DependencyBootstrapMode;
|
|
@@ -86,35 +71,16 @@ export interface DependencyBootstrapPreview {
|
|
|
86
71
|
adapter: string;
|
|
87
72
|
kind: BootstrapKind;
|
|
88
73
|
target: string;
|
|
89
|
-
|
|
90
|
-
seedable: boolean;
|
|
91
|
-
strategy: BootstrapStrategy;
|
|
74
|
+
command: string;
|
|
92
75
|
}[];
|
|
93
76
|
}
|
|
94
|
-
export interface DependencyBootstrapCandidate {
|
|
95
|
-
adapter: string;
|
|
96
|
-
kind: BootstrapKind;
|
|
97
|
-
lockfile: string;
|
|
98
|
-
target: string;
|
|
99
|
-
repairCommand: string;
|
|
100
|
-
seedable: boolean;
|
|
101
|
-
}
|
|
102
77
|
export declare function prepareDependencyBootstrap(mode: DependencyBootstrapMode, context: {
|
|
103
78
|
repoRoot: string;
|
|
104
79
|
currentRoot?: string;
|
|
105
80
|
detectionRoot?: string;
|
|
106
81
|
worktreePath: string;
|
|
107
|
-
checkUvRuntime?: (target: BootstrapTarget) => Promise<boolean>;
|
|
108
82
|
cargoBuildCommand?: string;
|
|
109
83
|
}): Promise<DependencyBootstrapPlan>;
|
|
110
|
-
export declare function detectDependencyBootstrapCandidate(context: {
|
|
111
|
-
repoRoot: string;
|
|
112
|
-
currentRoot?: string;
|
|
113
|
-
detectionRoot?: string;
|
|
114
|
-
worktreePath: string;
|
|
115
|
-
checkUvRuntime?: (target: BootstrapTarget) => Promise<boolean>;
|
|
116
|
-
cargoBuildCommand?: string;
|
|
117
|
-
}): Promise<DependencyBootstrapCandidate | null>;
|
|
118
84
|
export declare function previewDependencyBootstrap(plan: DependencyBootstrapPlan): DependencyBootstrapPreview;
|
|
119
85
|
export declare function executeDependencyBootstrap(plan: DependencyBootstrapPlan, options: DependencyBootstrapDependencies & {
|
|
120
86
|
reporter: DependencyBootstrapReporter;
|