Refactor devcontainer and MCP tools for containerized development

Ajout et configuration d’un environnement de développement conteneurisé (devcontainer) avec support multi-langages (Go, Rust, Python), intégration d’outils LLM locaux/cloud (LM Studio, Claude Pro), et refonte des outils MCP : suppression du module sandbox, correction de la gestion des chemins projet dans jj.py, ajout d’une fonction jj_new_tool, et structuration du Makefile pour le build multiplateforme. Mise à jour des scripts (docker-entrypoint.sh, setup-devcontainer.sh), du README.md et de bin/jj-ai-commit.sh pour automatiser la génération de messages de commit à partir des résumés des fichiers modifiés.
This commit is contained in:
2026-03-11 16:34:09 +01:00
parent 1c9cee35df
commit d6fb4e33e5
30 changed files with 3502 additions and 193 deletions

View File

@@ -1,16 +1,48 @@
#!/bin/bash
LOCAL_LLM_API=${LOCAL_LLM_API:-http://host.docker.internal:1248/v1}
MODEL="${LLM_MODEL:-qwen3-coder}"
DIFF=$(jj diff)
PROMPT='Analyse ce diff et réponds UNIQUEMENT avec un objet JSON valide contenant "title" (string) et "message" (string) pour le message de commit. Pas de texte avant ou après le JSON.'
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'
}
CONTENT="${PROMPT}
${DIFF}"
# Get list of modified files
FILES=$(jj diff --summary | awk '{print $2}')
REQUEST=$(jq -n --arg content "$CONTENT" '{"model": "qwen3-coder", "messages": [{"role": "user", "content": $content}]}')
if [[ -z "$FILES" ]]; then
echo "No changes to commit." >&2
exit 1
fi
curl -s -X POST \
-H "Content-Type: application/json" \
-d "$REQUEST" \
"$LOCAL_LLM_API/chat/completions" | jq -r '.choices[0].message.content' | jq -r '.title + "\n\n" + .message'
# 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'