@litfamily/lithermes 1.0.0

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 (557) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +186 -0
  3. package/README_Ko-KR.md +188 -0
  4. package/assets/lithermes-plugin/NOTICE.md +46 -0
  5. package/assets/lithermes-plugin/README.md +390 -0
  6. package/assets/lithermes-plugin/__init__.py +589 -0
  7. package/assets/lithermes-plugin/auto_update.py +338 -0
  8. package/assets/lithermes-plugin/bounded_work.py +1120 -0
  9. package/assets/lithermes-plugin/bounded_work_tools.py +115 -0
  10. package/assets/lithermes-plugin/core.py +1813 -0
  11. package/assets/lithermes-plugin/core_commands.py +243 -0
  12. package/assets/lithermes-plugin/core_contexts.py +458 -0
  13. package/assets/lithermes-plugin/core_contract.py +456 -0
  14. package/assets/lithermes-plugin/core_plans.py +418 -0
  15. package/assets/lithermes-plugin/core_reader_args.py +34 -0
  16. package/assets/lithermes-plugin/core_recap_command.py +141 -0
  17. package/assets/lithermes-plugin/core_recap_state.py +175 -0
  18. package/assets/lithermes-plugin/core_review.py +198 -0
  19. package/assets/lithermes-plugin/core_routing.py +641 -0
  20. package/assets/lithermes-plugin/core_runs.py +283 -0
  21. package/assets/lithermes-plugin/core_runtime.py +251 -0
  22. package/assets/lithermes-plugin/core_workflow_commands.py +207 -0
  23. package/assets/lithermes-plugin/deliverable_hedge_guard.py +562 -0
  24. package/assets/lithermes-plugin/diagnostics.py +468 -0
  25. package/assets/lithermes-plugin/handoff.py +97 -0
  26. package/assets/lithermes-plugin/knowledge.py +920 -0
  27. package/assets/lithermes-plugin/knowledge_tools.py +130 -0
  28. package/assets/lithermes-plugin/lit_mark.py +140 -0
  29. package/assets/lithermes-plugin/lit_mark_rows.json +1363 -0
  30. package/assets/lithermes-plugin/litgoal/__init__.py +10 -0
  31. package/assets/lithermes-plugin/litgoal/cli.py +207 -0
  32. package/assets/lithermes-plugin/litgoal/hook.py +81 -0
  33. package/assets/lithermes-plugin/litgoal/model.py +203 -0
  34. package/assets/lithermes-plugin/litgoal/runtime.py +522 -0
  35. package/assets/lithermes-plugin/litgoal/store.py +367 -0
  36. package/assets/lithermes-plugin/litgoal/tools.py +300 -0
  37. package/assets/lithermes-plugin/output-styles/asd-ste100-ko.md +41 -0
  38. package/assets/lithermes-plugin/output-styles/asd-ste100.md +40 -0
  39. package/assets/lithermes-plugin/output-styles/eli5-ko.md +13 -0
  40. package/assets/lithermes-plugin/output-styles/eli5.md +11 -0
  41. package/assets/lithermes-plugin/output_styles.py +62 -0
  42. package/assets/lithermes-plugin/payload-version.json +2107 -0
  43. package/assets/lithermes-plugin/plugin.yaml +16 -0
  44. package/assets/lithermes-plugin/provider_metrics.py +161 -0
  45. package/assets/lithermes-plugin/redaction.py +148 -0
  46. package/assets/lithermes-plugin/rules/__init__.py +55 -0
  47. package/assets/lithermes-plugin/rules/bundled-rules/baseline-discipline.md +20 -0
  48. package/assets/lithermes-plugin/rules/bundled-rules/build-decision-gate.md +19 -0
  49. package/assets/lithermes-plugin/rules/bundled-rules/windows-git-bash.md +17 -0
  50. package/assets/lithermes-plugin/rules/constants.py +122 -0
  51. package/assets/lithermes-plugin/rules/discovery.py +276 -0
  52. package/assets/lithermes-plugin/rules/engine.py +447 -0
  53. package/assets/lithermes-plugin/rules/frontmatter.py +149 -0
  54. package/assets/lithermes-plugin/rules/globmatch.py +333 -0
  55. package/assets/lithermes-plugin/scientific_visualization.py +158 -0
  56. package/assets/lithermes-plugin/session_context.py +8 -0
  57. package/assets/lithermes-plugin/skill_loop.py +2044 -0
  58. package/assets/lithermes-plugin/skill_observer.py +1778 -0
  59. package/assets/lithermes-plugin/skills/autoconference/LICENSE +21 -0
  60. package/assets/lithermes-plugin/skills/autoconference/ORIGIN.json +11 -0
  61. package/assets/lithermes-plugin/skills/autoconference/SKILL.md +163 -0
  62. package/assets/lithermes-plugin/skills/autoconference/assets/conference_template.md +76 -0
  63. package/assets/lithermes-plugin/skills/autoconference/assets/report_template.md +53 -0
  64. package/assets/lithermes-plugin/skills/autoconference/assets/synthesis_template.md +39 -0
  65. package/assets/lithermes-plugin/skills/autoconference/dependencies/autoresearch.md +14 -0
  66. package/assets/lithermes-plugin/skills/autoconference/modes/analyze/SKILL.md +269 -0
  67. package/assets/lithermes-plugin/skills/autoconference/modes/core/SKILL.md +134 -0
  68. package/assets/lithermes-plugin/skills/autoconference/modes/core/convergence-guide.md +162 -0
  69. package/assets/lithermes-plugin/skills/autoconference/modes/core/crash-recovery.md +63 -0
  70. package/assets/lithermes-plugin/skills/autoconference/modes/debate/SKILL.md +383 -0
  71. package/assets/lithermes-plugin/skills/autoconference/modes/plan/SKILL.md +304 -0
  72. package/assets/lithermes-plugin/skills/autoconference/modes/resume/SKILL.md +82 -0
  73. package/assets/lithermes-plugin/skills/autoconference/modes/ship/SKILL.md +78 -0
  74. package/assets/lithermes-plugin/skills/autoconference/modes/survey/SKILL.md +376 -0
  75. package/assets/lithermes-plugin/skills/autoconference/references/agent-prompts.md +110 -0
  76. package/assets/lithermes-plugin/skills/autoconference/references/conference-protocol.md +90 -0
  77. package/assets/lithermes-plugin/skills/autoconference/references/core-principles.md +78 -0
  78. package/assets/lithermes-plugin/skills/autoconference/references/results-logging.md +165 -0
  79. package/assets/lithermes-plugin/skills/autoconference/references/visualization-guide.md +99 -0
  80. package/assets/lithermes-plugin/skills/autoconference/scripts/check_conference.sh +197 -0
  81. package/assets/lithermes-plugin/skills/autoconference/scripts/init_conference.py +489 -0
  82. package/assets/lithermes-plugin/skills/autoconference/scripts/style_presets.py +104 -0
  83. package/assets/lithermes-plugin/skills/autoconference/templates/code-performance.md +59 -0
  84. package/assets/lithermes-plugin/skills/autoconference/templates/debate-mode.md +50 -0
  85. package/assets/lithermes-plugin/skills/autoconference/templates/prompt-optimization.md +58 -0
  86. package/assets/lithermes-plugin/skills/autoconference/templates/quick-conference.md +48 -0
  87. package/assets/lithermes-plugin/skills/autoconference/templates/research-synthesis.md +56 -0
  88. package/assets/lithermes-plugin/skills/autoconference/templates/survey-mode.md +63 -0
  89. package/assets/lithermes-plugin/skills/autoresearch/LICENSE +21 -0
  90. package/assets/lithermes-plugin/skills/autoresearch/ORIGIN.json +11 -0
  91. package/assets/lithermes-plugin/skills/autoresearch/SKILL.md +175 -0
  92. package/assets/lithermes-plugin/skills/autoresearch/assets/report_template.md +50 -0
  93. package/assets/lithermes-plugin/skills/autoresearch/assets/research_template.md +38 -0
  94. package/assets/lithermes-plugin/skills/autoresearch/assets/results_template.tsv +2 -0
  95. package/assets/lithermes-plugin/skills/autoresearch/modes/core/SKILL.md +204 -0
  96. package/assets/lithermes-plugin/skills/autoresearch/modes/core/evaluator-contract.md +108 -0
  97. package/assets/lithermes-plugin/skills/autoresearch/modes/core/stuck-detection.md +102 -0
  98. package/assets/lithermes-plugin/skills/autoresearch/modes/debug/SKILL.md +240 -0
  99. package/assets/lithermes-plugin/skills/autoresearch/modes/debug/investigation-techniques.md +254 -0
  100. package/assets/lithermes-plugin/skills/autoresearch/modes/fix/SKILL.md +176 -0
  101. package/assets/lithermes-plugin/skills/autoresearch/modes/learn/SKILL.md +96 -0
  102. package/assets/lithermes-plugin/skills/autoresearch/modes/plan/SKILL.md +291 -0
  103. package/assets/lithermes-plugin/skills/autoresearch/modes/predict/SKILL.md +271 -0
  104. package/assets/lithermes-plugin/skills/autoresearch/modes/predict/persona-templates.md +227 -0
  105. package/assets/lithermes-plugin/skills/autoresearch/modes/reason/SKILL.md +174 -0
  106. package/assets/lithermes-plugin/skills/autoresearch/modes/scenario/SKILL.md +168 -0
  107. package/assets/lithermes-plugin/skills/autoresearch/modes/scenario/dimensions.md +173 -0
  108. package/assets/lithermes-plugin/skills/autoresearch/modes/security/SKILL.md +287 -0
  109. package/assets/lithermes-plugin/skills/autoresearch/modes/security/owasp-checklist.md +156 -0
  110. package/assets/lithermes-plugin/skills/autoresearch/modes/security/stride-model.md +191 -0
  111. package/assets/lithermes-plugin/skills/autoresearch/modes/ship/SKILL.md +99 -0
  112. package/assets/lithermes-plugin/skills/autoresearch/modes/ship/type-checklists.md +158 -0
  113. package/assets/lithermes-plugin/skills/autoresearch/references/core-principles.md +75 -0
  114. package/assets/lithermes-plugin/skills/autoresearch/references/results-logging.md +55 -0
  115. package/assets/lithermes-plugin/skills/autoresearch/references/visualization-guide.md +90 -0
  116. package/assets/lithermes-plugin/skills/autoresearch/scripts/check_progress.sh +139 -0
  117. package/assets/lithermes-plugin/skills/autoresearch/scripts/init_research.py +219 -0
  118. package/assets/lithermes-plugin/skills/autoresearch/scripts/style_presets.py +104 -0
  119. package/assets/lithermes-plugin/skills/browser-drive/SKILL.md +147 -0
  120. package/assets/lithermes-plugin/skills/browser-drive/scripts/capability_probe.py +528 -0
  121. package/assets/lithermes-plugin/skills/comment-checker/SKILL.md +162 -0
  122. package/assets/lithermes-plugin/skills/debugging/SKILL.md +271 -0
  123. package/assets/lithermes-plugin/skills/debugging/references/methodology/00-setup.md +108 -0
  124. package/assets/lithermes-plugin/skills/debugging/references/methodology/02-investigate.md +122 -0
  125. package/assets/lithermes-plugin/skills/debugging/references/methodology/04-oracle-triple.md +136 -0
  126. package/assets/lithermes-plugin/skills/debugging/references/methodology/05-escalate.md +69 -0
  127. package/assets/lithermes-plugin/skills/debugging/references/methodology/06-fix.md +116 -0
  128. package/assets/lithermes-plugin/skills/debugging/references/methodology/08-qa.md +94 -0
  129. package/assets/lithermes-plugin/skills/debugging/references/methodology/09-cleanup.md +164 -0
  130. package/assets/lithermes-plugin/skills/debugging/references/methodology/partial-runtime-evidence.md +229 -0
  131. package/assets/lithermes-plugin/skills/debugging/references/runtimes/bundled-js-binary.md +415 -0
  132. package/assets/lithermes-plugin/skills/debugging/references/runtimes/go.md +252 -0
  133. package/assets/lithermes-plugin/skills/debugging/references/runtimes/native-binary.md +484 -0
  134. package/assets/lithermes-plugin/skills/debugging/references/runtimes/node.md +260 -0
  135. package/assets/lithermes-plugin/skills/debugging/references/runtimes/python.md +248 -0
  136. package/assets/lithermes-plugin/skills/debugging/references/runtimes/rust.md +234 -0
  137. package/assets/lithermes-plugin/skills/debugging/references/tools/ghidra.md +212 -0
  138. package/assets/lithermes-plugin/skills/debugging/references/tools/playwright-cli.md +194 -0
  139. package/assets/lithermes-plugin/skills/debugging/references/tools/pwndbg.md +263 -0
  140. package/assets/lithermes-plugin/skills/debugging/references/tools/pwntools.md +265 -0
  141. package/assets/lithermes-plugin/skills/deep-interview/SKILL.md +419 -0
  142. package/assets/lithermes-plugin/skills/frontend-ui-ux/SKILL.md +49 -0
  143. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/.gitattributes +2 -0
  144. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/README.md +248 -0
  145. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/_INDEX.md +191 -0
  146. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/airbnb.md +393 -0
  147. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/airtable.md +92 -0
  148. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/apple.md +250 -0
  149. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/aside.md +209 -0
  150. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/binance.md +348 -0
  151. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/bmw.md +183 -0
  152. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/brutalist-skill.md +92 -0
  153. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/bugatti.md +271 -0
  154. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/cal.md +262 -0
  155. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/claude.md +315 -0
  156. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/clay.md +307 -0
  157. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/clickhouse.md +284 -0
  158. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/clone-from-url.md +65 -0
  159. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/cohere.md +269 -0
  160. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/coinbase.md +132 -0
  161. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/composio.md +310 -0
  162. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/cursor.md +312 -0
  163. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/design-system-architecture.md +244 -0
  164. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/elevenlabs.md +268 -0
  165. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/expo.md +284 -0
  166. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/ferrari.md +317 -0
  167. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/figma.md +223 -0
  168. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/framer.md +249 -0
  169. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/gpt-tasteskill.md +74 -0
  170. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/hashicorp.md +281 -0
  171. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/ibm.md +335 -0
  172. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/image-to-code-skill.md +1228 -0
  173. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/imagegen-brandkit.md +798 -0
  174. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/imagegen-frontend-mobile.md +1465 -0
  175. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/imagegen-frontend-web.md +987 -0
  176. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/intercom.md +149 -0
  177. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/kraken.md +128 -0
  178. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/lamborghini.md +291 -0
  179. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/layout-skill.md +107 -0
  180. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/lazyweb.md +77 -0
  181. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/linear.app.md +370 -0
  182. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/lovable.md +301 -0
  183. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/mastercard.md +368 -0
  184. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/meta.md +369 -0
  185. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/minimalist-skill.md +85 -0
  186. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/minimax.md +260 -0
  187. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/mintlify.md +329 -0
  188. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/miro.md +111 -0
  189. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/mistral.ai.md +264 -0
  190. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/mongodb.md +269 -0
  191. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/nike.md +366 -0
  192. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/notion.md +312 -0
  193. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/nvidia.md +296 -0
  194. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/ollama.md +270 -0
  195. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/opencode.ai.md +284 -0
  196. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/output-skill.md +49 -0
  197. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/pinterest.md +233 -0
  198. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/playstation.md +367 -0
  199. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/posthog.md +259 -0
  200. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/raycast.md +271 -0
  201. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/react-dev-tooling-skill.md +230 -0
  202. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/redesign-skill.md +178 -0
  203. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/renault.md +314 -0
  204. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/replicate.md +264 -0
  205. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/resend.md +306 -0
  206. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/revolut.md +188 -0
  207. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/runwayml.md +247 -0
  208. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/sanity.md +360 -0
  209. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/sentry.md +265 -0
  210. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/shopify.md +353 -0
  211. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/soft-skill.md +98 -0
  212. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/spacex.md +197 -0
  213. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/spotify.md +249 -0
  214. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/starbucks.md +583 -0
  215. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/stitch-design-example.md +121 -0
  216. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/stitch-skill.md +184 -0
  217. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/stripe.md +325 -0
  218. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/supabase.md +258 -0
  219. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/superhuman.md +255 -0
  220. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/taste-skill.md +1206 -0
  221. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/tesla.md +289 -0
  222. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/theverge.md +342 -0
  223. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/together.ai.md +266 -0
  224. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/uber.md +298 -0
  225. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/vercel.md +313 -0
  226. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/vodafone.md +426 -0
  227. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/voltagent.md +326 -0
  228. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/warp.md +256 -0
  229. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/webflow.md +95 -0
  230. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/wired.md +281 -0
  231. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/wise.md +176 -0
  232. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/x.ai.md +260 -0
  233. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/design/zapier.md +331 -0
  234. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/EVIDENCE.md +97 -0
  235. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/README.md +48 -0
  236. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/UPSTREAM.md +80 -0
  237. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/lane-a-direction.md +64 -0
  238. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/lane-b-execution.md +65 -0
  239. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/lane-c-review.md +65 -0
  240. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/lane-d-memory.md +83 -0
  241. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/orchestration.md +80 -0
  242. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/routing.md +79 -0
  243. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/LICENSE +21 -0
  244. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/agents/accessibility-reviewer.md +83 -0
  245. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/agents/content-writer.md +132 -0
  246. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/agents/design-builder.md +109 -0
  247. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/agents/design-critic.md +89 -0
  248. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/agents/design-lead.md +113 -0
  249. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/agents/design-scout.md +78 -0
  250. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/agents/design-strategist.md +121 -0
  251. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/agents/heuristic-evaluator.md +268 -0
  252. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/agents/inspiration-scout.md +107 -0
  253. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/agents/motion-designer.md +120 -0
  254. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/accessible-content/reference.md +101 -0
  255. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/adaptive-interfaces/reference.md +109 -0
  256. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/cognitive-accessibility/reference.md +107 -0
  257. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/design-debate/reference.md +199 -0
  258. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/design-debt-tracker/reference.md +174 -0
  259. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/design-handoff/reference.md +125 -0
  260. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/design-md/reference.md +106 -0
  261. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/design-retrospective/reference.md +266 -0
  262. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/design-review/reference.md +123 -0
  263. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/design-system-alignment/reference.md +120 -0
  264. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/designpowers-critique/reference.md +164 -0
  265. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/heuristic-evaluation/reference.md +85 -0
  266. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/inclusive-personas/reference.md +98 -0
  267. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/inspiration-scouting/reference.md +165 -0
  268. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/interaction-design/reference.md +122 -0
  269. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/motion-choreography/reference.md +81 -0
  270. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/research-planning/reference.md +96 -0
  271. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/responsive-patterns/reference.md +77 -0
  272. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/synthetic-user-testing/reference.md +192 -0
  273. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/taste-feedback/reference.md +165 -0
  274. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/taste-report/reference.md +78 -0
  275. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/token-architecture/reference.md +75 -0
  276. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/ui-composition/reference.md +117 -0
  277. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/usability-testing/reference.md +78 -0
  278. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/verification-before-shipping/reference.md +125 -0
  279. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/voice-and-tone/reference.md +79 -0
  280. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/designpowers/vendor/skills/writing-design-plans/reference.md +119 -0
  281. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/perfection/README.md +160 -0
  282. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/perfection/react-perf-tooling.md +127 -0
  283. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/README.md +659 -0
  284. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/charts.csv +26 -0
  285. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/colors.csv +162 -0
  286. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/icons.csv +106 -0
  287. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/landing.csv +35 -0
  288. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/products.csv +162 -0
  289. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/react-performance.csv +45 -0
  290. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/stacks/astro.csv +54 -0
  291. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/stacks/flutter.csv +53 -0
  292. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/stacks/html-tailwind.csv +56 -0
  293. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/stacks/jetpack-compose.csv +53 -0
  294. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/stacks/nextjs.csv +53 -0
  295. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/stacks/nuxt-ui.csv +51 -0
  296. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/stacks/nuxtjs.csv +59 -0
  297. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/stacks/react-native.csv +52 -0
  298. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/stacks/react.csv +54 -0
  299. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/stacks/shadcn.csv +61 -0
  300. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/stacks/svelte.csv +54 -0
  301. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/stacks/swiftui.csv +51 -0
  302. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/stacks/vue.csv +50 -0
  303. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/styles.csv +85 -0
  304. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/typography.csv +74 -0
  305. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/ui-reasoning.csv +162 -0
  306. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/ux-guidelines.csv +100 -0
  307. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/data/web-interface.csv +31 -0
  308. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/scripts/core.py +262 -0
  309. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/scripts/design_system.py +1148 -0
  310. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/corpus/ui-ux-db/scripts/search.py +114 -0
  311. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/legal/ATTRIBUTION.md +217 -0
  312. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/legal/LICENSE +21 -0
  313. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/legal/LICENSE-Apache-2.0.txt +201 -0
  314. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/_canonical-corpus/manifest.json +876 -0
  315. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/adaptive-layout.md +81 -0
  316. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/brand-and-imagery.md +84 -0
  317. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/complete-contract.md +457 -0
  318. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/composition.md +89 -0
  319. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/creative-directions.md +81 -0
  320. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/evidence-review.md +113 -0
  321. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/implementation-platforms.md +92 -0
  322. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/inclusive-interface.md +85 -0
  323. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/interaction-motion.md +87 -0
  324. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/operating-lanes.md +85 -0
  325. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/performance-delivery.md +85 -0
  326. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/product-direction.md +86 -0
  327. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/redesign-playbook.md +91 -0
  328. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/system-foundations.md +82 -0
  329. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/taste-direction.md +86 -0
  330. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/visual-language.md +85 -0
  331. package/assets/lithermes-plugin/skills/frontend-ui-ux/references/visual-reconstruction.md +94 -0
  332. package/assets/lithermes-plugin/skills/frontend-ui-ux/resources/LICENSE +21 -0
  333. package/assets/lithermes-plugin/skills/frontend-ui-ux/resources/PROVENANCE.json +38 -0
  334. package/assets/lithermes-plugin/skills/frontend-ui-ux/resources/THIRD-PARTY-NOTICE.txt +14 -0
  335. package/assets/lithermes-plugin/skills/frontend-ui-ux/resources/design-intelligence.json +1 -0
  336. package/assets/lithermes-plugin/skills/frontend-ui-ux/resources/import-manifest.json +1060 -0
  337. package/assets/lithermes-plugin/skills/frontend-ui-ux/schemas/design-contract-v1alpha1.schema.json +264 -0
  338. package/assets/lithermes-plugin/skills/frontend-ui-ux/schemas/design-contract-v1beta1.schema.json +268 -0
  339. package/assets/lithermes-plugin/skills/frontend-ui-ux/schemas/design-contract-v1beta2.schema.json +280 -0
  340. package/assets/lithermes-plugin/skills/frontend-ui-ux/scripts/design_contract_validation.py +996 -0
  341. package/assets/lithermes-plugin/skills/frontend-ui-ux/scripts/design_intelligence.py +128 -0
  342. package/assets/lithermes-plugin/skills/frontend-ui-ux/scripts/design_runtime.py +98 -0
  343. package/assets/lithermes-plugin/skills/frontend-ui-ux/scripts/import_design_intelligence.py +56 -0
  344. package/assets/lithermes-plugin/skills/frontend-ui-ux/scripts/source_import.py +144 -0
  345. package/assets/lithermes-plugin/skills/frontend-ui-ux/scripts/source_manifest.py +65 -0
  346. package/assets/lithermes-plugin/skills/lit-burnoff/SKILL.md +448 -0
  347. package/assets/lithermes-plugin/skills/lit-burnoff-file/SKILL.md +254 -0
  348. package/assets/lithermes-plugin/skills/lit-code/SKILL.md +609 -0
  349. package/assets/lithermes-plugin/skills/lit-code/references/go/README.md +90 -0
  350. package/assets/lithermes-plugin/skills/lit-code/references/go/backend-stack.md +641 -0
  351. package/assets/lithermes-plugin/skills/lit-code/references/go/bootstrap.md +328 -0
  352. package/assets/lithermes-plugin/skills/lit-code/references/go/bubbletea-v2.md +359 -0
  353. package/assets/lithermes-plugin/skills/lit-code/references/go/cobra-stack.md +468 -0
  354. package/assets/lithermes-plugin/skills/lit-code/references/go/concurrency.md +362 -0
  355. package/assets/lithermes-plugin/skills/lit-code/references/go/data-modeling.md +329 -0
  356. package/assets/lithermes-plugin/skills/lit-code/references/go/error-handling.md +359 -0
  357. package/assets/lithermes-plugin/skills/lit-code/references/go/golangci-strict.md +236 -0
  358. package/assets/lithermes-plugin/skills/lit-code/references/go/grpc-connect.md +375 -0
  359. package/assets/lithermes-plugin/skills/lit-code/references/go/libraries.md +337 -0
  360. package/assets/lithermes-plugin/skills/lit-code/references/go/one-liners.md +202 -0
  361. package/assets/lithermes-plugin/skills/lit-code/references/go/sqlc-pgx.md +471 -0
  362. package/assets/lithermes-plugin/skills/lit-code/references/go/testing.md +467 -0
  363. package/assets/lithermes-plugin/skills/lit-code/references/go/type-patterns.md +298 -0
  364. package/assets/lithermes-plugin/skills/lit-code/references/python/README.md +314 -0
  365. package/assets/lithermes-plugin/skills/lit-code/references/python/async-anyio.md +442 -0
  366. package/assets/lithermes-plugin/skills/lit-code/references/python/data-modeling.md +233 -0
  367. package/assets/lithermes-plugin/skills/lit-code/references/python/data-processing.md +133 -0
  368. package/assets/lithermes-plugin/skills/lit-code/references/python/error-handling.md +218 -0
  369. package/assets/lithermes-plugin/skills/lit-code/references/python/fastapi-stack.md +316 -0
  370. package/assets/lithermes-plugin/skills/lit-code/references/python/httpx2-optimization.md +360 -0
  371. package/assets/lithermes-plugin/skills/lit-code/references/python/libraries.md +307 -0
  372. package/assets/lithermes-plugin/skills/lit-code/references/python/one-liners.md +268 -0
  373. package/assets/lithermes-plugin/skills/lit-code/references/python/orjson-stack.md +378 -0
  374. package/assets/lithermes-plugin/skills/lit-code/references/python/pydantic-ai.md +285 -0
  375. package/assets/lithermes-plugin/skills/lit-code/references/python/pyproject-strict.md +232 -0
  376. package/assets/lithermes-plugin/skills/lit-code/references/python/textual-tui.md +201 -0
  377. package/assets/lithermes-plugin/skills/lit-code/references/python/type-patterns.md +176 -0
  378. package/assets/lithermes-plugin/skills/lit-code/references/rust/README.md +317 -0
  379. package/assets/lithermes-plugin/skills/lit-code/references/rust/async-tokio.md +299 -0
  380. package/assets/lithermes-plugin/skills/lit-code/references/rust/axum-stack.md +467 -0
  381. package/assets/lithermes-plugin/skills/lit-code/references/rust/cargo-strict.md +317 -0
  382. package/assets/lithermes-plugin/skills/lit-code/references/rust/clap-stack.md +409 -0
  383. package/assets/lithermes-plugin/skills/lit-code/references/rust/concurrency.md +375 -0
  384. package/assets/lithermes-plugin/skills/lit-code/references/rust/libraries.md +439 -0
  385. package/assets/lithermes-plugin/skills/lit-code/references/rust/one-liners.md +291 -0
  386. package/assets/lithermes-plugin/skills/lit-code/references/rust/proptest-insta.md +429 -0
  387. package/assets/lithermes-plugin/skills/lit-code/references/rust/type-state.md +354 -0
  388. package/assets/lithermes-plugin/skills/lit-code/references/rust/unsafe-discipline.md +250 -0
  389. package/assets/lithermes-plugin/skills/lit-code/references/rust/zero-cost-safety.md +527 -0
  390. package/assets/lithermes-plugin/skills/lit-code/references/rust-ub/README.md +289 -0
  391. package/assets/lithermes-plugin/skills/lit-code/references/rust-ub/miri-sanitizers-loom.md +411 -0
  392. package/assets/lithermes-plugin/skills/lit-code/references/rust-ub/ub-taxonomy.md +269 -0
  393. package/assets/lithermes-plugin/skills/lit-code/references/typescript/README.md +195 -0
  394. package/assets/lithermes-plugin/skills/lit-code/references/typescript/backend-hono.md +672 -0
  395. package/assets/lithermes-plugin/skills/lit-code/references/typescript/bootstrap.md +199 -0
  396. package/assets/lithermes-plugin/skills/lit-code/references/typescript/data-modeling.md +202 -0
  397. package/assets/lithermes-plugin/skills/lit-code/references/typescript/error-handling.md +169 -0
  398. package/assets/lithermes-plugin/skills/lit-code/references/typescript/tsconfig-strict.md +152 -0
  399. package/assets/lithermes-plugin/skills/lit-code/references/typescript/type-patterns.md +196 -0
  400. package/assets/lithermes-plugin/skills/lit-code/scripts/go/check-no-excuse-rules.sh +173 -0
  401. package/assets/lithermes-plugin/skills/lit-code/scripts/go/new-project.py +138 -0
  402. package/assets/lithermes-plugin/skills/lit-code/scripts/go/templates/.editorconfig +13 -0
  403. package/assets/lithermes-plugin/skills/lit-code/scripts/go/templates/.golangci.yml +95 -0
  404. package/assets/lithermes-plugin/skills/lit-code/scripts/go/templates/AGENTS.md.tmpl +24 -0
  405. package/assets/lithermes-plugin/skills/lit-code/scripts/go/templates/README.md.tmpl +12 -0
  406. package/assets/lithermes-plugin/skills/lit-code/scripts/go/templates/Taskfile.yml +40 -0
  407. package/assets/lithermes-plugin/skills/lit-code/scripts/go/templates/ci.yml +37 -0
  408. package/assets/lithermes-plugin/skills/lit-code/scripts/go/templates/config.go +24 -0
  409. package/assets/lithermes-plugin/skills/lit-code/scripts/go/templates/gitignore +15 -0
  410. package/assets/lithermes-plugin/skills/lit-code/scripts/go/templates/main.go.tmpl +22 -0
  411. package/assets/lithermes-plugin/skills/lit-code/scripts/go/templates/run.go +15 -0
  412. package/assets/lithermes-plugin/skills/lit-code/scripts/python/check-no-excuse-rules.py +687 -0
  413. package/assets/lithermes-plugin/skills/lit-code/scripts/python/new-project.py +172 -0
  414. package/assets/lithermes-plugin/skills/lit-code/scripts/python/new-script.py +116 -0
  415. package/assets/lithermes-plugin/skills/lit-code/scripts/rust/check-no-excuse-rules.py +296 -0
  416. package/assets/lithermes-plugin/skills/lit-code/scripts/rust/check-no-excuse-rules.sh +158 -0
  417. package/assets/lithermes-plugin/skills/lit-code/scripts/rust/new-project.py +175 -0
  418. package/assets/lithermes-plugin/skills/lit-code/scripts/typescript/check-no-excuse-rules.ts +282 -0
  419. package/assets/lithermes-plugin/skills/lit-code/scripts/typescript/new-project.ts +177 -0
  420. package/assets/lithermes-plugin/skills/lit-commit/SKILL.md +242 -0
  421. package/assets/lithermes-plugin/skills/lit-comprehend/SKILL.md +259 -0
  422. package/assets/lithermes-plugin/skills/lit-comprehend/assets/explainer-scaffold.html +123 -0
  423. package/assets/lithermes-plugin/skills/lit-comprehend/references/artifact-template.md +205 -0
  424. package/assets/lithermes-plugin/skills/lit-comprehend/references/micro-worlds.md +139 -0
  425. package/assets/lithermes-plugin/skills/lit-comprehend/scripts/verify-explainer.py +324 -0
  426. package/assets/lithermes-plugin/skills/lit-crucible/SKILL.md +315 -0
  427. package/assets/lithermes-plugin/skills/lit-handoff/ORIGIN.json +23 -0
  428. package/assets/lithermes-plugin/skills/lit-handoff/SKILL.md +145 -0
  429. package/assets/lithermes-plugin/skills/lit-init/SKILL.md +329 -0
  430. package/assets/lithermes-plugin/skills/lit-korean/SKILL.md +237 -0
  431. package/assets/lithermes-plugin/skills/lit-korean/references/quick-rules.md +24 -0
  432. package/assets/lithermes-plugin/skills/lit-korean/references/safety-checklist.md +23 -0
  433. package/assets/lithermes-plugin/skills/lit-plan/SKILL.md +596 -0
  434. package/assets/lithermes-plugin/skills/lit-recap/SKILL.md +183 -0
  435. package/assets/lithermes-plugin/skills/lit-scientific-visualization/ORIGIN.json +32 -0
  436. package/assets/lithermes-plugin/skills/lit-scientific-visualization/SKILL.md +170 -0
  437. package/assets/lithermes-plugin/skills/litgoal/.gitkeep +0 -0
  438. package/assets/lithermes-plugin/skills/litgoal/SKILL.md +372 -0
  439. package/assets/lithermes-plugin/skills/litresearch/ATTRIBUTION.md +50 -0
  440. package/assets/lithermes-plugin/skills/litresearch/SKILL.md +593 -0
  441. package/assets/lithermes-plugin/skills/litwork/SKILL.md +419 -0
  442. package/assets/lithermes-plugin/skills/lsp/SKILL.md +165 -0
  443. package/assets/lithermes-plugin/skills/lsp-setup/SKILL.md +265 -0
  444. package/assets/lithermes-plugin/skills/lsp-setup/references/bash/README.md +68 -0
  445. package/assets/lithermes-plugin/skills/lsp-setup/references/c-cpp/README.md +78 -0
  446. package/assets/lithermes-plugin/skills/lsp-setup/references/csharp/README.md +90 -0
  447. package/assets/lithermes-plugin/skills/lsp-setup/references/dart/README.md +59 -0
  448. package/assets/lithermes-plugin/skills/lsp-setup/references/elixir/README.md +61 -0
  449. package/assets/lithermes-plugin/skills/lsp-setup/references/go/README.md +63 -0
  450. package/assets/lithermes-plugin/skills/lsp-setup/references/haskell/README.md +69 -0
  451. package/assets/lithermes-plugin/skills/lsp-setup/references/java/README.md +70 -0
  452. package/assets/lithermes-plugin/skills/lsp-setup/references/julia/README.md +70 -0
  453. package/assets/lithermes-plugin/skills/lsp-setup/references/kotlin/README.md +72 -0
  454. package/assets/lithermes-plugin/skills/lsp-setup/references/lua/README.md +68 -0
  455. package/assets/lithermes-plugin/skills/lsp-setup/references/php/README.md +61 -0
  456. package/assets/lithermes-plugin/skills/lsp-setup/references/python/README.md +73 -0
  457. package/assets/lithermes-plugin/skills/lsp-setup/references/ruby/README.md +67 -0
  458. package/assets/lithermes-plugin/skills/lsp-setup/references/rust/README.md +65 -0
  459. package/assets/lithermes-plugin/skills/lsp-setup/references/swift/README.md +64 -0
  460. package/assets/lithermes-plugin/skills/lsp-setup/references/terraform/README.md +66 -0
  461. package/assets/lithermes-plugin/skills/lsp-setup/references/typescript/README.md +82 -0
  462. package/assets/lithermes-plugin/skills/lsp-setup/references/yaml/README.md +65 -0
  463. package/assets/lithermes-plugin/skills/lsp-setup/references/zig/README.md +59 -0
  464. package/assets/lithermes-plugin/skills/lsp-setup/scripts/detect-lsp.ts +221 -0
  465. package/assets/lithermes-plugin/skills/lsp-setup/scripts/lsp-server-table.ts +146 -0
  466. package/assets/lithermes-plugin/skills/lsp-setup/scripts/tsconfig.json +18 -0
  467. package/assets/lithermes-plugin/skills/lsp-setup/scripts/verify-lsp.ts +252 -0
  468. package/assets/lithermes-plugin/skills/refactor/SKILL.md +896 -0
  469. package/assets/lithermes-plugin/skills/review-work/SKILL.md +450 -0
  470. package/assets/lithermes-plugin/skills/rules/SKILL.md +194 -0
  471. package/assets/lithermes-plugin/skills/skill-observer/SKILL.md +190 -0
  472. package/assets/lithermes-plugin/skills/skill-observer/references/review-contract.md +77 -0
  473. package/assets/lithermes-plugin/skills/start-work/SKILL.md +550 -0
  474. package/assets/lithermes-plugin/skills/structural-search/SKILL.md +274 -0
  475. package/assets/lithermes-plugin/skills/visual-qa/SKILL.md +48 -0
  476. package/assets/lithermes-plugin/skills/visual-qa/references/capture-playbook.md +133 -0
  477. package/assets/lithermes-plugin/skills/visual-qa/references/complete-contract.md +522 -0
  478. package/assets/lithermes-plugin/skills/visual-qa/schemas/evidence-manifest-v1alpha1.schema.json +135 -0
  479. package/assets/lithermes-plugin/skills/visual-qa/schemas/evidence-manifest-v1beta1.schema.json +110 -0
  480. package/assets/lithermes-plugin/skills/visual-qa/schemas/review-receipt-v1alpha1.schema.json +49 -0
  481. package/assets/lithermes-plugin/skills/visual-qa/scripts/contract_checks.py +71 -0
  482. package/assets/lithermes-plugin/skills/visual-qa/scripts/evidence_contract.py +288 -0
  483. package/assets/lithermes-plugin/skills/visual-qa/scripts/png_runtime.py +379 -0
  484. package/assets/lithermes-plugin/skills/visual-qa/scripts/review_contract.py +151 -0
  485. package/assets/lithermes-plugin/skills/visual-qa/scripts/tier_checks.py +190 -0
  486. package/assets/lithermes-plugin/skills/visual-qa/scripts/tier_contract.py +103 -0
  487. package/assets/lithermes-plugin/skills/visual-qa/scripts/tui_runtime.py +170 -0
  488. package/assets/lithermes-plugin/skills/visual-qa/scripts/visual_contracts.py +31 -0
  489. package/assets/lithermes-plugin/skills/visual-qa/scripts/visual_qa.py +79 -0
  490. package/assets/lithermes-plugin/skills/wikify/LICENSE +21 -0
  491. package/assets/lithermes-plugin/skills/wikify/ORIGIN.json +12 -0
  492. package/assets/lithermes-plugin/skills/wikify/SKILL.md +192 -0
  493. package/assets/lithermes-plugin/skills/wikify/assets/home-template.md +44 -0
  494. package/assets/lithermes-plugin/skills/wikify/assets/maintenance-report-template.md +46 -0
  495. package/assets/lithermes-plugin/skills/wikify/assets/paper-source-note-template.md +138 -0
  496. package/assets/lithermes-plugin/skills/wikify/assets/source-note-template.md +45 -0
  497. package/assets/lithermes-plugin/skills/wikify/assets/wiki-rules-template.md +117 -0
  498. package/assets/lithermes-plugin/skills/wikify/modes/ingest/SKILL.md +24 -0
  499. package/assets/lithermes-plugin/skills/wikify/modes/init/SKILL.md +26 -0
  500. package/assets/lithermes-plugin/skills/wikify/modes/lint/SKILL.md +30 -0
  501. package/assets/lithermes-plugin/skills/wikify/modes/query/SKILL.md +22 -0
  502. package/assets/lithermes-plugin/skills/wikify/modes/save/SKILL.md +32 -0
  503. package/assets/lithermes-plugin/skills/wikify/references/full-contract.md +761 -0
  504. package/assets/lithermes-plugin/uiux_runtime_common.py +117 -0
  505. package/assets/lithermes-plugin/vendor/NOTICE.md +21 -0
  506. package/assets/lithermes-plugin/vendor/handoff/SKILL.md +199 -0
  507. package/assets/lithermes-plugin/vendor/handoff/evals/evals.json +154 -0
  508. package/assets/lithermes-plugin/vendor/handoff/examples/HANDOFF-example-generic-auth-refactor.md +97 -0
  509. package/assets/lithermes-plugin/vendor/handoff/templates/HANDOFF.md +121 -0
  510. package/assets/lithermes-plugin/vendor/licenses/022_handoff-MIT.txt +21 -0
  511. package/assets/lithermes-plugin/vendor/licenses/045_scientific-visualization-MIT.txt +21 -0
  512. package/assets/lithermes-plugin/vendor/provenance/022_handoff.md +16 -0
  513. package/assets/lithermes-plugin/vendor/provenance/045_scientific-visualization.md +18 -0
  514. package/assets/lithermes-plugin/vendor/scientific-visualization/SKILL.md +283 -0
  515. package/assets/lithermes-plugin/vendor/scientific-visualization/assets/color_palettes.py +197 -0
  516. package/assets/lithermes-plugin/vendor/scientific-visualization/assets/nature.mplstyle +75 -0
  517. package/assets/lithermes-plugin/vendor/scientific-visualization/assets/presentation.mplstyle +74 -0
  518. package/assets/lithermes-plugin/vendor/scientific-visualization/assets/publication.mplstyle +78 -0
  519. package/assets/lithermes-plugin/vendor/scientific-visualization/evals/evals.json +158 -0
  520. package/assets/lithermes-plugin/vendor/scientific-visualization/references/color_palettes.md +380 -0
  521. package/assets/lithermes-plugin/vendor/scientific-visualization/references/journal_requirements.md +359 -0
  522. package/assets/lithermes-plugin/vendor/scientific-visualization/references/matplotlib_examples.md +608 -0
  523. package/assets/lithermes-plugin/vendor/scientific-visualization/references/mdanalysis_martini_visualization.md +85 -0
  524. package/assets/lithermes-plugin/vendor/scientific-visualization/references/publication_guidelines.md +217 -0
  525. package/assets/lithermes-plugin/vendor/scientific-visualization/references/seaborn_for_publications.md +293 -0
  526. package/assets/lithermes-plugin/vendor/scientific-visualization/scripts/figure_export.py +238 -0
  527. package/assets/lithermes-plugin/vendor/scientific-visualization/scripts/style_presets.py +467 -0
  528. package/assets/lithermes-plugin/vendor/scientific-visualization/tests/test_figure_export.py +51 -0
  529. package/assets/lithermes-plugin/vendor/scientific-visualization/tests/test_style_presets.py +114 -0
  530. package/bin/lithermes.js +8 -0
  531. package/package.json +58 -0
  532. package/readme-assets/badge-license.svg +1 -0
  533. package/readme-assets/badge-version.svg +1 -0
  534. package/readme-assets/cover.webp +0 -0
  535. package/readme-assets/lithermes-clay-icon.png +0 -0
  536. package/readme-assets/lithermes-wordmark.svg +5 -0
  537. package/src/cli.js +396 -0
  538. package/src/lib/autoUpdate.js +4 -0
  539. package/src/lib/canonicalCorpus.js +436 -0
  540. package/src/lib/check.js +200 -0
  541. package/src/lib/config.js +229 -0
  542. package/src/lib/files.js +126 -0
  543. package/src/lib/hermesDiscovery.js +122 -0
  544. package/src/lib/hud.js +135 -0
  545. package/src/lib/install.js +559 -0
  546. package/src/lib/litMark.js +68 -0
  547. package/src/lib/modelConfig.js +431 -0
  548. package/src/lib/modelConfigBoundary.js +206 -0
  549. package/src/lib/modelPrompt.js +201 -0
  550. package/src/lib/modelRoutePolicy.js +379 -0
  551. package/src/lib/patch.js +153 -0
  552. package/src/lib/skillLoop.js +62 -0
  553. package/src/lib/skillPayload.js +306 -0
  554. package/src/lib/skins.js +274 -0
  555. package/src/lib/spinner.js +193 -0
  556. package/src/lib/updateNotifier.js +1133 -0
  557. package/src/lib/updateNotifierWorker.js +9 -0
@@ -0,0 +1,559 @@
1
+ const fs = require("node:fs");
2
+ const path = require("node:path");
3
+ const {
4
+ applyModelConfigPlan,
5
+ configHasLitHermes,
6
+ disableLitHermesConfig,
7
+ enableLitHermesConfig,
8
+ inspectHermesCapabilities,
9
+ planModelConfig,
10
+ readConfig,
11
+ setTuiAgentsNudgeConfig,
12
+ revalidateModelConfigPlan,
13
+ writeConfig,
14
+ } = require("./config");
15
+ const { copyTree, removeEmptyDirs, sha256, writeFileAtomic } = require("./files");
16
+ const { assertStateParent, assertPluginParent, defaultHermesHome, defaultHermesRepo, detectHermesRuntimeRepo, detectHermesVersion, ensureHermesHome, inspectHermesHostCapabilities, LitHermesError } = require("./hermesDiscovery");
17
+ const { patchInstalledHermes, rollbackPatches } = require("./patch");
18
+ const {
19
+ formatManagedRoute,
20
+ managedRequest,
21
+ missingCredentialWarning,
22
+ unavailableReviewerRouteName,
23
+ unavailableReviewerRoutes,
24
+ unavailableTuiRouteVisibility,
25
+ } = require("./modelRoutePolicy");
26
+ const { installSkins } = require("./skins");
27
+
28
+ const packageRoot = path.resolve(__dirname, "..", "..");
29
+ const assetRoot = path.join(packageRoot, "assets", "lithermes-plugin");
30
+ const LEGACY_VENDOR_DIRS = new Map([
31
+ ["vendor/022_handoff", "vendor/handoff"],
32
+ ["vendor/045_scientific-visualization", "vendor/scientific-visualization"],
33
+ ]);
34
+
35
+ function manifestPath(hermesHome) {
36
+ return path.join(hermesHome, "lithermes", "install-manifest.json");
37
+ }
38
+
39
+ function pluginDest(hermesHome) {
40
+ return path.join(hermesHome, "plugins", "lithermes");
41
+ }
42
+
43
+ function withLock(hermesHome, fn, expectedState) {
44
+ assertStateParent(hermesHome, expectedState);
45
+ const lock = path.join(hermesHome, "lithermes", "install.lock");
46
+ fs.mkdirSync(path.dirname(lock), { recursive: true });
47
+ const state = assertStateParent(hermesHome, expectedState || undefined);
48
+ const checkState = () => assertStateParent(hermesHome, state);
49
+ let fd;
50
+ let lockStat;
51
+ try {
52
+ try {
53
+ checkState();
54
+ fd = fs.openSync(lock, "wx");
55
+ lockStat = fs.fstatSync(fd);
56
+ fs.writeFileSync(fd, String(process.pid));
57
+ } catch (error) {
58
+ if (error.code === "EEXIST") throw new LitHermesError(`LitHermes install lock already exists at ${lock}`, 3);
59
+ throw error;
60
+ }
61
+ checkState();
62
+ const result = fn(checkState);
63
+ checkState();
64
+ return result;
65
+ } finally {
66
+ if (fd !== undefined) fs.closeSync(fd);
67
+ try {
68
+ checkState();
69
+ const current = fs.lstatSync(lock, { throwIfNoEntry: false });
70
+ if (current?.isFile() && lockStat && current.dev === lockStat.dev && current.ino === lockStat.ino) fs.unlinkSync(lock);
71
+ } catch {
72
+ // A moved state directory retains its lock for manual recovery.
73
+ }
74
+ }
75
+ }
76
+
77
+ function loadManifest(hermesHome) {
78
+ const state = assertStateParent(hermesHome);
79
+ const file = manifestPath(hermesHome);
80
+ const before = fs.lstatSync(file, { throwIfNoEntry: false });
81
+ if (!before) return null;
82
+ if (!before.isFile()) throw new LitHermesError(`Unsafe install manifest at ${file}.`, 5);
83
+ const fd = fs.openSync(file, fs.constants.O_RDONLY | (fs.constants.O_NOFOLLOW || 0) | (fs.constants.O_NONBLOCK || 0));
84
+ try {
85
+ const opened = fs.fstatSync(fd);
86
+ if (!opened.isFile() || opened.dev !== before.dev || opened.ino !== before.ino) throw new LitHermesError(`Replaced install manifest at ${file}.`, 5);
87
+ assertStateParent(hermesHome, state);
88
+ const text = fs.readFileSync(fd, "utf8");
89
+ assertStateParent(hermesHome, state);
90
+ const after = fs.lstatSync(file);
91
+ if (!after.isFile() || after.dev !== before.dev || after.ino !== before.ino) throw new LitHermesError(`Replaced install manifest at ${file}.`, 5);
92
+ return JSON.parse(text);
93
+ } finally {
94
+ fs.closeSync(fd);
95
+ }
96
+ }
97
+
98
+ function validManifestFiles(manifest) {
99
+ return Array.isArray(manifest?.files) && manifest.files.every((entry) =>
100
+ typeof entry?.path === "string" && entry.path.length > 0
101
+ && !path.isAbsolute(entry.path) && !entry.path.includes("\\") && !entry.path.includes("\0")
102
+ && entry.path.split("/").every((part) => part && part !== "." && part !== "..")
103
+ && /^[a-f0-9]{64}$/.test(entry.sha256))
104
+ && new Set(manifest.files.map((entry) => entry.path)).size === manifest.files.length;
105
+ }
106
+
107
+ function installedMatchesManifest(hermesHome, manifest, caches = []) {
108
+ if (!validManifestFiles(manifest)) return false;
109
+ const dest = pluginDest(hermesHome);
110
+ const owned = new Map(manifest.files.map((entry) => [entry.path, entry.sha256]));
111
+ let matched = 0;
112
+ const matches = (dir) => fs.readdirSync(dir, { withFileTypes: true }).every((entry) => {
113
+ const file = path.join(dir, entry.name);
114
+ const relative = path.relative(dest, file).split(path.sep).join("/");
115
+ if (entry.isDirectory()) {
116
+ if (entry.name === "__pycache__") {
117
+ const entries = fs.readdirSync(file, { withFileTypes: true });
118
+ if (!entries.length || !entries.every((cache) => {
119
+ const name = /^([^.]+)\.[a-zA-Z][a-zA-Z0-9_-]*(?:\.opt-[0-9]+)?\.pyc$/.exec(cache.name);
120
+ const source = name && path.relative(dest, path.join(dir, `${name[1]}.py`)).split(path.sep).join("/");
121
+ return cache.isFile() && name && owned.has(source);
122
+ })) return false;
123
+ const stat = fs.lstatSync(file);
124
+ caches.push({ path: relative, dev: stat.dev, ino: stat.ino, files: entries.map((cache) => ({
125
+ path: cache.name, sha256: sha256(path.join(file, cache.name)),
126
+ })) });
127
+ return true;
128
+ }
129
+ return [...owned.keys()].some((name) => name.startsWith(`${relative}/`)) && matches(file);
130
+ }
131
+ if (!entry.isFile() || !owned.has(relative) || sha256(file) !== owned.get(relative)) return false;
132
+ matched += 1;
133
+ return true;
134
+ });
135
+ return fs.lstatSync(dest).isDirectory() && matches(dest) && matched === owned.size;
136
+ }
137
+
138
+ // A pre-canonical installation may be replaced only when both numbered vendor
139
+ // roots are ordinary directories whose complete tree is already covered by the
140
+ // install receipt. This reuses the existing manifest guard, while explicitly
141
+ // rejecting mixed old/new layouts before the destination is removed.
142
+ function validateLegacyVendorMigration(hermesHome, manifest) {
143
+ const dest = pluginDest(hermesHome);
144
+ let foundLegacy = false;
145
+ for (const [legacy, canonical] of LEGACY_VENDOR_DIRS) {
146
+ const legacyPath = path.join(dest, legacy);
147
+ const legacyStat = fs.lstatSync(legacyPath, { throwIfNoEntry: false });
148
+ if (!legacyStat) continue;
149
+ foundLegacy = true;
150
+ if (!legacyStat.isDirectory() || legacyStat.isSymbolicLink()) {
151
+ throw new LitHermesError(`Unsafe legacy vendor path at ${legacyPath}; refusing migration.`, 5);
152
+ }
153
+ if (fs.lstatSync(path.join(dest, canonical), { throwIfNoEntry: false })) {
154
+ throw new LitHermesError(`Mixed legacy and canonical vendor paths at ${dest}; refusing migration.`, 5);
155
+ }
156
+ }
157
+ if (!foundLegacy) return false;
158
+ if (!installedMatchesManifest(hermesHome, manifest)) {
159
+ throw new LitHermesError("Legacy vendor payload is not pristine and manifest-owned; refusing migration.", 5);
160
+ }
161
+ return true;
162
+ }
163
+
164
+ function retainPythonCaches(hermesHome, manifest, caches) {
165
+ const parent = path.join(hermesHome, "lithermes");
166
+ const parentStat = assertStateParent(hermesHome);
167
+ const current = [];
168
+ if (!installedMatchesManifest(hermesHome, manifest, current) || JSON.stringify(current) !== JSON.stringify(caches)) {
169
+ throw new LitHermesError("Installed payload or Python cache changed before retention; refusing replacement.", 5);
170
+ }
171
+ const backup = fs.mkdtempSync(path.join(parent, "retained-python-cache-"));
172
+ const backupStat = fs.lstatSync(backup);
173
+ const safeBackup = () => {
174
+ const nowParent = fs.lstatSync(parent);
175
+ const nowBackup = fs.lstatSync(backup);
176
+ return nowParent.isDirectory() && nowParent.dev === parentStat.dev && nowParent.ino === parentStat.ino
177
+ && nowBackup.isDirectory() && nowBackup.dev === backupStat.dev && nowBackup.ino === backupStat.ino
178
+ && (nowBackup.mode & 0o077) === 0;
179
+ };
180
+ try {
181
+ if (path.dirname(backup) !== parent || !path.basename(backup).startsWith("retained-python-cache-")
182
+ || !safeBackup() || fs.readdirSync(backup).length) throw new Error("Unsafe Python cache backup destination");
183
+ writeFileAtomic(path.join(backup, "retention.json"), JSON.stringify({ pluginPath: pluginDest(hermesHome), caches }, null, 2), "utf8");
184
+ for (const cache of caches) {
185
+ const source = path.join(pluginDest(hermesHome), cache.path);
186
+ const stat = fs.lstatSync(source);
187
+ if (!safeBackup() || !stat.isDirectory() || stat.dev !== cache.dev || stat.ino !== cache.ino
188
+ || fs.readdirSync(source).length !== cache.files.length
189
+ || !cache.files.every((file) => {
190
+ const cached = path.join(source, file.path);
191
+ return fs.lstatSync(cached).isFile() && sha256(cached) === file.sha256;
192
+ })) throw new Error("Python cache changed during retention");
193
+ const target = path.join(backup, cache.path);
194
+ let ancestor = backup;
195
+ for (const part of cache.path.split("/").slice(0, -1)) {
196
+ ancestor = path.join(ancestor, part);
197
+ if (!fs.lstatSync(ancestor, { throwIfNoEntry: false })) fs.mkdirSync(ancestor, { mode: 0o700 });
198
+ if (!safeBackup() || !fs.lstatSync(ancestor).isDirectory()) throw new Error("Unsafe Python cache backup ancestor");
199
+ }
200
+ if (!safeBackup() || fs.lstatSync(target, { throwIfNoEntry: false })) throw new Error("Python cache backup target already exists");
201
+ fs.renameSync(source, target);
202
+ }
203
+ return backup;
204
+ } catch (error) {
205
+ throw new LitHermesError(`${error.message}\nRetained Python cache backup: ${backup}`, 5);
206
+ }
207
+ }
208
+
209
+ function isInstalledRegularFile(dest, relative) {
210
+ let file = dest;
211
+ if (!fs.lstatSync(file, { throwIfNoEntry: false })?.isDirectory()) return false;
212
+ const parts = relative.split("/");
213
+ return parts.every((part, index) => {
214
+ file = path.join(file, part);
215
+ const stat = fs.lstatSync(file, { throwIfNoEntry: false });
216
+ return index === parts.length - 1 ? stat?.isFile() : stat?.isDirectory();
217
+ });
218
+ }
219
+
220
+ // Version-aware install status (NOT a manifest-integrity check): distinguish a
221
+ // fresh install, a same-version reinstall, and a real upgrade so the message
222
+ // never claims "already up to date" while actually replacing an older version.
223
+ function installStatusLine(installedVersion, packageVersion) {
224
+ if (!installedVersion) return `Installed LitHermes ${packageVersion}`;
225
+ if (installedVersion === packageVersion) return `LitHermes already up to date (${packageVersion})`;
226
+ return `Upgraded LitHermes ${installedVersion} → ${packageVersion}`;
227
+ }
228
+
229
+ function capabilityLines(plan, { dryRun = false } = {}) {
230
+ const {
231
+ autoCompaction,
232
+ concurrency,
233
+ delegationRoute,
234
+ leadRoute,
235
+ modelSafety,
236
+ ordinaryWorkerRoute,
237
+ recursion,
238
+ reviewerRoutes,
239
+ runtime,
240
+ tuiRouteVisibility,
241
+ } = plan.capabilities;
242
+ const request = plan.request || managedRequest();
243
+ const auto = autoCompaction.status === "hard"
244
+ ? `hard (${autoCompaction.limit} tokens)`
245
+ : `unavailable (${autoCompaction.reason.replace(/^Hermes 0\.17\.0 exposes /, "")})`;
246
+ const sync = concurrency.status === "hard"
247
+ ? `hard (per batch ${concurrency.limit}; async batches ${concurrency.asyncBatchLimit}; potential children ${concurrency.potentialChildCeiling})`
248
+ : `${concurrency.status} (${concurrency.reason})`;
249
+ const nesting = recursion.status === "hard"
250
+ ? recursion.flatBy === "depth"
251
+ ? `hard (depth ${recursion.limit}, flat)`
252
+ : `hard (configured depth ${recursion.limit}, flat via orchestrator kill switch)`
253
+ : `${recursion.status} (${recursion.reason})`;
254
+ const wire = runtime.status === "hard"
255
+ ? `hard (${runtime.provider} ${runtime.apiMode})`
256
+ : `${runtime.status} (${runtime.reason})`;
257
+ const routeLine = (label, route) => route.status === "configured"
258
+ ? `${label}: configured (${route.model}, effort ${route.effort})`
259
+ : `${label}: ${route.status} (${route.reason})`;
260
+ const routeLines = dryRun
261
+ ? [
262
+ `lead route: requested (${request.model}, effort ${request.effort}; unapplied)`,
263
+ `ordinary worker route: requested (${request.childModel}, effort ${request.childEffort}; unapplied)`,
264
+ `${unavailableReviewerRouteName()} route: unavailable (${unavailableReviewerRoutes().reason})`,
265
+ `litwork-reviewer route: unavailable (${unavailableReviewerRoutes().reason})`,
266
+ `TUI route visibility: unavailable (${unavailableTuiRouteVisibility().reason})`,
267
+ ]
268
+ : [
269
+ routeLine("lead route", leadRoute),
270
+ routeLine("ordinary worker route", ordinaryWorkerRoute),
271
+ routeLine(`${unavailableReviewerRouteName()} route`, reviewerRoutes),
272
+ routeLine("litwork-reviewer route", reviewerRoutes),
273
+ routeLine("TUI route visibility", tuiRouteVisibility),
274
+ ];
275
+ return [
276
+ `auto-compaction: ${auto}`,
277
+ `concurrency: ${sync}`,
278
+ `recursion: ${nesting}`,
279
+ `model route safety: ${modelSafety.status}${modelSafety.code ? ` (${modelSafety.code}; ${modelSafety.reason})` : ` (${modelSafety.reason})`}`,
280
+ `runtime: ${wire}`,
281
+ `global child route: ${formatManagedRoute(delegationRoute)}`,
282
+ ...routeLines,
283
+ ];
284
+ }
285
+
286
+ // Installer flags → managedRequest options (contract §Non-interactive defaults).
287
+ function routeOptions(flags = {}) {
288
+ return {
289
+ childEffort: flags["child-effort"],
290
+ childModel: flags["child-model"],
291
+ childProvider: flags["child-provider"],
292
+ effort: flags.effort,
293
+ model: flags.model,
294
+ provider: flags.provider,
295
+ };
296
+ }
297
+
298
+ // Tells the CLI whether the model prompts apply: only a fresh/unconfigured
299
+ // config or an explicit --reconfigure-model may rewrite the managed route.
300
+ // Read-only — nothing may touch the disk before the summary-card consent.
301
+ function previewModelRoute(flags = {}) {
302
+ const hermesHome = defaultHermesHome(flags);
303
+ assertStateParent(hermesHome);
304
+ const hermesRepo = defaultHermesRepo(flags, hermesHome);
305
+ const plan = planModelConfig(readConfig(hermesHome), {
306
+ ...routeOptions(flags),
307
+ hostCapabilities: inspectHermesHostCapabilities(hermesRepo || detectHermesRuntimeRepo()),
308
+ hostVersion: detectHermesVersion(),
309
+ reconfigure: Boolean(flags["reconfigure-model"]),
310
+ });
311
+ return {
312
+ action: plan.action,
313
+ configPath: path.join(hermesHome, "config.yaml"),
314
+ reason: plan.reason,
315
+ request: plan.request || null,
316
+ };
317
+ }
318
+
319
+ function installLitHermes(flags = {}) {
320
+ const dryRun = Boolean(flags["dry-run"]);
321
+ const homeInfo = dryRun
322
+ ? (() => {
323
+ const hermesHome = defaultHermesHome(flags);
324
+ return { hermesHome, hermesRepo: defaultHermesRepo(flags, hermesHome) };
325
+ })()
326
+ : ensureHermesHome(flags, { forInstall: true });
327
+ const { hermesHome, hermesRepo } = homeInfo;
328
+ const state = assertStateParent(hermesHome);
329
+ const dest = pluginDest(hermesHome);
330
+ const onProgress = typeof flags.onProgress === "function" ? flags.onProgress : () => {};
331
+ const beforeConfig = readConfig(hermesHome);
332
+ const capabilityRepo = hermesRepo || (dryRun ? null : detectHermesRuntimeRepo());
333
+ const modelPlan = planModelConfig(beforeConfig, {
334
+ ...routeOptions(flags),
335
+ hostCapabilities: inspectHermesHostCapabilities(capabilityRepo),
336
+ hostVersion: dryRun ? "" : detectHermesVersion(),
337
+ reconfigure: Boolean(flags["reconfigure-model"]),
338
+ });
339
+ if (modelPlan.action === "stop") {
340
+ throw new LitHermesError(
341
+ `${modelPlan.stop.code}: ${modelPlan.reason}; update the existing route with \`hermes model\` before installing.`,
342
+ 10,
343
+ );
344
+ }
345
+ if (dryRun) {
346
+ const selectedModel = modelPlan.request?.model || "gpt-6-astra";
347
+ const selectedEffort = modelPlan.request?.effort || "xhigh";
348
+ return {
349
+ message: [
350
+ "DRY RUN: would install LitHermes",
351
+ `plugin: ${dest}`,
352
+ `config: ${path.join(hermesHome, "config.yaml")}`,
353
+ `manifest: ${manifestPath(hermesHome)}`,
354
+ "Hermes CLI discovery: skipped (dry-run does not execute Hermes)",
355
+ `model config: ${modelPlan.action === "preserve" ? "preserved" : modelPlan.action}`,
356
+ ...(modelPlan.action === "write"
357
+ ? [`model: ${selectedModel}`, `effort: ${selectedEffort}`]
358
+ : [
359
+ `requested model (unapplied): ${selectedModel}`,
360
+ `requested effort (unapplied): ${selectedEffort}`,
361
+ ]),
362
+ ...(modelPlan.action === "fallback" ? [`reason: ${modelPlan.reason}`, `fallback: ${modelPlan.fallbackCommand}`] : []),
363
+ ...capabilityLines(modelPlan, { dryRun: true }),
364
+ ].join("\n"),
365
+ };
366
+ }
367
+ if (!flags.yes) {
368
+ throw new LitHermesError("Refusing to mutate Hermes config without --yes. Re-run with --dry-run to inspect changes.", 4);
369
+ }
370
+ onProgress("Preparing Hermes config");
371
+ let retainedPythonCache = null;
372
+ try {
373
+ return withLock(hermesHome, (checkState) => {
374
+ assertPluginParent(hermesHome);
375
+ onProgress("Inspecting existing plugin");
376
+ checkState();
377
+ const existingManifest = loadManifest(hermesHome);
378
+ const packageVersion = require(path.join(packageRoot, "package.json")).version;
379
+ const destinationExists = Boolean(fs.lstatSync(dest, { throwIfNoEntry: false }));
380
+ const installedVersion = destinationExists && existingManifest ? existingManifest.version : null;
381
+ const caches = [];
382
+ if (destinationExists && !installedMatchesManifest(hermesHome, existingManifest, caches) && !flags.force) {
383
+ throw new LitHermesError(`Existing LitHermes plugin at ${dest} is not manifest-owned. Use --force after backing it up.`, 5);
384
+ }
385
+ if (destinationExists && existingManifest && !flags.force) validateLegacyVendorMigration(hermesHome, existingManifest);
386
+ onProgress("Copying LitHermes payload");
387
+ checkState();
388
+ if (!flags.force && destinationExists) {
389
+ if (caches.length) retainedPythonCache = retainPythonCaches(hermesHome, existingManifest, caches);
390
+ assertPluginParent(hermesHome);
391
+ const remainingCaches = [];
392
+ if (!installedMatchesManifest(hermesHome, existingManifest, remainingCaches) || remainingCaches.length) {
393
+ throw new LitHermesError("Installed payload changed before replacement; refusing to remove files.", 5);
394
+ }
395
+ }
396
+ // Replacing the manifest-owned tree also migrates renamed skills: old
397
+ // directories disappear and the new inventory becomes the install receipt.
398
+ checkState();
399
+ assertPluginParent(hermesHome);
400
+ fs.rmSync(dest, { recursive: true, force: true });
401
+ const files = copyTree(assetRoot, dest);
402
+ onProgress("Writing Hermes config");
403
+ checkState();
404
+ let afterConfig = beforeConfig;
405
+ let configAddedLitHermes = false;
406
+ let effectiveModelAction = modelPlan.action;
407
+ let effectiveCapabilities = modelPlan.capabilities;
408
+ let modelReceipt = { backupPath: null, written: false };
409
+ if (modelPlan.action === "write") {
410
+ const plannedConfig = enableLitHermesConfig(modelPlan.text);
411
+ modelReceipt = applyModelConfigPlan(hermesHome, { ...modelPlan, text: plannedConfig });
412
+ if (modelReceipt.written) {
413
+ afterConfig = plannedConfig;
414
+ configAddedLitHermes = !configHasLitHermes(beforeConfig) && configHasLitHermes(afterConfig);
415
+ } else if (modelReceipt.drifted) {
416
+ afterConfig = readConfig(hermesHome);
417
+ effectiveModelAction = "aborted";
418
+ effectiveCapabilities = inspectHermesCapabilities(afterConfig);
419
+ }
420
+ } else if (modelPlan.action === "preserve") {
421
+ const validation = revalidateModelConfigPlan(hermesHome, modelPlan);
422
+ if (validation.ok) {
423
+ afterConfig = enableLitHermesConfig(validation.current);
424
+ if (afterConfig !== validation.current) {
425
+ writeConfig(hermesHome, afterConfig);
426
+ configAddedLitHermes = true;
427
+ }
428
+ } else {
429
+ afterConfig = validation.current;
430
+ modelReceipt = { backupPath: null, drifted: true, reason: validation.reason, written: false };
431
+ effectiveModelAction = "aborted";
432
+ effectiveCapabilities = inspectHermesCapabilities(afterConfig);
433
+ }
434
+ }
435
+ if (!configAddedLitHermes && !configHasLitHermes(afterConfig)) {
436
+ afterConfig = enableLitHermesConfig(afterConfig);
437
+ writeConfig(hermesHome, afterConfig);
438
+ configAddedLitHermes = true;
439
+ }
440
+ // Managed helper-visibility key, written only alongside a config write this
441
+ // install already made — a preserved user config stays byte-identical
442
+ // (Hermes defaults display.tui_agents_nudge to true anyway).
443
+ if (configAddedLitHermes || (modelPlan.action === "write" && modelReceipt.written)) {
444
+ const nudgedConfig = setTuiAgentsNudgeConfig(afterConfig);
445
+ if (nudgedConfig !== afterConfig) {
446
+ afterConfig = nudgedConfig;
447
+ writeConfig(hermesHome, afterConfig);
448
+ }
449
+ }
450
+ onProgress("Installing HUD skins");
451
+ checkState();
452
+ let skinFiles = [];
453
+ try {
454
+ skinFiles = installSkins(hermesHome);
455
+ } catch {
456
+ // HUD skins are optional polish; never fail the install over them.
457
+ }
458
+ onProgress("Recording install manifest");
459
+ checkState();
460
+ const manifest = {
461
+ version: packageVersion,
462
+ installedAt: new Date().toISOString(),
463
+ pluginPath: dest,
464
+ configPath: path.join(hermesHome, "config.yaml"),
465
+ files,
466
+ configAddedLitHermes,
467
+ modelConfigAction: effectiveModelAction,
468
+ modelConfigReason: modelPlan.reason,
469
+ ...(retainedPythonCache ? { retainedPythonCache } : {}),
470
+ };
471
+ fs.mkdirSync(path.dirname(manifestPath(hermesHome)), { recursive: true });
472
+ writeFileAtomic(manifestPath(hermesHome), JSON.stringify(manifest, null, 2), "utf8");
473
+ let patchResult = null;
474
+ let patchWarning = null;
475
+ const shouldPatch = Boolean(flags["patch-installed-hermes"] || (!flags["no-patch-installed-hermes"] && hermesRepo));
476
+ if (shouldPatch) {
477
+ onProgress("Checking Hermes compatibility patches");
478
+ checkState();
479
+ try {
480
+ patchResult = patchInstalledHermes({ hermesHome, hermesRepo, force: flags.force });
481
+ } catch (error) {
482
+ if (flags["patch-installed-hermes"]) throw error;
483
+ patchWarning = error.message;
484
+ }
485
+ }
486
+ const lines = [
487
+ installStatusLine(installedVersion, packageVersion),
488
+ `plugin: ${dest}`,
489
+ ...(retainedPythonCache ? [`Retained Python cache backup: ${retainedPythonCache}`] : []),
490
+ `model config: ${effectiveModelAction === "write" ? "updated" : effectiveModelAction === "preserve" ? "preserved" : effectiveModelAction}`,
491
+ ...(modelReceipt.backupPath ? [`model backup: ${modelReceipt.backupPath}`] : []),
492
+ ...(modelReceipt.drifted ? [`model write: aborted (${modelReceipt.reason})`] : []),
493
+ ...(modelPlan.action === "fallback" ? [
494
+ `model reason: ${modelPlan.reason}`,
495
+ `model fallback: ${modelPlan.fallbackCommand}`,
496
+ ...(modelPlan.credentialKey
497
+ ? [`credential guard: ${modelPlan.credentialKey} detected; use \`hermes model\` to manage it; installer left config untouched`]
498
+ : []),
499
+ ] : []),
500
+ ...capabilityLines({ capabilities: effectiveCapabilities }),
501
+ ];
502
+ if (patchResult) lines.push(`patches: ${patchResult.changed.length ? patchResult.changed.join(", ") : "none needed"}`);
503
+ if (patchWarning) lines.push(`patches: skipped (${patchWarning})`);
504
+ const credentialWarning = modelPlan.request && effectiveModelAction === "write"
505
+ ? missingCredentialWarning(modelPlan.request, process.env)
506
+ : null;
507
+ if (credentialWarning) lines.push(`warning: ${credentialWarning}`);
508
+ if (skinFiles.length) lines.push(`HUD skins: ${skinFiles.length} accents installed — pick one with \`npx --package @litfamily/lithermes -- lithermes hud <accent>\``);
509
+ lines.push("Restart any running Hermes gateway to load new plugins.");
510
+ return { message: lines.join("\n") };
511
+ }, state);
512
+ } catch (error) {
513
+ if (retainedPythonCache) error.message += `\nRetained Python cache backup: ${retainedPythonCache}`;
514
+ throw error;
515
+ }
516
+ }
517
+
518
+ function uninstallLitHermes(flags = {}) {
519
+ const { hermesHome } = ensureHermesHome(flags);
520
+ const state = assertStateParent(hermesHome);
521
+ if (!flags.yes) {
522
+ throw new LitHermesError("Refusing to uninstall without --yes.", 4);
523
+ }
524
+ return withLock(hermesHome, (checkState) => {
525
+ assertPluginParent(hermesHome);
526
+ const rollback = flags["rollback-patches"] ? rollbackPatches({ hermesHome }) : null;
527
+ const manifest = loadManifest(hermesHome);
528
+ checkState();
529
+ if (!manifest) return { message: rollback ? `LitHermes is not installed by this installer.\n${rollback.message}` : "LitHermes is not installed by this installer." };
530
+ if (!validManifestFiles(manifest)) throw new LitHermesError("Invalid LitHermes install manifest; refusing to remove files.", 5);
531
+ const dest = pluginDest(hermesHome);
532
+ for (const entry of [...manifest.files].reverse()) {
533
+ checkState();
534
+ assertPluginParent(hermesHome);
535
+ const file = path.join(dest, entry.path);
536
+ if (isInstalledRegularFile(dest, entry.path) && sha256(file) === entry.sha256) {
537
+ fs.unlinkSync(file);
538
+ removeEmptyDirs(path.dirname(file), dest);
539
+ }
540
+ }
541
+ if (fs.lstatSync(dest, { throwIfNoEntry: false })?.isDirectory() && fs.readdirSync(dest).length === 0) fs.rmdirSync(dest);
542
+ checkState();
543
+ writeConfig(hermesHome, disableLitHermesConfig(readConfig(hermesHome)));
544
+ checkState();
545
+ fs.unlinkSync(manifestPath(hermesHome));
546
+ return { message: rollback ? `Uninstalled LitHermes\n${rollback.message}` : "Uninstalled LitHermes" };
547
+ }, state);
548
+ }
549
+
550
+ module.exports = {
551
+ assetRoot,
552
+ installLitHermes,
553
+ installStatusLine,
554
+ loadManifest,
555
+ manifestPath,
556
+ pluginDest,
557
+ previewModelRoute,
558
+ uninstallLitHermes,
559
+ };
@@ -0,0 +1,68 @@
1
+ // Approved Ignition B geometry and per-cell colors are local to this package.
2
+ const data = require("../../assets/lithermes-plugin/lit_mark_rows.json");
3
+ const standard = Object.freeze(data.standard.map((row) => row.text));
4
+ const banner = Object.freeze(data.banner.map((row) => row.text));
5
+ const micro = Object.freeze(data.micro.map((row) => row.text));
6
+ const GLYPHS = new Set("█▓▀▄▌▐▖▗▘▝▙▛▜▟▚▞");
7
+ const INDEXED = Object.freeze({ "#FF6337": 203, "#D7F75B": 191, "#F2EFDF": 230 });
8
+
9
+ function lockup(productName, rows = standard) {
10
+ if (typeof productName !== "string" || !/^[a-zA-Z0-9 .·_-]+$/.test(productName)) {
11
+ throw new TypeError("product name must be a plain single line");
12
+ }
13
+ // Preserve the native eight-space gap after the full mark envelope.
14
+ const column = Math.max(...rows.map((row) => row.length)) + 8;
15
+ const middle = Math.floor(rows.length / 2);
16
+ return rows.map((row, i) => i === middle ? row.padEnd(column) + productName : row);
17
+ }
18
+
19
+ function cellsFor(rows) {
20
+ return Object.values(data).find((cells) => cells.length === rows.length
21
+ && cells.every((cell, i) => rows[i].startsWith(cell.text)));
22
+ }
23
+
24
+ function colorize(rows, { mode = "none" } = {}) {
25
+ if (!["none", "256", "truecolor"].includes(mode)) throw new TypeError("invalid color mode");
26
+ if (mode === "none") return [...rows];
27
+ const cells = cellsFor(rows);
28
+ return rows.map((row, i) => [...row].map((ch, column) => {
29
+ if (!GLYPHS.has(ch)) return ch;
30
+ const hex = cells ? cells[i].colors[column] : "#F2EFDF";
31
+ if (!hex) return ch;
32
+ const ink = mode === "256" ? `38;5;${INDEXED[hex]}`
33
+ : `38;2;${[1, 3, 5].map((offset) => parseInt(hex.slice(offset, offset + 2), 16)).join(";")}`;
34
+ return `\x1b[${ink}m${ch}\x1b[0m`;
35
+ }).join(""));
36
+ }
37
+
38
+ function utf8Terminal(env = process.env) {
39
+ const locale = env.LC_ALL || env.LC_CTYPE || env.LANG || "";
40
+ return env.TERM !== "dumb" && (!locale || /utf-?8/i.test(locale));
41
+ }
42
+
43
+ function colorMode({ stream = process.stdout, env = process.env, json = false } = {}) {
44
+ if (json || "NO_COLOR" in env || "CI" in env || !stream?.isTTY || !utf8Terminal(env)) return "none";
45
+ return /truecolor|24bit/i.test(env.COLORTERM || "") || /direct/i.test(env.TERM || "") ? "truecolor" : "256";
46
+ }
47
+
48
+ function render(rows, options = {}) {
49
+ if (!utf8Terminal(options.env)) return ["LIT"];
50
+ const detected = colorMode(options);
51
+ return colorize(rows, { ...options, mode: detected === "none" ? "none" : options.mode || detected });
52
+ }
53
+
54
+ // Hermes' native branding surfaces consume Rich markup, not raw ANSI escapes.
55
+ function richLogo(rows) {
56
+ return rows.map((row) => [...row.text].map((ch, column) =>
57
+ row.colors[column] ? `[${row.colors[column]}]${ch}[/]` : ch).join(""));
58
+ }
59
+
60
+ function skinLogo() {
61
+ return richLogo(data.standard);
62
+ }
63
+
64
+ function microLogo() {
65
+ return richLogo(data.micro);
66
+ }
67
+
68
+ module.exports = { standard, banner, micro, lockup, colorize, colorMode, utf8Terminal, render, skinLogo, microLogo };