- 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
84 lines
5.5 KiB
Markdown
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`.
|