71 lines
1.8 KiB
Python
71 lines
1.8 KiB
Python
#!/usr/bin/env python3
|
|
"""Add validation reminders after Codex edits project coordination files."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
import re
|
|
import sys
|
|
|
|
|
|
FORMAT_PATTERNS = (
|
|
r"\.codex[\\/]agents[\\/].+\.toml\b",
|
|
r"\.codex[\\/]config\.toml\b",
|
|
r"\.codex[\\/]hooks\.json\b",
|
|
r"\.codex[\\/]skills[\\/].+[\\/]SKILL\.md\b",
|
|
r"\.codex[\\/]commands[\\/].+\.md\b",
|
|
r"plugins[\\/].+[\\/]\.codex-plugin[\\/]plugin\.json\b",
|
|
r"plugins[\\/].+[\\/]commands[\\/].+\.md\b",
|
|
r"\.agents[\\/]plugins[\\/]marketplace\.json\b",
|
|
)
|
|
|
|
SYNC_PATTERNS = (
|
|
r"\bdocs[\\/]",
|
|
r"\bphases[\\/]",
|
|
r"\bPLAN\.md\b",
|
|
r"\bPROGRESS\.md\b",
|
|
r"\bAGENTS\.md\b",
|
|
r"\bplugins[\\/]",
|
|
r"\.agents[\\/]plugins[\\/]",
|
|
)
|
|
|
|
|
|
def matches(tool_input: object, patterns: tuple[str, ...]) -> bool:
|
|
text = json.dumps(tool_input, ensure_ascii=False)
|
|
return any(re.search(pattern, text, re.IGNORECASE) for pattern in patterns)
|
|
|
|
|
|
def main() -> int:
|
|
try:
|
|
payload = json.load(sys.stdin)
|
|
except json.JSONDecodeError:
|
|
return 0
|
|
|
|
tool_input = payload.get("tool_input", {})
|
|
notes: list[str] = []
|
|
|
|
if matches(tool_input, FORMAT_PATTERNS):
|
|
notes.append("parse changed .codex TOML/JSON/frontmatter files before finishing")
|
|
|
|
if matches(tool_input, SYNC_PATTERNS):
|
|
notes.append("confirm PLAN.md and PROGRESS.md still reflect completed work and future work")
|
|
|
|
if not notes:
|
|
return 0
|
|
|
|
notes.append("run python scripts/validate_workspace.py for changed repository state")
|
|
json.dump(
|
|
{
|
|
"hookSpecificOutput": {
|
|
"hookEventName": "PostToolUse",
|
|
"additionalContext": "FESA post-edit reminder: " + "; ".join(notes) + ".",
|
|
}
|
|
},
|
|
sys.stdout,
|
|
)
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
raise SystemExit(main())
|