@litfamily/lithermes 1.0.8 → 1.0.9
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.
- package/README.md +299 -13
- package/README_Ko-KR.md +300 -14
- package/assets/lithermes-plugin/README.md +17 -6
- package/assets/lithermes-plugin/__init__.py +96 -21
- package/assets/lithermes-plugin/core.py +15 -6
- package/assets/lithermes-plugin/core_commands.py +140 -28
- package/assets/lithermes-plugin/core_contexts.py +88 -15
- package/assets/lithermes-plugin/core_contract.py +118 -9
- package/assets/lithermes-plugin/core_routing.py +197 -8
- package/assets/lithermes-plugin/deliverable_hedge_guard.py +378 -357
- package/assets/lithermes-plugin/diagnostics.py +53 -2
- package/assets/lithermes-plugin/humanizer_detector.py +348 -0
- package/assets/lithermes-plugin/humanizer_ko_metrics.py +108 -0
- package/assets/lithermes-plugin/humanizer_office.py +18 -0
- package/assets/lithermes-plugin/lit_mark.py +1 -1
- package/assets/lithermes-plugin/motion_receipts.py +80 -0
- package/assets/lithermes-plugin/payload-version.json +2240 -64
- package/assets/lithermes-plugin/plugin.yaml +1 -1
- package/assets/lithermes-plugin/rules/bundled-rules/lit-humanizer.md +14 -0
- package/assets/lithermes-plugin/skills/autoconference/assets/report_template.md +2 -1
- package/assets/lithermes-plugin/skills/autoconference/modes/ship/SKILL.md +11 -8
- package/assets/lithermes-plugin/skills/autoresearch/modes/ship/type-checklists.md +2 -2
- package/assets/lithermes-plugin/skills/browser-drive/ORIGIN.json +17 -0
- package/assets/lithermes-plugin/skills/browser-drive/SKILL.md +41 -16
- package/assets/lithermes-plugin/skills/browser-drive/scripts/capability_probe.py +122 -10
- package/assets/lithermes-plugin/skills/frontend-ui-ux/SKILL.md +45 -13
- package/assets/lithermes-plugin/skills/frontend-ui-ux/examples/phase-3-readme-ab/README.md +51 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/README.md +44 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/adaptive-layout.md +34 -62
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/brand-and-imagery.md +22 -70
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/complete-contract.md +18 -4
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/composition.md +27 -78
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/craft-floor.md +74 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/creative-directions.md +25 -69
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/evidence-review.md +18 -97
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/implementation-platforms.md +23 -83
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/inclusive-interface.md +22 -70
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/interaction-motion.md +34 -68
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/motion-guide.md +62 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/operating-lanes.md +14 -78
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/performance-delivery.md +22 -71
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/product-direction.md +17 -70
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/production.md +19 -7
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/redesign-playbook.md +23 -76
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/slop-register.md +69 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/system-foundations.md +22 -67
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/visual-language.md +16 -72
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/visual-reconstruction.md +16 -81
- package/assets/lithermes-plugin/skills/frontend-ui-ux/resources/THIRD-PARTY-NOTICE.txt +15 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/scripts/probe-page.js +311 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/scripts/probe-rules.json +46 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/scripts/probe.mjs +231 -0
- package/assets/lithermes-plugin/skills/lit-comprehend/SKILL.md +36 -25
- package/assets/lithermes-plugin/skills/lit-comprehend/references/artifact-template.md +45 -87
- package/assets/lithermes-plugin/skills/lit-comprehend/scripts/verify-explainer.py +3 -27
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/NOTICE +33 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/SKILL.md +308 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-architecture-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-architecture-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-architecture-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-bar-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-bar-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-bar-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-beeswarm-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-beeswarm-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-beeswarm-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-bubble-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-bubble-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-bubble-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-bump-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-bump-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-bump-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-data-flow-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-data-flow-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-data-flow-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-datalake-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-datalake-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-datalake-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-db-schema-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-db-schema-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-db-schema-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-dependency-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-dependency-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-dependency-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-deployment-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-deployment-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-deployment-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-dp-integration-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-dp-integration-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-dp-integration-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-dp-security-matrix-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-dp-security-matrix-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-dp-security-matrix-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-er-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-er-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-er-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-fishbone-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-fishbone-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-fishbone-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-flowchart-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-flowchart-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-flowchart-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-gantt-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-gantt-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-gantt-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-heatmap-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-heatmap-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-heatmap-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-high-level-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-high-level-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-high-level-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-high-level-vertical-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-high-level-vertical-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-high-level-vertical-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-import-drawio-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-import-drawio-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-import-drawio-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-import-excalidraw-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-import-excalidraw-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-import-excalidraw-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-import-mermaid-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-import-mermaid-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-import-mermaid-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-it-state-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-it-state-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-it-state-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-journey-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-journey-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-journey-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-kanban-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-kanban-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-kanban-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-layers-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-layers-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-layers-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-line-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-line-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-line-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-loop-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-loop-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-loop-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-loop-terminal-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-loop-terminal-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-loop-terminal-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-marimekko-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-marimekko-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-marimekko-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-medallion-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-medallion-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-medallion-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-nested-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-nested-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-nested-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-org-chart-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-org-chart-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-org-chart-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-paved-road-animated-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-paved-road-animated-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-paved-road-animated-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-polar-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-polar-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-polar-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-policy-trace-animated-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-policy-trace-animated-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-policy-trace-animated-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-process-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-process-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-process-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-pyramid-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-pyramid-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-pyramid-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-quadrant-consultant-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-quadrant-consultant-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-quadrant-consultant-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-quadrant-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-quadrant-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-quadrant-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-queue-animated-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-queue-animated-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-queue-animated-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-radar-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-radar-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-radar-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-ridgeline-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-ridgeline-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-ridgeline-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-sankey-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-sankey-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-sankey-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-scatter-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-scatter-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-scatter-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-sequence-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-sequence-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-sequence-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-sequence-oauth-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-sequence-oauth-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-sequence-oauth-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-slopegraph-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-slopegraph-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-slopegraph-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-state-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-state-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-state-lifecycle-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-state-lifecycle-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-state-lifecycle-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-state-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-story-map-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-story-map-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-story-map-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-streamgraph-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-streamgraph-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-streamgraph-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-swimlane-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-swimlane-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-swimlane-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-timeline-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-timeline-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-timeline-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-tree-block-decomposition-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-tree-block-decomposition-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-tree-block-decomposition-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-tree-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-tree-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-tree-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-treemap-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-treemap-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-treemap-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-uml-class-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-uml-class-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-uml-class-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-venn-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-venn-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-venn-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-wardley-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-wardley-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-wardley-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-waterfall-dark.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-waterfall-full.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-waterfall-light.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/fonts/OFL.txt +94 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/fonts/PretendardVariable.woff2 +0 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/fonts/provenance.json +22 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/icons.html +231 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/index.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/licenses/devicon-MIT.txt +20 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/licenses/diagram-design-MIT.txt +21 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/licenses/log-z-MIT.txt +21 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/licenses/simple-icons-CC0.md +30 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/licenses/tabler-MIT.txt +21 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/examples/01-service-architecture/after.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/examples/01-service-architecture/brief.md +33 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/examples/02-release-decision/after.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/examples/02-release-decision/brief.md +18 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/examples/03-data-retention/after.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/examples/03-data-retention/brief.md +19 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/examples/04-oauth-sequence/after.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/examples/04-oauth-sequence/brief.md +17 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/examples/05-review-lanes/after.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/examples/05-review-lanes/brief.md +17 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/examples/06-rollout-gates/after.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/examples/06-rollout-gates/brief.md +17 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/examples/07-deployment-boundary/after.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/examples/07-deployment-boundary/brief.md +19 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/examples/08-policy-traces/after.html +1 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/examples/08-policy-traces/brief.md +20 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/accessibility.md +37 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/export.md +29 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/import-drawio.md +21 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/import-excalidraw.md +14 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/import-mermaid.md +18 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/import-schema.md +28 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/korean-typography.md +34 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/motion.md +29 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/office-pptx-docx.md +40 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/output-spec.md +48 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/primitive-annotation.md +12 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/primitive-icons.md +21 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/primitive-sketchy.md +11 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/primitive-terminal.md +11 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/profiles.md +24 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/semantic-patterns.md +27 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/style-guide.md +67 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-architecture.md +51 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-bar.md +51 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-beeswarm.md +49 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-bubble.md +49 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-bump.md +49 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-catalog.json +1433 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-data-flow.md +51 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-datalake.md +49 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-db-schema.md +49 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-dependency.md +49 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-deployment.md +49 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-dp-integration.md +49 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-dp-security-matrix.md +49 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-er.md +49 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-fishbone.md +49 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-flowchart.md +49 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-gantt.md +49 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-heatmap.md +53 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-high-level-vertical.md +53 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-high-level.md +53 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-import-drawio.md +53 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-import-excalidraw.md +53 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-import-mermaid.md +53 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-it-state.md +54 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-journey.md +54 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-kanban.md +54 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-layers.md +54 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-line.md +54 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-loop-terminal.md +53 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-loop.md +54 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-marimekko.md +54 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-medallion.md +54 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-nested.md +59 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-org-chart.md +58 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-paved-road-animated.md +72 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-polar.md +67 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-policy-trace-animated.md +69 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-process.md +58 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-pyramid.md +59 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-quadrant-consultant.md +60 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-quadrant.md +57 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-queue-animated.md +63 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-radar.md +57 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-ridgeline.md +63 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-sankey.md +68 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-scatter.md +60 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-sequence-oauth.md +66 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-sequence.md +63 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-slopegraph.md +65 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-state-lifecycle.md +53 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-state.md +59 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-story-map.md +52 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-streamgraph.md +53 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-swimlane.md +52 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-timeline.md +52 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-tree-block-decomposition.md +57 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-tree.md +54 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-treemap.md +54 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-uml-class.md +52 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-venn.md +51 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-wardley.md +52 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-waterfall.md +54 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/verifier-guide.md +31 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/block-registry.mjs +43 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/browser-version.mjs +12 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/check-visible-text.py +12 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/diagram_brief.py +192 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/diagram_catalog.py +135 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/diagram_checks.py +123 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/diagram_cli.py +94 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/diagram_geometry.py +130 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/diagram_metrics.py +166 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/diagram_quality.py +293 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/diagram_quality_geometry.py +200 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/diagram_records.py +205 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/diagram_sequence.py +55 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/doctor.mjs +24 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/drawio_extract.py +209 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/drawio_source.py +188 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/excalidraw_extract.py +233 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/excalidraw_support.py +64 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/export.mjs +125 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/mermaid_extract.py +240 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/mermaid_source.py +39 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/office-safety.mjs +54 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/verify-all.py +12 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/verify-brief.py +12 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/verify-diagram.py +12 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/verify-motion.py +12 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/verify-type.py +12 -0
- package/assets/lithermes-plugin/skills/lit-docx/NOTICE +1 -0
- package/assets/lithermes-plugin/skills/lit-docx/SKILL.md +97 -0
- package/assets/lithermes-plugin/skills/lit-docx/references/frontmatter_schema.md +42 -0
- package/assets/lithermes-plugin/skills/lit-docx/references/journal_style_spec.md +17 -0
- package/assets/lithermes-plugin/skills/lit-docx/references/markdown_quality_checklist.md +37 -0
- package/assets/lithermes-plugin/skills/lit-docx/references/slop_phrase_list.yaml +58 -0
- package/assets/lithermes-plugin/skills/lit-docx/references/slop_rules.md +35 -0
- package/assets/lithermes-plugin/skills/lit-docx/scripts/clean_markdown.py +95 -0
- package/assets/lithermes-plugin/skills/lit-docx/scripts/convert_md_to_docx.py +1041 -0
- package/assets/lithermes-plugin/skills/lit-docx/scripts/convert_md_to_pdf.py +281 -0
- package/assets/lithermes-plugin/skills/lit-docx/scripts/convert_pdf.py +130 -0
- package/assets/lithermes-plugin/skills/lit-docx/scripts/edit_docx.py +297 -0
- package/assets/lithermes-plugin/skills/lit-docx/scripts/embed_images.py +78 -0
- package/assets/lithermes-plugin/skills/lit-docx/scripts/generate_docx_templates.py +491 -0
- package/assets/lithermes-plugin/skills/lit-docx/scripts/slop_lint.py +536 -0
- package/assets/lithermes-plugin/skills/lit-docx/scripts/visual_audit.py +41 -0
- package/assets/lithermes-plugin/skills/lit-docx/templates/docx/acs.docx +0 -0
- package/assets/lithermes-plugin/skills/lit-docx/templates/docx/elsevier.docx +0 -0
- package/assets/lithermes-plugin/skills/lit-docx/templates/docx/ieee.docx +0 -0
- package/assets/lithermes-plugin/skills/lit-docx/templates/docx/korean-generic.docx +0 -0
- package/assets/lithermes-plugin/skills/lit-docx/templates/docx/nature.docx +0 -0
- package/assets/lithermes-plugin/skills/lit-docx/templates/latex/acs/README.md +5 -0
- package/assets/lithermes-plugin/skills/lit-docx/templates/latex/acs/template.tex +37 -0
- package/assets/lithermes-plugin/skills/lit-docx/templates/latex/elsevier/README.md +5 -0
- package/assets/lithermes-plugin/skills/lit-docx/templates/latex/elsevier/template.tex +38 -0
- package/assets/lithermes-plugin/skills/lit-docx/templates/latex/ieee/README.md +5 -0
- package/assets/lithermes-plugin/skills/lit-docx/templates/latex/ieee/template.tex +37 -0
- package/assets/lithermes-plugin/skills/lit-docx/templates/latex/korean-generic/README.md +5 -0
- package/assets/lithermes-plugin/skills/lit-docx/templates/latex/korean-generic/template.tex +37 -0
- package/assets/lithermes-plugin/skills/lit-docx/templates/latex/nature/README.md +5 -0
- package/assets/lithermes-plugin/skills/lit-docx/templates/latex/nature/template.tex +37 -0
- package/assets/lithermes-plugin/skills/lit-docx/templates/registry.yaml +1366 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/NOTICE +170 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/SKILL.md +125 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/assets/report-skeleton.md +26 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/assets/slide-text-skeleton.md +30 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/accessibility-note/after.md +7 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/accessibility-note/before.md +7 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/api-reference/after.md +9 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/api-reference/before.md +15 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/changelog/after.md +5 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/changelog/before.md +12 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/code-comments/after.md +10 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/code-comments/before.md +19 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/commit/after.md +5 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/commit/before.md +7 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/data-release/after.md +7 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/data-release/before.md +9 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/detector-validation/ko-metrics-golden.json +49 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/detector-validation/pos-real.txt +26 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/detector-validation/rule-cases.json +306 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/english-essay/after.md +5 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/english-essay/before.md +5 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/incident-update/after.md +7 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/incident-update/before.md +7 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/ko-essay/after.md +7 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/ko-essay/before.md +9 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/ko-report/after.md +9 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/ko-report/before.md +13 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/ko-slide/after.md +19 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/ko-slide/before.md +21 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/meeting-brief/after.md +9 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/meeting-brief/before.md +11 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/policy-faq/after.md +9 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/policy-faq/before.md +9 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/pr/after.md +15 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/pr/before.md +17 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/project-update/after.md +7 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/project-update/before.md +9 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/readme/after.md +12 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/readme/before.md +14 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/report/after.md +13 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/report/before.md +11 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/research-abstract/after.md +5 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/research-abstract/before.md +5 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/slides/after.md +19 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/slides/before.md +19 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/troubleshooting/after.md +11 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/examples/troubleshooting/before.md +11 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/references/README.md +16 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/references/always-on-rule.md +9 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/references/code-patterns.md +468 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/references/deliverable-channels.md +111 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/references/en-patterns-checklist.md +43 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/references/en-patterns-content.md +243 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/references/en-patterns-structure.md +375 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/references/en-patterns.md +57 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/references/ko-metrics.md +33 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/references/ko-patterns-a-d.md +659 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/references/ko-patterns-e-j.md +387 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/references/ko-patterns.md +31 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/references/rewrite-playbook.md +54 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/references/taxonomy.md +153 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/rules.json +884 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/scripts/detect.py +17 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/scripts/extract_office_text.py +114 -0
- package/assets/lithermes-plugin/skills/lit-humanizer/scripts/ko_metrics.py +35 -0
- package/assets/lithermes-plugin/skills/lit-pptx/NOTICE +1 -0
- package/assets/lithermes-plugin/skills/lit-pptx/SKILL.md +109 -0
- package/assets/lithermes-plugin/skills/lit-pptx/agents/analyst.md +49 -0
- package/assets/lithermes-plugin/skills/lit-pptx/agents/antithesis.md +65 -0
- package/assets/lithermes-plugin/skills/lit-pptx/agents/architect.md +44 -0
- package/assets/lithermes-plugin/skills/lit-pptx/agents/critic.md +42 -0
- package/assets/lithermes-plugin/skills/lit-pptx/agents/synthesizer.md +47 -0
- package/assets/lithermes-plugin/skills/lit-pptx/agents/thesis.md +33 -0
- package/assets/lithermes-plugin/skills/lit-pptx/assets/azure/circle-lg.png +0 -0
- package/assets/lithermes-plugin/skills/lit-pptx/assets/azure/circle-md.png +0 -0
- package/assets/lithermes-plugin/skills/lit-pptx/assets/azure/circle-sm.png +0 -0
- package/assets/lithermes-plugin/skills/lit-pptx/bin/office.mjs +77 -0
- package/assets/lithermes-plugin/skills/lit-pptx/fonts/PRETENDARD-OFL.txt +94 -0
- package/assets/lithermes-plugin/skills/lit-pptx/fonts/a2z-font/A2Z-Black.otf +0 -0
- package/assets/lithermes-plugin/skills/lit-pptx/fonts/a2z-font/A2Z-Bold.otf +0 -0
- package/assets/lithermes-plugin/skills/lit-pptx/fonts/a2z-font/A2Z-ExtraBold.otf +0 -0
- package/assets/lithermes-plugin/skills/lit-pptx/fonts/a2z-font/A2Z-ExtraLight.otf +0 -0
- package/assets/lithermes-plugin/skills/lit-pptx/fonts/a2z-font/A2Z-Light.otf +0 -0
- package/assets/lithermes-plugin/skills/lit-pptx/fonts/a2z-font/A2Z-Medium.otf +0 -0
- package/assets/lithermes-plugin/skills/lit-pptx/fonts/a2z-font/A2Z-Regular.otf +0 -0
- package/assets/lithermes-plugin/skills/lit-pptx/fonts/a2z-font/A2Z-SemiBold.otf +0 -0
- package/assets/lithermes-plugin/skills/lit-pptx/fonts/a2z-font/A2Z-Thin.otf +0 -0
- package/assets/lithermes-plugin/skills/lit-pptx/fonts/a2z-font/OFL.txt +94 -0
- package/assets/lithermes-plugin/skills/lit-pptx/fonts/a2z-font/SOURCE.md +29 -0
- package/assets/lithermes-plugin/skills/lit-pptx/pretendard-font/public/static/PretendardGOV-Bold.otf +0 -0
- package/assets/lithermes-plugin/skills/lit-pptx/pretendard-font/public/static/PretendardGOV-Regular.otf +0 -0
- package/assets/lithermes-plugin/skills/lit-pptx/references/anti-slop-checklist.md +71 -0
- package/assets/lithermes-plugin/skills/lit-pptx/references/authoring-guide.md +139 -0
- package/assets/lithermes-plugin/skills/lit-pptx/references/consensus-protocol.md +125 -0
- package/assets/lithermes-plugin/skills/lit-pptx/references/data-display-cookbook.md +45 -0
- package/assets/lithermes-plugin/skills/lit-pptx/references/design-system-azure.md +58 -0
- package/assets/lithermes-plugin/skills/lit-pptx/runtime/package-lock.json +750 -0
- package/assets/lithermes-plugin/skills/lit-pptx/runtime/package.json +15 -0
- package/assets/lithermes-plugin/skills/lit-pptx/runtime/requirements.in +7 -0
- package/assets/lithermes-plugin/skills/lit-pptx/runtime/requirements.lock +391 -0
- package/assets/lithermes-plugin/skills/lit-pptx/scripts/compile-deck.js +447 -0
- package/assets/lithermes-plugin/skills/lit-pptx/scripts/craft_extras.py +215 -0
- package/assets/lithermes-plugin/skills/lit-pptx/scripts/embed_fonts.py +199 -0
- package/assets/lithermes-plugin/skills/lit-pptx/scripts/integrity.py +60 -0
- package/assets/lithermes-plugin/skills/lit-pptx/scripts/inventory.py +64 -0
- package/assets/lithermes-plugin/skills/lit-pptx/scripts/learn_template.py +433 -0
- package/assets/lithermes-plugin/skills/lit-pptx/scripts/lib/derive-palette.js +176 -0
- package/assets/lithermes-plugin/skills/lit-pptx/scripts/lib/directive-parser.js +244 -0
- package/assets/lithermes-plugin/skills/lit-pptx/scripts/lib/font-map.js +79 -0
- package/assets/lithermes-plugin/skills/lit-pptx/scripts/lib/gen-bg.js +85 -0
- package/assets/lithermes-plugin/skills/lit-pptx/scripts/lib/gen-gradient-assets.js +36 -0
- package/assets/lithermes-plugin/skills/lit-pptx/scripts/lib/layout-resolver.js +736 -0
- package/assets/lithermes-plugin/skills/lit-pptx/scripts/lib/markdown-loader.js +136 -0
- package/assets/lithermes-plugin/skills/lit-pptx/scripts/lib/render-adapter-html.js +357 -0
- package/assets/lithermes-plugin/skills/lit-pptx/scripts/lib/render-adapter-pptx.js +1864 -0
- package/assets/lithermes-plugin/skills/lit-pptx/scripts/lib/slide-ast.js +539 -0
- package/assets/lithermes-plugin/skills/lit-pptx/scripts/lib/spec-validator.js +94 -0
- package/assets/lithermes-plugin/skills/lit-pptx/scripts/lib/template-registry.js +355 -0
- package/assets/lithermes-plugin/skills/lit-pptx/scripts/qa_deck.py +791 -0
- package/assets/lithermes-plugin/skills/lit-pptx/scripts/validate_pptx.py +206 -0
- package/assets/lithermes-plugin/skills/lit-pptx/slide-formats/markdown-slide-spec-v1.md +251 -0
- package/assets/lithermes-plugin/skills/lit-pptx/slide-formats/markdown-slide-spec-v2.md +221 -0
- package/assets/lithermes-plugin/skills/lit-pptx/slide-formats/slide-ast-v1.schema.json +229 -0
- package/assets/lithermes-plugin/skills/lit-pptx/slide-formats/slide-ast-v2.schema.json +144 -0
- package/assets/lithermes-plugin/skills/lit-pptx/slide-formats/template-enrollment-contract.md +228 -0
- package/assets/lithermes-plugin/skills/lit-pptx/templates/enrolled/AZURE-A2Z/capabilities.yaml +146 -0
- package/assets/lithermes-plugin/skills/lit-pptx/templates/enrolled/AZURE-A2Z/layout-mapping.yaml +384 -0
- package/assets/lithermes-plugin/skills/lit-pptx/templates/enrolled/AZURE-A2Z/template.yaml +37 -0
- package/assets/lithermes-plugin/skills/lit-pptx/templates/enrolled/AZURE-PRO/capabilities.yaml +154 -0
- package/assets/lithermes-plugin/skills/lit-pptx/templates/enrolled/AZURE-PRO/layout-mapping.yaml +405 -0
- package/assets/lithermes-plugin/skills/lit-pptx/templates/enrolled/AZURE-PRO/template.yaml +37 -0
- package/assets/lithermes-plugin/skills/lit-pptx/templates/enrolled/BOILERPLATE-A2Z/capabilities.yaml +179 -0
- package/assets/lithermes-plugin/skills/lit-pptx/templates/enrolled/BOILERPLATE-A2Z/layout-mapping.yaml +299 -0
- package/assets/lithermes-plugin/skills/lit-pptx/templates/enrolled/BOILERPLATE-A2Z/template.yaml +45 -0
- package/assets/lithermes-plugin/skills/lit-pptx/templates/enrolled/BOILERPLATE-PRETENDARD/capabilities.yaml +181 -0
- package/assets/lithermes-plugin/skills/lit-pptx/templates/enrolled/BOILERPLATE-PRETENDARD/layout-mapping.yaml +299 -0
- package/assets/lithermes-plugin/skills/lit-pptx/templates/enrolled/BOILERPLATE-PRETENDARD/template.yaml +44 -0
- package/assets/lithermes-plugin/skills/lit-scientific-visualization/SKILL.md +2 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/SKILL.md +71 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/bin/audio.py +45 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/bin/motion.mjs +690 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/bin/runtime.mjs +299 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/NOTICE +23 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/THIRD_PARTY_NOTICES +55 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/browser.mjs +169 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/completion.mjs +52 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/constants.mjs +162 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/director.mjs +33 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/encode.mjs +191 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/flash.mjs +163 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/frame.mjs +428 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/gate.mjs +483 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/look.mjs +223 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/page.js +622 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/presets.mjs +170 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/scenes.mjs +242 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/sound.mjs +382 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/stage-gate.mjs +97 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/stage-init.js +186 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/stage-kit.js +389 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/stage-qa.mjs +358 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/stage-worker.mjs +33 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/stage.mjs +691 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/stills.mjs +71 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/stroke.mjs +231 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/timeline.mjs +177 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/treatment.mjs +244 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/type.mjs +183 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/util.mjs +152 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/references/craft-loop.md +175 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/references/engine-contract.md +166 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/references/runtime.md +122 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/references/stage.md +261 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/references/style-bibles.md +122 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/references/treatment.md +164 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/references/type-craft.md +92 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/runtime/fonts.json +154 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/runtime/licenses/CREDITS +20 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/runtime/licenses/EMS-OFL.txt +91 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/runtime/package-lock.json +88 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/runtime/package.json +12 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/runtime/requirements.in +1 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/runtime/requirements.lock +727 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/runtime/word-timing.json +9 -0
- package/assets/lithermes-plugin/skills/litresearch/SKILL.md +19 -18
- package/assets/lithermes-plugin/skills/litwork/SKILL.md +28 -0
- package/assets/lithermes-plugin/skills/visual-qa/references/complete-contract.md +3 -3
- package/package.json +1 -1
- package/readme-assets/ab-simple/s11-ui-baseline-desktop.webp +0 -0
- package/readme-assets/ab-simple/s11-ui-lithermes-desktop.webp +0 -0
- package/readme-assets/ab-simple/s3-ui-baseline-desktop.webp +0 -0
- package/readme-assets/ab-simple/s3-ui-lithermes-desktop.webp +0 -0
- package/readme-assets/ab-simple/s4-ui-baseline-desktop.webp +0 -0
- package/readme-assets/ab-simple/s4-ui-lithermes-desktop.webp +0 -0
- package/readme-assets/ab-simple/s5-office-baseline-slides.webp +0 -0
- package/readme-assets/ab-simple/s5-office-lithermes-slides.webp +0 -0
- package/readme-assets/ab-simple/s7-lithermes-diagram.webp +0 -0
- package/readme-assets/ab-simple/s8-office-baseline-slides.webp +0 -0
- package/readme-assets/ab-simple/s8-office-lithermes-slides.webp +0 -0
- package/readme-assets/ab-simple/s9-office-lithermes-pages.webp +0 -0
- package/readme-assets/badge-version.svg +1 -1
- package/readme-assets/cover-motion-still.webp +0 -0
- package/readme-assets/cover-motion.webp +0 -0
- package/readme-assets/skills/autoconference.webp +0 -0
- package/readme-assets/skills/autoresearch.webp +0 -0
- package/readme-assets/skills/browser-drive.webp +0 -0
- package/readme-assets/skills/comment-checker.webp +0 -0
- package/readme-assets/skills/debugging.webp +0 -0
- package/readme-assets/skills/deep-interview.webp +0 -0
- package/readme-assets/skills/frontend-ui-ux.webp +0 -0
- package/readme-assets/skills/lit-burnoff-file.webp +0 -0
- package/readme-assets/skills/lit-burnoff.webp +0 -0
- package/readme-assets/skills/lit-code.webp +0 -0
- package/readme-assets/skills/lit-commit.webp +0 -0
- package/readme-assets/skills/lit-comprehend.webp +0 -0
- package/readme-assets/skills/lit-crucible.webp +0 -0
- package/readme-assets/skills/lit-diagram-drawer.webp +0 -0
- package/readme-assets/skills/lit-docx.webp +0 -0
- package/readme-assets/skills/lit-handoff.webp +0 -0
- package/readme-assets/skills/lit-humanizer.webp +0 -0
- package/readme-assets/skills/lit-init.webp +0 -0
- package/readme-assets/skills/lit-plan.webp +0 -0
- package/readme-assets/skills/lit-pptx.webp +0 -0
- package/readme-assets/skills/lit-recap.webp +0 -0
- package/readme-assets/skills/lit-scientific-visualization.webp +0 -0
- package/readme-assets/skills/lit-typographic-motion.webp +0 -0
- package/readme-assets/skills/litgoal.webp +0 -0
- package/readme-assets/skills/litresearch.webp +0 -0
- package/readme-assets/skills/litwork.webp +0 -0
- package/readme-assets/skills/lsp-setup.webp +0 -0
- package/readme-assets/skills/lsp.webp +0 -0
- package/readme-assets/skills/readme-studio.webp +0 -0
- package/readme-assets/skills/refactor.webp +0 -0
- package/readme-assets/skills/review-work.webp +0 -0
- package/readme-assets/skills/rules.webp +0 -0
- package/readme-assets/skills/start-work.webp +0 -0
- package/readme-assets/skills/structural-search.webp +0 -0
- package/readme-assets/skills/visual-qa.webp +0 -0
- package/readme-assets/skills/wikify.webp +0 -0
- package/src/cli.js +40 -1
- package/src/lib/check.js +21 -0
- package/src/lib/install.js +262 -7
- package/src/lib/skillPayload.js +3 -3
- package/assets/lithermes-plugin/skills/lit-korean/SKILL.md +0 -237
- package/assets/lithermes-plugin/skills/lit-korean/references/quick-rules.md +0 -24
- package/assets/lithermes-plugin/skills/lit-korean/references/safety-checklist.md +0 -23
- package/readme-assets/cover.webp +0 -0
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
validate_pptx.py — lightweight anti-slop validator for PPTX outputs.
|
|
4
|
+
|
|
5
|
+
Checks deck text hygiene, title presence, placeholder/default copy, forbidden
|
|
6
|
+
terms, and coarse visual consistency signals. Prints JSON.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import json
|
|
12
|
+
import re
|
|
13
|
+
import sys
|
|
14
|
+
from collections import Counter
|
|
15
|
+
from pathlib import Path
|
|
16
|
+
from typing import Any
|
|
17
|
+
|
|
18
|
+
from pptx import Presentation
|
|
19
|
+
from pptx.dml.color import RGBColor
|
|
20
|
+
from pptx.enum.shapes import MSO_SHAPE_TYPE, PP_PLACEHOLDER
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
SKILL_DIR = Path(__file__).resolve().parent.parent # repo root (validate_pptx.py lives in scripts/)
|
|
24
|
+
FORBIDDEN_PATH = SKILL_DIR / "FORBIDDEN_TERMS.json"
|
|
25
|
+
DEFAULT_BAD_FONTS = {"Calibri", "Aptos"}
|
|
26
|
+
DEFAULT_PLACEHOLDER_TEXT = {
|
|
27
|
+
"click to add title",
|
|
28
|
+
"click to add subtitle",
|
|
29
|
+
"click to add text",
|
|
30
|
+
"title",
|
|
31
|
+
"subtitle",
|
|
32
|
+
}
|
|
33
|
+
MAX_DISTINCT_FILLS = 8
|
|
34
|
+
WEIGHTS = {
|
|
35
|
+
"missing_titles": 20,
|
|
36
|
+
"forbidden_terms": 20,
|
|
37
|
+
"default_placeholder_text": 20,
|
|
38
|
+
"default_fonts": 15,
|
|
39
|
+
"rainbow_fills": 10,
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def _load_terms() -> tuple[list[str], list[str], bool, bool]:
|
|
44
|
+
if not FORBIDDEN_PATH.exists():
|
|
45
|
+
return [], [], True, False
|
|
46
|
+
data = json.loads(FORBIDDEN_PATH.read_text())
|
|
47
|
+
return (
|
|
48
|
+
data.get("terms", []),
|
|
49
|
+
data.get("soft_terms", []),
|
|
50
|
+
bool(data.get("case_insensitive", True)),
|
|
51
|
+
bool(data.get("whole_word", False)),
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def _build_regex(terms: list[str], case_insensitive: bool, whole_word: bool) -> re.Pattern[str] | None:
|
|
56
|
+
if not terms:
|
|
57
|
+
return None
|
|
58
|
+
escaped = [re.escape(term) for term in terms]
|
|
59
|
+
pattern = "|".join(escaped)
|
|
60
|
+
if whole_word:
|
|
61
|
+
pattern = rf"(?:(?<=\W)|^)(?:{pattern})(?:(?=\W)|$)"
|
|
62
|
+
flags = re.IGNORECASE if case_insensitive else 0
|
|
63
|
+
return re.compile(pattern, flags)
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def _shape_text(shape) -> str:
|
|
67
|
+
if not getattr(shape, "has_text_frame", False):
|
|
68
|
+
return ""
|
|
69
|
+
parts: list[str] = []
|
|
70
|
+
for paragraph in shape.text_frame.paragraphs:
|
|
71
|
+
chunk = "".join(run.text for run in paragraph.runs).strip()
|
|
72
|
+
if chunk:
|
|
73
|
+
parts.append(chunk)
|
|
74
|
+
return "\n".join(parts).strip()
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def _shape_fill(shape) -> str | None:
|
|
78
|
+
fill = getattr(shape, "fill", None)
|
|
79
|
+
if fill is None or fill.type is None:
|
|
80
|
+
return None
|
|
81
|
+
try:
|
|
82
|
+
fore = getattr(fill, "fore_color", None)
|
|
83
|
+
except TypeError:
|
|
84
|
+
return None
|
|
85
|
+
rgb = getattr(fore, "rgb", None)
|
|
86
|
+
if isinstance(rgb, RGBColor):
|
|
87
|
+
return str(rgb)
|
|
88
|
+
if isinstance(rgb, str):
|
|
89
|
+
return rgb.upper()
|
|
90
|
+
return None
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def _iter_runs(slide):
|
|
94
|
+
for shape in slide.shapes:
|
|
95
|
+
if not getattr(shape, "has_text_frame", False):
|
|
96
|
+
continue
|
|
97
|
+
for paragraph in shape.text_frame.paragraphs:
|
|
98
|
+
for run in paragraph.runs:
|
|
99
|
+
yield shape, run
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def _slide_has_title(slide, slide_height: int | None) -> bool:
|
|
103
|
+
title_shape = getattr(slide.shapes, "title", None)
|
|
104
|
+
if title_shape is not None and _shape_text(title_shape):
|
|
105
|
+
return True
|
|
106
|
+
for shape in slide.shapes:
|
|
107
|
+
if not getattr(shape, "is_placeholder", False):
|
|
108
|
+
continue
|
|
109
|
+
placeholder = getattr(shape, "placeholder_format", None)
|
|
110
|
+
if placeholder and placeholder.type == PP_PLACEHOLDER.TITLE and _shape_text(shape):
|
|
111
|
+
return True
|
|
112
|
+
text_shapes = []
|
|
113
|
+
for shape in slide.shapes:
|
|
114
|
+
if not getattr(shape, "has_text_frame", False):
|
|
115
|
+
continue
|
|
116
|
+
text = _shape_text(shape)
|
|
117
|
+
if not text:
|
|
118
|
+
continue
|
|
119
|
+
text_shapes.append(shape)
|
|
120
|
+
top = getattr(shape, "top", None)
|
|
121
|
+
if slide_height is not None and top is not None and top <= slide_height * 0.22:
|
|
122
|
+
return True
|
|
123
|
+
if len(text_shapes) <= 2 and any(_shape_text(shape) for shape in text_shapes):
|
|
124
|
+
return True
|
|
125
|
+
return False
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
def lint(path: str | Path) -> dict[str, Any]:
|
|
129
|
+
prs = Presentation(str(path))
|
|
130
|
+
hard_terms, soft_terms, case_insensitive, whole_word = _load_terms()
|
|
131
|
+
hard_re = _build_regex(hard_terms, case_insensitive, whole_word)
|
|
132
|
+
soft_re = _build_regex(soft_terms, case_insensitive, whole_word)
|
|
133
|
+
|
|
134
|
+
missing_titles: list[int] = []
|
|
135
|
+
placeholder_hits: list[str] = []
|
|
136
|
+
hard_hits: list[str] = []
|
|
137
|
+
soft_hits: list[str] = []
|
|
138
|
+
default_font_hits: list[str] = []
|
|
139
|
+
fills: Counter[str] = Counter()
|
|
140
|
+
|
|
141
|
+
for slide_idx, slide in enumerate(prs.slides, start=1):
|
|
142
|
+
if not _slide_has_title(slide, prs.slide_height):
|
|
143
|
+
missing_titles.append(slide_idx)
|
|
144
|
+
|
|
145
|
+
for shape_idx, shape in enumerate(slide.shapes, start=1):
|
|
146
|
+
fill = _shape_fill(shape)
|
|
147
|
+
if fill:
|
|
148
|
+
fills[fill] += 1
|
|
149
|
+
|
|
150
|
+
text = _shape_text(shape)
|
|
151
|
+
if not text:
|
|
152
|
+
continue
|
|
153
|
+
|
|
154
|
+
lowered = text.strip().lower()
|
|
155
|
+
if lowered in DEFAULT_PLACEHOLDER_TEXT:
|
|
156
|
+
placeholder_hits.append(f"slide {slide_idx} shape {shape_idx}: {text[:80]}")
|
|
157
|
+
|
|
158
|
+
if hard_re and hard_re.search(text):
|
|
159
|
+
hard_hits.append(f"slide {slide_idx} shape {shape_idx}: {text[:120]}")
|
|
160
|
+
elif soft_re and soft_re.search(text):
|
|
161
|
+
soft_hits.append(f"slide {slide_idx} shape {shape_idx}: {text[:120]}")
|
|
162
|
+
|
|
163
|
+
for shape, run in _iter_runs(slide):
|
|
164
|
+
font_name = (run.font.name or "").strip()
|
|
165
|
+
if font_name in DEFAULT_BAD_FONTS:
|
|
166
|
+
default_font_hits.append(f"slide {slide_idx}: {font_name}")
|
|
167
|
+
|
|
168
|
+
last_slide_text = "\n".join(_shape_text(shape) for shape in prs.slides[-1].shapes if getattr(shape, "has_text_frame", False)).lower() if prs.slides else ""
|
|
169
|
+
has_source_note = "source:" in last_slide_text or "출처" in last_slide_text
|
|
170
|
+
|
|
171
|
+
failures = {
|
|
172
|
+
"missing_titles": bool(missing_titles),
|
|
173
|
+
"forbidden_terms": bool(hard_hits),
|
|
174
|
+
"default_placeholder_text": bool(placeholder_hits),
|
|
175
|
+
"default_fonts": bool(default_font_hits),
|
|
176
|
+
"rainbow_fills": len(fills) > MAX_DISTINCT_FILLS,
|
|
177
|
+
}
|
|
178
|
+
slop_score = sum(WEIGHTS[key] for key, failed in failures.items() if failed)
|
|
179
|
+
|
|
180
|
+
return {
|
|
181
|
+
"file": str(path),
|
|
182
|
+
"slide_count": len(prs.slides),
|
|
183
|
+
"pass": slop_score <= 10 and not hard_hits and not placeholder_hits,
|
|
184
|
+
"slop_score": slop_score,
|
|
185
|
+
"checks": {
|
|
186
|
+
"missing_titles": {"pass": not missing_titles, "slides": missing_titles},
|
|
187
|
+
"forbidden_terms": {"pass": not hard_hits, "hard_hits": hard_hits[:20], "soft_warnings": soft_hits[:20]},
|
|
188
|
+
"default_placeholder_text": {"pass": not placeholder_hits, "hits": placeholder_hits[:20]},
|
|
189
|
+
"default_fonts": {"pass": not default_font_hits, "hits": default_font_hits[:20]},
|
|
190
|
+
"rainbow_fills": {"pass": len(fills) <= MAX_DISTINCT_FILLS, "distinct_fills": len(fills), "sample": list(fills.keys())[:12]},
|
|
191
|
+
"missing_source_note": {"pass": has_source_note},
|
|
192
|
+
},
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
def main(argv: list[str]) -> int:
|
|
197
|
+
if len(argv) != 2:
|
|
198
|
+
print(f"Usage: {Path(argv[0]).name} <file.pptx>", file=sys.stderr)
|
|
199
|
+
return 2
|
|
200
|
+
report = lint(argv[1])
|
|
201
|
+
print(json.dumps(report, ensure_ascii=False, indent=2))
|
|
202
|
+
return 0 if report["pass"] else 1
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
if __name__ == "__main__":
|
|
206
|
+
raise SystemExit(main(sys.argv))
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
# Markdown Slide Specification v1
|
|
2
|
+
|
|
3
|
+
> **Status:** Superseded by `markdown-slide-spec-v2.md`, and still valid. This document
|
|
4
|
+
> defines the v1 contract; a deck written entirely to it compiles to a `slide-ast-v1`
|
|
5
|
+
> document exactly as before. v2 is additive — read it for placement (`region`,
|
|
6
|
+
> `columns`, `box`, `shape`), variants, and the open layout set. The one non-goal v2
|
|
7
|
+
> reverses is §11's ban on free-form absolute positioning.
|
|
8
|
+
> **Date:** 2026-04-19
|
|
9
|
+
|
|
10
|
+
The executive/research profile below is a backward-compatible authoring profile. It composes existing v1 blocks and does not add coordinates, CSS, directives, or AST types.
|
|
11
|
+
|
|
12
|
+
## Purpose
|
|
13
|
+
|
|
14
|
+
Define a constrained Markdown + directive dialect that serves as the single authoring source for PPTX slide decks. The dialect must be:
|
|
15
|
+
|
|
16
|
+
1. **LLM-friendly** — predictable structure, easy for agents to generate and edit.
|
|
17
|
+
2. **Precision-first** — compiles into a versioned intermediate AST that preserves layout intent.
|
|
18
|
+
3. **Template-aware** — resolves against enrolled template contracts, not hardcoded behavior.
|
|
19
|
+
|
|
20
|
+
## 1. Deck Structure
|
|
21
|
+
|
|
22
|
+
A deck source file is a single Markdown file with:
|
|
23
|
+
|
|
24
|
+
1. **YAML frontmatter** (required) — deck-level metadata enclosed in `---`.
|
|
25
|
+
2. **Slide sections** — separated by `---` horizontal rules. Each section contains a layout directive and slide content.
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
---
|
|
29
|
+
template: AZURE-PRO
|
|
30
|
+
title: Deck Title
|
|
31
|
+
date: 2026.04.19
|
|
32
|
+
department: Department
|
|
33
|
+
presenter: Name
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
layout: cover
|
|
38
|
+
|
|
39
|
+
# Cover Title
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
layout: content
|
|
44
|
+
|
|
45
|
+
## Section Title
|
|
46
|
+
|
|
47
|
+
- Bullet 1
|
|
48
|
+
- Bullet 2
|
|
49
|
+
---
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## 2. YAML Frontmatter
|
|
53
|
+
|
|
54
|
+
Required fields:
|
|
55
|
+
|
|
56
|
+
| Field | Type | Required | Description |
|
|
57
|
+
|-------|------|----------|-------------|
|
|
58
|
+
| `template` | string | yes | Enrolled template name (e.g. `AZURE-PRO`) |
|
|
59
|
+
| `title` | string | yes | Deck title |
|
|
60
|
+
| `date` | string | no | Presentation date |
|
|
61
|
+
| `department` | string | no | Department name |
|
|
62
|
+
| `presenter` | string | no | Presenter name |
|
|
63
|
+
|
|
64
|
+
## 3. Slide Separators
|
|
65
|
+
|
|
66
|
+
Slides are delimited by `---` on its own line (standard Markdown horizontal rule). The content between two `---` markers is a single slide section.
|
|
67
|
+
|
|
68
|
+
Each slide section starts with a `layout` directive on the first non-empty line, followed by the slide content.
|
|
69
|
+
|
|
70
|
+
## 4. Allowed Markdown Subset
|
|
71
|
+
|
|
72
|
+
### 4.1 Permitted constructs
|
|
73
|
+
|
|
74
|
+
| Construct | Syntax | Notes |
|
|
75
|
+
|-----------|--------|-------|
|
|
76
|
+
| Headings | `#`, `##`, `###` | Level 1 for cover/closing titles, Level 2 for slide titles, Level 3 for sub-headings |
|
|
77
|
+
| Bullet lists | `- item` | Level 1 bullets |
|
|
78
|
+
| Bold text | `**text**` | Within list items for section headers |
|
|
79
|
+
| Numbered items | `(1) text` | Manual numbering with parenthesized Arabic numerals |
|
|
80
|
+
| Tables | `\| ... \|` | Standard Markdown pipe tables |
|
|
81
|
+
| Images | `` | With relative or absolute paths |
|
|
82
|
+
| Table links | `[label](https://...)` | Rendered as a clickable external PPTX hyperlink in table cells |
|
|
83
|
+
| Fenced blocks | `::: type ... :::` | Directive blocks (see §5) |
|
|
84
|
+
|
|
85
|
+
### 4.2 Forbidden constructs
|
|
86
|
+
|
|
87
|
+
The following are **rejected at parse time** with explicit errors:
|
|
88
|
+
|
|
89
|
+
| Forbidden | Reason |
|
|
90
|
+
|-----------|--------|
|
|
91
|
+
| Raw HTML (`<div>`, `<span>`, etc.) | Bypasses template layout contracts |
|
|
92
|
+
| `<style>` blocks | CSS escapes break PPTX fidelity |
|
|
93
|
+
| Inline `style=` attributes | Arbitrary positioning breaks layout |
|
|
94
|
+
| Nested fenced blocks (`:::` inside `:::`) | Ambiguous directive nesting |
|
|
95
|
+
| Arbitrary CSS classes | Layout must come from template contracts |
|
|
96
|
+
|
|
97
|
+
## 5. Directive Blocks
|
|
98
|
+
|
|
99
|
+
Directives use fenced blocks with `:::` delimiters. Each directive type has a specific contract.
|
|
100
|
+
|
|
101
|
+
### 5.1 v1 Directive Set
|
|
102
|
+
|
|
103
|
+
| Directive | Purpose | Allowed in layouts |
|
|
104
|
+
|-----------|---------|--------------------|
|
|
105
|
+
| `main-box` | Bordered text box at bottom of slide | `main` |
|
|
106
|
+
| `summary-group` | Grouped summary content (top/bottom) | `summary` |
|
|
107
|
+
| `kpi-table` | Key Performance Indicator table | `main`, `content` |
|
|
108
|
+
| `image` | Positioned image with caption | `content`, `main` |
|
|
109
|
+
| `notes` | Speaker/footnotes | `content`, `main` |
|
|
110
|
+
|
|
111
|
+
### 5.2 Directive Syntax
|
|
112
|
+
|
|
113
|
+
```
|
|
114
|
+
::: main-box
|
|
115
|
+
Text content for the bordered box.
|
|
116
|
+
:::
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
```
|
|
120
|
+
::: kpi-table
|
|
121
|
+
| Metric | Target | Actual |
|
|
122
|
+
|--------|--------|--------|
|
|
123
|
+
| Revenue | 5000억 | 5450억 |
|
|
124
|
+
:::
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
```
|
|
128
|
+
::: notes
|
|
129
|
+
Source: Internal data, Q1 2026.
|
|
130
|
+
:::
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### 5.3 Nesting Rules
|
|
134
|
+
|
|
135
|
+
- Directive blocks **MUST NOT** be nested inside other directive blocks.
|
|
136
|
+
- Each `:::` open must have a matching `:::` close before another `:::` open.
|
|
137
|
+
- Violation produces a parse error with the offending line number.
|
|
138
|
+
|
|
139
|
+
## 6. Layout Types
|
|
140
|
+
|
|
141
|
+
### 6.1 v1 Approved Layouts
|
|
142
|
+
|
|
143
|
+
| Layout | Purpose | Required blocks |
|
|
144
|
+
|--------|---------|-----------------|
|
|
145
|
+
| `cover` | Opening slide | title (level 1) |
|
|
146
|
+
| `content` | Standard title + body | title (level 2), body |
|
|
147
|
+
| `main` | Content with optional bordered box | title (level 2), body, optional `main-box` |
|
|
148
|
+
| `summary` | Two-group hierarchical summary | title (level 2), summary-groups via `###` headings |
|
|
149
|
+
| `closing` | Thank-you slide | title (level 1) |
|
|
150
|
+
|
|
151
|
+
### 6.2 Layout-specific content rules
|
|
152
|
+
|
|
153
|
+
- `cover`: Exactly one `#` heading. No body lists.
|
|
154
|
+
- `content`: One `##` heading. Body with bullet lists or tables.
|
|
155
|
+
- `main`: One `##` heading. Body with bullet lists. Optional `::: main-box`.
|
|
156
|
+
- `summary`: One `##` heading. Content organized under `###` sub-headings. The first `###` group maps to the top position, the second maps to the bottom position.
|
|
157
|
+
- `closing`: Exactly one `#` heading. No body content.
|
|
158
|
+
|
|
159
|
+
## 7. Bullet Hierarchy
|
|
160
|
+
|
|
161
|
+
The template uses a two-level hierarchy:
|
|
162
|
+
|
|
163
|
+
**Level 1 — Section headers:**
|
|
164
|
+
```
|
|
165
|
+
- **Section Title**
|
|
166
|
+
```
|
|
167
|
+
Rendered as bold bullet with `•` character.
|
|
168
|
+
|
|
169
|
+
**Level 2 — Numbered sub-items:**
|
|
170
|
+
```
|
|
171
|
+
(1) Detail item 1
|
|
172
|
+
(2) Detail item 2
|
|
173
|
+
```
|
|
174
|
+
Rendered as indented numbered items with `(1)`, `(2)` format.
|
|
175
|
+
|
|
176
|
+
Indentation for level 2 items is 2 spaces.
|
|
177
|
+
|
|
178
|
+
## 8. Failure Behavior
|
|
179
|
+
|
|
180
|
+
### 8.1 Parse errors
|
|
181
|
+
|
|
182
|
+
When the parser encounters a forbidden construct:
|
|
183
|
+
|
|
184
|
+
1. **Stop parsing immediately** — do not silently skip or degrade.
|
|
185
|
+
2. **Report the file path**, slide index, and approximate **line number**.
|
|
186
|
+
3. **Name the specific violation** (e.g., "arbitrary HTML `<div>` not allowed", "nested directives at line 42").
|
|
187
|
+
|
|
188
|
+
### 8.2 Validation errors
|
|
189
|
+
|
|
190
|
+
When the compiled AST violates the schema:
|
|
191
|
+
|
|
192
|
+
1. **Reject the entire deck** — do not produce partial output.
|
|
193
|
+
2. **Report which slide and which block** failed validation.
|
|
194
|
+
3. **Name the schema constraint** that was violated.
|
|
195
|
+
|
|
196
|
+
## 9. AST Output Contract
|
|
197
|
+
|
|
198
|
+
The compiler emits a JSON object conforming to `slide-ast-v1.schema.json`.
|
|
199
|
+
|
|
200
|
+
Required top-level fields:
|
|
201
|
+
|
|
202
|
+
| Field | Type | Description |
|
|
203
|
+
|-------|------|-------------|
|
|
204
|
+
| `astVersion` | string | Must be `"slide-ast-v1"` |
|
|
205
|
+
| `version` | string | Schema version (semver) |
|
|
206
|
+
| `deck` | object | Template name, title, metadata |
|
|
207
|
+
| `slides` | array | Ordered array of slide objects |
|
|
208
|
+
|
|
209
|
+
Each slide object must have:
|
|
210
|
+
|
|
211
|
+
| Field | Type | Description |
|
|
212
|
+
|-------|------|-------------|
|
|
213
|
+
| `index` | number | 0-based slide position |
|
|
214
|
+
| `layout` | string | One of the approved layout types |
|
|
215
|
+
| `blocks` | array | Content blocks in order |
|
|
216
|
+
|
|
217
|
+
Each block must have:
|
|
218
|
+
|
|
219
|
+
| Field | Type | Description |
|
|
220
|
+
|-------|------|-------------|
|
|
221
|
+
| `type` | string | Block type: `title`, `body`, `main-box`, `summary-group`, `kpi-table`, `image`, `notes` |
|
|
222
|
+
| `content` or `items` | varies | Block payload |
|
|
223
|
+
|
|
224
|
+
## 10. Relationship to Enrolled Templates
|
|
225
|
+
|
|
226
|
+
The AST is **template-independent**. It describes intent (layout, content structure), not pixel positions. Template-specific rendering (fonts, colors, positions, decorations) is resolved by the template registry and layout resolver at render time.
|
|
227
|
+
|
|
228
|
+
This means:
|
|
229
|
+
- The same AST can theoretically render through different enrolled templates.
|
|
230
|
+
- Template enrollment contracts declare which layouts and blocks they support.
|
|
231
|
+
- A deck targeting an unsupported layout/block for a given template produces a clear error, not a fallback.
|
|
232
|
+
|
|
233
|
+
### 10.1 Evidence-oriented compositions
|
|
234
|
+
|
|
235
|
+
Enrolled templates may advertise these semantic compositions of existing blocks:
|
|
236
|
+
|
|
237
|
+
- **figure plus interpretation:** `image` + `figure-caption` + body interpretation;
|
|
238
|
+
- **table plus decision takeaway:** table/`kpi-table` + `table-caption` + body takeaway;
|
|
239
|
+
- **source capture:** `image` + `figure-caption` containing locator/source + body limitation/relevance;
|
|
240
|
+
- **two-record appendix evidence:** title/body or `summary-group`, with no more than two records and DOI/canonical links when available.
|
|
241
|
+
|
|
242
|
+
For a Markdown image used as evidence, alt text is the visible figure caption and should contain a figure number plus `Source:`/`출처:`. A blockquote immediately after a table is its visible table caption/source. Appendix DOI/canonical/raw URL fields use `[label](https://...)` in table cells so the PPTX contains an external hyperlink relationship. These requirements reuse existing parser and renderer behavior.
|
|
243
|
+
|
|
244
|
+
## 11. Explicit Non-Goals for v1
|
|
245
|
+
|
|
246
|
+
- Full Marp compatibility.
|
|
247
|
+
- Arbitrary CSS as part of authoring input.
|
|
248
|
+
- Free-form absolute positioning in Markdown.
|
|
249
|
+
- Silent fallback or degradation for unsupported constructs.
|
|
250
|
+
- Raw HTML passthrough.
|
|
251
|
+
- JavaScript or interactive content.
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
# Markdown Slide Specification v2
|
|
2
|
+
|
|
3
|
+
> **Status:** Current. Additive over v1 — every v1 deck is a valid v2 deck and still
|
|
4
|
+
> compiles to a `slide-ast-v1` document.
|
|
5
|
+
> **Supersedes:** `markdown-slide-spec-v1.md`, which remains accurate for the subset
|
|
6
|
+
> it describes and is still the contract v1 decks are held to.
|
|
7
|
+
> **Date:** 2026-08-02
|
|
8
|
+
|
|
9
|
+
## What changed and why
|
|
10
|
+
|
|
11
|
+
v1 froze one non-goal that turned out to be the binding constraint in real work:
|
|
12
|
+
*free-form absolute positioning in Markdown* (v1 §11). Combined with a closed set of
|
|
13
|
+
six layouts and a fixed block-to-region map, a deck could only look like the shapes
|
|
14
|
+
its template had anticipated. Building a cover the template did not already offer, or
|
|
15
|
+
putting two tables on one slide, was not difficult — it was unexpressible.
|
|
16
|
+
|
|
17
|
+
v2 opens placement in three tiers, so an author reaches for the least freedom that
|
|
18
|
+
says the thing rather than dropping straight to coordinates.
|
|
19
|
+
|
|
20
|
+
Nothing was removed. The v1 constructs, layouts, directives, separator rules and
|
|
21
|
+
failure behaviour are unchanged, and a deck that uses none of §2–§6 below compiles to
|
|
22
|
+
a byte-identical `slide-ast-v1` document.
|
|
23
|
+
|
|
24
|
+
## 1. Version selection
|
|
25
|
+
|
|
26
|
+
The compiler chooses the AST version from the deck's content, not from a flag.
|
|
27
|
+
|
|
28
|
+
| Deck uses | `astVersion` |
|
|
29
|
+
|---|---|
|
|
30
|
+
| v1 constructs only | `slide-ast-v1` |
|
|
31
|
+
| any of: `region`, `columns`, `box`, `shape`, a slide-local key, a layout outside the v1 six | `slide-ast-v2` |
|
|
32
|
+
|
|
33
|
+
Both are accepted by the validator. This is what lets v1 fixtures and their assertions
|
|
34
|
+
stand untouched.
|
|
35
|
+
|
|
36
|
+
## 2. Slide-local keys
|
|
37
|
+
|
|
38
|
+
Keys may follow the `layout:` line, ending at the first blank line:
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
---
|
|
42
|
+
layout: cover
|
|
43
|
+
variant: split-navy
|
|
44
|
+
|
|
45
|
+
# Title
|
|
46
|
+
---
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**The key set is closed.** `variant` (§6) is the only slide-local key, and the run stops
|
|
50
|
+
at the first line that is not one of them. A line the engine does not act on stays in
|
|
51
|
+
the body.
|
|
52
|
+
|
|
53
|
+
That is the whole guarantee, and it is deliberately not "anything shaped like a key".
|
|
54
|
+
A body line reading `source: internal data` has exactly the shape of a key, and
|
|
55
|
+
consuming it would delete it from the slide with no error. The same rule keeps a
|
|
56
|
+
mistyped `varient:` visible in the body rather than turning it into an ignored key that
|
|
57
|
+
silently does nothing — a typo you can see beats a variant that never applied.
|
|
58
|
+
|
|
59
|
+
An earlier draft of this section claimed the blank line was the boundary and that prose
|
|
60
|
+
was therefore safe. It was not. The Korean example it used, `출처: 내부 자료`, survived
|
|
61
|
+
only because `출처` is not ASCII; the English equivalent was swallowed.
|
|
62
|
+
|
|
63
|
+
## 3. Directive attributes
|
|
64
|
+
|
|
65
|
+
A directive line may carry positional values and `key=value` pairs:
|
|
66
|
+
|
|
67
|
+
```
|
|
68
|
+
::: box x=6.9 y=2.6 w=5.3 h=1.4 role="body text" z=over
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Numbers and booleans are coerced; quoted values keep their spaces. A v1 directive with
|
|
72
|
+
no arguments parses exactly as before, with an empty attribute map.
|
|
73
|
+
|
|
74
|
+
## 4. Nesting by fence length
|
|
75
|
+
|
|
76
|
+
v1 forbade `:::` inside `:::` and every v1 deck depends on that. Rather than relax it,
|
|
77
|
+
containers nest by fence length — the pandoc fenced-div convention. A block closes on a
|
|
78
|
+
run of its own length, so `::::` may hold `:::` with no ambiguity.
|
|
79
|
+
|
|
80
|
+
- Same-length nesting: **error** (unchanged from v1)
|
|
81
|
+
- A longer fence inside a shorter one: **error**
|
|
82
|
+
- Depth beyond two: **error**
|
|
83
|
+
|
|
84
|
+
## 5. Placement
|
|
85
|
+
|
|
86
|
+
### 5.1 Tier 1 — `region`
|
|
87
|
+
|
|
88
|
+
```
|
|
89
|
+
::: region name=right_figure
|
|
90
|
+
| 항목 | 값 |
|
|
91
|
+
|------|-----|
|
|
92
|
+
:::
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
The body is parsed as ordinary Markdown; each resulting block is routed to the named
|
|
96
|
+
region instead of the one its type would imply. The block list stays flat — `region`
|
|
97
|
+
does not appear in the AST, it only sets `regionHint`.
|
|
98
|
+
|
|
99
|
+
A name the layout does not declare is an error listing the regions it does.
|
|
100
|
+
|
|
101
|
+
### 5.2 Tier 2 — `columns`
|
|
102
|
+
|
|
103
|
+
```
|
|
104
|
+
:::: columns 2fr 1fr gap=0.3
|
|
105
|
+
::: col
|
|
106
|
+
- 왼쪽
|
|
107
|
+
:::
|
|
108
|
+
::: col
|
|
109
|
+

|
|
110
|
+
:::
|
|
111
|
+
::::
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Tracks are ratios and the engine divides the layout's **body region** between them, so
|
|
115
|
+
the source carries no coordinates and the same deck still lands correctly on a template
|
|
116
|
+
with another canvas. `gap` is in inches, default `0.25`.
|
|
117
|
+
|
|
118
|
+
- Track count must equal `::: col` count — a mismatch is an error, never silent padding.
|
|
119
|
+
- A layout with no body region cannot host columns.
|
|
120
|
+
- Columns replace the body region for that slide; the body region does not also render.
|
|
121
|
+
|
|
122
|
+
### 5.3 Tier 3 — `box` and `shape`
|
|
123
|
+
|
|
124
|
+
```
|
|
125
|
+
::: box x=6.9 y=2.6 w=5.3 h=1.4 role=body_text z=over
|
|
126
|
+
**결론** — 세 축으로 재편
|
|
127
|
+
:::
|
|
128
|
+
|
|
129
|
+
::: shape rect x=0 y=6.4 w=13.333 h=1.1 fill=#EEF4FF z=under
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
`box` requires `x y w h` in inches. `role` names a `font_role` from the template's
|
|
133
|
+
`capabilities.yaml`, defaulting to `body_text`. Content is parsed as Markdown and flows
|
|
134
|
+
down the box: every block but the last takes the height its content needs, the last
|
|
135
|
+
takes what is left.
|
|
136
|
+
|
|
137
|
+
`shape` is a **void directive** — one line, no closing fence. Its first positional value
|
|
138
|
+
is the primitive: `rect · roundRect · pill · ellipse · ring · line · text · image`. Style
|
|
139
|
+
attributes are `fill line lw radius rotate text color size align valign char_spacing
|
|
140
|
+
bold asset dir src`, checked at compile time so a typo fails loudly. `line` is the one
|
|
141
|
+
kind that needs no height; it takes its thickness from the stroke.
|
|
142
|
+
|
|
143
|
+
`z` is `under` or `over`. Shapes default to `under`, boxes to `over`.
|
|
144
|
+
|
|
145
|
+
### 5.4 What placement does not do
|
|
146
|
+
|
|
147
|
+
**A template region is never reflowed to avoid a placed box.** The auto-nudge rules that
|
|
148
|
+
narrow a body beside an image do not see placements at all, and coordinates arrive at the
|
|
149
|
+
renderer exactly as written. Covering a region is therefore a defect the QA gate reports,
|
|
150
|
+
not a nudge the engine applies. This is deliberate: an engine that quietly moved content
|
|
151
|
+
out from under an author's box would make the author's intent unknowable.
|
|
152
|
+
|
|
153
|
+
## 6. Layouts and variants
|
|
154
|
+
|
|
155
|
+
The layout set is no longer closed. `spec-validator` checks that a layout name is an
|
|
156
|
+
identifier (`^[a-z][a-z0-9-]*$`); whether it exists is a fact about the chosen template,
|
|
157
|
+
and `layout-resolver` compares it against the template mapping and names the alternatives
|
|
158
|
+
when it does not match.
|
|
159
|
+
|
|
160
|
+
`free` needs no declaration — it means "this slide uses no template region", so every
|
|
161
|
+
template supports it and the slide is built entirely from placements.
|
|
162
|
+
|
|
163
|
+
A **variant** swaps a layout's decoration set and may override the regions the new
|
|
164
|
+
furniture displaces:
|
|
165
|
+
|
|
166
|
+
```
|
|
167
|
+
---
|
|
168
|
+
layout: cover
|
|
169
|
+
variant: split-navy
|
|
170
|
+
---
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
Both parts travel together, because a split cover needs a narrower title than a
|
|
174
|
+
full-bleed one. An unknown variant is an error listing the ones the layout declares.
|
|
175
|
+
|
|
176
|
+
## 7. Capability derivation
|
|
177
|
+
|
|
178
|
+
When a template declares a layout but publishes no `supported_blocks` entry for it, the
|
|
179
|
+
allowed blocks are derived from the regions that layout declares. Placement blocks and
|
|
180
|
+
`notes` are allowed everywhere, since they do not depend on a region existing.
|
|
181
|
+
|
|
182
|
+
## 8. Region occupancy
|
|
183
|
+
|
|
184
|
+
A region holds one block. Two blocks claiming the same region is an error naming both
|
|
185
|
+
ways out — `::: region name=` or `:::: columns`. In v1 the second block silently
|
|
186
|
+
overwrote the first, which is why a slide could not carry two tables.
|
|
187
|
+
|
|
188
|
+
Two exceptions are documented behaviour decks already rely on: images collapse into a
|
|
189
|
+
grid, and captions are subordinate labels where the last one wins.
|
|
190
|
+
|
|
191
|
+
## 9. Charts
|
|
192
|
+
|
|
193
|
+
Numeric series use an editable native PowerPoint chart. Write a `::: chart kind=bar`
|
|
194
|
+
or `::: chart kind=line` directive with a Markdown table inside it. The first column is
|
|
195
|
+
the category and each remaining column is a numeric series; use at least two rows.
|
|
196
|
+
Keep units in series names or the slide caption. Example:
|
|
197
|
+
|
|
198
|
+
```markdown
|
|
199
|
+
::: chart kind=bar
|
|
200
|
+
| Quarter | Revenue (USD m) | Cost (USD m) |
|
|
201
|
+
|---|---:|---:|
|
|
202
|
+
| Q1 | 12 | 8 |
|
|
203
|
+
| Q2 | 17 | 10 |
|
|
204
|
+
:::
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
For scientific plots that cannot be expressed as a simple series, use
|
|
208
|
+
`/scientific-visualization` and place its output as an image.
|
|
209
|
+
`compile-deck.js --export-viz-context <path>` writes the template's palette,
|
|
210
|
+
body font family, bundled font file paths, canvas and DPI for that plot.
|
|
211
|
+
|
|
212
|
+
## 10. Non-goals retained from v1
|
|
213
|
+
|
|
214
|
+
- Full Marp compatibility
|
|
215
|
+
- Arbitrary CSS as authoring input
|
|
216
|
+
- Raw HTML passthrough
|
|
217
|
+
- JavaScript or interactive content
|
|
218
|
+
- Silent fallback or degradation for unsupported constructs
|
|
219
|
+
|
|
220
|
+
The single v1 non-goal v2 reverses is free-form absolute positioning, and §5.4 states
|
|
221
|
+
what was kept in exchange.
|