diff --git a/.claude/skills/cf-edit/scripts/cf-edit.ps1 b/.claude/skills/cf-edit/scripts/cf-edit.ps1
index 879dff73..b6be02c7 100644
--- a/.claude/skills/cf-edit/scripts/cf-edit.ps1
+++ b/.claude/skills/cf-edit/scripts/cf-edit.ps1
@@ -128,7 +128,7 @@ function Assert-EditAllowed([string]$targetPath, [string]$require) {
if ($mode -eq 'off') { return }
# Use Console.Error (not Write-Error) — under ErrorActionPreference=Stop the
# latter throws and would be swallowed by this function's own catch.
- $msg = "[support-guard] Операция запрещена: $reason.`n Цель: $rp`n Безопасные пути: доработка через расширение (cfe-*); включить редактирование объекта/корня в конфигураторе; снять с поддержки.`n Отключить проверку: editingAllowedCheck = warn|off в .v8-project.json."
+ $msg = "[support-guard] Операция запрещена: $reason.`n Цель: $rp`n Безопасные пути: доработка через расширение (cfe-*); либо support-edit -Path <цель> -Set editable (включить объект) / -Path <дамп> -Capability on (вся конфа read-only) / -Set off-support (снять с поддержки).`n Отключить проверку: editingAllowedCheck = warn|off в .v8-project.json."
if ($mode -eq 'warn') { [Console]::Error.WriteLine("[support-guard] ПРЕДУПРЕЖДЕНИЕ: $reason. Цель: $rp"); return }
[Console]::Error.WriteLine($msg)
exit 1
diff --git a/.claude/skills/cf-edit/scripts/cf-edit.py b/.claude/skills/cf-edit/scripts/cf-edit.py
index 40f3b5a7..c30655e7 100644
--- a/.claude/skills/cf-edit/scripts/cf-edit.py
+++ b/.claude/skills/cf-edit/scripts/cf-edit.py
@@ -139,7 +139,7 @@ def assert_edit_allowed(target_path, require):
sys.stderr.write(
f"[support-guard] Операция запрещена: {reason}.\n"
f" Цель: {rp}\n"
- f" Безопасные пути: доработка через расширение (cfe-*); включить редактирование объекта/корня в конфигураторе; снять с поддержки.\n"
+ f" Безопасные пути: доработка через расширение (cfe-*); либо support-edit -Path <цель> -Set editable (включить объект) / -Path <дамп> -Capability on (вся конфа read-only) / -Set off-support (снять с поддержки).\n"
f" Отключить проверку: editingAllowedCheck = warn|off в .v8-project.json.\n"
)
sys.exit(1)
diff --git a/.claude/skills/form-add/scripts/form-add.ps1 b/.claude/skills/form-add/scripts/form-add.ps1
index 06358f3f..a36d4a19 100644
--- a/.claude/skills/form-add/scripts/form-add.ps1
+++ b/.claude/skills/form-add/scripts/form-add.ps1
@@ -117,7 +117,7 @@ function Assert-EditAllowed([string]$targetPath, [string]$require) {
if ($mode -eq 'off') { return }
# Use Console.Error (not Write-Error) — under ErrorActionPreference=Stop the
# latter throws and would be swallowed by this function's own catch.
- $msg = "[support-guard] Операция запрещена: $reason.`n Цель: $rp`n Безопасные пути: доработка через расширение (cfe-*); включить редактирование объекта/корня в конфигураторе; снять с поддержки.`n Отключить проверку: editingAllowedCheck = warn|off в .v8-project.json."
+ $msg = "[support-guard] Операция запрещена: $reason.`n Цель: $rp`n Безопасные пути: доработка через расширение (cfe-*); либо support-edit -Path <цель> -Set editable (включить объект) / -Path <дамп> -Capability on (вся конфа read-only) / -Set off-support (снять с поддержки).`n Отключить проверку: editingAllowedCheck = warn|off в .v8-project.json."
if ($mode -eq 'warn') { [Console]::Error.WriteLine("[support-guard] ПРЕДУПРЕЖДЕНИЕ: $reason. Цель: $rp"); return }
[Console]::Error.WriteLine($msg)
exit 1
diff --git a/.claude/skills/form-add/scripts/form-add.py b/.claude/skills/form-add/scripts/form-add.py
index 6b025b00..fa31a32c 100644
--- a/.claude/skills/form-add/scripts/form-add.py
+++ b/.claude/skills/form-add/scripts/form-add.py
@@ -138,7 +138,7 @@ def assert_edit_allowed(target_path, require):
sys.stderr.write(
f"[support-guard] Операция запрещена: {reason}.\n"
f" Цель: {rp}\n"
- f" Безопасные пути: доработка через расширение (cfe-*); включить редактирование объекта/корня в конфигураторе; снять с поддержки.\n"
+ f" Безопасные пути: доработка через расширение (cfe-*); либо support-edit -Path <цель> -Set editable (включить объект) / -Path <дамп> -Capability on (вся конфа read-only) / -Set off-support (снять с поддержки).\n"
f" Отключить проверку: editingAllowedCheck = warn|off в .v8-project.json.\n"
)
sys.exit(1)
diff --git a/.claude/skills/form-compile/scripts/form-compile.ps1 b/.claude/skills/form-compile/scripts/form-compile.ps1
index 4baa498c..2b90c1b5 100644
--- a/.claude/skills/form-compile/scripts/form-compile.ps1
+++ b/.claude/skills/form-compile/scripts/form-compile.ps1
@@ -1446,7 +1446,7 @@ function Assert-EditAllowed([string]$targetPath, [string]$require) {
if ($mode -eq 'off') { return }
# Use Console.Error (not Write-Error) — under ErrorActionPreference=Stop the
# latter throws and would be swallowed by this function's own catch.
- $msg = "[support-guard] Операция запрещена: $reason.`n Цель: $rp`n Безопасные пути: доработка через расширение (cfe-*); включить редактирование объекта/корня в конфигураторе; снять с поддержки.`n Отключить проверку: editingAllowedCheck = warn|off в .v8-project.json."
+ $msg = "[support-guard] Операция запрещена: $reason.`n Цель: $rp`n Безопасные пути: доработка через расширение (cfe-*); либо support-edit -Path <цель> -Set editable (включить объект) / -Path <дамп> -Capability on (вся конфа read-only) / -Set off-support (снять с поддержки).`n Отключить проверку: editingAllowedCheck = warn|off в .v8-project.json."
if ($mode -eq 'warn') { [Console]::Error.WriteLine("[support-guard] ПРЕДУПРЕЖДЕНИЕ: $reason. Цель: $rp"); return }
[Console]::Error.WriteLine($msg)
exit 1
diff --git a/.claude/skills/form-compile/scripts/form-compile.py b/.claude/skills/form-compile/scripts/form-compile.py
index 679e023b..b33afe8f 100644
--- a/.claude/skills/form-compile/scripts/form-compile.py
+++ b/.claude/skills/form-compile/scripts/form-compile.py
@@ -140,7 +140,7 @@ def assert_edit_allowed(target_path, require):
sys.stderr.write(
f"[support-guard] Операция запрещена: {reason}.\n"
f" Цель: {rp}\n"
- f" Безопасные пути: доработка через расширение (cfe-*); включить редактирование объекта/корня в конфигураторе; снять с поддержки.\n"
+ f" Безопасные пути: доработка через расширение (cfe-*); либо support-edit -Path <цель> -Set editable (включить объект) / -Path <дамп> -Capability on (вся конфа read-only) / -Set off-support (снять с поддержки).\n"
f" Отключить проверку: editingAllowedCheck = warn|off в .v8-project.json.\n"
)
sys.exit(1)
diff --git a/.claude/skills/form-edit/scripts/form-edit.ps1 b/.claude/skills/form-edit/scripts/form-edit.ps1
index aacc70f6..e135a73c 100644
--- a/.claude/skills/form-edit/scripts/form-edit.ps1
+++ b/.claude/skills/form-edit/scripts/form-edit.ps1
@@ -111,7 +111,7 @@ function Assert-EditAllowed([string]$targetPath, [string]$require) {
if ($mode -eq 'off') { return }
# Use Console.Error (not Write-Error) — under ErrorActionPreference=Stop the
# latter throws and would be swallowed by this function's own catch.
- $msg = "[support-guard] Операция запрещена: $reason.`n Цель: $rp`n Безопасные пути: доработка через расширение (cfe-*); включить редактирование объекта/корня в конфигураторе; снять с поддержки.`n Отключить проверку: editingAllowedCheck = warn|off в .v8-project.json."
+ $msg = "[support-guard] Операция запрещена: $reason.`n Цель: $rp`n Безопасные пути: доработка через расширение (cfe-*); либо support-edit -Path <цель> -Set editable (включить объект) / -Path <дамп> -Capability on (вся конфа read-only) / -Set off-support (снять с поддержки).`n Отключить проверку: editingAllowedCheck = warn|off в .v8-project.json."
if ($mode -eq 'warn') { [Console]::Error.WriteLine("[support-guard] ПРЕДУПРЕЖДЕНИЕ: $reason. Цель: $rp"); return }
[Console]::Error.WriteLine($msg)
exit 1
diff --git a/.claude/skills/form-edit/scripts/form-edit.py b/.claude/skills/form-edit/scripts/form-edit.py
index 2b3178ed..96ec43cc 100644
--- a/.claude/skills/form-edit/scripts/form-edit.py
+++ b/.claude/skills/form-edit/scripts/form-edit.py
@@ -137,7 +137,7 @@ def assert_edit_allowed(target_path, require):
sys.stderr.write(
f"[support-guard] Операция запрещена: {reason}.\n"
f" Цель: {rp}\n"
- f" Безопасные пути: доработка через расширение (cfe-*); включить редактирование объекта/корня в конфигураторе; снять с поддержки.\n"
+ f" Безопасные пути: доработка через расширение (cfe-*); либо support-edit -Path <цель> -Set editable (включить объект) / -Path <дамп> -Capability on (вся конфа read-only) / -Set off-support (снять с поддержки).\n"
f" Отключить проверку: editingAllowedCheck = warn|off в .v8-project.json.\n"
)
sys.exit(1)
diff --git a/.claude/skills/help-add/scripts/add-help.ps1 b/.claude/skills/help-add/scripts/add-help.ps1
index c49eab5e..12a20600 100644
--- a/.claude/skills/help-add/scripts/add-help.ps1
+++ b/.claude/skills/help-add/scripts/add-help.ps1
@@ -112,7 +112,7 @@ function Assert-EditAllowed([string]$targetPath, [string]$require) {
if ($mode -eq 'off') { return }
# Use Console.Error (not Write-Error) — under ErrorActionPreference=Stop the
# latter throws and would be swallowed by this function's own catch.
- $msg = "[support-guard] Операция запрещена: $reason.`n Цель: $rp`n Безопасные пути: доработка через расширение (cfe-*); включить редактирование объекта/корня в конфигураторе; снять с поддержки.`n Отключить проверку: editingAllowedCheck = warn|off в .v8-project.json."
+ $msg = "[support-guard] Операция запрещена: $reason.`n Цель: $rp`n Безопасные пути: доработка через расширение (cfe-*); либо support-edit -Path <цель> -Set editable (включить объект) / -Path <дамп> -Capability on (вся конфа read-only) / -Set off-support (снять с поддержки).`n Отключить проверку: editingAllowedCheck = warn|off в .v8-project.json."
if ($mode -eq 'warn') { [Console]::Error.WriteLine("[support-guard] ПРЕДУПРЕЖДЕНИЕ: $reason. Цель: $rp"); return }
[Console]::Error.WriteLine($msg)
exit 1
diff --git a/.claude/skills/help-add/scripts/add-help.py b/.claude/skills/help-add/scripts/add-help.py
index 01555c49..323e3d85 100644
--- a/.claude/skills/help-add/scripts/add-help.py
+++ b/.claude/skills/help-add/scripts/add-help.py
@@ -139,7 +139,7 @@ def assert_edit_allowed(target_path, require):
sys.stderr.write(
f"[support-guard] Операция запрещена: {reason}.\n"
f" Цель: {rp}\n"
- f" Безопасные пути: доработка через расширение (cfe-*); включить редактирование объекта/корня в конфигураторе; снять с поддержки.\n"
+ f" Безопасные пути: доработка через расширение (cfe-*); либо support-edit -Path <цель> -Set editable (включить объект) / -Path <дамп> -Capability on (вся конфа read-only) / -Set off-support (снять с поддержки).\n"
f" Отключить проверку: editingAllowedCheck = warn|off в .v8-project.json.\n"
)
sys.exit(1)
diff --git a/.claude/skills/interface-edit/scripts/interface-edit.ps1 b/.claude/skills/interface-edit/scripts/interface-edit.ps1
index 3807390d..91674423 100644
--- a/.claude/skills/interface-edit/scripts/interface-edit.ps1
+++ b/.claude/skills/interface-edit/scripts/interface-edit.ps1
@@ -123,7 +123,7 @@ function Assert-EditAllowed([string]$targetPath, [string]$require) {
if ($mode -eq 'off') { return }
# Use Console.Error (not Write-Error) — under ErrorActionPreference=Stop the
# latter throws and would be swallowed by this function's own catch.
- $msg = "[support-guard] Операция запрещена: $reason.`n Цель: $rp`n Безопасные пути: доработка через расширение (cfe-*); включить редактирование объекта/корня в конфигураторе; снять с поддержки.`n Отключить проверку: editingAllowedCheck = warn|off в .v8-project.json."
+ $msg = "[support-guard] Операция запрещена: $reason.`n Цель: $rp`n Безопасные пути: доработка через расширение (cfe-*); либо support-edit -Path <цель> -Set editable (включить объект) / -Path <дамп> -Capability on (вся конфа read-only) / -Set off-support (снять с поддержки).`n Отключить проверку: editingAllowedCheck = warn|off в .v8-project.json."
if ($mode -eq 'warn') { [Console]::Error.WriteLine("[support-guard] ПРЕДУПРЕЖДЕНИЕ: $reason. Цель: $rp"); return }
[Console]::Error.WriteLine($msg)
exit 1
diff --git a/.claude/skills/interface-edit/scripts/interface-edit.py b/.claude/skills/interface-edit/scripts/interface-edit.py
index 92068f59..2643e12c 100644
--- a/.claude/skills/interface-edit/scripts/interface-edit.py
+++ b/.claude/skills/interface-edit/scripts/interface-edit.py
@@ -137,7 +137,7 @@ def assert_edit_allowed(target_path, require):
sys.stderr.write(
f"[support-guard] Операция запрещена: {reason}.\n"
f" Цель: {rp}\n"
- f" Безопасные пути: доработка через расширение (cfe-*); включить редактирование объекта/корня в конфигураторе; снять с поддержки.\n"
+ f" Безопасные пути: доработка через расширение (cfe-*); либо support-edit -Path <цель> -Set editable (включить объект) / -Path <дамп> -Capability on (вся конфа read-only) / -Set off-support (снять с поддержки).\n"
f" Отключить проверку: editingAllowedCheck = warn|off в .v8-project.json.\n"
)
sys.exit(1)
diff --git a/.claude/skills/meta-compile/scripts/meta-compile.ps1 b/.claude/skills/meta-compile/scripts/meta-compile.ps1
index 2bc825e0..a86e2ff1 100644
--- a/.claude/skills/meta-compile/scripts/meta-compile.ps1
+++ b/.claude/skills/meta-compile/scripts/meta-compile.ps1
@@ -120,7 +120,7 @@ function Assert-EditAllowed([string]$targetPath, [string]$require) {
if ($mode -eq 'off') { return }
# Use Console.Error (not Write-Error) — under ErrorActionPreference=Stop the
# latter throws and would be swallowed by this function's own catch.
- $msg = "[support-guard] Операция запрещена: $reason.`n Цель: $rp`n Безопасные пути: доработка через расширение (cfe-*); включить редактирование объекта/корня в конфигураторе; снять с поддержки.`n Отключить проверку: editingAllowedCheck = warn|off в .v8-project.json."
+ $msg = "[support-guard] Операция запрещена: $reason.`n Цель: $rp`n Безопасные пути: доработка через расширение (cfe-*); либо support-edit -Path <цель> -Set editable (включить объект) / -Path <дамп> -Capability on (вся конфа read-only) / -Set off-support (снять с поддержки).`n Отключить проверку: editingAllowedCheck = warn|off в .v8-project.json."
if ($mode -eq 'warn') { [Console]::Error.WriteLine("[support-guard] ПРЕДУПРЕЖДЕНИЕ: $reason. Цель: $rp"); return }
[Console]::Error.WriteLine($msg)
exit 1
diff --git a/.claude/skills/meta-compile/scripts/meta-compile.py b/.claude/skills/meta-compile/scripts/meta-compile.py
index 13c3c488..1bb45d80 100644
--- a/.claude/skills/meta-compile/scripts/meta-compile.py
+++ b/.claude/skills/meta-compile/scripts/meta-compile.py
@@ -142,7 +142,7 @@ def assert_edit_allowed(target_path, require):
sys.stderr.write(
f"[support-guard] Операция запрещена: {reason}.\n"
f" Цель: {rp}\n"
- f" Безопасные пути: доработка через расширение (cfe-*); включить редактирование объекта/корня в конфигураторе; снять с поддержки.\n"
+ f" Безопасные пути: доработка через расширение (cfe-*); либо support-edit -Path <цель> -Set editable (включить объект) / -Path <дамп> -Capability on (вся конфа read-only) / -Set off-support (снять с поддержки).\n"
f" Отключить проверку: editingAllowedCheck = warn|off в .v8-project.json.\n"
)
sys.exit(1)
diff --git a/.claude/skills/meta-edit/scripts/meta-edit.ps1 b/.claude/skills/meta-edit/scripts/meta-edit.ps1
index 09f02573..8ed830fd 100644
--- a/.claude/skills/meta-edit/scripts/meta-edit.ps1
+++ b/.claude/skills/meta-edit/scripts/meta-edit.ps1
@@ -251,7 +251,7 @@ function Assert-EditAllowed([string]$targetPath, [string]$require) {
if ($mode -eq 'off') { return }
# Use Console.Error (not Write-Error) — under ErrorActionPreference=Stop the
# latter throws and would be swallowed by this function's own catch.
- $msg = "[support-guard] Операция запрещена: $reason.`n Цель: $rp`n Безопасные пути: доработка через расширение (cfe-*); включить редактирование объекта/корня в конфигураторе; снять с поддержки.`n Отключить проверку: editingAllowedCheck = warn|off в .v8-project.json."
+ $msg = "[support-guard] Операция запрещена: $reason.`n Цель: $rp`n Безопасные пути: доработка через расширение (cfe-*); либо support-edit -Path <цель> -Set editable (включить объект) / -Path <дамп> -Capability on (вся конфа read-only) / -Set off-support (снять с поддержки).`n Отключить проверку: editingAllowedCheck = warn|off в .v8-project.json."
if ($mode -eq 'warn') { [Console]::Error.WriteLine("[support-guard] ПРЕДУПРЕЖДЕНИЕ: $reason. Цель: $rp"); return }
[Console]::Error.WriteLine($msg)
exit 1
diff --git a/.claude/skills/meta-edit/scripts/meta-edit.py b/.claude/skills/meta-edit/scripts/meta-edit.py
index b9115d88..5c9e02f9 100644
--- a/.claude/skills/meta-edit/scripts/meta-edit.py
+++ b/.claude/skills/meta-edit/scripts/meta-edit.py
@@ -138,7 +138,7 @@ def assert_edit_allowed(target_path, require):
sys.stderr.write(
f"[support-guard] Операция запрещена: {reason}.\n"
f" Цель: {rp}\n"
- f" Безопасные пути: доработка через расширение (cfe-*); включить редактирование объекта/корня в конфигураторе; снять с поддержки.\n"
+ f" Безопасные пути: доработка через расширение (cfe-*); либо support-edit -Path <цель> -Set editable (включить объект) / -Path <дамп> -Capability on (вся конфа read-only) / -Set off-support (снять с поддержки).\n"
f" Отключить проверку: editingAllowedCheck = warn|off в .v8-project.json.\n"
)
sys.exit(1)
diff --git a/.claude/skills/meta-remove/scripts/meta-remove.ps1 b/.claude/skills/meta-remove/scripts/meta-remove.ps1
index c3fe406e..f873103e 100644
--- a/.claude/skills/meta-remove/scripts/meta-remove.ps1
+++ b/.claude/skills/meta-remove/scripts/meta-remove.ps1
@@ -177,7 +177,7 @@ function Assert-EditAllowed([string]$targetPath, [string]$require) {
if ($mode -eq 'off') { return }
# Use Console.Error (not Write-Error) — under ErrorActionPreference=Stop the
# latter throws and would be swallowed by this function's own catch.
- $msg = "[support-guard] Операция запрещена: $reason.`n Цель: $rp`n Безопасные пути: доработка через расширение (cfe-*); включить редактирование объекта/корня в конфигураторе; снять с поддержки.`n Отключить проверку: editingAllowedCheck = warn|off в .v8-project.json."
+ $msg = "[support-guard] Операция запрещена: $reason.`n Цель: $rp`n Безопасные пути: доработка через расширение (cfe-*); либо support-edit -Path <цель> -Set editable (включить объект) / -Path <дамп> -Capability on (вся конфа read-only) / -Set off-support (снять с поддержки).`n Отключить проверку: editingAllowedCheck = warn|off в .v8-project.json."
if ($mode -eq 'warn') { [Console]::Error.WriteLine("[support-guard] ПРЕДУПРЕЖДЕНИЕ: $reason. Цель: $rp"); return }
[Console]::Error.WriteLine($msg)
exit 1
diff --git a/.claude/skills/meta-remove/scripts/meta-remove.py b/.claude/skills/meta-remove/scripts/meta-remove.py
index bd965e6d..fc5d9fc6 100644
--- a/.claude/skills/meta-remove/scripts/meta-remove.py
+++ b/.claude/skills/meta-remove/scripts/meta-remove.py
@@ -137,7 +137,7 @@ def assert_edit_allowed(target_path, require):
sys.stderr.write(
f"[support-guard] Операция запрещена: {reason}.\n"
f" Цель: {rp}\n"
- f" Безопасные пути: доработка через расширение (cfe-*); включить редактирование объекта/корня в конфигураторе; снять с поддержки.\n"
+ f" Безопасные пути: доработка через расширение (cfe-*); либо support-edit -Path <цель> -Set editable (включить объект) / -Path <дамп> -Capability on (вся конфа read-only) / -Set off-support (снять с поддержки).\n"
f" Отключить проверку: editingAllowedCheck = warn|off в .v8-project.json.\n"
)
sys.exit(1)
diff --git a/.claude/skills/mxl-compile/scripts/mxl-compile.ps1 b/.claude/skills/mxl-compile/scripts/mxl-compile.ps1
index f3e3ab83..34c63bf5 100644
--- a/.claude/skills/mxl-compile/scripts/mxl-compile.ps1
+++ b/.claude/skills/mxl-compile/scripts/mxl-compile.ps1
@@ -110,7 +110,7 @@ function Assert-EditAllowed([string]$targetPath, [string]$require) {
if ($mode -eq 'off') { return }
# Use Console.Error (not Write-Error) — under ErrorActionPreference=Stop the
# latter throws and would be swallowed by this function's own catch.
- $msg = "[support-guard] Операция запрещена: $reason.`n Цель: $rp`n Безопасные пути: доработка через расширение (cfe-*); включить редактирование объекта/корня в конфигураторе; снять с поддержки.`n Отключить проверку: editingAllowedCheck = warn|off в .v8-project.json."
+ $msg = "[support-guard] Операция запрещена: $reason.`n Цель: $rp`n Безопасные пути: доработка через расширение (cfe-*); либо support-edit -Path <цель> -Set editable (включить объект) / -Path <дамп> -Capability on (вся конфа read-only) / -Set off-support (снять с поддержки).`n Отключить проверку: editingAllowedCheck = warn|off в .v8-project.json."
if ($mode -eq 'warn') { [Console]::Error.WriteLine("[support-guard] ПРЕДУПРЕЖДЕНИЕ: $reason. Цель: $rp"); return }
[Console]::Error.WriteLine($msg)
exit 1
diff --git a/.claude/skills/mxl-compile/scripts/mxl-compile.py b/.claude/skills/mxl-compile/scripts/mxl-compile.py
index a3a40924..34bbab5c 100644
--- a/.claude/skills/mxl-compile/scripts/mxl-compile.py
+++ b/.claude/skills/mxl-compile/scripts/mxl-compile.py
@@ -137,7 +137,7 @@ def assert_edit_allowed(target_path, require):
sys.stderr.write(
f"[support-guard] Операция запрещена: {reason}.\n"
f" Цель: {rp}\n"
- f" Безопасные пути: доработка через расширение (cfe-*); включить редактирование объекта/корня в конфигураторе; снять с поддержки.\n"
+ f" Безопасные пути: доработка через расширение (cfe-*); либо support-edit -Path <цель> -Set editable (включить объект) / -Path <дамп> -Capability on (вся конфа read-only) / -Set off-support (снять с поддержки).\n"
f" Отключить проверку: editingAllowedCheck = warn|off в .v8-project.json.\n"
)
sys.exit(1)
diff --git a/.claude/skills/role-compile/scripts/role-compile.ps1 b/.claude/skills/role-compile/scripts/role-compile.ps1
index d655820d..8c592c9b 100644
--- a/.claude/skills/role-compile/scripts/role-compile.ps1
+++ b/.claude/skills/role-compile/scripts/role-compile.ps1
@@ -110,7 +110,7 @@ function Assert-EditAllowed([string]$targetPath, [string]$require) {
if ($mode -eq 'off') { return }
# Use Console.Error (not Write-Error) — under ErrorActionPreference=Stop the
# latter throws and would be swallowed by this function's own catch.
- $msg = "[support-guard] Операция запрещена: $reason.`n Цель: $rp`n Безопасные пути: доработка через расширение (cfe-*); включить редактирование объекта/корня в конфигураторе; снять с поддержки.`n Отключить проверку: editingAllowedCheck = warn|off в .v8-project.json."
+ $msg = "[support-guard] Операция запрещена: $reason.`n Цель: $rp`n Безопасные пути: доработка через расширение (cfe-*); либо support-edit -Path <цель> -Set editable (включить объект) / -Path <дамп> -Capability on (вся конфа read-only) / -Set off-support (снять с поддержки).`n Отключить проверку: editingAllowedCheck = warn|off в .v8-project.json."
if ($mode -eq 'warn') { [Console]::Error.WriteLine("[support-guard] ПРЕДУПРЕЖДЕНИЕ: $reason. Цель: $rp"); return }
[Console]::Error.WriteLine($msg)
exit 1
diff --git a/.claude/skills/role-compile/scripts/role-compile.py b/.claude/skills/role-compile/scripts/role-compile.py
index 1993aef2..68e1f97e 100644
--- a/.claude/skills/role-compile/scripts/role-compile.py
+++ b/.claude/skills/role-compile/scripts/role-compile.py
@@ -137,7 +137,7 @@ def assert_edit_allowed(target_path, require):
sys.stderr.write(
f"[support-guard] Операция запрещена: {reason}.\n"
f" Цель: {rp}\n"
- f" Безопасные пути: доработка через расширение (cfe-*); включить редактирование объекта/корня в конфигураторе; снять с поддержки.\n"
+ f" Безопасные пути: доработка через расширение (cfe-*); либо support-edit -Path <цель> -Set editable (включить объект) / -Path <дамп> -Capability on (вся конфа read-only) / -Set off-support (снять с поддержки).\n"
f" Отключить проверку: editingAllowedCheck = warn|off в .v8-project.json.\n"
)
sys.exit(1)
diff --git a/.claude/skills/skd-compile/scripts/skd-compile.ps1 b/.claude/skills/skd-compile/scripts/skd-compile.ps1
index 6240e4b2..a75cdbc6 100644
--- a/.claude/skills/skd-compile/scripts/skd-compile.ps1
+++ b/.claude/skills/skd-compile/scripts/skd-compile.ps1
@@ -109,7 +109,7 @@ function Assert-EditAllowed([string]$targetPath, [string]$require) {
if ($mode -eq 'off') { return }
# Use Console.Error (not Write-Error) — under ErrorActionPreference=Stop the
# latter throws and would be swallowed by this function's own catch.
- $msg = "[support-guard] Операция запрещена: $reason.`n Цель: $rp`n Безопасные пути: доработка через расширение (cfe-*); включить редактирование объекта/корня в конфигураторе; снять с поддержки.`n Отключить проверку: editingAllowedCheck = warn|off в .v8-project.json."
+ $msg = "[support-guard] Операция запрещена: $reason.`n Цель: $rp`n Безопасные пути: доработка через расширение (cfe-*); либо support-edit -Path <цель> -Set editable (включить объект) / -Path <дамп> -Capability on (вся конфа read-only) / -Set off-support (снять с поддержки).`n Отключить проверку: editingAllowedCheck = warn|off в .v8-project.json."
if ($mode -eq 'warn') { [Console]::Error.WriteLine("[support-guard] ПРЕДУПРЕЖДЕНИЕ: $reason. Цель: $rp"); return }
[Console]::Error.WriteLine($msg)
exit 1
diff --git a/.claude/skills/skd-compile/scripts/skd-compile.py b/.claude/skills/skd-compile/scripts/skd-compile.py
index a90bdbb1..4bd8b94e 100644
--- a/.claude/skills/skd-compile/scripts/skd-compile.py
+++ b/.claude/skills/skd-compile/scripts/skd-compile.py
@@ -137,7 +137,7 @@ def assert_edit_allowed(target_path, require):
sys.stderr.write(
f"[support-guard] Операция запрещена: {reason}.\n"
f" Цель: {rp}\n"
- f" Безопасные пути: доработка через расширение (cfe-*); включить редактирование объекта/корня в конфигураторе; снять с поддержки.\n"
+ f" Безопасные пути: доработка через расширение (cfe-*); либо support-edit -Path <цель> -Set editable (включить объект) / -Path <дамп> -Capability on (вся конфа read-only) / -Set off-support (снять с поддержки).\n"
f" Отключить проверку: editingAllowedCheck = warn|off в .v8-project.json.\n"
)
sys.exit(1)
diff --git a/.claude/skills/skd-edit/scripts/skd-edit.ps1 b/.claude/skills/skd-edit/scripts/skd-edit.ps1
index 4cd00cbf..e20b251d 100644
--- a/.claude/skills/skd-edit/scripts/skd-edit.ps1
+++ b/.claude/skills/skd-edit/scripts/skd-edit.ps1
@@ -147,7 +147,7 @@ function Assert-EditAllowed([string]$targetPath, [string]$require) {
if ($mode -eq 'off') { return }
# Use Console.Error (not Write-Error) — under ErrorActionPreference=Stop the
# latter throws and would be swallowed by this function's own catch.
- $msg = "[support-guard] Операция запрещена: $reason.`n Цель: $rp`n Безопасные пути: доработка через расширение (cfe-*); включить редактирование объекта/корня в конфигураторе; снять с поддержки.`n Отключить проверку: editingAllowedCheck = warn|off в .v8-project.json."
+ $msg = "[support-guard] Операция запрещена: $reason.`n Цель: $rp`n Безопасные пути: доработка через расширение (cfe-*); либо support-edit -Path <цель> -Set editable (включить объект) / -Path <дамп> -Capability on (вся конфа read-only) / -Set off-support (снять с поддержки).`n Отключить проверку: editingAllowedCheck = warn|off в .v8-project.json."
if ($mode -eq 'warn') { [Console]::Error.WriteLine("[support-guard] ПРЕДУПРЕЖДЕНИЕ: $reason. Цель: $rp"); return }
[Console]::Error.WriteLine($msg)
exit 1
diff --git a/.claude/skills/skd-edit/scripts/skd-edit.py b/.claude/skills/skd-edit/scripts/skd-edit.py
index 7b81b0a5..7c4aaf0a 100644
--- a/.claude/skills/skd-edit/scripts/skd-edit.py
+++ b/.claude/skills/skd-edit/scripts/skd-edit.py
@@ -247,7 +247,7 @@ def assert_edit_allowed(target_path, require):
sys.stderr.write(
f"[support-guard] Операция запрещена: {reason}.\n"
f" Цель: {rp}\n"
- f" Безопасные пути: доработка через расширение (cfe-*); включить редактирование объекта/корня в конфигураторе; снять с поддержки.\n"
+ f" Безопасные пути: доработка через расширение (cfe-*); либо support-edit -Path <цель> -Set editable (включить объект) / -Path <дамп> -Capability on (вся конфа read-only) / -Set off-support (снять с поддержки).\n"
f" Отключить проверку: editingAllowedCheck = warn|off в .v8-project.json.\n"
)
sys.exit(1)
diff --git a/.claude/skills/subsystem-compile/scripts/subsystem-compile.ps1 b/.claude/skills/subsystem-compile/scripts/subsystem-compile.ps1
index 375e0de3..d3657be6 100644
--- a/.claude/skills/subsystem-compile/scripts/subsystem-compile.ps1
+++ b/.claude/skills/subsystem-compile/scripts/subsystem-compile.ps1
@@ -147,7 +147,7 @@ function Assert-EditAllowed([string]$targetPath, [string]$require) {
if ($mode -eq 'off') { return }
# Use Console.Error (not Write-Error) — under ErrorActionPreference=Stop the
# latter throws and would be swallowed by this function's own catch.
- $msg = "[support-guard] Операция запрещена: $reason.`n Цель: $rp`n Безопасные пути: доработка через расширение (cfe-*); включить редактирование объекта/корня в конфигураторе; снять с поддержки.`n Отключить проверку: editingAllowedCheck = warn|off в .v8-project.json."
+ $msg = "[support-guard] Операция запрещена: $reason.`n Цель: $rp`n Безопасные пути: доработка через расширение (cfe-*); либо support-edit -Path <цель> -Set editable (включить объект) / -Path <дамп> -Capability on (вся конфа read-only) / -Set off-support (снять с поддержки).`n Отключить проверку: editingAllowedCheck = warn|off в .v8-project.json."
if ($mode -eq 'warn') { [Console]::Error.WriteLine("[support-guard] ПРЕДУПРЕЖДЕНИЕ: $reason. Цель: $rp"); return }
[Console]::Error.WriteLine($msg)
exit 1
diff --git a/.claude/skills/subsystem-compile/scripts/subsystem-compile.py b/.claude/skills/subsystem-compile/scripts/subsystem-compile.py
index 15ba05a7..befd2f06 100644
--- a/.claude/skills/subsystem-compile/scripts/subsystem-compile.py
+++ b/.claude/skills/subsystem-compile/scripts/subsystem-compile.py
@@ -137,7 +137,7 @@ def assert_edit_allowed(target_path, require):
sys.stderr.write(
f"[support-guard] Операция запрещена: {reason}.\n"
f" Цель: {rp}\n"
- f" Безопасные пути: доработка через расширение (cfe-*); включить редактирование объекта/корня в конфигураторе; снять с поддержки.\n"
+ f" Безопасные пути: доработка через расширение (cfe-*); либо support-edit -Path <цель> -Set editable (включить объект) / -Path <дамп> -Capability on (вся конфа read-only) / -Set off-support (снять с поддержки).\n"
f" Отключить проверку: editingAllowedCheck = warn|off в .v8-project.json.\n"
)
sys.exit(1)
diff --git a/.claude/skills/subsystem-edit/scripts/subsystem-edit.ps1 b/.claude/skills/subsystem-edit/scripts/subsystem-edit.ps1
index 2e3be34b..a0d68014 100644
--- a/.claude/skills/subsystem-edit/scripts/subsystem-edit.ps1
+++ b/.claude/skills/subsystem-edit/scripts/subsystem-edit.ps1
@@ -220,7 +220,7 @@ function Assert-EditAllowed([string]$targetPath, [string]$require) {
if ($mode -eq 'off') { return }
# Use Console.Error (not Write-Error) — under ErrorActionPreference=Stop the
# latter throws and would be swallowed by this function's own catch.
- $msg = "[support-guard] Операция запрещена: $reason.`n Цель: $rp`n Безопасные пути: доработка через расширение (cfe-*); включить редактирование объекта/корня в конфигураторе; снять с поддержки.`n Отключить проверку: editingAllowedCheck = warn|off в .v8-project.json."
+ $msg = "[support-guard] Операция запрещена: $reason.`n Цель: $rp`n Безопасные пути: доработка через расширение (cfe-*); либо support-edit -Path <цель> -Set editable (включить объект) / -Path <дамп> -Capability on (вся конфа read-only) / -Set off-support (снять с поддержки).`n Отключить проверку: editingAllowedCheck = warn|off в .v8-project.json."
if ($mode -eq 'warn') { [Console]::Error.WriteLine("[support-guard] ПРЕДУПРЕЖДЕНИЕ: $reason. Цель: $rp"); return }
[Console]::Error.WriteLine($msg)
exit 1
diff --git a/.claude/skills/subsystem-edit/scripts/subsystem-edit.py b/.claude/skills/subsystem-edit/scripts/subsystem-edit.py
index a9f5242f..3ea4aa3d 100644
--- a/.claude/skills/subsystem-edit/scripts/subsystem-edit.py
+++ b/.claude/skills/subsystem-edit/scripts/subsystem-edit.py
@@ -138,7 +138,7 @@ def assert_edit_allowed(target_path, require):
sys.stderr.write(
f"[support-guard] Операция запрещена: {reason}.\n"
f" Цель: {rp}\n"
- f" Безопасные пути: доработка через расширение (cfe-*); включить редактирование объекта/корня в конфигураторе; снять с поддержки.\n"
+ f" Безопасные пути: доработка через расширение (cfe-*); либо support-edit -Path <цель> -Set editable (включить объект) / -Path <дамп> -Capability on (вся конфа read-only) / -Set off-support (снять с поддержки).\n"
f" Отключить проверку: editingAllowedCheck = warn|off в .v8-project.json.\n"
)
sys.exit(1)
diff --git a/.claude/skills/support-edit/SKILL.md b/.claude/skills/support-edit/SKILL.md
new file mode 100644
index 00000000..6dddeda3
--- /dev/null
+++ b/.claude/skills/support-edit/SKILL.md
@@ -0,0 +1,41 @@
+---
+name: support-edit
+description: Переключение состояния поддержки типовой конфигурации 1С. Используй когда нужно включить возможность редактирования конфигурации или конкретного объекта на поддержке («на замке»)
+argument-hint: -Path <путь> -Set editable|off-support|locked | -Capability on|off
+allowed-tools:
+ - Bash
+ - Read
+ - Write
+ - Glob
+---
+
+# /support-edit — переключение состояния поддержки 1С
+
+Меняет правила поддержки типовой конфигурации: разрешает правку объекта/конфигурации «на замке», снимает с поддержки, включает/выключает возможность изменения. Это осознанное действие — обычно после отказа `support-guard` (готовую команду под конкретный случай печатает сам отказ).
+
+Действует только на выгрузку; чтобы применить в информационной базе — загрузить выгрузку (полная загрузка).
+
+## Команды
+
+| Что нужно | Команда |
+|-----------|---------|
+| Разрешить правку объекта | `-Path <объект> -Set editable` |
+| Снять объект с поддержки | `-Path <объект> -Set off-support` |
+| Вернуть объект «на замок» | `-Path <объект> -Set locked` |
+| Разрешить добавление новых объектов в конфигурацию | `-Path <каталог дампа> -Set editable` |
+| Включить / выключить возможность изменения всей конфигурации | `-Path <каталог дампа> -Capability on` / `off` |
+
+`-Path` — тот же путь, который отклонил `support-guard` (объект, форма, макет или каталог дампа).
+
+```powershell
+powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/support-edit.ps1" -Path "Catalogs/Контрагенты.xml" -Set editable
+```
+
+## editable или off-support?
+
+- **editable** — правки разрешены, объект **продолжает получать обновления вендора** (при обновлении возможны конфликты слияния). Бери, когда хочешь дорабатывать и дальше получать обновления.
+- **off-support** — объект **снят с поддержки**: правки свободны, обновления вендора по нему больше не приходят. Это не удаление объекта. Бери, когда объект уводишь из-под обновлений.
+
+## Если возможность изменения выключена
+
+Если вся конфигурация read-only (типовая «из коробки»), пообъектный `-Set` не сработает — навык подскажет сначала выполнить `-Capability on`. Это включает возможность изменения (все объекты при этом остаются на замке), после чего открываешь нужные точечно через `-Set editable`.
diff --git a/.claude/skills/support-edit/scripts/support-edit.ps1 b/.claude/skills/support-edit/scripts/support-edit.ps1
new file mode 100644
index 00000000..f50a89ee
--- /dev/null
+++ b/.claude/skills/support-edit/scripts/support-edit.ps1
@@ -0,0 +1,130 @@
+# support-edit v1.0 — Toggle 1C configuration support state (Ext/ParentConfigurations.bin)
+# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
+param(
+ [Parameter(Mandatory=$true)][Alias('Path')][string]$TargetPath,
+ [ValidateSet("editable","off-support","locked")]
+ [string]$Set,
+ [ValidateSet("on","off")]
+ [string]$Capability
+)
+
+$ErrorActionPreference = 'Stop'
+[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
+
+if ((-not $Set -and -not $Capability) -or ($Set -and $Capability)) {
+ [Console]::Error.WriteLine("Укажите ровно одно: -Set editable|off-support|locked ЛИБО -Capability on|off")
+ exit 1
+}
+
+# --- Resolve target uuid + config root + bin (walk-up, same as support-guard) ---
+function Get-RootUuid([string]$xmlPath) {
+ if (-not (Test-Path $xmlPath)) { return $null }
+ try {
+ [xml]$mx = Get-Content -Path $xmlPath -Encoding UTF8
+ $el = $mx.DocumentElement.FirstChild
+ while ($el -and $el.NodeType -ne 'Element') { $el = $el.NextSibling }
+ if ($el) { $u = $el.GetAttribute("uuid"); if ($u) { return $u } }
+ } catch {}
+ return $null
+}
+
+if (-not (Test-Path $TargetPath)) {
+ [Console]::Error.WriteLine("Путь не найден: $TargetPath")
+ exit 1
+}
+$rp = (Resolve-Path $TargetPath).Path
+$elemUuid = Get-RootUuid $rp
+$cfgDir = $null; $binPath = $null
+$d = if (Test-Path $rp -PathType Container) { $rp } else { [System.IO.Path]::GetDirectoryName($rp) }
+for ($i = 0; $i -lt 12 -and $d; $i++) {
+ if (-not $elemUuid) { $elemUuid = Get-RootUuid "$d.xml" }
+ if (-not $cfgDir) {
+ $cand = Join-Path (Join-Path $d "Ext") "ParentConfigurations.bin"
+ if ((Test-Path $cand) -or (Test-Path (Join-Path $d "Configuration.xml"))) { $cfgDir = $d; $binPath = $cand }
+ }
+ if ($elemUuid -and $cfgDir) { break }
+ $parent = [System.IO.Path]::GetDirectoryName($d)
+ if ($parent -eq $d) { break }
+ $d = $parent
+}
+if (-not $elemUuid -and $cfgDir) { $elemUuid = Get-RootUuid (Join-Path $cfgDir "Configuration.xml") }
+
+if (-not $cfgDir) {
+ [Console]::Error.WriteLine("Не найден корень конфигурации (Configuration.xml) над путём: $rp")
+ exit 1
+}
+if (-not (Test-Path $binPath)) {
+ Write-Host "Конфигурация не на поддержке (Ext/ParentConfigurations.bin отсутствует) — переключать нечего."
+ exit 0
+}
+
+# --- Read bin (UTF-8 text with BOM) ---
+$bytes = [System.IO.File]::ReadAllBytes($binPath)
+if ($bytes.Length -le 32) {
+ Write-Host "Поддержка снята полностью (пустой ParentConfigurations.bin) — переключать нечего."
+ exit 0
+}
+$start = 0
+if ($bytes.Length -ge 3 -and $bytes[0] -eq 0xEF -and $bytes[1] -eq 0xBB -and $bytes[2] -eq 0xBF) { $start = 3 }
+$text = [System.Text.Encoding]::UTF8.GetString($bytes, $start, $bytes.Length - $start)
+$hm = [regex]::Match($text, '^\{6,(\d+),(\d+),')
+if (-not $hm.Success) {
+ [Console]::Error.WriteLine("Неизвестный формат ParentConfigurations.bin")
+ exit 1
+}
+$G = [int]$hm.Groups[1].Value
+$K = [int]$hm.Groups[2].Value
+
+function Save-Bin([string]$txt) {
+ [System.IO.File]::WriteAllText($binPath, $txt, (New-Object System.Text.UTF8Encoding($true)))
+}
+
+# === Capability (global G) ===
+if ($Capability) {
+ $target = if ($Capability -eq 'on') { '0' } else { '1' }
+ if ($G -eq [int]$target) {
+ $word = if ($Capability -eq 'on') { 'включена' } else { 'выключена' }
+ Write-Host "Возможность изменения конфигурации уже $word — изменений нет."
+ exit 0
+ }
+ # G + X (per block) + bulk f1
+ $text = [regex]::Replace($text, '^(\{6,)\d+(,)', "`${1}$target`$2")
+ $text = [regex]::Replace($text, '([0-9a-f-]{36}),\d+,([0-9a-f-]{36})', "`$1,$target,`$2")
+ $text = [regex]::Replace($text, '[0-2],0,([0-9a-f-]{36})', "$target,0,`$1")
+ Save-Bin $text
+ if ($Capability -eq 'on') {
+ Write-Host "Возможность изменения конфигурации ВКЛЮЧЕНА. Все объекты поставщика — на замке."
+ Write-Host "Включайте редактирование точечно: support-edit -Path <объект> -Set editable"
+ } else {
+ Write-Host "Возможность изменения конфигурации ВЫКЛЮЧЕНА. Вся конфигурация стала read-only; пообъектные правила сброшены."
+ }
+ exit 0
+}
+
+# === Per-object -Set ===
+if ($G -eq 1) {
+ [Console]::Error.WriteLine("Возможность изменения конфигурации выключена — пообъектное переключение недоступно.`n Сначала: support-edit -Path $TargetPath -Capability on")
+ exit 1
+}
+if (-not $elemUuid) {
+ [Console]::Error.WriteLine("Не удалось определить объект по пути: $rp")
+ exit 1
+}
+$u = [regex]::Escape($elemUuid.ToLower())
+$matches = [regex]::Matches($text, "([0-2]),0,$u")
+if ($matches.Count -eq 0) {
+ Write-Host "Объект (uuid $elemUuid) не на поддержке (своё добавление или не найден в bin) — переключать нечего."
+ exit 0
+}
+$newF1 = switch ($Set) { 'editable' { '1' } 'off-support' { '2' } 'locked' { '0' } }
+# Replacement string has no group refs — uuid is fixed, f1 is rewritten.
+$text = [regex]::Replace($text, "([0-2]),0,$u", "$newF1,0,$($elemUuid.ToLower())")
+Save-Bin $text
+$state = switch ($Set) {
+ 'editable' { "редактируется с сохранением поддержки (объект продолжит получать обновления вендора — возможны конфликты при обновлении)" }
+ 'off-support' { "снят с поддержки (обновления вендора по этому объекту прекращаются)" }
+ 'locked' { "на замке (правка запрещена)" }
+}
+Write-Host "Объект uuid $elemUuid → $state."
+Write-Host "Записей в bin изменено: $($matches.Count). Цель: $rp"
+exit 0
diff --git a/.claude/skills/support-edit/scripts/support-edit.py b/.claude/skills/support-edit/scripts/support-edit.py
new file mode 100644
index 00000000..ce1a9ed4
--- /dev/null
+++ b/.claude/skills/support-edit/scripts/support-edit.py
@@ -0,0 +1,134 @@
+#!/usr/bin/env python3
+# support-edit v1.0 — Toggle 1C configuration support state (Ext/ParentConfigurations.bin)
+# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
+
+import argparse
+import os
+import re
+import sys
+
+from lxml import etree
+
+sys.stdout.reconfigure(encoding="utf-8")
+sys.stderr.reconfigure(encoding="utf-8")
+
+parser = argparse.ArgumentParser(description="Toggle 1C support state", allow_abbrev=False)
+parser.add_argument("-Path", "-TargetPath", dest="Path", required=True, help="Путь к объекту/форме/макету или каталогу дампа")
+parser.add_argument("-Set", choices=["editable", "off-support", "locked"], default=None)
+parser.add_argument("-Capability", choices=["on", "off"], default=None)
+args = parser.parse_args()
+
+if (not args.Set and not args.Capability) or (args.Set and args.Capability):
+ sys.stderr.write("Укажите ровно одно: -Set editable|off-support|locked ЛИБО -Capability on|off\n")
+ sys.exit(1)
+
+
+def root_uuid(xml_path):
+ if not os.path.isfile(xml_path):
+ return None
+ try:
+ mx = etree.parse(xml_path).getroot()
+ for child in mx:
+ if isinstance(child.tag, str) and child.get("uuid"):
+ return child.get("uuid")
+ except Exception:
+ return None
+ return None
+
+
+target_path = args.Path
+if not os.path.exists(target_path):
+ sys.stderr.write(f"Путь не найден: {target_path}\n")
+ sys.exit(1)
+rp = os.path.abspath(target_path)
+elem_uuid = root_uuid(rp)
+cfg_dir = None
+bin_path = None
+d = rp if os.path.isdir(rp) else os.path.dirname(rp)
+for _ in range(12):
+ if not d:
+ break
+ if not elem_uuid:
+ elem_uuid = root_uuid(d + ".xml")
+ if not cfg_dir:
+ cand = os.path.join(d, "Ext", "ParentConfigurations.bin")
+ if os.path.exists(cand) or os.path.exists(os.path.join(d, "Configuration.xml")):
+ cfg_dir = d
+ bin_path = cand
+ if elem_uuid and cfg_dir:
+ break
+ parent = os.path.dirname(d)
+ if parent == d:
+ break
+ d = parent
+if not elem_uuid and cfg_dir:
+ elem_uuid = root_uuid(os.path.join(cfg_dir, "Configuration.xml"))
+
+if not cfg_dir:
+ sys.stderr.write(f"Не найден корень конфигурации (Configuration.xml) над путём: {rp}\n")
+ sys.exit(1)
+if not os.path.exists(bin_path):
+ print("Конфигурация не на поддержке (Ext/ParentConfigurations.bin отсутствует) — переключать нечего.")
+ sys.exit(0)
+
+raw = open(bin_path, "rb").read()
+if len(raw) <= 32:
+ print("Поддержка снята полностью (пустой ParentConfigurations.bin) — переключать нечего.")
+ sys.exit(0)
+text = raw[3:].decode("utf-8") if raw[:3] == b"\xef\xbb\xbf" else raw.decode("utf-8")
+hm = re.match(r"\{6,(\d+),(\d+),", text)
+if not hm:
+ sys.stderr.write("Неизвестный формат ParentConfigurations.bin\n")
+ sys.exit(1)
+g = int(hm.group(1))
+k = int(hm.group(2))
+
+
+def save_bin(txt):
+ open(bin_path, "wb").write(b"\xef\xbb\xbf" + txt.encode("utf-8"))
+
+
+# === Capability (global G) ===
+if args.Capability:
+ target = "0" if args.Capability == "on" else "1"
+ if g == int(target):
+ word = "включена" if args.Capability == "on" else "выключена"
+ print(f"Возможность изменения конфигурации уже {word} — изменений нет.")
+ sys.exit(0)
+ text = re.sub(r"^(\{6,)\d+(,)", r"\g<1>" + target + r"\g<2>", text)
+ text = re.sub(r"([0-9a-f-]{36}),\d+,([0-9a-f-]{36})", r"\1," + target + r",\2", text)
+ text = re.sub(r"[0-2],0,([0-9a-f-]{36})", target + r",0,\1", text)
+ save_bin(text)
+ if args.Capability == "on":
+ print("Возможность изменения конфигурации ВКЛЮЧЕНА. Все объекты поставщика — на замке.")
+ print("Включайте редактирование точечно: support-edit -Path <объект> -Set editable")
+ else:
+ print("Возможность изменения конфигурации ВЫКЛЮЧЕНА. Вся конфигурация стала read-only; пообъектные правила сброшены.")
+ sys.exit(0)
+
+# === Per-object -Set ===
+if g == 1:
+ sys.stderr.write(
+ "Возможность изменения конфигурации выключена — пообъектное переключение недоступно.\n"
+ f" Сначала: support-edit -Path {target_path} -Capability on\n"
+ )
+ sys.exit(1)
+if not elem_uuid:
+ sys.stderr.write(f"Не удалось определить объект по пути: {rp}\n")
+ sys.exit(1)
+u = re.escape(elem_uuid.lower())
+n = len(re.findall(r"[0-2],0," + u, text))
+if n == 0:
+ print(f"Объект (uuid {elem_uuid}) не на поддержке (своё добавление или не найден в bin) — переключать нечего.")
+ sys.exit(0)
+new_f1 = {"editable": "1", "off-support": "2", "locked": "0"}[args.Set]
+text = re.sub(r"[0-2],0," + u, new_f1 + ",0," + elem_uuid.lower(), text)
+save_bin(text)
+state = {
+ "editable": "редактируется с сохранением поддержки (объект продолжит получать обновления вендора — возможны конфликты при обновлении)",
+ "off-support": "снят с поддержки (обновления вендора по этому объекту прекращаются)",
+ "locked": "на замке (правка запрещена)",
+}[args.Set]
+print(f"Объект uuid {elem_uuid} → {state}.")
+print(f"Записей в bin изменено: {n}. Цель: {rp}")
+sys.exit(0)
diff --git a/.claude/skills/template-add/scripts/add-template.ps1 b/.claude/skills/template-add/scripts/add-template.ps1
index 2557db0c..854f82e5 100644
--- a/.claude/skills/template-add/scripts/add-template.ps1
+++ b/.claude/skills/template-add/scripts/add-template.ps1
@@ -122,7 +122,7 @@ function Assert-EditAllowed([string]$targetPath, [string]$require) {
if ($mode -eq 'off') { return }
# Use Console.Error (not Write-Error) — under ErrorActionPreference=Stop the
# latter throws and would be swallowed by this function's own catch.
- $msg = "[support-guard] Операция запрещена: $reason.`n Цель: $rp`n Безопасные пути: доработка через расширение (cfe-*); включить редактирование объекта/корня в конфигураторе; снять с поддержки.`n Отключить проверку: editingAllowedCheck = warn|off в .v8-project.json."
+ $msg = "[support-guard] Операция запрещена: $reason.`n Цель: $rp`n Безопасные пути: доработка через расширение (cfe-*); либо support-edit -Path <цель> -Set editable (включить объект) / -Path <дамп> -Capability on (вся конфа read-only) / -Set off-support (снять с поддержки).`n Отключить проверку: editingAllowedCheck = warn|off в .v8-project.json."
if ($mode -eq 'warn') { [Console]::Error.WriteLine("[support-guard] ПРЕДУПРЕЖДЕНИЕ: $reason. Цель: $rp"); return }
[Console]::Error.WriteLine($msg)
exit 1
diff --git a/.claude/skills/template-add/scripts/add-template.py b/.claude/skills/template-add/scripts/add-template.py
index 88607277..7fa93aaa 100644
--- a/.claude/skills/template-add/scripts/add-template.py
+++ b/.claude/skills/template-add/scripts/add-template.py
@@ -140,7 +140,7 @@ def assert_edit_allowed(target_path, require):
sys.stderr.write(
f"[support-guard] Операция запрещена: {reason}.\n"
f" Цель: {rp}\n"
- f" Безопасные пути: доработка через расширение (cfe-*); включить редактирование объекта/корня в конфигураторе; снять с поддержки.\n"
+ f" Безопасные пути: доработка через расширение (cfe-*); либо support-edit -Path <цель> -Set editable (включить объект) / -Path <дамп> -Capability on (вся конфа read-only) / -Set off-support (снять с поддержки).\n"
f" Отключить проверку: editingAllowedCheck = warn|off в .v8-project.json.\n"
)
sys.exit(1)
diff --git a/tests/skills/cases/support-edit/_skill.json b/tests/skills/cases/support-edit/_skill.json
new file mode 100644
index 00000000..c2ae4b8f
--- /dev/null
+++ b/tests/skills/cases/support-edit/_skill.json
@@ -0,0 +1,15 @@
+{
+ "script": "support-edit/scripts/support-edit",
+ "setup": "none",
+ "args": [
+ {
+ "flag": "-Path",
+ "from": "workPath",
+ "field": "path"
+ }
+ ],
+ "snapshot": {
+ "root": "workDir",
+ "normalizeUuids": true
+ }
+}
diff --git a/tests/skills/cases/support-edit/capability-off.json b/tests/skills/cases/support-edit/capability-off.json
new file mode 100644
index 00000000..fe3d506b
--- /dev/null
+++ b/tests/skills/cases/support-edit/capability-off.json
@@ -0,0 +1,14 @@
+{
+ "name": "Capability off: вся конфа read-only",
+ "setup": "fixture:g0",
+ "params": {
+ "path": "Configuration.xml"
+ },
+ "args_extra": [
+ "-Capability",
+ "off"
+ ],
+ "expect": {
+ "stdoutContains": "ВЫКЛЮЧЕНА"
+ }
+}
diff --git a/tests/skills/cases/support-edit/capability-on.json b/tests/skills/cases/support-edit/capability-on.json
new file mode 100644
index 00000000..2933b23e
--- /dev/null
+++ b/tests/skills/cases/support-edit/capability-on.json
@@ -0,0 +1,14 @@
+{
+ "name": "Capability on: возможность включена",
+ "setup": "fixture:g1",
+ "params": {
+ "path": "Configuration.xml"
+ },
+ "args_extra": [
+ "-Capability",
+ "on"
+ ],
+ "expect": {
+ "stdoutContains": "ВКЛЮЧЕНА"
+ }
+}
diff --git a/tests/skills/cases/support-edit/fixtures/g0/Catalogs/Locked.xml b/tests/skills/cases/support-edit/fixtures/g0/Catalogs/Locked.xml
new file mode 100644
index 00000000..669bb616
--- /dev/null
+++ b/tests/skills/cases/support-edit/fixtures/g0/Catalogs/Locked.xml
@@ -0,0 +1,12 @@
+
+
+
+
+ Locked
+
+ 9
+ 25
+
+
+
+
diff --git a/tests/skills/cases/support-edit/fixtures/g0/Catalogs/Removed.xml b/tests/skills/cases/support-edit/fixtures/g0/Catalogs/Removed.xml
new file mode 100644
index 00000000..7f0e0e2f
--- /dev/null
+++ b/tests/skills/cases/support-edit/fixtures/g0/Catalogs/Removed.xml
@@ -0,0 +1,12 @@
+
+
+
+
+ Removed
+
+ 9
+ 25
+
+
+
+
diff --git a/tests/skills/cases/support-edit/fixtures/g0/Configuration.xml b/tests/skills/cases/support-edit/fixtures/g0/Configuration.xml
new file mode 100644
index 00000000..c336d3aa
--- /dev/null
+++ b/tests/skills/cases/support-edit/fixtures/g0/Configuration.xml
@@ -0,0 +1,14 @@
+
+
+
+
+ ТестКонфиг
+ ТестВендор
+ 1.0
+
+
+ Locked
+ Removed
+
+
+
diff --git a/tests/skills/cases/support-edit/fixtures/g0/Ext/ParentConfigurations.bin b/tests/skills/cases/support-edit/fixtures/g0/Ext/ParentConfigurations.bin
new file mode 100644
index 00000000..e96a02d0
--- /dev/null
+++ b/tests/skills/cases/support-edit/fixtures/g0/Ext/ParentConfigurations.bin
@@ -0,0 +1 @@
+{6,0,1,aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa,0,bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb,"1.0","ТестВендор","ТестКонфиг",3,0,0,11111111-1111-1111-1111-111111111111,0,0,22222222-2222-2222-2222-222222222222,22222222-2222-2222-2222-222222222222,2,0,33333333-3333-3333-3333-333333333333,33333333-3333-3333-3333-333333333333}
\ No newline at end of file
diff --git a/tests/skills/cases/support-edit/fixtures/g1/Catalogs/Locked.xml b/tests/skills/cases/support-edit/fixtures/g1/Catalogs/Locked.xml
new file mode 100644
index 00000000..669bb616
--- /dev/null
+++ b/tests/skills/cases/support-edit/fixtures/g1/Catalogs/Locked.xml
@@ -0,0 +1,12 @@
+
+
+
+
+ Locked
+
+ 9
+ 25
+
+
+
+
diff --git a/tests/skills/cases/support-edit/fixtures/g1/Catalogs/Removed.xml b/tests/skills/cases/support-edit/fixtures/g1/Catalogs/Removed.xml
new file mode 100644
index 00000000..7f0e0e2f
--- /dev/null
+++ b/tests/skills/cases/support-edit/fixtures/g1/Catalogs/Removed.xml
@@ -0,0 +1,12 @@
+
+
+
+
+ Removed
+
+ 9
+ 25
+
+
+
+
diff --git a/tests/skills/cases/support-edit/fixtures/g1/Configuration.xml b/tests/skills/cases/support-edit/fixtures/g1/Configuration.xml
new file mode 100644
index 00000000..c336d3aa
--- /dev/null
+++ b/tests/skills/cases/support-edit/fixtures/g1/Configuration.xml
@@ -0,0 +1,14 @@
+
+
+
+
+ ТестКонфиг
+ ТестВендор
+ 1.0
+
+
+ Locked
+ Removed
+
+
+
diff --git a/tests/skills/cases/support-edit/fixtures/g1/Ext/ParentConfigurations.bin b/tests/skills/cases/support-edit/fixtures/g1/Ext/ParentConfigurations.bin
new file mode 100644
index 00000000..073bb99a
--- /dev/null
+++ b/tests/skills/cases/support-edit/fixtures/g1/Ext/ParentConfigurations.bin
@@ -0,0 +1 @@
+{6,1,1,aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa,1,bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb,"1.0","ТестВендор","ТестКонфиг",3,1,0,11111111-1111-1111-1111-111111111111,1,0,22222222-2222-2222-2222-222222222222,22222222-2222-2222-2222-222222222222,1,0,33333333-3333-3333-3333-333333333333,33333333-3333-3333-3333-333333333333}
\ No newline at end of file
diff --git a/tests/skills/cases/support-edit/set-editable.json b/tests/skills/cases/support-edit/set-editable.json
new file mode 100644
index 00000000..55e55e01
--- /dev/null
+++ b/tests/skills/cases/support-edit/set-editable.json
@@ -0,0 +1,14 @@
+{
+ "name": "Set editable: объект на замке → редактируется",
+ "setup": "fixture:g0",
+ "params": {
+ "path": "Catalogs/Locked.xml"
+ },
+ "args_extra": [
+ "-Set",
+ "editable"
+ ],
+ "expect": {
+ "stdoutContains": "редактируется с сохранением поддержки"
+ }
+}
diff --git a/tests/skills/cases/support-edit/set-off-support.json b/tests/skills/cases/support-edit/set-off-support.json
new file mode 100644
index 00000000..82597595
--- /dev/null
+++ b/tests/skills/cases/support-edit/set-off-support.json
@@ -0,0 +1,14 @@
+{
+ "name": "Set off-support: объект снят с поддержки",
+ "setup": "fixture:g0",
+ "params": {
+ "path": "Catalogs/Locked.xml"
+ },
+ "args_extra": [
+ "-Set",
+ "off-support"
+ ],
+ "expect": {
+ "stdoutContains": "снят с поддержки"
+ }
+}
diff --git a/tests/skills/cases/support-edit/set-prereq-g1.json b/tests/skills/cases/support-edit/set-prereq-g1.json
new file mode 100644
index 00000000..a01dbc40
--- /dev/null
+++ b/tests/skills/cases/support-edit/set-prereq-g1.json
@@ -0,0 +1,12 @@
+{
+ "name": "Set при выключенной возможности → отказ-предусловие",
+ "setup": "fixture:g1",
+ "params": {
+ "path": "Catalogs/Locked.xml"
+ },
+ "args_extra": [
+ "-Set",
+ "editable"
+ ],
+ "expectError": "Capability on"
+}
diff --git a/tests/skills/cases/support-edit/snapshots/capability-off/Catalogs/Locked.xml b/tests/skills/cases/support-edit/snapshots/capability-off/Catalogs/Locked.xml
new file mode 100644
index 00000000..2c6a6c46
--- /dev/null
+++ b/tests/skills/cases/support-edit/snapshots/capability-off/Catalogs/Locked.xml
@@ -0,0 +1,12 @@
+
+
+
+
+ Locked
+
+ 9
+ 25
+
+
+
+
diff --git a/tests/skills/cases/support-edit/snapshots/capability-off/Catalogs/Removed.xml b/tests/skills/cases/support-edit/snapshots/capability-off/Catalogs/Removed.xml
new file mode 100644
index 00000000..edfbba3e
--- /dev/null
+++ b/tests/skills/cases/support-edit/snapshots/capability-off/Catalogs/Removed.xml
@@ -0,0 +1,12 @@
+
+
+
+
+ Removed
+
+ 9
+ 25
+
+
+
+
diff --git a/tests/skills/cases/support-edit/snapshots/capability-off/Configuration.xml b/tests/skills/cases/support-edit/snapshots/capability-off/Configuration.xml
new file mode 100644
index 00000000..c78e64d2
--- /dev/null
+++ b/tests/skills/cases/support-edit/snapshots/capability-off/Configuration.xml
@@ -0,0 +1,14 @@
+
+
+
+
+ ТестКонфиг
+ ТестВендор
+ 1.0
+
+
+ Locked
+ Removed
+
+
+
diff --git a/tests/skills/cases/support-edit/snapshots/capability-off/Ext/ParentConfigurations.bin b/tests/skills/cases/support-edit/snapshots/capability-off/Ext/ParentConfigurations.bin
new file mode 100644
index 00000000..b6d21003
--- /dev/null
+++ b/tests/skills/cases/support-edit/snapshots/capability-off/Ext/ParentConfigurations.bin
@@ -0,0 +1 @@
+{6,1,1,UUID-001,1,UUID-002,"1.0","ТестВендор","ТестКонфиг",3,1,0,UUID-003,1,0,UUID-004,UUID-004,1,0,UUID-005,UUID-005}
\ No newline at end of file
diff --git a/tests/skills/cases/support-edit/snapshots/capability-on/Catalogs/Locked.xml b/tests/skills/cases/support-edit/snapshots/capability-on/Catalogs/Locked.xml
new file mode 100644
index 00000000..2c6a6c46
--- /dev/null
+++ b/tests/skills/cases/support-edit/snapshots/capability-on/Catalogs/Locked.xml
@@ -0,0 +1,12 @@
+
+
+
+
+ Locked
+
+ 9
+ 25
+
+
+
+
diff --git a/tests/skills/cases/support-edit/snapshots/capability-on/Catalogs/Removed.xml b/tests/skills/cases/support-edit/snapshots/capability-on/Catalogs/Removed.xml
new file mode 100644
index 00000000..edfbba3e
--- /dev/null
+++ b/tests/skills/cases/support-edit/snapshots/capability-on/Catalogs/Removed.xml
@@ -0,0 +1,12 @@
+
+
+
+
+ Removed
+
+ 9
+ 25
+
+
+
+
diff --git a/tests/skills/cases/support-edit/snapshots/capability-on/Configuration.xml b/tests/skills/cases/support-edit/snapshots/capability-on/Configuration.xml
new file mode 100644
index 00000000..c78e64d2
--- /dev/null
+++ b/tests/skills/cases/support-edit/snapshots/capability-on/Configuration.xml
@@ -0,0 +1,14 @@
+
+
+
+
+ ТестКонфиг
+ ТестВендор
+ 1.0
+
+
+ Locked
+ Removed
+
+
+
diff --git a/tests/skills/cases/support-edit/snapshots/capability-on/Ext/ParentConfigurations.bin b/tests/skills/cases/support-edit/snapshots/capability-on/Ext/ParentConfigurations.bin
new file mode 100644
index 00000000..ba1a41cf
--- /dev/null
+++ b/tests/skills/cases/support-edit/snapshots/capability-on/Ext/ParentConfigurations.bin
@@ -0,0 +1 @@
+{6,0,1,UUID-001,0,UUID-002,"1.0","ТестВендор","ТестКонфиг",3,0,0,UUID-003,0,0,UUID-004,UUID-004,0,0,UUID-005,UUID-005}
\ No newline at end of file
diff --git a/tests/skills/cases/support-edit/snapshots/set-editable/Catalogs/Locked.xml b/tests/skills/cases/support-edit/snapshots/set-editable/Catalogs/Locked.xml
new file mode 100644
index 00000000..2c6a6c46
--- /dev/null
+++ b/tests/skills/cases/support-edit/snapshots/set-editable/Catalogs/Locked.xml
@@ -0,0 +1,12 @@
+
+
+
+
+ Locked
+
+ 9
+ 25
+
+
+
+
diff --git a/tests/skills/cases/support-edit/snapshots/set-editable/Catalogs/Removed.xml b/tests/skills/cases/support-edit/snapshots/set-editable/Catalogs/Removed.xml
new file mode 100644
index 00000000..edfbba3e
--- /dev/null
+++ b/tests/skills/cases/support-edit/snapshots/set-editable/Catalogs/Removed.xml
@@ -0,0 +1,12 @@
+
+
+
+
+ Removed
+
+ 9
+ 25
+
+
+
+
diff --git a/tests/skills/cases/support-edit/snapshots/set-editable/Configuration.xml b/tests/skills/cases/support-edit/snapshots/set-editable/Configuration.xml
new file mode 100644
index 00000000..c78e64d2
--- /dev/null
+++ b/tests/skills/cases/support-edit/snapshots/set-editable/Configuration.xml
@@ -0,0 +1,14 @@
+
+
+
+
+ ТестКонфиг
+ ТестВендор
+ 1.0
+
+
+ Locked
+ Removed
+
+
+
diff --git a/tests/skills/cases/support-edit/snapshots/set-editable/Ext/ParentConfigurations.bin b/tests/skills/cases/support-edit/snapshots/set-editable/Ext/ParentConfigurations.bin
new file mode 100644
index 00000000..dbac2c6d
--- /dev/null
+++ b/tests/skills/cases/support-edit/snapshots/set-editable/Ext/ParentConfigurations.bin
@@ -0,0 +1 @@
+{6,0,1,UUID-001,0,UUID-002,"1.0","ТестВендор","ТестКонфиг",3,0,0,UUID-003,1,0,UUID-004,UUID-004,2,0,UUID-005,UUID-005}
\ No newline at end of file
diff --git a/tests/skills/cases/support-edit/snapshots/set-off-support/Catalogs/Locked.xml b/tests/skills/cases/support-edit/snapshots/set-off-support/Catalogs/Locked.xml
new file mode 100644
index 00000000..2c6a6c46
--- /dev/null
+++ b/tests/skills/cases/support-edit/snapshots/set-off-support/Catalogs/Locked.xml
@@ -0,0 +1,12 @@
+
+
+
+
+ Locked
+
+ 9
+ 25
+
+
+
+
diff --git a/tests/skills/cases/support-edit/snapshots/set-off-support/Catalogs/Removed.xml b/tests/skills/cases/support-edit/snapshots/set-off-support/Catalogs/Removed.xml
new file mode 100644
index 00000000..edfbba3e
--- /dev/null
+++ b/tests/skills/cases/support-edit/snapshots/set-off-support/Catalogs/Removed.xml
@@ -0,0 +1,12 @@
+
+
+
+
+ Removed
+
+ 9
+ 25
+
+
+
+
diff --git a/tests/skills/cases/support-edit/snapshots/set-off-support/Configuration.xml b/tests/skills/cases/support-edit/snapshots/set-off-support/Configuration.xml
new file mode 100644
index 00000000..c78e64d2
--- /dev/null
+++ b/tests/skills/cases/support-edit/snapshots/set-off-support/Configuration.xml
@@ -0,0 +1,14 @@
+
+
+
+
+ ТестКонфиг
+ ТестВендор
+ 1.0
+
+
+ Locked
+ Removed
+
+
+
diff --git a/tests/skills/cases/support-edit/snapshots/set-off-support/Ext/ParentConfigurations.bin b/tests/skills/cases/support-edit/snapshots/set-off-support/Ext/ParentConfigurations.bin
new file mode 100644
index 00000000..75f905f5
--- /dev/null
+++ b/tests/skills/cases/support-edit/snapshots/set-off-support/Ext/ParentConfigurations.bin
@@ -0,0 +1 @@
+{6,0,1,UUID-001,0,UUID-002,"1.0","ТестВендор","ТестКонфиг",3,0,0,UUID-003,2,0,UUID-004,UUID-004,2,0,UUID-005,UUID-005}
\ No newline at end of file