diff --git a/docs/project-memory/plans/【实施计划】导出产物面板与小红书小工具导出-2026-10-05.md b/docs/project-memory/plans/【实施计划】导出产物面板与小红书小工具导出-2026-10-05.md index 0afc70fbc..ec631b3d9 100644 --- a/docs/project-memory/plans/【实施计划】导出产物面板与小红书小工具导出-2026-10-05.md +++ b/docs/project-memory/plans/【实施计划】导出产物面板与小红书小工具导出-2026-10-05.md @@ -10,7 +10,7 @@ - Rust 模块:`src-tauri/src/export/mod.rs`(`EXPORT_WORK_RELATIVE_DIR` 与共用注册表读写、规范序列化 hash 助手)、`src-tauri/src/export/draft/mod.rs`、`src-tauri/src/export/draft/xhs_minitool/mod.rs`(表单 / 状态 / 结果 / 错误 DTO 与常量)、`src-tauri/src/export/draft/xhs_minitool/commands.rs`(小红书专属 `#[tauri::command]`)。 - 现存草稿的归位:`export/command/`(空 `mod.rs`)是上一轮「共享命令目录」方案的残留,最终落点是 per-target `commands.rs`,实现时删除该目录与 `mod.rs` 里的 `pub mod command;`。同一轮把草稿常量改名落定:`xhx-minitool.zip` → `xhs-minitool.zip`、`xhx-minitool.json` → `xhs-minitool.json`、`build-xhx-minitool` → `build:xhs-minitool`;表单字段随 `#[serde(rename_all = "camelCase")]` 在 JSON / TS 侧为 `iconPath`(Rust 侧仍是 `icon_path`)。 -- Rust 命令(3 个,全部 per-target):`read_xhs_minitool_export` → `XHSMiniToolExportState { form, hasScript, contentHash }`;`save_xhs_minitool_export_form(project_path, form, base_hash)`;`run_xhs_minitool_export_build(project_path)` → `XHSMiniToolExportRunResult { exitCode, outputTail }`(输出清洗后的尾部;stdout 与 stderr 已合并,所以不叫 stderrTail)。失败走 typed error `XHSMiniToolExportError`(ts-rs 导出);不新增 `GAME_CREATION_APP_COMMANDS` 条目,复用 `command.exec` 的 `enforce_project_permission_policy`。 +- Rust 命令(3 个,全部 per-target):`read_xhs_minitool_export` → `XHSMiniToolExportState { form, hasScript, contentHash }`;`save_xhs_minitool_export_form(project_path, form, base_hash)`;`run_xhs_minitool_export_build(project_path)` → `XHSMiniToolExportRunResult { outputTail }`(构建输出尾部,stdout 与 stderr 已合并;成功出口的退出码必然是 0,因此不带 `exitCode`,失败侧由 `CommandFailed.exitCode` 承担)。失败走 typed error `XHSMiniToolExportError`(ts-rs 导出);不新增 `GAME_CREATION_APP_COMMANDS` 条目,复用 `command.exec` 的 `enforce_project_permission_policy`。 - 复用而非新造:运行脚本走 `command_exec` 的 `resolve_project_command_spec_at → prepare/stage/spawn`(或 `run_project_verification_with_commit_at`),cwd 沿用 `project/export.rs` 的 `resolve_publish_build_cwd` 口径;icon 与 zip 下载复用 `save_local_project_asset_file`;不拿项目写锁、不推进 revision。 - 前端:`src/view/project-development/export/tabs/xiaohongshu/ArtifactsPane.tsx`(表单 + 产物 + 冲突/失败卡片)、新增 `state/useXhsMinitoolExport.ts`(状态与防抖自动保存)、新增 `state/xhsMinitoolInstruction.ts`(适配与修复指令的纯函数 + 契约常量)、新增 `state/{xhsMinitoolApi,xhsMinitoolFailure,xhsMinitoolFields,xhsMinitoolDownload}.ts`、新增 `src/view/project-development/export/generated/`(ts-rs 产物)。 - 快照排除:`src-tauri/src/project/filesystem.rs` 新增 `PROJECT_SNAPSHOT_SYNC_ONLY_EXCLUDED_COMPONENTS = [".export"]`;**不能**并进通用排除列表(`agent/direct_patch.rs` 直接拿它拒绝路径,`agc_apply_patch` 会拒 `.export/`,首次适配无法落地)。 @@ -52,9 +52,10 @@ - `91741f9de` 共享注册表与 export 模块骨架;`2a70926a3` 小红书 DTO / 错误 / 布局 / 校验与 ts-rs 绑定;`b6bef5b10` 生成目录加入 prettier 忽略;`3a1999e11` 三个命令 + 构建 + desktop 接线。 - `d694c183d` 前端行为层(命令入口、指令正文、失败说法、字段元数据、下载、状态 hook);`9a8d77dd9` 面板左半(表单 / 冲突 / 失败卡片与三颗按钮);`f8517abaa` 前端契约测试(10 例)。 -- `95323ce54` skill 的 `--zip-out` 与 AGC 接入契约(manifest `2026-08-26.41`);`3369f76b1` `.export` 快照同步排除。 +- `95323ce54` skill 的 `--zip-out` 与 AGC 接入契约(manifest `2026-08-26.41`);`3369f76b1` `.export` 快照同步排除;`faa93929b` 文档回写。 +- `5e2426c8a` 导出收尾判据抽成 `conclude(...)` 并补 5 例确定性用例(非零退出 / 超时 / 产物缺失 / 空产物 / 成功),同时去掉 `XHSMiniToolExportRunResult.exitCode` 这个恒为 0 的死字段;`463341c4b` 导出成功后把脚本输出尾部报给用户。 -已验证:Rust `export::` 18 例、`project_snapshot` 22 例、`export_bindings` + `check:generated-bindings`、前端 vitest 14 例(新增 10 + 既有 4)、`ai-game-creator-shell:typecheck`、`agc:skill-pack:check`。 +已验证:Rust `export::` 49 例(`export::draft::xhs_minitool` 33 例)、`export_bindings` 115 例、`project_snapshot` 22 例、`check:generated-bindings`(117 个文件)、前端 vitest 15 例(新增 11 + 既有 4)、`ai-game-creator-shell:typecheck`、`agc:skill-pack:check`、`check:doc-index`、`check:encoding`、`git diff --check`。 未验证(唯一开口项):真实 vite 项目上的首轮适配闭环——agent 跑通 `build:xhs-minitool`、产出可上传 zip、二次导出零 agent 调用;以及 `.export/` 换机后重新适配的体感。 diff --git a/docs/project-memory/plans/【里程碑】导出产物面板与小红书小工具导出-2026-10-05.md b/docs/project-memory/plans/【里程碑】导出产物面板与小红书小工具导出-2026-10-05.md index 1c5c1a371..a68d80106 100644 --- a/docs/project-memory/plans/【里程碑】导出产物面板与小红书小工具导出-2026-10-05.md +++ b/docs/project-memory/plans/【里程碑】导出产物面板与小红书小工具导出-2026-10-05.md @@ -39,7 +39,7 @@ - [x] 首次打开小红书 tab,`.export/xhs-minitool.json` 自动生成且 `name` / `introduction` / `iconPath` 全为空字符串;注册表损坏或字段不合法时给字段级错误,不静默吞掉。 - [x] `name` / `introduction` 为空或超 14 个 Unicode 字符、icon 不存在/越界/符号链接/扩展名不在 `png|jpg|jpeg`/超 5 MiB 时被拒,首个错误即返回。 - [x] `hasScript` 只由 npm 包 `package.json` 的 `scripts["build:xhs-minitool"]` 现算;注册表内没有 status、没有「已适配」、没有经验文本字段。 -- [x] 点「导出」每次都运行脚本并重新产出 `.export/xhs-minitool.zip`;脚本缺失、运行非零退出(带 exit code 与 stderr 尾部)、产物缺失各有独立 rich error。 +- [x] 点「导出」每次都运行脚本并重新产出 `.export/xhs-minitool.zip`;脚本缺失、运行非零退出(带 exit code 与输出尾部,stdout 与 stderr 已合并)、产物缺失各有独立 rich error。 - [x] 表单字段可复制;icon 与 zip 经原生保存对话框落盘;复制与下载不触发任何 agent 调用。 - [x] agent 改过注册表后,用户保存旧值触发字段级冲突面板,可逐字段选「我的 / 文件里的」,纯格式化改动静默吸收,任何情况下不静默覆盖用户输入。 - [x] 一键适配只入队一条指令且必须过会话写权限门;被拒时不落消息、不改注册表。 @@ -49,9 +49,9 @@ ## 证据要求 - 自动化(已落): - - Rust `cargo test ... --bin genarrative-ai-game-creator-shell export::` 18 例:注册表自动建空表单、格式漂移静默吸收、严格解析拒绝、表单首错、icon 越界/符号链接/扩展名、`hasScript` 现算、`contentHash` 冲突、产物路径守卫、脚本缺失/非零退出/产物缺失。 - - `export_bindings` + `npm run check:generated-bindings`(117 个生成文件)通过。 - - 前端 `npx vitest run tests/xhsMinitoolExport.test.tsx`(10 例)与既有 `tests/artifactsPanel.test.tsx`(4 例)通过;`npm run ai-game-creator-shell:typecheck` 通过。 + - Rust `cargo test ... --bin genarrative-ai-game-creator-shell export::` 49 例,其中 `export::draft::xhs_minitool` 33 例:注册表自动建空表单、格式漂移静默吸收、严格解析拒绝、表单首错、icon 越界/符号链接/扩展名、`hasScript` 现算、`contentHash` 冲突、产物路径守卫,以及构建收尾判据的逐条映射(脚本缺失、非零退出带退出码与输出尾部、超时无退出码、产物缺失、空产物不算、成功回输出尾部)。 + - `export_bindings` 115 例 + `npm run check:generated-bindings`(117 个生成文件)通过。 + - 前端 `npx vitest run tests/xhsMinitoolExport.test.tsx`(11 例)与既有 `tests/artifactsPanel.test.tsx`(4 例)通过;`npm run ai-game-creator-shell:typecheck` 通过。 - `.export/` 快照排除有定向用例:`project_snapshot::tests::project_snapshot_sync_policy_keeps_agent_state_and_still_blocks_credentials` 同时钉住「同步排除」与「通用口径不排除(Agent 仍可写)」。 - `npm run agc:skill-pack:sync` → `agc:skill-pack:check` 通过(`manifest.json` 版本 `2026-08-26.41`,文件数不变,仍 36 条)。 - 运行时(**未验证**,本里程碑唯一开口项):在真实 vite 项目上由 agent 完成首轮适配、产出可人工上传的 zip、二次导出零 agent 调用;`.export/` 换机后需重新适配的体感也需一并确认。