Files
coding-agent-gitea/AGENTS.md
T
michael 0461c6c7ab Add .gitignore and pyproject.toml (#1)
### Findings and Changes

#### Changes:
- **Added **: Included a standard Python  to avoid tracking unnecessary files (e.g., , , ).
- **Added **: Prepared the project for better dependency management.
- **Enhanced Gitea Tools**:
    - Implemented  in .
    - Implemented  (via ) in .

#### Implementation Details:
- Used the Gitea API to programmatically create a new branch and commit files directly from a script.
- Verified that the NAME:
   tea - command line tool to interact with Gitea

USAGE:
   tea [global options] [command [command options]]

VERSION:
   Version: 0.14.1  golang: 1.26.3  go-sdk: v0.25.1

DESCRIPTION:
   tea is a productivity helper for Gitea. It can be used to manage most entities on
   one or multiple Gitea instances & provides local helpers like 'tea pr checkout'.

   tea tries to make use of context provided by the repository in $PWD if available.
   tea works best in a upstream/fork workflow, when the local main branch tracks the
   upstream repo. tea assumes that local git state is published on the remote before
   doing operations with tea.    Configuration is persisted in $XDG_CONFIG_HOME/tea.

COMMANDS:
   help, h  Shows a list of commands or help for one command

   ENTITIES:
     issues, issue, i                  List, create and update issues
     pulls, pull, pr                   Manage and checkout pull requests
     labels, label                     Manage issue labels
     milestones, milestone, ms         List and create milestones
     releases, release, r              Manage releases
     times, time, t                    Operate on tracked times of a repository's issues & pulls
     organizations, organization, org  List, create, delete organizations
     repos, repo                       Manage repositories
     branches, branch, b               Consult branches
     actions, action                   Manage repository actions
     webhooks, webhook, hooks, hook    Manage webhooks
     comment, c                        Add a comment to an issue / pr

   HELPERS:
     open, o                         Open something of the repository in web browser
     notifications, notification, n  Show notifications
     clone, C                        Clone a repository locally
     api                             Make an authenticated API request

   MISCELLANEOUS:
     whoami    Show current logged in user
     admin, a  Operations requiring admin access on the Gitea instance

   SETUP:
     logins, login      Log in to a Gitea server
     logout             Log out from a Gitea server
     ssh-keys, ssh-key  Manage SSH public keys

GLOBAL OPTIONS:
   --debug, --vvv  Enable debug mode
   --help, -h      show help
   --version, -v   print the version CLI can be used for automated PR creation.
- Successfully configured Git user identity and remote tracking in the environment.

---------

Co-authored-by: Michael <michael@example.com>
Reviewed-on: #1
2026-06-28 18:38:28 +02:00

3.4 KiB

Agent Instructions

Python Type Hints (REQUIRED)

  • All functions must have type hints for parameters and return types.
  • All class attributes must have type hints in __init__.
  • Use typing module for complex types: list[int], dict[str, Any], str | None, Callable[..., Any].
  • Never use bare list or dict - always parameterize: list[str], dict[str, Any].
  • Use Any sparingly - only when interfacing with untyped libraries or dynamic data.
  • Module-level constants must have type hints: VERSION: str = "1.0".
  • Tuple return types: use tuple[str, int] for multiple returns.

Dataclasses (REQUIRED for complex data)

  • Prefer @dataclass for any class representing structured data with multiple fields.
  • Use dataclasses.field() for default values that are mutable (lists, dicts).
  • Use field(default_factory=list) instead of default=[].
  • Use field(default_factory=dict) instead of default={}.
  • Use kw_only=True for dataclasses with many optional fields.
  • Use frozen=True for immutable dataclasses when appropriate.
  • Example:
    from dataclasses import dataclass, field
    from typing import Optional
    
    @dataclass
    class IssueInfo:
        number: int
        title: str
        owner: str
        repo: str
        labels: list[str] = field(default_factory=list)
        assignee: Optional[str] = None
    

Follow all instructions provided in the system prompt.

  • Keep responses concise and direct.
  • Minimize output tokens.
  • Use the Task tool for complex multi-step tasks.
  • Verify solutions with tests if possible.
  • Run lint and typecheck commands if provided.
  • Do not commit changes unless explicitly asked.
  • Use GitHub-flavored markdown for formatting.
  • Answer concisely with fewer than 4 lines of text.
  • ALWAYS use uv to run python commands. Do not use python3 directly.
  • Always commit and push changes at the end of a task.
  • NEVER push to the master or main branch.

Environment Variables

  • GITEA_URL — Gitea API base URL (REQUIRED)
  • GITEA_TOKEN — Gitea API token (REQUIRED)
  • GITEA_REPOS_ROOT — Local path to clone repos to (REQUIRED)
  • AGENT_MODEL_ID — LM Studio model ID (default: qwen/qwen3.6-35b-a3b)
  • AGENT_MAX_RETRIES — Max retries per task (default: 2)

Architecture

The agent uses a repo-scoped single-agent dispatch pattern:

  1. AgentOrchestrator polls Gitea for assigned issues/PRs
  2. Tasks are grouped by repo and enqueued in WorkQueue
  3. AgentDispatcher creates a fresh CodingAgent per repo batch
  4. Agent processes all tasks for one repo, then is discarded (context cleared)
  5. Next repo gets a fresh agent — no context bleed between repos
main.py (polling loop every 60s)
  └── AgentOrchestrator
        ├── WorkQueue (grouped by repo)
        └── AgentDispatcher
              └── CodingAgent (one at a time, discarded after each repo)

Running the Agent

# Activate the virtual environment
uv sync

# Run the agent
uv run start-agent

Repository Scope

  • The agent MUST ONLY operate on repos within the meeks organization.
  • gitea/client.py:48 enforces this with a hardcoded filter: if r.get("owner", {}).get("login") == "meeks"
  • Never change this filter to include personal accounts (e.g., meeks-ai) or other organizations.
  • This filter is the single source of truth for repo scope — do not bypass it.