@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,302 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { mutatedFilePaths } from "./tool-guards.js";
5
+ export const artifactGenres = [
6
+ "client_deliverable",
7
+ "internal_analysis",
8
+ "audit_report",
9
+ "working_note",
10
+ "no_artifact"
11
+ ];
12
+ const limitationsByGenre = Object.freeze({
13
+ client_deliverable: "reply",
14
+ internal_analysis: "designated_section",
15
+ audit_report: "methodology_paragraph",
16
+ working_note: "inline",
17
+ no_artifact: "reply"
18
+ });
19
+ const defaultSkillsRoot = fileURLToPath(new URL("../skills", import.meta.url));
20
+ const lazyOutputChannelSkills = new Set(["frontend-ui-ux", "visual-qa"]);
21
+ const readerFacingExtensions = new Set([".adoc", ".html", ".md", ".mdx", ".rst", ".tex", ".txt"]);
22
+ const maxArtifactBytes = 2 * 1024 * 1024;
23
+ const maxTrackedSessions = 256;
24
+ const maxHedgeFindings = 32;
25
+ const maxReportedLines = 16;
26
+ const maxAdditionalContextBytes = 512;
27
+ const textKeysByTool = Object.freeze({
28
+ write: ["content"],
29
+ edit: ["newString", "new_string"]
30
+ });
31
+ const phrasePatterns = [
32
+ { className: "deferred", pattern: /보류\s*중|별도로\s*진행|추후\s*진행|to be determined separately/giu },
33
+ { className: "scope-limit", pattern: /한정됩니다|국한됩니다|범위\s*내에서만|limited to the provided evidence/giu },
34
+ { className: "negated-action", pattern: /하지\s*않았습니다|포함되지\s*않습니다|다루지\s*않습니다|was not performed|is not included/giu },
35
+ { className: "self-protection", pattern: /참고용|추가\s*검증이\s*필요|완전하지\s*않을\s*수\s*있|for reference only|may be incomplete/giu },
36
+ { className: "process-meta", pattern: /as an AI|이\s*작업에서는|프롬프트가/giu }
37
+ ];
38
+ const evidenceSubject = /근거|자료|측정값|관찰\s*기록|데이터|증거|출처|참고문헌|평가\s*자료|검토\s*자료|시험\s*결과|검증\s*결과|수치|통계|evidence|data|measurement|observation|source|citation|test result/iu;
39
+ const evaluativeSubject = /접근성|성능|효과|유효성|품질|평가|결과|점수|충족\s*여부|적합성|안전성|accessibility|performance|effect|validity|quality|score|compliance|safety/iu;
40
+ const koreanAbsence = /없(?:어(?:서)?|습니다|음)|부족|부재|제공되지\s*않|주어지지\s*않|확인되지\s*않|검증되지\s*않/u;
41
+ const koreanEpistemicInability = /(?:평가|판단|산정)할\s*수\s*없|알\s*수\s*없/u;
42
+ const englishAbsence = /\b(?:no evidence yet|not yet substantiated|(?:evidence|data|measurements?|observations?|sources?|citations?|test results?) (?:is|are|was|were)?\s*(?:missing|absent|unavailable|insufficient|not (?:provided|available|verified|substantiated)))\b/iu;
43
+ const englishEpistemicInability = /\b(?:cannot|can not|unable to)\s+(?:assess|determine|calculate|establish|substantiate|verify)\b/iu;
44
+ function isArtifactGenre(value) {
45
+ return typeof value === "string" && artifactGenres.some((candidate) => candidate === value);
46
+ }
47
+ function outputChannelBlock(markdown) {
48
+ return markdown.match(/^## #contract\.output_channels\s*\n\s*```ya?ml\s*\n([\s\S]*?)\n```\s*$/mu)?.[1];
49
+ }
50
+ function parseScalarBlock(block, source) {
51
+ const values = {};
52
+ for (const line of block.split("\n")) {
53
+ if (line.trim() === "")
54
+ continue;
55
+ const scalar = line.match(/^([a-z_]+):\s*([a-z_]+)\s*$/u);
56
+ if (scalar === null || values[scalar[1]] !== undefined) {
57
+ throw new Error(`OUTPUT_CHANNEL_INVALID source=${source}`);
58
+ }
59
+ values[scalar[1]] = scalar[2];
60
+ }
61
+ return values;
62
+ }
63
+ function parseOutputChannel(markdown, source) {
64
+ const block = outputChannelBlock(markdown);
65
+ if (block === undefined)
66
+ return undefined;
67
+ const parsed = parseScalarBlock(block, source);
68
+ const artifactGenre = parsed.artifact_genre;
69
+ const limitationsChannel = parsed.limitations_channel;
70
+ if (!isArtifactGenre(artifactGenre)) {
71
+ throw new Error(`OUTPUT_CHANNEL_GENRE_INVALID source=${source}`);
72
+ }
73
+ const expectedChannel = limitationsByGenre[artifactGenre];
74
+ if (expectedChannel !== limitationsChannel) {
75
+ throw new Error(`OUTPUT_CHANNEL_LIMITATIONS_MISMATCH source=${source}`);
76
+ }
77
+ return { artifactGenre, limitationsChannel: expectedChannel };
78
+ }
79
+ export async function readOutputChannelContract(skillId, root = defaultSkillsRoot) {
80
+ if (!/^[a-z][a-z0-9-]{0,63}$/u.test(skillId))
81
+ throw new Error(`OUTPUT_CHANNEL_SKILL_INVALID skill=${skillId}`);
82
+ const skillPath = path.join(root, skillId, "SKILL.md");
83
+ const direct = parseOutputChannel(await fs.readFile(skillPath, "utf8"), skillPath);
84
+ if (direct !== undefined)
85
+ return direct;
86
+ if (!lazyOutputChannelSkills.has(skillId))
87
+ throw new Error(`OUTPUT_CHANNEL_MISSING skill=${skillId}`);
88
+ const completeContractPath = path.join(root, skillId, "references", "complete-contract.md");
89
+ const referenced = parseOutputChannel(await fs.readFile(completeContractPath, "utf8"), completeContractPath);
90
+ if (referenced === undefined)
91
+ throw new Error(`OUTPUT_CHANNEL_MISSING skill=${skillId}`);
92
+ return referenced;
93
+ }
94
+ function canonicalSkillId(routeId) {
95
+ const normalized = routeId.trim().replace(/^\//u, "").toLowerCase();
96
+ if (normalized.startsWith("autoresearch-"))
97
+ return "autoresearch";
98
+ if (normalized.startsWith("autoconference-"))
99
+ return "autoconference";
100
+ if (normalized.startsWith("wikify-"))
101
+ return "wikify";
102
+ const aliases = Object.freeze({
103
+ lit: "workflow-loop",
104
+ "lit-loop": "workflow-loop",
105
+ "lit-work": "litwork",
106
+ litgoal: "durable-litgoal",
107
+ "lit-goal": "durable-litgoal",
108
+ "lit-research": "litresearch",
109
+ "text-neutralization": "lit-korean"
110
+ });
111
+ return aliases[normalized] ?? normalized;
112
+ }
113
+ export function createDeliverableHedgeSessionState(root = defaultSkillsRoot) {
114
+ const active = new Map();
115
+ return {
116
+ async activate(sessionID, routeId) {
117
+ const skillId = canonicalSkillId(routeId);
118
+ try {
119
+ if (!active.has(sessionID) && active.size >= maxTrackedSessions) {
120
+ const oldest = active.keys().next().value;
121
+ if (oldest !== undefined)
122
+ active.delete(oldest);
123
+ }
124
+ active.set(sessionID, { skillId, contract: await readOutputChannelContract(skillId, root) });
125
+ }
126
+ catch {
127
+ active.delete(sessionID);
128
+ }
129
+ },
130
+ clear(sessionID) {
131
+ active.delete(sessionID);
132
+ },
133
+ dispose() {
134
+ active.clear();
135
+ },
136
+ contractFor(sessionID) {
137
+ return active.get(sessionID);
138
+ }
139
+ };
140
+ }
141
+ function quotedRangeContains(line, index) {
142
+ for (const quote of ['"', "'"]) {
143
+ let start = line.indexOf(quote);
144
+ while (start !== -1) {
145
+ const end = line.indexOf(quote, start + 1);
146
+ if (end === -1)
147
+ break;
148
+ if (start < index && index < end)
149
+ return true;
150
+ start = line.indexOf(quote, end + 1);
151
+ }
152
+ }
153
+ return false;
154
+ }
155
+ function isStateScalarOrTable(line) {
156
+ const scalar = /^\s*["']?[A-Za-z_][\w.-]*["']?\s*:\s*["']?(?:pending|deferred|보류\s*중)["']?\s*[,}]?\s*$/iu;
157
+ return scalar.test(line) || (line.includes("|") && /(?:status|state|상태|pending|deferred|보류\s*중)/iu.test(line));
158
+ }
159
+ function isAbsentEvidence(line) {
160
+ if (englishAbsence.test(line))
161
+ return true;
162
+ if (englishEpistemicInability.test(line) && evidenceSubject.test(line))
163
+ return true;
164
+ const hasEvidenceSubject = evidenceSubject.test(line);
165
+ const hasEvaluativeSubject = evaluativeSubject.test(line);
166
+ if (hasEvidenceSubject && (koreanAbsence.test(line) || koreanEpistemicInability.test(line)))
167
+ return true;
168
+ return hasEvaluativeSubject && koreanEpistemicInability.test(line) && /(?:없|부족|부재|제공되지|주어지지|확인되지|검증되지)/u.test(line);
169
+ }
170
+ function headingLevel(line) {
171
+ return line.match(/^(#{1,6})\s+/u)?.[1].length ?? 0;
172
+ }
173
+ function permittedLineMask(lines, genre) {
174
+ const permitted = lines.map(() => false);
175
+ if (genre === "working_note" || genre === "no_artifact")
176
+ return lines.map(() => true);
177
+ if (genre === "client_deliverable")
178
+ return permitted;
179
+ if (genre === "audit_report") {
180
+ const heading = lines.findIndex((line) => /^#{1,6}\s+.*(?:방법론|methodology)/iu.test(line));
181
+ if (heading === -1)
182
+ return permitted;
183
+ let began = false;
184
+ for (let index = heading + 1; index < lines.length; index += 1) {
185
+ if (/^#{1,6}\s+/u.test(lines[index]))
186
+ break;
187
+ if (lines[index].trim() === "") {
188
+ if (began)
189
+ break;
190
+ continue;
191
+ }
192
+ began = true;
193
+ permitted[index] = true;
194
+ }
195
+ return permitted;
196
+ }
197
+ const heading = lines.findIndex((line) => /^#{1,6}\s+.*(?:한계|limitations?)/iu.test(line));
198
+ if (heading === -1)
199
+ return permitted;
200
+ const level = headingLevel(lines[heading]);
201
+ for (let index = heading + 1; index < lines.length; index += 1) {
202
+ const nextLevel = headingLevel(lines[index]);
203
+ if (nextLevel !== 0 && nextLevel <= level)
204
+ break;
205
+ permitted[index] = true;
206
+ }
207
+ return permitted;
208
+ }
209
+ export function inspectDeliverableHedges(text, genre) {
210
+ const lines = text.replaceAll("\r\n", "\n").split("\n");
211
+ const permitted = permittedLineMask(lines, genre);
212
+ const findings = [];
213
+ let fence;
214
+ for (let index = 0; index < lines.length; index += 1) {
215
+ const line = lines[index];
216
+ const fenceMatch = line.match(/^\s*(```|~~~)/u)?.[1];
217
+ if (fenceMatch !== undefined) {
218
+ fence = fence === undefined ? fenceMatch : fence === fenceMatch ? undefined : fence;
219
+ continue;
220
+ }
221
+ if (fence !== undefined || permitted[index])
222
+ continue;
223
+ if (isAbsentEvidence(line))
224
+ findings.push({ className: "absent-evidence", line: index + 1 });
225
+ if (findings.length >= maxHedgeFindings)
226
+ break;
227
+ for (const candidate of phrasePatterns) {
228
+ candidate.pattern.lastIndex = 0;
229
+ const match = candidate.pattern.exec(line);
230
+ if (match === null)
231
+ continue;
232
+ if (candidate.className === "deferred" && (quotedRangeContains(line, match.index) || isStateScalarOrTable(line)))
233
+ continue;
234
+ findings.push({ className: candidate.className, line: index + 1 });
235
+ if (findings.length >= maxHedgeFindings)
236
+ break;
237
+ }
238
+ if (findings.length >= maxHedgeFindings)
239
+ break;
240
+ }
241
+ return findings;
242
+ }
243
+ function isPlainRecord(value) {
244
+ return typeof value === "object" && value !== null && !Array.isArray(value);
245
+ }
246
+ function isReaderFacingPath(candidate) {
247
+ return !candidate.includes("\0") && readerFacingExtensions.has(path.extname(candidate).toLowerCase());
248
+ }
249
+ function toolInputText(input) {
250
+ if (!isPlainRecord(input.args))
251
+ return undefined;
252
+ const args = input.args;
253
+ const keys = textKeysByTool[input.tool];
254
+ if (keys === undefined)
255
+ return undefined;
256
+ const values = keys
257
+ .map((key) => args[key])
258
+ .filter((value) => typeof value === "string");
259
+ if (values.length !== 1)
260
+ return undefined;
261
+ const text = values[0];
262
+ if (Buffer.byteLength(text, "utf8") > maxArtifactBytes)
263
+ return undefined;
264
+ const paths = mutatedFilePaths(args);
265
+ return paths.some(isReaderFacingPath) ? text : undefined;
266
+ }
267
+ function boundedUtf8(text, maxBytes) {
268
+ if (Buffer.byteLength(text, "utf8") <= maxBytes)
269
+ return text;
270
+ let end = Math.min(text.length, maxBytes);
271
+ while (end > 0 && Buffer.byteLength(text.slice(0, end), "utf8") > maxBytes)
272
+ end -= 1;
273
+ return text.slice(0, end);
274
+ }
275
+ function modelVisibleContext(skillId, contract, findings) {
276
+ const uniqueLines = [...new Set(findings.map((finding) => finding.line))];
277
+ const reported = uniqueLines.slice(0, maxReportedLines);
278
+ const omitted = uniqueLines.length - reported.length;
279
+ const lines = `${reported.join(",")}${omitted > 0 ? `,+${omitted}` : ""}`;
280
+ return boundedUtf8(`DELIVERABLE_HEDGE_VIOLATION skill=${skillId} genre=${contract.artifactGenre} findings=${findings.length} lines=${lines}. Revise the artifact so limitations use ${contract.limitationsChannel}.`, maxAdditionalContextBytes);
281
+ }
282
+ export async function applyDeliverableHedgeAfterHook(state, input, output) {
283
+ const active = state.contractFor(input.sessionID);
284
+ if (active === undefined)
285
+ return;
286
+ const text = toolInputText(input);
287
+ if (text === undefined)
288
+ return;
289
+ const findings = inspectDeliverableHedges(text, active.contract.artifactGenre);
290
+ if (findings.length === 0)
291
+ return;
292
+ const context = modelVisibleContext(active.skillId, active.contract, findings);
293
+ output.output = output.output.trim().length === 0 ? context : `${output.output}\n\n${context}`;
294
+ output.metadata = {
295
+ ...output.metadata,
296
+ litopencodeDeliverableHedgeGuard: {
297
+ skillId: active.skillId,
298
+ artifactGenre: active.contract.artifactGenre,
299
+ findings: findings.length
300
+ }
301
+ };
302
+ }
@@ -0,0 +1,23 @@
1
+ export type ApprovedPlanRequest = {
2
+ readonly schemaVersion: 1;
3
+ readonly slug: string;
4
+ readonly markdown: string;
5
+ readonly approved: true;
6
+ readonly requestId: string;
7
+ readonly revision: number;
8
+ readonly expiresAt?: string;
9
+ };
10
+ export type DurablePlan = {
11
+ readonly relativePath: string;
12
+ readonly absolutePath: string;
13
+ readonly text: string;
14
+ readonly requestId: string;
15
+ readonly revision: number;
16
+ readonly expiresAt?: string;
17
+ readonly replayed?: boolean;
18
+ };
19
+ export declare function parsePlanSaveArgument(argumentsText: string): ApprovedPlanRequest | undefined;
20
+ export declare function persistApprovedPlan(projectRoot: string, request: ApprovedPlanRequest): Promise<DurablePlan>;
21
+ export declare function resolveLatestDurablePlan(projectRoot: string): Promise<DurablePlan | undefined>;
22
+ export declare function formatResolvedPlanNotice(plan: DurablePlan): string;
23
+ export declare function formatSavedPlanNotice(plan: DurablePlan, replayed: boolean): string;
@@ -0,0 +1,349 @@
1
+ import { createHash, randomUUID } from "node:crypto";
2
+ import fs from "node:fs/promises";
3
+ import path from "node:path";
4
+ const PLAN_DIRECTORY = path.join(".litopencode", "plans");
5
+ const MAX_PLAN_BYTES = 256 * 1024;
6
+ const MAX_ARGUMENT_BYTES = 512 * 1024;
7
+ const PLAN_HEADER_PREFIX = "<!-- litopencode-durable-plan: ";
8
+ const PLAN_HEADER_SUFFIX = " -->";
9
+ const PLAN_LOCK_OWNER = "owner.json";
10
+ const SAFE_REQUEST_ID = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/u;
11
+ const SHA256 = /^[a-f0-9]{64}$/u;
12
+ function hasErrorCode(error, code) {
13
+ return error instanceof Error && "code" in error && error.code === code;
14
+ }
15
+ async function acquirePlanLock(lockPath) {
16
+ const token = randomUUID();
17
+ while (true) {
18
+ try {
19
+ await fs.mkdir(lockPath, { mode: 0o700 });
20
+ break;
21
+ }
22
+ catch (error) {
23
+ if (!hasErrorCode(error, "EEXIST"))
24
+ throw error;
25
+ let stat;
26
+ try {
27
+ stat = await fs.lstat(lockPath);
28
+ }
29
+ catch (lockError) {
30
+ if (hasErrorCode(lockError, "ENOENT"))
31
+ continue;
32
+ throw lockError;
33
+ }
34
+ if (stat.isSymbolicLink() || !stat.isDirectory())
35
+ throw new Error("unsafe plan persistence lock");
36
+ throw new Error("plan persistence lock is held");
37
+ }
38
+ }
39
+ const ownerPath = path.join(lockPath, PLAN_LOCK_OWNER);
40
+ try {
41
+ await fs.writeFile(ownerPath, `${JSON.stringify({ token, pid: process.pid })}\n`, {
42
+ encoding: "utf8",
43
+ flag: "wx",
44
+ mode: 0o600
45
+ });
46
+ }
47
+ catch (error) {
48
+ await fs.rmdir(lockPath).catch(() => undefined);
49
+ throw error;
50
+ }
51
+ return async () => {
52
+ let stat;
53
+ try {
54
+ stat = await fs.lstat(ownerPath);
55
+ }
56
+ catch (error) {
57
+ if (hasErrorCode(error, "ENOENT"))
58
+ return;
59
+ throw error;
60
+ }
61
+ if (stat.isSymbolicLink() || !stat.isFile())
62
+ throw new Error("unsafe plan persistence lock owner");
63
+ let owner;
64
+ try {
65
+ owner = JSON.parse(await fs.readFile(ownerPath, "utf8"));
66
+ }
67
+ catch (error) {
68
+ if (hasErrorCode(error, "ENOENT"))
69
+ return;
70
+ throw error;
71
+ }
72
+ if (!isRecord(owner) || owner.token !== token)
73
+ return;
74
+ await fs.rm(ownerPath, { force: true });
75
+ await fs.rmdir(lockPath).catch((error) => {
76
+ if (!hasErrorCode(error, "ENOENT"))
77
+ throw error;
78
+ });
79
+ };
80
+ }
81
+ function isRecord(value) {
82
+ return typeof value === "object" && value !== null && !Array.isArray(value);
83
+ }
84
+ function isSafeSlug(value) {
85
+ return /^[a-z0-9]+(?:-[a-z0-9]+)*$/u.test(value) && value.length <= 64;
86
+ }
87
+ function digest(text) {
88
+ return createHash("sha256").update(text, "utf8").digest("hex");
89
+ }
90
+ function normalizeMarkdown(markdown) {
91
+ return markdown.endsWith("\n") ? markdown : `${markdown}\n`;
92
+ }
93
+ function validExpiry(value) {
94
+ if (typeof value !== "string" || value.trim() === "")
95
+ return false;
96
+ const timestamp = Date.parse(value);
97
+ return Number.isFinite(timestamp) && timestamp > Date.now();
98
+ }
99
+ function validSavedAt(value) {
100
+ return typeof value === "string" && Number.isFinite(Date.parse(value));
101
+ }
102
+ function validateRequest(request) {
103
+ if (!isSafeSlug(request.slug))
104
+ return "plan slug must be a lowercase hyphenated identifier";
105
+ if (request.schemaVersion !== 1)
106
+ return "plan schemaVersion must be 1";
107
+ if (request.approved !== true)
108
+ return "plan approval must be explicit";
109
+ if (typeof request.markdown !== "string" || request.markdown.trim() === "")
110
+ return "plan markdown must be non-empty";
111
+ if (!SAFE_REQUEST_ID.test(request.requestId))
112
+ return "plan requestId is invalid";
113
+ if (!Number.isSafeInteger(request.revision) || request.revision < 1)
114
+ return "plan revision must be a positive integer";
115
+ if (request.expiresAt !== undefined && !validExpiry(request.expiresAt))
116
+ return "plan expiry is stale or invalid";
117
+ const body = normalizeMarkdown(request.markdown);
118
+ const header = `${PLAN_HEADER_PREFIX}${JSON.stringify({
119
+ schemaVersion: 1,
120
+ slug: request.slug,
121
+ requestId: request.requestId,
122
+ revision: request.revision,
123
+ approved: true,
124
+ status: "active",
125
+ savedAt: new Date().toISOString(),
126
+ ...(request.expiresAt === undefined ? {} : { expiresAt: request.expiresAt }),
127
+ digest: digest(body)
128
+ })}${PLAN_HEADER_SUFFIX}\n`;
129
+ if (Buffer.byteLength(header + body, "utf8") > MAX_PLAN_BYTES)
130
+ return "plan markdown exceeds the durable size bound";
131
+ return "";
132
+ }
133
+ function requestFromRecord(value) {
134
+ const schemaVersion = value.schemaVersion === undefined ? 1 : value.schemaVersion;
135
+ const revision = value.revision === undefined ? 1 : value.revision;
136
+ const requestId = value.requestId === undefined && typeof value.slug === "string" && typeof value.markdown === "string"
137
+ ? `save-${digest(`${value.slug}\u0000${value.markdown}\u0000${String(revision)}`).slice(0, 32)}`
138
+ : value.requestId;
139
+ if (schemaVersion !== 1 ||
140
+ value.approved !== true ||
141
+ typeof value.slug !== "string" ||
142
+ typeof value.markdown !== "string" ||
143
+ typeof requestId !== "string" ||
144
+ typeof revision !== "number" ||
145
+ !Number.isSafeInteger(revision))
146
+ return undefined;
147
+ if (value.expiresAt !== undefined && typeof value.expiresAt !== "string")
148
+ return undefined;
149
+ const request = {
150
+ schemaVersion: 1,
151
+ slug: value.slug,
152
+ markdown: value.markdown,
153
+ approved: true,
154
+ requestId,
155
+ revision,
156
+ ...(value.expiresAt === undefined ? {} : { expiresAt: value.expiresAt })
157
+ };
158
+ return validateRequest(request) === "" ? request : undefined;
159
+ }
160
+ export function parsePlanSaveArgument(argumentsText) {
161
+ if (typeof argumentsText !== "string" || Buffer.byteLength(argumentsText, "utf8") > MAX_ARGUMENT_BYTES)
162
+ return undefined;
163
+ const match = /^save-plan\s+([\s\S]+)$/u.exec(argumentsText.trim());
164
+ if (match === null)
165
+ return undefined;
166
+ try {
167
+ const value = JSON.parse(match[1]);
168
+ return isRecord(value) ? requestFromRecord(value) : undefined;
169
+ }
170
+ catch {
171
+ return undefined;
172
+ }
173
+ }
174
+ function metadataFromRequest(request, body) {
175
+ return {
176
+ schemaVersion: 1,
177
+ slug: request.slug,
178
+ requestId: request.requestId,
179
+ revision: request.revision,
180
+ approved: true,
181
+ status: "active",
182
+ savedAt: new Date().toISOString(),
183
+ ...(request.expiresAt === undefined ? {} : { expiresAt: request.expiresAt }),
184
+ digest: digest(body)
185
+ };
186
+ }
187
+ function serializePlan(metadata, body) {
188
+ return Buffer.from(`${PLAN_HEADER_PREFIX}${JSON.stringify(metadata)}${PLAN_HEADER_SUFFIX}\n${body}`, "utf8");
189
+ }
190
+ function validMetadata(value, slug, body) {
191
+ if (!isRecord(value))
192
+ return false;
193
+ if (value.schemaVersion !== 1 ||
194
+ value.slug !== slug ||
195
+ typeof value.requestId !== "string" ||
196
+ !SAFE_REQUEST_ID.test(value.requestId) ||
197
+ typeof value.revision !== "number" ||
198
+ !Number.isSafeInteger(value.revision) ||
199
+ value.revision < 1 ||
200
+ value.approved !== true ||
201
+ value.status !== "active" ||
202
+ !validSavedAt(value.savedAt) ||
203
+ (value.expiresAt !== undefined && !validExpiry(value.expiresAt)) ||
204
+ typeof value.digest !== "string" ||
205
+ !SHA256.test(value.digest) ||
206
+ value.digest !== digest(body))
207
+ return false;
208
+ return true;
209
+ }
210
+ function parseStoredPlan(text, slug) {
211
+ const newline = text.indexOf("\n");
212
+ if (newline < 0)
213
+ return undefined;
214
+ const header = text.slice(0, newline);
215
+ if (!header.startsWith(PLAN_HEADER_PREFIX) || !header.endsWith(PLAN_HEADER_SUFFIX))
216
+ return undefined;
217
+ let metadata;
218
+ try {
219
+ metadata = JSON.parse(header.slice(PLAN_HEADER_PREFIX.length, -PLAN_HEADER_SUFFIX.length));
220
+ }
221
+ catch {
222
+ return undefined;
223
+ }
224
+ const body = text.slice(newline + 1);
225
+ if (body.trim() === "" || !validMetadata(metadata, slug, body))
226
+ return undefined;
227
+ return { metadata, text: body };
228
+ }
229
+ async function readStoredPlan(filePath, slug) {
230
+ let stat;
231
+ try {
232
+ stat = await fs.lstat(filePath);
233
+ }
234
+ catch (error) {
235
+ if (hasErrorCode(error, "ENOENT"))
236
+ return undefined;
237
+ throw error;
238
+ }
239
+ if (!stat.isFile() || stat.isSymbolicLink() || stat.size === 0 || stat.size > MAX_PLAN_BYTES)
240
+ return undefined;
241
+ try {
242
+ return parseStoredPlan(await fs.readFile(filePath, "utf8"), slug);
243
+ }
244
+ catch (error) {
245
+ if (hasErrorCode(error, "ENOENT"))
246
+ return undefined;
247
+ throw error;
248
+ }
249
+ }
250
+ function toDurablePlan(directory, name, stored) {
251
+ return {
252
+ relativePath: path.join(PLAN_DIRECTORY, name),
253
+ absolutePath: path.join(directory, name),
254
+ text: stored.text,
255
+ requestId: stored.metadata.requestId,
256
+ revision: stored.metadata.revision,
257
+ ...(stored.metadata.expiresAt === undefined ? {} : { expiresAt: stored.metadata.expiresAt })
258
+ };
259
+ }
260
+ export async function persistApprovedPlan(projectRoot, request) {
261
+ const validationError = validateRequest(request);
262
+ if (validationError !== "")
263
+ throw new Error(validationError);
264
+ const body = normalizeMarkdown(request.markdown);
265
+ const directory = path.join(projectRoot, PLAN_DIRECTORY);
266
+ const name = `${request.slug}.md`;
267
+ const absolutePath = path.join(directory, name);
268
+ const lockPath = `${absolutePath}.lock`;
269
+ await fs.mkdir(directory, { recursive: true, mode: 0o700 });
270
+ const releaseLock = await acquirePlanLock(lockPath);
271
+ try {
272
+ const existing = await readStoredPlan(absolutePath, request.slug);
273
+ if (existing !== undefined) {
274
+ if (existing.metadata.requestId === request.requestId) {
275
+ if (existing.metadata.revision === request.revision && existing.metadata.digest === digest(body)) {
276
+ return { ...toDurablePlan(directory, name, existing), replayed: true };
277
+ }
278
+ throw new Error("repeated plan request conflicts with the existing durable plan");
279
+ }
280
+ if (request.revision <= existing.metadata.revision)
281
+ throw new Error("stale plan revision");
282
+ }
283
+ else {
284
+ try {
285
+ await fs.lstat(absolutePath);
286
+ throw new Error("plan target exists but is not a valid approved durable plan");
287
+ }
288
+ catch (error) {
289
+ if (!hasErrorCode(error, "ENOENT"))
290
+ throw error;
291
+ }
292
+ }
293
+ const metadata = metadataFromRequest(request, body);
294
+ const encoded = serializePlan(metadata, body);
295
+ if (encoded.byteLength > MAX_PLAN_BYTES)
296
+ throw new Error("plan markdown exceeds the durable size bound");
297
+ const staging = `${absolutePath}.${process.pid}.${randomUUID()}.tmp`;
298
+ try {
299
+ await fs.writeFile(staging, encoded, { flag: "wx", mode: 0o600 });
300
+ await fs.rename(staging, absolutePath);
301
+ }
302
+ finally {
303
+ await fs.rm(staging, { force: true });
304
+ }
305
+ return { ...toDurablePlan(directory, name, { metadata, text: body }), replayed: false };
306
+ }
307
+ finally {
308
+ await releaseLock();
309
+ }
310
+ }
311
+ export async function resolveLatestDurablePlan(projectRoot) {
312
+ const directory = path.join(projectRoot, PLAN_DIRECTORY);
313
+ let names;
314
+ try {
315
+ names = await fs.readdir(directory);
316
+ }
317
+ catch (error) {
318
+ if (hasErrorCode(error, "ENOENT"))
319
+ return undefined;
320
+ throw error;
321
+ }
322
+ const candidates = [];
323
+ for (const name of names) {
324
+ if (!name.endsWith(".md") || !isSafeSlug(name.slice(0, -3)))
325
+ continue;
326
+ const absolutePath = path.join(directory, name);
327
+ try {
328
+ const stored = await readStoredPlan(absolutePath, name.slice(0, -3));
329
+ if (stored === undefined)
330
+ continue;
331
+ candidates.push({
332
+ plan: toDurablePlan(directory, name, stored),
333
+ savedAt: Date.parse(stored.metadata.savedAt)
334
+ });
335
+ }
336
+ catch {
337
+ continue;
338
+ }
339
+ }
340
+ candidates.sort((left, right) => right.savedAt - left.savedAt || right.plan.revision - left.plan.revision || left.plan.relativePath.localeCompare(right.plan.relativePath));
341
+ return candidates[0]?.plan;
342
+ }
343
+ export function formatResolvedPlanNotice(plan) {
344
+ return `Durable plan: ${plan.relativePath}. Discovery only. This does not grant start-work authority.\n\n<durable-plan>\n${plan.text}</durable-plan>`;
345
+ }
346
+ export function formatSavedPlanNotice(plan, replayed) {
347
+ const verb = replayed ? "Durable plan already persisted" : "Saved durable plan";
348
+ return `${verb}: ${plan.relativePath}. Discovery only. This does not grant start-work authority.`;
349
+ }