@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,192 @@
|
|
|
1
|
+
"""Brief-to-SVG checks for required content and trust-boundary membership."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import re
|
|
6
|
+
from typing import TypedDict
|
|
7
|
+
|
|
8
|
+
from diagram_geometry import ParsedSvg, Shape, parse_svg
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class BriefEdge(TypedDict):
|
|
12
|
+
from_: str
|
|
13
|
+
to: str
|
|
14
|
+
label: str
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class BoundaryMembership(TypedDict):
|
|
18
|
+
declarationPresent: bool
|
|
19
|
+
declared: bool
|
|
20
|
+
internal: list[str]
|
|
21
|
+
external: list[str]
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class ParsedBrief(TypedDict):
|
|
25
|
+
nodes: list[str]
|
|
26
|
+
edges: list[BriefEdge]
|
|
27
|
+
language: str
|
|
28
|
+
allowedEnglishTerms: list[str]
|
|
29
|
+
boundaryMembership: BoundaryMembership
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class BoundaryReport(TypedDict):
|
|
33
|
+
declared: bool
|
|
34
|
+
boundaryCount: int
|
|
35
|
+
internal: list[str]
|
|
36
|
+
external: list[str]
|
|
37
|
+
issues: list[str]
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class BriefReport(TypedDict):
|
|
41
|
+
language: str
|
|
42
|
+
nodes: int
|
|
43
|
+
relationships: int
|
|
44
|
+
missingNodes: list[str]
|
|
45
|
+
missingLabels: list[str]
|
|
46
|
+
missingEdges: list[str]
|
|
47
|
+
unpairedLabels: list[str]
|
|
48
|
+
languageMismatches: list[str]
|
|
49
|
+
boundaryMembership: BoundaryReport
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def _terms(value: str) -> set[str]:
|
|
53
|
+
return {term.lower() for term in re.findall(r"[A-Za-z][A-Za-z0-9]*(?:[.+/#-][A-Za-z0-9]+)*", value)}
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def parse_brief(text: str) -> ParsedBrief:
|
|
57
|
+
"""Parse the explicit node, route, language, and boundary brief fields."""
|
|
58
|
+
lines = [line.strip() for line in text.splitlines()]
|
|
59
|
+
nodes: list[str] = []
|
|
60
|
+
edges: list[BriefEdge] = []
|
|
61
|
+
for line in lines:
|
|
62
|
+
fact = re.match(r"^[-*]\s*(.+?)\s+participates in the labeled relationships below\.$", line)
|
|
63
|
+
relation = re.match(r"^[-*]\s*(.+?)\s+→\s+(.+?)\s+\((.+)\)$", line)
|
|
64
|
+
if fact:
|
|
65
|
+
nodes.append(fact.group(1))
|
|
66
|
+
elif relation:
|
|
67
|
+
edges.append({"from_": relation.group(1), "to": relation.group(2), "label": relation.group(3)})
|
|
68
|
+
unique_nodes = list(dict.fromkeys(nodes))
|
|
69
|
+
title = next((line[2:].strip() for line in lines if line.startswith("# ")), "")
|
|
70
|
+
title = re.sub(r"^(?:Diagram brief\s*[·:]\s*|Blind brief:\s*)", "", title, flags=re.IGNORECASE)
|
|
71
|
+
purpose = next((re.sub(r"^[-*]\s*Purpose:\s*", "", line, flags=re.IGNORECASE) for line in lines if re.match(r"^[-*]\s*Purpose:", line, re.IGNORECASE)), "")
|
|
72
|
+
content_parts = [title, purpose, *unique_nodes, *(part for edge in edges for part in (edge["from_"], edge["to"], edge["label"]))]
|
|
73
|
+
language_sample = " ".join(content_parts)
|
|
74
|
+
language = "ko" if len(re.findall(r"[\uac00-\ud7a3]", language_sample)) > len(re.findall(r"[A-Za-z]", language_sample)) else "en"
|
|
75
|
+
internal_line = next((line for line in lines if re.match(r"^[-*]\s*Trust boundary internal nodes:", line, re.IGNORECASE)), "")
|
|
76
|
+
external_line = next((line for line in lines if re.match(r"^[-*]\s*Trust boundary external nodes:", line, re.IGNORECASE)), "")
|
|
77
|
+
|
|
78
|
+
def members(line: str) -> list[str]:
|
|
79
|
+
return [name.strip() for name in line.split(":", 1)[1].split(";") if name.strip()] if line else []
|
|
80
|
+
|
|
81
|
+
allowed = _terms(" ".join(part for part in content_parts if part))
|
|
82
|
+
allowed.update(term.lower() for code in re.findall(r"`([^`]+)`", text) for term in _terms(code))
|
|
83
|
+
allowed.update(
|
|
84
|
+
term.lower()
|
|
85
|
+
for line in lines
|
|
86
|
+
if re.match(r"^[-*]\s*Allowed (?:English )?terms:", line, re.IGNORECASE)
|
|
87
|
+
for term in _terms(re.sub(r"^[-*]\s*Allowed (?:English )?terms:\s*", "", line, flags=re.IGNORECASE))
|
|
88
|
+
)
|
|
89
|
+
membership: BoundaryMembership = {
|
|
90
|
+
"declarationPresent": bool(internal_line or external_line),
|
|
91
|
+
"declared": bool(internal_line and external_line),
|
|
92
|
+
"internal": members(internal_line),
|
|
93
|
+
"external": members(external_line),
|
|
94
|
+
}
|
|
95
|
+
return {
|
|
96
|
+
"nodes": unique_nodes,
|
|
97
|
+
"edges": edges,
|
|
98
|
+
"language": language,
|
|
99
|
+
"allowedEnglishTerms": sorted(allowed),
|
|
100
|
+
"boundaryMembership": membership,
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def _boundary_membership(parsed: ParsedSvg, membership: BoundaryMembership) -> BoundaryReport:
|
|
105
|
+
boundary_shapes = [shape for shape in parsed.shapes if "data-trust-boundary" in shape.attributes]
|
|
106
|
+
issues: list[str] = []
|
|
107
|
+
declared = membership["declared"]
|
|
108
|
+
if not membership["declarationPresent"]:
|
|
109
|
+
if boundary_shapes:
|
|
110
|
+
issues.append("BOUNDARY_MEMBERSHIP_DECLARATION_MISSING")
|
|
111
|
+
return {"declared": False, "boundaryCount": len(boundary_shapes), "internal": [], "external": [], "issues": issues}
|
|
112
|
+
if not declared:
|
|
113
|
+
issues.append("BOUNDARY_MEMBERSHIP_DECLARATION_INCOMPLETE")
|
|
114
|
+
internal, external = membership["internal"], membership["external"]
|
|
115
|
+
if not internal:
|
|
116
|
+
issues.append("BOUNDARY_INTERNAL_LIST_EMPTY")
|
|
117
|
+
if not external:
|
|
118
|
+
issues.append("BOUNDARY_EXTERNAL_LIST_EMPTY")
|
|
119
|
+
for names in (internal, external):
|
|
120
|
+
seen: set[str] = set()
|
|
121
|
+
for name in names:
|
|
122
|
+
if name in seen:
|
|
123
|
+
issues.append(f"BOUNDARY_MEMBERSHIP_DUPLICATE name={name}")
|
|
124
|
+
seen.add(name)
|
|
125
|
+
external_names = set(external)
|
|
126
|
+
for name in internal:
|
|
127
|
+
if name in external_names:
|
|
128
|
+
issues.append(f"BOUNDARY_MEMBERSHIP_CONFLICT name={name}")
|
|
129
|
+
if len(boundary_shapes) != 1:
|
|
130
|
+
issues.append(f"BOUNDARY_COUNT expected=1 actual={len(boundary_shapes)}")
|
|
131
|
+
return {"declared": True, "boundaryCount": len(boundary_shapes), "internal": internal, "external": external, "issues": issues}
|
|
132
|
+
boundary = boundary_shapes[0].rect
|
|
133
|
+
if boundary.w <= 0 or boundary.h <= 0:
|
|
134
|
+
issues.append("BOUNDARY_GEOMETRY_INVALID")
|
|
135
|
+
return {"declared": True, "boundaryCount": 1, "internal": internal, "external": external, "issues": issues}
|
|
136
|
+
nodes = [shape for shape in parsed.shapes if shape.attributes.get("data-node-id")]
|
|
137
|
+
node_names = {shape.attributes["data-node-id"] for shape in nodes}
|
|
138
|
+
expected = set(internal + external)
|
|
139
|
+
for name in sorted(expected - node_names):
|
|
140
|
+
issues.append(f"BOUNDARY_NODE_MISSING name={name}")
|
|
141
|
+
for node in nodes:
|
|
142
|
+
name = node.attributes["data-node-id"]
|
|
143
|
+
rect = node.rect
|
|
144
|
+
if rect.w <= 0 or rect.h <= 0:
|
|
145
|
+
issues.append(f"BOUNDARY_NODE_GEOMETRY_INVALID name={name}")
|
|
146
|
+
elif name not in expected:
|
|
147
|
+
issues.append(f"BOUNDARY_NODE_UNDECLARED name={name}")
|
|
148
|
+
else:
|
|
149
|
+
inside = rect.x >= boundary.x and rect.y >= boundary.y and rect.right <= boundary.right and rect.bottom <= boundary.bottom
|
|
150
|
+
outside = rect.right <= boundary.x or rect.x >= boundary.right or rect.bottom <= boundary.y or rect.y >= boundary.bottom
|
|
151
|
+
if name in internal and not inside:
|
|
152
|
+
issues.append(f"BOUNDARY_NODE_NOT_INTERNAL name={name}")
|
|
153
|
+
if name in external_names and not outside:
|
|
154
|
+
issues.append(f"BOUNDARY_NODE_NOT_EXTERNAL name={name}")
|
|
155
|
+
return {"declared": True, "boundaryCount": 1, "internal": internal, "external": external, "issues": issues}
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
def check_brief(source: str, brief: str) -> BriefReport:
|
|
159
|
+
"""Compare visible labels and declared edge endpoints with an authored brief."""
|
|
160
|
+
contract = parse_brief(brief)
|
|
161
|
+
parsed = parse_svg(source)
|
|
162
|
+
texts = {text.label for text in parsed.texts}
|
|
163
|
+
allowed = set(contract["allowedEnglishTerms"])
|
|
164
|
+
mismatches = []
|
|
165
|
+
if contract["language"] == "ko":
|
|
166
|
+
for text in texts:
|
|
167
|
+
unapproved = [term for term in re.findall(r"[A-Za-z][A-Za-z0-9]*(?:[.+/#-][A-Za-z0-9]+)*", text) if term.lower() not in allowed]
|
|
168
|
+
if unapproved:
|
|
169
|
+
mismatches.append(f"{text}: {' | '.join(unapproved)}")
|
|
170
|
+
missing_nodes = [name for name in contract["nodes"] if name not in texts]
|
|
171
|
+
missing_labels = [edge["label"] for edge in contract["edges"] if edge["label"] not in texts]
|
|
172
|
+
missing_edges = [
|
|
173
|
+
f"{edge['from_']}->{edge['to']}:{edge['label']}"
|
|
174
|
+
for edge in contract["edges"]
|
|
175
|
+
if not any(route.from_id == edge["from_"] and route.to_id == edge["to"] and route.label == edge["label"] for route in parsed.routes)
|
|
176
|
+
]
|
|
177
|
+
unpaired = [
|
|
178
|
+
edge["label"]
|
|
179
|
+
for edge in contract["edges"]
|
|
180
|
+
if not any(text.edge_for == f"{edge['from_']}|{edge['to']}" and text.label == edge["label"] for text in parsed.texts)
|
|
181
|
+
]
|
|
182
|
+
return {
|
|
183
|
+
"language": contract["language"],
|
|
184
|
+
"nodes": len(contract["nodes"]),
|
|
185
|
+
"relationships": len(contract["edges"]),
|
|
186
|
+
"missingNodes": missing_nodes,
|
|
187
|
+
"missingLabels": missing_labels,
|
|
188
|
+
"missingEdges": missing_edges,
|
|
189
|
+
"unpairedLabels": unpaired,
|
|
190
|
+
"languageMismatches": mismatches,
|
|
191
|
+
"boundaryMembership": _boundary_membership(parsed, contract["boundaryMembership"]),
|
|
192
|
+
}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
"""Catalog closure, type identity, and reduced-motion checks."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
import re
|
|
8
|
+
from typing import TypedDict
|
|
9
|
+
|
|
10
|
+
from diagram_geometry import parse_svg
|
|
11
|
+
from diagram_metrics import source_metrics
|
|
12
|
+
from diagram_sequence import sequence_issues
|
|
13
|
+
|
|
14
|
+
SKILL_ROOT = Path(__file__).resolve().parents[1]
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class CatalogEntry(TypedDict):
|
|
18
|
+
id: str
|
|
19
|
+
reference: str
|
|
20
|
+
variants: list[str]
|
|
21
|
+
family: str
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class DiagramCatalog(TypedDict):
|
|
25
|
+
entries: list[CatalogEntry]
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class CatalogAudit(TypedDict):
|
|
29
|
+
issues: list[str]
|
|
30
|
+
entries: int
|
|
31
|
+
templates: int
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def audit_catalog(catalog: DiagramCatalog) -> CatalogAudit:
|
|
35
|
+
"""Check reference and template closure and reject duplicate or missing types."""
|
|
36
|
+
issues: list[str] = []
|
|
37
|
+
expected_templates: set[str] = set()
|
|
38
|
+
seen: set[str] = set()
|
|
39
|
+
entries = catalog["entries"]
|
|
40
|
+
for entry in entries:
|
|
41
|
+
type_id = entry["id"]
|
|
42
|
+
if type_id in seen:
|
|
43
|
+
issues.append(f"DUPLICATE_ID {type_id}")
|
|
44
|
+
seen.add(type_id)
|
|
45
|
+
reference = SKILL_ROOT / "references" / entry["reference"]
|
|
46
|
+
if not reference.is_file():
|
|
47
|
+
issues.append(f"TYPE_GUIDE_MISSING {type_id} {entry['reference']}")
|
|
48
|
+
for variant in ("light", "dark", "full"):
|
|
49
|
+
if variant not in entry["variants"]:
|
|
50
|
+
issues.append(f"VARIANT_MISSING {type_id} {variant}")
|
|
51
|
+
template = f"assets/examples/type-{type_id}-{variant}.html"
|
|
52
|
+
expected_templates.add(template)
|
|
53
|
+
if not (SKILL_ROOT / template).is_file():
|
|
54
|
+
issues.append(f"TEMPLATE_MISSING {template}")
|
|
55
|
+
actual_templates = {
|
|
56
|
+
path.relative_to(SKILL_ROOT).as_posix()
|
|
57
|
+
for path in (SKILL_ROOT / "assets" / "examples").glob("type-*.html")
|
|
58
|
+
}
|
|
59
|
+
for orphan in sorted(actual_templates - expected_templates):
|
|
60
|
+
issues.append(f"TEMPLATE_ORPHAN {orphan}")
|
|
61
|
+
if not (SKILL_ROOT / "assets" / "fonts" / "OFL.txt").is_file():
|
|
62
|
+
issues.append("PRETENDARD_OFL_MISSING")
|
|
63
|
+
if not (SKILL_ROOT / "assets" / "fonts" / "PretendardVariable.woff2").is_file():
|
|
64
|
+
issues.append("PRETENDARD_FONT_MISSING")
|
|
65
|
+
if not (SKILL_ROOT / "assets" / "icons.html").is_file():
|
|
66
|
+
issues.append("ICON_SHEET_MISSING")
|
|
67
|
+
return {"issues": issues, "entries": len(entries), "templates": len(actual_templates)}
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def _catalog_entry(type_id: str) -> CatalogEntry | None:
|
|
71
|
+
catalog_path = SKILL_ROOT / "references" / "type-catalog.json"
|
|
72
|
+
catalog: DiagramCatalog = json.loads(catalog_path.read_text(encoding="utf-8"))
|
|
73
|
+
return next((entry for entry in catalog["entries"] if entry["id"] == type_id), None)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def verify_type(source: str, type_id: str) -> list[str]:
|
|
77
|
+
"""Check type ID, template variant, family minimums, and declared semantics."""
|
|
78
|
+
entry = _catalog_entry(type_id)
|
|
79
|
+
if entry is None:
|
|
80
|
+
return [f"TYPE_UNKNOWN {type_id}"]
|
|
81
|
+
parsed = parse_svg(source)
|
|
82
|
+
metrics = source_metrics(source)
|
|
83
|
+
issues: list[str] = []
|
|
84
|
+
type_markers = (f'data-type="{type_id}"', f"id=\"diagram-{type_id}-")
|
|
85
|
+
if not any(marker in source for marker in type_markers):
|
|
86
|
+
issues.append("TYPE_ID_MISMATCH")
|
|
87
|
+
if not (SKILL_ROOT / "references" / entry["reference"]).is_file():
|
|
88
|
+
issues.append("TYPE_GUIDE_MISSING")
|
|
89
|
+
has_variant = bool(re.search(r"data-variant\s*=\s*['\"](?:light|dark|full)['\"]", source, re.IGNORECASE))
|
|
90
|
+
has_variant = has_variant or bool(re.search(r"id=['\"]diagram-[a-z0-9-]+-(?:light|dark|full)['\"]", parsed.svg, re.IGNORECASE))
|
|
91
|
+
if not has_variant:
|
|
92
|
+
issues.append("VARIANT_MISSING")
|
|
93
|
+
if entry["family"] == "quantitative" and metrics["textCount"] < 3:
|
|
94
|
+
issues.append("QUANTITATIVE_LABELS_MISSING")
|
|
95
|
+
rectangle_count = len(re.findall(r"<rect\b", source, re.IGNORECASE))
|
|
96
|
+
circle_count = len(re.findall(r"<circle\b", source, re.IGNORECASE))
|
|
97
|
+
if type_id == "heatmap" and rectangle_count < 16:
|
|
98
|
+
issues.append("HEATMAP_GRID_TOO_SMALL")
|
|
99
|
+
if type_id == "treemap" and rectangle_count < 6:
|
|
100
|
+
issues.append("TREEMAP_TILES_TOO_FEW")
|
|
101
|
+
if type_id == "sankey" and not re.search(r"<path\b[^>]*stroke-width\s*=\s*['\"][1-9]", source, re.IGNORECASE):
|
|
102
|
+
issues.append("SANKEY_RIBBON_WIDTH_MISSING")
|
|
103
|
+
if type_id == "waterfall" and rectangle_count < 5:
|
|
104
|
+
issues.append("WATERFALL_STEPS_TOO_FEW")
|
|
105
|
+
if type_id == "beeswarm" and circle_count < 20:
|
|
106
|
+
issues.append("BEESWARM_MARKS_TOO_FEW")
|
|
107
|
+
if type_id == "bubble" and circle_count < 6:
|
|
108
|
+
issues.append("BUBBLE_MARKS_TOO_FEW")
|
|
109
|
+
if type_id in {"polar", "radar"} and not re.search(r"<polygon\b", source, re.IGNORECASE):
|
|
110
|
+
issues.append(f"{type_id.upper()}_SHAPE_MISSING")
|
|
111
|
+
if type_id in {"sequence", "sequence-oauth"}:
|
|
112
|
+
nodes = tuple(shape for shape in parsed.shapes if shape.attributes.get("data-node-id"))
|
|
113
|
+
issues.extend(f"SEQUENCE {issue}" for issue in sequence_issues(source, parsed, nodes))
|
|
114
|
+
semantic_terms = {
|
|
115
|
+
"policy-trace-animated": ("rule", "policy", "allow", "deny"),
|
|
116
|
+
"queue-animated": ("queue", "buffer", "drain", "fan-in"),
|
|
117
|
+
"paved-road-animated": ("boundary", "guardrail", "secure", "policy"),
|
|
118
|
+
}.get(type_id, ())
|
|
119
|
+
if semantic_terms and not re.search(r"\b(?:" + "|".join(semantic_terms) + r")\b", source, re.IGNORECASE):
|
|
120
|
+
issues.append(type_id.upper().replace("-", "_") + "_SEMANTIC_MISSING")
|
|
121
|
+
return issues
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def verify_motion(source: str) -> list[str]:
|
|
125
|
+
"""Require static SVG and reduced-motion safeguards for authored animation."""
|
|
126
|
+
issues: list[str] = []
|
|
127
|
+
if re.search(r"<(?:animate|set)\b", source, re.IGNORECASE):
|
|
128
|
+
issues.append("SVG_ANIMATION_NOT_STATIC")
|
|
129
|
+
if re.search(r"animation\s*:\s*(?!none\b)[^;}]+", source, re.IGNORECASE) and not re.search(r"@media\s*\(prefers-reduced-motion\s*:\s*reduce\)[\s\S]*?animation\s*:\s*none", source, re.IGNORECASE):
|
|
130
|
+
issues.append("REDUCED_MOTION_RULE_MISSING")
|
|
131
|
+
if re.search(r"autoplay|infinite", source, re.IGNORECASE):
|
|
132
|
+
issues.append("UNBOUNDED_MOTION")
|
|
133
|
+
if re.search(r"<script\b", source, re.IGNORECASE) and not re.search(r"prefers-reduced-motion|matchMedia", source, re.IGNORECASE):
|
|
134
|
+
issues.append("MOTION_CONTROLLER_REDUCED_MOTION_MISSING")
|
|
135
|
+
return issues
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"""Hermes-local verifier API backed by Python stdlib and LitHumanizer."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
import sys
|
|
8
|
+
from typing import TypedDict
|
|
9
|
+
|
|
10
|
+
_PLUGIN_ROOT = Path(__file__).resolve().parents[3]
|
|
11
|
+
if str(_PLUGIN_ROOT) not in sys.path:
|
|
12
|
+
sys.path.insert(0, str(_PLUGIN_ROOT))
|
|
13
|
+
|
|
14
|
+
import humanizer_detector
|
|
15
|
+
from diagram_brief import BriefReport, check_brief
|
|
16
|
+
from diagram_catalog import CatalogAudit, DiagramCatalog, audit_catalog, verify_motion, verify_type
|
|
17
|
+
from diagram_metrics import DiagramMetrics, source_metrics
|
|
18
|
+
from diagram_quality import quality_issues
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class HumanizerFinding(TypedDict):
|
|
22
|
+
file: str
|
|
23
|
+
rule: str
|
|
24
|
+
severity: str
|
|
25
|
+
line: int
|
|
26
|
+
line_end: int
|
|
27
|
+
match: str
|
|
28
|
+
excerpt: str
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class HumanizerSummary(TypedDict):
|
|
32
|
+
block: int
|
|
33
|
+
warn: int
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class VisibleTextReport(TypedDict):
|
|
37
|
+
findings: list[HumanizerFinding]
|
|
38
|
+
summary: HumanizerSummary
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class DiagramReport(TypedDict):
|
|
42
|
+
issues: list[str]
|
|
43
|
+
metrics: DiagramMetrics
|
|
44
|
+
visibleText: VisibleTextReport
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class CorpusReport(TypedDict):
|
|
48
|
+
issues: list[str]
|
|
49
|
+
templatesChecked: int
|
|
50
|
+
examplesChecked: int
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def check_visible_text(text: str) -> VisibleTextReport:
|
|
54
|
+
"""Run the installed plugin's exact LitHumanizer rules on diagram text."""
|
|
55
|
+
raw = humanizer_detector.scan_text(text, rules=humanizer_detector.load_rules(), file="<stdin>")
|
|
56
|
+
findings: list[HumanizerFinding] = [
|
|
57
|
+
{
|
|
58
|
+
"file": str(item["file"]),
|
|
59
|
+
"rule": str(item["rule"]),
|
|
60
|
+
"severity": str(item["severity"]),
|
|
61
|
+
"line": int(item["line"]),
|
|
62
|
+
"line_end": int(item["line_end"]),
|
|
63
|
+
"match": str(item["match"]),
|
|
64
|
+
"excerpt": str(item["excerpt"]),
|
|
65
|
+
}
|
|
66
|
+
for item in raw
|
|
67
|
+
]
|
|
68
|
+
return {
|
|
69
|
+
"findings": findings,
|
|
70
|
+
"summary": {
|
|
71
|
+
"block": sum(item["severity"] == "block" for item in findings),
|
|
72
|
+
"warn": sum(item["severity"] == "warn" for item in findings),
|
|
73
|
+
},
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def verify_diagram(source: str, source_path: str = "<stdin>", *, enforce_canvas: bool = False) -> DiagramReport:
|
|
78
|
+
"""Run geometry, accessibility, and direct LitHumanizer checks for one source."""
|
|
79
|
+
metrics = source_metrics(source, source_path)
|
|
80
|
+
visible = check_visible_text(metrics["visibleText"])
|
|
81
|
+
issues = quality_issues(source, enforce_canvas=enforce_canvas)
|
|
82
|
+
blocks = [item for item in visible["findings"] if item["severity"] == "block"]
|
|
83
|
+
issues.extend(f"VISIBLE_TEXT_BLOCK {item['rule']} line={item['line']}" for item in blocks)
|
|
84
|
+
return {"issues": list(dict.fromkeys(issues)), "metrics": metrics, "visibleText": visible}
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def verify_corpus() -> CorpusReport:
|
|
88
|
+
"""Check every catalog template and every approved after-example in the payload."""
|
|
89
|
+
catalog: DiagramCatalog = json.loads((Path(__file__).resolve().parents[1] / "references" / "type-catalog.json").read_text(encoding="utf-8"))
|
|
90
|
+
audit: CatalogAudit = audit_catalog(catalog)
|
|
91
|
+
issues = list(audit["issues"])
|
|
92
|
+
if len(catalog["entries"]) != 61:
|
|
93
|
+
issues.append(f"CATALOG_COUNT expected=61 actual={len(catalog['entries'])}")
|
|
94
|
+
skill_root = Path(__file__).resolve().parents[1]
|
|
95
|
+
template_count = 0
|
|
96
|
+
for entry in catalog["entries"]:
|
|
97
|
+
for variant in ("light", "dark", "full"):
|
|
98
|
+
path = skill_root / "assets" / "examples" / f"type-{entry['id']}-{variant}.html"
|
|
99
|
+
if not path.is_file():
|
|
100
|
+
continue
|
|
101
|
+
template_count += 1
|
|
102
|
+
source = path.read_text(encoding="utf-8")
|
|
103
|
+
report = verify_diagram(source, str(path))
|
|
104
|
+
issues.extend(f"{path.name}: {issue}" for issue in report["issues"])
|
|
105
|
+
issues.extend(f"{path.name}: {issue}" for issue in verify_type(source, entry["id"]))
|
|
106
|
+
issues.extend(f"{path.name}: {issue}" for issue in verify_motion(source))
|
|
107
|
+
if template_count != 183:
|
|
108
|
+
issues.append(f"TEMPLATE_COUNT expected=183 actual={template_count}")
|
|
109
|
+
examples = sorted((skill_root / "examples").glob("*/after.html"))
|
|
110
|
+
for path in examples:
|
|
111
|
+
source = path.read_text(encoding="utf-8")
|
|
112
|
+
report = verify_diagram(source, str(path), enforce_canvas=True)
|
|
113
|
+
issues.extend(f"{path.parent.name}: {issue}" for issue in report["issues"])
|
|
114
|
+
issues.extend(f"{path.parent.name}: {issue}" for issue in verify_motion(source))
|
|
115
|
+
brief_path = path.with_name("brief.md")
|
|
116
|
+
if brief_path.is_file():
|
|
117
|
+
brief = check_brief(source, brief_path.read_text(encoding="utf-8"))
|
|
118
|
+
for key in ("missingNodes", "missingLabels", "missingEdges", "unpairedLabels", "languageMismatches"):
|
|
119
|
+
issues.extend(f"{path.parent.name}: BRIEF_{key.upper()} {value}" for value in brief[key])
|
|
120
|
+
issues.extend(f"{path.parent.name}: {issue}" for issue in brief["boundaryMembership"]["issues"])
|
|
121
|
+
if len(examples) != 8:
|
|
122
|
+
issues.append(f"EXAMPLE_COUNT expected=8 actual={len(examples)}")
|
|
123
|
+
return {"issues": list(dict.fromkeys(issues)), "templatesChecked": template_count, "examplesChecked": len(examples)}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"""Command-line boundaries for the bundled deterministic diagram checks."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import argparse
|
|
6
|
+
import json
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
import sys
|
|
9
|
+
|
|
10
|
+
from diagram_checks import check_brief, check_visible_text, verify_corpus, verify_diagram, verify_motion, verify_type
|
|
11
|
+
from diagram_metrics import source_metrics
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def _read_source(path: str) -> str:
|
|
15
|
+
return Path(path).expanduser().read_text(encoding="utf-8")
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def _emit_issues(label: str, issues: list[str]) -> int:
|
|
19
|
+
print(json.dumps({"result": label, "issues": issues}, ensure_ascii=False, indent=2))
|
|
20
|
+
return 1 if issues else 0
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def verify_diagram_main(argv: list[str] | None = None) -> int:
|
|
24
|
+
parser = argparse.ArgumentParser(description="Verify SVG geometry, accessibility, and visible text.")
|
|
25
|
+
parser.add_argument("source", help="diagram HTML or SVG")
|
|
26
|
+
parser.add_argument("--canvas", action="store_true", help="enforce title, font, and content-fill floors")
|
|
27
|
+
args = parser.parse_args(argv)
|
|
28
|
+
try:
|
|
29
|
+
report = verify_diagram(_read_source(args.source), args.source, enforce_canvas=args.canvas)
|
|
30
|
+
except OSError as error:
|
|
31
|
+
print(f"VERIFY_DIAGRAM_READ_ERROR {error}", file=sys.stderr)
|
|
32
|
+
return 2
|
|
33
|
+
print(json.dumps(report, ensure_ascii=False, indent=2))
|
|
34
|
+
return 1 if report["issues"] else 0
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def verify_type_main(argv: list[str] | None = None) -> int:
|
|
38
|
+
parser = argparse.ArgumentParser(description="Verify catalog identity and type-specific requirements.")
|
|
39
|
+
parser.add_argument("--type", required=True, help="catalog type ID")
|
|
40
|
+
parser.add_argument("source", help="diagram HTML or SVG")
|
|
41
|
+
args = parser.parse_args(argv)
|
|
42
|
+
try:
|
|
43
|
+
return _emit_issues("TYPE", verify_type(_read_source(args.source), args.type))
|
|
44
|
+
except OSError as error:
|
|
45
|
+
print(f"VERIFY_TYPE_READ_ERROR {error}", file=sys.stderr)
|
|
46
|
+
return 2
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def verify_brief_main(argv: list[str] | None = None) -> int:
|
|
50
|
+
parser = argparse.ArgumentParser(description="Check diagram content and trust-boundary membership against a brief.")
|
|
51
|
+
parser.add_argument("--brief", required=True, help="Markdown diagram brief")
|
|
52
|
+
parser.add_argument("source", help="diagram HTML or SVG")
|
|
53
|
+
args = parser.parse_args(argv)
|
|
54
|
+
try:
|
|
55
|
+
report = check_brief(_read_source(args.source), _read_source(args.brief))
|
|
56
|
+
except OSError as error:
|
|
57
|
+
print(f"VERIFY_BRIEF_READ_ERROR {error}", file=sys.stderr)
|
|
58
|
+
return 2
|
|
59
|
+
print(json.dumps(report, ensure_ascii=False, indent=2))
|
|
60
|
+
issues = [*report["missingNodes"], *report["missingLabels"], *report["missingEdges"], *report["unpairedLabels"], *report["languageMismatches"], *report["boundaryMembership"]["issues"]]
|
|
61
|
+
return 1 if issues else 0
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def verify_motion_main(argv: list[str] | None = None) -> int:
|
|
65
|
+
parser = argparse.ArgumentParser(description="Check SVG and CSS motion for bounded reduced-motion behavior.")
|
|
66
|
+
parser.add_argument("source", help="diagram HTML or SVG")
|
|
67
|
+
args = parser.parse_args(argv)
|
|
68
|
+
try:
|
|
69
|
+
return _emit_issues("MOTION", verify_motion(_read_source(args.source)))
|
|
70
|
+
except OSError as error:
|
|
71
|
+
print(f"VERIFY_MOTION_READ_ERROR {error}", file=sys.stderr)
|
|
72
|
+
return 2
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def check_visible_text_main(argv: list[str] | None = None) -> int:
|
|
76
|
+
parser = argparse.ArgumentParser(description="Run the product-local LitHumanizer detector on text or diagram HTML.")
|
|
77
|
+
parser.add_argument("source", help="text, diagram HTML, or SVG")
|
|
78
|
+
args = parser.parse_args(argv)
|
|
79
|
+
try:
|
|
80
|
+
source = _read_source(args.source)
|
|
81
|
+
except OSError as error:
|
|
82
|
+
print(f"CHECK_TEXT_READ_ERROR {error}", file=sys.stderr)
|
|
83
|
+
return 2
|
|
84
|
+
text = source_metrics(source, args.source)["visibleText"] if "<svg" in source.lower() else source
|
|
85
|
+
report = check_visible_text(text)
|
|
86
|
+
print(json.dumps(report, ensure_ascii=False, indent=2))
|
|
87
|
+
return 2 if report["summary"]["block"] else 1 if report["summary"]["warn"] else 0
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def verify_corpus_main(argv: list[str] | None = None) -> int:
|
|
91
|
+
argparse.ArgumentParser(description="Verify all 183 catalog templates and eight after-examples.").parse_args(argv)
|
|
92
|
+
report = verify_corpus()
|
|
93
|
+
print(json.dumps(report, ensure_ascii=False, indent=2))
|
|
94
|
+
return 1 if report["issues"] else 0
|