@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,609 @@
1
+ // Executable Design Contract rules for litfamily.design-contract/v1alpha1.
2
+ //
3
+ // The neighbouring JSON Schema is a shape reference only. A schema document
4
+ // cannot express typed id prefixes, referential integrity between routes,
5
+ // regions, components, interactions and states, authenticated-surface safety
6
+ // coupling, global id uniqueness, duplicate JSON keys, or canonical hashing, so
7
+ // every rule a reviewer is allowed to rely on is enforced here instead.
8
+ //
9
+ // validateDesignContract never throws for an already-parsed value: it answers
10
+ // { valid, schema, issues }. Bytes that cannot be trusted at all fail earlier,
11
+ // in the strict parser and in the bounded reader.
12
+ import { parseStrictJson } from "./strict-json.mjs";
13
+
14
+ export const designContractSchemaId = "litfamily.design-contract/v1alpha1";
15
+ export const designContractBetaSchemaId = "litfamily.design-contract/v1beta1";
16
+ export const designContractBeta2SchemaId = "litfamily.design-contract/v1beta2";
17
+
18
+ const idGrammar = /^[a-z][a-z0-9-]*:[a-z0-9][a-z0-9._/-]*$/u;
19
+ const hashGrammar = /^[0-9a-f]{64}$/u;
20
+ const controlCharacter = /[\u0000-\u001f\u007f]/u;
21
+ const utcInstantGrammar = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{3})?Z$/u;
22
+
23
+ const rootKeys = Object.freeze([
24
+ "schema_id",
25
+ "contract_id",
26
+ "source_hash",
27
+ "intent",
28
+ "direction",
29
+ "inventory",
30
+ "accessibility",
31
+ "localization",
32
+ "performance",
33
+ "evidence_policy",
34
+ "omissions",
35
+ "accepted_exceptions"
36
+ ]);
37
+ const betaRootKeys = Object.freeze([
38
+ ...rootKeys,
39
+ "lane",
40
+ "tokens",
41
+ "component_behaviors",
42
+ "responsive_transformations",
43
+ "motion",
44
+ "acceptance_criteria"
45
+ ]);
46
+ // v1beta2 adds one optional root key. Optional is the whole point: a contract that
47
+ // says nothing about taste is complete, and a v1beta1 document keeps its meaning.
48
+ const beta2RootKeys = Object.freeze([...betaRootKeys, "taste"]);
49
+ // Direction expressed as numbers a reviewer can argue with, rather than adjectives
50
+ // they cannot.
51
+ const tasteDials = Object.freeze(["variance", "motion", "density"]);
52
+ const inventoryKeys = Object.freeze([
53
+ "routes",
54
+ "regions",
55
+ "components",
56
+ "interactions",
57
+ "states",
58
+ "viewports",
59
+ "references",
60
+ "authenticated_surfaces"
61
+ ]);
62
+ const stateKinds = Object.freeze([
63
+ "loading",
64
+ "empty",
65
+ "error",
66
+ "success",
67
+ "disabled",
68
+ "permission",
69
+ "offline",
70
+ "ready"
71
+ ]);
72
+ const inputModes = Object.freeze(["keyboard", "pointer", "touch", "voice", "switch"]);
73
+ const viewportCategories = Object.freeze(["compact", "medium", "expanded"]);
74
+ const referenceKinds = Object.freeze(["user-provided", "repo-local", "generated", "measured"]);
75
+ const tokenStrategies = Object.freeze(["reuse", "extend", "create"]);
76
+ const evidenceChannels = Object.freeze([
77
+ "tests",
78
+ "browser",
79
+ "keyboard",
80
+ "accessibility-tree",
81
+ "screen-reader",
82
+ "performance",
83
+ "localization"
84
+ ]);
85
+ const lanes = Object.freeze(["new-build", "brownfield", "redesign", "reference-fidelity", "design-system"]);
86
+ const tokenCategories = Object.freeze(["color", "typography", "spacing", "radius", "shadow", "motion", "other"]);
87
+ const motionPolicies = Object.freeze(["none", "functional", "expressive"]);
88
+ const verificationMethods = Object.freeze([...evidenceChannels, "manual"]);
89
+
90
+ function isObject(value) {
91
+ return value !== null && typeof value === "object" && !Array.isArray(value);
92
+ }
93
+
94
+ function isLine(value) {
95
+ return typeof value === "string" && value.trim().length > 0 && !controlCharacter.test(value);
96
+ }
97
+
98
+ function isBetaText(value) {
99
+ return isLine(value) && [...value].length <= 512;
100
+ }
101
+
102
+ function isId(value) {
103
+ return typeof value === "string" && idGrammar.test(value);
104
+ }
105
+
106
+ function isTypedId(value, prefix) {
107
+ return isId(value) && value.startsWith(`${prefix}:`);
108
+ }
109
+
110
+ function isHash(value) {
111
+ return typeof value === "string" && hashGrammar.test(value);
112
+ }
113
+
114
+ function isBoundedInteger(value, minimum, maximum) {
115
+ return Number.isInteger(value) && value >= minimum && value <= maximum;
116
+ }
117
+
118
+ function isBoundedNumber(value, minimum, maximum) {
119
+ return typeof value === "number" && Number.isFinite(value) && value >= minimum && value <= maximum;
120
+ }
121
+
122
+ // Strict ISO-8601 UTC. The grammar rejects offsets, microseconds and a lowercase
123
+ // designator; the round trip then rejects instants the host silently rolls over,
124
+ // such as a 31st of February or an hour of 24.
125
+ function isUtcInstant(value) {
126
+ if (typeof value !== "string" || !utcInstantGrammar.test(value)) return false;
127
+ const milliseconds = Date.parse(value);
128
+ if (!Number.isFinite(milliseconds)) return false;
129
+ const declared = value.includes(".") ? value : `${value.slice(0, -1)}.000Z`;
130
+ return new Date(milliseconds).toISOString() === declared;
131
+ }
132
+
133
+ function keys(value, { allowed, required = allowed }, label, issues) {
134
+ if (!isObject(value)) {
135
+ issues.push(`${label} must be an object`);
136
+ return false;
137
+ }
138
+ for (const key of Object.keys(value)) {
139
+ if (!allowed.includes(key)) issues.push(`${label} declares the unsupported key ${key}`);
140
+ }
141
+ for (const key of required) {
142
+ if (!Object.hasOwn(value, key)) issues.push(`${label} is missing ${key}`);
143
+ }
144
+ return true;
145
+ }
146
+
147
+ function records(value, label, issues) {
148
+ if (!Array.isArray(value)) {
149
+ issues.push(`${label} must be an array`);
150
+ return [];
151
+ }
152
+ return value.filter((item, index) => {
153
+ if (isObject(item)) return true;
154
+ issues.push(`${label}[${index}] must be an object`);
155
+ return false;
156
+ });
157
+ }
158
+
159
+ function lines(value, label, issues, { minimum = 0, maximum = Number.POSITIVE_INFINITY } = {}) {
160
+ if (!Array.isArray(value)) {
161
+ issues.push(`${label} must be an array`);
162
+ return;
163
+ }
164
+ if (value.length < minimum) issues.push(`${label} must declare at least ${minimum} entries`);
165
+ if (value.length > maximum) issues.push(`${label} must declare at most ${maximum} entries`);
166
+ if (value.some((item) => !isLine(item))) issues.push(`${label} entries must be non-empty single-line text`);
167
+ if (new Set(value).size !== value.length) issues.push(`${label} entries must be unique`);
168
+ }
169
+
170
+ function enumSubset(value, allowed, label, issues) {
171
+ if (!Array.isArray(value) || value.length === 0) {
172
+ issues.push(`${label} must name at least one supported value`);
173
+ return;
174
+ }
175
+ if (value.some((item) => !allowed.includes(item))) issues.push(`${label} names an unsupported value`);
176
+ if (new Set(value).size !== value.length) issues.push(`${label} entries must be unique`);
177
+ }
178
+
179
+ function booleans(value, fields, label, issues) {
180
+ for (const field of fields) {
181
+ if (typeof value[field] !== "boolean") issues.push(`${label}.${field} must be true or false`);
182
+ }
183
+ }
184
+
185
+ function checkIntent(value, issues) {
186
+ if (!keys(value, { allowed: ["audiences", "tasks", "qualities", "constraints", "non_goals"] }, "intent", issues)) {
187
+ return;
188
+ }
189
+ for (const field of ["audiences", "tasks", "qualities"]) {
190
+ lines(value[field], `intent.${field}`, issues, { minimum: 1 });
191
+ }
192
+ for (const field of ["constraints", "non_goals"]) {
193
+ lines(value[field], `intent.${field}`, issues);
194
+ }
195
+ }
196
+
197
+ function checkDirection(value, issues) {
198
+ if (!keys(value, { allowed: ["name", "principles", "token_strategy", "voice"] }, "direction", issues)) return;
199
+ for (const field of ["name", "voice"]) {
200
+ if (!isLine(value[field])) issues.push(`direction.${field} must be non-empty single-line text`);
201
+ }
202
+ lines(value.principles, "direction.principles", issues, { minimum: 3, maximum: 7 });
203
+ if (!tokenStrategies.includes(value.token_strategy)) {
204
+ issues.push("direction.token_strategy must be reuse, extend, or create");
205
+ }
206
+ }
207
+
208
+ function checkRoutes(items, ids, issues) {
209
+ for (const item of items) {
210
+ keys(item, { allowed: ["id", "path", "primary", "auth_required"] }, "route", issues);
211
+ if (!isTypedId(item.id, "route")) issues.push("route id must be a route: identifier");
212
+ else ids.push(item.id);
213
+ if (!isLine(item.path)) issues.push(`route ${String(item.id)} must declare a path`);
214
+ booleans(item, ["primary", "auth_required"], `route ${String(item.id)}`, issues);
215
+ }
216
+ if (items.length === 0) issues.push("inventory.routes must declare at least one route");
217
+ else if (!items.some((item) => item.primary === true)) {
218
+ issues.push("inventory.routes must mark at least one route primary");
219
+ }
220
+ }
221
+
222
+ function checkRegions(items, ids, issues) {
223
+ for (const item of items) {
224
+ keys(item, { allowed: ["id", "route_id"] }, "region", issues);
225
+ if (!isTypedId(item.id, "region")) issues.push("region id must be a region: identifier");
226
+ else ids.push(item.id);
227
+ if (!isTypedId(item.route_id, "route")) issues.push(`region ${String(item.id)} must name a route: identifier`);
228
+ }
229
+ if (items.length === 0) issues.push("inventory.regions must declare at least one region");
230
+ }
231
+
232
+ function checkComponents(items, ids, issues) {
233
+ for (const item of items) {
234
+ keys(item, { allowed: ["id", "region_id"] }, "component", issues);
235
+ if (!isTypedId(item.id, "component")) issues.push("component id must be a component: identifier");
236
+ else ids.push(item.id);
237
+ if (!isTypedId(item.region_id, "region")) {
238
+ issues.push(`component ${String(item.id)} must name a region: identifier`);
239
+ }
240
+ }
241
+ if (items.length === 0) issues.push("inventory.components must declare at least one component");
242
+ }
243
+
244
+ function checkInteractions(items, ids, issues) {
245
+ for (const item of items) {
246
+ keys(item, { allowed: ["id", "route_id", "critical", "input_modes"] }, "interaction", issues);
247
+ if (!isTypedId(item.id, "interaction")) issues.push("interaction id must be an interaction: identifier");
248
+ else ids.push(item.id);
249
+ if (!isTypedId(item.route_id, "route")) {
250
+ issues.push(`interaction ${String(item.id)} must name a route: identifier`);
251
+ }
252
+ booleans(item, ["critical"], `interaction ${String(item.id)}`, issues);
253
+ enumSubset(item.input_modes, inputModes, `interaction ${String(item.id)} input_modes`, issues);
254
+ }
255
+ if (items.length === 0) issues.push("inventory.interactions must declare at least one interaction");
256
+ else if (!items.some((item) => item.critical === true)) {
257
+ issues.push("inventory.interactions must mark at least one interaction critical");
258
+ }
259
+ }
260
+
261
+ function checkStates(items, ids, issues) {
262
+ for (const item of items) {
263
+ keys(item, { allowed: ["id", "route_id", "kind"] }, "state", issues);
264
+ if (!isTypedId(item.id, "state")) issues.push("state id must be a state: identifier");
265
+ else ids.push(item.id);
266
+ if (!isTypedId(item.route_id, "route")) issues.push(`state ${String(item.id)} must name a route: identifier`);
267
+ if (!stateKinds.includes(item.kind)) issues.push(`state ${String(item.id)} declares an unsupported kind`);
268
+ }
269
+ }
270
+
271
+ function checkViewports(items, ids, issues) {
272
+ for (const item of items) {
273
+ keys(item, { allowed: ["id", "width", "height", "category"] }, "viewport", issues);
274
+ if (!isTypedId(item.id, "viewport")) issues.push("viewport id must be a viewport: identifier");
275
+ else ids.push(item.id);
276
+ for (const field of ["width", "height"]) {
277
+ if (!isBoundedInteger(item[field], 240, 16384)) {
278
+ issues.push(`viewport ${String(item.id)} ${field} must be an integer from 240 through 16384`);
279
+ }
280
+ }
281
+ if (!viewportCategories.includes(item.category)) {
282
+ issues.push(`viewport ${String(item.id)} category must be compact, medium, or expanded`);
283
+ }
284
+ }
285
+ }
286
+
287
+ function checkReferences(items, ids, issues) {
288
+ for (const item of items) {
289
+ keys(item, { allowed: ["id", "sha256", "kind", "label"] }, "reference", issues);
290
+ if (!isTypedId(item.id, "reference")) issues.push("reference id must be a reference: identifier");
291
+ else ids.push(item.id);
292
+ if (!isHash(item.sha256)) {
293
+ issues.push(`reference ${String(item.id)} sha256 must be 64 lowercase hexadecimal digits`);
294
+ }
295
+ if (!referenceKinds.includes(item.kind)) issues.push(`reference ${String(item.id)} declares an unsupported kind`);
296
+ if (!isLine(item.label)) issues.push(`reference ${String(item.id)} must declare a label`);
297
+ }
298
+ }
299
+
300
+ // Authenticated surfaces are keyed by the route they unlock, so they contribute
301
+ // no identifier of their own to the global id space.
302
+ function checkAuthenticatedSurfaces(items, issues) {
303
+ for (const item of items) {
304
+ keys(item, { allowed: ["route_id", "owner", "safe_test_account"] }, "authenticated surface", issues);
305
+ if (!isTypedId(item.route_id, "route")) issues.push("authenticated surface must name a route: identifier");
306
+ if (!isLine(item.owner)) issues.push(`authenticated surface ${String(item.route_id)} must name an owner`);
307
+ booleans(item, ["safe_test_account"], `authenticated surface ${String(item.route_id)}`, issues);
308
+ }
309
+ }
310
+
311
+ function checkReferentialIntegrity(inventory, issues) {
312
+ const routeIds = new Set(inventory.routes.map((item) => item.id));
313
+ const regionIds = new Set(inventory.regions.map((item) => item.id));
314
+ for (const item of inventory.regions) {
315
+ if (!routeIds.has(item.route_id)) issues.push(`region ${String(item.id)} names an undeclared route`);
316
+ }
317
+ for (const item of inventory.components) {
318
+ if (!regionIds.has(item.region_id)) issues.push(`component ${String(item.id)} names an undeclared region`);
319
+ }
320
+ for (const item of [...inventory.interactions, ...inventory.states]) {
321
+ if (!routeIds.has(item.route_id)) issues.push(`${String(item.id)} names an undeclared route`);
322
+ }
323
+ return routeIds;
324
+ }
325
+
326
+ // Authentication safety is a coupling, not a per-item field: a locked route
327
+ // without an owned surface, an open route with one, or a surface without an
328
+ // explicitly safe test account are all contract defects.
329
+ function checkAuthenticationSafety(inventory, routeIds, issues) {
330
+ const surfaceByRoute = new Map();
331
+ for (const surface of inventory.authenticated_surfaces) {
332
+ if (!routeIds.has(surface.route_id)) {
333
+ issues.push(`authenticated surface ${String(surface.route_id)} names an undeclared route`);
334
+ }
335
+ if (surfaceByRoute.has(surface.route_id)) {
336
+ issues.push(`route ${String(surface.route_id)} declares more than one authenticated surface`);
337
+ } else surfaceByRoute.set(surface.route_id, surface);
338
+ if (surface.safe_test_account !== true) {
339
+ issues.push(`authenticated surface ${String(surface.route_id)} must assert a safe test account`);
340
+ }
341
+ }
342
+ for (const route of inventory.routes) {
343
+ const surface = surfaceByRoute.get(route.id);
344
+ if (route.auth_required === true && surface === undefined) {
345
+ issues.push(`route ${String(route.id)} requires authentication without an authenticated surface`);
346
+ }
347
+ if (route.auth_required === false && surface !== undefined) {
348
+ issues.push(`public route ${String(route.id)} must not declare an authenticated surface`);
349
+ }
350
+ }
351
+ }
352
+
353
+ function checkInventory(value, issues) {
354
+ if (!keys(value, { allowed: inventoryKeys }, "inventory", issues)) return [];
355
+ const inventory = Object.fromEntries(
356
+ inventoryKeys.map((key) => [key, records(value[key], `inventory.${key}`, issues)])
357
+ );
358
+ const ids = [];
359
+ checkRoutes(inventory.routes, ids, issues);
360
+ checkRegions(inventory.regions, ids, issues);
361
+ checkComponents(inventory.components, ids, issues);
362
+ checkInteractions(inventory.interactions, ids, issues);
363
+ checkStates(inventory.states, ids, issues);
364
+ checkViewports(inventory.viewports, ids, issues);
365
+ checkReferences(inventory.references, ids, issues);
366
+ checkAuthenticatedSurfaces(inventory.authenticated_surfaces, issues);
367
+ const routeIds = checkReferentialIntegrity(inventory, issues);
368
+ checkAuthenticationSafety(inventory, routeIds, issues);
369
+ return ids;
370
+ }
371
+
372
+ function checkAccessibility(value, issues) {
373
+ const allowed = ["target", "keyboard", "screen_reader", "reduced_motion", "forced_colors", "zoom_percent"];
374
+ if (!keys(value, { allowed }, "accessibility", issues)) return;
375
+ if (value.target !== "WCAG 2.2 AA") issues.push("accessibility.target must be exactly WCAG 2.2 AA");
376
+ booleans(value, ["keyboard", "screen_reader", "reduced_motion", "forced_colors"], "accessibility", issues);
377
+ if (!isBoundedInteger(value.zoom_percent, 200, 400)) {
378
+ issues.push("accessibility.zoom_percent must be an integer from 200 through 400");
379
+ }
380
+ }
381
+
382
+ function checkLocalization(value, issues) {
383
+ const reviews = ["cjk_line_break_review", "font_fallback_review", "ime_review", "rtl_review"];
384
+ if (!keys(value, { allowed: ["locales", "text_expansion_percent", ...reviews] }, "localization", issues)) return;
385
+ lines(value.locales, "localization.locales", issues, { minimum: 1 });
386
+ if (!isBoundedInteger(value.text_expansion_percent, 0, 300)) {
387
+ issues.push("localization.text_expansion_percent must be an integer from 0 through 300");
388
+ }
389
+ booleans(value, reviews, "localization", issues);
390
+ }
391
+
392
+ // Every performance dimension is bounded on both ends; an open-ended budget is
393
+ // not a budget.
394
+ function checkPerformance(value, issues) {
395
+ const allowed = ["lcp_ms", "cls", "inp_ms", "initial_js_kb", "initial_css_kb"];
396
+ if (!keys(value, { allowed }, "performance", issues)) return;
397
+ for (const [field, minimum, maximum] of [
398
+ ["lcp_ms", 1, 60000],
399
+ ["inp_ms", 1, 60000],
400
+ ["initial_js_kb", 0, 1048576],
401
+ ["initial_css_kb", 0, 1048576]
402
+ ]) {
403
+ if (!isBoundedInteger(value[field], minimum, maximum)) {
404
+ issues.push(`performance.${field} must be an integer from ${minimum} through ${maximum}`);
405
+ }
406
+ }
407
+ if (!isBoundedNumber(value.cls, 0, 1)) issues.push("performance.cls must be a number from 0 through 1");
408
+ }
409
+
410
+ function checkEvidencePolicy(value, issues) {
411
+ const allowed = ["independent_review_required", "required_channels", "cleanup_required"];
412
+ if (!keys(value, { allowed }, "evidence_policy", issues)) return;
413
+ booleans(value, ["independent_review_required", "cleanup_required"], "evidence_policy", issues);
414
+ enumSubset(value.required_channels, evidenceChannels, "evidence_policy.required_channels", issues);
415
+ }
416
+
417
+ // An accepted exception forgives a gating finding, so it must say when it stops doing so:
418
+ // requireExpiry is true only for accepted_exceptions. An omission records work that was not
419
+ // done and forgives nothing, so it keeps the optional expiry it has always had.
420
+ function checkDeviations(value, label, ids, issues, { requireExpiry = false } = {}) {
421
+ const required = requireExpiry ? ["id", "reason", "owner", "expires_at"] : ["id", "reason", "owner"];
422
+ for (const item of records(value, label, issues)) {
423
+ keys(item, { allowed: ["id", "reason", "owner", "expires_at"], required }, label, issues);
424
+ if (!isId(item.id)) issues.push(`${label} id must follow the identifier grammar`);
425
+ else ids.push(item.id);
426
+ for (const field of ["reason", "owner"]) {
427
+ if (!isLine(item[field])) issues.push(`${label} ${String(item.id)} must declare ${field}`);
428
+ }
429
+ if (Object.hasOwn(item, "expires_at") && !isUtcInstant(item.expires_at)) {
430
+ issues.push(`${label} ${String(item.id)} expires_at must be a strict ISO-8601 UTC instant`);
431
+ }
432
+ }
433
+ }
434
+
435
+ function declaredIds(inventory, category) {
436
+ if (!isObject(inventory) || !Array.isArray(inventory[category])) return new Set();
437
+ return new Set(inventory[category].filter(isObject).map((item) => item.id).filter((id) => typeof id === "string"));
438
+ }
439
+
440
+ function checkBetaReferences(value, label, prefix, declared, issues) {
441
+ lines(value, label, issues, { minimum: 1, maximum: 64 });
442
+ if (!Array.isArray(value)) return;
443
+ for (const id of value) {
444
+ if (!isTypedId(id, prefix)) issues.push(`${label} must use ${prefix}: identifiers`);
445
+ else if (!declared.has(id)) issues.push(`${id} is not a declared ${prefix}`);
446
+ }
447
+ }
448
+
449
+ // One defect, one issue. A reviewer fixing a dial wants the dial named, not a list
450
+ // of every consequence of the same mistake.
451
+ function checkTaste(contract, issues) {
452
+ if (!Object.hasOwn(contract, "taste")) return;
453
+ const taste = contract.taste;
454
+ if (!isObject(taste)) {
455
+ issues.push("taste must be an object declaring variance, motion and density");
456
+ return;
457
+ }
458
+ const unknown = Object.keys(taste).filter((dial) => !tasteDials.includes(dial));
459
+ if (unknown.length > 0) {
460
+ issues.push(`taste declares the unsupported dial ${unknown.join(", ")}`);
461
+ return;
462
+ }
463
+ for (const dial of tasteDials) {
464
+ if (!Object.hasOwn(taste, dial)) {
465
+ issues.push(`taste.${dial} is required whenever taste is declared`);
466
+ return;
467
+ }
468
+ if (!isBoundedInteger(taste[dial], 1, 10)) {
469
+ issues.push(`taste.${dial} must be an integer from 1 through 10`);
470
+ return;
471
+ }
472
+ }
473
+ }
474
+
475
+ function checkBetaExtension(contract, issues) {
476
+ const ids = [];
477
+ if (!lanes.includes(contract.lane)) issues.push("lane must name a supported operating lane");
478
+ const routes = declaredIds(contract.inventory, "routes");
479
+ const components = declaredIds(contract.inventory, "components");
480
+ const interactions = declaredIds(contract.inventory, "interactions");
481
+ const states = declaredIds(contract.inventory, "states");
482
+ const viewports = declaredIds(contract.inventory, "viewports");
483
+ const allInventoryIds = new Set(inventoryKeys.flatMap((category) => [...declaredIds(contract.inventory, category)]));
484
+
485
+ const tokens = records(contract.tokens, "tokens", issues);
486
+ if (tokens.length === 0) issues.push("tokens must declare at least one token");
487
+ for (const token of tokens) {
488
+ keys(token, { allowed: ["id", "category", "value", "usage"] }, "token", issues);
489
+ if (!isTypedId(token.id, "token")) issues.push("token id must be a token: identifier");
490
+ else ids.push(token.id);
491
+ if (!tokenCategories.includes(token.category)) issues.push(`token ${String(token.id)} category is unsupported`);
492
+ if (!isBetaText(token.value)) issues.push(`token ${String(token.id)} value must be 1..512 characters of single-line text`);
493
+ if (!isBetaText(token.usage)) issues.push(`token ${String(token.id)} usage must be 1..512 characters of single-line text`);
494
+ }
495
+
496
+ const behaviors = records(contract.component_behaviors, "component_behaviors", issues);
497
+ if (behaviors.length === 0) issues.push("component_behaviors must declare at least one behavior");
498
+ for (const behavior of behaviors) {
499
+ keys(behavior, { allowed: ["component_id", "state_ids", "interaction_ids", "keyboard_behavior"] }, "component behavior", issues);
500
+ if (!isTypedId(behavior.component_id, "component")) issues.push("component behavior must name a component: identifier");
501
+ else if (!components.has(behavior.component_id)) issues.push(`${behavior.component_id} is not a declared component`);
502
+ checkBetaReferences(behavior.state_ids, `component ${String(behavior.component_id)} state_ids`, "state", states, issues);
503
+ checkBetaReferences(behavior.interaction_ids, `component ${String(behavior.component_id)} interaction_ids`, "interaction", interactions, issues);
504
+ if (!isBetaText(behavior.keyboard_behavior)) issues.push(`component ${String(behavior.component_id)} keyboard_behavior must be 1..512 characters of single-line text`);
505
+ }
506
+
507
+ const transformations = records(contract.responsive_transformations, "responsive_transformations", issues);
508
+ if (transformations.length === 0) issues.push("responsive_transformations must declare at least one transformation");
509
+ for (const transformation of transformations) {
510
+ keys(transformation, { allowed: ["route_id", "viewport_id", "behavior"] }, "responsive transformation", issues);
511
+ if (!isTypedId(transformation.route_id, "route") || !routes.has(transformation.route_id)) {
512
+ issues.push(`${String(transformation.route_id)} is not a declared route`);
513
+ }
514
+ if (!isTypedId(transformation.viewport_id, "viewport") || !viewports.has(transformation.viewport_id)) {
515
+ issues.push(`${String(transformation.viewport_id)} is not a declared viewport`);
516
+ }
517
+ if (!isBetaText(transformation.behavior)) issues.push("responsive transformation behavior must be 1..512 characters of single-line text");
518
+ }
519
+
520
+ if (!isObject(contract.motion)) issues.push("motion must be an object");
521
+ else {
522
+ keys(contract.motion, { allowed: ["policy", "reduced_motion_behavior", "transitions"] }, "motion", issues);
523
+ if (!motionPolicies.includes(contract.motion.policy)) issues.push("motion.policy is unsupported");
524
+ if (!isBetaText(contract.motion.reduced_motion_behavior)) issues.push("motion.reduced_motion_behavior must be 1..512 characters of single-line text");
525
+ const transitions = records(contract.motion.transitions, "motion.transitions", issues);
526
+ if (contract.motion.policy !== "none" && transitions.length === 0) issues.push("active motion policy requires a transition");
527
+ if (contract.motion.policy === "none" && transitions.length > 0) issues.push("motion policy none forbids transitions");
528
+ for (const transition of transitions) {
529
+ keys(transition, { allowed: ["id", "interaction_id", "duration_ms", "easing"] }, "transition", issues);
530
+ if (!isTypedId(transition.id, "transition")) issues.push("transition id must be a transition: identifier");
531
+ else ids.push(transition.id);
532
+ if (!isTypedId(transition.interaction_id, "interaction") || !interactions.has(transition.interaction_id)) {
533
+ issues.push(`${String(transition.interaction_id)} is not a declared interaction`);
534
+ }
535
+ if (!isBoundedInteger(transition.duration_ms, 0, 10000)) issues.push("transition.duration_ms must be an integer from 0 through 10000");
536
+ if (!isBetaText(transition.easing)) issues.push(`transition ${String(transition.id)} easing must be 1..512 characters of single-line text`);
537
+ }
538
+ }
539
+
540
+ const criteria = records(contract.acceptance_criteria, "acceptance_criteria", issues);
541
+ if (criteria.length === 0) issues.push("acceptance_criteria must declare at least one criterion");
542
+ for (const criterion of criteria) {
543
+ keys(criterion, { allowed: ["id", "observable", "verification", "required", "inventory_ids"] }, "acceptance criterion", issues);
544
+ if (!isTypedId(criterion.id, "criterion")) issues.push("criterion id must be a criterion: identifier");
545
+ else ids.push(criterion.id);
546
+ if (!isBetaText(criterion.observable)) issues.push(`criterion ${String(criterion.id)} observable must be 1..512 characters of single-line text`);
547
+ if (!verificationMethods.includes(criterion.verification)) issues.push(`criterion ${String(criterion.id)} verification is unsupported`);
548
+ if (criterion.required !== true) issues.push(`criterion ${String(criterion.id)} required must be true`);
549
+ lines(criterion.inventory_ids, `criterion ${String(criterion.id)} inventory_ids`, issues, { minimum: 1, maximum: 64 });
550
+ if (Array.isArray(criterion.inventory_ids)) {
551
+ for (const id of criterion.inventory_ids) if (!allInventoryIds.has(id)) issues.push(`${String(id)} is not declared in contract inventory`);
552
+ }
553
+ }
554
+ return ids;
555
+ }
556
+
557
+ export function validateDesignContract(contract) {
558
+ const issues = [];
559
+ if (!isObject(contract)) {
560
+ return {
561
+ valid: false,
562
+ schema: designContractSchemaId,
563
+ issues: ["contract must be an object"],
564
+ diagnostics: [],
565
+ evidence_eligible: false
566
+ };
567
+ }
568
+ const beta2 = contract.schema_id === designContractBeta2SchemaId;
569
+ const beta = beta2 || contract.schema_id === designContractBetaSchemaId;
570
+ const alpha = contract.schema_id === designContractSchemaId;
571
+ const schema = beta2 ? designContractBeta2SchemaId : (beta ? designContractBetaSchemaId : designContractSchemaId);
572
+ const allowed = beta2 ? beta2RootKeys : (beta ? betaRootKeys : rootKeys);
573
+ keys(contract, { allowed, required: beta2 ? betaRootKeys : allowed }, "contract", issues);
574
+ if (!alpha && !beta) {
575
+ issues.push(
576
+ `schema_id must be exactly ${designContractSchemaId}, ${designContractBetaSchemaId} or ${designContractBeta2SchemaId}`
577
+ );
578
+ }
579
+ if (!isTypedId(contract.contract_id, "contract")) issues.push("contract_id must be a contract: identifier");
580
+ if (!isHash(contract.source_hash)) issues.push("source_hash must be 64 lowercase hexadecimal digits");
581
+ checkIntent(contract.intent, issues);
582
+ checkDirection(contract.direction, issues);
583
+ const inventoryIds = checkInventory(contract.inventory, issues);
584
+ checkAccessibility(contract.accessibility, issues);
585
+ checkLocalization(contract.localization, issues);
586
+ checkPerformance(contract.performance, issues);
587
+ checkEvidencePolicy(contract.evidence_policy, issues);
588
+ const deviationIds = [];
589
+ checkDeviations(contract.omissions, "omissions", deviationIds, issues);
590
+ checkDeviations(contract.accepted_exceptions, "accepted_exceptions", deviationIds, issues, { requireExpiry: true });
591
+ if (beta) checkTaste(contract, issues);
592
+ const betaIds = beta ? checkBetaExtension(contract, issues) : [];
593
+ const declaredIds = [contract.contract_id, ...inventoryIds, ...deviationIds, ...betaIds].filter(isId);
594
+ if (new Set(declaredIds).size !== declaredIds.length) {
595
+ issues.push("every declared identifier must be unique across the whole contract");
596
+ }
597
+ const valid = issues.length === 0;
598
+ return {
599
+ valid,
600
+ schema,
601
+ issues,
602
+ diagnostics: alpha ? ["LEGACY_SCHEMA_V1ALPHA1"] : [],
603
+ evidence_eligible: beta && valid
604
+ };
605
+ }
606
+
607
+ export function validateDesignContractText(text) {
608
+ return validateDesignContract(parseStrictJson(text));
609
+ }