@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,296 @@
1
+ #!/usr/bin/env node
2
+ // Replacement real-surface QA: named behaviours that today only the unit tests
3
+ // prove, re-proved through the surfaces this package actually ships.
4
+ //
5
+ // update-notifier-concurrency -> the shipped detached refresh helper
6
+ // dist/cli/update-check.js, run as a real
7
+ // process against an isolated HOME
8
+ // bounded-authority-lifecycle -> the shipped plugin API exported from
9
+ // dist/index.js, against an isolated project
10
+ // subagent-depth-one -> the shipped OpenCode `config` hook returned
11
+ // by the dist/index.js plugin factory
12
+ //
13
+ // HOME, USERPROFILE and XDG_CONFIG_HOME are redirected to a temporary directory
14
+ // for this whole process before dist is imported, so nothing reads or writes a
15
+ // live profile.
16
+ import { spawn } from "node:child_process";
17
+ import fs from "node:fs/promises";
18
+ import os from "node:os";
19
+ import path from "node:path";
20
+ import process from "node:process";
21
+ import { fileURLToPath, pathToFileURL } from "node:url";
22
+ import { CleanupLedger, assertBuiltRuntime, createTempRoot, isolatedEnv, repoRoot } from "./qa-real-surface-harness.mjs";
23
+
24
+ const day = 24 * 60 * 60 * 1000;
25
+ const updateCheckHelper = path.join(repoRoot, "dist", "cli", "update-check.js");
26
+
27
+ function check(results, behavior, name, expected, observed, detail = "") {
28
+ const status = expected === observed ? "PASS" : "FAIL";
29
+ results.push({ behavior, name, expected, observed, status, detail });
30
+ return status === "PASS";
31
+ }
32
+
33
+ async function writePrivate(filePath, text) {
34
+ await fs.mkdir(path.dirname(filePath), { recursive: true, mode: 0o700 });
35
+ await fs.chmod(path.dirname(filePath), 0o700);
36
+ await fs.writeFile(filePath, text, { encoding: "utf8", mode: 0o600 });
37
+ await fs.chmod(filePath, 0o600);
38
+ }
39
+
40
+ function runRefreshHelper(homeDir) {
41
+ return new Promise((resolve, reject) => {
42
+ const child = spawn(process.execPath, [updateCheckHelper, "--refresh"], {
43
+ cwd: repoRoot,
44
+ env: isolatedEnv(homeDir),
45
+ stdio: "ignore"
46
+ });
47
+ child.once("error", reject);
48
+ child.once("exit", (code) => resolve(code ?? 0));
49
+ });
50
+ }
51
+
52
+ async function readJsonIfPresent(filePath) {
53
+ try {
54
+ return JSON.parse(await fs.readFile(filePath, "utf8"));
55
+ } catch (error) {
56
+ if (error instanceof Error && "code" in error && error.code === "ENOENT") return undefined;
57
+ throw error;
58
+ }
59
+ }
60
+
61
+ async function seedUpdateState(homeDir, { cache, lock } = {}) {
62
+ const stateDir = path.join(homeDir, ".litopencode");
63
+ await fs.mkdir(stateDir, { recursive: true, mode: 0o700 });
64
+ await fs.chmod(stateDir, 0o700);
65
+ await fs.rm(path.join(stateDir, "update-check.json"), { force: true });
66
+ await fs.rm(path.join(stateDir, "update-check.lock"), { recursive: true, force: true });
67
+ await fs.rm(path.join(stateDir, "update-check.transition.lock"), { recursive: true, force: true });
68
+ if (cache !== undefined) {
69
+ await writePrivate(path.join(stateDir, "update-check.json"), `${JSON.stringify(cache, null, 2)}\n`);
70
+ }
71
+ if (lock !== undefined) {
72
+ await fs.mkdir(path.join(stateDir, "update-check.lock"), { mode: 0o700 });
73
+ await fs.chmod(path.join(stateDir, "update-check.lock"), 0o700);
74
+ await writePrivate(path.join(stateDir, "update-check.lock", "owner.json"), `${JSON.stringify(lock)}\n`);
75
+ }
76
+ return stateDir;
77
+ }
78
+
79
+ async function updateNotifierConcurrency(results, ledger) {
80
+ const behavior = "update-notifier-concurrency";
81
+ const home = await createTempRoot(ledger, "update-home");
82
+ const cachePath = path.join(home, ".litopencode", "update-check.json");
83
+ const lockPath = path.join(home, ".litopencode", "update-check.lock");
84
+ const now = Date.now();
85
+
86
+ // A live peer reservation blocks a second refresher even when the cache is
87
+ // long overdue: the fresh lock, not the interval, is what stops it.
88
+ const inFlightCache = { schemaVersion: 1, packageName: "@litfamily/litopencode", attemptedAt: now - 25 * 60 * 60 * 1000, ownerGeneration: "peer-generation" };
89
+ await seedUpdateState(home, { cache: inFlightCache, lock: { generation: "peer-generation", acquiredAt: now } });
90
+ await runRefreshHelper(home);
91
+ const afterLivePeer = await readJsonIfPresent(cachePath);
92
+ check(
93
+ results, behavior, "live-peer-reservation-respected", "peer-generation",
94
+ afterLivePeer?.ownerGeneration ?? "none", "fresh peer lock present, cache overdue"
95
+ );
96
+ check(
97
+ results, behavior, "live-peer-lock-not-stolen", "present",
98
+ await fs.lstat(lockPath).then(() => "present").catch(() => "absent"), ""
99
+ );
100
+
101
+ // The same reservation with a stale lock is taken over and completed, which
102
+ // clears the peer generation from the cache and removes the lock.
103
+ await seedUpdateState(home, { cache: inFlightCache, lock: { generation: "peer-generation", acquiredAt: now - 60_000 } });
104
+ await runRefreshHelper(home);
105
+ const afterStalePeer = await readJsonIfPresent(cachePath);
106
+ check(results, behavior, "stale-peer-lock-taken-over", "none", afterStalePeer?.ownerGeneration ?? "none", "lock acquiredAt 60s in the past");
107
+ check(results, behavior, "stale-peer-lock-removed", "absent", await fs.lstat(lockPath).then(() => "present").catch(() => "absent"), "");
108
+ check(results, behavior, "takeover-committed-a-result", "committed",
109
+ afterStalePeer !== undefined && (afterStalePeer.failedAt !== undefined || afterStalePeer.checkedAt !== undefined) ? "committed" : "none", "");
110
+
111
+ // A lock stamped in the future is a broken clock, not a live owner.
112
+ await seedUpdateState(home, { cache: inFlightCache, lock: { generation: "peer-generation", acquiredAt: now + 60 * 60 * 1000 } });
113
+ await runRefreshHelper(home);
114
+ check(results, behavior, "future-dated-lock-evicted", "absent", await fs.lstat(lockPath).then(() => "present").catch(() => "absent"), "lock acquiredAt one hour in the future");
115
+
116
+ // A future-dated cache is never trusted: it forces a refresh and its
117
+ // future timestamps and stale result must not survive the refresh.
118
+ await seedUpdateState(home, {
119
+ cache: { schemaVersion: 1, packageName: "@litfamily/litopencode", latestVersion: "9.9.9", checkedAt: now + day }
120
+ });
121
+ await runRefreshHelper(home);
122
+ const afterFutureCache = await readJsonIfPresent(cachePath);
123
+ const timestamps = [afterFutureCache?.checkedAt, afterFutureCache?.failedAt, afterFutureCache?.attemptedAt]
124
+ .filter((value) => value !== undefined);
125
+ check(results, behavior, "future-dated-cache-refreshed", "refreshed",
126
+ afterFutureCache !== undefined && afterFutureCache.latestVersion !== "9.9.9" ? "refreshed" : "kept", "cache checkedAt one day in the future");
127
+ check(results, behavior, "future-dated-timestamps-discarded", "0",
128
+ String(timestamps.filter((value) => value > Date.now()).length), `timestamps=${timestamps.length}`);
129
+
130
+ // Six real helper processes race from a clean state. Exactly one committed
131
+ // result may survive, with no reservation, no lock and no temporary file left.
132
+ await seedUpdateState(home, {});
133
+ await Promise.all(Array.from({ length: 6 }, () => runRefreshHelper(home)));
134
+ const afterRace = await readJsonIfPresent(cachePath);
135
+ const residue = (await fs.readdir(path.join(home, ".litopencode"))).sort();
136
+ check(results, behavior, "concurrent-refresh-single-cache", "update-check.json", residue.join(","), `${residue.length} state entries`);
137
+ check(results, behavior, "concurrent-refresh-no-open-reservation", "none", afterRace?.ownerGeneration ?? "none", "");
138
+ check(results, behavior, "concurrent-refresh-committed-once", "committed",
139
+ afterRace !== undefined && (afterRace.failedAt !== undefined || afterRace.checkedAt !== undefined) ? "committed" : "none", "");
140
+ }
141
+
142
+ async function boundedAuthorityLifecycle(results, ledger, plugin) {
143
+ const behavior = "bounded-authority-cas-idempotency";
144
+ const project = await createTempRoot(ledger, "bounded-authority");
145
+ await fs.writeFile(path.join(project, "PLAN.md"), "# QA plan\n\n- prove CAS fail-closed idempotency\n", "utf8");
146
+ const lifecycle = plugin.createBoundedAuthorityLifecycle(project);
147
+
148
+ check(results, behavior, "schema-version", "3", String(plugin.boundedAuthoritySchemaVersion), "public export");
149
+
150
+ const initRequest = {
151
+ schemaVersion: 3,
152
+ requestId: "request/init",
153
+ sessionID: "session/qa",
154
+ trustedUser: true,
155
+ expectedRevision: 0,
156
+ planPath: "PLAN.md",
157
+ worktree: null,
158
+ authorized: true,
159
+ authority: [{ action: "read", root: project }]
160
+ };
161
+ const applied = await lifecycle.init(initRequest);
162
+ check(results, behavior, "init-applied", "applied|1", `${applied.outcome}|${applied.state.revision}`, "");
163
+
164
+ const replay = await lifecycle.init(initRequest);
165
+ check(results, behavior, "identical-replay-is-idempotent", "replayed|1", `${replay.outcome}|${replay.state.revision}`, "same requestId, same payload");
166
+
167
+ const mutated = await lifecycle
168
+ .init({ ...initRequest, sessionID: "session/other" })
169
+ .then(() => "no-error")
170
+ .catch((error) => error.name);
171
+ check(results, behavior, "replay-id-reuse-fails-closed", "LifecycleConflictError", mutated, "same requestId, different payload");
172
+
173
+ const terminal = await lifecycle.complete({
174
+ schemaVersion: 3,
175
+ requestId: "request/complete",
176
+ workId: applied.state.workId,
177
+ sessionID: "session/qa",
178
+ expectedRevision: 1,
179
+ trustedUser: true
180
+ });
181
+ check(results, behavior, "terminal-advances-revision", "applied|2", `${terminal.outcome}|${terminal.state.revision}`, "");
182
+
183
+ const staleCas = await lifecycle
184
+ .init({ ...initRequest, requestId: "request/reinit-stale", expectedRevision: 0 })
185
+ .then(() => "no-error")
186
+ .catch((error) => `${error.name}:${/CAS revision mismatch/u.test(error.message) ? "cas" : "other"}`);
187
+ check(results, behavior, "stale-cas-revision-rejected", "LifecycleConflictError:cas", staleCas, "expectedRevision 0 against revision 2");
188
+
189
+ const wrongSchema = await lifecycle
190
+ .init({ ...initRequest, schemaVersion: 2, requestId: "request/schema-2" })
191
+ .then(() => "no-error")
192
+ .catch((error) => error.name);
193
+ check(results, behavior, "non-schema-3-rejected", "LifecycleSafetyError", wrongSchema, "schemaVersion 2");
194
+
195
+ const currentCas = await lifecycle.init({ ...initRequest, requestId: "request/reinit-current", expectedRevision: 2 });
196
+ check(results, behavior, "current-cas-revision-accepted", "applied|3", `${currentCas.outcome}|${currentCas.state.revision}`, "");
197
+
198
+ // Concurrent identical requests through independent lifecycle handles on the
199
+ // same state: the file lock plus the replay receipt must collapse them into a
200
+ // single applied mutation.
201
+ const raceProject = await createTempRoot(ledger, "bounded-authority-race");
202
+ await fs.writeFile(path.join(raceProject, "PLAN.md"), "# race plan\n", "utf8");
203
+ const raceRequest = { ...initRequest, requestId: "request/race", authority: [{ action: "read", root: raceProject }] };
204
+ const outcomes = await Promise.allSettled(
205
+ Array.from({ length: 4 }, () => plugin.createBoundedAuthorityLifecycle(raceProject).init(raceRequest))
206
+ );
207
+ const appliedCount = outcomes.filter((item) => item.status === "fulfilled" && item.value.outcome === "applied").length;
208
+ const revisions = new Set(
209
+ outcomes.filter((item) => item.status === "fulfilled").map((item) => item.value.state.revision)
210
+ );
211
+ check(results, behavior, "concurrent-identical-init-applies-once", "1", String(appliedCount), `settled=${outcomes.length}`);
212
+ check(results, behavior, "concurrent-identical-init-one-revision", "1", String(revisions.size), `revisions=${[...revisions].join(",")}`);
213
+ }
214
+
215
+ async function subagentDepthOne(results, ledger, plugin) {
216
+ const behavior = "subagent-depth-one-containment";
217
+ const project = await createTempRoot(ledger, "subagent");
218
+ const hooks = await plugin.default({ directory: project, worktree: project });
219
+ const config = {};
220
+ await hooks.config(config);
221
+
222
+ const agents = Object.entries(config.agent ?? {});
223
+ const subagents = agents.filter(([, entry]) => entry?.mode === "subagent");
224
+ const leaking = subagents.filter(([, entry]) => entry.tools?.task !== false || entry.permission?.task !== "deny");
225
+ const primaries = agents.filter(([, entry]) => entry?.mode === "all");
226
+
227
+ check(results, behavior, "config-hook-registered-agents", "true", String(agents.length > 0), `agents=${agents.length}`);
228
+ check(results, behavior, "subagent-population", "true", String(subagents.length >= 2), `subagents=${subagents.length}`);
229
+ check(results, behavior, "no-subagent-receives-task", "0", String(leaking.length), `leaking=${leaking.map(([id]) => id).join(",") || "none"}`);
230
+ check(
231
+ results, behavior, "host-build-and-plan-contained", "true",
232
+ String(["build", "plan"].every((id) => config.agent?.[id]?.mode === "subagent" && config.agent[id].tools?.task === false)),
233
+ "OpenCode built-in build/plan agents"
234
+ );
235
+ check(
236
+ results, behavior, "lit-plan-task-denied", "deny",
237
+ config.agent?.["lit-plan"]?.permission?.task ?? "none",
238
+ `mode=${config.agent?.["lit-plan"]?.mode ?? "none"}`
239
+ );
240
+ check(results, behavior, "primary-agents-present", "true", String(primaries.length > 0), `primaries=${primaries.length}`);
241
+ await hooks.dispose?.();
242
+ }
243
+
244
+ async function main() {
245
+ assertBuiltRuntime();
246
+ const ledger = new CleanupLedger();
247
+ const results = [];
248
+ try {
249
+ // Redirect the whole probe process away from the live profile before the
250
+ // shipped runtime is imported.
251
+ const home = await createTempRoot(ledger, "home");
252
+ await fs.mkdir(path.join(home, "config"), { recursive: true });
253
+ process.env.HOME = home;
254
+ process.env.USERPROFILE = home;
255
+ process.env.XDG_CONFIG_HOME = path.join(home, "config");
256
+ if (path.resolve(os.homedir()) !== path.resolve(home)) {
257
+ throw new Error(`refusing to run: os.homedir() is ${os.homedir()} and not the isolated ${home}`);
258
+ }
259
+
260
+ const plugin = await import(pathToFileURL(path.join(repoRoot, "dist", "index.js")).href);
261
+ await updateNotifierConcurrency(results, ledger);
262
+ await boundedAuthorityLifecycle(results, ledger, plugin);
263
+ await subagentDepthOne(results, ledger, plugin);
264
+ } finally {
265
+ await ledger.removeAll();
266
+ }
267
+
268
+ process.stdout.write("BEHAVIOR REPLACEMENT PROBES (replacement real-surface QA)\n");
269
+ for (const item of results) {
270
+ process.stdout.write(
271
+ `BEHAVIOR ${item.behavior} ${item.name.padEnd(38)} expected=${item.expected} observed=${item.observed} status=${item.status}` +
272
+ `${item.detail === "" ? "" : ` detail=${item.detail}`}\n`
273
+ );
274
+ }
275
+ for (const behavior of [...new Set(results.map((item) => item.behavior))]) {
276
+ const failed = results.filter((item) => item.behavior === behavior && item.status !== "PASS");
277
+ process.stdout.write(`BEHAVIOR-VERDICT ${behavior} ${failed.length === 0 ? "REPLACED" : "NOT-REPLACED"} failures=${failed.length}\n`);
278
+ }
279
+ process.stdout.write(`${ledger.render("behavior-replacement-probes")}\n`);
280
+
281
+ const failures = results.filter((item) => item.status !== "PASS");
282
+ process.stdout.write(`SUMMARY checks=${results.length} passing=${results.length - failures.length} failing=${failures.length} cleanup-incomplete=${ledger.incomplete.length}\n`);
283
+ if (failures.length > 0 || ledger.incomplete.length > 0) {
284
+ process.stdout.write("BEHAVIOR REPLACEMENT PROBES FAILED\n");
285
+ process.exitCode = 1;
286
+ return;
287
+ }
288
+ process.stdout.write("BEHAVIOR REPLACEMENT PROBES PASSED\n");
289
+ }
290
+
291
+ if (process.argv[1] !== undefined && path.resolve(process.argv[1]) === fileURLToPath(import.meta.url)) {
292
+ main().catch((error) => {
293
+ process.stderr.write(`BEHAVIOR_PROBE_ERROR: ${error instanceof Error ? error.stack ?? error.message : String(error)}\n`);
294
+ process.exitCode = 2;
295
+ });
296
+ }
@@ -0,0 +1,101 @@
1
+ #!/usr/bin/env node
2
+ import fs from "node:fs";
3
+ import { spawnSync } from "node:child_process";
4
+ import path from "node:path";
5
+ import process from "node:process";
6
+
7
+ const projectRoot = fs.realpathSync(process.cwd());
8
+ const tscBin = path.join(projectRoot, "node_modules", "typescript", "bin", "tsc");
9
+ const sourceRoot = path.join(projectRoot, "src");
10
+ const sourceEntry = path.join(projectRoot, "src", "index.ts");
11
+ const builtEntry = path.join(projectRoot, "dist", "index.js");
12
+
13
+ function lstatNoFollow(filePath) {
14
+ try {
15
+ return fs.lstatSync(filePath);
16
+ } catch (error) {
17
+ if (error instanceof Error && "code" in error && error.code === "ENOENT") return undefined;
18
+ throw error;
19
+ }
20
+ }
21
+
22
+ function assertNoSymlinks(directory) {
23
+ for (const entry of fs.readdirSync(directory, { withFileTypes: true })) {
24
+ const entryPath = path.join(directory, entry.name);
25
+ const stat = fs.lstatSync(entryPath);
26
+ if (stat.isSymbolicLink()) throw new Error(`dist contains a symbolic link: ${entryPath}`);
27
+ if (stat.isDirectory()) assertNoSymlinks(entryPath);
28
+ }
29
+ }
30
+
31
+ function generatedDistPath() {
32
+ if (projectRoot === path.parse(projectRoot).root) throw new Error("project root cannot be the filesystem root");
33
+ const distPath = path.resolve(projectRoot, "dist");
34
+ if (path.dirname(distPath) !== projectRoot || path.basename(distPath) !== "dist") {
35
+ throw new Error(`unsafe dist path: ${distPath}`);
36
+ }
37
+ const stat = lstatNoFollow(distPath);
38
+ if (stat === undefined) return distPath;
39
+ if (stat.isSymbolicLink()) throw new Error(`dist is a symbolic link: ${distPath}`);
40
+ if (!stat.isDirectory()) throw new Error(`dist is not a directory: ${distPath}`);
41
+ assertNoSymlinks(distPath);
42
+ return distPath;
43
+ }
44
+
45
+ const sourceRootStat = lstatNoFollow(sourceRoot);
46
+ if (sourceRootStat === undefined) {
47
+ try {
48
+ const distPath = path.resolve(projectRoot, "dist");
49
+ const distStat = lstatNoFollow(distPath);
50
+ if (distStat === undefined) throw new Error("dist is missing");
51
+ if (distStat.isSymbolicLink()) throw new Error(`dist is a symbolic link: ${distPath}`);
52
+ if (!distStat.isDirectory()) throw new Error(`dist is not a directory: ${distPath}`);
53
+ assertNoSymlinks(distPath);
54
+ const builtStat = lstatNoFollow(builtEntry);
55
+ if (builtStat === undefined) throw new Error(`packed entry is missing: ${builtEntry}`);
56
+ if (builtStat.isSymbolicLink()) throw new Error(`packed entry is a symbolic link: ${builtEntry}`);
57
+ if (!builtStat.isFile()) throw new Error(`packed entry is not a regular file: ${builtEntry}`);
58
+ } catch (error) {
59
+ const message = error instanceof Error ? error.message : String(error);
60
+ console.error(`build failed: source files are missing and packed dist is unsafe: ${message}`);
61
+ process.exit(1);
62
+ }
63
+ console.log("build skipped: source files are not present in this packed artifact.");
64
+ process.exit(0);
65
+ }
66
+ if (sourceRootStat.isSymbolicLink() || !sourceRootStat.isDirectory()) {
67
+ console.error(`build failed: source tree is not a regular non-symlink directory: ${sourceRoot}`);
68
+ process.exit(1);
69
+ }
70
+
71
+ const sourceStat = lstatNoFollow(sourceEntry);
72
+ if (sourceStat === undefined) {
73
+ console.error(`build failed: source entry is missing from the existing source tree: ${sourceEntry}`);
74
+ process.exit(1);
75
+ }
76
+ if (!sourceStat.isFile()) {
77
+ console.error(`build failed: source entry is not a regular non-symlink file: ${sourceEntry}`);
78
+ process.exit(1);
79
+ }
80
+
81
+ const compilerStat = lstatNoFollow(tscBin);
82
+ if (compilerStat === undefined || !compilerStat.isFile()) {
83
+ console.error("build failed: TypeScript dev dependency is not installed.");
84
+ process.exit(1);
85
+ }
86
+
87
+ try {
88
+ fs.rmSync(generatedDistPath(), { recursive: true, force: true });
89
+ } catch (error) {
90
+ const message = error instanceof Error ? error.message : String(error);
91
+ console.error(`build failed: refusing to replace generated dist: ${message}`);
92
+ process.exit(1);
93
+ }
94
+
95
+ const result = spawnSync(process.execPath, [tscBin, "-p", "tsconfig.build.json"], {
96
+ cwd: projectRoot,
97
+ encoding: "utf8",
98
+ stdio: "inherit"
99
+ });
100
+
101
+ process.exit(result.status ?? 1);
@@ -0,0 +1,52 @@
1
+ #!/usr/bin/env node
2
+ import fs from "node:fs/promises";
3
+ import path from "node:path";
4
+ import process from "node:process";
5
+ import { fileURLToPath } from "node:url";
6
+ import {
7
+ LocalBenchmarkError,
8
+ runPackedLocalBenchmark,
9
+ summarizeDurations
10
+ } from "./harness-speed-local.mjs";
11
+
12
+ export { LocalBenchmarkError, runPackedLocalBenchmark, summarizeDurations };
13
+
14
+ function option(argv, name) {
15
+ const index = argv.indexOf(name);
16
+ if (index < 0 || argv[index + 1] === undefined) throw new LocalBenchmarkError("INVALID_CLI_USAGE");
17
+ return argv[index + 1];
18
+ }
19
+
20
+ async function writeReceipt(filePath, receipt) {
21
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
22
+ const temporary = `${filePath}.tmp-${process.pid}`;
23
+ await fs.writeFile(temporary, `${JSON.stringify(receipt, null, 2)}\n`, { encoding: "utf8", mode: 0o600 });
24
+ await fs.rename(temporary, filePath);
25
+ }
26
+
27
+ async function main(argv) {
28
+ const outputPath = option(argv, "--output");
29
+ const receipt = await runPackedLocalBenchmark({
30
+ arm: option(argv, "--arm"),
31
+ artifactSha256: option(argv, "--artifact-sha256"),
32
+ head: option(argv, "--head"),
33
+ packageRoot: path.resolve(option(argv, "--package-root")),
34
+ samples: Number(option(argv, "--samples")),
35
+ scenarioPath: path.resolve(option(argv, "--scenario"))
36
+ });
37
+ await writeReceipt(path.resolve(outputPath), receipt);
38
+ process.stdout.write(`${JSON.stringify({ verdict: "PASS", output: path.basename(outputPath), provider_completions: 0 })}\n`);
39
+ }
40
+
41
+ if (process.argv[1] !== undefined && path.resolve(process.argv[1]) === fileURLToPath(import.meta.url)) {
42
+ try {
43
+ await main(process.argv.slice(2));
44
+ } catch (error) {
45
+ if (error instanceof LocalBenchmarkError) {
46
+ process.stderr.write(`${JSON.stringify({ verdict: "FAIL", code: error.code, provider_completions: 0 })}\n`);
47
+ process.exitCode = 1;
48
+ } else {
49
+ throw error;
50
+ }
51
+ }
52
+ }
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env node
2
+ import { readFileSync } from "node:fs";
3
+ import path from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import {
6
+ HarnessSpeedV2ContractError,
7
+ validateV2Comparison,
8
+ validateV2FixtureBytes
9
+ } from "../qa/harness-speed-v2-contract.mjs";
10
+
11
+ function main(argv) {
12
+ if (argv.length !== 4 || argv[0] !== "--self-check" || argv[2] !== "--fixture") {
13
+ throw new HarnessSpeedV2ContractError("INVALID_CLI_USAGE");
14
+ }
15
+ validateV2FixtureBytes(readFileSync(argv[3]));
16
+ let receipt;
17
+ try {
18
+ receipt = JSON.parse(readFileSync(argv[1], "utf8"));
19
+ } catch {
20
+ throw new HarnessSpeedV2ContractError("MALFORMED_RECEIPT");
21
+ }
22
+ process.stdout.write(`${JSON.stringify(validateV2Comparison(receipt))}\n`);
23
+ }
24
+
25
+ if (process.argv[1] !== undefined && path.resolve(process.argv[1]) === fileURLToPath(import.meta.url)) {
26
+ try {
27
+ main(process.argv.slice(2));
28
+ } catch (error) {
29
+ if (error instanceof HarnessSpeedV2ContractError) {
30
+ process.stderr.write(`${JSON.stringify({ verdict: "FAIL", code: error.code, field: error.field })}\n`);
31
+ process.exitCode = 1;
32
+ } else {
33
+ throw error;
34
+ }
35
+ }
36
+ }
@@ -0,0 +1,62 @@
1
+ #!/usr/bin/env node
2
+ // Replacement real-surface QA: installed-resource tamper and repair.
3
+ //
4
+ // Installs this working tree into an isolated temporary OpenCode root, proves
5
+ // the shipped doctor reports clean integrity, corrupts one pinned managed asset
6
+ // by a single byte, proves doctor names that exact asset and fails, restores the
7
+ // original bytes, proves doctor passes again, then removes the temporary root
8
+ // and prints a cleanup receipt. No live profile is read or written.
9
+ import path from "node:path";
10
+ import process from "node:process";
11
+ import { fileURLToPath } from "node:url";
12
+ import {
13
+ CleanupLedger,
14
+ assertBuiltRuntime,
15
+ installIntoIsolatedRoot,
16
+ tamperRestoreProbe,
17
+ tamperTargetRelativePath
18
+ } from "./qa-real-surface-harness.mjs";
19
+
20
+ function stage(label, expectation, actual, detail) {
21
+ const ok = expectation === actual;
22
+ process.stdout.write(`TAMPER ${label.padEnd(26)} expected=${expectation} observed=${actual} status=${ok ? "PASS" : "FAIL"} detail=${detail}\n`);
23
+ return ok;
24
+ }
25
+
26
+ async function main() {
27
+ assertBuiltRuntime();
28
+ const ledger = new CleanupLedger();
29
+ let probe;
30
+ try {
31
+ const { openCodeRoot, homeDir } = await installIntoIsolatedRoot(ledger);
32
+ process.stdout.write(`TAMPER isolated-root ${openCodeRoot}\n`);
33
+ process.stdout.write(`TAMPER pinned-resource ${tamperTargetRelativePath}\n`);
34
+ probe = await tamperRestoreProbe(openCodeRoot, homeDir);
35
+ } finally {
36
+ await ledger.removeAll();
37
+ }
38
+
39
+ const namesTamperedAsset = probe.tampered.invalidAssets.includes("visual-qa/schemas/evidence-manifest-v1alpha1.json");
40
+ const results = [
41
+ stage("clean-install-integrity", "PASS", probe.clean.ok ? "PASS" : "FAIL", `invalid=${probe.clean.invalid.length}`),
42
+ stage("tampered-integrity", "FAIL", probe.tampered.ok ? "PASS" : "FAIL", `invalidAssets=${probe.tampered.invalidAssets.join(",") || "none"}`),
43
+ stage("tampered-names-asset", "PASS", namesTamperedAsset ? "PASS" : "FAIL", "doctor must name the corrupted pinned asset"),
44
+ stage("restored-integrity", "PASS", probe.restored.ok ? "PASS" : "FAIL", `invalid=${probe.restored.invalid.length}`),
45
+ stage("restored-bytes-identical", "PASS", probe.originalSha256 === probe.restoredSha256 ? "PASS" : "FAIL", `sha256=${probe.restoredSha256}`)
46
+ ];
47
+
48
+ process.stdout.write(`${ledger.render("installed-resource-tamper-probe")}\n`);
49
+ if (results.some((ok) => !ok) || ledger.incomplete.length > 0) {
50
+ process.stdout.write("INSTALLED RESOURCE TAMPER PROBE FAILED\n");
51
+ process.exitCode = 1;
52
+ return;
53
+ }
54
+ process.stdout.write("INSTALLED RESOURCE TAMPER PROBE PASSED\n");
55
+ }
56
+
57
+ if (process.argv[1] !== undefined && path.resolve(process.argv[1]) === fileURLToPath(import.meta.url)) {
58
+ main().catch((error) => {
59
+ process.stderr.write(`TAMPER_PROBE_ERROR: ${error instanceof Error ? error.stack ?? error.message : String(error)}\n`);
60
+ process.exitCode = 2;
61
+ });
62
+ }