Enhance triage: analisi codice, gap analysis, report MD come asset
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
name: Triage Issue
|
name: Triage Issue
|
||||||
description: Analizza una issue con opencode e la classifica come bug o richiesta.
|
description: Analizza una issue con opencode: classifica, riassume, gap analisi e produce report MD.
|
||||||
|
|
||||||
inputs:
|
inputs:
|
||||||
issue-title:
|
issue-title:
|
||||||
@@ -87,13 +87,16 @@ runs:
|
|||||||
BODY="$(echo "${{ inputs.issue-body }}" | head -c 10000)"
|
BODY="$(echo "${{ inputs.issue-body }}" | head -c 10000)"
|
||||||
[ "${#BODY}" -ge 10000 ] && BODY+=$'\n... (troncato)'
|
[ "${#BODY}" -ge 10000 ] && BODY+=$'\n... (troncato)'
|
||||||
|
|
||||||
printf -v PROMPT '%s\n\n%s\n\n%s\n\n%s\n\n%s\n\n%s\n\n%s: %s\n%s:\n%s' \
|
printf -v PROMPT '%s\n\n%s\n\n%s\n\n%s\n\n%s\n\n%s\n\n%s\n\n%s\n\n%s: %s\n%s:\n%s' \
|
||||||
"Sei un sistema di triage automatico per repository software." \
|
"Sei un sistema di triage automatico per repository software." \
|
||||||
"Analizza la seguente issue e classificala con UNA delle label disponibili:" \
|
"Analizza il codice sorgente nel repository ed esamina la seguente issue." \
|
||||||
|
"Classifica con UNA delle label:" \
|
||||||
'- "bug": malfunzionamento, errore, crash, anomalia, comportamento inaspettato' \
|
'- "bug": malfunzionamento, errore, crash, anomalia, comportamento inaspettato' \
|
||||||
'- "richiesta": nuova funzionalità, miglioramento, refactoring, ottimizzazione, o dubbio' \
|
'- "richiesta": nuova funzionalità, miglioramento, refactoring, ottimizzazione, o dubbio' \
|
||||||
'Rispondi ESCLUSIVAMENTE con un JSON valido su una singola riga, senza nessun altro testo:' \
|
"Rispondi ESCLUSIVAMENTE con un JSON valido su una SINGOLA riga, senza nessun altro testo:" \
|
||||||
'{"label":"bug","comment":"Breve analisi in italiano..."}' \
|
'{"label":"bug","comment":"**Riassunto**: ...\\n\\n**Gap analisi**: codice mancante...\\n\\n**Domande aperte**:\\n1. ...","md":"# Analisi tecnica\\n\\n## Codice coinvolto\\n..."}' \
|
||||||
|
"Il campo 'comment' deve contenere: riassunto della issue, gap analisi (cosa manca rispetto al codice), domande aperte. Usa \\n per i newline." \
|
||||||
|
"Il campo 'md' deve contenere: analisi tecnica completa in formato markdown, file/moduli coinvolti, ipotesi root cause, proposta di fix. Usa \\n per i newline." \
|
||||||
"Titolo" "${{ inputs.issue-title }}" \
|
"Titolo" "${{ inputs.issue-title }}" \
|
||||||
"Corpo" "$BODY"
|
"Corpo" "$BODY"
|
||||||
|
|
||||||
@@ -102,6 +105,7 @@ runs:
|
|||||||
|
|
||||||
# Estrai la riga JSON dalla risposta (salta banner ANSI)
|
# Estrai la riga JSON dalla risposta (salta banner ANSI)
|
||||||
JSON_LINE=$(grep -E '^\{"label":"(bug|richiesta)","comment":' "$OUTFILE" | head -1)
|
JSON_LINE=$(grep -E '^\{"label":"(bug|richiesta)","comment":' "$OUTFILE" | head -1)
|
||||||
|
JSON=""
|
||||||
if [ -n "$JSON_LINE" ]; then
|
if [ -n "$JSON_LINE" ]; then
|
||||||
JSON=$(echo "$JSON_LINE" | jq -c . 2>/dev/null)
|
JSON=$(echo "$JSON_LINE" | jq -c . 2>/dev/null)
|
||||||
fi
|
fi
|
||||||
@@ -110,9 +114,11 @@ runs:
|
|||||||
echo "WARN: Impossibile estrarre JSON valido, default a richiesta"
|
echo "WARN: Impossibile estrarre JSON valido, default a richiesta"
|
||||||
LABEL="richiesta"
|
LABEL="richiesta"
|
||||||
COMMENT="Classificazione automatica non riuscita. Label impostata a richiesta per default."
|
COMMENT="Classificazione automatica non riuscita. Label impostata a richiesta per default."
|
||||||
|
MD_CONTENT=""
|
||||||
else
|
else
|
||||||
LABEL=$(echo "$JSON" | jq -r '.label // "richiesta"')
|
LABEL=$(echo "$JSON" | jq -r '.label // "richiesta"')
|
||||||
COMMENT=$(echo "$JSON" | jq -r '.comment // "Classificazione automatica."')
|
COMMENT=$(echo "$JSON" | jq -r '.comment // "Classificazione automatica."')
|
||||||
|
MD_CONTENT=$(echo "$JSON" | jq -r '.md // ""')
|
||||||
fi
|
fi
|
||||||
|
|
||||||
case "$LABEL" in
|
case "$LABEL" in
|
||||||
@@ -145,7 +151,27 @@ runs:
|
|||||||
echo "WARN: Label '$LABEL' non trovata nel repo. Creala manualmente o passa un token con permessi."
|
echo "WARN: Label '$LABEL' non trovata nel repo. Creala manualmente o passa un token con permessi."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
COMMENT_JSON=$(jq -n --arg body "$COMMENT" '{body: $body}')
|
# Carica il file MD come asset (prima del commento per poterlo linkare)
|
||||||
|
LINK_MD=""
|
||||||
|
if [ -n "$MD_CONTENT" ] && [ "$MD_CONTENT" != "null" ]; then
|
||||||
|
MD_FILE="/tmp/triage-issue-${ISSUE_NUM}.md"
|
||||||
|
printf '%s\n' "$MD_CONTENT" > "$MD_FILE"
|
||||||
|
|
||||||
|
ASSET_RESP=$(curl -sS -X POST "$HOST/api/v1/repos/$REPO/issues/$ISSUE_NUM/assets" \
|
||||||
|
-H "Authorization: token $TOKEN" \
|
||||||
|
-H "Accept: application/json" \
|
||||||
|
-F "attachment=@${MD_FILE};filename=triage-issue-${ISSUE_NUM}.md" 2>/dev/null)
|
||||||
|
ASSET_URL=$(echo "$ASSET_RESP" | jq -r '.download_url // empty' 2>/dev/null)
|
||||||
|
if [ -n "$ASSET_URL" ] && [ "$ASSET_URL" != "null" ]; then
|
||||||
|
LINK_MD="\n\n---\n📎 **Analisi tecnica completa**: [triage-issue-${ISSUE_NUM}.md](${ASSET_URL})"
|
||||||
|
echo "Asset MD caricato: $ASSET_URL"
|
||||||
|
else
|
||||||
|
echo "WARN: Impossibile caricare il file MD come asset"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
COMMENT_BODY="${COMMENT}${LINK_MD}"
|
||||||
|
COMMENT_JSON=$(jq -n --arg body "$COMMENT_BODY" '{body: $body}')
|
||||||
curl -sS -X POST "$HOST/api/v1/repos/$REPO/issues/$ISSUE_NUM/comments" \
|
curl -sS -X POST "$HOST/api/v1/repos/$REPO/issues/$ISSUE_NUM/comments" \
|
||||||
-H "Authorization: token $TOKEN" \
|
-H "Authorization: token $TOKEN" \
|
||||||
-H "Content-Type: application/json" \
|
-H "Content-Type: application/json" \
|
||||||
|
|||||||
Reference in New Issue
Block a user