mirror of
https://github.com/MervinPraison/PraisonAI.git
synced 2026-11-09 03:39:37 -10:00
* feat: add Linear integration — agentic control plane with tools + LinearBot + AgentSession webhooks - Add linear_tools.py with 9 GraphQL tools (search, create, update issues, comments, cycles) - Add LinearBot adapter with HMAC-SHA256 webhook verification and AgentSession handling - Add Linear platform to bot registry, CLI commands, and gateway integration - Support both LINEAR_OAUTH_TOKEN (OAuth) and LINEAR_API_KEY (personal) authentication - Include example configurations (YAML and Python) for zero-code and programmatic usage - Follow protocol-driven architecture: tools in core SDK, bot implementation in wrapper - Zero import-time cost via lazy loading, full BotProtocol compliance Closes #1612 🤖 Generated with [Claude Code](https://claude.ai/code) Co-authored-by: MervinPraison <[email protected]> * fix: correct four bugs in Linear integration found during review - _handle_agent_message: replace non-existent get_session() context manager with correct _session_mgr.chat() call (matches Slack/Telegram pattern in _session.py) - _gql_query: fix aiohttp timeout — bare int 30 → ClientTimeout(total=30) - bot_linear CLI: fix web_provider= → web_search_provider= to match BotCapabilities dataclass field (same as all other bot commands) - bot_linear CLI: add `or []` guards for tools/skills/knowledge_sources to prevent None being passed where list is expected (matches all other bot commands) Agent-Logs-Url: https://github.com/MervinPraison/PraisonAI/sessions/645d14d2-c605-41bf-b83a-839209e7e3b9 Co-authored-by: MervinPraison <[email protected]> * fix: resolve 3 blocking Linear integration bugs - Fix BotMessage constructor field names (id->message_id, text->content) - Fix OAuth Bearer token handling in both tools and bot implementations - Fix send_message signature to match BotProtocol specification All fixes verified against the original bug reproduction cases. Co-authored-by: Mervin Praison <[email protected]> * refactor: relocate Linear tools to praisonai-tools (canonical home) Linear GraphQL wrappers don't belong in the protocol-first core SDK (per AGENTS.md §4.1). They duplicated an already-shipped LinearTool in MervinPraison/PraisonAI-Tools and pulled third-party SaaS HTTP plumbing into praisonaiagents/tools/. This commit: - Removes praisonaiagents/tools/linear_tools.py (the new file) - Reverts the 9 TOOL_MAPPINGS additions and the 3 lookup-list entries - Leaves LinearBot in praisonai/bots/linear.py unchanged (correct location: wrapper-side webhook adapter) The full Linear tool surface (search/get/create/update/comment/list cycles/ list states/list teams) is being landed in MervinPraison/PraisonAI-Tools#31 with OAuth Bearer support and 36 unit tests. Users get it via: from praisonai_tools import LinearTool praisonai-tools is already a runtime dep of praisonai (pyproject.toml:102), so end-user UX is unchanged. --------- Co-authored-by: praisonai-triage-agent[bot] <272766704+praisonai-triage-agent[bot]@users.noreply.github.com> Co-authored-by: MervinPraison <[email protected]> Co-authored-by: copilot-swe-agent[bot] <[email protected]> Co-authored-by: MervinPraison <[email protected]> Co-authored-by: praison <[email protected]>
68 lines
1.9 KiB
Python
68 lines
1.9 KiB
Python
"""
|
|
Linear Agent Example for PraisonAI.
|
|
|
|
Demonstrates how to create a Linear bot that responds to issue mentions
|
|
and assignments with full coding capabilities.
|
|
"""
|
|
|
|
import asyncio
|
|
from praisonaiagents import Agent
|
|
from praisonai.bots import LinearBot
|
|
|
|
# Create an agent with Linear tools and coding capabilities
|
|
agent = Agent(
|
|
name="PraisonAI Coder",
|
|
instructions="""
|
|
You are an autonomous coding agent integrated with Linear.
|
|
|
|
When you are mentioned or assigned an issue:
|
|
1. Analyze the issue description and requirements
|
|
2. Break down complex tasks into smaller steps
|
|
3. Use available tools to implement solutions
|
|
4. Update the issue with progress comments
|
|
5. Create GitHub pull requests when code changes are needed
|
|
|
|
Focus on being helpful, thorough, and providing clear updates.
|
|
""",
|
|
llm="gpt-4o-mini",
|
|
tools=[
|
|
"linear_search_issues",
|
|
"linear_get_issue",
|
|
"linear_add_comment",
|
|
"linear_update_issue",
|
|
"linear_list_teams",
|
|
"linear_list_issue_states",
|
|
"github_create_branch",
|
|
"github_commit_and_push",
|
|
"github_create_pull_request",
|
|
"read_file",
|
|
"write_file",
|
|
"execute_command"
|
|
],
|
|
memory=True,
|
|
web_search=True,
|
|
auto_approve_tools=True,
|
|
)
|
|
|
|
# Create Linear bot
|
|
bot = LinearBot(
|
|
token="your-linear-oauth-token", # or set LINEAR_OAUTH_TOKEN env var
|
|
signing_secret="your-webhook-secret", # or set LINEAR_WEBHOOK_SECRET env var
|
|
agent=agent,
|
|
webhook_port=8080,
|
|
)
|
|
|
|
async def main():
|
|
"""Start the Linear bot."""
|
|
print("Starting Linear bot...")
|
|
print("Set up your Linear webhook to point to: http://your-host:8080/webhook")
|
|
print("Configure AgentSession and Comment events in Linear webhook settings")
|
|
|
|
try:
|
|
await bot.start()
|
|
except KeyboardInterrupt:
|
|
print("\nStopping bot...")
|
|
await bot.stop()
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(main()) |