mirror of
https://github.com/codeflash-ai/codeflash.git
synced 2026-05-04 18:25:17 +00:00
Delete all existing .claude/ tracked files and recreate from scratch, adapting patterns from codeflash-agent. Hooks (6, up from 1): - bash-guard: blocks grep/find/cat in Bash, redirects to dedicated tools - require-read + track-read: enforces Read-before-Write/Edit - post-compact: injects git state + project conventions into compaction - post-edit-lint: runs prek on edited Python files (kept) - status-line: shows user, area, branch, dirty state Rules (10, up from 8): - New: sessions, debugging, github (from codeflash-agent) - Rewrote: code-style (absorbed source-code), git (added sizing/hygiene) - Removed: source-code (folded into code-style) Settings: permissions allowlist, attribution, includeCoAuthoredBy, full hook wiring, status line, enableAllProjectMcpServers. .gitignore: whitelist .claude/skills/ for tracking.
49 lines
1.9 KiB
Bash
Executable file
49 lines
1.9 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
# PreCompact hook: Inject state preservation guidance before context compaction.
|
|
|
|
cd "$CLAUDE_PROJECT_DIR" 2>/dev/null || exit 0
|
|
|
|
STATE=""
|
|
|
|
BRANCH=$(git branch --show-current 2>/dev/null)
|
|
[ -n "$BRANCH" ] && STATE="${STATE}Branch: ${BRANCH}\n"
|
|
|
|
DIRTY=$(git status --porcelain 2>/dev/null)
|
|
if [ -n "$DIRTY" ]; then
|
|
COUNT=$(echo "$DIRTY" | wc -l | tr -d ' ')
|
|
STATE="${STATE}Uncommitted files (${COUNT}):\n${DIRTY}\n"
|
|
fi
|
|
|
|
UPSTREAM=$(git rev-parse --abbrev-ref '@{upstream}' 2>/dev/null)
|
|
if [ -n "$UPSTREAM" ]; then
|
|
AHEAD=$(git rev-list --count "${UPSTREAM}..HEAD" 2>/dev/null)
|
|
[ "$AHEAD" -gt 0 ] 2>/dev/null && STATE="${STATE}Unpushed commits: ${AHEAD}\n"
|
|
fi
|
|
|
|
RECENT=$(git log --oneline -5 2>/dev/null)
|
|
[ -n "$RECENT" ] && STATE="${STATE}Recent commits:\n${RECENT}\n"
|
|
|
|
LATEST_HANDOFF=$(ls -t "$CLAUDE_PROJECT_DIR/.claude/handoffs/"*.md 2>/dev/null | head -1)
|
|
if [ -n "$LATEST_HANDOFF" ] && [ -f "$LATEST_HANDOFF" ]; then
|
|
HANDOFF_CONTENT=$(head -40 "$LATEST_HANDOFF" 2>/dev/null)
|
|
[ -n "$HANDOFF_CONTENT" ] && STATE="${STATE}\nHandoff context:\n${HANDOFF_CONTENT}\n"
|
|
fi
|
|
|
|
STATE="${STATE}\nProject conventions to preserve:\n"
|
|
STATE="${STATE}- Python 3.9+, uv for all tooling, ruff + mypy via prek\n"
|
|
STATE="${STATE}- Verification: uv run prek (single command for lint/format/types)\n"
|
|
STATE="${STATE}- Pre-push: uv run prek run --from-ref origin/<base>\n"
|
|
STATE="${STATE}- Conventional commits: fix:, feat:, refactor:, test:, chore:\n"
|
|
STATE="${STATE}- Result type: Success(value) / Failure(error), check with is_successful()\n"
|
|
STATE="${STATE}- Language singleton: set_current_language() / current_language()\n"
|
|
STATE="${STATE}- libcst for code transforms, ast for read-only analysis\n"
|
|
|
|
[ -z "$STATE" ] && exit 0
|
|
|
|
cat <<EOF
|
|
{
|
|
"systemMessage": "PRESERVE the following session state through compaction:\n$(echo -e "$STATE" | sed 's/"/\\"/g' | sed ':a;N;$!ba;s/\n/\\n/g')"
|
|
}
|
|
EOF
|
|
|
|
exit 0
|