@loucompanion/forge-bridge 0.1.1-dev.03b8ba168599

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 (80) hide show
  1. package/README.md +64 -0
  2. package/dist/bridge/bridge.base.d.ts +17 -0
  3. package/dist/bridge/bridge.base.js +1 -0
  4. package/dist/bridge/bridge.service.d.ts +45 -0
  5. package/dist/bridge/bridge.service.js +353 -0
  6. package/dist/bridge/bridge.types.d.ts +83 -0
  7. package/dist/bridge/bridge.types.js +1 -0
  8. package/dist/bridge/index.d.ts +2 -0
  9. package/dist/bridge/index.js +1 -0
  10. package/dist/bridge/internals.d.ts +3 -0
  11. package/dist/bridge/internals.js +1 -0
  12. package/dist/cleanup/cleanup.base.d.ts +4 -0
  13. package/dist/cleanup/cleanup.base.js +1 -0
  14. package/dist/cleanup/cleanup.service.d.ts +5 -0
  15. package/dist/cleanup/cleanup.service.js +5 -0
  16. package/dist/cleanup/cleanup.types.d.ts +6 -0
  17. package/dist/cleanup/cleanup.types.js +1 -0
  18. package/dist/cleanup/index.d.ts +2 -0
  19. package/dist/cleanup/index.js +1 -0
  20. package/dist/cleanup/internals.d.ts +3 -0
  21. package/dist/cleanup/internals.js +1 -0
  22. package/dist/cli/bin.d.ts +2 -0
  23. package/dist/cli/bin.js +4 -0
  24. package/dist/cli/cli.base.d.ts +7 -0
  25. package/dist/cli/cli.base.js +1 -0
  26. package/dist/cli/cli.service.d.ts +66 -0
  27. package/dist/cli/cli.service.js +770 -0
  28. package/dist/cli/index.d.ts +2 -0
  29. package/dist/cli/index.js +1 -0
  30. package/dist/cli/internals.d.ts +1 -0
  31. package/dist/cli/internals.js +1 -0
  32. package/dist/cli/local-config.d.ts +34 -0
  33. package/dist/cli/local-config.js +181 -0
  34. package/dist/config.d.ts +5 -0
  35. package/dist/config.js +8 -0
  36. package/dist/index.d.ts +7 -0
  37. package/dist/index.js +7 -0
  38. package/dist/session/index.d.ts +2 -0
  39. package/dist/session/index.js +1 -0
  40. package/dist/session/internals.d.ts +7 -0
  41. package/dist/session/internals.js +2 -0
  42. package/dist/session/provider-cli/index.d.ts +3 -0
  43. package/dist/session/provider-cli/index.js +1 -0
  44. package/dist/session/provider-cli/provider-cli.base.d.ts +7 -0
  45. package/dist/session/provider-cli/provider-cli.base.js +1 -0
  46. package/dist/session/provider-cli/provider-cli.service.d.ts +58 -0
  47. package/dist/session/provider-cli/provider-cli.service.js +705 -0
  48. package/dist/session/provider-cli/provider-cli.types.d.ts +13 -0
  49. package/dist/session/provider-cli/provider-cli.types.js +1 -0
  50. package/dist/session/session.base.d.ts +7 -0
  51. package/dist/session/session.base.js +1 -0
  52. package/dist/session/session.service.d.ts +10 -0
  53. package/dist/session/session.service.js +134 -0
  54. package/dist/session/session.types.d.ts +118 -0
  55. package/dist/session/session.types.js +197 -0
  56. package/dist/shared/git/git.d.ts +6 -0
  57. package/dist/shared/git/git.js +18 -0
  58. package/dist/shared/path/path.d.ts +4 -0
  59. package/dist/shared/path/path.js +29 -0
  60. package/dist/shared/process/process.d.ts +16 -0
  61. package/dist/shared/process/process.js +32 -0
  62. package/dist/shared/redaction/redaction.d.ts +2 -0
  63. package/dist/shared/redaction/redaction.js +30 -0
  64. package/dist/version.d.ts +1 -0
  65. package/dist/version.js +1 -0
  66. package/dist/worktree/artifact-injector.d.ts +11 -0
  67. package/dist/worktree/artifact-injector.js +104 -0
  68. package/dist/worktree/dependency-warmer.d.ts +32 -0
  69. package/dist/worktree/dependency-warmer.js +297 -0
  70. package/dist/worktree/index.d.ts +4 -0
  71. package/dist/worktree/index.js +2 -0
  72. package/dist/worktree/internals.d.ts +3 -0
  73. package/dist/worktree/internals.js +1 -0
  74. package/dist/worktree/worktree.base.d.ts +5 -0
  75. package/dist/worktree/worktree.base.js +1 -0
  76. package/dist/worktree/worktree.service.d.ts +16 -0
  77. package/dist/worktree/worktree.service.js +301 -0
  78. package/dist/worktree/worktree.types.d.ts +19 -0
  79. package/dist/worktree/worktree.types.js +1 -0
  80. package/package.json +52 -0
@@ -0,0 +1,2 @@
1
+ export { ForgeBridgeCliService } from "./cli.service.js";
2
+ export type { CliIo, CliService } from "./cli.base.js";
@@ -0,0 +1 @@
1
+ export { ForgeBridgeCliService } from "./cli.service.js";
@@ -0,0 +1 @@
1
+ export { parseArgs } from "./cli.service.js";
@@ -0,0 +1 @@
1
+ export { parseArgs } from "./cli.service.js";
@@ -0,0 +1,34 @@
1
+ import type { BridgeProviderStatus, BridgeRepoMapping, BridgeServiceConfig } from "../bridge/bridge.types.js";
2
+ export interface BridgeLocalConfig {
3
+ readonly schemaVersion: 1 | 2;
4
+ readonly serverUrl?: string;
5
+ readonly runnerId?: string;
6
+ readonly deviceToken?: string;
7
+ readonly deviceName?: string;
8
+ readonly defaultRepoRoot?: string;
9
+ readonly cleanupWorktrees?: boolean;
10
+ readonly cliProviders?: readonly string[];
11
+ readonly providerStatuses?: Readonly<Record<string, BridgeProviderStatus>>;
12
+ readonly projectLabels?: readonly string[];
13
+ readonly repoMappings?: readonly LocalRepoMapping[];
14
+ readonly sandboxProfiles?: readonly string[];
15
+ readonly supportsApiSecretGrant?: boolean;
16
+ readonly supportsManagedWorktrees?: boolean;
17
+ readonly supportsManagedForgeArtifacts?: boolean;
18
+ readonly supportsRunnerAuthoredPhaseArtifacts?: boolean;
19
+ }
20
+ export interface LocalRepoMapping extends BridgeRepoMapping {
21
+ readonly label: string;
22
+ readonly localPath: string;
23
+ }
24
+ export declare function resolveLocalConfigPath(): string;
25
+ export declare function readLocalConfig(): Promise<BridgeLocalConfig>;
26
+ export declare function readLocalConfigSync(): BridgeLocalConfig;
27
+ export declare function writeLocalConfig(config: BridgeLocalConfig): Promise<void>;
28
+ export declare function applyLocalConfigDefaults(config: BridgeServiceConfig, local: BridgeLocalConfig): BridgeServiceConfig;
29
+ export declare function addRepoMapping(label: string, repoPath: string): Promise<BridgeLocalConfig>;
30
+ export declare function removeRepoMapping(label: string): Promise<{
31
+ readonly config: BridgeLocalConfig;
32
+ readonly removed: boolean;
33
+ }>;
34
+ export declare function providerStatusesFor(providers: readonly string[]): Readonly<Record<string, BridgeProviderStatus>>;
@@ -0,0 +1,181 @@
1
+ import fs from "node:fs/promises";
2
+ import fsSync from "node:fs";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ export function resolveLocalConfigPath() {
6
+ if (process.env.FORGE_BRIDGE_CONFIG?.trim()) {
7
+ return path.resolve(process.env.FORGE_BRIDGE_CONFIG);
8
+ }
9
+ const base = process.env.XDG_CONFIG_HOME?.trim()
10
+ ? process.env.XDG_CONFIG_HOME
11
+ : process.platform === "win32" && process.env.APPDATA?.trim()
12
+ ? process.env.APPDATA
13
+ : path.join(os.homedir(), ".config");
14
+ return path.join(base, "forge", "bridge.json");
15
+ }
16
+ export async function readLocalConfig() {
17
+ return parseLocalConfig(await fs.readFile(resolveLocalConfigPath(), "utf8").catch((error) => {
18
+ if (error.code === "ENOENT") {
19
+ return "";
20
+ }
21
+ throw error;
22
+ }));
23
+ }
24
+ export function readLocalConfigSync() {
25
+ const configPath = resolveLocalConfigPath();
26
+ if (!fsSync.existsSync(configPath)) {
27
+ return emptyConfig();
28
+ }
29
+ return parseLocalConfig(fsSync.readFileSync(configPath, "utf8"));
30
+ }
31
+ export async function writeLocalConfig(config) {
32
+ const configPath = resolveLocalConfigPath();
33
+ await fs.mkdir(path.dirname(configPath), { recursive: true });
34
+ const tempPath = `${configPath}.${process.pid}.${Date.now()}.tmp`;
35
+ await fs.writeFile(tempPath, `${JSON.stringify(normalizeLocalConfig(config), null, 2)}\n`, "utf8");
36
+ await fs.rename(tempPath, configPath);
37
+ }
38
+ export function applyLocalConfigDefaults(config, local) {
39
+ const cliProviders = local.cliProviders && local.cliProviders.length > 0 ? [...local.cliProviders] : config.cliProviders;
40
+ return {
41
+ ...config,
42
+ serverUrl: process.env.FORGE_URL ?? local.serverUrl ?? config.serverUrl,
43
+ runnerId: process.env.FORGE_RUNNER_ID ?? local.runnerId ?? config.runnerId,
44
+ deviceToken: process.env.FORGE_DEVICE_TOKEN ?? local.deviceToken ?? config.deviceToken,
45
+ deviceName: process.env.FORGE_DEVICE_NAME ?? local.deviceName ?? config.deviceName,
46
+ defaultRepoRoot: process.env.FORGE_REPO_ROOT ?? local.defaultRepoRoot ?? config.defaultRepoRoot,
47
+ cleanupWorktrees: local.cleanupWorktrees ?? config.cleanupWorktrees,
48
+ cliProviders,
49
+ providerStatuses: normalizeProviderStatuses(local.providerStatuses) ?? providerStatusesFor(cliProviders),
50
+ projectLabels: local.projectLabels ?? config.projectLabels,
51
+ repoMappings: local.repoMappings ?? config.repoMappings,
52
+ sandboxProfiles: local.sandboxProfiles ?? config.sandboxProfiles,
53
+ supportsApiSecretGrant: local.supportsApiSecretGrant ?? config.supportsApiSecretGrant,
54
+ supportsManagedWorktrees: local.supportsManagedWorktrees ?? config.supportsManagedWorktrees,
55
+ supportsManagedForgeArtifacts: local.supportsManagedForgeArtifacts ?? config.supportsManagedForgeArtifacts,
56
+ supportsRunnerAuthoredPhaseArtifacts: local.supportsRunnerAuthoredPhaseArtifacts ?? config.supportsRunnerAuthoredPhaseArtifacts
57
+ };
58
+ }
59
+ export async function addRepoMapping(label, repoPath) {
60
+ const normalizedLabel = normalizeLabel(label);
61
+ const localPath = path.resolve(repoPath);
62
+ const stat = await fs.stat(localPath).catch(() => null);
63
+ if (!stat?.isDirectory()) {
64
+ throw new Error(`Repo path must be an existing directory: ${localPath}`);
65
+ }
66
+ const current = await readLocalConfig();
67
+ const mappings = [
68
+ ...((current.repoMappings ?? []).filter((mapping) => mapping.label.toLowerCase() !== normalizedLabel.toLowerCase())),
69
+ {
70
+ label: normalizedLabel,
71
+ name: normalizedLabel,
72
+ localPath
73
+ }
74
+ ].sort((left, right) => left.label.localeCompare(right.label));
75
+ const next = normalizeLocalConfig({ ...current, repoMappings: mappings });
76
+ await writeLocalConfig(next);
77
+ return next;
78
+ }
79
+ export async function removeRepoMapping(label) {
80
+ const normalizedLabel = normalizeLabel(label);
81
+ const current = await readLocalConfig();
82
+ const before = current.repoMappings ?? [];
83
+ const after = before.filter((mapping) => mapping.label.toLowerCase() !== normalizedLabel.toLowerCase());
84
+ const next = normalizeLocalConfig({ ...current, repoMappings: after });
85
+ await writeLocalConfig(next);
86
+ return { config: next, removed: after.length !== before.length };
87
+ }
88
+ export function providerStatusesFor(providers) {
89
+ return Object.fromEntries(providers.map((provider) => [provider, { signedIn: true, version: "", models: configuredModelsFor(provider) }]));
90
+ }
91
+ function parseLocalConfig(raw) {
92
+ if (!raw.trim()) {
93
+ return emptyConfig();
94
+ }
95
+ return normalizeLocalConfig(JSON.parse(raw));
96
+ }
97
+ function normalizeLocalConfig(config) {
98
+ return {
99
+ schemaVersion: 2,
100
+ serverUrl: cleanString(config.serverUrl),
101
+ runnerId: cleanString(config.runnerId),
102
+ deviceToken: cleanString(config.deviceToken),
103
+ deviceName: cleanString(config.deviceName),
104
+ defaultRepoRoot: cleanString(config.defaultRepoRoot),
105
+ cleanupWorktrees: config.cleanupWorktrees,
106
+ cliProviders: cleanList(config.cliProviders),
107
+ providerStatuses: normalizeProviderStatuses(config.providerStatuses),
108
+ projectLabels: cleanList(config.projectLabels),
109
+ repoMappings: normalizeRepoMappings(config.repoMappings),
110
+ sandboxProfiles: cleanList(config.sandboxProfiles),
111
+ supportsApiSecretGrant: config.supportsApiSecretGrant,
112
+ supportsManagedWorktrees: config.supportsManagedWorktrees,
113
+ supportsManagedForgeArtifacts: config.supportsManagedForgeArtifacts,
114
+ supportsRunnerAuthoredPhaseArtifacts: config.supportsRunnerAuthoredPhaseArtifacts
115
+ };
116
+ }
117
+ function emptyConfig() {
118
+ return {
119
+ schemaVersion: 2,
120
+ repoMappings: []
121
+ };
122
+ }
123
+ function normalizeProviderStatuses(values) {
124
+ if (!values)
125
+ return undefined;
126
+ const entries = [];
127
+ for (const [provider, status] of Object.entries(values)) {
128
+ const key = provider.trim();
129
+ if (!key)
130
+ continue;
131
+ entries.push([
132
+ key,
133
+ {
134
+ signedIn: status?.signedIn ?? true,
135
+ version: cleanString(status?.version),
136
+ models: cleanList(status?.models) ?? configuredModelsFor(key)
137
+ }
138
+ ]);
139
+ }
140
+ return entries.length > 0 ? Object.fromEntries(entries) : undefined;
141
+ }
142
+ function configuredModelsFor(provider) {
143
+ const envName = `FORGE_${provider.replace(/[^a-zA-Z0-9]/g, "_").toUpperCase()}_MODELS`;
144
+ return splitCsv(process.env[envName] ?? "");
145
+ }
146
+ function splitCsv(value) {
147
+ return value
148
+ .split(",")
149
+ .map((entry) => entry.trim())
150
+ .filter((entry) => entry.length > 0);
151
+ }
152
+ function normalizeRepoMappings(values) {
153
+ return (values ?? [])
154
+ .filter((mapping) => !!mapping.label?.trim() && !!mapping.localPath?.trim())
155
+ .map((mapping) => {
156
+ const label = normalizeLabel(mapping.label);
157
+ return {
158
+ label,
159
+ repoId: cleanString(mapping.repoId),
160
+ name: cleanString(mapping.name) ?? label,
161
+ remoteUrl: cleanString(mapping.remoteUrl),
162
+ localPath: path.resolve(mapping.localPath)
163
+ };
164
+ })
165
+ .sort((left, right) => left.label.localeCompare(right.label));
166
+ }
167
+ function normalizeLabel(value) {
168
+ const label = value.trim();
169
+ if (!label) {
170
+ throw new Error("Repo label is required.");
171
+ }
172
+ return label;
173
+ }
174
+ function cleanString(value) {
175
+ const clean = value?.trim();
176
+ return clean ? clean : undefined;
177
+ }
178
+ function cleanList(values) {
179
+ const clean = [...new Set((values ?? []).map((value) => value.trim()).filter(Boolean))];
180
+ return clean.length > 0 ? clean : undefined;
181
+ }
@@ -0,0 +1,5 @@
1
+ export interface ForgeBridgeConfig {
2
+ readonly defaultRepoRoot: string;
3
+ readonly cleanupWorktrees: boolean;
4
+ }
5
+ export declare function defaultForgeBridgeConfig(): ForgeBridgeConfig;
package/dist/config.js ADDED
@@ -0,0 +1,8 @@
1
+ import os from "node:os";
2
+ import path from "node:path";
3
+ export function defaultForgeBridgeConfig() {
4
+ return {
5
+ defaultRepoRoot: path.join(os.tmpdir(), "forge-phase5-repos"),
6
+ cleanupWorktrees: true
7
+ };
8
+ }
@@ -0,0 +1,7 @@
1
+ export * from "./version.js";
2
+ export * from "./config.js";
3
+ export * from "./bridge/index.js";
4
+ export * from "./cli/index.js";
5
+ export * from "./session/index.js";
6
+ export * from "./worktree/index.js";
7
+ export * from "./cleanup/index.js";
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ export * from "./version.js";
2
+ export * from "./config.js";
3
+ export * from "./bridge/index.js";
4
+ export * from "./cli/index.js";
5
+ export * from "./session/index.js";
6
+ export * from "./worktree/index.js";
7
+ export * from "./cleanup/index.js";
@@ -0,0 +1,2 @@
1
+ export { BridgeSessionService } from "./session.service.js";
2
+ export type { SessionService } from "./session.base.js";
@@ -0,0 +1 @@
1
+ export { BridgeSessionService } from "./session.service.js";
@@ -0,0 +1,7 @@
1
+ export { parseRunOnceDispatchPacket, failureResult } from "./session.types.js";
2
+ export type { SessionEventSink, SessionService } from "./session.base.js";
3
+ export type { ApiKeySecretGrant, DispatchCycleRun, DispatchExecution, DispatchLease, DispatchSession, DispatchRepo, DispatchServerLocalConfig, DispatchWorkItem, RunOnceDispatchPacket, RunOnceResultPacket, RunnerDispatchArtifact, RunnerDispatchEvent, RunnerDispatchSpec, RunnerEventLine } from "./session.types.js";
4
+ export { DeterministicProviderCliService, ProcessBackedProviderCliService, RoutingProviderCliService, buildProviderCliCommand } from "./provider-cli/provider-cli.service.js";
5
+ export type { ProviderCliService } from "./provider-cli/provider-cli.base.js";
6
+ export type { ProviderCliCommand, ProviderProcessRunner, ProviderProcessRunRequest, ProviderProcessRunResult } from "./provider-cli/provider-cli.service.js";
7
+ export type { ProviderCliRunContext, ProviderCliRunResult } from "./provider-cli/provider-cli.types.js";
@@ -0,0 +1,2 @@
1
+ export { parseRunOnceDispatchPacket, failureResult } from "./session.types.js";
2
+ export { DeterministicProviderCliService, ProcessBackedProviderCliService, RoutingProviderCliService, buildProviderCliCommand } from "./provider-cli/provider-cli.service.js";
@@ -0,0 +1,3 @@
1
+ export { DeterministicProviderCliService, ProcessBackedProviderCliService, RoutingProviderCliService, buildProviderCliCommand } from "./provider-cli.service.js";
2
+ export type { ProviderCliService } from "./provider-cli.base.js";
3
+ export type { ProviderCliCommand, ProviderProcessRunner, ProviderProcessRunRequest, ProviderProcessRunResult } from "./provider-cli.service.js";
@@ -0,0 +1 @@
1
+ export { DeterministicProviderCliService, ProcessBackedProviderCliService, RoutingProviderCliService, buildProviderCliCommand } from "./provider-cli.service.js";
@@ -0,0 +1,7 @@
1
+ import type { ProviderCliRunContext, ProviderCliRunResult } from "./provider-cli.types.js";
2
+ import type { RunOnceDispatchPacket, RunnerDispatchEvent } from "../session.types.js";
3
+ export interface ProviderCliService {
4
+ runImplementation(context: ProviderCliRunContext): Promise<ProviderCliRunResult>;
5
+ runConflictResolve(context: ProviderCliRunContext): Promise<ProviderCliRunResult>;
6
+ runQa(dispatch: RunOnceDispatchPacket, emit: (event: RunnerDispatchEvent) => Promise<void>, signal?: AbortSignal): Promise<ProviderCliRunResult>;
7
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,58 @@
1
+ import { GitClient } from "../../shared/git/git.js";
2
+ import type { ProviderCliService } from "./provider-cli.base.js";
3
+ import type { ProviderCliRunContext, ProviderCliRunResult } from "./provider-cli.types.js";
4
+ import type { RunOnceDispatchPacket, RunnerDispatchEvent } from "../session.types.js";
5
+ export interface ProviderCliCommand {
6
+ readonly command: string;
7
+ readonly args: readonly string[];
8
+ }
9
+ export interface ProviderProcessRunRequest {
10
+ readonly command: string;
11
+ readonly args: readonly string[];
12
+ readonly cwd: string;
13
+ }
14
+ export interface ProviderProcessRunResult {
15
+ readonly exitCode: number;
16
+ readonly stdout: string;
17
+ readonly stderr: string;
18
+ }
19
+ export interface ProviderProcessRunner {
20
+ run(request: ProviderProcessRunRequest, handlers?: ProviderProcessHandlers, signal?: AbortSignal): Promise<ProviderProcessRunResult>;
21
+ }
22
+ export interface ProviderProcessHandlers {
23
+ onStdoutLine?(line: string): Promise<void> | void;
24
+ onStderrLine?(line: string): Promise<void> | void;
25
+ }
26
+ export declare class RoutingProviderCliService implements ProviderCliService {
27
+ private readonly realProvider;
28
+ private readonly deterministicProvider;
29
+ constructor(realProvider?: ProviderCliService, deterministicProvider?: ProviderCliService);
30
+ runImplementation(context: ProviderCliRunContext): Promise<ProviderCliRunResult>;
31
+ runConflictResolve(context: ProviderCliRunContext): Promise<ProviderCliRunResult>;
32
+ runQa(dispatch: RunOnceDispatchPacket, emit: (event: RunnerDispatchEvent) => Promise<void>, signal?: AbortSignal): Promise<ProviderCliRunResult>;
33
+ }
34
+ export declare class ProcessBackedProviderCliService implements ProviderCliService {
35
+ private readonly processRunner;
36
+ private readonly git;
37
+ constructor(processRunner?: ProviderProcessRunner, git?: GitClient);
38
+ runImplementation(context: ProviderCliRunContext): Promise<ProviderCliRunResult>;
39
+ runQa(dispatch: RunOnceDispatchPacket, emit: (event: RunnerDispatchEvent) => Promise<void>, signal?: AbortSignal): Promise<ProviderCliRunResult>;
40
+ runConflictResolve(context: ProviderCliRunContext): Promise<ProviderCliRunResult>;
41
+ }
42
+ export declare class DeterministicProviderCliService implements ProviderCliService {
43
+ private readonly git;
44
+ constructor(git?: GitClient);
45
+ runImplementation(context: ProviderCliRunContext): Promise<ProviderCliRunResult>;
46
+ runQa(dispatch: RunOnceDispatchPacket, emit: (event: RunnerDispatchEvent) => Promise<void>): Promise<ProviderCliRunResult>;
47
+ runConflictResolve(context: ProviderCliRunContext): Promise<ProviderCliRunResult>;
48
+ }
49
+ export declare class StreamingProviderProcessRunner implements ProviderProcessRunner {
50
+ run(request: ProviderProcessRunRequest, handlers?: ProviderProcessHandlers, signal?: AbortSignal): Promise<ProviderProcessRunResult>;
51
+ }
52
+ export declare function chooseWindowsCommandCandidate(candidates: readonly string[]): string | null;
53
+ export declare function buildWindowsLaunchCommand(commandPath: string, args: readonly string[]): ProviderCliCommand;
54
+ export declare function formatProviderCliCommand(command: ProviderCliCommand): string;
55
+ export declare function buildProviderCliCommand(dispatch: RunOnceDispatchPacket, run?: {
56
+ readonly prompt?: string;
57
+ readonly worktreePath?: string;
58
+ }): ProviderCliCommand;