pptlint 0.3.1__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 (205) hide show
  1. pptlint-0.3.1/.github/ISSUE_TEMPLATE/bug.yml +31 -0
  2. pptlint-0.3.1/.github/ISSUE_TEMPLATE/challenge-check.yml +30 -0
  3. pptlint-0.3.1/.github/ISSUE_TEMPLATE/false-positive.yml +32 -0
  4. pptlint-0.3.1/.github/ISSUE_TEMPLATE/integrate-generator.yml +29 -0
  5. pptlint-0.3.1/.github/ISSUE_TEMPLATE/submit-sample.yml +29 -0
  6. pptlint-0.3.1/.github/workflows/ci.yml +88 -0
  7. pptlint-0.3.1/.github/workflows/pages.yml +30 -0
  8. pptlint-0.3.1/.github/workflows/publish-pypi.yml +39 -0
  9. pptlint-0.3.1/.gitignore +12 -0
  10. pptlint-0.3.1/CHANGELOG.md +33 -0
  11. pptlint-0.3.1/CONTRIBUTING.md +11 -0
  12. pptlint-0.3.1/LICENSE +21 -0
  13. pptlint-0.3.1/PKG-INFO +139 -0
  14. pptlint-0.3.1/README.md +107 -0
  15. pptlint-0.3.1/README.zh-CN.md +94 -0
  16. pptlint-0.3.1/ROADMAP.md +30 -0
  17. pptlint-0.3.1/SECURITY.md +7 -0
  18. pptlint-0.3.1/SKILL.md +51 -0
  19. pptlint-0.3.1/THIRD_PARTY_NOTICES.md +9 -0
  20. pptlint-0.3.1/action.yml +92 -0
  21. pptlint-0.3.1/assets/decklint-demo.gif +0 -0
  22. pptlint-0.3.1/assets/pptlint-demo.gif +0 -0
  23. pptlint-0.3.1/benchmark/README.md +32 -0
  24. pptlint-0.3.1/benchmark/benchmark.json +47 -0
  25. pptlint-0.3.1/benchmark/run-manifest-v1.schema.json +56 -0
  26. pptlint-0.3.1/benchmark/run-plan.json +410 -0
  27. pptlint-0.3.1/benchmark/tasks/launch-cn/brand.json +8 -0
  28. pptlint-0.3.1/benchmark/tasks/launch-cn/brief.md +5 -0
  29. pptlint-0.3.1/benchmark/tasks/qbr-cn/brief.md +5 -0
  30. pptlint-0.3.1/benchmark/tasks/qbr-cn/metrics.csv +10 -0
  31. pptlint-0.3.1/benchmark/tasks/technical-en/source.md +5 -0
  32. pptlint-0.3.1/docs/agent-repair-loop.md +50 -0
  33. pptlint-0.3.1/docs/migration-from-decklint.md +33 -0
  34. pptlint-0.3.1/docs/publishing.md +20 -0
  35. pptlint-0.3.1/docs/superpowers/plans/2026-07-11-v02-proof-loop.md +879 -0
  36. pptlint-0.3.1/docs/superpowers/specs/2026-07-11-v02-proof-loop-design.md +266 -0
  37. pptlint-0.3.1/examples/bad-deck.pptx +0 -0
  38. pptlint-0.3.1/examples/good-deck.pptx +0 -0
  39. pptlint-0.3.1/examples/proof-loop/README.md +27 -0
  40. pptlint-0.3.1/examples/proof-loop/after.pptx +0 -0
  41. pptlint-0.3.1/examples/proof-loop/before.pptx +0 -0
  42. pptlint-0.3.1/examples/reports/bad-deck.html +24 -0
  43. pptlint-0.3.1/examples/reports/bad-deck.json +318 -0
  44. pptlint-0.3.1/examples/reports/good-deck.html +24 -0
  45. pptlint-0.3.1/examples/reports/good-deck.json +81 -0
  46. pptlint-0.3.1/pyproject.toml +58 -0
  47. pptlint-0.3.1/schema/decklint-comparison-v1.schema.json +174 -0
  48. pptlint-0.3.1/schema/decklint-report-v1.schema.json +175 -0
  49. pptlint-0.3.1/schema/pptlint-report-v2.schema.json +177 -0
  50. pptlint-0.3.1/site/benchmark/index.html +30 -0
  51. pptlint-0.3.1/site/index.html +52 -0
  52. pptlint-0.3.1/site/proof-loop/after.html +24 -0
  53. pptlint-0.3.1/site/proof-loop/after.json +930 -0
  54. pptlint-0.3.1/site/proof-loop/after.pptx +0 -0
  55. pptlint-0.3.1/site/proof-loop/before.html +24 -0
  56. pptlint-0.3.1/site/proof-loop/before.json +4375 -0
  57. pptlint-0.3.1/site/proof-loop/before.pptx +0 -0
  58. pptlint-0.3.1/site/proof-loop/comparison.html +20 -0
  59. pptlint-0.3.1/site/proof-loop/comparison.json +2662 -0
  60. pptlint-0.3.1/site/proof-loop/deck-montage.png +0 -0
  61. pptlint-0.3.1/src/decklint/__init__.py +3 -0
  62. pptlint-0.3.1/src/decklint/__main__.py +4 -0
  63. pptlint-0.3.1/src/decklint/cli.py +140 -0
  64. pptlint-0.3.1/src/decklint/comparison.py +191 -0
  65. pptlint-0.3.1/src/decklint/comparison_report.py +218 -0
  66. pptlint-0.3.1/src/decklint/compat.py +13 -0
  67. pptlint-0.3.1/src/decklint/model.py +613 -0
  68. pptlint-0.3.1/src/decklint/readiness.py +149 -0
  69. pptlint-0.3.1/src/decklint/render.py +182 -0
  70. pptlint-0.3.1/src/decklint/report.py +251 -0
  71. pptlint-0.3.1/src/decklint/rules.py +500 -0
  72. pptlint-0.3.1/src/decklint/schema.py +82 -0
  73. pptlint-0.3.1/src/decklint/scoring.py +105 -0
  74. pptlint-0.3.1/src/pptlint/__init__.py +5 -0
  75. pptlint-0.3.1/src/pptlint/__main__.py +4 -0
  76. pptlint-0.3.1/src/pptlint/benchmark.py +120 -0
  77. pptlint-0.3.1/src/pptlint/cli.py +1 -0
  78. pptlint-0.3.1/src/pptlint/comparison.py +1 -0
  79. pptlint-0.3.1/src/pptlint/comparison_report.py +1 -0
  80. pptlint-0.3.1/src/pptlint/model.py +1 -0
  81. pptlint-0.3.1/src/pptlint/readiness.py +1 -0
  82. pptlint-0.3.1/src/pptlint/render.py +1 -0
  83. pptlint-0.3.1/src/pptlint/report.py +1 -0
  84. pptlint-0.3.1/src/pptlint/rules.py +1 -0
  85. pptlint-0.3.1/src/pptlint/schema.py +1 -0
  86. pptlint-0.3.1/src/pptlint/scoring.py +1 -0
  87. pptlint-0.3.1/tests/__init__.py +1 -0
  88. pptlint-0.3.1/tests/fixtures/corpus/aspect-01.pptx +0 -0
  89. pptlint-0.3.1/tests/fixtures/corpus/aspect-02.pptx +0 -0
  90. pptlint-0.3.1/tests/fixtures/corpus/aspect-03.pptx +0 -0
  91. pptlint-0.3.1/tests/fixtures/corpus/aspect-04.pptx +0 -0
  92. pptlint-0.3.1/tests/fixtures/corpus/aspect-05.pptx +0 -0
  93. pptlint-0.3.1/tests/fixtures/corpus/blank-01.pptx +0 -0
  94. pptlint-0.3.1/tests/fixtures/corpus/blank-02.pptx +0 -0
  95. pptlint-0.3.1/tests/fixtures/corpus/blank-03.pptx +0 -0
  96. pptlint-0.3.1/tests/fixtures/corpus/blank-04.pptx +0 -0
  97. pptlint-0.3.1/tests/fixtures/corpus/blank-05.pptx +0 -0
  98. pptlint-0.3.1/tests/fixtures/corpus/clean-01.pptx +0 -0
  99. pptlint-0.3.1/tests/fixtures/corpus/clean-02.pptx +0 -0
  100. pptlint-0.3.1/tests/fixtures/corpus/clean-03.pptx +0 -0
  101. pptlint-0.3.1/tests/fixtures/corpus/clean-04.pptx +0 -0
  102. pptlint-0.3.1/tests/fixtures/corpus/clean-05.pptx +0 -0
  103. pptlint-0.3.1/tests/fixtures/corpus/clean-06.pptx +0 -0
  104. pptlint-0.3.1/tests/fixtures/corpus/clean-07.pptx +0 -0
  105. pptlint-0.3.1/tests/fixtures/corpus/clean-08.pptx +0 -0
  106. pptlint-0.3.1/tests/fixtures/corpus/clean-09.pptx +0 -0
  107. pptlint-0.3.1/tests/fixtures/corpus/clean-10.pptx +0 -0
  108. pptlint-0.3.1/tests/fixtures/corpus/clean-11.pptx +0 -0
  109. pptlint-0.3.1/tests/fixtures/corpus/clean-12.pptx +0 -0
  110. pptlint-0.3.1/tests/fixtures/corpus/clean-13.pptx +0 -0
  111. pptlint-0.3.1/tests/fixtures/corpus/clean-14.pptx +0 -0
  112. pptlint-0.3.1/tests/fixtures/corpus/clean-15.pptx +0 -0
  113. pptlint-0.3.1/tests/fixtures/corpus/clean-16.pptx +0 -0
  114. pptlint-0.3.1/tests/fixtures/corpus/clean-17.pptx +0 -0
  115. pptlint-0.3.1/tests/fixtures/corpus/clean-18.pptx +0 -0
  116. pptlint-0.3.1/tests/fixtures/corpus/clean-19.pptx +0 -0
  117. pptlint-0.3.1/tests/fixtures/corpus/clean-20.pptx +0 -0
  118. pptlint-0.3.1/tests/fixtures/corpus/clipping-01.pptx +0 -0
  119. pptlint-0.3.1/tests/fixtures/corpus/clipping-02.pptx +0 -0
  120. pptlint-0.3.1/tests/fixtures/corpus/clipping-03.pptx +0 -0
  121. pptlint-0.3.1/tests/fixtures/corpus/clipping-04.pptx +0 -0
  122. pptlint-0.3.1/tests/fixtures/corpus/clipping-05.pptx +0 -0
  123. pptlint-0.3.1/tests/fixtures/corpus/comments-01.pptx +0 -0
  124. pptlint-0.3.1/tests/fixtures/corpus/comments-02.pptx +0 -0
  125. pptlint-0.3.1/tests/fixtures/corpus/comments-03.pptx +0 -0
  126. pptlint-0.3.1/tests/fixtures/corpus/comments-04.pptx +0 -0
  127. pptlint-0.3.1/tests/fixtures/corpus/comments-05.pptx +0 -0
  128. pptlint-0.3.1/tests/fixtures/corpus/flattened-01.pptx +0 -0
  129. pptlint-0.3.1/tests/fixtures/corpus/flattened-02.pptx +0 -0
  130. pptlint-0.3.1/tests/fixtures/corpus/flattened-03.pptx +0 -0
  131. pptlint-0.3.1/tests/fixtures/corpus/flattened-04.pptx +0 -0
  132. pptlint-0.3.1/tests/fixtures/corpus/flattened-05.pptx +0 -0
  133. pptlint-0.3.1/tests/fixtures/corpus/flattened-06.pptx +0 -0
  134. pptlint-0.3.1/tests/fixtures/corpus/flattened-07.pptx +0 -0
  135. pptlint-0.3.1/tests/fixtures/corpus/flattened-08.pptx +0 -0
  136. pptlint-0.3.1/tests/fixtures/corpus/flattened-09.pptx +0 -0
  137. pptlint-0.3.1/tests/fixtures/corpus/flattened-10.pptx +0 -0
  138. pptlint-0.3.1/tests/fixtures/corpus/hidden-01.pptx +0 -0
  139. pptlint-0.3.1/tests/fixtures/corpus/hidden-02.pptx +0 -0
  140. pptlint-0.3.1/tests/fixtures/corpus/hidden-03.pptx +0 -0
  141. pptlint-0.3.1/tests/fixtures/corpus/hidden-04.pptx +0 -0
  142. pptlint-0.3.1/tests/fixtures/corpus/hidden-05.pptx +0 -0
  143. pptlint-0.3.1/tests/fixtures/corpus/low-contrast-01.pptx +0 -0
  144. pptlint-0.3.1/tests/fixtures/corpus/low-contrast-02.pptx +0 -0
  145. pptlint-0.3.1/tests/fixtures/corpus/low-contrast-03.pptx +0 -0
  146. pptlint-0.3.1/tests/fixtures/corpus/low-contrast-04.pptx +0 -0
  147. pptlint-0.3.1/tests/fixtures/corpus/low-contrast-05.pptx +0 -0
  148. pptlint-0.3.1/tests/fixtures/corpus/manifest.json +505 -0
  149. pptlint-0.3.1/tests/fixtures/corpus/missing-content-type-01.pptx +0 -0
  150. pptlint-0.3.1/tests/fixtures/corpus/missing-content-type-02.pptx +0 -0
  151. pptlint-0.3.1/tests/fixtures/corpus/missing-content-type-03.pptx +0 -0
  152. pptlint-0.3.1/tests/fixtures/corpus/missing-content-type-04.pptx +0 -0
  153. pptlint-0.3.1/tests/fixtures/corpus/missing-content-type-05.pptx +0 -0
  154. pptlint-0.3.1/tests/fixtures/corpus/off-canvas-01.pptx +0 -0
  155. pptlint-0.3.1/tests/fixtures/corpus/off-canvas-02.pptx +0 -0
  156. pptlint-0.3.1/tests/fixtures/corpus/off-canvas-03.pptx +0 -0
  157. pptlint-0.3.1/tests/fixtures/corpus/off-canvas-04.pptx +0 -0
  158. pptlint-0.3.1/tests/fixtures/corpus/off-canvas-05.pptx +0 -0
  159. pptlint-0.3.1/tests/fixtures/corpus/overlap-01.pptx +0 -0
  160. pptlint-0.3.1/tests/fixtures/corpus/overlap-02.pptx +0 -0
  161. pptlint-0.3.1/tests/fixtures/corpus/overlap-03.pptx +0 -0
  162. pptlint-0.3.1/tests/fixtures/corpus/overlap-04.pptx +0 -0
  163. pptlint-0.3.1/tests/fixtures/corpus/overlap-05.pptx +0 -0
  164. pptlint-0.3.1/tests/fixtures/corpus/privacy-01.pptx +0 -0
  165. pptlint-0.3.1/tests/fixtures/corpus/privacy-02.pptx +0 -0
  166. pptlint-0.3.1/tests/fixtures/corpus/privacy-03.pptx +0 -0
  167. pptlint-0.3.1/tests/fixtures/corpus/privacy-04.pptx +0 -0
  168. pptlint-0.3.1/tests/fixtures/corpus/privacy-05.pptx +0 -0
  169. pptlint-0.3.1/tests/fixtures/corpus/repeated-layout-01.pptx +0 -0
  170. pptlint-0.3.1/tests/fixtures/corpus/repeated-layout-02.pptx +0 -0
  171. pptlint-0.3.1/tests/fixtures/corpus/repeated-layout-03.pptx +0 -0
  172. pptlint-0.3.1/tests/fixtures/corpus/repeated-layout-04.pptx +0 -0
  173. pptlint-0.3.1/tests/fixtures/corpus/repeated-layout-05.pptx +0 -0
  174. pptlint-0.3.1/tests/fixtures/corpus/small-font-01.pptx +0 -0
  175. pptlint-0.3.1/tests/fixtures/corpus/small-font-02.pptx +0 -0
  176. pptlint-0.3.1/tests/fixtures/corpus/small-font-03.pptx +0 -0
  177. pptlint-0.3.1/tests/fixtures/corpus/small-font-04.pptx +0 -0
  178. pptlint-0.3.1/tests/fixtures/corpus/small-font-05.pptx +0 -0
  179. pptlint-0.3.1/tests/fixtures/corpus/small-font-06.pptx +0 -0
  180. pptlint-0.3.1/tests/fixtures/corpus/small-font-07.pptx +0 -0
  181. pptlint-0.3.1/tests/fixtures/corpus/small-font-08.pptx +0 -0
  182. pptlint-0.3.1/tests/fixtures/corpus/small-font-09.pptx +0 -0
  183. pptlint-0.3.1/tests/fixtures/corpus/small-font-10.pptx +0 -0
  184. pptlint-0.3.1/tests/fixtures/corpus/untitled-01.pptx +0 -0
  185. pptlint-0.3.1/tests/fixtures/corpus/untitled-02.pptx +0 -0
  186. pptlint-0.3.1/tests/fixtures/corpus/untitled-03.pptx +0 -0
  187. pptlint-0.3.1/tests/fixtures/corpus/untitled-04.pptx +0 -0
  188. pptlint-0.3.1/tests/fixtures/corpus/untitled-05.pptx +0 -0
  189. pptlint-0.3.1/tests/pptx_factory.py +167 -0
  190. pptlint-0.3.1/tests/report_factory.py +47 -0
  191. pptlint-0.3.1/tests/test_ai_generated_titles.py +94 -0
  192. pptlint-0.3.1/tests/test_benchmark.py +149 -0
  193. pptlint-0.3.1/tests/test_cli.py +157 -0
  194. pptlint-0.3.1/tests/test_comparison.py +114 -0
  195. pptlint-0.3.1/tests/test_comparison_report.py +45 -0
  196. pptlint-0.3.1/tests/test_malformed_inputs.py +97 -0
  197. pptlint-0.3.1/tests/test_model_and_scoring.py +212 -0
  198. pptlint-0.3.1/tests/test_pptlint_v2_contract.py +111 -0
  199. pptlint-0.3.1/tests/test_public_contract.py +235 -0
  200. pptlint-0.3.1/tests/test_real_office_integration.py +93 -0
  201. pptlint-0.3.1/tests/test_render_and_report.py +167 -0
  202. pptlint-0.3.1/tests/test_rules.py +205 -0
  203. pptlint-0.3.1/tools/benchmark.py +113 -0
  204. pptlint-0.3.1/tools/generate_examples.py +90 -0
  205. pptlint-0.3.1/tools/generate_test_corpus.py +125 -0
@@ -0,0 +1,31 @@
1
+ name: Bug report
2
+ description: Report a crash, invalid report, or renderer failure.
3
+ title: "[Bug]: "
4
+ labels: [bug]
5
+ body:
6
+ - type: input
7
+ id: version
8
+ attributes:
9
+ label: PPTLint version
10
+ validations:
11
+ required: true
12
+ - type: textarea
13
+ id: command
14
+ attributes:
15
+ label: Command and exit code
16
+ render: shell
17
+ validations:
18
+ required: true
19
+ - type: textarea
20
+ id: behavior
21
+ attributes:
22
+ label: Expected and actual behavior
23
+ validations:
24
+ required: true
25
+ - type: textarea
26
+ id: reproduction
27
+ attributes:
28
+ label: Safe reproduction
29
+ description: Use a synthetic or public file. Never attach confidential material.
30
+ validations:
31
+ required: true
@@ -0,0 +1,30 @@
1
+ name: Challenge a PPTLint check
2
+ description: Report a false positive, false negative, unclear impact, or unhelpful repair step.
3
+ title: "[Check challenge] "
4
+ labels: [rule-review]
5
+ body:
6
+ - type: dropdown
7
+ id: challenge
8
+ attributes:
9
+ label: What needs correction?
10
+ options:
11
+ - A correct slide was reported as a problem
12
+ - A real problem was missed
13
+ - The delivery impact is overstated
14
+ - The PowerPoint repair steps are unclear
15
+ validations:
16
+ required: true
17
+ - type: input
18
+ id: rule
19
+ attributes:
20
+ label: Reported check name
21
+ description: Copy the small rule identifier from the report if available.
22
+ validations:
23
+ required: true
24
+ - type: textarea
25
+ id: evidence
26
+ attributes:
27
+ label: Evidence
28
+ description: Explain the expected behavior and provide a safe minimal PPTX or reproducible construction steps.
29
+ validations:
30
+ required: true
@@ -0,0 +1,32 @@
1
+ name: False positive
2
+ description: Report a high-confidence finding that should not have affected the score or CI gate.
3
+ title: "[False positive]: "
4
+ labels: [false-positive]
5
+ body:
6
+ - type: input
7
+ id: version
8
+ attributes:
9
+ label: PPTLint version
10
+ validations:
11
+ required: true
12
+ - type: input
13
+ id: rule
14
+ attributes:
15
+ label: Rule ID
16
+ placeholder: readability.small-font
17
+ validations:
18
+ required: true
19
+ - type: textarea
20
+ id: evidence
21
+ attributes:
22
+ label: Why the finding is incorrect
23
+ description: Share a synthetic or public reproduction. Do not upload a private deck.
24
+ validations:
25
+ required: true
26
+ - type: textarea
27
+ id: report
28
+ attributes:
29
+ label: Redacted finding JSON
30
+ render: json
31
+ validations:
32
+ required: true
@@ -0,0 +1,29 @@
1
+ name: Add an AI presentation project
2
+ description: Propose a generator for the open PowerPoint delivery check or request Action integration.
3
+ title: "[Generator] "
4
+ labels: [integration]
5
+ body:
6
+ - type: input
7
+ id: repository
8
+ attributes:
9
+ label: Public repository
10
+ placeholder: https://github.com/owner/project
11
+ validations:
12
+ required: true
13
+ - type: dropdown
14
+ id: request
15
+ attributes:
16
+ label: Request
17
+ options:
18
+ - Add this project to the controlled benchmark
19
+ - Add PPTLint to this project's GitHub Actions
20
+ - Re-run an existing benchmark result
21
+ validations:
22
+ required: true
23
+ - type: textarea
24
+ id: instructions
25
+ attributes:
26
+ label: Recommended generation instructions
27
+ description: Link to the project's documented recommended model, provider, and export workflow.
28
+ validations:
29
+ required: true
@@ -0,0 +1,29 @@
1
+ name: Submit a PowerPoint sample
2
+ description: Share a public or safely reduced PPTX that demonstrates a real delivery problem.
3
+ title: "[Sample] "
4
+ labels: [sample]
5
+ body:
6
+ - type: markdown
7
+ attributes:
8
+ value: "Do not attach confidential files. Use an openly licensed or safely reduced example."
9
+ - type: input
10
+ id: source
11
+ attributes:
12
+ label: Public source or license
13
+ description: Link to the source and state why the file can be redistributed.
14
+ validations:
15
+ required: true
16
+ - type: textarea
17
+ id: problem
18
+ attributes:
19
+ label: What goes wrong for the recipient?
20
+ description: Describe what a person sees when opening, presenting, editing, or sending the file.
21
+ validations:
22
+ required: true
23
+ - type: textarea
24
+ id: reproduction
25
+ attributes:
26
+ label: Safe reproduction
27
+ description: Provide the PPTLint command, version, page number, and report excerpt without private data.
28
+ validations:
29
+ required: true
@@ -0,0 +1,88 @@
1
+ name: CI
2
+ on:
3
+ push:
4
+ pull_request:
5
+ jobs:
6
+ test:
7
+ strategy:
8
+ matrix:
9
+ os: [ubuntu-latest, windows-latest, macos-latest]
10
+ python: ["3.10", "3.11", "3.12", "3.13"]
11
+ runs-on: ${{ matrix.os }}
12
+ steps:
13
+ - uses: actions/checkout@v4
14
+ - uses: actions/setup-python@v5
15
+ with:
16
+ python-version: ${{ matrix.python }}
17
+ - run: python -m pip install -e ".[dev]"
18
+ - run: pytest
19
+ - run: ruff check src tests tools
20
+ package:
21
+ runs-on: ubuntu-latest
22
+ steps:
23
+ - uses: actions/checkout@v4
24
+ - uses: actions/setup-python@v5
25
+ with:
26
+ python-version: "3.12"
27
+ - run: python -m pip install build
28
+ - run: python -m build
29
+ - uses: actions/upload-artifact@v4
30
+ with:
31
+ name: distributions
32
+ path: dist/
33
+ action-contract:
34
+ runs-on: ubuntu-latest
35
+ steps:
36
+ - uses: actions/checkout@v4
37
+ - name: Passing deck uploads reports
38
+ uses: ./
39
+ with:
40
+ path: examples/good-deck.pptx
41
+ renderer: wireframe
42
+ artifact-name: good-deck-report
43
+ - name: Failing deck still uploads reports
44
+ id: bad
45
+ continue-on-error: true
46
+ uses: ./
47
+ with:
48
+ path: examples/bad-deck.pptx
49
+ profile: ai-generated
50
+ renderer: wireframe
51
+ artifact-name: bad-deck-report
52
+ - name: Confirm the bad deck requires changes
53
+ if: always()
54
+ env:
55
+ BAD_OUTCOME: ${{ steps.bad.outcome }}
56
+ run: test "$BAD_OUTCOME" = failure
57
+ - name: Minimum secondary score can fail independently
58
+ id: minimum
59
+ continue-on-error: true
60
+ uses: ./
61
+ with:
62
+ path: examples/bad-deck.pptx
63
+ fail-on: none
64
+ min-score: "100"
65
+ renderer: wireframe
66
+ artifact-name: minimum-score-report
67
+ - name: Confirm minimum-score exit code
68
+ if: always()
69
+ env:
70
+ OUTCOME: ${{ steps.minimum.outcome }}
71
+ EXIT_CODE: ${{ steps.minimum.outputs.exit-code }}
72
+ run: test "$OUTCOME" = failure && test "$EXIT_CODE" = 1
73
+ - name: Create damaged PPTX input
74
+ run: printf 'not a zip' > "$RUNNER_TEMP/damaged.pptx"
75
+ - name: Damaged files are operational errors
76
+ id: damaged
77
+ continue-on-error: true
78
+ uses: ./
79
+ with:
80
+ path: ${{ runner.temp }}/damaged.pptx
81
+ renderer: wireframe
82
+ artifact-name: damaged-deck-report
83
+ - name: Confirm damaged-file exit code
84
+ if: always()
85
+ env:
86
+ OUTCOME: ${{ steps.damaged.outcome }}
87
+ EXIT_CODE: ${{ steps.damaged.outputs.exit-code }}
88
+ run: test "$OUTCOME" = failure && test "$EXIT_CODE" = 2
@@ -0,0 +1,30 @@
1
+ name: Deploy GitHub Pages
2
+ on:
3
+ push:
4
+ branches: [main]
5
+ paths:
6
+ - "site/**"
7
+ - ".github/workflows/pages.yml"
8
+ workflow_dispatch:
9
+ permissions:
10
+ contents: read
11
+ pages: write
12
+ id-token: write
13
+ concurrency:
14
+ group: pages
15
+ cancel-in-progress: true
16
+ jobs:
17
+ deploy:
18
+ environment:
19
+ name: github-pages
20
+ url: ${{ steps.deployment.outputs.page_url }}
21
+ runs-on: ubuntu-latest
22
+ steps:
23
+ - uses: actions/checkout@v4
24
+ - uses: actions/configure-pages@v5
25
+ - uses: actions/upload-pages-artifact@v3
26
+ with:
27
+ path: site
28
+ - name: Deploy
29
+ id: deployment
30
+ uses: actions/deploy-pages@v4
@@ -0,0 +1,39 @@
1
+ name: Publish to PyPI
2
+ on:
3
+ workflow_dispatch:
4
+ inputs:
5
+ confirm-version:
6
+ description: Version to publish, for example 0.3.0.
7
+ required: true
8
+ permissions:
9
+ contents: read
10
+ jobs:
11
+ build:
12
+ runs-on: ubuntu-latest
13
+ steps:
14
+ - uses: actions/checkout@v4
15
+ - uses: actions/setup-python@v5
16
+ with:
17
+ python-version: "3.12"
18
+ - run: python -m pip install build
19
+ - name: Confirm package version
20
+ env:
21
+ EXPECTED: ${{ inputs.confirm-version }}
22
+ run: python -c 'import tomllib, os; actual=tomllib.load(open("pyproject.toml","rb"))["project"]["version"]; assert actual == os.environ["EXPECTED"], (actual, os.environ["EXPECTED"])'
23
+ - run: python -m build
24
+ - uses: actions/upload-artifact@v4
25
+ with:
26
+ name: pypi-distributions
27
+ path: dist/
28
+ publish:
29
+ needs: build
30
+ runs-on: ubuntu-latest
31
+ environment: pypi
32
+ permissions:
33
+ id-token: write
34
+ steps:
35
+ - uses: actions/download-artifact@v4
36
+ with:
37
+ name: pypi-distributions
38
+ path: dist/
39
+ - uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,12 @@
1
+ .worktrees/
2
+ .venv/
3
+ __pycache__/
4
+ .pytest_cache/
5
+ .ruff_cache/
6
+ build/
7
+ dist/
8
+ *.egg-info/
9
+ .coverage
10
+ htmlcov/
11
+ decklint-report.html
12
+ decklint-report.json
@@ -0,0 +1,33 @@
1
+ # Changelog
2
+
3
+ ## 0.3.1 — 2026-07-11
4
+
5
+ - Put the plain-language delivery result first in the terminal and HTML report.
6
+ - Print the three most important slide-level actions directly in the terminal.
7
+ - Move scores, rule identifiers, renderer names, and other technical details behind optional sections.
8
+ - Make the coding-agent instruction the first action on the public homepage.
9
+
10
+ ## 0.3.0 — 2026-07-11
11
+
12
+ - Rename the primary product and package to PPTLint while keeping the previous command available through v0.4.
13
+ - Add `pptlint check`, `pptlint-report/v2`, plain-language delivery results, and three priority actions.
14
+ - Add content-type, blank-slide, substantial text-overlap, clipping-risk, font-portability, aspect-ratio, and editability checks.
15
+ - Replace the score-first report and homepage with a ready, review, or blocked result for ordinary PowerPoint users.
16
+
17
+ ## 0.2.0 — 2026-07-11
18
+
19
+ - Add deterministic before/after comparison with resolved, persistent, and new findings.
20
+ - Add `decklint-comparison/v1`, a Chinese-first offline comparison report, and regression gates.
21
+ - Infer semantic titles for editable AI-generated slides without weakening the baseline profile.
22
+ - Add the documented Ultimate PPT Master repair loop while keeping DeckLint read-only.
23
+ - Publish a reproducible Proof Loop case study: 49→100, 103 findings resolved, and zero new findings.
24
+ - Add an offline GitHub Pages product surface with downloadable PPTX, JSON, and HTML evidence.
25
+
26
+ ## 0.1.0 — 2026-07-11
27
+
28
+ - Add deterministic local PPTX parsing with package safety limits.
29
+ - Add integrity, readability, editability, consistency, accessibility, and privacy findings.
30
+ - Add transparent weighted scoring and the `decklint-report/v1` JSON Schema.
31
+ - Publish category weights, scoring policy, per-finding deductions, caps, and calculation state in JSON and HTML.
32
+ - Add self-contained HTML reports with wireframe and optional LibreOffice previews.
33
+ - Add CLI, Agent Skill, composite GitHub Action, 30-case synthetic corpus, and good/bad proof reports.
@@ -0,0 +1,11 @@
1
+ # Contributing
2
+
3
+ PPTLint accepts narrowly scoped checks with reproducible PPTX fixtures.
4
+
5
+ 1. Open an issue describing the observable defect and why it can be judged deterministically.
6
+ 2. Add a synthetic or openly licensed fixture; never commit private presentations.
7
+ 3. Add a failing test that proves the rule's positive, negative, and boundary behavior.
8
+ 4. Keep low-confidence visual heuristics advisory: they must not deduct points or fail CI.
9
+ 5. Run `pytest`, `ruff check src tests tools`, `python -m build`, and `git diff --check`.
10
+
11
+ Every reported item must include evidence and a concrete repair step. Checks that judge taste, factual truth, or business strategy are out of scope.
pptlint-0.3.1/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Kdnsna
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
pptlint-0.3.1/PKG-INFO ADDED
@@ -0,0 +1,139 @@
1
+ Metadata-Version: 2.4
2
+ Name: pptlint
3
+ Version: 0.3.1
4
+ Summary: Open-source PPT/PPTX preflight checks for AI-generated PowerPoint files.
5
+ Project-URL: Homepage, https://github.com/kdnsna/pptlint
6
+ Project-URL: Repository, https://github.com/kdnsna/pptlint
7
+ Project-URL: Issues, https://github.com/kdnsna/pptlint/issues
8
+ Project-URL: Documentation, https://kdnsna.github.io/pptlint/
9
+ Author: Kdnsna
10
+ License: MIT
11
+ License-File: LICENSE
12
+ Classifier: Development Status :: 3 - Alpha
13
+ Classifier: License :: OSI Approved :: MIT License
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3.10
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Topic :: Office/Business :: Office Suites
20
+ Requires-Python: >=3.10
21
+ Requires-Dist: defusedxml<1,>=0.7.1
22
+ Requires-Dist: pillow<13,>=10
23
+ Requires-Dist: pypdfium2<6,>=4.30
24
+ Provides-Extra: dev
25
+ Requires-Dist: build<2,>=1.2; extra == 'dev'
26
+ Requires-Dist: jsonschema<5,>=4.23; extra == 'dev'
27
+ Requires-Dist: pytest<10,>=8; extra == 'dev'
28
+ Requires-Dist: python-pptx<2,>=1.0; extra == 'dev'
29
+ Requires-Dist: pyyaml<7,>=6; extra == 'dev'
30
+ Requires-Dist: ruff<1,>=0.9; extra == 'dev'
31
+ Description-Content-Type: text/markdown
32
+
33
+ # PPTLint
34
+
35
+ > **Check an AI-generated PowerPoint before you send or present it.**
36
+
37
+ [简体中文](README.zh-CN.md) · [Live example](https://kdnsna.github.io/pptlint/) · [Before/after report](https://kdnsna.github.io/pptlint/proof-loop/comparison.html)
38
+
39
+ [![CI](https://github.com/kdnsna/pptlint/actions/workflows/ci.yml/badge.svg)](https://github.com/kdnsna/pptlint/actions/workflows/ci.yml)
40
+ [![Pages](https://github.com/kdnsna/pptlint/actions/workflows/pages.yml/badge.svg)](https://kdnsna.github.io/pptlint/)
41
+ [![License: MIT](https://img.shields.io/badge/license-MIT-10233f.svg)](LICENSE)
42
+
43
+ AI tools can make a PowerPoint quickly. They can also leave behind missing files, clipped text, overlapping text boxes, unreadable type, flattened slides, speaker notes, comments, and personal information.
44
+
45
+ PPTLint checks the `.pptx` on your computer and answers three questions:
46
+
47
+ - **Ready to send** — no high-confidence delivery problem was found.
48
+ - **Check before sending** — open the named slides and confirm the highlighted items.
49
+ - **Fix before sending** — fix the listed problem before sending the file.
50
+
51
+ PPTLint does not upload the presentation, call an AI model, or change the source file.
52
+
53
+ ## Ask your coding agent
54
+
55
+ Copy this into Codex, Claude Code, or another coding agent:
56
+
57
+ ```text
58
+ Install PPTLint and check whether this AI-generated PowerPoint is ready to send.
59
+ Show me the slides I must fix first and the exact PowerPoint steps for each one.
60
+ ```
61
+
62
+ ## Run it yourself
63
+
64
+ Until the first PyPI release is verified, run the release wheel:
65
+
66
+ ```bash
67
+ uvx --from https://github.com/kdnsna/pptlint/releases/download/v0.3.1/pptlint-0.3.1-py3-none-any.whl \
68
+ pptlint check output.pptx --profile ai-generated
69
+ ```
70
+
71
+ PPTLint writes two files:
72
+
73
+ - `pptlint-report.html` — an offline report for people;
74
+ - `pptlint-report.json` — the same result for agents and automation.
75
+
76
+ The first screen shows whether the file is ready and the three most important actions. The numerical score is secondary and is intended only for comparing the same presentation before and after changes.
77
+
78
+ ## See real examples
79
+
80
+ - [Ready example](examples/reports/good-deck.html)
81
+ - [Problem example](examples/reports/bad-deck.html)
82
+ - [Real editable PowerPoint improvement: 49 → 100](https://kdnsna.github.io/pptlint/proof-loop/comparison.html)
83
+ - [Before PPTX](examples/proof-loop/before.pptx) and [after PPTX](examples/proof-loop/after.pptx)
84
+ - [Open method for checking five AI PowerPoint projects](https://kdnsna.github.io/pptlint/benchmark/)
85
+
86
+ ## Check changes
87
+
88
+ Keep the original file, check a separate edited copy, and compare the two reports:
89
+
90
+ ```bash
91
+ pptlint check before.pptx --output before
92
+ pptlint check after.pptx --output after
93
+ pptlint compare before.json after.json --output comparison
94
+ ```
95
+
96
+ The comparison separates problems that were fixed, problems that remain, and problems introduced by the edit.
97
+
98
+ ## Use it in GitHub Actions
99
+
100
+ ```yaml
101
+ - uses: kdnsna/pptlint@v0
102
+ with:
103
+ path: output.pptx
104
+ profile: ai-generated
105
+ renderer: wireframe
106
+ ```
107
+
108
+ The reports are uploaded even when the check fails.
109
+
110
+ ## What PPTLint checks
111
+
112
+ | User concern | Checks |
113
+ |---|---|
114
+ | Will it open correctly? | PPTX package, relationships, content types, media, slide list, real rendering |
115
+ | Will it fail on screen? | Off-slide text, substantial text overlap, explicit clipping risk, small type, low contrast, unusual page size |
116
+ | Can someone edit it later? | Full-slide images and native text, table, chart, shape coverage |
117
+ | Is it safe to send? | Notes, comments, hidden slides, author information, external files and links |
118
+
119
+ Low-confidence hints never block delivery. PPTLint does not judge whether a presentation is beautiful, persuasive, or factually correct.
120
+
121
+ ## Stable interfaces
122
+
123
+ - Current report: [`pptlint-report/v2`](schema/pptlint-report-v2.schema.json)
124
+ - Previous report: [`decklint-report/v1`](schema/decklint-report-v1.schema.json)
125
+ - Comparison format: [`decklint-comparison/v1`](schema/decklint-comparison-v1.schema.json)
126
+ - Exit code `0`: completed; `1`: changes required; `2`: file or runtime error.
127
+
128
+ The previous `decklint` command remains available through v0.4. Existing v1 reports can still be compared.
129
+
130
+ ## Development
131
+
132
+ ```bash
133
+ uv venv --python 3.13
134
+ uv pip install -e '.[dev]'
135
+ PYTHONPATH=src .venv/bin/python -m pytest
136
+ .venv/bin/ruff check src tests tools
137
+ ```
138
+
139
+ PPTLint is local, read-only, model-free, telemetry-free, and MIT licensed.
@@ -0,0 +1,107 @@
1
+ # PPTLint
2
+
3
+ > **Check an AI-generated PowerPoint before you send or present it.**
4
+
5
+ [简体中文](README.zh-CN.md) · [Live example](https://kdnsna.github.io/pptlint/) · [Before/after report](https://kdnsna.github.io/pptlint/proof-loop/comparison.html)
6
+
7
+ [![CI](https://github.com/kdnsna/pptlint/actions/workflows/ci.yml/badge.svg)](https://github.com/kdnsna/pptlint/actions/workflows/ci.yml)
8
+ [![Pages](https://github.com/kdnsna/pptlint/actions/workflows/pages.yml/badge.svg)](https://kdnsna.github.io/pptlint/)
9
+ [![License: MIT](https://img.shields.io/badge/license-MIT-10233f.svg)](LICENSE)
10
+
11
+ AI tools can make a PowerPoint quickly. They can also leave behind missing files, clipped text, overlapping text boxes, unreadable type, flattened slides, speaker notes, comments, and personal information.
12
+
13
+ PPTLint checks the `.pptx` on your computer and answers three questions:
14
+
15
+ - **Ready to send** — no high-confidence delivery problem was found.
16
+ - **Check before sending** — open the named slides and confirm the highlighted items.
17
+ - **Fix before sending** — fix the listed problem before sending the file.
18
+
19
+ PPTLint does not upload the presentation, call an AI model, or change the source file.
20
+
21
+ ## Ask your coding agent
22
+
23
+ Copy this into Codex, Claude Code, or another coding agent:
24
+
25
+ ```text
26
+ Install PPTLint and check whether this AI-generated PowerPoint is ready to send.
27
+ Show me the slides I must fix first and the exact PowerPoint steps for each one.
28
+ ```
29
+
30
+ ## Run it yourself
31
+
32
+ Until the first PyPI release is verified, run the release wheel:
33
+
34
+ ```bash
35
+ uvx --from https://github.com/kdnsna/pptlint/releases/download/v0.3.1/pptlint-0.3.1-py3-none-any.whl \
36
+ pptlint check output.pptx --profile ai-generated
37
+ ```
38
+
39
+ PPTLint writes two files:
40
+
41
+ - `pptlint-report.html` — an offline report for people;
42
+ - `pptlint-report.json` — the same result for agents and automation.
43
+
44
+ The first screen shows whether the file is ready and the three most important actions. The numerical score is secondary and is intended only for comparing the same presentation before and after changes.
45
+
46
+ ## See real examples
47
+
48
+ - [Ready example](examples/reports/good-deck.html)
49
+ - [Problem example](examples/reports/bad-deck.html)
50
+ - [Real editable PowerPoint improvement: 49 → 100](https://kdnsna.github.io/pptlint/proof-loop/comparison.html)
51
+ - [Before PPTX](examples/proof-loop/before.pptx) and [after PPTX](examples/proof-loop/after.pptx)
52
+ - [Open method for checking five AI PowerPoint projects](https://kdnsna.github.io/pptlint/benchmark/)
53
+
54
+ ## Check changes
55
+
56
+ Keep the original file, check a separate edited copy, and compare the two reports:
57
+
58
+ ```bash
59
+ pptlint check before.pptx --output before
60
+ pptlint check after.pptx --output after
61
+ pptlint compare before.json after.json --output comparison
62
+ ```
63
+
64
+ The comparison separates problems that were fixed, problems that remain, and problems introduced by the edit.
65
+
66
+ ## Use it in GitHub Actions
67
+
68
+ ```yaml
69
+ - uses: kdnsna/pptlint@v0
70
+ with:
71
+ path: output.pptx
72
+ profile: ai-generated
73
+ renderer: wireframe
74
+ ```
75
+
76
+ The reports are uploaded even when the check fails.
77
+
78
+ ## What PPTLint checks
79
+
80
+ | User concern | Checks |
81
+ |---|---|
82
+ | Will it open correctly? | PPTX package, relationships, content types, media, slide list, real rendering |
83
+ | Will it fail on screen? | Off-slide text, substantial text overlap, explicit clipping risk, small type, low contrast, unusual page size |
84
+ | Can someone edit it later? | Full-slide images and native text, table, chart, shape coverage |
85
+ | Is it safe to send? | Notes, comments, hidden slides, author information, external files and links |
86
+
87
+ Low-confidence hints never block delivery. PPTLint does not judge whether a presentation is beautiful, persuasive, or factually correct.
88
+
89
+ ## Stable interfaces
90
+
91
+ - Current report: [`pptlint-report/v2`](schema/pptlint-report-v2.schema.json)
92
+ - Previous report: [`decklint-report/v1`](schema/decklint-report-v1.schema.json)
93
+ - Comparison format: [`decklint-comparison/v1`](schema/decklint-comparison-v1.schema.json)
94
+ - Exit code `0`: completed; `1`: changes required; `2`: file or runtime error.
95
+
96
+ The previous `decklint` command remains available through v0.4. Existing v1 reports can still be compared.
97
+
98
+ ## Development
99
+
100
+ ```bash
101
+ uv venv --python 3.13
102
+ uv pip install -e '.[dev]'
103
+ PYTHONPATH=src .venv/bin/python -m pytest
104
+ .venv/bin/ruff check src tests tools
105
+ ```
106
+
107
+ PPTLint is local, read-only, model-free, telemetry-free, and MIT licensed.