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
2 changes: 2 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

32 changes: 24 additions & 8 deletions docs/architecture/cli-product-line-design.md
Original file line number Diff line number Diff line change
Expand Up @@ -544,14 +544,30 @@ plan stale 后只保留旧选择与新 eligible 项的交集,新候选不自
规则文件优先复用项目已有文件,不复制出第二份内容。若不同生态规则冲突,导入报告必须展示目标文件、
优先级和冲突段,不能自动拼接。

当前 Workspace Instructions 只消费真实工作区根,本地和 Remote 共用同一个解析器与 `WorkspaceFileSystem` 端口。
固定顺序是:`AGENTS.override.md`(存在时替代 `AGENTS.md`,空文件也不回退)、根 `CLAUDE.md` 或
`.claude/CLAUDE.md`、`CLAUDE.local.md`、不带 `paths` front matter 的 `.claude/rules/**/*.md`,最后是项目根与
`.opencode` 中 `opencode.json/jsonc` 的本地 `instructions` 文件或 glob。Claude `@import` 只跟随工作区内文件,
深度上限为 5,并对重复和循环引用去重;所有目录遍历都跳过符号链接。运行时尚无稳定的嵌套活动目录事实,因此
不声明 root-to-cwd 级联。递归扫描跳过 VCS、依赖与构建目录,并对扫描节点、文件数量、单文件和总内容字节设置固定
上限,避免宽 glob 阻塞本地或 Remote 工作区。Claude path-scoped rules、全局规则、OpenCode 远程 URL、变化监听和冲突
报告也不属于当前实现。
本地 Workspace Instructions 先读取用户级生态来源,再追加项目来源。用户级固定顺序是 OpenCode、Codex、Claude Code:
OpenCode 读取 `$XDG_CONFIG_HOME/opencode/AGENTS.md`(默认 `~/.config/opencode/AGENTS.md`),不存在时回退
`~/.claude/CLAUDE.md`;随后按 `config.json`、`opencode.json`、`opencode.jsonc` 的原生覆盖顺序读取最终
`instructions` 数组,支持 workspace 相对、`~/`、绝对本地精确文件和有界 glob,不获取 HTTP/HTTPS URL。Codex 在
`$CODEX_HOME`(默认 `~/.codex`)中读取首个非空的 `AGENTS.override.md` 或 `AGENTS.md`;空 override 继续回退到基础文件。Claude Code
从 `$CLAUDE_CONFIG_DIR`(默认 `~/.claude`)读取 `CLAUDE.md`、不带 `paths` front matter 的 `rules/**/*.md`,并只在
该用户配置根内跟随深度最多 5 的 `@import`。跨生态按 canonical path 保留首个来源,用户来源合计限制为 256 个文件、
单文件 1 MiB、总内容 2 MiB;进入提示词的名称只显示 `~`、环境变量根、`<workspace>` 或 `<configured-path>`。环境变量
指定的用户根必须是绝对路径,无法确定用户根时跳过该生态而不回退进程 cwd。Codex 只读取用户根的 Instruction 文件,
不扫描 `$CODEX_HOME/plugins/cache` 等产品插件缓存。用户与项目来源合成后再次执行一个共享的 256 文件、2 MiB 最终
渲染预算;按既定顺序保留完整文件前缀,不截断单个 Instruction 文档。

项目来源仍由 Workspace Instructions owner 通过本地文件系统或 `WorkspaceFileSystem` 端口统一解析。固定顺序是:
`AGENTS.override.md`(存在时替代 `AGENTS.md`,空文件也不回退)、根 `CLAUDE.md` 或 `.claude/CLAUDE.md`、
`CLAUDE.local.md`、不带 `paths` front matter 的 `.claude/rules/**/*.md`,最后是项目根与 `.opencode` 中
`opencode.json/jsonc` 的本地 `instructions` 文件或 glob。Claude `@import` 只跟随工作区内文件,深度上限为 5,并对
重复和循环引用去重;所有目录遍历都跳过符号链接。运行时尚无稳定的嵌套活动目录事实,因此不声明 root-to-cwd 级联。
递归扫描跳过 VCS、依赖与构建目录,并对扫描节点、文件数量、单文件和总内容字节设置固定上限,避免宽 glob 阻塞本地
或 Remote 工作区。Remote 只使用端口可见的项目来源,绝不回退到控制端的本机用户目录。单个用户生态读取失败只隔离
该生态,项目来源和其他用户生态仍可用;I/O 或解析失败时这次 user context 构建不写缓存,下一条消息会重试。确定性
遍历预算超限则跳过对应 OpenCode glob 或 Claude rules 集合、保留已读取的基础文件并允许缓存,避免每条消息重复同一宽扫描。

Claude path-scoped rules、OpenCode 远程 URL、managed/organization policy、变化监听、冲突报告和 Plugin Runtime 不属于
当前实现。

现有对 `.claude/.codex/.opencode/.agents` Skill 根的直接发现已经保留来源身份和全局/项目使用范围,并在 GUI/TUI
展示来源和默认覆盖状态,模式配置再展示实际采用项;固定根顺序保持为 Skill Registry 的独立回归契约。Registry 仅按
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,7 @@ OpenCode adapter 在来源发现、解析和审批前不 import module、不读

| 资产 | OpenCode 输入 | BitFun 归属模块 / 适配方式 | 默认行为 | 降级条件 |
|---|---|---|---|---|
| Rules / Instructions | 项目/全局 `AGENTS.md`、Claude fallback、`instructions` glob、本地文件、远程 URL | Workspace Instructions 归属模块保存有序来源引用 | 当前实现项目根与 `.opencode` 配置中的本地精确文件/glob;全局与远程 URL 仍是目标 | 无效 JSONC 或 glob 只排除对应配置项;文件 I/O 失败时当前构建不缓存并在下一条消息重试。 |
| Rules / Instructions | 项目/全局 `AGENTS.md`、Claude fallback、`instructions` glob、本地文件、远程 URL | 各生态 adapter 保留原生用户来源语义;Workspace Instructions owner 解析项目来源;Product Assembly 有序合成 | 当前支持 OpenCode 用户 `AGENTS.md`/Claude fallback、三份全局配置的最终本地 `instructions`,以及既有项目根与 `.opencode` 本地精确文件/glob;不获取远程 URL | 单个用户生态的无效配置、glob 或文件 I/O 失败会隔离该生态,保留其他用户生态与项目来源,并使本次构建不可缓存;项目配置继续按项目解析器的逐项降级语义处理。 |
| Agents / Modes | 当前生产 V1 `agent/prompt/disable/permission`、Core V2 `agents/system/disabled/permissions` 输入形状,以及 Markdown、description、mode、model、variant、temperature、top_p、steps、deprecated `maxSteps`、deprecated `tools`、options、hidden、color | Agent 归属模块创建兼容定义和使用范围视图;OpenCode adapter 只翻译来源语义 | 当前支持 Subagent 安全子集和 Agent-local 权限约束;V1 是生产兼容主路径,Core V2 字段只按已验证安全子集解析;首次按行为、来源、模型、工具与权限范围确认,fresh single-run 调用 | primary/mode、variant/options、采样、steps 与续接保持诊断或阻断;root ambient 权限和 V1 嵌套 resource map 尚不激活,不影响其他 Agent。 |
| Skills | `.opencode/.claude/.agents` 项目与用户根、`SKILL.md`、`skills.paths/urls` | OpenCode adapter 只由 `bitfun-core/external_sources` 组合并投影有序本地配置根;Skill 归属模块负责有界递归、解析、覆盖与按需加载 | 标准根及 V1 `skills.paths`/当前本地字符串数组可用;项目配置限项目根,用户配置限项目根或用户目录;配置根最多 64 个、每根 512 个 Skill、单文件 256 KiB、可选策略 64 KiB,实际加载再次执行有界非链接读取;配置根在同 scope 覆盖标准 OpenCode 根,但不重排更早的 BitFun/Claude/Codex/Cursor 来源 | URL、下载/缓存、脚本与外部依赖不加载;无效根不影响标准 Skill。 |
| References | `references` / 旧 `reference`,本地 path 或 Git repository/branch/description/hidden | **基础能力缺失**:先补 Workspace Reference 的异步准备与 `@alias` 消费接口 | 本地引用保留相对来源;Git 拉取按 L2 确认并保留缓存/隐藏语义 | 拉取失败不阻止项目,外部目录仍遵守工具权限。 |
Expand All @@ -217,11 +217,19 @@ OpenCode adapter 在来源发现、解析和审批前不 import module、不读
规则内容尽量原地引用,不复制成第二份文件。组合结果保留原始段落来源和顺序。OpenCode 与 BitFun 原生规则
同时存在时,配置视图展示实际进入模型的顺序;不能把冲突文本自动改写成“合并后的真相”。

当前 runtime-free 子集不建立通用配置来源图:Workspace Instructions owner 在每个 Session 首次需要 user context 时读取
项目根 `opencode.json`、`opencode.jsonc`、`.opencode/opencode.json` 和 `.opencode/opencode.jsonc` 中的
`instructions` 数组,只接受工作区内相对精确文件与 glob,确定性排序后追加到既有 `AGENTS`/Claude 来源之后。
绝对路径、`~`、越出工作区的路径、符号链接和 URL 都不会加载。文件变更不启动 watcher;用户通过统一的
`/reload instructions`(或默认 `/reload`)失效当前 Session 的 `UserContext` 缓存,下一条消息重新读取。
当前 runtime-free 子集不建立通用配置来源图,也不进入 `ExternalSourceControlPlane`。OpenCode adapter 负责用户级原生
来源语义:先选 `$XDG_CONFIG_HOME/opencode/AGENTS.md`(默认 `~/.config/opencode/AGENTS.md`),不存在时回退
`~/.claude/CLAUDE.md`;再按 `config.json`、`opencode.json`、`opencode.jsonc` 顺序合并,后出现的 `instructions`
数组覆盖前者。最终数组支持 workspace 相对、`~/`、绝对本地精确文件和有界 glob;HTTP/HTTPS 项直接拒绝,不下载、
缓存或探测网络。Product Assembly 依次合成 OpenCode、Codex、Claude Code 用户来源,再追加项目来源,并按 canonical path
保留首项。非递归 glob 只遍历模式所需层级;递归 glob 超出固定扫描预算时只跳过该项,保留此前已读取的用户来源。
用户与项目来源最终进入模型前还共享既有 256 文件、2 MiB 渲染上限,避免两个独立来源预算叠加扩大固定提示词。

Workspace Instructions owner 继续读取项目根 `opencode.json`、`opencode.jsonc`、`.opencode/opencode.json` 和
`.opencode/opencode.jsonc` 中的 `instructions` 数组,只接受工作区内相对精确文件与 glob,确定性排序后追加到既有
项目 `AGENTS`/Claude 来源之后。Remote 只执行这条端口可见的项目路径,不读取控制端的用户目录。文件变更不启动
watcher;用户通过统一的 `/reload instructions`(或默认 `/reload`)失效当前 Session 的 `UserContext` 缓存,下一条
消息重新读取。用户生态失败不会吞掉项目 instructions,但会阻止本次 user context 写入缓存,因而下一条消息自动重试。

### 5.2 Agents、Modes 与 Skills

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,9 +104,9 @@ OpenCode,和 OpenCode 配置/插件进入 BitFun 是两个独立验收方向
| OpenCode 扩展项 | BitFun 差异 | 当前状态 | 目标可实现性 | 成熟度依赖(非执行顺序) | BitFun 需要完成的工作 | 细节 |
|---|---|---|---|---|---|---|
| 配置层级与合并 | 融合现有能力 | 部分实现:Command/Subagent/MCP 本地来源顺序 | 可完整适配 | OC-R1 | 当前三类 provider 复用私有本地路径顺序与监听根;后续按 remote、global、自定义文件、project、`.opencode`、内联和组织配置补齐有序来源并保留最终来源 | [来源与合并](opencode-config-assets-adapter-design.md#3-配置层级与来源) |
| JSON、JSONC、环境变量、文件引用 | 转换参数 + 明确降级 | 部分实现:项目 `instructions` 的 JSON/JSONC | 可主要适配 | OC-R1 | 当前只解析项目根和 `.opencode` 配置中的本地 instruction 文件/glob;完整配置 schema、环境变量与文件变量引用仍未实现 | [解析与鲁棒性](opencode-config-assets-adapter-design.md#4-解析与鲁棒性) |
| JSON、JSONC、环境变量、文件引用 | 转换参数 + 明确降级 | 部分实现:用户/项目 `instructions` 的 JSON/JSONC | 可主要适配 | OC-R1 | 当前按原生顺序读取用户 `config.json`、`opencode.json`、`opencode.jsonc` 的最终本地 instructions,并保留项目根与 `.opencode` 本地文件/glob;完整配置 schema、环境变量与文件变量引用仍未实现 | [解析与鲁棒性](opencode-config-assets-adapter-design.md#4-解析与鲁棒性) |
| 独立 `tui.json/jsonc` | 融合现有能力 + 转换参数 | 未实现 | 可完整适配 | OC-R1 | 按 global、`OPENCODE_TUI_CONFIG`、project、`.opencode` 独立顺序加载,不能复用主配置优先级 | [TUI 来源](opencode-config-assets-adapter-design.md#32-tui-独立来源顺序) |
| Rules / Instructions | 转换参数 | 部分实现:项目本地文件与 glob | 可完整适配 | OC-R1 | 当前由 Workspace Instructions owner 读取项目 `instructions` 的精确文件和 glob;全局、远程 URL、完整来源合并与变化监听仍未实现 | [声明式资产](opencode-config-assets-adapter-design.md#5-声明式资产映射) |
| Rules / Instructions | 转换参数 | 部分实现:用户/项目本地文件与 glob | 可完整适配 | OC-R1 | OpenCode adapter 已读取用户全局 `AGENTS.md`/Claude fallback 和最终本地 `instructions`;Product Assembly 在 Codex/Claude 用户来源与项目来源之前合成并去重。远程 URL、managed/organization policy、完整配置来源图和变化监听仍未实现 | [声明式资产](opencode-config-assets-adapter-design.md#5-声明式资产映射) |
| Agents / Modes | 融合现有能力 + 转换参数 | 部分实现:Subagent 安全子集与 Agent-local 权限约束 | 可主要适配 | OC-R1 | 已支持当前生产 V1 `agent/prompt/disable/permission` 与 Core V2 `agents/system/disabled/permissions` 的已验证安全子集、全局/项目 Markdown 和 JSON/JSONC、subagent/all、description、精确模型和工具映射,并接入审批、冲突、更新、撤下和 fresh single-run Task;V1 `disable` 保持 deep-merge,V2 `disabled` 保持 remove/re-add,不能混用生命周期语义。有序 V2 permission rules 与 V1 扁平精确 action map 会成为只可收紧的独立约束。primary/mode、root ambient permission、V1 action pattern/嵌套 resource map、跨路径与命令资源域的歧义 pattern、variant/options、采样与续接明确阻断或降级 | [Agents 与 Skills](opencode-config-assets-adapter-design.md#52-agentsmodes-与-skills) |
| Skills | 转换参数 | 部分实现:标准根与本地配置根 | 可完整适配 | OC-R2 | 现有 Registry 除标准用户/项目根外,也通过 `bitfun-core/external_sources` 组合边界按 OpenCode 配置来源顺序累加 V1 `skills.paths` 与当前迁移后的本地字符串数组;仅接受项目根/用户目录内的本地目录并做有界递归发现。同 scope 配置根覆盖标准 OpenCode 根,但不重排更早的 BitFun/Claude/Codex/Cursor 来源。URL、下载/缓存、完整 allow/deny/ask 顺序及外部来源策略仍未实现 | [Agents 与 Skills](opencode-config-assets-adapter-design.md#52-agentsmodes-与-skills) |
| References | 补基础能力 + 转换参数 | 未实现 | 可主要适配 | OC-R2 | R1 解析;R2 支持本地目录和 Git repository/branch/description/hidden,异步准备并接入 `@alias` | [声明式资产](opencode-config-assets-adapter-design.md#5-声明式资产映射) |
Expand Down
3 changes: 3 additions & 0 deletions scripts/core-boundaries/rules/source/forbidden-rules.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -4126,6 +4126,7 @@ export const forbiddenContentUnderRules = [
'src/crates/assembly/core/src/plugin_runtime.rs',
'src/crates/assembly/core/src/external_sources.rs',
'src/crates/assembly/core/src/external_hooks.rs',
'src/crates/assembly/core/src/instruction_sources.rs',
],
message:
'only a reviewed product composition root may import bitfun-opencode-adapter through a capability-specific provider boundary',
Expand Down Expand Up @@ -4157,6 +4158,7 @@ export const forbiddenContentUnderRules = [
'src/crates/adapters/claude-code-adapter/tests/mcp_source.rs',
'src/crates/assembly/core/src/external_sources.rs',
'src/crates/assembly/core/src/external_hooks.rs',
'src/crates/assembly/core/src/instruction_sources.rs',
],
message: 'Claude Code declarative source adapter may only be imported by its fixtures and reviewed composition roots',
}],
Expand All @@ -4172,6 +4174,7 @@ export const forbiddenContentUnderRules = [
'src/crates/adapters/codex-adapter/tests/mcp_source.rs',
'src/crates/assembly/core/src/external_sources.rs',
'src/crates/assembly/core/src/external_hooks.rs',
'src/crates/assembly/core/src/instruction_sources.rs',
],
message: 'Codex declarative source adapter may only be imported by its fixtures and reviewed composition roots',
}],
Expand Down
Loading
Loading