mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-11 17:26:57 +02:00
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>
56 lines
2.0 KiB
Go
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
|
|
}
|