@cleocode/worktree 2026.5.123 → 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 +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/napi-binding.d.ts +7 -8
- package/dist/napi-binding.d.ts.map +1 -1
- package/dist/napi-binding.js +98 -11
- package/dist/napi-binding.js.map +1 -1
- package/dist/worktree-create.d.ts.map +1 -1
- package/dist/worktree-create.js +66 -2
- package/dist/worktree-create.js.map +1 -1
- package/dist/worktree-destroy.d.ts.map +1 -1
- package/dist/worktree-destroy.js +17 -0
- package/dist/worktree-destroy.js.map +1 -1
- package/dist/worktree-include.d.ts +17 -22
- package/dist/worktree-include.d.ts.map +1 -1
- package/dist/worktree-include.js +67 -33
- package/dist/worktree-include.js.map +1 -1
- package/dist/worktree-migrate.d.ts +68 -0
- package/dist/worktree-migrate.d.ts.map +1 -0
- package/dist/worktree-migrate.js +146 -0
- package/dist/worktree-migrate.js.map +1 -0
- package/dist/worktree-pnpm.d.ts +34 -0
- package/dist/worktree-pnpm.d.ts.map +1 -0
- package/dist/worktree-pnpm.js +127 -0
- package/dist/worktree-pnpm.js.map +1 -0
- package/native/worktree-napi.cjs +57 -0
- package/native/worktree-napi.darwin-arm64.node +0 -0
- package/native/worktree-napi.linux-arm64-gnu.node +0 -0
- package/native/worktree-napi.linux-x64-gnu.node +0 -0
- package/native/worktree-napi.win32-x64-msvc.node +0 -0
- package/package.json +5 -7
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/napi-binding.d.ts
CHANGED
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* ESM-friendly bridge to
|
|
2
|
+
* ESM-friendly bridge to the bundled worktree Node-API native addon.
|
|
3
3
|
*
|
|
4
|
-
* The napi-rs loader
|
|
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
|
|
7
|
-
*
|
|
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
|
-
*
|
|
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
|
|
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":"AAAA
|
|
1
|
+
{"version":3,"file":"napi-binding.d.ts","sourceRoot":"","sources":["../src/napi-binding.ts"],"names":[],"mappings":"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"}
|
package/dist/napi-binding.js
CHANGED
|
@@ -1,24 +1,28 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* ESM-friendly bridge to
|
|
2
|
+
* ESM-friendly bridge to the bundled worktree Node-API native addon.
|
|
3
3
|
*
|
|
4
|
-
* The napi-rs loader
|
|
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
|
|
7
|
-
*
|
|
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
|
-
*
|
|
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
|
|
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
|
|
34
|
-
nativeBinding
|
|
37
|
+
if (nativeBinding !== null)
|
|
38
|
+
return nativeBinding;
|
|
39
|
+
if (existsSync(bundledNativeLoaderPath)) {
|
|
40
|
+
nativeBinding = require_(bundledNativeLoaderPath);
|
|
41
|
+
return nativeBinding;
|
|
35
42
|
}
|
|
36
|
-
|
|
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);
|
package/dist/napi-binding.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"napi-binding.js","sourceRoot":"","sources":["../src/napi-binding.ts"],"names":[],"mappings":"AAAA
|
|
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;
|
|
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"}
|
package/dist/worktree-create.js
CHANGED
|
@@ -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
|
-
//
|
|
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":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"worktree-create.js","sourceRoot":"","sources":["../src/worktree-create.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACpF,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AA6BjC,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1E,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,0BAA0B,GAC3B,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,0BAA0B,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAEzF;;;;;;;;;;;;GAYG;AACH,SAAS,+BAA+B,CAAC,UAAkB;IACzD,MAAM,aAAa,GAAG,oBAAoB,EAAE,CAAC;IAC7C,4EAA4E;IAC5E,0EAA0E;IAC1E,0EAA0E;IAC1E,MAAM,UAAU,GAAG,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,aAAa,GAAG,CAAC;IACrF,MAAM,YAAY,GAAG,UAAU,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACtD,MAAM,aAAa,GAAG,UAAU,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAEvD,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC5C,MAAM,MAAM,CAAC,MAAM,CACjB,IAAI,KAAK,CACP,2CAA2C,UAAU,mBAAmB;YACtE,2BAA2B,aAAa,KAAK;YAC7C,8EAA8E;YAC9E,gFAAgF,CACnF,EACD,EAAE,IAAI,EAAE,yBAAyB,EAAE,UAAU,EAAE,aAAa,EAAE,CAC/D,CAAC;IACJ,CAAC;AACH,CAAC;AAED,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AAC1F,OAAO,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AAEjE;;;;;;;GAOG;AACH,SAAS,4BAA4B,CACnC,YAAoB,EACpB,eAAkC;IAElC,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC5C,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QACpE,SAAS,CAAC,CAAC,iBAAiB,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,YAAY,CAAC,CAAC;QAClE,SAAS,CAAC,CAAC,iBAAiB,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC,EAAE,YAAY,CAAC,CAAC;QAC3E,OAAO,CAAC,GAAG,eAAe,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,SAAS,eAAe,CAAC,YAAoB,EAAE,KAAa;IAC1D,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;QAAE,OAAO,IAAI,CAAC;IAC/B,IAAI,CAAC;QACH,SAAS,CAAC,CAAC,iBAAiB,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,YAAY,CAAC,CAAC;QAC/D,SAAS,CAAC,CAAC,iBAAiB,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC;QAClE,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;IACtB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,WAAmB,EACnB,OAA8B;IAE9B,MAAM,EAAE,MAAM,EAAE,KAAK,GAAG,EAAE,EAAE,YAAY,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IAC5D,MAAM,YAAY,GAAG,OAAO,CAAC,oBAAoB,KAAK,KAAK,CAAC;IAE5D,MAAM,OAAO,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;IACxC,MAAM,WAAW,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;IACpD,MAAM,YAAY,GAAG,0BAA0B,CAAC,WAAW,CAAC,CAAC;IAC7D,SAAS,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE7C,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,IAAI,QAAQ,MAAM,EAAE,CAAC;IACtD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,cAAc,CAAC,OAAO,CAAC,CAAC;IAC3D,MAAM,YAAY,GAAG,uBAAuB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAElE,yEAAyE;IACzE,+EAA+E;IAC/E,2EAA2E;IAC3E,+BAA+B,CAAC,YAAY,CAAC,CAAC;IAE9C,2EAA2E;IAC3E,wEAAwE;IACxE,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,QAAQ,EAAE,aAAa,CAAC,EAAE,YAAY,CAAC,CAAC;QACnE,IAAI,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,oDAAoD,YAAY,mCAAmC,CACpG,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,SAAS,CAAC,CAAC,UAAU,EAAE,QAAQ,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC;YACzD,IAAI,CAAC,SAAS,CAAC,CAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC;gBACzE,MAAM,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACzD,CAAC;YACD,yEAAyE;YACzE,wEAAwE;YACxE,iDAAiD;YACjD,SAAS,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,wEAAwE;IACxE,sEAAsE;IACtE,sEAAsE;IACtE,qEAAqE;IACrE,4DAA4D;IAC5D,0EAA0E;IAC1E,qBAAqB;IACrB,MAAM,YAAY,GAAG,OAAO,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;IAElF,IAAI,MAAe,CAAC;IACpB,IAAI,YAAY,EAAE,CAAC;QACjB,uEAAuE;QACvE,2EAA2E;QAC3E,yEAAyE;QACzE,2EAA2E;QAC3E,0DAA0D;QAC1D,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,OAAO,KAAK,MAAM,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3F,MAAM,aAAa,GAAG,SAAS;aAC5B,KAAK,CAAC,IAAI,CAAC;aACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACpB,MAAM,CAAC,OAAO,CAAC,CAAC;QAEnB,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;gBACvB,oEAAoE;gBACpE,wDAAwD;gBACxD,SAAS,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;gBAC7C,mEAAmE;gBACnE,OAAO,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;gBAC3E,MAAM,GAAG,KAAK,CAAC;YACjB,CAAC;iBAAM,CAAC;gBACN,MAAM,MAAM,CAAC,MAAM,CACjB,IAAI,KAAK,CACP,GAAG,uBAAuB,CAAC,cAAc,aAAa,MAAM,QAAQ;oBAClE,GAAG,aAAa,CAAC,MAAM,kCAAkC,OAAO,KAAK;oBACrE,sEAAsE;oBACtE,+CAA+C,MAAM,cAAc;oBACnE,yCAAyC,CAC5C,EACD,EAAE,IAAI,EAAE,uBAAuB,CAAC,cAAc,EAAE,aAAa,EAAE,CAChE,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,CAAC;YACN,iFAAiF;YACjF,OAAO,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;YAC5D,MAAM,GAAG,IAAI,CAAC;QAChB,CAAC;IACH,CAAC;SAAM,CAAC;QACN,yCAAyC;QACzC,OAAO,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;QAC3E,MAAM,GAAG,KAAK,CAAC;IACjB,CAAC;IAED,yDAAyD;IACzD,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,YAAY,EAAE,CAAC;QACjB,sDAAsD;QACtD,IACE,SAAS,CAAC,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,cAAc,MAAM,EAAE,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,EAC1F,CAAC;YACD,MAAM,GAAG,IAAI,CAAC;QAChB,CAAC;aAAM,IAAI,SAAS,CAAC,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC;YAClE,MAAM,GAAG,IAAI,CAAC;QAChB,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAE3C,sEAAsE;IACtE,+DAA+D;IAC/D,MAAM,eAAe,GAAG,OAAO,CAAC,iBAAiB,IAAI,EAAE,CAAC;IACxD,MAAM,sBAAsB,GAC1B,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,4BAA4B,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEhG,8EAA8E;IAC9E,2EAA2E;IAC3E,4EAA4E;IAC5E,6EAA6E;IAC7E,2CAA2C;IAC3C,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC;IAC9C,MAAM,YAAY,GAChB,UAAU,IAAI,sBAAsB,CAAC,MAAM,KAAK,CAAC;QAC/C,CAAC,CAAC,eAAe,CAAC,YAAY,EAAE,UAAU,CAAC;QAC3C,CAAC,CAAC,IAAI,CAAC;IAEX,qDAAqD;IACrD,MAAM,qBAAqB,GAAG,MAAM,gBAAgB,CAAC,KAAK,EAAE,aAAa,EAAE,YAAY,CAAC,CAAC;IAEzF,sEAAsE;IACtE,qEAAqE;IACrE,mEAAmE;IACnE,EAAE;IACF,6EAA6E;IAC7E,wEAAwE;IACxE,2EAA2E;IAC3E,2EAA2E;IAC3E,uDAAuD;IACvD,IAAI,eAAe,GAA4C,EAAE,CAAC;IAClE,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,QAAQ,GAAG,2BAA2B,CAAC,WAAW,CAAC,CAAC;QAC1D,eAAe,GAAG,oBAAoB,CAAC,QAAQ,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;IAC9E,CAAC;IAED,+EAA+E;IAC/E,4EAA4E;IAC5E,6EAA6E;IAC7E,yEAAyE;IACzE,MAAM,qBAAqB,GAAG,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAAC;IAC9E,IAAI,UAAU,CAAC,qBAAqB,CAAC,EAAE,CAAC;QACtC,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACpD,SAAS,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,MAAM,uBAAuB,GAAG,IAAI,CAAC,eAAe,EAAE,mBAAmB,CAAC,CAAC;QAC3E,YAAY,CAAC,qBAAqB,EAAE,uBAAuB,CAAC,CAAC;QAE7D,iFAAiF;QACjF,6EAA6E;QAC7E,yDAAyD;QACzD,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,qBAAqB,EAAE,OAAO,CAAC,CAGzE,CAAC;YACF,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,uBAAuB,EAAE,OAAO,CAAC,CAG7E,CAAC;YACF,MAAM,eAAe,GAAG,OAAO,UAAU,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7F,MAAM,iBAAiB,GACrB,OAAO,YAAY,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;YAE3E,IAAI,eAAe,IAAI,eAAe,KAAK,iBAAiB,EAAE,CAAC;gBAC7D,mEAAmE;gBACnE,+DAA+D;gBAC/D,IAAI,CAAC;oBACH,SAAS,CAAC,CAAC,UAAU,EAAE,QAAQ,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC;oBACzD,SAAS,CAAC,CAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC;gBACtE,CAAC;gBAAC,MAAM,CAAC;oBACP,wBAAwB;gBAC1B,CAAC;gBACD,IAAI,CAAC;oBACH,MAAM,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBACzD,CAAC;gBAAC,MAAM,CAAC;oBACP,mCAAmC;gBACrC,CAAC;gBAED,MAAM,MAAM,CAAC,MAAM,CACjB,IAAI,KAAK,CACP,+CAA+C,iBAAiB,IAAI;oBAClE,oCAAoC,eAAe,KAAK;oBACxD,qFAAqF,CACxF,EACD,EAAE,IAAI,EAAE,wBAAwB,EAAE,eAAe,EAAE,iBAAiB,EAAE,CACvE,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,IACE,GAAG;gBACH,OAAO,GAAG,KAAK,QAAQ;gBACtB,GAAyB,CAAC,IAAI,KAAK,wBAAwB,EAC5D,CAAC;gBACD,MAAM,GAAG,CAAC;YACZ,CAAC;YACD,sEAAsE;YACtE,uDAAuD;QACzD,CAAC;IACH,CAAC;IAED,wDAAwD;IACxD,wEAAwE;IACxE,sEAAsE;IACtE,qDAAqD;IACrD,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,MAAM,WAAW,GAAa,EAAE,CAAC;IAEjC,oEAAoE;IACpE,mEAAmE;IACnE,wEAAwE;IACxE,kEAAkE;IAClE,kEAAkE;IAClE,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,gBAAgB,CAAC,EAAE,CAAC;QAChE,MAAM,SAAS,GAAG,2BAA2B,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACrE,IAAI,SAAS,EAAE,CAAC;YACd,WAAW,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QACnD,CAAC;aAAM,CAAC;YACN,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,sDAAsD;IACtD,MAAM,oBAAoB,GAAG,MAAM,gBAAgB,CAAC,KAAK,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;IAEvF,kCAAkC;IAClC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IAC9D,MAAM,OAAO,GAA2B;QACtC,eAAe,EAAE,QAAQ;QACzB,cAAc,EAAE,YAAY;QAC5B,kBAAkB,EAAE,YAAY;QAChC,oBAAoB,EAAE,MAAM;QAC5B,iBAAiB,EAAE,WAAW;QAC9B,sBAAsB,EAAE,QAAQ;QAChC,gBAAgB,EAAE,oBAAoB;QACtC,IAAI,EAAE,GAAG,OAAO,IAAI,WAAW,EAAE;KAClC,CAAC;IAEF,kFAAkF;IAClF,MAAM,QAAQ,GAAG;QACf,0CAA0C;QAC1C,EAAE;QACF,kBAAkB,YAAY,EAAE;QAChC,EAAE;QACF,oBAAoB,YAAY,EAAE;QAClC,EAAE;QACF,8BAA8B,MAAM,EAAE;QACtC,6CAA6C;QAC7C,iEAAiE;QACjE,wEAAwE;QACxE,EAAE;QACF,2EAA2E;QAC3E,8BAA8B,YAAY,EAAE;QAC5C,oCAAoC,YAAY,IAAI;QACpD,iDAAiD;QACjD,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,iEAAiE;IACjE,sBAAsB,CAAC,WAAW,EAAE;QAClC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ;QACnC,OAAO,EAAE,YAAY;QACrB,MAAM;QACN,MAAM;QACN,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO;QACzC,OAAO,EAAE,IAAI;KACd,CAAC,CAAC;IAEH,4DAA4D;IAC5D,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAEvF,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,MAAM;QACN,OAAO;QACP,MAAM;QACN,WAAW;QACX,SAAS;QACT,MAAM;QACN,MAAM;QACN,OAAO;QACP,QAAQ;QACR,WAAW,EAAE,qBAAqB;QAClC,eAAe;QACf,sBAAsB;QACtB,YAAY;QACZ,SAAS,EAAE;YACT,WAAW;YACX,WAAW;YACX,WAAW,EAAE,oBAAoB;SAClC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -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,
|
|
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"}
|
package/dist/worktree-destroy.js
CHANGED
|
@@ -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
|
|
45
|
-
* from the
|
|
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
|
-
*
|
|
48
|
-
*
|
|
48
|
+
* Each non-negated pattern is copied from `<projectRoot>/<pattern>` to
|
|
49
|
+
* `<worktreePath>/<pattern>`. Negated patterns are excluded.
|
|
49
50
|
*
|
|
50
|
-
*
|
|
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
|
-
*
|
|
53
|
-
*
|
|
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
|
-
*
|
|
56
|
-
*
|
|
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 (
|
|
68
|
-
* @param worktreePath - Absolute path to the worktree directory.
|
|
69
|
-
* @returns Array of patterns that were successfully
|
|
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
|
|
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
|
|
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"}
|
package/dist/worktree-include.js
CHANGED
|
@@ -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
|
|
127
|
-
* from the
|
|
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
|
-
*
|
|
130
|
-
*
|
|
130
|
+
* Each non-negated pattern is copied from `<projectRoot>/<pattern>` to
|
|
131
|
+
* `<worktreePath>/<pattern>`. Negated patterns are excluded.
|
|
131
132
|
*
|
|
132
|
-
*
|
|
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
|
-
*
|
|
135
|
-
*
|
|
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
|
-
*
|
|
138
|
-
*
|
|
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 (
|
|
150
|
-
* @param worktreePath - Absolute path to the worktree directory.
|
|
151
|
-
* @returns Array of patterns that were successfully
|
|
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
|
|
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}
|
|
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
|
-
|
|
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":"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"}
|
|
@@ -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;
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cleocode/worktree",
|
|
3
|
-
"version": "2026.5.
|
|
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/
|
|
34
|
-
"@cleocode/
|
|
35
|
-
},
|
|
36
|
-
"optionalDependencies": {
|
|
37
|
-
"@cleocode/worktree-napi": "2026.5.123"
|
|
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.
|
|
41
|
+
"@cleocode/core": "2026.5.125"
|
|
44
42
|
},
|
|
45
43
|
"repository": {
|
|
46
44
|
"type": "git",
|