Commit Graph

5743 Commits

Author SHA1 Message Date
k88936 aeec2f86bd skill:目录假设改成 game/;pack.mjs 去掉 --zip 与代跑的校验,保留 --vite-built-dir
- `SKILL.md` 的 vite 项目目录假设写的是 `games/`,实际是 `game/`;默认参数都按「cwd 就是 vite 项目根」给,非标准目录结构用 `--vite-built-dir` 指全路径;
- `pack.mjs` 删掉打包后调用 `validate.mjs` 的那一步,连带 `--skip-validate` / `--no-strict`:校验归 `validate.mjs` 与项目构建脚本,pack 只管整理产物、写 zip、按体积门禁审计;
- `pack.mjs` 删掉 `--zip` 与它专用的 `readPackageName()`(默认文件名):落点统一由 `--zip-out` 指定;`--vite-built-dir` 保留;
- 参数解析改成「只认 `--vite-built-dir` / `--zip-out`」:不认识的参数、缺值、缺 `--zip-out` 都当场打印用法并退出 2,打包本身失败仍退出 1,不再有静默退回默认目录的路径;
- `SKILL.md` 新增「脚本参数」一节,列出三个脚本各自的参数;
- `pack.mjs` 的用例改成「CLI 拒绝不认识的参数,且不写出 zip」;
- 同步 manifest 指纹(version=2026-08-26.49)。
2026-10-06 15:25:31 +08:00
k88936 6e33768b8b skill:目录假设改成 game/,pack.mjs 的 --help 补上少写的两个参数
- `SKILL.md` 的 vite 项目目录假设写的是 `games/`,实际是 `game/`;
- 默认参数都按「cwd 就是 vite 项目根」给,非标准目录结构要显式指 `--vite-built-dir`;
- `pack.mjs --help` 里 `--skip-validate` / `--no-strict` 原先只在用法行里出现、没有说明,补上;
- `SKILL.md` 新增「脚本参数」一节,列出三个脚本各自的参数(与 `--help` 里同一份);
- 同步 manifest 指纹(version=2026-08-26.46)。
2026-10-06 15:12:40 +08:00
k88936 af19af0a2f 清掉错误类型相关的过时文档
- 删两份 ADR:`AGC命令错误结构化与错误报告口径`、`AGC认证失败的JS侧载体与抛出时机`;错误通道的现行口径只留在代码与该专题技术方案里;
- 删导出面板的【实施计划】与【里程碑】两份计划,落地情况回到技术方案里一句话;
- `docs/README.md` 去掉对上述四份的链接,技术方案里的失败通道段落跟着删;
- `decision-log` 去掉 2026-10-01 那一段,2026-10-05 那段的标题与四条决策改成「同步细节与文案归属」;`pitfalls` 去掉两份 ADR 的引用。
2026-10-06 14:32:16 +08:00
k88936 8837fc5cd5 xhs-minitool skill:打包不再就地删文件,产物目录先预检
- `validate.mjs` 新增 `findUnsupportedFiles`:只挑出产物目录里白名单之外的文件,**不修改磁盘**;
- `pack.mjs` 改成先预检再动手,发现不支持的类型就整体失败并列出相对路径,不再像旧实现那样就地删除(指向源码目录时会静默删掉用户代码);
- `SKILL.md` 把目标、假设与默认项重写成一页能直接照做的说明,去掉「被 AGC 导出面板调用时」那三条宿主契约;
- 同步 `manifest.json` 指纹(version=2026-08-26.44)——之前脚本改了但指纹没跟上,宿主启动即报「内置 AGC Skill vite-export-xhs-minitool 内容指纹不匹配」。
2026-10-06 14:32:06 +08:00
k88936 f497ae23e0 导出面板的用例跟着行为改
- `xhsMinitoolExport`:删掉对生成文案的恒真断言(`toContain('…')` 那批)与只为它们存在的用例,改成行为断言与 IPC 调用断言;
- 新增「帮我填」两条:落盘一定发生在把指令交给 agent 之前(顺序用调用表钉住)、表单不合法也照样交出去(agent 正是来收拾这份表单的);
- 打包那颗按钮的用例按新行为改:没有脚本时点下去要开适配弹窗,而不是变灰;
- `xhsMinitoolContract` 只留一条:工作目录、脚本名、注册表与产物路径与 Rust 权威逐条一致。
2026-10-06 14:32:00 +08:00
k88936 809ce30c1a 表单加「帮我填」,图标一格不再手填
- 表单标题行加「帮我填」:先把用户手上没保存的输入落盘(落盘就是这次自动保存),再把改注册表的指令交给同一个项目会话,改完由每 2 秒的自动重读带回界面;
- 指令正文只给整份 `.export/xhs-minitool.json` 的形状示意,值的位置写每一项的要求;不重复当前值、不写项目根——agent 自己会读文件、本来就工作在项目根里;
- 示意类型钉在 ts-rs 生成的注册表类型上,`XHSMiniToolExportRegistry` 补 ts-rs 导出:Rust 侧加键、改名,前端这份示意会在 typecheck 里当场对不上;
- 图标一格去掉手填入口与空态提示,路径不外露,左边缩略图放大到 24,没选图时不摆一行废话;
- 新增 `ICON_IMPORTER_SETTINGS`:本地项目与云端素材库都能选,单张、png/jpg/jpeg、≤5 MiB,与宿主 `validate_icon` 对齐。
2026-10-06 14:31:53 +08:00
k88936 0f9c3beb8e 导出面板:打包永远可点,没有脚本时当场给适配出口
- 「打包」不再因为没有脚本判据就变灰:有没有脚本是点下去那一刻才成立的事实,灰着等于把判断推给用户,而他手上没有办法核对;
- 点下去先现算一次,没有脚本就把适配弹窗递过去(`AdaptPromptDialog`),两条出路摆在一起:让陶泥儿调通 / 先放着;
- 面板读不到导出信息时不拿空表单糊弄,读失败与读取中分开显示,并照旧每 2 秒重试;
- `PaneButton` 增加 `brand` 语气与 `hero` 尺寸,打包那颗按钮整行宽、小红书红,是这一页唯一的主行动。
2026-10-06 14:31:46 +08:00
k88936 000e3172fb 修掉导出面板卡在「正在读取导出信息…」
- `usePanel` 的注册表开关改成「进过小红书 tab」或「当前目标就是小红书」两个条件取或:从 tab 条切过来的路径原本既不开开关、也不发生一次文件访问,面板于是永远等不到第一次读取;
- 两条入口(点目标大卡、点 tab 条)合并到同一个 `enterTarget`,不再各写一份;
- `visited` 单独留着,是为了离开 tab 之后仍保有开关,表单自动保存的 600ms 窗口不被切 tab 掐掉;
- 新增 `tests/xhsMinitoolPanelTargets.test.tsx`,三条入口各钉一条。
2026-10-06 14:31:40 +08:00
k88936 d80ce78fd8 前端按命令的错误变体分流,卡片与出口只说事实
- `xhsMinitoolApi` / `xhsMinitoolFailure` 改成读三份载体,`expectNever` 钉死穷尽性,仍不对任何文案做判断;
- 失败卡片与冲突面板按变体分派按钮,文案改成用户看得懂的说法(注册表 → 这份导出信息、文件里的 → 项目里的);
- 输出尾部与另存为的句子不再出现实现词,复制按钮的成功 / 失败仍是按钮自己说。
2026-10-06 14:31:34 +08:00
k88936 a0b791083f 导出命令的错误按命令拆开,宿主补 app_log 现场
- `XHSMiniToolExportError` 一个大枚举拆成读 / 存 / 构建三份,每条命令只承载自己出得了的变体;
- 三条命令的返回类型跟着换成本命令那份,策略拒绝(`commandDenied`)与宿主故障(`exportUnavailable`)在各自主语里分开;
- 关键分支补 `app_log!`:命令入口、策略拒绝、脚本非零退出、产物缺失、注册表坏都留一行现场,出错时不必只靠前端转述;
- 重新生成 ts-rs 绑定:删掉 `XHSMiniToolExportError.ts`,新增 `XHSMiniToolExport{Read,Save,Build}Error.ts`。
2026-10-06 14:31:23 +08:00
k88936 25315299a5 AGC 发布入口迁到导出产物面板陶泥儿 tab
- 新增 useTaonierTab:接管试玩包导出、发布灰度、构建进度与阻断反馈、发布资料面板开关,状态挂在导出面板根上,切 tab 不丢
- usePanel 接入 taonier slice,TAB_PAGES 把 taonier state 交给 TaonierPage
- 重写 tabs/taonier/Page.tsx:渲染「发布到游戏广场」入口,并按 state 挂发布资料面板与进度/阻断弹窗
- useDirectProjectManifest 额外返回完整 manifest,供陶泥儿 tab 复用
- App.tsx 移除发布相关 state、灰度 effect、requestGamePublish、发布面板与两条弹窗的挂载,以及 export_local_project_package invoke
- 移除 DirectProjectChatHeader 的「发布到游戏广场」按钮,并删掉 DirectProjectChatView / DirectProjectChatBox 的 onRequestGamePublish 透传
- gamePublishFeedback 用例改为从导出面板陶泥儿 tab 进入发布;directProjectChatHeader 用例改为覆盖导出入口与「不再有发布入口」
- 同步权威合同文档:发布入口位置由聊天头改为导出产物面板陶泥儿 tab
2026-10-06 11:24:30 +08:00
k88936 8f2006439d 修复AGC自定义服务器重启后仍需重新登录
- 启动恢复登录态前先读取落盘的服务器选择,用自定义 origin 调用 read_client_auth_state
- 删除与认证恢复竞态的独立服务器选择水合 effect,登录表单状态改由认证恢复链路统一设置
- 新增回归测试,断言自定义服务器会话恢复提交的 expectedApiBaseUrl 不再落到渠道默认地址
2026-10-06 11:11:57 +08:00
k88936 ca53daaec4 删掉 artifactsPanel 那份只有存在性断言的外壳测试
- 四个用例里三个是「元素渲染出来了」:三个目标卡片、切 tab 后的文案、tablist 存在;关闭按钮只是把 onClose 转发一次
- 唯一有内容的那条「挂载的是主聊天同一个 .project-chat-surface」已由 chatDialogFrameLayout.test.ts 覆盖,不是唯一防线
- 面板真实行为(表单、冲突、失败卡片、自动重读、入队)由 xhsMinitoolExport.test.tsx 覆盖;前端 vitest 25 → 21 例,里程碑与实施计划的证据口径同步
2026-10-05 21:06:34 +08:00
k88936 f5a3ef8241 导出面板的用例去掉恒真的存在性断言
- getBy* / findBy* 找不到元素就抛,外面那层 expect(...).not.toBeNull() 永远不会失败:删掉它,等待出现改用 findBy*,需要对照的用 queryBy* + toBeNull()
- 能写成行为的就别写成存在:有脚本时点按钮行的「适配」看 adapt 是否被调用;读失败时同样点一下证明入口没变成摆设;切 tab 后补一条「卡片没有重新长回来」的负向断言
- artifactsPanel 三个目标改用 role=button(可点入口,不是三行说明文字),保留 querySelector 那几条(它们真的会返回 null)
- team-conventions 记下这条断言口径,并给「不建立固定频率轮询」补上导出面板对 .export/ 的显式例外(那两件事实没有事件源,只能现读)
2026-10-05 19:51:52 +08:00
k88936 832fca8ae1 layout 的用例不再把实现抄一遍,改成只钉关系的四条
- 原来的 artifact_relative_path_stays_inside_the_export_directory 断言的是 format!("{EXPORT_WORK_RELATIVE_DIR}/{ARTIFACT_FILE_NAME}") 本身,只重复实现、挡不住任何真实改动
- 改成:前端字符串相对路径与宿主 PathBuf 必须指向同一文件;相对路径必须项目内、单层、无 .. 且不出现反斜杠(跨平台的线上字符串);注册表与产物共用一个项目根锚定的 flat 目录;脚本名保住 build:<后缀> 形式且不许退化成裸 build(否则跑掉的是项目自己的构建)
- 逐条反证:把产物路径改成 .export/xhs-minitool/ 子目录、把 export_dir 挪进子目录、把 SCRIPT_NAME 改成 build,对应用例分别变红;export:: 50 → 53 例
2026-10-05 19:44:43 +08:00
k88936 9a3e211205 导出的文档按 ADR 收口回写:失败通道、输出尾部事实与门禁口径
- decision-log 新增一条:同步细节不进对外状态(内容与指纹两条命令)、自动重读取代刷新按钮、失败通道按 ADR 两道口子分流、宿主不预拼用户可见文案、契约常量以 Rust 为唯一权威并用跨语言测试钉住;顺带修掉上一条里「只有 3 个 per-target 命令」的过时说法
- 主规范导出一节补失败通道与文案归属;README 的状态从「未实现」改成已实现待运行时验收
- 里程碑与实施计划的证据口径同步:export:: 50 例(xhs_minitool 34 例)、export_bindings 116 例、生成文件 118、前端 25 例(19 + 契约 2 + 既有 4);记下本机 check:rust:shell 唯一失败是 4 个 process_session 真 PTY 用例(既有环境噪声),并补上 dffe4de55 / df3a6826b 两条提交
2026-10-05 19:25:56 +08:00
k88936 df3a6826b1 导出面板失败通道按 ADR 分流:真故障原样抛出,复制失败不再静默
- 新增 state/xhsMinitoolOutputTail.ts:宿主只回尾部原文与省略量,「已省略前 N 个字符」这句话在前端拼,失败卡片与成功提示共用
- xhsMinitoolFailure.ts 接住新变体 commandDenied(策略拒绝是预期拒绝,句子在前端拼),commandFailed 的现场改走尾部说明
- useXhsMinitoolExport 的三处 catch:认不出形状的拒绝与 exportUnavailable 先给现场再原样抛出进错误池,按指纹去重(面板 2 秒一轮重读,不会把报告池 count 刷成轮询次数),不再把裸 message 当业务提示
- CopyButton 改用 Tauri 剪贴板插件并显示失败态:原来的 navigator.clipboard 在 WebView 里可能根本没有、失败还被吞掉
- 用例 18 → 19 例:省略说明由前端拼、未分类拒绝原样抛出、宿主故障先给卡片再抛一次、复制失败可见
2026-10-05 19:25:22 +08:00
k88936 dffe4de555 导出链路按 ADR 收口:策略拒绝与宿主故障分开,输出尾部只回事实
- 权限点位改用 typed 的 enforce_project_permission_policy_rejection:Denied 映射成新变体 commandDenied,PolicyUnavailable 仍映射 exportUnavailable,调用方才有「该不该上报」的分流依据
- CommandFailed 与 XHSMiniToolExportRunResult 增加 omittedCharacters;tail() 只回尾部原文,不再由宿主拼「省略前 N 个字符」这句用户可见文案
- 同步 ts-rs 绑定:新增 CommandDenied.ts,生成文件 117 → 118
2026-10-05 19:24:28 +08:00
k88936 dfd392e25d 记录契约常量的单一来源与前端契约用例
- 实施计划:补「Rust 是权威、前端副本由 xhsMinitoolContract 钉住」这条边界,前端 vitest 口径 21 例(新增 15 + 契约 2 + 既有 4),并说明指令正文与用例的期望值都从常量组合。
- 里程碑:证据里加 tests/xhsMinitoolContract.test.ts 这条(读 layout.rs / export/mod.rs 逐条比对)。
2026-10-05 18:42:47 +08:00
k88936 11de789a8f 契约常量只留一份,前端副本对着 Rust 权威钉住
- 指令正文不再写死任何契约字符串:工作目录、产物、注册表、三个脚本落点全从常量组合(原先 .export/xhs-minitool.pack.mjs 在正文里硬编码了三处,常量形同注释)。
- 前端用例不再抄一份字面量:期望值一律从契约常量推——拷贝清单改成遍历 XHS_MINITOOL_COPIED_SCRIPTS(漏列一条就红),game/ 落点写成 ../${ARTIFACT},下载相对路径、打包输出、提示匹配器同理。
- 新增 tests/xhsMinitoolContract.test.ts:读 Rust 的 export/mod.rs 与 draft/xhs_minitool/layout.rs,逐条要求前端常量等于权威值。副本没有校验就是会漂移的注释——改 Rust 漏改前端时,两边的用例原本各自都还绿。
- 两边都验过钉得住:把 Rust 的 ARTIFACT_FILE_NAME 改成 xhs-minitool-v2.zip、把前端 EXPORT_WORK_RELATIVE_DIR 改成 .exports,这条用例各自报出具体哪个常量对不上。
- ts-rs 不能绑 const 的结论在这里落成实际方案:值只由 Rust 说,前端副本的存在性由契约用例说,正文有没有用上常量由指令用例说。
2026-10-05 18:42:34 +08:00
k88936 17044f0504 回写自动重读与命令切分的口径
- 主规范:四条命令与内容/指纹的切分理由、自动重读的两条采纳规则(hasScript 随时采纳、表单只在用户没在编辑时采纳)、指纹不进对外状态、验收项补「自动重读不覆盖未保存输入」。
- 实施计划与里程碑:命令清单改 4 条、面板改两颗按钮、运行时验收去掉「点刷新」一步、前端 vitest 口径 19 例(新增 15 + 既有 4),并说明刷新撤掉待保存输入那条行为已被取代。
2026-10-05 18:29:11 +08:00
k88936 aea1fb8f9f 去掉刷新按钮,内容与脚本判据按间隔自动重读
- 面板只剩「适配 / 导出」两颗显式按钮:脚本判据与内容每 2 秒自动重读一次(窗口在后台时跳过),agent 回合结束后导出按钮自己亮起来,用户不用先点刷新再核对状态。
- 自动重读把两条事实分开:hasScript 是宿主的现算事实,任何时刻都采纳;表单是用户的编辑对象,只有用户手上没有未保存输入(也不在冲突里)时才覆盖,否则只更新 hasScript,绝不覆盖正在打的字。
- 只有重读到的内容真的变了才去取指纹:指纹与内容必须配套,取早了会把外部改动认成自己的基线(改动前是「刷新以磁盘为准、顺手撤掉待保存输入」,那条路径连同它的回归用例一并消失,改为「轮询不撤掉待保存的输入」)。
- 同步细节退出对外状态与界面:contentHash、saving、dirty、load 都不再对外,面板也不再显示「保存中 / 改动会在停手后自动保存」。
- 前端用例 14 → 15:改为钉「指纹与内容分两条命令、保存带回读到的 baseHash」「用户有未保存输入时轮询只更新脚本判据、不动表单(去掉该判据即失败)」「agent 事后改注册表或加脚本,轮询自动带回来」。
2026-10-05 18:28:42 +08:00
k88936 f7be3e6a11 内容与注册表指纹拆成两条命令,指纹退出内容 DTO
- read_xhs_minitool_export 只回内容(form + hasScript),新增 read_xhs_minitool_export_hash 单独回注册表指纹;save_xhs_minitool_export_form 成功后回新的指纹。
- XHSMiniToolExportState 去掉 contentHash:它是写回时的同步细节,混在「面板渲染的内容」里会让自动刷新顺手换掉写回基线,把两次刷新之间的外部改动认成自己的基线、静默吞掉冲突。
- 分两条命令之后,刷新这条高频路径在类型上就碰不到基线;指纹只在进编辑会话或重读到的内容真的被采纳时取一次。
- 待办标注:这条命令切分也让「面板不再显示任何同步状态」在类型上成立(前端不必拿到指纹就能渲染)。
2026-10-05 18:28:12 +08:00
k88936 6dd0dc00cc 回写未适配入口与失败卡片三向分派
- 主规范:说明未适配结论只在注册表读回来之后下、提示卡片自带入队按钮、失败卡片按 action 分派适配/修/重试,同一时刻只有一张卡片一个入口。
- 实施计划与里程碑:补提交、前端 vitest 口径改为 18 例(新增 14 + 既有 4),并把 14 例覆盖到的内容逐项列出。
2026-10-05 17:54:30 +08:00
k88936 9d3018a49c 未适配提示自带入队按钮,失败卡片按变体分派三颗按钮
- 未适配提示从一句话改成一张卡片:说明和「交给 code agent 适配」那颗按钮放在一起,用户不用按照提示去别处找按钮;按钮行里就不再重复一颗,同一屏同一件事只有一个入口。
- 这条提示的判据补上 form 与 failure:hasScript 初值是 false,注册表还没读回来(或读失败)时不能替项目下「还没适配」的结论;失败卡片带着宿主的现场和同一颗按钮,两张卡一起出现就是同一件事两个入口。
- 失败变体的 action 从两向扩成三向 adapt / repair / retry:buildScriptMissing 归 adapt(首次适配该发适配指令,原来发修复指令会让 agent 去读一份还不存在的适配说明),commandFailed / artifactMissing / registryMalformed 归 repair,其余仍是 retry。
- 前端用例 12 → 14:钉住「未适配时按钮行里没有适配按钮、卡片那颗只调 adapt」「读回来之前不下结论、读失败时保留按钮行的适配入口」,并把失败卡片用例扩成适配 / 修 / 重试三种变体。
2026-10-05 17:54:08 +08:00
k88936 ac666daad8 回写本轮补的提交与前端用例数
- 实施计划补 1b7741ac6 / f8ed4e898 / 90f651ddf 三条提交,前端 vitest 口径改为 16 例(新增 12 + 既有 4)。
- 里程碑把前端 12 例覆盖的内容逐项列出,便于验收时对照。
2026-10-05 17:27:49 +08:00
k88936 90f651ddfe 刷新时先撤掉待触发的自动保存,避免旧值被写回注册表
- load() 在读盘前就把 dirty 归零:原来要等读回来的那一刻才归零,若这次读得比停止输入的 600ms 还慢,等待中的自动保存会先到点,把用户手里那份旧值写回注册表,随后刷新又用读到的内容盖掉界面,两边都不一致。
- 新增一例回归用例:第二次读(点刷新那次)故意慢 1200ms,越过自动保存的延时后断言没有发出 save_xhs_minitool_export_form,且界面回到磁盘上的值。已验证去掉修复后这例失败。
2026-10-05 17:26:46 +08:00
k88936 75ff9ca75b 实施计划写清真实进程用例失败时的两个观察点
- 说明子进程输出里的 running 1 test 是命令沙箱垫片的预期现象:垫片就是当前可执行文件,编译到测试态时参数换成 --exact ...trampoline_child_fixture,所以垫片进程是测试二进制在跑那个 fixture 用例。
- 真正失败的是沙箱里解析到的 npm(fnm 包装脚本被另一个 node 版本执行),并写明同一脚本在普通 shell 里能正常产出 zip,避免后人把它当成产品缺陷。
2026-10-05 17:22:29 +08:00
k88936 f8ed4e898f 保存对话框的默认文件名收进下载助手,复用既有取文件名工具
- xhsMinitoolDownload 自己从 relativePath 取最后一段当默认文件名(取不到才用调用方给的兜底名),参数名随之改为 fallbackFileName;/ 与 \ 两种分隔符统一交给既有的 resourceFileNameFromPath,不再在面板里写第二份取文件名实现。
- ArtifactsPane 只传兜底名,不再自己拼默认文件名,视图层也就不必跨到 features/resource-canvas 去 import。
2026-10-05 17:22:05 +08:00
k88936 1b7741ac65 适配指令补上包根在 game/ 时的产物落点
- 适配与修复指令的产物契约补一句:路径相对项目根,而 npm 包根通常是 game/ 子目录,所以落点参数要写成 ../.export/xhs-minitool.zip(相对路径按脚本的工作目录解析)。缺这句时 agent 会把 zip 写到 game/.export/ 下,宿主只能报产物缺失,白跑一轮修复。
- 两例前端用例各加一条断言钉住这个落点。
- skill 的 AGC 契约不再给出 <项目根>/.export/xhs-minitool.zip 这个只在包根等于项目根时才成立的写法,改为只声明产物位置并把相对路径的解析规则指回 `node pack.mjs --help`;manifest 同步到 2026-08-26.42。
2026-10-05 17:21:41 +08:00
k88936 5dd158ee13 补一例默认 ignore 的真实起进程用例覆盖宿主导出链路
- build.rs 新增 executes_the_project_script_and_requires_a_non_empty_artifact_each_time(#[ignore]):造一个声明 build:xhs-minitool 的 npm 包,真跑一遍 run(),覆盖「脚本产出 zip 并回带 stdout → 删掉产物再跑必须重新产出 → 脚本成功但没产出报 artifactMissing」。常规单测里没有真实进程,这条链路此前只有"脚本缺失"这一侧被覆盖。
- 用例默认不跑:它要本机 node/npm 与可用命令沙箱。本次在本机尝试被容器环境挡下——沙箱里解析到的 npm 是 fnm 包装脚本、却由另一个 node 版本执行(Cannot find module '../lib/cli.js',Node.js v26.10.0);同一脚本在普通 shell 里 npm run build:xhs-minitool 正常产出 zip,因此不是代码问题。
- 实施计划与里程碑记录该用例的一键复跑命令、观察到的环境现象,并把「真实 vite 项目首轮适配」明确为本里程碑唯一开口项。
2026-10-05 17:06:45 +08:00
k88936 b3be3ee713 修正导出里程碑证据口径并补新增用例
- 里程碑证据:Rust export:: 改为 49 例(export::draft::xhs_minitool 33 例)、export_bindings 115 例、前端 vitest 15 例,并把构建收尾判据的六条映射逐条列出(此前把「脚本非零退出/产物缺失」写成已有测试覆盖,实际只有代码分支,现补齐)。
- 实施计划:命令 DTO 口径改为 XHSMiniToolExportRunResult { outputTail } 并说明成功出口不带 exitCode 的理由;提交清单与已验证命令更新到最新;验收文案的「stderr 尾部」改为「输出尾部」(stdout 与 stderr 已合并)。
2026-10-05 17:00:55 +08:00
k88936 463341c4bd 导出成功后把打包脚本的输出尾部报给用户
- useXhsMinitoolExport 的导出成功提示改为「已重新产出 .export/xhs-minitool.zip」加宿主的构建输出尾部:打包脚本会把 zip 的条目数与体积打在那里,正是上传前要核对的数字。
- ArtifactsPane 的状态行改为保留换行,多行输出不再挤成一行。
- 新增一例前端用例:导出调用只带 projectPath,成功后 notice 同时含产物路径与脚本输出尾部。
2026-10-05 16:59:09 +08:00
k88936 5e2426c8a7 导出收尾判据抽成可测函数,成功结果去掉恒为 0 的死字段
- build.rs 把「脚本跑完之后算不算数」抽成 conclude(root, exit_code, timed_out, output):非零退出与超时收成 commandFailed(带退出码与输出尾部),退出码 0 但产物不在或为空文件收成 artifactMissing,产物在才算成功。
- 补 5 例确定性用例覆盖这条判据(非零退出、超时无退出码、产物缺失、空产物不算、成功),不再只靠"真的跑一遍 npm"才能碰到这些分支。
- XHSMiniToolExportRunResult 去掉 exit_code:能走到成功出口的退出码必然是 0,带回来只是死字段;失败侧 CommandFailed 自己带退出码。成功时改为回构建输出尾部(打包脚本会把 zip 条目数与体积打在那里)。
- 同步重生成 XHSMiniToolExportRunResult.ts。
2026-10-05 16:58:40 +08:00
k88936 faa93929b4 导出与小红书小工具里程碑文档回写实现与证据
- 里程碑:Status 改为 implemented-awaiting-runtime-acceptance,九条验收标准勾选,证据要求补已落的自动化证据(Rust export:: 18 例、bindings 117 个文件、前端 vitest 14 例、skill-pack 2026-08-26.41)并明确真实 vite 项目首轮适配是唯一未验证项。
- 实施计划:状态、前端文件落点(state/xhsMinitoolInstruction.ts 等)、pack.mjs 的 --zip-out、快照排除的两侧口径与提交清单逐项对齐实现。
- 主规范与决策记录:把「整个 .export/ 排除出快照」改为精确表述——只排除在快照同步之外,不得并进通用排除口径(那份列表同时是 Agent 的写入门禁,并进去 agc_apply_patch 就拒绝 .export/);skill 落点、prompt 归属与入队链路的文件/函数名同步为实际实现。
2026-10-05 16:40:00 +08:00
k88936 3369f76b16 导出工作目录 .export 只排除在快照同步之外
- filesystem.rs 新增 PROJECT_SNAPSHOT_SYNC_ONLY_EXCLUDED_COMPONENTS(当前只有 .export):导出注册表、打包脚本拷贝、icon 与 zip 产物都能从项目源码重跑出来,不进项目快照同步。
- 刻意不并入通用排除列表:那份列表同时是 Agent 的写入门禁(agent/direct_patch.rs 直接拿它拒绝路径,agc_apply_patch 报「不得修改受保护或排除路径」),并进去会让 code agent 写不了 .export/ 下的适配脚本。
- project_snapshot 测试补齐两侧口径:.export/* 必须被同步排除,且不得被通用口径排除。
2026-10-05 16:30:32 +08:00
k88936 95323ce542 小红书导出 skill:新增确定的 zip 落点参数并写清 AGC 接入契约
- pack.mjs 新增 --zip-out <path>:相对当前工作目录解析、父目录自动创建,供「产物必须落在项目根 .export/ 下」的调用方指定落点;原 --zip <name> 默认行为不变。
- SKILL.md 增加「被 AGC 导出面板调用时」一节:三条硬契约(脚本名 build:xhs-minitool、非空 .export/xhs-minitool.zip、--out-dir 只指向构建输出目录)与拷贝到 .export/ 后如何定位项目根。
- vite.config.xhs-minitool.mjs 的注释点明 build.outDir 与 pack 的 --out-dir 必须一致,配错会删源码。
- manifest.json 同步 sha256 与版本 2026-08-26.41(文件清单不变,仍 36 个)。
2026-10-05 16:08:53 +08:00
k88936 f8517abaaa 小红书导出面板的前端契约测试
- 新增 apps/ai-game-creator-shell/tests/xhsMinitoolExport.test.tsx:十例覆盖指令正文(三条硬契约、示例脚本落点、修复现场)、失败变体到人话与动作的映射、字段复制、icon 与 zip 的下载链路、三颗按钮的职责、冲突逐字段二选一、失败卡片下一步,以及状态 hook 的自动保存(baseHash 带回宿主)与「适配把指令当一条用户消息入队」。
2026-10-05 16:02:44 +08:00
k88936 9a8d77dd9a 小红书导出面板左半:表单、复制下载、冲突二选一与三颗显式按钮
- 新增 tabs/xiaohongshu/ArtifactsPane.tsx:替换原来的留白占位,落平台表单、交付产物与「适配 / 导出 / 刷新」三颗按钮;没有脚本时导出不可点并说明要去适配。
- 新增 FormCard.tsx:三个字段都能复制,icon 行多一颗下载;红字是宿主校验结果的投影,前端不自己判规则。
- 新增 ConflictCard.tsx:只列真的不一样的字段,逐个二选一(默认「我的」),按选择合并后带回上层,绝不静默覆盖。
- 新增 FailureCard.tsx:宿主失败的原文加现场(输出尾部等),按变体给「让 code agent 修」或「重试」。
- 新增 PaneButton.tsx 与 CopyButton.tsx:按钮语气与复制反馈各收一处。
- Page.tsx / useXiaohongshuTab.ts / usePanel.ts 接线:导出状态挂在面板根,只有真的点进过小红书 tab 才打开注册表读写(进别的目标不在用户项目里补 .export/)。
2026-10-05 16:02:18 +08:00
k88936 d694c183d9 小红书导出面板的行为层:命令入口、指令正文、失败说法与状态 hook
- 新增 state/xhsMinitoolApi.ts:三个命令的 JS 入口(命令名与 camelCase 参数名唯一收口),结构化失败装成 XhsMinitoolFailure,真 Error 原样抛出。
- 新增 state/xhsMinitoolInstruction.ts:首次适配与按失败修复两段指令正文 + 契约常量(脚本名、产物路径、注册表形状、要显式拷贝的示例脚本与落点),每条都能在 Rust 侧找到对应硬校验。
- 新增 state/xhsMinitoolFailure.ts:七个失败变体各一句人话与下一步动作,穷尽性由 expectNever 在编译期钉住。
- 新增 state/xhsMinitoolFields.ts:三个字段的标签、占位与字数上限;字段身份直接用 ts-rs 的 XHSMiniToolExportField,与表单键一一对应。
- 新增 state/xhsMinitoolDownload.ts:icon / zip 经原生保存对话框落盘,复用素材保存命令的既有门禁。
- 新增 state/useXhsMinitoolExport.ts:读现场、防抖自动保存(带 baseHash)、字段级冲突、每次重新导出,以及只有用户显式点「适配 / 让 agent 修」才入队的指令发送。
- .eslintrc.cjs 把 export/generated 加入 ignorePatterns,与其余 ts-rs 生成目录同口径,禁止 eslint --fix 二次改写。
2026-10-05 16:01:49 +08:00
k88936 3a1999e115 小红书导出命令面:读、存(带冲突)、跑脚本并确认产物
- 新增 src-tauri/src/export/draft/xhs_minitool/build.rs:以既有 command.exec 边界运行项目声明的 build:xhs-minitool(复用 run_project_verification_with_commit_at,脚本白名单、expectedCommand 反漂移、沙箱与 300 秒超时都在那里),跑完确认 .export/xhs-minitool.zip 是非空普通文件,失败输出只回尾部 4000 字符。
- 新增 commands.rs:read_xhs_minitool_export / save_xhs_minitool_export_form / run_xhs_minitool_export_build 三个 per-target 命令;hasScript 每次现算,project_path 先过 validate_project_root,不拿项目写锁、不推进 revision。
- src-tauri/src/desktop.rs 把三个命令注册进 generate_handler!。
- xhs_minitool/mod.rs 收敛为模块声明,不再对外重导出内部类型。
- 实施计划把 XHSMiniToolExportRunResult 的字段名从 stderrTail 修正为 outputTail:输出是 stdout 与 stderr 合并清洗后的尾部。
- Rust 定向测试新增脚本缺失前置失败与输出截断两例。
2026-10-05 15:41:43 +08:00
k88936 b6bef5b10b 把 export/generated 纳入 prettier 忽略,恢复 ts-rs 原始输出
- .prettierignore 增加 apps/ai-game-creator-shell/src/view/project-development/export/generated/,与其余四个 ts-rs 生成目录同口径:一律以原始输出提交,禁止 prettier 二次改写,否则生成绑定校验会误报内容变化。
- 重新生成 export/generated 下 12 份绑定,覆盖上一提交中被 prettier 改写过的内容。
2026-10-05 15:30:30 +08:00
k88936 2a70926a3e 小红书小工具的表单 DTO、typed 失败、路径常量与首错校验
- 新增 src-tauri/src/export/draft/xhs_minitool/dto.rs:XHSMiniToolExportForm / Field / State / RunResult 的线上形状;表单 deny_unknown_fields,TS 由 ts-rs 生成。
- 新增 error.rs:命令边界 typed 失败七变体(registryMalformed、formInvalid、buildScriptMissing、saveConflict、commandFailed、artifactMissing、exportUnavailable),带载荷变体持具名结构体,保证前端拿到可判别联合类型。
- 新增 layout.rs:.export/ 下 xhs-minitool.json 与 xhs-minitool.zip 的契约常量、npm 脚本名 build:xhs-minitool 与路径推导。
- 新增 validation.rs:名称与简介按 Unicode 字符数不超过 14 且非空,icon 必须是项目内普通文件、非符号链接、png/jpg/jpeg 且不超过 5 MiB,首个错误即返回。
- 改写 xhs_minitool/mod.rs 为模块声明与重导出,删除上一轮 xhx-* 草案常量与 xhx-minitool 拼写。
- 生成 src/view/project-development/export/generated/ 下 12 份 ts-rs 绑定。
- scripts/check-generated-bindings.mjs 把 export/generated 纳入 AGC 目标的覆盖目录。
2026-10-05 15:27:35 +08:00
k88936 91741f9de0 导出注册表文件级读写收口到 export 模块
- 新增 apps/ai-game-creator-shell/src-tauri/src/export/registry.rs:注册表 JSON 的自动创建、严格解析、临时文件原子替换与原始字节 SHA-256 指纹,不认任何 target。
- 改写 apps/ai-game-creator-shell/src-tauri/src/export/mod.rs:写清导出模块边界,重导出注册表原语,说明 .export 工作目录的 flat 约定与不进快照的后果。
- src-tauri/src/main.rs 注册 pub mod export;。
- 删除上一轮「共享命令目录」残留的空壳 src-tauri/src/export/command/,命令落点改为 per-target commands.rs。
- registry.rs 覆盖自动创建且重读指纹稳定、非法 JSON fail closed 不覆写、未知字段拒绝、保存返回新指纹四条单测。
2026-10-05 15:19:11 +08:00
k88936 f0ee972c9c 补充导出产物面板与小红书小工具导出的主规范、里程碑与实施计划
- 主规范在 docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md 新增「2026-10-05 导出产物面板与小红书小工具导出」一节:宿主只做读写注册表、校验表单与脚本、跑项目脚本、交付产物四件确定性的事,适配与打包归 code agent。
- 新增【里程碑】导出产物面板与小红书小工具导出-2026-10-05.md:范围、非目标、依赖与 9 条验收标准。
- 新增【实施计划】导出产物面板与小红书小工具导出-2026-10-05.md:修改边界、实现顺序、验证命令、风险与回滚点。
- docs/project-memory/shared-memory/decision-log.md 记录边界、注册表无状态字段、内容 hash 冲突模型、.export flat 工作目录、复用 command.exec 权限且不拿写锁、prompt 归前端六条决策。
- docs/README.md 的 AI 游戏创作与 Agent Runtime 区补入口。
2026-10-05 15:18:50 +08:00
k88936 bef4151b10 导出面板图标盒恒为正方形
Project CI / Backend tests (pull_request) Failing after 15s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 5m3s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 2m26s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 3m47s
Project CI / Repository checks (pull_request) Failing after 26s
Project CI / Frontend tests (pull_request) Successful in 3m17s
Project CI / AI game creator shell web tests (pull_request) Failing after 3m31s
Project CI / Native shell tests (pull_request) Successful in 8m18s
卡片图标盒改回 aspect-square、tab 图标盒改回 size-5,只用 object-contain 等比缩放。

TapTap 横向 logo 在方盒里按宽度居中留白,不再用矩形盒。
2026-10-05 13:15:20 +08:00
k88936 477e60c3f8 导出面板改用小红书与 TapTap 真实图标
新增 packages/shared/src/icons/rednote.png 与 taptap.png 两个真实图标。

TargetIcon 按 Target 一处收口图源:陶泥儿用 IP 图,小红书用 RedNote,TapTap 用 TapTap logo。

TapTap 是横向 logo,卡片与 tab 的图标盒改为矩形配 object-contain,宽图按宽度贴满、方图按高度贴满。
2026-10-05 13:12:09 +08:00
k88936 df4ef37a1c 新增「导出到」全屏面板并复用 DirectProject 对话盒
新增 project-development/export 全屏导出面板:目标大卡、等宽下划线 tab、小红书工作台分栏与第二 subscriber 会话。

面板状态提升到 usePanel 根,tab 页可卸载;输入草稿提升到面板层,切 tab 不丢字。

抽出 DirectProjectChatBox,主聊天与导出会话复用同一套对话盒,不再另写版式。

DirectProjectChatHeader 增加「导出」入口,App.tsx 条件挂载全屏面板。

DirectProjectComposer 增加 referencesEnabled 与 draft/onDraftChange,导出输入区关闭素材引用。

新增 tests/artifactsPanel.test.tsx 覆盖卡片、tab、关闭与对话盒复用。
2026-10-05 11:49:32 +08:00
k88936 37cb9fb386 审核 Skill 目录加入 eslint 忽略,避免 --fix 改写指纹源
- .eslintrc.cjs 的 ignorePatterns 增加 apps/ai-game-creator-shell/src-tauri/resources/agc-skills/**
- 审核 Skill 脚本按 SHA-256 定址并用 include_bytes! 编进客户端,eslint --fix 改写会导致 manifest 指纹漂移
- .prettierignore 本已排除该目录,eslint 补齐同一口径
- 更新决策记录
2026-10-04 19:32:33 +08:00
k88936 e3966bac72 注册平台抽象与小红书小工具两项 AGC 审核 Skill,并让隐藏文件永不进包
- 新增 platform-abstract 与 vite-export-xhs-minitool 两项审核 Skill
- agc-skill-pack.v1 清单版本升至 2026-08-26.40,两个新条目 sha256 现场重算
- skill-pack 工具新增隐藏文件规则:. 前缀文件/目录不写清单、不参与指纹、不安装、不可读取
- JS 与 Rust 白名单同步扩到 10 项,AGC_SKILL_PACK_FILES 增加 13 条 include_bytes!
- codex_app_server 三条 skills/list 测试夹具补齐两个新 Skill 名
- 补充隐藏路径拒绝与收集器忽略隐藏文件的 JS/Rust 测试
- 修掉 pack.mjs / validate.mjs 的 eslint 问题与三处空白,使其通过 pre-commit 与 git diff --check
- 同步更新技术方案与决策记录
2026-10-04 19:23:12 +08:00