cokit-cli 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +103 -0
- package/README.FLOW.md +237 -0
- package/README.md +153 -94
- package/agents/brainstormer.agent.md +71 -0
- package/agents/code-reviewer.agent.md +128 -0
- package/agents/database-admin.agent.md +91 -0
- package/agents/debugger.agent.md +128 -0
- package/agents/docs-manager.agent.md +121 -0
- package/agents/fullstack-developer.agent.md +96 -0
- package/agents/git-manager.agent.md +392 -0
- package/agents/mcp-manager.agent.md +93 -0
- package/agents/planner.agent.md +94 -0
- package/agents/project-manager.agent.md +124 -0
- package/agents/researcher.agent.md +32 -0
- package/agents/scout-external.agent.md +141 -0
- package/agents/scout.agent.md +107 -0
- package/agents/tester.agent.md +106 -0
- package/agents/ui-ux-designer.agent.md +225 -0
- package/collections/ck-core.collection.yml +30 -0
- package/collections/ck-development-rules.collection.yml +18 -0
- package/collections/ck-documentation.collection.yml +18 -0
- package/collections/ck-git-workflow.collection.yml +18 -0
- package/collections/ck-orchestration.collection.yml +22 -0
- package/collections/ck-ui-design.collection.yml +18 -0
- package/docs/README.md +85 -0
- package/docs/copilot-processing-flow.md +128 -0
- package/instructions/ck-backend.instructions.md +48 -0
- package/instructions/ck-development.instructions.md +40 -0
- package/instructions/ck-frontend-design-pro.instructions.md +58 -0
- package/instructions/ck-frontend.instructions.md +44 -0
- package/instructions/ck-google-adk-python.instructions.md +242 -0
- package/instructions/ck-research.instructions.md +167 -0
- package/instructions/ck-testing.instructions.md +36 -0
- package/package.json +9 -2
- package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/phase-01-restructure-folders.md +183 -0
- package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/phase-02-convert-agents.md +206 -0
- package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/phase-03-convert-commands-to-prompts.md +284 -0
- package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/phase-04-convert-skills-to-instructions.md +349 -0
- package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/phase-05-create-collections.md +320 -0
- package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/phase-06-update-cli-build-scripts.md +450 -0
- package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/phase-07-update-documentation.md +407 -0
- package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/plan.md +136 -0
- package/prompts/ck-ask.prompt.md +57 -0
- package/prompts/ck-bootstrap-auto-fast.prompt.md +108 -0
- package/prompts/ck-bootstrap-auto-parallel.prompt.md +66 -0
- package/prompts/ck-bootstrap-auto.prompt.md +114 -0
- package/prompts/ck-bootstrap.prompt.md +136 -0
- package/prompts/ck-brainstorm.prompt.md +68 -0
- package/prompts/ck-ck-help.prompt.md +114 -0
- package/prompts/ck-code-auto.prompt.md +171 -0
- package/prompts/ck-code-no-test.prompt.md +159 -0
- package/prompts/ck-code-parallel.prompt.md +56 -0
- package/prompts/ck-code.prompt.md +177 -0
- package/prompts/ck-coding-level.prompt.md +54 -0
- package/prompts/ck-cook-auto-fast.prompt.md +26 -0
- package/prompts/ck-cook-auto-parallel.prompt.md +49 -0
- package/prompts/ck-cook-auto.prompt.md +15 -0
- package/prompts/ck-cook.prompt.md +96 -0
- package/prompts/ck-debug.prompt.md +14 -0
- package/prompts/ck-design-3d.prompt.md +84 -0
- package/prompts/ck-design-describe.prompt.md +24 -0
- package/prompts/ck-design-fast.prompt.md +32 -0
- package/prompts/ck-design-good.prompt.md +36 -0
- package/prompts/ck-design-screenshot.prompt.md +35 -0
- package/prompts/ck-design-video.prompt.md +35 -0
- package/prompts/ck-docs-init.prompt.md +27 -0
- package/prompts/ck-docs-summarize.prompt.md +23 -0
- package/prompts/ck-docs-update.prompt.md +36 -0
- package/prompts/ck-fix-ci.prompt.md +18 -0
- package/prompts/ck-fix-fast.prompt.md +18 -0
- package/prompts/ck-fix-hard.prompt.md +36 -0
- package/prompts/ck-fix-logs.prompt.md +27 -0
- package/prompts/ck-fix-parallel.prompt.md +54 -0
- package/prompts/ck-fix-test.prompt.md +19 -0
- package/prompts/ck-fix-types.prompt.md +11 -0
- package/prompts/ck-fix-ui.prompt.md +49 -0
- package/prompts/ck-fix.prompt.md +44 -0
- package/prompts/ck-git-cm.prompt.md +8 -0
- package/prompts/ck-git-cp.prompt.md +7 -0
- package/prompts/ck-git-merge.prompt.md +41 -0
- package/prompts/ck-git-pr.prompt.md +49 -0
- package/prompts/ck-kanban.prompt.md +77 -0
- package/prompts/ck-plan-archive.prompt.md +58 -0
- package/prompts/ck-plan-ci.prompt.md +34 -0
- package/prompts/ck-plan-cro.prompt.md +66 -0
- package/prompts/ck-plan-fast.prompt.md +67 -0
- package/prompts/ck-plan-hard.prompt.md +89 -0
- package/prompts/ck-plan-parallel.prompt.md +126 -0
- package/prompts/ck-plan-two.prompt.md +43 -0
- package/prompts/ck-plan-validate.prompt.md +118 -0
- package/prompts/ck-plan.prompt.md +29 -1
- package/prompts/ck-preview.prompt.md +65 -0
- package/prompts/ck-review-codebase.prompt.md +44 -0
- package/prompts/ck-scout-ext.prompt.md +35 -0
- package/prompts/ck-scout.prompt.md +25 -0
- package/prompts/ck-skill-add.prompt.md +36 -0
- package/prompts/ck-skill-create.prompt.md +29 -0
- package/prompts/ck-skill-fix-logs.prompt.md +22 -0
- package/prompts/ck-skill-optimize-auto.prompt.md +25 -0
- package/prompts/ck-skill-optimize.prompt.md +34 -0
- package/prompts/ck-skill-plan.prompt.md +46 -0
- package/prompts/ck-test-ui.prompt.md +92 -0
- package/prompts/ck-test.prompt.md +10 -0
- package/prompts/ck-use-mcp.prompt.md +27 -0
- package/prompts/ck-watzup.prompt.md +11 -0
- package/prompts/ck-worktree.prompt.md +127 -0
- package/rules/README.agents.md +55 -0
- package/rules/README.collections.md +78 -0
- package/rules/README.copilot-instructions.md +66 -0
- package/rules/README.instructions.md +73 -0
- package/rules/README.md +39 -0
- package/rules/README.prompts.md +76 -0
- package/rules/README.skills.md +71 -0
- package/skills/ck-ai-artist/SKILL.md +73 -0
- package/skills/ck-ai-artist/references/advanced-techniques.md +184 -0
- package/skills/ck-ai-artist/references/domain-code.md +66 -0
- package/skills/ck-ai-artist/references/domain-data.md +72 -0
- package/skills/ck-ai-artist/references/domain-marketing.md +66 -0
- package/skills/ck-ai-artist/references/domain-patterns.md +33 -0
- package/skills/ck-ai-artist/references/domain-writing.md +68 -0
- package/skills/ck-ai-artist/references/image-prompting.md +141 -0
- package/skills/ck-ai-artist/references/llm-prompting.md +165 -0
- package/skills/ck-ai-artist/references/nano-banana.md +59 -0
- package/skills/ck-ai-artist/references/reasoning-techniques.md +201 -0
- package/skills/ck-backend-development/SKILL.md +93 -0
- package/skills/ck-backend-development/references/backend-api-design.md +495 -0
- package/skills/ck-backend-development/references/backend-architecture.md +454 -0
- package/skills/ck-backend-development/references/backend-authentication.md +338 -0
- package/skills/ck-backend-development/references/backend-code-quality.md +659 -0
- package/skills/ck-backend-development/references/backend-debugging.md +904 -0
- package/skills/ck-backend-development/references/backend-devops.md +494 -0
- package/skills/ck-backend-development/references/backend-mindset.md +387 -0
- package/skills/ck-backend-development/references/backend-performance.md +397 -0
- package/skills/ck-backend-development/references/backend-security.md +290 -0
- package/skills/ck-backend-development/references/backend-technologies.md +256 -0
- package/skills/ck-backend-development/references/backend-testing.md +429 -0
- package/skills/ck-better-auth/SKILL.md +202 -0
- package/skills/ck-better-auth/references/advanced-features.md +553 -0
- package/skills/ck-better-auth/references/database-integration.md +577 -0
- package/skills/ck-better-auth/references/email-password-auth.md +416 -0
- package/skills/ck-better-auth/references/oauth-providers.md +430 -0
- package/skills/ck-better-auth/scripts/.coverage +0 -0
- package/skills/ck-better-auth/scripts/better_auth_init.py +521 -0
- package/skills/ck-better-auth/scripts/requirements.txt +15 -0
- package/skills/ck-better-auth/scripts/tests/.coverage +0 -0
- package/skills/ck-better-auth/scripts/tests/test_better_auth_init.py +421 -0
- package/skills/ck-chrome-devtools/SKILL.md +470 -0
- package/skills/ck-chrome-devtools/references/cdp-domains.md +694 -0
- package/skills/ck-chrome-devtools/references/performance-guide.md +940 -0
- package/skills/ck-chrome-devtools/references/puppeteer-reference.md +953 -0
- package/skills/ck-chrome-devtools/scripts/README.md +272 -0
- package/skills/ck-chrome-devtools/scripts/__tests__/selector.test.js +210 -0
- package/skills/ck-chrome-devtools/scripts/aria-snapshot.js +362 -0
- package/skills/ck-chrome-devtools/scripts/click.js +83 -0
- package/skills/ck-chrome-devtools/scripts/console.js +79 -0
- package/skills/ck-chrome-devtools/scripts/evaluate.js +53 -0
- package/skills/ck-chrome-devtools/scripts/fill.js +76 -0
- package/skills/ck-chrome-devtools/scripts/inject-auth.js +229 -0
- package/skills/ck-chrome-devtools/scripts/install-deps.sh +181 -0
- package/skills/ck-chrome-devtools/scripts/install.sh +83 -0
- package/skills/ck-chrome-devtools/scripts/lib/browser.js +318 -0
- package/skills/ck-chrome-devtools/scripts/lib/selector.js +178 -0
- package/skills/ck-chrome-devtools/scripts/navigate.js +54 -0
- package/skills/ck-chrome-devtools/scripts/network.js +106 -0
- package/skills/ck-chrome-devtools/scripts/package-lock.json +1589 -0
- package/skills/ck-chrome-devtools/scripts/package.json +16 -0
- package/skills/ck-chrome-devtools/scripts/performance.js +149 -0
- package/skills/ck-chrome-devtools/scripts/screenshot.js +198 -0
- package/skills/ck-chrome-devtools/scripts/select-ref.js +131 -0
- package/skills/ck-chrome-devtools/scripts/snapshot.js +135 -0
- package/skills/ck-code-review/SKILL.md +110 -53
- package/skills/ck-code-review/references/code-review-reception.md +182 -49
- package/skills/ck-code-review/references/requesting-code-review.md +105 -0
- package/skills/ck-code-review/references/verification-before-completion.md +111 -58
- package/skills/ck-databases/SKILL.md +231 -0
- package/skills/ck-databases/references/mongodb-aggregation.md +447 -0
- package/skills/ck-databases/references/mongodb-atlas.md +465 -0
- package/skills/ck-databases/references/mongodb-crud.md +408 -0
- package/skills/ck-databases/references/mongodb-indexing.md +442 -0
- package/skills/ck-databases/references/postgresql-administration.md +594 -0
- package/skills/ck-databases/references/postgresql-performance.md +527 -0
- package/skills/ck-databases/references/postgresql-psql-cli.md +467 -0
- package/skills/ck-databases/references/postgresql-queries.md +475 -0
- package/skills/ck-databases/scripts/.coverage +0 -0
- package/skills/ck-databases/scripts/db_backup.py +502 -0
- package/skills/ck-databases/scripts/db_migrate.py +425 -0
- package/skills/ck-databases/scripts/db_performance_check.py +456 -0
- package/skills/ck-databases/scripts/requirements.txt +20 -0
- package/skills/ck-databases/scripts/tests/coverage-db.json +1 -0
- package/skills/ck-databases/scripts/tests/requirements.txt +4 -0
- package/skills/ck-databases/scripts/tests/test_db_backup.py +340 -0
- package/skills/ck-databases/scripts/tests/test_db_migrate.py +277 -0
- package/skills/ck-databases/scripts/tests/test_db_performance_check.py +370 -0
- package/skills/ck-debugging/SKILL.md +55 -43
- package/skills/ck-debugging/references/defense-in-depth.md +124 -0
- package/skills/ck-debugging/references/root-cause-tracing.md +100 -43
- package/skills/ck-debugging/references/systematic-debugging.md +80 -52
- package/skills/ck-debugging/references/verification.md +101 -52
- package/skills/ck-debugging/scripts/find-polluter.sh +63 -0
- package/skills/ck-debugging/scripts/find-polluter.test.md +102 -0
- package/skills/ck-devops/.env.example +76 -0
- package/skills/ck-devops/SKILL.md +283 -0
- package/skills/ck-devops/references/browser-rendering.md +305 -0
- package/skills/ck-devops/references/cloudflare-d1-kv.md +123 -0
- package/skills/ck-devops/references/cloudflare-platform.md +271 -0
- package/skills/ck-devops/references/cloudflare-r2-storage.md +280 -0
- package/skills/ck-devops/references/cloudflare-workers-advanced.md +312 -0
- package/skills/ck-devops/references/cloudflare-workers-apis.md +309 -0
- package/skills/ck-devops/references/cloudflare-workers-basics.md +418 -0
- package/skills/ck-devops/references/docker-basics.md +297 -0
- package/skills/ck-devops/references/docker-compose.md +292 -0
- package/skills/ck-devops/references/gcloud-platform.md +297 -0
- package/skills/ck-devops/references/gcloud-services.md +304 -0
- package/skills/ck-devops/scripts/cloudflare_deploy.py +269 -0
- package/skills/ck-devops/scripts/docker_optimize.py +331 -0
- package/skills/ck-devops/scripts/requirements.txt +20 -0
- package/skills/ck-devops/scripts/tests/requirements.txt +3 -0
- package/skills/ck-devops/scripts/tests/test_cloudflare_deploy.py +285 -0
- package/skills/ck-devops/scripts/tests/test_docker_optimize.py +436 -0
- package/skills/ck-docs-seeker/.env.example +15 -0
- package/skills/ck-docs-seeker/SKILL.md +70 -65
- package/skills/ck-docs-seeker/package.json +25 -0
- package/skills/ck-docs-seeker/references/advanced.md +79 -0
- package/skills/ck-docs-seeker/references/context7-patterns.md +68 -0
- package/skills/ck-docs-seeker/references/errors.md +68 -0
- package/skills/ck-docs-seeker/scripts/analyze-llms-txt.js +211 -0
- package/skills/ck-docs-seeker/scripts/detect-topic.js +172 -0
- package/skills/ck-docs-seeker/scripts/fetch-docs.js +213 -0
- package/skills/ck-docs-seeker/scripts/tests/run-tests.js +72 -0
- package/skills/ck-docs-seeker/scripts/tests/test-analyze-llms.js +119 -0
- package/skills/ck-docs-seeker/scripts/tests/test-detect-topic.js +112 -0
- package/skills/ck-docs-seeker/scripts/tests/test-fetch-docs.js +84 -0
- package/skills/ck-docs-seeker/scripts/utils/env-loader.js +94 -0
- package/skills/ck-docs-seeker/workflows/library-search.md +87 -0
- package/skills/ck-docs-seeker/workflows/repo-analysis.md +91 -0
- package/skills/ck-docs-seeker/workflows/topic-search.md +77 -0
- package/skills/ck-frontend-design/SKILL.md +79 -0
- package/skills/ck-frontend-design/references/analysis-best-practices.md +80 -0
- package/skills/ck-frontend-design/references/analysis-prompts.md +141 -0
- package/skills/ck-frontend-design/references/analysis-techniques.md +118 -0
- package/skills/ck-frontend-design/references/animejs.md +396 -0
- package/skills/ck-frontend-design/references/design-extraction-overview.md +71 -0
- package/skills/ck-frontend-design/references/extraction-best-practices.md +141 -0
- package/skills/ck-frontend-design/references/extraction-output-templates.md +162 -0
- package/skills/ck-frontend-design/references/extraction-prompts.md +127 -0
- package/skills/ck-frontend-design/references/technical-accessibility.md +119 -0
- package/skills/ck-frontend-design/references/technical-best-practices.md +97 -0
- package/skills/ck-frontend-design/references/technical-optimization.md +44 -0
- package/skills/ck-frontend-design/references/technical-overview.md +90 -0
- package/skills/ck-frontend-design/references/technical-workflows.md +150 -0
- package/skills/ck-frontend-design/references/visual-analysis-overview.md +95 -0
- package/skills/ck-frontend-development/SKILL.md +399 -0
- package/skills/ck-frontend-development/resources/common-patterns.md +331 -0
- package/skills/ck-frontend-development/resources/complete-examples.md +872 -0
- package/skills/ck-frontend-development/resources/component-patterns.md +502 -0
- package/skills/ck-frontend-development/resources/data-fetching.md +767 -0
- package/skills/ck-frontend-development/resources/file-organization.md +502 -0
- package/skills/ck-frontend-development/resources/loading-and-error-states.md +501 -0
- package/skills/ck-frontend-development/resources/performance.md +406 -0
- package/skills/ck-frontend-development/resources/routing-guide.md +364 -0
- package/skills/ck-frontend-development/resources/styling-guide.md +428 -0
- package/skills/ck-frontend-development/resources/typescript-standards.md +418 -0
- package/skills/ck-markdown-novel-viewer/SKILL.md +190 -0
- package/skills/ck-markdown-novel-viewer/assets/directory-browser.css +215 -0
- package/skills/ck-markdown-novel-viewer/assets/favicon.png +0 -0
- package/skills/ck-markdown-novel-viewer/assets/novel-theme.css +818 -0
- package/skills/ck-markdown-novel-viewer/assets/reader.js +262 -0
- package/skills/ck-markdown-novel-viewer/assets/template.html +80 -0
- package/skills/ck-markdown-novel-viewer/package.json +15 -0
- package/skills/ck-markdown-novel-viewer/scripts/lib/http-server.cjs +434 -0
- package/skills/ck-markdown-novel-viewer/scripts/lib/markdown-renderer.cjs +272 -0
- package/skills/ck-markdown-novel-viewer/scripts/lib/plan-navigator.cjs +509 -0
- package/skills/ck-markdown-novel-viewer/scripts/lib/port-finder.cjs +48 -0
- package/skills/ck-markdown-novel-viewer/scripts/lib/process-mgr.cjs +150 -0
- package/skills/ck-markdown-novel-viewer/scripts/server.cjs +411 -0
- package/skills/ck-markdown-novel-viewer/scripts/tests/server.test.cjs +283 -0
- package/skills/ck-markdown-novel-viewer/tests/dashboard-assets.test.cjs +340 -0
- package/skills/ck-markdown-novel-viewer/tests/dashboard-renderer.test.cjs +404 -0
- package/skills/ck-markdown-novel-viewer/tests/http-server.test.cjs +271 -0
- package/skills/ck-markdown-novel-viewer/tests/run-tests.cjs +51 -0
- package/skills/ck-markdown-novel-viewer/tests/test-framework.cjs +154 -0
- package/skills/ck-markdown-novel-viewer/tests/verify-xss.cjs +90 -0
- package/skills/ck-mcp-builder/LICENSE.txt +202 -0
- package/skills/ck-mcp-builder/SKILL.md +327 -0
- package/skills/ck-mcp-builder/reference/evaluation.md +602 -0
- package/skills/ck-mcp-builder/reference/mcp_best_practices.md +915 -0
- package/skills/ck-mcp-builder/reference/node_mcp_server.md +916 -0
- package/skills/ck-mcp-builder/reference/python_mcp_server.md +752 -0
- package/skills/ck-mcp-builder/scripts/connections.py +151 -0
- package/skills/ck-mcp-builder/scripts/evaluation.py +373 -0
- package/skills/ck-mcp-builder/scripts/example_evaluation.xml +22 -0
- package/skills/ck-mcp-builder/scripts/requirements.txt +2 -0
- package/skills/ck-mcp-management/README.md +219 -0
- package/skills/ck-mcp-management/SKILL.md +209 -0
- package/skills/ck-mcp-management/assets/tools.json +3146 -0
- package/skills/ck-mcp-management/references/configuration.md +114 -0
- package/skills/ck-mcp-management/references/gemini-cli-integration.md +215 -0
- package/skills/ck-mcp-management/references/mcp-protocol.md +116 -0
- package/skills/ck-mcp-management/scripts/.env.example +10 -0
- package/skills/ck-mcp-management/scripts/cli.ts +195 -0
- package/skills/ck-mcp-management/scripts/dist/analyze-tools.js +70 -0
- package/skills/ck-mcp-management/scripts/dist/cli.js +160 -0
- package/skills/ck-mcp-management/scripts/dist/mcp-client.js +183 -0
- package/skills/ck-mcp-management/scripts/mcp-client.ts +230 -0
- package/skills/ck-mcp-management/scripts/package.json +20 -0
- package/skills/ck-mcp-management/scripts/tsconfig.json +15 -0
- package/skills/ck-media-processing/SKILL.md +90 -0
- package/skills/ck-media-processing/references/common-workflows.md +132 -0
- package/skills/ck-media-processing/references/ffmpeg-encoding.md +358 -0
- package/skills/ck-media-processing/references/ffmpeg-filters.md +503 -0
- package/skills/ck-media-processing/references/ffmpeg-streaming.md +403 -0
- package/skills/ck-media-processing/references/format-compatibility.md +375 -0
- package/skills/ck-media-processing/references/imagemagick-batch.md +612 -0
- package/skills/ck-media-processing/references/imagemagick-editing.md +623 -0
- package/skills/ck-media-processing/references/rmbg-background-removal.md +66 -0
- package/skills/ck-media-processing/references/troubleshooting.md +109 -0
- package/skills/ck-media-processing/scripts/README.md +111 -0
- package/skills/ck-media-processing/scripts/batch-remove-background.sh +124 -0
- package/skills/ck-media-processing/scripts/batch_resize.py +342 -0
- package/skills/ck-media-processing/scripts/media_convert.py +311 -0
- package/skills/ck-media-processing/scripts/remove-background.sh +96 -0
- package/skills/ck-media-processing/scripts/remove-bg-node.js +158 -0
- package/skills/ck-media-processing/scripts/requirements.txt +24 -0
- package/skills/ck-media-processing/scripts/tests/.coverage +0 -0
- package/skills/ck-media-processing/scripts/tests/requirements.txt +2 -0
- package/skills/ck-media-processing/scripts/tests/test_batch_resize.py +372 -0
- package/skills/ck-media-processing/scripts/tests/test_media_convert.py +259 -0
- package/skills/ck-media-processing/scripts/tests/test_video_optimize.py +397 -0
- package/skills/ck-media-processing/scripts/video_optimize.py +414 -0
- package/skills/ck-mobile-development/SKILL.md +210 -0
- package/skills/ck-mobile-development/references/mobile-android.md +604 -0
- package/skills/ck-mobile-development/references/mobile-best-practices.md +545 -0
- package/skills/ck-mobile-development/references/mobile-debugging.md +1089 -0
- package/skills/ck-mobile-development/references/mobile-frameworks.md +465 -0
- package/skills/ck-mobile-development/references/mobile-ios.md +496 -0
- package/skills/ck-mobile-development/references/mobile-mindset.md +544 -0
- package/skills/ck-payment-integration/README.md +185 -0
- package/skills/ck-payment-integration/SKILL.md +116 -0
- package/skills/ck-payment-integration/references/polar/benefits.md +396 -0
- package/skills/ck-payment-integration/references/polar/best-practices.md +482 -0
- package/skills/ck-payment-integration/references/polar/checkouts.md +266 -0
- package/skills/ck-payment-integration/references/polar/overview.md +184 -0
- package/skills/ck-payment-integration/references/polar/products.md +244 -0
- package/skills/ck-payment-integration/references/polar/sdk.md +436 -0
- package/skills/ck-payment-integration/references/polar/subscriptions.md +340 -0
- package/skills/ck-payment-integration/references/polar/webhooks.md +405 -0
- package/skills/ck-payment-integration/references/sepay/api.md +140 -0
- package/skills/ck-payment-integration/references/sepay/best-practices.md +337 -0
- package/skills/ck-payment-integration/references/sepay/overview.md +138 -0
- package/skills/ck-payment-integration/references/sepay/qr-codes.md +228 -0
- package/skills/ck-payment-integration/references/sepay/sdk.md +213 -0
- package/skills/ck-payment-integration/references/sepay/webhooks.md +208 -0
- package/skills/ck-payment-integration/scripts/.env.example +20 -0
- package/skills/ck-payment-integration/scripts/checkout-helper.js +244 -0
- package/skills/ck-payment-integration/scripts/package.json +17 -0
- package/skills/ck-payment-integration/scripts/polar-webhook-verify.js +202 -0
- package/skills/ck-payment-integration/scripts/sepay-webhook-verify.js +193 -0
- package/skills/ck-payment-integration/scripts/test-scripts.js +237 -0
- package/skills/ck-planning/SKILL.md +79 -49
- package/skills/ck-planning/references/codebase-understanding.md +62 -0
- package/skills/ck-planning/references/output-standards.md +127 -0
- package/skills/ck-planning/references/plan-organization.md +122 -60
- package/skills/ck-planning/references/research-phase.md +49 -56
- package/skills/ck-planning/references/solution-design.md +61 -63
- package/skills/ck-problem-solving/SKILL.md +95 -0
- package/skills/ck-problem-solving/references/attribution.md +69 -0
- package/skills/ck-problem-solving/references/collision-zone-thinking.md +79 -0
- package/skills/ck-problem-solving/references/inversion-exercise.md +91 -0
- package/skills/ck-problem-solving/references/meta-pattern-recognition.md +87 -0
- package/skills/ck-problem-solving/references/scale-game.md +95 -0
- package/skills/ck-problem-solving/references/simplification-cascades.md +80 -0
- package/skills/ck-problem-solving/references/when-stuck.md +72 -0
- package/skills/ck-repomix/SKILL.md +247 -0
- package/skills/ck-repomix/references/configuration.md +211 -0
- package/skills/ck-repomix/references/usage-patterns.md +232 -0
- package/skills/ck-repomix/scripts/.coverage +0 -0
- package/skills/ck-repomix/scripts/README.md +179 -0
- package/skills/ck-repomix/scripts/repomix_batch.py +455 -0
- package/skills/ck-repomix/scripts/repos.example.json +15 -0
- package/skills/ck-repomix/scripts/requirements.txt +15 -0
- package/skills/ck-repomix/scripts/tests/test_repomix_batch.py +531 -0
- package/skills/ck-sequential-thinking/.env.example +8 -0
- package/skills/ck-sequential-thinking/README.md +183 -0
- package/skills/ck-sequential-thinking/SKILL.md +14 -2
- package/skills/ck-sequential-thinking/package.json +31 -0
- package/skills/ck-sequential-thinking/references/advanced-strategies.md +79 -0
- package/skills/ck-sequential-thinking/references/advanced-techniques.md +2 -14
- package/skills/ck-sequential-thinking/references/core-patterns.md +8 -0
- package/skills/ck-sequential-thinking/references/examples-api.md +88 -0
- package/skills/ck-sequential-thinking/references/examples-architecture.md +94 -0
- package/skills/ck-sequential-thinking/references/examples-debug.md +90 -0
- package/skills/ck-sequential-thinking/scripts/format-thought.js +159 -0
- package/skills/ck-sequential-thinking/scripts/process-thought.js +236 -0
- package/skills/ck-sequential-thinking/tests/format-thought.test.js +133 -0
- package/skills/ck-sequential-thinking/tests/process-thought.test.js +215 -0
- package/skills/ck-shopify/README.md +66 -0
- package/skills/ck-shopify/SKILL.md +319 -0
- package/skills/ck-shopify/references/app-development.md +470 -0
- package/skills/ck-shopify/references/extensions.md +493 -0
- package/skills/ck-shopify/references/themes.md +498 -0
- package/skills/ck-shopify/scripts/.coverage +0 -0
- package/skills/ck-shopify/scripts/requirements.txt +19 -0
- package/skills/ck-shopify/scripts/shopify_init.py +423 -0
- package/skills/ck-shopify/scripts/tests/.coverage +0 -0
- package/skills/ck-shopify/scripts/tests/test_shopify_init.py +385 -0
- package/skills/ck-skill-creator/LICENSE.txt +202 -0
- package/skills/ck-skill-creator/SKILL.md +265 -0
- package/skills/ck-skill-creator/scripts/init_skill.py +303 -0
- package/skills/ck-skill-creator/scripts/package_skill.py +110 -0
- package/skills/ck-skill-creator/scripts/quick_validate.py +65 -0
- package/skills/ck-threejs/SKILL.md +87 -0
- package/skills/ck-threejs/references/01-getting-started.md +177 -0
- package/skills/ck-threejs/references/02-loaders.md +169 -0
- package/skills/ck-threejs/references/03-textures.md +170 -0
- package/skills/ck-threejs/references/04-cameras.md +195 -0
- package/skills/ck-threejs/references/05-lights.md +183 -0
- package/skills/ck-threejs/references/06-animations.md +214 -0
- package/skills/ck-threejs/references/07-math.md +260 -0
- package/skills/ck-threejs/references/08-interaction.md +267 -0
- package/skills/ck-threejs/references/09-postprocessing.md +240 -0
- package/skills/ck-threejs/references/10-controls.md +259 -0
- package/skills/ck-threejs/references/11-materials-advanced.md +270 -0
- package/skills/ck-threejs/references/12-performance.md +269 -0
- package/skills/ck-threejs/references/13-node-materials.md +298 -0
- package/skills/ck-threejs/references/14-physics-vr.md +304 -0
- package/skills/ck-threejs/references/15-specialized-loaders.md +333 -0
- package/skills/ck-threejs/references/16-webgpu.md +302 -0
- package/skills/ck-ui-styling/LICENSE.txt +202 -0
- package/skills/ck-ui-styling/SKILL.md +319 -0
- package/skills/ck-ui-styling/canvas-fonts/ArsenalSC-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/BigShoulders-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Boldonse-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/CrimsonPro-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/DMMono-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/EricaOne-OFL.txt +94 -0
- package/skills/ck-ui-styling/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/GeistMono-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Gloock-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/InstrumentSans-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Italiana-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Jura-Light.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Jura-Medium.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Jura-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Lora-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Lora-Italic.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Lora-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/Lora-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/NationalPark-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Outfit-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/PixelifySans-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/PoiretOne-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/RedHatMono-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Silkscreen-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/SmoochSans-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Tektur-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/WorkSans-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/YoungSerif-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/YoungSerif-Regular.ttf +0 -0
- package/skills/ck-ui-styling/references/canvas-design-system.md +320 -0
- package/skills/ck-ui-styling/references/shadcn-accessibility.md +471 -0
- package/skills/ck-ui-styling/references/shadcn-components.md +424 -0
- package/skills/ck-ui-styling/references/shadcn-theming.md +373 -0
- package/skills/ck-ui-styling/references/tailwind-customization.md +483 -0
- package/skills/ck-ui-styling/references/tailwind-responsive.md +382 -0
- package/skills/ck-ui-styling/references/tailwind-utilities.md +455 -0
- package/skills/ck-ui-styling/scripts/.coverage +0 -0
- package/skills/ck-ui-styling/scripts/requirements.txt +17 -0
- package/skills/ck-ui-styling/scripts/shadcn_add.py +292 -0
- package/skills/ck-ui-styling/scripts/tailwind_config_gen.py +456 -0
- package/skills/ck-ui-styling/scripts/tests/coverage-ui.json +1 -0
- package/skills/ck-ui-styling/scripts/tests/requirements.txt +3 -0
- package/skills/ck-ui-styling/scripts/tests/test_shadcn_add.py +266 -0
- package/skills/ck-ui-styling/scripts/tests/test_tailwind_config_gen.py +336 -0
- package/skills/ck-ui-ux-pro-max/SKILL.md +227 -0
- package/skills/ck-ui-ux-pro-max/data/charts.csv +26 -0
- package/skills/ck-ui-ux-pro-max/data/colors.csv +97 -0
- package/skills/ck-ui-ux-pro-max/data/landing.csv +31 -0
- package/skills/ck-ui-ux-pro-max/data/products.csv +97 -0
- package/skills/ck-ui-ux-pro-max/data/prompts.csv +24 -0
- package/skills/ck-ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/skills/ck-ui-ux-pro-max/data/stacks/html-tailwind.csv +51 -0
- package/skills/ck-ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/skills/ck-ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/skills/ck-ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/skills/ck-ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/skills/ck-ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/skills/ck-ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/skills/ck-ui-ux-pro-max/data/styles.csv +59 -0
- package/skills/ck-ui-ux-pro-max/data/typography.csv +58 -0
- package/skills/ck-ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/skills/ck-ui-ux-pro-max/scripts/core.py +236 -0
- package/skills/ck-ui-ux-pro-max/scripts/search.py +76 -0
- package/skills/ck-web-frameworks/SKILL.md +322 -0
- package/skills/ck-web-frameworks/references/nextjs-app-router.md +465 -0
- package/skills/ck-web-frameworks/references/nextjs-data-fetching.md +459 -0
- package/skills/ck-web-frameworks/references/nextjs-optimization.md +511 -0
- package/skills/ck-web-frameworks/references/nextjs-server-components.md +495 -0
- package/skills/ck-web-frameworks/references/remix-icon-integration.md +603 -0
- package/skills/ck-web-frameworks/references/turborepo-caching.md +551 -0
- package/skills/ck-web-frameworks/references/turborepo-pipelines.md +517 -0
- package/skills/ck-web-frameworks/references/turborepo-setup.md +542 -0
- package/skills/ck-web-frameworks/scripts/.coverage +0 -0
- package/skills/ck-web-frameworks/scripts/__init__.py +0 -0
- package/skills/ck-web-frameworks/scripts/nextjs_init.py +547 -0
- package/skills/ck-web-frameworks/scripts/requirements.txt +16 -0
- package/skills/ck-web-frameworks/scripts/tests/coverage-web.json +1 -0
- package/skills/ck-web-frameworks/scripts/tests/requirements.txt +3 -0
- package/skills/ck-web-frameworks/scripts/tests/test_nextjs_init.py +319 -0
- package/skills/ck-web-frameworks/scripts/tests/test_turborepo_migrate.py +374 -0
- package/skills/ck-web-frameworks/scripts/turborepo_migrate.py +394 -0
- package/src/commands/init.js +61 -30
- package/src/utils/paths.js +35 -4
|
@@ -0,0 +1,940 @@
|
|
|
1
|
+
# Performance Analysis Guide
|
|
2
|
+
|
|
3
|
+
Comprehensive guide to analyzing web performance using Chrome DevTools Protocol, Puppeteer, and chrome-devtools skill.
|
|
4
|
+
|
|
5
|
+
## Table of Contents
|
|
6
|
+
|
|
7
|
+
- [Core Web Vitals](#core-web-vitals)
|
|
8
|
+
- [Performance Tracing](#performance-tracing)
|
|
9
|
+
- [Network Analysis](#network-analysis)
|
|
10
|
+
- [JavaScript Performance](#javascript-performance)
|
|
11
|
+
- [Rendering Performance](#rendering-performance)
|
|
12
|
+
- [Memory Analysis](#memory-analysis)
|
|
13
|
+
- [Optimization Strategies](#optimization-strategies)
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Core Web Vitals
|
|
18
|
+
|
|
19
|
+
### Overview
|
|
20
|
+
|
|
21
|
+
Core Web Vitals are Google's standardized metrics for measuring user experience:
|
|
22
|
+
|
|
23
|
+
- **LCP (Largest Contentful Paint)** - Loading performance (< 2.5s good)
|
|
24
|
+
- **FID (First Input Delay)** - Interactivity (< 100ms good)
|
|
25
|
+
- **CLS (Cumulative Layout Shift)** - Visual stability (< 0.1 good)
|
|
26
|
+
|
|
27
|
+
### Measuring with chrome-devtools-mcp
|
|
28
|
+
|
|
29
|
+
```javascript
|
|
30
|
+
// Start performance trace
|
|
31
|
+
await useTool('performance_start_trace', {
|
|
32
|
+
categories: ['loading', 'rendering', 'scripting']
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
// Navigate to page
|
|
36
|
+
await useTool('navigate_page', {
|
|
37
|
+
url: 'https://example.com'
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
// Wait for complete load
|
|
41
|
+
await useTool('wait_for', {
|
|
42
|
+
waitUntil: 'networkidle'
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
// Stop trace and get data
|
|
46
|
+
await useTool('performance_stop_trace');
|
|
47
|
+
|
|
48
|
+
// Get AI-powered insights
|
|
49
|
+
const insights = await useTool('performance_analyze_insight');
|
|
50
|
+
|
|
51
|
+
// insights will include:
|
|
52
|
+
// - LCP timing
|
|
53
|
+
// - FID analysis
|
|
54
|
+
// - CLS score
|
|
55
|
+
// - Performance recommendations
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### Measuring with Puppeteer
|
|
59
|
+
|
|
60
|
+
```javascript
|
|
61
|
+
import puppeteer from 'puppeteer';
|
|
62
|
+
|
|
63
|
+
const browser = await puppeteer.launch();
|
|
64
|
+
const page = await browser.newPage();
|
|
65
|
+
|
|
66
|
+
// Measure Core Web Vitals
|
|
67
|
+
await page.goto('https://example.com', {
|
|
68
|
+
waitUntil: 'networkidle2'
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
const vitals = await page.evaluate(() => {
|
|
72
|
+
return new Promise((resolve) => {
|
|
73
|
+
const vitals = {
|
|
74
|
+
LCP: null,
|
|
75
|
+
FID: null,
|
|
76
|
+
CLS: 0
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
// LCP
|
|
80
|
+
new PerformanceObserver((list) => {
|
|
81
|
+
const entries = list.getEntries();
|
|
82
|
+
vitals.LCP = entries[entries.length - 1].renderTime ||
|
|
83
|
+
entries[entries.length - 1].loadTime;
|
|
84
|
+
}).observe({ entryTypes: ['largest-contentful-paint'] });
|
|
85
|
+
|
|
86
|
+
// FID
|
|
87
|
+
new PerformanceObserver((list) => {
|
|
88
|
+
vitals.FID = list.getEntries()[0].processingStart -
|
|
89
|
+
list.getEntries()[0].startTime;
|
|
90
|
+
}).observe({ entryTypes: ['first-input'] });
|
|
91
|
+
|
|
92
|
+
// CLS
|
|
93
|
+
new PerformanceObserver((list) => {
|
|
94
|
+
list.getEntries().forEach((entry) => {
|
|
95
|
+
if (!entry.hadRecentInput) {
|
|
96
|
+
vitals.CLS += entry.value;
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
}).observe({ entryTypes: ['layout-shift'] });
|
|
100
|
+
|
|
101
|
+
// Wait 5 seconds for metrics
|
|
102
|
+
setTimeout(() => resolve(vitals), 5000);
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
console.log('Core Web Vitals:', vitals);
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### Other Important Metrics
|
|
110
|
+
|
|
111
|
+
**TTFB (Time to First Byte)**
|
|
112
|
+
```javascript
|
|
113
|
+
const ttfb = await page.evaluate(() => {
|
|
114
|
+
const [navigationEntry] = performance.getEntriesByType('navigation');
|
|
115
|
+
return navigationEntry.responseStart - navigationEntry.requestStart;
|
|
116
|
+
});
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
**FCP (First Contentful Paint)**
|
|
120
|
+
```javascript
|
|
121
|
+
const fcp = await page.evaluate(() => {
|
|
122
|
+
const paintEntries = performance.getEntriesByType('paint');
|
|
123
|
+
const fcpEntry = paintEntries.find(e => e.name === 'first-contentful-paint');
|
|
124
|
+
return fcpEntry ? fcpEntry.startTime : null;
|
|
125
|
+
});
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
**TTI (Time to Interactive)**
|
|
129
|
+
```javascript
|
|
130
|
+
// Requires lighthouse or manual calculation
|
|
131
|
+
const tti = await page.evaluate(() => {
|
|
132
|
+
// Complex calculation based on network idle and long tasks
|
|
133
|
+
// Best to use Lighthouse for accurate TTI
|
|
134
|
+
});
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## Performance Tracing
|
|
140
|
+
|
|
141
|
+
### Chrome Trace Categories
|
|
142
|
+
|
|
143
|
+
**Loading:**
|
|
144
|
+
- Page load events
|
|
145
|
+
- Resource loading
|
|
146
|
+
- Parser activity
|
|
147
|
+
|
|
148
|
+
**Rendering:**
|
|
149
|
+
- Layout calculations
|
|
150
|
+
- Paint operations
|
|
151
|
+
- Compositing
|
|
152
|
+
|
|
153
|
+
**Scripting:**
|
|
154
|
+
- JavaScript execution
|
|
155
|
+
- V8 compilation
|
|
156
|
+
- Garbage collection
|
|
157
|
+
|
|
158
|
+
**Network:**
|
|
159
|
+
- HTTP requests
|
|
160
|
+
- WebSocket traffic
|
|
161
|
+
- Resource fetching
|
|
162
|
+
|
|
163
|
+
**Input:**
|
|
164
|
+
- User input processing
|
|
165
|
+
- Touch/scroll events
|
|
166
|
+
|
|
167
|
+
**GPU:**
|
|
168
|
+
- GPU operations
|
|
169
|
+
- Compositing work
|
|
170
|
+
|
|
171
|
+
### Record Performance Trace
|
|
172
|
+
|
|
173
|
+
**Using chrome-devtools-mcp:**
|
|
174
|
+
```javascript
|
|
175
|
+
// Start trace with specific categories
|
|
176
|
+
await useTool('performance_start_trace', {
|
|
177
|
+
categories: ['loading', 'rendering', 'scripting', 'network']
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
// Perform actions
|
|
181
|
+
await useTool('navigate_page', { url: 'https://example.com' });
|
|
182
|
+
await useTool('wait_for', { waitUntil: 'networkidle' });
|
|
183
|
+
|
|
184
|
+
// Optional: Interact with page
|
|
185
|
+
await useTool('click', { uid: 'button-uid' });
|
|
186
|
+
|
|
187
|
+
// Stop trace
|
|
188
|
+
const traceData = await useTool('performance_stop_trace');
|
|
189
|
+
|
|
190
|
+
// Analyze trace
|
|
191
|
+
const insights = await useTool('performance_analyze_insight');
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
**Using Puppeteer:**
|
|
195
|
+
```javascript
|
|
196
|
+
// Start tracing
|
|
197
|
+
await page.tracing.start({
|
|
198
|
+
path: 'trace.json',
|
|
199
|
+
categories: [
|
|
200
|
+
'devtools.timeline',
|
|
201
|
+
'disabled-by-default-devtools.timeline',
|
|
202
|
+
'disabled-by-default-v8.cpu_profiler'
|
|
203
|
+
]
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
// Navigate
|
|
207
|
+
await page.goto('https://example.com', {
|
|
208
|
+
waitUntil: 'networkidle2'
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
// Stop tracing
|
|
212
|
+
await page.tracing.stop();
|
|
213
|
+
|
|
214
|
+
// Analyze in Chrome DevTools (chrome://tracing)
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
### Analyze Trace Data
|
|
218
|
+
|
|
219
|
+
**Key Metrics from Trace:**
|
|
220
|
+
|
|
221
|
+
1. **Main Thread Activity**
|
|
222
|
+
- JavaScript execution time
|
|
223
|
+
- Layout/reflow time
|
|
224
|
+
- Paint time
|
|
225
|
+
- Long tasks (> 50ms)
|
|
226
|
+
|
|
227
|
+
2. **Network Waterfall**
|
|
228
|
+
- Request start times
|
|
229
|
+
- DNS lookup
|
|
230
|
+
- Connection time
|
|
231
|
+
- Download time
|
|
232
|
+
|
|
233
|
+
3. **Rendering Pipeline**
|
|
234
|
+
- DOM construction
|
|
235
|
+
- Style calculation
|
|
236
|
+
- Layout
|
|
237
|
+
- Paint
|
|
238
|
+
- Composite
|
|
239
|
+
|
|
240
|
+
**Common Issues to Look For:**
|
|
241
|
+
- Long tasks blocking main thread
|
|
242
|
+
- Excessive JavaScript execution
|
|
243
|
+
- Layout thrashing
|
|
244
|
+
- Unnecessary repaints
|
|
245
|
+
- Slow network requests
|
|
246
|
+
- Large bundle sizes
|
|
247
|
+
|
|
248
|
+
---
|
|
249
|
+
|
|
250
|
+
## Network Analysis
|
|
251
|
+
|
|
252
|
+
### Monitor Network Requests
|
|
253
|
+
|
|
254
|
+
**Using chrome-devtools-mcp:**
|
|
255
|
+
```javascript
|
|
256
|
+
// Navigate to page
|
|
257
|
+
await useTool('navigate_page', { url: 'https://example.com' });
|
|
258
|
+
|
|
259
|
+
// Wait for all requests
|
|
260
|
+
await useTool('wait_for', { waitUntil: 'networkidle' });
|
|
261
|
+
|
|
262
|
+
// List all requests
|
|
263
|
+
const requests = await useTool('list_network_requests', {
|
|
264
|
+
resourceTypes: ['Document', 'Script', 'Stylesheet', 'Image', 'XHR', 'Fetch'],
|
|
265
|
+
pageSize: 100
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
// Analyze specific request
|
|
269
|
+
for (const req of requests.requests) {
|
|
270
|
+
const details = await useTool('get_network_request', {
|
|
271
|
+
requestId: req.id
|
|
272
|
+
});
|
|
273
|
+
|
|
274
|
+
console.log({
|
|
275
|
+
url: details.url,
|
|
276
|
+
method: details.method,
|
|
277
|
+
status: details.status,
|
|
278
|
+
size: details.encodedDataLength,
|
|
279
|
+
time: details.timing.receiveHeadersEnd - details.timing.requestTime,
|
|
280
|
+
cached: details.fromCache
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
**Using Puppeteer:**
|
|
286
|
+
```javascript
|
|
287
|
+
const requests = [];
|
|
288
|
+
|
|
289
|
+
// Capture all requests
|
|
290
|
+
page.on('request', (request) => {
|
|
291
|
+
requests.push({
|
|
292
|
+
url: request.url(),
|
|
293
|
+
method: request.method(),
|
|
294
|
+
resourceType: request.resourceType(),
|
|
295
|
+
headers: request.headers()
|
|
296
|
+
});
|
|
297
|
+
});
|
|
298
|
+
|
|
299
|
+
// Capture responses
|
|
300
|
+
page.on('response', (response) => {
|
|
301
|
+
const request = response.request();
|
|
302
|
+
console.log({
|
|
303
|
+
url: response.url(),
|
|
304
|
+
status: response.status(),
|
|
305
|
+
size: response.headers()['content-length'],
|
|
306
|
+
cached: response.fromCache(),
|
|
307
|
+
timing: response.timing()
|
|
308
|
+
});
|
|
309
|
+
});
|
|
310
|
+
|
|
311
|
+
await page.goto('https://example.com');
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
### Network Performance Metrics
|
|
315
|
+
|
|
316
|
+
**Calculate Total Page Weight:**
|
|
317
|
+
```javascript
|
|
318
|
+
let totalBytes = 0;
|
|
319
|
+
let resourceCounts = {};
|
|
320
|
+
|
|
321
|
+
page.on('response', async (response) => {
|
|
322
|
+
const type = response.request().resourceType();
|
|
323
|
+
const buffer = await response.buffer();
|
|
324
|
+
|
|
325
|
+
totalBytes += buffer.length;
|
|
326
|
+
resourceCounts[type] = (resourceCounts[type] || 0) + 1;
|
|
327
|
+
});
|
|
328
|
+
|
|
329
|
+
await page.goto('https://example.com');
|
|
330
|
+
|
|
331
|
+
console.log('Total size:', (totalBytes / 1024 / 1024).toFixed(2), 'MB');
|
|
332
|
+
console.log('Resources:', resourceCounts);
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
**Identify Slow Requests:**
|
|
336
|
+
```javascript
|
|
337
|
+
page.on('response', (response) => {
|
|
338
|
+
const timing = response.timing();
|
|
339
|
+
const totalTime = timing.receiveHeadersEnd - timing.requestTime;
|
|
340
|
+
|
|
341
|
+
if (totalTime > 1000) { // Slower than 1 second
|
|
342
|
+
console.log('Slow request:', {
|
|
343
|
+
url: response.url(),
|
|
344
|
+
time: totalTime.toFixed(2) + 'ms',
|
|
345
|
+
size: response.headers()['content-length']
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
});
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
### Network Throttling
|
|
352
|
+
|
|
353
|
+
**Simulate Slow Connection:**
|
|
354
|
+
```javascript
|
|
355
|
+
// Using chrome-devtools-mcp
|
|
356
|
+
await useTool('emulate_network', {
|
|
357
|
+
throttlingOption: 'Slow 3G' // or 'Fast 3G', 'Slow 4G'
|
|
358
|
+
});
|
|
359
|
+
|
|
360
|
+
// Using Puppeteer
|
|
361
|
+
const client = await page.createCDPSession();
|
|
362
|
+
await client.send('Network.emulateNetworkConditions', {
|
|
363
|
+
offline: false,
|
|
364
|
+
downloadThroughput: 400 * 1024 / 8, // 400 Kbps
|
|
365
|
+
uploadThroughput: 400 * 1024 / 8,
|
|
366
|
+
latency: 2000 // 2000ms RTT
|
|
367
|
+
});
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
---
|
|
371
|
+
|
|
372
|
+
## JavaScript Performance
|
|
373
|
+
|
|
374
|
+
### Identify Long Tasks
|
|
375
|
+
|
|
376
|
+
**Using Performance Observer:**
|
|
377
|
+
```javascript
|
|
378
|
+
await page.evaluate(() => {
|
|
379
|
+
return new Promise((resolve) => {
|
|
380
|
+
const longTasks = [];
|
|
381
|
+
|
|
382
|
+
const observer = new PerformanceObserver((list) => {
|
|
383
|
+
list.getEntries().forEach((entry) => {
|
|
384
|
+
longTasks.push({
|
|
385
|
+
name: entry.name,
|
|
386
|
+
duration: entry.duration,
|
|
387
|
+
startTime: entry.startTime
|
|
388
|
+
});
|
|
389
|
+
});
|
|
390
|
+
});
|
|
391
|
+
|
|
392
|
+
observer.observe({ entryTypes: ['longtask'] });
|
|
393
|
+
|
|
394
|
+
// Collect for 10 seconds
|
|
395
|
+
setTimeout(() => {
|
|
396
|
+
observer.disconnect();
|
|
397
|
+
resolve(longTasks);
|
|
398
|
+
}, 10000);
|
|
399
|
+
});
|
|
400
|
+
});
|
|
401
|
+
```
|
|
402
|
+
|
|
403
|
+
### CPU Profiling
|
|
404
|
+
|
|
405
|
+
**Using Puppeteer:**
|
|
406
|
+
```javascript
|
|
407
|
+
// Start CPU profiling
|
|
408
|
+
const client = await page.createCDPSession();
|
|
409
|
+
await client.send('Profiler.enable');
|
|
410
|
+
await client.send('Profiler.start');
|
|
411
|
+
|
|
412
|
+
// Navigate and interact
|
|
413
|
+
await page.goto('https://example.com');
|
|
414
|
+
await page.click('.button');
|
|
415
|
+
|
|
416
|
+
// Stop profiling
|
|
417
|
+
const { profile } = await client.send('Profiler.stop');
|
|
418
|
+
|
|
419
|
+
// Analyze profile (flame graph data)
|
|
420
|
+
// Import into Chrome DevTools for visualization
|
|
421
|
+
```
|
|
422
|
+
|
|
423
|
+
### JavaScript Coverage
|
|
424
|
+
|
|
425
|
+
**Identify Unused Code:**
|
|
426
|
+
```javascript
|
|
427
|
+
// Start coverage
|
|
428
|
+
await Promise.all([
|
|
429
|
+
page.coverage.startJSCoverage(),
|
|
430
|
+
page.coverage.startCSSCoverage()
|
|
431
|
+
]);
|
|
432
|
+
|
|
433
|
+
// Navigate
|
|
434
|
+
await page.goto('https://example.com');
|
|
435
|
+
|
|
436
|
+
// Stop coverage
|
|
437
|
+
const [jsCoverage, cssCoverage] = await Promise.all([
|
|
438
|
+
page.coverage.stopJSCoverage(),
|
|
439
|
+
page.coverage.stopCSSCoverage()
|
|
440
|
+
]);
|
|
441
|
+
|
|
442
|
+
// Calculate unused bytes
|
|
443
|
+
function calculateUnusedBytes(coverage) {
|
|
444
|
+
let usedBytes = 0;
|
|
445
|
+
let totalBytes = 0;
|
|
446
|
+
|
|
447
|
+
for (const entry of coverage) {
|
|
448
|
+
totalBytes += entry.text.length;
|
|
449
|
+
for (const range of entry.ranges) {
|
|
450
|
+
usedBytes += range.end - range.start - 1;
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
return {
|
|
455
|
+
usedBytes,
|
|
456
|
+
totalBytes,
|
|
457
|
+
unusedBytes: totalBytes - usedBytes,
|
|
458
|
+
unusedPercentage: ((totalBytes - usedBytes) / totalBytes * 100).toFixed(2)
|
|
459
|
+
};
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
console.log('JS Coverage:', calculateUnusedBytes(jsCoverage));
|
|
463
|
+
console.log('CSS Coverage:', calculateUnusedBytes(cssCoverage));
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
### Bundle Size Analysis
|
|
467
|
+
|
|
468
|
+
**Analyze JavaScript Bundles:**
|
|
469
|
+
```javascript
|
|
470
|
+
page.on('response', async (response) => {
|
|
471
|
+
const url = response.url();
|
|
472
|
+
const type = response.request().resourceType();
|
|
473
|
+
|
|
474
|
+
if (type === 'script') {
|
|
475
|
+
const buffer = await response.buffer();
|
|
476
|
+
const size = buffer.length;
|
|
477
|
+
|
|
478
|
+
console.log({
|
|
479
|
+
url: url.split('/').pop(),
|
|
480
|
+
size: (size / 1024).toFixed(2) + ' KB',
|
|
481
|
+
gzipped: response.headers()['content-encoding'] === 'gzip'
|
|
482
|
+
});
|
|
483
|
+
}
|
|
484
|
+
});
|
|
485
|
+
```
|
|
486
|
+
|
|
487
|
+
---
|
|
488
|
+
|
|
489
|
+
## Rendering Performance
|
|
490
|
+
|
|
491
|
+
### Layout Thrashing Detection
|
|
492
|
+
|
|
493
|
+
**Monitor Layout Recalculations:**
|
|
494
|
+
```javascript
|
|
495
|
+
// Using Performance Observer
|
|
496
|
+
await page.evaluate(() => {
|
|
497
|
+
return new Promise((resolve) => {
|
|
498
|
+
const measurements = [];
|
|
499
|
+
|
|
500
|
+
const observer = new PerformanceObserver((list) => {
|
|
501
|
+
list.getEntries().forEach((entry) => {
|
|
502
|
+
if (entry.entryType === 'measure' &&
|
|
503
|
+
entry.name.includes('layout')) {
|
|
504
|
+
measurements.push({
|
|
505
|
+
name: entry.name,
|
|
506
|
+
duration: entry.duration,
|
|
507
|
+
startTime: entry.startTime
|
|
508
|
+
});
|
|
509
|
+
}
|
|
510
|
+
});
|
|
511
|
+
});
|
|
512
|
+
|
|
513
|
+
observer.observe({ entryTypes: ['measure'] });
|
|
514
|
+
|
|
515
|
+
setTimeout(() => {
|
|
516
|
+
observer.disconnect();
|
|
517
|
+
resolve(measurements);
|
|
518
|
+
}, 5000);
|
|
519
|
+
});
|
|
520
|
+
});
|
|
521
|
+
```
|
|
522
|
+
|
|
523
|
+
### Paint and Composite Metrics
|
|
524
|
+
|
|
525
|
+
**Get Paint Metrics:**
|
|
526
|
+
```javascript
|
|
527
|
+
const paintMetrics = await page.evaluate(() => {
|
|
528
|
+
const paints = performance.getEntriesByType('paint');
|
|
529
|
+
return {
|
|
530
|
+
firstPaint: paints.find(p => p.name === 'first-paint')?.startTime,
|
|
531
|
+
firstContentfulPaint: paints.find(p => p.name === 'first-contentful-paint')?.startTime
|
|
532
|
+
};
|
|
533
|
+
});
|
|
534
|
+
```
|
|
535
|
+
|
|
536
|
+
### Frame Rate Analysis
|
|
537
|
+
|
|
538
|
+
**Monitor FPS:**
|
|
539
|
+
```javascript
|
|
540
|
+
await page.evaluate(() => {
|
|
541
|
+
return new Promise((resolve) => {
|
|
542
|
+
let frames = 0;
|
|
543
|
+
let lastTime = performance.now();
|
|
544
|
+
|
|
545
|
+
function countFrames() {
|
|
546
|
+
frames++;
|
|
547
|
+
requestAnimationFrame(countFrames);
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
countFrames();
|
|
551
|
+
|
|
552
|
+
setTimeout(() => {
|
|
553
|
+
const now = performance.now();
|
|
554
|
+
const elapsed = (now - lastTime) / 1000;
|
|
555
|
+
const fps = frames / elapsed;
|
|
556
|
+
resolve(fps);
|
|
557
|
+
}, 5000);
|
|
558
|
+
});
|
|
559
|
+
});
|
|
560
|
+
```
|
|
561
|
+
|
|
562
|
+
### Layout Shifts (CLS)
|
|
563
|
+
|
|
564
|
+
**Track Individual Shifts:**
|
|
565
|
+
```javascript
|
|
566
|
+
await page.evaluate(() => {
|
|
567
|
+
return new Promise((resolve) => {
|
|
568
|
+
const shifts = [];
|
|
569
|
+
let totalCLS = 0;
|
|
570
|
+
|
|
571
|
+
const observer = new PerformanceObserver((list) => {
|
|
572
|
+
list.getEntries().forEach((entry) => {
|
|
573
|
+
if (!entry.hadRecentInput) {
|
|
574
|
+
totalCLS += entry.value;
|
|
575
|
+
shifts.push({
|
|
576
|
+
value: entry.value,
|
|
577
|
+
time: entry.startTime,
|
|
578
|
+
elements: entry.sources?.map(s => s.node)
|
|
579
|
+
});
|
|
580
|
+
}
|
|
581
|
+
});
|
|
582
|
+
});
|
|
583
|
+
|
|
584
|
+
observer.observe({ entryTypes: ['layout-shift'] });
|
|
585
|
+
|
|
586
|
+
setTimeout(() => {
|
|
587
|
+
observer.disconnect();
|
|
588
|
+
resolve({ totalCLS, shifts });
|
|
589
|
+
}, 10000);
|
|
590
|
+
});
|
|
591
|
+
});
|
|
592
|
+
```
|
|
593
|
+
|
|
594
|
+
---
|
|
595
|
+
|
|
596
|
+
## Memory Analysis
|
|
597
|
+
|
|
598
|
+
### Memory Metrics
|
|
599
|
+
|
|
600
|
+
**Get Memory Usage:**
|
|
601
|
+
```javascript
|
|
602
|
+
// Using chrome-devtools-mcp
|
|
603
|
+
await useTool('evaluate_script', {
|
|
604
|
+
expression: `
|
|
605
|
+
({
|
|
606
|
+
usedJSHeapSize: performance.memory?.usedJSHeapSize,
|
|
607
|
+
totalJSHeapSize: performance.memory?.totalJSHeapSize,
|
|
608
|
+
jsHeapSizeLimit: performance.memory?.jsHeapSizeLimit
|
|
609
|
+
})
|
|
610
|
+
`,
|
|
611
|
+
returnByValue: true
|
|
612
|
+
});
|
|
613
|
+
|
|
614
|
+
// Using Puppeteer
|
|
615
|
+
const metrics = await page.metrics();
|
|
616
|
+
console.log({
|
|
617
|
+
jsHeapUsed: (metrics.JSHeapUsedSize / 1024 / 1024).toFixed(2) + ' MB',
|
|
618
|
+
jsHeapTotal: (metrics.JSHeapTotalSize / 1024 / 1024).toFixed(2) + ' MB',
|
|
619
|
+
domNodes: metrics.Nodes,
|
|
620
|
+
documents: metrics.Documents,
|
|
621
|
+
jsEventListeners: metrics.JSEventListeners
|
|
622
|
+
});
|
|
623
|
+
```
|
|
624
|
+
|
|
625
|
+
### Memory Leak Detection
|
|
626
|
+
|
|
627
|
+
**Monitor Memory Over Time:**
|
|
628
|
+
```javascript
|
|
629
|
+
async function detectMemoryLeak(page, duration = 30000) {
|
|
630
|
+
const samples = [];
|
|
631
|
+
const interval = 1000; // Sample every second
|
|
632
|
+
const samples_count = duration / interval;
|
|
633
|
+
|
|
634
|
+
for (let i = 0; i < samples_count; i++) {
|
|
635
|
+
const metrics = await page.metrics();
|
|
636
|
+
samples.push({
|
|
637
|
+
time: i,
|
|
638
|
+
heapUsed: metrics.JSHeapUsedSize
|
|
639
|
+
});
|
|
640
|
+
|
|
641
|
+
await page.waitForTimeout(interval);
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
// Analyze trend
|
|
645
|
+
const firstSample = samples[0].heapUsed;
|
|
646
|
+
const lastSample = samples[samples.length - 1].heapUsed;
|
|
647
|
+
const increase = ((lastSample - firstSample) / firstSample * 100).toFixed(2);
|
|
648
|
+
|
|
649
|
+
return {
|
|
650
|
+
samples,
|
|
651
|
+
memoryIncrease: increase + '%',
|
|
652
|
+
possibleLeak: increase > 50 // > 50% increase indicates possible leak
|
|
653
|
+
};
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
const leakAnalysis = await detectMemoryLeak(page, 30000);
|
|
657
|
+
console.log('Memory Analysis:', leakAnalysis);
|
|
658
|
+
```
|
|
659
|
+
|
|
660
|
+
### Heap Snapshot
|
|
661
|
+
|
|
662
|
+
**Capture Heap Snapshot:**
|
|
663
|
+
```javascript
|
|
664
|
+
const client = await page.createCDPSession();
|
|
665
|
+
|
|
666
|
+
// Take snapshot
|
|
667
|
+
await client.send('HeapProfiler.enable');
|
|
668
|
+
const { result } = await client.send('HeapProfiler.takeHeapSnapshot');
|
|
669
|
+
|
|
670
|
+
// Snapshot is streamed in chunks
|
|
671
|
+
// Save to file or analyze programmatically
|
|
672
|
+
```
|
|
673
|
+
|
|
674
|
+
---
|
|
675
|
+
|
|
676
|
+
## Optimization Strategies
|
|
677
|
+
|
|
678
|
+
### Image Optimization
|
|
679
|
+
|
|
680
|
+
**Detect Unoptimized Images:**
|
|
681
|
+
```javascript
|
|
682
|
+
const images = await page.evaluate(() => {
|
|
683
|
+
const images = Array.from(document.querySelectorAll('img'));
|
|
684
|
+
return images.map(img => ({
|
|
685
|
+
src: img.src,
|
|
686
|
+
naturalWidth: img.naturalWidth,
|
|
687
|
+
naturalHeight: img.naturalHeight,
|
|
688
|
+
displayWidth: img.width,
|
|
689
|
+
displayHeight: img.height,
|
|
690
|
+
oversized: img.naturalWidth > img.width * 1.5 ||
|
|
691
|
+
img.naturalHeight > img.height * 1.5
|
|
692
|
+
}));
|
|
693
|
+
});
|
|
694
|
+
|
|
695
|
+
const oversizedImages = images.filter(img => img.oversized);
|
|
696
|
+
console.log('Oversized images:', oversizedImages);
|
|
697
|
+
```
|
|
698
|
+
|
|
699
|
+
### Font Loading
|
|
700
|
+
|
|
701
|
+
**Detect Render-Blocking Fonts:**
|
|
702
|
+
```javascript
|
|
703
|
+
const fonts = await page.evaluate(() => {
|
|
704
|
+
return Array.from(document.fonts).map(font => ({
|
|
705
|
+
family: font.family,
|
|
706
|
+
weight: font.weight,
|
|
707
|
+
style: font.style,
|
|
708
|
+
status: font.status,
|
|
709
|
+
loaded: font.status === 'loaded'
|
|
710
|
+
}));
|
|
711
|
+
});
|
|
712
|
+
|
|
713
|
+
console.log('Fonts:', fonts);
|
|
714
|
+
```
|
|
715
|
+
|
|
716
|
+
### Third-Party Scripts
|
|
717
|
+
|
|
718
|
+
**Measure Third-Party Impact:**
|
|
719
|
+
```javascript
|
|
720
|
+
const thirdPartyDomains = ['googletagmanager.com', 'facebook.net', 'doubleclick.net'];
|
|
721
|
+
|
|
722
|
+
page.on('response', async (response) => {
|
|
723
|
+
const url = response.url();
|
|
724
|
+
const isThirdParty = thirdPartyDomains.some(domain => url.includes(domain));
|
|
725
|
+
|
|
726
|
+
if (isThirdParty) {
|
|
727
|
+
const buffer = await response.buffer();
|
|
728
|
+
console.log({
|
|
729
|
+
url: url,
|
|
730
|
+
size: (buffer.length / 1024).toFixed(2) + ' KB',
|
|
731
|
+
type: response.request().resourceType()
|
|
732
|
+
});
|
|
733
|
+
}
|
|
734
|
+
});
|
|
735
|
+
```
|
|
736
|
+
|
|
737
|
+
### Critical Rendering Path
|
|
738
|
+
|
|
739
|
+
**Identify Render-Blocking Resources:**
|
|
740
|
+
```javascript
|
|
741
|
+
await page.goto('https://example.com');
|
|
742
|
+
|
|
743
|
+
const renderBlockingResources = await page.evaluate(() => {
|
|
744
|
+
const resources = performance.getEntriesByType('resource');
|
|
745
|
+
return resources.filter(resource => {
|
|
746
|
+
return (resource.initiatorType === 'link' &&
|
|
747
|
+
resource.name.includes('.css')) ||
|
|
748
|
+
(resource.initiatorType === 'script' &&
|
|
749
|
+
!resource.name.includes('async'));
|
|
750
|
+
}).map(r => ({
|
|
751
|
+
url: r.name,
|
|
752
|
+
duration: r.duration,
|
|
753
|
+
startTime: r.startTime
|
|
754
|
+
}));
|
|
755
|
+
});
|
|
756
|
+
|
|
757
|
+
console.log('Render-blocking resources:', renderBlockingResources);
|
|
758
|
+
```
|
|
759
|
+
|
|
760
|
+
### Lighthouse Integration
|
|
761
|
+
|
|
762
|
+
**Run Lighthouse Audit:**
|
|
763
|
+
```javascript
|
|
764
|
+
import lighthouse from 'lighthouse';
|
|
765
|
+
import { launch } from 'chrome-launcher';
|
|
766
|
+
|
|
767
|
+
// Launch Chrome
|
|
768
|
+
const chrome = await launch({ chromeFlags: ['--headless'] });
|
|
769
|
+
|
|
770
|
+
// Run Lighthouse
|
|
771
|
+
const { lhr } = await lighthouse('https://example.com', {
|
|
772
|
+
port: chrome.port,
|
|
773
|
+
onlyCategories: ['performance']
|
|
774
|
+
});
|
|
775
|
+
|
|
776
|
+
// Get scores
|
|
777
|
+
console.log({
|
|
778
|
+
performanceScore: lhr.categories.performance.score * 100,
|
|
779
|
+
metrics: {
|
|
780
|
+
FCP: lhr.audits['first-contentful-paint'].displayValue,
|
|
781
|
+
LCP: lhr.audits['largest-contentful-paint'].displayValue,
|
|
782
|
+
TBT: lhr.audits['total-blocking-time'].displayValue,
|
|
783
|
+
CLS: lhr.audits['cumulative-layout-shift'].displayValue,
|
|
784
|
+
SI: lhr.audits['speed-index'].displayValue
|
|
785
|
+
},
|
|
786
|
+
opportunities: lhr.audits['opportunities']
|
|
787
|
+
});
|
|
788
|
+
|
|
789
|
+
await chrome.kill();
|
|
790
|
+
```
|
|
791
|
+
|
|
792
|
+
---
|
|
793
|
+
|
|
794
|
+
## Performance Budgets
|
|
795
|
+
|
|
796
|
+
### Set Performance Budgets
|
|
797
|
+
|
|
798
|
+
```javascript
|
|
799
|
+
const budgets = {
|
|
800
|
+
// Core Web Vitals
|
|
801
|
+
LCP: 2500, // ms
|
|
802
|
+
FID: 100, // ms
|
|
803
|
+
CLS: 0.1, // score
|
|
804
|
+
|
|
805
|
+
// Other metrics
|
|
806
|
+
FCP: 1800, // ms
|
|
807
|
+
TTI: 3800, // ms
|
|
808
|
+
TBT: 300, // ms
|
|
809
|
+
|
|
810
|
+
// Resource budgets
|
|
811
|
+
totalPageSize: 2 * 1024 * 1024, // 2 MB
|
|
812
|
+
jsSize: 500 * 1024, // 500 KB
|
|
813
|
+
cssSize: 100 * 1024, // 100 KB
|
|
814
|
+
imageSize: 1 * 1024 * 1024, // 1 MB
|
|
815
|
+
|
|
816
|
+
// Request counts
|
|
817
|
+
totalRequests: 50,
|
|
818
|
+
jsRequests: 10,
|
|
819
|
+
cssRequests: 5
|
|
820
|
+
};
|
|
821
|
+
|
|
822
|
+
async function checkBudgets(page, budgets) {
|
|
823
|
+
// Measure actual values
|
|
824
|
+
const vitals = await measureCoreWebVitals(page);
|
|
825
|
+
const resources = await analyzeResources(page);
|
|
826
|
+
|
|
827
|
+
// Compare against budgets
|
|
828
|
+
const violations = [];
|
|
829
|
+
|
|
830
|
+
if (vitals.LCP > budgets.LCP) {
|
|
831
|
+
violations.push(`LCP: ${vitals.LCP}ms exceeds budget of ${budgets.LCP}ms`);
|
|
832
|
+
}
|
|
833
|
+
|
|
834
|
+
if (resources.totalSize > budgets.totalPageSize) {
|
|
835
|
+
violations.push(`Page size: ${resources.totalSize} exceeds budget of ${budgets.totalPageSize}`);
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
// ... check other budgets
|
|
839
|
+
|
|
840
|
+
return {
|
|
841
|
+
passed: violations.length === 0,
|
|
842
|
+
violations
|
|
843
|
+
};
|
|
844
|
+
}
|
|
845
|
+
```
|
|
846
|
+
|
|
847
|
+
---
|
|
848
|
+
|
|
849
|
+
## Automated Performance Testing
|
|
850
|
+
|
|
851
|
+
### CI/CD Integration
|
|
852
|
+
|
|
853
|
+
```javascript
|
|
854
|
+
// performance-test.js
|
|
855
|
+
import puppeteer from 'puppeteer';
|
|
856
|
+
|
|
857
|
+
async function performanceTest(url) {
|
|
858
|
+
const browser = await puppeteer.launch();
|
|
859
|
+
const page = await browser.newPage();
|
|
860
|
+
|
|
861
|
+
// Measure metrics
|
|
862
|
+
await page.goto(url, { waitUntil: 'networkidle2' });
|
|
863
|
+
const metrics = await page.metrics();
|
|
864
|
+
const vitals = await measureCoreWebVitals(page);
|
|
865
|
+
|
|
866
|
+
await browser.close();
|
|
867
|
+
|
|
868
|
+
// Check against thresholds
|
|
869
|
+
const thresholds = {
|
|
870
|
+
LCP: 2500,
|
|
871
|
+
FID: 100,
|
|
872
|
+
CLS: 0.1,
|
|
873
|
+
jsHeapSize: 50 * 1024 * 1024 // 50 MB
|
|
874
|
+
};
|
|
875
|
+
|
|
876
|
+
const failed = [];
|
|
877
|
+
if (vitals.LCP > thresholds.LCP) failed.push('LCP');
|
|
878
|
+
if (vitals.FID > thresholds.FID) failed.push('FID');
|
|
879
|
+
if (vitals.CLS > thresholds.CLS) failed.push('CLS');
|
|
880
|
+
if (metrics.JSHeapUsedSize > thresholds.jsHeapSize) failed.push('Memory');
|
|
881
|
+
|
|
882
|
+
if (failed.length > 0) {
|
|
883
|
+
console.error('Performance test failed:', failed);
|
|
884
|
+
process.exit(1);
|
|
885
|
+
}
|
|
886
|
+
|
|
887
|
+
console.log('Performance test passed');
|
|
888
|
+
}
|
|
889
|
+
|
|
890
|
+
performanceTest(process.env.TEST_URL);
|
|
891
|
+
```
|
|
892
|
+
|
|
893
|
+
---
|
|
894
|
+
|
|
895
|
+
## Best Practices
|
|
896
|
+
|
|
897
|
+
### Performance Testing Checklist
|
|
898
|
+
|
|
899
|
+
1. **Measure Multiple Times**
|
|
900
|
+
- Run tests 3-5 times
|
|
901
|
+
- Use median values
|
|
902
|
+
- Account for variance
|
|
903
|
+
|
|
904
|
+
2. **Test Different Conditions**
|
|
905
|
+
- Fast 3G
|
|
906
|
+
- Slow 3G
|
|
907
|
+
- Offline
|
|
908
|
+
- CPU throttling
|
|
909
|
+
|
|
910
|
+
3. **Test Different Devices**
|
|
911
|
+
- Mobile (low-end)
|
|
912
|
+
- Mobile (high-end)
|
|
913
|
+
- Desktop
|
|
914
|
+
- Tablet
|
|
915
|
+
|
|
916
|
+
4. **Monitor Over Time**
|
|
917
|
+
- Track metrics in CI/CD
|
|
918
|
+
- Set up alerts for regressions
|
|
919
|
+
- Create performance dashboards
|
|
920
|
+
|
|
921
|
+
5. **Focus on User Experience**
|
|
922
|
+
- Prioritize Core Web Vitals
|
|
923
|
+
- Test real user journeys
|
|
924
|
+
- Consider perceived performance
|
|
925
|
+
|
|
926
|
+
6. **Optimize Critical Path**
|
|
927
|
+
- Minimize render-blocking resources
|
|
928
|
+
- Defer non-critical JavaScript
|
|
929
|
+
- Optimize font loading
|
|
930
|
+
- Lazy load images
|
|
931
|
+
|
|
932
|
+
---
|
|
933
|
+
|
|
934
|
+
## Resources
|
|
935
|
+
|
|
936
|
+
- [Web.dev Performance](https://web.dev/performance/)
|
|
937
|
+
- [Chrome DevTools Performance](https://developer.chrome.com/docs/devtools/performance/)
|
|
938
|
+
- [Core Web Vitals](https://web.dev/vitals/)
|
|
939
|
+
- [Lighthouse](https://developer.chrome.com/docs/lighthouse/)
|
|
940
|
+
- [WebPageTest](https://www.webpagetest.org/)
|