Sync third-party and MCP marketplace plugins
Constraint: Public skills are published only by explicit administrator action unless they are tracked third-party market sources. Confidence: high Scope-risk: narrow Directive: Keep private/internal skills out of the public marketplace and preserve normal incremental market Git history. Tested: Marketplace validation passed.
This commit is contained in:
@@ -2,8 +2,8 @@
|
||||
"sourceId": "grill-me",
|
||||
"repo": "https://github.com/mattpocock/skills.git",
|
||||
"ref": "main",
|
||||
"commit": "5b15a47f2d7150f545fbcacbfe381787fc0230dc",
|
||||
"commit": "6654f6b60cd9d5be8b54c6fafe44346dabeb3b76",
|
||||
"adapter": "skill-collection",
|
||||
"sourcePath": "skills/productivity",
|
||||
"syncedAt": "2026-08-21T15:59:59Z"
|
||||
"syncedAt": "2026-08-24T16:00:00Z"
|
||||
}
|
||||
|
||||
@@ -3,5 +3,5 @@
|
||||
"name": "playwright浏览器自动化操作",
|
||||
"version": "20260605",
|
||||
"keySource": "none",
|
||||
"syncedAt": "2026-08-23T16:01:48Z"
|
||||
"syncedAt": "2026-08-24T16:01:54Z"
|
||||
}
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
"sourceId": "next-skills",
|
||||
"repo": "https://github.com/vercel/next.js.git",
|
||||
"ref": "canary",
|
||||
"commit": "cb463843e78506c6b79518af8125af05e6cbac77",
|
||||
"commit": "30e73d2d14803ff252638caa3d67f047a89e4bb5",
|
||||
"adapter": "skill-collection",
|
||||
"sourcePath": "skills",
|
||||
"syncedAt": "2026-08-23T16:00:00Z"
|
||||
"syncedAt": "2026-08-24T16:00:00Z"
|
||||
}
|
||||
|
||||
@@ -49,8 +49,8 @@ Thanks to [Kimi](https://www.kimi.com/code/?aff=ppt-master) for sponsoring this
|
||||
> **Editable is already table stakes — what sets PPT Master apart is native depth.** It hands you a real PowerPoint: slide masters, native shapes, data-backed charts and tables — not flat text boxes, and not a filled-in template. It also does more than lay slides out nicely — it reasons the argument into shape first, then designs; and that native depth keeps **converging with PowerPoint itself**, adding more of its native capabilities release after release. In form, it's a workflow that runs inside any agent-capable AI tool: hand the AI your topic or material, and it generates on your machine — your data stays local, no platform or model lock-in. How it works and where the limits are → [Product Positioning](#product-positioning).
|
||||
|
||||
<p align="center">
|
||||
<a href="https://hugohe3.github.io/ppt-master/"><strong>Live Demo</strong></a> ·
|
||||
<a href="./examples/"><strong>Examples</strong></a> ·
|
||||
<a href="https://hugohe3.github.io/ppt-master-examples/"><strong>Live Demo</strong></a> ·
|
||||
<a href="https://github.com/hugohe3/ppt-master-examples"><strong>Examples</strong></a> ·
|
||||
<a href="./docs/faq.md"><strong>FAQ</strong></a> ·
|
||||
<a href="./docs/roadmap.md"><strong>Roadmap</strong></a>
|
||||
</p>
|
||||
@@ -62,42 +62,42 @@ Thanks to [Kimi](https://www.kimi.com/code/?aff=ppt-master) for sponsoring this
|
||||
<table>
|
||||
<tr>
|
||||
<td align="center" width="33%">
|
||||
<a href="https://hugohe3.github.io/ppt-master/viewer.html?project=ppt169_pritzker_2026"><img src="docs/assets/screenshots/preview_pritzker_2026.png" alt="Editorial magazine — Pritzker 2026 architecture review" /></a><br/>
|
||||
<a href="https://hugohe3.github.io/ppt-master-examples/viewer.html?project=ppt169_pritzker_2026"><img src="docs/assets/screenshots/preview_pritzker_2026.png" alt="Editorial magazine — Pritzker 2026 architecture review" /></a><br/>
|
||||
<sub><b>Editorial Magazine</b> — architecture photography, calm typographic grid<br/>
|
||||
<a href="https://hugohe3.github.io/ppt-master/viewer.html?project=ppt169_pritzker_2026">Flip online</a> · <a href="https://raw.githubusercontent.com/hugohe3/ppt-master/main/examples/ppt169_pritzker_2026/exports/pritzker_2026.pptx">Download .pptx</a></sub>
|
||||
<a href="https://hugohe3.github.io/ppt-master-examples/viewer.html?project=ppt169_pritzker_2026">Flip online</a> · <a href="https://raw.githubusercontent.com/hugohe3/ppt-master-examples/main/examples/ppt169_pritzker_2026/exports/pritzker_2026.pptx">Download .pptx</a></sub>
|
||||
</td>
|
||||
<td align="center" width="33%">
|
||||
<a href="https://hugohe3.github.io/ppt-master/viewer.html?project=ppt169_global_ai_capital_2026"><img src="docs/assets/screenshots/preview_global_ai_capital.png" alt="Data journalism — Global AI Capital 2026" /></a><br/>
|
||||
<a href="https://hugohe3.github.io/ppt-master-examples/viewer.html?project=ppt169_global_ai_capital_2026"><img src="docs/assets/screenshots/preview_global_ai_capital.png" alt="Data journalism — Global AI Capital 2026" /></a><br/>
|
||||
<sub><b>Data Journalism</b> — Bloomberg-style dark dashboard, chart-driven<br/>
|
||||
<a href="https://hugohe3.github.io/ppt-master/viewer.html?project=ppt169_global_ai_capital_2026">Flip online</a> · <a href="https://raw.githubusercontent.com/hugohe3/ppt-master/main/examples/ppt169_global_ai_capital_2026/exports/global_ai_capital_2026.pptx">Download .pptx</a></sub>
|
||||
<a href="https://hugohe3.github.io/ppt-master-examples/viewer.html?project=ppt169_global_ai_capital_2026">Flip online</a> · <a href="https://raw.githubusercontent.com/hugohe3/ppt-master-examples/main/examples/ppt169_global_ai_capital_2026/exports/global_ai_capital_2026.pptx">Download .pptx</a></sub>
|
||||
</td>
|
||||
<td align="center" width="33%">
|
||||
<a href="https://hugohe3.github.io/ppt-master/viewer.html?project=ppt169_swiss_grid_systems"><img src="docs/assets/screenshots/preview_swiss_grid.png" alt="Swiss typographic grid — Grid Systems primer" /></a><br/>
|
||||
<a href="https://hugohe3.github.io/ppt-master-examples/viewer.html?project=ppt169_swiss_grid_systems"><img src="docs/assets/screenshots/preview_swiss_grid.png" alt="Swiss typographic grid — Grid Systems primer" /></a><br/>
|
||||
<sub><b>Swiss Grid</b> — strict modular grid, restrained type, red-accent<br/>
|
||||
<a href="https://hugohe3.github.io/ppt-master/viewer.html?project=ppt169_swiss_grid_systems">Flip online</a> · <a href="https://raw.githubusercontent.com/hugohe3/ppt-master/main/examples/ppt169_swiss_grid_systems/exports/swiss_grid_systems.pptx">Download .pptx</a></sub>
|
||||
<a href="https://hugohe3.github.io/ppt-master-examples/viewer.html?project=ppt169_swiss_grid_systems">Flip online</a> · <a href="https://raw.githubusercontent.com/hugohe3/ppt-master-examples/main/examples/ppt169_swiss_grid_systems/exports/swiss_grid_systems.pptx">Download .pptx</a></sub>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" width="33%">
|
||||
<a href="https://hugohe3.github.io/ppt-master/viewer.html?project=ppt169_glassmorphism_demo"><img src="docs/assets/screenshots/preview_glassmorphism_demo.png" alt="Glassmorphism SaaS — AI Agent engineering demo" /></a><br/>
|
||||
<a href="https://hugohe3.github.io/ppt-master-examples/viewer.html?project=ppt169_glassmorphism_demo"><img src="docs/assets/screenshots/preview_glassmorphism_demo.png" alt="Glassmorphism SaaS — AI Agent engineering demo" /></a><br/>
|
||||
<sub><b>Glassmorphism SaaS</b> — translucent layers, gradient depth, product UI<br/>
|
||||
<a href="https://hugohe3.github.io/ppt-master/viewer.html?project=ppt169_glassmorphism_demo">Flip online</a> · <a href="https://raw.githubusercontent.com/hugohe3/ppt-master/main/examples/ppt169_glassmorphism_demo/exports/glassmorphism_demo.pptx">Download .pptx</a></sub>
|
||||
<a href="https://hugohe3.github.io/ppt-master-examples/viewer.html?project=ppt169_glassmorphism_demo">Flip online</a> · <a href="https://raw.githubusercontent.com/hugohe3/ppt-master-examples/main/examples/ppt169_glassmorphism_demo/exports/glassmorphism_demo.pptx">Download .pptx</a></sub>
|
||||
</td>
|
||||
<td align="center" width="33%">
|
||||
<a href="https://hugohe3.github.io/ppt-master/viewer.html?project=ppt169_sugar_rush_memphis"><img src="docs/assets/screenshots/preview_sugar_rush_memphis.png" alt="Memphis pop — Sugar Rush festival" /></a><br/>
|
||||
<a href="https://hugohe3.github.io/ppt-master-examples/viewer.html?project=ppt169_sugar_rush_memphis"><img src="docs/assets/screenshots/preview_sugar_rush_memphis.png" alt="Memphis pop — Sugar Rush festival" /></a><br/>
|
||||
<sub><b>Memphis Pop</b> — bold primaries, geometric patterns, playful energy<br/>
|
||||
<a href="https://hugohe3.github.io/ppt-master/viewer.html?project=ppt169_sugar_rush_memphis">Flip online</a> · <a href="https://raw.githubusercontent.com/hugohe3/ppt-master/main/examples/ppt169_sugar_rush_memphis/exports/sugar_rush_memphis.pptx">Download .pptx</a></sub>
|
||||
<a href="https://hugohe3.github.io/ppt-master-examples/viewer.html?project=ppt169_sugar_rush_memphis">Flip online</a> · <a href="https://raw.githubusercontent.com/hugohe3/ppt-master-examples/main/examples/ppt169_sugar_rush_memphis/exports/sugar_rush_memphis.pptx">Download .pptx</a></sub>
|
||||
</td>
|
||||
<td align="center" width="33%">
|
||||
<a href="https://hugohe3.github.io/ppt-master/viewer.html?project=ppt169_indie_bookstore_zine_guide"><img src="docs/assets/screenshots/preview_indie_bookstore_zine.png" alt="Risograph zine — Indie bookstore guide" /></a><br/>
|
||||
<a href="https://hugohe3.github.io/ppt-master-examples/viewer.html?project=ppt169_indie_bookstore_zine_guide"><img src="docs/assets/screenshots/preview_indie_bookstore_zine.png" alt="Risograph zine — Indie bookstore guide" /></a><br/>
|
||||
<sub><b>Risograph Zine</b> — duotone print, hand-made bookstore-culture feel<br/>
|
||||
<a href="https://hugohe3.github.io/ppt-master/viewer.html?project=ppt169_indie_bookstore_zine_guide">Flip online</a> · <a href="https://raw.githubusercontent.com/hugohe3/ppt-master/main/examples/ppt169_indie_bookstore_zine_guide/exports/indie_bookstore_zine_guide.pptx">Download .pptx</a></sub>
|
||||
<a href="https://hugohe3.github.io/ppt-master-examples/viewer.html?project=ppt169_indie_bookstore_zine_guide">Flip online</a> · <a href="https://raw.githubusercontent.com/hugohe3/ppt-master-examples/main/examples/ppt169_indie_bookstore_zine_guide/exports/indie_bookstore_zine_guide.pptx">Download .pptx</a></sub>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<p align="center">
|
||||
<sub>Downloading any .pptx and opening it in PowerPoint is the fastest way to see what it can really do.<br/><a href="https://hugohe3.github.io/ppt-master/">Flip through all examples online →</a> · <a href="./examples/"><code>examples/</code> directory</a> · <a href="./docs/why-ppt-master.md">Why PPT Master?</a></sub>
|
||||
<sub>Downloading any .pptx and opening it in PowerPoint is the fastest way to see what it can really do.<br/><a href="https://hugohe3.github.io/ppt-master-examples/">Flip through all examples online →</a> · <a href="https://github.com/hugohe3/ppt-master-examples">Source repository</a> · <a href="./docs/why-ppt-master.md">Why PPT Master?</a></sub>
|
||||
</p>
|
||||
|
||||
---
|
||||
@@ -126,7 +126,7 @@ Why you'd choose it, and where it isn't the right fit → [Why PPT Master](./doc
|
||||
> ### This is a tool, not a wishing well
|
||||
> `harness + model = agent` — PPT Master only owns the workflow; the model sets the ceiling. Recommended: **Kimi K3 (or Claude) with a large context window (~1M tokens) + AI image generation (`gpt-image-2` or Google `gemini-3.1-flash-image`)**; 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.
|
||||
> 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](https://hugohe3.github.io/ppt-master-examples/).
|
||||
|
||||
---
|
||||
|
||||
@@ -369,7 +369,7 @@ PPT Master reads the current process environment first, then the first `.env` fo
|
||||
| 📖 | [SKILL.md](./skills/ppt-master/SKILL.md) | Core workflow and rules |
|
||||
| 📐 | [Canvas Formats](./skills/ppt-master/references/canvas-formats.md) | PPT 16:9, Xiaohongshu, WeChat, and 10+ formats |
|
||||
| 🛠️ | [Scripts & Tools](./skills/ppt-master/scripts/README.md) | All scripts and commands |
|
||||
| 💼 | [Examples](./examples/README.md) | All example projects |
|
||||
| 💼 | [Examples](https://hugohe3.github.io/ppt-master-examples/) | All example projects |
|
||||
| 🏗️ | [Technical Design](./docs/technical-design.md) | Architecture, design philosophy, why SVG |
|
||||
| ❓ | [FAQ](./docs/faq.md) | Model selection, cost, layout troubleshooting, custom templates |
|
||||
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
"sourceId": "ppt-master",
|
||||
"repo": "https://github.com/hugohe3/ppt-master.git",
|
||||
"ref": "main",
|
||||
"commit": "65bb2eca59a36270819caba377097910c4466c6e",
|
||||
"commit": "e2b4e6a7c43594a66fb477d00e18267ce50bbd93",
|
||||
"adapter": "claude-skill",
|
||||
"sourcePath": "skills/ppt-master",
|
||||
"syncedAt": "2026-08-22T16:00:00Z"
|
||||
"syncedAt": "2026-08-24T16:00:00Z"
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
name: ppt-master
|
||||
description: "多格式源文档到高质量 SVG 页面再导出 PPTX 的多阶段演示文稿生成工作流。"
|
||||
metadata:
|
||||
version: "4.8.0"
|
||||
version: "5.0.0"
|
||||
copyright: "Copyright (c) 2025-2026 Hugo He"
|
||||
license: "MIT"
|
||||
official_repository: "https://github.com/hugohe3/ppt-master"
|
||||
|
||||
+39
-9
@@ -16,16 +16,46 @@ the grammar does not select `Structure=yes` or create a geometry quota.
|
||||
|
||||
## 1. Relationship Atoms
|
||||
|
||||
| Atom | Meaning | Encode with |
|
||||
|---|---|---|
|
||||
| `order` | Sequence, progression, or rank | Position, numbering, direction, shared path |
|
||||
| `link` | Dependency, exchange, influence, transition | Proximity/alignment when unmistakable; otherwise an edge |
|
||||
| `parent` | One unit governs or decomposes into children | Branching, indentation, nesting, scale |
|
||||
| `membership` | Units belong to a group, stage, lane, or region | Containment, shared field, band, repetition |
|
||||
| `contrast` | Peers, states, options, or positions compare | Shared baseline, opposing regions, parallel framing |
|
||||
| `overlap` | Units share a meaningful subset or duty | Intersecting regions plus a clear common area |
|
||||
**Mandatory — relationship → topology before contour**: For each active atom,
|
||||
resolve only the path, junctions, enclosure, field partition, shared region,
|
||||
scale change, and entry / endpoint that carry meaning. Adapt that topology to
|
||||
the actual units, text load, page role, and active visual system before
|
||||
selecting contours.
|
||||
|
||||
Combine atoms as needed; never force a named business model. Numbers used only as labels do not create a chart. Value-derived position/length/angle/area/radius/width/color routes to [`executor-chart.md`](./executor-chart.md); row-header × column-header facts route to [`executor-table.md`](./executor-table.md). Qualitative lanes use this grammar, but date/duration-driven task-bar `x`/`width` is Gantt Chart geometry.
|
||||
| Atom | Meaning | Encode with | Generate topology from |
|
||||
|---|---|---|---|
|
||||
| `order` | Sequence, progression, or rank | Position, numbering, direction, shared path | One reading path: open / closed; straight / bent / stepped / switchback / coiled; level / rising / falling; constant / expanding / contracting; turns, milestones, endpoint |
|
||||
| `link` | Dependency, exchange, influence, transition | Proximity / alignment when unmistakable; otherwise an edge | Sources, targets, and junctions: direct, hub, chain, split, merge, exchange, or feedback; let the relationship determine the fewest necessary edges |
|
||||
| `parent` | One unit governs or decomposes into children | Branching, indentation, nesting, scale | Root, depth, and sibling groups: branch, indent, nest, radiate, or scale; let child roles set fan-out and weight |
|
||||
| `membership` | Units belong to a group, stage, lane, or region | Containment, shared field, band, repetition | Owning fields: enclose, band, lane, cluster, repeat, or nest; let content set field shape and occupancy |
|
||||
| `contrast` | Peers, states, options, or positions compare | Shared baseline, opposing regions, parallel framing | Shared invariants plus separation: one or more semantic axes / baselines, opposing or parallel fields, counterweight, divergence, or a before / after boundary |
|
||||
| `overlap` | Units share a meaningful subset or duty | Intersecting regions plus a clear common area | Exact exclusive / shared regions: paired, chained, or layered intersections; keep every owner and common area legible |
|
||||
|
||||
**Reference — not a constraint**: `Generate topology from` names common
|
||||
transform axes rather than an exhaustive set. Combine, deform, or invent
|
||||
page-fit topologies from the active atoms; never recall a named diagram or
|
||||
reproduce a listed form by default.
|
||||
|
||||
**Mandatory — combined-atom spatial relation before contour**: Combine atoms as
|
||||
needed; never force a named business model. When multiple atoms share one
|
||||
construct, resolve whether their topologies share a field, nest, run in
|
||||
parallel, cross orthogonally, or intersect. Orthogonal overlay applies when
|
||||
independent dimensions occupy one field, including but not limited to an
|
||||
`order` path across `membership` lanes and two independent `contrast`
|
||||
dimensions; preserve each atom's ownership and reading direction. The overlay
|
||||
never implies equal partitions.
|
||||
|
||||
**Hard rule — no topology from balance alone**: Node count and text fit may
|
||||
change spacing, route, or wrap. They never justify equal shapes, gaps, or
|
||||
partitions, mirroring, radial symmetry, or closure that invents peer weight,
|
||||
centrality, reciprocity, or recurrence.
|
||||
|
||||
Numbers used only as labels do not create a chart. Value-derived position,
|
||||
length, angle, area, radius, width, or color routes to
|
||||
[`executor-chart.md`](./executor-chart.md); row-header × column-header facts
|
||||
route to [`executor-table.md`](./executor-table.md). Qualitative lanes use this
|
||||
grammar, but date / duration-driven task-bar `x` / `width` is Gantt Chart
|
||||
geometry.
|
||||
|
||||
---
|
||||
|
||||
|
||||
+35
-24
@@ -149,29 +149,38 @@ owned by the preserve/mirror round-trip contract.
|
||||
- `chartX`, `chartStar`, or `chartPlus` as a substitute for native charts;
|
||||
- logo, icon glyph, illustration, brand contour, or data-chart marks.
|
||||
|
||||
### 2.1 Compound page geometry
|
||||
### 2.1 Topology assembly and compound page geometry
|
||||
|
||||
**Trigger**: after the page or prototype's communication / slot job, composition
|
||||
anchors, and any applicable topology under
|
||||
**Trigger**: after the page or prototype's communication / slot job,
|
||||
composition anchors, and any applicable topology under
|
||||
[`executor-structure.md`](./executor-structure.md) are resolved, but before
|
||||
writing coordinates, resolve the page-scale geometry move that best carries its
|
||||
background field, content zoning, focal hierarchy, or reading path. Apply §1's
|
||||
exact-fit decision and compare the useful lenses below. Before repeating stacked
|
||||
rectangles / rounded cards or uniform equal columns, compare a page-field,
|
||||
outline, nesting, or continuity construction and the relevant contour family's
|
||||
exact members. Readability of the first workable arrangement does not close this
|
||||
gate.
|
||||
This applies whether the per-page Structure result is `no` or `yes`; it never
|
||||
creates a decoration requirement.
|
||||
writing coordinates, run this gate at every active granularity. For
|
||||
`Structure=yes`, assemble each resolved topology without changing it, using
|
||||
[`topology-assembly.md`](./topology-assembly.md) as assembly and relative
|
||||
registration material; for every page, resolve the page-scale geometry move
|
||||
carrying its background field,
|
||||
content zoning, focal hierarchy, or reading path. Apply §1's exact-fit decision
|
||||
and compare the useful lenses below. Before repeating stacked rectangles /
|
||||
rounded cards or uniform equal columns, compare a page-field, outline, nesting,
|
||||
or continuity construction and the relevant contour family's exact members.
|
||||
Readability of the first workable arrangement does not close this gate. This
|
||||
never creates a decoration requirement.
|
||||
|
||||
| Pass | Action | Result |
|
||||
|---|---|---|
|
||||
| Page job | Name the page-scale geometry move and its jobs: surface, boundary, focal mark, shared region, counterweight, or any source-backed direction / reveal. | One composition direction and a small set of functional zones; no shape names yet. |
|
||||
| Decompose | Separate visible content from geometric atoms. Identify which atoms need independent movement, paint, or reuse and which contour must become one object. | Editable siblings plus any explicit Boolean operand set. |
|
||||
| Select | Choose the contour family, then its exact member from the job, full native vocabulary, and edge / corner / opening behavior; retain the reader effect when the result is generic or undrawn. | Page-fit native atoms without syntax bias. |
|
||||
| Compose | Establish page frame, scale, z-order, and negative space with independent atoms. Keep text, images, icons, data marks, and non-merged accents outside Boolean operands. | One page-level geometry system, not a collection of unrelated decorations. |
|
||||
| Topology / page job | Retain the resolved topology and state its relationship duties; name the page-scale geometry move and its jobs: surface, boundary, focal mark, shared region, counterweight, or any source-backed direction / reveal. | Required relationship duties plus one composition direction and a small set of functional zones; no shape names yet. |
|
||||
| Decompose | Partition the resolved topology and visible content. Identify components needing independent editing, movement, paint, animation, or reuse; separately identify contour / region semantics that require one object or independently retained Boolean result paths. | Editable siblings plus any explicit Boolean operand set. |
|
||||
| Select | For each required component, choose the contour family, then its exact member from the job, full native vocabulary, and edge / corner / opening behavior; retain the reader effect when the result is generic or undrawn. | Page-fit native atoms without syntax bias. |
|
||||
| Compose | Assemble the resolved topology from its independent atoms, then establish page frame, scale, z-order, and negative space. Keep text, images, icons, data marks, and non-merged accents outside Boolean operands. | Relationship-faithful assembly inside one page-level geometry system, not unrelated decorations. |
|
||||
| Materialize | Run the preset helper for each adopted preset. Run the Boolean helper only for contours that require Merge Shapes semantics, then replace those operands with its stdout paths. | Valid authoring SVG ready for native export. |
|
||||
|
||||
**Reference — not a constraint**: At topology scale, compare independent pieces,
|
||||
one body with dividers, overlapping siblings, fitted joints, intentional gaps,
|
||||
and independently retained `fragment` regions. These are common assembly
|
||||
strategies rather than an exhaustive set. Choose from component independence
|
||||
and contour / region semantics; never map a topology name to a shape list or
|
||||
infer equal size or spacing.
|
||||
|
||||
**Composition lenses — not a checklist**:
|
||||
|
||||
| Lens | Use when it strengthens the resolved page |
|
||||
@@ -432,15 +441,17 @@ reads correctly at slide scale.
|
||||
|
||||
### 7.3 Fragment as a modelling tool, not just a boolean
|
||||
|
||||
`fragment` (§6) is the fastest way to build layered diagrams from one silhouette:
|
||||
lay evenly distributed bars across a triangle and fragment it into pyramid tiers;
|
||||
cross a circle with two bars for a quadrant wheel; slice an annulus radially for
|
||||
ring segments. Every piece inherits the parent contour, so the assembly stays
|
||||
perfectly registered — impossible to achieve by drawing the tiers separately.
|
||||
`fragment` (§6) can build registered layered diagrams from one silhouette:
|
||||
cross a triangle with topology-derived bars for pyramid tiers; cross a circle
|
||||
with two topology-derived bars for a quadrant wheel; slice an annulus radially
|
||||
for ring segments. These are construction examples rather than topology
|
||||
defaults or an exhaustive set. Every retained piece inherits the parent contour,
|
||||
so the assembly stays registered without independently redrawing its parts.
|
||||
|
||||
Distribute the cutting bars with a constant step before fragmenting; uneven tiers
|
||||
read as a mistake rather than a hierarchy. Paint the resulting pieces with one
|
||||
gradient family per §7.1 so the stack reads as a single solid.
|
||||
Derive cutter count, position, and piece size from the resolved topology. Use a
|
||||
constant step and one §7.1 gradient family only when equal tier / segment weight
|
||||
and one-solid reading are semantic; otherwise preserve the required differences
|
||||
in geometry and paint.
|
||||
|
||||
### 7.4 Soft edges without the soft-edge effect
|
||||
|
||||
|
||||
@@ -0,0 +1,275 @@
|
||||
> See [`executor-structure.md`](./executor-structure.md) §1 for relationship → topology and [`native-shape-authoring.md`](./native-shape-authoring.md) §§1–2.1 for contour selection and materialization.
|
||||
|
||||
# Topology Assembly Reference
|
||||
|
||||
Generative material for turning one resolved qualitative topology into editable native-shape components with coherent relative registration before coordinates.
|
||||
|
||||
**Load**: Default and Quick read this reference once with the fixed construction
|
||||
bundle before SVG authoring and reuse it for every `Structure=yes` assembly.
|
||||
|
||||
**Hard rule — relative constraints, never copyable geometry**: State exact
|
||||
preset or primitive identities, semantic counts, inter-component relations, and
|
||||
only the relative geometry required to make the assembly hold together. Never
|
||||
provide coordinates, concrete sizes or ratios, adjustment values, points, path
|
||||
data, SVG fragments, copy, color, styling, page composition, or full-page
|
||||
frames. Materialize every adopted call fresh through
|
||||
[`native-shape-authoring.md`](./native-shape-authoring.md).
|
||||
|
||||
**Mandatory — two-step assembly test**: Preserve the topology resolved by
|
||||
[`executor-structure.md`](./executor-structure.md); do not select or rename it
|
||||
here. Then decide in order:
|
||||
|
||||
1. Split every piece that needs independent editing, movement, paint, animation, or reuse.
|
||||
2. From outline and region semantics, choose one continuous shape, one shape with dividers, stacked siblings, seamed pieces, overlapping siblings, or independently retained Boolean regions.
|
||||
|
||||
**Mandatory — registration closure**: After the two-step test, resolve only the
|
||||
relative conditions that make the chosen pieces read as one construct: shared
|
||||
datum, center, taper, or contour; aligned endpoints and seams; fitted contact or
|
||||
intentional clearance; nesting margin; overlap depth; joint type; direction
|
||||
continuity; and cutters that fully cross the parent silhouette. A set of valid
|
||||
individual shapes is not an assembly until its required contacts and boundaries
|
||||
register.
|
||||
|
||||
**Hard rule — no assembly lookup**: Never recall a paragraph as a named
|
||||
structure, resolve a key, or match the page to the nearest mechanism. Generate
|
||||
from the active atoms and the two-step test; adapt, combine, or invent calls and
|
||||
relative constraints even when no paragraph resembles the result.
|
||||
|
||||
**Reference — not a constraint**: The mechanisms below are common generative
|
||||
material rather than an exhaustive set, ranking, recommendation, or allowed
|
||||
combination list. A primitive, another registered preset, necessary freeform,
|
||||
or no drawn carrier may still win the current contour comparison.
|
||||
|
||||
**Hard rule — semantic counts, not balance**: Derive every call count from real
|
||||
units, runs, turns, boundaries, junctions, owners, or retained regions. A count
|
||||
never implies equal size, spacing, angle, weight, or symmetry. Closure,
|
||||
mirroring, centrality, taper, interlock, and contact require the relationship
|
||||
meaning already resolved upstream.
|
||||
|
||||
**Hard rule — information-model boundary**: Value-derived position, length,
|
||||
width, area, angle, radius, or color remains Chart geometry; row-header ×
|
||||
column-header facts remain Table. The assemblies below carry only qualitative
|
||||
relationships.
|
||||
|
||||
---
|
||||
|
||||
## 1. `order`
|
||||
|
||||
For independently owned stages on one directional path, call `chevron` once per
|
||||
stage and keep the calls as siblings. On a continuous handoff, register each
|
||||
tip into the next notch and keep the entry / exit direction coherent through
|
||||
the joint; let the tip enter far enough to close the carrier without occluding
|
||||
the next stage's independently owned interior. Preserve an intentional gap when
|
||||
the boundary is a pause, reset, or discontinuity. The per-stage split preserves
|
||||
independent edit, paint, animation, and reuse duties; continuity versus boundary
|
||||
semantics decides fitted interlock versus clearance. Stage bodies may vary with
|
||||
their duties while every adopted joint still fits.
|
||||
|
||||
For a path that wraps and reverses, call `rightArrow` once per forward run,
|
||||
`leftArrow` once per return run, `downArrow` once per turn, and `roundRect` once
|
||||
per independently owned stop. Place successive runs on distinct parallel
|
||||
baselines; align each turn's entry with the preceding run endpoint and its exit
|
||||
with the next run entry so the path neither doubles back ambiguously nor jumps
|
||||
across a gap. Attach each stop to its owning run without covering the carrier's
|
||||
entry, exit, or turn joint. Stops split for independent duties; run and turn
|
||||
pieces split because each owns a distinct direction / continuation duty.
|
||||
Contact at a turn means continuation, while clearance means a stage break; run
|
||||
lengths and offsets follow the resolved path rather than a regular wrap.
|
||||
|
||||
For recurrence with independently owned stages, call `blockArc` once per stage
|
||||
and seam the siblings into one closed reading path. Make every segment share one
|
||||
center and registered inner / outer contours; meet adjacent end faces on both
|
||||
contours so the ring has neither accidental steps nor overlaps. Segment spans
|
||||
may differ, but their sequence and seam direction must remain legible. Retain a
|
||||
gap only for a semantic reset. When recurrence is one indivisible duty, call one
|
||||
`circularArrow` instead. Stage independence decides one versus many pieces;
|
||||
recurrence and direction decide closure, while shared-center registration makes
|
||||
the segmented result one carrier rather than unrelated arcs.
|
||||
|
||||
---
|
||||
|
||||
## 2. `link`
|
||||
|
||||
For a qualitative split or merge, call `roundRect` once per semantic source or
|
||||
target and `line` once per necessary edge. Call `ellipse` zero or one time for
|
||||
each junction: omit it when edges merely share a meeting point, and retain it
|
||||
when the junction is independently editable, reusable, or animatable. Terminate
|
||||
each edge on its node boundary rather than inside the node; make converging edge
|
||||
endpoints meet the same junction, preserve a collinear shared trunk when one
|
||||
exists, and separate branches soon enough that they do not read as one line.
|
||||
An apparent crossing must either remain visibly non-joining or receive a real
|
||||
semantic junction. Nodes, edges, and retained junctions split by ownership;
|
||||
junction and outline semantics decide an implied meeting, one visible node, or
|
||||
separate passing paths.
|
||||
|
||||
For a two-way exchange owned as one relationship, call one `leftRightArrow`
|
||||
between two independently owned `roundRect` nodes. Register both arrow ends to
|
||||
the facing node boundaries and preserve one uninterrupted exchange corridor.
|
||||
When the two directions need independent editing, paint, animation, or reuse,
|
||||
call one `rightArrow` and one `leftArrow` as parallel siblings instead. Keep the
|
||||
two directional corridors distinct, align each endpoint to its own node port,
|
||||
and prevent either arrowhead from covering the other carrier or a node interior.
|
||||
Directional responsibility decides whether the edge splits; reciprocal-single-
|
||||
duty versus two owned transfers decides one contour or two, while endpoint and
|
||||
corridor registration preserves the exchange.
|
||||
|
||||
---
|
||||
|
||||
## 3. `parent`
|
||||
|
||||
For enclosure hierarchy or nested bubbles, call `ellipse` once per unit that
|
||||
owns a visible boundary and nest each child inside its immediate parent. Keep
|
||||
all ellipses as independent siblings rather than unioning parent and child.
|
||||
Preserve a visible containment margin around every child, keep its complete
|
||||
boundary inside the parent, and prevent sibling interiors from touching unless
|
||||
another active atom requires contact or overlap. Deeper levels may move,
|
||||
contract, or cluster asymmetrically; they need only preserve unambiguous
|
||||
containment and enough parent field to remain perceptible. Independent node
|
||||
ownership requires separate edit, movement, paint, animation, and reuse;
|
||||
enclosure semantics requires nesting while preserving every outline.
|
||||
|
||||
For an indented decomposition without explicit relationship edges, call
|
||||
`roundRect` once per independently owned node and `leftBrace` once for each
|
||||
parent whose child group needs a visible shared boundary. Register siblings to
|
||||
one depth datum, place the child group deeper than its parent, and make the brace
|
||||
span only that parent's actual children with its open side facing their shared
|
||||
entry edge. Nested braces must remain distinct and must not cross a node
|
||||
boundary. Nodes split for independent duties; the brace remains a separate
|
||||
shared ownership mark because one outline governs several children. Depth and
|
||||
group extent, not equal offsets or repeated widths, carry the hierarchy.
|
||||
|
||||
---
|
||||
|
||||
## 4. `membership`
|
||||
|
||||
For independently owned qualitative lanes, call `rect` once per lane and
|
||||
`roundRect` once per member that needs a carrier. Keep lane fields as parallel
|
||||
siblings; make adjacent long boundaries share one seam when membership is
|
||||
continuous, or preserve a clear gap when the groups are separate fields. Keep
|
||||
each member's complete contour inside its owning lane with a visible nesting
|
||||
margin; cross a lane boundary only when the member truly has multiple ownership
|
||||
or changes owner. If all lanes form one indivisible field and only boundaries
|
||||
carry meaning, call one `rect` for the field and `line` once per semantic lane
|
||||
boundary instead. Independent lane / member duties require siblings; one-field
|
||||
semantics permits dividers. Lane width and occupancy follow responsibility, not
|
||||
uniform partitioning.
|
||||
|
||||
For membership that needs a light grouping boundary rather than a closed field,
|
||||
call `leftBrace` once per group and `roundRect` once per independently owned
|
||||
member. Keep the brace separate, face its open side toward the members, span the
|
||||
complete member group but no adjacent group, and maintain clearance so neither
|
||||
the brace nor a nested brace touches a member contour. Members split for
|
||||
independent edit, movement, paint, animation, and reuse; one brace is the shared
|
||||
ownership mark because the group boundary itself is one duty. Member count does
|
||||
not require repeated contours, equal spacing, or equal weight.
|
||||
|
||||
---
|
||||
|
||||
## 5. `contrast`
|
||||
|
||||
For opposing fields on one comparison baseline, call `rect` once per field when
|
||||
the sides need independent editing, movement, paint, animation, or reuse. Align
|
||||
the comparable anchors to a shared baseline and register the facing boundaries
|
||||
as parallel edges separated by either a semantic gap or one explicit `line`
|
||||
divider; do not let an incidental offset become a false rank. If the field is
|
||||
one indivisible duty and only the state boundary matters, call one `rect` plus
|
||||
one `line` at that boundary instead. Independent side responsibility decides
|
||||
two siblings versus one divided field; opposing-field semantics decides the
|
||||
facing joint. Shared framing and counterweight never require equal dimensions
|
||||
or mirrored content.
|
||||
|
||||
For a tapered rank or support stack, call `trapezoid` once per independently
|
||||
owned tier and stack the siblings with semantic seams. Register all tier side
|
||||
edges to one shared taper, make each adjacent seam meet across the complete
|
||||
current width, and vary tier width monotonically in the rank direction without
|
||||
assuming equal change, height, or area. Do not substitute one `triangle` plus
|
||||
divider lines when tiers need independent paint or animation. If the whole
|
||||
stack is one duty, call one `triangle` plus one `line` per semantic tier
|
||||
boundary; make every divider cross the interior and terminate on both outer
|
||||
edges so no tier leaks into the next. If one registered outer silhouette and
|
||||
independently retained tier regions are both required, call one `triangle` plus
|
||||
one `rect` strip per tier region, make every strip fully cross the parent
|
||||
silhouette and meet the next strip without an accidental sliver, run `fragment`,
|
||||
and retain the required triangle-covered regions. Independent tier duty decides
|
||||
the split; continuous-outline versus retained-region semantics decides stacked
|
||||
siblings, dividers, or Boolean regions. Shared taper and complete crossings keep
|
||||
all three routes registered as one stack.
|
||||
|
||||
---
|
||||
|
||||
## 6. `overlap`
|
||||
|
||||
When each owner must remain independently editable and the shared area needs no
|
||||
separate treatment, call `ellipse` once per owner and overlap the calls as
|
||||
siblings without Boolean materialization. Preserve enough of every complete
|
||||
owner boundary to identify it, make each intended common area substantial
|
||||
enough to read as a region rather than an accidental tangent, and avoid full
|
||||
containment unless subset meaning is active. Choose overlap order and depth so
|
||||
one owner does not erase another owner or create unintended micro-regions.
|
||||
Owner responsibility requires the split; outline semantics preserves each
|
||||
complete boundary, while the common area remains a consequence of overlap.
|
||||
Paired, chained, or layered ownership does not imply equal ellipses or symmetric
|
||||
intersection.
|
||||
|
||||
When exclusive and shared regions need independent editing, paint, animation,
|
||||
or reuse, call `ellipse` once per owner, run `fragment` across the overlapping
|
||||
set, and retain every required exclusive / shared result as an independent
|
||||
shape. Register the owner overlaps before fragmenting so their crossings produce
|
||||
only the semantic regions; eliminate accidental tangencies, hidden owners, and
|
||||
unintended slivers rather than retaining them as topology. Region
|
||||
responsibility—not owner count alone—requires the further split; exact retained-
|
||||
region semantics requires `fragment` rather than ordinary siblings or
|
||||
`intersect`, which keeps only the common region. Retain no region merely to
|
||||
complete a symmetric pattern.
|
||||
|
||||
---
|
||||
|
||||
## 7. Combined atoms
|
||||
|
||||
**Mandatory — compose active topologies, not reference paragraphs**: Generate
|
||||
each active atom's topology from its own relationship duties, then resolve how
|
||||
those topologies share a field, nest, run in parallel, cross orthogonally, or
|
||||
intersect. Preserve each atom's ownership and reading direction. Let one
|
||||
component carry several atoms only when its edit, movement, paint, animation,
|
||||
reuse, outline, and region duties never need to separate; otherwise keep the
|
||||
atom systems as registered siblings. Re-run the two-step test at every contact,
|
||||
crossing, shared boundary, and retained region. A shared field does not make one
|
||||
atom dominant, and authoring convenience never justifies merging them.
|
||||
|
||||
For an actual `order` path crossing `membership` lanes, call `rect` once per
|
||||
independently owned lane, `roundRect` once per process unit, `line` once per
|
||||
necessary transition, and `line` once per semantic phase boundary. Keep all
|
||||
lane bands parallel and register the process axis orthogonally across them.
|
||||
Place each process unit fully inside its current owner's lane; let only a real
|
||||
responsibility transfer cross a lane seam, and terminate every transition on
|
||||
the process-unit boundaries rather than using a lane boundary as an edge.
|
||||
Phase boundaries must cross the lane field coherently and remain distinguishable
|
||||
from process transitions. If lane regions are one field duty, use one `rect`
|
||||
plus lane dividers instead of independent lane rectangles. Lane ownership and
|
||||
process-unit responsibility decide the splits; orthogonal registration keeps
|
||||
the two atom systems readable without implying equal bands, phases, or steps.
|
||||
|
||||
For two independent `contrast` dimensions partitioning one field, call one
|
||||
`rect` plus one `line` per axis when only the axes carry meaning. Make both axes
|
||||
cross the complete field, keep them orthogonal, and let their intersection move
|
||||
with the semantic thresholds rather than centering it. When the four resulting
|
||||
regions need independent editing, movement, paint, animation, or reuse, call
|
||||
four `rect` siblings instead; tile them to one shared outer field with one
|
||||
continuous seam per axis, no accidental gaps or overlaps, and the same
|
||||
non-central intersection when required. Axis-only semantics chooses one body
|
||||
with dividers; region responsibility chooses four siblings. Orthogonality and
|
||||
continuous seams create one partition while unequal region extents remain
|
||||
legal.
|
||||
|
||||
For a radial `parent` topology whose ancestry requires explicit `link` edges,
|
||||
call `ellipse` once per semantic node and `line` once per parent-child relation.
|
||||
Only after radial organization is resolved upstream, register depth to
|
||||
concentric bands around the actual root; the bands and sibling sectors may vary
|
||||
with role and content. Start and end every edge on node boundaries, keep each
|
||||
branch moving outward to the child's depth, and make shared branch junctions
|
||||
coincide only when the relations truly share a trunk. Nodes split for
|
||||
independent content and motion duties; edges remain separate because ancestry
|
||||
is a relation rather than a shared silhouette. Concentric registration makes
|
||||
depth legible, while root centrality, even fan-out, mirrored branches, and equal
|
||||
radial spacing remain forbidden unless the relationship itself requires them.
|
||||
|
||||
@@ -5,10 +5,8 @@ PPT Master - Batch Project Validation Tool
|
||||
Checks the structural integrity and compliance of multiple projects at once.
|
||||
|
||||
Usage:
|
||||
python3 scripts/batch_validate.py examples
|
||||
python3 scripts/batch_validate.py projects
|
||||
python3 scripts/batch_validate.py --all
|
||||
python3 scripts/batch_validate.py examples projects
|
||||
"""
|
||||
|
||||
import argparse
|
||||
@@ -265,14 +263,12 @@ def build_parser() -> argparse.ArgumentParser:
|
||||
description="Validate one or more PPT Master project directories.",
|
||||
formatter_class=argparse.RawDescriptionHelpFormatter,
|
||||
epilog="""Examples:
|
||||
python3 scripts/batch_validate.py examples
|
||||
python3 scripts/batch_validate.py projects
|
||||
python3 scripts/batch_validate.py examples projects
|
||||
python3 scripts/batch_validate.py --all
|
||||
""",
|
||||
)
|
||||
parser.add_argument("directories", nargs="*", help="Directories to scan")
|
||||
parser.add_argument("--all", action="store_true", help="Validate examples and projects")
|
||||
parser.add_argument("--all", action="store_true", help="Validate the default projects directory")
|
||||
parser.add_argument("--export", action="store_true", help="Write a validation report")
|
||||
parser.add_argument(
|
||||
"--output",
|
||||
@@ -290,7 +286,7 @@ def main(argv: list[str] | None = None) -> int:
|
||||
validator = BatchValidator()
|
||||
|
||||
if args.all:
|
||||
directories = ['examples', 'projects']
|
||||
directories = ['projects']
|
||||
else:
|
||||
directories = args.directories
|
||||
|
||||
|
||||
@@ -40,7 +40,6 @@ WORKFLOWS_DIR = PROJECT_ROOT / 'workflows'
|
||||
|
||||
# Repository root directory
|
||||
REPO_ROOT = PROJECT_ROOT.parent.parent
|
||||
EXAMPLES_DIR = REPO_ROOT / 'examples'
|
||||
PROJECTS_DIR = REPO_ROOT / 'projects'
|
||||
|
||||
# Template subdirectories
|
||||
|
||||
@@ -216,21 +216,20 @@ python3 scripts/project_utils.py <project_path>
|
||||
Batch-check project structure and compliance.
|
||||
|
||||
```bash
|
||||
python3 scripts/batch_validate.py examples
|
||||
python3 scripts/batch_validate.py examples projects
|
||||
python3 scripts/batch_validate.py projects
|
||||
python3 scripts/batch_validate.py --all
|
||||
python3 scripts/batch_validate.py examples --export
|
||||
python3 scripts/batch_validate.py projects --export
|
||||
```
|
||||
|
||||
Use this for repository-wide health checks before release or cleanup.
|
||||
Use this for multi-project health checks before release or cleanup.
|
||||
|
||||
## `generate_examples_index.py`
|
||||
|
||||
Rebuild `examples/README.md` automatically.
|
||||
Rebuild the examples `README.md` index. The example projects live in the separate
|
||||
[ppt-master-examples](https://github.com/hugohe3/ppt-master-examples) repository.
|
||||
|
||||
```bash
|
||||
python3 scripts/generate_examples_index.py
|
||||
python3 scripts/generate_examples_index.py examples
|
||||
python3 scripts/generate_examples_index.py <path-to>/ppt-master-examples/examples
|
||||
```
|
||||
|
||||
## `pptx_template_import.py`
|
||||
|
||||
@@ -729,14 +729,14 @@ Requirements:
|
||||
Validate SVG technical compliance.
|
||||
|
||||
```bash
|
||||
python3 scripts/svg_quality_checker.py examples/project/svg_output/01_cover.svg
|
||||
python3 scripts/svg_quality_checker.py examples/project/svg_output
|
||||
python3 scripts/svg_quality_checker.py examples/project
|
||||
python3 scripts/svg_quality_checker.py examples/project --stage first-page
|
||||
python3 scripts/svg_quality_checker.py examples/project --stage final --json
|
||||
python3 scripts/svg_quality_checker.py examples/project --format ppt169
|
||||
python3 scripts/svg_quality_checker.py --all examples
|
||||
python3 scripts/svg_quality_checker.py examples/project --export
|
||||
python3 scripts/svg_quality_checker.py projects/project/svg_output/01_cover.svg
|
||||
python3 scripts/svg_quality_checker.py projects/project/svg_output
|
||||
python3 scripts/svg_quality_checker.py projects/project
|
||||
python3 scripts/svg_quality_checker.py projects/project --stage first-page
|
||||
python3 scripts/svg_quality_checker.py projects/project --stage final --json
|
||||
python3 scripts/svg_quality_checker.py projects/project --format ppt169
|
||||
python3 scripts/svg_quality_checker.py --all projects
|
||||
python3 scripts/svg_quality_checker.py projects/project --export
|
||||
python3 scripts/svg_quality_checker.py path/to/template/templates --template-mode
|
||||
```
|
||||
|
||||
@@ -806,7 +806,7 @@ Use this after SVG generation to inspect existing SVG geometry when manual compa
|
||||
### `flatten_tspan.py`
|
||||
|
||||
```bash
|
||||
python3 scripts/svg_finalize/flatten_tspan.py examples/<project>/svg_output
|
||||
python3 scripts/svg_finalize/flatten_tspan.py projects/<project>/svg_output
|
||||
python3 scripts/svg_finalize/flatten_tspan.py path/to/input.svg path/to/output.svg
|
||||
```
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ Usage:
|
||||
|
||||
Examples:
|
||||
python3 scripts/finalize_svg.py projects/my_project
|
||||
python3 scripts/finalize_svg.py examples/ppt169_demo --only embed-icons
|
||||
python3 scripts/finalize_svg.py projects/ppt169_demo --only embed-icons
|
||||
|
||||
Processing options:
|
||||
embed-icons - Expand project icons and static same-document <use>
|
||||
|
||||
+5
-5
@@ -5,8 +5,10 @@ PPT Master - Examples Index Generator
|
||||
Automatically scans the examples directory and generates a README.md index file.
|
||||
|
||||
Usage:
|
||||
python3 scripts/generate_examples_index.py
|
||||
python3 scripts/generate_examples_index.py examples
|
||||
python3 scripts/generate_examples_index.py <examples_dir>
|
||||
|
||||
The example projects live in the separate ppt-master-examples repository;
|
||||
pass the path to its examples/ directory.
|
||||
"""
|
||||
|
||||
import argparse
|
||||
@@ -220,9 +222,7 @@ def build_parser() -> argparse.ArgumentParser:
|
||||
)
|
||||
parser.add_argument(
|
||||
"examples_dir",
|
||||
nargs="?",
|
||||
default="examples",
|
||||
help="Examples directory (default: examples)",
|
||||
help="Path to the examples/ directory of the ppt-master-examples repository",
|
||||
)
|
||||
return parser
|
||||
|
||||
|
||||
+10
-7
@@ -22,7 +22,8 @@
|
||||
"skills/ppt-master/references/executor-structured.md": 5500,
|
||||
"skills/ppt-master/references/executor-chart.md": 3500,
|
||||
"skills/ppt-master/references/executor-visualization.md": 1250,
|
||||
"skills/ppt-master/references/executor-structure.md": 1500,
|
||||
"skills/ppt-master/references/executor-structure.md": 2250,
|
||||
"skills/ppt-master/references/topology-assembly.md": 3750,
|
||||
"skills/ppt-master/references/executor-table.md": 1000,
|
||||
"skills/ppt-master/references/executor-image.md": 2000,
|
||||
"skills/ppt-master/references/executor-web-image.md": 750,
|
||||
@@ -117,7 +118,7 @@
|
||||
"skills/ppt-master/templates/README.md",
|
||||
"skills/ppt-master/templates/decks/README.md"
|
||||
],
|
||||
"max_tokens": 75000
|
||||
"max_tokens": 83000
|
||||
},
|
||||
"route.create-template.layout": {
|
||||
"description": "Create Layout standard/fidelity path through Template_Designer, the strategy-triggered native-shape bundle, SVG core, and the structured PPTX interface; mirror excludes the authored bundle.",
|
||||
@@ -229,6 +230,7 @@
|
||||
"skills/ppt-master/references/preset-shape-vocabulary.md",
|
||||
"skills/ppt-master/references/semantic-svg.md",
|
||||
"skills/ppt-master/references/executor-structure.md",
|
||||
"skills/ppt-master/references/topology-assembly.md",
|
||||
"skills/ppt-master/references/canvas-formats.md",
|
||||
"skills/ppt-master/references/image-layout-spec.md",
|
||||
"skills/ppt-master/references/image-layout-patterns.md",
|
||||
@@ -384,7 +386,7 @@
|
||||
"stage.generate.executor.web-image"
|
||||
],
|
||||
"files": [],
|
||||
"max_tokens": 130000
|
||||
"max_tokens": 145000
|
||||
},
|
||||
"route.generate.quick-generate.visualization": {
|
||||
"description": "Quick Generate with complete Chart/Table expression vocabularies already in the fixed planning context, their data-object branches, optional native-data metadata, and chart-coordinate verification before the final checker; the fixed Quick context already carries Shape Composition Grammar. Ceiling raised after BUDGET_LOAD_SET reported 126726 tokens.",
|
||||
@@ -739,6 +741,7 @@
|
||||
"skills/ppt-master/references/preset-shape-vocabulary.md",
|
||||
"skills/ppt-master/references/semantic-svg.md",
|
||||
"skills/ppt-master/references/executor-structure.md",
|
||||
"skills/ppt-master/references/topology-assembly.md",
|
||||
{
|
||||
"glob": "skills/ppt-master/references/modes/*.md",
|
||||
"exclude": [
|
||||
@@ -760,7 +763,7 @@
|
||||
"allow_repeat": true
|
||||
}
|
||||
],
|
||||
"max_tokens": 64000
|
||||
"max_tokens": 71000
|
||||
},
|
||||
"stage.generate.executor.structured": {
|
||||
"description": "Structured template execution layered on the flat/shared core.",
|
||||
@@ -772,7 +775,7 @@
|
||||
"skills/ppt-master/references/executor-structured.md",
|
||||
"skills/ppt-master/references/pptx-structure-interface.md"
|
||||
],
|
||||
"max_tokens": 74000
|
||||
"max_tokens": 85000
|
||||
},
|
||||
"stage.generate.image.ai-two-types": {
|
||||
"description": "Incremental AI-image role with the selected preset or exact custom rendering bases and two selected local types. Ceiling raised after BUDGET_LOAD_SET reported 26216 tokens.",
|
||||
@@ -838,7 +841,7 @@
|
||||
"skills/ppt-master/workflows/stages/resume-execute.md",
|
||||
"skills/ppt-master/references/artifact-ownership.md"
|
||||
],
|
||||
"max_tokens": 99000
|
||||
"max_tokens": 115000
|
||||
},
|
||||
"stage.generate.resume-execute-image": {
|
||||
"description": "Fresh-session resume when the locked resource plan contains image rows.",
|
||||
@@ -848,7 +851,7 @@
|
||||
"stage.generate.executor.image"
|
||||
],
|
||||
"files": [],
|
||||
"max_tokens": 115000
|
||||
"max_tokens": 130000
|
||||
},
|
||||
"stage.generate.topic-research": {
|
||||
"description": "Gap-targeted factual intake stage.",
|
||||
|
||||
+2
-2
@@ -8,8 +8,8 @@ Usage:
|
||||
python3 scripts/svg_finalize/embed_images.py *.svg
|
||||
|
||||
Examples:
|
||||
python3 scripts/svg_finalize/embed_images.py examples/ppt169_demo/svg_output/01_cover.svg
|
||||
python3 scripts/svg_finalize/embed_images.py examples/ppt169_demo/svg_output/*.svg
|
||||
python3 scripts/svg_finalize/embed_images.py projects/ppt169_demo/svg_output/01_cover.svg
|
||||
python3 scripts/svg_finalize/embed_images.py projects/ppt169_demo/svg_output/*.svg
|
||||
"""
|
||||
|
||||
import os
|
||||
|
||||
+5
-5
@@ -12,8 +12,8 @@ Usage:
|
||||
python3 scripts/svg_finalize/svg_rect_to_path.py <project_path> -s final -o svg_rounded
|
||||
|
||||
Examples:
|
||||
python3 scripts/svg_finalize/svg_rect_to_path.py examples/ppt169_demo
|
||||
python3 scripts/svg_finalize/svg_rect_to_path.py examples/ppt169_demo/svg_output/01_cover.svg
|
||||
python3 scripts/svg_finalize/svg_rect_to_path.py projects/ppt169_demo
|
||||
python3 scripts/svg_finalize/svg_rect_to_path.py projects/ppt169_demo/svg_output/01_cover.svg
|
||||
|
||||
Output:
|
||||
- Directory mode: outputs to svg_rounded/ subdirectory
|
||||
@@ -240,9 +240,9 @@ def main() -> None:
|
||||
formatter_class=argparse.RawDescriptionHelpFormatter,
|
||||
epilog='''
|
||||
Examples:
|
||||
%(prog)s examples/ppt169_demo
|
||||
%(prog)s examples/ppt169_demo -s final
|
||||
%(prog)s examples/ppt169_demo/svg_output/01_cover.svg
|
||||
%(prog)s projects/ppt169_demo
|
||||
%(prog)s projects/ppt169_demo -s final
|
||||
%(prog)s projects/ppt169_demo/svg_output/01_cover.svg
|
||||
|
||||
What it does:
|
||||
Converts <rect> elements with rx/ry to equivalent <path> elements.
|
||||
|
||||
@@ -61,11 +61,11 @@ def print_usage() -> None:
|
||||
print(" python3 scripts/svg_quality_checker.py <svg_file>")
|
||||
print(" python3 scripts/svg_quality_checker.py <directory>")
|
||||
print(" python3 scripts/svg_quality_checker.py <workspace>/templates --template-mode")
|
||||
print(" python3 scripts/svg_quality_checker.py --all examples")
|
||||
print(" python3 scripts/svg_quality_checker.py --all projects")
|
||||
print("\nExamples:")
|
||||
print(" python3 scripts/svg_quality_checker.py examples/project/svg_output/slide_01.svg")
|
||||
print(" python3 scripts/svg_quality_checker.py examples/project/svg_output")
|
||||
print(" python3 scripts/svg_quality_checker.py examples/project")
|
||||
print(" python3 scripts/svg_quality_checker.py projects/project/svg_output/slide_01.svg")
|
||||
print(" python3 scripts/svg_quality_checker.py projects/project/svg_output")
|
||||
print(" python3 scripts/svg_quality_checker.py projects/project")
|
||||
print(" python3 scripts/svg_quality_checker.py templates/layouts/presentation_core/templates --template-mode")
|
||||
print(" python3 scripts/svg_quality_checker.py templates/decks/中国电信/templates --template-mode")
|
||||
print("\nOptions:")
|
||||
@@ -142,7 +142,7 @@ def main() -> None:
|
||||
if stage != "final":
|
||||
print("[ERROR] --stage first-page does not support --all")
|
||||
sys.exit(1)
|
||||
base_dir = sys.argv[2] if len(sys.argv) > 2 else "examples"
|
||||
base_dir = sys.argv[2] if len(sys.argv) > 2 else "projects"
|
||||
from project_utils import find_all_projects
|
||||
|
||||
projects = find_all_projects(base_dir)
|
||||
|
||||
@@ -7,7 +7,7 @@ Implementation lives in ``svg_quality/``.
|
||||
Usage:
|
||||
python3 scripts/svg_quality_checker.py <svg_file>
|
||||
python3 scripts/svg_quality_checker.py <directory>
|
||||
python3 scripts/svg_quality_checker.py --all examples
|
||||
python3 scripts/svg_quality_checker.py --all projects
|
||||
|
||||
Examples:
|
||||
python3 scripts/svg_quality_checker.py projects/demo --stage final --json
|
||||
|
||||
+6
-6
@@ -817,13 +817,13 @@ def main(argv: list[str] | None = None) -> int:
|
||||
formatter_class=argparse.RawDescriptionHelpFormatter,
|
||||
epilog=f'''
|
||||
Examples:
|
||||
%(prog)s examples/ppt169_demo # Default: native pptx -> exports/, svg_output -> backup/<ts>/
|
||||
%(prog)s examples/ppt169_demo -o out.pptx # Explicit path (no backup/)
|
||||
%(prog)s projects/ppt169_demo # Default: native pptx -> exports/, svg_output -> backup/<ts>/
|
||||
%(prog)s projects/ppt169_demo -o out.pptx # Explicit path (no backup/)
|
||||
%(prog)s projects/quick_generate_demo --quick-generate # Lockless flat export with normal postflight
|
||||
|
||||
# Disable transition / change transition effect
|
||||
%(prog)s examples/ppt169_demo -t none
|
||||
%(prog)s examples/ppt169_demo -t push --transition-duration 1.0
|
||||
%(prog)s projects/ppt169_demo -t none
|
||||
%(prog)s projects/ppt169_demo -t push --transition-duration 1.0
|
||||
|
||||
SVG source directory (-s):
|
||||
output - svg_output (hand-authored source; native default)
|
||||
@@ -870,7 +870,7 @@ Speaker notes:
|
||||
- Disabled by default in Quick Generate; use --with-notes to enable
|
||||
|
||||
Recorded narration:
|
||||
%(prog)s examples/ppt169_demo --recorded-narration audio \\
|
||||
%(prog)s projects/ppt169_demo --recorded-narration audio \\
|
||||
--inherit-motion-from validation/<base>.report.json
|
||||
- Keeps speaker notes when enabled
|
||||
- Prepares PowerPoint recorded timings and narrations
|
||||
@@ -884,7 +884,7 @@ Recorded narration:
|
||||
- Sets slide auto-advance from audio duration so video export can use
|
||||
"recorded timings and narrations"
|
||||
- Rejects on-click object animations; use after-previous or with-previous
|
||||
%(prog)s examples/ppt169_demo --narration-audio-dir audio
|
||||
%(prog)s projects/ppt169_demo --narration-audio-dir audio
|
||||
- Lower-level audio embedding: embeds matched files but allows partial matches
|
||||
- Use only when you do not need a complete recorded-timings export
|
||||
''',
|
||||
|
||||
@@ -617,6 +617,7 @@ Read ${SKILL_DIR}/references/svg-effects.md # REQUIRED: §6.1 job
|
||||
Read ${SKILL_DIR}/references/native-shape-authoring.md # REQUIRED: native-shape selection and Boolean construction
|
||||
Read ${SKILL_DIR}/references/preset-shape-vocabulary.md # REQUIRED: complete 187-name authoring vocabulary
|
||||
Read ${SKILL_DIR}/references/executor-structure.md # REQUIRED: qualitative relationship and topology grammar
|
||||
Read ${SKILL_DIR}/references/topology-assembly.md # REQUIRED: topology assembly and relative-registration material
|
||||
Read ${SKILL_DIR}/references/semantic-svg.md # REQUIRED: semantic metadata boundary
|
||||
Read ${SKILL_DIR}/references/modes/<resolved-id>.md # one preset id, or each `mode_references` id
|
||||
Read ${SKILL_DIR}/references/visual-styles/<resolved-id>.md # one preset id, or each `visual_style_references` id
|
||||
|
||||
+9
-6
@@ -525,7 +525,8 @@ not route among them one file at a time:
|
||||
[`native-shape-authoring.md`](../../references/native-shape-authoring.md),
|
||||
[`preset-shape-vocabulary.md`](../../references/preset-shape-vocabulary.md),
|
||||
[`semantic-svg.md`](../../references/semantic-svg.md),
|
||||
and [`executor-structure.md`](../../references/executor-structure.md). Retain
|
||||
[`executor-structure.md`](../../references/executor-structure.md),
|
||||
and [`topology-assembly.md`](../../references/topology-assembly.md). Retain
|
||||
only the mode/style detail files selected during one-pass design resolution and
|
||||
realize that chosen direction. Exact `*_references` define the catalog material
|
||||
actually used by a custom: apply one basis under its behavior, synthesize several
|
||||
@@ -543,11 +544,13 @@ and [`svg-image-embedding.md`](../../references/svg-image-embedding.md); add
|
||||
Reread only after a known file change or context invalidation.
|
||||
|
||||
`executor-structure.md` is loaded once before all SVG authoring so every
|
||||
`Structure=yes` result can apply its qualitative topology grammar.
|
||||
`native-shape-authoring.md` independently owns contour selection and compound
|
||||
page geometry for both Structure results. Reuse both throughout the valid
|
||||
execution context; before P01, read the complete preset vocabulary once, then
|
||||
reread only after a known file change or context invalidation.
|
||||
`Structure=yes` result can resolve its qualitative topology.
|
||||
`topology-assembly.md` supplies assembly and relative-registration material for
|
||||
that resolved topology; `native-shape-authoring.md` owns the two-step assembly
|
||||
gate, contour selection, and compound page geometry for both Structure results.
|
||||
Reuse all three throughout the valid execution context; before P01, read the
|
||||
complete preset vocabulary once, then reread only after a known file change or
|
||||
context invalidation.
|
||||
|
||||
**Mandatory — per-image-page composition decision**: For every page with one
|
||||
or more images, after its content and communication move are
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
"sourceId": "shadcn",
|
||||
"repo": "https://github.com/shadcn-ui/ui.git",
|
||||
"ref": "main",
|
||||
"commit": "ac60ef5c4db4265d71454dd9ecd3f93e255d7211",
|
||||
"commit": "b9938d94635fca7a4560449713b0b1ba87d77bc6",
|
||||
"adapter": "claude-skill",
|
||||
"sourcePath": "skills/shadcn",
|
||||
"syncedAt": "2026-08-23T16:00:00Z"
|
||||
"syncedAt": "2026-08-24T16:00:00Z"
|
||||
}
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
"sourceId": "taste-skill",
|
||||
"repo": "https://github.com/Leonxlnx/taste-skill.git",
|
||||
"ref": "main",
|
||||
"commit": "72e299530e2eb31ed8da06181bc19f6c18a00821",
|
||||
"commit": "ccbc15639c97057cbfcf32ecebc38ef716e4bb37",
|
||||
"adapter": "skill-collection",
|
||||
"sourcePath": "skills",
|
||||
"syncedAt": "2026-08-22T16:00:00Z"
|
||||
"syncedAt": "2026-08-24T16:00:00Z"
|
||||
}
|
||||
|
||||
@@ -256,6 +256,7 @@ uipro init --ai kilocode # KiloCode
|
||||
uipro init --ai warp # Warp
|
||||
uipro init --ai augment # Augment
|
||||
uipro init --ai codewhale # CodeWhale
|
||||
uipro init --ai openclaw # OpenClaw
|
||||
uipro init --ai universal # Universal / Agent Standard (.agents/skills/)
|
||||
uipro init --ai all # All assistants
|
||||
```
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
"sourceId": "ui-ux-pro-max",
|
||||
"repo": "https://github.com/nextlevelbuilder/ui-ux-pro-max-skill.git",
|
||||
"ref": "main",
|
||||
"commit": "bc826e2267a36d98a2dcf5231e16c30ff546770f",
|
||||
"commit": "13179471f97162b3297558621a76682438caf017",
|
||||
"adapter": "claude-skill",
|
||||
"sourcePath": ".claude/skills/ui-ux-pro-max",
|
||||
"syncedAt": "2026-08-20T16:00:00Z"
|
||||
"syncedAt": "2026-08-24T16:00:00Z"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user