本规范适用于 Brand-Flow AI 智能图文创作平台的 Monorepo 仓库,覆盖 apps/web(前端)、apps/api(NestJS 后端)与 packages/agent(AI 逻辑库)。目标是:类型安全、边界清晰、风格一致、便于多人并行开发。
- 包管理:pnpm workspaces(根目录统一
pnpm install)。 - 任务编排:Turborepo(
pnpm dev/pnpm build/pnpm lint)。 - 静态检查与格式:根目录 eslint.config.js(按目录分区)+ .prettierrc.json;提交前请在仓库根执行
pnpm lint。
| 类型 | 风格 | 示例 |
|---|---|---|
| 变量、函数、方法 | camelCase |
activeNodeId、fetchWorkflowData |
| 类、接口、类型、组件、枚举名 | PascalCase |
UserService、WorkspaceProps、NodeStatus |
| 常量(配置、魔法数字、环境键名) | UPPER_SNAKE_CASE |
DEFAULT_CANVAS_ZOOM、MAX_RETRY |
- 事件处理函数建议使用
handle前缀:handleNodeDragStart。 - 封装 HTTP 或仓库访问的函数建议使用 动词前缀:
get/fetch/query/update/delete。
- 禁止滥用
any。未知错误使用unknown,在分支内收窄类型后再使用。 - 对外边界(组件 Props、API 入参/出参、Agent 导出函数)必须有 显式类型(
interface/type)。 - 跨包契约(Web 调用的 DTO、API 暴露给前端的类型、Agent 导出给 API 的类型)优先 单独类型文件或 DTO 类,避免隐式结构。
块与块之间空一行,顺序如下:
- side-effect 导入(若有,如
reflect-metadata仅出现在 API 入口)。 - 外部依赖(
react、@nestjs/common、zustand等)。 - 内部别名路径(Web:
@/…)。 - 相对路径(同目录组件、样式、本地工具)。
import { useCallback, useState } from 'react'
import { Button, message } from 'antd'
import { useFlowStore } from '@/store/useFlowStore'
import { runTask } from '@/api/workflow'
import { Toolbar } from './Toolbar'
import styles from './workspace.module.css'- 单次提交聚焦单一主题,便于 Code Review。
- 不提交 密钥、Token、本机路径;敏感配置走环境变量(由后端或部署平台注入)。
- 合并前自检:
pnpm lint;涉及类型或构建链路的改动建议本地pnpm build。
技术栈:Vite + React 19 + TypeScript + React Router + Zustand + Ant Design + React Flow + Fabric.js + Axios(及项目已引入的其余依赖)。
| 路径 | 用途 |
|---|---|
src/pages/ |
页面级视图与业务组合 |
src/layouts/ |
布局壳层 |
src/router/ |
路由表与懒加载配置 |
src/store/ |
Zustand 全局状态 |
src/api/ |
对后端 HTTP 的封装(统一入口,避免在组件内散落裸 axios) |
src/assets/ |
静态资源 |
路径别名 @/* → src/*(见 vite.config.ts / tsconfig.app.json)。
推荐使用 React.FC<Props> 或显式标注返回类型,Props 使用 interface 或 type 声明。
import type { FC, ReactNode } from 'react'
interface WorkspaceProps {
taskId: string
children?: ReactNode
}
export const Workspace: FC<WorkspaceProps> = ({ taskId, children }) => {
// ...
}对有限状态集(如节点运行状态)可使用 enum 或 as const 对象,团队内需统一一种风格;若使用 enum,建议字符串枚举便于序列化。
export enum NodeStatus {
PENDING = 'PENDING',
RUNNING = 'RUNNING',
SUCCESS = 'SUCCESS',
FAILED = 'FAILED',
}- 禁止引入 Redux/Dva 等传统模式;全局状态放在
src/store/。 - Store 内可写异步逻辑,使用
async/await;错误需处理,避免吞异常。 - 从 Store 取状态时尽量 按字段 selector 订阅,减少无关重渲染。
- 使用
async/await,配合try / catch / finally;catch中参数类型为unknown,再判断instanceof Error或业务错误结构。 - 用户可见反馈使用 Ant Design
message/Modal等,与业务错误码约定一致。 - Vite 环境变量使用
import.meta.env.VITE_*,并在类型侧做窄化(如as string或 zod 校验)。
- 高频画布事件(拖拽、指针移动)不要直接驱动大范围 React
useState或整块 Zustand 更新,避免卡顿。- React Flow:节点/边数据可进 Zustand,但更新频率高的场景配合 防抖/节流 或局部
useRef。 - Fabric:实例挂在
useRef,与 React 树生命周期对齐(卸载时dispose)。
- React Flow:节点/边数据可进 Zustand,但更新频率高的场景配合 防抖/节流 或局部
- 右侧配置面板等使用 Ant Design
Form,在选中节点变化时setFieldsValue/resetFields,并配置rules做校验。
- 优先 CSS Modules(
*.module.css/*.module.less),避免全局污染。 - 禁止为裸标签写全局样式覆盖 Ant Design/React Flow 内部结构(除非经评审的极少数场景)。
- 声明式鉴权组件(示例):根据
useUserStore中的角色渲染子节点或null。 - 路由级守卫与登录重定向逻辑集中在
router/或与布局组合,避免在深层页面重复判断。
技术栈:NestJS 11 + TypeScript;数据与队列侧已规划 MongoDB(Mongoose)、Redis、BullMQ;向量检索 Pinecone 等由配置注入,不在代码库写死密钥。
| 层次 | 职责 |
|---|---|
*.controller.ts |
HTTP 路由、状态码、DTO 绑定;保持薄,不写复杂 Prompt 或长链路 LLM 逻辑。 |
*.service.ts |
业务编排、调用 Repository、队列、外部服务;可 import @brand-flow/agent 并调用其导出函数。 |
*.module.ts |
依赖装配与模块边界。 |
依赖在 package.json 中声明为 workspace:*。在 Service 中:
import { AGENT_VERSION } from '@brand-flow/agent'- 禁止在 Controller 内堆叠大段 Prompt 字符串;与模型相关的文本与链式逻辑放在
packages/agent。 - 运行时代码加载的是 Agent 的
main(编译产物dist);若本地仅改 Agent 源码,请执行pnpm --filter @brand-flow/agent build或根目录pnpm build。
- 使用 依赖注入,避免在 Service 内
new可注入的依赖。 - 异步方法返回
Promise<T>类型明确化;错误使用 Nest 内置HttpException子类或统一异常过滤器(若后续引入)。 - 配置项(数据库 URI、Redis、API Key)从
process.env或ConfigModule读取,禁止将生产密钥提交到 Git。
- DTO 与响应结构尽量 稳定、可版本化;破坏性变更需同步前端
src/api与类型定义。 - CORS、Cookie、鉴权头与 README 中约定保持一致。
技术栈以 LangChain.js 生态为主(具体依赖见 packages/agent/package.json);不包含 Nest / Express / React。
- 只做库:导出函数、Chain 工厂、Prompt 常量、类型等;不在此创建 HTTP 服务器。
- 不在此写与 MongoDB/Redis 强耦合的基础设施代码(由 API 注入客户端或配置后传入纯函数参数更佳)。
| 路径 | 用途 |
|---|---|
src/ai-logic/prompts/ |
Prompt 模板与系统提示文本 |
src/ai-logic/chains/ |
LangChain 链组装、工作流编排入口 |
src/ai-logic/evaluate/、src/ai-logic/memory/ |
评估与记忆扩展 |
src/brand/、src/generate/ |
品牌域、生成域业务分包 |
src/common/ |
跨模块常量与工具 |
src/index.ts |
对外稳定导出;新增导出需考虑 API 兼容性 |
- 优先 纯函数 与 小模块,便于单测。
- 与模型、向量库交互的 密钥与 endpoint 由调用方(API)注入,Agent 内不写死生产环境配置。
- 对外导出命名清晰,避免从
index.ts导出过多同名符号导致冲突。
apps/web/**/*.{ts,tsx}:浏览器全局 + React Hooks + React Refresh。apps/api/**/*.ts、packages/agent/**/*.ts:Node 全局,无 React Refresh。- 全仓启用 Prettier 推荐集成;与 ESLint 冲突规则由
eslint-config-prettier处理。
若某条规则在特殊场景下必须关闭,须在 PR 中说明理由,并尽量 局部 disable,禁止无注释大面积关闭。
- 仓库入口说明见 README.md。
- 本文件随架构与栈迭代 持续更新;新增全仓级约定时,请同步修改本节或对应章节并知会全员。
一致的风格是团队速度的放大器。请从下一个 PR 开始,把本规范当作默认肌肉记忆。 ✨