feat: v2.1.0 - Selective saving, cleanup command, and SessionEnd hook

New features:
- /learn:analyze now uses signal detection to save only valuable lessons
  - Explicit commands: "ține minte", "remember", "memorează"
  - Stated preferences: "întotdeauna", "always", "never"
  - Repeated corrections (2+ times)
  - Historical references: "cum am discutat", "as we discussed"
- New /learn:cleanup command for memory hygiene
  - Scoring system for entry quality
  - Conservative mode with confirmation
  - Upgrade option to rewrite entries
- SessionEnd hook shows reminder on /exit, /clear, Ctrl+D
- Metadata tracking: source, confidence, reinforced, trigger

Changes:
- analyze.md: Added Pas 3.5 for signal detection
- cleanup.md: New command for reviewing/deleting entries
- hooks.json: Changed from Stop to SessionEnd
- scripts/session-end-reminder.sh: New reminder script
- Templates updated with metadata fields
- Documentation updated for v2.1.0

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Claude Agent
2026-01-06 23:12:31 +00:00
parent d6c71536e7
commit 7aafcd5562
11 changed files with 746 additions and 43 deletions

View File

@@ -1,11 +1,12 @@
---
description: Analizează conversația și propune lecții de salvat
description: Analizează conversația și propune lecții de salvat (cu filtrare selectivă)
argument-hint: [auto|patterns|gotchas] - Detectare automată sau categorie specifică
---
# Analiză Conversație pentru Lecții
Examinează conversația curentă și identifică insights pentru documentație.
**Salvează doar lecții cu semnal clar** - nu one-off fixes.
## Workflow
@@ -15,6 +16,27 @@ Citește `.claude/rules/claude-learn-domains.md` pentru lista domeniilor disponi
Dacă fișierul nu există, creează-l din template cu domeniile implicite:
- backend, frontend, database, testing, deployment, global
### Pas 0.5: Verifică Reinforcement pentru Entries Existente
Înainte de a căuta lecții noi, verifică dacă conversația validează entries existente:
1. Încarcă toate entries din domeniile relevante (bazat pe fișierele din conversație)
2. Pentru fiecare entry, verifică dacă:
- Problema descrisă a fost întâlnită ȘI soluția a funcționat
- Pattern-ul a fost aplicat cu succes
- Utilizatorul a menționat/confirmat un gotcha salvat
3. Dacă găsește match-uri, actualizează:
- Incrementează `Reinforced` count
- Actualizează `Last Reinforced` la data curentă
4. Raportează la final (dacă există):
```
📈 Entries validate în această sesiune:
- [backend] "API Error Handling" - reinforced (3→4)
- [frontend] "Vue Watch Pattern" - reinforced (1→2)
```
### Pas 1: Scanează Conversația
Identifică:
@@ -22,6 +44,7 @@ Identifică:
- **Tool calls cu erori** → potențiale gotchas
- **Soluții aplicate** → potențiale patterns
- **Decizii tehnice** → posibile reguli noi
- **Mesaje utilizator** → comenzi explicite, corecții, preferințe
### Pas 2: Detectează Domeniul
@@ -85,9 +108,105 @@ Accept? [y/edit/+more]
- Adaugă în `.claude/rules/claude-learn-domains.md`
- Creează `.claude/rules/claude-learn-{domain}.md` cu frontmatter
### Pas 4: Generează Propuneri de Lecții
### Pas 3.5: Detectare Semnal de Salvare
Ce să cauți:
**CRITIC**: Înainte de a propune lecții, verifică dacă există SEMNAL CLAR că lecția merită salvată.
#### Categorii de Semnal (în ordine de prioritate)
##### A. Comandă Explicită (Source: explicit, Confidence: high) - SCOR: +100
Caută în mesajele utilizatorului fraze de tip "ține minte":
**Română:**
- "ține minte", "memorează", "reține", "să nu uiți", "notează-ți"
- "salvează asta", "adaugă în memorie"
**Engleză:**
- "remember", "remember this", "don't forget", "keep in mind"
- "note this", "save this"
**Acțiune:** Salvează IMEDIAT cu source=explicit, confidence=high
##### B. Preferință Explicită (Source: explicit, Confidence: high) - SCOR: +80
Caută pattern-uri de tip regulă permanentă:
**Română:**
- "întotdeauna fă X", "niciodată nu Y", "mereu să fie Z"
- "de acum înainte", "regula e că", "standard e să"
**Engleză:**
- "always do X", "never do Y", "from now on"
- "the rule is", "standard is to", "we always"
##### C. Corecție Repetată (Source: repeated, Confidence: high) - SCOR: +70
Detectează când utilizatorul corectează ACEEAȘI problemă de mai multe ori:
**Română:**
- "nu, fă-o așa", "greșit, e X nu Y", "am mai spus"
- "din nou", "încă o dată", "iar ai făcut", "te-am corectat"
**Engleză:**
- "no, do it like this", "wrong, it's X not Y", "I said before"
- "again", "once more", "I already told you"
**Condiție:** Găsește 2+ corecții pe același subiect → salvează cu source=repeated
##### D. Referință Istorică (Source: inferred, Confidence: medium) - SCOR: +50
Când utilizatorul referă discuții anterioare:
**Română:**
- "cum am discutat", "așa cum am făcut data trecută", "nu uita că"
- "știi deja", "am stabilit că", "după cum știi"
**Engleză:**
- "as we discussed", "like we did before", "don't forget that"
- "you know", "we agreed", "as you know"
**Acțiune:** Salvează CU VERIFICARE - întreabă utilizatorul dacă vrea să salveze
##### E. Pattern Dedus din Erori (Source: inferred, Confidence: medium/low) - SCOR: +30
Detectare din erori și soluții (comportamentul actual).
**Criteriu de Incluziune** (CE să salveze):
- Eroare care a apărut de mai multe ori în conversație
- Soluție care rezolvă o clasă de probleme (nu un singur fișier)
- Configurație care a necesitat research/documentație
- Workaround pentru bug cunoscut
**Criteriu de Excludere** (CE să NU salveze) - SCOR: 0:
- Fix pentru o greșeală de tipar/typo
- Eroare de path sau import greșit (one-time fix)
- Bug specific unui singur fișier fără pattern general
- Ajustări de valori hardcodate
- Syntax errors simple
#### Calculare Scor de Semnal
| Semnal | Puncte |
|--------|--------|
| Comandă explicită ("ține minte") | +100 (auto-salvare) |
| Preferință explicită ("întotdeauna") | +80 |
| Corecție repetată (2+ ori) | +70 |
| Referință istorică | +50 |
| Eroare rezolvată cu pattern general | +30 |
| Configurație descoperită | +30 |
| Eroare one-time | +5 |
| Typo/fix banal | 0 |
**Praguri:**
- **< 30 puncte**: NU se propune (filtrat automat)
- **30-50 puncte**: Se propune cu "Low confidence"
- **50-80 puncte**: Se propune normal
- **80+ puncte**: Marcat ca "Recommended"
### Pas 4: Generează Propuneri de Lecții (cu Metadata)
Pentru fiecare insight identificat cu scor >= 30, generează:
#### Patterns (Soluții Repetabile)
- Abordări care au funcționat bine
@@ -101,46 +220,64 @@ Ce să cauți:
- Comportamente neașteptate
- Anti-patterns descoperite
Format pentru fiecare insight:
Format extins pentru fiecare insight:
```
**[PATTERN/GOTCHA] Titlu Scurt**
**[PATTERN/GOTCHA] Titlu Scurt** ⭐ Recommended | ⚠️ Low confidence
- **Categorie**: patterns | gotchas
- **Source**: explicit | inferred | repeated
- **Confidence**: high | medium | low
- **Scor**: {punctaj}
- **Semnal detectat**: "{fraza/contextul care a declanșat}"
- **Descriere**: Ce s-a învățat
- **Context**: În ce situație e relevant
- **Exemplu**: Cod sau pași concreți
- **Tags**: [tag1, tag2, tag3]
```
### Pas 5: Prezintă Utilizatorului
### Pas 5: Prezintă Utilizatorului (Extins)
```
📚 Am identificat {N} lecții din această conversație:
1. [PATTERN] {Titlu}
⭐ RECOMANDATE (semnal puternic):
1. [PATTERN] {Titlu} (explicit: "întotdeauna fă X")
{Descriere scurtă}
2. [GOTCHA] {Titlu}
2. [GOTCHA] {Titlu} (repeated: corectat de 3 ori)
{Descriere scurtă}
⚠️ POSIBILE (semnal slab):
3. [PATTERN] {Titlu} (inferred: eroare rezolvată)
{Descriere scurtă}
❌ EXCLUSE (one-time fixes, nu se salvează):
- Fix typo în auth.ts
- Import path corectat în utils.ts
📁 Domeniu: {domain}
Care dintre acestea vrei să le salvez?
- [1, 2, 3] - Selectează specific
- [all] - Toate
- [1, 2] - Selectează specific (implicit: doar recomandate)
- [1, 2, 3] - Include și cele cu semnal slab
- [all] - Toate (inclusiv cele slabe)
- [none] - Niciuna
- [edit N] - Modifică propunerea N
```
### Pas 6: Salvează în Fișierul Domeniului
### Pas 6: Salvează în Fișierul Domeniului (cu Metadata)
Salvează în `.claude/rules/claude-learn-{domain}.md`
Dacă fișierul nu există, creează-l din template cu frontmatter corect.
Format Pattern:
Format Pattern (extins):
```markdown
### {Titlu}
**Discovered**: {YYYY-MM-DD} (feature: {context})
**Source**: {source} | **Confidence**: {confidence} | **Reinforced**: 0
**Trigger**: "{fraza care a declanșat salvarea}"
**Description**: {descriere}
**Example** (`{file}:{lines}`):
@@ -153,10 +290,12 @@ Format Pattern:
---
```
Format Gotcha:
Format Gotcha (extins):
```markdown
### {Titlu}
**Discovered**: {YYYY-MM-DD} (feature: {context})
**Source**: {source} | **Confidence**: {confidence} | **Reinforced**: 0
**Trigger**: "{fraza care a declanșat salvarea}"
**Problem**: {problema}
**Solution**: {soluția}
@@ -171,6 +310,7 @@ La sfârșitul fișierului domeniului, actualizează:
- Incrementează Total Patterns/Gotchas
- Actualizează Last Session la data curentă
- Incrementează Sessions Recorded
- Actualizează Total Reinforcements (dacă s-au făcut în Pas 0.5)
### Pas 8: Confirmă
@@ -179,7 +319,9 @@ La sfârșitul fișierului domeniului, actualizează:
- {N} patterns adăugate
- {M} gotchas adăugate
Statistici {domain}: {X} patterns, {Y} gotchas total
📈 Entries reinforced: {X}
Statistici {domain}: {P} patterns, {G} gotchas, {R} reinforcements total
```
---
@@ -195,6 +337,7 @@ Dacă argumentul este:
## Compatibilitate Înapoi
### Format Vechi de Memorie
Dacă există fișierul vechi `claude-learn-memory.md` fără frontmatter:
```
⚠️ Detectat format vechi de memorie (claude-learn-memory.md)
@@ -203,3 +346,12 @@ Vrei să migrez memoria existentă către noul sistem cu domenii? [y/n]
- y → rulează /learn:import pe fișierul vechi
- n → continuă fără migrare
```
### Entries Fără Metadata
Entries vechi fără câmpurile noi (Source, Confidence, Reinforced, Trigger) sunt tratate ca:
- Source: inferred
- Confidence: medium
- Reinforced: 0
- Trigger: ""
La prima editare sau reinforcement, metadata va fi adăugată automat.

View File

@@ -0,0 +1,269 @@
---
description: Revizuiește memoria și propune ștergeri pentru entries nefolositoare
argument-hint: [domain|--dry-run] - Opțional: curăță doar un domeniu sau doar raport
---
# Curățare și Igienă Memorie
Analizează toate entries din memorie și identifică candidați pentru ștergere.
**Mod conservator**: Întotdeauna confirmă cu utilizatorul înainte de ștergere.
## Workflow
### Pas 1: Încarcă Toate Fișierele de Memorie
Citește toate `claude-learn-*.md` din `.claude/rules/`.
Pentru fiecare entry, parsează și extrage:
- Titlu
- Discovered date
- Source (explicit/inferred/repeated) - default: inferred dacă lipsește
- Confidence (high/medium/low) - default: medium dacă lipsește
- Reinforced count - default: 0 dacă lipsește
- Last reinforced date
- Tags
- Descriere/Problem/Solution
- Example (dacă există)
### Pas 2: Calculare Scor pentru Fiecare Entry
#### 2.1 Criterii de Ștergere (Scor Negativ)
| Criteriu | Puncte | Descriere |
|----------|--------|-----------|
| Fără reinforcement (0) și > 30 zile | -30 | Entry vechi nefolosit |
| Confidence: low | -20 | Inferență slabă la salvare |
| Source: inferred (nu explicit/repeated) | -10 | Nu a fost cerut explicit |
| Descriere generică (< 20 caractere) | -25 | Ex: "Fix bug", "Update config" |
| Fără example code | -15 | Lipsă context practic |
| Fără tags sau 1 singur tag | -10 | Greu de căutat/categorizat |
| Path specific în titlu | -20 | Ex: "Fix users.ts error" - prea specific |
| Menționează un singur fișier în descriere | -15 | One-time fix probabil |
| Niciun tag comun cu alte entries | -10 | Entry izolat |
#### 2.2 Criterii de Păstrare (Scor Pozitiv)
| Criteriu | Puncte | Descriere |
|----------|--------|-----------|
| Reinforced >= 3 | +50 | Folosit de multe ori - foarte valoros |
| Reinforced >= 1 | +20 | Folosit cel puțin o dată |
| Source: explicit | +40 | Utilizatorul a cerut explicit salvarea |
| Source: repeated | +30 | Corectat de mai multe ori - important |
| Confidence: high | +20 | Semnal puternic la salvare |
| Tags comune cu 3+ alte entries | +15 | Parte din pattern mai mare |
| Example code prezent | +10 | Are context practic |
| Discovered recent (< 14 zile) | +10 | Nou, încă de evaluat |
#### 2.3 Calculare Scor Final
```
scor_final = suma(criterii_păstrare) + suma(criterii_ștergere)
```
**Praguri de decizie:**
- **Scor < -30**: Candidat PUTERNIC pentru ștergere
- **Scor -30 la -10**: Candidat POSIBIL pentru ștergere
- **Scor -10 la +20**: Neutru (păstrează dar monitorizează)
- **Scor > +20**: Păstrează definitiv
### Pas 3: Prezintă Raportul
```
🧹 Curățare Memorie - Raport
📊 Analizat: {N} entries din {M} domenii
🗑️ CANDIDAȚI PENTRU ȘTERGERE:
━━━ Scor foarte negativ (< -30) ━━━
1. [backend] "Fix auth bug"
Scor: -45 | Discovered: 2024-11-15 | Reinforced: 0
❌ Descriere generică (< 20 char)
❌ Fără example code
❌ Vechi (> 30 zile) fără reinforcement
❌ Path specific în titlu
2. [frontend] "CSS margin adjustment"
Scor: -40 | Discovered: 2024-12-01 | Reinforced: 0
❌ One-time fix (un singur fișier)
❌ Confidence: low
❌ Fără tags comune
━━━ Scor negativ (-30 la -10) ━━━
3. [database] "Index creation tip"
Scor: -15 | Discovered: 2024-12-20 | Reinforced: 0
⚠️ Fără example code
⚠️ Source: inferred
━━━ Monitorizare (scor neutru) ━━━
4. [testing] "Mock setup pattern"
Scor: +5 | Discovered: 2025-01-02 | Reinforced: 0
Nou - necesită mai mult timp pentru evaluare
✅ PĂSTRATE DEFINITIV: {X} entries (scor > +20)
Acțiuni disponibile:
- [delete 1, 2] - Șterge entries specifice
- [delete-negative] - Șterge toate cu scor < -30
- [review N] - Vezi detalii complete pentru entry N
- [upgrade N] - Rescrie entry N pentru a-l îmbunătăți
- [none] - Nu șterge nimic
- [export] - Exportă lista pentru review manual
```
### Pas 4: Confirmare pentru Fiecare Ștergere
Pentru fiecare entry selectat, afișează detalii și cere confirmare:
```
🗑️ Confirmare ștergere (1/{total}):
Entry: [backend] "Fix auth bug"
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
**Discovered**: 2024-11-15 (feature: login-page)
**Source**: inferred | **Confidence**: low | **Reinforced**: 0
**Problem**: Auth token expired
**Solution**: Refresh token
**Tags**: auth
Motive pentru ștergere:
- Descriere prea generică pentru a fi utilă
- Niciodată folosit (0 reinforcements în 52 zile)
- Fix specific pentru un singur caz
[delete] Confirmă ștergerea
[keep] Păstrează entry-ul
[upgrade] Rescrie pentru a-l face util
[skip] Treci la următorul
```
### Pas 5: Opțiune Upgrade (Rescrie Entry)
Dacă utilizatorul alege [upgrade]:
```
📝 Upgrade Entry:
Entry actual: "Fix auth bug"
Bazat pe context, propun rescrierea:
**Titlu nou**: "JWT Token Refresh on 401 Response"
**Descriere nouă**: When API returns 401, check if refresh token
is available and attempt automatic refresh before failing.
**Source nou**: explicit (rescris manual)
**Confidence nouă**: high
**Example** îmbunătățit:
```typescript
if (response.status === 401 && hasRefreshToken()) {
const newToken = await refreshToken();
return retryRequest(config, newToken);
}
```
Accept rescrierea? [y/n/edit]
```
Dacă acceptă:
- Înlocuiește entry-ul cu versiunea îmbunătățită
- Resetează Reinforced la 0
- Actualizează Discovered la data curentă
- Setează Source: explicit
- Setează Confidence: high
### Pas 6: Execută Ștergerile
Pentru fiecare entry confirmat pentru ștergere:
1. Găsește entry-ul în fișierul markdown
2. Elimină complet secțiunea (de la ### până la următorul ---)
3. Actualizează statisticile (decrementează Total Patterns/Gotchas)
4. Actualizează Last Cleanup date
**IMPORTANT**: Ștergerea este totală și ireversibilă.
### Pas 7: Raport Final
```
✅ Curățare completă!
Acțiuni efectuate:
- 3 entries șterse
- 1 entry rescris (upgraded)
- 2 entries păstrate (manual)
- 5 entries monitorizate (scor neutru)
Statistici actualizate:
┌────────────┬──────────┬─────────┬─────────────┐
│ Domain │ Înainte │ După │ Șterse │
├────────────┼──────────┼─────────┼─────────────┤
│ backend │ 15 │ 13 │ 2 │
│ frontend │ 10 │ 9 │ 1 │
│ database │ 8 │ 8 │ 0 │
├────────────┼──────────┼─────────┼─────────────┤
│ TOTAL │ 33 │ 30 │ 3 │
└────────────┴──────────┴─────────┴─────────────┘
💡 Sugestie: Rulează /learn:cleanup lunar pentru mentenanță.
```
---
## Argument: $ARGUMENTS
Dacă argumentul este:
- gol → curăță toate domeniile
- `backend` (sau alt nume de domeniu) → curăță doar acel domeniu
- `--dry-run` → doar raport, fără acțiuni de ștergere
- `--stats` → doar statistici sumare, fără detalii
---
## Exemple de Entries Problematice
### Candidați tipici pentru ștergere:
```markdown
### Fix typo
**Discovered**: 2024-10-15 (feature: misc)
**Problem**: Typo in variable name
**Solution**: Fixed typo
**Tags**: fix
```
❌ Titlu generic, descriere vagă, tag singular, vechi
```markdown
### Update users.ts
**Discovered**: 2024-11-20 (feature: users)
**Problem**: Wrong import
**Solution**: Changed import path
**Tags**: import
```
❌ Path în titlu, one-time fix, fără context reutilizabil
### Entries bune (de păstrat):
```markdown
### TypeScript Strict Mode Configuration
**Discovered**: 2024-12-01 (feature: project-setup)
**Source**: explicit | **Confidence**: high | **Reinforced**: 4
**Trigger**: "ține minte setările pentru strict mode"
**Description**: Enable all strict mode options for better type safety...
**Example** (`tsconfig.json:5-15`):
```json
{
"compilerOptions": {
"strict": true,
"noImplicitAny": true,
...
}
}
```
**Tags**: typescript, config, strict-mode, project-setup
```
✅ Titlu descriptiv, reinforced de 4 ori, explicit, exemple, tags multiple