Explorar el Código

Merge pull request #152 from lingfengQAQ/codex/release-preview-3

fix(release): allow a cold-cache host install in the smoke check; 0.1.0-preview.3
聆风 hace 4 días
padre
commit
ca6dfb7c39

+ 1 - 1
.github/ISSUE_TEMPLATE/v8_bug.yml

@@ -7,7 +7,7 @@ body:
     id: version
     attributes:
       label: 工作台精确版本
-      placeholder: 0.1.0-preview.2
+      placeholder: 0.1.0-preview.3
     validations:
       required: true
   - type: textarea

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

@@ -10,7 +10,7 @@ concurrency:
 jobs:
   release:
     runs-on: windows-latest
-    timeout-minutes: 30
+    timeout-minutes: 50
     permissions:
       contents: write
     env:

+ 8 - 4
CHANGELOG.md

@@ -6,14 +6,14 @@
 
 尚无未发布变更。
 
-## [0.1.0-preview.2] — 2026-09-21
+## [0.1.0-preview.3] — 2026-09-21
 
-首个面向公开安装的开发预览版。`scriptor-v0.1.0-preview.1` 标签存在但没有对应 Release:其发行构建在 GitHub Windows runner 上因 `core.autocrlf` 把生成的许可证文本签出为 CRLF 而被干净树检查拒绝。本版仅修正该发行流程,产品代码与 preview.1 相同。
+首个面向公开安装的开发预览版。`scriptor-v0.1.0-preview.1` 与 `scriptor-v0.1.0-preview.2` 标签存在但没有对应 Release:前者的发行构建在 GitHub Windows runner 上因 `core.autocrlf` 把生成的许可证文本签出为 CRLF 而被干净树检查拒绝;后者在同一 runner 上安装隔离 DSH 宿主超过 4 分钟被验收脚本自身的超时中止。本版仅修正发行流程,产品代码与 preview.1 相同。
 
 ### Fixed
 
 - `.gitattributes` 覆盖 `.txt`、`.css`、`LICENSE` 与点文件,生成的第三方许可证文本在任何 Git 行尾设置下与仓库一致。
-- 发行工作流签出前禁用 `core.autocrlf`。
+- 发行工作流签出前禁用 `core.autocrlf`;安装验收对宿主安装步骤放宽到 15 分钟。
 - 死亡租约恢复测试在书仓锁外中断子进程;夹具清理超时放宽到 60 秒。
 - 备份指南补充 Windows 上整目录恢复与只读 Git 对象的处理。
 
@@ -42,6 +42,10 @@
 - API 连接、模型效果、速率限制和账单由所选服务决定;单元测试不代表真实模型质量。
 - 不支持把 Web 工作台未经保护地直接暴露到公网。
 
+## [0.1.0-preview.2] — 2026-09-21
+
+未产生 Release(见 preview.3 说明)。
+
 ## [0.1.0-preview.1] — 2026-09-20
 
-未产生 Release(见 preview.2 说明)。
+未产生 Release(见 preview.3 说明)。

+ 4 - 4
README.md

@@ -2,7 +2,7 @@
 
 基于 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) 的长篇小说写作工作台。把构想、设定、大纲、写章、审读、修改、定稿、记忆与导出放进一个能够暂停和继续的工作流程,作品以本地文件保存。
 
-**开发预览版:0.1.0-preview.2。** Windows 首发;重要作品使用前请备份。模型服务由你配置,调用可能产生费用。
+**开发预览版:0.1.0-preview.3。** Windows 首发;重要作品使用前请备份。模型服务由你配置,调用可能产生费用。
 
 DSH Scriptor is a local-first fiction writing workspace for DeepSeek Harness. This is the v8 developer preview. Runtime prompts and skills are included; model services are configured by the user.
 
@@ -11,9 +11,9 @@ DSH Scriptor is a local-first fiction writing workspace for DeepSeek Harness. Th
 | 产品线 | 运行环境 | 入口 |
 | --- | --- | --- |
 | v6 | Claude Code 插件 | [v6 文档与安装](https://github.com/lingfengQAQ/webnovel-writer/tree/master) |
-| v8(本分支) | DeepSeek Harness 工作台 | [下载预览版](https://github.com/lingfengQAQ/webnovel-writer/releases/tag/scriptor-v0.1.0-preview.2) · [安装教程](docs/user/install.md) |
+| v8(本分支) | DeepSeek Harness 工作台 | [下载预览版](https://github.com/lingfengQAQ/webnovel-writer/releases/tag/scriptor-v0.1.0-preview.3) · [安装教程](docs/user/install.md) |
 
-两个版本安装方式不同。当前没有经过验证的 v6/v7 书仓直接迁移方案。`v8` 是产品线名称,`0.1.0-preview.2` 是工作台安装包版本。
+两个版本安装方式不同。当前没有经过验证的 v6/v7 书仓直接迁移方案。`v8` 是产品线名称,`0.1.0-preview.3` 是工作台安装包版本。
 
 ## 能做什么
 
@@ -33,7 +33,7 @@ DSH Scriptor is a local-first fiction writing workspace for DeepSeek Harness. Th
 3. 在宿主设置中配置主模型与凭据,阅读 [最小配置](docs/user/configuration.md)。
 4. 用 [合成练习素材](examples/first-book.md) 走一遍 [第一本书与第一章](docs/user/first-book.md),熟悉确认、定稿和恢复。
 
-不要把源码压缩包当作可安装插件;普通用户下载 Release 中的 `linfengqaqtat-dsh-scriptor-0.1.0-preview.2.tgz`。安装包不需要在用户电脑上编译,也不要求 npm 账号。
+不要把源码压缩包当作可安装插件;普通用户下载 Release 中的 `linfengqaqtat-dsh-scriptor-0.1.0-preview.3.tgz`。安装包不需要在用户电脑上编译,也不要求 npm 账号。
 
 ## 文档
 

+ 3 - 3
docs/user/install.md

@@ -21,12 +21,12 @@ Node、pnpm、DSH 预期版本分别属于上述范围、11.7.0、0.1.5-rc.2;G
 
 ## 2. 下载并核对
 
-打开 [本版 Release](https://github.com/lingfengQAQ/webnovel-writer/releases/tag/scriptor-v0.1.0-preview.2),下载主包 `linfengqaqtat-dsh-scriptor-0.1.0-preview.2.tgz` 和 `SHA256SUMS`。
+打开 [本版 Release](https://github.com/lingfengQAQ/webnovel-writer/releases/tag/scriptor-v0.1.0-preview.3),下载主包 `linfengqaqtat-dsh-scriptor-0.1.0-preview.3.tgz` 和 `SHA256SUMS`。
 
 把包放入你有写权限的**无空格目录**。下面以 `C:/scriptor-dist` 为例;可换成另一处无空格目录。当前宿主在 Windows 转发安装参数时存在空格路径限制。
 
 ```powershell
-Get-FileHash -Algorithm SHA256 C:/scriptor-dist/linfengqaqtat-dsh-scriptor-0.1.0-preview.2.tgz
+Get-FileHash -Algorithm SHA256 C:/scriptor-dist/linfengqaqtat-dsh-scriptor-0.1.0-preview.3.tgz
 ```
 
 把输出与 SHA256SUMS 对应文件行比较,大小写不影响判断;不一致时重新下载并停止安装。GitHub 自动生成的 Source code 压缩包用于开发,不是插件安装包。
@@ -35,7 +35,7 @@ Get-FileHash -Algorithm SHA256 C:/scriptor-dist/linfengqaqtat-dsh-scriptor-0.1.0
 
 ```powershell
 dsh --profile scriptor --from-default-profile web --dump-config
-dsh plugin --profile scriptor add C:/scriptor-dist/linfengqaqtat-dsh-scriptor-0.1.0-preview.2.tgz
+dsh plugin --profile scriptor add C:/scriptor-dist/linfengqaqtat-dsh-scriptor-0.1.0-preview.3.tgz
 dsh --profile scriptor --dump-config
 ```
 

+ 1 - 1
docs/user/upgrade-backup.md

@@ -17,7 +17,7 @@
 4. 检查书房入口、技能是否各一份,核对实际书仓状态;先用合成副本试写。
 
 ```powershell
-dsh plugin --profile scriptor add C:/scriptor-dist/linfengqaqtat-dsh-scriptor-0.1.0-preview.2.tgz
+dsh plugin --profile scriptor add C:/scriptor-dist/linfengqaqtat-dsh-scriptor-0.1.0-preview.3.tgz
 dsh --profile scriptor --dump-config
 ```
 

+ 1 - 1
package.json

@@ -2,7 +2,7 @@
   "name": "webnovel-writer-v8",
   "private": true,
   "type": "module",
-  "version": "0.1.0-preview.2",
+  "version": "0.1.0-preview.3",
   "description": "DSH Scriptor: a long-form fiction writing workspace for DeepSeek Harness",
   "packageManager": "pnpm@9.0.0",
   "scripts": {

+ 2 - 2
packages/bundle/README.md

@@ -9,7 +9,7 @@ DSH 插件 `@linfengqaqtat/dsh-scriptor`,包含工作台、10 个写作技能
 
 ```powershell
 dsh --profile webnovel --from-default-profile web --dump-config
-dsh plugin --profile webnovel add C:/scriptor-dist/linfengqaqtat-dsh-scriptor-0.1.0-preview.2.tgz
+dsh plugin --profile webnovel add C:/scriptor-dist/linfengqaqtat-dsh-scriptor-0.1.0-preview.3.tgz
 dsh --profile webnovel --host 127.0.0.1 --port 6104 --no-open
 ```
 
@@ -32,6 +32,6 @@ dsh --profile webnovel --dump-config
 
 ## 预览版与公开文档
 
-当前主包 0.1.0-preview.2。完整的安装、配置、首章和备份教程见 [公开使用文档](https://github.com/lingfengQAQ/webnovel-writer/tree/v8/docs/user)。
+当前主包 0.1.0-preview.3。完整的安装、配置、首章和备份教程见 [公开使用文档](https://github.com/lingfengQAQ/webnovel-writer/tree/v8/docs/user)。
 
 第三方组件的原始声明见 [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md),许可证文本随包放在 licenses/。源码及校验和由对应的 GitHub Release 提供。

+ 1 - 1
packages/bundle/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@linfengqaqtat/dsh-scriptor",
-  "version": "0.1.0-preview.2",
+  "version": "0.1.0-preview.3",
   "private": true,
   "type": "module",
   "main": "./lib/index.js",

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

@@ -25,7 +25,7 @@ fs.writeFileSync(path.join(host, 'package.json'), JSON.stringify({ name: 'script
 fs.writeFileSync(path.join(root, 'npmrc'), '')
 const env = Object.fromEntries(Object.entries(process.env).filter(([key]) => !/^(npm_|pnpm_)|TOKEN|API_KEY|SECRET|DSH_|AGENTS_HOME|NODE_PATH/i.test(key)))
 Object.assign(env, { DSH_HOME: home, DSH_AGENTS_HOME: path.join(root, 'agents'), DSH_TELEMETRY_DISABLED: '1', NPM_CONFIG_USERCONFIG: path.join(root, 'npmrc') })
-const run = (entry, rest, cwd = workspace) => execFileSync(process.execPath, [entry, ...rest], { cwd, env, encoding: 'utf8', windowsHide: true, timeout: 240000, maxBuffer: 24 * 1024 * 1024 })
+const run = (entry, rest, cwd = workspace, timeout = 240000) => execFileSync(process.execPath, [entry, ...rest], { cwd, env, encoding: 'utf8', windowsHide: true, timeout, maxBuffer: 24 * 1024 * 1024 })
 const npmCandidates = [process.env.NPM_CLI_ENTRY, path.join(path.dirname(process.execPath), 'node_modules/npm/bin/npm-cli.js'), path.resolve(path.dirname(process.execPath), '../lib/node_modules/npm/bin/npm-cli.js')].filter(Boolean)
 const npm = npmCandidates.find(file => fs.existsSync(file))
 assert.ok(npm, 'npm-cli.js was not found; set NPM_CLI_ENTRY to the installed npm CLI')
@@ -33,7 +33,8 @@ const report = { ok: false, node: process.version, packageSha256: createHash('sh
 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 {
-  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))
+  // 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))
   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'