Automated daily standup generator with ZERO manual input.
Analyzes your GitHub commits, Jira tickets, and generates a standup update, then posts it to Slack automatically.
- 🤖 Powered by OpenAI AgentKit
- 📊 Fetches real data from GitHub & Jira
- 💬 Posts formatted standup to Slack
- ⚡ Zero manual input required
pip install -r requirements.txtCopy .env.example to .env and fill in your credentials:
cp .env.example .envRequired credentials:
- OpenAI API Key: Get from https://platform.openai.com/api-keys
- GitHub Token: Generate at https://github.com/settings/tokens (needs
repo,read:userscopes)- Note: Fetches ALL repos automatically - no need to specify individual repos
- Jira API Token: Create at https://id.atlassian.com/manage-profile/security/api-tokens
- Slack Webhook: Create app at https://api.slack.com/apps and enable Incoming Webhooks
python main.pyEdit .env to customize:
GITHUB_USERNAME: Your GitHub username (fetches ALL repos you work on)JIRA_EMAIL: Your Atlassian account email (fetches ALL tickets assigned to you)SLACK_CHANNEL: Target channel (default:#dev-standup)
Note: Both GitHub and Jira integrations automatically fetch ALL your activity - no need to specify individual repos or projects.
Purpose: Transforms raw GitHub API data into natural language summaries
Process:
- Calls
get_github_activity()tool - Receives commits, PRs, reviews from ALL repos (last 24h)
- Gets README snippets for project context
- Summarizes: "Merged PR #234 to api-service (backend API), made 5 commits on feature/dashboard"
- Returns summary to Coordinator
Purpose: Transforms raw Jira API data into natural language summaries
Process:
- Calls
get_jira_activity()tool - Receives tickets updated in last 24h
- Summarizes: "Completed AUTH-456, moved DASH-789 to Code Review"
- Returns summary to Coordinator
Purpose: Orchestrates the entire workflow
Process:
- Hands off to GitHub Analyst (receives code summary)
- Hands off to Jira Analyst (receives project summary)
- Synthesizes both into Yesterday/Today/Blockers format
- Calls
post_to_slack()to post final standup
python main.pyfrom tools.github_tools import get_github_activity
print(get_github_activity())
from tools.jira_tools import get_jira_activity
print(get_jira_activity())
from tools.slack_tools import post_to_slack
print(post_to_slack("Test message"))from agents import Runner
from main import github_analyst, jira_analyst
# Test GitHub Analyst alone
result = await Runner.run(github_analyst, "Summarize my GitHub activity")
print(result.final_output)
# Test Jira Analyst alone
result = await Runner.run(jira_analyst, "Summarize my Jira activity")
print(result.final_output)crontab -eAdd line to run daily at 9am:
0 9 * * * cd /path/to/standup-zero && /path/to/python main.py
See .github/workflows/daily-standup.yml for cloud automation setup.
This project showcases AgentKit's multi-agent architecture with specialized agents working together:
- Standup Coordinator (main agent) orchestrates the workflow
- GitHub Analyst Agent fetches and summarizes code activity
- Jira Analyst Agent fetches and summarizes project activity
- Coordinator synthesizes summaries into final standup and posts to Slack
Each analyst agent is an expert in its domain, transforming raw API data into AI-digestible summaries before the coordinator weaves everything together.
Standup Coordinator Agent
├─ Hands off to → GitHub Analyst Agent
│ └─ Tool: get_github_activity()
│ └─ Returns: Natural language code summary
│
├─ Hands off to → Jira Analyst Agent
│ └─ Tool: get_jira_activity()
│ └─ Returns: Natural language project summary
│
├─ Synthesizes both summaries into Yesterday/Today/Blockers format
│
└─ Tool: post_to_slack()
└─ Posts formatted standup to channel
Why this approach?
- Modularity: Each agent has a single, clear responsibility
- Reusability: Analyst agents can be used independently or in other workflows
- Maintainability: Easy to add new data sources (Calendar, Linear, etc.)
- Showcases AgentKit: Demonstrates handoffs and multi-agent orchestration
MIT