Files
PMOCrazycoder/bin/jj-ai-commit.sh

49 lines
1.5 KiB
Bash
Raw Normal View History

#!/bin/bash
LOCAL_LLM_API=${LOCAL_LLM_API:-http://host.docker.internal:1248/v1}
MODEL="${LLM_MODEL:-qwen3-coder}"
llm_query() {
local content="$1"
jq -n --arg content "$content" --arg model "$MODEL" \
'{"model": $model, "messages": [{"role": "user", "content": $content}]}' \
| curl -s -X POST \
-H "Content-Type: application/json" \
-d @- \
"$LOCAL_LLM_API/chat/completions" \
| jq -r '.choices[0].message.content'
}
# Get list of modified files
FILES=$(jj diff --summary | awk '{print $2}')
if [[ -z "$FILES" ]]; then
echo "No changes to commit." >&2
exit 1
fi
# Pass 1: summarize each file diff individually
SUMMARIES=""
while IFS= read -r file; do
FILE_DIFF=$(jj diff "$file" 2>/dev/null)
if [[ -z "$FILE_DIFF" ]]; then
continue
fi
PROMPT="Résume en 2-3 phrases les changements apportés dans ce diff pour le fichier '$file'. Sois concis et factuel.
$FILE_DIFF"
SUMMARY=$(llm_query "$PROMPT")
SUMMARIES="${SUMMARIES}### $file
$SUMMARY
"
done <<< "$FILES"
# Pass 2: generate commit message from summaries
COMMIT_PROMPT="À partir des résumés suivants de fichiers modifiés, génère un message de commit git.
Réponds UNIQUEMENT avec un objet JSON valide contenant \"title\" (string, max 72 chars, en anglais, style imperative) et \"message\" (string, détails en français). Pas de texte avant ou après le JSON.
$SUMMARIES"
llm_query "$COMMIT_PROMPT" | jq -r '.title + "\n\n" + .message'