@runweave/server-linux-x64 0.1.8 → 0.1.10

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 (357) hide show
  1. package/manifest.json +1494 -161
  2. package/native.tar.gz +0 -0
  3. package/package.json +1 -1
  4. package/payload/.agents/plugins/marketplace.json +20 -0
  5. package/payload/app-server/build-info.json +4 -4
  6. package/payload/app-server/index.cjs +6 -2
  7. package/payload/app-server/index.cjs.map +1 -1
  8. package/payload/backend/activity-sqlite-worker.cjs +2 -0
  9. package/payload/backend/build-info.json +4 -4
  10. package/payload/backend/dev-resources/control.cjs +5 -1
  11. package/payload/backend/index.cjs +466 -295
  12. package/payload/backend/ios-simulators/pool.py +3 -3
  13. package/payload/backend/scheduled-tasks-sqlite-worker.cjs +2 -0
  14. package/payload/frontend/dist/assets/{_baseUniq-vo4uuhMd.js → _baseUniq--CWv8e7O.js} +1 -1
  15. package/payload/frontend/dist/assets/{access-_jCu7Rgu.js → access-BCF23Qto.js} +1 -1
  16. package/payload/frontend/dist/assets/{advanced-CqOhObYj.js → advanced-D8viCLue.js} +1 -1
  17. package/payload/frontend/dist/assets/{appearance-CrrD5gzC.js → appearance-wPVMx-tB.js} +1 -1
  18. package/payload/frontend/dist/assets/{arc-dbfyHSF0.js → arc-BXffHD7A.js} +1 -1
  19. package/payload/frontend/dist/assets/{architectureDiagram-Q4EWVU46-CntSCAsO.js → architectureDiagram-Q4EWVU46-BXHN9QCj.js} +1 -1
  20. package/payload/frontend/dist/assets/{blockDiagram-DXYQGD6D-Chp0D4qy.js → blockDiagram-DXYQGD6D-DoZjab_0.js} +1 -1
  21. package/payload/frontend/dist/assets/{c4Diagram-AHTNJAMY-CF91pOuW.js → c4Diagram-AHTNJAMY-Ds2E62Z8.js} +1 -1
  22. package/payload/frontend/dist/assets/channel-83CTXkVl.js +1 -0
  23. package/payload/frontend/dist/assets/{chunk-4BX2VUAB-B1gxlVu2.js → chunk-4BX2VUAB-Dk1H2-5_.js} +1 -1
  24. package/payload/frontend/dist/assets/{chunk-4TB4RGXK-Cxt3mj9b.js → chunk-4TB4RGXK-Sg0gzSvg.js} +1 -1
  25. package/payload/frontend/dist/assets/{chunk-55IACEB6-BJT6qNik.js → chunk-55IACEB6-Du_EJG4S.js} +1 -1
  26. package/payload/frontend/dist/assets/{chunk-EDXVE4YY-yI59bCa0.js → chunk-EDXVE4YY-BM1Cs5dU.js} +1 -1
  27. package/payload/frontend/dist/assets/{chunk-FMBD7UC4-CDvncKKJ.js → chunk-FMBD7UC4-BM9thfyY.js} +1 -1
  28. package/payload/frontend/dist/assets/{chunk-OYMX7WX6-BblOIU57.js → chunk-OYMX7WX6-C9Bvn4fo.js} +1 -1
  29. package/payload/frontend/dist/assets/{chunk-QZHKN3VN-rODzNdO0.js → chunk-QZHKN3VN-CaakbFhJ.js} +1 -1
  30. package/payload/frontend/dist/assets/{chunk-YZCP3GAM-B6D4wQwk.js → chunk-YZCP3GAM-DkVNrd40.js} +1 -1
  31. package/payload/frontend/dist/assets/classDiagram-6PBFFD2Q-oR8IYJwC.js +1 -0
  32. package/payload/frontend/dist/assets/classDiagram-v2-HSJHXN6E-oR8IYJwC.js +1 -0
  33. package/payload/frontend/dist/assets/clone-BIDF-bd9.js +1 -0
  34. package/payload/frontend/dist/assets/connection-DIdF_3aa.js +12 -0
  35. package/payload/frontend/dist/assets/{connections-DqDmxS-O.js → connections-DBYC8SFl.js} +1 -1
  36. package/payload/frontend/dist/assets/{cose-bilkent-S5V4N54A-BvwVWp29.js → cose-bilkent-S5V4N54A-B4-fwllY.js} +1 -1
  37. package/payload/frontend/dist/assets/{dagre-KV5264BT-h_K1TH11.js → dagre-KV5264BT-Byu4wqLk.js} +1 -1
  38. package/payload/frontend/dist/assets/{desktop-BQ3kGtKG.js → desktop-aESkh0HL.js} +1 -1
  39. package/payload/frontend/dist/assets/{diagram-5BDNPKRD-B8g2SV6L.js → diagram-5BDNPKRD-DJW8DuCX.js} +1 -1
  40. package/payload/frontend/dist/assets/{diagram-G4DWMVQ6-BOEnrqYm.js → diagram-G4DWMVQ6-DTBvds5J.js} +1 -1
  41. package/payload/frontend/dist/assets/{diagram-MMDJMWI5-DlaN_z71.js → diagram-MMDJMWI5-D42e4xzm.js} +1 -1
  42. package/payload/frontend/dist/assets/{diagram-TYMM5635-C_pSKftn.js → diagram-TYMM5635-BjV43-C_.js} +1 -1
  43. package/payload/frontend/dist/assets/{erDiagram-SMLLAGMA-C2dL-h3I.js → erDiagram-SMLLAGMA-DE47Ibp_.js} +1 -1
  44. package/payload/frontend/dist/assets/{flowDiagram-DWJPFMVM-BmXhKWFj.js → flowDiagram-DWJPFMVM-CjGBlzS4.js} +1 -1
  45. package/payload/frontend/dist/assets/{ganttDiagram-T4ZO3ILL-D_Odnssf.js → ganttDiagram-T4ZO3ILL-vfj40KZi.js} +1 -1
  46. package/payload/frontend/dist/assets/{gitGraphDiagram-UUTBAWPF-DcQdcwKZ.js → gitGraphDiagram-UUTBAWPF-DT5xfRNb.js} +1 -1
  47. package/payload/frontend/dist/assets/{graph-C_XsxefA.js → graph-D-AF6yQT.js} +1 -1
  48. package/payload/frontend/dist/assets/{image-D3hgVr8O.js → image-D9gtSsD9.js} +1 -1
  49. package/payload/frontend/dist/assets/{index-CEUsFFQq.js → index-BPVP2P-2.js} +95 -105
  50. package/payload/frontend/dist/assets/{infoDiagram-42DDH7IO-C6TnRyMi.js → infoDiagram-42DDH7IO-C7ew_uLJ.js} +1 -1
  51. package/payload/frontend/dist/assets/{ishikawaDiagram-UXIWVN3A-BL7rfALJ.js → ishikawaDiagram-UXIWVN3A-B6-YebU9.js} +1 -1
  52. package/payload/frontend/dist/assets/{journeyDiagram-VCZTEJTY-C_6407GW.js → journeyDiagram-VCZTEJTY-BOFgJDA5.js} +1 -1
  53. package/payload/frontend/dist/assets/{kanban-definition-6JOO6SKY-CK61Fd0p.js → kanban-definition-6JOO6SKY-jh06wZYz.js} +1 -1
  54. package/payload/frontend/dist/assets/{layout-DVn6JKbl.js → layout-B4p7V5fB.js} +1 -1
  55. package/payload/frontend/dist/assets/{linear-DyWskq8H.js → linear-D2JWfvdc.js} +1 -1
  56. package/payload/frontend/dist/assets/main-CuRgiPQf.js +706 -0
  57. package/payload/frontend/dist/assets/main-D4_uoZQa.css +33 -0
  58. package/payload/frontend/dist/assets/{min-apbLpSJ3.js → min--jD4Arnm.js} +1 -1
  59. package/payload/frontend/dist/assets/{mindmap-definition-QFDTVHPH-MVHZZbma.js → mindmap-definition-QFDTVHPH-DmzjmSuf.js} +1 -1
  60. package/payload/frontend/dist/assets/{monitoring-BApsVez_.js → monitoring-Tvvk6TfB.js} +1 -1
  61. package/payload/frontend/dist/assets/{notifications-CjxSNLU1.js → notifications-CqP2AQrW.js} +1 -1
  62. package/payload/frontend/dist/assets/{pieDiagram-DEJITSTG-Dhbb0AYU.js → pieDiagram-DEJITSTG-B79qIVe5.js} +1 -1
  63. package/payload/frontend/dist/assets/{quadrantDiagram-34T5L4WZ-Yk6LOF0S.js → quadrantDiagram-34T5L4WZ-DIOj1DhE.js} +1 -1
  64. package/payload/frontend/dist/assets/{record-content-BCJ80KS5.js → record-content-CzGGCbNs.js} +1 -1
  65. package/payload/frontend/dist/assets/{requirementDiagram-MS252O5E-BUhS0PEq.js → requirementDiagram-MS252O5E-C-n1j3tN.js} +1 -1
  66. package/payload/frontend/dist/assets/{sankeyDiagram-XADWPNL6-D2sdxz14.js → sankeyDiagram-XADWPNL6-BVKqWE6C.js} +1 -1
  67. package/payload/frontend/dist/assets/{sequenceDiagram-FGHM5R23-CRere4Fy.js → sequenceDiagram-FGHM5R23-B980Icqs.js} +1 -1
  68. package/payload/frontend/dist/assets/{stateDiagram-FHFEXIEX-_pk-OMlm.js → stateDiagram-FHFEXIEX-C-mJHzhL.js} +1 -1
  69. package/payload/frontend/dist/assets/stateDiagram-v2-QKLJ7IA2-B4L4fK9G.js +1 -0
  70. package/payload/frontend/dist/assets/{status-Dk5rRVQF.js → status-Bv4Czr9-.js} +1 -1
  71. package/payload/frontend/dist/assets/suiji-DyzQqRTE.js +1 -0
  72. package/payload/frontend/dist/assets/{svg-X7YkMMvx.js → svg-C6Aj62ig.js} +1 -1
  73. package/payload/frontend/dist/assets/{tabs-BmKbcPVh.js → tabs-BTUOhdAF.js} +1 -1
  74. package/payload/frontend/dist/assets/{timeline-definition-GMOUNBTQ-BPsI2pMC.js → timeline-definition-GMOUNBTQ-Dr9yRuVq.js} +1 -1
  75. package/payload/frontend/dist/assets/{vennDiagram-DHZGUBPP-BNJkZ1Az.js → vennDiagram-DHZGUBPP-B0Xsg1-Z.js} +1 -1
  76. package/payload/frontend/dist/assets/{wardley-RL74JXVD-CVcYeATS.js → wardley-RL74JXVD-BjIKKaA_.js} +1 -1
  77. package/payload/frontend/dist/assets/{wardleyDiagram-NUSXRM2D-BpLJ0alk.js → wardleyDiagram-NUSXRM2D-DMJ7MEA9.js} +1 -1
  78. package/payload/frontend/dist/assets/{xychartDiagram-5P7HB3ND-BdsYYk4M.js → xychartDiagram-5P7HB3ND-2tvgfdab.js} +1 -1
  79. package/payload/frontend/dist/build-info.json +4 -4
  80. package/payload/frontend/dist/companion.html +1 -1
  81. package/payload/frontend/dist/index.html +3 -3
  82. package/payload/packages/agent-bridge/src/install-pi.mjs +81 -0
  83. package/payload/plugins/pi/dist/SKILL.md +22 -0
  84. package/payload/plugins/pi/dist/bridge/app-server-client.cjs +82 -0
  85. package/payload/plugins/pi/dist/bridge/feishu_stop_notify.sh +169 -0
  86. package/payload/plugins/pi/dist/bridge/runweave-hook-bridge.cjs +583 -0
  87. package/payload/plugins/pi/dist/bridge/runweave-hook-completion.cjs +42 -0
  88. package/payload/plugins/pi/dist/bridge/runweave-hook-payload.cjs +578 -0
  89. package/payload/plugins/pi/dist/bridge/runweave-task-supervision.cjs +167 -0
  90. package/payload/plugins/pi/dist/runweave.js +316 -0
  91. package/payload/plugins/toolkit/.codex-plugin/plugin.json +31 -0
  92. package/payload/plugins/toolkit/README.md +185 -0
  93. package/payload/plugins/toolkit/hooks/AGENTS.md +6 -0
  94. package/payload/plugins/toolkit/hooks/app-server-client.cjs +82 -0
  95. package/payload/plugins/toolkit/hooks/feishu_stop_notify.sh +169 -0
  96. package/payload/plugins/toolkit/hooks/runweave-hook-bridge.cjs +583 -0
  97. package/payload/plugins/toolkit/hooks/runweave-hook-completion.cjs +42 -0
  98. package/payload/plugins/toolkit/hooks/runweave-hook-dispatch.cjs +123 -0
  99. package/payload/plugins/toolkit/hooks/runweave-hook-payload.cjs +578 -0
  100. package/payload/plugins/toolkit/hooks/runweave-task-supervision.cjs +167 -0
  101. package/payload/plugins/toolkit/hooks.json +108 -0
  102. package/payload/plugins/toolkit/skills/acceptance/SKILL.md +70 -0
  103. package/payload/plugins/toolkit/skills/acceptance/agents/openai.yaml +4 -0
  104. package/payload/plugins/toolkit/skills/acceptance/references/capture.md +38 -0
  105. package/payload/plugins/toolkit/skills/acceptance/references/delivery.md +54 -0
  106. package/payload/plugins/toolkit/skills/acceptance/references/gallery-contract.md +84 -0
  107. package/payload/plugins/toolkit/skills/acceptance/references/gallery-copy.md +34 -0
  108. package/payload/plugins/toolkit/skills/acceptance/references/video.md +52 -0
  109. package/payload/plugins/toolkit/skills/acceptance/scripts/capture.py +137 -0
  110. package/payload/plugins/toolkit/skills/acceptance/scripts/common.py +63 -0
  111. package/payload/plugins/toolkit/skills/acceptance/scripts/gallery.py +353 -0
  112. package/payload/plugins/toolkit/skills/acceptance/scripts/preview.py +109 -0
  113. package/payload/plugins/toolkit/skills/acceptance/scripts/video.py +283 -0
  114. package/payload/plugins/toolkit/skills/acceptance/templates/reader.css +576 -0
  115. package/payload/plugins/toolkit/skills/acceptance/templates/reader.html +63 -0
  116. package/payload/plugins/toolkit/skills/acceptance/templates/reader.js +326 -0
  117. package/payload/plugins/toolkit/skills/acceptance/templates/viewer.css +55 -0
  118. package/payload/plugins/toolkit/skills/acceptance-gallery/SKILL.md +8 -0
  119. package/payload/plugins/toolkit/skills/acceptance-gallery/agents/openai.yaml +6 -0
  120. package/payload/plugins/toolkit/skills/acceptance-gallery/references/capture-and-copy.md +3 -0
  121. package/payload/plugins/toolkit/skills/acceptance-gallery/references/content-contract.md +3 -0
  122. package/payload/plugins/toolkit/skills/acceptance-gallery/scripts/gallery.py +9 -0
  123. package/payload/plugins/toolkit/skills/acceptance-video/SKILL.md +8 -0
  124. package/payload/plugins/toolkit/skills/acceptance-video/agents/openai.yaml +6 -0
  125. package/payload/plugins/toolkit/skills/acceptance-video/references/input-and-capture.md +3 -0
  126. package/payload/plugins/toolkit/skills/acceptance-video/references/mobile-review.md +3 -0
  127. package/payload/plugins/toolkit/skills/acceptance-video/scripts/capture.py +9 -0
  128. package/payload/plugins/toolkit/skills/acceptance-video/scripts/video.py +9 -0
  129. package/payload/plugins/toolkit/skills/agent-device/SKILL.md +86 -0
  130. package/payload/plugins/toolkit/skills/agent-device/agents/openai.yaml +4 -0
  131. package/payload/plugins/toolkit/skills/agent-device/references/ios-setup.md +36 -0
  132. package/payload/plugins/toolkit/skills/agent-device/scripts/device.py +398 -0
  133. package/payload/plugins/toolkit/skills/agent-device/scripts/resources.py +248 -0
  134. package/payload/plugins/toolkit/skills/architecture-flow-prototyping/SKILL.md +128 -0
  135. package/payload/plugins/toolkit/skills/architecture-flow-prototyping/agents/openai.yaml +4 -0
  136. package/payload/plugins/toolkit/skills/architecture-flow-prototyping/references/architecture-flow-checklist.md +59 -0
  137. package/payload/plugins/toolkit/skills/architecture-flow-prototyping/references/architecture-flow-guide.md +135 -0
  138. package/payload/plugins/toolkit/skills/architecture-flow-prototyping/references/architecture-flow-handoff-template.md +57 -0
  139. package/payload/plugins/toolkit/skills/ask-first/SKILL.md +81 -0
  140. package/payload/plugins/toolkit/skills/brainstorming/SKILL.md +41 -0
  141. package/payload/plugins/toolkit/skills/browse-record/SKILL.md +35 -0
  142. package/payload/plugins/toolkit/skills/browse-record/references/app-usage.md +19 -0
  143. package/payload/plugins/toolkit/skills/browse-record/references/daily-reporting.md +115 -0
  144. package/payload/plugins/toolkit/skills/browse-record/references/zhihu.md +33 -0
  145. package/payload/plugins/toolkit/skills/browse-record/scripts/app_usage.py +110 -0
  146. package/payload/plugins/toolkit/skills/browse-record/scripts/browse_job.py +385 -0
  147. package/payload/plugins/toolkit/skills/browse-record/scripts/zhihu-read.js +126 -0
  148. package/payload/plugins/toolkit/skills/browse-record/scripts/zhihu_http.py +273 -0
  149. package/payload/plugins/toolkit/skills/clear-technical-explanations/LICENSE +21 -0
  150. package/payload/plugins/toolkit/skills/clear-technical-explanations/SKILL.md +103 -0
  151. package/payload/plugins/toolkit/skills/code-grounded-requirements/SKILL.md +54 -0
  152. package/payload/plugins/toolkit/skills/daily-doc-maintenance/SKILL.md +151 -0
  153. package/payload/plugins/toolkit/skills/daily-record/SKILL.md +63 -0
  154. package/payload/plugins/toolkit/skills/daily-record/agents/openai.yaml +4 -0
  155. package/payload/plugins/toolkit/skills/daily-record/references/browser-history.md +6 -0
  156. package/payload/plugins/toolkit/skills/daily-record/references/feishu.md +90 -0
  157. package/payload/plugins/toolkit/skills/daily-record/references/scheduled-reporting.md +144 -0
  158. package/payload/plugins/toolkit/skills/daily-record/references/scheduled-task.template.json +15 -0
  159. package/payload/plugins/toolkit/skills/daily-record/references/suiji-work-records.md +57 -0
  160. package/payload/plugins/toolkit/skills/daily-record/scripts/feishu.py +280 -0
  161. package/payload/plugins/toolkit/skills/daily-record/scripts/job.py +416 -0
  162. package/payload/plugins/toolkit/skills/daily-record/scripts/job_browser.py +77 -0
  163. package/payload/plugins/toolkit/skills/daily-record/scripts/job_facts.py +132 -0
  164. package/payload/plugins/toolkit/skills/daily-record/scripts/job_isolation.py +69 -0
  165. package/payload/plugins/toolkit/skills/daily-record/scripts/job_materials.py +154 -0
  166. package/payload/plugins/toolkit/skills/daily-record/scripts/job_screen.py +77 -0
  167. package/payload/plugins/toolkit/skills/daily-record/scripts/job_state.py +309 -0
  168. package/payload/plugins/toolkit/skills/daily-refactor/SKILL.md +101 -0
  169. package/payload/plugins/toolkit/skills/daily-refactor/scripts/compare-architecture-reports.mjs +168 -0
  170. package/payload/plugins/toolkit/skills/debugging-strategies/SKILL.md +38 -0
  171. package/payload/plugins/toolkit/skills/debugging-strategies/resources/implementation-playbook.md +520 -0
  172. package/payload/plugins/toolkit/skills/diagnostic-log-debugging/SKILL.md +79 -0
  173. package/payload/plugins/toolkit/skills/doc-coauthoring/SKILL.md +64 -0
  174. package/payload/plugins/toolkit/skills/eli5/LICENSE +21 -0
  175. package/payload/plugins/toolkit/skills/eli5/SKILL.md +18 -0
  176. package/payload/plugins/toolkit/skills/experience/SKILL.md +71 -0
  177. package/payload/plugins/toolkit/skills/experience/package.json +13 -0
  178. package/payload/plugins/toolkit/skills/git-advanced-workflows/SKILL.md +457 -0
  179. package/payload/plugins/toolkit/skills/github-pr/SKILL.md +109 -0
  180. package/payload/plugins/toolkit/skills/github-pr/scripts/github-access.mjs +292 -0
  181. package/payload/plugins/toolkit/skills/github-pr/scripts/preflight.mjs +191 -0
  182. package/payload/plugins/toolkit/skills/github-pr/scripts/source-worktree.mjs +354 -0
  183. package/payload/plugins/toolkit/skills/grill-with-docs/SKILL.md +66 -0
  184. package/payload/plugins/toolkit/skills/grill-with-docs/agents/openai.yaml +6 -0
  185. package/payload/plugins/toolkit/skills/grilling/SKILL.md +14 -0
  186. package/payload/plugins/toolkit/skills/handoff/SKILL.md +98 -0
  187. package/payload/plugins/toolkit/skills/karpathy-guidelines/SKILL.md +73 -0
  188. package/payload/plugins/toolkit/skills/playwright-cli/SKILL.md +562 -0
  189. package/payload/plugins/toolkit/skills/playwright-cli/references/element-attributes.md +23 -0
  190. package/payload/plugins/toolkit/skills/playwright-cli/references/playwright-tests.md +39 -0
  191. package/payload/plugins/toolkit/skills/playwright-cli/references/request-mocking.md +87 -0
  192. package/payload/plugins/toolkit/skills/playwright-cli/references/running-code.md +240 -0
  193. package/payload/plugins/toolkit/skills/playwright-cli/references/session-management.md +226 -0
  194. package/payload/plugins/toolkit/skills/playwright-cli/references/spec-driven-testing.md +312 -0
  195. package/payload/plugins/toolkit/skills/playwright-cli/references/storage-state.md +275 -0
  196. package/payload/plugins/toolkit/skills/playwright-cli/references/test-generation.md +138 -0
  197. package/payload/plugins/toolkit/skills/playwright-cli/references/tracing.md +142 -0
  198. package/payload/plugins/toolkit/skills/playwright-cli/references/video-recording.md +157 -0
  199. package/payload/plugins/toolkit/skills/playwright-cli/templates/standalone.config.json +7 -0
  200. package/payload/plugins/toolkit/skills/product-exploration/SKILL.md +64 -0
  201. package/payload/plugins/toolkit/skills/product-exploration/agents/openai.yaml +5 -0
  202. package/payload/plugins/toolkit/skills/prototype-first-development/SKILL.md +134 -0
  203. package/payload/plugins/toolkit/skills/prototype-first-development/references/html-prototype-template/README.md +88 -0
  204. package/payload/plugins/toolkit/skills/prototype-first-development/references/html-prototype-template/app.js +145 -0
  205. package/payload/plugins/toolkit/skills/prototype-first-development/references/html-prototype-template/index.html +229 -0
  206. package/payload/plugins/toolkit/skills/prototype-first-development/references/html-prototype-template/mock-state.json +60 -0
  207. package/payload/plugins/toolkit/skills/prototype-first-development/references/implementation-plan-handoff-template.md +61 -0
  208. package/payload/plugins/toolkit/skills/prototype-first-development/references/prototype-workflow-checklist.md +64 -0
  209. package/payload/plugins/toolkit/skills/publish-runweave-server/SKILL.md +69 -0
  210. package/payload/plugins/toolkit/skills/publish-runweave-server/agents/openai.yaml +4 -0
  211. package/payload/plugins/toolkit/skills/react-best-practices/AGENTS.md +3227 -0
  212. package/payload/plugins/toolkit/skills/react-best-practices/README.md +127 -0
  213. package/payload/plugins/toolkit/skills/react-best-practices/SKILL.md +143 -0
  214. package/payload/plugins/toolkit/skills/react-best-practices/metadata.json +15 -0
  215. package/payload/plugins/toolkit/skills/react-best-practices/rules/advanced/event-handler-refs.md +55 -0
  216. package/payload/plugins/toolkit/skills/react-best-practices/rules/advanced/init-once.md +42 -0
  217. package/payload/plugins/toolkit/skills/react-best-practices/rules/advanced/use-latest.md +39 -0
  218. package/payload/plugins/toolkit/skills/react-best-practices/rules/async/api-routes.md +38 -0
  219. package/payload/plugins/toolkit/skills/react-best-practices/rules/async/defer-await.md +80 -0
  220. package/payload/plugins/toolkit/skills/react-best-practices/rules/async/dependencies.md +52 -0
  221. package/payload/plugins/toolkit/skills/react-best-practices/rules/async/parallel.md +28 -0
  222. package/payload/plugins/toolkit/skills/react-best-practices/rules/async/suspense-boundaries.md +99 -0
  223. package/payload/plugins/toolkit/skills/react-best-practices/rules/bundle/barrel-imports.md +59 -0
  224. package/payload/plugins/toolkit/skills/react-best-practices/rules/bundle/conditional.md +37 -0
  225. package/payload/plugins/toolkit/skills/react-best-practices/rules/bundle/defer-third-party.md +49 -0
  226. package/payload/plugins/toolkit/skills/react-best-practices/rules/bundle/dynamic-imports.md +35 -0
  227. package/payload/plugins/toolkit/skills/react-best-practices/rules/bundle/preload.md +46 -0
  228. package/payload/plugins/toolkit/skills/react-best-practices/rules/client/event-listeners.md +78 -0
  229. package/payload/plugins/toolkit/skills/react-best-practices/rules/client/localstorage-schema.md +77 -0
  230. package/payload/plugins/toolkit/skills/react-best-practices/rules/client/passive-event-listeners.md +48 -0
  231. package/payload/plugins/toolkit/skills/react-best-practices/rules/client/swr-dedup.md +56 -0
  232. package/payload/plugins/toolkit/skills/react-best-practices/rules/js/batch-dom-css.md +110 -0
  233. package/payload/plugins/toolkit/skills/react-best-practices/rules/js/cache-function-results.md +80 -0
  234. package/payload/plugins/toolkit/skills/react-best-practices/rules/js/cache-property-access.md +28 -0
  235. package/payload/plugins/toolkit/skills/react-best-practices/rules/js/cache-storage.md +70 -0
  236. package/payload/plugins/toolkit/skills/react-best-practices/rules/js/combine-iterations.md +32 -0
  237. package/payload/plugins/toolkit/skills/react-best-practices/rules/js/early-exit.md +50 -0
  238. package/payload/plugins/toolkit/skills/react-best-practices/rules/js/flatmap-filter.md +55 -0
  239. package/payload/plugins/toolkit/skills/react-best-practices/rules/js/hoist-regexp.md +45 -0
  240. package/payload/plugins/toolkit/skills/react-best-practices/rules/js/index-maps.md +37 -0
  241. package/payload/plugins/toolkit/skills/react-best-practices/rules/js/length-check-first.md +50 -0
  242. package/payload/plugins/toolkit/skills/react-best-practices/rules/js/min-max-loop.md +82 -0
  243. package/payload/plugins/toolkit/skills/react-best-practices/rules/js/set-map-lookups.md +24 -0
  244. package/payload/plugins/toolkit/skills/react-best-practices/rules/js/tosorted-immutable.md +57 -0
  245. package/payload/plugins/toolkit/skills/react-best-practices/rules/meta/sections.md +46 -0
  246. package/payload/plugins/toolkit/skills/react-best-practices/rules/meta/template.md +28 -0
  247. package/payload/plugins/toolkit/skills/react-best-practices/rules/rendering/activity.md +26 -0
  248. package/payload/plugins/toolkit/skills/react-best-practices/rules/rendering/animate-svg-wrapper.md +38 -0
  249. package/payload/plugins/toolkit/skills/react-best-practices/rules/rendering/conditional-render.md +32 -0
  250. package/payload/plugins/toolkit/skills/react-best-practices/rules/rendering/content-visibility.md +38 -0
  251. package/payload/plugins/toolkit/skills/react-best-practices/rules/rendering/hoist-jsx.md +36 -0
  252. package/payload/plugins/toolkit/skills/react-best-practices/rules/rendering/hydration-no-flicker.md +72 -0
  253. package/payload/plugins/toolkit/skills/react-best-practices/rules/rendering/hydration-suppress-warning.md +26 -0
  254. package/payload/plugins/toolkit/skills/react-best-practices/rules/rendering/resource-hints.md +89 -0
  255. package/payload/plugins/toolkit/skills/react-best-practices/rules/rendering/script-defer-async.md +71 -0
  256. package/payload/plugins/toolkit/skills/react-best-practices/rules/rendering/svg-precision.md +28 -0
  257. package/payload/plugins/toolkit/skills/react-best-practices/rules/rendering/usetransition-loading.md +75 -0
  258. package/payload/plugins/toolkit/skills/react-best-practices/rules/rerender/defer-reads.md +39 -0
  259. package/payload/plugins/toolkit/skills/react-best-practices/rules/rerender/dependencies.md +45 -0
  260. package/payload/plugins/toolkit/skills/react-best-practices/rules/rerender/derived-state-no-effect.md +40 -0
  261. package/payload/plugins/toolkit/skills/react-best-practices/rules/rerender/derived-state.md +29 -0
  262. package/payload/plugins/toolkit/skills/react-best-practices/rules/rerender/functional-setstate.md +77 -0
  263. package/payload/plugins/toolkit/skills/react-best-practices/rules/rerender/lazy-state-init.md +58 -0
  264. package/payload/plugins/toolkit/skills/react-best-practices/rules/rerender/memo-with-default-value.md +36 -0
  265. package/payload/plugins/toolkit/skills/react-best-practices/rules/rerender/memo.md +44 -0
  266. package/payload/plugins/toolkit/skills/react-best-practices/rules/rerender/move-effect-to-event.md +45 -0
  267. package/payload/plugins/toolkit/skills/react-best-practices/rules/rerender/no-inline-components.md +83 -0
  268. package/payload/plugins/toolkit/skills/react-best-practices/rules/rerender/simple-expression-in-memo.md +35 -0
  269. package/payload/plugins/toolkit/skills/react-best-practices/rules/rerender/transitions.md +40 -0
  270. package/payload/plugins/toolkit/skills/react-best-practices/rules/rerender/use-ref-transient-values.md +73 -0
  271. package/payload/plugins/toolkit/skills/react-best-practices/rules/server/after-nonblocking.md +74 -0
  272. package/payload/plugins/toolkit/skills/react-best-practices/rules/server/auth-actions.md +96 -0
  273. package/payload/plugins/toolkit/skills/react-best-practices/rules/server/cache-lru.md +41 -0
  274. package/payload/plugins/toolkit/skills/react-best-practices/rules/server/cache-react.md +76 -0
  275. package/payload/plugins/toolkit/skills/react-best-practices/rules/server/dedup-props.md +65 -0
  276. package/payload/plugins/toolkit/skills/react-best-practices/rules/server/hoist-static-io.md +139 -0
  277. package/payload/plugins/toolkit/skills/react-best-practices/rules/server/parallel-fetching.md +83 -0
  278. package/payload/plugins/toolkit/skills/react-best-practices/rules/server/serialization.md +38 -0
  279. package/payload/plugins/toolkit/skills/recorded-browser-mcp-verification/SKILL.md +8 -0
  280. package/payload/plugins/toolkit/skills/recorded-browser-mcp-verification/agents/openai.yaml +6 -0
  281. package/payload/plugins/toolkit/skills/reproduce-before-fix/SKILL.md +93 -0
  282. package/payload/plugins/toolkit/skills/reproduce-before-fix/agents/openai.yaml +7 -0
  283. package/payload/plugins/toolkit/skills/review-only/SKILL.md +72 -0
  284. package/payload/plugins/toolkit/skills/review-with-runtime-evidence/SKILL.md +134 -0
  285. package/payload/plugins/toolkit/skills/review-with-runtime-evidence/agents/openai.yaml +7 -0
  286. package/payload/plugins/toolkit/skills/review-with-runtime-evidence/references/contracts.md +114 -0
  287. package/payload/plugins/toolkit/skills/review-with-runtime-evidence/scripts/classify-runtime-verdict.mjs +140 -0
  288. package/payload/plugins/toolkit/skills/review-with-runtime-evidence/scripts/run-static-review.mjs +389 -0
  289. package/payload/plugins/toolkit/skills/review-with-runtime-evidence/scripts/static-review-contract.mjs +243 -0
  290. package/payload/plugins/toolkit/skills/run-test-cases/SKILL.md +63 -0
  291. package/payload/plugins/toolkit/skills/runweave-change-validation/SKILL.md +196 -0
  292. package/payload/plugins/toolkit/skills/runweave-change-validation/agents/openai.yaml +7 -0
  293. package/payload/plugins/toolkit/skills/runweave-change-validation/scripts/assert-dev-session-status.mjs +181 -0
  294. package/payload/plugins/toolkit/skills/runweave-dev-session/SKILL.md +126 -0
  295. package/payload/plugins/toolkit/skills/runweave-dev-session/agents/openai.yaml +7 -0
  296. package/payload/plugins/toolkit/skills/runweave-management/SKILL.md +47 -0
  297. package/payload/plugins/toolkit/skills/scheduled-task/SKILL.md +35 -0
  298. package/payload/plugins/toolkit/skills/shadcn/SKILL.md +245 -0
  299. package/payload/plugins/toolkit/skills/shadcn/agents/openai.yml +5 -0
  300. package/payload/plugins/toolkit/skills/shadcn/assets/shadcn-small.png +0 -0
  301. package/payload/plugins/toolkit/skills/shadcn/assets/shadcn.png +0 -0
  302. package/payload/plugins/toolkit/skills/shadcn/cli.md +276 -0
  303. package/payload/plugins/toolkit/skills/shadcn/customization.md +209 -0
  304. package/payload/plugins/toolkit/skills/shadcn/evals/evals.json +47 -0
  305. package/payload/plugins/toolkit/skills/shadcn/mcp.md +94 -0
  306. package/payload/plugins/toolkit/skills/shadcn/rules/base-vs-radix.md +310 -0
  307. package/payload/plugins/toolkit/skills/shadcn/rules/composition.md +197 -0
  308. package/payload/plugins/toolkit/skills/shadcn/rules/forms.md +198 -0
  309. package/payload/plugins/toolkit/skills/shadcn/rules/icons.md +101 -0
  310. package/payload/plugins/toolkit/skills/shadcn/rules/styling.md +163 -0
  311. package/payload/plugins/toolkit/skills/suiji/SKILL.md +54 -0
  312. package/payload/plugins/toolkit/skills/suiji/references/api.md +72 -0
  313. package/payload/plugins/toolkit/skills/suiji/references/source-adapter.md +40 -0
  314. package/payload/plugins/toolkit/skills/suiji/references/work-records.md +36 -0
  315. package/payload/plugins/toolkit/skills/suiji/scripts/source_adapter.py +46 -0
  316. package/payload/plugins/toolkit/skills/suiji/scripts/suiji.py +358 -0
  317. package/payload/plugins/toolkit/skills/suiji/scripts/work_records.py +328 -0
  318. package/payload/plugins/toolkit/skills/suiji/scripts/work_reports.py +75 -0
  319. package/payload/plugins/toolkit/skills/sync-branch-hard-reset/SKILL.md +59 -0
  320. package/payload/plugins/toolkit/skills/update-runweave-backend/SKILL.md +90 -0
  321. package/payload/plugins/toolkit/skills/update-runweave-backend/agents/openai.yaml +4 -0
  322. package/payload/plugins/toolkit/skills/update-runweave-backend/references/npm-update.md +68 -0
  323. package/payload/plugins/toolkit/skills/update-runweave-backend/references/systemd.md +34 -0
  324. package/payload/plugins/toolkit/skills/update-runweave-desktop/SKILL.md +102 -0
  325. package/payload/plugins/toolkit/skills/update-runweave-ios/SKILL.md +16 -0
  326. package/payload/plugins/toolkit/skills/update-runweave-ios/references/ios-wireless-recovery.md +54 -0
  327. package/payload/plugins/toolkit/skills/using-rw/SKILL.md +265 -0
  328. package/payload/plugins/toolkit/skills/write-plan/SKILL.md +72 -0
  329. package/payload/plugins/toolkit/skills/write-test-cases/SKILL.md +100 -0
  330. package/payload/plugins/toolkit/skills/write-test-cases/assets/test-plan-template.yaml +15 -0
  331. package/payload/plugins/toolkit/skills/write-test-cases/references/coverage-checklist.md +75 -0
  332. package/payload/plugins/toolkit/skills/write-test-cases/references/design-techniques.md +91 -0
  333. package/payload/plugins/toolkit/skills/youtube-reading/SKILL.md +35 -0
  334. package/payload/plugins/toolkit/skills/youtube-reading/agents/openai.yaml +4 -0
  335. package/payload/plugins/toolkit/skills/youtube-reading/assets/runtime-lock.json +92 -0
  336. package/payload/plugins/toolkit/skills/youtube-reading/references/content-contract.md +52 -0
  337. package/payload/plugins/toolkit/skills/youtube-reading/references/setup.md +70 -0
  338. package/payload/plugins/toolkit/skills/youtube-reading/requirements.lock +9 -0
  339. package/payload/plugins/toolkit/skills/youtube-reading/scripts/artifacts.py +206 -0
  340. package/payload/plugins/toolkit/skills/youtube-reading/scripts/runtime.py +424 -0
  341. package/payload/plugins/toolkit/skills/youtube-reading/scripts/youtube_reading.py +314 -0
  342. package/payload/plugins/toolkit-release.json +1 -0
  343. package/payload/pty-host/index.cjs +99 -31
  344. package/payload/scripts/toolkit/codex-state.mjs +75 -0
  345. package/payload/scripts/toolkit/release.mjs +210 -0
  346. package/payload/scripts/toolkit/sync-runtime.mjs +108 -0
  347. package/payload/scripts/toolkit/sync.mjs +585 -0
  348. package/payload/server/index.cjs +5 -1
  349. package/payload/frontend/dist/assets/channel-Bf3IeONI.js +0 -1
  350. package/payload/frontend/dist/assets/classDiagram-6PBFFD2Q-CFsG2SvG.js +0 -1
  351. package/payload/frontend/dist/assets/classDiagram-v2-HSJHXN6E-CFsG2SvG.js +0 -1
  352. package/payload/frontend/dist/assets/clone-CeQXm2YN.js +0 -1
  353. package/payload/frontend/dist/assets/connection-XriXysSc.js +0 -12
  354. package/payload/frontend/dist/assets/main-Cg6Oo1xK.css +0 -33
  355. package/payload/frontend/dist/assets/main-H5R-3_w1.js +0 -696
  356. package/payload/frontend/dist/assets/stateDiagram-v2-QKLJ7IA2-CzpdUl_0.js +0 -1
  357. package/payload/frontend/dist/assets/suiji-CO_L5W1X.js +0 -1
@@ -0,0 +1,389 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { spawn } from "node:child_process";
4
+ import { createHash } from "node:crypto";
5
+ import { chmod, mkdir, readFile, writeFile } from "node:fs/promises";
6
+ import path from "node:path";
7
+ import process from "node:process";
8
+ import {
9
+ aggregateCase,
10
+ buildPrompt,
11
+ OUTPUT_SCHEMA,
12
+ REVIEWERS,
13
+ validateManifest,
14
+ validateReview,
15
+ } from "./static-review-contract.mjs";
16
+
17
+ function usage() {
18
+ return [
19
+ "Usage:",
20
+ " node run-static-review.mjs --manifest=<file> --output=<dir> [--prepare-only] [--timeout-ms=<ms>]",
21
+ "",
22
+ "The manifest contract is documented in references/contracts.md.",
23
+ ].join("\n");
24
+ }
25
+
26
+ function parseArgs(argv) {
27
+ const options = {
28
+ manifest: null,
29
+ output: null,
30
+ prepareOnly: false,
31
+ timeoutMs: 12 * 60 * 1000,
32
+ };
33
+ for (const arg of argv) {
34
+ if (arg === "--help" || arg === "-h") {
35
+ process.stdout.write(`${usage()}\n`);
36
+ process.exit(0);
37
+ }
38
+ if (arg === "--prepare-only") {
39
+ options.prepareOnly = true;
40
+ } else if (arg.startsWith("--manifest=")) {
41
+ options.manifest = path.resolve(arg.slice("--manifest=".length));
42
+ } else if (arg.startsWith("--output=")) {
43
+ options.output = path.resolve(arg.slice("--output=".length));
44
+ } else if (arg.startsWith("--timeout-ms=")) {
45
+ options.timeoutMs = Number.parseInt(
46
+ arg.slice("--timeout-ms=".length),
47
+ 10,
48
+ );
49
+ } else {
50
+ throw new Error(`unknown argument: ${arg}`);
51
+ }
52
+ }
53
+ if (!options.manifest || !options.output) {
54
+ throw new Error("--manifest and --output are required");
55
+ }
56
+ if (!Number.isFinite(options.timeoutMs) || options.timeoutMs <= 0) {
57
+ throw new Error("--timeout-ms must be a positive integer");
58
+ }
59
+ return options;
60
+ }
61
+
62
+ async function writePrivate(filePath, content) {
63
+ await mkdir(path.dirname(filePath), {
64
+ recursive: true,
65
+ mode: 0o700,
66
+ });
67
+ await writeFile(filePath, content, { mode: 0o600 });
68
+ await chmod(filePath, 0o600);
69
+ }
70
+
71
+ function reviewerArgs(reviewer, schemaPath, outputPath, sandboxDir) {
72
+ return [
73
+ "exec",
74
+ "--ephemeral",
75
+ "--skip-git-repo-check",
76
+ "--ignore-rules",
77
+ "--ignore-user-config",
78
+ "--disable",
79
+ "plugins",
80
+ "--disable",
81
+ "remote_plugin",
82
+ "--sandbox",
83
+ "read-only",
84
+ "-C",
85
+ sandboxDir,
86
+ "-m",
87
+ reviewer.model,
88
+ "-c",
89
+ 'model_reasoning_effort="high"',
90
+ "--output-schema",
91
+ schemaPath,
92
+ "--json",
93
+ "--output-last-message",
94
+ outputPath,
95
+ "-",
96
+ ];
97
+ }
98
+
99
+ async function runCommand(command, args, input, timeoutMs) {
100
+ const startedAt = Date.now();
101
+ const child = spawn(command, args, {
102
+ env: {
103
+ ...process.env,
104
+ NO_COLOR: "1",
105
+ TERM: "dumb",
106
+ },
107
+ stdio: ["pipe", "pipe", "pipe"],
108
+ });
109
+ let stdout = "";
110
+ let stderr = "";
111
+ child.stdout.setEncoding("utf8");
112
+ child.stderr.setEncoding("utf8");
113
+ child.stdout.on("data", (chunk) => {
114
+ stdout += chunk;
115
+ });
116
+ child.stderr.on("data", (chunk) => {
117
+ stderr += chunk;
118
+ });
119
+ child.stdin.end(input);
120
+ let timedOut = false;
121
+ const timer = setTimeout(() => {
122
+ timedOut = true;
123
+ child.kill("SIGTERM");
124
+ setTimeout(() => child.kill("SIGKILL"), 5_000).unref();
125
+ }, timeoutMs);
126
+ const status = await new Promise((resolve) => {
127
+ child.on("error", (error) => {
128
+ resolve({ exitCode: null, signal: null, spawnError: error.message });
129
+ });
130
+ child.on("close", (exitCode, signal) => {
131
+ resolve({ exitCode, signal, spawnError: null });
132
+ });
133
+ });
134
+ clearTimeout(timer);
135
+ return {
136
+ ...status,
137
+ timedOut,
138
+ durationMs: Date.now() - startedAt,
139
+ stdout,
140
+ stderr,
141
+ };
142
+ }
143
+
144
+ function parseJsonLines(stdout) {
145
+ return stdout
146
+ .split("\n")
147
+ .filter(Boolean)
148
+ .flatMap((line) => {
149
+ try {
150
+ return [JSON.parse(line)];
151
+ } catch {
152
+ return [];
153
+ }
154
+ });
155
+ }
156
+
157
+ function parseStructuredValue(value) {
158
+ const trimmed = value.trim();
159
+ const fenced = /```(?:json)?\s*([\s\S]*?)\s*```/i.exec(trimmed);
160
+ return JSON.parse(fenced ? fenced[1] : trimmed);
161
+ }
162
+
163
+ async function readReviewerResult(outputPath, stdout) {
164
+ try {
165
+ return parseStructuredValue(await readFile(outputPath, "utf8"));
166
+ } catch {
167
+ const agentMessage = parseJsonLines(stdout)
168
+ .slice()
169
+ .reverse()
170
+ .find(
171
+ (item) =>
172
+ item.type === "item.completed" &&
173
+ item.item?.type === "agent_message" &&
174
+ typeof item.item.text === "string",
175
+ );
176
+ if (!agentMessage) {
177
+ throw new Error("reviewer produced no parseable result");
178
+ }
179
+ return parseStructuredValue(agentMessage.item.text);
180
+ }
181
+ }
182
+
183
+ async function invokeReviewer({
184
+ reviewer,
185
+ testCase,
186
+ prompt,
187
+ outputDir,
188
+ schemaPath,
189
+ sandboxDir,
190
+ timeoutMs,
191
+ }) {
192
+ const prefix = `${testCase.id}-${reviewer.id}`;
193
+ await writePrivate(path.join(outputDir, "prompts", `${prefix}.txt`), prompt);
194
+ let lastReceipt = null;
195
+ for (let attempt = 1; attempt <= 2; attempt += 1) {
196
+ const attemptPrefix = `${prefix}-attempt-${attempt}`;
197
+ const resultPath = path.join(
198
+ outputDir,
199
+ "raw",
200
+ `${attemptPrefix}.result.json`,
201
+ );
202
+ await mkdir(path.dirname(resultPath), {
203
+ recursive: true,
204
+ mode: 0o700,
205
+ });
206
+ const commandResult = await runCommand(
207
+ reviewer.command,
208
+ reviewerArgs(reviewer, schemaPath, resultPath, sandboxDir),
209
+ prompt,
210
+ timeoutMs,
211
+ );
212
+ await writePrivate(
213
+ path.join(outputDir, "raw", `${attemptPrefix}.stdout`),
214
+ commandResult.stdout,
215
+ );
216
+ await writePrivate(
217
+ path.join(outputDir, "raw", `${attemptPrefix}.stderr`),
218
+ commandResult.stderr,
219
+ );
220
+ let review = null;
221
+ let parseError = null;
222
+ try {
223
+ review = await readReviewerResult(resultPath, commandResult.stdout);
224
+ validateReview(review, testCase);
225
+ await writePrivate(resultPath, `${JSON.stringify(review, null, 2)}\n`);
226
+ } catch (error) {
227
+ parseError = error instanceof Error ? error.message : String(error);
228
+ }
229
+ lastReceipt = {
230
+ caseId: testCase.id,
231
+ reviewerId: reviewer.id,
232
+ model: reviewer.model,
233
+ attempt,
234
+ ok:
235
+ commandResult.exitCode === 0 && !commandResult.timedOut && !parseError,
236
+ review,
237
+ parseError,
238
+ ...commandResult,
239
+ };
240
+ if (lastReceipt.ok) {
241
+ return lastReceipt;
242
+ }
243
+ }
244
+ return lastReceipt;
245
+ }
246
+
247
+ async function runQueue(tasks, concurrency, worker) {
248
+ const results = new Array(tasks.length);
249
+ let nextIndex = 0;
250
+ await Promise.all(
251
+ Array.from({ length: Math.min(concurrency, tasks.length) }, async () => {
252
+ while (nextIndex < tasks.length) {
253
+ const index = nextIndex;
254
+ nextIndex += 1;
255
+ results[index] = await worker(tasks[index]);
256
+ }
257
+ }),
258
+ );
259
+ return results;
260
+ }
261
+
262
+ async function main() {
263
+ const options = parseArgs(process.argv.slice(2));
264
+ const manifestDir = path.dirname(options.manifest);
265
+ const manifest = validateManifest(
266
+ JSON.parse(await readFile(options.manifest, "utf8")),
267
+ manifestDir,
268
+ );
269
+ await mkdir(options.output, { recursive: true, mode: 0o700 });
270
+ const sandboxDir = path.join(options.output, "empty-sandbox");
271
+ await mkdir(sandboxDir, { recursive: true, mode: 0o700 });
272
+ const schemaPath = path.join(options.output, "review.schema.json");
273
+ await writePrivate(schemaPath, `${JSON.stringify(OUTPUT_SCHEMA, null, 2)}\n`);
274
+
275
+ const preparedCases = [];
276
+ for (const testCase of manifest.cases) {
277
+ const patchText = await readFile(testCase.patchPath, "utf8");
278
+ const prompt = buildPrompt(testCase, patchText);
279
+ preparedCases.push({
280
+ ...testCase,
281
+ patchSha256: createHash("sha256").update(patchText).digest("hex"),
282
+ prompt,
283
+ });
284
+ for (const reviewer of REVIEWERS) {
285
+ await writePrivate(
286
+ path.join(
287
+ options.output,
288
+ "prompts",
289
+ `${testCase.id}-${reviewer.id}.txt`,
290
+ ),
291
+ prompt,
292
+ );
293
+ }
294
+ }
295
+ await writePrivate(
296
+ path.join(options.output, "prepared.json"),
297
+ `${JSON.stringify(
298
+ {
299
+ reviewers: REVIEWERS,
300
+ cases: preparedCases.map((testCase) => ({
301
+ id: testCase.id,
302
+ requirements: testCase.requirements,
303
+ patchPath: testCase.patchPath,
304
+ patchSha256: testCase.patchSha256,
305
+ })),
306
+ },
307
+ null,
308
+ 2,
309
+ )}\n`,
310
+ );
311
+ if (options.prepareOnly) {
312
+ process.stdout.write(
313
+ `${JSON.stringify(
314
+ {
315
+ prepared: true,
316
+ output: options.output,
317
+ caseCount: preparedCases.length,
318
+ },
319
+ null,
320
+ 2,
321
+ )}\n`,
322
+ );
323
+ return;
324
+ }
325
+
326
+ const tasks = preparedCases.flatMap((testCase) =>
327
+ REVIEWERS.map((reviewer) => ({
328
+ reviewer,
329
+ testCase,
330
+ prompt: testCase.prompt,
331
+ })),
332
+ );
333
+ const receipts = await runQueue(tasks, REVIEWERS.length, (task) =>
334
+ invokeReviewer({
335
+ ...task,
336
+ outputDir: options.output,
337
+ schemaPath,
338
+ sandboxDir,
339
+ timeoutMs: options.timeoutMs,
340
+ }),
341
+ );
342
+ const cases = preparedCases.map((testCase) =>
343
+ aggregateCase(
344
+ testCase,
345
+ receipts.filter((receipt) => receipt.caseId === testCase.id),
346
+ ),
347
+ );
348
+ const protocolFailures = receipts
349
+ .filter((receipt) => !receipt.ok)
350
+ .map((receipt) => ({
351
+ caseId: receipt.caseId,
352
+ reviewerId: receipt.reviewerId,
353
+ model: receipt.model,
354
+ attempts: receipt.attempt,
355
+ exitCode: receipt.exitCode,
356
+ timedOut: receipt.timedOut,
357
+ spawnError: receipt.spawnError,
358
+ parseError: receipt.parseError,
359
+ }));
360
+ const result = {
361
+ version: 1,
362
+ createdAt: new Date().toISOString(),
363
+ reviewers: REVIEWERS,
364
+ cases,
365
+ protocolFailures,
366
+ receipts,
367
+ };
368
+ await writePrivate(
369
+ path.join(options.output, "result.json"),
370
+ `${JSON.stringify(result, null, 2)}\n`,
371
+ );
372
+ process.stdout.write(
373
+ `${JSON.stringify(
374
+ {
375
+ ok: protocolFailures.length === 0,
376
+ output: options.output,
377
+ cases,
378
+ protocolFailures,
379
+ },
380
+ null,
381
+ 2,
382
+ )}\n`,
383
+ );
384
+ if (protocolFailures.length > 0) {
385
+ process.exitCode = 1;
386
+ }
387
+ }
388
+
389
+ await main();
@@ -0,0 +1,243 @@
1
+ import path from "node:path";
2
+
3
+ export const REVIEWERS = [
4
+ {
5
+ id: "codex",
6
+ command: "codex",
7
+ model: "gpt-5.6-sol",
8
+ },
9
+ {
10
+ id: "gpt54",
11
+ command: "traex",
12
+ model: "gpt-5.4",
13
+ },
14
+ {
15
+ id: "openrouter",
16
+ command: "traex",
17
+ model: "openrouter-3o",
18
+ },
19
+ ];
20
+
21
+ export const OUTPUT_SCHEMA = {
22
+ type: "object",
23
+ additionalProperties: false,
24
+ properties: {
25
+ caseId: { type: "string" },
26
+ summary: { type: "string" },
27
+ findings: {
28
+ type: "array",
29
+ items: {
30
+ type: "object",
31
+ additionalProperties: false,
32
+ properties: {
33
+ id: { type: "string" },
34
+ requirementIds: {
35
+ type: "array",
36
+ items: { type: "string" },
37
+ },
38
+ severity: {
39
+ type: "string",
40
+ enum: ["P0", "P1", "P2", "P3"],
41
+ },
42
+ file: { type: "string" },
43
+ line: {
44
+ anyOf: [{ type: "integer" }, { type: "null" }],
45
+ },
46
+ problem: { type: "string" },
47
+ impact: { type: "string" },
48
+ evidence: { type: "string" },
49
+ confidence: {
50
+ type: "integer",
51
+ minimum: 0,
52
+ maximum: 100,
53
+ },
54
+ },
55
+ required: [
56
+ "id",
57
+ "requirementIds",
58
+ "severity",
59
+ "file",
60
+ "line",
61
+ "problem",
62
+ "impact",
63
+ "evidence",
64
+ "confidence",
65
+ ],
66
+ },
67
+ },
68
+ },
69
+ required: ["caseId", "summary", "findings"],
70
+ };
71
+
72
+ export function validateManifest(value, manifestDir) {
73
+ if (!value || typeof value !== "object" || !Array.isArray(value.cases)) {
74
+ throw new Error("manifest must contain a cases array");
75
+ }
76
+ if (value.cases.length === 0) {
77
+ throw new Error("manifest cases must not be empty");
78
+ }
79
+ const caseIds = new Set();
80
+ return {
81
+ cases: value.cases.map((testCase, index) => {
82
+ if (!testCase || typeof testCase !== "object") {
83
+ throw new Error(`cases[${index}] must be an object`);
84
+ }
85
+ if (
86
+ typeof testCase.id !== "string" ||
87
+ !testCase.id.trim() ||
88
+ caseIds.has(testCase.id)
89
+ ) {
90
+ throw new Error(`cases[${index}].id must be unique and non-empty`);
91
+ }
92
+ caseIds.add(testCase.id);
93
+ if (
94
+ !Array.isArray(testCase.requirements) ||
95
+ testCase.requirements.length === 0
96
+ ) {
97
+ throw new Error(
98
+ `case ${testCase.id} must contain at least one requirement`,
99
+ );
100
+ }
101
+ const requirementIds = new Set();
102
+ const requirements = testCase.requirements.map(
103
+ (requirement, requirementIndex) => {
104
+ if (
105
+ !requirement ||
106
+ typeof requirement.id !== "string" ||
107
+ !requirement.id.trim() ||
108
+ requirementIds.has(requirement.id) ||
109
+ typeof requirement.text !== "string" ||
110
+ !requirement.text.trim()
111
+ ) {
112
+ throw new Error(
113
+ `case ${testCase.id} requirement ${requirementIndex} is invalid`,
114
+ );
115
+ }
116
+ requirementIds.add(requirement.id);
117
+ return {
118
+ id: requirement.id,
119
+ text: requirement.text,
120
+ };
121
+ },
122
+ );
123
+ if (
124
+ typeof testCase.patchPath !== "string" ||
125
+ !testCase.patchPath.trim()
126
+ ) {
127
+ throw new Error(`case ${testCase.id}.patchPath is required`);
128
+ }
129
+ return {
130
+ id: testCase.id,
131
+ requirements,
132
+ requirementIds,
133
+ patchPath: path.resolve(manifestDir, testCase.patchPath),
134
+ };
135
+ }),
136
+ };
137
+ }
138
+
139
+ export function buildPrompt(testCase, patchText) {
140
+ return [
141
+ "You are one independent code-review cell.",
142
+ "Review only the supplied patch against the supplied requirements.",
143
+ "Do not assume a requirement is violated merely because it is listed.",
144
+ "Report P0/P1 only for a concrete executable path that violates a requirement or introduces an equally concrete blocking defect.",
145
+ "Use P2/P3 for non-blocking risks. Return findings: [] when the patch is correct.",
146
+ "Use exact supplied requirement IDs. Use [] only for a concrete defect outside the supplied requirements.",
147
+ "Do not use tools, repository access, prior reviewer output, or external context.",
148
+ "Return exactly one JSON object matching the output schema.",
149
+ "",
150
+ `CASE_ID: ${testCase.id}`,
151
+ `REQUIREMENTS: ${JSON.stringify(testCase.requirements)}`,
152
+ "",
153
+ "PATCH:",
154
+ patchText,
155
+ ].join("\n");
156
+ }
157
+
158
+ export function validateReview(review, testCase) {
159
+ if (
160
+ !review ||
161
+ typeof review !== "object" ||
162
+ Array.isArray(review) ||
163
+ review.caseId !== testCase.id ||
164
+ typeof review.summary !== "string" ||
165
+ !Array.isArray(review.findings)
166
+ ) {
167
+ throw new Error("review output has an invalid top-level shape");
168
+ }
169
+ for (const finding of review.findings) {
170
+ if (
171
+ !finding ||
172
+ typeof finding !== "object" ||
173
+ typeof finding.id !== "string" ||
174
+ !Array.isArray(finding.requirementIds) ||
175
+ !["P0", "P1", "P2", "P3"].includes(finding.severity) ||
176
+ typeof finding.file !== "string" ||
177
+ !(Number.isInteger(finding.line) || finding.line === null) ||
178
+ typeof finding.problem !== "string" ||
179
+ typeof finding.impact !== "string" ||
180
+ typeof finding.evidence !== "string" ||
181
+ !Number.isInteger(finding.confidence) ||
182
+ finding.confidence < 0 ||
183
+ finding.confidence > 100
184
+ ) {
185
+ throw new Error(`finding ${finding?.id ?? "unknown"} is invalid`);
186
+ }
187
+ for (const requirementId of finding.requirementIds) {
188
+ if (!testCase.requirementIds.has(requirementId)) {
189
+ throw new Error(
190
+ `finding ${finding.id} used unknown requirement ${requirementId}`,
191
+ );
192
+ }
193
+ }
194
+ }
195
+ }
196
+
197
+ export function aggregateCase(testCase, receipts) {
198
+ const highSeverities = new Set(["P0", "P1"]);
199
+ const byRequirement = new Map();
200
+ const unmappedSevere = [];
201
+ for (const receipt of receipts.filter((item) => item.ok)) {
202
+ for (const finding of receipt.review.findings.filter((item) =>
203
+ highSeverities.has(item.severity),
204
+ )) {
205
+ if (finding.requirementIds.length === 0) {
206
+ unmappedSevere.push({
207
+ reviewerId: receipt.reviewerId,
208
+ finding,
209
+ });
210
+ continue;
211
+ }
212
+ for (const requirementId of finding.requirementIds) {
213
+ const reviewers = byRequirement.get(requirementId) ?? new Map();
214
+ if (!reviewers.has(receipt.reviewerId)) {
215
+ reviewers.set(receipt.reviewerId, finding);
216
+ }
217
+ byRequirement.set(requirementId, reviewers);
218
+ }
219
+ }
220
+ }
221
+ const candidates = [...byRequirement.entries()].map(
222
+ ([requirementId, reviewers]) => ({
223
+ requirementId,
224
+ independentVotes: reviewers.size,
225
+ reviewers: [...reviewers.keys()],
226
+ proposals: [...reviewers.entries()].map(([reviewerId, finding]) => ({
227
+ reviewerId,
228
+ finding,
229
+ })),
230
+ }),
231
+ );
232
+ return {
233
+ caseId: testCase.id,
234
+ validReviewerCount: receipts.filter((item) => item.ok).length,
235
+ majorityCandidates: candidates.filter(
236
+ (candidate) => candidate.independentVotes >= 2,
237
+ ),
238
+ singletonCandidates: candidates.filter(
239
+ (candidate) => candidate.independentVotes === 1,
240
+ ),
241
+ unmappedSevere,
242
+ };
243
+ }
@@ -0,0 +1,63 @@
1
+ ---
2
+ name: run-test-cases
3
+ description: 当需要执行或验收 docs/testing/**/*.testplan.yaml 测试计划或用户给出的新格式 YAML 用例时使用。先校验最小 schema,再在真实浏览器、桌面或后端环境逐条取证;默认遇到首个失败即停,不负责编写用例,不兼容 Markdown 测试案例。
4
+ ---
5
+
6
+ # 执行测试用例
7
+
8
+ 把测试计划视为不可偷改的验收合同。只执行 `.testplan.yaml`;收到 Markdown 测试案例时停止,
9
+ 要求先用 `write-test-cases` 迁移,不自行兼容解析。
10
+
11
+ ## 独立执行校验
12
+
13
+ 1. 读取完整 YAML,确认:
14
+ - 顶层只有 `version`、`name`、`description`、`cases`,且 `version: 1`。
15
+ - `cases` 包含 1-20 条;至少一条 `required: true`。
16
+ - 每条 case 只有 `id`、`name`、`required`、`description`、`preconditions`、`steps`。
17
+ - `id` 符合 `<统一大写前缀>-<三位连续编号>`;字符串非空,`preconditions` 和 `steps`
18
+ 都是非空字符串数组。
19
+ 2. 仅当当前仓库的 `AGENTS.md`、项目文档或 package script **显式声明**测试计划 validator
20
+ 时运行它;不得根据 pnpm、Rush、npm 等仓库类型猜测命令。Runweave 仓库显式入口为:
21
+
22
+ ```bash
23
+ pnpm testplan:validate <测试计划路径>
24
+ ```
25
+
26
+ 3. 仓库没有额外 validator 时,第一步的最小 schema 校验结果即为格式校验结果,不能据此
27
+ 写 environment skip。
28
+ 4. 校验失败立即停止,不猜测或修补格式。
29
+ 5. 默认只执行 `required: true` 的 case,并按文件顺序逐条执行。只有用户明确要求全量回归时,
30
+ 才额外执行 `required: false`。
31
+
32
+ ## 执行铁律
33
+
34
+ - 默认严格逐条执行,任一 case 失败立即停止。
35
+ - 不为了通过而修改测试计划。发现用例与已确认需求或当前前提矛盾时,停止并说明。
36
+ - 逐项执行 `preconditions` 检查,再按 `steps` 的自然语言完成动作和结果核对。
37
+ - 浏览器行为必须使用 `$toolkit:playwright-cli` 操作真实页面并获取 DOM、截图、控制台或网络
38
+ 证据;桌面端联动使用 `$computer-use`;后端、协议和 CLI 运行真实命令并保留关键输出。
39
+ - `typecheck` 和 `lint` 只是门禁,不能替代 UI 或行为取证。
40
+ - 承诺过真实验证但无法执行时,写明“未执行 + 阻塞原因”,不得用代码阅读或推断判为通过。
41
+
42
+ 用户显式要求“失败后自己修”时,可以修实现并重跑当前 case;仍然不得擅自修改测试计划。
43
+
44
+ ## 失败归因
45
+
46
+ 以下情况视为用例问题并停止确认:
47
+
48
+ - 描述与已确认需求或当前代码事实直接矛盾。
49
+ - 前提条件已经不存在。
50
+ - 步骤没有写出可观察结果,无法判断通过或失败。
51
+ - 让它通过需要明显超出当前任务范围的行为修改。
52
+
53
+ 其余可稳定复现的偏差按实现问题报告;只有用户授权自愈时才修改实现。
54
+
55
+ ## 汇报
56
+
57
+ 使用中文报告:
58
+
59
+ - 测试计划路径、格式校验依据与结果。
60
+ - 每条 case ID、通过/失败/未执行、操作或命令、关键证据。
61
+ - 未执行的 `required: false` case。
62
+ - 首个失败点、实际结果、期望结果和建议下一步。
63
+ - 自愈模式下列出修改文件与重验结果。