mirror of
https://github.com/kuhyx/utils.git
synced 2026-11-10 20:27:15 +01:00
Files that cannot be read in one piece force re-reads and partial edits, which is the largest avoidable cost in an LLM-assisted workflow. This adds the enforcement side of a 250-line cap covering code AND prose. - file_length/config.py: single source of truth for the cap and its exemptions (generated, markup, vendored, data-ish txt), shared by both the gate and the survey so the two cannot silently disagree. - file_length/check.py: the check itself. Exits 1 and lists violations; adjudication is an exit code, not a judgement call. - scripts/check_file_length.sh: thin wrapper pre-commit calls with staged files. Verified against six fixtures: over-cap code fails, under-cap passes, generated l10n (1417 lines) exempt, vendored pdfjs exempt, the 174800-line wordlist exempt as data, and a 1101-line CLAUDE.md correctly fails since prose is capped too. Baseline at time of writing: 657 files over 250 lines across 29 repos. Each repo carries a refactor_claude_todo.md prompt with its own list. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01C7yZz45ezmzCB89Cv5gAtZ
39 lines
1.3 KiB
Bash
Executable File
39 lines
1.3 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# ============================================================================
|
|
# Fail if any file exceeds the shared 250-line cap.
|
|
#
|
|
# A file that cannot be read in one piece forces re-reads and partial edits,
|
|
# which is the largest avoidable cost in an LLM-assisted workflow. The cap
|
|
# applies to code AND prose; generated files, markup and data are exempt.
|
|
#
|
|
# The real check lives in Python (file_length/check.py) so that the gate and
|
|
# the survey share one exemption list -- see rules/shell.instructions.md on
|
|
# never embedding another language's logic inline.
|
|
#
|
|
# Usage:
|
|
# scripts/check_file_length.sh <file> [<file> ...] # pre-commit passes these
|
|
# scripts/check_file_length.sh --all # whole tree, from cwd
|
|
# ============================================================================
|
|
|
|
set -euo pipefail
|
|
|
|
readonly UTILS_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
readonly CHECKER="$UTILS_ROOT/file_length/check.py"
|
|
|
|
main() {
|
|
if [[ $# -eq 0 ]]; then
|
|
echo "Usage: $(basename "$0") <file>... | --all" >&2
|
|
exit 1
|
|
fi
|
|
if [[ ! -f "$CHECKER" ]]; then
|
|
echo "Error: checker not found at $CHECKER" >&2
|
|
exit 1
|
|
fi
|
|
|
|
PYTHONPATH="$UTILS_ROOT${PYTHONPATH:+:$PYTHONPATH}" \
|
|
python3 "$CHECKER" "$@"
|
|
}
|
|
|
|
main "$@"
|