@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,273 @@
1
+ """Read-only Zhihu HTTP transport. Credentials remain in a private local file."""
2
+ import contextlib
3
+ import datetime as dt
4
+ from html.parser import HTMLParser
5
+ import http.client
6
+ import json
7
+ import re
8
+ import signal
9
+ import socket
10
+ import time
11
+ import urllib.error
12
+ import urllib.parse
13
+ import urllib.request
14
+ import uuid
15
+
16
+ import suiji
17
+
18
+ ME = "https://www.zhihu.com/api/v4/me"
19
+ HISTORY = "https://api.zhihu.com/unify-consumption/read_history?offset=0&limit=20"
20
+ ALLOWED = re.compile(r"https://(?:api\.zhihu\.com/unify-consumption/read_history(?:\?[^#]*)?|www\.zhihu\.com/api/v4/(?:me|answers/\d+)(?:\?[^#]*)?|zhuanlan\.zhihu\.com/api/articles/\d+)")
21
+
22
+
23
+ def require(ok, code):
24
+ if not ok:
25
+ raise suiji.Failure(code)
26
+
27
+
28
+ class NoRedirect(urllib.request.HTTPRedirectHandler):
29
+ def redirect_request(self, *args, **kwargs):
30
+ return None
31
+
32
+
33
+ @contextlib.contextmanager
34
+ def request_timeout(seconds):
35
+ # The macOS/POSIX collector runs requests on its main thread. A socket's
36
+ # idle timeout alone cannot bound slow headers or a continuously read body.
37
+ previous_handler = signal.getsignal(signal.SIGALRM)
38
+ previous_timer = signal.getitimer(signal.ITIMER_REAL)
39
+ started = time.monotonic()
40
+
41
+ def expired(signum, frame):
42
+ raise TimeoutError("HTTP_REQUEST_TIMEOUT")
43
+
44
+ signal.signal(signal.SIGALRM, expired)
45
+ signal.setitimer(signal.ITIMER_REAL, min(seconds, previous_timer[0]) if previous_timer[0] else seconds)
46
+ try:
47
+ yield
48
+ finally:
49
+ signal.setitimer(signal.ITIMER_REAL, 0)
50
+ signal.signal(signal.SIGALRM, previous_handler)
51
+ if previous_timer[0]:
52
+ signal.setitimer(signal.ITIMER_REAL, max(0.000001, previous_timer[0] - (time.monotonic() - started)), previous_timer[1])
53
+
54
+
55
+ class Text(HTMLParser):
56
+ def __init__(self):
57
+ super().__init__(convert_charrefs=True)
58
+ self.parts = []
59
+
60
+ def handle_data(self, value):
61
+ self.parts.append(value)
62
+
63
+ def handle_starttag(self, tag, attrs):
64
+ if tag == "br":
65
+ self.parts.append("\n")
66
+
67
+ def handle_endtag(self, tag):
68
+ if tag in ("p", "div", "li", "h1", "h2", "h3", "blockquote"):
69
+ self.parts.append("\n")
70
+
71
+
72
+ def plain(html):
73
+ safe = re.sub(r"<(script|style|iframe|object|embed|video|audio)[\s\S]*?</\1\s*>", "", html, flags=re.I)
74
+ safe = re.sub(r"<(img|source|link|meta)\b[^>]*>", "", safe, flags=re.I)
75
+ parser = Text()
76
+ parser.feed(safe)
77
+ return re.sub(r"\n{3,}", "\n\n", "".join(parser.parts)).strip()
78
+
79
+
80
+ class Session:
81
+ def __init__(self, auth, config):
82
+ require(auth.get("schemaVersion") == 1, "INVALID_HTTP_SESSION")
83
+ require(all(auth.get(k) == config[k] for k in ("machine", "profile", "externalAccountId")), "HTTP_SESSION_BINDING_CHANGED")
84
+ require(config["machine"] == socket.gethostname(), "MACHINE_OR_ACCOUNT_BINDING_MISMATCH")
85
+ require(isinstance(auth.get("cookies"), list) and isinstance(auth.get("userAgent"), str), "INVALID_HTTP_SESSION")
86
+ self.auth = auth
87
+ self.opener = urllib.request.build_opener(NoRedirect())
88
+ self.deadline = time.monotonic() + 20 * 60
89
+ self.requests = 0
90
+
91
+ def request(self, url):
92
+ require(isinstance(url, str) and ALLOWED.fullmatch(url), "UNTRUSTED_API_URL")
93
+ require(time.monotonic() < self.deadline, "RUN_BUDGET_EXCEEDED")
94
+ parsed = urllib.parse.urlsplit(url)
95
+ cookies = []
96
+ for cookie in self.auth["cookies"]:
97
+ domain, path = cookie.get("domain", ""), cookie.get("path", "/")
98
+ host_matches = parsed.hostname == domain or (domain.startswith(".") and (parsed.hostname == domain[1:] or parsed.hostname.endswith(domain)))
99
+ path_matches = parsed.path == path or (parsed.path.startswith(path) and (path.endswith("/") or parsed.path[len(path):].startswith("/")))
100
+ if host_matches and path_matches and (cookie.get("expires", -1) < 0 or cookie["expires"] > time.time()):
101
+ cookies.append(cookie)
102
+ require(any(c.get("name") == "z_c0" for c in cookies), "NEEDS_LOGIN")
103
+ headers = {"Cookie": "; ".join(c["name"] + "=" + c["value"] for c in cookies), "User-Agent": self.auth["userAgent"],
104
+ "Accept": "application/json", "Referer": "https://www.zhihu.com/", "Origin": "https://www.zhihu.com"}
105
+ for attempt in range(3):
106
+ remaining = self.deadline - time.monotonic()
107
+ require(remaining > 0, "RUN_BUDGET_EXCEEDED")
108
+ self.requests += 1
109
+ try:
110
+ with request_timeout(min(15, remaining)):
111
+ try:
112
+ response = self.opener.open(urllib.request.Request(url, headers=headers, method="GET"), timeout=min(15, remaining))
113
+ except urllib.error.HTTPError as error:
114
+ response = error
115
+ with response:
116
+ raw = response.read(10 * 1024 * 1024 + 1)
117
+ status = response.status
118
+ require(len(raw) <= 10 * 1024 * 1024, "API_RESPONSE_TOO_LARGE")
119
+ try:
120
+ data = json.loads(raw)
121
+ except (ValueError, UnicodeError):
122
+ data = None
123
+ except (urllib.error.URLError, TimeoutError, OSError, http.client.HTTPException):
124
+ status, data = 0, None
125
+ require(time.monotonic() <= self.deadline, "RUN_BUDGET_EXCEEDED")
126
+ if (status == 0 or status == 429 or status >= 500) and attempt < 2:
127
+ time.sleep(min(0.5 * (attempt + 1), max(0, self.deadline - time.monotonic())))
128
+ continue
129
+ return {"status": status, "data": data}
130
+
131
+ def identity(self):
132
+ result = self.request(ME)
133
+ value = result["data"]
134
+ require(result["status"] == 200 and isinstance(value, dict) and isinstance(value.get("id"), str) and value["id"],
135
+ "NEEDS_LOGIN" if result["status"] in (401, 403) else "IDENTITY_UNAVAILABLE")
136
+ return value["id"]
137
+
138
+ def history(self, url):
139
+ result = self.request(url)
140
+ value = result["data"]
141
+ require(result["status"] == 200 and isinstance(value, dict) and isinstance(value.get("data"), list)
142
+ and isinstance(value.get("paging"), dict) and type(value["paging"].get("is_end")) is bool,
143
+ "NEEDS_LOGIN" if result["status"] in (401, 403) else "HISTORY_UNAVAILABLE_OR_PARSE_FAILED")
144
+ return value
145
+
146
+
147
+ def parse(card):
148
+ require(isinstance(card, dict) and card.get("card_type") == "single_card" and isinstance(card.get("data"), dict), "UNKNOWN_HISTORY_STRUCTURE")
149
+ value = card["data"]
150
+ extra = value.get("extra")
151
+ require(isinstance(extra, dict) and isinstance(extra.get("content_token"), str) and isinstance(extra.get("content_type"), str)
152
+ and type(extra.get("read_time")) in (int, float), "UNKNOWN_HISTORY_STRUCTURE")
153
+ stamp = extra["read_time"]
154
+ occurred = dt.datetime.fromtimestamp(stamp / 1000 if stamp > 1e12 else stamp, dt.timezone.utc)
155
+ title = value.get("header", {}).get("title") if isinstance(value.get("header"), dict) else None
156
+ return {"type": extra["content_type"], "id": extra["content_token"], "occurredAt": occurred.isoformat(timespec="milliseconds").replace("+00:00", "Z"),
157
+ "day": occurred.astimezone(dt.timezone(dt.timedelta(hours=8))).date().isoformat(), "questionId": extra.get("question_token"),
158
+ "title": title if isinstance(title, str) else "知乎浏览内容"}
159
+
160
+
161
+ def signature(value):
162
+ return [(item["type"], item["id"], item["occurredAt"]) for item in map(parse, value["data"])]
163
+
164
+
165
+ def content(session, item):
166
+ supported = item["type"] in ("answer", "article") and re.fullmatch(r"[0-9]+", item["id"])
167
+ if not supported:
168
+ return "", "metadata-only", "unsupported-content-type"
169
+ url = (f'https://www.zhihu.com/api/v4/answers/{item["id"]}?include=content,paid_info' if item["type"] == "answer"
170
+ else f'https://zhuanlan.zhihu.com/api/articles/{item["id"]}')
171
+ try:
172
+ result = session.request(url)
173
+ value = result["data"]
174
+ if result["status"] == 200 and isinstance(value, dict) and str(value.get("id")) == item["id"] and isinstance(value.get("content"), str):
175
+ body = plain(value["content"])
176
+ if value.get("is_paid") is True and (value.get("paid_info") or {}).get("has_purchased") is not True:
177
+ return body, "metadata-only", "paid-content-limited"
178
+ return body, "available" if body else "metadata-only", None if body else "empty-content"
179
+ return "", "metadata-only", "forbidden" if result["status"] == 403 else "not-found" if result["status"] == 404 else "content-unavailable-or-id-mismatch"
180
+ except Exception:
181
+ return "", "metadata-only", "content-timeout-or-parse-failed"
182
+
183
+
184
+ def collect(config, options):
185
+ auth = json.loads(suiji.private_read(config["sessionFile"]))
186
+ session = Session(auth, config)
187
+ before = session.identity()
188
+ require(before == config["externalAccountId"], "ACCOUNT_CHANGED")
189
+ captured = dt.datetime.now(dt.timezone.utc).isoformat(timespec="milliseconds").replace("+00:00", "Z")
190
+ observed, baseline_pages, errors = {}, {}, []
191
+ pages, stable, baseline = 0, False, None
192
+ for round_number in range(3):
193
+ baseline_pages = {}
194
+ next_url, first, complete, seen = HISTORY, None, False, set()
195
+ for index in range(100):
196
+ if next_url in seen:
197
+ errors.append("PAGINATION_LOOP")
198
+ break
199
+ seen.add(next_url)
200
+ try:
201
+ value = session.history(next_url)
202
+ current = signature(value)
203
+ except Exception as error:
204
+ if isinstance(error, suiji.Failure) and str(error) == "NEEDS_LOGIN":
205
+ raise
206
+ errors.append(str(error) if isinstance(error, suiji.Failure) else "UNKNOWN_HISTORY_STRUCTURE")
207
+ break
208
+ baseline_pages[next_url] = current
209
+ pages += 1
210
+ if index == 0:
211
+ first = current
212
+ if baseline is None:
213
+ baseline = first
214
+ if len(value["data"]) > 20:
215
+ errors.append("PAGE_LIMIT_EXCEEDED")
216
+ break
217
+ for card in value["data"]:
218
+ item = parse(card)
219
+ if options["from"] <= item["day"] <= options["to"]:
220
+ observed[(item["type"], item["id"], item["occurredAt"])] = item
221
+ if value["paging"]["is_end"]:
222
+ complete = True
223
+ break
224
+ next_url = value["paging"].get("next")
225
+ parsed = urllib.parse.urlsplit(next_url) if isinstance(next_url, str) else None
226
+ if not parsed or not ALLOWED.fullmatch(next_url) or parsed.netloc != "api.zhihu.com" or urllib.parse.parse_qs(parsed.query).get("limit") != ["20"]:
227
+ errors.append("UNTRUSTED_PAGINATION")
228
+ break
229
+ if index == 99:
230
+ errors.append("PAGE_CAP_REACHED")
231
+ try:
232
+ if first is not None and signature(session.history(HISTORY)) == first:
233
+ stable = complete
234
+ break
235
+ except Exception:
236
+ errors.append("HOMEPAGE_RECHECK_FAILED")
237
+ break
238
+ if round_number == 2:
239
+ errors.append("HISTORY_UNSTABLE")
240
+ bodies, items = {}, []
241
+ for item in observed.values():
242
+ key = item["type"], item["id"]
243
+ if key not in bodies:
244
+ bodies[key] = content(session, item)
245
+ body, state, reason = bodies[key]
246
+ if reason not in (None, "unsupported-content-type", "paid-content-limited"):
247
+ errors.append("CONTENT_" + reason.upper().replace("-", "_"))
248
+ question = str(item.get("questionId") or "")
249
+ url = (f'https://www.zhihu.com/question/{question}/answer/{item["id"]}' if item["type"] == "answer" and re.fullmatch(r"[0-9]+", question)
250
+ else f'https://zhuanlan.zhihu.com/p/{item["id"]}' if item["type"] == "article" else None)
251
+ items.append({"observation": {"contentType": item["type"], "contentId": item["id"], "readTime": item["occurredAt"], "observedAt": captured},
252
+ "entry": {"captureId": str(uuid.uuid4()), "browseDate": item["day"], "occurredAt": item["occurredAt"], "capturedAt": captured,
253
+ "title": item["title"], "body": body, "userNote": "", "source": {"provider": "zhihu", "displayName": "知乎", "connectionId": config["connectionId"]},
254
+ "contentType": item["type"], "captureMethod": "connector", "sourceUrl": url, "contentState": {"state": state, "reason": reason}, "attachmentIds": []}})
255
+ after = session.identity()
256
+ require(after == before, "ACCOUNT_CHANGED_DURING_RUN")
257
+ unchanged = False
258
+ try:
259
+ unchanged = baseline == signature(session.history(HISTORY))
260
+ except Exception:
261
+ errors.append("HISTORY_RECHECK_FAILED")
262
+ for url, previous in baseline_pages.items():
263
+ try:
264
+ if signature(session.history(url)) != previous:
265
+ unchanged = False
266
+ except Exception:
267
+ unchanged = False
268
+ errors.append("HISTORY_RECHECK_FAILED")
269
+ if not unchanged:
270
+ errors.append("HISTORY_CHANGED_DURING_CONTENT_READ")
271
+ return {"identityBefore": before, "identityAfter": after, "items": items, "historyUnchanged": unchanged,
272
+ "coverage": {"state": "complete" if stable and not errors else "partial", "pages": pages, "metadata": len(items),
273
+ "content": sum(i["entry"]["contentState"]["state"] == "available" for i in items), "errors": list(dict.fromkeys(errors))[:200]}}
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Dustin Yuchen Teng
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,103 @@
1
+ ---
2
+ name: clear-technical-explanations
3
+ description: 对中文或英文技术文本消歧和改写,让 Agent、下游系统或读者能准确理解工具描述、错误信息、操作步骤、系统提示和状态报告。用于“消除歧义”“应用 STE100”“把这段改清楚”“减少误读”等请求;不用于创意写作或营销文案。
4
+ license: MIT
5
+ metadata:
6
+ source: https://github.com/danyuchn/asd-ste100-skill/blob/32511c6992ecb5f1971e46a2943f2e6adceedafe/SKILL.md
7
+ adapted_for: Runweave Toolkit
8
+ changes: 中文化核心改写规则,按中文语法适配句长与时态表达;英文结构检查脚本未移植。
9
+ ---
10
+
11
+ # 简化技术表达(ASD-STE100 启发)
12
+
13
+ 改写难懂或有歧义的技术文本,让读者无需询问作者也能准确理解。保留原文语言,除非用户要求翻译。目标是消除歧义,不是把文字压到最短。
14
+
15
+ ## 两种模式
16
+
17
+ 改写前选择模式。用户未指定时,按文本类型判断。默认不宣布模式。
18
+
19
+ - **Strict**:操作步骤、错误信息、工具描述、Agent 间指令和误读成本高的文本。严格保持同一术语对应同一含义,一个句子只表达一个指令,执行适用的结构规则。
20
+ - **STE-flavored**:README、PR 描述、变更记录和解释性文章。执行结构规则,词汇规则作为建议,不为了统一词汇抹掉文章的必要语气和表达。
21
+
22
+ 这两种模式都必须保留事实、条件、范围、例外、数字和不确定性。
23
+
24
+ ## 核心改写规则
25
+
26
+ ### 结构规则
27
+
28
+ | 规则 | 做法 |
29
+ | ------------------ | ---------------------------------------------------------------------------------------------------------------------------- |
30
+ | 主动表达 | 明确谁执行什么动作。主体确实未知或无关时,不为改成主动句而虚构主体。 |
31
+ | 一个句子一个指令 | 将连续操作拆为独立句子或步骤。条件必须紧邻它限定的动作。 |
32
+ | 短句 | 英文操作句不超过 20 词,描述句不超过 25 词。中文按独立动作或判断拆句,不机械套用英文词数或另定字数上限。必要精度优先于句长。 |
33
+ | 拆开分号连接的内容 | 用独立句子或步骤表达多个判断。破折号不一概禁用,但检查它是否把多个判断挤在一起。 |
34
+ | 拆开长串名词 | 英文避免超过 3 词的名词堆叠。中文明确长串名词之间的关系,不强行套英文词数。固定术语和标识符保留原样。 |
35
+ | 不省略必要成分 | 保留读者需要的主体、动作、对象和限定。中文零主语自然且指代唯一时可以保留;有多个可能主体时明确指代。 |
36
+ | 保留确定程度 | “可能失败”不能改成“失败”,“可能由 X 引起”不能改成“由 X 引起”。 |
37
+ | 段落聚焦 | 每段只讨论一个主题,通常不超过 6 句。 |
38
+ | 步骤和条件用列表 | 3 个以上步骤或条件优先使用列表,明确先后关系及各条件对应的动作。 |
39
+ | 避免模糊短语 | 英文优先用明确的单词动词替代多义短语动词;中文把“处理一下”等模糊动作改明确,但不得猜测原文未说明的动作。 |
40
+
41
+ ### 词汇规则
42
+
43
+ 优先使用常见、含义明确的词。Strict 模式保持同一动作和对象的名称一致;STE-flavored 模式允许不引起歧义的自然表达。
44
+
45
+ - 同一概念不要交替使用多个名称,让读者误以为它们是不同对象。
46
+ - 使用动词表达动作,例如将“进行分析”改为“分析”。名称本身是技术术语时保留。
47
+ - 保留必要的领域术语。陌生术语可以补一行释义,但不改写 API、命令、文件路径或标识符。
48
+ - 不机械将英文“一词一种词性”规则套到中文。判断依据是含义和指代是否明确。
49
+
50
+ 此技能不包含 ASD 官方词典。词汇选择是消歧建议,不是正式批准词校验,也不能据此保证 ASD-STE100 合规。
51
+
52
+ ### 时态与状态
53
+
54
+ 英文优先使用简单时态,但复合形式承载当前状态或不确定性时保留。例如不能把“may have failed”改成已确认失败。
55
+
56
+ 中文保留“已”“正在”“将”“尚未”等状态信息,以及“可能”“仅当”“至少”“最多”等限定。不为句子变短而删除它们。
57
+
58
+ ## 扫描清单
59
+
60
+ 逐句检查这些常见问题:
61
+
62
+ 1. **名称轮换**:同一对象被称为“用户”“客户”“客户端”,但没有说明是否是同一主体。
63
+ 2. **套话和限定堆叠**:删除“值得注意的是”等无信息表达,保留真正表达置信度、频率或条件的限定。
64
+ 3. **动作名词化**:用明确动词替代“进行……的处理”等绕法。
65
+ 4. **营销形容词**:删除无依据的质量夸赞,或使用原文已有的可核对数据。不能补造数据。
66
+ 5. **长句串联**:多个判断挤在一个句子里,需要按逻辑拆分。
67
+ 6. **模糊动作短语**:明确原文已经给出的动作;原文没有足够信息时指出歧义,不代替作者决定。
68
+
69
+ ## 改写流程
70
+
71
+ 1. 选择 Strict 或 STE-flavored 模式。
72
+ 2. 先读完整原文,确定改写后必须保留的意思。
73
+ 3. 逐句检查结构、词汇和扫描清单中的问题。STE-flavored 模式不强制统一所有自然用词。
74
+ 4. 改写有问题的句子,保留原文的事实、条件、范围、数值、单位、先后关系和确定程度。原文未陈述的原因、频率或机制不能补入。
75
+ 5. 对照原文核对语义。若简化会丢失精度,就保留较长表述,并按下方格式说明。
76
+ 6. 返回结果。原文已经清楚时保留原文,不为了产生改动而重写。
77
+
78
+ 词数、标点等结构检查不能证明改写保留了语义。
79
+
80
+ ## 输出格式
81
+
82
+ **默认只输出改写后的文本。** 不加开场说明、模式名称、问题计数、改动总结、规则清单或结尾邀请。
83
+
84
+ 若刻意保留某个无法安全简化的表述,可以在正文后加一行:
85
+
86
+ > 保留原表述:〔表述〕。进一步简化会丢失〔必要信息〕。
87
+
88
+ 没有需要说明的保留项时,不加这一行。
89
+
90
+ 用户要求“展示差异”“解释修改”或“列出规则”时,改为输出比较表:
91
+
92
+ | 规则 | 原文 | 改写 |
93
+ | ------------ | ---------------------------- | -------------------------- |
94
+ | 动作名词化 | 请对日志进行分析。 | 请分析日志。 |
95
+ | 保留不确定性 | 请求可能由于旧客户端而失败。 | 旧客户端可能导致请求失败。 |
96
+
97
+ 表后注明模式;有意保留的内容及理由用一行说明。
98
+
99
+ ## 边界
100
+
101
+ 只改善表达,不改变文本所描述的行为,不把缺乏依据的内容变成事实。保留所有条件、例外和不确定性;不能为了更短而降低精度。
102
+
103
+ 创意、营销或以语气和说服为目标的文字不适用此技能。没有实质内容的段落,不能仅靠改写变得有用。
@@ -0,0 +1,54 @@
1
+ ---
2
+ name: code-grounded-requirements
3
+ description: 在已有代码库里要改动现有行为、排查「为什么现在是这样」,或需求涉及已有组件/状态/接口时使用——先把需求落到真实代码现状上,对齐现状/目标/差异,再谈方案。不要用于从零新建或纯问答。
4
+ ---
5
+
6
+ # Code-Grounded Requirements
7
+
8
+ 把需求落到**真实代码**上再下结论,对抗「不读代码就脑补方案」。
9
+
10
+ 要对齐三件事:当前代码已经怎么做了 / 用户想改成什么 / 两者差在哪。
11
+
12
+ ## 触发边界
13
+
14
+ - **触发**:改动现有行为、排查「为什么现在是这样」、需求涉及已有组件/状态/接口/链路。
15
+ - **不触发**:全新文件从零搭建、纯问答、用户已给出明确实现指令。
16
+
17
+ ## 硬规则
18
+
19
+ - **先读代码,再梳理需求**,不允许只凭 query 或通用经验下结论。
20
+ - 优先读与需求最相关的真实代码:页面/组件、路由、hooks/store、服务层/API、后端接口,以及(若涉及)配置/Electron bridge/storage。
21
+ - 排查「为什么现在这样」时,必须看完整链路:调用方 → 中间层 → 真正生效层。
22
+ - 关键判断:能力是**已存在但链路没接上(接线/回归问题)**,还是**真的缺能力**——别把前者误判为后者。
23
+ - 需求对齐前不进入实现。建议可以给,但必须基于代码现状。
24
+
25
+ ## 证据标准
26
+
27
+ - 结论要带关键文件路径/模块名,且能被代码事实支撑。
28
+ - 推测必须标注:「基于当前代码,我推测……」,不能把推测写成事实。
29
+
30
+ ## 输出格式
31
+
32
+ 按下面顺序,按需裁剪:
33
+
34
+ ### 当前现状
35
+
36
+ 基于代码说明系统现在怎么工作,给关键文件路径。
37
+
38
+ ### 需求理解
39
+
40
+ 用更精确的话重述目标,点明这次改的是行为 / 存储 / UI / 路由还是接口。
41
+
42
+ ### 差异与影响
43
+
44
+ 现状和目标差在哪(行为、数据模型、存储语义、权限、路由跳转),以及可能受影响的模块。
45
+
46
+ ### 建议
47
+
48
+ 1 个推荐方向(必要时补 1 个备选),每条说明为什么贴合当前代码——是最小修复还是结构性改造、是否复用已有接口/组件。
49
+
50
+ ### 待确认点
51
+
52
+ 只在确实需要时保留,1-3 个高价值边界问题;能从代码看出来的不要反问。
53
+
54
+ 默认用中文回复。
@@ -0,0 +1,151 @@
1
+ ---
2
+ name: daily-doc-maintenance
3
+ description: 仅当用户明确要求使用 daily-doc-maintenance skill,或调度器触发“每日文档整理/文档保鲜/文档保持最新”流程时使用;用于根据最新文档与代码变更更新或删除 Runweave 文档,并强制清理 docs/plans 与 docs/review 过程材料;禁止修改代码、配置和测试;验证通过后调用 toolkit:github-pr 提交并合并 PR。
4
+ ---
5
+
6
+ # 每日文档整理
7
+
8
+ 这个 skill 用于每天整理 Runweave 文档,让文档反映当前功能和稳定边界。它只更新或删除文档,不修改代码。
9
+
10
+ “每天定时”必须由外部调度器触发,例如 GitHub Actions、launchd/cron 或团队 agent 平台。skill 本身只定义 Codex 被触发后的执行流程。
11
+
12
+ ## 硬边界
13
+
14
+ - 只允许改 `docs/**/*.md`、`README.md` 中的文档入口、文档引用的图片/草图资产,以及本 skill 自身被明确要求更新时的 skill 文档。删除过程文档造成 `docs/testing/**/*.testplan.yaml` 中的路径或说明引用失效时,可仅修正这些引用;不得改用例行为、步骤、预期或验收门槛。
15
+ - 禁止修改 `src/`、`server/`、`electron/`、`packages/`、`scripts/`、其他测试、配置、lockfile、构建产物。
16
+ - 不新增前端单测、Vitest、coverage 配置;文档整理不触发前端 TDD。
17
+ - 不因为文档发现代码问题就顺手修代码;只在最终报告里列出“代码侧待处理”。
18
+ - 不创建长期新文档,除非用户明确要求。默认把新增或零散文档合并进已有权威文档,然后删除冗余文档。
19
+ - `docs/plans/**` 和 `docs/review/**` 是过程材料,不上车做长期维护;每日文档整理必须清空这两个目录下的文档和资产,不能把它们作为可长期保留的例外。
20
+
21
+ ## 文档原则
22
+
23
+ 文档写当前事实和核心判断,不写实现游记。
24
+
25
+ 保留:
26
+
27
+ - 当前功能是什么、用户怎么感知、什么时候使用。
28
+ - 稳定架构边界、关键数据/协议契约、模块职责。
29
+ - 重要限制、风险、运维/验证入口。
30
+ - 必须长期保留的命令、环境变量、路由、协议字段。
31
+
32
+ 压缩或删除:
33
+
34
+ - 文件逐行说明、函数调用流水账、临时调试过程。
35
+ - 已完成计划中的中间步骤、commit 过程、个人执行记录。
36
+ - `docs/plans/`、`docs/review/` 下的计划、评审、复盘、草图和截图等过程产物。
37
+ - 与当前代码不一致的旧路径、旧命名、旧截图说明。
38
+ - 可从代码直接读出的低价值细节,例如私有函数名、大段代码片段、局部变量解释。
39
+
40
+ 写法要求:
41
+
42
+ - 中文优先,短段落,标题直接。
43
+ - 先写结论和边界,再写必要细节。
44
+ - 一个文档只承担一个主题;不要把设计、排障、部署、测试入口混在一起。
45
+ - 需要图时只保留能帮助理解边界或流程的图,不把临时验证截图当长期文档资产。
46
+
47
+ ## 范围
48
+
49
+ - 默认整理范围:最新 `origin/main` 从上一天 00:00 到当前的所有 commit。
50
+ - 计算时间窗口前,先 `git fetch origin`,再用 `git rev-parse origin/main` 固定本轮基线 SHA;基于该 SHA 创建本次独立分支和 worktree,并在其中整理文档。调用方已创建本次 worktree 时,先核对它基于该 SHA;不一致时保留现场并报告,不强制重置。
51
+ - 本地 `main` 无需更新。其他 worktree 中的 `main` 落后或有进程占用,不阻塞本轮整理;不要切换、快进或重置其他 worktree,也不要停止其进程。fetch 失败或无法核对本轮远端基线时,停止并说明原因。
52
+ - 范围内的文档变更必须逐一检查:新增文档是否需要沉淀进权威文档,旧文档是否过时,文档入口是否需要调整。
53
+ - 范围内的代码变更只用于判断文档是否需要更新;即使发现代码问题,本 skill 也只记录待处理项,不修改代码。
54
+ - 如果调用方显式提供 Git range,以调用方 range 为准;fetch 后固定目标远端 base branch 的 SHA,基于该 SHA 创建本次 worktree,并确认 range 的引用可解析。仍无需更新本地 base branch。
55
+ - 不管 range 是否覆盖,`docs/plans/**` 和 `docs/review/**` 都是本轮固定清理目标:有效结论先迁移到权威文档,随后删除这些目录下的文件。
56
+
57
+ ## 默认输入
58
+
59
+ 优先使用调用方给出的 Git range:
60
+
61
+ - `base_branch`,默认 `main`。
62
+ - `before_ref` 和 `after_ref`,或等价的 `before_ref..after_ref`。
63
+ - 本次是否允许删除文档,默认允许删除已合并且确认冗余的文档;`docs/plans/**` 和 `docs/review/**` 不受该开关影响,始终按必删过程材料处理。
64
+
65
+ 如果没有明确 range:
66
+
67
+ - 人工触发时,使用当前工作区 diff 和最近 24 小时提交作为近似范围,并在报告里说明这是近似。
68
+ - 自动调度时,如果没有 range 或上次游标,不推进长期状态;只做一次性整理报告或本地文档 patch。
69
+
70
+ ## 工作流程
71
+
72
+ 1. 检查工作区。
73
+ - 运行 `git status --short`。
74
+ - 如果存在非文档改动,不覆盖、不回滚;可以读取代码判断事实,但本轮只改文档。
75
+ - 如果存在用户未提交的文档改动,先读清楚再继续,避免覆盖用户正在写的内容。
76
+
77
+ 2. 收集变更。
78
+ - 查看本次 range 的 `git log --oneline` 和 `git diff --name-status`。
79
+ - 分成三类:新增/修改文档、删除文档、代码或配置变化。
80
+ - 对代码变化只做“是否影响文档”的判断,不改代码。
81
+
82
+ 3. 建立文档地图。
83
+ - 先读 `docs/README.md`,确认权威入口。
84
+ - 按主题映射到现有文档:架构、终端、Preview、AI 协作、质量、测试、部署。
85
+ - `docs/plans/` 和 `docs/review/` 默认视为计划/评审过程材料,不作为当前功能权威来源;其中仍有效的结论应沉淀到 `docs/architecture/`、`docs/quality/`、`docs/testing/`、`docs/deployment/` 或其他现有权威文档。
86
+
87
+ 4. 判断是否需要更新。
88
+ - 用户可见功能、协议、路由、状态模型、验证命令、部署方式发生变化:更新权威文档。
89
+ - 只是内部重构且外部行为、边界、命令都没变:通常不更新文档,只在报告里说明。
90
+ - 新文档与已有文档重复:把核心内容合并到权威文档,删除新文档或旧冗余文档。
91
+ - 文档与当前代码冲突:以当前代码为准改文档;无法确认时标注为待确认,不编造。
92
+
93
+ 5. 执行文档整理。
94
+ - 优先更新已有权威文档,不新建长期文档。
95
+ - 更新 `docs/README.md` 的路由表,确保入口能找到当前权威文档。
96
+ - 清理 `docs/plans/**` 和 `docs/review/**`:先迁移仍有效的结论、验收入口、架构边界或风险判断,再删除原文件及其仅被这些文件引用的资产。
97
+ - 删除前搜索全仓引用;若现有测试计划指向待删文件,只修正过期引用并运行 `pnpm testplan:validate <path>`,再删除。无法保留原用例语义时停止并报告冲突。
98
+ - 删除文档前必须确认:核心内容已合并、没有被 `docs/README.md` 或其他文档继续引用、不是仍有价值的历史决策记录。
99
+ - 删除图片/草图前必须确认没有文档引用。
100
+
101
+ 6. 控制细节密度。
102
+ - 把“实现怎么写”改成“系统现在承诺什么”。
103
+ - 细节只保留到能支持维护者判断边界、排障或验证。
104
+ - 如果一个段落主要在解释某个私有函数如何串联,改写为模块职责或删除。
105
+
106
+ 7. 验证。
107
+ - 运行 `git diff --check`。
108
+ - 运行 `git diff --name-only`,确认只有允许的文档范围变化及上述测试计划引用修正。
109
+ - 运行 `find docs/plans docs/review -type f` 或等价命令,确认两个目录下不再有文件;如果目录不存在,记录为已清理。
110
+ - 删除文档或资产后,用 `rg` 检查仓库内没有残留链接或过期引用。
111
+ - 不为纯文档整理运行前端单测;只有用户要求或文档工具链需要时才补充更重验证。
112
+
113
+ 8. 调用 `toolkit:github-pr` 提交并合并 PR。
114
+ - 验证通过后调用 `toolkit:github-pr`,由该 skill 负责提交、push、创建 PR、等待门禁和合并。
115
+
116
+ 9. 输出结果。
117
+
118
+ - 列出更新了哪些权威文档、删除了哪些冗余文档。
119
+ - 说明哪些代码变化不需要文档更新,以及原因。
120
+ - 列出 `toolkit:github-pr` 返回的 commit、push 分支、PR 链接和合并状态。
121
+ - 如果发现代码和文档事实无法对齐,列出待确认问题,不修改代码。
122
+
123
+ ## 删除规则
124
+
125
+ 可以删除:
126
+
127
+ - `docs/plans/**` 和 `docs/review/**` 的全部文件;这些目录只承载阶段性计划、评审、草图、截图和执行记录,不作为长期文档。
128
+ - 已被权威文档吸收的重复文档。
129
+ - 只记录一次性执行过程、临时方案或已过期计划的文档。
130
+ - 指向旧架构、旧路径、旧命令且没有长期参考价值的文档。
131
+ - 已经没有引用的文档图片或草图资产。
132
+
133
+ 不要删除:
134
+
135
+ - `docs/README.md` 路由中仍作为入口的权威文档。
136
+ - 仍在解释当前功能边界、协议或验证路径的文档。
137
+ - 明确作为历史决策、复盘或设计依据保留的文档,除非用户要求清理。
138
+ - 不确定是否仍被外部引用的公开文档;这种情况先在报告里标记。
139
+
140
+ 例外说明:以上“不要删除”不适用于 `docs/plans/**` 和 `docs/review/**`。如果其中内容仍有长期价值,先迁移到权威文档,再删除原过程文件;不要因为引用未迁移或价值未判断而把它们留在主线。
141
+
142
+ ## 最终报告格式
143
+
144
+ 回复保持简短,包含:
145
+
146
+ - `更新`:改了哪些文档,核心变化是什么。
147
+ - `删除`:删了哪些文档/资产,为什么可以删。
148
+ - `未改`:哪些变更判断后不需要文档更新。
149
+ - `验证`:实际运行的检查命令和结果。
150
+ - `提交`:`toolkit:github-pr` 的 commit、push 分支、PR 链接和合并状态。
151
+ - `待确认`:需要人工判断的外部事实或产品取舍。