@namzu/sdk 34.0.0 → 34.0.1
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/CHANGELOG.md +6 -0
- package/dist/plugin/loader.d.ts.map +1 -1
- package/dist/plugin/loader.js +28 -4
- package/dist/plugin/loader.js.map +1 -1
- package/package.json +1 -1
- package/src/plugin/loader.ts +28 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 34.0.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- bc947c1: Delay durable CLI conversation creation until the first admitted message or explicit conversation operation, preserve user-owned command and plugin scope when the working directory is the home directory, validate feedback against the canonical session run ledger, protect generated project-state partitions with owner-only permissions, and fail closed when a delegated run loses its parent review channel.
|
|
8
|
+
|
|
3
9
|
## 34.0.0
|
|
4
10
|
|
|
5
11
|
### Major Changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/plugin/loader.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,KAAK,cAAc,EAAwB,MAAM,0BAA0B,CAAA;AAGpF,OAAO,EAAE,KAAK,MAAM,EAAiB,MAAM,oBAAoB,CAAA;AAE/D;;;GAGG;AACH,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA2DxF;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACvC,SAAS,EAAE,MAAM,EACjB,YAAY,GAAE,4BAAiC,GAC7C,OAAO,CAAC,cAAc,CAAC,CAezB;AAgDD;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,4BAA4B;IAC5C;;;;;;;;OAQG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAA;CAClC;AAED,wBAAgB,gBAAgB,CAC/B,QAAQ,EAAE,cAAc,EACxB,YAAY,GAAE,4BAAiC,GAC7C,IAAI,CAkBN;AAED,6GAA6G;AAC7G,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,MAAM,CAAA;AAE5C;;;;;GAKG;AACH,MAAM,WAAW,sBAAsB;IACtC,0EAA0E;IAC1E,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;IAC1B,8DAA8D;IAC9D,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAA;IAChC,yDAAyD;IACzD,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,WAAW,EAAE,CAAA;IAC/C,wDAAwD;IACxD,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CACrB;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,qBAAqB,CAC1C,gBAAgB,CAAC,EAAE,MAAM,EACzB,OAAO,CAAC,EAAE,sBAAsB,GAC9B,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/plugin/loader.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,KAAK,cAAc,EAAwB,MAAM,0BAA0B,CAAA;AAGpF,OAAO,EAAE,KAAK,MAAM,EAAiB,MAAM,oBAAoB,CAAA;AAE/D;;;GAGG;AACH,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA2DxF;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACvC,SAAS,EAAE,MAAM,EACjB,YAAY,GAAE,4BAAiC,GAC7C,OAAO,CAAC,cAAc,CAAC,CAezB;AAgDD;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,4BAA4B;IAC5C;;;;;;;;OAQG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAA;CAClC;AAED,wBAAgB,gBAAgB,CAC/B,QAAQ,EAAE,cAAc,EACxB,YAAY,GAAE,4BAAiC,GAC7C,IAAI,CAkBN;AAED,6GAA6G;AAC7G,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,MAAM,CAAA;AAE5C;;;;;GAKG;AACH,MAAM,WAAW,sBAAsB;IACtC,0EAA0E;IAC1E,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;IAC1B,8DAA8D;IAC9D,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAA;IAChC,yDAAyD;IACzD,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,WAAW,EAAE,CAAA;IAC/C,wDAAwD;IACxD,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CACrB;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,qBAAqB,CAC1C,gBAAgB,CAAC,EAAE,MAAM,EACzB,OAAO,CAAC,EAAE,sBAAsB,GAC9B,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAoChD"}
|
package/dist/plugin/loader.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { lstat, readFile, readdir } from 'node:fs/promises';
|
|
2
|
-
import { homedir } from 'node:os';
|
|
3
|
-
import { join } from 'node:path';
|
|
1
|
+
import { lstat, readFile, readdir, realpath } from 'node:fs/promises';
|
|
2
|
+
import { homedir, platform } from 'node:os';
|
|
3
|
+
import { join, resolve } from 'node:path';
|
|
4
4
|
import { PLUGIN_MANIFEST_FILENAME, PROJECT_PLUGIN_DIR, USER_PLUGIN_DIR, } from '../constants/plugin/index.js';
|
|
5
5
|
import { resolveWithinReal } from '../tools/paths.js';
|
|
6
6
|
import { PluginManifestSchema } from '../types/plugin/index.js';
|
|
@@ -185,8 +185,9 @@ export async function discoverAllPluginDirs(workingDirectory, options) {
|
|
|
185
185
|
const mayScan = (scope) => !scopes || scopes.includes(scope);
|
|
186
186
|
const projectRoot = workingDirectory ?? process.cwd();
|
|
187
187
|
const userRoot = homedir();
|
|
188
|
+
const sharedRoot = await samePhysicalDirectory(projectRoot, userRoot);
|
|
188
189
|
const [project, user] = await Promise.all([
|
|
189
|
-
mayScan('project')
|
|
190
|
+
mayScan('project') && !sharedRoot
|
|
190
191
|
? discoverScopedPlugins(projectRoot, PROJECT_PLUGIN_DIR, 'project', options?.log)
|
|
191
192
|
: Promise.resolve([]),
|
|
192
193
|
mayScan('user')
|
|
@@ -197,7 +198,30 @@ export async function discoverAllPluginDirs(workingDirectory, options) {
|
|
|
197
198
|
'namzu.plugin.project_count': project.length,
|
|
198
199
|
'namzu.plugin.user_count': user.length,
|
|
199
200
|
...(scopes ? { 'namzu.plugin.allowed_scopes': scopes } : {}),
|
|
201
|
+
...(sharedRoot ? { 'namzu.plugin.shared_user_project_root': true } : {}),
|
|
200
202
|
});
|
|
201
203
|
return { project, user };
|
|
202
204
|
}
|
|
205
|
+
/**
|
|
206
|
+
* Whether two scope roots name the same directory, including through a
|
|
207
|
+
* symlink. When home is the working directory, `.namzu/plugins` is user state:
|
|
208
|
+
* treating the same bytes as project state would let a project-only trust
|
|
209
|
+
* policy admit user-owned executable code, while scanning both installs it
|
|
210
|
+
* twice. Missing roots fall back to normalized absolute names; discovery will
|
|
211
|
+
* independently report them empty.
|
|
212
|
+
*/
|
|
213
|
+
async function samePhysicalDirectory(left, right) {
|
|
214
|
+
const canonical = async (path) => {
|
|
215
|
+
let value;
|
|
216
|
+
try {
|
|
217
|
+
value = await realpath(path);
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
value = resolve(path);
|
|
221
|
+
}
|
|
222
|
+
return platform() === 'win32' ? value.toLocaleLowerCase('en-US') : value;
|
|
223
|
+
};
|
|
224
|
+
const [a, b] = await Promise.all([canonical(left), canonical(right)]);
|
|
225
|
+
return a === b;
|
|
226
|
+
}
|
|
203
227
|
//# sourceMappingURL=loader.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/plugin/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/plugin/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AACrE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAC3C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EACN,wBAAwB,EACxB,kBAAkB,EAClB,eAAe,GACf,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,EAAuB,oBAAoB,EAAE,MAAM,0BAA0B,CAAA;AACpF,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAe,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAE/D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,SAAiB,EAAE,GAAY;IACpE,yEAAyE;IACzE,2EAA2E;IAC3E,0EAA0E;IAC1E,wEAAwE;IACxE,wEAAwE;IACxE,2EAA2E;IAC3E,2EAA2E;IAC3E,mEAAmE;IACnE,yEAAyE;IACzE,6BAA6B;IAC7B,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,eAAe,CAAC,EAAE,eAAe,EAAE,CAAC,CAAA;IAC/E,MAAM,IAAI,GAAa,EAAE,CAAA;IAEzB,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,CAAA;QACrC,IAAI,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;YACtD,MAAM,CAAC,IAAI,CAAC,0CAA0C,EAAE;gBACvD,yBAAyB,EAAE,SAAS;aACpC,CAAC,CAAA;YACF,OAAO,IAAI,CAAA;QACZ,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,CAAA;QACxC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,SAAQ;YAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;YACvC,kEAAkE;YAClE,6DAA6D;YAC7D,mEAAmE;YACnE,kEAAkE;YAClE,kEAAkE;YAClE,gDAAgD;YAChD,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAA;YAC/B,IAAI,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC;gBACxB,MAAM,CAAC,IAAI,CAAC,uCAAuC,EAAE,EAAE,mBAAmB,EAAE,QAAQ,EAAE,CAAC,CAAA;gBACvF,SAAQ;YACT,CAAC;YACD,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE;gBAAE,SAAQ;YAE9B,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,wBAAwB,CAAC,CAAA;YAC7D,IAAI,CAAC;gBACJ,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC,CAAA;gBAC1C,IAAI,QAAQ,CAAC,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;oBACrD,MAAM,CAAC,IAAI,CAAC,wCAAwC,EAAE;wBACrD,mBAAmB,EAAE,QAAQ;wBAC7B,4BAA4B,EAAE,YAAY;qBAC1C,CAAC,CAAA;oBACF,SAAQ;gBACT,CAAC;gBACD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YACpB,CAAC;YAAC,MAAM,CAAC;gBACR,uCAAuC;YACxC,CAAC;QACF,CAAC;IACF,CAAC;IAAC,MAAM,CAAC;QACR,MAAM,CAAC,KAAK,CAAC,6BAA6B,EAAE,EAAE,yBAAyB,EAAE,SAAS,EAAE,CAAC,CAAA;IACtF,CAAC;IAED,OAAO,IAAI,CAAA;AACZ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACvC,SAAiB,EACjB,eAA6C,EAAE;IAE/C,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,CAAA;IACnC,IAAI,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,4CAA4C,SAAS,EAAE,CAAC,CAAA;IACzE,CAAC;IACD,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,wBAAwB,CAAC,CAAA;IAC9D,MAAM,aAAa,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC,CAAA;IAC/C,IAAI,aAAa,CAAC,cAAc,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC;QAC/D,MAAM,IAAI,KAAK,CAAC,0DAA0D,YAAY,EAAE,CAAC,CAAA;IAC1F,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA;IACjD,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACvC,MAAM,QAAQ,GAAG,oBAAoB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;IACnD,gBAAgB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;IACxC,OAAO,QAAQ,CAAA;AAChB,CAAC;AAED,KAAK,UAAU,qBAAqB,CACnC,aAAqB,EACrB,iBAAyB,EACzB,KAAkB,EAClB,GAAY;IAEZ,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;QACvC,CAAC,eAAe,CAAC,EAAE,eAAe;KAClC,CAAC,CAAA;IACF,IAAI,CAAC;QACJ,yEAAyE;QACzE,uEAAuE;QACvE,mEAAmE;QACnE,MAAM,cAAc,GAAG,MAAM,iBAAiB,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAA;QAChF,OAAO,eAAe,CAAC,cAAc,EAAE,GAAG,CAAC,CAAA;IAC5C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,kEAAkE,EAAE;YAC/E,oBAAoB,EAAE,KAAK;YAC3B,yBAAyB,EAAE,IAAI,CAAC,aAAa,EAAE,iBAAiB,CAAC;YACjE,mBAAmB,EAAE,cAAc,CAAC,KAAK,CAAC;SAC1C,CAAC,CAAA;QACF,OAAO,EAAE,CAAA;IACV,CAAC;AACF,CAAC;AAED;;;;;;;GAOG;AACH;;;;;;;;;;GAUG;AACH,MAAM,6BAA6B,GAAG,CAAC,QAAQ,CAAU,CAAA;AA6BzD,MAAM,UAAU,gBAAgB,CAC/B,QAAwB,EACxB,eAA6C,EAAE;IAE/C,MAAM,MAAM,GAAG,QAA4D,CAAA;IAC3E,gEAAgE;IAChE,kEAAkE;IAClE,uEAAuE;IACvE,yEAAyE;IACzE,6DAA6D;IAC7D,MAAM,UAAU,GAAG,CAAC,GAAW,EAAW,EAAE,CAC3C,YAAY,CAAC,eAAe,KAAK,IAAI;QACpC,6BAAmD,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;IACnE,MAAM,WAAW,GAAG,CAAC,QAAQ,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC,MAAM,CAC9D,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CACzD,CAAA;IACD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAM;IAEpC,MAAM,IAAI,KAAK,CACd,WAAW,QAAQ,CAAC,IAAI,oCAAoC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,2TAA2T,CAC7Y,CAAA;AACF,CAAC;AAsBD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAC1C,gBAAyB,EACzB,OAAgC;IAEhC,qEAAqE;IACrE,qEAAqE;IACrE,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,eAAe,CAAC,EAAE,eAAe,EAAE,CAAC,CAAA;IACxF,IAAI,OAAO,EAAE,OAAO,KAAK,KAAK,IAAI,OAAO,EAAE,aAAa,KAAK,KAAK,EAAE,CAAC;QACpE,MAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE;YACxC,sBAAsB,EAAE,OAAO,CAAC,OAAO;YACvC,6BAA6B,EAAE,OAAO,CAAC,aAAa;SACpD,CAAC,CAAA;QACF,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAA;IACjC,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,EAAE,aAAa,CAAA;IACrC,MAAM,OAAO,GAAG,CAAC,KAAkB,EAAW,EAAE,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IAElF,MAAM,WAAW,GAAG,gBAAgB,IAAI,OAAO,CAAC,GAAG,EAAE,CAAA;IACrD,MAAM,QAAQ,GAAG,OAAO,EAAE,CAAA;IAC1B,MAAM,UAAU,GAAG,MAAM,qBAAqB,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAA;IAErE,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACzC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU;YAChC,CAAC,CAAC,qBAAqB,CAAC,WAAW,EAAE,kBAAkB,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,CAAC;YACjF,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,MAAM,CAAC;YACd,CAAC,CAAC,qBAAqB,CAAC,QAAQ,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC;YACxE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;KACtB,CAAC,CAAA;IAEF,MAAM,CAAC,KAAK,CAAC,2BAA2B,EAAE;QACzC,4BAA4B,EAAE,OAAO,CAAC,MAAM;QAC5C,yBAAyB,EAAE,IAAI,CAAC,MAAM;QACtC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,6BAA6B,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5D,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,uCAAuC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxE,CAAC,CAAA;IAEF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;AACzB,CAAC;AAED;;;;;;;GAOG;AACH,KAAK,UAAU,qBAAqB,CAAC,IAAY,EAAE,KAAa;IAC/D,MAAM,SAAS,GAAG,KAAK,EAAE,IAAY,EAAmB,EAAE;QACzD,IAAI,KAAa,CAAA;QACjB,IAAI,CAAC;YACJ,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAA;QAC7B,CAAC;QAAC,MAAM,CAAC;YACR,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;QACtB,CAAC;QACD,OAAO,QAAQ,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;IACzE,CAAC,CAAA;IACD,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACrE,OAAO,CAAC,KAAK,CAAC,CAAA;AACf,CAAC"}
|
package/package.json
CHANGED
package/src/plugin/loader.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { lstat, readFile, readdir } from 'node:fs/promises'
|
|
2
|
-
import { homedir } from 'node:os'
|
|
3
|
-
import { join } from 'node:path'
|
|
1
|
+
import { lstat, readFile, readdir, realpath } from 'node:fs/promises'
|
|
2
|
+
import { homedir, platform } from 'node:os'
|
|
3
|
+
import { join, resolve } from 'node:path'
|
|
4
4
|
import {
|
|
5
5
|
PLUGIN_MANIFEST_FILENAME,
|
|
6
6
|
PROJECT_PLUGIN_DIR,
|
|
@@ -261,9 +261,10 @@ export async function discoverAllPluginDirs(
|
|
|
261
261
|
|
|
262
262
|
const projectRoot = workingDirectory ?? process.cwd()
|
|
263
263
|
const userRoot = homedir()
|
|
264
|
+
const sharedRoot = await samePhysicalDirectory(projectRoot, userRoot)
|
|
264
265
|
|
|
265
266
|
const [project, user] = await Promise.all([
|
|
266
|
-
mayScan('project')
|
|
267
|
+
mayScan('project') && !sharedRoot
|
|
267
268
|
? discoverScopedPlugins(projectRoot, PROJECT_PLUGIN_DIR, 'project', options?.log)
|
|
268
269
|
: Promise.resolve([]),
|
|
269
270
|
mayScan('user')
|
|
@@ -275,7 +276,30 @@ export async function discoverAllPluginDirs(
|
|
|
275
276
|
'namzu.plugin.project_count': project.length,
|
|
276
277
|
'namzu.plugin.user_count': user.length,
|
|
277
278
|
...(scopes ? { 'namzu.plugin.allowed_scopes': scopes } : {}),
|
|
279
|
+
...(sharedRoot ? { 'namzu.plugin.shared_user_project_root': true } : {}),
|
|
278
280
|
})
|
|
279
281
|
|
|
280
282
|
return { project, user }
|
|
281
283
|
}
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* Whether two scope roots name the same directory, including through a
|
|
287
|
+
* symlink. When home is the working directory, `.namzu/plugins` is user state:
|
|
288
|
+
* treating the same bytes as project state would let a project-only trust
|
|
289
|
+
* policy admit user-owned executable code, while scanning both installs it
|
|
290
|
+
* twice. Missing roots fall back to normalized absolute names; discovery will
|
|
291
|
+
* independently report them empty.
|
|
292
|
+
*/
|
|
293
|
+
async function samePhysicalDirectory(left: string, right: string): Promise<boolean> {
|
|
294
|
+
const canonical = async (path: string): Promise<string> => {
|
|
295
|
+
let value: string
|
|
296
|
+
try {
|
|
297
|
+
value = await realpath(path)
|
|
298
|
+
} catch {
|
|
299
|
+
value = resolve(path)
|
|
300
|
+
}
|
|
301
|
+
return platform() === 'win32' ? value.toLocaleLowerCase('en-US') : value
|
|
302
|
+
}
|
|
303
|
+
const [a, b] = await Promise.all([canonical(left), canonical(right)])
|
|
304
|
+
return a === b
|
|
305
|
+
}
|