From 88f74e96f0556417f35ba3016c6ba7384f3bffe4 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Wed, 25 Feb 2026 18:31:27 +0300 Subject: [PATCH] fix(python): add stderr UTF-8 encoding for Windows compatibility Without reconfiguring stderr, Cyrillic error messages appear garbled on Windows (cp1251 default). Mirrors the existing stdout fix. Co-Authored-By: Claude Opus 4.6 --- .claude/skills/cf-edit/scripts/cf-edit.py | 1 + .claude/skills/cf-info/scripts/cf-info.py | 1 + .claude/skills/cf-init/scripts/cf-init.py | 1 + .claude/skills/cf-validate/scripts/cf-validate.py | 1 + .claude/skills/cfe-borrow/scripts/cfe-borrow.py | 1 + .claude/skills/cfe-diff/scripts/cfe-diff.py | 1 + .claude/skills/cfe-init/scripts/cfe-init.py | 1 + .claude/skills/cfe-patch-method/scripts/cfe-patch-method.py | 1 + .claude/skills/cfe-validate/scripts/cfe-validate.py | 1 + .claude/skills/db-create/scripts/db-create.py | 1 + .claude/skills/db-dump-cf/scripts/db-dump-cf.py | 1 + .claude/skills/db-dump-xml/scripts/db-dump-xml.py | 1 + .claude/skills/db-load-cf/scripts/db-load-cf.py | 1 + .claude/skills/db-load-git/scripts/db-load-git.py | 1 + .claude/skills/db-load-xml/scripts/db-load-xml.py | 1 + .claude/skills/db-run/scripts/db-run.py | 1 + .claude/skills/db-update/scripts/db-update.py | 1 + .claude/skills/epf-add-form/scripts/add-form.py | 1 + .claude/skills/epf-build/scripts/epf-build.py | 1 + .claude/skills/epf-dump/scripts/epf-dump.py | 1 + .claude/skills/epf-init/scripts/init.py | 1 + .claude/skills/epf-validate/scripts/epf-validate.py | 1 + .claude/skills/erf-init/scripts/init.py | 1 + .claude/skills/form-add/scripts/form-add.py | 1 + .claude/skills/form-compile/scripts/form-compile.py | 1 + .claude/skills/form-edit/scripts/form-edit.py | 1 + .claude/skills/form-info/scripts/form-info.py | 1 + .claude/skills/form-remove/scripts/remove-form.py | 1 + .claude/skills/form-validate/scripts/form-validate.py | 1 + .claude/skills/help-add/scripts/add-help.py | 1 + .claude/skills/img-grid/scripts/overlay-grid.py | 1 + .claude/skills/interface-edit/scripts/interface-edit.py | 1 + .claude/skills/interface-validate/scripts/interface-validate.py | 1 + .claude/skills/meta-compile/scripts/meta-compile.py | 1 + .claude/skills/meta-edit/scripts/meta-edit.py | 1 + .claude/skills/meta-info/scripts/meta-info.py | 1 + .claude/skills/meta-remove/scripts/meta-remove.py | 1 + .claude/skills/meta-validate/scripts/meta-validate.py | 1 + .claude/skills/mxl-compile/scripts/mxl-compile.py | 1 + .claude/skills/mxl-decompile/scripts/mxl-decompile.py | 1 + .claude/skills/mxl-info/scripts/mxl-info.py | 1 + .claude/skills/mxl-validate/scripts/mxl-validate.py | 1 + .claude/skills/role-compile/scripts/role-compile.py | 1 + .claude/skills/role-info/scripts/role-info.py | 1 + .claude/skills/role-validate/scripts/role-validate.py | 1 + .claude/skills/skd-compile/scripts/skd-compile.py | 1 + .claude/skills/skd-edit/scripts/skd-edit.py | 1 + .claude/skills/skd-info/scripts/skd-info.py | 1 + .claude/skills/skd-validate/scripts/skd-validate.py | 1 + .claude/skills/subsystem-compile/scripts/subsystem-compile.py | 1 + .claude/skills/subsystem-edit/scripts/subsystem-edit.py | 1 + .claude/skills/subsystem-info/scripts/subsystem-info.py | 1 + .claude/skills/subsystem-validate/scripts/subsystem-validate.py | 1 + .claude/skills/template-add/scripts/add-template.py | 1 + .claude/skills/template-remove/scripts/remove-template.py | 1 + .claude/skills/web-info/scripts/web-info.py | 1 + .claude/skills/web-publish/scripts/web-publish.py | 1 + .claude/skills/web-stop/scripts/web-stop.py | 1 + .claude/skills/web-unpublish/scripts/web-unpublish.py | 1 + 59 files changed, 59 insertions(+) diff --git a/.claude/skills/cf-edit/scripts/cf-edit.py b/.claude/skills/cf-edit/scripts/cf-edit.py index 91a9b86b..3af0d6ec 100644 --- a/.claude/skills/cf-edit/scripts/cf-edit.py +++ b/.claude/skills/cf-edit/scripts/cf-edit.py @@ -139,6 +139,7 @@ def save_xml_bom(tree, path): def main(): sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") parser = argparse.ArgumentParser(description="Edit 1C configuration root (Configuration.xml)", allow_abbrev=False) parser.add_argument("-ConfigPath", required=True) parser.add_argument("-DefinitionFile", default=None) diff --git a/.claude/skills/cf-info/scripts/cf-info.py b/.claude/skills/cf-info/scripts/cf-info.py index d3b77c64..396de073 100644 --- a/.claude/skills/cf-info/scripts/cf-info.py +++ b/.claude/skills/cf-info/scripts/cf-info.py @@ -9,6 +9,7 @@ from collections import OrderedDict from lxml import etree sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") # --- Argument parsing --- parser = argparse.ArgumentParser(description="Analyze 1C configuration structure", allow_abbrev=False) diff --git a/.claude/skills/cf-init/scripts/cf-init.py b/.claude/skills/cf-init/scripts/cf-init.py index c2780c73..b34997db 100644 --- a/.claude/skills/cf-init/scripts/cf-init.py +++ b/.claude/skills/cf-init/scripts/cf-init.py @@ -16,6 +16,7 @@ def write_utf8_bom(path, content): def main(): sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") parser = argparse.ArgumentParser(description='Create empty 1C configuration scaffold', allow_abbrev=False) parser.add_argument('-Name', dest='Name', required=True) parser.add_argument('-Synonym', dest='Synonym', default=None) diff --git a/.claude/skills/cf-validate/scripts/cf-validate.py b/.claude/skills/cf-validate/scripts/cf-validate.py index 8ebef17b..43e1cc3d 100644 --- a/.claude/skills/cf-validate/scripts/cf-validate.py +++ b/.claude/skills/cf-validate/scripts/cf-validate.py @@ -149,6 +149,7 @@ class Reporter: def main(): sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") parser = argparse.ArgumentParser( description='Validate 1C configuration XML structure', allow_abbrev=False ) diff --git a/.claude/skills/cfe-borrow/scripts/cfe-borrow.py b/.claude/skills/cfe-borrow/scripts/cfe-borrow.py index eca0d13b..9b00d514 100644 --- a/.claude/skills/cfe-borrow/scripts/cfe-borrow.py +++ b/.claude/skills/cfe-borrow/scripts/cfe-borrow.py @@ -313,6 +313,7 @@ def new_guid(): def main(): sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") parser = argparse.ArgumentParser(description="Borrow objects from configuration into extension", allow_abbrev=False) parser.add_argument("-ExtensionPath", required=True) parser.add_argument("-ConfigPath", required=True) diff --git a/.claude/skills/cfe-diff/scripts/cfe-diff.py b/.claude/skills/cfe-diff/scripts/cfe-diff.py index 34c25842..3398410a 100644 --- a/.claude/skills/cfe-diff/scripts/cfe-diff.py +++ b/.claude/skills/cfe-diff/scripts/cfe-diff.py @@ -463,6 +463,7 @@ def mode_b(objects, extension_path, config_path): def main(): sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") parser = argparse.ArgumentParser(description="Analyze and compare 1C configuration extension (CFE)", allow_abbrev=False) parser.add_argument("-ExtensionPath", required=True, help="Path to extension dump root") parser.add_argument("-ConfigPath", required=True, help="Path to base config dump root") diff --git a/.claude/skills/cfe-init/scripts/cfe-init.py b/.claude/skills/cfe-init/scripts/cfe-init.py index c23e133c..c3173cc2 100644 --- a/.claude/skills/cfe-init/scripts/cfe-init.py +++ b/.claude/skills/cfe-init/scripts/cfe-init.py @@ -17,6 +17,7 @@ def write_utf8_bom(path, content): def main(): sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") parser = argparse.ArgumentParser(description='Create 1C configuration extension scaffold', allow_abbrev=False) parser.add_argument('-Name', dest='Name', required=True) parser.add_argument('-Synonym', dest='Synonym', default=None) diff --git a/.claude/skills/cfe-patch-method/scripts/cfe-patch-method.py b/.claude/skills/cfe-patch-method/scripts/cfe-patch-method.py index a9b40672..5901693e 100644 --- a/.claude/skills/cfe-patch-method/scripts/cfe-patch-method.py +++ b/.claude/skills/cfe-patch-method/scripts/cfe-patch-method.py @@ -10,6 +10,7 @@ import xml.etree.ElementTree as ET def main(): sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") parser = argparse.ArgumentParser( description="Generate method interceptor for 1C extension (CFE)", allow_abbrev=False, diff --git a/.claude/skills/cfe-validate/scripts/cfe-validate.py b/.claude/skills/cfe-validate/scripts/cfe-validate.py index c93d970d..2a0dd5f0 100644 --- a/.claude/skills/cfe-validate/scripts/cfe-validate.py +++ b/.claude/skills/cfe-validate/scripts/cfe-validate.py @@ -134,6 +134,7 @@ class Reporter: def main(): sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") parser = argparse.ArgumentParser( description='Validate 1C configuration extension XML structure (CFE)', allow_abbrev=False ) diff --git a/.claude/skills/db-create/scripts/db-create.py b/.claude/skills/db-create/scripts/db-create.py index 21dc6e48..34f63ed8 100644 --- a/.claude/skills/db-create/scripts/db-create.py +++ b/.claude/skills/db-create/scripts/db-create.py @@ -32,6 +32,7 @@ def resolve_v8path(v8path): def main(): sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") parser = argparse.ArgumentParser( description="Create 1C information base", allow_abbrev=False, diff --git a/.claude/skills/db-dump-cf/scripts/db-dump-cf.py b/.claude/skills/db-dump-cf/scripts/db-dump-cf.py index ecee5f06..4471a751 100644 --- a/.claude/skills/db-dump-cf/scripts/db-dump-cf.py +++ b/.claude/skills/db-dump-cf/scripts/db-dump-cf.py @@ -32,6 +32,7 @@ def resolve_v8path(v8path): def main(): sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") parser = argparse.ArgumentParser( description="Dump 1C configuration to CF file", allow_abbrev=False, diff --git a/.claude/skills/db-dump-xml/scripts/db-dump-xml.py b/.claude/skills/db-dump-xml/scripts/db-dump-xml.py index 2cc0df58..656153b6 100644 --- a/.claude/skills/db-dump-xml/scripts/db-dump-xml.py +++ b/.claude/skills/db-dump-xml/scripts/db-dump-xml.py @@ -34,6 +34,7 @@ def resolve_v8path(v8path): def main(): sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") parser = argparse.ArgumentParser( description="Dump 1C configuration to XML files", allow_abbrev=False, diff --git a/.claude/skills/db-load-cf/scripts/db-load-cf.py b/.claude/skills/db-load-cf/scripts/db-load-cf.py index 0abbc4f1..991b11fc 100644 --- a/.claude/skills/db-load-cf/scripts/db-load-cf.py +++ b/.claude/skills/db-load-cf/scripts/db-load-cf.py @@ -32,6 +32,7 @@ def resolve_v8path(v8path): def main(): sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") parser = argparse.ArgumentParser( description="Load 1C configuration from CF file", allow_abbrev=False, diff --git a/.claude/skills/db-load-git/scripts/db-load-git.py b/.claude/skills/db-load-git/scripts/db-load-git.py index cc3e4686..f733336b 100644 --- a/.claude/skills/db-load-git/scripts/db-load-git.py +++ b/.claude/skills/db-load-git/scripts/db-load-git.py @@ -56,6 +56,7 @@ def run_git(config_dir, git_args): def main(): sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") parser = argparse.ArgumentParser( description="Load Git changes into 1C database", allow_abbrev=False, diff --git a/.claude/skills/db-load-xml/scripts/db-load-xml.py b/.claude/skills/db-load-xml/scripts/db-load-xml.py index e45b82e2..b470c645 100644 --- a/.claude/skills/db-load-xml/scripts/db-load-xml.py +++ b/.claude/skills/db-load-xml/scripts/db-load-xml.py @@ -34,6 +34,7 @@ def resolve_v8path(v8path): def main(): sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") parser = argparse.ArgumentParser( description="Load 1C configuration from XML files", allow_abbrev=False, diff --git a/.claude/skills/db-run/scripts/db-run.py b/.claude/skills/db-run/scripts/db-run.py index 1ca82ed7..b19807a8 100644 --- a/.claude/skills/db-run/scripts/db-run.py +++ b/.claude/skills/db-run/scripts/db-run.py @@ -29,6 +29,7 @@ def resolve_v8path(v8path): def main(): sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") parser = argparse.ArgumentParser( description="Launch 1C:Enterprise", allow_abbrev=False, diff --git a/.claude/skills/db-update/scripts/db-update.py b/.claude/skills/db-update/scripts/db-update.py index 15d0dd90..c6257d6c 100644 --- a/.claude/skills/db-update/scripts/db-update.py +++ b/.claude/skills/db-update/scripts/db-update.py @@ -32,6 +32,7 @@ def resolve_v8path(v8path): def main(): sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") parser = argparse.ArgumentParser( description="Update 1C database configuration", allow_abbrev=False, diff --git a/.claude/skills/epf-add-form/scripts/add-form.py b/.claude/skills/epf-add-form/scripts/add-form.py index ec75230b..2bd85909 100644 --- a/.claude/skills/epf-add-form/scripts/add-form.py +++ b/.claude/skills/epf-add-form/scripts/add-form.py @@ -29,6 +29,7 @@ def write_text_with_bom(path, text): def main(): sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") parser = argparse.ArgumentParser(description="Add managed form to 1C processor", allow_abbrev=False) parser.add_argument("-ProcessorName", required=True) parser.add_argument("-FormName", required=True) diff --git a/.claude/skills/epf-build/scripts/epf-build.py b/.claude/skills/epf-build/scripts/epf-build.py index 305210ce..69ab174e 100644 --- a/.claude/skills/epf-build/scripts/epf-build.py +++ b/.claude/skills/epf-build/scripts/epf-build.py @@ -34,6 +34,7 @@ def resolve_v8path(v8path): def main(): sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") parser = argparse.ArgumentParser( description="Build external data processor or report (EPF/ERF) from XML sources", allow_abbrev=False, diff --git a/.claude/skills/epf-dump/scripts/epf-dump.py b/.claude/skills/epf-dump/scripts/epf-dump.py index 8c13edac..268b8b82 100644 --- a/.claude/skills/epf-dump/scripts/epf-dump.py +++ b/.claude/skills/epf-dump/scripts/epf-dump.py @@ -34,6 +34,7 @@ def resolve_v8path(v8path): def main(): sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") parser = argparse.ArgumentParser( description="Dump external data processor or report (EPF/ERF) to XML sources", allow_abbrev=False, diff --git a/.claude/skills/epf-init/scripts/init.py b/.claude/skills/epf-init/scripts/init.py index 4465d148..49f7dfb5 100644 --- a/.claude/skills/epf-init/scripts/init.py +++ b/.claude/skills/epf-init/scripts/init.py @@ -16,6 +16,7 @@ def write_utf8_bom(path, content): def main(): sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") parser = argparse.ArgumentParser(description='Init 1C external data processor scaffold', allow_abbrev=False) parser.add_argument('-Name', dest='Name', required=True) parser.add_argument('-Synonym', dest='Synonym', default=None) diff --git a/.claude/skills/epf-validate/scripts/epf-validate.py b/.claude/skills/epf-validate/scripts/epf-validate.py index 3772c1f0..b0e3a7e2 100644 --- a/.claude/skills/epf-validate/scripts/epf-validate.py +++ b/.claude/skills/epf-validate/scripts/epf-validate.py @@ -44,6 +44,7 @@ def localname(el): def main(): sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") parser = argparse.ArgumentParser(description="Validate 1C external data processor/report structure", allow_abbrev=False) parser.add_argument("-ObjectPath", required=True) parser.add_argument("-MaxErrors", type=int, default=30) diff --git a/.claude/skills/erf-init/scripts/init.py b/.claude/skills/erf-init/scripts/init.py index aad42fed..fb1afaae 100644 --- a/.claude/skills/erf-init/scripts/init.py +++ b/.claude/skills/erf-init/scripts/init.py @@ -16,6 +16,7 @@ def write_utf8_bom(path, content): def main(): sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") parser = argparse.ArgumentParser(description='Init 1C external report scaffold', allow_abbrev=False) parser.add_argument('-Name', dest='Name', required=True) parser.add_argument('-Synonym', dest='Synonym', default=None) diff --git a/.claude/skills/form-add/scripts/form-add.py b/.claude/skills/form-add/scripts/form-add.py index ef1cc6de..a0c821b7 100644 --- a/.claude/skills/form-add/scripts/form-add.py +++ b/.claude/skills/form-add/scripts/form-add.py @@ -32,6 +32,7 @@ def write_text_with_bom(path, text): def main(): sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") parser = argparse.ArgumentParser(description="Add managed form to 1C config object", allow_abbrev=False) parser.add_argument("-ObjectPath", required=True) parser.add_argument("-FormName", required=True) diff --git a/.claude/skills/form-compile/scripts/form-compile.py b/.claude/skills/form-compile/scripts/form-compile.py index 0302f416..6736c8e1 100644 --- a/.claude/skills/form-compile/scripts/form-compile.py +++ b/.claude/skills/form-compile/scripts/form-compile.py @@ -948,6 +948,7 @@ def emit_properties(lines, props, indent): def main(): sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") global _next_id parser = argparse.ArgumentParser(description='Compile 1C managed form from JSON', allow_abbrev=False) diff --git a/.claude/skills/form-edit/scripts/form-edit.py b/.claude/skills/form-edit/scripts/form-edit.py index 01a045bf..8d8da185 100644 --- a/.claude/skills/form-edit/scripts/form-edit.py +++ b/.claude/skills/form-edit/scripts/form-edit.py @@ -9,6 +9,7 @@ import sys from lxml import etree sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") # ── arg parsing ────────────────────────────────────────────── diff --git a/.claude/skills/form-info/scripts/form-info.py b/.claude/skills/form-info/scripts/form-info.py index e173b5cf..60790cad 100644 --- a/.claude/skills/form-info/scripts/form-info.py +++ b/.claude/skills/form-info/scripts/form-info.py @@ -333,6 +333,7 @@ def build_tree(child_items_node, prefix, tree_lines): def main(): sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") parser = argparse.ArgumentParser(description="Analyze 1C managed form structure", allow_abbrev=False) parser.add_argument("-FormPath", required=True, help="Path to Form.xml") parser.add_argument("-Limit", type=int, default=150, help="Max lines to show") diff --git a/.claude/skills/form-remove/scripts/remove-form.py b/.claude/skills/form-remove/scripts/remove-form.py index d5251ee4..b9354344 100644 --- a/.claude/skills/form-remove/scripts/remove-form.py +++ b/.claude/skills/form-remove/scripts/remove-form.py @@ -24,6 +24,7 @@ def save_xml_with_bom(tree, path): def main(): sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") parser = argparse.ArgumentParser(description="Remove form from 1C object", allow_abbrev=False) parser.add_argument("-ObjectName", "-ProcessorName", required=True) parser.add_argument("-FormName", required=True) diff --git a/.claude/skills/form-validate/scripts/form-validate.py b/.claude/skills/form-validate/scripts/form-validate.py index 91c89d9f..c78d0c00 100644 --- a/.claude/skills/form-validate/scripts/form-validate.py +++ b/.claude/skills/form-validate/scripts/form-validate.py @@ -20,6 +20,7 @@ def localname(el): def main(): sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") parser = argparse.ArgumentParser(description="Validate 1C managed form", allow_abbrev=False) parser.add_argument("-FormPath", required=True) parser.add_argument("-MaxErrors", type=int, default=30) diff --git a/.claude/skills/help-add/scripts/add-help.py b/.claude/skills/help-add/scripts/add-help.py index cace0552..8aa7f7b0 100644 --- a/.claude/skills/help-add/scripts/add-help.py +++ b/.claude/skills/help-add/scripts/add-help.py @@ -28,6 +28,7 @@ def write_text_with_bom(path, text): def main(): sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") parser = argparse.ArgumentParser(description="Add built-in help to 1C object", allow_abbrev=False) parser.add_argument("-ObjectName", "-ProcessorName", required=True) parser.add_argument("-Lang", default="ru") diff --git a/.claude/skills/img-grid/scripts/overlay-grid.py b/.claude/skills/img-grid/scripts/overlay-grid.py index 6d1eaa9c..215da925 100644 --- a/.claude/skills/img-grid/scripts/overlay-grid.py +++ b/.claude/skills/img-grid/scripts/overlay-grid.py @@ -19,6 +19,7 @@ MARGIN_LEFT = 24 def main(): sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") parser = argparse.ArgumentParser(description="Overlay numbered grid on image") parser.add_argument("image", help="Input image path") parser.add_argument("-c", "--cols", type=int, default=50, diff --git a/.claude/skills/interface-edit/scripts/interface-edit.py b/.claude/skills/interface-edit/scripts/interface-edit.py index 373c80ab..927f213c 100644 --- a/.claude/skills/interface-edit/scripts/interface-edit.py +++ b/.claude/skills/interface-edit/scripts/interface-edit.py @@ -111,6 +111,7 @@ def find_command_by_name(section, cmd_name): def main(): sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") parser = argparse.ArgumentParser(description="Edit 1C CommandInterface.xml", allow_abbrev=False) parser.add_argument("-CIPath", required=True) parser.add_argument("-DefinitionFile", default=None) diff --git a/.claude/skills/interface-validate/scripts/interface-validate.py b/.claude/skills/interface-validate/scripts/interface-validate.py index ff87cc53..9a56d135 100644 --- a/.claude/skills/interface-validate/scripts/interface-validate.py +++ b/.claude/skills/interface-validate/scripts/interface-validate.py @@ -71,6 +71,7 @@ def find_duplicates(items): def main(): sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") parser = argparse.ArgumentParser( description='Validate 1C CommandInterface.xml structure', allow_abbrev=False ) diff --git a/.claude/skills/meta-compile/scripts/meta-compile.py b/.claude/skills/meta-compile/scripts/meta-compile.py index 762de880..46f8b3a1 100644 --- a/.claude/skills/meta-compile/scripts/meta-compile.py +++ b/.claude/skills/meta-compile/scripts/meta-compile.py @@ -11,6 +11,7 @@ import uuid import xml.etree.ElementTree as ET sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") # --------------------------------------------------------------------------- # Inline utilities diff --git a/.claude/skills/meta-edit/scripts/meta-edit.py b/.claude/skills/meta-edit/scripts/meta-edit.py index 8bda9f11..a80334ad 100644 --- a/.claude/skills/meta-edit/scripts/meta-edit.py +++ b/.claude/skills/meta-edit/scripts/meta-edit.py @@ -1972,6 +1972,7 @@ def save_xml(tree, path): def main(): sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") global xml_tree, xml_root, obj_element, obj_type, md_ns global properties_el, child_objects_el, obj_name global add_count, remove_count, modify_count, warn_count diff --git a/.claude/skills/meta-info/scripts/meta-info.py b/.claude/skills/meta-info/scripts/meta-info.py index 97fc87f7..09964ec2 100644 --- a/.claude/skills/meta-info/scripts/meta-info.py +++ b/.claude/skills/meta-info/scripts/meta-info.py @@ -8,6 +8,7 @@ import sys from lxml import etree sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") # ── arg parsing ────────────────────────────────────────────── diff --git a/.claude/skills/meta-remove/scripts/meta-remove.py b/.claude/skills/meta-remove/scripts/meta-remove.py index 479eb60a..c91ffdf6 100644 --- a/.claude/skills/meta-remove/scripts/meta-remove.py +++ b/.claude/skills/meta-remove/scripts/meta-remove.py @@ -107,6 +107,7 @@ def save_xml_bom(tree, path): def main(): sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") parser = argparse.ArgumentParser(description="Remove metadata object from 1C configuration dump", allow_abbrev=False) parser.add_argument("-ConfigDir", required=True) parser.add_argument("-Object", required=True) diff --git a/.claude/skills/meta-validate/scripts/meta-validate.py b/.claude/skills/meta-validate/scripts/meta-validate.py index 3b019b67..1b078c25 100644 --- a/.claude/skills/meta-validate/scripts/meta-validate.py +++ b/.claude/skills/meta-validate/scripts/meta-validate.py @@ -8,6 +8,7 @@ import sys from lxml import etree sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") # ── arg parsing ────────────────────────────────────────────── diff --git a/.claude/skills/mxl-compile/scripts/mxl-compile.py b/.claude/skills/mxl-compile/scripts/mxl-compile.py index 2ae4f7fe..9d21f256 100644 --- a/.claude/skills/mxl-compile/scripts/mxl-compile.py +++ b/.claude/skills/mxl-compile/scripts/mxl-compile.py @@ -20,6 +20,7 @@ def write_utf8_bom(path, content): def main(): sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") parser = argparse.ArgumentParser(description='Compile 1C spreadsheet from JSON', allow_abbrev=False) parser.add_argument('-JsonPath', type=str, required=True) parser.add_argument('-OutputPath', type=str, required=True) diff --git a/.claude/skills/mxl-decompile/scripts/mxl-decompile.py b/.claude/skills/mxl-decompile/scripts/mxl-decompile.py index 5859b9fd..481cc89c 100644 --- a/.claude/skills/mxl-decompile/scripts/mxl-decompile.py +++ b/.claude/skills/mxl-decompile/scripts/mxl-decompile.py @@ -45,6 +45,7 @@ def int_of(node, default=0): def main(): sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") parser = argparse.ArgumentParser(description="Decompile 1C spreadsheet to JSON", allow_abbrev=False) parser.add_argument("-TemplatePath", required=True, help="Path to Template.xml") parser.add_argument("-OutputPath", default=None, help="Output JSON path (stdout if omitted)") diff --git a/.claude/skills/mxl-info/scripts/mxl-info.py b/.claude/skills/mxl-info/scripts/mxl-info.py index 2bfd27d1..5aa28b57 100644 --- a/.claude/skills/mxl-info/scripts/mxl-info.py +++ b/.claude/skills/mxl-info/scripts/mxl-info.py @@ -10,6 +10,7 @@ import sys from lxml import etree sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") # --- Argument parsing --- parser = argparse.ArgumentParser(description="Analyze 1C spreadsheet (MXL) structure", allow_abbrev=False) diff --git a/.claude/skills/mxl-validate/scripts/mxl-validate.py b/.claude/skills/mxl-validate/scripts/mxl-validate.py index 957827ed..5af52c16 100644 --- a/.claude/skills/mxl-validate/scripts/mxl-validate.py +++ b/.claude/skills/mxl-validate/scripts/mxl-validate.py @@ -46,6 +46,7 @@ def int_text(node): def main(): sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") parser = argparse.ArgumentParser( description='Validate 1C spreadsheet document Template.xml', allow_abbrev=False ) diff --git a/.claude/skills/role-compile/scripts/role-compile.py b/.claude/skills/role-compile/scripts/role-compile.py index c49bc10a..99d15816 100644 --- a/.claude/skills/role-compile/scripts/role-compile.py +++ b/.claude/skills/role-compile/scripts/role-compile.py @@ -432,6 +432,7 @@ def parse_object_entry(entry): def main(): sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") parser = argparse.ArgumentParser(description='Compile 1C role from JSON', allow_abbrev=False) parser.add_argument('-JsonPath', type=str, required=True) parser.add_argument('-OutputDir', type=str, required=True) diff --git a/.claude/skills/role-info/scripts/role-info.py b/.claude/skills/role-info/scripts/role-info.py index 706117f8..e6c84d3a 100644 --- a/.claude/skills/role-info/scripts/role-info.py +++ b/.claude/skills/role-info/scripts/role-info.py @@ -9,6 +9,7 @@ from collections import OrderedDict from lxml import etree sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") # --- Argument parsing --- parser = argparse.ArgumentParser(description="Analyze 1C role rights", allow_abbrev=False) diff --git a/.claude/skills/role-validate/scripts/role-validate.py b/.claude/skills/role-validate/scripts/role-validate.py index b0ceda84..4755fbca 100644 --- a/.claude/skills/role-validate/scripts/role-validate.py +++ b/.claude/skills/role-validate/scripts/role-validate.py @@ -175,6 +175,7 @@ def get_child_el(parent, local_name, ns): def main(): sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") parser = argparse.ArgumentParser( description='Validate 1C role Rights.xml structure', allow_abbrev=False ) diff --git a/.claude/skills/skd-compile/scripts/skd-compile.py b/.claude/skills/skd-compile/scripts/skd-compile.py index 322a11d2..73052656 100644 --- a/.claude/skills/skd-compile/scripts/skd-compile.py +++ b/.claude/skills/skd-compile/scripts/skd-compile.py @@ -1318,6 +1318,7 @@ def emit_settings_variants(lines, defn): def main(): sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") parser = argparse.ArgumentParser(description='Compile 1C DCS from JSON', allow_abbrev=False) parser.add_argument('-DefinitionFile', type=str, default=None) parser.add_argument('-Value', type=str, default=None) diff --git a/.claude/skills/skd-edit/scripts/skd-edit.py b/.claude/skills/skd-edit/scripts/skd-edit.py index 35a45a3b..d4c2da5b 100644 --- a/.claude/skills/skd-edit/scripts/skd-edit.py +++ b/.claude/skills/skd-edit/scripts/skd-edit.py @@ -9,6 +9,7 @@ import uuid from lxml import etree sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") # ── arg parsing ────────────────────────────────────────────── diff --git a/.claude/skills/skd-info/scripts/skd-info.py b/.claude/skills/skd-info/scripts/skd-info.py index 695fe983..300a79cf 100644 --- a/.claude/skills/skd-info/scripts/skd-info.py +++ b/.claude/skills/skd-info/scripts/skd-info.py @@ -267,6 +267,7 @@ def build_structure_tree(item_node, prefix, is_last, out_lines): def main(): sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") parser = argparse.ArgumentParser(description="Analyze 1C DCS structure", allow_abbrev=False) parser.add_argument("-TemplatePath", required=True) parser.add_argument("-Mode", default="overview", diff --git a/.claude/skills/skd-validate/scripts/skd-validate.py b/.claude/skills/skd-validate/scripts/skd-validate.py index 86b550d1..b926f7eb 100644 --- a/.claude/skills/skd-validate/scripts/skd-validate.py +++ b/.claude/skills/skd-validate/scripts/skd-validate.py @@ -7,6 +7,7 @@ import sys from lxml import etree sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") # ── arg parsing ────────────────────────────────────────────── diff --git a/.claude/skills/subsystem-compile/scripts/subsystem-compile.py b/.claude/skills/subsystem-compile/scripts/subsystem-compile.py index 23f6664d..bf2c92fd 100644 --- a/.claude/skills/subsystem-compile/scripts/subsystem-compile.py +++ b/.claude/skills/subsystem-compile/scripts/subsystem-compile.py @@ -46,6 +46,7 @@ def split_camel_case(name): def main(): sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") parser = argparse.ArgumentParser(description='Compile 1C subsystem from JSON definition', allow_abbrev=False) parser.add_argument('-DefinitionFile', type=str, default=None) parser.add_argument('-Value', type=str, default=None) diff --git a/.claude/skills/subsystem-edit/scripts/subsystem-edit.py b/.claude/skills/subsystem-edit/scripts/subsystem-edit.py index 8cf1d9f7..bcc4f079 100644 --- a/.claude/skills/subsystem-edit/scripts/subsystem-edit.py +++ b/.claude/skills/subsystem-edit/scripts/subsystem-edit.py @@ -130,6 +130,7 @@ def save_xml_bom(tree, path): def main(): sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") parser = argparse.ArgumentParser(description="Edit existing 1C subsystem XML", allow_abbrev=False) parser.add_argument("-SubsystemPath", required=True) parser.add_argument("-DefinitionFile", default=None) diff --git a/.claude/skills/subsystem-info/scripts/subsystem-info.py b/.claude/skills/subsystem-info/scripts/subsystem-info.py index bde2447f..9f886908 100644 --- a/.claude/skills/subsystem-info/scripts/subsystem-info.py +++ b/.claude/skills/subsystem-info/scripts/subsystem-info.py @@ -10,6 +10,7 @@ from collections import OrderedDict from lxml import etree sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") # --- Argument parsing --- parser = argparse.ArgumentParser(description="Analyze 1C subsystem structure", allow_abbrev=False) diff --git a/.claude/skills/subsystem-validate/scripts/subsystem-validate.py b/.claude/skills/subsystem-validate/scripts/subsystem-validate.py index 2e4c7de6..dd5c80d0 100644 --- a/.claude/skills/subsystem-validate/scripts/subsystem-validate.py +++ b/.claude/skills/subsystem-validate/scripts/subsystem-validate.py @@ -62,6 +62,7 @@ def find_duplicates(items): def main(): sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") parser = argparse.ArgumentParser( description='Validate 1C subsystem XML structure', allow_abbrev=False ) diff --git a/.claude/skills/template-add/scripts/add-template.py b/.claude/skills/template-add/scripts/add-template.py index 9899a72e..462d1924 100644 --- a/.claude/skills/template-add/scripts/add-template.py +++ b/.claude/skills/template-add/scripts/add-template.py @@ -37,6 +37,7 @@ def write_text_with_bom(path, text): def main(): sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") parser = argparse.ArgumentParser(description="Add template to 1C object", allow_abbrev=False) parser.add_argument("-ObjectName", "-ProcessorName", required=True) parser.add_argument("-TemplateName", required=True) diff --git a/.claude/skills/template-remove/scripts/remove-template.py b/.claude/skills/template-remove/scripts/remove-template.py index 11819f02..bd241b0c 100644 --- a/.claude/skills/template-remove/scripts/remove-template.py +++ b/.claude/skills/template-remove/scripts/remove-template.py @@ -24,6 +24,7 @@ def save_xml_with_bom(tree, path): def main(): sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") parser = argparse.ArgumentParser(description="Remove template from 1C object", allow_abbrev=False) parser.add_argument("-ObjectName", "-ProcessorName", required=True) parser.add_argument("-TemplateName", required=True) diff --git a/.claude/skills/web-info/scripts/web-info.py b/.claude/skills/web-info/scripts/web-info.py index f6188624..78fcbf99 100644 --- a/.claude/skills/web-info/scripts/web-info.py +++ b/.claude/skills/web-info/scripts/web-info.py @@ -34,6 +34,7 @@ def get_httpd_by_exe(httpd_exe_norm): def main(): sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") parser = argparse.ArgumentParser(description='Apache & 1C publication status', allow_abbrev=False) parser.add_argument('-ApachePath', type=str, default='', help='Apache root (default: tools\\apache24)') args = parser.parse_args() diff --git a/.claude/skills/web-publish/scripts/web-publish.py b/.claude/skills/web-publish/scripts/web-publish.py index 08c56fee..55d55feb 100644 --- a/.claude/skills/web-publish/scripts/web-publish.py +++ b/.claude/skills/web-publish/scripts/web-publish.py @@ -61,6 +61,7 @@ def check_port_in_use(port): def main(): sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") parser = argparse.ArgumentParser(description='Publish 1C infobase via Apache', allow_abbrev=False) parser.add_argument('-V8Path', type=str, default='', help='Path to 1C platform bin directory (for wsap24.dll)') parser.add_argument('-InfoBasePath', type=str, default='', help='Path to file infobase') diff --git a/.claude/skills/web-stop/scripts/web-stop.py b/.claude/skills/web-stop/scripts/web-stop.py index 501a00b2..08182bb8 100644 --- a/.claude/skills/web-stop/scripts/web-stop.py +++ b/.claude/skills/web-stop/scripts/web-stop.py @@ -44,6 +44,7 @@ def get_all_httpd(): def main(): sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") parser = argparse.ArgumentParser(description='Stop Apache HTTP Server', allow_abbrev=False) parser.add_argument('-ApachePath', type=str, default='', help='Apache root (default: tools\\apache24)') args = parser.parse_args() diff --git a/.claude/skills/web-unpublish/scripts/web-unpublish.py b/.claude/skills/web-unpublish/scripts/web-unpublish.py index e9babb70..1aa4fd04 100644 --- a/.claude/skills/web-unpublish/scripts/web-unpublish.py +++ b/.claude/skills/web-unpublish/scripts/web-unpublish.py @@ -37,6 +37,7 @@ def get_our_httpd(httpd_exe_norm): def main(): sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") parser = argparse.ArgumentParser(description='Remove 1C web publication', allow_abbrev=False) parser.add_argument('-AppName', type=str, default='', help='Publication name') parser.add_argument('-ApachePath', type=str, default='', help='Apache root (default: tools\\apache24)')