@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,193 @@
1
+ #!/usr/bin/env node
2
+ import { createHash } from "node:crypto";
3
+ import fs from "node:fs/promises";
4
+ import path from "node:path";
5
+ import process from "node:process";
6
+ import { fileURLToPath, pathToFileURL } from "node:url";
7
+ import { canonicalJson } from "./canonical-json.mjs";
8
+ import { parseRfc4180 } from "./csv.mjs";
9
+ import { parseStrictJson } from "./strict-json.mjs";
10
+
11
+ const exactCommit = "1307d97a72e6c1cda572cb65471ae5ce82995218";
12
+ const exactDatasetSha = "a89011236a6ff14e12ec55fccbfab1bbd40ae34614cea5710c022121aa841bb8";
13
+ const decoder = new TextDecoder("utf-8", { fatal: true });
14
+ const scriptDir = path.dirname(fileURLToPath(import.meta.url));
15
+ const provenancePath = path.resolve(scriptDir, "../data/PROVENANCE.json");
16
+ const datasetPath = path.resolve(scriptDir, "../data/design-intelligence.json");
17
+
18
+ function sha256(value) {
19
+ return createHash("sha256").update(value).digest("hex");
20
+ }
21
+
22
+ function parseArgs(argv) {
23
+ const options = {};
24
+ for (let index = 0; index < argv.length; index += 1) {
25
+ const flag = argv[index];
26
+ if (flag === "--check") options.check = true;
27
+ else if (["--source-root", "--expect-records", "--max-bytes"].includes(flag)) {
28
+ if (argv[index + 1] === undefined) throw new Error(`${flag} requires a value`);
29
+ options[flag.slice(2).replaceAll("-", "_")] = argv[++index];
30
+ } else {
31
+ throw new Error(`unknown option: ${flag}`);
32
+ }
33
+ }
34
+ if (!options.source_root || !options.check) {
35
+ throw new Error("usage: import-design-intelligence.mjs --source-root ROOT --check --expect-records N --max-bytes N");
36
+ }
37
+ options.expect_records = Number(options.expect_records);
38
+ options.max_bytes = Number(options.max_bytes);
39
+ if (!Number.isSafeInteger(options.expect_records) || options.expect_records < 1) {
40
+ throw new Error("--expect-records must be a positive integer");
41
+ }
42
+ if (!Number.isSafeInteger(options.max_bytes) || options.max_bytes < 1) {
43
+ throw new Error("--max-bytes must be a positive integer");
44
+ }
45
+ return options;
46
+ }
47
+
48
+ function contained(root, candidate) {
49
+ const relative = path.relative(root, candidate);
50
+ return relative !== ".." && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative);
51
+ }
52
+
53
+ export async function resolveContainedRegularFile(filePath, root) {
54
+ const canonicalRoot = await fs.realpath(path.resolve(root));
55
+ const absolute = path.resolve(canonicalRoot, filePath);
56
+ const relative = path.relative(canonicalRoot, absolute);
57
+ if (relative.startsWith(`..${path.sep}`) || relative === ".." || path.isAbsolute(relative)) {
58
+ throw new Error(`source path escapes root: ${filePath}`);
59
+ }
60
+ let parent = canonicalRoot;
61
+ for (const segment of relative.split(path.sep).slice(0, -1)) {
62
+ parent = path.join(parent, segment);
63
+ const parentStat = await fs.lstat(parent);
64
+ if (parentStat.isSymbolicLink() || !parentStat.isDirectory()) {
65
+ throw new Error(`source parent must be a contained non-symlink directory: ${filePath}`);
66
+ }
67
+ }
68
+ const stat = await fs.lstat(absolute);
69
+ if (stat.isSymbolicLink() || !stat.isFile()) throw new Error(`source must be a regular non-symlink file: ${filePath}`);
70
+ const resolved = await fs.realpath(absolute);
71
+ if (!contained(canonicalRoot, resolved)) throw new Error(`resolved source escapes root: ${filePath}`);
72
+ return resolved;
73
+ }
74
+
75
+ function normalizeSource(raw, entry) {
76
+ if (raw.includes(0)) throw new Error(`NUL byte: ${entry.path}`);
77
+ let text;
78
+ try {
79
+ text = decoder.decode(raw);
80
+ } catch {
81
+ throw new Error(`invalid UTF-8: ${entry.path}`);
82
+ }
83
+ text = text.replaceAll("\r\n", "\n").replaceAll("\r", "\n");
84
+ if (entry.repair) {
85
+ const exactRepair =
86
+ entry.path === "src/ui-ux-pro-max/data/stacks/javafx.csv" &&
87
+ entry.repair.rule === "backslash_quote_to_rfc4180_double_quote" &&
88
+ entry.repair.occurrences === 18;
89
+ if (!exactRepair || text.split('\\"').length - 1 !== 18) throw new Error(`unapproved repair: ${entry.path}`);
90
+ text = text.replaceAll('\\"', '""');
91
+ if (sha256(Buffer.from(text)) !== entry.repair.repaired_sha256) throw new Error(`repair hash mismatch: ${entry.path}`);
92
+ }
93
+ return text;
94
+ }
95
+
96
+ function entryRecords(rows, entry) {
97
+ const header = rows[0];
98
+ if (new Set(header).size !== header.length || JSON.stringify(header) !== JSON.stringify(entry.header)) {
99
+ throw new Error(`header drift: ${entry.path}`);
100
+ }
101
+ if (rows.length - 1 !== entry.data_row_count) throw new Error(`row count drift: ${entry.path}`);
102
+ const positions = Object.fromEntries(entry.selected_columns.map((column) => [column, header.indexOf(column)]));
103
+ if (Object.values(positions).some((position) => position < 0)) throw new Error(`selected-column drift: ${entry.path}`);
104
+ const stack = entry.path.includes("/stacks/") ? path.basename(entry.path, ".csv") : undefined;
105
+ const domain = stack ? `stack/${stack}` : path.basename(entry.path, ".csv");
106
+ const records = rows.slice(1).map((row, rowIndex) => {
107
+ const record = Object.fromEntries(
108
+ entry.selected_columns.map((column) => [column, row[positions[column]].trim()])
109
+ );
110
+ const number = Number(record.No);
111
+ if (!Number.isSafeInteger(number) || number < 1 || String(number) !== record.No) {
112
+ throw new Error(`non-canonical No: ${entry.path}:${rowIndex + 2}`);
113
+ }
114
+ record.No = number;
115
+ record.domain = domain;
116
+ record.record_id = `${domain}/${number}`;
117
+ if (stack) record.stack = stack;
118
+ return record;
119
+ });
120
+ if (records.length !== entry.normalized_record_count) throw new Error(`normalized count drift: ${entry.path}`);
121
+ return records;
122
+ }
123
+
124
+ async function loadContract() {
125
+ const provenance = parseStrictJson(await fs.readFile(provenancePath, "utf8"));
126
+ if (
127
+ provenance.source?.commit !== exactCommit ||
128
+ provenance.import_manifest?.source_count !== 34 ||
129
+ !Array.isArray(provenance.sources) ||
130
+ provenance.sources.length !== 34 ||
131
+ new Set(provenance.sources.map((entry) => entry.path)).size !== 34
132
+ ) throw new Error("packaged provenance contract mismatch");
133
+ return provenance;
134
+ }
135
+
136
+ export async function importDesignIntelligence(options) {
137
+ const root = await fs.realpath(path.resolve(options.source_root));
138
+ const provenance = await loadContract();
139
+ const records = [];
140
+ const ids = new Set();
141
+ for (const entry of provenance.sources) {
142
+ const file = await resolveContainedRegularFile(entry.path, root);
143
+ const raw = await fs.readFile(file);
144
+ if (sha256(raw) !== entry.raw_sha256) throw new Error(`source hash mismatch: ${entry.path}`);
145
+ const rows = parseRfc4180(normalizeSource(raw, entry), entry.path);
146
+ for (const record of entryRecords(rows, entry)) {
147
+ if (ids.has(record.record_id)) throw new Error(`duplicate record id: ${record.record_id}`);
148
+ ids.add(record.record_id);
149
+ records.push(record);
150
+ }
151
+ }
152
+ if (records.length !== options.expect_records) throw new Error(`record count mismatch: ${records.length}`);
153
+ const bytes = Buffer.from(canonicalJson({
154
+ records,
155
+ schema_version: "litfamily.design-intelligence/v1",
156
+ source_commit: exactCommit
157
+ }));
158
+ if (bytes.length > options.max_bytes) throw new Error(`payload exceeds byte limit: ${bytes.length}`);
159
+ if (sha256(bytes) !== exactDatasetSha) throw new Error(`canonical dataset hash mismatch: ${sha256(bytes)}`);
160
+ if (!(await fs.readFile(datasetPath)).equals(bytes)) throw new Error("packaged canonical dataset differs from import");
161
+ return { bytes: bytes.length, records: records.length, sha256: exactDatasetSha };
162
+ }
163
+
164
+ export async function main(argv = process.argv.slice(2)) {
165
+ const result = await importDesignIntelligence(parseArgs(argv));
166
+ process.stdout.write(
167
+ `status=SOURCE_CONTRACT_PASS records=${result.records} bytes=${result.bytes} sha256=${result.sha256}\n`
168
+ );
169
+ }
170
+
171
+ export async function isDirectExecution(
172
+ argvPath = process.argv[1],
173
+ modulePath = fileURLToPath(import.meta.url),
174
+ filesystem = fs
175
+ ) {
176
+ if (!argvPath) return false;
177
+ const canonicalPath = (value) =>
178
+ path.resolve(value)
179
+ .replace(/^\/tmp\//u, "/private/tmp/")
180
+ .replace(/^\/private\/(?:private\/)+tmp\//u, "/private/tmp/");
181
+ try {
182
+ return canonicalPath(await filesystem.realpath(argvPath)) === canonicalPath(await filesystem.realpath(modulePath));
183
+ } catch {
184
+ return canonicalPath(argvPath) === canonicalPath(modulePath);
185
+ }
186
+ }
187
+
188
+ if (await isDirectExecution()) {
189
+ main().catch((error) => {
190
+ process.stderr.write(`status=SOURCE_CONTRACT_FAIL error=${error instanceof Error ? error.message : String(error)}\n`);
191
+ process.exitCode = 2;
192
+ });
193
+ }
@@ -0,0 +1,92 @@
1
+ import { canonicalJson, canonicalizeValue } from "./canonical-json.mjs";
2
+ import { readCanonicalDesignIntelligence } from "./dataset.mjs";
3
+
4
+ const maximumQueryBytes = 4096;
5
+ const maximumRecordsPerDomain = 20;
6
+ const maximumOutputBytes = 256 * 1024;
7
+ const domainAliases = Object.freeze({
8
+ components: ["app-interface", "icons", "ui-reasoning", "ux-guidelines"]
9
+ });
10
+
11
+ function normalizeRequest(request) {
12
+ if (request === null || typeof request !== "object" || Array.isArray(request)) {
13
+ throw new TypeError("Retrieval request must be an object");
14
+ }
15
+ if (typeof request.query !== "string") throw new TypeError("Retrieval query must be a string");
16
+ if (Buffer.byteLength(request.query, "utf8") > maximumQueryBytes) {
17
+ throw new Error("Retrieval query exceeds 4 KiB (4096 UTF-8 bytes)");
18
+ }
19
+ if (!Array.isArray(request.domains) || request.domains.length === 0) {
20
+ throw new Error("Retrieval request must name at least one domain");
21
+ }
22
+ const domains = [...new Set(request.domains)];
23
+ if (domains.some((domain) => typeof domain !== "string" || domain === "")) {
24
+ throw new Error("Retrieval domains must be non-empty strings");
25
+ }
26
+ const limit = request.limit === undefined ? maximumRecordsPerDomain : request.limit;
27
+ if (!Number.isInteger(limit) || limit < 1 || limit > maximumRecordsPerDomain) {
28
+ throw new Error(`Retrieval limit must be an integer from 1 to ${maximumRecordsPerDomain}`);
29
+ }
30
+ return {
31
+ query: request.query.normalize("NFKC").trim().toLocaleLowerCase("en-US"),
32
+ domains,
33
+ limit
34
+ };
35
+ }
36
+
37
+ function searchableText(record) {
38
+ return Object.entries(record)
39
+ .filter(([key]) => key !== "record_id")
40
+ .map(([, value]) => (typeof value === "string" || typeof value === "number" ? String(value) : ""))
41
+ .join(" ")
42
+ .normalize("NFKC")
43
+ .toLocaleLowerCase("en-US");
44
+ }
45
+
46
+ function rankedRecords(records, domain, query, limit) {
47
+ const sourceDomains = domainAliases[domain] ?? [domain];
48
+ const tokens = query.split(/\s+/u).filter(Boolean);
49
+ if (tokens.length === 0) return [];
50
+ return records
51
+ .filter((record) => sourceDomains.includes(record.domain))
52
+ .map((record) => {
53
+ const text = searchableText(record);
54
+ const score = tokens.reduce((total, token) => total + (text.includes(token) ? 1 : 0), 0);
55
+ return { record, score };
56
+ })
57
+ .filter((entry) => entry.score > 0)
58
+ .sort((left, right) => right.score - left.score || left.record.record_id.localeCompare(right.record.record_id))
59
+ .slice(0, limit)
60
+ .map(({ record, score }) =>
61
+ canonicalizeValue({
62
+ ...record,
63
+ domain,
64
+ source_domain: record.domain,
65
+ relevance: score
66
+ })
67
+ );
68
+ }
69
+
70
+ export async function retrieveDesignIntelligence(request) {
71
+ const normalized = normalizeRequest(request);
72
+ const dataset = await readCanonicalDesignIntelligence();
73
+ const knownDomains = new Set(dataset.records.map((record) => record.domain));
74
+ for (const domain of normalized.domains) {
75
+ if (!(domain in domainAliases) && !knownDomains.has(domain)) throw new Error(`Unknown domain: ${domain}`);
76
+ }
77
+ const records = normalized.domains.flatMap((domain) =>
78
+ rankedRecords(dataset.records, domain, normalized.query, normalized.limit)
79
+ );
80
+ const output = canonicalizeValue({
81
+ fabricated: false,
82
+ fallbackApplied: false,
83
+ query: normalized.query,
84
+ records,
85
+ schema_version: "litfamily.design-intelligence-retrieval/v1alpha1",
86
+ total: records.length
87
+ });
88
+ if (Buffer.byteLength(canonicalJson(output), "utf8") > maximumOutputBytes) {
89
+ throw new Error("Retrieval output exceeds 256 KiB");
90
+ }
91
+ return output;
92
+ }
@@ -0,0 +1,237 @@
1
+ import { createHash } from "node:crypto";
2
+ import { constants } from "node:fs";
3
+ import fs from "node:fs/promises";
4
+ import path from "node:path";
5
+
6
+ function identity(stat) {
7
+ return Object.freeze({
8
+ dev: stat.dev,
9
+ ino: stat.ino,
10
+ ctimeNs: stat.ctimeNs,
11
+ mtimeNs: stat.mtimeNs,
12
+ size: stat.size,
13
+ mode: stat.mode
14
+ });
15
+ }
16
+
17
+ function sameDirectory(left, right) {
18
+ return left.dev === right.dev
19
+ && left.ino === right.ino
20
+ && left.ctimeNs === right.ctimeNs
21
+ && left.mtimeNs === right.mtimeNs;
22
+ }
23
+
24
+ function sameFile(left, right) {
25
+ return sameDirectory(left, right)
26
+ && left.size === right.size
27
+ && left.mode === right.mode;
28
+ }
29
+
30
+ function containedTarget(root, relativePath) {
31
+ if (typeof relativePath !== "string" || relativePath === "" || path.isAbsolute(relativePath)) {
32
+ throw new Error("stable file path must be a relative path");
33
+ }
34
+ const absoluteRoot = path.resolve(root);
35
+ const absoluteTarget = path.resolve(absoluteRoot, relativePath);
36
+ const relative = path.relative(absoluteRoot, absoluteTarget);
37
+ if (relative === "" || path.isAbsolute(relative) || relative === ".." || relative.startsWith(`..${path.sep}`)) {
38
+ throw new Error("stable file path escapes its root");
39
+ }
40
+ return { absoluteRoot, absoluteTarget };
41
+ }
42
+
43
+ function directoryChain(root, directory) {
44
+ const relative = path.relative(root, directory);
45
+ if (path.isAbsolute(relative) || relative === ".." || relative.startsWith(`..${path.sep}`)) {
46
+ throw new Error("stable file ancestor escapes its root");
47
+ }
48
+ const chain = [root];
49
+ let current = root;
50
+ for (const part of relative.split(path.sep).filter(Boolean)) {
51
+ current = path.join(current, part);
52
+ chain.push(current);
53
+ }
54
+ return chain;
55
+ }
56
+
57
+ async function closeAll(entries) {
58
+ for (const entry of [...entries].reverse()) await entry.handle.close().catch(() => {});
59
+ }
60
+
61
+ async function openAncestorChain(root, directory) {
62
+ if (typeof constants.O_NOFOLLOW !== "number" || typeof constants.O_DIRECTORY !== "number") {
63
+ throw new Error("no-follow directory reads are unavailable");
64
+ }
65
+ const opened = [];
66
+ try {
67
+ for (const absolutePath of directoryChain(root, directory)) {
68
+ const before = await fs.lstat(absolutePath, { bigint: true });
69
+ if (before.isSymbolicLink() || !before.isDirectory()) {
70
+ throw new Error(`canonical ancestor is not a regular directory: ${absolutePath}`);
71
+ }
72
+ const handle = await fs.open(
73
+ absolutePath,
74
+ constants.O_RDONLY | constants.O_DIRECTORY | constants.O_NOFOLLOW
75
+ );
76
+ const descriptor = await handle.stat({ bigint: true });
77
+ if (!descriptor.isDirectory() || !sameDirectory(identity(before), identity(descriptor))) {
78
+ await handle.close();
79
+ throw new Error(`canonical ancestor identity changed before open: ${absolutePath}`);
80
+ }
81
+ opened.push({ absolutePath, handle, snapshot: identity(descriptor) });
82
+ }
83
+ return opened;
84
+ } catch (error) {
85
+ await closeAll(opened);
86
+ throw error;
87
+ }
88
+ }
89
+
90
+ async function assertAncestorsStable(opened) {
91
+ for (const entry of opened) {
92
+ const descriptor = await entry.handle.stat({ bigint: true });
93
+ const named = await fs.lstat(entry.absolutePath, { bigint: true });
94
+ if (
95
+ !descriptor.isDirectory()
96
+ || named.isSymbolicLink()
97
+ || !named.isDirectory()
98
+ || !sameDirectory(entry.snapshot, identity(descriptor))
99
+ || !sameDirectory(entry.snapshot, identity(named))
100
+ ) {
101
+ throw new Error(`canonical ancestor identity changed during read: ${entry.absolutePath}`);
102
+ }
103
+ }
104
+ }
105
+
106
+ async function readBounded(handle, size) {
107
+ const bytes = Buffer.alloc(size);
108
+ let offset = 0;
109
+ while (offset < size) {
110
+ const { bytesRead } = await handle.read(bytes, offset, size - offset, offset);
111
+ if (bytesRead === 0) break;
112
+ offset += bytesRead;
113
+ }
114
+ const probe = Buffer.alloc(1);
115
+ const { bytesRead: grew } = await handle.read(probe, 0, 1, size);
116
+ if (offset !== size || grew !== 0) throw new Error("canonical file size changed during bounded read");
117
+ return bytes;
118
+ }
119
+
120
+ export async function readStableRegularFile(root, relativePath, options = {}) {
121
+ const maxBytes = options.maxBytes;
122
+ if (!Number.isSafeInteger(maxBytes) || maxBytes < 0) throw new Error("stable file maxBytes must be a non-negative safe integer");
123
+ if (typeof constants.O_NOFOLLOW !== "number") throw new Error("no-follow file reads are unavailable");
124
+
125
+ const { absoluteRoot, absoluteTarget } = containedTarget(root, relativePath);
126
+ const ancestors = await openAncestorChain(absoluteRoot, path.dirname(absoluteTarget));
127
+ let handle;
128
+ try {
129
+ const before = await fs.lstat(absoluteTarget, { bigint: true });
130
+ if (before.isSymbolicLink()) throw new Error(`canonical file is a symbolic link: ${relativePath}`);
131
+ if (!before.isFile()) throw new Error(`canonical file is a special file: ${relativePath}`);
132
+ if ((before.mode & 0o444n) === 0n) throw new Error(`canonical file is unreadable: ${relativePath}`);
133
+ if (before.size > BigInt(maxBytes) || before.size > BigInt(Number.MAX_SAFE_INTEGER)) {
134
+ throw new Error(`canonical file exceeds the ${maxBytes}-byte read limit: ${relativePath}`);
135
+ }
136
+
137
+ handle = await fs.open(absoluteTarget, constants.O_RDONLY | constants.O_NOFOLLOW);
138
+ const opened = await handle.stat({ bigint: true });
139
+ if (!opened.isFile() || !sameFile(identity(before), identity(opened))) {
140
+ throw new Error(`canonical file identity changed before descriptor read: ${relativePath}`);
141
+ }
142
+ const bytes = await readBounded(handle, Number(opened.size));
143
+ if (typeof options.afterRead === "function") await options.afterRead(relativePath);
144
+
145
+ const descriptorAfter = await handle.stat({ bigint: true });
146
+ if (!descriptorAfter.isFile() || !sameFile(identity(opened), identity(descriptorAfter))) {
147
+ throw new Error(`canonical file identity changed during descriptor read: ${relativePath}`);
148
+ }
149
+ const namedAfter = await fs.lstat(absoluteTarget, { bigint: true });
150
+ if (namedAfter.isSymbolicLink() || !namedAfter.isFile() || !sameFile(identity(opened), identity(namedAfter))) {
151
+ throw new Error(`canonical file identity changed after descriptor read: ${relativePath}`);
152
+ }
153
+ await assertAncestorsStable(ancestors);
154
+
155
+ if (options.expectedSize !== undefined && bytes.byteLength !== options.expectedSize) {
156
+ throw new Error(`canonical file size changed: ${relativePath}`);
157
+ }
158
+ const sha256 = createHash("sha256").update(bytes).digest("hex");
159
+ if (options.expectedSha256 !== undefined && sha256 !== options.expectedSha256) {
160
+ throw new Error(`canonical file SHA-256 changed: ${relativePath}`);
161
+ }
162
+ const snapshot = Object.freeze({
163
+ root: absoluteRoot,
164
+ relativePath,
165
+ file: Object.freeze({ absolutePath: absoluteTarget, ...identity(opened) }),
166
+ ancestors: Object.freeze(ancestors.map((entry) => Object.freeze({
167
+ absolutePath: entry.absolutePath,
168
+ ...entry.snapshot
169
+ })))
170
+ });
171
+ return { bytes, sha256, snapshot };
172
+ } finally {
173
+ await handle?.close().catch(() => {});
174
+ await closeAll(ancestors);
175
+ }
176
+ }
177
+
178
+ export async function revalidateStableRegularFile(snapshot) {
179
+ if (
180
+ !snapshot
181
+ || typeof snapshot !== "object"
182
+ || typeof snapshot.root !== "string"
183
+ || typeof snapshot.relativePath !== "string"
184
+ || !snapshot.file
185
+ || !Array.isArray(snapshot.ancestors)
186
+ ) {
187
+ throw new Error("canonical snapshot is malformed");
188
+ }
189
+ if (!Object.isFrozen(snapshot) || !Object.isFrozen(snapshot.file) || !Object.isFrozen(snapshot.ancestors)) {
190
+ throw new Error("canonical snapshot is not immutable");
191
+ }
192
+
193
+ const { absoluteRoot, absoluteTarget } = containedTarget(snapshot.root, snapshot.relativePath);
194
+ if (absoluteRoot !== snapshot.root || absoluteTarget !== snapshot.file.absolutePath) {
195
+ throw new Error(`canonical snapshot path changed: ${snapshot.relativePath}`);
196
+ }
197
+ const ancestors = await openAncestorChain(absoluteRoot, path.dirname(absoluteTarget));
198
+ let handle;
199
+ try {
200
+ if (ancestors.length !== snapshot.ancestors.length) {
201
+ throw new Error(`canonical ancestor chain changed after consumption: ${snapshot.relativePath}`);
202
+ }
203
+ for (let index = 0; index < ancestors.length; index += 1) {
204
+ const current = ancestors[index];
205
+ const expected = snapshot.ancestors[index];
206
+ if (current.absolutePath !== expected.absolutePath || !sameDirectory(current.snapshot, expected)) {
207
+ throw new Error(`canonical ancestor identity changed after consumption: ${snapshot.relativePath}`);
208
+ }
209
+ }
210
+
211
+ const before = await fs.lstat(absoluteTarget, { bigint: true });
212
+ if (before.isSymbolicLink() || !before.isFile() || !sameFile(identity(before), snapshot.file)) {
213
+ throw new Error(`canonical file identity changed after consumption: ${snapshot.relativePath}`);
214
+ }
215
+ handle = await fs.open(absoluteTarget, constants.O_RDONLY | constants.O_NOFOLLOW);
216
+ const opened = await handle.stat({ bigint: true });
217
+ if (!opened.isFile() || !sameFile(identity(before), identity(opened)) || !sameFile(identity(opened), snapshot.file)) {
218
+ throw new Error(`canonical file descriptor identity changed after consumption: ${snapshot.relativePath}`);
219
+ }
220
+ const descriptorAfter = await handle.stat({ bigint: true });
221
+ const namedAfter = await fs.lstat(absoluteTarget, { bigint: true });
222
+ if (
223
+ !descriptorAfter.isFile()
224
+ || namedAfter.isSymbolicLink()
225
+ || !namedAfter.isFile()
226
+ || !sameFile(identity(opened), identity(descriptorAfter))
227
+ || !sameFile(identity(opened), identity(namedAfter))
228
+ ) {
229
+ throw new Error(`canonical file identity changed during revalidation: ${snapshot.relativePath}`);
230
+ }
231
+ await assertAncestorsStable(ancestors);
232
+ return true;
233
+ } finally {
234
+ await handle?.close().catch(() => {});
235
+ await closeAll(ancestors);
236
+ }
237
+ }
@@ -0,0 +1,16 @@
1
+ import { parseBoundedJson } from "./bounded-json.mjs";
2
+ import { jsonInvalid } from "./contract-error.mjs";
3
+
4
+ export const maximumStdinBytes = 1024 * 1024;
5
+
6
+ export async function readBoundedJsonStream(stream, { maxBytes = maximumStdinBytes } = {}) {
7
+ const chunks = [];
8
+ let total = 0;
9
+ for await (const chunk of stream) {
10
+ const bytes = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
11
+ total += bytes.length;
12
+ if (total > maxBytes) throw jsonInvalid(`stdin size ${total} bytes exceeds ${maxBytes} bytes`);
13
+ chunks.push(bytes);
14
+ }
15
+ return parseBoundedJson(Buffer.concat(chunks, total), { maxBytes });
16
+ }
@@ -0,0 +1,102 @@
1
+ import { argumentInvalid, jsonInvalid } from "./contract-error.mjs";
2
+
3
+ function fail(message, offset) {
4
+ throw jsonInvalid(`Malformed JSON at byte ${Buffer.byteLength(message.slice(0, offset), "utf8")}: ${message}`);
5
+ }
6
+
7
+ export function parseStrictJson(text) {
8
+ if (typeof text !== "string") throw argumentInvalid("JSON payload must be a UTF-8 string");
9
+ if (text.includes("\0")) throw jsonInvalid("Malformed JSON: NUL bytes are forbidden");
10
+ let index = 0;
11
+
12
+ function whitespace() {
13
+ while (index < text.length && /\s/u.test(text[index])) index += 1;
14
+ }
15
+
16
+ function string() {
17
+ const start = index;
18
+ index += 1;
19
+ while (index < text.length) {
20
+ if (text[index] === '"') {
21
+ index += 1;
22
+ try {
23
+ return JSON.parse(text.slice(start, index));
24
+ } catch {
25
+ fail("invalid string escape", start);
26
+ }
27
+ }
28
+ if (text[index] === "\\") index += 1;
29
+ index += 1;
30
+ }
31
+ fail("unterminated string", start);
32
+ }
33
+
34
+ function value() {
35
+ whitespace();
36
+ const token = text[index];
37
+ if (token === '"') return string();
38
+ if (token === "{") return object();
39
+ if (token === "[") return array();
40
+ const match = text.slice(index).match(/^(?:-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?|true|false|null)/u);
41
+ if (match === null) fail("invalid value", index);
42
+ index += match[0].length;
43
+ return JSON.parse(match[0]);
44
+ }
45
+
46
+ function object() {
47
+ index += 1;
48
+ whitespace();
49
+ const output = {};
50
+ const keys = new Set();
51
+ if (text[index] === "}") {
52
+ index += 1;
53
+ return output;
54
+ }
55
+ while (index < text.length) {
56
+ if (text[index] !== '"') fail("object key must be a string", index);
57
+ const key = string();
58
+ if (keys.has(key)) throw jsonInvalid(`Malformed JSON: duplicate key ${JSON.stringify(key)}`);
59
+ keys.add(key);
60
+ whitespace();
61
+ if (text[index] !== ":") fail("missing colon", index);
62
+ index += 1;
63
+ output[key] = value();
64
+ whitespace();
65
+ if (text[index] === "}") {
66
+ index += 1;
67
+ return output;
68
+ }
69
+ if (text[index] !== ",") fail("missing comma", index);
70
+ index += 1;
71
+ whitespace();
72
+ }
73
+ fail("unterminated object", index);
74
+ }
75
+
76
+ function array() {
77
+ index += 1;
78
+ whitespace();
79
+ const output = [];
80
+ if (text[index] === "]") {
81
+ index += 1;
82
+ return output;
83
+ }
84
+ while (index < text.length) {
85
+ output.push(value());
86
+ whitespace();
87
+ if (text[index] === "]") {
88
+ index += 1;
89
+ return output;
90
+ }
91
+ if (text[index] !== ",") fail("missing comma", index);
92
+ index += 1;
93
+ whitespace();
94
+ }
95
+ fail("unterminated array", index);
96
+ }
97
+
98
+ const parsed = value();
99
+ whitespace();
100
+ if (index !== text.length) fail("trailing non-whitespace", index);
101
+ return parsed;
102
+ }