Layer advisory Cursor hooks and skills on the PI executor, shrink the test-report rule to the validation contract, and fix MCP relative paths.
49 lines
1.4 KiB
Python
49 lines
1.4 KiB
Python
#!/usr/bin/env python3
|
||
"""postToolUse: inject receipt-check reminders after pi-subagents tools."""
|
||
from __future__ import annotations
|
||
|
||
import sys
|
||
from pathlib import Path
|
||
|
||
sys.path.insert(0, str(Path(__file__).resolve().parent))
|
||
import _lib as lib # noqa: E402
|
||
|
||
HOOK = "pi-receipt-context"
|
||
|
||
REMINDER = """[PI subagent receipt checklist]
|
||
- 核对 report/receipt 路径:.doc/test-reports/assets/pi-subagents/<task_id>/<request_id>/
|
||
- 记录 config_revision / config_sha256 / configured vs actual_model(不可观察填 unknown)
|
||
- run_status=succeeded 不等于阶段 PASS;review_state 仍可为 pending
|
||
- 测试 pass 只来自批准命令证据(approved_commands),不能用模型叙事冒充
|
||
- 推进门禁前用 subagent-stage-record skill 写回传与阶段收据
|
||
"""
|
||
|
||
|
||
def main() -> None:
|
||
raw = lib.read_stdin()
|
||
lib.maybe_probe(raw, HOOK)
|
||
data = lib.parse_json_loose(raw)
|
||
if data is None:
|
||
lib.audit(HOOK, "UNRECOGNIZED_INPUT", reason="non_json_or_empty")
|
||
lib.emit({})
|
||
raise SystemExit(0)
|
||
|
||
name = lib.tool_name(data) or ""
|
||
server = lib.mcp_server(data) or ""
|
||
blob = raw
|
||
is_pi = (
|
||
name.startswith("pi_subagent_")
|
||
or "pi-subagents" in server
|
||
or "pi_subagent_" in blob
|
||
)
|
||
if not is_pi:
|
||
lib.emit({})
|
||
raise SystemExit(0)
|
||
|
||
lib.audit(HOOK, "CONTEXT_INJECT", tool=name or "unknown")
|
||
lib.additional_context(REMINDER)
|
||
|
||
|
||
if __name__ == "__main__":
|
||
main()
|