# FTB 智能项目管理系统 FTB 是一个面向中小型研发团队的智能项目管理平台,核心目标是帮助产品/项目经理在一个页面判断:**开发完了吗 → 验收过了吗 → 还有多少 Bug → 能不能发布**。 系统核心层级: ```text 产品 Product → 项目 Project → 版本 Version → 需求 / 开发任务 / 测试用例 / Bug ``` 当前项目已经进入 **V2.1 服务端持久化阶段**:前端仍保留现有 Zustand store 数据形状,但业务主数据已切到 NestJS + PostgreSQL `app_data` 文档表,浏览器只保留登录会话。 ## 开始前必读 新会话或新开发任务开始前,先读这 4 份项目文档,避免重复讨论已确定方案: - `docs/architecture.md`:整体架构、心智模型、关键设计原则 - `docs/decisions.md`:关键设计决策记录,以及为什么这么做 - `docs/workflow.md`:工作流程、协作偏好、命名规范 - `docs/roadmap.md`:V1/V2/V3 路线图和已完成清单 ## 核心心智模型 FTB 把需求、执行和质量三条线分开: | 维度 | 核心实体 | 说明 | |------|----------|------| | 语义线 Why | Requirement | 解释为什么做、功能范围是什么,不直接驱动流程 | | 执行线 How | Version / DevTask / VersionPlan | 版本是执行主线,任务和计划归属版本 | | 质量线 Quality | TestCase / Bug | 测试用例和 Bug 挂在版本上形成验收闭环 | 关键原则: - 进度由状态和估时派生,不手填百分比。 - 跨模块联动放在纯函数引擎层,例如 `linkage-engine.ts`、`workspace-engine.ts`。 - DevTask 的 `submitted` 是开发终态,后续验收失败通过 Bug 流转。 - TestCase 和 Bug 主归属版本,需求只是可选语义标签。 - AI 只能写入带 `aiDraft: true` 的草案,用户编辑后才转正。 ## 技术栈 | 层级 | 技术 | 说明 | |------|------|------| | 前端 | Next.js 14 + React 18 + TypeScript | App Router,管理后台以客户端组件为主 | | UI | Tailwind CSS + Shadcn/ui 风格组件 | 紧凑信息密度,适合项目管理场景 | | 状态 | Zustand | 每个业务域一个 store | | 后端 | NestJS + Prisma | REST API、AppData 文档层、AI 配置和 AI 网关 | | 数据库 | PostgreSQL | 当前主用 `app_data` JSONB,后续逐步关系化 | | 缓存/实时预留 | Redis | 本地通过 Docker Compose 启动 | | AI | Anthropic / OpenAI 格式 Provider | 支持官方和中转站配置 | | 工程化 | pnpm workspace + Turborepo | Monorepo 任务编排 | ## 环境要求 | 工具 | 版本 | 说明 | |------|------|------| | Node.js | >= 18.x | 推荐 20.x LTS,后端会优先使用 Node 20 的 `.env` 加载能力 | | pnpm | 9.4.0 | 仓库锁定的包管理器版本 | | Docker | 可选 | 用于本地启动 PostgreSQL 和 Redis | | PostgreSQL | >= 15 | Docker Compose 默认使用 PostgreSQL 16 | | Redis | >= 7 | 预留给缓存和实时能力 | ## 快速开始 ```bash # 1. 安装依赖 pnpm install # 2. 准备后端环境变量 cp apps/server/.env.example apps/server/.env # 3. 启动 PostgreSQL + Redis docker-compose up -d # 4. 创建/同步数据库结构 pnpm db:migrate # 5. 启动前端 + 后端 pnpm dev ``` 启动后访问: - 前端:`http://localhost:3000` - 后端:`http://localhost:3001/api/v1` - AI 配置探测端点:`http://localhost:3001/api/v1/config/ai` 如果只想单独启动某一端: ```bash pnpm dev --filter=web pnpm dev --filter=server ``` ## 常用命令 ```bash # 全量开发 pnpm dev # 构建 pnpm build # 类型检查 pnpm type-check # 测试 pnpm test # ESLint pnpm lint # Prisma pnpm db:migrate pnpm db:seed pnpm db:studio # 本地基础服务 docker-compose up -d docker-compose down ``` ## 生产部署 仓库已内置本地服务器和云服务器生产部署基线: - `Dockerfile.web`:构建并运行 Next.js 前端。 - `Dockerfile.server`:构建并运行 NestJS 后端,包含 Prisma Client 生成。 - `docker-compose.prod.yml`:编排 Web、Server、PostgreSQL、Redis、Nginx。 - `docker-compose.local.yml`:本机/局域网全栈部署,默认 `http://localhost:8080`。 - `.env.production.example`:生产环境变量模板。 - `.env.local-server.example`:本地服务器环境变量模板。 - `deploy/nginx/default.conf.template`:同域反向代理,`/api/` 转发到后端,其余转发到前端。 - `docs/deployment.md`:完整部署、升级、备份和排查流程。 本地服务器快速入口: ```bash cp .env.local-server.example .env.local-server pnpm deploy:verify pnpm deploy:local:build pnpm deploy:local:up docker compose --env-file .env.local-server -f docker-compose.local.yml exec server pnpm --filter server db:deploy ``` 云服务器快速入口: ```bash cp .env.production.example .env.production pnpm deploy:verify docker compose --env-file .env.production -f docker-compose.prod.yml build docker compose --env-file .env.production -f docker-compose.prod.yml up -d docker compose --env-file .env.production -f docker-compose.prod.yml exec server pnpm --filter server db:deploy ``` ## 项目结构 ```text ftb-project-management/ ├── apps/ │ ├── web/ # Next.js 前端 │ │ ├── app/ # 页面路由 │ │ │ ├── products/ # 产品列表和详情 │ │ │ ├── projects/ # 项目列表和详情 │ │ │ ├── versions/ # 版本列表和详情 │ │ │ ├── requirements/ # 需求池 │ │ │ ├── workspace/ # 与我相关工作台 │ │ │ ├── xiaobao-warning/ # 小宝预警 │ │ │ └── admin/ # 成员、角色、任务类型、AI 配置 │ │ ├── components/ # 业务组件和通用组件 │ │ ├── lib/ # 规则引擎、派生计算、API 封装 │ │ └── stores/ # Zustand stores │ └── server/ # NestJS 后端 │ ├── src/modules/data/ # AppData 文档层:GET/PUT /api/v1/data/:key │ ├── src/modules/ai/ # AI 网关、拆解、风险解读 │ ├── src/modules/config/ # AI Provider 配置 │ └── prisma/ # Prisma Schema ├── packages/ │ └── shared/ # 前后端共享类型 ├── docs/ # 架构、决策、流程、路线图 ├── docker-compose.yml # PostgreSQL + Redis ├── pnpm-workspace.yaml └── turbo.json ``` ## 功能模块 | 模块 | 路径 | 当前状态 | |------|------|----------| | 产品管理 | `/products` | 已实现 | | 项目管理 | `/projects` | 已实现,项目详情联动版本状态 | | 版本管理 | `/versions` | 已实现,承载计划、开发、测试、Bug 和发布风险 | | 需求池 | `/requirements` | 已实现,需求作为语义层和版本可选分组 | | 与我相关 | `/workspace` | 已实现,聚合个人计划、任务、测试、Bug、日报 | | 小宝预警 | `/xiaobao-warning` | 已实现首版,规则优先、AI 只做解释 | | 加班记录 | `/overtime` | 已实现 | | 成员/角色 | `/admin/members`、`/admin/roles` | 已实现 | | 任务类型 | `/admin/categories` | 已实现,使用稳定语义码对接 AI | | AI 配置 | `/admin/ai-config` | 已实现,支持多 Provider 配置 | ## 数据持久化 当前阶段使用服务端通用文档层: - 后端接口:`GET/PUT /api/v1/data/:key` - 数据库表:Prisma `AppData`,映射到 PostgreSQL `app_data` - 前端读写:`apps/web/lib/server-data.ts` - 浏览器存储:只保留登录态,不作为业务数据主存储 已纳入 AppData 的 key: ```text products-overview requirements version-plans dev-tasks test-cases bugs members task-categories task-worklogs work-activities xiaobao-risk-insights xiaobao-risk-snapshots xiaobao-warning-views overtime ``` 后续 V2.2 会把稳定的数据形状逐步拆成关系表和领域 CRUD API。拆表前不要恢复业务 localStorage 缓存,避免多端数据分叉。 ## AI 与小宝预警 AI 能力当前以 NestJS 后端为入口: - AI Provider 配置在 `/admin/ai-config` 管理,服务端落盘到 `apps/server/data/ai-config.json`,环境变量 `ANTHROPIC_API_KEY` 作为兜底。 - Prototype Decompose Agent 面向“产品方案原型 → 开发任务 / 测试用例草案”场景,所有写入必须带 `aiDraft: true` 和 `references[]`。 - 小宝预警先由规则引擎计算风险分、趋势、静默风险、预测发版日和置信度;AI 只解释规则结果,不改写业务数据。 相关实现入口: - `apps/server/src/modules/ai/` - `apps/web/lib/ai-decompose-*` - `apps/web/lib/xiaobao-risk-*` - `apps/web/components/version/AiDecomposeButton.tsx` - `apps/web/components/xiaobao-warning/` ## 开发约定 - 新增跨模块联动时,优先放到 `*-engine.ts` 或纯函数 helper,不在页面组件里散写规则。 - 新增状态流转或完成条件时,优先建立 workflow helper。 - 新增 AppData key 时,同时更新后端 `data-keys.ts` 和前端 `server-data.ts`。 - 时间字段使用 ISO 时间戳;展示时统一格式化。 - Commit 使用中文,格式:`类型(模块): 描述`,例如 `feat(版本): 增加小宝预警入口`。 - 用户没有明确要求时不要自动 push。 ## 验证建议 改动后至少运行: ```bash pnpm type-check ``` 涉及服务端数据持久化时额外运行: ```bash pnpm --filter server exec prisma validate --schema prisma/schema.prisma ``` 涉及 UI 页面时,确保对应页面能返回 200,例如: ```bash curl http://localhost:3000/workspace ```