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

84 lines
5.5 KiB
Markdown

---
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 <nume>", "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 *<DefinedPropArrayMethod>) 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
0. 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).
1. 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.
2. Baseline: `Copy-Item <f>.vc2 <f>.vc2.pre_runda<N>.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
`*<DefinedPropArrayMethod>`, la pozitia alfabetica. Override de metoda mostenita NU cere `*m:`.
6. 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.
7. Write-back: `txt2vcx.ps1 -TextFile <vc2> -ProjectRoot <root>` (+ `-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 `*<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`.