@litfamily/litopencode 1.0.7 → 1.0.10

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 (726) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/README-Ko-KR.md +348 -31
  3. package/README.md +347 -29
  4. package/dist/activation-primary-prompts.d.ts +1 -0
  5. package/dist/activation-primary-prompts.js +16 -0
  6. package/dist/activation-probe.js +4 -1
  7. package/dist/activation-prompt-utils.d.ts +1 -1
  8. package/dist/activation-routing.d.ts +6 -1
  9. package/dist/activation-routing.js +174 -16
  10. package/dist/activation-workflow-prompts.d.ts +1 -1
  11. package/dist/activation-workflow-prompts.js +18 -17
  12. package/dist/activation.d.ts +15 -8
  13. package/dist/activation.js +61 -7
  14. package/dist/agents/defaults.js +14 -6
  15. package/dist/cli/command-aliases.js +24 -22
  16. package/dist/cli/doctor.js +5 -0
  17. package/dist/cli/install-report.d.ts +1 -0
  18. package/dist/cli/install-report.js +4 -0
  19. package/dist/cli/install.js +7 -4
  20. package/dist/cli/managed-skill-assets.d.ts +1 -1
  21. package/dist/cli/managed-skill-assets.js +15 -5
  22. package/dist/cli/motion-runtime.d.ts +6 -0
  23. package/dist/cli/motion-runtime.js +46 -0
  24. package/dist/cli/native-skill-install.js +32 -9
  25. package/dist/cli/native-skill-integrity.js +1 -0
  26. package/dist/cli/native-skills.d.ts +2 -0
  27. package/dist/cli/native-skills.js +2 -1
  28. package/dist/cli/office-dependencies.d.ts +14 -0
  29. package/dist/cli/office-dependencies.js +24 -0
  30. package/dist/cli.js +13 -3
  31. package/dist/commands.d.ts +2 -11
  32. package/dist/commands.js +9 -17
  33. package/dist/deliverable-hedge-guard.d.ts +20 -21
  34. package/dist/deliverable-hedge-guard.js +234 -275
  35. package/dist/features.d.ts +81 -2
  36. package/dist/features.js +80 -13
  37. package/dist/hooks.d.ts +3 -2
  38. package/dist/hooks.js +4 -4
  39. package/dist/ignition.d.ts +1 -1
  40. package/dist/ignition.js +15 -4
  41. package/dist/index.d.ts +1 -1
  42. package/dist/index.js +1 -1
  43. package/dist/interface-handoff.d.ts +1 -0
  44. package/dist/interface-handoff.js +1 -0
  45. package/dist/jev-skill-hint.d.ts +48 -0
  46. package/dist/jev-skill-hint.js +291 -0
  47. package/dist/motion-image-reads.d.ts +6 -0
  48. package/dist/motion-image-reads.js +46 -0
  49. package/dist/server.js +38 -20
  50. package/dist/skill-renames.d.ts +4 -2
  51. package/dist/skill-renames.js +12 -4
  52. package/dist/skills.d.ts +31 -3
  53. package/dist/skills.js +53 -9
  54. package/dist/tools.js +4 -4
  55. package/docs/ab/S11/baseline-desktop.webp +0 -0
  56. package/docs/ab/S11/baseline-phone.webp +0 -0
  57. package/docs/ab/S11/lit-desktop.webp +0 -0
  58. package/docs/ab/S11/lit-phone.webp +0 -0
  59. package/docs/ab/S3/baseline-desktop.webp +0 -0
  60. package/docs/ab/S3/baseline-phone.webp +0 -0
  61. package/docs/ab/S3/lit-desktop.webp +0 -0
  62. package/docs/ab/S3/lit-phone.webp +0 -0
  63. package/docs/ab/S4/baseline-desktop.webp +0 -0
  64. package/docs/ab/S4/baseline-phone.webp +0 -0
  65. package/docs/ab/S4/lit-desktop.webp +0 -0
  66. package/docs/ab/S4/lit-phone.webp +0 -0
  67. package/docs/ab/S5/lit-slides.webp +0 -0
  68. package/docs/ab/S7/lit-diagram.webp +0 -0
  69. package/docs/ab/S8/baseline-slides.webp +0 -0
  70. package/docs/ab/S8/lit-slides.webp +0 -0
  71. package/docs/ab/S9/lit-pages.webp +0 -0
  72. package/docs/assets/cover-motion-still.webp +0 -0
  73. package/docs/assets/cover-motion.webp +0 -0
  74. package/docs/assets/readme/badge-version.svg +1 -1
  75. package/docs/assets/skills/autoconference.webp +0 -0
  76. package/docs/assets/skills/automatic-guards.webp +0 -0
  77. package/docs/assets/skills/autoresearch.webp +0 -0
  78. package/docs/assets/skills/browser-drive.webp +0 -0
  79. package/docs/assets/skills/debugging.webp +0 -0
  80. package/docs/assets/skills/deep-interview.webp +0 -0
  81. package/docs/assets/skills/doctor-installer.webp +0 -0
  82. package/docs/assets/skills/durable-litgoal.webp +0 -0
  83. package/docs/assets/skills/frontend-ui-ux.webp +0 -0
  84. package/docs/assets/skills/lit-burnoff-file.webp +0 -0
  85. package/docs/assets/skills/lit-burnoff.webp +0 -0
  86. package/docs/assets/skills/lit-code.webp +0 -0
  87. package/docs/assets/skills/lit-commit.webp +0 -0
  88. package/docs/assets/skills/lit-comprehend.webp +0 -0
  89. package/docs/assets/skills/lit-crucible.webp +0 -0
  90. package/docs/assets/skills/lit-diagram-drawer.webp +0 -0
  91. package/docs/assets/skills/lit-docx.webp +0 -0
  92. package/docs/assets/skills/lit-fetch.webp +0 -0
  93. package/docs/assets/skills/lit-handoff.webp +0 -0
  94. package/docs/assets/skills/lit-humanizer.webp +0 -0
  95. package/docs/assets/skills/lit-init.webp +0 -0
  96. package/docs/assets/skills/lit-plan.webp +0 -0
  97. package/docs/assets/skills/lit-pptx.webp +0 -0
  98. package/docs/assets/skills/lit-recap.webp +0 -0
  99. package/docs/assets/skills/lit-scientific-visualization.webp +0 -0
  100. package/docs/assets/skills/lit-typographic-motion.webp +0 -0
  101. package/docs/assets/skills/litresearch.webp +0 -0
  102. package/docs/assets/skills/litwork.webp +0 -0
  103. package/docs/assets/skills/lsp-setup.webp +0 -0
  104. package/docs/assets/skills/lsp.webp +0 -0
  105. package/docs/assets/skills/readme-studio.webp +0 -0
  106. package/docs/assets/skills/refactor.webp +0 -0
  107. package/docs/assets/skills/review-work.webp +0 -0
  108. package/docs/assets/skills/rules.webp +0 -0
  109. package/docs/assets/skills/start-work.webp +0 -0
  110. package/docs/assets/skills/structural-search.webp +0 -0
  111. package/docs/assets/skills/visual-qa.webp +0 -0
  112. package/docs/assets/skills/wikify.webp +0 -0
  113. package/docs/privacy.md +12 -0
  114. package/docs/reference-Ko-KR.md +44 -1
  115. package/docs/reference.md +49 -2
  116. package/package.json +1 -1
  117. package/rules/bundled-rules/lit-humanizer.md +12 -0
  118. package/skills/autoconference/SKILL.md +1 -1
  119. package/skills/autoconference/assets/report_template.md +1 -1
  120. package/skills/autoresearch/references/type-checklists.md +1 -1
  121. package/skills/browser-drive/SKILL.md +19 -5
  122. package/skills/browser-drive/scripts/capability-probe.mjs +26 -5
  123. package/skills/frontend-ui-ux/SKILL.md +10 -15
  124. package/skills/frontend-ui-ux/data/THIRD-PARTY-NOTICE.txt +10 -0
  125. package/skills/frontend-ui-ux/references/adaptive-layout.md +3 -11
  126. package/skills/frontend-ui-ux/references/brand-and-imagery.md +6 -11
  127. package/skills/frontend-ui-ux/references/complete-contract.md +10 -3
  128. package/skills/frontend-ui-ux/references/composition.md +1 -7
  129. package/skills/frontend-ui-ux/references/craft-floor.md +94 -0
  130. package/skills/frontend-ui-ux/references/creative-directions.md +1 -7
  131. package/skills/frontend-ui-ux/references/evidence-review.md +2 -12
  132. package/skills/frontend-ui-ux/references/implementation-platforms.md +1 -4
  133. package/skills/frontend-ui-ux/references/inclusive-interface.md +1 -3
  134. package/skills/frontend-ui-ux/references/interaction-motion.md +1 -7
  135. package/skills/frontend-ui-ux/references/motion-guide.md +125 -0
  136. package/skills/frontend-ui-ux/references/operating-lanes.md +2 -8
  137. package/skills/frontend-ui-ux/references/product-direction.md +1 -6
  138. package/skills/frontend-ui-ux/references/production.md +12 -5
  139. package/skills/frontend-ui-ux/references/redesign-playbook.md +1 -7
  140. package/skills/frontend-ui-ux/references/slop-register.md +103 -0
  141. package/skills/frontend-ui-ux/references/system-foundations.md +1 -8
  142. package/skills/frontend-ui-ux/references/taste-direction.md +4 -11
  143. package/skills/frontend-ui-ux/references/visual-language.md +1 -6
  144. package/skills/frontend-ui-ux/references/visual-reconstruction.md +2 -7
  145. package/skills/frontend-ui-ux/scripts/probe-page.mjs +326 -0
  146. package/skills/frontend-ui-ux/scripts/probe-server.mjs +24 -0
  147. package/skills/frontend-ui-ux/scripts/probe-static.mjs +42 -0
  148. package/skills/frontend-ui-ux/scripts/probe-thresholds.json +86 -0
  149. package/skills/frontend-ui-ux/scripts/probe.mjs +183 -0
  150. package/skills/lit-comprehend/SKILL.md +10 -11
  151. package/skills/lit-comprehend/references/artifact-template.md +2 -18
  152. package/skills/lit-comprehend/scripts/verify-explainer.ts +0 -14
  153. package/skills/lit-diagram-drawer/NOTICE.md +33 -0
  154. package/skills/lit-diagram-drawer/SKILL.md +101 -0
  155. package/skills/lit-diagram-drawer/assets/examples/type-architecture-dark.html +1 -0
  156. package/skills/lit-diagram-drawer/assets/examples/type-architecture-full.html +1 -0
  157. package/skills/lit-diagram-drawer/assets/examples/type-architecture-light.html +1 -0
  158. package/skills/lit-diagram-drawer/assets/examples/type-bar-dark.html +1 -0
  159. package/skills/lit-diagram-drawer/assets/examples/type-bar-full.html +1 -0
  160. package/skills/lit-diagram-drawer/assets/examples/type-bar-light.html +1 -0
  161. package/skills/lit-diagram-drawer/assets/examples/type-beeswarm-dark.html +1 -0
  162. package/skills/lit-diagram-drawer/assets/examples/type-beeswarm-full.html +1 -0
  163. package/skills/lit-diagram-drawer/assets/examples/type-beeswarm-light.html +1 -0
  164. package/skills/lit-diagram-drawer/assets/examples/type-bubble-dark.html +1 -0
  165. package/skills/lit-diagram-drawer/assets/examples/type-bubble-full.html +1 -0
  166. package/skills/lit-diagram-drawer/assets/examples/type-bubble-light.html +1 -0
  167. package/skills/lit-diagram-drawer/assets/examples/type-bump-dark.html +1 -0
  168. package/skills/lit-diagram-drawer/assets/examples/type-bump-full.html +1 -0
  169. package/skills/lit-diagram-drawer/assets/examples/type-bump-light.html +1 -0
  170. package/skills/lit-diagram-drawer/assets/examples/type-data-flow-dark.html +1 -0
  171. package/skills/lit-diagram-drawer/assets/examples/type-data-flow-full.html +1 -0
  172. package/skills/lit-diagram-drawer/assets/examples/type-data-flow-light.html +1 -0
  173. package/skills/lit-diagram-drawer/assets/examples/type-datalake-dark.html +1 -0
  174. package/skills/lit-diagram-drawer/assets/examples/type-datalake-full.html +1 -0
  175. package/skills/lit-diagram-drawer/assets/examples/type-datalake-light.html +1 -0
  176. package/skills/lit-diagram-drawer/assets/examples/type-db-schema-dark.html +1 -0
  177. package/skills/lit-diagram-drawer/assets/examples/type-db-schema-full.html +1 -0
  178. package/skills/lit-diagram-drawer/assets/examples/type-db-schema-light.html +1 -0
  179. package/skills/lit-diagram-drawer/assets/examples/type-dependency-dark.html +1 -0
  180. package/skills/lit-diagram-drawer/assets/examples/type-dependency-full.html +1 -0
  181. package/skills/lit-diagram-drawer/assets/examples/type-dependency-light.html +1 -0
  182. package/skills/lit-diagram-drawer/assets/examples/type-deployment-dark.html +1 -0
  183. package/skills/lit-diagram-drawer/assets/examples/type-deployment-full.html +1 -0
  184. package/skills/lit-diagram-drawer/assets/examples/type-deployment-light.html +1 -0
  185. package/skills/lit-diagram-drawer/assets/examples/type-dp-integration-dark.html +1 -0
  186. package/skills/lit-diagram-drawer/assets/examples/type-dp-integration-full.html +1 -0
  187. package/skills/lit-diagram-drawer/assets/examples/type-dp-integration-light.html +1 -0
  188. package/skills/lit-diagram-drawer/assets/examples/type-dp-security-matrix-dark.html +1 -0
  189. package/skills/lit-diagram-drawer/assets/examples/type-dp-security-matrix-full.html +1 -0
  190. package/skills/lit-diagram-drawer/assets/examples/type-dp-security-matrix-light.html +1 -0
  191. package/skills/lit-diagram-drawer/assets/examples/type-er-dark.html +1 -0
  192. package/skills/lit-diagram-drawer/assets/examples/type-er-full.html +1 -0
  193. package/skills/lit-diagram-drawer/assets/examples/type-er-light.html +1 -0
  194. package/skills/lit-diagram-drawer/assets/examples/type-fishbone-dark.html +1 -0
  195. package/skills/lit-diagram-drawer/assets/examples/type-fishbone-full.html +1 -0
  196. package/skills/lit-diagram-drawer/assets/examples/type-fishbone-light.html +1 -0
  197. package/skills/lit-diagram-drawer/assets/examples/type-flowchart-dark.html +1 -0
  198. package/skills/lit-diagram-drawer/assets/examples/type-flowchart-full.html +1 -0
  199. package/skills/lit-diagram-drawer/assets/examples/type-flowchart-light.html +1 -0
  200. package/skills/lit-diagram-drawer/assets/examples/type-gantt-dark.html +1 -0
  201. package/skills/lit-diagram-drawer/assets/examples/type-gantt-full.html +1 -0
  202. package/skills/lit-diagram-drawer/assets/examples/type-gantt-light.html +1 -0
  203. package/skills/lit-diagram-drawer/assets/examples/type-heatmap-dark.html +1 -0
  204. package/skills/lit-diagram-drawer/assets/examples/type-heatmap-full.html +1 -0
  205. package/skills/lit-diagram-drawer/assets/examples/type-heatmap-light.html +1 -0
  206. package/skills/lit-diagram-drawer/assets/examples/type-high-level-dark.html +1 -0
  207. package/skills/lit-diagram-drawer/assets/examples/type-high-level-full.html +1 -0
  208. package/skills/lit-diagram-drawer/assets/examples/type-high-level-light.html +1 -0
  209. package/skills/lit-diagram-drawer/assets/examples/type-high-level-vertical-dark.html +1 -0
  210. package/skills/lit-diagram-drawer/assets/examples/type-high-level-vertical-full.html +1 -0
  211. package/skills/lit-diagram-drawer/assets/examples/type-high-level-vertical-light.html +1 -0
  212. package/skills/lit-diagram-drawer/assets/examples/type-import-drawio-dark.html +1 -0
  213. package/skills/lit-diagram-drawer/assets/examples/type-import-drawio-full.html +1 -0
  214. package/skills/lit-diagram-drawer/assets/examples/type-import-drawio-light.html +1 -0
  215. package/skills/lit-diagram-drawer/assets/examples/type-import-excalidraw-dark.html +1 -0
  216. package/skills/lit-diagram-drawer/assets/examples/type-import-excalidraw-full.html +1 -0
  217. package/skills/lit-diagram-drawer/assets/examples/type-import-excalidraw-light.html +1 -0
  218. package/skills/lit-diagram-drawer/assets/examples/type-import-mermaid-dark.html +1 -0
  219. package/skills/lit-diagram-drawer/assets/examples/type-import-mermaid-full.html +1 -0
  220. package/skills/lit-diagram-drawer/assets/examples/type-import-mermaid-light.html +1 -0
  221. package/skills/lit-diagram-drawer/assets/examples/type-it-state-dark.html +1 -0
  222. package/skills/lit-diagram-drawer/assets/examples/type-it-state-full.html +1 -0
  223. package/skills/lit-diagram-drawer/assets/examples/type-it-state-light.html +1 -0
  224. package/skills/lit-diagram-drawer/assets/examples/type-journey-dark.html +1 -0
  225. package/skills/lit-diagram-drawer/assets/examples/type-journey-full.html +1 -0
  226. package/skills/lit-diagram-drawer/assets/examples/type-journey-light.html +1 -0
  227. package/skills/lit-diagram-drawer/assets/examples/type-kanban-dark.html +1 -0
  228. package/skills/lit-diagram-drawer/assets/examples/type-kanban-full.html +1 -0
  229. package/skills/lit-diagram-drawer/assets/examples/type-kanban-light.html +1 -0
  230. package/skills/lit-diagram-drawer/assets/examples/type-layers-dark.html +1 -0
  231. package/skills/lit-diagram-drawer/assets/examples/type-layers-full.html +1 -0
  232. package/skills/lit-diagram-drawer/assets/examples/type-layers-light.html +1 -0
  233. package/skills/lit-diagram-drawer/assets/examples/type-line-dark.html +1 -0
  234. package/skills/lit-diagram-drawer/assets/examples/type-line-full.html +1 -0
  235. package/skills/lit-diagram-drawer/assets/examples/type-line-light.html +1 -0
  236. package/skills/lit-diagram-drawer/assets/examples/type-loop-dark.html +1 -0
  237. package/skills/lit-diagram-drawer/assets/examples/type-loop-full.html +1 -0
  238. package/skills/lit-diagram-drawer/assets/examples/type-loop-light.html +1 -0
  239. package/skills/lit-diagram-drawer/assets/examples/type-loop-terminal-dark.html +1 -0
  240. package/skills/lit-diagram-drawer/assets/examples/type-loop-terminal-full.html +1 -0
  241. package/skills/lit-diagram-drawer/assets/examples/type-loop-terminal-light.html +1 -0
  242. package/skills/lit-diagram-drawer/assets/examples/type-marimekko-dark.html +1 -0
  243. package/skills/lit-diagram-drawer/assets/examples/type-marimekko-full.html +1 -0
  244. package/skills/lit-diagram-drawer/assets/examples/type-marimekko-light.html +1 -0
  245. package/skills/lit-diagram-drawer/assets/examples/type-medallion-dark.html +1 -0
  246. package/skills/lit-diagram-drawer/assets/examples/type-medallion-full.html +1 -0
  247. package/skills/lit-diagram-drawer/assets/examples/type-medallion-light.html +1 -0
  248. package/skills/lit-diagram-drawer/assets/examples/type-nested-dark.html +1 -0
  249. package/skills/lit-diagram-drawer/assets/examples/type-nested-full.html +1 -0
  250. package/skills/lit-diagram-drawer/assets/examples/type-nested-light.html +1 -0
  251. package/skills/lit-diagram-drawer/assets/examples/type-org-chart-dark.html +1 -0
  252. package/skills/lit-diagram-drawer/assets/examples/type-org-chart-full.html +1 -0
  253. package/skills/lit-diagram-drawer/assets/examples/type-org-chart-light.html +1 -0
  254. package/skills/lit-diagram-drawer/assets/examples/type-paved-road-animated-dark.html +1 -0
  255. package/skills/lit-diagram-drawer/assets/examples/type-paved-road-animated-full.html +1 -0
  256. package/skills/lit-diagram-drawer/assets/examples/type-paved-road-animated-light.html +1 -0
  257. package/skills/lit-diagram-drawer/assets/examples/type-polar-dark.html +1 -0
  258. package/skills/lit-diagram-drawer/assets/examples/type-polar-full.html +1 -0
  259. package/skills/lit-diagram-drawer/assets/examples/type-polar-light.html +1 -0
  260. package/skills/lit-diagram-drawer/assets/examples/type-policy-trace-animated-dark.html +1 -0
  261. package/skills/lit-diagram-drawer/assets/examples/type-policy-trace-animated-full.html +1 -0
  262. package/skills/lit-diagram-drawer/assets/examples/type-policy-trace-animated-light.html +1 -0
  263. package/skills/lit-diagram-drawer/assets/examples/type-process-dark.html +1 -0
  264. package/skills/lit-diagram-drawer/assets/examples/type-process-full.html +1 -0
  265. package/skills/lit-diagram-drawer/assets/examples/type-process-light.html +1 -0
  266. package/skills/lit-diagram-drawer/assets/examples/type-pyramid-dark.html +1 -0
  267. package/skills/lit-diagram-drawer/assets/examples/type-pyramid-full.html +1 -0
  268. package/skills/lit-diagram-drawer/assets/examples/type-pyramid-light.html +1 -0
  269. package/skills/lit-diagram-drawer/assets/examples/type-quadrant-consultant-dark.html +1 -0
  270. package/skills/lit-diagram-drawer/assets/examples/type-quadrant-consultant-full.html +1 -0
  271. package/skills/lit-diagram-drawer/assets/examples/type-quadrant-consultant-light.html +1 -0
  272. package/skills/lit-diagram-drawer/assets/examples/type-quadrant-dark.html +1 -0
  273. package/skills/lit-diagram-drawer/assets/examples/type-quadrant-full.html +1 -0
  274. package/skills/lit-diagram-drawer/assets/examples/type-quadrant-light.html +1 -0
  275. package/skills/lit-diagram-drawer/assets/examples/type-queue-animated-dark.html +1 -0
  276. package/skills/lit-diagram-drawer/assets/examples/type-queue-animated-full.html +1 -0
  277. package/skills/lit-diagram-drawer/assets/examples/type-queue-animated-light.html +1 -0
  278. package/skills/lit-diagram-drawer/assets/examples/type-radar-dark.html +1 -0
  279. package/skills/lit-diagram-drawer/assets/examples/type-radar-full.html +1 -0
  280. package/skills/lit-diagram-drawer/assets/examples/type-radar-light.html +1 -0
  281. package/skills/lit-diagram-drawer/assets/examples/type-ridgeline-dark.html +1 -0
  282. package/skills/lit-diagram-drawer/assets/examples/type-ridgeline-full.html +1 -0
  283. package/skills/lit-diagram-drawer/assets/examples/type-ridgeline-light.html +1 -0
  284. package/skills/lit-diagram-drawer/assets/examples/type-sankey-dark.html +1 -0
  285. package/skills/lit-diagram-drawer/assets/examples/type-sankey-full.html +1 -0
  286. package/skills/lit-diagram-drawer/assets/examples/type-sankey-light.html +1 -0
  287. package/skills/lit-diagram-drawer/assets/examples/type-scatter-dark.html +1 -0
  288. package/skills/lit-diagram-drawer/assets/examples/type-scatter-full.html +1 -0
  289. package/skills/lit-diagram-drawer/assets/examples/type-scatter-light.html +1 -0
  290. package/skills/lit-diagram-drawer/assets/examples/type-sequence-dark.html +1 -0
  291. package/skills/lit-diagram-drawer/assets/examples/type-sequence-full.html +1 -0
  292. package/skills/lit-diagram-drawer/assets/examples/type-sequence-light.html +1 -0
  293. package/skills/lit-diagram-drawer/assets/examples/type-sequence-oauth-dark.html +1 -0
  294. package/skills/lit-diagram-drawer/assets/examples/type-sequence-oauth-full.html +1 -0
  295. package/skills/lit-diagram-drawer/assets/examples/type-sequence-oauth-light.html +1 -0
  296. package/skills/lit-diagram-drawer/assets/examples/type-slopegraph-dark.html +1 -0
  297. package/skills/lit-diagram-drawer/assets/examples/type-slopegraph-full.html +1 -0
  298. package/skills/lit-diagram-drawer/assets/examples/type-slopegraph-light.html +1 -0
  299. package/skills/lit-diagram-drawer/assets/examples/type-state-dark.html +1 -0
  300. package/skills/lit-diagram-drawer/assets/examples/type-state-full.html +1 -0
  301. package/skills/lit-diagram-drawer/assets/examples/type-state-lifecycle-dark.html +1 -0
  302. package/skills/lit-diagram-drawer/assets/examples/type-state-lifecycle-full.html +1 -0
  303. package/skills/lit-diagram-drawer/assets/examples/type-state-lifecycle-light.html +1 -0
  304. package/skills/lit-diagram-drawer/assets/examples/type-state-light.html +1 -0
  305. package/skills/lit-diagram-drawer/assets/examples/type-story-map-dark.html +1 -0
  306. package/skills/lit-diagram-drawer/assets/examples/type-story-map-full.html +1 -0
  307. package/skills/lit-diagram-drawer/assets/examples/type-story-map-light.html +1 -0
  308. package/skills/lit-diagram-drawer/assets/examples/type-streamgraph-dark.html +1 -0
  309. package/skills/lit-diagram-drawer/assets/examples/type-streamgraph-full.html +1 -0
  310. package/skills/lit-diagram-drawer/assets/examples/type-streamgraph-light.html +1 -0
  311. package/skills/lit-diagram-drawer/assets/examples/type-swimlane-dark.html +1 -0
  312. package/skills/lit-diagram-drawer/assets/examples/type-swimlane-full.html +1 -0
  313. package/skills/lit-diagram-drawer/assets/examples/type-swimlane-light.html +1 -0
  314. package/skills/lit-diagram-drawer/assets/examples/type-timeline-dark.html +1 -0
  315. package/skills/lit-diagram-drawer/assets/examples/type-timeline-full.html +1 -0
  316. package/skills/lit-diagram-drawer/assets/examples/type-timeline-light.html +1 -0
  317. package/skills/lit-diagram-drawer/assets/examples/type-tree-block-decomposition-dark.html +1 -0
  318. package/skills/lit-diagram-drawer/assets/examples/type-tree-block-decomposition-full.html +1 -0
  319. package/skills/lit-diagram-drawer/assets/examples/type-tree-block-decomposition-light.html +1 -0
  320. package/skills/lit-diagram-drawer/assets/examples/type-tree-dark.html +1 -0
  321. package/skills/lit-diagram-drawer/assets/examples/type-tree-full.html +1 -0
  322. package/skills/lit-diagram-drawer/assets/examples/type-tree-light.html +1 -0
  323. package/skills/lit-diagram-drawer/assets/examples/type-treemap-dark.html +1 -0
  324. package/skills/lit-diagram-drawer/assets/examples/type-treemap-full.html +1 -0
  325. package/skills/lit-diagram-drawer/assets/examples/type-treemap-light.html +1 -0
  326. package/skills/lit-diagram-drawer/assets/examples/type-uml-class-dark.html +1 -0
  327. package/skills/lit-diagram-drawer/assets/examples/type-uml-class-full.html +1 -0
  328. package/skills/lit-diagram-drawer/assets/examples/type-uml-class-light.html +1 -0
  329. package/skills/lit-diagram-drawer/assets/examples/type-venn-dark.html +1 -0
  330. package/skills/lit-diagram-drawer/assets/examples/type-venn-full.html +1 -0
  331. package/skills/lit-diagram-drawer/assets/examples/type-venn-light.html +1 -0
  332. package/skills/lit-diagram-drawer/assets/examples/type-wardley-dark.html +1 -0
  333. package/skills/lit-diagram-drawer/assets/examples/type-wardley-full.html +1 -0
  334. package/skills/lit-diagram-drawer/assets/examples/type-wardley-light.html +1 -0
  335. package/skills/lit-diagram-drawer/assets/examples/type-waterfall-dark.html +1 -0
  336. package/skills/lit-diagram-drawer/assets/examples/type-waterfall-full.html +1 -0
  337. package/skills/lit-diagram-drawer/assets/examples/type-waterfall-light.html +1 -0
  338. package/skills/lit-diagram-drawer/assets/fonts/OFL.txt +94 -0
  339. package/skills/lit-diagram-drawer/assets/fonts/PretendardVariable.woff2 +0 -0
  340. package/skills/lit-diagram-drawer/assets/fonts/provenance.json +23 -0
  341. package/skills/lit-diagram-drawer/assets/icons.html +231 -0
  342. package/skills/lit-diagram-drawer/assets/licenses/devicon-MIT.txt +20 -0
  343. package/skills/lit-diagram-drawer/assets/licenses/diagram-design-MIT.txt +21 -0
  344. package/skills/lit-diagram-drawer/assets/licenses/log-z-MIT.txt +21 -0
  345. package/skills/lit-diagram-drawer/assets/licenses/simple-icons-CC0.md +30 -0
  346. package/skills/lit-diagram-drawer/assets/licenses/tabler-MIT.txt +21 -0
  347. package/skills/lit-diagram-drawer/examples/01-service-architecture/after.html +1 -0
  348. package/skills/lit-diagram-drawer/examples/01-service-architecture/brief.md +33 -0
  349. package/skills/lit-diagram-drawer/examples/02-release-decision/after.html +1 -0
  350. package/skills/lit-diagram-drawer/examples/02-release-decision/brief.md +18 -0
  351. package/skills/lit-diagram-drawer/examples/03-data-retention/after.html +1 -0
  352. package/skills/lit-diagram-drawer/examples/03-data-retention/brief.md +19 -0
  353. package/skills/lit-diagram-drawer/examples/04-oauth-sequence/after.html +1 -0
  354. package/skills/lit-diagram-drawer/examples/04-oauth-sequence/brief.md +17 -0
  355. package/skills/lit-diagram-drawer/examples/05-review-lanes/after.html +1 -0
  356. package/skills/lit-diagram-drawer/examples/05-review-lanes/brief.md +17 -0
  357. package/skills/lit-diagram-drawer/examples/06-rollout-gates/after.html +1 -0
  358. package/skills/lit-diagram-drawer/examples/06-rollout-gates/brief.md +17 -0
  359. package/skills/lit-diagram-drawer/examples/07-deployment-boundary/after.html +1 -0
  360. package/skills/lit-diagram-drawer/examples/07-deployment-boundary/brief.md +19 -0
  361. package/skills/lit-diagram-drawer/examples/08-policy-traces/after.html +1 -0
  362. package/skills/lit-diagram-drawer/examples/08-policy-traces/brief.md +20 -0
  363. package/skills/lit-diagram-drawer/references/accessibility.md +37 -0
  364. package/skills/lit-diagram-drawer/references/export.md +17 -0
  365. package/skills/lit-diagram-drawer/references/import-drawio.md +13 -0
  366. package/skills/lit-diagram-drawer/references/import-excalidraw.md +11 -0
  367. package/skills/lit-diagram-drawer/references/import-mermaid.md +12 -0
  368. package/skills/lit-diagram-drawer/references/import-schema.md +28 -0
  369. package/skills/lit-diagram-drawer/references/korean-typography.md +34 -0
  370. package/skills/lit-diagram-drawer/references/motion.md +29 -0
  371. package/skills/lit-diagram-drawer/references/office-pptx-docx.md +28 -0
  372. package/skills/lit-diagram-drawer/references/output-spec.md +48 -0
  373. package/skills/lit-diagram-drawer/references/primitive-annotation.md +12 -0
  374. package/skills/lit-diagram-drawer/references/primitive-icons.md +21 -0
  375. package/skills/lit-diagram-drawer/references/primitive-sketchy.md +11 -0
  376. package/skills/lit-diagram-drawer/references/primitive-terminal.md +11 -0
  377. package/skills/lit-diagram-drawer/references/profiles.md +24 -0
  378. package/skills/lit-diagram-drawer/references/semantic-patterns.md +27 -0
  379. package/skills/lit-diagram-drawer/references/style-guide.md +67 -0
  380. package/skills/lit-diagram-drawer/references/type-architecture.md +51 -0
  381. package/skills/lit-diagram-drawer/references/type-bar.md +51 -0
  382. package/skills/lit-diagram-drawer/references/type-beeswarm.md +49 -0
  383. package/skills/lit-diagram-drawer/references/type-bubble.md +49 -0
  384. package/skills/lit-diagram-drawer/references/type-bump.md +49 -0
  385. package/skills/lit-diagram-drawer/references/type-catalog.json +1433 -0
  386. package/skills/lit-diagram-drawer/references/type-data-flow.md +51 -0
  387. package/skills/lit-diagram-drawer/references/type-datalake.md +49 -0
  388. package/skills/lit-diagram-drawer/references/type-db-schema.md +49 -0
  389. package/skills/lit-diagram-drawer/references/type-dependency.md +49 -0
  390. package/skills/lit-diagram-drawer/references/type-deployment.md +49 -0
  391. package/skills/lit-diagram-drawer/references/type-dp-integration.md +49 -0
  392. package/skills/lit-diagram-drawer/references/type-dp-security-matrix.md +49 -0
  393. package/skills/lit-diagram-drawer/references/type-er.md +49 -0
  394. package/skills/lit-diagram-drawer/references/type-fishbone.md +49 -0
  395. package/skills/lit-diagram-drawer/references/type-flowchart.md +49 -0
  396. package/skills/lit-diagram-drawer/references/type-gantt.md +49 -0
  397. package/skills/lit-diagram-drawer/references/type-heatmap.md +53 -0
  398. package/skills/lit-diagram-drawer/references/type-high-level-vertical.md +53 -0
  399. package/skills/lit-diagram-drawer/references/type-high-level.md +53 -0
  400. package/skills/lit-diagram-drawer/references/type-import-drawio.md +53 -0
  401. package/skills/lit-diagram-drawer/references/type-import-excalidraw.md +53 -0
  402. package/skills/lit-diagram-drawer/references/type-import-mermaid.md +53 -0
  403. package/skills/lit-diagram-drawer/references/type-it-state.md +54 -0
  404. package/skills/lit-diagram-drawer/references/type-journey.md +54 -0
  405. package/skills/lit-diagram-drawer/references/type-kanban.md +54 -0
  406. package/skills/lit-diagram-drawer/references/type-layers.md +54 -0
  407. package/skills/lit-diagram-drawer/references/type-line.md +54 -0
  408. package/skills/lit-diagram-drawer/references/type-loop-terminal.md +53 -0
  409. package/skills/lit-diagram-drawer/references/type-loop.md +54 -0
  410. package/skills/lit-diagram-drawer/references/type-marimekko.md +54 -0
  411. package/skills/lit-diagram-drawer/references/type-medallion.md +54 -0
  412. package/skills/lit-diagram-drawer/references/type-nested.md +59 -0
  413. package/skills/lit-diagram-drawer/references/type-org-chart.md +58 -0
  414. package/skills/lit-diagram-drawer/references/type-paved-road-animated.md +72 -0
  415. package/skills/lit-diagram-drawer/references/type-polar.md +67 -0
  416. package/skills/lit-diagram-drawer/references/type-policy-trace-animated.md +69 -0
  417. package/skills/lit-diagram-drawer/references/type-process.md +58 -0
  418. package/skills/lit-diagram-drawer/references/type-pyramid.md +59 -0
  419. package/skills/lit-diagram-drawer/references/type-quadrant-consultant.md +60 -0
  420. package/skills/lit-diagram-drawer/references/type-quadrant.md +57 -0
  421. package/skills/lit-diagram-drawer/references/type-queue-animated.md +63 -0
  422. package/skills/lit-diagram-drawer/references/type-radar.md +57 -0
  423. package/skills/lit-diagram-drawer/references/type-ridgeline.md +63 -0
  424. package/skills/lit-diagram-drawer/references/type-sankey.md +68 -0
  425. package/skills/lit-diagram-drawer/references/type-scatter.md +60 -0
  426. package/skills/lit-diagram-drawer/references/type-sequence-oauth.md +66 -0
  427. package/skills/lit-diagram-drawer/references/type-sequence.md +63 -0
  428. package/skills/lit-diagram-drawer/references/type-slopegraph.md +65 -0
  429. package/skills/lit-diagram-drawer/references/type-state-lifecycle.md +53 -0
  430. package/skills/lit-diagram-drawer/references/type-state.md +59 -0
  431. package/skills/lit-diagram-drawer/references/type-story-map.md +52 -0
  432. package/skills/lit-diagram-drawer/references/type-streamgraph.md +53 -0
  433. package/skills/lit-diagram-drawer/references/type-swimlane.md +52 -0
  434. package/skills/lit-diagram-drawer/references/type-timeline.md +52 -0
  435. package/skills/lit-diagram-drawer/references/type-tree-block-decomposition.md +57 -0
  436. package/skills/lit-diagram-drawer/references/type-tree.md +54 -0
  437. package/skills/lit-diagram-drawer/references/type-treemap.md +54 -0
  438. package/skills/lit-diagram-drawer/references/type-uml-class.md +52 -0
  439. package/skills/lit-diagram-drawer/references/type-venn.md +51 -0
  440. package/skills/lit-diagram-drawer/references/type-wardley.md +52 -0
  441. package/skills/lit-diagram-drawer/references/type-waterfall.md +54 -0
  442. package/skills/lit-diagram-drawer/references/verifier-guide.md +59 -0
  443. package/skills/lit-diagram-drawer/scripts/block-registry.mjs +43 -0
  444. package/skills/lit-diagram-drawer/scripts/brief-contract.mjs +94 -0
  445. package/skills/lit-diagram-drawer/scripts/capability-probe.mjs +132 -0
  446. package/skills/lit-diagram-drawer/scripts/check-visible-text.mjs +15 -0
  447. package/skills/lit-diagram-drawer/scripts/craft-thresholds.json +15 -0
  448. package/skills/lit-diagram-drawer/scripts/diagram-metrics.mjs +216 -0
  449. package/skills/lit-diagram-drawer/scripts/doctor.mjs +8 -0
  450. package/skills/lit-diagram-drawer/scripts/drawio-extract.mjs +214 -0
  451. package/skills/lit-diagram-drawer/scripts/excalidraw-extract.mjs +151 -0
  452. package/skills/lit-diagram-drawer/scripts/export.mjs +133 -0
  453. package/skills/lit-diagram-drawer/scripts/import-shared.mjs +130 -0
  454. package/skills/lit-diagram-drawer/scripts/mermaid-extract.mjs +173 -0
  455. package/skills/lit-diagram-drawer/scripts/office-safety.mjs +120 -0
  456. package/skills/lit-diagram-drawer/scripts/renderer-safety.mjs +46 -0
  457. package/skills/lit-diagram-drawer/scripts/test-block-registry.mjs +20 -0
  458. package/skills/lit-diagram-drawer/scripts/test-brief-contract.mjs +27 -0
  459. package/skills/lit-diagram-drawer/scripts/test-importers.mjs +119 -0
  460. package/skills/lit-diagram-drawer/scripts/test-office-safety.mjs +67 -0
  461. package/skills/lit-diagram-drawer/scripts/test-sequence-verifier.mjs +28 -0
  462. package/skills/lit-diagram-drawer/scripts/test-visual-quality.mjs +68 -0
  463. package/skills/lit-diagram-drawer/scripts/verify-all.mjs +74 -0
  464. package/skills/lit-diagram-drawer/scripts/verify-brief.mjs +47 -0
  465. package/skills/lit-diagram-drawer/scripts/verify-coverage.mjs +56 -0
  466. package/skills/lit-diagram-drawer/scripts/verify-diagram.mjs +26 -0
  467. package/skills/lit-diagram-drawer/scripts/verify-motion.mjs +12 -0
  468. package/skills/lit-diagram-drawer/scripts/verify-type.mjs +48 -0
  469. package/skills/lit-diagram-drawer/scripts/visual-quality.mjs +363 -0
  470. package/skills/lit-docx/LICENSE-MIT.txt +21 -0
  471. package/skills/lit-docx/SKILL.md +78 -0
  472. package/skills/lit-docx/references/frontmatter_schema.md +42 -0
  473. package/skills/lit-docx/references/journal_style_spec.md +17 -0
  474. package/skills/lit-docx/references/markdown_quality_checklist.md +37 -0
  475. package/skills/lit-docx/references/slop_phrase_list.yaml +58 -0
  476. package/skills/lit-docx/references/slop_rules.md +35 -0
  477. package/skills/lit-docx/requirements.in +5 -0
  478. package/skills/lit-docx/requirements.lock +289 -0
  479. package/skills/lit-docx/run.py +64 -0
  480. package/skills/lit-docx/scripts/clean_markdown.py +95 -0
  481. package/skills/lit-docx/scripts/convert_md_to_docx.py +1047 -0
  482. package/skills/lit-docx/scripts/convert_md_to_pdf.py +281 -0
  483. package/skills/lit-docx/scripts/convert_pdf.py +130 -0
  484. package/skills/lit-docx/scripts/craft-thresholds.json +11 -0
  485. package/skills/lit-docx/scripts/craft_docx.py +83 -0
  486. package/skills/lit-docx/scripts/edit_docx.py +297 -0
  487. package/skills/lit-docx/scripts/embed_images.py +78 -0
  488. package/skills/lit-docx/scripts/generate_docx_templates.py +491 -0
  489. package/skills/lit-docx/scripts/slop_lint.py +485 -0
  490. package/skills/lit-docx/scripts/visual_audit.py +41 -0
  491. package/skills/lit-docx/templates/docx/acs.docx +0 -0
  492. package/skills/lit-docx/templates/docx/elsevier.docx +0 -0
  493. package/skills/lit-docx/templates/docx/ieee.docx +0 -0
  494. package/skills/lit-docx/templates/docx/korean-generic.docx +0 -0
  495. package/skills/lit-docx/templates/docx/nature.docx +0 -0
  496. package/skills/lit-docx/templates/latex/acs/README.md +5 -0
  497. package/skills/lit-docx/templates/latex/acs/template.tex +37 -0
  498. package/skills/lit-docx/templates/latex/elsevier/README.md +5 -0
  499. package/skills/lit-docx/templates/latex/elsevier/template.tex +38 -0
  500. package/skills/lit-docx/templates/latex/ieee/README.md +5 -0
  501. package/skills/lit-docx/templates/latex/ieee/template.tex +37 -0
  502. package/skills/lit-docx/templates/latex/korean-generic/README.md +5 -0
  503. package/skills/lit-docx/templates/latex/korean-generic/template.tex +37 -0
  504. package/skills/lit-docx/templates/latex/nature/README.md +5 -0
  505. package/skills/lit-docx/templates/latex/nature/template.tex +37 -0
  506. package/skills/lit-docx/templates/registry.yaml +1366 -0
  507. package/skills/lit-humanizer/NOTICE +160 -0
  508. package/skills/lit-humanizer/SKILL.md +122 -0
  509. package/skills/lit-humanizer/assets/always-on-rule.md +9 -0
  510. package/skills/lit-humanizer/assets/report-skeleton.md +25 -0
  511. package/skills/lit-humanizer/assets/slide-text-skeleton.md +28 -0
  512. package/skills/lit-humanizer/examples/accessibility-note/after.md +7 -0
  513. package/skills/lit-humanizer/examples/accessibility-note/before.md +7 -0
  514. package/skills/lit-humanizer/examples/api-reference/after.md +9 -0
  515. package/skills/lit-humanizer/examples/api-reference/before.md +15 -0
  516. package/skills/lit-humanizer/examples/changelog/after.md +5 -0
  517. package/skills/lit-humanizer/examples/changelog/before.md +12 -0
  518. package/skills/lit-humanizer/examples/code-comments/after.md +10 -0
  519. package/skills/lit-humanizer/examples/code-comments/before.md +19 -0
  520. package/skills/lit-humanizer/examples/commit/after.md +5 -0
  521. package/skills/lit-humanizer/examples/commit/before.md +7 -0
  522. package/skills/lit-humanizer/examples/data-release/after.md +7 -0
  523. package/skills/lit-humanizer/examples/data-release/before.md +9 -0
  524. package/skills/lit-humanizer/examples/english-essay/after.md +5 -0
  525. package/skills/lit-humanizer/examples/english-essay/before.md +5 -0
  526. package/skills/lit-humanizer/examples/incident-update/after.md +7 -0
  527. package/skills/lit-humanizer/examples/incident-update/before.md +7 -0
  528. package/skills/lit-humanizer/examples/ko-essay/after.md +7 -0
  529. package/skills/lit-humanizer/examples/ko-essay/before.md +9 -0
  530. package/skills/lit-humanizer/examples/ko-report/after.md +9 -0
  531. package/skills/lit-humanizer/examples/ko-report/before.md +13 -0
  532. package/skills/lit-humanizer/examples/ko-slide/after.md +19 -0
  533. package/skills/lit-humanizer/examples/ko-slide/before.md +21 -0
  534. package/skills/lit-humanizer/examples/meeting-brief/after.md +9 -0
  535. package/skills/lit-humanizer/examples/meeting-brief/before.md +11 -0
  536. package/skills/lit-humanizer/examples/policy-faq/after.md +9 -0
  537. package/skills/lit-humanizer/examples/policy-faq/before.md +9 -0
  538. package/skills/lit-humanizer/examples/pr/after.md +15 -0
  539. package/skills/lit-humanizer/examples/pr/before.md +17 -0
  540. package/skills/lit-humanizer/examples/project-update/after.md +7 -0
  541. package/skills/lit-humanizer/examples/project-update/before.md +9 -0
  542. package/skills/lit-humanizer/examples/readme/after.md +12 -0
  543. package/skills/lit-humanizer/examples/readme/before.md +14 -0
  544. package/skills/lit-humanizer/examples/report/after.md +13 -0
  545. package/skills/lit-humanizer/examples/report/before.md +11 -0
  546. package/skills/lit-humanizer/examples/research-abstract/after.md +5 -0
  547. package/skills/lit-humanizer/examples/research-abstract/before.md +5 -0
  548. package/skills/lit-humanizer/examples/slides/after.md +19 -0
  549. package/skills/lit-humanizer/examples/slides/before.md +19 -0
  550. package/skills/lit-humanizer/examples/troubleshooting/after.md +11 -0
  551. package/skills/lit-humanizer/examples/troubleshooting/before.md +11 -0
  552. package/skills/lit-humanizer/fixtures/ko-metrics-golden.json +49 -0
  553. package/skills/lit-humanizer/fixtures/office/minimal.docx +0 -0
  554. package/skills/lit-humanizer/fixtures/office/minimal.pptx +0 -0
  555. package/skills/lit-humanizer/fixtures/pos-real.txt +26 -0
  556. package/skills/lit-humanizer/fixtures/rule-cases.json +306 -0
  557. package/skills/lit-humanizer/references/code-patterns.md +468 -0
  558. package/skills/lit-humanizer/references/deliverable-channels.md +111 -0
  559. package/skills/lit-humanizer/references/en-patterns-checklist.md +43 -0
  560. package/skills/lit-humanizer/references/en-patterns-content.md +243 -0
  561. package/skills/lit-humanizer/references/en-patterns-structure.md +375 -0
  562. package/skills/lit-humanizer/references/en-patterns.md +57 -0
  563. package/skills/lit-humanizer/references/ko-metrics.md +33 -0
  564. package/skills/lit-humanizer/references/ko-patterns-a-d.md +659 -0
  565. package/skills/lit-humanizer/references/ko-patterns-e-j.md +387 -0
  566. package/skills/lit-humanizer/references/ko-patterns.md +31 -0
  567. package/skills/lit-humanizer/references/rewrite-playbook.md +54 -0
  568. package/skills/lit-humanizer/references/taxonomy.md +153 -0
  569. package/skills/lit-humanizer/rules.json +884 -0
  570. package/skills/lit-humanizer/scripts/core.mjs +208 -0
  571. package/skills/lit-humanizer/scripts/detect.mjs +91 -0
  572. package/skills/lit-humanizer/scripts/extract_office_text.py +89 -0
  573. package/skills/lit-humanizer/scripts/guard-scan.mjs +36 -0
  574. package/skills/lit-humanizer/scripts/ko-metrics.mjs +124 -0
  575. package/skills/lit-humanizer/scripts/test-fixtures.mjs +54 -0
  576. package/skills/lit-humanizer/scripts/test-ko-metrics.mjs +27 -0
  577. package/skills/lit-pptx/FORBIDDEN_TERMS.json +55 -0
  578. package/skills/lit-pptx/NOTICE.md +3 -0
  579. package/skills/lit-pptx/SKILL.md +76 -0
  580. package/skills/lit-pptx/agents/analyst.md +49 -0
  581. package/skills/lit-pptx/agents/antithesis.md +59 -0
  582. package/skills/lit-pptx/agents/architect.md +44 -0
  583. package/skills/lit-pptx/agents/critic.md +42 -0
  584. package/skills/lit-pptx/agents/synthesizer.md +47 -0
  585. package/skills/lit-pptx/agents/thesis.md +33 -0
  586. package/skills/lit-pptx/assets/azure/circle-lg.png +0 -0
  587. package/skills/lit-pptx/assets/azure/circle-md.png +0 -0
  588. package/skills/lit-pptx/assets/azure/circle-sm.png +0 -0
  589. package/skills/lit-pptx/fonts/a2z-font/A2Z-Black.otf +0 -0
  590. package/skills/lit-pptx/fonts/a2z-font/A2Z-Bold.otf +0 -0
  591. package/skills/lit-pptx/fonts/a2z-font/A2Z-Light.otf +0 -0
  592. package/skills/lit-pptx/fonts/a2z-font/A2Z-Medium.otf +0 -0
  593. package/skills/lit-pptx/fonts/a2z-font/A2Z-Regular.otf +0 -0
  594. package/skills/lit-pptx/fonts/a2z-font/OFL.txt +94 -0
  595. package/skills/lit-pptx/fonts/a2z-font/SOURCE.md +29 -0
  596. package/skills/lit-pptx/package-lock.json +747 -0
  597. package/skills/lit-pptx/package.json +13 -0
  598. package/skills/lit-pptx/pretendard-font/LICENSE.txt +94 -0
  599. package/skills/lit-pptx/pretendard-font/public/static/LitOpenCodeSans-Bold.otf +0 -0
  600. package/skills/lit-pptx/pretendard-font/public/static/LitOpenCodeSans-Regular.otf +0 -0
  601. package/skills/lit-pptx/requirements.in +2 -0
  602. package/skills/lit-pptx/requirements.lock +285 -0
  603. package/skills/lit-pptx/run.mjs +71 -0
  604. package/skills/lit-pptx/scripts/check_ooxml.py +47 -0
  605. package/skills/lit-pptx/scripts/compile-deck.js +447 -0
  606. package/skills/lit-pptx/scripts/craft-thresholds.json +26 -0
  607. package/skills/lit-pptx/scripts/craft_extras.py +224 -0
  608. package/skills/lit-pptx/scripts/embed_fonts.py +204 -0
  609. package/skills/lit-pptx/scripts/layout_inventory.py +70 -0
  610. package/skills/lit-pptx/scripts/learn_template.py +433 -0
  611. package/skills/lit-pptx/scripts/lib/derive-palette.js +176 -0
  612. package/skills/lit-pptx/scripts/lib/directive-parser.js +244 -0
  613. package/skills/lit-pptx/scripts/lib/font-map.js +79 -0
  614. package/skills/lit-pptx/scripts/lib/gen-bg.js +85 -0
  615. package/skills/lit-pptx/scripts/lib/gen-gradient-assets.js +36 -0
  616. package/skills/lit-pptx/scripts/lib/layout-resolver.js +737 -0
  617. package/skills/lit-pptx/scripts/lib/markdown-loader.js +136 -0
  618. package/skills/lit-pptx/scripts/lib/render-adapter-html.js +364 -0
  619. package/skills/lit-pptx/scripts/lib/render-adapter-pptx.js +1848 -0
  620. package/skills/lit-pptx/scripts/lib/slide-ast.js +534 -0
  621. package/skills/lit-pptx/scripts/lib/spec-validator.js +94 -0
  622. package/skills/lit-pptx/scripts/lib/template-registry.js +355 -0
  623. package/skills/lit-pptx/scripts/qa_deck.py +773 -0
  624. package/skills/lit-pptx/scripts/validate_pptx.py +206 -0
  625. package/skills/lit-pptx/specs/markdown-slide-spec-v1.md +251 -0
  626. package/skills/lit-pptx/specs/markdown-slide-spec-v2.md +223 -0
  627. package/skills/lit-pptx/specs/slide-ast-v1.schema.json +229 -0
  628. package/skills/lit-pptx/specs/slide-ast-v2.schema.json +144 -0
  629. package/skills/lit-pptx/specs/template-enrollment-contract.md +379 -0
  630. package/skills/lit-pptx/templates/bauhaus_light.css +4 -0
  631. package/skills/lit-pptx/templates/boilerplate_professional.css +508 -0
  632. package/skills/lit-pptx/templates/enrolled/AZURE-A2Z/capabilities.yaml +146 -0
  633. package/skills/lit-pptx/templates/enrolled/AZURE-A2Z/layout-mapping.yaml +454 -0
  634. package/skills/lit-pptx/templates/enrolled/AZURE-A2Z/template.yaml +37 -0
  635. package/skills/lit-pptx/templates/enrolled/AZURE-PRO/capabilities.yaml +154 -0
  636. package/skills/lit-pptx/templates/enrolled/AZURE-PRO/layout-mapping.yaml +483 -0
  637. package/skills/lit-pptx/templates/enrolled/AZURE-PRO/template.yaml +37 -0
  638. package/skills/lit-pptx/templates/enrolled/BOILERPLATE-A2Z/capabilities.yaml +179 -0
  639. package/skills/lit-pptx/templates/enrolled/BOILERPLATE-A2Z/layout-mapping.yaml +299 -0
  640. package/skills/lit-pptx/templates/enrolled/BOILERPLATE-A2Z/template.yaml +45 -0
  641. package/skills/lit-pptx/templates/enrolled/BOILERPLATE-PRETENDARD/capabilities.yaml +181 -0
  642. package/skills/lit-pptx/templates/enrolled/BOILERPLATE-PRETENDARD/layout-mapping.yaml +299 -0
  643. package/skills/lit-pptx/templates/enrolled/BOILERPLATE-PRETENDARD/template.yaml +44 -0
  644. package/skills/lit-scientific-visualization/SKILL.md +2 -0
  645. package/skills/lit-typographic-motion/NOTICE +23 -0
  646. package/skills/lit-typographic-motion/SKILL.md +77 -0
  647. package/skills/lit-typographic-motion/THIRD_PARTY_NOTICES +25 -0
  648. package/skills/lit-typographic-motion/audio-analysis.py +52 -0
  649. package/skills/lit-typographic-motion/engine/browser.mjs +83 -0
  650. package/skills/lit-typographic-motion/engine/constants.mjs +177 -0
  651. package/skills/lit-typographic-motion/engine/contrast.mjs +101 -0
  652. package/skills/lit-typographic-motion/engine/encode.mjs +46 -0
  653. package/skills/lit-typographic-motion/engine/flash.mjs +216 -0
  654. package/skills/lit-typographic-motion/engine/look.mjs +166 -0
  655. package/skills/lit-typographic-motion/engine/page/common.js +105 -0
  656. package/skills/lit-typographic-motion/engine/page/engine.js +451 -0
  657. package/skills/lit-typographic-motion/engine/page/gl.js +213 -0
  658. package/skills/lit-typographic-motion/engine/page/lines.js +88 -0
  659. package/skills/lit-typographic-motion/engine/page/passes.js +144 -0
  660. package/skills/lit-typographic-motion/engine/page/post.js +119 -0
  661. package/skills/lit-typographic-motion/engine/page/scenes.js +187 -0
  662. package/skills/lit-typographic-motion/engine/page/type.js +321 -0
  663. package/skills/lit-typographic-motion/engine/png.mjs +139 -0
  664. package/skills/lit-typographic-motion/engine/sound.mjs +291 -0
  665. package/skills/lit-typographic-motion/engine/stage/capture.mjs +133 -0
  666. package/skills/lit-typographic-motion/engine/stage/clock.js +171 -0
  667. package/skills/lit-typographic-motion/engine/stage/frame-worker.mjs +47 -0
  668. package/skills/lit-typographic-motion/engine/stage/gate.mjs +119 -0
  669. package/skills/lit-typographic-motion/engine/stage/qa-page.js +158 -0
  670. package/skills/lit-typographic-motion/engine/stage/qa.mjs +208 -0
  671. package/skills/lit-typographic-motion/engine/stage/render.mjs +418 -0
  672. package/skills/lit-typographic-motion/engine/stage/scan.mjs +162 -0
  673. package/skills/lit-typographic-motion/engine/stage/stage-kit.js +310 -0
  674. package/skills/lit-typographic-motion/engine/stills.mjs +60 -0
  675. package/skills/lit-typographic-motion/engine/text.mjs +126 -0
  676. package/skills/lit-typographic-motion/engine/timing.mjs +289 -0
  677. package/skills/lit-typographic-motion/engine/treatment.mjs +254 -0
  678. package/skills/lit-typographic-motion/fonts/Archivo-100-400.ttf +0 -0
  679. package/skills/lit-typographic-motion/fonts/Archivo-100-700.ttf +0 -0
  680. package/skills/lit-typographic-motion/fonts/Archivo-100-900.ttf +0 -0
  681. package/skills/lit-typographic-motion/fonts/Archivo-125-400.ttf +0 -0
  682. package/skills/lit-typographic-motion/fonts/Archivo-125-700.ttf +0 -0
  683. package/skills/lit-typographic-motion/fonts/Archivo-125-900.ttf +0 -0
  684. package/skills/lit-typographic-motion/fonts/Archivo-75-400.ttf +0 -0
  685. package/skills/lit-typographic-motion/fonts/Archivo-75-700.ttf +0 -0
  686. package/skills/lit-typographic-motion/fonts/Archivo-75-900.ttf +0 -0
  687. package/skills/lit-typographic-motion/fonts/Archivo-OFL.txt +93 -0
  688. package/skills/lit-typographic-motion/fonts/Silkscreen-Bold.ttf +0 -0
  689. package/skills/lit-typographic-motion/fonts/Silkscreen-OFL.txt +93 -0
  690. package/skills/lit-typographic-motion/fonts/Silkscreen-Regular.ttf +0 -0
  691. package/skills/lit-typographic-motion/fonts/VT323-OFL.txt +93 -0
  692. package/skills/lit-typographic-motion/fonts/VT323-Regular.ttf +0 -0
  693. package/skills/lit-typographic-motion/fonts/pins.json +44 -0
  694. package/skills/lit-typographic-motion/fonts/stroke/CREDITS +52 -0
  695. package/skills/lit-typographic-motion/fonts/stroke/EMSAllure.svg +216 -0
  696. package/skills/lit-typographic-motion/fonts/stroke/EMSFelix.svg +216 -0
  697. package/skills/lit-typographic-motion/fonts/stroke/EMSOsmotron.svg +216 -0
  698. package/skills/lit-typographic-motion/fonts/stroke/EMSReadability.svg +216 -0
  699. package/skills/lit-typographic-motion/fonts/stroke/EMSTech.svg +217 -0
  700. package/skills/lit-typographic-motion/fonts/stroke/OFL.txt +85 -0
  701. package/skills/lit-typographic-motion/gate.mjs +593 -0
  702. package/skills/lit-typographic-motion/package-lock.json +78 -0
  703. package/skills/lit-typographic-motion/package.json +11 -0
  704. package/skills/lit-typographic-motion/probe.mjs +74 -0
  705. package/skills/lit-typographic-motion/references/authoring.md +110 -0
  706. package/skills/lit-typographic-motion/references/craft-loop.md +110 -0
  707. package/skills/lit-typographic-motion/references/runtime.md +88 -0
  708. package/skills/lit-typographic-motion/references/stage.md +164 -0
  709. package/skills/lit-typographic-motion/references/style-bibles.md +88 -0
  710. package/skills/lit-typographic-motion/references/treatment.md +143 -0
  711. package/skills/lit-typographic-motion/references/type-craft.md +55 -0
  712. package/skills/lit-typographic-motion/render.mjs +654 -0
  713. package/skills/lit-typographic-motion/requirements-audio.in +1 -0
  714. package/skills/lit-typographic-motion/requirements-audio.txt +790 -0
  715. package/skills/lit-typographic-motion/runtime.mjs +259 -0
  716. package/skills/lit-typographic-motion/word-timing-models.json +25 -0
  717. package/skills/litresearch/SKILL.md +41 -12
  718. package/skills/managed-skill-manifest.json +2367 -63
  719. package/skills/skill-rename-aliases.json +6 -1
  720. package/tools/check-pack-payload.mjs +22 -1
  721. package/tools/check-payload-substance.mjs +2 -2
  722. package/tools/payload-reference-exemptions.json +4 -0
  723. package/tools/payload-substance-allowlist.json +2 -3
  724. package/tools/payload-substance-parity.json +7 -7
  725. package/tools/version-manifests.json +2 -8
  726. package/skills/lit-korean/SKILL.md +0 -231
package/dist/features.js CHANGED
@@ -917,33 +917,39 @@ export const litOpenCodeFeatures = Object.freeze([
917
917
  ]
918
918
  },
919
919
  {
920
- id: "lit-korean",
921
- title: "Lit Korean",
922
- summary: "Documents a static review workflow for making Korean prose sound natural while reducing overwrought phrasing and preserving meaning.",
920
+ id: "lit-humanizer",
921
+ title: "Lit Humanizer",
922
+ summary: "Revises reader-facing prose for its audience and genre while preserving voice, meaning, evidence, citations, and useful qualifiers.",
923
923
  bindings: [
924
924
  {
925
925
  kind: "config",
926
926
  id: "litOpenCodeRuntimeSkills",
927
927
  surface: "litopencode exported runtime skill catalog",
928
- description: "Exposes the lit-korean skill as discoverable static guidance without adding hooks, tools, or rewriting behavior."
928
+ description: "Exposes the lit-humanizer skill through the native runtime catalog, prompt route, package assets, and tool guard."
929
929
  },
930
930
  {
931
931
  kind: "command",
932
- id: "lit-korean",
933
- surface: "OpenCode command /lit-korean",
934
- description: "Makes Korean prose naturalization guidance visible as an installed OpenCode command alias."
932
+ id: "lit-humanizer",
933
+ surface: "OpenCode command /lit-humanizer",
934
+ description: "Provides the canonical prose revision route and loads the installed skill guidance."
935
935
  },
936
936
  {
937
937
  kind: "command",
938
- id: "text-neutralization",
939
- surface: "OpenCode command /text-neutralization",
940
- description: "Makes restrained Korean prose neutralization guidance visible as an installed OpenCode command alias."
938
+ id: "tool.execute.before",
939
+ surface: "OpenCode write/edit pre-tool hook",
940
+ description: "Blocks new high-confidence detector hits before supported reader-facing text files are saved."
941
941
  },
942
942
  {
943
943
  kind: "config",
944
- id: "skills/lit-korean/SKILL.md",
944
+ id: "skills/lit-humanizer/SKILL.md",
945
945
  surface: "LitOpenCode visible static skills corpus",
946
- description: "Provides the prose-review checklist, safety notes, and verification route for agents and package consumers."
946
+ description: "Provides the full language, format, safety, detector, Office extraction, and verification guidance for native skill users."
947
+ },
948
+ {
949
+ kind: "config",
950
+ id: "rules/bundled-rules/lit-humanizer.md",
951
+ surface: "OpenCode experimental.chat.system.transform hook",
952
+ description: "Applies the compact always-on writing rule on each eligible OpenCode chat turn."
947
953
  }
948
954
  ],
949
955
  verification: ["node --test test/runtime-skills.test.mjs", "node --test test/docs.test.mjs"]
@@ -971,7 +977,7 @@ export const litOpenCodeFeatures = Object.freeze([
971
977
  {
972
978
  id: "lit-comprehend",
973
979
  title: "Lit Comprehend",
974
- summary: "Builds a self-contained explainer artifact so the user can reason about work that was already done, with delta-anchored themes, intuition-first diagrams, micro-worlds, and an honesty ledger.",
980
+ summary: "Builds a self-contained explainer so the user can understand completed work through delta-anchored themes, diagrams, and interactive examples.",
975
981
  bindings: [
976
982
  {
977
983
  kind: "command",
@@ -1058,6 +1064,67 @@ export const litOpenCodeFeatures = Object.freeze([
1058
1064
  ],
1059
1065
  verification: ["node --test test/lit-scientific-visualization.test.mjs", "npm run check:pack-payload"]
1060
1066
  },
1067
+ {
1068
+ id: "lit-diagram-drawer",
1069
+ title: "Diagram Drawer",
1070
+ summary: "Installs an OpenCode native skill with pinned diagram guides, templates, local verifiers, safe importers, and an exporter that never installs dependencies.",
1071
+ bindings: [
1072
+ {
1073
+ kind: "config",
1074
+ id: "skills/lit-diagram-drawer/SKILL.md",
1075
+ surface: "OpenCode native skill picker",
1076
+ description: "Selects the bounded diagram workflow and its complete managed skill tree. Bounded lit diagram requests direct the model to this native picker; no dedicated slash or standalone diagram chat route is registered."
1077
+ },
1078
+ {
1079
+ kind: "cli",
1080
+ id: "litopencode install",
1081
+ surface: "LitOpenCode managed native skill installer",
1082
+ description: "Installs every hash-pinned guide, template, example, tool, font, and license asset."
1083
+ },
1084
+ {
1085
+ kind: "cli",
1086
+ id: "litopencode doctor",
1087
+ surface: "LitOpenCode managed native skill doctor",
1088
+ description: "Verifies the exact installed file closure and reports export capabilities without installing tools."
1089
+ }
1090
+ ],
1091
+ verification: ["node --test test/lit-diagram-drawer.test.mjs", "npm run check:managed-skill-manifest", "npm run check:pack-payload"]
1092
+ },
1093
+ {
1094
+ id: "lit-typographic-motion",
1095
+ title: "Film director",
1096
+ summary: "Native OpenCode film director: treatment first, a captured stage page or the type engine, generated sound, a numeric gate and recorded look rounds.",
1097
+ bindings: [
1098
+ { kind: "config", id: "skills/lit-typographic-motion/SKILL.md", surface: "OpenCode native skill picker", description: "Loads the managed motion skill and its engine and reference closure." },
1099
+ { kind: "hook", id: "lit-task motion-video intent", surface: "OpenCode chat.message activation", description: "Routes bounded film requests before slide and interface guidance with a neutral film context." },
1100
+ { kind: "hook", id: "tool.execute.after", surface: "OpenCode tool.execute.after hook", description: "Records each read of a film's stills so the done check can confirm the frames were viewed." },
1101
+ { kind: "cli", id: "litopencode motion-runtime install|status", surface: "LitOpenCode runtime", description: "Pre-warms pinned dependencies and fonts outside the render session." },
1102
+ { kind: "cli", id: "litopencode doctor", surface: "LitOpenCode doctor", description: "Reports Chrome, ffmpeg, WebGL2 tier, software warning, and pre-warm status." }
1103
+ ],
1104
+ verification: ["node --test test/lit-typographic-motion.test.mjs", "npm run check:managed-skill-manifest", "npm run check:pack-payload"]
1105
+ },
1106
+ {
1107
+ id: "lit-pptx",
1108
+ title: "Lit PowerPoint",
1109
+ summary: "Native OpenCode deck skill with source, compile, QA, fonts, and first-use dependency cache.",
1110
+ bindings: [
1111
+ { kind: "config", id: "skills/lit-pptx/SKILL.md", surface: "OpenCode native skill picker", description: "Loads the slide workflow from the installed managed tree." },
1112
+ { kind: "hook", id: "lit-task slide intent", surface: "OpenCode chat.message activation", description: "Directs bounded lit slide requests to the native skill." },
1113
+ { kind: "cli", id: "litopencode doctor", surface: "LitOpenCode doctor", description: "Reports installed skill integrity and office runtime readiness." }
1114
+ ],
1115
+ verification: ["node --test test/lit-office-docs.test.mjs", "npm run check:pack-payload"]
1116
+ },
1117
+ {
1118
+ id: "lit-docx",
1119
+ title: "Lit Word Documents",
1120
+ summary: "Native OpenCode document skill with publisher profiles, conversion, editing, lint, and first-use dependency cache.",
1121
+ bindings: [
1122
+ { kind: "config", id: "skills/lit-docx/SKILL.md", surface: "OpenCode native skill picker", description: "Loads the document workflow from the installed managed tree." },
1123
+ { kind: "hook", id: "lit-task report intent", surface: "OpenCode chat.message activation", description: "Directs bounded lit report requests to the native skill." },
1124
+ { kind: "cli", id: "litopencode doctor", surface: "LitOpenCode doctor", description: "Reports installed skill integrity and office runtime readiness." }
1125
+ ],
1126
+ verification: ["node --test test/lit-office-docs.test.mjs", "npm run check:pack-payload"]
1127
+ },
1061
1128
  frontendUiUxFeature,
1062
1129
  {
1063
1130
  id: "readme-studio", title: "README Studio",
package/dist/hooks.d.ts CHANGED
@@ -1,16 +1,17 @@
1
1
  import type { Hooks } from "@opencode-ai/plugin";
2
2
  import type { SessionLookup } from "./session-lineage.ts";
3
- import { type DeliverableHedgeSessionState } from "./deliverable-hedge-guard.ts";
3
+ import type { DeliverableHedgeGuardState } from "./deliverable-hedge-guard.ts";
4
4
  type ToolExecuteBeforeHook = NonNullable<Hooks["tool.execute.before"]>;
5
5
  type ToolExecuteAfterHook = NonNullable<Hooks["tool.execute.after"]>;
6
6
  export type ToolExecuteHookOptions = {
7
7
  readonly getSession?: SessionLookup;
8
+ readonly deliverableHedgeGuard?: DeliverableHedgeGuardState;
8
9
  };
9
10
  export declare function createToolExecuteBeforeHook(options?: ToolExecuteHookOptions): ToolExecuteBeforeHook;
10
11
  export type ToolExecuteAfterHookOptions = {
11
12
  readonly projectRoot?: string;
12
13
  readonly knowledgeCaptureEnabled?: boolean;
13
- readonly deliverableHedgeState?: DeliverableHedgeSessionState;
14
+ readonly deliverableHedgeGuard?: DeliverableHedgeGuardState;
14
15
  readonly onSkillActivation?: (sessionID: string, skillId: string) => void | Promise<void>;
15
16
  };
16
17
  export declare function createToolExecuteAfterHook(options?: ToolExecuteAfterHookOptions): ToolExecuteAfterHook;
package/dist/hooks.js CHANGED
@@ -1,18 +1,20 @@
1
1
  import { activationBanner } from "./activation-probe.js";
2
- import { applyDeliverableHedgeAfterHook } from "./deliverable-hedge-guard.js";
3
2
  import { dynamicRulesForPaths } from "./rules/hooks.js";
4
3
  import { applyLitOpenCodePostEditHook, applyLitOpenCodeToolAfterHook, applyLitOpenCodeToolBeforeHook, applyTaskRecursionGuard, mutatedFilePaths } from "./tool-guards.js";
5
4
  import { captureKnowledgeEvent } from "./knowledge.js";
5
+ import { recordMotionImageRead } from "./motion-image-reads.js";
6
6
  export function createToolExecuteBeforeHook(options = {}) {
7
7
  return async (input, output) => {
8
8
  await applyTaskRecursionGuard(input, options.getSession);
9
9
  applyLitOpenCodeToolBeforeHook(input, output);
10
+ await options.deliverableHedgeGuard?.before(input);
10
11
  };
11
12
  }
12
13
  export function createToolExecuteAfterHook(options = {}) {
13
14
  return async (input, output) => {
14
15
  applyLitOpenCodeToolAfterHook(input, output);
15
16
  applyLitOpenCodePostEditHook(input, output);
17
+ recordMotionImageRead(input, options.projectRoot);
16
18
  const activationAction = input.tool === "lit" ? "activate"
17
19
  : input.tool === "litwork" || input.tool === "start-work" ? "start"
18
20
  : input.tool === "review-work" ? "review" : undefined;
@@ -21,9 +23,7 @@ export function createToolExecuteAfterHook(options = {}) {
21
23
  output.output.startsWith(`${activationBanner(input.tool)}\n`)) {
22
24
  await options.onSkillActivation?.(input.sessionID, input.tool);
23
25
  }
24
- if (options.deliverableHedgeState !== undefined) {
25
- await applyDeliverableHedgeAfterHook(options.deliverableHedgeState, input, output);
26
- }
26
+ await options.deliverableHedgeGuard?.after(input, output);
27
27
  if (options.projectRoot !== undefined && output.metadata?.litopencodeKnowledgeCapture !== undefined) {
28
28
  const request = output.metadata.litopencodeKnowledgeCapture;
29
29
  const metadata = { ...output.metadata };
@@ -1,6 +1,6 @@
1
1
  export declare function ignitionMark(first: boolean, _discipline: string, env?: NodeJS.ProcessEnv): string;
2
2
  export declare function createIgnitionState(): {
3
- activate(sessionID: string, skillId: string): void;
3
+ activate(sessionID: string, skillId: string, showCompletionMark?: boolean): void;
4
4
  resetDiscipline(sessionID: string): void;
5
5
  clear(sessionID: string): void;
6
6
  complete: (input: {
package/dist/ignition.js CHANGED
@@ -8,6 +8,7 @@ export function ignitionMark(first, _discipline, env = process.env) {
8
8
  export function createIgnitionState() {
9
9
  const seen = new Set();
10
10
  const disciplines = new Map();
11
+ const plainCompletions = new Set();
11
12
  let disposed = false;
12
13
  const complete = async (input, output) => {
13
14
  const text = stripUserFacingBlankHtmlCommentLines(output.text);
@@ -15,15 +16,25 @@ export function createIgnitionState() {
15
16
  output.text = text;
16
17
  return;
17
18
  }
19
+ if (plainCompletions.has(input.sessionID)) {
20
+ output.text = text;
21
+ return;
22
+ }
18
23
  const mark = ignitionMark(!seen.has(input.sessionID), disciplines.get(input.sessionID) ?? "lit-loop");
19
24
  seen.add(input.sessionID);
20
25
  output.text = `${mark}${text === "" ? "" : `\n\n${text}`}`;
21
26
  };
22
27
  return {
23
- activate(sessionID, skillId) { disciplines.set(sessionID, skillId); },
24
- resetDiscipline(sessionID) { disciplines.delete(sessionID); },
25
- clear(sessionID) { seen.delete(sessionID); disciplines.delete(sessionID); },
28
+ activate(sessionID, skillId, showCompletionMark = true) {
29
+ disciplines.set(sessionID, skillId);
30
+ if (showCompletionMark)
31
+ plainCompletions.delete(sessionID);
32
+ else
33
+ plainCompletions.add(sessionID);
34
+ },
35
+ resetDiscipline(sessionID) { disciplines.delete(sessionID); plainCompletions.delete(sessionID); },
36
+ clear(sessionID) { seen.delete(sessionID); disciplines.delete(sessionID); plainCompletions.delete(sessionID); },
26
37
  complete,
27
- dispose() { seen.clear(); disciplines.clear(); disposed = true; }
38
+ dispose() { seen.clear(); disciplines.clear(); plainCompletions.clear(); disposed = true; }
28
39
  };
29
40
  }
package/dist/index.d.ts CHANGED
@@ -7,7 +7,7 @@ export { defaultGlobalConfigFile, defaultGlobalConfigJson, effectiveAgentConfig,
7
7
  export { captureKnowledgeEvent, inspectKnowledge, knowledgeKinds, knowledgePaths, knowledgeStates, queryKnowledge, readKnowledgeClaims, recoverKnowledge, reviewKnowledgeRecord, KnowledgeStoreError, type KnowledgeCaptureResult, type KnowledgeEvent, type KnowledgeKind, type KnowledgePaths, type KnowledgeQueryResult, type KnowledgeRecord, type KnowledgeReviewResult, type KnowledgeState } from "./knowledge.ts";
8
8
  export { litActivationBanner, litOpenCodeCommands } from "./commands.ts";
9
9
  export { createToolExecuteAfterHook, createToolExecuteBeforeHook } from "./hooks.ts";
10
- export { applyDeliverableHedgeAfterHook, artifactGenres, createDeliverableHedgeSessionState, inspectDeliverableHedges, readOutputChannelContract, type ArtifactGenre, type DeliverableHedgeFinding, type DeliverableHedgeSessionState, type HedgeClass, type LimitationsChannel, type OutputChannelContract } from "./deliverable-hedge-guard.ts";
10
+ export { createDeliverableHedgeGuard, type DeliverableHedgeGuardOptions, type DeliverableHedgeGuardState, type HumanizerFinding, type HumanizerScan, type HumanizerScanRequest } from "./deliverable-hedge-guard.ts";
11
11
  export { activationRegexMetric, createProviderUsageReceiptEventHook, emptyProviderCacheMeasurement, providerUsageReceiptFromEvent, recordProviderUsageReceipt, ruleDedupMetric, updateCacheMetric, type ProviderCacheMeasurement, type ProviderUsageReceipt, type ProviderUsageReceiptEventOptions, type RuleDedupMetric, type ActivationRegexMetric, type UpdateCacheMetric } from "./cache-metrics.ts";
12
12
  export { benchmarkGateAllowsStrongClaim, classifyReferenceSuperiorityClaim, certifyDeclaredBenchmarkUniverse, litOpenCodeClaimPolicy, litOpenCodeReferenceBenchmark, renderDeclaredBenchmarkUniverseClaim, type LitOpenCodeBenchmarkGateInput, type LitOpenCodeBenchmarkScoringDimension, type LitOpenCodeBenchmarkTaskCategory, type LitOpenCodeBenchmarkTaskResult, type LitOpenCodeBenchmarkTaskWinner, type LitOpenCodeBenchmarkUniverseCertification, type LitOpenCodeBenchmarkUniverseCertificationInput, type LitOpenCodeClaimClassification, type LitOpenCodeClaimPolicy, type LitOpenCodeClaimVerdict, type LitOpenCodeReferenceBenchmark } from "./benchmark.ts";
13
13
  export { completeGoals, countRecordedEvidence, createGoals, criterionStatuses, evaluateGoalGate, evidenceKinds, EvidenceLedgerError, evidenceLedgerVersion, goalStatuses, readEvidenceLedger, readEvidenceLedgerStatus, recordCheckpoint, recordEvidence, recordReviewBlocker, recordSteering, renderEvidenceBrief, steeringKinds, steeringWeakeningReason, type Checkpoint, type Criterion, type CriterionStatus, type EvidenceEntry, type EvidenceKind, type EvidenceLedgerState, type GateVerdict, type Goal, type GoalStatus, type ReviewBlocker, type SteeringEntry, type SteeringKind } from "./ledger.ts";
package/dist/index.js CHANGED
@@ -7,7 +7,7 @@ export { defaultGlobalConfigFile, defaultGlobalConfigJson, effectiveAgentConfig,
7
7
  export { captureKnowledgeEvent, inspectKnowledge, knowledgeKinds, knowledgePaths, knowledgeStates, queryKnowledge, readKnowledgeClaims, recoverKnowledge, reviewKnowledgeRecord, KnowledgeStoreError } from "./knowledge.js";
8
8
  export { litActivationBanner, litOpenCodeCommands } from "./commands.js";
9
9
  export { createToolExecuteAfterHook, createToolExecuteBeforeHook } from "./hooks.js";
10
- export { applyDeliverableHedgeAfterHook, artifactGenres, createDeliverableHedgeSessionState, inspectDeliverableHedges, readOutputChannelContract } from "./deliverable-hedge-guard.js";
10
+ export { createDeliverableHedgeGuard } from "./deliverable-hedge-guard.js";
11
11
  export { activationRegexMetric, createProviderUsageReceiptEventHook, emptyProviderCacheMeasurement, providerUsageReceiptFromEvent, recordProviderUsageReceipt, ruleDedupMetric, updateCacheMetric } from "./cache-metrics.js";
12
12
  export { benchmarkGateAllowsStrongClaim, classifyReferenceSuperiorityClaim, certifyDeclaredBenchmarkUniverse, litOpenCodeClaimPolicy, litOpenCodeReferenceBenchmark, renderDeclaredBenchmarkUniverseClaim } from "./benchmark.js";
13
13
  export { completeGoals, countRecordedEvidence, createGoals, criterionStatuses, evaluateGoalGate, evidenceKinds, EvidenceLedgerError, evidenceLedgerVersion, goalStatuses, readEvidenceLedger, readEvidenceLedgerStatus, recordCheckpoint, recordEvidence, recordReviewBlocker, recordSteering, renderEvidenceBrief, steeringKinds, steeringWeakeningReason } from "./ledger.js";
@@ -0,0 +1 @@
1
+ export declare const interfaceWorkHandoff = "If the work creates or changes a user-facing web interface, include its UI slice in the plan and verification: load frontend-ui-ux, follow its build guidance, and run node scripts/probe.mjs --path <entry.html> --out <evidence-dir> against the finished page. Require the full RS matrix; fix remaining measured or derived HIGH findings before claiming done, and report exit 2 as blocked. A --help call or ad hoc screenshot does not substitute for the page probe. For CLI or backend-only work, do not load the interface skill or run its probe.";
@@ -0,0 +1 @@
1
+ export const interfaceWorkHandoff = "If the work creates or changes a user-facing web interface, include its UI slice in the plan and verification: load frontend-ui-ux, follow its build guidance, and run node scripts/probe.mjs --path <entry.html> --out <evidence-dir> against the finished page. Require the full RS matrix; fix remaining measured or derived HIGH findings before claiming done, and report exit 2 as blocked. A --help call or ad hoc screenshot does not substitute for the page probe. For CLI or backend-only work, do not load the interface skill or run its probe.";
@@ -0,0 +1,48 @@
1
+ export declare const jevEndpoint = "https://api.typesafe.ai/v1/systemone";
2
+ export declare const jevFlag = "LITOPENCODE_JEV";
3
+ /** Shown once per session so a user who switched the hint on notices it; never carries the key. */
4
+ export declare const jevSkillHintAwarenessText = "\u2726 Jev skill hint is ON";
5
+ export type JevFetch = (url: string, init: RequestInit) => Promise<Response>;
6
+ export type JevCatalogEntry = {
7
+ readonly id: string;
8
+ readonly description: string;
9
+ };
10
+ export type JevSkillHintStatus = "off" | "on" | "key-missing";
11
+ export type JevSkillHintPart = {
12
+ readonly kind: "hint";
13
+ readonly text: string;
14
+ readonly skillId: string;
15
+ readonly latencyMs: number;
16
+ } | {
17
+ readonly kind: "note";
18
+ readonly text: string;
19
+ };
20
+ export type JevSkillHintOptions = {
21
+ readonly env?: NodeJS.ProcessEnv;
22
+ readonly fetch?: JevFetch;
23
+ readonly catalog?: readonly JevCatalogEntry[];
24
+ readonly traceFile?: string;
25
+ readonly now?: () => number;
26
+ };
27
+ export declare function jevSkillHintStatus(env?: NodeJS.ProcessEnv): JevSkillHintStatus;
28
+ export declare function jevSkillHintDoctorLine(env?: NodeJS.ProcessEnv): string;
29
+ export declare function jevSkillHintText(skillId: string): string;
30
+ /** The visible toast names only the validated skill id and the request latency. */
31
+ export declare function jevSkillHintToastText(skillId: string, latencyMs: number): string;
32
+ export declare function jevSkillHintUnavailableText(reason: string): string;
33
+ /** Eligibility that depends on the prompt text alone; routing and command checks live in the hook. */
34
+ export declare function isJevEligiblePrompt(text: string): boolean;
35
+ /**
36
+ * Redact a bounded window first, then truncate, so a secret that straddles the 2,000-character cut is
37
+ * masked whole. When either cut happened, a token run left dangling at the end is masked as well.
38
+ */
39
+ export declare function redactJevPrompt(text: string): string;
40
+ export declare function defaultJevCatalog(): readonly JevCatalogEntry[];
41
+ export declare function buildJevRequestBody(state: string, catalog: readonly JevCatalogEntry[], model: string): string;
42
+ export type JevSkillHint = {
43
+ hintFor(sessionID: string, promptText: string): Promise<JevSkillHintPart | undefined>;
44
+ /** True exactly once per session: on its first eligible turn while both switches are on. */
45
+ claimAwareness(sessionID: string, promptText: string): boolean;
46
+ forget(sessionID: string): void;
47
+ };
48
+ export declare function createJevSkillHint(options?: JevSkillHintOptions): JevSkillHint;
@@ -0,0 +1,291 @@
1
+ import { createHash } from "node:crypto";
2
+ import { constants as fsConstants } from "node:fs";
3
+ import fs from "node:fs/promises";
4
+ import path from "node:path";
5
+ import { litOpenCodeRuntimeSkills } from "./skills.js";
6
+ // Optional Jev skill hint for the chat.message hook. It is off unless LITOPENCODE_JEV=1 and
7
+ // TYPESAFE_API_KEY are both set in the process environment. The key is read from the environment
8
+ // only and goes nowhere except the Authorization header: not into errors, notes, traces or doctor.
9
+ // The response is untrusted data; the only text that reaches the turn is this module's own fixed
10
+ // sentence carrying a skill id that was checked against the catalog this module sent.
11
+ export const jevEndpoint = "https://api.typesafe.ai/v1/systemone";
12
+ export const jevFlag = "LITOPENCODE_JEV";
13
+ /** Shown once per session so a user who switched the hint on notices it; never carries the key. */
14
+ export const jevSkillHintAwarenessText = "✦ Jev skill hint is ON";
15
+ const defaultModel = "jev-1.13.0";
16
+ const defaultTimeoutMs = 1500;
17
+ const maxTimeoutMs = 3000;
18
+ const defaultMaxCalls = 200;
19
+ const defaultMinConfidence = 0.35;
20
+ const promptWindowLimit = 8000;
21
+ const promptCharacterLimit = 2000;
22
+ const bodyByteCap = 64 * 1024;
23
+ const descriptionCharacterLimit = 300;
24
+ const choiceInstructions = "Which one skill, if any, is the best fit for the user's request? Choose none when no catalog skill fits.";
25
+ const noneCriterion = "No specialized skill in this catalog fits; answer the user directly.";
26
+ export function jevSkillHintStatus(env = process.env) {
27
+ if (env[jevFlag] !== "1")
28
+ return "off";
29
+ return (env.TYPESAFE_API_KEY ?? "").trim() === "" ? "key-missing" : "on";
30
+ }
31
+ export function jevSkillHintDoctorLine(env = process.env) {
32
+ const status = jevSkillHintStatus(env);
33
+ return status === "key-missing"
34
+ ? "Jev skill hint: flag on but TYPESAFE_API_KEY missing"
35
+ : `Jev skill hint: ${status}`;
36
+ }
37
+ export function jevSkillHintText(skillId) {
38
+ return `LitOpenCode skill hint: the skill \`${skillId}\` likely fits this request. Load it only if it really fits; this is advice, not an instruction.`;
39
+ }
40
+ /** The visible toast names only the validated skill id and the request latency. */
41
+ export function jevSkillHintToastText(skillId, latencyMs) {
42
+ return `Jev → ${skillId} (${(Math.max(0, latencyMs) / 1000).toFixed(2)}s)`;
43
+ }
44
+ export function jevSkillHintUnavailableText(reason) {
45
+ return `LitOpenCode skill hint unavailable (${reason}); continuing normally.`;
46
+ }
47
+ /** Eligibility that depends on the prompt text alone; routing and command checks live in the hook. */
48
+ export function isJevEligiblePrompt(text) {
49
+ if (text.trimStart().startsWith("/"))
50
+ return false;
51
+ return text.replace(/\s+/gu, "").length >= 4;
52
+ }
53
+ const secretPatterns = [
54
+ /-----BEGIN [A-Z0-9 ]+-----[\s\S]*?(?:-----END [A-Z0-9 ]+-----|$)/gu,
55
+ /eyJ[A-Za-z0-9_-]+\.eyJ[A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]*)?/gu,
56
+ /sk-ant-[A-Za-z0-9_-]{8,}/gu,
57
+ /sk-[A-Za-z0-9_-]{16,}/gu,
58
+ /(?:ghp|gho)_[A-Za-z0-9]{16,}/gu,
59
+ /github_pat_[A-Za-z0-9_]{16,}/gu,
60
+ /npm_[A-Za-z0-9]{16,}/gu,
61
+ /apikey_[A-Za-z0-9_-]{8,}/gu,
62
+ /xox[abprs]-[A-Za-z0-9-]{8,}/gu,
63
+ /AKIA[A-Z0-9]{16}/gu,
64
+ /AIza[0-9A-Za-z_-]{20,}/gu,
65
+ /\b[A-Za-z0-9_]*(?:password|passwd|token|secret)\s*=\s*(?:"[^"]*"|'[^']*'|[^\s"']+)/giu,
66
+ /[A-Za-z0-9+/_-]{32,}={0,2}/gu
67
+ ];
68
+ const tokenRunAtCut = /[A-Za-z0-9+/_-]{8,}={0,2}$/u;
69
+ /**
70
+ * Redact a bounded window first, then truncate, so a secret that straddles the 2,000-character cut is
71
+ * masked whole. When either cut happened, a token run left dangling at the end is masked as well.
72
+ */
73
+ export function redactJevPrompt(text) {
74
+ const head = text.slice(0, promptWindowLimit * 2);
75
+ let redacted = Array.from(head).slice(0, promptWindowLimit).join("");
76
+ const windowCut = redacted.length < text.length;
77
+ redacted = redacted
78
+ .replace(/\/(?:Users|home)\/[^/\s]+/gu, "~")
79
+ .replace(/[A-Za-z]:\\Users\\[^\\/\s]+(\\)?/giu, (_match, separator) => (separator === undefined ? "~" : "~/"));
80
+ // The lookbehind starts a match only at the head of a run, which keeps the 8,000-character window linear.
81
+ redacted = redacted.replace(/(?<![A-Za-z0-9._%+-])[A-Za-z0-9._%+-]+@[A-Za-z0-9-]+(?:\.[A-Za-z0-9-]+)*\.[A-Za-z]{2,}/gu, "[email]");
82
+ for (const pattern of secretPatterns)
83
+ redacted = redacted.replace(pattern, "[secret]");
84
+ const characters = Array.from(redacted);
85
+ if (!windowCut && characters.length <= promptCharacterLimit)
86
+ return redacted;
87
+ return characters.slice(0, promptCharacterLimit).join("").replace(tokenRunAtCut, "[secret]");
88
+ }
89
+ export function defaultJevCatalog() {
90
+ return litOpenCodeRuntimeSkills.map((skill) => ({ id: skill.id, description: skill.summary }));
91
+ }
92
+ export function buildJevRequestBody(state, catalog, model) {
93
+ const criteria = {};
94
+ for (const entry of catalog)
95
+ criteria[entry.id] = Array.from(entry.description).slice(0, descriptionCharacterLimit).join("");
96
+ criteria.none = noneCriterion;
97
+ return JSON.stringify({
98
+ model,
99
+ state,
100
+ questions: { which: { type: "choice", instructions: choiceInstructions, criteria } }
101
+ });
102
+ }
103
+ function boundedInteger(raw, fallback, min, max) {
104
+ if (raw === undefined || !/^\d+$/u.test(raw.trim()))
105
+ return fallback;
106
+ return Math.min(max, Math.max(min, Number(raw.trim())));
107
+ }
108
+ function minConfidence(raw) {
109
+ if (raw === undefined || raw.trim() === "")
110
+ return defaultMinConfidence;
111
+ const value = Number(raw);
112
+ return Number.isFinite(value) && value >= 0 && value <= 1 ? value : defaultMinConfidence;
113
+ }
114
+ async function readCappedBody(response) {
115
+ const declared = Number(response.headers.get("content-length") ?? "");
116
+ if (Number.isFinite(declared) && declared > bodyByteCap) {
117
+ await response.body?.cancel().catch(() => undefined);
118
+ return undefined;
119
+ }
120
+ if (response.body === null)
121
+ return "";
122
+ const reader = response.body.getReader();
123
+ const chunks = [];
124
+ let total = 0;
125
+ for (;;) {
126
+ const { done, value } = await reader.read();
127
+ if (done)
128
+ break;
129
+ total += value.byteLength;
130
+ if (total > bodyByteCap) {
131
+ await reader.cancel().catch(() => undefined);
132
+ return undefined;
133
+ }
134
+ chunks.push(value);
135
+ }
136
+ return Buffer.concat(chunks).toString("utf8");
137
+ }
138
+ function validatedAnswer(raw, allowed, threshold) {
139
+ let parsed;
140
+ try {
141
+ parsed = JSON.parse(raw);
142
+ }
143
+ catch {
144
+ return { failure: "invalid response" };
145
+ }
146
+ const which = parsed?.answers?.which;
147
+ if (typeof which !== "object" || which === null)
148
+ return { failure: "invalid response" };
149
+ const { choice, confidence } = which;
150
+ if (typeof choice !== "string" || !allowed.has(choice))
151
+ return { failure: "invalid response" };
152
+ if (typeof confidence !== "number" || !Number.isFinite(confidence))
153
+ return { failure: "invalid response" };
154
+ if (choice === "none" || confidence < threshold)
155
+ return { confidence };
156
+ return { choice, confidence };
157
+ }
158
+ export function createJevSkillHint(options = {}) {
159
+ const env = options.env ?? process.env;
160
+ const fetchImpl = options.fetch ?? ((url, init) => fetch(url, init));
161
+ const now = options.now ?? Date.now;
162
+ const sessions = new Map();
163
+ async function trace(record) {
164
+ if (env[`${jevFlag}_TRACE`] !== "1" || options.traceFile === undefined)
165
+ return;
166
+ try {
167
+ await fs.mkdir(path.dirname(options.traceFile), { recursive: true });
168
+ // Refuse a symlink or other non-file at the trace path; O_NOFOLLOW closes the lstat race.
169
+ const existing = await fs.lstat(options.traceFile).catch(() => undefined);
170
+ if (existing !== undefined && !existing.isFile())
171
+ return;
172
+ const flags = fsConstants.O_WRONLY | fsConstants.O_APPEND | fsConstants.O_CREAT | (fsConstants.O_NOFOLLOW ?? 0);
173
+ const handle = await fs.open(options.traceFile, flags, 0o600);
174
+ try {
175
+ await handle.appendFile(`${JSON.stringify(record)}\n`, "utf8");
176
+ }
177
+ finally {
178
+ await handle.close();
179
+ }
180
+ }
181
+ catch { // no-excuse-ok: catch -- the opt-in debug trace must never affect the turn.
182
+ }
183
+ }
184
+ async function ask(state, key) {
185
+ const catalog = options.catalog ?? defaultJevCatalog();
186
+ const model = (env[`${jevFlag}_MODEL`] ?? "").trim() || defaultModel;
187
+ const body = buildJevRequestBody(state, catalog, model);
188
+ if (Buffer.byteLength(body, "utf8") > bodyByteCap)
189
+ return { failure: "request too large" };
190
+ const timeoutMs = boundedInteger(env[`${jevFlag}_TIMEOUT_MS`], defaultTimeoutMs, 1, maxTimeoutMs);
191
+ const controller = new AbortController();
192
+ let timer;
193
+ const timedOut = new Promise((resolve) => {
194
+ timer = setTimeout(() => {
195
+ controller.abort();
196
+ resolve({ failure: "timeout" });
197
+ }, timeoutMs);
198
+ });
199
+ const request = (async () => {
200
+ let response;
201
+ try {
202
+ response = await fetchImpl(jevEndpoint, {
203
+ method: "POST",
204
+ headers: { authorization: `Bearer ${key}`, "content-type": "application/json" },
205
+ body,
206
+ redirect: "error",
207
+ signal: controller.signal
208
+ });
209
+ }
210
+ catch {
211
+ return { failure: controller.signal.aborted ? "timeout" : "network" };
212
+ }
213
+ if (response.status !== 200) {
214
+ await response.body?.cancel().catch(() => undefined);
215
+ return { httpStatus: response.status, failure: `HTTP ${response.status}` };
216
+ }
217
+ let raw;
218
+ try {
219
+ raw = await readCappedBody(response);
220
+ }
221
+ catch {
222
+ return { httpStatus: 200, failure: controller.signal.aborted ? "timeout" : "network" };
223
+ }
224
+ if (raw === undefined)
225
+ return { httpStatus: 200, failure: "response too large" };
226
+ const allowed = new Set([...catalog.map((entry) => entry.id), "none"]);
227
+ return { httpStatus: 200, ...validatedAnswer(raw, allowed, minConfidence(env[`${jevFlag}_MIN_CONFIDENCE`])) };
228
+ })();
229
+ try {
230
+ return await Promise.race([request, timedOut]);
231
+ }
232
+ finally {
233
+ clearTimeout(timer);
234
+ }
235
+ }
236
+ return {
237
+ forget(sessionID) {
238
+ sessions.delete(sessionID);
239
+ },
240
+ claimAwareness(sessionID, promptText) {
241
+ if (jevSkillHintStatus(env) !== "on" || !isJevEligiblePrompt(promptText))
242
+ return false;
243
+ const session = sessions.get(sessionID) ?? { calls: 0, noted: false, announced: false };
244
+ sessions.set(sessionID, session);
245
+ if (session.announced)
246
+ return false;
247
+ session.announced = true;
248
+ return true;
249
+ },
250
+ async hintFor(sessionID, promptText) {
251
+ if (jevSkillHintStatus(env) !== "on" || !isJevEligiblePrompt(promptText))
252
+ return undefined;
253
+ const key = (env.TYPESAFE_API_KEY ?? "").trim();
254
+ const session = sessions.get(sessionID) ?? { calls: 0, noted: false, announced: false };
255
+ sessions.set(sessionID, session);
256
+ const started = now();
257
+ // A key pasted into the prompt is masked even when it is too short for a token shape.
258
+ const state = redactJevPrompt(promptText.split(key).join("[secret]"));
259
+ let outcome;
260
+ if (session.calls >= boundedInteger(env[`${jevFlag}_MAX_CALLS`], defaultMaxCalls, 0, Number.MAX_SAFE_INTEGER)) {
261
+ outcome = { failure: "call cap reached" };
262
+ }
263
+ else {
264
+ session.calls += 1;
265
+ try {
266
+ outcome = await ask(state, key);
267
+ }
268
+ catch {
269
+ outcome = { failure: "network" };
270
+ }
271
+ }
272
+ const latencyMs = now() - started;
273
+ await trace({
274
+ time: new Date(started).toISOString(),
275
+ promptSha256: createHash("sha256").update(state).digest("hex"),
276
+ choice: outcome.choice ?? null,
277
+ confidence: outcome.confidence ?? null,
278
+ latencyMs,
279
+ httpStatus: outcome.httpStatus ?? null,
280
+ fallback: outcome.failure ?? null
281
+ });
282
+ if (outcome.choice !== undefined) {
283
+ return { kind: "hint", text: jevSkillHintText(outcome.choice), skillId: outcome.choice, latencyMs };
284
+ }
285
+ if (outcome.failure === undefined || session.noted)
286
+ return undefined;
287
+ session.noted = true;
288
+ return { kind: "note", text: jevSkillHintUnavailableText(outcome.failure) };
289
+ }
290
+ };
291
+ }
@@ -0,0 +1,6 @@
1
+ export type MotionImageReadInput = {
2
+ readonly tool: string;
3
+ readonly args?: unknown;
4
+ };
5
+ export declare function motionRunDirFor(file: string): string | undefined;
6
+ export declare function recordMotionImageRead(input: MotionImageReadInput, cwd?: string): void;