9 lines
18 KiB
JSON
9 lines
18 KiB
JSON
{"role":"user","message":{"content":[{"type":"text","text":"<timestamp>Friday, May 15, 2026, 10:49 AM (UTC+8)</timestamp>\n<user_query>\n完善rules/layers-and-delivery.mdc文件里面的内容\n</user_query>"}]}}
|
||
{"role":"assistant","message":{"content":[{"type":"text","text":"我会先读取现有的规则文件和对应的 `create-rule` 技能说明,确认当前结构后直接帮你补全成可执行、可落地的版本。随后我会在原文件上修改并给你看改进点。"},{"type":"tool_use","name":"ReadFile","input":{"path":"/Users/ray/.cursor/skills-cursor/create-rule/SKILL.md"}},{"type":"tool_use","name":"ReadFile","input":{"path":"/Users/ray/Documents/project/www/ray/slot-pwa/.cursor/rules/layers-and-delivery.mdc"}}]}}
|
||
{"role":"assistant","message":{"content":[{"type":"tool_use","name":"ReadFile","input":{"path":"/Users/ray/Documents/project/www/ray/slot-pwa/.cursor/rules/layers-and-delivery.mdc","offset":90,"limit":120}}]}}
|
||
{"role":"assistant","message":{"content":[{"type":"text","text":"我已经定位到文件在第 14 节末尾中断了(示例命令未补全)。下一步我会直接补齐缺失部分,并顺手把整份规则整理成“可执行检查清单 + 交付闭环”风格,避免只写原则不落地。"},{"type":"tool_use","name":"ApplyPatch","input":"*** Begin Patch\n*** Update File: /Users/ray/Documents/project/www/ray/slot-pwa/.cursor/rules/layers-and-delivery.mdc\n@@\n ---\n description: 企业生产开发规范 — 分层、路由、返回、SDK、禁止项(团队统一 Webman 口径)\n alwaysApply: true\n ---\n \n # 企业生产开发规范\n \n-> 各服务基于**同一套 Webman 架构与团队规范**实现;动代码前先读 [README.md](README.md) 。\n+> 各服务基于同一套 Webman 架构与团队规范实现。动代码前先读 `README.md`,并以本规则作为实现与评审基线。\n \n ## 1. 本仓库职责边界\n \n-跨服务能力优先 **slot-foundation** / **slot_sdk**。\n+跨服务能力优先复用 `slot-foundation` / `slot_sdk`,本仓库只承接业务编排与落地。\n \n ## 2. 目录与路由\n \n-- 当前以 **`app/api`** 为主(Controller / Logic / dto / validator);另有 `app/command`、`app/process`、`app/service`、`app/model`、`app/entity`、`app/middleware`。\n-- **Webman 自动路由**:按框架约定命名 Controller/方法。**禁止**在 `config/route.php` 堆日常业务路由;**禁止**把「自动路由 + 手写业务路由」当常态(本仓库 `config/route.php` 应保持非业务路由用途)。\n-- **若未来拆分 `innerapi` / `admin`**:禁止跨应用互相调用对方 **Controller**;公共能力下沉 **Service / Model / functions.php**。\n+- 当前以 `app/api` 为主(`Controller` / `Logic` / `dto` / `validator`),另有 `app/command`、`app/process`、`app/service`、`app/model`、`app/entity`、`app/middleware`。\n+- 使用 Webman 自动路由:按框架约定命名 Controller/方法。\n+- 禁止在 `config/route.php` 堆日常业务路由;禁止把“自动路由 + 手写业务路由”当常态。\n+- `config/route.php` 保持非业务路由用途。\n+- 若未来拆分 `innerapi` / `admin`:禁止跨应用调用对方 Controller,公共能力下沉到 Service / Model / `functions.php`。\n \n ## 3. 分层调用链(标准)\n \n ```text\n Controller -> Validate -> DTO -> Logic -> Model\n Controller -> Validate -> DTO -> Logic -> Service -> Model\n ```\n \n-| 分层 | 职责 |\n-| --- | --- |\n-| **Controller** | 收参;调 Validate;组 DTO;调 Logic/Service;**统一返回** |\n-| **Validate** | 必填、类型、长度、枚举、结构;**禁止**塞进 DTO |\n-| **DTO** | 承载**已校验**入参;轻量整理;**禁止**查库、**禁止**做合法性判断 |\n-| **Logic** | 用例编排、**事务**;简单可调 Model;复杂调 Service;**查询条件下沉 Model** |\n-| **Service** | 可复用能力(center、sdk、公共计算);**不是**每张表一个无意义 Service |\n-| **Model** | 读写、scope、关联;**禁止**依赖 Request、**禁止**调 Service/Logic |\n+- `Controller`:收参、调用 Validate、组装 DTO、调用 Logic/Service、统一返回。\n+- `Validate`:处理必填、类型、长度、枚举、结构校验,禁止塞进 DTO。\n+- `DTO`:仅承载“已校验”入参并做轻量整理,禁止查库、禁止合法性判断。\n+- `Logic`:负责用例编排与事务,简单场景可直连 Model,复杂场景调用 Service;查询条件下沉 Model。\n+- `Service`:承载可复用能力(center、sdk、公共计算),不是“一表一空壳 Service”。\n+- `Model`:负责读写、scope、关联;禁止依赖 Request,禁止反调 Service/Logic。\n \n-**Controller 禁止**:复杂业务、事务、多表流程、复杂 SQL、第三方 HTTP、手写多套 JSON。**Service 禁止**:返回 HTTP Response、读 Request、请求级状态、仅包一层无复用 CRUD。\n+Controller 禁止:复杂业务、事务、多表流程、复杂 SQL、第三方 HTTP、手写多套 JSON。 \n+Service 禁止:返回 HTTP Response、读取 Request、持有请求级状态、仅包一层且无复用价值的 CRUD。\n \n ## 4. innerapi(若本仓库存在或新增)\n \n-高安全:统一 Validate、**trace_id**、幂等意识、关键日志、**固定字段**响应(利 SDK)。禁止公网裸奔、无鉴权、同一接口不同分支字段集不一致。Logic 已记错时优先 **统一失败结构**,避免再抛裸 `RuntimeException` 破坏调用方。\n+高安全接口必须满足:统一 Validate、`trace_id`、幂等意识、关键日志、固定字段响应(便于 SDK 消费)。 \n+禁止公网裸奔、无鉴权、同一接口在不同分支返回不同字段集。 \n+Logic 已记录错误时优先返回统一失败结构,避免抛裸 `RuntimeException` 破坏调用方。\n \n ## 5. 统一 HTTP 返回\n \n-- **团队统一约定**:优先 `Slot\\Foundation\\Tools\\Http\\HttpResponse` + `Slot\\Foundation\\Constants\\ErrorCode`(成功 `ok`、失败 `error`),错误码优先复用 foundation。\n-- **未全面切换 foundation 前**:若仍用 `OutputService` 等封装,**对内**保持单一成功/失败语义,**禁止**同一仓库混用多套 `code/msg/data` 形状;升级 foundation 时再整体切换(见 [README.md](README.md) **第 18 节**与工程全文)。\n+- 团队统一约定:优先 `Slot\\Foundation\\Tools\\Http\\HttpResponse` + `Slot\\Foundation\\Constants\\ErrorCode`(成功 `ok`、失败 `error`)。\n+- 错误码优先复用 foundation,禁止业务侧自造重复码段。\n+- 未全面切换 foundation 前,若仍用 `OutputService` 等封装,对内保持单一成功/失败语义。\n+- 禁止同一仓库混用多套 `code/msg/data` 形状;升级 foundation 时做整体切换。\n \n ## 6. 常量 / Model JSON / PHPDoc\n \n-- **跨服务常量**:进 **slot-foundation** → commit → push → 本仓 `composer update`;禁止魔法数字散落在 Logic/Controller。\n-- **库表 JSON 列**:用 ORM 能力消费;Logic 中按结构化数据使用;**禁止**手 `json_decode`;查询优先 `whereJsonContains` 等,**禁止**退化成无索引 `like`。\n-- **新增或修改的 public/protected/private 方法必须写 PHPDoc**(职责、参数、返回值、异常)。对外 **api** 接口可在 Controller PHPDoc 写路由、头、体、`data` 形状与常见错误码(与 README 编码/接口章节一致)。\n+- 跨服务常量:进入 `slot-foundation` -> commit -> push -> 本仓 `composer update`,禁止魔法数字散落在 Logic/Controller。\n+- 库表 JSON 列:优先 ORM 能力,Logic 按结构化数据使用;禁止手写 `json_decode`。\n+- JSON 查询优先 `whereJsonContains` 等能力,禁止退化成无索引 `like`。\n+- 新增或修改的 `public/protected/private` 方法必须写 PHPDoc(职责、参数、返回值、异常)。\n+- 对外 API 建议在 Controller PHPDoc 中写明路由、请求头、请求体、`data` 形状与常见错误码。\n \n ## 7. ShareConfig / Center\n \n-共享配置经 **Service 封装**(如 `ShareConfigService`):校验 `centerApiHost` / `server_name` 等,加载成功再标记可用;**禁止静默吞掉** center 异常。\n+共享配置通过 Service 封装(如 `ShareConfigService`):校验 `centerApiHost` / `server_name` 等,加载成功后再标记可用;禁止静默吞掉 center 异常。\n \n ## 8. slot_sdk\n \n-- 能力已在 **slot_sdk** 的,**优先 SDK**,禁止业务里重复拼 HTTP。\n-- 需给其他服务复用的接口:在 **slot_sdk** 增加 Client/封装 → commit → push → 本仓 `composer update`。\n-- **禁止**只改本地 `vendor` 或软链接当已交付。\n+- 能力已在 `slot_sdk` 的,优先 SDK,禁止业务里重复拼 HTTP。\n+- 需给其他服务复用的接口:在 `slot_sdk` 增加 Client/封装 -> commit -> push -> 本仓 `composer update`。\n+- 禁止只改本地 `vendor` 或软链接后声称“已交付”。\n \n ## 9. 跨仓库协作与发布\n \n-- 改 **slot-foundation** / **slot_sdk**:先在对应仓库提交并推送远程,再回本仓库执行 `composer update`,确认 **composer.lock** 指向新提交。\n-- **reload**:普通业务代码。**restart**:装包、改 `autoload.files`、`config/server.php`、`config/process.php`、新增自定义进程等。\n+- 改 `slot-foundation` / `slot_sdk`:先在对应仓库提交并推送远程,再回本仓执行 `composer update`,确认 `composer.lock` 指向新提交。\n+- `reload`:普通业务代码变更。\n+- `restart`:装包、改 `autoload.files`、`config/server.php`、`config/process.php`、新增自定义进程等。\n \n ## 10. 实体与业务数据传递\n \n-- 固定形状业务数据优先 **Entity**(`extends app\\entity\\BaseEntity`),目录 `app/entity/{业务域}/`。\n-- `new XxxEntity(['camelCase' => $v, ...])` 与 **public 属性驼峰一致**;属性注释写明含义、单位、与库/接口字段对应。\n-- **非** HTTP 响应体不要放 `app/api/dto/response`。落库 JSON 可在**落库前**由实体组装数组,禁止整条链用无约定关联数组冒充类型。\n+- 固定形状业务数据优先 Entity(`extends app\\entity\\BaseEntity`),目录 `app/entity/{业务域}/`。\n+- `new XxxEntity(['camelCase' => $v, ...])` 与 public 属性驼峰一致;属性注释写明含义、单位、与库/接口字段对应关系。\n+- 非 HTTP 响应体不要放 `app/api/dto/response`。\n+- 落库 JSON 可在落库前由实体组装数组,禁止整条链路使用无约定关联数组冒充类型。\n \n ## 11. 禁止清单(摘要)\n \n-手写业务路由堆 `route.php`;Controller 写复杂业务/事务;Validate 或 DTO 查库;DTO 做合法性校验;Logic 堆 SQL 不下沉 Model;Model 调 Service/Logic;手写零散 json 响应且与统一封装混用;Logic 对 JSON 字段 `json_decode`;JSON 查询滥用 `like`;新方法无 PHPDoc;跨服务常量不写 foundation;改 sdk/foundation 不提交不推送;innerapi 结构不统一;生产开 debug / 暴露 `.env`。\n+- 手写业务路由堆 `route.php`。\n+- Controller 写复杂业务或事务。\n+- Validate/DTO 查库,DTO 做合法性判断。\n+- Logic 堆 SQL 且不下沉 Model;Model 反调 Service/Logic。\n+- 手写零散 JSON 响应并与统一封装混用。\n+- Logic 对 JSON 字段手写 `json_decode`;JSON 查询滥用 `like`。\n+- 新方法不写 PHPDoc。\n+- 跨服务常量不进 foundation;改 SDK/foundation 不提交不推送。\n+- `innerapi` 返回结构不统一。\n+- 生产开启 debug 或暴露 `.env`。\n \n ## 12. AI 协作执行顺序\n \n-1. 读 [README.md](README.md)、本仓库业务文档(若有)与同目录 `.mdc` 规则。 \n-2. 固定形状用 **Entity**;能复用 **foundation / sdk** 则复用。 \n-3. 参数 **先 Validate**;查询 **下沉 Model**;返回走 **统一 HttpResponse(或当前统一的 Output 封装)**。 \n-4. 新方法 **PHPDoc**;跨仓改动 **commit → push → composer update** 闭环。\n+1. 读 `README.md`、本仓业务文档(若有)与同目录 `.mdc` 规则。 \n+2. 固定形状数据优先 Entity;可复用 foundation / SDK 时禁止重复造轮子。 \n+3. 参数先 Validate;查询下沉 Model;返回走统一 HttpResponse(或当前统一 Output 封装)。 \n+4. 新方法补 PHPDoc;跨仓改动按 commit -> push -> composer update 完成闭环。 \n+5. 变更后执行最小必要验证,再交付结论与风险说明。\n \n ## 13. 文档与评审\n \n-需求与高风险修复:`doc/` 留痕。分层/返回/SDK/实体约定变更时同步 **README**。资金类 PR 另按 PRD 与资金安全规则做账正确性复核。\n+需求与高风险修复应在 `doc/` 留痕。 \n+分层/返回/SDK/实体约定变更时同步更新 `README.md`。 \n+资金类 PR 需按 PRD 与资金安全规则做账正确性复核。\n \n ## 14. 本地与 Docker(Agent 执行命令)\n \n-- **Compose 工程目录**(在该目录执行 `docker compose`):`/Users/ray/Documents/project/docker`;编排文件见其中 `docker-compose.yml`。\n-- **PHP 运行容器**:服务名 **`php82`**(`container_name: php82`)。\n-- **卷挂载**:宿主机 **`/Users/ray/Documents/project`** → 容器 **`/app`**;。\n-- **示例**(语法检查;文件路径按实际替换):\n+- Compose 工程目录(在该目录执行 `docker compose`):`/Users/ray/Documents/project/docker`(编排文件为 `docker-compose.yml`)。\n+- PHP 运行容器:服务名 `php82`(`container_name: php82`)。\n+- 卷挂载:宿主机 `/Users/ray/Documents/project` -> 容器 `/app`。\n+- 示例命令(文件路径按实际替换):\n+ - `docker compose exec php82 php -l /app/www/ray/slot-pwa/app/api/controller/DemoController.php`\n+ - `docker compose exec php82 php -l /app/www/ray/slot-pwa/app/api/logic/DemoLogic.php`\n+ - `docker compose exec php82 php /app/www/ray/slot-pwa/webman status`\n+\n+## 15. 交付 Definition of Done(DoD)\n+\n+一次任务在满足以下条件后才算完成:\n+\n+- 分层符合本规则(Controller/Validate/DTO/Logic/Service/Model 职责未越界)。\n+- 返回结构统一(成功/失败语义一致,错误码可追溯)。\n+- 新增或修改方法已补 PHPDoc。\n+- 涉及跨仓改动时,foundation/SDK 已完成 commit + push,本仓 `composer.lock` 已更新。\n+- 至少完成与本次改动对应的最小验证(语法、关键流程、必要日志)。\n+- 输出交付说明:改了什么、为什么改、如何验证、仍存风险。\n*** End Patch\n"}]}}
|
||
{"role":"assistant","message":{"content":[{"type":"tool_use","name":"ReadFile","input":{"path":"/Users/ray/Documents/project/www/ray/slot-pwa/.cursor/rules/layers-and-delivery.mdc"}}]}}
|
||
{"role":"assistant","message":{"content":[{"type":"text","text":"已完善 `/.cursor/rules/layers-and-delivery.mdc`,主要做了这些增强:\n\n- 补齐了原文件中断的内容(第 14 节 Docker 命令示例不再留空)。\n- 将“原则描述”改成更可执行的规则语句,减少歧义(尤其是分层职责、禁止项、返回规范)。\n- 把分层职责从表格改成清晰条目,便于 Agent 直接按条执行。\n- 强化了跨仓协作闭环(`foundation/sdk -> commit -> push -> composer update`)和发布动作边界(`reload/restart`)。\n- 新增了 `Definition of Done`(第 15 节),把“完成标准”明确成检查清单,方便评审和交付统一口径。\n- 统一了文案表达和符号风格,清理了原文里的断句、重复和小错误。\n\n如果你愿意,我可以再给这份规则加一版“严格模式”(比如:未满足 DoD 任一项时,Agent 必须先补齐再结束任务)。"}]}}
|
||
{"role":"user","message":{"content":[{"type":"text","text":"<timestamp>Friday, May 15, 2026, 10:54 AM (UTC+8)</timestamp>\n<user_query>\n我家里和公司电脑的docker-compose.yml文件位置是一样的。项目的路径不一定一样。AI本身应该是知道项目位置的,因此“”“- 示例命令(文件路径按实际替换):”“”这里不用写死位置\n</user_query>"}]}}
|
||
{"role":"assistant","message":{"content":[{"type":"text","text":"明白,这里确实不该写死项目绝对路径。 \n我会把示例改成基于“当前工作区项目路径”的写法,只保留容器内统一挂载前缀 `/app`,这样两台电脑都能直接套用。"},{"type":"tool_use","name":"ApplyPatch","input":"*** Begin Patch\n*** Update File: /Users/ray/Documents/project/www/ray/slot-pwa/.cursor/rules/layers-and-delivery.mdc\n@@\n - Compose 工程目录(在该目录执行 `docker compose`):`/Users/ray/Documents/project/docker`(编排文件为 `docker-compose.yml`)。\n - PHP 运行容器:服务名 `php82`(`container_name: php82`)。\n - 卷挂载:宿主机 `/Users/ray/Documents/project` -> 容器 `/app`。\n-- 示例命令(文件路径按实际替换):\n- - `docker compose exec php82 php -l /app/www/ray/slot-pwa/app/api/controller/DemoController.php`\n- - `docker compose exec php82 php -l /app/www/ray/slot-pwa/app/api/logic/DemoLogic.php`\n- - `docker compose exec php82 php /app/www/ray/slot-pwa/webman status`\n+- 示例命令(不要写死项目绝对路径,按“当前工作区项目路径”自动换算):\n+ - `docker compose exec php82 php -l /app/<当前项目相对路径>/app/api/controller/DemoController.php`\n+ - `docker compose exec php82 php -l /app/<当前项目相对路径>/app/api/logic/DemoLogic.php`\n+ - `docker compose exec php82 php /app/<当前项目相对路径>/webman status`\n*** End Patch\n"}]}}
|
||
{"role":"assistant","message":{"content":[{"type":"text","text":"已按你的要求改好,不再写死项目路径。\n\n更新内容在 `/.cursor/rules/layers-and-delivery.mdc` 的第 14 节:\n\n- 保留 `docker-compose.yml` 固定位置说明(家里/公司一致)。\n- 示例命令改为使用占位:`/app/<当前项目相对路径>/...`。\n- 明确强调“按当前工作区项目路径自动换算”,避免机器间路径差异导致误导。\n\n如果你希望,我还可以再改成更“可直接复制执行”的版本(例如统一用一个变量如 `PROJECT_IN_DOCKER` 表示路径)。"}]}} |