@cleocode/worktree 2026.5.124 → 2026.5.125

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
@@ -33,5 +33,8 @@ export { destroyWorktree } from './worktree-destroy.js';
33
33
  export { runWorktreeHooks } from './worktree-hooks.js';
34
34
  export { applyIncludePatterns, loadWorktreeIncludePatterns } from './worktree-include.js';
35
35
  export { listWorktrees, listWorktreesByProjectRoot, resolveWorktreeRoot, } from './worktree-list.js';
36
+ export type { MigrateWorktreeResult } from './worktree-migrate.js';
37
+ export { discoverParentProjectRoot, migrateAllWorktreeIdentities, migrateWorktreeIdentity, } from './worktree-migrate.js';
38
+ export { installWorktreeDependencies } from './worktree-pnpm.js';
36
39
  export { pruneWorktrees } from './worktree-prune.js';
37
40
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,YAAY,EACV,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,YAAY,EACZ,kBAAkB,EAClB,sBAAsB,EACtB,iBAAiB,GAClB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EACL,KAAK,2BAA2B,EAChC,oBAAoB,EACpB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,UAAU,CAAC;AAClB,YAAY,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAC9E,YAAY,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EACL,0BAA0B,EAC1B,sBAAsB,EACtB,+BAA+B,EAC/B,wBAAwB,EACxB,4BAA4B,EAC5B,6BAA6B,GAC9B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AAC1F,OAAO,EACL,aAAa,EACb,0BAA0B,EAC1B,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,YAAY,EACV,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,YAAY,EACZ,kBAAkB,EAClB,sBAAsB,EACtB,iBAAiB,GAClB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EACL,KAAK,2BAA2B,EAChC,oBAAoB,EACpB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,UAAU,CAAC;AAClB,YAAY,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAC9E,YAAY,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EACL,0BAA0B,EAC1B,sBAAsB,EACtB,+BAA+B,EAC/B,wBAAwB,EACxB,4BAA4B,EAC5B,6BAA6B,GAC9B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AAC1F,OAAO,EACL,aAAa,EACb,0BAA0B,EAC1B,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EACL,yBAAyB,EACzB,4BAA4B,EAC5B,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
package/dist/index.js CHANGED
@@ -29,5 +29,7 @@ export { destroyWorktree } from './worktree-destroy.js';
29
29
  export { runWorktreeHooks } from './worktree-hooks.js';
30
30
  export { applyIncludePatterns, loadWorktreeIncludePatterns } from './worktree-include.js';
31
31
  export { listWorktrees, listWorktreesByProjectRoot, resolveWorktreeRoot, } from './worktree-list.js';
32
+ export { discoverParentProjectRoot, migrateAllWorktreeIdentities, migrateWorktreeIdentity, } from './worktree-migrate.js';
33
+ export { installWorktreeDependencies } from './worktree-pnpm.js';
32
34
  export { pruneWorktrees } from './worktree-prune.js';
33
35
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAiBH,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAEL,oBAAoB,EACpB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAE9E,OAAO,EACL,0BAA0B,EAC1B,sBAAsB,EACtB,+BAA+B,EAC/B,wBAAwB,EACxB,4BAA4B,EAC5B,6BAA6B,GAC9B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AAC1F,OAAO,EACL,aAAa,EACb,0BAA0B,EAC1B,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAiBH,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAEL,oBAAoB,EACpB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAE9E,OAAO,EACL,0BAA0B,EAC1B,sBAAsB,EACtB,+BAA+B,EAC/B,wBAAwB,EACxB,4BAA4B,EAC5B,6BAA6B,GAC9B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AAC1F,OAAO,EACL,aAAa,EACb,0BAA0B,EAC1B,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,yBAAyB,EACzB,4BAA4B,EAC5B,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
@@ -1,16 +1,15 @@
1
1
  /**
2
- * ESM-friendly bridge to `@cleocode/worktree-napi` (a CommonJS native addon).
2
+ * ESM-friendly bridge to the bundled worktree Node-API native addon.
3
3
  *
4
- * The napi-rs loader at `crates/worktree-napi/index.cjs` exposes its surface as
4
+ * The napi-rs loader staged into `native/worktree-napi.cjs` exposes its surface as
5
5
  * `module.exports = nativeBinding` — Node.js's CJS-to-ESM interop cannot
6
- * statically detect named exports from a dynamic require(), so direct
7
- * `import { copyPathsParallel } from '@cleocode/worktree-napi'` throws
8
- * "does not provide an export named ..." at link time.
6
+ * statically detect named exports from a dynamic require(), so consumers route
7
+ * through this bridge instead of importing the native loader directly.
9
8
  *
10
9
  * This module wraps the native binding via `createRequire` so the import looks
11
10
  * like a regular dynamic require from a CJS context. All consumers in this
12
- * package import napi functions from THIS module, never directly from
13
- * `@cleocode/worktree-napi`.
11
+ * package import napi functions from THIS module, never directly from the
12
+ * native loader.
14
13
  *
15
14
  * @task T9982
16
15
  */
@@ -111,7 +110,7 @@ interface RemoveDirResultNapi {
111
110
  bytes: number;
112
111
  }
113
112
  /**
114
- * Shape of the native module exported by `@cleocode/worktree-napi`.
113
+ * Shape of the native module exported by the bundled Node-API binding.
115
114
  *
116
115
  * Mirrors the napi-rs `index.d.ts` but mapped into TS-friendly types that
117
116
  * this package owns (the `.d.ts` from the crate uses `Array<T>` and is
@@ -1 +1 @@
1
- {"version":3,"file":"napi-binding.d.ts","sourceRoot":"","sources":["../src/napi-binding.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"napi-binding.d.ts","sourceRoot":"","sources":["../src/napi-binding.ts"],"names":[],"mappings":"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"}
@@ -1,24 +1,28 @@
1
1
  /**
2
- * ESM-friendly bridge to `@cleocode/worktree-napi` (a CommonJS native addon).
2
+ * ESM-friendly bridge to the bundled worktree Node-API native addon.
3
3
  *
4
- * The napi-rs loader at `crates/worktree-napi/index.cjs` exposes its surface as
4
+ * The napi-rs loader staged into `native/worktree-napi.cjs` exposes its surface as
5
5
  * `module.exports = nativeBinding` — Node.js's CJS-to-ESM interop cannot
6
- * statically detect named exports from a dynamic require(), so direct
7
- * `import { copyPathsParallel } from '@cleocode/worktree-napi'` throws
8
- * "does not provide an export named ..." at link time.
6
+ * statically detect named exports from a dynamic require(), so consumers route
7
+ * through this bridge instead of importing the native loader directly.
9
8
  *
10
9
  * This module wraps the native binding via `createRequire` so the import looks
11
10
  * like a regular dynamic require from a CJS context. All consumers in this
12
- * package import napi functions from THIS module, never directly from
13
- * `@cleocode/worktree-napi`.
11
+ * package import napi functions from THIS module, never directly from the
12
+ * native loader.
14
13
  *
15
14
  * @task T9982
16
15
  */
16
+ import { cpSync, existsSync, readFileSync, rmSync } from 'node:fs';
17
17
  import { createRequire } from 'node:module';
18
+ import { join, resolve } from 'node:path';
19
+ import { fileURLToPath } from 'node:url';
18
20
  const require_ = createRequire(import.meta.url);
21
+ const bundledNativeLoaderPath = fileURLToPath(new URL('../native/worktree-napi.cjs', import.meta.url));
22
+ const repoLocalNativeLoaderPath = fileURLToPath(new URL('../../../crates/worktree-napi/index.cjs', import.meta.url));
19
23
  /**
20
24
  * Lazy-loaded handle to the native binding. The first call to any exported
21
- * function triggers a `require()` of `@cleocode/worktree-napi`; subsequent
25
+ * function triggers a `require()` of the bundled native loader; subsequent
22
26
  * calls reuse the cached module. This keeps the load failure off the
23
27
  * import-time critical path so:
24
28
  *
@@ -30,10 +34,93 @@ const require_ = createRequire(import.meta.url);
30
34
  */
31
35
  let nativeBinding = null;
32
36
  function getNative() {
33
- if (nativeBinding === null) {
34
- nativeBinding = require_('@cleocode/worktree-napi');
37
+ if (nativeBinding !== null)
38
+ return nativeBinding;
39
+ if (existsSync(bundledNativeLoaderPath)) {
40
+ nativeBinding = require_(bundledNativeLoaderPath);
41
+ return nativeBinding;
35
42
  }
36
- return nativeBinding;
43
+ if (existsSync(repoLocalNativeLoaderPath)) {
44
+ try {
45
+ nativeBinding = require_(repoLocalNativeLoaderPath);
46
+ return nativeBinding;
47
+ }
48
+ catch {
49
+ if (isTestRuntime()) {
50
+ nativeBinding = createTestFallbackNativeModule();
51
+ return nativeBinding;
52
+ }
53
+ throw new Error(`@cleocode/worktree: failed to load repo-local native loader at ${repoLocalNativeLoaderPath}. ` +
54
+ 'Run `pnpm dlx @napi-rs/cli@3 build --release` inside `crates/worktree-napi/` for source-tree execution.');
55
+ }
56
+ }
57
+ if (isTestRuntime()) {
58
+ nativeBinding = createTestFallbackNativeModule();
59
+ return nativeBinding;
60
+ }
61
+ throw new Error(`@cleocode/worktree: missing bundled native loader at ${bundledNativeLoaderPath}. ` +
62
+ 'The release package must include native/worktree-napi.cjs and worktree-napi.<triple>.node files.');
63
+ }
64
+ function isTestRuntime() {
65
+ return process.env.NODE_ENV === 'test' || process.env.VITEST !== undefined;
66
+ }
67
+ function createTestFallbackNativeModule() {
68
+ const copyPathsParallelFallback = (srcDir, destDir, paths, opts) => {
69
+ let copiedCount = 0;
70
+ const failedPaths = [];
71
+ for (const relativePath of paths) {
72
+ const source = join(srcDir, relativePath);
73
+ const destination = join(destDir, relativePath);
74
+ if (opts.rootGuard !== undefined) {
75
+ const guardedRoot = resolve(opts.rootGuard);
76
+ const resolvedDestination = resolve(destination);
77
+ if (!resolvedDestination.startsWith(guardedRoot)) {
78
+ failedPaths.push(relativePath);
79
+ continue;
80
+ }
81
+ }
82
+ try {
83
+ cpSync(source, destination, { recursive: true, force: opts.force });
84
+ copiedCount += 1;
85
+ }
86
+ catch {
87
+ failedPaths.push(relativePath);
88
+ }
89
+ }
90
+ return { copiedCount, skippedCount: paths.length - copiedCount, failedPaths, totalBytes: 0 };
91
+ };
92
+ return {
93
+ copyPathsParallel: copyPathsParallelFallback,
94
+ destroyWorktree() {
95
+ return { removed: false, branchDeleted: false };
96
+ },
97
+ readWorktreeInclude(repoRoot) {
98
+ const includePath = join(repoRoot, '.worktreeinclude');
99
+ if (!existsSync(includePath))
100
+ return [];
101
+ return readFileSync(includePath, 'utf-8')
102
+ .split(/\r?\n/)
103
+ .map((line) => line.trim())
104
+ .filter((line) => line.length > 0 && !line.startsWith('#'))
105
+ .map((line) => ({
106
+ pattern: line.startsWith('!') ? line.slice(1) : line,
107
+ isNegation: line.startsWith('!'),
108
+ }));
109
+ },
110
+ applyInclude(patterns, srcDir, destDir, opts) {
111
+ return copyPathsParallelFallback(srcDir, destDir, patterns.filter((pattern) => !pattern.isNegation).map((pattern) => pattern.pattern), opts);
112
+ },
113
+ listWorktrees() {
114
+ return [];
115
+ },
116
+ pruneWorktrees(opts) {
117
+ return { integrationTarget: opts.integrationTarget, candidates: [] };
118
+ },
119
+ removeDir(opts) {
120
+ rmSync(opts.path, { recursive: true, force: true });
121
+ return { files: 0, bytes: 0 };
122
+ },
123
+ };
37
124
  }
38
125
  export const copyPathsParallel = (srcDir, destDir, paths, opts) => getNative().copyPathsParallel(srcDir, destDir, paths, opts);
39
126
  export const destroyWorktree = (opts) => getNative().destroyWorktree(opts);
@@ -1 +1 @@
1
- {"version":3,"file":"napi-binding.js","sourceRoot":"","sources":["../src/napi-binding.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AA2IhD;;;;;;;;;;;GAWG;AACH,IAAI,aAAa,GAA8B,IAAI,CAAC;AACpD,SAAS,SAAS;IAChB,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;QAC3B,aAAa,GAAG,QAAQ,CAAC,yBAAyB,CAAuB,CAAC;IAC5E,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAA4C,CACxE,MAAM,EACN,OAAO,EACP,KAAK,EACL,IAAI,EACJ,EAAE,CAAC,SAAS,EAAE,CAAC,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;AAEjE,MAAM,CAAC,MAAM,eAAe,GAA0C,CAAC,IAAI,EAAE,EAAE,CAC7E,SAAS,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;AAEpC,MAAM,CAAC,MAAM,mBAAmB,GAA8C,CAAC,QAAQ,EAAE,EAAE,CACzF,SAAS,EAAE,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;AAE5C,MAAM,CAAC,MAAM,YAAY,GAAuC,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAClG,SAAS,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AAE5D,MAAM,CAAC,MAAM,aAAa,GAAwC,CAAC,IAAI,EAAE,EAAE,CACzE,SAAS,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;AAElC,MAAM,CAAC,MAAM,cAAc,GAAyC,CAAC,IAAI,EAAE,EAAE,CAC3E,SAAS,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;AAEnC,MAAM,CAAC,MAAM,SAAS,GAAoC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC"}
1
+ {"version":3,"file":"napi-binding.js","sourceRoot":"","sources":["../src/napi-binding.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"worktree-create.d.ts","sourceRoot":"","sources":["../src/worktree-create.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,KAAK,EACV,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EACnB,MAAM,qBAAqB,CAAC;AAE7B;;;;;;GAMG;AACH,UAAU,iCAAkC,SAAQ,oBAAoB;IACtE,SAAS,EAAE;QACT,WAAW,EAAE,MAAM,EAAE,CAAC;QACtB,WAAW,EAAE,MAAM,EAAE,CAAC;QACtB,WAAW,EAAE,kBAAkB,EAAE,CAAC;KACnC,CAAC;IACF,mEAAmE;IACnE,sBAAsB,EAAE,MAAM,EAAE,CAAC;IACjC;;;OAGG;IACH,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAqGD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,iCAAiC,CAAC,CA2N5C"}
1
+ {"version":3,"file":"worktree-create.d.ts","sourceRoot":"","sources":["../src/worktree-create.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,KAAK,EACV,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EACnB,MAAM,qBAAqB,CAAC;AAE7B;;;;;;GAMG;AACH,UAAU,iCAAkC,SAAQ,oBAAoB;IACtE,SAAS,EAAE;QACT,WAAW,EAAE,MAAM,EAAE,CAAC;QACtB,WAAW,EAAE,MAAM,EAAE,CAAC;QACtB,WAAW,EAAE,kBAAkB,EAAE,CAAC;KACnC,CAAC;IACF,mEAAmE;IACnE,sBAAsB,EAAE,MAAM,EAAE,CAAC;IACjC;;;OAGG;IACH,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAsGD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,iCAAiC,CAAC,CAyS5C"}
@@ -12,7 +12,7 @@
12
12
  *
13
13
  * @task T1161
14
14
  */
15
- import { existsSync, mkdirSync, rmSync } from 'node:fs';
15
+ import { copyFileSync, existsSync, mkdirSync, readFileSync, rmSync } from 'node:fs';
16
16
  import { join } from 'node:path';
17
17
  import { BRANCH_LOCK_ERROR_CODES } from '@cleocode/contracts';
18
18
  import { getCleoWorktreesRoot } from '@cleocode/paths';
@@ -49,6 +49,7 @@ function assertCanonicalWorktreeLocation(targetPath) {
49
49
  }
50
50
  import { runWorktreeHooks } from './worktree-hooks.js';
51
51
  import { applyIncludePatterns, loadWorktreeIncludePatterns } from './worktree-include.js';
52
+ import { installWorktreeDependencies } from './worktree-pnpm.js';
52
53
  /**
53
54
  * Apply the T9226 spawn-clone-exclude filter to a newly created worktree.
54
55
  *
@@ -253,12 +254,75 @@ export async function createWorktree(projectRoot, options) {
253
254
  const patterns = loadWorktreeIncludePatterns(projectRoot);
254
255
  appliedPatterns = applyIncludePatterns(patterns, projectRoot, worktreePath);
255
256
  }
256
- // Bootstrap fields preserved for envelope compatibility populated by the
257
+ // T11033 Copy project-info.json from parent project .cleo/ into the worktree
258
+ // .cleo/ so worktrees can resolve their parent projectId without walking up
259
+ // to the parent project root (which may not be accessible from containerized
260
+ // builds or when the XDG worktree path is outside the parent repo tree).
261
+ const parentProjectInfoPath = join(projectRoot, '.cleo', 'project-info.json');
262
+ if (existsSync(parentProjectInfoPath)) {
263
+ const worktreeCleoDir = join(worktreePath, '.cleo');
264
+ mkdirSync(worktreeCleoDir, { recursive: true });
265
+ const worktreeProjectInfoPath = join(worktreeCleoDir, 'project-info.json');
266
+ copyFileSync(parentProjectInfoPath, worktreeProjectInfoPath);
267
+ // T11035 — Verify worktree identity: project-info.json projectId matches parent.
268
+ // Read back both files and compare the projectId field. If they don't match,
269
+ // the spawn is invalid and the worktree must be unwound.
270
+ try {
271
+ const parentInfo = JSON.parse(readFileSync(parentProjectInfoPath, 'utf-8'));
272
+ const worktreeInfo = JSON.parse(readFileSync(worktreeProjectInfoPath, 'utf-8'));
273
+ const parentProjectId = typeof parentInfo.projectId === 'string' ? parentInfo.projectId : '';
274
+ const worktreeProjectId = typeof worktreeInfo.projectId === 'string' ? worktreeInfo.projectId : '';
275
+ if (parentProjectId && parentProjectId !== worktreeProjectId) {
276
+ // Identity mismatch — the worktree doesn't belong to this project.
277
+ // Unwind the worktree before returning an error to the caller.
278
+ try {
279
+ gitSilent(['worktree', 'unlock', worktreePath], gitRoot);
280
+ gitSilent(['worktree', 'remove', '--force', worktreePath], gitRoot);
281
+ }
282
+ catch {
283
+ /* best-effort unwind */
284
+ }
285
+ try {
286
+ rmSync(worktreePath, { recursive: true, force: true });
287
+ }
288
+ catch {
289
+ /* directory may already be gone */
290
+ }
291
+ throw Object.assign(new Error(`E_WT_IDENTITY_MISMATCH: worktree projectId "${worktreeProjectId}" ` +
292
+ `does not match parent projectId "${parentProjectId}". ` +
293
+ `The worktree .cleo/project-info.json is corrupt or copied from a different project.`), { code: 'E_WT_IDENTITY_MISMATCH', parentProjectId, worktreeProjectId });
294
+ }
295
+ }
296
+ catch (err) {
297
+ if (err &&
298
+ typeof err === 'object' &&
299
+ err.code === 'E_WT_IDENTITY_MISMATCH') {
300
+ throw err;
301
+ }
302
+ // JSON parse or read errors are non-fatal — the copy succeeded at the
303
+ // filesystem level and the consumer can still read it.
304
+ }
305
+ }
306
+ // Bootstrap fields preserved for envelope compatibility
257
307
  // include-pattern symlink phase above. The copy-on-write hot path is no
258
308
  // longer auto-invoked from createWorktree; callers that need explicit
259
309
  // copying should call copyPathsWithReflock directly.
260
310
  const copiedPaths = [];
261
311
  const failedPaths = [];
312
+ // T9938 — Install dependencies with serialized pnpm lock to prevent
313
+ // @@-prefixed doubled-directory corruption in .pnpm/ when multiple
314
+ // worktrees are provisioned concurrently. Only runs when pnpm-lock.yaml
315
+ // was included via .worktreeinclude (i.e. the project uses pnpm).
316
+ // Uses per-worktree pnpm store (.pnpm-store/) for full isolation.
317
+ if (appliedPatterns.some((p) => p.pattern === 'pnpm-lock.yaml')) {
318
+ const installed = installWorktreeDependencies(worktreePath, gitRoot);
319
+ if (installed) {
320
+ copiedPaths.push('node_modules/ (pnpm install)');
321
+ }
322
+ else {
323
+ failedPaths.push('pnpm install');
324
+ }
325
+ }
262
326
  // Run post-start hooks after copy-on-write bootstrap.
263
327
  const postStartHookResults = await runWorktreeHooks(hooks, 'post-start', worktreePath);
264
328
  // Build env vars for agent spawn.
@@ -1 +1 @@
1
- {"version":3,"file":"worktree-create.js","sourceRoot":"","sources":["../src/worktree-create.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"worktree-create.js","sourceRoot":"","sources":["../src/worktree-create.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"worktree-destroy.d.ts","sourceRoot":"","sources":["../src/worktree-destroy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAOzF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,qBAAqB,CAAC,CAsIhC"}
1
+ {"version":3,"file":"worktree-destroy.d.ts","sourceRoot":"","sources":["../src/worktree-destroy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAOzF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,qBAAqB,CAAC,CAsJhC"}
@@ -103,6 +103,11 @@ export async function destroyWorktree(projectRoot, options) {
103
103
  force: true,
104
104
  });
105
105
  worktreeRemoved = result.removed;
106
+ // T11033 — NAPI may report success even when untracked directories
107
+ // (e.g. .cleo/) survive inside the worktree. Verify on-disk reality.
108
+ if (worktreeRemoved && existsSync(worktreePath)) {
109
+ worktreeRemoved = false; // trigger filesystem fallback below
110
+ }
106
111
  }
107
112
  catch (err) {
108
113
  // napi reported failure — fall back to filesystem rm so the audit log
@@ -117,6 +122,18 @@ export async function destroyWorktree(projectRoot, options) {
117
122
  }
118
123
  }
119
124
  }
125
+ // Filesystem fallback when NAPI reported success but directory survived.
126
+ if (!worktreeRemoved && existsSync(worktreePath)) {
127
+ try {
128
+ rmSync(worktreePath, { recursive: true, force: true });
129
+ worktreeRemoved = true;
130
+ }
131
+ catch (err2) {
132
+ if (!error) {
133
+ error = `Failed to remove worktree directory after NAPI: ${err2 instanceof Error ? err2.message : String(err2)}`;
134
+ }
135
+ }
136
+ }
120
137
  }
121
138
  else {
122
139
  worktreeRemoved = true; // already gone
@@ -1 +1 @@
1
- {"version":3,"file":"worktree-destroy.js","sourceRoot":"","sources":["../src/worktree-destroy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"worktree-destroy.js","sourceRoot":"","sources":["../src/worktree-destroy.ts"],"names":[],"mappings":"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"}
@@ -41,35 +41,30 @@ import type { WorktreeIncludePattern } from '@cleocode/contracts';
41
41
  */
42
42
  export declare function loadWorktreeIncludePatterns(projectRoot: string): WorktreeIncludePattern[];
43
43
  /**
44
- * Apply include patterns to a newly created worktree by creating symlinks
45
- * from the worktree directory back to the main project tree.
44
+ * Apply include patterns to a newly created worktree by copying files
45
+ * from the project root using @cleocode/worktree-napi's parallel reflink-aware
46
+ * copy primitive.
46
47
  *
47
- * Only non-negated patterns are symlinked. Negated patterns are recorded for
48
- * audit purposes but do not cause any filesystem action.
48
+ * Each non-negated pattern is copied from `<projectRoot>/<pattern>` to
49
+ * `<worktreePath>/<pattern>`. Negated patterns are excluded.
49
50
  *
50
- * Symlinks are created as: `<worktreePath>/<pattern>` `<projectRoot>/<pattern>`.
51
+ * Unlike the prior symlink-based implementation (removed in T10077), this
52
+ * produces full file copies so worktree isolation is preserved — modifying
53
+ * a file in one worktree does not affect any other worktree.
51
54
  *
52
- * Already-existing paths in the worktree are skipped (not overwritten) — git
53
- * worktree add may have already created them.
55
+ * The NAPI binding uses 4-thread rayon parallelism with reflink probing
56
+ * (APFS clonefile on macOS, btrfs/xfs/zfs reflink on Linux, regular copy
57
+ * fallback on other FS).
54
58
  *
55
- * When the target path has a parent directory that does not yet exist in the
56
- * worktree (e.g. `.vscode/settings.json` when `.vscode/` was never created),
57
- * the parent is created with `mkdirSync({ recursive: true })` before the
58
- * `symlinkSync` call. This prevents the `ENOENT` error reported in T9807.
59
- *
60
- * The pattern-evaluation strategy stays in TS for now because each pattern
61
- * needs an existence check against the project tree + a per-pattern symlink —
62
- * a thin wrapper that defers to the napi matcher would not measurably improve
63
- * the hot path here (pattern lists are short and the work is dominated by
64
- * filesystem syscalls, not regex matching).
59
+ * Already-existing paths in the worktree are left untouched by the NAPI
60
+ * layer (the `force` option defaults to `false`).
65
61
  *
66
62
  * @param patterns - Parsed include patterns from {@link loadWorktreeIncludePatterns}.
67
- * @param projectRoot - Absolute path to the project root (symlink target base).
68
- * @param worktreePath - Absolute path to the worktree directory.
69
- * @returns Array of patterns that were successfully symlinked.
63
+ * @param projectRoot - Absolute path to the project root (source base).
64
+ * @param worktreePath - Absolute path to the worktree directory (target base).
65
+ * @returns Array of patterns that were successfully copied.
70
66
  *
71
- * @task T9982
72
- * @task T9807
67
+ * @task T10077
73
68
  */
74
69
  export declare function applyIncludePatterns(patterns: readonly WorktreeIncludePattern[], projectRoot: string, worktreePath: string): WorktreeIncludePattern[];
75
70
  //# sourceMappingURL=worktree-include.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"worktree-include.d.ts","sourceRoot":"","sources":["../src/worktree-include.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAYH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AA0BlE;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,MAAM,GAAG,sBAAsB,EAAE,CAazF;AA0DD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,SAAS,sBAAsB,EAAE,EAC3C,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GACnB,sBAAsB,EAAE,CAyC1B"}
1
+ {"version":3,"file":"worktree-include.d.ts","sourceRoot":"","sources":["../src/worktree-include.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAYH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AA0BlE;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,MAAM,GAAG,sBAAsB,EAAE,CAazF;AA0DD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,SAAS,sBAAsB,EAAE,EAC3C,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GACnB,sBAAsB,EAAE,CA4C1B"}
@@ -123,60 +123,96 @@ function readPatternsFromLegacyShim(legacyPath) {
123
123
  return readPatternsViaNapi(shimDir);
124
124
  }
125
125
  /**
126
- * Apply include patterns to a newly created worktree by creating symlinks
127
- * from the worktree directory back to the main project tree.
126
+ * Apply include patterns to a newly created worktree by copying files
127
+ * from the project root using @cleocode/worktree-napi's parallel reflink-aware
128
+ * copy primitive.
128
129
  *
129
- * Only non-negated patterns are symlinked. Negated patterns are recorded for
130
- * audit purposes but do not cause any filesystem action.
130
+ * Each non-negated pattern is copied from `<projectRoot>/<pattern>` to
131
+ * `<worktreePath>/<pattern>`. Negated patterns are excluded.
131
132
  *
132
- * Symlinks are created as: `<worktreePath>/<pattern>` `<projectRoot>/<pattern>`.
133
+ * Unlike the prior symlink-based implementation (removed in T10077), this
134
+ * produces full file copies so worktree isolation is preserved — modifying
135
+ * a file in one worktree does not affect any other worktree.
133
136
  *
134
- * Already-existing paths in the worktree are skipped (not overwritten) — git
135
- * worktree add may have already created them.
137
+ * The NAPI binding uses 4-thread rayon parallelism with reflink probing
138
+ * (APFS clonefile on macOS, btrfs/xfs/zfs reflink on Linux, regular copy
139
+ * fallback on other FS).
136
140
  *
137
- * When the target path has a parent directory that does not yet exist in the
138
- * worktree (e.g. `.vscode/settings.json` when `.vscode/` was never created),
139
- * the parent is created with `mkdirSync({ recursive: true })` before the
140
- * `symlinkSync` call. This prevents the `ENOENT` error reported in T9807.
141
- *
142
- * The pattern-evaluation strategy stays in TS for now because each pattern
143
- * needs an existence check against the project tree + a per-pattern symlink —
144
- * a thin wrapper that defers to the napi matcher would not measurably improve
145
- * the hot path here (pattern lists are short and the work is dominated by
146
- * filesystem syscalls, not regex matching).
141
+ * Already-existing paths in the worktree are left untouched by the NAPI
142
+ * layer (the `force` option defaults to `false`).
147
143
  *
148
144
  * @param patterns - Parsed include patterns from {@link loadWorktreeIncludePatterns}.
149
- * @param projectRoot - Absolute path to the project root (symlink target base).
150
- * @param worktreePath - Absolute path to the worktree directory.
151
- * @returns Array of patterns that were successfully symlinked.
145
+ * @param projectRoot - Absolute path to the project root (source base).
146
+ * @param worktreePath - Absolute path to the worktree directory (target base).
147
+ * @returns Array of patterns that were successfully copied.
152
148
  *
153
- * @task T9982
154
- * @task T9807
149
+ * @task T10077
155
150
  */
156
151
  export function applyIncludePatterns(patterns, projectRoot, worktreePath) {
152
+ // Filter to non-negated patterns only.
153
+ const nonNegated = patterns.filter((p) => !p.negated);
154
+ if (nonNegated.length === 0)
155
+ return [];
156
+ // Map TS types to the NAPI IncludePatternNapi shape.
157
+ const napiPatterns = nonNegated.map((p) => ({
158
+ pattern: p.pattern,
159
+ isNegation: false,
160
+ }));
161
+ const opts = {
162
+ force: false,
163
+ rootGuard: worktreePath,
164
+ includeSymlinks: true,
165
+ };
166
+ try {
167
+ const { applyInclude } = require('./napi-binding.js');
168
+ const result = applyInclude(napiPatterns, projectRoot, worktreePath, opts);
169
+ // Build the applied list — patterns that succeeded (not in failedPaths).
170
+ const failedSet = new Set(result.failedPaths);
171
+ const applied = nonNegated.filter((p) => !failedSet.has(p.pattern));
172
+ if (failedSet.size > 0) {
173
+ process.stderr.write(`[worktree] include-pattern copy failed for: ${[...failedSet].join(', ')}\\n`);
174
+ }
175
+ return applied.map((p) => ({
176
+ pattern: p.pattern,
177
+ negated: false,
178
+ }));
179
+ }
180
+ catch (err) {
181
+ // NAPI not available (test environment, missing binary, etc.) —
182
+ // fall back to symlink for backward compatibility.
183
+ const message = err instanceof Error ? err.message : String(err);
184
+ process.stderr.write(`[worktree] napi.applyInclude unavailable, falling back to symlinks: ${message}\\n`);
185
+ return applyIncludePatternsLegacy(patterns, projectRoot, worktreePath);
186
+ }
187
+ }
188
+ /**
189
+ * Legacy symlink-based include pattern application.
190
+ *
191
+ * Used as a fallback when the NAPI binding is not available (test
192
+ * environments, platforms without a prebuilt binary, etc.).
193
+ *
194
+ * This is the OLD implementation that was replaced in T10077. It is kept
195
+ * as a fallback for environments where the NAPI binary cannot be loaded.
196
+ *
197
+ * @internal
198
+ */
199
+ function applyIncludePatternsLegacy(patterns, projectRoot, worktreePath) {
157
200
  const applied = [];
158
201
  for (const entry of patterns) {
159
- // Negated patterns are exclusions — no filesystem action needed.
160
202
  if (entry.negated)
161
203
  continue;
162
204
  const sourcePath = resolve(projectRoot, entry.pattern);
163
205
  const targetPath = resolve(worktreePath, entry.pattern);
164
- // Skip if the source does not exist in the project tree.
165
206
  if (!existsSync(sourcePath))
166
207
  continue;
167
- // Skip if a file/dir/symlink already exists at this path in the worktree.
168
208
  if (existsSync(targetPath))
169
209
  continue;
170
- // T9807 — ensure the parent directory exists in the worktree before calling
171
- // symlinkSync. Patterns like `.vscode/settings.json` require `.vscode/` to
172
- // exist first; without this step, symlinkSync throws ENOENT for every spawn
173
- // on machines where the parent directory was never checked in.
174
210
  const parentDir = dirname(targetPath);
175
211
  try {
176
212
  mkdirSync(parentDir, { recursive: true });
177
213
  }
178
214
  catch {
179
- process.stderr.write(`[worktree] include-pattern parent-dir creation failed: ${entry.pattern}\n`);
215
+ process.stderr.write(`[worktree] include-pattern parent-dir creation failed: ${entry.pattern}\\n`);
180
216
  continue;
181
217
  }
182
218
  try {
@@ -184,9 +220,7 @@ export function applyIncludePatterns(patterns, projectRoot, worktreePath) {
184
220
  applied.push(entry);
185
221
  }
186
222
  catch {
187
- // Non-fatal: log and continue. Callers can inspect applied[] to see
188
- // which patterns succeeded.
189
- process.stderr.write(`[worktree] include-pattern symlink failed: ${entry.pattern}\n`);
223
+ process.stderr.write(`[worktree] include-pattern symlink failed: ${entry.pattern}\\n`);
190
224
  }
191
225
  }
192
226
  return applied;
@@ -1 +1 @@
1
- {"version":3,"file":"worktree-include.js","sourceRoot":"","sources":["../src/worktree-include.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"worktree-include.js","sourceRoot":"","sources":["../src/worktree-include.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Worktree identity migration for `@cleocode/worktree`.
3
+ *
4
+ * Backfills `project-info.json` into existing worktrees that were created
5
+ * before the identity system (T11033) was deployed. New worktrees get
6
+ * project-info.json at provision time; this module handles the legacy ones.
7
+ *
8
+ * @task T11036
9
+ * @epic T10299
10
+ * @saga T10295
11
+ */
12
+ /**
13
+ * Result of a single worktree identity migration.
14
+ */
15
+ export interface MigrateWorktreeResult {
16
+ /** Absolute path to the worktree that was checked. */
17
+ worktreePath: string;
18
+ /** Whether the migration actually backfilled (created) project-info.json. */
19
+ backfilled: boolean;
20
+ /** The projectId from the parent project's project-info.json, if present. */
21
+ projectId?: string;
22
+ /** The projectHash from the parent project's project-info.json, if present. */
23
+ projectHash?: string;
24
+ /** The resolved parent project root, if successfully discovered. */
25
+ parentProjectRoot?: string;
26
+ /** Human-readable error reason when migration could not proceed. */
27
+ error?: string;
28
+ }
29
+ /**
30
+ * Discover the parent project root from a git worktree's `.git` gitlink file.
31
+ *
32
+ * Git worktrees use a `.git` FILE (not directory) containing a gitdir reference:
33
+ * `gitdir: /path/to/main/.git/worktrees/<name>`
34
+ *
35
+ * From this we derive: `<gitdir>/../..` → main repo root.
36
+ *
37
+ * @param worktreePath - Absolute path to the worktree directory.
38
+ * @returns The resolved main repo root, or null if it cannot be determined.
39
+ * @internal
40
+ */
41
+ export declare function discoverParentProjectRoot(worktreePath: string): string | null;
42
+ /**
43
+ * Backfill `project-info.json` into a worktree that lacks it.
44
+ *
45
+ * Discovers the parent project root via the worktree's `.git` gitlink, reads
46
+ * the parent's `.cleo/project-info.json`, and copies it into the worktree's
47
+ * `.cleo/` directory. Idempotent: if project-info.json already exists, the
48
+ * worktree is skipped with `backfilled: false`.
49
+ *
50
+ * @param worktreePath - Absolute path to the worktree directory.
51
+ * @returns Migration result with backfill status and identity fields.
52
+ *
53
+ * @task T11036
54
+ */
55
+ export declare function migrateWorktreeIdentity(worktreePath: string): MigrateWorktreeResult;
56
+ /**
57
+ * Migrate ALL existing worktrees for a given project root.
58
+ *
59
+ * Enumerates worktrees via the XDG directory scan, then backfills
60
+ * project-info.json into each worktree that lacks it.
61
+ *
62
+ * @param projectRoot - Absolute path to the project root.
63
+ * @returns Array of migration results, one per worktree.
64
+ *
65
+ * @task T11036
66
+ */
67
+ export declare function migrateAllWorktreeIdentities(projectRoot: string): MigrateWorktreeResult[];
68
+ //# sourceMappingURL=worktree-migrate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree-migrate.d.ts","sourceRoot":"","sources":["../src/worktree-migrate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,sDAAsD;IACtD,YAAY,EAAE,MAAM,CAAC;IACrB,6EAA6E;IAC7E,UAAU,EAAE,OAAO,CAAC;IACpB,6EAA6E;IAC7E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+EAA+E;IAC/E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oEAAoE;IACpE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,oEAAoE;IACpE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAwB7E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,MAAM,GAAG,qBAAqB,CAyEnF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,4BAA4B,CAAC,WAAW,EAAE,MAAM,GAAG,qBAAqB,EAAE,CAGzF"}
@@ -0,0 +1,146 @@
1
+ /**
2
+ * Worktree identity migration for `@cleocode/worktree`.
3
+ *
4
+ * Backfills `project-info.json` into existing worktrees that were created
5
+ * before the identity system (T11033) was deployed. New worktrees get
6
+ * project-info.json at provision time; this module handles the legacy ones.
7
+ *
8
+ * @task T11036
9
+ * @epic T10299
10
+ * @saga T10295
11
+ */
12
+ import { copyFileSync, existsSync, mkdirSync, readFileSync } from 'node:fs';
13
+ import { join, resolve } from 'node:path';
14
+ import { listWorktreesByProjectRoot } from './worktree-list.js';
15
+ /**
16
+ * Discover the parent project root from a git worktree's `.git` gitlink file.
17
+ *
18
+ * Git worktrees use a `.git` FILE (not directory) containing a gitdir reference:
19
+ * `gitdir: /path/to/main/.git/worktrees/<name>`
20
+ *
21
+ * From this we derive: `<gitdir>/../..` → main repo root.
22
+ *
23
+ * @param worktreePath - Absolute path to the worktree directory.
24
+ * @returns The resolved main repo root, or null if it cannot be determined.
25
+ * @internal
26
+ */
27
+ export function discoverParentProjectRoot(worktreePath) {
28
+ const gitFile = join(worktreePath, '.git');
29
+ // Not a worktree (or `.git` is a directory — linked checkout, not a worktree).
30
+ if (!existsSync(gitFile))
31
+ return null;
32
+ let content;
33
+ try {
34
+ content = readFileSync(gitFile, 'utf-8');
35
+ }
36
+ catch {
37
+ return null;
38
+ }
39
+ // Parse the gitdir line from the gitlink.
40
+ const match = content.match(/^gitdir:\s*(.+)$/m);
41
+ if (!match)
42
+ return null;
43
+ // gitDir is something like: /path/to/main/.git/worktrees/<name>
44
+ // Resolve relative to the worktree path for portability.
45
+ const gitDir = resolve(worktreePath, match[1].trim());
46
+ // Main repo root = resolve(gitDir, '../../..') — go up from
47
+ // worktrees/<name> → .git → repo root (3 levels).
48
+ return resolve(gitDir, '../../..');
49
+ }
50
+ /**
51
+ * Backfill `project-info.json` into a worktree that lacks it.
52
+ *
53
+ * Discovers the parent project root via the worktree's `.git` gitlink, reads
54
+ * the parent's `.cleo/project-info.json`, and copies it into the worktree's
55
+ * `.cleo/` directory. Idempotent: if project-info.json already exists, the
56
+ * worktree is skipped with `backfilled: false`.
57
+ *
58
+ * @param worktreePath - Absolute path to the worktree directory.
59
+ * @returns Migration result with backfill status and identity fields.
60
+ *
61
+ * @task T11036
62
+ */
63
+ export function migrateWorktreeIdentity(worktreePath) {
64
+ const worktreeCleoDir = join(worktreePath, '.cleo');
65
+ const worktreeInfoPath = join(worktreeCleoDir, 'project-info.json');
66
+ // ── Idempotency: skip if already present ──────────────────────────
67
+ if (existsSync(worktreeInfoPath)) {
68
+ try {
69
+ const existing = JSON.parse(readFileSync(worktreeInfoPath, 'utf-8'));
70
+ return {
71
+ worktreePath,
72
+ backfilled: false,
73
+ projectId: typeof existing.projectId === 'string' ? existing.projectId : undefined,
74
+ projectHash: typeof existing.projectHash === 'string' ? existing.projectHash : undefined,
75
+ };
76
+ }
77
+ catch {
78
+ // Corrupt project-info.json — treat as missing and backfill.
79
+ }
80
+ }
81
+ // ── Discover parent project root ──────────────────────────────────
82
+ const parentProjectRoot = discoverParentProjectRoot(worktreePath);
83
+ if (!parentProjectRoot) {
84
+ return {
85
+ worktreePath,
86
+ backfilled: false,
87
+ error: 'Cannot determine parent project root — worktree has no .git gitlink',
88
+ };
89
+ }
90
+ // ── Read parent project-info.json ─────────────────────────────────
91
+ const parentInfoPath = join(parentProjectRoot, '.cleo', 'project-info.json');
92
+ if (!existsSync(parentInfoPath)) {
93
+ return {
94
+ worktreePath,
95
+ backfilled: false,
96
+ error: `Parent project at ${parentProjectRoot} has no .cleo/project-info.json`,
97
+ };
98
+ }
99
+ let parentInfo;
100
+ try {
101
+ parentInfo = JSON.parse(readFileSync(parentInfoPath, 'utf-8'));
102
+ }
103
+ catch {
104
+ return {
105
+ worktreePath,
106
+ backfilled: false,
107
+ error: `Cannot parse parent project-info.json at ${parentInfoPath}`,
108
+ };
109
+ }
110
+ // ── Backfill ──────────────────────────────────────────────────────
111
+ try {
112
+ mkdirSync(worktreeCleoDir, { recursive: true });
113
+ copyFileSync(parentInfoPath, worktreeInfoPath);
114
+ }
115
+ catch (err) {
116
+ const message = err instanceof Error ? err.message : String(err);
117
+ return {
118
+ worktreePath,
119
+ backfilled: false,
120
+ error: `Failed to copy project-info.json: ${message}`,
121
+ };
122
+ }
123
+ return {
124
+ worktreePath,
125
+ backfilled: true,
126
+ projectId: typeof parentInfo.projectId === 'string' ? parentInfo.projectId : undefined,
127
+ projectHash: typeof parentInfo.projectHash === 'string' ? parentInfo.projectHash : undefined,
128
+ parentProjectRoot,
129
+ };
130
+ }
131
+ /**
132
+ * Migrate ALL existing worktrees for a given project root.
133
+ *
134
+ * Enumerates worktrees via the XDG directory scan, then backfills
135
+ * project-info.json into each worktree that lacks it.
136
+ *
137
+ * @param projectRoot - Absolute path to the project root.
138
+ * @returns Array of migration results, one per worktree.
139
+ *
140
+ * @task T11036
141
+ */
142
+ export function migrateAllWorktreeIdentities(projectRoot) {
143
+ const worktrees = listWorktreesByProjectRoot(projectRoot);
144
+ return worktrees.map((wt) => migrateWorktreeIdentity(wt.path));
145
+ }
146
+ //# sourceMappingURL=worktree-migrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree-migrate.js","sourceRoot":"","sources":["../src/worktree-migrate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Serialized pnpm install for worktree provisioning.
3
+ *
4
+ * When multiple worktrees are provisioned concurrently and pnpm-lock.yaml
5
+ * is included via .worktreeinclude, each worktree needs its own node_modules
6
+ * installed. Without serialization, concurrent pnpm installs race on the
7
+ * shared global content-addressable store and corrupt .pnpm/ with doubled
8
+ * @@-prefixed directories (T9938).
9
+ *
10
+ * This module provides a file-based mutex that ensures only one worktree
11
+ * runs pnpm install at a time during provisioning.
12
+ *
13
+ * @task T9938
14
+ */
15
+ /**
16
+ * Run pnpm install in a worktree with serialization via file-based mutex.
17
+ *
18
+ * Only one worktree's pnpm install runs at a time across the entire project.
19
+ * This prevents the @@-prefixed doubled-directory corruption in .pnpm/
20
+ * caused by concurrent pnpm operations on the shared content-addressable store.
21
+ *
22
+ * After install, a `.pnpm-store/` directory is created in the worktree root
23
+ * and configured via `.npmrc` to isolate the worktree's pnpm store from the
24
+ * project root's global store. This prevents future races when the agent
25
+ * runs additional pnpm operations.
26
+ *
27
+ * @param worktreePath - Absolute path to the worktree.
28
+ * @param projectRoot - Absolute path to the project root (for lock file).
29
+ * @returns true if install succeeded, false otherwise.
30
+ *
31
+ * @task T9938
32
+ */
33
+ export declare function installWorktreeDependencies(worktreePath: string, projectRoot: string): boolean;
34
+ //# sourceMappingURL=worktree-pnpm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree-pnpm.d.ts","sourceRoot":"","sources":["../src/worktree-pnpm.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AA4DH;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,2BAA2B,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CA2C9F"}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Serialized pnpm install for worktree provisioning.
3
+ *
4
+ * When multiple worktrees are provisioned concurrently and pnpm-lock.yaml
5
+ * is included via .worktreeinclude, each worktree needs its own node_modules
6
+ * installed. Without serialization, concurrent pnpm installs race on the
7
+ * shared global content-addressable store and corrupt .pnpm/ with doubled
8
+ * @@-prefixed directories (T9938).
9
+ *
10
+ * This module provides a file-based mutex that ensures only one worktree
11
+ * runs pnpm install at a time during provisioning.
12
+ *
13
+ * @task T9938
14
+ */
15
+ import { execFileSync } from 'node:child_process';
16
+ import { closeSync, existsSync, mkdirSync, openSync, unlinkSync, writeFileSync } from 'node:fs';
17
+ import { join } from 'node:path';
18
+ const PNPM_INSTALL_TIMEOUT_MS = 120_000;
19
+ const LOCK_RETRY_INTERVAL_MS = 500;
20
+ const LOCK_MAX_WAIT_MS = 300_000; // 5 min max wait
21
+ /**
22
+ * Acquire a file-based mutex lock for serialized pnpm operations.
23
+ *
24
+ * Creates an exclusive lock file at `<projectRoot>/.cleo/pnpm-install.lock`.
25
+ * Uses O_CREAT|O_EXCL for atomic creation — no race window between check
26
+ * and create. Retries with backoff until the lock is acquired or timeout.
27
+ *
28
+ * Returns a release function that removes the lock file.
29
+ *
30
+ * @param projectRoot - Absolute path to the project root.
31
+ * @returns A function to call to release the lock.
32
+ */
33
+ function acquirePnpmLock(projectRoot) {
34
+ const lockDir = join(projectRoot, '.cleo');
35
+ mkdirSync(lockDir, { recursive: true });
36
+ const lockPath = join(lockDir, 'pnpm-install.lock');
37
+ const startTime = Date.now();
38
+ while (true) {
39
+ try {
40
+ // O_CREAT|O_EXCL — fail if file already exists (atomic)
41
+ const fd = openSync(lockPath, 'wx');
42
+ closeSync(fd);
43
+ return () => {
44
+ try {
45
+ unlinkSync(lockPath);
46
+ }
47
+ catch {
48
+ // Best-effort cleanup — lock file may already be gone.
49
+ }
50
+ };
51
+ }
52
+ catch {
53
+ // Lock exists — another process has it.
54
+ const elapsed = Date.now() - startTime;
55
+ if (elapsed >= LOCK_MAX_WAIT_MS) {
56
+ throw new Error(`pnpm-install lock timeout after ${LOCK_MAX_WAIT_MS}ms — ` +
57
+ `stale lock at ${lockPath}? Remove it manually if no pnpm process is running.`);
58
+ }
59
+ // Busy-wait with small interval — the lock holder should finish quickly.
60
+ const waitUntil = Date.now() + LOCK_RETRY_INTERVAL_MS;
61
+ while (Date.now() < waitUntil) {
62
+ // Spin-wait — sub-ms precision is fine for short intervals.
63
+ }
64
+ }
65
+ }
66
+ }
67
+ /**
68
+ * Run pnpm install in a worktree with serialization via file-based mutex.
69
+ *
70
+ * Only one worktree's pnpm install runs at a time across the entire project.
71
+ * This prevents the @@-prefixed doubled-directory corruption in .pnpm/
72
+ * caused by concurrent pnpm operations on the shared content-addressable store.
73
+ *
74
+ * After install, a `.pnpm-store/` directory is created in the worktree root
75
+ * and configured via `.npmrc` to isolate the worktree's pnpm store from the
76
+ * project root's global store. This prevents future races when the agent
77
+ * runs additional pnpm operations.
78
+ *
79
+ * @param worktreePath - Absolute path to the worktree.
80
+ * @param projectRoot - Absolute path to the project root (for lock file).
81
+ * @returns true if install succeeded, false otherwise.
82
+ *
83
+ * @task T9938
84
+ */
85
+ export function installWorktreeDependencies(worktreePath, projectRoot) {
86
+ const pnpmLockPath = join(worktreePath, 'pnpm-lock.yaml');
87
+ if (!existsSync(pnpmLockPath)) {
88
+ // No lockfile — nothing to install.
89
+ return false;
90
+ }
91
+ // Don't re-install if node_modules already exists (idempotent).
92
+ if (existsSync(join(worktreePath, 'node_modules'))) {
93
+ return true;
94
+ }
95
+ let releaseLock = null;
96
+ try {
97
+ releaseLock = acquirePnpmLock(projectRoot);
98
+ // Configure per-worktree pnpm store to isolate from global store.
99
+ // This prevents future races when agents run pnpm operations.
100
+ const npmrcPath = join(worktreePath, '.npmrc');
101
+ const storeDir = join(worktreePath, '.pnpm-store');
102
+ try {
103
+ writeFileSync(npmrcPath, `store-dir=${storeDir}\n`, 'utf-8');
104
+ }
105
+ catch {
106
+ // Best-effort — pnpm install still works with global store.
107
+ }
108
+ execFileSync('pnpm', ['install', '--frozen-lockfile', '--prefer-offline'], {
109
+ cwd: worktreePath,
110
+ encoding: 'utf-8',
111
+ timeout: PNPM_INSTALL_TIMEOUT_MS,
112
+ stdio: ['pipe', 'pipe', 'pipe'],
113
+ });
114
+ return true;
115
+ }
116
+ catch (err) {
117
+ const message = err instanceof Error ? err.message : String(err);
118
+ process.stderr.write(`[worktree] pnpm install failed for ${worktreePath}: ${message}\n`);
119
+ return false;
120
+ }
121
+ finally {
122
+ if (releaseLock) {
123
+ releaseLock();
124
+ }
125
+ }
126
+ }
127
+ //# sourceMappingURL=worktree-pnpm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree-pnpm.js","sourceRoot":"","sources":["../src/worktree-pnpm.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAChG,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,uBAAuB,GAAG,OAAO,CAAC;AACxC,MAAM,sBAAsB,GAAG,GAAG,CAAC;AACnC,MAAM,gBAAgB,GAAG,OAAO,CAAC,CAAC,iBAAiB;AAEnD;;;;;;;;;;;GAWG;AACH,SAAS,eAAe,CAAC,WAAmB;IAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC3C,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;IAEpD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,wDAAwD;YACxD,MAAM,EAAE,GAAG,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YACpC,SAAS,CAAC,EAAE,CAAC,CAAC;YACd,OAAO,GAAG,EAAE;gBACV,IAAI,CAAC;oBACH,UAAU,CAAC,QAAQ,CAAC,CAAC;gBACvB,CAAC;gBAAC,MAAM,CAAC;oBACP,uDAAuD;gBACzD,CAAC;YACH,CAAC,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,wCAAwC;YACxC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YACvC,IAAI,OAAO,IAAI,gBAAgB,EAAE,CAAC;gBAChC,MAAM,IAAI,KAAK,CACb,mCAAmC,gBAAgB,OAAO;oBACxD,iBAAiB,QAAQ,qDAAqD,CACjF,CAAC;YACJ,CAAC;YAED,yEAAyE;YACzE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,sBAAsB,CAAC;YACtD,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,EAAE,CAAC;gBAC9B,4DAA4D;YAC9D,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,2BAA2B,CAAC,YAAoB,EAAE,WAAmB;IACnF,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;IAC1D,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,oCAAoC;QACpC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,gEAAgE;IAChE,IAAI,UAAU,CAAC,IAAI,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;QACnD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,WAAW,GAAwB,IAAI,CAAC;IAC5C,IAAI,CAAC;QACH,WAAW,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;QAE3C,kEAAkE;QAClE,8DAA8D;QAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;QACnD,IAAI,CAAC;YACH,aAAa,CAAC,SAAS,EAAE,aAAa,QAAQ,IAAI,EAAE,OAAO,CAAC,CAAC;QAC/D,CAAC;QAAC,MAAM,CAAC;YACP,4DAA4D;QAC9D,CAAC;QAED,YAAY,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,mBAAmB,EAAE,kBAAkB,CAAC,EAAE;YACzE,GAAG,EAAE,YAAY;YACjB,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,uBAAuB;YAChC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sCAAsC,YAAY,KAAK,OAAO,IAAI,CAAC,CAAC;QACzF,OAAO,KAAK,CAAC;IACf,CAAC;YAAS,CAAC;QACT,IAAI,WAAW,EAAE,CAAC;YAChB,WAAW,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,57 @@
1
+ // SPDX-License-Identifier: MIT
2
+ // Copyright (c) 2026 kryptobaseddev
3
+ //
4
+ // Native-addon loader for @cleocode/worktree-napi.
5
+ //
6
+ // Resolution order:
7
+ // 1. A `worktree-napi.<triple>.node` file co-located with this loader.
8
+ // Release publishing copies this loader and the built .node files into
9
+ // @cleocode/worktree/native so the existing @cleocode/worktree trusted
10
+ // publisher owns the whole native distribution.
11
+ //
12
+ // If the co-located binary is unavailable we throw a descriptive error pointing
13
+ // at the missing bundled path and local build command.
14
+
15
+ const { existsSync } = require('node:fs');
16
+ const { join } = require('node:path');
17
+
18
+ function tripleName() {
19
+ const { platform, arch } = process;
20
+ if (platform === 'linux' && arch === 'x64') return 'linux-x64-gnu';
21
+ if (platform === 'linux' && arch === 'arm64') return 'linux-arm64-gnu';
22
+ if (platform === 'darwin' && arch === 'arm64') return 'darwin-arm64';
23
+ if (platform === 'darwin' && arch === 'x64') {
24
+ throw new Error(
25
+ '@cleocode/worktree-napi: macOS x64 prebuilds are not published. ' +
26
+ 'Use an arm64 Node.js runtime on Apple Silicon or build locally with ' +
27
+ '`pnpm dlx @napi-rs/cli@3 build --release` inside `crates/worktree-napi/`.'
28
+ );
29
+ }
30
+ if (platform === 'win32' && arch === 'x64') return 'win32-x64-msvc';
31
+ throw new Error(
32
+ `@cleocode/worktree-napi: unsupported platform/arch ${platform}/${arch}`
33
+ );
34
+ }
35
+
36
+ const triple = tripleName();
37
+ const localPath = join(__dirname, `worktree-napi.${triple}.node`);
38
+
39
+ let nativeBinding;
40
+
41
+ if (existsSync(localPath)) {
42
+ nativeBinding = require(localPath);
43
+ } else {
44
+ throw new Error(
45
+ `@cleocode/worktree-napi: missing native binding for ${triple} at ${localPath}. ` +
46
+ `The @cleocode/worktree package must include \`native/worktree-napi.${triple}.node\`; ` +
47
+ `for local development, run \`pnpm dlx @napi-rs/cli@3 build --release\` inside ` +
48
+ `\`crates/worktree-napi/\` and rename the output to \`worktree-napi.${triple}.node\`.`
49
+ );
50
+ }
51
+
52
+ // Static named-export re-binding so Node.js can detect the export shape
53
+ // when this CJS module is imported from an ESM consumer (e.g. compiled
54
+ // @cleocode/worktree under "type": "module"). Without this, ESM named
55
+ // imports like `import { copyPathsParallel } from './native/worktree-napi.cjs'`
56
+ // throw "does not provide an export named ..." at module link time.
57
+ module.exports = nativeBinding;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cleocode/worktree",
3
- "version": "2026.5.124",
3
+ "version": "2026.5.125",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Native CLEO worktree backend SDK — createWorktree, destroyWorktree, listWorktrees, pruneWorktrees with XDG path canon and declarative hooks (T1161)",
@@ -14,6 +14,7 @@
14
14
  },
15
15
  "files": [
16
16
  "dist/",
17
+ "native/",
17
18
  "README.md"
18
19
  ],
19
20
  "keywords": [
@@ -30,17 +31,14 @@
30
31
  "author": "CLEO Code <hello@cleocode.dev>",
31
32
  "license": "MIT",
32
33
  "dependencies": {
33
- "@cleocode/contracts": "2026.5.124",
34
- "@cleocode/paths": "2026.5.124"
35
- },
36
- "optionalDependencies": {
37
- "@cleocode/worktree-napi": "2026.5.124"
34
+ "@cleocode/paths": "2026.5.125",
35
+ "@cleocode/contracts": "2026.5.125"
38
36
  },
39
37
  "devDependencies": {
40
38
  "@types/node": "^24.3.0",
41
39
  "typescript": "^6.0.2",
42
40
  "vitest": "^4.1.4",
43
- "@cleocode/core": "2026.5.124"
41
+ "@cleocode/core": "2026.5.125"
44
42
  },
45
43
  "repository": {
46
44
  "type": "git",