6.8 KiB
6.8 KiB
Coding Conventions
Analysis Date: 2026-04-07
Naming Patterns
Files:
- Python 使用
snake_case.py,按领域分层放置,例如backend/packages/harness/deerflow/config/app_config.py、backend/packages/harness/deerflow/agents/lead_agent/agent.py。 - Backend 测试文件统一
test_*.py,位于backend/tests/,例如backend/tests/test_client.py、backend/tests/test_stream_bridge.py。 - Frontend 页面与组件文件使用
kebab-case.tsx或目录约定命名,例如frontend/src/app/workspace/page.tsx、frontend/src/components/workspace/workspace-container.tsx。 - Frontend E2E 测试使用
*.spec.ts,位于frontend/tests/e2e/;轻量模块测试使用*.test.ts或*.test.mjs,例如frontend/src/core/api/stream-mode.test.ts。
Functions:
- Python 函数与内部 helper 统一
snake_case,例如_make_e2e_config(backend/tests/test_client_e2e.py)、get_available_tools(backend/packages/harness/deerflow/tools/tools.py)。 - TypeScript/JavaScript 函数统一
camelCase,例如copyToClipboard(frontend/src/lib/utils.ts)、skipIfMissingThread(frontend/tests/e2e/support/chat-helpers.ts)。
Variables:
- Python 常量使用全大写下划线,如
BUILTIN_TOOLS(backend/packages/harness/deerflow/tools/tools.py)。 - TS 常量通常
camelCase,跨测试配置使用全大写语义常量,如THREAD_FOR_WELCOME(frontend/tests/e2e/support/chat-helpers.ts)。
Types:
- Python 使用类型注解(
list[str]、dict[str, Any])与pydantic模型,见backend/packages/harness/deerflow/config/app_config.py。 - Frontend 使用 TypeScript 严格模式,并偏向显式返回类型(例如
Promise<void>infrontend/src/lib/utils.ts)。
Code Style
Formatting:
- Backend 使用
ruff format;规则来源backend/ruff.toml(quote-style = "double",indent-style = "space",line-length = 240)。 - Frontend 使用
prettier+prettier-plugin-tailwindcss,配置在frontend/prettier.config.js;CI 中执行pnpm format(check 模式)。
Linting:
- Backend 通过
ruff check .,启用E/F/I/UP(backend/ruff.toml)。 - Frontend 通过
eslintflat config(frontend/eslint.config.js),叠加next/core-web-vitals与typescript-eslinttype-checked 规则。 - Frontend 强制导入顺序(
import/order)与分组换行,内部别名@/**归类为 internal。
Import Organization
Order:
- 标准库/内建模块(如
import os、import path from "path")。 - 第三方依赖(如
from pydantic import BaseModel、import { expect, test } from "@playwright/test")。 - 项目内部模块(如
from deerflow...、from "@/env")。
Path Aliases:
- Frontend 启用
@/* -> ./src/*(frontend/tsconfig.json);新增代码应优先使用该别名替代跨层级相对路径。 - Backend 无类似别名约定;使用包内绝对导入
deerflow.*(见backend/packages/harness/deerflow/client.py)。
Error Handling
Patterns:
- Backend 在参数/配置非法时直接抛出
ValueError/FileNotFoundError,示例见backend/packages/harness/deerflow/config/app_config.py和backend/packages/harness/deerflow/client.py。 - Backend 在可降级场景使用
try/except+logger.warning/error,不中断主流程(例如 MCP/ACP 工具加载,backend/packages/harness/deerflow/tools/tools.py)。 - Frontend 偏向显式 guard + return(例如
frontend/src/app/workspace/page.tsx的条件重定向)。
Logging
Framework: logging(Python) + console(Frontend 局部)
Patterns:
- Backend 统一模块级
logger = logging.getLogger(__name__),记录关键分支、fallback、装载结果(backend/packages/harness/deerflow/tools/tools.py)。 - Frontend 存在业务调试日志(
console.log/console.warn)用于 iframe 与失败分支,见frontend/src/lib/utils.ts、frontend/src/core/uploads/prompt-input-files.test.mjs(通过 mock 断言 warning)。
Comments
When to Comment:
- Backend 在复杂中间件顺序、循环依赖绕过、测试分层原则等高认知负担位置写块注释,示例:
backend/packages/harness/deerflow/agents/lead_agent/agent.py(middleware 顺序约束)backend/tests/conftest.py(循环导入链与 mock 注入原因)backend/tests/test_client_e2e.py(测试金字塔与运行边界)
JSDoc/TSDoc:
- Frontend 在共享工具函数处使用 JSDoc 解释行为与边界(
frontend/src/lib/utils.ts)。 - Backend 在公共类/函数上常见 docstring,测试文件顶部也有职责说明。
Function Design
Size: 无硬性行数限制;允许长函数,但通过“局部 helper + 注释分段”提高可读性(见 backend/packages/harness/deerflow/client.py)。
Parameters:
- 偏向显式关键字参数与默认值,Python 常见
*强制关键字调用(DeerFlowClient.__init__)。 - 测试 helper 参数常封装为对象/字典,减少调用点重复(
frontend/tests/e2e/support/chat-helpers.ts)。
Return Values:
- Python 公开接口通常返回结构化对象或强类型(如
StreamEventdataclass inbackend/packages/harness/deerflow/client.py)。 - Frontend helper 对异常场景返回
null/undefined并由调用方判定(frontend/src/core/uploads/prompt-input-files.test.mjs覆盖该行为)。
Module Design
Exports:
- Python 模块多为显式函数/类导出,避免通配导入;测试按模块行为组织断言。
- Frontend 使用
export function/export const的命名导出为主(frontend/src/lib/utils.ts)。
Barrel Files:
- 后端包存在少量
__init__.py聚合导出(如backend/packages/harness/deerflow/models/__init__.py)。 - Frontend 未形成统一 barrel 规范;新增公共模块应优先“就近导出 + 明确 import 路径”,避免深层 barrel 隐式耦合。
CI / 质量门禁约定
- CI 工作流定义于
.github/workflows/lint-check.yml、.github/workflows/backend-unit-tests.yml。 - 合入前最低门禁:
- Backend:
make lint(ruff check + format --check) - Frontend:
pnpm format、pnpm lint、pnpm typecheck、pnpm build - Backend 单测:
make test(pytest)
- Backend:
- Frontend E2E 未纳入默认 CI 工作流;仅定义本地命令
pnpm test:e2e(frontend/package.json)。
简短结论
- 本仓库已形成“双栈分治”质量约定:Backend 以
ruff + pytest为核心,Frontend 以eslint + prettier + typecheck + build为核心,并在 CI 中执行。 - 后续新增代码应严格沿用现有命名、导入分组与异常处理风格;新增测试优先补齐 Frontend 单元测试执行入口与 E2E 的 CI 接入,避免“有测试文件但无持续校验”。
Convention analysis: 2026-04-07