@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.
Files changed (55) hide show
  1. package/dist/bootstrap-output.d.ts +3 -2
  2. package/dist/bootstrap-output.js +1 -16
  3. package/dist/bootstrap-preview.d.ts +2 -3
  4. package/dist/bootstrap-preview.js +1 -11
  5. package/dist/cli.js +5 -1
  6. package/dist/config.d.ts +3 -13
  7. package/dist/config.js +12 -59
  8. package/dist/dependency-bootstrap.d.ts +11 -45
  9. package/dist/dependency-bootstrap.js +142 -608
  10. package/dist/gji-bundle.mjs +567 -2367
  11. package/dist/new.d.ts +4 -5
  12. package/dist/new.js +10 -45
  13. package/dist/pr.d.ts +4 -5
  14. package/dist/pr.js +9 -69
  15. package/dist/shell-completion.js +7 -5
  16. package/dist/uv-validation.d.ts +4 -0
  17. package/dist/uv-validation.js +210 -0
  18. package/dist/worktree-bootstrap.d.ts +5 -16
  19. package/dist/worktree-bootstrap.js +1 -24
  20. package/man/man1/gji-back.1 +1 -1
  21. package/man/man1/gji-clean.1 +1 -1
  22. package/man/man1/gji-completion.1 +1 -1
  23. package/man/man1/gji-config.1 +1 -1
  24. package/man/man1/gji-doctor.1 +1 -1
  25. package/man/man1/gji-done.1 +1 -1
  26. package/man/man1/gji-go.1 +1 -1
  27. package/man/man1/gji-history.1 +1 -1
  28. package/man/man1/gji-init.1 +1 -1
  29. package/man/man1/gji-ls.1 +1 -1
  30. package/man/man1/gji-new.1 +8 -5
  31. package/man/man1/gji-open.1 +1 -1
  32. package/man/man1/gji-pr.1 +6 -3
  33. package/man/man1/gji-remove.1 +1 -1
  34. package/man/man1/gji-root.1 +1 -1
  35. package/man/man1/gji-run-hook.1 +1 -1
  36. package/man/man1/gji-status.1 +1 -1
  37. package/man/man1/gji-sync-files.1 +1 -1
  38. package/man/man1/gji-sync.1 +1 -1
  39. package/man/man1/gji-task.1 +1 -1
  40. package/man/man1/gji-undo.1 +1 -1
  41. package/man/man1/gji-warp.1 +1 -1
  42. package/man/man1/gji.1 +2 -2
  43. package/package.json +1 -1
  44. package/dist/dependency-bootstrap-prompt.d.ts +0 -24
  45. package/dist/dependency-bootstrap-prompt.js +0 -103
  46. package/dist/dir-clone.d.ts +0 -32
  47. package/dist/dir-clone.js +0 -641
  48. package/dist/install-prompt.d.ts +0 -12
  49. package/dist/install-prompt.js +0 -127
  50. package/dist/package-manager.d.ts +0 -5
  51. package/dist/package-manager.js +0 -159
  52. package/dist/sync-directories.d.ts +0 -29
  53. package/dist/sync-directories.js +0 -77
  54. package/dist/sync-plan.d.ts +0 -16
  55. package/dist/sync-plan.js +0 -128
@@ -1,3 +1,4 @@
1
1
  import type { DependencyBootstrapReporter } from "./dependency-bootstrap.js";
2
- import type { SyncDirectoryReporter } from "./sync-directories.js";
3
- export declare function createBootstrapReporter(write: (chunk: string) => void, json: boolean, measureCloneSize?: boolean): SyncDirectoryReporter & DependencyBootstrapReporter;
2
+ export declare function createBootstrapReporter(write: (chunk: string) => void, json: boolean): DependencyBootstrapReporter & {
3
+ write: (chunk: string) => void;
4
+ };
@@ -1,18 +1,6 @@
1
- import { formatBytes } from "./format-bytes.js";
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 "./config.js";
2
- import { type BootstrapTarget, type DependencyBootstrapPreview } from "./dependency-bootstrap.js";
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, strategy }) => `Would ${formatBootstrapStrategy(strategy)} ${target} with ${adapter}\n`)
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 and CoW-bootstrap configured directories")
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 DependencyBootstrapMode = "off" | "cow-then-repair" | "install-only";
7
+ export type DependencyBootstrapSetting = "off";
8
8
  export interface EffectiveGjiConfig extends GjiConfig {
9
9
  branchPrefix?: string;
10
10
  dependencyBuildCommand?: string;
11
- dependencyBootstrap?: DependencyBootstrapMode;
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 validateSyncDirsConfig(value: unknown): void;
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, isAbsolute, join, normalize, resolve, win32, } from "node:path";
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
- export function validateSyncDirsConfig(value) {
167
- normalizeSyncDirsConfig(value);
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
- value !== "cow-then-repair" &&
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 = "seeded" | "repaired" | "installed" | "repair-only" | "skipped" | "failed";
6
- export type BootstrapStrategy = "cow-then-repair" | "repair-only" | "install-only";
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: string;
28
- targetPath: string;
29
- repairCommand: string;
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
- seedPath(target: BootstrapTarget): string;
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
- repairCommand: string;
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;