--- name: roa-onboarding description: Inroleaza un calculator nou sau un proiect nou ROA in fluxul SVN + git-text FoxBin2Prg - cheie SSH Gitea (+ host/port 222), global-ignores SVN, clone foxbin2prg, clone git per proiect si COMUN, conversie initiala, roa_sync.bat, expunerea skill-urilor (leaga_skills.ps1) si backstop-ul de rutare (scrie_backstop_skills.ps1). Foloseste-l cand utilizatorul spune "inroleaza proiectul", "adauga proiectul in fluxul git-text", "pregateste un calculator nou", "cloneaza proiectul pe masina asta", "expune skill-urile", "aplica backstop-ul", sau cand un proiect nu are inca .git / COMUN.git / roa_sync.bat. Nu acopera editarea de text VFP (skill roa-vfp-text-edit) si nu face commit-uri SVN. --- # Inrolarea unui calculator nou sau a unui proiect nou ROA (SVN + git-text FoxBin2Prg) Doar PowerShell (NU Bash - `bash.exe` crapa pe aceste masini si lasa stackdump-uri). Niciun `svn commit`, nicio modificare de binare VFP in acest flux. Nu forta (`--force`, `reset --hard`) fara sa arati intai utilizatorului ce s-ar pierde. ## Cand se foloseste - **Calculator nou**: nu are cheie SSH la Gitea, nu are `D:\ROA\UTIL\foxbin2prg`, nu are clonele git ale proiectelor (repo-urile Gitea EXISTA deja si doar se cloneaza). - **Proiect nou in fluxul git-text**: repo-ul Gitea inca nu exista sau proiectul nu are `.git`, `COMUN\.git`, `roa_sync.bat` (nu are inca fluxul in care git urmareste textele `.??2`). - "expune skill-urile pe masina asta" (`leaga_skills.ps1`), "aplica backstop-ul de rutare" (`scrie_backstop_skills.ps1`). Nu acopera: editarea `.vc2`/`.sc2` (skill `roa-vfp-text-edit`), commit/sync curent (skill `roa-git-svn-commit`). ## Pasi ### A. Preconditii pe masina 1. VFP9 IDE instalat (pentru `.frx`/`.mnx`/`.lbx`/`.pjx`/`.dbc`, care nu au write-back text). 2. Client SVN spre `http://svnroa:3001/svn/ROA`; Git for Windows (aduce `git`, `ssh`, `ssh-keygen`); PowerShell 5.1+. 3. Cheie SSH + host Gitea: - `ssh-keygen -t ed25519 -C "@"`; porneste agentul (`Start-Service ssh-agent`), `ssh-add` cheia; adauga cheia `.pub` in Gitea (profil -> Settings -> SSH Keys). - `%USERPROFILE%\.ssh\config`: Gitea raspunde pe portul **222**, iar DNS-ul `gitea.romfast.ro` poate lipsi, deci adauga explicit: ``` Host gitea.romfast.ro HostName 10.0.20.165 User git Port 222 ``` - Verificare: `ssh -T git@gitea.romfast.ro` reuseste (nu "Permission denied"). 4. `%APPDATA%\Subversion\config`, `[miscellany]`: adauga la `global-ignores` `*.vc2 *.sc2 *.fr2 *.mn2 *.lb2 *.pj2 *.dc2 *.db2 *.dbf.cfg` (altfel textele FoxBin2Prg apar ca `?` in `svn status` si risca `svn add` accidental). 5. Utilitarul: `git clone git@gitea.romfast.ro:romfast/foxbin2prg.git D:\ROA\UTIL\foxbin2prg` (branch `romfast`; `git remote -v` sa arate fork-ul romfast, nu upstream-ul github). ### B. Proiect nou in fluxul git-text 6. Inventar INAINTE de orice stergere: exista `.git`? (`git remote -v`, branch). Exista `COMUN\.git`? Pe un repo vechi, `git ls-files *.dbf` arata tabelele urmarite ca binare - candidate la `.db2`. 7. Conversie completa: `& D:\ROA\UTIL\foxbin2prg\git_sync.ps1 -ProjectRoot D:\ROA\`. Esecurile se investigheaza fiecare: meniuri pre-VFP9 raman binare (exceptie `!` in `.gitignore`); clase FFC/third-party cu roundtrip fals-negativ -> `-RoundtripExempt`; un binar care nu poate fi nici macar CITIT (memo invalid) se repara (perechea `.vcx`+`.vct` valida dintr-o alta clona COMUN). Nu se trece mai departe cu esecuri neexplicate (exit nenul). 8. `.gitignore` (model `D:\ROA\ROACONT\.gitignore`: fiecare `.dbf` care are `.db2` se ignora INDIVIDUAL; nu se ignora `*.??2`) + `.gitattributes` cu `* -text` (SVN ramane autoritatea EOL). 9. Repo proiect: `git init -b main`; `git remote add origin git@gitea.romfast.ro:romfast/.git`; `git add -A`. VERIFICARE obligatorie inainte de commit: 0 binare convertibile urmarite (cu exceptiile `!` justificate), textele `.??2` prezente, 0 fisiere din `COMUN/`. Commit `Initial: flux text FoxBin2Prg ...`; apoi `git push -u origin main`. 10. COMUN: `git init -b main` in `\COMUN`; `git remote add origin git@gitea.romfast.ro:romfast/comun.git`; `git fetch origin`; `git reset origin/main` (mixed, pastreaza discul); `git checkout origin/main -- .gitignore`. Diferentele ramase in `git status` = revizii SVN diferite (normal). Nu comite in `comun.git` dintr-o clona decalata. 11. `roa_sync.bat`: copiaza `D:\ROA\ROAFACTURARE\roa_sync.bat` in radacina proiectului (generic, foloseste `%~dp0` si cheama `COMUN\scripts\roa_sync.ps1`) si include-l in commit. 12. Verificari finale: acoperire (fiecare binar convertibil din arbore, inclusiv COMUN, are text `.??2` langa el, mai putin exceptiile `!`); `svn status` fara binare M si fara `.??2` adaugat; `git ls-remote origin main` = HEAD-ul local. Raport: numar texte per tip, esecuri/scutiri, commit hash, push status. ### C. Skill-uri de agent pe masina 13. Expune (o singura data per masina): `powershell -ExecutionPolicy Bypass -File D:\ROA\\COMUN\utile\leaga_skills.ps1` (intai `-DryRun`). Creeaza symlink-uri in `%USERPROFILE%\.claude\skills\` catre `COMUN\skills\` - fara copiere, deci aceleasi fisiere sunt vazute si de Claude Code, si de opencode. Idempotent; nu sterge un director real cu acelasi nume. 14. Backstop per proiect: `COMUN\utile\scrie_backstop_skills.ps1 -Root D:\ROA -Proiecte ` (intai `-DryRun`; fara `-Proiecte` = toate proiectele detectate - NU rula asa fara acord). Scrie `AGENTS.md` si un bloc marcat intre `` si `` in `CLAUDE.md`. Idempotent. 15. Dupa orice `git pull`/`roa_sync` in `COMUN\` sau dupa modificarea skill-urilor, re-ruleaza pasii 13+14 (sunt idempotenti). NU copia manual fisiere de skill - se pierde legatura cu sursa. ## Capcane - `bash.exe` crapa pe aceste masini si lasa stackdump-uri - foloseste EXCLUSIV PowerShell. - Parametrii array (ex. `-DbfList`, `-RoundtripExempt`) NU se pot pasa prin `powershell -File`: invoca scriptul in-process cu `&`, altfel array-ul se colapseaza. - Gitea raspunde pe portul **222**, nu 22; fara blocul `Host` din `ssh\config` -> "Connection refused" sau "Could not resolve hostname", chiar daca cheia e corecta. - Intr-o clona COMUN decalata NU se comite: `comun.git` se comite doar din clona in care s-a lucrat efectiv, dupa `svn update`. - Conversia `git_sync` dureaza zeci de minute pe proiecte mari si e incrementala: la expirarea timeout-ului tool-ului se reia pana la capat; NU rula doua conversii in paralel pe acelasi arbore (FoxBin2Prg foloseste artefacte partajate in `%TEMP%`). - Fisierele doar-git (docs, `.bat`, `.gitignore`) se comit INAINTE de sync-ul `sync SVN rN`, altfel nimeresc in commit-ul de sincronizare. ## Criterii de acceptare si dovada Fara dovada da/nu de mai jos, inrolarea NU se raporteaza ca terminata: 1. `ssh -T git@gitea.romfast.ro` reuseste. 2. `svn status D:\ROA\`: niciun binar convertibil modificat si niciun text `.??2` adaugat in SVN. 3. `git -C ls-remote origin main` = HEAD-ul local; la fel pentru `\COMUN`; `git status` curat sau doar diferente de revizie SVN. 4. Acoperire: fiecare binar convertibil din arbore (inclusiv COMUN) are text `.??2` langa el, mai putin exceptiile `!` enumerate si justificate. 5. `leaga_skills.ps1 -DryRun` raporteaza 0 de refacut; `scrie_backstop_skills.ps1 -DryRun` idempotent (0 modificari) dupa prima aplicare. 6. Niciun `svn commit` facut in acest flux (commit-ul il face utilizatorul, prin skill `roa-git-svn-commit`). ## Scripturi - `D:\ROA\UTIL\foxbin2prg\git_sync.ps1`, `vfp_filemap.ps1`, `txt2vcx.ps1`, `test_git_sync.ps1`, `test_roundtrip.ps1`. - `\COMUN\scripts\roa_sync.ps1` (+ `roa_sync.bat` in radacina proiectului). - `\COMUN\utile\leaga_skills.ps1`, `scrie_backstop_skills.ps1` (+ `backstop_skills.txt`). ## Referinta (doar la nevoie) - `COMUN\docs\onboarding\` - `inrolare-calculator-nou.md` (masina noua) si `inrolare-proiect-git-text.md` (proiect nou): pasii detaliati, verificari complete si note operationale FoxBin2Prg.