@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,738 @@
1
+ #!/usr/bin/env node
2
+ import { execFileSync, spawnSync } from "node:child_process";
3
+ import { createHash } from "node:crypto";
4
+ import {
5
+ cpSync,
6
+ existsSync,
7
+ lstatSync,
8
+ mkdirSync,
9
+ mkdtempSync,
10
+ readFileSync,
11
+ readdirSync,
12
+ rmSync,
13
+ symlinkSync,
14
+ } from "node:fs";
15
+ import { tmpdir } from "node:os";
16
+ import { basename, dirname, join, relative, resolve, sep } from "node:path";
17
+ import { fileURLToPath } from "node:url";
18
+
19
+ const PRODUCT_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), "..");
20
+ const SKILL_ROOT_RELATIVE = "skills";
21
+ const PACK_PREFIX = "skills";
22
+ const ALLOWLIST_RELATIVE = join("tools", "payload-substance-allowlist.json");
23
+ const PARITY_MANIFEST_RELATIVE = join("tools", "payload-substance-parity.json");
24
+ const REFERENCE_EXEMPTIONS_RELATIVE = join("tools", "payload-reference-exemptions.json");
25
+ const SCHEMA = "litfamily.payload-substance/v1";
26
+ const PARITY_SCHEMA = "litfamily.payload-parity/v1";
27
+ const REFERENCE_SCHEMA = "litfamily.payload-references/v1";
28
+ const LEGAL_NAMES = new Set(["ATTRIBUTION.md", "LICENSE", "NOTICE", "ORIGIN.json", "PROVENANCE.md"]);
29
+ const GENERIC_REFERENCE_NAMES = new Set(["README.md", "package.json", "SKILL.md", "AGENTS.md", "CLAUDE.md"]);
30
+ // Claims are markdown targets plus local path tokens outside fenced examples: inline/bare tokens need a file extension, an explicit relative/absolute marker, or a trailing resource directory. URLs, generic filenames, placeholders, and prose/API identifiers are not claims.
31
+ const REFERENCE_ROOTS = new Set(["references", "scripts", "assets", "templates", "tests", "test", "vendor", "original", "evals", "schemas", "schema", "skills", "modes", "src", "bin", "lib", "plugins", "docs", "wiki", "data", "dist", "examples"]);
32
+ const PACKED_REFERENCE_ROOTS = new Set(["references", "scripts", "assets", "templates", "vendor", "original", "evals", "schemas", "schema", "skills", "modes", "plugins", "data", "examples"]);
33
+ export const PARITY_FRACTION = 0.5;
34
+ const PRODUCT_ID = "p32";
35
+ const P31_PUBLISHED_PACKAGE_RELATIVE = join("packages", "litcodex-ai");
36
+ const FAMILY_LAYOUT = Object.freeze([
37
+ { id: "p27", packageRelative: ["27_PRIVATE_litclaude"], skillRootRelative: join("plugins", "litclaude", "skills"), packPrefix: "plugins/litclaude/skills" },
38
+ { id: "p28", packageRelative: ["28_PRIVATE_lithermes", "packages", "lithermes-installer"], skillRootRelative: join("assets", "lithermes-plugin", "skills"), packPrefix: "assets/lithermes-plugin/skills" },
39
+ { id: "p31", packageRelative: ["31_litcodex", "litcodex"], packRootRelative: ["31_litcodex", "litcodex", "packages", "litcodex-ai"], packWithScripts: true, skillRootRelative: join("plugins", "litcodex", "skills") },
40
+ { id: "p32", packageRelative: ["32_litopencode"], skillRootRelative: "skills", packPrefix: "skills" },
41
+ { id: "p33", packageRelative: ["33_litgrok"], skillRootRelative: join(".grok", "skills"), packPrefix: ".grok/skills" },
42
+ ]);
43
+
44
+ function regularFiles(directory, relativePath = "") {
45
+ const files = [];
46
+ for (const entry of readdirSync(directory, { withFileTypes: true })) {
47
+ const child = join(directory, entry.name);
48
+ const childRelative = relativePath ? join(relativePath, entry.name) : entry.name;
49
+ if (entry.isSymbolicLink()) throw new Error(`PAYLOAD_SUBSTANCE_SYMLINK: ${childRelative}`);
50
+ if (entry.isDirectory()) files.push(...regularFiles(child, childRelative));
51
+ else if (entry.isFile()) files.push(childRelative.split(sep).join("/"));
52
+ }
53
+ return files;
54
+ }
55
+
56
+ function inventory(skillRoot) {
57
+ if (!existsSync(skillRoot) || !lstatSync(skillRoot).isDirectory()) throw new Error(`SKILL_ROOT_MISSING: ${skillRoot}`);
58
+ return readdirSync(skillRoot, { withFileTypes: true })
59
+ .filter((entry) => entry.isDirectory())
60
+ .sort((left, right) => left.name.localeCompare(right.name))
61
+ .map((entry) => ({ name: entry.name, files: regularFiles(join(skillRoot, entry.name)), directory: join(skillRoot, entry.name) }));
62
+ }
63
+
64
+ function loadAllowlist(filePath) {
65
+ const parsed = JSON.parse(readFileSync(filePath, "utf8"));
66
+ if (!parsed || parsed.schema !== SCHEMA || !parsed.skills || typeof parsed.skills !== "object" || Array.isArray(parsed.skills)) {
67
+ throw new Error(`ALLOWLIST_INVALID: expected ${SCHEMA}`);
68
+ }
69
+ const allowlist = new Map();
70
+ for (const [skill, reason] of Object.entries(parsed.skills)) {
71
+ if (!/^[a-z0-9][a-z0-9-]*$/u.test(skill)) throw new Error(`ALLOWLIST_SKILL_INVALID: ${skill}`);
72
+ if (typeof reason !== "string" || reason.trim().length < 40) throw new Error(`ALLOWLIST_REASON_MISSING: ${skill}`);
73
+ allowlist.set(skill, reason.trim());
74
+ }
75
+ return allowlist;
76
+ }
77
+
78
+ function loadAllowlistDocument(filePath) {
79
+ const parsed = JSON.parse(readFileSync(filePath, "utf8"));
80
+ if (!parsed || parsed.schema !== SCHEMA || !parsed.skills || typeof parsed.skills !== "object" || Array.isArray(parsed.skills)) {
81
+ throw new Error(`ALLOWLIST_INVALID: expected ${SCHEMA}`);
82
+ }
83
+ const divergences = parsed.parityDivergences ?? {};
84
+ if (!divergences || typeof divergences !== "object" || Array.isArray(divergences)) throw new Error("PARITY_DIVERGENCES_INVALID: expected an object");
85
+ const result = new Map();
86
+ for (const [skill, entry] of Object.entries(divergences)) {
87
+ if (!/^[a-z0-9][a-z0-9-]*$/u.test(skill)) throw new Error(`PARITY_DIVERGENCE_SKILL_INVALID: ${skill}`);
88
+ if (!entry || typeof entry !== "object" || Array.isArray(entry)) throw new Error(`PARITY_DIVERGENCE_INVALID: ${skill}`);
89
+ const date = typeof entry.date === "string" ? entry.date : "";
90
+ if (!validIsoDate(date)) throw new Error(`PARITY_DIVERGENCE_DATE_INVALID: ${skill}`);
91
+ const reason = typeof entry.reason === "string" ? entry.reason.trim() : "";
92
+ if (reason.length < 40) throw new Error(`PARITY_DIVERGENCE_REASON_MISSING: ${skill}`);
93
+ result.set(skill, { date, reason });
94
+ }
95
+ return result;
96
+ }
97
+
98
+ export function loadParityDivergences(filePath) {
99
+ return loadAllowlistDocument(filePath);
100
+ }
101
+
102
+ function validIsoDate(date) {
103
+ if (!/^\d{4}-\d{2}-\d{2}$/u.test(date)) return false;
104
+ const parsed = new Date(`${date}T00:00:00Z`);
105
+ return !Number.isNaN(parsed.valueOf()) && parsed.toISOString().slice(0, 10) === date;
106
+ }
107
+
108
+ function skillNamesDigest(names) {
109
+ return createHash("sha256").update(JSON.stringify([...names].sort())).digest("hex");
110
+ }
111
+
112
+ export function loadParityManifest(filePath) {
113
+ const parsed = JSON.parse(readFileSync(filePath, "utf8"));
114
+ if (!parsed || parsed.schema !== PARITY_SCHEMA || !parsed.products || typeof parsed.products !== "object" || Array.isArray(parsed.products) || !parsed.skills || typeof parsed.skills !== "object" || Array.isArray(parsed.skills)) {
115
+ throw new Error(`PARITY_MANIFEST_INVALID: expected ${PARITY_SCHEMA}`);
116
+ }
117
+ if (!validIsoDate(parsed.generatedAt)) throw new Error("PARITY_MANIFEST_DATE_INVALID");
118
+ if (typeof parsed.fraction !== "number" || !Number.isFinite(parsed.fraction) || parsed.fraction !== PARITY_FRACTION) throw new Error("PARITY_MANIFEST_FRACTION_INVALID");
119
+ if (parsed.scope !== "parity-enrolled") throw new Error("PARITY_MANIFEST_SCOPE_INVALID");
120
+ const productIds = FAMILY_LAYOUT.map(({ id }) => id);
121
+ const actualProductIds = Object.keys(parsed.products).sort();
122
+ if (actualProductIds.join(",") !== [...productIds].sort().join(",")) throw new Error("PARITY_MANIFEST_PRODUCTS_INVALID");
123
+ const products = new Map();
124
+ const inventories = new Map();
125
+ for (const id of productIds) {
126
+ const entry = parsed.products[id];
127
+ if (!entry || !Array.isArray(entry.skills) || !entry.inventory || typeof entry.inventory !== "object" || Array.isArray(entry.inventory)) throw new Error(`PARITY_MANIFEST_PRODUCT_INVALID: ${id}`);
128
+ if (!Number.isInteger(entry.inventory.count) || entry.inventory.count < 0 || !/^[a-f0-9]{64}$/u.test(entry.inventory.sha256 ?? "")) throw new Error(`PARITY_MANIFEST_INVENTORY_INVALID: ${id}`);
129
+ const names = entry.skills;
130
+ if (names.some((name) => typeof name !== "string" || !/^[a-z0-9][a-z0-9-]*$/u.test(name))) throw new Error(`PARITY_MANIFEST_SKILLS_INVALID: ${id}`);
131
+ const unique = [...new Set(names)].sort();
132
+ if (unique.length !== names.length || unique.join(",") !== names.join(",")) throw new Error(`PARITY_MANIFEST_SKILLS_UNSORTED: ${id}`);
133
+ products.set(id, new Set(unique));
134
+ inventories.set(id, { count: entry.inventory.count, sha256: entry.inventory.sha256 });
135
+ }
136
+ const skills = new Map();
137
+ for (const [name, entry] of Object.entries(parsed.skills)) {
138
+ if (!/^[a-z0-9][a-z0-9-]*$/u.test(name) || !entry || typeof entry !== "object" || Array.isArray(entry) || !entry.closures || typeof entry.closures !== "object" || Array.isArray(entry.closures)) throw new Error(`PARITY_MANIFEST_SKILL_INVALID: ${name}`);
139
+ const ids = Object.keys(entry.closures).sort();
140
+ if (ids.length < 2 || ids.some((id) => !products.has(id))) throw new Error(`PARITY_MANIFEST_CLOSURES_INVALID: ${name}`);
141
+ const closures = {};
142
+ for (const id of ids) {
143
+ const closure = entry.closures[id];
144
+ if (!Number.isInteger(closure) || closure < 0) throw new Error(`PARITY_MANIFEST_CLOSURE_INVALID: ${name}/${id}`);
145
+ if (!products.get(id).has(name)) throw new Error(`PARITY_MANIFEST_ENROLLMENT_INVALID: ${name}/${id}`);
146
+ closures[id] = closure;
147
+ }
148
+ if (!Number.isFinite(entry.median) || entry.median < 0 || entry.median !== median(ids.map((id) => closures[id]))) throw new Error(`PARITY_MANIFEST_MEDIAN_INVALID: ${name}`);
149
+ skills.set(name, { median: entry.median, closures });
150
+ }
151
+ for (const [name, entry] of skills) {
152
+ const enrolled = productIds.filter((productId) => products.get(productId).has(name));
153
+ if (enrolled.length < 2 || enrolled.join(",") !== Object.keys(entry.closures).sort().join(",")) throw new Error(`PARITY_MANIFEST_ENROLLMENT_STALE: ${name}`);
154
+ }
155
+ for (const names of products.values()) {
156
+ for (const name of names) {
157
+ const enrolled = productIds.filter((productId) => products.get(productId).has(name));
158
+ if (enrolled.length >= 2 && !skills.has(name)) throw new Error(`PARITY_MANIFEST_SKILL_MISSING: ${name}`);
159
+ if (enrolled.length === 1 && skills.has(name)) throw new Error(`PARITY_MANIFEST_SINGLETON: ${name}`);
160
+ if (skills.has(name) && enrolled.join(",") !== Object.keys(skills.get(name).closures).sort().join(",")) throw new Error(`PARITY_MANIFEST_ENROLLMENT_STALE: ${name}`);
161
+ }
162
+ }
163
+ return { generatedAt: parsed.generatedAt, fraction: parsed.fraction, products, inventories, skills };
164
+ }
165
+
166
+ function parsePackJson(raw) {
167
+ const start = raw.indexOf("[");
168
+ if (start < 0) throw new Error("PACK_JSON_MISSING");
169
+ const parsed = JSON.parse(raw.slice(start));
170
+ const result = Array.isArray(parsed) ? parsed[0] : parsed;
171
+ if (!result || !Array.isArray(result.files)) throw new Error("PACK_JSON_INVALID");
172
+ const paths = new Set();
173
+ for (const file of result.files) {
174
+ if (!file || typeof file.path !== "string" || file.path.length === 0) throw new Error("PACK_PATH_INVALID");
175
+ paths.add(file.path.split("\\").join("/"));
176
+ }
177
+ return paths;
178
+ }
179
+
180
+ function isolatePublishedPackage(packageRoot) {
181
+ const workspaceRoot = resolve(packageRoot, "../..");
182
+ const parent = mkdtempSync(join(tmpdir(), "litfamily-published-pack-"));
183
+ const copyRoot = join(parent, "repo");
184
+ cpSync(workspaceRoot, copyRoot, {
185
+ recursive: true,
186
+ filter(source) {
187
+ const relativePath = relative(workspaceRoot, source).split(sep).join("/");
188
+ if (relativePath === "") return true;
189
+ const segments = relativePath.split("/");
190
+ if ([".git", ".litcodex", "node_modules", "# REFERENCE"].includes(segments[0])) return false;
191
+ if (segments.includes("dist") || segments.includes("marketplace")) return false;
192
+ if (relativePath.endsWith(".tsbuildinfo")) return false;
193
+ return true;
194
+ },
195
+ });
196
+ const dependencies = join(workspaceRoot, "node_modules");
197
+ if (existsSync(dependencies)) symlinkSync(dependencies, join(copyRoot, "node_modules"), "dir");
198
+ const gitEnv = {
199
+ ...process.env,
200
+ HOME: parent,
201
+ USERPROFILE: parent,
202
+ XDG_CONFIG_HOME: join(parent, "config"),
203
+ GIT_CONFIG_NOSYSTEM: "1",
204
+ };
205
+ execFileSync("git", ["init", "--quiet"], { cwd: copyRoot, env: gitEnv, stdio: "ignore" });
206
+ execFileSync("git", ["add", "."], { cwd: copyRoot, env: gitEnv, stdio: "ignore" });
207
+ return { parent, packageRoot: join(copyRoot, P31_PUBLISHED_PACKAGE_RELATIVE) };
208
+ }
209
+
210
+ function npmPack(root, { runScripts = false } = {}) {
211
+ const sandbox = mkdtempSync(join(tmpdir(), "litfamily-payload-substance-"));
212
+ const cache = join(sandbox, "npm-cache");
213
+ mkdirSync(cache, { recursive: true });
214
+ const env = {
215
+ ...process.env,
216
+ HOME: sandbox,
217
+ USERPROFILE: sandbox,
218
+ GROK_HOME: join(sandbox, "grok"),
219
+ npm_config_cache: cache,
220
+ npm_config_userconfig: join(sandbox, ".npmrc"),
221
+ NPM_CONFIG_USERCONFIG: join(sandbox, ".npmrc"),
222
+ };
223
+ let isolated;
224
+ try {
225
+ if (runScripts) isolated = isolatePublishedPackage(root);
226
+ const packRoot = isolated?.packageRoot ?? root;
227
+ const command = process.platform === "win32" ? "npm.cmd" : "npm";
228
+ const args = ["pack", "--dry-run", "--json"];
229
+ if (!runScripts) args.push("--ignore-scripts");
230
+ const result = spawnSync(command, args, {
231
+ cwd: packRoot,
232
+ encoding: "utf8",
233
+ env,
234
+ shell: false,
235
+ timeout: 180000,
236
+ });
237
+ if (result.error || result.status !== 0) throw new Error(`PACK_FAILED status=${result.status}: ${result.stderr || result.error?.message || ""}`.trim());
238
+ return parsePackJson(result.stdout);
239
+ } finally {
240
+ if (isolated) rmSync(isolated.parent, { recursive: true, force: true });
241
+ rmSync(sandbox, { recursive: true, force: true });
242
+ }
243
+ }
244
+
245
+ export function derivePackPrefix(packPaths, skillNames) {
246
+ const names = new Set(skillNames);
247
+ const candidates = new Map();
248
+ for (const packedPath of packPaths) {
249
+ const parts = packedPath.split("/");
250
+ if (parts.length < 3 || parts.at(-1) !== "SKILL.md") continue;
251
+ const skill = parts.at(-2);
252
+ if (!names.has(skill)) continue;
253
+ const prefix = parts.slice(0, -2).join("/");
254
+ if (!prefix) continue;
255
+ if (!candidates.has(prefix)) candidates.set(prefix, new Set());
256
+ candidates.get(prefix).add(skill);
257
+ }
258
+ if (candidates.size === 0) throw new Error(`PACK_SKILL_PREFIX_MISSING: no packed SKILL.md matched ${names.size} source skill(s)`);
259
+ const complete = [...candidates.entries()].filter(([, matched]) => matched.size === names.size);
260
+ if (complete.length > 1) throw new Error(`PACK_SKILL_PREFIX_AMBIGUOUS: ${complete.map(([prefix]) => prefix).sort().join(",")}`);
261
+ if (complete.length === 1) return complete[0][0];
262
+ const max = Math.max(...[...candidates.values()].map((matched) => matched.size));
263
+ const best = [...candidates.entries()].filter(([, matched]) => matched.size === max);
264
+ if (best.length !== 1) throw new Error(`PACK_SKILL_PREFIX_AMBIGUOUS: ${best.map(([prefix]) => prefix).sort().join(",")}`);
265
+ return best[0][0];
266
+ }
267
+
268
+ export function evaluatePayloadSubstance({ productRoot, skillRoot, packPaths, allowlist, packPrefix = PACK_PREFIX }) {
269
+ const skills = inventory(skillRoot);
270
+ const names = new Set(skills.map(({ name }) => name));
271
+ const failures = [];
272
+ for (const skill of allowlist.keys()) if (!names.has(skill)) failures.push(`ALLOWLIST_STALE skill=${skill}`);
273
+ let corpusSkills = 0;
274
+ for (const { name, files } of skills) {
275
+ const prefix = `${packPrefix}/${name}/`;
276
+ const packed = [...packPaths].filter((entry) => entry.startsWith(prefix));
277
+ const skillPath = `${prefix}SKILL.md`;
278
+ if (!files.includes("SKILL.md")) failures.push(`SKILL_SOURCE_MISSING skill=${name}`);
279
+ if (!packPaths.has(skillPath)) failures.push(`PACKED_SKILL_MISSING skill=${name} path=${skillPath}`);
280
+ const external = [];
281
+ for (const root of externalRoots(productRoot, { name, directory: join(skillRoot, name) })) {
282
+ const relativeRoot = relative(productRoot, root).split(sep).join("/");
283
+ for (const entry of packPaths) {
284
+ if (entry === relativeRoot || entry.startsWith(`${relativeRoot}/`)) external.push(entry);
285
+ }
286
+ }
287
+ const corpus = [...new Set([...packed, ...external])].filter(
288
+ (entry) => entry !== skillPath && !LEGAL_NAMES.has(basename(entry))
289
+ );
290
+ if (allowlist.has(name)) {
291
+ const substantiveSource = files.filter((entry) => entry !== "SKILL.md" && !LEGAL_NAMES.has(basename(entry)));
292
+ if (substantiveSource.length !== 0) failures.push(`ALLOWLIST_NOT_SELF_CONTAINED skill=${name} sourceFiles=${files.length}`);
293
+ } else if (corpus.length === 0) {
294
+ failures.push(`PAYLOAD_SUBSTANCE_FAIL skill=${name}: no packed corpus beyond SKILL.md and no justified allowlist entry`);
295
+ } else {
296
+ corpusSkills += 1;
297
+ }
298
+ }
299
+ return {
300
+ failures,
301
+ skillCount: skills.length,
302
+ allowlistCount: [...allowlist.keys()].filter((name) => names.has(name)).length,
303
+ corpusSkills,
304
+ packedFiles: packPaths.size,
305
+ };
306
+ }
307
+
308
+ function hostSurfaceToken(value) {
309
+ return value.startsWith("~") || value.startsWith("$") || value.startsWith("/") || value.startsWith(".") || value.startsWith("HOME/") || value.startsWith("CODEX_HOME/") || value.startsWith("SESSION_DIR/") || value.startsWith("WORK_ROOT/") || value.startsWith("PROJECT_ROOT/") || value.startsWith("test/") || value.startsWith("tests/") || value.startsWith("docs/") || value.startsWith("src/") || value.startsWith("plans/") || value.startsWith("evidence/") || value.startsWith("target/") || value.startsWith("pkg/") || value.startsWith("packages/") || value.startsWith("dist/") || value.startsWith("api/") || value.startsWith("path/to/") || value.startsWith("wiki/") || value.startsWith("schema/") || /^[A-Z][A-Z0-9_]*\//u.test(value) || /(?:AGENTS|CLAUDE)\.md\//u.test(value);
310
+ }
311
+
312
+ export function loadReferenceExemptions(filePath) {
313
+ const parsed = JSON.parse(readFileSync(filePath, "utf8"));
314
+ if (!parsed || parsed.schema !== REFERENCE_SCHEMA || !Array.isArray(parsed.surfaces)) throw new Error(`REFERENCE_EXEMPTIONS_INVALID: expected ${REFERENCE_SCHEMA}`);
315
+ const entries = [];
316
+ const seen = new Set();
317
+ for (const entry of parsed.surfaces) {
318
+ if (!entry || typeof entry !== "object" || Array.isArray(entry)) throw new Error("REFERENCE_EXEMPTION_INVALID");
319
+ const exact = typeof entry.token === "string" ? entry.token.trim() : "";
320
+ const prefix = typeof entry.prefix === "string" ? entry.prefix.trim() : "";
321
+ if ((exact && prefix) || (!exact && !prefix)) throw new Error("REFERENCE_EXEMPTION_SELECTOR_INVALID");
322
+ const selector = exact || prefix;
323
+ const reason = typeof entry.reason === "string" ? entry.reason.trim() : "";
324
+ if (reason.length < 40) throw new Error(`REFERENCE_EXEMPTION_REASON_MISSING: ${selector}`);
325
+ if (!hostSurfaceToken(selector)) throw new Error(`REFERENCE_EXEMPTION_NOT_HOST: ${selector}`);
326
+ const root = selector.split("/")[0];
327
+ if (selector.startsWith("../") || (selector.startsWith("./") && !selector.startsWith("./target")) || (PACKED_REFERENCE_ROOTS.has(root) && !(root === "schema" && selector === "schema/wiki-rules.md"))) throw new Error(`REFERENCE_EXEMPTION_NOT_HOST: ${selector}`);
328
+ const key = `${exact ? "token" : "prefix"}:${selector}`;
329
+ if (seen.has(key)) throw new Error(`REFERENCE_EXEMPTION_DUPLICATE: ${selector}`);
330
+ seen.add(key);
331
+ entries.push({ token: exact || undefined, prefix: prefix || undefined, reason });
332
+ }
333
+ return entries;
334
+ }
335
+
336
+ function stripFencedCode(text) {
337
+ let fence;
338
+ return text.split("\n").map((line) => {
339
+ const marker = line.match(/^[ \t]{0,3}(`{3,}|~{3,})/u)?.[1];
340
+ if (fence) {
341
+ if (marker && marker[0] === fence[0] && marker.length >= fence.length) fence = undefined;
342
+ return "";
343
+ }
344
+ if (marker) {
345
+ fence = marker;
346
+ return "";
347
+ }
348
+ return line;
349
+ }).join("\n");
350
+ }
351
+
352
+ function cleanReferenceToken(raw) {
353
+ return raw.trim().replace(/^<|>$/gu, "").replace(/[),.;:!?]+$/gu, "").replace(/[?#].*$/u, "");
354
+ }
355
+
356
+ function isReferenceClaim(raw, kind) {
357
+ const token = cleanReferenceToken(raw);
358
+ if (!token || token.includes("<") || token.includes(">") || token.includes("$") || token.includes("{") || token.includes("}") || token.includes("*") || token.includes("…")) return false;
359
+ if (/^[a-z][a-z0-9+.-]*:\/\//iu.test(token) || token.startsWith("//")) return false;
360
+ if (!token.includes("/")) return false;
361
+ if (kind === "markdown") return true;
362
+ if (token.split("/").slice(0, -1).some((part) => !part.startsWith(".") && /\.[A-Za-z0-9][A-Za-z0-9_-]*$/u.test(part))) return false;
363
+ const extension = token.match(/\.([A-Za-z0-9][A-Za-z0-9_-]{0,19})$/u)?.[1];
364
+ if (extension && extension === extension.toLowerCase()) return true;
365
+ return token.endsWith("/") && [...REFERENCE_ROOTS].some((root) => token.startsWith(`${root}/`)) || token.startsWith("../") || token.startsWith("./") || token.startsWith("~/") || token.startsWith("/");
366
+ }
367
+
368
+ function referenceClaims(text) {
369
+ const source = stripFencedCode(text);
370
+ const claims = [];
371
+ const seen = new Set();
372
+ const add = (raw, kind, index) => {
373
+ const preceding = source.slice(Math.max(0, index - 3), index);
374
+ if (preceding.endsWith("://") || preceding.endsWith("//")) return;
375
+ const token = cleanReferenceToken(raw);
376
+ if (!isReferenceClaim(token, kind) || (GENERIC_REFERENCE_NAMES.has(token) && !token.includes("/"))) return;
377
+ const line = Math.max(1, source.slice(0, index).split("\n").length);
378
+ const key = `${token}:${line}`;
379
+ if (seen.has(key)) return;
380
+ seen.add(key);
381
+ claims.push({ token, line });
382
+ };
383
+ for (const match of source.matchAll(/!?\[[^\]]*\]\(([^)]+)\)/gu)) add(match[1].split(/[\s]+/u)[0], "markdown", match.index || 0);
384
+ const tokenPattern = /(?:~\/|(?:\.\.\/)+|\.\/|\/)?[A-Za-z0-9_.-]+(?:\/[A-Za-z0-9_.-]+)+(?:\.[A-Za-z0-9][A-Za-z0-9_-]{0,19})?\/?/gu;
385
+ const directoryPattern = /(?:~\/|(?:\.\.\/)+|\.\/|\/)?(?:references|scripts|assets|templates|tests?|vendor|original|evals|schemas?|skills|modes|src|bin|lib|plugins|docs|wiki|data|dist|examples)(?:\/[A-Za-z0-9_.-]+)*\/(?![A-Za-z0-9_.-])/gu;
386
+ for (const match of source.matchAll(/`([^`\n]+)`/gu)) {
387
+ const start = match.index || 0;
388
+ for (const token of match[1].matchAll(tokenPattern)) add(token[0], "code", start + (token.index || 0));
389
+ for (const token of match[1].matchAll(directoryPattern)) add(token[0], "code", start + (token.index || 0));
390
+ }
391
+ for (const match of source.matchAll(tokenPattern)) add(match[0], "bare", match.index || 0);
392
+ for (const match of source.matchAll(directoryPattern)) add(match[0], "bare", match.index || 0);
393
+ return claims;
394
+ }
395
+
396
+ function matchesPackedPath(packPaths, relativePath) {
397
+ const normalized = relativePath.split(sep).join("/").replace(/\/$/u, "");
398
+ if (!normalized || normalized.startsWith("../")) return false;
399
+ return packPaths.has(normalized) || [...packPaths].some((entry) => entry.startsWith(`${normalized}/`));
400
+ }
401
+
402
+ function referenceBases(productRoot, skill, packPaths, packPrefix) {
403
+ const canonical = [];
404
+ const prefix = `${packPrefix}/${skill.name}/`;
405
+ for (const packedPath of packPaths) {
406
+ if (!packedPath.startsWith(prefix)) continue;
407
+ const parts = packedPath.slice(prefix.length).split("/");
408
+ const marker = parts.findIndex((part) => part === "original" || part === "vendor" || part === "canonical");
409
+ if (marker >= 0) {
410
+ canonical.push(resolve(productRoot, prefix, ...parts.slice(0, marker + 1)));
411
+ if (marker + 1 < parts.length) {
412
+ const candidate = resolve(productRoot, prefix, ...parts.slice(0, marker + 2));
413
+ if (existsSync(candidate) && lstatSync(candidate).isDirectory()) canonical.push(candidate);
414
+ }
415
+ }
416
+ }
417
+ return [skill.directory, productRoot, join(productRoot, "plugins", "litclaude"), join(productRoot, "plugins", "litcodex"), join(productRoot, "skills"), join(productRoot, ".grok"), join(productRoot, "assets", "lithermes-plugin"), ...externalRoots(productRoot, skill), ...canonical];
418
+ }
419
+
420
+ function resolvesReference({ productRoot, skill, token, packPaths, packPrefix }) {
421
+ if (/^(?:~|\$|[A-Z][A-Z0-9_]*\/)/u.test(token)) return false;
422
+ const pathToken = token.replace(/^\/+\s*/u, "").replace(/#.*$/u, "");
423
+ const bases = referenceBases(productRoot, skill, packPaths, packPrefix);
424
+ if (pathToken.startsWith("skills/")) bases.push(join(productRoot, packPrefix));
425
+ const seen = new Set();
426
+ for (const base of bases) {
427
+ const relativePath = relative(productRoot, resolve(base, pathToken));
428
+ const key = relativePath.split(sep).join("/");
429
+ if (seen.has(key)) continue;
430
+ seen.add(key);
431
+ if (matchesPackedPath(packPaths, relativePath)) return true;
432
+ }
433
+ return false;
434
+ }
435
+
436
+ export function evaluatePayloadReferences({ productRoot, skillRoot, packPaths, packPrefix = PACK_PREFIX, exemptions }) {
437
+ const failures = [];
438
+ const claims = [];
439
+ const exemptionHits = [];
440
+ for (const skill of inventory(skillRoot)) {
441
+ const skillFile = join(skill.directory, "SKILL.md");
442
+ if (!existsSync(skillFile)) continue;
443
+ for (const claim of referenceClaims(readFileSync(skillFile, "utf8"))) {
444
+ claims.push({ skill: skill.name, ...claim });
445
+ if (resolvesReference({ productRoot, skill, token: claim.token, packPaths, packPrefix })) continue;
446
+ const exemption = exemptions.find((entry) => entry.token === claim.token || (entry.prefix && claim.token.startsWith(entry.prefix)));
447
+ if (exemption) exemptionHits.push(`${skill.name}:${claim.token}`);
448
+ else failures.push(`PAYLOAD_REFERENCE_FAIL skill=${skill.name} token=${claim.token} line=${claim.line}`);
449
+ }
450
+ }
451
+ return { failures, claims, exemptionHits };
452
+ }
453
+
454
+ function isContained(root, candidate) {
455
+ const relation = relative(root, candidate);
456
+ return relation !== "" && relation !== ".." && !relation.startsWith(`..${sep}`) && !relation.startsWith(sep);
457
+ }
458
+
459
+ function bindingTexts(productRoot, skill) {
460
+ const paths = [
461
+ join(skill.directory, "SKILL.md"),
462
+ join(productRoot, "plugin.json"),
463
+ join(productRoot, "plugins", "litclaude", ".claude-plugin", "plugin.json"),
464
+ join(productRoot, "plugins", "litcodex", ".codex-plugin", "plugin.json"),
465
+ join(productRoot, "skills", "managed-skill-manifest.json"),
466
+ ];
467
+ const texts = [];
468
+ for (const path of paths) {
469
+ if (!existsSync(path) || !lstatSync(path).isFile()) continue;
470
+ const text = readFileSync(path, "utf8");
471
+ if (path === paths[0] || text.includes(skill.name)) texts.push({ path, text });
472
+ }
473
+ return texts;
474
+ }
475
+
476
+ function externalRoots(productRoot, skill) {
477
+ const roots = new Set();
478
+ const candidates = [];
479
+ for (const { path: bindingPath, text } of bindingTexts(productRoot, skill)) {
480
+ const pattern = /(?:\.\.\/)+[^\s`)'"<>]+/g;
481
+ for (const match of text.matchAll(pattern)) {
482
+ const raw = match[0].replace(/[),.;:]+$/u, "");
483
+ if (raw.includes("/")) candidates.push({ bindingPath, raw });
484
+ }
485
+ if (text.includes("*_handoff")) {
486
+ for (const match of text.matchAll(/((?:\.\.\/)+vendor)\//g)) {
487
+ const vendorRoot = resolve(dirname(bindingPath), match[1]);
488
+ if (!existsSync(vendorRoot) || !lstatSync(vendorRoot).isDirectory()) continue;
489
+ for (const entry of readdirSync(vendorRoot, { withFileTypes: true })) {
490
+ const child = join(vendorRoot, entry.name);
491
+ if (entry.isDirectory() && (entry.name === "handoff" || entry.name.endsWith("_handoff")) && isContained(productRoot, child)) roots.add(child);
492
+ }
493
+ }
494
+ }
495
+ }
496
+ for (const { bindingPath, raw } of candidates) {
497
+ if (raw.replace(/\/+$/u, "").endsWith("/vendor")) continue;
498
+ const candidate = resolve(dirname(bindingPath), raw);
499
+ if (raw.includes("*")) {
500
+ const wildcardParent = dirname(candidate);
501
+ if (!existsSync(wildcardParent) || !lstatSync(wildcardParent).isDirectory()) continue;
502
+ const suffix = basename(raw).replace(/^\*/, "");
503
+ for (const entry of readdirSync(wildcardParent, { withFileTypes: true })) {
504
+ const child = join(wildcardParent, entry.name);
505
+ if (entry.isDirectory() && entry.name.endsWith(suffix) && isContained(productRoot, child)) roots.add(child);
506
+ }
507
+ continue;
508
+ }
509
+ if (!existsSync(candidate)) continue;
510
+ let root = candidate;
511
+ if (lstatSync(candidate).isFile()) root = dirname(candidate);
512
+ const relativeParts = relative(productRoot, root).split(sep);
513
+ const canonicalMarker = relativeParts.some((part) => part === "vendor" || part === "canonical" || part === "original");
514
+ if (canonicalMarker && isContained(productRoot, root) && !isContained(skill.directory, root)) roots.add(root);
515
+ }
516
+ return [...roots].sort();
517
+ }
518
+
519
+ function externalCompanionPaths(productRoot, skill, packPaths, roots) {
520
+ const companions = new Set();
521
+ for (const root of roots) {
522
+ const relativeRoot = relative(productRoot, root).split(sep).join("/");
523
+ const basenameId = basename(root);
524
+ const sourceId = {
525
+ handoff: "022_handoff",
526
+ "scientific-visualization": "045_scientific-visualization"
527
+ }[basenameId] ?? basenameId;
528
+ if (relativeRoot.split("/").includes("vendor")) {
529
+ for (const entry of packPaths) {
530
+ if (
531
+ entry.endsWith(`/licenses/${sourceId}-MIT.txt`) ||
532
+ entry.endsWith(`/provenance/${sourceId}.md`) ||
533
+ (sourceId === "045_scientific-visualization" && /\/NOTICE(?:\.md)?$/u.test(entry))
534
+ ) companions.add(entry);
535
+ }
536
+ }
537
+ }
538
+ return companions;
539
+ }
540
+
541
+ function mapSourcePathToPackPath(productRoot, skillRoot, candidate, packPrefix) {
542
+ const sourceSkillRoot = relative(productRoot, skillRoot).split(sep).join("/");
543
+ const sourcePluginRoot = dirname(sourceSkillRoot).split(sep).join("/");
544
+ const candidateRelative = relative(productRoot, candidate).split(sep).join("/");
545
+ const packContainer = packPrefix.endsWith(`/${sourceSkillRoot}`)
546
+ ? packPrefix.slice(0, -(sourceSkillRoot.length + 1))
547
+ : packPrefix === sourceSkillRoot ? "" : undefined;
548
+ if (packContainer === undefined) return undefined;
549
+ if (candidateRelative !== sourcePluginRoot && !candidateRelative.startsWith(`${sourcePluginRoot}/`)) return undefined;
550
+ return packContainer ? `${packContainer}/${candidateRelative}` : candidateRelative;
551
+ }
552
+
553
+ function resolveClosures(productRoot, skillRoot, skills, packPaths, packPrefix) {
554
+ const records = new Map();
555
+ for (const skill of skills) {
556
+ const prefix = `${packPrefix}/${skill.name}/`;
557
+ const paths = new Set([...packPaths].filter((path) => path.startsWith(prefix)));
558
+ const roots = externalRoots(productRoot, skill);
559
+ for (const root of roots) {
560
+ const relativeRoot = relative(productRoot, root).split(sep).join("/");
561
+ const packedRoot = mapSourcePathToPackPath(productRoot, skillRoot, root, packPrefix) ?? relativeRoot;
562
+ for (const path of packPaths) if (path.startsWith(`${packedRoot}/`)) paths.add(path);
563
+ }
564
+ for (const path of externalCompanionPaths(productRoot, skill, packPaths, roots)) paths.add(path);
565
+ records.set(skill.name, {
566
+ closure: packPaths.has(`${prefix}SKILL.md`) ? paths.size : 0,
567
+ roots: roots.map((root) => relative(productRoot, root).split(sep).join("/")),
568
+ });
569
+ }
570
+ return records;
571
+ }
572
+
573
+ function measureProduct(familyRoot, layout) {
574
+ const productRoot = resolve(familyRoot, ...layout.packageRelative);
575
+ const skillRoot = join(productRoot, layout.skillRootRelative);
576
+ const skills = inventory(skillRoot);
577
+ const packRoot = layout.packRootRelative ? resolve(familyRoot, ...layout.packRootRelative) : productRoot;
578
+ const packPaths = npmPack(packRoot, { runScripts: layout.packWithScripts === true });
579
+ const packPrefix = layout.packWithScripts
580
+ ? derivePackPrefix(packPaths, skills.map(({ name }) => name))
581
+ : layout.packPrefix;
582
+ const divergences = loadParityDivergences(join(productRoot, "tools", "payload-substance-allowlist.json"));
583
+ return { id: layout.id, productRoot, skills: resolveClosures(productRoot, skillRoot, skills, packPaths, packPrefix), divergences };
584
+ }
585
+
586
+ export function measureFamily(familyRoot) {
587
+ return FAMILY_LAYOUT.map((layout) => measureProduct(familyRoot, layout));
588
+ }
589
+
590
+ function median(values) {
591
+ const sorted = [...values].sort((left, right) => left - right);
592
+ return sorted[Math.floor(sorted.length / 2)];
593
+ }
594
+
595
+ export function evaluateManifestParity({ manifest, targetId, productRoot, skillRoot, packPaths, packPrefix, divergences }) {
596
+ const expectedSkills = manifest.products.get(targetId);
597
+ if (!expectedSkills) return { failures: [`PAYLOAD_PARITY_MANIFEST_PRODUCT_MISSING product=${targetId}`], rows: [], exemptions: [] };
598
+ const skills = inventory(skillRoot);
599
+ const actualSkills = new Set(skills.map(({ name }) => name));
600
+ const expectedInventory = manifest.inventories.get(targetId);
601
+ const missing = [...expectedSkills].filter((name) => !actualSkills.has(name));
602
+ const extra = [...actualSkills].filter((name) => manifest.skills.has(name) && !expectedSkills.has(name));
603
+ const failures = [];
604
+ const actualDigest = skillNamesDigest(skills.map(({ name }) => name));
605
+ if (skills.length !== expectedInventory.count || actualDigest !== expectedInventory.sha256) failures.push(`PAYLOAD_PARITY_MANIFEST_INVENTORY_STALE product=${targetId} expected=${expectedInventory.count}/${expectedInventory.sha256} actual=${skills.length}/${actualDigest}`);
606
+ if (missing.length || extra.length) failures.push(`PAYLOAD_PARITY_MANIFEST_SKILLS_STALE product=${targetId} missing=${missing.join(",") || "none"} extra=${extra.join(",") || "none"}`);
607
+ const records = resolveClosures(productRoot, skillRoot, skills, packPaths, packPrefix);
608
+ const rows = [];
609
+ const exemptions = [];
610
+ for (const [name, entry] of [...manifest.skills].sort(([left], [right]) => left.localeCompare(right))) {
611
+ const expectedClosure = entry.closures[targetId];
612
+ if (expectedClosure === undefined) continue;
613
+ const summary = Object.entries(entry.closures).map(([id, closure]) => `${id}:${closure}`).join(",");
614
+ rows.push(`PAYLOAD_PARITY_ROW skill=${name} median=${entry.median} closures=${summary}`);
615
+ const record = records.get(name);
616
+ if (!record) continue;
617
+ if (record.closure !== expectedClosure) failures.push(`PAYLOAD_PARITY_MANIFEST_CLOSURE_STALE skill=${name} product=${targetId} expected=${expectedClosure} actual=${record.closure}`);
618
+ const threshold = entry.median * manifest.fraction;
619
+ if (record.closure < threshold) {
620
+ const exception = divergences.get(name);
621
+ if (exception) exemptions.push(`${name}@${exception.date}`);
622
+ else failures.push(`PAYLOAD_PARITY_FAIL skill=${name} product=${targetId} closure=${record.closure} median=${entry.median} threshold=${threshold} enrolled=${Object.keys(entry.closures).join(",")}`);
623
+ }
624
+ }
625
+ for (const name of divergences.keys()) if (!manifest.skills.has(name)) failures.push(`PAYLOAD_PARITY_DIVERGENCE_STALE skill=${name} product=${targetId}`);
626
+ return { failures, rows, exemptions };
627
+ }
628
+
629
+ export function evaluateManifestFreshness({ manifest, measurements }) {
630
+ const failures = [];
631
+ for (const measurement of measurements) {
632
+ const expectedSkills = manifest.products.get(measurement.id);
633
+ if (!expectedSkills) {
634
+ failures.push(`PAYLOAD_PARITY_MANIFEST_PRODUCT_MISSING product=${measurement.id}`);
635
+ continue;
636
+ }
637
+ const actualSkills = new Set(measurement.skills.keys());
638
+ const expectedInventory = manifest.inventories.get(measurement.id);
639
+ const actualNames = [...actualSkills].sort((left, right) => left.localeCompare(right));
640
+ const actualDigest = skillNamesDigest(actualNames);
641
+ if (actualNames.length !== expectedInventory.count || actualDigest !== expectedInventory.sha256) failures.push(`PAYLOAD_PARITY_MANIFEST_FRESHNESS_INVENTORY_STALE product=${measurement.id} expected=${expectedInventory.count}/${expectedInventory.sha256} actual=${actualNames.length}/${actualDigest}`);
642
+ const missing = [...expectedSkills].filter((name) => !actualSkills.has(name));
643
+ const extra = [...actualSkills].filter((name) => manifest.skills.has(name) && !expectedSkills.has(name));
644
+ if (missing.length || extra.length) failures.push(`PAYLOAD_PARITY_MANIFEST_FRESHNESS_SKILLS_STALE product=${measurement.id} missing=${missing.join(",") || "none"} extra=${extra.join(",") || "none"}`);
645
+ for (const [name, entry] of manifest.skills) {
646
+ const expectedClosure = entry.closures[measurement.id];
647
+ if (expectedClosure === undefined) continue;
648
+ const record = measurement.skills.get(name);
649
+ if (!record) {
650
+ failures.push(`PAYLOAD_PARITY_MANIFEST_FRESHNESS_SKILL_MISSING skill=${name} product=${measurement.id}`);
651
+ continue;
652
+ }
653
+ if (record.closure !== expectedClosure) failures.push(`PAYLOAD_PARITY_MANIFEST_FRESHNESS_CLOSURE_STALE skill=${name} product=${measurement.id} expected=${expectedClosure} actual=${record.closure}`);
654
+ }
655
+ }
656
+ for (const [name, entry] of manifest.skills) {
657
+ const live = measurements.filter((measurement) => entry.closures[measurement.id] !== undefined);
658
+ const liveMedian = median(live.map((measurement) => measurement.skills.get(name)?.closure ?? 0));
659
+ if (live.length !== Object.keys(entry.closures).length || liveMedian !== entry.median) failures.push(`PAYLOAD_PARITY_MANIFEST_FRESHNESS_MEDIAN_STALE skill=${name} expected=${entry.median} actual=${liveMedian}`);
660
+ }
661
+ return { failures };
662
+ }
663
+
664
+ function findFamilyRoot(start) {
665
+ let cursor = resolve(start);
666
+ for (;;) {
667
+ if (FAMILY_LAYOUT.every((layout) => existsSync(resolve(cursor, ...layout.packageRelative)))) return cursor;
668
+ const parent = dirname(cursor);
669
+ if (parent === cursor) return undefined;
670
+ cursor = parent;
671
+ }
672
+ }
673
+
674
+ function matchingProductId(familyRoot, productRoot) {
675
+ const resolvedProduct = resolve(productRoot);
676
+ return FAMILY_LAYOUT.find((layout) => resolve(familyRoot, ...layout.packageRelative) === resolvedProduct)?.id;
677
+ }
678
+
679
+ function option(argv, name) {
680
+ const index = argv.indexOf(name);
681
+ if (index < 0) return undefined;
682
+ const value = argv[index + 1];
683
+ if (!value || value.startsWith("--")) throw new Error(`OPTION_VALUE_MISSING: ${name}`);
684
+ return value;
685
+ }
686
+
687
+ export function run(argv = process.argv.slice(2)) {
688
+ const allowed = new Set(["--skill-root", "--allowlist-file", "--pack-json", "--family-root", "--product-root", "--product-id", "--parity-manifest", "--reference-exemptions"]);
689
+ for (const arg of argv) if (arg.startsWith("--") && !allowed.has(arg)) throw new Error(`UNKNOWN_OPTION: ${arg}`);
690
+ const productRoot = resolve(option(argv, "--product-root") ?? PRODUCT_ROOT);
691
+ const skillRoot = resolve(productRoot, option(argv, "--skill-root") ?? SKILL_ROOT_RELATIVE);
692
+ const allowlistPath = resolve(productRoot, option(argv, "--allowlist-file") ?? ALLOWLIST_RELATIVE);
693
+ const packFile = option(argv, "--pack-json");
694
+ const packPaths = packFile ? parsePackJson(readFileSync(resolve(process.cwd(), packFile), "utf8")) : npmPack(productRoot);
695
+ const report = evaluatePayloadSubstance({ productRoot, skillRoot, packPaths, allowlist: loadAllowlist(allowlistPath) });
696
+ const referenceExemptionsPath = resolve(productRoot, option(argv, "--reference-exemptions") ?? REFERENCE_EXEMPTIONS_RELATIVE);
697
+ const references = evaluatePayloadReferences({ productRoot, skillRoot, packPaths, packPrefix: PACK_PREFIX, exemptions: loadReferenceExemptions(referenceExemptionsPath) });
698
+ const customInputs = Boolean(option(argv, "--skill-root") || option(argv, "--allowlist-file") || option(argv, "--pack-json") || option(argv, "--product-root"));
699
+ const parityManifestOption = option(argv, "--parity-manifest");
700
+ const parityManifestPath = resolve(productRoot, parityManifestOption ?? PARITY_MANIFEST_RELATIVE);
701
+ const runManifest = !customInputs || Boolean(parityManifestOption);
702
+ let parity;
703
+ if (runManifest) {
704
+ const manifest = loadParityManifest(parityManifestPath);
705
+ const targetId = option(argv, "--product-id") ?? (productRoot === PRODUCT_ROOT ? PRODUCT_ID : undefined);
706
+ if (!targetId) throw new Error("PAYLOAD_PARITY_TARGET_UNKNOWN: pass --product-id for a product outside the family root");
707
+ parity = evaluateManifestParity({ manifest, targetId, productRoot, skillRoot, packPaths, packPrefix: PACK_PREFIX, divergences: loadParityDivergences(allowlistPath) });
708
+ }
709
+ const requestedFamilyRoot = option(argv, "--family-root");
710
+ const familyRoot = requestedFamilyRoot ? resolve(process.cwd(), requestedFamilyRoot) : (customInputs ? undefined : findFamilyRoot(productRoot));
711
+ if (!familyRoot) return { ...report, references, parity, freshness: undefined };
712
+ const targetId = option(argv, "--product-id") ?? matchingProductId(familyRoot, productRoot) ?? (productRoot === PRODUCT_ROOT ? PRODUCT_ID : undefined);
713
+ if (!targetId) throw new Error("PAYLOAD_PARITY_TARGET_UNKNOWN: pass --product-id for a product outside the family root");
714
+ const measurements = measureFamily(familyRoot);
715
+ return { ...report, references, parity, freshness: evaluateManifestFreshness({ manifest: loadParityManifest(parityManifestPath), measurements }) };
716
+ }
717
+
718
+ if (resolve(process.argv[1] ?? "") === fileURLToPath(import.meta.url)) {
719
+ try {
720
+ const report = run();
721
+ const failures = [...report.failures, ...(report.references?.failures ?? []), ...(report.parity?.failures ?? []), ...(report.freshness?.failures ?? [])];
722
+ if (failures.length) {
723
+ for (const failure of failures) process.stderr.write(`${failure}\n`);
724
+ process.exitCode = 1;
725
+ } else {
726
+ process.stdout.write(`PAYLOAD_SUBSTANCE_PASS: skills=${report.skillCount} allowlist=${report.allowlistCount} corpus=${report.corpusSkills} packedFiles=${report.packedFiles}\n`);
727
+ process.stdout.write(`PAYLOAD_REFERENCES_PASS: claims=${report.references.claims.length} exemptions=${report.references.exemptionHits.length}\n`);
728
+ if (report.parity) {
729
+ process.stdout.write(`PAYLOAD_PARITY_PASS: source=manifest fraction=${PARITY_FRACTION} exemptions=${report.parity.exemptions.join(",") || "none"}\n`);
730
+ for (const row of report.parity.rows) process.stdout.write(`${row}\n`);
731
+ }
732
+ if (report.freshness) process.stdout.write("PAYLOAD_PARITY_FRESHNESS_PASS: family-manifest\n");
733
+ }
734
+ } catch (error) {
735
+ process.stderr.write(`PAYLOAD_SUBSTANCE_ERROR: ${error instanceof Error ? error.message : String(error)}\n`);
736
+ process.exitCode = 2;
737
+ }
738
+ }