Skip to content

[REQ-128][CODE] renderer 半场:分流 + 预览屏 + 已装扩展包区块(含启用开关)+ 移除 + 热重载接线 #784

Description

@jinjunnn

大白话

用户真正看得见摸得着的那半场:点导入卡 → 看预览 → 确认 → 在扩展中心看见「已装扩展包」
→ 拨开关启用 → 下一条消息里技能真能用 → 点移除整包消失。

这半场是整条竖线里最容易被按层拆票切断的一段。 Phase 1 漏掉 renderer 半场(用户点不动),
Phase 2 漏掉三条跨仓竖线 —— 同一形态。本票与 #781(T2)必须同一个 Iteration。

方案基线(已批)

Phase 3 方案基线 —— 本票 = §10 的 T4-renderer

范围

runImportFolder 按 main 返回值分流(renderer 不判目录形态、不传路径);预览屏;
Hub 新增「已装扩展包」区块 + 每个技能的启用开关;区块内挂「移除」;
confirm 与整包卸载成功后接既有 refreshEngine()

含 UI 变更 ⇒ 先出设计稿走 design-loop,批准后再实现。稿内与 UI 文案零票号、零开发术语。

Acceptance and named gates

  1. 九跳端到端可达(基线 §4 第 1→9 跳),含第 9 跳
    显示未启用 → 用户启用 → 引擎当场重载 → 下一条消息里技能真可用」。
  2. G20 热重载接线:confirm 成功 整包卸载成功后都走既有 refreshEngine()
    use-extensions.ts:136 已在 ExtensionsApi 上,:605 的启停路径已在调它);失败呈现 reload-pending
    真因:use-extensions.ts:610 生产注释明写「fs 类安装不 dispose 就是 placebo」;
    而整包移除(extension-detail.tsx:165-183今天只 refetch 不 refresh
    AC 必须含一条基线记录:证明「今天那一段就是红的」(否则无从判断闸是不是新加的假绿)。
  3. 启用开关是裁决 B 的必然连带 —— 默认 disabled 而列表里没有开关 = 用户装完拿不到任何东西。
    本跳必须同时呈现开关,不得推给下一相位。
  4. 既有 importFolder 卡对非插件目录的行为逐字不变(回归用例钉死)。
  5. 装完当场可见、卸完当场消失,不需退出重进(extension-detail.tsx:187-189 已确立的纪律)。
  6. 移除失败必须显示失败 —— ok 之外任何东西不许读成「已移除」(:170-175 的既有纪律)。
  7. 包内单个技能点卸载 ⇒ 呈现 directUninstallVerdict拒绝文案,不是假成功。
  8. 取消 = 零写盘且 retained bytes 归零(与 T3 的 G19 对接)。
  9. 预览屏逐条呈现:装 / 不装 / 五类人话原因 / 不支持的组件类型 / 不支持的布局。
    owner 裁决二(部分安装 + 显式告知)落在这里 —— 关键是不静默。

依赖

#781(T2)+ #782(T3)。必须与 #781 同一 Iteration。

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:integrationRepository, API, or external integrationarea:productUser-facing product behaviorprio:P1High-value near-term deliverytype:featureNew user or system capability

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions