@avantf/dsh-plugin-base 0.4.1 → 0.4.2
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/README.md +108 -45
- package/dist/bootstrap.d.ts +5 -2
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +8 -3
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
# @avantf/dsh-plugin-base
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
DSH 插件共用的底座(共享库)。**插件在运行时按 file URL 动态加载它**——不静态 `import`、不打包进插件,
|
|
4
|
+
拿不到就降级挂载——把三件容易各写一遍的事收在一起:**启动期资源预装**、**宿主兼容门禁**、**一组与 DSH
|
|
5
|
+
无关的共享工具**。
|
|
5
6
|
|
|
6
7
|
- **运行期零依赖**:`dependencies` 为空,源码里连 `zod` 都不 import。
|
|
7
8
|
- 唯一一条 peer 是 `zod`(`>=4.4.3 <5`),由宿主 / 上层提供,好让调用方、本包与宿主解析到**同一份**
|
|
@@ -22,7 +23,7 @@
|
|
|
22
23
|
- 需要安装的由框架下载、校验完整性、**原子落盘**(同目录临时文件 + rename;跨进程一把族根锁);
|
|
23
24
|
- 锁被活体进程长期持有(锁文件 mtime 越过 `staleMs` 而 holder 的 pid 仍活着)时**不抢锁**:打一条用户可见的
|
|
24
25
|
`warn`(写明 holder 的 pid、已持有时长、本次已等待时长)后继续按预算等待;等不到就报 `lock/timeout`,
|
|
25
|
-
消息里带 holder 与 mtime
|
|
26
|
+
消息里带 holder 与 mtime 诊断;
|
|
26
27
|
- 每一项给出 `present / installed / skipped / failed`,失败带稳定 `code`;
|
|
27
28
|
- 三种内置资源种类:`npm-package`、`binary-archive`、`model-cache`。新的种类 = 一个新的 provider,
|
|
28
29
|
核心不动;
|
|
@@ -48,25 +49,8 @@
|
|
|
48
49
|
| `familyHome` / `familyToolsDir` / `familyModelsDir` / `resolveDataHome` / `expandHome` | 家族根与数据根解析:**⑤ 显式 → ④ 环境变量 → ② 配置值 → 默认**,一律传**具名 slot** |
|
|
49
50
|
| `wellFormedText` / `wellFormedDeep` | 出站文本的良构修复:孤立代理(lone surrogate)会被 `JSON.stringify` 原样写出、被严格解析器整篇拒收,这里统一换成 U+FFFD;引擎没有 `String.prototype.toWellFormed` 时走等价扫描。递归版只修字符串、数组与普通对象(含键),`Date` / 类实例等一律按同一性原样返回 |
|
|
50
51
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
> 它们不再是 `.` 接口的一部分;本包自己的插件各有自己的 logger 与 Typert 镜像,不需要它们。
|
|
54
|
-
|
|
55
|
-
### 4. 接口世代
|
|
56
|
-
|
|
57
|
-
`.` 上的导出构成本包的**接口**,由世代号冻结:
|
|
58
|
-
|
|
59
|
-
- `INTERFACE_VERSION`(正整数)+ `api/interface-vN.json` 快照(该代的值名与类型名,随源码在仓库里,
|
|
60
|
-
不进产物);
|
|
61
|
-
- `checkInterface(required, module)`:把"调用方构建时所对的世代"与"运行时加载到的本包报告的世代"
|
|
62
|
-
比一比,返回 `ok` / `incompatible` / `cannot-tell`。纯函数、**非对称**、读属性有守卫(取属性就抛的
|
|
63
|
-
对象读成"没报")、**永不抛**。只有加载到的世代**更旧**(成员可能缺失)才是 `incompatible`;加载到的
|
|
64
|
-
世代**更新**是 `ok` + 一句话的 `warning`(新世代不拿走有消费者的成员 —— v1→v2 是名字超集,v2→v3 是
|
|
65
|
-
剪枝,剪掉的 18 个成员经证明零消费者),相等是 `ok`;
|
|
66
|
-
- `readInterfaceRequirement(url)`:读调用方产物里烘着的那条记录 `{ baseVersion, interfaceVersion }`;
|
|
67
|
-
缺失或畸形返回 `undefined`("没烘"),不抛;
|
|
68
|
-
- 拿到 `incompatible` 时的建议动作是**降级**(不使用本包的共享能力)而不是拒绝挂载;拿到 `ok` + `warning`
|
|
69
|
-
时照常使用、只把那条警告记下来 —— 本包只把裁决与一句话的 `reason` / `warning` 交出去,怎么处理由调用方决定。
|
|
52
|
+
没有运行期消费者的构件(如 `createPluginLogger`、Typert 符号、compat 的单个探针、`npmPackageProvider`)
|
|
53
|
+
放在不承诺兼容的 `./internal` 子路径,不属于 `.` 接口。
|
|
70
54
|
|
|
71
55
|
## 怎么用
|
|
72
56
|
|
|
@@ -76,7 +60,79 @@
|
|
|
76
60
|
npm install @avantf/dsh-plugin-base
|
|
77
61
|
```
|
|
78
62
|
|
|
79
|
-
|
|
63
|
+
自己的插件把它声明成**普通运行期依赖**,装上插件就会带上它;插件在运行时从**自己的依赖树**解析它。
|
|
64
|
+
|
|
65
|
+
### 最小示例(完整,可直接抄)
|
|
66
|
+
|
|
67
|
+
下面是一个插件从构建期准备到启动期取用资源的完整路径。四步都要,缺一步会出现"能跑但拿不到底座"的
|
|
68
|
+
隐性降级。
|
|
69
|
+
|
|
70
|
+
```ts
|
|
71
|
+
// ── ① 构建期:把零依赖的 bootstrap 拷进自己的源码树,按相对路径 import ──────────────
|
|
72
|
+
// cp node_modules/@avantf/dsh-plugin-base/dist/bootstrap.js src/envinit-bootstrap.js
|
|
73
|
+
// (有打包步骤时用 ./preset 自动内联,见「运行时装载」。)
|
|
74
|
+
import { loadFramework } from './envinit-bootstrap.js'
|
|
75
|
+
|
|
76
|
+
// ── ② 启动期:解析底座 → 校验版本 → 动态 import() ─────────────────────────────────
|
|
77
|
+
// 底座缺失或版本超出 supportedRange 时只返回 undefined(并打一条 warn),
|
|
78
|
+
// 插件照常挂载、走自己的降级路径。
|
|
79
|
+
const framework = await loadFramework<typeof import('@avantf/dsh-plugin-base')>({
|
|
80
|
+
logger: { warn: (message) => { log.warn(`envinit: ${message}`) } },
|
|
81
|
+
})
|
|
82
|
+
|
|
83
|
+
if (framework === undefined) {
|
|
84
|
+
log.warn('envinit: @avantf/dsh-plugin-base 不可用,改用内置默认路径继续')
|
|
85
|
+
} else {
|
|
86
|
+
// ── ③ 取用一项就绪资源(完整调用;清单的形状见「写清单」)───────────────────────
|
|
87
|
+
const home = framework.familyHome() // 受管族根(受 AVANTF_HOME 约束)
|
|
88
|
+
const provisioner = framework.createProvisioner({ home, logger: log })
|
|
89
|
+
provisioner.register(framework.binaryArchiveProvider())
|
|
90
|
+
provisioner.register(framework.modelCacheProvider())
|
|
91
|
+
provisioner.declare({
|
|
92
|
+
plugin: 'my-plugin',
|
|
93
|
+
items: [{
|
|
94
|
+
id: 'my-plugin:tool',
|
|
95
|
+
kind: 'binary-archive',
|
|
96
|
+
spec: {
|
|
97
|
+
id: 'tool',
|
|
98
|
+
version: '1.2.3',
|
|
99
|
+
packs: { 'linux-x64': { url: 'https://example.com/tool.tar.gz', sha256: '<hex>' } },
|
|
100
|
+
},
|
|
101
|
+
target: { root: 'tools' },
|
|
102
|
+
schemaVersion: 1,
|
|
103
|
+
}],
|
|
104
|
+
})
|
|
105
|
+
await provisioner.ensure({ only: ['my-plugin:tool'], deadlineMs: 30_000 })
|
|
106
|
+
const state = provisioner.resolve('my-plugin:tool')
|
|
107
|
+
if (state.state === 'ready') {
|
|
108
|
+
// handle.dir 是可用入口目录(归档:可执行文件所在目录);handle.env 是 PATH 等增量。
|
|
109
|
+
process.env.PATH = [state.handle.dir, process.env.PATH].filter(Boolean).join(delimiter)
|
|
110
|
+
} else {
|
|
111
|
+
// pending / failed / skipped / missing 都走这里:用内置默认实现,不取消挂载。
|
|
112
|
+
log.warn(`my-plugin:tool 未就绪(${state.state}),改用内置默认路径`)
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// ── ④ 跑一次兼容门禁,读 compatReport 的结论(可选,但拒绝加载前必须有)──────────
|
|
116
|
+
// ctx 是插件自己的宿主 ctx,spec 是本插件的契约清单(服务 / 工具 / schema / 版本)。
|
|
117
|
+
const verdict = framework.verdictOf(framework.gatherEvidence(ctx, spec))
|
|
118
|
+
if (!verdict.load) {
|
|
119
|
+
log.error(framework.compatReport(verdict, {
|
|
120
|
+
heading: '插件未加载:与当前宿主的兼容性检查未通过。',
|
|
121
|
+
warningsLabel: '风险提示:',
|
|
122
|
+
warnings: verdict.warnings,
|
|
123
|
+
fix: '升级宿主,或按本插件声明的版本重建。',
|
|
124
|
+
logPointer: prefix => `完整诊断见日志里 ${prefix} 开头的行。`,
|
|
125
|
+
}))
|
|
126
|
+
} else if (verdict.warning !== undefined) {
|
|
127
|
+
log.warn(`compat: ${verdict.warning}`)
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
`delimiter` 来自 `node:path`(`import { delimiter } from 'node:path'`),`log` / `ctx` / `spec` 是插件自己的
|
|
133
|
+
对象——它们不来自底座,所以底座缺席时照样存在。
|
|
134
|
+
|
|
135
|
+
### 预装资源(逐项)
|
|
80
136
|
|
|
81
137
|
```ts
|
|
82
138
|
import { homedir } from 'node:os'
|
|
@@ -173,7 +229,7 @@ framework.createProvisioner({
|
|
|
173
229
|
})
|
|
174
230
|
```
|
|
175
231
|
|
|
176
|
-
|
|
232
|
+
清单可以不联网检查:
|
|
177
233
|
|
|
178
234
|
```bash
|
|
179
235
|
provision lint manifest.json
|
|
@@ -224,10 +280,11 @@ const files = new PromptFiles({ dir: join(dataHome, 'prompts'), namespace: 'my-p
|
|
|
224
280
|
|
|
225
281
|
如果调用方要在**运行时**装载本包(而不是让它出现在自己的 import 图里),本包提供零依赖的
|
|
226
282
|
`./bootstrap`:解析本包在哪 → 校验版本落在给定区间 → 动态 `import()`。它**不安装任何东西**,
|
|
227
|
-
失败只返回 `undefined`
|
|
283
|
+
失败只返回 `undefined` 并给出原因。把它拷进自己的源码、按相对路径 import(上面的最小示例),
|
|
284
|
+
本包缺席时调用方仍能加载,只是走降级路径。
|
|
228
285
|
|
|
229
286
|
```ts
|
|
230
|
-
import { loadFramework, readDependencyRange } from '
|
|
287
|
+
import { loadFramework, readDependencyRange } from './envinit-bootstrap.js'
|
|
231
288
|
|
|
232
289
|
const range = await readDependencyRange(import.meta.url) // 调用方自己声明的区间
|
|
233
290
|
const framework = await loadFramework<typeof import('@avantf/dsh-plugin-base')>({ logger })
|
|
@@ -280,6 +337,23 @@ const report = await runProviderConformance({ provider: myProvider, items: [...]
|
|
|
280
337
|
assertProviderConformance(report)
|
|
281
338
|
```
|
|
282
339
|
|
|
340
|
+
## 接口要点
|
|
341
|
+
|
|
342
|
+
`.` 上的导出(值 + 类型)构成本包的**接口**,由世代号冻结;`./preset` / `./conformance` / `./bootstrap`
|
|
343
|
+
三个子路径也在承诺内,`./internal` 从不承诺稳定。
|
|
344
|
+
|
|
345
|
+
- `INTERFACE_VERSION`(正整数)标识当前世代;每一代的名字面有一份随包的快照,名称与导出对不上就是
|
|
346
|
+
接口变更,必须升世代号。
|
|
347
|
+
- `checkInterface(required, module)`:把"调用方构建时所对的世代"与"运行时加载到的本包报告的世代"比一比,
|
|
348
|
+
返回 `ok` / `incompatible` / `cannot-tell`。纯函数、**非对称**、读属性有守卫(取属性就抛的对象读成
|
|
349
|
+
"没报")、**永不抛**。只有加载到的世代**更旧**(成员可能缺失)才是 `incompatible`;加载到的世代
|
|
350
|
+
**更新**是 `ok` + 一句话的 `warning`(新世代不拿走有消费者的成员),相等是 `ok`。
|
|
351
|
+
- `readInterfaceRequirement(url)`:读调用方产物里烘着的那条记录 `{ baseVersion, interfaceVersion }`;
|
|
352
|
+
缺失或畸形返回 `undefined`("没烘"),不抛。
|
|
353
|
+
- 拿到 `incompatible` 时的建议动作是**降级**(不使用本包的共享能力)而不是拒绝挂载;拿到 `ok` + `warning`
|
|
354
|
+
时照常使用、只把那条警告记下来 —— 本包只把裁决与一句话的 `reason` / `warning` 交出去,怎么处理由
|
|
355
|
+
调用方决定。
|
|
356
|
+
|
|
283
357
|
## 边界(不做的事)
|
|
284
358
|
|
|
285
359
|
- **不做包管理器**:不推导传递依赖、不生成 lockfile、不做版本求解;每个 item 自包含。
|
|
@@ -290,28 +364,17 @@ assertProviderConformance(report)
|
|
|
290
364
|
## 版本承诺
|
|
291
365
|
|
|
292
366
|
- 接口面是 `.` 上的导出(值 + 类型)加上 `./preset` / `./conformance` / `./bootstrap` 三个子路径;`./internal`
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
但 v3 不再对 v2 做结构超集。旧调用方遇到更新的 base 仍判 `ok` + `warning`,遇到更旧的 base 才降级。
|
|
302
|
-
- **接口与包版本是两条轴**:接口换代只升 `INTERFACE_VERSION` 并新增 `api/interface-vN.json`;包版本是
|
|
303
|
-
普通 semver,只表达包自身(行为变更 minor、修复 patch)。
|
|
367
|
+
是内部件,从不承诺稳定。
|
|
368
|
+
- **当前这一代(v3)把 `.` 收成了一个稳定子集**:`.` 只列"插件真取用、或插件作者被期望调用"的成员,
|
|
369
|
+
其余进 `./internal`。这是为了把"内部件的改动"与"接口"解耦,不是"这个集合永远不变":新能力从明确
|
|
370
|
+
标注为不稳定的入口引入,既有成员按弃用周期退出。
|
|
371
|
+
- **v3 是第一次破坏性换代**:v2 的成员如果有消费者,v3 一个不少;但 v3 不再对 v2 做结构超集。旧调用方
|
|
372
|
+
遇到更新的 base 仍判 `ok` + `warning`,遇到更旧的 base 才降级。
|
|
373
|
+
- **接口与包版本是两条轴**:接口换代只升 `INTERFACE_VERSION` 并新增快照;包版本是普通 semver,只表达
|
|
374
|
+
包自身(行为变更 minor、修复 patch)。
|
|
304
375
|
- 顺序敏感的参数一律传**具名对象**(如 `resolveDataHome({ explicit, env, configured })`);可观察的文案
|
|
305
376
|
由调用方给(如 `compatReport` 的 `words`)。
|
|
306
377
|
|
|
307
|
-
## 开发
|
|
308
|
-
|
|
309
|
-
```bash
|
|
310
|
-
pnpm check # 类型检查 + 测试
|
|
311
|
-
pnpm build # tsc → dist/
|
|
312
|
-
pnpm pack # 打包出 tarball
|
|
313
|
-
```
|
|
314
|
-
|
|
315
378
|
## 许可
|
|
316
379
|
|
|
317
380
|
MIT
|
package/dist/bootstrap.d.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* @module bootstrap
|
|
4
4
|
*/
|
|
5
5
|
/** The bootstrap version; the resolved framework must satisfy {@link supportedRange}. */
|
|
6
|
-
export declare const VERSION = "0.4.
|
|
6
|
+
export declare const VERSION = "0.4.2";
|
|
7
7
|
/**
|
|
8
8
|
* The framework interval this bootstrap can launch.
|
|
9
9
|
*
|
|
@@ -49,7 +49,10 @@ export declare function ensureFramework(options: EnsureFrameworkOptions): Promis
|
|
|
49
49
|
export declare function loadFramework<T = unknown>(options: EnsureFrameworkOptions): Promise<T | undefined>;
|
|
50
50
|
/**
|
|
51
51
|
* Read the range a plugin declares in the nearest `package.json`: walk up from `from`,
|
|
52
|
-
* preferring `peerDependencies` over `devDependencies`; `undefined` when none is
|
|
52
|
+
* preferring `dependencies` over `peerDependencies` over `devDependencies`; `undefined` when none is
|
|
53
|
+
* found. `dependencies` is the live declaration — the base ships as a normal dependency of the
|
|
54
|
+
* plugins — while `peerDependencies` stays as the fallback for plugins built when the base was
|
|
55
|
+
* declared a peer, and `devDependencies` covers a local checkout.
|
|
53
56
|
*/
|
|
54
57
|
export declare function readDependencyRange(from?: string): Promise<string | undefined>;
|
|
55
58
|
//# sourceMappingURL=bootstrap.d.ts.map
|
package/dist/bootstrap.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,yFAAyF;AACzF,eAAO,MAAM,OAAO,UAAU,CAAA;AAC9B;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,cAAc,mBAAmB,CAAA;AAI9C,kDAAkD;AAClD,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CAC7B;AAED,sEAAsE;AACtE,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,MAAM,CAAC,EAAE,eAAe,CAAA;IACjC,iDAAiD;IACjD,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CACjC;AAED,wDAAwD;AACxD,MAAM,WAAW,iBAAiB;IAChC,4CAA4C;IAC5C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,qDAAqD;IACrD,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAA;CAC5B;AA8LD;;;;;;GAMG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAoC7G;AAED,oFAAoF;AACpF,wBAAsB,aAAa,CAAC,CAAC,GAAG,OAAO,EAAE,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAaxG;AAED
|
|
1
|
+
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,yFAAyF;AACzF,eAAO,MAAM,OAAO,UAAU,CAAA;AAC9B;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,cAAc,mBAAmB,CAAA;AAI9C,kDAAkD;AAClD,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CAC7B;AAED,sEAAsE;AACtE,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,MAAM,CAAC,EAAE,eAAe,CAAA;IACjC,iDAAiD;IACjD,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CACjC;AAED,wDAAwD;AACxD,MAAM,WAAW,iBAAiB;IAChC,4CAA4C;IAC5C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,qDAAqD;IACrD,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAA;CAC5B;AA8LD;;;;;;GAMG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAoC7G;AAED,oFAAoF;AACpF,wBAAsB,aAAa,CAAC,CAAC,GAAG,OAAO,EAAE,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAaxG;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,GAAE,MAAsB,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAyCnG"}
|
package/dist/bootstrap.js
CHANGED
|
@@ -7,7 +7,7 @@ import { createRequire } from 'node:module';
|
|
|
7
7
|
import { dirname, join } from 'node:path';
|
|
8
8
|
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
9
9
|
/** The bootstrap version; the resolved framework must satisfy {@link supportedRange}. */
|
|
10
|
-
export const VERSION = '0.4.
|
|
10
|
+
export const VERSION = '0.4.2';
|
|
11
11
|
/**
|
|
12
12
|
* The framework interval this bootstrap can launch.
|
|
13
13
|
*
|
|
@@ -276,7 +276,10 @@ export async function loadFramework(options) {
|
|
|
276
276
|
}
|
|
277
277
|
/**
|
|
278
278
|
* Read the range a plugin declares in the nearest `package.json`: walk up from `from`,
|
|
279
|
-
* preferring `peerDependencies` over `devDependencies`; `undefined` when none is
|
|
279
|
+
* preferring `dependencies` over `peerDependencies` over `devDependencies`; `undefined` when none is
|
|
280
|
+
* found. `dependencies` is the live declaration — the base ships as a normal dependency of the
|
|
281
|
+
* plugins — while `peerDependencies` stays as the fallback for plugins built when the base was
|
|
282
|
+
* declared a peer, and `devDependencies` covers a local checkout.
|
|
280
283
|
*/
|
|
281
284
|
export async function readDependencyRange(from = process.cwd()) {
|
|
282
285
|
let current = from;
|
|
@@ -318,7 +321,9 @@ export async function readDependencyRange(from = process.cwd()) {
|
|
|
318
321
|
if (typeof parsed !== 'object' || parsed === null)
|
|
319
322
|
return undefined;
|
|
320
323
|
const manifest = parsed;
|
|
321
|
-
return rangeOf(manifest['
|
|
324
|
+
return rangeOf(manifest['dependencies'])
|
|
325
|
+
?? rangeOf(manifest['peerDependencies'])
|
|
326
|
+
?? rangeOf(manifest['devDependencies']);
|
|
322
327
|
}
|
|
323
328
|
catch {
|
|
324
329
|
// The nearest manifest is unparseable: stop.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@avantf/dsh-plugin-base",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.2",
|
|
4
4
|
"description": "The @avantf family base for DSH plugins: startup environment initialisation (declare → probe → fetch → verify → report) plus the host compatibility gate (provision / verdictOf / probes / report / post-registration verification). One package, loaded by the plugins through the inlined bootstrap.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"dsh",
|