From 7c9f7d0efc6424b3178a04b10a03ce3649404173 Mon Sep 17 00:00:00 2001 From: KeyInfo Bot Date: Sun, 9 Aug 2026 00:02:05 +0800 Subject: [PATCH] Sync third-party and MCP marketplace plugins Constraint: Public skills are published only by explicit administrator action unless they are tracked third-party market sources. Confidence: high Scope-risk: narrow Directive: Keep private/internal skills out of the public marketplace and preserve normal incremental market Git history. Tested: Marketplace validation passed. --- config/external-sources.lock.json | 20 +- .../plugins/caveman/THIRD_PARTY_SOURCE.json | 4 +- .../plugins/guizang-ppt-skill/README.en.md | 74 ++- .../codex/plugins/guizang-ppt-skill/README.md | 74 ++- .../guizang-ppt-skill/THIRD_PARTY_SOURCE.json | 4 +- .../workflows/presenter-runtime-sync.yml | 24 + .../skills/guizang-ppt-skill/README.en.md | 74 ++- .../skills/guizang-ppt-skill/README.md | 74 ++- .../skills/guizang-ppt-skill/SKILL.md | 3 +- .../assets/template-swiss.html | 49 +- .../guizang-ppt-skill/assets/template.html | 49 +- .../docs/unification-plan.md | 6 +- .../guizang-ppt-skill/references/checklist.md | 5 +- .../references/presenter-mode.md | 13 +- .../scripts/check-presenter-runtime-sync.mjs | 39 ++ .../scripts/validate-presenter-mode.mjs | 11 +- .../plugins/mcp-playwright/MCP_SOURCE.json | 2 +- .../next-skills/THIRD_PARTY_SOURCE.json | 4 +- .../ppt-master/THIRD_PARTY_SOURCE.json | 4 +- .../ppt-master/skills/ppt-master/SKILL.md | 1 + .../references/artifact-ownership.md | 4 +- .../ppt-master/references/executor-base.md | 23 +- .../ppt-master/references/executor-chart.md | 226 +++----- .../ppt-master/references/executor-image.md | 43 +- .../references/executor-structure.md | 97 ++++ .../references/executor-structured.md | 4 +- .../ppt-master/references/executor-table.md | 65 +++ .../references/executor-visualization.md | 57 ++ .../references/image-layout-spec.md | 56 +- .../references/image-type-templates/_index.md | 16 +- .../references/image-type-templates/cycle.md | 6 +- .../image-type-templates/framework.md | 4 +- .../references/image-type-templates/matrix.md | 8 +- .../image-type-templates/pyramid.md | 6 +- .../ppt-master/references/modes/briefing.md | 2 +- .../references/modes/instructional.md | 2 +- .../ppt-master/references/modes/narrative.md | 2 +- .../ppt-master/references/modes/pyramid.md | 2 +- .../references/native-data-interface.md | 60 ++- .../references/strategist-template.md | 18 +- .../ppt-master/references/strategist.md | 46 +- .../references/template-designer.md | 4 +- .../ppt-master/references/visual-review.md | 2 +- .../skills/ppt-master/scripts/README.md | 10 +- .../skills/ppt-master/scripts/chart_recall.py | 337 +----------- .../ppt-master/scripts/confirm_ui/server.py | 34 +- .../ppt-master/scripts/docs/chart-recall.md | 57 +- .../ppt-master/scripts/docs/confirm_ui.md | 8 +- .../ppt-master/scripts/docs/conversion.md | 41 +- .../scripts/docs/visualization-recall.md | 107 ++++ .../scripts/generate_examples_index.py | 2 +- .../ppt-master/scripts/narration_sync.py | 16 +- .../ppt-master/scripts/notes_to_audio.py | 227 +++++++- .../project_management/page_context.py | 116 ++++- .../project_management/project_specs.py | 88 +++- .../scripts/prompt_audit_manifest.json | 147 +++++- .../ppt-master/scripts/rotate_images.py | 193 ++++++- .../scripts/tts_backends/backend_common.py | 118 ++++- .../scripts/tts_backends/backend_cosyvoice.py | 222 +++++++- .../scripts/tts_backends/backend_edge.py | 107 ++-- .../tts_backends/backend_elevenlabs.py | 167 +++++- .../scripts/tts_backends/backend_minimax.py | 100 +++- .../scripts/tts_backends/backend_qwen.py | 2 +- .../ppt-master/scripts/video_subtitles.py | 8 +- .../scripts/visualization_catalog.py | 363 +++++++++++++ .../scripts/visualization_recall.py | 486 ++++++++++++++++++ .../skills/ppt-master/templates/README.md | 37 +- ...md => VISUALIZATION_TEMPLATE_AUTHORING.md} | 287 +++++------ .../ppt-master/templates/brands/README.md | 2 +- .../brands/accenture/templates/design_spec.md | 63 +++ .../brands/alibaba/templates/design_spec.md | 63 +++ .../brands/aws/templates/design_spec.md | 63 +++ .../brands/bain/templates/design_spec.md | 63 +++ .../brands/bcg/templates/design_spec.md | 63 +++ .../templates/brands/brands_index.json | 60 +++ .../brands/deloitte/templates/design_spec.md | 63 +++ .../brands/huawei/templates/design_spec.md | 63 +++ .../brands/ibm/templates/design_spec.md | 63 +++ .../brands/jpmorgan/templates/design_spec.md | 63 +++ .../brands/mckinsey/templates/design_spec.md | 63 +++ .../brands/microsoft/templates/design_spec.md | 65 +++ .../brands/nvidia/templates/design_spec.md | 63 +++ .../brands/pwc/templates/design_spec.md | 66 +++ .../brands/tencent/templates/design_spec.md | 63 +++ .../brands/xiaomi/templates/design_spec.md | 63 +++ .../ppt-master/templates/charts/README.md | 104 ++-- .../templates/charts/agenda_list.svg | 142 ----- .../templates/charts/arc_anchored_list.svg | 94 ---- .../templates/charts/basic_table.svg | 163 ------ .../templates/charts/charts_index.json | 164 +----- .../charts/chevron_chain_with_tail.svg | 221 -------- .../templates/charts/chevron_process.svg | 190 ------- .../templates/charts/circular_stages.svg | 145 ------ .../templates/charts/client_server_flow.svg | 182 ------- .../templates/charts/comparison_columns.svg | 119 ----- .../templates/charts/comparison_table.svg | 143 ------ .../templates/charts/concentric_circles.svg | 232 --------- .../templates/charts/consulting_table.svg | 121 ----- .../templates/charts/feature_matrix_table.svg | 83 --- .../charts/financial_statement_table.svg | 216 -------- .../templates/charts/fishbone_diagram.svg | 129 ----- .../templates/charts/harvey_balls_table.svg | 120 ----- .../templates/charts/hub_inward_arrows.svg | 167 ------ .../ppt-master/templates/charts/hub_spoke.svg | 174 ------- .../ppt-master/templates/charts/icon_grid.svg | 131 ----- .../templates/charts/isometric_stairs.svg | 112 ---- .../templates/charts/journey_map.svg | 94 ---- .../ppt-master/templates/charts/kpi_cards.svg | 66 --- .../templates/charts/labeled_card.svg | 64 --- .../templates/charts/layered_architecture.svg | 205 -------- .../templates/charts/line_chart.svg | 2 +- .../templates/charts/matrix_2x2.svg | 9 +- .../ppt-master/templates/charts/mind_map.svg | 148 ------ .../templates/charts/module_composition.svg | 156 ------ .../templates/charts/numbered_steps.svg | 160 ------ .../templates/charts/pipeline_with_stages.svg | 187 ------- .../templates/charts/process_flow.svg | 127 ----- .../charts/project_schedule_table.svg | 110 ---- .../templates/charts/pros_cons_chart.svg | 109 ---- .../templates/charts/pyramid_chart.svg | 117 ----- .../templates/charts/pyramid_isometric.svg | 180 ------- .../charts/quadrant_bubble_scatter.svg | 79 --- .../charts/quadrant_text_bullets.svg | 248 --------- .../templates/charts/roadmap_vertical.svg | 154 ------ .../templates/charts/segmented_wheel.svg | 140 ----- .../templates/charts/snake_flow.svg | 161 ------ .../templates/charts/team_roster.svg | 103 ---- .../ppt-master/templates/charts/timeline.svg | 143 ------ .../templates/charts/top_down_tree.svg | 167 ------ .../templates/charts/venn_diagram.svg | 94 ---- .../templates/charts/vertical_list.svg | 126 ----- .../templates/charts/vertical_pillars.svg | 106 ---- .../ppt-master/templates/decks/README.md | 4 +- .../templates/design_spec_reference.md | 20 +- .../ppt-master/templates/layouts/README.md | 2 +- .../templates/01_hero_full.svg | 34 ++ .../templates/02_hero_side_scrim.svg | 34 ++ .../templates/03_split_bleed.svg | 27 + .../templates/04_split_bleed_reverse.svg | 27 + .../templates/05_chapter_full.svg | 39 ++ .../templates/06_quote_over_image.svg | 33 ++ .../editorial_bleed/templates/07_triptych.svg | 63 +++ .../templates/08_image_grid_four.svg | 69 +++ .../templates/09_full_statement.svg | 21 + .../templates/10_closing_full.svg | 33 ++ .../editorial_bleed/templates/design_spec.md | 72 +++ .../templates/layouts/layouts_index.json | 108 ++++ .../moments_square/templates/01_cover.svg | 29 ++ .../moments_square/templates/02_statement.svg | 21 + .../templates/03_title_content.svg | 27 + .../templates/04_two_column.svg | 35 ++ .../moments_square/templates/05_three_row.svg | 58 +++ .../templates/06_image_center.svg | 27 + .../templates/07_image_full.svg | 27 + .../moments_square/templates/08_ending.svg | 29 ++ .../moments_square/templates/design_spec.md | 64 +++ .../templates/01_title_slide.svg | 21 + .../templates/02_title_content.svg | 21 + .../templates/03_section_header.svg | 21 + .../templates/04_two_content.svg | 29 ++ .../templates/05_comparison.svg | 45 ++ .../templates/06_title_only.svg | 15 + .../templates/07_blank.svg | 7 + .../templates/08_content_caption.svg | 29 ++ .../templates/09_picture_caption.svg | 29 ++ .../templates/10_hero_statement.svg | 21 + .../templates/11_three_card.svg | 37 ++ .../templates/12_kpi_grid.svg | 53 ++ .../templates/13_process_timeline.svg | 55 ++ .../templates/14_stacked_split.svg | 29 ++ .../templates/15_chart_insight.svg | 60 +++ .../templates/16_table_summary.svg | 65 +++ .../templates/design_spec.md | 90 ++++ .../report_core/templates/01_cover.svg | 27 + .../templates/02_section_divider.svg | 27 + .../report_core/templates/03_agenda.svg | 84 +++ .../templates/04_title_content.svg | 35 ++ .../report_core/templates/05_two_content.svg | 45 ++ .../report_core/templates/06_three_block.svg | 53 ++ .../report_core/templates/07_kpi_row.svg | 69 +++ .../templates/08_chart_insight.svg | 74 +++ .../templates/09_table_summary.svg | 79 +++ .../templates/10_process_timeline.svg | 72 +++ .../report_core/templates/11_matrix_2x2.svg | 73 +++ .../report_core/templates/12_appendix.svg | 43 ++ .../report_core/templates/13_closing.svg | 21 + .../report_core/templates/design_spec.md | 82 +++ .../story_vertical/templates/01_cover.svg | 29 ++ .../story_vertical/templates/02_statement.svg | 21 + .../templates/03_title_content.svg | 27 + .../templates/04_numbered_list.svg | 58 +++ .../templates/05_image_full.svg | 27 + .../templates/06_image_top_text.svg | 33 ++ .../story_vertical/templates/07_two_block.svg | 35 ++ .../story_vertical/templates/08_step_flow.svg | 45 ++ .../story_vertical/templates/09_ending.svg | 29 ++ .../story_vertical/templates/design_spec.md | 70 +++ .../xiaohongshu_post/templates/01_cover.svg | 29 ++ .../templates/02_statement.svg | 21 + .../templates/03_title_content.svg | 27 + .../templates/04_numbered_list.svg | 58 +++ .../templates/05_two_card_stack.svg | 35 ++ .../templates/06_image_top_text.svg | 33 ++ .../templates/07_image_full_caption.svg | 27 + .../xiaohongshu_post/templates/08_quote.svg | 30 ++ .../templates/09_step_flow.svg | 45 ++ .../xiaohongshu_post/templates/10_ending.svg | 29 ++ .../xiaohongshu_post/templates/design_spec.md | 72 +++ .../templates/schemas/spec_lock.schema.json | 15 +- .../templates/spec_lock_reference.md | 28 +- .../ppt-master/templates/styles/README.md | 6 +- .../templates/design_spec.md | 81 +++ .../creative-pitch/templates/design_spec.md | 80 +++ .../templates/design_spec.md | 91 ++++ .../investor-pitch/templates/design_spec.md | 81 +++ .../templates/design_spec.md | 78 +++ .../operating-review/templates/design_spec.md | 91 ++++ .../product-launch/templates/design_spec.md | 76 +++ .../templates/design_spec.md | 79 +++ .../templates/design_spec.md | 80 +++ .../templates/styles/styles_index.json | 110 ++++ .../templates/design_spec.md | 88 ++++ .../templates/design_spec.md | 76 +++ .../ppt-master/templates/tables/README.md | 58 +++ .../templates/tables/comparison_matrix.svg | 77 +++ .../templates/tables/feature_matrix.svg | 96 ++++ .../templates/tables/hierarchical_table.svg | 202 ++++++++ .../templates/tables/metric_table.svg | 118 +++++ .../templates/tables/rating_matrix.svg | 115 +++++ .../templates/tables/record_table.svg | 170 ++++++ .../templates/tables/tables_index.json | 41 ++ .../ppt-master/workflows/create-template.md | 2 +- .../ppt-master/workflows/generate-pptx.md | 40 +- .../workflows/profiles/beautify-pptx.md | 2 +- .../workflows/profiles/quick-generate.md | 114 +++- .../stages/apply-template-workspace.md | 96 +++- .../workflows/stages/generate-audio.md | 42 +- .../workflows/stages/resume-execute.md | 21 +- .../workflows/stages/verify-charts.md | 154 +++--- .../workflows/stages/visual-review.md | 6 +- .../plugins/shadcn/THIRD_PARTY_SOURCE.json | 4 +- 241 files changed, 9964 insertions(+), 7534 deletions(-) create mode 100644 plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/.github/workflows/presenter-runtime-sync.yml create mode 100644 plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/scripts/check-presenter-runtime-sync.mjs create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/references/executor-structure.md create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/references/executor-table.md create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/references/executor-visualization.md create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/docs/visualization-recall.md create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/visualization_catalog.py create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/visualization_recall.py rename plugins/codex/plugins/ppt-master/skills/ppt-master/templates/{charts/CHART_STYLE_GUIDE.md => VISUALIZATION_TEMPLATE_AUTHORING.md} (53%) create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/accenture/templates/design_spec.md create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/alibaba/templates/design_spec.md create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/aws/templates/design_spec.md create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/bain/templates/design_spec.md create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/bcg/templates/design_spec.md create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/deloitte/templates/design_spec.md create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/huawei/templates/design_spec.md create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/ibm/templates/design_spec.md create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/jpmorgan/templates/design_spec.md create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/mckinsey/templates/design_spec.md create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/microsoft/templates/design_spec.md create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/nvidia/templates/design_spec.md create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/pwc/templates/design_spec.md create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/tencent/templates/design_spec.md create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/xiaomi/templates/design_spec.md delete mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/agenda_list.svg delete mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/arc_anchored_list.svg delete mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/basic_table.svg delete mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/chevron_chain_with_tail.svg delete mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/chevron_process.svg delete mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/circular_stages.svg delete mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/client_server_flow.svg delete mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/comparison_columns.svg delete mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/comparison_table.svg delete mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/concentric_circles.svg delete mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/consulting_table.svg delete mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/feature_matrix_table.svg delete mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/financial_statement_table.svg delete mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/fishbone_diagram.svg delete mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/harvey_balls_table.svg delete mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/hub_inward_arrows.svg delete mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/hub_spoke.svg delete mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/icon_grid.svg delete mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/isometric_stairs.svg delete mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/journey_map.svg delete mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/kpi_cards.svg delete mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/labeled_card.svg delete mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/layered_architecture.svg delete mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/mind_map.svg delete mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/module_composition.svg delete mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/numbered_steps.svg delete mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/pipeline_with_stages.svg delete mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/process_flow.svg delete mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/project_schedule_table.svg delete mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/pros_cons_chart.svg delete mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/pyramid_chart.svg delete mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/pyramid_isometric.svg delete mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/quadrant_bubble_scatter.svg delete mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/quadrant_text_bullets.svg delete mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/roadmap_vertical.svg delete mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/segmented_wheel.svg delete mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/snake_flow.svg delete mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/team_roster.svg delete mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/timeline.svg delete mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/top_down_tree.svg delete mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/venn_diagram.svg delete mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/vertical_list.svg delete mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/vertical_pillars.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/editorial_bleed/templates/01_hero_full.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/editorial_bleed/templates/02_hero_side_scrim.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/editorial_bleed/templates/03_split_bleed.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/editorial_bleed/templates/04_split_bleed_reverse.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/editorial_bleed/templates/05_chapter_full.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/editorial_bleed/templates/06_quote_over_image.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/editorial_bleed/templates/07_triptych.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/editorial_bleed/templates/08_image_grid_four.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/editorial_bleed/templates/09_full_statement.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/editorial_bleed/templates/10_closing_full.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/editorial_bleed/templates/design_spec.md create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/moments_square/templates/01_cover.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/moments_square/templates/02_statement.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/moments_square/templates/03_title_content.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/moments_square/templates/04_two_column.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/moments_square/templates/05_three_row.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/moments_square/templates/06_image_center.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/moments_square/templates/07_image_full.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/moments_square/templates/08_ending.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/moments_square/templates/design_spec.md create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/01_title_slide.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/02_title_content.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/03_section_header.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/04_two_content.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/05_comparison.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/06_title_only.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/07_blank.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/08_content_caption.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/09_picture_caption.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/10_hero_statement.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/11_three_card.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/12_kpi_grid.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/13_process_timeline.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/14_stacked_split.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/15_chart_insight.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/16_table_summary.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/design_spec.md create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/01_cover.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/02_section_divider.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/03_agenda.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/04_title_content.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/05_two_content.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/06_three_block.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/07_kpi_row.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/08_chart_insight.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/09_table_summary.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/10_process_timeline.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/11_matrix_2x2.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/12_appendix.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/13_closing.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/design_spec.md create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/story_vertical/templates/01_cover.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/story_vertical/templates/02_statement.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/story_vertical/templates/03_title_content.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/story_vertical/templates/04_numbered_list.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/story_vertical/templates/05_image_full.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/story_vertical/templates/06_image_top_text.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/story_vertical/templates/07_two_block.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/story_vertical/templates/08_step_flow.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/story_vertical/templates/09_ending.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/story_vertical/templates/design_spec.md create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/xiaohongshu_post/templates/01_cover.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/xiaohongshu_post/templates/02_statement.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/xiaohongshu_post/templates/03_title_content.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/xiaohongshu_post/templates/04_numbered_list.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/xiaohongshu_post/templates/05_two_card_stack.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/xiaohongshu_post/templates/06_image_top_text.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/xiaohongshu_post/templates/07_image_full_caption.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/xiaohongshu_post/templates/08_quote.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/xiaohongshu_post/templates/09_step_flow.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/xiaohongshu_post/templates/10_ending.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/xiaohongshu_post/templates/design_spec.md create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/styles/academic-research/templates/design_spec.md create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/styles/creative-pitch/templates/design_spec.md create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/styles/incident-postmortem/templates/design_spec.md create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/styles/investor-pitch/templates/design_spec.md create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/styles/narrative-keynote/templates/design_spec.md create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/styles/operating-review/templates/design_spec.md create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/styles/product-launch/templates/design_spec.md create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/styles/science-explainer/templates/design_spec.md create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/styles/solution-proposal/templates/design_spec.md create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/styles/technical-deepdive/templates/design_spec.md create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/styles/workshop-teaching/templates/design_spec.md create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/tables/README.md create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/tables/comparison_matrix.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/tables/feature_matrix.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/tables/hierarchical_table.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/tables/metric_table.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/tables/rating_matrix.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/tables/record_table.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/tables/tables_index.json diff --git a/config/external-sources.lock.json b/config/external-sources.lock.json index 73edd9f7..5383361b 100644 --- a/config/external-sources.lock.json +++ b/config/external-sources.lock.json @@ -42,8 +42,8 @@ "repo": "https://github.com/JuliusBrussee/caveman.git", "ref": "main", "adapter": "codex-plugin", - "commit": "ec83e5bace4c20484d704dea21e12fc4eb94e9aa", - "syncedAt": "2026-08-06T16:00:02Z" + "commit": "11ddc0c9813c8f75365cd5be2f753df08712f154", + "syncedAt": "2026-08-08T16:00:01Z" }, { "id": "taste-skill", @@ -60,8 +60,8 @@ "repo": "https://github.com/shadcn-ui/ui.git", "ref": "main", "adapter": "claude-skill", - "commit": "9846e22ce52c723554742860a0dbd3e5cf19b573", - "syncedAt": "2026-08-06T16:00:02Z" + "commit": "6261bd89f72d794aea491482cc2acfd8dc3d63e2", + "syncedAt": "2026-08-08T16:00:01Z" }, { "id": "frontend-slides", @@ -78,8 +78,8 @@ "repo": "https://github.com/op7418/guizang-ppt-skill.git", "ref": "main", "adapter": "claude-skill", - "commit": "e8357b315471f04e17551988826011974bfff779", - "syncedAt": "2026-08-06T16:00:02Z" + "commit": "c91369c449d34755d320a8b81d0734000d99d1ab", + "syncedAt": "2026-08-08T16:00:01Z" }, { "id": "html-ppt", @@ -96,8 +96,8 @@ "repo": "https://github.com/hugohe3/ppt-master.git", "ref": "main", "adapter": "claude-skill", - "commit": "c0305342cf5c558e7242dba64cfc207874a5134a", - "syncedAt": "2026-08-06T16:00:02Z" + "commit": "eb095bfcc6b625fd8754e9f5d053ec4220865370", + "syncedAt": "2026-08-08T16:00:01Z" }, { "id": "next-skills", @@ -105,8 +105,8 @@ "repo": "https://github.com/vercel/next.js.git", "ref": "canary", "adapter": "skill-collection", - "commit": "0ae8c72462952df163f1b1e0726641bc5b40dc93", - "syncedAt": "2026-08-06T16:00:02Z" + "commit": "a677cf66af002fbdcf49a982ef435b03554817cc", + "syncedAt": "2026-08-08T16:00:01Z" } ] } diff --git a/plugins/codex/plugins/caveman/THIRD_PARTY_SOURCE.json b/plugins/codex/plugins/caveman/THIRD_PARTY_SOURCE.json index bbb12966..ae8c3bde 100644 --- a/plugins/codex/plugins/caveman/THIRD_PARTY_SOURCE.json +++ b/plugins/codex/plugins/caveman/THIRD_PARTY_SOURCE.json @@ -2,8 +2,8 @@ "sourceId": "caveman", "repo": "https://github.com/JuliusBrussee/caveman.git", "ref": "main", - "commit": "ec83e5bace4c20484d704dea21e12fc4eb94e9aa", + "commit": "11ddc0c9813c8f75365cd5be2f753df08712f154", "adapter": "codex-plugin", "sourcePath": "plugins/caveman", - "syncedAt": "2026-08-06T16:00:02Z" + "syncedAt": "2026-08-08T16:00:01Z" } diff --git a/plugins/codex/plugins/guizang-ppt-skill/README.en.md b/plugins/codex/plugins/guizang-ppt-skill/README.en.md index d53da1f2..e19c1646 100644 --- a/plugins/codex/plugins/guizang-ppt-skill/README.en.md +++ b/plugins/codex/plugins/guizang-ppt-skill/README.en.md @@ -11,7 +11,7 @@ ![Kimi work Gold Sponsor](https://img.shields.io/static/v1?label=Kimi%20work&message=Gold%20Sponsor&color=111111&style=flat-square) ![Cola Skill Gold Sponsor](https://img.shields.io/static/v1?label=Cola%20Skill&message=Gold%20Sponsor&color=E4353F&style=flat-square) -An agent skill for Claude Code, Codex, and similar coding-agent environments. It generates **single-file HTML horizontal-swipe decks**, deck visuals, and social cover pages. +An agent skill for Claude Code, Codex, and similar coding-agent environments. It generates **single-file HTML horizontal-swipe decks**, deck visuals, and social cover pages, with a complete rehearsal and presenter mode built in. It ships with two visual systems: @@ -59,6 +59,7 @@ Other useful prompts: Turn this Markdown file into an editorial magazine-style presentation. Create a 21:9 social cover from the core idea of this deck. Redesign this product screenshot as a 16:10 slide visual. +Add speaker notes and planned timing to this deck, then help me rehearse it in presenter mode. ``` ## Sponsors and Supporters @@ -88,6 +89,7 @@ Beyond Claude Code / Codex, you can also use Guizang PPT Skill on these platform - 🎨 **Curated theme presets**: 5 electronic-ink themes for Style A, 4 Swiss anchor-color themes for Style B - 🖼 **Optional Codex image flow**: generate documentary photos, infographics, flow diagrams, system maps, and UI scenes with GPT-Image 2.0 / GPT-M 2.0, then insert them at template-safe ratios - 📰 **Social covers**: generate 21:9 WeChat cover images, 1:1 share cards, 3:4 Xiaohongshu covers, video thumbnails, and related variants +- 🎤 **Presenter mode**: dual-window audience output, 16:9 current/next previews, speaker notes, timing and rehearsal, auto advance, laser pointer, circles, and live recovery controls - 📴 **Low-power static mode**: press `B` to turn WebGL / canvas animation into static visuals - 📄 **Single HTML file** — no build, no server, open directly in the browser @@ -107,12 +109,13 @@ Beyond Claude Code / Codex, you can also use Guizang PPT Skill on these platform | Deck visuals | In Codex, generate photos, infographics, flow diagrams, system maps, or UI scenes | | Social covers | Generate 21:9 main covers, 1:1 share cards, 3:4 vertical covers, and video thumbnails from the same idea | | Screenshot normalization | Redesign raw screenshots into template-safe ratios before inserting them into slides | +| Live talk / rehearsal | Ask the agent to generate notes and timing, then press the bottom-right `P` to enter presenter mode | ## Why HTML decks - **Agent-native editing**: HTML / CSS is plain text, so agents can read, edit, and validate it directly. - **Higher visual density than Markdown**: precise layout, positioning, motion, interactivity, and cover formats. -- **Lightweight delivery**: one HTML file can be opened, presented, sent, screenshotted, or recorded. +- **Lightweight delivery**: one HTML file can be opened, presented, sent, screenshotted, or recorded, with presenter tools included. - **Better quality gates**: the Swiss validator can catch layout drift, unsafe image placement, centered body titles, and SVG text traps. - **One visual system across outputs**: decks, generated visuals, covers, and screenshot redesigns can share the same style rules. @@ -162,6 +165,7 @@ Once installed, Claude Code auto-detects the skill. Trigger phrases: - "Electronic ink slides for my talk" - "Create a 21:9 WeChat cover from this article" - "Create a 1:1 share card from this deck" +- "Add speaker notes to this deck and help me rehearse it in presenter mode" ## Workflow @@ -172,12 +176,59 @@ The skill is a structured workflow; the agent walks you through each step: 3. **Copy template** — Style A uses `assets/template.html`; Style B uses `assets/template-swiss.html` 4. **Fill content** — create a rhythm plan, then choose and adapt the matching layout skeletons 5. **Optional image generation** — in Codex, ask whether to use GPT-Image 2.0 / GPT-M 2.0 images, then insert them at page-appropriate ratios -6. **Self-check** — match against `references/checklist.md`; P0 issues must all pass; Swiss decks must also pass the layout validator -7. **Preview** — open the HTML in a browser -8. **Iterate** — use inline styles to tune font size, height, spacing +6. **Generate speaker notes** — derive each slide's purpose, talking points, transition, and planned duration from the outline; do not invent missing live details +7. **Self-check** — match against `references/checklist.md`; P0 issues must all pass; run the Swiss and presenter validators when applicable +8. **Preview** — open the HTML in a browser +9. **Rehearse / present** — press the bottom-right `P`, verify audience sync, and record actual timing +10. **Iterate** — adjust content, font size, height, and spacing from rehearsal results Full spec in [`SKILL.md`](./SKILL.md). +## Presenter mode + +Both templates ship with the same presenter runtime. Open a deck and press the bottom-right `P` to enter presenter view; the browser opens a clean audience window at the same time. Core features run entirely inside the local HTML and browser—no live-caption service, cloud relay, phone remote, or AI coaching service is required. + +**Presenter view example** + +![Presenter view with current and next slides, speaker notes, timing controls, and audience status](https://github.com/user-attachments/assets/95db62b5-65bb-40af-ac0b-1d415682af88) + +### What the speaker sees + +- **Current and next slides**: stacked vertically and always kept at `16:9`; small windows scale the whole slide without cropping or reflowing its text +- **Grid navigation**: replace the preview area with an inline overview, choose a slide, then return immediately to the two previews while the audience follows +- **Structured notes**: title, purpose, talking points, and transition are required; interaction, delivery, advance cue, fallback, and pronunciation appear only when supplied by the outline +- **Progress and health**: current / total slide count, completion percentage, plus audience states for connecting, synced, unsynced, frozen, disconnected, or popup blocked + +### Timing, rehearsal, and auto advance + +- The footer separates elapsed, current-slide, and remaining / overtime values, with explicit “Start timer / Resume timer / Reset timer” controls +- Rehearsal mode records actual time per slide and a local session summary; it does not grade the speaker with AI +- Auto advance is off by default and only runs when the outline provides per-slide seconds or the user enables a global interval +- Auto advance pauses while the grid, settings, or annotation tool is open, when the page is hidden, or when the audience is paused or out of sync + +### Live tools and recovery + +- Laser pointer, circle annotation, and clear actions sync to the audience window +- Black screen, white screen, or freeze the audience; unfreezing catches it up to the presenter's current slide +- Closing the audience window or losing its heartbeat produces a visible “Disconnected” state; “Reopen audience” is always available +- Exiting presenter mode closes the audience window when allowed, or leaves a clear “Presentation ended” fallback +- Preflight checks cover popups, fullscreen, fonts, images / video, and `16:9` previews, while reminding the speaker to verify HDMI adapters and projectors manually + +Common shortcuts: `← / →` navigate, `Home / End` jump to first or last, `G` opens the grid, `L` laser, `C` circle, `B / W` black or white screen, `F` freezes the audience, and `?` opens the full shortcut list. + +Ask an agent to prepare presenter mode with: + +```text +Use this outline to add a purpose, talking points, transition, and planned duration to every slide. Do not invent interaction or live details that were not provided, then run the presenter-mode validator. +``` + +See [`references/presenter-mode.md`](./references/presenter-mode.md) for the full notes contract and runtime behavior. Validate with: + +```bash +node scripts/validate-presenter-mode.mjs path/to/index.html +node scripts/validate-presenter-mode.mjs path/to/index.html --target-minutes 30 +``` + ## Style B Swiss The Swiss theme is a strict layout system, not just a CSS skin. @@ -258,7 +309,9 @@ guizang-ppt-skill/ │ ├── template-swiss.html ← Style B Swiss template │ └── screenshot-backgrounds/ ← bundled WebP screenshot backgrounds: 5 style-a / 4 style-b ├── scripts/ -│ └── validate-swiss-deck.mjs ← Swiss layout validator +│ ├── validate-swiss-deck.mjs ← Swiss layout validator +│ ├── validate-presenter-mode.mjs ← speaker notes, timing, and runtime validator +│ └── check-presenter-runtime-sync.mjs ← cross-template presenter runtime drift check └── references/ ├── components.md ← component catalog (type, color, grid, icons, callout, stat, pipeline) ├── layouts.md ← 10 layout skeletons (paste-ready) @@ -268,6 +321,7 @@ guizang-ppt-skill/ ├── themes-swiss.md ← 4 Swiss anchor-color themes ├── image-prompts.md ← GPT-Image 2.0 / GPT-M 2.0 image types, ratios, and base prompts ├── screenshot-framing.md ← CleanShot X-style screenshot framing semantics + ├── presenter-mode.md ← notes contract, rehearsal, audience output, and live tools └── checklist.md ← quality checklist (P0 / P1 / P2 / P3 tiers) ``` @@ -341,6 +395,12 @@ Yes. Style A layouts can be extended in `references/layouts.md`. Style B is stri **Is Codex image generation required?** No. Decks work without generated images. The image flow is only used when you need photos, infographics, UI scenes, or covers. +**Does presenter mode require internet access or another service?** +No. Dual-window sync, notes, timing, rehearsal, auto advance, and annotations run locally in the browser. It does not provide live captions, phone control, or AI rehearsal scoring. + +**Why does closing the audience window show “Disconnected”?** +The presenter uses acknowledgements and heartbeats to verify the software link. Closing the window or losing its heartbeat produces “Disconnected”; use “Reopen audience” to recover. The browser cannot verify a physical HDMI or projector cable, so the speaker still needs a visual check. + **How do I update the skill?** Run the install command again, or run `git pull` inside your local skill directory. @@ -351,6 +411,8 @@ Bugs, layout issues, new layout requests — Issues and PRs welcome. Prioritize: - Add new classes to `template.html` first; don't let `layouts.md` reference undefined classes - When changing `template-swiss.html`, update `layouts-swiss.md` and `swiss-layout-lock.md` together - When adding Swiss rules, update `scripts/validate-swiss-deck.mjs` +- Presenter runtime changes must land in both templates and pass `scripts/check-presenter-runtime-sync.mjs`; CI rejects CSS / JavaScript drift +- Presenter-note or live-behavior changes must also update `references/presenter-mode.md`, `references/checklist.md`, and `scripts/validate-presenter-mode.mjs` - Log pitfalls into `checklist.md` at the matching P0 / P1 / P2 / P3 tier - New theme colors go into `themes.md` with a recommended use case diff --git a/plugins/codex/plugins/guizang-ppt-skill/README.md b/plugins/codex/plugins/guizang-ppt-skill/README.md index 3dc48786..15fef041 100644 --- a/plugins/codex/plugins/guizang-ppt-skill/README.md +++ b/plugins/codex/plugins/guizang-ppt-skill/README.md @@ -13,7 +13,7 @@ > 🌏 **English version: [README.en.md](./README.en.md)** -一个适配 Claude Code / Codex 等 Agent 环境的网页 PPT 技能,用于生成**单文件 HTML 横向翻页 PPT**、PPT 配图和多平台封面。 +一个适配 Claude Code / Codex 等 Agent 环境的网页 PPT 技能,用于生成**单文件 HTML 横向翻页 PPT**、PPT 配图和多平台封面,并内置完整的排练与演讲者模式。 内置两套视觉系统: @@ -61,6 +61,7 @@ npx skills add https://github.com/op7418/guizang-ppt-skill --skill guizang-ppt-s 帮我把这份 Markdown 做成杂志风演讲 PPT。 基于这份 PPT 的核心观点,生成一张公众号 21:9 头图。 把这张产品截图重新设计成适合 PPT 的 16:10 配图。 +给这份 PPT 补齐演讲备注和每页计划时长,然后用演讲者模式帮我排练。 ``` ## 赞助与支持 @@ -90,6 +91,7 @@ Guizang PPT Skill 的持续迭代获得 **360 安全龙虾**、**Kimi work**、* - 🎨 **主题色预设**:Style A 5 套电子墨水主题,Style B 4 套瑞士高饱和锚点色 - 🖼 **Codex 可选配图流程**:可用 GPT-Image 2.0 / GPT-M 2.0 生成纪实照片、信息图、流程图、系统关系图、UI 情景图,并按模板比例插入 - 📰 **多平台封面**:可用同一套视觉规则生成公众号 21:9、公众号分享卡 1:1、小红书 3:4、视频号横版等封面 +- 🎤 **演讲者模式**:双窗口观众屏、当前页/下一页 16:9 预览、演讲备注、计时排练、自动翻页、激光笔、圈选和现场故障恢复 - 📴 **低性能静态模式**:按 `B` 可关闭 WebGL / canvas 动画,让动态内容退回静态背景 - 📄 **单文件 HTML**:不需要构建、不需要服务器,浏览器直接打开 @@ -109,12 +111,13 @@ Guizang PPT Skill 的持续迭代获得 **360 安全龙虾**、**Kimi work**、* | PPT 配图 | 在 Codex 中用 GPT-Image 2.0 / GPT-M 2.0 生成照片、信息图、流程图、UI 情景图 | | 多平台封面 | 从同一份内容生成公众号 21:9、1:1 分享卡、小红书 3:4、视频号横版封面 | | 截图统一风格 | 把原始截图重新生成到模板需要的比例,再插入 PPT | +| 现场演讲 / 排练 | 让 Agent 从大纲生成备注和时长,按右下角 `P` 进入演讲者模式 | ## 为什么是 HTML PPT - **更适合 Agent 生成和修改**:HTML / CSS 是文本,Agent 能直接读、改、验证。 - **表现力比 Markdown 更高**:可以做精细排版、空间定位、动画、交互和响应式封面。 -- **交付更轻**:单文件 HTML 可以直接打开、演示、发送、截图。 +- **交付更轻**:单文件 HTML 可以直接打开、演示、发送、截图,演讲者工具也随文件一起交付。 - **更容易做质量控制**:瑞士风可以用脚本校验版式、图片槽位、标题对齐、危险 SVG,并在可用时用 Playwright 后验测量超出、底部空白、nav 安全线和标题间距。 - **更适合视觉内容链路**:同一套主题能覆盖 PPT、配图、封面和截图再设计。 @@ -164,6 +167,7 @@ git clone https://github.com/op7418/guizang-ppt-skill.git ~/.claude/skills/guiza - "electronic ink 风格演讲 slides" - "基于这篇文章做一张公众号 21:9 封面" - "基于这份 PPT 生成一张 1:1 分享卡" +- "给这份 PPT 补齐演讲备注,并用演讲者模式帮我排练" ## 使用流程 @@ -174,12 +178,59 @@ Skill 本身是结构化工作流,Agent 会逐步引导: 3. **拷贝模板** — Style A 用 `assets/template.html`,Style B 用 `assets/template-swiss.html` 4. **填充内容** — 先做主题节奏表,再从对应 layout 骨架里挑、粘、改文案 5. **可选配图** — 在 Codex 中询问是否用 GPT-Image 2.0 / GPT-M 2.0 生成配图,再按页面比例插入 -6. **自检** — 对照 `references/checklist.md`,P0 级问题必须全过;瑞士风还要运行版式校验器 -7. **预览** — 浏览器直接打开 -8. **迭代** — inline style 改字号/高度/间距 +6. **生成演讲备注** — 从大纲提取每页目的、讲述要点、转场和计划时长;用户没提供的信息不猜测 +7. **自检** — 对照 `references/checklist.md`,P0 级问题必须全过;瑞士风和演讲模式分别运行对应校验器 +8. **预览** — 浏览器直接打开 +9. **排练 / 演讲** — 按右下角 `P` 进入演讲者模式,检查观众屏同步并记录实际时长 +10. **迭代** — 根据排练结果调整内容、字号、高度和间距 详细说明见 [`SKILL.md`](./SKILL.md)。 +## 演讲者模式 + +两套模板都内置同一套演讲者运行时。打开 deck 后,点击右下角 `P` 即可进入演讲者视图;浏览器会同时打开一个干净的观众屏。所有核心能力都在本地 HTML 和浏览器里完成,不依赖实时字幕、云端中继、手机遥控或 AI 教练服务。 + +**演讲者视图示例** + +![演讲者视图示例:当前页、下一页、演讲备注、计时控制与观众屏状态](https://github.com/user-attachments/assets/95db62b5-65bb-40af-ac0b-1d415682af88) + +### 演讲时能看到什么 + +- **当前页与下一页**:上下排列并始终保持 `16:9`,小屏时整页等比缩放,不裁切、不挤压文字 +- **宫格选页**:在预览区原位切换总览,点选页面后立即回到双预览,观众屏同步跟随 +- **结构化备注**:标题、本页目的、讲述要点和转场必填;互动、语气、翻页时机、备用方案和读音等信息只在大纲提供时显示 +- **进度与状态**:显示当前页 / 总页数、完成百分比,以及观众屏的连接中、已同步、未同步、已冻结、未连接或弹窗被拦截状态 + +### 时间、排练与自动翻页 + +- 底栏分别显示已进行、本页和剩余 / 超时时间,按钮明确区分“开始计时 / 继续计时 / 重置计时” +- 排练模式记录每页实际时长和整场汇总,数据保存在本地浏览器,不会做 AI 评分 +- 自动翻页默认关闭;只有大纲明确给出页面停留秒数,或用户在设置中开启全局间隔时才启用 +- 打开宫格、设置、圈选工具,页面隐藏,或观众屏暂停 / 失去同步时,自动翻页会暂停 + +### 现场工具与故障恢复 + +- 激光笔、圈选和清除会同步到观众屏 +- 一键黑屏、白屏,或冻结观众屏;恢复后自动追平演讲者当前页 +- 观众窗口关闭或心跳超时后明确显示“未连接”,可随时点击“重新打开观众屏” +- 退出演讲时自动关闭观众窗口;浏览器不允许自关时,观众端显示“演示已结束” +- 演前检查覆盖弹窗、全屏、字体、图片 / 视频和 `16:9` 预览,并提醒人工确认 HDMI、转接器和投影仪 + +常用快捷键:`← / →` 翻页,`Home / End` 跳首页或尾页,`G` 宫格,`L` 激光笔,`C` 圈选,`B / W` 黑屏或白屏,`F` 冻结观众屏,`?` 查看完整快捷键。 + +让 Agent 生成或补齐演讲模式时,可以直接说: + +```text +根据这份大纲给每一页补齐演讲目的、讲述要点、转场和计划时长。没有提供的互动或现场信息不要猜,然后运行演讲模式校验器。 +``` + +演讲备注契约和完整行为说明见 [`references/presenter-mode.md`](./references/presenter-mode.md)。校验命令: + +```bash +node scripts/validate-presenter-mode.mjs path/to/index.html +node scripts/validate-presenter-mode.mjs path/to/index.html --target-minutes 30 +``` + ## Style B 瑞士风 瑞士风是这次新增的结构化主题。它不是"换一套 CSS",而是一套更严格的版式系统。 @@ -259,7 +310,9 @@ guizang-ppt-skill/ │ ├── template-swiss.html ← Style B 瑞士国际主义模板 │ └── screenshot-backgrounds/ ← 截图美化内置背景(WebP):style-a 5 套 / style-b 4 套 ├── scripts/ -│ └── validate-swiss-deck.mjs ← 瑞士风版式校验器 +│ ├── validate-swiss-deck.mjs ← 瑞士风版式校验器 +│ ├── validate-presenter-mode.mjs ← 演讲备注、时长和运行时校验器 +│ └── check-presenter-runtime-sync.mjs ← 两套模板演讲者运行时防漂移检查 └── references/ ├── components.md ← 组件手册(字体、色、网格、图标、callout、stat、pipeline) ├── layouts.md ← 10 种页面布局骨架(可直接粘贴) @@ -269,6 +322,7 @@ guizang-ppt-skill/ ├── themes-swiss.md ← 4 套瑞士风锚点色 ├── image-prompts.md ← GPT-Image 2.0 / GPT-M 2.0 配图类型、比例和基础提示词 ├── screenshot-framing.md ← CleanShot X 式截图适配语义 + ├── presenter-mode.md ← 演讲备注契约、排练、观众屏与现场工具说明 └── checklist.md ← 质量检查清单(P0 / P1 / P2 / P3 分级) ``` @@ -342,6 +396,12 @@ guizang-ppt-skill/ **Codex 配图是必须的吗?** 不是。没有配图也能生成 PPT。配图流程只在需要照片、信息图、UI 情景图或封面时使用。 +**演讲者模式需要联网或额外服务吗?** +不需要。双窗口同步、备注、计时、排练、自动翻页和标注都在本地浏览器完成。它不会提供实时字幕、手机遥控或 AI 排练评分。 + +**为什么关掉观众窗口后显示“未连接”?** +演讲者端会通过观众屏确认和心跳判断软件链路。窗口关闭或心跳超时会显示“未连接”,点击“重新打开观众屏”即可恢复。浏览器无法判断 HDMI 或投影仪线缆是否真的接通,现场仍需目视确认。 + **怎么更新到最新版?** 重新运行安装命令,或在本地 skill 目录执行 `git pull`。 @@ -352,6 +412,8 @@ Bug、排版问题、新布局需求——欢迎开 Issue 或 PR。改动请优 - 在 `template.html` 里补类,不要让 layouts.md 使用未定义的类 - 在 `template-swiss.html` 里补类时,同步更新 `layouts-swiss.md` 和 `swiss-layout-lock.md` - 瑞士风新增规则后,同步更新 `scripts/validate-swiss-deck.mjs` +- 演讲者运行时必须同时更新两套模板,并运行 `scripts/check-presenter-runtime-sync.mjs`;CI 会拦截两份模板的 CSS / JavaScript 漂移 +- 演讲备注或现场行为变化时,同步更新 `references/presenter-mode.md`、`references/checklist.md` 和 `scripts/validate-presenter-mode.mjs` - 把踩过的坑写到 `checklist.md` 对应的 P0 / P1 / P2 / P3 级别 - 新主题色进 `themes.md` 并给出适合的场景 diff --git a/plugins/codex/plugins/guizang-ppt-skill/THIRD_PARTY_SOURCE.json b/plugins/codex/plugins/guizang-ppt-skill/THIRD_PARTY_SOURCE.json index 9d1d55bb..194b50f5 100644 --- a/plugins/codex/plugins/guizang-ppt-skill/THIRD_PARTY_SOURCE.json +++ b/plugins/codex/plugins/guizang-ppt-skill/THIRD_PARTY_SOURCE.json @@ -2,8 +2,8 @@ "sourceId": "guizang-ppt-skill", "repo": "https://github.com/op7418/guizang-ppt-skill.git", "ref": "main", - "commit": "e8357b315471f04e17551988826011974bfff779", + "commit": "c91369c449d34755d320a8b81d0734000d99d1ab", "adapter": "claude-skill", "sourcePath": ".", - "syncedAt": "2026-08-06T16:00:02Z" + "syncedAt": "2026-08-08T16:00:01Z" } diff --git a/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/.github/workflows/presenter-runtime-sync.yml b/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/.github/workflows/presenter-runtime-sync.yml new file mode 100644 index 00000000..5b871a32 --- /dev/null +++ b/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/.github/workflows/presenter-runtime-sync.yml @@ -0,0 +1,24 @@ +name: Presenter runtime sync + +on: + pull_request: + paths: + - "assets/template*.html" + - "scripts/check-presenter-runtime-sync.mjs" + - ".github/workflows/presenter-runtime-sync.yml" + push: + branches: [main] + paths: + - "assets/template*.html" + - "scripts/check-presenter-runtime-sync.mjs" + - ".github/workflows/presenter-runtime-sync.yml" + +jobs: + presenter-runtime-sync: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 20 + - run: node scripts/check-presenter-runtime-sync.mjs diff --git a/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/README.en.md b/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/README.en.md index d53da1f2..e19c1646 100644 --- a/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/README.en.md +++ b/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/README.en.md @@ -11,7 +11,7 @@ ![Kimi work Gold Sponsor](https://img.shields.io/static/v1?label=Kimi%20work&message=Gold%20Sponsor&color=111111&style=flat-square) ![Cola Skill Gold Sponsor](https://img.shields.io/static/v1?label=Cola%20Skill&message=Gold%20Sponsor&color=E4353F&style=flat-square) -An agent skill for Claude Code, Codex, and similar coding-agent environments. It generates **single-file HTML horizontal-swipe decks**, deck visuals, and social cover pages. +An agent skill for Claude Code, Codex, and similar coding-agent environments. It generates **single-file HTML horizontal-swipe decks**, deck visuals, and social cover pages, with a complete rehearsal and presenter mode built in. It ships with two visual systems: @@ -59,6 +59,7 @@ Other useful prompts: Turn this Markdown file into an editorial magazine-style presentation. Create a 21:9 social cover from the core idea of this deck. Redesign this product screenshot as a 16:10 slide visual. +Add speaker notes and planned timing to this deck, then help me rehearse it in presenter mode. ``` ## Sponsors and Supporters @@ -88,6 +89,7 @@ Beyond Claude Code / Codex, you can also use Guizang PPT Skill on these platform - 🎨 **Curated theme presets**: 5 electronic-ink themes for Style A, 4 Swiss anchor-color themes for Style B - 🖼 **Optional Codex image flow**: generate documentary photos, infographics, flow diagrams, system maps, and UI scenes with GPT-Image 2.0 / GPT-M 2.0, then insert them at template-safe ratios - 📰 **Social covers**: generate 21:9 WeChat cover images, 1:1 share cards, 3:4 Xiaohongshu covers, video thumbnails, and related variants +- 🎤 **Presenter mode**: dual-window audience output, 16:9 current/next previews, speaker notes, timing and rehearsal, auto advance, laser pointer, circles, and live recovery controls - 📴 **Low-power static mode**: press `B` to turn WebGL / canvas animation into static visuals - 📄 **Single HTML file** — no build, no server, open directly in the browser @@ -107,12 +109,13 @@ Beyond Claude Code / Codex, you can also use Guizang PPT Skill on these platform | Deck visuals | In Codex, generate photos, infographics, flow diagrams, system maps, or UI scenes | | Social covers | Generate 21:9 main covers, 1:1 share cards, 3:4 vertical covers, and video thumbnails from the same idea | | Screenshot normalization | Redesign raw screenshots into template-safe ratios before inserting them into slides | +| Live talk / rehearsal | Ask the agent to generate notes and timing, then press the bottom-right `P` to enter presenter mode | ## Why HTML decks - **Agent-native editing**: HTML / CSS is plain text, so agents can read, edit, and validate it directly. - **Higher visual density than Markdown**: precise layout, positioning, motion, interactivity, and cover formats. -- **Lightweight delivery**: one HTML file can be opened, presented, sent, screenshotted, or recorded. +- **Lightweight delivery**: one HTML file can be opened, presented, sent, screenshotted, or recorded, with presenter tools included. - **Better quality gates**: the Swiss validator can catch layout drift, unsafe image placement, centered body titles, and SVG text traps. - **One visual system across outputs**: decks, generated visuals, covers, and screenshot redesigns can share the same style rules. @@ -162,6 +165,7 @@ Once installed, Claude Code auto-detects the skill. Trigger phrases: - "Electronic ink slides for my talk" - "Create a 21:9 WeChat cover from this article" - "Create a 1:1 share card from this deck" +- "Add speaker notes to this deck and help me rehearse it in presenter mode" ## Workflow @@ -172,12 +176,59 @@ The skill is a structured workflow; the agent walks you through each step: 3. **Copy template** — Style A uses `assets/template.html`; Style B uses `assets/template-swiss.html` 4. **Fill content** — create a rhythm plan, then choose and adapt the matching layout skeletons 5. **Optional image generation** — in Codex, ask whether to use GPT-Image 2.0 / GPT-M 2.0 images, then insert them at page-appropriate ratios -6. **Self-check** — match against `references/checklist.md`; P0 issues must all pass; Swiss decks must also pass the layout validator -7. **Preview** — open the HTML in a browser -8. **Iterate** — use inline styles to tune font size, height, spacing +6. **Generate speaker notes** — derive each slide's purpose, talking points, transition, and planned duration from the outline; do not invent missing live details +7. **Self-check** — match against `references/checklist.md`; P0 issues must all pass; run the Swiss and presenter validators when applicable +8. **Preview** — open the HTML in a browser +9. **Rehearse / present** — press the bottom-right `P`, verify audience sync, and record actual timing +10. **Iterate** — adjust content, font size, height, and spacing from rehearsal results Full spec in [`SKILL.md`](./SKILL.md). +## Presenter mode + +Both templates ship with the same presenter runtime. Open a deck and press the bottom-right `P` to enter presenter view; the browser opens a clean audience window at the same time. Core features run entirely inside the local HTML and browser—no live-caption service, cloud relay, phone remote, or AI coaching service is required. + +**Presenter view example** + +![Presenter view with current and next slides, speaker notes, timing controls, and audience status](https://github.com/user-attachments/assets/95db62b5-65bb-40af-ac0b-1d415682af88) + +### What the speaker sees + +- **Current and next slides**: stacked vertically and always kept at `16:9`; small windows scale the whole slide without cropping or reflowing its text +- **Grid navigation**: replace the preview area with an inline overview, choose a slide, then return immediately to the two previews while the audience follows +- **Structured notes**: title, purpose, talking points, and transition are required; interaction, delivery, advance cue, fallback, and pronunciation appear only when supplied by the outline +- **Progress and health**: current / total slide count, completion percentage, plus audience states for connecting, synced, unsynced, frozen, disconnected, or popup blocked + +### Timing, rehearsal, and auto advance + +- The footer separates elapsed, current-slide, and remaining / overtime values, with explicit “Start timer / Resume timer / Reset timer” controls +- Rehearsal mode records actual time per slide and a local session summary; it does not grade the speaker with AI +- Auto advance is off by default and only runs when the outline provides per-slide seconds or the user enables a global interval +- Auto advance pauses while the grid, settings, or annotation tool is open, when the page is hidden, or when the audience is paused or out of sync + +### Live tools and recovery + +- Laser pointer, circle annotation, and clear actions sync to the audience window +- Black screen, white screen, or freeze the audience; unfreezing catches it up to the presenter's current slide +- Closing the audience window or losing its heartbeat produces a visible “Disconnected” state; “Reopen audience” is always available +- Exiting presenter mode closes the audience window when allowed, or leaves a clear “Presentation ended” fallback +- Preflight checks cover popups, fullscreen, fonts, images / video, and `16:9` previews, while reminding the speaker to verify HDMI adapters and projectors manually + +Common shortcuts: `← / →` navigate, `Home / End` jump to first or last, `G` opens the grid, `L` laser, `C` circle, `B / W` black or white screen, `F` freezes the audience, and `?` opens the full shortcut list. + +Ask an agent to prepare presenter mode with: + +```text +Use this outline to add a purpose, talking points, transition, and planned duration to every slide. Do not invent interaction or live details that were not provided, then run the presenter-mode validator. +``` + +See [`references/presenter-mode.md`](./references/presenter-mode.md) for the full notes contract and runtime behavior. Validate with: + +```bash +node scripts/validate-presenter-mode.mjs path/to/index.html +node scripts/validate-presenter-mode.mjs path/to/index.html --target-minutes 30 +``` + ## Style B Swiss The Swiss theme is a strict layout system, not just a CSS skin. @@ -258,7 +309,9 @@ guizang-ppt-skill/ │ ├── template-swiss.html ← Style B Swiss template │ └── screenshot-backgrounds/ ← bundled WebP screenshot backgrounds: 5 style-a / 4 style-b ├── scripts/ -│ └── validate-swiss-deck.mjs ← Swiss layout validator +│ ├── validate-swiss-deck.mjs ← Swiss layout validator +│ ├── validate-presenter-mode.mjs ← speaker notes, timing, and runtime validator +│ └── check-presenter-runtime-sync.mjs ← cross-template presenter runtime drift check └── references/ ├── components.md ← component catalog (type, color, grid, icons, callout, stat, pipeline) ├── layouts.md ← 10 layout skeletons (paste-ready) @@ -268,6 +321,7 @@ guizang-ppt-skill/ ├── themes-swiss.md ← 4 Swiss anchor-color themes ├── image-prompts.md ← GPT-Image 2.0 / GPT-M 2.0 image types, ratios, and base prompts ├── screenshot-framing.md ← CleanShot X-style screenshot framing semantics + ├── presenter-mode.md ← notes contract, rehearsal, audience output, and live tools └── checklist.md ← quality checklist (P0 / P1 / P2 / P3 tiers) ``` @@ -341,6 +395,12 @@ Yes. Style A layouts can be extended in `references/layouts.md`. Style B is stri **Is Codex image generation required?** No. Decks work without generated images. The image flow is only used when you need photos, infographics, UI scenes, or covers. +**Does presenter mode require internet access or another service?** +No. Dual-window sync, notes, timing, rehearsal, auto advance, and annotations run locally in the browser. It does not provide live captions, phone control, or AI rehearsal scoring. + +**Why does closing the audience window show “Disconnected”?** +The presenter uses acknowledgements and heartbeats to verify the software link. Closing the window or losing its heartbeat produces “Disconnected”; use “Reopen audience” to recover. The browser cannot verify a physical HDMI or projector cable, so the speaker still needs a visual check. + **How do I update the skill?** Run the install command again, or run `git pull` inside your local skill directory. @@ -351,6 +411,8 @@ Bugs, layout issues, new layout requests — Issues and PRs welcome. Prioritize: - Add new classes to `template.html` first; don't let `layouts.md` reference undefined classes - When changing `template-swiss.html`, update `layouts-swiss.md` and `swiss-layout-lock.md` together - When adding Swiss rules, update `scripts/validate-swiss-deck.mjs` +- Presenter runtime changes must land in both templates and pass `scripts/check-presenter-runtime-sync.mjs`; CI rejects CSS / JavaScript drift +- Presenter-note or live-behavior changes must also update `references/presenter-mode.md`, `references/checklist.md`, and `scripts/validate-presenter-mode.mjs` - Log pitfalls into `checklist.md` at the matching P0 / P1 / P2 / P3 tier - New theme colors go into `themes.md` with a recommended use case diff --git a/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/README.md b/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/README.md index 3dc48786..15fef041 100644 --- a/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/README.md +++ b/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/README.md @@ -13,7 +13,7 @@ > 🌏 **English version: [README.en.md](./README.en.md)** -一个适配 Claude Code / Codex 等 Agent 环境的网页 PPT 技能,用于生成**单文件 HTML 横向翻页 PPT**、PPT 配图和多平台封面。 +一个适配 Claude Code / Codex 等 Agent 环境的网页 PPT 技能,用于生成**单文件 HTML 横向翻页 PPT**、PPT 配图和多平台封面,并内置完整的排练与演讲者模式。 内置两套视觉系统: @@ -61,6 +61,7 @@ npx skills add https://github.com/op7418/guizang-ppt-skill --skill guizang-ppt-s 帮我把这份 Markdown 做成杂志风演讲 PPT。 基于这份 PPT 的核心观点,生成一张公众号 21:9 头图。 把这张产品截图重新设计成适合 PPT 的 16:10 配图。 +给这份 PPT 补齐演讲备注和每页计划时长,然后用演讲者模式帮我排练。 ``` ## 赞助与支持 @@ -90,6 +91,7 @@ Guizang PPT Skill 的持续迭代获得 **360 安全龙虾**、**Kimi work**、* - 🎨 **主题色预设**:Style A 5 套电子墨水主题,Style B 4 套瑞士高饱和锚点色 - 🖼 **Codex 可选配图流程**:可用 GPT-Image 2.0 / GPT-M 2.0 生成纪实照片、信息图、流程图、系统关系图、UI 情景图,并按模板比例插入 - 📰 **多平台封面**:可用同一套视觉规则生成公众号 21:9、公众号分享卡 1:1、小红书 3:4、视频号横版等封面 +- 🎤 **演讲者模式**:双窗口观众屏、当前页/下一页 16:9 预览、演讲备注、计时排练、自动翻页、激光笔、圈选和现场故障恢复 - 📴 **低性能静态模式**:按 `B` 可关闭 WebGL / canvas 动画,让动态内容退回静态背景 - 📄 **单文件 HTML**:不需要构建、不需要服务器,浏览器直接打开 @@ -109,12 +111,13 @@ Guizang PPT Skill 的持续迭代获得 **360 安全龙虾**、**Kimi work**、* | PPT 配图 | 在 Codex 中用 GPT-Image 2.0 / GPT-M 2.0 生成照片、信息图、流程图、UI 情景图 | | 多平台封面 | 从同一份内容生成公众号 21:9、1:1 分享卡、小红书 3:4、视频号横版封面 | | 截图统一风格 | 把原始截图重新生成到模板需要的比例,再插入 PPT | +| 现场演讲 / 排练 | 让 Agent 从大纲生成备注和时长,按右下角 `P` 进入演讲者模式 | ## 为什么是 HTML PPT - **更适合 Agent 生成和修改**:HTML / CSS 是文本,Agent 能直接读、改、验证。 - **表现力比 Markdown 更高**:可以做精细排版、空间定位、动画、交互和响应式封面。 -- **交付更轻**:单文件 HTML 可以直接打开、演示、发送、截图。 +- **交付更轻**:单文件 HTML 可以直接打开、演示、发送、截图,演讲者工具也随文件一起交付。 - **更容易做质量控制**:瑞士风可以用脚本校验版式、图片槽位、标题对齐、危险 SVG,并在可用时用 Playwright 后验测量超出、底部空白、nav 安全线和标题间距。 - **更适合视觉内容链路**:同一套主题能覆盖 PPT、配图、封面和截图再设计。 @@ -164,6 +167,7 @@ git clone https://github.com/op7418/guizang-ppt-skill.git ~/.claude/skills/guiza - "electronic ink 风格演讲 slides" - "基于这篇文章做一张公众号 21:9 封面" - "基于这份 PPT 生成一张 1:1 分享卡" +- "给这份 PPT 补齐演讲备注,并用演讲者模式帮我排练" ## 使用流程 @@ -174,12 +178,59 @@ Skill 本身是结构化工作流,Agent 会逐步引导: 3. **拷贝模板** — Style A 用 `assets/template.html`,Style B 用 `assets/template-swiss.html` 4. **填充内容** — 先做主题节奏表,再从对应 layout 骨架里挑、粘、改文案 5. **可选配图** — 在 Codex 中询问是否用 GPT-Image 2.0 / GPT-M 2.0 生成配图,再按页面比例插入 -6. **自检** — 对照 `references/checklist.md`,P0 级问题必须全过;瑞士风还要运行版式校验器 -7. **预览** — 浏览器直接打开 -8. **迭代** — inline style 改字号/高度/间距 +6. **生成演讲备注** — 从大纲提取每页目的、讲述要点、转场和计划时长;用户没提供的信息不猜测 +7. **自检** — 对照 `references/checklist.md`,P0 级问题必须全过;瑞士风和演讲模式分别运行对应校验器 +8. **预览** — 浏览器直接打开 +9. **排练 / 演讲** — 按右下角 `P` 进入演讲者模式,检查观众屏同步并记录实际时长 +10. **迭代** — 根据排练结果调整内容、字号、高度和间距 详细说明见 [`SKILL.md`](./SKILL.md)。 +## 演讲者模式 + +两套模板都内置同一套演讲者运行时。打开 deck 后,点击右下角 `P` 即可进入演讲者视图;浏览器会同时打开一个干净的观众屏。所有核心能力都在本地 HTML 和浏览器里完成,不依赖实时字幕、云端中继、手机遥控或 AI 教练服务。 + +**演讲者视图示例** + +![演讲者视图示例:当前页、下一页、演讲备注、计时控制与观众屏状态](https://github.com/user-attachments/assets/95db62b5-65bb-40af-ac0b-1d415682af88) + +### 演讲时能看到什么 + +- **当前页与下一页**:上下排列并始终保持 `16:9`,小屏时整页等比缩放,不裁切、不挤压文字 +- **宫格选页**:在预览区原位切换总览,点选页面后立即回到双预览,观众屏同步跟随 +- **结构化备注**:标题、本页目的、讲述要点和转场必填;互动、语气、翻页时机、备用方案和读音等信息只在大纲提供时显示 +- **进度与状态**:显示当前页 / 总页数、完成百分比,以及观众屏的连接中、已同步、未同步、已冻结、未连接或弹窗被拦截状态 + +### 时间、排练与自动翻页 + +- 底栏分别显示已进行、本页和剩余 / 超时时间,按钮明确区分“开始计时 / 继续计时 / 重置计时” +- 排练模式记录每页实际时长和整场汇总,数据保存在本地浏览器,不会做 AI 评分 +- 自动翻页默认关闭;只有大纲明确给出页面停留秒数,或用户在设置中开启全局间隔时才启用 +- 打开宫格、设置、圈选工具,页面隐藏,或观众屏暂停 / 失去同步时,自动翻页会暂停 + +### 现场工具与故障恢复 + +- 激光笔、圈选和清除会同步到观众屏 +- 一键黑屏、白屏,或冻结观众屏;恢复后自动追平演讲者当前页 +- 观众窗口关闭或心跳超时后明确显示“未连接”,可随时点击“重新打开观众屏” +- 退出演讲时自动关闭观众窗口;浏览器不允许自关时,观众端显示“演示已结束” +- 演前检查覆盖弹窗、全屏、字体、图片 / 视频和 `16:9` 预览,并提醒人工确认 HDMI、转接器和投影仪 + +常用快捷键:`← / →` 翻页,`Home / End` 跳首页或尾页,`G` 宫格,`L` 激光笔,`C` 圈选,`B / W` 黑屏或白屏,`F` 冻结观众屏,`?` 查看完整快捷键。 + +让 Agent 生成或补齐演讲模式时,可以直接说: + +```text +根据这份大纲给每一页补齐演讲目的、讲述要点、转场和计划时长。没有提供的互动或现场信息不要猜,然后运行演讲模式校验器。 +``` + +演讲备注契约和完整行为说明见 [`references/presenter-mode.md`](./references/presenter-mode.md)。校验命令: + +```bash +node scripts/validate-presenter-mode.mjs path/to/index.html +node scripts/validate-presenter-mode.mjs path/to/index.html --target-minutes 30 +``` + ## Style B 瑞士风 瑞士风是这次新增的结构化主题。它不是"换一套 CSS",而是一套更严格的版式系统。 @@ -259,7 +310,9 @@ guizang-ppt-skill/ │ ├── template-swiss.html ← Style B 瑞士国际主义模板 │ └── screenshot-backgrounds/ ← 截图美化内置背景(WebP):style-a 5 套 / style-b 4 套 ├── scripts/ -│ └── validate-swiss-deck.mjs ← 瑞士风版式校验器 +│ ├── validate-swiss-deck.mjs ← 瑞士风版式校验器 +│ ├── validate-presenter-mode.mjs ← 演讲备注、时长和运行时校验器 +│ └── check-presenter-runtime-sync.mjs ← 两套模板演讲者运行时防漂移检查 └── references/ ├── components.md ← 组件手册(字体、色、网格、图标、callout、stat、pipeline) ├── layouts.md ← 10 种页面布局骨架(可直接粘贴) @@ -269,6 +322,7 @@ guizang-ppt-skill/ ├── themes-swiss.md ← 4 套瑞士风锚点色 ├── image-prompts.md ← GPT-Image 2.0 / GPT-M 2.0 配图类型、比例和基础提示词 ├── screenshot-framing.md ← CleanShot X 式截图适配语义 + ├── presenter-mode.md ← 演讲备注契约、排练、观众屏与现场工具说明 └── checklist.md ← 质量检查清单(P0 / P1 / P2 / P3 分级) ``` @@ -342,6 +396,12 @@ guizang-ppt-skill/ **Codex 配图是必须的吗?** 不是。没有配图也能生成 PPT。配图流程只在需要照片、信息图、UI 情景图或封面时使用。 +**演讲者模式需要联网或额外服务吗?** +不需要。双窗口同步、备注、计时、排练、自动翻页和标注都在本地浏览器完成。它不会提供实时字幕、手机遥控或 AI 排练评分。 + +**为什么关掉观众窗口后显示“未连接”?** +演讲者端会通过观众屏确认和心跳判断软件链路。窗口关闭或心跳超时会显示“未连接”,点击“重新打开观众屏”即可恢复。浏览器无法判断 HDMI 或投影仪线缆是否真的接通,现场仍需目视确认。 + **怎么更新到最新版?** 重新运行安装命令,或在本地 skill 目录执行 `git pull`。 @@ -352,6 +412,8 @@ Bug、排版问题、新布局需求——欢迎开 Issue 或 PR。改动请优 - 在 `template.html` 里补类,不要让 layouts.md 使用未定义的类 - 在 `template-swiss.html` 里补类时,同步更新 `layouts-swiss.md` 和 `swiss-layout-lock.md` - 瑞士风新增规则后,同步更新 `scripts/validate-swiss-deck.mjs` +- 演讲者运行时必须同时更新两套模板,并运行 `scripts/check-presenter-runtime-sync.mjs`;CI 会拦截两份模板的 CSS / JavaScript 漂移 +- 演讲备注或现场行为变化时,同步更新 `references/presenter-mode.md`、`references/checklist.md` 和 `scripts/validate-presenter-mode.mjs` - 把踩过的坑写到 `checklist.md` 对应的 P0 / P1 / P2 / P3 级别 - 新主题色进 `themes.md` 并给出适合的场景 diff --git a/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/SKILL.md b/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/SKILL.md index 8e89580c..60f85145 100644 --- a/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/SKILL.md +++ b/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/SKILL.md @@ -448,9 +448,10 @@ cp "/assets/template-swiss.html" "项目/XXX/ppt/index.html" ```bash node /scripts/validate-presenter-mode.mjs path/to/index.html node /scripts/validate-presenter-mode.mjs path/to/index.html --target-minutes 30 +node /scripts/check-presenter-runtime-sync.mjs ``` -它会拦截缺失/重复页面 ID、备注与页面错位、必填字段或可选字段类型错误、完整时间计划超出 90% 预算,以及计时、排练、自动翻页、标注、演前检查和观众屏恢复控件缺失。 +第一个脚本会拦截缺失/重复页面 ID、备注与页面错位、必填字段或可选字段类型错误、完整时间计划超出 90% 预算,以及计时、排练、自动翻页、标注、演前检查和观众屏恢复控件缺失。第二个脚本会拦截两套模板之间的演讲者 CSS / JS 漂移。 #### 4.0.1 · 先量后改:超出 / 空白 / 标题间距 diff --git a/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/assets/template-swiss.html b/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/assets/template-swiss.html index 70ff265f..455cb527 100644 --- a/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/assets/template-swiss.html +++ b/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/assets/template-swiss.html @@ -563,7 +563,7 @@ body.ppt-audience #hint,body.ppt-audience #nav, body.ppt-preview #hint,body.ppt-preview #nav{display:none!important} body.ppt-audience{cursor:none} - body.ppt-preview{pointer-events:none} + body.ppt-preview{pointer-events:none}body.ppt-preview #deck{transition:none!important} body.ppt-presenter>#deck,body.ppt-presenter>#nav,body.ppt-presenter>#hint, body.ppt-presenter>.bg{visibility:hidden} #ppt-presenter{position:fixed;inset:0;z-index:90;display:none;min-width:0;min-height:0;overflow:hidden;background:#101216;color:#f5f6f7;font-family:Inter,"Noto Sans SC",sans-serif} @@ -583,9 +583,9 @@ .ppt-stage-label{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:11px 14px;color:#aeb4be;font-size:13px;border-bottom:1px solid #292d34} .ppt-annotation-tools{display:flex;align-items:center;gap:5px;margin-left:auto}.ppt-annotation-tools .ppt-ui-btn{padding:6px 9px;font-size:12px}.ppt-annotation-tools .ppt-ui-btn.is-active{color:#111318;background:#ff5b63;border-color:#ff5b63}.ppt-annotation-tools .ppt-grid-btn.is-active{color:#111318;background:#edf1f5;border-color:#edf1f5}.ppt-annotation-tools .ppt-clear-btn{min-width:0}.ppt-grid-btn{display:inline-flex;align-items:center;gap:6px}.ppt-grid-icon{display:grid;grid-template-columns:repeat(2,4px);gap:2px}.ppt-grid-icon i{width:4px;height:4px;background:currentColor} .ppt-frame-viewport{position:relative;display:grid;place-items:center;min-width:0;min-height:0;overflow:hidden;background:#08090b} - .ppt-frame{display:block;width:0;height:0;max-width:100%;max-height:100%;aspect-ratio:16/9;border:0;background:#08090b}.ppt-next-frame{opacity:.86} + .ppt-frame{display:block;width:0;height:0;max-width:100%;max-height:100%;aspect-ratio:16/9;border:0;background:#08090b}.ppt-next-frame{opacity:.86}#ppt-next-card.is-end .ppt-frame{visibility:hidden}#ppt-next-card.is-end .ppt-frame-viewport::after{content:"演示结束";position:absolute;color:#727a86;font:650 14px/1 Inter,"Noto Sans SC",sans-serif;letter-spacing:.08em} .ppt-annotation-layer{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);z-index:4;width:0;height:0;pointer-events:none;touch-action:none}.ppt-annotation-layer.is-active{pointer-events:auto;cursor:crosshair} - #ppt-audience-ink{position:fixed;inset:0;z-index:70;width:100vw;height:100vh;pointer-events:none}#ppt-audience-cover{position:fixed;inset:0;z-index:80;display:none;pointer-events:none} + #ppt-audience-ink{position:fixed;inset:0;z-index:70;width:100vw;height:100vh;pointer-events:none}#ppt-audience-cover{position:fixed;inset:0;z-index:80;display:none;pointer-events:none}#ppt-audience-cover.is-ended{display:grid!important;place-items:center;background:#101216!important;color:#f5f6f7;font:650 clamp(24px,3vw,46px)/1.2 Inter,"Noto Sans SC",sans-serif;letter-spacing:.08em} .ppt-preview-stack.is-overview>.ppt-stage-card{display:none}.ppt-presenter-overview{grid-row:1/-1;display:grid;grid-template-rows:auto minmax(0,1fr);min-width:0;min-height:0}.ppt-presenter-overview[hidden]{display:none}.ppt-overview-head{display:flex;align-items:center;justify-content:space-between;padding:13px 15px;border-bottom:1px solid #292d34}.ppt-overview-head strong{font-size:15px}.ppt-overview-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:10px;align-content:start;overflow:auto;padding:14px}.ppt-overview-page{appearance:none;min-height:112px;display:grid;grid-template-rows:auto 1fr auto;gap:12px;padding:13px;border:1px solid #343943;border-radius:10px;background:#111318;color:#eef1f4;text-align:left;cursor:pointer}.ppt-overview-page:hover{background:#1d2128;border-color:#636b78}.ppt-overview-page.is-current{border-color:#84a8ff;box-shadow:inset 0 0 0 1px #84a8ff}.ppt-overview-page-no{color:#8f97a3;font:600 12px/1 var(--mono,monospace)}.ppt-overview-page-title{font-size:14px;font-weight:650;line-height:1.35}.ppt-overview-page-meta{display:flex;justify-content:space-between;gap:8px;color:#7f8793;font-size:11px} .ppt-notes-card{display:grid;grid-template-rows:auto minmax(0,1fr);min-height:0}.ppt-notes-head{padding:16px 18px;border-bottom:1px solid #292d34}.ppt-notes-label{margin-bottom:6px;color:#848c98;font-size:11px;font-weight:700;letter-spacing:.12em;text-transform:uppercase}.ppt-notes-title{font-size:21px;font-weight:680;line-height:1.32}.ppt-purpose-block{margin-top:14px;padding:11px 12px;border-left:3px solid #84a8ff;background:#111318}.ppt-purpose-copy{color:#c9ced6;font-size:14px;line-height:1.55}.ppt-notes-draft-head{display:flex;align-items:flex-end;justify-content:space-between;gap:10px;margin-top:15px;padding-top:13px;border-top:1px solid #2d3139}.ppt-notes-draft-head .ppt-notes-label{margin:0 0 4px}.ppt-note-meta{color:#8f97a3;font-size:12px} .ppt-notes-tools{display:flex;align-items:center;gap:6px}.ppt-notes-tools .ppt-ui-btn{padding:7px 9px}.ppt-note-editor{width:100%;height:100%;min-height:0;resize:none;border:0;outline:0;background:#171a20;color:#edf0f3;padding:18px;font:400 var(--ppt-note-size,17px)/1.72 Inter,"Noto Sans SC",sans-serif}.ppt-note-editor:focus{box-shadow:inset 0 0 0 1px #3d4654} @@ -600,6 +600,7 @@ @media(max-width:1100px){.ppt-presenter-bottom{grid-template-columns:minmax(292px,1fr) auto minmax(86px,.6fr);gap:12px}.ppt-time-stat{min-width:82px;padding:0 11px}.ppt-time-value{font-size:20px}.ppt-controls .ppt-ui-btn,.ppt-session-actions .ppt-ui-btn{min-width:60px;padding:8px 9px}} @media(max-width:900px){.ppt-presenter-top{padding:12px 16px;flex-wrap:wrap}.ppt-presenter-top .ppt-presenter-meta{gap:6px}.ppt-presenter-top .ppt-ui-btn{padding:8px 9px}.ppt-presenter-main,#ppt-presenter[data-layout="slides"] .ppt-presenter-main,#ppt-presenter[data-layout="notes"] .ppt-presenter-main{grid-template-columns:minmax(0,1.45fr) minmax(250px,.72fr);gap:12px;padding:12px 16px}.ppt-preview-stack{gap:12px;grid-template-rows:minmax(0,1fr) clamp(104px,20vh,150px)}.ppt-saved{display:none}.ppt-presenter-bottom{grid-template-columns:minmax(270px,1fr) auto 74px;gap:8px;padding:9px 16px}.ppt-time-stat{min-width:0;padding:0 9px}.ppt-time-value{font-size:18px}.ppt-time-hint{max-width:78px;overflow:hidden;text-overflow:ellipsis}.ppt-controls,.ppt-session-actions{gap:5px}.ppt-controls .ppt-ui-btn,.ppt-session-actions .ppt-ui-btn{min-width:52px;padding:7px 8px;font-size:12px}.ppt-page-state strong{font-size:14px}.ppt-dialog-grid{grid-template-columns:1fr}.ppt-segmented.screen{grid-template-columns:repeat(2,1fr)}} @media(max-height:700px){.ppt-presenter-top{padding-top:10px;padding-bottom:10px}.ppt-presenter-main{padding-top:10px;padding-bottom:10px}.ppt-preview-stack{grid-template-rows:minmax(0,1fr) clamp(88px,16vh,118px);gap:10px}.ppt-stage-label{padding:7px 10px}.ppt-notes-head{padding:12px 14px}.ppt-purpose-block{margin-top:10px;padding:8px 10px}.ppt-notes-draft-head{margin-top:10px;padding-top:9px}.ppt-presenter-bottom{padding-top:8px;padding-bottom:8px}.ppt-control-stack{gap:5px}.ppt-session-actions{padding-top:5px}} + /* ============ /演讲者模式 ============ */ /* ESC 索引页: 动画元素强制可见 (覆盖 motion-ready 的 opacity:0) */ #overview [data-anim]{opacity:1!important;transform:none!important} @@ -1602,7 +1603,7 @@ window.__pptPresenter=(()=>{ function noteAt(i){ const id=slideId(i); - return notes().find(n=>n.id===id)||{id,title:slides[i]?.dataset.title||`第 ${i+1} 页`,purpose:'待补充本页目的',talk:['待补充讲述要点'],transition:'待补充转场'}; + return notes().find(n=>n.id===id)||{id,title:slides[i]?.dataset.title||`第 ${i+1} 页`,purpose:'—',talk:[],transition:''}; } function slideLabel(i){return `${i+1} / ${total} · ${noteAt(i).title||slideId(i)}`;} function escapeHTML(value){return String(value??'').replace(/[&<>"']/g,ch=>({'&':'&','<':'<','>':'>','"':'"',"'":'''}[ch]));} @@ -1616,7 +1617,7 @@ window.__pptPresenter=(()=>{ if(n.transition)parts.push(`【转场】\n${n.transition}`); const optional=[['舞台提示',n.cue],['互动',n.interaction],['表达提示',n.delivery],['翻页时机',n.advance],['备用方案',n.fallback],['读音提醒',n.pronunciation]]; optional.forEach(([label,value])=>{const text=valueLines(value);if(text)parts.push(`【${label}】\n${text}`);}); - return parts.join('\n\n'); + return parts.join('\n\n')||'—'; } function noteStorageKey(id){return `guizang-ppt-note:${location.pathname}:${id}`;} function loadNoteValue(id,i,n){ @@ -1634,6 +1635,14 @@ window.__pptPresenter=(()=>{ url.searchParams.set('mode',targetMode);url.searchParams.set('session',session);url.searchParams.set('slide',String(i+1)); return url.href; } + function postPreviewGoto(frame,i){ + try{frame.contentWindow?.postMessage({__guizangPptSync:1,session,role:'presenter',type:'preview-goto',index:i},'*');}catch(e){} + } + function updatePreviewFrame(frame,i){ + frame.dataset.slide=String(i); + if(!frame.dataset.previewBound){frame.dataset.previewBound='1';frame.addEventListener('load',()=>postPreviewGoto(frame,Number(frame.dataset.slide)));} + if(!frame.getAttribute('src'))frame.src=frameUrl('preview',i);else postPreviewGoto(frame,i); + } function plannedMsAt(i){ const minutes=Number(noteAt(i).minutes); return Number.isFinite(minutes)&&minutes>0?minutes*60000:null; @@ -1756,7 +1765,7 @@ window.__pptPresenter=(()=>{
演讲者视图
观众屏 · 未连接
当前页
下一页
标题
本页目的
草稿(备注)
已保存
-
已进行00:00总时长
本页00:00计划 —
计划未设置
+
已进行00:00总时长
本页00:00计划 —
计划未设置
`); document.getElementById('ppt-reopen').onclick=reopenAudience; @@ -1790,8 +1799,9 @@ window.__pptPresenter=(()=>{ if(mode!=='presenter')return;mountShell(); const n=noteAt(idx),next=Math.min(idx+1,total-1),id=slideId(idx),editor=document.getElementById('ppt-note-editor'); const currentFrame=document.getElementById('ppt-current-frame'),nextFrame=document.getElementById('ppt-next-frame'); - if(currentFrame.dataset.slide!==String(idx)){currentFrame.src=frameUrl('preview',idx);currentFrame.dataset.slide=String(idx);} - if(nextFrame.dataset.slide!==String(next)){nextFrame.src=frameUrl('preview',next);nextFrame.dataset.slide=String(next);} + if(currentFrame.dataset.slide!==String(idx))updatePreviewFrame(currentFrame,idx); + if(nextFrame.dataset.slide!==String(next))updatePreviewFrame(nextFrame,next); + document.getElementById('ppt-next-card').classList.toggle('is-end',idx===total-1); document.getElementById('ppt-current-label').textContent=`${idx+1} / ${total}`; document.getElementById('ppt-next-label').textContent=idx===total-1?'已到尾页':`${next+1} / ${total}`; document.getElementById('ppt-notes-title').textContent=n.title||`第 ${idx+1} 页`; @@ -1828,7 +1838,7 @@ window.__pptPresenter=(()=>{ if(plan)plan.textContent=totalPlan?`计划 ${Number(totalPlan/60000).toFixed(1)} 分钟 · 预计 ${clockTime(Date.now()+Math.max(0,totalPlan-totalUsed))}`:'计划 —'; const section=sectionInfo(idx),sectionEl=document.getElementById('ppt-section'); if(sectionEl){sectionEl.hidden=!section;sectionEl.textContent=section?`${section.name} · ${section.position}/${section.count}${section.planned?` · 剩余 ${durationText(Math.max(0,section.planned-section.used))}`:''}`:'';} - const timerButton=document.getElementById('ppt-timer-toggle');if(timerButton)timerButton.textContent=timerRunning?'暂停':(totalUsed?'继续':'开始'); + const timerButton=document.getElementById('ppt-timer-toggle');if(timerButton)timerButton.textContent=timerRunning?'暂停':(totalUsed?'继续计时':'开始计时'); const rehearsalButton=document.getElementById('ppt-rehearsal');if(rehearsalButton){rehearsalButton.textContent=rehearsalActive?'结束排练':'排练';rehearsalButton.classList.toggle('ppt-rehearsal-on',rehearsalActive);} renderAutoState(); } @@ -1898,8 +1908,13 @@ window.__pptPresenter=(()=>{ } function applyAudienceScreen(value){ const cover=document.getElementById('ppt-audience-cover');if(!cover)return; + cover.classList.remove('is-ended');cover.textContent=''; if(value==='black'||value==='white'){cover.style.display='block';cover.style.background=value;}else cover.style.display='none'; } + function showAudienceEnded(){ + const cover=document.getElementById('ppt-audience-cover');if(cover){cover.style.display='';cover.style.background='';cover.textContent='演示已结束';cover.classList.add('is-ended');} + setTimeout(()=>{try{window.close();}catch(e){}},120); + } function setScreenMode(value){ const next=['normal','black','white','frozen'].includes(value)?value:'normal',wasFrozen=audienceFrozen; screenMode=next;audienceFrozen=next==='frozen';emit({type:'screen',mode:next}); @@ -1959,6 +1974,7 @@ window.__pptPresenter=(()=>{ return; } if(mode!=='audience')return; + if(message.type==='bye'){showAudienceEnded();return;} if(message.type==='screen'){applyAudienceScreen(message.mode);return;} if(message.type==='laser'&&Number(message.index)===idx){audienceLaser=message.point||null;audienceLaserHideAt=Date.now()+650;renderInks();return;} if(message.type==='circle'&&Number(message.index)===idx&&message.circle){audienceCircles.push(message.circle);renderInks();return;} @@ -1968,14 +1984,18 @@ window.__pptPresenter=(()=>{ emit({type:'ack',index:idx,seq:Number(message.seq)}); } } + function receivePreview(message){ + if(!message||message.__guizangPptSync!==1||message.session!==session||message.role!=='presenter'||message.type!=='preview-goto')return; + go(Number(message.index),{force:true}); + } function sendGoto(force=false){ if(mode!=='presenter'||audienceFrozen)return;if(force||lastAckIndex!==idx)seq++; emit({type:'goto',index:idx,seq,screenMode,circles});updateSyncStatus(); } function syncState(){ if(popupBlocked)return'blocked';if(audienceWindow&&audienceWindow.closed)return'disconnected';if(audienceFrozen)return'frozen'; - if(!lastAckAt)return audienceOpenedAt&&Date.now()-audienceOpenedAt<2600?'connecting':(audienceOpenedAt?'unsynced':'disconnected'); - if(Date.now()-lastAckAt>2600||lastAckIndex!==idx||lastAckSeq2600)return'disconnected';if(lastAckIndex!==idx||lastAckSeq{ window.__setLowPowerMode?.(true,{persist:false});updateShell();armAutoAdvance();if(openAudience)reopenAudience(); } function exitPresenter(){ - if(rehearsalActive)finishRehearsal(false);else if(timerRunning){commitRunningTime();timerRunning=false;}togglePresenterOverview(false);emit({type:'bye'});mode='deck';document.body.classList.remove('ppt-presenter');document.title=originalTitle;window.__setLowPowerMode?.(lowPowerBeforePresenter,{persist:false}); + if(rehearsalActive)finishRehearsal(false);else if(timerRunning){commitRunningTime();timerRunning=false;}togglePresenterOverview(false);emit({type:'bye'});audienceWindow=null;audienceOpenedAt=0;lastAckAt=0;lastAckIndex=-1;lastAckSeq=-1;mode='deck';document.body.classList.remove('ppt-presenter');document.title=originalTitle;window.__setLowPowerMode?.(lowPowerBeforePresenter,{persist:false}); } function initAudience(){ mode='audience';document.body.classList.add('ppt-audience');document.title=`观众屏 · ${originalTitle}`; @@ -2002,7 +2022,7 @@ window.__pptPresenter=(()=>{ const resize=()=>{sizeInk(document.getElementById('ppt-audience-ink'),innerWidth,innerHeight);renderInks();};addEventListener('resize',resize);resize(); initTransport();emit({type:'ready',index:idx}); } - function initPreview(){mode='preview';document.body.classList.add('ppt-preview');window.__setLowPowerMode?.(true,{persist:false});} + function initPreview(){mode='preview';document.body.classList.add('ppt-preview');window.__setLowPowerMode?.(true,{persist:false});addEventListener('message',e=>{if(e.source===parent)receivePreview(e.data);});} function onSlideChange(nextIndex){ if(mode!=='presenter')return;rollSlideTimer(nextIndex);circles=[];draftCircle=null;laserPoint=null;annotationPointerDown=false;armAutoAdvance();updateShell();sendGoto(); } @@ -2013,9 +2033,9 @@ window.__pptPresenter=(()=>{ if(mode==='deck'&&e.key?.toLowerCase()==='p'&&!e.metaKey&&!e.ctrlKey&&!e.altKey){e.preventDefault();enterPresenter(true);return true;} if(mode!=='presenter')return false; const key=e.key?.toLowerCase(); - if(e.key==='?'||key==='/'){e.preventDefault();openShortcuts();return true;} const dialog=document.getElementById('ppt-dialog'); if(!dialog?.hidden){if(e.key==='Escape'){e.preventDefault();closeDialog();}return true;} + if(e.key==='?'||key==='/'){e.preventDefault();openShortcuts();return true;} if(e.key==='Escape'){e.preventDefault();if(annotationTool!=='none')setAnnotationTool('none');else togglePresenterOverview();return true;} if(presenterOverviewOn)return true; if(key==='l'){e.preventDefault();setAnnotationTool('laser');return true;} @@ -2044,6 +2064,7 @@ window.__pptPresenter=(()=>{ },250); return{initMode,onSlideChange,handleKey,slideLabel,enterPresenter,reopenAudience,toggleOverview:togglePresenterOverview,debugState:()=>({mode,idx,session,syncState:syncState(),timerRunning,rehearsalActive,presenterOverviewOn,autoEnabled,autoGlobalSeconds,autoRemainingMs,screenMode,annotationTool,circles:[...circles],audienceCircles:[...audienceCircles],layoutMode})}; })(); +/* =============== /演讲者模式 / 观众屏同步 =============== */ addEventListener('keydown',e=>{ if(window.__pptPresenter?.handleKey(e))return; diff --git a/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/assets/template.html b/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/assets/template.html index 1322a624..280488b6 100644 --- a/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/assets/template.html +++ b/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/assets/template.html @@ -207,7 +207,7 @@ body.ppt-audience #hint,body.ppt-audience #nav, body.ppt-preview #hint,body.ppt-preview #nav{display:none!important} body.ppt-audience{cursor:none} - body.ppt-preview{pointer-events:none} + body.ppt-preview{pointer-events:none}body.ppt-preview #deck{transition:none!important} body.ppt-presenter>#deck,body.ppt-presenter>#nav,body.ppt-presenter>#hint, body.ppt-presenter>.bg{visibility:hidden} #ppt-presenter{position:fixed;inset:0;z-index:90;display:none;min-width:0;min-height:0;overflow:hidden;background:#101216;color:#f5f6f7;font-family:Inter,"Noto Sans SC",sans-serif} @@ -227,9 +227,9 @@ .ppt-stage-label{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:11px 14px;color:#aeb4be;font-size:13px;border-bottom:1px solid #292d34} .ppt-annotation-tools{display:flex;align-items:center;gap:5px;margin-left:auto}.ppt-annotation-tools .ppt-ui-btn{padding:6px 9px;font-size:12px}.ppt-annotation-tools .ppt-ui-btn.is-active{color:#111318;background:#ff5b63;border-color:#ff5b63}.ppt-annotation-tools .ppt-grid-btn.is-active{color:#111318;background:#edf1f5;border-color:#edf1f5}.ppt-annotation-tools .ppt-clear-btn{min-width:0}.ppt-grid-btn{display:inline-flex;align-items:center;gap:6px}.ppt-grid-icon{display:grid;grid-template-columns:repeat(2,4px);gap:2px}.ppt-grid-icon i{width:4px;height:4px;background:currentColor} .ppt-frame-viewport{position:relative;display:grid;place-items:center;min-width:0;min-height:0;overflow:hidden;background:#08090b} - .ppt-frame{display:block;width:0;height:0;max-width:100%;max-height:100%;aspect-ratio:16/9;border:0;background:#08090b}.ppt-next-frame{opacity:.86} + .ppt-frame{display:block;width:0;height:0;max-width:100%;max-height:100%;aspect-ratio:16/9;border:0;background:#08090b}.ppt-next-frame{opacity:.86}#ppt-next-card.is-end .ppt-frame{visibility:hidden}#ppt-next-card.is-end .ppt-frame-viewport::after{content:"演示结束";position:absolute;color:#727a86;font:650 14px/1 Inter,"Noto Sans SC",sans-serif;letter-spacing:.08em} .ppt-annotation-layer{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);z-index:4;width:0;height:0;pointer-events:none;touch-action:none}.ppt-annotation-layer.is-active{pointer-events:auto;cursor:crosshair} - #ppt-audience-ink{position:fixed;inset:0;z-index:70;width:100vw;height:100vh;pointer-events:none}#ppt-audience-cover{position:fixed;inset:0;z-index:80;display:none;pointer-events:none} + #ppt-audience-ink{position:fixed;inset:0;z-index:70;width:100vw;height:100vh;pointer-events:none}#ppt-audience-cover{position:fixed;inset:0;z-index:80;display:none;pointer-events:none}#ppt-audience-cover.is-ended{display:grid!important;place-items:center;background:#101216!important;color:#f5f6f7;font:650 clamp(24px,3vw,46px)/1.2 Inter,"Noto Sans SC",sans-serif;letter-spacing:.08em} .ppt-preview-stack.is-overview>.ppt-stage-card{display:none}.ppt-presenter-overview{grid-row:1/-1;display:grid;grid-template-rows:auto minmax(0,1fr);min-width:0;min-height:0}.ppt-presenter-overview[hidden]{display:none}.ppt-overview-head{display:flex;align-items:center;justify-content:space-between;padding:13px 15px;border-bottom:1px solid #292d34}.ppt-overview-head strong{font-size:15px}.ppt-overview-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:10px;align-content:start;overflow:auto;padding:14px}.ppt-overview-page{appearance:none;min-height:112px;display:grid;grid-template-rows:auto 1fr auto;gap:12px;padding:13px;border:1px solid #343943;border-radius:10px;background:#111318;color:#eef1f4;text-align:left;cursor:pointer}.ppt-overview-page:hover{background:#1d2128;border-color:#636b78}.ppt-overview-page.is-current{border-color:#84a8ff;box-shadow:inset 0 0 0 1px #84a8ff}.ppt-overview-page-no{color:#8f97a3;font:600 12px/1 var(--mono,monospace)}.ppt-overview-page-title{font-size:14px;font-weight:650;line-height:1.35}.ppt-overview-page-meta{display:flex;justify-content:space-between;gap:8px;color:#7f8793;font-size:11px} .ppt-notes-card{display:grid;grid-template-rows:auto minmax(0,1fr);min-height:0}.ppt-notes-head{padding:16px 18px;border-bottom:1px solid #292d34}.ppt-notes-label{margin-bottom:6px;color:#848c98;font-size:11px;font-weight:700;letter-spacing:.12em;text-transform:uppercase}.ppt-notes-title{font-size:21px;font-weight:680;line-height:1.32}.ppt-purpose-block{margin-top:14px;padding:11px 12px;border-left:3px solid #84a8ff;background:#111318}.ppt-purpose-copy{color:#c9ced6;font-size:14px;line-height:1.55}.ppt-notes-draft-head{display:flex;align-items:flex-end;justify-content:space-between;gap:10px;margin-top:15px;padding-top:13px;border-top:1px solid #2d3139}.ppt-notes-draft-head .ppt-notes-label{margin:0 0 4px}.ppt-note-meta{color:#8f97a3;font-size:12px} .ppt-notes-tools{display:flex;align-items:center;gap:6px}.ppt-notes-tools .ppt-ui-btn{padding:7px 9px}.ppt-note-editor{width:100%;height:100%;min-height:0;resize:none;border:0;outline:0;background:#171a20;color:#edf0f3;padding:18px;font:400 var(--ppt-note-size,17px)/1.72 Inter,"Noto Sans SC",sans-serif}.ppt-note-editor:focus{box-shadow:inset 0 0 0 1px #3d4654} @@ -244,6 +244,7 @@ @media(max-width:1100px){.ppt-presenter-bottom{grid-template-columns:minmax(292px,1fr) auto minmax(86px,.6fr);gap:12px}.ppt-time-stat{min-width:82px;padding:0 11px}.ppt-time-value{font-size:20px}.ppt-controls .ppt-ui-btn,.ppt-session-actions .ppt-ui-btn{min-width:60px;padding:8px 9px}} @media(max-width:900px){.ppt-presenter-top{padding:12px 16px;flex-wrap:wrap}.ppt-presenter-top .ppt-presenter-meta{gap:6px}.ppt-presenter-top .ppt-ui-btn{padding:8px 9px}.ppt-presenter-main,#ppt-presenter[data-layout="slides"] .ppt-presenter-main,#ppt-presenter[data-layout="notes"] .ppt-presenter-main{grid-template-columns:minmax(0,1.45fr) minmax(250px,.72fr);gap:12px;padding:12px 16px}.ppt-preview-stack{gap:12px;grid-template-rows:minmax(0,1fr) clamp(104px,20vh,150px)}.ppt-saved{display:none}.ppt-presenter-bottom{grid-template-columns:minmax(270px,1fr) auto 74px;gap:8px;padding:9px 16px}.ppt-time-stat{min-width:0;padding:0 9px}.ppt-time-value{font-size:18px}.ppt-time-hint{max-width:78px;overflow:hidden;text-overflow:ellipsis}.ppt-controls,.ppt-session-actions{gap:5px}.ppt-controls .ppt-ui-btn,.ppt-session-actions .ppt-ui-btn{min-width:52px;padding:7px 8px;font-size:12px}.ppt-page-state strong{font-size:14px}.ppt-dialog-grid{grid-template-columns:1fr}.ppt-segmented.screen{grid-template-columns:repeat(2,1fr)}} @media(max-height:700px){.ppt-presenter-top{padding-top:10px;padding-bottom:10px}.ppt-presenter-main{padding-top:10px;padding-bottom:10px}.ppt-preview-stack{grid-template-rows:minmax(0,1fr) clamp(88px,16vh,118px);gap:10px}.ppt-stage-label{padding:7px 10px}.ppt-notes-head{padding:12px 14px}.ppt-purpose-block{margin-top:10px;padding:8px 10px}.ppt-notes-draft-head{margin-top:10px;padding-top:9px}.ppt-presenter-bottom{padding-top:8px;padding-bottom:8px}.ppt-control-stack{gap:5px}.ppt-session-actions{padding-top:5px}} + /* ============ /演讲者模式 ============ */ /* ============================================================ ============ LAYOUTS API · 面向 agent 的类(v2)============ @@ -779,7 +780,7 @@ window.__pptPresenter=(()=>{ function noteAt(i){ const id=slideId(i); - return notes().find(n=>n.id===id)||{id,title:slides[i]?.dataset.title||`第 ${i+1} 页`,purpose:'待补充本页目的',talk:['待补充讲述要点'],transition:'待补充转场'}; + return notes().find(n=>n.id===id)||{id,title:slides[i]?.dataset.title||`第 ${i+1} 页`,purpose:'—',talk:[],transition:''}; } function slideLabel(i){return `${i+1} / ${total} · ${noteAt(i).title||slideId(i)}`;} function escapeHTML(value){return String(value??'').replace(/[&<>"']/g,ch=>({'&':'&','<':'<','>':'>','"':'"',"'":'''}[ch]));} @@ -793,7 +794,7 @@ window.__pptPresenter=(()=>{ if(n.transition)parts.push(`【转场】\n${n.transition}`); const optional=[['舞台提示',n.cue],['互动',n.interaction],['表达提示',n.delivery],['翻页时机',n.advance],['备用方案',n.fallback],['读音提醒',n.pronunciation]]; optional.forEach(([label,value])=>{const text=valueLines(value);if(text)parts.push(`【${label}】\n${text}`);}); - return parts.join('\n\n'); + return parts.join('\n\n')||'—'; } function noteStorageKey(id){return `guizang-ppt-note:${location.pathname}:${id}`;} function loadNoteValue(id,i,n){ @@ -811,6 +812,14 @@ window.__pptPresenter=(()=>{ url.searchParams.set('mode',targetMode);url.searchParams.set('session',session);url.searchParams.set('slide',String(i+1)); return url.href; } + function postPreviewGoto(frame,i){ + try{frame.contentWindow?.postMessage({__guizangPptSync:1,session,role:'presenter',type:'preview-goto',index:i},'*');}catch(e){} + } + function updatePreviewFrame(frame,i){ + frame.dataset.slide=String(i); + if(!frame.dataset.previewBound){frame.dataset.previewBound='1';frame.addEventListener('load',()=>postPreviewGoto(frame,Number(frame.dataset.slide)));} + if(!frame.getAttribute('src'))frame.src=frameUrl('preview',i);else postPreviewGoto(frame,i); + } function plannedMsAt(i){ const minutes=Number(noteAt(i).minutes); return Number.isFinite(minutes)&&minutes>0?minutes*60000:null; @@ -933,7 +942,7 @@ window.__pptPresenter=(()=>{
演讲者视图
观众屏 · 未连接
当前页
下一页
标题
本页目的
草稿(备注)
已保存
-
已进行00:00总时长
本页00:00计划 —
计划未设置
+
已进行00:00总时长
本页00:00计划 —
计划未设置
`); document.getElementById('ppt-reopen').onclick=reopenAudience; @@ -967,8 +976,9 @@ window.__pptPresenter=(()=>{ if(mode!=='presenter')return;mountShell(); const n=noteAt(idx),next=Math.min(idx+1,total-1),id=slideId(idx),editor=document.getElementById('ppt-note-editor'); const currentFrame=document.getElementById('ppt-current-frame'),nextFrame=document.getElementById('ppt-next-frame'); - if(currentFrame.dataset.slide!==String(idx)){currentFrame.src=frameUrl('preview',idx);currentFrame.dataset.slide=String(idx);} - if(nextFrame.dataset.slide!==String(next)){nextFrame.src=frameUrl('preview',next);nextFrame.dataset.slide=String(next);} + if(currentFrame.dataset.slide!==String(idx))updatePreviewFrame(currentFrame,idx); + if(nextFrame.dataset.slide!==String(next))updatePreviewFrame(nextFrame,next); + document.getElementById('ppt-next-card').classList.toggle('is-end',idx===total-1); document.getElementById('ppt-current-label').textContent=`${idx+1} / ${total}`; document.getElementById('ppt-next-label').textContent=idx===total-1?'已到尾页':`${next+1} / ${total}`; document.getElementById('ppt-notes-title').textContent=n.title||`第 ${idx+1} 页`; @@ -1005,7 +1015,7 @@ window.__pptPresenter=(()=>{ if(plan)plan.textContent=totalPlan?`计划 ${Number(totalPlan/60000).toFixed(1)} 分钟 · 预计 ${clockTime(Date.now()+Math.max(0,totalPlan-totalUsed))}`:'计划 —'; const section=sectionInfo(idx),sectionEl=document.getElementById('ppt-section'); if(sectionEl){sectionEl.hidden=!section;sectionEl.textContent=section?`${section.name} · ${section.position}/${section.count}${section.planned?` · 剩余 ${durationText(Math.max(0,section.planned-section.used))}`:''}`:'';} - const timerButton=document.getElementById('ppt-timer-toggle');if(timerButton)timerButton.textContent=timerRunning?'暂停':(totalUsed?'继续':'开始'); + const timerButton=document.getElementById('ppt-timer-toggle');if(timerButton)timerButton.textContent=timerRunning?'暂停':(totalUsed?'继续计时':'开始计时'); const rehearsalButton=document.getElementById('ppt-rehearsal');if(rehearsalButton){rehearsalButton.textContent=rehearsalActive?'结束排练':'排练';rehearsalButton.classList.toggle('ppt-rehearsal-on',rehearsalActive);} renderAutoState(); } @@ -1075,8 +1085,13 @@ window.__pptPresenter=(()=>{ } function applyAudienceScreen(value){ const cover=document.getElementById('ppt-audience-cover');if(!cover)return; + cover.classList.remove('is-ended');cover.textContent=''; if(value==='black'||value==='white'){cover.style.display='block';cover.style.background=value;}else cover.style.display='none'; } + function showAudienceEnded(){ + const cover=document.getElementById('ppt-audience-cover');if(cover){cover.style.display='';cover.style.background='';cover.textContent='演示已结束';cover.classList.add('is-ended');} + setTimeout(()=>{try{window.close();}catch(e){}},120); + } function setScreenMode(value){ const next=['normal','black','white','frozen'].includes(value)?value:'normal',wasFrozen=audienceFrozen; screenMode=next;audienceFrozen=next==='frozen';emit({type:'screen',mode:next}); @@ -1136,6 +1151,7 @@ window.__pptPresenter=(()=>{ return; } if(mode!=='audience')return; + if(message.type==='bye'){showAudienceEnded();return;} if(message.type==='screen'){applyAudienceScreen(message.mode);return;} if(message.type==='laser'&&Number(message.index)===idx){audienceLaser=message.point||null;audienceLaserHideAt=Date.now()+650;renderInks();return;} if(message.type==='circle'&&Number(message.index)===idx&&message.circle){audienceCircles.push(message.circle);renderInks();return;} @@ -1145,14 +1161,18 @@ window.__pptPresenter=(()=>{ emit({type:'ack',index:idx,seq:Number(message.seq)}); } } + function receivePreview(message){ + if(!message||message.__guizangPptSync!==1||message.session!==session||message.role!=='presenter'||message.type!=='preview-goto')return; + go(Number(message.index),{force:true}); + } function sendGoto(force=false){ if(mode!=='presenter'||audienceFrozen)return;if(force||lastAckIndex!==idx)seq++; emit({type:'goto',index:idx,seq,screenMode,circles});updateSyncStatus(); } function syncState(){ if(popupBlocked)return'blocked';if(audienceWindow&&audienceWindow.closed)return'disconnected';if(audienceFrozen)return'frozen'; - if(!lastAckAt)return audienceOpenedAt&&Date.now()-audienceOpenedAt<2600?'connecting':(audienceOpenedAt?'unsynced':'disconnected'); - if(Date.now()-lastAckAt>2600||lastAckIndex!==idx||lastAckSeq2600)return'disconnected';if(lastAckIndex!==idx||lastAckSeq{ window.__setLowPowerMode?.(true,{persist:false});updateShell();armAutoAdvance();if(openAudience)reopenAudience(); } function exitPresenter(){ - if(rehearsalActive)finishRehearsal(false);else if(timerRunning){commitRunningTime();timerRunning=false;}togglePresenterOverview(false);emit({type:'bye'});mode='deck';document.body.classList.remove('ppt-presenter');document.title=originalTitle;window.__setLowPowerMode?.(lowPowerBeforePresenter,{persist:false}); + if(rehearsalActive)finishRehearsal(false);else if(timerRunning){commitRunningTime();timerRunning=false;}togglePresenterOverview(false);emit({type:'bye'});audienceWindow=null;audienceOpenedAt=0;lastAckAt=0;lastAckIndex=-1;lastAckSeq=-1;mode='deck';document.body.classList.remove('ppt-presenter');document.title=originalTitle;window.__setLowPowerMode?.(lowPowerBeforePresenter,{persist:false}); } function initAudience(){ mode='audience';document.body.classList.add('ppt-audience');document.title=`观众屏 · ${originalTitle}`; @@ -1179,7 +1199,7 @@ window.__pptPresenter=(()=>{ const resize=()=>{sizeInk(document.getElementById('ppt-audience-ink'),innerWidth,innerHeight);renderInks();};addEventListener('resize',resize);resize(); initTransport();emit({type:'ready',index:idx}); } - function initPreview(){mode='preview';document.body.classList.add('ppt-preview');window.__setLowPowerMode?.(true,{persist:false});} + function initPreview(){mode='preview';document.body.classList.add('ppt-preview');window.__setLowPowerMode?.(true,{persist:false});addEventListener('message',e=>{if(e.source===parent)receivePreview(e.data);});} function onSlideChange(nextIndex){ if(mode!=='presenter')return;rollSlideTimer(nextIndex);circles=[];draftCircle=null;laserPoint=null;annotationPointerDown=false;armAutoAdvance();updateShell();sendGoto(); } @@ -1190,9 +1210,9 @@ window.__pptPresenter=(()=>{ if(mode==='deck'&&e.key?.toLowerCase()==='p'&&!e.metaKey&&!e.ctrlKey&&!e.altKey){e.preventDefault();enterPresenter(true);return true;} if(mode!=='presenter')return false; const key=e.key?.toLowerCase(); - if(e.key==='?'||key==='/'){e.preventDefault();openShortcuts();return true;} const dialog=document.getElementById('ppt-dialog'); if(!dialog?.hidden){if(e.key==='Escape'){e.preventDefault();closeDialog();}return true;} + if(e.key==='?'||key==='/'){e.preventDefault();openShortcuts();return true;} if(e.key==='Escape'){e.preventDefault();if(annotationTool!=='none')setAnnotationTool('none');else togglePresenterOverview();return true;} if(presenterOverviewOn)return true; if(key==='l'){e.preventDefault();setAnnotationTool('laser');return true;} @@ -1221,6 +1241,7 @@ window.__pptPresenter=(()=>{ },250); return{initMode,onSlideChange,handleKey,slideLabel,enterPresenter,reopenAudience,toggleOverview:togglePresenterOverview,debugState:()=>({mode,idx,session,syncState:syncState(),timerRunning,rehearsalActive,presenterOverviewOn,autoEnabled,autoGlobalSeconds,autoRemainingMs,screenMode,annotationTool,circles:[...circles],audienceCircles:[...audienceCircles],layoutMode})}; })(); +/* =============== /演讲者模式 / 观众屏同步 =============== */ addEventListener('keydown',e=>{ if(window.__pptPresenter?.handleKey(e))return; diff --git a/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/docs/unification-plan.md b/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/docs/unification-plan.md index 6a1aeede..406e709d 100644 --- a/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/docs/unification-plan.md +++ b/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/docs/unification-plan.md @@ -1,7 +1,7 @@ # 多主题统一管理整合方案 > 基于对 template.html / template-swiss.html 两份模板与全部 references 的逐行对比分析(2026-07)。 -> 本文档是**方案建议**,尚未实施;按阶段推进,每个阶段独立可交付、可回滚。 +> 本文档是**方案建议**,尚未整体实施;按阶段推进,每个阶段独立可交付、可回滚。2026-08-07 已先为演讲者 CSS / JS 加入边界标记、字节级同步脚本和 GitHub Actions,但尚未提取共享源文件。 ## 现状诊断 @@ -52,6 +52,10 @@ - **a. 构建脚本**(推荐):`scripts/build-templates.mjs` 把 `src/runtime.js` + 各主题 `src/style-*.css` + 皮肤 HTML 组装成各 template*.html。模板仍是完整单文件,但源头唯一。 - **b. 文档约定**:不引入构建,把 runtime 段落用 `` 注释标记,改动时用脚本校验各份一致。成本低但漂移风险仍在。 +当前演讲者模式已先落地 Phase 1b 的防漂移护栏:`scripts/check-presenter-runtime-sync.mjs` 与 `.github/workflows/presenter-runtime-sync.yml`。它不替代长期的共享源提取,但可以防止修改只落到其中一份模板。 + +如果未来合并 Bento 分支,以 `main` 上的演讲者运行时为上游,采用 `main → bento` 的合并方向;不要用旧 Bento 模板反向覆盖 `main`。 + ### Phase 2 · 公共 Token 契约 在各模板间统一**命名和语义**(值可以不同): diff --git a/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/references/checklist.md b/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/references/checklist.md index d24fa163..dbefe207 100644 --- a/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/references/checklist.md +++ b/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/references/checklist.md @@ -16,15 +16,18 @@ - 演讲入口只放在右下角现有快捷控制区,显示 `P 演讲模式`。 - 演讲者主体只做“左侧预览 + 右侧备注”两栏;当前页在上、下一页在下,避免形成挤压当前页的三栏布局。 - 两个预览 iframe 必须严格保持 `16:9`,容器不足时等比缩小并留边,不得裁切或拉伸;小屏优先压缩下一页预览高度。 -- 底栏固定为“左时间、中控制、右页码进度”:左侧分组显示已进行/本页/剩余或超时,中间两行放翻页和会话控制,右侧只放页码与百分比;不要重复当前页标题。 +- 底栏固定为“左时间、中控制、右页码进度”:左侧分组显示已进行/本页/剩余或超时,中间两行放翻页和会话控制,右侧只放页码与百分比;不要重复当前页标题。会话控制使用“开始计时 / 继续计时 / 重置计时 / 排练”等明确动作名,不使用孤立的“开始”或“重置”。 - 翻页控制顺序固定为 `首页 / 上一页 / 下一页 / 尾页`;尾页时最后一个按钮变为“重新开始”。自动翻页放在右上角状态栏。 - `宫格` 放在当前页标题旁,打开时替换当前/下一页预览区;选中页面后回到预览,不要弹出突兀的全屏总览。 - 右侧卡片依次显示标题、本页目的和草稿备注;设置里的开关用胶囊 switch,时间间隔用美化后的加减 stepper。 - 观众屏必须显示软件链路状态:`连接中 / 已同步 / 未同步 / 未连接 / 弹窗被拦截`,并始终提供“重新打开观众屏”。 - 演讲者必须能看到总时长、本页时长、计划/剩余/超时;缺失 `minutes` 时显示横杠,不猜测。 +- 临时新增页面没有对应备注时,界面 fallback 只显示 `—`,不显示“待补充”;校验器仍要报告页面/备注数量不一致。 - 排练模式记录每页实际时长,本地保留最近 5 次;只做数据汇总,不做 AI 教练评分。 - 自动翻页默认关闭,`minutes` 与 `autoAdvanceSeconds` 必须分开;总览、圈选、设置、页面隐藏、观众屏暂停或失同步时倒计必须暂停。 - 必须提供激光笔、圈选、清除、黑屏、白屏和冻结/恢复;标注坐标要归一化同步到观众屏。 +- 预览 iframe 只初次加载,翻页改用 `postMessage` 同步页码;尾页的下一页预览显示“演示结束”,不重复当前页。 +- 退出演讲必须处理 `bye`:脚本打开的观众窗口自动关闭,无法自关时显示“演示已结束”;心跳超时必须显示“未连接”而不是永久停在“未同步”。 - 演前检查必须覆盖观众屏、弹窗、全屏、字体、图片/视频和 16:9;同时明确提醒它不能检测物理线缆。 - 备注里的 `section / cue / interaction / delivery / advance / fallback / pronunciation / autoAdvanceSeconds` 都是可选字段;用户大纲没有就整段隐藏。 - 每页必须有稳定、唯一的 `data-slide-id`;`SPEAKER_NOTES` 数量、顺序和 ID 必须逐页一致。 diff --git a/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/references/presenter-mode.md b/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/references/presenter-mode.md index 3efd9566..e5e3996b 100644 --- a/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/references/presenter-mode.md +++ b/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/references/presenter-mode.md @@ -25,6 +25,7 @@ - 大纲明确写了停顿、提问、Demo、视频、语气、翻页点或备用路径:分别写入对应的可选字段。 - 用户明确要求某页自动停留多少秒:才写 `autoAdvanceSeconds`。 - 没有提供的信息不猜测、不写“待补充”到演讲界面,直接省略字段。界面对缺失时长显示横杠,其他可选模块整段隐藏。 +- 如果页面在未运行校验的情况下临时新增,且没有对应备注,演讲者界面只显示中性横杠 `—`,不显示“待补充”或虚构内容;校验器仍应报告备注与页面不一致。 `minutes` 是讲述计划,`autoAdvanceSeconds` 是播放行为,二者必须分开。不得因为一页建议讲 1 分钟,就默认 60 秒后自动翻页。 @@ -92,14 +93,16 @@ window.__SPEAKER_NOTES__ = SPEAKER_NOTES; - 点击后当前窗口进入演讲者视图,并打开独立观众屏。 - 主体保持两栏:左侧预览、右侧备注;左侧当前页在上、下一页在下。 - 当前页与下一页 iframe 始终严格保持 `16:9`。空间不足时留边并整体等比缩小,不得裁切、压扁或让页面内部文字重新排版。 +- 预览 iframe 只在初次挂载时加载 HTML,翻页时通过 `postMessage` 发送页码,不反复改写 `src` 重载整份演示稿。 - 小屏优先缩小下一页预览,把空间留给当前页。 -- 底栏分成三段:左侧是 `已进行 / 本页 / 剩余或超时` 三组时间,中间是两行控制(第一行 `首页 / 上一页 / 下一页 / 尾页`,第二行 `开始或暂停 / 重置 / 排练`),右侧只显示 `第几页 / 总页数` 和完成百分比。不要在底栏重复当前页标题。 +- 底栏分成三段:左侧是 `已进行 / 本页 / 剩余或超时` 三组时间,中间是两行控制(第一行 `首页 / 上一页 / 下一页 / 尾页`,第二行 `开始计时或暂停 / 重置计时 / 排练`),右侧只显示 `第几页 / 总页数` 和完成百分比。不要在底栏重复当前页标题。计时按钮必须明确写成“开始计时 / 继续计时 / 重置计时”,避免让用户误以为是重置整场演示。 - `自动翻页` 放在右上角状态栏,不占用底部翻页区。 - `宫格` 放在“当前页”标题旁。打开后直接用宫格替换当前页/下一页预览区,不要弹出突兀的全屏层;卡片显示页码、标题、章节和进度,点击页面后立即回到当前页/下一页预览。`ESC` 切换宫格。 - 右侧卡片依次显示 `标题 / 本页目的 / 草稿(备注)`,避免把标题或页面目的混进草稿正文。 - 演讲者可从“均衡 / 页面优先 / 备注优先”三种布局选择。 - 备注编辑按 `data-slide-id` 存入 `localStorage`,显示保存状态;切页后备注滚动回顶部,并允许调整字号。 - `Home` / `End`、方向键、PageUp/PageDown 与可见按钮保持一致;光标在备注编辑器中时不得触发翻页。 +- 对话框已打开时,`?` 不得覆盖当前对话框;只有 `Escape` 关闭当前对话框。尾页的“下一页”预览显示“演示结束”,不重复当前页。 - 设置面板使用可辨识的卡片层级;开关使用胶囊 switch,数值间隔使用带减号、数值和加号的 stepper,不直接暴露浏览器原生复选框或粗糙数字输入框。 ## 6. 时间控制与排练 @@ -134,13 +137,15 @@ window.__SPEAKER_NOTES__ = SPEAKER_NOTES; - **连接中**:观众窗口已打开,尚未收到确认。 - **已同步**:观众页确认的页码与演讲者页相同,心跳有效。 -- **未同步**:确认超时或两端页码不同。 +- **未同步**:观众页心跳仍有效,但两端页码或序列号不同。 - **已冻结**:观众屏故意保留原页,不是同步故障。 -- **未连接**:观众窗口未打开或已关闭。 +- **未连接**:观众窗口未打开、已关闭,或心跳已超时。即使某些内置浏览器的 `window.closed` 代理不可靠,心跳超时后也必须落到“未连接”。 - **弹窗被拦截**:浏览器阻止打开观众窗口。 “重新打开观众屏”必须始终可用,并在恢复后立即发送当前页。 +演讲者退出演讲模式时必须发送 `bye`。由脚本打开的观众窗口尝试自动关闭;如果浏览器不允许自关,则保留深色“演示已结束”遮罩,不得继续停留在最后一页假装演示仍在进行。 + 浏览器只能确认观众**页面/窗口**的软件同步状态,不能检测 HDMI、转接器或投影仪线缆是否物理断开。现场仍应目视确认外接屏。 ## 10. 演前检查和快捷键 @@ -174,6 +179,6 @@ node /scripts/validate-presenter-mode.mjs path/to/index.html node /scripts/validate-presenter-mode.mjs path/to/index.html --target-minutes 30 ``` -浏览器实测至少包含:进入演讲模式、弹窗允许/拦截、前后翻页、内嵌宫格替换预览与选页返回、首页/尾页、尾页重新开始、观众窗口关闭后的状态变化、重新打开后恢复同步、备注保存、计时、排练记录、自动翻页暂停/恢复、激光笔、圈选、清除、黑屏、白屏、冻结、设置面板与演前检查。 +浏览器实测至少包含:进入演讲模式、弹窗允许/拦截、前后翻页且预览 iframe 不重载、内嵌宫格替换预览与选页返回、首页/尾页、尾页预览结束态、尾页重新开始、观众窗口关闭后显示“未连接”、重新打开后恢复同步、退出演讲后观众屏关闭或显示结束遮罩、备注保存、计时、排练记录、自动翻页暂停/恢复、激光笔、圈选、清除、黑屏、白屏、冻结、设置面板与演前检查。 至少在一组常用尺寸和一组小屏尺寸下检查:当前页/下一页上下排列,两个 iframe 宽高比均为 `16:9`,且没有超出各自容器。 diff --git a/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/scripts/check-presenter-runtime-sync.mjs b/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/scripts/check-presenter-runtime-sync.mjs new file mode 100644 index 00000000..7b58493d --- /dev/null +++ b/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/scripts/check-presenter-runtime-sync.mjs @@ -0,0 +1,39 @@ +#!/usr/bin/env node +import {readFileSync} from 'node:fs'; +import {dirname,resolve} from 'node:path'; +import {fileURLToPath} from 'node:url'; + +const root=resolve(dirname(fileURLToPath(import.meta.url)),'..'); +const files=['assets/template.html','assets/template-swiss.html']; +const blocks=[ + ['presenter CSS','/* ============ 演讲者模式 ============ */','/* ============ /演讲者模式 ============ */'], + ['presenter JavaScript','/* =============== 演讲者模式 / 观众屏同步 =============== */','/* =============== /演讲者模式 / 观众屏同步 =============== */'], +]; + +function extract(source,label,startMarker,endMarker,file){ + const start=source.indexOf(startMarker),end=source.indexOf(endMarker,start+startMarker.length); + if(start<0||end<0)throw new Error(`${file}: missing ${label} boundary marker.`); + return source.slice(start,end+endMarker.length); +} + +function firstDifferentLine(a,b){ + const left=a.split('\n'),right=b.split('\n'),count=Math.max(left.length,right.length); + for(let i=0;i[file,readFileSync(resolve(root,file),'utf8')]); +let failed=false; +for(const [label,start,end] of blocks){ + const extracted=sources.map(([file,source])=>[file,extract(source,label,start,end,file)]); + const [baseFile,base]=extracted[0]; + let blockFailed=false; + for(const [file,value] of extracted.slice(1)){ + if(value===base)continue; + failed=true; + blockFailed=true; + console.error(`ERROR ${label} drift: ${baseFile} and ${file} first differ at block line ${firstDifferentLine(base,value)}.`); + } + if(!blockFailed)console.log(`PASS ${label} is byte-identical across ${files.length} templates.`); +} +process.exit(failed?1:0); diff --git a/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/scripts/validate-presenter-mode.mjs b/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/scripts/validate-presenter-mode.mjs index 75012e78..8e79252a 100644 --- a/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/scripts/validate-presenter-mode.mjs +++ b/plugins/codex/plugins/guizang-ppt-skill/skills/guizang-ppt-skill/scripts/validate-presenter-mode.mjs @@ -39,6 +39,7 @@ function extractArray(name){ const slideTags=[...source.matchAll(/]*\bclass="[^"]*\bslide\b[^"]*")[^>]*>/g)].map(m=>m[0]); const slideIds=slideTags.map((tag,i)=>tag.match(/\bdata-slide-id="([^"]+)"/)?.[1]||''); +if(!slideIds.length)warnings.push('No slides found; only the reusable presenter runtime can be validated.'); slideIds.forEach((id,i)=>{ if(!id)errors.push(`Slide ${i+1}: missing data-slide-id.`); @@ -86,16 +87,15 @@ else{ const runtimeChecks=[ ['right-bottom presenter entry','id="ppt-presenter-btn"'], ['presenter shell','id="ppt-presenter"'], - ['vertical preview stack','grid-template-rows:minmax(0,1fr) clamp(132px,22vh,210px)'], ['16:9 preview viewport','class="ppt-frame-viewport"'], ['proportional preview fitter','fitPresenterFrames'], - ['exact 16:9 fitting','availableHeight*(16/9)'], ['overview control','id="ppt-grid"'], ['embedded presenter overview','id="ppt-presenter-overview"'], ['first-page control','id="ppt-first"'], ['last/restart control','id="ppt-last"'], ['audience status','id="ppt-sync"'], ['audience recovery','id="ppt-reopen"'], + ['audience shutdown handling','showAudienceEnded'], ['direct window sync','postMessage('], ['BroadcastChannel fallback','BroadcastChannel'], ['storage fallback','__guizangPptSync'], @@ -110,9 +110,16 @@ const runtimeChecks=[ ['layout presets','data-layout-choice'], ['capsule auto-advance switch','class="ppt-switch"'], ['styled interval stepper','class="ppt-stepper"'], + ['reload-free preview navigation','preview-goto'], ['shortcut help','openShortcuts'], ]; for(const [label,needle]of runtimeChecks)if(!html.includes(needle))errors.push(`Presenter runtime missing ${label}.`); +if(!/\.ppt-preview-stack\s*\{[^}]*grid-template-rows\s*:/s.test(html))errors.push('Presenter preview stack must define vertical grid rows.'); +if(!/\.ppt-frame\s*\{[^}]*aspect-ratio\s*:\s*16\s*\/\s*9/s.test(html))errors.push('Presenter preview frames must declare a 16:9 aspect ratio.'); +if(!/fitPresenterFrames[\s\S]*?16\s*\/\s*9/.test(html))errors.push('Presenter preview fitter must preserve the 16:9 ratio.'); +if(!/id="ppt-timer-toggle"[^>]*>开始计时<\/button>/.test(html))errors.push('Presenter timer must use the explicit label "开始计时".'); +if(!/id="ppt-timer-reset"[^>]*>重置计时<\/button>/.test(html))errors.push('Presenter timer reset must use the explicit label "重置计时".'); +if(!html.includes('继续计时'))errors.push('Presenter timer resume state must use the explicit label "继续计时".'); if(/\.ppt-preview-stack\{[^}]*grid-template-columns/.test(html))errors.push('Presenter previews must stack vertically; remove grid-template-columns from .ppt-preview-stack.'); const timedNotes=speakerNotes.filter(n=>Number.isFinite(Number(n?.minutes))&&Number(n.minutes)>0); diff --git a/plugins/codex/plugins/mcp-playwright/MCP_SOURCE.json b/plugins/codex/plugins/mcp-playwright/MCP_SOURCE.json index 51cafc74..afd718cd 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-08-06T16:02:10Z" + "syncedAt": "2026-08-08T16:02:04Z" } diff --git a/plugins/codex/plugins/next-skills/THIRD_PARTY_SOURCE.json b/plugins/codex/plugins/next-skills/THIRD_PARTY_SOURCE.json index b3392dd5..fa77e46d 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": "0ae8c72462952df163f1b1e0726641bc5b40dc93", + "commit": "a677cf66af002fbdcf49a982ef435b03554817cc", "adapter": "skill-collection", "sourcePath": "skills", - "syncedAt": "2026-08-06T16:00:02Z" + "syncedAt": "2026-08-08T16:00:01Z" } diff --git a/plugins/codex/plugins/ppt-master/THIRD_PARTY_SOURCE.json b/plugins/codex/plugins/ppt-master/THIRD_PARTY_SOURCE.json index 5f5f9be1..6a12d339 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": "c0305342cf5c558e7242dba64cfc207874a5134a", + "commit": "eb095bfcc6b625fd8754e9f5d053ec4220865370", "adapter": "claude-skill", "sourcePath": "skills/ppt-master", - "syncedAt": "2026-08-06T16:00:02Z" + "syncedAt": "2026-08-08T16:00:01Z" } diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/SKILL.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/SKILL.md index 26a9f8fc..f77e09e3 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/SKILL.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/SKILL.md @@ -53,6 +53,7 @@ compete with it. 5. **No speculative execution** — Do not prepare later-phase artifacts before their owning step. 6. **Deterministic routing** — Do not add a route-choice question when [`routing.md`](workflows/routing.md) resolves the request. If a route prerequisite is missing, state it and stop that route. 7. **Owning-source recovery** — On failure, repair or regenerate the owning source artifact and resume from the route's declared pointer. Do not silently downgrade a required artifact. +8. **Stable paths** — Use absolute skill/project paths; never derive them from CWD. ## Global Communication Rules diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/artifact-ownership.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/artifact-ownership.md index 5cb4e9ba..1ada2620 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/artifact-ownership.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/artifact-ownership.md @@ -39,7 +39,7 @@ history, or resumable planning state. Context loss restarts the Quick run. | `images/image_prompts.json`, `image_queries.json`, `image_sources.json`, `formula_manifest.json` | Conditional resource contracts | AI/web/formula execution status and provenance | Create only for a triggered path, including Quick. They guide preparation/attribution, never page design. | | `icons/` | Prepared project icon pool | Bundled icons copied by `icon_sync.py` plus user-provided, template, imported, or custom icon SVGs | SVG authoring may choose any icon in this project-local pool per page; `spec_lock.icons.inventory` indexes the default plan's curated synced bundled pool rather than assigning page usage or defining an exhaustive whitelist. Exporter global fallback is legacy compatibility only. | | `${SKILL_DIR}/templates/{brands,styles,layouts,decks}/*_index.json` | Library discovery indexes | The complete registered option source for Default Stage-1 template selection and chat listing | The UI server or chat branch reads these indexes only to populate the Stage-1 choice, after the communication recommendation is authored. Never scan kind directories to add options or use index summaries as Stage-1 planning evidence. Derive a library root from kind + entry id. Exact unregistered roots remain explicit inputs. Quick does not read the catalog. | -| `templates/` | Project template reference | Stage-1-confirmed non-free selection or Quick direct-input installed/fused specs, optional Layout/Deck SVG prototypes, and non-image assets | Default template-aware Strategist work from Stage 2 onward, Quick's current agent before direct authoring, and every later role read this project-local state only, never the library/external installation root. The active planner reads every installed template Design Spec and an actual SVG roster only for Layout/Deck; Brand and Style are intentionally roster-free. Continuous Executor reuses that context; fresh Executor reads the Design Spec once and each selected complete SVG, when any, only before first use or after its SHA changes. | +| `templates/` | Project template reference | Stage-1-confirmed non-free selection or Quick direct-input installed specs, one file per selected workspace, optional Layout/Deck SVG prototypes, and non-image assets | Default template-aware Strategist work from Stage 2 onward, Quick's current agent before direct authoring, and every later role read this project-local state only, never the library/external installation root. The active planner reads every installed template Design Spec and an actual SVG roster only for Layout/Deck; Brand and Style are intentionally roster-free. Continuous Executor reuses that context; fresh Executor reads the Design Spec once and each selected complete SVG, when any, only before first use or after its SHA changes. | | `templates/template_execution_manifest.json` (`v1`) + `templates/template_execution/*.text-slots.json` (`v2-min`) | Derived template index | Compact prototype/source-import summary plus per-prototype text-slot diagnostics; the sidecar integrity hash is tool-only | Materialization may publish these deterministic records, but page-context does not inject or require them and models do not read them during page authoring. The complete prototype SVG is the sole visual/template authority; never author from either JSON artifact. | | `/svg/` | Imported native-payload backing | Complete PPTX-derived metadata, hidden carriers, fallback evidence, and source structure | Keep immutable; create-template materialization may resolve a validated source ref against these files, but models do not edit or bulk-read them | | `/svg-flat/` | Optional complete-page verification backing | Self-contained visual composition generated only by explicit `--inheritance-mode both` | Keep immutable when requested; never use as authoring or materialization input | @@ -72,7 +72,7 @@ history, or resumable planning state. Context loss restarts the Quick run. | Sources read policy | In `sources/`, read content-type files (`.md` / `.markdown` / `.txt` / `.csv` / `.tsv` / `.json` / `.jsonl` / `.yaml` / `.yml`) and judge by content — a `.json` / `.csv` may be core content or just data. Exclude known sidecars: `*.conversion_profile.json` and `*_files/image_manifest.json`. `analysis/` facts (`source_profile.json`, `.slide_library.json`) are read per Step 4 / direct-PPTX workflow, not in the `sources/` content scan. | | PPTX structure | `slide_library.json` owns native geometry, slot facts, and SmartArt layout/relationships for direct PPTX workflows. | | Design contract | Final confirmation once → audited `design_spec.md` → optional same-file refinement/approval → context-authored lock. Never maintain a parallel draft/lock. Executor may apply `Template Application` prose but never replace identity. Repair divergence from the approved Design Spec/context unless it fails active-decision fidelity. | -| Flat packaging authority | Free-design, brand-only, Style-only, and every plan with `template_reuse_scope: style` declare `pptx_structure.mode: flat` and omit `pptx_masters`, `pptx_layouts`, `page_pptx_layouts`, and `page_layouts`. A Style fused with Layout/Deck changes only Direction / method and does not force the non-Style structure plan to flat. `svg_output/` owns the complete Slide-local visual design without root Master/Layout identity, fixed-layer ownership, or placeholder metadata. Export materializes one clean project-owned Master plus one Blank Layout, applies the locked theme defaults, removes stock content placeholders/Layout inventory, and retains only the standard date/footer/slide-number capability hooks. | +| Flat packaging authority | Free-design, brand-only, Style-only, and every plan with `template_reuse_scope: style` declare `pptx_structure.mode: flat` and omit `pptx_masters`, `pptx_layouts`, `page_pptx_layouts`, and `page_layouts`. A Style installed alongside Layout/Deck changes only Direction / method and does not force the non-Style structure plan to flat. `svg_output/` owns the complete Slide-local visual design without root Master/Layout identity, fixed-layer ownership, or placeholder metadata. Export materializes one clean project-owned Master plus one Blank Layout, applies the locked theme defaults, removes stock content placeholders/Layout inventory, and retains only the standard date/footer/slide-number capability hooks. | | Template structure authority | `template_reuse_scope: mirror|layout` uses `page_layouts` for each page's authoring-input prototype. `pptx_masters` / `pptx_layouts` own the unique reusable output definitions, while `page_pptx_layouts` owns page assignment. Strict keeps the prototype contract; adaptive may use a current or new Layout already declared by Strategist. A construction-discovered structural change returns upstream for definition and assignment repair before authoring resumes. Mirror additionally preserves literal visuals/text topology; layout allows project-controlled reflow/re-skinning. Unused definitions may register without a published Slide. Templates validate provenance but never add missing visible page objects during export. | | Fact classes | External facts resolve through `sources/*.facts.json`; invented demo KPIs/targets/internal ratios are labeled `scenario` in `design_spec.md §IX` and visibly in the page. Never promote scenario data into the external fact registry. | | Imported-template authoring | Editable SVGs under `authoring-svg/` own create-template edits, `authoring_summary.json` owns model-facing orientation, and `authoring_manifest.json` owns tool-only source-object identity. Lossless `svg/` owns immutable native payload and fallback evidence; optional `svg-flat/` owns only complete-page verification. Materialized `templates/*.svg` own the validated deliverable contract and contain no IR-only source refs. | diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/executor-base.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/executor-base.md index ee1e89ec..41816ab0 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/executor-base.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/executor-base.md @@ -7,17 +7,22 @@ Always-loaded Executor authority for flat SVG page authoring and behavior shared | Trigger | Load | |---|---| | `pptx_structure.mode: structured` | [`executor-structured.md`](./executor-structured.md) | -| Any data chart, chart catalog selection, or text-grid table | [`executor-chart.md`](./executor-chart.md) | -| A page will use a preset pattern fill or evaluate native chart/table replacement | [`native-data-interface.md`](./native-data-interface.md) before deciding eligibility or emitting metadata | +| Any selected Chart/Table `family/key` reference, or a legacy `page_charts` row that resolves to a live Chart/Table SVG | [`executor-visualization.md`](./executor-visualization.md), then the resolver-returned Chart/Table branch | +| Any value-driven geometry, including a chart-family reference, mini chart, sparkline, inset, or small multiple | [`executor-chart.md`](./executor-chart.md) | +| The mandatory per-page Structure decision finds qualitative geometry | [`executor-structure.md`](./executor-structure.md) | +| Any semantic cell grid, including a table-family reference | [`executor-table.md`](./executor-table.md) | +| A page will use a preset pattern fill or an independent object is explicitly selected as native-ready | [`native-data-interface.md`](./native-data-interface.md) before emitting the pattern or replacement metadata | | Any image/formula | [`executor-image.md`](./executor-image.md) + [`image-layout-spec.md`](./image-layout-spec.md) + [`image-layout-patterns.md`](./image-layout-patterns.md) + [`svg-image-embedding.md`](./svg-image-embedding.md) | | Any `Status: Sourced` web image | [`executor-web-image.md`](./executor-web-image.md), after `executor-image.md` | | Effective Speaker Notes outcome is enabled after all SVG pages pass | [`executor-notes.md`](./executor-notes.md) | +Evaluate branches from each object's actual information model, not only from a Chart/Table reference. A catalog family selects construction guidance but never native readiness; `Native-ready` is an independent object-level decision. Page-local qualitative geometry also never implies package-level `pptx_structure.mode: structured`. + > Narrative skeleton and visual aesthetic come from this deck's locked files under [`modes/`](./modes/_index.md) and [`visual-styles/`](./visual-styles/_index.md). [`shared-standards-core.md`](./shared-standards-core.md) supplies the technical boundary plus the fallback visual-quality and leading defaults when those authorities are silent. -**Hard rule — complete page SVG**: Every visible object intended for the exported slide MUST exist in the final page SVG or be explicitly referenced by it. Templates and `spec_lock.md` guide construction; they are not export-time overlays for missing visible content. +**Hard rule — Shape-first page authority**: Every visible object intended for the exported slide MUST exist in the final page SVG or be explicitly referenced by it. Templates and `spec_lock.md` guide construction; they are not export-time overlays for missing visible content. Optional native Chart/Table metadata belongs to an independently selected object and never replaces this visible fallback during authoring; [`native-data-interface.md`](./native-data-interface.md) alone defines that metadata and its export activation. -**Hard rule — flat PowerPoint structure**: Free-design, brand-only, Style-only, and every `template_reuse_scope: style` project use `pptx_structure.mode: flat`: write no root Master/Layout identity, `data-pptx-layer`, or `data-pptx-placeholder`; every visible object remains Slide-local, and the root declares exactly one canonical `data-pptx-page-role` (`cover` / `toc` / `section` / `content` / `ending`). A Style workspace supplies reusable communication/design direction, composition rhythm, and information-expression defaults without page prototypes. Its identity-adjacent color, typography, icon, and image defaults yield to the final Brand/Deck identity and confirmed project lock. When Style is fused with Layout/Deck, it changes only Direction / method and follows the resolved non-Style structure route. Export materializes one clean project-owned Master plus one Blank Layout from the current lock. Add `data-pptx-role` only to structural page-frame objects whose package, page-number, or animation behavior is not already expressed by specialized metadata; the marked element uses a stable unique `id`. See [`semantic-svg.md`](./semantic-svg.md). +**Hard rule — flat PowerPoint structure**: Free-design, brand-only, Style-only, and every `template_reuse_scope: style` project use `pptx_structure.mode: flat`: write no root Master/Layout identity, `data-pptx-layer`, or `data-pptx-placeholder`; every visible object remains Slide-local, and the root declares exactly one canonical `data-pptx-page-role` (`cover` / `toc` / `section` / `content` / `ending`). A Style workspace supplies reusable communication/design direction, composition rhythm, and information-expression defaults without page prototypes. Its identity-adjacent color, typography, icon, and image defaults yield to the final Brand/Deck identity and confirmed project lock. When a Style is installed alongside Layout/Deck, it changes only Direction / method and follows the resolved non-Style structure route. Export materializes one clean project-owned Master plus one Blank Layout from the current lock. Add `data-pptx-role` only to structural page-frame objects whose package, page-number, or animation behavior is not already expressed by specialized metadata; the marked element uses a stable unique `id`. See [`semantic-svg.md`](./semantic-svg.md). **Hard rule — supported PPTX route**: The only supported generated-PPTX path is `svg_output/` through the project SVG-to-DrawingML converter. Step 7.2 still generates `svg_final/` as a mandatory self-contained visual preview that may be inserted as an SVG picture. Do not treat PowerPoint's manual Convert-to-Shape operation as an authoring target or compatibility requirement. @@ -53,7 +58,7 @@ Before the first SVG page, output a confirmation listing: the compact communicat - **Invalid**: fresh/resumed/restarted execution, compaction/summary-only recovery, or an external/unknown change requires one complete read of `design_spec.md`, then `spec_lock.md`, plus triggered references/template inputs. Mid-deck recovery also reads the latest completed SVG and, when images are used, current image metadata. - **Uncertain**: consult the retained lock first, then only the owning Design Spec fragment; use sources only for facts. Design Spec remains upstream on conflict. -**On-demand page-context diagnostic**: only for explicit telemetry/debugging or an unresolved page/template/chart path-SHA question; never as a pre-page gate: +**On-demand page-context diagnostic**: only for explicit telemetry/debugging or an unresolved page/template/visualization path-SHA question; never as a pre-page gate: ```bash python3 ${SKILL_DIR}/scripts/project_manager.py page-context P [--record-usage] @@ -65,7 +70,7 @@ Consume stdout directly; stop on non-zero exit. The projection is derived, not a **Hard rule — exact page roster**: `design_spec.md §IX` is the ordered queue: one final slide per entry, with the same id/order. The UI range no longer applies. Never add, drop, merge, split, or reorder; repair/reconfirm the Design Spec first. -**Hard rule — binding selection vs realization**: use Strategist-selected semantic content, resources/paths, chart keys, template/layout routing keys, core fonts, palette anchors, icon-library/stroke anchors, and crop boundaries. Adapt realization—including which prepared project-local icon, if any, best serves each page—without changing those binding selections, except sparse local font/color garnish allowed below. A §VIII preferred image pattern is not a template/layout routing key; [`executor-image.md`](./executor-image.md) owns its realization freedom. Missing or unresolved material stops execution and returns to Strategist-owned acquisition/failure recovery; never search, generate, download, sync, invent, or substitute it. Binding selection changes require upstream repair. +**Hard rule — binding selection vs realization**: use Strategist-selected semantic content, resources/paths, Chart/Table `family/key` references, template/layout routing keys, core fonts, palette anchors, icon-library/stroke anchors, and crop boundaries. Adapt realization—including which prepared project-local icon, if any, best serves each page—without changing those binding selections, except sparse local font/color garnish allowed below. A §VIII preferred image pattern is not a template/layout routing key; [`executor-image.md`](./executor-image.md) owns its realization freedom. Missing or unresolved material stops execution and returns to Strategist-owned acquisition/failure recovery; never search, generate, download, sync, invent, or substitute it. Binding selection changes require upstream repair. **Hard rule — content vs expression**: `design_spec.md §IX` owns each page's semantic content and supplies complete preferred wording and block texture; those expression choices are not verbatim requirements unless explicitly literal. Executor may paraphrase, condense repetition, regroup or reorder material within the same page, and switch among prose, bullets, keywords, labels, or visual annotation when fit or readability benefits. The result must remain information-equivalent: preserve the `Core message`, `Audience move`, and every substantive claim, fact, data value, proper name, qualifier or caveat, relationship, key argument or evidence, and literal requirement. Never add a claim, move content across pages, or drop information to make the layout fit; return an unfit or underspecified block for Design Spec repair. @@ -75,6 +80,8 @@ Use named lock roles literally when that role applies, and use optional `Templat **Per-page communication trace**: Read `communication.objective`, `communication.core_message`, and the current §IX `Core message` + `Audience move` before choosing composition. The page must advance the compact objective and move the audience as authored in §IX; the global core message remains the deck-wide north star. A page that cannot state this movement is an upstream outline defect — surface `warning: P has no communication move` instead of compensating with decorative layout. Do not invent a new purpose, ask, or outcome at execution time. Structural pages may advance the contract by establishing relevance / tension / decision frame or by completing the final commitment; they are not exempt from having a reason to exist. +**Mandatory — per-page Structure decision**: Before drawing, read the current §IX `Layout`, `Visualization`, and `Content` and decide whether geometry must carry any qualitative `order`, `link`, `parent`, `membership`, `contrast`, or `overlap` relationship. If none applies, continue on this shared base path. If any applies, load [`executor-structure.md`](./executor-structure.md) before constructing the page and retain the relationship statement in active page context; do not create a catalog reference, lock row, or new artifact. A Chart/Table reference never substitutes for this decision. + **Per-page reading-mode check**: Read `communication.consumption_mode` before choosing the page's composition. Apply it together with the authored §IX block texture and `page_rhythm`: | `consumption_mode` | Page execution | @@ -143,11 +150,11 @@ Before drawing each page, look up its entry in `page_rhythm` (key format `P` - **Fact provenance**: when a §IX page lists `Fact IDs`, resolve each ID from `sources/*.facts.json` and keep the claim/value unchanged. Render a compact source footnote using the source name and a short URL/domain when space permits; when speaker notes are enabled, state the attribution naturally there too. When §IX says `Data class: scenario`, place a visible localized `Scenario data` / `情景数据` label adjacent to the affected KPI/chart and, when notes are enabled, state naturally there that the number is illustrative. Never attach an external fact ID to scenario data or let an unlabeled invented KPI look factual. - **Default — stage each page with the style's composition geometry (may override when the content genuinely calls for a plain grid)**: an SVG page is a canvas, not a DOM. Before defaulting to stacked rounded-rect cards or uniform equal columns, pick one page-scale move from the locked visual style's §1 `Composition geometry` (a bleed shape, diagonal split, oversized numeral, orbit rings, …) to stage the page's primary zone. Card grids are one option among many, not the house layout. - **Default — vary a planned deck motif instead of cloning it (may omit where it has no page job)**: when §III `Theme` names a cross-page motif, use the current §IX `Layout` to preserve its recognizable contour, direction, material, or relationship while varying scale, crop, density, position, and content interaction by page role. Apply it only where it supports hierarchy or continuity; do not paste identical ornament or invent a second recurring identity. -- **Inherited containers**: preserve meaningful template frames; restyle radius, fill, stroke, and depth from the active Design Spec and `spec_lock.md`. Chart-catalog adaptation is owned by [`executor-chart.md`](./executor-chart.md); preview effects never override project styling or structural roles. +- **Inherited containers**: preserve meaningful template frames; restyle radius, fill, stroke, and depth from the active Design Spec and `spec_lock.md`. Selected Chart/Table reference adaptation is owned by [`executor-visualization.md`](./executor-visualization.md); preview effects never override project styling or structural roles. - **Reference — prefer semantic geometry over preset stacks**: for relationships such as ascending, converging, breaking through, or stacking, first seek a basic primitive, one exact preset, or a clear Boolean result. Only when none can faithfully express the relationship should one page-specific polygon/path replace a stack of generic arrows. - **Reference — create depth with restraint**: use rhythm, spacing, typography, accent bars, and subtle tints before shadows. Reserve lift for a few genuinely floating elements; keep peer grids, dividers, and body containers flat. - **Phased generation** (recommended): - 1. **Visual Construction Phase**: generate all SVG pages sequentially for visual consistency. Use layout judgment for chart marks during the draft. **MUST embed plot-area markers** per [`executor-chart.md`](./executor-chart.md) §2.1 on every §IX-planned data-chart page — coordinate calibration is a post-generation step (see [`verify-charts`](../workflows/stages/verify-charts.md)) that depends on these markers — and **native object metadata** per [`executor-chart.md`](./executor-chart.md) §2.2 on every planned native-ready object. **Reach for native presets** per §3.0 as you draw each page: a block arrow, chevron, banner/ribbon, callout, standard flowchart node, or star is authored through `preset_shape_svg.py` at draw time — decided by the object's intent as you create it, never by scanning finished paths, and never committed to a bare ``/`` when a preset expresses it (a gradient fill/stroke or a pattern fill is the one paint exception — keep those ordinary SVG). **First-page gate (Mandatory)**: after completing the first page, run `python3 ${SKILL_DIR}/scripts/svg_quality_checker.py --stage first-page --json` directly without output filtering. Review the whole P01 issue set, make one consolidated edit pass for every error and any selected warnings, then perform one verification rerun. If it still fails, treat that complete output as the next batch; never check between individual fixes. After it passes, draw P02 through the last page without checker calls. + 1. **Visual Construction Phase**: generate all SVG pages sequentially for visual consistency. Apply every triggered information-model branch while drawing. **MUST embed one object-scoped plot-area marker** per §IX-named or Quick-promoted value-driven chart object under [`executor-chart.md`](./executor-chart.md) §2; coordinate calibration is a post-generation step (see [`verify-charts`](../workflows/stages/verify-charts.md)). Write every `=yes` native marker plus JSON metadata atomically under [`native-data-interface.md`](./native-data-interface.md) §2. **Reach for native presets** per §3.0 as you draw each page: a block arrow, chevron, banner/ribbon, callout, standard flowchart node, or star is authored through `preset_shape_svg.py` at draw time — decided by the object's intent as you create it, never by scanning finished paths, and never committed to a bare ``/`` when a preset expresses it (a gradient fill/stroke or a pattern fill is the one paint exception — keep those ordinary SVG). **First-page gate (Mandatory)**: after completing the first page, run `python3 ${SKILL_DIR}/scripts/svg_quality_checker.py --stage first-page --json` directly without output filtering. Review the whole P01 issue set, make one consolidated edit pass for every error and any selected warnings, then perform one verification rerun. If it still fails, treat that complete output as the next batch; never check between individual fixes. After it passes, draw P02 through the last page without checker calls. 2. **Quality Check Gate**: only after every planned SVG exists, run `python3 ${SKILL_DIR}/scripts/svg_quality_checker.py --stage final --json` directly on `svg_output/` without `tail` / `head` / `grep` filtering. One run already reports all pages. Review its complete issue set, fix every `error` plus any selected advisory warnings in one consolidated edit pass, then perform one verification rerun. If it still fails, its complete output begins the next batch cycle; never use checker calls to discover or fix one next issue at a time. Every `warning` is advisory: it never sends the page back for required modification, never authorizes automatic rewriting of compatible user syntax, and needs no acknowledgement/disposition line. Recommendation warnings describe the generated-SVG default; fidelity/quality warnings may be surfaced when material, while the existing input remains releasable. Prototype-identical diagnostics are recorded as `inherited`, source conversion losses as `source-import`, changed/new advisories as `introduced`, and release failures as `blocking` in `validation/svg_quality_report.json`. If release truly depends on a condition, it belongs in `errors`. On success, use the exit status and terminal summary; do not open or `cat` the complete JSON into model context. If terminal output is truncated on failure, read only the relevant issue arrays from the report written by that same run. Do NOT defer error handling to after `finalize_svg.py` — finalize rewrites SVG and masks some violations. 3. **Logic Construction Phase (conditional)**: after SVGs pass the quality check, batch-generate speaker notes for narrative continuity only when the effective Speaker Notes outcome is enabled. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/executor-chart.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/executor-chart.md index 5c4769d6..66306e06 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/executor-chart.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/executor-chart.md @@ -1,176 +1,120 @@ -> Default Generate also loads [`executor-base.md`](./executor-base.md); Default and Quick load [`native-data-interface.md`](./native-data-interface.md) when native chart/table metadata is selected. +> Default Generate also loads [`executor-base.md`](./executor-base.md); a selected chart-family SVG is adapted through [`executor-visualization.md`](./executor-visualization.md), while independent native readiness and metadata remain exclusively in [`native-data-interface.md`](./native-data-interface.md). -# Executor Chart and Table Branch +# Executor Chart Branch -Conditional Executor authority for data charts, chart-catalog adaptations, chart verification markers, and eligible native chart/table replacement metadata. +Conditional Executor authority for value-driven SVG geometry, plot-area markers, and the [`verify-charts`](../workflows/stages/verify-charts.md) handoff. -**Trigger**: load when `design_spec.md §VII` contains a selected chart/table reference, `spec_lock.md page_charts` contains any row, the current §IX page block carries any data-encoded chart or text-grid table, or Quick Generate resolves such an object in active context. Mini charts, sparklines, inset charts, and small multiples count even when they are absent from `page_charts` or the chart catalog. +**Trigger**: load whenever source values determine visible geometry, including bar length/height, point position, arc angle, polygon vertex, connector or flow width/path, bubble center/radius, duration position, area, or another quantitative visual variable. Mini charts, sparklines, insets, and small multiples count even without a catalog reference. -**Profile authority**: Default follows the Design Spec/lock and returns missing or conflicting planning decisions upstream. Quick has no plan artifact: the current main agent resolves the data object, optional catalog key, fallback design, and native-readiness immediately in active context, writes the selected semantics into the SVG itself, and does not create a substitute roster or mapping file. +**Boundary**: -## 1. Reference Loading and Per-page Selection - -For each selected `templates/charts/.svg`, use its Skill-relative path and -read once before first use or after a known change, otherwise reuse it. Never -load the full catalog. - -**Per-page chart reference**: - -| Active profile | Selection authority | +| Information model | Route | |---|---| -| Default Generate | Look up whether `spec_lock.md page_charts` supplies a page-local key, then read its §VII Usage and SVG for that page only | -| Quick Generate | Use bounded `chart_recall.py` only when a reusable visualization reference would help; keep the selected key and purpose in active context for that page only, or retain `no-template-match` and design from scratch | - -Before drawing each page, apply the matching branch: - -- Selected key present (e.g., `timeline_horizontal`) → read that SVG for the current page only and realize the active page intent without copying it or loading the catalog. -- No selected key → design the declared visualization/table from scratch; do not invent a catalog reference after drawing begins. -- Quick never persists its selection into §VII, `page_charts`, or another mapping artifact. +| Values, dates, or durations determine geometry or another visual variable | This branch | +| Qualitative order, grouping, containment, causality, or named zones determine topology | [`executor-structure.md`](./executor-structure.md) | +| A row header and column header jointly address each body fact | [`executor-table.md`](./executor-table.md) | --- -## 2. Chart and Native-data Authoring +## 1. Value-driven Geometry -### 2.1 Chart Plot-Area Marker (MANDATORY on active data-chart pages) +**Hard rule — data owns the marks**: derive every quantitative mark from the authoritative values and one explicit scale/encoding. Do not eyeball positions, preserve sample values from a catalog preview, or alter data to improve composition. -> The [`verify-charts`](../workflows/stages/verify-charts.md) stage enumerates Default data-driven chart pages from `design_spec.md §IX`; Quick runs it from the still-active page decisions and cross-checks those decisions against plot-area markers. A missing marker invokes that stage's declared fallback and adds avoidable derivation work. +Construct the chart in this order: -**Hard rule**: every Default page whose §IX `Visualization` declares -data-driven chart geometry, and every Quick page the current agent resolves as -data-driven, includes a plot-area marker inside ``, placed -**after axis lines** and **before the first data element** (bar, line, area, -point). A legacy §VII data-chart row counts when its page block lacks that -declaration. An incidental microvisual needs no marker unless the current -profile promotes it to a coordinate-verified data object; Default repairs §IX, -while Quick resolves that decision immediately before drawing. +1. Resolve the data domain, categories, units, baseline, scale, and any radius/color/bin mapping. +2. Establish the plot frame, axes/grid or radial frame, and legend needed to decode those mappings. +3. Calculate marks from the values, including cumulative, derived, or hierarchical geometry where the chosen chart requires it. +4. Add data labels, axis/category labels, annotations, units, source notes, and visible exceptions from the active page contract. +5. Apply project typography, palette, effects, and container treatment without changing the encoding. -**Rectangular plot area** (bar / horizontal_bar / grouped_bar / stacked_bar / line / area / stacked_area / scatter / waterfall / pareto / butterfly): +**Per-object completeness**: preserve every authoritative series, category, point, label, unit, qualifier, source, and scale cue needed to read the chart. When the source cannot determine a required scale or derived value, return the ambiguity upstream in Default or resolve it from explicit source facts in Quick; never fabricate it at draw time. + +**Hard rule — schedule geometry**: A schedule is a Gantt chart when dates or +durations determine each task bar's `x` and `width`, even if the source was a +PowerPoint table object. A qualitative stage × lane placement without that +mapping belongs to [`executor-structure.md`](./executor-structure.md). + +**Selected reference**: when the page has a `chart/` primary reference, [`executor-visualization.md`](./executor-visualization.md) owns its resolution and flexible adaptation. This branch still owns the actual value-to-geometry calculation. A chart authored from scratch follows the same geometry contract without loading a catalog SVG. + +**Incidental microvisual**: draw a small value-driven trend or indicator accurately. It enters §2 and the verification handoff only when Default §IX or the Quick active-context decision promotes it to a coordinate-verified data object; do not infer that promotion from its appearance after drawing. + +--- + +## 2. Plot-area Marker + +### 2.1 Chart Plot-Area Marker (Mandatory per verified chart object) + +> [`verify-charts`](../workflows/stages/verify-charts.md) enumerates Default pages from Design Spec §IX and Quick pages from the still-active authoring decisions. A missing marker invokes that stage's declared fallback and adds avoidable derivation work. + +**Hard rule — object-scoped marker**: every Default chart object given a +semantic key in §IX `Visualization`, and every Quick chart object promoted for +coordinate verification, has one page-local `kebab-case` object key. Wrap that +object in ``; put exactly one marker inside its plot-area +group after the axes and before the first data mark. Use +`id="-chartArea"` so several charts can coexist without duplicate +IDs. New pages prefix the marker payload with `object= |`. A legacy +unscoped marker and `` are accepted only when the page has +exactly one verified chart object. + +**Rectangular plot area**: ```xml - + + + + + + + ``` -**Radial charts** (pie / donut / radar): +**Radial plot area**: ```xml - - - + + + ``` -**How to determine coordinate values**: - | Value | Derivation | -|-------|------------| -| `x_min` | X coordinate of the Y-axis line (leftmost data boundary) | -| `y_min` | Y coordinate of the topmost grid line (highest data boundary) | -| `x_max` | X coordinate of the rightmost axis endpoint or grid line | -| `y_max` | Y coordinate of the X-axis baseline | -| `cx, cy` | Center point of pie/donut/radar (accounting for `transform="translate()"`) | -| `r` | Outer radius of the chart | +|---|---| +| `x_min` | X coordinate of the Y-axis line or leftmost data boundary | +| `y_min` | Y coordinate of the topmost grid line or data boundary | +| `x_max` | X coordinate of the rightmost axis endpoint or data boundary | +| `y_max` | Y coordinate of the X-axis baseline or bottom data boundary | +| `cx, cy` | Absolute center after accounting for containing translate transforms | +| `r`, `r1`, `r2` | Visible outer/inner radii used by the authored radial geometry | -**Per-page verification** — after writing each active data-chart SVG, confirm the marker exists: +Calculator-supported SVGs in `templates/charts/` carry the same comment, and +single-object previews may retain the legacy unscoped payload and +`id="chartArea"`. A qualitative structure or cell-grid table does not gain a +marker merely because it contains numbers. + +### 2.2 Authoring-time Check + +After writing each page containing verified charts, confirm marker count and +object ownership before continuing: ```bash rg -n "chart-plot-area" /svg_output/.svg ``` -> Calculator-supported data-chart templates in `templates/charts/` include this -> marker as a reference. If a data chart covered by §2.1 lacks it, that is a -> bug. Conceptual diagrams, frameworks, and other non-data visualizations in -> the same library do not use a plot-area marker. +The number of markers must equal the number of promoted chart objects, and each +marker must sit under its matching object wrapper. One marker somewhere on a +multi-chart page is insufficient. + Technical SVG/PPT constraints remain in [`shared-standards-core.md`](./shared-standards-core.md). -### 2.2 PowerPoint-Native Chart/Table Replacement Marker (MANDATORY on selected native-ready objects) - -> `svg_to_pptx.py --native-charts-and-tables` replaces marked groups with PowerPoint-native Chart/Table objects (charts get an embedded Excel workbook). Markers stay dormant in the default export, whose SVG children become independently editable DrawingML shapes. Prepare this optional capability for selected independent data objects, not every numeric embellishment. - -**Hard rule**: load [`native-data-interface.md`](./native-data-interface.md) for -each independent data chart or pure text-grid table selected as native-ready. -Default reads that decision from the current §IX page block (`yes`/`no`; legacy -§VII fallback only). Quick decides in active context before drawing based on -whether the PowerPoint Chart/Table object model is useful enough to accept its -normalization risk. A supported selected chart gets -`data-pptx-replace-with="chart"` plus one JSON `` child; a selected -pure text-grid table gets the table form, transcribing all plotted data or -visible cells. An object not selected stays ordinary SVG even when a catalog -reference contains a marker. The parent marker selects the schema. - -**MUST — atomic authoring**: For each native-ready object, treat the visible SVG fallback, the parent `data-pptx-replace-with` marker, and its JSON `` child as one object. Write all three in the same SVG edit while the data is in context. Do not defer the marker or metadata to `verify-charts`, the final quality gate, or export. - -**Hard rule — eligibility follows the active profile authority**: In Default, a -two-point line or small multiple gets metadata only when its §IX page block -plans it as an independent object with `Native-ready: yes`; changing eligibility -requires upstream repair. In Quick, the current agent makes that independent- -object decision before drawing and expresses it atomically through the marker, -metadata, and fallback. A sparkline, inset, KPI-card trend, or other incidental -microvisual stays ordinary SVG unless Quick deliberately promotes it before -authoring. - -Generated authoring MUST omit `data-pptx-import-source` and -`data-pptx-fallback-sha256`: those attributes record imported-PPTX provenance -and its sealed fallback baseline. Never copy a static baseline from a chart -catalog or reusable template; normal content edits would make it stale. - -`data-pptx-replace-with` is a **data-backed replacement claim**, not a generic label for a group that contains numbers and not a marker for ordinary PowerPoint shapes or connectors. Add it only when the matching JSON payload can be written in the same edit; if the object is meant to remain SVG geometry, do not add the marker. - -- Chart types absent from that list and conceptual/diagrammatic graphics (process flows, cycles, quadrant cards, timelines, or a KPI card container) get **no marker** — `svg_quality_checker.py` rejects unsupported marker types. A supported data chart nested inside one of those compositions gets its own marker only when Default §IX or the Quick active-context decision selects that object as native-ready. -- Canonical rectangular merged text cells may carry a table marker by putting anchor-only `row_span` / `col_span` in metadata and leaving covered cells blank. Nonrectangular/overlapping merges, nonblank covered cells, and graphical cells (icons, harvey balls, rating dots) get **no table marker** and stay on the SVG fallback route. -- Transcribe, don't restyle: `categories` / `series[].values` are the numbers just plotted; `style.colors` copies the series HEX values already rendered on the page, whether they use a recurring Default `spec_lock.colors` anchor or a Quick/contextual page-local color. -- Data-point color: when a single column/bar series uses data-point colors in the fallback, copy those fills into `series[].point_colors` in category order. -- Data labels: when visible point values are part of the fallback chart, write `data_labels` instead of companion text; use `data_labels.points` for selected labels, and use `number_format`, `font_size`, `font_family`, and per-point `colors` / `color` when the fallback labels carry suffixes or color-coded text. -- Line markers: when the fallback line chart draws visible point nodes, set `line_style: "lineMarker"`; leave the default `line` only for line charts without nodes. -- Area-under-line: when a combo plot is drawn as a filled area under a line, keep `type: "line"`, add `area_fill: true`, and copy the area transparency into `series[].fill_opacity`; copy visible line `stroke-width` into `series[].line_width` for line/area series. -- Native chrome: write `title`, `subtitle`, axis titles, or `show_legend: true` only when the fallback visibly renders the same chrome inside the native chart's replacement scope. `title` is the PowerPoint chart title, not an object name; use `name` for page-semantic object naming (e.g. `p03-revenue-chart`). Write explicit `x`/`y`/`width`/`height` read from the drawn plot area; omission is the fallback — the exporter then infers the frame from the drawn fallback geometry. -- Value-axis labels: when the fallback keeps category labels but intentionally omits numeric value-axis tick labels, set `show_value_axis_labels: false`. -- Freeform chart text: transcribe center labels, source notes, and other in-chart annotations as companion `caption` / `note` / `notes` entries with explicit slide-coordinate bounds; do not rely on fallback `` children to survive native export. -- Native chart typography mirrors the SVG fallback. Copy the fallback's shared chart font into `style.font_family` and visible chart text sizes into the matching metadata fields (`title_font_size`, `subtitle_font_size`, `axis_font_size`, `note_font_size`, etc.) only when role sizes differ; otherwise let the exporter infer them from visible fallback text. When a visible chart title, subtitle, or axis title needs its own size/color/font, write that field as an object with `text`, `font_size`, `font_family`, and `color`. Use `axis_title_font_size`, `legend_font_size`, or companion per-entry `font_size` only when the fallback visibly uses a separate size. -- Native table typography mirrors the SVG fallback. Write `style.font_family` and `style.font_size` from the visible table text; use `header_font_size` or per-cell `font_size` only when the fallback visibly does so. If the fallback has no explicit table font, Default uses the deck body family and declared `spec_lock.md` body anchor; Quick uses the concrete body family/size already resolved in active context. -- The marker group's transform stays translate/scale only (no rotate / matrix / skew). -- Visual parity is not a goal: the SVG drawing remains the designed visual and exports as editable DrawingML shapes; the native object is the data-backed counterpart with PowerPoint's chart/table-specific model. Never simplify the SVG design to match what a native object could show. - -**Per-page verification** — after writing a page with selected native-ready objects, enumerate those objects and confirm a one-to-one match: every object has one parent marker and exactly one JSON metadata child. Finding one marker somewhere on a page is insufficient when the page contains multiple selected objects. - -```bash -rg -n 'data-pptx-replace-with="(chart|table)"|' /svg_output/.svg -``` - - --- -## 3. Visualization Reference +## 3. Verification Handoff -§1 loads only a selected page-local SVG. Default takes Usage/semantics from -§VII/§IX; Quick takes them from the current active-context page decision. +Coordinate calibration is a conditional post-generation stage, not part of the page-authoring loop. After all SVG pages exist, run [`verify-charts`](../workflows/stages/verify-charts.md) whenever the active profile declares at least one page with value-driven chart geometry. -**Hard rule**: treat the loaded SVG as a page-local reference, not a required base. Default §IX or the Quick active-context page decision plus source data own the final information structure; never replicate the preview verbatim. +| Active profile | Verification page list | +|---|---| +| Default Generate | Design Spec §IX, with the stage's explicit legacy §VII fallback | +| Quick Generate | Still-active page decisions cross-checked one-for-one against plot-area markers | -**Adaptation rules**: -- **Preserve**: Default-planned or Quick-resolved information relationships, data encoding, and every active content obligation -- **Page-local only**: a reference row applies only to its mapped page; never spread it across the deck -- **Flexible realization**: borrow, recombine, or depart from the preview's type and geometry when the current page is better served another way -- **Carry forward**: every authoritative label, value, unit, status, source, and explanatory block; never shorten or drop content to imitate a lighter catalog preview -- **Adapt**: project data and labels, dimensions, axes, legend, and spacing as the authored content requires -- **Project-owned**: palette, typography, container treatment, effects, background, and page chrome; catalog preview values are fallbacks, never defaults -- **Bound final body modules**: add or revise root-coordinate `data-pptx-bounds` on every visible direct root `` copied into the final page; nested groups need none, chart geometry and local references are not content-boundary inputs, and catalog reference warnings never waive the final-page contract -- **Adjust with fidelity**: composition, axis ranges, grouping, and grid may change when the actual content, relationships, hierarchy, and data encoding remain complete -- **Forbidden**: treating preview structure as the page specification; omitting authoritative data points, labels, relationships, or explanatory content to fit it - -> Templates: `templates/charts/`. `page_charts` maps one optional reference to one page; execution opens only that SVG. - -### 3.1 Chart Coordinate Calibration - -Coordinate calibration runs as a **conditional post-generation stage**, not -inside the SVG authoring loop. After SVG generation completes, if the deck -contains data-driven charts, run -[`verify-charts`](../workflows/stages/verify-charts.md). Default follows its -declared gate order; Quick runs calibration before its one lockless final -checker. - -The authoring obligation is upstream: embed the -`` marker on every active data-chart page during the -initial draft (§2.1). Verify-charts enumerates Default pages from the Design -Spec; Quick enumerates them from the still-active page decisions and cross-checks -the markers before feeding `svg_position_calculator.py`. - -> Do NOT run `svg_position_calculator.py` during the initial draft. The calculator calibrates already-generated SVGs against their declared plot areas; running it before the SVG exists has nothing to compare against. +Do not run `svg_position_calculator.py` during the initial draft. The stage calibrates completed SVG geometry against the declared plot area, handles direct/decomposable/formula/manual modes, repairs genuine coordinate mismatches, and then returns to the active profile's checker order. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/executor-image.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/executor-image.md index b9a48d28..7164eae1 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/executor-image.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/executor-image.md @@ -30,21 +30,40 @@ Handle images by status; enum and lifecycle: [`svg-image-embedding.md`](svg-imag **Default — active image integration (may override when plain placement is stronger)**: Treat loaded [`image-layout-patterns.md`](./image-layout-patterns.md) as vocabulary and [`image-layout-spec.md`](./image-layout-spec.md) as math, not -a quota or lock. Run the catalog's §7 playbook before drawing; its combinations -are recall aids, not coverage targets. A `#P...` suggestion completes only the -page skeleton; omitted `M`, effect, Boolean, or native overlay leaves -realization open and never means “keep plain.” For every image-bearing page, -derive the image/content or image/shape relationship from its communication job, -hierarchy, copy, asset ratio/focus, and deck rhythm. Before drawing, form one -relevant treatment candidate, compare it with `P`-only, implement the stronger -legal composition, and realize any adopted treatment through the already-loaded -[`svg-effects.md`](./svg-effects.md) and -[`native-shape-authoring.md`](./native-shape-authoring.md). This is an opportunity -pass, not an effect quota. Deepen, simplify, replace, or combine suggestions; -plain placement remains valid when it communicates better. Preserve role/source, +a quota or lock. A `#P...` suggestion is only a skeleton; deepen, simplify, or +combine it through the already-loaded [`svg-effects.md`](./svg-effects.md) and +[`native-shape-authoring.md`](./native-shape-authoring.md). Plain placement or a +regular grid remains valid when it communicates better. Preserve role/source, must-use, crop/content, and explicit user/template constraints; expression-only changes need no upstream rewrite. +**Mandatory — per-page image composition decision**: Using this already-loaded +branch, decide once immediately before geometry on every page containing a +non-formula image and keep the result only in active context: +`role → direction generator → parent contour → slots/rhythm → crop → +image-shape action → labels/overlays → depth/continuity`. Derive the relationship +from the communication job, hierarchy, copy, asset ratio/focus, and deck rhythm; +use `anchor`, `continue`, `bridge`, `overlap`, `reveal`, `echo`, or `register` +only when useful. Compare the resulting candidate with plain/`P`-only placement +and implement the stronger legal composition. Create no artifact or extra pass, +and do not reread the branch while its active context remains valid. + +**Reference — direction generators, not templates**: + +| Generator | Behavior | +|---|---| +| `vector` | Progress slots along one shared movement vector | +| `shared-baseline` | Share a baseline while size, offset, or overlap changes systematically | +| `curve-spine` | Derive slots and turns from one continuous curve or folded path | +| `panel` | Subdivide one coherent tilted, stepped, or polygonal parent panel | +| `none/grid` | Retain calm plain placement or a regular grid | + +**Default — coherent multi-image direction (may override when deliberate disorder +serves the communication job)**: Within one image group, derive slot positions, +crop edges, overlap, and any rotation from one primary direction generator. +Varied angles need one declared rhythm or collision rule; they are not a shortcut +to variety. + **Reference — motion-ready image layering, not a constraint**: For adopted §IX or an explicit focus, comparison, evidence, reveal-order, or cross-page requirement, decide during SVG authoring whether the final composition needs separate visible units. Keep ordinary stable framing/background static and wrap each independently revealed or continuing Slide-local unit in a descriptive direct-root ``; structured atoms/slots retain their boundaries. Existing units or a page transition may suffice. The motion stage owns effects, pairing, order, and timing. **Hard rule — visible-layer timing**: Any crop, lens, scrim, comparison, evidence, or annotation layer required by an adopted motion plan MUST already exist in the final SVG without violating structural contracts. The later stage may regroup ordinary Slide-local content visual-equivalently, but cannot invent or modify missing visible content. If no legal existing unit can serve a non-binding suggestion, simplify it to available units, a page transition, or `none`; an explicit requirement that cannot be represented follows failure recovery. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/executor-structure.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/executor-structure.md new file mode 100644 index 00000000..de6bed89 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/executor-structure.md @@ -0,0 +1,97 @@ +> See [`executor-base.md`](./executor-base.md) for shared authoring and [`executor-chart.md`](./executor-chart.md) / [`executor-table.md`](./executor-table.md) for other information models. + +# Executor Shape Composition Grammar + +Runtime grammar for Slide-local qualitative relationships built from editable shapes; it is not a diagram/template catalog. + +**Load**: Quick reads this grammar once before all SVG authoring and reuses it for every per-page decision. Default loads it before realizing the first page whose Structure decision is yes, then reuses it in that execution context. + +**Hard rule — no Structure catalog**: never recall or resolve `structure/`. Compose from authoritative content, §IX relationships, the communication move, and the active visual system. + +**Hard rule — not structured PPTX**: this branch owns Slide-local geometry. [`executor-structured.md`](./executor-structured.md) independently owns reusable Master/Layout/placeholders under `pptx_structure.mode: structured`; neither implies the other. + +--- + +## 1. Relationship Atoms + +| Atom | Meaning | Encode with | +|---|---|---| +| `order` | Sequence, progression, or rank | Position, numbering, direction, shared path | +| `link` | Dependency, exchange, influence, transition | Proximity/alignment when unmistakable; otherwise an edge | +| `parent` | One unit governs or decomposes into children | Branching, indentation, nesting, scale | +| `membership` | Units belong to a group, stage, lane, or region | Containment, shared field, band, repetition | +| `contrast` | Peers, states, options, or positions compare | Shared baseline, opposing regions, parallel framing | +| `overlap` | Units share a meaningful subset or duty | Intersecting regions plus a clear common area | + +Combine atoms as needed; never force a named business model. Numbers used only as labels do not create a chart. Value-derived position/length/angle/area/radius/width/color routes to [`executor-chart.md`](./executor-chart.md); row-header × column-header facts route to [`executor-table.md`](./executor-table.md). Qualitative lanes use this grammar, but date/duration-driven task-bar `x`/`width` is Gantt Chart geometry. + +--- + +## 2. Shape Roles and Operations + +| Role | Job | +|---|---| +| `field` | Page/local region where a relationship operates | +| `node` | Semantic unit, state, actor, item, or group | +| `spine` | Explicit/implied scaffold establishing reading direction | +| `edge` | Necessary connection, branch, dependency, or transition | +| `label` | Text attached to a node, edge, region, or relationship | +| `garnish` | Non-semantic accent added after the relationship works | + +| Operation | Job | +|---|---| +| `repeat` | Create peers from one role | +| `arrange` | Establish order, alignment, rhythm, rank, comparison | +| `transform` | Vary scale, rotation, crop, fill, or emphasis meaningfully | +| `connect` | Add an edge when layout/containment is insufficient | +| `region` | Partition, contain, intersect, band, or layer fields | +| `attach` | Bind labels, badges, annotations, or evidence to an owner | + +**Hard rule — realization enters the construction gate**: Decide whether each +role is implicit/direct content or drawn geometry. Every drawn field, spine, +node carrier, or edge uses the first faithful tier under +[`native-shape-authoring.md`](./native-shape-authoring.md) §1: primitive → exact +preset → Boolean → necessary freeform. Text styling/rules cannot replace +required geometry; implicit/direct roles need no container. Decoration cannot +invent a relationship. + +--- + +## 3. Construction Order + +Choose the field and map required atoms, then follow: + +**Mandatory — spine → nodes → connectors → labels → garnish**: + +| Layer | Completion evidence | +|---|---| +| `spine` | Entry, direction, and organizing path are clear | +| `nodes` | Every required unit has one home and intentional weight; each is direct content or a §2-approved carrier | +| `connectors` (`edge`) | Only unresolved links become edges; route/source/target is clear; every drawn edge passes §2 | +| `labels` | Copy and caveats visibly attach to what they explain | +| `garnish` | Removing accents leaves all meaning intact | + +**Hard rule — relationship before styling**: establish atoms, field, spine, nodes, and necessary edges before palette, type, effects, or containers. Prefer containment, alignment, baselines, and proximity; add lines/Connectors only for real edges, never to make a page look process-like. + +**Default — visible structural move (may override for naked-text rhythm/style)**: +Make one relationship-bearing field, spine, node carrier, or directional shape +the page-scale move; never add geometry merely because Structure is `yes`. + +> Note: spatial encoding may remove the need for a new object; any drawn node +> carrier, spine, or edge still passes §2. + +--- + +## 4. Validation + +| Check | Pass condition | +|---|---| +| Coverage | Every authoritative atom is visible; none was invented | +| Reading path | Entry, progression, hierarchy, and endpoint are unambiguous | +| Roles | Nodes/edges have one duty; garnish carries no meaning | +| Attachment | Labels/evidence belong to the correct node, edge, or region | +| Removal | Without color/effects/icons/garnish, placement still communicates | +| Fidelity | All required units, qualifiers, values, and caveats remain | +| Construction | Drawn fields/spines/node carriers/edges pass §2; implicit/direct roles need no carrier; freeform follows failed primitive/preset/Boolean tiers | + +Load Chart/Table branches independently for embedded objects. Keep one dominant reading path while allowing secondary atoms whose ownership stays clear. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/executor-structured.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/executor-structured.md index 312b6748..0bcc8424 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/executor-structured.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/executor-structured.md @@ -6,6 +6,8 @@ Conditional Executor authority for `template_reuse_scope: mirror|layout` with `p **Trigger**: load only when the lock selects structured template reuse. +**Hard rule — package structure, not information structure**: this branch owns reusable PowerPoint Master/Layout atoms, placeholders, slots, and prototype topology. [`executor-structure.md`](./executor-structure.md) independently owns Slide-local qualitative shape composition. Neither one activates or implies the other. + ## 1. Template Reuse Rules ### 1.0 Template Context Load @@ -60,7 +62,7 @@ When `spec_lock.md` records the AI-derived `template_reuse_scope: mirror`, Execu **Detecting mirror mode**: read `template_reuse_scope` from the retained lock. `replication_mode: mirror` in the installed template only determines whether that scope is legal; it must never force mirror behavior when the lock records `layout` or `style`. -**Mirror + chart pages**: chart structures inside a mirror SVG are already drawn (axis, series, labels). Treat them as visual references — replace the data labels and series text content to match the project's chart spec, but do not redraw the chart from a `templates/charts/.svg` baseline. A mirror template's `page_charts` entries are normally absent for this reason. +**Mirror + visualization pages**: Chart, Table, and qualitative topology inside a mirror SVG are already drawn. Replace only permitted text while preserving prototype geometry; do not redraw from a catalog SVG or runtime grammar. A mirror template normally omits `page_visualizations`, and legacy `page_charts` never overrides fidelity. **Legacy template boundary**: A template with missing root Master identity, direct atomic placeholders, `data-pptx-layout-kind`, unmapped `baseline`, `preserve`, or `layout_strategy: distill` is not a fallback input. Stop and create a new current workspace through [`create-template`](../workflows/create-template.md) before generation. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/executor-table.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/executor-table.md new file mode 100644 index 00000000..5b62037b --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/executor-table.md @@ -0,0 +1,65 @@ +> See [`executor-base.md`](./executor-base.md) for page authoring and [`executor-visualization.md`](./executor-visualization.md) when a table-family SVG is selected. + +# Executor Table Branch + +Conditional Executor authority for semantic cell grids whose row/column intersections carry the information. + +**Trigger**: load when the page contains an actual cell-grid table or its primary reference uses `table/`. + +--- + +## 1. Cell-grid Boundary + +| Information model | Route | +|---|---| +| A row header and column header jointly address each body fact; summaries and optional rectangular spans preserve the same grid | This branch | +| Independent visual zones compare categories without a shared row/column grid | [`executor-structure.md`](./executor-structure.md) | +| Values determine marks, positions, lengths, areas, angles, radii, or color bins | [`executor-chart.md`](./executor-chart.md) | + +Graphical indicators may appear inside cells without changing the table family, provided the row/column grid still carries their meaning. A row of metric cards or two prose columns is a qualitative structure, not a table. + +**Hard rule — physical grid is insufficient**: A PowerPoint table object or a +rectangular drawing grid does not establish Table semantics. Exact dates or +durations that drive task-bar position and length route to +[`executor-chart.md`](./executor-chart.md); qualitative stage/lane placement +routes to [`executor-structure.md`](./executor-structure.md). + +When a `table/` primary reference exists, [`executor-visualization.md`](./executor-visualization.md) owns resolution and flexible adaptation. A custom cell grid follows this branch without loading a catalog SVG. + +**Reference — not a constraint**: `record_table` covers heterogeneous record × +field grids; `metric_table` covers entity × KPI scanning; +`comparison_matrix` covers heterogeneous criterion × alternative facts; +`feature_matrix` covers capability states; `rating_matrix` covers one repeated +ordinal scale; and `hierarchical_table` covers grouped/indented rows with detail +and totals. These keys separate recurring cell grammars without changing the +shared row/column information-model boundary. + +--- + +## 2. Grid Construction + +**Hard rule — grid before decoration**: establish the complete logical grid before drawing fills, borders, badges, or other cell treatment. + +1. Resolve column count, row count, header rows, row labels, summaries, and any rectangular visual spans from the authoritative content. +2. Allocate column widths and row heights from semantic weight and real text/data fit; do not default to equal columns when labels or values differ materially. +3. Place every cell value, unit, qualifier, status, and source-bearing note in its correct intersection. +4. Apply alignment consistently by content role, including comparable numeric alignment and stable header/body hierarchy. +5. Add rules, fills, banding, highlights, and in-cell indicators only after the grid reads correctly in plain form. + +**Per-cell completeness**: never drop a row, column, summary, footnote, unit, or qualifier to imitate a lighter catalog preview. Reflow text, widen the affected column, rebalance adjacent columns, or increase row height while preserving the active page's information contract and [`executor-base.md`](./executor-base.md) typography bounds. + +**Visual span discipline**: merge only rectangular regions whose repeated boundaries would obscure an intended shared heading or group. Covered areas must not carry competing visible content. This branch owns the visible SVG geometry only; any native merge fields or payload topology belong exclusively to [`native-data-interface.md`](./native-data-interface.md). + +**Table chrome**: make header/body/summary roles distinguishable with the lightest sufficient combination of weight, fill, rule, and whitespace. Keep comparison scanning stable across the grid; decorative card treatment must not break row or column continuity. + +--- + +## 3. Object Boundary + +Treat each semantic table as one independently bounded page object even when it contains nested cell groups. Captions, source notes, and explanatory callouts may sit outside the grid when their ownership is visually explicit. + +Native readiness is decided per independent table object, not by the `table` +family or numeric cells. Reuse its §IX/Quick semantic object key in the +`Native-ready` map; only `=yes` loads and follows +[`native-data-interface.md`](./native-data-interface.md). All others remain +ordinary Shape-first SVG geometry under [`executor-base.md`](./executor-base.md). diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/executor-visualization.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/executor-visualization.md new file mode 100644 index 00000000..742c9560 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/executor-visualization.md @@ -0,0 +1,57 @@ +> See [`executor-base.md`](./executor-base.md) for page authoring and the Chart/Table branches for information-model construction. + +# Executor Visualization Reference Branch + +Conditional Executor authority for resolving one page-local Chart/Table `family/key` SVG reference and adapting it without turning the catalog preview into a page specification. + +**Trigger**: load only when Default `spec_lock.md page_visualizations` maps the current page to a canonical Chart/Table reference, a legacy `page_charts` row resolves to a live Chart/Table SVG, or Quick already selected one canonical Chart/Table reference in active context. + +--- + +## 1. Canonical Reference Resolution + +| Family | Canonical reference | SVG root | Construction authority | +|---|---|---|---| +| `chart` | `chart/` | `templates/charts/.svg` | [`executor-chart.md`](./executor-chart.md) | +| `table` | `table/` | `templates/tables/.svg` | [`executor-table.md`](./executor-table.md) | + +| Active profile | Resolve from | +|---|---| +| Default Generate | Prefer the current `P: family/key` row from retained `spec_lock.md page_visualizations`, then read that page's `Page | Family | Template | Usage` row in Design Spec §VII; use a legacy `page_charts` row and its legacy §VII Usage only when the canonical row is absent | +| Quick Generate | Use the canonical Chart/Table `family/key` and page-local purpose already selected in active context before SVG authoring | + +**Hard rule — one primary reference per page**: one page resolves at most one catalog SVG. The reference guides one dominant reusable Chart/Table information structure; secondary objects are authored from their actual content through the applicable branch without loading another catalog SVG. Independent Chart/Table children retain their §IX or Quick semantic object keys for scoped native/verification contracts. + +**Mandatory — shared resolution**: resolve the selected value through `visualization_recall.py validate`; consume its canonical `reference` and `path` instead of guessing a family or constructing a path from the input string. Add `--legacy-bare` only for a value read from legacy `page_charts`. + +```bash +python3 ${SKILL_DIR}/scripts/visualization_recall.py validate +python3 ${SKILL_DIR}/scripts/visualization_recall.py validate \ + --legacy-bare +``` + +New `page_visualizations` and Quick selections accept only canonical `chart/` or `table/`. A bare key is read-compatible only from legacy `page_charts`: it must resolve unambiguously to one live Chart/Table entry, otherwise stop for upstream correction. If canonical and legacy rows both exist for one page, stop on the duplicate contract even when both resolve to the same SVG. + +**Legacy Structure boundary**: a retired Structure bare key is semantic intent, not a live visualization reference. Do not resolve it to an SVG or load this branch; recover the qualitative relationship from §IX and apply [`executor-structure.md`](./executor-structure.md) when the mandatory per-page Structure decision is yes. If §IX lacks enough meaning, return upstream for Design Spec repair. + +Read the resolver-returned SVG once before its first use in the valid active context and reuse that reading until a known file change or context invalidation. Do not manually open indexes or scan family directories during Executor realization; the shared resolver owns live-catalog reads. Selection and bounded recall belong before this branch. + +--- + +## 2. Flexible Page-local Adaptation + +**Hard rule — reference, not lock**: the selected SVG is a page-local construction reference. The current §IX page block or Quick page decision plus authoritative source content owns the final information structure; the preview does not lock visualization type, geometry, styling, or native replacement. + +| Preserve | Adapt freely | +|---|---| +| Authoritative labels, values, units, statuses, sources, relationships, hierarchy, and explanatory content | Dimensions, spacing, axes, grouping, orientation, density, and exact primitive/preset composition | +| Selected Usage and valid information encoding | Borrow, recombine, simplify, extend, or depart when another realization preserves the information more faithfully | +| Complete page content obligations | Palette, typography, container treatment, effects, background, and page chrome from project authorities | + +**Forbidden — preview substitution**: + +- Do not copy sample labels/data as content. +- Do not omit authoritative content to fit lighter preview density. +- Do not spread one page's reference to another page without its own mapping. + +The namespace selects a reference registry and construction authority only; it does not assert native readiness or mirror a source PowerPoint object type. An imported table used to place duration-driven bars remains Chart semantics. Native eligibility is an independent per-object decision owned by [`native-data-interface.md`](./native-data-interface.md). diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/image-layout-spec.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/image-layout-spec.md index 526e5116..6b77bbdb 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/image-layout-spec.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/image-layout-spec.md @@ -149,7 +149,56 @@ Use weighted tracks when one item is primary. A spanning item receives the sum o ### 4.3 Free multi-item composition -For montage, arc, overlap, or another non-grid arrangement, assign one explicit region to every item and verify the union against `(W,H)`. Reuse one gap/rhythm system where separation is intended; overlap is explicit geometry, not a negative-gap accident. +**Mandatory**: For montage, arc, overlap, or another non-grid arrangement, give +every carrier a finite center and positive size, give every intended overlap an +unambiguous front item, and verify the visible union against `(W,H)`. + +**Default — shared direction (may override when deliberate disorder serves the +communication job)**: Select one direction generator and derive related carriers +from shared geometry. An override still declares a bounded placement/angle rule +so disorder is authored rather than accidental. Use the following state: + +| State | Definition | +|---|---| +| `p[i] = (cx[i], cy[i])` | Explicit center of item `i` | +| `(w[i], h[i])` | Explicit positive carrier size | +| `s[i] > 0` | Optional shared size rhythm: `(w[i], h[i]) = s[i] × (w0, h0)` | +| `P` (optional) | Parent contour controlling the outer silhouette, shared seam, reveal, or attachment path | +| `V[i]` | Visible carrier after applying its clip and, when `P` is a silhouette, intersecting it with `P` | +| `z[i]` | Stacking rank required for carriers that overlap | + +For a straight shared direction `θ`, calculate centers in its local frame: + +```text +d = (cos(θ), sin(θ)) +n = (-sin(θ), cos(θ)) +p[i] = p0 + t[i] × d + e[i] × n +``` + +Choose `t[i]` and transverse offset `e[i]` as explicit sequences; add `s[i]` +when scale carries the rhythm. Reuse a progression when rhythm is intended; do +not substitute unrelated per-item values. + +| Generator | Executable rule | +|---|---| +| `vector` | Use the straight-frame equation with ordered `t[i]`; set `t[i+1] = t[i] + advance[i]`, where each `advance[i] > 0`. Control overlap through `advance[i]`, not an accidental negative gap. | +| `shared-baseline` | Choose baseline `B(t) = b + t × d`. If `r[i]` is the carrier's half-extent along `n`, place `p[i] = B(t[i]) + r[i] × n`; this keeps one carrier edge on the same baseline while sizes vary. | +| `curve-spine` | Choose ordered parameters `u[i]` on `C(u)` with `||C'(u[i])|| > 0`. Set `d[i] = normalize(C'(u[i]))`, `n[i] = (-d[i].y, d[i].x)`, and `p[i] = C(u[i]) + e[i] × n[i]`; at a zero derivative, use the secant between nearest distinct samples or another generator. | +| `panel` | Define one convex 2D quadrilateral `A,B,C,D` in consistent winding and `F(u,v) = (1-u)(1-v)A + u(1-v)B + uvC + (1-u)vD`. Split monotone `u`/`v` intervals; each cell uses its four `F` corners. | + +For each intended overlap, calculate `area(V[i] ∩ V[j]) > 0` and assign the +front item through `z[i]` and `z[j]`. `P` must visibly control at least one +listed structural role; otherwise use the selected region boundary and omit it. + +**Reference — not a constraint**: Use one of these angle mechanisms according to the selected composition: + +| Mechanism | Geometry | +|---|---| +| Clip-shape angle | Keep the bitmap upright and angle only the carrier contour or clip path. | +| Parent-group rotation | Build the complete arrangement first, then rotate its carriers, frames, and attached labels together around one pivot. | +| Tangent rotation | On `curve-spine`, rotate item `i` around `p[i]` by `atan2(d[i].y, d[i].x)` when the carriers should follow the path. | + +**Forbidden — unsupported image deformation**: Do not use shear, skew, or true perspective mapping. A `panel` is a set of 2D quadrilateral clips/crops; it does not warp the image plane. --- @@ -178,6 +227,11 @@ Contain each formula independently in its lane. When formulas are visual peers, | Adjacent text/content region cannot carry its material | Reweight or change the selected relationship | | Equal cells imply equality that the content does not have | Use weighted tracks or a free composition | | Peer images use inconsistent visual scale without meaning | Normalize their regions or make the hierarchy explicit | +| A free carrier lacks an explicit center or positive size, or an intended overlap lacks stacking order | Supply the missing geometry or z-order before drawing | +| Items intended as one system lack both a shared direction and a deliberate-disorder rule | Derive them from one vector, baseline, curve, panel, or bounded override | +| Per-item angles vary without a shared direction or deliberate-disorder rule | Use one parent-group angle, a shared clip-shape direction, curve tangents, or a bounded angle rhythm | +| The parent contour does not affect silhouette, seam, reveal, or attachment | Remove it or reconstruct the carriers from that contour | +| A panel depends on shear, skew, or perspective warping | Replace it with 2D quadrilateral carriers and focal-safe crops | | Formula symbols become unreadable at the intended viewing size | Enlarge its region or restructure the page | | Gaps, alignments, or overlaps drift without purpose | Recalculate from the shared region and gap values | diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/image-type-templates/_index.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/image-type-templates/_index.md index f3656233..a0ffc266 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/image-type-templates/_index.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/image-type-templates/_index.md @@ -24,11 +24,11 @@ Each type has its own file with: composition skeleton (LAYOUT / ELEMENTS / NEGAT |---|---|---| | [`infographic`](./infographic.md) | 2-5 parallel ordered zones with icons + minimal labels | Data summary / step list / KPI rundown | | [`flowchart`](./flowchart.md) | Sequential blocks connected by directional arrows | Process / workflow / pipeline | -| [`framework`](./framework.md) | Central node + radiating satellites (hub-spoke) | Methodology / model / system architecture | -| [`matrix`](./matrix.md) | 2×2 quadrant grid with two perpendicular axes | SWOT / BCG / Eisenhower / Ansoff / Porter | -| [`cycle`](./cycle.md) | Closed loop, 3-6 steps with arrows returning to start | PDCA / flywheel / design thinking / continuous improvement | +| [`framework`](./framework.md) | Central node + radiating satellites (hub-spoke) | Relational system / architecture | +| [`matrix`](./matrix.md) | 2×2 quadrant grid with two perpendicular axes | Priority / risk / effort-impact regions | +| [`cycle`](./cycle.md) | Closed loop, 3-6 steps with arrows returning to start | Iteration / lifecycle / continuous improvement | | [`funnel`](./funnel.md) | Top-wide bottom-narrow conversion stack | Marketing funnel / sales pipeline / hiring funnel | -| [`pyramid`](./pyramid.md) | Bottom-wide top-narrow hierarchical tiers | Maslow / capability stack / value hierarchy | +| [`pyramid`](./pyramid.md) | Bottom-wide top-narrow hierarchical tiers | Capability stack / value hierarchy | | [`comparison`](./comparison.md) | Symmetric split (left vs right, before vs after) | A/B / pros-cons / Before-After | | [`timeline`](./timeline.md) | Linear axis with milestone markers | History / roadmap / evolution | | [`map`](./map.md) | Stylized geographic outline with annotated markers | Offices / market presence / regional data / supply chain | @@ -44,11 +44,11 @@ Each type has its own file with: composition skeleton (LAYOUT / ELEMENTS / NEGAT |---|---| | Data summary / metrics rundown / step list | `infographic` | | Process / workflow / pipeline / steps with arrows | `flowchart` | -| Methodology / model / framework / architecture diagram | `framework` | -| 2×2 quadrant / SWOT / BCG / Eisenhower / Ansoff | `matrix` | -| Closed-loop process / PDCA / flywheel / continuous improvement | `cycle` | +| Relational system / framework / architecture diagram | `framework` | +| 2×2 quadrant / priority / risk / effort-impact | `matrix` | +| Closed-loop process / iteration / lifecycle / continuous improvement | `cycle` | | Conversion funnel / sales pipeline / hiring funnel | `funnel` | -| Hierarchy / Maslow / value stack / capability layer | `pyramid` | +| Hierarchy / value stack / capability layer | `pyramid` | | Comparison / Before-After / A/B / VS | `comparison` | | History / evolution / roadmap / timeline | `timeline` | | Offices / market presence / regions / supply chain / geography | `map` | diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/image-type-templates/cycle.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/image-type-templates/cycle.md index 1c08af04..3ebfd3eb 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/image-type-templates/cycle.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/image-type-templates/cycle.md @@ -1,6 +1,6 @@ # Type: cycle -A **closed-loop process** — 3-6 steps arranged in a circle (or rounded loop), connected by directional arrows that return the flow to its starting point. The structural backbone for PDCA, growth flywheel, design-thinking cycle, continuous-improvement loops, lifecycle diagrams. +A **closed-loop process** — 3-6 steps arranged in a circle (or rounded loop), connected by directional arrows that return the flow to its starting point. Use it for iterative processes, continuous-improvement loops, or lifecycle diagrams. > **What cycle means inside a PPT block**: a **closed circular flow** — every step leads to the next, and the last step leads back to the first. Unlike `flowchart` (linear, one-way), cycle has no terminal end. Unlike `framework` (centered hub with passive satellites), cycle has directional motion around the perimeter. @@ -45,6 +45,6 @@ Self-contained cycle diagram with step names typeset into the artwork. Keep each ## 3. Fewshot prompt snippets -**Snippet A — vector-illustration + cool-corporate PDCA cycle, text_policy: none, 700×700** +**Snippet A — vector-illustration + cool-corporate four-stage cycle, text_policy: none, 700×700** -> Clean flat vector illustration of a closed-loop process cycle. Four step nodes arranged in a perfect circle on the canvas perimeter — at 12 o'clock, 3 o'clock, 6 o'clock, and 9 o'clock positions. Each node is a rounded square (about 130×130px equivalent) filled with primary deep navy `#1E3A5F`, with one simple white iconic symbol centered inside — a clipboard (plan), a hand (do), a magnifying glass (check), a gear (act). Curved directional arrows in accent gold `#D4AF37` connect each node to the next going clockwise, closing the loop. The center of the circle is calm — secondary light gray `#F8F9FA` field with one small accent gold dot at the exact center as the cycle's anchor. Crisp 2px outlines, soft 8% drop shadow under each node. Composed as a 700×700 half-page cycle block with 15% padding. NO text, letters, or step labels anywhere — SVG will overlay all step names. Color values are rendering guidance only. +> Clean flat vector illustration of a closed-loop process cycle. Four step nodes arranged in a perfect circle on the canvas perimeter — at 12 o'clock, 3 o'clock, 6 o'clock, and 9 o'clock positions. Each node is a rounded square (about 130×130px equivalent) filled with primary deep navy `#1E3A5F`, with one simple white iconic symbol centered inside — a compass, a hand, a magnifying glass, and a gear. Curved directional arrows in accent gold `#D4AF37` connect each node to the next going clockwise, closing the loop. The center of the circle is calm — secondary light gray `#F8F9FA` field with one small accent gold dot at the exact center as the cycle's anchor. Crisp 2px outlines, soft 8% drop shadow under each node. Composed as a 700×700 half-page cycle block with 15% padding. NO text, letters, or step labels anywhere — SVG will overlay all step names. Color values are rendering guidance only. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/image-type-templates/framework.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/image-type-templates/framework.md index cc270584..c6ff816e 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/image-type-templates/framework.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/image-type-templates/framework.md @@ -1,6 +1,6 @@ # Type: framework -A central concept surrounded by related sub-concepts, or a multi-component system shown as a relational structure. Used when the image's job is to make a methodology, model, or architecture **legible at a glance**. +A central concept surrounded by related sub-concepts, or a multi-component system shown as a relational structure. Use it when the image's job is to make a relational system or architecture **legible at a glance**. > **What framework means inside a PPT block**: the image *itself* is a small relational diagram — central hub + radiating satellites, or a labeled matrix, or a layered stack. The PPT page's slide layout (where this image sits, what text accompanies it) is a separate decision. This file only governs what's *inside* the image rectangle. @@ -34,7 +34,7 @@ Three valid sub-structures. Pick one per image; do not mix. ``` | LAYOUT | Equal-sized cells in a grid; each cell carries one concept | -| ELEMENTS | One icon or symbolic shape per cell; cells are visually equal (no cell dominates unless that's the point — e.g. SWOT, BCG matrices) | +| ELEMENTS | One icon or symbolic shape per cell; cells are visually equal unless one region is intentionally emphasized | | NEGATIVE SPACE | Generous cell padding — internal content occupies the inner 70% of each cell | ### Sub-structure 3 — Layered stack diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/image-type-templates/matrix.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/image-type-templates/matrix.md index a80ae9f0..8a5e4392 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/image-type-templates/matrix.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/image-type-templates/matrix.md @@ -1,6 +1,6 @@ # Type: matrix -A **2×2 quadrant grid** (occasionally 3×3) where each cell carries its own label, color, or icon. The structural backbone of consulting frameworks — SWOT, BCG, Eisenhower, Ansoff, Porter's, Risk/Reward. Used wherever two orthogonal axes divide the page into discrete zones. +A **2×2 quadrant grid** (occasionally 3×3) where each cell carries its own label, color, or icon. Use it wherever two orthogonal axes divide the image into discrete qualitative zones. > **What matrix means inside a PPT block**: the canvas is **rigorously divided into equal quadrants** by perpendicular axes. Unlike `framework` (central hub + radiating satellites), matrix has no center — meaning lives in the four cells. Unlike `comparison` (two side-by-side zones), matrix splits **both** horizontally and vertically. @@ -41,12 +41,12 @@ Sample fragment: ### 3.2 `text_policy: embedded` -When the matrix's identity comes from its in-image lettering — a stylized SWOT poster with the four letters as visuals, or a designer matrix whose axis labels are part of the artwork. Keep labels concise and stable in the required script. Specify a font family that echoes the deck's body typography; move exact/editable labels to SVG instead. +When the matrix's identity comes from its in-image lettering or its axis labels are part of the artwork, keep labels concise and stable in the required script. Specify a font family that echoes the deck's body typography; move exact/editable labels to SVG instead. --- ## 3. Fewshot prompt snippets -**Snippet A — vector-illustration + cool-corporate SWOT matrix, text_policy: none, 800×800** +**Snippet A — vector-illustration + cool-corporate quadrant matrix, text_policy: none, 800×800** -> Clean flat vector illustration of a 2×2 strategic matrix. Two perpendicular thin lines in primary deep navy `#1E3A5F` cross at the exact canvas center, dividing the canvas into four equal quadrants. Each quadrant has a subtle background tint: upper-left in pale primary navy at 10% opacity, upper-right in pale accent gold `#D4AF37` at 15% opacity, lower-left in pale gray `#F8F9FA`, lower-right in slightly deeper pale navy at 18% opacity. Each quadrant contains one simple iconic symbol in primary navy, centered within its quadrant — a shield (strength), a lightning bolt (opportunity), a target (weakness), an alert triangle (threat). Each icon occupies about 45% of its quadrant. Small accent gold dots sit at the four outer corners. Composed as an 800×800 reference matrix block with 10% padding. NO text, letters, axis labels, or quadrant names anywhere — SVG will overlay all labels. Color values are rendering guidance only. +> Clean flat vector illustration of a 2×2 qualitative matrix. Two perpendicular thin lines in primary deep navy `#1E3A5F` cross at the exact canvas center, dividing the canvas into four equal quadrants. Each quadrant has a subtle background tint: upper-left in pale primary navy at 10% opacity, upper-right in pale accent gold `#D4AF37` at 15% opacity, lower-left in pale gray `#F8F9FA`, lower-right in slightly deeper pale navy at 18% opacity. Each quadrant contains one simple iconic symbol in primary navy, centered within its quadrant — a compass, a lightning bolt, a target, and an alert triangle. Each icon occupies about 45% of its quadrant. Small accent gold dots sit at the four outer corners. Composed as an 800×800 reference matrix block with 10% padding. NO text, letters, axis labels, or quadrant names anywhere — SVG will overlay all labels. Color values are rendering guidance only. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/image-type-templates/pyramid.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/image-type-templates/pyramid.md index 2f78190a..b3371ea3 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/image-type-templates/pyramid.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/image-type-templates/pyramid.md @@ -1,6 +1,6 @@ # Type: pyramid -A **tiered triangular stack** — bottom-wide, top-narrow — where each layer carries its own label/color/concept. The structural backbone for Maslow's hierarchy, food pyramids, capability stacks, value hierarchies, software-architecture layer diagrams. +A **tiered triangular stack** — bottom-wide, top-narrow — where each layer carries its own label/color/concept. Use it for capability stacks, value hierarchies, or software-architecture layers. > **What pyramid means inside a PPT block**: a **converging-upward** layered structure embodying "foundation supports value" — wide stable base, narrow apex of meaning. Unlike `funnel` (narrows downward, about filtering), pyramid narrows upward, about **stacking value or hierarchy**. Unlike `framework` (centered hub), pyramid is **strictly vertical layered**. @@ -45,6 +45,6 @@ Self-contained pyramid with tier names typeset into the artwork. Keep tier names ## 3. Fewshot prompt snippets -**Snippet A — vector-illustration + cool-corporate Maslow pyramid, text_policy: none, 600×800** +**Snippet A — vector-illustration + cool-corporate capability pyramid, text_policy: none, 600×800** -> Clean flat vector illustration of a hierarchy pyramid. Five horizontal stepped tiers stacked vertically, each tier centered on the canvas vertical axis and ~18% narrower than the tier below. From bottom to top: tier 1 (foundation, widest) in deeper primary `#1E3A5F`; tier 2 in primary `#3B5478`; tier 3 in lighter primary `#5A7099`; tier 4 in secondary blue tint `#A8BDDD`; tier 5 (apex, narrowest) in accent gold `#D4AF37`. Each tier has one simple white iconic symbol centered — a brick (physiological), a shield (safety), a heart (belonging), a trophy (esteem), a star (self-actualization). Thin secondary cream `#F8F9FA` dividers separate the tiers. Background secondary cream. Composed as a 600×800 portrait pyramid block with 12% padding. NO text or labels — SVG will overlay tier names. Color values are rendering guidance only. +> Clean flat vector illustration of a hierarchy pyramid. Five horizontal stepped tiers stacked vertically, each tier centered on the canvas vertical axis and ~18% narrower than the tier below. From bottom to top: tier 1 (foundation, widest) in deeper primary `#1E3A5F`; tier 2 in primary `#3B5478`; tier 3 in lighter primary `#5A7099`; tier 4 in secondary blue tint `#A8BDDD`; tier 5 (apex, narrowest) in accent gold `#D4AF37`. Each tier has one simple white iconic symbol centered — a brick, a shield, a gear, an upward arrow, and a star. Thin secondary cream `#F8F9FA` dividers separate the tiers. Background secondary cream. Composed as a 600×800 portrait pyramid block with 12% padding. NO text or labels — SVG will overlay tier names. Color values are rendering guidance only. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/modes/briefing.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/modes/briefing.md index 04c2252c..4cc8df9d 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/modes/briefing.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/modes/briefing.md @@ -26,7 +26,7 @@ Neutral information delivery. Lay the facts out plainly and completely, organize - Even hierarchy within a section; consistent layout across sibling pages so the eye always knows where to look. - Where one figure genuinely matters (a total, a status flag, an exception), surface it — but don't invent a punchline the content doesn't have. -> Table / list / dashboard / status-card geometry lives in [`templates/charts/`](../../templates/charts/); this mode decides *that the page informs completely and neutrally*, not pixel positions. +> Cell-grid tables and value-driven marks may use [`templates/tables/`](../../templates/tables/) and [`templates/charts/`](../../templates/charts/); qualitative topology is composed at runtime through [`executor-structure.md`](../executor-structure.md). A dashboard may combine them. This mode decides *that the page informs completely and neutrally*, not pixel positions. ## 3. Speaker-notes register diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/modes/instructional.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/modes/instructional.md index 48b18e70..bb838a57 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/modes/instructional.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/modes/instructional.md @@ -26,7 +26,7 @@ Titles state what the page teaches ("How attention weights are computed") — cl - Diagrams that build incrementally; annotate the part currently being explained. - Concrete examples anchor abstract points when they improve transfer or comprehension. -> Step / flow / diagram geometry lives in [`templates/charts/`](../../templates/charts/); this mode decides *the learning order and granularity*. +> Compose step, flow, and diagram topology at runtime through [`executor-structure.md`](../executor-structure.md); value-driven teaching charts remain in [`templates/charts/`](../../templates/charts/). This mode decides *the learning order and granularity*. --- diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/modes/narrative.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/modes/narrative.md index 94f2207a..ead3c246 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/modes/narrative.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/modes/narrative.md @@ -24,7 +24,7 @@ Titles read as beats that advance the arc ("Then the numbers stopped adding up") - Visual weight guides the eye through each beat (hero image, one focal number, a pull quote). - Continuity within a chapter, variation between chapters. -> Structure serves the arc, not a grid. Layout / chart geometry lives in [`templates/charts/`](../../templates/charts/) and [`executor-base.md`](../executor-base.md); this mode decides *the emotional beat of each page*. +> Structure serves the arc, not a grid. Compose qualitative topology at runtime through [`executor-structure.md`](../executor-structure.md); Chart/Table references remain in their catalogs, and general composition in [`executor-base.md`](../executor-base.md). This mode decides *the emotional beat of each page*. --- diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/modes/pyramid.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/modes/pyramid.md index 33e50f10..8285e607 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/modes/pyramid.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/modes/pyramid.md @@ -38,7 +38,7 @@ SCQA opening, pyramid body: - Decomposition pages (driver tree / MECE breakdown / 2×2 matrix) carry the analytical load. - Source attribution on every data page. -> Page structure is a tendency, not a coordinate template. Card / tree / chart / KPI geometry lives in [`templates/charts/`](../../templates/charts/) — adapt those skeletons, do not reinvent. This mode decides *what argument each page makes*, not pixel positions. +> Page structure is a tendency, not a coordinate template. Compose qualitative card/tree/KPI/2×2 topology at runtime through [`executor-structure.md`](../executor-structure.md); value-driven charts and cell grids may use their catalogs. This mode decides *what argument each page makes*, not pixel positions. --- diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/native-data-interface.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/native-data-interface.md index 53982ac0..5ffdecbd 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/native-data-interface.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/native-data-interface.md @@ -1,8 +1,8 @@ -> See [`shared-standards-core.md`](./shared-standards-core.md) for the mandatory SVG foundation. +> See [`executor-base.md`](./executor-base.md) for the Shape-first page authority and [`shared-standards-core.md`](./shared-standards-core.md) for the mandatory SVG foundation. # Native Data Interface -Conditional interface for preset pattern fills and PowerPoint-native chart/table replacement metadata. Load when either feature appears in the authored SVG. +Sole conditional interface for preset pattern fills and PowerPoint-native chart/table replacement eligibility, markers, metadata schemas, and export activation. Load only when either feature is selected for the authored SVG. ## 1. Pattern Fill — `` with PPTX preset annotation @@ -40,18 +40,30 @@ this enum. ## 2. PowerPoint-Native Chart / Table Replacement Markers (Opt-in) -Native PowerPoint tables and Excel-backed charts activate at export time only. Generated pages prepare dormant replacement metadata for independently selected native-ready objects while keeping hand-authored SVG geometry pixel-stable across PowerPoint / Keynote / LibreOffice / WPS. +[`executor-base.md`](./executor-base.md) remains the single Shape-first authoring authority: the complete visible SVG fallback is required regardless of native eligibility. This section only adds dormant replacement metadata to independently selected objects and defines how export may activate it. **Hard rule — selected-object authoring**: write the marker and JSON metadata in -the same edit only for a supported chart or pure text-grid table selected as -native-ready under [`executor-chart.md`](./executor-chart.md) §2.2. Default reads -`Native-ready: yes` from §IX (legacy §VII fallback only); Quick makes the -decision in active context before drawing. Default `no`, a Quick decision not to -use the native object model, and incidental microvisuals stay on the SVG -fallback route. Canonical rectangular merged text cells may use the narrow +the same edit only for a supported chart or pure text-grid table independently +selected as native-ready. Default reads the exact semantic object key from §IX +`Native-ready: =yes|no; ...`; Quick assigns the same page-local +`kebab-case` key in active context before drawing. Use that key as the marker +group `id` and metadata `name`. A catalog `family/key`, family name, §VII row, +numeric content, or another ready object on the page never implies eligibility. +Default `=no`, Quick `no`, and unlisted incidental microvisuals stay +on the SVG fallback route. Canonical rectangular merged text cells may use the narrow `row_span` / `col_span` contract below; graphical cells stay unmarked. The -marker group supplies visible SVG fallback children for browser rendering and -JSON metadata for `svg_to_pptx` native export. +marker group supplies visible fallback children for browser rendering and JSON +metadata for `svg_to_pptx` native export. + +A legacy bare `Native-ready: yes|no` maps only to the page's sole eligible +object. Zero or multiple eligible objects make it ambiguous and require +upstream repair. + +**MUST — atomic authoring**: treat one object's visible SVG fallback, parent +`data-pptx-replace-with` marker, and single JSON `` child as one +authoring unit. Write all three while that object's data is in context. Do not +defer the marker or metadata to `verify-charts`, the final quality gate, or +export. **Hard rule — activation is the opt-in, dormant unless exported with `--native-charts-and-tables`**: A marker only declares that a group is eligible for PowerPoint-native Chart/Table replacement. Normal `svg_to_pptx.py` runs keep the fallback SVG children and convert them into independently editable DrawingML shapes. Pass `--native-charts-and-tables` only when the data source and chart/table-specific object model matter more than cross-renderer layout fidelity: it emits the PowerPoint Chart/Table object and skips the fallback children to avoid duplicates. Native styling preserves the core palette, text, axis, grid, and background colors where possible, but it is still a PowerPoint Chart/Table object rather than a pixel-identical SVG drawing. @@ -94,6 +106,7 @@ free of those attributes; use the exact behavior and field index in { "x": 120, "y": 150, "width": 520, "height": 320, + "name": "p03-revenue-chart", "type": "column", "title": "Revenue by Segment", "categories": ["Q1", "Q2", "Q3"], @@ -107,6 +120,31 @@ free of those attributes; use the exact behavior and field index in ``` +**Hard rule — transcribe the authored object**: metadata is the native object's +source of truth and must describe the same data and visible chart/table chrome +as the fallback drawn in that marker group. + +| Object | Required projection from the visible fallback | +|---|---| +| Chart | Every category/point and series value, the actual x/y/size data where applicable, visible point colors and labels, line/area treatment needed by the schema, visible title/axis/legend chrome, companion text, bounds, and fallback typography/style values that native export cannot infer unambiguously | +| Table | Every resolved row/column cell, header/summary line, rectangular span, required cell style, alignment, bounds, and visible typography | + +Do not simplify the SVG artwork to match the native object model. When the +closed payload cannot represent an object without losing required data or cell +topology, Default returns the native-ready decision upstream and Quick revises +that per-object decision before drawing; only the resolved non-native object +stays unmarked on its complete SVG fallback. Never silently ignore an explicit +`=yes` declaration. + +**Per-page verification**: enumerate every `=yes` on the current +page and confirm a one-to-one key match. Each key identifies one parent marker +and exactly one JSON metadata child; `=no` and unlisted incidental +objects have no marker. Finding one marker somewhere on a page is insufficient. + +```bash +rg -n 'data-pptx-replace-with="(chart|table)"|' /svg_output/.svg +``` + **Table schema**: Native tables are rectangular DrawingML grids. Use `columns` for the optional header row and `rows` for body rows; shorter rows are padded with blank cells unless `strict_grid: true` is set. Tables may contain at most diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/strategist-template.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/strategist-template.md index 5cc9bbe4..63f55291 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/strategist-template.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/strategist-template.md @@ -10,7 +10,7 @@ Conditional extension for applying an installed Brand/Style/Layout/Deck workspac ## 1. AI-Authored Template Application Plan -**Template vs preset**: A style mention and a Style workspace are different inputs. Bare names and style words remain interpretive input and never resolve to a local path; only a selected and installed workspace activates the rules below. Its fused `/templates/design_spec.md` is the template-design source. Treat `kind: style` or a fused provenance entry for `style` as an active Direction / method segment. Whether a source root was labelled `library` or `explicit` is installation provenance only and never affects Stage-2 precedence. +**Template vs preset**: A style mention and a Style workspace are different inputs. Bare names and style words remain interpretive input and never resolve to a local path; only a selected and installed workspace activates the rules below. Every installed `/templates/design_spec...md` is a template-design source; read all of them. The presence of a `design_spec.style.*.md` file is what marks an active Direction / method segment. Whether a source root was labelled `library` or `explicit` is installation provenance only and never affects Stage-2 precedence. **Legacy template boundary**: A Layout/Deck template containing `native_structure.json`, `source_template.pptx`, missing root Master identity, direct atomic placeholders, or old `baseline` / `preserve` / distillation metadata is not a Generate Step 3 input. Create a current workspace through [`create-template`](../workflows/create-template.md), preferably from the original PPTX when native topology matters. Brand and Style are intentionally roster-free; never reject either for omitting SVG or Master identity. Do not mutate the input in place. @@ -21,8 +21,8 @@ Conditional extension for applying an installed Brand/Style/Layout/Deck workspac Immediately before authoring the Stage-2 solution, load each relevant template resource once per path + SHA and inspect: -- every installed `design_spec.md`; for Layout/Deck only, also inspect the actual Page Roster and relevant SVG prototypes; -- the resolved Identity, Structure, Reusable Application Context, and Direction / method segment owners from the post-Stage-1 fusion receipt; +- every installed `design_spec...md`; for Layout/Deck only, also inspect the actual Page Roster and relevant SVG prototypes; +- the Identity, Structure, Reusable Application Context, and Direction / method segment owners, resolved here from the installed set under [`apply-template-workspace`](../workflows/stages/apply-template-workspace.md) §5; - the confirmed current communication contract, source obligations, planned page count, and content shape of every planned page; - the user's natural-language instructions, including any page names/numbers or elements they explicitly require. @@ -74,7 +74,7 @@ When the communication contract conflicts with the workspace, choose and state t ## 3. Structured Lock Planning -For Style-only or Style + Brand, write `pptx_structure.mode: flat` plus `template_reuse_scope: style`; omit `template_adherence` and every structured mapping section. When Style is fused with Layout or Deck, it changes only Direction / method and does not change the non-Style capability label or force flat/structured routing. Derive reuse scope from the selected Layout/Deck application plan; a literal `mirror` plan is compatible only when the Style segment requires no visual or topology change. +For Style-only or Style + Brand, write `pptx_structure.mode: flat` plus `template_reuse_scope: style`; omit `template_adherence` and every structured mapping section. When a Style is installed alongside Layout or Deck, it changes only Direction / method and does not force flat/structured routing. Derive reuse scope from the selected Layout/Deck application plan; a literal `mirror` plan is compatible only when the Style segment requires no visual or topology change. For `mirror` / `layout`, write `pptx_structure.mode: structured` plus `template_adherence: strict|adaptive`; mirror always writes `strict`. Do not write legacy `baseline`, `template`, `preserve`, `layout_strategy`, or Layout-kind rows. @@ -85,4 +85,12 @@ For `mirror` / `layout`, write `pptx_structure.mode: structured` plus `template_ - **Adaptive refinement**: Initial definitions are complete. If construction shows that reusable framing or slot topology/bounds must change, return to Strategist to add a definition sourced from that page and update its assignment before execution resumes. Executor never mutates or extends the contract; export only compiles declared structure and never discovers or clusters Layouts. - **Input prototypes**: Add one `page_layouts` row per page. Strict preserves that SVG's contract; adaptive keeps its Master and may declare a new output Layout; mirror also preserves literal visuals and text-node topology. -**Chart compatibility**: Use `page_layouts` together with `page_charts` only when the selected prototype shell is compatible. For a chart page without an exact roster match, adaptive mode starts from the closest neutral prototype and declares an output Layout; strict mode selects an existing compatible Layout or revises the outline. Never omit `page_layouts` on a structured route. +**Visualization compatibility**: Use `page_layouts` with optional Chart/Table +`page_visualizations` only when the prototype shell can carry the actual §IX +information model. The reference changes neither Layout identity, slot +topology, nor final visualization type. Qualitative relationships stay in §IX +and are composed Slide-locally; they never supply Master/Layout/placeholder +ownership. Without an exact prototype match, adaptive mode starts from the +closest neutral prototype and declares an output Layout; strict mode selects an +existing compatible Layout or revises the outline. Never omit `page_layouts` +on a structured route or write legacy `page_charts` in a new lock. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/strategist.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/strategist.md index a95bb3cf..e0beb879 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/strategist.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/strategist.md @@ -56,7 +56,7 @@ Do not force communication intent into one catalog label; Stage 1 records compos | Reference | Preserve the selected direction or role; adapt its realization to context. | | Permission / default | An allowed candidate/source boundary or preference; Strategist may leave it unused, with no quota. | -**Authority chain — materials → Strategist preparation → realization.** User inputs set materials/acquisition bounds. Strategist owns sufficiency, gap-filling, and selection: roster/content, resources, chart/layout keys, fonts, palette anchors, the icon library/stroke plus curated project pool, and crop bans. Fact research may precede confirmation; AI/web/slice follows final confirmation plus completed §VIII/lock; icons are synced/validated during authoring without page assignment. Before Executor, each resource has a path and terminal/`Needs-Manual` state. Executor owns geometry, composition, hierarchy, spacing, treatment, and per-page choice among prepared icons; it never searches, generates, syncs, invents, or substitutes resources. Missing material/reselection returns upstream. Specificity defines freedom; References flex realization, never selection. +**Authority chain — materials → Strategist preparation → realization.** User inputs set materials/acquisition bounds. Strategist owns sufficiency, gap-filling, and selection: roster/content, resources, page-local visualization/Layout references, fonts, palette anchors, the icon library/stroke plus curated project pool, and crop bans. Fact research may precede confirmation; AI/web/slice follows final confirmation plus completed §VIII/lock; icons are synced/validated during authoring without page assignment. Before Executor, each resource has a path and terminal/`Needs-Manual` state. Executor owns geometry, composition, hierarchy, spacing, treatment, and per-page choice among prepared icons; it never searches, generates, syncs, invents, or substitutes resources. Missing material/reselection returns upstream. Specificity defines freedom; References flex realization, never selection. Explicit *must*, *only*, *exactly*, *verbatim*, *do not*, or `no-crop` wording may strengthen only the named property into the appropriate Literal or Semantic requirement. Accepting an AI recommendation keeps the field's default type; it does not promote a Reference or Permission into a Literal requirement. @@ -309,17 +309,20 @@ the effective outcome. Suggestions remain non-binding and never activate the custom stage; only an explicit motion requirement or an enabled outcome may require visible lifecycle-state preparation. -Review planned pages through two lenses: +Classify by information model, never source PowerPoint object type: -| Lens | Content shapes | +| Model | Planning action | |---|---| -| Numeric / data | comparisons, trends, proportions, KPIs, financials, rankings, distributions, funnels | -| Structural information | rosters, agendas, principles, phases, journeys, capability maps, OKR cascades, roadmaps, strategic frameworks | +| Qualitative `order`, `link`, `parent`, `membership`, `contrast`, or `overlap` | Preserve units, relationship, and reading path as free §IX prose; no catalog key | +| Values/dates/durations determine geometry | Chart; recall is optional | +| Row header × column header addresses each fact | Table; recall is optional | -**Reference — not a constraint**: use catalog recall when it would help. Its CLI accepts 3–8 distinct English content-shape tags; a page already planned as a custom visualization or table needs no recall. Run: +**Mandatory — relationship handoff**: keep every qualitative relationship in §IX free prose; never serialize grammar atoms, coordinates, or named models. Executor makes the per-page Structure decision at runtime. + +**Reference — not a constraint**: recall Chart/Table with 3–8 English tags when useful; add `--family chart|table` only when certain. Skip custom objects and qualitative composition. ```bash -python3 skills/ppt-master/scripts/chart_recall.py recall \ +python3 skills/ppt-master/scripts/visualization_recall.py recall \ --page P03 \ --tag "time series" \ --tag "three metrics" \ @@ -327,28 +330,29 @@ python3 skills/ppt-master/scripts/chart_recall.py recall \ --limit 6 ``` -The command returns a bounded shortlist plus `no-template-match`. Read it unfiltered; `tail` / `head` / `grep` can hide ranked candidates. `confidence` is lexical only. At `high` / `medium`, keep no-match after candidate review. At `low` / `none`, use a fitting candidate directly; otherwise rerun once with `--semantic-fallback` before no-match. Do not open a second index. +The command returns a bounded shortlist plus `no-template-match`. Read it unfiltered; `tail` / `head` / `grep` can hide ranked candidates. `confidence` is lexical only. At `high` / `medium`, keep no-match after candidate review. At `low` / `none`, use a fitting candidate directly; otherwise rerun once with `--semantic-fallback` before no-match. Do not open any family index separately. **Selection**: -1. Choose the most relevant candidate as a reference for that page. It does not lock the final visualization type or geometry and never applies to another page without its own row. -2. Retain `no-template-match` when no reference fits. Choose a custom visualization, table, diagram/layout, or permitted image from the content semantics, communication job, and editability need. Record the choice only in §IX; never serialize `no-template-match` into §VII. -3. Validate all selected keys before writing the lock: +1. Choose at most one flexible Chart/Table `family/key` per page; keep children and qualitative relationships in §IX. +2. If none fits, keep `no-template-match` and plan the fallback only in §IX; never serialize no-match. +3. Validate every selected canonical reference before the lock: ```bash -python3 skills/ppt-master/scripts/chart_recall.py validate [ ...] +python3 skills/ppt-master/scripts/visualization_recall.py validate \ + / [/ ...] ``` -A failed validation must be corrected with a recalled key. `no-template-match` is not a key and never appears in `page_charts`. +Correct failed selections by recall; `no-template-match` never enters `page_visualizations`. -**Section VII selection list**: when a reference is selected, write `Page | Template | Usage`; Usage is one short page-local purpose, not geometry. Omit §VII when none is selected, and never add path, summary, runners-up, `no-template-match`, or `n/a`. §IX remains authoritative. +**Section VII selection list**: write `Page | Family | Template | Usage` for each `chart|table` reference; Usage is semantic purpose. Omit empty/no-match detail. Qualitative composition stays in §IX; only Layout/Deck owns reusable PowerPoint structure. -**Native-ready boundary**: For every independent data chart or pure text-grid table, add `Native-ready: yes|no` to its §IX page block. Choose `yes` only when the confirmed requirement or artifact afterlife benefits from an editable native data object; otherwise keep the designed SVG with `no`. Conceptual rows and incidental sparklines, KPI trends, or insets omit the field; Executor never promotes them. +**Native-ready boundary**: Give every independent data chart and pure text-grid table in §IX `Visualization` a unique page-local semantic `kebab-case` key, then write one `Native-ready` map: `=yes|no; ...`. Use `yes` only when an editable native object benefits the confirmed requirement/afterlife. Qualitative shape compositions and incidental microvisuals stay unlisted. ```markdown -| Page | Template | Usage | -| --- | --- | --- | -| P03 | line_chart | Compare the source metrics over time | +| Page | Family | Template | Usage | +| --- | --- | --- | --- | +| P03 | chart | line_chart | Compare the source metrics over time | ``` **Native-geometry candidate detail**: Add `Native shape suggestion` to the @@ -469,7 +473,7 @@ final Stage 2 `false`, explicit objects-off, or explicit all-motion-off; only th includes transitions. 1. With Generate Step 4's retained complete final-confirmation state, read `${SKILL_DIR}/templates/design_spec_reference.md`. -2. Compose the whole Design Spec in active context before touching the target path. Create `design_spec.md` once from the schema marker through §X; do not copy a scaffold into the project or patch placeholder fields. Record production mechanics in §I, including one effective outcome plus provenance for Speaker Notes, Custom Animations, and Narration Audio. Resolve them from latest explicit user instruction → matching final Stage 2 proactive value → workflow default `enabled` / `disabled` / `disabled`; Narration Audio enabled requires Speaker Notes enabled without rewriting the raw proactive evidence, and a dependency-driven notes outcome records that provenance. In §IX, create the complete ordered roster; each entry carries layout, title, core message, **Audience move**, complete preferred wording, applicable capability recommendations, visualization/image references, sourced `Fact IDs`, and `Data class: scenario` for invented demo data. After Gate 1 plus conditional refine approval, roster ids/count/order and semantic content are authoritative; non-literal wording, block texture, layout, cover/closing composition, capability recommendations, and image/chart patterns remain References unless promoted. +2. Compose the whole Design Spec in active context before touching the target path. Create `design_spec.md` once from the schema marker through §X; do not copy a scaffold into the project or patch placeholder fields. Record production mechanics in §I, including one effective outcome plus provenance for Speaker Notes, Custom Animations, and Narration Audio. Resolve them from latest explicit user instruction → matching final Stage 2 proactive value → workflow default `enabled` / `disabled` / `disabled`; Narration Audio enabled requires Speaker Notes enabled without rewriting the raw proactive evidence, and a dependency-driven notes outcome records that provenance. In §IX, create the complete ordered roster; each entry carries layout, title, core message, **Audience move**, complete preferred wording, applicable capability recommendations, visualization/image references, sourced `Fact IDs`, and `Data class: scenario` for invented demo data. After Gate 1 plus conditional refine approval, roster ids/count/order and semantic content are authoritative; non-literal wording, block texture, layout, cover/closing composition, capability recommendations, and image/visualization patterns remain References unless promoted. 3. Compare `design_spec.md` against the final confirmation field by field. Repair every omission or deviation before entering an enabled refine-spec review or authoring `spec_lock.md`. 4. If enabled, run [`refine-spec`](../workflows/stages/refine-spec.md) after Gate 1; edit only that Design Spec and create no lock before explicit approval. 5. Read `${SKILL_DIR}/templates/spec_lock_reference.md`; create the lock once or resynchronize stale derived state from the approved Design Spec and context. Retain identity/refinements and stable roles/routing; omit unnamed page-local values, do not reopen evidence, and make no new recommendation. @@ -492,7 +496,7 @@ includes transitions. ⛔ **GATE 2 — lock context fidelity.** After Gate 1 closes, author machine-relevant anchors/routing into `spec_lock.md`. The lock may normalize syntax and add justified recurring roles, but must not change identity, discard a refinement, introduce a direction, or become a field copy/allowlist. On contradiction, return to Gate 1 using retained confirmation by default or the approved revised Design Spec after refinement; fresh recovery reads persisted final evidence once only when active state is absent. -**Execution lock content**: `spec_lock.md` compactly carries communication, stable color/type anchors, icons, images, page rhythm, chart choices, and route-specific PowerPoint structure. Name every recurring typography role; a planned short non-structural Hero/Display size may stay omitted only while the same value appears at most twice, and its third occurrence requires a named role. Never re-derive a confirmed anchor. New locks keep `font_family` as the body/default compatibility stack and also write explicit `title_family` + `body_family`; every additional recurring Design Spec role projects to `_family`. Collapsing distinct Design Spec stacks into `font_family`, or dropping an extra role, fails Gate 2. Keep core fonts/palette roles stable; page authoring varies treatment and may add sparse local garnish. Project every placed §VIII image's source, layout suggestion, and crop policy; omit unplaced sheets and planning provenance. Free-design, brand-only, and `template_reuse_scope: style` use `pptx_structure.mode: flat`; the template module owns structured mappings. Executor context policy lives in [executor-base.md](executor-base.md) §2.1. Repair from Gate 2's active decision authority, then re-author affected lock rows. +**Execution lock content**: `spec_lock.md` compactly carries communication, stable color/type anchors, icons, images, page rhythm, Chart/Table references, and route-specific PowerPoint structure; qualitative relationships stay only in §IX. Name every recurring typography role; a planned short non-structural Hero/Display size may stay omitted only while the same value appears at most twice, and its third occurrence requires a named role. Never re-derive a confirmed anchor. New locks keep `font_family` as the body/default compatibility stack and also write explicit `title_family` + `body_family`; every additional recurring Design Spec role projects to `_family`. Collapsing distinct Design Spec stacks into `font_family`, or dropping an extra role, fails Gate 2. Keep core fonts/palette roles stable; page authoring varies treatment and may add sparse local garnish. Project every placed §VIII image's source, layout suggestion, and crop policy; omit unplaced sheets and planning provenance. Free-design, brand-only, and `template_reuse_scope: style` use `pptx_structure.mode: flat`; the template module owns structured mappings. Executor context policy lives in [executor-base.md](executor-base.md) §2.1. Repair from Gate 2's active decision authority, then re-author affected lock rows. **Contextual extension**: derived paint or sparse local font/color garnish may stay in one SVG while non-structural and non-recurring. New base/semantic colors, structural/recurring fonts, resources, or recurring cross-page identity patterns require upstream repair; a page-local §VIII preferred image pattern follows [`executor-image.md`](./executor-image.md) and may change during realization. Executor never reverse-projects a local choice as planning fact. Promote recurring garnish upstream before reuse, read back and validate the affected planning fragments, and never add values to silence a comparison. @@ -507,7 +511,7 @@ includes transitions. - **pptx_structure is mandatory**: Free-design, brand-only, and `template_reuse_scope: style` routes write `mode: flat`; a style-reference route may also record `template_reuse_scope: style` but omits every structure mapping and `template_adherence`. `template_reuse_scope: mirror|layout` writes `mode: structured` plus `template_adherence: strict|adaptive`. Do not write legacy `baseline`, `template`, `preserve`, `layout_strategy`, or Layout-kind rows into a new project. - **Flat-route boundary**: With `mode: flat`, omit `pptx_masters`, `pptx_layouts`, `page_pptx_layouts`, and `page_layouts`. Do not plan native Master/Layout families or reusable placeholder slots. Every generated SVG object remains Slide-local: omit root Master/Layout identity, `data-pptx-layer`, and `data-pptx-placeholder*` metadata. Export materializes one clean project-owned Master plus one Blank Layout from the current color/typography lock, removes stock content placeholders/Layout inventory, and retains only the standard date/footer/slide-number capability hooks. - **Structured template route**: When [`strategist-template.md`](./strategist-template.md) is active and reuse is `mirror|layout`, follow its complete Master/Layout/slot/prototype mapping rules. - - **page_charts**: project each §VII row's `Page` and `Template` as `P: `; Usage stays in the Design Spec. This is a page-local reference, not a type/geometry lock. Omit no-match pages and the empty section. + - **page_visualizations**: project at most one §VII `P: /` per page. Usage/children/qualitative relationships stay in the Design Spec; omit empty/no-match. It locks no geometry/native output. New locks never write legacy `page_charts`. --- 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 502654f6..bb64acc8 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 @@ -309,8 +309,8 @@ rules; final font families, weights, colors, and absolute sizes do not. Do not prescribe communication objectives, audience outcomes, required narrative order, fixed boilerplate, or example-content retention. The frontmatter `summary` carries concise structural selection context; the -deck-only Template Overview remains the application segment used during -fusion. +deck-only Template Overview remains the application segment read during +template application. Sections to **omit** from template `design_spec.md` (sourced elsewhere — listing them here is noise): diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-review.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-review.md index e5ed21cc..26918393 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-review.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/visual-review.md @@ -25,7 +25,7 @@ Each review subagent processes a **batch** of pages (see §6.1 for batch sizing) 2. **Path to this rubric file** 3. **`/design_spec.md`** (read-only) — §IX outline is the source of truth for "what should this page deliver" 4. **`/spec_lock.md`** (read-only) — brand-locked values -5. **Style Review Focus excerpt** (conditional, read-only) — supplied by the orchestrator only when `/templates/design_spec.md` contains an active Style segment; it retains the source path and exact §VII wording +5. **Style Review Focus excerpt** (conditional, read-only) — supplied by the orchestrator only when an installed `/templates/design_spec.style..md` exists; it retains the source path and exact §VII wording 6. **`/.review/`** (writable) — where backups and findings JSON go The subagent reads inputs 2–5 **once** at the start of its turn (input 5 may be absent), then iterates over the page batch sequentially (one page at a time): apply the rubric → apply any Style supplement → write `/.review/.json` → move on. This is the core token-saving move — fixed context is read N/K times instead of N times. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/README.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/README.md index 1f32e13d..89946e1e 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/README.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/README.md @@ -55,7 +55,7 @@ python3 scripts/update_repo.py | SVG pipeline | `preset_shape_svg.py`, `shape_boolean_svg.py`, `svg_authoring_view.py`, `compact_svg_coordinates.py`, `mirror_template_materialize.py`, `finalize_svg.py`, `svg_to_pptx.py`, `template_preview_pptx.py`, `total_md_split.py`, `svg_quality_checker.py`, `extract_svg_assets.py`, `extract_svg_pictures.py`, `animation_config.py`, `notes_to_audio.py`, `narration_sync.py` | [docs/svg-pipeline.md](./docs/svg-pipeline.md); [native shape authoring](../references/native-shape-authoring.md) | | PPTX transitions | `pptx_transitions.py` | [docs/pptx-transitions.md](./docs/pptx-transitions.md) | | PPTX animations | `pptx_animations.py`, `animation_config.py` | [docs/pptx-animations.md](./docs/pptx-animations.md) | -| Spec maintenance | `update_spec.py`, `chart_recall.py` | [docs/update_spec.md](./docs/update_spec.md); [docs/chart-recall.md](./docs/chart-recall.md) | +| Spec maintenance | `update_spec.py`, `visualization_recall.py`; legacy `chart_recall.py` | [docs/update_spec.md](./docs/update_spec.md); [docs/visualization-recall.md](./docs/visualization-recall.md) | | Image tools | `image_gen.py`, `latex_render.py`, `analyze_images.py`, `gemini_watermark_remover.py` | [docs/image.md](./docs/image.md) | | Maintenance smokes | Inline temporary-project commands | [advanced image and motion](./docs/advanced-image-motion-smoke.md); [mask and gradient](./docs/mask-gradient-smoke.md); [multilingual text](./docs/multilingual-text-smoke.md) | | Repo maintenance | `update_repo.py` | README install/update section | @@ -91,17 +91,17 @@ python3 scripts/project_manager.py page-context-report routing checks, or context measurement; normal generation retains the complete Design Spec and lock once per valid execution context. Each invocation includes the global lock projection as a continuity anchor set, not a color/font allowlist; large Design Specs, -prototype, and `templates/charts/` references are emitted only as scoped +prototype, and selected family visualization references are emitted only as scoped path/SHA fingerprints and are read once per execution context. `--bundle` is a deprecated compatibility no-op. `--record-usage` writes one derived snapshot under `analysis/page-context/`; exact `o200k_base` token counts are optional and degrade to `tokens: null` when `tiktoken` is absent. Telemetry may be partial. -Chart candidate recall: +Visualization candidate recall: ```bash -python3 scripts/chart_recall.py recall --page P03 --tag "time series" --tag "three metrics" --tag "direction over time" -python3 scripts/chart_recall.py validate line_chart +python3 scripts/visualization_recall.py recall --page P03 --tag "time series" --tag "three metrics" --tag "direction over time" +python3 scripts/visualization_recall.py validate chart/line_chart ``` Template source import: diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/chart_recall.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/chart_recall.py index b050ccce..74b7fd69 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/chart_recall.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/chart_recall.py @@ -1,346 +1,27 @@ #!/usr/bin/env python3 """ -PPT Master - Chart Candidate Recall +PPT Master - Legacy Chart Recall Compatibility -Recalls a deterministic chart-template shortlist from page-shape semantic tags, -or validates selected chart keys against the live chart catalog. +Preserve the historical broad chart-recall CLI while delegating to the unified +visualization recall implementation. Published Structure bare keys validate as +intent-only compatibility values; they do not recall or load SVG assets. The +legacy ``valid`` list remains intact while ``resolved`` exposes each kind. Usage: python3 scripts/chart_recall.py recall --page P03 --tag "time series" --tag "three metrics" --tag "trend" python3 scripts/chart_recall.py validate line_chart column_chart Examples: - python3 scripts/chart_recall.py recall --page P07 --tag "named quadrants" \ - --tag "bullet lists" --tag "SWOT" --limit 6 - python3 scripts/chart_recall.py validate quadrant_text_bullets + python3 scripts/chart_recall.py validate process_flow Dependencies: - None (only uses standard library) - -See scripts/docs/chart-recall.md for the Strategist workflow and output contract. + None (only uses the standard library) """ from __future__ import annotations -import argparse -import json -import re -import sys -import unicodedata -from pathlib import Path -from typing import Optional - -from console_encoding import configure_utf8_stdio - -configure_utf8_stdio() - -_SCRIPTS_DIR = Path(__file__).resolve().parent -_INDEX_PATH = _SCRIPTS_DIR.parent / "templates" / "charts" / "charts_index.json" -_TOKEN_RE = re.compile(r"[a-z0-9]+") -_PAGE_RE = re.compile(r"^P\d{2,}$") -_KEY_RE = re.compile(r"^[a-z0-9]+(?:_[a-z0-9]+)*$") -_SKIP_RE = re.compile(r"\bskip\s+(?:if|for)\b", re.IGNORECASE) -_STOP_WORDS = { - "a", - "an", - "and", - "as", - "at", - "by", - "for", - "from", - "if", - "in", - "into", - "of", - "on", - "or", - "per", - "the", - "to", - "use", - "with", -} - - -def _normalize(text: str) -> str: - normalized = unicodedata.normalize("NFKC", text).casefold().replace("_", " ") - return " ".join(_TOKEN_RE.findall(normalized)) - - -def _stem(token: str) -> str: - if len(token) > 5 and token.endswith("ies"): - return token[:-3] + "y" - if len(token) > 5 and token.endswith("ing"): - return token[:-3] - if len(token) > 4 and token.endswith("ed"): - return token[:-2] - if len(token) > 4 and token.endswith("es"): - return token[:-2] - if len(token) > 3 and token.endswith("s"): - return token[:-1] - return token - - -def _tokens(text: str) -> set[str]: - return { - _stem(token) - for token in _TOKEN_RE.findall(_normalize(text)) - if token not in _STOP_WORDS - } - - -def load_catalog() -> dict[str, str]: - """Load and validate the live chart catalog.""" - try: - payload = json.loads(_INDEX_PATH.read_text(encoding="utf-8")) - except (OSError, json.JSONDecodeError) as exc: - raise RuntimeError(f"Cannot read chart catalog {_INDEX_PATH}: {exc}") from exc - - if not isinstance(payload, dict): - raise RuntimeError(f"Chart catalog {_INDEX_PATH} root must be an object") - raw_charts = payload.get("charts") - if not isinstance(raw_charts, dict) or not raw_charts: - raise RuntimeError(f"Chart catalog {_INDEX_PATH} has no non-empty 'charts' object") - - charts: dict[str, str] = {} - for key, item in raw_charts.items(): - if ( - not isinstance(key, str) - or _KEY_RE.fullmatch(key) is None - or not isinstance(item, dict) - ): - raise RuntimeError(f"Chart catalog entry {key!r} is malformed") - summary = item.get("summary") - if not isinstance(summary, str) or not summary.strip(): - raise RuntimeError(f"Chart catalog entry {key!r} has no non-empty summary") - charts[key] = summary.strip() - return charts - - -def _score_candidate(key: str, summary: str, tags: list[str]) -> tuple[int, list[str]]: - skip_match = _SKIP_RE.search(summary) - if skip_match is None: - pick_clause, skip_clause = summary, "" - else: - pick_clause = summary[:skip_match.start()] - skip_clause = summary[skip_match.start():] - key_text = _normalize(key) - pick_text = _normalize(pick_clause) - skip_text = _normalize(skip_clause) - key_tokens = _tokens(key) - pick_tokens = _tokens(pick_clause) - skip_tokens = _tokens(skip_clause) - score = 0 - matched_tags: list[str] = [] - - for tag in tags: - tag_text = _normalize(tag) - tag_tokens = _tokens(tag) - positive_score = 0 - negative_score = 0 - if tag_text and tag_text in key_text: - positive_score += 20 - elif tag_text and tag_text in pick_text: - positive_score += 14 - if tag_text and tag_text in skip_text: - negative_score += 12 - - for token in tag_tokens: - if token in key_tokens: - positive_score += 9 - elif token in pick_tokens: - positive_score += 5 - if token in skip_tokens: - negative_score += 6 - - if positive_score: - matched_tags.append(tag) - score += positive_score - negative_score - - return score, matched_tags - - -def recall_candidates( - page: str, - tags: list[str], - limit: int, - *, - force_semantic_fallback: bool = False, -) -> dict[str, object]: - """Recall a deterministic shortlist for one page.""" - charts = load_catalog() - scored: list[tuple[int, str, str, list[str]]] = [] - for key, summary in charts.items(): - score, matched_tags = _score_candidate(key, summary, tags) - if score > 0 and matched_tags: - scored.append((score, key, summary, matched_tags)) - scored.sort(key=lambda item: (-item[0], item[1])) - - candidates = [] - for score, key, summary, matched_tags in scored[:limit]: - candidates.append( - { - "key": key, - "path": f"templates/charts/{key}.svg", - "summary": summary, - "score": score, - "matched_tags": matched_tags, - } - ) - - top_score = candidates[0]["score"] if candidates else 0 - if top_score >= 35: - confidence = "high" - elif top_score >= 15: - confidence = "medium" - elif top_score > 0: - confidence = "low" - else: - confidence = "none" - - fallback_required_before_no_match = ( - confidence in {"low", "none"} and not force_semantic_fallback - ) - if fallback_required_before_no_match: - no_match_instruction = ( - f"Lexical confidence is {confidence}. Select a bounded candidate when one " - "fits; otherwise rerun the same recall with --semantic-fallback before " - "keeping no-template-match. Keep the final negative result out of Design " - "Spec Section VII and describe the chosen fallback in the page's Section " - "IX block." - ) - else: - no_match_instruction = ( - "Use when none of the reviewed candidates fits the page structure. Keep " - "this result out of Design Spec Section VII and describe the chosen fallback " - "in the page's Section IX block." - ) - - result: dict[str, object] = { - "page": page, - "semantic_tags": tags, - "confidence": confidence, - "candidates": candidates, - "no_template_match": { - "allowed": not fallback_required_before_no_match, - "key": "no-template-match", - "instruction": no_match_instruction, - }, - } - if force_semantic_fallback: - result["semantic_fallback"] = { - "reason": "requested-after-bounded-review", - "instruction": ( - "Semantically compare the page tags with every returned selection rule. " - "Choose one exact catalog key or keep no-template-match; lexical overlap " - "is not required in this review." - ), - "path_pattern": "templates/charts/{key}.svg", - "catalog": charts, - } - return result - - -def _dedupe(values: list[str]) -> list[str]: - result: list[str] = [] - seen: set[str] = set() - for value in values: - stripped = value.strip() - normalized = _normalize(stripped) - if not stripped or not normalized or normalized in seen: - continue - seen.add(normalized) - result.append(stripped) - return result - - -def _run_recall(args: argparse.Namespace) -> int: - page = args.page.upper() - if not _PAGE_RE.fullmatch(page): - print("Error: --page must match P, for example P03.", file=sys.stderr) - return 2 - - tags = _dedupe(args.tag) - if not 3 <= len(tags) <= 8: - print("Error: recall requires 3-8 distinct non-empty --tag values.", file=sys.stderr) - return 2 - - result = recall_candidates( - page, - tags, - args.limit, - force_semantic_fallback=args.semantic_fallback, - ) - print(json.dumps(result, ensure_ascii=False, indent=2, sort_keys=True)) - return 0 - - -def _run_validate(args: argparse.Namespace) -> int: - charts = load_catalog() - selected = _dedupe(args.keys) - invalid = sorted(key for key in selected if key not in charts) - result = { - "invalid": invalid, - "valid": sorted(key for key in selected if key in charts), - } - print(json.dumps(result, ensure_ascii=False, indent=2, sort_keys=True)) - if invalid: - print( - "Error: replace each invalid key with a key returned by the recall command, " - "or keep no-template-match out of Section VII and page_charts while " - "recording the custom fallback in the page's Section IX block.", - file=sys.stderr, - ) - return 1 - return 0 - - -def build_parser() -> argparse.ArgumentParser: - parser = argparse.ArgumentParser( - description="Recall chart-template candidates or validate selected keys.", - formatter_class=argparse.RawDescriptionHelpFormatter, - ) - subparsers = parser.add_subparsers(dest="command", required=True) - - recall = subparsers.add_parser("recall", help="Recall candidates for one planned page.") - recall.add_argument("--page", required=True, help="Planned page key, for example P03.") - recall.add_argument( - "--tag", - action="append", - required=True, - help="English semantic content-shape tag; repeat 3-8 times.", - ) - recall.add_argument( - "--limit", - type=int, - choices=range(3, 9), - default=6, - metavar="3..8", - help="Candidate count (default: 6).", - ) - recall.add_argument( - "--semantic-fallback", - action="store_true", - help="Include the full catalog when bounded recall may have missed a semantic match.", - ) - recall.set_defaults(handler=_run_recall) - - validate = subparsers.add_parser("validate", help="Validate selected catalog keys.") - validate.add_argument("keys", nargs="+", help="One or more selected chart keys.") - validate.set_defaults(handler=_run_validate) - return parser - - -def main(argv: Optional[list[str]] = None) -> int: - parser = build_parser() - args = parser.parse_args(argv) - try: - return args.handler(args) - except RuntimeError as exc: - print(f"Error: {exc}", file=sys.stderr) - return 1 +from visualization_recall import main if __name__ == "__main__": - raise SystemExit(main()) + raise SystemExit(main(legacy_output=True)) 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 3da87ea6..1824473d 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 @@ -665,15 +665,30 @@ def _read_template_handoff(project_path: Path, handoff_file: Path) -> dict: f'{TEMPLATE_HANDOFF_NAME} selection_sha256 does not match selection' ) if data['mode'] == 'templates': - installed_spec = project_path / 'templates' / 'design_spec.md' - if not installed_spec.is_file(): + if not _installed_template_specs(project_path): raise ValueError( - f'{TEMPLATE_HANDOFF_NAME} requires installed template spec: ' - f'{installed_spec}' + f'{TEMPLATE_HANDOFF_NAME} requires at least one installed ' + f'template spec: {project_path / "templates"}/' + 'design_spec...md' ) return data +def _installed_template_specs(project_path: Path) -> list[Path]: + """Return every template spec installed into the project by the apply stage. + + The apply stage installs one file per selected workspace, named + ``design_spec...md``. A bare ``design_spec.md`` under + ``templates/`` means the project is itself a Create Template workspace and + is deliberately excluded here. + """ + return sorted( + path + for path in (project_path / 'templates').glob('design_spec.*.md') + if path.is_file() + ) + + def _complete_template_selection(project_path: Path) -> int: """Write the agent-owned handoff after Stage 1 and template application.""" confirm_dir = project_path / CONFIRM_DIR_NAME @@ -695,11 +710,11 @@ def _complete_template_selection(project_path: Path) -> int: ) return 1 if selection['mode'] == 'templates': - installed_spec = project_path / 'templates' / 'design_spec.md' - if not installed_spec.is_file(): + if not _installed_template_specs(project_path): logger.error( - 'cannot complete template selection before template apply writes %s', - installed_spec, + 'cannot complete template selection before template apply ' + 'writes %s/design_spec...md', + project_path / 'templates', ) return 1 @@ -2786,7 +2801,8 @@ def build_parser() -> argparse.ArgumentParser: parser.add_argument( '--complete-template-selection', action='store_true', help='Agent-only: after Stage 1, bind its template selection to a ready ' - 'handoff. Template mode requires /templates/design_spec.md.', + 'handoff. Template mode requires at least one ' + '/templates/design_spec...md.', ) parser.add_argument( '--reset-template-selection', action='store_true', diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/docs/chart-recall.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/docs/chart-recall.md index 9d78b8a8..6b007ff0 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/docs/chart-recall.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/docs/chart-recall.md @@ -1,51 +1,26 @@ -# Chart Candidate Recall +# Legacy Chart Recall Compatibility -`chart_recall.py` gives Default Strategist or the Quick Generate main agent a bounded deterministic shortlist. It exposes the full live catalog only when the caller explicitly requests semantic review. It reads `templates/charts/charts_index.json` on every invocation, so the catalog remains the only template registry. - -## Recall candidates - -Describe one page's information shape with 3-8 concise English semantic tags. Translate source-language or industry terms into structural meaning before invoking the script. +`chart_recall.py` preserves the historical broad visualization-recall CLI for +existing projects and external callers. It delegates to +`visualization_recall.py`, reads the same live Chart/Table registries, and emits +the legacy bare-key JSON shape. ```bash python3 skills/ppt-master/scripts/chart_recall.py recall \ --page P03 \ --tag "time series" \ --tag "three metrics" \ - --tag "direction over time" \ - --limit 6 + --tag "direction over time" +python3 skills/ppt-master/scripts/chart_recall.py validate process_flow ``` -`--limit` accepts 3-8 and defaults to 6. The JSON is already bounded and must be read unfiltered: `tail`, `head`, `grep`, or another truncator can discard higher-ranked candidates. `confidence` reports lexical strength only; it never decides whether a candidate fits. At `low` / `none`, a fitting bounded candidate needs no expansion, but `no_template_match.allowed` remains false until one explicit semantic fallback review. +The validation example intentionally uses the legacy bare Structure intent `process_flow`; +the shared resolver recognizes it as a Structure intent without an SVG path. +The wrapper retains the original string in its historical `valid` list and adds +a `resolved` item with `family`, `key`, and `kind`; a Structure intent omits +`reference` and `path`. New planning describes qualitative relationships in §IX +or Quick active context; it does not write a Structure catalog key. -Semantically review the bounded candidates. At `high` / `medium`, retain `no-template-match` when none fits. At `low` / `none`, select a fitting bounded candidate directly; otherwise rerun the same command once with `--semantic-fallback`, compare the returned rules semantically, and only then retain `no-template-match`. The full-catalog review is therefore a narrow low-confidence no-match gate, not a routine recall step. Do not open or maintain a second keyword/category index. `no-template-match` is an internal recall result, not a Design Spec §VII row. - -| Field | Contract | -|---|---| -| `page` | Input `P` page key | -| `semantic_tags` | Deduplicated input tags | -| `confidence` | Lexical recall strength; never a selection decision | -| `candidates` | Ranked keys, SVG paths, verbatim catalog summaries, scores, and matched tags | -| `semantic_fallback` | Full live catalog, present only with `--semantic-fallback`; requires semantic comparison | -| `no_template_match` | Explicit fallback; `allowed` stays false for `low` / `none` until `--semantic-fallback` is used | - -The scorer treats the key and the summary's Pick clause as positive evidence and the Skip clause as negative evidence. A term found only in Skip cannot make a candidate eligible, and Skip matches explicitly reduce a candidate's score. Unicode input is NFKC-normalized before matching. The active profile owner still applies semantic judgment: inspect the returned candidates, reject candidates whose Skip clause matches, and prefer the most specific valid structure. An empty or low-confidence shortlist requires one `--semantic-fallback` review only when the owner is about to keep `no-template-match`. - -## Validate selected keys - -Validate every selected template key before Default writes `design_spec.md §VII` / `spec_lock.md page_charts` or Quick opens that key for immediate use: - -```bash -python3 skills/ppt-master/scripts/chart_recall.py validate line_chart quadrant_text_bullets -``` - -The command is read-only. It exits `0` when every key exists and `1` when any key is absent. A Default `no-template-match` page appears in neither §VII nor `page_charts`; record its chosen fallback in the page's §IX `Visualization` / `Layout`. Quick keeps the fallback only in active context and writes no mapping artifact. - -## Selection boundary - -- Preserve the two-lens review: numeric/data pages and structural-information pages. -- Default keeps §VII as a positive selection list: record `Page | Template | Usage` for each selected key, and omit the whole section when no candidate is selected. -- Default makes `Usage` one concise page-local purpose, not geometry or execution instructions; derive `templates/charts/.svg` from the key and keep detailed adaptation in §IX. -- Quick retains the selected key and immediate page purpose only in active context; do not create §VII, `page_charts`, or a substitute mapping file. -- Never serialize `no-template-match`, an empty table, or a no-reference explanation into §VII. -- Do not serialize returned summaries, paths, or runners-up into new §VII tables. Legacy wider tables remain readable. -- Open the selected `.svg` only as a reference for its mapped page; it does not lock type or geometry. Do not load unrelated catalog SVGs. +Do not use this wrapper in new planning prompts. See +[`visualization-recall.md`](./visualization-recall.md) for the canonical +`family/key` workflow and `page_visualizations` contract. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/docs/confirm_ui.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/docs/confirm_ui.md index 987d2c0c..94052888 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/docs/confirm_ui.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/docs/confirm_ui.md @@ -271,9 +271,9 @@ The Stage-1 submission writes this receipt and the Stage-1 `result.json` together. Generate reads both exactly once after `--wait-only --wait-stage stage1` returns. Free design skips installation. Template mode runs `apply-template-workspace` against all selected roots and waits for complete -project-local installation/fusion. Only then does the agent complete the -handoff below. Installation resolves template-to-template ownership; Stage 2 -later evaluates current-project fit from the installed copy. Strategist never +project-local installation. Only then does the agent complete the +handoff below. Installation copies each selected spec separately; Stage 2 +resolves segment ownership and current-project fit from the installed set. Strategist never reads the source roots. ### Agent handoff — `template_handoff.json` @@ -395,7 +395,7 @@ Stage 2: its recommendations must include `template_application.value`. ### Input — `recommendations.stage1.json` (created beside template options) Author this file before reading candidate index summaries in chat and without -reading any template spec, prototype, asset, fused segment owner, or template +reading any template spec, prototype, asset, segment owner, or template canvas. `template_options.json` supplies display state only and never changes the communication recommendation. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/docs/conversion.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/docs/conversion.md index e8e683e1..6e3f5e90 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/docs/conversion.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/docs/conversion.md @@ -550,14 +550,43 @@ Markdown output. when the converter derives a title-based filename. -## `rotate_images.py` +## Image Orientation Review -Fix image EXIF orientation in downloaded or imported assets. +Run this review when the user requests orientation correction, converted text +asks the reader to rotate the device, or a downloaded asset is visibly +sideways. EXIF and dimensions may trigger review, but they cannot determine the +semantic direction of pixels that are already stored sideways. + +Generate a labeled static contact sheet. This command previews the first frame +after EXIF normalization and does not modify source images: ```bash -python3 scripts/rotate_images.py auto projects/xxx_files -python3 scripts/rotate_images.py gen projects/xxx_files -python3 scripts/rotate_images.py fix fixes.json +python3 ${SKILL_DIR}/scripts/rotate_images.py sheet ``` -Use this when extracted photos appear sideways after conversion or import. +The default output is +`/../analysis/_orientation_contact_sheet.jpg`. +Inspect it with the current multimodal agent, identify only visually confirmed +rotations, and write a temporary JSON list. `rotation` is clockwise degrees and +must be `90`, `180`, or `270`: + +```json +[ + {"path": "/absolute/path/to/sideways.jpg", "rotation": 270} +] +``` + +Apply the confirmed fixes and regenerate image facts: + +```bash +python3 ${SKILL_DIR}/scripts/rotate_images.py fix /tmp/orientation_fixes.json +python3 ${SKILL_DIR}/scripts/analyze_images.py +``` + +GIF files are excluded: `sheet` does not list them, and `fix` rejects a batch +that references one so all GIF files remain unchanged. + +Do not infer a rotation from prose, EXIF, or aspect ratio alone, and do not +launch the HTML `gen` command in source intake. `auto` remains an in-place EXIF +normalizer. `gen` is a compatibility UI that runs the same normalization before +writing HTML; neither belongs to source intake. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/docs/visualization-recall.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/docs/visualization-recall.md new file mode 100644 index 00000000..ad344e40 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/docs/visualization-recall.md @@ -0,0 +1,107 @@ +# Visualization Candidate Recall + +`visualization_recall.py` gives Default Strategist or the Quick Generate main +agent one bounded deterministic shortlist across the live Chart and Table +family registries. It exposes the selected full catalog only when the +caller explicitly requests semantic review. The tool reads these indexes on +every invocation and maintains no second category or keyword index: + +- `templates/charts/charts_index.json` +- `templates/tables/tables_index.json` + +Qualitative Structure does not enter recall. Default records its relationship +model in §IX; Quick keeps the same decision in active context. Both load +`executor-structure.md` and compose the shapes for the current page. + +## Recall candidates + +Describe one page's information shape with 3-8 concise English semantic tags. +Translate source-language or industry terms into structural meaning first. + +```bash +python3 skills/ppt-master/scripts/visualization_recall.py recall \ + --page P03 \ + --tag "time series" \ + --tag "three metrics" \ + --tag "direction over time" \ + --limit 6 +``` + +Use `--family chart|table` only when the page semantics already make that +boundary certain; the default `all` preserves unified Chart/Table recall. +`--limit` accepts 3-8 and defaults to 6. Read the returned JSON unfiltered: +`tail`, `head`, `grep`, or another truncator can discard higher-ranked +candidates. `confidence` reports lexical strength only and never decides fit. + +At `high` / `medium`, retain `no-template-match` when none fits. At `low` / +`none`, select a fitting bounded candidate directly; otherwise rerun the same +command once with `--semantic-fallback`, compare the returned selection rules +semantically, and only then retain `no-template-match`. The full-catalog review +is a narrow low-confidence no-match gate, not a routine recall step. + +| Field | Contract | +|---|---| +| `page` | Input `P` page key | +| `family_filter` | Requested family or `all` | +| `semantic_tags` | Deduplicated input tags | +| `confidence` | Lexical recall strength; never a selection decision | +| `candidates` | Ranked family/key references, SVG paths, summaries, scores, and matched tags | +| `semantic_fallback` | Selected live catalogs, present only with `--semantic-fallback` | +| `no_template_match` | Explicit fallback; blocked at low/none until semantic fallback review | + +The scorer treats the key and summary Pick clause as positive evidence and the +Skip clause as negative evidence. A term found only in Skip cannot make a +candidate eligible. Unicode input is NFKC-normalized before matching. The +active profile owner still applies semantic judgment and prefers the most +specific valid information structure. + +## Validate selected references + +Validate every selected reference before Default writes Design Spec §VII and +`spec_lock.md page_visualizations`, or before Quick opens it for immediate use: + +```bash +python3 skills/ppt-master/scripts/visualization_recall.py validate \ + chart/line_chart table/record_table +``` + +The command is read-only. It exits `0` when every supplied reference resolves +to a registered SVG and `1` otherwise. New planning supplies canonical +`family/key`. When validating an existing legacy mapping, opt into bare-key +resolution explicitly; every key must resolve uniquely: + +```bash +python3 skills/ppt-master/scripts/visualization_recall.py validate \ + --legacy-bare pros_cons_chart +``` + +A Default `no-template-match` page appears in neither §VII nor +`page_visualizations`; record its custom fallback in §IX. A qualitative +Structure is not a no-match case: describe its relationships in §IX and build +it without catalog lookup. + +## Selection boundary + +- Default records `Page | Family | Template | Usage` for each positive + selection and projects `family/key` into `page_visualizations`. +- Usage is one concise page-local purpose; detailed adaptation remains in §IX. +- Quick keeps the selected reference and purpose only in active context. +- Structure is a separate runtime information model, never a catalog candidate + or `page_visualizations` entry. +- Never serialize `no-template-match`, empty tables, summaries, paths, or + runners-up into planning artifacts. +- Open only the selected SVG for its mapped page. It is a flexible reference, + not a type, geometry, style, or native-replacement lock. + +## Legacy compatibility + +`chart_recall.py` remains a compatibility wrapper for existing callers. It +uses the same scorer and live Chart/Table registries, preserves bare-key +validation and the historical JSON shape, and resolves live candidates to their +current family paths. New prompts and automation use `visualization_recall.py`. + +When `validate --legacy-bare` receives one of the 36 retired canonical Structure +bare keys, the shared resolver returns `kind=legacy-structure-intent`, +`family=structure`, and the original key without `path` or `reference`. This +compatibility result is a semantic hint for old `page_charts`, not a live catalog +entry, and never participates in recall. 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 388421d4..8d57ea91 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 @@ -204,7 +204,7 @@ def generate_examples_index(examples_dir: str = 'examples') -> str: content.append( f"- [Role Definitions]({skill_link(skill_dir / 'references')})") content.append( - f"- [Chart Templates]({skill_link(skill_dir / 'templates' / 'charts' / 'README.md')})\n") + f"- [Visualization Templates]({skill_link(skill_dir / 'templates' / 'README.md')})\n") # Footer content.append("---\n") diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/narration_sync.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/narration_sync.py index 9313b556..a5c53fbd 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/narration_sync.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/narration_sync.py @@ -1714,7 +1714,7 @@ def build_parser() -> argparse.ArgumentParser: fingerprint.add_argument( "--subtitle-dir", default=None, - help="Page-local SRT directory; default: /notes/subtitles", + help="Page-local SRT directory; default: /audio", ) animations = subparsers.add_parser( @@ -1735,7 +1735,7 @@ def build_parser() -> argparse.ArgumentParser: animations.add_argument( "--subtitle-dir", default=None, - help="Page-local SRT directory; default: /notes/subtitles", + help="Page-local SRT directory; default: /audio", ) animations.add_argument( "--audio-dir", @@ -1779,7 +1779,7 @@ def build_parser() -> argparse.ArgumentParser: subtitles.add_argument( "--subtitle-dir", default=None, - help="Page-local SRT directory; default: /notes/subtitles", + help="Page-local SRT directory; default: /audio", ) subtitles.add_argument( "--video", @@ -1801,7 +1801,7 @@ def build_parser() -> argparse.ArgumentParser: "-o", "--output", default=None, - help="Merged SRT output; default: /notes/subtitles/total.srt", + help="Merged SRT output; default: /audio/total.srt", ) subtitles.add_argument( "--force", @@ -1823,7 +1823,7 @@ def main(argv: list[str] | None = None) -> int: subtitle_dir = _project_path( project_path, args.subtitle_dir, - Path("notes/subtitles"), + Path("audio"), ) slide_names = _page_subtitle_names(subtitle_dir) for slide_name in slide_names: @@ -1845,7 +1845,7 @@ def main(argv: list[str] | None = None) -> int: subtitle_dir = _project_path( project_path, args.subtitle_dir, - Path("notes/subtitles"), + Path("audio"), ) audio_dir = _project_path( project_path, @@ -1881,7 +1881,7 @@ def main(argv: list[str] | None = None) -> int: subtitle_dir = _project_path( project_path, args.subtitle_dir, - Path("notes/subtitles"), + Path("audio"), ) audio_dir = _project_path( project_path, @@ -1896,7 +1896,7 @@ def main(argv: list[str] | None = None) -> int: output_path = _project_path( project_path, args.output, - Path("notes/subtitles/total.srt"), + Path("audio/total.srt"), ) result = _merge_subtitles_result( project_path, 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 8e2324b0..e75353c5 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 @@ -4,6 +4,9 @@ This script uses provider backends for the same per-slide output contract on macOS, Linux, and Windows. `edge-tts` remains the default no-key backend and also writes one compact, word-timed SRT file per slide from the same TTS stream. +MiniMax and CosyVoice request word timings; ElevenLabs requests character +alignment. All four apply the same compact, text-faithful cue regrouping. +Qwen remains audio-only because its current TTS API exposes no timestamps. Usage: python3 skills/ppt-master/scripts/notes_to_audio.py --voice zh-CN-XiaoxiaoNeural @@ -26,11 +29,13 @@ from __future__ import annotations import argparse import asyncio +import hashlib import json import os import re import sys from dataclasses import dataclass +from datetime import datetime, timezone from pathlib import Path from console_encoding import configure_utf8_stdio @@ -43,6 +48,7 @@ from tts_backends import ( backend_minimax, backend_qwen, ) +from tts_backends.backend_common import temporary_path configure_utf8_stdio() @@ -220,6 +226,108 @@ def _remove_stale_audio_variants(output_path: Path) -> None: candidate.unlink() +def _sha256_text(value: str) -> str: + return hashlib.sha256(value.encode("utf-8")).hexdigest() + + +def _provider_manifest_details( + args: argparse.Namespace, + backend: AudioBackend, +) -> tuple[str, dict[str, object]]: + if backend.provider == "edge": + return "edge-tts", { + "rate": args.rate, + } + if backend.provider == "elevenlabs": + return args.elevenlabs_model, { + "stability": args.elevenlabs_stability, + "similarity_boost": args.elevenlabs_similarity_boost, + "style": args.elevenlabs_style, + "speed": args.elevenlabs_speed, + "speaker_boost": args.elevenlabs_speaker_boost, + } + if backend.provider == "minimax": + return args.minimax_model, { + "speed": args.minimax_speed, + "volume": args.minimax_volume, + "pitch": args.minimax_pitch, + "language_boost": args.minimax_language_boost, + } + if backend.provider == "qwen": + return args.qwen_model, { + "language_type": args.qwen_language_type, + "optimize_instructions": args.qwen_optimize_instructions, + "custom_instructions": True if args.qwen_instructions else None, + } + return args.cosyvoice_model, { + "volume": args.cosyvoice_volume, + "rate": args.cosyvoice_rate, + "pitch": args.cosyvoice_pitch, + "language_hint": args.cosyvoice_language_hint, + "custom_instruction": True if args.cosyvoice_instruction else None, + } + + +def _narration_manifest( + args: argparse.Namespace, + backend: AudioBackend, + *, + writes_subtitles: bool, +) -> dict[str, object]: + model, raw_settings = _provider_manifest_details(args, backend) + settings = { + key: value + for key, value in raw_settings.items() + if value is not None + } + voice_ref = backend.voice_id + if backend.provider != "edge": + voice_ref = f"sha256:{_sha256_text(voice_ref)}" + + manifest: dict[str, object] = { + "schema": "ppt-master.narration.v1", + "generated_at": datetime.now(timezone.utc).isoformat( + timespec="seconds" + ).replace("+00:00", "Z"), + "provider": backend.provider, + "model": model, + "voice_ref": voice_ref, + "audio_format": backend.extension.lstrip("."), + } + if settings: + manifest["settings"] = settings + if writes_subtitles: + manifest["subtitles"] = { + "format": "srt", + "timing": ( + "character" if backend.provider == "elevenlabs" else "word" + ), + "max_visible_chars": args.subtitle_max_chars, + } + return manifest + + +def _publish_manifest(path: Path, manifest: dict[str, object]) -> None: + descriptor, staged_path = temporary_path(path, ".tmp") + try: + with os.fdopen( + descriptor, + "w", + encoding="utf-8", + newline="\n", + ) as stream: + descriptor = -1 + json.dump(manifest, stream, ensure_ascii=False, indent=2) + stream.write("\n") + stream.flush() + os.fsync(stream.fileno()) + os.replace(staged_path, path) + finally: + if descriptor >= 0: + os.close(descriptor) + staged_path.unlink(missing_ok=True) + + async def _generate_edge_jobs( jobs: list[AudioJob], subtitle_dir: Path, @@ -293,7 +401,7 @@ def main() -> int: "--subtitle-max-chars", type=int, default=backend_edge.DEFAULT_SUBTITLE_MAX_CHARS, - help="maximum visible characters per Edge subtitle cue (default: 20)", + help="maximum visible characters per provider-timed subtitle cue (default: 20)", ) parser.add_argument( "--elevenlabs-api-key-env", @@ -328,6 +436,12 @@ def main() -> int: default=None, help="optional ElevenLabs style exaggeration override, 0.0-1.0", ) + parser.add_argument( + "--elevenlabs-speed", + type=float, + default=None, + help="optional ElevenLabs speaking speed override, 0.7-1.2", + ) parser.add_argument( "--elevenlabs-speaker-boost", action=argparse.BooleanOptionalAction, @@ -377,6 +491,7 @@ def main() -> int: parser.add_argument("--cosyvoice-output-format", default="mp3", choices=["mp3", "wav"], help="CosyVoice audio format for PPT narration (default: mp3)") parser.add_argument("--cosyvoice-sample-rate", type=int, default=24000, + choices=[8000, 16000, 22050, 24000, 44100, 48000], help="CosyVoice sample rate (default: 24000)") parser.add_argument("--cosyvoice-volume", type=int, default=None, help="optional CosyVoice volume, 0-100") @@ -388,6 +503,14 @@ def main() -> int: help="optional CosyVoice instruction text for supported voices/models") parser.add_argument("--cosyvoice-language-hint", default=None, help="optional CosyVoice language hint, e.g. zh, en, ja") + parser.add_argument( + "--cosyvoice-audio-only", + action="store_true", + help=( + "skip CosyVoice timestamps/SRT for a model or voice that does not " + "support them" + ), + ) parser.add_argument("--list-common-voices", action="store_true", help="print a curated voice list and exit") parser.add_argument("--list-voices", action="store_true", help="query provider voices and exit") parser.add_argument("--locale", default=None, help='filter --list-voices by locale, e.g. "zh-CN"') @@ -441,6 +564,40 @@ def main() -> int: parser.error("--concurrency must be at least 1") raise AssertionError("unreachable") + for option, value, minimum, maximum in ( + ("--elevenlabs-stability", args.elevenlabs_stability, 0.0, 1.0), + ( + "--elevenlabs-similarity-boost", + args.elevenlabs_similarity_boost, + 0.0, + 1.0, + ), + ("--elevenlabs-style", args.elevenlabs_style, 0.0, 1.0), + ("--elevenlabs-speed", args.elevenlabs_speed, 0.7, 1.2), + ("--cosyvoice-volume", args.cosyvoice_volume, 0, 100), + ("--cosyvoice-rate", args.cosyvoice_rate, 0.5, 2.0), + ("--cosyvoice-pitch", args.cosyvoice_pitch, 0.5, 2.0), + ): + if value is not None and not minimum <= value <= maximum: + parser.error(f"{option} must be between {minimum} and {maximum}") + raise AssertionError("unreachable") + + if args.cosyvoice_audio_only and args.provider != "cosyvoice": + parser.error("--cosyvoice-audio-only requires --provider cosyvoice") + raise AssertionError("unreachable") + + if args.provider == "qwen" and args.qwen_instructions: + if "instruct" not in args.qwen_model: + parser.error( + "--qwen-instructions requires a Qwen3 TTS Instruct model" + ) + raise AssertionError("unreachable") + if args.qwen_optimize_instructions and not args.qwen_instructions: + parser.error( + "--qwen-optimize-instructions requires --qwen-instructions" + ) + raise AssertionError("unreachable") + if args.provider == "elevenlabs": if not voice_id: parser.error("--voice-id is required for --provider elevenlabs") @@ -479,14 +636,31 @@ def main() -> int: except Exception as exc: print(f"error: {exc}", file=sys.stderr) return 1 - backend = AudioBackend(provider=args.provider, extension=extension, api_key=api_key, voice_id=voice_id) + backend = AudioBackend( + provider=args.provider, + extension=extension, + api_key=api_key, + voice_id=voice_id, + ) else: - backend = AudioBackend(provider=args.provider, extension=backend_edge.edge_output_extension(), voice_id=args.voice) + backend = AudioBackend( + provider=args.provider, + extension=backend_edge.edge_output_extension(), + voice_id=args.voice, + ) project = args.project_path notes_dir = project / "notes" output_dir = args.output or (project / "audio") - subtitle_dir = notes_dir / "subtitles" + subtitle_dir = output_dir + writes_subtitles = backend.provider in { + "edge", + "elevenlabs", + "minimax", + } or ( + backend.provider == "cosyvoice" + and not args.cosyvoice_audio_only + ) try: note_roster = _expected_note_roster(project) @@ -502,8 +676,13 @@ def main() -> int: return 2 output_dir.mkdir(parents=True, exist_ok=True) - if backend.provider == "edge": - subtitle_dir.mkdir(parents=True, exist_ok=True) + manifest_path = output_dir / "manifest.json" + try: + manifest_path.unlink(missing_ok=True) + (output_dir / "total.srt").unlink(missing_ok=True) + except OSError as exc: + print(f"error: failed to clear stale narration metadata: {exc}", file=sys.stderr) + return 1 generated = 0 if backend.provider == "edge": @@ -553,8 +732,11 @@ def main() -> int: for job in jobs: output_path = job.output_path text = job.text + subtitle_path: Path | None = None try: if backend.provider == "elevenlabs": + if writes_subtitles: + subtitle_path = subtitle_dir / f"{output_path.stem}.srt" backend_elevenlabs.generate( text, output_path, @@ -565,9 +747,14 @@ def main() -> int: stability=args.elevenlabs_stability, similarity_boost=args.elevenlabs_similarity_boost, style=args.elevenlabs_style, + speed=args.elevenlabs_speed, speaker_boost=args.elevenlabs_speaker_boost, + subtitle_path=subtitle_path, + subtitle_max_chars=args.subtitle_max_chars, ) elif backend.provider == "minimax": + if writes_subtitles: + subtitle_path = subtitle_dir / f"{output_path.stem}.srt" backend_minimax.generate( text, output_path, @@ -583,6 +770,8 @@ def main() -> int: pitch=args.minimax_pitch, language_boost=args.minimax_language_boost, base_url=args.minimax_base_url, + subtitle_path=subtitle_path, + subtitle_max_chars=args.subtitle_max_chars, ) elif backend.provider == "qwen": backend_qwen.generate( @@ -597,6 +786,8 @@ def main() -> int: base_url=args.qwen_base_url, ) elif backend.provider == "cosyvoice": + if writes_subtitles: + subtitle_path = subtitle_dir / f"{output_path.stem}.srt" backend_cosyvoice.generate( text, output_path, @@ -611,21 +802,41 @@ def main() -> int: instruction=args.cosyvoice_instruction, language_hint=args.cosyvoice_language_hint, base_url=args.cosyvoice_base_url, + subtitle_path=subtitle_path, + subtitle_max_chars=args.subtitle_max_chars, ) _remove_stale_audio_variants(output_path) + if not writes_subtitles: + output_path.with_suffix(".srt").unlink(missing_ok=True) except Exception as exc: print(f"error: failed to generate {output_path}: {exc}", file=sys.stderr) return 1 generated += 1 print(f"[OK] {output_path}") + if subtitle_path is not None: + print(f" {subtitle_path}") - if backend.provider == "edge": + try: + _publish_manifest( + manifest_path, + _narration_manifest( + args, + backend, + writes_subtitles=writes_subtitles, + ), + ) + except (OSError, RuntimeError) as exc: + print(f"error: failed to publish narration manifest: {exc}", file=sys.stderr) + return 1 + + if writes_subtitles: print( f"[Done] Generated {generated}/{len(note_roster)} audio/SRT pair(s): " - f"{output_dir} + {subtitle_dir}" + f"{output_dir}" ) else: print(f"[Done] Generated {generated}/{len(note_roster)} audio file(s): {output_dir}") + print(f"[REPORT] Narration manifest: {manifest_path}") return 0 diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/project_management/page_context.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/project_management/page_context.py index 3bbf2732..90c97d06 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/project_management/page_context.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/project_management/page_context.py @@ -26,7 +26,6 @@ from dataclasses import dataclass from pathlib import Path from typing import Callable, Iterable -from .paths import CHARTS_DIR as _CHARTS_DIR from .paths import SKILL_DIR as _SKILL_DIR from .project_specs import ( default_spec_lock_forbidden, @@ -39,6 +38,13 @@ from svg_to_pptx.pptx_package.template_structure import ( TemplateStructureError, load_pptx_structure_lock, ) +from visualization_catalog import ( + LEGACY_STRUCTURE_INTENT_KIND, + VISUALIZATION_SVG_KIND, + VisualizationCatalogError, + VisualizationEntry, + resolve_visualization_reference, +) PAGE_CONTEXT_SCHEMA = "ppt-master.page-context.v2" @@ -413,24 +419,55 @@ def _reference_payload( return payload -def _chart_reference(chart_key: str) -> tuple[dict[str, str], Path]: - """Resolve one locked chart key to the shared Skill catalog.""" - if Path(chart_key).name != chart_key or not chart_key: - raise PageContextError(f"invalid page_charts key: {chart_key!r}") - chart_path = (_CHARTS_DIR / f"{chart_key}.svg").resolve() - if not chart_path.is_file(): - raise PageContextError( - f"page_charts key {chart_key!r} has no shared SVG reference" +def _visualization_reference( + value: str, + *, + allow_legacy_bare: bool, +) -> tuple[dict[str, str] | None, Path | None, VisualizationEntry]: + """Resolve one live asset or one legacy intent-only Structure key.""" + source_section = "page_charts" if allow_legacy_bare else "page_visualizations" + try: + entry = resolve_visualization_reference( + value, + allow_legacy_bare=allow_legacy_bare, ) - return ( - _reference_payload( - "chart-svg", - chart_path, - scope="skill", - display_path=f"templates/charts/{chart_path.name}", - ), - chart_path, + except VisualizationCatalogError as exc: + raise PageContextError( + f"{source_section} value {value!r} cannot resolve a visualization: {exc}" + ) from exc + if entry.kind == LEGACY_STRUCTURE_INTENT_KIND: + if not allow_legacy_bare or entry.path is not None: + raise PageContextError( + f"{source_section} value {value!r} has an invalid legacy " + "Structure intent resolution" + ) + return None, None, entry + if entry.kind != VISUALIZATION_SVG_KIND or entry.path is None: + raise PageContextError( + f"{source_section} value {value!r} resolves to unsupported kind " + f"{entry.kind!r}" + ) + path = Path(entry.path).resolve() + try: + display_path = path.relative_to(_SKILL_DIR.resolve()).as_posix() + except ValueError as exc: + raise PageContextError( + f"{source_section} value {value!r} resolves outside the Skill: {path}" + ) from exc + payload = _reference_payload( + entry.kind, + path, + scope="skill", + display_path=display_path, ) + payload.update( + { + "reference": entry.reference, + "family": entry.family, + "key": entry.key, + } + ) + return payload, path, entry def build_page_context(project: str | Path, raw_page: str) -> PageContextResult: @@ -475,7 +512,16 @@ def build_page_context(project: str | Path, raw_page: str) -> PageContextResult: if rhythm is None: rhythm = "dense" warnings.append(f"page_rhythm has no {page}; using compatibility default dense") - chart_key = _section_fields(lock_sections, "page_charts").get(page) + visualization_value = _section_fields( + lock_sections, + "page_visualizations", + ).get(page) + legacy_chart_key = _section_fields(lock_sections, "page_charts").get(page) + if visualization_value is not None and legacy_chart_key is not None: + raise PageContextError( + f"{page} is declared in both page_visualizations and legacy " + "page_charts; keep only page_visualizations" + ) try: structure_lock = load_pptx_structure_lock(project_path) except TemplateStructureError as exc: @@ -545,10 +591,22 @@ def build_page_context(project: str | Path, raw_page: str) -> PageContextResult: display_path=_relative_project_path(project_path, prototype_path), ) ) - if chart_key is not None: - chart_reference, chart_path = _chart_reference(chart_key) - inputs.append(chart_path) - reference_set.append(chart_reference) + visualization_entry: VisualizationEntry | None = None + selected_visualization = ( + visualization_value + if visualization_value is not None + else legacy_chart_key + ) + if selected_visualization is not None: + visualization_reference, visualization_path, visualization_entry = ( + _visualization_reference( + selected_visualization, + allow_legacy_bare=visualization_value is None, + ) + ) + if visualization_path is not None and visualization_reference is not None: + inputs.append(visualization_path) + reference_set.append(visualization_reference) mode_fields = _section_fields(lock_sections, "mode") visual_style_fields = _section_fields(lock_sections, "visual_style") # Each on-demand projection includes bounded lock anchors; large reference @@ -579,8 +637,18 @@ def build_page_context(project: str | Path, raw_page: str) -> PageContextResult: "rhythm": rhythm, "image_selection": image_selection, } - if chart_key is not None: - current_page["chart"] = chart_key + if ( + visualization_entry is not None + and visualization_entry.kind == VISUALIZATION_SVG_KIND + ): + current_page["visualization"] = visualization_entry.reference + elif ( + visualization_entry is not None + and visualization_entry.kind == LEGACY_STRUCTURE_INTENT_KIND + ): + current_page["structure_intent"] = visualization_entry.key + if legacy_chart_key is not None: + current_page["chart"] = legacy_chart_key if selected_images: current_page["images"] = selected_images if template is not None: diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/project_management/project_specs.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/project_management/project_specs.py index 3260e0ee..bad620f1 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/project_management/project_specs.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/project_management/project_specs.py @@ -49,6 +49,25 @@ except ImportError: validate_communication_trace, ) +try: + from visualization_catalog import ( + LEGACY_STRUCTURE_INTENT_KIND, + VISUALIZATION_SVG_KIND, + VisualizationCatalogError, + resolve_visualization_reference, + ) +except ImportError: + import sys + + if str(SCRIPTS_DIR) not in sys.path: + sys.path.insert(0, str(SCRIPTS_DIR)) + from visualization_catalog import ( # type: ignore + LEGACY_STRUCTURE_INTENT_KIND, + VISUALIZATION_SVG_KIND, + VisualizationCatalogError, + resolve_visualization_reference, + ) + TOOLS_DIR = SCRIPTS_DIR @@ -1017,6 +1036,8 @@ def _validate_spec_lock_relations( layouts = fields("pptx_layouts") page_pptx_layouts = fields("page_pptx_layouts") page_layouts = fields("page_layouts") + page_visualizations = fields("page_visualizations") + legacy_page_charts = fields("page_charts") structure = fields("pptx_structure") for layout_key, raw_value in layouts.items(): @@ -1059,14 +1080,71 @@ def _validate_spec_lock_relations( f"pages {', '.join(extra)}" ) - chart_pages = set(fields("page_charts")) - unknown_chart_pages = sorted(chart_pages - set(rhythm)) - if unknown_chart_pages: + overlapping_visualization_pages = sorted( + set(page_visualizations) & set(legacy_page_charts) + ) + if overlapping_visualization_pages: errors.append( - f"{markdown_name} schema: page_charts has unknown pages " - f"{', '.join(unknown_chart_pages)}" + f"{markdown_name} schema: pages " + f"{', '.join(overlapping_visualization_pages)} are declared in both " + "page_visualizations and legacy page_charts; keep only " + "page_visualizations" ) + for section_id, mapping, allow_legacy_bare in ( + ("page_visualizations", page_visualizations, False), + ("page_charts", legacy_page_charts, True), + ): + unknown_pages = sorted(set(mapping) - set(rhythm)) + if unknown_pages: + errors.append( + f"{markdown_name} schema: {section_id} has unknown pages " + f"{', '.join(unknown_pages)}" + ) + for page_key, raw_reference in mapping.items(): + reference = _normalize_schema_value(raw_reference) + try: + entry = resolve_visualization_reference( + reference, + allow_legacy_bare=allow_legacy_bare, + ) + except VisualizationCatalogError as exc: + errors.append( + f"{markdown_name} schema: {section_id}.{page_key} " + f"cannot resolve visualization {reference!r}: {exc}" + ) + continue + if entry.kind == LEGACY_STRUCTURE_INTENT_KIND: + if section_id != "page_charts" or not allow_legacy_bare: + errors.append( + f"{markdown_name} schema: {section_id}.{page_key} resolves " + "to a legacy Structure intent outside page_charts" + ) + if entry.path is not None: + errors.append( + f"{markdown_name} schema: {section_id}.{page_key} legacy " + "Structure intent unexpectedly has an asset path" + ) + continue + if entry.kind != VISUALIZATION_SVG_KIND: + errors.append( + f"{markdown_name} schema: {section_id}.{page_key} resolves " + f"to unsupported kind {entry.kind!r}" + ) + continue + if entry.path is None: + errors.append( + f"{markdown_name} schema: {section_id}.{page_key} does not " + "resolve to an SVG asset path" + ) + continue + asset_path = Path(entry.path) + if asset_path.suffix.casefold() != ".svg" or not asset_path.is_file(): + errors.append( + f"{markdown_name} schema: {section_id}.{page_key} does not " + f"resolve to an SVG asset at {asset_path}" + ) + info = get_project_info_common(str(markdown_path.parent)) format_key = str(info.get("format", "unknown")) canvas = CANVAS_FORMATS.get(format_key) diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/prompt_audit_manifest.json b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/prompt_audit_manifest.json index dbb4555e..19d0b689 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/prompt_audit_manifest.json +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/prompt_audit_manifest.json @@ -9,10 +9,11 @@ "AGENTS.md", "skills/ppt-master/**/*.md", "skills/ppt-master/templates/charts/charts_index.json", + "skills/ppt-master/templates/tables/tables_index.json", "skills/ppt-master/templates/schemas/*.json" ], "exclude": [], - "max_tokens": 450000 + "max_tokens": 500000 }, "file_budgets": { "AGENTS.md": 2750, @@ -20,6 +21,9 @@ "skills/ppt-master/references/executor-base.md": 9250, "skills/ppt-master/references/executor-structured.md": 5500, "skills/ppt-master/references/executor-chart.md": 3500, + "skills/ppt-master/references/executor-visualization.md": 1250, + "skills/ppt-master/references/executor-structure.md": 1250, + "skills/ppt-master/references/executor-table.md": 1000, "skills/ppt-master/references/executor-image.md": 2000, "skills/ppt-master/references/executor-web-image.md": 750, "skills/ppt-master/references/executor-notes.md": 1000, @@ -199,6 +203,7 @@ "skills/ppt-master/references/svg-effects.md", "skills/ppt-master/references/native-shape-authoring.md", "skills/ppt-master/references/semantic-svg.md", + "skills/ppt-master/references/executor-structure.md", "skills/ppt-master/references/modes/_index.md", "skills/ppt-master/references/visual-styles/_index.md", { @@ -307,18 +312,19 @@ "files": [], "max_tokens": 92000 }, - "route.generate.quick-generate.chart": { - "description": "Quick Generate with bounded chart recall, chart/table authoring, optional native-data metadata, and in-context coordinate verification before the final checker.", + "route.generate.quick-generate.visualization": { + "description": "Quick Generate with bounded Chart/Table recall, their data-object branches, optional native-data metadata, and chart-coordinate verification before the final checker; the fixed Quick context already carries Shape Composition Grammar.", "scope": "cumulative", "include": [ "route.generate.quick-generate", + "stage.generate.executor.visualization", "stage.generate.executor.chart", + "stage.generate.executor.table", "stage.generate.executor.native-data", - "stage.generate.chart-authoring", "stage.generate.verify-charts" ], "files": [ - "skills/ppt-master/scripts/docs/chart-recall.md" + "skills/ppt-master/scripts/docs/visualization-recall.md" ], "max_tokens": 105000 }, @@ -369,7 +375,7 @@ "skills/ppt-master/workflows/stages/apply-template-workspace.md", "skills/ppt-master/templates/README.md" ], - "max_tokens": 5000 + "max_tokens": 6000 }, "stage.generate.template.brand": { "description": "Conditional Brand workspace application with one selected Brand spec.", @@ -483,7 +489,7 @@ "load_event": "template-application" } ], - "max_tokens": 16000 + "max_tokens": 19000 }, "route.generate.flat-no-image": { "description": "Default fixed Generate-PPTX context with no image-acquisition role.", @@ -554,14 +560,16 @@ "files": [], "max_tokens": 130000 }, - "route.generate.flat-no-image-chart": { - "description": "Default flat Generate-PPTX path with chart authoring, native-data replacement, and verification.", + "route.generate.flat-no-image-visualization": { + "description": "Default flat Generate-PPTX path with visualization-reference consumption, all three information-model branches, optional native-data replacement, and chart verification.", "scope": "cumulative", "include": [ "route.generate.flat-no-image", + "stage.generate.executor.visualization", "stage.generate.executor.chart", + "stage.generate.executor.structure", + "stage.generate.executor.table", "stage.generate.executor.native-data", - "stage.generate.chart-authoring", "stage.generate.verify-charts" ], "files": [], @@ -769,12 +777,13 @@ ], "max_tokens": 7000 }, - "stage.generate.chart-authoring": { - "description": "Conditional visualization-library authoring guidance.", + "maintenance.visualization-authoring": { + "description": "Shared chart and table catalog-template authoring guidance; not a Generate runtime load.", "scope": "incremental", "files": [ + "skills/ppt-master/templates/VISUALIZATION_TEMPLATE_AUTHORING.md", "skills/ppt-master/templates/charts/README.md", - "skills/ppt-master/templates/charts/CHART_STYLE_GUIDE.md" + "skills/ppt-master/templates/tables/README.md" ], "max_tokens": 10000 }, @@ -884,13 +893,37 @@ "max_tokens": 88000 }, "stage.generate.executor.chart": { - "description": "Conditional chart/table page execution rules.", + "description": "Conditional value-driven chart execution rules.", "scope": "incremental", "files": [ "skills/ppt-master/references/executor-chart.md" ], "max_tokens": 3500 }, + "stage.generate.executor.visualization": { + "description": "Conditional selected visualization-reference resolution and flexible page-local adaptation rules.", + "scope": "incremental", + "files": [ + "skills/ppt-master/references/executor-visualization.md" + ], + "max_tokens": 1250 + }, + "stage.generate.executor.structure": { + "description": "Conditional page-local qualitative-topology construction rules.", + "scope": "incremental", + "files": [ + "skills/ppt-master/references/executor-structure.md" + ], + "max_tokens": 1250 + }, + "stage.generate.executor.table": { + "description": "Conditional semantic cell-grid construction rules.", + "scope": "incremental", + "files": [ + "skills/ppt-master/references/executor-table.md" + ], + "max_tokens": 1000 + }, "stage.generate.strategist.image": { "description": "Conditional Strategist image/formula policy with the always-read layout math and compact composition vocabulary.", "scope": "incremental", @@ -1090,6 +1123,51 @@ "from": "skills/ppt-master/references/executor-base.md", "to": "skills/ppt-master/references/shared-standards-core.md" }, + { + "concern": "visualization-reference-routing", + "from": "skills/ppt-master/references/executor-base.md", + "to": "skills/ppt-master/references/executor-visualization.md" + }, + { + "concern": "structured-executor-routing", + "from": "skills/ppt-master/references/executor-base.md", + "to": "skills/ppt-master/references/executor-structured.md" + }, + { + "concern": "chart-executor-routing", + "from": "skills/ppt-master/references/executor-base.md", + "to": "skills/ppt-master/references/executor-chart.md" + }, + { + "concern": "structure-executor-routing", + "from": "skills/ppt-master/references/executor-base.md", + "to": "skills/ppt-master/references/executor-structure.md" + }, + { + "concern": "table-executor-routing", + "from": "skills/ppt-master/references/executor-base.md", + "to": "skills/ppt-master/references/executor-table.md" + }, + { + "concern": "native-data-routing", + "from": "skills/ppt-master/references/executor-base.md", + "to": "skills/ppt-master/references/native-data-interface.md" + }, + { + "concern": "visualization-chart-routing", + "from": "skills/ppt-master/references/executor-visualization.md", + "to": "skills/ppt-master/references/executor-chart.md" + }, + { + "concern": "visualization-structure-routing", + "from": "skills/ppt-master/references/executor-visualization.md", + "to": "skills/ppt-master/references/executor-structure.md" + }, + { + "concern": "visualization-table-routing", + "from": "skills/ppt-master/references/executor-visualization.md", + "to": "skills/ppt-master/references/executor-table.md" + }, { "concern": "structured-execution-contract", "from": "skills/ppt-master/references/executor-structured.md", @@ -1100,6 +1178,16 @@ "from": "skills/ppt-master/references/executor-chart.md", "to": "skills/ppt-master/references/native-data-interface.md" }, + { + "concern": "chart-verification-handoff", + "from": "skills/ppt-master/references/executor-chart.md", + "to": "skills/ppt-master/workflows/stages/verify-charts.md" + }, + { + "concern": "native-table-contract", + "from": "skills/ppt-master/references/executor-table.md", + "to": "skills/ppt-master/references/native-data-interface.md" + }, { "concern": "strategist-image-routing", "from": "skills/ppt-master/references/strategist.md", @@ -1249,6 +1337,26 @@ "type", "types" ] + }, + { + "name": "table-templates", + "kind": "json_collection", + "source": "skills/ppt-master/templates/tables/tables_index.json", + "key": "tables", + "reference_terms": [ + "tables_index.json", + "table catalog" + ], + "claim_nouns": [ + "table", + "tables", + "summary", + "summaries", + "template", + "templates", + "type", + "types" + ] } ], "schema_grammars": [ @@ -1257,6 +1365,7 @@ "fields": [ "font_family", "image_rendering", + "page_visualizations", "page_charts", "page_layouts", "page_pptx_layouts", @@ -1339,6 +1448,10 @@ "glob": "skills/ppt-master/scripts/docs/update_spec.md", "reason": "Maintainer command reference for an optional helper script." }, + { + "glob": "skills/ppt-master/scripts/docs/chart-recall.md", + "reason": "Legacy compatibility note; current generation loads visualization-recall.md." + }, { "glob": "skills/ppt-master/scripts/pptx_shapes/data/NOTICE.md", "reason": "License notice; never loaded as prompt context." @@ -1353,7 +1466,11 @@ }, { "glob": "skills/ppt-master/templates/charts/charts_index.json", - "reason": "Machine-consumed chart-recall registry; Strategist receives only the ranked candidate summaries." + "reason": "Machine-consumed chart-family registry; Strategist receives only bounded visualization-recall candidates." + }, + { + "glob": "skills/ppt-master/templates/tables/tables_index.json", + "reason": "Machine-consumed table-family registry; Strategist receives only bounded visualization-recall candidates." }, { "glob": "skills/ppt-master/templates/schemas/*.json", 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 3c784ed9..86a0b994 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 @@ -6,6 +6,7 @@ Provides visual image orientation filtering, fix code generation, and batch image rotation functionality. Usage: + python3 scripts/rotate_images.py sheet python3 scripts/rotate_images.py gen python3 scripts/rotate_images.py fix python3 scripts/rotate_images.py auto @@ -23,7 +24,13 @@ from console_encoding import configure_utf8_stdio configure_utf8_stdio() -from PIL import Image, ExifTags +from PIL import ( + ExifTags, + Image, + ImageDraw, + ImageFont, + ImageOps, +) ORIENTATION_TAG_ID = 274 # 0x0112 @@ -123,6 +130,153 @@ class ImageRotator: return fixed_count + def generate_contact_sheet( + self, + target_dir: Union[str, Path], + output_path: Optional[Union[str, Path]] = None, + ) -> str: + """Generate a labeled, read-only contact sheet for visual review.""" + target_path = Path(target_dir).resolve() + if not target_path.is_dir(): + raise FileNotFoundError(f"Directory not found: {target_path}") + + valid_exts = { + '.bmp', '.jpeg', '.jpg', '.png', '.tif', '.tiff', '.webp' + } + files = sorted( + ( + path for path in target_path.iterdir() + if path.is_file() and path.suffix.lower() in valid_exts + ), + key=lambda path: self._natural_sort_key(path.name), + ) + if not files: + raise ValueError("No image files found") + + columns = 6 + thumbnail_width = 180 + thumbnail_height = 180 + label_height = 34 + padding = 12 + cell_width = thumbnail_width + padding * 2 + cell_height = thumbnail_height + label_height + padding * 2 + rows = (len(files) + columns - 1) // columns + + sheet = Image.new( + 'RGB', + (columns * cell_width, rows * cell_height), + 'white', + ) + draw = ImageDraw.Draw(sheet) + try: + font = ImageFont.truetype('DejaVuSans.ttf', 13) + except OSError: + font = ImageFont.load_default() + resampling = getattr(Image, 'Resampling', Image) + + for index, file_path in enumerate(files): + column = index % columns + row = index // columns + cell_x = column * cell_width + cell_y = row * cell_height + draw.rectangle( + ( + cell_x, + cell_y, + cell_x + cell_width - 1, + cell_y + cell_height - 1, + ), + outline='#D0D7DE', + ) + + details = 'unreadable' + try: + with Image.open(file_path) as img: + if getattr(img, 'is_animated', False): + img.seek(0) + prepared = ImageOps.exif_transpose(img) + try: + source_width, source_height = prepared.size + preview = prepared.convert('RGBA') + finally: + if prepared is not img: + prepared.close() + + preview.thumbnail( + (thumbnail_width, thumbnail_height), + resampling.LANCZOS, + ) + preview_x = cell_x + padding + (thumbnail_width - preview.width) // 2 + preview_y = cell_y + padding + (thumbnail_height - preview.height) // 2 + sheet.paste(preview, (preview_x, preview_y), preview) + preview.close() + details = f'{source_width}x{source_height}' + except ( + EOFError, + OSError, + SyntaxError, + ValueError, + Image.DecompressionBombError, + ): + draw.line( + ( + cell_x + padding, + cell_y + padding, + cell_x + cell_width - padding, + cell_y + thumbnail_height, + ), + fill='#CF222E', + width=2, + ) + draw.line( + ( + cell_x + cell_width - padding, + cell_y + padding, + cell_x + padding, + cell_y + thumbnail_height, + ), + fill='#CF222E', + width=2, + ) + + label = file_path.name + if len(label) > 30: + label = f'{label[:13]}...{label[-14:]}' + label_y = cell_y + padding + thumbnail_height + 2 + for line_index, text in enumerate((label, details)): + text_bbox = draw.textbbox((0, 0), text, font=font) + text_width = text_bbox[2] - text_bbox[0] + draw.text( + ( + cell_x + (cell_width - text_width) / 2, + label_y + line_index * 15, + ), + text, + fill='#24292F', + font=font, + ) + + if output_path is None: + resolved_output = ( + target_path.parent + / 'analysis' + / f'{target_path.name}_orientation_contact_sheet.jpg' + ) + else: + resolved_output = Path(output_path).expanduser().resolve() + + suffix = resolved_output.suffix.lower() + if suffix not in {'.jpg', '.jpeg', '.png'}: + sheet.close() + raise ValueError("Contact sheet output must use .jpg, .jpeg, or .png") + resolved_output.parent.mkdir(parents=True, exist_ok=True) + if suffix == '.png': + sheet.save(resolved_output, format='PNG', optimize=True) + else: + sheet.save(resolved_output, format='JPEG', quality=90, optimize=True) + sheet.close() + return str(resolved_output) + def generate_html_tool(self, target_dir: str, output_filename: str = "image_orientation_tool.html") -> str: """Generate the image filtering HTML tool @@ -203,6 +357,19 @@ class ImageRotator: elif isinstance(json_source, list): tasks = json_source + gif_paths = [] + for task in tasks: + if not isinstance(task, dict): + continue + task_path = self._normalize_task_path(task.get('path', '')) + if Path(task_path).suffix.lower() == '.gif': + gif_paths.append(task_path) + if gif_paths: + raise ValueError( + "GIF rotation is unsupported; preserve GIF files unchanged: " + + ", ".join(gif_paths) + ) + print(f"[WORK] Starting {len(tasks)} manual rotation task(s)...") print("=" * 60) @@ -532,6 +699,7 @@ def build_parser() -> argparse.ArgumentParser: description="Manage image orientation and manual rotation fixes.", formatter_class=argparse.RawDescriptionHelpFormatter, epilog="""Examples: + python3 scripts/rotate_images.py sheet projects/demo/images python3 scripts/rotate_images.py gen projects/demo/images python3 scripts/rotate_images.py fix fixes.json python3 scripts/rotate_images.py auto projects/demo/images @@ -539,6 +707,17 @@ def build_parser() -> argparse.ArgumentParser: ) subparsers = parser.add_subparsers(dest="command", required=True) + sheet = subparsers.add_parser( + "sheet", + help="Generate a static contact sheet without modifying images", + ) + sheet.add_argument("images_directory", help="Images directory") + sheet.add_argument( + "-o", + "--output", + help="Output .jpg or .png path (default: sibling analysis directory)", + ) + gen = subparsers.add_parser("gen", help="Generate the visual rotation HTML tool") gen.add_argument("images_directory", help="Images directory") @@ -556,6 +735,18 @@ def main(argv: list[str] | None = None) -> int: args = parser.parse_args(argv) rotator = ImageRotator() + if args.command == 'sheet': + try: + output_path = rotator.generate_contact_sheet( + args.images_directory, + args.output, + ) + print(f"[REPORT] Image orientation contact sheet: {output_path}") + except (OSError, ValueError) as e: + print(f"[ERROR] Contact sheet generation failed: {e}") + return 1 + return 0 + if args.command == 'gen': target_dir = args.images_directory try: diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/tts_backends/backend_common.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/tts_backends/backend_common.py index 190d684a..787a0926 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/tts_backends/backend_common.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/tts_backends/backend_common.py @@ -61,18 +61,66 @@ def download_audio(url: str, output_path: Path) -> None: publish_audio_bytes(get_bytes(url), output_path) +def temporary_path(target: Path, suffix: str) -> tuple[int, Path]: + """Create a temporary file beside its eventual target.""" + target.parent.mkdir(parents=True, exist_ok=True) + descriptor, raw_path = tempfile.mkstemp( + prefix=f".{target.name}.", + suffix=suffix, + dir=target.parent, + ) + return descriptor, Path(raw_path) + + +def publish_staged_pair( + staged_first: Path, + first_target: Path, + staged_second: Path, + second_target: Path, +) -> None: + """Publish two staged files together, restoring prior targets on failure.""" + targets = (first_target, second_target) + if first_target.resolve() == second_target.resolve(): + raise ValueError("paired outputs must use different paths") + + backups: dict[Path, Path] = {} + published: set[Path] = set() + try: + for target in targets: + if not target.exists(): + continue + descriptor, backup = temporary_path(target, ".bak") + os.close(descriptor) + backup.unlink() + os.replace(target, backup) + backups[target] = backup + + for staged, target in ( + (staged_first, first_target), + (staged_second, second_target), + ): + os.replace(staged, target) + published.add(target) + except Exception: + for target in published: + target.unlink(missing_ok=True) + for target, backup in backups.items(): + if backup.exists(): + os.replace(backup, target) + raise + finally: + staged_first.unlink(missing_ok=True) + staged_second.unlink(missing_ok=True) + for backup in backups.values(): + backup.unlink(missing_ok=True) + + def publish_audio_bytes(audio: bytes, output_path: Path) -> None: """Publish non-empty provider audio without exposing a partial target.""" if not audio: raise RuntimeError("TTS provider returned empty audio data") - output_path.parent.mkdir(parents=True, exist_ok=True) - descriptor, raw_path = tempfile.mkstemp( - prefix=f".{output_path.name}.", - suffix=".tmp", - dir=output_path.parent, - ) - staged_path = Path(raw_path) + descriptor, staged_path = temporary_path(output_path, ".tmp") try: with os.fdopen(descriptor, "wb") as stream: descriptor = -1 @@ -88,6 +136,62 @@ def publish_audio_bytes(audio: bytes, output_path: Path) -> None: staged_path.unlink(missing_ok=True) +def publish_audio_subtitle( + audio: bytes, + output_path: Path, + subtitle: str, + subtitle_path: Path, +) -> None: + """Publish one audio/SRT pair without exposing mismatched targets.""" + if not audio: + raise RuntimeError("TTS provider returned empty audio data") + if not subtitle.strip(): + raise RuntimeError("TTS provider returned empty subtitle data") + + audio_descriptor = -1 + subtitle_descriptor = -1 + staged_audio: Path | None = None + staged_subtitle: Path | None = None + try: + audio_descriptor, staged_audio = temporary_path(output_path, ".tmp") + subtitle_descriptor, staged_subtitle = temporary_path(subtitle_path, ".tmp") + + audio_stream = os.fdopen(audio_descriptor, "wb") + audio_descriptor = -1 + with audio_stream: + audio_stream.write(audio) + audio_stream.flush() + os.fsync(audio_stream.fileno()) + + subtitle_stream = os.fdopen( + subtitle_descriptor, + "w", + encoding="utf-8", + newline="\n", + ) + subtitle_descriptor = -1 + with subtitle_stream: + subtitle_stream.write(subtitle) + subtitle_stream.flush() + os.fsync(subtitle_stream.fileno()) + + publish_staged_pair( + staged_audio, + output_path, + staged_subtitle, + subtitle_path, + ) + finally: + if audio_descriptor >= 0: + os.close(audio_descriptor) + if subtitle_descriptor >= 0: + os.close(subtitle_descriptor) + if staged_audio is not None: + staged_audio.unlink(missing_ok=True) + if staged_subtitle is not None: + staged_subtitle.unlink(missing_ok=True) + + def extension_from_format(audio_format: str) -> str: normalized = audio_format.strip().lower() if normalized in {"mp3", "wav"}: diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/tts_backends/backend_cosyvoice.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/tts_backends/backend_cosyvoice.py index bb784ebc..e8cd7fcc 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/tts_backends/backend_cosyvoice.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/tts_backends/backend_cosyvoice.py @@ -2,14 +2,30 @@ from __future__ import annotations +import json +import math import os from pathlib import Path +from urllib import error, request -from tts_backends.backend_common import download_audio, extension_from_format, post_json, read_api_key +from tts_backends.backend_common import ( + download_audio, + extension_from_format, + get_bytes, + post_json, + publish_audio_subtitle, + read_api_key, + read_http_error, +) +from tts_backends.backend_edge import ( + DEFAULT_SUBTITLE_MAX_CHARS, + format_word_timed_srt, +) DEFAULT_ENDPOINT = "https://dashscope.aliyuncs.com/api/v1/services/audio/tts/SpeechSynthesizer" DEFAULT_MODEL = "cosyvoice-v3-flash" +_TICKS_PER_MILLISECOND = 10_000 def output_extension(audio_format: str) -> str: @@ -28,6 +44,167 @@ def resolve_url(base_url: str | None = None) -> str: return base + "/api/v1/services/audio/tts/SpeechSynthesizer" +def _parse_sse_event(data_lines: list[str]) -> dict | None: + payload = "\n".join(data_lines).strip() + if not payload or payload == "[DONE]": + return None + try: + event = json.loads(payload) + except json.JSONDecodeError as exc: + raise RuntimeError("CosyVoice streaming response contains invalid JSON") from exc + if not isinstance(event, dict): + raise RuntimeError("CosyVoice streaming event is not an object") + return event + + +def _parse_sse(raw: bytes) -> list[dict]: + try: + body = raw.decode("utf-8-sig") + except UnicodeError as exc: + raise RuntimeError("CosyVoice streaming response is not valid UTF-8") from exc + + if not any(line.startswith("data:") for line in body.splitlines()): + event = _parse_sse_event([body]) + return [event] if event is not None else [] + + events: list[dict] = [] + data_lines: list[str] = [] + for line in body.splitlines(): + if not line: + event = _parse_sse_event(data_lines) + if event is not None: + events.append(event) + data_lines = [] + continue + if line.startswith("data:"): + data_lines.append(line[5:].lstrip()) + event = _parse_sse_event(data_lines) + if event is not None: + events.append(event) + if not events: + raise RuntimeError("CosyVoice streaming response contains no events") + return events + + +def _post_streaming( + url: str, + *, + api_key: str, + payload: dict, +) -> list[dict]: + body = json.dumps(payload, ensure_ascii=False).encode("utf-8") + req = request.Request( + url, + data=body, + headers={ + "Authorization": f"Bearer {api_key}", + "Content-Type": "application/json", + "X-DashScope-SSE": "enable", + }, + method="POST", + ) + try: + with request.urlopen(req, timeout=180) as response: + return _parse_sse(response.read()) + except error.HTTPError as exc: + raise RuntimeError(read_http_error(exc)) from exc + except error.URLError as exc: + raise RuntimeError( + f"CosyVoice streaming request failed: {exc.reason}" + ) from exc + + +def _ticks(value: object, *, field: str) -> int: + if isinstance(value, bool): + raise RuntimeError(f"CosyVoice word {field} is not numeric") + try: + numeric = float(value) + except (TypeError, ValueError) as exc: + raise RuntimeError(f"CosyVoice word {field} is not numeric") from exc + if not math.isfinite(numeric): + raise RuntimeError(f"CosyVoice word {field} is not finite") + return int(round(numeric * _TICKS_PER_MILLISECOND)) + + +def _word_boundaries(events: list[dict]) -> tuple[list[dict], str]: + sentence_text: dict[int, str] = {} + sentence_words: dict[int, list] = {} + audio_url = "" + + for event in events: + code = event.get("code") + message = event.get("message") + if code or message: + details = ": ".join(str(value) for value in (code, message) if value) + raise RuntimeError(f"CosyVoice TTS failed: {details}") + output = event.get("output") or {} + if not isinstance(output, dict): + continue + audio = output.get("audio") or {} + if isinstance(audio, dict) and isinstance(audio.get("url"), str): + audio_url = audio["url"] + + sentence = output.get("sentence") or {} + if not isinstance(sentence, dict): + continue + index = sentence.get("index") + if isinstance(index, bool) or not isinstance(index, int) or index < 0: + continue + original_text = output.get("original_text") + if isinstance(original_text, str) and original_text: + sentence_text[index] = original_text + words = sentence.get("words") + if isinstance(words, list) and words: + sentence_words[index] = words + + if not audio_url: + raise RuntimeError("CosyVoice streaming response contains no audio URL") + if not sentence_words: + raise RuntimeError( + "CosyVoice returned no word timestamps. Use a cloned voice from " + "cosyvoice-v3.5-plus/flash, cosyvoice-v3-plus/flash, or cosyvoice-v2, " + "or a system voice marked as timestamp-supported; otherwise pass " + "--cosyvoice-audio-only." + ) + + boundaries: list[dict] = [] + for sentence_index in sorted(sentence_words): + original_text = sentence_text.get(sentence_index, "") + for item in sentence_words[sentence_index]: + if not isinstance(item, dict): + raise RuntimeError("CosyVoice word timing is not an object") + word = item.get("text") + begin_index = item.get("begin_index") + end_index = item.get("end_index") + if ( + original_text + and isinstance(begin_index, int) + and not isinstance(begin_index, bool) + and isinstance(end_index, int) + and not isinstance(end_index, bool) + and 0 <= begin_index < end_index <= len(original_text) + ): + word = original_text[begin_index:end_index] + if not isinstance(word, str) or not word: + raise RuntimeError("CosyVoice word timing contains no text") + start = _ticks(item.get("begin_time"), field="start time") + end = _ticks(item.get("end_time"), field="end time") + if start < 0 or end <= start: + raise RuntimeError( + "CosyVoice response contains an invalid word interval" + ) + if boundaries and start < boundaries[-1]["offset"]: + raise RuntimeError( + "CosyVoice word timestamps are not in chronological order" + ) + boundaries.append({ + "text": word, + "offset": start, + "duration": end - start, + }) + return boundaries, audio_url + + def generate( text: str, output_path: Path, @@ -43,6 +220,8 @@ def generate( instruction: str | None, language_hint: str | None, base_url: str | None, + subtitle_path: Path | None = None, + subtitle_max_chars: int = DEFAULT_SUBTITLE_MAX_CHARS, ) -> None: input_payload: dict[str, object] = { "text": text, @@ -61,13 +240,38 @@ def generate( if language_hint: input_payload["language_hints"] = [language_hint] + payload = { + "model": model, + "input": input_payload, + } + url = resolve_url(base_url) + + if subtitle_path is not None: + input_payload["word_timestamp_enabled"] = True + events = _post_streaming( + url, + api_key=api_key, + payload=payload, + ) + boundaries, audio_url = _word_boundaries(events) + subtitle = format_word_timed_srt( + text, + boundaries, + subtitle_max_chars, + provider_label="CosyVoice", + ) + publish_audio_subtitle( + get_bytes(audio_url), + output_path, + subtitle, + subtitle_path, + ) + return + data = post_json( - resolve_url(base_url), + url, headers={"Authorization": f"Bearer {api_key}"}, - payload={ - "model": model, - "input": input_payload, - }, + payload=payload, timeout=180, ) audio = (data.get("output") or {}).get("audio") or {} @@ -80,4 +284,8 @@ def generate( def print_voices() -> None: print("CosyVoice voices are selected by voice.") print("Use a system voice name or a cloned/designed voice_id from CosyVoice.") - print("Example system voice from Alibaba Cloud docs: longanyang") + print("Timestamp-supported system voice example: longanyang") + print( + "For SRT, use a supported CosyVoice cloned voice or a system voice " + "marked timestamp-supported in the provider catalog." + ) diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/tts_backends/backend_edge.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/tts_backends/backend_edge.py index 8f0e433f..8d0856e0 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/tts_backends/backend_edge.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/tts_backends/backend_edge.py @@ -4,10 +4,11 @@ from __future__ import annotations import os import re -import tempfile from dataclasses import dataclass from pathlib import Path +from tts_backends.backend_common import publish_staged_pair, temporary_path + DEFAULT_SUBTITLE_MAX_CHARS = 20 DEFAULT_BOUNDARY_OVERLAP_TOLERANCE_MS = 100 @@ -102,58 +103,6 @@ async def generate( await communicate.save(str(output_path)) -def _temporary_path(target: Path, suffix: str) -> tuple[int, Path]: - target.parent.mkdir(parents=True, exist_ok=True) - descriptor, raw_path = tempfile.mkstemp( - prefix=f".{target.name}.", - suffix=suffix, - dir=target.parent, - ) - return descriptor, Path(raw_path) - - -def _publish_pair( - staged_audio: Path, - output_path: Path, - staged_subtitle: Path, - subtitle_path: Path, -) -> None: - targets = (output_path, subtitle_path) - if output_path.resolve() == subtitle_path.resolve(): - raise ValueError("audio and subtitle outputs must use different paths") - - backups: dict[Path, Path] = {} - published: set[Path] = set() - try: - for target in targets: - if not target.exists(): - continue - descriptor, backup = _temporary_path(target, ".bak") - os.close(descriptor) - backup.unlink() - os.replace(target, backup) - backups[target] = backup - - for staged, target in ( - (staged_audio, output_path), - (staged_subtitle, subtitle_path), - ): - os.replace(staged, target) - published.add(target) - except Exception: - for target in published: - target.unlink(missing_ok=True) - for target, backup in backups.items(): - if backup.exists(): - os.replace(backup, target) - raise - finally: - staged_audio.unlink(missing_ok=True) - staged_subtitle.unlink(missing_ok=True) - for backup in backups.values(): - backup.unlink(missing_ok=True) - - def _text_key(text: str) -> str: return "".join(character.casefold() for character in text if character.isalnum()) @@ -170,13 +119,17 @@ def _source_key_positions(text: str) -> tuple[str, list[int]]: return "".join(key), positions -def _map_word_boundaries(text: str, boundaries: list[dict]) -> list[_MappedWord]: +def _map_word_boundaries( + text: str, + boundaries: list[dict], + provider_label: str, +) -> list[_MappedWord]: source_key, source_positions = _source_key_positions(text) boundary_keys = [_text_key(boundary["text"]) for boundary in boundaries] boundary_key = "".join(boundary_keys) if not source_key or source_key != boundary_key: raise RuntimeError( - "Edge TTS word boundaries could not be aligned with the narration text; " + f"{provider_label} word boundaries could not be aligned with the narration text; " "subtitle timing was not generated" ) @@ -335,6 +288,7 @@ def _clamp_small_overlaps( cues: list[_SubtitleCue], *, tolerance_ms: int = DEFAULT_BOUNDARY_OVERLAP_TOLERANCE_MS, + provider_label: str, ) -> list[_SubtitleCue]: tolerance = tolerance_ms * _TICKS_PER_MILLISECOND normalized: list[_SubtitleCue] = [] @@ -344,7 +298,7 @@ def _clamp_small_overlaps( if overlap > tolerance: overlap_ms = overlap / _TICKS_PER_MILLISECOND raise RuntimeError( - f"Edge TTS returned {overlap_ms:g} ms of overlapping " + f"{provider_label} returned {overlap_ms:g} ms of overlapping " "word-boundary timing; audio and subtitles were not published" ) cue = _SubtitleCue( @@ -354,7 +308,7 @@ def _clamp_small_overlaps( ) if cue.end <= cue.start: raise RuntimeError( - "Edge TTS returned an invalid subtitle timing interval; " + f"{provider_label} returned an invalid subtitle timing interval; " "audio and subtitles were not published" ) normalized.append(cue) @@ -365,10 +319,11 @@ def _subtitle_cues( text: str, boundaries: list[dict], max_chars: int, + provider_label: str, ) -> list[_SubtitleCue]: if max_chars < 1: raise ValueError("subtitle_max_chars must be at least 1") - words = _map_word_boundaries(text, boundaries) + words = _map_word_boundaries(text, boundaries, provider_label) spans = [ span for sentence in _sentence_spans(text) @@ -391,29 +346,29 @@ def _subtitle_cues( if assigned_word_indexes != list(range(len(words))): raise RuntimeError( - "Edge TTS word boundaries crossed subtitle split points; " + f"{provider_label} word boundaries crossed subtitle split points; " "subtitle timing was not generated" ) if not pending: - raise RuntimeError("Edge TTS produced no timed subtitle cues") + raise RuntimeError(f"{provider_label} produced no timed subtitle cues") cues: list[_SubtitleCue] = [] for index, (start, word_end, cue_text) in enumerate(pending): next_start = pending[index + 1][0] if index + 1 < len(pending) else None end = next_start if next_start is not None and next_start > word_end else word_end cues.append(_SubtitleCue(start=start, end=end, text=cue_text)) - cues = _clamp_small_overlaps(cues) + cues = _clamp_small_overlaps(cues, provider_label=provider_label) source_text = re.sub(r"\s+", "", text) subtitle_text = re.sub(r"\s+", "", "".join(cue.text for cue in cues)) if subtitle_text != source_text: raise RuntimeError( - "Generated subtitle text does not match the narration text; " + f"{provider_label} subtitle text does not match the narration text; " "audio and subtitles were not published" ) if any(_display_length(cue.text, 0, len(cue.text)) > max_chars for cue in cues): raise RuntimeError( - "A single Edge TTS word boundary exceeds the subtitle character limit; " + f"A single {provider_label} word boundary exceeds the subtitle character limit; " "audio and subtitles were not published" ) return cues @@ -439,6 +394,24 @@ def _format_srt(cues: list[_SubtitleCue]) -> str: return "\n\n".join(blocks) + "\n" +def format_word_timed_srt( + text: str, + boundaries: list[dict], + max_chars: int = DEFAULT_SUBTITLE_MAX_CHARS, + *, + provider_label: str = "Edge TTS", +) -> str: + """Regroup provider word timings into compact, text-faithful SRT cues.""" + return _format_srt( + _subtitle_cues( + text, + boundaries, + max_chars, + provider_label, + ) + ) + + async def _generate_with_subtitles( text: str, output_path: Path, @@ -470,8 +443,8 @@ async def _generate_with_subtitles( boundaries: list[dict] = [] received_audio = False try: - audio_descriptor, staged_audio = _temporary_path(output_path, ".tmp") - subtitle_descriptor, staged_subtitle = _temporary_path(subtitle_path, ".tmp") + audio_descriptor, staged_audio = temporary_path(output_path, ".tmp") + subtitle_descriptor, staged_subtitle = temporary_path(subtitle_path, ".tmp") audio_stream = os.fdopen(audio_descriptor, "wb") audio_descriptor = -1 @@ -489,7 +462,7 @@ async def _generate_with_subtitles( raise RuntimeError("Edge TTS returned no audio data") if not boundaries: raise RuntimeError("Edge TTS returned no word-boundary timing") - subtitle_text = _format_srt(_subtitle_cues(text, boundaries, max_chars)) + subtitle_text = format_word_timed_srt(text, boundaries, max_chars) subtitle_stream = os.fdopen( subtitle_descriptor, @@ -504,7 +477,7 @@ async def _generate_with_subtitles( os.fsync(subtitle_stream.fileno()) assert staged_audio is not None assert staged_subtitle is not None - _publish_pair( + publish_staged_pair( staged_audio, output_path, staged_subtitle, diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/tts_backends/backend_elevenlabs.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/tts_backends/backend_elevenlabs.py index 111c7e62..ac3619ab 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/tts_backends/backend_elevenlabs.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/tts_backends/backend_elevenlabs.py @@ -2,14 +2,27 @@ from __future__ import annotations +import base64 +import binascii import json +import math from pathlib import Path from urllib import error, request +from urllib.parse import quote, urlencode -from tts_backends.backend_common import publish_audio_bytes, read_api_key +from tts_backends.backend_common import ( + publish_audio_bytes, + publish_audio_subtitle, + read_api_key, +) +from tts_backends.backend_edge import ( + DEFAULT_SUBTITLE_MAX_CHARS, + format_word_timed_srt, +) API_BASE = "https://api.elevenlabs.io/v1" +_TICKS_PER_SECOND = 10_000_000 def read_elevenlabs_api_key(env_name: str) -> str: @@ -34,6 +47,118 @@ def _read_http_error(exc: error.HTTPError) -> str: return f"HTTP {exc.code}: {body or exc.reason}" +def _seconds_to_ticks(value: object, *, field: str) -> int: + if isinstance(value, bool): + raise RuntimeError(f"ElevenLabs alignment {field} is not numeric") + try: + numeric = float(value) + except (TypeError, ValueError) as exc: + raise RuntimeError( + f"ElevenLabs alignment {field} is not numeric" + ) from exc + if not math.isfinite(numeric): + raise RuntimeError(f"ElevenLabs alignment {field} is not finite") + return int(round(numeric * _TICKS_PER_SECOND)) + + +def _is_unspaced_character(character: str) -> bool: + """Return whether a script is safer to time one character at a time.""" + codepoint = ord(character) + return ( + 0x3040 <= codepoint <= 0x30FF + or 0x3400 <= codepoint <= 0x4DBF + or 0x4E00 <= codepoint <= 0x9FFF + or 0xAC00 <= codepoint <= 0xD7AF + or 0xF900 <= codepoint <= 0xFAFF + or 0x20000 <= codepoint <= 0x2FA1F + ) + + +def _alignment_characters( + text: str, + alignment: object, +) -> tuple[list[str], list[object], list[object]]: + if not isinstance(alignment, dict): + raise RuntimeError("ElevenLabs response contains no original-text alignment") + raw_characters = alignment.get("characters") + raw_starts = alignment.get("character_start_times_seconds") + raw_ends = alignment.get("character_end_times_seconds") + if not all(isinstance(values, list) for values in ( + raw_characters, + raw_starts, + raw_ends, + )): + raise RuntimeError("ElevenLabs alignment arrays are missing") + if not raw_characters or not ( + len(raw_characters) == len(raw_starts) == len(raw_ends) + ): + raise RuntimeError("ElevenLabs alignment arrays have inconsistent lengths") + if any(not isinstance(item, str) or not item for item in raw_characters): + raise RuntimeError("ElevenLabs alignment contains an invalid character") + if "".join(raw_characters) != text: + raise RuntimeError( + "ElevenLabs original-text alignment differs from the narration text; " + "audio and subtitles were not published" + ) + + characters: list[str] = [] + starts: list[object] = [] + ends: list[object] = [] + for raw_character, start, end in zip( + raw_characters, + raw_starts, + raw_ends, + ): + for character in raw_character: + characters.append(character) + starts.append(start) + ends.append(end) + return characters, starts, ends + + +def _word_boundaries(text: str, alignment: object) -> list[dict]: + characters, starts, ends = _alignment_characters(text, alignment) + boundaries: list[dict] = [] + index = 0 + while index < len(characters): + character = characters[index] + if not character.isalnum(): + index += 1 + continue + + token_end = index + 1 + if not _is_unspaced_character(character): + while token_end < len(characters): + following = characters[token_end] + if ( + not following.isalnum() + or _is_unspaced_character(following) + ): + break + token_end += 1 + + start = _seconds_to_ticks(starts[index], field="start time") + end = _seconds_to_ticks(ends[token_end - 1], field="end time") + if start < 0 or end <= start: + raise RuntimeError( + "ElevenLabs alignment contains an invalid character interval" + ) + if boundaries and start < boundaries[-1]["offset"]: + raise RuntimeError( + "ElevenLabs alignment is not in chronological order" + ) + boundaries.append({ + "text": "".join(characters[index:token_end]), + "offset": start, + "duration": end - start, + }) + index = token_end + + if not boundaries: + raise RuntimeError("ElevenLabs alignment contains no timed words") + return boundaries + + def generate( text: str, output_path: Path, @@ -45,7 +170,10 @@ def generate( stability: float | None, similarity_boost: float | None, style: float | None, + speed: float | None, speaker_boost: bool | None, + subtitle_path: Path | None = None, + subtitle_max_chars: int = DEFAULT_SUBTITLE_MAX_CHARS, ) -> None: payload: dict[str, object] = { "text": text, @@ -59,13 +187,19 @@ def generate( voice_settings["similarity_boost"] = similarity_boost if style is not None: voice_settings["style"] = style + if speed is not None: + voice_settings["speed"] = speed if speaker_boost is not None: voice_settings["use_speaker_boost"] = speaker_boost if voice_settings: payload["voice_settings"] = voice_settings + query = urlencode({"output_format": output_format}) + suffix = "/with-timestamps" if subtitle_path is not None else "" + url = ( + f"{API_BASE}/text-to-speech/{quote(voice_id, safe='')}{suffix}?{query}" + ) body = json.dumps(payload, ensure_ascii=False).encode("utf-8") - url = f"{API_BASE}/text-to-speech/{voice_id}?output_format={output_format}" req = request.Request( url, data=body, @@ -77,12 +211,39 @@ def generate( ) try: with request.urlopen(req, timeout=120) as response: - publish_audio_bytes(response.read(), output_path) + response_data = response.read() except error.HTTPError as exc: raise RuntimeError(_read_http_error(exc)) from exc except error.URLError as exc: raise RuntimeError(f"ElevenLabs request failed: {exc.reason}") from exc + if subtitle_path is None: + publish_audio_bytes(response_data, output_path) + return + + try: + data = json.loads(response_data.decode("utf-8")) + except (UnicodeError, json.JSONDecodeError) as exc: + raise RuntimeError( + "ElevenLabs timing response is not valid UTF-8 JSON" + ) from exc + encoded_audio = data.get("audio_base64") + if not isinstance(encoded_audio, str) or not encoded_audio: + raise RuntimeError("ElevenLabs timing response contains no audio") + try: + audio = base64.b64decode(encoded_audio, validate=True) + except (binascii.Error, ValueError) as exc: + raise RuntimeError( + "ElevenLabs timing response audio is not valid base64" + ) from exc + subtitle = format_word_timed_srt( + text, + _word_boundaries(text, data.get("alignment")), + subtitle_max_chars, + provider_label="ElevenLabs", + ) + publish_audio_subtitle(audio, output_path, subtitle, subtitle_path) + def print_voices(api_key: str) -> None: req = request.Request( diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/tts_backends/backend_minimax.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/tts_backends/backend_minimax.py index 99d2b6d2..46b7dd65 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/tts_backends/backend_minimax.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/tts_backends/backend_minimax.py @@ -3,19 +3,28 @@ from __future__ import annotations import binascii +import json +import math import os from pathlib import Path from tts_backends.backend_common import ( extension_from_format, + get_bytes, post_json, publish_audio_bytes, + publish_audio_subtitle, read_api_key, ) +from tts_backends.backend_edge import ( + DEFAULT_SUBTITLE_MAX_CHARS, + format_word_timed_srt, +) DEFAULT_ENDPOINT = "https://api.minimaxi.com/v1/t2a_v2" DEFAULT_MODEL = "speech-2.8-hd" +_TICKS_PER_MILLISECOND = 10_000 # International fallback: set MINIMAX_TTS_BASE_URL=https://api.minimax.io if needed. @@ -37,6 +46,70 @@ def resolve_url(base_url: str | None = None) -> str: return base + "/v1/t2a_v2" +def _ticks(value: object, *, field: str) -> int: + if isinstance(value, bool): + raise RuntimeError(f"MiniMax subtitle {field} is not numeric") + try: + numeric = float(value) + except (TypeError, ValueError) as exc: + raise RuntimeError(f"MiniMax subtitle {field} is not numeric") from exc + if not math.isfinite(numeric): + raise RuntimeError(f"MiniMax subtitle {field} is not finite") + return int(round(numeric * _TICKS_PER_MILLISECOND)) + + +def _word_boundaries(raw: object) -> list[dict]: + if not isinstance(raw, list) or not raw: + raise RuntimeError("MiniMax subtitle response contains no sentence blocks") + + boundaries: list[dict] = [] + for sentence in raw: + if not isinstance(sentence, dict): + raise RuntimeError("MiniMax subtitle sentence block is not an object") + words = sentence.get("timestamped_words") + if not isinstance(words, list) or not words: + raise RuntimeError("MiniMax subtitle sentence block contains no word timings") + for item in words: + if not isinstance(item, dict): + raise RuntimeError("MiniMax subtitle word timing is not an object") + word = item.get("word") + if not isinstance(word, str) or not word: + raise RuntimeError("MiniMax subtitle word timing contains no text") + start = _ticks(item.get("time_begin"), field="start time") + end = _ticks(item.get("time_end"), field="end time") + if start < 0 or end <= start: + raise RuntimeError( + "MiniMax subtitle response contains an invalid word interval" + ) + if boundaries and start < boundaries[-1]["offset"]: + raise RuntimeError("MiniMax subtitle words are not in chronological order") + boundaries.append( + { + "text": word, + "offset": start, + "duration": end - start, + } + ) + return boundaries + + +def _download_subtitle( + url: str, + text: str, + max_chars: int, +) -> str: + try: + raw = json.loads(get_bytes(url).decode("utf-8-sig")) + except (UnicodeError, json.JSONDecodeError) as exc: + raise RuntimeError("MiniMax subtitle response is not valid UTF-8 JSON") from exc + return format_word_timed_srt( + text, + _word_boundaries(raw), + max_chars, + provider_label="MiniMax", + ) + + def generate( text: str, output_path: Path, @@ -53,6 +126,8 @@ def generate( pitch: int, language_boost: str, base_url: str | None, + subtitle_path: Path | None = None, + subtitle_max_chars: int = DEFAULT_SUBTITLE_MAX_CHARS, ) -> None: payload = { "model": model, @@ -73,6 +148,10 @@ def generate( "channel": channel, }, } + if subtitle_path is not None: + payload["subtitle_enable"] = True + payload["subtitle_type"] = "word" + data = post_json( resolve_url(base_url), headers={"Authorization": f"Bearer {api_key}"}, @@ -83,14 +162,31 @@ def generate( if base_resp.get("status_code") not in (None, 0, "0"): raise RuntimeError(f"MiniMax TTS failed: {data}") - audio_hex = (data.get("data") or {}).get("audio") + response_data = data.get("data") or {} + audio_hex = response_data.get("audio") if not audio_hex: raise RuntimeError(f"MiniMax response missing audio data: {data}") try: audio = binascii.unhexlify(audio_hex) except (binascii.Error, ValueError) as exc: raise RuntimeError("MiniMax response audio is not valid hex data") from exc - publish_audio_bytes(audio, output_path) + + if subtitle_path is None: + publish_audio_bytes(audio, output_path) + return + + subtitle_url = response_data.get("subtitle_file") + if not isinstance(subtitle_url, str) or not subtitle_url.strip(): + trace_id = data.get("trace_id") or "unknown" + raise RuntimeError( + f"MiniMax response missing subtitle file (trace_id={trace_id})" + ) + subtitle = _download_subtitle( + subtitle_url, + text, + subtitle_max_chars, + ) + publish_audio_subtitle(audio, output_path, subtitle, subtitle_path) def print_voices() -> None: diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/tts_backends/backend_qwen.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/tts_backends/backend_qwen.py index 04f2c413..325abdba 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/tts_backends/backend_qwen.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/tts_backends/backend_qwen.py @@ -72,4 +72,4 @@ def print_voices() -> None: print("Qwen TTS voices are selected by voice.") print("Use a system voice name or a cloned voice from Qwen voice cloning.") print("Example system voice from Alibaba Cloud docs: Cherry") - + print("Current Qwen TTS responses do not include word/character timestamps.") diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/video_subtitles.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/video_subtitles.py index 1335f75d..9fe6f05c 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/video_subtitles.py +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/video_subtitles.py @@ -2,7 +2,7 @@ """ PPT Master - Final Video Subtitles -Align the exact narration text frozen in page-local Edge SRT files against the +Align the exact narration text frozen in page-local narration SRT files against the audio track of a finished PowerPoint-exported video. This produces a delivery SRT from the actual video timeline without rewriting speaker notes or relying on theoretical slide offsets. @@ -189,7 +189,7 @@ def _page_subtitle_paths(subtitle_dir: Path) -> list[Path]: ] if not paths: raise FileNotFoundError( - f"No page-local Edge SRT files found under {subtitle_dir}" + f"No page-local narration SRT files found under {subtitle_dir}" ) return paths @@ -321,7 +321,7 @@ def build_parser() -> argparse.ArgumentParser: parser.add_argument( "--subtitle-dir", default=None, - help="Page-local Edge SRT directory; default: /notes/subtitles", + help="Page-local narration SRT directory; default: /audio", ) parser.add_argument( "-o", @@ -367,7 +367,7 @@ def main(argv: list[str] | None = None) -> int: subtitle_dir = ( Path(args.subtitle_dir) if args.subtitle_dir - else Path("notes/subtitles") + else Path("audio") ) if not subtitle_dir.is_absolute(): subtitle_dir = project_path / subtitle_dir diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/visualization_catalog.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/visualization_catalog.py new file mode 100644 index 00000000..a76e11f9 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/visualization_catalog.py @@ -0,0 +1,363 @@ +#!/usr/bin/env python3 +""" +PPT Master - Visualization Catalog Resolver + +Resolve chart and table references from their live family indexes. + +Historical ``page_charts`` structure keys remain readable as intent-only +compatibility values. They do not resolve to SVG assets and are never part of +the live recall catalog. + +Usage: + Import load_visualization_entries() or resolve_visualization_reference(). + +Examples: + from visualization_catalog import resolve_visualization_reference + +Dependencies: + None (only uses the standard library) +""" + +from __future__ import annotations + +import json +import re +import sys +from dataclasses import dataclass +from pathlib import Path +from typing import Iterable + + +_SCRIPTS_DIR = Path(__file__).resolve().parent +_TEMPLATES_DIR = _SCRIPTS_DIR.parent / "templates" +_KEY_RE = re.compile(r"^[a-z0-9]+(?:_[a-z0-9]+)*$") +_FAMILY_SPECS = { + "chart": ("charts", "charts_index.json", "charts"), + "table": ("tables", "tables_index.json", "tables"), +} +VISUALIZATION_SVG_KIND = "visualization-svg" +LEGACY_STRUCTURE_INTENT_KIND = "legacy-structure-intent" + +# Frozen from the 36 Structure entries published in origin/main's historical +# broad charts catalog. Keep this exact allowlist: later split-only aliases and +# generated Structure keys were never part of that public compatibility input. +_LEGACY_STRUCTURE_INTENT_KEYS = frozenset( + { + "agenda_list", + "arc_anchored_list", + "chevron_chain_with_tail", + "chevron_process", + "circular_stages", + "client_server_flow", + "comparison_columns", + "concentric_circles", + "fishbone_diagram", + "hub_inward_arrows", + "hub_spoke", + "icon_grid", + "isometric_stairs", + "journey_map", + "kpi_cards", + "labeled_card", + "layered_architecture", + "mind_map", + "module_composition", + "numbered_steps", + "pipeline_with_stages", + "process_flow", + "pros_cons_chart", + "pyramid_chart", + "pyramid_isometric", + "quadrant_bubble_scatter", + "quadrant_text_bullets", + "roadmap_vertical", + "segmented_wheel", + "snake_flow", + "team_roster", + "timeline", + "top_down_tree", + "venn_diagram", + "vertical_list", + "vertical_pillars", + } +) + + +class VisualizationCatalogError(RuntimeError): + """Reject an unreadable, malformed, missing, or ambiguous reference.""" + + +@dataclass(frozen=True) +class VisualizationEntry: + """One live SVG entry or one frozen legacy Structure intent.""" + + family: str + key: str + summary: str + path: Path | None + kind: str = VISUALIZATION_SVG_KIND + + @property + def reference(self) -> str: + """Return the canonical live ``family/key`` reference.""" + if self.kind != VISUALIZATION_SVG_KIND: + raise VisualizationCatalogError( + f"legacy Structure intent {self.key!r} has no canonical reference" + ) + return f"{self.family}/{self.key}" + + @property + def display_path(self) -> str: + """Return the Skill-relative SVG path.""" + if self.path is None: + raise VisualizationCatalogError( + f"{self.key!r} is a legacy Structure intent without an SVG path" + ) + return self.path.relative_to(_SCRIPTS_DIR.parent).as_posix() + + +@dataclass(frozen=True) +class VisualizationCatalog: + """Canonical entries plus family-local compatibility aliases.""" + + entries: dict[str, VisualizationEntry] + aliases: dict[str, str] + + +def visualization_families() -> tuple[str, ...]: + """Return the stable live visualization family order.""" + return tuple(_FAMILY_SPECS) + + +def legacy_structure_intent_keys() -> tuple[str, ...]: + """Return the frozen legacy ``page_charts`` Structure bare keys.""" + return tuple(sorted(_LEGACY_STRUCTURE_INTENT_KEYS)) + + +def _normalize_families(families: Iterable[str] | None) -> tuple[str, ...]: + requested = visualization_families() if families is None else tuple(families) + normalized: list[str] = [] + for raw_family in requested: + family = str(raw_family).strip().casefold() + if family not in _FAMILY_SPECS: + allowed = ", ".join(visualization_families()) + raise VisualizationCatalogError( + f"unknown visualization family {raw_family!r}; expected one of {allowed}" + ) + if family not in normalized: + normalized.append(family) + if not normalized: + raise VisualizationCatalogError("at least one visualization family is required") + return tuple(normalized) + + +def _load_family(family: str) -> tuple[dict[str, VisualizationEntry], dict[str, str]]: + directory_name, index_name, object_key = _FAMILY_SPECS[family] + family_dir = _TEMPLATES_DIR / directory_name + index_path = family_dir / index_name + try: + payload = json.loads(index_path.read_text(encoding="utf-8")) + except (OSError, json.JSONDecodeError) as exc: + raise VisualizationCatalogError( + f"cannot read {family} catalog {index_path}: {exc}" + ) from exc + if not isinstance(payload, dict): + raise VisualizationCatalogError(f"{family} catalog root must be an object") + raw_entries = payload.get(object_key) + if not isinstance(raw_entries, dict): + raise VisualizationCatalogError( + f"{family} catalog {index_path} has no '{object_key}' object" + ) + + entries: dict[str, VisualizationEntry] = {} + for raw_key, raw_item in raw_entries.items(): + if ( + not isinstance(raw_key, str) + or _KEY_RE.fullmatch(raw_key) is None + or not isinstance(raw_item, dict) + ): + raise VisualizationCatalogError( + f"{family} catalog entry {raw_key!r} is malformed" + ) + summary = raw_item.get("summary") + if not isinstance(summary, str) or not summary.strip(): + raise VisualizationCatalogError( + f"{family} catalog entry {raw_key!r} has no non-empty summary" + ) + entry = VisualizationEntry( + family=family, + key=raw_key, + summary=summary.strip(), + path=(family_dir / f"{raw_key}.svg").resolve(), + ) + entries[entry.reference] = entry + + raw_aliases = payload.get("aliases", {}) + if not isinstance(raw_aliases, dict): + raise VisualizationCatalogError(f"{family} catalog aliases must be an object") + aliases: dict[str, str] = {} + for raw_alias, raw_target in raw_aliases.items(): + if ( + not isinstance(raw_alias, str) + or _KEY_RE.fullmatch(raw_alias) is None + or not isinstance(raw_target, str) + or _KEY_RE.fullmatch(raw_target) is None + ): + raise VisualizationCatalogError( + f"{family} catalog alias {raw_alias!r} is malformed" + ) + target_reference = f"{family}/{raw_target}" + if raw_alias in raw_entries: + raise VisualizationCatalogError( + f"{family} alias {raw_alias!r} collides with a canonical key" + ) + if target_reference not in entries: + raise VisualizationCatalogError( + f"{family} alias {raw_alias!r} targets missing key {raw_target!r}" + ) + aliases[f"{family}/{raw_alias}"] = target_reference + return entries, aliases + + +def load_visualization_catalog( + families: Iterable[str] | None = None, +) -> VisualizationCatalog: + """Load selected live family registries.""" + selected = _normalize_families(families) + entries: dict[str, VisualizationEntry] = {} + aliases: dict[str, str] = {} + for family in selected: + family_entries, family_aliases = _load_family(family) + entries.update(family_entries) + aliases.update(family_aliases) + if not entries: + shown = ", ".join(selected) + raise VisualizationCatalogError( + f"no visualization entries are available for family selection {shown}" + ) + return VisualizationCatalog(entries=entries, aliases=aliases) + + +def load_visualization_entries( + families: Iterable[str] | None = None, +) -> dict[str, VisualizationEntry]: + """Return canonical entries keyed by ``family/key``.""" + return load_visualization_catalog(families).entries + + +def _require_svg(entry: VisualizationEntry) -> VisualizationEntry: + if entry.kind != VISUALIZATION_SVG_KIND: + raise VisualizationCatalogError( + f"{entry.family}/{entry.key} has unsupported kind {entry.kind!r}" + ) + if entry.path is None: + raise VisualizationCatalogError(f"{entry.reference!r} has no SVG asset path") + if entry.path.suffix.casefold() != ".svg" or not entry.path.is_file(): + raise VisualizationCatalogError( + f"{entry.reference!r} has no SVG asset at {entry.path}" + ) + return entry + + +def resolve_visualization_reference( + value: str, + *, + allow_legacy_bare: bool = False, +) -> VisualizationEntry: + """Resolve one live ``family/key`` or supported legacy bare key. + + Legacy Structure intents are accepted only when ``allow_legacy_bare`` is + true. A qualified ``structure/`` is never a live reference. + """ + normalized = str(value).strip().casefold() + if not normalized: + raise VisualizationCatalogError("visualization reference must not be empty") + + catalog = load_visualization_catalog() + if "/" in normalized: + family, separator, key = normalized.partition("/") + if ( + not separator + or family not in _FAMILY_SPECS + or _KEY_RE.fullmatch(key) is None + or "/" in key + ): + raise VisualizationCatalogError( + f"invalid canonical visualization reference {value!r}" + ) + reference = f"{family}/{key}" + entry = catalog.entries.get(reference) + if entry is None: + if reference in catalog.aliases: + raise VisualizationCatalogError( + f"{value!r} is a legacy alias; use {catalog.aliases[reference]!r}" + ) + raise VisualizationCatalogError( + f"canonical visualization reference {value!r} is not registered" + ) + return _require_svg(entry) + + if not allow_legacy_bare: + raise VisualizationCatalogError( + f"{value!r} must use canonical family/key grammar" + ) + if _KEY_RE.fullmatch(normalized) is None: + raise VisualizationCatalogError(f"invalid legacy visualization key {value!r}") + + matches = [ + entry + for entry in catalog.entries.values() + if entry.key == normalized + ] + for alias_reference, target_reference in catalog.aliases.items(): + _, alias = alias_reference.split("/", 1) + if alias == normalized: + matches.append(catalog.entries[target_reference]) + if normalized in _LEGACY_STRUCTURE_INTENT_KEYS: + matches.append( + VisualizationEntry( + family="structure", + key=normalized, + summary=( + "Frozen legacy page_charts Structure intent; author the " + "page structure from its semantic relationships." + ), + path=None, + kind=LEGACY_STRUCTURE_INTENT_KIND, + ) + ) + unique_matches = { + (entry.kind, entry.family, entry.key): entry + for entry in matches + } + if not unique_matches: + raise VisualizationCatalogError( + f"legacy visualization key {value!r} is not registered" + ) + if len(unique_matches) > 1: + candidates = ", ".join( + f"{family}/{key} ({kind})" + for kind, family, key in sorted(unique_matches) + ) + raise VisualizationCatalogError( + f"legacy visualization key {value!r} is ambiguous across {candidates}" + ) + resolved = next(iter(unique_matches.values())) + if resolved.kind == LEGACY_STRUCTURE_INTENT_KIND: + if resolved.path is not None: + raise VisualizationCatalogError( + f"legacy Structure intent {resolved.key!r} must not have an asset path" + ) + return resolved + return _require_svg(resolved) + + +if __name__ == "__main__": + from console_encoding import configure_utf8_stdio + + configure_utf8_stdio() + print( + "Use visualization_catalog via visualization_recall.py or project_manager.py.", + file=sys.stderr, + ) + raise SystemExit(2) diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/visualization_recall.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/visualization_recall.py new file mode 100644 index 00000000..e22f4de7 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/visualization_recall.py @@ -0,0 +1,486 @@ +#!/usr/bin/env python3 +""" +PPT Master - Visualization Candidate Recall + +Recall a deterministic chart or table shortlist from semantic tags, or validate +selected references against the live family catalogs. + +Usage: + python3 scripts/visualization_recall.py recall --page P03 --tag "time series" --tag "three metrics" --tag "trend" + python3 scripts/visualization_recall.py validate chart/line_chart table/record_table + +Examples: + python3 scripts/visualization_recall.py recall --page P07 --family table \ + --tag "option comparison" --tag "shared criteria" \ + --tag "cell values" --limit 6 + python3 scripts/visualization_recall.py validate table/record_table + python3 scripts/visualization_recall.py validate --legacy-bare process_flow + +Dependencies: + None (only uses the standard library) + +See scripts/docs/visualization-recall.md for the planning workflow and output contract. +""" + +from __future__ import annotations + +import argparse +import json +import re +import sys +import unicodedata +from typing import Optional + +from console_encoding import configure_utf8_stdio +from visualization_catalog import ( + LEGACY_STRUCTURE_INTENT_KIND, + VISUALIZATION_SVG_KIND, + VisualizationCatalogError, + VisualizationEntry, + load_visualization_entries, + resolve_visualization_reference, + visualization_families, +) + +configure_utf8_stdio() + +_TOKEN_RE = re.compile(r"[a-z0-9]+") +_PAGE_RE = re.compile(r"^P\d{2,}$") +_SKIP_RE = re.compile(r"\bskip\s+(?:if|for)\b", re.IGNORECASE) +_STOP_WORDS = { + "a", + "an", + "and", + "as", + "at", + "by", + "for", + "from", + "if", + "in", + "into", + "of", + "on", + "or", + "per", + "the", + "to", + "use", + "with", +} + + +def _normalize(text: str) -> str: + normalized = unicodedata.normalize("NFKC", text).casefold().replace("_", " ") + return " ".join(_TOKEN_RE.findall(normalized)) + + +def _stem(token: str) -> str: + if len(token) > 5 and token.endswith("ies"): + return token[:-3] + "y" + if len(token) > 5 and token.endswith("ing"): + return token[:-3] + if len(token) > 4 and token.endswith("ed"): + return token[:-2] + if len(token) > 4 and token.endswith("es"): + return token[:-2] + if len(token) > 3 and token.endswith("s"): + return token[:-1] + return token + + +def _tokens(text: str) -> set[str]: + return { + _stem(token) + for token in _TOKEN_RE.findall(_normalize(text)) + if token not in _STOP_WORDS + } + + +def _selected_families(family: str) -> tuple[str, ...]: + return visualization_families() if family == "all" else (family,) + + +def load_catalog(family: str = "all") -> dict[str, VisualizationEntry]: + """Load the selected live family catalogs.""" + return load_visualization_entries( + _selected_families(family), + ) + + +def _score_candidate( + key: str, + summary: str, + tags: list[str], +) -> tuple[int, list[str]]: + skip_match = _SKIP_RE.search(summary) + if skip_match is None: + pick_clause, skip_clause = summary, "" + else: + pick_clause = summary[:skip_match.start()] + skip_clause = summary[skip_match.start():] + key_text = _normalize(key) + pick_text = _normalize(pick_clause) + skip_text = _normalize(skip_clause) + key_tokens = _tokens(key) + pick_tokens = _tokens(pick_clause) + skip_tokens = _tokens(skip_clause) + score = 0 + matched_tags: list[str] = [] + + for tag in tags: + tag_text = _normalize(tag) + tag_tokens = _tokens(tag) + positive_score = 0 + negative_score = 0 + if tag_text and tag_text in key_text: + positive_score += 20 + elif tag_text and tag_text in pick_text: + positive_score += 14 + if tag_text and tag_text in skip_text: + negative_score += 12 + + for token in tag_tokens: + if token in key_tokens: + positive_score += 9 + elif token in pick_tokens: + positive_score += 5 + if token in skip_tokens: + negative_score += 6 + + if positive_score: + matched_tags.append(tag) + score += positive_score - negative_score + + return score, matched_tags + + +def _candidate_payload( + entry: VisualizationEntry, + score: int, + matched_tags: list[str], + *, + legacy_output: bool, +) -> dict[str, object]: + payload: dict[str, object] = { + "key": entry.key, + "path": entry.display_path, + "summary": entry.summary, + "score": score, + "matched_tags": matched_tags, + } + if not legacy_output: + payload.update( + { + "family": entry.family, + "reference": entry.reference, + } + ) + return payload + + +def _validation_payload(entry: VisualizationEntry) -> dict[str, object]: + """Describe one resolution without inventing an asset for intent-only keys.""" + payload: dict[str, object] = { + "family": entry.family, + "key": entry.key, + "kind": entry.kind, + } + if entry.kind == VISUALIZATION_SVG_KIND: + payload.update( + { + "path": entry.display_path, + "reference": entry.reference, + } + ) + elif entry.kind != LEGACY_STRUCTURE_INTENT_KIND: + raise VisualizationCatalogError( + f"{entry.key!r} resolves to unsupported kind {entry.kind!r}" + ) + return payload + + +def recall_candidates( + page: str, + tags: list[str], + limit: int, + *, + family: str = "all", + force_semantic_fallback: bool = False, + legacy_output: bool = False, +) -> dict[str, object]: + """Recall a deterministic shortlist for one page.""" + entries = load_catalog(family) + scored: list[tuple[int, VisualizationEntry, list[str]]] = [] + for entry in entries.values(): + score, matched_tags = _score_candidate(entry.key, entry.summary, tags) + if score > 0 and matched_tags: + scored.append((score, entry, matched_tags)) + scored.sort(key=lambda item: (-item[0], item[1].family, item[1].key)) + + candidates = [ + _candidate_payload( + entry, + score, + matched_tags, + legacy_output=legacy_output, + ) + for score, entry, matched_tags in scored[:limit] + ] + + top_score = candidates[0]["score"] if candidates else 0 + if top_score >= 35: + confidence = "high" + elif top_score >= 15: + confidence = "medium" + elif top_score > 0: + confidence = "low" + else: + confidence = "none" + + fallback_required_before_no_match = ( + confidence in {"low", "none"} and not force_semantic_fallback + ) + if fallback_required_before_no_match: + no_match_instruction = ( + f"Lexical confidence is {confidence}. Select a bounded candidate when one " + "fits; otherwise rerun the same recall with --semantic-fallback before " + "keeping no-template-match. Keep the final negative result out of Design " + "Spec Section VII and describe the chosen fallback in the page's Section " + "IX block." + ) + else: + no_match_instruction = ( + "Use when none of the reviewed candidates fits the page structure. Keep " + "this result out of Design Spec Section VII and describe the chosen fallback " + "in the page's Section IX block." + ) + + result: dict[str, object] = { + "page": page, + "semantic_tags": tags, + "confidence": confidence, + "candidates": candidates, + "no_template_match": { + "allowed": not fallback_required_before_no_match, + "key": "no-template-match", + "instruction": no_match_instruction, + }, + } + if not legacy_output: + result["family_filter"] = family + if force_semantic_fallback: + if legacy_output: + catalog: object = { + entry.key: entry.summary + for entry in sorted(entries.values(), key=lambda item: item.key) + } + else: + catalog = { + entry.reference: { + "family": entry.family, + "key": entry.key, + "path": entry.display_path, + "summary": entry.summary, + } + for entry in sorted( + entries.values(), + key=lambda item: (item.family, item.key), + ) + } + result["semantic_fallback"] = { + "reason": "requested-after-bounded-review", + "instruction": ( + "Semantically compare the page tags with every returned selection rule. " + "Choose one exact catalog reference or keep no-template-match; lexical " + "overlap is not required in this review." + ), + "reference_pattern": "family/key", + "catalog": catalog, + } + return result + + +def _dedupe(values: list[str]) -> list[str]: + result: list[str] = [] + seen: set[str] = set() + for value in values: + stripped = value.strip() + normalized = _normalize(stripped) + if not stripped or not normalized or normalized in seen: + continue + seen.add(normalized) + result.append(stripped) + return result + + +def _run_recall(args: argparse.Namespace) -> int: + page = args.page.upper() + if not _PAGE_RE.fullmatch(page): + print("Error: --page must match P, for example P03.", file=sys.stderr) + return 2 + + tags = _dedupe(args.tag) + if not 3 <= len(tags) <= 8: + print("Error: recall requires 3-8 distinct non-empty --tag values.", file=sys.stderr) + return 2 + + result = recall_candidates( + page, + tags, + args.limit, + family=args.family, + force_semantic_fallback=args.semantic_fallback, + legacy_output=args.legacy_output, + ) + print(json.dumps(result, ensure_ascii=False, indent=2, sort_keys=True)) + return 0 + + +def _resolve_validation_value( + raw: str, + family: str, + *, + allow_legacy_bare: bool, +) -> VisualizationEntry: + if "/" in raw: + return resolve_visualization_reference(raw) + if family != "all": + return resolve_visualization_reference(f"{family}/{raw}") + return resolve_visualization_reference( + raw, + allow_legacy_bare=allow_legacy_bare, + ) + + +def _run_validate(args: argparse.Namespace) -> int: + selected = _dedupe(args.keys) + invalid: list[str] = [] + valid_entries: list[tuple[str, VisualizationEntry]] = [] + for value in selected: + try: + valid_entries.append( + ( + value, + _resolve_validation_value( + value, + args.family, + allow_legacy_bare=args.legacy_bare, + ), + ) + ) + except VisualizationCatalogError: + invalid.append(value) + + if args.legacy_output: + valid: object = sorted(raw for raw, _entry in valid_entries) + else: + valid = [ + _validation_payload(entry) + for _raw, entry in sorted( + valid_entries, + key=lambda item: (item[1].kind, item[1].family, item[1].key), + ) + ] + result: dict[str, object] = {"invalid": sorted(invalid), "valid": valid} + if args.legacy_output: + result["resolved"] = [ + {"input": raw, **_validation_payload(entry)} + for raw, entry in sorted(valid_entries, key=lambda item: item[0]) + ] + print(json.dumps(result, ensure_ascii=False, indent=2, sort_keys=True)) + if invalid: + mapping_name = ( + "page_charts" + if args.legacy_output or args.legacy_bare + else "page_visualizations" + ) + print( + "Error: replace each invalid reference with one returned by recall, or " + f"keep no-template-match out of Section VII and {mapping_name} while " + "recording the custom fallback in the page's Section IX block.", + file=sys.stderr, + ) + return 1 + return 0 + + +def _add_family_argument(parser: argparse.ArgumentParser) -> None: + parser.add_argument( + "--family", + choices=("all",) + visualization_families(), + default="all", + help="Limit candidates to one family (default: all).", + ) + + +def build_parser(*, legacy_output: bool = False) -> argparse.ArgumentParser: + description = ( + "Recall legacy chart-catalog candidates or validate selected keys." + if legacy_output + else "Recall visualization candidates or validate selected references." + ) + parser = argparse.ArgumentParser( + description=description, + formatter_class=argparse.RawDescriptionHelpFormatter, + ) + parser.set_defaults(legacy_output=legacy_output) + subparsers = parser.add_subparsers(dest="command", required=True) + + recall = subparsers.add_parser("recall", help="Recall candidates for one page.") + recall.add_argument("--page", required=True, help="Planned page key, for example P03.") + recall.add_argument( + "--tag", + action="append", + required=True, + help="English semantic content-shape tag; repeat 3-8 times.", + ) + recall.add_argument( + "--limit", + type=int, + choices=range(3, 9), + default=6, + metavar="3..8", + help="Candidate count (default: 6).", + ) + recall.add_argument( + "--semantic-fallback", + action="store_true", + help="Include the selected live catalogs after a low-confidence review.", + ) + _add_family_argument(recall) + recall.set_defaults(handler=_run_recall) + + validate = subparsers.add_parser("validate", help="Validate selected references.") + validate.add_argument("keys", nargs="+", help="One or more keys or family/key references.") + validate.add_argument( + "--legacy-bare", + action="store_true", + default=legacy_output, + help=( + argparse.SUPPRESS + if legacy_output + else "Allow unqualified keys from an existing legacy page_charts mapping." + ), + ) + _add_family_argument(validate) + validate.set_defaults(handler=_run_validate) + return parser + + +def main( + argv: Optional[list[str]] = None, + *, + legacy_output: bool = False, +) -> int: + parser = build_parser(legacy_output=legacy_output) + args = parser.parse_args(argv) + try: + return args.handler(args) + except VisualizationCatalogError as exc: + print(f"Error: {exc}", file=sys.stderr) + return 1 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/README.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/README.md index b1e130a2..5fb8fa81 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/README.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/README.md @@ -52,8 +52,8 @@ can always switch modes. The page accepts one registered choice per kind plus one supplied-root choice. A registered exact root is `library`; any other exact root is `explicit`. After that combined confirmation, [`apply-template-workspace`](../workflows/stages/apply-template-workspace.md) -validates, fuses, and installs every selected workspace into the current -project before Stage 2 starts. Template-aware reading begins in final Stage 2 from +validates and installs every selected workspace into the current +project as its own `design_spec...md` before Stage 2 starts. Template-aware reading begins in final Stage 2 from that project-local copy. Quick skips the page, applies supplied exact roots, and otherwise uses free design. @@ -65,7 +65,7 @@ otherwise uses free design. | Selection source | `library` / `explicit` | Step-3 discovery provenance only: exact index-derived root or exact unregistered root; it does not change template semantics | | Internal creation strategy | `standard` / `fidelity` / `mirror` | AI-derived Create Layout/Create Deck implementation: newly author a compact or broad roster, or materialize validated source-package facts into a new workspace; persisted for tools, never presented as a required user choice | | Internal application plan | `template_reuse_scope` plus optional `template_adherence` | Strategist derives literal, structural, or style-only use and any strict/adaptive exporter behavior after inspecting the installed template and current content | -| PPTX structure | `flat` / `structured` | Derived application plans that use template structure compile declared Masters and Layouts; Style-only, style-scope, brand-only, and free design remain Slide-local. Style fused with Layout/Deck does not change the non-Style structure plan. | +| PPTX structure | `flat` / `structured` | Derived application plans that use template structure compile declared Masters and Layouts; Style-only, style-scope, brand-only, and free design remain Slide-local. A Style installed alongside Layout/Deck does not change the non-Style structure plan. | These axes must not be used as synonyms or exposed as a user mode matrix. In particular, a mirror-created deck is still an ordinary reusable `deck` package @@ -92,7 +92,7 @@ Style narrows this shared routing shape to `templates/design_spec.md` only and does not carry asset or review payloads; initialized-project sibling scaffolding may exist but is not Style input. The conditional [`apply-template-workspace`](../workflows/stages/apply-template-workspace.md) -stage owns installation and fusion after a non-free Default Stage-1 selection or +stage owns installation after a non-free Default Stage-1 selection or on the Quick exact-root branch. Brand/Layout/Deck consume package-owned `templates/`, `images/`, and `icons/`; Style consumes only `templates/design_spec.md` and ignores sibling project scaffolding. Every kind @@ -116,23 +116,22 @@ effects and PowerPoint interfaces loaded only when triggered. ## Visualization Templates -The `charts/` directory contains the registered visualization templates. For backward compatibility, the directory name remains `charts/`, but its scope includes charts, infographics, process diagrams, relationship diagrams, strategic frameworks, and system architecture diagrams: +Page-local Shape-first references are catalog families, not reusable template +kinds: -- KPI Cards -- Bar Chart / Stacked Bar Chart -- Line Chart / Dual-Axis Line Chart -- Donut Chart -- Radar Chart -- Funnel Chart -- Matrix (2x2) -- Timeline -- Gantt Chart -- Process Flow -- Org Chart -- Layered Architecture / Module Composition / Hub with Described Spokes / Pipeline with Stages / Client-Server Flow +| Family | Owns | Directory | Index | +|---|---|---|---| +| Chart | Value-driven geometry (33) | [`charts/`](./charts/) | [`charts_index.json`](./charts/charts_index.json) | +| Table | Row × column fact grid (6) | [`tables/`](./tables/) | [`tables_index.json`](./tables/tables_index.json) | -- **Library index (single source of truth)**: [charts/charts_index.json](./charts/charts_index.json) -- **Directory overview**: [charts/README.md](./charts/README.md) +[`VISUALIZATION_TEMPLATE_AUTHORING.md`](./VISUALIZATION_TEMPLATE_AUTHORING.md) +is the shared authoring contract. Each index owns family membership and +selection rules. + +Qualitative Structure is a Slide-local Executor method rather than a catalog: +Default and Quick both derive its relationship model and compose shapes for the +current page. Only [`layouts/`](./layouts/) owns reusable Master/Layout, page +types, slots, and placeholders. ## Icon Library diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/CHART_STYLE_GUIDE.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/VISUALIZATION_TEMPLATE_AUTHORING.md similarity index 53% rename from plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/CHART_STYLE_GUIDE.md rename to plugins/codex/plugins/ppt-master/skills/ppt-master/templates/VISUALIZATION_TEMPLATE_AUTHORING.md index 24553d21..ba380d64 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/CHART_STYLE_GUIDE.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/VISUALIZATION_TEMPLATE_AUTHORING.md @@ -1,17 +1,37 @@ -# Chart Template Authoring Guide +# Visualization Template Authoring Guide -`templates/charts/` 的模板负责可视化结构、数据编码和信息关系,不负责最终项目风格。模板必须保持源码可读、独立可渲染,并允许 Executor 根据项目 Design Spec 与 `spec_lock.md` 重做字体、配色和装饰。 +这是供维护者审阅的中文指南,因此放在两个 Visualization catalog 的共同父目录, +而不是归某一个 family 所有。`templates/charts/` 和 `templates/tables/` 共同组成 +page-local Visualization 模板库;模板负责数据编码或单元格关系,不负责最终项目 +风格。模板必须保持源码可读、独立可渲染,并允许 Executor 根据项目 Design Spec +与 `spec_lock.md` 重做字体、配色和装饰。 + +| Family | 定义 | 判定边界 | +|---|---|---| +| `chart` | Value-driven visualization | 数值、类别、时间、权重或持续时间决定 mark 的位置、长度、面积、角度、字号或连接宽度 | +| `table` | Row × column fact grid | 行头与列头共同寻址一个单元格事实;合并、对齐和边界保持该交点关系 | + +**Hard rule — Structure is a method, not a catalog**: 定性顺序、层级、角色、 +分区和关系由 [`executor-structure.md`](../references/executor-structure.md) 在当前页面 +现场构形,不登记固定 `structure/`、SVG roster 或 index。Default 和 Quick 都先 +判断页面真实信息模型;需要定性拓扑时都必须采用这套 Structure 方法。删除 catalog +只删除固定示例,不删除 Quick 或 Default 的 Structure 能力。 + +**Hard rule — Visualization is not Layout**: Chart/Table 模板和运行时 Structure +都不拥有 `data-pptx-master`、`data-pptx-layout`、`data-pptx-layer` 或 +`data-pptx-placeholder`。跨页 Master/Layout、page type、slot geometry 和 +placeholder 合同仍只属于 [`layouts/`](./layouts/) workspace。 ## 0. 上游规范 -**Hard rule**: 本指南只定义 Chart 模板库的结构与中性预览合同。通用 SVG 语法、效果、原生数据接口和 PowerPoint 结构分别由以下权威文件定义: +**Hard rule**: 本指南只定义 Chart/Table 两个 catalog family 的结构与中性预览合同。通用 SVG 语法、效果、原生数据接口和 PowerPoint 结构分别由以下权威文件定义: | 合同 | 权威文件 | |---|---| -| 通用 SVG | [`shared-standards.md`](../../references/shared-standards.md) | -| 效果与兼容输入 | [`svg-effects.md`](../../references/svg-effects.md) | -| Native Chart/Table | [`native-data-interface.md`](../../references/native-data-interface.md) | -| 画布格式 | [`canvas-formats.md`](../../references/canvas-formats.md) | +| 通用 SVG | [`shared-standards.md`](../references/shared-standards.md) | +| 效果与兼容输入 | [`svg-effects.md`](../references/svg-effects.md) | +| Native Chart/Table | [`native-data-interface.md`](../references/native-data-interface.md) | +| 画布格式 | [`canvas-formats.md`](../references/canvas-formats.md) | **Forbidden — second SVG specification**: 不在本指南复述或放宽上游语法。发生冲突时以上游权威文件为准。 @@ -19,19 +39,29 @@ ## 1. 所有权边界 -### 1.1 模板与项目 +### 1.1 作者合同与项目消费 -| Chart 模板拥有 | 项目拥有 | +以下所有权只约束库内单个模板工件的维护,不把该工件变成项目页面的布局锁: + +| 单个 Visualization 模板的作者合同 | 项目页面决策拥有 | |---|---| -| 可视化类型与数据到图形的映射 | 项目字体与字号体系 | -| 节点、连接、轴、系列和标签关系 | 项目调色板与品牌色 | -| 可视化类型、构图骨架和阅读顺序 | 实际分组、框架数量、项目数量与容量适配 | +| 该工件的 family 与相应信息模型 | 最终采用的页面级结构、类型与几何 | +| 该工件内的数据映射或单元格关系 | 项目字体、字号、调色板与品牌色 | +| 该工件的示例骨架和阅读顺序 | 实际分组、框架数量、项目数量、组合方式与容量适配 | | 必要的状态与语义区分 | 页面背景、页头、页脚和品牌 chrome | | 独立预览所需的中性样式 | 最终强调策略与页面级视觉层级 | -**Hard rule**: Executor 适配模板时保留可视化类型、信息关系和数据准确性;最终视觉必须来自当前项目,而不是继承模板的示例审美。 +**Hard rule — authoring integrity**: 维护某个库模板时必须保持该模板自身的 +family 与信息模型:Chart 的 value mapping、Table 的 row × column fact grid。 +若修改结果属于定性关系拓扑,不新增第三类模板,而由 runtime Structure 方法构建; +若仍属于另一 catalog family,应登记到正确 family,不能保留错误标签。最终视觉样式 +仍来自使用它的项目,而不是模板的示例审美。 -**Reference — not a constraint**: 模板的分组、框架数、项目数和示例容量用于展示结构,不是项目上限。Executor 可按实际内容调整,但不能改变已选可视化类型、关系或数据语义。 +**Hard rule — flexible project reference**: Executor 选中的 `family/key` 仍只是 +flexible page-local reference。Default 的 §IX 或 Quick 的页面决策拥有最终结构; +选中引用不会锁死页面的可视化类型、几何、分组数、项目数或组合方式,Executor +可按已确认的页面意图适配、重组或替换。项目若实际采用某一信息模型,必须保持 +其真实数据与关系准确;仅有引用本身不构成页面结构权威。 ### 1.2 保留判断 @@ -44,12 +74,17 @@ | 只让示例显得更精致、立体、品牌化或“高级” | 作为简化候选;通过文本与前后渲染核对后再删除 | | 只对某个项目风格成立 | 交给 Executor 重建 | -**Default — structure first (may override when semantics require it)**: 优先使用清楚的线、面、标签和留白。装饰不能成为理解结构的前提。 +**Default — information first (may override when semantics require it)**: 优先使用清楚的线、面、标签和留白。装饰不能成为理解信息的前提。 ### 1.3 保真优先 **Hard rule — fidelity before slimming**: 模板瘦身不得改写或删除原有可见标题、标签、说明、数值、单位、状态、来源、顺序、容量和关系。占位内容保持原文;只有明确重复的信息可以删除,并记录理由。 +**Explicit migration exception**: 经明确批准的 family/key 合并、重组或退役可以用 +中性占位内容重建 canonical SVG,或移除不再存活的工件;这不是普通模板瘦身。 +迁移必须在 §8 记录 catalog 边界和仍可读取的 legacy 语义。未列入批准迁移的模板 +仍受上一条逐字保真约束。 + **Hard rule — structural frames survive**: 框线、底色、分隔、标签页或面板只要表达真实的信息单元、父子层级、阶段范围、绘图区或输出区,就属于结构。可以减少叠加效果,但不得为了 token 数字把有效层级压平。 **Forbidden — compression by rewriting**: 不用缩写、概括、换词或删句降低 token。体积优化来自属性继承、重复样式合并和非语义效果简化,不来自内容编辑。 @@ -165,7 +200,7 @@ --- -## 5. 结构与边界 +## 5. SVG 分组与边界 ### 5.1 语义分组 @@ -174,11 +209,14 @@ | 顶层组 | 典型内容 | |---|---| | `header` | 标题与副标题 | -| `chart-area` / replacement carrier | 轴、数据系列、标签、必要 metadata | +| `chart-area` / replacement carrier | Chart 的轴、数据系列、标签、必要 metadata | | `legend` | 系列或状态说明 | -| `card-1` / `feature-card-1` | 一个完整信息单元 | -| `timeline-track` | 时间轴与阶段标签 | -| `milestone-cards` | 同一结构的一组里程碑卡片 | +| `table-area` / replacement carrier | Table 的行、列、单元格和必要 metadata | +| `table-notes` | 来源、口径或脚注 | + +**Forbidden — workspace metadata**: 两个 catalog family 都不得写入 +Master/Layout/placeholder 所有权标记。运行时 Structure 即使占满整个 +`1280×720` 画布也仍是 Slide-local 构形,不会因此成为 Layout workspace。 ### 5.2 `data-pptx-bounds` @@ -211,7 +249,6 @@ | 基础节点/容器 | ``、``、`` | | 直线关系/分隔/引线 | `` | | 预设可精确表达的弯折/曲线关系 | 完整 compact authored `bentConnector*` / `curvedConnector*` ``;端点不附着 | -| 标准块箭头/流程节点 | 仅在 preset 精确匹配时使用完整 compact authored-preset `` | | 单一预设不能表达、但封闭形状可组合的对象 | 优先用 `shape_boolean_svg.py` 物化 Merge Shapes 结果 | | 图元、预设、Boolean 都不能表达的数据/语义/锁定风格几何 | ``、``、`` | | 数据图表 | 默认 Shape fallback;符合条件时附带 native replacement marker | @@ -220,7 +257,7 @@ --- -## 6. 数据图表合同 +## 6. Chart 与 Native Data 合同 ### 6.1 绘图区标记 @@ -232,9 +269,14 @@ Pie、Donut、Radar 使用对应中心和半径格式。该注释是工具输入,不得作为“清理注释”删除。 +Catalog 模板本身只有一个主 Chart,可保留上述 unscoped marker 与 +`id="chartArea"`。Executor 在项目页面组合多个已验证 Chart 对象时,改用 +[`executor-chart.md`](../references/executor-chart.md) 定义的 semantic object key +和 scoped marker;不能在同一 SVG 中复制多个 `chartArea` id。 + ### 6.2 Native Chart/Table -**Hard rule**: 只有 [`native-data-interface.md`](../../references/native-data-interface.md) 支持的真实数据图表或纯文本表格使用 replacement marker。JSON metadata 与可见 fallback 必须表达同一份数据。 +**Hard rule**: 只有 [`native-data-interface.md`](../references/native-data-interface.md) 支持的真实 Chart 或纯文本 Table 使用 replacement marker。JSON metadata 与可见 fallback 必须表达同一份数据。运行时构建的 Structure 永远不使用 Chart/Table replacement marker。 ```xml .summary`: +新增模板只登记到其 owning family index: + +| Family | Directory | Index object | +|---|---|---| +| `chart` | `charts/` | `charts_index.json` → `charts` | +| `table` | `tables/` | `tables_index.json` → `tables` | + +每个 `.summary` 使用相同的选择句合同: ```json "line_chart": { @@ -285,96 +334,62 @@ Pie、Donut、Radar 使用对应中心和半径格式。该注释是工具输入 } ``` -**Hard rule**: `summary` 是选型句,使用 `Pick for ... Skip if ...`,不是视觉描述;`key` 与文件名一致,`meta.total` 与 catalog 数量一致。 +**Hard rule**: `summary` 是选型句,使用 `Pick for ... Skip if ...`,不是视觉描述;`key` 与同 family 文件名一致,`meta.total` 与该 family catalog 数量一致。不要建立跨 family 的第二份成员清单。 --- ## 8. 迁移边界 -本指南是新建和修改模板的目标合同。当前目录中的 76 个 SVG 均已纳入该合同;后续不得以历史文件为由恢复无语义装饰,也不得把中性化误解为删除结构边界。 +本指南是新建和修改 Chart/Table 模板的目标合同。当前两个 catalog family 共 +39 个 SVG:Chart 33 个、Table 6 个。各 live index 是成员清单的唯一权威; +Structure 不再有固定 SVG roster、index 或 canonical key。 -**Current reference set**: +**Hard rule — topology is generated, not recalled**: 从来源 deck 吸收的是 Shape +grammar 和构形思维,而不是页面示例清单。先还原顺序、层级、分组、分区、连接、 +交叠等真实关系,再由 `executor-structure.md` 使用区域、节点、主轴、连接、标签与 +装饰等角色现场组合。Default 在 §IX 描述该关系,Quick 在当前上下文作同一判断; +两条路径都不依赖 `structure/` 或固定 SVG,不能因 Quick 跳过 §VII/lock 就跳过 +Structure 载体判断。 -| 模板 | 覆盖结构 | +**Canonical Table set**: + +| Canonical key | 核心信息关系 | |---|---| -| `timeline.svg` | 时间、状态和里程碑卡片 | -| `kpi_cards.svg` | KPI 值、单位与趋势 | -| `labeled_card.svg` | 2×2 标签卡片结构 | -| `icon_grid.svg` | 2×3 图标槽与能力卡片 | -| `line_chart.svg` | 双系列折线与 native chart metadata | -| `pipeline_with_stages.svg` | 分阶段管线、贯通流程和输出链 | -| `layered_architecture.svg` | 分层架构、能力输出和底座 | -| `stacked_area_chart.svg` | 累计面积、图例和统计卡片 | -| `heatmap_chart.svg` | 时间×日期矩阵、连续色阶和统计侧栏 | -| `bubble_chart.svg` | 三变量气泡、象限、系列清单和尺寸图例 | -| `quadrant_text_bullets.svg` | 二轴四象限、分区说明和行动标签 | -| `financial_statement_table.svg` | 财务层级、数值列和强调合计行 | -| `box_plot_chart.svg` | 五数分布、异常值、图例和统计摘要 | -| `dual_axis_line_chart.svg` | 双轴序列、阶段带和数据标注 | -| `stacked_bar_chart.svg` | 堆叠分类、总量标签和洞察侧栏 | -| `segmented_wheel.svg` | 中心主题、等权扇区和配对说明卡 | -| `sankey_chart.svg` | 零损耗流向、节点层级和流量编码 | -| `roadmap_vertical.svg` | 纵向里程碑、状态轨道和目标侧栏 | -| `snake_flow.svg` | 多行蛇形长流程、顺序节点和配对里程碑卡 | -| `concentric_circles.svg` | 同心优先级、资源占比和分层说明卡 | -| `scatter_chart.svg` | 双系列散点、回归趋势、置信区间和统计洞察 | -| `area_chart.svg` | 双系列累计面积、月度趋势和摘要指标 | -| `chevron_process.svg` | 连续阶段箭头、周期带和阶段交付物 | -| `radar_chart.svg` | 多维能力对比、系列面积和基准数据表 | -| `module_composition.svg` | 父模块边界、三级处理链和端到端数据流 | -| `fishbone_diagram.svg` | 核心问题、六类原因分支和具体成因标签 | -| `numbered_steps.svg` | 编号步骤、连接顺序、任务卡和阶段时长 | -| `pareto_chart.svg` | 80/20 分界、降序柱体、累计曲线和行动洞察 | -| `top_down_tree.svg` | 父子层级、汇报连线和末级节点摘要 | -| `butterfly_chart.svg` | 共用中轴、双侧镜像系列和对称刻度 | -| `chevron_chain_with_tail.svg` | 连续箭头阶段、支撑标签和结果汇总尾块 | -| `gauge_chart.svg` | 单项指标、目标区间、当前值和状态说明 | -| `gantt_chart.svg` | 任务行、时间跨度、依赖关系和当前时间标记 | -| `waterfall_chart.svg` | 起始值、增减贡献、连接基线和最终合计 | -| `hub_inward_arrows.svg` | 外围输入、向心关系和中心结论 | -| `treemap_chart.svg` | 层级面积编码、分类色块、标签和解释注记 | -| `hub_spoke.svg` | 中心枢纽、径向连接、能力节点和参考环 | -| `matrix_2x2.svg` | 双轴象限、点位分布、象限标签和优先级说明 | -| `process_flow.svg` | 顺序节点、连接关系、阶段时长和状态图例 | -| `donut_chart.svg` | 环形占比、中心总值、系列图例和摘要指标 | -| `grouped_bar_chart.svg` | 多系列并列柱、共用分类轴和系列图例 | -| `pyramid_isometric.svg` | 分层金字塔、等距深度面和层级说明 | -| `progress_bar_chart.svg` | 多项进度、目标标记、当前值和状态分组 | -| `basic_table.svg` | 表头、数据行、对齐列和状态单元格 | -| `mind_map.svg` | 中心主题、放射分支、二级节点和分支骨架 | -| `comparison_columns.svg` | 并列方案列、价格层级、功能清单和推荐状态 | -| `bullet_chart.svg` | 定性区间、实际值、目标线和多指标对照 | -| `comparison_table.svg` | 多方案表头、横向属性行和结果强调 | -| `client_server_flow.svg` | 客户端与服务端分区、请求响应和交互方向 | -| `dumbbell_chart.svg` | 双状态端点、变化连线、差值和项目排序 | -| `pyramid_chart.svg` | 递进层级、分层容量和层级说明 | -| `vertical_pillars.svg` | 并列支柱、分类标题、要点列表和底部结论 | -| `journey_map.svg` | 阶段轨道、用户行动、情绪曲线和痛点卡片 | -| `consulting_table.svg` | 分层行列、指标数值、数据条和重点结论 | -| `pros_cons_chart.svg` | 正反双栏、判断轴、论据列表和建议结论 | -| `project_schedule_table.svg` | 任务表格、负责人、状态和横向排期 | -| `horizontal_bar_chart.svg` | 长标签排名、横向数值条和洞察侧栏 | -| `funnel_chart.svg` | 递减阶段、转化率、流失关系和摘要指标 | -| `isometric_stairs.svg` | 递进台阶、阶段标签、空间顺序和接地基线 | -| `pie_chart.svg` | 单层占比、扇区标签、图例和总量摘要 | -| `circular_stages.svg` | 环形阶段、循环方向、阶段说明和中心主题 | -| `team_roster.svg` | 成员卡片、头像槽、姓名职务和简介容量 | -| `harvey_balls_table.svg` | 评价行列、分级圆点、评分图例和汇总状态 | -| `column_chart.svg` | 单系列分类柱、数值标签、坐标轴和基准线 | -| `arc_anchored_list.svg` | 弧线主轴、锚点节点、顺序条目和配对说明 | -| `vertical_list.svg` | 纵向轨道、顺序节点、内容卡片和阶段状态 | -| `sunburst_chart.svg` | 多层环形层级、父子占比、叶子图例和解释面板 | -| `agenda_list.svg` | 编号议程、条目说明、时长信息和纵向导轨 | -| `stock_chart.svg` | OHLC 蜡烛、日期轴、价格区间和指标摘要 | -| `feature_matrix_table.svg` | 功能行、产品列、二元状态和方案对照 | -| `histogram_chart.svg` | 连续分箱、频数柱、统计标记和分布解释 | -| `venn_diagram.svg` | 集合边界、交集区域、关系标签和结论说明 | -| `quadrant_bubble_scatter.svg` | 双轴象限、气泡位置、尺寸编码和项目标签 | -| `bar_of_pie_chart.svg` | 主饼占比、长尾聚合、堆叠条明细和连接关系 | -| `pie_of_pie_chart.svg` | 主饼占比、长尾聚合、次级饼明细和连接关系 | -| `word_cloud.svg` | 词项权重、字号编码、主题分布和关键词层级 | +| `record_table` | 每行一条记录、每列一个稳定字段 | +| `metric_table` | 实体与 KPI 的交点承载度量、变化、状态或 cell 内微图形 | +| `comparison_matrix` | 行维度与列方案的交点承载文本、精确值或异构事实 | +| `feature_matrix` | 能力与方案的交点承载支持、不支持、部分支持或例外状态 | +| `rating_matrix` | 评价维度与方案的交点使用同一套序数等级 | +| `hierarchical_table` | 分组或缩进行、明细与小计/总计形成层级网格 | -**Hard rule**: 修改任一模板时先冻结可见文本、数据和结构层级,再简化确认无语义的效果、补齐直属根 bounds,并完成文本差异、独立渲染与双路线验证。未经明确说明的文本删除、改写或结构边界丢失都会阻断变更。不要仅为追求 catalog 一次性整齐而批量重写。 +**Hard rule — semantic family before physical object**: PowerPoint 中的物理 +Table 对象不自动属于 `table` family。只有行头与列头的交点可寻址为一个事实时才是 +Table;日期或持续时间决定 `x`/`width` 的排期是 `chart/gantt_chart`;阶段与泳道只 +表达定性活动位置时由 runtime Structure 构建。 + +**Canonical catalog aliases**: + +| Canonical reference | Legacy bare keys | +|---|---| +| `table/record_table` | `basic_table` | +| `table/metric_table` | `consulting_table` | +| `table/comparison_matrix` | `comparison_table` | +| `table/feature_matrix` | `feature_matrix_table` | +| `table/rating_matrix` | `harvey_balls_table` | +| `table/hierarchical_table` | `financial_statement_table` | +| `chart/gantt_chart` | `project_schedule_table` | + +新文档、§VII 和 `page_visualizations` 只写 canonical `chart|table/`。表中 Alias +只服务旧 `page_charts` 读取,不是新模板命名候选;旧的 family-qualified key 不获得 +兼容特权。此前 36 个 canonical Structure bare key 只在旧 `page_charts` 读取时保留为 +`legacy-structure-intent`:它没有 canonical SVG、path 或 reference,不参与 recall, +也不能写入新 §VII/lock。消费方把该意图投影为定性关系提示,再交给 runtime Structure +构形;不得把它伪装成仍存活的模板。 + +**Hard rule**: 修改一个仍属 canonical 的模板时先冻结可见文本、数据和结构层级, +再简化确认无语义的效果、补齐直属根 bounds,并完成文本差异、独立渲染与双路线 +验证。经本节明确登记的 catalog 合并/退役不要求保留旧示例文案;除此之外,未经 +说明的文本删除、改写或结构边界丢失都会阻断变更。 --- @@ -397,9 +412,11 @@ Pie、Donut、Radar 使用对应中心和半径格式。该注释是工具输入 - [ ] 颜色差异确实表达 series、state、positive/negative 等语义。 - [ ] 标题、副标题和来源只用于展示必要结构或容量。 -### 9.3 数据与 PowerPoint +### 9.3 Family 与 PowerPoint -- [ ] 数据图表保留准确 `chart-plot-area` 标记。 +- [ ] Family 判定正确:Chart 为 value-driven、Table 为 row × column fact grid;定性拓扑退出 catalog 并由 runtime Structure 构建。 +- [ ] Chart/Table 模板不含 Master/Layout/layer/placeholder ownership metadata。 +- [ ] Calculator-supported Chart 保留准确 `chart-plot-area` 标记。 - [ ] Eligible Chart/Table 的 metadata 与可见 fallback 数据一致。 - [ ] 默认 Shape-first 导出通过。 - [ ] 存在 replacement marker 时,显式 native Chart/Table 导出通过。 @@ -407,8 +424,8 @@ Pie、Donut、Radar 使用对应中心和半径格式。该注释是工具输入 ### 9.4 Catalog -- [ ] 新模板已登记 `charts_index.json`。 -- [ ] 修改 key/summary 后通过 `chart_recall.py validate` 和 recall 烟测。 +- [ ] 新模板只登记到 owning family index,index object、`meta.total` 与 SVG roster 一致。 +- [ ] 修改 key/summary 后通过 `visualization_recall.py validate` 和 recall 烟测。 - [ ] 前后可见文本差异已审阅,非重复内容没有意外丢失或改写。 - [ ] 前后渲染对比确认结构仍可读。 - [ ] 记录 bytes/tokens 变化,但不以牺牲源码可读性换取数字。 @@ -420,55 +437,15 @@ Pie、Donut、Radar 使用对应中心和半径格式。该注释是工具输入 ```bash # 单文件 SVG 合同 python3 skills/ppt-master/scripts/svg_quality_checker.py \ - skills/ppt-master/templates/charts/.svg + skills/ppt-master/templates//.svg -# Catalog key -python3 skills/ppt-master/scripts/chart_recall.py validate +# Canonical family/key +python3 skills/ppt-master/scripts/visualization_recall.py validate \ + / # 可安全压缩的页面坐标(默认 dry-run) python3 skills/ppt-master/scripts/compact_svg_coordinates.py \ - skills/ppt-master/templates/charts/.svg + skills/ppt-master/templates//.svg ``` **Validation**: 修改后至少完成 XML 解析、独立 SVG 渲染、Checker、默认 Shape-first 导出,以及 marker 模板的 native Chart/Table 导出。 - ---- - -## 11. 结构图式兼容索引 - -本节保留旧引用锚点,但所有图式都受 §1 所有权边界约束。 - -### 11.1 Attached Section Tab - -**Reference — not a constraint**: 半圆标签只在“标签从属于当前信息块”是结构信息时使用。颜色、圆角和高度由项目适配;它不是卡片的默认装饰。 - -**Forbidden — cover hack**: 不把“全圆角矩形 + 同色覆盖矩形”作为两个未合并对象叠放来伪造单侧圆角。需要时优先以封闭的圆角矩形和矩形为 operands,通过 `shape_boolean_svg.py` 物化 Union 结果;只有 Boolean 仍不能忠实表达时才手写可编辑 path。 - -### 11.2 Nested Card Border - -**Default — single boundary (may override when hierarchy requires two levels)**: 中性模板优先一层描边或留白。浅色外框 + 内层白卡属于旧视觉配方,不再作为共享模板默认;只有外层与内层表达两个真实层级时才保留。 - -### 11.3 Card Grid - -卡片网格表达并列关系和容量,不决定最终卡片风格: - -| 结构 | 典型容量 | 参考画布分配 | -|---|---|---| -| 2×2 | 4 个平行方面/KPI | `560×255`,横向间距约 40 | -| 2×3 | 6 个能力/服务 | `370×260`,横向间距约 25 | -| 1×3 | 3 个平行支柱 | 每列约 `400×540` | -| 1×4 | 4 个紧凑指标 | 每列约 `280×250` | - -**Hard rule**: `page_rhythm: breathing` 不因 catalog 示例自动变成卡片网格;最终结构仍服从页面内容和项目节奏。 - -### 11.5 Diagonal Relationship Arrow - -**Hard rule**: 倾斜虚线箭头只表达跨象限迁移、影响或建议方向,并配一条简短关系标签。颜色与标签外观由项目决定。 - -### 11.6 Ground Anchor - -**Default — omit (may override when depth is semantic)**: 接地椭圆是深度装饰,不属于中性模板默认。只有物体与地面/层级的空间关系本身有意义时保留;不得为了“漂浮感”普遍添加。 - -### 11.7 Bidirectional Interaction Arrows - -**Hard rule**: 双向关系使用两条方向明确的线,每条线都有动作标签。请求/响应的颜色只需可区分,最终映射由项目调色板决定。 diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/README.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/README.md index d6c538a5..924f9e91 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/README.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/README.md @@ -18,7 +18,7 @@ the same selector, defaults Stage 1 to template mode, and preselects that specific candidate only when it is the sole supplied root. Registered exact roots are `library`; other exact roots remain `explicit`. The conditional [`apply-template-workspace`](../../workflows/stages/apply-template-workspace.md) -stage owns path normalization, portable-root installation, multi-kind fusion, +stage owns path normalization, portable-root installation, per-workspace spec naming, same-kind conflict resolution, and provenance after Stage 1 and before Stage 2. Template-aware reading begins in final Stage 2 from the installed project-local copy. This file owns only the Brand schema. Quick applies a supplied exact Brand root directly and diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/accenture/templates/design_spec.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/accenture/templates/design_spec.md new file mode 100644 index 00000000..99116c90 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/accenture/templates/design_spec.md @@ -0,0 +1,63 @@ +--- +brand_id: accenture +kind: brand +summary: Accenture-style consulting and technology-services identity — violet accent on black for transformation, technology, and delivery decks +primary_color: "#A100FF" +--- + +# Accenture Brand Specification + +> Identity-only preset. No SVG page roster — pages are composed freely under these constraints. + +## I. Brand Overview + +| Property | Value | +|---|---| +| Brand Name | Accenture | +| Use Cases | Technology and business transformation, systems integration and delivery proposals, industry point-of-view papers, and client advisory decks | +| Tone | Formal, forward-looking, delivery-focused, evidence-led | +| Sources | Public third-party brand-color compilations reviewed 2026-08-07; the violet is widely documented as PMS 2592 C. No value was read from an official manual, so every value here is an approximation | + +## II. Color Scheme + +| Role | HEX | Provenance | Notes | +|---|---|---|---| +| primary | `#A100FF` | approx | Violet consistently documented as the firm's signature accent; commonly mapped to PMS 2592 C | +| accent | `#000000` | approx | Black, documented as the wordmark color and the identity's typographic weight | +| bg | `#FFFFFF` | approx | Default light presentation background | +| surface | `#F5F3F7` | approx | Cool off-white — card and module surfaces | +| border | `#DCD8E0` | approx | Hairline rules, dividers, and table borders | +| muted-text | `#5B5560` | approx | Secondary text, annotations, and chart labels | + +Every row is `approx`. No value was read from an official asset or manual, so nothing here may be treated as brand truth or represented to a client as the firm's specification. The violet is a highly saturated accent, not a field color: keep it off large fills and body text, where it vibrates against white and fails contrast at small sizes. Black carries the typographic weight and the violet marks the single decisive element per page. Choose semantic chart and status colors per deck; do not lock an invented success/warning/error trio as identity. + +## III. Typography + +| Role | Family | Weight | +|---|---|---| +| title | `Arial, "Microsoft YaHei", sans-serif` | 600–700 | +| body | `Arial, "Microsoft YaHei", sans-serif` | 400 | + +> The firm uses proprietary licensed typefaces that this preset neither bundles nor names as a claim. PPT Master does not auto-embed fonts or follow CSS tails in PowerPoint. The rows above are the default Windows/Office export; replace them only with a user-confirmed target-installed face. + +## IV. Logo + +- File: `none` +- Usage: never + +No logo asset is bundled. The firm's marks are protected trademarks, and a redrawn or approximated wordmark would misrepresent them. Where a presenting entity must appear, set it as editable text in the deck's own typography, or install an officially supplied asset into this workspace's `images/` directory and add its usage rules here. The bundled icon library contains a single-color `simple-icons/accenture` symbol for genuine brand-recognition contexts such as a client or partner listing; it is a symbol only, not the official lockup, and must never be combined with typed text to fabricate one. Never imply affiliation, sponsorship, endorsement, or authorship by the firm. + +## V. Voice & Tone + +- Formality: formal +- Person: we / you (English), 我们 / 您 (Chinese) +- Emoji: forbidden +- Abbreviations: spell-out-first-use + +> Presentation convention derived from the register these decks are normally written in, not an official brand token. Tie capability claims to delivery evidence, keep commitments specific, and attribute every figure. + +## VI. Icon Style + +- Preference: stroke + +> Presentation convention, not an official brand token. Prefer a restrained stroke family such as `tabler-outline`, keep one family across the deck, and use an icon only where it clarifies a role, state, or relationship. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/alibaba/templates/design_spec.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/alibaba/templates/design_spec.md new file mode 100644 index 00000000..d6c8156f --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/alibaba/templates/design_spec.md @@ -0,0 +1,63 @@ +--- +brand_id: alibaba +kind: brand +summary: Alibaba-style commerce and cloud identity — signature orange on black for platform, merchant, and cloud solution decks +primary_color: "#FF6A00" +--- + +# Alibaba Brand Specification + +> Identity-only preset. No SVG page roster — pages are composed freely under these constraints. + +## I. Brand Overview + +| Property | Value | +|---|---| +| Brand Name | Alibaba Group | +| Use Cases | Commerce platform and merchant solution decks, cloud and digital-infrastructure proposals, ecosystem and partner presentations, and industry briefings | +| Tone | Professional, commercially direct, outcome-focused | +| Sources | Public third-party brand-color compilations reviewed 2026-08-07, giving the orange as PMS 1585 C. No value was read from an official manual, so every value here is an approximation | + +## II. Color Scheme + +| Role | HEX | Provenance | Notes | +|---|---|---|---| +| primary | `#FF6A00` | approx | Signature orange consistently documented across sources; commonly mapped to PMS 1585 C | +| accent | `#000000` | approx | Black documented alongside the orange as the wordmark and typographic weight | +| bg | `#FFFFFF` | approx | Default light presentation background | +| surface | `#F7F5F3` | approx | Warm off-white — card and module surfaces | +| border | `#E3DEDA` | approx | Hairline rules, dividers, and table borders | +| muted-text | `#5F5A55` | approx | Secondary text, annotations, and chart labels | + +Every row is `approx`. No value was read from an official asset or manual, so nothing here may be treated as brand truth or represented as the company's specification. This orange is highly saturated and fails contrast against white at text sizes: keep it off body text and large fills, and let black carry the typographic weight while the orange marks the decisive element. It also sits in the conventional warning range, so where a chart or diagram encodes status, declare that mapping explicitly and keep it distinguishable from identity use. Note that several Chinese technology brands share nearly this exact orange — when a deck shows more than one of them together, distinguish them by mark and label rather than by color. Do not lock an invented success/warning/error trio as identity. + +## III. Typography + +| Role | Family | Weight | +|---|---|---| +| title | `Arial, "Microsoft YaHei", sans-serif` | 600–700 | +| body | `Arial, "Microsoft YaHei", sans-serif` | 400 | + +> The company uses proprietary licensed typefaces that this preset neither bundles nor names as a claim. PPT Master does not auto-embed fonts or follow CSS tails in PowerPoint. The rows above are the default Windows/Office export; replace them only with a user-confirmed target-installed face. + +## IV. Logo + +- File: `none` +- Usage: never + +No logo asset is bundled. The group's marks are protected trademarks, and its subsidiaries and platforms carry materially different identities that must not be conflated with the group mark. Where a presenting entity must appear, set it as editable text in the deck's own typography, or install an officially supplied asset into this workspace's `images/` directory and add its usage rules here. The bundled icon library contains single-color `simple-icons/alibabacloud` and `simple-icons/alibabadotcom` symbols for genuine brand-recognition contexts; they are symbols for those specific properties, not a group lockup. Never imply affiliation, sponsorship, endorsement, or authorization. + +## V. Voice & Tone + +- Formality: neutral +- Person: we / you (English), 我们 / 您 (Chinese) +- Emoji: forbidden +- Abbreviations: spell-out-first-use + +> Presentation convention derived from the register these decks are normally written in, not an official brand token. Name the specific platform or business unit rather than the group where the claim belongs to one of them, and attribute every figure. + +## VI. Icon Style + +- Preference: stroke + +> Presentation convention, not an official brand token. Prefer a consistent stroke family such as `tabler-outline`, keep one family across the deck, and use an icon only where it clarifies a role, state, or relationship. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/aws/templates/design_spec.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/aws/templates/design_spec.md new file mode 100644 index 00000000..d51cf8b7 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/aws/templates/design_spec.md @@ -0,0 +1,63 @@ +--- +brand_id: aws +kind: brand +summary: AWS-style cloud identity — signature orange on deep navy for cloud architecture, migration, and well-architected review decks +primary_color: "#FF9900" +--- + +# Amazon Web Services Brand Specification + +> Identity-only preset. No SVG page roster — pages are composed freely under these constraints. + +## I. Brand Overview + +| Property | Value | +|---|---| +| Brand Name | Amazon Web Services (AWS) | +| Use Cases | Cloud architecture and migration decks, well-architected and cost reviews, partner and ISV solution presentations, and technical enablement | +| Tone | Technical, pragmatic, architecture-focused, evidence-led | +| Sources | Public third-party brand-color compilations reviewed 2026-08-07, which give the orange as PMS 1375 C and the navy as PMS 7546 C. No value was read from an official manual, so every value here is an approximation | + +## II. Color Scheme + +| Role | HEX | Provenance | Notes | +|---|---|---|---| +| primary | `#FF9900` | approx | Signature orange consistently documented across sources; commonly mapped to PMS 1375 C | +| accent | `#252F3E` | approx | Deep navy documented as the other half of the pairing; commonly mapped to PMS 7546 C | +| bg | `#FFFFFF` | approx | Default light presentation background | +| surface | `#F2F3F3` | approx | Cool gray — card and module surfaces | +| border | `#D5DBDB` | approx | Hairline rules, dividers, and table borders | +| muted-text | `#545B64` | approx | Secondary text, annotations, and chart labels | + +Every row is `approx`. No value was read from an official asset or manual, so nothing here may be treated as brand truth or represented as the company's specification. The navy carries the page and the orange marks what matters — an architecture diagram tinted entirely orange loses all hierarchy. The orange also sits squarely in the conventional warning range, so where a diagram encodes state or a chart encodes status, declare that mapping explicitly and keep it distinguishable from identity use. Do not lock an invented success/warning/error trio as identity. + +## III. Typography + +| Role | Family | Weight | +|---|---|---| +| title | `Arial, "Microsoft YaHei", sans-serif` | 600–700 | +| body | `Arial, "Microsoft YaHei", sans-serif` | 400 | + +> The company uses proprietary licensed typefaces that this preset neither bundles nor names as a claim. PPT Master does not auto-embed fonts or follow CSS tails in PowerPoint. The rows above are the default Windows/Office export; replace them only with a user-confirmed target-installed face. + +## IV. Logo + +- File: `none` +- Usage: never + +No logo asset is bundled. The company's marks are protected trademarks whose use by third parties is governed by published trademark guidelines this preset cannot grant. Where a presenting entity must appear, set it as editable text in the deck's own typography, or install an officially supplied asset into this workspace's `images/` directory and add its usage rules here. The bundled icon library contains single-color `simple-icons/amazonwebservices` and per-service symbols for genuine brand-recognition and architecture-diagram contexts; they are symbols only, not the official lockup. Never imply affiliation, sponsorship, endorsement, partner tier, or certification. + +## V. Voice & Tone + +- Formality: neutral +- Person: we / you (English), 我们 / 你 (Chinese) +- Emoji: forbidden +- Abbreviations: spell-out-first-use + +> Presentation convention derived from the register these decks are normally written in, not an official brand token. Name services exactly and in full on first use, state the region and pricing basis behind any cost figure, and mark preview services as such. + +## VI. Icon Style + +- Preference: stroke + +> Presentation convention, not an official brand token. Prefer a consistent stroke family such as `tabler-outline` for generic concepts, and reserve the bundled service symbols for actual named services in an architecture diagram. Keep one generic family across the deck. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/bain/templates/design_spec.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/bain/templates/design_spec.md new file mode 100644 index 00000000..8f6233fc --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/bain/templates/design_spec.md @@ -0,0 +1,63 @@ +--- +brand_id: bain +kind: brand +summary: Bain-style consulting identity — scarlet red on restrained neutrals for results-oriented strategy and performance decks +primary_color: "#EE3224" +--- + +# Bain & Company Brand Specification + +> Identity-only preset. No SVG page roster — pages are composed freely under these constraints. + +## I. Brand Overview + +| Property | Value | +|---|---| +| Brand Name | Bain & Company | +| Use Cases | Results-oriented strategy, private equity and diligence support, performance improvement, and executive advisory decks | +| Tone | Formal, direct, results-focused, evidence-led | +| Sources | Public third-party brand-color compilations reviewed 2026-08-07, which state explicitly that these values are not published in the firm's own guidelines. Every value here is an approximation | + +## II. Color Scheme + +| Role | HEX | Provenance | Notes | +|---|---|---|---| +| primary | `#EE3224` | approx | Scarlet red consistently documented as the firm's dominant identity color | +| accent | `#8C1B12` | approx | Deeper red derived from the primary for chapter grounds and depth | +| bg | `#FFFFFF` | approx | Default light presentation background | +| surface | `#F5F5F5` | approx | Neutral off-white — card and module surfaces | +| border | `#DCDCDC` | approx | Hairline rules, dividers, and table borders | +| muted-text | `#5C5C5C` | approx | Secondary text, annotations, and chart labels | + +Every row is `approx`, and the compiled sources say so themselves — the firm does not publish these values. Nothing here may be treated as brand truth or represented to a client as the firm's specification. A saturated red carries alarm meaning by default, so use the primary for identity and decisive emphasis only, keep it off large fills behind body text, and never let it read as a risk or failure signal where the page means neither. Choose semantic chart and status colors per deck with that collision in mind; do not lock an invented success/warning/error trio as identity. + +## III. Typography + +| Role | Family | Weight | +|---|---|---| +| title | `Arial, "Microsoft YaHei", sans-serif` | 600–700 | +| body | `Arial, "Microsoft YaHei", sans-serif` | 400 | + +> The firm uses proprietary licensed typefaces that this preset neither bundles nor names as a claim. PPT Master does not auto-embed fonts or follow CSS tails in PowerPoint. The rows above are the default Windows/Office export; replace them only with a user-confirmed target-installed face. + +## IV. Logo + +- File: `none` +- Usage: never + +No logo asset is bundled. The firm's marks are protected trademarks, and a redrawn or approximated wordmark would misrepresent them. Where a presenting entity must appear, set it as editable text in the deck's own typography, or install an officially supplied asset into this workspace's `images/` directory and add its usage rules here. Never imply affiliation, sponsorship, endorsement, or authorship by the firm. + +## V. Voice & Tone + +- Formality: formal +- Person: we / you (English), 我们 / 您 (Chinese) +- Emoji: forbidden +- Abbreviations: spell-out-first-use + +> Presentation convention derived from the register these decks are normally written in, not an official brand token. Lead with the result, tie every recommendation to its expected effect, and attribute every figure. + +## VI. Icon Style + +- Preference: stroke + +> Presentation convention, not an official brand token. Prefer a restrained stroke family such as `tabler-outline`, keep one family across the deck, and use an icon only where it clarifies a role, state, or relationship. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/bcg/templates/design_spec.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/bcg/templates/design_spec.md new file mode 100644 index 00000000..2750e399 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/bcg/templates/design_spec.md @@ -0,0 +1,63 @@ +--- +brand_id: bcg +kind: brand +summary: BCG-style consulting identity — forest green and warm neutrals for growth strategy, transformation, and advantage decks +primary_color: "#147B58" +--- + +# Boston Consulting Group Brand Specification + +> Identity-only preset. No SVG page roster — pages are composed freely under these constraints. + +## I. Brand Overview + +| Property | Value | +|---|---| +| Brand Name | Boston Consulting Group (BCG) | +| Use Cases | Growth and corporate strategy, transformation programs, competitive advantage studies, and executive advisory decks | +| Tone | Formal, analytical, forward-looking, evidence-led | +| Sources | Public third-party brand-color compilations reviewed 2026-08-07, which state explicitly that these values are not published in the firm's own guidelines. Every value here is an approximation | + +## II. Color Scheme + +| Role | HEX | Provenance | Notes | +|---|---|---|---| +| primary | `#147B58` | approx | Forest green consistently documented as the firm's dominant identity color; commonly mapped to PMS 341 C | +| accent | `#0A3D2C` | approx | Deeper green derived from the primary for chapter grounds and depth | +| bg | `#FFFFFF` | approx | Default light presentation background | +| surface | `#F4F6F4` | approx | Warm off-white — card and module surfaces | +| border | `#D8DED9` | approx | Hairline rules, dividers, and table borders | +| muted-text | `#5B6660` | approx | Secondary text, annotations, and chart labels | + +Every row is `approx`, and the compiled sources say so themselves — the firm does not publish these values. Nothing here may be treated as brand truth or represented to a client as the firm's specification. The green is a grounding color rather than a highlighter: use it for structure, hierarchy, and the decisive mark, not to tint every element on the page. Choose semantic chart and status colors per deck, and take care that a green primary does not collide with a green "positive" status meaning; do not lock an invented success/warning/error trio as identity. + +## III. Typography + +| Role | Family | Weight | +|---|---|---| +| title | `Arial, "Microsoft YaHei", sans-serif` | 600–700 | +| body | `Arial, "Microsoft YaHei", sans-serif` | 400 | + +> The firm uses a proprietary licensed typeface that this preset neither bundles nor names as a claim. PPT Master does not auto-embed fonts or follow CSS tails in PowerPoint. The rows above are the default Windows/Office export; replace them only with a user-confirmed target-installed face. + +## IV. Logo + +- File: `none` +- Usage: never + +No logo asset is bundled. The firm's marks are protected trademarks, and a redrawn or approximated mark would misrepresent them. Where a presenting entity must appear, set it as editable text in the deck's own typography, or install an officially supplied asset into this workspace's `images/` directory and add its usage rules here. Never imply affiliation, sponsorship, endorsement, or authorship by the firm. + +## V. Voice & Tone + +- Formality: formal +- Person: we / you (English), 我们 / 您 (Chinese) +- Emoji: forbidden +- Abbreviations: spell-out-first-use + +> Presentation convention derived from the register these decks are normally written in, not an official brand token. State the implication rather than only the observation, keep qualification precise, and attribute every figure. + +## VI. Icon Style + +- Preference: stroke + +> Presentation convention, not an official brand token. Prefer a restrained stroke family such as `tabler-outline`, keep one family across the deck, and use an icon only where it clarifies a role, state, or relationship. 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 25def00c..73506d79 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 @@ -1,12 +1,72 @@ { + "accenture": { + "summary": "Accenture-style consulting and technology-services identity — violet accent on black for transformation, technology, and delivery decks", + "primary_color": "#A100FF" + }, + "alibaba": { + "summary": "Alibaba-style commerce and cloud identity — signature orange on black for platform, merchant, and cloud solution decks", + "primary_color": "#FF6A00" + }, "anthropic": { "summary": "Anthropic / Claude brand family — AI research, product talks, developer conferences, technical training, and launches", "primary_color": "#D97757" }, + "aws": { + "summary": "AWS-style cloud identity — signature orange on deep navy for cloud architecture, migration, and well-architected review decks", + "primary_color": "#FF9900" + }, + "bain": { + "summary": "Bain-style consulting identity — scarlet red on restrained neutrals for results-oriented strategy and performance decks", + "primary_color": "#EE3224" + }, + "bcg": { + "summary": "BCG-style consulting identity — forest green and warm neutrals for growth strategy, transformation, and advantage decks", + "primary_color": "#147B58" + }, + "deloitte": { + "summary": "Deloitte-style professional-services identity — signature green on black and neutrals for audit, tax, risk, and advisory decks", + "primary_color": "#86BC25" + }, "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" }, + "huawei": { + "summary": "Huawei-style enterprise identity — restrained red accent on near-black and gray for ICT solution, product, and partner decks", + "primary_color": "#CF0A2C" + }, + "ibm": { + "summary": "IBM-style enterprise identity — Carbon blue on a disciplined gray scale for hybrid cloud, AI, and enterprise consulting decks", + "primary_color": "#0F62FE" + }, + "jpmorgan": { + "summary": "JPMorgan Chase-style financial-institution identity — corporate blue on navy and neutrals for research, banking, and internal governance decks", + "primary_color": "#117ACA" + }, + "mckinsey": { + "summary": "McKinsey-style consulting identity — deep navy and electric blue for strategy, diagnostic, and executive decision decks", + "primary_color": "#051C2C" + }, + "microsoft": { + "summary": "Microsoft-style enterprise technology identity — four-square product spectrum on neutral grays for Microsoft 365, Azure, and IT program decks", + "primary_color": "#00A4EF" + }, + "nvidia": { + "summary": "NVIDIA-style accelerated-computing identity — signature green on near-black for AI, GPU, and data-center technical decks", + "primary_color": "#76B900" + }, + "pwc": { + "summary": "PwC-style professional-services identity — warm orange-to-rose spectrum on black for assurance, tax, and advisory decks", + "primary_color": "#DB4E18" + }, + "tencent": { + "summary": "Tencent-style internet and cloud identity — measured blue on light neutrals for platform, cloud, and ecosystem decks", + "primary_color": "#3458B0" + }, + "xiaomi": { + "summary": "Xiaomi-style consumer-technology identity — signature orange on clean white for product launches, ecosystem, and retail decks", + "primary_color": "#FF6900" + }, "中国电信": { "summary": "China Telecom brand identity for digital infrastructure, government-enterprise solutions, transformation planning, and corporate reporting", "primary_color": "#004EA2" diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/deloitte/templates/design_spec.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/deloitte/templates/design_spec.md new file mode 100644 index 00000000..9d05f338 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/deloitte/templates/design_spec.md @@ -0,0 +1,63 @@ +--- +brand_id: deloitte +kind: brand +summary: Deloitte-style professional-services identity — signature green on black and neutrals for audit, tax, risk, and advisory decks +primary_color: "#86BC25" +--- + +# Deloitte Brand Specification + +> Identity-only preset. No SVG page roster — pages are composed freely under these constraints. + +## I. Brand Overview + +| Property | Value | +|---|---| +| Brand Name | Deloitte | +| Use Cases | Audit, tax, risk, and consulting deliverables, regulatory and compliance readouts, industry point-of-view papers, and client advisory decks | +| Tone | Formal, precise, measured, evidence-led | +| Sources | Public third-party brand-color compilations reviewed 2026-08-07; the green is widely documented as PMS 368. No value was read from an official manual, so every value here is an approximation | + +## II. Color Scheme + +| Role | HEX | Provenance | Notes | +|---|---|---|---| +| primary | `#86BC25` | approx | Signature yellow-green consistently documented as the firm's identity color; commonly mapped to PMS 368 | +| accent | `#000000` | approx | Black, documented alongside the green as the other half of the core pairing | +| bg | `#FFFFFF` | approx | Default light presentation background | +| surface | `#F5F6F5` | approx | Off-white — card and module surfaces | +| border | `#DBDEDB` | approx | Hairline rules, dividers, and table borders | +| muted-text | `#63666A` | approx | Secondary text, annotations, and chart labels | + +Every row is `approx`. No value was read from an official asset or manual, so nothing here may be treated as brand truth or represented to a client as the firm's specification. This green is bright and low-contrast against white: never set body text in it, and reserve it for marks, rules, and the single decisive element rather than large fills. Black carries the typographic weight. Choose semantic chart and status colors per deck, taking care that a green primary does not collide with a green "positive" status meaning; do not lock an invented success/warning/error trio as identity. + +## III. Typography + +| Role | Family | Weight | +|---|---|---| +| title | `Arial, "Microsoft YaHei", sans-serif` | 600–700 | +| body | `Arial, "Microsoft YaHei", sans-serif` | 400 | + +> The firm uses proprietary licensed typefaces that this preset neither bundles nor names as a claim. PPT Master does not auto-embed fonts or follow CSS tails in PowerPoint. The rows above are the default Windows/Office export; replace them only with a user-confirmed target-installed face. + +## IV. Logo + +- File: `none` +- Usage: never + +No logo asset is bundled. The firm's marks — including the green dot device — are protected trademarks, and a redrawn or approximated mark would misrepresent them. Where a presenting entity must appear, set it as editable text in the deck's own typography, or install an officially supplied asset into this workspace's `images/` directory and add its usage rules here. Never imply affiliation, sponsorship, endorsement, or authorship by the firm, and never place a green dot beside a wordmark as a substitute for the real mark. + +## V. Voice & Tone + +- Formality: formal +- Person: we / you (English), 我们 / 您 (Chinese) +- Emoji: forbidden +- Abbreviations: spell-out-first-use + +> Presentation convention derived from the register these decks are normally written in, not an official brand token. Keep scope, basis, and period explicit, separate observation from opinion, and attribute every figure. + +## VI. Icon Style + +- Preference: stroke + +> Presentation convention, not an official brand token. Prefer a restrained stroke family such as `tabler-outline`, keep one family across the deck, and use an icon only where it clarifies a role, state, or relationship. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/huawei/templates/design_spec.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/huawei/templates/design_spec.md new file mode 100644 index 00000000..62baa136 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/huawei/templates/design_spec.md @@ -0,0 +1,63 @@ +--- +brand_id: huawei +kind: brand +summary: Huawei-style enterprise identity — restrained red accent on near-black and gray for ICT solution, product, and partner decks +primary_color: "#CF0A2C" +--- + +# Huawei Brand Specification + +> Identity-only preset. No SVG page roster — pages are composed freely under these constraints. + +## I. Brand Overview + +| Property | Value | +|---|---| +| Brand Name | Huawei | +| Use Cases | ICT and enterprise solution decks, product and technology launches, carrier and government-enterprise proposals, and partner enablement | +| Tone | Formal, technical, capability-focused, evidence-led | +| Sources | Public third-party brand-color compilations reviewed 2026-08-07, giving the red as PMS 186 C and the black as PMS 426 C; public descriptions of the company's visual identity manual for the restrained-accent principle. No value was read from an official manual, so every value here is an approximation | + +## II. Color Scheme + +| Role | HEX | Provenance | Notes | +|---|---|---|---| +| primary | `#CF0A2C` | approx | Signature red consistently documented across sources; commonly mapped to PMS 186 C | +| accent | `#232527` | approx | Near-black documented alongside the red; commonly mapped to PMS 426 C | +| bg | `#FFFFFF` | approx | Default light presentation background | +| surface | `#F5F5F6` | approx | Neutral gray — card and module surfaces | +| border | `#DEDEE0` | approx | Hairline rules, dividers, and table borders | +| muted-text | `#5A5C5E` | approx | Secondary text, annotations, and chart labels | + +Every row is `approx`. No value was read from an official asset or manual, so nothing here may be treated as brand truth or represented as the company's specification. Public accounts of the company's visual identity describe a deliberate restrained-accent principle — the red appears as a controlled, small-area highlight rather than a field color — and that discipline is the most important thing to carry over: let near-black and gray build the page and spend the red on one focal element. A saturated red also carries alarm meaning by default, so keep it off large fills behind body text and never let it read as a risk signal where the page means neither. Do not lock an invented success/warning/error trio as identity. + +## III. Typography + +| Role | Family | Weight | +|---|---|---| +| title | `Arial, "Microsoft YaHei", sans-serif` | 600–700 | +| body | `Arial, "Microsoft YaHei", sans-serif` | 400 | + +> The company uses proprietary licensed typefaces that this preset neither bundles nor names as a claim. PPT Master does not auto-embed fonts or follow CSS tails in PowerPoint. The rows above are the default Windows/Office export; replace them only with a user-confirmed target-installed face. + +## IV. Logo + +- File: `none` +- Usage: never + +No logo asset is bundled. The company's marks are protected trademarks, and the petal device in particular cannot be redrawn faithfully. Where a presenting entity must appear, set it as editable text in the deck's own typography, or install an officially supplied asset into this workspace's `images/` directory and add its usage rules here. The bundled icon library contains a single-color `simple-icons/huawei` symbol for genuine brand-recognition contexts such as a partner or ecosystem listing; it is a symbol only, not the official lockup. Never imply affiliation, sponsorship, endorsement, or authorization. + +## V. Voice & Tone + +- Formality: formal +- Person: we / you (English), 我们 / 您 (Chinese) +- Emoji: forbidden +- Abbreviations: spell-out-first-use + +> Presentation convention derived from the register these decks are normally written in, not an official brand token. Name products and versions exactly, tie capability claims to deployed evidence, and keep commitments specific. + +## VI. Icon Style + +- Preference: stroke + +> Presentation convention, not an official brand token. Prefer a consistent stroke family such as `tabler-outline`, keep one family across the deck, and use an icon only where it clarifies a role, state, or relationship. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/ibm/templates/design_spec.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/ibm/templates/design_spec.md new file mode 100644 index 00000000..6a84e2c5 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/ibm/templates/design_spec.md @@ -0,0 +1,63 @@ +--- +brand_id: ibm +kind: brand +summary: IBM-style enterprise identity — Carbon blue on a disciplined gray scale for hybrid cloud, AI, and enterprise consulting decks +primary_color: "#0F62FE" +--- + +# IBM Brand Specification + +> Identity-only preset. No SVG page roster — pages are composed freely under these constraints. + +## I. Brand Overview + +| Property | Value | +|---|---| +| Brand Name | IBM | +| Use Cases | Hybrid cloud and AI solution decks, enterprise consulting deliverables, technical architecture reviews, and industry point-of-view papers | +| Tone | Formal, engineered, systematic, evidence-led | +| Sources | IBM's Carbon Design System — the company's own open design system — reviewed 2026-08-07 for Blue 60. Neutral and surface rows are presentation conventions, not published brand tokens | + +## II. Color Scheme + +| Role | HEX | Provenance | Notes | +|---|---|---|---| +| primary | `#0F62FE` | fact | Blue 60, the primary interactive color published in the company's own Carbon Design System | +| accent | `#002D9C` | approx | Deeper blue from the same family for chapter grounds and depth | +| bg | `#FFFFFF` | approx | Default light presentation background | +| surface | `#F4F4F4` | approx | Neutral gray — card and module surfaces | +| border | `#E0E0E0` | approx | Hairline rules, dividers, and table borders | +| muted-text | `#525252` | approx | Secondary text, annotations, and chart labels | + +The primary is `fact` — it is the published token in the company's own open design system. Every other row is `approx` and represents presentation convention, not an official token. Blue 60 is defined there as an *interactive* color for buttons, links, and focus states rather than a decorative brand fill; on a slide, keep that spirit by using it for the decisive mark and structural emphasis instead of tinting large areas. Because it reads as a link color, avoid setting non-interactive body text in it. Choose semantic chart and status colors per deck; do not lock an invented success/warning/error trio as identity. + +## III. Typography + +| Role | Family | Weight | +|---|---|---| +| title | `Arial, "Microsoft YaHei", sans-serif` | 600–700 | +| body | `Arial, "Microsoft YaHei", sans-serif` | 400 | + +> The company maintains its own open typeface family, which this preset neither bundles nor assumes is installed. PPT Master does not auto-embed fonts or follow CSS tails in PowerPoint. The rows above are the default Windows/Office export; replace them only with a user-confirmed target-installed face. + +## IV. Logo + +- File: `none` +- Usage: never + +No logo asset is bundled. The company's marks are protected trademarks, and the striped wordmark in particular degrades badly when redrawn or rescaled without official artwork. Where a presenting entity must appear, set it as editable text in the deck's own typography, or install an officially supplied asset into this workspace's `images/` directory and add its usage rules here. The bundled icon library contains a single-color `simple-icons/ibm` symbol for genuine brand-recognition contexts such as a partner or ecosystem listing; it is a symbol only, not the official lockup. Never imply affiliation, sponsorship, endorsement, or certification. + +## V. Voice & Tone + +- Formality: formal +- Person: we / you (English), 我们 / 您 (Chinese) +- Emoji: forbidden +- Abbreviations: spell-out-first-use + +> Presentation convention derived from the register these decks are normally written in, not an official brand token. Keep architecture claims tied to named components and versions, and separate available capability from roadmap. + +## VI. Icon Style + +- Preference: stroke + +> Presentation convention, not an official brand token. Prefer a consistent stroke family such as `tabler-outline`, keep one family across the deck, and use an icon only where it clarifies a role, state, or relationship. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/jpmorgan/templates/design_spec.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/jpmorgan/templates/design_spec.md new file mode 100644 index 00000000..fd1849f6 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/jpmorgan/templates/design_spec.md @@ -0,0 +1,63 @@ +--- +brand_id: jpmorgan +kind: brand +summary: JPMorgan Chase-style financial-institution identity — corporate blue on navy and neutrals for research, banking, and internal governance decks +primary_color: "#117ACA" +--- + +# JPMorgan Chase Brand Specification + +> Identity-only preset. No SVG page roster — pages are composed freely under these constraints. + +## I. Brand Overview + +| Property | Value | +|---|---| +| Brand Name | JPMorgan Chase | +| Use Cases | Market and sector research, banking and treasury client materials, investment committee and governance readouts, and internal performance reviews | +| Tone | Formal, conservative, precise, evidence-led | +| Sources | Public third-party brand-color compilations reviewed 2026-08-07, giving the blue as approximately PMS 285 C. No value was read from an official manual, so every value here is an approximation | + +## II. Color Scheme + +| Role | HEX | Provenance | Notes | +|---|---|---|---| +| primary | `#117ACA` | approx | Corporate blue consistently documented across sources; commonly mapped to approximately PMS 285 C | +| accent | `#004B87` | approx | Navy documented alongside the blue for depth and chapter grounds | +| bg | `#FFFFFF` | approx | Default light presentation background | +| surface | `#F4F6F8` | approx | Cool off-white — card and module surfaces | +| border | `#DDE2E7` | approx | Hairline rules, dividers, and table borders | +| muted-text | `#54606C` | approx | Secondary text, annotations, and chart labels | + +Every row is `approx`. No value was read from an official asset or manual, so nothing here may be treated as brand truth or represented as the institution's specification. Financial decks carry dense numeric tables, so keep the blue for structure, headers, and the decisive series rather than tinting data regions — a blue-filled table defeats the row scanning it exists for. Chart series in a research deck need their own declared, colorblind-safe scale that does not collide with identity blue. Distinguish the corporate parent from its consumer-facing brand: their identities differ materially and must not be mixed on one page. Do not lock an invented success/warning/error trio as identity. + +## III. Typography + +| Role | Family | Weight | +|---|---|---| +| title | `Arial, "Microsoft YaHei", sans-serif` | 600–700 | +| body | `Arial, "Microsoft YaHei", sans-serif` | 400 | + +> The institution uses proprietary licensed typefaces that this preset neither bundles nor names as a claim. PPT Master does not auto-embed fonts or follow CSS tails in PowerPoint. The rows above are the default Windows/Office export; replace them only with a user-confirmed target-installed face. Prefer a face with tabular figures so numeric columns align. + +## IV. Logo + +- File: `none` +- Usage: never + +No logo asset is bundled. The institution's wordmarks and its octagon device are registered trademarks, and financial materials carry regulatory disclosure obligations that a preset cannot satisfy. Where a presenting entity must appear, set it as editable text in the deck's own typography, or install an officially supplied asset into this workspace's `images/` directory and add its usage rules and any required disclosures here. Never imply affiliation, sponsorship, endorsement, or that the material constitutes research or advice from the institution. + +## V. Voice & Tone + +- Formality: formal +- Person: we / you (English), 我们 / 您 (Chinese) +- Emoji: forbidden +- Abbreviations: spell-out-first-use + +> Presentation convention derived from the register these decks are normally written in, not an official brand token. State the basis, period, and currency of every figure, separate historical fact from forecast, and keep any forward-looking statement explicitly labeled. + +## VI. Icon Style + +- Preference: stroke + +> Presentation convention, not an official brand token. Prefer a restrained stroke family such as `tabler-outline`, keep one family across the deck, and use an icon only where it clarifies a role, state, or relationship. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/mckinsey/templates/design_spec.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/mckinsey/templates/design_spec.md new file mode 100644 index 00000000..af00baab --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/mckinsey/templates/design_spec.md @@ -0,0 +1,63 @@ +--- +brand_id: mckinsey +kind: brand +summary: McKinsey-style consulting identity — deep navy and electric blue for strategy, diagnostic, and executive decision decks +primary_color: "#051C2C" +--- + +# McKinsey & Company Brand Specification + +> Identity-only preset. No SVG page roster — pages are composed freely under these constraints. + +## I. Brand Overview + +| Property | Value | +|---|---| +| Brand Name | McKinsey & Company | +| Use Cases | Strategy and diagnostic decks, executive committee readouts, transformation programs, and management-consulting deliverables | +| Tone | Formal, restrained, answer-first, evidence-led | +| Sources | Public third-party brand-color compilations reviewed 2026-08-07. McKinsey publishes no open brand manual; every value here is an approximation, not an official token | + +## II. Color Scheme + +| Role | HEX | Provenance | Notes | +|---|---|---|---| +| primary | `#051C2C` | approx | Deep navy consistently documented as the firm's dominant identity color | +| accent | `#2251FF` | approx | Electric blue documented as the identity's single high-energy accent | +| bg | `#FFFFFF` | approx | Default light presentation background | +| surface | `#F2F4F6` | approx | Off-white — card and module surfaces | +| border | `#D9DEE3` | approx | Hairline rules, dividers, and table borders | +| muted-text | `#5A6872` | approx | Secondary text, annotations, and chart labels | + +Every row is `approx`. No value was read from an official asset or manual — the firm does not publish one — so nothing here may be treated as brand truth or represented to a client as the firm's specification. Keep the accent genuinely rare: it marks the answer, the decisive figure, or the recommendation, never ordinary emphasis. Choose semantic chart and status colors per deck; do not lock an invented success/warning/error trio as identity. + +## III. Typography + +| Role | Family | Weight | +|---|---|---| +| title | `Arial, "Microsoft YaHei", sans-serif` | 600–700 | +| body | `Arial, "Microsoft YaHei", sans-serif` | 400 | + +> The firm uses proprietary licensed typefaces that this preset neither bundles nor names as a claim. PPT Master does not auto-embed fonts or follow CSS tails in PowerPoint. The rows above are the default Windows/Office export; replace them only with a user-confirmed target-installed face. + +## IV. Logo + +- File: `none` +- Usage: never + +No logo asset is bundled. The firm's marks are protected trademarks, and a redrawn or approximated wordmark would misrepresent them. Where a presenting entity must appear, set it as editable text in the deck's own typography, or install an officially supplied asset into this workspace's `images/` directory and add its usage rules here. Never imply affiliation, sponsorship, endorsement, or authorship by the firm. + +## V. Voice & Tone + +- Formality: formal +- Person: we / you (English), 我们 / 您 (Chinese) +- Emoji: forbidden +- Abbreviations: spell-out-first-use + +> Presentation convention derived from the register these decks are normally written in, not an official brand token. Lead with the answer, keep qualification precise rather than hedged, and attribute every figure. + +## VI. Icon Style + +- Preference: stroke + +> Presentation convention, not an official brand token. Prefer a restrained stroke family such as `tabler-outline`, keep one family across the deck, and use an icon only where it clarifies a role, state, or relationship. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/microsoft/templates/design_spec.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/microsoft/templates/design_spec.md new file mode 100644 index 00000000..35bbcadf --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/microsoft/templates/design_spec.md @@ -0,0 +1,65 @@ +--- +brand_id: microsoft +kind: brand +summary: Microsoft-style enterprise technology identity — four-square product spectrum on neutral grays for Microsoft 365, Azure, and IT program decks +primary_color: "#00A4EF" +--- + +# Microsoft Brand Specification + +> Identity-only preset. No SVG page roster — pages are composed freely under these constraints. + +## I. Brand Overview + +| Property | Value | +|---|---| +| Brand Name | Microsoft | +| Use Cases | Microsoft 365 and Azure solution decks, enterprise IT programs and migrations, partner and ISV presentations, and technical enablement | +| Tone | Professional, accessible, capability-focused, plainly worded | +| Sources | Public third-party brand-color compilations reviewed 2026-08-07, consistent across several independent sources. No value was read from an official manual, so every value here is an approximation | + +## II. Color Scheme + +| Role | HEX | Provenance | Notes | +|---|---|---|---| +| primary | `#00A4EF` | approx | The blue quadrant, documented as the Windows and Azure tone; chosen as primary because enterprise decks sit in that product space | +| accent-warm | `#F25022` | approx | The orange-red quadrant, documented as the Office tone | +| accent-green | `#7FBA00` | approx | The green quadrant, documented as the Xbox tone | +| accent-yellow | `#FFB900` | approx | The yellow quadrant, documented as the Bing and devices tone | +| bg | `#FFFFFF` | approx | Default light presentation background | +| surface | `#F3F2F1` | approx | Neutral gray — card and module surfaces | +| border | `#E1DFDD` | approx | Hairline rules, dividers, and table borders | +| muted-text | `#605E5C` | approx | Secondary text, annotations, and chart labels | + +Every row is `approx`. No value was read from an official asset or manual, so nothing here may be treated as brand truth or represented as the company's specification. The four quadrant colors are documented as carrying product-line meaning, so do not spread all four across one page as a decorative rainbow: pick the one matching the product being discussed and let neutrals carry the rest. The green and yellow quadrants collide with conventional success and warning semantics — where a page also needs status meaning, declare that mapping explicitly and keep it distinguishable from identity use. Do not lock an invented success/warning/error trio as identity. + +## III. Typography + +| Role | Family | Weight | +|---|---|---| +| title | `Arial, "Microsoft YaHei", sans-serif` | 600–700 | +| body | `Arial, "Microsoft YaHei", sans-serif` | 400 | + +> The company uses proprietary licensed typefaces that this preset neither bundles nor names as a claim. PPT Master does not auto-embed fonts or follow CSS tails in PowerPoint. The rows above are the default Windows/Office export; replace them only with a user-confirmed target-installed face. + +## IV. Logo + +- File: `none` +- Usage: never + +No logo asset is bundled. The company's marks are protected trademarks, and a redrawn or approximated mark would misrepresent them. Where a presenting entity must appear, set it as editable text in the deck's own typography, or install an officially supplied asset into this workspace's `images/` directory and add its usage rules here. The bundled icon library contains a single-color `simple-icons/microsoft` symbol for genuine brand-recognition contexts such as a partner or ecosystem listing; it is a symbol only, not the official lockup, and must never be combined with typed text to fabricate one. Never imply affiliation, sponsorship, endorsement, or certification. + +## V. Voice & Tone + +- Formality: neutral +- Person: we / you (English), 我们 / 你 (Chinese) +- Emoji: forbidden +- Abbreviations: spell-out-first-use + +> Presentation convention derived from the register these decks are normally written in, not an official brand token. Name products exactly and in full on first use, keep capability claims tied to what is generally available, and mark preview or roadmap features as such. + +## VI. Icon Style + +- Preference: stroke + +> Presentation convention, not an official brand token. Prefer a consistent stroke family such as `tabler-outline`, keep one family across the deck, and use an icon only where it clarifies a role, state, or relationship. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/nvidia/templates/design_spec.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/nvidia/templates/design_spec.md new file mode 100644 index 00000000..f76e5f2d --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/nvidia/templates/design_spec.md @@ -0,0 +1,63 @@ +--- +brand_id: nvidia +kind: brand +summary: NVIDIA-style accelerated-computing identity — signature green on near-black for AI, GPU, and data-center technical decks +primary_color: "#76B900" +--- + +# NVIDIA Brand Specification + +> Identity-only preset. No SVG page roster — pages are composed freely under these constraints. + +## I. Brand Overview + +| Property | Value | +|---|---| +| Brand Name | NVIDIA | +| Use Cases | AI and accelerated-computing talks, GPU and data-center architecture decks, developer sessions, and technical partner enablement | +| Tone | Technical, precise, performance-focused, evidence-led | +| Sources | NVIDIA's published trademark and logo usage guidelines, reviewed 2026-08-07, which state the green as RGB 118/185/0 and Pantone 376 C. Neutral and surface rows are presentation conventions, not published tokens | + +## II. Color Scheme + +| Role | HEX | Provenance | Notes | +|---|---|---|---| +| primary | `#76B900` | fact | Signature green; the published guidelines specify RGB 118/185/0, which is this hex, referenced to Pantone 376 C | +| accent | `#1A1A1A` | approx | Near-black field the green is normally presented against | +| bg | `#FFFFFF` | approx | Default light presentation background | +| surface | `#F4F6F1` | approx | Off-white with a green cast — card and module surfaces | +| border | `#DCE0D6` | approx | Hairline rules, dividers, and table borders | +| muted-text | `#5A5F55` | approx | Secondary text, annotations, and chart labels | + +The primary is `fact` — it is the value published in the company's own usage guidelines. Every other row is `approx` and represents presentation convention, not an official token. This green is bright and fails contrast against white at text sizes: never set body text in it, and prefer it on the near-black field or as a mark, rule, and single decisive accent. It also collides directly with conventional "pass" and "success" semantics — where a page needs status meaning, declare that mapping explicitly and keep it distinguishable from identity use. Do not lock an invented success/warning/error trio as identity. + +## III. Typography + +| Role | Family | Weight | +|---|---|---| +| title | `Arial, "Microsoft YaHei", sans-serif` | 600–700 | +| body | `Arial, "Microsoft YaHei", sans-serif` | 400 | + +> The company uses a proprietary licensed typeface that this preset neither bundles nor names as a claim. PPT Master does not auto-embed fonts or follow CSS tails in PowerPoint. The rows above are the default Windows/Office export; replace them only with a user-confirmed target-installed face. + +## IV. Logo + +- File: `none` +- Usage: never + +No logo asset is bundled. The published guidelines require written approval before any use of the logo or branded elements, set a minimum size of 60 pixels on screen, mandate clear space, and prohibit unapproved color modification — conditions this preset cannot grant. Where a presenting entity must appear, set it as editable text in the deck's own typography, or install an officially approved asset into this workspace's `images/` directory and record the approval and its usage rules here. The bundled icon library contains a single-color `simple-icons/nvidia` symbol for genuine brand-recognition contexts such as a partner or ecosystem listing; it is a symbol only, not the official lockup. Never imply affiliation, sponsorship, endorsement, or certification. + +## V. Voice & Tone + +- Formality: neutral +- Person: we / you (English), 我们 / 你 (Chinese) +- Emoji: forbidden +- Abbreviations: spell-out-first-use + +> Presentation convention derived from the register these decks are normally written in, not an official brand token. Give benchmark numbers their workload, configuration, and software version; name architectures and products exactly. + +## VI. Icon Style + +- Preference: stroke + +> Presentation convention, not an official brand token. Prefer a consistent stroke family such as `tabler-outline`, keep one family across the deck, and use an icon only where it clarifies a role, state, or relationship. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/pwc/templates/design_spec.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/pwc/templates/design_spec.md new file mode 100644 index 00000000..5a2a56d0 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/pwc/templates/design_spec.md @@ -0,0 +1,66 @@ +--- +brand_id: pwc +kind: brand +summary: PwC-style professional-services identity — warm orange-to-rose spectrum on black for assurance, tax, and advisory decks +primary_color: "#DB4E18" +--- + +# PwC Brand Specification + +> Identity-only preset. No SVG page roster — pages are composed freely under these constraints. + +## I. Brand Overview + +| Property | Value | +|---|---| +| Brand Name | PwC (PricewaterhouseCoopers) | +| Use Cases | Assurance, tax, and advisory deliverables, regulatory readouts, industry surveys and point-of-view papers, and client advisory decks | +| Tone | Formal, measured, precise, evidence-led | +| Sources | Public third-party brand-color compilations reviewed 2026-08-07. No value was read from an official manual, so every value here is an approximation | + +## II. Color Scheme + +| Role | HEX | Provenance | Notes | +|---|---|---|---| +| primary | `#DB4E18` | approx | Dark orange, the weight-bearing tone of the documented warm spectrum | +| accent | `#E88D14` | approx | Light orange from the same documented spectrum | +| accent-warm | `#F3BE26` | approx | Yellow from the same documented spectrum | +| accent-rose | `#E669A2` | approx | Rose from the same documented spectrum | +| accent-deep | `#AD1B02` | approx | Deep red anchoring the warm end of the spectrum | +| bg | `#FFFFFF` | approx | Default light presentation background | +| surface | `#F6F5F4` | approx | Warm off-white — card and module surfaces | +| border | `#DEDBD8` | approx | Hairline rules, dividers, and table borders | +| muted-text | `#5C5754` | approx | Secondary text, annotations, and chart labels | + +Every row is `approx`. No value was read from an official asset or manual, so nothing here may be treated as brand truth or represented to a client as the firm's specification. The identity is a warm spectrum rather than one flat brand color: pick a single tone per deck to carry emphasis and let the rest support it, and never spread all five across one page as a decorative rainbow. This spectrum overlaps the conventional warning and alert range, so where a page also needs status meaning, declare that mapping explicitly and keep it distinguishable from identity use. Do not lock an invented success/warning/error trio as identity. + +## III. Typography + +| Role | Family | Weight | +|---|---|---| +| title | `Arial, "Microsoft YaHei", sans-serif` | 600–700 | +| body | `Arial, "Microsoft YaHei", sans-serif` | 400 | + +> The firm uses proprietary licensed typefaces that this preset neither bundles nor names as a claim. PPT Master does not auto-embed fonts or follow CSS tails in PowerPoint. The rows above are the default Windows/Office export; replace them only with a user-confirmed target-installed face. + +## IV. Logo + +- File: `none` +- Usage: never + +No logo asset is bundled. The firm's marks are protected trademarks, and a redrawn or approximated mark would misrepresent them. Where a presenting entity must appear, set it as editable text in the deck's own typography, or install an officially supplied asset into this workspace's `images/` directory and add its usage rules here. Never imply affiliation, sponsorship, endorsement, or authorship by the firm, and never assemble colored geometric shapes beside a wordmark as a substitute for the real mark. + +## V. Voice & Tone + +- Formality: formal +- Person: we / you (English), 我们 / 您 (Chinese) +- Emoji: forbidden +- Abbreviations: spell-out-first-use + +> Presentation convention derived from the register these decks are normally written in, not an official brand token. Keep scope, basis, and period explicit, separate observation from opinion, and attribute every figure. + +## VI. Icon Style + +- Preference: stroke + +> Presentation convention, not an official brand token. Prefer a restrained stroke family such as `tabler-outline`, keep one family across the deck, and use an icon only where it clarifies a role, state, or relationship. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/tencent/templates/design_spec.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/tencent/templates/design_spec.md new file mode 100644 index 00000000..58a1b231 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/tencent/templates/design_spec.md @@ -0,0 +1,63 @@ +--- +brand_id: tencent +kind: brand +summary: Tencent-style internet and cloud identity — measured blue on light neutrals for platform, cloud, and ecosystem decks +primary_color: "#3458B0" +--- + +# Tencent Brand Specification + +> Identity-only preset. No SVG page roster — pages are composed freely under these constraints. + +## I. Brand Overview + +| Property | Value | +|---|---| +| Brand Name | Tencent | +| Use Cases | Internet platform and cloud solution decks, ecosystem and developer presentations, industry research briefings, and partner enablement | +| Tone | Professional, measured, platform-oriented | +| Sources | Public third-party brand-color compilations reviewed 2026-08-07, which state explicitly that these values are not published in the company's own guidelines. Every value here is an approximation | + +## II. Color Scheme + +| Role | HEX | Provenance | Notes | +|---|---|---|---| +| primary | `#3458B0` | approx | Medium-dark blue consistently documented as the dominant identity color | +| accent | `#1F3A78` | approx | Deeper blue derived from the primary for chapter grounds and depth | +| bg | `#FFFFFF` | approx | Default light presentation background | +| surface | `#F4F6FA` | approx | Cool off-white — card and module surfaces | +| border | `#DCE1EA` | approx | Hairline rules, dividers, and table borders | +| muted-text | `#59606E` | approx | Secondary text, annotations, and chart labels | + +Every row is `approx`, and the compiled sources say so themselves — the company does not publish these values. Nothing here may be treated as brand truth or represented as the company's specification. This blue sits close to the conventional hyperlink color, so keep non-interactive text out of it and reserve it for structure, marks, and the decisive element. The group's individual products carry materially different and much stronger identities than the corporate blue; when a deck is about one of them, that product's identity governs, not this preset. Choose semantic chart and status colors per deck; do not lock an invented success/warning/error trio as identity. + +## III. Typography + +| Role | Family | Weight | +|---|---|---| +| title | `Arial, "Microsoft YaHei", sans-serif` | 600–700 | +| body | `Arial, "Microsoft YaHei", sans-serif` | 400 | + +> The company uses proprietary licensed typefaces that this preset neither bundles nor names as a claim. PPT Master does not auto-embed fonts or follow CSS tails in PowerPoint. The rows above are the default Windows/Office export; replace them only with a user-confirmed target-installed face. + +## IV. Logo + +- File: `none` +- Usage: never + +No logo asset is bundled, and the bundled icon library has no symbol for this brand. The company's marks are protected trademarks, and its product marks must not be substituted for the corporate one. Where a presenting entity must appear, set it as editable text in the deck's own typography, or install an officially supplied asset into this workspace's `images/` directory and add its usage rules here. Never imply affiliation, sponsorship, endorsement, or authorization. + +## V. Voice & Tone + +- Formality: neutral +- Person: we / you (English), 我们 / 您 (Chinese) +- Emoji: forbidden +- Abbreviations: spell-out-first-use + +> Presentation convention derived from the register these decks are normally written in, not an official brand token. Name the specific product or business unit rather than the group where the claim belongs to one of them, and attribute every figure. + +## VI. Icon Style + +- Preference: stroke + +> Presentation convention, not an official brand token. Prefer a consistent stroke family such as `tabler-outline`, keep one family across the deck, and use an icon only where it clarifies a role, state, or relationship. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/xiaomi/templates/design_spec.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/xiaomi/templates/design_spec.md new file mode 100644 index 00000000..04b2cce5 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/brands/xiaomi/templates/design_spec.md @@ -0,0 +1,63 @@ +--- +brand_id: xiaomi +kind: brand +summary: Xiaomi-style consumer-technology identity — signature orange on clean white for product launches, ecosystem, and retail decks +primary_color: "#FF6900" +--- + +# Xiaomi Brand Specification + +> Identity-only preset. No SVG page roster — pages are composed freely under these constraints. + +## I. Brand Overview + +| Property | Value | +|---|---| +| Brand Name | Xiaomi | +| Use Cases | Consumer product launches, smart-device ecosystem presentations, retail and channel decks, and technology briefings | +| Tone | Accessible, product-forward, plainly worded, specification-honest | +| Sources | Public third-party brand-color compilations reviewed 2026-08-07, giving the orange as PMS 1585 C. No value was read from an official manual, so every value here is an approximation | + +## II. Color Scheme + +| Role | HEX | Provenance | Notes | +|---|---|---|---| +| primary | `#FF6900` | approx | Signature orange consistently documented across sources; commonly mapped to PMS 1585 C | +| accent | `#1F1F1F` | approx | Near-black for typographic weight against a predominantly white field | +| bg | `#FFFFFF` | approx | Default light presentation background; the identity is normally presented on clean white | +| surface | `#F7F7F7` | approx | Light gray — card and module surfaces | +| border | `#E5E5E5` | approx | Hairline rules, dividers, and table borders | +| muted-text | `#666666` | approx | Secondary text, annotations, and chart labels | + +Every row is `approx`. No value was read from an official asset or manual, so nothing here may be treated as brand truth or represented as the company's specification. The identity lives on generous white with product imagery carrying the page, so resist filling space with orange: use it for the mark, one accent, and the decisive figure. The orange fails contrast against white at text sizes and sits in the conventional warning range — keep it off body text, and where a page encodes status, declare that mapping separately. This orange is also nearly identical to another major Chinese technology brand's; when both appear together, distinguish them by mark and label rather than by color. Do not lock an invented success/warning/error trio as identity. + +## III. Typography + +| Role | Family | Weight | +|---|---|---| +| title | `Arial, "Microsoft YaHei", sans-serif` | 600–700 | +| body | `Arial, "Microsoft YaHei", sans-serif` | 400 | + +> The company uses proprietary licensed typefaces that this preset neither bundles nor names as a claim. PPT Master does not auto-embed fonts or follow CSS tails in PowerPoint. The rows above are the default Windows/Office export; replace them only with a user-confirmed target-installed face. + +## IV. Logo + +- File: `none` +- Usage: never + +No logo asset is bundled. The company's marks are protected trademarks whose current rounded-square form cannot be redrawn faithfully. Where a presenting entity must appear, set it as editable text in the deck's own typography, or install an officially supplied asset into this workspace's `images/` directory and add its usage rules here. The bundled icon library contains a single-color `simple-icons/xiaomi` symbol for genuine brand-recognition contexts such as an ecosystem listing; it is a symbol only, not the official lockup. Never imply affiliation, sponsorship, endorsement, or authorization. + +## V. Voice & Tone + +- Formality: neutral +- Person: we / you (English), 我们 / 你 (Chinese) +- Emoji: forbidden +- Abbreviations: spell-out-first-use + +> Presentation convention derived from the register these decks are normally written in, not an official brand token. State specifications exactly with their measurement conditions, and keep comparative claims tied to a named basis. + +## VI. Icon Style + +- Preference: stroke + +> Presentation convention, not an official brand token. Prefer a consistent stroke family such as `tabler-outline`, keep one family across the deck, and use an icon only where it clarifies a role, state, or relationship. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/README.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/README.md index 41330974..b4c33642 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/README.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/README.md @@ -1,74 +1,54 @@ -# SVG Visualization Template Library +# Chart Visualization Templates -This directory contains the standardized SVG visualization templates used by PPT Master — charts, infographics, process diagrams, relationship diagrams, and strategic frameworks. The directory name `charts/` is kept for backward compatibility; the library scope is broader than charts. +This directory contains 33 canonical value-driven references. A chart belongs here +when source values, categories, time, weights, or durations determine visual +mark position, length, area, angle, font size, or connection width. + +Qualitative page topology is built as a page-specific Structure by Executor. +Cell-grid semantics belong in [`tables/`](../tables/). Reusable PowerPoint +Master/Layout, page-type, slot, and placeholder contracts belong in +[`layouts/`](../layouts/). ## Source of truth -[`charts_index.json`](./charts_index.json) is the single source of truth for the library: total count + one selection-rule `summary` per template (format: `"Pick for X. Skip if Y (use other_key)."`). [`chart_recall.py`](../../scripts/chart_recall.py) can recall a bounded candidate set from this live registry without maintaining a second category or keyword index. +[`charts_index.json`](./charts_index.json) is the sole chart registry. Its +`charts` object maps each canonical key to one selection-rule `summary` in the +form `Pick for ... Skip if ...`. The key matches `.svg`; `meta.total` +matches the canonical SVG roster. -For one page, provide 3-8 English semantic content-shape tags, then inspect the positive-scoring summaries plus the explicit `no-template-match` option. The requested limit is a cap, not a padding target, and lexical confidence never expands the output automatically. At `high` / `medium`, retain `no-template-match` when no bounded candidate fits. At `low` / `none`, a fitting candidate needs no expansion, but rerun the same query once with `--semantic-fallback` before keeping `no-template-match`. In Default Generate, a selected result creates one `Page | Template | Usage` row in §VII and one matching `page_charts` entry; its path is derived from the key, while Usage is concise page-local intent and detailed adaptation remains in §IX. Quick Generate keeps the selected key/purpose only in active context and writes no mapping artifact. A negative result creates no row in either profile. See [`chart-recall.md`](../../scripts/docs/chart-recall.md). The Generate workflow remains the authority for when the active profile uses this helper; maintainers may still open the registry directly when editing or auditing the catalog. +Use [`visualization_recall.py`](../../scripts/visualization_recall.py) for +bounded Chart/Table or chart-only recall. New Default planning writes +`chart/` to `page_visualizations`; Quick keeps the selected reference in +active context. [`chart_recall.py`](../../scripts/chart_recall.py) and bare keys +remain legacy compatibility only. ## Authoring contract -[`CHART_STYLE_GUIDE.md`](./CHART_STYLE_GUIDE.md) owns readable standalone SVG, semantic and structural fidelity, root-group bounds, data encoding, and neutral previews. Default Design Spec §IX or the Quick active-context page decision plus source data own the generated page's semantics; Default `spec_lock.md` owns stable project anchors. A selected SVG is a page-local structural reference, while its type, styling, frames, grouping, item count, capacity, and geometry remain adaptable. +[`VISUALIZATION_TEMPLATE_AUTHORING.md`](../VISUALIZATION_TEMPLATE_AUTHORING.md) +owns the shared standalone-SVG, neutral-preview, root-boundary, Shape-first, +family, and catalog rules. Chart-specific requirements are: -## Visualization output model +- Preserve the exact value-to-mark mapping, labels, units, categories, series, + ordering, and source notes required by the information. +- Keep calculator-supported `chart-plot-area` markers accurate. +- Default output remains independently editable DrawingML shapes. +- Add native Chart replacement metadata only for a supported independent data + object. The visible fallback and metadata describe the same data. +- Do not classify a named quadrant, process, hierarchy, or relationship diagram + as a chart unless values actually determine its marks. -This library is **Shape-first**. Infographics, process diagrams, architecture -diagrams, frameworks, and the default rendering of data charts export as -independently editable PowerPoint shapes: +`matrix_2x2` is a chart: each item's x/y coordinates encode two values and its +radius encodes a third metric. A fixed 2×2 set of titled text regions is a +page-specific Structure. A schedule whose dates or durations determine task-bar +position and length is `chart/gantt_chart`; a qualitative stage/lane plan is a +Structure built from those relationships. -- Use ordinary SVG primitives for basic nodes, containers, and straight - relationships; they export as editable PowerPoint shapes. A straight - directional relationship uses `` with a registered arrow marker. -- When a bent or curved relationship exactly matches a stock Connector contour, - prefer a compact authored `bentConnector*` / `curvedConnector*` preset. It is - an unconnected native Connector shape and does not create node attachment or - automatic routing. -- Use a stock PowerPoint preset for a solid block arrow, chevron, or standard - flowchart node when it exactly expresses the intended object. A template may - retain the complete compact atomic `` generated by `preset_shape_svg.py`, - so direct export preserves the native preset identity. The group owns the - metadata and base paint once; its direct visible paths are registry-derived - layers with only necessary per-layer paint overrides. It has no hidden - carrier, preview wrapper, or stored fingerprint. If preset, frame, - adjustments, or paint changes, regenerate the whole group instead of editing - metadata or paths. PPTX import and `mirror` retain their separate expanded - lossless representation; do not copy that transport form into new templates. -- When no single preset suffices but closed operands can express the object, - materialize the Union / Combine / Fragment / Intersect / Subtract result with - `shape_boolean_svg.py` before considering a hand-authored contour. -- Keep a hand-authored `` / `` only for branded, data-defined, - locked organic / hand-drawn, or other contours that primitives, an exact - preset, and Boolean materialization cannot faithfully express. They still - export as editable DrawingML shapes. -- Authored Connector metadata comes only from `preset_shape_svg.py`; never - hand-write endpoint attachment metadata. Existing attached Connector topology - imported from a source PPTX belongs to the preserve/mirror round-trip - contract, not chart-template authoring. +## Runtime boundary -Data-backed charts retain the separate opt-in replacement route described -below. Conceptual diagrams and frameworks are never labeled as native charts. - -## Native Chart/Table replacement markers - -Supported data chart templates include a `` marker by default, and pure text-grid table templates include the table form. These are capability examples, not project decisions: Default keeps and rewrites the marker only when its Design Spec §IX page block says `Native-ready: yes` (legacy §VII fallback only); Quick makes the same independent-object decision in active context before drawing. Otherwise omit it. The default SVG export path remains shape-based DrawingML. With `--native-charts-and-tables`, prepared groups become native PowerPoint Chart/Table objects from their JSON metadata. The legacy `--native-objects` spelling remains a compatibility alias. - -`--native-charts-and-tables` is an explicit native-object opt-in and may be lossy or visually normalized. Replacement-local value labels, center KPIs, callouts, quadrant notes, fixed axis ranges, and custom binning/splits may not survive native replacement unless represented by the payload. ChartEx palette entries do survive when supplied through valid payload colors, but this does not preserve every ChartEx style detail. Detectable information-loss risks should be reported as warnings, not handled by disabling an otherwise supported replacement marker. Review those warnings and compare the native-object export with the default shape-based export before delivery. - -Native replacement authoring remains active for all 23 currently supported data-chart templates: - -| Family | Active replacement templates | Native output | -|---|---|---| -| Category comparison | `column_chart`, `horizontal_bar_chart`, `grouped_bar_chart`, `stacked_bar_chart` | Classic category charts | -| Time trend | `line_chart`, `area_chart`, `stacked_area_chart`, `dual_axis_line_chart` | Classic line/area/combo charts | -| Part-to-whole | `pie_chart`, `donut_chart`, `pie_of_pie_chart`, `bar_of_pie_chart`, `treemap_chart`, `sunburst_chart` | Classic pie-family or ChartEx hierarchy charts | -| Distribution and relationship | `scatter_chart`, `bubble_chart`, `histogram_chart`, `pareto_chart`, `box_plot_chart` | Classic XY or ChartEx distribution charts | -| Specialty business charts | `waterfall_chart`, `funnel_chart`, `stock_chart`, `radar_chart` | ChartEx or classic specialty charts | -| Text-grid tables | `basic_table`, `financial_statement_table` | Native DrawingML tables | - -Replacement payloads must include explicit `name`, `x`, `y`, `width`, and `height` fields so the native frame aligns with the fallback drawing. Keep legends, explanatory cards, source notes, center KPIs, and custom callouts outside the marked group when they must remain separate shapes; otherwise accept and review the native-object export warning. Canonical rectangular merged text cells may use anchor-only `row_span` / `col_span` metadata with blank covered cells; nonrectangular merges and graphical cells (harvey balls, rating dots, avatars) stay unmarked on the SVG fallback route. Per-side borders, plain multi-paragraph cells, and the closed run-rich paragraph schema use the contracts in [`native-data-interface.md`](../../references/native-data-interface.md#2-powerpoint-native-chart--table-replacement-markers-opt-in). Relationship-bearing text, structural line breaks, fields, tabs, bullets, and arbitrary rich-text OOXML stay on the SVG fallback route. - -## Usage - -Execution loads only selected keys under [`executor-chart.md`](../../references/executor-chart.md) §1 and reuses an unchanged file within the active context. Files are named after the `key` field in `charts_index.json` (e.g. `column_chart.svg`, `quadrant_bubble_scatter.svg`). Templates are named by visual structure, not by business-model name — terms like SWOT, BCG, PEST, OKR, Porter's Five Forces, and Value Chain are translated into semantic content-shape tags before candidate recall. +One selected SVG is a flexible reference for one mapped page. Design Spec §IX +or the Quick active-context decision plus source data owns final semantics. +Project palette, typography, chrome, grouping, capacity, and geometry remain +adaptable. Selecting a chart reference does not itself select native output; +§IX/Quick names independent objects separately and decides +`=yes|no`, while explicit `--native-charts-and-tables` export is a +second opt-in. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/agenda_list.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/agenda_list.svg deleted file mode 100644 index af706a8b..00000000 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/agenda_list.svg +++ /dev/null @@ -1,142 +0,0 @@ - - - - - - - - - - - - - - - - - Meeting Agenda - - - Q3 STRATEGIC ALIGNMENT & REVIEW · MAY 13, 2026 - - - - - - - 75min - - - TOTAL DURATION - - - - - - - - - - - - - - - - 01 - - - - Executive Summary & Q3 Performance - - - High-level overview of revenue targets, key metrics, and major wins from the last quarter. - - - - - 10 MIN - - - - OWNER · CEO - - - - - - - - 02 - - - Product Roadmap Updates - - - Review of upcoming features, delayed items, and engineering resource allocation. - - - - 20 MIN - - - OWNER · VP PRODUCT - - - - - - - - 03 - - - Competitive Market Analysis - - - Deep dive into recent moves by Competitor A and our strategic response plan. - - - - 15 MIN - - - OWNER · HEAD OF STRATEGY - - - - - - - - 04 - - - Q4 Goals & OKR Planning· DECISION - - - Collaborative session to finalize departmental objectives and assign ownership. - - - - 30 MIN - - - OWNER · LEADERSHIP TEAM - - - - - - - Presenter: Management Team · Conference Room A · Recorded - - - diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/arc_anchored_list.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/arc_anchored_list.svg deleted file mode 100644 index e9efb050..00000000 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/arc_anchored_list.svg +++ /dev/null @@ -1,94 +0,0 @@ - - - - - - - Four-Track Improvement Plan - RADIAL ANCHOR · FOUR PARALLEL TRACKS - - - - - - - - - 01 - - - - - 02 - - - - - 03 - - - - - 04 - - - - - - Growth - Plan - - - - - - - Track 01 — Heading Goes Here - Concise description line one explaining the goal and scope of this track. - Key actions, expected outcome, and the resources or partners needed. - - - - - - - - Track 02 — Heading Goes Here - Concise description line one explaining the goal and scope of this track. - Key actions, expected outcome, and the resources or partners needed. - - - - - - - - Track 03 — Heading Goes Here - Concise description line one explaining the goal and scope of this track. - Key actions, expected outcome, and the resources or partners needed. - - - - - - - - Track 04 — Heading Goes Here - Concise description line one explaining the goal and scope of this track. - Key actions, expected outcome, and the resources or partners needed. - - - - diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/basic_table.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/basic_table.svg deleted file mode 100644 index 52e20f96..00000000 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/basic_table.svg +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - Quarterly Resource Allocation - BASIC TABLE FORMAT · TRADITIONAL FULL GRID WITH ALIGNMENT RULES - - - - - { - "name": "basic_table", - "x": 80, - "y": 150, - "width": 1120, - "height": 340, - "strict_grid": true, - "column_widths": [160, 400, 160, 280, 120], - "row_heights": [50, 48, 48, 48, 48, 48, 50], - "style": { - "font_family": "Roboto", - "font_size": 15, - "header_font_size": 13, - "header_fill": "#F8FAFC", - "header_text": "#475569", - "body_fill": "#FFFFFF", - "body_text": "#0F172A", - "band_fill": "#FFFFFF", - "border_color": "#E2E8F0", - "border_width": 1, - "padding": {"left": 10, "right": 10, "top": 4, "bottom": 4}, - "valign": "middle" - }, - "columns": [ - {"text": "PROJECT ID", "bold": true}, - {"text": "PROJECT DESCRIPTION", "bold": true}, - {"text": "DEPARTMENT", "align": "ctr", "bold": true}, - {"text": "HEADCOUNT", "align": "ctr", "bold": true}, - {"text": "BUDGET (USD)", "align": "r", "bold": true} - ], - "rows": [ - [ - {"text": "PRJ-2025-01A", "color": "#334155"}, - {"text": "Cloud Infrastructure Migration", "bold": true}, - {"text": "Engineering", "align": "ctr", "color": "#475569"}, - {"text": "12", "align": "ctr", "color": "#334155", "bold": true}, - {"text": "450,000", "align": "r", "bold": true} - ], - [ - {"text": "PRJ-2025-02B", "color": "#334155"}, - {"text": "Global Marketing Campaign Q2", "bold": true}, - {"text": "Marketing", "align": "ctr", "color": "#475569"}, - {"text": "8", "align": "ctr", "color": "#334155", "bold": true}, - {"text": "820,500", "align": "r", "bold": true} - ], - [ - {"text": "PRJ-2025-03C", "color": "#334155"}, - {"text": "Sales Enablement Training", "bold": true}, - {"text": "Sales", "align": "ctr", "color": "#475569"}, - {"text": "4", "align": "ctr", "color": "#334155", "bold": true}, - {"text": "95,000", "align": "r", "bold": true} - ], - [ - {"text": "PRJ-2025-04A", "color": "#334155"}, - {"text": "Mobile App Redesign V3.0", "bold": true}, - {"text": "Product", "align": "ctr", "color": "#475569"}, - {"text": "15", "align": "ctr", "color": "#334155", "bold": true}, - {"text": "315,200", "align": "r", "bold": true} - ], - [ - {"text": "PRJ-2025-05B", "color": "#334155"}, - {"text": "Cybersecurity Audit & Fixes", "bold": true}, - {"text": "IT Security", "align": "ctr", "color": "#475569"}, - {"text": "5", "align": "ctr", "color": "#334155", "bold": true}, - {"text": "120,000", "align": "r", "bold": true} - ], - [ - {"text": "TOTAL ALLOCATION", "color": "#1D4ED8", "bold": true, "fill": "#EFF6FF"}, - {"text": "", "fill": "#EFF6FF"}, - {"text": "", "fill": "#EFF6FF"}, - {"text": "44", "align": "ctr", "color": "#1D4ED8", "bold": true, "fill": "#EFF6FF"}, - {"text": "1,800,700", "align": "r", "color": "#1D4ED8", "bold": true, "fill": "#EFF6FF"} - ] - ] - } - - - - - - - - - PROJECT ID - - PROJECT DESCRIPTION - - DEPARTMENT - - HEADCOUNT - - BUDGET (USD) - - - - - - - - - PRJ-2025-01A - Cloud Infrastructure Migration - Engineering - 12 - 450,000 - - - PRJ-2025-02B - Global Marketing Campaign Q2 - Marketing - 8 - 820,500 - - - PRJ-2025-03C - Sales Enablement Training - Sales - 4 - 95,000 - - - PRJ-2025-04A - Mobile App Redesign V3.0 - Product - 15 - 315,200 - - - PRJ-2025-05B - Cybersecurity Audit & Fixes - IT Security - 5 - 120,000 - - - TOTAL ALLOCATION - 44 - 1,800,700 - - - - - Data Source: PMO Budget Allocation Draft V1.0 - - diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/charts_index.json b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/charts_index.json index 5d8d83f0..93b188d0 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/charts_index.json +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/charts_index.json @@ -1,12 +1,17 @@ { "meta": { - "total": 76, + "total": 33, "defaultViewBox": "0 0 1280 720", - "formats": ["ppt169"], + "formats": [ + "ppt169" + ], "filePattern": "{key}.svg", - "libraryPositioning": "Visualization template library covering charts, infographics, diagrams, and strategic frameworks. The `charts/` path is retained for backward compatibility. Templates are named by visual structure, not by business-model name — model-specific frameworks (SWOT, BCG, PEST, OKR, Porter's Five Forces, Value Chain, etc.) are matched via keywords in `summary`.", - "summaryGrammar": "Each chart's `summary` is a selection rule, not a description. Format: 'Pick for . Skip if '. Strategist supplies 3–8 semantic content-shape tags per candidate page; chart_recall.py returns a bounded lexical shortlist and exposes the full catalog only through an explicitly requested semantic fallback.", - "updated": "2026-07-21" + "libraryPositioning": "Data-driven visualization templates whose source values determine geometry or visual encoding.", + "summaryGrammar": "Each chart summary is a selection rule, not a description. Format: 'Pick for . Skip if '.", + "updated": "2026-08-08" + }, + "aliases": { + "project_schedule_table": "gantt_chart" }, "charts": { "area_chart": { @@ -15,9 +20,6 @@ "bar_of_pie_chart": { "summary": "Pick for pie composition where small long-tail slices should be expanded into a stacked bar detail. Skip if secondary detail should stay circular (use pie_of_pie_chart) or flat shares suffice (use pie_chart)." }, - "column_chart": { - "summary": "Pick for single-series category value comparison, 3-8 categories. Skip for >12 long-label items (use horizontal_bar_chart) or multi-series (use grouped_bar_chart)." - }, "box_plot_chart": { "summary": "Pick for distribution shape per group (median, quartiles, outliers). Skip if only the average per group matters (use column_chart)." }, @@ -30,20 +32,23 @@ "butterfly_chart": { "summary": "Pick for two mirrored datasets sharing a common axis (age pyramid, A/B, income vs expense). Skip for >2 sides (use grouped_bar_chart)." }, + "column_chart": { + "summary": "Pick for single-series category value comparison, 3-8 categories. Skip for >12 long-label items (use horizontal_bar_chart) or multi-series (use grouped_bar_chart)." + }, "donut_chart": { "summary": "Pick for 3-6 part proportions where a center KPI/total deserves emphasis. Skip if no center value to feature (use pie_chart)." }, "dual_axis_line_chart": { - "summary": "Pick when 2 metrics with different units/scales must be compared over time. Skip if both metrics share the same unit (use line_chart)." + "summary": "Pick for comparing 2 metrics with different units/scales over time. Skip if both metrics share the same unit (use line_chart)." }, "dumbbell_chart": { "summary": "Pick for before-vs-after or two-state difference across 5-10 items. Skip for single snapshot (use column_chart) or 3+ states (use grouped_bar_chart)." }, "funnel_chart": { - "summary": "Pick for 3-5 sequential conversion stages with monotonic drop-off. Skip if flow branches/merges (use sankey_chart) or steps don't entail loss (use process_flow)." + "summary": "Pick for 3-5 sequential conversion stages whose values drive a monotonic drop-off. Skip if the stages do not encode loss or qualitative branches and returns carry the message (build a Structure from the page relationships)." }, "gantt_chart": { - "summary": "Pick for project schedule with 6-12 tasks, durations, and dependencies. Skip for simple milestones without duration (use timeline) or vertical roadmap (use roadmap_vertical)." + "summary": "Pick for project schedule with 6-12 tasks whose dates or durations determine bar position and length, with optional dependencies. Skip for milestones without duration or qualitative lane-stage handoffs (build a Structure from the page relationships)." }, "gauge_chart": { "summary": "Pick for one hero metric or single KPI's goal achievement rate. Skip for multiple metrics (use bullet_chart for target+actual or progress_bar_chart for completion %)." @@ -60,23 +65,14 @@ "horizontal_bar_chart": { "summary": "Pick for ranking 5-12 items, especially with long labels. Skip if <=8 short-label items (use column_chart)." }, - "kpi_cards": { - "summary": "Pick for 4-8 standalone numeric metrics shown as overview cards (2x2 or 1x4) — exec summary opener, dashboard headline, quarterly recap, results-at-a-glance. Skip if metrics have target baselines (use bullet_chart) or single hero number (use gauge_chart)." - }, "line_chart": { "summary": "Pick for 1-3 time-series on a continuous axis showing direction. Skip if cumulative volume matters (use area_chart) or different units (use dual_axis_line_chart)." }, "matrix_2x2": { - "summary": "Pick for items plotted on Impact x Effort or similar generic 2-axis prioritization. Skip for named-quadrant text frameworks (use quadrant_text_bullets) or bubble-sized portfolios (use quadrant_bubble_scatter)." - }, - "quadrant_text_bullets": { - "summary": "Pick for any 2×2 framework where each quadrant holds a titled bullet list — SWOT (Strengths/Weaknesses/Opportunities/Threats, internal-external × helpful-harmful), Ansoff (Existing/New Markets × Existing/New Products), or any named two-axis matrix with text content. Skip for items plotted as points (use matrix_2x2) or bubble-sized portfolios (use quadrant_bubble_scatter)." - }, - "quadrant_bubble_scatter": { - "summary": "Pick for 2×2 portfolio where items are plotted as bubbles sized by a third metric — BCG Growth × Share with Stars/Cash Cows/Question Marks/Dogs, revenue-weighted portfolio matrix. Skip for textual named quadrants (use quadrant_text_bullets) or generic prioritization without bubble size (use matrix_2x2)." + "summary": "Pick for 4-10 items whose x and y positions encode two dimensions and whose bubble radius encodes a third magnitude inside a 2×2 quadrant frame. Skip for fixed qualitative regions with text assigned to zones (build a Structure from the page relationships)." }, "pareto_chart": { - "summary": "Pick to show 80/20 contribution: descending bars + cumulative line. Skip if cumulative line is not the message (use column_chart)." + "summary": "Pick for showing 80/20 contribution with descending bars and a cumulative line. Skip if the cumulative line is not the message (use column_chart)." }, "pie_chart": { "summary": "Pick for simple 3-6 part proportions of one whole. Skip for >=7 parts (use donut_chart or treemap_chart) or hierarchical composition (use treemap_chart)." @@ -84,12 +80,6 @@ "pie_of_pie_chart": { "summary": "Pick for pie composition where small slices need a secondary pie detail. Skip if the secondary detail is easier to compare as bars (use bar_of_pie_chart) or hierarchy matters (use sunburst_chart)." }, - "hub_inward_arrows": { - "summary": "Pick for 1 center subject + 4-5 surrounding forces with arrows pointing inward — Porter's Five Forces (central rivalry, threat of new entrants/substitutes, bargaining power of buyers/suppliers), threat-model with central asset, pressure-on-core diagrams. Skip for outward radiation from center capability (use hub_spoke) or non-directional cluster (use mind_map)." - }, - "process_flow": { - "summary": "Pick for 3-8 sequential steps connected by simple arrows — approval workflows, customer onboarding, request handling, lifecycle stages. Skip if cyclical (use circular_stages) or stages produce named outputs (use pipeline_with_stages)." - }, "progress_bar_chart": { "summary": "Pick for 3-8 items each with a completion %. Skip if items have explicit target+actual values (use bullet_chart)." }, @@ -106,7 +96,7 @@ "summary": "Pick for 2-4 series showing both total and composition over time. Skip if individual series matter more than total (use line_chart)." }, "stacked_bar_chart": { - "summary": "Pick when each category splits into 2-4 internal parts and total still matters. Skip if only comparing totals (use column_chart)." + "summary": "Pick for categories split into 2-4 internal parts when each total still matters. Skip if only comparing totals (use column_chart)." }, "stock_chart": { "summary": "Pick for open-high-low-close price movement over dates. Skip if showing only close-price direction (use line_chart) or category volume comparison (use column_chart)." @@ -114,128 +104,14 @@ "sunburst_chart": { "summary": "Pick for hierarchical part-to-whole composition across 2-3 levels where each ring should stay visible. Skip if rectangular area comparison is clearer (use treemap_chart) or shares are flat (use donut_chart)." }, - "timeline": { - "summary": "Pick for 3-8 milestone events on a horizontal time axis (no duration). Skip for tasks with start/end ranges (use gantt_chart) or vertical layout (use roadmap_vertical)." - }, "treemap_chart": { "summary": "Pick for hierarchical/grouped area proportion with many parts of varying size. Skip for flat 3-6 parts (use pie_chart or donut_chart)." }, "waterfall_chart": { "summary": "Pick for stepwise additive/subtractive breakdown bridging a starting value to an ending value. Skip if no running total (use column_chart)." }, - "pyramid_chart": { - "summary": "Pick for 3-6 stratified hierarchy layers in flat 2D side-view — Maslow's hierarchy, maturity models, value hierarchy, capability tiers, market segments, audience pyramid. Skip for dramatic tone (use pyramid_isometric), flat priority list (use vertical_list), or org reporting (use top_down_tree)." - }, - "pyramid_isometric": { - "summary": "Pick for 4-tier maturity/achievement model with presentation drama (review reports, capability tiers). Tier count fixed at 4 (hand-tuned vertices). Skip for documentary tone (use pyramid_chart) or tier count != 4." - }, - "venn_diagram": { - "summary": "Pick for 2-3 overlapping sets where the intersection is the message. Skip if no overlap exists (use icon_grid)." - }, - "pros_cons_chart": { - "summary": "Pick for bilateral pros/cons list, 2-5 items per side. Skip for full feature comparison (use comparison_table) or numeric A/B mirror data (use butterfly_chart)." - }, - "circular_stages": { - "summary": "Pick for 4-6 stage closed loop where stages compose a cycle — PDCA, flywheel compounding loops (Attract → Engage → Delight), lifecycle, continuous improvement. Skip for linear flow (use process_flow), one-shot sequence (use numbered_steps), or wedge-based central topic (use segmented_wheel)." - }, - "numbered_steps": { - "summary": "Pick for 3-6 horizontal sequential steps with numeric emphasis — how-it-works section, getting-started guide, methodology overview, implementation phases. Skip if steps need connector arrows (use process_flow) or named output artifacts (use pipeline_with_stages)." - }, - "icon_grid": { - "summary": "Pick for 4-9 parallel features/capabilities/services as icon cards — feature grid, service lineup, benefits matrix, brand values, product highlights. Skip for sequential ordering (use numbered_steps) or hierarchical layers (use pyramid_chart)." - }, - "isometric_stairs": { - "summary": "Pick for 4-7 ascending stages emphasizing growth/maturity progression visually. Skip for flat sequential steps (use numbered_steps) or formal hierarchy (use pyramid_chart)." - }, - "mind_map": { - "summary": "Pick for one core topic radiating into 3-6 brainstorm branches. Skip for capability hub-and-spoke (use hub_spoke) or strict hierarchy (use top_down_tree)." - }, - "comparison_table": { - "summary": "Pick for 2-4 plans/products compared across many feature rows (dense matrix). Skip for pricing-tier marketing layout (use comparison_columns)." - }, - "snake_flow": { - "summary": "Pick for 6-10 winding sequential steps fitting a long journey/lifecycle on one slide. Skip for <=5 steps (use numbered_steps)." - }, - "roadmap_vertical": { - "summary": "Pick for 4-8 milestones on a vertical timeline with status indicators. Skip for horizontal time emphasis (use timeline) or tasks with durations (use gantt_chart)." - }, "word_cloud": { - "summary": "Pick for 20-30 keywords sized by frequency/weight. Skip if individual keyword position carries meaning (use icon_grid)." - }, - "concentric_circles": { - "summary": "Pick for 3-5 priority rings from core to periphery — bullseye/onion model, sphere of influence, stakeholder rings, core-to-ecosystem priority layers, target-vs-extended audience. Skip for non-prioritized layers (use pyramid_chart)." - }, - "segmented_wheel": { - "summary": "Pick for one central topic split into 4-8 equally-weighted parallel dimensions (5W1H, 4P, 5S, 6-aspect review), each wedge paired with a description card. Skip for sequential cycles (use circular_stages), proportional shares (use pie_chart), or hub with non-wedge spokes (use hub_spoke)." - }, - "arc_anchored_list": { - "summary": "Pick for 3-5 parallel tracks/pillars unified by a left-edge radial fan as visual anchor (each lane = numbered wedge + title + body + right-end color square). Skip for plain numbered enumeration without unifying core (use vertical_list or numbered_steps), or sequential phases (use process_flow)." - }, - "chevron_process": { - "summary": "Pick for 3-6 phase methodology with chunky arrow-chain progression and deliverables per phase. Skip for <=2 phases or non-linear flow (use process_flow), or chain ending in an aggregate outcome wedge (use chevron_chain_with_tail)." - }, - "chevron_chain_with_tail": { - "summary": "Pick for 4-6 sequential chevron blocks plus a final wedge representing aggregate outcome — Porter's value chain (primary + support activities mapped to margin), process leading to a summary deliverable, contribution chain to a result. Skip for plain chevron flow without summary tail (use chevron_process) or non-chevron pipeline (use pipeline_with_stages)." - }, - "comparison_columns": { - "summary": "Pick for 2-4 pricing/service tier cards in side-by-side columns (marketing layout). Skip for dense feature comparison (use comparison_table)." - }, - "fishbone_diagram": { - "summary": "Pick for cause-and-effect root cause analysis with 4-6 cause branches (Ishikawa, 6M). Skip for sequential flow (use process_flow)." - }, - "hub_spoke": { - "summary": "Pick for 1 core capability + 4-8 surrounding capabilities (platform/ecosystem); each spoke = title or title + 1-2 line description. Skip if center is a system containing parts with their own descriptions (use module_composition), or surroundings exert inward pressure on the center (use hub_inward_arrows)." - }, - "vertical_list": { - "summary": "Pick for 3-6 numbered key points each with a short description — design principles, core tenets, action items, key takeaways, recommendations, executive summary points. Skip for icon-style cards (use icon_grid) or sequential steps (use numbered_steps)." - }, - "vertical_pillars": { - "summary": "Pick for 1×3 / 1×4 / 1×5 vertical column layout where each pillar = one independent category with title + bullets — PEST (Political/Economic/Social/Technological), four-pillar strategy overview, side-by-side independent categories. Skip for 2×2 quadrant (use quadrant_text_bullets), pricing tiers (use comparison_columns), or 2×2 parallel aspects (use labeled_card)." - }, - "layered_architecture": { - "summary": "Pick for 3-4 horizontal architecture layers (presentation/service/data), 2-4 module cards per layer, each card = title + 1-line description (description required, even if source brief). Skip if no per-module descriptions (use icon_grid) or no horizontal layering (use module_composition)." - }, - "module_composition": { - "summary": "Pick for one parent container wrapping 3-N child module cards, each = title + 2-3 bullets — fits 'Feature X contains 3 parts, each with its own description'. Skip if source has only labels without descriptions (use numbered_steps or icon_grid)." - }, - "pipeline_with_stages": { - "summary": "Pick for 3-5 horizontal pipeline stages, each = title + 1-line description + output artifact, connected by arrows (data pipelines, ETL, build pipelines). Skip if any stage lacks an artifact (use process_flow or numbered_steps)." - }, - "client_server_flow": { - "summary": "Pick for left-side clients + right-side servers with labeled bidirectional arrows for key interactions (request/response/push). Each module = name + 1-line description; each arrow must have an action label. Skip for non-distributed flows (use process_flow)." - }, - "basic_table": { - "summary": "Pick for plain tabular text/number grid, 3-8 columns. Skip if cells need visual bars (use consulting_table) or qualitative scores (use harvey_balls_table)." - }, - "consulting_table": { - "summary": "Pick for high-density tables with embedded micro bar visuals (consulting/financial reports). Skip for plain text data (use basic_table)." - }, - "project_schedule_table": { - "summary": "Pick for table-style task tracker (task / owner / status / timeline). Skip for true Gantt with dependencies (use gantt_chart) or schedule without ownership (use roadmap_vertical)." - }, - "financial_statement_table": { - "summary": "Pick for income statement / balance sheet style with right-aligned numbers and strong total rows. Skip for non-financial tabular data (use basic_table)." - }, - "feature_matrix_table": { - "summary": "Pick for competitive feature checklist with checkmarks across products. Skip for qualitative scores (use harvey_balls_table) or pricing tier marketing (use comparison_columns)." - }, - "harvey_balls_table": { - "summary": "Pick for qualitative scoring grid using 0-100% Harvey balls (vendor/skill assessment). Skip for binary checkmarks (use feature_matrix_table) or numeric values (use basic_table)." - }, - "team_roster": { - "summary": "Pick for 3-12 leadership/team profile cards (photo + name + title + short bio). Skip for reporting hierarchy (use top_down_tree)." - }, - "top_down_tree": { - "summary": "Pick for hierarchical top-down tree 2-4 levels deep with parent→children reporting/decomposition lines — org charts (CEO → VPs → Directors), OKR cascades (Objective → Key Results → Initiatives), WBS decomposition. Skip for non-hierarchical brainstorm (use mind_map) or flat team showcase (use team_roster)." - }, - "journey_map": { - "summary": "Pick for multi-phase customer experience matrix with actions, emotion curve, and pain points per phase. Skip for simple linear funnel (use funnel_chart)." - }, - "agenda_list": { - "summary": "Pick for table of contents, meeting agendas, or presentation roadmap — numbered items + brief description + duration / owner per row. Skip for substantive content lists (use vertical_list) or single-page section dividers (use a cover layout)." - }, - "labeled_card": { - "summary": "Pick for 3-4 parallel aspects of one subject with per-aspect titles + short body (self-introduction, four-pillar overview, capability quadrant). Skip for plain feature lists (use icon_grid), sequential steps (use numbered_steps), or strategic quadrants (use quadrant_text_bullets / matrix_2x2)." + "summary": "Pick for 20-30 keywords whose font size encodes frequency or weight. Skip if items are equal peers without value-driven sizing (build a Structure from the page relationships)." } } } diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/chevron_chain_with_tail.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/chevron_chain_with_tail.svg deleted file mode 100644 index 19e9bb7d..00000000 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/chevron_chain_with_tail.svg +++ /dev/null @@ -1,221 +0,0 @@ - - - - - - - - - - - Value Chain Analysis - - - INTERNAL OPERATIONS · COMPETITIVE ADVANTAGE EVALUATION - - - - - - +18% - - - MARGIN VS PEERS - - - FY24 weighted avg - - - - - - - - SUPPORT ACTIVITIES - - - PRIMARY ACTIVITIES - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Firm Infrastructure - - - General mgmt · Planning · Finance · Legal · Quality - - - - Human Resources - - - Recruitment · Training · Development · Compensation - - - - Tech Development - - - R&D · Product design · Process automation · IT systems - - - - Procurement - - - Supplier sourcing · Raw materials · Vendor management - - - - - - - - Inbound - - - Logistics - - - Inventory · Warehousing - - - - Operations - - - Machining · Assembly - - - - Outbound - - - Logistics - - - Distribution · Shipping - - - - Marketing - - - & Sales - - - Advertising · Promotions - - - - Service - - - Support · Maintenance - - - - - - - - MARGIN - - - VALUE − COST - - - - - - - - 9 - - - ACTIVITY AREAS - - - 4 support · 5 primary - - - - - - 100% - - - COVERAGE - - - All 9 areas reviewed - - - - - - 6 - - - OPTIMIZATION TARGETS - - - Cost-reduction or differentiation - - - - - - - Source: Internal Operations Review · FY24 - - - diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/chevron_process.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/chevron_process.svg deleted file mode 100644 index 2f8e72fd..00000000 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/chevron_process.svg +++ /dev/null @@ -1,190 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Digital Transformation Methodology - Chevron Process · Five-Stage Progressive Framework - - - - - - - Diagnostics - PHASE 01 - - - - - Planning & Design - PHASE 02 - - - - - Pilot Validation - PHASE 03 - - - - - Scale & Rollout - PHASE 04 - - - - - Optimization - PHASE 05 - - - - - - 2-4 Weeks - - 4-6 Weeks - - 8-12 Weeks - - 12-16 Weeks - - Ongoing - - - - - - - - - Diagnostics - - · Current State Review - · Identify Pain Points - · Maturity Evaluation - · Gap Analysis - - Deliverables: - Diagnostic Report - Maturity Scorecard - - - - - - - - Planning & Design - - · Architecture Design - · Tech Stack Eval. - · Roadmap Dev. - · ROI Calculation - - Deliverables: - Strategic Blueprint - ROI Analysis - - - - - - - - Pilot Validation - - · Select Scenarios - · Rapid MVP Launch - · Performance Data - · Feedback Iteration - - Deliverables: - Pilot Summary - Feasibility Report - - - - - - - - Scale & Rollout - - · Full-Scale Rollout - · Org. Change Mgt. - · Team Training - · Build Standards - - Deliverables: - Rollout Plan - Capability Playbook - - - - - - - - Optimization - - · Ops Monitoring - · Data-Driven Opt. - · Tech Upgrades - · Scenario Expansion - - Deliverables: - Ops Dashboard - Quarterly Report - - - - - - - Phase durations and deliverables can be flexibly adjusted based on actual enterprise situations. - - diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/circular_stages.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/circular_stages.svg deleted file mode 100644 index 092c1c1b..00000000 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/circular_stages.svg +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - Continuous Improvement Cycle - Continuous Improvement Cycle · Five-stage closed-loop drive - - - - - - - Continuous - Continuous Loop - - - - - - - - - - - - - - - - - - - - - - - - 01 - Research - - - - - 02 - Design - - - - - 03 - Execution - - - - - 04 - Evaluation - - - - - 05 - Iteration - - - - - - - - - 01 Research & Analysis - Conduct research and collect user data - - - - - - - 02 Solution Design - Define clear goals and improvement paths - - - - - - - 03 Execution - Implement solutions and track project progress - - - - - - - 04 Evaluation - Measure outcomes against target objectives - - - - - - - 05 Iteration & Optimization - Review lessons learned for the next cycle - - - - - - With each completed cycle, overall capability leaps to a higher level - - diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/client_server_flow.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/client_server_flow.svg deleted file mode 100644 index 2dc3b61b..00000000 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/client_server_flow.svg +++ /dev/null @@ -1,182 +0,0 @@ - - - - - - - - - - - - - - Client-Server Flow - Client-Server Flow · Left side initiates requests, right side responds hierarchically - - - - - - - CLIENT - - - - - - - Web Browser - React SPA UI & Interaction - HTTPS + JWT Auth - Protocol: HTTPS / WebSocket - - - - - - - - Mobile App - iOS/Android Native Client - Offline Cache Supported - Protocol: HTTP/2 / Push - - - - - - - - 3rd Party Client - Open API Access - OAuth2 / API Key Auth - Protocol: HTTPS / Webhook - - - - - - - - SERVER - - - - - - - API Gateway - Auth & Rate Limiting - Routing & Tracing - Kong / Envoy - - - - - - - - Microservices - Domain Service Cluster - gRPC Internal Comm. - Go / Java / Node - - - - - - - - Database Layer - Primary/Replica & Cache - Hot/Cold Data Tiering - PostgreSQL / Redis / S3 - - - - - Key Interactions - Key Interactions - - - - - ① Login Request · POST /auth/login - - - - - - ② Return JWT Token · 2xx Response - - - - - - ③ Business Call · GET /api/resources - - - - - - ④ Return Data · JSON Payload - - - - - - ⑤ Real-time Push · WebSocket / SSE - - - - - Blue arrow = Client request; Green arrow = Server response; Every arrow MUST have an action label, do not draw bare lines - - diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/comparison_columns.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/comparison_columns.svg deleted file mode 100644 index 2e942b2e..00000000 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/comparison_columns.svg +++ /dev/null @@ -1,119 +0,0 @@ - - - - - - - - Choose the Right Plan - Pricing Plans · Flexible plans to meet different scale needs - - - - - - - - - Basic - For individuals & small teams - - $15 - /mo - - - - 5 Project Spaces - 10GB Storage - Basic Reporting - Email Support - API Integration - Custom Workflows - Dedicated Account Manager - SLA Guarantee - - - Get Started - - - - - - - - - - - - - Most Popular - Pro - For growing businesses - - $49 - /mo - - - Unlimited Projects - 100GB Storage - Advanced Reports + Dashboard - Priority Ticket Support - API Integration - Custom Workflows - Dedicated Account Manager - SLA Guarantee - - Upgrade Now - - - - - - - - - - - Enterprise - For large organizations - Contact Sales - - Unlimited Projects - Unlimited Storage - All Reports + BI Analytics - 24/7 Phone Support - API Integration + Webhook - Custom Workflows - Dedicated Account Manager - 99.9% SLA Guarantee - - Contact Us - - - - - - - All plans include a 14-day free trial · Upgrade or downgrade anytime - - diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/comparison_table.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/comparison_table.svg deleted file mode 100644 index ad71d5a3..00000000 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/comparison_table.svg +++ /dev/null @@ -1,143 +0,0 @@ - - - - - - - Solution Comparison Assessment - Comparison Matrix · Horizontal comparison of core metrics across three solutions - - - - - Evaluation Dimensions - - - Plan A - Self-built On-premise - - - - Recommended - Plan B - Hybrid Cloud Arch - - - Plan C - Pure SaaS Subscription - - - - - - Deployment Cost - - $500K - High - - $180K - Optimal - - $80K/yr - Medium - - - - - Data Security - - ★★★★★ - - ★★★★☆ - - ★★★☆☆ - - - - - Scalability - - ★★☆☆☆ - - ★★★★★ - - ★★★★★ - - - - - Time to Market - - 6-12 Months - - 3-5 Months - - 1-2 Months - - - - - Customization Level - - ★★★★★ - - ★★★★☆ - - ★★☆☆☆ - - - - - Overall Score - - 72 - - 91 - - 68 - - diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/concentric_circles.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/concentric_circles.svg deleted file mode 100644 index 994b4c5f..00000000 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/concentric_circles.svg +++ /dev/null @@ -1,232 +0,0 @@ - - - - - - - - - - - - - - - - - Product Strategy Priority Layers - - - FY24 RESOURCE ALLOCATION FRAMEWORK · 4 PRIORITY TIERS - - - - - - 100% - - - ALLOCATED - - - 4 tiers · core → edge - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - TIER 01 - - - Core - - - Product - - - - - - - - - ECOSYSTEM - - - - - GROWTH ENGINE - - - - - CORE SUPPORT - - - - - - - - - - - - - 01 - - - HIGHEST PRIORITY · CORE - - - Core Product - - - UX features driving retention & conversion - - - BI-WEEKLY ITERATION - - - - 60% - - - OF RESOURCES - - - - - - - - - - - - - 02 - - - HIGH PRIORITY · CORE SUPPORT - - - Foundational Capabilities - - - Security, performance, infrastructure - - - MONTHLY ITERATION - - - 25% - - - OF RESOURCES - - - - - - - - - - - - 03 - - - MEDIUM PRIORITY · GROWTH ENGINE - - - Acquisition & Monetization - - - Channel ops, paywall, conversion funnels - - - QUARTERLY PLANNING - - - 10% - - - OF RESOURCES - - - - - - - - - - - - 04 - - - EXPLORATORY · ECOSYSTEM - - - Open Platform & Partnerships - - - ISV integrations, API marketplace - - - SEMI-ANNUAL REVIEW - - - 5% - - - OF RESOURCES - - - - - - - - - - Closer to the center → higher priority & deeper resource concentration - - - diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/consulting_table.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/consulting_table.svg deleted file mode 100644 index 316e2cc4..00000000 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/consulting_table.svg +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - Global Revenue Performance - Q4 2025 · FINANCIAL DATA SUMMARY REPORT - - - - - - REGION / MARKET - STATUS - REVENUE (USD) - YOY GROWTH - MARKET SHARE (VISUAL) - - - - - North America - - - Active - - $ 124,500,000 - - + 12.4% - - - - 42% - - - Europe & Middle East - - - Active - - $ 89,200,000 - - + 8.1% - - - - 30% - - - - Asia Pacific - - - Warning - - $ 45,600,000 - - - 3.2% - - - - 15% - - - Latin America - - - Pending - - $ 22,400,000 - - + 15.6% - - - - 8% - - - - Africa - - - Emerging - - $ 12,100,000 - - + 22.8% - - - - 5% - - - - - - - - - - GLOBAL TOTAL - 5 REGIONS - - $ 293,800,000 - + 8.7% - - - 100% - - - - Data Source: Internal Finance System · Generated automatically - - diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/feature_matrix_table.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/feature_matrix_table.svg deleted file mode 100644 index 9b1a7a39..00000000 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/feature_matrix_table.svg +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - Competitive Feature Matrix - CAPABILITY CHECKLIST · OUR PLATFORM VS KEY COMPETITORS - - - - - - CORE CAPABILITIES - - - OUR PLATFORM - - COMPETITOR A - - COMPETITOR B - - - - - - 1. Security & Compliance - - - End-to-End Encryption (E2EE) - - - - - - SOC2 Type II Certified - - - Planned Q4 - - - 2. Artificial Intelligence - - - Automated Workflow Generation - - - - - - Predictive Analytics Dashboard - - Add-on Only - - - - 3. Ecosystem Integration - - - Native Salesforce Sync - - - - - - - - Total Advanced Features Met - 100% - 40% - 20% - - - - Data Source: Competitive Intelligence Report · Updated Q4 2025 - - diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/financial_statement_table.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/financial_statement_table.svg deleted file mode 100644 index 29a47080..00000000 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/financial_statement_table.svg +++ /dev/null @@ -1,216 +0,0 @@ - - - - - - Income Statement Summary - Q1 - Q3 2025 · IN MILLIONS USD (UNAUDITED) - - - - - { - "name": "financial_statement_table", - "x": 80, - "y": 160, - "width": 1120, - "height": 530, - "strict_grid": true, - "column_widths": [340, 160, 180, 180, 180, 80], - "row_heights": [45, 42, 35, 35, 50, 45, 42, 35, 35, 35, 60], - "style": { - "font_family": "Roboto", - "font_size": 15, - "header_font_size": 13, - "header_fill": "#FFFFFF", - "header_text": "#475569", - "body_fill": "#FFFFFF", - "body_text": "#0F172A", - "band_fill": "#FFFFFF", - "border_color": "#E2E8F0", - "border_width": 0.5, - "padding": {"left": 10, "right": 10, "top": 4, "bottom": 4}, - "valign": "middle" - }, - "columns": [ - {"text": "FINANCIAL LINE ITEM", "bold": true}, - {"text": "Q1 2025", "align": "r", "bold": true}, - {"text": "Q2 2025", "align": "r", "bold": true}, - {"text": "Q3 2025", "align": "r", "bold": true}, - {"text": "YTD TOTAL", "align": "r", "bold": true, "color": "#0F172A"}, - {"text": "YOY%", "align": "r", "bold": true} - ], - "rows": [ - [ - {"text": "Total Revenue", "bold": true}, - {"text": "245.8", "align": "r", "bold": true}, - {"text": "268.4", "align": "r", "bold": true}, - {"text": "294.2", "align": "r", "bold": true}, - {"text": "808.4", "align": "r", "bold": true}, - {"text": "+24%", "align": "r", "color": "#10B981", "bold": true} - ], - [ - {"text": "Software Subscriptions", "color": "#475569"}, - {"text": "180.5", "align": "r", "color": "#475569"}, - {"text": "200.2", "align": "r", "color": "#475569"}, - {"text": "225.0", "align": "r", "color": "#475569"}, - {"text": "605.7", "align": "r", "color": "#334155", "bold": true}, - {"text": "+32%", "align": "r", "color": "#10B981", "bold": true} - ], - [ - {"text": "Professional Services", "color": "#475569"}, - {"text": "65.3", "align": "r", "color": "#475569"}, - {"text": "68.2", "align": "r", "color": "#475569"}, - {"text": "69.2", "align": "r", "color": "#475569"}, - {"text": "202.7", "align": "r", "color": "#334155", "bold": true}, - {"text": "+4%", "align": "r", "color": "#F59E0B", "bold": true} - ], - [ - {"text": "Cost of Revenue", "bold": true}, - {"text": "(75.4)", "align": "r"}, - {"text": "(80.1)", "align": "r"}, - {"text": "(85.5)", "align": "r"}, - {"text": "(241.0)", "align": "r", "bold": true}, - {"text": "+12%", "align": "r", "color": "#F43F5E", "bold": true} - ], - [ - {"text": "Gross Profit", "bold": true, "fill": "#F1F5F9"}, - {"text": "170.4", "align": "r", "bold": true, "fill": "#F1F5F9"}, - {"text": "188.3", "align": "r", "bold": true, "fill": "#F1F5F9"}, - {"text": "208.7", "align": "r", "bold": true, "fill": "#F1F5F9"}, - {"text": "567.4", "align": "r", "bold": true, "fill": "#F1F5F9"}, - {"text": "+28%", "align": "r", "color": "#10B981", "bold": true, "fill": "#F1F5F9"} - ], - [ - {"text": "Operating Expenses", "bold": true}, - "", - "", - "", - "", - "" - ], - [ - {"text": "Research & Development", "color": "#475569"}, - {"text": "(45.2)", "align": "r", "color": "#475569"}, - {"text": "(48.5)", "align": "r", "color": "#475569"}, - {"text": "(52.0)", "align": "r", "color": "#475569"}, - {"text": "(145.7)", "align": "r", "color": "#334155", "bold": true}, - "" - ], - [ - {"text": "Sales & Marketing", "color": "#475569"}, - {"text": "(60.8)", "align": "r", "color": "#475569"}, - {"text": "(65.2)", "align": "r", "color": "#475569"}, - {"text": "(70.5)", "align": "r", "color": "#475569"}, - {"text": "(196.5)", "align": "r", "color": "#334155", "bold": true}, - "" - ], - [ - {"text": "General & Administrative", "color": "#475569"}, - {"text": "(22.4)", "align": "r", "color": "#475569"}, - {"text": "(23.1)", "align": "r", "color": "#475569"}, - {"text": "(24.0)", "align": "r", "color": "#475569"}, - {"text": "(69.5)", "align": "r", "color": "#334155", "bold": true}, - "" - ], - [ - {"text": "Net Operating Income", "bold": true, "font_size": 18}, - {"text": "42.0", "align": "r", "bold": true, "font_size": 18}, - {"text": "51.5", "align": "r", "bold": true, "font_size": 18}, - {"text": "62.2", "align": "r", "bold": true, "font_size": 18}, - {"text": "155.7", "align": "r", "color": "#2563EB", "bold": true, "font_size": 24}, - {"text": "+48%", "align": "r", "color": "#10B981", "bold": true, "font_size": 18} - ] - ] - } - - - - - FINANCIAL LINE ITEM - Q1 2025 - Q2 2025 - Q3 2025 - YTD TOTAL - YOY% - - - - Total Revenue - 245.8 - 268.4 - 294.2 - 808.4 - +24% - - Software Subscriptions - 180.5 - 200.2 - 225.0 - 605.7 - +32% - Professional Services - 65.3 - 68.2 - 69.2 - 202.7 - +4% - - - Cost of Revenue - (75.4) - (80.1) - (85.5) - (241.0) - +12% - - - Gross Profit - 170.4 - 188.3 - 208.7 - 567.4 - +28% - - Operating Expenses - Research & Development - (45.2) - (48.5) - (52.0) - (145.7) - Sales & Marketing - (60.8) - (65.2) - (70.5) - (196.5) - General & Administrative - (22.4) - (23.1) - (24.0) - (69.5) - - - - - - Net Operating Income - 42.0 - 51.5 - 62.2 - 155.7 - +48% - - - - - - Data Source: Q3 2025 Financial Earnings Report - - diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/fishbone_diagram.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/fishbone_diagram.svg deleted file mode 100644 index 4072e501..00000000 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/fishbone_diagram.svg +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - - - - - - Root Cause Analysis Framework - Fishbone Diagram · Systematic diagnosis across six key dimensions - - - - - - - - - - Core - Problem - - - - - - Process - - - Workflow Bottleneck - - - Inefficient Steps - - - Lack of Standards - - - - People - - - Skill Deficiency - - - Low Engagement - - - High Turnover - - - - System - - - Legacy System - - - System Integration - - - Data Silos - - - - - - Environment - - - Market Volatility - - - Regulatory Changes - - - Competitor Action - - - - Policy - - - Unclear Guidelines - - - Rigid Procedures - - - Compliance Risks - - - - Material - - - Resource Shortage - - - Supply Chain Issues - - - Quality Defects - - - - Fishbone Diagram: Systematically trace the root causes across multiple problem dimensions - - diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/harvey_balls_table.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/harvey_balls_table.svg deleted file mode 100644 index 381ed439..00000000 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/harvey_balls_table.svg +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - Vendor Capability Assessment - QUALITATIVE SCORING · HARVEY BALLS MATRIX - - - - - - EVALUATION CRITERIA - - - VENDOR A (OURS) - VENDOR B - VENDOR C - - - - - - Technical Architecture - - - Cloud-Native Scalability - - - - - - - - - - - API Extensibility - - - - - - - - - - - Market & Support - - - Global Support Coverage - - - - - - - - - - - Implementation Speed - - - - - - - - - - - Pricing & Value - - - Total Cost of Ownership (ROI) - - - - - - - - - - LEGEND: - - - Poor - - - - Fair - - - - Good - - - - Very Good - - - Excellent - - - - Data Source: Internal Vendor Assessment Q3 - - diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/hub_inward_arrows.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/hub_inward_arrows.svg deleted file mode 100644 index 163d29f4..00000000 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/hub_inward_arrows.svg +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - - - - - - - - Porter's Five Forces Analysis - ENTERPRISE SAAS MARKET · COMPETITIVE LANDSCAPE ASSESSMENT 2025 - - - - - - - - - - - - - - - - - - - - - - - Industry Rivalry - - VERY HIGH - - - Many fierce competitors - - Price wars are common - - - - - - - - - - - Threat of New Entrants - - MEDIUM - - - High capital barriers - - Tech accumulation needed - - - - - - - - - - - Threat of Substitutes - - LOW - - - Few effective alternatives - - High product differentiation - - - - - - - - - - - Power of Suppliers - - MED-HIGH - - - Cloud vendors concentrated - - High dependency on infra - - - - - - - - - - - Power of Buyers - - HIGH - - - Many alternative choices - - Low switching costs - - - - - - Overall Intensity - 3.4 / 5 - High Competition - - - - - Strategic Implications - - Build technical moats - - Improve customer stickiness - - Diversify supply chain - - Focus on differentiation - - - - Threat Levels: - - Low - - Medium - - Med-High - - High - - Very High - - - - Data Source: Industry Research Department - 2025 Market Competition Analysis Report - - diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/hub_spoke.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/hub_spoke.svg deleted file mode 100644 index f954a54b..00000000 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/hub_spoke.svg +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - Enterprise Platform Architecture - HUB & SPOKE · CORE CAPABILITIES - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - CORE - SYSTEM - - - - - - - - - - - - - - - - - - Data Architecture - Data Lake & Analytics - - - - - - - - - - - - - - AI Engine - Model Training & Inference - - - - - - - - - - - - - - - - - - Business Logic - Workflow & Rule Engines - - - - - - - - - - - - - - - - - - Integration Services - API Gateway & Event Bus - - - - - - - - - - - - - - Security &Compliance - IAM & Zero-TrustArchitecture - - - - - - - - - - - - - - - User Experience - Low-Code & Design System - - - - The central hub seamlessly integrates six core capability domains to form a unified digital foundation. - - diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/icon_grid.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/icon_grid.svg deleted file mode 100644 index 54ca667f..00000000 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/icon_grid.svg +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - - Core Product Features - SIX CAPABILITIES FOR A COMPLETE SOLUTION - - - - - - - 01 - - - - - - - Smart Data Analytics - AI-DRIVEN ENGINE - - AI-driven multi-dimensional analytics - engine that automatically discovers trends - and anomalies for actionable insights. - - - - - - - - 02 - - - - - - - Real-time Collaboration - TEAM SYNCHRONIZATION - - Support for simultaneous online editing, - real-time synchronization, built-in - comments, and complete version history. - - - - - - - - 03 - - - - - Security & Compliance - ENTERPRISE GRADE - - Enterprise-grade data encryption and - access control. Fully compliant with - SOC2 and GDPR with complete audit trails. - - - - - - - - 04 - - - - - - - - - Workflow Automation - PROCESS ORCHESTRATION - - Visual process orchestration with - no-code trigger configurations to - eliminate repetitive manual operations. - - - - - - - - 05 - - - - - - Open API Integration - SEAMLESS CONNECTIONS - - Access to 200+ standard APIs that - support seamless integration with - mainstream SaaS, ERP, and CRM systems. - - - - - - - - 06 - - - - - - - - Smart Reporting Center - ADVANCED DASHBOARDS - - One-click generation of custom data - dashboards and multi-dimensional reports - to support executive decision-making. - - - diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/isometric_stairs.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/isometric_stairs.svg deleted file mode 100644 index e068e394..00000000 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/isometric_stairs.svg +++ /dev/null @@ -1,112 +0,0 @@ - - - - - - - Digital Transformation Roadmap - STRATEGIC MILESTONES · SIX-STAGE PROGRESSIVE PATH - - - - - - - - - - - - - - 01 - - - - Foundational IT - Infrastructure setup - - - - - - - - - 02 - - - - Process Digitization - Core business online - - - - - - - - - 03 - - - - Data Driven - Analytics & insights - - - - - - - - - 04 - - - - Intelligent Ops - AI-augmented work - - - - - - - - - 05 - - - - Ecosystem Integration - Platform collaboration - - - - - - - - - 06 - - - - Industry Leadership - Standard setting - - diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/journey_map.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/journey_map.svg deleted file mode 100644 index 071c245f..00000000 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/journey_map.svg +++ /dev/null @@ -1,94 +0,0 @@ - - - - - - - - - - - - - - - Customer Journey Map - USER EXPERIENCE & PAIN POINT ANALYSIS: ENTERPRISE ONBOARDING - - - - - - 1. DISCOVERY - - 2. EVALUATION - - 3. PURCHASE - - 4. ONBOARDING - - - - - - - - User Actions - What the user does - - Searches Google for solutions,lands on marketing site. - - Reads case studies, comparesfeatures vs competitors. - - Requests a demo, negotiatespricing with sales team. - - Signs contract, creates account,starts initial configuration. - - - Touchpoints - Channels of interaction - SEO / Ads / Website - Whitepapers / Webinars - Zoom / Email / Docusign - Web App / CS Manager - - - Emotional Experience - Satisfaction level over time - - - - - - - - 🙂 - - 🤩 - - 😐 - - 😫 - - - Pain Points & Friction - Barriers to success - - - Information overload onthe homepage. - - Pricing is not transparent;requires a sales call. - - Contract negotiation takestoo long (Avg 14 days).Legal redlines cause delays. - - Steep learning curve.Lack of interactive tutorials. - - - diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/kpi_cards.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/kpi_cards.svg deleted file mode 100644 index 9b0a10bc..00000000 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/kpi_cards.svg +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - Key Performance Indicators - FY 2025 · QUARTERLY BUSINESS REVIEW - - - - - - - Total Revenue - Gross Billings - $245.5 - M - - +18.5% - vs. last year - - - - - - - Active Users - Monthly Active Users - 1.28 - M - - +12.3% - vs. last month - - - - - - - Avg Order Value - Per User Revenue - $43.2 - - -3.2% - vs. last month - - - - - - - Conversion Rate - Paid Conversion - 8.7% - - +0.8% - pt increase - - - - - Source: Internal Financial Dashboard · As of Q4 2025 - - diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/labeled_card.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/labeled_card.svg deleted file mode 100644 index ac81b9c9..00000000 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/labeled_card.svg +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - Four Pillars of Our Approach - PARALLEL CAPABILITY OVERVIEW · 2×2 SECTION LAYOUT - - - - - - - Discovery - - Stakeholder Research - Interview 15+ stakeholders to surface the underlying problem statement. - Quantitative Baseline - Lock the metrics that will be used to evaluate every option later. - - - - - - - Design - - Solution Shaping - Translate findings into three viable architectures with explicit trade-offs. - Prototype Validation - Build the thinnest slice that proves the chosen direction can ship. - - - - - - - Delivery - - Implementation Sprints - Two-week cadence with end-of-sprint demo and explicit go/no-go gate. - Quality Gates - Automated checks plus a release captain who owns the deploy decision. - - - - - - - Evolve - - Telemetry Loop - Production metrics flow back into the discovery backlog within 24 hours. - Quarterly Rebase - Reset priorities against the latest market signal, not yesterday's roadmap. - - - - - Source: Methodology framework · Updated for the current planning cycle - - diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/layered_architecture.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/layered_architecture.svg deleted file mode 100644 index 4c6d34ed..00000000 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/layered_architecture.svg +++ /dev/null @@ -1,205 +0,0 @@ - - - - - - - - Enterprise Layered Architecture - - - THREE-TIER CAPABILITY STACK WITH UNIFIED OUTPUT AND SHARED FOUNDATIONAL INFRASTRUCTURE - - - - - - 01 - - APP LAYER · USER INTERFACES & EXTERNAL ACCESS POINTS - - - - - W - Web Console - React SPA - - HTTPS & WebSocket interfaces - - - - - - M - Mobile App - iOS / Android - - Native HTTP/2 client access - - - - - - O - Open API - API Gateway - - REST & GraphQL for partners - - - - - - C - CLI Tools - DevOps - - Command-line automation & CI - - - - - - 02 - - SERVICE LAYER · CORE BUSINESS LOGIC & ORCHESTRATION - - - - - G - Core Routing - API Gateway - - Traffic control & rate limiting - - - - - - M - Microservices - Domain Logic - - Independent business services - - - - - - I - IAM Service - Auth & Security - - Centralized SSO and RBAC - - - - - - E - Event Bus - Message Queue - - Kafka-based async decoupling - - - - - - 03 - - DATA LAYER · PERSISTENT STORAGE & CAPABILITIES - - - - - R - Relational DB - PostgreSQL - - ACID compliant core data storage - - - - - - C - Cache Layer - Redis Cluster - - Sub-millisecond hot data access - - - - - - O - Object Storage - S3 Compatible - - Scalable unstructured data - - - - - - 04 - - OUTPUT - - - Unified Portal - - - - Open SDK - - - - Ops Console - - - - Data Market - - - - Webhooks - - - - Partner API - - - - - - 05 - - FOUNDATION · CROSS-CUTTING SHARED CAPABILITIES - - - Log Aggregation - - Metrics & Alarms - - Distributed Tracing - - Config Center - - CI / CD Pipeline - - Security & Audit - - Resource Mgt - - diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/line_chart.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/line_chart.svg index 2f396280..d06152de 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/line_chart.svg +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/line_chart.svg @@ -14,7 +14,7 @@ data-pptx-replace-with="chart"> { - "name": "line_chart", + "name": "line-chart", "x": 120, "y": 141, "width": 1063.1, diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/matrix_2x2.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/matrix_2x2.svg index ffca6995..baa29ff5 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/matrix_2x2.svg +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/matrix_2x2.svg @@ -3,8 +3,8 @@ font-size="12"> @@ -31,7 +31,7 @@ font-size="14" font-weight="500" fill="#94A3B8">Business Impact vs Implementation Effort · Bubble size represents resource cost - + @@ -44,6 +44,7 @@ + Implementation Effort @@ -116,7 +117,7 @@ - - - - - - - Product Strategy Mind Map - STRATEGIC BREAKDOWN · FOUR CORE DIMENSIONS - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - UX Optimization - - - - - Feature Roadmap - - - - - Quality Standards - - - - - - Brand Positioning - - - - - Channel Expansion - - - - - Competitor Analysis - - - - - - Architecture Upgrade - - - - - AI Integration - - - - - Security & Compliance - - - - - - User Growth Strategy - - - - - Supply Chain Mgt - - - - - Data-driven Decisions - - - - - - Product - - - - - Market - - - - - Technology - - - - - Operations - - - - - Product - Strategy - - - - - Core theme branching into four primary dimensions, each expanding into specific strategic initiatives. - - - diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/module_composition.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/module_composition.svg deleted file mode 100644 index d14e9dfd..00000000 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/module_composition.svg +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - - - - - - - - Recommendation Engine Pipeline - - PARENT CONTAINER DECLARES "WHAT", SUB-MODULES DECLARE "HOW" — RECALL → RANK → RERANK - - - - - - - - PARENT CONTAINER · RECOMMENDATION PIPELINE · INPUT: CONTEXT → OUTPUT: EXPOSURE - - - - - - - - - 01 - Recall Stage - - - Filter candidates from massive corpus - - - Multi-channel Triggering - Collaborative filtering, trending, interests - - - Dual-channel Indexing - Vector retrieval + Inverted index fusion - - - Candidate Pool - Outputs hundreds to thousands per user - - - - Avg Latency - < 50 ms - Pool Size - ~2,000 - - - - - - - - - - 02 - Ranking Stage - - - Precise scoring and optimal output - - - Deep Model Prediction - Multi-tower DNN for CTR/CVR est. - - - Multi-objective Fusion - Weighted formula or Pareto frontier - - - Top-K Refinement - Select Top-K candidates for next stage - - - - Avg Latency - < 100 ms - Top-K Size - ~200 - - - - - - - - - - 03 - Rerank Stage - - - Strategic intervention & diversity tuning - - - Diversity Scattering - Prevent homogeneity, disperse categories - - - Business Rules - Boost / Filter / Targeted pinning - - - Final Exposure - Generate final user-visible sequence - - - - Avg Latency - < 30 ms - Final Exp. - ~20 - - - - - - - - - END-TO-END DATA FLOW · UPSTREAM LOGS → ENGINE PROCESSING → DOWNSTREAM FEEDBACK - - - - - User Action Logs - - - Persona & Features - - - Feed Exposure Stream - - - Click / Dwell Feedback - - - A/B Testing Metrics - - diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/numbered_steps.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/numbered_steps.svg deleted file mode 100644 index e7435e2b..00000000 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/numbered_steps.svg +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - - - - - - - - - - - - - Five-Step Implementation Plan - END-TO-END EXECUTION STRATEGY · FROM PLANNING TO LAUNCH - - - - - - - - - - - - - - - 01 - STEP - - - - - - Discovery - Requirements - - · Define business goals - · Conduct user research - · Analyze competitors - · Establish core metrics - - 2 Weeks - - - - - - - - 02 - STEP - - - - - - Design - Architecture - - · Architecture review - · Tech stack selection - · Milestone planning - · Resource allocation - - 3 Weeks - - - - - - - - 03 - STEP - - - - - - Development - Implementation - - · Core module build - · CI/CD integration - · Code review process - · Unit test coverage - - 6 Weeks - - - - - - - - 04 - STEP - - - - - - Testing - Validation - - · Regression testing - · Performance load test - · User acceptance (UAT) - · Bug fix loop - - 3 Weeks - - - - - - - - 05 - STEP - - - - - - Launch - Operations - - · Canary release strategy - · Monitor & alerts setup - · Data impact tracking - · Continuous iteration - - Ongoing - - - - - - - Total duration ~14 weeks · Phases can be scaled based on project size - - - diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/pipeline_with_stages.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/pipeline_with_stages.svg deleted file mode 100644 index ae5cc022..00000000 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/pipeline_with_stages.svg +++ /dev/null @@ -1,187 +0,0 @@ - - - - - - - - End-to-End Data Pipeline Architecture - - - - FIVE-STAGE PIPELINE: FROM RAW DATA TO BUSINESS VALUE · EACH STAGE OUTPUT DRIVES THE NEXT - - - Stage Layout: Step ID + Phase Name + Role + Key Steps + Deliverable - - - - - - - - - PIPELINE STAGES - - - - - - - SEQUENTIAL FLOW: RAW → CLEAN → WIDE → ENRICHED → PRODUCTS - - - - - 01 - Ingest - - Multi-source & Real-time - - Data Collection - CDC & File Sync - - Unified Protocol - Queue & Buffer - - Elastic Scaling - Sharding & Parallel - - - STAGE OUTPUT - Raw Events - - - - - 02 - Validate - - Isolation & Quality Check - - Format & Bounds - Type & Value Range - - Business Rules - Uniqueness & Refs - - Anomaly Isolation - Dead-letter Queue - - - STAGE OUTPUT - Clean Events - - - - - 03 - Transform - - Structure & Alignment - - Denormalization - Metrics & Grouping - - Derived Metrics - Unified Definitions - - Wide Table Build - Reusable Models - - - STAGE OUTPUT - Wide Tables - - - - - 04 - Enrich - - AI Labels & Semantics - - AI Inference - Profile & Predict - - Knowledge Graph - Entities & Relations - - Semantic Tags - Business Ready - - - STAGE OUTPUT - Enriched Set - - - - - 05 - Serve - - Services & Access API - - BI Dashboards - Visual Decisions - - Data API - On-demand Fetch - - Pub/Sub Events - Webhook Triggers - - - STAGE OUTPUT - Products - - - - - - - - - - - - - - - - - - - - - - - END TO END - - - - Origin: Raw Data ————— 5-Stage Processing ————— Destination: Business Products - - - - - Origin: Raw Data - - Raw Events - - Clean Events - - Wide Tables - - Enriched Set - - Destination: Products - - diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/process_flow.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/process_flow.svg deleted file mode 100644 index fa7d1197..00000000 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/process_flow.svg +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - - - - - - Business Process Flow - STANDARD OPERATING PROCEDURE · PIPELINE FLOWCHART - - - - - - - - - - - Yes - - - - No - - - - - - - - - - - - - - - - - Start - Initiation - - - Requirements - - 1-2 Days - - - - - Feasible? - Review - - - Solution Design - - 3-5 Days - - - Development - - 7-14 Days - - - Testing - - 2-3 Days - - - Re-evaluate - - Adjust Scope - - - - - Complete - Deployment - - - - - - Legend - - Process Step - - - - Decision Node - - Exception / Loop - - - - - Time Metrics - - Total Cycle: - 13-24 Days - Key Steps: - 4 - Decisions: - 1 - Risk Level: - Low - - - - Process Version: v2.1 | Last Updated: 2025-11-09 | Process Management System - - diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/project_schedule_table.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/project_schedule_table.svg deleted file mode 100644 index 7c838b62..00000000 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/project_schedule_table.svg +++ /dev/null @@ -1,110 +0,0 @@ - - - - - - - Enterprise System Implementation Plan - PROJECT SCHEDULE TABLE · H1 2025 - - - - - - PHASE & TASK DESCRIPTION - OWNER - STATUS - - JAN - FEB - MAR - APR - MAY - JUN - - - - - - - - - - - - Phase 1: Architecture Design & Planning - - - - - - Requirements Gathering - Product Team - - Completed - - - - - - System Architecture Review - Tech Lead - - Completed - - - - - Phase 2: Core Module Development - - - - - Database Migration Scripts - Data Engine - - In Progress - - - - - - - - API Gateway Integration - Backend Dev - - Delayed - - - - Phase 3: Testing & UAT - - - - Beta User Acceptance Testing - QA & Product - - Planned - - - - - - - - Critical Milestone: - Production Release scheduled for June 30, 2025. Ensure API Gateway delays are resolved before May. - - - - Data Source: Jira Project Tracker · Auto-updated - - diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/pros_cons_chart.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/pros_cons_chart.svg deleted file mode 100644 index 7997cdd7..00000000 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/pros_cons_chart.svg +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - Pros vs Cons Analysis - STRATEGIC EVALUATION · OBJECTIVE DECISION FRAMEWORK - - - - - PROS / ADVANTAGES - - CONS / DISADVANTAGES - - - - - - VS - - - - - - - - - - - - Superior Product Quality - Core technology is independently controlled. - User satisfaction is 15% above industry average. - - - - - - - - High Brand Recognition - Omnichannel coverage reaches over 85%. - Brand awareness consistently ranks TOP3 in segment. - - - - - - - - Robust User Ecosystem - Active community engagement with high sharing rates. - User retention and repurchase far exceed averages. - - - - - - - - - - - - Long Iteration Cycle - Takes 12 weeks from user feedback to launch. - Competitors average only 6-8 weeks per cycle. - - - - - - - - Weak in Tier-3 Markets - Only 23% penetration in lower-tier cities. - Insufficient regional distributor network coverage. - - - - - - - - Slow Service Response - Average technical ticket response time is 48h. - Increases the risk of enterprise customer churn. - - - - - - - - Strategic Recommendation - Consolidate product and brand advantages while accelerating iteration, expanding channels, and enhancing service response. - - - - diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/pyramid_chart.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/pyramid_chart.svg deleted file mode 100644 index 30590598..00000000 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/pyramid_chart.svg +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - Strategic Capability Pyramid - FIVE-TIER EVOLUTION MODEL · FROM FOUNDATION TO VISION - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - VISION - INNOVATION - BRAND POWER - R&D SYSTEM - OPERATIONS - - - - - - - Vision & Purpose - Establishes industry leadership and guides overall strategic layout. - - L5 - - - - - - Innovation Drive - Builds continuous innovation mechanisms and explores frontiers. - - L4 - - - - - - Brand Influence - Creates industry-leading awareness and deep customer loyalty. - - L3 - - - - - - R&D Capabilities - Supported by 500+ core patents and deep technical expertise. - - L2 - - - - - - Operational Foundation - Refined operations, global supply chain, and intelligent logistics. - - L1 - - - - - Higher tiers represent greater strategic value, while lower tiers provide essential structural support. - - diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/pyramid_isometric.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/pyramid_isometric.svg deleted file mode 100644 index 81501cb2..00000000 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/pyramid_isometric.svg +++ /dev/null @@ -1,180 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Capability Maturity Pyramid - FOUR-TIER GROWTH MODEL · STAGE-BY-STAGE ACHIEVEMENT - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 - 2 - 3 - 4 - - - - - - Foundation - Practice - Mastery - Leadership - - - - - - - - - - - ① Foundation - Onboarding, environment fluency,baseline skills - - - - - - - ② Practice - Deepens execution, owns smallprojects end-to-end - - - - - - - ③ Mastery - Optimizes processes, mentorsjuniors, sets standards - - - - - - - ④ Leadership - Drives strategy, accountable fororg-level outcomes - - - - - Source: Annual capability review · Tiers map to broad maturity bands, not job titles - - diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/quadrant_bubble_scatter.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/quadrant_bubble_scatter.svg deleted file mode 100644 index 7dbefe91..00000000 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/quadrant_bubble_scatter.svg +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - Product Portfolio Strategy - BCG GROWTH-SHARE MATRIX ANALYSIS - - - - - - - MARKET GROWTH RATE - LOW - HIGH - - - - RELATIVE MARKET SHARE - - HIGH - LOW - - - - - - - STARS - HIGH GROWTH · HIGH SHARE - - - Flagship SaaS Platform - - Enterprise API Gateway - - - - - QUESTION MARKS - HIGH GROWTH · LOW SHARE - - - AI Generative Engine v1.0 - - Mobile App Subscription - - - - - CASH COWS - LOW GROWTH · HIGH SHARE - - - Legacy On-Premise Software - - Data Center Hosting Services - - - - - DOGS - LOW GROWTH · LOW SHARE - - - Discontinued Hardware Line - - Old Consulting Services - - - diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/quadrant_text_bullets.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/quadrant_text_bullets.svg deleted file mode 100644 index 51e604b9..00000000 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/quadrant_text_bullets.svg +++ /dev/null @@ -1,248 +0,0 @@ - - - - - - - - - SWOT Strategic Analysis - - - ABC TECH COMPANY · 2025 MARKET COMPETITION ASSESSMENT - - - - - - - - - - - - - - - - HELPFUL TO OBJECTIVE - - - - HARMFUL TO OBJECTIVE - - - - - INTERNAL ORIGIN - - - - EXTERNAL ORIGIN - - - - - - - - - - - - S - - - Strengths - - - - - LEVERAGE - - - - - - - Strong R&D team, 200+ tech patents - - - - - High brand recognition, 85% loyalty - - - - - Complete supply chain, 15% cost edge - - - - - Strong cash flow, stable financials - - - - - Efficient management, strong execution - - - - - - - - - - - W - - - Weaknesses - - - - ADDRESS - - - - - - Insufficient marketing investment - - - - - Single product line, core dependency - - - - - Lack of overseas market experience - - - - - High talent turnover (12%) - - - - - After-sales response needs improvement - - - - - - - - - - - O - - - Opportunities - - - - PURSUE - - - - - - AI industry growing at 25% CAGR - - - - - Increased policy support and subsidies - - - - - Strong demand in emerging markets (SEA) - - - - - Competitors repositioning, share available - - - - - Digital transformation driving demand - - - - - - - - - - - T - - - Threats - - - - MITIGATE - - - - - - - - Intensified competition, giants entering - - - - - - - Rapid technology iterations, R&D pressure - - - - - - - Rising raw material costs, margin squeeze - - - - - - - Stricter regulations, compliance costs up - - - - - - - Economic uncertainty, budgets tightening - - - - - - - - Data source: Strategic Planning Department · 2025 Annual Analysis Report - - - diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/roadmap_vertical.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/roadmap_vertical.svg deleted file mode 100644 index ea601c60..00000000 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/roadmap_vertical.svg +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - - - - - - - 2025 Strategic Roadmap - ANNUAL ROADMAP · SIX KEY MILESTONES - - - - - - - - - - - - 2025 Q1 - - - - - Organizational Restructuring - Complete divisional reform and establishthree independent business units. - - COMPLETED - - - - End of Q1 - - - - - Series A Funding Closed - Secured $50M in Series A funding, reaching $300M valuation. - - COMPLETED - - - - 2025 Q2 - - - - - Product V2.0 Launch - Integrate AI engine, launch smart recommendationsand automated workflows. - - IN PROGRESS - - - - 2025 Q3 - - - - - Global Market Expansion - Pilot operations in SEA region to validate localization strategies. - - PLANNED - - - - 2025 Q4 - - - - - Series B Initiation - Target $1B valuation, build capital reserves for scaled expansion. - - PLANNED - - - - End of 2025 - - - - - Annual Targets Achieved - Reach 5M+ Active Users and $150M Annual Recurring Revenue. - - PLANNED - - - - - Annual Core Objectives - - - - - - $ - $150M - Annual Recurring Revenue Target - - - - - U - 5.0M - Active Registered Users - - - - - + - 300+ - End-of-Year Headcount Target - - - Key Strategic Initiatives - - - - 1 - Product-Led Growth (PLG) Expansion - - - - 2 - Enterprise Account Acquisition - - - - 3 - Global Market PMF Validation - - - - 4 - AI Technical Moat Construction - - diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/segmented_wheel.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/segmented_wheel.svg deleted file mode 100644 index 7e26e8ec..00000000 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/segmented_wheel.svg +++ /dev/null @@ -1,140 +0,0 @@ - - - - - - - Six-Dimension Wheel Framework - ONE TOPIC · SIX PARALLEL ASPECTS · PAIRED DESCRIPTION CARDS - - - - - - - - - Aspect 01 - Theme - - - - - Aspect 02 - Theme - - - - - Aspect 03 - Theme - - - - - Aspect 04 - Theme - - - - - Aspect 05 - Theme - - - - - Aspect 06 - Theme - - - - - - Core - Topic - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Aspect 06 · Heading Goes Here - - Concise description line one explainingwhat this dimension covers, with enoughdetail to anchor the audience's reading. - - - - - - Aspect 05 · Heading Goes Here - - Concise description line one explainingwhat this dimension covers, with enoughdetail to anchor the audience's reading. - - - - - - Aspect 04 · Heading Goes Here - - Concise description line one explainingwhat this dimension covers, with enoughdetail to anchor the audience's reading. - - - - - - Aspect 01 · Heading Goes Here - - Concise description line one explainingwhat this dimension covers, with enoughdetail to anchor the audience's reading. - - - - - - Aspect 02 · Heading Goes Here - - Concise description line one explainingwhat this dimension covers, with enoughdetail to anchor the audience's reading. - - - - - - Aspect 03 · Heading Goes Here - - Concise description line one explainingwhat this dimension covers, with enoughdetail to anchor the audience's reading. - - diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/snake_flow.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/snake_flow.svg deleted file mode 100644 index 00873490..00000000 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/snake_flow.svg +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - Ten-Year Strategic Roadmap - DECADE JOURNEY · TEN MILESTONES · THREE-ROW SERPENTINE - - - - - - - - - - - - - - - - - Milestone Title - Concise description of scope. - - - - - Milestone Title - Concise description of scope. - - - - - Milestone Title - Concise description of scope. - - - - - Milestone Title - Concise description of scope. - - - - - - - Milestone Title - Concise description of scope. - - - - - Milestone Title - Concise description of scope. - - - - - - - Milestone Title - Concise description of scope. - - - - - Milestone Title - Concise description of scope. - - - - - Milestone Title - Concise description of scope. - - - - - Milestone Title - Concise description of scope. - - - - - - - - - - 01 - - - - - - 02 - - - - - - 03 - - - - - - 04 - - - - - - 05 - - - - - - 06 - - - - - - 07 - - - - - - 08 - - - - - - 09 - - - - - - 10 - - - diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/team_roster.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/team_roster.svg deleted file mode 100644 index 6369c230..00000000 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/team_roster.svg +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - - - - - - Meet Our Executive Team - LEADERSHIP DRIVING INNOVATION AND GROWTH - - - - - - - - - - - - - - - - Eleanor Vance - CHIEF EXECUTIVE OFFICER - - - 15+ years experience in - SaaS scale-ups. Former - VP of Strategy at TechCorp. - Stanford MBA. - - - - - - - - - - - - Marcus Chen - CHIEF TECHNOLOGY OFFICER - - Pioneer in distributed - systems. Led engineering - at GlobalScale Inc. - Holds 12 software patents. - - - - - - - - - - - - Sarah Jenkins - CHIEF REVENUE OFFICER - - Drove 300% YoY growth - in previous B2B role. - Expert in enterprise - sales & partnerships. - - - - - - - - - - - - David Torres - CHIEF PRODUCT OFFICER - - Design-thinking advocate. - Shipped award-winning - consumer products. - ex-Google Design Lead. - - - diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/timeline.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/timeline.svg deleted file mode 100644 index faf1b517..00000000 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/timeline.svg +++ /dev/null @@ -1,143 +0,0 @@ - - - - - - - Product Development Roadmap - 2024 — 2026 · SIX KEY MILESTONES - - - 50% DONE - 3 / 6 - - - - - - - - 2024 - 2025 - 2026 - - - - - - - - - · TODAY · - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2024 Q1 - Project Initiation - Requirement analysis - Technical architecture - - - - - - - 2024 Q2 - MVP Development - Core features launch - Alpha testing - - - - - - - 2024 Q3 - Public Beta - Open registration - 5,000+ users target - - - - - 2024 Q4 - IN PROGRESS - Feature Iteration - AI integration - Multi-platform sync - - - - - - - 2025 Q2 - Commercialization - Premium tiers launch - Marketing campaign - - - - - - 2026 Q1 - Scale-up - Global expansion - Ecosystem building - - - - - - - Completed - - In Progress - - Planned - - - - - Data source: Product Management Dept - - diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/top_down_tree.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/top_down_tree.svg deleted file mode 100644 index 5beb8393..00000000 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/top_down_tree.svg +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - - Corporate Organizational Chart - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - John Doe - Chief Executive Officer - - - - - - Jane Smith - VP of Engineering - - Engineering - - - - - Mike Johnson - VP of Product - - Product - - - - - Emily Davis - VP of Sales - - Sales - - - - - Robert Wilson - VP of Finance - - Finance - - - - - Sarah Brown - VP of HR - - Human Resources - - - - - - Frontend - 12 Staff - - - - Backend - 15 Staff - - - - - UX/UI Design - 8 Staff - - - - User Research - 5 Staff - - - - - Enterprise - 20 Staff - - - - SMB Accounts - 18 Staff - - - - - Accounting - 6 Staff - - - - FP&A - 4 Staff - - - - - Recruiting - 5 Staff - - - - Comp & Ben - 3 Staff - - - - - Total Headcount: 96 | Management: 6 | Departments: 10 - - - - - Updated: Dec 2025 - - - diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/venn_diagram.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/venn_diagram.svg deleted file mode 100644 index f7416200..00000000 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/venn_diagram.svg +++ /dev/null @@ -1,94 +0,0 @@ - - - - - - - - Core Competency Intersection - SYNERGISTIC RELATIONSHIP BETWEEN THREE PILLARS - - - - - - - - - - - - Technology - Capabilities - Market - Intelligence - Operations - Efficiency - - - - - Product Innovation - - - - - Tech Ops - - - - - Customer Success - - - - - CORE ADVANTAGE - - - - - - - - - - Technology Capabilities - Proprietary Engine · AI Algorithms · Cloud Native - - - - - - - Market Intelligence - Omnichannel · Brand Leadership · Growth Flywheel - - - - - - - Operational Efficiency - Supply Chain · Smart Warehousing · Cost Control - - - - - - CORE ADVANTAGE = TECH × MARKET × OPS - Deep integration creates an irreplicable competitive moat - - - - - Note: Circle area denotes scope; intersections denote synergistic value and cross-functional advantages. - - diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/vertical_list.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/vertical_list.svg deleted file mode 100644 index c48c8e18..00000000 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/vertical_list.svg +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - - - - - - - Five Core Competitive Advantages - CORE STRENGTHS · BUILDING A DIFFERENTIATED COMPETITIVE MOAT - - - - - - - - - - - - 01 - - - - - - - - Brand Influence - Industry-leading brand awareness and reputation, top 3 brand value for three consecutive years. - - BRAND - - - - - - - 02 - - - - - - - - R&D Capabilities - Consistent 15%+ R&D investment, 500+ proprietary patents, driven by AI and Big Data. - - TECH - - - - - - - 03 - - - - - - - - Supply Chain Management - Global supply chain and smart warehousing, covering 300+ cities with 40% faster delivery times. - - SUPPLY - - - - - - - 04 - - - - - - - - Customer Service System - 24/7 rapid response mechanism, sustained 96%+ customer satisfaction, and industry-leading NPS. - - SERVICE - - - - - - - 05 - - - - - - - - Innovation & Intelligence - AI-empowered business decisions, launching 10+ innovative solutions annually to lead industry change. - - INNOVATION - - - - Note: The vertical axis indicates priority order, while the expanded cards detail the key competitive strengths. - - diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/vertical_pillars.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/vertical_pillars.svg deleted file mode 100644 index b3f5f560..00000000 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/vertical_pillars.svg +++ /dev/null @@ -1,106 +0,0 @@ - - - - - - - PEST Macro-Environment Analysis - EXTERNAL STRATEGIC FACTORS IMPACTING MARKET ENTRY - - - - - - - - - - P - POLITICAL - - - - Trade Tariffs - Pending cross-border trade - regulations affecting COGS. - - Data Privacy Laws - Strict GDPR compliance - required for EU expansion. - - Government Subsidies - New grants available for - green tech initiatives. - - - - - - E - ECONOMIC - - - - Inflation Rates - Rising inflation decreasing - consumer purchasing power. - - Exchange Rates - Currency volatility impacting - export profit margins. - - Interest Rates - Higher borrowing costs - for upcoming capital project. - - - - - - S - SOCIAL - - - - Demographic Shifts - Aging population creates - demand for healthcare tech. - - Workplace Trends - Permanent shift towards - hybrid and remote work. - - Consumer Attitudes - Increasing preference for - sustainable products. - - - - - - T - TECHNOLOGICAL - - - - AI Automation - Generative AI threatening - legacy software models. - - Infrastructure - 5G rollout enables new - IoT product capabilities. - - Cybersecurity Risk - Escalating threat landscape - requires higher R&D spend. - - - diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/README.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/README.md index cb53a27d..bd96498f 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/README.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/decks/README.md @@ -29,7 +29,7 @@ Overview when application fit must be judged in detail. --- -## Selection and fusion +## Selection and installation Selection follows the parent README's Default Stage-1 [`generate-pptx`](../../workflows/generate-pptx.md) template-choice contract. @@ -41,7 +41,7 @@ exact roots are `library`; other exact roots remain `explicit`. Choosing and confirming an entry runs the conditional [`apply-template-workspace`](../../workflows/stages/apply-template-workspace.md) stage, which owns path normalization, compatibility checks, installation, and -fusion after Stage 1 and before Stage 2. Template-aware reading begins in final Stage 2 from the +installation after Stage 1 and before Stage 2. Template-aware reading begins in final Stage 2 from the installed project-local copy. Quick applies a supplied exact Deck root directly and otherwise uses free design. It uses installed prototypes as flat authoring inputs; reusable diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/design_spec_reference.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/design_spec_reference.md index 2f975997..94ed63c4 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/design_spec_reference.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/design_spec_reference.md @@ -153,13 +153,13 @@ For a selected custom rendering, also add `Image Rendering Behavior`; add `Image ### 2.3 Visualization and image resources -Use the §VII table only when at least one real catalog reference is selected. Always keep the §VIII table, including when it has no data rows: +Use the §VII table only when at least one real Chart/Table catalog reference is selected. Always keep the §VIII table, including when it has no data rows: ```markdown ## VII. Visualization Reference List -| Page | Template | Usage | -| --- | --- | --- | +| Page | Family | Template | Usage | +| --- | --- | --- | --- | ## VIII. Image Resource List @@ -167,9 +167,17 @@ Use the §VII table only when at least one real catalog reference is selected. A | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | ``` -§VII is an optional page-local reference list. Each row records the page, catalog key, and a short semantic Usage—not geometry. The key derives `templates/charts/.svg`; §IX remains authoritative over final type and realization. Omit an empty §VII and never add path, summary, runners-up, `no-template-match`, or `n/a`. Put unmatched fallbacks in §IX. Legacy wider rows remain readable; new specs use these three columns. +§VII lists at most one `chart|table` reference per page: canonical Template key +plus semantic Usage. Resolve `family/key`; never derive paths from bare keys. +§IX owns child visuals, unmatched fallbacks, and qualitative relationships as +free `Layout` / `Visualization` prose. Layout/Deck alone owns reusable +PowerPoint structure. Omit empty §VII and recall diagnostics; legacy rows stay +readable, while new specs use four columns. -For every independent data chart or pure text-grid table, add `- **Native-ready**: yes|no` to its §IX Slide block. Choose `yes` only when the confirmed requirement or artifact afterlife benefits from an editable native data object; otherwise use `no`. Conceptual visualizations and incidental sparklines, KPI trends, or insets omit this field and remain ordinary SVG. +In §IX `Visualization`, key every independent data chart/pure text-grid table +in `kebab-case` and add one `Native-ready` map: `=yes|no; ...`. Use `yes` +only when editable native output helps. Qualitative relationships/read order +remain unkeyed prose, as do incidental microvisuals. In §VIII, author every planned or explicitly required resource from the confirmed source boundary. Write one concise, non-empty `Layout pattern` suggestion in ordinary language; optionally cite hierarchical ids from the layout library when they help recall a technique. Set `Crop Policy` to `adaptive` or `no-crop`; set `Acquire Via` to `ai`, `web`, `user`, `formula`, `placeholder`, or `slice`. Preserve unresolved required assets as `Pending` or `Needs-Manual` instead of dropping or reclassifying them. @@ -216,7 +224,7 @@ never write an empty or `none` placeholder: - **Motion suggestion**: ``` -Add `Visualization` / `Images` when a Slide consumes §VII/§VIII or uses a page-local visualization; mark it data-driven when source values determine geometry. §IX stays authoritative without a catalog match and may choose a custom visualization or table. Add `Native shape suggestion` only when a preset, stock Connector, or compound silhouette/cutout/intersection/fragment may help; name the semantic result plus candidate family or Boolean operands, never implementation geometry or keys. Executor chooses the primitive, preset, Boolean construction, or necessary freeform. Add `Motion suggestion` whenever transition/reveal advice strengthens communication, regardless of the Custom Animations outcome; state purpose and semantic order/relationship, not registry keys, options, timing, ids, or coverage. The suggestion never activates animation execution by itself, creates content, or binds implementation. Describe required visible image states in `Layout` / `Images` only for an explicit motion requirement or an enabled Custom Animations outcome. Add `Native-ready: yes|no` only for independent data charts or pure text-grid tables, `Fact IDs` for sourced claims, and `Data class: scenario` for invented demo values. Except on preservation paths, `Cover impact` carries a binding hook and adaptable composition; apply the same split to `Closing impact` only when the deck genuinely resolves. Roster/order/content stay authoritative. §VIII image layout is non-empty free prose with optional library ids; chart rows are references. Executor owns geometry, hierarchy, treatment, and sparse local garnish. +Add `Visualization` / `Images` when a Slide consumes §VII/§VIII or uses a page-local visual model. Name every value-driven geometry, qualitative relationship, cell grid, and child visual here; only independent Chart/Table entries use object keys. Describe qualitative order, linkage, hierarchy, grouping, contrast, overlap, and reading path freely—not as a model name or grammar enum. §IX may choose a custom Chart/Table fallback. Add `Native shape suggestion` only when a preset, stock Connector, or compound silhouette/cutout/intersection/fragment may help; name the semantic result plus candidate family or Boolean operands, never implementation geometry or keys. Executor chooses the primitive, preset, Boolean construction, or necessary freeform. Add `Motion suggestion` whenever transition/reveal advice strengthens communication, regardless of the Custom Animations outcome; state purpose and semantic order/relationship, not registry keys, options, timing, ids, or coverage. The suggestion never activates animation execution by itself, creates content, or binds implementation. Describe required visible image states in `Layout` / `Images` only for an explicit motion requirement or an enabled Custom Animations outcome. Add keyed `Native-ready` only for independent data charts or pure text-grid tables, `Fact IDs` for sourced claims, and `Data class: scenario` for invented demo values. Except on preservation paths, `Cover impact` carries a binding hook and adaptable composition; apply the same split to `Closing impact` only when the deck genuinely resolves. Roster/order/content stay authoritative. §VIII image layout is non-empty free prose with optional library ids; §VII Chart/Table rows are references. Executor owns geometry, hierarchy, treatment, and sparse local garnish. For free-design pages, describe `Layout` through relationships, hierarchy, regions, and column spans; do not prescribe element-level `x`, `y`, `width`, or `height` or duplicate the global geometry in §II/§V. Exact coordinates belong to Executor SVG authoring. Preserve literal geometry only when the user explicitly requires it or a mirror/template preservation contract owns it. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/README.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/README.md index 0a08ceec..4bb5ec7d 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/README.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/README.md @@ -56,7 +56,7 @@ exact roots are `library`; other exact roots remain `explicit`. Choosing and confirming an entry runs the conditional [`apply-template-workspace`](../../workflows/stages/apply-template-workspace.md) stage, which owns path normalization, compatibility checks, installation, and -fusion after Stage 1 and before Stage 2. Template-aware reading begins in final Stage 2 from the +installation after Stage 1 and before Stage 2. Template-aware reading begins in final Stage 2 from the installed project-local copy. Quick applies a supplied exact Layout root directly and otherwise uses free design. It uses installed prototypes as flat authoring inputs; reusable diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/editorial_bleed/templates/01_hero_full.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/editorial_bleed/templates/01_hero_full.svg new file mode 100644 index 00000000..99738ed8 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/editorial_bleed/templates/01_hero_full.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + {{TITLE}} + + + {{SUBTITLE}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/editorial_bleed/templates/02_hero_side_scrim.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/editorial_bleed/templates/02_hero_side_scrim.svg new file mode 100644 index 00000000..54b46d02 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/editorial_bleed/templates/02_hero_side_scrim.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + {{PAGE_TITLE}} + + + {{CONTENT_AREA}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/editorial_bleed/templates/03_split_bleed.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/editorial_bleed/templates/03_split_bleed.svg new file mode 100644 index 00000000..029f4fff --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/editorial_bleed/templates/03_split_bleed.svg @@ -0,0 +1,27 @@ + + + + + + + + + {{PAGE_TITLE}} + + + {{CONTENT_AREA}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/editorial_bleed/templates/04_split_bleed_reverse.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/editorial_bleed/templates/04_split_bleed_reverse.svg new file mode 100644 index 00000000..4be88180 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/editorial_bleed/templates/04_split_bleed_reverse.svg @@ -0,0 +1,27 @@ + + + + + + + + + {{PAGE_TITLE}} + + + {{CONTENT_AREA}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/editorial_bleed/templates/05_chapter_full.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/editorial_bleed/templates/05_chapter_full.svg new file mode 100644 index 00000000..16a53099 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/editorial_bleed/templates/05_chapter_full.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + {{CHAPTER_NUM}} + + + {{CHAPTER_TITLE}} + + + {{CHAPTER_DESC}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/editorial_bleed/templates/06_quote_over_image.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/editorial_bleed/templates/06_quote_over_image.svg new file mode 100644 index 00000000..eab34f1c --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/editorial_bleed/templates/06_quote_over_image.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + {{QUOTE_TEXT}} + + + {{ATTRIBUTION}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/editorial_bleed/templates/07_triptych.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/editorial_bleed/templates/07_triptych.svg new file mode 100644 index 00000000..976b9cfe --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/editorial_bleed/templates/07_triptych.svg @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + {{PAGE_TITLE}} + + + {{CAPTION_1}} + + + {{CAPTION_2}} + + + {{CAPTION_3}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/editorial_bleed/templates/08_image_grid_four.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/editorial_bleed/templates/08_image_grid_four.svg new file mode 100644 index 00000000..34b82f0b --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/editorial_bleed/templates/08_image_grid_four.svg @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + {{CAPTION_1}} + + + {{CAPTION_2}} + + + {{CAPTION_3}} + + + {{CAPTION_4}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/editorial_bleed/templates/09_full_statement.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/editorial_bleed/templates/09_full_statement.svg new file mode 100644 index 00000000..c293a7b7 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/editorial_bleed/templates/09_full_statement.svg @@ -0,0 +1,21 @@ + + + + + + {{KEY_MESSAGE}} + + + {{SUPPORT_TEXT}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/editorial_bleed/templates/10_closing_full.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/editorial_bleed/templates/10_closing_full.svg new file mode 100644 index 00000000..250ea0bb --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/editorial_bleed/templates/10_closing_full.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + {{CLOSING_MESSAGE}} + + + {{CONTACT_LINE}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/editorial_bleed/templates/design_spec.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/editorial_bleed/templates/design_spec.md new file mode 100644 index 00000000..eceaa543 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/editorial_bleed/templates/design_spec.md @@ -0,0 +1,72 @@ +--- +layout_id: editorial_bleed +kind: layout +category: general +summary: A structure-only 16:9 system with 10 authored PowerPoint Layouts whose images bleed to the canvas edge and whose text sits on the image behind a scrim. +keywords: [editorial, full-bleed, image, scrim, dark] +canvas_format: ppt169 +canvas_width: 1280 +canvas_height: 720 +canvas_viewbox: "0 0 1280 720" +replication_mode: standard +native_structure_mode: structured +page_count: 10 +page_types: + - hero_full + - hero_side_scrim + - split_bleed + - split_bleed_reverse + - chapter_full + - quote_over_image + - triptych + - image_grid_four + - full_statement + - closing_full +placeholders: + 01_hero_full: ["{{TITLE}}", "{{SUBTITLE}}"] + 02_hero_side_scrim: ["{{PAGE_TITLE}}", "{{CONTENT_AREA}}"] + 03_split_bleed: ["{{PAGE_TITLE}}", "{{CONTENT_AREA}}"] + 04_split_bleed_reverse: ["{{PAGE_TITLE}}", "{{CONTENT_AREA}}"] + 05_chapter_full: ["{{CHAPTER_NUM}}", "{{CHAPTER_TITLE}}", "{{CHAPTER_DESC}}"] + 06_quote_over_image: ["{{QUOTE_TEXT}}", "{{ATTRIBUTION}}"] + 07_triptych: ["{{PAGE_TITLE}}", "{{CAPTION_1}}", "{{CAPTION_2}}", "{{CAPTION_3}}"] + 08_image_grid_four: ["{{CAPTION_1}}", "{{CAPTION_2}}", "{{CAPTION_3}}", "{{CAPTION_4}}"] + 09_full_statement: ["{{KEY_MESSAGE}}", "{{SUPPORT_TEXT}}"] + 10_closing_full: ["{{CLOSING_MESSAGE}}", "{{CONTACT_LINE}}"] +--- + +# Editorial Bleed — Design Specification + +## IV. Signature Design Elements + +Editorial Bleed provides a structural vocabulary for 16:9 material where imagery +carries the argument and text is set on the image rather than beside it. The +neutral prototype paint exists only to expose hierarchy and slot geometry; it is +not an identity segment. Color, typography, logo, voice, and icon treatment +remain downstream decisions. + +| Element | Template-specific behavior | +|---|---| +| No safe frame for pictures | Every `picture` slot reaches at least one canvas edge: full canvas on `hero_full`, `hero_side_scrim`, `chapter_full`, `quote_over_image`, and `closing_full`; an exact half on the two `split_bleed` variants; equal vertical bands on `triptych`; four `640×360` quadrants on `image_grid_four`. Text keeps an 80 px margin, pictures keep none. Insetting a picture inside a margin turns this system into an ordinary content layout. | +| Scrims are Slide-local, by PowerPoint's rule | PowerPoint paints Layout shapes beneath Slide content, and the picture is Slide content, so an overlay cannot be a Layout atom. Every scrim is therefore a Slide-local `data-pptx-role="decoration"` rect placed after its picture slot in document order. It travels as a prototype pattern, not as Layout-inherited chrome, and a page authored from this system must carry its own scrim. | +| Four overlay techniques | `hero_full` and `closing_full` use a bottom vertical fade (black `0 → 0.78 / 0.82`). `hero_side_scrim` uses a horizontal directional scrim (`0.88 → 0.30 → 0`) so the picture stays readable on the open side. `chapter_full` uses a full-canvas graded wash (`0.44 → 0.68`) that darkens toward its text. `quote_over_image` uses a raised-floor radial vignette (`0.42 → 0.72`) so a centered quote holds contrast while the frame edges fall away. | +| Overlays are gradients, never solid rects | A full-canvas solid `` is reserved for background ownership in a structured package and is compiled into the background plane, which sits below every picture. Every overlay here therefore carries a gradient paint even where the intent reads as a flat wash. Replacing one with a solid fill plus `fill-opacity` inverts its stacking and fails template validation. | +| Dark base plane | The single Master carries a dark background. The reusable structural fact is that the base plane is dark because text sits on imagery and reverses out of it; the prototype hex is replaceable preview paint, not an identity value. It is visible only where no picture covers it: the text half of the split pages, and all of `full_statement`. | +| A page without a picture | `full_statement` carries no picture slot. A system built entirely on imagery needs one page that stops, or every page competes for the same attention. | +| Captions instead of titles | `image_grid_four` declares no title slot, and `triptych` puts its title inside a top fade rather than above the images, because there is no margin band to hold one. Captions carry the reading order on those pages. | +| Text entry | Body and caption slots begin at the upper-left. Centered alignment is reserved for the quote page, whose composition is symmetric by intent. | + +## V. Page Roster + +| SVG | Layout key | PowerPoint picker name | Purpose | +|---|---|---|---| +| `01_hero_full.svg` | `hero_full` | Hero Full | Full-canvas picture under a bottom fade with title and subtitle | +| `02_hero_side_scrim.svg` | `hero_side_scrim` | Hero with Side Scrim | Full-canvas picture with a directional scrim over a left text column | +| `03_split_bleed.svg` | `split_bleed` | Split Bleed | Left half-canvas picture beside a right text column | +| `04_split_bleed_reverse.svg` | `split_bleed_reverse` | Split Bleed Reverse | Right half-canvas picture beside a left text column | +| `05_chapter_full.svg` | `chapter_full` | Chapter Full | Full-canvas picture under a flat wash with chapter number, title, and description | +| `06_quote_over_image.svg` | `quote_over_image` | Quote over Image | Full-canvas picture under a wash and vignette with a centered quote | +| `07_triptych.svg` | `triptych` | Triptych | Three full-height picture bands with top and bottom fades and three captions | +| `08_image_grid_four.svg` | `image_grid_four` | Four-Image Grid | Four edge-to-edge picture quadrants with per-cell fades and captions | +| `09_full_statement.svg` | `full_statement` | Full Statement | Picture-free dark canvas with one dominant statement | +| `10_closing_full.svg` | `closing_full` | Closing Full | Full-canvas picture under a bottom fade with closing message and contact line | diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/layouts_index.json b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/layouts_index.json index e9b9b479..58f1e604 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/layouts_index.json +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/layouts_index.json @@ -1,4 +1,36 @@ { + "editorial_bleed": { + "summary": "A structure-only 16:9 system with 10 authored PowerPoint Layouts whose images bleed to the canvas edge and whose text sits on the image behind a scrim.", + "canvas_format": "ppt169", + "page_count": 10, + "page_types": [ + "hero_full", + "hero_side_scrim", + "split_bleed", + "split_bleed_reverse", + "chapter_full", + "quote_over_image", + "triptych", + "image_grid_four", + "full_statement", + "closing_full" + ] + }, + "moments_square": { + "summary": "A structure-only 1:1 system with 8 authored PowerPoint Layouts that use both horizontal and vertical division on a square canvas.", + "canvas_format": "moments", + "page_count": 8, + "page_types": [ + "cover", + "statement", + "title_content", + "two_column", + "three_row", + "image_center", + "image_full", + "ending" + ] + }, "presentation_core": { "summary": "A structure-only 16:9 system with 20 authored PowerPoint Layouts for general, editorial, image, process, and data presentations.", "canvas_format": "ppt169", @@ -25,5 +57,81 @@ "chart_insight", "table_summary" ] + }, + "presentation_core_43": { + "summary": "A structure-only 4:3 system with 16 authored PowerPoint Layouts for projector, classroom, academic, and meeting-room presentations.", + "canvas_format": "ppt43", + "page_count": 16, + "page_types": [ + "title_slide", + "title_content", + "section_header", + "two_content", + "comparison", + "title_only", + "blank", + "content_caption", + "picture_caption", + "hero_statement", + "three_card", + "kpi_grid", + "process_timeline", + "stacked_split", + "chart_insight", + "table_summary" + ] + }, + "report_core": { + "summary": "A structure-only 16:9 system with 13 authored PowerPoint Layouts across two Masters, carrying persistent page chrome and page-number placeholders.", + "canvas_format": "ppt169", + "page_count": 13, + "page_types": [ + "cover", + "section_divider", + "agenda", + "title_content", + "two_content", + "three_block", + "kpi_row", + "chart_insight", + "table_summary", + "process_timeline", + "matrix_2x2", + "appendix", + "closing" + ] + }, + "story_vertical": { + "summary": "A structure-only 9:16 system with 9 authored PowerPoint Layouts whose text geometry respects the top and bottom story safe zones.", + "canvas_format": "story", + "page_count": 9, + "page_types": [ + "cover", + "statement", + "title_content", + "numbered_list", + "image_full", + "image_top_text", + "two_block", + "step_flow", + "ending" + ] + }, + "xiaohongshu_post": { + "summary": "A structure-only 3:4 vertical system with 10 authored PowerPoint Layouts for single-column image-text posts on tall social canvases.", + "canvas_format": "xiaohongshu", + "page_count": 10, + "page_types": [ + "cover", + "statement", + "title_content", + "numbered_list", + "two_card_stack", + "image_top_text", + "image_full_caption", + "quote", + "step_flow", + "ending" + ] } } diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/moments_square/templates/01_cover.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/moments_square/templates/01_cover.svg new file mode 100644 index 00000000..890e593e --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/moments_square/templates/01_cover.svg @@ -0,0 +1,29 @@ + + + + + + + {{TITLE}} + + + {{SUBTITLE}} + + + {{BRAND_LINE}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/moments_square/templates/02_statement.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/moments_square/templates/02_statement.svg new file mode 100644 index 00000000..efe63910 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/moments_square/templates/02_statement.svg @@ -0,0 +1,21 @@ + + + + + + {{KEY_MESSAGE}} + + + {{SUPPORT_TEXT}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/moments_square/templates/03_title_content.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/moments_square/templates/03_title_content.svg new file mode 100644 index 00000000..e23dd972 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/moments_square/templates/03_title_content.svg @@ -0,0 +1,27 @@ + + + + + + {{PAGE_TITLE}} + + + {{CONTENT_AREA}} + + + {{FOOTER_NOTE}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/moments_square/templates/04_two_column.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/moments_square/templates/04_two_column.svg new file mode 100644 index 00000000..e835bfcd --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/moments_square/templates/04_two_column.svg @@ -0,0 +1,35 @@ + + + + + + + {{PAGE_TITLE}} + + + {{LEFT_CONTENT}} + + + {{RIGHT_CONTENT}} + + + {{FOOTER_NOTE}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/moments_square/templates/05_three_row.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/moments_square/templates/05_three_row.svg new file mode 100644 index 00000000..f8f35333 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/moments_square/templates/05_three_row.svg @@ -0,0 +1,58 @@ + + + + + + + + + + 1 + 2 + 3 + + {{PAGE_TITLE}} + + + {{ITEM_1}} + + + {{ITEM_2}} + + + {{ITEM_3}} + + + {{FOOTER_NOTE}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/moments_square/templates/06_image_center.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/moments_square/templates/06_image_center.svg new file mode 100644 index 00000000..26c16c58 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/moments_square/templates/06_image_center.svg @@ -0,0 +1,27 @@ + + + + + + {{PAGE_TITLE}} + + + + + + {{CAPTION}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/moments_square/templates/07_image_full.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/moments_square/templates/07_image_full.svg new file mode 100644 index 00000000..25734555 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/moments_square/templates/07_image_full.svg @@ -0,0 +1,27 @@ + + + + + + + + + {{PAGE_TITLE}} + + + {{CAPTION}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/moments_square/templates/08_ending.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/moments_square/templates/08_ending.svg new file mode 100644 index 00000000..2488f1e0 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/moments_square/templates/08_ending.svg @@ -0,0 +1,29 @@ + + + + + + + {{CLOSING_MESSAGE}} + + + {{CTA_TEXT}} + + + {{BRAND_LINE}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/moments_square/templates/design_spec.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/moments_square/templates/design_spec.md new file mode 100644 index 00000000..1c8b3b7c --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/moments_square/templates/design_spec.md @@ -0,0 +1,64 @@ +--- +layout_id: moments_square +kind: layout +category: scenario +summary: A structure-only 1:1 system with 8 authored PowerPoint Layouts that use both horizontal and vertical division on a square canvas. +keywords: [moments, square, social, 1-1, center-radiating] +canvas_format: moments +canvas_width: 1080 +canvas_height: 1080 +canvas_viewbox: "0 0 1080 1080" +replication_mode: standard +native_structure_mode: structured +page_count: 8 +page_types: + - cover + - statement + - title_content + - two_column + - three_row + - image_center + - image_full + - ending +placeholders: + 01_cover: ["{{TITLE}}", "{{SUBTITLE}}", "{{BRAND_LINE}}"] + 02_statement: ["{{KEY_MESSAGE}}", "{{SUPPORT_TEXT}}"] + 03_title_content: ["{{PAGE_TITLE}}", "{{CONTENT_AREA}}", "{{FOOTER_NOTE}}"] + 04_two_column: ["{{PAGE_TITLE}}", "{{LEFT_CONTENT}}", "{{RIGHT_CONTENT}}", "{{FOOTER_NOTE}}"] + 05_three_row: ["{{PAGE_TITLE}}", "{{ITEM_1}}", "{{ITEM_2}}", "{{ITEM_3}}", "{{FOOTER_NOTE}}"] + 06_image_center: ["{{PAGE_TITLE}}", "{{CAPTION}}"] + 07_image_full: ["{{PAGE_TITLE}}", "{{CAPTION}}"] + 08_ending: ["{{CLOSING_MESSAGE}}", "{{CTA_TEXT}}", "{{BRAND_LINE}}"] +--- + +# Moments Square — Design Specification + +## IV. Signature Design Elements + +Moments Square provides a structural vocabulary for 1:1 canvases used as +standalone square posters and feed cards. The neutral prototype paint exists +only to expose hierarchy and slot geometry; it is not an identity segment, and +no platform palette, mark, or typeface is claimed. Color, typography, logo, +voice, and icon treatment remain downstream decisions. + +| Element | Template-specific behavior | +|---|---| +| Both axes are available | A square field is the only canvas in this family where horizontal and vertical division are equally sound. `two_column` splits the 880 px content field into two 420 px columns, which still carries 28 px body copy at a workable line length, while `three_row` divides the same field into three 148 px bands. Neither is a fallback for the other; keep both when adapting this system. | +| Center-radiating governs focal pages only | `cover`, `statement`, `image_center`, and `ending` center one dominant block on the canvas axis, and the closing brand line stays centered with them. `title_content`, `two_column`, and `three_row` keep a left axis at x 100 because centering running body copy destroys its readability. Do not extend the radiating treatment to those pages. | +| Band structure | Titled pages use a title band at `100 110 880 210`, a content field from y 380 to y 880, and a `100 940 880 56` footer note. `cover` and `ending` replace the footer with a full-bleed band from y 900 to y 1080, sized for a closing identity or code area. | +| Fixed list markers | `three_row` owns its 1–3 markers as Layout atoms: the circle and its digit are static structure, so only the item copy stays Slide-local. | +| Image system | `image_center` holds a 500×500 typed `picture` slot on both canvas axes with the title above and caption below — the square-native composition. `image_full` instead runs the picture edge to edge down to y 820 with a caption band beneath, for pages where the image is the whole message. | +| Type scale | Prototype sizes step from cover title 68 through focal 60, page title 60, body 30, and note 24. They are provisional preview values, not a locked project type scale. | + +## V. Page Roster + +| SVG | Layout key | PowerPoint picker name | Purpose | +|---|---|---|---| +| `01_cover.svg` | `cover` | Cover | Centered title and subtitle over a full-bleed brand band | +| `02_statement.svg` | `statement` | Statement | Centered dominant claim with a short supporting line | +| `03_title_content.svg` | `title_content` | Title and Content | Left-axis page title over one content field | +| `04_two_column.svg` | `two_column` | Two Column | Two equal 420 px columns | +| `05_three_row.svg` | `three_row` | Three Row | Three stacked bands with fixed Layout-owned numeric markers | +| `06_image_center.svg` | `image_center` | Centered Image | Square picture slot centered on both axes, title above and caption below | +| `07_image_full.svg` | `image_full` | Full-Bleed Image | Edge-to-edge picture slot over a caption band | +| `08_ending.svg` | `ending` | Ending | Centered closing message and action line over a full-bleed brand band | diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/01_title_slide.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/01_title_slide.svg new file mode 100644 index 00000000..a990e8d6 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/01_title_slide.svg @@ -0,0 +1,21 @@ + + + + + + {{TITLE}} + + + {{SUBTITLE}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/02_title_content.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/02_title_content.svg new file mode 100644 index 00000000..4c749bc0 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/02_title_content.svg @@ -0,0 +1,21 @@ + + + + + + {{PAGE_TITLE}} + + + {{CONTENT_AREA}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/03_section_header.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/03_section_header.svg new file mode 100644 index 00000000..11366b8d --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/03_section_header.svg @@ -0,0 +1,21 @@ + + + + + + {{CHAPTER_TITLE}} + + + {{CHAPTER_DESC}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/04_two_content.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/04_two_content.svg new file mode 100644 index 00000000..e19e8368 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/04_two_content.svg @@ -0,0 +1,29 @@ + + + + + + + {{PAGE_TITLE}} + + + {{LEFT_CONTENT}} + + + {{RIGHT_CONTENT}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/05_comparison.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/05_comparison.svg new file mode 100644 index 00000000..4933c4a9 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/05_comparison.svg @@ -0,0 +1,45 @@ + + + + + + + + + {{PAGE_TITLE}} + + + {{LEFT_TITLE}} + + + {{LEFT_CONTENT}} + + + {{RIGHT_TITLE}} + + + {{RIGHT_CONTENT}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/06_title_only.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/06_title_only.svg new file mode 100644 index 00000000..10344ca8 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/06_title_only.svg @@ -0,0 +1,15 @@ + + + + + + {{PAGE_TITLE}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/07_blank.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/07_blank.svg new file mode 100644 index 00000000..4070b876 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/07_blank.svg @@ -0,0 +1,7 @@ + + + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/08_content_caption.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/08_content_caption.svg new file mode 100644 index 00000000..e1609f6c --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/08_content_caption.svg @@ -0,0 +1,29 @@ + + + + + + + {{PAGE_TITLE}} + + + {{CONTENT_AREA}} + + + {{CAPTION}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/09_picture_caption.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/09_picture_caption.svg new file mode 100644 index 00000000..682ab18c --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/09_picture_caption.svg @@ -0,0 +1,29 @@ + + + + + + + {{PAGE_TITLE}} + + + {{CAPTION}} + + + + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/10_hero_statement.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/10_hero_statement.svg new file mode 100644 index 00000000..cd5ed9ca --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/10_hero_statement.svg @@ -0,0 +1,21 @@ + + + + + + {{KEY_MESSAGE}} + + + {{SUBTITLE}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/11_three_card.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/11_three_card.svg new file mode 100644 index 00000000..bc8de259 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/11_three_card.svg @@ -0,0 +1,37 @@ + + + + + + + + {{PAGE_TITLE}} + + + {{CARD_1}} + + + {{CARD_2}} + + + {{CARD_3}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/12_kpi_grid.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/12_kpi_grid.svg new file mode 100644 index 00000000..bedc943f --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/12_kpi_grid.svg @@ -0,0 +1,53 @@ + + + + + + + + + + {{PAGE_TITLE}} + + + {{KPI_1}} + + + {{KPI_2}} + + + {{KPI_3}} + + + {{KPI_4}} + + + {{CONTENT_AREA}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/13_process_timeline.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/13_process_timeline.svg new file mode 100644 index 00000000..a49c3734 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/13_process_timeline.svg @@ -0,0 +1,55 @@ + + + + + + + + + + + {{PAGE_TITLE}} + + + {{STEP_1}} + + + {{STEP_2}} + + + {{STEP_3}} + + + {{STEP_4}} + + + {{KEY_MESSAGE}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/14_stacked_split.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/14_stacked_split.svg new file mode 100644 index 00000000..9923231c --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/14_stacked_split.svg @@ -0,0 +1,29 @@ + + + + + + + {{PAGE_TITLE}} + + + {{TOP_CONTENT}} + + + {{BOTTOM_CONTENT}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/15_chart_insight.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/15_chart_insight.svg new file mode 100644 index 00000000..7c0de134 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/15_chart_insight.svg @@ -0,0 +1,60 @@ + + + + + + + {{PAGE_TITLE}} + + + + {"name":"chart_insight","x":76,"y":156,"width":576,"height":536,"type":"column","categories":["Q1","Q2","Q3","Q4"],"series":[{"name":"Actual","values":[42,55,63,78]},{"name":"Plan","values":[48,58,68,74]}],"show_legend":true,"legend_position":"bottom","style":{"colors":["#64748B","#CBD5E1"],"chart_area_fill":"#F4F6F8","plot_area_fill":"#FFFFFF","text_color":"#475569","axis_color":"#CBD5E1","grid_color":"#E2E8F0","font_family":"Arial"}} + + + Actual + + Plan + + + + + + + + + + + + + + Q1 + Q2 + Q3 + Q4 + + + + {{KEY_MESSAGE}} + + + {{SOURCE}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/16_table_summary.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/16_table_summary.svg new file mode 100644 index 00000000..b1f11caf --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/16_table_summary.svg @@ -0,0 +1,65 @@ + + + + + + + {{PAGE_TITLE}} + + + + {"name":"table_summary","x":76,"y":156,"width":616,"height":536,"strict_grid":true,"column_widths":[3,2,2],"row_heights":[1,1,1,1,1],"style":{"font_family":"Arial","font_size":17,"header_font_size":16,"header_fill":"#E2E8F0","header_text":"#334155","body_fill":"#FFFFFF","body_text":"#475569","band_fill":"#F8FAFC","border_color":"#D6DCE3","border_width":1,"padding":{"left":12,"right":12,"top":6,"bottom":6},"valign":"middle"},"columns":[{"text":"Metric","bold":true},{"text":"Current","align":"r","bold":true},{"text":"Target","align":"r","bold":true}],"rows":[[{"text":"Adoption"},{"text":"68%","align":"r","bold":true},{"text":"80%","align":"r"}],[{"text":"Cycle time"},{"text":"12 d","align":"r","bold":true},{"text":"8 d","align":"r"}],[{"text":"Quality"},{"text":"94%","align":"r","bold":true},{"text":"97%","align":"r"}],[{"text":"Cost index"},{"text":"1.08","align":"r","bold":true},{"text":"1.00","align":"r"}]]} + + + + + + + + + + + + + Metric + Current + Target + Adoption + 68% + 80% + Cycle time + 12 d + 8 d + Quality + 94% + 97% + Cost index + 1.08 + 1.00 + + + + {{KEY_MESSAGE}} + + + {{SOURCE}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/design_spec.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/design_spec.md new file mode 100644 index 00000000..cc4ab2dd --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/presentation_core_43/templates/design_spec.md @@ -0,0 +1,90 @@ +--- +layout_id: presentation_core_43 +kind: layout +category: general +summary: A structure-only 4:3 system with 16 authored PowerPoint Layouts for projector, classroom, academic, and meeting-room presentations. +keywords: [general, powerpoint, 4-3, projector, academic] +canvas_format: ppt43 +canvas_width: 1024 +canvas_height: 768 +canvas_viewbox: "0 0 1024 768" +replication_mode: standard +native_structure_mode: structured +page_count: 16 +page_types: + - title_slide + - title_content + - section_header + - two_content + - comparison + - title_only + - blank + - content_caption + - picture_caption + - hero_statement + - three_card + - kpi_grid + - process_timeline + - stacked_split + - chart_insight + - table_summary +placeholders: + 01_title_slide: ["{{TITLE}}", "{{SUBTITLE}}"] + 02_title_content: ["{{PAGE_TITLE}}", "{{CONTENT_AREA}}"] + 03_section_header: ["{{CHAPTER_TITLE}}", "{{CHAPTER_DESC}}"] + 04_two_content: ["{{PAGE_TITLE}}", "{{LEFT_CONTENT}}", "{{RIGHT_CONTENT}}"] + 05_comparison: ["{{PAGE_TITLE}}", "{{LEFT_TITLE}}", "{{LEFT_CONTENT}}", "{{RIGHT_TITLE}}", "{{RIGHT_CONTENT}}"] + 06_title_only: ["{{PAGE_TITLE}}"] + 07_blank: [] + 08_content_caption: ["{{PAGE_TITLE}}", "{{CONTENT_AREA}}", "{{CAPTION}}"] + 09_picture_caption: ["{{PAGE_TITLE}}", "{{CAPTION}}"] + 10_hero_statement: ["{{KEY_MESSAGE}}", "{{SUBTITLE}}"] + 11_three_card: ["{{PAGE_TITLE}}", "{{CARD_1}}", "{{CARD_2}}", "{{CARD_3}}"] + 12_kpi_grid: ["{{PAGE_TITLE}}", "{{KPI_1}}", "{{KPI_2}}", "{{KPI_3}}", "{{KPI_4}}", "{{CONTENT_AREA}}"] + 13_process_timeline: ["{{PAGE_TITLE}}", "{{STEP_1}}", "{{STEP_2}}", "{{STEP_3}}", "{{STEP_4}}", "{{KEY_MESSAGE}}"] + 14_stacked_split: ["{{PAGE_TITLE}}", "{{TOP_CONTENT}}", "{{BOTTOM_CONTENT}}"] + 15_chart_insight: ["{{PAGE_TITLE}}", "{{KEY_MESSAGE}}", "{{SOURCE}}"] + 16_table_summary: ["{{PAGE_TITLE}}", "{{KEY_MESSAGE}}", "{{SOURCE}}"] +--- + +# Presentation Core 4:3 — Design Specification + +## IV. Signature Design Elements + +Presentation Core 4:3 provides a structural vocabulary for rooms and devices +that still project in 4:3: classrooms, lecture halls, academic sessions, and +meeting rooms with fixed legacy displays. The neutral prototype paint exists +only to expose hierarchy and slot geometry; it is not an identity segment. +Color, typography, logo, voice, and icon treatment remain downstream decisions. + +| Element | Template-specific behavior | +|---|---| +| Shared frame | One restrained Master background and a 56 px horizontal safe frame keep the roster coherent. The title band occupies `56 36 912 64` on every titled page, and the content field runs from y 136 to y 712. | +| Narrower column budget | The 912 px content width gives each half-page column 440 px and each third 288 px. Body copy in split layouts steps down one size relative to single-column pages so line length stays readable instead of forcing hyphenation. | +| Vertical preference | The taller field makes stacking a first-class option rather than a fallback. `stacked_split` divides the page into two full-width bands; use it where a wide canvas would reach for a left/right split. | +| Square-leaning metric grid | `kpi_grid` places four metrics in a 2×2 block over one evidence panel instead of a single four-across row, which would compress each metric below a readable width on this canvas. | +| Image system | `picture_caption` uses a typed `picture` slot occupying the full left field with an independent caption rail, matching the near-square crop that 4:3 rooms display well. | +| Data system | `chart_insight` and `table_summary` declare typed `chart` / `table` slots. Their authored groups remain complete SVG fallbacks; optional replacement metadata can materialize PowerPoint-native data objects only when that export path is requested. | +| Text entry | General body and object slots begin at the upper-left. Centered alignment is reserved for KPI values, short process nodes, the timeline takeaway, and focused statements. | +| Neutral framing | Pale panels and hairlines reveal intended zones in the prototype; downstream deck or brand skin controls final paint. | + +## V. Page Roster + +| SVG | Layout key | PowerPoint picker name | Purpose | +|---|---|---|---| +| `01_title_slide.svg` | `title_slide` | Title Slide | Accent-anchored title and subtitle cover | +| `02_title_content.svg` | `title_content` | Title and Content | Page title over one full-width content region | +| `03_section_header.svg` | `section_header` | Section Header | Large section title with supporting description | +| `04_two_content.svg` | `two_content` | Two Content | Equal left and right content regions | +| `05_comparison.svg` | `comparison` | Comparison | Paired headings over paired comparison bodies | +| `06_title_only.svg` | `title_only` | Title Only | Title slot with an otherwise open canvas | +| `07_blank.svg` | `blank` | Blank | Zero-slot composition surface | +| `08_content_caption.svg` | `content_caption` | Content with Caption | Main content with a dedicated caption rail | +| `09_picture_caption.svg` | `picture_caption` | Picture with Caption | Full-height picture slot with a caption column | +| `10_hero_statement.svg` | `hero_statement` | Hero Statement | One dominant claim with a short qualifier | +| `11_three_card.svg` | `three_card` | Three-Card Synthesis | Three parallel synthesis regions | +| `12_kpi_grid.svg` | `kpi_grid` | KPI Grid | Four metrics in a 2×2 block over one evidence region | +| `13_process_timeline.svg` | `process_timeline` | Process Timeline | Four ordered steps on a shared axis plus a takeaway rail | +| `14_stacked_split.svg` | `stacked_split` | Stacked Split | Two full-width horizontal bands | +| `15_chart_insight.svg` | `chart_insight` | Chart and Insight | Chart slot with SVG fallback, interpretation, and source rails | +| `16_table_summary.svg` | `table_summary` | Table and Summary | Table slot with SVG fallback, summary, and source rails | diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/01_cover.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/01_cover.svg new file mode 100644 index 00000000..0b737c0a --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/01_cover.svg @@ -0,0 +1,27 @@ + + + + + + {{TITLE}} + + + {{SUBTITLE}} + + + {{DATE}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/02_section_divider.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/02_section_divider.svg new file mode 100644 index 00000000..03363ca0 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/02_section_divider.svg @@ -0,0 +1,27 @@ + + + + + + {{CHAPTER_NUM}} + + + {{CHAPTER_TITLE}} + + + {{CHAPTER_DESC}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/03_agenda.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/03_agenda.svg new file mode 100644 index 00000000..cb922f0f --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/03_agenda.svg @@ -0,0 +1,84 @@ + + + + + + + + + + + 01 + 02 + 03 + 04 + 05 + + {{PAGE_TITLE}} + + + {{ITEM_1}} + + + {{ITEM_2}} + + + {{ITEM_3}} + + + {{ITEM_4}} + + + {{ITEM_5}} + + + {{FOOTER_NOTE}} + + + {{PAGE_NUM}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/04_title_content.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/04_title_content.svg new file mode 100644 index 00000000..bcb67c22 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/04_title_content.svg @@ -0,0 +1,35 @@ + + + + + + + {{PAGE_TITLE}} + + + {{CONTENT_AREA}} + + + {{FOOTER_NOTE}} + + + {{PAGE_NUM}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/05_two_content.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/05_two_content.svg new file mode 100644 index 00000000..7b038a7f --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/05_two_content.svg @@ -0,0 +1,45 @@ + + + + + + + + + {{PAGE_TITLE}} + + + {{LEFT_CONTENT}} + + + {{RIGHT_CONTENT}} + + + {{FOOTER_NOTE}} + + + {{PAGE_NUM}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/06_three_block.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/06_three_block.svg new file mode 100644 index 00000000..b2a7a9e0 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/06_three_block.svg @@ -0,0 +1,53 @@ + + + + + + + + + + {{PAGE_TITLE}} + + + {{BLOCK_1}} + + + {{BLOCK_2}} + + + {{BLOCK_3}} + + + {{FOOTER_NOTE}} + + + {{PAGE_NUM}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/07_kpi_row.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/07_kpi_row.svg new file mode 100644 index 00000000..28fea964 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/07_kpi_row.svg @@ -0,0 +1,69 @@ + + + + + + + + + + + + {{PAGE_TITLE}} + + + {{KPI_1}} + + + {{KPI_2}} + + + {{KPI_3}} + + + {{KPI_4}} + + + {{CONTENT_AREA}} + + + {{FOOTER_NOTE}} + + + {{PAGE_NUM}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/08_chart_insight.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/08_chart_insight.svg new file mode 100644 index 00000000..6dbcef15 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/08_chart_insight.svg @@ -0,0 +1,74 @@ + + + + + + + + + {{PAGE_TITLE}} + + + + {"name":"chart_insight","x":68,"y":196,"width":760,"height":424,"type":"column","categories":["Q1","Q2","Q3","Q4"],"series":[{"name":"Actual","values":[42,55,63,78]},{"name":"Plan","values":[48,58,68,74]}],"show_legend":true,"legend_position":"top","style":{"colors":["#64748B","#CBD5E1"],"chart_area_fill":"#F8FAFC","plot_area_fill":"#FFFFFF","text_color":"#475569","axis_color":"#CBD5E1","grid_color":"#E2E8F0","font_family":"Arial"}} + + + Actual + + Plan + + + + + + + + + + + + + + Q1 + Q2 + Q3 + Q4 + + + + {{KEY_MESSAGE}} + + + {{SOURCE}} + + + {{FOOTER_NOTE}} + + + {{PAGE_NUM}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/09_table_summary.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/09_table_summary.svg new file mode 100644 index 00000000..b0bb9d12 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/09_table_summary.svg @@ -0,0 +1,79 @@ + + + + + + + + + {{PAGE_TITLE}} + + + + {"name":"table_summary","x":68,"y":196,"width":816,"height":424,"strict_grid":true,"column_widths":[3,2,2],"row_heights":[1,1,1,1,1],"style":{"font_family":"Arial","font_size":15,"header_font_size":14,"header_fill":"#F1F5F9","header_text":"#334155","body_fill":"#FFFFFF","body_text":"#475569","band_fill":"#F8FAFC","border_color":"#E2E8F0","border_width":1,"padding":{"left":10,"right":10,"top":5,"bottom":5},"valign":"middle"},"columns":[{"text":"Metric","bold":true},{"text":"Current","align":"r","bold":true},{"text":"Target","align":"r","bold":true}],"rows":[[{"text":"Adoption"},{"text":"68%","align":"r","bold":true},{"text":"80%","align":"r"}],[{"text":"Cycle time"},{"text":"12 d","align":"r","bold":true},{"text":"8 d","align":"r"}],[{"text":"Quality"},{"text":"94%","align":"r","bold":true},{"text":"97%","align":"r"}],[{"text":"Cost index"},{"text":"1.08","align":"r","bold":true},{"text":"1.00","align":"r"}]]} + + + + + + + + + + + + + Metric + Current + Target + Adoption + 68% + 80% + Cycle time + 12 d + 8 d + Quality + 94% + 97% + Cost index + 1.08 + 1.00 + + + + {{KEY_MESSAGE}} + + + {{SOURCE}} + + + {{FOOTER_NOTE}} + + + {{PAGE_NUM}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/10_process_timeline.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/10_process_timeline.svg new file mode 100644 index 00000000..6af3fbc5 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/10_process_timeline.svg @@ -0,0 +1,72 @@ + + + + + + + + + + + + + {{PAGE_TITLE}} + + + {{STEP_1}} + + + {{STEP_2}} + + + {{STEP_3}} + + + {{STEP_4}} + + + {{KEY_MESSAGE}} + + + {{FOOTER_NOTE}} + + + {{PAGE_NUM}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/11_matrix_2x2.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/11_matrix_2x2.svg new file mode 100644 index 00000000..eb3d49e1 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/11_matrix_2x2.svg @@ -0,0 +1,73 @@ + + + + + + + + + + + {{PAGE_TITLE}} + + + {{Y_AXIS}} + + + {{X_AXIS}} + + + {{QUADRANT_1}} + + + {{QUADRANT_2}} + + + {{QUADRANT_3}} + + + {{QUADRANT_4}} + + + {{FOOTER_NOTE}} + + + {{PAGE_NUM}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/12_appendix.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/12_appendix.svg new file mode 100644 index 00000000..c6fc4497 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/12_appendix.svg @@ -0,0 +1,43 @@ + + + + + + + + {{PAGE_TITLE}} + + + {{LEFT_CONTENT}} + + + {{RIGHT_CONTENT}} + + + {{FOOTER_NOTE}} + + + {{PAGE_NUM}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/13_closing.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/13_closing.svg new file mode 100644 index 00000000..4cf19689 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/13_closing.svg @@ -0,0 +1,21 @@ + + + + + + {{CLOSING_MESSAGE}} + + + {{CONTACT_LINE}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/design_spec.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/design_spec.md new file mode 100644 index 00000000..79a5b2c6 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/report_core/templates/design_spec.md @@ -0,0 +1,82 @@ +--- +layout_id: report_core +kind: layout +category: general +summary: A structure-only 16:9 system with 13 authored PowerPoint Layouts across two Masters, carrying persistent page chrome and page-number placeholders. +keywords: [report, business, dense, chrome, multi-master] +canvas_format: ppt169 +canvas_width: 1280 +canvas_height: 720 +canvas_viewbox: "0 0 1280 720" +replication_mode: standard +native_structure_mode: structured +page_count: 13 +page_types: + - cover + - section_divider + - agenda + - title_content + - two_content + - three_block + - kpi_row + - chart_insight + - table_summary + - process_timeline + - matrix_2x2 + - appendix + - closing +placeholders: + 01_cover: ["{{TITLE}}", "{{SUBTITLE}}", "{{DATE}}"] + 02_section_divider: ["{{CHAPTER_NUM}}", "{{CHAPTER_TITLE}}", "{{CHAPTER_DESC}}"] + 03_agenda: ["{{PAGE_TITLE}}", "{{ITEM_1}}", "{{ITEM_2}}", "{{ITEM_3}}", "{{ITEM_4}}", "{{ITEM_5}}", "{{FOOTER_NOTE}}", "{{PAGE_NUM}}"] + 04_title_content: ["{{PAGE_TITLE}}", "{{CONTENT_AREA}}", "{{FOOTER_NOTE}}", "{{PAGE_NUM}}"] + 05_two_content: ["{{PAGE_TITLE}}", "{{LEFT_CONTENT}}", "{{RIGHT_CONTENT}}", "{{FOOTER_NOTE}}", "{{PAGE_NUM}}"] + 06_three_block: ["{{PAGE_TITLE}}", "{{BLOCK_1}}", "{{BLOCK_2}}", "{{BLOCK_3}}", "{{FOOTER_NOTE}}", "{{PAGE_NUM}}"] + 07_kpi_row: ["{{PAGE_TITLE}}", "{{KPI_1}}", "{{KPI_2}}", "{{KPI_3}}", "{{KPI_4}}", "{{CONTENT_AREA}}", "{{FOOTER_NOTE}}", "{{PAGE_NUM}}"] + 08_chart_insight: ["{{PAGE_TITLE}}", "{{KEY_MESSAGE}}", "{{SOURCE}}", "{{FOOTER_NOTE}}", "{{PAGE_NUM}}"] + 09_table_summary: ["{{PAGE_TITLE}}", "{{KEY_MESSAGE}}", "{{SOURCE}}", "{{FOOTER_NOTE}}", "{{PAGE_NUM}}"] + 10_process_timeline: ["{{PAGE_TITLE}}", "{{STEP_1}}", "{{STEP_2}}", "{{STEP_3}}", "{{STEP_4}}", "{{KEY_MESSAGE}}", "{{FOOTER_NOTE}}", "{{PAGE_NUM}}"] + 11_matrix_2x2: ["{{PAGE_TITLE}}", "{{Y_AXIS}}", "{{X_AXIS}}", "{{QUADRANT_1}}", "{{QUADRANT_2}}", "{{QUADRANT_3}}", "{{QUADRANT_4}}", "{{FOOTER_NOTE}}", "{{PAGE_NUM}}"] + 12_appendix: ["{{PAGE_TITLE}}", "{{LEFT_CONTENT}}", "{{RIGHT_CONTENT}}", "{{FOOTER_NOTE}}", "{{PAGE_NUM}}"] + 13_closing: ["{{CLOSING_MESSAGE}}", "{{CONTACT_LINE}}"] +--- + +# Report Core — Design Specification + +## IV. Signature Design Elements + +Report Core provides a structural vocabulary for paginated 16:9 material that is +read as much as it is presented: reviews, analyses, and evidence-carrying +decks whose pages need to be citable and navigable. The neutral prototype paint +exists only to expose hierarchy and slot geometry; it is not an identity +segment. Color, typography, logo, voice, and icon treatment remain downstream +decisions. + +| Element | Template-specific behavior | +|---|---| +| Two Masters, two background planes | `report_core_content_master` carries the light reading plane plus persistent chrome; `report_core_divider_master` carries an inverted plane with no chrome, used by `cover`, `section_divider`, and `closing`. The reusable structural fact is that the roster owns two independent background planes and two Theme parts — not the specific prototype hex values, which remain replaceable preview paint. | +| Persistent page chrome | The content Master owns a header hairline at y 64 and a footer hairline at y 664 as static atoms repeated on every content page. Divider pages carry neither, so a section break reads as a genuine interruption rather than a restyled content page. | +| Page numbering is structural | Every content Layout declares a `slide-number` slot at `1112 676 120 32` and a `footer` slot at `48 676 900 32`; `cover` declares a `date` slot. These enable the matching Layout header/footer flags so the compiled package carries real numbering capability instead of drawn text. | +| Tightened frame | Margins are 48 px and the title band is `48 88 1184 56` at 28 px, against a 64 px margin and 36 px title on a breathing general system. The content field runs y 176 to y 640 on every content page. | +| Rules before containers | Grouping is carried by hairlines wherever it can be: `agenda` separates its five rows with rules and Layout-owned `01`–`05` indices, and `appendix` uses a single column rule with no panel at all. Filled panels appear only where a region genuinely needs a distinct material plane. | +| Density ladder | Body text steps from 20 px on single-region pages, to 19 px in split panels, to 18 px in step and evidence regions, down to 15 px in `appendix`. Chrome text sits at 12 px. The ladder is what lets one system carry both a synthesis page and a reference page without changing frame. | +| Analytical page types | `kpi_row` places four metrics across the full 1184 px field, which this canvas width supports without compressing them. `matrix_2x2` adds four quadrant slots plus two axis-label slots for positioning arguments. `chart_insight` and `table_summary` declare typed `chart` / `table` slots whose authored groups remain complete SVG fallbacks; optional replacement metadata can materialize PowerPoint-native data objects only when that export path is requested. | +| Text entry | General body and object slots begin at the upper-left. Centered alignment is reserved for KPI values, short process nodes, and the timeline takeaway. | + +## V. Page Roster + +| SVG | Master | Layout key | PowerPoint picker name | Purpose | +|---|---|---|---|---| +| `01_cover.svg` | Divider | `cover` | Cover | Title and subtitle on the inverted plane with a date slot | +| `02_section_divider.svg` | Divider | `section_divider` | Section Divider | Chapter number, title, and description above a rule | +| `03_agenda.svg` | Content | `agenda` | Agenda | Five rule-separated rows with Layout-owned ordinal indices | +| `04_title_content.svg` | Content | `title_content` | Title and Content | Page title over one full-width content region | +| `05_two_content.svg` | Content | `two_content` | Two Content | Equal left and right content panels | +| `06_three_block.svg` | Content | `three_block` | Three Block | Three parallel content panels | +| `07_kpi_row.svg` | Content | `kpi_row` | KPI Row | Four metrics across the full field over one evidence region | +| `08_chart_insight.svg` | Content | `chart_insight` | Chart and Insight | Chart slot with SVG fallback, interpretation, and source rails | +| `09_table_summary.svg` | Content | `table_summary` | Table and Summary | Table slot with SVG fallback, summary, and source rails | +| `10_process_timeline.svg` | Content | `process_timeline` | Process Timeline | Four ordered steps on a shared axis plus a takeaway rail | +| `11_matrix_2x2.svg` | Content | `matrix_2x2` | Two-by-Two Matrix | Four quadrant slots with two axis-label slots | +| `12_appendix.svg` | Content | `appendix` | Appendix | Dense two-column reference page with no container | +| `13_closing.svg` | Divider | `closing` | Closing | Closing message and contact line on the inverted plane | diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/story_vertical/templates/01_cover.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/story_vertical/templates/01_cover.svg new file mode 100644 index 00000000..8901bd68 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/story_vertical/templates/01_cover.svg @@ -0,0 +1,29 @@ + + + + + + + {{TITLE}} + + + {{SUBTITLE}} + + + {{BRAND_LINE}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/story_vertical/templates/02_statement.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/story_vertical/templates/02_statement.svg new file mode 100644 index 00000000..1b006d47 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/story_vertical/templates/02_statement.svg @@ -0,0 +1,21 @@ + + + + + + {{KEY_MESSAGE}} + + + {{SUPPORT_TEXT}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/story_vertical/templates/03_title_content.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/story_vertical/templates/03_title_content.svg new file mode 100644 index 00000000..4efe4d5e --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/story_vertical/templates/03_title_content.svg @@ -0,0 +1,27 @@ + + + + + + {{PAGE_TITLE}} + + + {{CONTENT_AREA}} + + + {{FOOTER_NOTE}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/story_vertical/templates/04_numbered_list.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/story_vertical/templates/04_numbered_list.svg new file mode 100644 index 00000000..cf0b0736 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/story_vertical/templates/04_numbered_list.svg @@ -0,0 +1,58 @@ + + + + + + + + + + 1 + 2 + 3 + + {{PAGE_TITLE}} + + + {{ITEM_1}} + + + {{ITEM_2}} + + + {{ITEM_3}} + + + {{FOOTER_NOTE}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/story_vertical/templates/05_image_full.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/story_vertical/templates/05_image_full.svg new file mode 100644 index 00000000..9b17125d --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/story_vertical/templates/05_image_full.svg @@ -0,0 +1,27 @@ + + + + + + + + + {{PAGE_TITLE}} + + + {{CAPTION}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/story_vertical/templates/06_image_top_text.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/story_vertical/templates/06_image_top_text.svg new file mode 100644 index 00000000..c0b0bdae --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/story_vertical/templates/06_image_top_text.svg @@ -0,0 +1,33 @@ + + + + + + {{PAGE_TITLE}} + + + + + + {{CONTENT_AREA}} + + + {{FOOTER_NOTE}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/story_vertical/templates/07_two_block.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/story_vertical/templates/07_two_block.svg new file mode 100644 index 00000000..eded2f20 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/story_vertical/templates/07_two_block.svg @@ -0,0 +1,35 @@ + + + + + + + {{PAGE_TITLE}} + + + {{BLOCK_1}} + + + {{BLOCK_2}} + + + {{FOOTER_NOTE}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/story_vertical/templates/08_step_flow.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/story_vertical/templates/08_step_flow.svg new file mode 100644 index 00000000..b55d50ac --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/story_vertical/templates/08_step_flow.svg @@ -0,0 +1,45 @@ + + + + + + + + + {{PAGE_TITLE}} + + + {{STEP_1}} + + + {{STEP_2}} + + + {{STEP_3}} + + + {{FOOTER_NOTE}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/story_vertical/templates/09_ending.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/story_vertical/templates/09_ending.svg new file mode 100644 index 00000000..be9d056a --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/story_vertical/templates/09_ending.svg @@ -0,0 +1,29 @@ + + + + + + + {{CLOSING_MESSAGE}} + + + {{CTA_TEXT}} + + + {{BRAND_LINE}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/story_vertical/templates/design_spec.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/story_vertical/templates/design_spec.md new file mode 100644 index 00000000..09190434 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/story_vertical/templates/design_spec.md @@ -0,0 +1,70 @@ +--- +layout_id: story_vertical +kind: layout +category: scenario +summary: A structure-only 9:16 system with 9 authored PowerPoint Layouts whose text geometry respects the top and bottom story safe zones. +keywords: [story, vertical, social, 9-16, safe-zone] +canvas_format: story +canvas_width: 1080 +canvas_height: 1920 +canvas_viewbox: "0 0 1080 1920" +replication_mode: standard +native_structure_mode: structured +page_count: 9 +page_types: + - cover + - statement + - title_content + - numbered_list + - image_full + - image_top_text + - two_block + - step_flow + - ending +placeholders: + 01_cover: ["{{TITLE}}", "{{SUBTITLE}}", "{{BRAND_LINE}}"] + 02_statement: ["{{KEY_MESSAGE}}", "{{SUPPORT_TEXT}}"] + 03_title_content: ["{{PAGE_TITLE}}", "{{CONTENT_AREA}}", "{{FOOTER_NOTE}}"] + 04_numbered_list: ["{{PAGE_TITLE}}", "{{ITEM_1}}", "{{ITEM_2}}", "{{ITEM_3}}", "{{FOOTER_NOTE}}"] + 05_image_full: ["{{PAGE_TITLE}}", "{{CAPTION}}"] + 06_image_top_text: ["{{PAGE_TITLE}}", "{{CONTENT_AREA}}", "{{FOOTER_NOTE}}"] + 07_two_block: ["{{PAGE_TITLE}}", "{{BLOCK_1}}", "{{BLOCK_2}}", "{{FOOTER_NOTE}}"] + 08_step_flow: ["{{PAGE_TITLE}}", "{{STEP_1}}", "{{STEP_2}}", "{{STEP_3}}", "{{FOOTER_NOTE}}"] + 09_ending: ["{{CLOSING_MESSAGE}}", "{{CTA_TEXT}}", "{{BRAND_LINE}}"] +--- + +# Story Vertical — Design Specification + +## IV. Signature Design Elements + +Story Vertical provides a structural vocabulary for 9:16 canvases viewed +full-screen on a phone, where surrounding interface chrome overlays the top and +bottom of the frame. The neutral prototype paint exists only to expose hierarchy +and slot geometry; it is not an identity segment, and no platform palette, mark, +or typeface is claimed. Color, typography, logo, voice, and icon treatment +remain downstream decisions. + +| Element | Template-specific behavior | +|---|---| +| Safe zones govern text, not pictures | Every text slot stays inside y 120–1740. Picture geometry deliberately does not: `image_full` runs its typed `picture` slot from `0 0` to y 1440 so a full-bleed image sits under the interface chrome rather than being inset into a visible letterbox. This asymmetry is the defining rule of the canvas and must survive any reskin. | +| Band structure | Titled pages use a title band at `80 200 920 180`, a content field from y 440 to y 1620, and a `80 1660 920 56` footer note. `cover` and `ending` replace the footer with a full-bleed band from y 1560 to y 1740, which ends exactly where the bottom safe zone begins. | +| Narrow single column | The content field is 920 px wide — 15% narrower than a 3:4 canvas of the same family — so no page splits it into columns and body copy runs at 32 px. Multi-part pages stack: rows in `numbered_list`, blocks in `two_block`. | +| Row and block rhythm | List rows are 360 px with a 50 px gap; blocks are 560 px with a 60 px gap. Both sit at the upper end of the portrait card range because a 9:16 field has vertical room to spend and few units per page. | +| Fixed list markers | `numbered_list` owns its 1–3 markers as Layout atoms: the circle and its digit are static structure, so only the item copy stays Slide-local. | +| Vertical flow | `step_flow` runs its axis and nodes down the left gutter at x 168. Progression reads downward, matching how the canvas is consumed. | +| Focal pages | `statement` and `ending` center one dominant text block with a wide empty field above and below. Centered alignment is confined to those focal roles plus the closing brand line; list, block, step, and body slots begin at the upper-left. | +| Type scale | Prototype sizes step from cover title 76 through focal 64, page title 56, body 32, and note 24 — one step below the same roles on a 3:4 canvas because the column is narrower. They are provisional preview values, not a locked project type scale. | + +## V. Page Roster + +| SVG | Layout key | PowerPoint picker name | Purpose | +|---|---|---|---| +| `01_cover.svg` | `cover` | Cover | Accent-anchored title and subtitle over a full-bleed brand band | +| `02_statement.svg` | `statement` | Statement | Centered dominant claim with a short supporting line | +| `03_title_content.svg` | `title_content` | Title and Content | Page title over one single-column content field | +| `04_numbered_list.svg` | `numbered_list` | Numbered List | Three stacked rows with fixed Layout-owned numeric markers | +| `05_image_full.svg` | `image_full` | Full-Bleed Image | Edge-to-edge picture slot crossing the top safe zone, over a caption band | +| `06_image_top_text.svg` | `image_top_text` | Image over Text | Typed picture slot above a text band | +| `07_two_block.svg` | `two_block` | Two Block | Two stacked blocks of equal height | +| `08_step_flow.svg` | `step_flow` | Vertical Step Flow | Three ordered steps on a vertical gutter axis | +| `09_ending.svg` | `ending` | Ending | Centered closing message and action line over a full-bleed brand band | diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/xiaohongshu_post/templates/01_cover.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/xiaohongshu_post/templates/01_cover.svg new file mode 100644 index 00000000..1636cec2 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/xiaohongshu_post/templates/01_cover.svg @@ -0,0 +1,29 @@ + + + + + + + {{TITLE}} + + + {{SUBTITLE}} + + + {{BRAND_LINE}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/xiaohongshu_post/templates/02_statement.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/xiaohongshu_post/templates/02_statement.svg new file mode 100644 index 00000000..db412cdd --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/xiaohongshu_post/templates/02_statement.svg @@ -0,0 +1,21 @@ + + + + + + {{KEY_MESSAGE}} + + + {{SUPPORT_TEXT}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/xiaohongshu_post/templates/03_title_content.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/xiaohongshu_post/templates/03_title_content.svg new file mode 100644 index 00000000..85bfca2f --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/xiaohongshu_post/templates/03_title_content.svg @@ -0,0 +1,27 @@ + + + + + + {{PAGE_TITLE}} + + + {{CONTENT_AREA}} + + + {{FOOTER_NOTE}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/xiaohongshu_post/templates/04_numbered_list.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/xiaohongshu_post/templates/04_numbered_list.svg new file mode 100644 index 00000000..28e49809 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/xiaohongshu_post/templates/04_numbered_list.svg @@ -0,0 +1,58 @@ + + + + + + + + + + 1 + 2 + 3 + + {{PAGE_TITLE}} + + + {{ITEM_1}} + + + {{ITEM_2}} + + + {{ITEM_3}} + + + {{FOOTER_NOTE}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/xiaohongshu_post/templates/05_two_card_stack.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/xiaohongshu_post/templates/05_two_card_stack.svg new file mode 100644 index 00000000..b03de70c --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/xiaohongshu_post/templates/05_two_card_stack.svg @@ -0,0 +1,35 @@ + + + + + + + {{PAGE_TITLE}} + + + {{CARD_1}} + + + {{CARD_2}} + + + {{FOOTER_NOTE}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/xiaohongshu_post/templates/06_image_top_text.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/xiaohongshu_post/templates/06_image_top_text.svg new file mode 100644 index 00000000..09aa0fe7 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/xiaohongshu_post/templates/06_image_top_text.svg @@ -0,0 +1,33 @@ + + + + + + {{PAGE_TITLE}} + + + + + + {{CONTENT_AREA}} + + + {{FOOTER_NOTE}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/xiaohongshu_post/templates/07_image_full_caption.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/xiaohongshu_post/templates/07_image_full_caption.svg new file mode 100644 index 00000000..fa144b17 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/xiaohongshu_post/templates/07_image_full_caption.svg @@ -0,0 +1,27 @@ + + + + + + + + + {{PAGE_TITLE}} + + + {{CAPTION}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/xiaohongshu_post/templates/08_quote.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/xiaohongshu_post/templates/08_quote.svg new file mode 100644 index 00000000..0789ae96 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/xiaohongshu_post/templates/08_quote.svg @@ -0,0 +1,30 @@ + + + + + + + {{QUOTE_TEXT}} + + + {{ATTRIBUTION}} + + + {{FOOTER_NOTE}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/xiaohongshu_post/templates/09_step_flow.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/xiaohongshu_post/templates/09_step_flow.svg new file mode 100644 index 00000000..47047f74 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/xiaohongshu_post/templates/09_step_flow.svg @@ -0,0 +1,45 @@ + + + + + + + + + {{PAGE_TITLE}} + + + {{STEP_1}} + + + {{STEP_2}} + + + {{STEP_3}} + + + {{FOOTER_NOTE}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/xiaohongshu_post/templates/10_ending.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/xiaohongshu_post/templates/10_ending.svg new file mode 100644 index 00000000..e048b6aa --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/xiaohongshu_post/templates/10_ending.svg @@ -0,0 +1,29 @@ + + + + + + + {{CLOSING_MESSAGE}} + + + {{CTA_TEXT}} + + + {{BRAND_LINE}} + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/xiaohongshu_post/templates/design_spec.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/xiaohongshu_post/templates/design_spec.md new file mode 100644 index 00000000..a48c159e --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/layouts/xiaohongshu_post/templates/design_spec.md @@ -0,0 +1,72 @@ +--- +layout_id: xiaohongshu_post +kind: layout +category: scenario +summary: A structure-only 3:4 vertical system with 10 authored PowerPoint Layouts for single-column image-text posts on tall social canvases. +keywords: [xiaohongshu, vertical, social, portrait, knowledge-post] +canvas_format: xiaohongshu +canvas_width: 1242 +canvas_height: 1660 +canvas_viewbox: "0 0 1242 1660" +replication_mode: standard +native_structure_mode: structured +page_count: 10 +page_types: + - cover + - statement + - title_content + - numbered_list + - two_card_stack + - image_top_text + - image_full_caption + - quote + - step_flow + - ending +placeholders: + 01_cover: ["{{TITLE}}", "{{SUBTITLE}}", "{{BRAND_LINE}}"] + 02_statement: ["{{KEY_MESSAGE}}", "{{SUPPORT_TEXT}}"] + 03_title_content: ["{{PAGE_TITLE}}", "{{CONTENT_AREA}}", "{{FOOTER_NOTE}}"] + 04_numbered_list: ["{{PAGE_TITLE}}", "{{ITEM_1}}", "{{ITEM_2}}", "{{ITEM_3}}", "{{FOOTER_NOTE}}"] + 05_two_card_stack: ["{{PAGE_TITLE}}", "{{CARD_1}}", "{{CARD_2}}", "{{FOOTER_NOTE}}"] + 06_image_top_text: ["{{PAGE_TITLE}}", "{{CONTENT_AREA}}", "{{FOOTER_NOTE}}"] + 07_image_full_caption: ["{{PAGE_TITLE}}", "{{CAPTION}}"] + 08_quote: ["{{QUOTE_TEXT}}", "{{ATTRIBUTION}}", "{{FOOTER_NOTE}}"] + 09_step_flow: ["{{PAGE_TITLE}}", "{{STEP_1}}", "{{STEP_2}}", "{{STEP_3}}", "{{FOOTER_NOTE}}"] + 10_ending: ["{{CLOSING_MESSAGE}}", "{{CTA_TEXT}}", "{{BRAND_LINE}}"] +--- + +# Xiaohongshu Post — Design Specification + +## IV. Signature Design Elements + +Xiaohongshu Post provides a structural vocabulary for tall 3:4 canvases read on +a phone in a single top-to-bottom pass. The neutral prototype paint exists only +to expose hierarchy and slot geometry; it is not an identity segment, and no +platform palette, mark, or typeface is claimed. Color, typography, logo, voice, +and icon treatment remain downstream decisions. + +| Element | Template-specific behavior | +|---|---| +| Vertical bands | The page divides into a title band (`80 112 1082 200`), a content field from y 376 to y 1440, and a closing band. Interior pages use a `80 1500 1082 60` footer note; `cover`, `image_full_caption`, and `ending` replace it with a full-bleed band so the last screen-height carries its own weight. | +| Single-column rule | The 1082 px content field is never split into side-by-side columns. Two 521 px halves would leave 34 px body copy with too few characters per line, so every multi-part page stacks instead: rows in `numbered_list`, cards in `two_card_stack`, bands in `image_top_text`. | +| Card and row rhythm | Stacked cards are 504 px tall with a 56 px gap; list rows are 320 px with a 52 px gap. Both keep each unit tall enough to hold a heading plus supporting lines at this reading distance. | +| Fixed list markers | `numbered_list` owns its 1–3 markers as Layout atoms: the circle and its digit are static structure, so only the item copy stays Slide-local. | +| Vertical flow | `step_flow` runs its axis and nodes down the left gutter at x 176 rather than across the page. Progression on this canvas reads downward, matching the scroll direction. | +| Image system | Images carry rather than decorate. `image_top_text` gives a typed `picture` slot the upper 620 px above a text band; `image_full_caption` runs the picture full-bleed to y 1400 with a caption band beneath it, so the crop is never letterboxed by page margins. | +| Focal pages | `statement`, `quote`, and `ending` center a single dominant text block with generous empty field above and below. Centered alignment is confined to these focal roles plus the closing brand line; all list, card, step, and body slots begin at the upper-left. | +| Type scale | Prototype sizes step from cover title 86 through page title 64, focal statement 72/68, body 34, and note 26. They are provisional preview values sized for this canvas, not a locked project type scale. | + +## V. Page Roster + +| SVG | Layout key | PowerPoint picker name | Purpose | +|---|---|---|---| +| `01_cover.svg` | `cover` | Cover | Accent-anchored title and subtitle over a full-bleed brand band | +| `02_statement.svg` | `statement` | Statement | Centered dominant claim with a short supporting line | +| `03_title_content.svg` | `title_content` | Title and Content | Page title over one single-column content field | +| `04_numbered_list.svg` | `numbered_list` | Numbered List | Three stacked rows with fixed Layout-owned numeric markers | +| `05_two_card_stack.svg` | `two_card_stack` | Two-Card Stack | Two stacked cards of equal height | +| `06_image_top_text.svg` | `image_top_text` | Image over Text | Typed picture slot above a text band | +| `07_image_full_caption.svg` | `image_full_caption` | Full-Bleed Image with Caption | Edge-to-edge picture slot over a caption band | +| `08_quote.svg` | `quote` | Quote | Quotation-marked excerpt with a rule and attribution, no page title | +| `09_step_flow.svg` | `step_flow` | Vertical Step Flow | Three ordered steps on a vertical gutter axis | +| `10_ending.svg` | `ending` | Ending | Centered closing message and action line over a full-bleed brand band | diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/schemas/spec_lock.schema.json b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/schemas/spec_lock.schema.json index bba03902..7108563d 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/schemas/spec_lock.schema.json +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/schemas/spec_lock.schema.json @@ -62,6 +62,7 @@ "pptx_layouts": {"type": "object"}, "page_pptx_layouts": {"type": "object"}, "page_layouts": {"type": "object"}, + "page_visualizations": {"type": "object"}, "page_charts": {"type": "object"}, "forbidden": {"type": "string"} }, @@ -223,17 +224,21 @@ "entry_key_pattern": "^P[0-9]{2,}$", "value_pattern": "^[A-Za-z0-9._-]+$" }, + { + "id": "page_visualizations", + "pattern": "^page_visualizations$", + "required": false, + "min_entries": 1, + "entry_key_pattern": "^P[0-9]{2,}$", + "value_pattern": "^(?:chart|table)/[a-z0-9]+(?:_[a-z0-9]+)*$" + }, { "id": "page_charts", "pattern": "^page_charts$", "required": false, "min_entries": 1, "entry_key_pattern": "^P[0-9]{2,}$", - "value_catalog": { - "path": "../charts/charts_index.json", - "pointer": ["charts"], - "asset_path_pattern": "../charts/{value}.svg" - } + "value_pattern": "^[a-z0-9]+(?:_[a-z0-9]+)*$" }, {"id": "forbidden", "pattern": "^forbidden$", "required": true, "min_body_chars": 1} ], diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/spec_lock_reference.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/spec_lock_reference.md index 28a368e3..1a809c62 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/spec_lock_reference.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/spec_lock_reference.md @@ -29,7 +29,9 @@ After Generate Step 4 Gate 1, read the completed Design Spec and current page/re | `pptx_structure` | `mode` | Values: `flat`, `structured` | | `forbidden` | Literal list items | General standards stay in their owning reference | -Optional data sections: `images`, `page_charts`. +Optional data sections: `images`, `page_visualizations` (Chart/Table only). New locks never write +legacy `page_charts`; existing locks may retain it for read-only compatibility. +Never declare the same page in both sections. The required universal block is: @@ -70,7 +72,22 @@ Structured section value shapes: - P01: 03_content ``` -Project each §VII `Page | Template | Usage` row's first two fields into `page_charts`; Usage stays in the Design Spec. This is a page-local reference, not a type/geometry lock. Keys must exist in `charts/charts_index.json`; no-match stays in §IX. +Project each §VII Page/Family/Template into at most one +`page_visualizations` `/` row per page; Usage, children, +no-match, and qualitative relationships stay in §IX. Resolve the reference to +one live SVG. It locks neither type, geometry, nor native output. + +```markdown +## page_visualizations +- P03: chart/line_chart +- P09: table/record_table +``` + +**Legacy compatibility**: keep existing `page_charts` bare keys. Live +Chart/Table keys resolve unambiguously through two registries; retired Structure +keys are semantic-only, have no SVG, and rely on §IX (repair upstream when +insufficient). New locks write `page_visualizations`; dual page declarations +conflict even when they resolve alike. Typography projection excludes Character/upgrade References: @@ -96,7 +113,12 @@ New locks always write `title_family` and `body_family`, even when their values - Custom reference grammar: comma-separated exact catalog ids with no duplicates. Reference fields are valid only for `custom`; omit them for a genuinely novel direction. - `stroke_width` grammar: `1.5`, `2`, or `3`; present only for `tabler-outline`. - `page_rhythm` grammar: `P` + at least two digits (`P01`, `P100`) followed by `anchor|dense|breathing`. -- `page_charts` grammar: `P` + at least two digits followed by a `charts_index` key; the key and `.svg` must both exist. +- `page_visualizations` grammar: `P` + at least two digits followed by + `chart|table`, `/`, and one canonical visualization key; the family/key must + resolve to one SVG through the matching live index. +- Legacy `page_charts` grammar: `P` + at least two digits followed by one bare + key. Chart/Table resolves uniquely across two registries; retired Structure + is semantic-only. Never add this section to a new lock. - `pptx_masters` grammar: `: `. - `pptx_layouts` grammar: `: | | `. - `page_pptx_layouts` grammar: `P` + at least two digits followed by a declared Layout key. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/styles/README.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/styles/README.md index 06d92eba..20d2a68e 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/styles/README.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/styles/README.md @@ -13,9 +13,9 @@ Style is a fourth independent template kind alongside [`brands/`](../brands/), [ | Final Stage-2 `visual_style` | The current deck's confirmed shape, composition, whitespace, typography-character, and texture lock | | Internal `template_reuse_scope: style` | A flat current-project export plan that reuses no Master/Layout structure | -These names are separate contracts. Style-only and Style + Brand naturally produce a flat application plan, while Style fused with a Layout or Deck may use structured reuse. `kind: style` therefore never forces the internal reuse scope when another workspace supplies structure. +These names are separate contracts. Style-only and Style + Brand naturally produce a flat application plan, while a Style installed alongside a Layout or Deck may use structured reuse. `kind: style` therefore never forces the internal reuse scope when another workspace supplies structure. -## Selection, Precedence, and Fusion +## Selection, Precedence, and Installation Selection follows the parent README's Default Stage-1 [`generate-pptx`](../../workflows/generate-pptx.md) template-choice contract. @@ -25,7 +25,7 @@ the same selector, defaults Stage 1 to template mode, and preselects that specific candidate only when it is the sole supplied root. A consulting label or visual description remains a brief and does not activate this workspace. A non-free confirmation runs the -common installation/fusion stage after Stage 1 and before Stage 2; template-aware reading begins +common installation stage after Stage 1 and before Stage 2; template-aware reading begins in final Stage 2 from the project-local copy. Quick applies a supplied exact Style root directly and otherwise uses free design; its current agent reads the installed copy before authoring flat pages. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/styles/academic-research/templates/design_spec.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/styles/academic-research/templates/design_spec.md new file mode 100644 index 00000000..1c301817 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/styles/academic-research/templates/design_spec.md @@ -0,0 +1,81 @@ +--- +style_id: academic-research +kind: style +summary: Research-reporting method that builds a defensible claim from question, method, and result while keeping limitations visible. +keywords: [academic, research, thesis-defense, methodology, peer-review] +--- + +# Academic Research — Style Specification + +> Method and design defaults only. No project communication contract, brand identity, page structure, or SVG prototypes. + +## I. Style Overview + +| Property | Value | +|---|---| +| Style Name | Academic Research | +| Best Fit | Thesis proposals and defenses, conference talks, lab meetings, grant and funding reviews, and research seminars | +| Reusable Intent | Let a skeptical, domain-literate audience judge whether the conclusion is earned — by seeing the question, the method, the actual result, and what the work does not establish | +| Sources | Authored in-repo as a bundled reference Style, 2026-08-07; distilled from research-presentation practice, not a single external document | + +## II. Communication Method + +- **Preferred Mode**: custom +- **Mode References**: instructional, pyramid +- **Mode Behavior**: Build the argument in the constructive order a research audience expects — question, prior work, approach, result, interpretation — because a conclusion stated before its method cannot be evaluated. Within that order, hold every claim to a pyramid's discipline: each conclusion resolves to the specific results that support it, and each result to the method that produced it. When time is short, compress the middle rather than inverting the order; the audience must still be able to trace conclusion back to evidence. +- **Argument Flow**: Establish the question and why it matters and remains open, position it against what is already known, make the approach reproducible enough to be judged, present results as observed rather than as desired, then interpret within stated limits. Sequence follows the logic of the work, not a required section roster; exploratory, confirmatory, and negative results each keep their own honest shape. +- **Page Message Discipline**: Give each page one finding, one method component, or one comparison, and title it with what it establishes rather than with a section label. Keep a figure and the claim it supports on the same page, and state the claim in words the audience can check against the figure. Never leave a result page whose takeaway exists only in narration. +- **Claim Discipline**: Keep observation, inference, hypothesis, and speculation distinct in wording and never let one drift into another across the talk. Report effect size with uncertainty rather than significance alone, state sample, condition, and analysis choices where they affect the reading, and present negative or null results without rhetorical softening. Distinguish correlation from cause explicitly, credit prior work precisely, and keep limitations in the talk rather than only in the paper. + +## III. Page Role Vocabulary + +| Role | Communication Job | Evidence Obligation | Composition Tendency | +|---|---|---|---| +| Research question | Establish what is being asked and why it remains open | Show the gap concretely from prior work, not as a rhetorical premise | Keep the question dominant; one page, one question | +| Prior work positioning | Locate the contribution among what already exists | Represent prior work accurately, including where it succeeds; cite precisely | Organize by relationship to this work rather than chronologically | +| Contribution claim | State plainly what this work adds | Scope the claim to what the results actually support | Keep the claim isolated and unqualified by decoration; it will be quoted | +| Approach and method | Make the work judgeable and reproducible | Give the design, data, parameters, and choices that affect the result | Favor one clear schematic of the pipeline over dense procedural prose | +| Data and materials | Establish what the work was performed on | State provenance, size, collection, inclusion criteria, and known bias | Keep the descriptive facts scannable and the limitation visible, not buried | +| Result | Present what was actually observed | Show the data with uncertainty; do not present the summary alone | Let the figure dominate and state the reading in one line beside it | +| Comparison and ablation | Show what the result is relative to | Use fair baselines under matched conditions; report what was tuned | Align conditions on shared axes and mark the decisive difference | +| Interpretation | Say what the result means | Separate what follows from the data from what the authors believe | Keep interpretation visually distinct from the result it interprets | +| Limitation and threat | State what the work does not establish | Name real threats to validity and their direction, not ritual disclaimers | Give limitations a real page rather than a trailing bullet | +| Conclusion and future work | Close the question and point onward | Restate only what the evidence supports; keep future work honest about difficulty | Mirror the question page so the arc closes visibly | +| Supplementary detail | Hold material for questions and scrutiny | Retain full parameters, derivations, additional conditions, and sources | Allow high density; optimize for retrieval during questions | + +## IV. Evidence & Data Expression + +- **Argument Trace**: Every conclusion traces to specific results, every result to a stated method, and every method choice to a reason. Where the chain breaks, say so on the page rather than letting the narrative bridge it. +- **Charts**: Show the data, not only its summary — distributions, individual points, or error structure where the sample allows. Always display uncertainty for estimated quantities and state what the interval represents. Keep axes honest and consistently scaled across compared panels, label log scales prominently, and annotate the specific comparison the claim rests on. Never truncate an axis, hide outliers, or select a subset without saying so. +- **Tables**: Use tables for parameters, dataset characteristics, and quantitative comparisons. Report uncertainty alongside every estimate, keep units and precision consistent, mark which figures come from prior work and which are reproduced here, and never bold a winning row without stating the comparison basis. +- **Sources**: Cite on the page where a claim, figure, dataset, or method appears, in a form the audience can resolve. Reproduce or adapt others' figures only with attribution, mark adaptations as such, and state funding or competing interests where they bear on interpretation. +- **Native Editability**: Prefer editable native charts and tables where the presentation itself carries the data, so numbers can be corrected before submission or defense. Figures produced by the analysis pipeline are evidence and belong here at their original fidelity — import them rather than redrawing them by hand, since a redrawn figure is no longer the result. Producing publication figures is outside this style's scope. + +## V. Visual System Defaults + +- **Preferred Visual Style**: swiss-minimal +- **Composition**: Build each page around one figure or one claim, with the reading of that figure placed immediately beside or beneath it. Keep a stable position for the claim line so the audience learns where to look. Reserve multi-panel composition for genuine comparisons and keep panel order, scale, and labeling consistent across them. +- **Density**: Research audiences accept detail but not clutter. Keep result pages to what supports one claim and move exhaustive conditions to supplementary pages. Let question, contribution, and limitation pages breathe; allow supplementary pages to tighten under one grid while staying legible at the rendered slide size. +- **Decoration**: Effectively none. Hairline rules, restrained emphasis, and clear panel separation only. Avoid gradient backgrounds, three-dimensional chart effects, drop-shadowed boxes, institutional ornament repeated on every page, and any device that adds visual weight without adding information. +- **Color Behavior**: Start neutral and let color encode a declared variable — condition, group, or method — with the mapping fixed across every figure in the talk. Keep the same entity the same color everywhere, ensure categories remain distinguishable for color-vision differences and in grayscale print, and never use color for emphasis where it already carries data meaning. Any confirmed Brand or Deck identity replaces these tendencies. +- **Typography Character**: Use a plain, highly legible sans-serif with proper mathematical and symbol rendering, and consistent treatment of variables, units, and species or gene names per the field's convention. Keep figure labels at a size readable from the back of a lecture room rather than inherited from a print figure. Exact families remain current-project or resolved identity decisions. + +## VI. Image & Icon Direction + +- **Preferred Image Rendering**: flat +- **Image Usage**: Use images where they are evidence or apparatus — micrographs, captured phenomena, experimental setup, instrumentation, or field conditions. Use a schematic where a mechanism or pipeline must be understood. Never insert decorative or conceptual imagery to fill a research page. +- **Image Treatment**: Present evidence images unretouched beyond declared cropping, brightness, and contrast, and state any adjustment applied. Include a scale bar wherever magnification matters, keep panel labels and annotations legible at the rendered slide size, and caption with condition, source, and date. Avoid full-bleed atmospheric treatment and synthetic text inside generated images. +- **Icon Treatment**: Use icons sparingly, only to mark a recurring condition, instrument, or step class, with one coherent family and a mapping fixed across the talk. Never let an icon stand in for a quantity, and avoid icon grids and institutional decoration. + +## VII. Review Focus + +> Apply this section only after the user explicitly activates visual review. It never triggers that stage. + +- Each result page states its claim in words that can be checked against the figure on the same page. +- Figure labels, axis text, and scale bars remain legible from the back of a lecture room, not only on a laptop. +- Uncertainty is shown wherever a quantity is estimated, and axes are neither truncated nor inconsistently scaled across compared panels. +- The color-to-condition mapping stays identical across every figure and survives grayscale and color-vision differences. +- Observation, inference, and speculation remain distinguishable in wording throughout. +- Limitations occupy a real page rather than a trailing bullet. +- Citations resolve on the page where the claim, figure, or dataset appears. +- Supplementary pages stay dense but retrievable under questioning. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/styles/creative-pitch/templates/design_spec.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/styles/creative-pitch/templates/design_spec.md new file mode 100644 index 00000000..9ef79b36 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/styles/creative-pitch/templates/design_spec.md @@ -0,0 +1,80 @@ +--- +style_id: creative-pitch +kind: style +summary: Creative-work presentation method that grounds one idea in a real insight and shows it living across every place it will appear. +keywords: [creative, advertising, branding, campaign, concept] +--- + +# Creative Pitch — Style Specification + +> Method and design defaults only. No project communication contract, brand identity, page structure, or SVG prototypes. + +## I. Style Overview + +| Property | Value | +|---|---| +| Style Name | Creative Pitch | +| Best Fit | Advertising and campaign presentations, brand identity and rebrand proposals, design concept reviews, editorial and content concepts, and creative competitive pitches | +| Reusable Intent | Make a client feel one idea, believe it came from a real insight about their audience, and see convincingly how it lives everywhere it will have to live | +| Sources | Authored in-repo as a bundled reference Style, 2026-08-07; distilled from creative-presentation practice, not a single external document | + +## II. Communication Method + +- **Preferred Mode**: showcase +- **Argument Flow**: Establish the audience truth the work is built on, name the tension or task it creates, land the idea in one line, then show it made real across the places it must work. Prove range before proving polish, and close on how the work will be judged. Keep the strategic build short enough that the idea still surprises; a client who has predicted the idea will not feel it. +- **Page Message Discipline**: Give each page one moment, one execution, or one part of the thought. Let the work occupy the page and keep explanation to the shortest line that frames it — a creative page explained at length is a page that failed. Never place two competing executions on one page, and never show a concept and its rationale competing for the same visual weight. +- **Claim Discipline**: Keep insight, idea, execution, and production reality distinct. Ground the insight in real evidence about real people rather than a rewritten brief, and mark territory explorations, mocked-up scenarios, and placeholder content as what they are — never let a mockup imply a partnership, endorsement, or media placement that does not exist. State what is a route to be developed versus a finished proposal, keep results from prior work attributed with their actual scope, and disclose any use of third-party or generated material that would affect rights. + +## III. Page Role Vocabulary + +| Role | Communication Job | Evidence Obligation | Composition Tendency | +|---|---|---|---| +| Audience truth | Establish the human insight the work rests on | Ground it in observed behavior, language, or research about real people | One statement or one image; it must feel true before it is argued | +| The task | Name what the work has to do | Restate the challenge sharply, including the constraint that makes it hard | Keep it brief; this page exists to make the idea inevitable | +| Strategic thought | Bridge the insight to a creative territory | Show the connection honestly rather than as a rhetorical leap | Minimal; the strategy earns the idea and then gets out of the way | +| The idea | Land the concept in one line | Express it so it can be repeated exactly by whoever leaves the room | The most restrained page of the pitch: the line, and nothing competing with it | +| Hero execution | Show the idea at its most fully realized | Present a real piece at real production quality, not a description of one | Full frame, no chrome, no explanation on the page | +| Range and extension | Prove the idea is a platform, not one execution | Show genuinely different applications, channels, or moments, not recolored variants | Sequence to build conviction; keep each execution readable on its own | +| Identity exploration | Show how the idea looks as a visual system | Present real typography, color, and mark behavior in use rather than as swatches | Show the system working on real surfaces, not as an abstract specimen sheet | +| Tone and craft | Establish the register of the finished work | Use reference or made material that honestly represents intended craft; mark borrowed reference clearly | Let the material speak; avoid annotating what the audience should feel | +| Environment and context | Show the work where its audience meets it | Place executions in real environments at honest scale and legibility | Realistic context; never a mockup that flatters by impossible placement | +| Production reality | Show it can actually be made | Give what production, rights, timing, and budget genuinely require | Plain and honest; a sharp shift in register from the creative pages | +| Measurement | Show how success will be recognized | Tie the idea to observable outcomes rather than promising unprovable effect | Restrained; do not dress the metric page as another creative page | +| Territory reference | Hold alternate routes and supporting exploration | Mark clearly as unfinished routes; keep any borrowed reference attributed | Dense contact-sheet arrangement, plainly separated from the proposal | + +## IV. Evidence & Data Expression + +- **Argument Trace**: The idea traces to the audience truth, and every execution traces to the idea. An execution that does not need this idea to exist is cut. Where an insight comes from research, name it; where it comes from the team's judgment, say that rather than dressing conviction as data. +- **Charts**: Use data sparingly and only where it establishes the insight or the measurement frame. Keep one relationship per chart at statement scale, annotate the meaning directly, and cite the source and period. Never decorate a number into an infographic that obscures how small the sample was. +- **Tables**: Reserve tables for production scope, channel and format inventories, timing, and cost. Keep them plainly styled — the shift in register signals that this part is factual — with units, currency, validity, and what is excluded stated explicitly. +- **Sources**: Attribute research, cultural references, borrowed imagery, music, typefaces, and any generated material where it appears, including licensing status. Present prior campaign results with their actual scope, role, and period, and never imply sole authorship of collaborative work. +- **Native Editability**: Prefer editable native tables for production scope, timing, and cost, since these are negotiated and revised. Creative material is the argument here: present designed executions, imagery, and typographic work at full fidelity rather than reconstructing them as approximate shapes. + +## V. Visual System Defaults + +- **Preferred Visual Style**: photo-editorial +- **Composition**: Compose each page for one piece of work with generous, deliberate space around it, and let the deck's own rhythm move between quiet setup pages and full-frame work. Keep framing consistent enough that the work reads as one body while the pace still varies. This style deliberately holds its own visual voice loosely: once the idea has a visual language, the deck should defer to it rather than impose a competing container. +- **Density**: Extremely sparse in the creative arc — one piece, one line, one moment per page. Density belongs only to production, timing, and territory reference pages, which are plainly styled and clearly separated from the proposal. +- **Decoration**: None around the work. No frames, drop shadows, decorative dividers, or agency ornament competing with what is being shown. Where a device recurs — a rule, a caption position, a corner treatment — it stays identical throughout. Persistent chrome, footers, and page numbers stay off the creative pages. +- **Color Behavior**: Keep the deck's own field neutral — black, white, or a single deep tone — so executions are seen accurately and colors are not misjudged against a colored ground. The work supplies the color. Never recolor an execution to match the presentation, and never place a saturated deck accent beside creative material it will distort. Any confirmed Brand or Deck identity replaces these tendencies, and a proposed identity under review always takes precedence over the presenting agency's own. +- **Typography Character**: Use a quiet, confident editorial hierarchy for the deck's own voice — a statement scale for the idea line and a small, unobtrusive scale for captions and attribution — clearly distinguishable from typography that belongs to the work. Set the idea line with authored line breaks for spoken rhythm. Exact families remain current-project or resolved identity decisions. + +## VI. Image & Icon Direction + +- **Preferred Image Rendering**: editorial +- **Image Usage**: Imagery is the argument. Use finished or convincingly realized executions, honest environmental context, and reference material that genuinely represents intended craft. Never fill a creative page with generic stock imagery, and never let a mood image stand where an execution is expected. +- **Image Treatment**: Present work at the highest fidelity the page allows, cropped to the piece rather than shrunk into a frame, and keep any typography inside an execution legible at real scale. Use consistent framing and caption placement, keep environmental mockups at honest scale and perspective, and mark reference material as reference. Avoid distorted aspect ratios, placements that would be impossible or unpurchased in reality, and synthetic text inside generated images. +- **Icon Treatment**: Icons are largely absent. Use one only where it belongs to the work itself or marks a recurring channel class on production pages, never as ornament in the creative arc. Keep third-party marks out unless the relationship is real and permitted. + +## VII. Review Focus + +> Apply this section only after the user explicitly activates visual review. It never triggers that stage. + +- The idea is expressed in one line that can be repeated exactly after one reading. +- Each creative page shows one piece of work with nothing competing for attention. +- The deck's own visual voice defers to the work rather than framing or recoloring it. +- Typography inside executions remains legible at the scale it is shown. +- Environmental mockups keep honest scale, perspective, and placement. +- Finished proposals, developing routes, placeholder content, and borrowed reference remain visually distinguishable. +- Production, timing, and cost pages are plainly styled and clearly separated from the creative arc. +- Attribution and rights status are present wherever borrowed, licensed, or generated material appears. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/styles/incident-postmortem/templates/design_spec.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/styles/incident-postmortem/templates/design_spec.md new file mode 100644 index 00000000..b2a96f52 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/styles/incident-postmortem/templates/design_spec.md @@ -0,0 +1,91 @@ +--- +style_id: incident-postmortem +kind: style +summary: Blameless incident review method that reconstructs a timeline, separates contributing factors from blame, and commits to verifiable actions. +keywords: [postmortem, incident, reliability, root-cause, blameless] +--- + +# Incident Postmortem — Style Specification + +> Method and design defaults only. No project communication contract, brand identity, page structure, or SVG prototypes. + +## I. Style Overview + +| Property | Value | +|---|---| +| Style Name | Incident Postmortem | +| Best Fit | Production incident reviews, outage reports, quality and safety investigations, security event debriefs, and reliability retrospectives | +| Reusable Intent | Let an organization learn from a failure — what happened, what allowed it, and what will change — without the account bending toward defending anyone | +| Sources | Authored in-repo as a bundled reference Style, 2026-08-07; distilled from blameless-postmortem practice, not a single external document | + +## II. Communication Method + +- **Preferred Mode**: briefing +- **Argument Flow**: State what happened and what it cost, reconstruct the timeline from detection through recovery, examine what allowed the failure to occur and to persist undetected, then commit to changes that address those conditions. Facts before interpretation, and interpretation before action; depth follows severity rather than a fixed report template. +- **Page Message Discipline**: Give each page one fact, one factor, or one action, and title it with what it establishes. Keep every timeline entry with its timestamp, source, and time zone. Never mix the reconstruction of what happened with the judgment of what should have happened on the same page — the audience must be able to accept the facts before weighing the analysis. +- **Claim Discipline**: Keep observed event, inferred sequence, contributing factor, and hypothesis distinct at all times, and mark anything unconfirmed as unconfirmed. Describe what people knew and saw at each moment rather than what hindsight makes obvious, and attribute outcomes to conditions and systems rather than to individuals — name roles and systems, not people at fault. Report actual impact rather than the estimate that best protects the team, and never close a factor as resolved when the underlying condition remains. + +## III. Page Role Vocabulary + +| Role | Communication Job | Evidence Obligation | Composition Tendency | +|---|---|---|---| +| Incident summary | Give the whole event in one reading | State severity, duration, scope, and impact with the same numbers used everywhere else | One glanceable page; it will be quoted and forwarded on its own | +| Impact assessment | Establish what it actually cost | Quantify affected users, transactions, data, revenue, or safety exposure with measurement basis | Keep the measured impact dominant; state uncertainty rather than rounding to comfort | +| Timeline | Reconstruct what happened in order | Give timestamps with time zone and source for detection, escalation, mitigation, and recovery | Let chronology drive the composition; keep the detection and mitigation gaps visible | +| Detection and alerting | Show how and when it became known | State what alerted, what did not, and how long it took to reach someone who could act | Make the detection delay legible rather than folded into the timeline | +| Response and mitigation | Show what was done and what worked | Distinguish actions that helped, had no effect, or worsened the situation, with the information available at the time | Keep decision points visible with what was known at each | +| Contributing factors | Explain what allowed the failure | Give multiple factors — technical, procedural, and organizational — without collapsing to a single cause | Show how factors combined; resist a single-box root-cause diagram when reality was layered | +| Systemic condition | Identify what makes recurrence likely | Connect the incident to conditions that persist beyond it, including prior similar events | Keep the condition primary over the specific trigger that happened to fire | +| What went well | Preserve what should be protected | Name the controls, practices, and decisions that limited the damage | Give it real space; a review that only lists failures teaches the wrong lesson | +| Corrective action | Commit to verifiable change | Give owner, date, verification method, and the factor it addresses; distinguish prevention from detection from mitigation | Keep action, owner, and verification in direct correspondence | +| Open question | Preserve what remains unknown | State what could not be determined and what evidence would settle it | Keep unknowns visible rather than resolving them with plausible narrative | +| Supporting evidence | Hold the material the review rests on | Retain logs, graphs, configurations, and traces with timestamps and sources | High density; organized for verification rather than for reading in order | + +## IV. Evidence & Data Expression + +- **Argument Trace**: Every timeline entry traces to a log, alert, message, ticket, or human account with its source named. Every contributing factor traces to timeline evidence, and every action traces to a factor. Where the account depends on recollection rather than record, mark it as such. +- **Charts**: Use time-series charts aligned to the same clock and time zone as the timeline, with detection, escalation, mitigation, and recovery marked on the axis. Show enough pre-incident history to establish normal behavior, keep scales unbroken, and annotate what each deviation corresponds to. Never crop a window so the anomaly looks smaller or the recovery looks faster than it was. +- **Tables**: Use tables for the timeline, impact breakdown, and action commitments. Keep one row shape, give the timeline consistent timestamp precision and a stated time zone, and record each action with owner, date, verification, and the factor it addresses. Mark estimated impact figures explicitly. +- **Sources**: Attach system, query, and retrieval time to every log excerpt, metric, or graph. State the time zone once, prominently, and use it consistently. Distinguish automated record from human recollection, and note where evidence was lost, rotated, or unavailable. +- **Native Editability**: Prefer editable native tables for timeline and action commitments, since these are tracked and updated after the review closes. Keep monitoring graphs and log excerpts as captured evidence at original fidelity rather than redrawing them; a redrawn graph is no longer the record. + +## V. Visual System Defaults + +- **Preferred Visual Style**: swiss-minimal +- **Composition**: Build each page around one fact and keep the timeline's spatial direction consistent wherever it recurs. Fix a stable position for timestamp, event, and source so entries are compared by eye. Give the summary, systemic condition, and action pages room; let evidence pages carry density under one grid. +- **Density**: The document is read after the meeting by people who were not there, so pages must stand alone. Keep the summary and factor pages readable at a glance and let timeline and evidence pages hold real detail without hiding entries or truncating identifiers. +- **Decoration**: Effectively none. This is a factual record; visual restraint is part of its credibility. Use hairline rules, clear separation, and consistent marks only. Avoid alarm graphics, dramatic red gradients, warning ornament, and any device that adds emotional weight to a page that should carry evidence. +- **Color Behavior**: Keep a neutral field and reserve color for declared severity and state, with the mapping fixed across the document and consistent with the organization's existing severity scale where one exists. Always pair severity color with a label so it survives printing and color-vision differences. Never use color to signal fault or to emphasize a page rhetorically. Any confirmed Brand or Deck identity replaces these tendencies. +- **Typography Character**: Use a plain, neutral sans-serif with a genuinely monospaced companion for timestamps, identifiers, log excerpts, and commands. Keep timestamp precision and format identical throughout, keep log text unwrapped and legible, and derive hierarchy from weight and alignment rather than containers. Exact families remain current-project or resolved identity decisions. + +### Fallback Color Scheme + +| Role | HEX | Purpose | +|---|---|---| +| Field | #FFFFFF | Neutral ground for a factual record | +| Surface | #F2F4F6 | Grouped regions, timeline banding, and evidence blocks | +| Ink | #1F2933 | Primary text, timestamps, and rules | +| Normal | #4A5568 | Pre-incident baseline and unaffected state | +| Degraded | #B7791F | Partial impact, elevated risk, or detection gap | +| Critical | #B4342C | Full impact window and breached threshold | +| Recovered | #2E7D5B | Mitigation effective and service restored | + +## VI. Image & Icon Direction + +- **Preferred Image Rendering**: digital-dashboard +- **Image Usage**: Use images only as evidence — monitoring screens, alert states, error output, configuration, or physical conditions where relevant. Never insert conceptual or atmospheric imagery into an incident record. +- **Image Treatment**: Present captured evidence unaltered beyond cropping, with timestamps and axis labels left visible and legible at the rendered slide size. Redact only personal data or credentials, and mark every redaction. Caption with system, query, and time zone. Avoid full-bleed treatment and synthetic text inside generated images. +- **Icon Treatment**: Use icons sparingly, only to mark severity, state, or event class, with one coherent family and a fixed mapping. Never let an icon alone carry severity that must survive printing, and never use expressive or emotive icons in a factual record. + +## VII. Review Focus + +> Apply this section only after the user explicitly activates visual review. It never triggers that stage. + +- The document stands alone for a reader who was not in the room. +- Timestamps carry consistent precision and a stated time zone wherever they appear. +- Detection, escalation, mitigation, and recovery points are visible on both the timeline and any aligned chart. +- Observed fact, inference, and unconfirmed hypothesis remain distinguishable throughout. +- The account describes what responders knew at each moment rather than what hindsight makes obvious, and attributes outcomes to systems and conditions rather than to named individuals. +- Severity color matches its declared mapping and remains readable with its label in grayscale. +- Log excerpts, identifiers, and graph axes are legible and untruncated. +- Every corrective action shows owner, date, verification method, and the factor it addresses. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/styles/investor-pitch/templates/design_spec.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/styles/investor-pitch/templates/design_spec.md new file mode 100644 index 00000000..8fb82c8b --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/styles/investor-pitch/templates/design_spec.md @@ -0,0 +1,81 @@ +--- +style_id: investor-pitch +kind: style +summary: Fundraising narrative method that carries an investor from why now to why this team, on evidence rather than adjectives. +keywords: [fundraising, pitch, startup, traction, investor] +--- + +# Investor Pitch — Style Specification + +> Method and design defaults only. No project communication contract, brand identity, page structure, or SVG prototypes. + +## I. Style Overview + +| Property | Value | +|---|---| +| Style Name | Investor Pitch | +| Best Fit | Fundraising decks, investor meetings, demo days, partner and board pitches, and internal venture funding requests | +| Reusable Intent | Give an investor the shortest honest path to a decision — the opportunity, the evidence that it is being captured, and what the money buys — with every claim survivable in diligence | +| Sources | Authored in-repo as a bundled reference Style, 2026-08-07; distilled from fundraising-presentation practice, not a single external document | + +## II. Communication Method + +- **Preferred Mode**: narrative +- **Argument Flow**: Open on the change in the world that makes this possible now, name the problem it creates and who feels it, show the solution and the evidence that it is working, then widen to the market it can reach, how it makes money, who is building it, and what this round buys. Adapt weight to the stage: early rounds are carried by insight and team, later rounds by traction and unit economics. Never bury the thing that is actually strongest. +- **Page Message Discipline**: Give each page one claim and put the evidence for it in view. Write the title as the claim itself, not as a section label, so the deck reads correctly when forwarded without a presenter. Keep a metric and its definition on the same page, and never let one page carry two arguments an investor must weigh separately. +- **Claim Discipline**: Keep achieved, contracted, in-pipeline, and projected clearly and visually distinct, and never let a projection borrow the credibility of a result. Define every metric where it first appears and keep that definition fixed for the whole deck. State the basis for any market size and show the derivation, name the real competitors and where they win, and present the risks the team is taking on rather than a diligence-proof story with no exposure. A claim that would not survive diligence is removed, not softened. + +## III. Page Role Vocabulary + +| Role | Communication Job | Evidence Obligation | Composition Tendency | +|---|---|---|---| +| Why now | Establish the change that makes this newly possible | Point to a real shift — technology, regulation, cost curve, behavior — with evidence | One dominant statement or figure; this page sets the frame for everything after | +| Problem | Make the pain specific and expensive | Quantify who suffers it and what it costs them today; name the current workaround | Keep one concrete situation dominant rather than a category description | +| Solution | Show what was built and why it resolves the problem | Show the actual product or mechanism, not a description of intent | Let the artifact hold the page; keep explanation to one line | +| Product evidence | Prove it exists and works | Show real interface, output, or deployment; disclose anything staged | Full-frame artifact with minimal chrome around it | +| Traction | Establish that the market is responding | Show the honest curve with its axis definitions and cohort basis, not a cropped window | Let the trend dominate and mark the inflection with its cause | +| Business model | Explain how value converts to revenue | State pricing, unit economics, and payback with the assumptions they rest on | Keep one revenue mechanism primary; show the arithmetic rather than asserting margin | +| Market opportunity | Size the reachable prize | Derive bottom-up from customers and price; state assumptions and reachable share | Show the derivation, not a nested set of large circles | +| Competition | Position honestly against real alternatives | Include the incumbent and the status quo; state where alternatives genuinely win | Compare on axes that actually decide purchases, never on a self-serving two-axis frame | +| Go-to-market | Show how customers are reached repeatedly | Give channel evidence with cost and conversion where known | Keep the repeatable motion primary over a list of untested channels | +| Team | Establish why these people win this | Give specific relevant history and the earned insight, not title inflation | A few people at real prominence; avoid logo walls standing in for experience | +| Financials and plan | Show the trajectory and what drives it | Tie projections to named drivers and current rates; keep assumptions visible | Keep the driver arithmetic legible rather than presenting a polished output | +| The ask | State what is being raised and what it buys | Give amount, use of funds, milestones it reaches, and resulting runway | One page, unmistakable; never leave the ask implied | +| Diligence appendix | Hold the detail a serious investor asks for | Retain cohorts, definitions, contracts, pipeline, and methodology | High density, organized for retrieval during questions | + +## IV. Evidence & Data Expression + +- **Argument Trace**: Every claim traces to something verifiable in diligence — a measured metric with its definition, a signed contract, a working product, a named customer, or a cited source. Anything that traces to none of these is cut. Where evidence is thin, the deck says which claims are still hypothesis rather than presenting them at equal confidence. +- **Charts**: Show the full available history rather than the flattering window, keep axes unbroken and starting at zero for magnitude claims, label the metric definition on the chart, and mark where a definition or scope changed. Distinguish actual from projected visually within any series that carries both. Never present a cumulative curve where the periodic rate is what matters, and never let chart choice hide a decline. +- **Tables**: Use tables for cohorts, unit economics, pricing, and use of funds. Keep one row shape, show the arithmetic that produces derived figures, state period and currency, and mark estimated or unaudited entries explicitly. +- **Sources**: Attribute market data, benchmarks, and third-party figures with source and date on the page where they appear. Give internal metrics their definition, measurement period, and system of record. Name a customer only with permission, and label pilots, letters of intent, and pipeline as what they are rather than as revenue. +- **Native Editability**: Prefer editable native charts and tables for traction, cohort, and financial data — these numbers change between meetings and must be refreshable without rebuilding the page. Keep product screenshots and deployment photographs as images. + +## V. Visual System Defaults + +- **Preferred Visual Style**: dark-tech +- **Composition**: One claim per page with one dominant element carrying it. Fix a consistent position for the claim line so a reader scanning the forwarded deck moves quickly. Reserve full-frame treatment for product and traction pages, and keep the ask and team pages simple enough to be absorbed in seconds. +- **Density**: Sparse in the main arc, dense only in the appendix. A pitch page should be readable in the time an investor gives it — a few seconds on a screen, not a study session. Move every supporting detail behind the appendix boundary rather than compressing it into the narrative. +- **Decoration**: Restrained. Let product imagery, one strong number per page, and typography carry the deck. Avoid gradient meshes, glow, floating three-dimensional devices, stock-photo collages, and the ornamental infographic vocabulary that signals effort rather than substance. The default field is dark and modern; open it to a lighter, warmer register when the venture is consumer or lifestyle rather than technical. +- **Color Behavior**: Commit to a small range with one accent reserved for evidence — the traction curve, the decisive number, the ask. Keep that accent rare so it stays a signal, and never use a semantic status color decoratively. Ensure any color that distinguishes actual from projected also differs in shape or texture. Any confirmed Brand or Deck identity replaces these tendencies. +- **Typography Character**: Use a confident modern sans-serif with a large statement scale for claims and numbers, tabular figures wherever metrics align in columns, and a quiet scale for definitions and attribution. Keep number formatting, currency, and period notation identical throughout. Exact families remain current-project or resolved identity decisions. + +## VI. Image & Icon Direction + +- **Preferred Image Rendering**: corporate-photo +- **Image Usage**: Lead with real artifacts — the product in use, actual deployments, genuine customers, the team. Use market or context imagery only at the opening beat. Never use stock imagery of anonymous professionals or abstract technology to fill a page that lacks evidence. +- **Image Treatment**: Crop product captures to what carries the claim and keep their text legible on a laptop screen, since most reading happens there rather than in the room. Apply consistent framing across the deck, use a real scrim where text sits over an image, and caption what to notice. Avoid mockups implying capabilities that do not exist, distorted aspect ratios, and synthetic text inside generated images. +- **Icon Treatment**: Use one coherent icon family at consistent weight, only to mark a recurring class such as channel, segment, or milestone. Avoid customer and investor logo walls used as evidence without context, icon rows substituting for a feature list, and mixed icon languages on one page. + +## VII. Review Focus + +> Apply this section only after the user explicitly activates visual review. It never triggers that stage. + +- Each page's claim is identifiable without a presenter, since the deck will be forwarded. +- Achieved, contracted, pipeline, and projected values remain visually distinct wherever they appear together. +- Traction charts show the full available history with unbroken axes and a stated metric definition. +- Every metric carries its definition and measurement period on the page where it appears. +- Market sizing shows its derivation rather than asserting a total. +- Product imagery and its embedded text remain legible on a laptop screen. +- The ask states amount, use of funds, and the milestones it reaches, on one unmistakable page. +- Appendix density does not leak into the narrative arc. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/styles/narrative-keynote/templates/design_spec.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/styles/narrative-keynote/templates/design_spec.md new file mode 100644 index 00000000..72fcff72 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/styles/narrative-keynote/templates/design_spec.md @@ -0,0 +1,78 @@ +--- +style_id: narrative-keynote +kind: style +summary: Story-driven keynote method that earns one idea through tension, turn, and concrete human detail. +keywords: [keynote, storytelling, narrative, persuasion, talk] +--- + +# Narrative Keynote — Style Specification + +> Method and design defaults only. No project communication contract, brand identity, page structure, or SVG prototypes. + +## I. Style Overview + +| Property | Value | +|---|---| +| Style Name | Narrative Keynote | +| Best Fit | Conference keynotes, vision talks, thought-leadership sessions, culture and change communication, and any spoken talk where slides support a speaker rather than stand alone | +| Reusable Intent | Carry one idea from tension to conviction so an audience remembers it a week later, with slides that reinforce the speaker instead of competing with them | +| Sources | Authored in-repo as a bundled reference Style, 2026-08-07; distilled from spoken-keynote practice, not a single external document | + +## II. Communication Method + +- **Preferred Mode**: narrative +- **Argument Flow**: Establish a world the audience recognizes, disturb it with a tension they feel, follow the turn where understanding changes, and land on what it now demands of them. Let each beat create the need for the next; length follows dramatic weight, not section symmetry. One idea governs the whole talk, and every beat either builds it or is cut. +- **Page Message Discipline**: Give each page one beat and let it hold a single dominant element — an image, a statement, a number, or a moment. The slide reinforces what the speaker is saying at that instant; it never carries the script. Never split one beat across pages the audience must reassemble, and never leave a page on screen after its beat has passed. +- **Claim Discipline**: Keep observed fact, interpretation, and conviction distinguishable in wording, and never let narrative momentum promote a belief into a fact. Ground anecdotes in real specifics and mark composites or illustrations as such; attribute every number and quotation, and let a counter-example stand rather than trimming the story around it. + +## III. Page Role Vocabulary + +| Role | Communication Job | Evidence Obligation | Composition Tendency | +|---|---|---|---| +| Opening image | Put the audience somewhere before explaining anything | Use a real, specific situation rather than a generic scene | One dominant visual with no competing text; let the speaker fill the silence | +| Recognized world | Establish the shared reality the talk will disturb | Describe conditions the audience can verify from their own experience | Keep the page calm and uncrowded so the coming tension registers | +| Tension | Make the problem felt rather than described | Show the cost, contradiction, or loss in concrete terms and real scale | Give the tension the full frame; avoid softening it with supporting detail | +| Evidence beat | Prove the tension is real and general, not anecdotal | Attribute data with source, scope, and period; one number, not a dashboard | Let one figure dominate and annotate its meaning in a single line | +| Human detail | Make an abstraction land through one specific person or moment | Keep the detail true; mark any composite or illustrative case | Favor a single image or quotation over narrated summary | +| Turn | Deliver the shift in understanding the talk exists for | Show what changed and why it holds, not merely that it is appealing | The most restrained page of the talk; one statement, maximum space | +| Reframe | Show the familiar world as it looks after the turn | Revisit the earlier situation using the same terms it was introduced with | Mirror an earlier page's composition so the change is felt, not explained | +| Implication | Say what follows for the people in the room | Connect the idea to a decision or behavior they actually control | Keep one consequence dominant; resist a bulleted list of applications | +| Closing charge | Leave the audience with what to carry out of the room | State one action or commitment, honest about its difficulty | End on a single line or image; do not summarize the talk you just gave | +| Reference and attribution | Give sources and further material without breaking the talk | Retain full citation for every figure, image, and quotation used | Place after the closing beat, dense and quiet, never inside the narrative | + +## IV. Evidence & Data Expression + +- **Argument Trace**: Every beat serves the one governing idea and traces to something real — an observation, an attributed figure, a documented case, or a named experience. A beat that only feels good is cut. Conviction is stated as conviction, never dressed as evidence. +- **Charts**: Show one relationship per page, at statement scale, with the meaning annotated directly on the mark. Strip legends, gridlines, and axis furniture down to what the point requires, but keep units, period, and source visible. Never truncate an axis, omit a baseline, or select a window to make a movement look larger than it is; a keynote's freedom is in emphasis, not in distortion. +- **Tables**: Tables rarely belong in a spoken keynote. Use one only when a small structured comparison is the beat itself, keep it to a few rows readable from the back of the room, and move anything larger to reference material. +- **Sources**: Attribute figures, quotations, images, and cases where they appear, quietly and legibly, with fuller citation in the reference beat. Keep quotations intact rather than trimmed toward a stronger reading, and name any composite or reconstructed account. +- **Native Editability**: Prefer editable native charts for the few figures a keynote carries, so they can be corrected close to the event. Keep photographic and atmospheric material as images; do not rebuild a photograph as approximate shapes to satisfy editability. + +## V. Visual System Defaults + +- **Preferred Visual Style**: editorial +- **Composition**: Give each page one dominant element and let the rest of the frame stay empty. Use asymmetry and generous margins deliberately; a keynote page is composed, not filled. Vary composition across beats so rhythm carries the arc, and reserve the most extreme restraint for the turn. +- **Density**: Radically sparse. A page carries a few words, one image, or one number — readable in the two seconds before the audience returns to the speaker. Density belongs only in the reference beat after the talk ends. +- **Decoration**: Almost none. Let scale, space, image, and typography do the work. Any recurring device — a rule, a mark, a corner treatment — appears consistently or not at all. Avoid template chrome, persistent footers, page numbers, progress bars, and transitional ornament that reminds the audience they are watching slides. +- **Color Behavior**: Commit to a small, deliberate range and use it with intent across the arc — a field that can darken through the tension and open at the turn. Reserve one accent for the moments that matter most, and let it appear rarely enough to stay a signal. Any confirmed Brand or Deck identity replaces these tendencies. +- **Typography Character**: Use a strong editorial hierarchy with a genuine statement scale — few words set large, well-tracked, and generously leaded — against a quiet scale for attribution. Line breaks are authored for spoken rhythm, not left to wrapping. Keep the voice consistent across beats. Exact families remain current-project or resolved identity decisions. + +## VI. Image & Icon Direction + +- **Preferred Image Rendering**: editorial +- **Image Usage**: Imagery is a primary carrier here, not decoration. Use it to place the audience somewhere, to make an abstraction concrete, or to give a beat emotional weight. Prefer one strong image over several adequate ones, and never fill a beat with a generic stock scene because the page felt empty. +- **Image Treatment**: Compose full-bleed or generously framed, cropped for one subject and one emotional register. When text sits over an image, use a real scrim or a genuinely quiet region rather than trusting luck. Keep treatment consistent so images read as one body of work, retain caption and credit where the image is evidence, and avoid synthetic text inside generated images. +- **Icon Treatment**: Icons are largely absent from this style. Use one only when a single symbol carries a beat, at statement scale rather than as a bullet ornament. Never use an icon row as a substitute for a list, and never mix icon languages within one talk. + +## VII. Review Focus + +> Apply this section only after the user explicitly activates visual review. It never triggers that stage. + +- Each page carries one beat and reads in about two seconds at room scale. +- No page functions as the speaker's script or competes with what is being said. +- Statement text is legible from the back of a room and its line breaks follow spoken rhythm. +- Text over imagery holds contrast through a real scrim or quiet region, not by chance. +- Imagery reads as one coherent body of work rather than assorted stock. +- The accent color stays rare enough to remain a signal at the beats that matter. +- Figures keep their source, scope, and period; no axis is truncated and no baseline is omitted. +- The reference beat sits after the closing page and never interrupts the arc. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/styles/operating-review/templates/design_spec.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/styles/operating-review/templates/design_spec.md new file mode 100644 index 00000000..17586f93 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/styles/operating-review/templates/design_spec.md @@ -0,0 +1,91 @@ +--- +style_id: operating-review +kind: style +summary: Recurring business-review method that separates result, variance, cause, and owned commitment without softening bad numbers. +keywords: [business-review, metrics, variance, operations, accountability] +--- + +# Operating Review — Style Specification + +> Method and design defaults only. No project communication contract, brand identity, page structure, or SVG prototypes. + +## I. Style Overview + +| Property | Value | +|---|---| +| Style Name | Operating Review | +| Best Fit | Monthly and quarterly business reviews, operational performance readouts, program status reviews, and recurring metric reporting to an accountable audience | +| Reusable Intent | Let an audience that already knows the business see what happened, why it differs from plan, and what the owner will do — in the same shape every period, so periods can be compared | +| Sources | Authored in-repo as a bundled reference Style, 2026-08-07; distilled from operating-cadence reporting practice, not a single external document | + +## II. Communication Method + +- **Preferred Mode**: custom +- **Mode References**: briefing, pyramid +- **Mode Behavior**: Open at the level of a briefing — the period's results stated plainly, without preamble or rediscovery of context the audience already holds. Then resolve every material variance the way a pyramid resolves a question: the deviation, the cause that explains most of it, the evidence for that cause, and the committed response. Depth follows materiality, not agenda symmetry: a metric on plan gets a line, a metric off plan gets the full chain. Keep the page shape stable across periods so a returning audience compares rather than re-orients. +- **Argument Flow**: Report the period against plan, isolate what materially deviated, explain each deviation by cause rather than by narrative, and close every explanation with an owned action and a date. Cover on-plan areas briefly and spend the review on what changed; never let the sequence of business units substitute for the sequence of what matters. +- **Page Message Discipline**: For every page, state the result and its direction against plan in the title or an equally dominant line, and put the number that establishes it in view. Keep a metric, its variance, and its explanation on the same page. Never title a page with a metric name alone when the page exists because that metric moved. +- **Claim Discipline**: Keep actual, plan, forecast, and prior-period values explicitly labeled and never interchangeable. Separate what happened from why it happened and from what will be done; attribute a cause only with evidence and say "cause not yet established" when it is not. Report misses in the same voice and prominence as beats, and never restate a target retroactively to convert a miss into a hit. + +## III. Page Role Vocabulary + +| Role | Communication Job | Evidence Obligation | Composition Tendency | +|---|---|---|---| +| Period scorecard | Show the whole period's standing at once | Give actual, plan, and variance for each headline metric with consistent units and period | Keep one glanceable field where status reads before any number is examined | +| Result against plan | Establish what a metric actually did | State value, plan, variance, and comparison basis; keep the definition identical to prior periods | Make the variance, not the raw value, the visually dominant fact | +| Trend and trajectory | Show whether the movement is direction or noise | Show enough history to judge normal variation; mark definition or scope changes on the series | Let the series carry the page and annotate only the decision-relevant point | +| Variance driver | Explain what accounts for the deviation | Decompose into drivers that sum honestly to the total; leave a named residual rather than forcing closure | Make the dominant driver visually primary and keep the decomposition auditable | +| Segment breakdown | Locate where the result is concentrated | Use consistent segment definitions across periods; disclose reclassification | Order by contribution and keep small segments visible rather than lumped without note | +| Exception and watch item | Surface what is off track or newly at risk | Pair each item with threshold, trigger, exposure, and owner | Keep exceptions in one predictable place; never scatter them into good news | +| Corrective action | State what will be done about the gap | Tie each action to a specific variance, an owner, a date, and an expected effect | Keep action, owner, and date in direct visual correspondence | +| Prior commitment status | Close the loop on what was promised last period | Report each prior action as done, in progress, or missed, with the same wording as when committed | Make the status verdict readable before the explanation | +| Forecast and assumption | State where the period ends up and on what basis | Name the assumptions the forecast depends on and what would invalidate them | Keep the assumption visible beside the number it produces | +| Supporting detail | Preserve the depth needed to interrogate a number | Retain definition, method, source system, period, and known data quality limits | Allow high density while keeping the number-to-source path traceable | + +## IV. Evidence & Data Expression + +- **Argument Trace**: Every stated result traces to a defined metric and source system, every explanation traces to evidence, and every action traces to the variance it addresses. Where a cause is asserted without evidence, label it as hypothesis; where data is incomplete, show the gap rather than the estimate alone. +- **Charts**: Choose the chart from the operating question: trend for direction, waterfall for variance decomposition, comparison for segments, distribution when averages conceal. Keep axis scale, period window, and metric definition identical to prior periods, show the plan or threshold line wherever variance is the point, and annotate the driver directly on the mark. Never truncate an axis to dramatize a movement, and never change scale between periods without saying so. +- **Tables**: Build the scorecard as a table with a fixed column contract — actual, plan, variance, prior period — and one row shape. Keep units, signs, and rounding consistent, mark restated or reclassified rows explicitly, and encode status in a declared, legible way rather than color alone. Avoid tables that hide the variance behind raw values. +- **Sources**: Attach metric definition, source system, extraction date, and period to the data it produces, and keep them stable across periods. Label estimates, preliminary figures, and anything subject to restatement, and note any definition change at the point of first appearance. +- **Native Editability**: Prefer editable native charts and tables for scorecards, trends, and variance data. Recurring reviews are refreshed rather than rebuilt, so keep the numbers and their structure editable in place instead of pasting a flattened image of a dashboard. + +## V. Visual System Defaults + +- **Preferred Visual Style**: data-journalism +- **Composition**: Build every page around the metric-to-variance-to-action relationship, and keep that arrangement identical across periods. Fix a stable position for the status region, the number region, and the commentary region so a returning audience reads by position. Give the scorecard one dominant field and let detail pages inherit its ordering. +- **Density**: Support genuinely dense operating data through disciplined alignment, consistent number formatting, and whitespace that separates result from explanation. Let the scorecard and the exception page breathe; let supporting detail tighten under one grid without dropping below readable scale or hiding rows. +- **Decoration**: Use flat planes, hairline rules, and restrained status marks. Every visual device earns its place by encoding status, grouping, or comparison. Avoid gauge ornaments, gradient KPI cards, glow, oversized arrows, and decorative dashboard chrome that mimics a product interface without carrying data. +- **Color Behavior**: Keep a neutral field and reserve color for declared status — on plan, watch, off plan — plus one accent for the metric under discussion. Fix the status mapping for the whole deck and every future period, and never apply a status color decoratively or to signal emphasis. Always pair status color with a shape, label, or position so it survives grayscale printing and color-vision differences. Any confirmed Brand or Deck identity replaces these tendencies. +- **Typography Character**: Use a compact, neutral sans-serif with genuinely tabular figures so columns of numbers align and periods compare by eye. Keep number formatting, sign convention, and unit placement identical throughout, keep commentary economical, and derive hierarchy from weight and alignment rather than containers. Exact families remain current-project or resolved identity decisions. + +### Fallback Color Scheme + +| Role | HEX | Purpose | +|---|---|---| +| Field | #FFFFFF | Neutral ground for dense reporting pages | +| Surface | #F4F6F8 | Grouped regions, table banding, and scorecard cells | +| Ink | #1E293B | Primary text, headline numbers, and rules | +| On plan | #2E7D5B | Metric meeting or exceeding its declared threshold | +| Watch | #B7791F | Metric within tolerance but trending toward a breach | +| Off plan | #B4342C | Metric breaching its declared threshold | +| Focus | #2B6CB0 | The metric or driver currently under discussion | + +## VI. Image & Icon Direction + +- **Preferred Image Rendering**: digital-dashboard +- **Image Usage**: Operating reviews are data documents; use imagery only where it is itself evidence — a site condition, a physical defect, a customer artifact, or a screen whose state is the finding. Never insert stock or atmospheric imagery to soften a bad period or fill a sparse page. +- **Image Treatment**: Crop to the evidentiary subject, keep any embedded numbers or interface text legible at the rendered slide size, and caption with date, location, and source. Present evidence images unretouched beyond cropping and exposure. Avoid decorative full-bleed treatment and synthetic text inside generated images. +- **Icon Treatment**: Use one coherent icon family at consistent weight, and only to mark status, direction, or a recurring item class. Keep each mapping fixed across periods and never let an icon alone carry a status that must survive printing. Avoid decorative icon grids, mixed icon languages, and directional icons whose meaning inverts between metrics where lower is better. + +## VII. Review Focus + +> Apply this section only after the user explicitly activates visual review. It never triggers that stage. + +- Each page's result and its direction against plan are identifiable at the rendered slide size. +- Actual, plan, forecast, and prior-period values remain explicitly labeled and never visually interchangeable. +- Variance, not raw value, is the dominant fact wherever the page exists because something moved. +- Status color is consistent with its declared mapping and remains readable in grayscale and for color-vision differences. +- Axis scales, period windows, and metric definitions match prior periods, or the change is marked on the page. +- Numbers align in tabular columns with consistent units, signs, and rounding. +- Every corrective action shows its owner and date; misses are as prominent as beats. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/styles/product-launch/templates/design_spec.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/styles/product-launch/templates/design_spec.md new file mode 100644 index 00000000..42adaa52 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/styles/product-launch/templates/design_spec.md @@ -0,0 +1,76 @@ +--- +style_id: product-launch +kind: style +summary: Value-first launch method where every capability claim is earned by a demonstrable moment before it is named. +keywords: [product, launch, positioning, demo, capability] +--- + +# Product Launch — Style Specification + +> Method and design defaults only. No project communication contract, brand identity, page structure, or SVG prototypes. + +## I. Style Overview + +| Property | Value | +|---|---| +| Style Name | Product Launch | +| Best Fit | Product and feature launches, release keynotes, capability announcements, roadmap reveals, and customer-facing product briefings | +| Reusable Intent | Make an audience feel the problem, see the capability work, and leave knowing what changed for them and what to do next | +| Sources | Authored in-repo as a bundled reference Style, 2026-08-07; distilled from launch-presentation practice, not a single external document | + +## II. Communication Method + +- **Preferred Mode**: showcase +- **Argument Flow**: Open on the tension the audience already lives with, show the capability resolving it, then widen to what it makes possible and what to do next. Earn each claim with a visible demonstration before naming it; adapt the number and order of capability beats to what actually shipped rather than filling a fixed reveal template. +- **Page Message Discipline**: Give each page one capability, one benefit, or one moment. Write the title as what the audience gets, not as a feature name, and let the demonstration occupy the page rather than a bulleted description of it. Never combine two reveals on one page to save space. +- **Claim Discipline**: Keep shipped, in-preview, and planned capabilities visibly distinct, and never let a roadmap item borrow the certainty of a demo. Attribute performance and outcome numbers to their measurement or customer, mark selected or representative results as such, and pair any comparison with its basis and date. + +## III. Page Role Vocabulary + +| Role | Communication Job | Evidence Obligation | Composition Tendency | +|---|---|---|---| +| Opening tension | Make the audience recognize the problem as theirs | Ground the problem in observed behavior, cost, or a real workflow, not a caricature | Lead with one concrete situation and keep the page uncrowded | +| Positioning claim | State what this is and who it changes things for | Say what it replaces or removes; avoid category words that fit anything | Give the claim the page and let one supporting line qualify it | +| Capability reveal | Introduce one capability by showing it | Show the actual behavior — interface, output, or result — not an icon standing in for it | Let the artifact dominate; keep naming and explanation subordinate | +| Demonstration moment | Let the audience watch it work | Use a real path with real input and honest timing; disclose any acceleration or staging | Give the demo the full frame with minimal chrome around it | +| Before and after | Make the improvement felt rather than asserted | Keep both sides comparable in task, scale, and conditions | Place the two states in direct correspondence and mark the difference once | +| Proof point | Establish that the improvement holds outside the demo | Attribute metrics, customer results, or benchmarks with scope, period, and method | Keep one number or one quote dominant instead of a wall of validation | +| Capability landscape | Show how the pieces fit for someone adopting several | Represent only shipped relationships; mark preview and planned parts | Favor a clear arrangement over an exhaustive feature inventory | +| Availability and access | Answer when, where, how much, and for whom | State regions, tiers, limits, and preview conditions precisely | Keep terms scannable and never bury a material limitation in fine print | +| Next step | Convert interest into a first action | Give a concrete, reachable action with its prerequisite | End on a single dominant action rather than a menu | + +## IV. Evidence & Data Expression + +- **Argument Trace**: Every capability claim traces to something the audience can see now or verify later — a demonstration, an attributed metric, a customer result, or documentation. Claims that trace to none of these are cut rather than softened with confident wording. +- **Charts**: Use a chart only when a number is the point. Show one comparison per chart, start value axes at zero for magnitude claims, keep units and period visible, and annotate the improvement directly instead of leaving the audience to compute it. Never crop an axis, omit a baseline, or select a window to make a difference look larger than it is. +- **Tables**: Reserve tables for availability, tiers, limits, and capability matrices. Keep rows comparable, state units and constraints in the header, and mark preview or planned entries explicitly. Avoid competitor comparison tables that omit the axes on which the alternative wins. +- **Sources**: Attach measurement basis, scope, period, and version to every performance or outcome claim, close to where it appears. Name the customer only with permission and keep quotes intact rather than trimmed toward a stronger reading. +- **Native Editability**: Prefer editable native charts and tables for benchmark, pricing, and availability data so figures can be corrected before or after the event. Keep product screenshots and captured interface states as images; do not recreate a real interface as approximate shapes and present it as what the product shows. + +## V. Visual System Defaults + +- **Preferred Visual Style**: photo-editorial +- **Composition**: Build the page around the artifact — screen, output, or result — and let the message sit in its own quiet region rather than competing with it. Use generous single-focus pages for reveals and reserve multi-region composition for landscape and availability pages. Maintain a consistent position for the recurring message region so attention returns to the same place. +- **Density**: Keep reveal and demonstration pages sparse enough that the artifact reads instantly at room scale. Allow density only on landscape, availability, and specification pages, and keep even those scannable in a glance from the back of a room. +- **Decoration**: Let the product imagery and typography carry the page. Use restrained framing, device or window treatment applied consistently, and a single accent for emphasis. Avoid stacked drop shadows, glow, gradient meshes, floating decorative particles, and badge clutter that competes with the artifact. +- **Color Behavior**: Keep the field neutral or dark so product imagery holds the eye, and reserve one accent for the reveal, the improvement, and the closing action. Do not recolor product screenshots to match the deck, and do not use a semantic status color decoratively. Any confirmed Brand or Deck identity replaces these tendencies. +- **Typography Character**: Use a confident sans-serif hierarchy with a large, well-spaced statement scale for reveals and a quiet, economical scale for terms and attribution. Let scale contrast — not ornament — signal what matters, and keep the statement voice consistent across pages. Exact families remain current-project or resolved identity decisions. + +## VI. Image & Icon Direction + +- **Preferred Image Rendering**: corporate-photo +- **Image Usage**: Lead with real artifacts — interface captures, outputs, hardware, or people genuinely using the product. Use atmospheric or conceptual imagery only for opening and transition beats, never as a substitute for showing the capability. +- **Image Treatment**: Crop screenshots to the region that carries the reveal and keep their text legible at room scale, magnifying a detail instead of shrinking the whole window. Apply consistent framing and corner treatment, use a scrim only where text must sit over an image, and caption what to notice. Avoid distorted aspect ratios, mockups implying capabilities that do not exist, and synthetic text inside generated images. +- **Icon Treatment**: Use one coherent icon family at consistent weight, only to mark recurring capability classes, platforms, or states. Keep an icon's meaning fixed across the deck. Avoid icon grids used as a feature list, third-party logos as decoration, and mixed icon languages on one page. + +## VII. Review Focus + +> Apply this section only after the user explicitly activates visual review. It never triggers that stage. + +- Each reveal page communicates one capability and its benefit at the rendered slide size. +- Product screenshots and their embedded text remain legible at room scale rather than only on a laptop. +- Shipped, preview, and planned capabilities remain visually distinguishable wherever they appear together. +- Numbers carry their basis, scope, and period; axes are not cropped and baselines are not omitted. +- Availability terms, limits, and conditions are readable and not reduced to unreadable fine print. +- The accent color marks emphasis consistently and does not compete with product imagery. +- The closing page presents one concrete action rather than a menu of possibilities. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/styles/science-explainer/templates/design_spec.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/styles/science-explainer/templates/design_spec.md new file mode 100644 index 00000000..e13ddf46 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/styles/science-explainer/templates/design_spec.md @@ -0,0 +1,79 @@ +--- +style_id: science-explainer +kind: style +summary: Public-explanation method that builds understanding from familiar ground through visual analogy, without trading accuracy for accessibility. +keywords: [explainer, science-communication, popular, analogy, public] +--- + +# Science Explainer — Style Specification + +> Method and design defaults only. No project communication contract, brand identity, page structure, or SVG prototypes. + +## I. Style Overview + +| Property | Value | +|---|---| +| Style Name | Science Explainer | +| Best Fit | Public lectures, museum and outreach talks, popular-science and technology explainers, journalist and policy briefings, and internal cross-discipline explanations | +| Reusable Intent | Take an audience with no background from curiosity to genuine understanding of one idea, leaving them able to explain it themselves and knowing what remains uncertain | +| Sources | Authored in-repo as a bundled reference Style, 2026-08-07; distilled from science-communication practice, not a single external document | + +## II. Communication Method + +- **Preferred Mode**: instructional +- **Argument Flow**: Start from something the audience already knows or has felt, introduce the puzzle that familiar ground cannot explain, build the new idea one necessary step at a time, then return to the opening ground and show it differently. Every step earns the next; nothing is introduced because the field's own curriculum introduces it there. Prefer one idea understood deeply over five mentioned. +- **Page Message Discipline**: Give each page one step in the build, and title it in plain language as the idea rather than its technical name. Introduce a term only after the audience has met the thing it names, and keep the term with its plain-language meaning on the page where it first appears. Keep a visual and the idea it carries together; a diagram that needs the previous page has broken the build. +- **Claim Discipline**: Keep established consensus, active debate, and speculation distinct, and say which is which in plain words rather than through hedging that a lay audience cannot decode. Mark every analogy as an analogy and say where it stops being true before the audience finds the edge themselves. Simplify by omitting detail, never by stating something false; when a simplification would mislead, say the real thing is more complicated and name the direction of the difference. Give scale and uncertainty in terms the audience can feel, and never overstate certainty to make a cleaner story. + +## III. Page Role Vocabulary + +| Role | Communication Job | Evidence Obligation | Composition Tendency | +|---|---|---|---| +| Familiar ground | Start where the audience already stands | Use an experience the audience genuinely shares, not one assumed of them | One concrete image or situation; no terminology yet | +| The puzzle | Create the question the explanation answers | Show why the familiar understanding fails here; make the gap felt | Keep the tension dominant and unresolved on this page | +| Building block | Introduce one necessary piece | Give only what the next step requires; connect it to what is already held | One idea, one visual, minimal text | +| Visual analogy | Make an abstraction graspable | State what the analogy maps to and where it breaks down | Let the analogy image dominate with its limit noted plainly nearby | +| Mechanism | Show how it actually works | Follow one concrete path; keep the sequence honest even when simplified | Sequence drives the composition; each step's state stays visible | +| Scale and magnitude | Make a number mean something | Anchor to a comparison the audience can feel; keep the arithmetic honest | One comparison per page; resist stacking multiple scale tricks | +| Evidence | Show how we know rather than asking for trust | Give the observation, experiment, or measurement in plain terms, with its source | Keep the evidence and what it establishes side by side | +| Common misconception | Correct what the audience likely believes | State the misconception plainly, then what is actually true and why the error is natural | Place the two accounts in direct correspondence; never mock the misconception | +| Edge of knowledge | Show where certainty ends | Distinguish what is settled from what is actively debated and what is unknown | Give uncertainty its own space rather than a closing hedge | +| Why it matters | Connect the idea to the audience's world | Tie to a real consequence or decision, without inflating stakes | One consequence, concretely stated | +| Going further | Point the curious onward | Give real, reachable sources at the audience's level | Quiet and simple; the talk has already landed | + +## IV. Evidence & Data Expression + +- **Argument Trace**: Every claim traces to evidence the audience could in principle check, described in plain terms. Where the explanation rests on expert consensus rather than something showable, say so directly instead of implying the audience has just seen it demonstrated. +- **Charts**: Build a chart in stages rather than revealing it complete, explain the axes before the data, and label directly on the mark so no legend lookup is required. Use one relationship per chart and annotate what to read from it in plain words. Keep axes honest and unbroken, avoid log scales unless they are explained, and never assume familiarity with a conventional plot type the field takes for granted. +- **Tables**: Tables rarely help a lay audience. Use one only for a small, concrete comparison of a few items on a few axes, and keep every heading in plain language rather than field notation. +- **Sources**: Cite in a form the audience can actually follow up — the study, the mission, the institution — with the date, at the point of the claim. Name where a figure is an estimate or a range, and say plainly when sources disagree. +- **Native Editability**: Prefer editable native charts for the few figures the talk carries, so labels can be rewritten in plain language and built up in stages. Keep photographic evidence and instrument imagery at original fidelity; where a research figure is the evidence, present it with its labels translated alongside rather than silently redrawn. Producing publication figures is outside this style's scope. + +## V. Visual System Defaults + +- **Preferred Visual Style**: paper-cut +- **Composition**: Build each page around one visual carrying one idea, with generous space and a clear entry point. Keep a consistent spatial arrangement for anything that recurs across the build so the audience recognizes rather than re-reads it. Let elements accumulate across pages in a stable position so the growing picture stays coherent. +- **Density**: Very light. A page should be understood in seconds by someone hearing this for the first time. Never place two new ideas on one page, and never fall back to bullet text where a visual is doing the explaining. Depth belongs in what the speaker says, not in what the page holds. +- **Decoration**: Warm and inviting, but every element carries meaning: layers separate concepts, arrows show direction, size shows magnitude. Avoid decorative scientific ornament — floating molecules, glowing brains, circuit-board backgrounds, generic laboratory imagery — that signals a topic without explaining anything. +- **Color Behavior**: Keep a light, approachable field and assign color a consistent explanatory job — this substance, this force, this stage — fixed for the whole talk so a returning element is recognized instantly. Keep categories distinguishable for color-vision differences and never encode a required distinction in color alone. Where a field has an established convention, follow it rather than inventing a new mapping. Any confirmed Brand or Deck identity replaces these tendencies. +- **Typography Character**: Use a warm, highly legible sans-serif at generous size, set in plain-language sentences rather than compressed notation. Keep technical terms visually marked when first introduced and consistently styled afterward, and keep mathematical or chemical notation properly rendered and large enough to read from the back of a hall. Exact families remain current-project or resolved identity decisions. + +## VI. Image & Icon Direction + +- **Preferred Image Rendering**: vector-illustration +- **Image Usage**: Imagery carries the explanation here. Use authored illustration and diagram where a mechanism must be understood, and real photography where seeing the actual thing — the organism, the instrument, the site, the phenomenon — is what makes it real. Never use decorative science stock imagery in place of an explanatory visual. +- **Image Treatment**: Keep illustration clean, layered, and labeled in plain language, with a scale reference wherever size matters and any deliberate simplification noted. Present real evidence images honestly, with any false color or processing stated, and caption what the audience is looking at. Avoid full-bleed atmospheric treatment that crowds out labels, and synthetic text inside generated images. +- **Icon Treatment**: Use one coherent icon family at consistent weight to mark recurring entities or stages, with meaning fixed for the whole talk and always paired with a word on first use. Avoid icon grids substituting for explanation and mixed visual languages within one build. + +## VII. Review Focus + +> Apply this section only after the user explicitly activates visual review. It never triggers that stage. + +- Each page carries one idea, understandable by someone meeting the topic for the first time. +- Every technical term appears with its plain-language meaning where it is first introduced. +- Each analogy is marked as an analogy and its breaking point is stated on the page. +- Visuals explain rather than decorate; no page relies on a diagram carried over from the previous one. +- Chart axes are explained before the data, labeled directly, and neither broken nor unexplained in scale. +- The color-to-concept mapping stays fixed across the talk and survives color-vision differences. +- Consensus, active debate, and speculation remain distinguishable in plain words. +- Text and labels are legible from the back of a hall, not only on a laptop. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/styles/solution-proposal/templates/design_spec.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/styles/solution-proposal/templates/design_spec.md new file mode 100644 index 00000000..3525c9a8 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/styles/solution-proposal/templates/design_spec.md @@ -0,0 +1,80 @@ +--- +style_id: solution-proposal +kind: style +summary: Client-facing proposal method that proves understanding first, then earns the work through a specific, costed plan. +keywords: [proposal, presales, bid, client, engagement] +--- + +# Solution Proposal — Style Specification + +> Method and design defaults only. No project communication contract, brand identity, page structure, or SVG prototypes. + +## I. Style Overview + +| Property | Value | +|---|---| +| Style Name | Solution Proposal | +| Best Fit | Client proposals, presales solution presentations, tender and bid responses, statements of work, and vendor selection finals | +| Reusable Intent | Convince a buying group that their situation is genuinely understood and that this specific plan, team, and price will deliver — with commitments precise enough to sign | +| Sources | Authored in-repo as a bundled reference Style, 2026-08-07; distilled from presales and bid-response practice, not a single external document | + +## II. Communication Method + +- **Preferred Mode**: pyramid +- **Argument Flow**: Lead with the client's situation in the client's own terms, state the recommended approach and what it will achieve, then support it with how the work is done, who does it, what it costs, and how risk is handled. Everything after the recommendation exists to make it credible and signable. When the buyer has published requirements, answer them on their terms and in a traceable order rather than reorganizing around what is convenient to present. +- **Page Message Discipline**: Give each page one commitment, one component of the approach, or one piece of proof, and title it with what the client gets rather than with a capability name. Keep a promise and its supporting mechanism on the same page. Never present a page whose subject is the vendor when the same space could carry the client's outcome. +- **Claim Discipline**: Keep understood requirement, proposed commitment, assumption, exclusion, and optional scope explicitly distinct — ambiguity here becomes a dispute later. Separate what is included from what is available at additional cost, state every dependency on the client, and never imply a capability, certification, reference, or resource that cannot be produced on request. Present references and case evidence with their actual scope rather than a flattering generalization. + +## III. Page Role Vocabulary + +| Role | Communication Job | Evidence Obligation | Composition Tendency | +|---|---|---|---| +| Situation understanding | Show the client's reality is genuinely understood | Use the client's own facts, constraints, and language gathered in discovery, not a generic industry sketch | Lead with their situation; keep vendor presence minimal on this page | +| Requirement interpretation | Confirm what is being solved and to what standard | Restate stated and implied requirements with priority and success criteria; flag where interpretation was needed | Keep the client's framing visible and mark any reinterpretation openly | +| Recommended approach | State the plan and why it fits this client | Connect each element of the approach to a specific requirement or constraint | Make the recommendation dominant and its rationale visibly adjacent | +| Alternatives considered | Show the recommendation was chosen, not defaulted to | Give real alternatives with why they were set aside for this client | Compare on the client's decision axes, not on vendor preference | +| Solution architecture | Show what will actually be built or delivered | Depict real components, interfaces, and boundaries; mark what is existing, new, and third-party | Keep boundaries and ownership legible; avoid diagrams that hide the seams | +| Delivery plan | Show how the work reaches the outcome | Give phases, durations, dependencies, decision gates, and client involvement | Make sequence and critical dependency scannable without becoming a project schedule | +| Team and responsibility | Establish who does the work and who is accountable | Name real roles and allocation; distinguish named individuals from role placeholders | Keep accountability unmistakable rather than presenting an anonymous org shape | +| Proof and reference | Establish this has been done before | Give comparable engagements with scope, scale, outcome, and permission to reference | One relevant reference at real depth beats a wall of client marks | +| Commercial terms | State what it costs and what triggers payment | Give price basis, assumptions, inclusions, exclusions, and change mechanism | Keep the number and its basis together; never separate price from what it buys | +| Risk and mitigation | Show the hard parts are known and handled | Pair each real risk with likelihood, impact, mitigation, and owner including client-side risk | Keep risk and response in direct correspondence; do not sanitize the list | +| Assumptions and dependencies | Bound the commitment honestly | State every client dependency and assumption that price and schedule rest on | Give these a real page; they define the boundary of the promise | +| Next step | Make the decision easy to act on | Give the specific action, owner, and date that moves to contract or pilot | One dominant action; never end on a generic thank-you page | + +## IV. Evidence & Data Expression + +- **Argument Trace**: Every commitment traces to a client requirement, and every capability claim traces to evidence that can be produced in diligence — a delivered engagement, a certification, a named resource, or a working artifact. Where the response is a partnership or a hire yet to be made, say so rather than presenting it as existing capacity. +- **Charts**: Use charts for the client's own data, projected outcomes, and delivery sequence. State the basis and assumptions of any projected benefit on the chart itself, distinguish modeled from measured, and keep comparison conditions matched. Never present a benefit curve without the assumptions that generate it. +- **Tables**: Use tables for requirement traceability, scope inclusion and exclusion, pricing breakdown, and responsibility assignment. Keep one row shape, mark optional and conditional items clearly, state units, currency, and validity period, and make the boundary between included and excluded impossible to misread. +- **Sources**: Attribute client-supplied facts to their discovery source, cite third-party benchmarks with date and scope, and reference prior engagements only with permission and accurate scope. Keep pricing validity dates and any rate basis visible. +- **Native Editability**: Prefer editable native tables and charts for pricing, scope, requirement traceability, and schedule — proposals are revised through negotiation and reissued, so these must be correctable in place. Keep an architecture diagram as editable shapes so scope changes can be redrawn rather than rebuilt. + +## V. Visual System Defaults + +- **Preferred Visual Style**: soft-rounded +- **Composition**: Build each page around the client's outcome, with a stable position for the commitment line and a stable position for supporting evidence. Give the recommendation, commercial, and next-step pages room; let architecture and traceability pages carry structured density. Keep composition consistent enough that a document read offline navigates by position. +- **Density**: Proposals are read alone as often as presented, so pages must survive without narration. Keep the argument pages readable at a glance and let scope, pricing, and traceability pages carry real detail under one grid without dropping below legible scale or hiding a condition. +- **Decoration**: Professional and calm. Use gentle containers to group related commitments, hairline separation for structure, and restrained emphasis. Avoid heavy corporate ornament, stock imagery of handshakes and skylines, gradient banners, and decorative devices that inflate a thin proposal. Nothing should look more expensive than the work being proposed. +- **Color Behavior**: Keep a neutral professional field and reserve accent for the client's outcome and the decision points. Where a table distinguishes included, optional, and excluded scope, encode that distinction with label and position as well as color so it survives printing and forwarding. Any confirmed Brand or Deck identity replaces these tendencies — a client-facing proposal normally carries the vendor's own identity. +- **Typography Character**: Use a clear professional sans-serif with tabular figures for pricing and effort tables, comfortable reading size for offline review, and consistent treatment of terms, currency, and units. Keep hierarchy from weight and spacing rather than ornamental containers. Exact families remain current-project or resolved identity decisions. + +## VI. Image & Icon Direction + +- **Preferred Image Rendering**: corporate-photo +- **Image Usage**: Use imagery where it carries the client's context or real delivery evidence — their environment, a comparable installation, a delivered artifact, or the actual team. Keep architecture, process, and responsibility structures as authored diagrams. Never use generic business imagery to pad a proposal. +- **Image Treatment**: Crop to the subject that supports the point, keep any embedded interface or document text legible in print as well as on screen, and caption with context and permission status. Use consistent framing throughout. Avoid full-bleed decorative imagery, and never show another client's confidential material or synthetic text inside generated images. +- **Icon Treatment**: Use one coherent icon family at consistent weight to mark recurring classes such as phase, role, or scope status, with fixed meaning throughout. Never let an icon alone carry an inclusion or exclusion that has commercial consequence. Avoid icon grids used as capability inventories and third-party logos implying partnership or certification that does not exist. + +## VII. Review Focus + +> Apply this section only after the user explicitly activates visual review. It never triggers that stage. + +- Every page survives offline reading without a presenter, since proposals are forwarded and evaluated alone. +- The client's situation and language are visible early and dominate the vendor's presence. +- Included, optional, and excluded scope is unmistakable and does not depend on color alone. +- Price appears together with its basis, assumptions, validity, and what it buys. +- Assumptions, client dependencies, and exclusions occupy a real page rather than fine print. +- Requirement traceability is followable where the buyer published requirements. +- Pricing and effort figures align in tabular columns and remain legible in print. +- The closing page gives one concrete next action with an owner and a date. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/styles/styles_index.json b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/styles/styles_index.json index 56df1dec..9e103aea 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/styles/styles_index.json +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/styles/styles_index.json @@ -1,4 +1,14 @@ { + "academic-research": { + "summary": "Research-reporting method that builds a defensible claim from question, method, and result while keeping limitations visible.", + "keywords": [ + "academic", + "research", + "thesis-defense", + "methodology", + "peer-review" + ] + }, "consulting-decision": { "summary": "Answer-first, evidence-led decision-document method with restrained analytical design defaults.", "keywords": [ @@ -8,5 +18,105 @@ "evidence", "analytical" ] + }, + "creative-pitch": { + "summary": "Creative-work presentation method that grounds one idea in a real insight and shows it living across every place it will appear.", + "keywords": [ + "creative", + "advertising", + "branding", + "campaign", + "concept" + ] + }, + "incident-postmortem": { + "summary": "Blameless incident review method that reconstructs a timeline, separates contributing factors from blame, and commits to verifiable actions.", + "keywords": [ + "postmortem", + "incident", + "reliability", + "root-cause", + "blameless" + ] + }, + "investor-pitch": { + "summary": "Fundraising narrative method that carries an investor from why now to why this team, on evidence rather than adjectives.", + "keywords": [ + "fundraising", + "pitch", + "startup", + "traction", + "investor" + ] + }, + "narrative-keynote": { + "summary": "Story-driven keynote method that earns one idea through tension, turn, and concrete human detail.", + "keywords": [ + "keynote", + "storytelling", + "narrative", + "persuasion", + "talk" + ] + }, + "operating-review": { + "summary": "Recurring business-review method that separates result, variance, cause, and owned commitment without softening bad numbers.", + "keywords": [ + "business-review", + "metrics", + "variance", + "operations", + "accountability" + ] + }, + "product-launch": { + "summary": "Value-first launch method where every capability claim is earned by a demonstrable moment before it is named.", + "keywords": [ + "product", + "launch", + "positioning", + "demo", + "capability" + ] + }, + "science-explainer": { + "summary": "Public-explanation method that builds understanding from familiar ground through visual analogy, without trading accuracy for accessibility.", + "keywords": [ + "explainer", + "science-communication", + "popular", + "analogy", + "public" + ] + }, + "solution-proposal": { + "summary": "Client-facing proposal method that proves understanding first, then earns the work through a specific, costed plan.", + "keywords": [ + "proposal", + "presales", + "bid", + "client", + "engagement" + ] + }, + "technical-deepdive": { + "summary": "Mechanism-first technical explanation method that grounds every claim in constraints, trade-offs, and observable behavior.", + "keywords": [ + "technical", + "architecture", + "engineering", + "mechanism", + "trade-off" + ] + }, + "workshop-teaching": { + "summary": "Learn-by-doing training method that sequences objective, worked demonstration, practice, and honest checks for understanding.", + "keywords": [ + "training", + "workshop", + "teaching", + "practice", + "onboarding" + ] } } diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/styles/technical-deepdive/templates/design_spec.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/styles/technical-deepdive/templates/design_spec.md new file mode 100644 index 00000000..8c0e7c7a --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/styles/technical-deepdive/templates/design_spec.md @@ -0,0 +1,88 @@ +--- +style_id: technical-deepdive +kind: style +summary: Mechanism-first technical explanation method that grounds every claim in constraints, trade-offs, and observable behavior. +keywords: [technical, architecture, engineering, mechanism, trade-off] +--- + +# Technical Deep Dive — Style Specification + +> Method and design defaults only. No project communication contract, brand identity, page structure, or SVG prototypes. + +## I. Style Overview + +| Property | Value | +|---|---| +| Style Name | Technical Deep Dive | +| Best Fit | Architecture reviews, system explanations, engineering design docs, protocol and API walkthroughs, and technical postmortems | +| Reusable Intent | Make a technically literate audience understand how something actually works and why it was built that way, so they can evaluate, extend, or operate it | +| Sources | Authored in-repo as a bundled reference Style, 2026-08-07; distilled from engineering-explanation practice, not a single external document | + +## II. Communication Method + +- **Preferred Mode**: instructional +- **Argument Flow**: Establish the problem and the constraints that make it hard, then the mechanism that resolves it, then the trade-offs that mechanism accepts, and finally what this means for building, operating, or migrating. Introduce a component only after the reader needs it; adapt depth to the audience's existing knowledge instead of replaying a fixed chapter order. +- **Page Message Discipline**: For every planned page, name the one mechanism, constraint, or behavior it explains, and state its consequence in the title or an equally dominant line. Keep a diagram and its explanation on the same page; never leave a diagram to speak alone or split one mechanism across pages that must be recalled together. +- **Claim Discipline**: Keep specification, current implementation, measurement, and design opinion distinct. Cite versions and configuration for behavior claims, attach conditions and workload to any number, and mark known-unknowns as open rather than smoothing them into confident description. Never present a planned or aspirational design as shipped behavior. + +## III. Page Role Vocabulary + +| Role | Communication Job | Evidence Obligation | Composition Tendency | +|---|---|---|---| +| Problem and constraint | Establish what must be solved and what bounds the solution space | Name the real limits — load, latency, consistency, cost, compatibility, team — and their source | Make the binding constraint visually dominant over background context | +| System overview | Give a mental model of the whole before any part | Show only the components that carry the explanation, with honest boundaries | Establish a spatial arrangement that later pages reuse without redrawing | +| Mechanism walkthrough | Explain how the core behavior actually works | Follow one concrete path end to end; do not skip the step where the difficulty lives | Let the sequence drive the composition and keep each step's state legible | +| Data or control flow | Show what moves, in what order, and who decides | Distinguish request, data, and failure paths; label ordering and sync/async behavior | Keep the flow direction consistent and reserve emphasis for the decisive hop | +| Interface contract | Define what callers may rely on | State inputs, outputs, errors, idempotency, and versioning behavior that the source supports | Pair the contract with one realistic call or payload rather than exhaustive signatures | +| Trade-off comparison | Justify the chosen approach against real alternatives | Compare on axes that actually decided it; state what the choice gives up | Align alternatives on shared axes and mark the decision, not every difference | +| Failure mode | Explain how it breaks and what absorbs the break | Pair each failure with trigger, blast radius, detection, and recovery when known | Keep failure and response in direct visual correspondence | +| Measurement evidence | Ground performance or correctness claims | Give workload, environment, version, method, and variance; never a bare number | Let the measured relationship carry the page and annotate the decision-relevant point | +| Adoption or migration path | Translate the design into what a team does next | Connect steps to prerequisites, compatibility windows, and rollback | Make sequence and reversibility scannable without becoming a project calendar | +| Reference detail | Preserve depth needed to implement or audit | Retain exact names, parameters, defaults, and limits | Allow higher density while keeping structure and lookup path legible | + +## IV. Evidence & Data Expression + +- **Argument Trace**: Every mechanism claim traces to an observable — a specification clause, a code path, a measurement, or a documented failure. Where the trace is missing, say the behavior is unverified instead of describing it with the same confidence as the verified parts. +- **Charts**: Choose the chart from the engineering question: distribution for latency, time series for behavior under change, comparison for alternatives. Show tails and percentiles rather than means alone, keep units and scale explicit, mark the threshold or budget that makes the number meaningful, and label log scales prominently. Never plot a projection and a measurement in the same series without distinguishing them. +- **Tables**: Use tables for contracts, configuration, capability matrices, and alternative comparisons. Keep one row shape per table, align units and defaults, mark required versus optional, and let empty mean "not applicable" only when the table says so. +- **Sources**: Attach version, commit, specification section, environment, or date to any behavior or number, close to the claim. Label estimates, projections, and vendor-reported figures as such. +- **Native Editability**: Prefer editable native charts and tables for benchmark data and contract matrices when the supported interface fits. Keep architecture and flow diagrams as editable shapes and text so reviewers can correct a box or an arrow; never flatten a diagram that the audience is expected to argue with. + +## V. Visual System Defaults + +- **Preferred Visual Style**: blueprint +- **Composition**: Build the page around the structure being explained. Give the diagram the dominant region and keep its explanation adjacent rather than stacked below the fold. Preserve one spatial convention across the deck — flow direction, layer order, and component position — so a returning diagram is recognized instead of re-read. +- **Density**: Technical audiences tolerate density when it is organized. Allow detailed diagrams and dense reference tables under a consistent grid, but keep one idea per page and let boundary pages — problem statement, decision, conclusion — carry more whitespace. +- **Decoration**: Use precise lines, measured spacing, and functional annotation. Line weight, dash pattern, and arrowhead carry meaning and stay consistent once assigned. Avoid gradient-filled server icons, drop-shadowed boxes, glow, and decorative isometric scenery that adds no structural information. +- **Color Behavior**: Start from a restrained technical field and let color encode a declared dimension — layer, ownership, path type, or state. Fix that mapping across the deck and keep it visible where it is used. Reserve saturated accent for the component under discussion; never color components decoratively when the same palette elsewhere carries meaning. Any confirmed Brand or Deck identity replaces these tendencies. +- **Typography Character**: Use a clear technical sans-serif hierarchy with a genuinely monospaced companion for identifiers, paths, payloads, and commands. Keep code-like text unwrapped and legible at slide size, distinguish it from prose without decorative containers, and derive hierarchy from weight and spacing. Exact families remain current-project or resolved identity decisions. + +### Fallback Color Scheme + +| Role | HEX | Purpose | +|---|---|---| +| Field | #0F1C2B | Deep technical ground for schematic pages | +| Surface | #16283C | Raised region for grouped components | +| Ink | #E6EDF5 | Primary text and diagram labels | +| Structure | #4A7BA7 | Component outlines, connectors, and grid | +| Focus | #4FC9E8 | The component, path, or value under discussion | +| Caution | #E8A54F | Failure paths, limits, and warnings | + +## VI. Image & Icon Direction + +- **Preferred Image Rendering**: 3d-isometric +- **Image Usage**: Use imagery only where spatial or physical reality aids understanding — topology, hardware, deployment geography, or a real screen. Keep architecture, sequence, and state diagrams as authored vector structure; never replace an explanatory diagram with a stock illustration of one. +- **Image Treatment**: Crop screenshots to the region that carries the point and keep their text readable at slide size, magnifying a detail rather than shrinking the whole frame. Keep any embedded interface legible and unretouched, and caption what the reader should notice. Avoid full-bleed atmospheric technology imagery and synthetic text inside generated images. +- **Icon Treatment**: Use one coherent icon family at consistent weight, and only to identify a recurring component class or state. Keep an icon's meaning fixed once assigned. Avoid vendor logos as generic component symbols, mixed icon languages inside one diagram, and icon grids that decorate a page without labeling anything. + +## VII. Review Focus + +> Apply this section only after the user explicitly activates visual review. It never triggers that stage. + +- The mechanism each page explains is identifiable at the rendered slide size, not only from the narration. +- Diagram labels, identifiers, code-like text, and axis units remain legible at the rendered slide size. +- Flow direction, layer order, and component position stay consistent wherever a diagram recurs. +- Any color, line weight, or dash pattern that encodes meaning is used consistently and is decodable on the page where it appears. +- Numbers carry their conditions; measurement and projection remain visually distinguishable. +- Dense reference pages retain one scan path and do not hide overflow or truncated identifiers. +- No unverified or planned behavior is presented with the same confidence as observed behavior. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/styles/workshop-teaching/templates/design_spec.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/styles/workshop-teaching/templates/design_spec.md new file mode 100644 index 00000000..1d576979 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/styles/workshop-teaching/templates/design_spec.md @@ -0,0 +1,76 @@ +--- +style_id: workshop-teaching +kind: style +summary: Learn-by-doing training method that sequences objective, worked demonstration, practice, and honest checks for understanding. +keywords: [training, workshop, teaching, practice, onboarding] +--- + +# Workshop Teaching — Style Specification + +> Method and design defaults only. No project communication contract, brand identity, page structure, or SVG prototypes. + +## I. Style Overview + +| Property | Value | +|---|---| +| Style Name | Workshop Teaching | +| Best Fit | Hands-on workshops, technical enablement, onboarding curricula, internal training, tutorials, and certification preparation | +| Reusable Intent | Move learners from not being able to do something to doing it unaided, with the deck usable both live and as later self-study material | +| Sources | Authored in-repo as a bundled reference Style, 2026-08-07; distilled from instructional-design practice, not a single external document | + +## II. Communication Method + +- **Preferred Mode**: instructional +- **Argument Flow**: State what the learner will be able to do, establish the minimum concept needed to attempt it, demonstrate it worked through completely, then hand it over for practice and check whether it landed. Introduce a concept at the moment it is needed to act, and let the size of each cycle follow task difficulty rather than a fixed lesson template. +- **Page Message Discipline**: Give each page one concept, one step, or one exercise, and title it by what the learner does or understands there. Keep an instruction and everything needed to follow it on the same page; never split a procedure so the learner must hold earlier steps from memory. Keep exercise pages visually distinct from teaching pages so a learner scanning later can find them. +- **Claim Discipline**: Keep rule, convention, recommendation, and personal preference distinct, and say which is which. Show the common mistake and why it is tempting rather than only the correct path, mark simplifications as simplifications, and name where the real thing is more complicated instead of leaving a false sense of completeness. + +## III. Page Role Vocabulary + +| Role | Communication Job | Evidence Obligation | Composition Tendency | +|---|---|---|---| +| Learning objective | State what the learner will be able to do afterward | Express the outcome as an observable action, not as topic coverage | Keep the objective dominant and unadorned; it is a contract, not a chapter cover | +| Prerequisite and setup | Establish what must already be true before starting | List exact versions, access, and environment; make the verification step explicit | Keep the checklist scannable and its verification command or check unmistakable | +| Concept anchor | Give the minimum mental model required to act | Ground the concept in the task at hand; mark deliberate simplifications | Use one clarifying diagram or analogy rather than a full theoretical treatment | +| Worked demonstration | Show the task performed completely | Show every step including the unglamorous ones, with real input and real output | Keep step, action, and result visible together and preserve their order | +| Guided practice | Hand the task to the learner with support | State the task, the starting point, the success condition, and where to get unstuck | Make the instruction and success condition unmistakably separate from explanation | +| Common mistake | Prevent the error the learner is about to make | Show the wrong result and its actual cause, not a scolding | Place the incorrect and corrected states in direct correspondence | +| Reference card | Give something the learner returns to during and after | Keep exact syntax, names, and defaults; stay consistent with the demonstration | Allow high density under a strict grid, optimized for lookup rather than reading | +| Understanding check | Reveal whether it actually landed | Ask for application, not recall; make the correct answer verifiable by the learner | Keep the question dominant and any answer separated from the prompt | +| Recap and next step | Consolidate what was learned and where to go next | Tie each point back to the stated objective; name the next capability honestly | Mirror the objective structure so progress is visible | + +## IV. Evidence & Data Expression + +- **Argument Trace**: Every teaching page traces back to a stated learning objective and forward to something the learner does. Content that serves neither is cut rather than kept as background interest. +- **Charts**: Use charts to teach a relationship, not to impress. Build up a complex chart in stages instead of revealing it complete, label directly on the mark, keep units and scale explicit, and annotate what the learner should read from it. Never leave a chart whose takeaway is only spoken aloud. +- **Tables**: Use tables for syntax, parameters, options, and comparison of approaches. Keep one row shape, mark defaults and required fields, and order rows by teaching sequence or lookup convenience rather than internal implementation order. +- **Sources**: Cite versions, documentation, and standards next to the instruction they govern, and date anything that changes across releases. Distinguish official documented behavior from local convention or personal practice. +- **Native Editability**: Prefer editable native tables for reference cards and parameter lists so learners and later instructors can correct or extend them. Keep code, commands, and configuration as real selectable text rather than screenshots wherever the learner is expected to type or copy them. + +## V. Visual System Defaults + +- **Preferred Visual Style**: sketch-notes +- **Composition**: Build the page around the single action or idea it teaches, with a consistent place for the instruction and a consistent place for its result. Keep procedural order legible spatially — steps read in one direction and never wrap ambiguously. Preserve a stable page position for the recurring exercise and check regions so learners locate them without searching. +- **Density**: Keep teaching and practice pages light enough to follow while doing something else. Allow density only on reference cards, and keep even those legible at the rendered slide size and in print. Give a new concept its own page rather than compressing two into one. +- **Decoration**: Use hand-adjacent warmth — light annotation, arrows, circling, and margin marks — where it directs attention or shows relationship. Keep decoration functional: an arrow points at something specific, a highlight marks the part that changed. Avoid ornamental doodles, clip-art mascots, and decorative frames that crowd the working area. +- **Color Behavior**: Keep a light, calm field and assign color a teaching job: what is new, what changed, what is correct, what is wrong. Fix that mapping and reuse it throughout so a learner reads state without a legend. Ensure correct and incorrect remain distinguishable without relying on color alone. Any confirmed Brand or Deck identity replaces these tendencies. +- **Typography Character**: Use a warm, highly legible sans-serif with a genuinely monospaced companion for anything the learner types. Keep instruction text plain and generously spaced, keep code unwrapped and copyable in shape, and let weight and scale mark step boundaries instead of decorative containers. Exact families remain current-project or resolved identity decisions. + +## VI. Image & Icon Direction + +- **Preferred Image Rendering**: sketch-notes +- **Image Usage**: Use images where seeing the real thing prevents error — actual screens, real output, physical setup, or the state a learner should recognize. Prefer a clear explanatory drawing over a decorative photograph, and never illustrate a step with an image that does not show that step. +- **Image Treatment**: Crop to the region the learner acts on and keep interface text legible at the rendered slide size, magnifying the relevant detail rather than shrinking the full window. Mark the exact target with a consistent callout, keep screenshots current with the taught version, and caption what to look for. Avoid full-bleed atmospheric imagery and synthetic text inside generated images. +- **Icon Treatment**: Use one coherent icon family at consistent weight to mark recurring page kinds — demonstration, practice, warning, check — and keep each mapping fixed for the whole deck. Never rely on an icon alone to carry a safety-relevant warning. Avoid decorative icon grids and mixed icon languages. + +## VII. Review Focus + +> Apply this section only after the user explicitly activates visual review. It never triggers that stage. + +- Each page teaches one thing, and its objective is identifiable at the rendered slide size. +- Every instruction is followable from the page alone, without recalling a previous page. +- Code, commands, and interface text remain legible at the rendered slide size and are not truncated. +- Exercise, warning, and check pages are visually distinguishable from teaching pages at a glance. +- Color meanings for new, changed, correct, and incorrect stay consistent and survive without color alone. +- Callouts point at the exact target rather than a general region. +- Reference pages stay dense but legible, with a lookup path that does not require reading in order. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/tables/README.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/tables/README.md new file mode 100644 index 00000000..1152e718 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/tables/README.md @@ -0,0 +1,58 @@ +# Table Visualization Templates + +This directory contains six canonical cell-grid references. A table belongs +here only when a row header and column header jointly address each body fact; +headers, cells, rectangular merges, alignment, and boundaries preserve that +intersection model. Numeric values inside cells do not by themselves turn the +grid into a chart. + +Value-driven mark geometry belongs in [`charts/`](../charts/). Qualitative page +topology is built as a page-specific Structure by Executor. Reusable PowerPoint +Master/Layout systems belong in [`layouts/`](../layouts/). + +## Source of truth + +[`tables_index.json`](./tables_index.json) is the sole table registry. Its +`tables` object maps each canonical key to one selection-rule `summary`; keys +match `.svg`, and `meta.total` matches the canonical SVG roster. + +Use [`visualization_recall.py`](../../scripts/visualization_recall.py) for +bounded Chart/Table or table-only recall. New Default planning writes +`table/` to `page_visualizations`; Quick keeps the selected reference in +active context. + +## Authoring contract + +[`VISUALIZATION_TEMPLATE_AUTHORING.md`](../VISUALIZATION_TEMPLATE_AUTHORING.md) +owns the shared standalone-SVG, neutral-preview, root-boundary, Shape-first, +family, and catalog rules. Table-specific requirements are: + +- Preserve the complete row/column topology, headers, values, units, ordering, + merges, alignment, totals, status, and source notes. +- Default output remains independently editable DrawingML shapes. +- Add native Table replacement metadata only for a supported pure text grid + selected as an independent native-ready object. The fallback and metadata + contain the same cells. +- Keep graphical cells such as rating dots, icons, status marks, avatars, or + embedded bars on the Shape fallback route unless the active native-data + contract explicitly supports them. + +| Canonical key | Grid contract | +|---|---| +| `record_table` | One flat record per row and one stable heterogeneous field per column | +| `metric_table` | Operating metrics by entity with current values, changes, statuses, or target progress inside cells | +| `comparison_matrix` | Criteria × alternatives with exact, prose, or heterogeneous facts at intersections | +| `feature_matrix` | Capabilities × offerings with supported, unsupported, partial, or exception states | +| `rating_matrix` | Criteria × alternatives using one repeated ordinal scale | +| `hierarchical_table` | Grouped or indented rows with detail and subtotal/total hierarchy | + +**Hard rule — physical table is not semantic Table**: A PowerPoint table used +as a drawing grid does not enter this family automatically. Exact dates or +durations that drive horizontal task positions and lengths belong to +`chart/gantt_chart`; qualitative stage/lane placement belongs to +a page-specific Structure. + +Selecting a table reference does not itself select native output. Design Spec +§IX/Quick names independent objects separately and decides +`=yes|no`; explicit `--native-charts-and-tables` export is a second +opt-in. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/tables/comparison_matrix.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/tables/comparison_matrix.svg new file mode 100644 index 00000000..9b4cfac9 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/tables/comparison_matrix.svg @@ -0,0 +1,77 @@ + + + + + + Comparison Matrix + Options compared through the same stable criteria and units + + + + + + + + + + + + + + + + + + + + + + + + + EVALUATION CRITERION + OPTION A + OPTION B + OPTION C + + + + + Annual capacity + Implementation time + Support coverage + Operating model + Estimated total + Overall fit + + + + + 120 units + 160 units + 140 units + + 12 weeks + 8 weeks + 10 weeks + + Business hours + 24 × 5 + 24 × 7 + + Managed + Hybrid + Self-service + + $240K + $210K + $225K + + Conditional + Preferred + Alternative + + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/tables/feature_matrix.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/tables/feature_matrix.svg new file mode 100644 index 00000000..6c29c091 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/tables/feature_matrix.svg @@ -0,0 +1,96 @@ + + + + + + Feature Matrix + Grouped requirements by option with explicit availability states + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + REQUIREMENT + OPTION A + OPTION B + OPTION C + + + + + + CORE ACCESS + OPERATIONS + SUPPORT + + + Single sign-on + Role controls + Automated handoff + Audit history + Extended coverage + Named contact + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Planned + Add-on + Limited + Shared + + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/tables/hierarchical_table.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/tables/hierarchical_table.svg new file mode 100644 index 00000000..ad174a5d --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/tables/hierarchical_table.svg @@ -0,0 +1,202 @@ + + + + + + Hierarchical Table + Groups, indented items, subtotals and a grand total across stable measure columns + + + + + { + "name": "hierarchical-table", + "x": 80, + "y": 145, + "width": 1120, + "height": 500, + "strict_grid": true, + "column_widths": [400, 180, 180, 180, 180], + "row_heights": [50, 50, 50, 50, 50, 50, 50, 50, 50, 50], + "style": { + "font_family": "Arial", + "font_size": 15, + "header_font_size": 13, + "header_fill": "#E2E8F0", + "header_text": "#334155", + "body_fill": "#FFFFFF", + "body_text": "#0F172A", + "band_row": false, + "border_color": "#CBD5E1", + "border_width": 1, + "padding": {"left": 12, "right": 12, "top": 5, "bottom": 5}, + "valign": "middle" + }, + "columns": [ + {"text": "ITEM", "bold": true}, + {"text": "PERIOD 1", "align": "r", "bold": true}, + {"text": "PERIOD 2", "align": "r", "bold": true}, + {"text": "TOTAL", "align": "r", "bold": true}, + {"text": "CHANGE", "align": "r", "bold": true} + ], + "rows": [ + [ + {"text": "Group A", "bold": true, "fill": "#F8FAFC"}, + {"text": "", "fill": "#F8FAFC"}, + {"text": "", "fill": "#F8FAFC"}, + {"text": "", "fill": "#F8FAFC"}, + {"text": "", "fill": "#F8FAFC"} + ], + [ + {"text": "Item A1", "color": "#475569", "padding": {"left": 36, "right": 12, "top": 5, "bottom": 5}}, + {"text": "120", "align": "r"}, + {"text": "138", "align": "r"}, + {"text": "258", "align": "r", "bold": true}, + {"text": "+15%", "align": "r", "color": "#059669", "bold": true} + ], + [ + {"text": "Item A2", "color": "#475569", "padding": {"left": 36, "right": 12, "top": 5, "bottom": 5}}, + {"text": "80", "align": "r"}, + {"text": "92", "align": "r"}, + {"text": "172", "align": "r", "bold": true}, + {"text": "+15%", "align": "r", "color": "#059669", "bold": true} + ], + [ + {"text": "Subtotal A", "bold": true, "fill": "#EFF6FF", "color": "#1D4ED8"}, + {"text": "200", "align": "r", "bold": true, "fill": "#EFF6FF", "color": "#1D4ED8"}, + {"text": "230", "align": "r", "bold": true, "fill": "#EFF6FF", "color": "#1D4ED8"}, + {"text": "430", "align": "r", "bold": true, "fill": "#EFF6FF", "color": "#1D4ED8"}, + {"text": "+15%", "align": "r", "bold": true, "fill": "#EFF6FF", "color": "#059669"} + ], + [ + {"text": "Group B", "bold": true, "fill": "#F8FAFC"}, + {"text": "", "fill": "#F8FAFC"}, + {"text": "", "fill": "#F8FAFC"}, + {"text": "", "fill": "#F8FAFC"}, + {"text": "", "fill": "#F8FAFC"} + ], + [ + {"text": "Item B1", "color": "#475569", "padding": {"left": 36, "right": 12, "top": 5, "bottom": 5}}, + {"text": "140", "align": "r"}, + {"text": "126", "align": "r"}, + {"text": "266", "align": "r", "bold": true}, + {"text": "-10%", "align": "r", "color": "#E11D48", "bold": true} + ], + [ + {"text": "Item B2", "color": "#475569", "padding": {"left": 36, "right": 12, "top": 5, "bottom": 5}}, + {"text": "60", "align": "r"}, + {"text": "72", "align": "r"}, + {"text": "132", "align": "r", "bold": true}, + {"text": "+20%", "align": "r", "color": "#059669", "bold": true} + ], + [ + {"text": "Subtotal B", "bold": true, "fill": "#EFF6FF", "color": "#1D4ED8"}, + {"text": "200", "align": "r", "bold": true, "fill": "#EFF6FF", "color": "#1D4ED8"}, + {"text": "198", "align": "r", "bold": true, "fill": "#EFF6FF", "color": "#1D4ED8"}, + {"text": "398", "align": "r", "bold": true, "fill": "#EFF6FF", "color": "#1D4ED8"}, + {"text": "-1%", "align": "r", "bold": true, "fill": "#EFF6FF", "color": "#E11D48"} + ], + [ + {"text": "Grand Total", "bold": true, "fill": "#2563EB", "color": "#FFFFFF"}, + {"text": "400", "align": "r", "bold": true, "fill": "#2563EB", "color": "#FFFFFF"}, + {"text": "428", "align": "r", "bold": true, "fill": "#2563EB", "color": "#FFFFFF"}, + {"text": "828", "align": "r", "bold": true, "fill": "#2563EB", "color": "#FFFFFF"}, + {"text": "+7%", "align": "r", "bold": true, "fill": "#2563EB", "color": "#FFFFFF"} + ] + ] + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ITEM + PERIOD 1 + PERIOD 2 + TOTAL + CHANGE + + + + + Group A + Item A1 + 120 + 138 + 258 + +15% + Item A2 + 80 + 92 + 172 + +15% + + Subtotal A + 200 + 230 + 430 + +15% + + + + + + Group B + Item B1 + 140 + 126 + 266 + -10% + Item B2 + 60 + 72 + 132 + +20% + + Subtotal B + 200 + 198 + 398 + -1% + + + + + + Grand Total + 400 + 428 + 828 + +7% + + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/tables/metric_table.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/tables/metric_table.svg new file mode 100644 index 00000000..7611d397 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/tables/metric_table.svg @@ -0,0 +1,118 @@ + + + + + + Metric Table + Operating measures with current value, change, status and target progress + + + + + + + + + + + + + + + + + + + + + + + + + + + METRIC + CURRENT + CHANGE + STATUS + TARGET PROGRESS + + + + + Service availability + 99.4% + ▲ 0.8 + + Response time + 1.8 h + ▼ 0.4 + + Open exceptions + 18 + ▲ 3 + + Plan completion + 76% + ▲ 6 + + Capacity used + 88% + ▲ 4 + + Portfolio summary + On plan + Improving + + + + + + On target + + + On target + + + Off target + + + In progress + + + Watch + + + Stable + + + + + + + 94% + + + + 85% + + + + 51% + + + + 76% + + + + 88% + + + + 80% + + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/tables/rating_matrix.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/tables/rating_matrix.svg new file mode 100644 index 00000000..37550fa0 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/tables/rating_matrix.svg @@ -0,0 +1,115 @@ + + + + + + Rating Matrix + Ordinal assessments shown through a common five-step scale + + + + + + + + + + + + + + + + + + + + + + + + EVALUATION CRITERION + OPTION A + OPTION B + OPTION C + + + Ease of use + Configuration + Reliability + Service quality + Overall value + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Lower + Higher + Whole and half-step ordinal ratings + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/tables/record_table.svg b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/tables/record_table.svg new file mode 100644 index 00000000..fca2a939 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/tables/record_table.svg @@ -0,0 +1,170 @@ + + + + + + Record Table + Records by stable fields with explicit text, status and numeric alignment + + + + + { + "name": "record-table", + "x": 80, + "y": 150, + "width": 1120, + "height": 420, + "strict_grid": true, + "column_widths": [200, 420, 180, 140, 180], + "row_heights": [60, 60, 60, 60, 60, 60, 60], + "style": { + "font_family": "Arial", + "font_size": 15, + "header_font_size": 13, + "header_fill": "#F1F5F9", + "header_text": "#475569", + "body_fill": "#FFFFFF", + "body_text": "#0F172A", + "band_row": true, + "band_fill": "#F8FAFC", + "border_color": "#CBD5E1", + "border_width": 1, + "padding": {"left": 12, "right": 12, "top": 6, "bottom": 6}, + "valign": "middle" + }, + "columns": [ + {"text": "RECORD", "bold": true}, + {"text": "DESCRIPTION", "bold": true}, + {"text": "OWNER", "bold": true}, + {"text": "STATUS", "align": "ctr", "bold": true}, + {"text": "CAPACITY", "align": "r", "bold": true} + ], + "rows": [ + [ + {"text": "REC-001", "color": "#475569"}, + {"text": "Primary work item", "bold": true}, + {"text": "Team A", "color": "#475569"}, + {"text": "Active", "align": "ctr", "color": "#059669", "bold": true}, + {"text": "120", "align": "r", "bold": true} + ], + [ + {"text": "REC-002", "color": "#475569"}, + {"text": "Secondary work item", "bold": true}, + {"text": "Team B", "color": "#475569"}, + {"text": "Review", "align": "ctr", "color": "#D97706", "bold": true}, + {"text": "96", "align": "r", "bold": true} + ], + [ + {"text": "REC-003", "color": "#475569"}, + {"text": "Shared service item", "bold": true}, + {"text": "Team C", "color": "#475569"}, + {"text": "Active", "align": "ctr", "color": "#059669", "bold": true}, + {"text": "84", "align": "r", "bold": true} + ], + [ + {"text": "REC-004", "color": "#475569"}, + {"text": "Planned work item", "bold": true}, + {"text": "Team A", "color": "#475569"}, + {"text": "Planned", "align": "ctr", "color": "#2563EB", "bold": true}, + {"text": "72", "align": "r", "bold": true} + ], + [ + {"text": "REC-005", "color": "#475569"}, + {"text": "Pending work item", "bold": true}, + {"text": "Team D", "color": "#475569"}, + {"text": "Pending", "align": "ctr", "color": "#64748B", "bold": true}, + {"text": "48", "align": "r", "bold": true} + ], + [ + {"text": "REC-006", "color": "#475569"}, + {"text": "Exception work item", "bold": true}, + {"text": "Team B", "color": "#475569"}, + {"text": "Blocked", "align": "ctr", "color": "#E11D48", "bold": true}, + {"text": "24", "align": "r", "bold": true} + ] + ] + } + + + + + + + + + + + + + + + + + + + + + + + + + + RECORD + DESCRIPTION + OWNER + STATUS + CAPACITY + + + + + + REC-001 + Primary work item + Team A + Active + 120 + + + REC-002 + Secondary work item + Team B + Review + 96 + + + REC-003 + Shared service item + Team C + Active + 84 + + + REC-004 + Planned work item + Team A + Planned + 72 + + + REC-005 + Pending work item + Team D + Pending + 48 + + + REC-006 + Exception work item + Team B + Blocked + 24 + + + + diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/tables/tables_index.json b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/tables/tables_index.json new file mode 100644 index 00000000..c28229cb --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/templates/tables/tables_index.json @@ -0,0 +1,41 @@ +{ + "meta": { + "total": 6, + "defaultViewBox": "0 0 1280 720", + "formats": [ + "ppt169" + ], + "filePattern": "{key}.svg", + "libraryPositioning": "Core row-and-column grids whose body values are addressed by stable row and column headers.", + "summaryGrammar": "Each table summary is a selection rule, not a description. Format: 'Pick for . Skip if '.", + "updated": "2026-08-08" + }, + "aliases": { + "basic_table": "record_table", + "comparison_table": "comparison_matrix", + "consulting_table": "metric_table", + "feature_matrix_table": "feature_matrix", + "financial_statement_table": "hierarchical_table", + "harvey_balls_table": "rating_matrix" + }, + "tables": { + "comparison_matrix": { + "summary": "Pick for criteria × alternatives with prose, exact values, or mixed facts. Skip if cells encode only feature states (use feature_matrix) or ordinal ratings (use rating_matrix)." + }, + "feature_matrix": { + "summary": "Pick for capabilities × offerings with supported, unsupported, partial, or exception states. Skip for mixed facts (use comparison_matrix) or ordinal scores (use rating_matrix)." + }, + "hierarchical_table": { + "summary": "Pick for grouped or indented row hierarchies across stable measure columns, including subtotals and totals. Skip for flat records (use record_table) or geometry driven by numeric magnitude (use a chart)." + }, + "metric_table": { + "summary": "Pick for operating metrics by entity with current values, changes, statuses, or target progress inside cells. Skip if marks leave the grid and encode values (use a chart)." + }, + "rating_matrix": { + "summary": "Pick for criteria × alternatives using one repeated ordinal scale. Skip for feature states (use feature_matrix) or exact facts (use comparison_matrix)." + }, + "record_table": { + "summary": "Pick for flat records addressed by stable heterogeneous fields. Skip for KPI scanning (use metric_table) or grouped rows and totals (use hierarchical_table)." + } + } +} diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/create-template.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/create-template.md index 8f25dee6..a5376337 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/create-template.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/create-template.md @@ -32,7 +32,7 @@ Create Template is the fixed user-facing entry and common contract. It selects o Select Create Brand only for identity-only intent. Select Create Style when the portable value is a communication method, evidence discipline, and visual direction but there is no official identity, page geometry, or prototype roster to retain. Select Create Layout only when identity remains downstream-selectable and the reusable artifact does not prescribe communication objectives, audience outcomes, a required narrative sequence, or scenario-specific starting content. Select Create Deck when structure carries brand identity or reusable application semantics. A complete source PPTX alone does not determine the kind: classify only the stable rules worth reusing. Ask one discriminator question only when the user's requested reusable artifact is genuinely ambiguous; once selected, enter that child workflow and do not repeat route selection inside its confirmation gate. See [`templates/README.md`](../templates/README.md) for the shared kind and -workspace model. Downstream template application and fusion remain owned by +workspace model. Downstream template application and installation remain owned by [`generate-pptx.md`](./generate-pptx.md) Step 3. ## Output scope — library (default) vs project diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/generate-pptx.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/generate-pptx.md index 4e7eac56..0baceae1 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/generate-pptx.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/generate-pptx.md @@ -42,7 +42,7 @@ request does not explicitly select Quick. | Artifact ownership | [`artifact-ownership.md`](../references/artifact-ownership.md) | Owns fact channels, source/derived artifact boundaries, and regeneration rules | | Failure recovery | [`failure-recovery.md`](./governance/failure-recovery.md) | Owns stop/continue policy and resume pointers | | Confirm UI details | [`confirm_ui.md`](../scripts/docs/confirm_ui.md) | Owns the JSON schema, launcher behavior, staged-result contract, port strategy, and chat fallback details | -| Confirmed template application | [`apply-template-workspace.md`](./stages/apply-template-workspace.md) | Owns validation, installation, and fusion after Stage 1 confirms library or explicit workspace roots; skip for confirmed free design | +| Confirmed template application | [`apply-template-workspace.md`](./stages/apply-template-workspace.md) | Owns validation and installation after Stage 1 confirms library or explicit workspace roots; skip for confirmed free design | ## Workflow @@ -70,6 +70,11 @@ Use `-o` only when a specific output file/directory is required; with multiple inputs or directory inputs, `-o` is an output directory. Backend converter details are documented in [`scripts/docs/conversion.md`](../scripts/docs/conversion.md). +**Source-image orientation trigger**: Before Step 2, follow +[`conversion.md`](../scripts/docs/conversion.md) § Image Orientation Review when +the user requests correction, converted text asks for rotated viewing, or a +downloaded asset is visibly sideways. Do not launch its legacy HTML tool. + After reading direct and converted content, assess factual sufficiency: | Material state | Action | @@ -183,7 +188,7 @@ Never scan kind directories, infer unregistered entries, or resolve a bare name, brand mention, or style phrase to a path. Preserve every exact root supplied for this run. A registered-root equality match remains `library`; every other exact root remains `explicit`. Candidate provenance never changes later validation, -fusion, or precedence. +installation, or precedence. Resolve the confirmation surface under [`confirm_ui.md`](../scripts/docs/confirm_ui.md). In the UI branch, run @@ -210,7 +215,7 @@ root. Never add Master/Layout/placeholder structure directly to an existing PPTX or SVG project. **✅ Checkpoint**: Candidate input is ready for the combined Stage-1 -confirmation. No template has been selected, read, validated, fused, or +confirmation. No template has been selected, read, validated, or installed. Proceed to Step 4 without a user-visible stop. --- @@ -318,8 +323,8 @@ or `templates` with at least one server-resolved root. 1. For `templates`, load and run [`apply-template-workspace.md`](./stages/apply-template-workspace.md) against - every confirmed exact root. It validates/fuses them and installs one - project-local state under `templates/` plus any real `images/` and `icons/`. + every confirmed exact root. It validates them and installs each as its own + `templates/design_spec...md` plus any real `images/` and `icons/`. For `free_design`, skip installation. Then bind the completed state: ```bash @@ -528,13 +533,21 @@ Keep the core's shared visual-quality defaults and `svg-effects.md` §6.1 Visual | Deterministic trigger | Additional references | |---|---| | `pptx_structure.mode: structured` | `executor-structured.md` + `pptx-structure-interface.md` | -| Any data chart/table, including mini or inset charts and sparklines | `executor-chart.md` | -| Preset pattern or supported native chart/table | `native-data-interface.md` before drawing | +| Selected §VII / `page_visualizations` Chart/Table `family/key`, or a legacy `page_charts` row resolving to a live Chart/Table SVG | `executor-visualization.md` + the selected Chart/Table branch | +| Actual value-driven geometry, including mini/inset charts and sparklines | `executor-chart.md` | +| Mandatory per-page Structure decision from §IX is `yes` | `executor-structure.md` before any geometry for the first applicable page | +| Actual row × column fact grid | `executor-table.md` | +| Used preset pattern fill, or independent Chart/Table with §IX `=yes` | `native-data-interface.md` before that object | | `spec_lock.md images` / §VIII has an image/formula row, or the template has bundled images | `executor-image.md` + `image-layout-spec.md` + `image-layout-patterns.md` + `svg-image-embedding.md` | | At least one placed image has `Status: Sourced` | `executor-web-image.md` after the image branch | | All SVG pages and SVG quality gates are complete, and the effective Speaker Notes outcome in `design_spec.md §I` is enabled | `executor-notes.md` before generating speaker notes | -No branch is loaded by analogy. Evaluate these triggers from `spec_lock.md`, §VII/§VIII, the selected style, and the current page plan. +No branch is loaded by analogy. For each page, after §IX content/communication +but before geometry, apply [`executor-base.md`](../references/executor-base.md)'s +mandatory Structure decision. `no` stays on base; before the first `yes`, read +`executor-structure.md` completely and reuse it until file/context invalidation. +Create no catalog/lock/artifact. Chart/Table selection neither replaces this +decision nor locks geometry/native readiness. **Design Parameter Confirmation (Mandatory)**: before the first SVG, output key design parameters from the spec (canvas dimensions, color scheme, font plan, body font size). See executor-base.md §2. @@ -549,7 +562,12 @@ python3 ${SKILL_DIR}/scripts/svg_editor/server.py --live --daemon - **Do NOT read or apply submitted annotations during generation.** Users may annotate at any time, but Executor proceeds without touching them. The window to apply annotations opens only after Step 7 completes — see [`workflows/stages/live-preview.md`](stages/live-preview.md). - The editor also supports **staged direct edits** (text content + SVG element attributes previewed immediately, then written to `svg_output/` only when the user clicks **Apply changes**; `Ctrl+Z` / Undo drops staged edits) alongside annotation; re-export stays chat-driven. Full scope and editor details: see [`workflows/stages/live-preview.md`](stages/live-preview.md) Notes. -**Conditional reference reads**: Follow `executor-structured.md` for template Design Spec/prototypes and `executor-chart.md` for chart SVGs. Read each selected full reference once per valid context; reread only after a known change or context invalidation. Flat routes skip template reads. Summaries and sidecars never replace full SVGs. +**Conditional reference reads**: `executor-structured.md` owns template specs +and prototypes. `executor-visualization.md` resolves a selected canonical or +legacy value; read only its returned SVG plus applicable family branches. Read +each full reference once per valid context and reread only after change/context +invalidation. Flat routes skip template reads; never substitute summaries, +sidecars, or guessed family paths. > Image facts: trust the latest `analysis/image_analysis.csv` from the Step 4 inventory read or the Step 5 post-acquisition refresh. If `images/` changed since, re-run `python3 ${SKILL_DIR}/scripts/analyze_images.py /images` before layout; if the folder is empty, use no image inventory and ignore a stale CSV. @@ -581,7 +599,7 @@ group on both pages. `template_reuse_scope: mirror|layout` pages MUST start from the complete `page_layouts` SVG, keep inherited visible objects, and preserve root Master/Layout identity plus stable atoms/slots. Strict preserves that reusable contract; under `layout`, the once-loaded Design Spec's `Template Application` may still authorize carrier text/tspan reflow inside unchanged slot bounds. Adaptive uses the current or new Layout key/name already declared by Strategist. If construction proves that fixed atoms or slot topology/bounds must change, stop and return upstream for Strategist to repair the owning plan and lock, validate and read back the affected fragments, then resume; Executor never mutates `spec_lock.md`. `mirror` changes only visible text values while preserving text/tspan topology and attributes. `style` follows the flat paragraph below without structure metadata. -`template_reuse_scope: style`, Style-only, free-design, and brand-only pages use `pptx_structure.mode: flat`. A Style-only workspace always derives `template_reuse_scope: style`; Style never supplies prototype mappings. When fused with Layout/Deck, Style changes only Direction / method and follows the selected non-Style structure plan. On a flat page, draw the complete page directly: keep backgrounds, repeated chrome, headings, text, images, and decoration as ordinary Slide-local SVG content. Do not plan `pptx_masters` / `pptx_layouts` / `page_pptx_layouts`, do not add root Master/Layout identity, and do not add `data-pptx-layer` or `data-pptx-placeholder` metadata. Group logical content normally with top-level `` elements. Export materializes one clean project-owned Master plus one Blank Layout, applies the locked theme colors/fonts/title-body defaults, removes stock content placeholders and unused built-in Layouts, and retains only the standard date/footer/slide-number capability hooks. It does not promote or deduplicate page content. +`template_reuse_scope: style`, Style-only, free-design, and brand-only pages use `pptx_structure.mode: flat`. A Style-only workspace always derives `template_reuse_scope: style`; Style never supplies prototype mappings. When installed alongside Layout/Deck, Style changes only Direction / method and follows the selected non-Style structure plan. On a flat page, draw the complete page directly: keep backgrounds, repeated chrome, headings, text, images, and decoration as ordinary Slide-local SVG content. Do not plan `pptx_masters` / `pptx_layouts` / `page_pptx_layouts`, do not add root Master/Layout identity, and do not add `data-pptx-layer` or `data-pptx-placeholder` metadata. Group logical content normally with top-level `` elements. Export materializes one clean project-owned Master plus one Blank Layout, applies the locked theme colors/fonts/title-body defaults, removes stock content placeholders and unused built-in Layouts, and retains only the standard date/footer/slide-number capability hooks. It does not promote or deduplicate page content. Do not duplicate specialized identity with `data-pptx-role`. Add it only to structural page-frame objects whose package, page-number, or animation behavior is not already expressed by `data-pptx-layer`, `data-pptx-placeholder`, or `data-pptx-replace-with`; such an element needs a stable unique `id`. Do not add generic content roles to ordinary titles, body text, cards, KPIs, diagrams, charts, icons, or images. Full contract: [`references/semantic-svg.md`](../references/semantic-svg.md). @@ -611,7 +629,7 @@ gate-signal: method= | page-local= | not-exercise ```bash python3 ${SKILL_DIR}/scripts/svg_quality_checker.py --stage final --json ``` -- **MUST**: Before this gate, every chart/table whose Design Spec §IX page block says `Native-ready: yes` already has its own draw-time marker plus JSON metadata. Rows marked `no` and incidental microvisuals remain ordinary SVG. For legacy specs only, a matching §VII value may supply the decision when §IX has no field. +- **MUST**: Before this gate, every §IX `Native-ready` entry `=yes` already has one matching draw-time marker group and JSON metadata child; `=no` and incidental microvisuals remain ordinary SVG. A legacy bare `yes|no` is readable only when that page has exactly one eligible object; it never derives from §VII. - Run the command unfiltered—do not pipe it through `tail`, `head`, `grep`, or another output truncator. One invocation already scans every page and reports the complete issue set. - On failure, review all `blocking` errors and all advisory warnings from that run before editing. Choose which warnings merit work, fix every blocking error and the selected warnings in one consolidated edit pass, then perform one verification rerun. If it still fails, its complete output begins the next batch cycle; never run the checker between individual fixes or use repeated invocations to discover one next issue at a time. If terminal output is truncated, extract only `categories.blocking.issues` and, when needed, `categories.introduced.issues` from the report written by that same run. - Every `warning` is advisory and non-blocking: do not return the page for mandatory modification, do not auto-normalize user-authored compatible syntax, and do not require an acknowledgement/disposition line. Recommendation warnings identify the generated-SVG default; fidelity/quality warnings may be reported when material, but the existing input may ship unchanged. If a condition must be corrected before release, the checker must classify it as an `error`, not a `warning`. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/profiles/beautify-pptx.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/profiles/beautify-pptx.md index ef652a43..c2e169e8 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/profiles/beautify-pptx.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/profiles/beautify-pptx.md @@ -251,7 +251,7 @@ In the UI branch, after the final wait returns, read branch, retain the visible final summary instead and require no UI result. After any launched UI path, run `--shutdown` before Step 6; do not assume `5050`. -On confirmation, enter [`generate-pptx`](../generate-pptx.md) Step 4 as Strategist with the plan pre-resolved. The two beautify invariants always hold: the content-faithful clause ([`strategist.md`](../../references/strategist.md) §d Layer 1) and page count = source slide count (strict 1:1). Write the retained final confirmation state completely into `design_spec.md` — `mode` (recommended `briefing`), canvas, `visual_style`, color (e) + typography (g) incl. `body_size` (the reviewed values; skip both recommendation flows) — honoring whatever the user kept or overrode. Do not reopen UI evidence afterward. §VII contains only `Page | Template | Usage` rows for selected catalog references; unmatched chart/table plans stay in their §IX page blocks. §VIII contains source pictures for re-layout. +On confirmation, enter [`generate-pptx`](../generate-pptx.md) Step 4 as Strategist with the plan pre-resolved. The two beautify invariants always hold: the content-faithful clause ([`strategist.md`](../../references/strategist.md) §d Layer 1) and page count = source slide count (strict 1:1). Write the retained final confirmation state completely into `design_spec.md` — `mode` (recommended `briefing`), canvas, `visual_style`, color (e) + typography (g) incl. `body_size` (the reviewed values; skip both recommendation flows) — honoring whatever the user kept or overrode. Do not reopen UI evidence afterward. §VII contains only `Page | Family | Template | Usage` rows for selected `chart` or `table` catalog references; project their family-qualified keys into `spec_lock.md` `page_visualizations`. Qualitative relationships and unmatched Chart/Table plans stay in §IX; Default/Quick makes the mandatory per-page Structure decision before geometry. §VIII contains source pictures for re-layout. **Hard rule — §IX is verbatim and 1:1**: each source slide becomes exactly one page, in source order, its text transcribed word-for-word from `sources/.md`. Do not merge, split, drop, or rewrite. Complete and audit `design_spec.md` first, then author `spec_lock.md` from that Design Spec plus the source/page/template context per `strategist.md` §6 before handing off to the Executor. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/profiles/quick-generate.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/profiles/quick-generate.md index 38815cd7..8f11aeb9 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/profiles/quick-generate.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/profiles/quick-generate.md @@ -25,7 +25,7 @@ Page count alone never activates or blocks this profile. | Inputs | Any supported Generate input; convert/import sources and run bounded factual research when the input requires them | | Templates | Directly validate and install at most one exact workspace root per kind supplied for this run; when none are supplied, use free design without catalog selection or Confirm UI | | Resources | Prepare every project-local image, icon, formula, and required provenance/manifest artifact before the referencing SVG is authored | -| Planning artifacts | Do not author a root project `design_spec.md`, `spec_lock.md`, confirmation payloads, or any substitute planning artifact; an installed `templates/design_spec.md` remains template input | +| Planning artifacts | Do not author a root project `design_spec.md`, `spec_lock.md`, confirmation payloads, or any substitute planning artifact; installed `templates/design_spec...md` files remain template input | | Traceability | Operational resource manifests, checker reports, postflight, and bounded Python command/outcome audit entries may remain, but they do not record the AI's design reasoning or form a resumable generation history | | Delivery | Hand-author the resolved SVG roster, run one lockless final checker, skip `finalize_svg.py`, and export the final native PPTX through `--quick-generate` | @@ -88,6 +88,11 @@ ambiguous and `-o` only for a required output path; with several or directory inputs, `-o` names an output directory. A PPTX is converted to Markdown here and receives its project analysis during the import step below. +**Source-image orientation trigger**: Before import and initialization, follow +[`conversion.md`](../../scripts/docs/conversion.md) § Image Orientation Review +when correction is requested, converted text asks for rotated viewing, or a +downloaded asset is visibly sideways. Skip the legacy HTML tool. + After reading every direct and converted source, assess factual sufficiency: | Material state | Action | @@ -180,15 +185,20 @@ For the direct-template branch, continue with [`apply-template-workspace`](../stages/apply-template-workspace.md) after initialization against only the preflighted roots. The user's request is the selection authority; there is no template confirmation receipt or handoff. The -stage installs and fuses the workspaces into `/templates/` plus +stage installs each workspace as its own spec file under `/templates/` plus the project-local asset pools. All later reads use that installed state, never the original roots. -Before writing P01, read the installed template spec once and, for Layout/Deck, -inspect the relevant SVG prototypes. Apply Brand identity, Style -direction/method, the selected structure owner's useful prototype geometry, -and Deck application context directly in the active context under the existing -segment precedence. Follow explicit instructions about literal or visual-only +Before writing P01, read every installed +`templates/design_spec...md` once and, for Layout/Deck, inspect the +relevant SVG prototypes. Apply Brand identity, Style direction/method, the +selected structure owner's useful prototype geometry, and Deck application +context directly in the active context under the existing segment precedence +([`apply-template-workspace`](../stages/apply-template-workspace.md) §5). A +segment owner's instruction about how a value should dominate, recede, or stay +rare binds as strongly as the value itself; a Style composition or whitespace +tendency never demotes a Brand's declared dominant color to an incidental +accent. Follow explicit instructions about literal or visual-only use; otherwise decide which prototypes to use, skip, repeat, reorder, or adapt while authoring. Persist no separate template-application artifact. If no template was installed, make the same design choices freely. @@ -203,6 +213,7 @@ Before writing P01, resolve in active context: - the canvas, visual direction, palette, wording, and one concrete typography plan using installed font families, with stable size anchors for title, body, annotation, and every other recurring role the roster uses; explicit user, template, or resolved-style requirements may call for a deliberate exception; - an ordinary body-content frame and a density judgment for every page, adapted to the canvas and any user / template / style geometry; use `anchor`, `dense`, `breathing`, or an equivalent active-context distinction instead of one uniform fill level; - for each page not bound to literal supplied geometry, a primary visual zone and page-scale composition direction tied to its core message; use cards or equal grids when the content relationship calls for them, not as the automatic page grammar; +- for each page, preserve its semantic units, source-stated qualitative relationships, intended entry, and outcome so §3 can make the sole Structure decision before geometry; - when useful, one transient deck-level visual motif with an identity or communication job, a recognizable invariant, and deliberate variation across applicable page roles; omit it when restraint serves the deck better; @@ -224,10 +235,43 @@ because Quick is expected to be faster is not. | Real subject, place, product, evidence, atmosphere, or scene benefits from visual grounding | Supplied/extracted, web, AI, or sliced image | | A compact semantic cue clarifies a category, process, KPI, state, navigation item, or real brand | Prepared project-local icon | | Editable geometry can express a relationship, flow, emphasis, callout, symbol, or diagram | Basic SVG primitive, exact Office preset, Boolean result, then necessary freeform | -| Values encode comparison, trend, distribution, composition, relationship, or a text grid | Data chart or table, with optional native Chart/Table metadata when its object model is useful | +| Values, categories, time, weights, or duration determine mark geometry | Value-driven chart | +| Sequence, hierarchy, role, region, or relationship determines page-local topology | Qualitative structure | +| Rows, columns, cells, headers, merges, and alignment form the information model | Cell-grid table | | Mathematical notation is clearer as typeset math than ordinary text | Rendered formula asset | | Typography, spacing, and simple geometry already carry the message | Use no additional visual carrier | +This carrier menu does not satisfy or replace the per-page Structure decision in §3. + +**Visualization recall — optional Chart/Table reference**: When a reusable +Chart/Table reference would help, run recall with 3–8 English semantic tags. +Use its default catalog search; add `--family chart|table` only when the page's +information model is already certain. Do not run recall for qualitative shape +composition. + +```bash +python3 skills/ppt-master/scripts/visualization_recall.py recall \ + --page P03 \ + --tag "time series" \ + --tag "three metrics" \ + --tag "direction over time" \ + --limit 6 +``` + +Read the result unfiltered and apply +[`visualization-recall.md`](../../scripts/docs/visualization-recall.md)'s +low-confidence semantic fallback before retaining `no-template-match`. Choose at most one primary +Chart/Table `family/key` for a page, validate it with `visualization_recall.py validate`, +and keep its short purpose only in active context. The reference remains +flexible: it does not lock final type, geometry, style, or native output. +Describe an embedded child Chart/Table and every qualitative relationship in +the page's active decision rather than selecting another primary reference. +Actual information models determine the loaded execution branches. Give every independent +Chart/Table a page-local semantic `kebab-case` object key; keep its +`=yes|no` native-ready decision and any promoted chart-verification +status in active context. Qualitative relationships create no catalog key or +reusable Master/Layout/placeholder contract. + Prepare only the resource paths needed by the decided pages: | Resource | Required preparation | @@ -238,7 +282,7 @@ Prepare only the resource paths needed by the decided pages: | AI image | Follow `image-base.md` + `image-generator.md`; keep `image_prompts.json` and its human-readable sidecar | | Web image | Follow `image-base.md` + `image-searcher.md`; keep query/status data and `image_sources.json`, including any required on-slide attribution | | Illustration slice | Generate or obtain the parent sheet, run `slice_images.py`, and place only the resulting element files | -| Data chart/table | Keep source values and the chosen page treatment in active context; load the chart/table authorities in §3 before drawing and write native replacement metadata only when selected | +| Visualization | Keep Chart values, Table cell topology, and chosen treatment in active context; load the applicable Chart/Table authority in §3 and write native replacement metadata only for an independently selected native-ready object | **Image inspection boundary**: acquisition-time suitability review follows the owning AI/web/slice reference. Once resources reach terminal status, SVG @@ -268,6 +312,7 @@ not route among them one file at a time: [`svg-effects.md`](../../references/svg-effects.md), [`native-shape-authoring.md`](../../references/native-shape-authoring.md), [`semantic-svg.md`](../../references/semantic-svg.md), +[`executor-structure.md`](../../references/executor-structure.md), [`modes/_index.md`](../../references/modes/_index.md), and [`visual-styles/_index.md`](../../references/visual-styles/_index.md). Resolve one narrative mode and one visual style from explicit user/template requirements @@ -278,21 +323,58 @@ follows its resolved behavior without inventing a nearby preset. Do not load `executor-base.md`: it owns Default's persisted-plan handoff, first-page gate, and completion routing. Excluding that file is not a capability exclusion; Quick loads the shared and conditional execution authorities here -directly. For any image/formula, always read +directly. When any image/formula exists, read once before the first affected +page and reuse throughout the valid execution context: [`executor-image.md`](../../references/executor-image.md), [`image-layout-spec.md`](../../references/image-layout-spec.md), [`image-layout-patterns.md`](../../references/image-layout-patterns.md), and [`svg-image-embedding.md`](../../references/svg-image-embedding.md); add [`executor-web-image.md`](../../references/executor-web-image.md) for a sourced -web image. Load [`canvas-formats.md`](../../references/canvas-formats.md) only -for a non-default canvas. +web image. Reread only after a known file change or context invalidation. Load +[`canvas-formats.md`](../../references/canvas-formats.md) only for a non-default +canvas. + +`executor-structure.md` is loaded once before all SVG authoring so Quick cannot +omit shape-composition reasoning. Reuse it throughout the valid execution +context; reread only after a known file change or context invalidation. + +**Mandatory — per-image-page composition decision**: For every page with one +or more non-formula images, after its content and communication move are +determined but before choosing geometry, apply +[`executor-image.md`](../../references/executor-image.md)'s active image-integration +decision once. Keep its role, direction source, parent +contour, slot/rhythm system, image/shape action, and any continuity only in +active context; create no artifact, spec, lock, manifest, or extra pass. A +deliberate plain or equal-grid result remains valid when it communicates the +relationship better. Formula-only pages use +[`image-layout-spec.md`](../../references/image-layout-spec.md) without forcing a +multi-image system. + +**Mandatory — per-page Structure decision**: after the current page's content +and communication move are determined, but before choosing any geometry or +shape, decide whether geometry must carry qualitative `order`, `link`, `parent`, +`membership`, `contrast`, or `overlap`. Keep the yes/no result and, when yes, +the relationship meaning and reading path in active context only; create no +artifact, spec, lock, manifest, or extra pass. + +- `no` → use Quick's shared base authoring path in this section. +- `yes` → apply the already-loaded Shape Composition Grammar before drawing. + +This decision is mandatory on every page and cannot be satisfied by the +capability menu, visualization recall, template geometry, or a later check. | Deterministic trigger | Additional authority | |---|---| -| Any data chart or text-grid table, including mini/inset charts and sparklines | [`executor-chart.md`](../../references/executor-chart.md); use bounded [`chart_recall.py`](../../scripts/docs/chart-recall.md) only when a reusable visualization reference would help | -| Preset pattern or selected PowerPoint-native Chart/Table replacement | [`native-data-interface.md`](../../references/native-data-interface.md) before drawing the object | +| A selected primary Chart/Table `family/key` | [`executor-visualization.md`](../../references/executor-visualization.md), then the matching Chart/Table authority | +| Any actual value-driven geometry, including mini/inset charts and sparklines | [`executor-chart.md`](../../references/executor-chart.md) | +| Any actual row × column fact grid | [`executor-table.md`](../../references/executor-table.md) | +| A used preset pattern fill, or one independent Chart/Table object selected as native-ready in active context | [`native-data-interface.md`](../../references/native-data-interface.md) before drawing that object | | Any data-driven chart geometry | [`verify-charts.md`](../stages/verify-charts.md) after the complete roster and before the one final checker | +Chart/Table reference and final information model are independent loading +signals; load every applicable authority. Selection never makes an object +native-ready or replaces the per-page Structure decision. + Keep the core's shared visual-quality / leading defaults and `svg-effects.md` §6.1 Visual Job Router active while authoring. Explicit user/template requirements and the resolved style override compatible aesthetic defaults, never technical Required / Forbidden boundaries. **Per-page execution anchors**: apply the transient core-message, typography-role, body-frame, density, and composition anchors resolved in §2 while authoring; they guide the current run without creating a persisted planning artifact. @@ -310,7 +392,7 @@ viewBox. Template canvas is a default, not a compatibility gate; an explicit user canvas may adapt the installed visual system. The first SVG establishes the export canvas; every remaining page must match it exactly. -**Structure**: author flat, Slide-local SVG only, including when a Layout or +**PPTX structure**: author flat, Slide-local SVG only, including when a Layout or Deck workspace is installed. In that branch, visibly realize the resolved template rules and prototype geometry in the complete pages; do not fall back to free design or merely explain how the template could be used. Include the @@ -376,7 +458,9 @@ or lock. - [x] All required source/resource preparation is complete - [x] One mode and visual style were resolved, and every catalog source actually used was read - [x] Every page considered the complete visual-carrier menu without a coverage quota +- [x] Every non-formula image-bearing page made its one pre-geometry composition decision - [x] Resolved SVG pages and their project-local references exist +- [x] Every role declared by an installed template spec is locatable in the finished pages, or its non-use is deliberate — checked per installed spec, not from memory - [x] Every triggered capability-specific preparation and pre-checker verification completed - [x] The lockless final SVG quality report passes and matches the current SVGs - [x] One native PPTX exists under `exports/` or the explicit output path diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/stages/apply-template-workspace.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/stages/apply-template-workspace.md index e36f3ae0..3170cd07 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/stages/apply-template-workspace.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/stages/apply-template-workspace.md @@ -1,5 +1,5 @@ --- -description: Generate-PPTX runbook for validating, installing, or fusing selected Brand, Style, Layout, and Deck workspaces. +description: Generate-PPTX runbook for validating and installing selected Brand, Style, Layout, and Deck workspaces as separate project-local specs. --- # Apply Template Workspace Stage @@ -35,7 +35,7 @@ Read library choices only from `brands_index.json`, `styles_index.json`, promote an unregistered directory into the UI catalog. An explicit root remains valid without index membership; exact equality with a registered root may be reported as `library`. The label changes discovery provenance only, never schema -validation, fusion precedence, or installation behavior. +validation, segment precedence, or installation behavior. **Selection cardinality**: Default Stage 1 permits one registered root per kind plus one explicit root; its explicit root may pair with a same-kind library root under §5.2. Quick has no page or catalog selection and accepts at most one supplied exact root per declared kind (four roots total). Kinds compose freely in both profiles. Reject larger default receipts server-side; require an oversized or duplicate-kind Quick input to converge in chat before installation, never through Confirm UI. @@ -78,12 +78,32 @@ Before copying a Deck or Layout workspace, inspect every SVG root and slot. Bran - A composite region uses an explicit `object` proxy; a zero-slot Layout is valid. - The complete SVG contract is current. Reject a legacy semantic contract instead of repairing it in the target project. -## 4. Install a Single Workspace +## 4. Install Each Workspace Separately + +**Hard rule — one installed spec file per source workspace**: Never merge two +source specs into one file. Install each selected workspace's `design_spec.md` +as its own project-local file named `design_spec...md`, where `` +is that spec's frontmatter `brand_id` / `style_id` / `layout_id` / `deck_id`. +Copy its body unchanged. Several workspaces of the same kind therefore coexist +as separate files. Segment precedence is resolved by the consuming role while +reading (§5), never by rewriting spec content at install time. + +| Installed file | Meaning | +|---|---| +| `templates/design_spec...md` | A template workspace installed into this project | +| `templates/design_spec.md` | This project *is itself* a template workspace produced by project-scope Create Template; it is not an installed template and is never consumed as one | + +Prepend exactly one provenance line under each installed file's H1, then leave +the rest of the document untouched: + +```markdown +> **Installed from**: `skills/ppt-master/templates/brands/mckinsey/` (library) +``` | Kind | Install behavior | |---|---| | `brand` | Install `templates/` plus existing `images/` and `icons/`; ignore `exports/`. Identity is constrained; structure remains free. | -| `style` | Install `templates/design_spec.md` only. Ignore sibling project scaffolding and reject a library Style carrying asset/review payloads. Expose reusable direction/method without identity truth, page prototypes, or native structure. Default Style-only and Style + Brand derive `template_reuse_scope: style` and stay flat; Style + Layout/Deck follows the selected structure plan. Quick always realizes the resolved combination as flat pages. A Style workspace never activates visual review. | +| `style` | Install its `design_spec.md` only. Ignore sibling project scaffolding and reject a library Style carrying asset/review payloads. Expose reusable direction/method without identity truth, page prototypes, or native structure. Default Style-only and Style + Brand derive `template_reuse_scope: style` and stay flat; Style + Layout/Deck follows the selected structure plan. Quick always realizes the resolved combination as flat pages. A Style workspace never activates visual review. | | `layout` | Install the same portable roots. Expose the actual reusable structure; Default Strategist later inspects the prototypes, while Quick's current agent uses them for immediate flat authoring decisions in active context. | | `deck` | Install the same portable roots. Expose descriptive application context, identity, structure, and the actual prototype roster; Default Strategist or Quick's current agent compares them with the current communication contract and content, then derives the applicable plan. | @@ -96,9 +116,9 @@ For a compatible legacy-flat package, route SVG/spec/non-bitmaps to project `tem 3. Reject every destination collision before writing. 4. Write the accepted mapping once; never use recursive copy as an implicit conflict policy. -If the normalized source root equals the target project root, consume it in place and copy nothing. An in-place workspace cannot participate in multi-path fusion. Ignore source `exports/`; it contains review artifacts, not portable template inputs. Empty optional roots remain absent. +If the normalized source root equals the target project root, consume it in place and copy nothing. An in-place workspace cannot be combined with other installed roots. Ignore source `exports/`; it contains review artifacts, not portable template inputs. Empty optional roots remain absent. -**Hard rule — project-local consumer boundary**: After installation/fusion, +**Hard rule — project-local consumer boundary**: After installation, Default template-aware Strategist work in final Stage 2, Quick's current agent before direct authoring, and every later role read only `/templates/` and the project-local `images/` / `icons/` pools. The original library or external root @@ -110,13 +130,26 @@ Quick instead realizes the selected prototypes into complete flat, Slide-local SVGs and never writes `page_layouts` or Master/Layout/placeholder metadata. -## 5. Fuse Multiple Workspace Paths +## 5. Segment Precedence Is Resolved While Reading -Fuse different kinds or, in Default only, at most two same-kind roots. Resolve template segment/asset conflicts before writing. Never reinterpret, predict, or revise the confirmed Stage-1 communication contract here. Default obtains any additional material conflict decision through the active chat channel after Stage 1; this conditional resolution does not reopen template selection. Quick follows explicit conflict instructions; an unresolved material compatibility conflict is a hard prerequisite handled in chat, never by launching Confirm UI or by using path order. +Installation copies specs; it never merges them. The consuming role — Default +final Stage 2 through [`strategist-template.md`](../../references/strategist-template.md), +or Quick's current agent before authoring — reads **every** installed +`design_spec...md` and resolves the segments below in context. Asset +collisions are still rejected at install time (§4); segment conflicts are a +reading decision, not a write-time one. + +Never reinterpret, predict, or revise the confirmed Stage-1 communication +contract here. Default obtains any additional material conflict decision +through the active chat channel after Stage 1; this does not reopen template +selection. Quick follows explicit conflict instructions; an unresolved material +compatibility conflict is a hard prerequisite handled in chat, never by +launching Confirm UI or by using path order. ### 5.1 Different Kinds -Resolve four whole template segments. This table selects the installed starting owner; current user instructions and the caller's later consuming plan still govern project use: +Resolve four whole template segments. This table names the starting owner; +current user instructions and the consuming plan still govern project use: | Segment | Starting owner | |---|---| @@ -125,39 +158,48 @@ Resolve four whole template segments. This table selects the installed starting | Reusable application context | Deck only when present. Preserve it for the consuming comparison; it never becomes the current project's application contract. | | Direction / method | Style when present, otherwise unresolved until the consuming plan. Actual Deck prototypes and Signature facts may inform compatibility, but Deck does not own the Style-only method segment. | -Replace each selected segment wholesale; do not mix its fields implicitly. Brand or Deck identity replaces any identity-adjacent defaults carried by Style. A Style direction may adapt to that resolved identity, but cannot relabel its candidates as official brand facts. +Apply each selected segment wholesale; do not mix its fields implicitly. Brand or Deck identity overrides any identity-adjacent defaults carried by Style. A Style direction may adapt to that resolved identity, but cannot relabel its candidates as official brand facts. + +**Hard rule — an owned segment governs visual weight, not only values**: when a +segment owner declares how a value should dominate, recede, or stay rare, that +instruction carries the same authority as the value itself. A Style's +composition or whitespace tendency never demotes a Brand's declared dominant +color to an incidental accent. Before Layout overrides Deck structure, compare Deck's reusable roles with Layout roles, slots, and capacity. On mismatch, offer exactly three remedies: retain Deck structure, select another Layout, or omit Deck. Default resolves only this template-to-template conflict and must not reinterpret the confirmed Stage-1 communication contract; Quick compares against the current request/content and treats any unresolved material mismatch as a chat hard prerequisite. Before Style overlays Deck guidance, verify that its method serves Deck's reusable context and fits the selected structure. On mismatch, require omitting Style or choosing a compatible Style/structure; never silently weaken a segment. Default final Stage 2 separately checks the result against the confirmed project contract; Quick checks it against the current request/content before authoring. -Field-level micro-adjustments such as a primary-color override are not workspace fusion. Default carries them into the normal final Stage-2 confirmation fields; Quick treats explicit adjustments as direct active-context authoring constraints. +Field-level micro-adjustments such as a primary-color override are not a workspace selection. Default carries them into the normal final Stage-2 confirmation fields; Quick treats explicit adjustments as direct active-context authoring constraints. ### 5.2 Same Kind -Default only: do not use path order as priority. Report every segment-level difference and ask the user to choose workspace A, workspace B, or select per segment. Only the per-segment choice opens a segment-by-segment resolution. Two Style workspaces conflict over the complete Direction / method segment. Do not resolve field-level conflicts here. Three or more same-kind paths require the user to converge to at most two. Quick accepts one root per kind and therefore never enters this subsection. +Several roots of one kind install as separate files distinguished by their +``, exactly like different kinds. Do not merge them and do not use path +order as priority. The consuming role reads all of them and decides which +governs each part of the owned segment, following the latest explicit user +instruction first; where the user gave none and two same-kind specs make +materially incompatible claims over the same segment, surface the conflict in +chat rather than silently averaging them. Two Style workspaces contend over the +complete Direction / method segment; two Brand workspaces contend over +Identity. -### 5.3 Fused Provenance +### 5.3 Installed Set -Write one final `/templates/design_spec.md`. Immediately under its H1, record every source kind/path, base or override role, and resolved segment conflict with its explicit authority: +Each installed file keeps its own frontmatter `kind` and `` from its source +workspace; nothing is relabelled. There is no combined capability label and no +merged spec: the installed set is exactly what was selected, and the routing +consequence is derived while reading — structure comes from an installed Layout +or Deck, identity from an installed Brand or Deck, direction from an installed +Style. A project-local Brand + Layout pair does not become a reusable library +Deck; its application remains current-project context. -```markdown -> **Fused from:** -> - deck: `templates/decks/example/` (base) -> - brand: `templates/brands/example/` (identity override) -> - style: `templates/styles/example/` (direction/method override) -> - layout: `templates/layouts/example/` (structure override) -> - conflicts resolved: Color Scheme from brand (user selected A) -``` - -Single-path installs do not add provenance. Set fused frontmatter `kind` from the non-Style capability: `deck` when identity and structure are both present, `layout` for structure only, or `brand` for identity only. Use `kind: style` only for Style-only input. Adding Style to Brand, Layout, Deck, or Brand + Layout does not change that existing capability label; its Direction / method ownership stays explicit in the fused provenance and body. A project-local Brand + Layout fusion uses `kind: deck` for routing but is not automatically a reusable library Deck; its application remains current-project context. - -**Completion receipt**: Report `roots=; sources=; kinds=; segments=identity:,structure:,application_context:,direction:; install=; final_spec=/templates/design_spec.md`. +**Completion receipt**: Report `roots=; sources=; kinds=; segments=identity:,structure:,application_context:,direction:; install=; installed_specs=..md>`. ## ✅ Template Workspace Applied - [x] Every selected input was an index-derived library root or an exact explicit/Create Template root satisfying a listed workspace contract - [x] Every kind schema passed preflight; structured SVG checks ran only for Layout/Deck inputs -- [x] All collisions and fusion conflicts were resolved before one atomic install +- [x] All destination collisions were rejected before one atomic install; no two source specs were merged into one file - [x] `/templates/` and any portable sibling assets are complete and are the only downstream template source - [ ] **Next**: Default completes the template-selection handoff and continues [`generate-pptx.md`](../generate-pptx.md) Step 4 Stage 2; Quick returns to [`quick-generate`](../profiles/quick-generate.md) §2 diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/stages/generate-audio.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/stages/generate-audio.md index 85ab1c3b..4855c0ee 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/stages/generate-audio.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/stages/generate-audio.md @@ -4,7 +4,7 @@ description: Shared post-processing stage for narration audio, PPTX embedding, a # Generate Audio Stage -> Shared narration stage. Run from the Generate PPTX route after notes/export readiness, or from the Enhance Native PPTX narration module after its notes step. By default, `edge-tts` produces one audio/SRT pair per slide from the same streaming request. Cloud TTS providers (`elevenlabs` / `minimax` / `qwen` / `cosyvoice`) currently produce audio only. The caller owns final PPTX integration. +> Shared narration stage. Run after the owning route's notes step. Edge, ElevenLabs, MiniMax, and timestamp-capable CosyVoice produce per-slide audio/SRT from synthesis timing. Qwen is audio-only because its TTS API exposes no timing. The caller owns final PPTX integration. This stage is **context-independent**: it reads `notes/*.md` and queries the selected TTS voice catalog, so either owning route may invoke it in a fresh session. It does not choose the top-level route and does not patch slide design. @@ -26,7 +26,8 @@ this stage. - Per-page narration files exist at `notes/*.md`. In Generate PPTX, split `notes/total.md` during Step 7.1. In Enhance Native PPTX, the notes module writes numeric files such as `001.md`. - Default mode: `edge-tts` is installed (`python3 -m pip install edge-tts`). -- The stage is page-level only: with edge, one notes file becomes `audio/.mp3` plus `notes/subtitles/.srt`; with a cloud provider, it becomes one audio file. Do not use a single long audio track or attempt automatic long-audio splitting. +- The stage is page-level only: one note becomes `audio/.` plus `audio/.srt` on provider-timed paths, or one audio file with Qwen / explicit CosyVoice audio-only mode. Never substitute one long track or automatic splitting. +- A fully successful run writes a compact `audio/manifest.json` with only provider/model, audio/subtitle format, relevant voice settings, and a SHA-256 fingerprint instead of the raw cloud voice ID. It has no per-slide inventory, artifact hashes, or API keys and is not a normal generation input. The flat `audio/` directory is the single active narration set; do not create provider subdirectories unless the user explicitly asks to preserve multiple variants. - PPT narration assets must be PowerPoint-reliable audio: `m4a` (AAC), `mp3`, or `wav`. The built-in TTS path defaults to `mp3`; provider formats such as `pcm`, `opus`, or `flac` must be transcoded before embedding. - PowerPoint recorded narration export requires `ffprobe` so slide timings can be written from actual audio duration. - Optional automatic video export requires Windows PowerPoint 2016+ and runs @@ -92,6 +93,7 @@ The output is a flat list of all available voices for the selected provider. Fro - **For edge**: prefer `COMMON_VOICES`-listed voices (curated set inside `notes_to_audio.py`) when the locale has them — they are battle-tested. - **For ElevenLabs**: prefer voices already present in the user's account; if the user provides a specific `voice_id`, do not override it. - **For MiniMax / Qwen / CosyVoice**: if the user provides a cloned `voice_id`, use it directly. Do not attempt voice cloning inside this narration stage. +- **For CosyVoice subtitles**: use a cloned voice from a supported v3.5/v3/v2 model or a system voice marked timestamp-supported. Model and voice families must match. Use `--cosyvoice-audio-only` only when the user accepts no page-local SRT. - **Match the deck's tone** — pick the strongest recommendation based on style: - Consultant / data-driven / 财报 → 稳重男声(如 `zh-CN-YunjianNeural`)or 清晰女声(如 `zh-CN-XiaoxiaoNeural`) - General / 教学 / 产品介绍 → 明亮女声 / 年轻男声(如 `zh-CN-XiaoyiNeural` / `zh-CN-YunxiNeural`) @@ -132,7 +134,7 @@ Send a single message to the user that resolves all five configuration decisions > 直接回"好"用全部推荐值,或告诉我想改的部分(如"音色 2,语速 -5%"或"用 MiniMax 的 voice_id xxx")。 **Recommended-value rules**: -- 生成模式:默认 `edge`;当用户明确追求高质量云端音色或提供 cloud voice ID 时,按用户指定选 `elevenlabs` / `minimax` / `qwen` / `cosyvoice`。 +- 生成模式:默认 `edge`;用户指定 cloud provider / voice ID 时按其选择。需要逐页 SRT、字幕动画或视频字幕时不推荐 Qwen;用户坚持时,说明仅交付音频并跳过 SRT 步骤。 - 音色:从 Step 2 候选里挑最贴合 deck 调性的那一个。 - 语速:edge 默认 `+0%`;notes 字数密集(页均 >4 句长句)建议 `-5%`;notes 简短紧凑建议 `+5%`;超出此范围需说明理由。Cloud providers 默认用 provider defaults,除非用户明确要调速或改风格。 - 嵌入:默认推荐"是";除非用户已有定制 PPTX 不希望覆盖。 @@ -156,7 +158,7 @@ Run sequentially — do NOT bundle: python3 skills/ppt-master/scripts/notes_to_audio.py \ --voice --rate -# 1B. Or generate audio with ElevenLabs +# 1B. Or generate audio/SRT pairs with ElevenLabs python3 skills/ppt-master/scripts/notes_to_audio.py \ --provider elevenlabs --voice-id \ --elevenlabs-model eleven_multilingual_v2 @@ -167,17 +169,18 @@ python3 skills/ppt-master/scripts/notes_to_audio.py \ --provider minimax --voice-id \ --minimax-model speech-2.8-hd -# 1D. Or generate audio with Qwen TTS +# 1D. Or generate audio only with Qwen TTS (the API returns no timestamps) python3 skills/ppt-master/scripts/notes_to_audio.py \ --provider qwen --voice-id \ --qwen-model qwen3-tts-flash --qwen-language-type Chinese -# 1E. Or generate audio with CosyVoice +# 1E. Or generate audio/SRT pairs with a timestamp-capable CosyVoice voice python3 skills/ppt-master/scripts/notes_to_audio.py \ --provider cosyvoice --voice-id \ --cosyvoice-model cosyvoice-v3-flash -# 2A. When animations.json is active, author or refresh narration_timing.json +# 2A. Only when page-local SRT exists and animations.json is active, author or +# refresh narration_timing.json # by matching SVG group semantics to SRT topics, then derive the narrated # sidecar. Reuse current SVG semantics when complete; otherwise read only # the missing or stale svg_output pages. @@ -201,7 +204,8 @@ python3 skills/ppt-master/scripts/svg_to_pptx.py \ --recorded-narration audio --narration-padding 0.5 \ --no-animations -# 2C. Merge page-local SRT against timing values read from the final PPTX +# 2C. Only when page-local SRT exists, merge it against timing values read +# from the final PPTX python3 skills/ppt-master/scripts/narration_sync.py subtitles \ --pptx --force @@ -209,7 +213,8 @@ python3 skills/ppt-master/scripts/narration_sync.py subtitles \ python3 skills/ppt-master/scripts/powerpoint_video.py \ -o -# 2E. Align the frozen narration text against the finished video's audio track +# 2E. Only when page-local SRT exists, align the frozen narration text against +# the finished video's audio track python3 skills/ppt-master/scripts/video_subtitles.py \ --video --language --force ``` @@ -221,7 +226,13 @@ remain serial. If `notes_to_audio.py` errors with a missing dependency or missing provider API key, fix the prerequisite and re-run — do NOT swallow the error. -The edge command writes each MP3 and its internal page SRT from the same `edge-tts` stream. SRT cues use the service's `WordBoundary` timing: sentence-ending punctuation always closes a cue; text over the default 20-visible-character limit first splits at commas, semicolons, or colons, then at the nearest word boundary. Override the limit with `--subtitle-max-chars`. Adjacent timing overlap up to 100 ms is tolerated by moving the later cue start to the previous cue end; larger overlap fails instead of silently distorting timing. Each SRT uses a page-local timeline whose origin is `00:00:00,000`, including any leading silence before the first cue. Cloud-provider commands currently write audio only. +The edge command writes each MP3 and its internal page SRT from the same `edge-tts` stream. SRT cues use the service's `WordBoundary` timing: sentence-ending punctuation always closes a cue; text over the default 20-visible-character limit first splits at commas, semicolons, or colons, then at the nearest word boundary. Override the limit with `--subtitle-max-chars`. Adjacent timing overlap up to 100 ms is tolerated by moving the later cue start to the previous cue end; larger overlap fails instead of silently distorting timing. Each SRT uses a page-local timeline whose origin is `00:00:00,000`, including any leading silence before the first cue. + +MiniMax reads word timing from its synchronous subtitle file. ElevenLabs uses `/with-timestamps` and original-text character alignment. CosyVoice enables HTTP streaming plus `word_timestamp_enabled`, then uses the final audio URL and word timing from that synthesis; unsupported model/voice pairs fail without replacing the prior pair unless `--cosyvoice-audio-only` was explicit. Qwen exposes no timing, so it remains audio-only and this stage never estimates SRT timing. + +Provider-timed paths share punctuation-first, `--subtitle-max-chars`-bounded regrouping, exact-text validation, and rollback-safe pair publication. See [`docs/audio-narration.md`](../../../../docs/audio-narration.md) for current model and audio-parameter recommendations. + +Before generation starts, `notes_to_audio.py` removes stale `audio/manifest.json` and `audio/total.srt`; an incomplete run therefore cannot claim the previous set's provenance or merged timeline. A successful audio-only provider run also removes same-stem stale SRT files. The new manifest is published atomically only after the complete page roster succeeds. **Mandatory when `animations.json` is consumed — semantic animation context**: Before writing or refreshing `/narration_timing.json`, determine whether the active context already contains the current top-level SVG group IDs and visible group-content semantics for every affected page. Reuse that context without rereading SVG when it is complete and still matches the current `svg_output/`. If any page is missing, stale, or represented only by group IDs/order without content meaning, read only that page's SVG as a read-only source and extract the missing group semantics. Always combine those semantics with the page SRT topics/timestamps and `animations.json`; group order alone is not a semantic narration mapping. @@ -274,7 +285,7 @@ python3 skills/ppt-master/scripts/narration_sync.py fingerprint } ``` -`narration_sync.py subtitles` may still write `/notes/subtitles/total.srt` as a PPTX-timeline diagnostic. It is not the delivery subtitle for a finished video. +`narration_sync.py subtitles` may still write `/audio/total.srt` as a PPTX-timeline diagnostic. It is not the delivery subtitle for a finished video. When video export was selected, `powerpoint_video.py` opens the final narrated PPTX through local Windows PowerPoint, requests its native video encoder with recorded timings and narrations enabled, and polls `CreateVideoStatus` until the MP4 succeeds, fails, or times out. The interface is synchronous to its caller even though PowerPoint performs encoding asynchronously. It preserves PowerPoint's own animation and media behavior rather than re-rendering the deck. @@ -290,9 +301,11 @@ This stage keeps subtitles as external SRT files. It does not burn subtitles int | Caller | After audio generation | |---|---| -| Generate PPTX | With Edge SRT and an existing `animations.json`, derive `narration_animations.json`; with no sidecar, inherit the base report's resolved motion, while explicit all-motion-off uses `--no-animations`. Export with `--recorded-narration audio`, optionally continue through `powerpoint_video.py`, then generate the delivery SRT from the finished video. | +| Generate PPTX | With page-local SRT from Edge, ElevenLabs, MiniMax, or timestamp-capable CosyVoice and an existing `animations.json`, derive `narration_animations.json`; with no sidecar, inherit the base report's resolved motion, while explicit all-motion-off uses `--no-animations`. Export with `--recorded-narration audio`, optionally continue through `powerpoint_video.py`, then generate the delivery SRT from the finished video. | | Enhance Native PPTX | Return to [`native-enhance-pptx`](../native-enhance-pptx.md) Step 9; its `apply` command owns audio relationships, timings, transitions, and the enhanced export. If video was selected, pass that final PPTX to `powerpoint_video.py`. | +For Qwen or explicit CosyVoice audio-only mode, embed/export the audio normally but skip `narration_timing.json`, `narration_sync.py animations`, SRT merge, and final-video subtitle alignment. Never present those missing subtitle artifacts as generated. + For Generate PPTX, `--recorded-narration audio` prepares PowerPoint's recorded timings and narrations: every slide must have a matching supported audio file, every duration must be readable by `ffprobe`, and object animations must not use `--animation-trigger on-click`. Use `after-previous` or `with-previous` for narrated/video export. Narration changes the slide-advance layer only: the resolved page-transition effect remains unchanged, `-t none` remains visually transition-free, and narration advance disables click while using audio duration plus padding. The re-export is saved as `exports/__narrated.pptx`, telling it apart from silent exports. **Narrated SVG export**: use the default text-flow mode. It keeps authored line breaks in one editable, no-wrap text frame; narration does not require per-line text frames. @@ -304,9 +317,10 @@ For Generate PPTX, `--recorded-narration audio` prepares PowerPoint's recorded t Output one summary block listing: - Number of audio files generated and their location (`/audio/*`). -- For edge, number of matching page-local SRT files and their location (`/notes/subtitles/*`). +- For provider-timed subtitles, number of matching page-local SRT files and their location (`/audio/*`); for Qwen or explicit CosyVoice audio-only mode, report that no page-local SRT was generated. +- Narration provider/model plus the `/audio/manifest.json` provenance path. - For narrated object animation, whether current SVG semantics were reused or which missing/stale pages were reread, plus semantic mapping coverage and fallback count. -- For Generate PPTX with Edge SRT and canonical custom animation, derived narration animation group count and `narration_animations.json` path; otherwise report inherited base motion or explicit all-motion-off. +- For Generate PPTX with page-local SRT and canonical custom animation, derived narration animation group count and `narration_animations.json` path; otherwise report inherited base motion or explicit all-motion-off. - When video export was selected, the final MP4 path and native PowerPoint export status. - When a finished video exists, the final aligned sidecar SRT path. - The provider, voice, and rate/settings actually used. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/stages/resume-execute.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/stages/resume-execute.md index 0a237d58..e3e711f6 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/stages/resume-execute.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/stages/resume-execute.md @@ -39,7 +39,25 @@ Verify the project's planning-session artifacts before doing anything else: | `/design_spec.md` | Always | Complete approved design narrative and Section IX page outline; read it completely once in this fresh execution context | | `/images/` plus files whose row status requires existence | `spec_lock images` references any image | `Existing` / `Generated` / `Sourced` / `Rendered` files must exist; an absent `Needs-Manual` file remains allowed until the Step 7 readiness gate | | `/templates/` | `spec_lock page_layouts` references any | Layout / mirror prototypes required by execution | -| `skills/ppt-master/templates/charts/` | `spec_lock page_charts` references any | Shared chart SVGs selected by key | +| Resolver-returned Chart/Table SVG | `spec_lock page_visualizations` or legacy `page_charts` references a live Chart/Table key | Shared page-local SVG selected through the two live catalogs | + +Resolve every live Chart/Table value through the shared catalog resolver before +Step 6. Validate canonical `family/key` from `page_visualizations` directly; +opt into bare-key resolution only for a live Chart/Table value read from legacy +`page_charts`: + +```bash +python3 skills/ppt-master/scripts/visualization_recall.py validate \ + [ ...] +python3 skills/ppt-master/scripts/visualization_recall.py validate \ + --legacy-bare [ ...] +``` + +Require every returned SVG to exist. Never construct a path from the key, +guess a family directory, or prefer one registry. Failed, missing, or ambiguous +live resolution is a missing planning dependency and stops this stage. A +retired Structure bare key carries semantic intent only and requires no SVG; +recover its relationship from §IX, or return to Step 4 when §IX is insufficient. If any required artifact is missing, report it and stop this stage. Do not enter Step 6 or invent a replacement artifact. Recover by artifact owner: @@ -64,6 +82,7 @@ Then jump to `### Step 6: Executor Phase` and run the documented pipeline: from `spec_lock.md` - If resuming mid-deck, read the latest completed SVG and current image metadata when images are used - Read the complete Step 6 always-on core exactly as listed in [`generate-pptx.md`](../generate-pptx.md); for custom directions, reload every optional `*_references` file from `spec_lock.md` before applying the behavior, then only the branches selected by the condition table +- For each page, make the mandatory Structure decision from retained §IX after its content/communication move is established and before any geometry; a `yes` result loads `executor-structure.md` before realization and creates no artifact or lock row - Design Parameter Confirmation - When structured, read the template Design Spec and each selected prototype once; retain unchanged references in the fresh context. A later bounded repair follows [`executor-base.md`](../../references/executor-base.md) §2.1 only while that context remains valid and uncompacted - Generate pages sequentially from the retained planning artifacts. Use `page-context` only for the on-demand diagnostic/telemetry triggers in Executor §2.1, never as a routine pre-page load diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/stages/verify-charts.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/stages/verify-charts.md index 09ec600c..a1d94049 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/stages/verify-charts.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/stages/verify-charts.md @@ -1,10 +1,10 @@ --- -description: Conditional quality-gate stage for chart coordinate verification. +description: Conditional quality-gate stage for data-chart geometry and encoding verification. --- # Verify Charts Stage -> Conditional Generate-PPTX quality stage. Run after a deck containing data charts has finished SVG generation, before post-processing & export. Catches the 10–50 px coordinate errors AI models routinely introduce when mapping data to pixel positions. +> Conditional Generate-PPTX quality stage. Run after a deck containing data charts has finished SVG generation, before post-processing & export. Catches coordinate and visual-encoding errors introduced while mapping source values into SVG marks. In Default Generate this stage is **context-independent**: it reads `design_spec.md` and the generated SVGs, then runs the calculator script. The @@ -14,7 +14,7 @@ restart Quick rather than inventing a page plan from finished files. ## When to Run -- The deck contains one or more data visualization charts where source values determine SVG geometry: bar lengths/heights, point positions, arc angles, polygon vertices, connector endpoints, bubble centers/radii, or flow widths/paths. +- The deck contains one or more data visualization charts where source values determine SVG geometry or visual encoding: bar lengths/heights, point positions, arc angles, polygon vertices, connector endpoints, bubble centers/radii, flow widths/paths, cell colors, or word sizes. - SVGs are generated to `/svg_output/`. Default enters from its declared quality-gate order; Quick runs this stage before its one lockless final checker. - Post-processing (`finalize_svg.py`, `svg_to_pptx.py`) has **not yet** run. @@ -22,80 +22,84 @@ The calculator has direct CLI models for simple bars, lines/scatter, pie/donut, --- -## Step 1: Build the page list from the active profile authority +## Step 1: Build the chart-object list from the active profile authority -| Active profile | Page-list authority | +| Active profile | Object-list authority | |---|---| | Default Generate | `design_spec.md §IX` plus the legacy §VII fallback below | -| Quick Generate | The still-active page decisions that produced the SVGs, cross-checked against every `chart-plot-area` marker; no Design Spec, lock, or substitute planning artifact is created | +| Quick Generate | The still-active semantic object keys and page decisions that produced the SVGs, cross-checked against every `chart-plot-area` marker; no Design Spec, lock, or substitute planning artifact is created | For Default, read `/design_spec.md` §IX Content Outline as the -authoritative page roster and include every page whose `Visualization` -explicitly declares SVG geometry driven by data values. Cross-check §VII when -present to resolve a selected catalog key; absence from §VII means only that no -reusable reference was selected. For legacy specs, a real §VII data-chart row -may enumerate the page when its §IX block predates the explicit data-driven -declaration. +authoritative roster and include every semantic object key whose +`Visualization` entry declares SVG geometry driven by data values. Cross-check +§VII only to resolve a selected catalog reference; absence means no reusable +reference was selected. For a legacy spec whose §IX predates object keys, one +real §VII data-chart row may supply one legacy chart object for that page. -For Quick, enumerate every page the current agent just authored with -value-driven geometry, then search `svg_output/` once for `chart-plot-area` and -compare the marker pages one-for-one with that active list. Add a missing marker -before continuing; investigate an unexpected marker instead of silently adding -or dropping a page. Keep the list in active context only. +For Quick, enumerate every promoted chart object's semantic key and page, then +search `svg_output/` once for `chart-plot-area`. Compare objects and marker +wrappers one-for-one. Add a missing scoped marker before continuing; +investigate an unexpected marker instead of silently adding or dropping an +object. Keep the list in active context only. -Classify each included page into exactly one mode: +Classify each included chart object into exactly one mode: Incidental microvisuals not promoted under the active profile authority are not -inferred into this list. Default repairs that page's §IX `Visualization` first; +inferred into this list. Default repairs that object's §IX `Visualization` first; Quick makes the promotion decision immediately in active context and updates the SVG marker before verification. | Mode | `charts_index.json` keys | Notes | |------|--------------------------|-------| -| `direct-calc` | `column_chart`, `horizontal_bar_chart` | Use `calc bar`; add `--horizontal` for horizontal bars. | +| `direct-calc` | `column_chart`, `horizontal_bar_chart`, `histogram_chart` | Use `calc bar`; add `--horizontal` for horizontal bars. Histogram bins use contiguous bars on the numeric x-axis. | | `direct-calc` | `line_chart`, `area_chart`, `scatter_chart` | Use `calc line`; area uses line output as the top boundary, then closes to `y_max`. | | `direct-calc` | `pie_chart`, `donut_chart` | Use `calc pie`; donut passes `--inner-radius`. | | `direct-calc` | `radar_chart` | Use `calc radar`; separate subcommand, not under `calc pie`. | -| `decomposable-calc` | `stacked_bar_chart`, `stacked_area_chart`, `grouped_bar_chart`, `dumbbell_chart`, `pareto_chart`, `dual_axis_line_chart`, `bullet_chart`, `butterfly_chart`, `waterfall_chart`, `box_plot_chart`, `gantt_chart` | Verify by repeated direct calculations; see recipes below. | -| `partial-calc` | `bubble_chart` | Use `calc line` for `cx/cy`; verify radius only when a size scale is explicit. | -| `formula-verify` | `progress_bar_chart`, `gauge_chart`, `funnel_chart` | One-line math; record the formula and resulting length/angle/width in the receipt, no calculator call needed. | -| `manual-verify` | `sankey_chart`, `heatmap_chart`, `treemap_chart` | Data-driven geometry exists, but the current calculator has no complete layout model. Inspect and report; do not silently skip. | +| `decomposable-calc` | `stacked_bar_chart`, `stacked_area_chart`, `grouped_bar_chart`, `dumbbell_chart`, `pareto_chart`, `dual_axis_line_chart`, `bullet_chart`, `butterfly_chart`, `waterfall_chart`, `box_plot_chart`, `gantt_chart`, `bar_of_pie_chart`, `pie_of_pie_chart`, `stock_chart` | Verify by repeated direct calculations; see recipes below. | +| `partial-calc` | `bubble_chart`, `matrix_2x2` | Use `calc line` for x/y-driven `cx/cy`; verify radius only when a size scale is explicit. | +| `formula-verify` | `progress_bar_chart`, `gauge_chart`, `funnel_chart`, `sunburst_chart` | Record the formula and resulting length/angle/width in the receipt; sunburst verifies each ring's value-derived arc lengths and offsets. | +| `manual-verify` | `sankey_chart`, `heatmap_chart`, `treemap_chart`, `word_cloud` | Data-driven geometry or encoding exists, but the current calculator has no complete layout model. Inspect and report; do not silently skip. | -**Out of scope** (do not include in the receipt unless the page uses a data-driven sub-chart inside the layout): - -- Pure text/number dashboards: `kpi_cards`. -- Tables: `comparison_table`, `basic_table`, `consulting_table`, `project_schedule_table`, `financial_statement_table`, `feature_matrix_table`, `harvey_balls_table`. -- Information graphics / frameworks / diagrams whose positions are layout-driven rather than value-driven: e.g. `hub_spoke`, `hub_inward_arrows`, `quadrant_text_bullets`, `quadrant_bubble_scatter` (BCG-style four-quadrant text grid — the visual bubbles are decoration, not value-mapped points), `matrix_2x2` (fixed quadrant cells with text cards), `mind_map`, `process_flow`, `numbered_steps`, `timeline`, `roadmap_vertical`, `layered_architecture`, `module_composition`, `pipeline_with_stages`, `client_server_flow`, `top_down_tree`, `journey_map`, `agenda_list`. If a deck genuinely uses these as data-driven scatter (rare — values mapped to actual `cx/cy`), promote to `partial-calc` and explain in the receipt. +**Family boundary**: this table covers every canonical key in +`templates/charts/charts_index.json` exactly once. Do not put qualitative shape +composition or a Table reference in the receipt merely because it contains +shapes or numbers. Named quadrants are composed through +[`executor-structure.md`](../../references/executor-structure.md); +`chart/matrix_2x2` is reserved for plotted x/y and optional radius data. Every +embedded data chart is its own keyed §IX `Visualization` object. Resulting list: ``` -P03 03_market_share.svg type=bar mode=direct-calc -P07 07_growth.svg type=line mode=direct-calc -P11 11_share_split.svg type=pie mode=direct-calc -P15 15_pareto.svg type=pareto mode=decomposable-calc +P03 market-share 03_market_share.svg type=bar mode=direct-calc +P03 margin-trend 03_market_share.svg type=line mode=direct-calc +P11 share-split 11_share_split.svg type=pie mode=direct-calc +P15 pareto-causes 15_pareto.svg type=pareto mode=decomposable-calc ``` In Default, if §VII is absent, continue from §IX; this is the normal state when -all chart pages use custom structures. Do not guess from SVG content when §IX -declares no data-driven page. In Quick, do not treat marker search as a -replacement for the still-active authoring decisions; use it as the required -cross-check. +all chart objects use custom structures. Do not guess from SVG content when §IX +declares no data-driven object. In Quick, marker search is only the required +cross-check, never a replacement for active authoring decisions. -If the filtered list is empty, output `verify-charts: active profile declares no data-driven chart geometry, nothing to verify` and stop. +If the filtered list is empty, output `verify-charts: active profile declares no data-driven chart objects, nothing to verify` and stop. --- -## Step 2: Per page — read SVG, run calculator, compare, update +## Step 2: Per object — read its SVG scope, calculate, compare, update -For each page in the Step 1 list: +For each object in the Step 1 list: 1. Read `/svg_output/.svg`. -2. Locate the plot-area definition: - - Preferred: `` marker placed by Executor (see [executor-chart.md §2.1](../../references/executor-chart.md)). Read coordinates directly. - - If missing: derive the plot area from the SVG's axis lines (rectangular charts) or center/radius elements (radial charts). Then **add the marker back to the SVG** so future runs are not paying this cost again. -3. Read the data series from the SVG's `` label/value elements. -4. **Read axis tick labels for every axis-based chart.** Locate the `` elements along the value axis — X-axis labels for horizontal bars, Y-axis labels for vertical bars, and Y-axis labels for line-like charts. Extract the first and last tick values to determine the axis range (e.g. `0%` to `120%` → range `0,120`). Pass this range as `--value-range`, `--y-range`, or `--x-range` as appropriate. Use the attached `--*-range=min,max` form, which also keeps a negative minimum from being parsed as another option. Radar uses `--max-value` instead of a range: read the outermost ring's tick value and pass it as `--max-value`. If the SVG has no explicit tick labels (data labels only, no grid), omit the range and let the calculator auto-normalize — but flag the receipt as `scale=auto (no ticks)`. +2. Locate `` and its one plot-area marker. The marker + payload starts `chart-plot-area: object= |` and belongs inside + ``. Accept a legacy unscoped marker and + `id="chartArea"` only when the page has exactly one verified chart. A + multi-chart page may not mix scoped and unscoped markers. If a marker is + missing, derive it from that object's axes or center/radius and add the + scoped marker before continuing. +3. Read only that object's data series and label/value elements. +4. **Read axis tick labels for every axis-based chart inside the same object scope.** Locate the `` elements along the value axis — X-axis labels for horizontal bars, Y-axis labels for vertical bars, and Y-axis labels for line-like charts. Extract the first and last tick values to determine the axis range (e.g. `0%` to `120%` → range `0,120`). Pass this range as `--value-range`, `--y-range`, or `--x-range` as appropriate. Use the attached `--*-range=min,max` form, which also keeps a negative minimum from being parsed as another option. Radar uses `--max-value` instead of a range: read the outermost ring's tick value and pass it as `--max-value`. If the SVG has no explicit tick labels (data labels only, no grid), omit the range and let the calculator auto-normalize — but flag the receipt as `scale=auto (no ticks)`. **Local vs absolute coordinates.** Many chart templates wrap chart content in `` or similar, so child ``/``/`` coords are relative to that origin (e.g. radar polygon at `0,-198`, donut paths starting from `0,0` inside a translated ``, dumbbell circles at `cy="0"` inside a per-row translated ``). The calculator outputs **absolute** SVG coordinates. Before comparing, either add the wrapping translate's offset to the SVG coords or subtract it from the calculator's output — pick one direction and apply it consistently. 5. Run the matching calculator command: @@ -232,6 +236,11 @@ python3 skills/ppt-master/scripts/svg_position_calculator.py calc line \ **Gantt chart** — task bars where each bar's `x` and `x + width` are the start and end positions on a timeline axis: +This remains a Chart even when the source used a physical PowerPoint table for +the row grid. A qualitative stage/lane plan whose positions are not derived +from dates or durations uses [`executor-structure.md`](../../references/executor-structure.md) +and does not enter this verification stage. + 1. Read the timeline tick positions (the header row's x coordinates per date unit). Pixels-per-unit = `(x_unit_n - x_unit_1) / (n - 1)`. 2. Run `calc line` once over `start_index:row_y` per task — output `SVG_X` gives the bar's `x`. Run it again over `end_index:row_y` — output `SVG_X` gives `x + width`. Subtract for width. 3. Compare each task rect's `(x, width)` against the calculated start and end. Row y can be read directly (categories are not value-driven). @@ -243,52 +252,57 @@ python3 skills/ppt-master/scripts/svg_position_calculator.py calc line \ 3. Compare each waterfall rect's `(x, y, width, height)` against the calculated pair. Connector lines should run from `(x + width, top_or_bot[i].Y)` to `(x_next, top_or_bot[i+1].Y)` at the matching shared cumulative value. 4. Total bars (full-height start/end) use `bot = 0` and the calc reduces to the standard `calc bar` recipe. -**Bubble chart / quadrant bubble scatter** — partial calculator support: +**Bubble chart / plotted 2×2 matrix** — partial calculator support: 1. Use `calc line` to verify bubble centers (`cx/cy`) from the X/Y values and axis ticks. -2. Verify radius only if `design_spec.md`, `spec_lock.md`, the Quick active-context decision, or SVG comments declare a size scale such as `radius = sqrt(value) * k` or explicit min/max radius mapping. -3. If the size scale is missing, record `radius=manual (scale missing)` and inspect relative ordering by hand. +2. For `matrix_2x2`, verify that the axis midpoint matches the quadrant split. If the visible axes say only Low/High, read the explicit numeric mapping from the active §IX decision or SVG comment; without one, record `xy=manual (scale missing)` instead of inventing a range. +3. Verify radius only if `design_spec.md`, the Quick active-context decision, or SVG comments declare a size scale such as `radius = sqrt(value) * k` or explicit min/max radius mapping. `spec_lock.md` carries only the primary family/key reference and is not a size-scale authority. +4. If the size scale is missing, record `radius=manual (scale missing)` and inspect relative ordering by hand. -**Progress bar / gauge / funnel — formula-verify** (no calc call needed): +**Bar-of-pie / pie-of-pie** — decompose the primary and expanded views: + +1. Replace the expanded tail in the primary data with one aggregate tail value, then run `calc pie` for the main pie. +2. For `pie_of_pie_chart`, run `calc pie` again on the tail values at the secondary center/radius. For `bar_of_pie_chart`, verify each stacked detail height as `tail_value / sum(tail_values) × detail_height` and confirm the segments fill the declared detail bar without gaps or overlap. +3. Verify that the aggregate tail slice equals the sum of the expanded values and that connector endpoints touch the two declared plot regions. + +**Stock chart** — decompose each OHLC observation into four y-values: + +1. Read the shared price-axis range and ordered date positions. +2. Run `calc line` for open, high, low, and close using the same plot area and ranges. For each date, the wick spans `high_y` to `low_y`; the body spans `min(open_y, close_y)` to `max(open_y, close_y)`. +3. Verify the body color/direction against `close >= open`, and verify that every body stays within its wick. + +**Progress bar / gauge / funnel / sunburst — formula-verify** (no calc call needed): - Progress bar: `fill_width = value / max × track_width`. Read `value`, `max`, and `track_width` from the SVG; compute and compare against the fill rect's `width`. - Gauge: `needle_angle = start_angle + value / max × sweep_angle`. Read `start_angle` and `sweep_angle` from the SVG's arc path (e.g. half-circle `start_angle=-180`, `sweep_angle=180`). Compare against the needle's `transform="rotate(α ...)"` value (the most common form), or against endpoint `(cx + L·cos α, cy + L·sin α)` when the needle is drawn as an explicit line/path. - Funnel: each trapezoid's `top_width = prev.bottom_width`, `bottom_width = top_width × next_value / curr_value`. Verify by walking the segments: for segment `i`, `(top_left_x, top_right_x) → bottom_x_inset = (top_width - bottom_width) / 2`. The first segment's top width comes from the design's outer frame. +- Sunburst: for each ring, `circumference = 2πr` and each node's arc length is `node_value / root_total × circumference`; offsets follow cumulative sibling values plus any explicitly declared separator gap. Verify that child arcs remain inside their parent span and that sibling values sum to the parent. - Receipt should quote the formula and resulting value (e.g. `formula=value/max×track_width=0.92×700=644px`, or `formula=600×850/1000=510 bottom width`). -**Sankey / heatmap / treemap — manual verification:** +**Sankey / heatmap / treemap / word cloud — manual verification:** - Sankey: no layout model for node stacking, link routing, or flow-width normalization. Verify that link widths are proportional to flow values and that node-side totals match (in = out). - Heatmap: cell positions are a fixed grid (not value-driven); the value-to-color binning is what's data-driven. Verify that the color of each cell falls in the bin matching the cell's number, and that high/low extremes use the legend's high/low colors. - Treemap: rectangle areas reflect value proportions but the recursive squarify layout has no calculator equivalent. Verify each rect's `width × height ≈ total_area × value / sum(values)` for top-level cells, and that nested cells sum to their parent. +- Word cloud: verify that keyword font sizes are monotonic with their declared weights (or match the declared weight bins), then inspect the final text bounds for overlap and clipping. Position is layout-driven; do not invent a coordinate formula. --- -## Step 3: Per-page receipt +## Step 3: Per-object receipt -Output one line per page from the Step 1 list. Receipt count MUST equal Step 1 +Output one line per chart object from the Step 1 list. Include its semantic key; +receipt count MUST equal Step 1 list length — that is the gate-closing evidence. Quick does not persist these lines as a generation plan or resume record. ``` -verify-charts: 03_market_share.svg | type=bar | mode=direct-calc | scale=0-100 (from ticks) | calc=ran | svg=updated -verify-charts: 07_growth.svg | type=line | mode=direct-calc | scale=0-120 (from ticks) | calc=ran | svg=unchanged (already accurate) -verify-charts: 11_share_split.svg | type=pie | mode=direct-calc | scale=N/A | calc=ran | svg=updated | marker=added (was missing) -verify-charts: 14_revenue_mix.svg | type=stacked-bar | mode=decomposable-calc | scale=0-200 (from ticks) | calc=ran×3 | svg=updated (per stacked recipe) -verify-charts: 15_unit_economics.svg | type=stacked-area | mode=manual-verify | scale=N/A | reason=percent-stacked, recipe does not apply -verify-charts: 16_before_after.svg | type=dumbbell | mode=decomposable-calc | scale=0-100 (from ticks) | calc=ran×2 | svg=unchanged -verify-charts: 17_drivers_pareto.svg | type=pareto | mode=decomposable-calc | scale=left 0-80 / right 0-100 | calc=ran×2 | svg=updated -verify-charts: 18_market_bubbles.svg | type=bubble | mode=partial-calc | xy=ran | radius=manual (scale missing) | svg=unchanged -verify-charts: 20_quota_attainment.svg | type=bullet | mode=decomposable-calc | scale=0-120 (from ticks) | calc=ran×3 (bands+actual+target) | svg=updated -verify-charts: 21_inflow_outflow.svg | type=butterfly | mode=decomposable-calc | scale=0-500 (from ticks) | calc=ran×2 + mirror | svg=unchanged -verify-charts: 22_profit_bridge.svg | type=waterfall | mode=decomposable-calc | scale=0-500 (from ticks) | calc=ran×2 (top/bot) | svg=updated -verify-charts: 23_quarterly_progress.svg | type=progress | mode=formula-verify | formula=68/100×800=544px | svg=unchanged -verify-charts: 24_capacity_gauge.svg | type=gauge | mode=formula-verify | formula=-180+72/100×180=-50.4° | svg=updated -verify-charts: 25_conversion_funnel.svg | type=funnel | mode=formula-verify | formula=600×850/1000=510 (seg2 bottom width) | svg=unchanged -verify-charts: 26_regional_compare.svg | type=grouped-bar | mode=decomposable-calc | scale=0-500 (from ticks) | calc=ran×3 | svg=updated -verify-charts: 27_release_plan.svg | type=gantt | mode=decomposable-calc | scale=Week1-Week24 (24 ticks, 40px/unit) | calc=ran×2 (start/end) | svg=unchanged -verify-charts: 28_score_distribution.svg | type=boxplot | mode=decomposable-calc | scale=0-100 (from ticks) | calc=ran×4 (Q1/Q3/whiskers) | svg=updated -verify-charts: 19_flow.svg | type=sankey | mode=manual-verify | link widths consistent with values | svg=unchanged +verify-charts: 03_market_share.svg | object=market-share | type=bar | mode=direct-calc | scale=0-100 (from ticks) | calc=ran | svg=updated +verify-charts: 03_market_share.svg | object=margin-trend | type=line | mode=direct-calc | scale=0-120 (from ticks) | calc=ran | svg=unchanged +verify-charts: 11_share_split.svg | object=share-split | type=pie | mode=direct-calc | scale=N/A | calc=ran | svg=updated | marker=added +verify-charts: 14_revenue_mix.svg | object=revenue-mix | type=stacked-bar | mode=decomposable-calc | scale=0-200 (from ticks) | calc=ran×3 | svg=updated +verify-charts: 18_market_bubbles.svg | object=market-bubbles | type=bubble | mode=partial-calc | xy=ran | radius=manual (scale missing) | svg=unchanged +verify-charts: 23_quarterly_progress.svg | object=quarterly-progress | type=progress | mode=formula-verify | formula=68/100×800=544px | svg=unchanged +verify-charts: 19_flow.svg | object=flow | type=sankey | mode=manual-verify | link widths consistent with values | svg=unchanged ``` --- diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/stages/visual-review.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/stages/visual-review.md index cbd86d3e..f35d44c0 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/stages/visual-review.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/workflows/stages/visual-review.md @@ -6,7 +6,7 @@ description: Optional quality-gate stage for per-page rubric-based visual review > Optional Generate-PPTX quality stage. Goal: reduce human iteration by letting AI subagents visually self-check each rendered slide against a fixed rubric and apply atomic position/spacing fixes. > -> Reads `/svg_output/.svg` and a pre-rendered PNG of each slide, then either applies a fix or flags `needs_human`. When an installed/fused Style exists, it also reads that workspace's `Review Focus` as supplemental acceptance context. **Never touches** brand decisions, layout structure, or other files. +> Reads `/svg_output/.svg` and a pre-rendered PNG of each slide, then either applies a fix or flags `needs_human`. When an installed Style exists, it also reads that workspace's `Review Focus` as supplemental acceptance context. **Never touches** brand decisions, layout structure, or other files. > > This stage is **context-independent** — invokable in a fresh chat session with only `` as input. No upstream conversation context required. @@ -75,7 +75,7 @@ If any page comes back with `"all_background": true` in the JSON summary, that p Create a team and dispatch one orchestrator agent. The orchestrator partitions the N pages into batches of ≤ K pages (default **K = 5**) and spawns one subagent per batch **in parallel** (single message, `ceil(N/K)` parallel `Agent` calls). Each batch subagent reads the fixed inputs (rubric + `design_spec.md` + `spec_lock.md` + conditional Style Review Focus) **once**, then iterates over its assigned pages sequentially. -Before dispatch, inspect `/templates/design_spec.md`. If it declares `kind: style` or its fused provenance contains an active Style segment, read only `## VII. Review Focus` once and include those checks in every batch prompt. Otherwise pass no Style supplement. This lookup never triggers visual review; it runs only after the user has already activated this stage. The supplement cannot weaken the fixed rubric or widen edit permissions. +Before dispatch, look for `/templates/design_spec.style.*.md`. For each one found, read only its `## VII. Review Focus` once and include those checks in every batch prompt. Otherwise pass no Style supplement. This lookup never triggers visual review; it runs only after the user has already activated this stage. The supplement cannot weaken the fixed rubric or widen edit permissions. ```text TeamCreate(team_name="visual-review-", agent_type="orchestrator") @@ -96,7 +96,7 @@ The orchestrator prompt must be self-contained and is the **single** place where - Path to the rubric: `skills/ppt-master/references/visual-review.md` - Style Review Focus excerpt, only when the conditional lookup above found one; preserve its wording and source path - Dispatch contract reference: rubric [§6](../../references/visual-review.md#6-dispatch--messaging-contract) (batched parallel spawn, self-contained prompts, mandatory `SendMessage` on idle, anonymous-name tolerance) -- Subagent forbid list: do not edit any other page, `design_spec.md`, `spec_lock.md`, `templates/design_spec.md`, `animations.json`, `image_prompts.json`, or `images/` +- Subagent forbid list: do not edit any other page, `design_spec.md`, `spec_lock.md`, anything under `templates/`, `animations.json`, `image_prompts.json`, or `images/` **Host compatibility**: `TeamCreate` and `SendMessage` are Claude-Code-specific multi-agent primitives. On hosts without those primitives (Cursor, VS Code + Copilot, Codebuddy, etc.) the main agent processes batches sequentially — same partitioning, same per-batch prompts, no parallel dispatch. Token savings from shared fixed inputs still apply; wall-clock time grows roughly N/K-fold. diff --git a/plugins/codex/plugins/shadcn/THIRD_PARTY_SOURCE.json b/plugins/codex/plugins/shadcn/THIRD_PARTY_SOURCE.json index 44d0f1ea..588c7c29 100644 --- a/plugins/codex/plugins/shadcn/THIRD_PARTY_SOURCE.json +++ b/plugins/codex/plugins/shadcn/THIRD_PARTY_SOURCE.json @@ -2,8 +2,8 @@ "sourceId": "shadcn", "repo": "https://github.com/shadcn-ui/ui.git", "ref": "main", - "commit": "9846e22ce52c723554742860a0dbd3e5cf19b573", + "commit": "6261bd89f72d794aea491482cc2acfd8dc3d63e2", "adapter": "claude-skill", "sourcePath": "skills/shadcn", - "syncedAt": "2026-08-06T16:00:02Z" + "syncedAt": "2026-08-08T16:00:01Z" }