| |
| from __future__ import annotations |
|
|
| import subprocess |
| import sys |
| from pathlib import Path |
|
|
|
|
| ROOT = Path(__file__).resolve().parents[2] |
|
|
|
|
| def run(args: list[str]) -> str: |
| result = subprocess.run(args, cwd=ROOT, text=True, capture_output=True, check=False) |
| return result.stdout.strip() |
|
|
|
|
| def main() -> int: |
| changed = run(["git", "status", "--short"]) |
| if not changed: |
| return 0 |
|
|
| paths = [line[3:] for line in changed.splitlines() if len(line) > 3] |
| code_like = [ |
| path |
| for path in paths |
| if path.endswith((".py", ".yaml", ".yml", ".toml", ".json")) and not path.startswith(".codex/") |
| ] |
| docs_like = [path for path in paths if path.startswith("docs/") or path in {"README.md", "AGENTS.md", "CLAUDE.md"}] |
| tests_like = [path for path in paths if path.startswith("tests/")] |
|
|
| reminders: list[str] = [] |
| if code_like and not tests_like: |
| reminders.append("code/config changed; verify whether focused tests should be added or updated") |
| if code_like and not docs_like: |
| reminders.append("code/config changed; verify whether docs, ADRs, schema docs, or journal need updates") |
| if any(path.startswith("app.py") or path.startswith("src/ui/") for path in paths): |
| reminders.append("UI changed; verify the Gradio app manually when a browser/server is available") |
|
|
| if reminders: |
| print("[codex-stop-check] Wrap-up reminders:", file=sys.stderr) |
| for reminder in reminders: |
| print(f"- {reminder}", file=sys.stderr) |
| return 0 |
|
|
|
|
| if __name__ == "__main__": |
| raise SystemExit(main()) |
|
|