OpenCode × Gitea Actions

Repository di test per l'integrazione tra Gitea Actions e agenti AI OpenCode. Automazione agentica su eventi di issue, PR, commenti e dispatch manuale.

Gitea Actions  ·  OpenCode  ·  AI Agents

Repo Intent

Questo repository รจ un banco di prova per l'**automazione agentica** tramite [OpenCode](https://opencode.ai) su eventi di Gitea, utilizzando le **Gitea Actions** come runtime di esecuzione. L'obiettivo รจ verificare il ciclo completo: 1. Un evento (push, issue aperta, commento su issue o PR, esecuzione manuale) triggera un workflow. 2. Un agente AI analizza la richiesta, produce un piano, lo implementa, lo verifica e apre una Pull Request. 3. Il tutto avviene in modo **autonomo**, con sole reazioni (๐Ÿ‘€, ๐Ÿš€, ๐Ÿ˜•) come feedback โ€” senza commenti che genererebbero loop infiniti. ### Workflow presenti | Workflow | File | Descrizione | |---|---|---| | **Gitea Actions Demo** | `.gitea/workflows/demo.yml` | Workflow dimostrativo su push: mostra le variabili d'ambiente Gitea ed elenca i file. Puramente educativo. | | **OpenCode Gitea Integration** | `.gitea/workflows/opencode.yml` | Automazione agentica completa: pianifica, implementa e revisiona codice su eventi issue/PR/commento/manuale. | | **Publish Docker Image** | `.gitea/workflows/publish.yml` | Build e push di un'immagine Docker su tag `v*` o dispatch manuale, con deploy su VPS via SSH. |

Workflow opencode.yml per filo e per segno

Il cuore del repository. Ecco ogni passo del workflow, nell'ordine esatto in cui viene eseguito.

  1. Verifica autorizzazione utente

    Controlla che l'autore dell'evento sia nella whitelist (maria, nicola). Le esecuzioni manuali (workflow_dispatch) saltano questo controllo. Se l'utente non รจ autorizzato, il job viene interrotto con errore.

  2. Reagisci al comando (๐Ÿ‘€)

    Aggiunge una reazione "eyes" all'issue o al commento che ha triggerato il workflow. Le reazioni non generano eventi issue_comment, quindi non c'รจ rischio di auto-trigger o loop infiniti.

  3. Checkout repository

    Clona il repository con fetch-depth: 0 (storia completa) tramite actions/checkout@v4.

  4. Installazione OpenCode CLI

    Scarica e installa la CLI di OpenCode via curl -fsSL https://opencode.ai/install | bash. Aggiunge $HOME/.opencode/bin al PATH.

  5. Configura agent reviewer (read-only)

    Crea un agente reviewer con permessi di sola lettura: puรฒ solo leggere file ed eseguire comandi (build, lint, test). Non puรฒ mai modificare il codice. Il file viene escluso dal tracker tramite .git/info/exclude.

  6. Determina contesto (issue / PR / manuale) e branch di lavoro

    Analizza il tipo di evento:

    • PR โ€” fa il fetch e checkout del branch della PR.
    • Issue โ€” crea un branch opencode-issue-<N> a partire da main.
    • Manuale โ€” crea un branch opencode-manual-<run_number>.

    Genera anche una plan_key univoca per salvare il file di piano.

  7. Raccogli contesto aggiuntivo (diff + commenti, se PR)

    Se si tratta di una Pull Request, scarica il diff della PR e i commenti recenti per fornire contesto completo all'agente AI.

  8. Pulisci il comando dal trigger

    Rimuove i marcatori /oc e /opencode dal corpo del messaggio, lasciando solo le istruzioni utente da passare all'agente.

  9. Fase 1 โ€” Plan (analisi read-only)

    Eseguita solo per issue (non PR). L'agente plan analizza il codebase e la richiesta, poi produce un piano di lavoro in Markdown con struttura standard (Obiettivo, Task, Acceptance Criteria, Verifica). Il piano viene salvato in issue_plans/ e committato.

  10. Fase 2 โ€” Build & Review loop

    Il cuore dell'automazione: un loop che alterna Build (implementazione) e Review (verifica), fino a $MAX_ITERATIONS (4).

    • BUILD โ€” L'agente build implementa il piano, modificando i file necessari.
    • REVIEW โ€” L'agente reviewer (read-only) verifica se ogni Acceptance Criterion รจ soddisfatto e produce un VERDICT: PASS (loop termina) o FAIL (loop continua col feedback).

    Se dopo 4 iterazioni il PASS non รจ raggiunto, le modifiche parziali vengono comunque pushate per revisione umana.

  11. Pusha modifiche e apri/aggiorna la PR

    Commatta e pusha le modifiche sul branch di lavoro. Se si lavora su un'issue (non PR), apre automaticamente una Pull Request verso main. Se la PR esiste giร , ne recupera il numero.

  12. Posta la review sulla PR

    Se esiste una PR, posta la review finale dell'agente usando l'API di Gitea. Se il verdetto รจ PASS, la review รจ di tipo APPROVE; altrimenti REQUEST_CHANGES. Se Gitea rifiuta (self-review del bot), ripiega su COMMENT.

  13. Reazione finale ๐Ÿš€ / ๐Ÿ˜•

    Se il workflow termina con success(), aggiunge una reazione ๐Ÿš€ all'elemento trigger. In caso di failure(), aggiunge ๐Ÿ˜• (confused).

Diagramma di flusso generale

flowchart LR
    A[Evento Trigger] --> B{Autorizzato?}
    B -- No --> X[โŒ Interrompi]
    B -- Sรฌ --> C[๐Ÿ‘€ Reazione eyes]
    C --> D[๐Ÿ“ฆ Checkout]
    D --> E[โฌ‡๏ธ Installa OpenCode]
    E --> F[๐Ÿ”ง Configura reviewer]
    F --> G{Contesto?}
    G -- PR --> H1[Fetch & checkout PR]
    G -- Issue --> H2[Branch opencode-issue-N]
    G -- Manuale --> H3[Branch opencode-manual-RUN]
    H1 & H2 & H3 --> I[๐Ÿ“‹ Raccogli contesto]
    I --> J[๐Ÿงน Pulisci comando]
    J --> K{รˆ issue?}
    K -- Sรฌ --> L[๐Ÿ“ Fase Plan]
    L --> M
    K -- No --> M[๐Ÿ”„ Build & Review loop]
    M --> N{VERDICT PASS?}
    N -- Sรฌ --> O[โœ… Push & PR]
    N -- No --> P{Iterazioni < MAX?}
    P -- Sรฌ --> M
    P -- No --> O
    O --> Q[๐Ÿ“ฌ Posta review]
    Q --> R[๐Ÿš€ Reazione finale]
            

Diagramma di sequenza Gitea โ†’ Runner โ†’ OpenCode

sequenceDiagram
    participant U as Utente
    participant G as Gitea
    participant R as Gitea Runner
    participant O as OpenCode CLI
    participant A as Agenti AI

    U->>G: Apre issue/commenta con /oc
    G->>R: Triggera workflow
    R->>R: Verifica autorizzazione
    R->>G: ๐Ÿ‘€ Reazione eyes
    R->>R: Checkout & installa CLI
    R->>O: opencode run --agent plan
    O->>A: Analisi codebase
    A-->>O: Piano Markdown
    O-->>R: Piano salvato
    loop Build & Review (max 4)
        R->>O: opencode run --agent build
        O->>A: Implementa piano
        A-->>O: Modifiche ai file
        O-->>R: Codice modificato
        R->>O: opencode run --agent reviewer
        O->>A: Verifica criteri
        A-->>O: VERDICT PASS/FAIL
        O-->>R: Risultato review
        alt PASS
            R->>R: Esce dal loop
        else FAIL
            R->>R: Continua iterazione
        end
    end
    R->>G: Push modifiche & PR
    R->>G: ๐Ÿš€ Reazione finale
            

Diagramma del loop Build/Review con criterio di uscita VERDICT

flowchart TD
    START([๐Ÿ”„ Inizio loop]) --> BUILD[๐Ÿ‘ท Fase BUILD
Agente implementa il piano] BUILD --> REVIEW[๐Ÿ” Fase REVIEW
Agente verifica criteri] REVIEW --> DECIDE{VERDICT?} DECIDE -- PASS โœ… --> EXIT([๐Ÿ Esci dal loop
โœ… Successo]) DECIDE -- FAIL โŒ --> CHECK{Iterazioni < MAX?} CHECK -- Sรฌ --> FEEDBACK[๐Ÿ’ฌ Feedback: criteri insoddisfatti] FEEDBACK --> BUILD CHECK -- No --> MAXOUT([โš ๏ธ Raggiunto tetto MAX
Pusha modifiche parziali])

Trigger ed Eventi

Il workflow `opencode.yml` si attiva sui seguenti eventi di Gitea: | Evento | Tipo | Descrizione | Trigger per `/oc` | |---|---|---|---| | `issues` | `opened` | Apertura di una nuova issue | Il corpo della issue contiene `/oc` o `/opencode` | | `issue_comment` | `created` | Nuovo commento su una issue | Il commento contiene `/oc` o `/opencode` | | `pull_request_review_comment` | `created` | Nuovo commento su una PR | Il commento contiene `/oc` o `/opencode` | | `workflow_dispatch` | manuale | Esecuzione manuale da UI/API | Sempre attivo (campo `prompt` richiesto) | ### Filtri di attivazione Oltre al contenuto del messaggio, il workflow verifica che: - L'autore **non** sia `opencode-bot` (evita auto-trigger) - L'autore sia nella **whitelist** (tranne per esecuzione manuale) - Il corpo del messaggio contenga `/oc` o `/opencode` (tranne per dispatch manuale)

Autorizzazione e Sicurezza

### Whitelist utenti Solo gli utenti autorizzati possono invocare l'agente AI: - `maria` - `nicola` Per le esecuzioni manuali (`workflow_dispatch`) il controllo รจ bypassato. ### Blocco auto-trigger I commenti pubblicati da `opencode-bot` vengono ignorati: il workflow non risponde ai propri stessi messaggi, prevenendo loop infiniti. ### Reazioni (non commenti) Il workflow interagisce con issue e PR esclusivamente tramite **reazioni** (๐Ÿ‘€, ๐Ÿš€, ๐Ÿ˜•). Le reazioni non generano eventi `issue_comment`, quindi non possono innescare nuove esecuzioni del workflow. ### Secret utilizzati | Secret | Descrizione | |---|---| | `BOT_GITEA_TOKEN` | Token di accesso per l'API di Gitea (operazioni CRUD su repo, issue, PR) | | `OPENCODE_ZEN_API_KEY` | API key per il provider OpenAI-compatible di OpenCode |