Files
comun/docs/PROMPT_cautare_vfp.md
2026-08-03 02:50:05 +03:00

8.2 KiB

Prompt: căutare și editare în cod VFP (foxbin2prg) — reutilizabil în orice proiect Visual FoxPro

Prompt gata de copiat pentru Claude Code (sau alt agent), care configurează și folosește sistemul foxbin2prg ca să poată căuta cod-sursă aflat în interiorul fișierelor binare VFP (.vcx/.vct, .scx/.sct, .frx/.frt, .mnx/.mnt, .dbc/.dct) într-un proiect nou — și, pentru .vcx/.scx, să poată și modifica acel cod direct pe text, cu write-back în binar (txt2vcx.ps1), fără trecere prin IDE-ul VFP.

Unealta e partajată, la D:\ROA\UTIL\foxbin2prg\ — nu se copiază per proiect. Doar spui agentului care e proiectul curent (folderul + fișierul .pjx).


Cum se folosește

  1. Deschide proiectul VFP în Claude Code.
  2. Copiază blocul de mai jos în prompt.
  3. Înlocuiește cele 3 valori marcate <<...>>:
    • <<RADACINA_PROIECT>> = folderul rădăcină al proiectului (ex. D:\ROA\ROAGEST)
    • <<FISIER_PJX>> = calea către .pjx (ex. D:\ROA\ROAGEST\roagest.pjx)
    • <<NUME_PROIECT>> = etichetă scurtă pentru folderul de cache (ex. roagest)

▼▼▼ PROMPT DE COPIAT ▼▼▼

Acest proiect este o aplicație Visual FoxPro 9. O mare parte din cod (proceduri, metode,
parametri) NU stă în fișiere .prg, ci în interiorul fișierelor binare VFP: librării de clase
(.vcx+.vct), forme (.scx+.sct), rapoarte (.frx+.frt), meniuri (.mnx+.mnt). Un grep direct pe
acestea nu e lizibil (sunt tabele DBF cu memo binar).

Ca să poți căuta în acel cod, folosește unealta partajată foxbin2prg, care convertește binarele
în reprezentarea lor TEXT (.vc2/.sc2/.fr2/.mn2/.dc2) într-un cache, și apoi caută în cache.

PARAMETRII PROIECTULUI CURENT:
- Rădăcină proiect: <<RADACINA_PROIECT>>
- Fișier proiect (.pjx): <<FISIER_PJX>>
- Cache text: D:\ROA\_vfp_textcache\<<NUME_PROIECT>>

REGULA DE AUR: cache-ul text e sursa pentru CĂUTARE (toate tipurile de binar) și, DOAR pentru
.vcx/.scx, și pentru EDITARE cu write-back (txt2vcx.ps1, vezi PAS 3). Pentru .frx/.mnx/.dbc
textul rămâne doar pentru citire — modificările la ele se fac în IDE-ul VFP, pe binar.

PAS 1 — populează cache-ul text (la începutul sesiunii, sau după ce s-a modificat ceva în IDE).
Rulează în PowerShell (e incremental — sare peste ce e deja la zi):

  & 'D:\ROA\UTIL\foxbin2prg\vcx2txt.ps1' -Project '<<FISIER_PJX>>' -ProjectRoot '<<RADACINA_PROIECT>>' -CacheRoot 'D:\ROA\_vfp_textcache\<<NUME_PROIECT>>'

  (Folosește un -CacheRoot distinct per proiect ca să nu amesteci cache-urile. Implicit scriptul
   convertește doar .vcx și .scx; pentru a include și rapoarte/meniuri adaugă: -Types vcx,scx,frx,mnx)

Dacă scriptul se plânge că lipsește FoxBin2Prg.EXE, trebuie compilat o singură dată: deschide
'D:\ROA\UTIL\foxbin2prg\foxbin2prg.pj2' în VFP 9 și Build > Build Executable. Anunță-mă să fac asta.

PAS 2 — caută în cache cu unealta Grep (NU în binarele originale):

  Grep pe folderul 'D:\ROA\_vfp_textcache\<<NUME_PROIECT>>' pentru numele de metodă/procedură/variabilă căutat.
  Ex.: caută "PROCEDURE do_salvare" sau numele tabelei/cursorului implicat.

PAS 2b — atribuie rezultatele clasei/metodei care le conține. Grep dă doar fișier:linie, iar
într-un .vc2 antetul clasei poate fi cu mii de linii mai sus și ~2/3 din fișier e metadata:

  & 'D:\ROA\UTIL\foxbin2prg\vfp_symbols.ps1' -CacheRoot 'D:\ROA\_vfp_textcache\<<NUME_PROIECT>>' -ProjectRoot '<<RADACINA_PROIECT>>' -Grep 'expresie' -CodeOnly

  Alte moduri: -Where 'fisier.vc2:1234' (cine deține linia), -Find 'nume' (unde e DEFINIT, nu și
  apelurile), -Class 'nume_clasa' (lanț de moștenire + metode cu intervalele de linii).
  Indexul se reconstruiește singur din cache; rulează PAS 1 înainte.
  OBLIGATORIU înainte de PAS 3: intervalul exact al metodei. Într-un .vc2 cu multe clase, Init,
  Show, do_adauga există în aproape fiecare — fără interval editezi metoda din altă clasă.

CONVERSIE PUNCTUALĂ (un fișier sau folder care NU e în proiect, ex. o librărie din COMUN):

  & 'D:\ROA\UTIL\foxbin2prg\vcx2txt.ps1' -Source 'CALE\catre\librarie.vcx' -CacheRoot 'D:\ROA\_vfp_textcache\<<NUME_PROIECT>>'

ALTE OPȚIUNI: -Force (reconvertește tot), -Clean (șterge cache-ul întâi).

PAS 3 — modificare de cod în .vcx/.scx (flux write-back pe text). Ordinea e obligatorie:

  a. Investighează pe cache, propune modificarea și AȘTEAPTĂ ACORDUL pe abordare înainte să
     editezi ceva.
  b. Refresh cache (PAS 1) dacă a rulat vreo sesiune de IDE de la ultimul refresh (staleness-ul
     se verifică pe mtime și txt2vcx refuză corect scrierea peste modificări nevăzute). Înainte
     de write-back închide COMPLET VFP IDE și exe-ul aplicației — procesele reziduale țin lock
     pe binare.
  c. Editează .vc2/.sc2 BYTE-SAFE: formatul e position-sensitive (nu reformata/reflow linii),
     proprietățile sunt alfabetizate (una nouă se inserează la locul ei alfabetic). Headerul
     CPID="1252" poate minți despre codepage-ul real al diacriticelor — citește/scrie fișierul
     ca bytes (PowerShell), conținutul NOU doar ASCII; nu folosi unelte care re-encodează.
  d. Write-back:

     & 'D:\ROA\UTIL\foxbin2prg\txt2vcx.ps1' -TextFile 'D:\ROA\_vfp_textcache\<<NUME_PROIECT>>\Clase\lib.vc2' -ProjectRoot '<<RADACINA_PROIECT>>' -CacheRoot 'D:\ROA\_vfp_textcache\<<NUME_PROIECT>>'

     Regenerează + compilează binarul în staging, verifică fidelitatea (roundtrip byte-identic
     față de textul editat) și abia apoi copiază binarul în proiect; la orice eșec proiectul
     rămâne neatins. Ținte sub COMUN\ cer flag-ul -AllowComun ȘI aprobare explicită — o
     modificare acolo afectează toate aplicațiile ROA.
  e. Diff lizibil pentru review: extrage binarul vechi din git (git show HEAD:cale > temp, atât
     .vcx cât și .vct), regenerează-i textul cu vcx2txt.ps1 -Source într-un folder temporar și
     compară cu cache-ul editat: git diff --no-index. COMMIT DOAR după ce omul confirmă pe diff
     și testează în IDE.

EXCEPȚII: pentru .mnx (GENMENU) și .frx (fragile la round-trip) nu există write-back — scrie
propunerea de modificare într-un fișier docs/propuneri_<subiect>.md (cod + unde se inserează),
iar aplicarea se face manual în IDE-ul VFP.

FLUX TIPIC: la prima sesiune rulează PAS 1 o dată, apoi caută cu Grep în cache (PAS 2). La
sesiunile următoare rescrie doar ce s-a schimbat. Când citești codul unei metode, dă referințe
fișier:linie din cache.

▲▲▲ SFÂRȘIT PROMPT ▲▲▲


Note pentru adaptare

  • <<NUME_PROIECT>> poate fi orice etichetă scurtă (ex. roagest), unică per proiect (numele folderului de cache).
  • Ține cache-ul în D:\ROA\_vfp_textcache\, adică în afara folderului foxbin2prg. Motiv: ReCreate_FoxBin2Prg.prg face Prg2Bin recursiv pe tot folderul tool-ului și ar reconverti .??2-urile din orice cache aflat sub el înapoi în binare parazitare.
  • Scriptul citește lista de fișiere direct din .pjx, deci convertește doar ce folosește efectiv proiectul (rapid), nu tot COMUN\.
  • Cache-ul e regenerabil, în afara arborelui de versionare al proiectului (și al clonei foxbin2prg) — poate fi șters oricând.
  • Conversia NU necesită IDE-ul VFP deschis (folosește FoxBin2Prg.EXE compilat).
  • Fără backup-uri .bak lângă binarele din proiect — git e mecanismul de restore; txt2vcx.ps1 ține o copie de siguranță doar în folderul temp al rulării.
  • Editările de volum se pot delega la subagenți (Sonnet, în background) — sesiunea principală orchestrează, verifică diff/fidelity și intervine doar la deblocări și decizii.
  • Detalii complete despre write-back (guard-uri, encoding, dialoguri VFP modale la text corupt, testul de regresie test_roundtrip.ps1): D:\ROA\UTIL\foxbin2prg\CLAUDE.md.
  • Exemplu funcțional, rodat pe ROAGEST: D:\ROA\ROAGEST\docs\flux-editare-vfp-text.md și D:\ROA\ROAGEST\docs\CLAUDE.md (modul de lucru complet, cu review pe diff înainte de commit).
  • Ghid complet doar-căutare (varianta ROAACNPRO, cu exemple): D:\ROA\ROAACNPRO\docs\cautare_vcx_vct.md.
  • Tabel corespondență binar → text: .vcx.vc2, .scx.sc2, .frx.fr2, .mnx.mn2, .dbc.dc2, .lbx.lb2.