@kb-labs/adapters-workspace-worktree 2.118.2 → 2.119.0-canary.2077501f1

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
@@ -50,6 +50,7 @@ declare class WorktreeWorkspaceAdapter implements IWorkspaceProvider {
50
50
  * cli/bin/dist — makes `pnpm kb` resolve to the platform's compiled CLI binary
51
51
  */
52
52
  private symlinkDistFromPlatform;
53
+ private symlinkEnvFromRoot;
53
54
  private exec;
54
55
  }
55
56
  /**
package/dist/index.js CHANGED
@@ -120,6 +120,7 @@ var WorktreeWorkspaceAdapter = class {
120
120
  TIMEOUTS.worktree
121
121
  );
122
122
  progress("worktree", "Worktree created", 25);
123
+ this.symlinkEnvFromRoot(worktreePath);
123
124
  if (this.initSubmodules) {
124
125
  progress("submodules", "Initializing submodules...", 30);
125
126
  await this.exec(
@@ -270,6 +271,16 @@ var WorktreeWorkspaceAdapter = class {
270
271
  }
271
272
  }
272
273
  }
274
+ symlinkEnvFromRoot(worktreePath) {
275
+ const rootEnv = path.join(this.repoRoot, ".env");
276
+ if (!existsSync(rootEnv)) return;
277
+ const worktreeEnv = path.join(worktreePath, ".env");
278
+ if (existsSync(worktreeEnv)) return;
279
+ try {
280
+ symlinkSync(rootEnv, worktreeEnv);
281
+ } catch {
282
+ }
283
+ }
273
284
  async exec(command, cwd, timeout = 6e4) {
274
285
  const { stdout } = await execAsync(command, { cwd, encoding: "utf8", timeout });
275
286
  return stdout;
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/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
+ {"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/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 1b: Symlink the root .env — it's gitignored so `git worktree add`\n // never copies it, and its contents aren't per-worktree specific.\n this.symlinkEnvFromRoot(worktreePath);\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 symlinkEnvFromRoot(worktreePath: string): void {\n const rootEnv = path.join(this.repoRoot, '.env');\n if (!existsSync(rootEnv)) return;\n const worktreeEnv = path.join(worktreePath, '.env');\n if (existsSync(worktreeEnv)) return;\n try {\n symlinkSync(rootEnv, worktreeEnv);\n } catch {\n // ignore — another process may have raced us\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"]}
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.118.2",
4
+ "version": "2.119.0-canary.2077501f1",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",
@@ -26,8 +26,8 @@
26
26
  "tsup": "^8.5.0",
27
27
  "typescript": "^5.6.3",
28
28
  "vitest": "^3.2.6",
29
- "@kb-labs/devkit": "2.118.2",
30
- "@kb-labs/sdk": "2.115.3"
29
+ "@kb-labs/devkit": "2.119.0-canary.2077501f1",
30
+ "@kb-labs/sdk": "2.115.4"
31
31
  },
32
32
  "engines": {
33
33
  "node": ">=22.0.0",
@@ -37,7 +37,7 @@
37
37
  "manifest": "./dist/manifest.js"
38
38
  },
39
39
  "peerDependencies": {
40
- "@kb-labs/sdk": "^2.115.3"
40
+ "@kb-labs/sdk": "^2.115.4"
41
41
  },
42
42
  "sideEffects": false,
43
43
  "scripts": {