Files
Actions/codex-reply/action.yml
codex adbbaf54a4 fix: converte \n letterali in newline reali nei commenti (#25)
## Bug
I commenti mostravano \n letterali invece di newline.

## Cause
1. LINK_MD in doppi apici bash: \n e' letterale, non newline
2. AI puo' produrre \n doppiamente escapat. nel JSON

## Fix
- LINK_MD: newline reali invece di \n letterali
- COMMENT/MD_CONTENT: sed per convertire \n in newline

Per commenti vecchi non retroattivo.

Co-authored-by: codex <codex@incloud.ovh>
Reviewed-on: #25
Co-authored-by: codex <codex@noreply.localhost>
Co-committed-by: codex <codex@noreply.localhost>
2026-05-31 11:54:03 +00:00

137 lines
5.0 KiB
YAML

name: Codex Reply
description: "Risponde a un commento @codex analizzando issue, cronologia e codice repository."
inputs:
issue-number:
description: Numero dell'issue.
required: true
repository:
description: Repository in formato owner/repo.
required: true
comment-body:
description: Testo del commento che contiene @codex.
required: true
comment-author:
description: Login dell'autore del commento.
required: true
issue-title:
description: Titolo dell'issue.
required: true
issue-body:
description: Corpo dell'issue.
required: true
api-token:
description: Token API Gitea.
required: true
gitea-host:
description: URL del server Gitea.
required: false
default: "https://git.incloud.ovh"
api-key:
description: API key per opencode.
required: true
model:
description: Modello AI in formato provider/model.
required: false
default: "opencode-go/deepseek-v4-flash"
runs:
using: composite
steps:
- name: Configura autenticazione opencode
shell: bash
run: |
set -euo pipefail
if ! command -v jq &> /dev/null; then
echo "jq non trovato, tentativo di installazione..."
if command -v apt-get &> /dev/null; then
apt-get update -qq && apt-get install -y -qq jq 2>&1 || true
elif command -v apk &> /dev/null; then
apk add --no-cache jq 2>&1 || true
fi
command -v jq &> /dev/null || { echo "ERRORE: impossibile installare jq."; exit 1; }
fi
mkdir -p ~/.local/share/opencode
jq -n \
--arg provider "opencode-go" \
--arg key "${{ inputs.api-key }}" \
'{($provider): {type: "api", key: $key}}' > ~/.local/share/opencode/auth.json
chmod 600 ~/.local/share/opencode/auth.json
- name: Rispondi a @codex
id: codex
shell: bash
run: |
set -euo pipefail
if ! command -v curl &> /dev/null; then
echo "curl non trovato, tentativo di installazione..."
if command -v apt-get &> /dev/null; then
apt-get update -qq && apt-get install -y -qq curl 2>&1 || true
elif command -v apk &> /dev/null; then
apk add --no-cache curl 2>&1 || true
fi
command -v curl &> /dev/null || { echo "ERRORE: impossibile installare curl."; exit 1; }
fi
HOST="${{ inputs.gitea-host }}"
TOKEN="${{ inputs.api-token }}"
REPO="${{ inputs.repository }}"
ISSUE_NUM="${{ inputs.issue-number }}"
AUTHOR="${{ inputs.comment-author }}"
MODEL_ARG=()
[ -n "${{ inputs.model }}" ] && MODEL_ARG=(--model "${{ inputs.model }}")
# Estrai la domanda dopo @codex
QUERY=$(echo "${{ inputs.comment-body }}" | sed -n 's/.*@codex[[:space:],:]*//p')
if [ -z "$QUERY" ]; then
QUERY="(nessuna domanda specifica dopo @codex)"
fi
# Recupera cronologia commenti, escludendo quelli del bot
COMMENTS_JSON=$(curl -sS -f "$HOST/api/v1/repos/$REPO/issues/$ISSUE_NUM/comments" \
-H "Authorization: token $TOKEN" \
-H "Accept: application/json" 2>/dev/null || echo "[]")
COMMENTS_TEXT=$(echo "$COMMENTS_JSON" | jq -r '
[.[] | select(.user.login != "codex")]
| sort_by(.created_at)
| .[-20:]
| .[]
| "**\(.user.login)**: \(.body)\n"
' 2>/dev/null || echo "")
# Costruisci il prompt
BODY=$(echo "${{ inputs.issue-body }}" | head -c 10000)
[ "${#BODY}" -ge 10000 ] && BODY+=$'\n... (troncato)'
printf -v PROMPT '%s\n\n%s\n%s\n\n## %s\n%s\n%s\n\n## %s\n%s\n\n## %s - @%s\n%s' \
"Sei un assistente esperto per repository software." \
"Rispondi alla domanda in modo diretto e tecnico, in italiano." \
"Analizza il codice sorgente nel repository quando e' rilevante." \
"Issue" \
"**Titolo**: ${{ inputs.issue-title }}" \
"**Corpo**: $BODY" \
"Cronologia commenti" "$COMMENTS_TEXT" \
"Domanda" "$AUTHOR" "$QUERY"
# Esegui opencode
OUTFILE="$GITHUB_WORKSPACE/opencode-codex.txt"
opencode run "$PROMPT" "${MODEL_ARG[@]}" --dangerously-skip-permissions 2>&1 | tee "$OUTFILE"
# Pulisci la risposta: togli ANSI codes, banner build, righe vuote iniziali
ESC=$(printf '\x1b')
sed "s/${ESC}\[[0-9;]*m//g" "$OUTFILE" > /tmp/codex-clean.txt
RESPONSE=$(sed '/^> build /d; /^[[:space:]]*$/d; s/\\n/\n/g' /tmp/codex-clean.txt)
if [ -z "$RESPONSE" ]; then
RESPONSE="Mi dispiace, non ho generato una risposta. Riprova."
fi
# Pubblica il commento
COMMENT_JSON=$(jq -n --arg body "$RESPONSE" '{body: $body}')
curl -sS -X POST "$HOST/api/v1/repos/$REPO/issues/$ISSUE_NUM/comments" \
-H "Authorization: token $TOKEN" \
-H "Content-Type: application/json" \
-d "$COMMENT_JSON" 2>/dev/null && \
echo "Risposta @codex pubblicata sull'issue #$ISSUE_NUM" || \
echo "WARN: Impossibile pubblicare la risposta"