Files
Marius Mutu d64124386c skills: 9 skill-uri de agent ROA (COMUN\skills) + legare si rutare
- leaga_skills.ps1: expune skill-urile in ~/.claude/skills prin symlink (citit si de Claude Code, si de opencode), fara copiere
- rutare zona->skill in reguli_lucru pct. 7, README, AGENTS.md; skill-ul devine proprietarul procedurii, docurile raman referinta conditionata
- rec_skills.md: decizia, inventarul si cum se adauga un skill nou
2026-09-16 11:54:37 +03:00

5.5 KiB

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 <nume>", "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

  1. Refresh text, obligatoriu la inceput de sesiune si dupa orice sesiune IDE (staleness pe mtime): git_sync.ps1 -ProjectRoot <root> (proiecte nemigrate: vcx2txt.ps1 cu -CacheRoot separat).
  2. Localizeaza intervalul EXACT al metodei inainte de a edita ceva: vfp_symbols.ps1 ... -Where '<fisier>.vc2:<linie>' sau -Class '<nume>'. Fara ele nimeresti Init-ul altei clase.
  3. Baseline: Copy-Item <f>.vc2 <f>.vc2.pre_runda<N>.bak (langa binar, in arbore).
  4. Cens de octeti >= 0x80 INAINTE de editare (vezi Criterii). Retine secventa exacta.
  5. 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.
  6. Membru NOU (proprietate/metoda): adauga *p: nume / *m: nume in *<DefinedPropArrayMethod>, la pozitia alfabetica. Override de metoda mostenita NU cere *m:.
  7. Patch review: git diff --no-index <bak> <editat> > docs/diff_runda<N>_<subiect>.patch (exit 1 = normal). Utilizatorul aproba patch-ul; aprobarea conditioneaza COMMIT-ul, nu write-back-ul.
  8. Write-back: txt2vcx.ps1 -TextFile <vc2> -ProjectRoot <root> (+ -AllowComun pentru tinte COMUN). Daca binarul e lockat, cere utilizatorului sa inchida sesiunea - nu omori procese.
  9. Verificarile obligatorii de dupa write-back (vezi Criterii) - sunt separate de fidelity-check.
  10. Teste e2e pe cerinta initiala, cu valorile ei asteptate, pe fluxul real al utilizatorului.
  11. Curatenie dupa commit: powershell -File COMUN\utile\curatenie.ps1.

Capcane

  • Membru lipsa din *<DefinedPropArrayMethod>: 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 <staging>\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 <grid>.<coloana>.<control>; 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 <fisier> | 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=<F>; $crlf=()=$d=~/\r\n/g; $lf=()=$d=~/\n/g; print $lf-$crlf' <fisier> -> 0.
  3. Fidelity-check al write-back-ului: txt2vcx.ps1 a reusit, mtime nou pe .vcx+.vct.
  4. Membrul nou prezent: grep -n '\*[pm]: <nume>' <f>.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.