Initial commit
This commit is contained in:
102
hooks/post-tool-use/02-block-bd-truncation.py
Executable file
102
hooks/post-tool-use/02-block-bd-truncation.py
Executable file
@@ -0,0 +1,102 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
PostToolUse hook to block bd create/update commands with truncation markers.
|
||||
|
||||
Prevents incomplete task specifications from being saved to bd, which causes
|
||||
confusion and incomplete implementation later.
|
||||
|
||||
Truncation markers include:
|
||||
- [Remaining step groups truncated for length]
|
||||
- [truncated]
|
||||
- [... (more)]
|
||||
- [etc.]
|
||||
- [Omitted for brevity]
|
||||
"""
|
||||
|
||||
import json
|
||||
import sys
|
||||
import re
|
||||
|
||||
# Truncation markers to detect
|
||||
TRUNCATION_PATTERNS = [
|
||||
r'\[Remaining.*?truncated',
|
||||
r'\[truncated',
|
||||
r'\[\.\.\..*?\]',
|
||||
r'\[etc\.?\]',
|
||||
r'\[Omitted.*?\]',
|
||||
r'\[More.*?omitted\]',
|
||||
r'\[Full.*?not shown\]',
|
||||
r'\[Additional.*?omitted\]',
|
||||
r'\.\.\..*?\[', # ... [something]
|
||||
r'\(truncated\)',
|
||||
r'\(abbreviated\)',
|
||||
]
|
||||
|
||||
def check_for_truncation(text):
|
||||
"""Check if text contains any truncation markers."""
|
||||
if not text:
|
||||
return None
|
||||
|
||||
for pattern in TRUNCATION_PATTERNS:
|
||||
match = re.search(pattern, text, re.IGNORECASE)
|
||||
if match:
|
||||
return match.group(0)
|
||||
|
||||
return None
|
||||
|
||||
def main():
|
||||
# Read tool use event from stdin
|
||||
try:
|
||||
input_data = json.load(sys.stdin)
|
||||
except json.JSONDecodeError:
|
||||
# If we can't parse JSON, allow the operation
|
||||
sys.exit(0)
|
||||
|
||||
tool_name = input_data.get("tool_name", "")
|
||||
tool_input = input_data.get("tool_input", {})
|
||||
|
||||
# Only check Bash tool calls
|
||||
if tool_name != "Bash":
|
||||
sys.exit(0)
|
||||
|
||||
command = tool_input.get("command", "")
|
||||
|
||||
# Check if this is a bd create or bd update command
|
||||
if not command or not re.search(r'\bbd\s+(create|update)\b', command):
|
||||
sys.exit(0)
|
||||
|
||||
# Check for truncation markers
|
||||
truncation_marker = check_for_truncation(command)
|
||||
|
||||
if truncation_marker:
|
||||
# Block the command and provide helpful feedback
|
||||
output = {
|
||||
"hookSpecificOutput": {
|
||||
"hookEventName": "PostToolUse",
|
||||
"permissionDecision": "deny",
|
||||
"permissionDecisionReason": (
|
||||
f"⚠️ BD TRUNCATION DETECTED\n\n"
|
||||
f"Found truncation marker: {truncation_marker}\n\n"
|
||||
f"This bd task specification appears incomplete or truncated. "
|
||||
f"Saving incomplete specifications leads to confusion and incomplete implementations.\n\n"
|
||||
f"Please:\n"
|
||||
f"1. Expand the full implementation details\n"
|
||||
f"2. Include ALL step groups and tasks\n"
|
||||
f"3. Do not use truncation markers like '[Remaining steps truncated]'\n"
|
||||
f"4. Ensure every step has complete, actionable instructions\n\n"
|
||||
f"If the specification is too long:\n"
|
||||
f"- Break into smaller epics\n"
|
||||
f"- Use bd dependencies to link related tasks\n"
|
||||
f"- Focus on making each task independently complete\n\n"
|
||||
f"DO NOT truncate task specifications."
|
||||
)
|
||||
}
|
||||
}
|
||||
print(json.dumps(output))
|
||||
sys.exit(0)
|
||||
|
||||
# Allow command if no truncation detected
|
||||
sys.exit(0)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user