Files
Loki/internal/loki/code_instructions.go
MichaelandClaude Opus 5.5 d5632e3595 Mode Code : les consignes du dépôt (AGENTS.md, CLAUDE.md) font partie du contexte
Repris de context/instructions.ts d'OpenFox.

Un dépôt qui documente ses commandes de build et de test, ses conventions
et ses pièges le fait dans AGENTS.md ou CLAUDE.md. Le modèle les
redécouvrait à coups de read et de bash — quand il les redécouvrait.

En mode Code, le premier de ces fichiers trouvé (dépôt cloné détecté, puis
racine de la discussion) part avec le contexte du projet, tronqué à 4 000
caractères. Comme le reste du contexte projet, il est déplacé dans le
premier message utilisateur : le préfixe système, et le cache de prompt,
restent intacts.

Les tours de correction et de relance du builder reçoivent désormais le
même contexte projet que le tour de build : sans lui, le début du premier
message utilisateur changeait et tout le prompt était recalculé.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 23:36:51 +02:00

56 lines
2.0 KiB
Go

package loki
// code_instructions.go — consignes du dépôt (AGENTS.md, CLAUDE.md) en mode Code.
// Repris de context/instructions.ts d'OpenFox.
//
// Un dépôt qui documente ses commandes de build et de test, ses conventions,
// ses pièges, le fait dans ces fichiers. Sans eux, le modèle les redécouvrait
// à coups de read et de bash — quand il les redécouvrait. Le contenu part avec
// le contexte du projet : déplacé dans le premier message utilisateur par
// normalizeSystemMessages, il ne touche pas au préfixe système (cache).
import (
"os"
"path/filepath"
"strings"
)
const codeInstructionsPrefix = "Repository instructions"
// codeInstructionsMax : au-delà, on tronque (≈ 1k tokens) — ces fichiers
// peuvent être longs, et le contexte est compté.
const codeInstructionsMax = 4000
// codeInstructionFiles : par ordre de préférence ; le premier trouvé gagne.
var codeInstructionFiles = []string{"AGENTS.md", "CLAUDE.md", ".github/copilot-instructions.md"}
// codeInstructionsMessage renvoie les consignes du dépôt de la discussion
// (racine, ou dépôt cloné détecté par gitRepoDir), ok=false s'il n'y en a pas.
func codeInstructionsMessage(caps Caps) (Message, bool) {
if !caps.Code {
return Message{}, false
}
dirs := []string{agentCwd()}
if d, err := gitRepoDir(""); err == nil && d != dirs[0] {
dirs = append([]string{d}, dirs...)
}
for _, dir := range dirs {
for _, name := range codeInstructionFiles {
b, err := os.ReadFile(filepath.Join(dir, name))
if err != nil || len(strings.TrimSpace(string(b))) == 0 {
continue
}
s := strings.TrimSpace(string(b))
if r := []rune(s); len(r) > codeInstructionsMax {
s = string(r[:codeInstructionsMax]) + "\n…[tronqué — lis le fichier pour la suite]"
}
rel := name
if r, err := filepath.Rel(agentCwd(), filepath.Join(dir, name)); err == nil {
rel = filepath.ToSlash(r)
}
return Message{Role: "system", Content: codeInstructionsPrefix + " (" + rel + ") — follow them:\n\n" + s}, true
}
}
return Message{}, false
}