@litfamily/lithermes 1.0.7 → 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.
Files changed (652) hide show
  1. package/README.md +299 -13
  2. package/README_Ko-KR.md +300 -14
  3. package/assets/lithermes-plugin/README.md +17 -6
  4. package/assets/lithermes-plugin/__init__.py +96 -21
  5. package/assets/lithermes-plugin/core.py +15 -6
  6. package/assets/lithermes-plugin/core_commands.py +140 -28
  7. package/assets/lithermes-plugin/core_contexts.py +88 -15
  8. package/assets/lithermes-plugin/core_contract.py +118 -9
  9. package/assets/lithermes-plugin/core_routing.py +197 -8
  10. package/assets/lithermes-plugin/deliverable_hedge_guard.py +378 -357
  11. package/assets/lithermes-plugin/diagnostics.py +76 -8
  12. package/assets/lithermes-plugin/humanizer_detector.py +348 -0
  13. package/assets/lithermes-plugin/humanizer_ko_metrics.py +108 -0
  14. package/assets/lithermes-plugin/humanizer_office.py +18 -0
  15. package/assets/lithermes-plugin/lit_mark.py +1 -1
  16. package/assets/lithermes-plugin/motion_receipts.py +80 -0
  17. package/assets/lithermes-plugin/payload-version.json +2240 -64
  18. package/assets/lithermes-plugin/plugin.yaml +1 -1
  19. package/assets/lithermes-plugin/rules/bundled-rules/lit-humanizer.md +14 -0
  20. package/assets/lithermes-plugin/skills/autoconference/assets/report_template.md +2 -1
  21. package/assets/lithermes-plugin/skills/autoconference/modes/ship/SKILL.md +11 -8
  22. package/assets/lithermes-plugin/skills/autoresearch/modes/ship/type-checklists.md +2 -2
  23. package/assets/lithermes-plugin/skills/browser-drive/ORIGIN.json +17 -0
  24. package/assets/lithermes-plugin/skills/browser-drive/SKILL.md +41 -16
  25. package/assets/lithermes-plugin/skills/browser-drive/scripts/capability_probe.py +122 -10
  26. package/assets/lithermes-plugin/skills/frontend-ui-ux/SKILL.md +45 -13
  27. package/assets/lithermes-plugin/skills/frontend-ui-ux/examples/phase-3-readme-ab/README.md +51 -0
  28. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/README.md +44 -0
  29. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/adaptive-layout.md +34 -62
  30. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/brand-and-imagery.md +22 -70
  31. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/complete-contract.md +18 -4
  32. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/composition.md +27 -78
  33. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/craft-floor.md +74 -0
  34. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/creative-directions.md +25 -69
  35. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/evidence-review.md +18 -97
  36. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/implementation-platforms.md +23 -83
  37. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/inclusive-interface.md +22 -70
  38. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/interaction-motion.md +34 -68
  39. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/motion-guide.md +62 -0
  40. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/operating-lanes.md +14 -78
  41. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/performance-delivery.md +22 -71
  42. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/product-direction.md +17 -70
  43. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/production.md +19 -7
  44. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/redesign-playbook.md +23 -76
  45. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/slop-register.md +69 -0
  46. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/system-foundations.md +22 -67
  47. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/visual-language.md +16 -72
  48. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/visual-reconstruction.md +16 -81
  49. package/assets/lithermes-plugin/skills/frontend-ui-ux/resources/THIRD-PARTY-NOTICE.txt +15 -0
  50. package/assets/lithermes-plugin/skills/frontend-ui-ux/scripts/probe-page.js +311 -0
  51. package/assets/lithermes-plugin/skills/frontend-ui-ux/scripts/probe-rules.json +46 -0
  52. package/assets/lithermes-plugin/skills/frontend-ui-ux/scripts/probe.mjs +231 -0
  53. package/assets/lithermes-plugin/skills/lit-comprehend/SKILL.md +36 -25
  54. package/assets/lithermes-plugin/skills/lit-comprehend/references/artifact-template.md +45 -87
  55. package/assets/lithermes-plugin/skills/lit-comprehend/scripts/verify-explainer.py +3 -27
  56. package/assets/lithermes-plugin/skills/lit-diagram-drawer/NOTICE +33 -0
  57. package/assets/lithermes-plugin/skills/lit-diagram-drawer/SKILL.md +308 -0
  58. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-architecture-dark.html +1 -0
  59. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-architecture-full.html +1 -0
  60. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-architecture-light.html +1 -0
  61. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-bar-dark.html +1 -0
  62. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-bar-full.html +1 -0
  63. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-bar-light.html +1 -0
  64. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-beeswarm-dark.html +1 -0
  65. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-beeswarm-full.html +1 -0
  66. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-beeswarm-light.html +1 -0
  67. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-bubble-dark.html +1 -0
  68. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-bubble-full.html +1 -0
  69. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-bubble-light.html +1 -0
  70. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-bump-dark.html +1 -0
  71. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-bump-full.html +1 -0
  72. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-bump-light.html +1 -0
  73. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-data-flow-dark.html +1 -0
  74. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-data-flow-full.html +1 -0
  75. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-data-flow-light.html +1 -0
  76. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-datalake-dark.html +1 -0
  77. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-datalake-full.html +1 -0
  78. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-datalake-light.html +1 -0
  79. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-db-schema-dark.html +1 -0
  80. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-db-schema-full.html +1 -0
  81. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-db-schema-light.html +1 -0
  82. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-dependency-dark.html +1 -0
  83. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-dependency-full.html +1 -0
  84. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-dependency-light.html +1 -0
  85. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-deployment-dark.html +1 -0
  86. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-deployment-full.html +1 -0
  87. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-deployment-light.html +1 -0
  88. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-dp-integration-dark.html +1 -0
  89. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-dp-integration-full.html +1 -0
  90. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-dp-integration-light.html +1 -0
  91. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-dp-security-matrix-dark.html +1 -0
  92. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-dp-security-matrix-full.html +1 -0
  93. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-dp-security-matrix-light.html +1 -0
  94. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-er-dark.html +1 -0
  95. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-er-full.html +1 -0
  96. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-er-light.html +1 -0
  97. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-fishbone-dark.html +1 -0
  98. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-fishbone-full.html +1 -0
  99. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-fishbone-light.html +1 -0
  100. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-flowchart-dark.html +1 -0
  101. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-flowchart-full.html +1 -0
  102. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-flowchart-light.html +1 -0
  103. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-gantt-dark.html +1 -0
  104. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-gantt-full.html +1 -0
  105. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-gantt-light.html +1 -0
  106. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-heatmap-dark.html +1 -0
  107. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-heatmap-full.html +1 -0
  108. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-heatmap-light.html +1 -0
  109. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-high-level-dark.html +1 -0
  110. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-high-level-full.html +1 -0
  111. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-high-level-light.html +1 -0
  112. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-high-level-vertical-dark.html +1 -0
  113. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-high-level-vertical-full.html +1 -0
  114. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-high-level-vertical-light.html +1 -0
  115. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-import-drawio-dark.html +1 -0
  116. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-import-drawio-full.html +1 -0
  117. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-import-drawio-light.html +1 -0
  118. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-import-excalidraw-dark.html +1 -0
  119. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-import-excalidraw-full.html +1 -0
  120. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-import-excalidraw-light.html +1 -0
  121. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-import-mermaid-dark.html +1 -0
  122. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-import-mermaid-full.html +1 -0
  123. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-import-mermaid-light.html +1 -0
  124. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-it-state-dark.html +1 -0
  125. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-it-state-full.html +1 -0
  126. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-it-state-light.html +1 -0
  127. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-journey-dark.html +1 -0
  128. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-journey-full.html +1 -0
  129. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-journey-light.html +1 -0
  130. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-kanban-dark.html +1 -0
  131. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-kanban-full.html +1 -0
  132. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-kanban-light.html +1 -0
  133. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-layers-dark.html +1 -0
  134. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-layers-full.html +1 -0
  135. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-layers-light.html +1 -0
  136. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-line-dark.html +1 -0
  137. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-line-full.html +1 -0
  138. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-line-light.html +1 -0
  139. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-loop-dark.html +1 -0
  140. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-loop-full.html +1 -0
  141. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-loop-light.html +1 -0
  142. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-loop-terminal-dark.html +1 -0
  143. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-loop-terminal-full.html +1 -0
  144. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-loop-terminal-light.html +1 -0
  145. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-marimekko-dark.html +1 -0
  146. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-marimekko-full.html +1 -0
  147. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-marimekko-light.html +1 -0
  148. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-medallion-dark.html +1 -0
  149. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-medallion-full.html +1 -0
  150. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-medallion-light.html +1 -0
  151. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-nested-dark.html +1 -0
  152. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-nested-full.html +1 -0
  153. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-nested-light.html +1 -0
  154. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-org-chart-dark.html +1 -0
  155. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-org-chart-full.html +1 -0
  156. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-org-chart-light.html +1 -0
  157. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-paved-road-animated-dark.html +1 -0
  158. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-paved-road-animated-full.html +1 -0
  159. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-paved-road-animated-light.html +1 -0
  160. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-polar-dark.html +1 -0
  161. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-polar-full.html +1 -0
  162. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-polar-light.html +1 -0
  163. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-policy-trace-animated-dark.html +1 -0
  164. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-policy-trace-animated-full.html +1 -0
  165. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-policy-trace-animated-light.html +1 -0
  166. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-process-dark.html +1 -0
  167. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-process-full.html +1 -0
  168. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-process-light.html +1 -0
  169. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-pyramid-dark.html +1 -0
  170. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-pyramid-full.html +1 -0
  171. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-pyramid-light.html +1 -0
  172. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-quadrant-consultant-dark.html +1 -0
  173. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-quadrant-consultant-full.html +1 -0
  174. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-quadrant-consultant-light.html +1 -0
  175. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-quadrant-dark.html +1 -0
  176. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-quadrant-full.html +1 -0
  177. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-quadrant-light.html +1 -0
  178. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-queue-animated-dark.html +1 -0
  179. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-queue-animated-full.html +1 -0
  180. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-queue-animated-light.html +1 -0
  181. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-radar-dark.html +1 -0
  182. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-radar-full.html +1 -0
  183. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-radar-light.html +1 -0
  184. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-ridgeline-dark.html +1 -0
  185. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-ridgeline-full.html +1 -0
  186. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-ridgeline-light.html +1 -0
  187. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-sankey-dark.html +1 -0
  188. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-sankey-full.html +1 -0
  189. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-sankey-light.html +1 -0
  190. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-scatter-dark.html +1 -0
  191. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-scatter-full.html +1 -0
  192. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-scatter-light.html +1 -0
  193. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-sequence-dark.html +1 -0
  194. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-sequence-full.html +1 -0
  195. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-sequence-light.html +1 -0
  196. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-sequence-oauth-dark.html +1 -0
  197. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-sequence-oauth-full.html +1 -0
  198. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-sequence-oauth-light.html +1 -0
  199. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-slopegraph-dark.html +1 -0
  200. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-slopegraph-full.html +1 -0
  201. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-slopegraph-light.html +1 -0
  202. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-state-dark.html +1 -0
  203. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-state-full.html +1 -0
  204. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-state-lifecycle-dark.html +1 -0
  205. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-state-lifecycle-full.html +1 -0
  206. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-state-lifecycle-light.html +1 -0
  207. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-state-light.html +1 -0
  208. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-story-map-dark.html +1 -0
  209. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-story-map-full.html +1 -0
  210. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-story-map-light.html +1 -0
  211. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-streamgraph-dark.html +1 -0
  212. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-streamgraph-full.html +1 -0
  213. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-streamgraph-light.html +1 -0
  214. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-swimlane-dark.html +1 -0
  215. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-swimlane-full.html +1 -0
  216. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-swimlane-light.html +1 -0
  217. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-timeline-dark.html +1 -0
  218. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-timeline-full.html +1 -0
  219. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-timeline-light.html +1 -0
  220. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-tree-block-decomposition-dark.html +1 -0
  221. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-tree-block-decomposition-full.html +1 -0
  222. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-tree-block-decomposition-light.html +1 -0
  223. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-tree-dark.html +1 -0
  224. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-tree-full.html +1 -0
  225. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-tree-light.html +1 -0
  226. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-treemap-dark.html +1 -0
  227. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-treemap-full.html +1 -0
  228. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-treemap-light.html +1 -0
  229. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-uml-class-dark.html +1 -0
  230. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-uml-class-full.html +1 -0
  231. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-uml-class-light.html +1 -0
  232. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-venn-dark.html +1 -0
  233. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-venn-full.html +1 -0
  234. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-venn-light.html +1 -0
  235. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-wardley-dark.html +1 -0
  236. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-wardley-full.html +1 -0
  237. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-wardley-light.html +1 -0
  238. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-waterfall-dark.html +1 -0
  239. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-waterfall-full.html +1 -0
  240. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/examples/type-waterfall-light.html +1 -0
  241. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/fonts/OFL.txt +94 -0
  242. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/fonts/PretendardVariable.woff2 +0 -0
  243. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/fonts/provenance.json +22 -0
  244. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/icons.html +231 -0
  245. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/index.html +1 -0
  246. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/licenses/devicon-MIT.txt +20 -0
  247. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/licenses/diagram-design-MIT.txt +21 -0
  248. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/licenses/log-z-MIT.txt +21 -0
  249. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/licenses/simple-icons-CC0.md +30 -0
  250. package/assets/lithermes-plugin/skills/lit-diagram-drawer/assets/licenses/tabler-MIT.txt +21 -0
  251. package/assets/lithermes-plugin/skills/lit-diagram-drawer/examples/01-service-architecture/after.html +1 -0
  252. package/assets/lithermes-plugin/skills/lit-diagram-drawer/examples/01-service-architecture/brief.md +33 -0
  253. package/assets/lithermes-plugin/skills/lit-diagram-drawer/examples/02-release-decision/after.html +1 -0
  254. package/assets/lithermes-plugin/skills/lit-diagram-drawer/examples/02-release-decision/brief.md +18 -0
  255. package/assets/lithermes-plugin/skills/lit-diagram-drawer/examples/03-data-retention/after.html +1 -0
  256. package/assets/lithermes-plugin/skills/lit-diagram-drawer/examples/03-data-retention/brief.md +19 -0
  257. package/assets/lithermes-plugin/skills/lit-diagram-drawer/examples/04-oauth-sequence/after.html +1 -0
  258. package/assets/lithermes-plugin/skills/lit-diagram-drawer/examples/04-oauth-sequence/brief.md +17 -0
  259. package/assets/lithermes-plugin/skills/lit-diagram-drawer/examples/05-review-lanes/after.html +1 -0
  260. package/assets/lithermes-plugin/skills/lit-diagram-drawer/examples/05-review-lanes/brief.md +17 -0
  261. package/assets/lithermes-plugin/skills/lit-diagram-drawer/examples/06-rollout-gates/after.html +1 -0
  262. package/assets/lithermes-plugin/skills/lit-diagram-drawer/examples/06-rollout-gates/brief.md +17 -0
  263. package/assets/lithermes-plugin/skills/lit-diagram-drawer/examples/07-deployment-boundary/after.html +1 -0
  264. package/assets/lithermes-plugin/skills/lit-diagram-drawer/examples/07-deployment-boundary/brief.md +19 -0
  265. package/assets/lithermes-plugin/skills/lit-diagram-drawer/examples/08-policy-traces/after.html +1 -0
  266. package/assets/lithermes-plugin/skills/lit-diagram-drawer/examples/08-policy-traces/brief.md +20 -0
  267. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/accessibility.md +37 -0
  268. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/export.md +29 -0
  269. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/import-drawio.md +21 -0
  270. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/import-excalidraw.md +14 -0
  271. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/import-mermaid.md +18 -0
  272. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/import-schema.md +28 -0
  273. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/korean-typography.md +34 -0
  274. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/motion.md +29 -0
  275. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/office-pptx-docx.md +40 -0
  276. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/output-spec.md +48 -0
  277. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/primitive-annotation.md +12 -0
  278. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/primitive-icons.md +21 -0
  279. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/primitive-sketchy.md +11 -0
  280. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/primitive-terminal.md +11 -0
  281. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/profiles.md +24 -0
  282. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/semantic-patterns.md +27 -0
  283. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/style-guide.md +67 -0
  284. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-architecture.md +51 -0
  285. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-bar.md +51 -0
  286. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-beeswarm.md +49 -0
  287. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-bubble.md +49 -0
  288. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-bump.md +49 -0
  289. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-catalog.json +1433 -0
  290. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-data-flow.md +51 -0
  291. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-datalake.md +49 -0
  292. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-db-schema.md +49 -0
  293. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-dependency.md +49 -0
  294. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-deployment.md +49 -0
  295. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-dp-integration.md +49 -0
  296. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-dp-security-matrix.md +49 -0
  297. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-er.md +49 -0
  298. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-fishbone.md +49 -0
  299. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-flowchart.md +49 -0
  300. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-gantt.md +49 -0
  301. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-heatmap.md +53 -0
  302. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-high-level-vertical.md +53 -0
  303. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-high-level.md +53 -0
  304. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-import-drawio.md +53 -0
  305. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-import-excalidraw.md +53 -0
  306. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-import-mermaid.md +53 -0
  307. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-it-state.md +54 -0
  308. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-journey.md +54 -0
  309. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-kanban.md +54 -0
  310. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-layers.md +54 -0
  311. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-line.md +54 -0
  312. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-loop-terminal.md +53 -0
  313. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-loop.md +54 -0
  314. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-marimekko.md +54 -0
  315. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-medallion.md +54 -0
  316. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-nested.md +59 -0
  317. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-org-chart.md +58 -0
  318. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-paved-road-animated.md +72 -0
  319. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-polar.md +67 -0
  320. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-policy-trace-animated.md +69 -0
  321. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-process.md +58 -0
  322. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-pyramid.md +59 -0
  323. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-quadrant-consultant.md +60 -0
  324. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-quadrant.md +57 -0
  325. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-queue-animated.md +63 -0
  326. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-radar.md +57 -0
  327. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-ridgeline.md +63 -0
  328. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-sankey.md +68 -0
  329. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-scatter.md +60 -0
  330. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-sequence-oauth.md +66 -0
  331. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-sequence.md +63 -0
  332. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-slopegraph.md +65 -0
  333. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-state-lifecycle.md +53 -0
  334. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-state.md +59 -0
  335. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-story-map.md +52 -0
  336. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-streamgraph.md +53 -0
  337. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-swimlane.md +52 -0
  338. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-timeline.md +52 -0
  339. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-tree-block-decomposition.md +57 -0
  340. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-tree.md +54 -0
  341. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-treemap.md +54 -0
  342. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-uml-class.md +52 -0
  343. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-venn.md +51 -0
  344. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-wardley.md +52 -0
  345. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-waterfall.md +54 -0
  346. package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/verifier-guide.md +31 -0
  347. package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/block-registry.mjs +43 -0
  348. package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/browser-version.mjs +12 -0
  349. package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/check-visible-text.py +12 -0
  350. package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/diagram_brief.py +192 -0
  351. package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/diagram_catalog.py +135 -0
  352. package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/diagram_checks.py +123 -0
  353. package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/diagram_cli.py +94 -0
  354. package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/diagram_geometry.py +130 -0
  355. package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/diagram_metrics.py +166 -0
  356. package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/diagram_quality.py +293 -0
  357. package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/diagram_quality_geometry.py +200 -0
  358. package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/diagram_records.py +205 -0
  359. package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/diagram_sequence.py +55 -0
  360. package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/doctor.mjs +24 -0
  361. package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/drawio_extract.py +209 -0
  362. package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/drawio_source.py +188 -0
  363. package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/excalidraw_extract.py +233 -0
  364. package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/excalidraw_support.py +64 -0
  365. package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/export.mjs +125 -0
  366. package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/mermaid_extract.py +240 -0
  367. package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/mermaid_source.py +39 -0
  368. package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/office-safety.mjs +54 -0
  369. package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/verify-all.py +12 -0
  370. package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/verify-brief.py +12 -0
  371. package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/verify-diagram.py +12 -0
  372. package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/verify-motion.py +12 -0
  373. package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/verify-type.py +12 -0
  374. package/assets/lithermes-plugin/skills/lit-docx/NOTICE +1 -0
  375. package/assets/lithermes-plugin/skills/lit-docx/SKILL.md +97 -0
  376. package/assets/lithermes-plugin/skills/lit-docx/references/frontmatter_schema.md +42 -0
  377. package/assets/lithermes-plugin/skills/lit-docx/references/journal_style_spec.md +17 -0
  378. package/assets/lithermes-plugin/skills/lit-docx/references/markdown_quality_checklist.md +37 -0
  379. package/assets/lithermes-plugin/skills/lit-docx/references/slop_phrase_list.yaml +58 -0
  380. package/assets/lithermes-plugin/skills/lit-docx/references/slop_rules.md +35 -0
  381. package/assets/lithermes-plugin/skills/lit-docx/scripts/clean_markdown.py +95 -0
  382. package/assets/lithermes-plugin/skills/lit-docx/scripts/convert_md_to_docx.py +1041 -0
  383. package/assets/lithermes-plugin/skills/lit-docx/scripts/convert_md_to_pdf.py +281 -0
  384. package/assets/lithermes-plugin/skills/lit-docx/scripts/convert_pdf.py +130 -0
  385. package/assets/lithermes-plugin/skills/lit-docx/scripts/edit_docx.py +297 -0
  386. package/assets/lithermes-plugin/skills/lit-docx/scripts/embed_images.py +78 -0
  387. package/assets/lithermes-plugin/skills/lit-docx/scripts/generate_docx_templates.py +491 -0
  388. package/assets/lithermes-plugin/skills/lit-docx/scripts/slop_lint.py +536 -0
  389. package/assets/lithermes-plugin/skills/lit-docx/scripts/visual_audit.py +41 -0
  390. package/assets/lithermes-plugin/skills/lit-docx/templates/docx/acs.docx +0 -0
  391. package/assets/lithermes-plugin/skills/lit-docx/templates/docx/elsevier.docx +0 -0
  392. package/assets/lithermes-plugin/skills/lit-docx/templates/docx/ieee.docx +0 -0
  393. package/assets/lithermes-plugin/skills/lit-docx/templates/docx/korean-generic.docx +0 -0
  394. package/assets/lithermes-plugin/skills/lit-docx/templates/docx/nature.docx +0 -0
  395. package/assets/lithermes-plugin/skills/lit-docx/templates/latex/acs/README.md +5 -0
  396. package/assets/lithermes-plugin/skills/lit-docx/templates/latex/acs/template.tex +37 -0
  397. package/assets/lithermes-plugin/skills/lit-docx/templates/latex/elsevier/README.md +5 -0
  398. package/assets/lithermes-plugin/skills/lit-docx/templates/latex/elsevier/template.tex +38 -0
  399. package/assets/lithermes-plugin/skills/lit-docx/templates/latex/ieee/README.md +5 -0
  400. package/assets/lithermes-plugin/skills/lit-docx/templates/latex/ieee/template.tex +37 -0
  401. package/assets/lithermes-plugin/skills/lit-docx/templates/latex/korean-generic/README.md +5 -0
  402. package/assets/lithermes-plugin/skills/lit-docx/templates/latex/korean-generic/template.tex +37 -0
  403. package/assets/lithermes-plugin/skills/lit-docx/templates/latex/nature/README.md +5 -0
  404. package/assets/lithermes-plugin/skills/lit-docx/templates/latex/nature/template.tex +37 -0
  405. package/assets/lithermes-plugin/skills/lit-docx/templates/registry.yaml +1366 -0
  406. package/assets/lithermes-plugin/skills/lit-humanizer/NOTICE +170 -0
  407. package/assets/lithermes-plugin/skills/lit-humanizer/SKILL.md +125 -0
  408. package/assets/lithermes-plugin/skills/lit-humanizer/assets/report-skeleton.md +26 -0
  409. package/assets/lithermes-plugin/skills/lit-humanizer/assets/slide-text-skeleton.md +30 -0
  410. package/assets/lithermes-plugin/skills/lit-humanizer/examples/accessibility-note/after.md +7 -0
  411. package/assets/lithermes-plugin/skills/lit-humanizer/examples/accessibility-note/before.md +7 -0
  412. package/assets/lithermes-plugin/skills/lit-humanizer/examples/api-reference/after.md +9 -0
  413. package/assets/lithermes-plugin/skills/lit-humanizer/examples/api-reference/before.md +15 -0
  414. package/assets/lithermes-plugin/skills/lit-humanizer/examples/changelog/after.md +5 -0
  415. package/assets/lithermes-plugin/skills/lit-humanizer/examples/changelog/before.md +12 -0
  416. package/assets/lithermes-plugin/skills/lit-humanizer/examples/code-comments/after.md +10 -0
  417. package/assets/lithermes-plugin/skills/lit-humanizer/examples/code-comments/before.md +19 -0
  418. package/assets/lithermes-plugin/skills/lit-humanizer/examples/commit/after.md +5 -0
  419. package/assets/lithermes-plugin/skills/lit-humanizer/examples/commit/before.md +7 -0
  420. package/assets/lithermes-plugin/skills/lit-humanizer/examples/data-release/after.md +7 -0
  421. package/assets/lithermes-plugin/skills/lit-humanizer/examples/data-release/before.md +9 -0
  422. package/assets/lithermes-plugin/skills/lit-humanizer/examples/detector-validation/ko-metrics-golden.json +49 -0
  423. package/assets/lithermes-plugin/skills/lit-humanizer/examples/detector-validation/pos-real.txt +26 -0
  424. package/assets/lithermes-plugin/skills/lit-humanizer/examples/detector-validation/rule-cases.json +306 -0
  425. package/assets/lithermes-plugin/skills/lit-humanizer/examples/english-essay/after.md +5 -0
  426. package/assets/lithermes-plugin/skills/lit-humanizer/examples/english-essay/before.md +5 -0
  427. package/assets/lithermes-plugin/skills/lit-humanizer/examples/incident-update/after.md +7 -0
  428. package/assets/lithermes-plugin/skills/lit-humanizer/examples/incident-update/before.md +7 -0
  429. package/assets/lithermes-plugin/skills/lit-humanizer/examples/ko-essay/after.md +7 -0
  430. package/assets/lithermes-plugin/skills/lit-humanizer/examples/ko-essay/before.md +9 -0
  431. package/assets/lithermes-plugin/skills/lit-humanizer/examples/ko-report/after.md +9 -0
  432. package/assets/lithermes-plugin/skills/lit-humanizer/examples/ko-report/before.md +13 -0
  433. package/assets/lithermes-plugin/skills/lit-humanizer/examples/ko-slide/after.md +19 -0
  434. package/assets/lithermes-plugin/skills/lit-humanizer/examples/ko-slide/before.md +21 -0
  435. package/assets/lithermes-plugin/skills/lit-humanizer/examples/meeting-brief/after.md +9 -0
  436. package/assets/lithermes-plugin/skills/lit-humanizer/examples/meeting-brief/before.md +11 -0
  437. package/assets/lithermes-plugin/skills/lit-humanizer/examples/policy-faq/after.md +9 -0
  438. package/assets/lithermes-plugin/skills/lit-humanizer/examples/policy-faq/before.md +9 -0
  439. package/assets/lithermes-plugin/skills/lit-humanizer/examples/pr/after.md +15 -0
  440. package/assets/lithermes-plugin/skills/lit-humanizer/examples/pr/before.md +17 -0
  441. package/assets/lithermes-plugin/skills/lit-humanizer/examples/project-update/after.md +7 -0
  442. package/assets/lithermes-plugin/skills/lit-humanizer/examples/project-update/before.md +9 -0
  443. package/assets/lithermes-plugin/skills/lit-humanizer/examples/readme/after.md +12 -0
  444. package/assets/lithermes-plugin/skills/lit-humanizer/examples/readme/before.md +14 -0
  445. package/assets/lithermes-plugin/skills/lit-humanizer/examples/report/after.md +13 -0
  446. package/assets/lithermes-plugin/skills/lit-humanizer/examples/report/before.md +11 -0
  447. package/assets/lithermes-plugin/skills/lit-humanizer/examples/research-abstract/after.md +5 -0
  448. package/assets/lithermes-plugin/skills/lit-humanizer/examples/research-abstract/before.md +5 -0
  449. package/assets/lithermes-plugin/skills/lit-humanizer/examples/slides/after.md +19 -0
  450. package/assets/lithermes-plugin/skills/lit-humanizer/examples/slides/before.md +19 -0
  451. package/assets/lithermes-plugin/skills/lit-humanizer/examples/troubleshooting/after.md +11 -0
  452. package/assets/lithermes-plugin/skills/lit-humanizer/examples/troubleshooting/before.md +11 -0
  453. package/assets/lithermes-plugin/skills/lit-humanizer/references/README.md +16 -0
  454. package/assets/lithermes-plugin/skills/lit-humanizer/references/always-on-rule.md +9 -0
  455. package/assets/lithermes-plugin/skills/lit-humanizer/references/code-patterns.md +468 -0
  456. package/assets/lithermes-plugin/skills/lit-humanizer/references/deliverable-channels.md +111 -0
  457. package/assets/lithermes-plugin/skills/lit-humanizer/references/en-patterns-checklist.md +43 -0
  458. package/assets/lithermes-plugin/skills/lit-humanizer/references/en-patterns-content.md +243 -0
  459. package/assets/lithermes-plugin/skills/lit-humanizer/references/en-patterns-structure.md +375 -0
  460. package/assets/lithermes-plugin/skills/lit-humanizer/references/en-patterns.md +57 -0
  461. package/assets/lithermes-plugin/skills/lit-humanizer/references/ko-metrics.md +33 -0
  462. package/assets/lithermes-plugin/skills/lit-humanizer/references/ko-patterns-a-d.md +659 -0
  463. package/assets/lithermes-plugin/skills/lit-humanizer/references/ko-patterns-e-j.md +387 -0
  464. package/assets/lithermes-plugin/skills/lit-humanizer/references/ko-patterns.md +31 -0
  465. package/assets/lithermes-plugin/skills/lit-humanizer/references/rewrite-playbook.md +54 -0
  466. package/assets/lithermes-plugin/skills/lit-humanizer/references/taxonomy.md +153 -0
  467. package/assets/lithermes-plugin/skills/lit-humanizer/rules.json +884 -0
  468. package/assets/lithermes-plugin/skills/lit-humanizer/scripts/detect.py +17 -0
  469. package/assets/lithermes-plugin/skills/lit-humanizer/scripts/extract_office_text.py +114 -0
  470. package/assets/lithermes-plugin/skills/lit-humanizer/scripts/ko_metrics.py +35 -0
  471. package/assets/lithermes-plugin/skills/lit-pptx/NOTICE +1 -0
  472. package/assets/lithermes-plugin/skills/lit-pptx/SKILL.md +109 -0
  473. package/assets/lithermes-plugin/skills/lit-pptx/agents/analyst.md +49 -0
  474. package/assets/lithermes-plugin/skills/lit-pptx/agents/antithesis.md +65 -0
  475. package/assets/lithermes-plugin/skills/lit-pptx/agents/architect.md +44 -0
  476. package/assets/lithermes-plugin/skills/lit-pptx/agents/critic.md +42 -0
  477. package/assets/lithermes-plugin/skills/lit-pptx/agents/synthesizer.md +47 -0
  478. package/assets/lithermes-plugin/skills/lit-pptx/agents/thesis.md +33 -0
  479. package/assets/lithermes-plugin/skills/lit-pptx/assets/azure/circle-lg.png +0 -0
  480. package/assets/lithermes-plugin/skills/lit-pptx/assets/azure/circle-md.png +0 -0
  481. package/assets/lithermes-plugin/skills/lit-pptx/assets/azure/circle-sm.png +0 -0
  482. package/assets/lithermes-plugin/skills/lit-pptx/bin/office.mjs +77 -0
  483. package/assets/lithermes-plugin/skills/lit-pptx/fonts/PRETENDARD-OFL.txt +94 -0
  484. package/assets/lithermes-plugin/skills/lit-pptx/fonts/a2z-font/A2Z-Black.otf +0 -0
  485. package/assets/lithermes-plugin/skills/lit-pptx/fonts/a2z-font/A2Z-Bold.otf +0 -0
  486. package/assets/lithermes-plugin/skills/lit-pptx/fonts/a2z-font/A2Z-ExtraBold.otf +0 -0
  487. package/assets/lithermes-plugin/skills/lit-pptx/fonts/a2z-font/A2Z-ExtraLight.otf +0 -0
  488. package/assets/lithermes-plugin/skills/lit-pptx/fonts/a2z-font/A2Z-Light.otf +0 -0
  489. package/assets/lithermes-plugin/skills/lit-pptx/fonts/a2z-font/A2Z-Medium.otf +0 -0
  490. package/assets/lithermes-plugin/skills/lit-pptx/fonts/a2z-font/A2Z-Regular.otf +0 -0
  491. package/assets/lithermes-plugin/skills/lit-pptx/fonts/a2z-font/A2Z-SemiBold.otf +0 -0
  492. package/assets/lithermes-plugin/skills/lit-pptx/fonts/a2z-font/A2Z-Thin.otf +0 -0
  493. package/assets/lithermes-plugin/skills/lit-pptx/fonts/a2z-font/OFL.txt +94 -0
  494. package/assets/lithermes-plugin/skills/lit-pptx/fonts/a2z-font/SOURCE.md +29 -0
  495. package/assets/lithermes-plugin/skills/lit-pptx/pretendard-font/public/static/PretendardGOV-Bold.otf +0 -0
  496. package/assets/lithermes-plugin/skills/lit-pptx/pretendard-font/public/static/PretendardGOV-Regular.otf +0 -0
  497. package/assets/lithermes-plugin/skills/lit-pptx/references/anti-slop-checklist.md +71 -0
  498. package/assets/lithermes-plugin/skills/lit-pptx/references/authoring-guide.md +139 -0
  499. package/assets/lithermes-plugin/skills/lit-pptx/references/consensus-protocol.md +125 -0
  500. package/assets/lithermes-plugin/skills/lit-pptx/references/data-display-cookbook.md +45 -0
  501. package/assets/lithermes-plugin/skills/lit-pptx/references/design-system-azure.md +58 -0
  502. package/assets/lithermes-plugin/skills/lit-pptx/runtime/package-lock.json +750 -0
  503. package/assets/lithermes-plugin/skills/lit-pptx/runtime/package.json +15 -0
  504. package/assets/lithermes-plugin/skills/lit-pptx/runtime/requirements.in +7 -0
  505. package/assets/lithermes-plugin/skills/lit-pptx/runtime/requirements.lock +391 -0
  506. package/assets/lithermes-plugin/skills/lit-pptx/scripts/compile-deck.js +447 -0
  507. package/assets/lithermes-plugin/skills/lit-pptx/scripts/craft_extras.py +215 -0
  508. package/assets/lithermes-plugin/skills/lit-pptx/scripts/embed_fonts.py +199 -0
  509. package/assets/lithermes-plugin/skills/lit-pptx/scripts/integrity.py +60 -0
  510. package/assets/lithermes-plugin/skills/lit-pptx/scripts/inventory.py +64 -0
  511. package/assets/lithermes-plugin/skills/lit-pptx/scripts/learn_template.py +433 -0
  512. package/assets/lithermes-plugin/skills/lit-pptx/scripts/lib/derive-palette.js +176 -0
  513. package/assets/lithermes-plugin/skills/lit-pptx/scripts/lib/directive-parser.js +244 -0
  514. package/assets/lithermes-plugin/skills/lit-pptx/scripts/lib/font-map.js +79 -0
  515. package/assets/lithermes-plugin/skills/lit-pptx/scripts/lib/gen-bg.js +85 -0
  516. package/assets/lithermes-plugin/skills/lit-pptx/scripts/lib/gen-gradient-assets.js +36 -0
  517. package/assets/lithermes-plugin/skills/lit-pptx/scripts/lib/layout-resolver.js +736 -0
  518. package/assets/lithermes-plugin/skills/lit-pptx/scripts/lib/markdown-loader.js +136 -0
  519. package/assets/lithermes-plugin/skills/lit-pptx/scripts/lib/render-adapter-html.js +357 -0
  520. package/assets/lithermes-plugin/skills/lit-pptx/scripts/lib/render-adapter-pptx.js +1864 -0
  521. package/assets/lithermes-plugin/skills/lit-pptx/scripts/lib/slide-ast.js +539 -0
  522. package/assets/lithermes-plugin/skills/lit-pptx/scripts/lib/spec-validator.js +94 -0
  523. package/assets/lithermes-plugin/skills/lit-pptx/scripts/lib/template-registry.js +355 -0
  524. package/assets/lithermes-plugin/skills/lit-pptx/scripts/qa_deck.py +791 -0
  525. package/assets/lithermes-plugin/skills/lit-pptx/scripts/validate_pptx.py +206 -0
  526. package/assets/lithermes-plugin/skills/lit-pptx/slide-formats/markdown-slide-spec-v1.md +251 -0
  527. package/assets/lithermes-plugin/skills/lit-pptx/slide-formats/markdown-slide-spec-v2.md +221 -0
  528. package/assets/lithermes-plugin/skills/lit-pptx/slide-formats/slide-ast-v1.schema.json +229 -0
  529. package/assets/lithermes-plugin/skills/lit-pptx/slide-formats/slide-ast-v2.schema.json +144 -0
  530. package/assets/lithermes-plugin/skills/lit-pptx/slide-formats/template-enrollment-contract.md +228 -0
  531. package/assets/lithermes-plugin/skills/lit-pptx/templates/enrolled/AZURE-A2Z/capabilities.yaml +146 -0
  532. package/assets/lithermes-plugin/skills/lit-pptx/templates/enrolled/AZURE-A2Z/layout-mapping.yaml +384 -0
  533. package/assets/lithermes-plugin/skills/lit-pptx/templates/enrolled/AZURE-A2Z/template.yaml +37 -0
  534. package/assets/lithermes-plugin/skills/lit-pptx/templates/enrolled/AZURE-PRO/capabilities.yaml +154 -0
  535. package/assets/lithermes-plugin/skills/lit-pptx/templates/enrolled/AZURE-PRO/layout-mapping.yaml +405 -0
  536. package/assets/lithermes-plugin/skills/lit-pptx/templates/enrolled/AZURE-PRO/template.yaml +37 -0
  537. package/assets/lithermes-plugin/skills/lit-pptx/templates/enrolled/BOILERPLATE-A2Z/capabilities.yaml +179 -0
  538. package/assets/lithermes-plugin/skills/lit-pptx/templates/enrolled/BOILERPLATE-A2Z/layout-mapping.yaml +299 -0
  539. package/assets/lithermes-plugin/skills/lit-pptx/templates/enrolled/BOILERPLATE-A2Z/template.yaml +45 -0
  540. package/assets/lithermes-plugin/skills/lit-pptx/templates/enrolled/BOILERPLATE-PRETENDARD/capabilities.yaml +181 -0
  541. package/assets/lithermes-plugin/skills/lit-pptx/templates/enrolled/BOILERPLATE-PRETENDARD/layout-mapping.yaml +299 -0
  542. package/assets/lithermes-plugin/skills/lit-pptx/templates/enrolled/BOILERPLATE-PRETENDARD/template.yaml +44 -0
  543. package/assets/lithermes-plugin/skills/lit-scientific-visualization/SKILL.md +2 -0
  544. package/assets/lithermes-plugin/skills/lit-typographic-motion/SKILL.md +71 -0
  545. package/assets/lithermes-plugin/skills/lit-typographic-motion/bin/audio.py +45 -0
  546. package/assets/lithermes-plugin/skills/lit-typographic-motion/bin/motion.mjs +690 -0
  547. package/assets/lithermes-plugin/skills/lit-typographic-motion/bin/runtime.mjs +299 -0
  548. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/NOTICE +23 -0
  549. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/THIRD_PARTY_NOTICES +55 -0
  550. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/browser.mjs +169 -0
  551. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/completion.mjs +52 -0
  552. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/constants.mjs +162 -0
  553. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/director.mjs +33 -0
  554. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/encode.mjs +191 -0
  555. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/flash.mjs +163 -0
  556. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/frame.mjs +428 -0
  557. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/gate.mjs +483 -0
  558. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/look.mjs +223 -0
  559. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/page.js +622 -0
  560. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/presets.mjs +170 -0
  561. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/scenes.mjs +242 -0
  562. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/sound.mjs +382 -0
  563. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/stage-gate.mjs +97 -0
  564. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/stage-init.js +186 -0
  565. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/stage-kit.js +389 -0
  566. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/stage-qa.mjs +358 -0
  567. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/stage-worker.mjs +33 -0
  568. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/stage.mjs +691 -0
  569. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/stills.mjs +71 -0
  570. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/stroke.mjs +231 -0
  571. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/timeline.mjs +177 -0
  572. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/treatment.mjs +244 -0
  573. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/type.mjs +183 -0
  574. package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/util.mjs +152 -0
  575. package/assets/lithermes-plugin/skills/lit-typographic-motion/references/craft-loop.md +175 -0
  576. package/assets/lithermes-plugin/skills/lit-typographic-motion/references/engine-contract.md +166 -0
  577. package/assets/lithermes-plugin/skills/lit-typographic-motion/references/runtime.md +122 -0
  578. package/assets/lithermes-plugin/skills/lit-typographic-motion/references/stage.md +261 -0
  579. package/assets/lithermes-plugin/skills/lit-typographic-motion/references/style-bibles.md +122 -0
  580. package/assets/lithermes-plugin/skills/lit-typographic-motion/references/treatment.md +164 -0
  581. package/assets/lithermes-plugin/skills/lit-typographic-motion/references/type-craft.md +92 -0
  582. package/assets/lithermes-plugin/skills/lit-typographic-motion/runtime/fonts.json +154 -0
  583. package/assets/lithermes-plugin/skills/lit-typographic-motion/runtime/licenses/CREDITS +20 -0
  584. package/assets/lithermes-plugin/skills/lit-typographic-motion/runtime/licenses/EMS-OFL.txt +91 -0
  585. package/assets/lithermes-plugin/skills/lit-typographic-motion/runtime/package-lock.json +88 -0
  586. package/assets/lithermes-plugin/skills/lit-typographic-motion/runtime/package.json +12 -0
  587. package/assets/lithermes-plugin/skills/lit-typographic-motion/runtime/requirements.in +1 -0
  588. package/assets/lithermes-plugin/skills/lit-typographic-motion/runtime/requirements.lock +727 -0
  589. package/assets/lithermes-plugin/skills/lit-typographic-motion/runtime/word-timing.json +9 -0
  590. package/assets/lithermes-plugin/skills/litresearch/SKILL.md +19 -18
  591. package/assets/lithermes-plugin/skills/litwork/SKILL.md +28 -0
  592. package/assets/lithermes-plugin/skills/visual-qa/references/complete-contract.md +3 -3
  593. package/package.json +1 -1
  594. package/readme-assets/ab-simple/s11-ui-baseline-desktop.webp +0 -0
  595. package/readme-assets/ab-simple/s11-ui-lithermes-desktop.webp +0 -0
  596. package/readme-assets/ab-simple/s3-ui-baseline-desktop.webp +0 -0
  597. package/readme-assets/ab-simple/s3-ui-lithermes-desktop.webp +0 -0
  598. package/readme-assets/ab-simple/s4-ui-baseline-desktop.webp +0 -0
  599. package/readme-assets/ab-simple/s4-ui-lithermes-desktop.webp +0 -0
  600. package/readme-assets/ab-simple/s5-office-baseline-slides.webp +0 -0
  601. package/readme-assets/ab-simple/s5-office-lithermes-slides.webp +0 -0
  602. package/readme-assets/ab-simple/s7-lithermes-diagram.webp +0 -0
  603. package/readme-assets/ab-simple/s8-office-baseline-slides.webp +0 -0
  604. package/readme-assets/ab-simple/s8-office-lithermes-slides.webp +0 -0
  605. package/readme-assets/ab-simple/s9-office-lithermes-pages.webp +0 -0
  606. package/readme-assets/badge-version.svg +1 -1
  607. package/readme-assets/cover-motion-still.webp +0 -0
  608. package/readme-assets/cover-motion.webp +0 -0
  609. package/readme-assets/skills/autoconference.webp +0 -0
  610. package/readme-assets/skills/autoresearch.webp +0 -0
  611. package/readme-assets/skills/browser-drive.webp +0 -0
  612. package/readme-assets/skills/comment-checker.webp +0 -0
  613. package/readme-assets/skills/debugging.webp +0 -0
  614. package/readme-assets/skills/deep-interview.webp +0 -0
  615. package/readme-assets/skills/frontend-ui-ux.webp +0 -0
  616. package/readme-assets/skills/lit-burnoff-file.webp +0 -0
  617. package/readme-assets/skills/lit-burnoff.webp +0 -0
  618. package/readme-assets/skills/lit-code.webp +0 -0
  619. package/readme-assets/skills/lit-commit.webp +0 -0
  620. package/readme-assets/skills/lit-comprehend.webp +0 -0
  621. package/readme-assets/skills/lit-crucible.webp +0 -0
  622. package/readme-assets/skills/lit-diagram-drawer.webp +0 -0
  623. package/readme-assets/skills/lit-docx.webp +0 -0
  624. package/readme-assets/skills/lit-handoff.webp +0 -0
  625. package/readme-assets/skills/lit-humanizer.webp +0 -0
  626. package/readme-assets/skills/lit-init.webp +0 -0
  627. package/readme-assets/skills/lit-plan.webp +0 -0
  628. package/readme-assets/skills/lit-pptx.webp +0 -0
  629. package/readme-assets/skills/lit-recap.webp +0 -0
  630. package/readme-assets/skills/lit-scientific-visualization.webp +0 -0
  631. package/readme-assets/skills/lit-typographic-motion.webp +0 -0
  632. package/readme-assets/skills/litgoal.webp +0 -0
  633. package/readme-assets/skills/litresearch.webp +0 -0
  634. package/readme-assets/skills/litwork.webp +0 -0
  635. package/readme-assets/skills/lsp-setup.webp +0 -0
  636. package/readme-assets/skills/lsp.webp +0 -0
  637. package/readme-assets/skills/readme-studio.webp +0 -0
  638. package/readme-assets/skills/refactor.webp +0 -0
  639. package/readme-assets/skills/review-work.webp +0 -0
  640. package/readme-assets/skills/rules.webp +0 -0
  641. package/readme-assets/skills/start-work.webp +0 -0
  642. package/readme-assets/skills/structural-search.webp +0 -0
  643. package/readme-assets/skills/visual-qa.webp +0 -0
  644. package/readme-assets/skills/wikify.webp +0 -0
  645. package/src/cli.js +40 -1
  646. package/src/lib/check.js +21 -0
  647. package/src/lib/install.js +262 -7
  648. package/src/lib/skillPayload.js +3 -3
  649. package/assets/lithermes-plugin/skills/lit-korean/SKILL.md +0 -237
  650. package/assets/lithermes-plugin/skills/lit-korean/references/quick-rules.md +0 -24
  651. package/assets/lithermes-plugin/skills/lit-korean/references/safety-checklist.md +0 -23
  652. package/readme-assets/cover.webp +0 -0
@@ -0,0 +1,299 @@
1
+ #!/usr/bin/env node
2
+ // LitHermes motion runtime: install-time pre-warm and read-only status.
3
+ // Cache mechanics follow this product's office runtime (lockfile-digest cache
4
+ // under ${XDG_CACHE_HOME:-$HERMES_HOME/.cache}, an exclusive install lock,
5
+ // `npm ci --omit=dev --ignore-scripts` into a staging dir, atomic rename), but
6
+ // nothing here ever runs on first render: `lithermes motion-runtime install`
7
+ // and the product installer are the only callers of install() (MO-A-42/43).
8
+ import { createHash } from 'node:crypto';
9
+ import { spawnSync } from 'node:child_process';
10
+ import { createRequire } from 'node:module';
11
+ import { closeSync, existsSync, mkdirSync, openSync, readFileSync, realpathSync, renameSync, rmSync, writeFileSync } from 'node:fs';
12
+ import { homedir } from 'node:os';
13
+ import { dirname, join, resolve, sep } from 'node:path';
14
+ import { fileURLToPath } from 'node:url';
15
+
16
+ export const skillRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..');
17
+ export const runtimeRoot = join(skillRoot, 'runtime');
18
+ const pins = JSON.parse(readFileSync(join(runtimeRoot, 'fonts.json'), 'utf8'));
19
+ const wordTiming = JSON.parse(readFileSync(join(runtimeRoot, 'word-timing.json'), 'utf8'));
20
+ const lockBytes = readFileSync(join(runtimeRoot, 'package-lock.json'));
21
+ const audioLockBytes = readFileSync(join(runtimeRoot, 'requirements.lock'));
22
+ const sha = (data) => createHash('sha256').update(data).digest('hex');
23
+ export const digest = createHash('sha256').update(lockBytes).update(readFileSync(join(runtimeRoot, 'fonts.json'))).digest('hex').slice(0, 16);
24
+ export const audioDigest = sha(audioLockBytes).slice(0, 16);
25
+ export const WARM = 'lithermes motion-runtime install';
26
+ export const FONT_PINS = pins.entries;
27
+
28
+ // This product's own lit-pptx Hangul pair, checked against its recorded hashes (MO-A-55).
29
+ export const HANGUL_PAIR = Object.freeze([
30
+ { id: 'pretendard-400', file: 'PretendardGOV-Regular.otf', sha256: 'e8c1d911bda79376b2029be4f1c61c1d5b48a9459123a80d5ea23dd055f70bb6' },
31
+ { id: 'pretendard-700', file: 'PretendardGOV-Bold.otf', sha256: 'a3cd22c442e4ddb8e29501ca2136bfd9d187c70d608cd9feeaead09e4da7be19' },
32
+ ]);
33
+ export const hangulPath = (file) => join(skillRoot, '..', 'lit-pptx', 'pretendard-font', 'public', 'static', file);
34
+
35
+ // Cache roots, first match wins for reads; the first entry receives installs.
36
+ export function cacheRoots(env = process.env) {
37
+ const roots = [];
38
+ if (env.XDG_CACHE_HOME) roots.push(env.XDG_CACHE_HOME);
39
+ if (env.HERMES_HOME) roots.push(join(env.HERMES_HOME, '.cache'));
40
+ const marker = `${sep}plugins${sep}lithermes${sep}skills${sep}`;
41
+ if (skillRoot.includes(marker)) roots.push(join(skillRoot.slice(0, skillRoot.indexOf(marker)), '.cache'));
42
+ roots.push(join(env.HOME || homedir(), '.cache'));
43
+ return [...new Set(roots)].map((root) => join(root, 'lithermes', 'motion', digest));
44
+ }
45
+
46
+ const readyAt = (cache) => existsSync(join(cache, 'READY')) && readFileSync(join(cache, 'READY'), 'utf8') === `${digest}\n`
47
+ && existsSync(join(cache, 'node', 'node_modules', 'playwright-core', 'package.json'));
48
+
49
+ export function findCache(env = process.env) {
50
+ return cacheRoots(env).find(readyAt) || null;
51
+ }
52
+
53
+ export function depState(env = process.env) {
54
+ const cache = findCache(env);
55
+ return cache ? { ready: true, cache } : { ready: false, cache: cacheRoots(env)[0], missing: ['node dependencies (playwright-core, ws, opentype.js, pngjs)'] };
56
+ }
57
+
58
+ export function runtimeRequire(env = process.env) {
59
+ const cache = findCache(env);
60
+ if (!cache) throw Object.assign(new Error(`BLOCKED_DEPS_NOT_PREWARMED: pinned engine dependencies are not in the product cache; run \`${WARM}\` outside this session`), { exitCode: 14 });
61
+ const require = createRequire(join(cache, 'node', 'package.json'));
62
+ return (name) => require(name);
63
+ }
64
+
65
+ export function fontFile(cache, entryPath) {
66
+ return join(cache, 'assets', entryPath);
67
+ }
68
+
69
+ // MO-A-55: every pinned font and licence present with its recorded sha256, plus
70
+ // the reused lit-pptx pair against this product's own hashes.
71
+ export function fontState(env = process.env) {
72
+ const cache = findCache(env) || cacheRoots(env)[0];
73
+ const missing = [], mismatched = [];
74
+ for (const entry of pins.entries) {
75
+ const file = fontFile(cache, entry.path);
76
+ if (!existsSync(file)) missing.push(entry.path);
77
+ else if (sha(readFileSync(file)) !== entry.sha256) mismatched.push(entry.path);
78
+ }
79
+ for (const pair of HANGUL_PAIR) {
80
+ const file = hangulPath(pair.file);
81
+ if (!existsSync(file)) missing.push(`lit-pptx/${pair.file}`);
82
+ else if (sha(readFileSync(file)) !== pair.sha256) mismatched.push(`lit-pptx/${pair.file}`);
83
+ }
84
+ for (const name of ['EMS-OFL.txt', 'CREDITS']) if (!existsSync(join(runtimeRoot, 'licenses', name))) missing.push(`licenses/${name}`);
85
+ return { cache, missing, mismatched, ok: !missing.length && !mismatched.length };
86
+ }
87
+
88
+ function run(cmd, args, options = {}) {
89
+ const result = spawnSync(cmd, args, { encoding: 'utf8', ...options });
90
+ if (result.error || result.status !== 0) {
91
+ const detail = result.error?.message || (result.stderr || '').trim().split('\n').slice(-3).join(' ') || `exit ${result.status}`;
92
+ throw new Error(`${cmd} ${args[0] || ''} failed: ${detail}`);
93
+ }
94
+ return result.stdout;
95
+ }
96
+
97
+ // Pinned URL + sha256, verified before it lands; a mirror (file:// or http://127.0.0.1)
98
+ // replaces the host part for offline tests.
99
+ export async function fetchPinned(entry, targetFile, { mirror = process.env.LITHERMES_MOTION_FONT_MIRROR } = {}) {
100
+ const url = mirror ? `${mirror.replace(/\/$/, '')}/${entry.path}` : entry.url;
101
+ let bytes;
102
+ if (url.startsWith('file://')) bytes = readFileSync(fileURLToPath(url));
103
+ else {
104
+ const response = await fetch(url, { redirect: 'follow' });
105
+ if (!response.ok) throw new Error(`${entry.path}: HTTP ${response.status} from ${url}`);
106
+ bytes = Buffer.from(await response.arrayBuffer());
107
+ }
108
+ const got = sha(bytes);
109
+ if (got !== entry.sha256) throw new Error(`${entry.path}: sha256 mismatch (got ${got}, pinned ${entry.sha256})`);
110
+ mkdirSync(dirname(targetFile), { recursive: true });
111
+ writeFileSync(targetFile, bytes, { flag: 'wx' });
112
+ }
113
+
114
+ function pythonFor(env) {
115
+ const candidates = [env.LITHERMES_MOTION_PYTHON, 'python3.11', 'python3.12', 'python3.13', 'python3'].filter(Boolean);
116
+ for (const candidate of candidates) {
117
+ const probe = spawnSync(candidate, ['-c', 'import sys; print(sys.version.split()[0])'], { encoding: 'utf8' });
118
+ if (probe.status === 0) return { python: candidate, version: probe.stdout.trim() };
119
+ }
120
+ return null;
121
+ }
122
+
123
+ export const audioDir = (cache) => join(cache, `audio-${audioDigest}`);
124
+
125
+ // Tier 2 state: absent, pins drifted, or ready. Never repaired in session (MO-A-54).
126
+ export function audioState(env = process.env) {
127
+ const cache = findCache(env) || cacheRoots(env)[0];
128
+ const dir = audioDir(cache);
129
+ const python = join(dir, 'venv', 'bin', 'python');
130
+ if (!existsSync(python) || !existsSync(join(dir, 'AUDIO_READY'))) return { state: 'absent', python: null, dir };
131
+ const expected = [...audioLockBytes.toString().matchAll(/^([A-Za-z0-9_.-]+)==([A-Za-z0-9_.+-]+)/gm)].map(([, name, version]) => [name, version]);
132
+ const script = [
133
+ 'import importlib.metadata as m, json, sys',
134
+ 'bad = []',
135
+ 'for name, version in json.loads(sys.argv[1]):',
136
+ ' try:',
137
+ ' if m.version(name) != version: bad.append(name)',
138
+ ' except Exception: bad.append(name)',
139
+ 'print(json.dumps(bad))',
140
+ ].join('\n');
141
+ const check = spawnSync(python, ['-c', script, JSON.stringify(expected)], { encoding: 'utf8', timeout: 20000 });
142
+ if (check.status !== 0) return { state: 'mismatched', python, dir, detail: (check.stderr || '').trim().split('\n').at(-1) };
143
+ const bad = JSON.parse(check.stdout || '[]');
144
+ return bad.length ? { state: 'mismatched', python, dir, detail: `pins drifted: ${bad.join(', ')}` } : { state: 'ready', python, dir };
145
+ }
146
+
147
+ async function installAudio(cache, env) {
148
+ const py = pythonFor(env);
149
+ if (!py) throw new Error('no python3 interpreter found for the --audio venv (set LITHERMES_MOTION_PYTHON)');
150
+ const dir = audioDir(cache);
151
+ const stage = `${dir}.stage-${process.pid}`;
152
+ rmSync(stage, { recursive: true, force: true });
153
+ run(py.python, ['-m', 'venv', join(stage, 'venv')]);
154
+ run(join(stage, 'venv', 'bin', 'python'), ['-m', 'pip', 'install', '--disable-pip-version-check', '--require-hashes', '--only-binary=:all:', '-r', join(runtimeRoot, 'requirements.lock')], { timeout: 900000 });
155
+ writeFileSync(join(stage, 'AUDIO_READY'), `${audioDigest}\n`);
156
+ rmSync(dir, { recursive: true, force: true });
157
+ renameSync(stage, dir);
158
+ return `audio venv READY (${py.python} ${py.version})`;
159
+ }
160
+
161
+ export function wordTimingPlan() {
162
+ const lines = ['word-timing models (Tier 3, opt-in):'];
163
+ for (const m of wordTiming.models) lines.push(` ${m.role}: ${m.id || 'NOT PINNED'} revision=${m.revision || 'none'} licence=${m.license || 'unknown'}${m.note ? ` (${m.note})` : ''}`);
164
+ lines.push(` download size: ${wordTiming.status === 'pinned' ? wordTiming.downloadBytes + ' bytes' : '0 bytes (nothing is downloaded: fail-closed)'}`);
165
+ return { lines, pinned: wordTiming.status === 'pinned', reason: wordTiming.reason };
166
+ }
167
+
168
+ export function wordTimingReady(env = process.env) {
169
+ if (wordTiming.status !== 'pinned') return false;
170
+ const cache = findCache(env);
171
+ return Boolean(cache && existsSync(join(cache, 'word-timing', 'READY')));
172
+ }
173
+
174
+ export async function install({ audio = false, wordTiming: wantWords = false, env = process.env } = {}) {
175
+ if (wantWords) {
176
+ const plan = wordTimingPlan();
177
+ const error = new Error(`${plan.lines.join('\n')}\nword-timing install refused (fail-closed): ${plan.reason}`);
178
+ error.exitCode = 14;
179
+ throw error;
180
+ }
181
+ const roots = cacheRoots(env);
182
+ const existing = findCache(env);
183
+ const cache = existing || roots[0];
184
+ const receipts = [];
185
+ if (!existing || !fontState(env).ok) {
186
+ mkdirSync(dirname(cache), { recursive: true });
187
+ const lockPath = `${cache}.lock`;
188
+ let fd;
189
+ try { fd = openSync(lockPath, 'wx'); } catch (error) {
190
+ if (error.code === 'EEXIST') throw new Error(`another motion-runtime install holds ${lockPath}`);
191
+ throw error;
192
+ }
193
+ const stage = `${cache}.stage-${process.pid}`;
194
+ try {
195
+ rmSync(stage, { recursive: true, force: true });
196
+ mkdirSync(join(stage, 'node'), { recursive: true });
197
+ for (const name of ['package.json', 'package-lock.json']) writeFileSync(join(stage, 'node', name), readFileSync(join(runtimeRoot, name)));
198
+ run(env.LITHERMES_MOTION_NPM || 'npm', ['ci', '--prefix', join(stage, 'node'), '--omit=dev', '--ignore-scripts', '--no-audit', '--no-fund'],
199
+ { env: { ...env, npm_config_cache: join(dirname(cache), 'npm-cache') }, timeout: 600000 });
200
+ for (const entry of pins.entries) await fetchPinned(entry, join(stage, 'assets', entry.path), { mirror: env.LITHERMES_MOTION_FONT_MIRROR });
201
+ for (const pair of HANGUL_PAIR) {
202
+ const file = hangulPath(pair.file);
203
+ if (!existsSync(file) || sha(readFileSync(file)) !== pair.sha256) throw new Error(`reused Hangul font missing or changed: lit-pptx/${pair.file}`);
204
+ }
205
+ writeFileSync(join(stage, 'READY'), `${digest}\n`);
206
+ if (existing) rmSync(existing, { recursive: true, force: true });
207
+ rmSync(cache, { recursive: true, force: true });
208
+ renameSync(stage, cache);
209
+ receipts.push(`motion-runtime READY cache=${cache}`);
210
+ } finally {
211
+ rmSync(stage, { recursive: true, force: true });
212
+ closeSync(fd);
213
+ rmSync(lockPath, { force: true });
214
+ }
215
+ } else receipts.push(`motion-runtime READY cache=${cache} (already warm)`);
216
+ if (audio) receipts.push(audioState(env).state === 'ready' ? 'audio venv READY (already warm)' : await installAudio(findCache(env), env));
217
+ return receipts.join('\n');
218
+ }
219
+
220
+ const chromeProbeScript = () => {
221
+ const gl = document.createElement('canvas').getContext('webgl2');
222
+ if (!gl) return null;
223
+ const ext = gl.getExtension('WEBGL_debug_renderer_info');
224
+ return ext ? gl.getParameter(ext.UNMASKED_RENDERER_WEBGL) : 'unknown (debug-info extension unavailable)';
225
+ };
226
+
227
+ // MO-A-44: five probes on every run, in this product's "name: value" status style.
228
+ export async function status(env = process.env) {
229
+ const { chromeExecutable, launchChrome } = await import('../engine/browser.mjs');
230
+ const { isSoftwareRenderer, UNKNOWN_RENDERER } = await import('../engine/constants.mjs');
231
+ const chrome = chromeExecutable(env);
232
+ const version = chrome ? spawnSync(chrome, ['--version'], { encoding: 'utf8', timeout: 10000 }).stdout?.trim() : '';
233
+ const ffmpeg = spawnSync('ffmpeg', ['-hide_banner', '-version'], { encoding: 'utf8', timeout: 10000, env });
234
+ let preview = 'none';
235
+ if (ffmpeg.status === 0) {
236
+ const encoders = spawnSync('ffmpeg', ['-hide_banner', '-encoders'], { encoding: 'utf8', timeout: 10000, env }).stdout || '';
237
+ preview = /libwebp_anim/.test(encoders) ? 'libwebp_anim'
238
+ : spawnSync('img2webp', ['-version'], { encoding: 'utf8', timeout: 10000, env }).status === 0 ? 'img2webp' : 'gif';
239
+ }
240
+ const deps = depState(env);
241
+ const fonts = fontState(env);
242
+ const audio = audioState(env);
243
+ let renderer = null, glLine;
244
+ if (!chrome) glLine = 'no WebGL2 context obtainable (Chrome not found)';
245
+ else if (!deps.ready) glLine = `not probed: pinned driver not pre-warmed (run \`${WARM}\`)`;
246
+ else {
247
+ const { mkdtempSync } = await import('node:fs');
248
+ const { tmpdir } = await import('node:os');
249
+ const profileRoot = mkdtempSync(join(tmpdir(), 'lhm-'));
250
+ try {
251
+ const launched = await launchChrome({ chromium: runtimeRequire(env)('playwright-core').chromium, profileRoot, env, timeoutMs: 25000 });
252
+ renderer = (await launched.page.evaluate(chromeProbeScript)) || launched.renderer;
253
+ glLine = `${renderer} (flags: ${launched.flags.join(' ')})`;
254
+ await launched.context.close().catch(() => {});
255
+ } catch (error) {
256
+ glLine = `no WebGL2 context obtainable: ${String(error.message).split('\n')[0]}`;
257
+ } finally { rmSync(profileRoot, { recursive: true, force: true }); }
258
+ }
259
+ const software = !renderer ? 'unknown (no renderer probed)'
260
+ : renderer === UNKNOWN_RENDERER ? 'warning: renderer type unknown - debug-info extension unavailable'
261
+ : isSoftwareRenderer(renderer) ? `warning: software GL detected (${renderer}); renders will be slower, --samples lowered automatically`
262
+ : 'none (hardware renderer)';
263
+ const warmParts = [];
264
+ if (!deps.ready) warmParts.push(`missing ${deps.missing.join(', ')}`);
265
+ if (fonts.missing.length) warmParts.push(`missing fonts/licences: ${fonts.missing.join(', ')}`);
266
+ if (fonts.mismatched.length) warmParts.push(`hash mismatch: ${fonts.mismatched.join(', ')}`);
267
+ const audioText = audio.state === 'ready' ? 'audio venv READY' : audio.state === 'mismatched'
268
+ ? `audio venv present but ${audio.detail || 'pins drifted'} (Tier 1 fallback; fix: ${WARM} --audio)` : `audio venv not installed (optional: ${WARM} --audio)`;
269
+ const warm = warmParts.length ? `NOT READY - ${warmParts.join('; ')}; fix: ${WARM}` : `READY cache=${deps.cache}`;
270
+ return [
271
+ `Chrome: ${chrome ? `${chrome} (${version || 'version unknown'})` : 'not found on PATH / not installed (set CHROME_PATH)'}`,
272
+ `ffmpeg: ${ffmpeg.status === 0 ? `${ffmpeg.stdout.split('\n')[0]}; preview encoder: ${preview}` : 'not found on PATH (video export blocked; stills and sheet still work)'}`,
273
+ `WebGL2 renderer: ${glLine}`,
274
+ `software GL: ${software}`,
275
+ `pre-warm: ${warm}; ${audioText}`,
276
+ ];
277
+ }
278
+
279
+ function isMain() {
280
+ try { return realpathSync(process.argv[1]) === realpathSync(fileURLToPath(import.meta.url)); } catch { return false; }
281
+ }
282
+
283
+ const USAGE = 'LitHermes motion-runtime usage: install|status [--audio] [--word-timing]';
284
+ if (isMain()) {
285
+ const [action, ...rest] = process.argv.slice(2);
286
+ const flags = new Set(rest);
287
+ if (!action || action === '--help' || action === 'help') console.log(USAGE);
288
+ else if (action === 'status') {
289
+ console.log((await status()).join('\n'));
290
+ if (flags.has('--word-timing')) console.log(wordTimingPlan().lines.join('\n'));
291
+ } else if (action === 'install') {
292
+ try {
293
+ console.log(await install({ audio: flags.has('--audio'), wordTiming: flags.has('--word-timing') }));
294
+ } catch (error) {
295
+ console.error(String(error.message));
296
+ process.exitCode = error.exitCode || 1;
297
+ }
298
+ } else { console.error(USAGE); process.exitCode = 2; }
299
+ }
@@ -0,0 +1,23 @@
1
+ Portions of this engine are adapted from mexicat/pdoom-video
2
+ (https://github.com/mexicat/pdoom-video), commit
3
+ ca251e3dddda422b364385eb484b5a3593a0990d.
4
+
5
+ Copyright (c) 2026 Giacomo Magnanini
6
+
7
+ Permission is hereby granted, free of charge, to any person obtaining a copy
8
+ of this software and associated documentation files (the "Software"), to deal
9
+ in the Software without restriction, including without limitation the rights
10
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+ copies of the Software, and to permit persons to whom the Software is
12
+ furnished to do so, subject to the following conditions:
13
+
14
+ The above copyright notice and this permission notice shall be included in all
15
+ copies or substantial portions of the Software.
16
+
17
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23
+ SOFTWARE.
@@ -0,0 +1,55 @@
1
+ LitHermes lit-typographic-motion: third-party notices
2
+
3
+ Engine: portions adapted from mexicat/pdoom-video, commit
4
+ ca251e3dddda422b364385eb484b5a3593a0990d (MIT, Giacomo Magnanini). The full
5
+ MIT permission text is in engine/NOTICE next to this file.
6
+
7
+ Fonts. Nothing below is bundled in this package. `lithermes motion-runtime
8
+ install` fetches each file from its pinned URL, verifies its sha256 against
9
+ runtime/fonts.json, and stores it with its licence file in the product cache.
10
+ <cache> means that cache directory (printed by `lithermes motion-runtime status`).
11
+
12
+ font: <cache>/assets/fonts/Galmuri9.ttf
13
+ licence: <cache>/assets/licenses/Galmuri-OFL.md (SIL OFL 1.1, Reserved Font Name; used unmodified)
14
+ font: <cache>/assets/fonts/VT323-Regular.ttf
15
+ licence: <cache>/assets/licenses/VT323-OFL.txt (SIL OFL 1.1)
16
+ font: <cache>/assets/fonts/Silkscreen-Regular.ttf
17
+ licence: <cache>/assets/licenses/Silkscreen-OFL.txt (SIL OFL 1.1)
18
+ font: <cache>/assets/fonts/Silkscreen-Bold.ttf
19
+ licence: <cache>/assets/licenses/Silkscreen-OFL.txt (SIL OFL 1.1)
20
+ font: <cache>/assets/fonts/MesloLGS-NF-Regular.ttf
21
+ licence: <cache>/assets/licenses/Meslo-Notice.txt (Apache-2.0 notice)
22
+ licence: <cache>/assets/licenses/Meslo-Apache.txt (Apache License 2.0 text)
23
+ licence: <cache>/assets/licenses/Meslo-Vera-Arev.txt (inherited Bitstream Vera and Arev notices)
24
+ font: <cache>/assets/fonts/Archivo-w750-500.ttf
25
+ licence: <cache>/assets/licenses/Archivo-OFL.txt (SIL OFL 1.1)
26
+ font: <cache>/assets/fonts/Archivo-w750-700.ttf
27
+ licence: <cache>/assets/licenses/Archivo-OFL.txt (SIL OFL 1.1)
28
+ font: <cache>/assets/fonts/Archivo-w750-900.ttf
29
+ licence: <cache>/assets/licenses/Archivo-OFL.txt (SIL OFL 1.1)
30
+ font: <cache>/assets/fonts/Archivo-w1000-500.ttf
31
+ licence: <cache>/assets/licenses/Archivo-OFL.txt (SIL OFL 1.1)
32
+ font: <cache>/assets/fonts/Archivo-w1000-700.ttf
33
+ licence: <cache>/assets/licenses/Archivo-OFL.txt (SIL OFL 1.1)
34
+ font: <cache>/assets/fonts/Archivo-w1000-900.ttf
35
+ licence: <cache>/assets/licenses/Archivo-OFL.txt (SIL OFL 1.1)
36
+ font: <cache>/assets/fonts/Archivo-w1250-500.ttf
37
+ licence: <cache>/assets/licenses/Archivo-OFL.txt (SIL OFL 1.1)
38
+ font: <cache>/assets/fonts/Archivo-w1250-700.ttf
39
+ licence: <cache>/assets/licenses/Archivo-OFL.txt (SIL OFL 1.1)
40
+ font: <cache>/assets/fonts/Archivo-w1250-900.ttf
41
+ licence: <cache>/assets/licenses/Archivo-OFL.txt (SIL OFL 1.1)
42
+ font: <cache>/assets/fonts/stroke/EMSAllure.svg
43
+ licence: runtime/licenses/EMS-OFL.txt and runtime/licenses/CREDITS (in this package)
44
+ font: <cache>/assets/fonts/stroke/EMSFelix.svg
45
+ licence: runtime/licenses/EMS-OFL.txt and runtime/licenses/CREDITS (in this package)
46
+ font: <cache>/assets/fonts/stroke/EMSOsmotron.svg
47
+ licence: runtime/licenses/EMS-OFL.txt and runtime/licenses/CREDITS (in this package)
48
+ font: <cache>/assets/fonts/stroke/EMSReadability.svg
49
+ licence: runtime/licenses/EMS-OFL.txt and runtime/licenses/CREDITS (in this package)
50
+ font: <cache>/assets/fonts/stroke/EMSTech.svg
51
+ licence: runtime/licenses/EMS-OFL.txt and runtime/licenses/CREDITS (in this package)
52
+ font: ../lit-pptx/pretendard-font/public/static/PretendardGOV-Regular.otf (reused by path, unmodified)
53
+ licence: ../lit-pptx/fonts/PRETENDARD-OFL.txt (SIL OFL 1.1)
54
+ font: ../lit-pptx/pretendard-font/public/static/PretendardGOV-Bold.otf (reused by path, unmodified)
55
+ licence: ../lit-pptx/fonts/PRETENDARD-OFL.txt (SIL OFL 1.1)
@@ -0,0 +1,169 @@
1
+ // Headless Chrome driver (the driver half of pdoom's scripts/render.ts, MIT,
2
+ // see NOTICE). Chrome is launched over the pipe transport, so no control port
3
+ // listens; frames leave the page over a WebSocket bound to 127.0.0.1:0
4
+ // (MO-A-02 option 1) or, when listen() is refused, through a per-frame CDP
5
+ // pull of the same readback buffer (the sanctioned variant). Each MO-A-51 rung
6
+ // counts only after a real getContext('webgl2') in the page.
7
+ import { existsSync, lstatSync, mkdirSync, readdirSync, readlinkSync, rmSync } from 'node:fs';
8
+ import { join } from 'node:path';
9
+ import { EXIT, UNKNOWN_RENDERER, chromeFlagLadder, isSoftwareRenderer } from './constants.mjs';
10
+
11
+ export const blocked = (code, message) => Object.assign(new Error(message), { exitCode: code });
12
+
13
+ const CHROME_CANDIDATES = [
14
+ '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',
15
+ '/Applications/Chromium.app/Contents/MacOS/Chromium',
16
+ '/usr/bin/google-chrome', '/usr/bin/google-chrome-stable', '/usr/bin/chromium', '/usr/bin/chromium-browser',
17
+ ];
18
+
19
+ export function chromeExecutable(env = process.env) {
20
+ if (env.CHROME_PATH) return existsSync(env.CHROME_PATH) ? env.CHROME_PATH : null;
21
+ return CHROME_CANDIDATES.find((candidate) => existsSync(candidate)) || null;
22
+ }
23
+
24
+ // The launcher's first line that names a cause. Crashpad's own complaints are
25
+ // a side effect of a failed launch, never the cause, so they rank last.
26
+ export function launchCause(error) {
27
+ const lines = String(error?.message || error).split('\n').map((line) => line.replace(/\x1b\[[0-9;]*m/g, '').trim()).filter(Boolean);
28
+ const strong = /sandbox initialization failed|Failed to initialize sandbox|error while loading shared|cannot open shared object|No usable sandbox|Permission denied|EACCES|ENOENT|spawn .* (?:ENOENT|EACCES)|Executable doesn't exist/i;
29
+ const hit = lines.find((line) => strong.test(line) && !/Crashpad/i.test(line));
30
+ if (hit) return hit.replace(/^-\s*(?:\[pid=\d+\])?(?:\[err\])?\s*/, '');
31
+ const err = lines.find((line) => /\[err\]/.test(line) && !/Crashpad/i.test(line));
32
+ if (err) return err.replace(/^-\s*(?:\[pid=\d+\])?(?:\[err\])?\s*/, '');
33
+ return lines[0] || 'unknown launch failure';
34
+ }
35
+
36
+ const probeScript = () => {
37
+ const canvas = document.createElement('canvas');
38
+ const gl = canvas.getContext('webgl2');
39
+ if (!gl) return { webgl2: false, renderer: null };
40
+ const ext = gl.getExtension('WEBGL_debug_renderer_info');
41
+ return { webgl2: true, renderer: ext ? gl.getParameter(ext.UNMASKED_RENDERER_WEBGL) : null };
42
+ };
43
+
44
+ // Walk the flag ladder; returns { context, page, flags, renderer } or throws 10/11.
45
+ export async function launchChrome({ chromium, profileRoot, forceSoftware = false, platform = process.platform, env = process.env, timeoutMs = 30000 }) {
46
+ const chrome = chromeExecutable(env);
47
+ if (!chrome) throw blocked(EXIT.BLOCKED_NO_CHROME, 'BLOCKED_NO_CHROME: Chrome/Chromium not found; install Chrome or set CHROME_PATH');
48
+ const ladder = chromeFlagLadder(platform);
49
+ const rungs = forceSoftware ? ladder.slice(-1) : ladder;
50
+ const attempts = [];
51
+ let launchedWithoutWebgl = null;
52
+ mkdirSync(profileRoot, { recursive: true });
53
+ for (let i = 0; i < rungs.length; i++) {
54
+ const flags = rungs[i];
55
+ const profile = join(profileRoot, `p${i}`);
56
+ let context = null;
57
+ try {
58
+ context = await chromium.launchPersistentContext(profile, {
59
+ executablePath: chrome, headless: true, chromiumSandbox: true, args: flags, timeout: timeoutMs,
60
+ viewport: { width: 1920, height: 1080 }, deviceScaleFactor: 1,
61
+ });
62
+ const page = context.pages()[0] || await context.newPage();
63
+ const probe = await page.evaluate(probeScript);
64
+ if (probe.webgl2) {
65
+ return { context, page, flags, profile, chrome, renderer: probe.renderer || UNKNOWN_RENDERER, attempts };
66
+ }
67
+ launchedWithoutWebgl = `Chrome launched with ${flags[0]} but canvas.getContext('webgl2') returned null`;
68
+ attempts.push({ flags, result: 'no-webgl2' });
69
+ } catch (error) {
70
+ attempts.push({ flags, result: 'launch-failed', cause: launchCause(error) });
71
+ }
72
+ await context?.close().catch(() => {});
73
+ rmSync(profile, { recursive: true, force: true });
74
+ }
75
+ if (launchedWithoutWebgl) throw blocked(EXIT.BLOCKED_NO_WEBGL2, `BLOCKED_NO_WEBGL2: ${launchedWithoutWebgl}`);
76
+ const cause = attempts.find((a) => a.cause)?.cause || 'Chrome did not start';
77
+ throw blocked(EXIT.BLOCKED_NO_CHROME, `BLOCKED_NO_CHROME: headless Chrome failed to launch on every rung (${rungs.map((r) => r[0]).join(', ')}): ${cause}`);
78
+ }
79
+
80
+ // Unix sockets Chrome left in the profile (or behind its symlinks) and their path lengths.
81
+ export function profileSockets(profile) {
82
+ const out = [];
83
+ const visit = (dir, depth) => {
84
+ if (depth > 2 || !existsSync(dir)) return;
85
+ for (const name of readdirSync(dir)) {
86
+ const path = join(dir, name);
87
+ let st;
88
+ try { st = lstatSync(path); } catch { continue; }
89
+ if (st.isSocket()) out.push({ path, bytes: Buffer.byteLength(path) });
90
+ else if (st.isSymbolicLink() && /Singleton/.test(name)) {
91
+ const target = readlinkSync(path);
92
+ if (target.startsWith('/')) out.push({ path: target, bytes: Buffer.byteLength(target), via: path });
93
+ } else if (st.isDirectory()) visit(path, depth + 1);
94
+ }
95
+ };
96
+ visit(profile, 0);
97
+ return out;
98
+ }
99
+
100
+ export async function openRenderer({ runtime, pageScript, profileRoot, scale = 1, forceSoftware = false, env = process.env }) {
101
+ const { chromium } = runtime('playwright-core');
102
+ const launched = await launchChrome({ chromium, profileRoot, forceSoftware, env });
103
+ const { context, page } = launched;
104
+ page.setDefaultTimeout(0);
105
+ await page.addScriptTag({ path: pageScript });
106
+ const setup = await page.evaluate((config) => window.motionSetup(config), { width: 1920, height: 1080, scale });
107
+ if (!setup.webgl2 || setup.error) {
108
+ await context.close().catch(() => {});
109
+ throw blocked(EXIT.BLOCKED_NO_WEBGL2, `BLOCKED_NO_WEBGL2: ${setup.error || 'no WebGL2 context in the render page'} (renderer: ${setup.renderer || launched.renderer})`);
110
+ }
111
+ const renderer = setup.renderer || launched.renderer;
112
+ const sockets = profileSockets(launched.profile);
113
+ let server = null, egress = 'websocket', listenError = null, pending = null;
114
+ try {
115
+ const { WebSocketServer } = runtime('ws');
116
+ if (env.LITHERMES_MOTION_FAULT_LISTEN) {
117
+ throw Object.assign(new Error(`listen ${env.LITHERMES_MOTION_FAULT_LISTEN}: operation not permitted 127.0.0.1:0 (injected)`), { code: env.LITHERMES_MOTION_FAULT_LISTEN });
118
+ }
119
+ server = new WebSocketServer({ host: '127.0.0.1', port: 0, maxPayload: 1920 * 1080 * 4 * scale * scale + 1024 });
120
+ await new Promise((resolve, reject) => { server.once('listening', resolve); server.once('error', reject); });
121
+ server.on('connection', (socket) => {
122
+ socket.on('message', (data) => {
123
+ const current = pending;
124
+ pending = null;
125
+ current?.resolve(Buffer.isBuffer(data) ? data : Buffer.from(data));
126
+ });
127
+ });
128
+ await page.evaluate((port) => window.motionConnect(port), server.address().port);
129
+ } catch (error) {
130
+ listenError = `${error.code || 'error'}: ${String(error.message).split('\n')[0]}`;
131
+ try { server?.close(); } catch {}
132
+ server = null;
133
+ egress = 'cdp-pull';
134
+ }
135
+ let lastFrame = null;
136
+ return {
137
+ renderer, flags: launched.flags, software: isSoftwareRenderer(renderer), egress, listenError, sockets, attempts: launched.attempts,
138
+ get lastFrame() { return lastFrame; },
139
+ async frame(spec) {
140
+ spec.egress = egress;
141
+ if (spec.prime) {
142
+ await page.evaluate((s) => window.motionFrame(s), spec);
143
+ lastFrame = spec.frame;
144
+ return null;
145
+ }
146
+ if (server) {
147
+ const bytes = new Promise((resolve, reject) => { pending = { resolve, reject }; });
148
+ const meta = await page.evaluate((s) => window.motionFrame(s), spec);
149
+ lastFrame = spec.frame;
150
+ return { bytes: await bytes, meta };
151
+ }
152
+ let meta;
153
+ try {
154
+ meta = await page.evaluate((s) => window.motionFrame(s), spec);
155
+ } catch (error) {
156
+ throw blocked(EXIT.BLOCKED_NO_WEBGL2, `frame egress failed after listen was refused (${listenError}): ${String(error.message).split('\n')[0]}`);
157
+ }
158
+ lastFrame = spec.frame;
159
+ const bytes = Buffer.from(meta.rgbaBase64, 'base64');
160
+ delete meta.rgbaBase64;
161
+ return { bytes, meta };
162
+ },
163
+ async close() {
164
+ try { server?.close(); } catch {}
165
+ await context.close().catch(() => {});
166
+ rmSync(launched.profile, { recursive: true, force: true });
167
+ },
168
+ };
169
+ }
@@ -0,0 +1,52 @@
1
+ // When a motion turn counts as done (the route contract's completion rule).
2
+ // Only a completed, verified render counts: the manifest and gate report are
3
+ // newer than the last brief edit, and either the gate passed with all four
4
+ // artifacts delivered, or round 3 of 3 ended in exit 13 with the artifacts in
5
+ // the place the failure demands (delivered for an ordinary failure, withheld
6
+ // for a flash failure). Started, stills-only, BLOCKED or silent runs never count.
7
+ import { createHash } from 'node:crypto';
8
+ import { existsSync, readFileSync, statSync } from 'node:fs';
9
+ import { join } from 'node:path';
10
+
11
+ const ARTIFACTS = ['film.mp4', 'poster.png', 'reduced-motion.png'];
12
+ const previewName = (dir) => ['preview.webp', 'preview.gif'].find((name) => existsSync(join(dir, name)));
13
+ const no = (reason) => ({ done: false, reason });
14
+
15
+ export function checkCompletion(out) {
16
+ const statePath = join(out, 'run-state.json');
17
+ if (!existsSync(statePath)) return no('no run-state.json: the render command never finished');
18
+ const state = JSON.parse(readFileSync(statePath, 'utf8'));
19
+ if (state.exitCode === null || state.exitCode === undefined || !state.finished) return no('the render command started but did not finish');
20
+ if (state.mode === 'stills-only' || state.mode === 'stills' || state.mode === 'sheet') return no('a stills-only look pass is not a delivered film');
21
+ if ([10, 11, 12, 14, 15].includes(state.exitCode)) return no(`BLOCKED exit ${state.exitCode}: fix the named prerequisite and rerun`);
22
+ if (state.exitCode !== 0 && state.exitCode !== 13) return no(`the command exited ${state.exitCode}`);
23
+ const manifestPath = join(out, 'manifest.json'), reportPath = join(out, 'gate-report.txt');
24
+ if (!existsSync(manifestPath)) return no('manifest.json is missing');
25
+ if (!existsSync(reportPath)) return no('gate-report.txt is missing');
26
+ const manifest = JSON.parse(readFileSync(manifestPath, 'utf8'));
27
+ const brief = manifest.lithermes?.brief;
28
+ if (!brief?.path || !existsSync(brief.path)) return no('the manifest does not name an existing brief');
29
+ const briefTime = statSync(brief.path).mtimeMs;
30
+ if (statSync(manifestPath).mtimeMs < briefTime || statSync(reportPath).mtimeMs < briefTime) return no('the brief changed after the last render; rerun');
31
+ if (createHash('sha256').update(readFileSync(brief.path)).digest('hex') !== brief.sha256) return no('the brief no longer matches the rendered one; rerun');
32
+ const report = readFileSync(reportPath, 'utf8');
33
+ const failed = state.failed || [];
34
+ const flash = failed.includes('MO-C-03');
35
+ const delivered = ARTIFACTS.every((name) => existsSync(join(out, name))) && previewName(out);
36
+ const withheldDir = join(out, 'withheld');
37
+ const withheld = ARTIFACTS.every((name) => existsSync(join(withheldDir, name))) && previewName(withheldDir);
38
+ if (state.exitCode === 0) {
39
+ if (!/QA gate: PASS/.test(report)) return no('exit 0 without a passing gate report');
40
+ return delivered ? { done: true, reason: 'gate passed; four artifacts delivered' } : no('gate passed but an artifact is missing from its deliverable name');
41
+ }
42
+ if ((state.round ?? manifest.lithermes?.round ?? 1) < 3) return no(`gate failed in round ${state.round}; fix the named rules and rerun with --round ${(state.round || 1) + 1}`);
43
+ if (flash) {
44
+ if (delivered || ['film.mp4', 'poster.png', 'preview.webp', 'preview.gif'].some((name) => existsSync(join(out, name)))) return no('a flash-failing export sits at a deliverable name');
45
+ if (!withheld) return no('flash failure without the exports in withheld/');
46
+ if (!/WITHHELD/.test(report)) return no('the report does not say the render is withheld');
47
+ return { done: true, reason: 'round 3 flash failure: exports withheld pending a fix' };
48
+ }
49
+ if (!delivered) return no('round 3 failure but the artifacts are not at their deliverable names');
50
+ if (!failed.length || !failed.every((id) => report.includes(id))) return no('the report does not name the failed rules');
51
+ return { done: true, reason: `round 3 ended with ${failed.join(', ')} failing; artifacts delivered with the report` };
52
+ }