pptx-cli 1.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pptx_cli-1.0.0/.editorconfig +15 -0
- pptx_cli-1.0.0/.github/ISSUE_TEMPLATE/bug_report.md +21 -0
- pptx_cli-1.0.0/.github/ISSUE_TEMPLATE/config.yml +5 -0
- pptx_cli-1.0.0/.github/ISSUE_TEMPLATE/feature_request.md +13 -0
- pptx_cli-1.0.0/.github/PULL_REQUEST_TEMPLATE.md +25 -0
- pptx_cli-1.0.0/.github/copilot-instructions.md +36 -0
- pptx_cli-1.0.0/.github/instructions/backend.instructions.md +12 -0
- pptx_cli-1.0.0/.github/instructions/testing.instructions.md +11 -0
- pptx_cli-1.0.0/.github/skills/pptx/SKILL.md +190 -0
- pptx_cli-1.0.0/.github/skills/pptx/references/deck-spec.md +160 -0
- pptx_cli-1.0.0/.github/workflows/ci.yml +34 -0
- pptx_cli-1.0.0/.github/workflows/publish.yml +37 -0
- pptx_cli-1.0.0/.gitignore +40 -0
- pptx_cli-1.0.0/.python-version +1 -0
- pptx_cli-1.0.0/AGENTS.md +138 -0
- pptx_cli-1.0.0/ARCHITECTURE.md +171 -0
- pptx_cli-1.0.0/CHANGELOG.md +21 -0
- pptx_cli-1.0.0/CLI-MANIFEST.md +1157 -0
- pptx_cli-1.0.0/CONTRIBUTING.md +80 -0
- pptx_cli-1.0.0/DECISIONS/ADR-0001-initial-architecture.md +51 -0
- pptx_cli-1.0.0/LICENSE +21 -0
- pptx_cli-1.0.0/PKG-INFO +505 -0
- pptx_cli-1.0.0/PRD.md +1148 -0
- pptx_cli-1.0.0/PROJECT.md +70 -0
- pptx_cli-1.0.0/README.md +459 -0
- pptx_cli-1.0.0/SCAFFOLD.md +291 -0
- pptx_cli-1.0.0/SECURITY.md +36 -0
- pptx_cli-1.0.0/TESTING.md +63 -0
- pptx_cli-1.0.0/docs/DOMAIN.md +31 -0
- pptx_cli-1.0.0/docs/GLOSSARY.md +12 -0
- pptx_cli-1.0.0/docs/ROADMAP.md +68 -0
- pptx_cli-1.0.0/docs/SCAFFOLDING-NOTES.md +37 -0
- pptx_cli-1.0.0/guardrails/.gitignore +1 -0
- pptx_cli-1.0.0/guardrails/guardrails.jsonl +25 -0
- pptx_cli-1.0.0/guardrails/links.jsonl +8 -0
- pptx_cli-1.0.0/guardrails/references.jsonl +55 -0
- pptx_cli-1.0.0/guardrails/taxonomy.json +3 -0
- pptx_cli-1.0.0/guardrails-explorer.html +758 -0
- pptx_cli-1.0.0/pyproject.toml +68 -0
- pptx_cli-1.0.0/pyrightconfig.json +11 -0
- pptx_cli-1.0.0/scripts/bump_version.py +57 -0
- pptx_cli-1.0.0/src/pptx_cli/__init__.py +5 -0
- pptx_cli-1.0.0/src/pptx_cli/__main__.py +4 -0
- pptx_cli-1.0.0/src/pptx_cli/cli.py +372 -0
- pptx_cli-1.0.0/src/pptx_cli/commands/__init__.py +1 -0
- pptx_cli-1.0.0/src/pptx_cli/commands/compose.py +73 -0
- pptx_cli-1.0.0/src/pptx_cli/commands/guide.py +157 -0
- pptx_cli-1.0.0/src/pptx_cli/commands/init.py +52 -0
- pptx_cli-1.0.0/src/pptx_cli/commands/inspect.py +80 -0
- pptx_cli-1.0.0/src/pptx_cli/commands/manifest_ops.py +23 -0
- pptx_cli-1.0.0/src/pptx_cli/commands/validate.py +13 -0
- pptx_cli-1.0.0/src/pptx_cli/commands/wrapper.py +191 -0
- pptx_cli-1.0.0/src/pptx_cli/core/__init__.py +1 -0
- pptx_cli-1.0.0/src/pptx_cli/core/composition.py +280 -0
- pptx_cli-1.0.0/src/pptx_cli/core/ids.py +24 -0
- pptx_cli-1.0.0/src/pptx_cli/core/io.py +60 -0
- pptx_cli-1.0.0/src/pptx_cli/core/manifest_store.py +65 -0
- pptx_cli-1.0.0/src/pptx_cli/core/runtime.py +30 -0
- pptx_cli-1.0.0/src/pptx_cli/core/template.py +595 -0
- pptx_cli-1.0.0/src/pptx_cli/core/validation.py +215 -0
- pptx_cli-1.0.0/src/pptx_cli/core/versioning.py +47 -0
- pptx_cli-1.0.0/src/pptx_cli/models/__init__.py +1 -0
- pptx_cli-1.0.0/src/pptx_cli/models/envelope.py +50 -0
- pptx_cli-1.0.0/src/pptx_cli/models/manifest.py +175 -0
- pptx_cli-1.0.0/tests/conftest.py +28 -0
- pptx_cli-1.0.0/tests/test_cli.py +301 -0
- pptx_cli-1.0.0/tests/test_versioning.py +22 -0
- pptx_cli-1.0.0/uv.lock +694 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Bug report
|
|
3
|
+
about: Report a defect in CLI behavior, manifest extraction, generation, or validation
|
|
4
|
+
labels: bug
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## What happened
|
|
8
|
+
|
|
9
|
+
## Expected behavior
|
|
10
|
+
|
|
11
|
+
## Reproduction
|
|
12
|
+
|
|
13
|
+
## Environment
|
|
14
|
+
|
|
15
|
+
- OS:
|
|
16
|
+
- Python version:
|
|
17
|
+
- `pptx` version/commit:
|
|
18
|
+
|
|
19
|
+
## Artifacts
|
|
20
|
+
|
|
21
|
+
If possible, attach a sanitized manifest, spec, or template description.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Feature request
|
|
3
|
+
about: Propose a new capability, content type, validation rule, or CLI contract improvement
|
|
4
|
+
labels: enhancement
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Problem to solve
|
|
8
|
+
|
|
9
|
+
## Proposed change
|
|
10
|
+
|
|
11
|
+
## Why it belongs in scope
|
|
12
|
+
|
|
13
|
+
## Examples or references
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
## Summary
|
|
2
|
+
|
|
3
|
+
Describe the change and why it matters.
|
|
4
|
+
|
|
5
|
+
## What changed
|
|
6
|
+
|
|
7
|
+
-
|
|
8
|
+
|
|
9
|
+
## Verification
|
|
10
|
+
|
|
11
|
+
- [ ] `uv run pytest`
|
|
12
|
+
- [ ] `uv run ruff check .`
|
|
13
|
+
- [ ] `uv run ruff format --check .`
|
|
14
|
+
- [ ] `uv run pyright`
|
|
15
|
+
- [ ] Docs updated if needed
|
|
16
|
+
|
|
17
|
+
## Contract impact
|
|
18
|
+
|
|
19
|
+
- [ ] No CLI contract change
|
|
20
|
+
- [ ] Guide / envelope / error-code change documented
|
|
21
|
+
- [ ] Manifest/schema change documented
|
|
22
|
+
|
|
23
|
+
## TODOs / follow-ups
|
|
24
|
+
|
|
25
|
+
-
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Copilot instructions
|
|
2
|
+
|
|
3
|
+
Use `AGENTS.md` as the canonical workspace guide. This file should only contain Copilot-specific reminders that supplement, rather than duplicate, the project-wide instructions.
|
|
4
|
+
|
|
5
|
+
## Copilot-specific reminders
|
|
6
|
+
|
|
7
|
+
- Follow existing patterns before introducing new abstractions
|
|
8
|
+
- Prefer updating `AGENTS.md` when the project-wide guidance changes
|
|
9
|
+
- Keep terminal and JSON output terse, deterministic, and easy for agents to parse
|
|
10
|
+
|
|
11
|
+
## Preferred patterns
|
|
12
|
+
|
|
13
|
+
- use typed models for shared contracts
|
|
14
|
+
- keep Typer command handlers thin
|
|
15
|
+
- put reusable logic in `src/pptx_cli/core/`
|
|
16
|
+
- keep machine-readable output stable and explicit
|
|
17
|
+
- prefer additive evolution over silent breaking changes
|
|
18
|
+
|
|
19
|
+
## Naming conventions
|
|
20
|
+
|
|
21
|
+
- CLI executable: `pptx`
|
|
22
|
+
- Python package: `pptx_cli`
|
|
23
|
+
- command IDs in machine-readable envelopes: dotted form like `guide.show`, `template.init`, or similar stable canonical names
|
|
24
|
+
- tests: `test_*.py`
|
|
25
|
+
|
|
26
|
+
## Testing expectations
|
|
27
|
+
|
|
28
|
+
- add or update tests with code changes
|
|
29
|
+
- validate command behavior and structured output for CLI changes
|
|
30
|
+
- preserve dry-run and safe-write semantics in tests for mutating commands
|
|
31
|
+
|
|
32
|
+
## Documentation expectations
|
|
33
|
+
|
|
34
|
+
- update docs in the same PR when commands, examples, or contracts change
|
|
35
|
+
- keep examples aligned with the current scaffold and command names
|
|
36
|
+
- leave guided `TODO:` blocks instead of guessing product decisions
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
applyTo: "src/pptx_cli/**/*.py"
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# Backend instructions
|
|
6
|
+
|
|
7
|
+
- Keep command handlers thin and move reusable logic into `core/` or `models/`
|
|
8
|
+
- Preserve deterministic machine-readable output
|
|
9
|
+
- Do not introduce a Python package named `pptx`
|
|
10
|
+
- Prefer explicit types and small, composable functions
|
|
11
|
+
- When a command mutates outputs, maintain dry-run compatibility and safe file-write semantics
|
|
12
|
+
- Do not silently change stable error codes or exit-code categories
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
---
|
|
2
|
+
applyTo: "tests/**/*.py"
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# Testing instructions
|
|
6
|
+
|
|
7
|
+
- Test machine-readable output contracts, not just happy-path text
|
|
8
|
+
- Cover at least one failure case for every new command behavior
|
|
9
|
+
- Prefer deterministic fixtures and golden outputs for schemas/envelopes
|
|
10
|
+
- Keep tests small and focused unless they are explicit integration tests
|
|
11
|
+
- When changing command names, flags, or envelope fields, update the tests in the same change
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pptx
|
|
3
|
+
description: >
|
|
4
|
+
How to use the `pptx` CLI to create PowerPoint presentations from enterprise templates.
|
|
5
|
+
Use this skill whenever the user wants to create, build, or generate PowerPoint slides or decks,
|
|
6
|
+
work with .pptx templates, inspect slide layouts or placeholders, validate presentations,
|
|
7
|
+
or anything related to PowerPoint generation from the command line. Also trigger when the user
|
|
8
|
+
mentions deck specs, slide layouts, manifest packages, or template-bound presentation workflows.
|
|
9
|
+
Even if the user just says "make me a presentation" or "create some slides", this skill applies.
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# pptx — Template-Bound PowerPoint Generation
|
|
13
|
+
|
|
14
|
+
`pptx` is a CLI that turns a real `.pptx` template into a machine-readable manifest, then generates slides and decks **inside the original corporate design contract**. It preserves masters, themes, locked branding, and placeholder rules — instead of approximating them.
|
|
15
|
+
|
|
16
|
+
## Quick orientation
|
|
17
|
+
|
|
18
|
+
The workflow has three phases:
|
|
19
|
+
|
|
20
|
+
1. **Setup** — install the CLI and initialize a manifest from a template
|
|
21
|
+
2. **Discover** — explore layouts, placeholders, and theme to understand what's available
|
|
22
|
+
3. **Build** — create slides or full decks from structured specs, then validate
|
|
23
|
+
|
|
24
|
+
## Phase 1: Setup
|
|
25
|
+
|
|
26
|
+
### Install
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
uv tool install pptx-cli
|
|
30
|
+
# or: pip install pptx-cli
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Verify with `pptx --version`.
|
|
34
|
+
|
|
35
|
+
### Initialize a manifest
|
|
36
|
+
|
|
37
|
+
The manifest package lives at `.pptx/` in the project root. Always check for an existing one first:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
ls .pptx/manifest.yaml 2>/dev/null
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
If no manifest exists, you need a `.pptx` template file from the user. **Ask the user** to provide one — do not assume a template exists. Then initialize:
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
pptx init <template.pptx> --out ./.pptx
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
This extracts layouts, placeholders, assets, themes, and rules into a structured manifest package.
|
|
50
|
+
|
|
51
|
+
### Bootstrap command: `pptx guide`
|
|
52
|
+
|
|
53
|
+
Run this once to get the full CLI contract — all commands, schemas, error codes, and examples:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
pptx guide --format json
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
This is your single source of truth for the CLI's capabilities. Cache the result mentally and refer to it throughout the session.
|
|
60
|
+
|
|
61
|
+
## Phase 2: Discover
|
|
62
|
+
|
|
63
|
+
Before building anything, understand what the template offers. These are all read-only commands and can run in parallel:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
# List all available layouts
|
|
67
|
+
pptx layouts list --manifest ./.pptx --format json
|
|
68
|
+
|
|
69
|
+
# Show details for a specific layout
|
|
70
|
+
pptx layouts show <layout-id> --manifest ./.pptx --format json
|
|
71
|
+
|
|
72
|
+
# List placeholders for a layout (tells you what content keys are available)
|
|
73
|
+
pptx placeholders list <layout-id> --manifest ./.pptx --format json
|
|
74
|
+
|
|
75
|
+
# Show theme metadata
|
|
76
|
+
pptx theme show --manifest ./.pptx --format json
|
|
77
|
+
|
|
78
|
+
# List extracted assets
|
|
79
|
+
pptx assets list --manifest ./.pptx --format json
|
|
80
|
+
|
|
81
|
+
# Check for compatibility warnings
|
|
82
|
+
pptx doctor --manifest ./.pptx --format json
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
**Layout IDs** are slugified names derived from the template (e.g., `title-only`, `1-title-and-content`, `1-breaker-with-pattern`). Use `layouts list` to discover the exact IDs.
|
|
86
|
+
|
|
87
|
+
**Placeholder keys** are logical names like `title`, `subtitle`, `content_1`, `picture`. Use `placeholders list <layout-id>` to discover the exact keys and their supported content types for each layout.
|
|
88
|
+
|
|
89
|
+
## Phase 3: Build
|
|
90
|
+
|
|
91
|
+
### Single slide
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
pptx slide create \
|
|
95
|
+
--manifest ./.pptx \
|
|
96
|
+
--layout <layout-id> \
|
|
97
|
+
--set title="Your Title" \
|
|
98
|
+
--set subtitle="Your Subtitle" \
|
|
99
|
+
--out ./out/slide.pptx
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### Full deck from a spec
|
|
103
|
+
|
|
104
|
+
Create a YAML or JSON spec file, then build. See `references/deck-spec.md` for the full spec format.
|
|
105
|
+
|
|
106
|
+
```yaml
|
|
107
|
+
# deck.yaml
|
|
108
|
+
manifest: ./.pptx
|
|
109
|
+
metadata:
|
|
110
|
+
title: My Presentation
|
|
111
|
+
author: Author Name
|
|
112
|
+
slides:
|
|
113
|
+
- layout: title-only
|
|
114
|
+
content:
|
|
115
|
+
title: Welcome
|
|
116
|
+
subtitle: March 2026
|
|
117
|
+
- layout: 1-title-and-content
|
|
118
|
+
content:
|
|
119
|
+
title: Key Points
|
|
120
|
+
content_1: |
|
|
121
|
+
First point.
|
|
122
|
+
Second point.
|
|
123
|
+
Third point.
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
pptx deck build \
|
|
128
|
+
--manifest ./.pptx \
|
|
129
|
+
--spec deck.yaml \
|
|
130
|
+
--out ./out/deck.pptx
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### Preview before writing
|
|
134
|
+
|
|
135
|
+
Always use `--dry-run` first on mutating commands to preview what will happen without writing files:
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
pptx deck build --manifest ./.pptx --spec deck.yaml --out ./out/deck.pptx --dry-run
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### Validate the output
|
|
142
|
+
|
|
143
|
+
After generating a deck, validate it against the manifest:
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
pptx validate --manifest ./.pptx --deck ./out/deck.pptx --strict --format json
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## Supported content types
|
|
150
|
+
|
|
151
|
+
- `text` — plain text
|
|
152
|
+
- `image` — image file reference
|
|
153
|
+
- `table` — structured table data
|
|
154
|
+
- `chart` — chart data
|
|
155
|
+
- `markdown-to-text` — markdown converted to formatted text
|
|
156
|
+
|
|
157
|
+
## Error handling
|
|
158
|
+
|
|
159
|
+
All commands return a structured JSON envelope with `ok`, `errors`, and `warnings` fields. Key exit codes:
|
|
160
|
+
|
|
161
|
+
| Exit | Meaning |
|
|
162
|
+
|------|---------|
|
|
163
|
+
| 0 | Success |
|
|
164
|
+
| 10 | Validation error (bad input, unknown layout/placeholder) |
|
|
165
|
+
| 20 | Policy error |
|
|
166
|
+
| 40 | Conflict (output file exists) |
|
|
167
|
+
| 50 | I/O error |
|
|
168
|
+
| 90 | Internal error |
|
|
169
|
+
|
|
170
|
+
Check `ok` first, then branch on `errors[0].code` if it's `false`.
|
|
171
|
+
|
|
172
|
+
## Typical workflow for building a presentation
|
|
173
|
+
|
|
174
|
+
1. Check for `.pptx/manifest.yaml` — if missing, ask user for a template and run `pptx init`
|
|
175
|
+
2. Run `pptx layouts list` to see available layouts
|
|
176
|
+
3. For each layout you plan to use, run `pptx placeholders list <layout-id>` to discover content keys
|
|
177
|
+
4. Draft a `deck.yaml` spec using only discovered layout IDs and placeholder keys
|
|
178
|
+
5. Preview with `pptx deck build ... --dry-run`
|
|
179
|
+
6. Build with `pptx deck build ... --out ./out/deck.pptx`
|
|
180
|
+
7. Validate with `pptx validate ...`
|
|
181
|
+
|
|
182
|
+
## Key rules
|
|
183
|
+
|
|
184
|
+
- **Only use layout IDs that appear in `layouts list`** — unknown layouts cause validation errors
|
|
185
|
+
- **Only use placeholder keys that appear in `placeholders list`** — unknown keys are silently ignored or cause errors
|
|
186
|
+
- **Always use `--manifest ./.pptx`** to point to the manifest package
|
|
187
|
+
- **Use `--dry-run` before writing** to catch issues early
|
|
188
|
+
- **Use `--format json`** on read commands to get structured output you can parse
|
|
189
|
+
|
|
190
|
+
For detailed deck spec format and advanced options, read `references/deck-spec.md`.
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
# Deck Spec Format
|
|
2
|
+
|
|
3
|
+
The deck spec is a YAML or JSON file that describes a full presentation. It is the input to `pptx deck build`.
|
|
4
|
+
|
|
5
|
+
## Schema
|
|
6
|
+
|
|
7
|
+
```yaml
|
|
8
|
+
# Required
|
|
9
|
+
slides:
|
|
10
|
+
- layout: <layout-id> # Must match an ID from `pptx layouts list`
|
|
11
|
+
content: # Optional — keys must match placeholder logical_names
|
|
12
|
+
<placeholder-key>: <value>
|
|
13
|
+
|
|
14
|
+
# Optional
|
|
15
|
+
manifest: <path> # Path to manifest package (can also be passed via --manifest flag)
|
|
16
|
+
metadata: # Presentation-level metadata
|
|
17
|
+
title: <string>
|
|
18
|
+
author: <string>
|
|
19
|
+
template_version: <string>
|
|
20
|
+
# Additional arbitrary key-value pairs are allowed
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Slide content values
|
|
24
|
+
|
|
25
|
+
Content values depend on the placeholder's `supported_content_types` (discoverable via `pptx placeholders list <layout-id>`).
|
|
26
|
+
|
|
27
|
+
### Text content
|
|
28
|
+
|
|
29
|
+
Plain strings or multi-line YAML strings:
|
|
30
|
+
|
|
31
|
+
```yaml
|
|
32
|
+
- layout: 1-title-and-content
|
|
33
|
+
content:
|
|
34
|
+
title: My Title
|
|
35
|
+
content_1: |
|
|
36
|
+
Bullet point one.
|
|
37
|
+
Bullet point two.
|
|
38
|
+
Bullet point three.
|
|
39
|
+
subtitle: Supporting context here.
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### Image content
|
|
43
|
+
|
|
44
|
+
Reference an image file path:
|
|
45
|
+
|
|
46
|
+
```yaml
|
|
47
|
+
- layout: picture-layout
|
|
48
|
+
content:
|
|
49
|
+
picture: ./images/diagram.png
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### Table content
|
|
53
|
+
|
|
54
|
+
Structured table data:
|
|
55
|
+
|
|
56
|
+
```yaml
|
|
57
|
+
- layout: table-layout
|
|
58
|
+
content:
|
|
59
|
+
table:
|
|
60
|
+
headers: [Name, Role, Status]
|
|
61
|
+
rows:
|
|
62
|
+
- [Alice, Engineer, Active]
|
|
63
|
+
- [Bob, Designer, Active]
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### Chart content
|
|
67
|
+
|
|
68
|
+
Structured chart data:
|
|
69
|
+
|
|
70
|
+
```yaml
|
|
71
|
+
- layout: chart-layout
|
|
72
|
+
content:
|
|
73
|
+
chart:
|
|
74
|
+
type: bar
|
|
75
|
+
categories: [Q1, Q2, Q3, Q4]
|
|
76
|
+
series:
|
|
77
|
+
- name: Revenue
|
|
78
|
+
values: [100, 150, 130, 170]
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Full example
|
|
82
|
+
|
|
83
|
+
```yaml
|
|
84
|
+
manifest: ./.pptx
|
|
85
|
+
metadata:
|
|
86
|
+
title: Quarterly Business Review
|
|
87
|
+
author: Jane Smith
|
|
88
|
+
template_version: 1.0.0
|
|
89
|
+
slides:
|
|
90
|
+
- layout: title-only
|
|
91
|
+
content:
|
|
92
|
+
title: Q1 2026 Business Review
|
|
93
|
+
subtitle: Prepared by Jane Smith
|
|
94
|
+
|
|
95
|
+
- layout: 1-breaker-with-pattern
|
|
96
|
+
content:
|
|
97
|
+
title: Financial Overview
|
|
98
|
+
|
|
99
|
+
- layout: 1-title-and-content
|
|
100
|
+
content:
|
|
101
|
+
title: Revenue Summary
|
|
102
|
+
content_1: |
|
|
103
|
+
Total revenue: $4.2M (up 12% YoY).
|
|
104
|
+
New customer acquisition: 47 accounts.
|
|
105
|
+
Renewal rate: 94%.
|
|
106
|
+
subtitle: All figures as of March 31, 2026.
|
|
107
|
+
|
|
108
|
+
- layout: 1-title-and-content
|
|
109
|
+
content:
|
|
110
|
+
title: Key Initiatives
|
|
111
|
+
content_1: |
|
|
112
|
+
Platform migration: 80% complete.
|
|
113
|
+
New product launch: on track for Q2.
|
|
114
|
+
Hiring: 12 of 15 positions filled.
|
|
115
|
+
|
|
116
|
+
- layout: 1-breaker-with-pattern
|
|
117
|
+
content:
|
|
118
|
+
title: Next Steps
|
|
119
|
+
|
|
120
|
+
- layout: 1-title-and-content
|
|
121
|
+
content:
|
|
122
|
+
title: Action Items
|
|
123
|
+
content_1: |
|
|
124
|
+
Complete platform migration by April 30.
|
|
125
|
+
Finalize Q2 product launch plan.
|
|
126
|
+
Fill remaining 3 open positions.
|
|
127
|
+
subtitle: Review again at May steering committee.
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
## Discovering valid layout IDs and placeholder keys
|
|
131
|
+
|
|
132
|
+
Before writing a spec, always discover what's available:
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
# Get all layout IDs
|
|
136
|
+
pptx layouts list --manifest ./.pptx --format json
|
|
137
|
+
|
|
138
|
+
# Get placeholder keys for a specific layout
|
|
139
|
+
pptx placeholders list <layout-id> --manifest ./.pptx --format json
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
The `placeholders list` output includes:
|
|
143
|
+
- `logical_name` — the key to use in your spec's `content` block
|
|
144
|
+
- `placeholder_type` — what kind of placeholder it is (TITLE, SUBTITLE, BODY, etc.)
|
|
145
|
+
- `supported_content_types` — what content formats are accepted
|
|
146
|
+
- `required` — whether this placeholder must be filled
|
|
147
|
+
- `guidance_text` — hint text from the template about intended use
|
|
148
|
+
|
|
149
|
+
## Building from the spec
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
# Preview first
|
|
153
|
+
pptx deck build --manifest ./.pptx --spec deck.yaml --out ./out/deck.pptx --dry-run
|
|
154
|
+
|
|
155
|
+
# Build
|
|
156
|
+
pptx deck build --manifest ./.pptx --spec deck.yaml --out ./out/deck.pptx
|
|
157
|
+
|
|
158
|
+
# Validate
|
|
159
|
+
pptx validate --manifest ./.pptx --deck ./out/deck.pptx --strict --format json
|
|
160
|
+
```
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
test:
|
|
10
|
+
runs-on: ubuntu-latest
|
|
11
|
+
steps:
|
|
12
|
+
- name: Check out repository
|
|
13
|
+
uses: actions/checkout@v4
|
|
14
|
+
|
|
15
|
+
- name: Set up uv
|
|
16
|
+
uses: astral-sh/setup-uv@v5
|
|
17
|
+
with:
|
|
18
|
+
python-version: '3.12'
|
|
19
|
+
enable-cache: true
|
|
20
|
+
|
|
21
|
+
- name: Sync dependencies
|
|
22
|
+
run: uv sync --group dev
|
|
23
|
+
|
|
24
|
+
- name: Ruff lint
|
|
25
|
+
run: uv run ruff check .
|
|
26
|
+
|
|
27
|
+
- name: Ruff format check
|
|
28
|
+
run: uv run ruff format --check .
|
|
29
|
+
|
|
30
|
+
- name: Pyright
|
|
31
|
+
run: uv run pyright
|
|
32
|
+
|
|
33
|
+
- name: Pytest
|
|
34
|
+
run: uv run pytest
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
name: Publish
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- "v*"
|
|
7
|
+
workflow_dispatch:
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
pypi:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
permissions:
|
|
13
|
+
id-token: write
|
|
14
|
+
contents: write
|
|
15
|
+
environment:
|
|
16
|
+
name: pypi
|
|
17
|
+
steps:
|
|
18
|
+
- name: Check out repository
|
|
19
|
+
uses: actions/checkout@v4
|
|
20
|
+
|
|
21
|
+
- name: Set up uv
|
|
22
|
+
uses: astral-sh/setup-uv@v5
|
|
23
|
+
with:
|
|
24
|
+
python-version: '3.12'
|
|
25
|
+
enable-cache: true
|
|
26
|
+
|
|
27
|
+
- name: Build distributions
|
|
28
|
+
run: uv build
|
|
29
|
+
|
|
30
|
+
- name: Publish to PyPI
|
|
31
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
32
|
+
|
|
33
|
+
- name: Create GitHub Release
|
|
34
|
+
if: startsWith(github.ref, 'refs/tags/v')
|
|
35
|
+
env:
|
|
36
|
+
GH_TOKEN: ${{ github.token }}
|
|
37
|
+
run: gh release create "${{ github.ref_name }}" dist/* --generate-notes
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*.pyo
|
|
5
|
+
*.pyd
|
|
6
|
+
*.so
|
|
7
|
+
.Python
|
|
8
|
+
.venv/
|
|
9
|
+
venv/
|
|
10
|
+
env/
|
|
11
|
+
.pytest_cache/
|
|
12
|
+
.mypy_cache/
|
|
13
|
+
.pyright/
|
|
14
|
+
.ruff_cache/
|
|
15
|
+
.coverage
|
|
16
|
+
coverage.xml
|
|
17
|
+
htmlcov/
|
|
18
|
+
|
|
19
|
+
# Build artifacts
|
|
20
|
+
build/
|
|
21
|
+
dist/
|
|
22
|
+
*.egg-info/
|
|
23
|
+
|
|
24
|
+
# Local outputs
|
|
25
|
+
out/
|
|
26
|
+
.tmp/
|
|
27
|
+
logs/
|
|
28
|
+
*.log
|
|
29
|
+
|
|
30
|
+
# OS / editor
|
|
31
|
+
.DS_Store
|
|
32
|
+
Thumbs.db
|
|
33
|
+
.vscode/
|
|
34
|
+
.idea/
|
|
35
|
+
|
|
36
|
+
# Generated template/manifests during local development
|
|
37
|
+
*.pptx
|
|
38
|
+
*.zip
|
|
39
|
+
|
|
40
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.12
|