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.
Files changed (68) hide show
  1. pptx_cli-1.0.0/.editorconfig +15 -0
  2. pptx_cli-1.0.0/.github/ISSUE_TEMPLATE/bug_report.md +21 -0
  3. pptx_cli-1.0.0/.github/ISSUE_TEMPLATE/config.yml +5 -0
  4. pptx_cli-1.0.0/.github/ISSUE_TEMPLATE/feature_request.md +13 -0
  5. pptx_cli-1.0.0/.github/PULL_REQUEST_TEMPLATE.md +25 -0
  6. pptx_cli-1.0.0/.github/copilot-instructions.md +36 -0
  7. pptx_cli-1.0.0/.github/instructions/backend.instructions.md +12 -0
  8. pptx_cli-1.0.0/.github/instructions/testing.instructions.md +11 -0
  9. pptx_cli-1.0.0/.github/skills/pptx/SKILL.md +190 -0
  10. pptx_cli-1.0.0/.github/skills/pptx/references/deck-spec.md +160 -0
  11. pptx_cli-1.0.0/.github/workflows/ci.yml +34 -0
  12. pptx_cli-1.0.0/.github/workflows/publish.yml +37 -0
  13. pptx_cli-1.0.0/.gitignore +40 -0
  14. pptx_cli-1.0.0/.python-version +1 -0
  15. pptx_cli-1.0.0/AGENTS.md +138 -0
  16. pptx_cli-1.0.0/ARCHITECTURE.md +171 -0
  17. pptx_cli-1.0.0/CHANGELOG.md +21 -0
  18. pptx_cli-1.0.0/CLI-MANIFEST.md +1157 -0
  19. pptx_cli-1.0.0/CONTRIBUTING.md +80 -0
  20. pptx_cli-1.0.0/DECISIONS/ADR-0001-initial-architecture.md +51 -0
  21. pptx_cli-1.0.0/LICENSE +21 -0
  22. pptx_cli-1.0.0/PKG-INFO +505 -0
  23. pptx_cli-1.0.0/PRD.md +1148 -0
  24. pptx_cli-1.0.0/PROJECT.md +70 -0
  25. pptx_cli-1.0.0/README.md +459 -0
  26. pptx_cli-1.0.0/SCAFFOLD.md +291 -0
  27. pptx_cli-1.0.0/SECURITY.md +36 -0
  28. pptx_cli-1.0.0/TESTING.md +63 -0
  29. pptx_cli-1.0.0/docs/DOMAIN.md +31 -0
  30. pptx_cli-1.0.0/docs/GLOSSARY.md +12 -0
  31. pptx_cli-1.0.0/docs/ROADMAP.md +68 -0
  32. pptx_cli-1.0.0/docs/SCAFFOLDING-NOTES.md +37 -0
  33. pptx_cli-1.0.0/guardrails/.gitignore +1 -0
  34. pptx_cli-1.0.0/guardrails/guardrails.jsonl +25 -0
  35. pptx_cli-1.0.0/guardrails/links.jsonl +8 -0
  36. pptx_cli-1.0.0/guardrails/references.jsonl +55 -0
  37. pptx_cli-1.0.0/guardrails/taxonomy.json +3 -0
  38. pptx_cli-1.0.0/guardrails-explorer.html +758 -0
  39. pptx_cli-1.0.0/pyproject.toml +68 -0
  40. pptx_cli-1.0.0/pyrightconfig.json +11 -0
  41. pptx_cli-1.0.0/scripts/bump_version.py +57 -0
  42. pptx_cli-1.0.0/src/pptx_cli/__init__.py +5 -0
  43. pptx_cli-1.0.0/src/pptx_cli/__main__.py +4 -0
  44. pptx_cli-1.0.0/src/pptx_cli/cli.py +372 -0
  45. pptx_cli-1.0.0/src/pptx_cli/commands/__init__.py +1 -0
  46. pptx_cli-1.0.0/src/pptx_cli/commands/compose.py +73 -0
  47. pptx_cli-1.0.0/src/pptx_cli/commands/guide.py +157 -0
  48. pptx_cli-1.0.0/src/pptx_cli/commands/init.py +52 -0
  49. pptx_cli-1.0.0/src/pptx_cli/commands/inspect.py +80 -0
  50. pptx_cli-1.0.0/src/pptx_cli/commands/manifest_ops.py +23 -0
  51. pptx_cli-1.0.0/src/pptx_cli/commands/validate.py +13 -0
  52. pptx_cli-1.0.0/src/pptx_cli/commands/wrapper.py +191 -0
  53. pptx_cli-1.0.0/src/pptx_cli/core/__init__.py +1 -0
  54. pptx_cli-1.0.0/src/pptx_cli/core/composition.py +280 -0
  55. pptx_cli-1.0.0/src/pptx_cli/core/ids.py +24 -0
  56. pptx_cli-1.0.0/src/pptx_cli/core/io.py +60 -0
  57. pptx_cli-1.0.0/src/pptx_cli/core/manifest_store.py +65 -0
  58. pptx_cli-1.0.0/src/pptx_cli/core/runtime.py +30 -0
  59. pptx_cli-1.0.0/src/pptx_cli/core/template.py +595 -0
  60. pptx_cli-1.0.0/src/pptx_cli/core/validation.py +215 -0
  61. pptx_cli-1.0.0/src/pptx_cli/core/versioning.py +47 -0
  62. pptx_cli-1.0.0/src/pptx_cli/models/__init__.py +1 -0
  63. pptx_cli-1.0.0/src/pptx_cli/models/envelope.py +50 -0
  64. pptx_cli-1.0.0/src/pptx_cli/models/manifest.py +175 -0
  65. pptx_cli-1.0.0/tests/conftest.py +28 -0
  66. pptx_cli-1.0.0/tests/test_cli.py +301 -0
  67. pptx_cli-1.0.0/tests/test_versioning.py +22 -0
  68. pptx_cli-1.0.0/uv.lock +694 -0
@@ -0,0 +1,15 @@
1
+ root = true
2
+
3
+ [*]
4
+ charset = utf-8
5
+ end_of_line = lf
6
+ insert_final_newline = true
7
+ indent_style = space
8
+ indent_size = 2
9
+ trim_trailing_whitespace = true
10
+
11
+ [*.py]
12
+ indent_size = 4
13
+
14
+ [*.md]
15
+ trim_trailing_whitespace = false
@@ -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,5 @@
1
+ blank_issues_enabled: false
2
+ contact_links:
3
+ - name: Security issue
4
+ url: https://github.com/ThomasRohde/pptx-cli/security/policy
5
+ about: Please report suspected vulnerabilities privately.
@@ -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