Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions AGENTS-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,11 +64,13 @@ pnpm run type-check:web
pnpm --dir src/mobile-web run type-check
pnpm run i18n:contract:test # 仅 i18n contract / resources
pnpm run i18n:audit # 仅 i18n contract / resources
pnpm run product:check # 默认产品定义
pnpm run check:repo-hygiene
pnpm run check:github-config
cargo check --workspace

# 测试(本地优先用精确测试路径;大范围测试由 CI 兜底)
pnpm run product:test
pnpm --dir src/web-ui run test:run # 大范围测试;本地优先用精确测试路径
cargo test --workspace # 大范围测试;CI 兜底

Expand Down Expand Up @@ -250,6 +252,7 @@ OpenCode 兼容或目标项目治理的变更,先阅读
| Locale contract 或 shared terms | `pnpm run i18n:generate && pnpm run i18n:contract:test && pnpm run i18n:audit` |
| Web UI i18n runtime、namespace loading 或直接 `i18nService.t(...)` 调用 | `pnpm run i18n:contract:test && pnpm run type-check:web && pnpm --dir src/web-ui run test:run src/infrastructure/i18n/core/I18nService.test.ts` |
| Mobile web UI、状态、配对、断开或重连行为 | `pnpm --dir src/mobile-web run type-check`;行为变化还需要在 PR 中说明手动配对 / 重连验证 |
| 产品定义、schema、resolver 或 Desktop/CLI 产品构建 adapter | `pnpm run product:test`,并对默认定义运行 `pnpm run product:check` |
| `core`、`transport`、adapter 或共享服务中的 Rust 逻辑 | `cargo check --workspace`;行为变化时再加最近的 focused `cargo test` |
| 桌面端集成、Tauri API、browser/computer-use 或桌面专属行为 | `cargo check -p bitfun-desktop`;行为变化时再加 focused desktop tests |
| 被桌面端 smoke/functional 流覆盖的行为 | 优先运行最近的 focused E2E/smoke check;除非改动影响构建,否则 broad build/test 交给 CI |
Expand Down
3 changes: 3 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,11 +67,13 @@ pnpm run type-check:web
pnpm --dir src/mobile-web run type-check
pnpm run i18n:contract:test # i18n contract / resources only
pnpm run i18n:audit # i18n contract / resources only
pnpm run product:check # default product definition
pnpm run check:repo-hygiene
pnpm run check:github-config
cargo check --workspace

# Test (prefer focused paths locally; broad suites are CI-backed)
pnpm run product:test
pnpm --dir src/web-ui run test:run # broad suite; prefer focused paths locally
cargo test --workspace # broad suite; CI-backed

Expand Down Expand Up @@ -281,6 +283,7 @@ change directly affects build, packaging, or CI cannot protect the path.
| Locale contract or shared terms | `pnpm run i18n:generate && pnpm run i18n:contract:test && pnpm run i18n:audit` |
| Web UI i18n runtime, namespace loading, or direct `i18nService.t(...)` usage | `pnpm run i18n:contract:test && pnpm run type-check:web && pnpm --dir src/web-ui run test:run src/infrastructure/i18n/core/I18nService.test.ts` |
| Mobile web UI, state, pairing, disconnect, or reconnect behavior | `pnpm --dir src/mobile-web run type-check`; include manual pairing / reconnect notes when behavior changes |
| Product definition, schema, resolver, or Desktop/CLI product build adapter | `pnpm run product:test`, plus `pnpm run product:check` for the default definition |
| Shared Rust logic in `core`, `transport`, adapters, or services | `cargo check --workspace`, plus the nearest focused `cargo test` when behavior changed |
| Desktop integration, Tauri APIs, browser/computer-use, or desktop-only behavior | `cargo check -p bitfun-desktop`, plus focused desktop tests when behavior changed |
| Behavior covered by desktop smoke/functional flows | Prefer the nearest focused E2E/smoke check; rely on CI for broad build/test coverage unless build behavior changed |
Expand Down
31 changes: 21 additions & 10 deletions docs/architecture/cli-product-line-design.md
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ BitFun CLI 应成为可独立安装和发布的 Agent 产品,而不是 Desktop
|---|---|---|
| CLI 主会话客户端已仅消费 Rust Runtime SDK;本地工作区快照的准备、文件清单、统计和文件回滚已有 Desktop/Peer Host 共用的窄 owner port,但快照记录/持久化/事件、账号同步、富历史及 Peer Host/ACP 的其余维护仍由现有 Core owner 提供 | 窄端口只消除重复宿主转发,不代表完整快照系统、远程快照或公开 SDK 能力已迁移;过早删除其余兼容路径会改变行为 | 保持快照实现和工具拦截在 Core,远程与历史维护留在宿主;仅在新的真实调用方、独立语义和行为等价测试齐备后继续迁移。 |
| TUI 编排、输入、命令、副作用和渲染仍有大文件聚集 | 交互回归难以隔离,终端状态与业务状态容易耦合 | 在现有模块上逐步拆成事件、状态处理、副作用和渲染四个边界,不重写全部 TUI。 |
| CLI 配置只覆盖入口本地选项,缺少统一层级、来源解释和兼容导入 | 用户无法安全复用其他 CLI 资产,也难以解释最终配置来源 | 建立 BitFun Canonical Config、持续来源视图和可选的显式导入报告。 |
| CLI 配置只覆盖入口本地选项,除 C0a 外部 MCP 快照导入外仍缺少统一层级、来源解释和通用兼容导入 | 用户无法安全复用其他 CLI 资产,也难以解释最终配置来源 | 保留现有 MCP 窄入口,后续按真实资产建立 BitFun Canonical Config、持续来源视图和可选的显式导入报告。 |
| OpenCode 来源发现与真实执行尚未形成完整流程 | “来源可识别”容易被误解为“插件可执行” | 先完成一个无外部依赖的样例;取得真实 `execute` 并注册到 Tool Runtime 后才显示可用。 |
| 当前 CLI 使用 `product-full`,OHOS target 图包含多组未验证的平台依赖 | 不能据依赖可解析、`hdc shell` 或移动 Remote App 推导 PC 本地 CLI/TUI 可用 | 问题与风险统一记录在平台规约;具体工作另立专题,HAP 不作为替代。 |
| Product Capability 已有,但品牌、资源、默认策略和发行配置没有统一产品定义 | 白标需要修改多处常量和工作流,能力隐藏不等于后端禁用 | 产品定义只在组装/构建边界选择身份、资源、能力包、默认策略和发行事实。 |
Expand All @@ -184,7 +184,7 @@ PTY/ConPTY 生命周期、Chat 活动 turn 的 resize/取消和发布归档冒
|---|---|---|
| 调用级审批 | TUI、`exec` 与 ACP 已使用各自调用级策略且不写全局配置 | Runtime-context `Allow always`、审批规划、`exec` 安全默认值和显式 `--auto` 有 focused test;真实模型/PTY 审批流与 ACP 仍需另行验收 |
| 输出协议 | 保留 `text/json/stream-json`,复用现有 Agent 事件 | 单一最终状态、失败优先级和 `success=false` 规则见下文;真实供应商审批仍需验收 |
| 配置解释 | Canonical Config 层级、全局/项目持续来源、加载状态和兼容导入 dry-run | 不自动写入;冲突、未知字段、待确认能力和凭据引用可解释 |
| 配置解释 | Canonical Config 层级、全局/项目持续来源、加载状态和非 MCP 兼容导入 dry-run | 除已单独评审的 MCP C0a 快照导入外不自动写入;冲突、未知字段、待确认能力和凭据引用可解释 |
| 产品定制 | 消费最小产品定义、组装结果和已注册 TUI layout/theme ID | 第二个真实 CLI 产品复用后再提升公共字段 |
| TUI 边界 | 增量提取终端恢复守卫、命令分发和副作用边界 | 不改版视觉设计;Linux PTY 与 Windows ConPTY 活动 turn 的 resize/取消、恢复可编辑状态和正常退出清理可单独验证,macOS 活动 turn 与 OS 级初始化失败注入另行补齐 |

Expand Down Expand Up @@ -414,7 +414,11 @@ HarmonyOS PC GUI 与移动端均另立专题。
产品定义、品牌资源、TUI 布局选择、产品组装结果和内置扩展的通用边界由
[`product-customization-blueprint.md`](product-customization-blueprint.md) 定义。本节只约束 CLI/TUI 消费。

CLI 入口只接收已校验的产品组装结果和当前 Delivery Profile 对应的 TUI 布局字段,不读取原始品牌资源,
当前 C0a 只消费已校验解析结果中的 localized 产品名和 binary name,并由 `cli:dev`、`cli:build`
的同一 wrapper 通过显式 `--product-config` 选择非默认定义。内部 Cargo target 仍为 `bitfun`;build 产物按解析后的
名称暂存。安装、更新、用户数据隔离、完整运行时品牌替换以及下表中的布局、命令组、状态、键位或主题选择均未实现。

目标 CLI 入口只接收已校验的产品组装结果和当前 Delivery Profile 对应的 TUI 布局字段,不读取原始品牌资源,
也不运行构建脚本。首期 TUI 布局只允许引用宿主已注册的稳定 ID:

| 定制面 | CLI/TUI 消费 | 宿主保留决定权 |
Expand Down Expand Up @@ -465,30 +469,37 @@ Configuration 只能覆盖产品定义明确允许的默认值;用户插件只
外部进程、不 import 第三方 module、不读取凭据且不主动联网的 L1 字段可以按用户偏好自动应用或先询问。
Plugin/Tool、可执行 Skill/Command、MCP/LSP/Formatter、远程 Reference 等 L2/L3 内容在 OC-R2 完成归属模块保护
前只发现和展示;完成后仍须在首次启用或能力扩大时确认。它们无需先迁移;
显式导入用于用户希望把资产写入 BitFun 原生配置的场景。CLI-P0 截止到 Dry-run,CLI-P1 才允许
对受支持的非执行型配置执行 apply:
显式导入用于用户希望把资产写入 BitFun 原生配置的场景。当前已落地的窄切片只有外部 MCP 快照:Desktop 与
`bitfun mcp import` 可以预览 OpenCode / Claude Code 中语义等价的安全声明,只有显式 `--apply` 才原子写入现有
BitFun MCP 配置;新条目保持 disabled,之后仍由既有 MCP 管理入口复核和启用。Codex 投影、凭据、header、env、cwd、
通用导入记录和 undo 均未实现。该切片不表示通用 Canonical Config 导入已进入 CLI-P1;其他资产在 CLI-P0 仍截止到
Dry-run,只有各自经过评审的 apply 切片才能写入:

```text
持续兼容:后台发现 -> 解析 -> 风险分级 -> L1 自动应用/先询问 | L2/L3 待确认 -> 同一次状态提交切换
显式导入:选择来源 -> 归一化 -> 冲突分析 -> Dry-run | CLI-P1: 用户选择 -> 原子写入 BitFun 层 -> 复核/回滚
MCP C0a:发现 -> 安全投影 -> 预览 | 显式 apply -> 原子写入 disabled 原生条目 -> 既有 MCP 管理
其他显式导入:选择来源 -> 归一化 -> 冲突分析 -> Dry-run | 后续评审切片:用户选择 -> 原子写入 BitFun 层
```

交互式 CLI/TUI 以一条非阻塞摘要说明来源产品、全局/项目使用范围、资产数量、自动应用项和待确认项;详细内容进入
统一来源与插件状态入口,具体命令名在有真实调用方时再固定。非交互命令只有在当前操作实际依赖待确认资产时才
统一来源与插件状态入口。MCP 快照入口固定为 `bitfun mcp import`,其他资产的命令名在有真实调用方时再固定。非交互命令只有在当前操作实际依赖待确认资产时才
返回类型化 `action-required`;无关待办只进入结构化状态或 `stderr` 摘要,不等待不可见输入,也不自动批准。
当前只能静态预览的 custom tool 名称只显示“已发现,未执行”。

导入预览只使用四种用户可读结论:可直接使用、需要转换、会发生功能降级、输入无效。每项同时说明是原地
引用、写入 BitFun 配置、继续保持外部来源还是不支持;不得用“已映射”推导为已写入、已信任或已启用。

兼容来源不写入 BitFun 层,也不双向修改原文件。显式导入时,项目级来源默认写入 BitFun 项目层,用户级
来源默认写入用户层;用户可以在确认时选择更窄的目标层,但不能写入组织强制策略。导入记录保留来源产品、
兼容来源不写入 BitFun 层,也不双向修改原文件。以下分层导入记录与撤销语义是后续通用目标,不是 MCP C0a
已实现能力:项目级来源默认写入 BitFun 项目层,用户级来源默认写入用户层;用户可以在确认时选择更窄的目标层,
但不能写入组织强制策略。导入记录保留来源产品、
来源范围、内容摘要和导入时间,并按字段保存目标层、导入前值及其版本/摘要和导入值。已导入字段以 BitFun 原生
配置为准,不再重复应用外部值;外部来源变化时提示重新导入并展示差异,不做双向写回。撤销只自动恢复当前值
仍等于导入值的字段;用户后续修改、来源变化或部分重新导入造成冲突时,逐字段选择“保留 BitFun / 重新导入
外部 / 手工处理”,不得整批覆盖。

| 来源 | 首期可导入 | 首期不导入 |
下表描述目标覆盖范围;当前 MCP C0a 仅支持上文列出的 OpenCode / Claude Code 安全投影,不能由本表推导为已实现。

| 来源 | 目标可导入 | 目标不导入 |
|---|---|---|
| OpenCode | 规则/instructions、Agent、Mode、Skill、References、Command、MCP、LSP、Formatter、模型、Theme、Keybind 和稳定配置进入兼容来源图;非执行资产可显式导入 | 凭据值双向复制、把 OpenCode 原始类型变成 BitFun 内部类型;Plugin/Tool 经来源确认后由独立 Runtime 加载,不通过配置导入执行 |
| Codex | `AGENTS.md` 原地引用;受支持的 MCP、稳定配置和 Skill 可选择原地引用或导入 | `auth.json` 等凭据、私有/未文档化字段、Codex App Server 状态 |
Expand Down
35 changes: 35 additions & 0 deletions docs/architecture/extensions/external-ai-work-sources-design.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,41 @@ MCP 安全子集,以及 Codex Subagent、MCP 安全子集;三种生态使用
但各自在 sibling adapter 内保留原生来源与覆盖语义。完整 TypeScript/Bun、包依赖、package plugin 执行、
Codex/Claude Code 运行时适配、primary agent 替换和外部 Subagent 续接仍属于后续阶段,不能因来源被识别就宣称已经可用。OpenCode、Claude Code 与 Codex 的本地 Hook 静态目录
已作为独立只读切片接入;它只证明来源和声明能够安全展示,不证明 handler 已加载、获得权限或可以执行。
独立的 MCP C0a 快照导入复用上述来源与现有 MCP 配置 owner:Desktop 和根 CLI 可预览 OpenCode / Claude Code
中语义等价的安全声明,并在用户显式确认后原子写入 disabled 原生条目。Codex 导入投影、凭据/header/env/cwd
迁移、通用导入记录、undo、Peer/Remote 写入均未实现;这不改变外部 MCP 持续兼容来源的运行路径。

## 0. 当前 MCP 快照导入契约(C0a)

快照导入是显式复制,不是持续同步,也不改变现有外部 MCP 兼容来源。Desktop 与根 CLI 只负责展示脱敏预览并发送
typed intent;OpenCode / Claude Code sibling adapter 复用各自已合并的解析结果生成私有安全投影,外部来源协调器固定
当前 candidate 与行为版本,core 负责重新规划,最终仍由唯一 MCP 配置 service 校验并写入 `mcp_servers`。
Codex 继续参与现有只读发现,但当前没有导入投影。

公开的 versioned plan/apply DTO 只包含 schema version、plan fingerprint、candidate ID、display name、transport、建议
native ID、disposition 和稳定 reason code,不包含 command arguments、URL、原始 JSON、凭据、environment/header 值或
`MCPServerConfig`。provider 私有投影不可序列化且使用 redacted `Debug`;plan/request 最多包含 256 个 candidate,未知请求
字段与重复选择直接拒绝。

当前只复制能够与原生配置保持等价语义的声明:

- 无显式 environment/cwd 的 local stdio command 与 adapter 已解析 arguments;
- 无 userinfo、query、fragment、header 或 provider OAuth 变化的 HTTPS streamable HTTP URL。

environment 值或引用、header/authorization、cwd、未知字段和其他 transport 不猜测、不复制、不记录。导入条目始终为
`enabled: false` 与 `autoStart: false`;local 条目不继承完整父进程环境,只保留 MCP runtime owner 提供的安全环境。

native ID 优先使用外部 logical name,再使用稳定生态后缀和最小可用数字后缀;超长名称使用 bounded digest,已有条目
永不覆盖。plan fingerprint 同时绑定脱敏 plan、私有投影和当前原生 MCP 配置摘要。apply 会重新发现并重建 plan;来源或
目标内容变化时返回刷新后的脱敏 plan,且不写入;fingerprint 不绑定 coordinator refresh generation,因此内容未变的刷新
不会让 plan stale。配置 service 通过同一 JSON key 的 compare-and-set mutation lane
一次提交全部选中条目或全部不提交,并在 `_bitfunImport` 中只保留 source-qualified candidate ID 与 behavior version。
普通 MCP 编辑保留这段 provenance,删除条目时随条目一并移除。

根 CLI 的 `bitfun mcp import` 默认只预览,`--apply` 导入全部 eligible 项;重复 `--candidate` 可缩小集合,单一选择可用
`--native-id` 指定目标 ID,`--format json` 输出 versioned plan/result。当前没有 TUI/Mobile/Server/Peer/Remote/ACP/SDK
写入口、导入 journal、tombstone、undo、外部应用回写或插件安装/激活策略;导入后仍由既有 MCP manager 完成复核、编辑、
启用和删除。

## 1. 产品判断与竞品启示

Expand Down
Loading