Commit Graph

5773 Commits

Author SHA1 Message Date
k88936 07cc0aa5fd 导出注册表临时文件改用 create_new 打开
- registry.rs 的 write_atomically 不再用会跟随符号链接的 File::create,改用 O_EXCL 打开临时文件,已存在的链接/残留文件直接失败
2026-10-06 18:49:56 +08:00
k88936 9c48db76b2 导出注册表在 rename 后 fsync 父目录
- registry.rs 的 write_atomically 在原子替换后同步父目录,崩溃时目录条目不再可能回退到旧文件
2026-10-06 18:49:45 +08:00
k88936 c9d2ed041b 导出注册表把非 UTF-8 内容归入 malformed
- registry.rs 的 load_or_create 单独处理 ErrorKind::InvalidData,返回 RegistryError::Malformed,不再落进通用 Io 被报成路径/权限故障

- 新增 rejects_non_utf8_content_as_malformed 用例
2026-10-06 18:49:28 +08:00
k88936 32d77a0ccd 导出注册表临时文件名按写入序号唯一化
- registry.rs 的 temp_path 在 pid 之外加入进程内原子自增序号,同一注册表路径的并发写不再共用同一个 .tmp 文件
2026-10-06 18:49:00 +08:00
k88936 411771af2f 导出入口与面板统一改用裁剪后的项目路径
- App.tsx 新增 exportProjectPath,对 localProject/projectPath 做一次 trim,空白即视作无项目

- onRequestExport 开关与 ArtifactsPanel 的 projectPath 都改用该值,避免纯空白路径照开门
2026-10-06 18:48:36 +08:00
k88936 677c477f36 修正生成绑定校验脚本头部过期的目录清单
- check-generated-bindings.mjs 文件头从「两套 crate、四个目录」更新为「五个目录」,补上 AGC export/generated
2026-10-06 18:48:24 +08:00
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 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