An AI-powered Product Management assistant built with LangGraph multi-agent architecture. The agent proactively monitors Slack, Jira, Notion, GitHub, and web sources to provide actionable insights, daily digests, market intelligence, and automated workflows.
┌─────────────────────────────────────────────────────────┐
│ Supervisor Agent │
│ (Intent Classification & Delegation) │
└───────┬──────┬──────┬──────┬──────┬────────────────────┘
│ │ │ │ │
┌────▼──┐ ┌▼────┐ ┌▼────┐ ┌▼────┐ ┌▼──────┐
│ Slack │ │Jira │ │Git │ │Mkt │ │Notion │
│ Agent │ │Agent│ │Agent│ │Rsch │ │Agent │
└───────┘ └─────┘ └─────┘ └─────┘ └───────┘
- Supervisor: Routes queries to specialist agents, aggregates results
- Slack Agent: Channel monitoring, message search, posting alerts
- Jira Agent: Issue tracking, priority management, ticket creation
- GitHub Agent: PR/issue monitoring, code analysis, community tracking
- Market Research Agent: Web search, competitor monitoring, Reddit analysis
- Notion Agent: Report generation, documentation, roadmap maintenance
- Python 3.12+
- An Anthropic API key (Claude) or OpenAI API key
# Clone and enter directory
cd pm-agent
# Create virtual environment
python -m venv .venv
source .venv/bin/activate
# Install dependencies
pip install -r requirements.txt
# Configure environment
cp .env.example .env
# Edit .env with your API keys# Start the API server
PYTHONPATH=. uvicorn api.main:app --reload --port 8000docker-compose up --build| Method | Endpoint | Description |
|---|---|---|
| GET | /health |
Health check |
| POST | /invoke |
Synchronous graph invocation |
| POST | /stream |
SSE streaming responses |
| POST | /chat |
Conversational interface |
| POST | /webhooks/slack |
Slack event webhook |
| POST | /webhooks/jira |
Jira event webhook |
| POST | /webhooks/github |
GitHub event webhook |
curl -X POST http://localhost:8000/invoke \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{"query": "Summarize the latest Jira tickets and GitHub PRs"}'curl -X POST http://localhost:8000/chat \
-H "Content-Type: application/json" \
-d '{"message": "What are the top blockers this week?", "thread_id": "my-session"}'| Schedule | Default | Description |
|---|---|---|
| Daily Digest | 6:00 AM CET | Slack + Jira + GitHub + Market summary |
| Weekly Market Scan | Monday 8:00 AM CET | Competitor + Reddit intelligence |
| Hourly Check | Every hour | P0/P1 ticket detection, urgent alerts |
See .env.example for the full list. Key variables:
ANTHROPIC_API_KEY- Claude API key (required)SLACK_BOT_TOKEN- Slack bot tokenJIRA_URL/JIRA_API_TOKEN- Jira credentialsNOTION_API_KEY- Notion integration tokenGITHUB_TOKEN- GitHub personal access tokenTAVILY_API_KEY- Tavily web search API keyPOSTGRES_URI- PostgreSQL connection string (for production checkpointing)
# Run all tests
PYTHONPATH=. pytest tests/ -v --tb=short
# Run with coverage
PYTHONPATH=. pytest tests/ -v --cov=src --cov=api --cov-report=term-missingThe PM Agent operates under strict trust-critical rules designed for production reliability. The agent is a product operations tool, not a chat assistant.
- No Evidence → No Claim: Facts require successful tool calls
- Missing Data ≠ No Problems: Failed tools = UNKNOWN state
- Never Fabricate: No invented IDs, metrics, or timelines
- Alerts Are Dangerous: Only P0/P1 with full evidence
- One Pass, One Truth: Each source checked once per run
Every run tracks:
JIRA_CHECK = NOT_STARTED → IN_PROGRESS → SUCCESS | FAILED_WITH_REASON
GITHUB_CHECK = NOT_STARTED → IN_PROGRESS → SUCCESS | FAILED_WITH_REASON
SLACK_CHECK = NOT_STARTED → IN_PROGRESS → SUCCESS | FAILED_WITH_REASON
No final output until all checks complete.
Prohibited (false reassurance):
- "Looks fine", "All good", "No major issues", "Seems okay"
Required (explicit uncertainty):
- "No verified critical issues detected in checked sources"
- "Data unavailable", "Unable to verify", "Unknown"
Every run is scored (0-100%):
| Component | Weight | Description |
|---|---|---|
| Evidence | 40% | Claims backed by tool calls |
| Execution | 30% | All checks completed |
| Language | 15% | No prohibited phrases |
| Alerting | 15% | Appropriate alert decisions |
- docs/TRUST_CRITICAL_OPERATIONS.md - Full operating instructions
- docs/EVIDENCE_GATING.md - Evidence system details
pm-agent/
├── src/
│ ├── agents/ # Specialist agents (supervisor, slack, jira, etc.)
│ ├── tools/ # Integration tools (slack, jira, github, notion, research)
│ ├── graphs/ # LangGraph definitions
│ ├── state.py # Agent state schema
│ ├── config.py # Settings & LLM factory
│ ├── evidence.py # Evidence Ledger & Safety Gate
│ ├── execution_state.py # Trust-critical execution state machine
│ ├── alerting.py # Strict alerting rules & language constraints
│ ├── trust_score.py # Trust score calculation
│ ├── source_validation.py # Source type validation
│ ├── evidence_callback.py # LangChain callback for evidence recording
│ └── utils.py # Logging, retry, circuit breaker
├── api/
│ ├── main.py # FastAPI application
│ ├── routes.py # API routes & webhooks
│ └── background.py # Scheduled jobs (APScheduler)
├── tests/ # Comprehensive test suite
├── docs/
│ ├── EVIDENCE_GATING.md # Evidence system documentation
│ └── TRUST_CRITICAL_OPERATIONS.md # Trust-critical operating instructions
├── Dockerfile # Multi-stage Docker build
├── docker-compose.yml # Docker Compose with PostgreSQL
├── requirements.txt # Python dependencies
├── .env.example # Environment template
└── README.md # This file