mirror of
https://github.com/affaan-m/everything-claude-code.git
synced 2026-03-30 21:53:28 +08:00
* feat(skills): add rules-distill — extract cross-cutting principles from skills into rules
Applies the skill-stocktake pattern to rules maintenance:
scan skills → extract shared principles → propose rule changes.
Key design decisions:
- Deterministic collection (scan scripts) + LLM judgment (cross-read & verdict)
- 6 verdict types: Append, Revise, New Section, New File, Already Covered, Too Specific
- Anti-abstraction safeguard: 2+ skills evidence, actionable behavior test, violation risk
- Rules full text passed to LLM (no grep pre-filter) for accurate matching
- Never modifies rules automatically — always requires user approval
* fix(skills): address review feedback for rules-distill
Fixes raised by CodeRabbit, Greptile, and cubic:
- Add Prerequisites section documenting skill-stocktake dependency
- Add fallback command when skill-stocktake is not installed
- Fix shell quoting: add IFS= and -r to while-read loops
- Replace hardcoded paths with env var placeholders ($CLAUDE_RULES_DIR, $SKILL_STOCKTAKE_DIR)
- Add json language identifier to code blocks
- Add "How It Works" parent heading for Phase 1/2/3
- Add "Example" section with end-to-end run output
- Add revision.reason/before/after fields to output schema for Revise verdict
- Document timestamp format (date -u +%Y-%m-%dT%H:%M:%SZ)
- Document candidate-id format (kebab-case from principle)
- Use concrete examples in results.json schema
* fix(skills): remove skill-stocktake dependency, add self-contained scripts
Address P1 review feedback:
- Add scan-skills.sh and scan-rules.sh directly in rules-distill/scripts/
(no external dependency on skill-stocktake)
- Remove Prerequisites section (no longer needed)
- Add cross-batch merge step to prevent 2+ skills requirement
from being silently broken across batch boundaries
- Fix nested triple-backtick fences (use quadruple backticks)
- Remove head -100 cap (silent truncation)
- Rename "When to Activate" → "When to Use" (ECC standard)
- Remove unnecessary env var placeholders (SKILL.md is a prompt, not a script)
* fix: update skill/command counts in README.md and AGENTS.md
rules-distill added 1 skill + 1 command:
- skills: 108 → 109
- commands: 57 → 58
Updates all count references to pass CI catalog validation.
* fix(skills): address Servitor review feedback for rules-distill
1. Rename SKILL_STOCKTAKE_* env vars to RULES_DISTILL_* for consistency
2. Remove unnecessary observation counting (use_7d/use_30d) from scan-skills.sh
3. Fix header comment: scan.sh → scan-skills.sh
4. Use jq for JSON construction in scan-rules.sh to properly escape
headings containing special characters (", \)
* fix(skills): address CodeRabbit review — portability and scan scope
1. scan-rules.sh: use jq for error JSON output (proper escaping)
2. scan-rules.sh: replace GNU-only sort -z with portable sort (BSD compat)
3. scan-rules.sh: fix pipefail crash on files without H2 headings
4. scan-skills.sh: scan only SKILL.md files (skip learned/*.md and
auxiliary docs that lack frontmatter)
5. scan-skills.sh: add portable get_mtime helper (GNU stat/date
fallback to BSD stat/date)
* fix: sync catalog counts with filesystem (27 agents, 114 skills, 59 commands)
---------
Co-authored-by: Tatsuya Shimomoto <shimo4228@gmail.com>
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
|