@runweave/server-linux-x64 0.1.7 → 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.
- package/manifest.json +1487 -156
- package/native.tar.gz +0 -0
- package/package.json +1 -1
- package/payload/.agents/plugins/marketplace.json +20 -0
- package/payload/app-server/build-info.json +3 -3
- package/payload/app-server/index.cjs +1 -1
- package/payload/backend/build-info.json +4 -4
- package/payload/backend/index.cjs +2416 -1684
- package/payload/backend/ios-simulators/pool.py +3 -3
- package/payload/backend/scheduled-tasks-sqlite-worker.cjs +224 -171
- package/payload/frontend/dist/assets/{_baseUniq-i1Ki3twP.js → _baseUniq-qHFga5V8.js} +1 -1
- package/payload/frontend/dist/assets/{access-DK9V0f3W.js → access-DgHvmn15.js} +1 -1
- package/payload/frontend/dist/assets/{advanced-B13lWv1d.js → advanced-C1Fh14vw.js} +1 -1
- package/payload/frontend/dist/assets/{appearance-DumRYmkD.js → appearance-Bs7cSXqO.js} +1 -1
- package/payload/frontend/dist/assets/{arc-HKn3_xyV.js → arc-E3iYHQG_.js} +1 -1
- package/payload/frontend/dist/assets/{architectureDiagram-Q4EWVU46-C09x7b94.js → architectureDiagram-Q4EWVU46-DgpYpTb9.js} +1 -1
- package/payload/frontend/dist/assets/{blockDiagram-DXYQGD6D-CFLFTR6d.js → blockDiagram-DXYQGD6D-CfFOEKZ7.js} +1 -1
- package/payload/frontend/dist/assets/{c4Diagram-AHTNJAMY-8P8Q-xqC.js → c4Diagram-AHTNJAMY-BxlHBUj3.js} +1 -1
- package/payload/frontend/dist/assets/channel-amxyNKnk.js +1 -0
- package/payload/frontend/dist/assets/{chunk-4BX2VUAB-B1KEkTal.js → chunk-4BX2VUAB-xWocgDo8.js} +1 -1
- package/payload/frontend/dist/assets/{chunk-4TB4RGXK-Bu_Z47kJ.js → chunk-4TB4RGXK-Bl1cNICf.js} +1 -1
- package/payload/frontend/dist/assets/{chunk-55IACEB6-xzHVCHyi.js → chunk-55IACEB6-DVtE836u.js} +1 -1
- package/payload/frontend/dist/assets/{chunk-EDXVE4YY-h3HAW06h.js → chunk-EDXVE4YY-Dbd3tDCr.js} +1 -1
- package/payload/frontend/dist/assets/{chunk-FMBD7UC4-CQ4faPSh.js → chunk-FMBD7UC4-MPJaTsyN.js} +1 -1
- package/payload/frontend/dist/assets/{chunk-OYMX7WX6-CubmLoGT.js → chunk-OYMX7WX6-D3LuudlW.js} +1 -1
- package/payload/frontend/dist/assets/{chunk-QZHKN3VN-xk0zKNja.js → chunk-QZHKN3VN-Dn1aF6iQ.js} +1 -1
- package/payload/frontend/dist/assets/{chunk-YZCP3GAM-CHpTv8sd.js → chunk-YZCP3GAM-jZYbHnCw.js} +1 -1
- package/payload/frontend/dist/assets/classDiagram-6PBFFD2Q-B8cTijjT.js +1 -0
- package/payload/frontend/dist/assets/classDiagram-v2-HSJHXN6E-B8cTijjT.js +1 -0
- package/payload/frontend/dist/assets/clone-xzI2eGRI.js +1 -0
- package/payload/frontend/dist/assets/connection-V2iI-6rM.js +12 -0
- package/payload/frontend/dist/assets/{connections-A7InZw2T.js → connections-G_Q7342g.js} +1 -1
- package/payload/frontend/dist/assets/{cose-bilkent-S5V4N54A-CQn27vi_.js → cose-bilkent-S5V4N54A-75FLD3RS.js} +1 -1
- package/payload/frontend/dist/assets/{dagre-KV5264BT-CClOwB9v.js → dagre-KV5264BT-DEm-DpJL.js} +1 -1
- package/payload/frontend/dist/assets/{desktop-BgryfXXM.js → desktop-g5JC-CQd.js} +1 -1
- package/payload/frontend/dist/assets/{diagram-5BDNPKRD-DcUJOAmV.js → diagram-5BDNPKRD-BV6P2UTy.js} +1 -1
- package/payload/frontend/dist/assets/{diagram-G4DWMVQ6-DdabmTwk.js → diagram-G4DWMVQ6-DuCK-MM2.js} +1 -1
- package/payload/frontend/dist/assets/{diagram-MMDJMWI5-DmcxjBIk.js → diagram-MMDJMWI5-D5_GlPgO.js} +1 -1
- package/payload/frontend/dist/assets/{diagram-TYMM5635-BUSpXaiN.js → diagram-TYMM5635-QRbOYR1P.js} +1 -1
- package/payload/frontend/dist/assets/{erDiagram-SMLLAGMA-vkAXcv5_.js → erDiagram-SMLLAGMA-DefCheAw.js} +1 -1
- package/payload/frontend/dist/assets/{flowDiagram-DWJPFMVM-BHDU7BUJ.js → flowDiagram-DWJPFMVM-DVzyWIso.js} +1 -1
- package/payload/frontend/dist/assets/{ganttDiagram-T4ZO3ILL-C3lAG7_6.js → ganttDiagram-T4ZO3ILL-BJaClUEF.js} +1 -1
- package/payload/frontend/dist/assets/{gitGraphDiagram-UUTBAWPF-DHLyYJf7.js → gitGraphDiagram-UUTBAWPF-BLfbApNz.js} +1 -1
- package/payload/frontend/dist/assets/{graph-Bp5bIzXM.js → graph-C-YqFh68.js} +1 -1
- package/payload/frontend/dist/assets/{image-DkcKNLTV.js → image-CZo_2Awc.js} +1 -1
- package/payload/frontend/dist/assets/{index-BUS7FSlk.js → index-6q2aeqkt.js} +95 -105
- package/payload/frontend/dist/assets/{infoDiagram-42DDH7IO-CVp9zvmA.js → infoDiagram-42DDH7IO-BakVOutT.js} +1 -1
- package/payload/frontend/dist/assets/{ishikawaDiagram-UXIWVN3A-D07QPX3O.js → ishikawaDiagram-UXIWVN3A-D_1Oa5Dc.js} +1 -1
- package/payload/frontend/dist/assets/{journeyDiagram-VCZTEJTY-D-iZPDHM.js → journeyDiagram-VCZTEJTY-Y8TVFv6B.js} +1 -1
- package/payload/frontend/dist/assets/{kanban-definition-6JOO6SKY-BR4eWb08.js → kanban-definition-6JOO6SKY-DxeNhTIB.js} +1 -1
- package/payload/frontend/dist/assets/{layout-Cyv0DyJm.js → layout-5cMeOTAp.js} +1 -1
- package/payload/frontend/dist/assets/{linear-D5M7Pvj1.js → linear-Bnc3ev5g.js} +1 -1
- package/payload/frontend/dist/assets/main-3TPtEl66.js +706 -0
- package/payload/frontend/dist/assets/main-D4_uoZQa.css +33 -0
- package/payload/frontend/dist/assets/{min-BFlloFGg.js → min-BRXKkrS8.js} +1 -1
- package/payload/frontend/dist/assets/{mindmap-definition-QFDTVHPH-AKUF178o.js → mindmap-definition-QFDTVHPH-RYZO_BEr.js} +1 -1
- package/payload/frontend/dist/assets/{monitoring-B2okceCB.js → monitoring-Fv7kZ4s6.js} +1 -1
- package/payload/frontend/dist/assets/{notifications-0lql4_qJ.js → notifications-BzrYqyMH.js} +1 -1
- package/payload/frontend/dist/assets/{pieDiagram-DEJITSTG-CRiHmwn7.js → pieDiagram-DEJITSTG-Bzw0dhjz.js} +1 -1
- package/payload/frontend/dist/assets/{quadrantDiagram-34T5L4WZ-CzXrq7IJ.js → quadrantDiagram-34T5L4WZ-CQJY_msa.js} +1 -1
- package/payload/frontend/dist/assets/{record-content-DTCQKbEj.js → record-content-B7-6olQt.js} +1 -1
- package/payload/frontend/dist/assets/{requirementDiagram-MS252O5E-Bbn5ulLV.js → requirementDiagram-MS252O5E-DuP8hAV8.js} +1 -1
- package/payload/frontend/dist/assets/{sankeyDiagram-XADWPNL6-D9ZZ46pQ.js → sankeyDiagram-XADWPNL6-D-fQnCZZ.js} +1 -1
- package/payload/frontend/dist/assets/{sequenceDiagram-FGHM5R23-DxOP2gDa.js → sequenceDiagram-FGHM5R23-DaZNEccV.js} +1 -1
- package/payload/frontend/dist/assets/{stateDiagram-FHFEXIEX-NF_Qq5Cq.js → stateDiagram-FHFEXIEX-CkOLt5R1.js} +1 -1
- package/payload/frontend/dist/assets/stateDiagram-v2-QKLJ7IA2-atg1K4nB.js +1 -0
- package/payload/frontend/dist/assets/{status-2U71YpVe.js → status-CIIPajZp.js} +1 -1
- package/payload/frontend/dist/assets/suiji-C453W-Sg.js +1 -0
- package/payload/frontend/dist/assets/{svg-DpI3GSCw.js → svg-BUqAWGtg.js} +1 -1
- package/payload/frontend/dist/assets/{tabs-CYKuiiHg.js → tabs-Cwlp1Meu.js} +1 -1
- package/payload/frontend/dist/assets/{timeline-definition-GMOUNBTQ-ChEZSNF_.js → timeline-definition-GMOUNBTQ-BOKDMwHS.js} +1 -1
- package/payload/frontend/dist/assets/{vennDiagram-DHZGUBPP-Ch26SNbB.js → vennDiagram-DHZGUBPP-fSZjDS41.js} +1 -1
- package/payload/frontend/dist/assets/{wardley-RL74JXVD-D0ap5vv0.js → wardley-RL74JXVD-D1KIsvoD.js} +1 -1
- package/payload/frontend/dist/assets/{wardleyDiagram-NUSXRM2D-btdjsmHO.js → wardleyDiagram-NUSXRM2D-FMe67dwE.js} +1 -1
- package/payload/frontend/dist/assets/{xychartDiagram-5P7HB3ND-CklPtFGT.js → xychartDiagram-5P7HB3ND-B9AM9_9w.js} +1 -1
- package/payload/frontend/dist/build-info.json +4 -4
- package/payload/frontend/dist/companion.html +1 -1
- package/payload/frontend/dist/index.html +3 -3
- package/payload/packages/agent-bridge/src/install-pi.mjs +81 -0
- package/payload/plugins/pi/dist/SKILL.md +22 -0
- package/payload/plugins/pi/dist/bridge/app-server-client.cjs +82 -0
- package/payload/plugins/pi/dist/bridge/feishu_stop_notify.sh +169 -0
- package/payload/plugins/pi/dist/bridge/runweave-hook-bridge.cjs +583 -0
- package/payload/plugins/pi/dist/bridge/runweave-hook-completion.cjs +42 -0
- package/payload/plugins/pi/dist/bridge/runweave-hook-payload.cjs +578 -0
- package/payload/plugins/pi/dist/bridge/runweave-task-supervision.cjs +167 -0
- package/payload/plugins/pi/dist/runweave.js +316 -0
- package/payload/plugins/toolkit/.codex-plugin/plugin.json +31 -0
- package/payload/plugins/toolkit/README.md +185 -0
- package/payload/plugins/toolkit/hooks/AGENTS.md +6 -0
- package/payload/plugins/toolkit/hooks/app-server-client.cjs +82 -0
- package/payload/plugins/toolkit/hooks/feishu_stop_notify.sh +169 -0
- package/payload/plugins/toolkit/hooks/runweave-hook-bridge.cjs +583 -0
- package/payload/plugins/toolkit/hooks/runweave-hook-completion.cjs +42 -0
- package/payload/plugins/toolkit/hooks/runweave-hook-dispatch.cjs +123 -0
- package/payload/plugins/toolkit/hooks/runweave-hook-payload.cjs +578 -0
- package/payload/plugins/toolkit/hooks/runweave-task-supervision.cjs +167 -0
- package/payload/plugins/toolkit/hooks.json +108 -0
- package/payload/plugins/toolkit/skills/acceptance/SKILL.md +70 -0
- package/payload/plugins/toolkit/skills/acceptance/agents/openai.yaml +4 -0
- package/payload/plugins/toolkit/skills/acceptance/references/capture.md +38 -0
- package/payload/plugins/toolkit/skills/acceptance/references/delivery.md +54 -0
- package/payload/plugins/toolkit/skills/acceptance/references/gallery-contract.md +84 -0
- package/payload/plugins/toolkit/skills/acceptance/references/gallery-copy.md +34 -0
- package/payload/plugins/toolkit/skills/acceptance/references/video.md +52 -0
- package/payload/plugins/toolkit/skills/acceptance/scripts/capture.py +137 -0
- package/payload/plugins/toolkit/skills/acceptance/scripts/common.py +63 -0
- package/payload/plugins/toolkit/skills/acceptance/scripts/gallery.py +353 -0
- package/payload/plugins/toolkit/skills/acceptance/scripts/preview.py +109 -0
- package/payload/plugins/toolkit/skills/acceptance/scripts/video.py +283 -0
- package/payload/plugins/toolkit/skills/acceptance/templates/reader.css +576 -0
- package/payload/plugins/toolkit/skills/acceptance/templates/reader.html +63 -0
- package/payload/plugins/toolkit/skills/acceptance/templates/reader.js +326 -0
- package/payload/plugins/toolkit/skills/acceptance/templates/viewer.css +55 -0
- package/payload/plugins/toolkit/skills/acceptance-gallery/SKILL.md +8 -0
- package/payload/plugins/toolkit/skills/acceptance-gallery/agents/openai.yaml +6 -0
- package/payload/plugins/toolkit/skills/acceptance-gallery/references/capture-and-copy.md +3 -0
- package/payload/plugins/toolkit/skills/acceptance-gallery/references/content-contract.md +3 -0
- package/payload/plugins/toolkit/skills/acceptance-gallery/scripts/gallery.py +9 -0
- package/payload/plugins/toolkit/skills/acceptance-video/SKILL.md +8 -0
- package/payload/plugins/toolkit/skills/acceptance-video/agents/openai.yaml +6 -0
- package/payload/plugins/toolkit/skills/acceptance-video/references/input-and-capture.md +3 -0
- package/payload/plugins/toolkit/skills/acceptance-video/references/mobile-review.md +3 -0
- package/payload/plugins/toolkit/skills/acceptance-video/scripts/capture.py +9 -0
- package/payload/plugins/toolkit/skills/acceptance-video/scripts/video.py +9 -0
- package/payload/plugins/toolkit/skills/agent-device/SKILL.md +86 -0
- package/payload/plugins/toolkit/skills/agent-device/agents/openai.yaml +4 -0
- package/payload/plugins/toolkit/skills/agent-device/references/ios-setup.md +36 -0
- package/payload/plugins/toolkit/skills/agent-device/scripts/device.py +398 -0
- package/payload/plugins/toolkit/skills/agent-device/scripts/resources.py +248 -0
- package/payload/plugins/toolkit/skills/architecture-flow-prototyping/SKILL.md +128 -0
- package/payload/plugins/toolkit/skills/architecture-flow-prototyping/agents/openai.yaml +4 -0
- package/payload/plugins/toolkit/skills/architecture-flow-prototyping/references/architecture-flow-checklist.md +59 -0
- package/payload/plugins/toolkit/skills/architecture-flow-prototyping/references/architecture-flow-guide.md +135 -0
- package/payload/plugins/toolkit/skills/architecture-flow-prototyping/references/architecture-flow-handoff-template.md +57 -0
- package/payload/plugins/toolkit/skills/ask-first/SKILL.md +81 -0
- package/payload/plugins/toolkit/skills/brainstorming/SKILL.md +41 -0
- package/payload/plugins/toolkit/skills/browse-record/SKILL.md +35 -0
- package/payload/plugins/toolkit/skills/browse-record/references/app-usage.md +19 -0
- package/payload/plugins/toolkit/skills/browse-record/references/daily-reporting.md +115 -0
- package/payload/plugins/toolkit/skills/browse-record/references/zhihu.md +33 -0
- package/payload/plugins/toolkit/skills/browse-record/scripts/app_usage.py +110 -0
- package/payload/plugins/toolkit/skills/browse-record/scripts/browse_job.py +385 -0
- package/payload/plugins/toolkit/skills/browse-record/scripts/zhihu-read.js +126 -0
- package/payload/plugins/toolkit/skills/browse-record/scripts/zhihu_http.py +273 -0
- package/payload/plugins/toolkit/skills/clear-technical-explanations/LICENSE +21 -0
- package/payload/plugins/toolkit/skills/clear-technical-explanations/SKILL.md +103 -0
- package/payload/plugins/toolkit/skills/code-grounded-requirements/SKILL.md +54 -0
- package/payload/plugins/toolkit/skills/daily-doc-maintenance/SKILL.md +151 -0
- package/payload/plugins/toolkit/skills/daily-record/SKILL.md +63 -0
- package/payload/plugins/toolkit/skills/daily-record/agents/openai.yaml +4 -0
- package/payload/plugins/toolkit/skills/daily-record/references/browser-history.md +6 -0
- package/payload/plugins/toolkit/skills/daily-record/references/feishu.md +90 -0
- package/payload/plugins/toolkit/skills/daily-record/references/scheduled-reporting.md +144 -0
- package/payload/plugins/toolkit/skills/daily-record/references/scheduled-task.template.json +15 -0
- package/payload/plugins/toolkit/skills/daily-record/references/suiji-work-records.md +57 -0
- package/payload/plugins/toolkit/skills/daily-record/scripts/feishu.py +280 -0
- package/payload/plugins/toolkit/skills/daily-record/scripts/job.py +416 -0
- package/payload/plugins/toolkit/skills/daily-record/scripts/job_browser.py +77 -0
- package/payload/plugins/toolkit/skills/daily-record/scripts/job_facts.py +132 -0
- package/payload/plugins/toolkit/skills/daily-record/scripts/job_isolation.py +69 -0
- package/payload/plugins/toolkit/skills/daily-record/scripts/job_materials.py +154 -0
- package/payload/plugins/toolkit/skills/daily-record/scripts/job_screen.py +77 -0
- package/payload/plugins/toolkit/skills/daily-record/scripts/job_state.py +309 -0
- package/payload/plugins/toolkit/skills/daily-refactor/SKILL.md +101 -0
- package/payload/plugins/toolkit/skills/daily-refactor/scripts/compare-architecture-reports.mjs +168 -0
- package/payload/plugins/toolkit/skills/debugging-strategies/SKILL.md +38 -0
- package/payload/plugins/toolkit/skills/debugging-strategies/resources/implementation-playbook.md +520 -0
- package/payload/plugins/toolkit/skills/diagnostic-log-debugging/SKILL.md +79 -0
- package/payload/plugins/toolkit/skills/doc-coauthoring/SKILL.md +64 -0
- package/payload/plugins/toolkit/skills/eli5/LICENSE +21 -0
- package/payload/plugins/toolkit/skills/eli5/SKILL.md +18 -0
- package/payload/plugins/toolkit/skills/experience/SKILL.md +71 -0
- package/payload/plugins/toolkit/skills/experience/package.json +13 -0
- package/payload/plugins/toolkit/skills/git-advanced-workflows/SKILL.md +457 -0
- package/payload/plugins/toolkit/skills/github-pr/SKILL.md +109 -0
- package/payload/plugins/toolkit/skills/github-pr/scripts/github-access.mjs +292 -0
- package/payload/plugins/toolkit/skills/github-pr/scripts/preflight.mjs +191 -0
- package/payload/plugins/toolkit/skills/github-pr/scripts/source-worktree.mjs +354 -0
- package/payload/plugins/toolkit/skills/grill-with-docs/SKILL.md +66 -0
- package/payload/plugins/toolkit/skills/grill-with-docs/agents/openai.yaml +6 -0
- package/payload/plugins/toolkit/skills/grilling/SKILL.md +14 -0
- package/payload/plugins/toolkit/skills/handoff/SKILL.md +98 -0
- package/payload/plugins/toolkit/skills/karpathy-guidelines/SKILL.md +73 -0
- package/payload/plugins/toolkit/skills/playwright-cli/SKILL.md +562 -0
- package/payload/plugins/toolkit/skills/playwright-cli/references/element-attributes.md +23 -0
- package/payload/plugins/toolkit/skills/playwright-cli/references/playwright-tests.md +39 -0
- package/payload/plugins/toolkit/skills/playwright-cli/references/request-mocking.md +87 -0
- package/payload/plugins/toolkit/skills/playwright-cli/references/running-code.md +240 -0
- package/payload/plugins/toolkit/skills/playwright-cli/references/session-management.md +226 -0
- package/payload/plugins/toolkit/skills/playwright-cli/references/spec-driven-testing.md +312 -0
- package/payload/plugins/toolkit/skills/playwright-cli/references/storage-state.md +275 -0
- package/payload/plugins/toolkit/skills/playwright-cli/references/test-generation.md +138 -0
- package/payload/plugins/toolkit/skills/playwright-cli/references/tracing.md +142 -0
- package/payload/plugins/toolkit/skills/playwright-cli/references/video-recording.md +157 -0
- package/payload/plugins/toolkit/skills/playwright-cli/templates/standalone.config.json +7 -0
- package/payload/plugins/toolkit/skills/product-exploration/SKILL.md +64 -0
- package/payload/plugins/toolkit/skills/product-exploration/agents/openai.yaml +5 -0
- package/payload/plugins/toolkit/skills/prototype-first-development/SKILL.md +134 -0
- package/payload/plugins/toolkit/skills/prototype-first-development/references/html-prototype-template/README.md +88 -0
- package/payload/plugins/toolkit/skills/prototype-first-development/references/html-prototype-template/app.js +145 -0
- package/payload/plugins/toolkit/skills/prototype-first-development/references/html-prototype-template/index.html +229 -0
- package/payload/plugins/toolkit/skills/prototype-first-development/references/html-prototype-template/mock-state.json +60 -0
- package/payload/plugins/toolkit/skills/prototype-first-development/references/implementation-plan-handoff-template.md +61 -0
- package/payload/plugins/toolkit/skills/prototype-first-development/references/prototype-workflow-checklist.md +64 -0
- package/payload/plugins/toolkit/skills/publish-runweave-server/SKILL.md +64 -0
- package/payload/plugins/toolkit/skills/publish-runweave-server/agents/openai.yaml +4 -0
- package/payload/plugins/toolkit/skills/react-best-practices/AGENTS.md +3227 -0
- package/payload/plugins/toolkit/skills/react-best-practices/README.md +127 -0
- package/payload/plugins/toolkit/skills/react-best-practices/SKILL.md +143 -0
- package/payload/plugins/toolkit/skills/react-best-practices/metadata.json +15 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/advanced/event-handler-refs.md +55 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/advanced/init-once.md +42 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/advanced/use-latest.md +39 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/async/api-routes.md +38 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/async/defer-await.md +80 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/async/dependencies.md +52 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/async/parallel.md +28 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/async/suspense-boundaries.md +99 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/bundle/barrel-imports.md +59 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/bundle/conditional.md +37 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/bundle/defer-third-party.md +49 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/bundle/dynamic-imports.md +35 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/bundle/preload.md +46 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/client/event-listeners.md +78 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/client/localstorage-schema.md +77 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/client/passive-event-listeners.md +48 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/client/swr-dedup.md +56 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/js/batch-dom-css.md +110 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/js/cache-function-results.md +80 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/js/cache-property-access.md +28 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/js/cache-storage.md +70 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/js/combine-iterations.md +32 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/js/early-exit.md +50 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/js/flatmap-filter.md +55 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/js/hoist-regexp.md +45 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/js/index-maps.md +37 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/js/length-check-first.md +50 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/js/min-max-loop.md +82 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/js/set-map-lookups.md +24 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/js/tosorted-immutable.md +57 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/meta/sections.md +46 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/meta/template.md +28 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/rendering/activity.md +26 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/rendering/animate-svg-wrapper.md +38 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/rendering/conditional-render.md +32 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/rendering/content-visibility.md +38 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/rendering/hoist-jsx.md +36 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/rendering/hydration-no-flicker.md +72 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/rendering/hydration-suppress-warning.md +26 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/rendering/resource-hints.md +89 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/rendering/script-defer-async.md +71 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/rendering/svg-precision.md +28 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/rendering/usetransition-loading.md +75 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/rerender/defer-reads.md +39 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/rerender/dependencies.md +45 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/rerender/derived-state-no-effect.md +40 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/rerender/derived-state.md +29 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/rerender/functional-setstate.md +77 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/rerender/lazy-state-init.md +58 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/rerender/memo-with-default-value.md +36 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/rerender/memo.md +44 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/rerender/move-effect-to-event.md +45 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/rerender/no-inline-components.md +83 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/rerender/simple-expression-in-memo.md +35 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/rerender/transitions.md +40 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/rerender/use-ref-transient-values.md +73 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/server/after-nonblocking.md +74 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/server/auth-actions.md +96 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/server/cache-lru.md +41 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/server/cache-react.md +76 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/server/dedup-props.md +65 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/server/hoist-static-io.md +139 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/server/parallel-fetching.md +83 -0
- package/payload/plugins/toolkit/skills/react-best-practices/rules/server/serialization.md +38 -0
- package/payload/plugins/toolkit/skills/recorded-browser-mcp-verification/SKILL.md +8 -0
- package/payload/plugins/toolkit/skills/recorded-browser-mcp-verification/agents/openai.yaml +6 -0
- package/payload/plugins/toolkit/skills/reproduce-before-fix/SKILL.md +93 -0
- package/payload/plugins/toolkit/skills/reproduce-before-fix/agents/openai.yaml +7 -0
- package/payload/plugins/toolkit/skills/review-only/SKILL.md +72 -0
- package/payload/plugins/toolkit/skills/review-with-runtime-evidence/SKILL.md +134 -0
- package/payload/plugins/toolkit/skills/review-with-runtime-evidence/agents/openai.yaml +7 -0
- package/payload/plugins/toolkit/skills/review-with-runtime-evidence/references/contracts.md +114 -0
- package/payload/plugins/toolkit/skills/review-with-runtime-evidence/scripts/classify-runtime-verdict.mjs +140 -0
- package/payload/plugins/toolkit/skills/review-with-runtime-evidence/scripts/run-static-review.mjs +389 -0
- package/payload/plugins/toolkit/skills/review-with-runtime-evidence/scripts/static-review-contract.mjs +243 -0
- package/payload/plugins/toolkit/skills/run-test-cases/SKILL.md +63 -0
- package/payload/plugins/toolkit/skills/runweave-change-validation/SKILL.md +196 -0
- package/payload/plugins/toolkit/skills/runweave-change-validation/agents/openai.yaml +7 -0
- package/payload/plugins/toolkit/skills/runweave-change-validation/scripts/assert-dev-session-status.mjs +181 -0
- package/payload/plugins/toolkit/skills/runweave-dev-session/SKILL.md +126 -0
- package/payload/plugins/toolkit/skills/runweave-dev-session/agents/openai.yaml +7 -0
- package/payload/plugins/toolkit/skills/runweave-management/SKILL.md +47 -0
- package/payload/plugins/toolkit/skills/scheduled-task/SKILL.md +35 -0
- package/payload/plugins/toolkit/skills/shadcn/SKILL.md +245 -0
- package/payload/plugins/toolkit/skills/shadcn/agents/openai.yml +5 -0
- package/payload/plugins/toolkit/skills/shadcn/assets/shadcn-small.png +0 -0
- package/payload/plugins/toolkit/skills/shadcn/assets/shadcn.png +0 -0
- package/payload/plugins/toolkit/skills/shadcn/cli.md +276 -0
- package/payload/plugins/toolkit/skills/shadcn/customization.md +209 -0
- package/payload/plugins/toolkit/skills/shadcn/evals/evals.json +47 -0
- package/payload/plugins/toolkit/skills/shadcn/mcp.md +94 -0
- package/payload/plugins/toolkit/skills/shadcn/rules/base-vs-radix.md +310 -0
- package/payload/plugins/toolkit/skills/shadcn/rules/composition.md +197 -0
- package/payload/plugins/toolkit/skills/shadcn/rules/forms.md +198 -0
- package/payload/plugins/toolkit/skills/shadcn/rules/icons.md +101 -0
- package/payload/plugins/toolkit/skills/shadcn/rules/styling.md +163 -0
- package/payload/plugins/toolkit/skills/suiji/SKILL.md +54 -0
- package/payload/plugins/toolkit/skills/suiji/references/api.md +72 -0
- package/payload/plugins/toolkit/skills/suiji/references/source-adapter.md +40 -0
- package/payload/plugins/toolkit/skills/suiji/references/work-records.md +36 -0
- package/payload/plugins/toolkit/skills/suiji/scripts/source_adapter.py +46 -0
- package/payload/plugins/toolkit/skills/suiji/scripts/suiji.py +358 -0
- package/payload/plugins/toolkit/skills/suiji/scripts/work_records.py +328 -0
- package/payload/plugins/toolkit/skills/suiji/scripts/work_reports.py +75 -0
- package/payload/plugins/toolkit/skills/sync-branch-hard-reset/SKILL.md +59 -0
- package/payload/plugins/toolkit/skills/update-runweave-backend/SKILL.md +90 -0
- package/payload/plugins/toolkit/skills/update-runweave-backend/agents/openai.yaml +4 -0
- package/payload/plugins/toolkit/skills/update-runweave-backend/references/npm-update.md +68 -0
- package/payload/plugins/toolkit/skills/update-runweave-backend/references/systemd.md +34 -0
- package/payload/plugins/toolkit/skills/update-runweave-desktop/SKILL.md +102 -0
- package/payload/plugins/toolkit/skills/update-runweave-ios/SKILL.md +16 -0
- package/payload/plugins/toolkit/skills/update-runweave-ios/references/ios-wireless-recovery.md +54 -0
- package/payload/plugins/toolkit/skills/using-rw/SKILL.md +265 -0
- package/payload/plugins/toolkit/skills/write-plan/SKILL.md +72 -0
- package/payload/plugins/toolkit/skills/write-test-cases/SKILL.md +100 -0
- package/payload/plugins/toolkit/skills/write-test-cases/assets/test-plan-template.yaml +15 -0
- package/payload/plugins/toolkit/skills/write-test-cases/references/coverage-checklist.md +75 -0
- package/payload/plugins/toolkit/skills/write-test-cases/references/design-techniques.md +91 -0
- package/payload/plugins/toolkit/skills/youtube-reading/SKILL.md +35 -0
- package/payload/plugins/toolkit/skills/youtube-reading/agents/openai.yaml +4 -0
- package/payload/plugins/toolkit/skills/youtube-reading/assets/runtime-lock.json +92 -0
- package/payload/plugins/toolkit/skills/youtube-reading/references/content-contract.md +52 -0
- package/payload/plugins/toolkit/skills/youtube-reading/references/setup.md +70 -0
- package/payload/plugins/toolkit/skills/youtube-reading/requirements.lock +9 -0
- package/payload/plugins/toolkit/skills/youtube-reading/scripts/artifacts.py +206 -0
- package/payload/plugins/toolkit/skills/youtube-reading/scripts/runtime.py +424 -0
- package/payload/plugins/toolkit/skills/youtube-reading/scripts/youtube_reading.py +314 -0
- package/payload/plugins/toolkit-release.json +1 -0
- package/payload/scripts/toolkit/codex-state.mjs +75 -0
- package/payload/scripts/toolkit/release.mjs +210 -0
- package/payload/scripts/toolkit/sync-runtime.mjs +108 -0
- package/payload/scripts/toolkit/sync.mjs +585 -0
- package/payload/frontend/dist/assets/channel-CuSisha8.js +0 -1
- package/payload/frontend/dist/assets/classDiagram-6PBFFD2Q-ClJkT7PY.js +0 -1
- package/payload/frontend/dist/assets/classDiagram-v2-HSJHXN6E-ClJkT7PY.js +0 -1
- package/payload/frontend/dist/assets/clone-CPcyXi9g.js +0 -1
- package/payload/frontend/dist/assets/connection-BhcgnOMb.js +0 -12
- package/payload/frontend/dist/assets/main-BDBhLSX2.js +0 -696
- package/payload/frontend/dist/assets/main-Cg6Oo1xK.css +0 -33
- package/payload/frontend/dist/assets/stateDiagram-v2-QKLJ7IA2-DhdOfEAv.js +0 -1
- package/payload/frontend/dist/assets/suiji-DXtfgwxj.js +0 -1
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/* global AbortSignal, fetch, module, process, require, URL */
|
|
2
|
+
/* eslint-disable @typescript-eslint/no-require-imports */
|
|
3
|
+
const { spawnSync } = require("node:child_process");
|
|
4
|
+
const os = require("node:os");
|
|
5
|
+
const path = require("node:path");
|
|
6
|
+
const { extractUserPrompt } = require("./runweave-hook-payload.cjs");
|
|
7
|
+
async function requestSupervision({
|
|
8
|
+
source,
|
|
9
|
+
stateEndpoint,
|
|
10
|
+
threadId,
|
|
11
|
+
terminalPanelId,
|
|
12
|
+
terminalSessionId,
|
|
13
|
+
normalizedEvent,
|
|
14
|
+
token,
|
|
15
|
+
payload,
|
|
16
|
+
hookStartedAt,
|
|
17
|
+
debug = () => {},
|
|
18
|
+
}) {
|
|
19
|
+
if (
|
|
20
|
+
source === "codex" &&
|
|
21
|
+
stateEndpoint &&
|
|
22
|
+
threadId &&
|
|
23
|
+
terminalPanelId &&
|
|
24
|
+
process.env.RUNWEAVE_TERMINAL_AGENT_OPERATION_ID &&
|
|
25
|
+
[
|
|
26
|
+
"sessionstart",
|
|
27
|
+
"userpromptsubmit",
|
|
28
|
+
"interrupt",
|
|
29
|
+
"stop",
|
|
30
|
+
"permissionrequest",
|
|
31
|
+
"pretooluse",
|
|
32
|
+
"posttooluse",
|
|
33
|
+
].includes(normalizedEvent)
|
|
34
|
+
) {
|
|
35
|
+
const supervisionEndpoint = new URL(
|
|
36
|
+
"/internal/task-supervision",
|
|
37
|
+
stateEndpoint,
|
|
38
|
+
).toString();
|
|
39
|
+
const version = !["sessionstart", "userpromptsubmit", "stop"].includes(
|
|
40
|
+
normalizedEvent,
|
|
41
|
+
)
|
|
42
|
+
? null
|
|
43
|
+
: spawnSync(
|
|
44
|
+
process.env.RUNWEAVE_CODEX_EXECUTABLE ||
|
|
45
|
+
process.env.RUNWEAVE_CODEX_BINARY ||
|
|
46
|
+
"codex",
|
|
47
|
+
["--version"],
|
|
48
|
+
{
|
|
49
|
+
encoding: "utf8",
|
|
50
|
+
timeout: 500,
|
|
51
|
+
maxBuffer: 1024,
|
|
52
|
+
},
|
|
53
|
+
);
|
|
54
|
+
const event = {
|
|
55
|
+
sessionstart: "SessionStart",
|
|
56
|
+
userpromptsubmit: "UserPromptSubmit",
|
|
57
|
+
interrupt: "Interrupt",
|
|
58
|
+
stop: "Stop",
|
|
59
|
+
permissionrequest: "PermissionRequest",
|
|
60
|
+
pretooluse: "PreToolUse",
|
|
61
|
+
posttooluse: "PostToolUse",
|
|
62
|
+
}[normalizedEvent];
|
|
63
|
+
try {
|
|
64
|
+
const response = await fetch(supervisionEndpoint, {
|
|
65
|
+
method: "POST",
|
|
66
|
+
headers: {
|
|
67
|
+
"Content-Type": "application/json",
|
|
68
|
+
"X-Runweave-Hook-Token": token,
|
|
69
|
+
},
|
|
70
|
+
signal: AbortSignal.timeout(
|
|
71
|
+
normalizedEvent === "stop"
|
|
72
|
+
? Math.max(1, hookStartedAt + 110000 - Date.now())
|
|
73
|
+
: 700,
|
|
74
|
+
),
|
|
75
|
+
body: JSON.stringify({
|
|
76
|
+
target: {
|
|
77
|
+
terminalSessionId,
|
|
78
|
+
panelId: terminalPanelId,
|
|
79
|
+
threadId,
|
|
80
|
+
executorGeneration:
|
|
81
|
+
process.env.RUNWEAVE_TERMINAL_AGENT_OPERATION_ID,
|
|
82
|
+
},
|
|
83
|
+
event,
|
|
84
|
+
...(typeof payload.tool_name === "string"
|
|
85
|
+
? { toolName: payload.tool_name }
|
|
86
|
+
: {}),
|
|
87
|
+
hookVersion: 1,
|
|
88
|
+
codexVersion: String(version?.stdout || "").trim(),
|
|
89
|
+
...(process.env.RUNWEAVE_CODEX_CONFIG_ARGS
|
|
90
|
+
? {
|
|
91
|
+
executionConfig: {
|
|
92
|
+
binary:
|
|
93
|
+
process.env.RUNWEAVE_CODEX_EXECUTABLE ||
|
|
94
|
+
process.env.RUNWEAVE_CODEX_BINARY ||
|
|
95
|
+
"codex",
|
|
96
|
+
home:
|
|
97
|
+
process.env.CODEX_HOME || path.join(os.homedir(), ".codex"),
|
|
98
|
+
cwd: process.cwd(),
|
|
99
|
+
args: JSON.parse(process.env.RUNWEAVE_CODEX_CONFIG_ARGS),
|
|
100
|
+
},
|
|
101
|
+
}
|
|
102
|
+
: {}),
|
|
103
|
+
...(typeof payload.model === "string"
|
|
104
|
+
? { executionModel: payload.model }
|
|
105
|
+
: {}),
|
|
106
|
+
rawTurnId: payload.turn_id || undefined,
|
|
107
|
+
...(normalizedEvent === "stop" &&
|
|
108
|
+
typeof payload.last_assistant_message === "string"
|
|
109
|
+
? { reply: payload.last_assistant_message }
|
|
110
|
+
: {}),
|
|
111
|
+
...(normalizedEvent === "userpromptsubmit"
|
|
112
|
+
? { prompt: extractUserPrompt(payload) }
|
|
113
|
+
: {}),
|
|
114
|
+
deadline:
|
|
115
|
+
hookStartedAt + (normalizedEvent === "stop" ? 110000 : 1500),
|
|
116
|
+
}),
|
|
117
|
+
});
|
|
118
|
+
debug("task supervision hook response", {
|
|
119
|
+
event,
|
|
120
|
+
status: response.status,
|
|
121
|
+
version: String(version?.stdout || "").trim(),
|
|
122
|
+
});
|
|
123
|
+
if (response.ok)
|
|
124
|
+
return { result: await response.json(), endpoint: supervisionEndpoint };
|
|
125
|
+
} catch (error) {
|
|
126
|
+
debug("task supervision hook unavailable", {
|
|
127
|
+
event,
|
|
128
|
+
error: error instanceof Error ? error.name : "unknown",
|
|
129
|
+
});
|
|
130
|
+
/* Allow native stop on unavailable supervision; never paste late input. */
|
|
131
|
+
}
|
|
132
|
+
// Interrupt has a native 3-second ceiling. It only invalidates decisions.
|
|
133
|
+
}
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
async function writeContinuation(offer, token) {
|
|
137
|
+
const supervision = offer?.result;
|
|
138
|
+
if (
|
|
139
|
+
supervision?.action !== "request-continuation" ||
|
|
140
|
+
!offer.endpoint ||
|
|
141
|
+
Date.now() >= supervision.deadline - 1000
|
|
142
|
+
)
|
|
143
|
+
return;
|
|
144
|
+
try {
|
|
145
|
+
const response = await fetch(`${offer.endpoint}/validate`, {
|
|
146
|
+
method: "POST",
|
|
147
|
+
headers: {
|
|
148
|
+
"Content-Type": "application/json",
|
|
149
|
+
"X-Runweave-Hook-Token": token,
|
|
150
|
+
},
|
|
151
|
+
signal: AbortSignal.timeout(700),
|
|
152
|
+
body: JSON.stringify({
|
|
153
|
+
watchId: supervision.watchId,
|
|
154
|
+
decisionId: supervision.decisionId,
|
|
155
|
+
revision: supervision.revision,
|
|
156
|
+
}),
|
|
157
|
+
});
|
|
158
|
+
const result = response.ok ? await response.json() : null;
|
|
159
|
+
if (result?.valid && Date.now() < supervision.deadline - 500)
|
|
160
|
+
process.stdout.write(
|
|
161
|
+
JSON.stringify({ decision: "block", reason: supervision.reason }),
|
|
162
|
+
);
|
|
163
|
+
} catch {
|
|
164
|
+
/* Keep uncertain offers reserved; never replay. */
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
module.exports = { requestSupervision, writeContinuation };
|
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
// Runweave managed Pi extension. Generated by pnpm agents:build; do not edit.
|
|
2
|
+
|
|
3
|
+
// plugins/pi/extensions/runweave.ts
|
|
4
|
+
import { spawnSync } from "node:child_process";
|
|
5
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
6
|
+
import { readFileSync, realpathSync } from "node:fs";
|
|
7
|
+
import { chmod, mkdir, unlink } from "node:fs/promises";
|
|
8
|
+
import { createServer, request } from "node:http";
|
|
9
|
+
import { fileURLToPath } from "node:url";
|
|
10
|
+
|
|
11
|
+
// packages/agent-bridge/src/transport.ts
|
|
12
|
+
import { spawn } from "node:child_process";
|
|
13
|
+
import path from "node:path";
|
|
14
|
+
function createBridgeTransport(source, bundledBridge) {
|
|
15
|
+
let delivery = Promise.resolve();
|
|
16
|
+
return {
|
|
17
|
+
publish(payload) {
|
|
18
|
+
const serialized = JSON.stringify(payload);
|
|
19
|
+
delivery = delivery.then(
|
|
20
|
+
() => new Promise((resolve) => {
|
|
21
|
+
const override = process.env.RUNWEAVE_AGENT_BRIDGE_ROOT;
|
|
22
|
+
const bridge = override ? path.join(override, "runweave-hook-bridge.cjs") : bundledBridge;
|
|
23
|
+
const child = spawn(
|
|
24
|
+
process.execPath,
|
|
25
|
+
[bridge, "--source", source],
|
|
26
|
+
{
|
|
27
|
+
stdio: ["pipe", "ignore", "ignore"]
|
|
28
|
+
}
|
|
29
|
+
);
|
|
30
|
+
const timeout = setTimeout(() => child.kill(), 8e3);
|
|
31
|
+
const finish = () => {
|
|
32
|
+
clearTimeout(timeout);
|
|
33
|
+
resolve();
|
|
34
|
+
};
|
|
35
|
+
child.stdin.on("error", () => {
|
|
36
|
+
});
|
|
37
|
+
child.once("error", finish);
|
|
38
|
+
child.once("close", finish);
|
|
39
|
+
child.stdin.end(serialized);
|
|
40
|
+
})
|
|
41
|
+
).catch(() => {
|
|
42
|
+
});
|
|
43
|
+
},
|
|
44
|
+
drain: () => delivery
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// plugins/pi/extensions/runweave.ts
|
|
49
|
+
import path2 from "node:path";
|
|
50
|
+
function runweave(pi) {
|
|
51
|
+
const terminalSessionId = process.env.RUNWEAVE_TERMINAL_SESSION_ID;
|
|
52
|
+
const tmuxSocket = process.env.TMUX?.split(",")[0];
|
|
53
|
+
const pane = process.env.TMUX_PANE;
|
|
54
|
+
if (!terminalSessionId || !tmuxSocket || !pane) return;
|
|
55
|
+
let context;
|
|
56
|
+
let closed = false;
|
|
57
|
+
let waitingForUI = false;
|
|
58
|
+
let sequence = 0;
|
|
59
|
+
let runId = null;
|
|
60
|
+
let outcome = null;
|
|
61
|
+
let reply = "";
|
|
62
|
+
const instanceId = randomUUID();
|
|
63
|
+
const startedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
64
|
+
const transport = createBridgeTransport(
|
|
65
|
+
"pi",
|
|
66
|
+
fileURLToPath(
|
|
67
|
+
new URL("./bridge/runweave-hook-bridge.cjs", import.meta.url)
|
|
68
|
+
)
|
|
69
|
+
);
|
|
70
|
+
let server;
|
|
71
|
+
let socketPath;
|
|
72
|
+
let ownsSocket = false;
|
|
73
|
+
const applied = /* @__PURE__ */ new Map();
|
|
74
|
+
function publish(ctx, event, hook, extra = {}) {
|
|
75
|
+
if (closed) return;
|
|
76
|
+
const fact = {
|
|
77
|
+
version: 1,
|
|
78
|
+
sessionId: ctx.sessionManager.getSessionId(),
|
|
79
|
+
sessionFile: canonicalSessionFile(ctx.sessionManager.getSessionFile()),
|
|
80
|
+
instanceId,
|
|
81
|
+
startedAt,
|
|
82
|
+
sequence: ++sequence,
|
|
83
|
+
runId,
|
|
84
|
+
leafId: ctx.sessionManager.getLeafId(),
|
|
85
|
+
event,
|
|
86
|
+
outcome
|
|
87
|
+
};
|
|
88
|
+
pi.appendEntry("runweave.lifecycle", {
|
|
89
|
+
...fact,
|
|
90
|
+
terminalSessionId,
|
|
91
|
+
tmuxPaneId: pane,
|
|
92
|
+
operationId: process.env.RUNWEAVE_TERMINAL_AGENT_OPERATION_ID ?? null,
|
|
93
|
+
hook,
|
|
94
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
95
|
+
});
|
|
96
|
+
transport.publish({
|
|
97
|
+
hook_event_name: hook,
|
|
98
|
+
session_id: fact.sessionId,
|
|
99
|
+
cwd: ctx.cwd,
|
|
100
|
+
pi: fact,
|
|
101
|
+
...extra
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
async function openEditor(ctx) {
|
|
105
|
+
if (!ctx.hasUI) return;
|
|
106
|
+
const directory = path2.join(
|
|
107
|
+
"/tmp",
|
|
108
|
+
`rw-pi-${process.getuid?.() ?? "user"}`
|
|
109
|
+
);
|
|
110
|
+
await mkdir(directory, { recursive: true, mode: 448 });
|
|
111
|
+
await chmod(directory, 448);
|
|
112
|
+
const key = createHash("sha256").update(`${tmuxSocket}\0${pane}`).digest("hex").slice(0, 24);
|
|
113
|
+
socketPath = path2.join(directory, `${key}.sock`);
|
|
114
|
+
const alive = await new Promise((resolve) => {
|
|
115
|
+
const probe = request({ socketPath, path: "/", timeout: 300 }, (res) => {
|
|
116
|
+
res.resume();
|
|
117
|
+
resolve(true);
|
|
118
|
+
});
|
|
119
|
+
probe.on("timeout", () => {
|
|
120
|
+
probe.destroy();
|
|
121
|
+
resolve(true);
|
|
122
|
+
});
|
|
123
|
+
probe.on(
|
|
124
|
+
"error",
|
|
125
|
+
(error) => resolve(!["ENOENT", "ECONNREFUSED"].includes(error.code ?? ""))
|
|
126
|
+
);
|
|
127
|
+
probe.end();
|
|
128
|
+
});
|
|
129
|
+
if (alive) {
|
|
130
|
+
closed = true;
|
|
131
|
+
socketPath = void 0;
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
await unlink(socketPath).catch(() => {
|
|
135
|
+
});
|
|
136
|
+
server = createServer((req, res) => {
|
|
137
|
+
let body = "";
|
|
138
|
+
req.setEncoding("utf8");
|
|
139
|
+
req.on("data", (part) => {
|
|
140
|
+
body += part;
|
|
141
|
+
if (Buffer.byteLength(body) > 1024 * 1024) req.destroy();
|
|
142
|
+
});
|
|
143
|
+
req.on("end", () => {
|
|
144
|
+
try {
|
|
145
|
+
const input = JSON.parse(body);
|
|
146
|
+
if (req.method !== "POST" || req.url !== "/editor" || closed || waitingForUI || !context || input.version !== 1 || input.terminalSessionId !== terminalSessionId || input.threadId !== context.sessionManager.getSessionId() || input.instanceId !== instanceId || typeof input.requestId !== "string" || !input.requestId || typeof input.text !== "string")
|
|
147
|
+
throw new Error("Pi editor identity mismatch");
|
|
148
|
+
if (applied.has(input.requestId))
|
|
149
|
+
throw new Error(
|
|
150
|
+
"Pi editor request was already applied; inspect the terminal before retrying"
|
|
151
|
+
);
|
|
152
|
+
if (!applied.has(input.requestId)) {
|
|
153
|
+
context.ui.setEditorText(input.text);
|
|
154
|
+
applied.set(input.requestId, input.text);
|
|
155
|
+
if (applied.size > 64) applied.delete(applied.keys().next().value);
|
|
156
|
+
}
|
|
157
|
+
res.setHeader("Content-Type", "application/json");
|
|
158
|
+
res.end(JSON.stringify({ applied: true }));
|
|
159
|
+
} catch {
|
|
160
|
+
res.statusCode = 409;
|
|
161
|
+
res.end(
|
|
162
|
+
JSON.stringify({
|
|
163
|
+
applied: false,
|
|
164
|
+
error: "Pi editor unavailable or identity changed"
|
|
165
|
+
})
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
await new Promise((resolve, reject) => {
|
|
171
|
+
server.once("error", reject);
|
|
172
|
+
server.listen(socketPath, resolve);
|
|
173
|
+
});
|
|
174
|
+
ownsSocket = true;
|
|
175
|
+
await chmod(socketPath, 384);
|
|
176
|
+
}
|
|
177
|
+
pi.on("session_start", async (event, ctx) => {
|
|
178
|
+
if (!ctx.hasUI) {
|
|
179
|
+
closed = true;
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
try {
|
|
183
|
+
let directory = path2.dirname(realpathSync(process.argv[1]));
|
|
184
|
+
let version = "";
|
|
185
|
+
for (let depth = 0; depth < 5; depth++, directory = path2.dirname(directory)) {
|
|
186
|
+
try {
|
|
187
|
+
const pkg = JSON.parse(
|
|
188
|
+
readFileSync(path2.join(directory, "package.json"), "utf8")
|
|
189
|
+
);
|
|
190
|
+
if (pkg.name === "@earendil-works/pi-coding-agent") {
|
|
191
|
+
version = pkg.version;
|
|
192
|
+
break;
|
|
193
|
+
}
|
|
194
|
+
} catch {
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
const [major, minor, patch] = version.split(".").map(Number);
|
|
198
|
+
if (major !== 0 || minor < 85 || minor === 85 && patch < 1)
|
|
199
|
+
throw new Error("unsupported");
|
|
200
|
+
} catch {
|
|
201
|
+
closed = true;
|
|
202
|
+
if (ctx.hasUI)
|
|
203
|
+
ctx.ui.notify(
|
|
204
|
+
"Runweave requires Pi 0.85.1 or a compatible 0.x release",
|
|
205
|
+
"warning"
|
|
206
|
+
);
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
context = ctx;
|
|
210
|
+
const result = spawnSync(
|
|
211
|
+
process.env.RUNWEAVE_RUNTIME_TMUX_BINARY || "tmux",
|
|
212
|
+
[
|
|
213
|
+
"-S",
|
|
214
|
+
tmuxSocket,
|
|
215
|
+
"display-message",
|
|
216
|
+
"-p",
|
|
217
|
+
"-t",
|
|
218
|
+
pane,
|
|
219
|
+
"#{@runweave_panel_id}"
|
|
220
|
+
],
|
|
221
|
+
{ encoding: "utf8", timeout: 1e3 }
|
|
222
|
+
);
|
|
223
|
+
const panelId = result.status === 0 ? result.stdout.trim() : "";
|
|
224
|
+
if (!panelId) {
|
|
225
|
+
closed = true;
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
process.env.RUNWEAVE_TERMINAL_PANEL_ID = panelId;
|
|
229
|
+
await openEditor(ctx).catch(
|
|
230
|
+
() => ctx.ui.notify("Runweave Pi editor unavailable", "warning")
|
|
231
|
+
);
|
|
232
|
+
publish(ctx, `session_start:${event.reason}`, "SessionStart", {
|
|
233
|
+
source: event.reason === "resume" ? "resume" : "startup"
|
|
234
|
+
});
|
|
235
|
+
});
|
|
236
|
+
pi.on("agent_start", (_event, ctx) => {
|
|
237
|
+
runId ??= randomUUID();
|
|
238
|
+
outcome = null;
|
|
239
|
+
reply = "";
|
|
240
|
+
publish(ctx, "agent_start", "UserPromptSubmit");
|
|
241
|
+
});
|
|
242
|
+
pi.on("message_start", (event, ctx) => {
|
|
243
|
+
if (event.message.role === "user") {
|
|
244
|
+
const content = event.message.content;
|
|
245
|
+
const prompt = typeof content === "string" ? content : content.filter((part) => part.type === "text").map((part) => part.text).join("\n");
|
|
246
|
+
publish(ctx, "user_message", "UserPromptSubmit", {
|
|
247
|
+
prompt: prompt.slice(0, 8e3)
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
});
|
|
251
|
+
pi.on("message_end", (event) => {
|
|
252
|
+
if (event.message.role !== "assistant") return;
|
|
253
|
+
outcome = event.message.stopReason === "error" ? "failed" : event.message.stopReason === "aborted" ? "interrupted" : event.message.stopReason === "stop" ? "completed" : null;
|
|
254
|
+
reply = event.message.content.filter((part) => part.type === "text").map((part) => part.text).join("\n").slice(0, 8e3);
|
|
255
|
+
});
|
|
256
|
+
pi.on("agent_settled", (_event, ctx) => {
|
|
257
|
+
if (!ctx.isIdle() || !runId) return;
|
|
258
|
+
publish(ctx, "agent_settled", "Stop", { last_assistant_message: reply });
|
|
259
|
+
runId = null;
|
|
260
|
+
});
|
|
261
|
+
pi.on(
|
|
262
|
+
"tool_execution_start",
|
|
263
|
+
(event, ctx) => publish(ctx, "tool_execution_start", "PreToolUse", {
|
|
264
|
+
tool_use_id: event.toolCallId,
|
|
265
|
+
tool_name: event.toolName
|
|
266
|
+
})
|
|
267
|
+
);
|
|
268
|
+
pi.on(
|
|
269
|
+
"tool_execution_end",
|
|
270
|
+
(event, ctx) => publish(ctx, "tool_execution_end", "PostToolUse", {
|
|
271
|
+
tool_use_id: event.toolCallId,
|
|
272
|
+
tool_name: event.toolName,
|
|
273
|
+
is_error: event.isError
|
|
274
|
+
})
|
|
275
|
+
);
|
|
276
|
+
pi.on("ui_prompt_start", (_event, ctx) => {
|
|
277
|
+
waitingForUI = true;
|
|
278
|
+
publish(ctx, "ui_prompt_start", "AgentMetadata");
|
|
279
|
+
});
|
|
280
|
+
pi.on("ui_prompt_end", (_event, ctx) => {
|
|
281
|
+
waitingForUI = false;
|
|
282
|
+
publish(ctx, "ui_prompt_end", "AgentMetadata");
|
|
283
|
+
});
|
|
284
|
+
pi.on(
|
|
285
|
+
"session_tree",
|
|
286
|
+
(_event, ctx) => publish(ctx, "session_tree", "AgentMetadata")
|
|
287
|
+
);
|
|
288
|
+
pi.on(
|
|
289
|
+
"model_select",
|
|
290
|
+
(_event, ctx) => publish(ctx, "model_select", "AgentMetadata")
|
|
291
|
+
);
|
|
292
|
+
pi.on("session_shutdown", async () => {
|
|
293
|
+
closed = true;
|
|
294
|
+
context = void 0;
|
|
295
|
+
if (server?.listening)
|
|
296
|
+
await new Promise((resolve) => server.close(() => resolve()));
|
|
297
|
+
if (ownsSocket && socketPath) await unlink(socketPath).catch(() => {
|
|
298
|
+
});
|
|
299
|
+
await transport.drain();
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
function canonicalSessionFile(file) {
|
|
303
|
+
if (!file) return null;
|
|
304
|
+
try {
|
|
305
|
+
return realpathSync(file);
|
|
306
|
+
} catch {
|
|
307
|
+
try {
|
|
308
|
+
return path2.join(realpathSync(path2.dirname(file)), path2.basename(file));
|
|
309
|
+
} catch {
|
|
310
|
+
return file;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
export {
|
|
315
|
+
runweave as default
|
|
316
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "toolkit",
|
|
3
|
+
"version": "0.2.0+codex.d39956a605cbf4666c1ca235b085ba12dd5bef055a944658a64f4da7cb8da081",
|
|
4
|
+
"description": "Runweave Toolkit plugin for project-specific skills and automation extensions.",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "Runweave"
|
|
7
|
+
},
|
|
8
|
+
"keywords": [
|
|
9
|
+
"runweave",
|
|
10
|
+
"codex",
|
|
11
|
+
"skills"
|
|
12
|
+
],
|
|
13
|
+
"hooks": "./hooks.json",
|
|
14
|
+
"skills": "./skills/",
|
|
15
|
+
"interface": {
|
|
16
|
+
"displayName": "Runweave Toolkit",
|
|
17
|
+
"shortDescription": "Runweave-specific toolkit skills and automations.",
|
|
18
|
+
"longDescription": "A repo-maintained toolkit plugin that packages Runweave-specific skills and related automation surfaces.",
|
|
19
|
+
"developerName": "Runweave",
|
|
20
|
+
"category": "Productivity",
|
|
21
|
+
"capabilities": [
|
|
22
|
+
"Write",
|
|
23
|
+
"Interactive"
|
|
24
|
+
],
|
|
25
|
+
"defaultPrompt": [
|
|
26
|
+
"Use Runweave toolkit skills in this repo.",
|
|
27
|
+
"Review Runweave repo instructions before coding.",
|
|
28
|
+
"Run Runweave validation commands for this change."
|
|
29
|
+
]
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
# Runweave Toolkit 插件
|
|
2
|
+
|
|
3
|
+
这个仓库本地插件是 Runweave Toolkit skills 的唯一规范来源。
|
|
4
|
+
|
|
5
|
+
Skills 统一维护在:
|
|
6
|
+
|
|
7
|
+
```text
|
|
8
|
+
plugins/toolkit/skills/<skill-name>/SKILL.md
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
不要把符号链接作为激活机制。文件存在于这个仓库磁盘上,并不代表当前 Codex 会话已经加载它们。
|
|
12
|
+
|
|
13
|
+
## 已包含的 Skills
|
|
14
|
+
|
|
15
|
+
- [`acceptance`](./skills/acceptance/SKILL.md):统一手机验收材料入口,默认图文,按判断需要提供视频或原始录屏;共用采集、预览与检查流程。
|
|
16
|
+
|
|
17
|
+
- [`agent-device`](./skills/agent-device/SKILL.md):iOS 模拟器和真机上的 Agent 交互验收,包含设备预检、独立会话及证据记录。
|
|
18
|
+
- [`update-runweave-ios`](./skills/update-runweave-ios/SKILL.md):通过统一 CLI 更新 Runweave 到 iPhone,自动递增产品版本和构建号并核对安装和启动;也可脱离 Agent 直接执行命令。
|
|
19
|
+
- [`publish-runweave-server`](./skills/publish-runweave-server/SKILL.md):发布 Server/CLI npm 新版本,跟进四平台 CI、OIDC、公共安装验证和标签;不自动部署机器。
|
|
20
|
+
- [`update-runweave-backend`](./skills/update-runweave-backend/SKILL.md):完整更新 Linux 后台及已部署配套服务,检查并补齐 systemd 托管与开机自启,区分运行验证和整机重启验证。
|
|
21
|
+
- `brainstorming`
|
|
22
|
+
- [`ask-first`](./skills/ask-first/SKILL.md):复杂任务执行前先探索项目,只对齐高返工成本的关键取舍;源自 ByteTech 的 Ask First,支持按需并行探索,沿用已有授权,不强制文档流程。
|
|
23
|
+
- `code-grounded-requirements`
|
|
24
|
+
- [`clear-technical-explanations`](./skills/clear-technical-explanations/SKILL.md):社区 ASD-STE100 skill 的中文适配,保留 Strict / STE-flavored 两种文本改写模式、语义核对与默认纯文本输出。
|
|
25
|
+
- `daily-doc-maintenance`
|
|
26
|
+
- `daily-refactor`
|
|
27
|
+
- [`daily-record`](./skills/daily-record/SKILL.md):按日期和项目记录本机 Agent 与飞书本人事项,先筛选本人消息再补上下文,合并文档、聊天和 Agent 的重复事实。
|
|
28
|
+
- `debugging-strategies`
|
|
29
|
+
- `diagnostic-log-debugging`
|
|
30
|
+
- `doc-coauthoring`
|
|
31
|
+
- [`eli5`](./skills/eli5/SKILL.md):用大图和少量文字生成零基础 HTML 图解;源自 [Thariq Shihipar 的上游技能](https://github.com/anthropics/claude-plugins-community/blob/863e70dc7cff21a2facc749e40a7ecd1a5d19833/eli5/skills/eli5/SKILL.md),保留核心指令并适配 Codex 主题参数。
|
|
32
|
+
- [`experience`](./skills/experience/SKILL.md):任意 Git 项目的按需经验检索与结果反馈;按仓库隔离,不依赖项目 `AGENTS.md`。
|
|
33
|
+
- `git-advanced-workflows`
|
|
34
|
+
- `grill-with-docs`
|
|
35
|
+
- `grilling`
|
|
36
|
+
- `github-pr`
|
|
37
|
+
- `handoff`
|
|
38
|
+
- `karpathy-guidelines`
|
|
39
|
+
- `playwright-cli`
|
|
40
|
+
- [`product-exploration`](./skills/product-exploration/SKILL.md):显式调用的产品探索,默认 30 分钟;只取证报告,不生成测试代码或自动修复。
|
|
41
|
+
- `react-best-practices`
|
|
42
|
+
- `review-only`
|
|
43
|
+
- `runweave-change-validation`
|
|
44
|
+
- `runweave-dev-session`
|
|
45
|
+
- `run-test-cases`
|
|
46
|
+
- `shadcn`
|
|
47
|
+
- `sync-branch-hard-reset`
|
|
48
|
+
- `using-rw`
|
|
49
|
+
- `write-plan`
|
|
50
|
+
- `write-test-cases`
|
|
51
|
+
|
|
52
|
+
- [youtube-reading](./skills/youtube-reading/SKILL.md):YouTube 字幕与本机识别、保守校对翻译,交付导读与完整中文正文。
|
|
53
|
+
|
|
54
|
+
原 [`acceptance-gallery`](./skills/acceptance-gallery/SKILL.md)、[`acceptance-video`](./skills/acceptance-video/SKILL.md) 和 [`recorded-browser-mcp-verification`](./skills/recorded-browser-mcp-verification/SKILL.md) 仅作为显式兼容入口;实现与规则统一维护在 `acceptance/`,已有脚本路径继续转发。
|
|
55
|
+
|
|
56
|
+
## 随记
|
|
57
|
+
|
|
58
|
+
[`suiji`](./skills/suiji/SKILL.md) 支持在任意终端搜索随记或读取交接指令,完整结果在当前终端交付,随记只追加简短最终摘要,默认不上传图片或文档;用户确认后可完成待办。该目录可单独安装,Python 客户端不依赖本仓库或 Runweave Backend。
|
|
59
|
+
|
|
60
|
+
## 验证
|
|
61
|
+
|
|
62
|
+
以下命令从仓库根目录执行。
|
|
63
|
+
|
|
64
|
+
验证插件 manifest 和打包的 skills:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
CODEX_HOME="${CODEX_HOME:-$HOME/.codex}"
|
|
68
|
+
uv run --with pyyaml python "$CODEX_HOME/skills/.system/plugin-creator/scripts/validate_plugin.py" \
|
|
69
|
+
plugins/toolkit
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
验证单个 skill(使用项目内入口,官方校验器保持只读):
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
pnpm toolkit:validate -- plugins/toolkit/skills/github-pr
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
入口需要 `uv`,从 `CODEX_HOME`(默认 `~/.codex`)定位官方 `skill-creator` 校验器,在隔离环境准备 PyYAML 后调用;不修改全局 Python 依赖、官方技能、项目 Python 环境或提交钩子。首次准备依赖可能需要网络。正常校验的输出与退出码原样保留:0 为通过,1 为内容不合格;启动、依赖准备或执行异常返回 2,不能当作内容校验失败。
|
|
79
|
+
|
|
80
|
+
验证每个 skill(任一失败立即停止,避免后续成功掩盖失败):
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
for skill_dir in plugins/toolkit/skills/*; do
|
|
84
|
+
[ -d "$skill_dir" ] || continue
|
|
85
|
+
pnpm toolkit:validate -- "$skill_dir" || exit "$?"
|
|
86
|
+
done
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## 本地安装
|
|
90
|
+
|
|
91
|
+
注册仓库本地 marketplace:
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
codex plugin marketplace add .
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
读取 marketplace 名称并安装插件:
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
CODEX_HOME="${CODEX_HOME:-$HOME/.codex}"
|
|
101
|
+
MARKETPLACE_NAME="$(python3 "$CODEX_HOME/skills/.system/plugin-creator/scripts/read_marketplace_name.py" \
|
|
102
|
+
--marketplace-path .agents/plugins/marketplace.json)"
|
|
103
|
+
codex plugin add "toolkit@$MARKETPLACE_NAME"
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
`experience` 是可选 skill:Codex 用户主动安装 Toolkit 后发现它;Pi 用户可单独安装同一源码目录:
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
pi install /absolute/path/to/browser-viewer/plugins/toolkit/skills/experience
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
该目录自带 Pi package manifest,不依赖构建或 Electron 分发副本。桌面启动和 Pi hooks 安装器
|
|
113
|
+
不会安装、升级或覆盖这个 skill;未安装就不提供该检索入口,不做自动补装。
|
|
114
|
+
项目无需写入提示文件。已有 CLI 和认证连接可用后,Agent 按问题选择 skill,不在启动时强制检索。
|
|
115
|
+
|
|
116
|
+
重新安装后,在新的 Codex 线程中验证 skill 加载。不要依赖当前线程热加载插件 skills。
|
|
117
|
+
|
|
118
|
+
## 更新流程
|
|
119
|
+
|
|
120
|
+
开发过程中更新这个本地插件时,使用 cachebuster helper,不要手动编辑 marketplace 元数据:
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
CODEX_HOME="${CODEX_HOME:-$HOME/.codex}"
|
|
124
|
+
python3 "$CODEX_HOME/skills/.system/plugin-creator/scripts/update_plugin_cachebuster.py" \
|
|
125
|
+
plugins/toolkit
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
然后读取 marketplace 名称并重新安装插件:
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
CODEX_HOME="${CODEX_HOME:-$HOME/.codex}"
|
|
132
|
+
MARKETPLACE_NAME="$(python3 "$CODEX_HOME/skills/.system/plugin-creator/scripts/read_marketplace_name.py" \
|
|
133
|
+
--marketplace-path .agents/plugins/marketplace.json)"
|
|
134
|
+
codex plugin add "toolkit@$MARKETPLACE_NAME"
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
Hooks 运行时代码放在 `plugins/toolkit/hooks/`。
|
|
138
|
+
|
|
139
|
+
- Codex hook 配置由 `plugins/toolkit/.codex-plugin/plugin.json` 的 `hooks` 字段显式指向
|
|
140
|
+
`plugins/toolkit/hooks.json`,随 `toolkit@runweave` 和 `toolkit@local` 安装进入插件缓存。
|
|
141
|
+
- 不要只在插件根目录放置 `hooks.json` 而不更新 manifest;新启动的 Codex 进程不会因为
|
|
142
|
+
该文件存在就自动执行 hook。
|
|
143
|
+
- Electron 安装器会从同步后的 `electron/resources/hooks/` 运行副本安装 launcher 与
|
|
144
|
+
兼容/清理层,旧的 Codex 全局 hooks 与 Trae 全局 TOML hook 会被去重清理。
|
|
145
|
+
|
|
146
|
+
## 自动更新
|
|
147
|
+
|
|
148
|
+
提交时如果 staged diff 包含 `plugins/toolkit` 或 `.agents/plugins/marketplace.json`,pre-commit 会先执行:
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
pnpm toolkit:sync:staged
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
该命令会同步 toolkit hook 资产到 Electron resources,并将插件安装到 Codex 的
|
|
155
|
+
`toolkit@runweave` 与 Trae CLI 的 `toolkit@local`。分发版本由实际文件内容决定,
|
|
156
|
+
与同步时间、工作区路径无关;相同内容跳过重复安装,不改写源码 manifest 的版本。
|
|
157
|
+
插件 `hooks.json` 与 hook 运行副本写回本次提交。需要跳过本机插件安装时,可设置:
|
|
158
|
+
|
|
159
|
+
三个工作区共用 `$CODEX_HOME/plugins/sources/runweave` 下的固定 marketplace 和不可变
|
|
160
|
+
内容版本,同步安装通过本机锁串行执行,不再将全局 marketplace 来回切换到不同工作区。
|
|
161
|
+
自动提交只由主工作区发布全局插件;linked worktree 的提交仅生成并暂存本地资产,
|
|
162
|
+
避免旧分支回退全局插件。需要主动发布某个工作区时,在该工作区运行 `pnpm toolkit:sync`。
|
|
163
|
+
包内只包含 Git 跟踪或未忽略的分发文件,不包含 `.playwright-cli` 等本地运行产物。
|
|
164
|
+
真实插件内容变化仍需在 Codex 的 `/hooks` 中审核;同步命令不修改任何 Hook 信任记录。
|
|
165
|
+
|
|
166
|
+
Codex 线程启动后会保存已加载 skill 的缓存绝对路径。`pnpm toolkit:sync` 会在重新安装
|
|
167
|
+
Codex 插件前快照现有 Toolkit 缓存,并在安装后恢复被历史会话引用过的旧 cachebuster
|
|
168
|
+
真实目录,避免已经打开的线程继续调用旧 skill 时遇到 `SKILL.md` 路径不存在。新线程仍会
|
|
169
|
+
加载最新版本。
|
|
170
|
+
|
|
171
|
+
```bash
|
|
172
|
+
RUNWEAVE_SKIP_TOOLKIT_PLUGIN_SYNC=1 git commit
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
也可以手动执行完整同步:
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
pnpm toolkit:sync
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
Hook 链路的真实验证命令:
|
|
182
|
+
|
|
183
|
+
```bash
|
|
184
|
+
pnpm toolkit:verify-hooks
|
|
185
|
+
```
|