{"id":28260126,"url":"https://github.com/tuannvm/jira-a2a","last_synced_at":"2026-02-25T18:05:30.008Z","repository":{"id":291111186,"uuid":"975932670","full_name":"tuannvm/jira-a2a","owner":"tuannvm","description":"Jira A2A Proof of Concept","archived":false,"fork":false,"pushed_at":"2025-10-27T06:31:32.000Z","size":223,"stargazers_count":3,"open_issues_count":7,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-10-30T00:51:24.314Z","etag":null,"topics":["a2a","a2a-mcp","a2a-protocol","ai"],"latest_commit_sha":null,"homepage":"https://docs.tuannvm.com/jira-a2a","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tuannvm.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":["tuannvm"]}},"created_at":"2025-05-01T07:01:21.000Z","updated_at":"2025-08-04T12:22:19.000Z","dependencies_parsed_at":null,"dependency_job_id":"3015c9f9-e333-4c1f-8dfa-d1931bdd6204","html_url":"https://github.com/tuannvm/jira-a2a","commit_stats":null,"previous_names":["tuannvm/jira-a2a"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/tuannvm/jira-a2a","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tuannvm%2Fjira-a2a","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tuannvm%2Fjira-a2a/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tuannvm%2Fjira-a2a/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tuannvm%2Fjira-a2a/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tuannvm","download_url":"https://codeload.github.com/tuannvm/jira-a2a/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tuannvm%2Fjira-a2a/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29833768,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-25T17:57:15.019Z","status":"ssl_error","status_checked_at":"2026-02-25T17:56:11.472Z","response_time":61,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["a2a","a2a-mcp","a2a-protocol","ai"],"created_at":"2025-05-20T04:09:19.407Z","updated_at":"2026-02-25T18:05:30.002Z","avatar_url":"https://github.com/tuannvm.png","language":"Go","funding_links":["https://github.com/sponsors/tuannvm"],"categories":[],"sub_categories":[],"readme":"# Jira A2A Proof of Concept\n[![Build Status](https://github.com/tuannvm/jira-a2a/actions/workflows/build.yml/badge.svg)](https://github.com/tuannvm/jira-a2a/actions/workflows/build.yml)\n[![GoDoc](https://pkg.go.dev/badge/github.com/tuannvm/jira-a2a)](https://pkg.go.dev/github.com/tuannvm/jira-a2a)\n[![Coverage Status](https://coveralls.io/repos/github/tuannvm/jira-a2a/badge.svg?branch=main)](https://coveralls.io/github/tuannvm/jira-a2a?branch=main)\n## Overview\n\nThe Jira A2A system is a DevOps workflow automation platform using the [tRPC-A2A-Go framework](https://github.com/trpc-group/trpc-go/tree/main/trpc-a2a-go). It consists of independent Go agents that communicate via A2A messages, each implementing the standard TaskProcessor interface.\n\n### Agent-to-Agent (A2A) Communication\n\nAgent-to-Agent (A2A) is a decentralized messaging pattern where independent services (agents) exchange strongly-typed tasks and results over a transport layer—in this case, gRPC—without tight coupling or shared state. Each agent publishes and subscribes to tasks using the [trpc-a2a-go](https://pkg.go.dev/trpc.group/trpc-go/trpc-a2a-go) library, which:\n- Defines a common TaskProcessor interface for sending and handling tasks.\n- Serializes tasks as protobuf messages and transports them over gRPC.\n- Handles routing, retry, and backoff transparently between agents.\n\nFor more details, see the official [trpc-a2a-go GitHub repo](https://github.com/trpc-group/trpc-go/tree/main/trpc-a2a-go) and its [pkg.go.dev documentation](https://pkg.go.dev/trpc.group/trpc-go/trpc-a2a-go).\n\n## System Architecture\n\n```mermaid\nflowchart LR\n    JW[Jira Webhook] --\u003e JRA[JiraRetrievalAgent]\n    JRA --\u003e|A2A Message| IGA[InformationGatheringAgent]\n    IGA --\u003e LLM[LLM Service]\n    LLM --\u003e IGA\n    IGA --\u003e|A2A Message| JRA\n    JRA --\u003e JC[Jira Comment]\n    JRA --\u003e CPA[CopilotAgent]\n    CPA --\u003e GH[GitHub PR]\n    style JW fill:#f9f,stroke:#333,stroke-width:2px\n    style JRA fill:#bbf,stroke:#333,stroke-width:2px\n    style IGA fill:#bfb,stroke:#333,stroke-width:2px\n    style LLM fill:#fbf,stroke:#333,stroke-width:2px\n    style JC fill:#fbb,stroke:#333,stroke-width:2px\n    style CPA fill:#bff,stroke:#333,stroke-width:2px\n    style GH fill:#ffd,stroke:#333,stroke-width:2px\n```\n\n## System Sequence Diagram\n\nThe following Mermaid sequence diagram illustrates the step-by-step message flow between major system components:\n\n```mermaid\nsequenceDiagram\n    participant Jira\n    participant JiraRetrievalAgent\n    participant InformationGatheringAgent\n    participant LLM\n    participant Downstream\n\n    Jira-\u003e\u003eJiraRetrievalAgent: Webhook event (issue created/updated)\n    JiraRetrievalAgent-\u003e\u003eJira: Fetch ticket details\n    JiraRetrievalAgent--\u003e\u003eInformationGatheringAgent: Emit \"ticket-available\" task\n    InformationGatheringAgent-\u003e\u003eLLM: Analyze ticket data\n    LLM--\u003e\u003eInformationGatheringAgent: Return analysis\n    InformationGatheringAgent--\u003e\u003eJiraRetrievalAgent: Emit \"info-gathered\" message\n    JiraRetrievalAgent-\u003e\u003eJira: Post comment/update\n    JiraRetrievalAgent--\u003e\u003eDownstream: (Future) Trigger CopilotAgent/codegen\n```\n\n### Key Components\n\n- **JiraRetrievalAgent**: Handles Jira webhook events, extracts ticket information, coordinates with other agents, and posts analysis results back to Jira.\n- **InformationGatheringAgent**: Analyzes ticket information, integrates with LLM for intelligent analysis, generates insights and recommendations, and returns structured analysis results.\n- **CopilotAgent** (Planned): Receives implementation requirements, integrates with GitHub Copilot API, generates code, and creates pull requests.\n- **LLM Integration**: Provides AI-powered analysis, generates summaries and insights, identifies missing information, and recommends next actions.\n- **tRPC-A2A-Go Library**: Underlying agent-to-agent communication framework used by this system; see the [upstream repo](https://github.com/trpc-group/trpc-go/tree/main/trpc-a2a-go) for details.\n\n## System Workflow\n\n1. **Webhook Reception**: JiraRetrievalAgent receives a webhook from Jira\n2. **Data Extraction**: JiraRetrievalAgent extracts ticket details\n3. **Task Creation**: JiraRetrievalAgent creates a \"ticket-available\" task\n4. **Analysis Request**: JiraRetrievalAgent sends the task to InformationGatheringAgent\n5. **Information Analysis**: InformationGatheringAgent processes the task with LLM assistance\n6. **Results Return**: InformationGatheringAgent returns structured insights to JiraRetrievalAgent\n7. **Jira Update**: JiraRetrievalAgent posts a comment to the Jira ticket\n8. **Code Implementation**: (Future) JiraRetrievalAgent triggers CopilotAgent for code generation\n9. **Pull Request Creation**: (Future) CopilotAgent creates a GitHub pull request\n\n## Current Implementation Status\n\n- **JiraRetrievalAgent**: Fully implemented (webhook handling, Jira API integration, task coordination)\n- **InformationGatheringAgent**: Fully implemented (task processing, LLM integration, analysis generation)\n- **CopilotAgent**: Planned, not implemented\n\n## Component Details\n\n### JiraRetrievalAgent\n\n**Purpose**: Handles Jira webhooks, coordinates agents, and updates Jira tickets.\n\n**Key Functions**:\n- Processes incoming Jira webhook events\n- Retrieves ticket information from Jira API\n- Transforms Jira data into structured tasks\n- Sends tasks to the InformationGatheringAgent\n- Posts analysis results back to Jira tickets\n\n**Webhook Example**:\n```json\n{\n  \"timestamp\": 1714824000000,\n  \"webhookEvent\": \"jira:issue_created\",\n  \"issue_event_type_name\": \"issue_created\",\n  \"user\": {\n    \"accountId\": \"5d1234567890abcdef123456\",\n    \"displayName\": \"Alice Example\"\n  },\n  \"issue\": {\n    \"id\": \"10002\",\n    \"key\": \"PROJ-456\",\n    \"fields\": {\n      \"summary\": \"Cannot log in to the system\",\n      \"description\": \"User reports being unable to log in with correct credentials.\",\n      \"issuetype\": { \"name\": \"Bug\" },\n      \"priority\": { \"name\": \"High\" }\n    }\n  }\n}\n```\n\n### InformationGatheringAgent\n\n**Purpose**: Analyzes ticket information to provide structured insights and recommendations.\n\n**Key Functions**:\n- Receives \"ticket-available\" tasks from JiraRetrievalAgent\n- Processes ticket data using LLM for analysis\n- Generates structured insights and recommendations\n- Returns analysis results to JiraRetrievalAgent\n\n**Analysis Example**:\n```json\n{\n  \"ticketId\": \"PROJ-123\",\n  \"analysisResult\": {\n    \"keyThemes\": \"authentication, login, security\",\n    \"riskLevel\": \"high\",\n    \"priority\": \"high\",\n    \"technicalImpact\": \"Users unable to access the system, potential security issue\",\n    \"businessImpact\": \"Loss of productivity, customer frustration\",\n    \"suggestedComponents\": \"auth-service, user-management\",\n    \"missingInformation\": \"Browser details, error messages, steps to reproduce\"\n  },\n  \"summary\": \"This appears to be a critical login issue affecting users' ability to access the system. It's likely related to the authentication service and should be addressed with high priority.\"\n}\n```\n\n### LLM Integration\n\n- Integrates with OpenAI API (or alternative LLM providers)\n- Implements prompt engineering for consistent analysis\n- Handles API communication, rate limiting, and error handling\n- Extracts structured data from LLM responses\n\n**Configuration Example:**\n```\nLLM_ENABLED=true\nLLM_PROVIDER=openai\nLLM_MODEL=gpt-4\nLLM_API_KEY=your-openai-api-key\nLLM_MAX_TOKENS=4000\nLLM_TEMPERATURE=0.0\n```\n\n## Running the Application\n\n### Using Make\n```bash\nmake run-all       # Start all agents\nmake run-info      # Start InformationGatheringAgent\nmake run-jira      # Start JiraRetrievalAgent\nmake logs-all      # View all logs\nmake stop-all      # Stop all agents\n```\n\n### Using Docker Compose\n```bash\ndocker-compose up -d\n```\n\n### Manually\n```bash\n# Start InformationGatheringAgent\ncd cmd/infogathering\ngo build\n./infogathering\n\n# Start JiraRetrievalAgent\ncd cmd/jiraretrieval\ngo build\n./jiraretrieval\n```\n\n## Testing\n\n### Simulating a Jira Webhook\n```bash\ncurl -X POST http://localhost:8081/webhook \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"ticketId\": \"TEST-123\",\n    \"event\": \"created\"\n  }'\n```\n\n## Setup\n\n### Prerequisites\n\n- Go 1.16 or higher\n- Access to a Jira instance\n\n### Configuration\n\nThe application uses environment variables for configuration:\n\n```\n# Server configuration\nexport SERVER_PORT=8080\nexport SERVER_HOST=localhost\n\n# Agent configuration\nexport AGENT_NAME=InformationGatheringAgent\nexport AGENT_VERSION=1.0.0\nexport AGENT_URL=http://localhost:8080\n\n# Jira configuration\nexport JIRA_BASE_URL=https://your-jira-instance.atlassian.net\nexport JIRA_USERNAME=your-jira-username\nexport JIRA_API_TOKEN=your-jira-api-token\n\n# Authentication\nexport AUTH_TYPE=apikey  # \"jwt\" or \"apikey\"\nexport API_KEY=your-api-key\nexport JWT_SECRET=your-jwt-secret  # Only needed if AUTH_TYPE=jwt\n```\n\n### Running the Application\n\n1. Build and run the InformationGatheringAgent:\n\n```bash\ncd cmd/infogathering\ngo build\n./infogathering\n```\n\n2. The agent will start on the configured port (default: 8080) and listen for \"ticket-available\" tasks.\n\n## Testing\n\n### Simulating a Jira Webhook\n\nYou can simulate a Jira webhook by sending a POST request to the agent:\n\n```bash\ncurl -X POST http://localhost:8080/task \\\n  -H \"Content-Type: application/json\" \\\n  -H \"X-API-Key: your-api-key\" \\\n  -d '{\n  \"ticketId\": \"PROJ-123\",\n  \"summary\": \"Implement new feature\",\n  \"metadata\": {\n    \"priority\": \"High\",\n    \"reporter\": \"John Doe\"\n  }\n}'\n```\n\n### Using the Client Example\n\nThe `client_example.go` file contains examples of how to use the A2A client to send a \"ticket-available\" task and how to simulate a Jira webhook.\n\n## Future Work\n\n1. **JiraRetrievalAgent**\n   - Listen for new Jira ticket webhooks\n   - Emit a \"ticket-available\" A2A task with ticket information\n\n## Known Limitations and Future Improvements\n\n- Components are tightly coupled; refactoring for modularity is planned\n- Limited context in error messages; structured logging should be improved\n- Insufficient unit and integration tests; coverage will be expanded\n- Configuration validation and security enhancements are planned\n- CopilotAgent and code generation are planned for future releases\n\n## Contributing\n\n1. Fork the repository\n2. Create a feature branch\n3. Make your changes\n4. Write tests for your changes\n5. Submit a pull request\n\n## License\n\n[MIT](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftuannvm%2Fjira-a2a","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftuannvm%2Fjira-a2a","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftuannvm%2Fjira-a2a/lists"}