回写自动重读与命令切分的口径
- 主规范:四条命令与内容/指纹的切分理由、自动重读的两条采纳规则(hasScript 随时采纳、表单只在用户没在编辑时采纳)、指纹不进对外状态、验收项补「自动重读不覆盖未保存输入」。 - 实施计划与里程碑:命令清单改 4 条、面板改两颗按钮、运行时验收去掉「点刷新」一步、前端 vitest 口径 19 例(新增 15 + 既有 4),并说明刷新撤掉待保存输入那条行为已被取代。
This commit is contained in:
@@ -10,9 +10,9 @@
|
||||
|
||||
- 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 { outputTail }`(构建输出尾部,stdout 与 stderr 已合并;成功出口的退出码必然是 0,因此不带 `exitCode`,失败侧由 `CommandFailed.exitCode` 承担)。失败走 typed error `XHSMiniToolExportError`(ts-rs 导出);不新增 `GAME_CREATION_APP_COMMANDS` 条目,复用 `command.exec` 的 `enforce_project_permission_policy`。
|
||||
- Rust 命令(4 个,全部 per-target):`read_xhs_minitool_export` → `XHSMiniToolExportState { form, hasScript }`(内容,自动刷新反复调);`read_xhs_minitool_export_hash` → 注册表指纹字符串(写回时的 `baseHash`,只在内容被采纳时取一次);`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/view/project-development/export/tabs/xiaohongshu/ArtifactsPane.tsx`(表单 + 产物 + 冲突/失败卡片,只有「适配 / 导出」两颗显式按钮)、新增 `state/useXhsMinitoolExport.ts`(状态、防抖自动保存、按固定间隔自动重读内容;指纹只在 hook 内部的写回基线里,不进对外状态)、新增 `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/`,首次适配无法落地)。
|
||||
- skill:`resources/agc-skills/vite-export-xhs-minitool/scripts/pack.mjs`(新增 `--zip-out <path>`,相对 cwd 解析、父目录自动创建;原 `--zip <name>` 行为不变)、`scripts/vite.config.xhs-minitool.mjs` 注释点明 `outDir` 与 `--out-dir` 必须一致、`SKILL.md` 补「被 AGC 导出面板调用时」三条硬契约;同步 `manifest.json` 指纹与 `skill_pack.rs` 的 `include_bytes!` 内容(文件数不变,仍 36 条)。
|
||||
- 文档:主规范一节、本里程碑与实施计划、`docs/README.md` 入口、`docs/project-memory/shared-memory/decision-log.md` 一条。
|
||||
@@ -36,7 +36,7 @@
|
||||
- `npm run ai-game-creator-shell:typecheck`
|
||||
- `npm run agc:skill-pack:sync` → `npm run agc:skill-pack:check`
|
||||
- `npm run check:doc-index`、`npm run check:encoding`、`git diff --check`
|
||||
- 真实运行时:打开一个 vite 项目 → 点一键适配 → agent 跑通 → 点刷新 → 点导出 → 确认 `.export/xhs-minitool.zip` 可下载、内容可交给平台;再次导出确认零 agent 调用;手改坏注册表、删掉脚本各验证一次 rich error 文案。
|
||||
- 真实运行时:打开一个 vite 项目 → 点一键适配 → agent 跑通后不用点刷新(2 秒内导出按钮自己亮起来)→ 点导出 → 确认 `.export/xhs-minitool.zip` 可下载、内容可交给平台;再次导出确认零 agent 调用;手改坏注册表、删掉脚本各验证一次 rich error 文案。
|
||||
|
||||
## 风险与回滚点
|
||||
|
||||
@@ -55,10 +55,11 @@
|
||||
- `d694c183d` 前端行为层(命令入口、指令正文、失败说法、字段元数据、下载、状态 hook);`9a8d77dd9` 面板左半(表单 / 冲突 / 失败卡片与三颗按钮);`f8517abaa` 前端契约测试(10 例)。
|
||||
- `95323ce54` skill 的 `--zip-out` 与 AGC 接入契约(manifest `2026-08-26.41`);`3369f76b1` `.export` 快照同步排除;`faa93929b` 文档回写。
|
||||
- `5e2426c8a` 导出收尾判据抽成 `conclude(...)` 并补 5 例确定性用例(非零退出 / 超时 / 产物缺失 / 空产物 / 成功),同时去掉 `XHSMiniToolExportRunResult.exitCode` 这个恒为 0 的死字段;`463341c4b` 导出成功后把脚本输出尾部报给用户;`b3be3ee71` 证据口径修正;`5dd158ee1` 补默认 ignore 的真实起进程用例。
|
||||
- `1b7741ac6` 适配与修复指令补上「包根在 game/ 时落点写成 `../.export/xhs-minitool.zip`」,skill 契约同步(manifest `2026-08-26.42`);`f8ed4e898` 保存对话框的默认文件名收进下载助手并复用既有取文件名工具;`90f651ddf` 刷新时先撤掉待触发的自动保存(附回归用例)。
|
||||
- `1b7741ac6` 适配与修复指令补上「包根在 game/ 时落点写成 `../.export/xhs-minitool.zip`」,skill 契约同步(manifest `2026-08-26.42`);`f8ed4e898` 保存对话框的默认文件名收进下载助手并复用既有取文件名工具;`90f651ddf` 刷新时先撤掉待触发的自动保存(附回归用例;该行为已被下面的自动刷新取代——轮询不再撤掉待保存的输入,因为「磁盘为准」的刷新动作没有了)。
|
||||
- `ac666daad` 之后:未适配提示改成带入队按钮的卡片、失败卡片按变体分派适配/修/重试、提示只在注册表读回来之后出现(同一时刻只有一张卡片、一个入口)。
|
||||
- `9d3018a49` / `6dd0dc00c` 之后:去掉刷新按钮,改成按固定间隔自动重读内容;内容与注册表指纹拆成两条命令(自动刷新拿不到写回基线);同步细节(指纹、保存中、待保存)退出前端对外状态与界面。
|
||||
|
||||
已验证:Rust `export::` 49 例(`export::draft::xhs_minitool` 33 例)、`export_bindings` 115 例、`project_snapshot` 22 例、`check:generated-bindings`(117 个文件)、前端 vitest 18 例(新增 14 + 既有 4)、`ai-game-creator-shell:typecheck`、`agc:skill-pack:check`、`check:doc-index`、`check:encoding`、`git diff --check`。
|
||||
已验证:Rust `export::` 49 例(`export::draft::xhs_minitool` 33 例)、`export_bindings` 115 例、`project_snapshot` 22 例、`check:generated-bindings`(117 个文件)、前端 vitest 19 例(新增 15 + 既有 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/` 换机后重新适配的体感。宿主侧这一段已尽力自动化:`build.rs` 的 `executes_the_project_script_and_requires_a_non_empty_artifact_each_time`(`#[ignore]`)会真起进程执行项目脚本,覆盖「第一次产出 → 删掉产物再跑一次重新产出 → 脚本成功但没产出报 artifactMissing」。本机尝试运行被容器环境挡下,读日志时注意两点、别误判成 bug:
|
||||
- 子进程输出里的 `running 1 test` 是**预期现象**:命令沙箱的垫片就是当前可执行文件本身(`desktop.rs` 按 `--command-sandbox-trampoline` 分流),编译到测试态时 `sandbox_trampoline_arguments()` 会改成 `--exact ...trampoline_child_fixture --ignored`,所以垫片进程是测试二进制在跑那一个 fixture 用例。
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
|
||||
- Rust 新增 `export` 模块与小红书专属命令:注册表自动创建与严格解析、表单校验、脚本存在判定、运行 `build:xhs-minitool`、返回产物路径与失败输出。
|
||||
- 注册表 `.export/xhs-minitool.json`(首次自动创建且字段全空)与 flat 工作目录 `.export/`;共享 icon 放 `.export/` 根,多目标可指同一文件。
|
||||
- 前端导出面板小红书 tab:表单展示/编辑/复制、icon 与 zip 下载、显式「适配 / 导出 / 刷新」按钮、冲突时逐字段二选一。
|
||||
- 前端导出面板小红书 tab:表单展示/编辑/复制、icon 与 zip 下载、显式「适配 / 导出」两颗按钮(内容与脚本判据自动重读,没有刷新按钮)、冲突时逐字段二选一。
|
||||
- 前端组装首次适配指令,经会话写权限门入队到项目主 Direct 会话。
|
||||
- `vite-export-xhs-minitool` skill 的脚本与示例配置按 `.export/` 布局适配(`pack.mjs` 新增 `--zip-out <path>` 指定确定落点、vite config 示例注释点明 `outDir` 与 `--out-dir` 必须一致)。
|
||||
- 主规范一节、本里程碑、实施计划与决策记录同步。
|
||||
@@ -43,7 +43,7 @@
|
||||
- [x] 表单字段可复制;icon 与 zip 经原生保存对话框落盘;复制与下载不触发任何 agent 调用。
|
||||
- [x] agent 改过注册表后,用户保存旧值触发字段级冲突面板,可逐字段选「我的 / 文件里的」,纯格式化改动静默吸收,任何情况下不静默覆盖用户输入。
|
||||
- [x] 一键适配只入队一条指令且必须过会话写权限门;被拒时不落消息、不改注册表。
|
||||
- [x] 全链路不自动跑构建、不自动刷新;`.export/` 不进发布包、不进快照。
|
||||
- [x] 全链路不自动跑构建、不自动叫 agent(内容与脚本判据按固定间隔自动重读);`.export/` 不进发布包、不进快照。
|
||||
- [x] ts-rs 绑定生成到前端目录且 `npm run check:generated-bindings` 通过。
|
||||
|
||||
## 证据要求
|
||||
@@ -51,8 +51,8 @@
|
||||
- 自动化(已落):
|
||||
- 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`(14 例)与既有 `tests/artifactsPanel.test.tsx`(4 例)通过;`npm run ai-game-creator-shell:typecheck` 通过。其中 14 例覆盖:指令正文三条硬契约与 game/ 落点、失败现场拼装、失败变体人话映射与三向 action 分派(适配 / 修 / 重试)、未适配卡片自带入队按钮且按钮行不重复、注册表读回来之前不下「还没适配」结论、表单复制、icon 与 zip 下载、冲突逐字段二选一、自动保存的 `baseHash` 回传、刷新不把待保存旧值写回、导出把脚本输出尾部报给用户、以及「只有适配/修复才叫 agent」。
|
||||
- 前端 `npx vitest run tests/xhsMinitoolExport.test.tsx`(15 例)与既有 `tests/artifactsPanel.test.tsx`(4 例)通过;`npm run ai-game-creator-shell:typecheck` 通过。其中 15 例覆盖:指令正文三条硬契约与 game/ 落点、失败现场拼装、失败变体人话映射与三向 action 分派(适配 / 修 / 重试)、未适配卡片自带入队按钮且按钮行不重复、注册表读回来之前不下「还没适配」结论、表单复制、icon 与 zip 下载、冲突逐字段二选一、自动保存带回读到的 `baseHash`、自动重读只更新脚本判据而不动用户未保存的表单、agent 事后改注册表/加脚本不用点刷新就能带回来、导出把脚本输出尾部报给用户、以及「只有适配/修复才叫 agent」。
|
||||
- `.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 条)。
|
||||
- `npm run agc:skill-pack:sync` → `agc:skill-pack:check` 通过(`manifest.json` 版本 `2026-08-26.42`,文件数不变,仍 36 条)。
|
||||
- 运行时(**未验证**,本里程碑唯一开口项):在真实 vite 项目上由 agent 完成首轮适配、产出可人工上传的 zip、二次导出零 agent 调用;`.export/` 换机后需重新适配的体感也需一并确认。宿主侧这一段已有默认 `#[ignore]` 的真起进程用例(`executes_the_project_script_and_requires_a_non_empty_artifact_each_time`:第一次产出 → 删掉产物重跑必须重新产出 → 脚本成功但没产出报 artifactMissing),一键复跑命令见实施计划;本次尝试被容器环境的 npm/沙箱解析挡下,不是代码问题。
|
||||
- 边界(已覆盖):注册表损坏、脚本缺失、脚本非零退出、产物缺失、icon 越界与符号链接、目录遍历拒绝。
|
||||
|
||||
@@ -8,12 +8,13 @@
|
||||
- 表单:`name`、`introduction` 各 ≤14 个 Unicode 字符且非空;`iconPath` 必须存在、是项目内普通文件、不是符号链接、扩展名 ∈ {png, jpg, jpeg}、≤5 MiB。上限来自小红书平台上传表单,宿主**硬校验**(不是提示);不支持的格式先直接拒绝,格式转换工具是后续事项(代码处留 TODO)。表单不是构建输入——zip 规范里没有任何 app 元数据;它的唯一用途是让用户复制粘贴到平台上传页。
|
||||
- 注册表:首次打开该目标时由宿主自动创建,**所有字段为空字符串**。注册表不存 status、不存「是否已适配」、不存经验文本;agent 的经验写在它自己拷进项目的脚本注释里。「有没有脚本」永远现场从 npm 包的 `package.json` scripts 读取(`hasScript`),不落盘。
|
||||
- 构建契约:项目 npm 包里存在脚本 `build:xhs-minitool`(冒号形式是既有 `command.exec` 白名单 `build:*` 的要求),由宿主负责运行;跑完必须存在 `.export/xhs-minitool.zip`。脚本内部怎么 `vite build`、怎么调 `pack.mjs`、用什么中间目录由 agent 决定并写进脚本;**每次导出都重新构建 zip**,不做「产物已存在」的短路。
|
||||
- 首次适配:用户点显式按钮 → 前端组装适配指令(正文在 `view/project-development/export/state/xhsMinitoolInstruction.ts`,纯函数 + 契约常量)→ 经 `useDirectProjectChatController` 的 `chat.submit` 入队(该链路自带会话写权限门与 clientTurnId),进的就是同一个项目主 Direct 会话,不另开「直接调 agent」的旁路。不自动跑构建、不自动刷新;agent 回合结束后由用户点「刷新」重读状态、点「导出」由宿主跑脚本。没有构建脚本时,「还没适配」的结论只由注册表读回来之后下(`hasScript` 初值是 `false`,读取中不下结论),提示卡片自带那颗入队按钮,按钮行里就不再重复一颗;失败卡片按变体的 `action` 分派三颗按钮——`adapt` 发首次适配指令(还没适配,修复指令会引用一份还不存在的适配说明)、`repair` 发同一份契约加宿主失败现场、`retry` 只重试,同一时刻只有一张卡片、一个入口。
|
||||
- 冲突:注册表可被 agent(改文件)与用户(面板编辑)两方写入。宿主读注册表时返回 `contentHash`,保存时带 `baseHash`;宿主重读比对,hash 不同再逐字段 diff,只要有字段真的不同就判冲突,**绝不覆盖**,返回两侧值让前端逐字段选择;纯格式化改动静默吸收。注册表内不存 revision / updatedAt 之类 token。
|
||||
- 首次适配:用户点显式按钮 → 前端组装适配指令(正文在 `view/project-development/export/state/xhsMinitoolInstruction.ts`,纯函数 + 契约常量)→ 经 `useDirectProjectChatController` 的 `chat.submit` 入队(该链路自带会话写权限门与 clientTurnId),进的就是同一个项目主 Direct 会话,不另开「直接调 agent」的旁路。不自动跑构建、不自动叫 agent;内容与脚本判据按固定间隔(2 秒,窗口在后台时跳过)自动重读,所以没有刷新按钮——agent 回合结束后用户只需要点「导出」。重读时两条事实分开处理:`hasScript` 是宿主的现算事实,任何时刻都采纳;表单是用户的编辑对象,只有用户手上没有未保存输入(也不在冲突里)时才覆盖,否则只更新 `hasScript`,绝不覆盖正在打的字。没有构建脚本时,「还没适配」的结论只由注册表读回来之后下(`hasScript` 初值是 `false`,读取中不下结论),提示卡片自带那颗入队按钮,按钮行里就不再重复一颗;失败卡片按变体的 `action` 分派三颗按钮——`adapt` 发首次适配指令(还没适配,修复指令会引用一份还不存在的适配说明)、`repair` 发同一份契约加宿主失败现场、`retry` 只重试,同一时刻只有一张卡片、一个入口。
|
||||
- 命令切分:`read_xhs_minitool_export` 只返回**内容**(`form` + `hasScript`),自动刷新反复调的就是这一条;**注册表指纹**(写回时的 `baseHash`)由 `read_xhs_minitool_export_hash` 单独给,只在进编辑会话、或重读到的新内容真的被采纳时取一次。两者分开是刻意的:刷新这条高频路径在类型上就动不了写回基线,否则「顺手刷新」会把两次刷新之间的外部改动认成自己的基线、把冲突吞掉。指纹是同步细节,不进前端对外状态(hook 里只在 `baselineRef`),界面也不显示任何同步状态(没有「保存中」「待保存」文案)。`save_xhs_minitool_export_form` 成功后回新的指纹。
|
||||
- 冲突:注册表可被 agent(改文件)与用户(面板编辑)两方写入。宿主保存时带 `baseHash`;宿主重读比对,hash 不同再逐字段 diff,只要有字段真的不同就判冲突,**绝不覆盖**,返回两侧值让前端逐字段选择;纯格式化改动静默吸收。注册表内不存 revision / updatedAt 之类 token。
|
||||
- 权限与副作用:跑脚本复用 `command.exec` 的权限口径(只查 deny,UI 按钮即用户确认),**不新增** `GAME_CREATION_APP_COMMANDS` 条目;导出链路**不拿项目写锁、不推进全局 revision**(`.export/` 不进 manifest、素材、UI State 或客户端投影)。发布包是白名单收集,`.export/` 不会进入。
|
||||
- 非目标:平台自动上传(无 API)、PNG/JPG 之外的 icon 格式转换、宿主侧 zip 结构校验、非 vite 项目、第二个导出目标,以及 `GAME_CREATION_APP_COMMANDS` / `shared-contracts` / SpacetimeDB / OpenAPI 的任何改动。
|
||||
- 验收:注册表自动建空表单与严格解析拒绝、表单首错、`hasScript` 判定、`contentHash` 冲突与逐字段选择、icon 越界与符号链接拒绝、产物路径;首次适配在真实 vite 项目上由 agent 跑通并产出可人工上传的 zip,二次导出零 agent 调用;变更 skill 脚本后指纹同步。证据与未验证项见[里程碑](../project-memory/plans/【里程碑】导出产物面板与小红书小工具导出-2026-10-05.md)。
|
||||
- 落地情况:Rust(`export/{mod,registry,draft/xhs_minitool/*}` 三个命令)、前端(`export/{state,tabs/xiaohongshu,generated}`)、skill(`pack.mjs --zip-out`)与 `.export/` 快照同步排除均已实现;定向单测与前端 vitest 通过,**真实 vite 项目上的首轮适配仍是唯一未验证项**。
|
||||
- 验收:注册表自动建空表单与严格解析拒绝、表单首错、`hasScript` 判定、内容与指纹两条命令的切分(自动刷新拿不到写回基线)、`contentHash` 冲突与逐字段选择、icon 越界与符号链接拒绝、产物路径;自动重读不覆盖用户未保存的输入、agent 事后加上脚本不用点刷新就能亮起导出按钮;首次适配在真实 vite 项目上由 agent 跑通并产出可人工上传的 zip,二次导出零 agent 调用;变更 skill 脚本后指纹同步。证据与未验证项见[里程碑](../project-memory/plans/【里程碑】导出产物面板与小红书小工具导出-2026-10-05.md)。
|
||||
- 落地情况:Rust(`export/{mod,registry,draft/xhs_minitool/*}` 四个命令)、前端(`export/{state,tabs/xiaohongshu,generated}`)、skill(`pack.mjs --zip-out`)与 `.export/` 快照同步排除均已实现;定向单测与前端 vitest 通过,**真实 vite 项目上的首轮适配仍是唯一未验证项**。
|
||||
|
||||
## 2026-10-02 退役自建 Agent Runtime 与 CLI 执行面
|
||||
|
||||
|
||||
Reference in New Issue
Block a user