From bfe3759cdd9c6d9b9d4fdae2f908eae02ac0f79d Mon Sep 17 00:00:00 2001 From: KeyInfo Bot Date: Mon, 6 Jul 2026 09:53:32 +0800 Subject: [PATCH] Allow empty Superpowers hooks manifest Publish the completed third-party source refresh after Superpowers 6.1.1 changed its Codex manifest to use an empty no-op hooks object instead of a hooks file path. Constraint: Current Codex CLI installs superpowers@eapil-skill-market with hooks: {}, while the marketplace validator still rejected empty inline hooks objects. Rejected: Restore the old hooks directory by hand | Upstream no longer declares those Codex hook files, and hand-restoring generated content would drift from source. Confidence: high Scope-risk: moderate Directive: Empty hooks objects are placeholders; allow them but do not count them as the plugin's only effective component. Tested: /Users/eapil/git/keyinfo/.venv/bin/python3 scripts/validate_marketplace.py; rg public-secret scan; git diff --check; Codex temp CODEX_HOME marketplace add/list/add superpowers@eapil-skill-market. Not-tested: Interactive Superpowers skill invocation inside a live Codex thread. --- .agents/plugins/marketplace.json | 48 +- config/external-sources.lock.json | 24 +- .../codex/.agents/plugins/marketplace.json | 48 +- .../plugins/mcp-playwright/MCP_SOURCE.json | 2 +- .../next-skills/THIRD_PARTY_SOURCE.json | 4 +- .../oh-my-codex/.codex-plugin/plugin.json | 2 +- .../oh-my-codex/THIRD_PARTY_SOURCE.json | 4 +- .../oh-my-codex/hooks/codex-native-hook.mjs | 26 +- .../oh-my-codex/skills/code-review/SKILL.md | 16 + .../oh-my-codex/skills/ultragoal/SKILL.md | 23 + .../ultrawork/references/agent-tiers.md | 5 +- plugins/codex/plugins/ppt-master/README.md | 128 +- .../ppt-master/THIRD_PARTY_SOURCE.json | 4 +- .../ppt-master/skills/ppt-master/SKILL.md | 130 +- .../references/artifact-ownership.md | 10 +- .../ppt-master/references/executor-base.md | 35 +- .../ppt-master/references/image-base.md | 4 +- .../ppt-master/references/image-generator.md | 2 +- .../references/image-layout-patterns.md | 2 + .../references/image-layout-spec.md | 2 +- .../ppt-master/references/shared-standards.md | 227 +++- .../ppt-master/references/strategist.md | 63 +- .../references/svg-image-embedding.md | 13 +- .../references/template-designer.md | 2 +- .../skills/ppt-master/requirements.txt | 1 + .../skills/ppt-master/scripts/README.md | 12 +- .../ppt-master/scripts/batch_validate.py | 4 +- .../ppt-master/scripts/confirm_ui/__init__.py | 2 +- .../ppt-master/scripts/confirm_ui/server.py | 245 +++- .../scripts/confirm_ui/static/app.js | 1009 ++++++++++++-- .../scripts/confirm_ui/static/catalogs.json | 214 ++- .../scripts/confirm_ui/static/index.html | 55 +- .../scripts/confirm_ui/static/style.css | 540 +++++++- .../static/style_previews/blueprint.svg | 39 + .../static/style_previews/brutalist.svg | 31 + .../static/style_previews/chalkboard.svg | 23 + .../static/style_previews/dark-tech.svg | 31 + .../static/style_previews/data-journalism.svg | 41 + .../static/style_previews/editorial.svg | 22 + .../static/style_previews/glassmorphism.svg | 31 + .../static/style_previews/ink-notes.svg | 16 + .../static/style_previews/ink-wash.svg | 18 + .../static/style_previews/memphis.svg | 25 + .../static/style_previews/paper-cut.svg | 16 + .../static/style_previews/photo-editorial.svg | 27 + .../static/style_previews/pixel-art.svg | 28 + .../static/style_previews/sketch-notes.svg | 20 + .../static/style_previews/soft-rounded.svg | 32 + .../static/style_previews/swiss-minimal.svg | 15 + .../static/style_previews/vintage-poster.svg | 18 + .../confirm_ui/static/style_previews/zine.svg | 26 + .../ppt-master/scripts/docs/confirm_ui.md | 54 +- .../ppt-master/scripts/docs/conversion.md | 84 +- .../skills/ppt-master/scripts/docs/project.md | 6 +- .../ppt-master/scripts/docs/svg-pipeline.md | 26 +- .../skills/ppt-master/scripts/error_helper.py | 15 +- .../skills/ppt-master/scripts/finalize_svg.py | 8 +- .../scripts/native_narration_pptx.py | 10 +- .../scripts/pptx_to_svg/custgeom_to_svg.py | 2 +- .../scripts/pptx_to_svg/effect_to_svg.py | 2 +- .../scripts/pptx_to_svg/emu_units.py | 2 +- .../scripts/pptx_to_svg/ln_to_svg.py | 2 +- .../scripts/pptx_to_svg/txbody_to_svg.py | 4 +- .../ppt-master/scripts/project_manager.py | 156 +-- .../ppt-master/scripts/project_utils.py | 33 +- .../ppt-master/scripts/resource_paths.py | 88 ++ .../skills/ppt-master/scripts/source_to_md.py | 505 +++++++ .../ppt-master/scripts/source_to_md/_batch.py | 150 ++ .../source_to_md/_conversion_profile.py | 235 ++++ .../scripts/source_to_md/_dispatcher.py | 187 +++ .../scripts/source_to_md/doc_to_md.py | 214 ++- .../scripts/source_to_md/excel_to_md.py | 44 +- .../scripts/source_to_md/pdf_to_md.py | 102 +- .../scripts/source_to_md/ppt_to_md.py | 68 +- .../scripts/source_to_md/web_to_md.py | 50 +- .../scripts/svg_editor/static/app.js | 214 ++- .../scripts/svg_editor/static/index.html | 9 +- .../scripts/svg_editor/static/style.css | 42 +- .../svg_finalize/align_embed_images.py | 39 + .../scripts/svg_finalize/embed_icons.py | 59 +- .../scripts/svg_finalize/embed_images.py | 13 + .../scripts/svg_position_calculator.py | 15 +- .../ppt-master/scripts/svg_quality_checker.py | 539 +++++--- .../scripts/svg_to_pptx/__init__.py | 6 +- .../scripts/svg_to_pptx/animation_config.py | 2 +- .../scripts/svg_to_pptx/drawingml/__init__.py | 1 + .../context.py} | 12 + .../converter.py} | 81 +- .../elements.py} | 218 +-- .../paths.py} | 2 +- .../styles.py} | 12 +- .../utils.py} | 143 +- .../svg_to_pptx/native_objects/__init__.py | 229 ++++ .../svg_to_pptx/native_objects/chart_data.py | 800 +++++++++++ .../svg_to_pptx/native_objects/chart_style.py | 776 +++++++++++ .../svg_to_pptx/native_objects/chart_xml.py | 1209 +++++++++++++++++ .../svg_to_pptx/native_objects/chartex.py | 250 ++++ .../native_objects/marker_common.py | 705 ++++++++++ .../svg_to_pptx/native_objects/table.py | 406 ++++++ .../svg_to_pptx/native_objects/workbook.py | 187 +++ .../svg_to_pptx/pptx_package/__init__.py | 1 + .../builder.py} | 74 +- .../{pptx_cli.py => pptx_package/cli.py} | 43 +- .../dimensions.py} | 69 +- .../discovery.py} | 4 +- .../{pptx_media.py => pptx_package/media.py} | 0 .../narration.py} | 19 +- .../{pptx_notes.py => pptx_package/notes.py} | 2 +- .../slide_xml.py} | 0 .../scripts/svg_to_pptx/use_expander.py | 18 +- .../scripts/template_fill_pptx/notes.py | 2 +- .../skills/ppt-master/scripts/update_repo.py | 80 +- .../ppt-master/scripts/visual_review.py | 5 +- .../templates/charts/CHART_STYLE_GUIDE.md | 2 +- .../ppt-master/templates/charts/README.md | 17 +- .../templates/charts/area_chart.svg | 18 + .../templates/charts/bar_of_pie_chart.svg | 85 ++ .../templates/charts/basic_table.svg | 79 ++ .../templates/charts/box_plot_chart.svg | 20 + .../templates/charts/bubble_chart.svg | 21 + .../templates/charts/charts_index.json | 37 +- .../{bar_chart.svg => column_chart.svg} | 21 +- .../templates/charts/donut_chart.svg | 17 + .../templates/charts/dual_axis_line_chart.svg | 29 + .../charts/financial_statement_table.svg | 118 ++ .../templates/charts/funnel_chart.svg | 15 + .../templates/charts/grouped_bar_chart.svg | 19 + .../templates/charts/histogram_chart.svg | 84 ++ .../templates/charts/horizontal_bar_chart.svg | 26 + .../templates/charts/line_chart.svg | 19 + .../templates/charts/pareto_chart.svg | 15 + .../ppt-master/templates/charts/pie_chart.svg | 17 + .../templates/charts/pie_of_pie_chart.svg | 83 ++ .../templates/charts/radar_chart.svg | 18 + .../templates/charts/scatter_chart.svg | 26 + .../templates/charts/stacked_area_chart.svg | 21 + .../templates/charts/stacked_bar_chart.svg | 21 + .../templates/charts/stock_chart.svg | 97 ++ .../templates/charts/sunburst_chart.svg | 112 ++ .../templates/charts/treemap_chart.svg | 19 + .../templates/charts/waterfall_chart.svg | 16 + .../ppt-master/templates/decks/README.md | 2 +- .../templates/design_spec_reference.md | 8 +- .../ppt-master/templates/layouts/README.md | 2 +- .../templates/spec_lock_reference.md | 6 +- .../ppt-master/workflows/beautify-pptx.md | 14 +- .../ppt-master/workflows/create-template.md | 2 +- .../ppt-master/workflows/failure-recovery.md | 8 +- .../skills/ppt-master/workflows/index.md | 4 +- .../ppt-master/workflows/live-preview.md | 2 +- .../ppt-master/workflows/refine-spec.md | 10 +- .../ppt-master/workflows/resume-execute.md | 16 +- .../skills/ppt-master/workflows/routing.md | 6 +- .../ppt-master/workflows/verify-charts.md | 4 +- .../plugins/shadcn/THIRD_PARTY_SOURCE.json | 4 +- .../plugins/shadcn/skills/shadcn/SKILL.md | 8 + .../shadcn/skills/shadcn/evals/evals.json | 30 + .../shadcn/skills/shadcn/rules/chat.md | 224 +++ .../shadcn/skills/shadcn/rules/composition.md | 6 + .../shadcn/skills/shadcn/rules/styling.md | 23 + .../superpowers/.codex-plugin/plugin.json | 4 +- plugins/codex/plugins/superpowers/README.md | 16 +- .../superpowers/THIRD_PARTY_SOURCE.json | 4 +- .../superpowers/hooks/hooks-codex.json | 16 - .../superpowers/hooks/hooks-cursor.json | 10 - .../plugins/superpowers/hooks/hooks.json | 16 - .../plugins/superpowers/hooks/run-hook.cmd | 46 - .../plugins/superpowers/hooks/session-start | 49 - .../superpowers/hooks/session-start-codex | 26 - .../skills/brainstorming/visual-companion.md | 7 - .../skills/executing-plans/SKILL.md | 2 +- .../skills/using-superpowers/SKILL.md | 93 +- .../references/antigravity-tools.md | 75 +- .../references/claude-code-tools.md | 50 - .../references/codex-tools.md | 35 +- .../references/copilot-tools.md | 49 - .../references/gemini-tools.md | 63 - .../using-superpowers/references/pi-tools.md | 12 - .../skills/writing-skills/SKILL.md | 2 +- plugins/codex/plugins/ui-ux-pro-max/README.md | 39 +- .../ui-ux-pro-max/THIRD_PARTY_SOURCE.json | 4 +- .../skills/ui-ux-pro-max/SKILL.md | 24 + .../skills/ui-ux-pro-max/data/motion.csv | 17 + .../skills/ui-ux-pro-max/data/products.csv | 4 +- .../ui-ux-pro-max/data/stacks/angular.csv | 88 +- .../ui-ux-pro-max/data/stacks/astro.csv | 22 +- .../ui-ux-pro-max/data/stacks/laravel.csv | 48 +- .../skills/ui-ux-pro-max/data/styles.csv | 6 +- .../skills/ui-ux-pro-max/data/typography.csv | 147 +- .../skills/ui-ux-pro-max/scripts/core.py | 6 + .../ui-ux-pro-max/scripts/design_system.py | 214 ++- .../skills/ui-ux-pro-max/scripts/search.py | 21 +- scripts/validate_marketplace.py | 33 +- 193 files changed, 12300 insertions(+), 2097 deletions(-) create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/confirm_ui/static/style_previews/blueprint.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/confirm_ui/static/style_previews/brutalist.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/confirm_ui/static/style_previews/chalkboard.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/confirm_ui/static/style_previews/dark-tech.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/confirm_ui/static/style_previews/data-journalism.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/confirm_ui/static/style_previews/editorial.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/confirm_ui/static/style_previews/glassmorphism.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/confirm_ui/static/style_previews/ink-notes.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/confirm_ui/static/style_previews/ink-wash.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/confirm_ui/static/style_previews/memphis.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/confirm_ui/static/style_previews/paper-cut.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/confirm_ui/static/style_previews/photo-editorial.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/confirm_ui/static/style_previews/pixel-art.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/confirm_ui/static/style_previews/sketch-notes.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/confirm_ui/static/style_previews/soft-rounded.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/confirm_ui/static/style_previews/swiss-minimal.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/confirm_ui/static/style_previews/vintage-poster.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/confirm_ui/static/style_previews/zine.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/resource_paths.py create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/source_to_md.py create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/source_to_md/_batch.py create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/source_to_md/_conversion_profile.py create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/source_to_md/_dispatcher.py create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx/drawingml/__init__.py rename plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx/{drawingml_context.py => drawingml/context.py} (91%) rename plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx/{drawingml_converter.py => drawingml/converter.py} (89%) rename plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx/{drawingml_elements.py => drawingml/elements.py} (93%) rename plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx/{drawingml_paths.py => drawingml/paths.py} (99%) rename plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx/{drawingml_styles.py => drawingml/styles.py} (98%) rename plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx/{drawingml_utils.py => drawingml/utils.py} (79%) create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx/native_objects/__init__.py create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx/native_objects/chart_data.py create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx/native_objects/chart_style.py create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx/native_objects/chart_xml.py create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx/native_objects/chartex.py create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx/native_objects/marker_common.py create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx/native_objects/table.py create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx/native_objects/workbook.py create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx/pptx_package/__init__.py rename plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx/{pptx_builder.py => pptx_package/builder.py} (94%) rename plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx/{pptx_cli.py => pptx_package/cli.py} (93%) rename plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx/{pptx_dimensions.py => pptx_package/dimensions.py} (73%) rename plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx/{pptx_discovery.py => pptx_package/discovery.py} (94%) rename plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx/{pptx_media.py => pptx_package/media.py} (100%) rename plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx/{pptx_narration.py => pptx_package/narration.py} (88%) rename plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx/{pptx_notes.py => pptx_package/notes.py} (99%) rename plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/svg_to_pptx/{pptx_slide_xml.py => pptx_package/slide_xml.py} (100%) create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/bar_of_pie_chart.svg rename plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/{bar_chart.svg => column_chart.svg} (92%) create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/histogram_chart.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/pie_of_pie_chart.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/stock_chart.svg create mode 100644 plugins/codex/plugins/ppt-master/skills/ppt-master/templates/charts/sunburst_chart.svg create mode 100644 plugins/codex/plugins/shadcn/skills/shadcn/rules/chat.md delete mode 100644 plugins/codex/plugins/superpowers/hooks/hooks-codex.json delete mode 100644 plugins/codex/plugins/superpowers/hooks/hooks-cursor.json delete mode 100644 plugins/codex/plugins/superpowers/hooks/hooks.json delete mode 100755 plugins/codex/plugins/superpowers/hooks/run-hook.cmd delete mode 100755 plugins/codex/plugins/superpowers/hooks/session-start delete mode 100755 plugins/codex/plugins/superpowers/hooks/session-start-codex delete mode 100644 plugins/codex/plugins/superpowers/skills/using-superpowers/references/claude-code-tools.md delete mode 100644 plugins/codex/plugins/superpowers/skills/using-superpowers/references/copilot-tools.md delete mode 100644 plugins/codex/plugins/superpowers/skills/using-superpowers/references/gemini-tools.md create mode 100644 plugins/codex/plugins/ui-ux-pro-max/skills/ui-ux-pro-max/data/motion.csv diff --git a/.agents/plugins/marketplace.json b/.agents/plugins/marketplace.json index ecb81dc9a..f08fc4b1d 100644 --- a/.agents/plugins/marketplace.json +++ b/.agents/plugins/marketplace.json @@ -196,18 +196,6 @@ }, "category": "多媒体与生成" }, - { - "name": "superpowers", - "source": { - "source": "local", - "path": "./plugins/codex/plugins/superpowers" - }, - "policy": { - "installation": "AVAILABLE", - "authentication": "ON_INSTALL" - }, - "category": "开发工具" - }, { "name": "frontend-slides", "source": { @@ -256,6 +244,30 @@ }, "category": "知识库与检索" }, + { + "name": "superpowers", + "source": { + "source": "local", + "path": "./plugins/codex/plugins/superpowers" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "category": "开发工具" + }, + { + "name": "shadcn", + "source": { + "source": "local", + "path": "./plugins/codex/plugins/shadcn" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "category": "开发工具" + }, { "name": "oh-my-codex", "source": { @@ -280,18 +292,6 @@ }, "category": "设计" }, - { - "name": "shadcn", - "source": { - "source": "local", - "path": "./plugins/codex/plugins/shadcn" - }, - "policy": { - "installation": "AVAILABLE", - "authentication": "ON_INSTALL" - }, - "category": "开发工具" - }, { "name": "ppt-master", "source": { diff --git a/config/external-sources.lock.json b/config/external-sources.lock.json index 8d58ef369..d88d05262 100644 --- a/config/external-sources.lock.json +++ b/config/external-sources.lock.json @@ -6,8 +6,8 @@ "repo": "https://github.com/obra/superpowers.git", "ref": "main", "adapter": "codex-plugin", - "commit": "896224c4b1879920ab573417e68fd51d2ccc9072", - "syncedAt": "2026-06-19T16:00:00Z" + "commit": "d884ae04edebef577e82ff7c4e143debd0bbec99", + "syncedAt": "2026-07-03T16:00:00Z" }, { "id": "oh-my-codex", @@ -15,8 +15,8 @@ "repo": "https://github.com/Yeachan-Heo/oh-my-codex.git", "ref": "main", "adapter": "codex-plugin", - "commit": "d96b698c5f2fabc85c890f7b8fcdc6e02f253ec7", - "syncedAt": "2026-06-27T16:00:00Z" + "commit": "f947e3a41c062c25fd107686862b68ee5d1b66a5", + "syncedAt": "2026-07-05T16:00:01Z" }, { "id": "ui-ux-pro-max", @@ -24,8 +24,8 @@ "repo": "https://github.com/nextlevelbuilder/ui-ux-pro-max-skill.git", "ref": "main", "adapter": "claude-skill", - "commit": "8a81ed60272d21d4b8808f7308d49a0b1b000555", - "syncedAt": "2026-06-28T16:00:00Z" + "commit": "4baa399d00da806f83ed93652172f66943205153", + "syncedAt": "2026-07-05T16:00:01Z" }, { "id": "shadcn", @@ -33,8 +33,8 @@ "repo": "https://github.com/shadcn-ui/ui.git", "ref": "main", "adapter": "claude-skill", - "commit": "af79276f7e43ccb40059f7db67f9ff42afa0e174", - "syncedAt": "2026-06-29T15:59:59Z" + "commit": "d0fae528221011f75a8c64a917073904c2847493", + "syncedAt": "2026-07-03T16:00:00Z" }, { "id": "frontend-slides", @@ -69,8 +69,8 @@ "repo": "https://github.com/hugohe3/ppt-master.git", "ref": "main", "adapter": "claude-skill", - "commit": "f888bff138f96e9e5e2e43f8c90c66695e979f60", - "syncedAt": "2026-06-29T15:59:59Z" + "commit": "eb9243be673d0019dc1c7998262214a9a977a7d4", + "syncedAt": "2026-07-05T16:00:01Z" }, { "id": "next-skills", @@ -78,8 +78,8 @@ "repo": "https://github.com/vercel/next.js.git", "ref": "canary", "adapter": "skill-collection", - "commit": "1682685a357bb219a07499f1f846603d430ef796", - "syncedAt": "2026-06-29T15:59:59Z" + "commit": "00598045032a0e5b313de7b6ef0af60ed9390c2a", + "syncedAt": "2026-07-05T16:00:01Z" } ] } diff --git a/plugins/codex/.agents/plugins/marketplace.json b/plugins/codex/.agents/plugins/marketplace.json index 104bc479a..70aa49c54 100644 --- a/plugins/codex/.agents/plugins/marketplace.json +++ b/plugins/codex/.agents/plugins/marketplace.json @@ -196,18 +196,6 @@ }, "category": "多媒体与生成" }, - { - "name": "superpowers", - "source": { - "source": "local", - "path": "./plugins/superpowers" - }, - "policy": { - "installation": "AVAILABLE", - "authentication": "ON_INSTALL" - }, - "category": "开发工具" - }, { "name": "frontend-slides", "source": { @@ -256,6 +244,30 @@ }, "category": "知识库与检索" }, + { + "name": "superpowers", + "source": { + "source": "local", + "path": "./plugins/superpowers" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "category": "开发工具" + }, + { + "name": "shadcn", + "source": { + "source": "local", + "path": "./plugins/shadcn" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "category": "开发工具" + }, { "name": "oh-my-codex", "source": { @@ -280,18 +292,6 @@ }, "category": "设计" }, - { - "name": "shadcn", - "source": { - "source": "local", - "path": "./plugins/shadcn" - }, - "policy": { - "installation": "AVAILABLE", - "authentication": "ON_INSTALL" - }, - "category": "开发工具" - }, { "name": "ppt-master", "source": { diff --git a/plugins/codex/plugins/mcp-playwright/MCP_SOURCE.json b/plugins/codex/plugins/mcp-playwright/MCP_SOURCE.json index 272e9e74f..e46a7c913 100644 --- a/plugins/codex/plugins/mcp-playwright/MCP_SOURCE.json +++ b/plugins/codex/plugins/mcp-playwright/MCP_SOURCE.json @@ -3,5 +3,5 @@ "name": "playwright浏览器自动化操作", "version": "20260605", "keySource": "none", - "syncedAt": "2026-06-29T16:01:28Z" + "syncedAt": "2026-07-05T16:01:18Z" } diff --git a/plugins/codex/plugins/next-skills/THIRD_PARTY_SOURCE.json b/plugins/codex/plugins/next-skills/THIRD_PARTY_SOURCE.json index 2662127fc..b4fa1d295 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": "1682685a357bb219a07499f1f846603d430ef796", + "commit": "00598045032a0e5b313de7b6ef0af60ed9390c2a", "adapter": "skill-collection", "sourcePath": "skills", - "syncedAt": "2026-06-29T15:59:59Z" + "syncedAt": "2026-07-05T16:00:01Z" } diff --git a/plugins/codex/plugins/oh-my-codex/.codex-plugin/plugin.json b/plugins/codex/plugins/oh-my-codex/.codex-plugin/plugin.json index 14104b48a..5e3110661 100644 --- a/plugins/codex/plugins/oh-my-codex/.codex-plugin/plugin.json +++ b/plugins/codex/plugins/oh-my-codex/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "oh-my-codex", - "version": "0.18.16", + "version": "0.19.0", "description": "oh-my-codex 是 Codex CLI 的多 Agent 编排、结构化工作流、插件级 hooks、MCP 和 HUD 扩展插件。", "author": { "name": "Yeachan Heo", diff --git a/plugins/codex/plugins/oh-my-codex/THIRD_PARTY_SOURCE.json b/plugins/codex/plugins/oh-my-codex/THIRD_PARTY_SOURCE.json index ea26718b3..7fab0f054 100644 --- a/plugins/codex/plugins/oh-my-codex/THIRD_PARTY_SOURCE.json +++ b/plugins/codex/plugins/oh-my-codex/THIRD_PARTY_SOURCE.json @@ -2,8 +2,8 @@ "sourceId": "oh-my-codex", "repo": "https://github.com/Yeachan-Heo/oh-my-codex.git", "ref": "main", - "commit": "d96b698c5f2fabc85c890f7b8fcdc6e02f253ec7", + "commit": "f947e3a41c062c25fd107686862b68ee5d1b66a5", "adapter": "codex-plugin", "sourcePath": "plugins/oh-my-codex", - "syncedAt": "2026-06-27T16:00:00Z" + "syncedAt": "2026-07-05T16:00:01Z" } diff --git a/plugins/codex/plugins/oh-my-codex/hooks/codex-native-hook.mjs b/plugins/codex/plugins/oh-my-codex/hooks/codex-native-hook.mjs index e0c80ec9c..356bc23a7 100644 --- a/plugins/codex/plugins/oh-my-codex/hooks/codex-native-hook.mjs +++ b/plugins/codex/plugins/oh-my-codex/hooks/codex-native-hook.mjs @@ -162,6 +162,23 @@ function writeStopFallback(stopReason, detail) { process.exitCode = 0; } +function writeOversizedStopFallback(stopReason, detail) { + const reason = + 'OMX plugin Stop rejected oversized stdin before launcher delegation; continue once with a smaller valid Stop JSON response.'; + process.stdout.write(`${JSON.stringify({ + decision: 'block', + reason, + stopReason, + systemMessage: detail ? `${reason} Failure: ${detail}` : reason, + })}\n`); + process.exitCode = 0; +} + +function writeOversizedStopNoop() { + process.stdout.write('{}\n'); + process.exitCode = 0; +} + function writeCompactFallback() { process.exitCode = 0; } @@ -321,11 +338,6 @@ function parseSingleJsonObjectOutput(raw) { } } -function writeJsonNoop() { - process.stdout.write(`${JSON.stringify({})}\n`); - process.exitCode = 0; -} - async function main() { const { input, oversized, totalBytes } = await readBoundedStdin(); const isStop = detectStopHookInput(input); @@ -336,10 +348,10 @@ async function main() { if (isStop) { if (hasActiveAutopilotStateForOversizedStop(input)) { console.error(`[oh-my-codex] ${message}`); - writeStopFallback('plugin_stop_hook_stdin_oversized_active_workflow', message); + writeOversizedStopFallback('plugin_stop_hook_stdin_oversized_active_workflow', message); return; } - writeJsonNoop(); + writeOversizedStopNoop(); return; } console.error(`[oh-my-codex] ${message}`); diff --git a/plugins/codex/plugins/oh-my-codex/skills/code-review/SKILL.md b/plugins/codex/plugins/oh-my-codex/skills/code-review/SKILL.md index c87234e3e..36db42bce 100644 --- a/plugins/codex/plugins/oh-my-codex/skills/code-review/SKILL.md +++ b/plugins/codex/plugins/oh-my-codex/skills/code-review/SKILL.md @@ -67,6 +67,22 @@ Delegates to the `code-reviewer` and `architect` agents in parallel for a two-la - Else final recommendation follows the `code-reviewer` lane - The final report must make architect blockers impossible to miss + +## State/HUD Phase Contract + +Code-review is a merge-readiness gate and Autopilot child phase, not a standalone tracked mode with a `code-review-state.json` lifecycle. Keep HUD/current-phase state explicit and minimal: + +- **Standalone `$code-review` activation**: rely on the hook-owned `skill-active-state.json` entry (`skill:"code-review"`, `phase:"planning"`) for HUD visibility; do not create an ad-hoc `code-review-state.json`. +- **Inside active Autopilot**: before review work starts, keep `mode:"autopilot"` active and set the supervised phase to `current_phase:"code-review"` / skill-active `phase:"code-review"`; do not activate a peer workflow over Autopilot. +- **On clean review**: persist the review artifact/verdict under Autopilot `handoff_artifacts.code_review` and transition Autopilot to `current_phase:"ultraqa"` only after durable independent review evidence exists. +- **On non-clean review**: persist the review artifact/verdict, set Autopilot `current_phase:"rework"` for implementation-only fixes or `current_phase:"ralplan"` when requirements/planning must change, and keep the findings as the scoped handoff. + +Minimal Autopilot phase declaration when the review stage begins: + +```sh +omx state write --input '{"mode":"autopilot","active":true,"current_phase":"code-review"}' --json +``` + ## Agent Delegation Do not self-review as a fallback. If the `code-reviewer` or `architect` agent path is missing, unavailable, skipped, or fails, emit a clear unavailable-review result and block approval until the independent lane evidence exists. diff --git a/plugins/codex/plugins/oh-my-codex/skills/ultragoal/SKILL.md b/plugins/codex/plugins/oh-my-codex/skills/ultragoal/SKILL.md index ed1aa8c85..f166535a1 100644 --- a/plugins/codex/plugins/oh-my-codex/skills/ultragoal/SKILL.md +++ b/plugins/codex/plugins/oh-my-codex/skills/ultragoal/SKILL.md @@ -17,6 +17,29 @@ Use when the user asks for `ultragoal`, `create-goals`, `complete-goals`, durabl Existing aggregate plans with the legacy enumerated objective are migrated to the stable pointer objective on read, persisted to `goals.json`, retained in `codexObjectiveAliases` for already-active hidden Codex goal reconciliation, and audited with an `aggregate_objective_migrated` ledger entry. + +## State/HUD Phase Contract + +Ultragoal is both a tracked workflow skill and the Autopilot durable-implementation child phase. Keep the phase/HUD contract explicit at workflow boundaries: + +- **Standalone `$ultragoal` activation**: ensure `.omx/state[/sessions/]/ultragoal-state.json` exists with `mode:"ultragoal"`, `active:true`, and a non-empty `current_phase` such as `planning` before or while goals are created. This state is a lightweight HUD/runtime declaration; `.omx/ultragoal/goals.json` and `ledger.jsonl` remain the durable goal source of truth. +- **During execution**: update `current_phase` to the smallest accurate phase (`planning`, `executing`, `verifying`, `reviewing`, `checkpointing`, or `blocked`) when the visible workflow phase changes. +- **Inside active Autopilot**: keep `mode:"autopilot"` active and set the supervised phase to `current_phase:"ultragoal"`; do not start a peer Autopilot replacement. Ultragoal's own mode state may still exist as child-phase detail, but Autopilot owns the parent phase. +- **On handoff to code-review**: persist implementation/test/ledger evidence under Autopilot `handoff_artifacts.ultragoal`, then set Autopilot `current_phase:"code-review"`. +- **On completion/blocker**: set standalone Ultragoal `active:false,current_phase:"complete"` only when all durable goals are complete; otherwise keep it active with a blocker/review-blocked phase and ledger evidence. + +Minimal standalone phase declaration: + +```sh +omx state write --input '{"mode":"ultragoal","active":true,"current_phase":"planning"}' --json +``` + +Minimal Autopilot child-phase declaration: + +```sh +omx state write --input '{"mode":"autopilot","active":true,"current_phase":"ultragoal"}' --json +``` + ## Create goals 1. Run one of: diff --git a/plugins/codex/plugins/oh-my-codex/skills/ultrawork/references/agent-tiers.md b/plugins/codex/plugins/oh-my-codex/skills/ultrawork/references/agent-tiers.md index 65a63a8df..50fac2fe4 100644 --- a/plugins/codex/plugins/oh-my-codex/skills/ultrawork/references/agent-tiers.md +++ b/plugins/codex/plugins/oh-my-codex/skills/ultrawork/references/agent-tiers.md @@ -46,8 +46,9 @@ Use role to choose responsibility, tier to choose depth, and posture to choose o - Best for steerable frontier models and leader-style roles. - Prioritizes intent classification, delegation, verification, and architectural judgment. - Typical roles: `planner`, `analyst`, `architect`, `critic`, `code-reviewer`. - - Ralplan keeps `planner` and `architect` in this posture but pins them to - exact `gpt-5.4-mini` with high reasoning; the `critic` consensus gate stays + - Ralplan keeps `planner` and `architect` in this posture; `planner` + uses exact `gpt-5.5` with medium reasoning, `architect` uses exact + `gpt-5.5` with xhigh reasoning, and the `critic` consensus gate stays on the frontier lane. - `deep-worker`: diff --git a/plugins/codex/plugins/ppt-master/README.md b/plugins/codex/plugins/ppt-master/README.md index 4b60912e2..c5ff8273f 100644 --- a/plugins/codex/plugins/ppt-master/README.md +++ b/plugins/codex/plugins/ppt-master/README.md @@ -1,6 +1,6 @@ # PPT Master — AI generates natively editable PPTX from any document -[![Version](https://img.shields.io/badge/version-v2.11.0-blue.svg)](https://github.com/hugohe3/ppt-master/releases) +[![Version](https://img.shields.io/github/v/release/hugohe3/ppt-master?label=version&color=blue)](https://github.com/hugohe3/ppt-master/releases) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![GitHub stars](https://img.shields.io/github/stars/hugohe3/ppt-master.svg)](https://github.com/hugohe3/ppt-master/stargazers) [![AtomGit stars](https://atomgit.com/hugohe3/ppt-master/star/badge.svg)](https://atomgit.com/hugohe3/ppt-master) @@ -30,27 +30,22 @@ English | [中文](./README_CN.md) YouYun ZhiSuan - Thanks to YouYun ZhiSuan for sponsoring this project! YouYun ZhiSuan is UCloud's AI cloud platform, providing one-stop API services for mainstream domestic and international models, all accessible with a single key. The platform features cost-effective CodingPlan packages for domestic models (including GLM5.2, Deepseek-v4, and more), along with official channels for stable access to overseas models, meeting diverse development needs. It's compatible with mainstream AI coding tools like Claude Code and Codex, as well as general API calls. The platform supports enterprise-level high concurrency, 24/7 technical support, and self-service invoicing. Register through this link to receive up to ¥10 in free credits and get started right away. + Thanks to YouYun ZhiSuan for sponsoring this project! YouYun ZhiSuan is UCloud's AI cloud platform, providing one-stop API services for mainstream domestic and international models, all accessible with a single key. The platform features cost-effective CodingPlan packages for domestic models (including GLM5.2, Deepseek-v4, and more), along with official channels for stable access to overseas models, meeting diverse development needs. It's compatible with mainstream AI coding tools like Claude Code and Codex, as well as general API calls. The platform supports enterprise-level high concurrency, 24/7 technical support, and self-service invoicing. Register through this link to receive up to ¥10 in free credits. This project has been built into an Agent — PPT Master — ready to use without local deployment. -> [!IMPORTANT] -> ### This is a tool, not a wishing well -> Don't expect it to hand you a finished, perfect deck in one shot. Its real value is taking most of the tedious work off your plate; the polishing that's left is yours — a natively editable deck exists precisely so you can keep working on it, not a flat image you can't touch. The cheaper the model, the more there is to do. How good the result turns out comes down to your skill with this project and with PowerPoint. +> **AI generates your deck — it doesn't fill in a template.** PPT Master is a workflow that runs inside AI IDEs (Claude Code, Cursor, VS Code + Copilot, etc.): hand the AI your PDF / DOCX / web pages, and it produces a real PowerPoint on your machine — every element editable in PowerPoint, your data stays local, no platform or model lock-in. How it works and where the limits are → [Product Positioning](#product-positioning).

Live Demo · - About Hugo He · Examples · FAQ · - Roadmap · - Contact + Roadmap

Download the new narrated Attention Is All You Need deck — play it in PowerPoint and every slide reads itself out loud. That's just the tip of what PPT Master can do.

-

Of course, you can also download any of the six example decks below — opening the raw .pptx in PowerPoint is the fastest way to see this project's real capability ceiling.

@@ -90,29 +85,16 @@ English | [中文](./README_CN.md)

- Generated with Claude Opus 4.7 + gpt-image-2. Flip through all examples online → · examples/ directory · Why PPT Master? + All examples above were generated in a single pass, with no manual polish (Claude Opus 4.7 + gpt-image-2). Downloading any .pptx and opening it in PowerPoint is the fastest way to see what it can really do.
Flip through all examples online → · examples/ directory · Why PPT Master?

--- -Drop in your source material and get back a **real PowerPoint**: directly editable, with native slide transitions and entrance animations, speaker notes you can turn into audio narration, and the option to follow your own PPT template — a complete deck you can present as-is and keep editing. How to use each capability → [Getting Started](./docs/getting-started.md). +Drop in your source material, and the deck you get back is **more than just editable**: it has native slide transitions and entrance animations, speaker notes that can become audio narration, charts and tables that can ship as real data-backed PowerPoint objects, and it can follow your own PPT template — a complete deck you can present as-is and keep refining. How to use each capability → [Getting Started](./docs/getting-started.md). -> **⚠️ PPT Master is a harness, not a complete agent.** `harness + model = agent` — the tool owns the workflow; the model sets the ceiling. To form a genuinely high-quality agent, use **Claude with a large context window (~1M tokens) + AI image generation (`gpt-image-2`)**. Other models can run the pipeline but cannot reach the same quality ceiling. If results disappoint, upgrade the model — don't blame the harness. +## Product Positioning -> **How it works** — PPT Master is a workflow (a "skill") that works inside AI IDEs like Claude Code, Cursor, VS Code + Copilot, or Codebuddy. You chat with the AI — "make a deck from this PDF" — and it follows the workflow to produce a real editable `.pptx` on your computer. No coding on your side; the IDE is just where the conversation happens. -> -> **What you'll do**: install Python, install an AI IDE, drop in your material. - -> **Why it's shaped this way** — knowing how to use Python and AI agents will matter more and more. This project is meant to show how far you can go with just those two things. There's a learning curve if you're starting cold, but it's the curve worth climbing. Making a deck is just the excuse — what I'm really pushing is Python and agents. - -PPT Master is different: - -- **Real PowerPoint** — if a file can't be opened and edited in PowerPoint, it shouldn't be called a PPT. Every element PPT Master outputs is directly clickable and editable -- **Transparent, predictable cost** — the tool is free and open source; the only cost is your AI model usage. As AI tools move to usage-based billing, you pay exactly what you consume — no separate PPT subscription added on top -- **Data stays local** — your files shouldn't have to be uploaded to someone else's server just to make a presentation. Apart from AI model communication, the entire pipeline runs on your machine -- **No platform lock-in** — your workflow shouldn't be held hostage by any single company. Works with Claude Code, Cursor, VS Code Copilot, and more; supports Claude, GPT, Gemini, Kimi, and other models - -AI presentation tools roughly fall into four categories. PPT Master only does the last one: +**If a file can't be opened and edited in PowerPoint, it shouldn't be called a PPT.** AI presentation tools roughly fall into four categories, and PPT Master only does the last one: | Category | Output | Editable element-by-element in PowerPoint? | |---|---|:---:| @@ -121,13 +103,19 @@ AI presentation tools roughly fall into four categories. PPT Master only does th | HTML presentation | Web-based deck | ❌ not a PPTX | | **Native editable (PPT Master)** | **Real DrawingML shapes, text boxes, charts** | ✅ click any element to edit | ---- +In form, it's not a website or an app but a workflow (a "skill") that runs inside AI IDEs like Claude Code, Cursor, VS Code + Copilot, or Codebuddy: you tell the AI in the IDE's chat — "make a deck from this PDF" — and it follows the workflow to produce a genuinely editable `.pptx` on your machine. No coding on your side; you do exactly three things — install Python, install an AI IDE, drop in your material. -## The person using it matters more +This form buys three promises that other tools struggle to make at the same time: -The examples above were all made in a single pass — I didn't even refine them; spend some time polishing and it's a different story entirely. With the same PowerPoint, a designer can produce something stunning while most people only ever touch a few basic features — the difference isn't the tool, it's the person using it. If you can't get there yet, it's most likely that you haven't learned the workflow — start with [Getting Started](./docs/getting-started.md) and the example projects. +- **Transparent, predictable cost** — the tool is free and open source; the only cost is your AI model usage. You pay exactly what you consume — no separate PPT subscription added on top +- **Data stays local** — your files shouldn't have to be uploaded to someone else's server just to make a presentation. Apart from AI model communication, the entire pipeline runs on your machine +- **No platform lock-in** — your workflow shouldn't be held hostage by any single company. Works with Claude Code, Cursor, VS Code Copilot, and more; supports Claude, GPT, Gemini, Kimi, and other models -The best results do need Claude. Before you call it expensive, think about what it would cost to hire someone to produce a deck at the same level. The project also supports GPT, Gemini, Kimi, and other models — the results simply differ. Expecting top-tier output while paying the lowest possible cost was never reasonable to begin with. +> [!IMPORTANT] +> ### This is a tool, not a wishing well +> `harness + model = agent` — PPT Master only owns the workflow; the model sets the ceiling. Recommended: **Claude with a large context window (~1M tokens) + AI image generation (`gpt-image-2`)**; other models can run the pipeline, with a quality gap. +> +> And don't expect a finished, perfect deck in one shot. The tool's value is taking most of the tedious work off your plate; the polishing that's left is yours — a natively editable deck exists precisely so you can keep working on it, not a flat image you can't touch. The cheaper the model, the more there is to do; if results disappoint, upgrade the model first, then check your usage against [Getting Started](./docs/getting-started.md) and the example projects. --- @@ -135,7 +123,7 @@ The best results do need Claude. Before you call it expensive, think about what I'm a finance professional (CPA · CPV · Consulting Engineer (Investment)) who regularly reviews and edits presentation decks. I wanted AI-generated slides to remain editable in PowerPoint, not flattened into images — so I built this. -🌐 [Personal website](https://www.hehugo.com/) · 📧 [heyug3@gmail.com](mailto:heyug3@gmail.com) · 🐙 [@hugohe3](https://github.com/hugohe3) +Knowing how to use Python and AI agents will matter more and more, and this project is also meant to show how far you can go with just those two things. There's a learning curve if you're starting cold, but it's the curve worth climbing — making a deck is just the excuse; what I'm really pushing is Python and agents. --- @@ -143,22 +131,16 @@ I'm a finance professional (CPA · CPV · Consulting Engineer (Investment)) who ### 1. Prerequisites -**You only need Python.** Everything else is installed via `pip install -r requirements.txt`. +**All you need to install is [Python](https://www.python.org/downloads/) 3.10+.** Everything else comes with one line — `pip install -r requirements.txt` — after you download the project in Step 3. -| Dependency | Required? | What it does | -|------------|:---------:|--------------| -| [Python](https://www.python.org/downloads/) 3.10+ | ✅ **Yes** | Core runtime — the only thing you actually need to install | - -> **TL;DR** — Install Python, run `pip install -r requirements.txt`, and you're ready to generate presentations. - -
-Windows — see the dedicated step-by-step guide ⚠️ +
+Windows — see the dedicated step-by-step guide ⚠️ Windows requires a few extra steps (PATH setup, execution policy, etc.). We wrote a **step-by-step guide** specifically for Windows users: **📖 [Windows Installation Guide](./docs/windows-installation.md)** — from zero to a working presentation in 10 minutes. -Quick version: download Python from [python.org](https://www.python.org/downloads/) → **check "Add to PATH"** during install → `pip install -r requirements.txt` → done. +Quick version: download Python from [python.org](https://www.python.org/downloads/) → **check "Add to PATH"** during install → done; dependencies are installed in Step 3.
@@ -167,11 +149,9 @@ Quick version: download Python from [python.org](https://www.python.org/download ```bash # macOS brew install python -pip install -r requirements.txt # Ubuntu / Debian sudo apt install python3 python3-pip -pip install -r requirements.txt ```
@@ -193,11 +173,15 @@ sudo apt install pandoc PPT Master runs in **any tool with agent capability** — read/write files, execute commands, and sustain multi-turn conversation. +Never used one of these? Don't worry — in this project they play exactly one role: an AI chat window that can read and write files. Pick any tool from the table, install it, and you'll only ever use its chat panel. No coding involved. + +> **Author's pick: [Claude Code](https://claude.ai/code)** — the environment this project is developed and tested on most thoroughly, as the CLI or the VS Code / JetBrains extension. + | Type | Examples | Notes | |---|---|---| -| **IDE-native agent** | • VS Code architecture ([VS Code](https://code.visualstudio.com/) itself, plus forks & derivatives): [Cursor](https://cursor.sh/), Trae, Codebuddy IDE, [Windsurf](https://codeium.com/windsurf), Void, etc.
• Other architectures: [Zed](https://zed.dev/), etc. | Editor with a built-in agent | -| **IDE plugin / extension** | [GitHub Copilot](https://github.com/features/copilot), [Claude Code](https://claude.ai/code) (VS Code / JetBrains extension), [Cline](https://cline.bot/), [Continue](https://continue.dev/), Roo Code, etc. | Installed inside hosts like VS Code or JetBrains | -| **CLI agent** | [Claude Code](https://claude.ai/code) CLI, [Codex CLI](https://github.com/openai/codex), [Aider](https://aider.chat/), Gemini CLI, etc. | Runs in the terminal; suits scripting, remote, or server use | +| **IDE-native agent** | • VS Code architecture ([VS Code](https://code.visualstudio.com/) itself, plus forks & derivatives): [Cursor](https://cursor.sh/), Trae, Codebuddy IDE, [Windsurf](https://codeium.com/windsurf), etc.
• Other architectures: [Zed](https://zed.dev/), etc. | Editor with a built-in agent | +| **IDE plugin / extension** | [Claude Code](https://claude.ai/code) (VS Code / JetBrains extension), [GitHub Copilot](https://github.com/features/copilot), [Cline](https://cline.bot/), etc. | Installed inside hosts like VS Code or JetBrains | +| **CLI agent** | [Claude Code](https://claude.ai/code) CLI, [Codex CLI](https://github.com/openai/codex), Gemini CLI, etc. | Runs in the terminal; suits scripting, remote, or server use | > **Model recommendation**: for the best results, use **Claude Opus** with `gpt-image-2`; **Gemini 3.5 Flash** currently offers great overall value for money — notably fast and well worth a try. @@ -207,9 +191,11 @@ PPT Master runs in **any tool with agent capability** — read/write files, exec ### 3. Set Up -**Option A — Download ZIP** (no Git required): click **Code → Download ZIP** on the [GitHub page](https://github.com/hugohe3/ppt-master), then unzip. +**Option A — Download ZIP** (no Git required; best for a quick trial): click **Code → Download ZIP** on the [GitHub page](https://github.com/hugohe3/ppt-master), then unzip. -**Option B — Git clone** (requires [Git](https://git-scm.com/downloads) installed): +If you plan to keep using PPT Master and update it over time, use Git clone instead. + +**Option B — Git clone** (recommended; requires [Git](https://git-scm.com/downloads) installed): ```bash git clone https://github.com/hugohe3/ppt-master.git @@ -222,7 +208,23 @@ Then install dependencies: pip install -r requirements.txt ``` -To update later (Option A / B): `python3 skills/ppt-master/scripts/update_repo.py` +#### Updating Later + +**Git clone installs:** + +```bash +python3 skills/ppt-master/scripts/update_repo.py +``` + +The script pulls the latest version and syncs Python dependencies when `requirements.txt` changes. + +**Download ZIP installs:** + +ZIP folders do not include Git history, so they cannot run `git pull`. To update, download the latest ZIP, unzip it into a new folder, copy your old `.env` and `projects/` folder into the new folder, then run: + +```bash +pip install -r requirements.txt +``` > **Option C — Skill marketplace**: the repo ships `.claude-plugin/marketplace.json`, so it can be installed through the [Claude Code plugin marketplace](https://code.claude.com/docs/en/plugin-marketplaces) ecosystem: > @@ -239,6 +241,8 @@ To update later (Option A / B): `python3 skills/ppt-master/scripts/update_repo.p ### 4. Create +**First, open the project folder in your agent:** the goal is to point the AI at the `ppt-master` directory you unzipped / cloned in the previous step. In an IDE-type tool, use **File → Open Folder** — the AI chat panel is usually in the sidebar; in a CLI agent, `cd ppt-master` first, then launch it. Everything from here on happens in the chat. + **Provide source materials (recommended):** Place your PDF, DOCX, images, or other files in the `projects/` directory, then tell the AI chat panel which files to use. The quickest way to get the path: right-click the file in your file manager or IDE sidebar → **Copy Path** (or **Copy Relative Path**) and paste it directly into the chat. ``` @@ -263,19 +267,26 @@ AI: Sure. Let's confirm the design spec: The AI handles everything — content analysis, visual design, SVG generation, and PPTX export. -> **Output:** Native-shapes `.pptx` (directly editable) saved to `exports/_.pptx`. A copy of `svg_output/` is always snapshotted to `backup//svg_output/` for re-export / archival. Pass `--svg-snapshot` to additionally emit an SVG-image preview pptx alongside the native pptx in `exports/` (see [FAQ](./docs/faq.md)). Requires Office 2016+. +> **Output:** Native-shapes `.pptx` (directly editable) saved to `exports/_.pptx`. A copy of `svg_output/` is always snapshotted to `backup//svg_output/` for re-export / archival. Pass `--svg-snapshot` to additionally emit an SVG-image preview pptx alongside the native pptx in `exports/` (see [FAQ](./docs/faq.md)). Requires Office 2016+. By default charts and tables export as SVG-derived shapes (pixel-consistent across PowerPoint / Keynote / WPS); pass `--native-objects` to instead emit them as **real editable PowerPoint chart / table objects backed by data** (rendering may vary across apps), saved as `exports/__native_charts.pptx`. > **Already have a `.pptx` you want to reuse?** Hand the AI that deck plus your material and ask it to "fill this deck with the new content" — it fills text, table, and chart data into your existing design and exports only the pages you pick, staying natively editable. See the [FAQ](./docs/faq.md) and [template-fill workflow](./skills/ppt-master/workflows/template-fill-pptx.md). -> **AI lost context?** Ask it to read `skills/ppt-master/SKILL.md`. - -> **Something went wrong?** Check the **[FAQ](./docs/faq.md)** — it covers model selection, layout issues, export problems, and more. Continuously updated from real user reports. +> **Something went wrong?** If the AI loses context, ask it to read `skills/ppt-master/SKILL.md`; for everything else, check the **[FAQ](./docs/faq.md)** — it covers model selection, layout issues, export problems, and more. Continuously updated from real user reports. ### 5. Image Acquisition (Optional) -Two paths for non-user images, mixable per row in the same deck: +Two paths for non-user images, mixable per image in the same deck: -For API-backed features, put credentials in `.env`. Clone installs can use `cp .env.example .env`; skill marketplace installs should use a persistent user config: +**A) AI generation** — `image_gen.py`. Set `IMAGE_BACKEND` plus the provider's `*_API_KEY` (`OPENAI_API_KEY`, `GEMINI_API_KEY`, etc.), and the pipeline calls it automatically. Run `python3 skills/ppt-master/scripts/image_gen.py --list-backends` for the full backend list. `gpt-image-2` is currently the best default. + +**B) Web image search** — `image_search.py`. **Zero-config works**; configure `PEXELS_API_KEY` / `PIXABAY_API_KEY` (both free) for consistently higher-quality results: + +- Without keys, search uses Openverse / Wikimedia Commons only — useful as a fallback, but image quality can be uneven because many results are ordinary user uploads +- With keys, the default provider chain also appends Pexels / Pixabay, which materially improves modern stock photography, people, workplace, lifestyle, and illustration coverage +- Licensing is handled automatically: CC0, Public Domain, Pexels / Pixabay no-attribution licenses, CC BY, and CC BY-SA are all considered together, and Executor adds a small inline credit whenever the selected image requires attribution. Use `--strict-no-attribution` only when a slide cannot tolerate any credit line +- For high-impact covers, product shots, portraits, and branded scenes, prefer this order: user-provided high-resolution assets / AI generation > web search with Pexels / Pixabay keys > zero-config web search + +The API keys above all live in `.env`. Clone installs can use `cp .env.example .env`; skill marketplace installs should use a persistent user config: ```bash mkdir -p ~/.ppt-master @@ -284,10 +295,6 @@ cp /path/to/installed/ppt-master/.env.example ~/.ppt-master/.env PPT Master reads the current process environment first, then the first `.env` found in this order: current working directory, skill directory (e.g. `~/.agents/skills/ppt-master/.env`), clone repo root, `~/.ppt-master/.env`. -**A) AI generation** — `image_gen.py`. Set `IMAGE_BACKEND` plus the provider's `*_API_KEY` (`OPENAI_API_KEY`, `GEMINI_API_KEY`, etc.), and the pipeline calls it automatically. Run `python3 skills/ppt-master/scripts/image_gen.py --list-backends` for the full backend list. `gpt-image-2` is currently the best default. - -**B) Web image search** — `image_search.py`. **Zero-config works**, but configure `PEXELS_API_KEY` / `PIXABAY_API_KEY` (both free) for higher-quality results. Without keys, search uses Openverse / Wikimedia Commons only; this is useful as a fallback, but image quality can be uneven because many results are ordinary user uploads. With keys, the default provider chain also appends Pexels / Pixabay, which materially improves modern stock photography, people, workplace, lifestyle, and illustration coverage. The default is quality-first: CC0, Public Domain, Pexels / Pixabay no-attribution licenses, CC BY, and CC BY-SA are considered together, and Executor adds a small inline credit whenever the selected image requires attribution. Use `--strict-no-attribution` only when a slide cannot tolerate any credit line. For high-impact covers, product shots, portraits, and branded scenes, prefer this order: user-provided high-resolution assets / AI generation > web search with Pexels / Pixabay keys > zero-config web search. - > Full reference: [`image-generator.md`](./skills/ppt-master/references/image-generator.md) (AI) · [`image-searcher.md`](./skills/ppt-master/references/image-searcher.md) (web). --- @@ -322,7 +329,7 @@ See [CONTRIBUTING.md](./CONTRIBUTING.md) for how to get involved. ## Related Tools -[cc-switch](https://github.com/farion1231/cc-switch) — a cross-platform desktop app to manage and one-click switch API providers across Claude Code, Codex, Gemini CLI and more. Handy when running PPT Master inside any of these agents. +[cc-switch](https://github.com/farion1231/cc-switch) — one-click switching of API providers across Claude Code / Codex / Gemini CLI and more. ## Contact & Collaboration @@ -330,7 +337,6 @@ Looking to collaborate, integrate PPT Master into your workflow, or just have qu - 💬 **Questions & sharing** — [GitHub Discussions](https://github.com/hugohe3/ppt-master/discussions) - 🐛 **Bug reports & feature requests** — [GitHub Issues](https://github.com/hugohe3/ppt-master/issues) -- 🌐 **Learn more about the author** — [www.hehugo.com](https://www.hehugo.com/) --- diff --git a/plugins/codex/plugins/ppt-master/THIRD_PARTY_SOURCE.json b/plugins/codex/plugins/ppt-master/THIRD_PARTY_SOURCE.json index 9ab73bc6c..b48973425 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": "f888bff138f96e9e5e2e43f8c90c66695e979f60", + "commit": "eb9243be673d0019dc1c7998262214a9a977a7d4", "adapter": "claude-skill", "sourcePath": "skills/ppt-master", - "syncedAt": "2026-06-29T15:59:59Z" + "syncedAt": "2026-07-05T16: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 8a04d2b95..3773a5e76 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/SKILL.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/SKILL.md @@ -16,7 +16,7 @@ description: "多格式源文档到高质量 SVG 页面再导出 PPTX 的多阶 > > 1. **SERIAL EXECUTION** — Steps MUST be executed in order; the output of each step is the input for the next. Non-BLOCKING adjacent steps may proceed continuously once prerequisites are met, without waiting for the user to say "continue" > 2. **BLOCKING = HARD STOP** — Steps marked ⛔ BLOCKING require a full stop; the AI MUST wait for an explicit user response before proceeding and MUST NOT make any decisions on behalf of the user -> 3. **NO CROSS-PHASE BUNDLING** — Cross-phase bundling is FORBIDDEN. (Note: the Eight Confirmations in Step 4 are ⛔ BLOCKING — the AI MUST present recommendations and wait for explicit user confirmation before proceeding. Once the user confirms, all subsequent non-BLOCKING steps — design spec output, SVG generation, speaker notes, and post-processing — may proceed automatically without further user confirmation) +> 3. **NO CROSS-PHASE BUNDLING** — Cross-phase bundling is FORBIDDEN. (Note: the Strategist confirmation stage in Step 4 is ⛔ BLOCKING — the AI MUST present recommendations and wait for explicit user confirmation before proceeding. Once the user confirms, all subsequent non-BLOCKING steps — design spec output, SVG generation, speaker notes, and post-processing — may proceed automatically without further user confirmation) > 4. **GATE BEFORE ENTRY** — Each Step has prerequisites (🚧 GATE) listed at the top; these MUST be verified before starting that Step > 5. **NO SPECULATIVE EXECUTION** — "Pre-preparing" content for subsequent Steps is FORBIDDEN (e.g., writing SVG code during the Strategist phase) > 6. **NO SUB-AGENT SVG GENERATION** — Executor Step 6 SVG generation is context-dependent and MUST be completed by the current main agent end-to-end. Delegating page SVG generation to sub-agents is FORBIDDEN @@ -65,12 +65,8 @@ description: "多格式源文档到高质量 SVG 页面再导出 PPTX 的多阶 | Script | Purpose | |--------|---------| -| `${SKILL_DIR}/scripts/source_to_md/pdf_to_md.py` | PDF to Markdown | -| `${SKILL_DIR}/scripts/source_to_md/doc_to_md.py` | Documents to Markdown — native Python for DOCX/HTML/EPUB/IPYNB, pandoc fallback for legacy formats (.doc/.odt/.rtf/.tex/.rst/.org/.typ) | -| `${SKILL_DIR}/scripts/source_to_md/excel_to_md.py` | Excel workbooks to Markdown — supports .xlsx/.xlsm; legacy .xls should be resaved as .xlsx | -| `${SKILL_DIR}/scripts/source_to_md/ppt_to_md.py` | PowerPoint to Markdown | +| `${SKILL_DIR}/scripts/source_to_md.py` | Unified source-to-Markdown dispatcher — default Step 1 entry for explicit file(s) or URL(s) | | `${SKILL_DIR}/scripts/pptx_intake.py` | Standard PPTX intake enrichment — canvas / identity / slide geometry / tables / native chart data | -| `${SKILL_DIR}/scripts/source_to_md/web_to_md.py` | Web page to Markdown (supports WeChat via `curl_cffi`) | | `${SKILL_DIR}/scripts/project_manager.py` | Project init / validate / manage | | `${SKILL_DIR}/scripts/icon_sync.py` | Copy chosen library icons into `/icons/` at selection time; missing names reported + non-zero (re-pick gate) | | `${SKILL_DIR}/scripts/analyze_images.py` | Image analysis | @@ -110,7 +106,7 @@ For complete tool documentation, see `${SKILL_DIR}/scripts/README.md`. |---|---| | Raw PPTX template plus new material/topic, generate a PPTX | [`template-fill-pptx`](workflows/template-fill-pptx.md) | | Existing PPTX, preserve page count/order and slide wording 1:1, improve layout | [`beautify-pptx`](workflows/beautify-pptx.md) | -| Existing PPTX as source material, rethink outline or change page count/order | Main pipeline via `ppt_to_md.py` plus PPTX intake | +| Existing PPTX as source material, rethink outline or change page count/order | Main pipeline via `source_to_md.py` plus PPTX intake | | Build a reusable template package from a PPTX/design reference | [`create-template`](workflows/create-template.md), then return with the generated template directory path | | Finished PPTX, keep content/layout stable and add notes/audio/timing/transitions | [`native-enhance-pptx`](workflows/native-enhance-pptx.md) | @@ -130,23 +126,27 @@ For complete tool documentation, see `${SKILL_DIR}/scripts/README.md`. > **No source content?** When the user supplies only a topic name or requirements without any file or substantive description, run the [`topic-research`](workflows/topic-research.md) workflow first, then return here with its products as input. -When the user provides non-Markdown content, convert immediately: +When the user provides non-Markdown content, convert immediately through the +unified dispatcher. It preserves the backend converters' existing behavior, +routes by source type, and writes the standard Markdown plus conversion profile. -| User Provides | Command | -|---------------|---------| -| PDF file | `python3 ${SKILL_DIR}/scripts/source_to_md/pdf_to_md.py ` | -| DOCX / Word / Office document | `python3 ${SKILL_DIR}/scripts/source_to_md/doc_to_md.py ` | -| XLSX / XLSM / Excel workbook | `python3 ${SKILL_DIR}/scripts/source_to_md/excel_to_md.py ` | +| User Provides | Action | +|---------------|--------| +| PDF / DOCX / Office document / XLSX / XLSM / PPTX / EPUB / HTML / LaTeX / RST / web URL | `python3 ${SKILL_DIR}/scripts/source_to_md.py [ ...]` | | CSV / TSV | Read directly as plain-text table source | -| PPTX / PowerPoint deck | `python3 ${SKILL_DIR}/scripts/source_to_md/ppt_to_md.py ` for Markdown content; after Step 2 `import-sources`, standard PPTX intake is also written to `/analysis/` | -| EPUB / HTML / LaTeX / RST / other | `python3 ${SKILL_DIR}/scripts/source_to_md/doc_to_md.py ` | -| Web link | `python3 ${SKILL_DIR}/scripts/source_to_md/web_to_md.py ` | -| WeChat / high-security site | `python3 ${SKILL_DIR}/scripts/source_to_md/web_to_md.py ` (requires `curl_cffi`, included in `requirements.txt`) | | Markdown | Read directly | +For PPTX sources, Step 1 converts the deck to Markdown content; after Step 2 +`import-sources`, standard PPTX intake is also written to `/analysis/`. +Use `source_to_md.py -t ` only when extension detection is ambiguous. +Default local conversion writes Markdown/profile outputs beside each source file. +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). + > **Office vector assets (EMF/WMF) from DOCX/PPTX sources**: -> `doc_to_md.py` / `ppt_to_md.py` extract embedded Office vector images (.emf/.wmf) -> alongside bitmap images. After `import-sources`, these land in `images/` +> Source conversion extracts embedded Office vector images (.emf/.wmf) +> alongside bitmap images when the source format exposes them. After `import-sources`, these land in `images/` > together with `image_manifest.json` and are first-class assets in §VIII Image Resource List. > > **Do NOT convert EMF/WMF to PNG.** The PPT Master pipeline preserves them as external @@ -176,7 +176,7 @@ Import source content (choose based on the situation): | Situation | Action | |-----------|--------| -| Has source files (PDF/MD/etc.) | `python3 ${SKILL_DIR}/scripts/project_manager.py import-sources --move` | +| Has source files (PDF/MD/etc.) | `python3 ${SKILL_DIR}/scripts/project_manager.py import-sources --move` | | User provided text directly in conversation | No import needed — content is already in conversation context; subsequent steps can reference it directly | For PPTX sources, `import-sources` automatically runs the standard intake enrichment: @@ -189,7 +189,7 @@ For each PPTX it writes `.identity.json` (canvas, theme palette/fonts, obs Multi-deck: several PPTX files may be imported into one main-pipeline project — each gets its own `.*` artifacts and a deck entry in `source_profile.json`. `source_profile.json` stays the single must-read index (one entry for a one-deck project, several for a combined-source project). Stems must be distinct; re-importing the same stem replaces that deck's entry. The beautify / template-fill workflows remain single-deck (1:1 to one chosen source deck) and read that deck's `.*` artifacts. -> ⚠️ **MUST use `--move`** (not copy): all source files — Step 1's generated Markdown, original PDFs / MDs / images — go into `sources/` via `import-sources --move`. After execution they no longer exist at the original location. Intermediate artifacts (e.g., `_files/`) are handled automatically. +> ⚠️ **MUST use `--move`** (not copy): all source files — Step 1's generated Markdown, original PDFs / MDs / images — go into `sources/` via `import-sources --move`. If Step 1 wrote Markdown beside the original sources, pass that source path/directory once. If Step 1 used `-o` to write Markdown elsewhere, pass both the original source path(s)/directory and the Markdown output path(s)/directory. After execution they no longer exist at the original location. Intermediate artifacts (e.g., `_files/`) are handled automatically. **✅ Checkpoint — Confirm project structure created successfully, `sources/` contains all source files, converted materials are ready. Proceed to Step 3.** @@ -214,7 +214,7 @@ Do **not** reinterpret this boundary as 1:1 redesign or free SVG generation. Use There is no slug matching, no name lookup, no fuzzy resolution. A name without a path does not trigger — the user must give a path the AI can `cd` into. -> Style descriptions ("麦肯锡风格" / "Keynote 风" / "极简风" / etc.) never trigger Step 3. They flow into Strategist's Eight Confirmations as a style brief (color / typography / tone in confirmations e–g). +> Style descriptions ("麦肯锡风格" / "Keynote 风" / "极简风" / etc.) never trigger Step 3. They flow into the Strategist confirmation stage as a style brief (color / typography / tone in fields e–g). > Bare names ("academic_defense", "招商银行", "anthropic") do NOT trigger Step 3 even if a matching directory exists in the library. The user must give a path. AI must not "helpfully" resolve a name to a path. @@ -245,8 +245,8 @@ The architecture has three independent reference bundles. Full schema in [`docs/ | User path's `kind` | Step 3 action | |---|---| | `kind: brand` | `design_spec.md` + non-image assets → `/templates/`; logo / illustration / icon **bitmaps** → `/images/`. Strategist locks identity segment as truth; structure stays free. | -| `kind: layout` | `design_spec.md` + SVG roster → `/templates/`; any **bitmap** assets → `/images/`. Strategist locks structure; identity decided in Eight Confirmations e–g. | -| `kind: deck` | `design_spec.md` + template SVGs → `/templates/`; logos / backgrounds / other **bitmaps** → `/images/`. Strategist locks all segments; Eight Confirmations narrows to deck-content fields (audience / page count / outline / tone tweaks). | +| `kind: layout` | `design_spec.md` + SVG roster → `/templates/`; any **bitmap** assets → `/images/`. Strategist locks structure; identity decided in Strategist confirmation stage e–g. | +| `kind: deck` | `design_spec.md` + template SVGs → `/templates/`; logos / backgrounds / other **bitmaps** → `/images/`. Strategist locks all segments; Strategist confirmation stage narrows to deck-content fields (audience / page count / outline / tone tweaks). | ```bash TEMPLATE_DIR= @@ -275,7 +275,7 @@ Override priority by segment: | layout + deck | deck | layout (overrides deck) | deck | | brand + layout + deck | brand | layout | deck | -Field-level micro-adjustment (e.g. "use anthropic brand but primary changed to #FF0000") is **not** part of Step 3 fusion — it flows into Strategist Eight Confirmations e–g as a normal user request. +Field-level micro-adjustment (e.g. "use anthropic brand but primary changed to #FF0000") is **not** part of Step 3 fusion — it flows into Strategist confirmation stage e–g as a normal user request. #### Same-kind multiple paths — conflict resolution @@ -329,13 +329,13 @@ Read references/strategist.md **Artifact ownership**: fact-channel and source/derived artifact boundaries are defined in [`references/artifact-ownership.md`](references/artifact-ownership.md). This Step uses those ownership rules; it does not redefine them. -**`/analysis/` is the project's intermediate-analysis folder: the canonical home for machine-extracted source/asset facts — the PPTX intake bundle (`source_profile.json` index + per-deck `.identity.json` / `.slide_library.json`) and `image_analysis.csv`. It holds facts, not design contracts — `design_spec.md` / `spec_lock.md` stay at the project root.** The MUST-read contract covers only the **compact structured data files (`.json` / `.csv`)**; other artifacts that may live under `analysis/` (e.g. a beautify `source_svg_import/` vector reference package) are NOT bulk-read — they are read selectively only when a specific workflow step calls for them. Before the Eight Confirmations, Strategist MUST read the auto-extracted fact files already in `analysis/` — currently `source_profile.json` (PPTX intake), when present. This file is the multi-deck index: read it once for the `decks[]` digests (canvas / chart / table entries per source deck), then open a specific deck's `.identity.json` / `.slide_library.json` only if you need its full raw facts. Use these entries as **factual source context** (format default + content facts); when several decks are present, synthesize across all of them. The source's **palette / typography / visual identity are a reference, not a constraint**: the main pipeline may inherit them where they fit the content and the confirmed style, or design fresh where they don't — the Strategist's judgment, never an obligation to either keep or discard. (Template-fill preserves the native source design by editing cloned slides directly; beautify defaults to the source identity but still follows the confirmed values; the main pipeline treats source identity as reference only and defaults to fresh design.) (`image_analysis.csv` lands later, at the image-analysis step below, and is the authoritative regenerated image-fact view there — re-derived from the live `images/` folder, not a durable store.) +**`/analysis/` is the project's intermediate-analysis folder: the canonical home for machine-extracted source/asset facts — the PPTX intake bundle (`source_profile.json` index + per-deck `.identity.json` / `.slide_library.json`) and `image_analysis.csv`. It holds facts, not design contracts — `design_spec.md` / `spec_lock.md` stay at the project root.** The MUST-read contract covers only the **compact structured data files (`.json` / `.csv`)**; other artifacts that may live under `analysis/` (e.g. a beautify `source_svg_import/` vector reference package) are NOT bulk-read — they are read selectively only when a specific workflow step calls for them. Before the Strategist confirmation stage, Strategist MUST read the auto-extracted fact files already in `analysis/` — currently `source_profile.json` (PPTX intake), when present. This file is the multi-deck index: read it once for the `decks[]` digests (canvas / chart / table entries per source deck), then open a specific deck's `.identity.json` / `.slide_library.json` only if you need its full raw facts. Use these entries as **factual source context** (format default + content facts); when several decks are present, synthesize across all of them. The source's **palette / typography / visual identity are a reference, not a constraint**: the main pipeline may inherit them where they fit the content and the confirmed style, or design fresh where they don't — the Strategist's judgment, never an obligation to either keep or discard. (Template-fill preserves the native source design by editing cloned slides directly; beautify defaults to the source identity but still follows the confirmed values; the main pipeline treats source identity as reference only and defaults to fresh design.) (`image_analysis.csv` lands later, at the image-analysis step below, and is the authoritative regenerated image-fact view there — re-derived from the live `images/` folder, not a durable store.) -**Channel ownership — read each fact once from its owning channel.** In the main pipeline the **content contract is the Markdown** (`sources/.md`): text, tables, and chart data values all come from there (`ppt_to_md` now transcribes native chart data into Markdown tables). The `analysis/` chart / table entries are a **structural digest** for outline decisions (which slides carried charts, type, series names) — not a second copy of the values; do NOT also pull chart values from `.slide_library.json` in the main pipeline. The `.slide_library.json` full structured data is owned by the direct-PPTX workflows: template-fill uses it as the native fill contract; beautify uses it for native chart / table data while keeping slide text from the Markdown. +**Channel ownership — read each fact once from its owning channel.** In the main pipeline the **content contract is the content-type files in `sources/`** — primarily `.md`, but also any user-supplied content the import archived there: `.md` / `.markdown` / `.txt` / `.csv` / `.tsv` / `.json` / `.jsonl` / `.yaml` / `.yml` (a `metrics.json` or `data.csv` may carry core content — judge by what the file holds). Text, tables, and chart data values come from these (`ppt_to_md` now transcribes native chart data into Markdown tables). **Do NOT read pipeline sidecars in `sources/` as content**: `*.conversion_profile.json` (conversion audit) and `*_files/image_manifest.json` (asset index) are process metadata — open them only to audit a conversion or resolve assets, never as slide content. Converted-source originals archived in `sources/` (`.pdf` / `.pptx` / `.docx` / `.xlsx` / `.html` / `.epub` / `.tex` / `.rst` / `.ipynb` / `.typ`, etc.) are read via their converted `.md`, not scanned directly in the main pipeline. The `analysis/` chart / table entries are a **structural digest** for outline decisions (which slides carried charts, type, series names) — not a second copy of the values; do NOT also pull chart values from `.slide_library.json` in the main pipeline. The `.slide_library.json` full structured data is owned by the direct-PPTX workflows: template-fill uses it as the native fill contract; beautify uses it for native chart / table data while keeping slide text from the Markdown. -**Eight Confirmations** (full template: `templates/design_spec_reference.md`): +**Strategist confirmation stage** (full template: `templates/design_spec_reference.md`): -⛔ **BLOCKING**: present the Eight Confirmations and **wait for explicit user confirmation or modification** before outputting Design Specification & Content Outline. This is the single core confirmation gate — once the final confirmation lands, all subsequent steps proceed automatically. The default Confirm UI delivers the gate in **two tiers** (anchors → re-derive → realization; see below); the chat fallback mirrors the same two steps. +⛔ **BLOCKING**: present the Strategist confirmation stage and **wait for explicit user confirmation or modification** before outputting Design Specification & Content Outline. This is the single core confirmation gate — once the final confirmation lands, all subsequent steps proceed automatically. The default Confirm UI delivers the gate in **three stages** (direction → design system → images / execution; see below); the chat fallback mirrors the same staged order. 1. Canvas format 2. Page count range @@ -346,38 +346,43 @@ Read references/strategist.md 7. Typography plan, including formula rendering policy 8. Image usage approach -**Confirm UI Auto-Launch (Mandatory — default visual confirmation surface)**: by default the Eight Confirmations are presented through an interactive local page in **two tiers within one browser session** — Tier 1 confirms the *anchors*; the AI then re-derives the realization layer from the **user's actual** anchors; Tier 2 confirms that layer. Color swatches, live font previews, candidate picks; the chat path is the always-valid fallback. [`scripts/docs/confirm_ui.md`](scripts/docs/confirm_ui.md) owns the schema, server lifecycle, port strategy, and fallback details; this section keeps the orchestration contract. The split: +**Confirm UI Auto-Launch (Mandatory — default visual confirmation surface)**: by default the Strategist confirmation stage is presented through an interactive local page in **three stages within one browser session** — Stage 1 confirms the direction anchors; the AI then re-derives the design-system layer from the **user's actual** anchors; Stage 2 confirms that layer; the AI then re-derives image and execution choices from the confirmed direction + design system; Stage 3 confirms the final operational layer. Color swatches, live font previews, icon samples, image-style reference previews, and candidate picks appear where they help judgment; the chat path is the always-valid fallback. [`scripts/docs/confirm_ui.md`](scripts/docs/confirm_ui.md) owns the schema, server lifecycle, port strategy, and fallback details; this section keeps the orchestration contract. The split: -| Tier | Confirms | Driven by | +| Stage | Confirms | Driven by | |---|---|---| -| **1 — anchors** | canvas · audience + core message + `content_divergence` + `delivery_purpose` *(PPT only — omitted on non-PPT canvases)* (all §c key info) · `mode` + `visual_style` | the source + user intent | -| **2 — realization** (re-derived from Tier 1) | page count · color · typography (font + size) · icons · formula policy · image usage + generated-image style · generation mode · refine-spec toggle | the confirmed Tier 1 | +| **1 — direction anchors** | canvas · audience + core message + `content_divergence` + `delivery_purpose` *(PPT only — omitted on non-PPT canvases)* (all §c key info) · `mode` + `visual_style` | the source + user intent | +| **2 — design system** (re-derived from Stage 1) | page count · color · typography (font + size) · icons · formula policy | the confirmed Stage 1 | +| **3 — images / execution** (re-derived from Stage 1 + Stage 2) | image usage · generated-image style · AI-image generation path · generation mode · refine-spec toggle | the confirmed direction + design system | -> **Why two tiers.** Every realization field is anchored by the same few choices (`visual_style` anchors color / icon / typography / image; `delivery_purpose` sets the body size, page density, **and** the page-count recommendation). Confirming anchors first, then re-deriving, means Tier 2's candidates fit the user's *real* anchors instead of your originals — the coherence reconciliation below is done by construction on this path. Page count is a **derived** field (content volume × `delivery_purpose`), which is why it lives in Tier 2, not up front. +> **Why three stages.** Design-system fields are anchored by the same few choices (`visual_style` anchors color / icon / typography; `delivery_purpose` sets the body size, page density, **and** the page-count recommendation). Image strategy depends on both the confirmed visual direction and the confirmed color system — its palette is color behavior only, while final HEX values follow Stage 2. Confirming direction first, then design system, then image / execution choices means each downstream stage fits the user's *real* choices instead of the AI's original assumptions. Page count is a **derived** field (content volume × `delivery_purpose`), which is why it lives in Stage 2, not up front. Steps: -> ⛔ **Steps 2 → 3 → 4 are ONE uninterrupted run — do NOT yield to the user mid-flow.** When the tier-1 `--wait` (step 2) returns, the AI **immediately and autonomously** continues to step 3 (re-derive + write Tier 2) and step 4 (`--wait-only`) in the **same turn**: do **not** summarize, ask a question, report progress, or end the turn in between. The browser is sitting on a "deriving…" spinner polling for the Tier 2 you must write next — stopping here strands the page and the user must prod you in chat to finish (a bug, not the intended flow). **The tier-1 confirmation is an intermediate machine handoff, not a stopping point.** The single ⛔ BLOCKING wait is the **final** confirmation at the end of step 4. (Chat-fallback path — only when the page never opened — is the exception: there you do present each tier in chat and wait for a reply.) +> ⛔ **Steps 2 → 3 → 4 are ONE uninterrupted run — do NOT yield to the user mid-flow.** When an intermediate `--wait` returns, the AI **immediately and autonomously** re-derives and writes the next stage in the **same turn**: do **not** summarize, ask a question, report progress, or end the turn in between. The browser is sitting on a "deriving…" spinner polling for the next stage you must write — stopping here strands the page and the user must prod you in chat to finish (a bug, not the intended flow). **Stage-1 and Stage-2 confirmations are intermediate machine handoffs, not stopping points.** The single ⛔ BLOCKING wait is the **final** confirmation at the end of step 4. (Chat-fallback path — only when the page never opened — is the exception: there you do present each stage in chat and wait for a reply.) -1. **Write Tier 1** to `/confirm_ui/recommendations.json` with `"tier": 1` and only the anchor fields. Enumerable anchors (`canvas` / `mode` / `visual_style` / `delivery_purpose`) name a recommended canonical `id` in a `recommend` block (the page lists common options from `confirm_ui/static/catalogs.json`); `visual_style` also carries the ≥3-style `visual_style_spectrum` (safe / shifted / bold — same hard rule as h.5). `audience` and `content_divergence` are plain `{ "value": "" }`. `content_divergence` is the **free-text** field shown under audience in §c — how closely to follow the source vs how freely to reshape it (blank = balanced; facts stay sourced at every level); it is consumed by Strategist when authoring `§IX`, recorded in `design_spec.md §I`, carries no page-count coupling, and is **not** written to `spec_lock.md`. Set `lang` to the page language; visible text matches `lang`, or provide bilingual `name_zh` / `name_en` + `note_zh` / `note_en`. -2. **Launch + wait for Tier 1.** Background launch; the parent returns when the page writes the tier-1 `result.json`. **Long tool timeout — 600000 ms** (the `--wait` ≈590 s budget): +1. **Write Stage 1** to `/confirm_ui/recommendations.json` with `"stage": "stage1"` and only the anchor fields. New recommendations MUST use the canonical `stage` selector. Enumerable anchors (`canvas` / `mode` / `visual_style` / `delivery_purpose`) name a recommended canonical `id` in a `recommend` block (the page lists common options from `confirm_ui/static/catalogs.json`); `visual_style` also carries the ≥3-style `visual_style_spectrum` (safe / shifted / bold — same hard rule as h.5). `audience` and `content_divergence` are plain `{ "value": "" }`. `content_divergence` is the **free-text** field shown under audience in §c — how closely to follow the source vs how freely to reshape it (blank = balanced; facts stay sourced at every level); it is consumed by Strategist when authoring `§IX`, recorded in `design_spec.md §I`, carries no page-count coupling, and is **not** written to `spec_lock.md`. Set `lang` to the page language (`zh` / `en` / `ja`); visible text matches `lang`, or provide multilingual `name_zh` / `name_en` / `name_ja` + `note_zh` / `note_en` / `note_ja` — when the user's language is Japanese, set `lang: "ja"` and always include the `_ja` variants (labels resolve in the page language first — a `ja` page falls back ja → en → zh, so missing `_ja` labels silently render in English; zh/en pages keep their zh↔en fallback and only try `_ja` last). +2. **Launch + wait for Stage 1.** Background launch; the parent returns when the page writes the stage-1 `result.json`. **Long tool timeout — 600000 ms** (the `--wait` ≈590 s budget): ```bash python3 ${SKILL_DIR}/scripts/confirm_ui/server.py --daemon --wait ``` - Page opens at `http://localhost:5050` — the **same port as the Step 6 live preview** (they never run at once: this page shuts down at the end of Step 4). If 5050 is held, the launcher **auto-advances** (5051, …) — read the actual URL from the launch log and report it. The page does **not** close after Tier 1: it shows a "deriving…" state and polls for Tier 2. **Launch or wait failure is non-fatal**: if it fails or times out (flask missing, port blocked, no GUI / remote / web host), do **NOT** troubleshoot — **on any non-zero exit, re-check `result.json` once** (a fresh `status: tier1-confirmed`) before dropping to the chat fallback. **On success (exit 0 with a tier-1 result), do not pause or report — go straight to step 3 in the same turn.** -3. **Re-derive Tier 2 from the confirmed anchors, then write it — immediately, same turn (the page is polling for it).** Read the tier-1 `result.json` (`status: tier1-confirmed`). Using the user's **actual** confirmed anchors (not your originals), author the realization candidates and **overwrite** `recommendations.json` with `"tier": 2`: page count (content volume × `delivery_purpose`); color, typography, and generated-image style as **generative ≥3-candidate** fields (creative recommendations always offer real choice — same rule as h.5; fewer than 3 only on the honest-shortfall exception, with a stated reason; color: core `palette` with background/secondary_bg/primary/accent/secondary_accent/body_text; typography: CJK + Latin for `heading` and `body` with `css` preview stacks + `body_size` as the body baseline in **px** (every canvas) — **one fixed value per confirmed `delivery_purpose`** (`text` 20 / `balanced` 24 / `presentation` 32), not a range; each typography candidate must include topic-matched `sample_heading` / `sample_heading_latin` / `sample_body` / `sample_body_latin` preview text, never a fixed unrelated industry sample; images: `image_strategy.candidates` rendering × palette from h.5); enumerable `icons` / `formula_policy` / `generation_mode` (recommended `id`); `image_usage` as one or more source ids (`["ai"]`, `["ai","provided"]`, `["web","placeholder"]`, or `["none"]`; `none` is exclusive). If the recommendation involves several sources, keep the source list structured in `recommend.image_usage` and write the usage rationale / page-role guidance into `image_notes` (for example, "封面和章节页用 AI 主视觉,产品页优先用户素材,行业背景页可用网络参考"). Write `image_ai_path` only when `image_usage` includes `ai`. Spot-illustration lean is **not** a candidate field here: it derives from the locked `visual_style`'s illustration propensity and is expressed only in the recommendation rationale / `image_notes`, never as a new confirmation field. The still-open page polls, renders Tier 2, and preserves the user's Tier 1 picks. Closed fields (`image_ai_path`, `formula_policy`, `generation_mode`, `refine_spec`) stay finite; open fields (`icons`, typography custom text, image notes) expose free-text controls. -4. **Wait for the final confirmation** — attach to the already-running page, do **not** relaunch (same 600000 ms budget): + Page opens at `http://localhost:5050` — the **same port as the Step 6 live preview** (they never run at once: this page shuts down at the end of Step 4). If 5050 is held, the launcher **auto-advances** (5051, …) — read the actual URL from the launch log and report it. The page does **not** close after Stage 1: it shows a "deriving…" state and polls for Stage 2. **Launch or wait failure is non-fatal**: if it fails or times out (flask missing, port blocked, no GUI / remote / web host), do **NOT** troubleshoot — **on any non-zero exit, re-check `result.json` once** for a fresh `status: stage1-confirmed` before dropping to the chat fallback. **On success (exit 0 with a stage-1 result), do not pause or report — go straight to step 3 in the same turn.** +3. **Re-derive Stage 2 from the confirmed anchors, write it, then wait for the design-system handoff — immediately, same turn (the page is polling for it).** Read the stage-1 `result.json` (`status: stage1-confirmed`). Using the user's **actual** confirmed anchors (not your originals), author the design-system candidates and **overwrite** `recommendations.json` with `"stage": "stage2"`: page count (content volume × `delivery_purpose`); color and typography as **generative ≥3-candidate** fields (creative recommendations always offer real choice; fewer than 3 only on the honest-shortfall exception, with a stated reason; color: core `palette` with background/secondary_bg/primary/accent/secondary_accent/body_text; typography: CJK + Latin for `heading` and `body` with `css` preview stacks + `body_size` as the body baseline in **px** (every canvas) — **one fixed value per confirmed `delivery_purpose`** (`text` 20 / `balanced` 24 / `presentation` 32), not a range; each typography candidate must include topic-matched `sample_heading` / `sample_heading_latin` / `sample_body` / `sample_body_latin` preview text, never a fixed unrelated industry sample); enumerable `icons` / `formula_policy` (recommended `id`). The still-open page polls, renders Stage 2, and preserves the user's Stage 1 picks. Then attach to the already-running page, do **not** relaunch: + ```bash + python3 ${SKILL_DIR}/scripts/confirm_ui/server.py --wait-only --wait-stage stage2 + ``` + This returns when the page writes the stage-2 `result.json` (`status: stage2-confirmed`). On a non-zero exit, re-check `result.json` once before falling back to chat. +4. **Re-derive Stage 3 from the confirmed anchors + design system, then wait for the final confirmation.** Read the stage-2 `result.json`. Author the image and execution recommendations and **overwrite** `recommendations.json` with `"stage": "stage3"`: `image_usage` as one or more source ids (`["ai"]`, `["ai","provided"]`, `["web","placeholder"]`, or `["none"]`; `none` is exclusive); `image_strategy.candidates` as **exactly three non-custom** rendering × palette recommendations from h.5 when `image_usage` includes `ai` (the page adds the fourth Custom card itself); enumerable `image_ai_path` / `generation_mode` and `refine_spec` (recommended `id` / boolean). If the recommendation involves several image sources, keep the source list structured in `recommend.image_usage` and write the usage rationale / page-role guidance into `image_notes` (for example, "封面和章节页用 AI 主视觉,产品页优先用户素材,行业背景页可用网络参考"). Write `image_ai_path` only when `image_usage` includes `ai`. Spot-illustration lean is **not** a candidate field here: it derives from the locked `visual_style`'s illustration propensity and is expressed only in the recommendation rationale / `image_notes`, never as a new confirmation field. Generated-image style palettes are **color behavior only**; final image colors follow the confirmed Stage-2 `color`. Custom image-strategy dimensions are handled by the built-in Custom card, are prose-only, and should not promise a gallery reference image. Then attach to the already-running page, do **not** relaunch (same 600000 ms budget): ```bash python3 ${SKILL_DIR}/scripts/confirm_ui/server.py --wait-only ``` - This is the ⛔ BLOCKING completion: returns when the page writes the final `result.json` (`status: confirmed`, `stage: final`, carrying all Tier 1 + Tier 2 fields). On a non-zero exit, re-check `result.json` once. Confirmed sizes are **already px** (the system is px-only — no pt anywhere, no conversion): write `result.json` `typography.body_size` / `sizes` into `design_spec.md` / `spec_lock.md` / SVG verbatim. `generation_mode: "split"` / `refine_spec: true` are explicit user choices. + This is the ⛔ BLOCKING completion: returns when the page writes the final `result.json` (`status: confirmed`, `stage: final`, carrying Stage 1 + Stage 2 + Stage 3 fields). On a non-zero exit, re-check `result.json` once. Confirmed sizes are **already px** (the system is px-only — no pt anywhere, no conversion): write `result.json` `typography.body_size` / `sizes` into `design_spec.md` / `spec_lock.md` / SVG verbatim. `generation_mode: "split"` / `refine_spec: true` are explicit user choices. 5. **Close the confirm page (Mandatory cleanup — every path).** Shut the server down before leaving Step 4 so it cannot keep holding port 5050 (which Step 6 live preview reuses): ```bash python3 ${SKILL_DIR}/scripts/confirm_ui/server.py --shutdown ``` **Idempotent and required regardless of whether Confirm was clicked**: clicking the final Confirm already shuts the page down (then a no-op); the chat-fallback path leaves it running. Run it after reading the confirmation, before Step 5. -**Always also print each tier's recommendations + URL in chat** as the always-valid fallback. **The chat fallback is two-step too**: if the page never opens or a wait times out with no fresh result, present Tier 1 in chat → get confirmation → re-derive → present Tier 2 → get confirmation → take those values. Either path converges. +**Always also print each stage's recommendations + URL in chat** as the always-valid fallback. **The chat fallback is staged too**: if the page never opens or a wait times out with no fresh result, present Stage 1 in chat → get confirmation → re-derive → present Stage 2 → get confirmation → re-derive → present Stage 3 → get confirmation → take those values. Either path converges. **Honoring the confirmation (result.json is authoritative — Mandatory)**: the confirmed values **override your own recommendations** when you write `design_spec.md` / `spec_lock.md`. A user who changed any field changed it on purpose. In particular, map `image_usage` to §VIII `Acquire Via` (its value names differ from §h options — translate). `image_usage` may be either a legacy single string or a Confirm UI multi-select array; for arrays, apply every selected source. `image_notes`, when present, is a user-authored image intent note that Strategist must honor while assigning per-page §VIII rows: @@ -394,7 +399,7 @@ When the confirmed `image_usage` does not include `ai` (and no legacy custom pro **Small spot illustrations are a Strategist judgment, not a confirmation field.** The user chooses image *source* through `image_usage`; whether the deck leans into decorative illustrations is anchored by the locked `visual_style`'s **illustration propensity** (`core` / `supportive` / `sparse`), expressed only in the `image_notes` rationale — never a new confirmation control. An explicit user request to use or skip illustrations overrides that default either way; `image_usage: none` still wins (write no illustration rows); and source still comes from `image_usage` — a `core` style does not silently generate AI spots when the user did not pick AI. They are ordinary §VIII image rows (`Type: Illustration` / `Illustration Sheet`) using normal `Acquire Via` values. If the plan needs ≥3 same-family AI spot illustrations, use the `ai` Illustration Sheet + `slice` workflow by default; do not generate one AI image per spot. Full rule + precedence: [`references/strategist.md`](references/strategist.md) §h. Use them on suitable pages and omit them where they would weaken clarity. -**Upstream override → re-derive untouched downstream (Mandatory — chat-fallback / single-pass path).** On the **two-tier page path this is already handled** (Step 3 re-derives Tier 2 from the user's actual anchors). It still applies whenever anchors and realization are confirmed **together** — the two-step chat fallback collapsed into one bundle, or a legacy single-pass `result.json`. "Confirmed value wins" governs each field's *own* value — never recompute a value the user set (a size, canvas, or palette they edited stays verbatim). But a single-pass `result.json` can carry a changed **anchor** beside downstream fields still holding your original — now incoherent — recommendation (e.g. switched to `dark-tech` while the light palette you proposed is untouched). Before writing the spec, reconcile: when the user changed an anchor, re-derive the downstream fields the user did **not** themselves edit so they realize the new anchor; fields the user pinned stay as confirmed. +**Upstream override → re-derive untouched downstream (Mandatory — chat-fallback / single-pass path).** On the **three-stage page path this is already handled** (Step 3 re-derives Stage 2 from the user's actual anchors; Step 4 re-derives Stage 3 from the confirmed anchors + design system). It still applies whenever anchors and downstream fields are confirmed **together** — the staged chat fallback collapsed into one bundle, or a legacy single-pass `result.json`. "Confirmed value wins" governs each field's *own* value — never recompute a value the user set (a size, canvas, or palette they edited stays verbatim). But a single-pass `result.json` can carry a changed **anchor** beside downstream fields still holding your original — now incoherent — recommendation (e.g. switched to `dark-tech` while the light palette you proposed is untouched). Before writing the spec, reconcile: when the user changed an anchor, re-derive the downstream fields the user did **not** themselves edit so they realize the new anchor; fields the user pinned stay as confirmed. | Anchor the user changed | Re-derive (only the downstream fields the user left at your recommendation) | |---|---| @@ -406,20 +411,20 @@ When the confirmed `image_usage` does not include `ai` (and no legacy custom pro Reconcile **without a new blocking wait** — fold the coherent values into `design_spec.md` / `spec_lock.md` and state the adjustment in the §8 next-step handoff (e.g. "you switched to `dark-tech`; the light palette you had left no longer fit, so background / accent were re-derived — tell me if you wanted the original"). Canvas is the explicit exception: font sizes are deliberately **not** rescaled on a canvas change (see strategist §g). -**Opt-out**: if the user has said they don't want the page (e.g. "不要网页" / "just confirm in chat" / "纯聊天确认"), skip the launch entirely (step 2) and present the Eight Confirmations in chat as before — steps 1, 3, 4 still apply (recommendations summary in chat; wait; take chat values). +**Opt-out**: if the user has said they don't want the page (e.g. "不要网页" / "just confirm in chat" / "纯聊天确认"), skip the launch entirely (step 2) and present the Strategist confirmation stage in chat as before — steps 1, 3, 4 still apply (recommendations summary in chat; wait; take chat values). The page is a **confirmation surface only** — Strategist still authors every recommendation; the page never generates content. -**Mandatory — split-mode note** (not a ninth confirmation): after listing the eight confirmation details, you MUST append exactly one short line (rendered in the user's language, prefixed with 💡) about generation mode. Pick the variant by qualitative read of Phase A signals — recommended page count, source-material bulk, whether `topic-research` ran with substantial web-fetch accumulation: +**Mandatory — split-mode note** (not a separate confirmation): after listing the Strategist confirmation stage details, you MUST append exactly one short line (rendered in the user's language, prefixed with 💡) about generation mode. Pick the variant by qualitative read of upstream-load signals — recommended page count, source-material bulk, whether `topic-research` ran with substantial web-fetch accumulation: | Signal read | Line content | |---|---| -| Heavy (long page count / bulky sources / heavy web-fetch accumulation) | State estimated page count and large source size; recommend switching to [split mode](workflows/resume-execute.md) after Step 5 — stop this chat, open a fresh window and input `继续生成 projects/` to enter Phase B (SVG generation + export); no response or "continue" = default continuous mode. | +| Heavy (long page count / bulky sources / heavy web-fetch accumulation) | State estimated page count and large source size; recommend switching to [split mode](workflows/resume-execute.md) after Step 5 — stop this chat, open a fresh window and input `继续生成 projects/` to enter the execution session (SVG generation + export); no response or "continue" = default continuous mode. | | Normal (default) | State scale is moderate, default continuous mode generates in one go; if mid-way window switch is desired, input `继续生成 projects/` after Step 5 to switch to [split mode](workflows/resume-execute.md). | This line is required output every run — the user must always see the mode choice exists. Whether to act on it is the user's call. When the Confirm UI is used, this choice also appears as the in-page generation-mode toggle and is captured in `result.json` (`generation_mode`); the chat-summary fallback still prints this line. -**Mandatory — spec-refinement note** (not a ninth confirmation): after the split-mode line, you MUST append one short opt-in line (rendered in the user's language, prefixed with 💡) telling the user they may **refine the spec first** — Strategist will produce the full design spec, then stop for review/revision of any part of it before any generation, via the [refine-spec](workflows/refine-spec.md) workflow. Default is OFF: no request → the spec is written in one go and the pipeline auto-proceeds as usual. Only when the user explicitly asks in chat (e.g. "refine the spec first") or confirms `refine_spec: true` through Confirm UI does the [refine-spec](workflows/refine-spec.md) workflow take over after the Eight Confirmations. This line, like the split-mode line, is required output every run — the user must see the choice exists; whether to act on it is theirs. When the Confirm UI is used, this choice also appears as the in-page refine-spec toggle and is captured in `result.json` (`refine_spec`); the chat-summary fallback still prints this line. +**Mandatory — spec-refinement note** (not a separate confirmation): after the split-mode line, you MUST append one short opt-in line (rendered in the user's language, prefixed with 💡) telling the user they may **refine the spec first** — Strategist will produce the full design spec, then stop for review/revision of any part of it before any generation, via the [refine-spec](workflows/refine-spec.md) workflow. Default is OFF: no request → the spec is written in one go and the pipeline auto-proceeds as usual. Only when the user explicitly asks in chat (e.g. "refine the spec first") or confirms `refine_spec: true` through Confirm UI does the [refine-spec](workflows/refine-spec.md) workflow take over after the Strategist confirmation stage. This line, like the split-mode line, is required output every run — the user must see the choice exists; whether to act on it is theirs. When the Confirm UI is used, this choice also appears as the in-page refine-spec toggle and is captured in `result.json` (`refine_spec`); the chat-summary fallback still prints this line. **Formula rendering policy lives inside item 7 (Typography plan)**: @@ -429,7 +434,7 @@ This line is required output every run — the user must always see the mode cho | `render-all` | Strategist renders every formula-worthy expression as PNG assets | | `text-only` | No formula rendering; formulas remain editable text / Unicode | -After the Eight Confirmations are approved and **before outputting `design_spec.md` / `spec_lock.md`**, if the confirmed formula policy is `mixed` or `render-all` and the content contains formula-worthy expressions, Strategist MUST: +After the Strategist confirmation stage is approved and **before outputting `design_spec.md` / `spec_lock.md`**, if the confirmed formula policy is `mixed` or `render-all` and the content contains formula-worthy expressions, Strategist MUST: 1. Identify explicit LaTeX and any source expressions that should be faithfully structured as formulas. 2. Write `/images/formula_manifest.json` with only the formulas selected for rendering. @@ -457,9 +462,9 @@ python3 ${SKILL_DIR}/scripts/analyze_images.py /images **✅ Checkpoint — Phase deliverables complete, auto-proceed to next step**: ```markdown ## ✅ Strategist Phase Complete -- [x] Read the auto-extracted facts already in `analysis/` (e.g. `source_profile.json`) before the Eight Confirmations -- [x] Eight Confirmations completed (user confirmed via Confirm UI `result.json` or chat fallback) -- [x] Split-mode note appended below the eight items (heavy or normal variant) +- [x] Read the auto-extracted facts already in `analysis/` (e.g. `source_profile.json`) before the Strategist confirmation stage +- [x] Strategist confirmation stage completed (user confirmed via Confirm UI `result.json` or chat fallback) +- [x] Split-mode note appended below the confirmation fields (heavy or normal variant) - [x] Spec-refinement opt-in line appended (default OFF; only the user's explicit request enters the refine-spec workflow) - [x] Design Specification & Content Outline generated - [x] Execution lock (spec_lock.md) generated @@ -520,13 +525,13 @@ Workflow: - [x] analyze_images.py re-run so image_analysis.csv covers the acquired web / AI / sliced images ``` -**Default — auto-proceed to Step 6.** Only when the user's Step 4 response explicitly opted into split mode (in chat or via Confirm UI `result.json` with `generation_mode: "split"`), output the Phase A hand-off below and stop this conversation: +**Default — auto-proceed to Step 6.** Only when the user's Step 4 response explicitly opted into split mode (in chat or via Confirm UI `result.json` with `generation_mode: "split"`), output the planning-session handoff below and stop this conversation: ```markdown - ## ✅ Phase A Complete + ## ✅ Planning Session Complete - [x] Spec: `design_spec.md`, `spec_lock.md` - [x] Resources: `sources/`, `images/`, `templates/` - - [ ] **Next**: open a fresh chat window and input `继续生成 projects/` to enter Phase B via the [`resume-execute`](workflows/resume-execute.md) workflow. + - [ ] **Next**: open a fresh chat window and input `继续生成 projects/` to enter the execution session via the [`resume-execute`](workflows/resume-execute.md) workflow. ``` > On acquisition failure, do NOT halt — follow the Failure Handling rule in [image-base.md](references/image-base.md) §5: retry once, then mark the row `Needs-Manual`, report to user, and continue to the checkpoint above. @@ -556,6 +561,7 @@ Read references/visual-styles/.md # aesthetic (spec_lock.md `vis python3 ${SKILL_DIR}/scripts/svg_editor/server.py --live --daemon ``` - Start it immediately when Executor begins; `svg_output/` may be empty. Editor opens at `http://localhost:5050`; if another project already holds it, the launcher **auto-advances to the next free port** — read the actual URL from the launch log and report that. +- Treat the launch URL as a checkpoint value: before writing the first SVG, either report the actual URL from the launcher or state the launch failure explicitly. Do not silently continue while claiming preview is available. - Run it as a long-running side process/session; do not wait for it to exit before generating SVG pages. Do not wait for user confirmation after startup. - **Service must keep running** until one of: (a) the user clicks **Exit preview** in the browser, or (b) the user explicitly asks in chat to stop it. Generation continues even if the user closes the editor. - **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/live-preview.md`](workflows/live-preview.md). @@ -585,7 +591,7 @@ python3 ${SKILL_DIR}/scripts/svg_quality_checker.py **✅ Checkpoint — Confirm all SVGs and notes are fully generated and quality-checked. Proceed directly to Step 7 post-processing**: ```markdown ## ✅ Executor Phase Complete -- [x] Live preview started and kept available at the reported URL +- [x] Live preview started before the first SVG and kept available at the reported URL - [x] All SVGs generated to svg_output/ - [x] svg_quality_checker.py passed (0 errors) - [x] Speaker notes generated at notes/total.md @@ -603,7 +609,7 @@ python3 ${SKILL_DIR}/scripts/svg_quality_checker.py 🚧 **Image readiness GATE** (when Step 5 left ai rows in `Needs-Manual`): every expected file must exist at `project/images/` before running 7.1. -**Failure recovery**: if a Step 7 command fails, fix the owning source artifact and resume from the failed sub-step per [`workflows/failure-recovery.md`](workflows/failure-recovery.md). Do not restart Phase A unless the owning source changed. +**Failure recovery**: if a Step 7 command fails, fix the owning source artifact and resume from the failed sub-step per [`workflows/failure-recovery.md`](workflows/failure-recovery.md). Do not restart the planning session unless the owning source changed. > If files are missing: PAUSE, list the missing filenames, point the user to `images/image_prompts.md` (each `### Image N:` block is paste-ready for ChatGPT / Gemini / Midjourney; auto-generated from `image_prompts.json`) and the required placement `project/images/`. Resume Step 7.1 only after all expected files are in place. `finalize_svg.py` and `svg_to_pptx.py` do not detect missing files at this layer — proceeding with gaps produces a deck with broken image references. @@ -634,6 +640,8 @@ python3 ${SKILL_DIR}/scripts/svg_to_pptx.py # # Add --svg-snapshot to additionally emit the SVG-image preview pptx alongside the native pptx: # exports/__svg.pptx ← SVG preview pptx (reads svg_final/) +# Add --native-objects to emit real editable chart/table objects instead of flattened shapes: +# exports/__native_charts.pptx ← native chart/table objects (data-pptx-native markers) ``` > The native pptx consumes `svg_output/` directly so the converter can preserve @@ -661,6 +669,16 @@ python3 ${SKILL_DIR}/scripts/svg_to_pptx.py > layout-tight page must keep every dy-stacked line as its own text frame. The > merge detector is conservative; mixed-layout text falls back to per-line frames. +> **Native table/chart objects** — supported data charts and pure text-grid +> tables carry `data-pptx-native` markers by default (Executor transcribes +> them at draw time; see `references/executor-base.md` §3.2) and the markers +> stay dormant. +> Add `--native-objects` only when the user explicitly wants +> PowerPoint-editable native tables/charts and accepts that those objects may +> render differently across PowerPoint / Keynote / LibreOffice / WPS. Without +> the flag, marked groups export through their SVG fallback children like +> ordinary SVG content. + **Optional animation flags** (page transitions are on by default; per-element entrance is off by default — turn it on only when the user asks for it): - `-t ` — page transition. Default `fade`. Options: `fade` / `push` / `wipe` / `split` / `strips` / `cover` / `random` / `none`. - `-a ` — per-element entrance animation. **Default `none`** — pages appear as a whole, no auto-firing element builds (the unsolicited cascade reads as the "AI deck" tell). Opt in with `auto` (map effect from group id: chart→wipe, card-/step-/pillar-→fly, title/takeaway→fade; image-like ids `hero` / `figure-` / `image` / `img-` / `kpi` cycle a richer pool — zoom / dissolve / circle / box / diamond / wheel — so multiple images vary across the deck), a specific effect like `fade`, or `mixed` for the legacy 16-effect cycle. Requires top-level `` groups (already required by Executor). 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 fb51ae3c9..f3d7e84e6 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 @@ -10,8 +10,9 @@ Global artifact ownership rules for PPT Master projects. | Artifact | Owner | Role | Read/write contract | |---|---|---|---| -| `sources/.md` | Content contract | Main pipeline source for text, tables, and chart data values | Strategist reads for content; do not replace values with PPTX geometry JSON in the main pipeline | -| `sources/` originals | Source archive | Imported source files and source-adjacent extracted assets | Project manager imports here; downstream reads by route | +| `sources/` content-type files | Content contract | Main pipeline source for text, tables, and chart data values | Strategist reads content-type files (`.md` / `.markdown` / `.txt` / `.csv` / `.tsv` / `.json` / `.jsonl` / `.yaml` / `.yml`) and judges by content; do not replace values with PPTX geometry JSON in the main pipeline | +| `sources/` converted-source originals | Source archive | Imported source files that have a converted content contract (`.pdf` / `.pptx` / `.docx` / `.xlsx` / `.html` / `.epub` / `.tex` / `.rst` / `.ipynb` / `.typ`, etc.) and source-adjacent extracted assets | Read via the converted `.md` in the main pipeline; direct-PPTX workflows read the `.pptx` by route | +| `sources/*.conversion_profile.json`, `sources/*_files/image_manifest.json` | Pipeline sidecar | Conversion audit record / asset index | NOT read as slide content; open only to audit a conversion or resolve assets | | `analysis/source_profile.json` | Machine fact index | Compact Strategist-facing PPTX intake digest | Main pipeline reads as factual context and recommendation candidates | | `analysis/.identity.json` | Native deck identity facts | Canvas, theme palette/fonts, observed usage | Read selectively when detailed identity facts are needed | | `analysis/.slide_library.json` | Native PPTX structure facts | Text slots, geometry, native tables, native chart caches | Direct PPTX workflows use as native fill/structure contract | @@ -21,7 +22,7 @@ Global artifact ownership rules for PPT Master projects. | `images/` | Runtime image pool | User, extracted, AI, web, formula, slice, EMF/WMF assets | Step 5 writes here; `analysis/image_analysis.csv` derives from current contents | | `icons/` | Project icon inventory | Icons copied by `icon_sync.py` for this project | Executor uses locked project icons; exporter may fall back to global library only as documented | | `templates/` | Project template reference | Step 3 imported specs, template SVGs, and non-image assets | Strategist/Executor read only when Step 3 is triggered | -| `confirm_ui/recommendations.json` | Confirmation proposal | Strategist-authored confirmation payload | Confirm UI reads; rewritten between Tier 1 and Tier 2 | +| `confirm_ui/recommendations.json` | Confirmation proposal | Strategist-authored confirmation payload | Confirm UI reads; rewritten between Stage 1, Stage 2, and Stage 3 | | `confirm_ui/result.json` | Confirmation result | User-confirmed values | Strategist treats final result as authoritative over recommendations | | `svg_output/` | Author source | Main-agent handwritten SVG pages | Quality checker and native PPTX export read this as canonical page source | | `notes/total.md` | Speaker-note source | Complete notes before splitting | Step 6 writes; Step 7.1 splits | @@ -37,7 +38,8 @@ Global artifact ownership rules for PPT Master projects. | Invariant | Rule | |---|---| -| Content values | Main pipeline text, tables, and chart values come from `sources/.md`, not from `slide_library.json`. | +| Content values | Main pipeline text, tables, and chart values come from content-type files in `sources/` (`.md` / `.markdown` / `.txt` / `.csv` / `.tsv` / `.json` / `.jsonl` / `.yaml` / `.yml`), not from `slide_library.json`. | +| 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 and slot facts for direct PPTX workflows. | | Design contract | `design_spec.md` explains; `spec_lock.md` executes. Executor must not infer execution values from prose. | | Image facts | `images/` is live state; `analysis/image_analysis.csv` is a regenerated view, not a durable cache. | 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 17f54feb5..022903d15 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 @@ -95,7 +95,7 @@ Before generating each page, output which template is used: ## 2. Design Parameter Confirmation (Mandatory Step) -Before the first SVG page, output a confirmation listing: canvas dimensions, body font size, color scheme (primary/secondary/accent HEX), font plan. Prevents spec/execution drift. +Before the first SVG page, output a confirmation listing: canvas dimensions, body font size, color scheme (primary/secondary/accent HEX), font plan, and the live-preview URL reported by the launcher. If the preview launch failed, state that failure before generating SVGs instead of silently proceeding. Prevents spec/execution drift. ### 2.1 Per-page spec_lock re-read (Mandatory) @@ -171,7 +171,7 @@ Before drawing each page, look up its entry in `page_charts` to decide which cha - **Generation rhythm**: lock global design context first, then generate pages sequentially in one continuous context. No batched groups (e.g., 5 at a time). - **Reference — image-led promotional pages (not a constraint)**: for travel, venue, product-introduction, hospitality, event, real-estate, and brochure-style decks, let images define the page skeleton before placing text. Consult [`image-layout-patterns.md`](image-layout-patterns.md) §Imported Deck Patterns and prefer patterns such as `#74` TOC image-navigation cards, `#75` asymmetric chapter banners, `#77` photo mosaic with a text cell, `#78` ambient banner + evidence photo + text panel, `#79` ribbon-header image cards, and `#80` side hero image + staggered evidence cards before falling back to plain left/right image-text splits. - **Phased batch 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 §3.1 below on every chart page — coordinate calibration is a post-generation step (see [`workflows/verify-charts.md`](../workflows/verify-charts.md)) that depends on these markers. + 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 §3.1 below on every chart page — coordinate calibration is a post-generation step (see [`workflows/verify-charts.md`](../workflows/verify-charts.md)) that depends on these markers — and **native object metadata** per §3.2 on every eligible data-chart page. 2. **Quality Check Gate**: run `python3 scripts/svg_quality_checker.py ` on `svg_output/`. Any `error` (banned features, viewBox mismatch, spec_lock drift, non-PPT-safe font, etc.) MUST be fixed on the offending page before proceeding — regenerate and re-check. Address `warning`s when straightforward. Do NOT defer to after `finalize_svg.py` — finalize rewrites SVG and masks some violations. 3. **Logic Construction Phase**: after SVGs pass the quality check, batch-generate speaker notes for narrative continuity. @@ -218,6 +218,33 @@ grep "chart-plot-area" /svg_output/.svg - **Reference — prefer semantic shapes over preset stacks (not a constraint)**: when a slide needs to express "ascending / converging / breaking through / stacking" — i.e., a relationship that goes beyond a generic arrow — prefer a single custom `` or `` that encodes the semantics geometrically, rather than stacking multiple preset arrows. A converging-tip path or a podium polygon reads faster than three arrows pointing at a label. Examples of this technique appear in many imported corporate decks; see `projects/01_template_import/svg_output/slide_01.svg` shape-158 for a reference (gradient-filled inward-pointing arrow). Do not codify these as templates — they are page-specific; the rule is just "consider polygon before stacking presets." - **Reference — visual depth through restraint (not a constraint)**: layered depth comes from rhythm (flat vs lifted, dense vs spacious), not from shadows everywhere. Shadow typically suits 2-3 genuinely floating elements per page (cards on photos, primary CTA, overlays); keep peer-grid cards, dividers, body containers flat. Reach for typography weight, spacing, accent bars, subtle tints **before** shadow. Full rules in shared-standards.md §6. +### 3.2 Native Object Metadata Marker (MANDATORY on eligible data-chart and text-grid table pages) + +> `svg_to_pptx.py --native-objects` converts marked groups into real PowerPoint chart/table objects (charts get an embedded Excel workbook). Markers stay dormant in the default export — pages render from their SVG children — but a deck without markers can never form native objects. Write the marker at draw time: the data is already in hand, and recovering it later costs a full re-read pass. + +**Hard rule**: every data chart whose type appears in the **Supported chart types** list of [shared-standards.md](shared-standards.md) "Native PPTX Table / Chart Markers" (the single authority for the eligible set, marker contract, and JSON schemas) gets `data-pptx-native="chart"` plus a `` JSON child on its top-level ``, transcribing the same data just plotted. Every pure text-grid data table gets `data-pptx-native="table"` the same way, transcribing all visible cell text into `columns` / `rows`. + +- Chart types absent from that list and conceptual/diagrammatic graphics (process flows, cycles, quadrant cards, timelines, KPI cards) get **no marker** — `svg_quality_checker.py` rejects unsupported marker types. +- Tables with merged, spanning, or graphical cells (icons, harvey balls, rating dots) get **no table marker** — the exporter rejects merged-cell metadata; they stay on the SVG fallback route. +- Transcribe, don't restyle: `categories` / `series[].values` are the numbers just plotted; `style.colors` carries the series HEX values already used on the page (from `spec_lock.colors`). +- 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.) when role sizes differ; if omitted, the exporter infers shared font family and base chart text size from visible fallback text inside the native marker. 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. If a fallback role has no explicit size, use the compact three-tier chart defaults from [shared-standards.md](shared-standards.md). +- 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, fall back to the deck body family and locked body size from `spec_lock.md typography`. +- 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; the native object is a data-editable counterpart with PowerPoint-default styling that users restyle by hand after export. Never simplify the SVG design to match what a native object could show. + +**Per-page verification** — after writing each eligible data-chart or text-grid table page, confirm the marker exists: + +```bash +grep "data-pptx-native" /svg_output/.svg +``` + ### SVG File Naming Convention Format: `_.svg` (two-digit number from 01; name matches the deck's language and the page title in the Design Spec). @@ -313,7 +340,7 @@ Chart SVGs referenced in **VII. Visualization Reference List** are loaded once v - **Freely adjust**: composition, axis ranges, grid, legend, spacing, decoration — as long as the chart stays accurate and readable - **Forbidden**: changing visualization type without spec justification; omitting data points or structural elements from the outline -> Templates: `templates/charts/` (70 types). Index: `templates/charts/charts_index.json` +> Templates: `templates/charts/` (76 types). Index: `templates/charts/charts_index.json` ### 5.1 Chart Coordinate Calibration @@ -374,7 +401,7 @@ Source of truth: `spec_lock.md typography`. Use `font_family` as default; overri If `spec_lock.md` is absent, consult [`strategist.md`](strategist.md) §g — do not invent a stack. -**Hard rule**: every SVG `font-family` stack MUST end with a pre-installed family (Microsoft YaHei / SimHei / SimSun / Arial / Calibri / Segoe UI / Times New Roman / Georgia / Consolas / Courier New / Impact / Arial Black). PPTX has no runtime fallback — missing fonts degrade to Calibri. +**Hard rule**: every SVG `font-family` stack MUST resolve to pre-installed exported Latin / EA typefaces (Microsoft YaHei / SimHei / SimSun / Arial / Calibri / Segoe UI / Times New Roman / Georgia / Consolas / Courier New / Impact / Arial Black). PPTX has no runtime fallback — missing fonts degrade to Calibri. --- diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/image-base.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/image-base.md index 0916191ae..63333e20b 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/image-base.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/image-base.md @@ -69,7 +69,7 @@ After all rows reach terminal status: - `image_prompts.json` exists when ≥1 ai row processed; every entry has `status ∈ {Generated, Needs-Manual}` (no `Pending` or `Failed` remaining) - `image_sources.json` exists when ≥1 web row processed; every entry has `license_tier ∈ {no-attribution, attribution-required, manual}` (`manual` = a user-supplied `--from-url` replacement) -> `Needs-Manual` is a legitimate terminal state for ai rows — Step 7 entry waits for the user to place the file. See [`image-generator.md`](./image-generator.md) §3.2 Offline Manual Mode. +> `Needs-Manual` is a legitimate terminal state for ai rows — Step 7 entry waits for the user to place the file. See [`image-generator.md`](./image-generator.md) §7 Offline Manual Mode. --- @@ -82,7 +82,7 @@ After all rows reach terminal status: 3. On second failure, set `Status: Needs-Manual`, log the reason in conversation, continue 4. After the phase completes, summarize all `Needs-Manual` rows for the user — list filenames, where prompts live (`images/image_prompts.md` paste-ready blocks for ai rows; refresh via `image_gen.py --render-md` if stale), and where to place generated files (`project/images/`). For `slice` rows, list the parent sheet filename and target element names; the user places the sheet, then the agent reruns `slice_images.py`. -`Needs-Manual` is also the entry status for **Offline Manual Mode** (no `IMAGE_BACKEND` configured, no host-native image tool in use). Affected ai rows are marked `Needs-Manual` from the start without a failed attempt — see [`image-generator.md`](./image-generator.md) §3.2. +`Needs-Manual` is also the entry status for **Offline Manual Mode** (no `IMAGE_BACKEND` configured, no host-native image tool in use). Affected ai rows are marked `Needs-Manual` from the start without a failed attempt — see [`image-generator.md`](./image-generator.md) §7 Offline Manual Mode. Path-specific retry policies (provider chain, backend chain) live in the path's own reference. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/image-generator.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/image-generator.md index 4b9417db1..cb921552b 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/image-generator.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/image-generator.md @@ -557,7 +557,7 @@ Triggered automatically when `IMAGE_BACKEND` is not configured (or Path A fails) - Do **not** run `image_gen.py --manifest` in Path B. That command is Path A and may use configured API/proxy backends even when the user confirmed host-native. - Still run `python3 scripts/image_gen.py --render-md project/images/image_prompts.json` so the human-readable sidecar exists without touching any backend. - **Batch for speed, mind the rate**: when the host can run independent tool calls in parallel (e.g. Claude Code issues independent calls concurrently), fire several generations together in modest groups — a few rows at a time (~3–4), not the whole manifest at once — so their latency overlaps without flooding the host's image quota. When the host only runs tools serially, generate one row at a time. This mirrors Path A's default concurrency of 3. -- Outputs **must** land at `project/images/` with dimensions matching the Image Resource List +- Outputs **must** land at `project/images/`. Match the Image Resource List dimensions when the host supports arbitrary sizes. Hosts with **fixed native resolutions** (common — e.g. ~1672x941 landscape / ~1086x1448 portrait) generate at the closest native size and backfill the actual pixels into the resource list `Dimensions` column — same convention as formula rows ("actual dimensions from formula manifest") and slice rows ("dimensions filled after slicing"). Do **not** upscale the file to fake the requested size (interpolation adds no detail); minor display-side upscaling (up to ~1.3x in practice) surfaces as a quality-checker warning — acknowledge and release per the warning policy. - Mark each item's `status` `Generated` in the manifest the moment its file lands — as each completes, not in one pass at the end (so an interrupted batch leaves accurate state) - Executor downstream is path-agnostic — no spec change required between Path A and Path B diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/image-layout-patterns.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/image-layout-patterns.md index 53e418f54..04bcbf7d3 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/image-layout-patterns.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/image-layout-patterns.md @@ -154,6 +154,8 @@ Stack any of these freely on top of a Primary structure. Multiple Modifiers per ## Overlay & Masking Treatments +> **Crop displacement (HARD rule for text over images).** `preserveAspectRatio="xMidYMid slice"` center-crops whatever the source aspect ratio does not cover — when source and display aspects differ, the subject can land under the text column even if the prompt asked for it on the "focal side". Before layering text on a slice-cropped image: estimate the crop from the aspect-ratio difference, and keep the **entire text column on the scrim's opaque plateau** — text must never start inside a gradient's transition zone. When the subject position is unverified, fall back to an opaque treatment (`#30` at high opacity, or a solid panel) instead of a two-stop scrim (`#29`). + 27. **Linear gradient mask for text legibility** — `` in `` (set `x1/y1/x2/y2` for direction) + overlay ``. Most common is top-to-bottom darkening on full-bleed cover images. 28. **Radial gradient vignette** — `` with dark outer stops; overlay ``. Focuses attention by darkening the periphery. 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 6626d6293..723135b01 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 @@ -22,7 +22,7 @@ Layout rules for pages where the image is placed **side-by-side with body text** 7. Fill results into the Design Specification's image resource list ``` -**When to run**: if image approach includes "B) User-provided", run the scan and populate the image resource list after the Strategist's Eight Confirmations and before content analysis / outlining. +**When to run**: if image approach includes "B) User-provided", run the scan and populate the image resource list after the Strategist's confirmation stage and before content analysis / outlining. --- diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/shared-standards.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/shared-standards.md index 4b891641f..4c11c203f 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/shared-standards.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/shared-standards.md @@ -169,10 +169,10 @@ One offending character invalidates the file and aborts export. Numeric refs (`& ## 4. Basic SVG Rules -- **viewBox** must match the canvas dimensions (`width`/`height` must match `viewBox`) +- **viewBox** MUST match the canvas dimensions; it is the single source of truth for canvas size. Root `width`/`height` are optional compatibility attributes and are not used as PPT Master canvas authority. - **Background**: Use `` to define the page background color - **``** has two purposes: (1) manual line breaks (use `dy` or explicit `y`); (2) inline run formatting on the same line (color/weight/size). `` is FORBIDDEN. See "Single logical line" rule below. -- **Fonts**: every `font-family` stack MUST end with a pre-installed family (Microsoft YaHei / SimSun / Arial / Times New Roman / Consolas …); `@font-face` is FORBIDDEN. Full rule: [`strategist.md §g`](strategist.md). +- **Fonts**: every `font-family` stack MUST resolve to pre-installed exported Latin / EA typefaces (Microsoft YaHei / SimSun / Arial / Times New Roman / Consolas …); `@font-face` is FORBIDDEN. Full rule: [`strategist.md §g`](strategist.md). - **Styles**: inline only (`fill=""`, `font-size=""`); `,import './Card.css',Low, 15,Styling,Use scoped styles by default,Astro scopes styles to component automatically, (scoped),,,Medium, 17,Styling,Integrate Tailwind properly,Use @astrojs/tailwind integration,Official Tailwind integration,Manual Tailwind setup,npx astro add tailwind,Manual PostCSS config,Low,https://docs.astro.build/en/guides/integrations-guide/tailwind/ 18,Styling,Use CSS variables for theming,Define tokens in :root,CSS custom properties for themes,Hardcoded colors everywhere,:root { --primary: #3b82f6; },color: #3b82f6; everywhere,Medium, 19,Data,Fetch in frontmatter,Data fetching in component frontmatter,Top-level await in frontmatter,useEffect for initial data,const data = await fetch(url),client-side fetch on mount,High,https://docs.astro.build/en/guides/data-fetching/ -20,Data,Use Astro.glob for local files,Import multiple local files,Astro.glob for markdown/data files,Manual imports for each file,const posts = await Astro.glob('./posts/*.md'),"import post1; import post2;",Medium, +20,Data,Use Astro.glob for local files,Import multiple local files,Astro.glob for markdown/data files,Manual imports for each file,const posts = await Astro.glob('./posts/*.md'),import post1; import post2;,Medium, 21,Data,Prefer content collections over glob,Type-safe collections for structured content,getCollection() for blog/docs,Astro.glob for structured content,await getCollection('blog'),await Astro.glob('./blog/*.md'),High, 22,Data,Use environment variables correctly,Import.meta.env for env vars,PUBLIC_ prefix for client vars,Expose secrets to client,import.meta.env.PUBLIC_API_URL,import.meta.env.SECRET in client,High,https://docs.astro.build/en/guides/environment-variables/ 23,Performance,Preload critical assets,Use link preload for important resources,Preload fonts above-fold images,No preload hints,"",No preload for critical assets,Medium, -24,Performance,Optimize images with astro:assets,Built-in image optimization, component for optimization, for local images,"import { Image } from 'astro:assets';","",High,https://docs.astro.build/en/guides/images/ +24,Performance,Optimize images with astro:assets,Built-in image optimization, component for optimization, for local images,import { Image } from 'astro:assets';,"",High,https://docs.astro.build/en/guides/images/ 25,Performance,Use picture for responsive images,Multiple formats and sizes, for art direction,Single image size for all screens, with multiple sources, with single size,Medium, 26,Performance,Lazy load below-fold content,Defer loading non-critical content,loading=lazy for images client:visible for components,Load everything immediately,"",No lazy loading,Medium, 27,Performance,Minimize client directives,Each directive adds JS bundle,Audit client: usage regularly,Sprinkle client:load everywhere,Only interactive components hydrated,Every component with client:load,High, -28,ViewTransitions,Enable View Transitions,Smooth page transitions, in head,Full page reloads,"import { ViewTransitions } from 'astro:transitions';",No transition API,Medium,https://docs.astro.build/en/guides/view-transitions/ +28,ViewTransitions,Enable View Transitions,Smooth page transitions, in head,Full page reloads,import { ViewTransitions } from 'astro:transitions';,No transition API,Medium,https://docs.astro.build/en/guides/view-transitions/ 29,ViewTransitions,Use transition:name,Named elements for morphing,transition:name for persistent elements,Unnamed transitions,"
",
without name,Low, 30,ViewTransitions,Handle transition:persist,Keep state across navigations,transition:persist for media players,Re-initialize on every navigation,"