diff --git a/config/external-sources.lock.json b/config/external-sources.lock.json index 8603325c5..93fa226c2 100644 --- a/config/external-sources.lock.json +++ b/config/external-sources.lock.json @@ -15,8 +15,8 @@ "repo": "https://github.com/Yeachan-Heo/oh-my-codex.git", "ref": "main", "adapter": "codex-plugin", - "commit": "e9e3bcc720d964d3673cadb8136394ac103cc091", - "syncedAt": "2026-06-25T16:00:00Z" + "commit": "d96b698c5f2fabc85c890f7b8fcdc6e02f253ec7", + "syncedAt": "2026-06-27T16:00:00Z" }, { "id": "ui-ux-pro-max", @@ -24,8 +24,8 @@ "repo": "https://github.com/nextlevelbuilder/ui-ux-pro-max-skill.git", "ref": "main", "adapter": "claude-skill", - "commit": "9fd25fe07e46ae444edc356e62fe913347ab9e23", - "syncedAt": "2026-06-26T15:59:59Z" + "commit": "65e23199492fa911af32d9078e627ab4de01f4c8", + "syncedAt": "2026-06-27T16:00:00Z" }, { "id": "shadcn", @@ -33,8 +33,8 @@ "repo": "https://github.com/shadcn-ui/ui.git", "ref": "main", "adapter": "claude-skill", - "commit": "c520191cd4c36760ed425b650e139fe6d7e29038", - "syncedAt": "2026-06-26T15:59:59Z" + "commit": "a72491cb9b5f9471392fdc179bbb61739e37ec72", + "syncedAt": "2026-06-27T16:00:00Z" }, { "id": "frontend-slides", @@ -69,8 +69,8 @@ "repo": "https://github.com/hugohe3/ppt-master.git", "ref": "main", "adapter": "claude-skill", - "commit": "47f5051845777839ec29e8d67dd12ae68671854a", - "syncedAt": "2026-06-26T15:59:59Z" + "commit": "13a25616e6354fe5abe16f41da18f532e51ac644", + "syncedAt": "2026-06-27T16:00:00Z" }, { "id": "next-skills", @@ -78,8 +78,8 @@ "repo": "https://github.com/vercel/next.js.git", "ref": "canary", "adapter": "skill-collection", - "commit": "6c22d02ce0c1ba3b8773b314756f388d8f7cbd1a", - "syncedAt": "2026-06-26T15:59:59Z" + "commit": "4b164d765e16de0b277960a27d3938815ac03b97", + "syncedAt": "2026-06-27T16:00:00Z" } ] } diff --git a/plugins/codex/plugins/mcp-playwright/MCP_SOURCE.json b/plugins/codex/plugins/mcp-playwright/MCP_SOURCE.json index 1c052ab74..a8f244e3d 100644 --- a/plugins/codex/plugins/mcp-playwright/MCP_SOURCE.json +++ b/plugins/codex/plugins/mcp-playwright/MCP_SOURCE.json @@ -3,5 +3,5 @@ "name": "playwright浏览器自动化操作", "version": "20260605", "keySource": "none", - "syncedAt": "2026-06-26T16:01:08Z" + "syncedAt": "2026-06-27T16:01:26Z" } diff --git a/plugins/codex/plugins/next-skills/THIRD_PARTY_SOURCE.json b/plugins/codex/plugins/next-skills/THIRD_PARTY_SOURCE.json index 66606328a..a973d4d5f 100644 --- a/plugins/codex/plugins/next-skills/THIRD_PARTY_SOURCE.json +++ b/plugins/codex/plugins/next-skills/THIRD_PARTY_SOURCE.json @@ -2,8 +2,8 @@ "sourceId": "next-skills", "repo": "https://github.com/vercel/next.js.git", "ref": "canary", - "commit": "6c22d02ce0c1ba3b8773b314756f388d8f7cbd1a", + "commit": "4b164d765e16de0b277960a27d3938815ac03b97", "adapter": "skill-collection", "sourcePath": "skills", - "syncedAt": "2026-06-26T15:59:59Z" + "syncedAt": "2026-06-27T16:00:00Z" } diff --git a/plugins/codex/plugins/next-skills/skills/next-dev-loop/SKILL.md b/plugins/codex/plugins/next-skills/skills/next-dev-loop/SKILL.md index 3b7da255a..4afb77760 100644 --- a/plugins/codex/plugins/next-skills/skills/next-dev-loop/SKILL.md +++ b/plugins/codex/plugins/next-skills/skills/next-dev-loop/SKILL.md @@ -27,7 +27,7 @@ The two views cross-check each other. - Next.js **16.3+** with **Turbopack** — `/_next/mcp` plus the proactive compile check via `get_compilation_issues`. -- `agent-browser` **>= 0.31.0** — React introspection, worktree-scoped +- `agent-browser` **>= 0.31.1** — React introspection, worktree-scoped `session id`, idempotent `--restore`, and launch flag reconciliation. These are hard floors, not soft preferences. If anything is missing, diff --git a/plugins/codex/plugins/oh-my-codex/.codex-plugin/plugin.json b/plugins/codex/plugins/oh-my-codex/.codex-plugin/plugin.json index fb6654ac5..14104b48a 100644 --- a/plugins/codex/plugins/oh-my-codex/.codex-plugin/plugin.json +++ b/plugins/codex/plugins/oh-my-codex/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "oh-my-codex", - "version": "0.18.15", + "version": "0.18.16", "description": "oh-my-codex 是 Codex CLI 的多 Agent 编排、结构化工作流、插件级 hooks、MCP 和 HUD 扩展插件。", "author": { "name": "Yeachan Heo", diff --git a/plugins/codex/plugins/oh-my-codex/THIRD_PARTY_SOURCE.json b/plugins/codex/plugins/oh-my-codex/THIRD_PARTY_SOURCE.json index 188ba52fb..ea26718b3 100644 --- a/plugins/codex/plugins/oh-my-codex/THIRD_PARTY_SOURCE.json +++ b/plugins/codex/plugins/oh-my-codex/THIRD_PARTY_SOURCE.json @@ -2,8 +2,8 @@ "sourceId": "oh-my-codex", "repo": "https://github.com/Yeachan-Heo/oh-my-codex.git", "ref": "main", - "commit": "e9e3bcc720d964d3673cadb8136394ac103cc091", + "commit": "d96b698c5f2fabc85c890f7b8fcdc6e02f253ec7", "adapter": "codex-plugin", "sourcePath": "plugins/oh-my-codex", - "syncedAt": "2026-06-25T16:00:00Z" + "syncedAt": "2026-06-27T16:00:00Z" } diff --git a/plugins/codex/plugins/ppt-master/README.md b/plugins/codex/plugins/ppt-master/README.md index 8b56895e5..4b60912e2 100644 --- a/plugins/codex/plugins/ppt-master/README.md +++ b/plugins/codex/plugins/ppt-master/README.md @@ -201,7 +201,7 @@ PPT Master runs in **any tool with agent capability** — read/write files, exec > **Model recommendation**: for the best results, use **Claude Opus** with `gpt-image-2`; **Gemini 3.5 Flash** currently offers great overall value for money — notably fast and well worth a try. -**🔑 Want to use Claude / GPT / Gemini but don't have access yet?** Project sponsors **[PackyCode](https://www.packyapi.com/register?aff=ppt-master)**, **[APIKEY.FUN](https://apikey.fun/register?aff=PPT-MASTER)** and **[RunAPI](https://runapi.co/register?aff=WMLJ)** can help — all offer pay-as-you-go access to Claude, GPT, Gemini and more, no subscription required. **PackyCode**: 10% off with promo code **`ppt-master`** at top-up. **APIKEY.FUN**: prices as low as **7% of official rates**; register via our link for an exclusive permanent discount of up to 5% on top-ups. **RunAPI**: 150+ models via one API Key at prices as low as **10% of official rates**; register and contact an administrator to claim **¥7 in free credit**. +**🔑 Want to use Claude / GPT / Gemini but don't have access yet?** Project sponsors **[PackyCode](https://www.packyapi.com/register?aff=ppt-master)**, **[APIKEY.FUN](https://apikey.fun/register?aff=PPT-MASTER)** and **[RunAPI](https://runapi.co/register?aff=WMLJ)** offer pay-as-you-go access to Claude, GPT, Gemini and more — no subscription required, with exclusive discounts for our users (details at the top of this page). **🔀 Juggling several providers?** Once you hold keys from more than one of them, [cc-switch](https://github.com/farion1231/cc-switch) — a cross-platform desktop app — lets you one-click switch API providers for Claude Code, Codex, Gemini CLI and more, no manual config editing. diff --git a/plugins/codex/plugins/ppt-master/THIRD_PARTY_SOURCE.json b/plugins/codex/plugins/ppt-master/THIRD_PARTY_SOURCE.json index 7c7eadaa1..2007aabc2 100644 --- a/plugins/codex/plugins/ppt-master/THIRD_PARTY_SOURCE.json +++ b/plugins/codex/plugins/ppt-master/THIRD_PARTY_SOURCE.json @@ -2,8 +2,8 @@ "sourceId": "ppt-master", "repo": "https://github.com/hugohe3/ppt-master.git", "ref": "main", - "commit": "47f5051845777839ec29e8d67dd12ae68671854a", + "commit": "13a25616e6354fe5abe16f41da18f532e51ac644", "adapter": "claude-skill", "sourcePath": "skills/ppt-master", - "syncedAt": "2026-06-26T15:59:59Z" + "syncedAt": "2026-06-27T16:00:00Z" } diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/template-designer.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/template-designer.md index d2c672227..165ceefe4 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/template-designer.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/template-designer.md @@ -372,7 +372,7 @@ templates/ │ └── pixel_retro/ # Pixel retro / cyberpunk structure (no identity) └── decks/ ├── 招商银行/ # China Merchants Bank full PPT replica - └── 中国电建_常规/ # PowerChina full PPT replica + └── 中国电建/ # PowerChina full PPT replica ``` --- diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/analyze_images.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/analyze_images.py index 4b083d359..d8fa50886 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/analyze_images.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/analyze_images.py @@ -28,6 +28,10 @@ import os import sys from pathlib import Path +from console_encoding import configure_utf8_stdio + +configure_utf8_stdio() + try: from PIL import Image except ImportError: diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/animation_config.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/animation_config.py index 9dd0ab22d..b3a088473 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/animation_config.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/animation_config.py @@ -28,6 +28,7 @@ _SCRIPTS_DIR = Path(__file__).resolve().parent if str(_SCRIPTS_DIR) not in sys.path: sys.path.insert(0, str(_SCRIPTS_DIR)) +from console_encoding import configure_utf8_stdio # noqa: E402 from svg_to_pptx.animation_config import ( # noqa: E402 build_group_listing, load_animation_config, @@ -35,6 +36,8 @@ from svg_to_pptx.animation_config import ( # noqa: E402 write_scaffold, ) +configure_utf8_stdio() + def build_parser() -> argparse.ArgumentParser: parser = argparse.ArgumentParser( diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/batch_validate.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/batch_validate.py index 421a63ef7..2f83c8cb8 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/batch_validate.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/batch_validate.py @@ -16,6 +16,10 @@ import sys from collections import defaultdict from pathlib import Path +from console_encoding import configure_utf8_stdio + +configure_utf8_stdio() + try: from project_utils import ( find_all_projects, diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/beautify_identity.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/beautify_identity.py index d203f2390..b5aaac009 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/beautify_identity.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/beautify_identity.py @@ -38,10 +38,13 @@ _SCRIPTS_DIR = Path(__file__).resolve().parent if str(_SCRIPTS_DIR) not in sys.path: sys.path.insert(0, str(_SCRIPTS_DIR)) +from console_encoding import configure_utf8_stdio # noqa: E402 from pptx_to_svg.color_resolver import ColorPalette # noqa: E402 from pptx_to_svg.emu_units import NS # noqa: E402 from pptx_to_svg.ooxml_loader import OoxmlPackage # noqa: E402 +configure_utf8_stdio() + def _font_pair(theme_root, font_tag: str) -> dict[str, str]: """Read one / into {latin, ea} (skip empties).""" diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/beautify_inventory.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/beautify_inventory.py index d9524cab9..025b0d3ad 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/beautify_inventory.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/beautify_inventory.py @@ -30,6 +30,10 @@ import sys from pathlib import Path from typing import Optional +from console_encoding import configure_utf8_stdio + +configure_utf8_stdio() + def _images_by_slide(manifest: list) -> dict[int, list[dict]]: """Map slide_index -> [image entries on that slide], from ppt_to_md occurrences.""" diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/check_annotations.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/check_annotations.py index d00ba3473..c9599457f 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/check_annotations.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/check_annotations.py @@ -23,6 +23,10 @@ import xml.etree.ElementTree as ET from pathlib import Path from typing import Optional +from console_encoding import configure_utf8_stdio + +configure_utf8_stdio() + def scan_svg_file(svg_path: Path) -> list[dict]: """Scan a single SVG file for edit annotations.""" diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/config.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/config.py index 73c97608c..a3a8f3ee2 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/config.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/config.py @@ -20,6 +20,10 @@ import os from pathlib import Path from typing import Dict, List, Optional, Any +from console_encoding import configure_utf8_stdio + +configure_utf8_stdio() + # ============================================================ # Path Configuration diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/confirm_ui/server.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/confirm_ui/server.py index bf36e96ad..b6f4c5221 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/confirm_ui/server.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/confirm_ui/server.py @@ -50,6 +50,7 @@ _SCRIPTS_DIR = Path(__file__).resolve().parent.parent if str(_SCRIPTS_DIR) not in sys.path: sys.path.insert(0, str(_SCRIPTS_DIR)) +from console_encoding import configure_utf8_stdio # noqa: E402 from server_common import ( # noqa: E402 claim_lock as _claim_lock, find_free_port as _find_free_port, @@ -58,6 +59,8 @@ from server_common import ( # noqa: E402 release_lock as _release_lock, ) +configure_utf8_stdio() + logger = logging.getLogger('confirm_ui') # Per-project lock file. Lives at /.confirm_ui.lock and matches diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/console_encoding.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/console_encoding.py new file mode 100644 index 000000000..0d2dd9bf1 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/console_encoding.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python3 +"""Console encoding helpers for PPT Master CLI scripts.""" + +from __future__ import annotations + +import io +import sys +from typing import TextIO + + +def _reconfigure_stream(stream: TextIO) -> TextIO: + try: + stream.reconfigure(encoding="utf-8", errors="replace") + return stream + except AttributeError: + buffer = getattr(stream, "buffer", None) + if buffer is None: + return stream + return io.TextIOWrapper(buffer, encoding="utf-8", errors="replace") + except (OSError, ValueError): + return stream + + +def configure_utf8_stdio() -> None: + """Use UTF-8 for CLI stdout/stderr, including Windows non-UTF-8 locales.""" + sys.stdout = _reconfigure_stream(sys.stdout) + sys.stderr = _reconfigure_stream(sys.stderr) diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/error_helper.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/error_helper.py index 2046b9a44..b04560a77 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/error_helper.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/error_helper.py @@ -8,6 +8,10 @@ Provides user-friendly error messages and specific fix suggestions. import argparse from typing import Dict, List, Optional +from console_encoding import configure_utf8_stdio + +configure_utf8_stdio() + class ErrorHelper: """Error message helper.""" diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/extract_svg_assets.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/extract_svg_assets.py index 2f97e09fe..13717c35c 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/extract_svg_assets.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/extract_svg_assets.py @@ -37,6 +37,10 @@ from pathlib import Path from typing import Optional from xml.etree import ElementTree as ET +from console_encoding import configure_utf8_stdio + +configure_utf8_stdio() + SVG_NS = "http://www.w3.org/2000/svg" DRAWABLE = {"path", "polygon", "polyline", "rect", "circle", "ellipse", "line"} SEMANTIC_CONTENT = {"text", "tspan", "foreignObject"} diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/finalize_svg.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/finalize_svg.py index 293063687..e7ca8111c 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/finalize_svg.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/finalize_svg.py @@ -39,6 +39,10 @@ import shutil import argparse from pathlib import Path +from console_encoding import configure_utf8_stdio + +configure_utf8_stdio() + # Import finalize helpers from the internal package. sys.path.insert(0, str(Path(__file__).parent)) from svg_finalize.align_embed_images import ( diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/gemini_watermark_remover.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/gemini_watermark_remover.py index e2f502e8e..fe9ef0946 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/gemini_watermark_remover.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/gemini_watermark_remover.py @@ -26,12 +26,16 @@ import sys import argparse from pathlib import Path -import numpy as np -from PIL import Image - # Import modules from the same directory sys.path.insert(0, str(Path(__file__).parent)) +from console_encoding import configure_utf8_stdio + +configure_utf8_stdio() + +import numpy as np +from PIL import Image + # Algorithm parameters ALPHA_THRESHOLD = 0.002 # Alpha threshold; values below this are not processed MAX_ALPHA = 0.99 # Maximum alpha value to prevent division by zero diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/generate_examples_index.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/generate_examples_index.py index e79428520..0ac28d25c 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/generate_examples_index.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/generate_examples_index.py @@ -14,6 +14,10 @@ from pathlib import Path from datetime import datetime from collections import defaultdict +from console_encoding import configure_utf8_stdio + +configure_utf8_stdio() + try: from project_utils import find_all_projects, get_project_info, CANVAS_FORMATS except ImportError: diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/icon_sync.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/icon_sync.py index db8de6c71..2b88b1985 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/icon_sync.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/icon_sync.py @@ -33,6 +33,10 @@ import sys from pathlib import Path from typing import Optional +from console_encoding import configure_utf8_stdio + +configure_utf8_stdio() + _LIB_ALIASES = {"chunk": "chunk-filled"} _GLOBAL_ICONS_DIR = Path(__file__).resolve().parent.parent / "templates" / "icons" diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_bfl.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_bfl.py index c07c28649..d553365b9 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_bfl.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_bfl.py @@ -9,6 +9,15 @@ Configuration keys: """ import sys +from pathlib import Path + +_SCRIPTS_DIR = Path(__file__).resolve().parents[1] +if str(_SCRIPTS_DIR) not in sys.path: + sys.path.insert(0, str(_SCRIPTS_DIR)) + +from console_encoding import configure_utf8_stdio # noqa: E402 + +configure_utf8_stdio() if __name__ == "__main__": print(__doc__) diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_common.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_common.py index ce6392ac0..f34a47c91 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_common.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_common.py @@ -4,6 +4,15 @@ Shared helpers for image generation backends. """ import sys +from pathlib import Path + +_SCRIPTS_DIR = Path(__file__).resolve().parents[1] +if str(_SCRIPTS_DIR) not in sys.path: + sys.path.insert(0, str(_SCRIPTS_DIR)) + +from console_encoding import configure_utf8_stdio # noqa: E402 + +configure_utf8_stdio() if __name__ == "__main__": print(__doc__) diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_fal.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_fal.py index cde523b25..0551960ff 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_fal.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_fal.py @@ -9,6 +9,15 @@ Configuration keys: """ import sys +from pathlib import Path + +_SCRIPTS_DIR = Path(__file__).resolve().parents[1] +if str(_SCRIPTS_DIR) not in sys.path: + sys.path.insert(0, str(_SCRIPTS_DIR)) + +from console_encoding import configure_utf8_stdio # noqa: E402 + +configure_utf8_stdio() if __name__ == "__main__": print(__doc__) diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_gemini.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_gemini.py index 139087a2b..3f56e8bc5 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_gemini.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_gemini.py @@ -15,6 +15,15 @@ Dependencies: """ import sys +from pathlib import Path + +_SCRIPTS_DIR = Path(__file__).resolve().parents[1] +if str(_SCRIPTS_DIR) not in sys.path: + sys.path.insert(0, str(_SCRIPTS_DIR)) + +from console_encoding import configure_utf8_stdio # noqa: E402 + +configure_utf8_stdio() if __name__ == "__main__": print(__doc__) diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_ideogram.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_ideogram.py index 09d54883e..189d54013 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_ideogram.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_ideogram.py @@ -9,6 +9,15 @@ Configuration keys: """ import sys +from pathlib import Path + +_SCRIPTS_DIR = Path(__file__).resolve().parents[1] +if str(_SCRIPTS_DIR) not in sys.path: + sys.path.insert(0, str(_SCRIPTS_DIR)) + +from console_encoding import configure_utf8_stdio # noqa: E402 + +configure_utf8_stdio() if __name__ == "__main__": print(__doc__) diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_minimax.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_minimax.py index 5b20b31cb..ea5bf6b21 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_minimax.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_minimax.py @@ -9,6 +9,15 @@ Configuration keys: """ import sys +from pathlib import Path + +_SCRIPTS_DIR = Path(__file__).resolve().parents[1] +if str(_SCRIPTS_DIR) not in sys.path: + sys.path.insert(0, str(_SCRIPTS_DIR)) + +from console_encoding import configure_utf8_stdio # noqa: E402 + +configure_utf8_stdio() if __name__ == "__main__": print(__doc__) diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_openai.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_openai.py index 4a9213baa..e0616ad6e 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_openai.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_openai.py @@ -22,6 +22,15 @@ Dependencies: """ import sys +from pathlib import Path + +_SCRIPTS_DIR = Path(__file__).resolve().parents[1] +if str(_SCRIPTS_DIR) not in sys.path: + sys.path.insert(0, str(_SCRIPTS_DIR)) + +from console_encoding import configure_utf8_stdio # noqa: E402 + +configure_utf8_stdio() if __name__ == "__main__": print(__doc__) diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_openrouter.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_openrouter.py index 4e029aefc..ce685f955 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_openrouter.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_openrouter.py @@ -9,6 +9,15 @@ Configuration keys: """ import sys +from pathlib import Path + +_SCRIPTS_DIR = Path(__file__).resolve().parents[1] +if str(_SCRIPTS_DIR) not in sys.path: + sys.path.insert(0, str(_SCRIPTS_DIR)) + +from console_encoding import configure_utf8_stdio # noqa: E402 + +configure_utf8_stdio() if __name__ == "__main__": print(__doc__) diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_qwen.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_qwen.py index 96dd7be52..7c4e19dc5 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_qwen.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_qwen.py @@ -9,6 +9,15 @@ Configuration keys: """ import sys +from pathlib import Path + +_SCRIPTS_DIR = Path(__file__).resolve().parents[1] +if str(_SCRIPTS_DIR) not in sys.path: + sys.path.insert(0, str(_SCRIPTS_DIR)) + +from console_encoding import configure_utf8_stdio # noqa: E402 + +configure_utf8_stdio() if __name__ == "__main__": print(__doc__) diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_replicate.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_replicate.py index c355f6bf4..00704cb5e 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_replicate.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_replicate.py @@ -9,6 +9,15 @@ Configuration keys: """ import sys +from pathlib import Path + +_SCRIPTS_DIR = Path(__file__).resolve().parents[1] +if str(_SCRIPTS_DIR) not in sys.path: + sys.path.insert(0, str(_SCRIPTS_DIR)) + +from console_encoding import configure_utf8_stdio # noqa: E402 + +configure_utf8_stdio() if __name__ == "__main__": print(__doc__) diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_siliconflow.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_siliconflow.py index 96dd8407b..6cf4f3340 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_siliconflow.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_siliconflow.py @@ -9,6 +9,15 @@ Configuration keys: """ import sys +from pathlib import Path + +_SCRIPTS_DIR = Path(__file__).resolve().parents[1] +if str(_SCRIPTS_DIR) not in sys.path: + sys.path.insert(0, str(_SCRIPTS_DIR)) + +from console_encoding import configure_utf8_stdio # noqa: E402 + +configure_utf8_stdio() if __name__ == "__main__": print(__doc__) diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_stability.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_stability.py index 64b592420..8bb80bc9c 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_stability.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_stability.py @@ -9,6 +9,15 @@ Configuration keys: """ import sys +from pathlib import Path + +_SCRIPTS_DIR = Path(__file__).resolve().parents[1] +if str(_SCRIPTS_DIR) not in sys.path: + sys.path.insert(0, str(_SCRIPTS_DIR)) + +from console_encoding import configure_utf8_stdio # noqa: E402 + +configure_utf8_stdio() if __name__ == "__main__": print(__doc__) diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_volcengine.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_volcengine.py index 3b437d96d..3a82966cf 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_volcengine.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_volcengine.py @@ -9,6 +9,15 @@ Configuration keys: """ import sys +from pathlib import Path + +_SCRIPTS_DIR = Path(__file__).resolve().parents[1] +if str(_SCRIPTS_DIR) not in sys.path: + sys.path.insert(0, str(_SCRIPTS_DIR)) + +from console_encoding import configure_utf8_stdio # noqa: E402 + +configure_utf8_stdio() if __name__ == "__main__": print(__doc__) diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_zhipu.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_zhipu.py index e0cec5396..7b16671bd 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_zhipu.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_backends/backend_zhipu.py @@ -9,6 +9,15 @@ Configuration keys: """ import sys +from pathlib import Path + +_SCRIPTS_DIR = Path(__file__).resolve().parents[1] +if str(_SCRIPTS_DIR) not in sys.path: + sys.path.insert(0, str(_SCRIPTS_DIR)) + +from console_encoding import configure_utf8_stdio # noqa: E402 + +configure_utf8_stdio() if __name__ == "__main__": print(__doc__) diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_gen.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_gen.py index 0fe263a2a..919bcd43a 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_gen.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_gen.py @@ -53,8 +53,11 @@ import threading import time from pathlib import Path +from console_encoding import configure_utf8_stdio from config import load_prefixed_env_file, resolve_env_path +configure_utf8_stdio() + ENV_PATH = resolve_env_path() IMAGE_ENV_PREFIXES = ( "IMAGE_", diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_search.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_search.py index 29217d8e7..c4d6785db 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_search.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_search.py @@ -57,6 +57,7 @@ _SCRIPTS_DIR = Path(__file__).resolve().parent if str(_SCRIPTS_DIR) not in sys.path: sys.path.insert(0, str(_SCRIPTS_DIR)) +from console_encoding import configure_utf8_stdio # noqa: E402 from config import load_prefixed_env_file # noqa: E402 from image_backends.backend_common import download_image # noqa: E402 from image_sources.provider_common import ( # noqa: E402 @@ -68,6 +69,8 @@ from image_sources.provider_common import ( # noqa: E402 score_candidate, ) +configure_utf8_stdio() + # --------------------------------------------------------------------------- # Provider registry diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_sources/provider_common.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_sources/provider_common.py index c63cef993..5acb3ff5b 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_sources/provider_common.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_sources/provider_common.py @@ -17,6 +17,15 @@ the corresponding provider_.py module and only imports from here. from __future__ import annotations import sys +from pathlib import Path + +_SCRIPTS_DIR = Path(__file__).resolve().parents[1] +if str(_SCRIPTS_DIR) not in sys.path: + sys.path.insert(0, str(_SCRIPTS_DIR)) + +from console_encoding import configure_utf8_stdio # noqa: E402 + +configure_utf8_stdio() if __name__ == "__main__": print(__doc__) @@ -25,7 +34,6 @@ if __name__ == "__main__": import re from dataclasses import dataclass, field -from pathlib import Path from typing import Any, Optional diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_sources/provider_openverse.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_sources/provider_openverse.py index 2e03523b5..bcf7575f0 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_sources/provider_openverse.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_sources/provider_openverse.py @@ -9,6 +9,15 @@ API docs: https://api.openverse.org/v1/ from __future__ import annotations import sys +from pathlib import Path + +_SCRIPTS_DIR = Path(__file__).resolve().parents[1] +if str(_SCRIPTS_DIR) not in sys.path: + sys.path.insert(0, str(_SCRIPTS_DIR)) + +from console_encoding import configure_utf8_stdio # noqa: E402 + +configure_utf8_stdio() if __name__ == "__main__": print(__doc__) diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_sources/provider_pexels.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_sources/provider_pexels.py index 353408b45..e48dbf856 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_sources/provider_pexels.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_sources/provider_pexels.py @@ -10,6 +10,15 @@ API docs: https://www.pexels.com/api/documentation/ from __future__ import annotations import sys +from pathlib import Path + +_SCRIPTS_DIR = Path(__file__).resolve().parents[1] +if str(_SCRIPTS_DIR) not in sys.path: + sys.path.insert(0, str(_SCRIPTS_DIR)) + +from console_encoding import configure_utf8_stdio # noqa: E402 + +configure_utf8_stdio() if __name__ == "__main__": print(__doc__) diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_sources/provider_pixabay.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_sources/provider_pixabay.py index 47c97ba39..5feb99911 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_sources/provider_pixabay.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_sources/provider_pixabay.py @@ -10,6 +10,15 @@ API docs: https://pixabay.com/api/docs/ from __future__ import annotations import sys +from pathlib import Path + +_SCRIPTS_DIR = Path(__file__).resolve().parents[1] +if str(_SCRIPTS_DIR) not in sys.path: + sys.path.insert(0, str(_SCRIPTS_DIR)) + +from console_encoding import configure_utf8_stdio # noqa: E402 + +configure_utf8_stdio() if __name__ == "__main__": print(__doc__) diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_sources/provider_wikimedia.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_sources/provider_wikimedia.py index 03debe8c7..d3d6ddffc 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_sources/provider_wikimedia.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/image_sources/provider_wikimedia.py @@ -13,6 +13,15 @@ API docs: https://www.mediawiki.org/wiki/API:Search from __future__ import annotations import sys +from pathlib import Path + +_SCRIPTS_DIR = Path(__file__).resolve().parents[1] +if str(_SCRIPTS_DIR) not in sys.path: + sys.path.insert(0, str(_SCRIPTS_DIR)) + +from console_encoding import configure_utf8_stdio # noqa: E402 + +configure_utf8_stdio() if __name__ == "__main__": print(__doc__) diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/latex_render.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/latex_render.py index 383afbcb1..150d49740 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/latex_render.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/latex_render.py @@ -32,12 +32,17 @@ import urllib.request from pathlib import Path from typing import Any +from console_encoding import configure_utf8_stdio + try: from PIL import Image except ImportError: Image = None +configure_utf8_stdio() + + DEFAULT_DPI = 300 DEFAULT_TRANSPARENT_TOLERANCE = 12 DEFAULT_MANIFEST = "images/formula_manifest.json" diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/native_enhance_pptx.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/native_enhance_pptx.py index 9f9bfc75b..4e748f353 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/native_enhance_pptx.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/native_enhance_pptx.py @@ -30,8 +30,11 @@ _SCRIPTS_DIR = Path(__file__).resolve().parent if str(_SCRIPTS_DIR) not in sys.path: sys.path.insert(0, str(_SCRIPTS_DIR)) +from console_encoding import configure_utf8_stdio # noqa: E402 from native_narration_pptx import main # noqa: E402 +configure_utf8_stdio() + if __name__ == "__main__": raise SystemExit(main()) diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/native_narration_pptx.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/native_narration_pptx.py index a6a22a5dc..f9169934a 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/native_narration_pptx.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/native_narration_pptx.py @@ -41,6 +41,7 @@ _SCRIPTS_DIR = Path(__file__).resolve().parent if str(_SCRIPTS_DIR) not in sys.path: sys.path.insert(0, str(_SCRIPTS_DIR)) +from console_encoding import configure_utf8_stdio # noqa: E402 from pptx_animations import TRANSITIONS, create_transition_xml # noqa: E402 from svg_to_pptx.pptx_builder import ( # noqa: E402 _add_default_content_type, @@ -65,6 +66,8 @@ from svg_to_pptx.pptx_notes import ( # noqa: E402 markdown_to_plain_text, ) +configure_utf8_stdio() + PROJECT_SCHEMA = "native_pptx_enhancement_project.v1" LEGACY_PROJECT_SCHEMAS = {"native_narration_pptx_project.v1"} diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/notes_to_audio.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/notes_to_audio.py index b10462fb7..0b46e5fe1 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/notes_to_audio.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/notes_to_audio.py @@ -30,6 +30,7 @@ import sys from dataclasses import dataclass from pathlib import Path +from console_encoding import configure_utf8_stdio from config import load_prefixed_env_file from tts_backends import ( backend_cosyvoice, @@ -39,6 +40,8 @@ from tts_backends import ( backend_qwen, ) +configure_utf8_stdio() + @dataclass(frozen=True) class AudioBackend: diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/pptx_animations.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/pptx_animations.py index e03533ef2..565f5d688 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/pptx_animations.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/pptx_animations.py @@ -42,6 +42,10 @@ Usage: import argparse from typing import Optional, Dict, Any +from console_encoding import configure_utf8_stdio + +configure_utf8_stdio() + # ============================================================================ # Transition effect definitions diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/pptx_intake.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/pptx_intake.py index 58e7a4682..6217a8dd9 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/pptx_intake.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/pptx_intake.py @@ -29,9 +29,12 @@ _SCRIPTS_DIR = Path(__file__).resolve().parent if str(_SCRIPTS_DIR) not in sys.path: sys.path.insert(0, str(_SCRIPTS_DIR)) +from console_encoding import configure_utf8_stdio # noqa: E402 from beautify_identity import extract_identity # noqa: E402 from template_fill_pptx.analyzer import analyze_pptx # noqa: E402 +configure_utf8_stdio() + def _write_json(path: Path, payload: dict[str, Any]) -> None: path.parent.mkdir(parents=True, exist_ok=True) diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/pptx_template_import.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/pptx_template_import.py index b7f9a900f..59d9295d3 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/pptx_template_import.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/pptx_template_import.py @@ -22,8 +22,11 @@ import argparse import json from pathlib import Path +from console_encoding import configure_utf8_stdio from template_import.manifest import build_manifest +configure_utf8_stdio() + def parse_args() -> argparse.Namespace: """Build the CLI argument parser for the import entry point.""" diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/pptx_to_svg.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/pptx_to_svg.py index 211507d0f..b1db79cfa 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/pptx_to_svg.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/pptx_to_svg.py @@ -30,9 +30,12 @@ from pathlib import Path # Allow running this script from anywhere sys.path.insert(0, str(Path(__file__).resolve().parent)) +from console_encoding import configure_utf8_stdio from pptx_to_svg import convert_pptx_to_svg from pptx_to_svg.converter import ConvertOptions +configure_utf8_stdio() + def parse_args() -> argparse.Namespace: parser = argparse.ArgumentParser( diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/project_manager.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/project_manager.py index e54d8c9be..16130091d 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/project_manager.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/project_manager.py @@ -13,6 +13,7 @@ from __future__ import annotations import argparse import filecmp import json +import os import re import shutil import subprocess @@ -21,6 +22,8 @@ from datetime import datetime from pathlib import Path from urllib.parse import urlparse +from console_encoding import configure_utf8_stdio + try: from project_utils import ( CANVAS_FORMATS, @@ -65,6 +68,9 @@ IMAGE_ASSET_SUFFIXES = { } +configure_utf8_stdio() + + def _curl_cffi_available() -> bool: """Return whether curl_cffi is importable (enables Python TLS impersonation).""" try: @@ -233,6 +239,9 @@ class ProjectManager: return destination def _run_tool(self, args: list[str]) -> None: + child_env = os.environ.copy() + child_env["PYTHONUTF8"] = "1" + child_env["PYTHONIOENCODING"] = "utf-8:replace" try: result = subprocess.run( args, @@ -242,6 +251,7 @@ class ProjectManager: text=True, encoding="utf-8", errors="replace", + env=child_env, ) except FileNotFoundError as exc: raise RuntimeError(f"Missing executable: {args[0]}") from exc diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/project_utils.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/project_utils.py index f85d7472b..e514abf04 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/project_utils.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/project_utils.py @@ -12,6 +12,10 @@ from pathlib import Path from datetime import datetime from typing import Dict, List, Optional, Tuple +from console_encoding import configure_utf8_stdio + +configure_utf8_stdio() + # Canvas format definitions (unified source) try: from config import CANVAS_FORMATS diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/register_template.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/register_template.py index 0639e692d..0431f1167 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/register_template.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/register_template.py @@ -39,12 +39,17 @@ import sys from collections import OrderedDict from pathlib import Path +from console_encoding import configure_utf8_stdio + try: import yaml # type: ignore except ImportError: yaml = None +configure_utf8_stdio() + + SCRIPT_DIR = Path(__file__).resolve().parent SKILL_DIR = SCRIPT_DIR.parent TEMPLATES_DIR = SKILL_DIR / "templates" diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/rotate_images.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/rotate_images.py index 20e0cb1f6..3c784ed9c 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/rotate_images.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/rotate_images.py @@ -18,6 +18,11 @@ import os import re from pathlib import Path from typing import List, Dict, Union, Any, Optional + +from console_encoding import configure_utf8_stdio + +configure_utf8_stdio() + from PIL import Image, ExifTags diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/source_to_md/doc_to_md.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/source_to_md/doc_to_md.py index 211ec8398..8382ca18f 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/source_to_md/doc_to_md.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/source_to_md/doc_to_md.py @@ -33,6 +33,14 @@ from pathlib import Path from urllib.parse import unquote, urlparse from xml.etree import ElementTree as ET +_SCRIPTS_DIR = Path(__file__).resolve().parents[1] +if str(_SCRIPTS_DIR) not in sys.path: + sys.path.insert(0, str(_SCRIPTS_DIR)) + +from console_encoding import configure_utf8_stdio # noqa: E402 + +configure_utf8_stdio() + # ───────────────────────────────────────────────────────────── # Format registry # ───────────────────────────────────────────────────────────── diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/source_to_md/excel_to_md.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/source_to_md/excel_to_md.py index 31cf09e6d..42966a636 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/source_to_md/excel_to_md.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/source_to_md/excel_to_md.py @@ -20,6 +20,14 @@ from datetime import date, datetime, time from pathlib import Path from typing import Any +_SCRIPTS_DIR = Path(__file__).resolve().parents[1] +if str(_SCRIPTS_DIR) not in sys.path: + sys.path.insert(0, str(_SCRIPTS_DIR)) + +from console_encoding import configure_utf8_stdio # noqa: E402 + +configure_utf8_stdio() + # ───────────────────────────────────────────────────────────── # Format registry diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/source_to_md/pdf_to_md.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/source_to_md/pdf_to_md.py index f3c6ef224..c0eb08814 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/source_to_md/pdf_to_md.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/source_to_md/pdf_to_md.py @@ -14,6 +14,14 @@ import sys from pathlib import Path from collections import Counter +_SCRIPTS_DIR = Path(__file__).resolve().parents[1] +if str(_SCRIPTS_DIR) not in sys.path: + sys.path.insert(0, str(_SCRIPTS_DIR)) + +from console_encoding import configure_utf8_stdio # noqa: E402 + +configure_utf8_stdio() + try: import fitz # PyMuPDF except ImportError: diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/source_to_md/ppt_to_md.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/source_to_md/ppt_to_md.py index 64b1e276f..279609587 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/source_to_md/ppt_to_md.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/source_to_md/ppt_to_md.py @@ -34,11 +34,19 @@ from io import BytesIO from pathlib import Path from urllib.parse import quote +_SCRIPTS_DIR = Path(__file__).resolve().parents[1] +if str(_SCRIPTS_DIR) not in sys.path: + sys.path.insert(0, str(_SCRIPTS_DIR)) + +from console_encoding import configure_utf8_stdio # noqa: E402 + from pptx import Presentation from pptx.enum.action import PP_ACTION from pptx.enum.shapes import MSO_SHAPE_TYPE from pptx.oxml.ns import qn +configure_utf8_stdio() + EMU_PER_INCH = 914400 OFFICE_VECTOR_EXTENSIONS = {"emf", "wmf"} diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/source_to_md/web_to_md.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/source_to_md/web_to_md.py index 49fa5ff1c..7854b6341 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/source_to_md/web_to_md.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/source_to_md/web_to_md.py @@ -35,8 +35,17 @@ import os import re import sys import time +from pathlib import Path from urllib.parse import urljoin, urlparse +_SCRIPTS_DIR = Path(__file__).resolve().parents[1] +if str(_SCRIPTS_DIR) not in sys.path: + sys.path.insert(0, str(_SCRIPTS_DIR)) + +from console_encoding import configure_utf8_stdio # noqa: E402 + +configure_utf8_stdio() + try: import requests from bs4 import BeautifulSoup, NavigableString, Tag diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_editor/server.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_editor/server.py index 796c46f78..2fc9dfcb0 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_editor/server.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_editor/server.py @@ -59,6 +59,7 @@ _ROOT_SCRIPTS_DIR = _SCRIPTS_DIR.parent if str(_ROOT_SCRIPTS_DIR) not in sys.path: sys.path.insert(0, str(_ROOT_SCRIPTS_DIR)) +from console_encoding import configure_utf8_stdio # noqa: E402 from server_common import ( # noqa: E402 claim_lock as _claim_lock, find_free_port as _find_free_port, @@ -67,6 +68,8 @@ from server_common import ( # noqa: E402 release_lock as _release_lock, ) +configure_utf8_stdio() + from annotations import ( # noqa: E402 assign_temp_ids, is_editable_attr, diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_finalize/align_embed_images.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_finalize/align_embed_images.py index d946efbf2..bbea054a1 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_finalize/align_embed_images.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_finalize/align_embed_images.py @@ -54,6 +54,14 @@ from typing import TYPE_CHECKING from urllib.parse import unquote from xml.etree import ElementTree as ET +_SCRIPTS_DIR = Path(__file__).resolve().parents[1] +if str(_SCRIPTS_DIR) not in sys.path: + sys.path.insert(0, str(_SCRIPTS_DIR)) + +from console_encoding import configure_utf8_stdio # noqa: E402 + +configure_utf8_stdio() + if __package__ in {None, ''}: import types diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_finalize/crop_images.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_finalize/crop_images.py index bfe17187b..09b1f7f33 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_finalize/crop_images.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_finalize/crop_images.py @@ -24,6 +24,14 @@ from pathlib import Path from xml.etree import ElementTree as ET from urllib.parse import unquote +_SCRIPTS_DIR = Path(__file__).resolve().parents[1] +if str(_SCRIPTS_DIR) not in sys.path: + sys.path.insert(0, str(_SCRIPTS_DIR)) + +from console_encoding import configure_utf8_stdio # noqa: E402 + +configure_utf8_stdio() + try: from PIL import Image except ImportError: diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_finalize/embed_icons.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_finalize/embed_icons.py index 7c5045263..b97238dbc 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_finalize/embed_icons.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_finalize/embed_icons.py @@ -51,6 +51,14 @@ import argparse from pathlib import Path from xml.etree import ElementTree as ET +_SCRIPTS_DIR = Path(__file__).resolve().parents[1] +if str(_SCRIPTS_DIR) not in sys.path: + sys.path.insert(0, str(_SCRIPTS_DIR)) + +from console_encoding import configure_utf8_stdio # noqa: E402 + +configure_utf8_stdio() + # Default icon directory DEFAULT_ICONS_DIR = Path(__file__).parent.parent.parent / 'templates' / 'icons' diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_finalize/embed_images.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_finalize/embed_images.py index 238503b99..7cfd504cb 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_finalize/embed_images.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_finalize/embed_images.py @@ -17,6 +17,15 @@ import base64 import re import sys import argparse +from pathlib import Path + +_SCRIPTS_DIR = Path(__file__).resolve().parents[1] +if str(_SCRIPTS_DIR) not in sys.path: + sys.path.insert(0, str(_SCRIPTS_DIR)) + +from console_encoding import configure_utf8_stdio # noqa: E402 + +configure_utf8_stdio() def get_mime_type(filename: str, file_bytes: bytes | None = None) -> str: diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_finalize/fix_image_aspect.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_finalize/fix_image_aspect.py index 029fbcdfc..b9297577a 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_finalize/fix_image_aspect.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_finalize/fix_image_aspect.py @@ -31,6 +31,14 @@ import argparse from pathlib import Path from xml.etree import ElementTree as ET +_SCRIPTS_DIR = Path(__file__).resolve().parents[1] +if str(_SCRIPTS_DIR) not in sys.path: + sys.path.insert(0, str(_SCRIPTS_DIR)) + +from console_encoding import configure_utf8_stdio # noqa: E402 + +configure_utf8_stdio() + # Try to import PIL for getting image dimensions try: from PIL import Image diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_finalize/flatten_tspan.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_finalize/flatten_tspan.py index 1561d7f29..1a09efc13 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_finalize/flatten_tspan.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_finalize/flatten_tspan.py @@ -2,8 +2,17 @@ import os import sys import re import argparse +from pathlib import Path from xml.etree import ElementTree as ET +_SCRIPTS_DIR = Path(__file__).resolve().parents[1] +if str(_SCRIPTS_DIR) not in sys.path: + sys.path.insert(0, str(_SCRIPTS_DIR)) + +from console_encoding import configure_utf8_stdio # noqa: E402 + +configure_utf8_stdio() + SVG_NS = "http://www.w3.org/2000/svg" NSMAP = {"svg": SVG_NS} diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_finalize/svg_rect_to_path.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_finalize/svg_rect_to_path.py index c7f48f189..128a256a9 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_finalize/svg_rect_to_path.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_finalize/svg_rect_to_path.py @@ -26,6 +26,14 @@ from pathlib import Path from typing import Any, Tuple from xml.etree import ElementTree as ET +_SCRIPTS_DIR = Path(__file__).resolve().parents[1] +if str(_SCRIPTS_DIR) not in sys.path: + sys.path.insert(0, str(_SCRIPTS_DIR)) + +from console_encoding import configure_utf8_stdio # noqa: E402 + +configure_utf8_stdio() + def rect_to_rounded_path( x: float, diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_quality_checker.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_quality_checker.py index 51b577357..923eca4ba 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_quality_checker.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_quality_checker.py @@ -19,6 +19,10 @@ from typing import List, Dict, Tuple from collections import Counter, defaultdict from xml.etree import ElementTree as ET +from console_encoding import configure_utf8_stdio + +configure_utf8_stdio() + try: from project_utils import CANVAS_FORMATS from error_helper import ErrorHelper diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx.py index 6968f187b..7befb9af5 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx.py @@ -11,7 +11,10 @@ from pathlib import Path # Ensure the scripts directory is on sys.path so the package can be found sys.path.insert(0, str(Path(__file__).resolve().parent)) +from console_encoding import configure_utf8_stdio from svg_to_pptx import main +configure_utf8_stdio() + if __name__ == '__main__': main() diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx/pptx_cli.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx/pptx_cli.py index 240163eae..ea2cf27f5 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx/pptx_cli.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx/pptx_cli.py @@ -9,6 +9,14 @@ import argparse from datetime import datetime from pathlib import Path +_SCRIPTS_DIR = Path(__file__).resolve().parents[1] +if str(_SCRIPTS_DIR) not in sys.path: + sys.path.insert(0, str(_SCRIPTS_DIR)) + +from console_encoding import configure_utf8_stdio # noqa: E402 + +configure_utf8_stdio() + if __package__ in {None, ''}: import types diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/template_fill_pptx.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/template_fill_pptx.py index 76beb0119..8dff9987a 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/template_fill_pptx.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/template_fill_pptx.py @@ -21,7 +21,10 @@ from pathlib import Path # Ensure the scripts directory is on sys.path so the package can be found. sys.path.insert(0, str(Path(__file__).resolve().parent)) +from console_encoding import configure_utf8_stdio from template_fill_pptx import main +configure_utf8_stdio() + if __name__ == "__main__": raise SystemExit(main()) diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/template_fill_pptx/cli.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/template_fill_pptx/cli.py index 018e078f2..885d1e932 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/template_fill_pptx/cli.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/template_fill_pptx/cli.py @@ -8,6 +8,14 @@ import sys from datetime import datetime from pathlib import Path +_SCRIPTS_DIR = Path(__file__).resolve().parents[1] +if str(_SCRIPTS_DIR) not in sys.path: + sys.path.insert(0, str(_SCRIPTS_DIR)) + +from console_encoding import configure_utf8_stdio # noqa: E402 + +configure_utf8_stdio() + if __package__ in {None, ''}: import types diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/total_md_split.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/total_md_split.py index e0cf80ee6..2e6375cad 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/total_md_split.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/total_md_split.py @@ -28,6 +28,10 @@ import argparse import re from pathlib import Path +from console_encoding import configure_utf8_stdio + +configure_utf8_stdio() + HEADING_RE = re.compile(r'^(#{1,6})\s*(.+?)\s*$') HR_RE = re.compile(r'^\s*[-*]{3,}\s*$') diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/update_repo.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/update_repo.py index 237992a63..77e2398ce 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/update_repo.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/update_repo.py @@ -15,6 +15,10 @@ import subprocess import sys from pathlib import Path +from console_encoding import configure_utf8_stdio + +configure_utf8_stdio() + TOOLS_DIR = Path(__file__).resolve().parent SKILL_DIR = TOOLS_DIR.parent diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/update_spec.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/update_spec.py index 3da6e92ae..88a248658 100755 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/update_spec.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/update_spec.py @@ -27,6 +27,10 @@ import re import sys from pathlib import Path +from console_encoding import configure_utf8_stdio + +configure_utf8_stdio() + HEX_RE = re.compile(r"^#(?:[0-9A-Fa-f]{3,4}|[0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})$") FONT_FAMILY_RE = re.compile(r"""(font-family\s*=\s*)(["'])(.*?)\2""") diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/visual_review.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/visual_review.py index a929674f4..855926d02 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/visual_review.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/visual_review.py @@ -38,6 +38,10 @@ import urllib.request from contextlib import contextmanager from pathlib import Path +from console_encoding import configure_utf8_stdio + +configure_utf8_stdio() + # Histogram threshold: PNG counts as "all background" if a single quantized # color bucket holds >= ALL_BG_THRESHOLD of pixels. Guards against blank diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/brands_index.json b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/brands_index.json index 37995c0aa..399557072 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/brands_index.json +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/brands_index.json @@ -6,5 +6,13 @@ "google": { "summary": "Google brand identity — multi-product corporate decks, developer events (Google I/O style), education and training in the Google ecosystem", "primary_color": "#4285F4" + }, + "中国电建": { + "summary": "POWERCHINA brand identity for engineering project reports, technical proposals, business negotiations, and corporate promotion", + "primary_color": "#00418D" + }, + "中汽研": { + "summary": "CATARC brand identity for product certification, evaluation reports, automotive technology promotion, and business visits", + "primary_color": "#004098" } } diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/中国电建/design_spec.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/中国电建/design_spec.md new file mode 100644 index 000000000..436db3e4a --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/中国电建/design_spec.md @@ -0,0 +1,73 @@ +--- +brand_id: 中国电建 +kind: brand +summary: POWERCHINA brand identity for engineering project reports, technical proposals, business negotiations, and corporate promotion +primary_color: "#00418D" +--- + +# POWERCHINA (中国电建) Brand Specification + +> Identity-only preset. No SVG page roster; pages are composed freely under these brand constraints. + +## I. Brand Overview + +| Property | Value | +|---|---| +| Brand Name | POWERCHINA / 中国电建 | +| Use Cases | Engineering project reports, technical proposal presentations, business negotiations, corporate promotion, annual summaries | +| Tone | Professional, composed, international, state-owned enterprise style | + +## II. Color Scheme + +| Role | HEX | Provenance | Notes | +|---|---|---|---| +| primary | `#00418D` | approx | POWERCHINA Blue, inherited from the existing POWERCHINA deck templates | +| secondary | `#002B5C` | approx | Deep blue for chapter pages, dark headers, and gradient bases | +| accent (blue) | `#0066CC` | approx | Bright blue for charts, links, and secondary emphasis | +| accent (light) | `#4A90D9` | approx | Sky blue for tertiary highlights and decorative rules | +| accent (red) | `#C41E3A` | approx | China red for milestones, key data, and national-strength emphasis | +| accent (gold) | `#C9A227` | approx | Honors, achievements, and award moments | +| text | `#1A1A1A` | approx | Primary body text on light backgrounds | +| muted-text | `#4A5568` | approx | Secondary descriptions and annotations | +| bg | `#FFFFFF` | approx | Standard light presentation background | +| surface | `#F4F6F8` | approx | Light gray card and module surfaces | + +## III. Typography + +| Role | Family | Weight | +|---|---|---| +| title | `"Microsoft YaHei", "微软雅黑", "SimHei", Arial, sans-serif` | 700 | +| body | `"Microsoft YaHei", "微软雅黑", Arial, sans-serif` | 400 | +| data | `Arial, "Microsoft YaHei", sans-serif` | 600-700 | + +Use PowerPoint-safe CJK fonts by default. Keep English technical labels in Arial when they function as engineering annotations or dashboard labels. + +## IV. Logo + +POWERCHINA templates may use the group brand logo or subsidiary logos depending on the presenting entity. Pick one primary logo per deck and avoid mixing several logos on every page. + +| File | Form | Usage | +|---|---|---| +| `./电建logo.png` | POWERCHINA symbol / primary mark (234x236) | Cover, ending, and compact brand moments where the group identity is required | +| `./中国水务logo.png` | China Water logo lockup (1108x190) | Subsidiary-led water-business reports; cover or ending lockup | +| `./华东院logo.png` | East China Institute logo lockup (1438x300) | Institute-led technical reports and engineering proposals | +| `./水电三局logo.png` | Sinohydro Bureau 3 logo lockup (629x75) | Bureau-led project reports and construction updates | + +- Cover / ending: use the selected primary logo at readable size. +- Per-page header: optional; use a compact logo only when it does not crowd the title bar. +- Dark backgrounds: prefer white/inverted treatment when available; otherwise place the logo on a white backing plate. +- Clearspace: leave at least 0.5x logo height around the mark or lockup. + +## V. Voice & Tone + +- Formality: formal +- Person: organization-first, "we / 我们" when speaking as the company +- Emoji: avoid +- Abbreviations: spell out Chinese organization names on first use; POWERCHINA is acceptable after first mention +- Style: emphasize engineering reliability, delivery capability, safety, scale, and public-sector credibility + +## VI. Icon Style + +- Preference: filled or sturdy stroke icons +- Recommended libraries: `tabler-filled`, `chunk-filled`, or `tabler-outline` with heavier stroke +- Avoid thin decorative icons for engineering / construction content; prefer solid symbols, process arrows, infrastructure metaphors, and chart-friendly pictograms. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建_常规/中国水务logo.png b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/中国电建/中国水务logo.png similarity index 100% rename from plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建_常规/中国水务logo.png rename to plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/中国电建/中国水务logo.png diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建_常规/华东院logo.png b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/中国电建/华东院logo.png similarity index 100% rename from plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建_常规/华东院logo.png rename to plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/中国电建/华东院logo.png diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建_常规/水电三局logo.png b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/中国电建/水电三局logo.png similarity index 100% rename from plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建_常规/水电三局logo.png rename to plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/中国电建/水电三局logo.png diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建_常规/电建logo.png b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/中国电建/电建logo.png similarity index 100% rename from plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建_常规/电建logo.png rename to plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/中国电建/电建logo.png diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/中汽研/design_spec.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/中汽研/design_spec.md new file mode 100644 index 000000000..4ea6217c2 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/中汽研/design_spec.md @@ -0,0 +1,72 @@ +--- +brand_id: 中汽研 +kind: brand +summary: CATARC brand identity for product certification, evaluation reports, automotive technology promotion, and business visits +primary_color: "#004098" +--- + +# CATARC (中汽研) Brand Specification + +> Identity-only preset. No SVG page roster; pages are composed freely under these brand constraints. + +## I. Brand Overview + +| Property | Value | +|---|---| +| Brand Name | CATARC / 中汽研 | +| Use Cases | Product certification display, evaluation presentations, automotive technology promotion, business visits, high-end technical reporting | +| Tone | Professional, authoritative, trustworthy, technical-consulting style | + +## II. Color Scheme + +| Role | HEX | Provenance | Notes | +|---|---|---|---| +| primary | `#004098` | approx | CATARC deep blue, inherited from the standard CATARC deck template | +| secondary | `#003366` | approx | Dark business blue for covers, chapter pages, and formal section headers | +| accent (blue) | `#0050B3` | approx | Bright blue for technology emphasis and gradients | +| accent (tech) | `#1890FF` | approx | Modern tech blue for forward-looking automotive topics | +| accent (cyan) | `#00E5FF` | approx | High-energy data / future-tech highlights; use sparingly | +| accent (red) | `#CC0000` | approx | Certification warnings, failed checks, and key risk emphasis | +| text | `#333333` | approx | Primary body text on light backgrounds | +| muted-text | `#666666` | approx | Secondary descriptions and notes | +| bg | `#FFFFFF` | approx | Standard light presentation background | +| surface | `#F5F5F5` | approx | Secondary content blocks and cards | +| border | `#E0E0E0` | approx | Dividers, table borders, and technical grids | + +## III. Typography + +| Role | Family | Weight | +|---|---|---| +| title | `"Microsoft YaHei", "微软雅黑", "SimHei", Arial, Calibri, sans-serif` | 700 | +| body | `"Microsoft YaHei", "微软雅黑", Arial, Calibri, sans-serif` | 400 | +| data | `Arial, "Microsoft YaHei", sans-serif` | 600-700 | + +Use clear PowerPoint-safe CJK fonts. Keep numbers, certification codes, and technical abbreviations in Arial for legibility. + +## IV. Logo + +CATARC uses separate large and header lockups. Choose the large logo for brand moments and the compact logo for page chrome. + +| File | Form | Usage | +|---|---|---| +| `./大型 logo.png` | Large CATARC lockup (592x238) | Cover hero, chapter/ending brand moments, and dark page lockups | +| `./右上角 logo.png` | Compact header logo (113x50) | Upper-right page header, title bar, and navigation areas | + +- Cover / ending: use `大型 logo.png` where the brand must read strongly. +- Content pages: use `右上角 logo.png` only when the layout has enough title-bar space. +- Watermarks: large logo may be used as a very faint watermark on content pages. +- Clearspace: leave at least 0.5x logo height around the mark or lockup. + +## V. Voice & Tone + +- Formality: formal-neutral +- Person: organization-first, "we / 我们" only when speaking as CATARC +- Emoji: avoid +- Abbreviations: CATARC is acceptable; spell out Chinese entity names on first use +- Style: emphasize certification credibility, testing rigor, technical evidence, automotive industry insight, and trusted advisory authority + +## VI. Icon Style + +- Preference: filled or clean stroke icons +- Recommended libraries: `tabler-filled`, `chunk-filled`, or `tabler-outline` +- Prefer automotive, certification, testing, dashboard, data, process, and compliance metaphors. Avoid playful or consumer-app icon styling. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中汽研_商务/右上角 logo.png b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/中汽研/右上角 logo.png similarity index 100% rename from plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中汽研_商务/右上角 logo.png rename to plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/中汽研/右上角 logo.png diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中汽研_商务/大型 logo.png b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/中汽研/大型 logo.png similarity index 100% rename from plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中汽研_商务/大型 logo.png rename to plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/中汽研/大型 logo.png diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/decks_index.json b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/decks_index.json index dbdeaf205..7d1b1a2ca 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/decks_index.json +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/decks_index.json @@ -5,36 +5,18 @@ "page_count": 5, "primary_color": "#C00000" }, - "中国电建_常规": { + "中国电建": { "summary": "Engineering project reports, technical proposal presentations, business negotiations, corporate promotion, annual summaries.", "canvas_format": "ppt169", "page_count": 5, "primary_color": "#00418D" }, - "中国电建_现代": { - "summary": "Major engineering reports, international market promotion, technology achievement showcases, high-end business negotiations.", - "canvas_format": "ppt169", - "page_count": 5, - "primary_color": "#00418D" - }, - "中汽研_商务": { - "summary": "Product certification display, evaluation presentations, technology promotion, high-end business reporting.", - "canvas_format": "ppt169", - "page_count": 5, - "primary_color": "#003366" - }, - "中汽研_常规": { + "中汽研": { "summary": "Product certification display, evaluation presentations, technology promotion, business visits.", "canvas_format": "ppt169", "page_count": 5, "primary_color": "#004098" }, - "中汽研_现代": { - "summary": "Forward-looking technology showcases, strategic releases, high-end business reporting.", - "canvas_format": "ppt169", - "page_count": 5, - "primary_color": "#001529" - }, "招商银行": { "summary": "交易银行产品介绍、销售收款方案汇报、客户案例拆解、分行培训材料.", "canvas_format": "ppt169", diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建_常规/01_cover.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建/01_cover.svg similarity index 100% rename from plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建_常规/01_cover.svg rename to plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建/01_cover.svg diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建_常规/02_chapter.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建/02_chapter.svg similarity index 100% rename from plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建_常规/02_chapter.svg rename to plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建/02_chapter.svg diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建_常规/02_toc.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建/02_toc.svg similarity index 100% rename from plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建_常规/02_toc.svg rename to plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建/02_toc.svg diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建_常规/03_content.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建/03_content.svg similarity index 100% rename from plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建_常规/03_content.svg rename to plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建/03_content.svg diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建_常规/04_ending.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建/04_ending.svg similarity index 100% rename from plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建_常规/04_ending.svg rename to plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建/04_ending.svg diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建_常规/design_spec.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建/design_spec.md similarity index 98% rename from plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建_常规/design_spec.md rename to plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建/design_spec.md index ecfaf1b5d..a4c726271 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建_常规/design_spec.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建/design_spec.md @@ -1,5 +1,5 @@ --- -deck_id: 中国电建_常规 +deck_id: 中国电建 kind: deck summary: Engineering project reports, technical proposal presentations, business negotiations, corporate promotion, annual summaries. canvas_format: ppt169 @@ -17,7 +17,7 @@ primary_color: "#00418D" | Property | Description | | -------------- | ---------------------------------------------------------------- | -| **Template Name** | 中国电建_常规 (formerly powerchina) | +| **Template Name** | 中国电建 | | **Use Cases** | Engineering project reports, technical proposal presentations, business negotiations, corporate promotion, annual summaries | | **Design Tone** | Professional, composed, international, state-owned enterprise style | | **Theme Mode** | Light theme (white background + POWERCHINA blue accent) | diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建_现代/中国水务logo.png b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建/中国水务logo.png similarity index 100% rename from plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建_现代/中国水务logo.png rename to plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建/中国水务logo.png diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建_现代/华东院logo.png b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建/华东院logo.png similarity index 100% rename from plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建_现代/华东院logo.png rename to plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建/华东院logo.png diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建_现代/水电三局logo.png b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建/水电三局logo.png similarity index 100% rename from plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建_现代/水电三局logo.png rename to plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建/水电三局logo.png diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建_现代/电建logo.png b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建/电建logo.png similarity index 100% rename from plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建_现代/电建logo.png rename to plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建/电建logo.png diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建_现代/01_cover.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建_现代/01_cover.svg deleted file mode 100644 index b28c2067f..000000000 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建_现代/01_cover.svg +++ /dev/null @@ -1,90 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - POWERCHINA - - - - - - - - - - - 2026 - - - - - {{TITLE}} - - - - - - - - - {{SUBTITLE}} - - - - - - - - - {{AUTHOR}} - - - 汇报人:{{PRESENTER}} | {{DATE}} - - - - - - - - 中国电力建设集团有限公司 · POWERCHINA CONSTRUCTION CORPORATION - - - diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建_现代/02_chapter.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建_现代/02_chapter.svg deleted file mode 100644 index 915eddd93..000000000 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建_现代/02_chapter.svg +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - 0{{CHAPTER_NUM}} - - - - - - - - - - - {{CHAPTER_NUM}} - - - - - CHAPTER NO. - - - - - - - - {{CHAPTER_TITLE}} - - - {{CHAPTER_SUBTITLE}} - - - - - - - - POWERCHINA ENGINEERING - - diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建_现代/02_toc.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建_现代/02_toc.svg deleted file mode 100644 index 5d0451f9c..000000000 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建_现代/02_toc.svg +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - 目录 - - - AGENDA - - - - - - - POWERCHINA - - - - - - - - - - - - 01 - - {{TOC_ITEM_1_TITLE}} - - - {{TOC_ITEM_1_DESC}} - - - - - - - 02 - - {{TOC_ITEM_2_TITLE}} - - - {{TOC_ITEM_2_DESC}} - - - - - - - 03 - - {{TOC_ITEM_3_TITLE}} - - - {{TOC_ITEM_3_DESC}} - - - - - - - 04 - - {{TOC_ITEM_4_TITLE}} - - - {{TOC_ITEM_4_DESC}} - - - - - - - - - - 关键数据 | KEY FIGURES - - - - - - {{STAT_1}} - - - {{STAT_1_LABEL}} - - - - - {{STAT_2}} - - - {{STAT_2_LABEL}} - - - - - {{STAT_3}} - - - {{STAT_3_LABEL}} - - - - - diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建_现代/03_content.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建_现代/03_content.svg deleted file mode 100644 index 5f6a384e9..000000000 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建_现代/03_content.svg +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0{{CHAPTER_NUM}} - - - - - {{PAGE_TITLE}} - - - - - - - - - POWERCHINA - - - - - - - - - - - - - - {{CONTENT_AREA}} - - - - - - - - - {{PAGE_NUM}} - - - - - 来源:{{SOURCE}} - - - diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建_现代/04_ending.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建_现代/04_ending.svg deleted file mode 100644 index b57ef6b82..000000000 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建_现代/04_ending.svg +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - THANKS - - - - - {{THANK_YOU}} - - - - - - - - {{CLOSING_MESSAGE}} - - - - - - - {{AUTHOR}} - - - {{CONTACT_INFO}} - - - - - - - - - - - © 2026 POWERCHINA. All Rights Reserved. - - - diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建_现代/design_spec.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建_现代/design_spec.md deleted file mode 100644 index 5811d9956..000000000 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/中国电建_现代/design_spec.md +++ /dev/null @@ -1,196 +0,0 @@ ---- -deck_id: 中国电建_现代 -kind: deck -summary: Major engineering reports, international market promotion, technology achievement showcases, high-end business negotiations. -canvas_format: ppt169 -page_count: 5 -primary_color: "#00418D" ---- - -# POWERCHINA (中国电建) Modern Template v2 - Design Specification - -> Suitable for POWERCHINA major project reports, international business showcases, high-end summit roadshows, technology innovation releases, and similar scenarios. -> **v2.0 Features**: Blends modern engineering aesthetics with an international perspective, emphasizing structural form, transparency, and digital expression. - ---- - -## I. Template Overview - -| Property | Description | -| -------------- | ---------------------------------------------------------------- | -| **Template Name** | 中国电建_现代 (formerly powerchina_v2) | -| **Use Cases** | Major engineering reports, international market promotion, technology achievement showcases, high-end business negotiations | -| **Design Tone** | **Grand narrative, modern precision, digital tech, international vision** | -| **Theme Mode** | Deep blue tech gradient + precision grid texture | - ---- - -## II. Canvas Specification - -| Property | Value | -| -------------- | ----------------------------- | -| **Format** | Standard 16:9 | -| **Dimensions** | 1280 × 720 px | -| **viewBox** | `0 0 1280 720` | -| **Page Margins** | Left/Right 80px, Top 100px, Bottom 60px | -| **Safe Area** | x: 80-1200, y: 100-660 | - ---- - -## III. Color Scheme - -### Primary Colors (Upgraded) - -| Role | Color Value | Gradient (SVG defs) | Notes | -| -------------- | ----------- | ------------------------------ | ---------------------------------- | -| **POWERCHINA Blue** | `#00418D` | `#00418D` -> `#072C61` | Brand core color for main backgrounds, title bars | -| **Tech Blue** | `#0066CC` | `#0066CC` -> `#0088FF` | Highlight color for charts, accent borders | -| **Deep Sea Blue** | `#001F45` | N/A | Page base color for a deep, immersive feel | -| **Engineering White** | `#FFFFFF` | N/A | Title text, inverted icons | - -### Auxiliary Colors (National Strength) - -| Role | Color Value | Usage | -| -------------- | ----------- | ---------------------------------- | -| **China Red** | `#C41E3A` | Key data emphasis, progress bar indicators | -| **Architectural Gray** | `#E2E8F0` | Grid lines, secondary text | -| **Glorious Gold** | `#FFD700` | Honors, milestone highlights (Opacity 20%) | - ---- - -## IV. Typography System - -### Font Stack - -**Primary Font Stack**: `"Microsoft YaHei", Arial, sans-serif` - -### Font Size Hierarchy (Enhanced Contrast) - -| Level | Usage | Size | Weight | Color | -| ----- | ------------------ | ----- | ------- | ---------- | -| H1 | Cover main title | 60px | Bold | #FFFFFF | -| H2 | Page heading | 36px | Bold | #00418D | -| H3 | Section title | 24px | Bold | #1A202C | -| P | Body content | 18px | Regular | #4A5568 | -| Num | Giant decorative numbers | 120px | Bold | Opacity 5% | - ---- - -## V. Page Structure - -### Common Navigation Bar (y=0 to 100) - -- **Top Blue Bar**: 8px height, deep blue gradient. -- **Logo Area**: Fixed at upper-right corner with a white backing plate. -- **Title Group**: Upper-left corner using **"Tag Style"** design, simulating engineering drawing labels. - ---- - -## VI. Page Types - -### 1. Cover Page (01_cover.svg) -- **Visual Focus**: **"Foundation"** concept. Heavy deep blue supporting the bottom, transparent top. -- **Background**: Overlaid with precision **"Geo Grid"** (latitude-longitude grid), symbolizing global presence. -- **Layout**: Center-symmetric layout, projecting state-owned enterprise gravitas. - -### 2. Table of Contents (02_toc.svg) -- **Layout**: **"Milestones"** style. Horizontal timeline or connected cards, representing project progression. -- **Elements**: Connection lines and node dots, simulating circuits or pipeline networks. - -### 3. Chapter Page (02_chapter.svg) -- **Background**: Deep blue tech gradient; large whitespace on the right for perspective grid. -- **Numbers**: Giant outlined numbers (Stroke Only) — not just chapter numbers, but part of the architectural structure. - -### 4. Content Page (03_content.svg) -- **Layout**: **"Console"** style. Orderly top navigation bar, maximized content area. -- **Details**: **"Corner Marks"** added at all four corners for a precision engineering feel. - -### 5. Ending Page (04_ending.svg) -- **Background**: Echoes the cover's "Foundation" structure. -- **Elements**: Reinforces "win-win cooperation" concept with QR code / contact information displayed in zones. - ---- - -## VII. SVG Page Roster - -| File | Role | Description | -|------|------|-------------| -| `01_cover.svg` | cover | Title slide; brand/project name + presenter + date | -| `02_chapter.svg` | chapter | Chapter divider page (large number + chapter title) | -| `02_toc.svg` | toc | Table of contents listing major sections | -| `03_content.svg` | content | Main content page; body of the deck | -| `04_ending.svg` | ending | Closing/thank-you page | - -## VIII. Layout Patterns (Recommended) - -### 1. Tech Cards -- Cards with subtle borders and a glowing effect. -- Ideal for showcasing key technical indicators or innovation achievements. - -### 2. Dashboard -- Combined layout of charts and key data. -- Uses Tech Blue as the primary chart color. - -### 3. Blueprint -- Leverages the Geo Grid background to explain complex structures through lines and annotations. - ---- - -## IX. Spacing Guidelines - -| Property | Value | Description | -| -------------- | ----- | ------------------------ | -| **Base Unit** | 4px | Precision design uses a 4px grid | -| **Module Gap** | 40px | Generous spacing for breathing room | -| **Card Gap** | 20px | Compact yet clear spacing | -| **Inner Padding** | 32px | Distance between content and border | - ---- - -## X. SVG Technical Constraints - -### Mandatory Rules - -1. **Gradients**: Use `` to create metallic or light/shadow effects. -2. **Grid**: Use `` to define precision grid backgrounds with opacity controlled at 0.05-0.1. -3. **Opacity**: Strictly use `fill-opacity` / `stroke-opacity`. -4. **Clipping/Masking**: `mask` is forbidden; `clipPath` is allowed only on `` under `shared-standards.md` §1.2. - -### Forbidden Elements (Blacklist) - -- `mask` (masking); `clipPath` is allowed only on `` under `shared-standards.md` §1.2 -- `",""," for hover effects",Medium,https://docs.avaloniaui.net/docs/styling/pseudoclasses +7,Styling,Use nesting selectors,Child and descendant combinators for scoped styles,> for direct child and space for descendant,Flat selectors that match too broadly,"","","CornerRadius=""4"" on every Button in the page",Medium,https://learn.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/xaml-styles +16,Styling,Use VisualStateManager for visual states,Define visual states with Setters that change properties when triggered,VisualStateGroup containing VisualStates with Setter targets,Toggling Visibility from code-behind on SizeChanged,"","SizeChanged handler that flips Orientation in code-behind",High,https://learn.microsoft.com/en-us/windows/uwp/design/layout/layouts-with-xaml +17,Navigation,Use Frame for page navigation,Windows.UI.Xaml.Controls.Frame for UWP page navigation,Frame.Navigate with typed parameters,Swapping UserControls manually,"rootFrame.Navigate(typeof(DetailPage), itemId);","contentArea.Content = new DetailPage();",Medium,https://learn.microsoft.com/en-us/windows/uwp/design/basics/navigate-between-two-pages +18,Navigation,Handle back button correctly,Provide an in-app Back button styled with NavigationBackButtonNormalStyle and handle SystemNavigationManager.BackRequested for hardware back gamepad B and Tablet-Mode back; also handle CoreDispatcher.AcceleratorKeyActivated for Alt+Left,In-app NavigationBackButtonNormalStyle button plus SystemNavigationManager.BackRequested handler,Relying on the deprecated title-bar back button (AppViewBackButtonVisibility) or ignoring system back signals,"SystemNavigationManager.GetForCurrentView().BackRequested += OnBackRequested;","No back button support on phone or tablet",High,https://learn.microsoft.com/en-us/windows/uwp/ui-input/back-navigation +19,Navigation,Support deep linking with protocol activation,Respond to URI activation and toast taps,OnActivated handler with proper page routing,Ignoring activation arguments,"protected override void OnActivated(IActivatedEventArgs args) { if (args.Kind == ActivationKind.Protocol) { ... } }","Empty OnActivated ignoring URI parameters",Medium,https://learn.microsoft.com/en-us/windows/uwp/launch-resume/handle-uri-activation +20,Navigation,Use ConnectedAnimations for continuity,Smooth transitions between pages,ConnectedAnimationService for shared element transitions,Abrupt page transitions with no visual continuity,"ConnectedAnimationService.GetForCurrentView().PrepareToAnimate(""image"", sourceImage);","No transition animation between list and detail",Low,https://learn.microsoft.com/en-us/windows/uwp/design/motion/connected-animation +21,Data Binding,Implement INotifyPropertyChanged,Enable UI updates on property changes,INotifyPropertyChanged on all ViewModels,Auto-properties without notification,"public string Title { get => _title; set { _title = value; OnPropertyChanged(); } }","public string Title { get; set; } expecting UI updates",High,https://learn.microsoft.com/en-us/windows/uwp/data-binding/data-binding-in-depth +22,Data Binding,Use ObservableCollection for lists,Collection change notifications for ItemsSources,ObservableCollection for bound lists,List for data-bound collections,"ObservableCollection Items { get; } = new();","List Items { get; set; } = new();",High,https://learn.microsoft.com/en-us/windows/uwp/data-binding/data-binding-in-depth +23,Data Binding,Use function bindings with x:Bind,Call static methods directly in markup,x:Bind to static converter methods,IValueConverter for trivial transforms,"","Full IValueConverter class for bool to Visibility",Medium,https://learn.microsoft.com/en-us/windows/uwp/data-binding/function-bindings +24,Data Binding,Specify Mode on x:Bind,x:Bind defaults to OneTime not OneWay,Mode=OneWay or TwoWay when live updates needed,Omitting Mode and getting stale UI,"Text=""{x:Bind Title, Mode=OneWay}""","Text=""{x:Bind Title}"" expecting live updates",High,https://learn.microsoft.com/en-us/windows/uwp/xaml-platform/x-bind-markup-extension +25,Data Binding,Use CollectionViewSource for grouping,Group and sort collections declaratively,CollectionViewSource for grouped ListView and GridView,Manual grouping logic in code-behind,"","Manual loop building grouped StackPanels",Medium,https://learn.microsoft.com/en-us/windows/uwp/data-binding/data-binding-in-depth +26,Performance,Use ListView and GridView virtualization,Only creates containers for visible items,Default virtualization in ListView and GridView,Setting ItemsPanel to non-virtualizing panel," (virtualizes by default)","",High,https://learn.microsoft.com/en-us/windows/uwp/debug-test-perf/optimize-gridview-and-listview +27,Performance,Use ISupportIncrementalLoading,Load data on demand as user scrolls,ISupportIncrementalLoading for large datasets,Loading entire collection upfront,"class IncrementalSource : ObservableCollection, ISupportIncrementalLoading","await LoadAll() loading 50K items at startup",Medium,https://learn.microsoft.com/en-us/windows/uwp/data-binding/data-binding-in-depth +28,Performance,Reduce XAML visual tree depth,Simpler trees layout and render faster,Flat templates with minimal nesting,Deeply nested panels in DataTemplates," in item template","... 8 levels in item template",Medium,https://learn.microsoft.com/en-us/windows/uwp/debug-test-perf/optimize-xaml-loading +29,Performance,Use compiled bindings in DataTemplates,x:Bind in templates requires x:DataType,x:DataType on DataTemplate for compiled bindings,{Binding} in item templates for large lists,"","",High,https://learn.microsoft.com/en-us/windows/uwp/xaml-platform/x-bind-markup-extension +30,Performance,Profile with Visual Studio diagnostics,Measure before optimizing,Application Timeline and Memory Usage tools,Guessing at performance problems,"VS Diagnostic Tools > Application Timeline","Optimizing without profiling data",Medium,https://learn.microsoft.com/en-us/visualstudio/profiling/application-timeline +31,Threading,Use async/await for all IO,Keep UI thread responsive,async/await for file network and database operations,Synchronous IO blocking the UI thread,"var file = await StorageFile.GetFileFromPathAsync(path);","StorageFile.GetFileFromPathAsync(path).AsTask().Result;",High,https://learn.microsoft.com/en-us/windows/uwp/threading-async/asynchronous-programming-universal-windows-platform-apps +32,Threading,Use CoreDispatcher for UI thread access,Post work back to the UI thread from background,Dispatcher.RunAsync from background threads,Touching UI elements from background threads,"await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => Status = ""Done"");","textBlock.Text = ""Done"" from Task.Run",High,https://learn.microsoft.com/en-us/uwp/api/windows.ui.core.coredispatcher +33,Threading,Offload CPU work with Task.Run,Keep compute-heavy work off UI thread,Task.Run for CPU-bound operations,Heavy computation blocking UI,"var result = await Task.Run(() => ProcessData(items));","var result = ProcessData(items); freezing UI",High,https://learn.microsoft.com/en-us/windows/uwp/threading-async/asynchronous-programming-universal-windows-platform-apps +34,Threading,Use IProgress for status updates,Report progress from background operations,IProgress for progress reporting to UI,Polling shared variables for progress,"var progress = new Progress(p => ProgressBar.Value = p); await Task.Run(() => Process(progress));","while (!done) { await Task.Delay(100); check shared field; }",Medium,https://learn.microsoft.com/en-us/dotnet/api/system.progress-1 +35,Adaptive,Use AdaptiveTrigger for responsive layouts,MinWindowWidth and MinWindowHeight triggers fire at standard breakpoints (640 small / 1008 medium),AdaptiveTrigger inside VisualState.StateTriggers with the 640 and 1008 breakpoints,Fixed layouts for a single screen size,"","Single-column layout at all widths",High,https://learn.microsoft.com/en-us/windows/uwp/design/layout/layouts-with-xaml +36,Adaptive,Design for multiple device families,Phone tablet desktop Xbox and HoloLens,DeviceFamily-specific views and resources,Desktop-only design ignoring other form factors,"DeviceFamily-Mobile/MainPage.xaml for phone-specific layout","Fixed 1920x1080 layout",Medium,https://learn.microsoft.com/en-us/windows/uwp/design/layout/screen-sizes-and-breakpoints-for-responsive-design +37,Adaptive,Use RelativePanel for adaptive positioning,Controls position relative to each other,RelativePanel for layouts that reflow at breakpoints,Absolute positioning or fixed margins,"","Full ControlTemplate copy to change background color",High,https://learn.microsoft.com/en-us/windows/apps/develop/platform/xaml/xaml-styles#lightweight-styling +11,Styling,Use WinUI theme resources,Consistent Fluent Design colors and brushes,WinUI theme resource keys for colors,Hardcoded hex color values,"Background=""{ThemeResource CardBackgroundFillColorDefaultBrush}""","Background=""#FF2D2D30""",High,https://learn.microsoft.com/en-us/windows/apps/design/signature-experiences/color +12,Styling,Support light and dark themes,Respect user and system theme preference,ThemeResource for theme-adaptive values,Hardcoded colors that break in dark mode,"Foreground=""{ThemeResource TextFillColorPrimaryBrush}""","Foreground=""Black""",High,https://learn.microsoft.com/en-us/windows/apps/develop/platform/xaml/xaml-theme-resources +13,Styling,Use Fluent Design system,Acrylic Mica Reveal and rounded corners,Built-in Fluent materials and effects,Custom blur and shadow implementations,"","Custom CompositionBrush recreating acrylic",Medium,https://learn.microsoft.com/en-us/windows/apps/design/signature-experiences/materials +14,Navigation,Use Frame for page navigation,Microsoft.UI.Xaml.Controls.Frame for WinUI 3 page navigation,Frame.Navigate with page types and parameters,Swapping UserControls in a ContentControl,"rootFrame.Navigate(typeof(SettingsPage), parameter);","contentArea.Content = new SettingsControl();",Medium,https://learn.microsoft.com/en-us/windows/apps/develop/ui/navigation/navigate-between-two-pages +15,Navigation,Pass typed navigation parameters,Type-safe data passing between pages,Typed parameter in OnNavigatedTo,Dictionary or string parsing for parameters,"protected override void OnNavigatedTo(NavigationEventArgs e) { var item = (Item)e.Parameter; }","var id = int.Parse(e.Parameter.ToString());",Medium,https://learn.microsoft.com/en-us/windows/apps/develop/ui/navigation/navigate-between-two-pages +16,Navigation,Handle back navigation,WinUI 3 uses NavigationView.BackRequested instead of UWP SystemNavigationManager,Register NavigationView.BackRequested handler and manage back stack,"Ignoring back navigation","navigationView.BackRequested += OnBackRequested;","No back button support",Medium,https://learn.microsoft.com/en-us/windows/apps/develop/ui/navigation/navigation-history-and-backwards-navigation +17,Navigation,Use deep linking,Handle protocol activation so URIs route to the right page,Register protocol then check ExtendedActivationKind.Protocol on activation,Single entry point ignoring activation context,"AppInstance.GetCurrent().GetActivatedEventArgs() with ExtendedActivationKind.Protocol","Ignoring activation arguments",Medium,https://learn.microsoft.com/en-us/windows/apps/windows-app-sdk/applifecycle/applifecycle-rich-activation +18,Data Binding,Use ObservableCollection for lists,Notifies UI of collection changes,ObservableCollection for bound ItemsSources,List for bound collections,"ObservableCollection Items { get; } = new();","List Items { get; set; } = new();",High,https://learn.microsoft.com/en-us/windows/apps/develop/data-binding/data-binding-in-depth +19,Data Binding,Use INotifyPropertyChanged,Enable property change notification for UI updates,INotifyPropertyChanged on ViewModels,Properties without notification,"public string Name { get => _name; set => SetProperty(ref _name, value); }","public string Name { get; set; } without notification",High,https://learn.microsoft.com/en-us/windows/apps/develop/data-binding/data-binding-in-depth +20,Data Binding,Use function binding with x:Bind,Call methods directly in bindings,x:Bind with method references for transforms,IValueConverter for simple logic,"","IValueConverter class for bool to visibility",Medium,https://learn.microsoft.com/en-us/windows/apps/develop/data-binding/function-bindings +21,Data Binding,Specify Mode explicitly on x:Bind,x:Bind defaults to OneTime not OneWay,Mode=OneWay or Mode=TwoWay when updates needed,Forgetting Mode and getting stale UI,"Text=""{x:Bind Title, Mode=OneWay}""","Text=""{x:Bind Title}"" expecting live updates",High,https://learn.microsoft.com/en-us/windows/apps/develop/platform/xaml/x-bind-markup-extension +22,Performance,Use ItemsRepeater for custom lists,Virtualizing layout with full control,ItemsRepeater for custom list layouts,ListView for highly customized item layouts,"","ListView with heavily modified template and removed chrome",Medium,https://learn.microsoft.com/en-us/windows/apps/develop/ui/controls/items-repeater +23,Performance,Use incremental loading,Load data on demand as user scrolls,ISupportIncrementalLoading for large data sets,Loading entire dataset upfront,"class IncrementalItemSource : ObservableCollection, ISupportIncrementalLoading","await LoadAllItems() on page load for 10K items",Medium,https://learn.microsoft.com/en-us/windows/apps/develop/data-binding/data-binding-in-depth +24,Performance,Reduce visual tree complexity,Simpler trees render faster,Minimal nesting in DataTemplates,Deeply nested panels in item templates,"","... 8 levels deep",Medium,https://learn.microsoft.com/en-us/windows/apps/develop/performance/optimize-xaml-loading +25,Performance,Use compiled bindings over reflection,x:Bind generates code at compile time,x:Bind for hot paths and list items,{Binding} in DataTemplates and frequently updated UI,"","",High,https://learn.microsoft.com/en-us/windows/apps/develop/platform/xaml/x-bind-markup-extension +26,Threading,Use DispatcherQueue not Dispatcher,WinUI 3 uses Microsoft.UI.Dispatching.DispatcherQueue instead of UWP CoreDispatcher,DispatcherQueue.TryEnqueue for UI thread access,Dispatcher.RunAsync (UWP pattern),"_dispatcherQueue.TryEnqueue(() => Status = ""Done"");","Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => ...);",High,https://learn.microsoft.com/en-us/windows/windows-app-sdk/api/winrt/microsoft.ui.dispatching.dispatcherqueue +27,Threading,Use async/await for IO operations,Keep UI responsive during file and network access,async/await for IO so the UI thread keeps rendering,Synchronous IO on UI thread,"var data = await httpClient.GetStringAsync(url);","var data = httpClient.GetStringAsync(url).Result;",High,https://learn.microsoft.com/en-us/dotnet/csharp/asynchronous-programming/ +28,Threading,Use Task.Run for CPU-bound work,Offload compute to thread pool,Task.Run for heavy computation,Long-running CPU work on UI thread,"var result = await Task.Run(() => ProcessLargeDataSet());","var result = ProcessLargeDataSet(); blocking UI",High,https://learn.microsoft.com/en-us/dotnet/standard/parallel-programming/task-based-asynchronous-programming +29,Packaging,Use WinAppSDK correctly,Windows App SDK provides the runtime,WinAppSDK NuGet package and WindowsAppSDK bootstrapper,Mixing UWP and WinUI 3 APIs,"","Using Windows.UI.Xaml instead of Microsoft.UI.Xaml",High,https://learn.microsoft.com/en-us/windows/apps/windows-app-sdk/ +30,Packaging,Use unpackaged or packaged appropriately,Choose deployment model for your scenario,Packaged (MSIX) for Store distribution,Unpackaged without considering API limitations,"None for unpackaged","Assuming all APIs work in unpackaged mode",Medium,https://learn.microsoft.com/en-us/windows/apps/windows-app-sdk/deploy-packaged-apps +31,Packaging,Use single-project MSIX,Simplified packaging for single app,Single-project MSIX packaging,Separate WAP project when not needed,"true in csproj","Separate Windows Application Packaging project for simple apps",Low,https://learn.microsoft.com/en-us/windows/apps/windows-app-sdk/single-project-msix +32,Accessibility,Set AutomationProperties,Enable Narrator and screen reader support,AutomationProperties.Name on all interactive controls,Controls without accessible names,""," without name",High,https://learn.microsoft.com/en-us/windows/apps/design/accessibility/basic-accessibility-information +33,Accessibility,Support keyboard navigation,Full keyboard accessibility,Tab navigation and access keys for all controls,Mouse-only interactions,"","Window.PreviewKeyDown=""OnKeyDown"" with switch over args.Key",High,https://learn.microsoft.com/en-us/windows/apps/develop/input/keyboard-accelerators +57,Styling,Organize resources with merged dictionaries,Share styles and brushes via App.xaml MergedDictionaries instead of duplicating per page,MergedDictionaries in App.xaml for shared styles brushes and colors,Duplicating SolidColorBrush definitions on every page,"",SolidColorBrush Color hardcoded inline on every page,Medium,https://learn.microsoft.com/en-us/windows/apps/develop/platform/xaml/xaml-resource-dictionary +58,Architecture,Use AsyncRelayCommand for async commands,AsyncRelayCommand exposes IsRunning and supports cancellation for IO bound work,[RelayCommand] on async Task method or AsyncRelayCommand for IO work,async void event handlers or fire-and-forget Task.Run from button click,"[RelayCommand] private async Task LoadAsync(CancellationToken ct) { Items = await _service.FetchAsync(ct); }","private async void Button_Click(object s, RoutedEventArgs e) { await LoadAsync(); }",Medium,https://learn.microsoft.com/en-us/dotnet/communitytoolkit/mvvm/asyncrelaycommand +59,Architecture,Use ILogger for structured logging,Microsoft.Extensions.Logging ILogger with DI for structured leveled logs,ILogger injected via constructor for diagnostic logging,Debug.WriteLine or Console.WriteLine for app diagnostics,"public MainViewModel(ILogger logger) { _logger = logger; } _logger.LogInformation(""Loaded {Count} items"", count);","Debug.WriteLine($""Loaded {count} items"");",Medium,https://learn.microsoft.com/en-us/dotnet/core/extensions/logging/overview diff --git a/plugins/codex/plugins/ui-ux-pro-max/skills/ui-ux-pro-max/data/stacks/wpf.csv b/plugins/codex/plugins/ui-ux-pro-max/skills/ui-ux-pro-max/data/stacks/wpf.csv new file mode 100644 index 000000000..d58e3e519 --- /dev/null +++ b/plugins/codex/plugins/ui-ux-pro-max/skills/ui-ux-pro-max/data/stacks/wpf.csv @@ -0,0 +1,57 @@ +No,Category,Guideline,Description,Do,Don't,Code Good,Code Bad,Severity,Docs URL +1,XAML,Use XAML for declarative UI,Define layout and visuals in XAML not code-behind,XAML for structure and styling,Build UI trees in C# code-behind,"