@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,92 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Click an element
|
|
4
|
+
* Usage: node click.js --selector ".button" [--url https://example.com] [--wait-for ".result"]
|
|
5
|
+
* Supports both CSS and XPath selectors:
|
|
6
|
+
* - CSS: node click.js --selector "button.submit"
|
|
7
|
+
* - XPath: node click.js --selector "//button[contains(text(),'Submit')]"
|
|
8
|
+
*/
|
|
9
|
+
import {
|
|
10
|
+
getBrowser,
|
|
11
|
+
getPage,
|
|
12
|
+
closeBrowser,
|
|
13
|
+
disconnectBrowser,
|
|
14
|
+
parseArgs,
|
|
15
|
+
outputJSON,
|
|
16
|
+
outputError,
|
|
17
|
+
} from './lib/browser.js';
|
|
18
|
+
import { parseSelector, waitForElement, clickElement, enhanceError } from './lib/selector.js';
|
|
19
|
+
|
|
20
|
+
async function click() {
|
|
21
|
+
const args = parseArgs(process.argv.slice(2));
|
|
22
|
+
|
|
23
|
+
if (!args.selector) {
|
|
24
|
+
outputError(new Error('--selector is required'));
|
|
25
|
+
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
try {
|
|
30
|
+
const browser = await getBrowser({
|
|
31
|
+
headless: args.headless !== 'false',
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
const page = await getPage(browser);
|
|
35
|
+
|
|
36
|
+
// Navigate if URL provided
|
|
37
|
+
if (args.url) {
|
|
38
|
+
await page.goto(args.url, {
|
|
39
|
+
waitUntil: args['wait-until'] || 'networkidle2',
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Parse and validate selector
|
|
44
|
+
const parsed = parseSelector(args.selector);
|
|
45
|
+
|
|
46
|
+
// Wait for element based on selector type
|
|
47
|
+
await waitForElement(page, parsed, {
|
|
48
|
+
visible: true,
|
|
49
|
+
timeout: Number.parseInt(args.timeout || '5000'),
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
// Set up navigation promise BEFORE clicking (in case click triggers immediate navigation)
|
|
53
|
+
const navigationPromise = page
|
|
54
|
+
.waitForNavigation({
|
|
55
|
+
waitUntil: 'load',
|
|
56
|
+
timeout: 5000,
|
|
57
|
+
})
|
|
58
|
+
.catch(() => null); // Catch timeout - navigation may not occur
|
|
59
|
+
|
|
60
|
+
// Click element
|
|
61
|
+
await clickElement(page, parsed);
|
|
62
|
+
|
|
63
|
+
// Wait for optional selector after click
|
|
64
|
+
if (args['wait-for']) {
|
|
65
|
+
await page.waitForSelector(args['wait-for'], {
|
|
66
|
+
timeout: Number.parseInt(args.timeout || '5000'),
|
|
67
|
+
});
|
|
68
|
+
} else {
|
|
69
|
+
// Wait for navigation to complete (or timeout if no navigation)
|
|
70
|
+
await navigationPromise;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
outputJSON({
|
|
74
|
+
success: true,
|
|
75
|
+
url: page.url(),
|
|
76
|
+
title: await page.title(),
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
// Default: disconnect to keep browser running for session persistence
|
|
80
|
+
// Use --close true to fully close browser
|
|
81
|
+
await (args.close === 'true' ? closeBrowser() : disconnectBrowser());
|
|
82
|
+
process.exit(0);
|
|
83
|
+
} catch (error) {
|
|
84
|
+
// Enhance error message with troubleshooting tips
|
|
85
|
+
const enhanced = enhanceError(error, args.selector);
|
|
86
|
+
|
|
87
|
+
outputError(enhanced);
|
|
88
|
+
process.exit(1);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
click();
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Monitor console messages
|
|
4
|
+
* Usage: node console.js --url https://example.com [--types error,warn] [--duration 5000]
|
|
5
|
+
*/
|
|
6
|
+
import {
|
|
7
|
+
getBrowser,
|
|
8
|
+
getPage,
|
|
9
|
+
closeBrowser,
|
|
10
|
+
disconnectBrowser,
|
|
11
|
+
parseArgs,
|
|
12
|
+
outputJSON,
|
|
13
|
+
outputError,
|
|
14
|
+
} from './lib/browser.js';
|
|
15
|
+
|
|
16
|
+
async function monitorConsole() {
|
|
17
|
+
const args = parseArgs(process.argv.slice(2));
|
|
18
|
+
|
|
19
|
+
if (!args.url) {
|
|
20
|
+
outputError(new Error('--url is required'));
|
|
21
|
+
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
try {
|
|
26
|
+
const browser = await getBrowser({
|
|
27
|
+
headless: args.headless !== 'false',
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
const page = await getPage(browser);
|
|
31
|
+
|
|
32
|
+
const messages = [];
|
|
33
|
+
const filterTypes = args.types ? args.types.split(',') : null;
|
|
34
|
+
|
|
35
|
+
// Listen for console messages
|
|
36
|
+
page.on('console', (msg) => {
|
|
37
|
+
const type = msg.type();
|
|
38
|
+
|
|
39
|
+
if (!filterTypes || filterTypes.includes(type)) {
|
|
40
|
+
messages.push({
|
|
41
|
+
type,
|
|
42
|
+
text: msg.text(),
|
|
43
|
+
location: msg.location(),
|
|
44
|
+
timestamp: Date.now(),
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
// Listen for page errors
|
|
50
|
+
page.on('pageerror', (error) => {
|
|
51
|
+
messages.push({
|
|
52
|
+
type: 'pageerror',
|
|
53
|
+
text: error.message,
|
|
54
|
+
stack: error.stack,
|
|
55
|
+
timestamp: Date.now(),
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
// Navigate
|
|
60
|
+
await page.goto(args.url, {
|
|
61
|
+
waitUntil: args['wait-until'] || 'networkidle2',
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
// Wait for additional time if specified
|
|
65
|
+
if (args.duration) {
|
|
66
|
+
await new Promise((resolve) => setTimeout(resolve, Number.parseInt(args.duration)));
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
outputJSON({
|
|
70
|
+
success: true,
|
|
71
|
+
url: page.url(),
|
|
72
|
+
messageCount: messages.length,
|
|
73
|
+
messages,
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
// Default: disconnect to keep browser running for session persistence
|
|
77
|
+
// Use --close true to fully close browser
|
|
78
|
+
await (args.close === 'true' ? closeBrowser() : disconnectBrowser());
|
|
79
|
+
process.exit(0);
|
|
80
|
+
} catch (error) {
|
|
81
|
+
outputError(error);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
monitorConsole();
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Execute JavaScript in page context
|
|
4
|
+
* Usage: node evaluate.js --script "document.title" [--url https://example.com]
|
|
5
|
+
*/
|
|
6
|
+
import {
|
|
7
|
+
getBrowser,
|
|
8
|
+
getPage,
|
|
9
|
+
closeBrowser,
|
|
10
|
+
disconnectBrowser,
|
|
11
|
+
parseArgs,
|
|
12
|
+
outputJSON,
|
|
13
|
+
outputError,
|
|
14
|
+
} from './lib/browser.js';
|
|
15
|
+
|
|
16
|
+
async function evaluate() {
|
|
17
|
+
const args = parseArgs(process.argv.slice(2));
|
|
18
|
+
|
|
19
|
+
if (!args.script) {
|
|
20
|
+
outputError(new Error('--script is required'));
|
|
21
|
+
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
try {
|
|
26
|
+
const browser = await getBrowser({
|
|
27
|
+
headless: args.headless !== 'false',
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
const page = await getPage(browser);
|
|
31
|
+
|
|
32
|
+
// Navigate if URL provided
|
|
33
|
+
if (args.url) {
|
|
34
|
+
await page.goto(args.url, {
|
|
35
|
+
waitUntil: args['wait-until'] || 'networkidle2',
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const result = await page.evaluate((script) => {
|
|
40
|
+
// eslint-disable-next-line no-eval
|
|
41
|
+
return eval(script);
|
|
42
|
+
}, args.script);
|
|
43
|
+
|
|
44
|
+
outputJSON({
|
|
45
|
+
success: true,
|
|
46
|
+
result,
|
|
47
|
+
url: page.url(),
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
// Default: disconnect to keep browser running for session persistence
|
|
51
|
+
// Use --close true to fully close browser
|
|
52
|
+
await (args.close === 'true' ? closeBrowser() : disconnectBrowser());
|
|
53
|
+
process.exit(0);
|
|
54
|
+
} catch (error) {
|
|
55
|
+
outputError(error);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
evaluate();
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Fill form fields
|
|
4
|
+
* Usage: node fill.js --selector "#input" --value "text" [--url https://example.com]
|
|
5
|
+
* Supports both CSS and XPath selectors:
|
|
6
|
+
* - CSS: node fill.js --selector "#email" --value "user@example.com"
|
|
7
|
+
* - XPath: node fill.js --selector "//input[@type='email']" --value "user@example.com"
|
|
8
|
+
*/
|
|
9
|
+
import {
|
|
10
|
+
getBrowser,
|
|
11
|
+
getPage,
|
|
12
|
+
closeBrowser,
|
|
13
|
+
disconnectBrowser,
|
|
14
|
+
parseArgs,
|
|
15
|
+
outputJSON,
|
|
16
|
+
outputError,
|
|
17
|
+
} from './lib/browser.js';
|
|
18
|
+
import { parseSelector, waitForElement, typeIntoElement, enhanceError } from './lib/selector.js';
|
|
19
|
+
|
|
20
|
+
async function fill() {
|
|
21
|
+
const args = parseArgs(process.argv.slice(2));
|
|
22
|
+
|
|
23
|
+
if (!args.selector) {
|
|
24
|
+
outputError(new Error('--selector is required'));
|
|
25
|
+
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
if (!args.value) {
|
|
30
|
+
outputError(new Error('--value is required'));
|
|
31
|
+
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
try {
|
|
36
|
+
const browser = await getBrowser({
|
|
37
|
+
headless: args.headless !== 'false',
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
const page = await getPage(browser);
|
|
41
|
+
|
|
42
|
+
// Navigate if URL provided
|
|
43
|
+
if (args.url) {
|
|
44
|
+
await page.goto(args.url, {
|
|
45
|
+
waitUntil: args['wait-until'] || 'networkidle2',
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Parse and validate selector
|
|
50
|
+
const parsed = parseSelector(args.selector);
|
|
51
|
+
|
|
52
|
+
// Wait for element based on selector type
|
|
53
|
+
await waitForElement(page, parsed, {
|
|
54
|
+
visible: true,
|
|
55
|
+
timeout: Number.parseInt(args.timeout || '5000'),
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
// Type into element
|
|
59
|
+
await typeIntoElement(page, parsed, args.value, {
|
|
60
|
+
clear: args.clear === 'true',
|
|
61
|
+
delay: Number.parseInt(args.delay || '0'),
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
outputJSON({
|
|
65
|
+
success: true,
|
|
66
|
+
selector: args.selector,
|
|
67
|
+
value: args.value,
|
|
68
|
+
url: page.url(),
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
// Default: disconnect to keep browser running for session persistence
|
|
72
|
+
// Use --close true to fully close browser
|
|
73
|
+
await (args.close === 'true' ? closeBrowser() : disconnectBrowser());
|
|
74
|
+
process.exit(0);
|
|
75
|
+
} catch (error) {
|
|
76
|
+
// Enhance error message with troubleshooting tips
|
|
77
|
+
const enhanced = enhanceError(error, args.selector);
|
|
78
|
+
|
|
79
|
+
outputError(enhanced);
|
|
80
|
+
process.exit(1);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
fill();
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Inject authentication cookies/tokens into browser session
|
|
4
|
+
* Usage: node inject-auth.js --url https://example.com --cookies '[{"name":"token","value":"xxx","domain":".example.com"}]'
|
|
5
|
+
* node inject-auth.js --url https://example.com --token "Bearer xxx" [--header Authorization]
|
|
6
|
+
* node inject-auth.js --url https://example.com --local-storage '{"key":"value"}'
|
|
7
|
+
* node inject-auth.js --url https://example.com --session-storage '{"key":"value"}'
|
|
8
|
+
*
|
|
9
|
+
* This script injects authentication data into browser session for testing protected routes.
|
|
10
|
+
* The session persists across script executions until --close true is used.
|
|
11
|
+
*
|
|
12
|
+
* Workflow for testing protected routes:
|
|
13
|
+
* 1. User manually logs into the site in their browser
|
|
14
|
+
* 2. User extracts cookies/tokens from browser DevTools
|
|
15
|
+
* 3. Run this script to inject auth into puppeteer session
|
|
16
|
+
* 4. Run other scripts (screenshot, navigate, etc.) which will use authenticated session
|
|
17
|
+
*
|
|
18
|
+
* Session behavior:
|
|
19
|
+
* --close false : Keep browser running (default for chaining)
|
|
20
|
+
* --close true : Close browser completely and clear session
|
|
21
|
+
*/
|
|
22
|
+
import {
|
|
23
|
+
getBrowser,
|
|
24
|
+
getPage,
|
|
25
|
+
closeBrowser,
|
|
26
|
+
disconnectBrowser,
|
|
27
|
+
parseArgs,
|
|
28
|
+
outputJSON,
|
|
29
|
+
outputError,
|
|
30
|
+
saveAuthSession,
|
|
31
|
+
clearAuthSession,
|
|
32
|
+
} from './lib/browser.js';
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Parse cookies from JSON string or file
|
|
36
|
+
* @param {string} cookiesInput - JSON string or file path
|
|
37
|
+
* @returns {Array} - Array of cookie objects
|
|
38
|
+
*/
|
|
39
|
+
function parseCookies(cookiesInput) {
|
|
40
|
+
try {
|
|
41
|
+
// Try parsing as JSON string
|
|
42
|
+
return JSON.parse(cookiesInput);
|
|
43
|
+
} catch {
|
|
44
|
+
throw new Error(
|
|
45
|
+
`Invalid cookies format. Expected JSON array: [{"name":"cookie_name","value":"cookie_value","domain":".example.com"}]`,
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Parse storage data from JSON string
|
|
52
|
+
* @param {string} storageInput - JSON string
|
|
53
|
+
* @returns {Object} - Storage key-value pairs
|
|
54
|
+
*/
|
|
55
|
+
function parseStorage(storageInput) {
|
|
56
|
+
try {
|
|
57
|
+
return JSON.parse(storageInput);
|
|
58
|
+
} catch {
|
|
59
|
+
throw new Error(`Invalid storage format. Expected JSON object: {"key":"value"}`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
async function injectAuth() {
|
|
64
|
+
const args = parseArgs(process.argv.slice(2));
|
|
65
|
+
|
|
66
|
+
if (!args.url) {
|
|
67
|
+
outputError(new Error('--url is required (base URL for the protected site)'));
|
|
68
|
+
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Validate at least one auth method provided
|
|
73
|
+
if (!args.cookies && !args.token && !args['local-storage'] && !args['session-storage']) {
|
|
74
|
+
outputError(
|
|
75
|
+
new Error('At least one auth method required: --cookies, --token, --local-storage, or --session-storage'),
|
|
76
|
+
);
|
|
77
|
+
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
try {
|
|
82
|
+
const browser = await getBrowser({
|
|
83
|
+
headless: args.headless !== 'false',
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
const page = await getPage(browser);
|
|
87
|
+
|
|
88
|
+
// Navigate to the URL first to set the domain context
|
|
89
|
+
await page.goto(args.url, {
|
|
90
|
+
waitUntil: args['wait-until'] || 'networkidle2',
|
|
91
|
+
timeout: Number.parseInt(args.timeout || '30000'),
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
const result = {
|
|
95
|
+
success: true,
|
|
96
|
+
url: args.url,
|
|
97
|
+
injected: [],
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
// Inject cookies
|
|
101
|
+
if (args.cookies) {
|
|
102
|
+
const cookies = parseCookies(args.cookies);
|
|
103
|
+
|
|
104
|
+
// Validate and normalize cookies
|
|
105
|
+
const normalizedCookies = cookies.map((cookie) => {
|
|
106
|
+
if (!cookie.name || !cookie.value) {
|
|
107
|
+
throw new Error(`Cookie must have 'name' and 'value' properties`);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// Extract domain from URL if not provided
|
|
111
|
+
if (!cookie.domain) {
|
|
112
|
+
const urlObj = new URL(args.url);
|
|
113
|
+
|
|
114
|
+
cookie.domain = urlObj.hostname;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return {
|
|
118
|
+
name: cookie.name,
|
|
119
|
+
value: cookie.value,
|
|
120
|
+
domain: cookie.domain,
|
|
121
|
+
path: cookie.path || '/',
|
|
122
|
+
httpOnly: cookie.httpOnly === undefined ? false : cookie.httpOnly,
|
|
123
|
+
secure: cookie.secure === undefined ? args.url.startsWith('https') : cookie.secure,
|
|
124
|
+
sameSite: cookie.sameSite || 'Lax',
|
|
125
|
+
...(cookie.expires && { expires: cookie.expires }),
|
|
126
|
+
};
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
await page.setCookie(...normalizedCookies);
|
|
130
|
+
result.injected.push({
|
|
131
|
+
type: 'cookies',
|
|
132
|
+
count: normalizedCookies.length,
|
|
133
|
+
names: normalizedCookies.map((c) => c.name),
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// Inject Bearer token via localStorage (common pattern)
|
|
138
|
+
if (args.token) {
|
|
139
|
+
const tokenKey = args['token-key'] || 'access_token';
|
|
140
|
+
const token = args.token.startsWith('Bearer ') ? args.token.slice(7) : args.token;
|
|
141
|
+
|
|
142
|
+
await page.evaluate(
|
|
143
|
+
(key, value) => {
|
|
144
|
+
localStorage.setItem(key, value);
|
|
145
|
+
},
|
|
146
|
+
tokenKey,
|
|
147
|
+
token,
|
|
148
|
+
);
|
|
149
|
+
|
|
150
|
+
result.injected.push({
|
|
151
|
+
type: 'token',
|
|
152
|
+
key: tokenKey,
|
|
153
|
+
storage: 'localStorage',
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
// Also set Authorization header for future requests if header option provided
|
|
157
|
+
if (args.header) {
|
|
158
|
+
await page.setExtraHTTPHeaders({
|
|
159
|
+
[args.header]: args.token.startsWith('Bearer ') ? args.token : `Bearer ${args.token}`,
|
|
160
|
+
});
|
|
161
|
+
result.injected.push({
|
|
162
|
+
type: 'header',
|
|
163
|
+
name: args.header,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// Inject localStorage items
|
|
169
|
+
if (args['local-storage']) {
|
|
170
|
+
const storageData = parseStorage(args['local-storage']);
|
|
171
|
+
|
|
172
|
+
await page.evaluate((data) => {
|
|
173
|
+
Object.entries(data).forEach(([key, value]) => {
|
|
174
|
+
localStorage.setItem(key, typeof value === 'string' ? value : JSON.stringify(value));
|
|
175
|
+
});
|
|
176
|
+
}, storageData);
|
|
177
|
+
|
|
178
|
+
result.injected.push({
|
|
179
|
+
type: 'localStorage',
|
|
180
|
+
keys: Object.keys(storageData),
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// Inject sessionStorage items
|
|
185
|
+
if (args['session-storage']) {
|
|
186
|
+
const storageData = parseStorage(args['session-storage']);
|
|
187
|
+
|
|
188
|
+
await page.evaluate((data) => {
|
|
189
|
+
Object.entries(data).forEach(([key, value]) => {
|
|
190
|
+
sessionStorage.setItem(key, typeof value === 'string' ? value : JSON.stringify(value));
|
|
191
|
+
});
|
|
192
|
+
}, storageData);
|
|
193
|
+
|
|
194
|
+
result.injected.push({
|
|
195
|
+
type: 'sessionStorage',
|
|
196
|
+
keys: Object.keys(storageData),
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// Reload page to apply auth (optional, use --reload true)
|
|
201
|
+
if (args.reload === 'true') {
|
|
202
|
+
await page.reload({ waitUntil: 'networkidle2' });
|
|
203
|
+
result.reloaded = true;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// Save auth session to file for persistence across script executions
|
|
207
|
+
const authSessionData = {};
|
|
208
|
+
|
|
209
|
+
if (args.cookies) {
|
|
210
|
+
authSessionData.cookies = parseCookies(args.cookies);
|
|
211
|
+
}
|
|
212
|
+
if (args['local-storage']) {
|
|
213
|
+
authSessionData.localStorage = parseStorage(args['local-storage']);
|
|
214
|
+
}
|
|
215
|
+
if (args['session-storage']) {
|
|
216
|
+
authSessionData.sessionStorage = parseStorage(args['session-storage']);
|
|
217
|
+
}
|
|
218
|
+
if (args.token && args.header) {
|
|
219
|
+
authSessionData.headers = {
|
|
220
|
+
[args.header]: args.token.startsWith('Bearer ') ? args.token : `Bearer ${args.token}`,
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// Clear existing auth if --clear flag used
|
|
225
|
+
if (args.clear === 'true') {
|
|
226
|
+
clearAuthSession();
|
|
227
|
+
result.cleared = true;
|
|
228
|
+
} else if (Object.keys(authSessionData).length > 0) {
|
|
229
|
+
saveAuthSession(authSessionData);
|
|
230
|
+
result.persisted = true;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// Verify auth by checking page title and URL after injection
|
|
234
|
+
result.finalUrl = page.url();
|
|
235
|
+
result.title = await page.title();
|
|
236
|
+
|
|
237
|
+
outputJSON(result);
|
|
238
|
+
|
|
239
|
+
// Default: disconnect to keep browser running for session persistence
|
|
240
|
+
await (args.close === 'true' ? closeBrowser() : disconnectBrowser());
|
|
241
|
+
process.exit(0);
|
|
242
|
+
} catch (error) {
|
|
243
|
+
outputError(error);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
injectAuth();
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# System dependencies installation script for Chrome DevTools Agent Skill
|
|
3
|
+
# macOS-only: Chrome/Chromium includes all dependencies
|
|
4
|
+
|
|
5
|
+
echo "✅ macOS detected - no additional system dependencies needed"
|
|
6
|
+
echo ""
|
|
7
|
+
echo "Chrome/Chromium runs natively on macOS without additional libraries."
|
|
8
|
+
echo ""
|
|
9
|
+
echo "📝 To install the skill, run:"
|
|
10
|
+
echo " cd .claude/skills/chrome-devtools/scripts && npm install"
|
|
11
|
+
echo ""
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Installation script for Chrome DevTools Agent Skill (macOS)
|
|
3
|
+
|
|
4
|
+
set -e
|
|
5
|
+
|
|
6
|
+
echo "🚀 Installing Chrome DevTools Agent Skill..."
|
|
7
|
+
echo ""
|
|
8
|
+
|
|
9
|
+
# Check Node.js version
|
|
10
|
+
echo "Checking Node.js version..."
|
|
11
|
+
NODE_VERSION=$(node --version | cut -d'v' -f2 | cut -d'.' -f1)
|
|
12
|
+
|
|
13
|
+
if [ "$NODE_VERSION" -lt 18 ]; then
|
|
14
|
+
echo "❌ Error: Node.js 18+ is required. Current version: $(node --version)"
|
|
15
|
+
echo " Install via Homebrew: brew install node"
|
|
16
|
+
exit 1
|
|
17
|
+
fi
|
|
18
|
+
|
|
19
|
+
echo "✓ Node.js version: $(node --version)"
|
|
20
|
+
echo ""
|
|
21
|
+
echo "Platform: macOS (no system dependencies needed)"
|
|
22
|
+
echo ""
|
|
23
|
+
|
|
24
|
+
# Install Node.js dependencies
|
|
25
|
+
echo "Installing Node.js dependencies..."
|
|
26
|
+
npm install
|
|
27
|
+
|
|
28
|
+
echo ""
|
|
29
|
+
echo "✅ Installation complete!"
|
|
30
|
+
echo ""
|
|
31
|
+
echo "Test the installation:"
|
|
32
|
+
echo " node navigate.js --url https://example.com"
|
|
33
|
+
echo ""
|
|
34
|
+
echo "For more information:"
|
|
35
|
+
echo " cat README.md"
|
|
36
|
+
echo ""
|