From 614206bc5c0e07c4b5f9f902868234a317516d58 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Sat, 26 Sep 2026 13:59:42 +0300 Subject: [PATCH] =?UTF-8?q?fix(db-repo,=20stub-db-create):=20=D0=B2=D1=80?= =?UTF-8?q?=D0=B5=D0=BC=D0=B5=D0=BD=D0=BD=D1=8B=D0=B5=20=D1=84=D0=B0=D0=B9?= =?UTF-8?q?=D0=BB=D1=8B=20=D0=B1=D0=B5=D0=B7=20=D1=84=D0=B8=D0=BA=D1=81?= =?UTF-8?q?=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=BD=D1=8B=D1=85=20=D0=B8?= =?UTF-8?q?=D0=BC=D1=91=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Списки объектов и отчёт db-repo лежали в общем временном каталоге под постоянными именами: параллельный запуск молча подменял список, по которому модель перевыгружает устаревшие исходники, а при отказе платформы навык мог напечатать отчёт предыдущего запуска. Имена получают случайный суффикс — путь и так печатается в вывод. Логи /Out базы-заглушки переехали в каталог самой базы: он уникален на запуск и удаляется вместе с ней, чужой или устаревший лог в вывод не попадёт. Co-Authored-By: Claude Opus 5.5 (1M context) --- .claude/skills/db-repo/scripts/db-repo.ps1 | 8 ++++---- .claude/skills/db-repo/scripts/db-repo.py | 8 ++++---- .claude/skills/epf-build/scripts/stub-db-create.ps1 | 6 +++--- .claude/skills/epf-build/scripts/stub-db-create.py | 6 +++--- tests/skills/cases/db-repo/lock-long-list-truncated.json | 2 +- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/.claude/skills/db-repo/scripts/db-repo.ps1 b/.claude/skills/db-repo/scripts/db-repo.ps1 index fb49331f1..9ea803498 100644 --- a/.claude/skills/db-repo/scripts/db-repo.ps1 +++ b/.claude/skills/db-repo/scripts/db-repo.ps1 @@ -1,4 +1,4 @@ -# db-repo v1.17 — 1C configuration repository operations +# db-repo v1.18 — 1C configuration repository operations # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills # NB: движок только 1cv8 — ibcmd работу с хранилищем не поддерживает (нет такого режима). <# @@ -754,7 +754,7 @@ function Write-ReceivedWarning { $owners = Get-OwnerObjects $Received $hasRoot = @($Received | Where-Object { ($_ -split '\.').Count -eq 1 }).Count -gt 0 if ($owners.Count -gt 0) { - $listPath = Join-Path ([IO.Path]::GetTempPath()) "db-repo-received.txt" + $listPath = Join-Path ([IO.Path]::GetTempPath()) "db-repo-received-$(Get-Random).txt" $utf8Bom = New-Object System.Text.UTF8Encoding($true) [System.IO.File]::WriteAllLines($listPath, $owners, $utf8Bom) Write-Host "Исходники в проекте устарели по этим объектам. Перевыгрузите их ПЕРЕД правкой," -ForegroundColor Yellow @@ -843,7 +843,7 @@ $script:ListLimit = 20 function Save-ObjectList { param([string[]]$Names, [string]$Key) if (-not $Key) { $Key = 'objects' } - $path = Join-Path ([IO.Path]::GetTempPath()) "db-repo-$Key.txt" + $path = Join-Path ([IO.Path]::GetTempPath()) "db-repo-$Key-$(Get-Random).txt" $utf8Bom = New-Object System.Text.UTF8Encoding($true) [System.IO.File]::WriteAllLines($path, $Names, $utf8Bom) return $path @@ -1102,7 +1102,7 @@ if ($WithChildren) { switch ($cmd) { 'report' { # Отчёт печатается в вывод, поэтому путь нужен только если его хотят сохранить. - if (-not $OutputFile) { $OutputFile = Join-Path ([IO.Path]::GetTempPath()) "db-repo-report.$ReportFormat" } + if (-not $OutputFile) { $OutputFile = Join-Path ([IO.Path]::GetTempPath()) "db-repo-report-$(Get-Random).$ReportFormat" } } 'dump-cfg' { if (-not $OutputFile) { Write-Host "Error: -OutputFile (path to the .cf file) is required for dump-cfg" -ForegroundColor Red; exit 1 } } 'add-user' { if (-not $NewUser -or -not $Rights) { Write-Host "Error: -NewUser and -Rights are required for add-user" -ForegroundColor Red; exit 1 } } diff --git a/.claude/skills/db-repo/scripts/db-repo.py b/.claude/skills/db-repo/scripts/db-repo.py index 0a42f0c4e..866286b4a 100644 --- a/.claude/skills/db-repo/scripts/db-repo.py +++ b/.claude/skills/db-repo/scripts/db-repo.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# db-repo v1.17 — 1C configuration repository operations +# db-repo v1.18 — 1C configuration repository operations # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills # NB: движок только 1cv8 — ibcmd работу с хранилищем не поддерживает (нет такого режима). """Работа с хранилищем конфигурации 1С. @@ -674,7 +674,7 @@ def print_received_warning(received): owners = owner_objects(received) has_root = any(len(n.split(".")) == 1 for n in received) if owners: - list_path = os.path.join(tempfile.gettempdir(), "db-repo-received.txt") + list_path = os.path.join(tempfile.gettempdir(), "db-repo-received-%d.txt" % random.randint(1, 2 ** 31)) with open(list_path, "w", encoding="utf-8-sig", newline="\n") as f: f.write("\n".join(owners) + "\n") print("Исходники в проекте устарели по этим объектам. Перевыгрузите их ПЕРЕД правкой,") @@ -760,7 +760,7 @@ LIST_LIMIT = 20 def save_object_list(names, key): if not key: key = "objects" - path = os.path.join(tempfile.gettempdir(), "db-repo-%s.txt" % key) + path = os.path.join(tempfile.gettempdir(), "db-repo-%s-%d.txt" % (key, random.randint(1, 2 ** 31))) with open(path, "w", encoding="utf-8-sig", newline="\n") as f: f.write("\n".join(names) + "\n") return path @@ -1052,7 +1052,7 @@ def main(): if cmd == "report" and not args.OutputFile: # Отчёт печатается в вывод, поэтому путь нужен только если его хотят сохранить. - args.OutputFile = os.path.join(tempfile.gettempdir(), "db-repo-report.%s" % args.ReportFormat) + args.OutputFile = os.path.join(tempfile.gettempdir(), "db-repo-report-%d.%s" % (random.randint(1, 2 ** 31), args.ReportFormat)) if cmd == "dump-cfg" and not args.OutputFile: print("Error: -OutputFile (path to the .cf file) is required for dump-cfg") sys.exit(1) diff --git a/.claude/skills/epf-build/scripts/stub-db-create.ps1 b/.claude/skills/epf-build/scripts/stub-db-create.ps1 index 1665df240..2c294825f 100644 --- a/.claude/skills/epf-build/scripts/stub-db-create.ps1 +++ b/.claude/skills/epf-build/scripts/stub-db-create.ps1 @@ -1,4 +1,4 @@ -# stub-db-create v1.13 — Create temp 1C infobase with metadata stubs for EPF/ERF build +# stub-db-create v1.14 — Create temp 1C infobase with metadata stubs for EPF/ERF build # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [Parameter(Mandatory)] @@ -1792,7 +1792,7 @@ if ($needCfg) { $cfgDir = Join-Path $TempBasePath "cfg" # LoadConfigFromFiles Write-Host "Loading configuration from files..." - $loadLog = Join-Path ([IO.Path]::GetTempPath()) "stub_load_log.txt" + $loadLog = Join-Path $TempBasePath "load_log.txt" $loadArgs = "DESIGNER /F`"$TempBasePath`" /LoadConfigFromFiles `"$cfgDir`" /Out `"$loadLog`" /DisableStartupDialogs" + $extraArgString $proc = Invoke-PlatformProcess $V8Path @($loadArgs) -PreQuoted if ($proc.ExitCode -ne 0) { @@ -1804,7 +1804,7 @@ if ($needCfg) { # UpdateDBCfg Write-Host "Updating database configuration..." - $updateLog = Join-Path ([IO.Path]::GetTempPath()) "stub_update_log.txt" + $updateLog = Join-Path $TempBasePath "update_log.txt" $updateArgs = "DESIGNER /F`"$TempBasePath`" /UpdateDBCfg /Out `"$updateLog`" /DisableStartupDialogs" + $extraArgString $proc = Invoke-PlatformProcess $V8Path @($updateArgs) -PreQuoted if ($proc.ExitCode -ne 0) { diff --git a/.claude/skills/epf-build/scripts/stub-db-create.py b/.claude/skills/epf-build/scripts/stub-db-create.py index 34c441602..ad770cded 100644 --- a/.claude/skills/epf-build/scripts/stub-db-create.py +++ b/.claude/skills/epf-build/scripts/stub-db-create.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# stub-db-create v1.13 — Create temp 1C infobase with metadata stubs for EPF/ERF build +# stub-db-create v1.14 — Create temp 1C infobase with metadata stubs for EPF/ERF build # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse @@ -1653,7 +1653,7 @@ def main(): cfg_dir = os.path.join(temp_base, 'cfg') # LoadConfigFromFiles print('Loading configuration from files...') - load_log = os.path.join(tempfile.gettempdir(), 'stub_load_log.txt') + load_log = os.path.join(temp_base, 'load_log.txt') result = run_v8(args.V8Path, ['DESIGNER', f'/F"{temp_base}"', '/LoadConfigFromFiles', f'"{cfg_dir}"', '/Out', f'"{load_log}"', '/DisableStartupDialogs'] + [quote_if_needed(a) for a in extra_args]) @@ -1673,7 +1673,7 @@ def main(): # UpdateDBCfg print('Updating database configuration...') - update_log = os.path.join(tempfile.gettempdir(), 'stub_update_log.txt') + update_log = os.path.join(temp_base, 'update_log.txt') result = run_v8(args.V8Path, ['DESIGNER', f'/F"{temp_base}"', '/UpdateDBCfg', '/Out', f'"{update_log}"', '/DisableStartupDialogs'] + [quote_if_needed(a) for a in extra_args]) if result.returncode != 0: diff --git a/tests/skills/cases/db-repo/lock-long-list-truncated.json b/tests/skills/cases/db-repo/lock-long-list-truncated.json index 090402918..653d7612c 100644 --- a/tests/skills/cases/db-repo/lock-long-list-truncated.json +++ b/tests/skills/cases/db-repo/lock-long-list-truncated.json @@ -21,7 +21,7 @@ "Захвачено (30):", "Справочник.Объект20", "… и ещё 10", - "db-repo-locked.txt" + "db-repo-locked-" ], "stdoutNotContains": "Справочник.Объект21" },