#!/usr/bin/env python3"""CLAUDE.md と .claude/rules/*.md の文字数を、オンデマンド読み込みの上限と照らして一覧する。使い方: python3 instr_size.py <Claude Code を起動するディレクトリ> [--limit 40000]OVER があれば終了コード 1。"""import os, sysSKIP = {"node_modules", ".git", ".next", "dist", "build"}def has_paths_frontmatter(text): if not text.startswith("---"): return False head = text.split("---", 2)[1] if text.count("---") >= 2 else "" return any(line.strip().startswith("paths:") for line in head.splitlines())def classify(rel, text): parts = rel.split(os.sep) name = parts[-1] if name in ("CLAUDE.md", "CLAUDE.local.md"): return "常時" if len(parts) == 1 else "オンデマンド" if ".claude" in parts and "rules" in parts: nested = parts.index(".claude") > 0 return "オンデマンド" if (nested or has_paths_frontmatter(text)) else "常時" return Nonedef main(root, limit): rows, over = [], False for dirpath, dirnames, filenames in os.walk(root): dirnames[:] = [d for d in dirnames if d not in SKIP] for fn in filenames: p = os.path.join(dirpath, fn) rel = os.path.relpath(p, root) if not (fn in ("CLAUDE.md", "CLAUDE.local.md") or (fn.endswith(".md") and f"{os.sep}rules{os.sep}" in p and ".claude" in rel.split(os.sep))): continue with open(p, encoding="utf-8", errors="replace") as f: text = f.read() kind = classify(rel, text) if kind is None: continue chars = len(text) flag = "OK" if kind == "オンデマンド": if chars > limit: flag, over = "OVER", True elif chars > limit * 0.8: flag = "NEAR" rows.append((chars, len(text.encode("utf-8")), text.count("\n") + 1, flag, kind, rel)) for chars, nbytes, lines, flag, kind, rel in sorted(rows, reverse=True): print(f"{chars:>8} 字 {nbytes:>8} B {lines:>5} 行 {flag:<5} {kind:<6} {rel}") return 1 if over else 0if __name__ == "__main__": limit = 40_000 args = sys.argv[1:] if "--limit" in args: i = args.index("--limit"); limit = int(args[i + 1]); del args[i:i + 2] sys.exit(main(args[0] if args else ".", limit))
41000 字 41000 B 774 行 OVER オンデマンド app/CLAUDE.md 34000 字 100342 B 830 行 OK 常時 .claude/rules/api.md 20000 字 59026 B 488 行 OK オンデマンド app/sub/CLAUDE.md 12230 字 36032 B 302 行 OK オンデマンド .claude/rules/scoped.md 9000 字 26562 B 220 行 OK 常時 CLAUDE.md