dootask/.cursor/rules/010-dootask-dev-process.mdc
2025-11-20 06:19:29 +00:00

89 lines
8.3 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
description: dootask 开发流程与代码结构约定controller + model + module + Vue2 + ./cmd
globs: []
alwaysApply: true
---
- **整体目标**
- 统一 dootask 项目的开发流程和代码结构约定,让后续协作、排障和重构更可预期。
- 为 Cursor 中的 AI 助手提供清晰的「在本仓库应该怎么查代码、怎么改代码、怎么跑命令」的行为规范。
- **一、在 Cursor 中处理需求的通用流程**
- 处理任何一个需求或问题时AI 助手应优先按下面的步骤行动:
1. **澄清问题与范围**从用户问题中提炼出是「Bug 修复」「新功能」「重构」还是「排查/文档」类任务大概会影响哪些模块如任务、项目、对话、WebSocket、报表等
2. **定位相关代码**:使用 `grep` / `codebase_search` / `read_file` 等工具,优先阅读路由、控制器、模型、模块,以及前端 `resources/assets/js` 下的相关页面或组件。
3. **设计修改方案**:在代码层面给出清晰的改动思路(改哪些文件、增加/修改哪些类和方法),必要时在回复中简单说明权衡点。
4. **实施改动并自检**:通过 `apply_patch` 修改代码,保持控制器+模型+模块结构清晰;需要运行命令时,统一通过 `./cmd ...`(如 `./cmd artisan ...`、`./cmd dev`、`./cmd build` 等),并使用 `read_lints` 等工具做基础检查。
5. **考虑长期沉淀**:对于「以后会反复遇到」的流程、约束或经验,可以再参考 `001-graphiti-mcp.mdc` 中的约定,选择性地写入 Graphiti`group_id: "dootask-main"`),但 Graphiti 不是每次任务的必选步骤。
- **二、后端代码结构约定Controller + Model + Module**
- **Controller控制器`app/Http/Controllers`**
- 负责:路由入口、参数接收与基础验证、调用对应的模型/模块、最终组装 API 响应。
- 原则:控制器内尽量保持「薄」,只做请求编排,不堆积复杂业务逻辑。
- 错误处理:业务异常优先使用 `App\Exceptions\ApiException` 抛出,由全局 Handler 统一转换成标准 JSON 响应。
- **Model模型`app/Models`**
- 负责数据表结构映射、关系定义relations、访问器/修改器、自定义查询 Scope 等「数据层」逻辑。
- 原则:避免在模型方法中塞入大量跨业务的流程控制逻辑,复杂业务应下沉到模块中。
- **Module模块`app/Module`**
- 负责:承载跨控制器、跨模型的业务逻辑,以及独立的功能子域。
- 适用场景示例:
- 外部服务集成:如 `AgoraIO/*`、`ZincSearch/*` 等第三方接口与搜索封装。
- 通用工具与能力:如 `Lock.php`(分布式锁)、`RandomColor.php`、`TextExtractor.php`、`Image.php` 等。
- 业务协作逻辑:项目/任务/对话等领域中,跨多个模型的复杂操作,可抽象为专门的模块方法。
- 原则:
- 新增较复杂的业务功能时,优先考虑创建/扩展 Module而不是在 Controller 或 Model 中堆砌流程。
- Module 尽量保持「单一职责」与「可复用」,命名上能直接反映其业务或能力作用。
- 与长期约定的联动:
- 对于关键 Module如权限相关、搜索相关、外部系统对接在设计上应尽量保持单一职责和清晰边界如需记录长期约定可参考 `001-graphiti-mcp.mdc` 使用 Graphiti 做补充说明。
- **运行环境Laravel + LaravelSSwoole**
- 本项目通过 LaravelS 将 Laravel 运行在 Swoole 常驻进程中,与传统「每请求重启框架」的 PHP-FPM 模式不同。
- 注意事项AI 在修改后端代码时需特别留意):
- 避免在静态属性、单例、全局变量中存储请求级状态或可变数据,防止请求间数据串联和内存泄漏。
- 不要假设构造函数、服务提供者或 `boot()` 方法会在每个请求重新执行;涉及配置、路由等的改动,通常需要通过 `./cmd php restart` 或容器重启后才能生效。
- 编写长连接、定时任务、WebSocket 等长生命周期逻辑时,优先复用现有模式(如 `Services`、`Module` 中的实现),并避免使用会长时间阻塞协程/事件循环的操作。
- **三、数据库与迁移约定**
- 表结构变更必须通过 Laravel migration 完成,禁止直接手工修改数据库结构。
- 与迁移相关的约定:
- 创建迁移文件和执行迁移时,优先使用容器内环境,通过 `./cmd artisan ...`(例如 `./cmd artisan make:migration ...`、`./cmd artisan migrate`)。
- 涉及核心表(项目、任务、对话、用户、权限等)的 schema 变更,应在代码注释、迁移命名和提交信息中尽量说明字段含义与兼容性考虑;如属于长期架构决策,可再结合 `001-graphiti-mcp.mdc` 选择性写入 Graphiti。
- **四、前端开发约定Vue2 + Vite**
- 主前端代码位于 `resources/assets/js`,基于 Vue2 实现单页应用,结构大致包括:
- `app.js`、`App.vue`:应用入口与根组件。
- `components/`:通用组件与业务组件(如任务看板、文件预览、聊天等)。
- `pages/`:页面级组件(登录、项目管理、任务视图、消息、报表等)。
- `store/`:全局状态管理。
- `routes.js`:路由配置。
- 构建与开发命令:
- 开发模式:使用 `./cmd dev` 或 `./cmd serve`,内部通过 Vite 启动开发服务器,并自动处理端口与调试模式。
- 生产构建:使用 `./cmd build` 或 `./cmd prod`,内部使用 `npx vite build` 产出前端静态资源。
- 与后端接口的协作:
- 接口调用默认通过 Vuex 的 `call` action 封装:在组件/页面中使用 `this.$store.dispatch("call", {...})` 发起请求;如需新增接口,优先在 `store/actions.js` 中扩展逻辑,而不是在组件中直接调用 `axios/fetch`。
- 错误提示、登录态失效、权限校验等跨页面行为,尽量复用已有的全局处理逻辑(如 `AIAssistant.vue`、消息通知组件、全局异常组件等);如形成稳定的新约定,可按需沉淀到文档或 Graphiti。
- **五、Electron 相关约定**
- 当前项目中 Electron 主要作为桌面入口壳,核心业务逻辑仍在 Web/Vue2 前端与 PHP/Laravel 后端。
- Electron 的构建与开发:
- 日常开发与调试优先使用 `./cmd electron ...`;仅在需要构建 App 端前端/安装包时,才使用 `./cmd appbuild`。
- 原则:
- 优先保证 Web 端行为正确,再通过 Electron 壳复用 Web 逻辑。
- 若未来扩展 Electron 专有功能(如本地文件访问、系统托盘等),应在代码与文档中说明边界;如属长期约束,可再结合 `001-graphiti-mcp.mdc` 写入 Graphiti。
- **六、命令行与开发工具统一通过 `./cmd`**
- 为了对齐 Docker 环境、避免本地环境差异,项目开发相关命令统一通过根目录的 `./cmd` 脚本执行,包括但不限于:
- 启动/停止服务:`./cmd up`、`./cmd down`、`./cmd restart`、`./cmd reup`。
- Laravel 工具:`./cmd artisan ...`(迁移、队列、任务、缓存等)。
- Composer`./cmd composer ...`。
- PHP 命令:`./cmd php ...`。
- 生成 API 文档:`./cmd doc`。
- 规则:
- 在项目文档、脚本示例和与 AI 的交流中,示例命令尽量使用 `./cmd ...` 形式,而不是直接调用 `php`、`composer`、`npm` 等,保持环境一致性。
- 如需对 `./cmd` 脚本进行较大调整(例如新增开发流程或重构子命令),应在提交信息或说明文档中写清动机和影响范围;如这是长期流程变更,可参考 `001-graphiti-mcp.mdc` 选择性写入 Graphiti。
- **七、与 Graphiti 的关系(简要说明)**
- 本规则文件的重点是「在 Cursor 中如何开发 dootask」Graphiti 作为「长期记忆」工具,仅在需要跨会话、跨任务复用的信息时才使用。
- 所有与 dootask 项目相关的 Graphiti 操作应使用 `group_id: "dootask-main"`,具体使用规范见 `001-graphiti-mcp.mdc`。
- 当 AI 判断某个流程/约束/事实值得长期记忆时,可结合 `001-graphiti-mcp.mdc` 中的说明,主动调用对应 MCP 工具进行写入。