Community edition generated from private repo via sync pipeline. Includes 9 plugins (WordPress, WooCommerce, WP Advanced, Gitea, n8n, Supabase, OpenPanel, Appwrite, Directus) with ~587 tools. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
246 lines
9.0 KiB
Python
246 lines
9.0 KiB
Python
"""User & Organization Handler - manages Gitea users, organizations, and teams"""
|
|
|
|
import json
|
|
from typing import Any
|
|
|
|
from plugins.gitea.client import GiteaClient
|
|
|
|
def get_tool_specifications() -> list[dict[str, Any]]:
|
|
"""Return tool specifications for ToolGenerator"""
|
|
return [
|
|
# === USERS ===
|
|
{
|
|
"name": "get_user",
|
|
"method_name": "get_user",
|
|
"description": "Get information about a Gitea user by username.",
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"username": {
|
|
"type": "string",
|
|
"description": "Username to look up",
|
|
"minLength": 1,
|
|
}
|
|
},
|
|
"required": ["username"],
|
|
},
|
|
"scope": "read",
|
|
},
|
|
{
|
|
"name": "list_user_repos",
|
|
"method_name": "list_user_repos",
|
|
"description": "List all public repositories of a Gitea user.",
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"username": {"type": "string", "description": "Username", "minLength": 1},
|
|
"page": {
|
|
"type": "integer",
|
|
"description": "Page number",
|
|
"default": 1,
|
|
"minimum": 1,
|
|
},
|
|
"limit": {
|
|
"type": "integer",
|
|
"description": "Items per page (1-100)",
|
|
"default": 30,
|
|
"minimum": 1,
|
|
"maximum": 100,
|
|
},
|
|
},
|
|
"required": ["username"],
|
|
},
|
|
"scope": "read",
|
|
},
|
|
{
|
|
"name": "search_users",
|
|
"method_name": "search_users",
|
|
"description": "Search for Gitea users by query or user ID.",
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"q": {
|
|
"anyOf": [{"type": "string"}, {"type": "null"}],
|
|
"description": "Search query (username or full name)",
|
|
},
|
|
"uid": {
|
|
"anyOf": [{"type": "integer"}, {"type": "null"}],
|
|
"description": "User ID to search for",
|
|
},
|
|
},
|
|
},
|
|
"scope": "read",
|
|
},
|
|
# === ORGANIZATIONS ===
|
|
{
|
|
"name": "list_organizations",
|
|
"method_name": "list_organizations",
|
|
"description": "List organizations for the current authenticated user.",
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"page": {
|
|
"type": "integer",
|
|
"description": "Page number",
|
|
"default": 1,
|
|
"minimum": 1,
|
|
},
|
|
"limit": {
|
|
"type": "integer",
|
|
"description": "Items per page (1-100)",
|
|
"default": 30,
|
|
"minimum": 1,
|
|
"maximum": 100,
|
|
},
|
|
},
|
|
},
|
|
"scope": "read",
|
|
},
|
|
{
|
|
"name": "get_organization",
|
|
"method_name": "get_organization",
|
|
"description": "Get information about a Gitea organization by name.",
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"org": {"type": "string", "description": "Organization name", "minLength": 1}
|
|
},
|
|
"required": ["org"],
|
|
},
|
|
"scope": "read",
|
|
},
|
|
{
|
|
"name": "list_org_repos",
|
|
"method_name": "list_org_repos",
|
|
"description": "List all repositories of an organization.",
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"org": {"type": "string", "description": "Organization name", "minLength": 1},
|
|
"page": {
|
|
"type": "integer",
|
|
"description": "Page number",
|
|
"default": 1,
|
|
"minimum": 1,
|
|
},
|
|
"limit": {
|
|
"type": "integer",
|
|
"description": "Items per page (1-100)",
|
|
"default": 30,
|
|
"minimum": 1,
|
|
"maximum": 100,
|
|
},
|
|
},
|
|
"required": ["org"],
|
|
},
|
|
"scope": "read",
|
|
},
|
|
# === TEAMS ===
|
|
{
|
|
"name": "list_org_teams",
|
|
"method_name": "list_org_teams",
|
|
"description": "List all teams in an organization.",
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"org": {"type": "string", "description": "Organization name", "minLength": 1},
|
|
"page": {
|
|
"type": "integer",
|
|
"description": "Page number",
|
|
"default": 1,
|
|
"minimum": 1,
|
|
},
|
|
"limit": {
|
|
"type": "integer",
|
|
"description": "Items per page (1-100)",
|
|
"default": 30,
|
|
"minimum": 1,
|
|
"maximum": 100,
|
|
},
|
|
},
|
|
"required": ["org"],
|
|
},
|
|
"scope": "read",
|
|
},
|
|
{
|
|
"name": "list_team_members",
|
|
"method_name": "list_team_members",
|
|
"description": "List all members of a team.",
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"team_id": {"type": "integer", "description": "Team ID", "minimum": 1},
|
|
"page": {
|
|
"type": "integer",
|
|
"description": "Page number",
|
|
"default": 1,
|
|
"minimum": 1,
|
|
},
|
|
"limit": {
|
|
"type": "integer",
|
|
"description": "Items per page (1-100)",
|
|
"default": 30,
|
|
"minimum": 1,
|
|
"maximum": 100,
|
|
},
|
|
},
|
|
"required": ["team_id"],
|
|
},
|
|
"scope": "read",
|
|
},
|
|
]
|
|
|
|
async def get_user(client: GiteaClient, username: str) -> str:
|
|
"""Get user information"""
|
|
user = await client.get_user(username)
|
|
result = {"success": True, "user": user}
|
|
return json.dumps(result, indent=2)
|
|
|
|
async def list_user_repos(
|
|
client: GiteaClient, username: str, page: int = 1, limit: int = 30
|
|
) -> str:
|
|
"""List user repositories"""
|
|
repos = await client.list_user_repos(username, page=page, limit=limit)
|
|
result = {"success": True, "count": len(repos), "repositories": repos}
|
|
return json.dumps(result, indent=2)
|
|
|
|
async def search_users(client: GiteaClient, q: str | None = None, uid: int | None = None) -> str:
|
|
"""Search users"""
|
|
users = await client.search_users(query=q, uid=uid)
|
|
result = {"success": True, "count": len(users), "users": users}
|
|
return json.dumps(result, indent=2)
|
|
|
|
# Organization operations
|
|
async def list_organizations(client: GiteaClient, page: int = 1, limit: int = 30) -> str:
|
|
"""List organizations"""
|
|
orgs = await client.list_organizations(page=page, limit=limit)
|
|
result = {"success": True, "count": len(orgs), "organizations": orgs}
|
|
return json.dumps(result, indent=2)
|
|
|
|
async def get_organization(client: GiteaClient, org: str) -> str:
|
|
"""Get organization information"""
|
|
organization = await client.get_organization(org)
|
|
result = {"success": True, "organization": organization}
|
|
return json.dumps(result, indent=2)
|
|
|
|
async def list_org_repos(client: GiteaClient, org: str, page: int = 1, limit: int = 30) -> str:
|
|
"""List organization repositories"""
|
|
repos = await client.list_org_repos(org, page=page, limit=limit)
|
|
result = {"success": True, "count": len(repos), "repositories": repos}
|
|
return json.dumps(result, indent=2)
|
|
|
|
# Team operations
|
|
async def list_org_teams(client: GiteaClient, org: str, page: int = 1, limit: int = 30) -> str:
|
|
"""List organization teams"""
|
|
teams = await client.list_org_teams(org, page=page, limit=limit)
|
|
result = {"success": True, "count": len(teams), "teams": teams}
|
|
return json.dumps(result, indent=2)
|
|
|
|
async def list_team_members(
|
|
client: GiteaClient, team_id: int, page: int = 1, limit: int = 30
|
|
) -> str:
|
|
"""List team members"""
|
|
members = await client.list_team_members(team_id, page=page, limit=limit)
|
|
result = {"success": True, "count": len(members), "members": members}
|
|
return json.dumps(result, indent=2)
|