{"id":29408071,"url":"https://github.com/rishabh3562/commitiq","last_synced_at":"2025-07-12T03:02:21.528Z","repository":{"id":303966610,"uuid":"1014434088","full_name":"rishabh3562/CommitIQ","owner":"rishabh3562","description":"Dev insights from GitHub, straight into your Slack.","archived":false,"fork":false,"pushed_at":"2025-07-10T13:14:24.000Z","size":69,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-07-10T18:55:18.611Z","etag":null,"topics":["ai","analysis","analytics","langchain","langraph","llm","orchestration","python","python3","slack","slack-bot","tool"],"latest_commit_sha":null,"homepage":"https://dubeyrishabh108.vercel.app/projects/commitiq","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rishabh3562.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.MD","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-07-05T18:05:13.000Z","updated_at":"2025-07-10T13:14:28.000Z","dependencies_parsed_at":"2025-07-10T19:13:52.092Z","dependency_job_id":null,"html_url":"https://github.com/rishabh3562/CommitIQ","commit_stats":null,"previous_names":["rishabh3562/commitiq"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/rishabh3562/CommitIQ","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rishabh3562%2FCommitIQ","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rishabh3562%2FCommitIQ/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rishabh3562%2FCommitIQ/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rishabh3562%2FCommitIQ/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rishabh3562","download_url":"https://codeload.github.com/rishabh3562/CommitIQ/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rishabh3562%2FCommitIQ/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":264708183,"owners_count":23652204,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai","analysis","analytics","langchain","langraph","llm","orchestration","python","python3","slack","slack-bot","tool"],"created_at":"2025-07-11T02:02:21.705Z","updated_at":"2025-07-12T03:02:21.489Z","avatar_url":"https://github.com/rishabh3562.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# **CommitIQ – Engineering Productivity Insights**\n\n\u003e 📊 Transform GitHub activity into DORA-aligned insights directly in Slack\n\u003e ⚙️ Powered by LangGraph agents and Python 3.10+\n\n---\n\n## 📑 Table of Contents\n\n* [Overview](#overview)\n* [Features](#features)\n* [Architecture](#architecture)\n* [Setup](#setup)\n* [Usage](#usage)\n* [Agents](#agents)\n* [Data Flow](#data-flow)\n* [Visualization](#visualization)\n* [Prompt Logging](#prompt-logging)\n* [Tech Stack](#tech-stack)\n* [Contributing](#contributing)\n* [License](#license)\n\n---\n\n## Overview\n\n**CommitIQ** is an agent-based engineering intelligence bot that integrates GitHub with Slack, providing real-time DORA metrics and performance summaries.\n\n---\n\n## Features\n\n* 📥 GitHub ingest (live or static)\n* 🧠 LangGraph-based agent pipeline\n* 🧾 Slack slash commands with narrative + charts\n* 🔍 Auditable prompt logging\n* ⚡ Docker-first, one-command deploy\n\n---\n\n## Architecture\n\n```\nstart_node\n   ↓\nharvester_orchestrator\n   ↓↘︎↘︎↘︎      (parallel)\nharvester_i → diff_analyst_i\n   ↘︎↘︎↘︎\nbatch_collector\n   ↓\naggregator\n   ↓\nnarrator\n   ↓\nslack_reporter\n```\n\nEach `harvester_i` and corresponding `diff_analyst_i` node runs in **parallel**, managed by `harvester_orchestrator`. All analysis results are merged via `batch_collector` before aggregation and insight narration.\n\n---\n\n## Setup\n\n### 1. Python Setup\n\n```bash\npip install -r requirements.txt\npython main.py\n```\n\n### 2. Docker Setup\n\n```bash\ndocker-compose up --build  # First time\ndocker-compose up          # Subsequent runs\n```\n\n### 3. Create `.env` from `.env.sample`\n\nFill in your keys:\n\n```env\n# GitHub\nGITHUB_TOKEN=ghp_xxx                  # GitHub personal access token with repo read access\n\n#only in v1 (not used though but good to have this)\nUSE_FAKE_DATA=False\n\n# Slack\nSLACK_BOT_TOKEN=xoxb-xxx              # Slack bot token\nSLACK_APP_TOKEN=xapp-xxx              # Slack app-level token (for Socket Mode)\nSLACK_SIGNING_SECRET=xxxx             # Slack signing secret\n\n# OpenAI (or other LLM)\nOPENAI_API_KEY=sk-xxx                 # Required if you're using OpenAI\n\n# Optional - if using LangGraph/chain-specific services\nLANGCHAIN_API_KEY=xxx                 # If using LangSmith for logging/tracing\n```\n\n---\n\n## Usage\n\n### ✅ `/dev-report owner repo [options]`\n\nGenerates AI-powered GitHub report with:\n\n* DORA metrics\n* PNG chart\n* Narrative summary\n\n**Examples:**\n\n```bash\n/dev-report hashicorp terraform\n/dev-report hashicorp terraform --monthly\n/dev-report hashicorp terraform --from 2024-06-01 --to 2024-06-30\n```\n\n**Optional Flags:**\n\n| Flag          | Description               |\n| ------------- | ------------------------- |\n| `--weekly`    | Past 7 days (default)     |\n| `--monthly`   | Past 30 days              |\n| `--from DATE` | Start date                |\n| `--to DATE`   | End date                  |\n| `--yesterday` | Report for yesterday only |\n| `--today`     | Report for today only     |\n| `--no-graph`  | Text summary only         |\n\n---\n\n## Agents\n\n* **start\\_node** – Initializes the state\n* **harvester\\_orchestrator** – Launches parallel harvesters\n* **harvester\\_i** – Fetches GitHub commits in segments\n* **diff\\_analyst\\_i** – Analyzes diffs per segment\n* **batch\\_collector** – Merges results from all analysts\n* **aggregator** – Computes DORA and code metrics\n* **narrator** – Generates summaries and insights\n* **slack\\_reporter** – Sends results to Slack\n\n---\n\n## Data Flow\n\n1. GitHub data collected in shards\n2. Each shard is analyzed for diffs and churn\n3. All results collected, aggregated, and summarized\n4. Report posted to Slack with chart and narrative\n\n---\n\n## Visualization\n\n* Charts rendered using `matplotlib`\n* Sent as PNG in Slack threads\n\n---\n\n## Prompt Logging\n\n* Inputs, prompts, and responses are logged\n* Optional file-based logging support\n\n---\n\n## Tech Stack\n\n* **LangChain** `0.3.26`\n* **LangGraph OSS** `0.5.0`\n* \\*\\*Slack Bolt (Python)\\`\n* **matplotlib**, **Docker**, **Python 3.10+**\n\n---\n\n## Contributing\n\nPRs welcome — this repository follows formal open-source standards:\n\n* [Code of Conduct](./CODE_OF_CONDUCT.md)\n* [Contributing Guide](./CONTRIBUTING.md)\n* [Issue Template](./ISSUE_TEMPLATE.md)\n* [Security Policy](./SECURITY.md)\n\nPlease review them before contributing or reporting issues.\n\n---\n\n## License\n\n[MIT License](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frishabh3562%2Fcommitiq","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frishabh3562%2Fcommitiq","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frishabh3562%2Fcommitiq/lists"}