@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,138 @@
|
|
|
1
|
+
# Test Generation
|
|
2
|
+
|
|
3
|
+
Generate Playwright test code automatically as you interact with the browser.
|
|
4
|
+
|
|
5
|
+
## How It Works
|
|
6
|
+
|
|
7
|
+
Every action you perform with `playwright-cli` generates corresponding Playwright TypeScript code.
|
|
8
|
+
This code appears in the output and can be copied directly into your test files.
|
|
9
|
+
|
|
10
|
+
## Example Workflow
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
# Start a session
|
|
14
|
+
playwright-cli open https://example.com/login
|
|
15
|
+
|
|
16
|
+
# Take a snapshot to see elements
|
|
17
|
+
playwright-cli snapshot
|
|
18
|
+
# Output shows: e1 [textbox "Email"], e2 [textbox "Password"], e3 [button "Sign In"]
|
|
19
|
+
|
|
20
|
+
# Fill form fields - generates code automatically
|
|
21
|
+
playwright-cli fill e1 "user@example.com"
|
|
22
|
+
# Ran Playwright code:
|
|
23
|
+
# await page.getByRole('textbox', { name: 'Email' }).fill('user@example.com');
|
|
24
|
+
|
|
25
|
+
playwright-cli fill e2 "password123"
|
|
26
|
+
# Ran Playwright code:
|
|
27
|
+
# await page.getByRole('textbox', { name: 'Password' }).fill('password123');
|
|
28
|
+
|
|
29
|
+
playwright-cli click e3
|
|
30
|
+
# Ran Playwright code:
|
|
31
|
+
# await page.getByRole('button', { name: 'Sign In' }).click();
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Building a Test File
|
|
35
|
+
|
|
36
|
+
Collect the generated code into a Playwright test:
|
|
37
|
+
|
|
38
|
+
```typescript
|
|
39
|
+
import { test, expect } from "@playwright/test";
|
|
40
|
+
|
|
41
|
+
test("login flow", async ({ page }) => {
|
|
42
|
+
// Generated code from playwright-cli session:
|
|
43
|
+
await page.goto("https://example.com/login");
|
|
44
|
+
await page.getByRole("textbox", { name: "Email" }).fill("user@example.com");
|
|
45
|
+
await page.getByRole("textbox", { name: "Password" }).fill("password123");
|
|
46
|
+
await page.getByRole("button", { name: "Sign In" }).click();
|
|
47
|
+
|
|
48
|
+
// Add assertions
|
|
49
|
+
await expect(page).toHaveURL(/.*dashboard/);
|
|
50
|
+
});
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Best Practices
|
|
54
|
+
|
|
55
|
+
### 1. Use Semantic Locators
|
|
56
|
+
|
|
57
|
+
The generated code uses role-based locators when possible, which are more resilient:
|
|
58
|
+
|
|
59
|
+
```typescript
|
|
60
|
+
// Generated (good - semantic)
|
|
61
|
+
await page.getByRole("button", { name: "Submit" }).click();
|
|
62
|
+
|
|
63
|
+
// Avoid (fragile - CSS selectors)
|
|
64
|
+
await page.locator("#submit-btn").click();
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### 2. Explore Before Recording
|
|
68
|
+
|
|
69
|
+
Take snapshots to understand the page structure before recording actions:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
playwright-cli open https://example.com
|
|
73
|
+
playwright-cli snapshot
|
|
74
|
+
# Review the element structure
|
|
75
|
+
playwright-cli click e5
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### 3. Add Assertions Manually
|
|
79
|
+
|
|
80
|
+
Generated code captures actions but not assertions. Add expectations in your test using one of the recommended matchers:
|
|
81
|
+
|
|
82
|
+
- `toBeVisible()` — element is rendered and visible
|
|
83
|
+
- `toHaveText(text)` — element text content matches
|
|
84
|
+
- `toHaveValue(value) / toBeEmpty()` — input/select value matches
|
|
85
|
+
- `toBeChecked() / toBeUnchecked()` — checkbox state matches
|
|
86
|
+
- `toMatchAriaSnapshot(snapshot)` — page (or locator) matches a partial accessibility snapshot
|
|
87
|
+
|
|
88
|
+
Use `playwright-cli generate-locator <target>` to produce the locator expression for the assertion, and the snapshot/eval commands to capture the expected value.
|
|
89
|
+
|
|
90
|
+
When asserting text content, make sure that generated locator does not contain text from the element itself. `getByTestId()` or `getByLabel()` usually work well with asserting text. When locator is text-based, prefer `toBeVisible()` instead.
|
|
91
|
+
|
|
92
|
+
Snapshot to be matched does not have to contain all the information - only capture what's necessary for the assertion. You can use regular expressions for unstable values.
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
# Get a stable locator for an element ref to use in the assertion
|
|
96
|
+
playwright-cli --raw generate-locator e5
|
|
97
|
+
# getByRole('button', { name: 'Submit' })
|
|
98
|
+
|
|
99
|
+
# Capture expected text content for toHaveText
|
|
100
|
+
playwright-cli --raw eval "el => el.textContent" e5
|
|
101
|
+
|
|
102
|
+
# Capture expected input value for toHaveValue/toBeEmpty
|
|
103
|
+
playwright-cli --raw eval "el => el.value" e5
|
|
104
|
+
|
|
105
|
+
# Capture expected aria snapshot for toMatchAriaSnapshot/toBeChecked
|
|
106
|
+
# (whole page, or use a ref to scope to a region)
|
|
107
|
+
playwright-cli --raw snapshot
|
|
108
|
+
playwright-cli --raw snapshot e5
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
```typescript
|
|
112
|
+
// Generated action
|
|
113
|
+
await page.getByRole("button", { name: "Submit" }).click();
|
|
114
|
+
|
|
115
|
+
// Manual assertions using the outputs above:
|
|
116
|
+
await expect(page.getByRole("alert", { name: "Success" })).toBeVisible();
|
|
117
|
+
await expect(page.getByTestId("main-header")).toHaveText("Welcome, user");
|
|
118
|
+
await expect(page.getByRole("textbox", { name: "Email" })).toHaveValue(
|
|
119
|
+
"user@example.com",
|
|
120
|
+
);
|
|
121
|
+
await expect(
|
|
122
|
+
page.getByRole("checkbox", { name: "Enable notifications" }),
|
|
123
|
+
).toBeChecked();
|
|
124
|
+
|
|
125
|
+
// toMatchAriaSnapshot on the whole page, finds a matching region
|
|
126
|
+
await expect(page).toMatchAriaSnapshot(`
|
|
127
|
+
- heading "Welcome, user"
|
|
128
|
+
- link /\\d+ new messages?/
|
|
129
|
+
- button "Sign out"
|
|
130
|
+
`);
|
|
131
|
+
|
|
132
|
+
// toMatchAriaSnapshot scoped to a region
|
|
133
|
+
await expect(page.getByRole("navigation")).toMatchAriaSnapshot(`
|
|
134
|
+
- link "Home"
|
|
135
|
+
- link /\\d+ new messages?/
|
|
136
|
+
- link "Profile"
|
|
137
|
+
`);
|
|
138
|
+
```
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
# Tracing
|
|
2
|
+
|
|
3
|
+
Capture detailed execution traces for debugging and analysis. Traces include DOM snapshots, screenshots, network activity, and console logs.
|
|
4
|
+
|
|
5
|
+
## Basic Usage
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# Start trace recording
|
|
9
|
+
playwright-cli tracing-start
|
|
10
|
+
|
|
11
|
+
# Perform actions
|
|
12
|
+
playwright-cli open https://example.com
|
|
13
|
+
playwright-cli click e1
|
|
14
|
+
playwright-cli fill e2 "test"
|
|
15
|
+
|
|
16
|
+
# Stop trace recording
|
|
17
|
+
playwright-cli tracing-stop
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Trace Output Files
|
|
21
|
+
|
|
22
|
+
When you start tracing, Playwright creates a `traces/` directory with several files:
|
|
23
|
+
|
|
24
|
+
### `trace-{timestamp}.trace`
|
|
25
|
+
|
|
26
|
+
**Action log** - The main trace file containing:
|
|
27
|
+
|
|
28
|
+
- Every action performed (clicks, fills, navigations)
|
|
29
|
+
- DOM snapshots before and after each action
|
|
30
|
+
- Screenshots at each step
|
|
31
|
+
- Timing information
|
|
32
|
+
- Console messages
|
|
33
|
+
- Source locations
|
|
34
|
+
|
|
35
|
+
### `trace-{timestamp}.network`
|
|
36
|
+
|
|
37
|
+
**Network log** - Complete network activity:
|
|
38
|
+
|
|
39
|
+
- All HTTP requests and responses
|
|
40
|
+
- Request headers and bodies
|
|
41
|
+
- Response headers and bodies
|
|
42
|
+
- Timing (DNS, connect, TLS, TTFB, download)
|
|
43
|
+
- Resource sizes
|
|
44
|
+
- Failed requests and errors
|
|
45
|
+
|
|
46
|
+
### `resources/`
|
|
47
|
+
|
|
48
|
+
**Resources directory** - Cached resources:
|
|
49
|
+
|
|
50
|
+
- Images, fonts, stylesheets, scripts
|
|
51
|
+
- Response bodies for replay
|
|
52
|
+
- Assets needed to reconstruct page state
|
|
53
|
+
|
|
54
|
+
## What Traces Capture
|
|
55
|
+
|
|
56
|
+
| Category | Details |
|
|
57
|
+
| --------------- | -------------------------------------------------- |
|
|
58
|
+
| **Actions** | Clicks, fills, hovers, keyboard input, navigations |
|
|
59
|
+
| **DOM** | Full DOM snapshot before/after each action |
|
|
60
|
+
| **Screenshots** | Visual state at each step |
|
|
61
|
+
| **Network** | All requests, responses, headers, bodies, timing |
|
|
62
|
+
| **Console** | All console.log, warn, error messages |
|
|
63
|
+
| **Timing** | Precise timing for each operation |
|
|
64
|
+
|
|
65
|
+
## Use Cases
|
|
66
|
+
|
|
67
|
+
### Debugging Failed Actions
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
playwright-cli tracing-start
|
|
71
|
+
playwright-cli open https://app.example.com
|
|
72
|
+
|
|
73
|
+
# This click fails - why?
|
|
74
|
+
playwright-cli click e5
|
|
75
|
+
|
|
76
|
+
playwright-cli tracing-stop
|
|
77
|
+
# Open trace to see DOM state when click was attempted
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Analyzing Performance
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
playwright-cli tracing-start
|
|
84
|
+
playwright-cli open https://slow-site.com
|
|
85
|
+
playwright-cli tracing-stop
|
|
86
|
+
|
|
87
|
+
# View network waterfall to identify slow resources
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Capturing Evidence
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
# Record a complete user flow for documentation
|
|
94
|
+
playwright-cli tracing-start
|
|
95
|
+
|
|
96
|
+
playwright-cli open https://app.example.com/checkout
|
|
97
|
+
playwright-cli fill e1 "4111111111111111"
|
|
98
|
+
playwright-cli fill e2 "12/25"
|
|
99
|
+
playwright-cli fill e3 "123"
|
|
100
|
+
playwright-cli click e4
|
|
101
|
+
|
|
102
|
+
playwright-cli tracing-stop
|
|
103
|
+
# Trace shows exact sequence of events
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## Trace vs Video vs Screenshot
|
|
107
|
+
|
|
108
|
+
| Feature | Trace | Video | Screenshot |
|
|
109
|
+
| ----------------------- | ----------- | ----------- | ---------------- |
|
|
110
|
+
| **Format** | .trace file | .webm video | .png/.jpeg image |
|
|
111
|
+
| **DOM inspection** | Yes | No | No |
|
|
112
|
+
| **Network details** | Yes | No | No |
|
|
113
|
+
| **Step-by-step replay** | Yes | Continuous | Single frame |
|
|
114
|
+
| **File size** | Medium | Large | Small |
|
|
115
|
+
| **Best for** | Debugging | Demos | Quick capture |
|
|
116
|
+
|
|
117
|
+
## Best Practices
|
|
118
|
+
|
|
119
|
+
### 1. Start Tracing Before the Problem
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
# Trace the entire flow, not just the failing step
|
|
123
|
+
playwright-cli tracing-start
|
|
124
|
+
playwright-cli open https://example.com
|
|
125
|
+
# ... all steps leading to the issue ...
|
|
126
|
+
playwright-cli tracing-stop
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### 2. Clean Up Old Traces
|
|
130
|
+
|
|
131
|
+
Traces can consume significant disk space:
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
# Remove traces older than 7 days
|
|
135
|
+
find .playwright-cli/traces -mtime +7 -delete
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## Limitations
|
|
139
|
+
|
|
140
|
+
- Traces add overhead to automation
|
|
141
|
+
- Large traces can consume significant disk space
|
|
142
|
+
- Some dynamic content may not replay perfectly
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
# Video Recording
|
|
2
|
+
|
|
3
|
+
Capture browser automation sessions as video for debugging, documentation, or verification. Produces WebM (VP8/VP9 codec).
|
|
4
|
+
|
|
5
|
+
## Basic Recording
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# Open browser first
|
|
9
|
+
playwright-cli open
|
|
10
|
+
|
|
11
|
+
# Start recording
|
|
12
|
+
playwright-cli video-start demo.webm
|
|
13
|
+
|
|
14
|
+
# Add a chapter marker for section transitions
|
|
15
|
+
playwright-cli video-chapter "Getting Started" --description="Opening the homepage" --duration=2000
|
|
16
|
+
|
|
17
|
+
# Navigate and perform actions
|
|
18
|
+
playwright-cli goto https://example.com
|
|
19
|
+
playwright-cli snapshot
|
|
20
|
+
playwright-cli click e1
|
|
21
|
+
|
|
22
|
+
# Add another chapter
|
|
23
|
+
playwright-cli video-chapter "Filling Form" --description="Entering test data" --duration=2000
|
|
24
|
+
playwright-cli fill e2 "test input"
|
|
25
|
+
|
|
26
|
+
# Stop and save
|
|
27
|
+
playwright-cli video-stop
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Best Practices
|
|
31
|
+
|
|
32
|
+
### 1. Use Descriptive Filenames
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
# Include context in filename
|
|
36
|
+
playwright-cli video-start recordings/login-flow-2024-01-15.webm
|
|
37
|
+
playwright-cli video-start recordings/checkout-test-run-42.webm
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### 2. Record entire hero scripts.
|
|
41
|
+
|
|
42
|
+
When recording a video for the user or as a proof of work, it is best to create a code snippet and execute it with run-code.
|
|
43
|
+
It allows inserting appropriate pauses between the actions and annotating the video. There are new Playwright APIs for that.
|
|
44
|
+
|
|
45
|
+
1. Perform scenario using CLI and take note of all locators and actions. You'll need those locators to request their bounding boxes for highlight.
|
|
46
|
+
2. Create a file with the intended script for video (below). Use pressSequentially w/ delay for nice typing, make reasonable pauses.
|
|
47
|
+
3. Use playwright-cli run-code --filename your-script.js
|
|
48
|
+
|
|
49
|
+
**Important**: Overlays are `pointer-events: none` — they do not interfere with page interactions. You can safely keep sticky overlays visible while clicking, filling, or performing any actions on the page.
|
|
50
|
+
|
|
51
|
+
```js
|
|
52
|
+
async (page) => {
|
|
53
|
+
await page.screencast.start({
|
|
54
|
+
path: "video.webm",
|
|
55
|
+
size: { width: 1280, height: 800 },
|
|
56
|
+
});
|
|
57
|
+
await page.goto("https://demo.playwright.dev/todomvc");
|
|
58
|
+
|
|
59
|
+
// Show a chapter card — blurs the page and shows a dialog.
|
|
60
|
+
// Blocks until duration expires, then auto-removes.
|
|
61
|
+
// Use this for simple use cases, but always feel free to hand-craft your own beautiful
|
|
62
|
+
// overlay via await page.screencast.showOverlay().
|
|
63
|
+
await page.screencast.showChapter("Adding Todo Items", {
|
|
64
|
+
description: "We will add several items to the todo list.",
|
|
65
|
+
duration: 2000,
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
// Perform action
|
|
69
|
+
await page
|
|
70
|
+
.getByRole("textbox", { name: "What needs to be done?" })
|
|
71
|
+
.pressSequentially("Walk the dog", { delay: 60 });
|
|
72
|
+
await page
|
|
73
|
+
.getByRole("textbox", { name: "What needs to be done?" })
|
|
74
|
+
.press("Enter");
|
|
75
|
+
await page.waitForTimeout(1000);
|
|
76
|
+
|
|
77
|
+
// Show next chapter
|
|
78
|
+
await page.screencast.showChapter("Verifying Results", {
|
|
79
|
+
description: "Checking the item appeared in the list.",
|
|
80
|
+
duration: 2000,
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
// Add a sticky annotation that stays while you perform actions.
|
|
84
|
+
// Overlays are pointer-events: none, so they won't block clicks.
|
|
85
|
+
const annotation = await page.screencast.showOverlay(`
|
|
86
|
+
<div style="position: absolute; top: 8px; right: 8px;
|
|
87
|
+
padding: 6px 12px; background: rgba(0,0,0,0.7);
|
|
88
|
+
border-radius: 8px; font-size: 13px; color: white;">
|
|
89
|
+
✓ Item added successfully
|
|
90
|
+
</div>
|
|
91
|
+
`);
|
|
92
|
+
|
|
93
|
+
// Perform more actions while the annotation is visible
|
|
94
|
+
await page
|
|
95
|
+
.getByRole("textbox", { name: "What needs to be done?" })
|
|
96
|
+
.pressSequentially("Buy groceries", { delay: 60 });
|
|
97
|
+
await page
|
|
98
|
+
.getByRole("textbox", { name: "What needs to be done?" })
|
|
99
|
+
.press("Enter");
|
|
100
|
+
await page.waitForTimeout(1500);
|
|
101
|
+
|
|
102
|
+
// Remove the annotation when done
|
|
103
|
+
await annotation.dispose();
|
|
104
|
+
|
|
105
|
+
// You can also highlight relevant locators and provide contextual annotations.
|
|
106
|
+
const bounds = await page.getByText("Walk the dog").boundingBox();
|
|
107
|
+
await page.screencast.showOverlay(
|
|
108
|
+
`
|
|
109
|
+
<div style="position: absolute;
|
|
110
|
+
top: ${bounds.y}px;
|
|
111
|
+
left: ${bounds.x}px;
|
|
112
|
+
width: ${bounds.width}px;
|
|
113
|
+
height: ${bounds.height}px;
|
|
114
|
+
border: 1px solid red;">
|
|
115
|
+
</div>
|
|
116
|
+
<div style="position: absolute;
|
|
117
|
+
top: ${bounds.y + bounds.height + 5}px;
|
|
118
|
+
left: ${bounds.x + bounds.width / 2}px;
|
|
119
|
+
transform: translateX(-50%);
|
|
120
|
+
padding: 6px;
|
|
121
|
+
background: #808080;
|
|
122
|
+
border-radius: 10px;
|
|
123
|
+
font-size: 14px;
|
|
124
|
+
color: white;">Check it out, it is right above this text
|
|
125
|
+
</div>
|
|
126
|
+
`,
|
|
127
|
+
{ duration: 2000 },
|
|
128
|
+
);
|
|
129
|
+
|
|
130
|
+
await page.screencast.stop();
|
|
131
|
+
};
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
Embrace creativity, overlays are powerful.
|
|
135
|
+
|
|
136
|
+
### Overlay API Summary
|
|
137
|
+
|
|
138
|
+
| Method | Use Case |
|
|
139
|
+
| ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ |
|
|
140
|
+
| `page.screencast.showChapter(title, { description?, duration?, styleSheet? })` | Full-screen chapter card with blurred backdrop — ideal for section transitions |
|
|
141
|
+
| `page.screencast.showOverlay(html, { duration? })` | Custom HTML overlay — use for callouts, labels, highlights |
|
|
142
|
+
| `disposable.dispose()` | Remove a sticky overlay added without duration |
|
|
143
|
+
| `page.screencast.hideOverlays()` / `page.screencast.showOverlays()` | Temporarily hide/show all overlays |
|
|
144
|
+
|
|
145
|
+
## Tracing vs Video
|
|
146
|
+
|
|
147
|
+
| Feature | Video | Tracing |
|
|
148
|
+
| -------- | -------------------- | ---------------------------------------- |
|
|
149
|
+
| Output | WebM file | Trace file (viewable in Trace Viewer) |
|
|
150
|
+
| Shows | Visual recording | DOM snapshots, network, console, actions |
|
|
151
|
+
| Use case | Demos, documentation | Debugging, analysis |
|
|
152
|
+
| Size | Larger | Smaller |
|
|
153
|
+
|
|
154
|
+
## Limitations
|
|
155
|
+
|
|
156
|
+
- Recording adds slight overhead to automation
|
|
157
|
+
- Large recordings can consume significant disk space
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: product-exploration
|
|
3
|
+
description: "仅在用户明确调用本技能或要求围绕指定功能、用户目标做探索式产品体检时使用。通过真实操作发现缺陷和体验问题,提供复现证据与建议;不用于日常改代码后的自动验收、固定用例执行或测试代码生成。"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 产品探索
|
|
7
|
+
|
|
8
|
+
围绕用户指定目标发现值得处理的问题,不建立回归测试资产。终点是有证据的报告,修复另行确认。
|
|
9
|
+
|
|
10
|
+
## 启动与范围
|
|
11
|
+
|
|
12
|
+
- 只在用户明确要求本轮探索时执行。修改代码、提交、PR 或普通“修复这个 bug”不构成探索授权,不接自动触发 Hook。
|
|
13
|
+
- 用户只需提供功能或用户目标,例如“检查文件搜索体验”。先从任务上下文、必要代码和项目入口理解预期;不要求填写表格、编写 YAML 或提供测试步骤。
|
|
14
|
+
- 简短确认本轮目标、环境、数据权限和预算。已有上下文明确的内容不重复提问;目标或资源归属不清时,先问一个关键问题。
|
|
15
|
+
- 自主选择相关路径,不全仓扫描、不扩大到无关功能。偶遇范围外问题可简记为待确认,不展开调查。
|
|
16
|
+
|
|
17
|
+
## 环境与权限
|
|
18
|
+
|
|
19
|
+
- 浏览器探索使用同插件的 [playwright-cli](../playwright-cli/SKILL.md),先读取其完整指令并遵循页面、Profile、附着和 detach 规则。工具不可用时报告阻塞,不拿静态阅读代替真实操作。
|
|
20
|
+
- 可复用已确认身份的真实环境。需要操作 Runweave Dev Session 时,先读取并使用 [runweave-dev-session](../runweave-dev-session/SKILL.md);不得按旧端口、窗口外观或 ambient endpoint 猜目标,不默认升级为完整打包。
|
|
21
|
+
- 只做必要的环境准备,不趁机修基础设施、安装整套 Test Agents 或扩充工具权限。没有新的诊断线索时,不反复重试同一个准备失败。
|
|
22
|
+
- 真实数据默认只读。写操作只作用于可证明属于本轮的临时数据;更改真实数据或账号配置、发布提交内容、发送消息等外部动作,须单独说明对象和影响并取得授权。
|
|
23
|
+
- 写操作归属或副作用不确定时,先停下该路径请求确认,或继续独立的只读路径。不得为了复现重复制造有风险的副作用。
|
|
24
|
+
- 探索权限不包含修改产品源码、自动修复、提交 issue/PR、推送代码或调整现有测试预期。
|
|
25
|
+
|
|
26
|
+
## 时间与探索策略
|
|
27
|
+
|
|
28
|
+
默认探索上限 **30 分钟**,用户可覆盖或追加。环境准备时间单独记录,不计入探索预算。
|
|
29
|
+
|
|
30
|
+
页面可操作、开始探索时读取时钟,记录开始时间和截止时间;进入新分支或长耗时操作前检查剩余时间。合理限制单次等待,不依靠固定 sleep 推进。到期后不展开新路径,在安全点结束操作并完成报告、清理;说明实际耗时和超时部分。Skill 不是计时器或安全沙箱,不能保证强制中断工具,也不替代宿主权限控制。
|
|
31
|
+
|
|
32
|
+
优先顺序由用户目标和现场观察决定:
|
|
33
|
+
|
|
34
|
+
- 先走一条核心用户路径,确认用户是否能完成目标。
|
|
35
|
+
- 根据暴露的状态转换和风险,选择相关的空数据、边界输入、取消返回、重复操作、错误恢复等分支。不是固定清单,不必逐项执行。
|
|
36
|
+
- 异常出现后收窄复现步骤,区分用户可见失败、预期不明确与工具/环境问题;只读查看必要代码、控制台或网络证据帮助解释,不修产品。
|
|
37
|
+
- 等待可观察的业务状态,优先语义定位和可重试断言;不用强制点击、mock 或 DOM 状态注入把失败路径改成成功。确需模拟环境条件时,限定自有环境并明确证据限制。
|
|
38
|
+
- 一条路径失败不要求停止整轮;可以继续独立且在范围内的路径。预算耗尽、没有高价值新路径或无法安全继续时结束,不为凑数量或用满时间继续消耗。
|
|
39
|
+
|
|
40
|
+
可使用内存中的自动化片段或本轮临时脚本帮助操作和取证;不生成持久化测试代码、`*.spec.*` / `*.test.*`、YAML 测试计划或 CI 配置,不把临时动作包装成需要维护的测试套件。执行固定验收合同是另一项任务,不自动转入 `run-test-cases`。
|
|
41
|
+
|
|
42
|
+
## 结论与证据
|
|
43
|
+
|
|
44
|
+
将观察分开报告:
|
|
45
|
+
|
|
46
|
+
- **已确认缺陷**:通过真实操作发现并安全复核至少一次;有明确预期依据、实际差异和用户影响。附最短复现步骤、复核结果、必要证据及建议。
|
|
47
|
+
- **待确认疑点**:未复现、不可安全复核、预期不明确或仅有代码推测。说明还缺什么证据,不给出确定的缺陷结论。
|
|
48
|
+
- **体验建议**:说明如何妨碍用户完成目标及建议理由,不把个人审美偏好作为功能错误。
|
|
49
|
+
|
|
50
|
+
取证前缩小范围,优先裁剪或遮罩无关真实数据;不落盘或输出凭证、Cookie、Token、完整敏感响应、无关个人信息。可读取不等于可导出或发送。无法安全保留证据时只描述现象,并标注证据限制;不默认上传外部平台。
|
|
51
|
+
|
|
52
|
+
交付简短中文结论和本地报告,默认保存在 `artifacts/product-exploration/<本轮唯一标识>/`,只留报告和必要证据,不留需要维护的执行代码。报告按实际发现组织,不强制每类有内容,包含:
|
|
53
|
+
|
|
54
|
+
- 本轮目标、实际环境、数据权限、准备与探索耗时;覆盖了什么、哪些未覆盖及原因。
|
|
55
|
+
- 按用户影响排列的缺陷、疑点和建议,各自附对应证据或证据限制。
|
|
56
|
+
- 清理结果、仍需授权或后续确认的事项。
|
|
57
|
+
|
|
58
|
+
没有发现问题就如实报告;未覆盖不等于通过,不宣称完整验收或产品“没有 bug”。最终报告后停止探索,等待用户决定是否修复或继续。
|
|
59
|
+
|
|
60
|
+
## 收尾
|
|
61
|
+
|
|
62
|
+
关闭本轮自建终端、删除本轮临时数据和执行文件,仅操作已核实归属的资源;停止本轮创建的 Dev Session 并 detach。已有用户会话、真实目录、账号配置与 Cookie 保持原状,不为“隔离”或“清理”而重置它们。
|
|
63
|
+
|
|
64
|
+
失败、中断或预算耗尽时也应尝试安全清理;无法清理则明确列出遗留资源和原因,不声称已清理完成。报告和经过最小化处理的证据可以保留。
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: prototype-first-development
|
|
3
|
+
description: 创建和调整可运行的产品 UI 原型。仅当用户明确提到“HTML”或“原型”,或显式调用本技能时使用。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 原型先行开发
|
|
7
|
+
|
|
8
|
+
使用这个技能,在产品实现前先把交互意图落成具体可看的东西。产物是一个小型可运行原型,不是生产代码,也不能证明后端、协议或运行时能力已经存在。
|
|
9
|
+
|
|
10
|
+
这个技能不是“生成一个 HTML 模板”就结束,而是一套从需求到原型、从原型到计划、从计划到实现的开发方式。除非用户明确要求跳过,否则不要压缩或改写这条路径。
|
|
11
|
+
|
|
12
|
+
## 核心规则
|
|
13
|
+
|
|
14
|
+
当用户还在收敛行为、布局、状态或工作流时,先创建本地、可读、无需构建的原型。原型稳定后,再更新实施计划;只有用户明确推进实现时,才修改产品代码。
|
|
15
|
+
|
|
16
|
+
原型的用户可见界面必须按最终产品方案绘制:除技术实现方式和数据来源外,UI、文案、交互入口、状态反馈都应与计划落地后的产品一致。不要在产品画面里加入解释性文案、操作指引、快捷键说明、需求备注、标注、教学卡片或为了让人理解原型而临时增加的按钮。
|
|
17
|
+
|
|
18
|
+
如果确实需要用于演示的状态切换、mock 触发器或备注说明,必须放在 README,或放在默认隐藏、视觉上与产品画面隔离的 prototype helper 区域,并明确标记为不进入实施计划。任何 agent 都不能从这类辅助内容反推最终产品 UI。
|
|
19
|
+
|
|
20
|
+
## 默认产物
|
|
21
|
+
|
|
22
|
+
优先使用这个结构:
|
|
23
|
+
|
|
24
|
+
```text
|
|
25
|
+
docs/prototypes/<feature-slug>/
|
|
26
|
+
README.md
|
|
27
|
+
index.html
|
|
28
|
+
app.js
|
|
29
|
+
mock-state.json
|
|
30
|
+
prototype-preview.png # 可选,浏览器验证后保存
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
从零开始时,使用技能自带模板 `references/html-prototype-template/`。把它复制到目标仓库并替换占位内容,不要重新发明目录结构。
|
|
34
|
+
|
|
35
|
+
需要过程检查时,读取 `references/prototype-workflow-checklist.md`。需要从原型整理实施计划时,读取 `references/implementation-plan-handoff-template.md`,并优先结合 `$toolkit:write-plan` 落盘计划。
|
|
36
|
+
|
|
37
|
+
## 工作流
|
|
38
|
+
|
|
39
|
+
1. 原型简报:
|
|
40
|
+
- 用户目标
|
|
41
|
+
- 用户动作
|
|
42
|
+
- 主要流程
|
|
43
|
+
- 关键状态
|
|
44
|
+
- 明确的非目标
|
|
45
|
+
- 原型要影响的真实产品界面或模块
|
|
46
|
+
|
|
47
|
+
2. 可运行原型:
|
|
48
|
+
- 默认保持静态、无需构建,除非仓库已经有更强的约定
|
|
49
|
+
- 首屏只呈现最终产品会出现的界面,不放需求解释、操作教程或设计备注
|
|
50
|
+
- 仅使用最终产品需要的用户操作入口;不要为了演示方便额外加“下一步”“切状态”“模拟事件”等可见控件
|
|
51
|
+
- 把布局和挂载点放在 `index.html`
|
|
52
|
+
- 把状态流转和事件处理放在 `app.js`
|
|
53
|
+
- 把领域对象、模拟事件和样例记录放在 `mock-state.json`
|
|
54
|
+
- 除非用户明确要求代码与原型对齐,否则不要导入产品源码
|
|
55
|
+
|
|
56
|
+
3. 调整循环:
|
|
57
|
+
- 优先保证可读性,不追求炫技
|
|
58
|
+
- 组件和函数命名贴近业务领域
|
|
59
|
+
- 状态流转保持容易修改
|
|
60
|
+
- 只添加最终产品会保留的交互控件
|
|
61
|
+
- 如需切换 mock 状态,优先用 URL 参数、README 步骤或默认隐藏的 helper 面板,不把它画进产品画面
|
|
62
|
+
- 用户点、改、截图、反馈时,只调整原型,不碰产品代码
|
|
63
|
+
|
|
64
|
+
4. 原型冻结:
|
|
65
|
+
- 在 README 中更新启动命令、验证点、边界和非目标
|
|
66
|
+
- 浏览器验证重要时,保存 `prototype-preview.png`
|
|
67
|
+
- 在 Runweave 仓库中,浏览器页面复现、修复或验收必须使用 `$toolkit:playwright-cli` 完成打开页面、交互、截图或 DOM 检查
|
|
68
|
+
- 冻结前确保 README 记录了最后采用的交互方案和被放弃的方向
|
|
69
|
+
|
|
70
|
+
5. 实施计划:
|
|
71
|
+
- 在计划中引用原型目录
|
|
72
|
+
- 区分“原型表达的意图”和“当前代码真实现状”
|
|
73
|
+
- 声称可行前,先检查产品代码
|
|
74
|
+
- 把协议、后端、运行时缺口与 UI 工作分开列出
|
|
75
|
+
- 计划必须写清产品行为、协议变化、代码落点、验收方式
|
|
76
|
+
|
|
77
|
+
6. 产品实现:
|
|
78
|
+
- 实现时再回到真实代码,不从原型直接推断已有能力
|
|
79
|
+
- 产品代码修改必须以当前代码现状为准
|
|
80
|
+
- 保留原型作为交互基准,但不要照搬原型代码
|
|
81
|
+
- 验证时同时覆盖产品行为和原型中冻结的关键交互
|
|
82
|
+
|
|
83
|
+
## 质量目标
|
|
84
|
+
|
|
85
|
+
让生成内容像人类写的、后续能维护:
|
|
86
|
+
|
|
87
|
+
- 可读:文件名清楚,函数小,状态名朴素,事件处理直观。
|
|
88
|
+
- 易调:模拟数据放 JSON,样式按 UI 区域组织,不生成晦涩代码。
|
|
89
|
+
- 高效:无构建步骤;除非能明显提升该原型的开发速度,否则不引入框架。
|
|
90
|
+
- 真实:用户可见界面不夹带说明、备注或脚手架控件,截图应能直接作为最终产品体验的参考。
|
|
91
|
+
- 诚实:README 写清楚哪些是模拟的,真实实现还缺什么。
|
|
92
|
+
|
|
93
|
+
## 功能分类账
|
|
94
|
+
|
|
95
|
+
原型中可能出现两类元素,必须显式分开记录:
|
|
96
|
+
|
|
97
|
+
- 产品核心功能:最终需要落地到产品里的能力、状态、入口、反馈或业务规则。
|
|
98
|
+
- 原型辅助功能:为了演示、切换状态、模拟数据、触发事件、方便用户理解或截图而临时加入的控件和面板。
|
|
99
|
+
|
|
100
|
+
具体分类表和检查项写在原型 README 与 `references/prototype-workflow-checklist.md` 中,`SKILL.md` 只保留原则。
|
|
101
|
+
|
|
102
|
+
原型辅助功能的默认处理:
|
|
103
|
+
|
|
104
|
+
- 默认不要出现在用户可见产品画面里;能用 README 或 URL 参数完成的,不要做成 UI。
|
|
105
|
+
- 必须与产品画面视觉隔离,并用 `data-prototype-helper="true"` 或等价标识标记。
|
|
106
|
+
- 不进入实施计划的产品范围。
|
|
107
|
+
- 不作为最终 UI、API、协议或数据模型的依据。
|
|
108
|
+
- 如果用户希望保留到产品中,必须在原型冻结时把它改列为产品核心功能或单独写入后续需求。
|
|
109
|
+
|
|
110
|
+
## 约束
|
|
111
|
+
|
|
112
|
+
- 不要把原型当成产品合约已经存在的证据。
|
|
113
|
+
- 不要把原型代码直接照搬进生产代码。
|
|
114
|
+
- 不要模拟每个边界情况;只模拟用户需要看见或验证的关键决策。
|
|
115
|
+
- 除非仓库明确要求,否则不要为原型文件新增单元测试。
|
|
116
|
+
- 遵守仓库关于浏览器验证、测试层级和文档路径的要求。
|
|
117
|
+
- 不要在用户还处于原型调整阶段时提前写实施计划或改产品代码。
|
|
118
|
+
- 产品 UI 原型默认使用可运行 HTML;技术架构、事件流或故障因果可视化改用 `$toolkit:architecture-flow-prototyping`。
|
|
119
|
+
- 不要把原型辅助功能当作默认产品需求。
|
|
120
|
+
- 不要在产品画面里写“快捷键”“操作说明”“这里展示”“用于验证”“模拟状态”等说明性内容,除非这些文案本来就是最终产品 UI 的一部分。
|
|
121
|
+
|
|
122
|
+
## 启动方式
|
|
123
|
+
|
|
124
|
+
对于 `docs/prototypes/<feature-slug>` 下的原型:
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
python3 -m http.server 6188 --directory docs/prototypes/<feature-slug>
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
打开:
|
|
131
|
+
|
|
132
|
+
```text
|
|
133
|
+
http://127.0.0.1:6188/
|
|
134
|
+
```
|