-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcode-diary.sh
More file actions
executable file
·134 lines (104 loc) · 4.63 KB
/
code-diary.sh
File metadata and controls
executable file
·134 lines (104 loc) · 4.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#!/bin/bash
# code-diary.sh — Claude Code PostToolUse hook
# Creates a completed Reminder in the "Code" list for git commits and PRs.
# Uses reminders-cli (EventKit) — no AppleScript, works headless.
# Ensure Homebrew binaries are available (reminders-cli, jq, etc.)
export PATH="/opt/homebrew/bin:$PATH"
# Never let this hook block Claude — any error exits cleanly
trap 'exit 0' ERR
# Read JSON from stdin
INPUT=$(cat)
# Quick bail if not a Bash tool call
TOOL_NAME=$(echo "$INPUT" | jq -r '.tool_name // ""' 2>/dev/null) || exit 0
[ "$TOOL_NAME" = "Bash" ] || exit 0
# Extract command and working directory
COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // ""' 2>/dev/null) || exit 0
CWD=$(echo "$INPUT" | jq -r '.cwd // ""' 2>/dev/null) || exit 0
# Quick bail if not a git/gh operation we care about
echo "$COMMAND" | grep -qE 'git commit|git push|gh pr create|gh pr merge' || exit 0
# Extract tool response — Bash tool returns {"stdout": "...", "stderr": "..."}
RESPONSE=$(echo "$INPUT" | jq -r '
if .tool_response | type == "string" then .tool_response
elif .tool_response | type == "object" then (.tool_response.stdout // (.tool_response | tostring))
else ""
end
' 2>/dev/null) || RESPONSE=""
# Determine project name: prefer git remote, fall back to directory name
PROJECT=$(git -C "$CWD" remote get-url origin 2>/dev/null | sed 's|.*/||;s|\.git$||') || PROJECT=""
[ -z "$PROJECT" ] && PROJECT=$(basename "$CWD")
# Get current branch
BRANCH=$(git -C "$CWD" rev-parse --abbrev-ref HEAD 2>/dev/null) || BRANCH="unknown"
# Get GitHub repo URL for linking
REPO_URL=$(git -C "$CWD" remote get-url origin 2>/dev/null | sed 's|git@github\.com:|https://github.com/|;s|\.git$||') || REPO_URL=""
TITLE=""
NOTES=""
TIMESTAMP=$(date "+%Y-%m-%d %H:%M")
# --- Detect: gh pr create ---
if echo "$COMMAND" | grep -qE 'gh pr create'; then
PR_URL=$(echo "$RESPONSE" | grep -oE 'https://github\.com/[^ ]+' | head -1) || PR_URL=""
# Extract PR title from --title "..." or --title '...'
PR_TITLE=$(echo "$COMMAND" | sed -n 's/.*--title[= ]*"\([^"]*\)".*/\1/p' | head -1) || PR_TITLE=""
[ -z "$PR_TITLE" ] && PR_TITLE=$(echo "$COMMAND" | sed -n "s/.*--title[= ]*'\([^']*\)'.*/\1/p" | head -1) || true
TITLE="${PROJECT} - PR Created"
NOTES="Branch: ${BRANCH}"
[ -n "$PR_TITLE" ] && NOTES="${NOTES}
Title: ${PR_TITLE}"
[ -n "$PR_URL" ] && NOTES="${NOTES}
${PR_URL}"
NOTES="${NOTES}
${TIMESTAMP}"
# --- Detect: gh pr merge ---
elif echo "$COMMAND" | grep -qE 'gh pr merge'; then
PR_NUM=$(echo "$COMMAND" | grep -oE '#?[0-9]+' | grep -oE '[0-9]+' | head -1) || PR_NUM=""
MERGE_MSG=$(echo "$RESPONSE" | grep -E '(Merged|merged)' | head -1) || MERGE_MSG=""
TITLE="${PROJECT} - PR Merged"
NOTES="Branch: ${BRANCH}"
[ -n "$PR_NUM" ] && NOTES="${NOTES}
PR #${PR_NUM}"
[ -n "$MERGE_MSG" ] && NOTES="${NOTES}
${MERGE_MSG}"
[ -n "$REPO_URL" ] && NOTES="${NOTES}
${REPO_URL}"
NOTES="${NOTES}
${TIMESTAMP}"
# --- Detect: git push ---
elif echo "$COMMAND" | grep -qE 'git push'; then
PUSH_DEST=$(echo "$RESPONSE" | grep -oE '[a-z]+/[^ ]+\.\.[^ ]+' | head -1) || PUSH_DEST=""
PUSH_SUMMARY=$(echo "$RESPONSE" | grep -E '(->|To )' | head -1 | sed 's/^ *//') || PUSH_SUMMARY=""
TITLE="${PROJECT} - Push"
NOTES="Branch: ${BRANCH}"
[ -n "$PUSH_SUMMARY" ] && NOTES="${NOTES}
${PUSH_SUMMARY}"
[ -n "$REPO_URL" ] && NOTES="${NOTES}
${REPO_URL}"
NOTES="${NOTES}
${TIMESTAMP}"
# --- Detect: git commit ---
elif echo "$COMMAND" | grep -qE 'git commit'; then
# Extract from response: "[branch hash] commit message"
COMMIT_LINE=$(echo "$RESPONSE" | grep -E '^\[' | head -1) || COMMIT_LINE=""
COMMIT_MSG=$(echo "$COMMIT_LINE" | sed 's/^\[[^]]*\] //') || COMMIT_MSG=""
COMMIT_HASH=$(echo "$COMMIT_LINE" | sed -n 's/^\[[^ ]* \([a-f0-9]*\)\].*/\1/p') || COMMIT_HASH=""
FILE_STATS=$(echo "$RESPONSE" | grep -E '[0-9]+ files? changed' | head -1 | sed 's/^ *//') || FILE_STATS=""
TITLE="${PROJECT} - Commit"
NOTES="Branch: ${BRANCH}"
[ -n "$COMMIT_HASH" ] && NOTES="${NOTES}
Hash: ${COMMIT_HASH}"
[ -n "$COMMIT_MSG" ] && NOTES="${NOTES}
${COMMIT_MSG}"
[ -n "$FILE_STATS" ] && NOTES="${NOTES}
${FILE_STATS}"
[ -n "$REPO_URL" ] && NOTES="${NOTES}
${REPO_URL}"
NOTES="${NOTES}
${TIMESTAMP}"
fi
# Create the reminder and mark it completed using its externalId
if [ -n "$TITLE" ]; then
ADD_JSON=$(reminders add "Code" "$TITLE" --notes "$NOTES" --format json 2>/dev/null) || exit 0
EXT_ID=$(echo "$ADD_JSON" | jq -r '.externalId // ""' 2>/dev/null) || exit 0
if [ -n "$EXT_ID" ] && [ "$EXT_ID" != "null" ]; then
reminders complete "Code" "$EXT_ID" 2>/dev/null || true
fi
fi
exit 0