@litfamily/litgrok 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 (522) hide show
  1. package/.grok/agents/litgrok-executor.md +33 -0
  2. package/.grok/agents/litgrok-korean-prose-editor.md +32 -0
  3. package/.grok/agents/litgrok-korean-style-analyzer.md +30 -0
  4. package/.grok/agents/litgrok-librarian-researcher.md +31 -0
  5. package/.grok/agents/litgrok-meaning-preservation-auditor.md +30 -0
  6. package/.grok/agents/litgrok-native-flow-reviewer.md +30 -0
  7. package/.grok/agents/litgrok-planner.md +31 -0
  8. package/.grok/agents/litgrok-polish-orchestrator.md +30 -0
  9. package/.grok/agents/litgrok-qa-runner.md +33 -0
  10. package/.grok/agents/litgrok-quality-reviewer.md +33 -0
  11. package/.grok/agents/litgrok-verifier.md +32 -0
  12. package/.grok/hooks/deliverable-hedge-guard.json +16 -0
  13. package/.grok/hooks/deliverable-hedge-guard.mjs +148 -0
  14. package/.grok/hooks/lit-mark.mjs +142 -0
  15. package/.grok/hooks/plan-gate.mjs +81 -0
  16. package/.grok/hooks/post-compact.json +15 -0
  17. package/.grok/hooks/post-compact.mjs +6 -0
  18. package/.grok/hooks/post-tool-use-failure.json +15 -0
  19. package/.grok/hooks/post-tool-use-failure.mjs +6 -0
  20. package/.grok/hooks/post-tool-use.json +16 -0
  21. package/.grok/hooks/post-tool-use.mjs +7 -0
  22. package/.grok/hooks/pre-compact.json +15 -0
  23. package/.grok/hooks/pre-compact.mjs +6 -0
  24. package/.grok/hooks/record-passive-event.mjs +198 -0
  25. package/.grok/hooks/session-start.json +15 -0
  26. package/.grok/hooks/session-start.mjs +37 -0
  27. package/.grok/hooks/stop-failure.json +15 -0
  28. package/.grok/hooks/stop-failure.mjs +6 -0
  29. package/.grok/hooks/stop.json +15 -0
  30. package/.grok/hooks/stop.mjs +36 -0
  31. package/.grok/hooks/subagent-start.json +15 -0
  32. package/.grok/hooks/subagent-start.mjs +6 -0
  33. package/.grok/hooks/subagent-stop.json +15 -0
  34. package/.grok/hooks/subagent-stop.mjs +6 -0
  35. package/.grok/hooks/user-prompt-submit.json +15 -0
  36. package/.grok/hooks/user-prompt-submit.mjs +7 -0
  37. package/.grok/rules/00-litgrok.md +152 -0
  38. package/.grok/skills/autoconference/LICENSE +21 -0
  39. package/.grok/skills/autoconference/PROVENANCE.md +23 -0
  40. package/.grok/skills/autoconference/SKILL.md +140 -0
  41. package/.grok/skills/autoconference/assets/conference_template.md +76 -0
  42. package/.grok/skills/autoconference/assets/report_template.md +56 -0
  43. package/.grok/skills/autoconference/assets/synthesis_template.md +40 -0
  44. package/.grok/skills/autoconference/references/_canonical-corpus/manifest.json +138 -0
  45. package/.grok/skills/autoconference/references/agent-prompts.md +30 -0
  46. package/.grok/skills/autoconference/references/conference-protocol.md +21 -0
  47. package/.grok/skills/autoconference/references/core-principles.md +13 -0
  48. package/.grok/skills/autoconference/references/family-contract.md +26 -0
  49. package/.grok/skills/autoconference/references/modes/analyze.md +11 -0
  50. package/.grok/skills/autoconference/references/modes/core/convergence-guide.md +41 -0
  51. package/.grok/skills/autoconference/references/modes/core/crash-recovery.md +11 -0
  52. package/.grok/skills/autoconference/references/modes/core.md +26 -0
  53. package/.grok/skills/autoconference/references/modes/debate.md +11 -0
  54. package/.grok/skills/autoconference/references/modes/plan.md +12 -0
  55. package/.grok/skills/autoconference/references/modes/resume.md +11 -0
  56. package/.grok/skills/autoconference/references/modes/ship.md +11 -0
  57. package/.grok/skills/autoconference/references/modes/survey.md +11 -0
  58. package/.grok/skills/autoconference/references/results-logging.md +12 -0
  59. package/.grok/skills/autoconference/references/visualization-guide.md +10 -0
  60. package/.grok/skills/autoconference/scripts/init_conference.py +646 -0
  61. package/.grok/skills/autoconference/scripts/verify-canonical-corpus.mjs +177 -0
  62. package/.grok/skills/autoconference/templates/code-performance.md +59 -0
  63. package/.grok/skills/autoconference/templates/debate-mode.md +50 -0
  64. package/.grok/skills/autoconference/templates/prompt-optimization.md +58 -0
  65. package/.grok/skills/autoconference/templates/quick-conference.md +48 -0
  66. package/.grok/skills/autoconference/templates/research-synthesis.md +56 -0
  67. package/.grok/skills/autoconference/templates/survey-mode.md +63 -0
  68. package/.grok/skills/autoresearch/LICENSE +21 -0
  69. package/.grok/skills/autoresearch/PROVENANCE.md +22 -0
  70. package/.grok/skills/autoresearch/SKILL.md +149 -0
  71. package/.grok/skills/autoresearch/assets/report_template.md +52 -0
  72. package/.grok/skills/autoresearch/assets/research_template.md +38 -0
  73. package/.grok/skills/autoresearch/assets/results_template.tsv +2 -0
  74. package/.grok/skills/autoresearch/references/_canonical-corpus/manifest.json +148 -0
  75. package/.grok/skills/autoresearch/references/core-principles.md +16 -0
  76. package/.grok/skills/autoresearch/references/family-contract.md +36 -0
  77. package/.grok/skills/autoresearch/references/modes/core/evaluator-contract.md +12 -0
  78. package/.grok/skills/autoresearch/references/modes/core/stuck-detection.md +11 -0
  79. package/.grok/skills/autoresearch/references/modes/core.md +21 -0
  80. package/.grok/skills/autoresearch/references/modes/debug/investigation-techniques.md +11 -0
  81. package/.grok/skills/autoresearch/references/modes/debug.md +11 -0
  82. package/.grok/skills/autoresearch/references/modes/fix.md +11 -0
  83. package/.grok/skills/autoresearch/references/modes/learn.md +11 -0
  84. package/.grok/skills/autoresearch/references/modes/plan.md +14 -0
  85. package/.grok/skills/autoresearch/references/modes/predict/persona-templates.md +11 -0
  86. package/.grok/skills/autoresearch/references/modes/predict.md +11 -0
  87. package/.grok/skills/autoresearch/references/modes/reason.md +11 -0
  88. package/.grok/skills/autoresearch/references/modes/scenario/dimensions.md +11 -0
  89. package/.grok/skills/autoresearch/references/modes/scenario.md +11 -0
  90. package/.grok/skills/autoresearch/references/modes/security/owasp-checklist.md +11 -0
  91. package/.grok/skills/autoresearch/references/modes/security/stride-model.md +11 -0
  92. package/.grok/skills/autoresearch/references/modes/security.md +12 -0
  93. package/.grok/skills/autoresearch/references/modes/ship/type-checklists.md +12 -0
  94. package/.grok/skills/autoresearch/references/modes/ship.md +11 -0
  95. package/.grok/skills/autoresearch/references/results-logging.md +12 -0
  96. package/.grok/skills/autoresearch/references/visualization-guide.md +24 -0
  97. package/.grok/skills/autoresearch/scripts/init_research.py +391 -0
  98. package/.grok/skills/autoresearch/scripts/style_presets.py +123 -0
  99. package/.grok/skills/autoresearch/scripts/verify-canonical-corpus.mjs +179 -0
  100. package/.grok/skills/browser-drive/SKILL.md +194 -0
  101. package/.grok/skills/browser-drive/references/snapshot-act-loop.md +61 -0
  102. package/.grok/skills/comment-checker/SKILL.md +194 -0
  103. package/.grok/skills/debugging/SKILL.md +82 -0
  104. package/.grok/skills/debugging/references/methodology/00-setup.md +108 -0
  105. package/.grok/skills/debugging/references/methodology/02-investigate.md +126 -0
  106. package/.grok/skills/debugging/references/methodology/04-oracle-triple.md +106 -0
  107. package/.grok/skills/debugging/references/methodology/05-escalate.md +69 -0
  108. package/.grok/skills/debugging/references/methodology/06-fix.md +116 -0
  109. package/.grok/skills/debugging/references/methodology/08-qa.md +94 -0
  110. package/.grok/skills/debugging/references/methodology/09-cleanup.md +164 -0
  111. package/.grok/skills/debugging/references/methodology/partial-runtime-evidence.md +228 -0
  112. package/.grok/skills/debugging/references/post-tool-use-failure-taxonomy.md +55 -0
  113. package/.grok/skills/debugging/references/reproduction-recipes.md +182 -0
  114. package/.grok/skills/debugging/references/runtimes/bundled-js-binary.md +415 -0
  115. package/.grok/skills/debugging/references/runtimes/go.md +252 -0
  116. package/.grok/skills/debugging/references/runtimes/native-binary.md +484 -0
  117. package/.grok/skills/debugging/references/runtimes/node.md +260 -0
  118. package/.grok/skills/debugging/references/runtimes/python.md +248 -0
  119. package/.grok/skills/debugging/references/runtimes/rust.md +234 -0
  120. package/.grok/skills/debugging/references/tools/ghidra.md +212 -0
  121. package/.grok/skills/debugging/references/tools/playwright-cli.md +194 -0
  122. package/.grok/skills/debugging/references/tools/pwndbg.md +263 -0
  123. package/.grok/skills/debugging/references/tools/pwntools.md +265 -0
  124. package/.grok/skills/deep-interview/SKILL.md +216 -0
  125. package/.grok/skills/frontend-ui-ux/LICENSE +21 -0
  126. package/.grok/skills/frontend-ui-ux/PROVENANCE.json +38 -0
  127. package/.grok/skills/frontend-ui-ux/SKILL.md +58 -0
  128. package/.grok/skills/frontend-ui-ux/SOURCE-MANIFEST.json +1060 -0
  129. package/.grok/skills/frontend-ui-ux/THIRD-PARTY-NOTICE.txt +14 -0
  130. package/.grok/skills/frontend-ui-ux/data/design-intelligence.json +1 -0
  131. package/.grok/skills/frontend-ui-ux/references/_canonical-corpus/legal/frontend-ATTRIBUTION.md +217 -0
  132. package/.grok/skills/frontend-ui-ux/references/_canonical-corpus/legal/frontend-LICENSE-Apache-2.0.txt +201 -0
  133. package/.grok/skills/frontend-ui-ux/references/_canonical-corpus/legal/root-LICENSE +21 -0
  134. package/.grok/skills/frontend-ui-ux/references/_canonical-corpus/manifest.json +873 -0
  135. package/.grok/skills/frontend-ui-ux/references/adaptive-layout.md +92 -0
  136. package/.grok/skills/frontend-ui-ux/references/brand-and-imagery.md +93 -0
  137. package/.grok/skills/frontend-ui-ux/references/complete-contract.md +557 -0
  138. package/.grok/skills/frontend-ui-ux/references/composition.md +85 -0
  139. package/.grok/skills/frontend-ui-ux/references/creative-directions.md +80 -0
  140. package/.grok/skills/frontend-ui-ux/references/design/README.md +248 -0
  141. package/.grok/skills/frontend-ui-ux/references/design/_INDEX.md +191 -0
  142. package/.grok/skills/frontend-ui-ux/references/design/airbnb.md +393 -0
  143. package/.grok/skills/frontend-ui-ux/references/design/airtable.md +92 -0
  144. package/.grok/skills/frontend-ui-ux/references/design/apple.md +250 -0
  145. package/.grok/skills/frontend-ui-ux/references/design/aside.md +209 -0
  146. package/.grok/skills/frontend-ui-ux/references/design/binance.md +348 -0
  147. package/.grok/skills/frontend-ui-ux/references/design/bmw.md +183 -0
  148. package/.grok/skills/frontend-ui-ux/references/design/brutalist-skill.md +92 -0
  149. package/.grok/skills/frontend-ui-ux/references/design/bugatti.md +271 -0
  150. package/.grok/skills/frontend-ui-ux/references/design/cal.md +262 -0
  151. package/.grok/skills/frontend-ui-ux/references/design/claude.md +315 -0
  152. package/.grok/skills/frontend-ui-ux/references/design/clay.md +307 -0
  153. package/.grok/skills/frontend-ui-ux/references/design/clickhouse.md +284 -0
  154. package/.grok/skills/frontend-ui-ux/references/design/clone-from-url.md +65 -0
  155. package/.grok/skills/frontend-ui-ux/references/design/cohere.md +269 -0
  156. package/.grok/skills/frontend-ui-ux/references/design/coinbase.md +132 -0
  157. package/.grok/skills/frontend-ui-ux/references/design/composio.md +310 -0
  158. package/.grok/skills/frontend-ui-ux/references/design/cursor.md +312 -0
  159. package/.grok/skills/frontend-ui-ux/references/design/design-system-architecture.md +244 -0
  160. package/.grok/skills/frontend-ui-ux/references/design/elevenlabs.md +268 -0
  161. package/.grok/skills/frontend-ui-ux/references/design/expo.md +284 -0
  162. package/.grok/skills/frontend-ui-ux/references/design/ferrari.md +317 -0
  163. package/.grok/skills/frontend-ui-ux/references/design/figma.md +223 -0
  164. package/.grok/skills/frontend-ui-ux/references/design/framer.md +249 -0
  165. package/.grok/skills/frontend-ui-ux/references/design/gpt-tasteskill.md +74 -0
  166. package/.grok/skills/frontend-ui-ux/references/design/hashicorp.md +281 -0
  167. package/.grok/skills/frontend-ui-ux/references/design/ibm.md +335 -0
  168. package/.grok/skills/frontend-ui-ux/references/design/image-to-code-skill.md +1228 -0
  169. package/.grok/skills/frontend-ui-ux/references/design/imagegen-brandkit.md +798 -0
  170. package/.grok/skills/frontend-ui-ux/references/design/imagegen-frontend-mobile.md +1465 -0
  171. package/.grok/skills/frontend-ui-ux/references/design/imagegen-frontend-web.md +987 -0
  172. package/.grok/skills/frontend-ui-ux/references/design/intercom.md +149 -0
  173. package/.grok/skills/frontend-ui-ux/references/design/kraken.md +128 -0
  174. package/.grok/skills/frontend-ui-ux/references/design/lamborghini.md +291 -0
  175. package/.grok/skills/frontend-ui-ux/references/design/layout-skill.md +107 -0
  176. package/.grok/skills/frontend-ui-ux/references/design/lazyweb.md +77 -0
  177. package/.grok/skills/frontend-ui-ux/references/design/linear.app.md +370 -0
  178. package/.grok/skills/frontend-ui-ux/references/design/lovable.md +301 -0
  179. package/.grok/skills/frontend-ui-ux/references/design/mastercard.md +368 -0
  180. package/.grok/skills/frontend-ui-ux/references/design/meta.md +369 -0
  181. package/.grok/skills/frontend-ui-ux/references/design/minimalist-skill.md +85 -0
  182. package/.grok/skills/frontend-ui-ux/references/design/minimax.md +260 -0
  183. package/.grok/skills/frontend-ui-ux/references/design/mintlify.md +329 -0
  184. package/.grok/skills/frontend-ui-ux/references/design/miro.md +111 -0
  185. package/.grok/skills/frontend-ui-ux/references/design/mistral.ai.md +264 -0
  186. package/.grok/skills/frontend-ui-ux/references/design/mongodb.md +269 -0
  187. package/.grok/skills/frontend-ui-ux/references/design/nike.md +366 -0
  188. package/.grok/skills/frontend-ui-ux/references/design/notion.md +312 -0
  189. package/.grok/skills/frontend-ui-ux/references/design/nvidia.md +296 -0
  190. package/.grok/skills/frontend-ui-ux/references/design/ollama.md +270 -0
  191. package/.grok/skills/frontend-ui-ux/references/design/opencode.ai.md +284 -0
  192. package/.grok/skills/frontend-ui-ux/references/design/output-skill.md +49 -0
  193. package/.grok/skills/frontend-ui-ux/references/design/pinterest.md +233 -0
  194. package/.grok/skills/frontend-ui-ux/references/design/playstation.md +367 -0
  195. package/.grok/skills/frontend-ui-ux/references/design/posthog.md +259 -0
  196. package/.grok/skills/frontend-ui-ux/references/design/raycast.md +271 -0
  197. package/.grok/skills/frontend-ui-ux/references/design/react-dev-tooling-skill.md +230 -0
  198. package/.grok/skills/frontend-ui-ux/references/design/redesign-skill.md +178 -0
  199. package/.grok/skills/frontend-ui-ux/references/design/renault.md +314 -0
  200. package/.grok/skills/frontend-ui-ux/references/design/replicate.md +264 -0
  201. package/.grok/skills/frontend-ui-ux/references/design/resend.md +306 -0
  202. package/.grok/skills/frontend-ui-ux/references/design/revolut.md +188 -0
  203. package/.grok/skills/frontend-ui-ux/references/design/runwayml.md +247 -0
  204. package/.grok/skills/frontend-ui-ux/references/design/sanity.md +360 -0
  205. package/.grok/skills/frontend-ui-ux/references/design/sentry.md +265 -0
  206. package/.grok/skills/frontend-ui-ux/references/design/shopify.md +353 -0
  207. package/.grok/skills/frontend-ui-ux/references/design/soft-skill.md +98 -0
  208. package/.grok/skills/frontend-ui-ux/references/design/spacex.md +197 -0
  209. package/.grok/skills/frontend-ui-ux/references/design/spotify.md +249 -0
  210. package/.grok/skills/frontend-ui-ux/references/design/starbucks.md +583 -0
  211. package/.grok/skills/frontend-ui-ux/references/design/stitch-design-example.md +121 -0
  212. package/.grok/skills/frontend-ui-ux/references/design/stitch-skill.md +184 -0
  213. package/.grok/skills/frontend-ui-ux/references/design/stripe.md +325 -0
  214. package/.grok/skills/frontend-ui-ux/references/design/supabase.md +258 -0
  215. package/.grok/skills/frontend-ui-ux/references/design/superhuman.md +255 -0
  216. package/.grok/skills/frontend-ui-ux/references/design/taste-skill.md +1206 -0
  217. package/.grok/skills/frontend-ui-ux/references/design/tesla.md +289 -0
  218. package/.grok/skills/frontend-ui-ux/references/design/theverge.md +342 -0
  219. package/.grok/skills/frontend-ui-ux/references/design/together.ai.md +266 -0
  220. package/.grok/skills/frontend-ui-ux/references/design/uber.md +298 -0
  221. package/.grok/skills/frontend-ui-ux/references/design/vercel.md +313 -0
  222. package/.grok/skills/frontend-ui-ux/references/design/vodafone.md +426 -0
  223. package/.grok/skills/frontend-ui-ux/references/design/voltagent.md +326 -0
  224. package/.grok/skills/frontend-ui-ux/references/design/warp.md +256 -0
  225. package/.grok/skills/frontend-ui-ux/references/design/webflow.md +95 -0
  226. package/.grok/skills/frontend-ui-ux/references/design/wired.md +281 -0
  227. package/.grok/skills/frontend-ui-ux/references/design/wise.md +176 -0
  228. package/.grok/skills/frontend-ui-ux/references/design/x.ai.md +260 -0
  229. package/.grok/skills/frontend-ui-ux/references/design/zapier.md +331 -0
  230. package/.grok/skills/frontend-ui-ux/references/designpowers/EVIDENCE.md +97 -0
  231. package/.grok/skills/frontend-ui-ux/references/designpowers/README.md +48 -0
  232. package/.grok/skills/frontend-ui-ux/references/designpowers/UPSTREAM.md +80 -0
  233. package/.grok/skills/frontend-ui-ux/references/designpowers/lane-a-direction.md +64 -0
  234. package/.grok/skills/frontend-ui-ux/references/designpowers/lane-b-execution.md +65 -0
  235. package/.grok/skills/frontend-ui-ux/references/designpowers/lane-c-review.md +65 -0
  236. package/.grok/skills/frontend-ui-ux/references/designpowers/lane-d-memory.md +83 -0
  237. package/.grok/skills/frontend-ui-ux/references/designpowers/orchestration.md +80 -0
  238. package/.grok/skills/frontend-ui-ux/references/designpowers/routing.md +79 -0
  239. package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/LICENSE +21 -0
  240. package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/agents/accessibility-reviewer.md +83 -0
  241. package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/agents/content-writer.md +132 -0
  242. package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/agents/design-builder.md +109 -0
  243. package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/agents/design-critic.md +89 -0
  244. package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/agents/design-lead.md +113 -0
  245. package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/agents/design-scout.md +78 -0
  246. package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/agents/design-strategist.md +121 -0
  247. package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/agents/heuristic-evaluator.md +268 -0
  248. package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/agents/inspiration-scout.md +107 -0
  249. package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/agents/motion-designer.md +120 -0
  250. package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/accessible-content/reference.md +101 -0
  251. package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/adaptive-interfaces/reference.md +109 -0
  252. package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/cognitive-accessibility/reference.md +107 -0
  253. package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/design-debate/reference.md +199 -0
  254. package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/design-debt-tracker/reference.md +174 -0
  255. package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/design-handoff/reference.md +125 -0
  256. package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/design-md/reference.md +106 -0
  257. package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/design-retrospective/reference.md +266 -0
  258. package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/design-review/reference.md +123 -0
  259. package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/design-system-alignment/reference.md +120 -0
  260. package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/designpowers-critique/reference.md +164 -0
  261. package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/heuristic-evaluation/reference.md +85 -0
  262. package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/inclusive-personas/reference.md +98 -0
  263. package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/inspiration-scouting/reference.md +165 -0
  264. package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/interaction-design/reference.md +122 -0
  265. package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/motion-choreography/reference.md +81 -0
  266. package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/research-planning/reference.md +96 -0
  267. package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/responsive-patterns/reference.md +77 -0
  268. package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/synthetic-user-testing/reference.md +192 -0
  269. package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/taste-feedback/reference.md +165 -0
  270. package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/taste-report/reference.md +78 -0
  271. package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/token-architecture/reference.md +75 -0
  272. package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/ui-composition/reference.md +117 -0
  273. package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/usability-testing/reference.md +78 -0
  274. package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/verification-before-shipping/reference.md +125 -0
  275. package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/voice-and-tone/reference.md +79 -0
  276. package/.grok/skills/frontend-ui-ux/references/designpowers/vendor/skills/writing-design-plans/reference.md +119 -0
  277. package/.grok/skills/frontend-ui-ux/references/evidence-review.md +126 -0
  278. package/.grok/skills/frontend-ui-ux/references/implementation-platforms.md +109 -0
  279. package/.grok/skills/frontend-ui-ux/references/inclusive-interface.md +92 -0
  280. package/.grok/skills/frontend-ui-ux/references/interaction-motion.md +101 -0
  281. package/.grok/skills/frontend-ui-ux/references/operating-lanes.md +92 -0
  282. package/.grok/skills/frontend-ui-ux/references/perfection/README.md +160 -0
  283. package/.grok/skills/frontend-ui-ux/references/perfection/react-perf-tooling.md +127 -0
  284. package/.grok/skills/frontend-ui-ux/references/performance-delivery.md +93 -0
  285. package/.grok/skills/frontend-ui-ux/references/product-direction.md +84 -0
  286. package/.grok/skills/frontend-ui-ux/references/redesign-playbook.md +97 -0
  287. package/.grok/skills/frontend-ui-ux/references/system-foundations.md +84 -0
  288. package/.grok/skills/frontend-ui-ux/references/taste-direction.md +86 -0
  289. package/.grok/skills/frontend-ui-ux/references/ui-ux-db/README.md +659 -0
  290. package/.grok/skills/frontend-ui-ux/references/ui-ux-db/data/charts.csv +26 -0
  291. package/.grok/skills/frontend-ui-ux/references/ui-ux-db/data/colors.csv +162 -0
  292. package/.grok/skills/frontend-ui-ux/references/ui-ux-db/data/icons.csv +106 -0
  293. package/.grok/skills/frontend-ui-ux/references/ui-ux-db/data/landing.csv +35 -0
  294. package/.grok/skills/frontend-ui-ux/references/ui-ux-db/data/products.csv +162 -0
  295. package/.grok/skills/frontend-ui-ux/references/ui-ux-db/data/react-performance.csv +45 -0
  296. package/.grok/skills/frontend-ui-ux/references/ui-ux-db/data/stacks/astro.csv +54 -0
  297. package/.grok/skills/frontend-ui-ux/references/ui-ux-db/data/stacks/flutter.csv +53 -0
  298. package/.grok/skills/frontend-ui-ux/references/ui-ux-db/data/stacks/html-tailwind.csv +56 -0
  299. package/.grok/skills/frontend-ui-ux/references/ui-ux-db/data/stacks/jetpack-compose.csv +53 -0
  300. package/.grok/skills/frontend-ui-ux/references/ui-ux-db/data/stacks/nextjs.csv +53 -0
  301. package/.grok/skills/frontend-ui-ux/references/ui-ux-db/data/stacks/nuxt-ui.csv +51 -0
  302. package/.grok/skills/frontend-ui-ux/references/ui-ux-db/data/stacks/nuxtjs.csv +59 -0
  303. package/.grok/skills/frontend-ui-ux/references/ui-ux-db/data/stacks/react-native.csv +52 -0
  304. package/.grok/skills/frontend-ui-ux/references/ui-ux-db/data/stacks/react.csv +54 -0
  305. package/.grok/skills/frontend-ui-ux/references/ui-ux-db/data/stacks/shadcn.csv +61 -0
  306. package/.grok/skills/frontend-ui-ux/references/ui-ux-db/data/stacks/svelte.csv +54 -0
  307. package/.grok/skills/frontend-ui-ux/references/ui-ux-db/data/stacks/swiftui.csv +51 -0
  308. package/.grok/skills/frontend-ui-ux/references/ui-ux-db/data/stacks/vue.csv +50 -0
  309. package/.grok/skills/frontend-ui-ux/references/ui-ux-db/data/styles.csv +85 -0
  310. package/.grok/skills/frontend-ui-ux/references/ui-ux-db/data/typography.csv +74 -0
  311. package/.grok/skills/frontend-ui-ux/references/ui-ux-db/data/ui-reasoning.csv +162 -0
  312. package/.grok/skills/frontend-ui-ux/references/ui-ux-db/data/ux-guidelines.csv +100 -0
  313. package/.grok/skills/frontend-ui-ux/references/ui-ux-db/data/web-interface.csv +31 -0
  314. package/.grok/skills/frontend-ui-ux/references/ui-ux-db/scripts/core.py +262 -0
  315. package/.grok/skills/frontend-ui-ux/references/ui-ux-db/scripts/design_system.py +1148 -0
  316. package/.grok/skills/frontend-ui-ux/references/ui-ux-db/scripts/search.py +114 -0
  317. package/.grok/skills/frontend-ui-ux/references/visual-language.md +84 -0
  318. package/.grok/skills/frontend-ui-ux/references/visual-reconstruction.md +97 -0
  319. package/.grok/skills/frontend-ui-ux/schemas/design-contract-v1alpha1.schema.json +306 -0
  320. package/.grok/skills/frontend-ui-ux/schemas/design-contract-v1beta1.schema.json +291 -0
  321. package/.grok/skills/frontend-ui-ux/schemas/design-contract-v1beta2.schema.json +311 -0
  322. package/.grok/skills/frontend-ui-ux/scripts/design-contract-format.mjs +286 -0
  323. package/.grok/skills/frontend-ui-ux/scripts/design-contract-inventory-rules.mjs +354 -0
  324. package/.grok/skills/frontend-ui-ux/scripts/design-contract-rules.mjs +361 -0
  325. package/.grok/skills/frontend-ui-ux/scripts/design-contract-surface-rules.mjs +313 -0
  326. package/.grok/skills/frontend-ui-ux/scripts/design-data.mjs +68 -0
  327. package/.grok/skills/frontend-ui-ux/scripts/errors.mjs +12 -0
  328. package/.grok/skills/frontend-ui-ux/scripts/import-design-intelligence.mjs +124 -0
  329. package/.grok/skills/frontend-ui-ux/scripts/json-boundary.mjs +63 -0
  330. package/.grok/skills/frontend-ui-ux/scripts/query-design-intelligence.mjs +106 -0
  331. package/.grok/skills/frontend-ui-ux/scripts/search.mjs +43 -0
  332. package/.grok/skills/frontend-ui-ux/scripts/source-replay.mjs +153 -0
  333. package/.grok/skills/frontend-ui-ux/scripts/strict-json.mjs +143 -0
  334. package/.grok/skills/frontend-ui-ux/scripts/validate-design-contract.mjs +52 -0
  335. package/.grok/skills/frontend-ui-ux/scripts/verify-canonical-corpus.mjs +214 -0
  336. package/.grok/skills/lit-burnoff/SKILL.md +175 -0
  337. package/.grok/skills/lit-burnoff-file/SKILL.md +67 -0
  338. package/.grok/skills/lit-code/SKILL.md +531 -0
  339. package/.grok/skills/lit-code/references/go/README.md +90 -0
  340. package/.grok/skills/lit-code/references/go/backend-stack.md +641 -0
  341. package/.grok/skills/lit-code/references/go/bootstrap.md +328 -0
  342. package/.grok/skills/lit-code/references/go/bubbletea-v2.md +360 -0
  343. package/.grok/skills/lit-code/references/go/cobra-stack.md +468 -0
  344. package/.grok/skills/lit-code/references/go/concurrency.md +362 -0
  345. package/.grok/skills/lit-code/references/go/data-modeling.md +329 -0
  346. package/.grok/skills/lit-code/references/go/error-handling.md +359 -0
  347. package/.grok/skills/lit-code/references/go/golangci-strict.md +236 -0
  348. package/.grok/skills/lit-code/references/go/grpc-connect.md +375 -0
  349. package/.grok/skills/lit-code/references/go/libraries.md +337 -0
  350. package/.grok/skills/lit-code/references/go/one-liners.md +202 -0
  351. package/.grok/skills/lit-code/references/go/sqlc-pgx.md +471 -0
  352. package/.grok/skills/lit-code/references/go/testing.md +467 -0
  353. package/.grok/skills/lit-code/references/go/type-patterns.md +298 -0
  354. package/.grok/skills/lit-code/references/permission-sandbox-matrix.md +70 -0
  355. package/.grok/skills/lit-code/references/python/README.md +314 -0
  356. package/.grok/skills/lit-code/references/python/async-anyio.md +442 -0
  357. package/.grok/skills/lit-code/references/python/data-modeling.md +233 -0
  358. package/.grok/skills/lit-code/references/python/data-processing.md +133 -0
  359. package/.grok/skills/lit-code/references/python/error-handling.md +218 -0
  360. package/.grok/skills/lit-code/references/python/fastapi-stack.md +316 -0
  361. package/.grok/skills/lit-code/references/python/httpx2-optimization.md +360 -0
  362. package/.grok/skills/lit-code/references/python/libraries.md +307 -0
  363. package/.grok/skills/lit-code/references/python/one-liners.md +268 -0
  364. package/.grok/skills/lit-code/references/python/orjson-stack.md +378 -0
  365. package/.grok/skills/lit-code/references/python/pydantic-ai.md +285 -0
  366. package/.grok/skills/lit-code/references/python/pyproject-strict.md +232 -0
  367. package/.grok/skills/lit-code/references/python/textual-tui.md +201 -0
  368. package/.grok/skills/lit-code/references/python/type-patterns.md +176 -0
  369. package/.grok/skills/lit-code/references/rust/README.md +317 -0
  370. package/.grok/skills/lit-code/references/rust/async-tokio.md +299 -0
  371. package/.grok/skills/lit-code/references/rust/axum-stack.md +467 -0
  372. package/.grok/skills/lit-code/references/rust/cargo-strict.md +317 -0
  373. package/.grok/skills/lit-code/references/rust/clap-stack.md +409 -0
  374. package/.grok/skills/lit-code/references/rust/concurrency.md +375 -0
  375. package/.grok/skills/lit-code/references/rust/libraries.md +439 -0
  376. package/.grok/skills/lit-code/references/rust/one-liners.md +291 -0
  377. package/.grok/skills/lit-code/references/rust/proptest-insta.md +429 -0
  378. package/.grok/skills/lit-code/references/rust/type-state.md +354 -0
  379. package/.grok/skills/lit-code/references/rust/unsafe-discipline.md +250 -0
  380. package/.grok/skills/lit-code/references/rust/zero-cost-safety.md +527 -0
  381. package/.grok/skills/lit-code/references/rust-ub/README.md +289 -0
  382. package/.grok/skills/lit-code/references/rust-ub/miri-sanitizers-loom.md +411 -0
  383. package/.grok/skills/lit-code/references/rust-ub/ub-taxonomy.md +269 -0
  384. package/.grok/skills/lit-code/references/tool-boundaries.md +66 -0
  385. package/.grok/skills/lit-code/references/typescript/README.md +195 -0
  386. package/.grok/skills/lit-code/references/typescript/backend-hono.md +672 -0
  387. package/.grok/skills/lit-code/references/typescript/bootstrap.md +199 -0
  388. package/.grok/skills/lit-code/references/typescript/data-modeling.md +202 -0
  389. package/.grok/skills/lit-code/references/typescript/error-handling.md +169 -0
  390. package/.grok/skills/lit-code/references/typescript/tsconfig-strict.md +152 -0
  391. package/.grok/skills/lit-code/references/typescript/type-patterns.md +196 -0
  392. package/.grok/skills/lit-code/references/worked-cases.md +190 -0
  393. package/.grok/skills/lit-commit/SKILL.md +218 -0
  394. package/.grok/skills/lit-comprehend/SKILL.md +63 -0
  395. package/.grok/skills/lit-comprehend/references/artifact-format.md +58 -0
  396. package/.grok/skills/lit-comprehend/references/artifact-template.md +219 -0
  397. package/.grok/skills/lit-comprehend/references/honesty-ledger-contract.md +51 -0
  398. package/.grok/skills/lit-comprehend/references/micro-worlds.md +195 -0
  399. package/.grok/skills/lit-comprehend/references/worked-explainer.md +51 -0
  400. package/.grok/skills/lit-crucible/SKILL.md +231 -0
  401. package/.grok/skills/lit-handoff/SKILL.md +159 -0
  402. package/.grok/skills/lit-handoff/evals/evals.json +154 -0
  403. package/.grok/skills/lit-handoff/examples/HANDOFF-example-generic-auth-refactor.md +97 -0
  404. package/.grok/skills/lit-handoff/references/_canonical-corpus/manifest.json +17 -0
  405. package/.grok/skills/lit-handoff/references/source-pointer.md +31 -0
  406. package/.grok/skills/lit-handoff/scripts/verify-canonical-corpus.mjs +137 -0
  407. package/.grok/skills/lit-handoff/templates/HANDOFF.md +121 -0
  408. package/.grok/skills/lit-init/SKILL.md +244 -0
  409. package/.grok/skills/lit-korean/SKILL.md +176 -0
  410. package/.grok/skills/lit-plan/SKILL.md +71 -0
  411. package/.grok/skills/lit-plan/references/plan-schema.md +87 -0
  412. package/.grok/skills/lit-plan/references/start-work-handoff-contract.md +59 -0
  413. package/.grok/skills/lit-plan/scripts/scaffold-plan.mjs +259 -0
  414. package/.grok/skills/lit-plan/scripts/validate-plan.mjs +89 -0
  415. package/.grok/skills/lit-recap/SKILL.md +57 -0
  416. package/.grok/skills/lit-scientific-visualization/SKILL.md +213 -0
  417. package/.grok/skills/lit-scientific-visualization/scripts/verify-canonical-corpus.mjs +181 -0
  418. package/.grok/skills/lit-team/SKILL.md +73 -0
  419. package/.grok/skills/lit-team/references/explore-packet.md +70 -0
  420. package/.grok/skills/lit-team/references/general-purpose-packet.md +75 -0
  421. package/.grok/skills/lit-team/references/plan-packet.md +73 -0
  422. package/.grok/skills/litgoal/SKILL.md +98 -0
  423. package/.grok/skills/litgrok/SKILL.md +77 -0
  424. package/.grok/skills/litresearch/SKILL.md +60 -0
  425. package/.grok/skills/litresearch/references/mcp-tool-use-patterns.md +83 -0
  426. package/.grok/skills/litresearch/references/source-verdict-taxonomy.md +40 -0
  427. package/.grok/skills/litwork/SKILL.md +109 -0
  428. package/.grok/skills/lsp/SKILL.md +56 -0
  429. package/.grok/skills/lsp/references/built-in-lsp-contract.md +71 -0
  430. package/.grok/skills/lsp-setup/SKILL.md +82 -0
  431. package/.grok/skills/lsp-setup/references/bash/README.md +54 -0
  432. package/.grok/skills/lsp-setup/references/c-cpp/README.md +58 -0
  433. package/.grok/skills/lsp-setup/references/csharp/README.md +64 -0
  434. package/.grok/skills/lsp-setup/references/dart/README.md +48 -0
  435. package/.grok/skills/lsp-setup/references/elixir/README.md +51 -0
  436. package/.grok/skills/lsp-setup/references/go/README.md +53 -0
  437. package/.grok/skills/lsp-setup/references/haskell/README.md +57 -0
  438. package/.grok/skills/lsp-setup/references/java/README.md +55 -0
  439. package/.grok/skills/lsp-setup/references/julia/README.md +56 -0
  440. package/.grok/skills/lsp-setup/references/kotlin/README.md +58 -0
  441. package/.grok/skills/lsp-setup/references/lua/README.md +48 -0
  442. package/.grok/skills/lsp-setup/references/php/README.md +49 -0
  443. package/.grok/skills/lsp-setup/references/python/README.md +60 -0
  444. package/.grok/skills/lsp-setup/references/ruby/README.md +53 -0
  445. package/.grok/skills/lsp-setup/references/rust/README.md +55 -0
  446. package/.grok/skills/lsp-setup/references/swift/README.md +52 -0
  447. package/.grok/skills/lsp-setup/references/terraform/README.md +50 -0
  448. package/.grok/skills/lsp-setup/references/typescript/README.md +63 -0
  449. package/.grok/skills/lsp-setup/references/yaml/README.md +47 -0
  450. package/.grok/skills/lsp-setup/references/zig/README.md +49 -0
  451. package/.grok/skills/lsp-setup/scripts/detect-lsp.mjs +40 -0
  452. package/.grok/skills/lsp-setup/scripts/lsp-server-table.mjs +309 -0
  453. package/.grok/skills/lsp-setup/scripts/verify-lsp.mjs +54 -0
  454. package/.grok/skills/refactor/SKILL.md +210 -0
  455. package/.grok/skills/review-work/SKILL.md +515 -0
  456. package/.grok/skills/review-work/references/behavior-lane-contract.md +48 -0
  457. package/.grok/skills/review-work/references/documentation-lane-contract.md +49 -0
  458. package/.grok/skills/review-work/references/integration-lane-contract.md +51 -0
  459. package/.grok/skills/review-work/references/regression-lane-contract.md +48 -0
  460. package/.grok/skills/review-work/references/safety-lane-contract.md +48 -0
  461. package/.grok/skills/review-work/references/test-lane-contract.md +48 -0
  462. package/.grok/skills/review-work/scripts/check-lanes.mjs +63 -0
  463. package/.grok/skills/rules/SKILL.md +51 -0
  464. package/.grok/skills/rules/references/loading-order-contract.md +66 -0
  465. package/.grok/skills/rules/scripts/resolve-guidance.mjs +180 -0
  466. package/.grok/skills/skill-observer/SKILL.md +78 -0
  467. package/.grok/skills/skill-observer/references/review-contract.md +77 -0
  468. package/.grok/skills/skill-observer/scripts/curator.mjs +121 -0
  469. package/.grok/skills/skill-observer/scripts/review.mjs +347 -0
  470. package/.grok/skills/skill-observer/scripts/skill-loop.mjs +2087 -0
  471. package/.grok/skills/skill-observer/scripts/validate-skills.mjs +83 -0
  472. package/.grok/skills/start-work/SKILL.md +396 -0
  473. package/.grok/skills/structural-search/SKILL.md +195 -0
  474. package/.grok/skills/visual-qa/SKILL.md +50 -0
  475. package/.grok/skills/visual-qa/references/capture-playbook.md +47 -0
  476. package/.grok/skills/visual-qa/references/complete-contract.md +721 -0
  477. package/.grok/skills/visual-qa/references/verdict-taxonomy.md +34 -0
  478. package/.grok/skills/visual-qa/scripts/verify-evidence-manifest.mjs +91 -0
  479. package/.grok/skills/wikify/SKILL.md +65 -0
  480. package/.grok/skills/wikify/references/page-format.md +81 -0
  481. package/.grok/skills/wikify/references/provenance-contract.md +52 -0
  482. package/.grok/vendor/NOTICE.md +16 -0
  483. package/.grok/vendor/licenses/045_scientific-visualization-MIT.txt +21 -0
  484. package/.grok/vendor/provenance/045_scientific-visualization.md +37 -0
  485. package/.grok/vendor/scientific-visualization/assets/color_palettes.py +197 -0
  486. package/.grok/vendor/scientific-visualization/assets/nature.mplstyle +75 -0
  487. package/.grok/vendor/scientific-visualization/assets/presentation.mplstyle +74 -0
  488. package/.grok/vendor/scientific-visualization/assets/publication.mplstyle +78 -0
  489. package/.grok/vendor/scientific-visualization/evals/evals.json +158 -0
  490. package/.grok/vendor/scientific-visualization/references/_canonical-corpus/manifest.json +38 -0
  491. package/.grok/vendor/scientific-visualization/references/color_palettes.md +380 -0
  492. package/.grok/vendor/scientific-visualization/references/journal_requirements.md +359 -0
  493. package/.grok/vendor/scientific-visualization/references/matplotlib_examples.md +608 -0
  494. package/.grok/vendor/scientific-visualization/references/mdanalysis_martini_visualization.md +85 -0
  495. package/.grok/vendor/scientific-visualization/references/publication_guidelines.md +217 -0
  496. package/.grok/vendor/scientific-visualization/references/seaborn_for_publications.md +293 -0
  497. package/.grok/vendor/scientific-visualization/scripts/figure_export.py +238 -0
  498. package/.grok/vendor/scientific-visualization/scripts/style_presets.py +467 -0
  499. package/.grok/vendor/scientific-visualization/tests/test_figure_export.py +51 -0
  500. package/.grok/vendor/scientific-visualization/tests/test_style_presets.py +114 -0
  501. package/CHANGELOG.md +131 -0
  502. package/CODE_OF_CONDUCT.md +9 -0
  503. package/CONTRIBUTING.md +22 -0
  504. package/LICENSE +21 -0
  505. package/README.md +228 -0
  506. package/README_ko-KR.md +228 -0
  507. package/SECURITY.md +11 -0
  508. package/SUPPORT.md +9 -0
  509. package/bin/litgrok.mjs +860 -0
  510. package/docs/assets/cover.webp +0 -0
  511. package/docs/assets/litgrok-clay-icon.png +0 -0
  512. package/docs/assets/litgrok-continuity-1600.webp +0 -0
  513. package/docs/assets/litgrok-ignition-1600.webp +0 -0
  514. package/docs/assets/litgrok-wordmark.svg +5 -0
  515. package/docs/assets/readme/README.md +31 -0
  516. package/docs/assets/readme/badge-license.svg +1 -0
  517. package/docs/assets/readme/badge-version.svg +1 -0
  518. package/docs/privacy.md +13 -0
  519. package/docs/reference.md +271 -0
  520. package/docs/reference_ko-KR.md +267 -0
  521. package/package.json +50 -0
  522. package/plugin.json +27 -0
@@ -0,0 +1,286 @@
1
+ // Byte-level and canonical-form primitives for litfamily.design-contract/v1alpha1.
2
+ //
3
+ // Everything in this module runs before any semantic rule. A failure here means the input
4
+ // bytes cannot be trusted at all, so callers must surface it as an untrusted-input error
5
+ // rather than as a contract issue.
6
+ import { lstatSync, readFileSync } from "node:fs";
7
+ import { resolve } from "node:path";
8
+
9
+ import { UiuxContractError } from "./errors.mjs";
10
+
11
+ // A contract is a finite decision record, not a document store. One mebibyte, measured in
12
+ // UTF-8 bytes before parsing, is the same boundary the evidence lane applies when it reads a
13
+ // contract back.
14
+ const CONTRACT_MAX_BYTES = 1024 * 1024;
15
+
16
+ // Nesting is bounded so a hostile file cannot exhaust the stack during the raw scan.
17
+ const CONTRACT_MAX_DEPTH = 24;
18
+
19
+ // Typed identifier grammar. The prefix names the declared kind; the tail is a stable slug.
20
+ const STABLE_ID = /^[a-z][a-z0-9-]*:[a-z0-9][a-z0-9._/-]*$/u;
21
+
22
+ // Lowercase hexadecimal only. An uppercase digest is a different string and would produce a
23
+ // different canonical form, so it is rejected instead of folded.
24
+ const LOWERCASE_SHA256 = /^[0-9a-f]{64}$/u;
25
+
26
+ // Every identifier in the contract carries the prefix of the group that declares it.
27
+ export const ID_PREFIXES = Object.freeze({
28
+ contract: "contract:",
29
+ route: "route:",
30
+ region: "region:",
31
+ component: "component:",
32
+ interaction: "interaction:",
33
+ state: "state:",
34
+ viewport: "viewport:",
35
+ reference: "reference:",
36
+ });
37
+
38
+ const SIMPLE_ESCAPES = Object.freeze({
39
+ '"': '"',
40
+ "\\": "\\",
41
+ "/": "/",
42
+ b: "\b",
43
+ f: "\f",
44
+ n: "\n",
45
+ r: "\r",
46
+ t: "\t",
47
+ });
48
+
49
+ function untrusted(code, message, details = {}) {
50
+ throw new UiuxContractError(code, message, details);
51
+ }
52
+
53
+ export function isStableId(value) {
54
+ return typeof value === "string" && STABLE_ID.test(value);
55
+ }
56
+
57
+ export function isPrefixedId(value, prefix) {
58
+ return isStableId(value) && value.startsWith(prefix);
59
+ }
60
+
61
+ export function isLowercaseSha256(value) {
62
+ return typeof value === "string" && LOWERCASE_SHA256.test(value);
63
+ }
64
+
65
+ // Strict ISO-8601 UTC. The round trip is the whole check: it accepts exactly the shape
66
+ // Date#toISOString emits, which rejects numeric offsets, microsecond precision, a lowercase
67
+ // `z`, and any calendar value that silently normalises (for example 2026-02-30).
68
+ export function isUtcTimestamp(value) {
69
+ if (typeof value !== "string") return false;
70
+ const parsed = Date.parse(value);
71
+ if (!Number.isFinite(parsed)) return false;
72
+ return new Date(parsed).toISOString() === value;
73
+ }
74
+
75
+ function canonicalValue(value) {
76
+ if (Array.isArray(value)) return `[${value.map(canonicalValue).join(",")}]`;
77
+ if (value !== null && typeof value === "object") {
78
+ return `{${Object.keys(value).sort().map(
79
+ (key) => `${JSON.stringify(key)}:${canonicalValue(value[key])}`,
80
+ ).join(",")}}`;
81
+ }
82
+ return JSON.stringify(value);
83
+ }
84
+
85
+ // Canonical form: object keys sorted recursively, array order preserved, and a single
86
+ // trailing newline. The newline is part of the canonical bytes -- every hash taken over a
87
+ // contract in this system is taken over the form produced here, so dropping it would
88
+ // silently invalidate every recorded digest.
89
+ export function canonicalDesignContract(value) {
90
+ return `${canonicalValue(value)}\n`;
91
+ }
92
+
93
+ // Raw structural scan performed before the runtime parser sees the text.
94
+ //
95
+ // JSON.parse keeps the last value of a repeated key and reports nothing, so a contract could
96
+ // carry a second `accessibility` block that no reviewer ever reads. This walker rebuilds the
97
+ // object structure from the raw characters and keeps a fresh key set for every object at
98
+ // every depth, which is what makes sibling objects legal and repeats inside one object fatal.
99
+ // It also rejects raw control characters inside strings and any trailing data.
100
+ function scanTrustedJson(text) {
101
+ let index = 0;
102
+
103
+ const fail = (code, message) => untrusted(code, `${message} at offset ${index}`, { offset: index });
104
+
105
+ const skipBlank = () => {
106
+ while (index < text.length && (
107
+ text[index] === " " || text[index] === "\t" || text[index] === "\n" || text[index] === "\r"
108
+ )) index += 1;
109
+ };
110
+
111
+ const readString = () => {
112
+ index += 1;
113
+ let value = "";
114
+ while (index < text.length) {
115
+ const char = text[index];
116
+ if (char === '"') {
117
+ index += 1;
118
+ return value;
119
+ }
120
+ if (char === "\\") {
121
+ const escape = text[index + 1];
122
+ if (escape === "u") {
123
+ const hex = text.slice(index + 2, index + 6);
124
+ if (!/^[0-9a-fA-F]{4}$/u.test(hex)) fail("DESIGN_CONTRACT_UNTRUSTED_JSON", "invalid unicode escape");
125
+ value += String.fromCharCode(Number.parseInt(hex, 16));
126
+ index += 6;
127
+ continue;
128
+ }
129
+ if (escape === undefined || !Object.hasOwn(SIMPLE_ESCAPES, escape)) {
130
+ fail("DESIGN_CONTRACT_UNTRUSTED_JSON", "invalid string escape");
131
+ }
132
+ value += SIMPLE_ESCAPES[escape];
133
+ index += 2;
134
+ continue;
135
+ }
136
+ if (char < " ") fail("DESIGN_CONTRACT_UNTRUSTED_JSON", "raw control character inside a string");
137
+ value += char;
138
+ index += 1;
139
+ }
140
+ return fail("DESIGN_CONTRACT_UNTRUSTED_JSON", "unterminated string");
141
+ };
142
+
143
+ const readValue = (depth) => {
144
+ if (depth > CONTRACT_MAX_DEPTH) fail("DESIGN_CONTRACT_UNTRUSTED_JSON", "nesting exceeds the bounded depth");
145
+ skipBlank();
146
+ const char = text[index];
147
+ if (char === undefined) fail("DESIGN_CONTRACT_UNTRUSTED_JSON", "unexpected end of input");
148
+ if (char === '"') {
149
+ readString();
150
+ return;
151
+ }
152
+ if (char === "{") {
153
+ readObject(depth);
154
+ return;
155
+ }
156
+ if (char === "[") {
157
+ readArray(depth);
158
+ return;
159
+ }
160
+ const start = index;
161
+ while (index < text.length && !',}] \t\n\r'.includes(text[index])) index += 1;
162
+ if (index === start) fail("DESIGN_CONTRACT_UNTRUSTED_JSON", "unexpected character");
163
+ };
164
+
165
+ const readObject = (depth) => {
166
+ index += 1;
167
+ // One key set per object per depth: siblings never share it, so only a repeat inside
168
+ // this exact object is a duplicate.
169
+ const keys = new Set();
170
+ skipBlank();
171
+ if (text[index] === "}") {
172
+ index += 1;
173
+ return;
174
+ }
175
+ for (;;) {
176
+ skipBlank();
177
+ if (text[index] !== '"') fail("DESIGN_CONTRACT_UNTRUSTED_JSON", "expected an object key string");
178
+ const keyOffset = index;
179
+ const key = readString();
180
+ if (keys.has(key)) {
181
+ index = keyOffset;
182
+ fail("DESIGN_CONTRACT_DUPLICATE_JSON_KEY", `duplicate object key ${JSON.stringify(key)}`);
183
+ }
184
+ keys.add(key);
185
+ skipBlank();
186
+ if (text[index] !== ":") fail("DESIGN_CONTRACT_UNTRUSTED_JSON", "expected a colon");
187
+ index += 1;
188
+ readValue(depth + 1);
189
+ skipBlank();
190
+ if (text[index] === ",") {
191
+ index += 1;
192
+ continue;
193
+ }
194
+ if (text[index] === "}") {
195
+ index += 1;
196
+ return;
197
+ }
198
+ fail("DESIGN_CONTRACT_UNTRUSTED_JSON", "expected a comma or a closing brace");
199
+ }
200
+ };
201
+
202
+ const readArray = (depth) => {
203
+ index += 1;
204
+ skipBlank();
205
+ if (text[index] === "]") {
206
+ index += 1;
207
+ return;
208
+ }
209
+ for (;;) {
210
+ readValue(depth + 1);
211
+ skipBlank();
212
+ if (text[index] === ",") {
213
+ index += 1;
214
+ continue;
215
+ }
216
+ if (text[index] === "]") {
217
+ index += 1;
218
+ return;
219
+ }
220
+ fail("DESIGN_CONTRACT_UNTRUSTED_JSON", "expected a comma or a closing bracket");
221
+ }
222
+ };
223
+
224
+ readValue(0);
225
+ skipBlank();
226
+ if (index !== text.length) fail("DESIGN_CONTRACT_UNTRUSTED_JSON", "trailing data after the top-level value");
227
+ }
228
+
229
+ // Bounded read. Size is checked from the directory entry first so an oversize file is never
230
+ // pulled into memory, and lstat is used directly so a symlink is not a regular file here.
231
+ function readContractText(path, maxBytes) {
232
+ const absolutePath = resolve(path);
233
+ let stat;
234
+ try {
235
+ stat = lstatSync(absolutePath);
236
+ } catch {
237
+ untrusted("DESIGN_CONTRACT_UNREADABLE", `cannot stat ${absolutePath}`);
238
+ }
239
+ if (!stat.isFile()) {
240
+ untrusted("DESIGN_CONTRACT_UNREADABLE", `expected a regular file: ${absolutePath}`);
241
+ }
242
+ if (stat.size > maxBytes) {
243
+ untrusted("DESIGN_CONTRACT_OVERSIZE", `input exceeds ${maxBytes} bytes`, {
244
+ actual_bytes: stat.size,
245
+ max_bytes: maxBytes,
246
+ });
247
+ }
248
+ let bytes;
249
+ try {
250
+ bytes = readFileSync(absolutePath);
251
+ } catch {
252
+ untrusted("DESIGN_CONTRACT_UNREADABLE", `cannot read ${absolutePath}`);
253
+ }
254
+ if (bytes.length > maxBytes) {
255
+ untrusted("DESIGN_CONTRACT_OVERSIZE", `input exceeds ${maxBytes} bytes`, {
256
+ actual_bytes: bytes.length,
257
+ max_bytes: maxBytes,
258
+ });
259
+ }
260
+ let text;
261
+ try {
262
+ text = new TextDecoder("utf-8", { fatal: true }).decode(bytes);
263
+ } catch {
264
+ untrusted("DESIGN_CONTRACT_NOT_UTF8", `input is not valid UTF-8: ${absolutePath}`);
265
+ }
266
+ if (text.charCodeAt(0) === 0xfeff) {
267
+ untrusted("DESIGN_CONTRACT_NOT_UTF8", "a UTF-8 byte order mark is not part of a contract");
268
+ }
269
+ if (text.includes("\0")) {
270
+ untrusted("DESIGN_CONTRACT_NOT_UTF8", "NUL bytes are not permitted");
271
+ }
272
+ return { absolutePath, bytes, text };
273
+ }
274
+
275
+ // Read, scan, then parse. The scan is what makes the parse safe to trust.
276
+ export function readDesignContract(path) {
277
+ const source = readContractText(path, CONTRACT_MAX_BYTES);
278
+ scanTrustedJson(source.text);
279
+ let value;
280
+ try {
281
+ value = JSON.parse(source.text);
282
+ } catch (error) {
283
+ untrusted("DESIGN_CONTRACT_UNTRUSTED_JSON", `invalid JSON: ${error.message}`);
284
+ }
285
+ return { ...source, value };
286
+ }
@@ -0,0 +1,354 @@
1
+ // Inventory rules of litfamily.design-contract/v1alpha1.
2
+ //
3
+ // The inventory is the finite surface the contract promises to design and later prove. These
4
+ // rules run in code because a JSON Schema document can describe an entry's shape but cannot
5
+ // resolve one entry against another, and cannot express the auth safety coupling at all.
6
+ import {
7
+ ID_PREFIXES,
8
+ isLowercaseSha256,
9
+ isPrefixedId,
10
+ isStableId,
11
+ } from "./design-contract-format.mjs";
12
+ import {
13
+ collectKeyIssues,
14
+ isBoundedInteger,
15
+ isObject,
16
+ isStrictBoolean,
17
+ isText,
18
+ } from "./design-contract-surface-rules.mjs";
19
+
20
+ // Closed sets. A new value is a contract revision, not a free-text extension.
21
+ export const STATE_KINDS = Object.freeze([
22
+ "loading", "empty", "error", "success", "disabled", "permission", "offline", "ready",
23
+ ]);
24
+
25
+ export const INPUT_MODES = Object.freeze(["keyboard", "pointer", "touch", "voice", "switch"]);
26
+
27
+ export const VIEWPORT_CATEGORIES = Object.freeze(["compact", "medium", "expanded"]);
28
+
29
+ export const REFERENCE_KINDS = Object.freeze([
30
+ "user-provided", "repo-local", "generated", "measured",
31
+ ]);
32
+
33
+ // Group name -> the identifier kind its entries declare, in declaration order.
34
+ export const INVENTORY_GROUPS = Object.freeze([
35
+ ["routes", "route"],
36
+ ["regions", "region"],
37
+ ["components", "component"],
38
+ ["interactions", "interaction"],
39
+ ["states", "state"],
40
+ ["viewports", "viewport"],
41
+ ["references", "reference"],
42
+ ]);
43
+
44
+ const GROUP_LIMITS = Object.freeze({
45
+ routes: [1, 128],
46
+ regions: [1, 256],
47
+ components: [1, 512],
48
+ interactions: [1, 256],
49
+ states: [0, 512],
50
+ viewports: [0, 32],
51
+ references: [0, 64],
52
+ authenticated_surfaces: [0, 128],
53
+ });
54
+
55
+ const SHAPE = "DESIGN_CONTRACT_INVENTORY_SHAPE";
56
+ const CARDINALITY = "DESIGN_CONTRACT_INVENTORY_CARDINALITY";
57
+ const DANGLING = "DESIGN_CONTRACT_DANGLING_REFERENCE";
58
+ const AUTH = "DESIGN_CONTRACT_AUTH_COUPLING";
59
+
60
+ function collectIdIssues(issues, value, path, kind) {
61
+ const prefix = ID_PREFIXES[kind];
62
+ if (!isStableId(value)) {
63
+ issues.push({
64
+ code: "DESIGN_CONTRACT_ID_GRAMMAR",
65
+ path,
66
+ message: `${path} must match the typed lowercase identifier grammar`,
67
+ });
68
+ return false;
69
+ }
70
+ if (!isPrefixedId(value, prefix)) {
71
+ issues.push({
72
+ code: "DESIGN_CONTRACT_ID_PREFIX",
73
+ path,
74
+ message: `${path} must start with ${prefix}`,
75
+ });
76
+ return false;
77
+ }
78
+ return true;
79
+ }
80
+
81
+ function collectLinkIssues(issues, value, path, kind, declared) {
82
+ if (!collectIdIssues(issues, value, path, kind)) return;
83
+ if (!declared.has(value)) {
84
+ issues.push({ code: DANGLING, path, message: `${path} does not resolve to a declared ${kind}` });
85
+ }
86
+ }
87
+
88
+ function collectGroupShape(issues, inventory) {
89
+ let shaped = true;
90
+ for (const group of [...INVENTORY_GROUPS.map(([name]) => name), "authenticated_surfaces"]) {
91
+ const [minimum, maximum] = GROUP_LIMITS[group];
92
+ const entries = inventory[group];
93
+ if (!Array.isArray(entries)) {
94
+ issues.push({ code: SHAPE, path: `inventory.${group}`, message: `inventory.${group} must be an array` });
95
+ shaped = false;
96
+ continue;
97
+ }
98
+ if (entries.length < minimum || entries.length > maximum) {
99
+ issues.push({
100
+ code: CARDINALITY,
101
+ path: `inventory.${group}`,
102
+ message: `inventory.${group} needs ${minimum}..${maximum} entries`,
103
+ });
104
+ shaped = false;
105
+ continue;
106
+ }
107
+ if (!entries.every(isObject)) {
108
+ issues.push({ code: SHAPE, path: `inventory.${group}`, message: `inventory.${group} entries must be objects` });
109
+ shaped = false;
110
+ }
111
+ }
112
+ return shaped;
113
+ }
114
+
115
+ function collectRouteIssues(issues, routes) {
116
+ routes.forEach((route, index) => {
117
+ const path = `inventory.routes[${index}]`;
118
+ if (!collectKeyIssues(issues, route, path, SHAPE, ["id", "path", "primary", "auth_required"])) return;
119
+ collectIdIssues(issues, route.id, `${path}.id`, "route");
120
+ if (!isText(route.path)) {
121
+ issues.push({ code: SHAPE, path: `${path}.path`, message: `${path}.path must be one bounded line` });
122
+ }
123
+ for (const field of ["primary", "auth_required"]) {
124
+ if (!isStrictBoolean(route[field])) {
125
+ issues.push({
126
+ code: SHAPE,
127
+ path: `${path}.${field}`,
128
+ message: `${path}.${field} must be true or false, not a truthy value`,
129
+ });
130
+ }
131
+ }
132
+ });
133
+ // At least one route must be primary. A contract where everything is secondary has not
134
+ // decided what the surface is for.
135
+ if (!routes.some((route) => route.primary === true)) {
136
+ issues.push({
137
+ code: CARDINALITY,
138
+ path: "inventory.routes",
139
+ message: "inventory.routes needs at least one route with primary true",
140
+ });
141
+ }
142
+ }
143
+
144
+ function collectRegionIssues(issues, regions, routeIds) {
145
+ regions.forEach((region, index) => {
146
+ const path = `inventory.regions[${index}]`;
147
+ if (!collectKeyIssues(issues, region, path, SHAPE, ["id", "route_id", "purpose"])) return;
148
+ collectIdIssues(issues, region.id, `${path}.id`, "region");
149
+ collectLinkIssues(issues, region.route_id, `${path}.route_id`, "route", routeIds);
150
+ if (!isText(region.purpose)) {
151
+ issues.push({ code: SHAPE, path: `${path}.purpose`, message: `${path}.purpose must be one bounded line` });
152
+ }
153
+ });
154
+ }
155
+
156
+ function collectComponentIssues(issues, components, regionIds) {
157
+ components.forEach((component, index) => {
158
+ const path = `inventory.components[${index}]`;
159
+ if (!collectKeyIssues(issues, component, path, SHAPE, ["id", "region_id", "role"])) return;
160
+ collectIdIssues(issues, component.id, `${path}.id`, "component");
161
+ collectLinkIssues(issues, component.region_id, `${path}.region_id`, "region", regionIds);
162
+ if (!isText(component.role)) {
163
+ issues.push({ code: SHAPE, path: `${path}.role`, message: `${path}.role must be one bounded line` });
164
+ }
165
+ });
166
+ }
167
+
168
+ function collectInteractionIssues(issues, interactions, routeIds) {
169
+ interactions.forEach((interaction, index) => {
170
+ const path = `inventory.interactions[${index}]`;
171
+ if (!collectKeyIssues(issues, interaction, path, SHAPE, [
172
+ "id", "route_id", "critical", "input_modes",
173
+ ])) return;
174
+ collectIdIssues(issues, interaction.id, `${path}.id`, "interaction");
175
+ collectLinkIssues(issues, interaction.route_id, `${path}.route_id`, "route", routeIds);
176
+ if (!isStrictBoolean(interaction.critical)) {
177
+ issues.push({
178
+ code: SHAPE,
179
+ path: `${path}.critical`,
180
+ message: `${path}.critical must be true or false, not a truthy value`,
181
+ });
182
+ }
183
+ const modes = interaction.input_modes;
184
+ if (!Array.isArray(modes) || modes.length < 1 || modes.length > INPUT_MODES.length
185
+ || modes.length !== new Set(modes).size
186
+ || !modes.every((mode) => INPUT_MODES.includes(mode))) {
187
+ issues.push({
188
+ code: SHAPE,
189
+ path: `${path}.input_modes`,
190
+ message: `${path}.input_modes must be a non-empty unique subset of ${INPUT_MODES.join(", ")}`,
191
+ });
192
+ }
193
+ });
194
+ // Something has to be critical, otherwise the evidence lane has no priority signal.
195
+ if (!interactions.some((interaction) => interaction.critical === true)) {
196
+ issues.push({
197
+ code: CARDINALITY,
198
+ path: "inventory.interactions",
199
+ message: "inventory.interactions needs at least one interaction with critical true",
200
+ });
201
+ }
202
+ }
203
+
204
+ function collectStateIssues(issues, states, routeIds) {
205
+ states.forEach((state, index) => {
206
+ const path = `inventory.states[${index}]`;
207
+ if (!collectKeyIssues(issues, state, path, SHAPE, ["id", "route_id", "kind"])) return;
208
+ collectIdIssues(issues, state.id, `${path}.id`, "state");
209
+ collectLinkIssues(issues, state.route_id, `${path}.route_id`, "route", routeIds);
210
+ if (!STATE_KINDS.includes(state.kind)) {
211
+ issues.push({
212
+ code: SHAPE,
213
+ path: `${path}.kind`,
214
+ message: `${path}.kind must be one of ${STATE_KINDS.join(", ")}`,
215
+ });
216
+ }
217
+ });
218
+ }
219
+
220
+ function collectViewportIssues(issues, viewports) {
221
+ viewports.forEach((viewport, index) => {
222
+ const path = `inventory.viewports[${index}]`;
223
+ if (!collectKeyIssues(issues, viewport, path, SHAPE, ["id", "category", "width_px", "height_px"])) return;
224
+ collectIdIssues(issues, viewport.id, `${path}.id`, "viewport");
225
+ if (!VIEWPORT_CATEGORIES.includes(viewport.category)) {
226
+ issues.push({
227
+ code: SHAPE,
228
+ path: `${path}.category`,
229
+ message: `${path}.category must be one of ${VIEWPORT_CATEGORIES.join(", ")}`,
230
+ });
231
+ }
232
+ if (!isBoundedInteger(viewport.width_px, 240, 7680)) {
233
+ issues.push({
234
+ code: SHAPE,
235
+ path: `${path}.width_px`,
236
+ message: `${path}.width_px must be an integer from 240 through 7680`,
237
+ });
238
+ }
239
+ if (!isBoundedInteger(viewport.height_px, 240, 4320)) {
240
+ issues.push({
241
+ code: SHAPE,
242
+ path: `${path}.height_px`,
243
+ message: `${path}.height_px must be an integer from 240 through 4320`,
244
+ });
245
+ }
246
+ });
247
+ }
248
+
249
+ function collectReferenceIssues(issues, references) {
250
+ references.forEach((reference, index) => {
251
+ const path = `inventory.references[${index}]`;
252
+ if (!collectKeyIssues(issues, reference, path, SHAPE, ["id", "kind", "sha256", "provenance"])) return;
253
+ collectIdIssues(issues, reference.id, `${path}.id`, "reference");
254
+ if (!REFERENCE_KINDS.includes(reference.kind)) {
255
+ issues.push({
256
+ code: SHAPE,
257
+ path: `${path}.kind`,
258
+ message: `${path}.kind must be one of ${REFERENCE_KINDS.join(", ")}`,
259
+ });
260
+ }
261
+ if (!isLowercaseSha256(reference.sha256)) {
262
+ issues.push({
263
+ code: "DESIGN_CONTRACT_HASH_GRAMMAR",
264
+ path: `${path}.sha256`,
265
+ message: `${path}.sha256 must be 64 lowercase hexadecimal digits`,
266
+ });
267
+ }
268
+ if (!isText(reference.provenance)) {
269
+ issues.push({
270
+ code: SHAPE,
271
+ path: `${path}.provenance`,
272
+ message: `${path}.provenance must be one bounded line`,
273
+ });
274
+ }
275
+ });
276
+ }
277
+
278
+ // Auth safety coupling. Both directions are errors because both are ways to lose track of who
279
+ // can reach a surface: an authenticated route with no declared surface has no reviewable test
280
+ // path, and a declared surface on a public route claims protection that does not exist. A
281
+ // surface is only usable when its account is explicitly safe to exercise.
282
+ function collectAuthenticatedSurfaceIssues(issues, surfaces, routes) {
283
+ const routeById = new Map(routes.map((route) => [route.id, route]));
284
+ const claimed = new Set();
285
+ surfaces.forEach((surface, index) => {
286
+ const path = `inventory.authenticated_surfaces[${index}]`;
287
+ if (!collectKeyIssues(issues, surface, path, SHAPE, ["route_id", "safe_test_account"])) return;
288
+ collectLinkIssues(issues, surface.route_id, `${path}.route_id`, "route", new Set(routeById.keys()));
289
+ if (claimed.has(surface.route_id)) {
290
+ issues.push({
291
+ code: AUTH,
292
+ path: `${path}.route_id`,
293
+ message: `${surface.route_id} is claimed by more than one authenticated surface`,
294
+ });
295
+ }
296
+ claimed.add(surface.route_id);
297
+ if (surface.safe_test_account !== true) {
298
+ issues.push({
299
+ code: AUTH,
300
+ path: `${path}.safe_test_account`,
301
+ message: `${path}.safe_test_account must be exactly true`,
302
+ });
303
+ }
304
+ const route = routeById.get(surface.route_id);
305
+ if (route && route.auth_required !== true) {
306
+ issues.push({
307
+ code: AUTH,
308
+ path: `${path}.route_id`,
309
+ message: `${surface.route_id} is public, so it must not declare an authenticated surface`,
310
+ });
311
+ }
312
+ });
313
+ for (const route of routes) {
314
+ if (route.auth_required === true && !claimed.has(route.id)) {
315
+ issues.push({
316
+ code: AUTH,
317
+ path: "inventory.authenticated_surfaces",
318
+ message: `${route.id} requires auth but declares no authenticated surface`,
319
+ });
320
+ }
321
+ }
322
+ }
323
+
324
+ // Flat view of the inventory: one { id, kind } entry per declared surface, in group order.
325
+ // Downstream evidence accounting consumes this instead of reaching into the groups.
326
+ export function designContractInventoryEntries(contract) {
327
+ const inventory = contract?.inventory;
328
+ if (!isObject(inventory)) return [];
329
+ const entries = [];
330
+ for (const [group, kind] of INVENTORY_GROUPS) {
331
+ if (!Array.isArray(inventory[group])) continue;
332
+ for (const entry of inventory[group]) {
333
+ if (isObject(entry) && typeof entry.id === "string") entries.push({ id: entry.id, kind });
334
+ }
335
+ }
336
+ return entries;
337
+ }
338
+
339
+ export function collectInventoryIssues(contract, issues) {
340
+ const inventory = contract.inventory;
341
+ const groups = [...INVENTORY_GROUPS.map(([name]) => name), "authenticated_surfaces"];
342
+ if (!collectKeyIssues(issues, inventory, "inventory", SHAPE, groups)) return;
343
+ if (!collectGroupShape(issues, inventory)) return;
344
+ const routeIds = new Set(inventory.routes.map(({ id }) => id));
345
+ const regionIds = new Set(inventory.regions.map(({ id }) => id));
346
+ collectRouteIssues(issues, inventory.routes);
347
+ collectRegionIssues(issues, inventory.regions, routeIds);
348
+ collectComponentIssues(issues, inventory.components, regionIds);
349
+ collectInteractionIssues(issues, inventory.interactions, routeIds);
350
+ collectStateIssues(issues, inventory.states, routeIds);
351
+ collectViewportIssues(issues, inventory.viewports);
352
+ collectReferenceIssues(issues, inventory.references);
353
+ collectAuthenticatedSurfaceIssues(issues, inventory.authenticated_surfaces, inventory.routes);
354
+ }