From 20a751eca47c3effd8f8b2a91cba2dbb7a97ca4d Mon Sep 17 00:00:00 2001 From: Marius Mutu Date: Wed, 16 Sep 2026 12:02:46 +0300 Subject: [PATCH] sync SVN r18113 --- utile/backstop_skills.txt | 15 ++++ utile/scrie_backstop_skills.ps1 | 126 ++++++++++++++++++++++++++++++++ 2 files changed, 141 insertions(+) create mode 100644 utile/backstop_skills.txt create mode 100644 utile/scrie_backstop_skills.ps1 diff --git a/utile/backstop_skills.txt b/utile/backstop_skills.txt new file mode 100644 index 0000000..c9056a2 --- /dev/null +++ b/utile/backstop_skills.txt @@ -0,0 +1,15 @@ +Regulile complete de lucru ROA (livrare, comentarii, modificari minime, testare, delegare): `COMUN\docs\reguli_lucru.md`. Punctul 7 ruteaza fiecare zona atinsa. + +Backstop de rutare: cand atingi o zona de mai jos, incarca skill-ul care o detine (el are +procedura si criteriile care blocheaza "gata"); docurile sunt doar referinta conditionata a +skill-ului. + +- editezi `.vc2`/`.sc2`/`.prg` cu diacritice, cauti in `.vcx`/`.scx`, adaugi membri de clasa -> skill `roa-vfp-text-edit` +- rulezi sau depanezi teste headless ori UI -> skill `roa-vfp-headless-test` +- commit / `svn update` / `roa_sync` in COMUN -> skill `roa-git-svn-commit` +- scrii sau publici scripturi de migrare Oracle, reexporti un pachet -> skill `roa-oracle-migration` +- actualizarea ROA nu se termina sau tablespace plin -> skill `roa-oracle-diagnostic` +- acces la un Oracle de productie (tunel SSH + TNS + DSN) -> skill `roa-oracle-production-access` +- garzi pe valori NULL din Oracle in VFP -> skill `roa-vfp-null-guards` +- `GO` pe un `Recno()` capturat sau primit ca parametru -> skill `roa-vfp-go-recno` +- procedura PL/SQL cu `SELECT ... INTO` apelata din VFP (randuri pierdute tacut) -> skill `roa-oracle-sqlexec-no-data` diff --git a/utile/scrie_backstop_skills.ps1 b/utile/scrie_backstop_skills.ps1 new file mode 100644 index 0000000..c124490 --- /dev/null +++ b/utile/scrie_backstop_skills.ps1 @@ -0,0 +1,126 @@ +# scrie_backstop_skills.ps1 - scrie blocul backstop de rutare a skill-urilor in AGENTS.md si CLAUDE.md +# ale fiecarui proiect ROA. Sursa unica: backstop_skills.txt (langa acest script). +# Idempotent: a doua rulare nu schimba nimic. -DryRun doar listeaza ce ar face. +# Utilizare: +# powershell -File COMUN\utile\scrie_backstop_skills.ps1 -Root D:\ROA +# powershell -File COMUN\utile\scrie_backstop_skills.ps1 -Root D:\ROA -DryRun +param( + [string]$Root = 'D:\ROA', + [switch]$DryRun +) + +$ErrorActionPreference = 'Stop' + +$MarkerStart = '' +$MarkerEnd = '' +$TitluAgents = '# AGENTS.md' +$NumeSarite = @('COMUNROA', 'UTIL') +$Utf8FaraBom = New-Object System.Text.UTF8Encoding($false) + +$sursa = Join-Path $PSScriptRoot 'backstop_skills.txt' +if (-not (Test-Path -LiteralPath $sursa -PathType Leaf)) { + Write-Output ('scrie_backstop_skills: nu gasesc blocul canonic ' + $sursa + ' - nimic de facut.') + exit 0 +} +$bloc = ([IO.File]::ReadAllText($sursa)).Replace("`r`n", "`n").TrimEnd("`n") + +function Ia-Sectiune { + # sectiunea marcata, cu terminatorii de linie dati + param([string]$nl) + return $MarkerStart + $nl + $bloc.Replace("`n", $nl) + $nl + $MarkerEnd +} + +function Ia-Terminator { + param([string]$Continut) + if ($Continut.Contains("`r`n")) { return "`r`n" } + if ($Continut.Contains("`n")) { return "`n" } + return "`r`n" +} + +function Ia-Encoding { + # pastreaza BOM-ul original daca exista, altfel scrie UTF-8 fara BOM + param([string]$Cale) + $b = [IO.File]::ReadAllBytes($Cale) + if ($b.Length -ge 3 -and $b[0] -eq 0xEF -and $b[1] -eq 0xBB -and $b[2] -eq 0xBF) { + return (New-Object System.Text.UTF8Encoding($true)) + } + return $Utf8FaraBom +} + +function Continut-Marcat { + # noul continut, sau $null daca nu e nevoie de nicio schimbare (idempotent) + param([string]$Continut, [string]$nl) + $sect = Ia-Sectiune $nl + $si = $Continut.IndexOf($MarkerStart) + $ei = $Continut.IndexOf($MarkerEnd) + if ($si -ge 0 -and $ei -gt $si) { + $nou = $Continut.Substring(0, $si) + $sect + $Continut.Substring($ei + $MarkerEnd.Length) + } else { + $nou = $Continut.TrimEnd("`r", "`n") + $nl + $nl + $sect + $nl + } + if ($nou -eq $Continut) { return $null } + return $nou +} + +if (-not (Test-Path -LiteralPath $Root -PathType Container)) { + Write-Output ('scrie_backstop_skills: nu gasesc radacina ' + $Root + ' - nimic de facut.') + exit 0 +} + +$proiecte = @(Get-ChildItem -LiteralPath $Root -Directory -ErrorAction SilentlyContinue | Sort-Object Name) +$gasite = 0; $create = 0; $actualizate = 0; $ok = 0; $sarite = 0 + +foreach ($p in $proiecte) { + if ($NumeSarite -contains $p.Name) { continue } + if (-not (Test-Path -LiteralPath (Join-Path $p.FullName 'COMUN') -PathType Container)) { continue } + $areSvn = Test-Path -LiteralPath (Join-Path $p.FullName '.svn') -PathType Container + $areGit = Test-Path -LiteralPath (Join-Path $p.FullName '.git') -PathType Container + if (-not ($areSvn -or $areGit)) { continue } + + $gasite++ + Write-Output ('Proiect: ' + $p.Name) + + foreach ($nume in @('AGENTS.md', 'CLAUDE.md')) { + $cale = Join-Path $p.FullName $nume + + if (-not (Test-Path -LiteralPath $cale -PathType Leaf)) { + if ($nume -eq 'CLAUDE.md') { + Write-Output (' ' + $nume + ' sarit - lipseste') + $sarite++ + continue + } + $nl = "`r`n" + $nou = $TitluAgents + $nl + $nl + (Ia-Sectiune $nl) + $nl + if ($DryRun) { + Write-Output (' ' + $nume + ' ar crea') + } else { + [IO.File]::WriteAllText($cale, $nou, $Utf8FaraBom) + Write-Output (' ' + $nume + ' creat') + } + $create++ + continue + } + + $raw = [IO.File]::ReadAllText($cale) + $nl = Ia-Terminator $raw + $nou = Continut-Marcat -Continut $raw -nl $nl + if ($null -eq $nou) { + Write-Output (' ' + $nume + ' ok') + $ok++ + continue + } + if ($DryRun) { + Write-Output (' ' + $nume + ' ar actualiza') + } else { + [IO.File]::WriteAllText($cale, $nou, (Ia-Encoding $cale)) + Write-Output (' ' + $nume + ' actualizat') + } + $actualizate++ + } +} + +Write-Output '' +$eticheta = 'scrie_backstop_skills' +if ($DryRun) { $eticheta = $eticheta + ' (DryRun)' } +Write-Output ($eticheta + ': ' + $gasite + ' proiecte, ' + $create + ' create, ' + $actualizate + ' actualizate, ' + $ok + ' neschimbate, ' + $sarite + ' sarite') +exit 0