@vodailoc/kilo-kit-mcp 1.1.0 → 1.2.0

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 (582) hide show
  1. package/.mcp/kilo-kit.codex-windows.toml +5 -0
  2. package/LICENSE +190 -190
  3. package/QUICKSTART.md +265 -255
  4. package/README.md +321 -267
  5. package/mcp/README.md +64 -12
  6. package/mcp/dist/formatters.js +142 -1
  7. package/mcp/dist/orchestration-audit.js +20 -0
  8. package/mcp/dist/orchestration-memory.js +258 -0
  9. package/mcp/dist/orchestration-types.js +1 -0
  10. package/mcp/dist/orchestrator.js +222 -0
  11. package/mcp/dist/question-templates.js +249 -0
  12. package/mcp/dist/route-analytics.js +149 -0
  13. package/mcp/dist/router.js +75 -82
  14. package/mcp/dist/routing-policy-data.js +241 -0
  15. package/mcp/dist/routing-policy.js +145 -0
  16. package/mcp/dist/server.js +93 -4
  17. package/mcp/dist/smoke-env.js +18 -0
  18. package/mcp/dist/smoke.js +68 -1
  19. package/mcp/package.json +1 -2
  20. package/package.json +3 -2
  21. package/skills/README.md +647 -647
  22. package/skills/SKILLS_INDEX.md +139 -139
  23. package/skills/ai-media/ai-multimodal/.env.example +97 -97
  24. package/skills/ai-media/ai-multimodal/SKILL.md +357 -357
  25. package/skills/ai-media/ai-multimodal/references/audio-processing.md +373 -373
  26. package/skills/ai-media/ai-multimodal/references/image-generation.md +558 -558
  27. package/skills/ai-media/ai-multimodal/references/video-analysis.md +502 -502
  28. package/skills/ai-media/ai-multimodal/references/vision-understanding.md +483 -483
  29. package/skills/ai-media/ai-multimodal/scripts/document_converter.py +395 -395
  30. package/skills/ai-media/ai-multimodal/scripts/gemini_batch_process.py +480 -480
  31. package/skills/ai-media/ai-multimodal/scripts/media_optimizer.py +506 -506
  32. package/skills/ai-media/ai-multimodal/scripts/requirements.txt +26 -26
  33. package/skills/ai-media/ai-multimodal/scripts/tests/requirements.txt +20 -20
  34. package/skills/ai-media/ai-multimodal/scripts/tests/test_document_converter.py +299 -299
  35. package/skills/ai-media/ai-multimodal/scripts/tests/test_gemini_batch_process.py +362 -362
  36. package/skills/ai-media/ai-multimodal/scripts/tests/test_media_optimizer.py +373 -373
  37. package/skills/ai-media/media-processing/SKILL.md +358 -358
  38. package/skills/ai-media/media-processing/references/ffmpeg-encoding.md +358 -358
  39. package/skills/ai-media/media-processing/references/ffmpeg-filters.md +503 -503
  40. package/skills/ai-media/media-processing/references/ffmpeg-streaming.md +403 -403
  41. package/skills/ai-media/media-processing/references/format-compatibility.md +375 -375
  42. package/skills/ai-media/media-processing/references/imagemagick-batch.md +612 -612
  43. package/skills/ai-media/media-processing/references/imagemagick-editing.md +623 -623
  44. package/skills/ai-media/media-processing/scripts/batch_resize.py +342 -342
  45. package/skills/ai-media/media-processing/scripts/media_convert.py +311 -311
  46. package/skills/ai-media/media-processing/scripts/requirements.txt +24 -24
  47. package/skills/ai-media/media-processing/scripts/tests/requirements.txt +2 -2
  48. package/skills/ai-media/media-processing/scripts/tests/test_batch_resize.py +372 -372
  49. package/skills/ai-media/media-processing/scripts/tests/test_media_convert.py +259 -259
  50. package/skills/ai-media/media-processing/scripts/tests/test_video_optimize.py +397 -397
  51. package/skills/ai-media/media-processing/scripts/video_optimize.py +414 -414
  52. package/skills/ai-media/screenshot/LICENSE.txt +201 -201
  53. package/skills/ai-media/screenshot/SKILL.md +267 -267
  54. package/skills/ai-media/screenshot/agents/openai.yaml +6 -6
  55. package/skills/ai-media/screenshot/assets/screenshot-small.svg +5 -5
  56. package/skills/ai-media/screenshot/scripts/ensure_macos_permissions.sh +54 -54
  57. package/skills/ai-media/screenshot/scripts/macos_display_info.swift +22 -22
  58. package/skills/ai-media/screenshot/scripts/macos_permissions.swift +40 -40
  59. package/skills/ai-media/screenshot/scripts/macos_window_info.swift +126 -126
  60. package/skills/ai-media/screenshot/scripts/take_screenshot.ps1 +163 -163
  61. package/skills/ai-media/screenshot/scripts/take_screenshot.py +585 -585
  62. package/skills/ai-media/sora/LICENSE.txt +201 -201
  63. package/skills/ai-media/sora/SKILL.md +153 -153
  64. package/skills/ai-media/sora/agents/openai.yaml +6 -6
  65. package/skills/ai-media/sora/assets/sora-small.svg +4 -4
  66. package/skills/ai-media/sora/references/cinematic-shots.md +53 -53
  67. package/skills/ai-media/sora/references/cli.md +248 -248
  68. package/skills/ai-media/sora/references/codex-network.md +28 -28
  69. package/skills/ai-media/sora/references/prompting.md +137 -137
  70. package/skills/ai-media/sora/references/sample-prompts.md +95 -95
  71. package/skills/ai-media/sora/references/social-ads.md +42 -42
  72. package/skills/ai-media/sora/references/troubleshooting.md +58 -58
  73. package/skills/ai-media/sora/references/video-api.md +45 -45
  74. package/skills/ai-media/sora/scripts/sora.py +970 -970
  75. package/skills/design/aesthetic/SKILL.md +121 -121
  76. package/skills/design/aesthetic/assets/design-guideline-template.md +163 -163
  77. package/skills/design/aesthetic/assets/design-story-template.md +135 -135
  78. package/skills/design/aesthetic/references/design-principles.md +62 -62
  79. package/skills/design/aesthetic/references/design-resources.md +75 -75
  80. package/skills/design/aesthetic/references/micro-interactions.md +53 -53
  81. package/skills/design/aesthetic/references/storytelling-design.md +50 -50
  82. package/skills/design/figma/LICENSE.txt +202 -202
  83. package/skills/design/figma/SKILL.md +42 -42
  84. package/skills/design/figma/agents/openai.yaml +14 -14
  85. package/skills/design/figma/assets/figma-small.svg +3 -3
  86. package/skills/design/figma/assets/icon.svg +28 -28
  87. package/skills/design/figma/references/figma-mcp-config.md +35 -35
  88. package/skills/design/figma/references/figma-tools-and-prompts.md +34 -34
  89. package/skills/design/figma-implement-design/LICENSE.txt +202 -202
  90. package/skills/design/figma-implement-design/SKILL.md +264 -264
  91. package/skills/design/figma-implement-design/agents/openai.yaml +14 -14
  92. package/skills/design/figma-implement-design/assets/figma-small.svg +3 -3
  93. package/skills/design/figma-implement-design/assets/icon.svg +28 -28
  94. package/skills/design/frontend-design/SKILL.md +41 -41
  95. package/skills/design/frontend-design/references/animejs.md +395 -395
  96. package/skills/design/ui-styling/LICENSE.txt +201 -201
  97. package/skills/design/ui-styling/SKILL.md +321 -321
  98. package/skills/design/ui-styling/canvas-fonts/ArsenalSC-OFL.txt +93 -93
  99. package/skills/design/ui-styling/canvas-fonts/BigShoulders-OFL.txt +93 -93
  100. package/skills/design/ui-styling/canvas-fonts/Boldonse-OFL.txt +93 -93
  101. package/skills/design/ui-styling/canvas-fonts/BricolageGrotesque-OFL.txt +93 -93
  102. package/skills/design/ui-styling/canvas-fonts/CrimsonPro-OFL.txt +93 -93
  103. package/skills/design/ui-styling/canvas-fonts/DMMono-OFL.txt +93 -93
  104. package/skills/design/ui-styling/canvas-fonts/EricaOne-OFL.txt +94 -94
  105. package/skills/design/ui-styling/canvas-fonts/GeistMono-OFL.txt +93 -93
  106. package/skills/design/ui-styling/canvas-fonts/Gloock-OFL.txt +93 -93
  107. package/skills/design/ui-styling/canvas-fonts/IBMPlexMono-OFL.txt +93 -93
  108. package/skills/design/ui-styling/canvas-fonts/InstrumentSans-OFL.txt +93 -93
  109. package/skills/design/ui-styling/canvas-fonts/Italiana-OFL.txt +93 -93
  110. package/skills/design/ui-styling/canvas-fonts/JetBrainsMono-OFL.txt +93 -93
  111. package/skills/design/ui-styling/canvas-fonts/Jura-OFL.txt +93 -93
  112. package/skills/design/ui-styling/canvas-fonts/LibreBaskerville-OFL.txt +93 -93
  113. package/skills/design/ui-styling/canvas-fonts/Lora-OFL.txt +93 -93
  114. package/skills/design/ui-styling/canvas-fonts/NationalPark-OFL.txt +93 -93
  115. package/skills/design/ui-styling/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -93
  116. package/skills/design/ui-styling/canvas-fonts/Outfit-OFL.txt +93 -93
  117. package/skills/design/ui-styling/canvas-fonts/PixelifySans-OFL.txt +93 -93
  118. package/skills/design/ui-styling/canvas-fonts/PoiretOne-OFL.txt +93 -93
  119. package/skills/design/ui-styling/canvas-fonts/RedHatMono-OFL.txt +93 -93
  120. package/skills/design/ui-styling/canvas-fonts/Silkscreen-OFL.txt +93 -93
  121. package/skills/design/ui-styling/canvas-fonts/SmoochSans-OFL.txt +93 -93
  122. package/skills/design/ui-styling/canvas-fonts/Tektur-OFL.txt +93 -93
  123. package/skills/design/ui-styling/canvas-fonts/WorkSans-OFL.txt +93 -93
  124. package/skills/design/ui-styling/canvas-fonts/YoungSerif-OFL.txt +93 -93
  125. package/skills/design/ui-styling/references/canvas-design-system.md +320 -320
  126. package/skills/design/ui-styling/references/shadcn-accessibility.md +471 -471
  127. package/skills/design/ui-styling/references/shadcn-components.md +424 -424
  128. package/skills/design/ui-styling/references/shadcn-theming.md +373 -373
  129. package/skills/design/ui-styling/references/tailwind-customization.md +483 -483
  130. package/skills/design/ui-styling/references/tailwind-responsive.md +382 -382
  131. package/skills/design/ui-styling/references/tailwind-utilities.md +455 -455
  132. package/skills/design/ui-styling/scripts/requirements.txt +17 -17
  133. package/skills/design/ui-styling/scripts/shadcn_add.py +292 -292
  134. package/skills/design/ui-styling/scripts/tailwind_config_gen.py +456 -456
  135. package/skills/design/ui-styling/scripts/tests/requirements.txt +3 -3
  136. package/skills/design/ui-styling/scripts/tests/test_shadcn_add.py +266 -266
  137. package/skills/design/ui-styling/scripts/tests/test_tailwind_config_gen.py +336 -336
  138. package/skills/engineering/aspnet-core/LICENSE.txt +201 -201
  139. package/skills/engineering/aspnet-core/SKILL.md +61 -61
  140. package/skills/engineering/aspnet-core/agents/openai.yaml +5 -5
  141. package/skills/engineering/aspnet-core/references/_sections.md +40 -40
  142. package/skills/engineering/aspnet-core/references/apis-minimal-and-controllers.md +81 -81
  143. package/skills/engineering/aspnet-core/references/data-state-and-services.md +69 -69
  144. package/skills/engineering/aspnet-core/references/program-and-pipeline.md +103 -103
  145. package/skills/engineering/aspnet-core/references/realtime-grpc-and-background-work.md +58 -58
  146. package/skills/engineering/aspnet-core/references/security-and-identity.md +75 -75
  147. package/skills/engineering/aspnet-core/references/source-map.md +43 -43
  148. package/skills/engineering/aspnet-core/references/stack-selection.md +63 -63
  149. package/skills/engineering/aspnet-core/references/testing-performance-and-operations.md +92 -92
  150. package/skills/engineering/aspnet-core/references/ui-blazor.md +53 -53
  151. package/skills/engineering/aspnet-core/references/ui-mvc.md +56 -56
  152. package/skills/engineering/aspnet-core/references/ui-razor-pages.md +55 -55
  153. package/skills/engineering/aspnet-core/references/versioning-and-upgrades.md +51 -51
  154. package/skills/engineering/backend-development/SKILL.md +95 -95
  155. package/skills/engineering/backend-development/references/backend-api-design.md +495 -495
  156. package/skills/engineering/backend-development/references/backend-architecture.md +454 -454
  157. package/skills/engineering/backend-development/references/backend-authentication.md +338 -338
  158. package/skills/engineering/backend-development/references/backend-code-quality.md +659 -659
  159. package/skills/engineering/backend-development/references/backend-debugging.md +904 -904
  160. package/skills/engineering/backend-development/references/backend-devops.md +494 -494
  161. package/skills/engineering/backend-development/references/backend-mindset.md +387 -387
  162. package/skills/engineering/backend-development/references/backend-performance.md +397 -397
  163. package/skills/engineering/backend-development/references/backend-security.md +290 -290
  164. package/skills/engineering/backend-development/references/backend-technologies.md +256 -256
  165. package/skills/engineering/backend-development/references/backend-testing.md +429 -429
  166. package/skills/engineering/better-auth/SKILL.md +204 -204
  167. package/skills/engineering/better-auth/references/advanced-features.md +553 -553
  168. package/skills/engineering/better-auth/references/database-integration.md +577 -577
  169. package/skills/engineering/better-auth/references/email-password-auth.md +416 -416
  170. package/skills/engineering/better-auth/references/oauth-providers.md +430 -430
  171. package/skills/engineering/better-auth/scripts/better_auth_init.py +521 -521
  172. package/skills/engineering/better-auth/scripts/requirements.txt +15 -15
  173. package/skills/engineering/better-auth/scripts/tests/test_better_auth_init.py +421 -421
  174. package/skills/engineering/code-review/SKILL.md +140 -140
  175. package/skills/engineering/code-review/references/code-review-reception.md +208 -208
  176. package/skills/engineering/code-review/references/requesting-code-review.md +104 -104
  177. package/skills/engineering/code-review/references/verification-before-completion.md +138 -138
  178. package/skills/engineering/context-engineering/SKILL.md +86 -86
  179. package/skills/engineering/context-engineering/references/context-compression.md +84 -84
  180. package/skills/engineering/context-engineering/references/context-degradation.md +93 -93
  181. package/skills/engineering/context-engineering/references/context-fundamentals.md +75 -75
  182. package/skills/engineering/context-engineering/references/context-optimization.md +82 -82
  183. package/skills/engineering/context-engineering/references/evaluation.md +89 -89
  184. package/skills/engineering/context-engineering/references/memory-systems.md +88 -88
  185. package/skills/engineering/context-engineering/references/multi-agent-patterns.md +90 -90
  186. package/skills/engineering/context-engineering/references/project-development.md +97 -97
  187. package/skills/engineering/context-engineering/references/tool-design.md +86 -86
  188. package/skills/engineering/context-engineering/scripts/compression_evaluator.py +329 -329
  189. package/skills/engineering/context-engineering/scripts/context_analyzer.py +294 -294
  190. package/skills/engineering/databases/SKILL.md +232 -232
  191. package/skills/engineering/databases/references/mongodb-aggregation.md +447 -447
  192. package/skills/engineering/databases/references/mongodb-atlas.md +465 -465
  193. package/skills/engineering/databases/references/mongodb-crud.md +408 -408
  194. package/skills/engineering/databases/references/mongodb-indexing.md +442 -442
  195. package/skills/engineering/databases/references/postgresql-administration.md +594 -594
  196. package/skills/engineering/databases/references/postgresql-performance.md +527 -527
  197. package/skills/engineering/databases/references/postgresql-psql-cli.md +467 -467
  198. package/skills/engineering/databases/references/postgresql-queries.md +475 -475
  199. package/skills/engineering/databases/scripts/db_backup.py +502 -502
  200. package/skills/engineering/databases/scripts/db_migrate.py +414 -414
  201. package/skills/engineering/databases/scripts/db_performance_check.py +444 -444
  202. package/skills/engineering/databases/scripts/requirements.txt +20 -20
  203. package/skills/engineering/databases/scripts/tests/requirements.txt +4 -4
  204. package/skills/engineering/databases/scripts/tests/test_db_backup.py +340 -340
  205. package/skills/engineering/databases/scripts/tests/test_db_migrate.py +277 -277
  206. package/skills/engineering/databases/scripts/tests/test_db_performance_check.py +370 -370
  207. package/skills/engineering/diagnose/SKILL.md +117 -117
  208. package/skills/engineering/diagnose/scripts/hitl-loop.template.sh +41 -41
  209. package/skills/engineering/docs-seeker/SKILL.md +207 -207
  210. package/skills/engineering/docs-seeker/WORKFLOWS.md +505 -505
  211. package/skills/engineering/docs-seeker/references/best-practices.md +632 -632
  212. package/skills/engineering/docs-seeker/references/documentation-sources.md +461 -461
  213. package/skills/engineering/docs-seeker/references/error-handling.md +621 -621
  214. package/skills/engineering/docs-seeker/references/limitations.md +821 -821
  215. package/skills/engineering/docs-seeker/references/performance.md +574 -574
  216. package/skills/engineering/docs-seeker/references/tool-selection.md +262 -262
  217. package/skills/engineering/frontend-development/SKILL.md +398 -398
  218. package/skills/engineering/frontend-development/resources/common-patterns.md +330 -330
  219. package/skills/engineering/frontend-development/resources/complete-examples.md +871 -871
  220. package/skills/engineering/frontend-development/resources/component-patterns.md +501 -501
  221. package/skills/engineering/frontend-development/resources/data-fetching.md +766 -766
  222. package/skills/engineering/frontend-development/resources/file-organization.md +501 -501
  223. package/skills/engineering/frontend-development/resources/loading-and-error-states.md +500 -500
  224. package/skills/engineering/frontend-development/resources/performance.md +405 -405
  225. package/skills/engineering/frontend-development/resources/routing-guide.md +363 -363
  226. package/skills/engineering/frontend-development/resources/styling-guide.md +427 -427
  227. package/skills/engineering/frontend-development/resources/typescript-standards.md +417 -417
  228. package/skills/engineering/improve-codebase-architecture/DEEPENING.md +37 -37
  229. package/skills/engineering/improve-codebase-architecture/INTERFACE-DESIGN.md +44 -44
  230. package/skills/engineering/improve-codebase-architecture/LANGUAGE.md +53 -53
  231. package/skills/engineering/improve-codebase-architecture/SKILL.md +71 -71
  232. package/skills/engineering/openai-docs/LICENSE.txt +201 -201
  233. package/skills/engineering/openai-docs/SKILL.md +69 -69
  234. package/skills/engineering/openai-docs/agents/openai.yaml +14 -14
  235. package/skills/engineering/openai-docs/assets/openai-small.svg +3 -3
  236. package/skills/engineering/openai-docs/references/gpt-5p4-prompting-guide.md +433 -433
  237. package/skills/engineering/openai-docs/references/latest-model.md +35 -35
  238. package/skills/engineering/openai-docs/references/upgrading-to-gpt-5p4.md +164 -164
  239. package/skills/engineering/playwright/LICENSE.txt +201 -201
  240. package/skills/engineering/playwright/NOTICE.txt +14 -14
  241. package/skills/engineering/playwright/SKILL.md +147 -147
  242. package/skills/engineering/playwright/agents/openai.yaml +6 -6
  243. package/skills/engineering/playwright/assets/playwright-small.svg +3 -3
  244. package/skills/engineering/playwright/references/cli.md +116 -116
  245. package/skills/engineering/playwright/references/workflows.md +95 -95
  246. package/skills/engineering/playwright/scripts/playwright_cli.sh +25 -25
  247. package/skills/engineering/playwright-interactive/LICENSE.txt +201 -201
  248. package/skills/engineering/playwright-interactive/NOTICE.txt +13 -13
  249. package/skills/engineering/playwright-interactive/SKILL.md +689 -689
  250. package/skills/engineering/playwright-interactive/agents/openai.yaml +6 -6
  251. package/skills/engineering/playwright-interactive/assets/playwright-small.svg +3 -3
  252. package/skills/engineering/render-deploy/LICENSE.txt +201 -201
  253. package/skills/engineering/render-deploy/SKILL.md +479 -479
  254. package/skills/engineering/render-deploy/agents/openai.yaml +14 -14
  255. package/skills/engineering/render-deploy/assets/docker.yaml +62 -62
  256. package/skills/engineering/render-deploy/assets/go-api.yaml +35 -35
  257. package/skills/engineering/render-deploy/assets/nextjs-postgres.yaml +35 -35
  258. package/skills/engineering/render-deploy/assets/node-express.yaml +25 -25
  259. package/skills/engineering/render-deploy/assets/python-django.yaml +89 -89
  260. package/skills/engineering/render-deploy/assets/render-small.svg +3 -3
  261. package/skills/engineering/render-deploy/assets/static-site.yaml +54 -54
  262. package/skills/engineering/render-deploy/references/blueprint-spec.md +718 -718
  263. package/skills/engineering/render-deploy/references/codebase-analysis.md +49 -49
  264. package/skills/engineering/render-deploy/references/configuration-guide.md +603 -603
  265. package/skills/engineering/render-deploy/references/deployment-details.md +224 -224
  266. package/skills/engineering/render-deploy/references/direct-creation.md +113 -113
  267. package/skills/engineering/render-deploy/references/error-patterns.md +13 -13
  268. package/skills/engineering/render-deploy/references/post-deploy-checks.md +36 -36
  269. package/skills/engineering/render-deploy/references/runtimes.md +473 -473
  270. package/skills/engineering/render-deploy/references/service-types.md +450 -450
  271. package/skills/engineering/render-deploy/references/troubleshooting-basics.md +36 -36
  272. package/skills/engineering/repomix/SKILL.md +215 -215
  273. package/skills/engineering/repomix/references/configuration.md +211 -211
  274. package/skills/engineering/repomix/references/usage-patterns.md +232 -232
  275. package/skills/engineering/repomix/scripts/README.md +179 -179
  276. package/skills/engineering/repomix/scripts/repomix_batch.py +455 -455
  277. package/skills/engineering/repomix/scripts/repos.example.json +15 -15
  278. package/skills/engineering/repomix/scripts/requirements.txt +15 -15
  279. package/skills/engineering/repomix/scripts/tests/test_repomix_batch.py +531 -531
  280. package/skills/engineering/setup-matt-pocock-skills/SKILL.md +121 -121
  281. package/skills/engineering/setup-matt-pocock-skills/domain.md +51 -51
  282. package/skills/engineering/setup-matt-pocock-skills/issue-tracker-github.md +22 -22
  283. package/skills/engineering/setup-matt-pocock-skills/issue-tracker-gitlab.md +23 -23
  284. package/skills/engineering/setup-matt-pocock-skills/issue-tracker-local.md +19 -19
  285. package/skills/engineering/setup-matt-pocock-skills/triage-labels.md +15 -15
  286. package/skills/engineering/shopify/README.md +66 -66
  287. package/skills/engineering/shopify/SKILL.md +319 -319
  288. package/skills/engineering/shopify/references/app-development.md +470 -470
  289. package/skills/engineering/shopify/references/extensions.md +493 -493
  290. package/skills/engineering/shopify/references/themes.md +498 -498
  291. package/skills/engineering/shopify/scripts/requirements.txt +19 -19
  292. package/skills/engineering/shopify/scripts/shopify_init.py +423 -423
  293. package/skills/engineering/shopify/scripts/tests/test_shopify_init.py +385 -385
  294. package/skills/engineering/tdd/SKILL.md +109 -109
  295. package/skills/engineering/tdd/deep-modules.md +33 -33
  296. package/skills/engineering/tdd/interface-design.md +31 -31
  297. package/skills/engineering/tdd/mocking.md +59 -59
  298. package/skills/engineering/tdd/refactoring.md +10 -10
  299. package/skills/engineering/tdd/tests.md +61 -61
  300. package/skills/engineering/to-issues/SKILL.md +81 -81
  301. package/skills/engineering/to-prd/SKILL.md +74 -74
  302. package/skills/engineering/triage/AGENT-BRIEF.md +168 -168
  303. package/skills/engineering/triage/OUT-OF-SCOPE.md +101 -101
  304. package/skills/engineering/triage/SKILL.md +103 -103
  305. package/skills/engineering/web-frameworks/SKILL.md +324 -324
  306. package/skills/engineering/web-frameworks/references/nextjs-app-router.md +465 -465
  307. package/skills/engineering/web-frameworks/references/nextjs-data-fetching.md +459 -459
  308. package/skills/engineering/web-frameworks/references/nextjs-optimization.md +511 -511
  309. package/skills/engineering/web-frameworks/references/nextjs-server-components.md +495 -495
  310. package/skills/engineering/web-frameworks/references/remix-icon-integration.md +603 -603
  311. package/skills/engineering/web-frameworks/references/turborepo-caching.md +551 -551
  312. package/skills/engineering/web-frameworks/references/turborepo-pipelines.md +517 -517
  313. package/skills/engineering/web-frameworks/references/turborepo-setup.md +542 -542
  314. package/skills/engineering/web-frameworks/scripts/nextjs_init.py +547 -547
  315. package/skills/engineering/web-frameworks/scripts/requirements.txt +16 -16
  316. package/skills/engineering/web-frameworks/scripts/tests/requirements.txt +3 -3
  317. package/skills/engineering/web-frameworks/scripts/tests/test_nextjs_init.py +319 -319
  318. package/skills/engineering/web-frameworks/scripts/tests/test_turborepo_migrate.py +374 -374
  319. package/skills/engineering/web-frameworks/scripts/turborepo_migrate.py +394 -394
  320. package/skills/engineering/write-a-skill/SKILL.md +117 -117
  321. package/skills/kilo-kit/SKILL.md +346 -346
  322. package/skills/kilo-kit/_template/SKILL.md +185 -185
  323. package/skills/kilo-kit/debugging/root-cause/SKILL.md +360 -360
  324. package/skills/kilo-kit/debugging/systematic/SKILL.md +339 -339
  325. package/skills/kilo-kit/debugging/verification/SKILL.md +424 -424
  326. package/skills/kilo-kit/development/backend/SKILL.md +540 -540
  327. package/skills/kilo-kit/development/security/SKILL.md +529 -529
  328. package/skills/kilo-kit/quality/code-review/SKILL.md +297 -297
  329. package/skills/kilo-kit/quality/testing/SKILL.md +540 -540
  330. package/skills/kilo-kit/references/output-formats.md +204 -204
  331. package/skills/kilo-kit/references/patterns.md +156 -156
  332. package/skills/kilo-kit/references/performance-benchmarks.md +90 -90
  333. package/skills/operations/chrome-devtools/SKILL.md +392 -392
  334. package/skills/operations/chrome-devtools/references/cdp-domains.md +694 -694
  335. package/skills/operations/chrome-devtools/references/performance-guide.md +940 -940
  336. package/skills/operations/chrome-devtools/references/puppeteer-reference.md +953 -953
  337. package/skills/operations/chrome-devtools/scripts/PERSISTENT-BROWSER.md +107 -107
  338. package/skills/operations/chrome-devtools/scripts/README.md +213 -213
  339. package/skills/operations/chrome-devtools/scripts/__tests__/selector.test.js +210 -210
  340. package/skills/operations/chrome-devtools/scripts/click.js +79 -79
  341. package/skills/operations/chrome-devtools/scripts/close-persistent.js +36 -36
  342. package/skills/operations/chrome-devtools/scripts/console.js +75 -75
  343. package/skills/operations/chrome-devtools/scripts/evaluate.js +49 -49
  344. package/skills/operations/chrome-devtools/scripts/fill.js +72 -72
  345. package/skills/operations/chrome-devtools/scripts/install-deps.sh +181 -181
  346. package/skills/operations/chrome-devtools/scripts/install.sh +83 -83
  347. package/skills/operations/chrome-devtools/scripts/launch-persistent.js +71 -71
  348. package/skills/operations/chrome-devtools/scripts/lib/browser.js +144 -144
  349. package/skills/operations/chrome-devtools/scripts/lib/selector.js +178 -178
  350. package/skills/operations/chrome-devtools/scripts/navigate.js +46 -46
  351. package/skills/operations/chrome-devtools/scripts/network.js +102 -102
  352. package/skills/operations/chrome-devtools/scripts/package-lock.json +1206 -1206
  353. package/skills/operations/chrome-devtools/scripts/package.json +15 -15
  354. package/skills/operations/chrome-devtools/scripts/performance.js +145 -145
  355. package/skills/operations/chrome-devtools/scripts/screenshot.js +180 -180
  356. package/skills/operations/chrome-devtools/scripts/snapshot.js +131 -131
  357. package/skills/operations/devops/.env.example +76 -76
  358. package/skills/operations/devops/SKILL.md +285 -285
  359. package/skills/operations/devops/references/browser-rendering.md +305 -305
  360. package/skills/operations/devops/references/cloudflare-d1-kv.md +123 -123
  361. package/skills/operations/devops/references/cloudflare-platform.md +271 -271
  362. package/skills/operations/devops/references/cloudflare-r2-storage.md +280 -280
  363. package/skills/operations/devops/references/cloudflare-workers-advanced.md +312 -312
  364. package/skills/operations/devops/references/cloudflare-workers-apis.md +309 -309
  365. package/skills/operations/devops/references/cloudflare-workers-basics.md +418 -418
  366. package/skills/operations/devops/references/docker-basics.md +297 -297
  367. package/skills/operations/devops/references/docker-compose.md +292 -292
  368. package/skills/operations/devops/references/gcloud-platform.md +297 -297
  369. package/skills/operations/devops/references/gcloud-services.md +304 -304
  370. package/skills/operations/devops/scripts/cloudflare_deploy.py +269 -269
  371. package/skills/operations/devops/scripts/docker_optimize.py +320 -320
  372. package/skills/operations/devops/scripts/requirements.txt +20 -20
  373. package/skills/operations/devops/scripts/tests/requirements.txt +3 -3
  374. package/skills/operations/devops/scripts/tests/test_cloudflare_deploy.py +285 -285
  375. package/skills/operations/devops/scripts/tests/test_docker_optimize.py +436 -436
  376. package/skills/operations/mcp-builder/LICENSE.txt +201 -201
  377. package/skills/operations/mcp-builder/SKILL.md +328 -328
  378. package/skills/operations/mcp-builder/reference/evaluation.md +601 -601
  379. package/skills/operations/mcp-builder/reference/mcp_best_practices.md +915 -915
  380. package/skills/operations/mcp-builder/reference/node_mcp_server.md +915 -915
  381. package/skills/operations/mcp-builder/reference/python_mcp_server.md +751 -751
  382. package/skills/operations/mcp-builder/scripts/connections.py +151 -151
  383. package/skills/operations/mcp-builder/scripts/evaluation.py +373 -373
  384. package/skills/operations/mcp-builder/scripts/example_evaluation.xml +22 -22
  385. package/skills/operations/mcp-builder/scripts/requirements.txt +2 -2
  386. package/skills/operations/mcp-management/README.md +219 -219
  387. package/skills/operations/mcp-management/SKILL.md +175 -175
  388. package/skills/operations/mcp-management/assets/tools.json +3043 -3043
  389. package/skills/operations/mcp-management/references/configuration.md +114 -114
  390. package/skills/operations/mcp-management/references/gemini-cli-integration.md +201 -201
  391. package/skills/operations/mcp-management/references/mcp-protocol.md +116 -116
  392. package/skills/operations/mcp-management/scripts/.env.example +10 -10
  393. package/skills/operations/mcp-management/scripts/cli.ts +155 -155
  394. package/skills/operations/mcp-management/scripts/dist/analyze-tools.js +70 -70
  395. package/skills/operations/mcp-management/scripts/dist/cli.js +131 -131
  396. package/skills/operations/mcp-management/scripts/dist/mcp-client.js +115 -115
  397. package/skills/operations/mcp-management/scripts/mcp-client.ts +163 -163
  398. package/skills/operations/mcp-management/scripts/package.json +18 -18
  399. package/skills/operations/mcp-management/scripts/tsconfig.json +15 -15
  400. package/skills/problem-solving/collision-zone-thinking/SKILL.md +62 -62
  401. package/skills/problem-solving/defense-in-depth/SKILL.md +130 -130
  402. package/skills/problem-solving/inversion-exercise/SKILL.md +58 -58
  403. package/skills/problem-solving/meta-pattern-recognition/SKILL.md +54 -54
  404. package/skills/problem-solving/root-cause-tracing/SKILL.md +177 -177
  405. package/skills/problem-solving/root-cause-tracing/find-polluter.sh +63 -63
  406. package/skills/problem-solving/scale-game/SKILL.md +63 -63
  407. package/skills/problem-solving/sequential-thinking/README.md +118 -118
  408. package/skills/problem-solving/sequential-thinking/SKILL.md +93 -93
  409. package/skills/problem-solving/sequential-thinking/references/advanced.md +122 -122
  410. package/skills/problem-solving/sequential-thinking/references/examples.md +274 -274
  411. package/skills/problem-solving/simplification-cascades/SKILL.md +76 -76
  412. package/skills/problem-solving/when-stuck/SKILL.md +88 -88
  413. package/skills/productivity/caveman/SKILL.md +49 -49
  414. package/skills/productivity/grill-me/SKILL.md +10 -10
  415. package/skills/productivity/grill-with-docs/ADR-FORMAT.md +47 -47
  416. package/skills/productivity/grill-with-docs/CONTEXT-FORMAT.md +77 -77
  417. package/skills/productivity/grill-with-docs/SKILL.md +88 -88
  418. package/skills/productivity/writing-skills/graphviz-conventions.dot +171 -171
  419. package/skills/productivity/zoom-out/SKILL.md +7 -7
  420. package/skills/writing-docs/doc/LICENSE.txt +201 -201
  421. package/skills/writing-docs/doc/SKILL.md +80 -80
  422. package/skills/writing-docs/doc/agents/openai.yaml +6 -6
  423. package/skills/writing-docs/doc/assets/doc-small.svg +3 -3
  424. package/skills/writing-docs/doc/scripts/render_docx.py +296 -296
  425. package/skills/writing-docs/docx/LICENSE.txt +30 -30
  426. package/skills/writing-docs/docx/SKILL.md +196 -196
  427. package/skills/writing-docs/docx/docx-js.md +349 -349
  428. package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -1499
  429. package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -146
  430. package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -1085
  431. package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -11
  432. package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -3081
  433. package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -23
  434. package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -185
  435. package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -287
  436. package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -1676
  437. package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -28
  438. package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -144
  439. package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -174
  440. package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -25
  441. package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -18
  442. package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -59
  443. package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -56
  444. package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -195
  445. package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -582
  446. package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -25
  447. package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -4439
  448. package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -570
  449. package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -509
  450. package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -12
  451. package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -108
  452. package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -96
  453. package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -3646
  454. package/skills/writing-docs/docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -116
  455. package/skills/writing-docs/docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -42
  456. package/skills/writing-docs/docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -50
  457. package/skills/writing-docs/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -49
  458. package/skills/writing-docs/docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -33
  459. package/skills/writing-docs/docx/ooxml/schemas/mce/mc.xsd +75 -75
  460. package/skills/writing-docs/docx/ooxml/schemas/microsoft/wml-2010.xsd +560 -560
  461. package/skills/writing-docs/docx/ooxml/schemas/microsoft/wml-2012.xsd +67 -67
  462. package/skills/writing-docs/docx/ooxml/schemas/microsoft/wml-2018.xsd +14 -14
  463. package/skills/writing-docs/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -20
  464. package/skills/writing-docs/docx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -13
  465. package/skills/writing-docs/docx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -4
  466. package/skills/writing-docs/docx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -8
  467. package/skills/writing-docs/docx/ooxml/scripts/pack.py +159 -159
  468. package/skills/writing-docs/docx/ooxml/scripts/unpack.py +29 -29
  469. package/skills/writing-docs/docx/ooxml/scripts/validate.py +69 -69
  470. package/skills/writing-docs/docx/ooxml/scripts/validation/__init__.py +15 -15
  471. package/skills/writing-docs/docx/ooxml/scripts/validation/base.py +951 -951
  472. package/skills/writing-docs/docx/ooxml/scripts/validation/docx.py +274 -274
  473. package/skills/writing-docs/docx/ooxml/scripts/validation/pptx.py +315 -315
  474. package/skills/writing-docs/docx/ooxml/scripts/validation/redlining.py +279 -279
  475. package/skills/writing-docs/docx/ooxml.md +609 -609
  476. package/skills/writing-docs/docx/scripts/__init__.py +1 -1
  477. package/skills/writing-docs/docx/scripts/document.py +1276 -1276
  478. package/skills/writing-docs/docx/scripts/templates/comments.xml +2 -2
  479. package/skills/writing-docs/docx/scripts/templates/commentsExtended.xml +2 -2
  480. package/skills/writing-docs/docx/scripts/templates/commentsExtensible.xml +2 -2
  481. package/skills/writing-docs/docx/scripts/templates/commentsIds.xml +2 -2
  482. package/skills/writing-docs/docx/scripts/templates/people.xml +2 -2
  483. package/skills/writing-docs/docx/scripts/utilities.py +374 -374
  484. package/skills/writing-docs/mermaidjs-v11/SKILL.md +115 -115
  485. package/skills/writing-docs/mermaidjs-v11/references/cli-usage.md +228 -228
  486. package/skills/writing-docs/mermaidjs-v11/references/configuration.md +232 -232
  487. package/skills/writing-docs/mermaidjs-v11/references/diagram-types.md +315 -315
  488. package/skills/writing-docs/mermaidjs-v11/references/examples.md +344 -344
  489. package/skills/writing-docs/mermaidjs-v11/references/integration.md +310 -310
  490. package/skills/writing-docs/pdf/LICENSE.txt +30 -30
  491. package/skills/writing-docs/pdf/SKILL.md +294 -294
  492. package/skills/writing-docs/pdf/forms.md +205 -205
  493. package/skills/writing-docs/pdf/reference.md +611 -611
  494. package/skills/writing-docs/pdf/scripts/check_bounding_boxes.py +70 -70
  495. package/skills/writing-docs/pdf/scripts/check_bounding_boxes_test.py +226 -226
  496. package/skills/writing-docs/pdf/scripts/check_fillable_fields.py +12 -12
  497. package/skills/writing-docs/pdf/scripts/convert_pdf_to_images.py +35 -35
  498. package/skills/writing-docs/pdf/scripts/create_validation_image.py +41 -41
  499. package/skills/writing-docs/pdf/scripts/extract_form_field_info.py +152 -152
  500. package/skills/writing-docs/pdf/scripts/fill_fillable_fields.py +114 -114
  501. package/skills/writing-docs/pdf/scripts/fill_pdf_form_with_annotations.py +107 -107
  502. package/skills/writing-docs/pptx/LICENSE.txt +30 -30
  503. package/skills/writing-docs/pptx/SKILL.md +483 -483
  504. package/skills/writing-docs/pptx/html2pptx.md +624 -624
  505. package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -1499
  506. package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -146
  507. package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -1085
  508. package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -11
  509. package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -3081
  510. package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -23
  511. package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -185
  512. package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -287
  513. package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -1676
  514. package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -28
  515. package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -144
  516. package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -174
  517. package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -25
  518. package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -18
  519. package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -59
  520. package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -56
  521. package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -195
  522. package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -582
  523. package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -25
  524. package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -4439
  525. package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -570
  526. package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -509
  527. package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -12
  528. package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -108
  529. package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -96
  530. package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -3646
  531. package/skills/writing-docs/pptx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -116
  532. package/skills/writing-docs/pptx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -42
  533. package/skills/writing-docs/pptx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -50
  534. package/skills/writing-docs/pptx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -49
  535. package/skills/writing-docs/pptx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -33
  536. package/skills/writing-docs/pptx/ooxml/schemas/mce/mc.xsd +75 -75
  537. package/skills/writing-docs/pptx/ooxml/schemas/microsoft/wml-2010.xsd +560 -560
  538. package/skills/writing-docs/pptx/ooxml/schemas/microsoft/wml-2012.xsd +67 -67
  539. package/skills/writing-docs/pptx/ooxml/schemas/microsoft/wml-2018.xsd +14 -14
  540. package/skills/writing-docs/pptx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -20
  541. package/skills/writing-docs/pptx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -13
  542. package/skills/writing-docs/pptx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -4
  543. package/skills/writing-docs/pptx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -8
  544. package/skills/writing-docs/pptx/ooxml/scripts/pack.py +159 -159
  545. package/skills/writing-docs/pptx/ooxml/scripts/unpack.py +29 -29
  546. package/skills/writing-docs/pptx/ooxml/scripts/validate.py +69 -69
  547. package/skills/writing-docs/pptx/ooxml/scripts/validation/__init__.py +15 -15
  548. package/skills/writing-docs/pptx/ooxml/scripts/validation/base.py +951 -951
  549. package/skills/writing-docs/pptx/ooxml/scripts/validation/docx.py +274 -274
  550. package/skills/writing-docs/pptx/ooxml/scripts/validation/pptx.py +315 -315
  551. package/skills/writing-docs/pptx/ooxml/scripts/validation/redlining.py +279 -279
  552. package/skills/writing-docs/pptx/ooxml.md +426 -426
  553. package/skills/writing-docs/pptx/scripts/html2pptx.js +978 -978
  554. package/skills/writing-docs/pptx/scripts/inventory.py +1020 -1020
  555. package/skills/writing-docs/pptx/scripts/rearrange.py +231 -231
  556. package/skills/writing-docs/pptx/scripts/replace.py +385 -385
  557. package/skills/writing-docs/pptx/scripts/thumbnail.py +450 -450
  558. package/skills/writing-docs/slides/LICENSE.txt +201 -201
  559. package/skills/writing-docs/slides/SKILL.md +71 -71
  560. package/skills/writing-docs/slides/agents/openai.yaml +6 -6
  561. package/skills/writing-docs/slides/assets/pptxgenjs_helpers/code.js +104 -104
  562. package/skills/writing-docs/slides/assets/pptxgenjs_helpers/image.js +333 -333
  563. package/skills/writing-docs/slides/assets/pptxgenjs_helpers/index.js +33 -33
  564. package/skills/writing-docs/slides/assets/pptxgenjs_helpers/latex.js +51 -51
  565. package/skills/writing-docs/slides/assets/pptxgenjs_helpers/layout.js +643 -643
  566. package/skills/writing-docs/slides/assets/pptxgenjs_helpers/layout_builders.js +358 -358
  567. package/skills/writing-docs/slides/assets/pptxgenjs_helpers/svg.js +36 -36
  568. package/skills/writing-docs/slides/assets/pptxgenjs_helpers/text.js +789 -789
  569. package/skills/writing-docs/slides/assets/pptxgenjs_helpers/util.js +24 -24
  570. package/skills/writing-docs/slides/assets/slides-small.svg +3 -3
  571. package/skills/writing-docs/slides/references/pptxgenjs-helpers.md +61 -61
  572. package/skills/writing-docs/slides/scripts/create_montage.py +300 -300
  573. package/skills/writing-docs/slides/scripts/detect_font.py +873 -873
  574. package/skills/writing-docs/slides/scripts/ensure_raster_image.py +202 -202
  575. package/skills/writing-docs/slides/scripts/render_slides.py +273 -273
  576. package/skills/writing-docs/slides/scripts/slides_test.py +201 -201
  577. package/skills/writing-docs/template-skill/SKILL.md +26 -26
  578. package/skills/writing-docs/xlsx/LICENSE.txt +30 -30
  579. package/skills/writing-docs/xlsx/SKILL.md +288 -288
  580. package/skills/writing-docs/xlsx/recalc.py +177 -177
  581. package/src/core/KILO_MASTER.md +448 -448
  582. package/src/tools/validate-skill.js +421 -421
@@ -1,953 +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)
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)