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.
- pptlint-0.3.1/.github/ISSUE_TEMPLATE/bug.yml +31 -0
- pptlint-0.3.1/.github/ISSUE_TEMPLATE/challenge-check.yml +30 -0
- pptlint-0.3.1/.github/ISSUE_TEMPLATE/false-positive.yml +32 -0
- pptlint-0.3.1/.github/ISSUE_TEMPLATE/integrate-generator.yml +29 -0
- pptlint-0.3.1/.github/ISSUE_TEMPLATE/submit-sample.yml +29 -0
- pptlint-0.3.1/.github/workflows/ci.yml +88 -0
- pptlint-0.3.1/.github/workflows/pages.yml +30 -0
- pptlint-0.3.1/.github/workflows/publish-pypi.yml +39 -0
- pptlint-0.3.1/.gitignore +12 -0
- pptlint-0.3.1/CHANGELOG.md +33 -0
- pptlint-0.3.1/CONTRIBUTING.md +11 -0
- pptlint-0.3.1/LICENSE +21 -0
- pptlint-0.3.1/PKG-INFO +139 -0
- pptlint-0.3.1/README.md +107 -0
- pptlint-0.3.1/README.zh-CN.md +94 -0
- pptlint-0.3.1/ROADMAP.md +30 -0
- pptlint-0.3.1/SECURITY.md +7 -0
- pptlint-0.3.1/SKILL.md +51 -0
- pptlint-0.3.1/THIRD_PARTY_NOTICES.md +9 -0
- pptlint-0.3.1/action.yml +92 -0
- pptlint-0.3.1/assets/decklint-demo.gif +0 -0
- pptlint-0.3.1/assets/pptlint-demo.gif +0 -0
- pptlint-0.3.1/benchmark/README.md +32 -0
- pptlint-0.3.1/benchmark/benchmark.json +47 -0
- pptlint-0.3.1/benchmark/run-manifest-v1.schema.json +56 -0
- pptlint-0.3.1/benchmark/run-plan.json +410 -0
- pptlint-0.3.1/benchmark/tasks/launch-cn/brand.json +8 -0
- pptlint-0.3.1/benchmark/tasks/launch-cn/brief.md +5 -0
- pptlint-0.3.1/benchmark/tasks/qbr-cn/brief.md +5 -0
- pptlint-0.3.1/benchmark/tasks/qbr-cn/metrics.csv +10 -0
- pptlint-0.3.1/benchmark/tasks/technical-en/source.md +5 -0
- pptlint-0.3.1/docs/agent-repair-loop.md +50 -0
- pptlint-0.3.1/docs/migration-from-decklint.md +33 -0
- pptlint-0.3.1/docs/publishing.md +20 -0
- pptlint-0.3.1/docs/superpowers/plans/2026-07-11-v02-proof-loop.md +879 -0
- pptlint-0.3.1/docs/superpowers/specs/2026-07-11-v02-proof-loop-design.md +266 -0
- pptlint-0.3.1/examples/bad-deck.pptx +0 -0
- pptlint-0.3.1/examples/good-deck.pptx +0 -0
- pptlint-0.3.1/examples/proof-loop/README.md +27 -0
- pptlint-0.3.1/examples/proof-loop/after.pptx +0 -0
- pptlint-0.3.1/examples/proof-loop/before.pptx +0 -0
- pptlint-0.3.1/examples/reports/bad-deck.html +24 -0
- pptlint-0.3.1/examples/reports/bad-deck.json +318 -0
- pptlint-0.3.1/examples/reports/good-deck.html +24 -0
- pptlint-0.3.1/examples/reports/good-deck.json +81 -0
- pptlint-0.3.1/pyproject.toml +58 -0
- pptlint-0.3.1/schema/decklint-comparison-v1.schema.json +174 -0
- pptlint-0.3.1/schema/decklint-report-v1.schema.json +175 -0
- pptlint-0.3.1/schema/pptlint-report-v2.schema.json +177 -0
- pptlint-0.3.1/site/benchmark/index.html +30 -0
- pptlint-0.3.1/site/index.html +52 -0
- pptlint-0.3.1/site/proof-loop/after.html +24 -0
- pptlint-0.3.1/site/proof-loop/after.json +930 -0
- pptlint-0.3.1/site/proof-loop/after.pptx +0 -0
- pptlint-0.3.1/site/proof-loop/before.html +24 -0
- pptlint-0.3.1/site/proof-loop/before.json +4375 -0
- pptlint-0.3.1/site/proof-loop/before.pptx +0 -0
- pptlint-0.3.1/site/proof-loop/comparison.html +20 -0
- pptlint-0.3.1/site/proof-loop/comparison.json +2662 -0
- pptlint-0.3.1/site/proof-loop/deck-montage.png +0 -0
- pptlint-0.3.1/src/decklint/__init__.py +3 -0
- pptlint-0.3.1/src/decklint/__main__.py +4 -0
- pptlint-0.3.1/src/decklint/cli.py +140 -0
- pptlint-0.3.1/src/decklint/comparison.py +191 -0
- pptlint-0.3.1/src/decklint/comparison_report.py +218 -0
- pptlint-0.3.1/src/decklint/compat.py +13 -0
- pptlint-0.3.1/src/decklint/model.py +613 -0
- pptlint-0.3.1/src/decklint/readiness.py +149 -0
- pptlint-0.3.1/src/decklint/render.py +182 -0
- pptlint-0.3.1/src/decklint/report.py +251 -0
- pptlint-0.3.1/src/decklint/rules.py +500 -0
- pptlint-0.3.1/src/decklint/schema.py +82 -0
- pptlint-0.3.1/src/decklint/scoring.py +105 -0
- pptlint-0.3.1/src/pptlint/__init__.py +5 -0
- pptlint-0.3.1/src/pptlint/__main__.py +4 -0
- pptlint-0.3.1/src/pptlint/benchmark.py +120 -0
- pptlint-0.3.1/src/pptlint/cli.py +1 -0
- pptlint-0.3.1/src/pptlint/comparison.py +1 -0
- pptlint-0.3.1/src/pptlint/comparison_report.py +1 -0
- pptlint-0.3.1/src/pptlint/model.py +1 -0
- pptlint-0.3.1/src/pptlint/readiness.py +1 -0
- pptlint-0.3.1/src/pptlint/render.py +1 -0
- pptlint-0.3.1/src/pptlint/report.py +1 -0
- pptlint-0.3.1/src/pptlint/rules.py +1 -0
- pptlint-0.3.1/src/pptlint/schema.py +1 -0
- pptlint-0.3.1/src/pptlint/scoring.py +1 -0
- pptlint-0.3.1/tests/__init__.py +1 -0
- pptlint-0.3.1/tests/fixtures/corpus/aspect-01.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/aspect-02.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/aspect-03.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/aspect-04.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/aspect-05.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/blank-01.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/blank-02.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/blank-03.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/blank-04.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/blank-05.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/clean-01.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/clean-02.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/clean-03.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/clean-04.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/clean-05.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/clean-06.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/clean-07.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/clean-08.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/clean-09.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/clean-10.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/clean-11.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/clean-12.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/clean-13.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/clean-14.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/clean-15.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/clean-16.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/clean-17.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/clean-18.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/clean-19.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/clean-20.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/clipping-01.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/clipping-02.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/clipping-03.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/clipping-04.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/clipping-05.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/comments-01.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/comments-02.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/comments-03.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/comments-04.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/comments-05.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/flattened-01.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/flattened-02.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/flattened-03.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/flattened-04.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/flattened-05.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/flattened-06.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/flattened-07.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/flattened-08.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/flattened-09.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/flattened-10.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/hidden-01.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/hidden-02.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/hidden-03.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/hidden-04.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/hidden-05.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/low-contrast-01.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/low-contrast-02.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/low-contrast-03.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/low-contrast-04.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/low-contrast-05.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/manifest.json +505 -0
- pptlint-0.3.1/tests/fixtures/corpus/missing-content-type-01.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/missing-content-type-02.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/missing-content-type-03.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/missing-content-type-04.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/missing-content-type-05.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/off-canvas-01.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/off-canvas-02.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/off-canvas-03.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/off-canvas-04.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/off-canvas-05.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/overlap-01.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/overlap-02.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/overlap-03.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/overlap-04.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/overlap-05.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/privacy-01.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/privacy-02.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/privacy-03.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/privacy-04.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/privacy-05.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/repeated-layout-01.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/repeated-layout-02.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/repeated-layout-03.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/repeated-layout-04.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/repeated-layout-05.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/small-font-01.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/small-font-02.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/small-font-03.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/small-font-04.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/small-font-05.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/small-font-06.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/small-font-07.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/small-font-08.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/small-font-09.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/small-font-10.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/untitled-01.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/untitled-02.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/untitled-03.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/untitled-04.pptx +0 -0
- pptlint-0.3.1/tests/fixtures/corpus/untitled-05.pptx +0 -0
- pptlint-0.3.1/tests/pptx_factory.py +167 -0
- pptlint-0.3.1/tests/report_factory.py +47 -0
- pptlint-0.3.1/tests/test_ai_generated_titles.py +94 -0
- pptlint-0.3.1/tests/test_benchmark.py +149 -0
- pptlint-0.3.1/tests/test_cli.py +157 -0
- pptlint-0.3.1/tests/test_comparison.py +114 -0
- pptlint-0.3.1/tests/test_comparison_report.py +45 -0
- pptlint-0.3.1/tests/test_malformed_inputs.py +97 -0
- pptlint-0.3.1/tests/test_model_and_scoring.py +212 -0
- pptlint-0.3.1/tests/test_pptlint_v2_contract.py +111 -0
- pptlint-0.3.1/tests/test_public_contract.py +235 -0
- pptlint-0.3.1/tests/test_real_office_integration.py +93 -0
- pptlint-0.3.1/tests/test_render_and_report.py +167 -0
- pptlint-0.3.1/tests/test_rules.py +205 -0
- pptlint-0.3.1/tools/benchmark.py +113 -0
- pptlint-0.3.1/tools/generate_examples.py +90 -0
- 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
|
pptlint-0.3.1/.gitignore
ADDED
|
@@ -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
|
+
[](https://github.com/kdnsna/pptlint/actions/workflows/ci.yml)
|
|
40
|
+
[](https://kdnsna.github.io/pptlint/)
|
|
41
|
+
[](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.
|
pptlint-0.3.1/README.md
ADDED
|
@@ -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
|
+
[](https://github.com/kdnsna/pptlint/actions/workflows/ci.yml)
|
|
8
|
+
[](https://kdnsna.github.io/pptlint/)
|
|
9
|
+
[](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.
|