statutor 0.5.0__tar.gz → 0.5.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: statutor
3
- Version: 0.5.0
3
+ Version: 0.5.1
4
4
  Summary: Typed project-ledger framework for agentic repos: four planes, single-writer files, enforced mutation policies.
5
5
  Author: Hoo
6
6
  License-Expression: MIT
@@ -114,7 +114,7 @@ baselines); `worker compare <ref>` explains sibling handoffs read-only.
114
114
  # .pre-commit-config.yaml
115
115
  repos:
116
116
  - repo: https://github.com/hoohugokim/statutor
117
- rev: v0.5.0
117
+ rev: v0.5.1
118
118
  hooks: [{id: statutor}]
119
119
 
120
120
  Per-repo policy lives in `.statutor.yaml`. In-loop checks use the committed
@@ -89,7 +89,7 @@ baselines); `worker compare <ref>` explains sibling handoffs read-only.
89
89
  # .pre-commit-config.yaml
90
90
  repos:
91
91
  - repo: https://github.com/hoohugokim/statutor
92
- rev: v0.5.0
92
+ rev: v0.5.1
93
93
  hooks: [{id: statutor}]
94
94
 
95
95
  Per-repo policy lives in `.statutor.yaml`. In-loop checks use the committed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: statutor
3
- Version: 0.5.0
3
+ Version: 0.5.1
4
4
  Summary: Typed project-ledger framework for agentic repos: four planes, single-writer files, enforced mutation policies.
5
5
  Author: Hoo
6
6
  License-Expression: MIT
@@ -114,7 +114,7 @@ baselines); `worker compare <ref>` explains sibling handoffs read-only.
114
114
  # .pre-commit-config.yaml
115
115
  repos:
116
116
  - repo: https://github.com/hoohugokim/statutor
117
- rev: v0.5.0
117
+ rev: v0.5.1
118
118
  hooks: [{id: statutor}]
119
119
 
120
120
  Per-repo policy lives in `.statutor.yaml`. In-loop checks use the committed
@@ -787,6 +787,13 @@ def _automatic_reason(tool: str, payload: dict, cwd: str) -> str | None:
787
787
  return None
788
788
 
789
789
  def run_hook() -> int:
790
+ if sys.stdin.isatty():
791
+ # A TTY means a human ran the hook with no piped event (harnesses
792
+ # always pipe JSON). Fail fast with usage instead of blocking on
793
+ # stdin forever; fail-open applies to hook *events*, not misuse.
794
+ print("statutor hook expects piped hook JSON on stdin; "
795
+ "run `statutor --help` for modes.", file=sys.stderr)
796
+ return 64
790
797
  try:
791
798
  event = json.load(sys.stdin)
792
799
  tool = event.get("tool_name", "")
@@ -1412,7 +1419,12 @@ def run_init(target: str) -> int:
1412
1419
 
1413
1420
  def main() -> None:
1414
1421
  argv = sys.argv[1:]
1415
- mode = argv[0] if argv else "hook"
1422
+ if not argv or argv[0] in ("--help", "-h"):
1423
+ # Bare invocation must never fall through to hook mode (which blocks
1424
+ # on stdin); print usage instead. --help exits clean, bare exits 64.
1425
+ print(__doc__)
1426
+ sys.exit(0 if argv else 64)
1427
+ mode = argv[0]
1416
1428
  if mode in ("hook", "--claude-hook"):
1417
1429
  sys.exit(run_hook())
1418
1430
  if mode == "check":
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "statutor"
7
- version = "0.5.0"
7
+ version = "0.5.1"
8
8
  description = "Typed project-ledger framework for agentic repos: four planes, single-writer files, enforced mutation policies."
9
9
  readme = "README.md"
10
10
  license = "MIT"
File without changes
File without changes
File without changes