Source Code
Meeting Prep
Automated meeting preparation and daily commit summaries for development teams.
Capabilities
- Meeting Prep — Check Google Calendar for upcoming meetings with video links, notify user, generate commit-based updates
- Daily Summary — End-of-day summary of all commits across all developers
Setup Requirements
Google Calendar OAuth
Create OAuth credentials in Google Cloud Console:
- Enable Google Calendar API
- Create OAuth 2.0 Desktop credentials
- Store
client_secret.jsonincredentials/ - Authorize with scopes:
https://www.googleapis.com/auth/calendar - Store tokens in
credentials/calendar_tokens.json
For multiple accounts, store separate token files per account.
GitHub Token
Create a classic Personal Access Token with repo scope. Store at credentials/github_token.
Workflows
Meeting Prep Check
Trigger: Cron every 15 minutes or heartbeat.
- Query configured calendars for events in next 45 minutes
- Filter for events with Google Meet links (
hangoutLinkorconferenceData) - If meeting 30-45 min away and not yet notified:
- Ask user: "Meeting [title] in X min. When was your last update? Which repos should I check?"
- Track in state file to avoid duplicates
- If meeting 10-20 min away:
- Generate update from commits
- Send formatted update
Daily Commit Summary
Trigger: Cron at end of day.
- Fetch all commits from configured repos for current day
- Include all developers
- Group by repo and subdirectory
- Format with author names
- Send summary
API Reference
Check Calendar
NOW=$(date -u +%Y-%m-%dT%H:%M:%SZ)
LATER=$(date -u -d "+45 minutes" +%Y-%m-%dT%H:%M:%SZ)
TOKEN=$(jq -r '.access_token' credentials/calendar_tokens.json)
curl -s "https://www.googleapis.com/calendar/v3/calendars/primary/events?timeMin=$NOW&timeMax=$LATER&singleEvents=true" \
-H "Authorization: Bearer $TOKEN" | \
jq '[.items[] | select(.hangoutLink != null or .conferenceData != null)]'
Refresh Token
CLIENT_ID=$(jq -r '.installed.client_id' credentials/client_secret.json)
CLIENT_SECRET=$(jq -r '.installed.client_secret' credentials/client_secret.json)
REFRESH_TOKEN=$(jq -r '.refresh_token' credentials/calendar_tokens.json)
curl -s -X POST https://oauth2.googleapis.com/token \
-d "client_id=$CLIENT_ID" \
-d "client_secret=$CLIENT_SECRET" \
-d "refresh_token=$REFRESH_TOKEN" \
-d "grant_type=refresh_token"
Fetch Commits
TOKEN=$(cat credentials/github_token)
SINCE=$(date -u -d "-7 days" +%Y-%m-%dT%H:%M:%SZ)
# List org repos
curl -s -H "Authorization: Bearer $TOKEN" \
"https://api.github.com/orgs/ORG_NAME/repos?per_page=50&sort=pushed"
# Get commits
curl -s -H "Authorization: Bearer $TOKEN" \
"https://api.github.com/repos/ORG/REPO/commits?since=$SINCE&per_page=30"
Output Format
Plain text, no markdown, no emojis:
Update - [DATE]
[repo-name]
[subdirectory]
• Verbose description of change (Author)
• Another change (Author)
Today
• [user input]
Blockers
• None
Discussion
• None
Formatting Rules
• Group by repo, then subdirectory
• Summarize commits into meaningful descriptions
• Include author names
• Plain text only for easy copy-paste
State Management
Track state in data/meeting-prep-state.json:
{
"notified": {},
"config": {
"repoFilter": "org-name/*"
}
}