@runweave/server-linux-x64 0.1.8 → 0.1.9

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 (351) hide show
  1. package/manifest.json +1482 -151
  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 +3 -3
  6. package/payload/app-server/index.cjs +1 -1
  7. package/payload/backend/build-info.json +4 -4
  8. package/payload/backend/index.cjs +45 -9
  9. package/payload/backend/ios-simulators/pool.py +3 -3
  10. package/payload/frontend/dist/assets/{_baseUniq-vo4uuhMd.js → _baseUniq-qHFga5V8.js} +1 -1
  11. package/payload/frontend/dist/assets/{access-_jCu7Rgu.js → access-DgHvmn15.js} +1 -1
  12. package/payload/frontend/dist/assets/{advanced-CqOhObYj.js → advanced-C1Fh14vw.js} +1 -1
  13. package/payload/frontend/dist/assets/{appearance-CrrD5gzC.js → appearance-Bs7cSXqO.js} +1 -1
  14. package/payload/frontend/dist/assets/{arc-dbfyHSF0.js → arc-E3iYHQG_.js} +1 -1
  15. package/payload/frontend/dist/assets/{architectureDiagram-Q4EWVU46-CntSCAsO.js → architectureDiagram-Q4EWVU46-DgpYpTb9.js} +1 -1
  16. package/payload/frontend/dist/assets/{blockDiagram-DXYQGD6D-Chp0D4qy.js → blockDiagram-DXYQGD6D-CfFOEKZ7.js} +1 -1
  17. package/payload/frontend/dist/assets/{c4Diagram-AHTNJAMY-CF91pOuW.js → c4Diagram-AHTNJAMY-BxlHBUj3.js} +1 -1
  18. package/payload/frontend/dist/assets/channel-amxyNKnk.js +1 -0
  19. package/payload/frontend/dist/assets/{chunk-4BX2VUAB-B1gxlVu2.js → chunk-4BX2VUAB-xWocgDo8.js} +1 -1
  20. package/payload/frontend/dist/assets/{chunk-4TB4RGXK-Cxt3mj9b.js → chunk-4TB4RGXK-Bl1cNICf.js} +1 -1
  21. package/payload/frontend/dist/assets/{chunk-55IACEB6-BJT6qNik.js → chunk-55IACEB6-DVtE836u.js} +1 -1
  22. package/payload/frontend/dist/assets/{chunk-EDXVE4YY-yI59bCa0.js → chunk-EDXVE4YY-Dbd3tDCr.js} +1 -1
  23. package/payload/frontend/dist/assets/{chunk-FMBD7UC4-CDvncKKJ.js → chunk-FMBD7UC4-MPJaTsyN.js} +1 -1
  24. package/payload/frontend/dist/assets/{chunk-OYMX7WX6-BblOIU57.js → chunk-OYMX7WX6-D3LuudlW.js} +1 -1
  25. package/payload/frontend/dist/assets/{chunk-QZHKN3VN-rODzNdO0.js → chunk-QZHKN3VN-Dn1aF6iQ.js} +1 -1
  26. package/payload/frontend/dist/assets/{chunk-YZCP3GAM-B6D4wQwk.js → chunk-YZCP3GAM-jZYbHnCw.js} +1 -1
  27. package/payload/frontend/dist/assets/classDiagram-6PBFFD2Q-B8cTijjT.js +1 -0
  28. package/payload/frontend/dist/assets/classDiagram-v2-HSJHXN6E-B8cTijjT.js +1 -0
  29. package/payload/frontend/dist/assets/clone-xzI2eGRI.js +1 -0
  30. package/payload/frontend/dist/assets/connection-V2iI-6rM.js +12 -0
  31. package/payload/frontend/dist/assets/{connections-DqDmxS-O.js → connections-G_Q7342g.js} +1 -1
  32. package/payload/frontend/dist/assets/{cose-bilkent-S5V4N54A-BvwVWp29.js → cose-bilkent-S5V4N54A-75FLD3RS.js} +1 -1
  33. package/payload/frontend/dist/assets/{dagre-KV5264BT-h_K1TH11.js → dagre-KV5264BT-DEm-DpJL.js} +1 -1
  34. package/payload/frontend/dist/assets/{desktop-BQ3kGtKG.js → desktop-g5JC-CQd.js} +1 -1
  35. package/payload/frontend/dist/assets/{diagram-5BDNPKRD-B8g2SV6L.js → diagram-5BDNPKRD-BV6P2UTy.js} +1 -1
  36. package/payload/frontend/dist/assets/{diagram-G4DWMVQ6-BOEnrqYm.js → diagram-G4DWMVQ6-DuCK-MM2.js} +1 -1
  37. package/payload/frontend/dist/assets/{diagram-MMDJMWI5-DlaN_z71.js → diagram-MMDJMWI5-D5_GlPgO.js} +1 -1
  38. package/payload/frontend/dist/assets/{diagram-TYMM5635-C_pSKftn.js → diagram-TYMM5635-QRbOYR1P.js} +1 -1
  39. package/payload/frontend/dist/assets/{erDiagram-SMLLAGMA-C2dL-h3I.js → erDiagram-SMLLAGMA-DefCheAw.js} +1 -1
  40. package/payload/frontend/dist/assets/{flowDiagram-DWJPFMVM-BmXhKWFj.js → flowDiagram-DWJPFMVM-DVzyWIso.js} +1 -1
  41. package/payload/frontend/dist/assets/{ganttDiagram-T4ZO3ILL-D_Odnssf.js → ganttDiagram-T4ZO3ILL-BJaClUEF.js} +1 -1
  42. package/payload/frontend/dist/assets/{gitGraphDiagram-UUTBAWPF-DcQdcwKZ.js → gitGraphDiagram-UUTBAWPF-BLfbApNz.js} +1 -1
  43. package/payload/frontend/dist/assets/{graph-C_XsxefA.js → graph-C-YqFh68.js} +1 -1
  44. package/payload/frontend/dist/assets/{image-D3hgVr8O.js → image-CZo_2Awc.js} +1 -1
  45. package/payload/frontend/dist/assets/{index-CEUsFFQq.js → index-6q2aeqkt.js} +95 -105
  46. package/payload/frontend/dist/assets/{infoDiagram-42DDH7IO-C6TnRyMi.js → infoDiagram-42DDH7IO-BakVOutT.js} +1 -1
  47. package/payload/frontend/dist/assets/{ishikawaDiagram-UXIWVN3A-BL7rfALJ.js → ishikawaDiagram-UXIWVN3A-D_1Oa5Dc.js} +1 -1
  48. package/payload/frontend/dist/assets/{journeyDiagram-VCZTEJTY-C_6407GW.js → journeyDiagram-VCZTEJTY-Y8TVFv6B.js} +1 -1
  49. package/payload/frontend/dist/assets/{kanban-definition-6JOO6SKY-CK61Fd0p.js → kanban-definition-6JOO6SKY-DxeNhTIB.js} +1 -1
  50. package/payload/frontend/dist/assets/{layout-DVn6JKbl.js → layout-5cMeOTAp.js} +1 -1
  51. package/payload/frontend/dist/assets/{linear-DyWskq8H.js → linear-Bnc3ev5g.js} +1 -1
  52. package/payload/frontend/dist/assets/main-3TPtEl66.js +706 -0
  53. package/payload/frontend/dist/assets/main-D4_uoZQa.css +33 -0
  54. package/payload/frontend/dist/assets/{min-apbLpSJ3.js → min-BRXKkrS8.js} +1 -1
  55. package/payload/frontend/dist/assets/{mindmap-definition-QFDTVHPH-MVHZZbma.js → mindmap-definition-QFDTVHPH-RYZO_BEr.js} +1 -1
  56. package/payload/frontend/dist/assets/{monitoring-BApsVez_.js → monitoring-Fv7kZ4s6.js} +1 -1
  57. package/payload/frontend/dist/assets/{notifications-CjxSNLU1.js → notifications-BzrYqyMH.js} +1 -1
  58. package/payload/frontend/dist/assets/{pieDiagram-DEJITSTG-Dhbb0AYU.js → pieDiagram-DEJITSTG-Bzw0dhjz.js} +1 -1
  59. package/payload/frontend/dist/assets/{quadrantDiagram-34T5L4WZ-Yk6LOF0S.js → quadrantDiagram-34T5L4WZ-CQJY_msa.js} +1 -1
  60. package/payload/frontend/dist/assets/{record-content-BCJ80KS5.js → record-content-B7-6olQt.js} +1 -1
  61. package/payload/frontend/dist/assets/{requirementDiagram-MS252O5E-BUhS0PEq.js → requirementDiagram-MS252O5E-DuP8hAV8.js} +1 -1
  62. package/payload/frontend/dist/assets/{sankeyDiagram-XADWPNL6-D2sdxz14.js → sankeyDiagram-XADWPNL6-D-fQnCZZ.js} +1 -1
  63. package/payload/frontend/dist/assets/{sequenceDiagram-FGHM5R23-CRere4Fy.js → sequenceDiagram-FGHM5R23-DaZNEccV.js} +1 -1
  64. package/payload/frontend/dist/assets/{stateDiagram-FHFEXIEX-_pk-OMlm.js → stateDiagram-FHFEXIEX-CkOLt5R1.js} +1 -1
  65. package/payload/frontend/dist/assets/stateDiagram-v2-QKLJ7IA2-atg1K4nB.js +1 -0
  66. package/payload/frontend/dist/assets/{status-Dk5rRVQF.js → status-CIIPajZp.js} +1 -1
  67. package/payload/frontend/dist/assets/suiji-C453W-Sg.js +1 -0
  68. package/payload/frontend/dist/assets/{svg-X7YkMMvx.js → svg-BUqAWGtg.js} +1 -1
  69. package/payload/frontend/dist/assets/{tabs-BmKbcPVh.js → tabs-Cwlp1Meu.js} +1 -1
  70. package/payload/frontend/dist/assets/{timeline-definition-GMOUNBTQ-BPsI2pMC.js → timeline-definition-GMOUNBTQ-BOKDMwHS.js} +1 -1
  71. package/payload/frontend/dist/assets/{vennDiagram-DHZGUBPP-BNJkZ1Az.js → vennDiagram-DHZGUBPP-fSZjDS41.js} +1 -1
  72. package/payload/frontend/dist/assets/{wardley-RL74JXVD-CVcYeATS.js → wardley-RL74JXVD-D1KIsvoD.js} +1 -1
  73. package/payload/frontend/dist/assets/{wardleyDiagram-NUSXRM2D-BpLJ0alk.js → wardleyDiagram-NUSXRM2D-FMe67dwE.js} +1 -1
  74. package/payload/frontend/dist/assets/{xychartDiagram-5P7HB3ND-BdsYYk4M.js → xychartDiagram-5P7HB3ND-B9AM9_9w.js} +1 -1
  75. package/payload/frontend/dist/build-info.json +4 -4
  76. package/payload/frontend/dist/companion.html +1 -1
  77. package/payload/frontend/dist/index.html +3 -3
  78. package/payload/packages/agent-bridge/src/install-pi.mjs +81 -0
  79. package/payload/plugins/pi/dist/SKILL.md +22 -0
  80. package/payload/plugins/pi/dist/bridge/app-server-client.cjs +82 -0
  81. package/payload/plugins/pi/dist/bridge/feishu_stop_notify.sh +169 -0
  82. package/payload/plugins/pi/dist/bridge/runweave-hook-bridge.cjs +583 -0
  83. package/payload/plugins/pi/dist/bridge/runweave-hook-completion.cjs +42 -0
  84. package/payload/plugins/pi/dist/bridge/runweave-hook-payload.cjs +578 -0
  85. package/payload/plugins/pi/dist/bridge/runweave-task-supervision.cjs +167 -0
  86. package/payload/plugins/pi/dist/runweave.js +316 -0
  87. package/payload/plugins/toolkit/.codex-plugin/plugin.json +31 -0
  88. package/payload/plugins/toolkit/README.md +185 -0
  89. package/payload/plugins/toolkit/hooks/AGENTS.md +6 -0
  90. package/payload/plugins/toolkit/hooks/app-server-client.cjs +82 -0
  91. package/payload/plugins/toolkit/hooks/feishu_stop_notify.sh +169 -0
  92. package/payload/plugins/toolkit/hooks/runweave-hook-bridge.cjs +583 -0
  93. package/payload/plugins/toolkit/hooks/runweave-hook-completion.cjs +42 -0
  94. package/payload/plugins/toolkit/hooks/runweave-hook-dispatch.cjs +123 -0
  95. package/payload/plugins/toolkit/hooks/runweave-hook-payload.cjs +578 -0
  96. package/payload/plugins/toolkit/hooks/runweave-task-supervision.cjs +167 -0
  97. package/payload/plugins/toolkit/hooks.json +108 -0
  98. package/payload/plugins/toolkit/skills/acceptance/SKILL.md +70 -0
  99. package/payload/plugins/toolkit/skills/acceptance/agents/openai.yaml +4 -0
  100. package/payload/plugins/toolkit/skills/acceptance/references/capture.md +38 -0
  101. package/payload/plugins/toolkit/skills/acceptance/references/delivery.md +54 -0
  102. package/payload/plugins/toolkit/skills/acceptance/references/gallery-contract.md +84 -0
  103. package/payload/plugins/toolkit/skills/acceptance/references/gallery-copy.md +34 -0
  104. package/payload/plugins/toolkit/skills/acceptance/references/video.md +52 -0
  105. package/payload/plugins/toolkit/skills/acceptance/scripts/capture.py +137 -0
  106. package/payload/plugins/toolkit/skills/acceptance/scripts/common.py +63 -0
  107. package/payload/plugins/toolkit/skills/acceptance/scripts/gallery.py +353 -0
  108. package/payload/plugins/toolkit/skills/acceptance/scripts/preview.py +109 -0
  109. package/payload/plugins/toolkit/skills/acceptance/scripts/video.py +283 -0
  110. package/payload/plugins/toolkit/skills/acceptance/templates/reader.css +576 -0
  111. package/payload/plugins/toolkit/skills/acceptance/templates/reader.html +63 -0
  112. package/payload/plugins/toolkit/skills/acceptance/templates/reader.js +326 -0
  113. package/payload/plugins/toolkit/skills/acceptance/templates/viewer.css +55 -0
  114. package/payload/plugins/toolkit/skills/acceptance-gallery/SKILL.md +8 -0
  115. package/payload/plugins/toolkit/skills/acceptance-gallery/agents/openai.yaml +6 -0
  116. package/payload/plugins/toolkit/skills/acceptance-gallery/references/capture-and-copy.md +3 -0
  117. package/payload/plugins/toolkit/skills/acceptance-gallery/references/content-contract.md +3 -0
  118. package/payload/plugins/toolkit/skills/acceptance-gallery/scripts/gallery.py +9 -0
  119. package/payload/plugins/toolkit/skills/acceptance-video/SKILL.md +8 -0
  120. package/payload/plugins/toolkit/skills/acceptance-video/agents/openai.yaml +6 -0
  121. package/payload/plugins/toolkit/skills/acceptance-video/references/input-and-capture.md +3 -0
  122. package/payload/plugins/toolkit/skills/acceptance-video/references/mobile-review.md +3 -0
  123. package/payload/plugins/toolkit/skills/acceptance-video/scripts/capture.py +9 -0
  124. package/payload/plugins/toolkit/skills/acceptance-video/scripts/video.py +9 -0
  125. package/payload/plugins/toolkit/skills/agent-device/SKILL.md +86 -0
  126. package/payload/plugins/toolkit/skills/agent-device/agents/openai.yaml +4 -0
  127. package/payload/plugins/toolkit/skills/agent-device/references/ios-setup.md +36 -0
  128. package/payload/plugins/toolkit/skills/agent-device/scripts/device.py +398 -0
  129. package/payload/plugins/toolkit/skills/agent-device/scripts/resources.py +248 -0
  130. package/payload/plugins/toolkit/skills/architecture-flow-prototyping/SKILL.md +128 -0
  131. package/payload/plugins/toolkit/skills/architecture-flow-prototyping/agents/openai.yaml +4 -0
  132. package/payload/plugins/toolkit/skills/architecture-flow-prototyping/references/architecture-flow-checklist.md +59 -0
  133. package/payload/plugins/toolkit/skills/architecture-flow-prototyping/references/architecture-flow-guide.md +135 -0
  134. package/payload/plugins/toolkit/skills/architecture-flow-prototyping/references/architecture-flow-handoff-template.md +57 -0
  135. package/payload/plugins/toolkit/skills/ask-first/SKILL.md +81 -0
  136. package/payload/plugins/toolkit/skills/brainstorming/SKILL.md +41 -0
  137. package/payload/plugins/toolkit/skills/browse-record/SKILL.md +35 -0
  138. package/payload/plugins/toolkit/skills/browse-record/references/app-usage.md +19 -0
  139. package/payload/plugins/toolkit/skills/browse-record/references/daily-reporting.md +115 -0
  140. package/payload/plugins/toolkit/skills/browse-record/references/zhihu.md +33 -0
  141. package/payload/plugins/toolkit/skills/browse-record/scripts/app_usage.py +110 -0
  142. package/payload/plugins/toolkit/skills/browse-record/scripts/browse_job.py +385 -0
  143. package/payload/plugins/toolkit/skills/browse-record/scripts/zhihu-read.js +126 -0
  144. package/payload/plugins/toolkit/skills/browse-record/scripts/zhihu_http.py +273 -0
  145. package/payload/plugins/toolkit/skills/clear-technical-explanations/LICENSE +21 -0
  146. package/payload/plugins/toolkit/skills/clear-technical-explanations/SKILL.md +103 -0
  147. package/payload/plugins/toolkit/skills/code-grounded-requirements/SKILL.md +54 -0
  148. package/payload/plugins/toolkit/skills/daily-doc-maintenance/SKILL.md +151 -0
  149. package/payload/plugins/toolkit/skills/daily-record/SKILL.md +63 -0
  150. package/payload/plugins/toolkit/skills/daily-record/agents/openai.yaml +4 -0
  151. package/payload/plugins/toolkit/skills/daily-record/references/browser-history.md +6 -0
  152. package/payload/plugins/toolkit/skills/daily-record/references/feishu.md +90 -0
  153. package/payload/plugins/toolkit/skills/daily-record/references/scheduled-reporting.md +144 -0
  154. package/payload/plugins/toolkit/skills/daily-record/references/scheduled-task.template.json +15 -0
  155. package/payload/plugins/toolkit/skills/daily-record/references/suiji-work-records.md +57 -0
  156. package/payload/plugins/toolkit/skills/daily-record/scripts/feishu.py +280 -0
  157. package/payload/plugins/toolkit/skills/daily-record/scripts/job.py +416 -0
  158. package/payload/plugins/toolkit/skills/daily-record/scripts/job_browser.py +77 -0
  159. package/payload/plugins/toolkit/skills/daily-record/scripts/job_facts.py +132 -0
  160. package/payload/plugins/toolkit/skills/daily-record/scripts/job_isolation.py +69 -0
  161. package/payload/plugins/toolkit/skills/daily-record/scripts/job_materials.py +154 -0
  162. package/payload/plugins/toolkit/skills/daily-record/scripts/job_screen.py +77 -0
  163. package/payload/plugins/toolkit/skills/daily-record/scripts/job_state.py +309 -0
  164. package/payload/plugins/toolkit/skills/daily-refactor/SKILL.md +101 -0
  165. package/payload/plugins/toolkit/skills/daily-refactor/scripts/compare-architecture-reports.mjs +168 -0
  166. package/payload/plugins/toolkit/skills/debugging-strategies/SKILL.md +38 -0
  167. package/payload/plugins/toolkit/skills/debugging-strategies/resources/implementation-playbook.md +520 -0
  168. package/payload/plugins/toolkit/skills/diagnostic-log-debugging/SKILL.md +79 -0
  169. package/payload/plugins/toolkit/skills/doc-coauthoring/SKILL.md +64 -0
  170. package/payload/plugins/toolkit/skills/eli5/LICENSE +21 -0
  171. package/payload/plugins/toolkit/skills/eli5/SKILL.md +18 -0
  172. package/payload/plugins/toolkit/skills/experience/SKILL.md +71 -0
  173. package/payload/plugins/toolkit/skills/experience/package.json +13 -0
  174. package/payload/plugins/toolkit/skills/git-advanced-workflows/SKILL.md +457 -0
  175. package/payload/plugins/toolkit/skills/github-pr/SKILL.md +109 -0
  176. package/payload/plugins/toolkit/skills/github-pr/scripts/github-access.mjs +292 -0
  177. package/payload/plugins/toolkit/skills/github-pr/scripts/preflight.mjs +191 -0
  178. package/payload/plugins/toolkit/skills/github-pr/scripts/source-worktree.mjs +354 -0
  179. package/payload/plugins/toolkit/skills/grill-with-docs/SKILL.md +66 -0
  180. package/payload/plugins/toolkit/skills/grill-with-docs/agents/openai.yaml +6 -0
  181. package/payload/plugins/toolkit/skills/grilling/SKILL.md +14 -0
  182. package/payload/plugins/toolkit/skills/handoff/SKILL.md +98 -0
  183. package/payload/plugins/toolkit/skills/karpathy-guidelines/SKILL.md +73 -0
  184. package/payload/plugins/toolkit/skills/playwright-cli/SKILL.md +562 -0
  185. package/payload/plugins/toolkit/skills/playwright-cli/references/element-attributes.md +23 -0
  186. package/payload/plugins/toolkit/skills/playwright-cli/references/playwright-tests.md +39 -0
  187. package/payload/plugins/toolkit/skills/playwright-cli/references/request-mocking.md +87 -0
  188. package/payload/plugins/toolkit/skills/playwright-cli/references/running-code.md +240 -0
  189. package/payload/plugins/toolkit/skills/playwright-cli/references/session-management.md +226 -0
  190. package/payload/plugins/toolkit/skills/playwright-cli/references/spec-driven-testing.md +312 -0
  191. package/payload/plugins/toolkit/skills/playwright-cli/references/storage-state.md +275 -0
  192. package/payload/plugins/toolkit/skills/playwright-cli/references/test-generation.md +138 -0
  193. package/payload/plugins/toolkit/skills/playwright-cli/references/tracing.md +142 -0
  194. package/payload/plugins/toolkit/skills/playwright-cli/references/video-recording.md +157 -0
  195. package/payload/plugins/toolkit/skills/playwright-cli/templates/standalone.config.json +7 -0
  196. package/payload/plugins/toolkit/skills/product-exploration/SKILL.md +64 -0
  197. package/payload/plugins/toolkit/skills/product-exploration/agents/openai.yaml +5 -0
  198. package/payload/plugins/toolkit/skills/prototype-first-development/SKILL.md +134 -0
  199. package/payload/plugins/toolkit/skills/prototype-first-development/references/html-prototype-template/README.md +88 -0
  200. package/payload/plugins/toolkit/skills/prototype-first-development/references/html-prototype-template/app.js +145 -0
  201. package/payload/plugins/toolkit/skills/prototype-first-development/references/html-prototype-template/index.html +229 -0
  202. package/payload/plugins/toolkit/skills/prototype-first-development/references/html-prototype-template/mock-state.json +60 -0
  203. package/payload/plugins/toolkit/skills/prototype-first-development/references/implementation-plan-handoff-template.md +61 -0
  204. package/payload/plugins/toolkit/skills/prototype-first-development/references/prototype-workflow-checklist.md +64 -0
  205. package/payload/plugins/toolkit/skills/publish-runweave-server/SKILL.md +64 -0
  206. package/payload/plugins/toolkit/skills/publish-runweave-server/agents/openai.yaml +4 -0
  207. package/payload/plugins/toolkit/skills/react-best-practices/AGENTS.md +3227 -0
  208. package/payload/plugins/toolkit/skills/react-best-practices/README.md +127 -0
  209. package/payload/plugins/toolkit/skills/react-best-practices/SKILL.md +143 -0
  210. package/payload/plugins/toolkit/skills/react-best-practices/metadata.json +15 -0
  211. package/payload/plugins/toolkit/skills/react-best-practices/rules/advanced/event-handler-refs.md +55 -0
  212. package/payload/plugins/toolkit/skills/react-best-practices/rules/advanced/init-once.md +42 -0
  213. package/payload/plugins/toolkit/skills/react-best-practices/rules/advanced/use-latest.md +39 -0
  214. package/payload/plugins/toolkit/skills/react-best-practices/rules/async/api-routes.md +38 -0
  215. package/payload/plugins/toolkit/skills/react-best-practices/rules/async/defer-await.md +80 -0
  216. package/payload/plugins/toolkit/skills/react-best-practices/rules/async/dependencies.md +52 -0
  217. package/payload/plugins/toolkit/skills/react-best-practices/rules/async/parallel.md +28 -0
  218. package/payload/plugins/toolkit/skills/react-best-practices/rules/async/suspense-boundaries.md +99 -0
  219. package/payload/plugins/toolkit/skills/react-best-practices/rules/bundle/barrel-imports.md +59 -0
  220. package/payload/plugins/toolkit/skills/react-best-practices/rules/bundle/conditional.md +37 -0
  221. package/payload/plugins/toolkit/skills/react-best-practices/rules/bundle/defer-third-party.md +49 -0
  222. package/payload/plugins/toolkit/skills/react-best-practices/rules/bundle/dynamic-imports.md +35 -0
  223. package/payload/plugins/toolkit/skills/react-best-practices/rules/bundle/preload.md +46 -0
  224. package/payload/plugins/toolkit/skills/react-best-practices/rules/client/event-listeners.md +78 -0
  225. package/payload/plugins/toolkit/skills/react-best-practices/rules/client/localstorage-schema.md +77 -0
  226. package/payload/plugins/toolkit/skills/react-best-practices/rules/client/passive-event-listeners.md +48 -0
  227. package/payload/plugins/toolkit/skills/react-best-practices/rules/client/swr-dedup.md +56 -0
  228. package/payload/plugins/toolkit/skills/react-best-practices/rules/js/batch-dom-css.md +110 -0
  229. package/payload/plugins/toolkit/skills/react-best-practices/rules/js/cache-function-results.md +80 -0
  230. package/payload/plugins/toolkit/skills/react-best-practices/rules/js/cache-property-access.md +28 -0
  231. package/payload/plugins/toolkit/skills/react-best-practices/rules/js/cache-storage.md +70 -0
  232. package/payload/plugins/toolkit/skills/react-best-practices/rules/js/combine-iterations.md +32 -0
  233. package/payload/plugins/toolkit/skills/react-best-practices/rules/js/early-exit.md +50 -0
  234. package/payload/plugins/toolkit/skills/react-best-practices/rules/js/flatmap-filter.md +55 -0
  235. package/payload/plugins/toolkit/skills/react-best-practices/rules/js/hoist-regexp.md +45 -0
  236. package/payload/plugins/toolkit/skills/react-best-practices/rules/js/index-maps.md +37 -0
  237. package/payload/plugins/toolkit/skills/react-best-practices/rules/js/length-check-first.md +50 -0
  238. package/payload/plugins/toolkit/skills/react-best-practices/rules/js/min-max-loop.md +82 -0
  239. package/payload/plugins/toolkit/skills/react-best-practices/rules/js/set-map-lookups.md +24 -0
  240. package/payload/plugins/toolkit/skills/react-best-practices/rules/js/tosorted-immutable.md +57 -0
  241. package/payload/plugins/toolkit/skills/react-best-practices/rules/meta/sections.md +46 -0
  242. package/payload/plugins/toolkit/skills/react-best-practices/rules/meta/template.md +28 -0
  243. package/payload/plugins/toolkit/skills/react-best-practices/rules/rendering/activity.md +26 -0
  244. package/payload/plugins/toolkit/skills/react-best-practices/rules/rendering/animate-svg-wrapper.md +38 -0
  245. package/payload/plugins/toolkit/skills/react-best-practices/rules/rendering/conditional-render.md +32 -0
  246. package/payload/plugins/toolkit/skills/react-best-practices/rules/rendering/content-visibility.md +38 -0
  247. package/payload/plugins/toolkit/skills/react-best-practices/rules/rendering/hoist-jsx.md +36 -0
  248. package/payload/plugins/toolkit/skills/react-best-practices/rules/rendering/hydration-no-flicker.md +72 -0
  249. package/payload/plugins/toolkit/skills/react-best-practices/rules/rendering/hydration-suppress-warning.md +26 -0
  250. package/payload/plugins/toolkit/skills/react-best-practices/rules/rendering/resource-hints.md +89 -0
  251. package/payload/plugins/toolkit/skills/react-best-practices/rules/rendering/script-defer-async.md +71 -0
  252. package/payload/plugins/toolkit/skills/react-best-practices/rules/rendering/svg-precision.md +28 -0
  253. package/payload/plugins/toolkit/skills/react-best-practices/rules/rendering/usetransition-loading.md +75 -0
  254. package/payload/plugins/toolkit/skills/react-best-practices/rules/rerender/defer-reads.md +39 -0
  255. package/payload/plugins/toolkit/skills/react-best-practices/rules/rerender/dependencies.md +45 -0
  256. package/payload/plugins/toolkit/skills/react-best-practices/rules/rerender/derived-state-no-effect.md +40 -0
  257. package/payload/plugins/toolkit/skills/react-best-practices/rules/rerender/derived-state.md +29 -0
  258. package/payload/plugins/toolkit/skills/react-best-practices/rules/rerender/functional-setstate.md +77 -0
  259. package/payload/plugins/toolkit/skills/react-best-practices/rules/rerender/lazy-state-init.md +58 -0
  260. package/payload/plugins/toolkit/skills/react-best-practices/rules/rerender/memo-with-default-value.md +36 -0
  261. package/payload/plugins/toolkit/skills/react-best-practices/rules/rerender/memo.md +44 -0
  262. package/payload/plugins/toolkit/skills/react-best-practices/rules/rerender/move-effect-to-event.md +45 -0
  263. package/payload/plugins/toolkit/skills/react-best-practices/rules/rerender/no-inline-components.md +83 -0
  264. package/payload/plugins/toolkit/skills/react-best-practices/rules/rerender/simple-expression-in-memo.md +35 -0
  265. package/payload/plugins/toolkit/skills/react-best-practices/rules/rerender/transitions.md +40 -0
  266. package/payload/plugins/toolkit/skills/react-best-practices/rules/rerender/use-ref-transient-values.md +73 -0
  267. package/payload/plugins/toolkit/skills/react-best-practices/rules/server/after-nonblocking.md +74 -0
  268. package/payload/plugins/toolkit/skills/react-best-practices/rules/server/auth-actions.md +96 -0
  269. package/payload/plugins/toolkit/skills/react-best-practices/rules/server/cache-lru.md +41 -0
  270. package/payload/plugins/toolkit/skills/react-best-practices/rules/server/cache-react.md +76 -0
  271. package/payload/plugins/toolkit/skills/react-best-practices/rules/server/dedup-props.md +65 -0
  272. package/payload/plugins/toolkit/skills/react-best-practices/rules/server/hoist-static-io.md +139 -0
  273. package/payload/plugins/toolkit/skills/react-best-practices/rules/server/parallel-fetching.md +83 -0
  274. package/payload/plugins/toolkit/skills/react-best-practices/rules/server/serialization.md +38 -0
  275. package/payload/plugins/toolkit/skills/recorded-browser-mcp-verification/SKILL.md +8 -0
  276. package/payload/plugins/toolkit/skills/recorded-browser-mcp-verification/agents/openai.yaml +6 -0
  277. package/payload/plugins/toolkit/skills/reproduce-before-fix/SKILL.md +93 -0
  278. package/payload/plugins/toolkit/skills/reproduce-before-fix/agents/openai.yaml +7 -0
  279. package/payload/plugins/toolkit/skills/review-only/SKILL.md +72 -0
  280. package/payload/plugins/toolkit/skills/review-with-runtime-evidence/SKILL.md +134 -0
  281. package/payload/plugins/toolkit/skills/review-with-runtime-evidence/agents/openai.yaml +7 -0
  282. package/payload/plugins/toolkit/skills/review-with-runtime-evidence/references/contracts.md +114 -0
  283. package/payload/plugins/toolkit/skills/review-with-runtime-evidence/scripts/classify-runtime-verdict.mjs +140 -0
  284. package/payload/plugins/toolkit/skills/review-with-runtime-evidence/scripts/run-static-review.mjs +389 -0
  285. package/payload/plugins/toolkit/skills/review-with-runtime-evidence/scripts/static-review-contract.mjs +243 -0
  286. package/payload/plugins/toolkit/skills/run-test-cases/SKILL.md +63 -0
  287. package/payload/plugins/toolkit/skills/runweave-change-validation/SKILL.md +196 -0
  288. package/payload/plugins/toolkit/skills/runweave-change-validation/agents/openai.yaml +7 -0
  289. package/payload/plugins/toolkit/skills/runweave-change-validation/scripts/assert-dev-session-status.mjs +181 -0
  290. package/payload/plugins/toolkit/skills/runweave-dev-session/SKILL.md +126 -0
  291. package/payload/plugins/toolkit/skills/runweave-dev-session/agents/openai.yaml +7 -0
  292. package/payload/plugins/toolkit/skills/runweave-management/SKILL.md +47 -0
  293. package/payload/plugins/toolkit/skills/scheduled-task/SKILL.md +35 -0
  294. package/payload/plugins/toolkit/skills/shadcn/SKILL.md +245 -0
  295. package/payload/plugins/toolkit/skills/shadcn/agents/openai.yml +5 -0
  296. package/payload/plugins/toolkit/skills/shadcn/assets/shadcn-small.png +0 -0
  297. package/payload/plugins/toolkit/skills/shadcn/assets/shadcn.png +0 -0
  298. package/payload/plugins/toolkit/skills/shadcn/cli.md +276 -0
  299. package/payload/plugins/toolkit/skills/shadcn/customization.md +209 -0
  300. package/payload/plugins/toolkit/skills/shadcn/evals/evals.json +47 -0
  301. package/payload/plugins/toolkit/skills/shadcn/mcp.md +94 -0
  302. package/payload/plugins/toolkit/skills/shadcn/rules/base-vs-radix.md +310 -0
  303. package/payload/plugins/toolkit/skills/shadcn/rules/composition.md +197 -0
  304. package/payload/plugins/toolkit/skills/shadcn/rules/forms.md +198 -0
  305. package/payload/plugins/toolkit/skills/shadcn/rules/icons.md +101 -0
  306. package/payload/plugins/toolkit/skills/shadcn/rules/styling.md +163 -0
  307. package/payload/plugins/toolkit/skills/suiji/SKILL.md +54 -0
  308. package/payload/plugins/toolkit/skills/suiji/references/api.md +72 -0
  309. package/payload/plugins/toolkit/skills/suiji/references/source-adapter.md +40 -0
  310. package/payload/plugins/toolkit/skills/suiji/references/work-records.md +36 -0
  311. package/payload/plugins/toolkit/skills/suiji/scripts/source_adapter.py +46 -0
  312. package/payload/plugins/toolkit/skills/suiji/scripts/suiji.py +358 -0
  313. package/payload/plugins/toolkit/skills/suiji/scripts/work_records.py +328 -0
  314. package/payload/plugins/toolkit/skills/suiji/scripts/work_reports.py +75 -0
  315. package/payload/plugins/toolkit/skills/sync-branch-hard-reset/SKILL.md +59 -0
  316. package/payload/plugins/toolkit/skills/update-runweave-backend/SKILL.md +90 -0
  317. package/payload/plugins/toolkit/skills/update-runweave-backend/agents/openai.yaml +4 -0
  318. package/payload/plugins/toolkit/skills/update-runweave-backend/references/npm-update.md +68 -0
  319. package/payload/plugins/toolkit/skills/update-runweave-backend/references/systemd.md +34 -0
  320. package/payload/plugins/toolkit/skills/update-runweave-desktop/SKILL.md +102 -0
  321. package/payload/plugins/toolkit/skills/update-runweave-ios/SKILL.md +16 -0
  322. package/payload/plugins/toolkit/skills/update-runweave-ios/references/ios-wireless-recovery.md +54 -0
  323. package/payload/plugins/toolkit/skills/using-rw/SKILL.md +265 -0
  324. package/payload/plugins/toolkit/skills/write-plan/SKILL.md +72 -0
  325. package/payload/plugins/toolkit/skills/write-test-cases/SKILL.md +100 -0
  326. package/payload/plugins/toolkit/skills/write-test-cases/assets/test-plan-template.yaml +15 -0
  327. package/payload/plugins/toolkit/skills/write-test-cases/references/coverage-checklist.md +75 -0
  328. package/payload/plugins/toolkit/skills/write-test-cases/references/design-techniques.md +91 -0
  329. package/payload/plugins/toolkit/skills/youtube-reading/SKILL.md +35 -0
  330. package/payload/plugins/toolkit/skills/youtube-reading/agents/openai.yaml +4 -0
  331. package/payload/plugins/toolkit/skills/youtube-reading/assets/runtime-lock.json +92 -0
  332. package/payload/plugins/toolkit/skills/youtube-reading/references/content-contract.md +52 -0
  333. package/payload/plugins/toolkit/skills/youtube-reading/references/setup.md +70 -0
  334. package/payload/plugins/toolkit/skills/youtube-reading/requirements.lock +9 -0
  335. package/payload/plugins/toolkit/skills/youtube-reading/scripts/artifacts.py +206 -0
  336. package/payload/plugins/toolkit/skills/youtube-reading/scripts/runtime.py +424 -0
  337. package/payload/plugins/toolkit/skills/youtube-reading/scripts/youtube_reading.py +314 -0
  338. package/payload/plugins/toolkit-release.json +1 -0
  339. package/payload/scripts/toolkit/codex-state.mjs +75 -0
  340. package/payload/scripts/toolkit/release.mjs +210 -0
  341. package/payload/scripts/toolkit/sync-runtime.mjs +108 -0
  342. package/payload/scripts/toolkit/sync.mjs +585 -0
  343. package/payload/frontend/dist/assets/channel-Bf3IeONI.js +0 -1
  344. package/payload/frontend/dist/assets/classDiagram-6PBFFD2Q-CFsG2SvG.js +0 -1
  345. package/payload/frontend/dist/assets/classDiagram-v2-HSJHXN6E-CFsG2SvG.js +0 -1
  346. package/payload/frontend/dist/assets/clone-CeQXm2YN.js +0 -1
  347. package/payload/frontend/dist/assets/connection-XriXysSc.js +0 -12
  348. package/payload/frontend/dist/assets/main-Cg6Oo1xK.css +0 -33
  349. package/payload/frontend/dist/assets/main-H5R-3_w1.js +0 -696
  350. package/payload/frontend/dist/assets/stateDiagram-v2-QKLJ7IA2-CzpdUl_0.js +0 -1
  351. package/payload/frontend/dist/assets/suiji-CO_L5W1X.js +0 -1
@@ -0,0 +1,326 @@
1
+ /* A portable renderer: task content is always text, never markup. */
2
+ /* global document, matchMedia, location, addEventListener, console */
3
+ (() => {
4
+ "use strict";
5
+ const byId = (id) => document.getElementById(id);
6
+ const el = (tag, text, className) => {
7
+ const node = document.createElement(tag);
8
+ if (text !== undefined) node.textContent = text;
9
+ if (className) node.className = className;
10
+ return node;
11
+ };
12
+ try {
13
+ const data = JSON.parse(byId("gallery-data").textContent);
14
+ const assets = new Map(data.assets.map((asset) => [asset.id, asset]));
15
+ const viewer = el("dialog", undefined, "asset-viewer");
16
+ viewer.setAttribute("aria-labelledby", "asset-title");
17
+ const toolbar = el("div", undefined, "asset-toolbar");
18
+ const title = el("h2");
19
+ title.id = "asset-title";
20
+ const zoom = el("button", "实际尺寸");
21
+ zoom.type = "button";
22
+ zoom.setAttribute("aria-pressed", "false");
23
+ const close = el("button", "关闭原始材料");
24
+ close.type = "button";
25
+ const content = el("div", undefined, "asset-content");
26
+ let returnFocus;
27
+ toolbar.append(title, zoom, close);
28
+ viewer.append(toolbar, content);
29
+ document.body.append(viewer);
30
+ close.addEventListener("click", () => viewer.close());
31
+ viewer.addEventListener("close", () => {
32
+ document.body.classList.remove("viewing-asset");
33
+ returnFocus?.focus({ preventScroll: true });
34
+ });
35
+ zoom.addEventListener("click", () => {
36
+ const actual = viewer.classList.toggle("actual-size");
37
+ zoom.textContent = actual ? "适应屏幕" : "实际尺寸";
38
+ zoom.setAttribute("aria-pressed", String(actual));
39
+ });
40
+ const link = (label, asset) => {
41
+ const node = el("a", label);
42
+ node.href = asset.path;
43
+ node.addEventListener("click", (event) => {
44
+ event.preventDefault();
45
+ returnFocus = node;
46
+ title.textContent = asset.label;
47
+ content.replaceChildren();
48
+ viewer.classList.remove("actual-size");
49
+ zoom.hidden = asset.kind !== "image";
50
+ zoom.textContent = "实际尺寸";
51
+ zoom.setAttribute("aria-pressed", "false");
52
+ if (asset.kind === "image") {
53
+ const img = el("img");
54
+ img.src = asset.path;
55
+ img.alt = asset.label;
56
+ content.append(img);
57
+ } else content.append(el("pre", asset.text, "text-evidence"));
58
+ viewer.showModal();
59
+ document.body.classList.add("viewing-asset");
60
+ content.scrollTop = 0;
61
+ content.scrollLeft = 0;
62
+ close.focus();
63
+ });
64
+ return node;
65
+ };
66
+ const pageNodes = [],
67
+ headings = [],
68
+ directoryLinks = [];
69
+ let selected = 0,
70
+ expanded = false;
71
+ const types = {
72
+ single: "单图",
73
+ compare: "对照",
74
+ sequence: "关键状态",
75
+ text: "文字证据",
76
+ };
77
+ const limits = (values) => {
78
+ const box = el("div", undefined, "limits");
79
+ const list = el("ul");
80
+ values.forEach((value) => list.append(el("li", value)));
81
+ box.append(list);
82
+ return box;
83
+ };
84
+ const origin = (asset) => {
85
+ const { surface, capturedAt, sourceRef } = asset.origin;
86
+ return `来源:${surface || "未记录运行端"} · 时间:${capturedAt || "未记录"} · ${sourceRef || "未记录来源位置"}`;
87
+ };
88
+ const media = (item) => {
89
+ const asset = assets.get(item.assetId);
90
+ const figure = el("figure");
91
+ const caption = el("figcaption");
92
+ caption.append(
93
+ el("strong", item.label),
94
+ link(asset.kind === "image" ? "打开原图" : "打开原文", asset),
95
+ );
96
+ figure.append(caption);
97
+ if (asset.kind === "text") {
98
+ figure.append(el("pre", asset.text, "text-evidence"));
99
+ return figure;
100
+ }
101
+ const stage = el("div", undefined, "image-stage");
102
+ const anchor = link("", asset);
103
+ anchor.setAttribute("aria-label", `打开原图:${item.label}`);
104
+ const img = el("img");
105
+ img.alt = item.alt;
106
+ img.width = asset.width;
107
+ img.height = asset.height;
108
+ img.addEventListener("error", () => {
109
+ stage.replaceChildren(
110
+ el(
111
+ "p",
112
+ `图片不可用:${item.label}。请核对成果目录中的原图文件。`,
113
+ "media-error",
114
+ ),
115
+ );
116
+ });
117
+ if (item.crop) {
118
+ const crop = item.crop;
119
+ const viewport = el("div", undefined, "crop");
120
+ viewport.style.width = `${crop.width}px`;
121
+ viewport.style.aspectRatio = `${crop.width} / ${crop.height}`;
122
+ img.style.width = `${(asset.width / crop.width) * 100}%`;
123
+ img.style.left = `${(-crop.x / crop.width) * 100}%`;
124
+ img.style.top = `${(-crop.y / crop.height) * 100}%`;
125
+ viewport.append(img);
126
+ anchor.append(viewport);
127
+ } else anchor.append(img);
128
+ img.src = asset.path;
129
+ stage.append(anchor);
130
+ figure.append(stage);
131
+ if (item.crop)
132
+ figure.append(el("p", "局部取景 · 完整原图保持不变", "crop-note"));
133
+ figure.append(el("p", asset.origin.surface || "运行端未记录", "origin"));
134
+ return figure;
135
+ };
136
+ byId("task-title").textContent = data.task.title;
137
+ byId("task-scope").textContent = data.task.scope;
138
+ byId("material-kind").textContent =
139
+ data.task.materialKind === "historical" ? "历史示例" : "当前任务";
140
+ if (data.task.limitations.length) {
141
+ byId("task-limits").hidden = false;
142
+ data.task.limitations.forEach((value) =>
143
+ byId("task-limits").querySelector("ul").append(el("li", value)),
144
+ );
145
+ }
146
+ data.pages.forEach((page, index) => {
147
+ const section = el("article", undefined, "page");
148
+ section.id = `page-${page.id}`;
149
+ section.dataset.pageId = page.id;
150
+ section.dataset.type = page.type;
151
+ section.setAttribute("aria-labelledby", `heading-${page.id}`);
152
+ const heading = el("h2", page.title, "page-heading");
153
+ heading.id = `heading-${page.id}`;
154
+ heading.tabIndex = -1;
155
+ section.append(
156
+ el(
157
+ "p",
158
+ `${String(index + 1).padStart(2, "0")} / ${types[page.type]}`,
159
+ "eyebrow",
160
+ ),
161
+ heading,
162
+ );
163
+ if (page.evidenceState !== "observed")
164
+ section.append(
165
+ el(
166
+ "p",
167
+ page.evidenceState === "not-run" ? "此项未执行" : "此项证据不足",
168
+ "evidence-label",
169
+ ),
170
+ );
171
+ section.append(el("p", page.description, "description"));
172
+ if (page.limitations?.length) section.append(limits(page.limitations));
173
+ if (page.type === "sequence")
174
+ section.append(
175
+ el(
176
+ "p",
177
+ "以下为离散关键状态,不代表连续录像或实际等待时长。",
178
+ "sequence-note",
179
+ ),
180
+ );
181
+ const grid = el("div", undefined, `media-grid ${page.type}`);
182
+ page.items.forEach((item) => grid.append(media(item)));
183
+ section.append(grid);
184
+ if (page.lookAt)
185
+ section.append(el("p", `看这里:${page.lookAt}`, "look-at"));
186
+ const details = el("details", undefined, "sources");
187
+ details.append(el("summary", "查看来源与条件"));
188
+ const ids = new Set([
189
+ ...page.items.map((item) => item.assetId),
190
+ ...page.sourceIds,
191
+ ]);
192
+ ids.forEach((id) => {
193
+ const asset = assets.get(id);
194
+ const item = el("div", undefined, "source-item");
195
+ item.append(link(asset.label, asset), el("p", origin(asset)));
196
+ if (asset.kind === "text")
197
+ item.append(el("pre", asset.text, "text-evidence"));
198
+ details.append(item);
199
+ });
200
+ section.append(details);
201
+ byId("pages").append(section);
202
+ pageNodes.push(section);
203
+ headings.push(heading);
204
+ const entry = el("a");
205
+ entry.href = `#page=${page.id}`;
206
+ entry.append(
207
+ el("span", String(index + 1).padStart(2, "0")),
208
+ el("span", page.title),
209
+ );
210
+ entry.addEventListener("click", (event) => {
211
+ event.preventDefault();
212
+ select(index, true);
213
+ if (matchMedia("(max-width:760px)").matches)
214
+ byId("directory-details").open = false;
215
+ });
216
+ byId("directory").append(entry);
217
+ directoryLinks.push(entry);
218
+ });
219
+ function render(focus = false) {
220
+ pageNodes.forEach((node, i) => {
221
+ node.hidden = !expanded && i !== selected;
222
+ });
223
+ directoryLinks.forEach((node, i) => {
224
+ if (i === selected) node.setAttribute("aria-current", "page");
225
+ else node.removeAttribute("aria-current");
226
+ });
227
+ const total = data.pages.length;
228
+ byId("page-count").textContent = `${selected + 1} / ${total}`;
229
+ byId("page-name").textContent = data.pages[selected].title;
230
+ byId("previous").disabled = selected === 0;
231
+ byId("next").disabled = selected === total - 1;
232
+ byId("navigation").hidden = total === 1 || expanded;
233
+ byId("expand").hidden = total === 1;
234
+ byId("expand").textContent = expanded ? "返回分页" : "展开全部";
235
+ byId("expand").setAttribute("aria-pressed", String(expanded));
236
+ document.body.classList.toggle("expanded", expanded);
237
+ document.body.classList.toggle("single-task", total === 1);
238
+ byId("announcement").textContent =
239
+ `${expanded ? "全部展开,当前定位" : "第"} ${selected + 1} / ${total} 页:${data.pages[selected].title}`;
240
+ if (focus) {
241
+ headings[selected].focus({ preventScroll: true });
242
+ pageNodes[selected].scrollIntoView({ block: "start" });
243
+ }
244
+ }
245
+ function select(index, focus) {
246
+ selected = Math.max(0, Math.min(data.pages.length - 1, index));
247
+ const hash = `#page=${data.pages[selected].id}`;
248
+ if (location.hash !== hash) location.hash = hash;
249
+ byId("notice").hidden = true;
250
+ render(focus);
251
+ }
252
+ function readHash(focus) {
253
+ let id = "";
254
+ try {
255
+ id = decodeURIComponent(location.hash.replace(/^#page=/, ""));
256
+ } catch {
257
+ id = "invalid";
258
+ }
259
+ const index = data.pages.findIndex((page) => page.id === id);
260
+ if (location.hash && index < 0) {
261
+ select(0, focus);
262
+ byId("notice").textContent = "没有找到该页,已返回第一页。";
263
+ byId("notice").hidden = false;
264
+ } else {
265
+ selected = Math.max(0, index);
266
+ render(focus);
267
+ }
268
+ }
269
+ byId("previous").addEventListener("click", () =>
270
+ select(selected - 1, true),
271
+ );
272
+ byId("next").addEventListener("click", () => select(selected + 1, true));
273
+ document.querySelector(".skip-link").addEventListener("click", (event) => {
274
+ event.preventDefault();
275
+ render(true);
276
+ });
277
+ byId("expand").addEventListener("click", () => {
278
+ expanded = !expanded;
279
+ render(!expanded);
280
+ });
281
+ addEventListener("hashchange", () => readHash(true));
282
+ addEventListener("keydown", (event) => {
283
+ if (
284
+ viewer.open ||
285
+ expanded ||
286
+ event.altKey ||
287
+ event.ctrlKey ||
288
+ event.metaKey ||
289
+ event.shiftKey ||
290
+ event.target.closest(
291
+ "input,textarea,select,[contenteditable]:not([contenteditable=false]),pre",
292
+ )
293
+ )
294
+ return;
295
+ if (event.key === "ArrowRight" || event.key === "ArrowLeft") {
296
+ event.preventDefault();
297
+ select(selected + (event.key === "ArrowRight" ? 1 : -1), true);
298
+ }
299
+ });
300
+ let printDetails = [];
301
+ addEventListener("beforeprint", () => {
302
+ printDetails = [...document.querySelectorAll("details")].map((node) => [
303
+ node,
304
+ node.open,
305
+ ]);
306
+ printDetails.forEach(([node]) => {
307
+ node.open = true;
308
+ });
309
+ });
310
+ addEventListener("afterprint", () =>
311
+ printDetails.forEach(([node, open]) => {
312
+ node.open = open;
313
+ }),
314
+ );
315
+ if (matchMedia("(max-width:760px)").matches)
316
+ byId("directory-details").open = false;
317
+ readHash(false);
318
+ } catch (error) {
319
+ byId("pages").replaceChildren(
320
+ el("p", "材料无法读取。请从 task.json 重新校验并生成成果。", "fatal"),
321
+ );
322
+ byId("navigation").hidden = true;
323
+ byId("expand").hidden = true;
324
+ console.error("Gallery render failed", error);
325
+ }
326
+ })();
@@ -0,0 +1,55 @@
1
+ /* Keep original assets inside the reader; preview sandboxes may block popups. */
2
+ body.viewing-asset {
3
+ overflow: hidden;
4
+ }
5
+ .asset-viewer {
6
+ width: min(96vw, 1100px);
7
+ max-width: 96vw;
8
+ max-height: 94dvh;
9
+ padding: 0;
10
+ border: 1px solid #cbd5e1;
11
+ border-radius: 12px;
12
+ background: #fff;
13
+ color: #172033;
14
+ }
15
+ .asset-viewer::backdrop {
16
+ background: rgb(10 18 32 / 78%);
17
+ }
18
+ .asset-toolbar {
19
+ display: flex;
20
+ align-items: center;
21
+ flex-wrap: wrap;
22
+ gap: 8px;
23
+ padding: 12px;
24
+ border-bottom: 1px solid #d9e2ee;
25
+ }
26
+ .asset-toolbar h2 {
27
+ flex: 1 1 180px;
28
+ margin: 0;
29
+ font-size: 16px;
30
+ overflow-wrap: anywhere;
31
+ }
32
+ .asset-content {
33
+ max-height: 70dvh;
34
+ overflow: auto;
35
+ padding: 12px;
36
+ }
37
+ .asset-content img {
38
+ display: block;
39
+ max-width: 100%;
40
+ max-height: 65dvh;
41
+ width: auto;
42
+ height: auto;
43
+ margin: auto;
44
+ object-fit: contain;
45
+ }
46
+ .asset-viewer.actual-size img {
47
+ max-width: none;
48
+ max-height: none;
49
+ margin: 0;
50
+ }
51
+ @media print {
52
+ .asset-viewer {
53
+ display: none;
54
+ }
55
+ }
@@ -0,0 +1,8 @@
1
+ ---
2
+ name: acceptance-gallery
3
+ description: 兼容 acceptance-gallery 旧名称,将图文材料请求转到 toolkit:acceptance。仅用于旧名称兼容;新请求使用统一入口。
4
+ ---
5
+
6
+ # 旧名称兼容
7
+
8
+ 读取[统一验收材料 Skill](../acceptance/SKILL.md),按用户本次范围执行。旧名称表示本次偏好图文,不扩大授权,不额外制作用户未要求的产物。原有脚本路径转发到统一实现。
@@ -0,0 +1,6 @@
1
+ interface:
2
+ display_name: "acceptance-gallery(兼容)"
3
+ short_description: "旧名称兼容入口,当前规则与实现统一维护在验收材料 Skill 中"
4
+ default_prompt: "使用 $acceptance,按我请求的图文形式交付本次验收材料。"
5
+ policy:
6
+ allow_implicit_invocation: false
@@ -0,0 +1,3 @@
1
+ # 兼容引用
2
+
3
+ 当前规则已迁入统一验收材料 Skill,见[对应说明](../../acceptance/references/gallery-copy.md)。请按当前入口选择图文、视频或原始录屏,不在此维护第二套规则。
@@ -0,0 +1,3 @@
1
+ # 兼容引用
2
+
3
+ 当前规则已迁入统一验收材料 Skill,见[对应说明](../../acceptance/references/gallery-contract.md)。请按当前入口选择图文、视频或原始录屏,不在此维护第二套规则。
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env python3
2
+ """Compatibility path; canonical implementation lives in the acceptance skill."""
3
+ from pathlib import Path
4
+ import runpy
5
+ import sys
6
+ sys.dont_write_bytecode = True
7
+ script = Path(__file__).resolve().parents[2] / 'acceptance' / 'scripts' / 'gallery.py'
8
+ sys.path.insert(0, str(script.parent))
9
+ runpy.run_path(str(script), run_name='__main__')
@@ -0,0 +1,8 @@
1
+ ---
2
+ name: acceptance-video
3
+ description: 兼容 acceptance-video 旧名称,将验收视频请求转到 toolkit:acceptance。仅用于旧名称兼容;新请求使用统一入口。
4
+ ---
5
+
6
+ # 旧名称兼容
7
+
8
+ 读取[统一验收材料 Skill](../acceptance/SKILL.md),按用户本次范围执行。旧名称表示本次偏好视频,不扩大授权,不额外制作用户未要求的产物。原有脚本路径转发到统一实现。
@@ -0,0 +1,6 @@
1
+ interface:
2
+ display_name: "acceptance-video(兼容)"
3
+ short_description: "旧名称兼容入口,当前规则与实现统一维护在验收材料 Skill 中"
4
+ default_prompt: "使用 $acceptance,按我请求的视频形式交付本次验收材料。"
5
+ policy:
6
+ allow_implicit_invocation: false
@@ -0,0 +1,3 @@
1
+ # 兼容引用
2
+
3
+ 当前规则已迁入统一验收材料 Skill,见[对应说明](../../acceptance/references/video.md)。请按当前入口选择图文、视频或原始录屏,不在此维护第二套规则。
@@ -0,0 +1,3 @@
1
+ # 兼容引用
2
+
3
+ 当前规则已迁入统一验收材料 Skill,见[对应说明](../../acceptance/references/delivery.md)。请按当前入口选择图文、视频或原始录屏,不在此维护第二套规则。
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env python3
2
+ """Compatibility path; canonical implementation lives in the acceptance skill."""
3
+ from pathlib import Path
4
+ import runpy
5
+ import sys
6
+ sys.dont_write_bytecode = True
7
+ script = Path(__file__).resolve().parents[2] / 'acceptance' / 'scripts' / 'capture.py'
8
+ sys.path.insert(0, str(script.parent))
9
+ runpy.run_path(str(script), run_name='__main__')
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env python3
2
+ """Compatibility path; canonical implementation lives in the acceptance skill."""
3
+ from pathlib import Path
4
+ import runpy
5
+ import sys
6
+ sys.dont_write_bytecode = True
7
+ script = Path(__file__).resolve().parents[2] / 'acceptance' / 'scripts' / 'video.py'
8
+ sys.path.insert(0, str(script.parent))
9
+ runpy.run_path(str(script), run_name='__main__')
@@ -0,0 +1,86 @@
1
+ ---
2
+ name: agent-device
3
+ description: 使用 agent-device CLI 在 iOS 模拟器和真机上复现问题、检查修复及执行有 Agent 监督的原生 UI 验收;提供设备预检、独立会话和证据记录。Web 页面使用 playwright-cli,固定 XCTest 回归保持原入口。
4
+ ---
5
+
6
+ # iOS 交互验收
7
+
8
+ 用真实界面完成用户指定流程,并核对每个关键动作的结果。已验证工具版本为 **agent-device 0.21.3**;本技能的辅助脚本只支持 iOS,不把上游其他平台能力当作已验证能力。它是交互取证入口,不是无人值守 CI 或业务通过判定器。
9
+
10
+ ## 建立目标
11
+
12
+ 1. 先读工作区和目标包的 AGENTS.md。区分已安装 App 验收与当前代码验收;后者先按包入口构建、安装,记录产物来源。Runweave Native 是 `com.runweave.app.native`,独立随记是 `com.runweave.suiji`。
13
+ 2. 用 `xcrun simctl list devices` 或 `xcrun devicectl list devices` 发现设备;真机硬件 UDID 可从 `xcrun devicectl device info details --device <发现的ID> --json-output <本机文件>` 获得。必须指定目标,不以同名设备或第一台设备替代。
14
+ 3. Runweave 仓库的模拟器先运行 `node scripts/ios-simulators/cli.mjs start --app runweave --task-dir <绝对任务路径> --json`,随记将 app 参数改为 suiji;再按对应 iOS 包入口 `run --task-dir <同一目录>` 构建安装。使用本次返回的 UDID;两个 App 均可使用池中任一设备,所有 linked worktree 共用两台设备。两台都忙且安全回收失败时等待,不新建或克隆。其他项目仍遵循各自设备策略。
15
+ 4. 选择独立任务目录,通常为工作区 `.runweave/mobile-qa/<任务名>`。Runweave 模拟器使用 start 已创建的目录;其他目标由辅助脚本首次创建目录并固定设备、App 和随机 session;已有目录不覆盖。真机签名读 [iOS 准备与恢复](references/ios-setup.md)。
16
+
17
+ 下面的 `SKILL_DIR` 是本次实际加载的技能目录;`RUN_DIR` 是绝对路径。将示例占位符换成刚确认的目标:
18
+
19
+ ```bash
20
+ python3 "$SKILL_DIR/scripts/device.py" init "$RUN_DIR" \
21
+ --kind device --udid "$IOS_UDID" --app com.runweave.suiji \
22
+ --team-id "$IOS_TEAM_ID"
23
+ # 模拟器改为 --kind simulator,省略签名参数;先启动本任务拥有的模拟器。
24
+ python3 "$SKILL_DIR/scripts/device.py" check "$RUN_DIR"
25
+ python3 "$SKILL_DIR/scripts/device.py" run "$RUN_DIR" -- open --foreground
26
+ ```
27
+
28
+ 真机 UI 自动化固定共用 `com.runweave.agentdevice`,签名团队登记于 `~/.runweave/agent-device/runners/`。只传 `--team-id` 即可;显式 `--runner-id` 只允许这个固定值,禁止按 App、日期或任务新建身份。旧任务的其他 Runner ID 只允许 stop,不再用于 UI;重新 init 使用共享身份。任务仍保留独立 session 和证据目录。真机从首次托管 run 到 stop 持有跨 worktree 的设备锁;失败保留归属,使用原 task-dir stop,不按 PID 消失抢锁。
29
+
30
+ 辅助脚本要求 PATH 上的 CLI 版本匹配;不会自动安装、升级或启用权限。预检只检查当前工具与目标可达性,**不证明签名可安装、UI Automation 已授权或没有其他 XCTest 占用**。先检查已知运行任务,冲突时等待占用者结束;项目配置了设备池时不得另建设备绕过,不能杀掉他人 runner。首次 open 只有返回真实目标树后才证明本轮连接可用。
31
+
32
+ ## 无线更新后的仅启动检查
33
+
34
+ 真机无线 `localNetwork` 与 USB `wired` 均可使用,不把 USB 作为硬性前置。区分两个目标:
35
+
36
+ - **安装/更新后启动 App**:按原生包入口完成构建安装、核对产物后,用 `launch` 直接走 CoreDevice,不创建 XCTest runner。可用不带 `--team-id` / `--runner-id` 的新任务目录执行 `init --kind device --udid <硬件UDID> --app <BundleID>`;这里只省略自动化 runner 签名,产品 App 的安装签名要求不变。
37
+ - **页面操作或 UI 验收**:仍使用带 runner 签名的任务和 `run -- open --foreground`、快照及实际交互;不能用 `launch` 替代。操作前确认没有其他任务正在使用目标手机。
38
+
39
+ ```bash
40
+ python3 "$SKILL_DIR/scripts/device.py" launch "$RUN_DIR"
41
+ ```
42
+
43
+ `launch` 不安装、不强制重启、不自动重试;返回本次设备连接方式、进程 PID 和原生结果文件,明确标记 `uiVerified: false` / `automationReady: false`。它不启动 agent-device daemon,纯 launch 任务无需 `stop`。无线启动成功不等于 UI 自动化可用,更不等于完整更新/业务验收通过。
44
+
45
+ `open` 失败时,包装器检查**本次调用新增**的 runner 日志;code 74 / IDE 通道断开会返回 `ios_xctest_bootstrap_failed` 诊断及日志位置,不再仅依赖笼统的连接超时提示。原错误退出状态保留,不自动降级为 launch 成功,不自动重放动作。私密命令不写额外诊断文件。无线 XCTest 失败不阻止另行执行明确的仅启动检查;只有确实需要 UI 时才排查无线调试链路或选择 USB 对照。
46
+
47
+ ## 操作与判定
48
+
49
+ ```bash
50
+ python3 "$SKILL_DIR/scripts/device.py" run "$RUN_DIR" -- snapshot -i
51
+ python3 "$SKILL_DIR/scripts/device.py" run "$RUN_DIR" -- press @e12 --settle
52
+ python3 "$SKILL_DIR/scripts/device.py" run "$RUN_DIR" -- wait 'role="button" label="预期控件"' 5000
53
+ python3 "$SKILL_DIR/scripts/device.py" run "$RUN_DIR" -- snapshot --json
54
+ python3 "$SKILL_DIR/scripts/device.py" run "$RUN_DIR" -- screenshot "$RUN_DIR/final.png"
55
+ ```
56
+
57
+ - 使用最新快照或差异中的 ref;UI 变化后旧 ref 不再可靠。同名控件加 role 或读取完整树确认唯一目标。需要其他命令时读已安装版本的 `agent-device help <command>`。
58
+ - `snapshot -i` 会省略真实可见控件。找不到按钮、命中父容器或标签歧义时,读取完整 `snapshot --json`;必要时查看截图,用已观察到的边界选点。卡片中有链接或完成按钮时避开重叠区域,不能盲点卡片中心。
59
+ - 快照可能仍来自绑定 App,而屏幕已跳到浏览器。跨 App 跳转、点击后无变化或树与预期矛盾时,实际查看 screenshot,再决定是否重新 `open --foreground` 返回目标。截图像素与树的逻辑坐标可能有倍率差异。
60
+ - `open` exit 0 可能带初始快照失败警告;`--settle` 超时和 `XCTEST_RECORDED_FAILURE` 都可能发生在动作已生效之后。**先重新观察实际状态,再决定下一步;对保存、删除、完成待办等写操作,不因报错自动重试。** 必要时用获授权的只读 API 确認记录 ID、版本或删除状态。
61
+ - 包装器将上游初始快照失败和 settle 超时转为非零退出,但不能识别所有业务失败。命令成功、元素存在、截图都不是业务后置条件的替代品。
62
+ - 账号和环境沿用用户意图。正式数据优先只读;草稿验证先确认空白或隔离原草稿,使用唯一标记,验收后清理自己的草稿。不保存测试记录到正式服务,除非任务已授权该写入。
63
+ - 登录优先由用户在设备输入凭据。不得将密码、token 写进技能、脚本、配置、回放或 Git。截图/树可能含用户内容,证据留在本机任务目录;敏感步骤用 `run "$RUN_DIR" --private -- <命令>` 跳过包装器输出落盘,但它不保证上游 daemon 没有日志,不能当成密码保密方案。
64
+ - 验证重启恢复时明确使用 `open --relaunch`,等自动连接完成,再检查登录和草稿;普通 open/close 不能替代进程重启。
65
+
66
+ ## 录制、收尾与交付
67
+
68
+ 只有需要可重复流程时才录制:关闭现有会话后,用 fresh session 的 `open --foreground --save-script "$RUN_DIR/flow.ad"` 开始,完成必要状态断言,再执行 `session save-script`。检查生成脚本:失败动作可能没被录入,敏感输入不能进入脚本。
69
+
70
+ 从明确前置状态执行 `replay "$RUN_DIR/flow.ad" --json`;保留原始结果和实际步骤数。遇到 `REPLAY_DIVERGENCE/identity-mismatch`,读取新树分析或重新录制,不删除身份元数据来制造通过。一次回放成功不证明 CI 稳定性;自动录制 `.ad` 是本机产物,不替代仓库 YAML 验收合同。
71
+
72
+ ```bash
73
+ python3 "$SKILL_DIR/scripts/device.py" stop "$RUN_DIR"
74
+ ```
75
+
76
+ Runweave 模拟器完成任务后执行 `node scripts/ios-simulators/cli.mjs finish --task-dir <任务目录> --json`;它清理本任务自动化并释放 lease,异常恢复按仓库 `docs/cli/ios-simulators.md`。
77
+
78
+ stop 只清理该任务 state-dir 的会话、daemon 和 runner,不卸载 App,也不关闭模拟器。仅在本任务创建/拥有的模拟器上另行 shutdown。签名执行器按用户意图保留,不能为腾名额自动卸载其他 App。
79
+
80
+ 交付说明:测试的设备、App/构建来源、业务后置条件及证据、失败/未执行项、清理结果。任务目录的 `metrics.jsonl` 只记录命令类型、耗时和退出码,不记录命令参数;编号 `.log` 是 CLI 原始输出。业务结论由 Agent 结合实际状态填写,不把命令 exit 0 自动标成用例通过。
81
+
82
+ ## 历史产物维护
83
+
84
+ 使用技能的 `scripts/resources.py status --workspace <仓库路径>` 查看任务与 Runner 缓存,`prune --workspace <仓库路径>` 先生成回收清单,`prune --workspace <仓库路径> --apply` 执行。任务及 `~/.agent-device/logs/qa-*` 自动化日志分别保留最近 20 个、14 天且各不超过 1 GiB;设备锁保护的任务和对应日志不删除。每个签名团队/平台只保留最新共享 Runner 构建;旧身份缓存删除。清理时有 Xcode/XCTest/Agent Device 进程则阻塞,不终止其他任务。stop 成功后自动按这些上限回收已登记任务与缓存;手动 prune 可跨 linked worktree 发现历史目录。其他活动任务导致清理推迟时,会给出提示,随后执行 prune;仅更新脚本不会回收历史磁盘。
85
+
86
+ `--all-history --apply` 是维护者明确要求删除全部历史证据时的一次性入口,不用于日常收尾。该入口额外删除仓库 `.runweave` 下由 Xcode `info.plist` 与 Build 目录确认的历史 DerivedData;保留当前包 `.build`。它仍保留占用任务和共享 Runner 构建,不卸载产品 App,不擦除模拟器,也不删除业务数据库。工具不会自动卸载手机上的旧 Runner;迁移时核对空闲、明确 Bundle ID 清单,再由维护者卸载。小型清理清单位于 `~/.runweave/agent-device/last-cleanup.json`。
@@ -0,0 +1,4 @@
1
+ interface:
2
+ display_name: "iOS Agent Device"
3
+ short_description: "用独立设备会话完成 iOS 交互验收,保存证据并确认动作结果"
4
+ default_prompt: "使用 $agent-device 验证指定 iOS App 的功能,记录真实后置状态、失败和清理结果。"
@@ -0,0 +1,36 @@
1
+ # iOS 准备与恢复
2
+
3
+ ## 工具与签名
4
+
5
+ 验证基线:agent-device 0.21.3、Node 22.12+、macOS/Xcode。先用已安装 CLI 的 `help physical-device` 和 `help <command>` 核对行为。需要安装时使用 `npm install -g agent-device@0.21.3`;若本机 npm 是内部镜像 shim,检查 `command -v npm` 后可直接调用当前 Node 安装的 `npm-cli.js` 并指定官方 registry,不修改全局 registry。
6
+
7
+ 真机需要信任配对、Developer Mode、可用签名、设备连接与必要的解锁。`DevToolsSecurity -status` 为 disabled 时,按当前任务已有授权处理;启用需要管理员权限,系统密码由用户在系统界面输入。不能把全部连接超时都归因于锁屏或 UI Automation 提示。
8
+
9
+ 从当前工程/有效 provisioning profile 确认 Team ID,**证书名称括号里的 ID 不一定是 provisioning 的 Team ID**。真机自动化复用固定 `com.runweave.agentdevice`,基础 App 与 `com.runweave.agentdevice.uitests.xctrunner` 都需要可用签名;不要改变产品 App 的 Bundle ID 或重签成新安装。
10
+
11
+ 若 CLI `xcodebuild` 报 `No Accounts`,先检查 Xcode Apple Accounts,不能直接断言用户未登录。GUI 已登录而新描述文件缺失时,可复制上游包内 `dist/apple` 到本机任务目录(保留相对 Swift package 路径),仅修改副本的 Team,基础 Bundle ID 固定为共享身份,用 Xcode Signing & Capabilities 自动签名,并在指定真机上 Build For Testing。成功后再回到原 CLI 验证;不要修改已安装上游源码。个人签名值只放本机任务配置。
12
+
13
+ 免费开发者签名可能因设备已有 App 数量达到上限而拒绝安装。先列出冲突 App;若要替换旧测试 runner,确认它空闲、找到可恢复安装包并验证签名,依据用户授权再卸载。不能卸载 Runweave/随记来绕过限制,也不能用另一个工具的 Bundle ID 静默覆盖旧 runner。
14
+
15
+ 预检未检查 provisioning 配额/有效期、UI Automation 授权和全部占用者;首次真实 open/快照是必要验证。`check` 输出的 `automationReady: false` 表示尚未在这一预检中证明 UI 可操作,不表示操作必然失败。
16
+
17
+ ## 恢复边界
18
+
19
+ | 证据 | 下一步 |
20
+ | -------------------------------------- | ---------------------------------------------------------------------------------------------------------------- |
21
+ | devicectl unavailable、网络查找设备 | 重新确认线缆或同一网络、设备解锁,不新建同名模拟器冒充真机 |
22
+ | 原生 Mac 窗口工具找不到窗口 | 检查 Mac 是否锁屏,不能混同 iPhone 离线 |
23
+ | 系统明确提示输入密码启用 UI Automation | 用户在手机完成,保留正在启动的 runner 并等待;没有提示证据时先看日志 |
24
+ | open exit 0,但初始 snapshot 失败 | 当前不能算 UI 连接成功;检查任务 state/sessions 下 runner.log 的本次末尾 |
25
+ | 真机无线已安装 App,只需检查启动 | 使用辅助脚本 launch,直接经 CoreDevice 启动;不依赖 XCTest,不宣称 UI 验收通过 |
26
+ | runner code 74 / IDE 通道断开 | 检查本次 .diagnostic.json 和 runner.log;先区分 App 启动与 XCTest 握手,不靠延长超时、重复重签或重放业务动作恢复 |
27
+ | 点击失败或 settle 超时 | 先观察动作是否生效;不得自动重试写动作 |
28
+ | 精简树漏控件 | 完整 JSON、截图;坐标回退必须基于当前边界并验证后置状态 |
29
+ | 快照显示目标 App,但截图是其他 App | 以真实前台截图为准,按任务需要返回目标 App |
30
+ | 回放身份不匹配 | 留存错误、重读结构或重新录制;不删除元数据强行通过 |
31
+
32
+ 0.21.3 的本地实测曾出现精简树遗漏、卡片中心误触链接、动作发生后 XCTest 报错、录制祖先层级不匹配。它们是需要识别的失败模式,不是每次启动都必须执行的检查清单,也不能据此自动修改产品代码。
33
+
34
+ ## Runweave 共享模拟器
35
+
36
+ 在 Runweave linked worktree 中先通过仓库 `scripts/ios-simulators/cli.mjs` 申请设备,两个 App 可使用池中任一台;整个验证过程共用 task-dir 和 lease。初始化前用包内 run 入口构建安装;两台都忙且安全回收失败时等待,不另建设备。stop 只停止自动化,结束任务用 finish 释放占用。异常时查看 status 和本任务证据,再按 `docs/cli/ios-simulators.md` 对明确 lease 恢复;空闲超时只在安全清理成功后回收,不能强行抢锁。技能必须由用户主动安装或更新,不由 Desktop 自动复制。