AI generates a real, editable PowerPoint from any document — native shapes & animations, editable charts & tables you can change the data on, speaker notes voiced as audio narration, and the option to follow your own .pptx template, not slide images · by Hugo He
This report presents the forensic synthetic code analysis of hugohe3/ppt-master, a Python project with 38,969 GitHub stars. SynthScan v2.0 examined 171,882 lines of code across 791 source files, recording 1587 pattern matches distributed across 20 syntactic categories. The overall adjusted score of 13.0 places this repository in the Low AI signal band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
Longitudinal tracking requires multiple scan runs. Once this repository is re-scanned after new commits land, this chart will visualise how the synthetic code signal evolves over time — enabling you to detect whether AI authorship is growing, stabilising, or being actively corrected by human engineers.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 1587 distinct pattern matches across 20 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | requirements.txt | 2 | # ============================================= | COMMENT |
| MEDIUM⚡ | skills/ppt-master/requirements.txt | 2 | # ============================================= | COMMENT |
| MEDIUM⚡ | skills/ppt-master/requirements.txt | 10 | # ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | skills/ppt-master/requirements.txt | 12 | # ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | skills/ppt-master/requirements.txt | 25 | # ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | skills/ppt-master/requirements.txt | 27 | # ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | skills/ppt-master/requirements.txt | 32 | # ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | skills/ppt-master/requirements.txt | 34 | # ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | skills/ppt-master/requirements.txt | 63 | # ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | skills/ppt-master/requirements.txt | 65 | # ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | skills/ppt-master/requirements.txt | 73 | # ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | skills/ppt-master/requirements.txt | 75 | # ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | skills/ppt-master/requirements.txt | 86 | # ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | skills/ppt-master/requirements.txt | 88 | # ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | skills/ppt-master/requirements.txt | 94 | # ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | skills/ppt-master/requirements.txt | 96 | # ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | skills/ppt-master/requirements.txt | 46 | # ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | skills/ppt-master/requirements.txt | 48 | # ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | skills/ppt-master/scripts/register_template.py | 104 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | skills/ppt-master/scripts/register_template.py | 106 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | skills/ppt-master/scripts/register_template.py | 481 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | skills/ppt-master/scripts/register_template.py | 483 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | skills/ppt-master/scripts/register_template.py | 571 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | skills/ppt-master/scripts/register_template.py | 573 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | skills/ppt-master/scripts/register_template.py | 645 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | skills/ppt-master/scripts/register_template.py | 647 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | skills/ppt-master/scripts/config.py | 28 | # ============================================================ | COMMENT |
| MEDIUM | skills/ppt-master/scripts/config.py | 30 | # ============================================================ | COMMENT |
| MEDIUM | skills/ppt-master/scripts/config.py | 50 | # ============================================================ | COMMENT |
| MEDIUM | skills/ppt-master/scripts/config.py | 52 | # ============================================================ | COMMENT |
| MEDIUM | skills/ppt-master/scripts/config.py | 163 | # ============================================================ | COMMENT |
| MEDIUM | skills/ppt-master/scripts/config.py | 165 | # ============================================================ | COMMENT |
| MEDIUM | skills/ppt-master/scripts/config.py | 243 | # ============================================================ | COMMENT |
| MEDIUM | skills/ppt-master/scripts/config.py | 245 | # ============================================================ | COMMENT |
| MEDIUM | skills/ppt-master/scripts/config.py | 317 | # ============================================================ | COMMENT |
| MEDIUM | skills/ppt-master/scripts/config.py | 319 | # ============================================================ | COMMENT |
| MEDIUM | skills/ppt-master/scripts/config.py | 409 | # ============================================================ | COMMENT |
| MEDIUM | skills/ppt-master/scripts/config.py | 411 | # ============================================================ | COMMENT |
| MEDIUM | skills/ppt-master/scripts/config.py | 432 | # ============================================================ | COMMENT |
| MEDIUM | skills/ppt-master/scripts/config.py | 434 | # ============================================================ | COMMENT |
| MEDIUM | skills/ppt-master/scripts/config.py | 488 | # ============================================================ | COMMENT |
| MEDIUM | skills/ppt-master/scripts/config.py | 490 | # ============================================================ | COMMENT |
| MEDIUM | skills/ppt-master/scripts/config.py | 501 | # ============================================================ | COMMENT |
| MEDIUM | skills/ppt-master/scripts/config.py | 503 | # ============================================================ | COMMENT |
| MEDIUM | skills/ppt-master/scripts/config.py | 634 | # ============================================================ | COMMENT |
| MEDIUM | skills/ppt-master/scripts/config.py | 636 | # ============================================================ | COMMENT |
| MEDIUM | skills/ppt-master/scripts/svg_position_calculator.py | 55 | # ============================================================================= | COMMENT |
| MEDIUM | skills/ppt-master/scripts/svg_position_calculator.py | 57 | # ============================================================================= | COMMENT |
| MEDIUM | skills/ppt-master/scripts/svg_position_calculator.py | 152 | # ============================================================================= | COMMENT |
| MEDIUM | skills/ppt-master/scripts/svg_position_calculator.py | 154 | # ============================================================================= | COMMENT |
| MEDIUM | skills/ppt-master/scripts/svg_position_calculator.py | 303 | # ============================================================================= | COMMENT |
| MEDIUM | skills/ppt-master/scripts/svg_position_calculator.py | 305 | # ============================================================================= | COMMENT |
| MEDIUM | skills/ppt-master/scripts/svg_position_calculator.py | 452 | # ============================================================================= | COMMENT |
| MEDIUM | skills/ppt-master/scripts/svg_position_calculator.py | 454 | # ============================================================================= | COMMENT |
| MEDIUM | skills/ppt-master/scripts/svg_position_calculator.py | 580 | # ============================================================================= | COMMENT |
| MEDIUM | skills/ppt-master/scripts/svg_position_calculator.py | 582 | # ============================================================================= | COMMENT |
| MEDIUM | skills/ppt-master/scripts/svg_position_calculator.py | 678 | # ============================================================================= | COMMENT |
| MEDIUM | skills/ppt-master/scripts/svg_position_calculator.py | 680 | # ============================================================================= | COMMENT |
| MEDIUM | skills/ppt-master/scripts/svg_position_calculator.py | 764 | # ============================================================================= | COMMENT |
| MEDIUM | skills/ppt-master/scripts/svg_position_calculator.py | 766 | # ============================================================================= | COMMENT |
| 220 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | viewer.html | 603 | function handleCollectionCardClick(event) { | CODE |
| LOW | skills/ppt-master/scripts/register_template.py | 347 | def _validate_svg_template_spec( | CODE |
| LOW | skills/ppt-master/scripts/extract_svg_assets.py | 315 | def _existing_placeholder_entries( | CODE |
| LOW | skills/ppt-master/scripts/svg_authoring_view.py | 122 | def _is_hidden_geometry_carrier(element: ET.Element) -> bool: | CODE |
| LOW | skills/ppt-master/scripts/svg_authoring_view.py | 227 | def _rewrite_asset_references( | CODE |
| LOW | skills/ppt-master/scripts/svg_authoring_view.py | 296 | def _nearest_existing_directory(path: Path) -> Path: | CODE |
| LOW | skills/ppt-master/scripts/svg_authoring_view.py | 327 | def _remove_created_directories(created: list[Path]) -> list[str]: | CODE |
| LOW | skills/ppt-master/scripts/svg_authoring_view.py | 339 | def _rollback_published_files( | CODE |
| LOW | skills/ppt-master/scripts/svg_authoring_view.py | 356 | def _publish_existing_directory( | CODE |
| LOW | skills/ppt-master/scripts/pptx_to_svg.py | 41 | def _reconstruction_only_graphics(result: object) -> list[tuple[int, str]]: | CODE |
| LOW | skills/ppt-master/scripts/gemini_watermark_remover.py | 79 | def calculate_watermark_position(width: int, height: int, config: dict[str, int]) -> dict[str, int]: | CODE |
| LOW | skills/ppt-master/scripts/pptx_animations.py | 161 | def normalize_animation_effect( | CODE |
| LOW | skills/ppt-master/scripts/pptx_animations.py | 188 | def normalize_animation_trigger(trigger: object) -> str: | CODE |
| LOW | skills/ppt-master/scripts/pptx_animations.py | 212 | def animation_seconds_to_milliseconds( | CODE |
| LOW | skills/ppt-master/scripts/pptx_animations.py | 236 | def _non_negative_milliseconds(value: object, field: str) -> int: | CODE |
| LOW | skills/ppt-master/scripts/pptx_animations.py | 490 | def create_sequence_timing_xml( | CODE |
| LOW | skills/ppt-master/scripts/pptx_animations.py | 1043 | def validate_slide_animation_structure( | CODE |
| LOW | skills/ppt-master/scripts/pptx_animations.py | 1213 | def read_slide_animation_sequence( | CODE |
| LOW | skills/ppt-master/scripts/pptx_animations.py | 1254 | def validate_generated_animation_xml( | CODE |
| LOW | skills/ppt-master/scripts/pptx_animations.py | 1340 | def validate_pptx_animation_package( | CODE |
| LOW | skills/ppt-master/scripts/pptx_animations.py | 1372 | def object_animation_fingerprint(slide_xml: str | bytes) -> str | None: | CODE |
| LOW | skills/ppt-master/scripts/pptx_animations.py | 1438 | def entrance_animation_fingerprint(slide_xml: str | bytes) -> str | None: | CODE |
| LOW | skills/ppt-master/scripts/pptx_animations.py | 1443 | def get_available_transitions() -> list: | CODE |
| LOW | skills/ppt-master/scripts/project_utils.py | 221 | def validate_project_structure(project_path: str, verbose: bool = False) -> Tuple[bool, List[str], List[str]]: | CODE |
| LOW | skills/ppt-master/scripts/latex_render.py | 347 | def _make_png_background_transparent( | CODE |
| LOW | skills/ppt-master/scripts/update_repo.py | 112 | def ensure_clean_tracked_worktree() -> None: | CODE |
| LOW | skills/ppt-master/scripts/image_gen.py | 347 | def _confirmed_image_ai_path_for_manifest(manifest_path: str) -> str | None: | CODE |
| LOW | skills/ppt-master/scripts/image_gen.py | 365 | def _guard_confirmed_non_api_path(manifest_path: str) -> None: | CODE |
| LOW | skills/ppt-master/scripts/image_gen.py | 675 | def render_manifest_md_to_file(manifest_path: str, manifest: dict | None = None) -> str: | CODE |
| LOW | skills/ppt-master/scripts/analyze_images.py | 96 | def _warn_office_vectors_without_manifest(images_dir: str, manifest: dict[str, dict]) -> None: | CODE |
| LOW | skills/ppt-master/scripts/analyze_images.py | 243 | def compute_layout_dimensions( | CODE |
| LOW | skills/ppt-master/scripts/analyze_images.py | 271 | def _try_left_right_height_first() -> dict | None: | CODE |
| LOW | skills/ppt-master/scripts/analyze_images.py | 285 | def _try_left_right_width_constrained() -> dict: | CODE |
| LOW⚡ | skills/ppt-master/scripts/image_search.py | 227 | def _is_keyed_provider_unconfigured(provider_name: str, exc: Exception) -> bool: | CODE |
| LOW⚡ | skills/ppt-master/scripts/image_search.py | 266 | def _validate_downloaded_quality(path: Path) -> bool: | CODE |
| LOW | skills/ppt-master/scripts/image_search.py | 186 | def _warn_weak_required_terms(required_terms: tuple[str, ...]) -> None: | CODE |
| LOW | skills/ppt-master/scripts/image_search.py | 507 | def _candidate_to_manifest_item( | CODE |
| LOW | skills/ppt-master/scripts/image_search.py | 877 | def _resolve_search_concurrency(cli_value: Optional[int]) -> int: | CODE |
| LOW | skills/ppt-master/scripts/native_narration_pptx.py | 117 | def _non_negative_seconds_arg(value: str) -> float: | CODE |
| LOW | skills/ppt-master/scripts/native_narration_pptx.py | 155 | def _relationship_file_for_part(extract_dir: Path, part_name: str) -> Path: | CODE |
| LOW | skills/ppt-master/scripts/native_narration_pptx.py | 171 | def _remove_relationships_by_type(rels_path: Path, rel_type: str) -> None: | CODE |
| LOW⚡ | skills/ppt-master/scripts/svg_quality_checker.py | 1226 | def _check_forbidden_elements(self, content: str, root: ET.Element, result: Dict): | CODE |
| LOW⚡ | skills/ppt-master/scripts/svg_quality_checker.py | 4075 | def _collect_layout_pattern_ids(rows: List[Dict[str, str]]) -> set[int]: | CODE |
| LOW⚡ | skills/ppt-master/scripts/svg_quality_checker.py | 4082 | def _load_project_lock_images(self, project_path: Path) -> set[str]: | CODE |
| LOW | skills/ppt-master/scripts/svg_quality_checker.py | 418 | def _declared_pptx_structure_mode(project_path: Path) -> str | None: | CODE |
| LOW | skills/ppt-master/scripts/svg_quality_checker.py | 432 | def _generated_theme_contract_errors(project_path: Path) -> List[str]: | CODE |
| LOW | skills/ppt-master/scripts/svg_quality_checker.py | 465 | def _placeholder_bounds_error(value: str) -> str | None: | CODE |
| LOW | skills/ppt-master/scripts/svg_quality_checker.py | 481 | def _local_pptx_structure_errors( | CODE |
| LOW | skills/ppt-master/scripts/svg_quality_checker.py | 757 | def _declared_template_structure_mode(target_path: Path) -> str | None: | CODE |
| LOW | skills/ppt-master/scripts/svg_quality_checker.py | 778 | def _template_structure_checks_enabled(target_path: Path) -> bool: | CODE |
| LOW | skills/ppt-master/scripts/svg_quality_checker.py | 817 | def _marker_polygon_vertex_count(raw: str) -> int | None: | CODE |
| LOW | skills/ppt-master/scripts/svg_quality_checker.py | 831 | def _effective_presentation_value( | CODE |
| LOW | skills/ppt-master/scripts/svg_quality_checker.py | 866 | def _parse_placeholders_fallback(block: str) -> Dict[str, Tuple[str, ...]]: | CODE |
| LOW | skills/ppt-master/scripts/svg_quality_checker.py | 1308 | def _check_paint_compatibility( | CODE |
| LOW | skills/ppt-master/scripts/svg_quality_checker.py | 1411 | def _check_reference_spelling(self, root: ET.Element, result: Dict) -> None: | CODE |
| LOW | skills/ppt-master/scripts/svg_quality_checker.py | 1514 | def _check_authoring_property_contract( | CODE |
| LOW | skills/ppt-master/scripts/svg_quality_checker.py | 1571 | def _check_definition_contract( | CODE |
| LOW | skills/ppt-master/scripts/svg_quality_checker.py | 1585 | def _check_paint_reference_contract( | CODE |
| LOW | skills/ppt-master/scripts/svg_quality_checker.py | 1730 | def _check_clip_path_contract( | CODE |
| LOW | skills/ppt-master/scripts/svg_quality_checker.py | 1810 | def _check_gradient_interfaces(self, root: ET.Element, result: Dict) -> None: | CODE |
| 498 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | skills/ppt-master/scripts/pptx_intake.py | 269 | print(f"Error: source not found: {source}", file=sys.stderr) | CODE |
| MEDIUM | skills/ppt-master/scripts/pptx_intake.py | 274 | print(f"Error: PPTX intake failed: {exc}", file=sys.stderr) | CODE |
| LOW | skills/ppt-master/scripts/visual_review.py | 165 | except Exception as e: # noqa: BLE001 | STRING |
| LOW | skills/ppt-master/scripts/visual_review.py | 187 | except Exception as e: # noqa: BLE001 — best-effort per-page | STRING |
| LOW | skills/ppt-master/scripts/visual_review.py | 281 | except Exception as e: # noqa: BLE001 — browser launch failure | CODE |
| LOW | skills/ppt-master/scripts/finalize_svg.py | 99 | except Exception as e: | CODE |
| MEDIUM | skills/ppt-master/scripts/check_annotations.py | 113 | print(f"Error: Path not found: {target}", file=sys.stderr) | CODE |
| MEDIUM | skills/ppt-master/scripts/check_annotations.py | 122 | print(f"Error: Expected a project directory or .svg file, got: {target}", file=sys.stderr) | CODE |
| MEDIUM | skills/ppt-master/scripts/register_template.py | 683 | print(f"Error: {args.kind} directory not found: {spec_dir}", file=sys.stderr) | CODE |
| MEDIUM | skills/ppt-master/scripts/register_template.py | 691 | print(f"Error: {tid}: {exc}", file=sys.stderr) | CODE |
| MEDIUM | skills/ppt-master/scripts/total_md_split.py | 130 | print(f"Error: {svg_dir} directory does not exist") | CODE |
| MEDIUM⚡ | skills/ppt-master/scripts/total_md_split.py | 151 | print(f"Error: {md_path} file does not exist") | CODE |
| LOW⚡ | skills/ppt-master/scripts/total_md_split.py | 157 | except Exception as e: | CODE |
| MEDIUM⚡ | skills/ppt-master/scripts/total_md_split.py | 158 | print(f"Error: Unable to read file {md_path}: {e}") | CODE |
| MEDIUM | skills/ppt-master/scripts/total_md_split.py | 247 | print("Error: No notes content found") | CODE |
| LOW | skills/ppt-master/scripts/total_md_split.py | 267 | except Exception as e: | CODE |
| MEDIUM | skills/ppt-master/scripts/total_md_split.py | 304 | print(f"Error: Path does not exist: {project_path}") | STRING |
| MEDIUM | skills/ppt-master/scripts/total_md_split.py | 326 | print("Error: No SVG files found") | STRING |
| MEDIUM | skills/ppt-master/scripts/total_md_split.py | 338 | print("Error: No notes content found") | STRING |
| MEDIUM | skills/ppt-master/scripts/total_md_split.py | 349 | print("Error: SVG files and notes do not match") | STRING |
| MEDIUM⚡ | skills/ppt-master/scripts/svg_authoring_view.py | 519 | print(f"Error: input does not exist: {input_path}", file=sys.stderr) | CODE |
| MEDIUM⚡ | skills/ppt-master/scripts/svg_authoring_view.py | 522 | print(f"Error: output path is not a directory: {output_dir}", file=sys.stderr) | CODE |
| MEDIUM⚡ | skills/ppt-master/scripts/svg_authoring_view.py | 525 | print("Error: output directory must not be inside the input directory", file=sys.stderr) | CODE |
| MEDIUM⚡ | skills/ppt-master/scripts/svg_authoring_view.py | 531 | print(f"Error: {exc}", file=sys.stderr) | CODE |
| MEDIUM⚡ | skills/ppt-master/scripts/svg_authoring_view.py | 536 | print(f"Error: output would overwrite source SVG: {same_file[0]}", file=sys.stderr) | CODE |
| MEDIUM | skills/ppt-master/scripts/svg_authoring_view.py | 560 | print(f"Error: {exc}", file=sys.stderr) | CODE |
| MEDIUM | skills/ppt-master/scripts/batch_validate.py | 32 | print("Error: Unable to import project_utils module") | CODE |
| MEDIUM | skills/ppt-master/scripts/pptx_to_svg.py | 105 | print(f"Error: file does not exist: {pptx_path}", file=sys.stderr) | CODE |
| MEDIUM | skills/ppt-master/scripts/pptx_to_svg.py | 108 | print(f"Error: expected a .pptx file, got: {pptx_path.name}", file=sys.stderr) | CODE |
| MEDIUM | skills/ppt-master/scripts/animation_config.py | 82 | print(f'Error: Project path does not exist: {project_path}', file=sys.stderr) | CODE |
| MEDIUM | skills/ppt-master/scripts/animation_config.py | 93 | print(f'Error: {exc}', file=sys.stderr) | CODE |
| LOW | skills/ppt-master/scripts/animation_config.py | 110 | except Exception as exc: | CODE |
| MEDIUM | skills/ppt-master/scripts/animation_config.py | 111 | print(f'Error: {exc}', file=sys.stderr) | CODE |
| MEDIUM | skills/ppt-master/scripts/animation_config.py | 122 | print(f'Error: {error}', file=sys.stderr) | CODE |
| MEDIUM | skills/ppt-master/scripts/animation_config.py | 137 | print(f'Error: {error}', file=sys.stderr) | CODE |
| MEDIUM | skills/ppt-master/scripts/svg_position_calculator.py | 1227 | print(f"Error: {e}") | CODE |
| LOW | skills/ppt-master/scripts/svg_position_calculator.py | 1226 | except Exception as e: | CODE |
| MEDIUM | skills/ppt-master/scripts/gemini_watermark_remover.py | 173 | print(f"Error: Watermark background image not found: {bg_path}") | CODE |
| MEDIUM | skills/ppt-master/scripts/gemini_watermark_remover.py | 217 | print(f"Error: File not found: {args.input}") | STRING |
| LOW | skills/ppt-master/scripts/project_utils.py | 349 | except Exception as e: | CODE |
| MEDIUM | skills/ppt-master/scripts/latex_render.py | 595 | print(f"Error: project directory not found: {project_path}", file=sys.stderr) | CODE |
| MEDIUM | skills/ppt-master/scripts/latex_render.py | 614 | print(f"Error: {exc}", file=sys.stderr) | CODE |
| MEDIUM | skills/ppt-master/scripts/preset_shape_svg.py | 188 | print(f"Error: {exc}", file=sys.stderr) | CODE |
| MEDIUM | skills/ppt-master/scripts/image_gen.py | 321 | print(f"Error: Unknown IMAGE_BACKEND='{backend_name}'. Supported: {supported}") | CODE |
| LOW | skills/ppt-master/scripts/image_gen.py | 468 | except Exception: | CODE |
| LOW | skills/ppt-master/scripts/image_gen.py | 536 | except Exception as exc: # noqa: BLE001 — backend raises arbitrary types | CODE |
| MEDIUM | skills/ppt-master/scripts/image_gen.py | 792 | print(f"Error: manifest file not found: {args.render_md}") | CODE |
| MEDIUM | skills/ppt-master/scripts/image_gen.py | 797 | print(f"Error: {e}") | CODE |
| MEDIUM | skills/ppt-master/scripts/image_gen.py | 810 | print(f"Error: {e}") | CODE |
| MEDIUM | skills/ppt-master/scripts/image_gen.py | 822 | print(f"Error: manifest file not found: {args.manifest}") | CODE |
| MEDIUM | skills/ppt-master/scripts/image_gen.py | 827 | print(f"Error: {e}") | CODE |
| MEDIUM | skills/ppt-master/scripts/image_gen.py | 871 | print(f"Error: {e}") | CODE |
| MEDIUM | skills/ppt-master/scripts/image_gen.py | 874 | print(f"Error: {e}") | CODE |
| MEDIUM | skills/ppt-master/scripts/analyze_images.py | 38 | print("Error: PIL/Pillow not installed. Run: pip install Pillow") | CODE |
| LOW | skills/ppt-master/scripts/analyze_images.py | 355 | except Exception as e: | CODE |
| MEDIUM⚡ | skills/ppt-master/scripts/analyze_images.py | 557 | print(f"Error: Directory not found: {images_dir}") | CODE |
| MEDIUM⚡ | skills/ppt-master/scripts/analyze_images.py | 561 | print(f"Error: Not a directory: {images_dir}") | CODE |
| MEDIUM⚡ | skills/ppt-master/scripts/analyze_images.py | 566 | print(f"Error: Unknown canvas format '{canvas_key}'. Available: {', '.join(sorted(CANVAS_FORMATS.keys()))}") | CODE |
| MEDIUM | skills/ppt-master/scripts/image_search.py | 634 | print(f"Error: {cand_meta_path} not found.", file=sys.stderr) | CODE |
| MEDIUM | skills/ppt-master/scripts/image_search.py | 652 | print(f"Error: {src_path} does not exist on disk.", file=sys.stderr) | CODE |
| 124 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | skills/ppt-master/scripts/pptx_intake.py | 20 | CODE | |
| LOW | skills/ppt-master/scripts/visual_review.py | 28 | CODE | |
| LOW | skills/ppt-master/scripts/beautify_inventory.py | 25 | CODE | |
| LOW | skills/ppt-master/scripts/register_template.py | 38 | CODE | |
| LOW | skills/ppt-master/scripts/extract_svg_assets.py | 29 | CODE | |
| LOW | skills/ppt-master/scripts/config.py | 21 | CODE | |
| LOW | skills/ppt-master/scripts/svg_authoring_view.py | 26 | CODE | |
| LOW | skills/ppt-master/scripts/native_enhance_pptx.py | 24 | CODE | |
| LOW | skills/ppt-master/scripts/batch_validate.py | 24 | CODE | |
| LOW | skills/ppt-master/scripts/pptx_to_svg.py | 24 | CODE | |
| LOW | skills/ppt-master/scripts/animation_config.py | 21 | CODE | |
| LOW | skills/ppt-master/scripts/svg_position_calculator.py | 30 | CODE | |
| LOW | skills/ppt-master/scripts/svg_position_calculator.py | 35 | CODE | |
| LOW | skills/ppt-master/scripts/latex_render.py | 23 | CODE | |
| LOW | skills/ppt-master/scripts/preset_shape_svg.py | 23 | CODE | |
| LOW | skills/ppt-master/scripts/update_repo.py | 19 | CODE | |
| LOW | skills/ppt-master/scripts/image_search.py | 39 | CODE | |
| LOW | skills/ppt-master/scripts/native_narration_pptx.py | 25 | CODE | |
| LOW | skills/ppt-master/scripts/console_encoding.py | 4 | CODE | |
| LOW | skills/ppt-master/scripts/pptx_template_import.py | 21 | CODE | |
| LOW | skills/ppt-master/scripts/update_spec.py | 23 | CODE | |
| LOW | skills/ppt-master/scripts/beautify_identity.py | 29 | CODE | |
| LOW | skills/ppt-master/scripts/pptx_transitions.py | 20 | CODE | |
| LOW | skills/ppt-master/scripts/icon_sync.py | 28 | CODE | |
| LOW | skills/ppt-master/scripts/source_to_md.py | 21 | CODE | |
| LOW | skills/ppt-master/scripts/template_preview_pptx.py | 19 | CODE | |
| LOW | skills/ppt-master/scripts/project_manager.py | 11 | CODE | |
| LOW | skills/ppt-master/scripts/notes_to_audio.py | 24 | CODE | |
| LOW | skills/ppt-master/scripts/notes_to_audio.py | 28 | CODE | |
| LOW | skills/ppt-master/scripts/resource_paths.py | 18 | CODE | |
| LOW | …ills/ppt-master/scripts/pptx_to_svg/custgeom_to_svg.py | 19 | CODE | |
| LOW | skills/ppt-master/scripts/pptx_to_svg/color_resolver.py | 11 | CODE | |
| LOW | skills/ppt-master/scripts/pptx_to_svg/pic_to_svg.py | 28 | CODE | |
| LOW | skills/ppt-master/scripts/pptx_to_svg/fill_to_svg.py | 13 | CODE | |
| LOW | skills/ppt-master/scripts/pptx_to_svg/ooxml_loader.py | 8 | CODE | |
| LOW | skills/ppt-master/scripts/pptx_to_svg/ooxml_loader.py | 18 | CODE | |
| LOW | skills/ppt-master/scripts/pptx_to_svg/effect_to_svg.py | 16 | CODE | |
| LOW | …lls/ppt-master/scripts/pptx_to_svg/preset_authoring.py | 18 | CODE | |
| LOW | skills/ppt-master/scripts/pptx_to_svg/converter.py | 14 | CODE | |
| LOW | skills/ppt-master/scripts/pptx_to_svg/__init__.py | 9 | CODE | |
| LOW | skills/ppt-master/scripts/pptx_to_svg/chart_to_svg.py | 8 | CODE | |
| LOW | skills/ppt-master/scripts/pptx_to_svg/shape_walker.py | 17 | CODE | |
| LOW | skills/ppt-master/scripts/pptx_to_svg/chartex_to_svg.py | 9 | CODE | |
| LOW | skills/ppt-master/scripts/pptx_to_svg/slide_to_svg.py | 23 | CODE | |
| LOW | skills/ppt-master/scripts/pptx_to_svg/ln_to_svg.py | 10 | CODE | |
| LOW | skills/ppt-master/scripts/pptx_to_svg/emu_units.py | 13 | CODE | |
| LOW | …ls/ppt-master/scripts/pptx_to_svg/preset_svg_markup.py | 18 | CODE | |
| LOW | …ills/ppt-master/scripts/pptx_to_svg/prstgeom_to_svg.py | 16 | CODE | |
| LOW | …t-master/scripts/pptx_to_svg/preset_registry_to_svg.py | 17 | CODE | |
| LOW | skills/ppt-master/scripts/pptx_to_svg/txbody_to_svg.py | 23 | CODE | |
| LOW | …ppt-master/scripts/pptx_to_svg/normalized_chart_svg.py | 9 | CODE | |
| LOW | skills/ppt-master/scripts/pptx_to_svg/tbl_to_svg.py | 37 | CODE | |
| LOW | skills/ppt-master/scripts/template_import/manifest.py | 21 | CODE | |
| LOW | skills/ppt-master/scripts/template_import/manifest.py | 23 | CODE | |
| LOW | …ppt-master/scripts/template_import/native_structure.py | 17 | CODE | |
| LOW | skills/ppt-master/scripts/pptx_shapes/xml_safety.py | 4 | CODE | |
| LOW | skills/ppt-master/scripts/pptx_shapes/models.py | 17 | CODE | |
| LOW | skills/ppt-master/scripts/pptx_shapes/formula.py | 18 | CODE | |
| LOW | skills/ppt-master/scripts/pptx_shapes/semantic_hash.py | 18 | CODE | |
| LOW | skills/ppt-master/scripts/pptx_shapes/registry.py | 17 | CODE | |
| 150 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | skills/ppt-master/scripts/slice_images.py | 151 | CODE | |
| LOW | skills/ppt-master/scripts/visual_review.py | 127 | CODE | |
| LOW | skills/ppt-master/scripts/finalize_svg.py | 105 | CODE | |
| LOW | skills/ppt-master/scripts/config.py | 666 | CODE | |
| LOW | skills/ppt-master/scripts/total_md_split.py | 136 | CODE | |
| LOW | skills/ppt-master/scripts/svg_authoring_view.py | 411 | CODE | |
| LOW | skills/ppt-master/scripts/batch_validate.py | 218 | CODE | |
| LOW | skills/ppt-master/scripts/svg_position_calculator.py | 995 | CODE | |
| LOW | skills/ppt-master/scripts/svg_position_calculator.py | 1090 | CODE | |
| LOW | skills/ppt-master/scripts/svg_position_calculator.py | 1230 | CODE | |
| LOW | skills/ppt-master/scripts/svg_position_calculator.py | 1296 | CODE | |
| LOW | skills/ppt-master/scripts/svg_position_calculator.py | 860 | CODE | |
| LOW | skills/ppt-master/scripts/pptx_animations.py | 490 | CODE | |
| LOW | skills/ppt-master/scripts/pptx_animations.py | 938 | CODE | |
| LOW | skills/ppt-master/scripts/pptx_animations.py | 1340 | CODE | |
| LOW | skills/ppt-master/scripts/project_utils.py | 221 | CODE | |
| LOW | skills/ppt-master/scripts/project_utils.py | 315 | CODE | |
| LOW | skills/ppt-master/scripts/project_utils.py | 407 | CODE | |
| LOW | skills/ppt-master/scripts/latex_render.py | 347 | CODE | |
| LOW | skills/ppt-master/scripts/image_gen.py | 476 | CODE | |
| LOW | skills/ppt-master/scripts/analyze_images.py | 224 | CODE | |
| LOW | skills/ppt-master/scripts/analyze_images.py | 314 | CODE | |
| LOW | skills/ppt-master/scripts/analyze_images.py | 397 | CODE | |
| LOW | skills/ppt-master/scripts/image_search.py | 156 | CODE | |
| LOW | skills/ppt-master/scripts/image_search.py | 386 | CODE | |
| LOW | skills/ppt-master/scripts/image_search.py | 952 | CODE | |
| LOW | skills/ppt-master/scripts/native_narration_pptx.py | 673 | CODE | |
| LOW | skills/ppt-master/scripts/svg_quality_checker.py | 481 | CODE | |
| LOW | skills/ppt-master/scripts/svg_quality_checker.py | 866 | CODE | |
| LOW | skills/ppt-master/scripts/svg_quality_checker.py | 1308 | CODE | |
| LOW | skills/ppt-master/scripts/svg_quality_checker.py | 1514 | CODE | |
| LOW | skills/ppt-master/scripts/svg_quality_checker.py | 1599 | CODE | |
| LOW | skills/ppt-master/scripts/svg_quality_checker.py | 1886 | CODE | |
| LOW | skills/ppt-master/scripts/svg_quality_checker.py | 2358 | CODE | |
| LOW | skills/ppt-master/scripts/svg_quality_checker.py | 2601 | CODE | |
| LOW | skills/ppt-master/scripts/svg_quality_checker.py | 3111 | CODE | |
| LOW | skills/ppt-master/scripts/svg_quality_checker.py | 3415 | CODE | |
| LOW | skills/ppt-master/scripts/svg_quality_checker.py | 4901 | CODE | |
| LOW | skills/ppt-master/scripts/svg_quality_checker.py | 2630 | CODE | |
| LOW | skills/ppt-master/scripts/beautify_identity.py | 143 | CODE | |
| LOW | skills/ppt-master/scripts/test_svg_quality_checker.py | 374 | CODE | |
| LOW | skills/ppt-master/scripts/test_svg_quality_checker.py | 480 | CODE | |
| LOW | skills/ppt-master/scripts/pptx_transitions.py | 648 | CODE | |
| LOW | skills/ppt-master/scripts/pptx_transitions.py | 958 | CODE | |
| LOW | skills/ppt-master/scripts/pptx_transitions.py | 1043 | CODE | |
| LOW | skills/ppt-master/scripts/pptx_transitions.py | 1134 | CODE | |
| LOW | skills/ppt-master/scripts/template_preview_pptx.py | 124 | CODE | |
| LOW | skills/ppt-master/scripts/template_preview_pptx.py | 160 | CODE | |
| LOW | skills/ppt-master/scripts/project_manager.py | 912 | CODE | |
| LOW | skills/ppt-master/scripts/project_manager.py | 605 | CODE | |
| LOW | skills/ppt-master/scripts/rotate_images.py | 126 | CODE | |
| LOW | skills/ppt-master/scripts/rotate_images.py | 297 | CODE | |
| LOW | skills/ppt-master/scripts/rotate_images.py | 328 | CODE | |
| LOW | skills/ppt-master/scripts/notes_to_audio.py | 80 | CODE | |
| LOW | skills/ppt-master/scripts/pptx_to_svg/color_resolver.py | 178 | CODE | |
| LOW | skills/ppt-master/scripts/pptx_to_svg/color_resolver.py | 239 | CODE | |
| LOW | skills/ppt-master/scripts/pptx_to_svg/color_resolver.py | 124 | CODE | |
| LOW | skills/ppt-master/scripts/pptx_to_svg/ooxml_loader.py | 278 | CODE | |
| LOW | skills/ppt-master/scripts/pptx_to_svg/ooxml_loader.py | 290 | CODE | |
| LOW | skills/ppt-master/scripts/pptx_to_svg/ooxml_loader.py | 302 | CODE | |
| 134 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | skills/ppt-master/SKILL.md | 161 | ### Step 1: Source Content Processing | COMMENT |
| LOW | skills/ppt-master/SKILL.md | 203 | ### Step 2: Project Initialization | COMMENT |
| LOW | skills/ppt-master/SKILL.md | 236 | ### Step 3: Template Option | COMMENT |
| LOW | skills/ppt-master/SKILL.md | 372 | ### Step 4: Strategist Phase (MANDATORY — cannot be skipped) | COMMENT |
| LOW | skills/ppt-master/SKILL.md | 530 | ### Step 5: Image Acquisition Phase (Conditional) | COMMENT |
| LOW | skills/ppt-master/SKILL.md | 595 | ### Step 6: Executor Phase | COMMENT |
| LOW | skills/ppt-master/SKILL.md | 677 | ### Step 7: Post-processing & Export | COMMENT |
| LOW | skills/ppt-master/workflows/refine-spec.md | 27 | ## Step 1: Produce the full spec | COMMENT |
| LOW | skills/ppt-master/workflows/refine-spec.md | 56 | ## Step 3: Hand back | COMMENT |
| LOW | skills/ppt-master/workflows/verify-charts.md | 21 | ## Step 1: Build the page list from the design spec | COMMENT |
| LOW | skills/ppt-master/workflows/verify-charts.md | 57 | ## Step 2: Per page — read SVG, run calculator, compare, update | COMMENT |
| LOW | skills/ppt-master/workflows/verify-charts.md | 230 | ## Step 3: Per-page receipt | COMMENT |
| LOW | skills/ppt-master/workflows/generate-audio.md | 30 | ## Step 1: Determine the deck's language | COMMENT |
| LOW | skills/ppt-master/workflows/generate-audio.md | 40 | ## Step 2: Choose audio backend and pull the voice catalog | COMMENT |
| LOW | skills/ppt-master/workflows/generate-audio.md | 81 | ## Step 3: One-shot user interaction (mandatory) | COMMENT |
| LOW | skills/ppt-master/workflows/generate-audio.md | 115 | ## Step 4: Execute (no further interaction) | COMMENT |
| LOW | skills/ppt-master/workflows/generate-audio.md | 156 | ## Step 5: Completion report | COMMENT |
| LOW | skills/ppt-master/workflows/topic-research.md | 22 | ## Step 1: Confirm topic | COMMENT |
| LOW | skills/ppt-master/workflows/topic-research.md | 38 | ## Step 2: Gather via web search | COMMENT |
| LOW | skills/ppt-master/workflows/topic-research.md | 75 | ## Step 3: Save materials | COMMENT |
| LOW | skills/ppt-master/workflows/create-template.md | 71 | ## Step 1: Reference Intake & Analysis | COMMENT |
| LOW | skills/ppt-master/workflows/create-template.md | 246 | ## Step 2: Fact-Based Brief Proposal | COMMENT |
| LOW | skills/ppt-master/workflows/create-template.md | 308 | ## Step 3: User Confirmation Gate | COMMENT |
| LOW | skills/ppt-master/workflows/create-template.md | 336 | ## Step 4: Preflight Output + Invoke Template_Designer | COMMENT |
| LOW | skills/ppt-master/workflows/create-template.md | 451 | ## Step 5: Validate Template Assets | COMMENT |
| LOW | skills/ppt-master/workflows/create-template.md | 507 | ## Step 6: Template Review PPTX and Multi-Master Package Gate | COMMENT |
| LOW | skills/ppt-master/workflows/create-template.md | 542 | ## Step 7: Register Template in Library Index (Library Scope Only) | COMMENT |
| LOW | skills/ppt-master/workflows/create-template.md | 623 | ## Step 8: Output Confirmation | COMMENT |
| LOW | skills/ppt-master/workflows/template-fill-pptx.md | 40 | ## Step 1: Inputs | COMMENT |
| LOW | skills/ppt-master/workflows/template-fill-pptx.md | 54 | ## Step 2: Create the Project Workspace | COMMENT |
| LOW | skills/ppt-master/workflows/template-fill-pptx.md | 78 | ## Step 3: Extract the PPTX Intake Bundle | COMMENT |
| LOW | skills/ppt-master/workflows/template-fill-pptx.md | 121 | ## Step 4: Build the Fill Plan | COMMENT |
| LOW | skills/ppt-master/workflows/template-fill-pptx.md | 241 | ## Step 5: Check Text Capacity | COMMENT |
| LOW | skills/ppt-master/workflows/template-fill-pptx.md | 265 | ## Step 6: Apply the Plan | COMMENT |
| LOW | skills/ppt-master/workflows/template-fill-pptx.md | 295 | ## Step 7: Validate Output | COMMENT |
| LOW | skills/ppt-master/workflows/create-brand.md | 26 | ## Step 1: Detect input type | COMMENT |
| LOW | skills/ppt-master/workflows/create-brand.md | 75 | ## Step 3: Chat fill-in (Type A only) | COMMENT |
| LOW | skills/ppt-master/workflows/create-brand.md | 91 | ## Step 4: Materialize the brand workspace | COMMENT |
| LOW | skills/ppt-master/workflows/create-brand.md | 178 | ## Step 5: Validate, register, and hand off | COMMENT |
| LOW | skills/ppt-master/workflows/live-preview.md | 27 | ## Step 1: Start / reopen the editor | COMMENT |
| LOW | skills/ppt-master/workflows/live-preview.md | 48 | ## Step 2: Apply submitted annotations | COMMENT |
| LOW | skills/ppt-master/workflows/resume-execute.md | 25 | ## Step 1: Sanity check | COMMENT |
| LOW | skills/ppt-master/workflows/resume-execute.md | 40 | ## Step 2: Load SKILL.md, proceed from Step 6 | COMMENT |
| LOW | skills/ppt-master/workflows/resume-execute.md | 46 | Then jump to `### Step 6: Executor Phase` and run the documented pipeline: | CODE |
| LOW | skills/ppt-master/workflows/resume-execute.md | 64 | ## Step 3: Hand-back | COMMENT |
| LOW | skills/ppt-master/scripts/finalize_svg.py | 150 | # Step 1: Copy directory | COMMENT |
| LOW | skills/ppt-master/scripts/finalize_svg.py | 168 | # Step 2: Expand project icons, then standard same-document use references. | COMMENT |
| LOW | skills/ppt-master/scripts/finalize_svg.py | 215 | # Step 3: Align (slice/meet) and Base64-embed all <image> in one pass. | COMMENT |
| LOW | skills/ppt-master/scripts/finalize_svg.py | 258 | # Step 4: Flatten text | COMMENT |
| LOW | skills/ppt-master/scripts/svg_editor/static/app.js | 1662 | // Step 2: save annotations. Service lifetime is controlled only by Exit preview. | COMMENT |
| LOW⚡ | …ills/ppt-master/scripts/svg_to_pptx/drawingml/paths.py | 591 | # Step 1: Compute (x1', y1') | COMMENT |
| LOW⚡ | …ills/ppt-master/scripts/svg_to_pptx/drawingml/paths.py | 597 | # Step 2: Compute (cx', cy') | COMMENT |
| LOW⚡ | …ills/ppt-master/scripts/svg_to_pptx/drawingml/paths.py | 622 | # Step 3: Compute (cx, cy) | COMMENT |
| LOW⚡ | …ills/ppt-master/scripts/svg_to_pptx/drawingml/paths.py | 626 | # Step 4: Compute theta1 and dtheta | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | index.html | 622 | this.parentElement.innerHTML = '<div class="placeholder">—</div>'; | CODE |
| LOW | docs/technical-design.md | 533 | ChartEx import is deliberately closed to seven validated data models: `treemap`, `sunburst`, `histogram`, `pareto`, `box | CODE |
| LOW | docs/zh/technical-design.md | 535 | ChartEx 导入被有意限制为 7 个已验证数据模型:`treemap`、`sunburst`、`histogram`、`pareto`、`box_whisker`、`waterfall` 与 `funnel`。其受支持的层级 / 分类 | CODE |
| LOW | skills/ppt-master/SKILL.md | 428 | 4. **Re-derive Stage 3 from the confirmed anchors + design system, then wait for the final confirmation.** Read the stag | CODE |
| LOW | skills/ppt-master/SKILL.md | 822 | > case: `data-pptx-fallback-kind="placeholder"` records its | CODE |
| LOW | skills/ppt-master/references/strategist.md | 367 | > **Recommendation shape.** In `recommendations.json`, write `recommend.image_usage` as source ids, not prose. Use a sin | CODE |
| LOW | skills/ppt-master/references/shared-standards.md | 1228 | reconstruction aid with `data-pptx-fallback-kind="placeholder"`. That value | CODE |
| LOW | skills/ppt-master/references/shared-standards.md | 1248 | `data-pptx-visual-status="placeholder"` plus | CODE |
| LOW | skills/ppt-master/references/shared-standards.md | 1250 | `data-pptx-fallback-kind="placeholder"`; canonical authoring has no route-status | CODE |
| LOW | skills/ppt-master/scripts/pptx_to_svg.py | 55 | if fallback_kind != "placeholder": | CODE |
| LOW | skills/ppt-master/scripts/README.md | 161 | Supported parsed column/bar/line/area, pie/doughnut, scatter, and bubble charts without a baked preview receive a determ | CODE |
| LOW | skills/ppt-master/scripts/svg_quality_checker.py | 2834 | if fallback_kind == 'placeholder': | CODE |
| LOW | skills/ppt-master/scripts/svg_quality_checker.py | 3925 | if self._row_acquire(row) in {'ai', 'web', 'user', 'placeholder', 'slice'} | CODE |
| LOW | skills/ppt-master/scripts/test_svg_quality_checker.py | 454 | <g id="placeholder" data-pptx-fallback-kind="placeholder"> | STRING |
| LOW | skills/ppt-master/scripts/test_svg_quality_checker.py | 469 | <g id="placeholder" data-pptx-visual-status="placeholder"> | STRING |
| LOW | skills/ppt-master/scripts/pptx_to_svg/slide_to_svg.py | 887 | replacement_attrs.append('data-pptx-fallback-kind="placeholder"') | CODE |
| LOW | …lls/ppt-master/scripts/confirm_ui/static/catalogs.json | 457 | "id": "placeholder", | CODE |
| LOW | skills/ppt-master/scripts/docs/conversion.md | 282 | `data-pptx-fallback-kind="placeholder"`. Validation and export report that | CODE |
| LOW | …cripts/svg_to_pptx/native_objects/marker_attributes.py | 179 | f"because {FALLBACK_KIND_ATTR}='placeholder' already implies the " | CODE |
| LOW | …er/scripts/svg_to_pptx/native_objects/marker_status.py | 25 | VISUAL_STATUSES = frozenset({"source-preview", "normalized", "placeholder"}) | CODE |
| LOW⚡ | …er/scripts/svg_to_pptx/native_objects/marker_status.py | 159 | and visual == "placeholder" | CODE |
| LOW⚡ | …er/scripts/svg_to_pptx/native_objects/marker_status.py | 163 | f"{LEGACY_FALLBACK_KIND_ATTR}='placeholder' requires " | CODE |
| LOW⚡ | …er/scripts/svg_to_pptx/native_objects/marker_status.py | 166 | if route == "reconstruction-only" and visual != "placeholder": | CODE |
| LOW⚡ | …er/scripts/svg_to_pptx/native_objects/marker_status.py | 169 | f"{FALLBACK_KIND_ATTR}='placeholder'" | CODE |
| LOW | …lls/ppt-master/scripts/svg_to_pptx/pptx_package/cli.py | 172 | if native_fallback_kind(elem) != 'placeholder': | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | …t-master/scripts/image_backends/backend_siliconflow.py | 0 | resolve the target resolution for a ratio and logical size preset. | STRING |
| HIGH | …ills/ppt-master/scripts/image_backends/backend_qwen.py | 0 | resolve the target resolution for a ratio and logical size preset. | STRING |
| HIGH | …lls/ppt-master/scripts/image_backends/backend_zhipu.py | 0 | resolve the target resolution for a ratio and logical size preset. | STRING |
| HIGH | …pt-master/scripts/image_backends/backend_volcengine.py | 0 | resolve the target resolution for a ratio and logical size preset. | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | skills/ppt-master/scripts/finalize_svg.py | 130 | # Check if svg_output exists | COMMENT |
| LOW | skills/ppt-master/scripts/total_md_split.py | 227 | # Check if a corresponding heading exists in the notes | COMMENT |
| LOW | skills/ppt-master/scripts/batch_validate.py | 144 | # Print result | COMMENT |
| LOW | skills/ppt-master/scripts/project_utils.py | 243 | # Check if directory exists | COMMENT |
| LOW | skills/ppt-master/scripts/project_utils.py | 379 | # Check if it's a valid project directory (contains svg_output or design spec) | COMMENT |
| LOW | skills/ppt-master/scripts/analyze_images.py | 333 | # Check if it is an image file | COMMENT |
| LOW⚡ | skills/ppt-master/scripts/svg_quality_checker.py | 1217 | # Check if it matches expected format | COMMENT |
| LOW | skills/ppt-master/scripts/source_to_md/web_to_md.py | 362 | # Check if image is webp and convert to png | COMMENT |
| LOW | skills/ppt-master/scripts/source_to_md/web_to_md.py | 585 | # Check if it has lots of text even without p tags (br tags?) | COMMENT |
| LOW | skills/ppt-master/scripts/source_to_md/pdf_to_md.py | 1432 | # Check if this is table content | COMMENT |
| LOW | skills/ppt-master/scripts/source_to_md/pdf_to_md.py | 1444 | # Check if this is noise text to be filtered (whole block match) | COMMENT |
| LOW | …ls/ppt-master/scripts/svg_finalize/fix_image_aspect.py | 299 | # Check if modification is needed | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | skills/ppt-master/scripts/native_narration_pptx.py | 401 | def _update_content_types(extract_dir: Path, note_indices: set[int], audio_exts: set[str]) -> None: | CODE |
| LOW | skills/ppt-master/scripts/pptx_to_svg/__init__.py | 11 | __all__ = ["convert_pptx_to_svg"] | CODE |
| LOW | skills/ppt-master/scripts/pptx_shapes/__init__.py | 69 | __all__ = [ | CODE |
| LOW | …lls/ppt-master/scripts/template_fill_pptx/text_fill.py | 61 | def _set_paragraph_text(paragraph: ET.Element, text: str) -> None: | CODE |
| LOW | …lls/ppt-master/scripts/template_fill_pptx/text_fill.py | 68 | def _set_container_text(container: ET.Element, text: str) -> None: | CODE |
| LOW | …ls/ppt-master/scripts/template_fill_pptx/chart_fill.py | 110 | def _set_val_attr(element: ET.Element, value: str | int | float) -> None: | CODE |
| LOW | …ls/ppt-master/scripts/template_fill_pptx/chart_fill.py | 146 | def _set_series_name(series: ET.Element, name: str, column_index: int) -> None: | CODE |
| LOW | …ls/ppt-master/scripts/template_fill_pptx/chart_fill.py | 157 | def _set_category_cache(series: ET.Element, categories: list[str]) -> None: | CODE |
| LOW | …ls/ppt-master/scripts/template_fill_pptx/chart_fill.py | 168 | def _set_value_cache(series: ET.Element, values: list[Any], column_index: int) -> None: | CODE |
| LOW | …ills/ppt-master/scripts/template_fill_pptx/__init__.py | 20 | __all__ = [ | CODE |
| LOW | skills/ppt-master/scripts/source_to_md/ppt_to_md.py | 802 | def _update_manifest_usage(entry: dict[str, object]) -> None: | CODE |
| LOW | skills/ppt-master/scripts/svg_to_pptx/__init__.py | 13 | __all__ = [ | CODE |
| LOW | …-master/scripts/svg_to_pptx/native_objects/__init__.py | 74 | __all__ = [ | CODE |
| LOW | …t-master/scripts/svg_to_pptx/drawingml/theme_colors.py | 221 | def _set_scheme_color(parent: ET.Element, slot: str, color: str) -> None: | CODE |
| LOW | …ppt-master/scripts/svg_to_pptx/pptx_package/builder.py | 489 | def _set_shape_name(elem: ET.Element, name: str) -> None: | CODE |
| LOW | …ppt-master/scripts/svg_to_pptx/pptx_package/builder.py | 899 | def _set_master_picker_name(master_path: Path, master_name: str) -> None: | CODE |
| LOW | …ppt-master/scripts/svg_to_pptx/pptx_package/builder.py | 1156 | def _set_slide_layout_target(rels_path: Path, target: str) -> None: | CODE |
| LOW | …/ppt-master/scripts/svg_finalize/align_embed_images.py | 283 | def _set_href(image: ET.Element, value: str) -> None: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | skills/ppt-master/scripts/finalize_svg.py | 150 | # Step 1: Copy directory | COMMENT |
| LOW | skills/ppt-master/scripts/finalize_svg.py | 168 | # Step 2: Expand project icons, then standard same-document use references. | COMMENT |
| LOW | skills/ppt-master/scripts/finalize_svg.py | 215 | # Step 3: Align (slice/meet) and Base64-embed all <image> in one pass. | COMMENT |
| LOW | skills/ppt-master/scripts/finalize_svg.py | 258 | # Step 4: Flatten text | COMMENT |
| LOW | skills/ppt-master/scripts/svg_editor/static/app.js | 1662 | // Step 2: save annotations. Service lifetime is controlled only by Exit preview. | COMMENT |
| LOW⚡ | …ills/ppt-master/scripts/svg_to_pptx/drawingml/paths.py | 591 | # Step 1: Compute (x1', y1') | COMMENT |
| LOW⚡ | …ills/ppt-master/scripts/svg_to_pptx/drawingml/paths.py | 597 | # Step 2: Compute (cx', cy') | COMMENT |
| LOW⚡ | …ills/ppt-master/scripts/svg_to_pptx/drawingml/paths.py | 622 | # Step 3: Compute (cx, cy) | COMMENT |
| LOW⚡ | …ills/ppt-master/scripts/svg_to_pptx/drawingml/paths.py | 626 | # Step 4: Compute theta1 and dtheta | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …s/ppt169_image_text_showcase/images/image_prompts.json | 200 | "prompt": "Strict Swiss-grid minimalism — Müller-Brockmann / Bauhaus aesthetic. A single bold geometric compositio | CODE |
| MEDIUM | skills/ppt-master/scripts/svg_position_calculator.py | 1014 | # Use more robust element extraction (attribute order independent) | COMMENT |
| MEDIUM | skills/ppt-master/scripts/confirm_ui/server.py | 103 | # parent (waiting) command returns before the calling harness kills it. The | COMMENT |
| LOW | skills/ppt-master/scripts/source_to_md/web_to_md.py | 789 | # Let's just return what we gathered. | COMMENT |
| MEDIUM | skills/ppt-master/scripts/source_to_md/doc_to_md.py | 1215 | # Map both full and basename for robust lookup | COMMENT |
| MEDIUM | skills/ppt-master/scripts/svg_editor/static/app.js | 867 | // element's own getCTM ∘ getScreenCTM⁻¹ is robust to how a browser splits | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | skills/ppt-master/scripts/total_md_split.py | 211 | Check the mapping between SVG files and speaker notes Args: svg_files: List of SVG files notes | STRING |
| HIGH | skills/ppt-master/scripts/total_md_split.py | 235 | Split and save notes dictionary into multiple files Args: notes: Notes dictionary (key is heading, val | STRING |
| HIGH | …ppt-master/scripts/svg_to_pptx/pptx_package/builder.py | 4464 | Create a PPTX file with native DrawingML shapes. Args: svg_files: List of SVG files. output_path: O | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | requirements.txt | 1 | # PPT Master Dependencies / PPT Master 依赖 | COMMENT |
| LOW | skills/ppt-master/requirements.txt | 1 | # PPT Master Dependencies / PPT Master 依赖 | COMMENT |
| LOW | skills/ppt-master/requirements.txt | 21 | # notes_to_audio.py generates per-slide narration audio on macOS/Linux/Windows. | COMMENT |
| LOW | skills/ppt-master/requirements.txt | 41 | mammoth>=1.6.0 | COMMENT |
| LOW | skills/ppt-master/requirements.txt | 61 | # Windows: https://pandoc.org/installing.html | COMMENT |
| LOW | skills/ppt-master/requirements.txt | 81 | # Install this to avoid needing Node.js for WeChat / portal pages. | COMMENT |
| LOW | skills/ppt-master/scripts/confirm_ui/static/app.js | 1101 | // Replaced when the Stage-1 visual-style preview mounts. | COMMENT |
| LOW | …ls/ppt-master/scripts/image_sources/provider_common.py | 41 | # Project-wide constants | COMMENT |
| LOW | skills/ppt-master/scripts/docs/image.md | 81 | COMMENT | |
| LOW | skills/ppt-master/scripts/source_to_md/doc_to_md.py | 461 | entry["display_ratio"] = round(pixel_ratio, 6) | COMMENT |
| LOW | …s/ppt-master/scripts/svg_to_pptx/drawingml/elements.py | 1281 | if has_marker: | COMMENT |
| LOW | …ls/ppt-master/scripts/svg_to_pptx/drawingml/context.py | 61 | # approximates it by multiplying this value into each descendant object. | COMMENT |
| LOW | …lls/ppt-master/scripts/svg_to_pptx/drawingml/styles.py | 421 | # also scale proportionally with line width. We should compare the ratio | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | README.md | 22 | Thanks to [Kimi](https://www.kimi.com/code/?aff=ppt-master) for sponsoring this project! [Kimi K2.7](https://platform.ki | CODE |
| MEDIUM | docs/faq.md | 192 | ## Q: Will long decks blow out the context window in one shot? | COMMENT |
| MEDIUM | skills/ppt-master/references/animations.md | 25 | # Build an editable scaffold from real top-level <g id> anchors | COMMENT |
| MEDIUM | skills/ppt-master/workflows/customize-animations.md | 21 | ## 1. Get Real Group IDs (do NOT dump the full scaffold) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | skills/ppt-master/scripts/rotate_images.py | 508 | tasks.push({ | CODE |
| HIGH | skills/ppt-master/scripts/rotate_images.py | 515 | const jsonStr = JSON.stringify(tasks, null, 2); | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | docs/faq.md | 64 | ## Q: Can I use AI-generated images in my presentation? | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | skills/ppt-master/scripts/pptx_to_svg/emu_units.py | 129 | CODE | |
| LOW | skills/ppt-master/scripts/pptx_to_svg/txbody_to_svg.py | 100 | CODE | |
| LOW | skills/ppt-master/scripts/pptx_to_svg/txbody_to_svg.py | 188 | CODE | |
| LOW | …master/scripts/svg_to_pptx/native_objects/chart_xml.py | 301 | CODE | |
| LOW | …/ppt-master/scripts/svg_to_pptx/drawingml/converter.py | 1198 | CODE | |
| LOW | …ls/ppt-master/scripts/svg_to_pptx/drawingml/context.py | 146 | CODE | |
| LOW | …ppt-master/scripts/svg_to_pptx/pptx_package/builder.py | 4421 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | skills/ppt-master/scripts/generate_examples_index.py | 168 | content.append("### Create a New Project\n") | CODE |
| MEDIUM | …ppt-master/scripts/svg_to_pptx/pptx_package/builder.py | 4722 | # Create the standard base PPTX with python-pptx. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | skills/ppt-master/scripts/docs/image.md | 149 | MINIMAX_API_KEY=your-api-key | CODE |