@kb-labs/adapters-workspace-worktree 2.94.0 → 2.98.0

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/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { IWorkspaceProvider, MaterializeWorkspaceRequest, WorkspaceDescriptor, AttachWorkspaceRequest, WorkspaceAttachment, WorkspaceStatusResult, WorkspaceProviderCapabilities } from '@kb-labs/core-platform';
1
+ import { IWorkspaceProvider, MaterializeWorkspaceRequest, WorkspaceDescriptor, AttachWorkspaceRequest, WorkspaceAttachment, WorkspaceStatusResult, WorkspaceProviderCapabilities } from '@kb-labs/sdk/adapters';
2
2
  export { manifest } from './manifest.js';
3
3
 
4
4
  interface WorkspaceContext {
@@ -9,6 +9,18 @@ interface WorktreeWorkspaceAdapterConfig {
9
9
  branch?: string;
10
10
  initSubmodules?: boolean;
11
11
  installDeps?: boolean;
12
+ /**
13
+ * Relative paths (from repo root) of tool dist/ directories to symlink from the
14
+ * platform into the worktree. Only link tool binaries the agent should never
15
+ * rebuild — package dist/ directories are left absent so agent builds write into
16
+ * the worktree, not the platform.
17
+ *
18
+ * Default: ['cli/bin/dist'] — makes `pnpm kb` resolve to the platform's CLI.
19
+ * Set to [] to disable all symlinking.
20
+ */
21
+ toolDistPaths?: string[];
22
+ /** @deprecated use toolDistPaths: [] to disable */
23
+ symlinkPlatformDist?: boolean;
12
24
  workspace?: WorkspaceContext;
13
25
  }
14
26
  declare class WorktreeWorkspaceAdapter implements IWorkspaceProvider {
@@ -17,13 +29,27 @@ declare class WorktreeWorkspaceAdapter implements IWorkspaceProvider {
17
29
  private readonly defaultBranch;
18
30
  private readonly initSubmodules;
19
31
  private readonly installDeps;
32
+ private readonly toolDistPaths;
20
33
  private readonly records;
21
34
  constructor(config?: WorktreeWorkspaceAdapterConfig);
22
35
  materialize(request: MaterializeWorkspaceRequest): Promise<WorkspaceDescriptor>;
23
36
  attach(_request: AttachWorkspaceRequest): Promise<WorkspaceAttachment>;
24
37
  release(workspaceId: string): Promise<void>;
38
+ destroy(workspaceId: string): Promise<void>;
39
+ startupCleanup(): Promise<void>;
25
40
  getStatus(workspaceId: string): Promise<WorkspaceStatusResult>;
26
41
  getCapabilities(): WorkspaceProviderCapabilities;
42
+ /**
43
+ * Symlink specific platform tool dist directories into the worktree.
44
+ *
45
+ * Only tool binaries that the agent should never rebuild are linked (e.g. the kb CLI).
46
+ * Package dist/ directories that the agent may build are intentionally left absent so
47
+ * agent builds write into the worktree, not the platform.
48
+ *
49
+ * Default tool paths to link (relative to repo root):
50
+ * cli/bin/dist — makes `pnpm kb` resolve to the platform's compiled CLI binary
51
+ */
52
+ private symlinkDistFromPlatform;
27
53
  private exec;
28
54
  }
29
55
  /**
package/dist/index.js CHANGED
@@ -1,5 +1,6 @@
1
- import { execSync } from 'child_process';
2
- import { existsSync, mkdirSync, rmSync } from 'fs';
1
+ import { exec } from 'child_process';
2
+ import { promisify } from 'util';
3
+ import { existsSync, mkdirSync, rmSync, readdirSync, symlinkSync } from 'fs';
3
4
  import path from 'path';
4
5
  import { randomUUID } from 'crypto';
5
6
 
@@ -44,6 +45,7 @@ var manifest = {
44
45
  };
45
46
 
46
47
  // src/index.ts
48
+ var execAsync = promisify(exec);
47
49
  var TIMEOUTS = {
48
50
  worktree: 3e4,
49
51
  submodules: 6e5,
@@ -56,6 +58,7 @@ var WorktreeWorkspaceAdapter = class {
56
58
  defaultBranch;
57
59
  initSubmodules;
58
60
  installDeps;
61
+ toolDistPaths;
59
62
  records = /* @__PURE__ */ new Map();
60
63
  constructor(config = {}) {
61
64
  this.repoRoot = path.resolve(config.workspace?.cwd ?? process.cwd());
@@ -63,6 +66,7 @@ var WorktreeWorkspaceAdapter = class {
63
66
  this.defaultBranch = config.branch ?? "main";
64
67
  this.initSubmodules = config.initSubmodules ?? true;
65
68
  this.installDeps = config.installDeps ?? true;
69
+ this.toolDistPaths = config.toolDistPaths ?? (config.symlinkPlatformDist === false ? [] : ["cli/bin/dist"]);
66
70
  }
67
71
  async materialize(request) {
68
72
  const workspaceId = request.workspaceId ?? `wt_${randomUUID().slice(0, 8)}`;
@@ -76,6 +80,7 @@ var WorktreeWorkspaceAdapter = class {
76
80
  if (existsSync(worktreePath)) {
77
81
  const existing = this.records.get(workspaceId);
78
82
  if (existing) {
83
+ existing.refCount++;
79
84
  onProgress?.({ stage: "reuse", message: "Reusing existing worktree", progress: 100 });
80
85
  return {
81
86
  workspaceId,
@@ -89,7 +94,7 @@ var WorktreeWorkspaceAdapter = class {
89
94
  }
90
95
  onProgress?.({ stage: "reuse", message: "Reusing existing worktree (recovered)", progress: 100 });
91
96
  const now = (/* @__PURE__ */ new Date()).toISOString();
92
- this.records.set(workspaceId, { workspaceId, worktreePath, branch, status: "ready", createdAt: now, runId });
97
+ this.records.set(workspaceId, { workspaceId, worktreePath, branch, status: "ready", createdAt: now, runId, refCount: 1 });
93
98
  return {
94
99
  workspaceId,
95
100
  provider: "worktree",
@@ -109,7 +114,7 @@ var WorktreeWorkspaceAdapter = class {
109
114
  };
110
115
  try {
111
116
  progress("worktree", `Creating worktree from ${safeBranch}...`, 10);
112
- this.exec(
117
+ await this.exec(
113
118
  `git worktree add --detach "${worktreePath}" ${safeBranch}`,
114
119
  this.repoRoot,
115
120
  TIMEOUTS.worktree
@@ -117,7 +122,7 @@ var WorktreeWorkspaceAdapter = class {
117
122
  progress("worktree", "Worktree created", 25);
118
123
  if (this.initSubmodules) {
119
124
  progress("submodules", "Initializing submodules...", 30);
120
- this.exec(
125
+ await this.exec(
121
126
  "git submodule update --recursive",
122
127
  worktreePath,
123
128
  TIMEOUTS.submodules
@@ -126,12 +131,17 @@ var WorktreeWorkspaceAdapter = class {
126
131
  }
127
132
  if (this.installDeps) {
128
133
  progress("dependencies", "Installing dependencies (pnpm install)...", 65);
129
- this.exec(
134
+ await this.exec(
130
135
  "pnpm install --frozen-lockfile",
131
136
  worktreePath,
132
137
  TIMEOUTS.install
133
138
  );
134
- progress("dependencies", "Dependencies installed", 95);
139
+ progress("dependencies", "Dependencies installed", 90);
140
+ }
141
+ if (this.toolDistPaths.length > 0) {
142
+ progress("dist-links", "Linking platform tool binaries...", 95);
143
+ await this.symlinkDistFromPlatform(worktreePath);
144
+ progress("dist-links", "Tool binaries linked", 98);
135
145
  }
136
146
  progress("ready", "Workspace ready", 100);
137
147
  const record = {
@@ -140,7 +150,8 @@ var WorktreeWorkspaceAdapter = class {
140
150
  branch,
141
151
  status: "ready",
142
152
  createdAt: (/* @__PURE__ */ new Date()).toISOString(),
143
- runId
153
+ runId,
154
+ refCount: 1
144
155
  };
145
156
  this.records.set(workspaceId, record);
146
157
  return {
@@ -155,7 +166,7 @@ var WorktreeWorkspaceAdapter = class {
155
166
  } catch (error) {
156
167
  progress("failed", `Provisioning failed: ${error instanceof Error ? error.message : String(error)}`);
157
168
  try {
158
- this.exec(`git worktree remove "${worktreePath}" --force`, this.repoRoot, TIMEOUTS.cleanup);
169
+ await this.exec(`git worktree remove "${worktreePath}" --force`, this.repoRoot, TIMEOUTS.cleanup);
159
170
  } catch {
160
171
  }
161
172
  throw new Error(
@@ -172,24 +183,50 @@ var WorktreeWorkspaceAdapter = class {
172
183
  };
173
184
  }
174
185
  async release(workspaceId) {
186
+ const record = this.records.get(workspaceId);
187
+ if (!record) {
188
+ return;
189
+ }
190
+ record.refCount--;
191
+ record.status = "released";
192
+ }
193
+ async destroy(workspaceId) {
175
194
  const record = this.records.get(workspaceId);
176
195
  if (!record) {
177
196
  return;
178
197
  }
179
198
  try {
180
- this.exec(`git worktree remove "${record.worktreePath}" --force`, this.repoRoot, TIMEOUTS.cleanup);
199
+ await this.exec(`git worktree remove "${record.worktreePath}" --force`, this.repoRoot, TIMEOUTS.cleanup);
181
200
  } catch {
182
201
  if (existsSync(record.worktreePath)) {
183
202
  rmSync(record.worktreePath, { recursive: true, force: true });
184
203
  }
185
204
  try {
186
- this.exec("git worktree prune", this.repoRoot, TIMEOUTS.cleanup);
205
+ await this.exec("git worktree prune", this.repoRoot, TIMEOUTS.cleanup);
187
206
  } catch {
188
207
  }
189
208
  }
190
- record.status = "released";
191
209
  this.records.delete(workspaceId);
192
210
  }
211
+ async startupCleanup() {
212
+ if (!existsSync(this.worktreeBaseDir)) {
213
+ return;
214
+ }
215
+ const entries = readdirSync(this.worktreeBaseDir);
216
+ for (const entry of entries) {
217
+ const worktreePath = path.join(this.worktreeBaseDir, entry);
218
+ try {
219
+ await this.exec(`git worktree remove "${worktreePath}" --force`, this.repoRoot, TIMEOUTS.cleanup);
220
+ } catch {
221
+ rmSync(worktreePath, { recursive: true, force: true });
222
+ }
223
+ }
224
+ try {
225
+ await this.exec("git worktree prune", this.repoRoot, TIMEOUTS.cleanup);
226
+ } catch {
227
+ }
228
+ this.records.clear();
229
+ }
193
230
  async getStatus(workspaceId) {
194
231
  const record = this.records.get(workspaceId);
195
232
  if (!record) {
@@ -208,13 +245,34 @@ var WorktreeWorkspaceAdapter = class {
208
245
  supportsRelease: true
209
246
  };
210
247
  }
211
- exec(command, cwd, timeout = 6e4) {
212
- return execSync(command, {
213
- cwd,
214
- encoding: "utf8",
215
- timeout,
216
- stdio: ["pipe", "pipe", "pipe"]
217
- });
248
+ /**
249
+ * Symlink specific platform tool dist directories into the worktree.
250
+ *
251
+ * Only tool binaries that the agent should never rebuild are linked (e.g. the kb CLI).
252
+ * Package dist/ directories that the agent may build are intentionally left absent so
253
+ * agent builds write into the worktree, not the platform.
254
+ *
255
+ * Default tool paths to link (relative to repo root):
256
+ * cli/bin/dist — makes `pnpm kb` resolve to the platform's compiled CLI binary
257
+ */
258
+ async symlinkDistFromPlatform(worktreePath) {
259
+ const toolDists = this.toolDistPaths;
260
+ for (const relative of toolDists) {
261
+ const platDist = path.join(this.repoRoot, relative);
262
+ if (!existsSync(platDist)) continue;
263
+ const worktreeDist = path.join(worktreePath, relative);
264
+ if (!existsSync(worktreeDist)) {
265
+ mkdirSync(path.dirname(worktreeDist), { recursive: true });
266
+ try {
267
+ symlinkSync(platDist, worktreeDist, "dir");
268
+ } catch {
269
+ }
270
+ }
271
+ }
272
+ }
273
+ async exec(command, cwd, timeout = 6e4) {
274
+ const { stdout } = await execAsync(command, { cwd, encoding: "utf8", timeout });
275
+ return stdout;
218
276
  }
219
277
  };
220
278
  function createAdapter(config = {}) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/manifest.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { AdapterManifest } from '@kb-labs/core-platform';\n\nexport const manifest: AdapterManifest = {\n manifestVersion: '1.0.0',\n id: 'worktree-workspace-provider',\n name: 'Git Worktree Workspace Provider',\n version: '0.1.0',\n description: 'Creates isolated git worktrees for pipeline execution',\n author: 'KB Labs Team',\n license: 'KBPL-1.1',\n type: 'core',\n implements: 'IWorkspaceProvider',\n contexts: ['workspace'],\n capabilities: {\n custom: {\n provider: 'worktree',\n isolation: true,\n gitSubmodules: true,\n },\n },\n configSchema: {\n worktreeDir: {\n type: 'string',\n default: '.worktrees',\n description: 'Directory where worktrees are created (relative to repo root)',\n },\n branch: {\n type: 'string',\n default: 'main',\n description: 'Default branch to create worktrees from',\n },\n initSubmodules: {\n type: 'boolean',\n default: true,\n description: 'Initialize git submodules in worktree',\n },\n },\n};\n","import { execSync } from 'node:child_process';\nimport { existsSync, mkdirSync, rmSync } from 'node:fs';\nimport path from 'node:path';\nimport { randomUUID } from 'node:crypto';\nimport type {\n IWorkspaceProvider,\n MaterializeWorkspaceRequest,\n WorkspaceDescriptor,\n AttachWorkspaceRequest,\n WorkspaceAttachment,\n WorkspaceStatusResult,\n WorkspaceProviderCapabilities,\n WorkspaceStatus,\n} from '@kb-labs/core-platform';\n\nexport { manifest } from './manifest.js';\n\ninterface WorkspaceContext {\n cwd?: string;\n}\n\nexport interface WorktreeWorkspaceAdapterConfig {\n worktreeDir?: string;\n branch?: string;\n initSubmodules?: boolean;\n installDeps?: boolean;\n workspace?: WorkspaceContext;\n}\n\ninterface WorktreeRecord {\n workspaceId: string;\n worktreePath: string;\n branch: string;\n status: WorkspaceStatus;\n createdAt: string;\n runId?: string;\n}\n\nconst TIMEOUTS = {\n worktree: 30_000,\n submodules: 600_000,\n install: 300_000,\n cleanup: 30_000,\n} as const;\n\nexport class WorktreeWorkspaceAdapter implements IWorkspaceProvider {\n private readonly repoRoot: string;\n private readonly worktreeBaseDir: string;\n private readonly defaultBranch: string;\n private readonly initSubmodules: boolean;\n private readonly installDeps: boolean;\n private readonly records = new Map<string, WorktreeRecord>();\n\n constructor(config: WorktreeWorkspaceAdapterConfig = {}) {\n this.repoRoot = path.resolve(config.workspace?.cwd ?? process.cwd());\n this.worktreeBaseDir = path.resolve(this.repoRoot, config.worktreeDir ?? '.worktrees');\n this.defaultBranch = config.branch ?? 'main';\n this.initSubmodules = config.initSubmodules ?? true;\n this.installDeps = config.installDeps ?? true;\n }\n\n async materialize(request: MaterializeWorkspaceRequest): Promise<WorkspaceDescriptor> {\n const workspaceId = request.workspaceId ?? `wt_${randomUUID().slice(0, 8)}`;\n const branch = request.sourceRef ?? this.defaultBranch;\n const runId = (request.metadata as Record<string, unknown>)?.runId as string | undefined;\n const onProgress = request.onProgress;\n\n if (!existsSync(this.worktreeBaseDir)) {\n mkdirSync(this.worktreeBaseDir, { recursive: true });\n }\n\n const worktreePath = path.join(this.worktreeBaseDir, workspaceId);\n\n // Reuse existing worktree (retry scenario — same run, same workspace)\n if (existsSync(worktreePath)) {\n const existing = this.records.get(workspaceId);\n if (existing) {\n onProgress?.({ stage: 'reuse', message: 'Reusing existing worktree', progress: 100 });\n return {\n workspaceId,\n provider: 'worktree',\n status: 'ready',\n rootPath: worktreePath,\n createdAt: existing.createdAt,\n updatedAt: new Date().toISOString(),\n metadata: { branch, runId, repoRoot: this.repoRoot, reused: true },\n };\n }\n // Worktree exists on disk but not in records (stale) — reuse anyway\n onProgress?.({ stage: 'reuse', message: 'Reusing existing worktree (recovered)', progress: 100 });\n const now = new Date().toISOString();\n this.records.set(workspaceId, { workspaceId, worktreePath, branch, status: 'ready', createdAt: now, runId });\n return {\n workspaceId,\n provider: 'worktree',\n status: 'ready',\n rootPath: worktreePath,\n createdAt: now,\n updatedAt: now,\n metadata: { branch, runId, repoRoot: this.repoRoot, reused: true },\n };\n }\n\n const safeBranch = branch.replace(/[^a-zA-Z0-9_\\-./]/g, '');\n if (!safeBranch || safeBranch !== branch) {\n throw new Error(`Invalid branch name: ${branch}`);\n }\n\n const progress = (stage: string, message: string, pct?: number) => {\n onProgress?.({ stage, message, progress: pct });\n };\n\n try {\n // Stage 1: Create worktree\n progress('worktree', `Creating worktree from ${safeBranch}...`, 10);\n this.exec(\n `git worktree add --detach \"${worktreePath}\" ${safeBranch}`,\n this.repoRoot,\n TIMEOUTS.worktree,\n );\n progress('worktree', 'Worktree created', 25);\n\n // Stage 2: Initialize submodules\n if (this.initSubmodules) {\n progress('submodules', 'Initializing submodules...', 30);\n this.exec(\n 'git submodule update --recursive',\n worktreePath,\n TIMEOUTS.submodules,\n );\n progress('submodules', 'Submodules ready', 60);\n }\n\n // Stage 3: Install dependencies\n if (this.installDeps) {\n progress('dependencies', 'Installing dependencies (pnpm install)...', 65);\n this.exec(\n 'pnpm install --frozen-lockfile',\n worktreePath,\n TIMEOUTS.install,\n );\n progress('dependencies', 'Dependencies installed', 95);\n }\n\n progress('ready', 'Workspace ready', 100);\n\n const record: WorktreeRecord = {\n workspaceId,\n worktreePath,\n branch,\n status: 'ready',\n createdAt: new Date().toISOString(),\n runId,\n };\n this.records.set(workspaceId, record);\n\n return {\n workspaceId,\n provider: 'worktree',\n status: 'ready',\n rootPath: worktreePath,\n createdAt: record.createdAt,\n updatedAt: record.createdAt,\n metadata: { branch, runId, repoRoot: this.repoRoot },\n };\n } catch (error) {\n progress('failed', `Provisioning failed: ${error instanceof Error ? error.message : String(error)}`);\n\n try {\n this.exec(`git worktree remove \"${worktreePath}\" --force`, this.repoRoot, TIMEOUTS.cleanup);\n } catch { /* ignore cleanup errors */ }\n\n throw new Error(\n `Failed to provision workspace: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n async attach(_request: AttachWorkspaceRequest): Promise<WorkspaceAttachment> {\n return {\n workspaceId: _request.workspaceId,\n environmentId: _request.environmentId,\n mountPath: this.records.get(_request.workspaceId)?.worktreePath,\n attachedAt: new Date().toISOString(),\n };\n }\n\n async release(workspaceId: string): Promise<void> {\n const record = this.records.get(workspaceId);\n if (!record) {\n return;\n }\n\n try {\n this.exec(`git worktree remove \"${record.worktreePath}\" --force`, this.repoRoot, TIMEOUTS.cleanup);\n } catch {\n if (existsSync(record.worktreePath)) {\n rmSync(record.worktreePath, { recursive: true, force: true });\n }\n try {\n this.exec('git worktree prune', this.repoRoot, TIMEOUTS.cleanup);\n } catch { /* ignore */ }\n }\n\n record.status = 'released';\n this.records.delete(workspaceId);\n }\n\n async getStatus(workspaceId: string): Promise<WorkspaceStatusResult> {\n const record = this.records.get(workspaceId);\n if (!record) {\n return { workspaceId, status: 'released', updatedAt: new Date().toISOString() };\n }\n\n const exists = existsSync(record.worktreePath);\n return {\n workspaceId,\n status: exists ? record.status : 'failed',\n updatedAt: record.createdAt,\n };\n }\n\n getCapabilities(): WorkspaceProviderCapabilities {\n return {\n supportsAttach: true,\n supportsRelease: true,\n };\n }\n\n private exec(command: string, cwd: string, timeout = 60_000): string {\n return execSync(command, {\n cwd,\n encoding: 'utf8',\n timeout,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n }\n}\n\n/**\n * Adapter factory — called by platform adapter loader.\n */\nexport function createAdapter(config: WorktreeWorkspaceAdapterConfig = {}): WorktreeWorkspaceAdapter {\n return new WorktreeWorkspaceAdapter(config);\n}\n"]}
1
+ {"version":3,"sources":["../src/manifest.ts","../src/index.ts"],"names":[],"mappings":";;;;;;;;;AAEO,IAAM,QAAA,GAA4B;AAAA,EACvC,eAAA,EAAiB,OAAA;AAAA,EACjB,EAAA,EAAI,6BAAA;AAAA,EACJ,IAAA,EAAM,iCAAA;AAAA,EACN,OAAA,EAAS,OAAA;AAAA,EACT,WAAA,EAAa,uDAAA;AAAA,EACb,MAAA,EAAQ,cAAA;AAAA,EACR,OAAA,EAAS,UAAA;AAAA,EACT,IAAA,EAAM,MAAA;AAAA,EACN,UAAA,EAAY,oBAAA;AAAA,EACZ,QAAA,EAAU,CAAC,WAAW,CAAA;AAAA,EACtB,YAAA,EAAc;AAAA,IACZ,MAAA,EAAQ;AAAA,MACN,QAAA,EAAU,UAAA;AAAA,MACV,SAAA,EAAW,IAAA;AAAA,MACX,aAAA,EAAe;AAAA;AACjB,GACF;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,WAAA,EAAa;AAAA,MACX,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS,YAAA;AAAA,MACT,WAAA,EAAa;AAAA,KACf;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS,MAAA;AAAA,MACT,WAAA,EAAa;AAAA,KACf;AAAA,IACA,cAAA,EAAgB;AAAA,MACd,IAAA,EAAM,SAAA;AAAA,MACN,OAAA,EAAS,IAAA;AAAA,MACT,WAAA,EAAa;AAAA;AACf;AAEJ;;;AC/BA,IAAM,SAAA,GAAY,UAAU,IAAI,CAAA;AAiDhC,IAAM,QAAA,GAAW;AAAA,EACf,QAAA,EAAU,GAAA;AAAA,EACV,UAAA,EAAY,GAAA;AAAA,EACZ,OAAA,EAAS,GAAA;AAAA,EACT,OAAA,EAAS;AACX,CAAA;AAEO,IAAM,2BAAN,MAA6D;AAAA,EACjD,QAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,OAAA,uBAAc,GAAA,EAA4B;AAAA,EAE3D,WAAA,CAAY,MAAA,GAAyC,EAAC,EAAG;AACvD,IAAA,IAAA,CAAK,QAAA,GAAW,KAAK,OAAA,CAAQ,MAAA,CAAO,WAAW,GAAA,IAAO,OAAA,CAAQ,KAAK,CAAA;AACnE,IAAA,IAAA,CAAK,kBAAkB,IAAA,CAAK,OAAA,CAAQ,KAAK,QAAA,EAAU,MAAA,CAAO,eAAe,YAAY,CAAA;AACrF,IAAA,IAAA,CAAK,aAAA,GAAgB,OAAO,MAAA,IAAU,MAAA;AACtC,IAAA,IAAA,CAAK,cAAA,GAAiB,OAAO,cAAA,IAAkB,IAAA;AAC/C,IAAA,IAAA,CAAK,WAAA,GAAc,OAAO,WAAA,IAAe,IAAA;AAGzC,IAAA,IAAA,CAAK,aAAA,GAAgB,OAAO,aAAA,KAAkB,MAAA,CAAO,wBAAwB,KAAA,GAAQ,EAAC,GAAI,CAAC,cAAc,CAAA,CAAA;AAAA,EAC3G;AAAA,EAEA,MAAM,YAAY,OAAA,EAAoE;AACpF,IAAA,MAAM,WAAA,GAAc,QAAQ,WAAA,IAAe,CAAA,GAAA,EAAM,YAAW,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AACzE,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,SAAA,IAAa,IAAA,CAAK,aAAA;AACzC,IAAA,MAAM,KAAA,GAAS,QAAQ,QAAA,EAAsC,KAAA;AAC7D,IAAA,MAAM,aAAa,OAAA,CAAQ,UAAA;AAE3B,IAAA,IAAI,CAAC,UAAA,CAAW,IAAA,CAAK,eAAe,CAAA,EAAG;AACrC,MAAA,SAAA,CAAU,IAAA,CAAK,eAAA,EAAiB,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,IACrD;AAEA,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,iBAAiB,WAAW,CAAA;AAGhE,IAAA,IAAI,UAAA,CAAW,YAAY,CAAA,EAAG;AAC5B,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,WAAW,CAAA;AAC7C,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,QAAA,CAAS,QAAA,EAAA;AACT,QAAA,UAAA,GAAa,EAAE,KAAA,EAAO,OAAA,EAAS,SAAS,2BAAA,EAA6B,QAAA,EAAU,KAAK,CAAA;AACpF,QAAA,OAAO;AAAA,UACL,WAAA;AAAA,UACA,QAAA,EAAU,UAAA;AAAA,UACV,MAAA,EAAQ,OAAA;AAAA,UACR,QAAA,EAAU,YAAA;AAAA,UACV,WAAW,QAAA,CAAS,SAAA;AAAA,UACpB,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,UAClC,QAAA,EAAU,EAAE,MAAA,EAAQ,KAAA,EAAO,UAAU,IAAA,CAAK,QAAA,EAAU,QAAQ,IAAA;AAAK,SACnE;AAAA,MACF;AAEA,MAAA,UAAA,GAAa,EAAE,KAAA,EAAO,OAAA,EAAS,SAAS,uCAAA,EAAyC,QAAA,EAAU,KAAK,CAAA;AAChG,MAAA,MAAM,GAAA,GAAA,iBAAM,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACnC,MAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,WAAA,EAAa,EAAE,aAAa,YAAA,EAAc,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAS,SAAA,EAAW,GAAA,EAAK,KAAA,EAAO,QAAA,EAAU,GAAG,CAAA;AACxH,MAAA,OAAO;AAAA,QACL,WAAA;AAAA,QACA,QAAA,EAAU,UAAA;AAAA,QACV,MAAA,EAAQ,OAAA;AAAA,QACR,QAAA,EAAU,YAAA;AAAA,QACV,SAAA,EAAW,GAAA;AAAA,QACX,SAAA,EAAW,GAAA;AAAA,QACX,QAAA,EAAU,EAAE,MAAA,EAAQ,KAAA,EAAO,UAAU,IAAA,CAAK,QAAA,EAAU,QAAQ,IAAA;AAAK,OACnE;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,OAAA,CAAQ,oBAAA,EAAsB,EAAE,CAAA;AAC1D,IAAA,IAAI,CAAC,UAAA,IAAc,UAAA,KAAe,MAAA,EAAQ;AACxC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,MAAM,CAAA,CAAE,CAAA;AAAA,IAClD;AAEA,IAAA,MAAM,QAAA,GAAW,CAAC,KAAA,EAAe,OAAA,EAAiB,GAAA,KAAiB;AACjE,MAAA,UAAA,GAAa,EAAE,KAAA,EAAO,OAAA,EAAS,QAAA,EAAU,KAAK,CAAA;AAAA,IAChD,CAAA;AAEA,IAAA,IAAI;AAEF,MAAA,QAAA,CAAS,UAAA,EAAY,CAAA,uBAAA,EAA0B,UAAU,CAAA,GAAA,CAAA,EAAO,EAAE,CAAA;AAClE,MAAA,MAAM,IAAA,CAAK,IAAA;AAAA,QACT,CAAA,2BAAA,EAA8B,YAAY,CAAA,EAAA,EAAK,UAAU,CAAA,CAAA;AAAA,QACzD,IAAA,CAAK,QAAA;AAAA,QACL,QAAA,CAAS;AAAA,OACX;AACA,MAAA,QAAA,CAAS,UAAA,EAAY,oBAAoB,EAAE,CAAA;AAG3C,MAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,QAAA,QAAA,CAAS,YAAA,EAAc,8BAA8B,EAAE,CAAA;AACvD,QAAA,MAAM,IAAA,CAAK,IAAA;AAAA,UACT,kCAAA;AAAA,UACA,YAAA;AAAA,UACA,QAAA,CAAS;AAAA,SACX;AACA,QAAA,QAAA,CAAS,YAAA,EAAc,oBAAoB,EAAE,CAAA;AAAA,MAC/C;AAGA,MAAA,IAAI,KAAK,WAAA,EAAa;AACpB,QAAA,QAAA,CAAS,cAAA,EAAgB,6CAA6C,EAAE,CAAA;AACxE,QAAA,MAAM,IAAA,CAAK,IAAA;AAAA,UACT,gCAAA;AAAA,UACA,YAAA;AAAA,UACA,QAAA,CAAS;AAAA,SACX;AACA,QAAA,QAAA,CAAS,cAAA,EAAgB,0BAA0B,EAAE,CAAA;AAAA,MACvD;AAMA,MAAA,IAAI,IAAA,CAAK,aAAA,CAAc,MAAA,GAAS,CAAA,EAAG;AACjC,QAAA,QAAA,CAAS,YAAA,EAAc,qCAAqC,EAAE,CAAA;AAC9D,QAAA,MAAM,IAAA,CAAK,wBAAwB,YAAY,CAAA;AAC/C,QAAA,QAAA,CAAS,YAAA,EAAc,wBAAwB,EAAE,CAAA;AAAA,MACnD;AAEA,MAAA,QAAA,CAAS,OAAA,EAAS,mBAAmB,GAAG,CAAA;AAExC,MAAA,MAAM,MAAA,GAAyB;AAAA,QAC7B,WAAA;AAAA,QACA,YAAA;AAAA,QACA,MAAA;AAAA,QACA,MAAA,EAAQ,OAAA;AAAA,QACR,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,QAClC,KAAA;AAAA,QACA,QAAA,EAAU;AAAA,OACZ;AACA,MAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,WAAA,EAAa,MAAM,CAAA;AAEpC,MAAA,OAAO;AAAA,QACL,WAAA;AAAA,QACA,QAAA,EAAU,UAAA;AAAA,QACV,MAAA,EAAQ,OAAA;AAAA,QACR,QAAA,EAAU,YAAA;AAAA,QACV,WAAW,MAAA,CAAO,SAAA;AAAA,QAClB,WAAW,MAAA,CAAO,SAAA;AAAA,QAClB,UAAU,EAAE,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,KAAK,QAAA;AAAS,OACrD;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,QAAA,CAAS,QAAA,EAAU,wBAAwB,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAE,CAAA;AAEnG,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,CAAK,KAAK,CAAA,qBAAA,EAAwB,YAAY,aAAa,IAAA,CAAK,QAAA,EAAU,SAAS,OAAO,CAAA;AAAA,MAClG,CAAA,CAAA,MAAQ;AAAA,MAA8B;AAEtC,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,kCAAkC,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,OAC1F;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,QAAA,EAAgE;AAC3E,IAAA,OAAO;AAAA,MACL,aAAa,QAAA,CAAS,WAAA;AAAA,MACtB,eAAe,QAAA,CAAS,aAAA;AAAA,MACxB,WAAW,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,QAAA,CAAS,WAAW,CAAA,EAAG,YAAA;AAAA,MACnD,UAAA,EAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,KACrC;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,WAAA,EAAoC;AAChD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,WAAW,CAAA;AAC3C,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA;AAAA,IACF;AAEA,IAAA,MAAA,CAAO,QAAA,EAAA;AAIP,IAAA,MAAA,CAAO,MAAA,GAAS,UAAA;AAAA,EAClB;AAAA,EAEA,MAAM,QAAQ,WAAA,EAAoC;AAChD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,WAAW,CAAA;AAC3C,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,KAAK,CAAA,qBAAA,EAAwB,MAAA,CAAO,YAAY,CAAA,SAAA,CAAA,EAAa,IAAA,CAAK,QAAA,EAAU,QAAA,CAAS,OAAO,CAAA;AAAA,IACzG,CAAA,CAAA,MAAQ;AACN,MAAA,IAAI,UAAA,CAAW,MAAA,CAAO,YAAY,CAAA,EAAG;AACnC,QAAA,MAAA,CAAO,OAAO,YAAA,EAAc,EAAE,WAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAAA,MAC9D;AACA,MAAA,IAAI;AACF,QAAA,MAAM,KAAK,IAAA,CAAK,oBAAA,EAAsB,IAAA,CAAK,QAAA,EAAU,SAAS,OAAO,CAAA;AAAA,MACvE,CAAA,CAAA,MAAQ;AAAA,MAAe;AAAA,IACzB;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,WAAW,CAAA;AAAA,EACjC;AAAA,EAEA,MAAM,cAAA,GAAgC;AACpC,IAAA,IAAI,CAAC,UAAA,CAAW,IAAA,CAAK,eAAe,CAAA,EAAG;AACrC,MAAA;AAAA,IACF;AACA,IAAA,MAAM,OAAA,GAAU,WAAA,CAAY,IAAA,CAAK,eAAe,CAAA;AAChD,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,MAAM,YAAA,GAAe,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,iBAAiB,KAAK,CAAA;AAC1D,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,CAAK,KAAK,CAAA,qBAAA,EAAwB,YAAY,aAAa,IAAA,CAAK,QAAA,EAAU,SAAS,OAAO,CAAA;AAAA,MAClG,CAAA,CAAA,MAAQ;AACN,QAAA,MAAA,CAAO,cAAc,EAAE,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAAA,MACvD;AAAA,IACF;AACA,IAAA,IAAI;AACF,MAAA,MAAM,KAAK,IAAA,CAAK,oBAAA,EAAsB,IAAA,CAAK,QAAA,EAAU,SAAS,OAAO,CAAA;AAAA,IACvE,CAAA,CAAA,MAAQ;AAAA,IAAe;AACvB,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AAAA,EACrB;AAAA,EAEA,MAAM,UAAU,WAAA,EAAqD;AACnE,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,WAAW,CAAA;AAC3C,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,EAAE,aAAa,MAAA,EAAQ,UAAA,EAAY,4BAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY,EAAE;AAAA,IAChF;AAEA,IAAA,MAAM,MAAA,GAAS,UAAA,CAAW,MAAA,CAAO,YAAY,CAAA;AAC7C,IAAA,OAAO;AAAA,MACL,WAAA;AAAA,MACA,MAAA,EAAQ,MAAA,GAAS,MAAA,CAAO,MAAA,GAAS,QAAA;AAAA,MACjC,WAAW,MAAA,CAAO;AAAA,KACpB;AAAA,EACF;AAAA,EAEA,eAAA,GAAiD;AAC/C,IAAA,OAAO;AAAA,MACL,cAAA,EAAgB,IAAA;AAAA,MAChB,eAAA,EAAiB;AAAA,KACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAc,wBAAwB,YAAA,EAAqC;AACzE,IAAA,MAAM,YAAY,IAAA,CAAK,aAAA;AACvB,IAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,UAAU,QAAQ,CAAA;AAClD,MAAA,IAAI,CAAC,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC3B,MAAA,MAAM,YAAA,GAAe,IAAA,CAAK,IAAA,CAAK,YAAA,EAAc,QAAQ,CAAA;AACrD,MAAA,IAAI,CAAC,UAAA,CAAW,YAAY,CAAA,EAAG;AAC7B,QAAA,SAAA,CAAU,KAAK,OAAA,CAAQ,YAAY,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AACzD,QAAA,IAAI;AACF,UAAA,WAAA,CAAY,QAAA,EAAU,cAAc,KAAK,CAAA;AAAA,QAC3C,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,IAAA,CAAK,OAAA,EAAiB,GAAA,EAAa,UAAU,GAAA,EAAyB;AAClF,IAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MAAM,SAAA,CAAU,OAAA,EAAS,EAAE,GAAA,EAAK,QAAA,EAAU,MAAA,EAAQ,OAAA,EAAS,CAAA;AAC9E,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAKO,SAAS,aAAA,CAAc,MAAA,GAAyC,EAAC,EAA6B;AACnG,EAAA,OAAO,IAAI,yBAAyB,MAAM,CAAA;AAC5C","file":"index.js","sourcesContent":["import type { AdapterManifest } from '@kb-labs/sdk/adapters';\n\nexport const manifest: AdapterManifest = {\n manifestVersion: '1.0.0',\n id: 'worktree-workspace-provider',\n name: 'Git Worktree Workspace Provider',\n version: '0.1.0',\n description: 'Creates isolated git worktrees for pipeline execution',\n author: 'KB Labs Team',\n license: 'KBPL-1.1',\n type: 'core',\n implements: 'IWorkspaceProvider',\n contexts: ['workspace'],\n capabilities: {\n custom: {\n provider: 'worktree',\n isolation: true,\n gitSubmodules: true,\n },\n },\n configSchema: {\n worktreeDir: {\n type: 'string',\n default: '.worktrees',\n description: 'Directory where worktrees are created (relative to repo root)',\n },\n branch: {\n type: 'string',\n default: 'main',\n description: 'Default branch to create worktrees from',\n },\n initSubmodules: {\n type: 'boolean',\n default: true,\n description: 'Initialize git submodules in worktree',\n },\n },\n};\n","import { exec } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { existsSync, mkdirSync, readdirSync, rmSync, symlinkSync } from 'node:fs';\nimport path from 'node:path';\nimport { randomUUID } from 'node:crypto';\n\nconst execAsync = promisify(exec);\nimport type {\n IWorkspaceProvider,\n MaterializeWorkspaceRequest,\n WorkspaceDescriptor,\n AttachWorkspaceRequest,\n WorkspaceAttachment,\n WorkspaceStatusResult,\n WorkspaceProviderCapabilities,\n WorkspaceStatus,\n} from '@kb-labs/sdk/adapters';\n\nexport { manifest } from './manifest.js';\n\ninterface WorkspaceContext {\n cwd?: string;\n}\n\nexport interface WorktreeWorkspaceAdapterConfig {\n worktreeDir?: string;\n branch?: string;\n initSubmodules?: boolean;\n installDeps?: boolean;\n /**\n * Relative paths (from repo root) of tool dist/ directories to symlink from the\n * platform into the worktree. Only link tool binaries the agent should never\n * rebuild — package dist/ directories are left absent so agent builds write into\n * the worktree, not the platform.\n *\n * Default: ['cli/bin/dist'] — makes `pnpm kb` resolve to the platform's CLI.\n * Set to [] to disable all symlinking.\n */\n toolDistPaths?: string[];\n /** @deprecated use toolDistPaths: [] to disable */\n symlinkPlatformDist?: boolean;\n workspace?: WorkspaceContext;\n}\n\ninterface WorktreeRecord {\n workspaceId: string;\n worktreePath: string;\n branch: string;\n status: WorkspaceStatus;\n createdAt: string;\n runId?: string;\n /** Reference count — number of jobs currently using this workspace */\n refCount: number;\n}\n\nconst TIMEOUTS = {\n worktree: 30_000,\n submodules: 600_000,\n install: 300_000,\n cleanup: 30_000,\n} as const;\n\nexport class WorktreeWorkspaceAdapter implements IWorkspaceProvider {\n private readonly repoRoot: string;\n private readonly worktreeBaseDir: string;\n private readonly defaultBranch: string;\n private readonly initSubmodules: boolean;\n private readonly installDeps: boolean;\n private readonly toolDistPaths: string[];\n private readonly records = new Map<string, WorktreeRecord>();\n\n constructor(config: WorktreeWorkspaceAdapterConfig = {}) {\n this.repoRoot = path.resolve(config.workspace?.cwd ?? process.cwd());\n this.worktreeBaseDir = path.resolve(this.repoRoot, config.worktreeDir ?? '.worktrees');\n this.defaultBranch = config.branch ?? 'main';\n this.initSubmodules = config.initSubmodules ?? true;\n this.installDeps = config.installDeps ?? true;\n // Default: link only the kb CLI binary so `pnpm kb` works in the worktree.\n // Agent builds other packages fresh into the worktree's own dist/ directories.\n this.toolDistPaths = config.toolDistPaths ?? (config.symlinkPlatformDist === false ? [] : ['cli/bin/dist']);\n }\n\n async materialize(request: MaterializeWorkspaceRequest): Promise<WorkspaceDescriptor> {\n const workspaceId = request.workspaceId ?? `wt_${randomUUID().slice(0, 8)}`;\n const branch = request.sourceRef ?? this.defaultBranch;\n const runId = (request.metadata as Record<string, unknown>)?.runId as string | undefined;\n const onProgress = request.onProgress;\n\n if (!existsSync(this.worktreeBaseDir)) {\n mkdirSync(this.worktreeBaseDir, { recursive: true });\n }\n\n const worktreePath = path.join(this.worktreeBaseDir, workspaceId);\n\n // Reuse existing worktree (retry scenario — same run, same workspace)\n if (existsSync(worktreePath)) {\n const existing = this.records.get(workspaceId);\n if (existing) {\n existing.refCount++;\n onProgress?.({ stage: 'reuse', message: 'Reusing existing worktree', progress: 100 });\n return {\n workspaceId,\n provider: 'worktree',\n status: 'ready',\n rootPath: worktreePath,\n createdAt: existing.createdAt,\n updatedAt: new Date().toISOString(),\n metadata: { branch, runId, repoRoot: this.repoRoot, reused: true },\n };\n }\n // Worktree exists on disk but not in records (stale) — reuse anyway\n onProgress?.({ stage: 'reuse', message: 'Reusing existing worktree (recovered)', progress: 100 });\n const now = new Date().toISOString();\n this.records.set(workspaceId, { workspaceId, worktreePath, branch, status: 'ready', createdAt: now, runId, refCount: 1 });\n return {\n workspaceId,\n provider: 'worktree',\n status: 'ready',\n rootPath: worktreePath,\n createdAt: now,\n updatedAt: now,\n metadata: { branch, runId, repoRoot: this.repoRoot, reused: true },\n };\n }\n\n const safeBranch = branch.replace(/[^a-zA-Z0-9_\\-./]/g, '');\n if (!safeBranch || safeBranch !== branch) {\n throw new Error(`Invalid branch name: ${branch}`);\n }\n\n const progress = (stage: string, message: string, pct?: number) => {\n onProgress?.({ stage, message, progress: pct });\n };\n\n try {\n // Stage 1: Create worktree\n progress('worktree', `Creating worktree from ${safeBranch}...`, 10);\n await this.exec(\n `git worktree add --detach \"${worktreePath}\" ${safeBranch}`,\n this.repoRoot,\n TIMEOUTS.worktree,\n );\n progress('worktree', 'Worktree created', 25);\n\n // Stage 2: Initialize submodules\n if (this.initSubmodules) {\n progress('submodules', 'Initializing submodules...', 30);\n await this.exec(\n 'git submodule update --recursive',\n worktreePath,\n TIMEOUTS.submodules,\n );\n progress('submodules', 'Submodules ready', 60);\n }\n\n // Stage 3: Install dependencies\n if (this.installDeps) {\n progress('dependencies', 'Installing dependencies (pnpm install)...', 65);\n await this.exec(\n 'pnpm install --frozen-lockfile',\n worktreePath,\n TIMEOUTS.install,\n );\n progress('dependencies', 'Dependencies installed', 90);\n }\n\n // Stage 4: Symlink specific tool dist/ directories from the platform.\n // dist/ is gitignored, so the worktree won't have compiled tool binaries.\n // Only tool binaries (e.g. cli/bin/dist) are linked — package dist/ dirs\n // are left absent so agent builds produce output in the worktree, not the platform.\n if (this.toolDistPaths.length > 0) {\n progress('dist-links', 'Linking platform tool binaries...', 95);\n await this.symlinkDistFromPlatform(worktreePath);\n progress('dist-links', 'Tool binaries linked', 98);\n }\n\n progress('ready', 'Workspace ready', 100);\n\n const record: WorktreeRecord = {\n workspaceId,\n worktreePath,\n branch,\n status: 'ready',\n createdAt: new Date().toISOString(),\n runId,\n refCount: 1,\n };\n this.records.set(workspaceId, record);\n\n return {\n workspaceId,\n provider: 'worktree',\n status: 'ready',\n rootPath: worktreePath,\n createdAt: record.createdAt,\n updatedAt: record.createdAt,\n metadata: { branch, runId, repoRoot: this.repoRoot },\n };\n } catch (error) {\n progress('failed', `Provisioning failed: ${error instanceof Error ? error.message : String(error)}`);\n\n try {\n await this.exec(`git worktree remove \"${worktreePath}\" --force`, this.repoRoot, TIMEOUTS.cleanup);\n } catch { /* ignore cleanup errors */ }\n\n throw new Error(\n `Failed to provision workspace: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n async attach(_request: AttachWorkspaceRequest): Promise<WorkspaceAttachment> {\n return {\n workspaceId: _request.workspaceId,\n environmentId: _request.environmentId,\n mountPath: this.records.get(_request.workspaceId)?.worktreePath,\n attachedAt: new Date().toISOString(),\n };\n }\n\n async release(workspaceId: string): Promise<void> {\n const record = this.records.get(workspaceId);\n if (!record) {\n return;\n }\n\n record.refCount--;\n // Keep the worktree alive for the entire run — subsequent jobs of the same run\n // reuse it and see all accumulated changes (agent edits, build artifacts, etc.).\n // Cleanup happens on daemon restart (startupCleanup) or explicit destroy().\n record.status = 'released';\n }\n\n async destroy(workspaceId: string): Promise<void> {\n const record = this.records.get(workspaceId);\n if (!record) {\n return;\n }\n\n try {\n await this.exec(`git worktree remove \"${record.worktreePath}\" --force`, this.repoRoot, TIMEOUTS.cleanup);\n } catch {\n if (existsSync(record.worktreePath)) {\n rmSync(record.worktreePath, { recursive: true, force: true });\n }\n try {\n await this.exec('git worktree prune', this.repoRoot, TIMEOUTS.cleanup);\n } catch { /* ignore */ }\n }\n\n this.records.delete(workspaceId);\n }\n\n async startupCleanup(): Promise<void> {\n if (!existsSync(this.worktreeBaseDir)) {\n return;\n }\n const entries = readdirSync(this.worktreeBaseDir);\n for (const entry of entries) {\n const worktreePath = path.join(this.worktreeBaseDir, entry);\n try {\n await this.exec(`git worktree remove \"${worktreePath}\" --force`, this.repoRoot, TIMEOUTS.cleanup);\n } catch {\n rmSync(worktreePath, { recursive: true, force: true });\n }\n }\n try {\n await this.exec('git worktree prune', this.repoRoot, TIMEOUTS.cleanup);\n } catch { /* ignore */ }\n this.records.clear();\n }\n\n async getStatus(workspaceId: string): Promise<WorkspaceStatusResult> {\n const record = this.records.get(workspaceId);\n if (!record) {\n return { workspaceId, status: 'released', updatedAt: new Date().toISOString() };\n }\n\n const exists = existsSync(record.worktreePath);\n return {\n workspaceId,\n status: exists ? record.status : 'failed',\n updatedAt: record.createdAt,\n };\n }\n\n getCapabilities(): WorkspaceProviderCapabilities {\n return {\n supportsAttach: true,\n supportsRelease: true,\n };\n }\n\n /**\n * Symlink specific platform tool dist directories into the worktree.\n *\n * Only tool binaries that the agent should never rebuild are linked (e.g. the kb CLI).\n * Package dist/ directories that the agent may build are intentionally left absent so\n * agent builds write into the worktree, not the platform.\n *\n * Default tool paths to link (relative to repo root):\n * cli/bin/dist — makes `pnpm kb` resolve to the platform's compiled CLI binary\n */\n private async symlinkDistFromPlatform(worktreePath: string): Promise<void> {\n const toolDists = this.toolDistPaths;\n for (const relative of toolDists) {\n const platDist = path.join(this.repoRoot, relative);\n if (!existsSync(platDist)) continue;\n const worktreeDist = path.join(worktreePath, relative);\n if (!existsSync(worktreeDist)) {\n mkdirSync(path.dirname(worktreeDist), { recursive: true });\n try {\n symlinkSync(platDist, worktreeDist, 'dir');\n } catch {\n // ignore — another process may have raced us\n }\n }\n }\n }\n\n private async exec(command: string, cwd: string, timeout = 60_000): Promise<string> {\n const { stdout } = await execAsync(command, { cwd, encoding: 'utf8', timeout });\n return stdout;\n }\n}\n\n/**\n * Adapter factory — called by platform adapter loader.\n */\nexport function createAdapter(config: WorktreeWorkspaceAdapterConfig = {}): WorktreeWorkspaceAdapter {\n return new WorktreeWorkspaceAdapter(config);\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { AdapterManifest } from '@kb-labs/core-platform';
1
+ import { AdapterManifest } from '@kb-labs/sdk/adapters';
2
2
 
3
3
  declare const manifest: AdapterManifest;
4
4
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/manifest.ts"],"names":[],"mappings":";AAEO,IAAM,QAAA,GAA4B;AAAA,EACvC,eAAA,EAAiB,OAAA;AAAA,EACjB,EAAA,EAAI,6BAAA;AAAA,EACJ,IAAA,EAAM,iCAAA;AAAA,EACN,OAAA,EAAS,OAAA;AAAA,EACT,WAAA,EAAa,uDAAA;AAAA,EACb,MAAA,EAAQ,cAAA;AAAA,EACR,OAAA,EAAS,UAAA;AAAA,EACT,IAAA,EAAM,MAAA;AAAA,EACN,UAAA,EAAY,oBAAA;AAAA,EACZ,QAAA,EAAU,CAAC,WAAW,CAAA;AAAA,EACtB,YAAA,EAAc;AAAA,IACZ,MAAA,EAAQ;AAAA,MACN,QAAA,EAAU,UAAA;AAAA,MACV,SAAA,EAAW,IAAA;AAAA,MACX,aAAA,EAAe;AAAA;AACjB,GACF;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,WAAA,EAAa;AAAA,MACX,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS,YAAA;AAAA,MACT,WAAA,EAAa;AAAA,KACf;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS,MAAA;AAAA,MACT,WAAA,EAAa;AAAA,KACf;AAAA,IACA,cAAA,EAAgB;AAAA,MACd,IAAA,EAAM,SAAA;AAAA,MACN,OAAA,EAAS,IAAA;AAAA,MACT,WAAA,EAAa;AAAA;AACf;AAEJ","file":"manifest.js","sourcesContent":["import type { AdapterManifest } from '@kb-labs/core-platform';\n\nexport const manifest: AdapterManifest = {\n manifestVersion: '1.0.0',\n id: 'worktree-workspace-provider',\n name: 'Git Worktree Workspace Provider',\n version: '0.1.0',\n description: 'Creates isolated git worktrees for pipeline execution',\n author: 'KB Labs Team',\n license: 'KBPL-1.1',\n type: 'core',\n implements: 'IWorkspaceProvider',\n contexts: ['workspace'],\n capabilities: {\n custom: {\n provider: 'worktree',\n isolation: true,\n gitSubmodules: true,\n },\n },\n configSchema: {\n worktreeDir: {\n type: 'string',\n default: '.worktrees',\n description: 'Directory where worktrees are created (relative to repo root)',\n },\n branch: {\n type: 'string',\n default: 'main',\n description: 'Default branch to create worktrees from',\n },\n initSubmodules: {\n type: 'boolean',\n default: true,\n description: 'Initialize git submodules in worktree',\n },\n },\n};\n"]}
1
+ {"version":3,"sources":["../src/manifest.ts"],"names":[],"mappings":";AAEO,IAAM,QAAA,GAA4B;AAAA,EACvC,eAAA,EAAiB,OAAA;AAAA,EACjB,EAAA,EAAI,6BAAA;AAAA,EACJ,IAAA,EAAM,iCAAA;AAAA,EACN,OAAA,EAAS,OAAA;AAAA,EACT,WAAA,EAAa,uDAAA;AAAA,EACb,MAAA,EAAQ,cAAA;AAAA,EACR,OAAA,EAAS,UAAA;AAAA,EACT,IAAA,EAAM,MAAA;AAAA,EACN,UAAA,EAAY,oBAAA;AAAA,EACZ,QAAA,EAAU,CAAC,WAAW,CAAA;AAAA,EACtB,YAAA,EAAc;AAAA,IACZ,MAAA,EAAQ;AAAA,MACN,QAAA,EAAU,UAAA;AAAA,MACV,SAAA,EAAW,IAAA;AAAA,MACX,aAAA,EAAe;AAAA;AACjB,GACF;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,WAAA,EAAa;AAAA,MACX,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS,YAAA;AAAA,MACT,WAAA,EAAa;AAAA,KACf;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS,MAAA;AAAA,MACT,WAAA,EAAa;AAAA,KACf;AAAA,IACA,cAAA,EAAgB;AAAA,MACd,IAAA,EAAM,SAAA;AAAA,MACN,OAAA,EAAS,IAAA;AAAA,MACT,WAAA,EAAa;AAAA;AACf;AAEJ","file":"manifest.js","sourcesContent":["import type { AdapterManifest } from '@kb-labs/sdk/adapters';\n\nexport const manifest: AdapterManifest = {\n manifestVersion: '1.0.0',\n id: 'worktree-workspace-provider',\n name: 'Git Worktree Workspace Provider',\n version: '0.1.0',\n description: 'Creates isolated git worktrees for pipeline execution',\n author: 'KB Labs Team',\n license: 'KBPL-1.1',\n type: 'core',\n implements: 'IWorkspaceProvider',\n contexts: ['workspace'],\n capabilities: {\n custom: {\n provider: 'worktree',\n isolation: true,\n gitSubmodules: true,\n },\n },\n configSchema: {\n worktreeDir: {\n type: 'string',\n default: '.worktrees',\n description: 'Directory where worktrees are created (relative to repo root)',\n },\n branch: {\n type: 'string',\n default: 'main',\n description: 'Default branch to create worktrees from',\n },\n initSubmodules: {\n type: 'boolean',\n default: true,\n description: 'Initialize git submodules in worktree',\n },\n },\n};\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@kb-labs/adapters-workspace-worktree",
3
3
  "description": "Git worktree adapter implementing IWorkspaceProvider for isolated execution",
4
- "version": "2.94.0",
4
+ "version": "2.98.0",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",
@@ -25,9 +25,9 @@
25
25
  "rimraf": "^6.0.1",
26
26
  "tsup": "^8.5.0",
27
27
  "typescript": "^5.6.3",
28
- "vitest": "^3.2.4",
29
- "@kb-labs/core-platform": "2.94.0",
30
- "@kb-labs/devkit": "2.94.0"
28
+ "vitest": "^3.2.6",
29
+ "@kb-labs/devkit": "2.98.0",
30
+ "@kb-labs/sdk": "2.22.0"
31
31
  },
32
32
  "engines": {
33
33
  "node": ">=20.0.0",
@@ -37,7 +37,7 @@
37
37
  "manifest": "./dist/manifest.js"
38
38
  },
39
39
  "peerDependencies": {
40
- "@kb-labs/core-platform": "^2.94.0"
40
+ "@kb-labs/sdk": "^2.22.0"
41
41
  },
42
42
  "sideEffects": false,
43
43
  "scripts": {