sync SVN r18113

This commit is contained in:
2026-09-16 12:02:46 +03:00
parent d64124386c
commit 20a751eca4
2 changed files with 141 additions and 0 deletions

15
utile/backstop_skills.txt Normal file
View File

@@ -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`

View File

@@ -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 = '<!-- roa-skills:start -->'
$MarkerEnd = '<!-- roa-skills:end -->'
$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