mirror of
https://github.com/affaan-m/everything-claude-code.git
synced 2026-03-30 13:43:26 +08:00
59 lines
1.6 KiB
Bash
Executable File
59 lines
1.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# scan-rules.sh — enumerate rule files and extract H2 heading index
|
|
# Usage: scan-rules.sh [RULES_DIR]
|
|
# Output: JSON to stdout
|
|
#
|
|
# Environment:
|
|
# RULES_DISTILL_DIR Override ~/.claude/rules (for testing only)
|
|
|
|
set -euo pipefail
|
|
|
|
RULES_DIR="${RULES_DISTILL_DIR:-${1:-$HOME/.claude/rules}}"
|
|
|
|
if [[ ! -d "$RULES_DIR" ]]; then
|
|
jq -n --arg path "$RULES_DIR" '{"error":"rules directory not found","path":$path}' >&2
|
|
exit 1
|
|
fi
|
|
|
|
# Collect all .md files (excluding _archived/)
|
|
files=()
|
|
while IFS= read -r f; do
|
|
files+=("$f")
|
|
done < <(find "$RULES_DIR" -name '*.md' -not -path '*/_archived/*' -print | sort)
|
|
|
|
total=${#files[@]}
|
|
|
|
tmpdir=$(mktemp -d)
|
|
_rules_cleanup() { rm -rf "$tmpdir"; }
|
|
trap _rules_cleanup EXIT
|
|
|
|
for i in "${!files[@]}"; do
|
|
file="${files[$i]}"
|
|
rel_path="${file#"$HOME"/}"
|
|
rel_path="~/$rel_path"
|
|
|
|
# Extract H2 headings (## Title) into a JSON array via jq
|
|
headings_json=$({ grep -E '^## ' "$file" 2>/dev/null || true; } | sed 's/^## //' | jq -R . | jq -s '.')
|
|
|
|
# Get line count
|
|
line_count=$(wc -l < "$file" | tr -d ' ')
|
|
|
|
jq -n \
|
|
--arg path "$rel_path" \
|
|
--arg file "$(basename "$file")" \
|
|
--argjson lines "$line_count" \
|
|
--argjson headings "$headings_json" \
|
|
'{path:$path,file:$file,lines:$lines,headings:$headings}' \
|
|
> "$tmpdir/$i.json"
|
|
done
|
|
|
|
if [[ ${#files[@]} -eq 0 ]]; then
|
|
jq -n --arg dir "$RULES_DIR" '{rules_dir:$dir,total:0,rules:[]}'
|
|
else
|
|
jq -n \
|
|
--arg dir "$RULES_DIR" \
|
|
--argjson total "$total" \
|
|
--argjson rules "$(jq -s '.' "$tmpdir"/*.json)" \
|
|
'{rules_dir:$dir,total:$total,rules:$rules}'
|
|
fi
|