@litfamily/litopencode 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 (690) hide show
  1. package/.gitattributes +8 -0
  2. package/ATTRIBUTION.md +56 -0
  3. package/CHANGELOG.md +267 -0
  4. package/CODE_OF_CONDUCT.md +30 -0
  5. package/CONTRIBUTING.md +82 -0
  6. package/LICENSE +21 -0
  7. package/README-Ko-KR.md +252 -0
  8. package/README.md +252 -0
  9. package/SECURITY.md +36 -0
  10. package/SUPPORT.md +37 -0
  11. package/bin/litopencode +3 -0
  12. package/bin/litopencode.cjs +10 -0
  13. package/dist/activation-managed-prompts.d.ts +2 -0
  14. package/dist/activation-managed-prompts.js +51 -0
  15. package/dist/activation-primary-prompts.d.ts +2 -0
  16. package/dist/activation-primary-prompts.js +176 -0
  17. package/dist/activation-probe.d.ts +3 -0
  18. package/dist/activation-probe.js +19 -0
  19. package/dist/activation-prompt-utils.d.ts +6 -0
  20. package/dist/activation-prompt-utils.js +36 -0
  21. package/dist/activation-routing.d.ts +5 -0
  22. package/dist/activation-routing.js +340 -0
  23. package/dist/activation-workflow-prompts.d.ts +26 -0
  24. package/dist/activation-workflow-prompts.js +295 -0
  25. package/dist/activation.d.ts +24 -0
  26. package/dist/activation.js +152 -0
  27. package/dist/agents/defaults.d.ts +15 -0
  28. package/dist/agents/defaults.js +112 -0
  29. package/dist/agents/registry.d.ts +65 -0
  30. package/dist/agents/registry.js +319 -0
  31. package/dist/agents/specialists.d.ts +49 -0
  32. package/dist/agents/specialists.js +307 -0
  33. package/dist/agents/types.d.ts +55 -0
  34. package/dist/agents/types.js +4 -0
  35. package/dist/agents.d.ts +4 -0
  36. package/dist/agents.js +3 -0
  37. package/dist/benchmark.d.ts +94 -0
  38. package/dist/benchmark.js +172 -0
  39. package/dist/bounded-authority-hooks.d.ts +19 -0
  40. package/dist/bounded-authority-hooks.js +157 -0
  41. package/dist/bounded-authority.d.ts +184 -0
  42. package/dist/bounded-authority.js +825 -0
  43. package/dist/cache-metrics.d.ts +54 -0
  44. package/dist/cache-metrics.js +81 -0
  45. package/dist/cli/args.d.ts +5 -0
  46. package/dist/cli/args.js +415 -0
  47. package/dist/cli/auto-update.d.ts +117 -0
  48. package/dist/cli/auto-update.js +604 -0
  49. package/dist/cli/command-alias-ownership.d.ts +2 -0
  50. package/dist/cli/command-alias-ownership.js +14 -0
  51. package/dist/cli/command-aliases.d.ts +12 -0
  52. package/dist/cli/command-aliases.js +112 -0
  53. package/dist/cli/doctor.d.ts +2 -0
  54. package/dist/cli/doctor.js +175 -0
  55. package/dist/cli/host-capabilities.d.ts +12 -0
  56. package/dist/cli/host-capabilities.js +25 -0
  57. package/dist/cli/host-limits.d.ts +21 -0
  58. package/dist/cli/host-limits.js +83 -0
  59. package/dist/cli/install-config.d.ts +13 -0
  60. package/dist/cli/install-config.js +201 -0
  61. package/dist/cli/install-report.d.ts +2 -0
  62. package/dist/cli/install-report.js +180 -0
  63. package/dist/cli/install-tui.d.ts +12 -0
  64. package/dist/cli/install-tui.js +174 -0
  65. package/dist/cli/install.d.ts +2 -0
  66. package/dist/cli/install.js +264 -0
  67. package/dist/cli/json.d.ts +4 -0
  68. package/dist/cli/json.js +31 -0
  69. package/dist/cli/loop.d.ts +3 -0
  70. package/dist/cli/loop.js +135 -0
  71. package/dist/cli/lsp-capability.d.ts +17 -0
  72. package/dist/cli/lsp-capability.js +92 -0
  73. package/dist/cli/managed-skill-assets.d.ts +23 -0
  74. package/dist/cli/managed-skill-assets.js +117 -0
  75. package/dist/cli/model-catalog.d.ts +21 -0
  76. package/dist/cli/model-catalog.js +107 -0
  77. package/dist/cli/model-policy.d.ts +3 -0
  78. package/dist/cli/model-policy.js +143 -0
  79. package/dist/cli/model-routing.d.ts +5 -0
  80. package/dist/cli/model-routing.js +208 -0
  81. package/dist/cli/native-canonical-backup.d.ts +9 -0
  82. package/dist/cli/native-canonical-backup.js +96 -0
  83. package/dist/cli/native-canonical-cache.d.ts +9 -0
  84. package/dist/cli/native-canonical-cache.js +37 -0
  85. package/dist/cli/native-skill-install.d.ts +2 -0
  86. package/dist/cli/native-skill-install.js +128 -0
  87. package/dist/cli/native-skill-integrity.d.ts +25 -0
  88. package/dist/cli/native-skill-integrity.js +178 -0
  89. package/dist/cli/native-skill-tree.d.ts +12 -0
  90. package/dist/cli/native-skill-tree.js +104 -0
  91. package/dist/cli/native-skills.d.ts +22 -0
  92. package/dist/cli/native-skills.js +105 -0
  93. package/dist/cli/plugin-mutation.d.ts +4 -0
  94. package/dist/cli/plugin-mutation.js +89 -0
  95. package/dist/cli/scientific-visualization-dependencies.d.ts +18 -0
  96. package/dist/cli/scientific-visualization-dependencies.js +91 -0
  97. package/dist/cli/skill-loop.d.ts +3 -0
  98. package/dist/cli/skill-loop.js +649 -0
  99. package/dist/cli/types.d.ts +188 -0
  100. package/dist/cli/types.js +1 -0
  101. package/dist/cli/update-check.d.ts +2 -0
  102. package/dist/cli/update-check.js +15 -0
  103. package/dist/cli/update-notifier.d.ts +70 -0
  104. package/dist/cli/update-notifier.js +717 -0
  105. package/dist/cli/vendor-path-migration.d.ts +9 -0
  106. package/dist/cli/vendor-path-migration.js +96 -0
  107. package/dist/cli.d.ts +7 -0
  108. package/dist/cli.js +250 -0
  109. package/dist/commands.d.ts +331 -0
  110. package/dist/commands.js +600 -0
  111. package/dist/config-parser.d.ts +5 -0
  112. package/dist/config-parser.js +274 -0
  113. package/dist/config.d.ts +72 -0
  114. package/dist/config.js +157 -0
  115. package/dist/deliverable-hedge-guard.d.ts +26 -0
  116. package/dist/deliverable-hedge-guard.js +302 -0
  117. package/dist/durable-plan.d.ts +23 -0
  118. package/dist/durable-plan.js +349 -0
  119. package/dist/features.d.ts +828 -0
  120. package/dist/features.js +1109 -0
  121. package/dist/hooks.d.ts +17 -0
  122. package/dist/hooks.js +83 -0
  123. package/dist/ignition.d.ts +14 -0
  124. package/dist/ignition.js +33 -0
  125. package/dist/index.d.ts +30 -0
  126. package/dist/index.js +30 -0
  127. package/dist/inert-data.d.ts +2 -0
  128. package/dist/inert-data.js +13 -0
  129. package/dist/knowledge.d.ts +98 -0
  130. package/dist/knowledge.js +961 -0
  131. package/dist/ledger.d.ts +181 -0
  132. package/dist/ledger.js +1179 -0
  133. package/dist/lit-fetch-classify.d.ts +8 -0
  134. package/dist/lit-fetch-classify.js +107 -0
  135. package/dist/lit-fetch-content.d.ts +2 -0
  136. package/dist/lit-fetch-content.js +43 -0
  137. package/dist/lit-fetch-http.d.ts +10 -0
  138. package/dist/lit-fetch-http.js +82 -0
  139. package/dist/lit-fetch-result.d.ts +2 -0
  140. package/dist/lit-fetch-result.js +65 -0
  141. package/dist/lit-fetch-ssrf.d.ts +9 -0
  142. package/dist/lit-fetch-ssrf.js +77 -0
  143. package/dist/lit-fetch-url.d.ts +3 -0
  144. package/dist/lit-fetch-url.js +28 -0
  145. package/dist/lit-fetch.d.ts +69 -0
  146. package/dist/lit-fetch.js +84 -0
  147. package/dist/lit-mark.d.ts +17 -0
  148. package/dist/lit-mark.js +129 -0
  149. package/dist/logger.d.ts +9 -0
  150. package/dist/logger.js +21 -0
  151. package/dist/model-route-policy.d.ts +25 -0
  152. package/dist/model-route-policy.js +129 -0
  153. package/dist/reader-facing-output.d.ts +3 -0
  154. package/dist/reader-facing-output.js +28 -0
  155. package/dist/rules/discovery.d.ts +36 -0
  156. package/dist/rules/discovery.js +270 -0
  157. package/dist/rules/engine.d.ts +43 -0
  158. package/dist/rules/engine.js +236 -0
  159. package/dist/rules/frontmatter.d.ts +16 -0
  160. package/dist/rules/frontmatter.js +179 -0
  161. package/dist/rules/glob.d.ts +12 -0
  162. package/dist/rules/glob.js +233 -0
  163. package/dist/rules/hooks.d.ts +25 -0
  164. package/dist/rules/hooks.js +75 -0
  165. package/dist/rules/output-style.d.ts +1 -0
  166. package/dist/rules/output-style.js +20 -0
  167. package/dist/scientific-visualization-banner.d.ts +1 -0
  168. package/dist/scientific-visualization-banner.js +2 -0
  169. package/dist/search-workflow-ideas.d.ts +67 -0
  170. package/dist/search-workflow-ideas.js +128 -0
  171. package/dist/secret-shapes.d.ts +9 -0
  172. package/dist/secret-shapes.js +63 -0
  173. package/dist/server.d.ts +6 -0
  174. package/dist/server.js +129 -0
  175. package/dist/session-lineage.d.ts +8 -0
  176. package/dist/session-lineage.js +12 -0
  177. package/dist/skill-loop/apply.d.ts +19 -0
  178. package/dist/skill-loop/apply.js +483 -0
  179. package/dist/skill-loop/config.d.ts +50 -0
  180. package/dist/skill-loop/config.js +215 -0
  181. package/dist/skill-loop/curator.d.ts +18 -0
  182. package/dist/skill-loop/curator.js +232 -0
  183. package/dist/skill-loop/ledger.d.ts +39 -0
  184. package/dist/skill-loop/ledger.js +344 -0
  185. package/dist/skill-loop/proposals.d.ts +48 -0
  186. package/dist/skill-loop/proposals.js +290 -0
  187. package/dist/skill-loop/storage.d.ts +72 -0
  188. package/dist/skill-loop/storage.js +817 -0
  189. package/dist/skill-loop/time.d.ts +2 -0
  190. package/dist/skill-loop/time.js +23 -0
  191. package/dist/skill-loop/transaction.d.ts +62 -0
  192. package/dist/skill-loop/transaction.js +836 -0
  193. package/dist/skill-loop/usage.d.ts +31 -0
  194. package/dist/skill-loop/usage.js +146 -0
  195. package/dist/skill-observer.d.ts +22 -0
  196. package/dist/skill-observer.js +1154 -0
  197. package/dist/skill-renames.d.ts +5 -0
  198. package/dist/skill-renames.js +8 -0
  199. package/dist/skills.d.ts +307 -0
  200. package/dist/skills.js +450 -0
  201. package/dist/stable-identity.d.ts +14 -0
  202. package/dist/stable-identity.js +15 -0
  203. package/dist/state.d.ts +25 -0
  204. package/dist/state.js +38 -0
  205. package/dist/strict-json.d.ts +2 -0
  206. package/dist/strict-json.js +94 -0
  207. package/dist/tool-guards.d.ts +34 -0
  208. package/dist/tool-guards.js +210 -0
  209. package/dist/tool-kit.d.ts +32 -0
  210. package/dist/tool-kit.js +75 -0
  211. package/dist/tools.d.ts +43 -0
  212. package/dist/tools.js +381 -0
  213. package/dist/uiux-visual-catalog.d.ts +50 -0
  214. package/dist/uiux-visual-catalog.js +103 -0
  215. package/dist/user-facing-markdown.d.ts +5 -0
  216. package/dist/user-facing-markdown.js +93 -0
  217. package/dist/workflow-families.d.ts +16 -0
  218. package/dist/workflow-families.js +95 -0
  219. package/docs/assets/cover.webp +0 -0
  220. package/docs/assets/litopencode-continuity-1600.webp +0 -0
  221. package/docs/assets/litopencode-ignition-1600.webp +0 -0
  222. package/docs/assets/readme/badge-license.svg +1 -0
  223. package/docs/assets/readme/badge-version.svg +1 -0
  224. package/docs/assets/readme/litopencode-clay-icon.png +0 -0
  225. package/docs/assets/readme/litopencode-wordmark.svg +5 -0
  226. package/docs/lit-mark.md +46 -0
  227. package/docs/migration.md +162 -0
  228. package/docs/privacy.md +82 -0
  229. package/docs/reference-Ko-KR.md +309 -0
  230. package/docs/reference.md +444 -0
  231. package/output-styles/asd-ste100-ko.md +41 -0
  232. package/output-styles/asd-ste100.md +40 -0
  233. package/output-styles/eli5-ko.md +13 -0
  234. package/output-styles/eli5.md +11 -0
  235. package/package.json +57 -0
  236. package/qa/fixtures/litfamily-harness-speed-v1.json +38 -0
  237. package/qa/harness-speed-contract.mjs +209 -0
  238. package/qa/harness-speed-v2-contract.mjs +213 -0
  239. package/qa/harness-speed-verdict.mjs +105 -0
  240. package/skills/agent-roster/SKILL.md +262 -0
  241. package/skills/autoconference/LICENSE +21 -0
  242. package/skills/autoconference/PROVENANCE.md +20 -0
  243. package/skills/autoconference/SKILL.md +125 -0
  244. package/skills/autoconference/assets/conference_template.md +76 -0
  245. package/skills/autoconference/assets/report_template.md +53 -0
  246. package/skills/autoconference/assets/synthesis_template.md +39 -0
  247. package/skills/autoconference/modes/analyze.md +255 -0
  248. package/skills/autoconference/modes/core.md +112 -0
  249. package/skills/autoconference/modes/debate.md +373 -0
  250. package/skills/autoconference/modes/plan.md +310 -0
  251. package/skills/autoconference/modes/resume.md +48 -0
  252. package/skills/autoconference/modes/ship.md +57 -0
  253. package/skills/autoconference/modes/survey.md +109 -0
  254. package/skills/autoconference/references/agent-prompts.md +134 -0
  255. package/skills/autoconference/references/conference-protocol.md +102 -0
  256. package/skills/autoconference/references/convergence-guide.md +167 -0
  257. package/skills/autoconference/references/core-principles.md +83 -0
  258. package/skills/autoconference/references/crash-recovery.md +104 -0
  259. package/skills/autoconference/references/results-logging.md +198 -0
  260. package/skills/autoconference/references/upstream-family-contract.md +130 -0
  261. package/skills/autoconference/references/visualization-guide.md +105 -0
  262. package/skills/autoconference/scripts/check_conference.sh +371 -0
  263. package/skills/autoconference/scripts/init_conference.py +625 -0
  264. package/skills/autoconference/scripts/style_presets.py +104 -0
  265. package/skills/autoresearch/LICENSE +21 -0
  266. package/skills/autoresearch/PROVENANCE.md +20 -0
  267. package/skills/autoresearch/SKILL.md +131 -0
  268. package/skills/autoresearch/assets/report_template.md +50 -0
  269. package/skills/autoresearch/assets/research_template.md +38 -0
  270. package/skills/autoresearch/assets/results_template.tsv +1 -0
  271. package/skills/autoresearch/modes/core.md +216 -0
  272. package/skills/autoresearch/modes/debug.md +235 -0
  273. package/skills/autoresearch/modes/fix.md +173 -0
  274. package/skills/autoresearch/modes/learn.md +91 -0
  275. package/skills/autoresearch/modes/plan.md +291 -0
  276. package/skills/autoresearch/modes/predict.md +266 -0
  277. package/skills/autoresearch/modes/reason.md +170 -0
  278. package/skills/autoresearch/modes/scenario.md +164 -0
  279. package/skills/autoresearch/modes/security.md +282 -0
  280. package/skills/autoresearch/modes/ship.md +49 -0
  281. package/skills/autoresearch/references/core-principles.md +80 -0
  282. package/skills/autoresearch/references/evaluator-contract.md +126 -0
  283. package/skills/autoresearch/references/investigation-techniques.md +205 -0
  284. package/skills/autoresearch/references/owasp-checklist.md +161 -0
  285. package/skills/autoresearch/references/persona-templates.md +232 -0
  286. package/skills/autoresearch/references/results-logging.md +96 -0
  287. package/skills/autoresearch/references/scenario-dimensions.md +178 -0
  288. package/skills/autoresearch/references/stride-model.md +196 -0
  289. package/skills/autoresearch/references/stuck-detection.md +107 -0
  290. package/skills/autoresearch/references/type-checklists.md +163 -0
  291. package/skills/autoresearch/references/upstream-family-contract.md +125 -0
  292. package/skills/autoresearch/references/visualization-guide.md +95 -0
  293. package/skills/autoresearch/scripts/check_progress.sh +272 -0
  294. package/skills/autoresearch/scripts/init_research.py +330 -0
  295. package/skills/autoresearch/scripts/run_with_deadline.py +164 -0
  296. package/skills/autoresearch/scripts/style_presets.py +104 -0
  297. package/skills/browser-drive/SKILL.md +133 -0
  298. package/skills/browser-drive/references/snapshot-act-loop.md +37 -0
  299. package/skills/browser-drive/scripts/capability-probe.mjs +262 -0
  300. package/skills/comment-checker/SKILL.md +171 -0
  301. package/skills/debugging/SKILL.md +202 -0
  302. package/skills/debugging/references/README.md +15 -0
  303. package/skills/debugging/references/escalation.md +43 -0
  304. package/skills/debugging/references/runtimes/README.md +17 -0
  305. package/skills/debugging/references/runtimes/bundled-js-binary.md +44 -0
  306. package/skills/debugging/references/runtimes/go.md +37 -0
  307. package/skills/debugging/references/runtimes/native-binary.md +44 -0
  308. package/skills/debugging/references/runtimes/node.md +43 -0
  309. package/skills/debugging/references/runtimes/python.md +41 -0
  310. package/skills/debugging/references/runtimes/rust.md +37 -0
  311. package/skills/debugging/references/tools.md +72 -0
  312. package/skills/deep-interview/SKILL.md +201 -0
  313. package/skills/doctor-installer/SKILL.md +252 -0
  314. package/skills/durable-litgoal/SKILL.md +248 -0
  315. package/skills/frontend-ui-ux/SKILL.md +70 -0
  316. package/skills/frontend-ui-ux/data/LICENSE +21 -0
  317. package/skills/frontend-ui-ux/data/PROVENANCE.json +1088 -0
  318. package/skills/frontend-ui-ux/data/THIRD-PARTY-NOTICE.txt +14 -0
  319. package/skills/frontend-ui-ux/data/design-intelligence.json +1 -0
  320. package/skills/frontend-ui-ux/references/_canonical-corpus/ATTRIBUTION.md +217 -0
  321. package/skills/frontend-ui-ux/references/_canonical-corpus/LICENSE +21 -0
  322. package/skills/frontend-ui-ux/references/_canonical-corpus/LICENSE-Apache-2.0.txt +201 -0
  323. package/skills/frontend-ui-ux/references/_canonical-corpus/manifest.json +867 -0
  324. package/skills/frontend-ui-ux/references/adaptive-layout.md +85 -0
  325. package/skills/frontend-ui-ux/references/brand-and-imagery.md +79 -0
  326. package/skills/frontend-ui-ux/references/complete-contract.md +282 -0
  327. package/skills/frontend-ui-ux/references/composition.md +87 -0
  328. package/skills/frontend-ui-ux/references/creative-directions.md +83 -0
  329. package/skills/frontend-ui-ux/references/design/README.md +248 -0
  330. package/skills/frontend-ui-ux/references/design/_INDEX.md +191 -0
  331. package/skills/frontend-ui-ux/references/design/airbnb.md +393 -0
  332. package/skills/frontend-ui-ux/references/design/airtable.md +92 -0
  333. package/skills/frontend-ui-ux/references/design/apple.md +250 -0
  334. package/skills/frontend-ui-ux/references/design/aside.md +209 -0
  335. package/skills/frontend-ui-ux/references/design/binance.md +348 -0
  336. package/skills/frontend-ui-ux/references/design/bmw.md +183 -0
  337. package/skills/frontend-ui-ux/references/design/brutalist-skill.md +92 -0
  338. package/skills/frontend-ui-ux/references/design/bugatti.md +271 -0
  339. package/skills/frontend-ui-ux/references/design/cal.md +262 -0
  340. package/skills/frontend-ui-ux/references/design/claude.md +315 -0
  341. package/skills/frontend-ui-ux/references/design/clay.md +307 -0
  342. package/skills/frontend-ui-ux/references/design/clickhouse.md +284 -0
  343. package/skills/frontend-ui-ux/references/design/clone-from-url.md +65 -0
  344. package/skills/frontend-ui-ux/references/design/cohere.md +269 -0
  345. package/skills/frontend-ui-ux/references/design/coinbase.md +132 -0
  346. package/skills/frontend-ui-ux/references/design/composio.md +310 -0
  347. package/skills/frontend-ui-ux/references/design/cursor.md +312 -0
  348. package/skills/frontend-ui-ux/references/design/design-system-architecture.md +244 -0
  349. package/skills/frontend-ui-ux/references/design/elevenlabs.md +268 -0
  350. package/skills/frontend-ui-ux/references/design/expo.md +284 -0
  351. package/skills/frontend-ui-ux/references/design/ferrari.md +317 -0
  352. package/skills/frontend-ui-ux/references/design/figma.md +223 -0
  353. package/skills/frontend-ui-ux/references/design/framer.md +249 -0
  354. package/skills/frontend-ui-ux/references/design/gpt-tasteskill.md +74 -0
  355. package/skills/frontend-ui-ux/references/design/hashicorp.md +281 -0
  356. package/skills/frontend-ui-ux/references/design/ibm.md +335 -0
  357. package/skills/frontend-ui-ux/references/design/image-to-code-skill.md +1228 -0
  358. package/skills/frontend-ui-ux/references/design/imagegen-brandkit.md +798 -0
  359. package/skills/frontend-ui-ux/references/design/imagegen-frontend-mobile.md +1465 -0
  360. package/skills/frontend-ui-ux/references/design/imagegen-frontend-web.md +987 -0
  361. package/skills/frontend-ui-ux/references/design/intercom.md +149 -0
  362. package/skills/frontend-ui-ux/references/design/kraken.md +128 -0
  363. package/skills/frontend-ui-ux/references/design/lamborghini.md +291 -0
  364. package/skills/frontend-ui-ux/references/design/layout-skill.md +107 -0
  365. package/skills/frontend-ui-ux/references/design/lazyweb.md +77 -0
  366. package/skills/frontend-ui-ux/references/design/linear.app.md +370 -0
  367. package/skills/frontend-ui-ux/references/design/lovable.md +301 -0
  368. package/skills/frontend-ui-ux/references/design/mastercard.md +368 -0
  369. package/skills/frontend-ui-ux/references/design/meta.md +369 -0
  370. package/skills/frontend-ui-ux/references/design/minimalist-skill.md +85 -0
  371. package/skills/frontend-ui-ux/references/design/minimax.md +260 -0
  372. package/skills/frontend-ui-ux/references/design/mintlify.md +329 -0
  373. package/skills/frontend-ui-ux/references/design/miro.md +111 -0
  374. package/skills/frontend-ui-ux/references/design/mistral.ai.md +264 -0
  375. package/skills/frontend-ui-ux/references/design/mongodb.md +269 -0
  376. package/skills/frontend-ui-ux/references/design/nike.md +366 -0
  377. package/skills/frontend-ui-ux/references/design/notion.md +312 -0
  378. package/skills/frontend-ui-ux/references/design/nvidia.md +296 -0
  379. package/skills/frontend-ui-ux/references/design/ollama.md +270 -0
  380. package/skills/frontend-ui-ux/references/design/opencode.ai.md +284 -0
  381. package/skills/frontend-ui-ux/references/design/output-skill.md +49 -0
  382. package/skills/frontend-ui-ux/references/design/pinterest.md +233 -0
  383. package/skills/frontend-ui-ux/references/design/playstation.md +367 -0
  384. package/skills/frontend-ui-ux/references/design/posthog.md +259 -0
  385. package/skills/frontend-ui-ux/references/design/raycast.md +271 -0
  386. package/skills/frontend-ui-ux/references/design/react-dev-tooling-skill.md +230 -0
  387. package/skills/frontend-ui-ux/references/design/redesign-skill.md +178 -0
  388. package/skills/frontend-ui-ux/references/design/renault.md +314 -0
  389. package/skills/frontend-ui-ux/references/design/replicate.md +264 -0
  390. package/skills/frontend-ui-ux/references/design/resend.md +306 -0
  391. package/skills/frontend-ui-ux/references/design/revolut.md +188 -0
  392. package/skills/frontend-ui-ux/references/design/runwayml.md +247 -0
  393. package/skills/frontend-ui-ux/references/design/sanity.md +360 -0
  394. package/skills/frontend-ui-ux/references/design/sentry.md +265 -0
  395. package/skills/frontend-ui-ux/references/design/shopify.md +353 -0
  396. package/skills/frontend-ui-ux/references/design/soft-skill.md +98 -0
  397. package/skills/frontend-ui-ux/references/design/spacex.md +197 -0
  398. package/skills/frontend-ui-ux/references/design/spotify.md +249 -0
  399. package/skills/frontend-ui-ux/references/design/starbucks.md +583 -0
  400. package/skills/frontend-ui-ux/references/design/stitch-design-example.md +121 -0
  401. package/skills/frontend-ui-ux/references/design/stitch-skill.md +184 -0
  402. package/skills/frontend-ui-ux/references/design/stripe.md +325 -0
  403. package/skills/frontend-ui-ux/references/design/supabase.md +258 -0
  404. package/skills/frontend-ui-ux/references/design/superhuman.md +255 -0
  405. package/skills/frontend-ui-ux/references/design/taste-skill.md +1206 -0
  406. package/skills/frontend-ui-ux/references/design/tesla.md +289 -0
  407. package/skills/frontend-ui-ux/references/design/theverge.md +342 -0
  408. package/skills/frontend-ui-ux/references/design/together.ai.md +266 -0
  409. package/skills/frontend-ui-ux/references/design/uber.md +298 -0
  410. package/skills/frontend-ui-ux/references/design/vercel.md +313 -0
  411. package/skills/frontend-ui-ux/references/design/vodafone.md +426 -0
  412. package/skills/frontend-ui-ux/references/design/voltagent.md +326 -0
  413. package/skills/frontend-ui-ux/references/design/warp.md +256 -0
  414. package/skills/frontend-ui-ux/references/design/webflow.md +95 -0
  415. package/skills/frontend-ui-ux/references/design/wired.md +281 -0
  416. package/skills/frontend-ui-ux/references/design/wise.md +176 -0
  417. package/skills/frontend-ui-ux/references/design/x.ai.md +260 -0
  418. package/skills/frontend-ui-ux/references/design/zapier.md +331 -0
  419. package/skills/frontend-ui-ux/references/designpowers/EVIDENCE.md +97 -0
  420. package/skills/frontend-ui-ux/references/designpowers/README.md +48 -0
  421. package/skills/frontend-ui-ux/references/designpowers/UPSTREAM.md +80 -0
  422. package/skills/frontend-ui-ux/references/designpowers/lane-a-direction.md +64 -0
  423. package/skills/frontend-ui-ux/references/designpowers/lane-b-execution.md +65 -0
  424. package/skills/frontend-ui-ux/references/designpowers/lane-c-review.md +65 -0
  425. package/skills/frontend-ui-ux/references/designpowers/lane-d-memory.md +83 -0
  426. package/skills/frontend-ui-ux/references/designpowers/orchestration.md +80 -0
  427. package/skills/frontend-ui-ux/references/designpowers/routing.md +79 -0
  428. package/skills/frontend-ui-ux/references/designpowers/vendor/LICENSE +21 -0
  429. package/skills/frontend-ui-ux/references/designpowers/vendor/agents/accessibility-reviewer.md +83 -0
  430. package/skills/frontend-ui-ux/references/designpowers/vendor/agents/content-writer.md +132 -0
  431. package/skills/frontend-ui-ux/references/designpowers/vendor/agents/design-builder.md +109 -0
  432. package/skills/frontend-ui-ux/references/designpowers/vendor/agents/design-critic.md +89 -0
  433. package/skills/frontend-ui-ux/references/designpowers/vendor/agents/design-lead.md +113 -0
  434. package/skills/frontend-ui-ux/references/designpowers/vendor/agents/design-scout.md +78 -0
  435. package/skills/frontend-ui-ux/references/designpowers/vendor/agents/design-strategist.md +121 -0
  436. package/skills/frontend-ui-ux/references/designpowers/vendor/agents/heuristic-evaluator.md +268 -0
  437. package/skills/frontend-ui-ux/references/designpowers/vendor/agents/inspiration-scout.md +107 -0
  438. package/skills/frontend-ui-ux/references/designpowers/vendor/agents/motion-designer.md +120 -0
  439. package/skills/frontend-ui-ux/references/designpowers/vendor/skills/accessible-content/reference.md +101 -0
  440. package/skills/frontend-ui-ux/references/designpowers/vendor/skills/adaptive-interfaces/reference.md +109 -0
  441. package/skills/frontend-ui-ux/references/designpowers/vendor/skills/cognitive-accessibility/reference.md +107 -0
  442. package/skills/frontend-ui-ux/references/designpowers/vendor/skills/design-debate/reference.md +199 -0
  443. package/skills/frontend-ui-ux/references/designpowers/vendor/skills/design-debt-tracker/reference.md +174 -0
  444. package/skills/frontend-ui-ux/references/designpowers/vendor/skills/design-handoff/reference.md +125 -0
  445. package/skills/frontend-ui-ux/references/designpowers/vendor/skills/design-md/reference.md +106 -0
  446. package/skills/frontend-ui-ux/references/designpowers/vendor/skills/design-retrospective/reference.md +266 -0
  447. package/skills/frontend-ui-ux/references/designpowers/vendor/skills/design-review/reference.md +123 -0
  448. package/skills/frontend-ui-ux/references/designpowers/vendor/skills/design-system-alignment/reference.md +120 -0
  449. package/skills/frontend-ui-ux/references/designpowers/vendor/skills/designpowers-critique/reference.md +164 -0
  450. package/skills/frontend-ui-ux/references/designpowers/vendor/skills/heuristic-evaluation/reference.md +85 -0
  451. package/skills/frontend-ui-ux/references/designpowers/vendor/skills/inclusive-personas/reference.md +98 -0
  452. package/skills/frontend-ui-ux/references/designpowers/vendor/skills/inspiration-scouting/reference.md +165 -0
  453. package/skills/frontend-ui-ux/references/designpowers/vendor/skills/interaction-design/reference.md +122 -0
  454. package/skills/frontend-ui-ux/references/designpowers/vendor/skills/motion-choreography/reference.md +81 -0
  455. package/skills/frontend-ui-ux/references/designpowers/vendor/skills/research-planning/reference.md +96 -0
  456. package/skills/frontend-ui-ux/references/designpowers/vendor/skills/responsive-patterns/reference.md +77 -0
  457. package/skills/frontend-ui-ux/references/designpowers/vendor/skills/synthetic-user-testing/reference.md +192 -0
  458. package/skills/frontend-ui-ux/references/designpowers/vendor/skills/taste-feedback/reference.md +165 -0
  459. package/skills/frontend-ui-ux/references/designpowers/vendor/skills/taste-report/reference.md +78 -0
  460. package/skills/frontend-ui-ux/references/designpowers/vendor/skills/token-architecture/reference.md +75 -0
  461. package/skills/frontend-ui-ux/references/designpowers/vendor/skills/ui-composition/reference.md +117 -0
  462. package/skills/frontend-ui-ux/references/designpowers/vendor/skills/usability-testing/reference.md +78 -0
  463. package/skills/frontend-ui-ux/references/designpowers/vendor/skills/verification-before-shipping/reference.md +125 -0
  464. package/skills/frontend-ui-ux/references/designpowers/vendor/skills/voice-and-tone/reference.md +79 -0
  465. package/skills/frontend-ui-ux/references/designpowers/vendor/skills/writing-design-plans/reference.md +119 -0
  466. package/skills/frontend-ui-ux/references/evidence-review.md +103 -0
  467. package/skills/frontend-ui-ux/references/implementation-platforms.md +94 -0
  468. package/skills/frontend-ui-ux/references/inclusive-interface.md +85 -0
  469. package/skills/frontend-ui-ux/references/interaction-motion.md +93 -0
  470. package/skills/frontend-ui-ux/references/operating-lanes.md +80 -0
  471. package/skills/frontend-ui-ux/references/perfection/README.md +160 -0
  472. package/skills/frontend-ui-ux/references/perfection/react-perf-tooling.md +127 -0
  473. package/skills/frontend-ui-ux/references/performance-delivery.md +77 -0
  474. package/skills/frontend-ui-ux/references/product-direction.md +84 -0
  475. package/skills/frontend-ui-ux/references/redesign-playbook.md +88 -0
  476. package/skills/frontend-ui-ux/references/system-foundations.md +86 -0
  477. package/skills/frontend-ui-ux/references/taste-direction.md +55 -0
  478. package/skills/frontend-ui-ux/references/ui-ux-db/README.md +659 -0
  479. package/skills/frontend-ui-ux/references/ui-ux-db/data/charts.csv +26 -0
  480. package/skills/frontend-ui-ux/references/ui-ux-db/data/colors.csv +162 -0
  481. package/skills/frontend-ui-ux/references/ui-ux-db/data/icons.csv +106 -0
  482. package/skills/frontend-ui-ux/references/ui-ux-db/data/landing.csv +35 -0
  483. package/skills/frontend-ui-ux/references/ui-ux-db/data/products.csv +162 -0
  484. package/skills/frontend-ui-ux/references/ui-ux-db/data/react-performance.csv +45 -0
  485. package/skills/frontend-ui-ux/references/ui-ux-db/data/stacks/astro.csv +54 -0
  486. package/skills/frontend-ui-ux/references/ui-ux-db/data/stacks/flutter.csv +53 -0
  487. package/skills/frontend-ui-ux/references/ui-ux-db/data/stacks/html-tailwind.csv +56 -0
  488. package/skills/frontend-ui-ux/references/ui-ux-db/data/stacks/jetpack-compose.csv +53 -0
  489. package/skills/frontend-ui-ux/references/ui-ux-db/data/stacks/nextjs.csv +53 -0
  490. package/skills/frontend-ui-ux/references/ui-ux-db/data/stacks/nuxt-ui.csv +51 -0
  491. package/skills/frontend-ui-ux/references/ui-ux-db/data/stacks/nuxtjs.csv +59 -0
  492. package/skills/frontend-ui-ux/references/ui-ux-db/data/stacks/react-native.csv +52 -0
  493. package/skills/frontend-ui-ux/references/ui-ux-db/data/stacks/react.csv +54 -0
  494. package/skills/frontend-ui-ux/references/ui-ux-db/data/stacks/shadcn.csv +61 -0
  495. package/skills/frontend-ui-ux/references/ui-ux-db/data/stacks/svelte.csv +54 -0
  496. package/skills/frontend-ui-ux/references/ui-ux-db/data/stacks/swiftui.csv +51 -0
  497. package/skills/frontend-ui-ux/references/ui-ux-db/data/stacks/vue.csv +50 -0
  498. package/skills/frontend-ui-ux/references/ui-ux-db/data/styles.csv +85 -0
  499. package/skills/frontend-ui-ux/references/ui-ux-db/data/typography.csv +74 -0
  500. package/skills/frontend-ui-ux/references/ui-ux-db/data/ui-reasoning.csv +162 -0
  501. package/skills/frontend-ui-ux/references/ui-ux-db/data/ux-guidelines.csv +100 -0
  502. package/skills/frontend-ui-ux/references/ui-ux-db/data/web-interface.csv +31 -0
  503. package/skills/frontend-ui-ux/references/ui-ux-db/scripts/core.py +262 -0
  504. package/skills/frontend-ui-ux/references/ui-ux-db/scripts/design_system.py +1148 -0
  505. package/skills/frontend-ui-ux/references/ui-ux-db/scripts/search.py +114 -0
  506. package/skills/frontend-ui-ux/references/visual-language.md +84 -0
  507. package/skills/frontend-ui-ux/references/visual-reconstruction.md +87 -0
  508. package/skills/frontend-ui-ux/schemas/design-contract-v1alpha1.json +570 -0
  509. package/skills/frontend-ui-ux/schemas/design-contract-v1beta1.json +32 -0
  510. package/skills/frontend-ui-ux/schemas/design-contract-v1beta2.json +34 -0
  511. package/skills/frontend-ui-ux/scripts/bounded-json.mjs +45 -0
  512. package/skills/frontend-ui-ux/scripts/canonical-json.mjs +26 -0
  513. package/skills/frontend-ui-ux/scripts/contract-error.mjs +15 -0
  514. package/skills/frontend-ui-ux/scripts/csv.mjs +64 -0
  515. package/skills/frontend-ui-ux/scripts/dataset.mjs +65 -0
  516. package/skills/frontend-ui-ux/scripts/design-contract.mjs +609 -0
  517. package/skills/frontend-ui-ux/scripts/import-design-intelligence.mjs +193 -0
  518. package/skills/frontend-ui-ux/scripts/retrieval.mjs +92 -0
  519. package/skills/frontend-ui-ux/scripts/stable-file-read.mjs +237 -0
  520. package/skills/frontend-ui-ux/scripts/stdin-json.mjs +16 -0
  521. package/skills/frontend-ui-ux/scripts/strict-json.mjs +102 -0
  522. package/skills/frontend-ui-ux/scripts/uiux.mjs +86 -0
  523. package/skills/frontend-ui-ux/scripts/verify-canonical-corpus.mjs +266 -0
  524. package/skills/lit-burnoff/SKILL.md +227 -0
  525. package/skills/lit-burnoff-file/SKILL.md +175 -0
  526. package/skills/lit-code/SKILL.md +266 -0
  527. package/skills/lit-code/references/README.md +18 -0
  528. package/skills/lit-code/references/go/README.md +12 -0
  529. package/skills/lit-code/references/go/concurrency.md +42 -0
  530. package/skills/lit-code/references/go/error-handling.md +47 -0
  531. package/skills/lit-code/references/go/testing.md +55 -0
  532. package/skills/lit-code/references/go/tooling.md +35 -0
  533. package/skills/lit-code/references/go/type-patterns.md +50 -0
  534. package/skills/lit-code/references/python/README.md +12 -0
  535. package/skills/lit-code/references/python/async.md +50 -0
  536. package/skills/lit-code/references/python/error-handling.md +44 -0
  537. package/skills/lit-code/references/python/testing.md +50 -0
  538. package/skills/lit-code/references/python/tooling.md +38 -0
  539. package/skills/lit-code/references/python/type-patterns.md +46 -0
  540. package/skills/lit-code/references/rust/README.md +12 -0
  541. package/skills/lit-code/references/rust/concurrency.md +45 -0
  542. package/skills/lit-code/references/rust/error-handling.md +43 -0
  543. package/skills/lit-code/references/rust/tooling.md +36 -0
  544. package/skills/lit-code/references/rust/type-patterns.md +46 -0
  545. package/skills/lit-code/references/rust/unsafe.md +47 -0
  546. package/skills/lit-code/references/typescript/README.md +11 -0
  547. package/skills/lit-code/references/typescript/error-handling.md +56 -0
  548. package/skills/lit-code/references/typescript/testing.md +42 -0
  549. package/skills/lit-code/references/typescript/tsconfig-strict.md +40 -0
  550. package/skills/lit-code/references/typescript/type-patterns.md +60 -0
  551. package/skills/lit-commit/SKILL.md +222 -0
  552. package/skills/lit-comprehend/SKILL.md +278 -0
  553. package/skills/lit-comprehend/assets/explainer-scaffold.html +104 -0
  554. package/skills/lit-comprehend/references/artifact-template.md +114 -0
  555. package/skills/lit-comprehend/references/micro-worlds.md +115 -0
  556. package/skills/lit-comprehend/scripts/verify-explainer.ts +339 -0
  557. package/skills/lit-crucible/SKILL.md +212 -0
  558. package/skills/lit-fetch/SKILL.md +242 -0
  559. package/skills/lit-handoff/SKILL.md +199 -0
  560. package/skills/lit-init/SKILL.md +214 -0
  561. package/skills/lit-korean/SKILL.md +231 -0
  562. package/skills/lit-plan/SKILL.md +351 -0
  563. package/skills/lit-plan/scripts/scaffold-plan.mjs +275 -0
  564. package/skills/lit-recap/SKILL.md +233 -0
  565. package/skills/lit-scientific-visualization/SKILL.md +175 -0
  566. package/skills/litresearch/SKILL.md +436 -0
  567. package/skills/litwork/SKILL.md +227 -0
  568. package/skills/lsp/SKILL.md +186 -0
  569. package/skills/lsp-setup/SKILL.md +187 -0
  570. package/skills/lsp-setup/references/README.md +40 -0
  571. package/skills/lsp-setup/references/bash.md +31 -0
  572. package/skills/lsp-setup/references/c-cpp.md +43 -0
  573. package/skills/lsp-setup/references/csharp.md +29 -0
  574. package/skills/lsp-setup/references/dart.md +25 -0
  575. package/skills/lsp-setup/references/elixir.md +30 -0
  576. package/skills/lsp-setup/references/go.md +33 -0
  577. package/skills/lsp-setup/references/haskell.md +27 -0
  578. package/skills/lsp-setup/references/java.md +28 -0
  579. package/skills/lsp-setup/references/julia.md +28 -0
  580. package/skills/lsp-setup/references/kotlin.md +25 -0
  581. package/skills/lsp-setup/references/lua.md +26 -0
  582. package/skills/lsp-setup/references/php.md +30 -0
  583. package/skills/lsp-setup/references/python.md +33 -0
  584. package/skills/lsp-setup/references/ruby.md +34 -0
  585. package/skills/lsp-setup/references/rust.md +34 -0
  586. package/skills/lsp-setup/references/swift.md +26 -0
  587. package/skills/lsp-setup/references/terraform.md +26 -0
  588. package/skills/lsp-setup/references/typescript.md +35 -0
  589. package/skills/lsp-setup/references/yaml.md +27 -0
  590. package/skills/lsp-setup/references/zig.md +28 -0
  591. package/skills/managed-skill-manifest.json +1386 -0
  592. package/skills/native-goal-verdict/SKILL.md +216 -0
  593. package/skills/refactor/SKILL.md +221 -0
  594. package/skills/reference-benchmark-claims/SKILL.md +204 -0
  595. package/skills/release-guardrails/SKILL.md +245 -0
  596. package/skills/review-work/SKILL.md +301 -0
  597. package/skills/rules/SKILL.md +196 -0
  598. package/skills/search-workflow-ideas/SKILL.md +223 -0
  599. package/skills/skill-observer/SKILL.md +148 -0
  600. package/skills/skill-observer/references/review-contract.md +95 -0
  601. package/skills/skill-rename-aliases.json +10 -0
  602. package/skills/start-work/SKILL.md +334 -0
  603. package/skills/structural-search/SKILL.md +234 -0
  604. package/skills/tool-guards/SKILL.md +223 -0
  605. package/skills/visual-qa/SKILL.md +61 -0
  606. package/skills/visual-qa/references/capture-playbook.md +105 -0
  607. package/skills/visual-qa/references/complete-contract.md +411 -0
  608. package/skills/visual-qa/schemas/evidence-manifest-v1alpha1.json +201 -0
  609. package/skills/visual-qa/schemas/evidence-manifest-v1beta1.json +141 -0
  610. package/skills/visual-qa/schemas/review-receipt-v1alpha1.json +113 -0
  611. package/skills/visual-qa/scripts/artifact.mjs +123 -0
  612. package/skills/visual-qa/scripts/bounded-json.mjs +47 -0
  613. package/skills/visual-qa/scripts/canonical-json.mjs +28 -0
  614. package/skills/visual-qa/scripts/capabilities.mjs +66 -0
  615. package/skills/visual-qa/scripts/contract-text.mjs +15 -0
  616. package/skills/visual-qa/scripts/design-contract.mjs +611 -0
  617. package/skills/visual-qa/scripts/evidence-evaluate.mjs +521 -0
  618. package/skills/visual-qa/scripts/evidence.mjs +271 -0
  619. package/skills/visual-qa/scripts/png-decode.mjs +146 -0
  620. package/skills/visual-qa/scripts/png.mjs +154 -0
  621. package/skills/visual-qa/scripts/review.mjs +188 -0
  622. package/skills/visual-qa/scripts/stdin-json.mjs +16 -0
  623. package/skills/visual-qa/scripts/strict-json.mjs +102 -0
  624. package/skills/visual-qa/scripts/tui.mjs +149 -0
  625. package/skills/visual-qa/scripts/visual-qa.mjs +90 -0
  626. package/skills/wikify/LICENSE +21 -0
  627. package/skills/wikify/PROVENANCE.md +18 -0
  628. package/skills/wikify/SKILL.md +176 -0
  629. package/skills/wikify/assets/home-template.md +44 -0
  630. package/skills/wikify/assets/maintenance-report-template.md +46 -0
  631. package/skills/wikify/assets/paper-source-note-template.md +137 -0
  632. package/skills/wikify/assets/source-note-template.md +45 -0
  633. package/skills/wikify/assets/wiki-rules-template.md +117 -0
  634. package/skills/wikify/modes/ingest.md +57 -0
  635. package/skills/wikify/modes/init.md +44 -0
  636. package/skills/wikify/modes/lint.md +60 -0
  637. package/skills/wikify/modes/query.md +38 -0
  638. package/skills/wikify/modes/save.md +45 -0
  639. package/skills/wikify/references-upstream-contract.md +758 -0
  640. package/skills/workflow-loop/SKILL.md +387 -0
  641. package/tools/check-pack-payload.mjs +410 -0
  642. package/tools/check-payload-substance.mjs +738 -0
  643. package/tools/check-version-lockstep.mjs +238 -0
  644. package/tools/gen-canonical-frontend-manifest.mjs +66 -0
  645. package/tools/gen-managed-skill-manifest.mjs +135 -0
  646. package/tools/harness-speed-local.mjs +261 -0
  647. package/tools/payload-reference-exemptions.json +49 -0
  648. package/tools/payload-substance-allowlist.json +46 -0
  649. package/tools/payload-substance-parity.json +571 -0
  650. package/tools/qa-real-surface-fixtures.mjs +428 -0
  651. package/tools/qa-real-surface-harness.mjs +173 -0
  652. package/tools/run-behavior-replacement-probes.mjs +296 -0
  653. package/tools/run-build.mjs +101 -0
  654. package/tools/run-harness-speed-local.mjs +52 -0
  655. package/tools/run-harness-speed-v2.mjs +36 -0
  656. package/tools/run-installed-resource-tamper-probe.mjs +62 -0
  657. package/tools/run-negative-gate-matrix.mjs +516 -0
  658. package/tools/run-rules-glob-differential.mjs +232 -0
  659. package/tools/run-typecheck.mjs +25 -0
  660. package/tools/run-uiux-visual-qa-scenarios.mjs +234 -0
  661. package/tools/run-wikify-surface-probe.mjs +170 -0
  662. package/tools/scan-legacy-tokens.mjs +431 -0
  663. package/tools/version-manifests.json +60 -0
  664. package/tsconfig.build.json +12 -0
  665. package/tsconfig.json +13 -0
  666. package/vendor/NOTICE.md +21 -0
  667. package/vendor/handoff/SKILL.md +199 -0
  668. package/vendor/handoff/evals/evals.json +154 -0
  669. package/vendor/handoff/examples/HANDOFF-example-generic-auth-refactor.md +97 -0
  670. package/vendor/handoff/templates/HANDOFF.md +121 -0
  671. package/vendor/licenses/022_handoff-MIT.txt +21 -0
  672. package/vendor/licenses/045_scientific-visualization-MIT.txt +21 -0
  673. package/vendor/provenance/022_handoff.md +19 -0
  674. package/vendor/provenance/045_scientific-visualization.md +36 -0
  675. package/vendor/scientific-visualization/SKILL.md +283 -0
  676. package/vendor/scientific-visualization/assets/color_palettes.py +197 -0
  677. package/vendor/scientific-visualization/assets/nature.mplstyle +75 -0
  678. package/vendor/scientific-visualization/assets/presentation.mplstyle +74 -0
  679. package/vendor/scientific-visualization/assets/publication.mplstyle +78 -0
  680. package/vendor/scientific-visualization/evals/evals.json +158 -0
  681. package/vendor/scientific-visualization/references/color_palettes.md +380 -0
  682. package/vendor/scientific-visualization/references/journal_requirements.md +359 -0
  683. package/vendor/scientific-visualization/references/matplotlib_examples.md +608 -0
  684. package/vendor/scientific-visualization/references/mdanalysis_martini_visualization.md +85 -0
  685. package/vendor/scientific-visualization/references/publication_guidelines.md +217 -0
  686. package/vendor/scientific-visualization/references/seaborn_for_publications.md +293 -0
  687. package/vendor/scientific-visualization/scripts/figure_export.py +238 -0
  688. package/vendor/scientific-visualization/scripts/style_presets.py +467 -0
  689. package/vendor/scientific-visualization/tests/test_figure_export.py +51 -0
  690. package/vendor/scientific-visualization/tests/test_style_presets.py +114 -0
@@ -0,0 +1,604 @@
1
+ import { execFile } from "node:child_process";
2
+ import { createHash, randomUUID } from "node:crypto";
3
+ import fs from "node:fs/promises";
4
+ import os from "node:os";
5
+ import path from "node:path";
6
+ import { promisify } from "node:util";
7
+ import { defaultOpenCodeConfigRoot } from "../state.js";
8
+ import { compareStableVersions, parseStableVersion, requestRegistryLatestVersion } from "./update-notifier.js";
9
+ import { readPackageMetadata } from "./json.js";
10
+ export const autoUpdatePackageName = "@litfamily/litopencode";
11
+ export const autoUpdateTimeoutMs = 30_000;
12
+ /** npm install, staged install, and post-install doctor each have this bound. */
13
+ export const autoUpdateTransactionBoundMs = autoUpdateTimeoutMs * 3;
14
+ export const autoUpdateLockTimeoutMs = 2_000;
15
+ /** Keep a live owner protected for the whole bounded transaction plus one command window. */
16
+ export const autoUpdateInstallLockStaleMs = autoUpdateTransactionBoundMs + autoUpdateTimeoutMs;
17
+ export const autoUpdateRecursionEnv = "LITOPENCODE_AUTO_UPDATE_IN_PROGRESS";
18
+ const stateRootName = ".litopencode";
19
+ const receiptFileName = "auto-update-receipt.json";
20
+ const journalFileName = "auto-update-journal.jsonl";
21
+ const installLockFileName = "auto-update-install.lock";
22
+ const maxCommandOutputBytes = 4 * 1024 * 1024;
23
+ const execFileAsync = promisify(execFile);
24
+ function stateRoot(homeDir) {
25
+ return path.join(homeDir, stateRootName);
26
+ }
27
+ export function autoUpdateInstallLockPath(homeDir = os.homedir()) {
28
+ return path.join(stateRoot(homeDir), installLockFileName);
29
+ }
30
+ export function autoUpdateJournalPath(homeDir = os.homedir()) {
31
+ return path.join(stateRoot(homeDir), journalFileName);
32
+ }
33
+ export function autoUpdateReceiptPath(homeDir = os.homedir()) {
34
+ return path.join(stateRoot(homeDir), receiptFileName);
35
+ }
36
+ function truthyEnvironmentValue(value) {
37
+ return value !== undefined;
38
+ }
39
+ export function isAutoUpdateDisabled(env = process.env, argv = []) {
40
+ return (argv.includes("--no-auto-update") ||
41
+ truthyEnvironmentValue(env.LITOPENCODE_NO_AUTO_UPDATE) ||
42
+ truthyEnvironmentValue(env.NO_UPDATE_NOTIFIER) ||
43
+ truthyEnvironmentValue(env.LITOPENCODE_NO_UPDATE_CHECK) ||
44
+ truthyEnvironmentValue(env[autoUpdateRecursionEnv]) ||
45
+ truthyEnvironmentValue(env.CI));
46
+ }
47
+ export function shouldRunInteractiveAutoUpdate(input) {
48
+ if (input.exitCode !== 0)
49
+ return false;
50
+ if (input.argv[0] !== "install" && input.argv[0] !== "doctor")
51
+ return false;
52
+ if (input.argv.some((arg) => arg === "--dry-run" || arg === "--json" || arg === "--help" || arg === "-h"))
53
+ return false;
54
+ if (input.stdinIsTTY !== true || input.stdoutIsTTY !== true || input.stderrIsTTY !== true)
55
+ return false;
56
+ return !isAutoUpdateDisabled(input.env, input.argv);
57
+ }
58
+ /**
59
+ * Keep npm child processes deliberately boring. In particular, npm config files,
60
+ * tokens, proxy credentials, and arbitrary `npm_config_*` values are not inherited.
61
+ */
62
+ export function sanitizedNpmEnvironment(env = process.env) {
63
+ const child = {};
64
+ const safeKeys = [
65
+ "HOME",
66
+ "USERPROFILE",
67
+ "HOMEDRIVE",
68
+ "HOMEPATH",
69
+ "SystemRoot",
70
+ "SYSTEMROOT",
71
+ "PATH",
72
+ "TMPDIR",
73
+ "TMP",
74
+ "TEMP",
75
+ "XDG_CONFIG_HOME",
76
+ "XDG_CACHE_HOME",
77
+ "NODE_EXTRA_CA_CERTS",
78
+ "SSL_CERT_FILE",
79
+ "SSL_CERT_DIR"
80
+ ];
81
+ for (const key of safeKeys) {
82
+ if (env[key] !== undefined)
83
+ child[key] = env[key];
84
+ }
85
+ child[autoUpdateRecursionEnv] = "1";
86
+ child.LITOPENCODE_NO_AUTO_UPDATE = "1";
87
+ child.NO_UPDATE_NOTIFIER = "1";
88
+ child.LITOPENCODE_NO_UPDATE_CHECK = "1";
89
+ return child;
90
+ }
91
+ function commandFailure(error) {
92
+ if (!(error instanceof Error))
93
+ return String(error);
94
+ const candidate = error;
95
+ const stderr = typeof candidate.stderr === "string" ? candidate.stderr.trim() : "";
96
+ const stdout = typeof candidate.stdout === "string" ? candidate.stdout.trim() : "";
97
+ const code = candidate.code === undefined ? "" : String(candidate.code);
98
+ const signal = candidate.signal === undefined ? "" : String(candidate.signal);
99
+ return [stderr ? `stderr: ${stderr}` : "", stdout ? `stdout: ${stdout}` : "", code ? `code: ${code}` : "", signal ? `signal: ${signal}` : "", !stderr && !stdout && !code && !signal ? error.message : ""]
100
+ .filter(Boolean)
101
+ .join("; ");
102
+ }
103
+ async function defaultRunCommand(command, args, options) {
104
+ return await execFileAsync(command, [...args], options);
105
+ }
106
+ async function bounded(operation, timeoutMs) {
107
+ let timer;
108
+ try {
109
+ return await Promise.race([
110
+ operation(),
111
+ new Promise((_, reject) => {
112
+ timer = setTimeout(() => reject(new Error(`automatic update command exceeded ${timeoutMs}ms`)), timeoutMs);
113
+ })
114
+ ]);
115
+ }
116
+ finally {
117
+ if (timer !== undefined)
118
+ clearTimeout(timer);
119
+ }
120
+ }
121
+ async function ensurePrivateStateRoot(homeDir) {
122
+ const directory = stateRoot(homeDir);
123
+ try {
124
+ const stat = await fs.lstat(directory);
125
+ if (stat.isSymbolicLink() || !stat.isDirectory())
126
+ throw new Error("automatic update state root is unsafe");
127
+ if (typeof process.getuid === "function" && stat.uid !== process.getuid())
128
+ throw new Error("automatic update state root is not user-owned");
129
+ if ((stat.mode & 0o077) !== 0)
130
+ throw new Error("automatic update state root is not private");
131
+ }
132
+ catch (error) {
133
+ if (error.code !== "ENOENT")
134
+ throw error;
135
+ await fs.mkdir(directory, { recursive: true, mode: 0o700 });
136
+ }
137
+ return directory;
138
+ }
139
+ async function readLockTimestamp(lockPath) {
140
+ try {
141
+ const stat = await fs.lstat(lockPath);
142
+ if (!stat.isFile() || stat.isSymbolicLink())
143
+ return undefined;
144
+ const parsed = JSON.parse(await fs.readFile(lockPath, "utf8"));
145
+ return typeof parsed.acquiredAt === "number" ? parsed.acquiredAt : undefined;
146
+ }
147
+ catch {
148
+ return undefined;
149
+ }
150
+ }
151
+ function pause(milliseconds) {
152
+ return new Promise((resolve) => setTimeout(resolve, milliseconds));
153
+ }
154
+ async function acquireInstallLock(homeDir) {
155
+ await ensurePrivateStateRoot(homeDir);
156
+ const lockPath = autoUpdateInstallLockPath(homeDir);
157
+ const deadline = Date.now() + autoUpdateLockTimeoutMs;
158
+ while (Date.now() < deadline) {
159
+ const token = randomUUID();
160
+ try {
161
+ const handle = await fs.open(lockPath, "wx", 0o600);
162
+ await handle.writeFile(`${JSON.stringify({ token, acquiredAt: Date.now() })}\n`, "utf8");
163
+ await handle.close();
164
+ return { path: lockPath, token };
165
+ }
166
+ catch (error) {
167
+ if (error.code !== "EEXIST")
168
+ throw error;
169
+ const acquiredAt = await readLockTimestamp(lockPath);
170
+ if (acquiredAt !== undefined && Date.now() - acquiredAt >= autoUpdateInstallLockStaleMs) {
171
+ await fs.rm(lockPath, { force: true });
172
+ continue;
173
+ }
174
+ await pause(25);
175
+ }
176
+ }
177
+ return undefined;
178
+ }
179
+ async function releaseInstallLock(lock) {
180
+ if ((await readLockTimestamp(lock.path)) === undefined)
181
+ return;
182
+ let ownerToken;
183
+ try {
184
+ const parsed = JSON.parse(await fs.readFile(lock.path, "utf8"));
185
+ ownerToken = typeof parsed.token === "string" ? parsed.token : undefined;
186
+ }
187
+ catch {
188
+ return;
189
+ }
190
+ if (ownerToken === lock.token)
191
+ await fs.rm(lock.path, { force: true });
192
+ }
193
+ async function appendJournal(homeDir, event, fields) {
194
+ const journalPath = autoUpdateJournalPath(homeDir);
195
+ await ensurePrivateStateRoot(homeDir);
196
+ try {
197
+ const stat = await fs.lstat(journalPath);
198
+ if (stat.isSymbolicLink() || !stat.isFile())
199
+ throw new Error("automatic update journal is unsafe");
200
+ if (typeof process.getuid === "function" && stat.uid !== process.getuid())
201
+ throw new Error("automatic update journal is not user-owned");
202
+ if ((stat.mode & 0o077) !== 0)
203
+ throw new Error("automatic update journal is not private");
204
+ }
205
+ catch (error) {
206
+ if (error.code !== "ENOENT")
207
+ throw error;
208
+ }
209
+ await fs.appendFile(journalPath, `${JSON.stringify({ schemaVersion: 1, event, at: Date.now(), ...fields })}\n`, {
210
+ encoding: "utf8",
211
+ mode: 0o600
212
+ });
213
+ await fs.chmod(journalPath, 0o600).catch(() => undefined);
214
+ }
215
+ async function tryAppendJournal(homeDir, event, fields) {
216
+ try {
217
+ await appendJournal(homeDir, event, fields);
218
+ }
219
+ catch {
220
+ // Journal failure must not skip the restore attempt. The receipt remains
221
+ // the authoritative failure surface when the journal itself is unsafe.
222
+ }
223
+ }
224
+ async function lstatKind(filePath) {
225
+ try {
226
+ const stat = await fs.lstat(filePath);
227
+ if (stat.isSymbolicLink())
228
+ throw new Error(`automatic update refuses symbolic-link backup source: ${filePath}`);
229
+ if (stat.isFile())
230
+ return "file";
231
+ if (stat.isDirectory())
232
+ return "directory";
233
+ throw new Error(`automatic update refuses special backup source: ${filePath}`);
234
+ }
235
+ catch (error) {
236
+ if (error.code === "ENOENT")
237
+ return undefined;
238
+ throw error;
239
+ }
240
+ }
241
+ async function captureSnapshot(configRoot, homeDir) {
242
+ const snapshotPath = path.join(stateRoot(homeDir), `.auto-update-backup-${randomUUID()}`);
243
+ await fs.mkdir(snapshotPath, { recursive: true, mode: 0o700 });
244
+ const entries = [];
245
+ for (const relativePath of ["opencode.json", "opencode.jsonc", "litopencode.json", "command", "skills"]) {
246
+ const source = path.join(configRoot, relativePath);
247
+ const kind = await lstatKind(source);
248
+ if (kind === undefined) {
249
+ entries.push({ relativePath, existed: false });
250
+ continue;
251
+ }
252
+ const destination = path.join(snapshotPath, relativePath);
253
+ await fs.cp(source, destination, { recursive: kind === "directory", force: false, errorOnExist: false, dereference: false });
254
+ entries.push({ relativePath, existed: true, kind });
255
+ }
256
+ await fs.writeFile(path.join(snapshotPath, "manifest.json"), `${JSON.stringify({ schemaVersion: 1, entries }, null, 2)}\n`, {
257
+ encoding: "utf8",
258
+ mode: 0o600
259
+ });
260
+ return { path: snapshotPath, entries };
261
+ }
262
+ async function ensureConfigRoot(configRoot) {
263
+ try {
264
+ const stat = await fs.lstat(configRoot);
265
+ if (stat.isSymbolicLink() || !stat.isDirectory())
266
+ throw new Error(`automatic update config root is unsafe: ${configRoot}`);
267
+ }
268
+ catch (error) {
269
+ if (error.code !== "ENOENT")
270
+ throw error;
271
+ await fs.mkdir(configRoot, { recursive: true, mode: 0o700 });
272
+ }
273
+ }
274
+ async function restoreSnapshot(configRoot, snapshot) {
275
+ // Re-check the root immediately before restoring. The updater never writes
276
+ // through a root that was replaced with a symlink while the child command
277
+ // was running.
278
+ await ensureConfigRoot(configRoot);
279
+ for (const entry of snapshot.entries) {
280
+ const target = path.join(configRoot, entry.relativePath);
281
+ await fs.rm(target, { recursive: true, force: true });
282
+ if (!entry.existed)
283
+ continue;
284
+ const source = path.join(snapshot.path, entry.relativePath);
285
+ await fs.mkdir(path.dirname(target), { recursive: true });
286
+ await fs.cp(source, target, { recursive: entry.kind === "directory", force: false, errorOnExist: false, dereference: false });
287
+ }
288
+ }
289
+ async function fingerprintPath(filePath) {
290
+ const stat = await fs.lstat(filePath);
291
+ if (stat.isSymbolicLink())
292
+ return `link:${await fs.readlink(filePath)}`;
293
+ if (stat.isFile()) {
294
+ const hash = createHash("sha256");
295
+ hash.update(await fs.readFile(filePath));
296
+ return `file:${hash.digest("hex")}`;
297
+ }
298
+ if (stat.isDirectory()) {
299
+ const children = await fs.readdir(filePath);
300
+ children.sort();
301
+ const parts = [];
302
+ for (const child of children) {
303
+ parts.push(`${child}:${await fingerprintPath(path.join(filePath, child))}`);
304
+ }
305
+ return `dir:${parts.join("|")}`;
306
+ }
307
+ return `special:${stat.mode}`;
308
+ }
309
+ async function verifySnapshot(configRoot, snapshot) {
310
+ try {
311
+ await ensureConfigRoot(configRoot);
312
+ for (const entry of snapshot.entries) {
313
+ const target = path.join(configRoot, entry.relativePath);
314
+ let targetFingerprint;
315
+ try {
316
+ targetFingerprint = await fingerprintPath(target);
317
+ }
318
+ catch (error) {
319
+ if (error.code !== "ENOENT")
320
+ return false;
321
+ }
322
+ if (!entry.existed) {
323
+ if (targetFingerprint !== undefined)
324
+ return false;
325
+ continue;
326
+ }
327
+ if (targetFingerprint === undefined)
328
+ return false;
329
+ const sourceFingerprint = await fingerprintPath(path.join(snapshot.path, entry.relativePath));
330
+ if (targetFingerprint !== sourceFingerprint)
331
+ return false;
332
+ }
333
+ return true;
334
+ }
335
+ catch {
336
+ return false;
337
+ }
338
+ }
339
+ async function writeReceipt(homeDir, receipt) {
340
+ await ensurePrivateStateRoot(homeDir);
341
+ const receiptPath = autoUpdateReceiptPath(homeDir);
342
+ const temporary = `${receiptPath}.${randomUUID()}.tmp`;
343
+ await fs.writeFile(temporary, `${JSON.stringify(receipt, null, 2)}\n`, { encoding: "utf8", mode: 0o600 });
344
+ await fs.rename(temporary, receiptPath);
345
+ await fs.chmod(receiptPath, 0o600).catch(() => undefined);
346
+ }
347
+ function parseDoctorOutput(output, currentVersion) {
348
+ try {
349
+ const parsed = JSON.parse(output.stdout ?? "");
350
+ const packageRecord = parsed.package;
351
+ const install = parsed.install;
352
+ const packageName = typeof packageRecord?.name === "string" ? packageRecord.name : undefined;
353
+ const version = typeof packageRecord?.version === "string" ? packageRecord.version : undefined;
354
+ const ok = packageName === autoUpdatePackageName && version === currentVersion && install?.ok === true;
355
+ return { ok, package: { name: packageName, version }, ...(ok ? {} : { error: "post-install doctor did not verify exact package identity and install surfaces" }) };
356
+ }
357
+ catch (error) {
358
+ return { ok: false, error: `post-install doctor returned invalid JSON: ${error instanceof Error ? error.message : String(error)}` };
359
+ }
360
+ }
361
+ async function packageEntrypoint(stageRoot, targetVersion) {
362
+ const packageRoot = path.join(stageRoot, "node_modules", autoUpdatePackageName);
363
+ const packageMetadata = JSON.parse(await fs.readFile(path.join(packageRoot, "package.json"), "utf8"));
364
+ if (packageMetadata.name !== autoUpdatePackageName || packageMetadata.version !== targetVersion) {
365
+ throw new Error("npm install produced a package with an unexpected stable name or version");
366
+ }
367
+ if (parseStableVersion(packageMetadata.version) === undefined)
368
+ throw new Error("npm install produced a non-stable package version");
369
+ const entrypoint = path.join(packageRoot, "bin", "litopencode.cjs");
370
+ const stat = await fs.lstat(entrypoint);
371
+ if (!stat.isFile() || stat.isSymbolicLink())
372
+ throw new Error("npm install produced an unsafe CLI entrypoint");
373
+ return entrypoint;
374
+ }
375
+ async function updateTransaction(options, homeDir, currentVersion, targetVersion, runCommand) {
376
+ const startedAt = Date.now();
377
+ const spec = `${autoUpdatePackageName}@${targetVersion}`;
378
+ const journalPath = autoUpdateJournalPath(homeDir);
379
+ await ensureConfigRoot(options.configRoot);
380
+ const snapshot = await captureSnapshot(options.configRoot, homeDir);
381
+ const stageRoot = path.join(stateRoot(homeDir), `.auto-update-stage-${randomUUID()}`);
382
+ let doctor = { ok: false, error: "post-install doctor did not run" };
383
+ let rollback = { ok: true };
384
+ let status = "failed";
385
+ // A staged package is considered known while no host mutation has started.
386
+ // Once an installer/doctor child is in flight, a timeout or signal makes the
387
+ // resulting host state unknown until the snapshot is restored and verified.
388
+ let stagedStateKnown = true;
389
+ let priorStateVerified = false;
390
+ try {
391
+ await fs.mkdir(stageRoot, { recursive: true, mode: 0o700 });
392
+ await fs.writeFile(path.join(stageRoot, "package.json"), '{"private":true}\n', { encoding: "utf8", mode: 0o600 });
393
+ const npmrcPath = path.join(stageRoot, ".npmrc");
394
+ await fs.writeFile(npmrcPath, "# LitOpenCode automatic-update transaction\n", { encoding: "utf8", mode: 0o600 });
395
+ await appendJournal(homeDir, "begin", { reason: options.reason, currentVersion, targetVersion, spec, configRoot: options.configRoot });
396
+ const childEnv = {
397
+ ...sanitizedNpmEnvironment(options.env),
398
+ // Prevent npm from reading a user's HOME/.npmrc while retaining a
399
+ // deterministic, empty config for registry resolution.
400
+ NPM_CONFIG_USERCONFIG: npmrcPath
401
+ };
402
+ const npmArgs = [
403
+ "install",
404
+ "--prefix",
405
+ stageRoot,
406
+ "--ignore-scripts",
407
+ "--no-audit",
408
+ "--no-fund",
409
+ "--no-package-lock",
410
+ "--no-save",
411
+ spec
412
+ ];
413
+ await bounded(() => runCommand("npm", npmArgs, { cwd: stageRoot, env: childEnv, timeout: autoUpdateTimeoutMs, maxBuffer: maxCommandOutputBytes }), autoUpdateTimeoutMs);
414
+ await appendJournal(homeDir, "npm-install", { spec });
415
+ const entrypoint = await packageEntrypoint(stageRoot, targetVersion);
416
+ const installArgs = [entrypoint, "install", "--root", options.configRoot, "--no-model-prompt", "--no-permission-prompt", "--no-auto-update"];
417
+ stagedStateKnown = false;
418
+ await bounded(() => runCommand(process.execPath, installArgs, { cwd: options.configRoot, env: childEnv, timeout: autoUpdateTimeoutMs, maxBuffer: maxCommandOutputBytes }), autoUpdateTimeoutMs);
419
+ stagedStateKnown = true;
420
+ await appendJournal(homeDir, "install", { spec });
421
+ const doctorArgs = [entrypoint, "doctor", "--root", options.configRoot, "--json", "--no-auto-update"];
422
+ stagedStateKnown = false;
423
+ const doctorOutput = await bounded(() => runCommand(process.execPath, doctorArgs, { cwd: options.configRoot, env: childEnv, timeout: autoUpdateTimeoutMs, maxBuffer: maxCommandOutputBytes }), autoUpdateTimeoutMs);
424
+ doctor = parseDoctorOutput(doctorOutput, targetVersion);
425
+ stagedStateKnown = doctor.package?.name !== undefined && doctor.package.version !== undefined;
426
+ await appendJournal(homeDir, "doctor", { ok: doctor.ok, package: doctor.package, error: doctor.error });
427
+ if (!doctor.ok)
428
+ throw new Error(doctor.error ?? "post-install doctor failed");
429
+ status = "updated";
430
+ await appendJournal(homeDir, "updated", { spec });
431
+ }
432
+ catch (error) {
433
+ const failure = commandFailure(error);
434
+ await tryAppendJournal(homeDir, "failure", { error: failure });
435
+ try {
436
+ await restoreSnapshot(options.configRoot, snapshot);
437
+ priorStateVerified = await verifySnapshot(options.configRoot, snapshot);
438
+ if (!priorStateVerified)
439
+ throw new Error("automatic update rollback could not verify the prior config and managed surfaces");
440
+ rollback = { ok: true };
441
+ status = "rolled-back";
442
+ await tryAppendJournal(homeDir, "rollback", { ok: true, priorStateVerified, stagedStateKnown });
443
+ }
444
+ catch (rollbackError) {
445
+ rollback = { ok: false, error: commandFailure(rollbackError) };
446
+ status = "failed";
447
+ await tryAppendJournal(homeDir, "rollback", { ok: false, error: rollback.error, priorStateVerified, stagedStateKnown });
448
+ }
449
+ }
450
+ finally {
451
+ await fs.rm(stageRoot, { recursive: true, force: true });
452
+ if (status === "updated")
453
+ await fs.rm(snapshot.path, { recursive: true, force: true });
454
+ }
455
+ const receipt = {
456
+ schemaVersion: 1,
457
+ status,
458
+ reason: options.reason,
459
+ currentVersion,
460
+ targetVersion,
461
+ spec,
462
+ configRoot: options.configRoot,
463
+ startedAt,
464
+ finishedAt: Date.now(),
465
+ journalPath,
466
+ backupPath: snapshot.path,
467
+ backupRetained: status !== "updated",
468
+ priorStateVerified: status === "updated" ? true : priorStateVerified,
469
+ stagedStateKnown,
470
+ doctor,
471
+ rollback
472
+ };
473
+ await writeReceipt(homeDir, receipt);
474
+ return {
475
+ status,
476
+ currentVersion,
477
+ targetVersion,
478
+ spec,
479
+ receiptPath: autoUpdateReceiptPath(homeDir),
480
+ backupPath: snapshot.path,
481
+ priorStateVerified: receipt.priorStateVerified,
482
+ stagedStateKnown,
483
+ ...(status === "rolled-back" || status === "failed" ? { rollback } : {})
484
+ };
485
+ }
486
+ export async function runAutoUpdate(options) {
487
+ const env = options.env ?? process.env;
488
+ if (isAutoUpdateDisabled(env, options.argv))
489
+ return { status: "skipped", reason: "disabled" };
490
+ if (parseStableVersion(options.currentVersion) === undefined)
491
+ return { status: "skipped", reason: "invalid-current-version" };
492
+ const homeDir = options.homeDir ?? os.homedir();
493
+ const fetchLatestVersion = options.fetchLatestVersion ?? requestRegistryLatestVersion;
494
+ let targetVersion;
495
+ try {
496
+ targetVersion = await bounded(fetchLatestVersion, autoUpdateTimeoutMs);
497
+ }
498
+ catch {
499
+ return { status: "skipped", currentVersion: options.currentVersion, reason: "registry-unavailable" };
500
+ }
501
+ if (parseStableVersion(targetVersion) === undefined)
502
+ return { status: "skipped", currentVersion: options.currentVersion, reason: "invalid-latest-version" };
503
+ const comparison = compareStableVersions(targetVersion, options.currentVersion);
504
+ if (comparison !== 1)
505
+ return { status: "skipped", currentVersion: options.currentVersion, targetVersion, reason: "up-to-date" };
506
+ const lock = await acquireInstallLock(homeDir);
507
+ if (lock === undefined)
508
+ return { status: "skipped", currentVersion: options.currentVersion, targetVersion, reason: "install-lock-busy" };
509
+ try {
510
+ await ensurePrivateStateRoot(homeDir);
511
+ const runCommand = options.runCommand ?? defaultRunCommand;
512
+ return await updateTransaction(options, homeDir, options.currentVersion, targetVersion, runCommand);
513
+ }
514
+ finally {
515
+ await releaseInstallLock(lock);
516
+ }
517
+ }
518
+ /**
519
+ * A failed transaction is safe to leave in place only when the old managed
520
+ * state was restored and verified. Unknown child state or an unverified
521
+ * rollback must stop the host from claiming a successful install.
522
+ */
523
+ export function canContinueAfterAutoUpdate(result) {
524
+ if (result.status === "updated" || result.status === "skipped")
525
+ return true;
526
+ return result.status === "rolled-back" && result.rollback?.ok === true && result.priorStateVerified === true && result.stagedStateKnown === true;
527
+ }
528
+ export function autoUpdateDiagnostic(result) {
529
+ const receipt = result.receiptPath ?? autoUpdateReceiptPath();
530
+ const backup = result.backupPath === undefined ? "" : ` Retained backup: ${result.backupPath}.`;
531
+ return `Automatic update stopped without claiming success (${result.status}). Inspect the receipt at ${receipt}.${backup}`;
532
+ }
533
+ /** Read only the bounded safety summary used by doctor; never echo command output. */
534
+ export async function readAutoUpdateReceipt(homeDir = os.homedir()) {
535
+ const receiptPath = autoUpdateReceiptPath(homeDir);
536
+ try {
537
+ const stat = await fs.lstat(receiptPath);
538
+ if (stat.isSymbolicLink() || !stat.isFile())
539
+ return { status: "unreadable" };
540
+ if (typeof process.getuid === "function" && stat.uid !== process.getuid())
541
+ return { status: "unreadable" };
542
+ if ((stat.mode & 0o077) !== 0)
543
+ return { status: "unreadable" };
544
+ const parsed = JSON.parse(await fs.readFile(receiptPath, "utf8"));
545
+ if (parsed.schemaVersion !== 1 ||
546
+ (parsed.status !== "updated" && parsed.status !== "rolled-back" && parsed.status !== "failed" && parsed.status !== "skipped") ||
547
+ typeof parsed.backupPath !== "string" ||
548
+ typeof parsed.backupRetained !== "boolean" ||
549
+ typeof parsed.priorStateVerified !== "boolean" ||
550
+ typeof parsed.stagedStateKnown !== "boolean" ||
551
+ typeof parsed.rollback?.ok !== "boolean" ||
552
+ typeof parsed.finishedAt !== "number") {
553
+ return { status: "unreadable" };
554
+ }
555
+ return {
556
+ status: parsed.status,
557
+ backupPath: parsed.backupPath,
558
+ backupRetained: parsed.backupRetained,
559
+ priorStateVerified: parsed.priorStateVerified,
560
+ stagedStateKnown: parsed.stagedStateKnown,
561
+ rollbackOk: parsed.rollback.ok,
562
+ finishedAt: parsed.finishedAt
563
+ };
564
+ }
565
+ catch (error) {
566
+ if (error.code === "ENOENT")
567
+ return undefined;
568
+ return { status: "unreadable" };
569
+ }
570
+ }
571
+ async function isLocalCheckout(packageRoot) {
572
+ try {
573
+ const stat = await fs.lstat(path.join(packageRoot, ".git"));
574
+ return stat.isDirectory() || stat.isFile();
575
+ }
576
+ catch {
577
+ return false;
578
+ }
579
+ }
580
+ export async function runPluginAutoUpdate() {
581
+ const metadata = await readPackageMetadata();
582
+ if (await isLocalCheckout(metadata.packageRoot))
583
+ return { status: "skipped", reason: "local-checkout" };
584
+ return await runAutoUpdate({
585
+ reason: "plugin",
586
+ configRoot: defaultOpenCodeConfigRoot(),
587
+ currentVersion: metadata.version,
588
+ env: process.env
589
+ });
590
+ }
591
+ export async function runInteractiveAutoUpdate(input) {
592
+ if (!shouldRunInteractiveAutoUpdate(input))
593
+ return { status: "skipped", reason: "ineligible" };
594
+ const metadata = await readPackageMetadata();
595
+ if (await isLocalCheckout(metadata.packageRoot))
596
+ return { status: "skipped", reason: "local-checkout" };
597
+ return await runAutoUpdate({
598
+ reason: "management",
599
+ configRoot: input.configRoot ?? defaultOpenCodeConfigRoot(),
600
+ currentVersion: metadata.version,
601
+ env: input.env,
602
+ argv: input.argv
603
+ });
604
+ }
@@ -0,0 +1,2 @@
1
+ export type CommandAliasOwnership = "missing" | "managed" | "preserved";
2
+ export declare function commandAliasOwnership(root: string, id: string): Promise<CommandAliasOwnership>;
@@ -0,0 +1,14 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { hasLitOpenCodeGeneratedFileMarker } from "../user-facing-markdown.js";
4
+ export async function commandAliasOwnership(root, id) {
5
+ try {
6
+ const existing = await fs.readFile(path.join(root, "command", id + ".md"), "utf8");
7
+ return hasLitOpenCodeGeneratedFileMarker(existing) ? "managed" : "preserved";
8
+ }
9
+ catch (error) {
10
+ if (error instanceof Error && "code" in error && error.code === "ENOENT")
11
+ return "missing";
12
+ throw error;
13
+ }
14
+ }
@@ -0,0 +1,12 @@
1
+ import type { InstallReport } from "./types.ts";
2
+ export declare function describeCommandAliasMutation(root: string): Promise<InstallReport["commandAliases"]>;
3
+ export declare function inspectCommandAliases(root: string): Promise<{
4
+ readonly path: string;
5
+ readonly expected: readonly string[];
6
+ readonly present: readonly string[];
7
+ readonly missing: readonly string[];
8
+ readonly managed: readonly string[];
9
+ readonly preserved: readonly string[];
10
+ readonly ok: boolean;
11
+ }>;
12
+ export declare function ensureCommandAliases(root: string): Promise<void>;