@macpaw/cctk 1.0.0-beta.1
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/License +21 -0
- package/README.md +142 -0
- package/bin/index.js +5 -0
- package/dist/index.js +1 -0
- package/package.json +65 -0
- package/templates/claude/agents/brainstormer.md +113 -0
- package/templates/claude/agents/code-reviewer.md +157 -0
- package/templates/claude/agents/copywriter.md +110 -0
- package/templates/claude/agents/database-admin.md +92 -0
- package/templates/claude/agents/debugger.md +137 -0
- package/templates/claude/agents/docs-manager.md +208 -0
- package/templates/claude/agents/fullstack-developer.md +95 -0
- package/templates/claude/agents/git-manager.md +394 -0
- package/templates/claude/agents/journal-writer.md +113 -0
- package/templates/claude/agents/mcp-manager.md +89 -0
- package/templates/claude/agents/planner.md +108 -0
- package/templates/claude/agents/project-manager.md +125 -0
- package/templates/claude/agents/registry.json +304 -0
- package/templates/claude/agents/researcher.md +37 -0
- package/templates/claude/agents/scout-external.md +140 -0
- package/templates/claude/agents/scout.md +106 -0
- package/templates/claude/agents/tester.md +105 -0
- package/templates/claude/agents/ui-ux-designer.md +208 -0
- package/templates/claude/commands/ask.md +56 -0
- package/templates/claude/commands/bootstrap/auto/fast.md +106 -0
- package/templates/claude/commands/bootstrap/auto/parallel.md +64 -0
- package/templates/claude/commands/bootstrap/auto.md +110 -0
- package/templates/claude/commands/bootstrap.md +130 -0
- package/templates/claude/commands/brainstorm.md +75 -0
- package/templates/claude/commands/code/auto.md +198 -0
- package/templates/claude/commands/code/no-test.md +172 -0
- package/templates/claude/commands/code/parallel.md +100 -0
- package/templates/claude/commands/code.md +197 -0
- package/templates/claude/commands/coding-level.md +37 -0
- package/templates/claude/commands/content/cro.md +41 -0
- package/templates/claude/commands/content/enhance.md +12 -0
- package/templates/claude/commands/content/fast.md +11 -0
- package/templates/claude/commands/content/good.md +14 -0
- package/templates/claude/commands/cook/auto/fast.md +26 -0
- package/templates/claude/commands/cook/auto/parallel.md +49 -0
- package/templates/claude/commands/cook/auto.md +15 -0
- package/templates/claude/commands/cook.md +101 -0
- package/templates/claude/commands/debug.md +13 -0
- package/templates/claude/commands/docs/init.md +37 -0
- package/templates/claude/commands/docs/summarize.md +22 -0
- package/templates/claude/commands/docs/update.md +78 -0
- package/templates/claude/commands/fix/ci.md +17 -0
- package/templates/claude/commands/fix/fast.md +18 -0
- package/templates/claude/commands/fix/hard.md +35 -0
- package/templates/claude/commands/fix/logs.md +26 -0
- package/templates/claude/commands/fix/parallel.md +54 -0
- package/templates/claude/commands/fix/test.md +20 -0
- package/templates/claude/commands/fix/types.md +9 -0
- package/templates/claude/commands/fix/ui.md +33 -0
- package/templates/claude/commands/fix.md +43 -0
- package/templates/claude/commands/git/cm.md +5 -0
- package/templates/claude/commands/git/cp.md +4 -0
- package/templates/claude/commands/git/merge.md +40 -0
- package/templates/claude/commands/git/pr.md +50 -0
- package/templates/claude/commands/journal.md +7 -0
- package/templates/claude/commands/kanban.md +99 -0
- package/templates/claude/commands/plan/archive.md +57 -0
- package/templates/claude/commands/plan/ci.md +33 -0
- package/templates/claude/commands/plan/cro.md +67 -0
- package/templates/claude/commands/plan/fast.md +66 -0
- package/templates/claude/commands/plan/hard.md +92 -0
- package/templates/claude/commands/plan/parallel.md +129 -0
- package/templates/claude/commands/plan/two.md +45 -0
- package/templates/claude/commands/plan/validate.md +117 -0
- package/templates/claude/commands/plan.md +30 -0
- package/templates/claude/commands/preview.md +87 -0
- package/templates/claude/commands/registry.json +313 -0
- package/templates/claude/commands/review/codebase/parallel.md +122 -0
- package/templates/claude/commands/review/codebase.md +47 -0
- package/templates/claude/commands/scout/ext.md +35 -0
- package/templates/claude/commands/scout.md +28 -0
- package/templates/claude/commands/skill/add.md +36 -0
- package/templates/claude/commands/skill/create.md +29 -0
- package/templates/claude/commands/skill/fix-logs.md +22 -0
- package/templates/claude/commands/skill/optimize/auto.md +25 -0
- package/templates/claude/commands/skill/optimize.md +34 -0
- package/templates/claude/commands/skill/plan.md +45 -0
- package/templates/claude/commands/test/ui.md +91 -0
- package/templates/claude/commands/test.md +8 -0
- package/templates/claude/commands/use-mcp.md +34 -0
- package/templates/claude/commands/watzup.md +8 -0
- package/templates/claude/commands/worktree.md +126 -0
- package/templates/claude/hooks/dev-rules-reminder.cjs +258 -0
- package/templates/claude/hooks/docs/README.md +42 -0
- package/templates/claude/hooks/lib/cctk-config-utils.cjs +751 -0
- package/templates/claude/hooks/lib/cctk-paths.cjs +106 -0
- package/templates/claude/hooks/lib/context-tracker.cjs +346 -0
- package/templates/claude/hooks/privacy-block.cjs +289 -0
- package/templates/claude/hooks/registry.json +77 -0
- package/templates/claude/hooks/scout-block/broad-pattern-detector.cjs +293 -0
- package/templates/claude/hooks/scout-block/error-formatter.cjs +156 -0
- package/templates/claude/hooks/scout-block/path-extractor.cjs +359 -0
- package/templates/claude/hooks/scout-block/pattern-matcher.cjs +184 -0
- package/templates/claude/hooks/scout-block/vendor/ignore.js +626 -0
- package/templates/claude/hooks/scout-block.cjs +167 -0
- package/templates/claude/hooks/session-end.cjs +35 -0
- package/templates/claude/hooks/session-init.cjs +214 -0
- package/templates/claude/hooks/subagent-init.cjs +161 -0
- package/templates/claude/hooks/write-compact-marker.cjs +153 -0
- package/templates/claude/output-styles/coding-level-1.md +148 -0
- package/templates/claude/output-styles/coding-level-2.md +159 -0
- package/templates/claude/output-styles/coding-level-3.md +91 -0
- package/templates/claude/scripts/README.md +33 -0
- package/templates/claude/scripts/generate-catalogs.cjs +318 -0
- package/templates/claude/scripts/registry.json +48 -0
- package/templates/claude/scripts/set-active-plan.cjs +45 -0
- package/templates/claude/scripts/validate-docs.cjs +447 -0
- package/templates/claude/scripts/worktree.cjs +658 -0
- package/templates/claude/skills/README.md +112 -0
- package/templates/claude/skills/ai-artist/SKILL.md +75 -0
- package/templates/claude/skills/ai-artist/references/advanced-techniques.md +184 -0
- package/templates/claude/skills/ai-artist/references/domain-code.md +66 -0
- package/templates/claude/skills/ai-artist/references/domain-data.md +72 -0
- package/templates/claude/skills/ai-artist/references/domain-marketing.md +66 -0
- package/templates/claude/skills/ai-artist/references/domain-patterns.md +33 -0
- package/templates/claude/skills/ai-artist/references/domain-writing.md +68 -0
- package/templates/claude/skills/ai-artist/references/image-prompting.md +141 -0
- package/templates/claude/skills/ai-artist/references/llm-prompting.md +165 -0
- package/templates/claude/skills/ai-artist/references/nano-banana.md +59 -0
- package/templates/claude/skills/ai-artist/references/reasoning-techniques.md +201 -0
- package/templates/claude/skills/backend-development/SKILL.md +95 -0
- package/templates/claude/skills/backend-development/references/backend-api-design.md +495 -0
- package/templates/claude/skills/backend-development/references/backend-architecture.md +454 -0
- package/templates/claude/skills/backend-development/references/backend-authentication.md +338 -0
- package/templates/claude/skills/backend-development/references/backend-code-quality.md +659 -0
- package/templates/claude/skills/backend-development/references/backend-debugging.md +904 -0
- package/templates/claude/skills/backend-development/references/backend-devops.md +494 -0
- package/templates/claude/skills/backend-development/references/backend-mindset.md +387 -0
- package/templates/claude/skills/backend-development/references/backend-performance.md +397 -0
- package/templates/claude/skills/backend-development/references/backend-security.md +290 -0
- package/templates/claude/skills/backend-development/references/backend-technologies.md +256 -0
- package/templates/claude/skills/backend-development/references/backend-testing.md +429 -0
- package/templates/claude/skills/better-auth/SKILL.md +204 -0
- package/templates/claude/skills/better-auth/references/advanced-features.md +553 -0
- package/templates/claude/skills/better-auth/references/database-integration.md +577 -0
- package/templates/claude/skills/better-auth/references/email-password-auth.md +416 -0
- package/templates/claude/skills/better-auth/references/oauth-providers.md +430 -0
- package/templates/claude/skills/better-auth/scripts/better_auth_init.py +521 -0
- package/templates/claude/skills/chrome-devtools/SKILL.md +473 -0
- package/templates/claude/skills/chrome-devtools/references/cdp-domains.md +694 -0
- package/templates/claude/skills/chrome-devtools/references/performance-guide.md +940 -0
- package/templates/claude/skills/chrome-devtools/references/puppeteer-reference.md +953 -0
- package/templates/claude/skills/chrome-devtools/scripts/README.md +288 -0
- package/templates/claude/skills/chrome-devtools/scripts/aria-snapshot.js +368 -0
- package/templates/claude/skills/chrome-devtools/scripts/click.js +92 -0
- package/templates/claude/skills/chrome-devtools/scripts/console.js +85 -0
- package/templates/claude/skills/chrome-devtools/scripts/evaluate.js +59 -0
- package/templates/claude/skills/chrome-devtools/scripts/fill.js +84 -0
- package/templates/claude/skills/chrome-devtools/scripts/inject-auth.js +247 -0
- package/templates/claude/skills/chrome-devtools/scripts/install-deps.sh +11 -0
- package/templates/claude/skills/chrome-devtools/scripts/install.sh +36 -0
- package/templates/claude/skills/chrome-devtools/scripts/lib/browser.js +335 -0
- package/templates/claude/skills/chrome-devtools/scripts/lib/selector.js +183 -0
- package/templates/claude/skills/chrome-devtools/scripts/navigate.js +60 -0
- package/templates/claude/skills/chrome-devtools/scripts/network.js +113 -0
- package/templates/claude/skills/chrome-devtools/scripts/package.json +16 -0
- package/templates/claude/skills/chrome-devtools/scripts/performance.js +159 -0
- package/templates/claude/skills/chrome-devtools/scripts/screenshot.js +212 -0
- package/templates/claude/skills/chrome-devtools/scripts/select-ref.js +151 -0
- package/templates/claude/skills/chrome-devtools/scripts/snapshot.js +143 -0
- package/templates/claude/skills/chrome-devtools/scripts/ws-debug.js +47 -0
- package/templates/claude/skills/chrome-devtools/scripts/ws-full-debug.js +115 -0
- package/templates/claude/skills/claude-code/references/advanced-features.md +399 -0
- package/templates/claude/skills/claude-code/references/agent-skills.md +399 -0
- package/templates/claude/skills/claude-code/references/api-reference.md +498 -0
- package/templates/claude/skills/claude-code/references/best-practices.md +447 -0
- package/templates/claude/skills/claude-code/references/cicd-integration.md +428 -0
- package/templates/claude/skills/claude-code/references/common-workflows.md +107 -0
- package/templates/claude/skills/claude-code/references/configuration.md +480 -0
- package/templates/claude/skills/claude-code/references/enterprise-features.md +472 -0
- package/templates/claude/skills/claude-code/references/getting-started.md +244 -0
- package/templates/claude/skills/claude-code/references/hooks-and-plugins.md +444 -0
- package/templates/claude/skills/claude-code/references/hooks-comprehensive.md +622 -0
- package/templates/claude/skills/claude-code/references/ide-integration.md +316 -0
- package/templates/claude/skills/claude-code/references/mcp-integration.md +386 -0
- package/templates/claude/skills/claude-code/references/slash-commands.md +460 -0
- package/templates/claude/skills/claude-code/references/troubleshooting.md +455 -0
- package/templates/claude/skills/claude-code/skill.md +60 -0
- package/templates/claude/skills/code-review/SKILL.md +143 -0
- package/templates/claude/skills/code-review/references/code-review-reception.md +209 -0
- package/templates/claude/skills/code-review/references/requesting-code-review.md +105 -0
- package/templates/claude/skills/code-review/references/verification-before-completion.md +139 -0
- package/templates/claude/skills/context-engineering/SKILL.md +86 -0
- package/templates/claude/skills/context-engineering/references/context-compression.md +84 -0
- package/templates/claude/skills/context-engineering/references/context-degradation.md +93 -0
- package/templates/claude/skills/context-engineering/references/context-fundamentals.md +75 -0
- package/templates/claude/skills/context-engineering/references/context-optimization.md +82 -0
- package/templates/claude/skills/context-engineering/references/evaluation.md +89 -0
- package/templates/claude/skills/context-engineering/references/memory-systems.md +88 -0
- package/templates/claude/skills/context-engineering/references/multi-agent-patterns.md +90 -0
- package/templates/claude/skills/context-engineering/references/project-development.md +97 -0
- package/templates/claude/skills/context-engineering/references/tool-design.md +86 -0
- package/templates/claude/skills/context-engineering/scripts/compression_evaluator.py +329 -0
- package/templates/claude/skills/context-engineering/scripts/context_analyzer.py +294 -0
- package/templates/claude/skills/databases/SKILL.md +232 -0
- package/templates/claude/skills/databases/references/mongodb-aggregation.md +447 -0
- package/templates/claude/skills/databases/references/mongodb-atlas.md +465 -0
- package/templates/claude/skills/databases/references/mongodb-crud.md +408 -0
- package/templates/claude/skills/databases/references/mongodb-indexing.md +442 -0
- package/templates/claude/skills/databases/references/postgresql-administration.md +594 -0
- package/templates/claude/skills/databases/references/postgresql-performance.md +527 -0
- package/templates/claude/skills/databases/references/postgresql-psql-cli.md +467 -0
- package/templates/claude/skills/databases/references/postgresql-queries.md +475 -0
- package/templates/claude/skills/databases/scripts/db_backup.py +502 -0
- package/templates/claude/skills/databases/scripts/db_migrate.py +414 -0
- package/templates/claude/skills/databases/scripts/db_performance_check.py +445 -0
- package/templates/claude/skills/debugging/SKILL.md +84 -0
- package/templates/claude/skills/debugging/references/defense-in-depth.md +124 -0
- package/templates/claude/skills/debugging/references/root-cause-tracing.md +122 -0
- package/templates/claude/skills/debugging/references/systematic-debugging.md +102 -0
- package/templates/claude/skills/debugging/references/verification.md +123 -0
- package/templates/claude/skills/debugging/scripts/find-polluter.sh +63 -0
- package/templates/claude/skills/debugging/scripts/find-polluter.test.md +102 -0
- package/templates/claude/skills/devops/SKILL.md +293 -0
- package/templates/claude/skills/devops/references/browser-rendering.md +305 -0
- package/templates/claude/skills/devops/references/cloudflare-d1-kv.md +123 -0
- package/templates/claude/skills/devops/references/cloudflare-platform.md +271 -0
- package/templates/claude/skills/devops/references/cloudflare-r2-storage.md +280 -0
- package/templates/claude/skills/devops/references/cloudflare-workers-advanced.md +312 -0
- package/templates/claude/skills/devops/references/cloudflare-workers-apis.md +309 -0
- package/templates/claude/skills/devops/references/cloudflare-workers-basics.md +418 -0
- package/templates/claude/skills/devops/references/docker-basics.md +297 -0
- package/templates/claude/skills/devops/references/docker-compose.md +292 -0
- package/templates/claude/skills/devops/references/gcloud-platform.md +307 -0
- package/templates/claude/skills/devops/references/gcloud-services.md +304 -0
- package/templates/claude/skills/devops/scripts/cloudflare_deploy.py +269 -0
- package/templates/claude/skills/devops/scripts/docker_optimize.py +320 -0
- package/templates/claude/skills/docs-seeker/SKILL.md +95 -0
- package/templates/claude/skills/docs-seeker/package.json +24 -0
- package/templates/claude/skills/docs-seeker/references/advanced.md +78 -0
- package/templates/claude/skills/docs-seeker/references/context7-patterns.md +68 -0
- package/templates/claude/skills/docs-seeker/references/errors.md +68 -0
- package/templates/claude/skills/docs-seeker/scripts/analyze-llms-txt.js +245 -0
- package/templates/claude/skills/docs-seeker/scripts/detect-topic.js +172 -0
- package/templates/claude/skills/docs-seeker/scripts/fetch-docs.js +212 -0
- package/templates/claude/skills/docs-seeker/workflows/library-search.md +87 -0
- package/templates/claude/skills/docs-seeker/workflows/repo-analysis.md +91 -0
- package/templates/claude/skills/docs-seeker/workflows/topic-search.md +77 -0
- package/templates/claude/skills/frontend-design/SKILL.md +85 -0
- package/templates/claude/skills/frontend-design/references/analysis-best-practices.md +80 -0
- package/templates/claude/skills/frontend-design/references/analysis-prompts.md +141 -0
- package/templates/claude/skills/frontend-design/references/analysis-techniques.md +118 -0
- package/templates/claude/skills/frontend-design/references/animejs.md +396 -0
- package/templates/claude/skills/frontend-design/references/design-extraction-overview.md +71 -0
- package/templates/claude/skills/frontend-design/references/extraction-best-practices.md +141 -0
- package/templates/claude/skills/frontend-design/references/extraction-output-templates.md +162 -0
- package/templates/claude/skills/frontend-design/references/extraction-prompts.md +127 -0
- package/templates/claude/skills/frontend-design/references/technical-accessibility.md +119 -0
- package/templates/claude/skills/frontend-design/references/technical-best-practices.md +97 -0
- package/templates/claude/skills/frontend-design/references/technical-optimization.md +44 -0
- package/templates/claude/skills/frontend-design/references/technical-overview.md +90 -0
- package/templates/claude/skills/frontend-design/references/technical-workflows.md +150 -0
- package/templates/claude/skills/frontend-design/references/visual-analysis-overview.md +95 -0
- package/templates/claude/skills/frontend-development/SKILL.md +399 -0
- package/templates/claude/skills/frontend-development/resources/common-patterns.md +331 -0
- package/templates/claude/skills/frontend-development/resources/complete-examples.md +872 -0
- package/templates/claude/skills/frontend-development/resources/component-patterns.md +502 -0
- package/templates/claude/skills/frontend-development/resources/data-fetching.md +767 -0
- package/templates/claude/skills/frontend-development/resources/file-organization.md +502 -0
- package/templates/claude/skills/frontend-development/resources/loading-and-error-states.md +501 -0
- package/templates/claude/skills/frontend-development/resources/performance.md +406 -0
- package/templates/claude/skills/frontend-development/resources/routing-guide.md +364 -0
- package/templates/claude/skills/frontend-development/resources/styling-guide.md +428 -0
- package/templates/claude/skills/frontend-development/resources/typescript-standards.md +418 -0
- package/templates/claude/skills/markdown-novel-viewer/SKILL.md +272 -0
- package/templates/claude/skills/markdown-novel-viewer/assets/directory-browser.css +215 -0
- package/templates/claude/skills/markdown-novel-viewer/assets/favicon.png +0 -0
- package/templates/claude/skills/markdown-novel-viewer/assets/novel-theme.css +872 -0
- package/templates/claude/skills/markdown-novel-viewer/assets/reader.js +378 -0
- package/templates/claude/skills/markdown-novel-viewer/assets/template.html +85 -0
- package/templates/claude/skills/markdown-novel-viewer/package.json +15 -0
- package/templates/claude/skills/markdown-novel-viewer/scripts/lib/http-server.cjs +434 -0
- package/templates/claude/skills/markdown-novel-viewer/scripts/lib/markdown-renderer.cjs +335 -0
- package/templates/claude/skills/markdown-novel-viewer/scripts/lib/plan-navigator.cjs +509 -0
- package/templates/claude/skills/markdown-novel-viewer/scripts/lib/port-finder.cjs +49 -0
- package/templates/claude/skills/markdown-novel-viewer/scripts/lib/process-mgr.cjs +150 -0
- package/templates/claude/skills/markdown-novel-viewer/scripts/server.cjs +398 -0
- package/templates/claude/skills/mcp-builder/SKILL.md +328 -0
- package/templates/claude/skills/mcp-builder/reference/evaluation.md +602 -0
- package/templates/claude/skills/mcp-builder/reference/mcp_best_practices.md +915 -0
- package/templates/claude/skills/mcp-builder/reference/node_mcp_server.md +916 -0
- package/templates/claude/skills/mcp-builder/reference/python_mcp_server.md +752 -0
- package/templates/claude/skills/mcp-builder/scripts/connections.py +151 -0
- package/templates/claude/skills/mcp-builder/scripts/evaluation.py +381 -0
- package/templates/claude/skills/mcp-builder/scripts/example_evaluation.xml +22 -0
- package/templates/claude/skills/mcp-builder/scripts/requirements.txt +2 -0
- package/templates/claude/skills/mcp-management/README.md +219 -0
- package/templates/claude/skills/mcp-management/SKILL.md +209 -0
- package/templates/claude/skills/mcp-management/assets/tools.json +3146 -0
- package/templates/claude/skills/mcp-management/references/configuration.md +114 -0
- package/templates/claude/skills/mcp-management/references/gemini-cli-integration.md +209 -0
- package/templates/claude/skills/mcp-management/references/mcp-protocol.md +116 -0
- package/templates/claude/skills/mcp-management/scripts/.env.example +10 -0
- package/templates/claude/skills/mcp-management/scripts/cli.ts +202 -0
- package/templates/claude/skills/mcp-management/scripts/mcp-client.ts +247 -0
- package/templates/claude/skills/mcp-management/scripts/package.json +20 -0
- package/templates/claude/skills/mcp-management/scripts/tsconfig.json +15 -0
- package/templates/claude/skills/media-processing/SKILL.md +91 -0
- package/templates/claude/skills/media-processing/references/common-workflows.md +132 -0
- package/templates/claude/skills/media-processing/references/ffmpeg-encoding.md +358 -0
- package/templates/claude/skills/media-processing/references/ffmpeg-filters.md +503 -0
- package/templates/claude/skills/media-processing/references/ffmpeg-streaming.md +395 -0
- package/templates/claude/skills/media-processing/references/format-compatibility.md +375 -0
- package/templates/claude/skills/media-processing/references/imagemagick-batch.md +612 -0
- package/templates/claude/skills/media-processing/references/imagemagick-editing.md +623 -0
- package/templates/claude/skills/media-processing/references/rmbg-background-removal.md +66 -0
- package/templates/claude/skills/media-processing/references/troubleshooting.md +109 -0
- package/templates/claude/skills/media-processing/scripts/README.md +102 -0
- package/templates/claude/skills/media-processing/scripts/batch-remove-background.sh +124 -0
- package/templates/claude/skills/media-processing/scripts/batch_resize.py +342 -0
- package/templates/claude/skills/media-processing/scripts/media_convert.py +311 -0
- package/templates/claude/skills/media-processing/scripts/remove-background.sh +96 -0
- package/templates/claude/skills/media-processing/scripts/remove-bg-node.js +181 -0
- package/templates/claude/skills/mermaidjs-v11/SKILL.md +115 -0
- package/templates/claude/skills/mermaidjs-v11/references/cli-usage.md +228 -0
- package/templates/claude/skills/mermaidjs-v11/references/configuration.md +232 -0
- package/templates/claude/skills/mermaidjs-v11/references/diagram-types.md +315 -0
- package/templates/claude/skills/mermaidjs-v11/references/examples.md +344 -0
- package/templates/claude/skills/mermaidjs-v11/references/integration.md +310 -0
- package/templates/claude/skills/planning/SKILL.md +115 -0
- package/templates/claude/skills/planning/references/codebase-understanding.md +62 -0
- package/templates/claude/skills/planning/references/output-standards.md +127 -0
- package/templates/claude/skills/planning/references/plan-organization.md +150 -0
- package/templates/claude/skills/planning/references/research-phase.md +49 -0
- package/templates/claude/skills/planning/references/solution-design.md +63 -0
- package/templates/claude/skills/plans-kanban/SKILL.md +157 -0
- package/templates/claude/skills/plans-kanban/assets/dashboard-template.html +119 -0
- package/templates/claude/skills/plans-kanban/assets/dashboard.css +1594 -0
- package/templates/claude/skills/plans-kanban/assets/dashboard.js +659 -0
- package/templates/claude/skills/plans-kanban/assets/favicon.png +0 -0
- package/templates/claude/skills/plans-kanban/package.json +13 -0
- package/templates/claude/skills/plans-kanban/scripts/lib/dashboard-renderer.cjs +941 -0
- package/templates/claude/skills/plans-kanban/scripts/lib/http-server.cjs +310 -0
- package/templates/claude/skills/plans-kanban/scripts/lib/plan-metadata-extractor.cjs +489 -0
- package/templates/claude/skills/plans-kanban/scripts/lib/plan-parser.cjs +194 -0
- package/templates/claude/skills/plans-kanban/scripts/lib/plan-scanner.cjs +277 -0
- package/templates/claude/skills/plans-kanban/scripts/lib/port-finder.cjs +49 -0
- package/templates/claude/skills/plans-kanban/scripts/lib/process-mgr.cjs +128 -0
- package/templates/claude/skills/plans-kanban/scripts/server.cjs +249 -0
- package/templates/claude/skills/problem-solving/SKILL.md +96 -0
- package/templates/claude/skills/problem-solving/references/attribution.md +69 -0
- package/templates/claude/skills/problem-solving/references/collision-zone-thinking.md +79 -0
- package/templates/claude/skills/problem-solving/references/inversion-exercise.md +91 -0
- package/templates/claude/skills/problem-solving/references/meta-pattern-recognition.md +87 -0
- package/templates/claude/skills/problem-solving/references/scale-game.md +95 -0
- package/templates/claude/skills/problem-solving/references/simplification-cascades.md +80 -0
- package/templates/claude/skills/problem-solving/references/when-stuck.md +72 -0
- package/templates/claude/skills/registry.json +258 -0
- package/templates/claude/skills/repomix/SKILL.md +247 -0
- package/templates/claude/skills/repomix/references/configuration.md +211 -0
- package/templates/claude/skills/repomix/references/usage-patterns.md +232 -0
- package/templates/claude/skills/repomix/scripts/README.md +179 -0
- package/templates/claude/skills/repomix/scripts/repomix_batch.py +455 -0
- package/templates/claude/skills/repomix/scripts/repos.example.json +15 -0
- package/templates/claude/skills/research/SKILL.md +168 -0
- package/templates/claude/skills/sequential-thinking/.env.example +8 -0
- package/templates/claude/skills/sequential-thinking/README.md +183 -0
- package/templates/claude/skills/sequential-thinking/SKILL.md +94 -0
- package/templates/claude/skills/sequential-thinking/package.json +31 -0
- package/templates/claude/skills/sequential-thinking/references/advanced-strategies.md +79 -0
- package/templates/claude/skills/sequential-thinking/references/advanced-techniques.md +76 -0
- package/templates/claude/skills/sequential-thinking/references/core-patterns.md +95 -0
- package/templates/claude/skills/sequential-thinking/references/examples-api.md +88 -0
- package/templates/claude/skills/sequential-thinking/references/examples-architecture.md +94 -0
- package/templates/claude/skills/sequential-thinking/references/examples-debug.md +90 -0
- package/templates/claude/skills/sequential-thinking/scripts/format-thought.js +182 -0
- package/templates/claude/skills/sequential-thinking/scripts/process-thought.js +252 -0
- package/templates/claude/skills/skill-creator/LICENSE.txt +202 -0
- package/templates/claude/skills/skill-creator/SKILL.md +266 -0
- package/templates/claude/skills/skill-creator/references/agent-skills-spec.md +51 -0
- package/templates/claude/skills/skill-creator/scripts/encoding_utils.py +21 -0
- package/templates/claude/skills/skill-creator/scripts/init_skill.py +304 -0
- package/templates/claude/skills/skill-creator/scripts/package_skill.py +110 -0
- package/templates/claude/skills/skill-creator/scripts/quick_validate.py +66 -0
- package/templates/claude/skills/template-skill/SKILL.md +6 -0
- package/templates/claude/skills/vitest/SKILL.md +595 -0
- package/templates/claude/skills/vitest/references/async-patterns.md +82 -0
- package/templates/claude/skills/vitest/references/mock-patterns.md +78 -0
- package/templates/claude/skills/vitest/references/monorepo-setup.md +185 -0
- package/templates/claude/skills/vitest/references/turborepo-setup.md +332 -0
- package/templates/claude/skills/web-frameworks/SKILL.md +324 -0
- package/templates/claude/skills/web-frameworks/references/nextjs-app-router.md +465 -0
- package/templates/claude/skills/web-frameworks/references/nextjs-data-fetching.md +459 -0
- package/templates/claude/skills/web-frameworks/references/nextjs-optimization.md +511 -0
- package/templates/claude/skills/web-frameworks/references/nextjs-server-components.md +495 -0
- package/templates/claude/skills/web-frameworks/references/remix-icon-integration.md +603 -0
- package/templates/claude/skills/web-frameworks/references/turborepo-caching.md +551 -0
- package/templates/claude/skills/web-frameworks/references/turborepo-pipelines.md +517 -0
- package/templates/claude/skills/web-frameworks/references/turborepo-setup.md +542 -0
- package/templates/claude/skills/web-frameworks/scripts/nextjs_init.py +547 -0
- package/templates/claude/skills/web-frameworks/scripts/turborepo_migrate.py +394 -0
- package/templates/claude/workflows/development-rules.md +40 -0
- package/templates/claude/workflows/documentation-management.md +121 -0
- package/templates/claude/workflows/orchestration-protocol.md +16 -0
- package/templates/claude/workflows/primary-workflow.md +45 -0
- package/templates/claude/workflows/registry.json +37 -0
- package/templates/common/.cct.json +41 -0
- package/templates/common/.cctkignore +22 -0
- package/templates/common/.env.example +39 -0
- package/templates/common/.mcp.json.example +16 -0
- package/templates/common/metadata.json +15 -0
- package/templates/common/settings.json +79 -0
- package/templates/common/statusline.cjs +271 -0
- package/templates/config/.repomixignore +22 -0
- package/templates/config/AGENTS.md +55 -0
- package/templates/config/CLAUDE.md +87 -0
- package/templates/plans/bug-fix-template.md +69 -0
- package/templates/plans/feature-implementation-template.md +84 -0
- package/templates/plans/refactor-template.md +82 -0
- package/templates/plans/template-usage-guide.md +58 -0
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
# Chrome DevTools Scripts
|
|
2
|
+
|
|
3
|
+
CLI scripts for browser automation using Puppeteer.
|
|
4
|
+
|
|
5
|
+
**CRITICAL**: Always check `pwd` before running scripts.
|
|
6
|
+
|
|
7
|
+
## Installation
|
|
8
|
+
|
|
9
|
+
## Skill Location
|
|
10
|
+
|
|
11
|
+
Skills can exist in **project-scope** or **user-scope**. Priority: project-scope > user-scope.
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
# Detect skill location
|
|
15
|
+
SKILL_DIR=""
|
|
16
|
+
if [ -d ".claude/skills/chrome-devtools/scripts" ]; then
|
|
17
|
+
SKILL_DIR=".claude/skills/chrome-devtools/scripts"
|
|
18
|
+
elif [ -d "$HOME/.claude/skills/chrome-devtools/scripts" ]; then
|
|
19
|
+
SKILL_DIR="$HOME/.claude/skills/chrome-devtools/scripts"
|
|
20
|
+
fi
|
|
21
|
+
cd "$SKILL_DIR"
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### Quick Install
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
cd .claude/skills/chrome-devtools/scripts && npm install
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### Manual Installation
|
|
31
|
+
|
|
32
|
+
**Linux/WSL** - Install system dependencies first:
|
|
33
|
+
```bash
|
|
34
|
+
./install-deps.sh # Auto-detects OS (Ubuntu, Debian, Fedora, etc.)
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Or manually:
|
|
38
|
+
```bash
|
|
39
|
+
sudo apt-get install -y libnss3 libnspr4 libasound2t64 libatk1.0-0 libatk-bridge2.0-0 libcups2 libdrm2 libxkbcommon0 libxcomposite1 libxdamage1 libxfixes3 libxrandr2 libgbm1
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
**All platforms** - Install Node dependencies:
|
|
43
|
+
```bash
|
|
44
|
+
npm install
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Scripts
|
|
48
|
+
|
|
49
|
+
**CRITICAL**: Always check `pwd` before running scripts.
|
|
50
|
+
|
|
51
|
+
### inject-auth.js
|
|
52
|
+
Inject authentication (cookies, tokens, storage) for testing protected routes.
|
|
53
|
+
|
|
54
|
+
**Workflow for testing protected routes:**
|
|
55
|
+
1. User manually logs into the site in their browser
|
|
56
|
+
2. User extracts cookies/tokens from browser DevTools (Application tab)
|
|
57
|
+
3. Run inject-auth.js to inject auth into puppeteer session
|
|
58
|
+
4. Run other scripts which will use the authenticated session
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
# Inject cookies
|
|
62
|
+
node inject-auth.js --url https://example.com --cookies '[{"name":"session","value":"abc123","domain":".example.com"}]'
|
|
63
|
+
|
|
64
|
+
# Inject Bearer token (stores in localStorage + sets HTTP header)
|
|
65
|
+
node inject-auth.js --url https://example.com --token "Bearer eyJhbGciOi..." --header Authorization
|
|
66
|
+
|
|
67
|
+
# Inject localStorage items
|
|
68
|
+
node inject-auth.js --url https://example.com --local-storage '{"auth_token":"xyz","user_id":"123"}'
|
|
69
|
+
|
|
70
|
+
# Inject sessionStorage items
|
|
71
|
+
node inject-auth.js --url https://example.com --session-storage '{"temp_key":"value"}'
|
|
72
|
+
|
|
73
|
+
# Combined injection
|
|
74
|
+
node inject-auth.js --url https://example.com \
|
|
75
|
+
--cookies '[{"name":"session","value":"abc"}]' \
|
|
76
|
+
--local-storage '{"user":"data"}' \
|
|
77
|
+
--reload true
|
|
78
|
+
|
|
79
|
+
# Clear saved auth session
|
|
80
|
+
node inject-auth.js --url https://example.com --cookies '[]' --clear true
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Options:
|
|
84
|
+
- `--cookies '<json>'` - JSON array of cookie objects (name, value, domain required)
|
|
85
|
+
- `--token '<token>'` - Bearer token to inject
|
|
86
|
+
- `--token-key '<key>'` - localStorage key for token (default: access_token)
|
|
87
|
+
- `--header '<name>'` - HTTP header name for token (e.g., Authorization)
|
|
88
|
+
- `--local-storage '<json>'` - JSON object of localStorage key-value pairs
|
|
89
|
+
- `--session-storage '<json>'` - JSON object of sessionStorage key-value pairs
|
|
90
|
+
- `--reload true` - Reload page after injection to apply auth
|
|
91
|
+
- `--clear true` - Clear the saved auth session file
|
|
92
|
+
|
|
93
|
+
**Session persistence:** Auth is saved to `.auth-session.json` (valid 24h) and automatically applied by subsequent script runs until `--clear true` is used or browser closes.
|
|
94
|
+
|
|
95
|
+
### navigate.js
|
|
96
|
+
Navigate to a URL.
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
node navigate.js --url https://example.com [--wait-until networkidle2] [--timeout 30000]
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### screenshot.js
|
|
103
|
+
Take a screenshot with automatic compression.
|
|
104
|
+
|
|
105
|
+
**Important**: Always save screenshots to `./docs/screenshots` directory.
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
node screenshot.js --output screenshot.png [--url https://example.com] [--full-page true] [--selector .element] [--max-size 5] [--no-compress]
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
**Automatic Compression**: Screenshots >5MB are automatically compressed using ImageMagick to ensure compatibility with Gemini API and Claude Code. Install ImageMagick for this feature:
|
|
112
|
+
- macOS: `brew install imagemagick`
|
|
113
|
+
- Linux: `sudo apt-get install imagemagick`
|
|
114
|
+
|
|
115
|
+
Options:
|
|
116
|
+
- `--max-size N` - Custom size threshold in MB (default: 5)
|
|
117
|
+
- `--no-compress` - Disable automatic compression
|
|
118
|
+
- `--format png|jpeg` - Output format (default: png)
|
|
119
|
+
- `--quality N` - JPEG quality 0-100 (default: auto)
|
|
120
|
+
|
|
121
|
+
### click.js
|
|
122
|
+
Click an element.
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
node click.js --selector ".button" [--url https://example.com] [--wait-for ".result"]
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### fill.js
|
|
129
|
+
Fill form fields.
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
node fill.js --selector "#input" --value "text" [--url https://example.com] [--clear true]
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### evaluate.js
|
|
136
|
+
Execute JavaScript in page context.
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
node evaluate.js --script "document.title" [--url https://example.com]
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### snapshot.js
|
|
143
|
+
Get DOM snapshot with interactive elements.
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
node snapshot.js [--url https://example.com] [--output snapshot.json]
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### console.js
|
|
150
|
+
Monitor console messages.
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
node console.js --url https://example.com [--types error,warn] [--duration 5000]
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### network.js
|
|
157
|
+
Monitor network requests.
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
node network.js --url https://example.com [--types xhr,fetch] [--output requests.json]
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### performance.js
|
|
164
|
+
Measure performance metrics and record trace.
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
node performance.js --url https://example.com [--trace trace.json] [--metrics] [--resources true]
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### ws-debug.js
|
|
171
|
+
Debug WebSocket connections (basic mode).
|
|
172
|
+
|
|
173
|
+
```bash
|
|
174
|
+
node ws-debug.js
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
Monitors WebSocket events via CDP: created, handshake, response, closed, error.
|
|
178
|
+
|
|
179
|
+
### ws-full-debug.js
|
|
180
|
+
Debug WebSocket connections with full event tracking.
|
|
181
|
+
|
|
182
|
+
```bash
|
|
183
|
+
node ws-full-debug.js
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
Monitors all WebSocket events including frame sent/received, with detailed logging.
|
|
187
|
+
|
|
188
|
+
## Common Options
|
|
189
|
+
|
|
190
|
+
- `--headless false` - Show browser window
|
|
191
|
+
- `--close false` - Keep browser open
|
|
192
|
+
- `--timeout 30000` - Set timeout in milliseconds
|
|
193
|
+
- `--wait-until networkidle2` - Wait strategy (load, domcontentloaded, networkidle0, networkidle2)
|
|
194
|
+
|
|
195
|
+
## Selector Support
|
|
196
|
+
|
|
197
|
+
Scripts that accept `--selector` (click.js, fill.js, screenshot.js) support both **CSS** and **XPath** selectors.
|
|
198
|
+
|
|
199
|
+
### CSS Selectors (Default)
|
|
200
|
+
|
|
201
|
+
```bash
|
|
202
|
+
# Element tag
|
|
203
|
+
node click.js --selector "button" --url https://example.com
|
|
204
|
+
|
|
205
|
+
# Class selector
|
|
206
|
+
node click.js --selector ".btn-submit" --url https://example.com
|
|
207
|
+
|
|
208
|
+
# ID selector
|
|
209
|
+
node fill.js --selector "#email" --value "user@example.com" --url https://example.com
|
|
210
|
+
|
|
211
|
+
# Attribute selector
|
|
212
|
+
node click.js --selector 'button[type="submit"]' --url https://example.com
|
|
213
|
+
|
|
214
|
+
# Complex selector
|
|
215
|
+
node screenshot.js --selector "div.container > button.btn-primary" --output btn.png
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
### XPath Selectors
|
|
219
|
+
|
|
220
|
+
XPath selectors start with `/` or `(//` and are automatically detected:
|
|
221
|
+
|
|
222
|
+
```bash
|
|
223
|
+
# Text matching - exact
|
|
224
|
+
node click.js --selector '//button[text()="Submit"]' --url https://example.com
|
|
225
|
+
|
|
226
|
+
# Text matching - contains
|
|
227
|
+
node click.js --selector '//button[contains(text(),"Submit")]' --url https://example.com
|
|
228
|
+
|
|
229
|
+
# Attribute matching
|
|
230
|
+
node fill.js --selector '//input[@type="email"]' --value "user@example.com"
|
|
231
|
+
|
|
232
|
+
# Multiple conditions
|
|
233
|
+
node click.js --selector '//button[@type="submit" and contains(text(),"Save")]'
|
|
234
|
+
|
|
235
|
+
# Descendant selection
|
|
236
|
+
node screenshot.js --selector '//div[@class="modal"]//button[@class="close"]' --output modal.png
|
|
237
|
+
|
|
238
|
+
# Nth element
|
|
239
|
+
node click.js --selector '(//button)[2]' # Second button on page
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
### Discovering Selectors
|
|
243
|
+
|
|
244
|
+
Use `snapshot.js` to discover correct selectors:
|
|
245
|
+
|
|
246
|
+
```bash
|
|
247
|
+
# Get all interactive elements
|
|
248
|
+
node snapshot.js --url https://example.com | jq '.elements[]'
|
|
249
|
+
|
|
250
|
+
# Find buttons
|
|
251
|
+
node snapshot.js --url https://example.com | jq '.elements[] | select(.tagName=="BUTTON")'
|
|
252
|
+
|
|
253
|
+
# Find inputs
|
|
254
|
+
node snapshot.js --url https://example.com | jq '.elements[] | select(.tagName=="INPUT")'
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
### Security
|
|
258
|
+
|
|
259
|
+
XPath selectors are validated to prevent injection attacks. The following patterns are blocked:
|
|
260
|
+
- `javascript:`
|
|
261
|
+
- `<script`
|
|
262
|
+
- `onerror=`, `onload=`, `onclick=`
|
|
263
|
+
- `eval(`, `Function(`, `constructor(`
|
|
264
|
+
|
|
265
|
+
Selectors exceeding 1000 characters are rejected (DoS prevention).
|
|
266
|
+
|
|
267
|
+
## Output Format
|
|
268
|
+
|
|
269
|
+
All scripts output JSON to stdout:
|
|
270
|
+
|
|
271
|
+
```json
|
|
272
|
+
{
|
|
273
|
+
"success": true,
|
|
274
|
+
"url": "https://example.com",
|
|
275
|
+
"title": "Example Domain",
|
|
276
|
+
...
|
|
277
|
+
}
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
Errors are output to stderr:
|
|
281
|
+
|
|
282
|
+
```json
|
|
283
|
+
{
|
|
284
|
+
"success": false,
|
|
285
|
+
"error": "Error message",
|
|
286
|
+
"stack": "..."
|
|
287
|
+
}
|
|
288
|
+
```
|
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Get ARIA-based accessibility snapshot with stable element refs
|
|
4
|
+
* Usage: node aria-snapshot.js [--url https://example.com] [--output snapshot.yaml]
|
|
5
|
+
*
|
|
6
|
+
* Returns YAML-formatted accessibility tree with:
|
|
7
|
+
* - Semantic roles (button, link, textbox, heading, etc.)
|
|
8
|
+
* - Accessible names (what screen readers announce)
|
|
9
|
+
* - Element states (checked, disabled, expanded)
|
|
10
|
+
* - Stable refs [ref=eN] that persist for interaction
|
|
11
|
+
*
|
|
12
|
+
* Session behavior:
|
|
13
|
+
* By default, browser stays running for session persistence
|
|
14
|
+
* Use --close true to fully close browser
|
|
15
|
+
*/
|
|
16
|
+
import fs from 'node:fs/promises';
|
|
17
|
+
import path from 'node:path';
|
|
18
|
+
import { fileURLToPath } from 'node:url';
|
|
19
|
+
import {
|
|
20
|
+
getBrowser,
|
|
21
|
+
getPage,
|
|
22
|
+
closeBrowser,
|
|
23
|
+
disconnectBrowser,
|
|
24
|
+
parseArgs,
|
|
25
|
+
outputJSON,
|
|
26
|
+
outputError,
|
|
27
|
+
} from './lib/browser.js';
|
|
28
|
+
|
|
29
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Get ARIA snapshot script to inject into page
|
|
33
|
+
* Builds YAML-formatted accessibility tree with element references
|
|
34
|
+
*/
|
|
35
|
+
function getAriaSnapshotScript() {
|
|
36
|
+
return `
|
|
37
|
+
(function() {
|
|
38
|
+
// Store refs on window for later retrieval via selectRef
|
|
39
|
+
window.__chromeDevToolsRefs = window.__chromeDevToolsRefs || new Map();
|
|
40
|
+
let refCounter = window.__chromeDevToolsRefCounter || 1;
|
|
41
|
+
|
|
42
|
+
// ARIA roles we care about for interaction
|
|
43
|
+
const INTERACTIVE_ROLES = new Set([
|
|
44
|
+
'button', 'link', 'textbox', 'checkbox', 'radio', 'combobox',
|
|
45
|
+
'listbox', 'option', 'menuitem', 'menuitemcheckbox', 'menuitemradio',
|
|
46
|
+
'tab', 'switch', 'slider', 'spinbutton', 'searchbox', 'tree', 'treeitem',
|
|
47
|
+
'grid', 'gridcell', 'row', 'rowheader', 'columnheader'
|
|
48
|
+
]);
|
|
49
|
+
|
|
50
|
+
// Landmark roles for structure
|
|
51
|
+
const LANDMARK_ROLES = new Set([
|
|
52
|
+
'banner', 'navigation', 'main', 'complementary', 'contentinfo',
|
|
53
|
+
'search', 'form', 'region', 'article', 'dialog', 'alertdialog'
|
|
54
|
+
]);
|
|
55
|
+
|
|
56
|
+
// Implicit ARIA roles from HTML elements
|
|
57
|
+
const IMPLICIT_ROLES = {
|
|
58
|
+
'A': (el) => el.href ? 'link' : null,
|
|
59
|
+
'BUTTON': () => 'button',
|
|
60
|
+
'INPUT': (el) => {
|
|
61
|
+
const type = el.type?.toLowerCase();
|
|
62
|
+
if (type === 'checkbox') return 'checkbox';
|
|
63
|
+
if (type === 'radio') return 'radio';
|
|
64
|
+
if (type === 'submit' || type === 'button' || type === 'reset') return 'button';
|
|
65
|
+
if (type === 'search') return 'searchbox';
|
|
66
|
+
if (type === 'range') return 'slider';
|
|
67
|
+
if (type === 'number') return 'spinbutton';
|
|
68
|
+
return 'textbox';
|
|
69
|
+
},
|
|
70
|
+
'TEXTAREA': () => 'textbox',
|
|
71
|
+
'SELECT': () => 'combobox',
|
|
72
|
+
'OPTION': () => 'option',
|
|
73
|
+
'IMG': () => 'img',
|
|
74
|
+
'NAV': () => 'navigation',
|
|
75
|
+
'MAIN': () => 'main',
|
|
76
|
+
'HEADER': () => 'banner',
|
|
77
|
+
'FOOTER': () => 'contentinfo',
|
|
78
|
+
'ASIDE': () => 'complementary',
|
|
79
|
+
'ARTICLE': () => 'article',
|
|
80
|
+
'SECTION': (el) => el.getAttribute('aria-label') || el.getAttribute('aria-labelledby') ? 'region' : null,
|
|
81
|
+
'FORM': () => 'form',
|
|
82
|
+
'UL': () => 'list',
|
|
83
|
+
'OL': () => 'list',
|
|
84
|
+
'LI': () => 'listitem',
|
|
85
|
+
'H1': () => 'heading',
|
|
86
|
+
'H2': () => 'heading',
|
|
87
|
+
'H3': () => 'heading',
|
|
88
|
+
'H4': () => 'heading',
|
|
89
|
+
'H5': () => 'heading',
|
|
90
|
+
'H6': () => 'heading',
|
|
91
|
+
'TABLE': () => 'table',
|
|
92
|
+
'TR': () => 'row',
|
|
93
|
+
'TH': () => 'columnheader',
|
|
94
|
+
'TD': () => 'cell',
|
|
95
|
+
'DIALOG': () => 'dialog'
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
function getRole(el) {
|
|
99
|
+
// Explicit role takes precedence
|
|
100
|
+
const explicitRole = el.getAttribute('role');
|
|
101
|
+
if (explicitRole) return explicitRole;
|
|
102
|
+
|
|
103
|
+
// Check implicit role
|
|
104
|
+
const implicitFn = IMPLICIT_ROLES[el.tagName];
|
|
105
|
+
if (implicitFn) return implicitFn(el);
|
|
106
|
+
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function getAccessibleName(el) {
|
|
111
|
+
// aria-label takes precedence
|
|
112
|
+
const ariaLabel = el.getAttribute('aria-label');
|
|
113
|
+
if (ariaLabel) return ariaLabel.trim();
|
|
114
|
+
|
|
115
|
+
// aria-labelledby
|
|
116
|
+
const labelledBy = el.getAttribute('aria-labelledby');
|
|
117
|
+
if (labelledBy) {
|
|
118
|
+
const labels = labelledBy.split(' ')
|
|
119
|
+
.map(id => document.getElementById(id)?.textContent?.trim())
|
|
120
|
+
.filter(Boolean)
|
|
121
|
+
.join(' ');
|
|
122
|
+
if (labels) return labels;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// Input associated label
|
|
126
|
+
if (el.tagName === 'INPUT' || el.tagName === 'TEXTAREA' || el.tagName === 'SELECT') {
|
|
127
|
+
if (el.id) {
|
|
128
|
+
const label = document.querySelector('label[for="' + el.id + '"]');
|
|
129
|
+
if (label) return label.textContent?.trim();
|
|
130
|
+
}
|
|
131
|
+
// Check parent label
|
|
132
|
+
const parentLabel = el.closest('label');
|
|
133
|
+
if (parentLabel) {
|
|
134
|
+
const labelText = parentLabel.textContent?.replace(el.value || '', '')?.trim();
|
|
135
|
+
if (labelText) return labelText;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// Button/link content
|
|
140
|
+
if (el.tagName === 'BUTTON' || el.tagName === 'A') {
|
|
141
|
+
const text = el.textContent?.trim();
|
|
142
|
+
if (text) return text.substring(0, 100);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// Alt text for images
|
|
146
|
+
if (el.tagName === 'IMG') {
|
|
147
|
+
return el.alt || null;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// Title attribute fallback
|
|
151
|
+
if (el.title) return el.title.trim();
|
|
152
|
+
|
|
153
|
+
// Placeholder for inputs
|
|
154
|
+
if (el.placeholder) return null; // Return null, will add as /placeholder
|
|
155
|
+
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
function getStateFlags(el) {
|
|
160
|
+
const flags = [];
|
|
161
|
+
|
|
162
|
+
// Checked state
|
|
163
|
+
if (el.checked || el.getAttribute('aria-checked') === 'true') {
|
|
164
|
+
flags.push('checked');
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// Disabled state
|
|
168
|
+
if (el.disabled || el.getAttribute('aria-disabled') === 'true') {
|
|
169
|
+
flags.push('disabled');
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// Expanded state
|
|
173
|
+
if (el.getAttribute('aria-expanded') === 'true') {
|
|
174
|
+
flags.push('expanded');
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// Selected state
|
|
178
|
+
if (el.selected || el.getAttribute('aria-selected') === 'true') {
|
|
179
|
+
flags.push('selected');
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// Pressed state
|
|
183
|
+
if (el.getAttribute('aria-pressed') === 'true') {
|
|
184
|
+
flags.push('pressed');
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Required state
|
|
188
|
+
if (el.required || el.getAttribute('aria-required') === 'true') {
|
|
189
|
+
flags.push('required');
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
return flags;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
function isVisible(el) {
|
|
196
|
+
const style = window.getComputedStyle(el);
|
|
197
|
+
if (style.display === 'none' || style.visibility === 'hidden') return false;
|
|
198
|
+
const rect = el.getBoundingClientRect();
|
|
199
|
+
return rect.width > 0 && rect.height > 0;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
function isInteractiveOrLandmark(role) {
|
|
203
|
+
return INTERACTIVE_ROLES.has(role) || LANDMARK_ROLES.has(role);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
function shouldInclude(el) {
|
|
207
|
+
if (!isVisible(el)) return false;
|
|
208
|
+
const role = getRole(el);
|
|
209
|
+
if (!role) return false;
|
|
210
|
+
// Include interactive, landmarks, and structural elements
|
|
211
|
+
return isInteractiveOrLandmark(role) ||
|
|
212
|
+
role === 'heading' ||
|
|
213
|
+
role === 'img' ||
|
|
214
|
+
role === 'list' ||
|
|
215
|
+
role === 'listitem' ||
|
|
216
|
+
role === 'table' ||
|
|
217
|
+
role === 'row' ||
|
|
218
|
+
role === 'cell' ||
|
|
219
|
+
role === 'columnheader';
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
function assignRef(el, role) {
|
|
223
|
+
// Only assign refs to interactive elements
|
|
224
|
+
if (!INTERACTIVE_ROLES.has(role)) return null;
|
|
225
|
+
|
|
226
|
+
const ref = 'e' + refCounter++;
|
|
227
|
+
window.__chromeDevToolsRefs.set(ref, el);
|
|
228
|
+
return ref;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
function buildYaml(el, indent = 0) {
|
|
232
|
+
const role = getRole(el);
|
|
233
|
+
if (!role) return '';
|
|
234
|
+
|
|
235
|
+
const prefix = ' '.repeat(indent) + '- ';
|
|
236
|
+
const lines = [];
|
|
237
|
+
|
|
238
|
+
// Build the line: role "name" [flags] [ref=eN]
|
|
239
|
+
let line = prefix + role;
|
|
240
|
+
|
|
241
|
+
const name = getAccessibleName(el);
|
|
242
|
+
if (name) {
|
|
243
|
+
line += ' "' + name.replace(/"/g, '\\\\"') + '"';
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// Add heading level
|
|
247
|
+
if (role === 'heading') {
|
|
248
|
+
const level = el.tagName.match(/H(\\d)/)?.[1] || el.getAttribute('aria-level');
|
|
249
|
+
if (level) line += ' [level=' + level + ']';
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
// Add state flags
|
|
253
|
+
const flags = getStateFlags(el);
|
|
254
|
+
flags.forEach(flag => {
|
|
255
|
+
line += ' [' + flag + ']';
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
// Add ref for interactive elements
|
|
259
|
+
const ref = assignRef(el, role);
|
|
260
|
+
if (ref) {
|
|
261
|
+
line += ' [ref=' + ref + ']';
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
lines.push(line);
|
|
265
|
+
|
|
266
|
+
// Add metadata on subsequent lines
|
|
267
|
+
if (el.tagName === 'A' && el.href) {
|
|
268
|
+
lines.push(' '.repeat(indent + 1) + '/url: ' + el.href);
|
|
269
|
+
}
|
|
270
|
+
if (el.placeholder) {
|
|
271
|
+
lines.push(' '.repeat(indent + 1) + '/placeholder: "' + el.placeholder + '"');
|
|
272
|
+
}
|
|
273
|
+
if (el.tagName === 'INPUT' && el.value && el.type !== 'password') {
|
|
274
|
+
lines.push(' '.repeat(indent + 1) + '/value: "' + el.value.substring(0, 50) + '"');
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
// Process children
|
|
278
|
+
const children = Array.from(el.children);
|
|
279
|
+
children.forEach(child => {
|
|
280
|
+
const childYaml = buildYaml(child, indent + 1);
|
|
281
|
+
if (childYaml) lines.push(childYaml);
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
return lines.join('\\n');
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
function getSnapshot() {
|
|
288
|
+
const lines = [];
|
|
289
|
+
|
|
290
|
+
// Start from body
|
|
291
|
+
const children = Array.from(document.body.children);
|
|
292
|
+
children.forEach(child => {
|
|
293
|
+
const yaml = buildYaml(child, 0);
|
|
294
|
+
if (yaml) lines.push(yaml);
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
// Save ref counter for next snapshot
|
|
298
|
+
window.__chromeDevToolsRefCounter = refCounter;
|
|
299
|
+
|
|
300
|
+
return lines.join('\\n');
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
return getSnapshot();
|
|
304
|
+
})();
|
|
305
|
+
`;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
async function ariaSnapshot() {
|
|
309
|
+
const args = parseArgs(process.argv.slice(2));
|
|
310
|
+
|
|
311
|
+
try {
|
|
312
|
+
const browser = await getBrowser({
|
|
313
|
+
headless: args.headless !== 'false',
|
|
314
|
+
});
|
|
315
|
+
|
|
316
|
+
const page = await getPage(browser);
|
|
317
|
+
|
|
318
|
+
// Navigate if URL provided
|
|
319
|
+
if (args.url) {
|
|
320
|
+
await page.goto(args.url, {
|
|
321
|
+
waitUntil: args['wait-until'] || 'networkidle2',
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
// Get ARIA snapshot
|
|
326
|
+
const snapshot = await page.evaluate(getAriaSnapshotScript());
|
|
327
|
+
|
|
328
|
+
// Build result
|
|
329
|
+
const result = {
|
|
330
|
+
success: true,
|
|
331
|
+
url: page.url(),
|
|
332
|
+
title: await page.title(),
|
|
333
|
+
format: 'yaml',
|
|
334
|
+
snapshot,
|
|
335
|
+
};
|
|
336
|
+
|
|
337
|
+
// Output to file or stdout
|
|
338
|
+
if (args.output) {
|
|
339
|
+
const outputPath = args.output;
|
|
340
|
+
|
|
341
|
+
// Ensure snapshots directory exists
|
|
342
|
+
const outputDir = path.dirname(outputPath);
|
|
343
|
+
|
|
344
|
+
await fs.mkdir(outputDir, { recursive: true });
|
|
345
|
+
|
|
346
|
+
// Write YAML snapshot
|
|
347
|
+
await fs.writeFile(outputPath, snapshot, 'utf8');
|
|
348
|
+
|
|
349
|
+
outputJSON({
|
|
350
|
+
success: true,
|
|
351
|
+
output: path.resolve(outputPath),
|
|
352
|
+
url: page.url(),
|
|
353
|
+
});
|
|
354
|
+
} else {
|
|
355
|
+
// Output to stdout
|
|
356
|
+
outputJSON(result);
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
// Default: disconnect to keep browser running for session persistence
|
|
360
|
+
// Use --close true to fully close browser
|
|
361
|
+
await (args.close === 'true' ? closeBrowser() : disconnectBrowser());
|
|
362
|
+
process.exit(0);
|
|
363
|
+
} catch (error) {
|
|
364
|
+
outputError(error);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
ariaSnapshot();
|