Преглед на файлове

build(deps): upgrade pnpm to 11.27.1 for build and host plugin management (#158)

- OSV: pnpm 9.x has 25 unfixed advisories incl. lockfile integrity bypass
- allowBuilds whitelist (esbuild, koffi); ignoreWorkspaceCycles keeps pnpm 9 task behavior
- test fixtures: node_modules links junction -> dir symlink for pnpm 11 relative symlinks
- embedding-provider: add missing dsh-api-settings-controller devDep (credentials/settings type registration)
- build.mjs reads pnpm version from packageManager field
聆风 преди 3 седмици
родител
ревизия
981ba64912

+ 2 - 2
.github/workflows/v8-ci.yml

@@ -25,7 +25,7 @@ jobs:
           persist-credentials: false
       - uses: pnpm/action-setup@b906affcce14559ad1aafd4ab0e942779e9f58b1 # v4
         with:
-          version: 9.0.0
+          version: 11.27.1
       - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
         with:
           node-version: ${{ matrix.node }}
@@ -54,7 +54,7 @@ jobs:
           persist-credentials: false
       - uses: pnpm/action-setup@b906affcce14559ad1aafd4ab0e942779e9f58b1 # v4
         with:
-          version: 9.0.0
+          version: 11.27.1
       - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
         with:
           node-version: '24.15.0'

+ 1 - 1
.github/workflows/v8-release.yml

@@ -27,7 +27,7 @@ jobs:
         run: git merge-base --is-ancestor HEAD origin/v8
       - uses: pnpm/action-setup@b906affcce14559ad1aafd4ab0e942779e9f58b1 # v4
         with:
-          version: 9.0.0
+          version: 11.27.1
       - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
         with:
           node-version: '24.15.0'

+ 1 - 1
CHANGELOG.md

@@ -44,7 +44,7 @@
 
 ### Compatibility
 
-- Windows;Node 22.19.0 起的 22.x 或 24.x,推荐 24.15.0;源码构建 pnpm 9.0.0,宿主插件管理 pnpm 11.7.0;DSH 0.1.5-rc.2。
+- Windows;Node 22.19.0 起的 22.x 或 24.x,推荐 24.15.0;pnpm 11.27.1(源码构建与宿主插件管理统一);DSH 0.1.5-rc.2。
 - 预览期配置与书仓契约可能变化,升级前备份。v6/v7 书仓没有自动迁移承诺。
 - tarball 使用无空格安装路径;主包保留 npm 发布保护,通过 GitHub Release 分发。
 

+ 1 - 1
CONTRIBUTING.md

@@ -4,7 +4,7 @@
 
 ## 本地开发
 
-从公开分支建立主题分支,例如 `git switch -c fix/install-help origin/v8`。使用 Node 24.15.0、pnpm 9.0.0,按 [开发说明](docs/development.md) 安装依赖和运行检查。无需任何内部开发工具或私人资料。
+从公开分支建立主题分支,例如 `git switch -c fix/install-help origin/v8`。使用 Node 24.15.0、pnpm 11.27.1,按 [开发说明](docs/development.md) 安装依赖和运行检查。无需任何内部开发工具或私人资料。
 
 常规检查不需要模型密钥。测试与截图使用合成书仓;不要提交自己的 API key、启动 token、完整对话或私人小说。
 

+ 1 - 1
README.md

@@ -28,7 +28,7 @@ DSH Scriptor is a local-first fiction writing workspace for DeepSeek Harness. Th
 
 ## 开始使用
 
-1. 准备 **Git for Windows、PowerShell 7**,安装 **Node.js 24.15.0**(也支持 22.19.0 起的 Node 22)及宿主安装所用的 **pnpm 11.7.0**。源码构建另外固定 pnpm 9.0.0。
+1. 准备 **Git for Windows、PowerShell 7**,安装 **Node.js 24.15.0**(也支持 22.19.0 起的 Node 22)及 **pnpm 11.27.1**(宿主插件管理与源码构建统一为该版本)。
 2. 安装 **DSH 0.1.5-rc.2**,下载此预览版的 `.tgz`,按 [安装教程](docs/user/install.md) 核对 SHA256 并创建 Web profile。
 3. 在宿主设置中配置主模型与凭据,阅读 [最小配置](docs/user/configuration.md)。
 4. 用 [合成练习素材](examples/first-book.md) 走一遍 [第一本书与第一章](docs/user/first-book.md),熟悉确认、定稿和恢复。

+ 1 - 1
docs/development.md

@@ -1,6 +1,6 @@
 # 从公开源码开发
 
-使用公开 v8 分支,推荐 Node 24.15.0、源码构建 pnpm 9.0.0。无需私人任务文件或原书。宿主的插件管理使用 pnpm 11.7.0;可用 `npm exec --yes --package=pnpm@9.0.0 -- pnpm <命令>` 执行下面的源码命令,保留宿主终端的 pnpm 11。
+使用公开 v8 分支,推荐 Node 24.15.0、pnpm 11.27.1(源码构建与宿主插件管理统一为该版本)。无需私人任务文件或原书。
 
 ```text
 git clone --branch v8 --single-branch https://github.com/lingfengQAQ/webnovel-writer.git

+ 3 - 3
docs/user/install.md

@@ -1,6 +1,6 @@
 # 安装 v8 预览版
 
-适用于 Windows。推荐 Node.js 24.15.0;也支持 22.19.0 起的 Node 22。DSH 固定为 0.1.5-rc.2,宿主插件管理使用 pnpm 11.7.0。v6 的 Claude Code 安装方式不适用于此分支。
+适用于 Windows。推荐 Node.js 24.15.0;也支持 22.19.0 起的 Node 22。DSH 固定为 0.1.5-rc.2,宿主插件管理使用 pnpm 11.27.1。v6 的 Claude Code 安装方式不适用于此分支。
 
 ## 1. 准备运行环境
 
@@ -10,14 +10,14 @@
 node --version
 git --version
 pwsh --version
-npm install --global pnpm@11.7.0 @deepseek-ai/dsh@0.1.5-rc.2
+npm install --global pnpm@11.27.1 @deepseek-ai/dsh@0.1.5-rc.2
 pnpm --version
 dsh --version
 ```
 
 Node、pnpm、DSH 预期版本分别属于上述范围、11.7.0、0.1.5-rc.2;Git 与 PowerShell 7 应能正常输出版本。安装依赖需要网络。Git 用于建书和保存确认后的版本历史;预构建包无需 TypeScript 或 npm 账号。若另一个 DSH 已在使用,请先阅读备份说明,并用不同的 profile 名称安装本工作台。
 
-源码仓库的 packageManager 是 pnpm 9.0.0,仅用于开发构建;不要用它代替宿主 profile 的 pnpm 11 配置支持。遇到 `ERR_PNPM_ADDING_TO_ROOT` 时先核对启动 DSH 的终端中 `pnpm --version`,不要随意忽略工作区保护或安装第二份宿主 peer。
+源码仓库的 packageManager 与宿主插件管理同为 pnpm 11.27.1。遇到 `ERR_PNPM_ADDING_TO_ROOT` 时先核对启动 DSH 的终端中 `pnpm --version`,不要随意忽略工作区保护或安装第二份宿主 peer。
 
 ## 2. 下载并核对
 

+ 1 - 1
package.json

@@ -4,7 +4,7 @@
   "type": "module",
   "version": "0.1.0-preview.3",
   "description": "DSH Scriptor: a long-form fiction writing workspace for DeepSeek Harness",
-  "packageManager": "pnpm@9.0.0",
+  "packageManager": "pnpm@11.27.1",
   "scripts": {
     "prepare": "node tools/git-hooks/install.mjs || echo [git-hooks] skipped",
     "test": "vitest run",

+ 1 - 1
packages/bundle/tests/host-loader.spec.ts

@@ -63,7 +63,7 @@ beforeAll(async () => {
   fs.mkdirSync(workspace)
   const source = process.env['WEBNOVEL_DSH_SOURCE']
   if (source === undefined) {
-    fs.symlinkSync(path.join(packageRoot, 'node_modules'), path.join(root, 'node_modules'), 'junction')
+    fs.symlinkSync(path.join(packageRoot, 'node_modules'), path.join(root, 'node_modules'), 'dir')
   } else {
     const host = loadSourceHost(source)
     fs.mkdirSync(path.join(root, 'node_modules', '@deepseek-ai'), { recursive: true })

+ 1 - 0
packages/embedding-provider/package.json

@@ -50,6 +50,7 @@
     "@deepseek-ai/dsh-agent-loop": "0.1.5-rc.2",
     "@deepseek-ai/dsh-api-remotes": "0.1.5-rc.2",
     "@deepseek-ai/dsh-api-session-controller": "0.1.5-rc.2",
+    "@deepseek-ai/dsh-api-settings-controller": "0.1.5-rc.2",
     "@deepseek-ai/dsh-app-boot": "0.1.5-rc.2",
     "@deepseek-ai/dsh-atomic-write": "0.1.5-rc.2",
     "@deepseek-ai/dsh-attachment": "0.1.5-rc.2",

+ 1 - 1
packages/embedding-provider/tests/settings.spec.ts

@@ -12,7 +12,7 @@ describe('真实 DSH 设置与提供方生命周期', () => {
     const root = fs.mkdtempSync(path.join(os.tmpdir(), 'webnovel-embedding-settings-'))
     const packageRoot = path.resolve(__dirname, '..')
     try {
-      fs.symlinkSync(path.join(packageRoot, 'node_modules'), path.join(root, 'node_modules'), 'junction')
+      fs.symlinkSync(path.join(packageRoot, 'node_modules'), path.join(root, 'node_modules'), 'dir')
       const outfile = path.join(root, 'embedding.mjs')
       await build({ entryPoints: [path.join(packageRoot, 'src/index.ts')], outfile, platform: 'node', format: 'esm', bundle: true, target: 'node22', external: ['@deepseek-ai/cordis', '@deepseek-ai/dsh-llm', 'node:*'] })
       const result = await promisify(execFile)(process.execPath, [path.join(packageRoot, 'tests/fixtures/settings-host.mjs'), root, outfile], {

Файловите разлики са ограничени, защото са твърде много
+ 5 - 5
pnpm-lock.yaml


+ 6 - 0
pnpm-workspace.yaml

@@ -1,2 +1,8 @@
 packages:
   - packages/*
+# core ↔ review 循环 devDeps 为历史结构(测试互相引用夹具),沿用 pnpm 9 的任意顺序执行
+ignoreWorkspaceCycles: true
+# pnpm 10+ 默认阻断依赖构建脚本;仅放行构建/测试确实需要的原生组件
+allowBuilds:
+  esbuild: true
+  koffi: true

+ 2 - 1
scripts/release/build.mjs

@@ -34,7 +34,8 @@ git(['archive', '--format=tar.gz', '--prefix=dsh-scriptor-source/', `--output=${
 const dependencies = await collectDependencySources(root, output)
 const hash = file => createHash('sha256').update(fs.readFileSync(path.join(output, file))).digest('hex')
 const assets = fs.readdirSync(output).filter(file => fs.statSync(path.join(output, file)).isFile()).sort()
-const manifest = { schemaVersion: 1, ...info, publicCommit: git(['rev-parse', 'HEAD']), node: process.version, pnpm: '9.0.0',
+const manifest = { schemaVersion: 1, ...info, publicCommit: git(['rev-parse', 'HEAD']), node: process.version,
+  pnpm: JSON.parse(fs.readFileSync(path.join(root, 'package.json'), 'utf8')).packageManager.split('@').pop(),
   dsh: JSON.parse(fs.readFileSync(path.join(root, 'dsh-baseline.json'), 'utf8')).registry.version,
   optionalPackages: [
     { name: embedding.name, version: embedding.version, tarball: embeddingTarball }

+ 2 - 2
scripts/release/install-smoke.mjs

@@ -35,10 +35,10 @@ const reportPath = path.join(root, 'install-report.json')
 const log = (name, output) => { fs.writeFileSync(path.join(root, `${name}.log`), output); console.log(`[install] ${name}`) }
 try {
   // Hosted Windows runners with a cold npm cache exceeded 4 minutes for the DSH tree; the network-bound step gets its own bound.
-  log('install-host', run(npm, ['install', '--prefix', host, '--save-exact', '--no-audit', '--no-fund', '@deepseek-ai/dsh@0.1.5-rc.2', 'pnpm@11.7.0'], host, 15 * 60 * 1000))
+  log('install-host', run(npm, ['install', '--prefix', host, '--save-exact', '--no-audit', '--no-fund', '@deepseek-ai/dsh@0.1.5-rc.2', 'pnpm@11.27.1'], host, 15 * 60 * 1000))
   const pathKey = Object.keys(env).find(key => key.toLowerCase() === 'path') ?? 'PATH'
   env[pathKey] = path.join(host, 'node_modules/.bin') + path.delimiter + (env[pathKey] ?? '')
-  report.hostPackageManager = 'pnpm@11.7.0'
+  report.hostPackageManager = 'pnpm@11.27.1'
   const require = createRequire(path.join(host, 'package.json'))
   const hostAnchor = require.resolve('@deepseek-ai/dsh/package.json')
   const cli = path.join(path.dirname(hostAnchor), 'lib/bin.js')

Някои файлове не бяха показани, защото твърде много файлове са промени