# 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。脚本只检查它们,不会自动安装或升级工具链。下文使用 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 文件、数据库文件、完整供应商响应或完整环境变量列表。