Commit Graph

3161 Commits

Author SHA1 Message Date
k88936 122f8a2c19 小红书导出技能:更新 manifest 指纹 (version=2026-08-26.65),修正文档格式错误 2026-10-06 18:42:24 +08:00
k88936 c66d1586f4 AGC 退役发布表单弹窗外壳,错误统一走发布提示弹窗
- 删除已无现役调用方的 GameDistributionPublishPanel,发布资料表单只保留内联形态

- useGameDistributionPublishForm 去掉 inline 开关与 handleSubmit,onError 改为必填

- GameDistributionPublishFormView 去掉弹窗分支与 open / onClose 入参,只渲染内联布局

- 原专属测试迁移到内联表单并改名为 gameDistributionPublishForm.test.tsx
2026-10-06 18:15:35 +08:00
k88936 8a2c09f24a AGC 打包并发布校验前置到点击时并改用发布提示弹窗
- 表单必填项(名称 / 简介 / 封面 / 在途上传)在点击「打包并发布」时先于构建校验,不通过直接弹「发布提示」,不再先弹一次打包进度

- 表单错误统一经 onError 交给面板根已有的 GamePublishBlockedDialog,左栏不再铺内联红字

- 简介兜底改用默认文案,项目 goal 为空不再把入口卡死

- 补齐封面后打包的回归用例,新增「未选封面不打包、不出进度弹窗」用例
2026-10-06 18:10:02 +08:00
k88936 a01891bdf0 小红书导出技能:index.html 确定性约束只留在 validate
- zip-artifact-spec.md §5 删 viewport / <base> / CSP meta 三行(validate 已判 ERROR)
- SKILL.md 去掉对应的枚举,只保留「何时读命中时必须读」措辞
- .selective_rule.txt 记录删除项与对应的 validate 检查码
- 同步 manifest 指纹(version=2026-08-26.64)
2026-10-06 18:08:32 +08:00
k88936 b0bde75fcb 小红书导出技能:参考文档不再标注「非必要不读」
- SKILL.md 改为「何时读命中时必须读」
- zip-artifact-spec 行点名改源码硬约束:viewport-fit=cover、不用 base、不自建 CSP meta
- 流程里加一条:写/改 index.html 前先读 zip-artifact-spec §3/§5
- 同步 manifest 指纹(version=2026-08-26.63)
2026-10-06 18:04:19 +08:00
k88936 f3f52dc5e0 小红书导出技能:Chrome 61 能力改为硬性 ERROR,pack 自带白名单
- validate.mjs 恢复 CSS_UNSUPPORTED_PATTERNS / MODERN_RUNTIME_API,命中判 ERROR
- 删除「基线层 + 增强层」写法,references 明确 Chrome 61 为硬基线
- pack.mjs 复制白名单与遍历实现,不再 import validate.mjs
- SKILL.md 参数表补 validate / pack / vite.config 的默认值
- 修正 decision-log 中与本次相反的旧结论
2026-10-06 18:03:00 +08:00
k88936 163564a811 AGC 打包并发布不再按必填项变灰,改为前端校验给可读错误
- 「打包并发布」只在打包 / 上传进行中禁用,不再因为名称或简介为空而变灰

- 文案必填项在打包前就地校验,封面与在途上传在打包成功后校验,错误都留在表单里

- 简介兜底改用 ||,项目 goal 为空时不再留下空简介把唯一入口卡死

- 用户一改名称 / 简介即清除上一次的校验错误

- 补「项目还没起名时按钮仍可点并给出必填提示」的回归用例
2026-10-06 18:02:08 +08:00
k88936 779857342e 精简 XHS_MINITOOL_REGISTRY_SHAPE_HINT 内文档描述 2026-10-06 17:52:23 +08:00
k88936 727aae5844 AGC 陶泥儿发布表单内联进左栏并把状态提升到面板根
- 陶泥儿 tab 改为左右两栏:左半内联发布资料表单,右半第二个会话 chatbox

- 去掉「发布到游戏广场」二次跳转与弹窗表单,主行动改为内容末尾的橙色「打包并发布」

- 打包并发布一次点击先按需构建打包(沿用进度 / 阻断弹窗),成功后直接提交发布

- 抽出 useGameDistributionPublishForm 与 GameDistributionPublishFormView,弹窗与内联共用同一份表单

- 发布表单状态提升到面板根 useTaonierTab,切 tab 不丢已填资料;只在首次进入陶泥儿 tab 时初始化

- 同步更新发布反馈用例与玩法链路文档
2026-10-06 17:48:58 +08:00
k88936 d4797abb85 AGC 导出面板抽出 common 面板组件并让小红书复用
- 把 PaneButton 从 tabs/xiaohongshu 移到 tabs/common,供小红书与陶泥儿共用

- 新增 common/ChatPane,统一第二个会话 chatbox 的挂载与状态投影

- 小红书 chat Pane 改为委托 common/ChatPane,五个卡片组件导入路径同步更新
2026-10-06 17:48:35 +08:00
k88936 b0c16d985d AGC 小红书导出 pack:--zip-out 默认 ../.export/xhs-minitool.zip
- pack.mjs:--zip-out 默认 ../.export/xhs-minitool.zip(假设 cwd 是 game/ 子工程,落到项目根 .export/),仍可显式覆盖;USAGE 同步
- SKILL.md:步骤 3 写明默认落点与 game/ 假设
- .pack.test.mjs:补默认落点用例(cwd=game/ 时 zip 落在项目根 .export/)
- manifest:vite-export-xhs-minitool 指纹与 version 同步到 2026-08-26.61
2026-10-06 17:44:59 +08:00
k88936 c7076af548 同步 manifest 版本与指纹至 2026-08-26.60,优化 SKILL.md 参数表排版 2026-10-06 17:30:12 +08:00
k88936 30a0f05c11 AGC 小红书导出 SKILL:参数表去掉 defineMinitoolConfig 说明
Project CI / Backend tests (pull_request) Failing after 25s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 2m42s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 5m21s
Project CI / Repository checks (pull_request) Failing after 23s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 4m48s
Project CI / Frontend tests (pull_request) Successful in 3m8s
Project CI / AI game creator shell web tests (pull_request) Failing after 3m17s
Project CI / Native shell tests (pull_request) Successful in 7m52s
- SKILL.md:vite 配置行只保留 build.outDir,删除「项目已有 vite.config 时用它合并」的误导说明(helper 仍留在配置代码里作为默认导出构造器)
- SKILL.md:同步当前排版(步骤 3 换行、pack 行说明收进步骤 3)
- manifest:vite-export-xhs-minitool 指纹与 version 同步到 2026-08-26.59
2026-10-06 17:20:52 +08:00
k88936 a96c0e6209 AGC 小红书导出:validate 去 strict 与增强层告警,pack 加落点预警
- validate.mjs:scanJsSyntax 先 stripJsNoise 剥注释与字符串,`"#e8f4ff"` / `'#hit'` 不再误判为 ES2018
- validate.mjs:删除 MODERN_RUNTIME_API、CSS_MODERN_PATTERNS / CSS_MODERN_FEATURE 与 --strict,退出码只由 ERROR 决定
- pack.mjs:--zip-out 相对 cwd 且落在 <cwd>/.export/ 时打 workdir 警告,打印 cwd 与绝对落点
- SKILL.md:产物为项目根 .export/xhs-minitool.zip,game/ 子工程写 ../.export/...;参数表去掉 --strict
- 测试:增强层放行、JS 噪音不误报、真私有字段仍报、warning 也退出 0、workdir 预警
- manifest:vite-export-xhs-minitool 指纹与 version 同步到 2026-08-26.56
- decision-log.md:记录本次 validate/pack 收敛
2026-10-06 17:09:49 +08:00
k88936 df744ae155 新增 agc_install_skill_resource:宿主直落 Skill 附件,复用写入合同门
- 新增内置 MCP 工具 agc_install_skill_resource(skillName/relativePath/destinationPath),宿主直接读 AGC_SKILL_PACK_FILES 已审核字节
- 组装成 agc_write_file 的 {path,content} 转发客户端工具桥,复用同一份合同、lease、项目写锁与保护面校验
- read/install 共用 skill_resource_relative_path_is_unsafe;模型自带正文无旁路,正文不过模型上下文,不依赖原生 cp 审批
- direct-tools.json 增补工具描述与 destinationPath,direct.json engineering 指引改用本工具复制 Skill 文件
- 新增两条 install_skill_resource 测试并登记工具目录;同步技术方案与 decision-log
2026-10-06 16:47:32 +08:00
k88936 aafcd593e3 AGC 小红书导出 skill:同步 manifest 指纹与 SKILL.md 文档更新
- manifest 指纹同步(2026-08-26.54 → 2026-08-26.55);
- SKILL.md 追加脚本配置复制说明,明确引入 `agc_install_skill_resource` 的操作指引。
2026-10-06 16:42:43 +08:00
k88936 09825b13d1 AGC 小红书导出 skill:SKILL.md 去掉插件说明,收尾插件强制追加
- SKILL.md 回到精简版:删掉「构建分两段 / pack 只读 / 手动加 xhsMinitoolArtifactPlugin」这些正文说明,插件行为只写在 vite.config.xhs-minitool.mjs 注释里;
- defineMinitoolConfig 在 mergeConfig 之后按插件名去重再追加 xhsMinitoolArtifactPlugin:展开 minitoolBaseConfig 再覆盖 plugins 也挤不掉它,收尾插件固定排最后且只跑一次;
- 隐藏测试补一条:overrides 的插件与内置插件共存、不重复、收尾插件在最后;
- manifest 指纹同步(2026-08-26.53 → 2026-08-26.54)。
2026-10-06 16:40:52 +08:00
k88936 58f8c2065f AGC 小红书导出 skill:测试按模块命名,取舍记录改回清单
- 隐藏测试 .vite-config.test.mjs 重命名为 .vite.config.xhs-minitool.test.mjs,与 pack.mjs → .pack.test.mjs、validate.mjs → .validate.test.mjs 的命名口径一致;
- .selective_rule.txt 去掉日期段落,把「二次清理」的条目并进 SKILL.md / zip-artifact-spec.md 对应条目,恢复为逐文件「删除与去处」清单;
- decision-log 补记 dist 收尾归 Vite 插件、pack 只读打 zip 的决策、失败语义与验证口径;
- skill-pack 指纹无需重算:本次改动均为隐藏文件与文档,manifest 仍为 2026-08-26.51。
2026-10-06 16:21:19 +08:00
k88936 21a2856661 AGC 小红书导出 skill:dist 收尾移进 vite 插件,pack 只读不写
- 新增 `xhsMinitoolArtifactPlugin`(`apply: 'build'` + `enforce: 'post'` 的 `closeBundle`):相对路径改写、去 `type="module"` / `crossorigin`、脚本移到 body 末尾、清空空目录、`copyPublicDir: false` 时的 icon 兜底都在构建收尾做完,dist 出来即合规;
- `pack.mjs` 只做白名单预检与打 zip,不再改写 dist:validate 看到的不再是「只有跑过 pack 才合规」的中间态;
- 新增 `.vite-config.test.mjs`:真跑一遍 `vite build` 断言上述收尾,并覆盖 icon 兜底、构建失败不留半成品 dist、`pruneEmptyDirs` 只删空目录;`.pack.test.mjs` 补断言 pack 不改写 index.html;
- SKILL.md 写清两段构建、以及「项目已有 vite.config 时要单独把插件加进 plugins」;`.selective_rule.txt` 记下这次职责归位的原因与验证口径;
- manifest 指纹同步(version=2026-08-26.51)。
2026-10-06 16:10:16 +08:00
k88936 7614f741e1 导出面板:失败一律走阻断弹窗,去掉「已保存到 …」与整条通知行
- 失败现场从就地卡片改成阻断弹窗(`FailureDialog` 取代 `FailureCard`):左半本来就矮,卡片会被滚出视野,而失败是用户必须看见的东西;
- 弹窗按「谁有能力修」给按钮:项目还没适配给「让陶泥儿帮我调通」,适配过但这次没跑通给「让陶泥儿来修」,改不动的(权限策略拉黑 `command.exec`、宿主没跑起来)不给陶泥儿入口;每条都带「关闭」,关掉的现场记进 `dismissedFailure`,同一个现场不会因为下一次重读又跳回来——没有「重试」,关掉回面板点「打包」是同一件事;
- 一键适配也清掉失败现场:从「还没配置好导出」那条弹窗进来的就是同一个 `buildScriptMissing`,不清它弹窗关不上;
- 删掉通知行(那段 `role="status"`)与整个 `notice` 状态:保存产物、打包结果、入队结果都不再在导出面板里回执;读不到内容仍由那段占位文案交代,真故障仍走错误池;
- 保存产物不再返回「已保存到 …」:落点与结果都是用户在原生对话框里亲手给的,失败只留一条控制台痕迹;
- 输出尾部的拼句模块 `xhsMinitoolOutputTail.ts` 随之删除(唯一调用方就是那条通知);
- 用例跟着改:删掉截断拼句那条,失败相关改称弹窗并断言 `role="dialog"`,补一条「关掉同一个现场不再弹」。
2026-10-06 16:10:04 +08:00
k88936 66ff1d20aa 导出面板:去掉「已让陶泥儿…」这类复述,状态行只说事实
- 一键适配、帮我填不再铺一句「已让陶泥儿帮你调通导出 / 来填这三项」:这两个动作就是用户刚点的那颗按钮,右侧会话就摆在旁边,复述只是噪音;
- 打包现算发现没有脚本时,只把适配弹窗重新武装起来,状态行不再重复「项目还没配置好导出…」;
- 失败修复的回执只留出错原因,去掉「已让陶泥儿来修。」这句叙述(失败卡片收掉后,原因仍是唯一说明「刚才为什么开这一轮」的地方);
- `notice` 的语义写进注释:读不到内容、打包结果、指令没发出去、失败修复的原因;用户刚点的动作不回执;
- 用例跟着改:没脚本时 `notice` 为空。
2026-10-06 15:51:24 +08:00
k88936 eccaa5f79c 回退 sandbox 启动失败诊断日志,恢复 application.log 默认脱敏
- 回退 6311bb583:移除 sandbox 启动失败时采集子进程 stdout/stderr 的宿主日志及保留绝对路径的变体;
- application.log 恢复对所有行统一脱敏绝对路径的既有行为;
- 真实 npm 启动故障改从宿主 Node 环境修复,不改日志代码。
2026-10-06 15:41:58 +08:00
k88936 6311bb5837 为 sandbox 启动失败补保留源路径的宿主诊断日志
- `command.exec` 在 sandbox-ready 失败时先取走子进程 stdout/stderr,再终止受控进程组,避免 `Child` 回收时丢掉 bwrap/trampoline 的真实报错;
- 采集结果在有界时间(2s)和字节(8 KiB/流)内读空;新增 `sanitize_diagnostic_message_preserving_paths`、`append_application_log_line_preserving_paths` 与 `app_log_with_paths!`,只做凭据脱敏、保留绝对路径(bwrap `Can't find source path` 的路径就是唯一证据),写入宿主 `application.log`;
- 默认 `sanitize_diagnostic_message` 仍整行脱敏绝对路径,新增项按 `target_os = "linux"` 门控;诊断只进宿主诊断包,不进入模型可见错误、command log、receipt 或 Agent DB;
- 新增 `sandbox_launch_diagnostics_keep_source_paths_and_redact_secrets`,覆盖源路径保留、凭据脱敏与空白流不产出行;
- `pitfalls.md` 记录 sandbox 启动失败丢弃子进程 stderr 的排障经验。
2026-10-06 15:30:36 +08:00
k88936 2cfc0d5bb4 xhs-minitool skill:SKILL.md 的假设与参数表收敛,同步指纹
- 「假设和默认项」合并成一条:各工具(含示例 vite 配置)的默认参数都按「cwd 就是 vite 项目根」给,非标准目录结构用显式参数适应;
- 「脚本参数」表去掉多余的引导句、对齐列宽,三个脚本的参数不变;
- 同步 manifest 指纹(version=2026-08-26.50)。
2026-10-06 15:28:42 +08:00
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 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 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 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 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 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 90f651ddfe 刷新时先撤掉待触发的自动保存,避免旧值被写回注册表
- load() 在读盘前就把 dirty 归零:原来要等读回来的那一刻才归零,若这次读得比停止输入的 600ms 还慢,等待中的自动保存会先到点,把用户手里那份旧值写回注册表,随后刷新又用读到的内容盖掉界面,两边都不一致。
- 新增一例回归用例:第二次读(点刷新那次)故意慢 1200ms,越过自动保存的延时后断言没有发出 save_xhs_minitool_export_form,且界面回到磁盘上的值。已验证去掉修复后这例失败。
2026-10-05 17:26:46 +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 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