--- name: roa-vfp-text-edit description: Editeaza cod si proprietati din binarele VFP (.vcx/.scx) prin versiunile lor text FoxBin2Prg (.vc2/.sc2) - localizeaza metoda, editeaza byte-safe, face write-back pe binar si ruleaza verificarile obligatorii. Foloseste-l OBLIGATORIU cand utilizatorul spune "editeaza metoda X din clasa Y", "adauga o proprietate in clasa Z", "modifica procedura din formularul W", "cauta in .vcx/.scx", "unde e definit ", "write-back pe binar", "txt2vcx" sau cere orice schimbare de cod care nu sta in .prg. Fluxul e cel mai predispus la coruperea ireversibila a intregului fisier: o editare gresita (diacritice rescrise, LF izolat, membru lipsa din *) strica tot binarul si trece tacit de fidelity-check. Nu improviza cu Edit/Write si nu sari peste verificarile de dovezi. --- # Editare cod VFP via text (.vc2/.sc2) cu write-back pe binar Textul `.vc2`/`.sc2` e sursa de editare; binarul `.vcx`/`.scx` (+ `.vct`/`.sct`) se regenereaza punctual, fara VFP IDE. O singura greseala corupe ireversibil tot fisierul. ## Cand se foloseste Orice cerere care atinge cod/proprietati din binare VFP: - "editeaza metoda X din clasa Y", "adauga proprietatea P in clasa Z", "modifica `do_salvare`"; - "cauta in .vcx/.scx", "unde se defineste ``", "cine mosteneste clasa W"; - "write-back pe binar", "txt2vcx", "converteste .vc2 in .vcx"; - orice schimbare de cod care nu sta in `.prg` (metode de clasa / forma). Doar `.vcx` si `.scx` au write-back. `.frx/.mnx/.lbx/.pjx/.dbc/.dbf` raman read-only - doar in IDE. ## Pasi 0. Refresh text, obligatoriu la inceput de sesiune si dupa orice sesiune IDE (staleness pe mtime): `git_sync.ps1 -ProjectRoot ` (proiecte nemigrate: `vcx2txt.ps1` cu `-CacheRoot` separat). 1. Localizeaza intervalul EXACT al metodei inainte de a edita ceva: `vfp_symbols.ps1 ... -Where '.vc2:'` sau `-Class ''`. Fara ele nimeresti `Init`-ul altei clase. 2. Baseline: `Copy-Item .vc2 .vc2.pre_runda.bak` (langa binar, in arbore). 3. Cens de octeti >= 0x80 INAINTE de editare (vezi Criterii). Retine secventa exacta. 4. Editeaza byte-safe: PowerShell `[IO.File]::ReadAllText`/`WriteAllText(..., GetEncoding(1250))`. NU folosi `Edit`/`Write` (rescriu UTF-8 si distrug diacriticele). Continut nou strict ASCII, TAB-uri ca in jur, fara reflow. 5. Membru NOU (proprietate/metoda): adauga `*p: nume` / `*m: nume` in `*`, la pozitia alfabetica. Override de metoda mostenita NU cere `*m:`. 6. Patch review: `git diff --no-index > docs/diff_runda_.patch` (exit 1 = normal). Utilizatorul aproba patch-ul; aprobarea conditioneaza COMMIT-ul, nu write-back-ul. 7. Write-back: `txt2vcx.ps1 -TextFile -ProjectRoot ` (+ `-AllowComun` pentru tinte COMUN). Daca binarul e lockat, cere utilizatorului sa inchida sesiunea - nu omori procese. 8. Verificarile obligatorii de dupa write-back (vezi Criterii) - sunt separate de fidelity-check. 9. Teste e2e pe cerinta initiala, cu valorile ei asteptate, pe fluxul real al utilizatorului. 10. Curatenie dupa commit: `powershell -File COMUN\utile\curatenie.ps1`. ## Capcane - **Membru lipsa din `*`**: `txt2vcx` trece fidelity-check-ul, binarul primeste valoarea, dar VFP nu materializeaza membrul; prima salvare din IDE il sterge tacit. - **Ordinea alfabetica FoxBin2Prg**: `_` vine DUPA litere (ASCII). Ordinea canonica se citeste din `\verify\*.vc2`, nu se deduce. - **LF izolat**: here-string-urile PowerShell insereaza LF pe liniile noi -> capete de linie amestecate. `-DryRun` NU prinde asta (compara doar textul, nu CRLF vs LF). - **Encoding**: antetul zice `CPID="1252"`, dar octetii diacriticelor sunt cp1250; `EF BF BD` e semnatura coruperii de catre un tool UTF-8. - **`.??2` poate fi mai vechi decat binarul** (snapshot): fara `git_sync` inainte, editezi text depasit, iar write-back-ul pierde ce s-a schimbat in IDE. - **`Column` nu are `When`/`Valid`/`Click`** - se scriu pe `..`; altfel prima salvare din IDE le sterge tacit. - Nu rula *Project > Build* ca sa recompilezi binarul vizat: rescrie antetul tuturor librariilor. - `txt2vcx.ps1`/`vfp_symbols.ps1` fara `-ProjectRoot` cad pe `ROAACNPRO`. Paseaza-le mereu explicit. ## Criterii de acceptare si dovada Fara dovada da/nu de mai jos, editarea NU se raporteaza ca terminata. "Arata bine" nu e dovada. 1. Cens octeti >= 0x80 identic inainte/dupa (secventa, nu doar totalul): `od -An -tx1 | tr ' ' '\n' | grep -v '^$' | awk '$1>"7f"' | sort | uniq -c` -> secventa identica; cauta explicit `EF BF BD` (trebuie absent). 2. Zero LF izolat: `perl -e 'local $/; open F,"<:raw",$ARGV[0]; $d=; $crlf=()=$d=~/\r\n/g; $lf=()=$d=~/\n/g; print $lf-$crlf' ` -> 0. 3. Fidelity-check al write-back-ului: `txt2vcx.ps1` a reusit, mtime nou pe `.vcx`+`.vct`. 4. Membrul nou prezent: `grep -n '\*[pm]: ' .vc2` -> o linie, la pozitia alfabetica. 5. Round-trip binar: `vcx2txt.ps1` ulterior vede binarul la zi (text regenerat identic). 6. Dupa orice sesiune IDE: `git_sync` + compara lista `*p:`/`*m:` cu starea de dinainte. ## Scripturi - `D:\ROA\UTIL\foxbin2prg\git_sync.ps1` - `D:\ROA\UTIL\foxbin2prg\vcx2txt.ps1` - `D:\ROA\UTIL\foxbin2prg\txt2vcx.ps1` - `D:\ROA\UTIL\foxbin2prg\vfp_symbols.ps1` ## Referinta (doar la nevoie) - Doar daca ai nevoie de detaliile adanci (tabel de octeti, exemple de capcane), citeste `COMUN\docs\flux-editare-vfp-text.md` si `COMUN\docs\conventie_encoding_cp1252.md`.