cokit-cli 1.0.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (564) hide show
  1. package/AGENTS.md +103 -0
  2. package/README.FLOW.md +237 -0
  3. package/README.md +153 -94
  4. package/agents/brainstormer.agent.md +71 -0
  5. package/agents/code-reviewer.agent.md +128 -0
  6. package/agents/database-admin.agent.md +91 -0
  7. package/agents/debugger.agent.md +128 -0
  8. package/agents/docs-manager.agent.md +121 -0
  9. package/agents/fullstack-developer.agent.md +96 -0
  10. package/agents/git-manager.agent.md +392 -0
  11. package/agents/mcp-manager.agent.md +93 -0
  12. package/agents/planner.agent.md +94 -0
  13. package/agents/project-manager.agent.md +124 -0
  14. package/agents/researcher.agent.md +32 -0
  15. package/agents/scout-external.agent.md +141 -0
  16. package/agents/scout.agent.md +107 -0
  17. package/agents/tester.agent.md +106 -0
  18. package/agents/ui-ux-designer.agent.md +225 -0
  19. package/collections/ck-core.collection.yml +30 -0
  20. package/collections/ck-development-rules.collection.yml +18 -0
  21. package/collections/ck-documentation.collection.yml +18 -0
  22. package/collections/ck-git-workflow.collection.yml +18 -0
  23. package/collections/ck-orchestration.collection.yml +22 -0
  24. package/collections/ck-ui-design.collection.yml +18 -0
  25. package/docs/README.md +85 -0
  26. package/docs/copilot-processing-flow.md +128 -0
  27. package/instructions/ck-backend.instructions.md +48 -0
  28. package/instructions/ck-development.instructions.md +40 -0
  29. package/instructions/ck-frontend-design-pro.instructions.md +58 -0
  30. package/instructions/ck-frontend.instructions.md +44 -0
  31. package/instructions/ck-google-adk-python.instructions.md +242 -0
  32. package/instructions/ck-research.instructions.md +167 -0
  33. package/instructions/ck-testing.instructions.md +36 -0
  34. package/package.json +9 -2
  35. package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/phase-01-restructure-folders.md +183 -0
  36. package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/phase-02-convert-agents.md +206 -0
  37. package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/phase-03-convert-commands-to-prompts.md +284 -0
  38. package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/phase-04-convert-skills-to-instructions.md +349 -0
  39. package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/phase-05-create-collections.md +320 -0
  40. package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/phase-06-update-cli-build-scripts.md +450 -0
  41. package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/phase-07-update-documentation.md +407 -0
  42. package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/plan.md +136 -0
  43. package/prompts/ck-ask.prompt.md +57 -0
  44. package/prompts/ck-bootstrap-auto-fast.prompt.md +108 -0
  45. package/prompts/ck-bootstrap-auto-parallel.prompt.md +66 -0
  46. package/prompts/ck-bootstrap-auto.prompt.md +114 -0
  47. package/prompts/ck-bootstrap.prompt.md +136 -0
  48. package/prompts/ck-brainstorm.prompt.md +68 -0
  49. package/prompts/ck-ck-help.prompt.md +114 -0
  50. package/prompts/ck-code-auto.prompt.md +171 -0
  51. package/prompts/ck-code-no-test.prompt.md +159 -0
  52. package/prompts/ck-code-parallel.prompt.md +56 -0
  53. package/prompts/ck-code.prompt.md +177 -0
  54. package/prompts/ck-coding-level.prompt.md +54 -0
  55. package/prompts/ck-cook-auto-fast.prompt.md +26 -0
  56. package/prompts/ck-cook-auto-parallel.prompt.md +49 -0
  57. package/prompts/ck-cook-auto.prompt.md +15 -0
  58. package/prompts/ck-cook.prompt.md +96 -0
  59. package/prompts/ck-debug.prompt.md +14 -0
  60. package/prompts/ck-design-3d.prompt.md +84 -0
  61. package/prompts/ck-design-describe.prompt.md +24 -0
  62. package/prompts/ck-design-fast.prompt.md +32 -0
  63. package/prompts/ck-design-good.prompt.md +36 -0
  64. package/prompts/ck-design-screenshot.prompt.md +35 -0
  65. package/prompts/ck-design-video.prompt.md +35 -0
  66. package/prompts/ck-docs-init.prompt.md +27 -0
  67. package/prompts/ck-docs-summarize.prompt.md +23 -0
  68. package/prompts/ck-docs-update.prompt.md +36 -0
  69. package/prompts/ck-fix-ci.prompt.md +18 -0
  70. package/prompts/ck-fix-fast.prompt.md +18 -0
  71. package/prompts/ck-fix-hard.prompt.md +36 -0
  72. package/prompts/ck-fix-logs.prompt.md +27 -0
  73. package/prompts/ck-fix-parallel.prompt.md +54 -0
  74. package/prompts/ck-fix-test.prompt.md +19 -0
  75. package/prompts/ck-fix-types.prompt.md +11 -0
  76. package/prompts/ck-fix-ui.prompt.md +49 -0
  77. package/prompts/ck-fix.prompt.md +44 -0
  78. package/prompts/ck-git-cm.prompt.md +8 -0
  79. package/prompts/ck-git-cp.prompt.md +7 -0
  80. package/prompts/ck-git-merge.prompt.md +41 -0
  81. package/prompts/ck-git-pr.prompt.md +49 -0
  82. package/prompts/ck-kanban.prompt.md +77 -0
  83. package/prompts/ck-plan-archive.prompt.md +58 -0
  84. package/prompts/ck-plan-ci.prompt.md +34 -0
  85. package/prompts/ck-plan-cro.prompt.md +66 -0
  86. package/prompts/ck-plan-fast.prompt.md +67 -0
  87. package/prompts/ck-plan-hard.prompt.md +89 -0
  88. package/prompts/ck-plan-parallel.prompt.md +126 -0
  89. package/prompts/ck-plan-two.prompt.md +43 -0
  90. package/prompts/ck-plan-validate.prompt.md +118 -0
  91. package/prompts/ck-plan.prompt.md +29 -1
  92. package/prompts/ck-preview.prompt.md +65 -0
  93. package/prompts/ck-review-codebase.prompt.md +44 -0
  94. package/prompts/ck-scout-ext.prompt.md +35 -0
  95. package/prompts/ck-scout.prompt.md +25 -0
  96. package/prompts/ck-skill-add.prompt.md +36 -0
  97. package/prompts/ck-skill-create.prompt.md +29 -0
  98. package/prompts/ck-skill-fix-logs.prompt.md +22 -0
  99. package/prompts/ck-skill-optimize-auto.prompt.md +25 -0
  100. package/prompts/ck-skill-optimize.prompt.md +34 -0
  101. package/prompts/ck-skill-plan.prompt.md +46 -0
  102. package/prompts/ck-test-ui.prompt.md +92 -0
  103. package/prompts/ck-test.prompt.md +10 -0
  104. package/prompts/ck-use-mcp.prompt.md +27 -0
  105. package/prompts/ck-watzup.prompt.md +11 -0
  106. package/prompts/ck-worktree.prompt.md +127 -0
  107. package/rules/README.agents.md +55 -0
  108. package/rules/README.collections.md +78 -0
  109. package/rules/README.copilot-instructions.md +66 -0
  110. package/rules/README.instructions.md +73 -0
  111. package/rules/README.md +39 -0
  112. package/rules/README.prompts.md +76 -0
  113. package/rules/README.skills.md +71 -0
  114. package/skills/ck-ai-artist/SKILL.md +73 -0
  115. package/skills/ck-ai-artist/references/advanced-techniques.md +184 -0
  116. package/skills/ck-ai-artist/references/domain-code.md +66 -0
  117. package/skills/ck-ai-artist/references/domain-data.md +72 -0
  118. package/skills/ck-ai-artist/references/domain-marketing.md +66 -0
  119. package/skills/ck-ai-artist/references/domain-patterns.md +33 -0
  120. package/skills/ck-ai-artist/references/domain-writing.md +68 -0
  121. package/skills/ck-ai-artist/references/image-prompting.md +141 -0
  122. package/skills/ck-ai-artist/references/llm-prompting.md +165 -0
  123. package/skills/ck-ai-artist/references/nano-banana.md +59 -0
  124. package/skills/ck-ai-artist/references/reasoning-techniques.md +201 -0
  125. package/skills/ck-backend-development/SKILL.md +93 -0
  126. package/skills/ck-backend-development/references/backend-api-design.md +495 -0
  127. package/skills/ck-backend-development/references/backend-architecture.md +454 -0
  128. package/skills/ck-backend-development/references/backend-authentication.md +338 -0
  129. package/skills/ck-backend-development/references/backend-code-quality.md +659 -0
  130. package/skills/ck-backend-development/references/backend-debugging.md +904 -0
  131. package/skills/ck-backend-development/references/backend-devops.md +494 -0
  132. package/skills/ck-backend-development/references/backend-mindset.md +387 -0
  133. package/skills/ck-backend-development/references/backend-performance.md +397 -0
  134. package/skills/ck-backend-development/references/backend-security.md +290 -0
  135. package/skills/ck-backend-development/references/backend-technologies.md +256 -0
  136. package/skills/ck-backend-development/references/backend-testing.md +429 -0
  137. package/skills/ck-better-auth/SKILL.md +202 -0
  138. package/skills/ck-better-auth/references/advanced-features.md +553 -0
  139. package/skills/ck-better-auth/references/database-integration.md +577 -0
  140. package/skills/ck-better-auth/references/email-password-auth.md +416 -0
  141. package/skills/ck-better-auth/references/oauth-providers.md +430 -0
  142. package/skills/ck-better-auth/scripts/.coverage +0 -0
  143. package/skills/ck-better-auth/scripts/better_auth_init.py +521 -0
  144. package/skills/ck-better-auth/scripts/requirements.txt +15 -0
  145. package/skills/ck-better-auth/scripts/tests/.coverage +0 -0
  146. package/skills/ck-better-auth/scripts/tests/test_better_auth_init.py +421 -0
  147. package/skills/ck-chrome-devtools/SKILL.md +470 -0
  148. package/skills/ck-chrome-devtools/references/cdp-domains.md +694 -0
  149. package/skills/ck-chrome-devtools/references/performance-guide.md +940 -0
  150. package/skills/ck-chrome-devtools/references/puppeteer-reference.md +953 -0
  151. package/skills/ck-chrome-devtools/scripts/README.md +272 -0
  152. package/skills/ck-chrome-devtools/scripts/__tests__/selector.test.js +210 -0
  153. package/skills/ck-chrome-devtools/scripts/aria-snapshot.js +362 -0
  154. package/skills/ck-chrome-devtools/scripts/click.js +83 -0
  155. package/skills/ck-chrome-devtools/scripts/console.js +79 -0
  156. package/skills/ck-chrome-devtools/scripts/evaluate.js +53 -0
  157. package/skills/ck-chrome-devtools/scripts/fill.js +76 -0
  158. package/skills/ck-chrome-devtools/scripts/inject-auth.js +229 -0
  159. package/skills/ck-chrome-devtools/scripts/install-deps.sh +181 -0
  160. package/skills/ck-chrome-devtools/scripts/install.sh +83 -0
  161. package/skills/ck-chrome-devtools/scripts/lib/browser.js +318 -0
  162. package/skills/ck-chrome-devtools/scripts/lib/selector.js +178 -0
  163. package/skills/ck-chrome-devtools/scripts/navigate.js +54 -0
  164. package/skills/ck-chrome-devtools/scripts/network.js +106 -0
  165. package/skills/ck-chrome-devtools/scripts/package-lock.json +1589 -0
  166. package/skills/ck-chrome-devtools/scripts/package.json +16 -0
  167. package/skills/ck-chrome-devtools/scripts/performance.js +149 -0
  168. package/skills/ck-chrome-devtools/scripts/screenshot.js +198 -0
  169. package/skills/ck-chrome-devtools/scripts/select-ref.js +131 -0
  170. package/skills/ck-chrome-devtools/scripts/snapshot.js +135 -0
  171. package/skills/ck-code-review/SKILL.md +110 -53
  172. package/skills/ck-code-review/references/code-review-reception.md +182 -49
  173. package/skills/ck-code-review/references/requesting-code-review.md +105 -0
  174. package/skills/ck-code-review/references/verification-before-completion.md +111 -58
  175. package/skills/ck-databases/SKILL.md +231 -0
  176. package/skills/ck-databases/references/mongodb-aggregation.md +447 -0
  177. package/skills/ck-databases/references/mongodb-atlas.md +465 -0
  178. package/skills/ck-databases/references/mongodb-crud.md +408 -0
  179. package/skills/ck-databases/references/mongodb-indexing.md +442 -0
  180. package/skills/ck-databases/references/postgresql-administration.md +594 -0
  181. package/skills/ck-databases/references/postgresql-performance.md +527 -0
  182. package/skills/ck-databases/references/postgresql-psql-cli.md +467 -0
  183. package/skills/ck-databases/references/postgresql-queries.md +475 -0
  184. package/skills/ck-databases/scripts/.coverage +0 -0
  185. package/skills/ck-databases/scripts/db_backup.py +502 -0
  186. package/skills/ck-databases/scripts/db_migrate.py +425 -0
  187. package/skills/ck-databases/scripts/db_performance_check.py +456 -0
  188. package/skills/ck-databases/scripts/requirements.txt +20 -0
  189. package/skills/ck-databases/scripts/tests/coverage-db.json +1 -0
  190. package/skills/ck-databases/scripts/tests/requirements.txt +4 -0
  191. package/skills/ck-databases/scripts/tests/test_db_backup.py +340 -0
  192. package/skills/ck-databases/scripts/tests/test_db_migrate.py +277 -0
  193. package/skills/ck-databases/scripts/tests/test_db_performance_check.py +370 -0
  194. package/skills/ck-debugging/SKILL.md +55 -43
  195. package/skills/ck-debugging/references/defense-in-depth.md +124 -0
  196. package/skills/ck-debugging/references/root-cause-tracing.md +100 -43
  197. package/skills/ck-debugging/references/systematic-debugging.md +80 -52
  198. package/skills/ck-debugging/references/verification.md +101 -52
  199. package/skills/ck-debugging/scripts/find-polluter.sh +63 -0
  200. package/skills/ck-debugging/scripts/find-polluter.test.md +102 -0
  201. package/skills/ck-devops/.env.example +76 -0
  202. package/skills/ck-devops/SKILL.md +283 -0
  203. package/skills/ck-devops/references/browser-rendering.md +305 -0
  204. package/skills/ck-devops/references/cloudflare-d1-kv.md +123 -0
  205. package/skills/ck-devops/references/cloudflare-platform.md +271 -0
  206. package/skills/ck-devops/references/cloudflare-r2-storage.md +280 -0
  207. package/skills/ck-devops/references/cloudflare-workers-advanced.md +312 -0
  208. package/skills/ck-devops/references/cloudflare-workers-apis.md +309 -0
  209. package/skills/ck-devops/references/cloudflare-workers-basics.md +418 -0
  210. package/skills/ck-devops/references/docker-basics.md +297 -0
  211. package/skills/ck-devops/references/docker-compose.md +292 -0
  212. package/skills/ck-devops/references/gcloud-platform.md +297 -0
  213. package/skills/ck-devops/references/gcloud-services.md +304 -0
  214. package/skills/ck-devops/scripts/cloudflare_deploy.py +269 -0
  215. package/skills/ck-devops/scripts/docker_optimize.py +331 -0
  216. package/skills/ck-devops/scripts/requirements.txt +20 -0
  217. package/skills/ck-devops/scripts/tests/requirements.txt +3 -0
  218. package/skills/ck-devops/scripts/tests/test_cloudflare_deploy.py +285 -0
  219. package/skills/ck-devops/scripts/tests/test_docker_optimize.py +436 -0
  220. package/skills/ck-docs-seeker/.env.example +15 -0
  221. package/skills/ck-docs-seeker/SKILL.md +70 -65
  222. package/skills/ck-docs-seeker/package.json +25 -0
  223. package/skills/ck-docs-seeker/references/advanced.md +79 -0
  224. package/skills/ck-docs-seeker/references/context7-patterns.md +68 -0
  225. package/skills/ck-docs-seeker/references/errors.md +68 -0
  226. package/skills/ck-docs-seeker/scripts/analyze-llms-txt.js +211 -0
  227. package/skills/ck-docs-seeker/scripts/detect-topic.js +172 -0
  228. package/skills/ck-docs-seeker/scripts/fetch-docs.js +213 -0
  229. package/skills/ck-docs-seeker/scripts/tests/run-tests.js +72 -0
  230. package/skills/ck-docs-seeker/scripts/tests/test-analyze-llms.js +119 -0
  231. package/skills/ck-docs-seeker/scripts/tests/test-detect-topic.js +112 -0
  232. package/skills/ck-docs-seeker/scripts/tests/test-fetch-docs.js +84 -0
  233. package/skills/ck-docs-seeker/scripts/utils/env-loader.js +94 -0
  234. package/skills/ck-docs-seeker/workflows/library-search.md +87 -0
  235. package/skills/ck-docs-seeker/workflows/repo-analysis.md +91 -0
  236. package/skills/ck-docs-seeker/workflows/topic-search.md +77 -0
  237. package/skills/ck-frontend-design/SKILL.md +79 -0
  238. package/skills/ck-frontend-design/references/analysis-best-practices.md +80 -0
  239. package/skills/ck-frontend-design/references/analysis-prompts.md +141 -0
  240. package/skills/ck-frontend-design/references/analysis-techniques.md +118 -0
  241. package/skills/ck-frontend-design/references/animejs.md +396 -0
  242. package/skills/ck-frontend-design/references/design-extraction-overview.md +71 -0
  243. package/skills/ck-frontend-design/references/extraction-best-practices.md +141 -0
  244. package/skills/ck-frontend-design/references/extraction-output-templates.md +162 -0
  245. package/skills/ck-frontend-design/references/extraction-prompts.md +127 -0
  246. package/skills/ck-frontend-design/references/technical-accessibility.md +119 -0
  247. package/skills/ck-frontend-design/references/technical-best-practices.md +97 -0
  248. package/skills/ck-frontend-design/references/technical-optimization.md +44 -0
  249. package/skills/ck-frontend-design/references/technical-overview.md +90 -0
  250. package/skills/ck-frontend-design/references/technical-workflows.md +150 -0
  251. package/skills/ck-frontend-design/references/visual-analysis-overview.md +95 -0
  252. package/skills/ck-frontend-development/SKILL.md +399 -0
  253. package/skills/ck-frontend-development/resources/common-patterns.md +331 -0
  254. package/skills/ck-frontend-development/resources/complete-examples.md +872 -0
  255. package/skills/ck-frontend-development/resources/component-patterns.md +502 -0
  256. package/skills/ck-frontend-development/resources/data-fetching.md +767 -0
  257. package/skills/ck-frontend-development/resources/file-organization.md +502 -0
  258. package/skills/ck-frontend-development/resources/loading-and-error-states.md +501 -0
  259. package/skills/ck-frontend-development/resources/performance.md +406 -0
  260. package/skills/ck-frontend-development/resources/routing-guide.md +364 -0
  261. package/skills/ck-frontend-development/resources/styling-guide.md +428 -0
  262. package/skills/ck-frontend-development/resources/typescript-standards.md +418 -0
  263. package/skills/ck-markdown-novel-viewer/SKILL.md +190 -0
  264. package/skills/ck-markdown-novel-viewer/assets/directory-browser.css +215 -0
  265. package/skills/ck-markdown-novel-viewer/assets/favicon.png +0 -0
  266. package/skills/ck-markdown-novel-viewer/assets/novel-theme.css +818 -0
  267. package/skills/ck-markdown-novel-viewer/assets/reader.js +262 -0
  268. package/skills/ck-markdown-novel-viewer/assets/template.html +80 -0
  269. package/skills/ck-markdown-novel-viewer/package.json +15 -0
  270. package/skills/ck-markdown-novel-viewer/scripts/lib/http-server.cjs +434 -0
  271. package/skills/ck-markdown-novel-viewer/scripts/lib/markdown-renderer.cjs +272 -0
  272. package/skills/ck-markdown-novel-viewer/scripts/lib/plan-navigator.cjs +509 -0
  273. package/skills/ck-markdown-novel-viewer/scripts/lib/port-finder.cjs +48 -0
  274. package/skills/ck-markdown-novel-viewer/scripts/lib/process-mgr.cjs +150 -0
  275. package/skills/ck-markdown-novel-viewer/scripts/server.cjs +411 -0
  276. package/skills/ck-markdown-novel-viewer/scripts/tests/server.test.cjs +283 -0
  277. package/skills/ck-markdown-novel-viewer/tests/dashboard-assets.test.cjs +340 -0
  278. package/skills/ck-markdown-novel-viewer/tests/dashboard-renderer.test.cjs +404 -0
  279. package/skills/ck-markdown-novel-viewer/tests/http-server.test.cjs +271 -0
  280. package/skills/ck-markdown-novel-viewer/tests/run-tests.cjs +51 -0
  281. package/skills/ck-markdown-novel-viewer/tests/test-framework.cjs +154 -0
  282. package/skills/ck-markdown-novel-viewer/tests/verify-xss.cjs +90 -0
  283. package/skills/ck-mcp-builder/LICENSE.txt +202 -0
  284. package/skills/ck-mcp-builder/SKILL.md +327 -0
  285. package/skills/ck-mcp-builder/reference/evaluation.md +602 -0
  286. package/skills/ck-mcp-builder/reference/mcp_best_practices.md +915 -0
  287. package/skills/ck-mcp-builder/reference/node_mcp_server.md +916 -0
  288. package/skills/ck-mcp-builder/reference/python_mcp_server.md +752 -0
  289. package/skills/ck-mcp-builder/scripts/connections.py +151 -0
  290. package/skills/ck-mcp-builder/scripts/evaluation.py +373 -0
  291. package/skills/ck-mcp-builder/scripts/example_evaluation.xml +22 -0
  292. package/skills/ck-mcp-builder/scripts/requirements.txt +2 -0
  293. package/skills/ck-mcp-management/README.md +219 -0
  294. package/skills/ck-mcp-management/SKILL.md +209 -0
  295. package/skills/ck-mcp-management/assets/tools.json +3146 -0
  296. package/skills/ck-mcp-management/references/configuration.md +114 -0
  297. package/skills/ck-mcp-management/references/gemini-cli-integration.md +215 -0
  298. package/skills/ck-mcp-management/references/mcp-protocol.md +116 -0
  299. package/skills/ck-mcp-management/scripts/.env.example +10 -0
  300. package/skills/ck-mcp-management/scripts/cli.ts +195 -0
  301. package/skills/ck-mcp-management/scripts/dist/analyze-tools.js +70 -0
  302. package/skills/ck-mcp-management/scripts/dist/cli.js +160 -0
  303. package/skills/ck-mcp-management/scripts/dist/mcp-client.js +183 -0
  304. package/skills/ck-mcp-management/scripts/mcp-client.ts +230 -0
  305. package/skills/ck-mcp-management/scripts/package.json +20 -0
  306. package/skills/ck-mcp-management/scripts/tsconfig.json +15 -0
  307. package/skills/ck-media-processing/SKILL.md +90 -0
  308. package/skills/ck-media-processing/references/common-workflows.md +132 -0
  309. package/skills/ck-media-processing/references/ffmpeg-encoding.md +358 -0
  310. package/skills/ck-media-processing/references/ffmpeg-filters.md +503 -0
  311. package/skills/ck-media-processing/references/ffmpeg-streaming.md +403 -0
  312. package/skills/ck-media-processing/references/format-compatibility.md +375 -0
  313. package/skills/ck-media-processing/references/imagemagick-batch.md +612 -0
  314. package/skills/ck-media-processing/references/imagemagick-editing.md +623 -0
  315. package/skills/ck-media-processing/references/rmbg-background-removal.md +66 -0
  316. package/skills/ck-media-processing/references/troubleshooting.md +109 -0
  317. package/skills/ck-media-processing/scripts/README.md +111 -0
  318. package/skills/ck-media-processing/scripts/batch-remove-background.sh +124 -0
  319. package/skills/ck-media-processing/scripts/batch_resize.py +342 -0
  320. package/skills/ck-media-processing/scripts/media_convert.py +311 -0
  321. package/skills/ck-media-processing/scripts/remove-background.sh +96 -0
  322. package/skills/ck-media-processing/scripts/remove-bg-node.js +158 -0
  323. package/skills/ck-media-processing/scripts/requirements.txt +24 -0
  324. package/skills/ck-media-processing/scripts/tests/.coverage +0 -0
  325. package/skills/ck-media-processing/scripts/tests/requirements.txt +2 -0
  326. package/skills/ck-media-processing/scripts/tests/test_batch_resize.py +372 -0
  327. package/skills/ck-media-processing/scripts/tests/test_media_convert.py +259 -0
  328. package/skills/ck-media-processing/scripts/tests/test_video_optimize.py +397 -0
  329. package/skills/ck-media-processing/scripts/video_optimize.py +414 -0
  330. package/skills/ck-mobile-development/SKILL.md +210 -0
  331. package/skills/ck-mobile-development/references/mobile-android.md +604 -0
  332. package/skills/ck-mobile-development/references/mobile-best-practices.md +545 -0
  333. package/skills/ck-mobile-development/references/mobile-debugging.md +1089 -0
  334. package/skills/ck-mobile-development/references/mobile-frameworks.md +465 -0
  335. package/skills/ck-mobile-development/references/mobile-ios.md +496 -0
  336. package/skills/ck-mobile-development/references/mobile-mindset.md +544 -0
  337. package/skills/ck-payment-integration/README.md +185 -0
  338. package/skills/ck-payment-integration/SKILL.md +116 -0
  339. package/skills/ck-payment-integration/references/polar/benefits.md +396 -0
  340. package/skills/ck-payment-integration/references/polar/best-practices.md +482 -0
  341. package/skills/ck-payment-integration/references/polar/checkouts.md +266 -0
  342. package/skills/ck-payment-integration/references/polar/overview.md +184 -0
  343. package/skills/ck-payment-integration/references/polar/products.md +244 -0
  344. package/skills/ck-payment-integration/references/polar/sdk.md +436 -0
  345. package/skills/ck-payment-integration/references/polar/subscriptions.md +340 -0
  346. package/skills/ck-payment-integration/references/polar/webhooks.md +405 -0
  347. package/skills/ck-payment-integration/references/sepay/api.md +140 -0
  348. package/skills/ck-payment-integration/references/sepay/best-practices.md +337 -0
  349. package/skills/ck-payment-integration/references/sepay/overview.md +138 -0
  350. package/skills/ck-payment-integration/references/sepay/qr-codes.md +228 -0
  351. package/skills/ck-payment-integration/references/sepay/sdk.md +213 -0
  352. package/skills/ck-payment-integration/references/sepay/webhooks.md +208 -0
  353. package/skills/ck-payment-integration/scripts/.env.example +20 -0
  354. package/skills/ck-payment-integration/scripts/checkout-helper.js +244 -0
  355. package/skills/ck-payment-integration/scripts/package.json +17 -0
  356. package/skills/ck-payment-integration/scripts/polar-webhook-verify.js +202 -0
  357. package/skills/ck-payment-integration/scripts/sepay-webhook-verify.js +193 -0
  358. package/skills/ck-payment-integration/scripts/test-scripts.js +237 -0
  359. package/skills/ck-planning/SKILL.md +79 -49
  360. package/skills/ck-planning/references/codebase-understanding.md +62 -0
  361. package/skills/ck-planning/references/output-standards.md +127 -0
  362. package/skills/ck-planning/references/plan-organization.md +122 -60
  363. package/skills/ck-planning/references/research-phase.md +49 -56
  364. package/skills/ck-planning/references/solution-design.md +61 -63
  365. package/skills/ck-problem-solving/SKILL.md +95 -0
  366. package/skills/ck-problem-solving/references/attribution.md +69 -0
  367. package/skills/ck-problem-solving/references/collision-zone-thinking.md +79 -0
  368. package/skills/ck-problem-solving/references/inversion-exercise.md +91 -0
  369. package/skills/ck-problem-solving/references/meta-pattern-recognition.md +87 -0
  370. package/skills/ck-problem-solving/references/scale-game.md +95 -0
  371. package/skills/ck-problem-solving/references/simplification-cascades.md +80 -0
  372. package/skills/ck-problem-solving/references/when-stuck.md +72 -0
  373. package/skills/ck-repomix/SKILL.md +247 -0
  374. package/skills/ck-repomix/references/configuration.md +211 -0
  375. package/skills/ck-repomix/references/usage-patterns.md +232 -0
  376. package/skills/ck-repomix/scripts/.coverage +0 -0
  377. package/skills/ck-repomix/scripts/README.md +179 -0
  378. package/skills/ck-repomix/scripts/repomix_batch.py +455 -0
  379. package/skills/ck-repomix/scripts/repos.example.json +15 -0
  380. package/skills/ck-repomix/scripts/requirements.txt +15 -0
  381. package/skills/ck-repomix/scripts/tests/test_repomix_batch.py +531 -0
  382. package/skills/ck-sequential-thinking/.env.example +8 -0
  383. package/skills/ck-sequential-thinking/README.md +183 -0
  384. package/skills/ck-sequential-thinking/SKILL.md +14 -2
  385. package/skills/ck-sequential-thinking/package.json +31 -0
  386. package/skills/ck-sequential-thinking/references/advanced-strategies.md +79 -0
  387. package/skills/ck-sequential-thinking/references/advanced-techniques.md +2 -14
  388. package/skills/ck-sequential-thinking/references/core-patterns.md +8 -0
  389. package/skills/ck-sequential-thinking/references/examples-api.md +88 -0
  390. package/skills/ck-sequential-thinking/references/examples-architecture.md +94 -0
  391. package/skills/ck-sequential-thinking/references/examples-debug.md +90 -0
  392. package/skills/ck-sequential-thinking/scripts/format-thought.js +159 -0
  393. package/skills/ck-sequential-thinking/scripts/process-thought.js +236 -0
  394. package/skills/ck-sequential-thinking/tests/format-thought.test.js +133 -0
  395. package/skills/ck-sequential-thinking/tests/process-thought.test.js +215 -0
  396. package/skills/ck-shopify/README.md +66 -0
  397. package/skills/ck-shopify/SKILL.md +319 -0
  398. package/skills/ck-shopify/references/app-development.md +470 -0
  399. package/skills/ck-shopify/references/extensions.md +493 -0
  400. package/skills/ck-shopify/references/themes.md +498 -0
  401. package/skills/ck-shopify/scripts/.coverage +0 -0
  402. package/skills/ck-shopify/scripts/requirements.txt +19 -0
  403. package/skills/ck-shopify/scripts/shopify_init.py +423 -0
  404. package/skills/ck-shopify/scripts/tests/.coverage +0 -0
  405. package/skills/ck-shopify/scripts/tests/test_shopify_init.py +385 -0
  406. package/skills/ck-skill-creator/LICENSE.txt +202 -0
  407. package/skills/ck-skill-creator/SKILL.md +265 -0
  408. package/skills/ck-skill-creator/scripts/init_skill.py +303 -0
  409. package/skills/ck-skill-creator/scripts/package_skill.py +110 -0
  410. package/skills/ck-skill-creator/scripts/quick_validate.py +65 -0
  411. package/skills/ck-threejs/SKILL.md +87 -0
  412. package/skills/ck-threejs/references/01-getting-started.md +177 -0
  413. package/skills/ck-threejs/references/02-loaders.md +169 -0
  414. package/skills/ck-threejs/references/03-textures.md +170 -0
  415. package/skills/ck-threejs/references/04-cameras.md +195 -0
  416. package/skills/ck-threejs/references/05-lights.md +183 -0
  417. package/skills/ck-threejs/references/06-animations.md +214 -0
  418. package/skills/ck-threejs/references/07-math.md +260 -0
  419. package/skills/ck-threejs/references/08-interaction.md +267 -0
  420. package/skills/ck-threejs/references/09-postprocessing.md +240 -0
  421. package/skills/ck-threejs/references/10-controls.md +259 -0
  422. package/skills/ck-threejs/references/11-materials-advanced.md +270 -0
  423. package/skills/ck-threejs/references/12-performance.md +269 -0
  424. package/skills/ck-threejs/references/13-node-materials.md +298 -0
  425. package/skills/ck-threejs/references/14-physics-vr.md +304 -0
  426. package/skills/ck-threejs/references/15-specialized-loaders.md +333 -0
  427. package/skills/ck-threejs/references/16-webgpu.md +302 -0
  428. package/skills/ck-ui-styling/LICENSE.txt +202 -0
  429. package/skills/ck-ui-styling/SKILL.md +319 -0
  430. package/skills/ck-ui-styling/canvas-fonts/ArsenalSC-OFL.txt +93 -0
  431. package/skills/ck-ui-styling/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
  432. package/skills/ck-ui-styling/canvas-fonts/BigShoulders-Bold.ttf +0 -0
  433. package/skills/ck-ui-styling/canvas-fonts/BigShoulders-OFL.txt +93 -0
  434. package/skills/ck-ui-styling/canvas-fonts/BigShoulders-Regular.ttf +0 -0
  435. package/skills/ck-ui-styling/canvas-fonts/Boldonse-OFL.txt +93 -0
  436. package/skills/ck-ui-styling/canvas-fonts/Boldonse-Regular.ttf +0 -0
  437. package/skills/ck-ui-styling/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
  438. package/skills/ck-ui-styling/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
  439. package/skills/ck-ui-styling/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
  440. package/skills/ck-ui-styling/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
  441. package/skills/ck-ui-styling/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
  442. package/skills/ck-ui-styling/canvas-fonts/CrimsonPro-OFL.txt +93 -0
  443. package/skills/ck-ui-styling/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
  444. package/skills/ck-ui-styling/canvas-fonts/DMMono-OFL.txt +93 -0
  445. package/skills/ck-ui-styling/canvas-fonts/DMMono-Regular.ttf +0 -0
  446. package/skills/ck-ui-styling/canvas-fonts/EricaOne-OFL.txt +94 -0
  447. package/skills/ck-ui-styling/canvas-fonts/EricaOne-Regular.ttf +0 -0
  448. package/skills/ck-ui-styling/canvas-fonts/GeistMono-Bold.ttf +0 -0
  449. package/skills/ck-ui-styling/canvas-fonts/GeistMono-OFL.txt +93 -0
  450. package/skills/ck-ui-styling/canvas-fonts/GeistMono-Regular.ttf +0 -0
  451. package/skills/ck-ui-styling/canvas-fonts/Gloock-OFL.txt +93 -0
  452. package/skills/ck-ui-styling/canvas-fonts/Gloock-Regular.ttf +0 -0
  453. package/skills/ck-ui-styling/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
  454. package/skills/ck-ui-styling/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
  455. package/skills/ck-ui-styling/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
  456. package/skills/ck-ui-styling/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
  457. package/skills/ck-ui-styling/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
  458. package/skills/ck-ui-styling/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
  459. package/skills/ck-ui-styling/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
  460. package/skills/ck-ui-styling/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
  461. package/skills/ck-ui-styling/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
  462. package/skills/ck-ui-styling/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
  463. package/skills/ck-ui-styling/canvas-fonts/InstrumentSans-OFL.txt +93 -0
  464. package/skills/ck-ui-styling/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
  465. package/skills/ck-ui-styling/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
  466. package/skills/ck-ui-styling/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
  467. package/skills/ck-ui-styling/canvas-fonts/Italiana-OFL.txt +93 -0
  468. package/skills/ck-ui-styling/canvas-fonts/Italiana-Regular.ttf +0 -0
  469. package/skills/ck-ui-styling/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
  470. package/skills/ck-ui-styling/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
  471. package/skills/ck-ui-styling/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
  472. package/skills/ck-ui-styling/canvas-fonts/Jura-Light.ttf +0 -0
  473. package/skills/ck-ui-styling/canvas-fonts/Jura-Medium.ttf +0 -0
  474. package/skills/ck-ui-styling/canvas-fonts/Jura-OFL.txt +93 -0
  475. package/skills/ck-ui-styling/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
  476. package/skills/ck-ui-styling/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
  477. package/skills/ck-ui-styling/canvas-fonts/Lora-Bold.ttf +0 -0
  478. package/skills/ck-ui-styling/canvas-fonts/Lora-BoldItalic.ttf +0 -0
  479. package/skills/ck-ui-styling/canvas-fonts/Lora-Italic.ttf +0 -0
  480. package/skills/ck-ui-styling/canvas-fonts/Lora-OFL.txt +93 -0
  481. package/skills/ck-ui-styling/canvas-fonts/Lora-Regular.ttf +0 -0
  482. package/skills/ck-ui-styling/canvas-fonts/NationalPark-Bold.ttf +0 -0
  483. package/skills/ck-ui-styling/canvas-fonts/NationalPark-OFL.txt +93 -0
  484. package/skills/ck-ui-styling/canvas-fonts/NationalPark-Regular.ttf +0 -0
  485. package/skills/ck-ui-styling/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
  486. package/skills/ck-ui-styling/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
  487. package/skills/ck-ui-styling/canvas-fonts/Outfit-Bold.ttf +0 -0
  488. package/skills/ck-ui-styling/canvas-fonts/Outfit-OFL.txt +93 -0
  489. package/skills/ck-ui-styling/canvas-fonts/Outfit-Regular.ttf +0 -0
  490. package/skills/ck-ui-styling/canvas-fonts/PixelifySans-Medium.ttf +0 -0
  491. package/skills/ck-ui-styling/canvas-fonts/PixelifySans-OFL.txt +93 -0
  492. package/skills/ck-ui-styling/canvas-fonts/PoiretOne-OFL.txt +93 -0
  493. package/skills/ck-ui-styling/canvas-fonts/PoiretOne-Regular.ttf +0 -0
  494. package/skills/ck-ui-styling/canvas-fonts/RedHatMono-Bold.ttf +0 -0
  495. package/skills/ck-ui-styling/canvas-fonts/RedHatMono-OFL.txt +93 -0
  496. package/skills/ck-ui-styling/canvas-fonts/RedHatMono-Regular.ttf +0 -0
  497. package/skills/ck-ui-styling/canvas-fonts/Silkscreen-OFL.txt +93 -0
  498. package/skills/ck-ui-styling/canvas-fonts/Silkscreen-Regular.ttf +0 -0
  499. package/skills/ck-ui-styling/canvas-fonts/SmoochSans-Medium.ttf +0 -0
  500. package/skills/ck-ui-styling/canvas-fonts/SmoochSans-OFL.txt +93 -0
  501. package/skills/ck-ui-styling/canvas-fonts/Tektur-Medium.ttf +0 -0
  502. package/skills/ck-ui-styling/canvas-fonts/Tektur-OFL.txt +93 -0
  503. package/skills/ck-ui-styling/canvas-fonts/Tektur-Regular.ttf +0 -0
  504. package/skills/ck-ui-styling/canvas-fonts/WorkSans-Bold.ttf +0 -0
  505. package/skills/ck-ui-styling/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
  506. package/skills/ck-ui-styling/canvas-fonts/WorkSans-Italic.ttf +0 -0
  507. package/skills/ck-ui-styling/canvas-fonts/WorkSans-OFL.txt +93 -0
  508. package/skills/ck-ui-styling/canvas-fonts/WorkSans-Regular.ttf +0 -0
  509. package/skills/ck-ui-styling/canvas-fonts/YoungSerif-OFL.txt +93 -0
  510. package/skills/ck-ui-styling/canvas-fonts/YoungSerif-Regular.ttf +0 -0
  511. package/skills/ck-ui-styling/references/canvas-design-system.md +320 -0
  512. package/skills/ck-ui-styling/references/shadcn-accessibility.md +471 -0
  513. package/skills/ck-ui-styling/references/shadcn-components.md +424 -0
  514. package/skills/ck-ui-styling/references/shadcn-theming.md +373 -0
  515. package/skills/ck-ui-styling/references/tailwind-customization.md +483 -0
  516. package/skills/ck-ui-styling/references/tailwind-responsive.md +382 -0
  517. package/skills/ck-ui-styling/references/tailwind-utilities.md +455 -0
  518. package/skills/ck-ui-styling/scripts/.coverage +0 -0
  519. package/skills/ck-ui-styling/scripts/requirements.txt +17 -0
  520. package/skills/ck-ui-styling/scripts/shadcn_add.py +292 -0
  521. package/skills/ck-ui-styling/scripts/tailwind_config_gen.py +456 -0
  522. package/skills/ck-ui-styling/scripts/tests/coverage-ui.json +1 -0
  523. package/skills/ck-ui-styling/scripts/tests/requirements.txt +3 -0
  524. package/skills/ck-ui-styling/scripts/tests/test_shadcn_add.py +266 -0
  525. package/skills/ck-ui-styling/scripts/tests/test_tailwind_config_gen.py +336 -0
  526. package/skills/ck-ui-ux-pro-max/SKILL.md +227 -0
  527. package/skills/ck-ui-ux-pro-max/data/charts.csv +26 -0
  528. package/skills/ck-ui-ux-pro-max/data/colors.csv +97 -0
  529. package/skills/ck-ui-ux-pro-max/data/landing.csv +31 -0
  530. package/skills/ck-ui-ux-pro-max/data/products.csv +97 -0
  531. package/skills/ck-ui-ux-pro-max/data/prompts.csv +24 -0
  532. package/skills/ck-ui-ux-pro-max/data/stacks/flutter.csv +53 -0
  533. package/skills/ck-ui-ux-pro-max/data/stacks/html-tailwind.csv +51 -0
  534. package/skills/ck-ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
  535. package/skills/ck-ui-ux-pro-max/data/stacks/react-native.csv +52 -0
  536. package/skills/ck-ui-ux-pro-max/data/stacks/react.csv +54 -0
  537. package/skills/ck-ui-ux-pro-max/data/stacks/svelte.csv +54 -0
  538. package/skills/ck-ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
  539. package/skills/ck-ui-ux-pro-max/data/stacks/vue.csv +50 -0
  540. package/skills/ck-ui-ux-pro-max/data/styles.csv +59 -0
  541. package/skills/ck-ui-ux-pro-max/data/typography.csv +58 -0
  542. package/skills/ck-ui-ux-pro-max/data/ux-guidelines.csv +100 -0
  543. package/skills/ck-ui-ux-pro-max/scripts/core.py +236 -0
  544. package/skills/ck-ui-ux-pro-max/scripts/search.py +76 -0
  545. package/skills/ck-web-frameworks/SKILL.md +322 -0
  546. package/skills/ck-web-frameworks/references/nextjs-app-router.md +465 -0
  547. package/skills/ck-web-frameworks/references/nextjs-data-fetching.md +459 -0
  548. package/skills/ck-web-frameworks/references/nextjs-optimization.md +511 -0
  549. package/skills/ck-web-frameworks/references/nextjs-server-components.md +495 -0
  550. package/skills/ck-web-frameworks/references/remix-icon-integration.md +603 -0
  551. package/skills/ck-web-frameworks/references/turborepo-caching.md +551 -0
  552. package/skills/ck-web-frameworks/references/turborepo-pipelines.md +517 -0
  553. package/skills/ck-web-frameworks/references/turborepo-setup.md +542 -0
  554. package/skills/ck-web-frameworks/scripts/.coverage +0 -0
  555. package/skills/ck-web-frameworks/scripts/__init__.py +0 -0
  556. package/skills/ck-web-frameworks/scripts/nextjs_init.py +547 -0
  557. package/skills/ck-web-frameworks/scripts/requirements.txt +16 -0
  558. package/skills/ck-web-frameworks/scripts/tests/coverage-web.json +1 -0
  559. package/skills/ck-web-frameworks/scripts/tests/requirements.txt +3 -0
  560. package/skills/ck-web-frameworks/scripts/tests/test_nextjs_init.py +319 -0
  561. package/skills/ck-web-frameworks/scripts/tests/test_turborepo_migrate.py +374 -0
  562. package/skills/ck-web-frameworks/scripts/turborepo_migrate.py +394 -0
  563. package/src/commands/init.js +61 -30
  564. package/src/utils/paths.js +35 -4
@@ -0,0 +1,953 @@
1
+ # Puppeteer Quick Reference
2
+
3
+ Complete guide to browser automation with Puppeteer - a high-level API over Chrome DevTools Protocol.
4
+
5
+ ## Table of Contents
6
+
7
+ - [Setup](#setup)
8
+ - [Browser & Page Management](#browser--page-management)
9
+ - [Navigation](#navigation)
10
+ - [Element Interaction](#element-interaction)
11
+ - [JavaScript Execution](#javascript-execution)
12
+ - [Screenshots & PDFs](#screenshots--pdfs)
13
+ - [Network Interception](#network-interception)
14
+ - [Device Emulation](#device-emulation)
15
+ - [Performance](#performance)
16
+ - [Common Patterns](#common-patterns)
17
+
18
+ ---
19
+
20
+ ## Setup
21
+
22
+ ### Installation
23
+
24
+ ```bash
25
+ # Install Puppeteer
26
+ npm install puppeteer
27
+
28
+ # Install core only (bring your own Chrome)
29
+ npm install puppeteer-core
30
+ ```
31
+
32
+ ### Basic Usage
33
+
34
+ ```javascript
35
+ import puppeteer from 'puppeteer';
36
+
37
+ // Launch browser
38
+ const browser = await puppeteer.launch({
39
+ headless: true,
40
+ args: ['--no-sandbox']
41
+ });
42
+
43
+ // Open page
44
+ const page = await browser.newPage();
45
+
46
+ // Navigate
47
+ await page.goto('https://example.com');
48
+
49
+ // Do work...
50
+
51
+ // Cleanup
52
+ await browser.close();
53
+ ```
54
+
55
+ ---
56
+
57
+ ## Browser & Page Management
58
+
59
+ ### Launch Browser
60
+
61
+ ```javascript
62
+ const browser = await puppeteer.launch({
63
+ // Visibility
64
+ headless: false, // Show browser UI
65
+ headless: 'new', // New headless mode (Chrome 112+)
66
+
67
+ // Chrome location
68
+ executablePath: '/path/to/chrome',
69
+ channel: 'chrome', // or 'chrome-canary', 'chrome-beta'
70
+
71
+ // Browser context
72
+ userDataDir: './user-data', // Persistent profile
73
+
74
+ // Window size
75
+ defaultViewport: {
76
+ width: 1920,
77
+ height: 1080,
78
+ deviceScaleFactor: 1,
79
+ isMobile: false
80
+ },
81
+
82
+ // Advanced options
83
+ args: [
84
+ '--no-sandbox',
85
+ '--disable-setuid-sandbox',
86
+ '--disable-dev-shm-usage',
87
+ '--disable-web-security',
88
+ '--disable-features=IsolateOrigins',
89
+ '--disable-site-isolation-trials',
90
+ '--start-maximized'
91
+ ],
92
+
93
+ // Debugging
94
+ devtools: true, // Open DevTools automatically
95
+ slowMo: 250, // Slow down by 250ms per action
96
+
97
+ // Network
98
+ proxy: {
99
+ server: 'http://proxy.com:8080'
100
+ }
101
+ });
102
+ ```
103
+
104
+ ### Connect to Running Browser
105
+
106
+ ```javascript
107
+ // Launch Chrome with debugging
108
+ // google-chrome --remote-debugging-port=9222
109
+
110
+ const browser = await puppeteer.connect({
111
+ browserURL: 'http://localhost:9222',
112
+ // or browserWSEndpoint: 'ws://localhost:9222/devtools/browser/...'
113
+ });
114
+ ```
115
+
116
+ ### Page Management
117
+
118
+ ```javascript
119
+ // Create new page
120
+ const page = await browser.newPage();
121
+
122
+ // Get all pages
123
+ const pages = await browser.pages();
124
+
125
+ // Close page
126
+ await page.close();
127
+
128
+ // Multiple pages
129
+ const page1 = await browser.newPage();
130
+ const page2 = await browser.newPage();
131
+
132
+ // Switch between pages
133
+ await page1.bringToFront();
134
+ ```
135
+
136
+ ### Browser Context (Incognito)
137
+
138
+ ```javascript
139
+ // Create isolated context
140
+ const context = await browser.createBrowserContext();
141
+ const page = await context.newPage();
142
+
143
+ // Cleanup context
144
+ await context.close();
145
+ ```
146
+
147
+ ---
148
+
149
+ ## Navigation
150
+
151
+ ### Basic Navigation
152
+
153
+ ```javascript
154
+ // Navigate to URL
155
+ await page.goto('https://example.com');
156
+
157
+ // Navigate with options
158
+ await page.goto('https://example.com', {
159
+ waitUntil: 'networkidle2', // or 'load', 'domcontentloaded', 'networkidle0'
160
+ timeout: 30000 // Max wait time (ms)
161
+ });
162
+
163
+ // Reload page
164
+ await page.reload({ waitUntil: 'networkidle2' });
165
+
166
+ // Navigation history
167
+ await page.goBack();
168
+ await page.goForward();
169
+
170
+ // Wait for navigation
171
+ await page.waitForNavigation({
172
+ waitUntil: 'networkidle2'
173
+ });
174
+ ```
175
+
176
+ ### Wait Until Options
177
+
178
+ - `load` - Wait for load event
179
+ - `domcontentloaded` - Wait for DOMContentLoaded event
180
+ - `networkidle0` - Wait until no network connections for 500ms
181
+ - `networkidle2` - Wait until max 2 network connections for 500ms
182
+
183
+ ---
184
+
185
+ ## Element Interaction
186
+
187
+ ### Selectors
188
+
189
+ ```javascript
190
+ // CSS selectors
191
+ await page.$('#id');
192
+ await page.$('.class');
193
+ await page.$('div > p');
194
+
195
+ // XPath
196
+ await page.$x('//button[text()="Submit"]');
197
+
198
+ // Get all matching elements
199
+ await page.$$('.item');
200
+ await page.$$x('//div[@class="item"]');
201
+ ```
202
+
203
+ ### Click Elements
204
+
205
+ ```javascript
206
+ // Click by selector
207
+ await page.click('.button');
208
+
209
+ // Click with options
210
+ await page.click('.button', {
211
+ button: 'left', // or 'right', 'middle'
212
+ clickCount: 1, // 2 for double-click
213
+ delay: 100 // Delay between mousedown and mouseup
214
+ });
215
+
216
+ // ElementHandle click
217
+ const button = await page.$('.button');
218
+ await button.click();
219
+ ```
220
+
221
+ ### Type Text
222
+
223
+ ```javascript
224
+ // Type into input
225
+ await page.type('#search', 'query text');
226
+
227
+ // Type with delay
228
+ await page.type('#search', 'slow typing', { delay: 100 });
229
+
230
+ // Clear and type
231
+ await page.$eval('#search', el => el.value = '');
232
+ await page.type('#search', 'new text');
233
+ ```
234
+
235
+ ### Form Interaction
236
+
237
+ ```javascript
238
+ // Fill input
239
+ await page.type('#username', 'john@example.com');
240
+ await page.type('#password', 'secret123');
241
+
242
+ // Select dropdown option
243
+ await page.select('#country', 'US'); // By value
244
+ await page.select('#country', 'USA', 'UK'); // Multiple
245
+
246
+ // Check/uncheck checkbox
247
+ await page.click('input[type="checkbox"]');
248
+
249
+ // Choose radio button
250
+ await page.click('input[value="option2"]');
251
+
252
+ // Upload file
253
+ const input = await page.$('input[type="file"]');
254
+ await input.uploadFile('/path/to/file.pdf');
255
+
256
+ // Submit form
257
+ await page.click('button[type="submit"]');
258
+ await page.waitForNavigation();
259
+ ```
260
+
261
+ ### Hover & Focus
262
+
263
+ ```javascript
264
+ // Hover over element
265
+ await page.hover('.menu-item');
266
+
267
+ // Focus element
268
+ await page.focus('#input');
269
+
270
+ // Blur
271
+ await page.$eval('#input', el => el.blur());
272
+ ```
273
+
274
+ ### Drag & Drop
275
+
276
+ ```javascript
277
+ const source = await page.$('.draggable');
278
+ const target = await page.$('.drop-zone');
279
+
280
+ await source.drag(target);
281
+ await source.drop(target);
282
+ ```
283
+
284
+ ---
285
+
286
+ ## JavaScript Execution
287
+
288
+ ### Evaluate in Page Context
289
+
290
+ ```javascript
291
+ // Execute JavaScript
292
+ const title = await page.evaluate(() => document.title);
293
+
294
+ // With arguments
295
+ const text = await page.evaluate(
296
+ (selector) => document.querySelector(selector).textContent,
297
+ '.heading'
298
+ );
299
+
300
+ // Return complex data
301
+ const data = await page.evaluate(() => ({
302
+ title: document.title,
303
+ url: location.href,
304
+ cookies: document.cookie
305
+ }));
306
+
307
+ // With ElementHandle
308
+ const element = await page.$('.button');
309
+ const text = await page.evaluate(el => el.textContent, element);
310
+ ```
311
+
312
+ ### Query & Modify DOM
313
+
314
+ ```javascript
315
+ // Get element property
316
+ const value = await page.$eval('#input', el => el.value);
317
+
318
+ // Get multiple elements
319
+ const items = await page.$$eval('.item', elements =>
320
+ elements.map(el => el.textContent)
321
+ );
322
+
323
+ // Modify element
324
+ await page.$eval('#input', (el, value) => {
325
+ el.value = value;
326
+ }, 'new value');
327
+
328
+ // Add class
329
+ await page.$eval('.element', el => el.classList.add('active'));
330
+ ```
331
+
332
+ ### Expose Functions
333
+
334
+ ```javascript
335
+ // Expose Node.js function to page
336
+ await page.exposeFunction('md5', (text) =>
337
+ crypto.createHash('md5').update(text).digest('hex')
338
+ );
339
+
340
+ // Call from page context
341
+ const hash = await page.evaluate(async () => {
342
+ return await window.md5('hello world');
343
+ });
344
+ ```
345
+
346
+ ---
347
+
348
+ ## Screenshots & PDFs
349
+
350
+ ### Screenshots
351
+
352
+ ```javascript
353
+ // Full page screenshot
354
+ await page.screenshot({
355
+ path: 'screenshot.png',
356
+ fullPage: true
357
+ });
358
+
359
+ // Viewport screenshot
360
+ await page.screenshot({
361
+ path: 'viewport.png',
362
+ fullPage: false
363
+ });
364
+
365
+ // Element screenshot
366
+ const element = await page.$('.chart');
367
+ await element.screenshot({
368
+ path: 'chart.png'
369
+ });
370
+
371
+ // Screenshot options
372
+ await page.screenshot({
373
+ path: 'page.png',
374
+ type: 'png', // or 'jpeg', 'webp'
375
+ quality: 80, // JPEG quality (0-100)
376
+ clip: { // Crop region
377
+ x: 0,
378
+ y: 0,
379
+ width: 500,
380
+ height: 500
381
+ },
382
+ omitBackground: true // Transparent background
383
+ });
384
+
385
+ // Screenshot to buffer
386
+ const buffer = await page.screenshot();
387
+ ```
388
+
389
+ ### PDF Generation
390
+
391
+ ```javascript
392
+ // Generate PDF
393
+ await page.pdf({
394
+ path: 'page.pdf',
395
+ format: 'A4', // or 'Letter', 'Legal', etc.
396
+ printBackground: true,
397
+ margin: {
398
+ top: '1cm',
399
+ right: '1cm',
400
+ bottom: '1cm',
401
+ left: '1cm'
402
+ }
403
+ });
404
+
405
+ // Custom page size
406
+ await page.pdf({
407
+ path: 'custom.pdf',
408
+ width: '8.5in',
409
+ height: '11in',
410
+ landscape: true
411
+ });
412
+
413
+ // Header and footer
414
+ await page.pdf({
415
+ path: 'report.pdf',
416
+ displayHeaderFooter: true,
417
+ headerTemplate: '<div style="font-size:10px;">Header</div>',
418
+ footerTemplate: '<div style="font-size:10px;">Page <span class="pageNumber"></span></div>'
419
+ });
420
+ ```
421
+
422
+ ---
423
+
424
+ ## Network Interception
425
+
426
+ ### Request Interception
427
+
428
+ ```javascript
429
+ // Enable request interception
430
+ await page.setRequestInterception(true);
431
+
432
+ // Intercept requests
433
+ page.on('request', (request) => {
434
+ // Block specific resource types
435
+ if (request.resourceType() === 'image') {
436
+ request.abort();
437
+ }
438
+ // Block URLs
439
+ else if (request.url().includes('ads')) {
440
+ request.abort();
441
+ }
442
+ // Modify request
443
+ else if (request.url().includes('api')) {
444
+ request.continue({
445
+ headers: {
446
+ ...request.headers(),
447
+ 'Authorization': 'Bearer token'
448
+ }
449
+ });
450
+ }
451
+ // Continue normally
452
+ else {
453
+ request.continue();
454
+ }
455
+ });
456
+ ```
457
+
458
+ ### Mock Responses
459
+
460
+ ```javascript
461
+ await page.setRequestInterception(true);
462
+
463
+ page.on('request', (request) => {
464
+ if (request.url().includes('/api/user')) {
465
+ request.respond({
466
+ status: 200,
467
+ contentType: 'application/json',
468
+ body: JSON.stringify({
469
+ id: 1,
470
+ name: 'Mock User'
471
+ })
472
+ });
473
+ } else {
474
+ request.continue();
475
+ }
476
+ });
477
+ ```
478
+
479
+ ### Monitor Network
480
+
481
+ ```javascript
482
+ // Track requests
483
+ page.on('request', (request) => {
484
+ console.log('Request:', request.method(), request.url());
485
+ });
486
+
487
+ // Track responses
488
+ page.on('response', (response) => {
489
+ console.log('Response:', response.status(), response.url());
490
+ });
491
+
492
+ // Track failed requests
493
+ page.on('requestfailed', (request) => {
494
+ console.log('Failed:', request.failure().errorText, request.url());
495
+ });
496
+
497
+ // Get response body
498
+ page.on('response', async (response) => {
499
+ if (response.url().includes('/api/data')) {
500
+ const json = await response.json();
501
+ console.log('API Data:', json);
502
+ }
503
+ });
504
+ ```
505
+
506
+ ---
507
+
508
+ ## Device Emulation
509
+
510
+ ### Predefined Devices
511
+
512
+ ```javascript
513
+ import { devices } from 'puppeteer';
514
+
515
+ // Emulate iPhone
516
+ const iPhone = devices['iPhone 13 Pro'];
517
+ await page.emulate(iPhone);
518
+
519
+ // Common devices
520
+ const iPad = devices['iPad Pro'];
521
+ const pixel = devices['Pixel 5'];
522
+ const galaxy = devices['Galaxy S9+'];
523
+
524
+ // Navigate after emulation
525
+ await page.goto('https://example.com');
526
+ ```
527
+
528
+ ### Custom Device
529
+
530
+ ```javascript
531
+ await page.emulate({
532
+ viewport: {
533
+ width: 375,
534
+ height: 812,
535
+ deviceScaleFactor: 3,
536
+ isMobile: true,
537
+ hasTouch: true,
538
+ isLandscape: false
539
+ },
540
+ userAgent: 'Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X)...'
541
+ });
542
+ ```
543
+
544
+ ### Viewport Only
545
+
546
+ ```javascript
547
+ await page.setViewport({
548
+ width: 1920,
549
+ height: 1080,
550
+ deviceScaleFactor: 1
551
+ });
552
+ ```
553
+
554
+ ### Geolocation
555
+
556
+ ```javascript
557
+ // Set geolocation
558
+ await page.setGeolocation({
559
+ latitude: 37.7749,
560
+ longitude: -122.4194,
561
+ accuracy: 100
562
+ });
563
+
564
+ // Grant permissions
565
+ const context = browser.defaultBrowserContext();
566
+ await context.overridePermissions('https://example.com', ['geolocation']);
567
+ ```
568
+
569
+ ### Timezone & Locale
570
+
571
+ ```javascript
572
+ // Set timezone
573
+ await page.emulateTimezone('America/New_York');
574
+
575
+ // Set locale
576
+ await page.emulateMediaType('screen');
577
+ await page.evaluateOnNewDocument(() => {
578
+ Object.defineProperty(navigator, 'language', {
579
+ get: () => 'en-US'
580
+ });
581
+ });
582
+ ```
583
+
584
+ ---
585
+
586
+ ## Performance
587
+
588
+ ### CPU & Network Throttling
589
+
590
+ ```javascript
591
+ // CPU throttling
592
+ const client = await page.createCDPSession();
593
+ await client.send('Emulation.setCPUThrottlingRate', { rate: 4 });
594
+
595
+ // Network throttling
596
+ await page.emulateNetworkConditions({
597
+ offline: false,
598
+ downloadThroughput: 1.5 * 1024 * 1024 / 8, // 1.5 Mbps
599
+ uploadThroughput: 750 * 1024 / 8, // 750 Kbps
600
+ latency: 40 // 40ms RTT
601
+ });
602
+
603
+ // Predefined profiles
604
+ await page.emulateNetworkConditions(
605
+ puppeteer.networkConditions['Fast 3G']
606
+ );
607
+
608
+ // Disable throttling
609
+ await page.emulateNetworkConditions({
610
+ offline: false,
611
+ downloadThroughput: -1,
612
+ uploadThroughput: -1,
613
+ latency: 0
614
+ });
615
+ ```
616
+
617
+ ### Performance Metrics
618
+
619
+ ```javascript
620
+ // Get metrics
621
+ const metrics = await page.metrics();
622
+ console.log(metrics);
623
+ // {
624
+ // Timestamp, Documents, Frames, JSEventListeners,
625
+ // Nodes, LayoutCount, RecalcStyleCount,
626
+ // LayoutDuration, RecalcStyleDuration,
627
+ // ScriptDuration, TaskDuration,
628
+ // JSHeapUsedSize, JSHeapTotalSize
629
+ // }
630
+ ```
631
+
632
+ ### Performance Tracing
633
+
634
+ ```javascript
635
+ // Start tracing
636
+ await page.tracing.start({
637
+ path: 'trace.json',
638
+ categories: [
639
+ 'devtools.timeline',
640
+ 'disabled-by-default-devtools.timeline'
641
+ ]
642
+ });
643
+
644
+ // Navigate
645
+ await page.goto('https://example.com');
646
+
647
+ // Stop tracing
648
+ await page.tracing.stop();
649
+
650
+ // Analyze trace in chrome://tracing
651
+ ```
652
+
653
+ ### Coverage (Code Usage)
654
+
655
+ ```javascript
656
+ // Start JS coverage
657
+ await page.coverage.startJSCoverage();
658
+
659
+ // Start CSS coverage
660
+ await page.coverage.startCSSCoverage();
661
+
662
+ // Navigate
663
+ await page.goto('https://example.com');
664
+
665
+ // Stop and get coverage
666
+ const jsCoverage = await page.coverage.stopJSCoverage();
667
+ const cssCoverage = await page.coverage.stopCSSCoverage();
668
+
669
+ // Calculate unused bytes
670
+ let totalBytes = 0;
671
+ let usedBytes = 0;
672
+ for (const entry of [...jsCoverage, ...cssCoverage]) {
673
+ totalBytes += entry.text.length;
674
+ for (const range of entry.ranges) {
675
+ usedBytes += range.end - range.start - 1;
676
+ }
677
+ }
678
+
679
+ console.log(`Used: ${usedBytes / totalBytes * 100}%`);
680
+ ```
681
+
682
+ ---
683
+
684
+ ## Common Patterns
685
+
686
+ ### Wait for Elements
687
+
688
+ ```javascript
689
+ // Wait for selector
690
+ await page.waitForSelector('.element', {
691
+ visible: true,
692
+ timeout: 5000
693
+ });
694
+
695
+ // Wait for XPath
696
+ await page.waitForXPath('//button[text()="Submit"]');
697
+
698
+ // Wait for function
699
+ await page.waitForFunction(
700
+ () => document.querySelector('.loading') === null,
701
+ { timeout: 10000 }
702
+ );
703
+
704
+ // Wait for timeout
705
+ await page.waitForTimeout(2000);
706
+ ```
707
+
708
+ ### Handle Dialogs
709
+
710
+ ```javascript
711
+ // Alert, confirm, prompt
712
+ page.on('dialog', async (dialog) => {
713
+ console.log(dialog.type(), dialog.message());
714
+
715
+ // Accept
716
+ await dialog.accept();
717
+ // or reject
718
+ // await dialog.dismiss();
719
+ // or provide input for prompt
720
+ // await dialog.accept('input text');
721
+ });
722
+ ```
723
+
724
+ ### Handle Downloads
725
+
726
+ ```javascript
727
+ // Set download path
728
+ const client = await page.createCDPSession();
729
+ await client.send('Page.setDownloadBehavior', {
730
+ behavior: 'allow',
731
+ downloadPath: '/path/to/downloads'
732
+ });
733
+
734
+ // Trigger download
735
+ await page.click('a[download]');
736
+ ```
737
+
738
+ ### Multiple Pages (Tabs)
739
+
740
+ ```javascript
741
+ // Listen for new pages
742
+ browser.on('targetcreated', async (target) => {
743
+ if (target.type() === 'page') {
744
+ const newPage = await target.page();
745
+ console.log('New page opened:', newPage.url());
746
+ }
747
+ });
748
+
749
+ // Click link that opens new tab
750
+ const [newPage] = await Promise.all([
751
+ new Promise(resolve => browser.once('targetcreated', target => resolve(target.page()))),
752
+ page.click('a[target="_blank"]')
753
+ ]);
754
+
755
+ console.log('New page URL:', newPage.url());
756
+ ```
757
+
758
+ ### Frames (iframes)
759
+
760
+ ```javascript
761
+ // Get all frames
762
+ const frames = page.frames();
763
+
764
+ // Find frame by name
765
+ const frame = page.frames().find(f => f.name() === 'myframe');
766
+
767
+ // Find frame by URL
768
+ const frame = page.frames().find(f => f.url().includes('example.com'));
769
+
770
+ // Main frame
771
+ const mainFrame = page.mainFrame();
772
+
773
+ // Interact with frame
774
+ await frame.click('.button');
775
+ await frame.type('#input', 'text');
776
+ ```
777
+
778
+ ### Infinite Scroll
779
+
780
+ ```javascript
781
+ async function autoScroll(page) {
782
+ await page.evaluate(async () => {
783
+ await new Promise((resolve) => {
784
+ let totalHeight = 0;
785
+ const distance = 100;
786
+ const timer = setInterval(() => {
787
+ const scrollHeight = document.body.scrollHeight;
788
+ window.scrollBy(0, distance);
789
+ totalHeight += distance;
790
+
791
+ if (totalHeight >= scrollHeight) {
792
+ clearInterval(timer);
793
+ resolve();
794
+ }
795
+ }, 100);
796
+ });
797
+ });
798
+ }
799
+
800
+ await autoScroll(page);
801
+ ```
802
+
803
+ ### Cookies
804
+
805
+ ```javascript
806
+ // Get cookies
807
+ const cookies = await page.cookies();
808
+
809
+ // Set cookies
810
+ await page.setCookie({
811
+ name: 'session',
812
+ value: 'abc123',
813
+ domain: 'example.com',
814
+ path: '/',
815
+ httpOnly: true,
816
+ secure: true,
817
+ sameSite: 'Strict'
818
+ });
819
+
820
+ // Delete cookies
821
+ await page.deleteCookie({ name: 'session' });
822
+ ```
823
+
824
+ ### Local Storage
825
+
826
+ ```javascript
827
+ // Set localStorage
828
+ await page.evaluate(() => {
829
+ localStorage.setItem('key', 'value');
830
+ });
831
+
832
+ // Get localStorage
833
+ const value = await page.evaluate(() => {
834
+ return localStorage.getItem('key');
835
+ });
836
+
837
+ // Clear localStorage
838
+ await page.evaluate(() => localStorage.clear());
839
+ ```
840
+
841
+ ### Error Handling
842
+
843
+ ```javascript
844
+ try {
845
+ await page.goto('https://example.com', {
846
+ waitUntil: 'networkidle2',
847
+ timeout: 30000
848
+ });
849
+ } catch (error) {
850
+ if (error.name === 'TimeoutError') {
851
+ console.error('Page load timeout');
852
+ } else {
853
+ console.error('Navigation failed:', error);
854
+ }
855
+
856
+ // Take screenshot on error
857
+ await page.screenshot({ path: 'error.png' });
858
+ }
859
+ ```
860
+
861
+ ### Stealth Mode (Avoid Detection)
862
+
863
+ ```javascript
864
+ // Hide automation indicators
865
+ await page.evaluateOnNewDocument(() => {
866
+ // Override navigator.webdriver
867
+ Object.defineProperty(navigator, 'webdriver', {
868
+ get: () => false
869
+ });
870
+
871
+ // Mock chrome object
872
+ window.chrome = {
873
+ runtime: {}
874
+ };
875
+
876
+ // Mock permissions
877
+ const originalQuery = window.navigator.permissions.query;
878
+ window.navigator.permissions.query = (parameters) => (
879
+ parameters.name === 'notifications' ?
880
+ Promise.resolve({ state: 'granted' }) :
881
+ originalQuery(parameters)
882
+ );
883
+ });
884
+
885
+ // Set realistic user agent
886
+ await page.setUserAgent(
887
+ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
888
+ );
889
+ ```
890
+
891
+ ---
892
+
893
+ ## Debugging Tips
894
+
895
+ ### Take Screenshots on Error
896
+
897
+ ```javascript
898
+ page.on('pageerror', async (error) => {
899
+ console.error('Page error:', error);
900
+ await page.screenshot({ path: `error-${Date.now()}.png` });
901
+ });
902
+ ```
903
+
904
+ ### Console Logging
905
+
906
+ ```javascript
907
+ // Forward console to Node
908
+ page.on('console', (msg) => {
909
+ console.log('PAGE LOG:', msg.text());
910
+ });
911
+ ```
912
+
913
+ ### Slow Down Execution
914
+
915
+ ```javascript
916
+ const browser = await puppeteer.launch({
917
+ slowMo: 250 // 250ms delay between actions
918
+ });
919
+ ```
920
+
921
+ ### Keep Browser Open
922
+
923
+ ```javascript
924
+ const browser = await puppeteer.launch({
925
+ headless: false,
926
+ devtools: true
927
+ });
928
+
929
+ // Prevent auto-close
930
+ await page.evaluate(() => debugger);
931
+ ```
932
+
933
+ ---
934
+
935
+ ## Best Practices
936
+
937
+ 1. **Always close browser:** Use try/finally or process cleanup
938
+ 2. **Wait appropriately:** Use waitForSelector, not setTimeout
939
+ 3. **Handle errors:** Wrap navigation in try/catch
940
+ 4. **Optimize selectors:** Use specific selectors for reliability
941
+ 5. **Avoid race conditions:** Wait for navigation after clicks
942
+ 6. **Reuse pages:** Don't create new pages unnecessarily
943
+ 7. **Set timeouts:** Always specify reasonable timeouts
944
+ 8. **Clean up:** Close unused pages and contexts
945
+
946
+ ---
947
+
948
+ ## Resources
949
+
950
+ - [Puppeteer Documentation](https://pptr.dev/)
951
+ - [Puppeteer API](https://pptr.dev/api)
952
+ - [Puppeteer Examples](https://github.com/puppeteer/puppeteer/tree/main/examples)
953
+ - [Awesome Puppeteer](https://github.com/transitive-bullshit/awesome-puppeteer)