Files
nana-story/docs/windows-developer-smoke.md
T

138 lines
6.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Windows 开发机冒烟
这份流程用于在真实 Windows 桌面环境关闭三道门:仓库全量验证、Tauri 桌面编译,以及
窗口/SQLite/LAPP 的人工冒烟。`scripts/windows-smoke.ps1` 不负责克隆、Git 认证、
工具链安装或 LAPP 凭据配置;它没有 API Key、Token 或密码参数,也不会读取、打印或
保存这些值。
## 1. 在脚本之外准备仓库
先用 SSH Key 或 Git Credential Manager 完成 Gitea 认证,再在单独的终端克隆仓库。
不要把 Token 或密码写进 Git URL、命令参数、脚本、仓库文件或回传日志。
目录必须保持相邻:
```text
workspace\
├─ lapp-rs\
└─ nana-story\
```
示例命令中的地址不含凭据:
```powershell
git clone --branch integration/v1 https://git.klarkxy.xyz/klarkxy/nana-story.git
git clone https://github.com/openlapp/lapp-rs.git
git -C .\lapp-rs checkout 5ba3c659e1536ec4bee16340faca603940a5cb17
```
还需预先安装 Windows 的 Tauri 2 原生开发依赖、Microsoft C++ Build Tools、WebView2、
Git、rustup、Rust 1.96.0 MSVC host(含 `rustfmt``clippy`)、Node.js 24+,以及
`package.json` 指定版本的 pnpm。脚本会通过 `vswhere` 自动载入 x64 C++ 开发环境并
检查 `cl.exe``link.exe``rc.exe`,但不会自动安装或升级工具链。下文使用 PowerShell
7 的 `pwsh`;脚本也只使用 Windows PowerShell 5.1 支持的语法,可将 `pwsh` 换成
`powershell.exe`
## 2. 跑机械门禁
第一次安装 JavaScript 依赖时,必须显式给出开关:
```powershell
pwsh -NoProfile -File .\scripts\windows-smoke.ps1 -InstallDependencies
```
后续运行不会修改依赖:
```powershell
pwsh -NoProfile -File .\scripts\windows-smoke.ps1
```
脚本依次执行:
1. 检查 Git、Rust 1.96.0 MSVC host、`rustfmt``clippy`、Node.js 24+ 和精确 pnpm 版本;
2.`origin` 获取最新 `integration/v1`,检查本地分支干净、正确跟踪该远端且与
最新远端提交一致,并打印被测提交;Git 认证或网络失败会直接停止;
3. 检查相邻 `lapp-rs` 的 origin、提交和工作树都与 `lapp-rs.lock` 固定来源一致;
4. 检查现有 `node_modules` 的 pnpm 版本及内置锁文件与仓库 `pnpm-lock.yaml` 一致;
5. 执行非交互式 `pnpm verify`
6. 执行 `pnpm tauri build --no-bundle`,验证真实 Windows 桌面目标。
任一步失败都会停止,且不会继续启动应用。
## 3. 启动桌面窗口
先用不需要 LAPP 的确定性模式验证窗口和存档:
```powershell
$smokeData = Join-Path ([System.IO.Path]::GetTempPath()) "nana-story-wave6-demo"
pwsh -NoProfile -File .\scripts\windows-smoke.ps1 -Launch -Demo -SmokeDataPath $smokeData
```
`-Launch` 只会在所有机械门禁通过后执行 `pnpm tauri dev`。关闭窗口会结束命令。
`-Demo` 只影响这次进程,不会写入系统配置。`-SmokeDataPath` 必须指向 Windows 临时
目录的子目录;应用只在这里创建冒烟数据库,不会碰正常的开发存档。复用同一路径用于
重启恢复测试;想从全新数据库开始时换一个新的目录名,脚本本身不会删除任何目录。
脚本在创建前后都会拒绝路径链中的 junction、符号链接和其他 reparse point,应用还会
再次 canonicalize 并验证最终路径。
在线冒烟前,应在系统 LAPP 中另行准备默认 profile
- 至少一个已启用模型同时声明 `chat``tool-call` 能力;
- 供应商凭据能由系统 Vault 解析;
- 凭据不进入 `nana-story` 设置、仓库、命令行或回传材料。
准备好后,不带 `-Demo` 启动:
```powershell
$lappSmokeData = Join-Path ([System.IO.Path]::GetTempPath()) "nana-story-wave6-lapp"
pwsh -NoProfile -File .\scripts\windows-smoke.ps1 -Launch -SmokeDataPath $lappSmokeData
```
打开设置页,确认显示“LAPP 已就绪”并能选择预期模型。“测试当前连接”只验证最小聊天
请求;通过后仍需提交一轮包含隐藏判定的行动,才能验证真实工具调用。只记录成功/失败
和界面错误码;不要复制 profile、Vault 内容、请求头或供应商原始响应。
在线模式还需验证一次取消恢复:
1. 提交一条会触发模型生成、但尚未改变故事节点的行动;
2. 在生成完成前点击“停止生成”,确认界面显示本轮未写入、节点与存档状态不变;
3. 点击唯一一次“重试本轮”,确认同一行动能完整完成;
4. 若停止请求输给了提交边界,界面应明确显示完整回合已安全写入,不能同时显示“未写入”;
5. 再提交一条会触发隐藏判定的行动,确认工具调用结束后只产生一个新故事节点。
若 Windows Vault 自身永久卡住,应用会结束当前回合并阻止新的原生模型调用;此时关闭
应用、修复 Vault 后再启动。Rust 无法强杀已进入系统原生凭据调用的线程。
## 4. SQLite 与重启冒烟
确定性模式中按界面建议完成以下检查:
1. 接受“天亮前回来”的许诺,继续调查并取得半张旧车票;
2. 关闭窗口,再次使用同一个 `$smokeData` 执行
`-Launch -Demo -SmokeDataPath $smokeData`
3. 确认场景、时钟、许诺、物品和当前线路恢复到关闭前状态;
4. 完成进入隧道和天亮前归来的终局;
5. 从历史节点创建新线路,重命名并切换到新线路;
6. 再次关闭和启动,确认活动线路仍是新线路;
7. 切回原线路,确认终局、许诺、物品和节点没有被新线路污染。
冒烟数据库文件名是 `nana-story.sqlite3`,位于本轮显式传入的 `$smokeData`,正常的
`$env:APPDATA\dev.nanastory.app\` 不会被读写。不要编辑或上传数据库;本轮只确认文件
存在、重启可恢复且线路互相隔离。
## 5. 回传结果
请回传以下信息:
- Windows 版本与 CPU 架构;
- 脚本的全部 `[ok]`/`[run]` 结果及最终退出码;
- `pnpm verify``pnpm tauri build --no-bundle` 是通过还是首个失败阶段;
- 窗口是否启动,关闭后命令是否正常退出;
- Demo 的两次重启恢复、终局与双线路隔离是否通过;
- 在线 LAPP 的 profile 就绪状态、所选 provider/model 标识,以及一轮工具调用是否成功;
- 在线回合的停止、节点不变、一次重试和取消/提交竞态提示是否符合上述语义;
- 若失败,附首个错误的文本或截图和复现步骤。
发送前删除用户名、绝对路径和其他个人信息。不要发送 API Key、Token、密码、Git
凭据、LAPP profile/Vault 文件、数据库文件、完整供应商响应或完整环境变量列表。