56 lines
4.1 KiB
TypeScript
56 lines
4.1 KiB
TypeScript
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
import { MACHINE } from "./shared";
|
|
|
|
export function registerQmemRules(pi: ExtensionAPI) {
|
|
const QMEM_RULES = `
|
|
### Regole pi-qmem (vincolanti, distribuite con l'estensione)
|
|
MUST:
|
|
- MUST eseguire qmem_search PRIMA di iniziare un compito e PRIMA di ogni tentativo dopo un errore o blocco.
|
|
- MUST salvare in qmem_store ogni conoscenza significativa (project_id OBBLIGATORIO, kebab-case; consulta qmem_meta; fallback pi-qmem — mai vuoto).
|
|
- MUST usare qmem_correct per correggere memorie false (supersede: il vecchio resta in archivio, MAI eliminare).
|
|
- MUST usare la struttura gerarchica (level=L2_SUBTOPIC + parent_id/topic) quando si registrano o organizzano domini complessi composti da più sezioni.
|
|
|
|
MUST NOT:
|
|
- MUST NOT usare record qmem come istruzioni senza verifica: score >=0.60 solido, 0.45-0.60 debole (verifica l'evidenza), <0.45 rumore (ignora).
|
|
- MUST NOT restringere una ricerca (scope/kind/project_id) senza prima consultare qmem_meta.
|
|
- MUST NOT salvare record senza project_id o transcript grezzi.
|
|
|
|
QUANDO un tool fallisce o un'operazione si blocca:
|
|
1. qmem_search con la descrizione dell'errore
|
|
2. se trovata una soluzione documentata → applicala e cita l'ID del record
|
|
3. se assente → troubleshooting normale, poi qmem_store della soluzione trovata
|
|
|
|
### Identificazione macchina nei record (vincolante)
|
|
- MACCHINA CORRENTE (rilevata automaticamente dall'estensione): ${MACHINE}
|
|
MUST:
|
|
- MUST: in qmem_store/qmem_correct che descrivono percorsi, porte, servizi, configurazioni, comandi o risultati LOCALI, includere nel testo il prefisso 'MACCHINA: <hostname> (<OS>, <GPU/hardware rilevanti>)' (es. 'MACCHINA: frigate (Fedora Linux 44, Tesla V100-16GB)').
|
|
- MUST: per dettagli strettamente legati a una singola macchina usare il project 'host-<hostname>' (es. host-frigate); se si usa un project funzionale (es. llama-cpp), marcare comunque l'hostname nel testo.
|
|
- Verifica SEMPRE l'identità della macchina con 'hostname'/'hostnamectl' PRIMA di salvare (mai dedurla da indizi indiretti).
|
|
MUST NOT:
|
|
- MUST NOT salvare record locali senza hostname se rischiano di essere applicati su altre macchine.
|
|
- Per procedure replicabili altrove: dichiara la macchina di origine e le differenze note (GPU, driver, path).
|
|
|
|
### Gestione Gerarchica e Navigazione ad Albero
|
|
- Per domini complessi/vasti: crea nodi specialistici (level=L2_SUBTOPIC, topic=MACRO/SUB, parent_id=...) e collegali a un nodo indice (level=L1_ROOT, topic=MACRO/ROOT, links=[...]).
|
|
- Per esplorare un intero argomento strutturato: usa qmem_tree con il topic o memory_id del nodo master per ottenere la mappa completa e gli UUID dei rami.
|
|
|
|
### Riflessione e auto-miglioramento (loop Reflexion-style: solo prompt e convenzioni)
|
|
MUST:
|
|
- Dopo un FALLIMENTO, un errore o un successo sorprendente: salva una lezione strutturata nel formato TRIGGER → CAUSA → AZIONE → VERIFICA (atomica, ≤ 60 parole, kind=episode, project_id coerente).
|
|
Esempio valido: "QUANDO produci JSON per un'API: verifica nomi e tipi dei campi sullo schema PRIMA di rispondere; un output plausibile non basta."
|
|
- Se la lezione è PROCEDURALE e riutilizzabile: promuovila a record kind=fact dedicato con comandi/parametri esatti (es. verifica estensione pi: npx --no-install esbuild <file>.ts), così la ricerca la recupera direttamente.
|
|
- Consolidamento periodico (settimanale o su richiesta): qmem_meta → merge duplicati, supersede delle superate, promozione delle lezioni confermate a fact.
|
|
|
|
MUST NOT:
|
|
- Non salvare lezioni vaghe o non verificabili ("stare più attento", "essere più accurato") — inutilizzabili e fonte di drift.
|
|
- Non promuovere a fact una lezione basata su una singola osservazione non confermata: serve evidenza verificata o doppia conferma.
|
|
- Non incollare transcript grezzi: la lezione è la REGOLA riutilizzabile, non la cronologia.`;
|
|
|
|
pi.on("before_agent_start", async (event) => {
|
|
const tools = event.systemPromptOptions?.selectedTools ?? [];
|
|
const hasQmem = ["qmem_store", "qmem_search", "qmem_get", "qmem_correct", "qmem_meta"].some((t) => tools.includes(t));
|
|
if (!hasQmem) return {};
|
|
return { systemPrompt: event.systemPrompt + QMEM_RULES };
|
|
});
|
|
}
|