Custom Features Verification Checklist
每次同步后(Step 7 / Step 9)逐项确认。所有条目都是 DevEco Code 独有功能,上游不存在。
重要:下方的代码片段仅为历史参考实现,并非要求严格照搬。上游可能大规模重构代码架构(如重命名、迁移模块、改变初始化模式),Agent 应根据同步后实际的代码架构来判断每个功能是否正确保留。检查项描述的是功能意图,而非具体代码形式。
1. registry.ts — HarmonyOS 自定义工具 + Plan 工具
文件:packages/opencode/src/tool/registry.ts
- Imports 存在:
HdcLogToolfrom"./hdc_log",SwitchCwdToolfrom"./switch-cwd",OhKnowledgeToolfrom"./oh_knowledge",Authfrom"@/auth",PlanWriteTool和PlanEnterToolfrom"./plan"(与PlanExitTool同在) - Layer 依赖:
Auth.Service在Layer.Layer类型联合中 - 初始化:
yield* HdcLogTool,yield* SwitchCwdTool,yield* OhKnowledgeTool,yield* PlanWriteTool,yield* PlanEnterTool,yield* Auth.Service - Tool.init():
hdclog,switchcwd,ohknowledge,planwrite,planenter在Effect.all块中 - ohknowledge OAuth 门控:ohknowledge 工具仅在用户通过 deveco OAuth 认证时注册到 Builtin 列表,未认证用户不应看到该工具。参考实现:
Builtin 列表中使用const authInfo = yield* auth.get("deveco").pipe(Effect.orElseSucceed(() => undefined)) const ohknowledgeEnabled = authInfo !== undefined && authInfo.type === "oauth"...(ohknowledgeEnabled ? [tool.ohknowledge] : [])条件展开(参考提交fee1ab5e) - Builtin 列表:
tool.hdclog,tool.switchcwd,...(ohknowledgeEnabled ? [tool.ohknowledge] : [])(带// HarmonyOS tools注释);tool.planwrite,tool.planenter与tool.plan同在flags.client === "cli"条件下(不含experimentalPlanMode) - defaultLayer:
Layer.provide(Auth.defaultLayer)在 provider chain 中
参考提交:6067f5a6(Agent 权限设定)、fee1ab5e(ohknowledge OAuth 门控)
2. agent.ts — Agent 权限配置
文件:packages/opencode/src/agent/agent.ts
- build agent:
plan_enter: "ask",plan_write: "deny"(上游默认"allow"/ 缺失) - plan agent:
plan_exit: "ask",plan_write: "allow",edit: "deny", 以及 9 个 HarmonyOS 工具 deny 规则:bash,build_project,check_ets_files,perform_ui_action,get_app_ui_tree,start_app,hdc_log,switch_cwd,arkts_knowledge_search
3. package.json — 自定义依赖
文件:packages/opencode/package.json
- name:
"deveco"(非"opencode") - bin:
{ "deveco": "./bin/deveco" }(非"opencode") - devDependencies 中(按字典序):
@deveco-codegenie/mcp-bridge,@deveco-codegenie/mcp-bridge-darwin-arm64,@deveco-codegenie/mcp-bridge-darwin-x64,@deveco-codegenie/mcp-bridge-win32-x64 - dependencies 中同上 4 包
- workspace dep(
packages/web/package.json):"deveco": "workspace:*"(非"opencode")
参考提交:456483d2c(首次添加)、2d4aac556(v1.14.50→v1.14.51 再次丢失)
4. skill/index.ts — Default skills 提取
文件:packages/opencode/src/skill/
-
defaults.ts文件存在,DEVECO_DEFAULT_SKILLSdeclare 正确 -
index.ts中import { Defaults } from "./defaults"存在 -
index.ts中import { InstallationVersion } from "@opencode-ai/core/installation/version"存在 -
discoverSkills函数体开头有:const defaultDir = yield* Defaults.ensure(InstallationVersion, fsys).pipe(Effect.orDie) yield* scan(state, defaultDir, SKILL_PATTERN)
已发生两次丢失(v1.14.48→v1.14.49、v1.15.0→v1.15.1)。参考提交:456483d2c(首次添加)、9c818d201(v1.14.49 后恢复)、d6ce9a947(v1.15.1 再次丢失)
5. Plan 工具门控条件
文件:packages/opencode/src/tool/registry.ts(builtin 列表)
- Plan 工具条件为
flags.client === "cli"only(不含experimentalPlanMode)- 正确:
...(flags.client === "cli" ? [tool.plan, tool.planwrite, tool.planenter] : []) - 错误:
...(flags.experimentalPlanMode && flags.client === "cli" ? ...)
- 正确:
参考提交:e612cc6f7 (sync: v1.15.4 -> v1.15.5)
6. postinstall.mjs — 品牌标识 + vendor 拷贝
文件:packages/opencode/script/postinstall.mjs
- 包名 base:
`@deveco/deveco-code-${platform}-${arch}`(非`opencode-${platform}-${arch}`) - 二进制名称:
deveco/deveco.exe(非opencode/opencode.exe) -
resolvePackageDir(name)函数存在,从require.resolve提取包目录 -
copyDir(src, dst)函数存在,递归拷贝目录 -
copyVendor(packageDir)函数存在,拷贝vendor/目录到__dirname - 直接解析路径中调用
copyVendor(resolvePackageDir(name)) - npm 临时安装路径(
installPackage函数内)中调用copyVendor(packageDir)
参考提交:a3a7231cc(恢复被上游覆盖丢失的品牌标识和 copyVendor 功能)
7. Claude 配置默认禁用
文件:packages/opencode/src/effect/runtime-flags.ts
-
boolTruehelper 存在:Config.boolean(name).pipe(Config.withDefault(true))(与bool的withDefault(false)相反) -
disableClaudeCodePrompt使用boolTrue(非bool):DEVECO_DISABLE_CLAUDE_CODE和DEVECO_DISABLE_CLAUDE_CODE_PROMPT均为默认true -
disableClaudeCodeSkills使用boolTrue(非bool):DEVECO_DISABLE_CLAUDE_CODE和DEVECO_DISABLE_CLAUDE_CODE_SKILLS均为默认true,即默认不扫描.claude/skills/目录
文件:packages/opencode/src/skill/index.ts
- 无
customize-opencode内置 skill:上游注册了一个customize-opencode内置 skill(用于指导模型编辑 opencode 配置),DevEco Code 不需要此 skill,确认不存在相关 import、常量和注册逻辑 -
CLAUDE_EXTERNAL_DIR被条件排除:discoverSkills中.claude目录仅在!disableClaudeCodeSkills时加入externalDirs,默认被排除
参考提交:e7bfb3401(默认禁用 Claude 配置读取)、259511193(移除 customize-opencode 内置 skill)
8. TUI tips 品牌
文件:packages/opencode/src/cli/cmd/tui/feature-plugins/home/tips-view.tsx
-
TIPS数组中用户可见的opencode <command>→deveco <command> -
OpenCode→DevEco Code - 不改:
opencode.aiURLs,/opencode/ocGitHub bot commands,ghcr.io/anomalyco/opencodeDocker image, import paths, command IDs (e.g.opencode.status)
9. 数据库文件名与托管配置路径
文件:packages/opencode/src/storage/db.ts
- 数据库文件名:
"deveco.db"和`deveco-${channel}.db`(非opencode.db)
文件:packages/opencode/src/config/managed.ts
- MDM plist 域名:
"ai.deveco.managed"(非ai.opencode.managed) - macOS 路径:
"/Library/Application Support/deveco"(非opencode) - Windows 路径:
path.join(..., "deveco")(非opencode) - Linux 路径:
"/etc/deveco"(非/etc/opencode)
文件:packages/opencode/src/config/agent.ts 和 command.ts
- 搜索模式:pattern 数组中不含
/.opencode/条目,只有/.deveco/