Files
cursor/plans/slot_硬规则落地_2bb799e2.plan.md
ray zhou f71a5c59af ok
2026-05-29 11:21:40 +08:00

7.5 KiB
Raw Permalink Blame History

name, overview, todos, isProject
name overview todos isProject
Slot 硬规则落地 在用户级 `~/.cursor` 强化分层/PHPDoc 规则为可执行 checklist并新增 Cursor Hooks拦截宿主机 php/composer、在 Agent 结束前自动跑仓库校验脚本,未通过则注入 follow-up 要求继续修复。
id content status
hooks-scripts 新建 ~/.cursor/hooks.json、block-host-php.sh、verify-slot-backend.sh 并 chmod +x completed
id content status
rules-mdc 扩展 backend-layering.mdcphp-doc alwaysApply新增 agent-completion-gate.mdc completed
id content status
plan-dod 每日返水 plan 追加 Definition of Done与脚本检查项一致 completed
id content status
verify-hooks 手动验证:宿主机 php 拦截、docker php 放行、verify 脚本 PASS/FAIL in_progress
false

Slot 后端硬规则落地

目标

把当前「软约束」升级为三层:

层级 手段 效果
上下文 规则 alwaysApply + 完成前 MUST 每条对话强制可见
行为 Agent 必须跑校验脚本并贴输出 可审计、可复查
机器 Cursor Hooks failClosed 违反则阻断或自动续跑修复

不依赖各 slot 仓库已有 CI目前无 .github/workflows、无 pre-commit先落在用户级 ~/.cursor,对你当前多根工作区(slot_consolebackend/slot_admin 等)全部生效。

1. 强化 Cursor Rules~/.cursor/rules/

1.1 扩展 backend-layering.mdc

在文末新增 「Agent 完成前 MUST」(短、可验证):

  • 重命名/删除类:对本次 diff 中删除的 *.php,提取类名,在 ~/Documents/project/www/slotrg 引用数为 0
  • 新建/大改 app/api/controller/*:必须 extends \slotLib\basic\BaseController,构造注入对应 *Logic + *Validator;参照 FreeCreditsController.php
  • 禁止 Logic 型 Service:不得新建以单业务用例编排为主、仅转发 Model/Logic 的 app/service/*ServiceDailyRebateCalcService 这类公共计算除外)。
  • 声称完成前:必须执行 ~/.cursor/hooks/verify-slot-backend.sh,在最终回复粘贴脚本输出(PASSFAIL 明细)。

1.2 调整 php-doc.mdc

  • alwaysApply: falsealwaysApply: true
  • 在「Agent 执行要求」增加:最终回复必须含一行 PHPDoc: checked 或列出例外文件

与 layering 规则叠加后PHPDoc 不再因 glob 未命中而漏掉。

1.3 新增 agent-completion-gate.mdc

alwaysApply: true,仅 1520 行,避免与 layering 重复:

  • 引用校验脚本路径与 Hooks 行为
  • 禁止在未跑脚本前写「已完成 / 可以合并」
  • 多仓库任务:脚本会扫描 slot_*backend 下有 git 的目录

2. Cursor Hooks用户级真正「硬」

新建:

flowchart TD
  shell[Agent_Shell_command]
  blockHook[block-host-php.sh]
  edit[PHP_file_edits]
  stop[Agent_stop]
  verify[verify-slot-backend.sh]
  shell --> blockHook
  blockHook -->|deny_naked_php_composer| block[permission_deny]
  blockHook -->|docker_exec| allow[permission_allow]
  stop --> verify
  verify -->|FAIL| followup[followup_message_continue_fix]
  verify -->|PASS| done[session_ends]

2.1 beforeShellExecution — 落实 dev-environment.mdc

block-host-php.shfailClosed: true

  • 若命令以 php / composer 开头且不包含 docker execpermission: deny
  • 允许:docker exec ... phpdocker exec ... composer
  • 其它命令 → allow

这样宿主机误跑 PHP 会被 Hook 直接拦住,不依赖模型记忆。

2.2 stop — 分层与调用方收尾

verify-slot-backend.shfailClosed: false,失败时返回 followup_message 让 Agent 继续改):

扫描根目录:/Users/ray/Documents/project/www/slot 下各子仓库(存在 .gitslot_*backend

检查 逻辑
删除类无残留引用 git diff --diff-filter=D --name-only 的 PHP → 解析 class Xrg '\bX\b' 全 slot 根,非 0 则 FAIL
API Controller 结构 git diff --name-only 命中 app/api/controller/*.php → 文件须含 extends \slotLib\basic\BaseController(无则 FAIL除非文件头有 @layering-exempt
禁止符号回归 内置 banlist首项 DailyRebateServicerg 命中即 FAIL
可选轻量 PHPDoc 对 diff 中新增的 public function,上一行非 /** 则 WARN不阻断避免历史债

输出格式固定:

=== verify-slot-backend ===
PASS

FAIL + 逐条原因;stop hook 解析到 FAIL 时返回 followup_message:「校验未通过,按明细修复后重跑脚本」。

脚本依赖:bashgitrg(你本机已有);不依赖 jq(用 grep/sed 解析 stdin降低 hook 环境差异)。

2.3 hooks.json 草案

{
  "version": 1,
  "hooks": {
    "beforeShellExecution": [
      {
        "command": "./hooks/block-host-php.sh",
        "matcher": "^\\s*(php|composer)\\b",
        "failClosed": true
      }
    ],
    "stop": [
      {
        "command": "./hooks/verify-slot-backend.sh",
        "failClosed": false
      }
    ]
  }
}

路径相对 ~/.cursor/(用户 hook 约定)。创建后 chmod +x 两个脚本。

验证步骤(实施后手动测一次):

  1. Agent 尝试 php -v → 应被拦截
  2. docker exec ... php -v → 应放行
  3. 故意留 DailyRebateService 引用 → stop 应触发 follow-up

3. 每日返水 Plan 补 DoD可选与硬规则对齐

每日返水活动化改造_dd1575a1.plan.md 末尾加 Definition of Done 小节(与脚本检查项一致),便于人工对照:

  • rg DailyRebateService → 0
  • DailyRebateController 对齐 FreeCreditsController
  • 删除 orphan dailyRebateTierConfig/*
  • verify-slot-backend.sh → PASS

(仅更新 plan 文档,不执行业务代码。)

4. 不纳入首期的项(避免过度工程)

  • 各仓库 CI / pre-commit可后续把 verify-slot-backend.sh 拷到 scripts/ 进 pipeline
  • DailyRebateTierValidateService 迁到 Validate 层:属代码重构,单独 PR
  • afterFileEdit 每次保存都跑校验:太吵,先用 stop + 规则要求手动跑脚本

5. 实施顺序

  1. 写两个 hook 脚本 + hooks.json,本地 chmod + 试跑脚本
  2. 改/增三个 .mdc 规则文件
  3. 更新每日返水 plan 的 DoD若你同意
  4. 重启 Cursor 或确认 Hooks 面板已加载

风险与说明

  • Hooks 是 Cursor 产品能力:需 Cursor 版本支持 hooks.json;若 stop 的 stdin 字段与文档不一致,首版脚本以「扫描 git diff」为主不依赖复杂 JSON 字段。
  • 硬 ≠ 100%:模型仍可能不写 follow-up 前的脚本输出;stop hook 是兜底。二者叠加后明显严于仅 Rules。
  • 多根工作区:脚本按 ~/Documents/project/www/slot/*/git 遍历,不依赖当前打开哪个 folder。