Install
openclaw skills install meeting-prepAutomated meeting preparation and daily commit summaries. Use when checking Google Calendar for upcoming meetings, generating standup updates from GitHub commits, or sending daily development summaries. Pulls meeting schedules and commit history, then formats verbose developer-friendly updates.
openclaw skills install meeting-prepAutomated meeting preparation and daily commit summaries for development teams.
Create OAuth credentials in Google Cloud Console:
client_secret.json in credentials/https://www.googleapis.com/auth/calendarcredentials/calendar_tokens.jsonFor multiple accounts, store separate token files per account.
Create a classic Personal Access Token with repo scope. Store at credentials/github_token.
Trigger: Cron every 15 minutes or heartbeat.
hangoutLink or conferenceData)Trigger: Cron at end of day.
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/*"
}
}