@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.
Files changed (415) hide show
  1. package/License +21 -0
  2. package/README.md +142 -0
  3. package/bin/index.js +5 -0
  4. package/dist/index.js +1 -0
  5. package/package.json +65 -0
  6. package/templates/claude/agents/brainstormer.md +113 -0
  7. package/templates/claude/agents/code-reviewer.md +157 -0
  8. package/templates/claude/agents/copywriter.md +110 -0
  9. package/templates/claude/agents/database-admin.md +92 -0
  10. package/templates/claude/agents/debugger.md +137 -0
  11. package/templates/claude/agents/docs-manager.md +208 -0
  12. package/templates/claude/agents/fullstack-developer.md +95 -0
  13. package/templates/claude/agents/git-manager.md +394 -0
  14. package/templates/claude/agents/journal-writer.md +113 -0
  15. package/templates/claude/agents/mcp-manager.md +89 -0
  16. package/templates/claude/agents/planner.md +108 -0
  17. package/templates/claude/agents/project-manager.md +125 -0
  18. package/templates/claude/agents/registry.json +304 -0
  19. package/templates/claude/agents/researcher.md +37 -0
  20. package/templates/claude/agents/scout-external.md +140 -0
  21. package/templates/claude/agents/scout.md +106 -0
  22. package/templates/claude/agents/tester.md +105 -0
  23. package/templates/claude/agents/ui-ux-designer.md +208 -0
  24. package/templates/claude/commands/ask.md +56 -0
  25. package/templates/claude/commands/bootstrap/auto/fast.md +106 -0
  26. package/templates/claude/commands/bootstrap/auto/parallel.md +64 -0
  27. package/templates/claude/commands/bootstrap/auto.md +110 -0
  28. package/templates/claude/commands/bootstrap.md +130 -0
  29. package/templates/claude/commands/brainstorm.md +75 -0
  30. package/templates/claude/commands/code/auto.md +198 -0
  31. package/templates/claude/commands/code/no-test.md +172 -0
  32. package/templates/claude/commands/code/parallel.md +100 -0
  33. package/templates/claude/commands/code.md +197 -0
  34. package/templates/claude/commands/coding-level.md +37 -0
  35. package/templates/claude/commands/content/cro.md +41 -0
  36. package/templates/claude/commands/content/enhance.md +12 -0
  37. package/templates/claude/commands/content/fast.md +11 -0
  38. package/templates/claude/commands/content/good.md +14 -0
  39. package/templates/claude/commands/cook/auto/fast.md +26 -0
  40. package/templates/claude/commands/cook/auto/parallel.md +49 -0
  41. package/templates/claude/commands/cook/auto.md +15 -0
  42. package/templates/claude/commands/cook.md +101 -0
  43. package/templates/claude/commands/debug.md +13 -0
  44. package/templates/claude/commands/docs/init.md +37 -0
  45. package/templates/claude/commands/docs/summarize.md +22 -0
  46. package/templates/claude/commands/docs/update.md +78 -0
  47. package/templates/claude/commands/fix/ci.md +17 -0
  48. package/templates/claude/commands/fix/fast.md +18 -0
  49. package/templates/claude/commands/fix/hard.md +35 -0
  50. package/templates/claude/commands/fix/logs.md +26 -0
  51. package/templates/claude/commands/fix/parallel.md +54 -0
  52. package/templates/claude/commands/fix/test.md +20 -0
  53. package/templates/claude/commands/fix/types.md +9 -0
  54. package/templates/claude/commands/fix/ui.md +33 -0
  55. package/templates/claude/commands/fix.md +43 -0
  56. package/templates/claude/commands/git/cm.md +5 -0
  57. package/templates/claude/commands/git/cp.md +4 -0
  58. package/templates/claude/commands/git/merge.md +40 -0
  59. package/templates/claude/commands/git/pr.md +50 -0
  60. package/templates/claude/commands/journal.md +7 -0
  61. package/templates/claude/commands/kanban.md +99 -0
  62. package/templates/claude/commands/plan/archive.md +57 -0
  63. package/templates/claude/commands/plan/ci.md +33 -0
  64. package/templates/claude/commands/plan/cro.md +67 -0
  65. package/templates/claude/commands/plan/fast.md +66 -0
  66. package/templates/claude/commands/plan/hard.md +92 -0
  67. package/templates/claude/commands/plan/parallel.md +129 -0
  68. package/templates/claude/commands/plan/two.md +45 -0
  69. package/templates/claude/commands/plan/validate.md +117 -0
  70. package/templates/claude/commands/plan.md +30 -0
  71. package/templates/claude/commands/preview.md +87 -0
  72. package/templates/claude/commands/registry.json +313 -0
  73. package/templates/claude/commands/review/codebase/parallel.md +122 -0
  74. package/templates/claude/commands/review/codebase.md +47 -0
  75. package/templates/claude/commands/scout/ext.md +35 -0
  76. package/templates/claude/commands/scout.md +28 -0
  77. package/templates/claude/commands/skill/add.md +36 -0
  78. package/templates/claude/commands/skill/create.md +29 -0
  79. package/templates/claude/commands/skill/fix-logs.md +22 -0
  80. package/templates/claude/commands/skill/optimize/auto.md +25 -0
  81. package/templates/claude/commands/skill/optimize.md +34 -0
  82. package/templates/claude/commands/skill/plan.md +45 -0
  83. package/templates/claude/commands/test/ui.md +91 -0
  84. package/templates/claude/commands/test.md +8 -0
  85. package/templates/claude/commands/use-mcp.md +34 -0
  86. package/templates/claude/commands/watzup.md +8 -0
  87. package/templates/claude/commands/worktree.md +126 -0
  88. package/templates/claude/hooks/dev-rules-reminder.cjs +258 -0
  89. package/templates/claude/hooks/docs/README.md +42 -0
  90. package/templates/claude/hooks/lib/cctk-config-utils.cjs +751 -0
  91. package/templates/claude/hooks/lib/cctk-paths.cjs +106 -0
  92. package/templates/claude/hooks/lib/context-tracker.cjs +346 -0
  93. package/templates/claude/hooks/privacy-block.cjs +289 -0
  94. package/templates/claude/hooks/registry.json +77 -0
  95. package/templates/claude/hooks/scout-block/broad-pattern-detector.cjs +293 -0
  96. package/templates/claude/hooks/scout-block/error-formatter.cjs +156 -0
  97. package/templates/claude/hooks/scout-block/path-extractor.cjs +359 -0
  98. package/templates/claude/hooks/scout-block/pattern-matcher.cjs +184 -0
  99. package/templates/claude/hooks/scout-block/vendor/ignore.js +626 -0
  100. package/templates/claude/hooks/scout-block.cjs +167 -0
  101. package/templates/claude/hooks/session-end.cjs +35 -0
  102. package/templates/claude/hooks/session-init.cjs +214 -0
  103. package/templates/claude/hooks/subagent-init.cjs +161 -0
  104. package/templates/claude/hooks/write-compact-marker.cjs +153 -0
  105. package/templates/claude/output-styles/coding-level-1.md +148 -0
  106. package/templates/claude/output-styles/coding-level-2.md +159 -0
  107. package/templates/claude/output-styles/coding-level-3.md +91 -0
  108. package/templates/claude/scripts/README.md +33 -0
  109. package/templates/claude/scripts/generate-catalogs.cjs +318 -0
  110. package/templates/claude/scripts/registry.json +48 -0
  111. package/templates/claude/scripts/set-active-plan.cjs +45 -0
  112. package/templates/claude/scripts/validate-docs.cjs +447 -0
  113. package/templates/claude/scripts/worktree.cjs +658 -0
  114. package/templates/claude/skills/README.md +112 -0
  115. package/templates/claude/skills/ai-artist/SKILL.md +75 -0
  116. package/templates/claude/skills/ai-artist/references/advanced-techniques.md +184 -0
  117. package/templates/claude/skills/ai-artist/references/domain-code.md +66 -0
  118. package/templates/claude/skills/ai-artist/references/domain-data.md +72 -0
  119. package/templates/claude/skills/ai-artist/references/domain-marketing.md +66 -0
  120. package/templates/claude/skills/ai-artist/references/domain-patterns.md +33 -0
  121. package/templates/claude/skills/ai-artist/references/domain-writing.md +68 -0
  122. package/templates/claude/skills/ai-artist/references/image-prompting.md +141 -0
  123. package/templates/claude/skills/ai-artist/references/llm-prompting.md +165 -0
  124. package/templates/claude/skills/ai-artist/references/nano-banana.md +59 -0
  125. package/templates/claude/skills/ai-artist/references/reasoning-techniques.md +201 -0
  126. package/templates/claude/skills/backend-development/SKILL.md +95 -0
  127. package/templates/claude/skills/backend-development/references/backend-api-design.md +495 -0
  128. package/templates/claude/skills/backend-development/references/backend-architecture.md +454 -0
  129. package/templates/claude/skills/backend-development/references/backend-authentication.md +338 -0
  130. package/templates/claude/skills/backend-development/references/backend-code-quality.md +659 -0
  131. package/templates/claude/skills/backend-development/references/backend-debugging.md +904 -0
  132. package/templates/claude/skills/backend-development/references/backend-devops.md +494 -0
  133. package/templates/claude/skills/backend-development/references/backend-mindset.md +387 -0
  134. package/templates/claude/skills/backend-development/references/backend-performance.md +397 -0
  135. package/templates/claude/skills/backend-development/references/backend-security.md +290 -0
  136. package/templates/claude/skills/backend-development/references/backend-technologies.md +256 -0
  137. package/templates/claude/skills/backend-development/references/backend-testing.md +429 -0
  138. package/templates/claude/skills/better-auth/SKILL.md +204 -0
  139. package/templates/claude/skills/better-auth/references/advanced-features.md +553 -0
  140. package/templates/claude/skills/better-auth/references/database-integration.md +577 -0
  141. package/templates/claude/skills/better-auth/references/email-password-auth.md +416 -0
  142. package/templates/claude/skills/better-auth/references/oauth-providers.md +430 -0
  143. package/templates/claude/skills/better-auth/scripts/better_auth_init.py +521 -0
  144. package/templates/claude/skills/chrome-devtools/SKILL.md +473 -0
  145. package/templates/claude/skills/chrome-devtools/references/cdp-domains.md +694 -0
  146. package/templates/claude/skills/chrome-devtools/references/performance-guide.md +940 -0
  147. package/templates/claude/skills/chrome-devtools/references/puppeteer-reference.md +953 -0
  148. package/templates/claude/skills/chrome-devtools/scripts/README.md +288 -0
  149. package/templates/claude/skills/chrome-devtools/scripts/aria-snapshot.js +368 -0
  150. package/templates/claude/skills/chrome-devtools/scripts/click.js +92 -0
  151. package/templates/claude/skills/chrome-devtools/scripts/console.js +85 -0
  152. package/templates/claude/skills/chrome-devtools/scripts/evaluate.js +59 -0
  153. package/templates/claude/skills/chrome-devtools/scripts/fill.js +84 -0
  154. package/templates/claude/skills/chrome-devtools/scripts/inject-auth.js +247 -0
  155. package/templates/claude/skills/chrome-devtools/scripts/install-deps.sh +11 -0
  156. package/templates/claude/skills/chrome-devtools/scripts/install.sh +36 -0
  157. package/templates/claude/skills/chrome-devtools/scripts/lib/browser.js +335 -0
  158. package/templates/claude/skills/chrome-devtools/scripts/lib/selector.js +183 -0
  159. package/templates/claude/skills/chrome-devtools/scripts/navigate.js +60 -0
  160. package/templates/claude/skills/chrome-devtools/scripts/network.js +113 -0
  161. package/templates/claude/skills/chrome-devtools/scripts/package.json +16 -0
  162. package/templates/claude/skills/chrome-devtools/scripts/performance.js +159 -0
  163. package/templates/claude/skills/chrome-devtools/scripts/screenshot.js +212 -0
  164. package/templates/claude/skills/chrome-devtools/scripts/select-ref.js +151 -0
  165. package/templates/claude/skills/chrome-devtools/scripts/snapshot.js +143 -0
  166. package/templates/claude/skills/chrome-devtools/scripts/ws-debug.js +47 -0
  167. package/templates/claude/skills/chrome-devtools/scripts/ws-full-debug.js +115 -0
  168. package/templates/claude/skills/claude-code/references/advanced-features.md +399 -0
  169. package/templates/claude/skills/claude-code/references/agent-skills.md +399 -0
  170. package/templates/claude/skills/claude-code/references/api-reference.md +498 -0
  171. package/templates/claude/skills/claude-code/references/best-practices.md +447 -0
  172. package/templates/claude/skills/claude-code/references/cicd-integration.md +428 -0
  173. package/templates/claude/skills/claude-code/references/common-workflows.md +107 -0
  174. package/templates/claude/skills/claude-code/references/configuration.md +480 -0
  175. package/templates/claude/skills/claude-code/references/enterprise-features.md +472 -0
  176. package/templates/claude/skills/claude-code/references/getting-started.md +244 -0
  177. package/templates/claude/skills/claude-code/references/hooks-and-plugins.md +444 -0
  178. package/templates/claude/skills/claude-code/references/hooks-comprehensive.md +622 -0
  179. package/templates/claude/skills/claude-code/references/ide-integration.md +316 -0
  180. package/templates/claude/skills/claude-code/references/mcp-integration.md +386 -0
  181. package/templates/claude/skills/claude-code/references/slash-commands.md +460 -0
  182. package/templates/claude/skills/claude-code/references/troubleshooting.md +455 -0
  183. package/templates/claude/skills/claude-code/skill.md +60 -0
  184. package/templates/claude/skills/code-review/SKILL.md +143 -0
  185. package/templates/claude/skills/code-review/references/code-review-reception.md +209 -0
  186. package/templates/claude/skills/code-review/references/requesting-code-review.md +105 -0
  187. package/templates/claude/skills/code-review/references/verification-before-completion.md +139 -0
  188. package/templates/claude/skills/context-engineering/SKILL.md +86 -0
  189. package/templates/claude/skills/context-engineering/references/context-compression.md +84 -0
  190. package/templates/claude/skills/context-engineering/references/context-degradation.md +93 -0
  191. package/templates/claude/skills/context-engineering/references/context-fundamentals.md +75 -0
  192. package/templates/claude/skills/context-engineering/references/context-optimization.md +82 -0
  193. package/templates/claude/skills/context-engineering/references/evaluation.md +89 -0
  194. package/templates/claude/skills/context-engineering/references/memory-systems.md +88 -0
  195. package/templates/claude/skills/context-engineering/references/multi-agent-patterns.md +90 -0
  196. package/templates/claude/skills/context-engineering/references/project-development.md +97 -0
  197. package/templates/claude/skills/context-engineering/references/tool-design.md +86 -0
  198. package/templates/claude/skills/context-engineering/scripts/compression_evaluator.py +329 -0
  199. package/templates/claude/skills/context-engineering/scripts/context_analyzer.py +294 -0
  200. package/templates/claude/skills/databases/SKILL.md +232 -0
  201. package/templates/claude/skills/databases/references/mongodb-aggregation.md +447 -0
  202. package/templates/claude/skills/databases/references/mongodb-atlas.md +465 -0
  203. package/templates/claude/skills/databases/references/mongodb-crud.md +408 -0
  204. package/templates/claude/skills/databases/references/mongodb-indexing.md +442 -0
  205. package/templates/claude/skills/databases/references/postgresql-administration.md +594 -0
  206. package/templates/claude/skills/databases/references/postgresql-performance.md +527 -0
  207. package/templates/claude/skills/databases/references/postgresql-psql-cli.md +467 -0
  208. package/templates/claude/skills/databases/references/postgresql-queries.md +475 -0
  209. package/templates/claude/skills/databases/scripts/db_backup.py +502 -0
  210. package/templates/claude/skills/databases/scripts/db_migrate.py +414 -0
  211. package/templates/claude/skills/databases/scripts/db_performance_check.py +445 -0
  212. package/templates/claude/skills/debugging/SKILL.md +84 -0
  213. package/templates/claude/skills/debugging/references/defense-in-depth.md +124 -0
  214. package/templates/claude/skills/debugging/references/root-cause-tracing.md +122 -0
  215. package/templates/claude/skills/debugging/references/systematic-debugging.md +102 -0
  216. package/templates/claude/skills/debugging/references/verification.md +123 -0
  217. package/templates/claude/skills/debugging/scripts/find-polluter.sh +63 -0
  218. package/templates/claude/skills/debugging/scripts/find-polluter.test.md +102 -0
  219. package/templates/claude/skills/devops/SKILL.md +293 -0
  220. package/templates/claude/skills/devops/references/browser-rendering.md +305 -0
  221. package/templates/claude/skills/devops/references/cloudflare-d1-kv.md +123 -0
  222. package/templates/claude/skills/devops/references/cloudflare-platform.md +271 -0
  223. package/templates/claude/skills/devops/references/cloudflare-r2-storage.md +280 -0
  224. package/templates/claude/skills/devops/references/cloudflare-workers-advanced.md +312 -0
  225. package/templates/claude/skills/devops/references/cloudflare-workers-apis.md +309 -0
  226. package/templates/claude/skills/devops/references/cloudflare-workers-basics.md +418 -0
  227. package/templates/claude/skills/devops/references/docker-basics.md +297 -0
  228. package/templates/claude/skills/devops/references/docker-compose.md +292 -0
  229. package/templates/claude/skills/devops/references/gcloud-platform.md +307 -0
  230. package/templates/claude/skills/devops/references/gcloud-services.md +304 -0
  231. package/templates/claude/skills/devops/scripts/cloudflare_deploy.py +269 -0
  232. package/templates/claude/skills/devops/scripts/docker_optimize.py +320 -0
  233. package/templates/claude/skills/docs-seeker/SKILL.md +95 -0
  234. package/templates/claude/skills/docs-seeker/package.json +24 -0
  235. package/templates/claude/skills/docs-seeker/references/advanced.md +78 -0
  236. package/templates/claude/skills/docs-seeker/references/context7-patterns.md +68 -0
  237. package/templates/claude/skills/docs-seeker/references/errors.md +68 -0
  238. package/templates/claude/skills/docs-seeker/scripts/analyze-llms-txt.js +245 -0
  239. package/templates/claude/skills/docs-seeker/scripts/detect-topic.js +172 -0
  240. package/templates/claude/skills/docs-seeker/scripts/fetch-docs.js +212 -0
  241. package/templates/claude/skills/docs-seeker/workflows/library-search.md +87 -0
  242. package/templates/claude/skills/docs-seeker/workflows/repo-analysis.md +91 -0
  243. package/templates/claude/skills/docs-seeker/workflows/topic-search.md +77 -0
  244. package/templates/claude/skills/frontend-design/SKILL.md +85 -0
  245. package/templates/claude/skills/frontend-design/references/analysis-best-practices.md +80 -0
  246. package/templates/claude/skills/frontend-design/references/analysis-prompts.md +141 -0
  247. package/templates/claude/skills/frontend-design/references/analysis-techniques.md +118 -0
  248. package/templates/claude/skills/frontend-design/references/animejs.md +396 -0
  249. package/templates/claude/skills/frontend-design/references/design-extraction-overview.md +71 -0
  250. package/templates/claude/skills/frontend-design/references/extraction-best-practices.md +141 -0
  251. package/templates/claude/skills/frontend-design/references/extraction-output-templates.md +162 -0
  252. package/templates/claude/skills/frontend-design/references/extraction-prompts.md +127 -0
  253. package/templates/claude/skills/frontend-design/references/technical-accessibility.md +119 -0
  254. package/templates/claude/skills/frontend-design/references/technical-best-practices.md +97 -0
  255. package/templates/claude/skills/frontend-design/references/technical-optimization.md +44 -0
  256. package/templates/claude/skills/frontend-design/references/technical-overview.md +90 -0
  257. package/templates/claude/skills/frontend-design/references/technical-workflows.md +150 -0
  258. package/templates/claude/skills/frontend-design/references/visual-analysis-overview.md +95 -0
  259. package/templates/claude/skills/frontend-development/SKILL.md +399 -0
  260. package/templates/claude/skills/frontend-development/resources/common-patterns.md +331 -0
  261. package/templates/claude/skills/frontend-development/resources/complete-examples.md +872 -0
  262. package/templates/claude/skills/frontend-development/resources/component-patterns.md +502 -0
  263. package/templates/claude/skills/frontend-development/resources/data-fetching.md +767 -0
  264. package/templates/claude/skills/frontend-development/resources/file-organization.md +502 -0
  265. package/templates/claude/skills/frontend-development/resources/loading-and-error-states.md +501 -0
  266. package/templates/claude/skills/frontend-development/resources/performance.md +406 -0
  267. package/templates/claude/skills/frontend-development/resources/routing-guide.md +364 -0
  268. package/templates/claude/skills/frontend-development/resources/styling-guide.md +428 -0
  269. package/templates/claude/skills/frontend-development/resources/typescript-standards.md +418 -0
  270. package/templates/claude/skills/markdown-novel-viewer/SKILL.md +272 -0
  271. package/templates/claude/skills/markdown-novel-viewer/assets/directory-browser.css +215 -0
  272. package/templates/claude/skills/markdown-novel-viewer/assets/favicon.png +0 -0
  273. package/templates/claude/skills/markdown-novel-viewer/assets/novel-theme.css +872 -0
  274. package/templates/claude/skills/markdown-novel-viewer/assets/reader.js +378 -0
  275. package/templates/claude/skills/markdown-novel-viewer/assets/template.html +85 -0
  276. package/templates/claude/skills/markdown-novel-viewer/package.json +15 -0
  277. package/templates/claude/skills/markdown-novel-viewer/scripts/lib/http-server.cjs +434 -0
  278. package/templates/claude/skills/markdown-novel-viewer/scripts/lib/markdown-renderer.cjs +335 -0
  279. package/templates/claude/skills/markdown-novel-viewer/scripts/lib/plan-navigator.cjs +509 -0
  280. package/templates/claude/skills/markdown-novel-viewer/scripts/lib/port-finder.cjs +49 -0
  281. package/templates/claude/skills/markdown-novel-viewer/scripts/lib/process-mgr.cjs +150 -0
  282. package/templates/claude/skills/markdown-novel-viewer/scripts/server.cjs +398 -0
  283. package/templates/claude/skills/mcp-builder/SKILL.md +328 -0
  284. package/templates/claude/skills/mcp-builder/reference/evaluation.md +602 -0
  285. package/templates/claude/skills/mcp-builder/reference/mcp_best_practices.md +915 -0
  286. package/templates/claude/skills/mcp-builder/reference/node_mcp_server.md +916 -0
  287. package/templates/claude/skills/mcp-builder/reference/python_mcp_server.md +752 -0
  288. package/templates/claude/skills/mcp-builder/scripts/connections.py +151 -0
  289. package/templates/claude/skills/mcp-builder/scripts/evaluation.py +381 -0
  290. package/templates/claude/skills/mcp-builder/scripts/example_evaluation.xml +22 -0
  291. package/templates/claude/skills/mcp-builder/scripts/requirements.txt +2 -0
  292. package/templates/claude/skills/mcp-management/README.md +219 -0
  293. package/templates/claude/skills/mcp-management/SKILL.md +209 -0
  294. package/templates/claude/skills/mcp-management/assets/tools.json +3146 -0
  295. package/templates/claude/skills/mcp-management/references/configuration.md +114 -0
  296. package/templates/claude/skills/mcp-management/references/gemini-cli-integration.md +209 -0
  297. package/templates/claude/skills/mcp-management/references/mcp-protocol.md +116 -0
  298. package/templates/claude/skills/mcp-management/scripts/.env.example +10 -0
  299. package/templates/claude/skills/mcp-management/scripts/cli.ts +202 -0
  300. package/templates/claude/skills/mcp-management/scripts/mcp-client.ts +247 -0
  301. package/templates/claude/skills/mcp-management/scripts/package.json +20 -0
  302. package/templates/claude/skills/mcp-management/scripts/tsconfig.json +15 -0
  303. package/templates/claude/skills/media-processing/SKILL.md +91 -0
  304. package/templates/claude/skills/media-processing/references/common-workflows.md +132 -0
  305. package/templates/claude/skills/media-processing/references/ffmpeg-encoding.md +358 -0
  306. package/templates/claude/skills/media-processing/references/ffmpeg-filters.md +503 -0
  307. package/templates/claude/skills/media-processing/references/ffmpeg-streaming.md +395 -0
  308. package/templates/claude/skills/media-processing/references/format-compatibility.md +375 -0
  309. package/templates/claude/skills/media-processing/references/imagemagick-batch.md +612 -0
  310. package/templates/claude/skills/media-processing/references/imagemagick-editing.md +623 -0
  311. package/templates/claude/skills/media-processing/references/rmbg-background-removal.md +66 -0
  312. package/templates/claude/skills/media-processing/references/troubleshooting.md +109 -0
  313. package/templates/claude/skills/media-processing/scripts/README.md +102 -0
  314. package/templates/claude/skills/media-processing/scripts/batch-remove-background.sh +124 -0
  315. package/templates/claude/skills/media-processing/scripts/batch_resize.py +342 -0
  316. package/templates/claude/skills/media-processing/scripts/media_convert.py +311 -0
  317. package/templates/claude/skills/media-processing/scripts/remove-background.sh +96 -0
  318. package/templates/claude/skills/media-processing/scripts/remove-bg-node.js +181 -0
  319. package/templates/claude/skills/mermaidjs-v11/SKILL.md +115 -0
  320. package/templates/claude/skills/mermaidjs-v11/references/cli-usage.md +228 -0
  321. package/templates/claude/skills/mermaidjs-v11/references/configuration.md +232 -0
  322. package/templates/claude/skills/mermaidjs-v11/references/diagram-types.md +315 -0
  323. package/templates/claude/skills/mermaidjs-v11/references/examples.md +344 -0
  324. package/templates/claude/skills/mermaidjs-v11/references/integration.md +310 -0
  325. package/templates/claude/skills/planning/SKILL.md +115 -0
  326. package/templates/claude/skills/planning/references/codebase-understanding.md +62 -0
  327. package/templates/claude/skills/planning/references/output-standards.md +127 -0
  328. package/templates/claude/skills/planning/references/plan-organization.md +150 -0
  329. package/templates/claude/skills/planning/references/research-phase.md +49 -0
  330. package/templates/claude/skills/planning/references/solution-design.md +63 -0
  331. package/templates/claude/skills/plans-kanban/SKILL.md +157 -0
  332. package/templates/claude/skills/plans-kanban/assets/dashboard-template.html +119 -0
  333. package/templates/claude/skills/plans-kanban/assets/dashboard.css +1594 -0
  334. package/templates/claude/skills/plans-kanban/assets/dashboard.js +659 -0
  335. package/templates/claude/skills/plans-kanban/assets/favicon.png +0 -0
  336. package/templates/claude/skills/plans-kanban/package.json +13 -0
  337. package/templates/claude/skills/plans-kanban/scripts/lib/dashboard-renderer.cjs +941 -0
  338. package/templates/claude/skills/plans-kanban/scripts/lib/http-server.cjs +310 -0
  339. package/templates/claude/skills/plans-kanban/scripts/lib/plan-metadata-extractor.cjs +489 -0
  340. package/templates/claude/skills/plans-kanban/scripts/lib/plan-parser.cjs +194 -0
  341. package/templates/claude/skills/plans-kanban/scripts/lib/plan-scanner.cjs +277 -0
  342. package/templates/claude/skills/plans-kanban/scripts/lib/port-finder.cjs +49 -0
  343. package/templates/claude/skills/plans-kanban/scripts/lib/process-mgr.cjs +128 -0
  344. package/templates/claude/skills/plans-kanban/scripts/server.cjs +249 -0
  345. package/templates/claude/skills/problem-solving/SKILL.md +96 -0
  346. package/templates/claude/skills/problem-solving/references/attribution.md +69 -0
  347. package/templates/claude/skills/problem-solving/references/collision-zone-thinking.md +79 -0
  348. package/templates/claude/skills/problem-solving/references/inversion-exercise.md +91 -0
  349. package/templates/claude/skills/problem-solving/references/meta-pattern-recognition.md +87 -0
  350. package/templates/claude/skills/problem-solving/references/scale-game.md +95 -0
  351. package/templates/claude/skills/problem-solving/references/simplification-cascades.md +80 -0
  352. package/templates/claude/skills/problem-solving/references/when-stuck.md +72 -0
  353. package/templates/claude/skills/registry.json +258 -0
  354. package/templates/claude/skills/repomix/SKILL.md +247 -0
  355. package/templates/claude/skills/repomix/references/configuration.md +211 -0
  356. package/templates/claude/skills/repomix/references/usage-patterns.md +232 -0
  357. package/templates/claude/skills/repomix/scripts/README.md +179 -0
  358. package/templates/claude/skills/repomix/scripts/repomix_batch.py +455 -0
  359. package/templates/claude/skills/repomix/scripts/repos.example.json +15 -0
  360. package/templates/claude/skills/research/SKILL.md +168 -0
  361. package/templates/claude/skills/sequential-thinking/.env.example +8 -0
  362. package/templates/claude/skills/sequential-thinking/README.md +183 -0
  363. package/templates/claude/skills/sequential-thinking/SKILL.md +94 -0
  364. package/templates/claude/skills/sequential-thinking/package.json +31 -0
  365. package/templates/claude/skills/sequential-thinking/references/advanced-strategies.md +79 -0
  366. package/templates/claude/skills/sequential-thinking/references/advanced-techniques.md +76 -0
  367. package/templates/claude/skills/sequential-thinking/references/core-patterns.md +95 -0
  368. package/templates/claude/skills/sequential-thinking/references/examples-api.md +88 -0
  369. package/templates/claude/skills/sequential-thinking/references/examples-architecture.md +94 -0
  370. package/templates/claude/skills/sequential-thinking/references/examples-debug.md +90 -0
  371. package/templates/claude/skills/sequential-thinking/scripts/format-thought.js +182 -0
  372. package/templates/claude/skills/sequential-thinking/scripts/process-thought.js +252 -0
  373. package/templates/claude/skills/skill-creator/LICENSE.txt +202 -0
  374. package/templates/claude/skills/skill-creator/SKILL.md +266 -0
  375. package/templates/claude/skills/skill-creator/references/agent-skills-spec.md +51 -0
  376. package/templates/claude/skills/skill-creator/scripts/encoding_utils.py +21 -0
  377. package/templates/claude/skills/skill-creator/scripts/init_skill.py +304 -0
  378. package/templates/claude/skills/skill-creator/scripts/package_skill.py +110 -0
  379. package/templates/claude/skills/skill-creator/scripts/quick_validate.py +66 -0
  380. package/templates/claude/skills/template-skill/SKILL.md +6 -0
  381. package/templates/claude/skills/vitest/SKILL.md +595 -0
  382. package/templates/claude/skills/vitest/references/async-patterns.md +82 -0
  383. package/templates/claude/skills/vitest/references/mock-patterns.md +78 -0
  384. package/templates/claude/skills/vitest/references/monorepo-setup.md +185 -0
  385. package/templates/claude/skills/vitest/references/turborepo-setup.md +332 -0
  386. package/templates/claude/skills/web-frameworks/SKILL.md +324 -0
  387. package/templates/claude/skills/web-frameworks/references/nextjs-app-router.md +465 -0
  388. package/templates/claude/skills/web-frameworks/references/nextjs-data-fetching.md +459 -0
  389. package/templates/claude/skills/web-frameworks/references/nextjs-optimization.md +511 -0
  390. package/templates/claude/skills/web-frameworks/references/nextjs-server-components.md +495 -0
  391. package/templates/claude/skills/web-frameworks/references/remix-icon-integration.md +603 -0
  392. package/templates/claude/skills/web-frameworks/references/turborepo-caching.md +551 -0
  393. package/templates/claude/skills/web-frameworks/references/turborepo-pipelines.md +517 -0
  394. package/templates/claude/skills/web-frameworks/references/turborepo-setup.md +542 -0
  395. package/templates/claude/skills/web-frameworks/scripts/nextjs_init.py +547 -0
  396. package/templates/claude/skills/web-frameworks/scripts/turborepo_migrate.py +394 -0
  397. package/templates/claude/workflows/development-rules.md +40 -0
  398. package/templates/claude/workflows/documentation-management.md +121 -0
  399. package/templates/claude/workflows/orchestration-protocol.md +16 -0
  400. package/templates/claude/workflows/primary-workflow.md +45 -0
  401. package/templates/claude/workflows/registry.json +37 -0
  402. package/templates/common/.cct.json +41 -0
  403. package/templates/common/.cctkignore +22 -0
  404. package/templates/common/.env.example +39 -0
  405. package/templates/common/.mcp.json.example +16 -0
  406. package/templates/common/metadata.json +15 -0
  407. package/templates/common/settings.json +79 -0
  408. package/templates/common/statusline.cjs +271 -0
  409. package/templates/config/.repomixignore +22 -0
  410. package/templates/config/AGENTS.md +55 -0
  411. package/templates/config/CLAUDE.md +87 -0
  412. package/templates/plans/bug-fix-template.md +69 -0
  413. package/templates/plans/feature-implementation-template.md +84 -0
  414. package/templates/plans/refactor-template.md +82 -0
  415. package/templates/plans/template-usage-guide.md +58 -0
@@ -0,0 +1,335 @@
1
+ /**
2
+ * Shared browser utilities for Chrome DevTools scripts
3
+ * Supports persistent browser sessions via WebSocket endpoint file
4
+ */
5
+ import fs from 'node:fs';
6
+ import path from 'node:path';
7
+ import { fileURLToPath } from 'node:url';
8
+ import debug from 'debug';
9
+ import puppeteer from 'puppeteer';
10
+
11
+ const log = debug('chrome-devtools:browser');
12
+
13
+ // Session file stores WebSocket endpoint for browser reuse across processes
14
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
15
+ const SESSION_FILE = path.join(__dirname, '..', '.browser-session.json');
16
+ const AUTH_SESSION_FILE = path.join(__dirname, '..', '.auth-session.json');
17
+
18
+ let browserInstance = null;
19
+ let pageInstance = null;
20
+
21
+ /**
22
+ * Read session info from file
23
+ */
24
+ function readSession() {
25
+ try {
26
+ if (fs.existsSync(SESSION_FILE)) {
27
+ const data = JSON.parse(fs.readFileSync(SESSION_FILE, 'utf8'));
28
+
29
+ // Check if session is not too old (max 1 hour)
30
+
31
+ if (Date.now() - data.timestamp < 3_600_000) {
32
+ return data;
33
+ }
34
+ }
35
+ } catch (error) {
36
+ log('Failed to read session:', error.message);
37
+ }
38
+
39
+ return null;
40
+ }
41
+
42
+ /**
43
+ * Write session info to file
44
+ */
45
+ function writeSession(wsEndpoint) {
46
+ try {
47
+ fs.writeFileSync(
48
+ SESSION_FILE,
49
+ JSON.stringify({
50
+ wsEndpoint,
51
+ timestamp: Date.now(),
52
+ }),
53
+ );
54
+ } catch (error) {
55
+ log('Failed to write session:', error.message);
56
+ }
57
+ }
58
+
59
+ /**
60
+ * Clear session file
61
+ */
62
+ function clearSession() {
63
+ try {
64
+ if (fs.existsSync(SESSION_FILE)) {
65
+ fs.unlinkSync(SESSION_FILE);
66
+ }
67
+ } catch (error) {
68
+ log('Failed to clear session:', error.message);
69
+ }
70
+ }
71
+
72
+ /**
73
+ * Save auth session (cookies, storage) for persistence
74
+ * @param {Object} authData - Auth data to save
75
+ */
76
+ export function saveAuthSession(authData) {
77
+ try {
78
+ const existing = readAuthSession() || {};
79
+ const merged = { ...existing, ...authData, timestamp: Date.now() };
80
+
81
+ fs.writeFileSync(AUTH_SESSION_FILE, JSON.stringify(merged, null, 2));
82
+ log('Auth session saved');
83
+ } catch (error) {
84
+ log('Failed to save auth session:', error.message);
85
+ }
86
+ }
87
+
88
+ /**
89
+ * Read auth session from file
90
+ * @returns {Object|null} - Auth session data or null
91
+ */
92
+ export function readAuthSession() {
93
+ try {
94
+ if (fs.existsSync(AUTH_SESSION_FILE)) {
95
+ const data = JSON.parse(fs.readFileSync(AUTH_SESSION_FILE, 'utf8'));
96
+
97
+ // Auth sessions valid for 24 hours
98
+
99
+ if (Date.now() - data.timestamp < 86_400_000) {
100
+ return data;
101
+ }
102
+ }
103
+ } catch (error) {
104
+ log('Failed to read auth session:', error.message);
105
+ }
106
+
107
+ return null;
108
+ }
109
+
110
+ /**
111
+ * Clear auth session file
112
+ */
113
+ export function clearAuthSession() {
114
+ try {
115
+ if (fs.existsSync(AUTH_SESSION_FILE)) {
116
+ fs.unlinkSync(AUTH_SESSION_FILE);
117
+ log('Auth session cleared');
118
+ }
119
+ } catch (error) {
120
+ log('Failed to clear auth session:', error.message);
121
+ }
122
+ }
123
+
124
+ /**
125
+ * Apply saved auth session to page
126
+ * @param {Object} page - Puppeteer page instance
127
+ * @param {string} url - Target URL for domain context
128
+ */
129
+ export async function applyAuthSession(page, url) {
130
+ const authData = readAuthSession();
131
+
132
+ if (!authData) {
133
+ log('No auth session found');
134
+
135
+ return false;
136
+ }
137
+
138
+ try {
139
+ // Apply cookies
140
+ if (authData.cookies && authData.cookies.length > 0) {
141
+ await page.setCookie(...authData.cookies);
142
+ log(`Applied ${authData.cookies.length} cookies`);
143
+ }
144
+
145
+ // Apply localStorage (requires navigation first)
146
+ if (authData.localStorage && Object.keys(authData.localStorage).length > 0) {
147
+ await page.evaluate((data) => {
148
+ Object.entries(data).forEach(([key, value]) => {
149
+ localStorage.setItem(key, typeof value === 'string' ? value : JSON.stringify(value));
150
+ });
151
+ }, authData.localStorage);
152
+ log('Applied localStorage data');
153
+ }
154
+
155
+ // Apply sessionStorage
156
+ if (authData.sessionStorage && Object.keys(authData.sessionStorage).length > 0) {
157
+ await page.evaluate((data) => {
158
+ Object.entries(data).forEach(([key, value]) => {
159
+ sessionStorage.setItem(key, typeof value === 'string' ? value : JSON.stringify(value));
160
+ });
161
+ }, authData.sessionStorage);
162
+ log('Applied sessionStorage data');
163
+ }
164
+
165
+ // Apply extra headers
166
+ if (authData.headers) {
167
+ await page.setExtraHTTPHeaders(authData.headers);
168
+ log('Applied HTTP headers');
169
+ }
170
+
171
+ return true;
172
+ } catch (error) {
173
+ log('Failed to apply auth session:', error.message);
174
+
175
+ return false;
176
+ }
177
+ }
178
+
179
+ /**
180
+ * Launch or connect to browser
181
+ * If a session file exists with valid wsEndpoint, connects to existing browser
182
+ * Otherwise launches new browser and saves wsEndpoint for future connections
183
+ */
184
+ export async function getBrowser(options = {}) {
185
+ // If we already have a connected browser in this process, reuse it
186
+ if (browserInstance && browserInstance.isConnected()) {
187
+ log('Reusing existing browser instance from process');
188
+
189
+ return browserInstance;
190
+ }
191
+
192
+ // Try to connect to existing browser from session file
193
+ const session = readSession();
194
+
195
+ if (session && session.wsEndpoint) {
196
+ try {
197
+ log('Attempting to connect to existing browser session');
198
+ browserInstance = await puppeteer.connect({
199
+ browserWSEndpoint: session.wsEndpoint,
200
+ });
201
+ log('Connected to existing browser');
202
+
203
+ return browserInstance;
204
+ } catch (error) {
205
+ log('Failed to connect to existing browser:', error.message);
206
+ clearSession();
207
+ }
208
+ }
209
+
210
+ // Connect via provided wsEndpoint or browserUrl
211
+ if (options.wsEndpoint || options.browserUrl) {
212
+ log('Connecting to browser via provided endpoint');
213
+ browserInstance = await puppeteer.connect({
214
+ browserWSEndpoint: options.wsEndpoint,
215
+ browserURL: options.browserUrl,
216
+ });
217
+
218
+ return browserInstance;
219
+ }
220
+
221
+ // Launch new browser
222
+ const launchOptions = {
223
+ headless: options.headless !== false,
224
+ args: ['--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage', ...(options.args || [])],
225
+ defaultViewport: options.viewport || {
226
+ width: 1920,
227
+ height: 1080,
228
+ },
229
+ ...options,
230
+ };
231
+
232
+ log('Launching new browser');
233
+ browserInstance = await puppeteer.launch(launchOptions);
234
+
235
+ // Save wsEndpoint for future connections
236
+ const wsEndpoint = browserInstance.wsEndpoint();
237
+
238
+ writeSession(wsEndpoint);
239
+ log('Browser launched, session saved');
240
+
241
+ return browserInstance;
242
+ }
243
+
244
+ /**
245
+ * Get current page or create new one
246
+ */
247
+ export async function getPage(browser) {
248
+ if (pageInstance && !pageInstance.isClosed()) {
249
+ log('Reusing existing page');
250
+
251
+ return pageInstance;
252
+ }
253
+
254
+ const pages = await browser.pages();
255
+
256
+ pageInstance = pages.length > 0 ? pages[0] : await browser.newPage();
257
+
258
+ return pageInstance;
259
+ }
260
+
261
+ /**
262
+ * Close browser and clear session
263
+ */
264
+ export async function closeBrowser() {
265
+ if (browserInstance) {
266
+ await browserInstance.close();
267
+ browserInstance = null;
268
+ pageInstance = null;
269
+ clearSession();
270
+ log('Browser closed, session cleared');
271
+ }
272
+ }
273
+
274
+ /**
275
+ * Disconnect from browser without closing it
276
+ * Use this to keep browser running for future script executions
277
+ */
278
+ export async function disconnectBrowser() {
279
+ if (browserInstance) {
280
+ browserInstance.disconnect();
281
+ browserInstance = null;
282
+ pageInstance = null;
283
+ log('Disconnected from browser (browser still running)');
284
+ }
285
+ }
286
+
287
+ /**
288
+ * Parse command line arguments
289
+ */
290
+ export function parseArgs(argv, options = {}) {
291
+ const args = {};
292
+
293
+ for (let i = 0; i < argv.length; i++) {
294
+ const arg = argv[i];
295
+
296
+ if (arg.startsWith('--')) {
297
+ const key = arg.slice(2);
298
+ const nextArg = argv[i + 1];
299
+
300
+ if (nextArg && !nextArg.startsWith('--')) {
301
+ args[key] = nextArg;
302
+ i++;
303
+ } else {
304
+ args[key] = true;
305
+ }
306
+ }
307
+ }
308
+
309
+ return args;
310
+ }
311
+
312
+ /**
313
+ * Output JSON result
314
+ */
315
+ export function outputJSON(data) {
316
+ console.log(JSON.stringify(data, null, 2));
317
+ }
318
+
319
+ /**
320
+ * Output error
321
+ */
322
+ export function outputError(error) {
323
+ console.error(
324
+ JSON.stringify(
325
+ {
326
+ success: false,
327
+ error: error.message,
328
+ stack: error.stack,
329
+ },
330
+ null,
331
+ 2,
332
+ ),
333
+ );
334
+ process.exit(1);
335
+ }
@@ -0,0 +1,183 @@
1
+ /**
2
+ * Shared selector parsing and validation library
3
+ * Supports CSS and XPath selectors with security validation
4
+ */
5
+
6
+ /**
7
+ * Parse and validate selector
8
+ * @param {string} selector - CSS or XPath selector
9
+ * @returns {{type: 'css'|'xpath', selector: string}}
10
+ * @throws {Error} If XPath contains injection patterns
11
+ */
12
+ export function parseSelector(selector) {
13
+ if (!selector || typeof selector !== 'string') {
14
+ throw new Error('Selector must be a non-empty string');
15
+ }
16
+
17
+ // Detect XPath selectors
18
+ if (selector.startsWith('/') || selector.startsWith('(//')) {
19
+ // XPath injection prevention
20
+ validateXPath(selector);
21
+
22
+ return { type: 'xpath', selector };
23
+ }
24
+
25
+ // CSS selector
26
+ return { type: 'css', selector };
27
+ }
28
+
29
+ /**
30
+ * Validate XPath selector for security
31
+ * @param {string} xpath - XPath expression to validate
32
+ * @throws {Error} If XPath contains dangerous patterns
33
+ */
34
+ function validateXPath(xpath) {
35
+ const dangerous = [
36
+ 'javascript:',
37
+ '<script',
38
+ 'onerror=',
39
+ 'onload=',
40
+ 'onclick=',
41
+ 'onmouseover=',
42
+ 'eval(',
43
+ 'Function(',
44
+ 'constructor(',
45
+ ];
46
+
47
+ const lower = xpath.toLowerCase();
48
+
49
+ for (const pattern of dangerous) {
50
+ if (lower.includes(pattern.toLowerCase())) {
51
+ throw new Error(`Potential XPath injection detected: ${pattern}`);
52
+ }
53
+ }
54
+
55
+ // Additional validation: check for extremely long selectors (potential DoS)
56
+ if (xpath.length > 1000) {
57
+ throw new Error('XPath selector too long (max 1000 characters)');
58
+ }
59
+ }
60
+
61
+ /**
62
+ * Wait for element based on selector type
63
+ * @param {Object} page - Puppeteer page instance
64
+ * @param {{type: string, selector: string}} parsed - Parsed selector
65
+ * @param {Object} options - Wait options (visible, timeout)
66
+ * @returns {Promise<void>}
67
+ */
68
+ export async function waitForElement(page, parsed, options = {}) {
69
+ const defaultOptions = {
70
+ visible: true,
71
+ timeout: 5000,
72
+ ...options,
73
+ };
74
+
75
+ if (parsed.type === 'xpath') {
76
+ // Use locator API for XPath (Puppeteer v24+)
77
+ const locator = page.locator(`::-p-xpath(${parsed.selector})`);
78
+
79
+ // setVisibility and setTimeout are the locator options
80
+
81
+ await locator
82
+ .setVisibility(defaultOptions.visible ? 'visible' : null)
83
+ .setTimeout(defaultOptions.timeout)
84
+ .wait();
85
+ } else {
86
+ await page.waitForSelector(parsed.selector, defaultOptions);
87
+ }
88
+ }
89
+
90
+ /**
91
+ * Click element based on selector type
92
+ * @param {Object} page - Puppeteer page instance
93
+ * @param {{type: string, selector: string}} parsed - Parsed selector
94
+ * @returns {Promise<void>}
95
+ */
96
+ export async function clickElement(page, parsed) {
97
+ if (parsed.type === 'xpath') {
98
+ // Use locator API for XPath (Puppeteer v24+)
99
+ const locator = page.locator(`::-p-xpath(${parsed.selector})`);
100
+
101
+ await locator.click();
102
+ } else {
103
+ await page.click(parsed.selector);
104
+ }
105
+ }
106
+
107
+ /**
108
+ * Type into element based on selector type
109
+ * @param {Object} page - Puppeteer page instance
110
+ * @param {{type: string, selector: string}} parsed - Parsed selector
111
+ * @param {string} value - Text to type
112
+ * @param {Object} options - Type options (delay, clear)
113
+ * @returns {Promise<void>}
114
+ */
115
+ export async function typeIntoElement(page, parsed, value, options = {}) {
116
+ if (parsed.type === 'xpath') {
117
+ // Use locator API for XPath (Puppeteer v24+)
118
+ const locator = page.locator(`::-p-xpath(${parsed.selector})`);
119
+
120
+ // Clear if requested
121
+ if (options.clear) {
122
+ await locator.fill('');
123
+ }
124
+
125
+ await locator.fill(value);
126
+ } else {
127
+ // CSS selector
128
+ if (options.clear) {
129
+ await page.$eval(parsed.selector, (el) => (el.value = ''));
130
+ }
131
+
132
+ await page.type(parsed.selector, value, { delay: options.delay || 0 });
133
+ }
134
+ }
135
+
136
+ /**
137
+ * Get element handle based on selector type
138
+ * @param {Object} page - Puppeteer page instance
139
+ * @param {{type: string, selector: string}} parsed - Parsed selector
140
+ * @returns {Promise<ElementHandle|null>}
141
+ */
142
+ export async function getElement(page, parsed) {
143
+ if (parsed.type === 'xpath') {
144
+ // For XPath, use page.evaluate with XPath evaluation
145
+ // This returns the first matching element
146
+ const element = await page.evaluateHandle((xpath) => {
147
+ const result = document.evaluate(xpath, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
148
+
149
+ return result.singleNodeValue;
150
+ }, parsed.selector);
151
+
152
+ // Convert JSHandle to ElementHandle
153
+ const elementHandle = element.asElement();
154
+
155
+ return elementHandle;
156
+ }
157
+
158
+ return await page.$(parsed.selector);
159
+ }
160
+
161
+ /**
162
+ * Get enhanced error message for selector failures
163
+ * @param {Error} error - Original error
164
+ * @param {string} selector - Selector that failed
165
+ * @returns {Error} Enhanced error with troubleshooting tips
166
+ */
167
+ export function enhanceError(error, selector) {
168
+ if (
169
+ error.message.includes('waiting for selector') ||
170
+ error.message.includes('waiting for XPath') ||
171
+ error.message.includes('No node found')
172
+ ) {
173
+ error.message +=
174
+ '\n\nTroubleshooting:\n' +
175
+ '1. Use snapshot.js to find correct selector: node snapshot.js --url <url>\n' +
176
+ '2. Try XPath selector: //button[text()="Click"] or //button[contains(text(),"Click")]\n' +
177
+ '3. Check element is visible on page (not display:none or hidden)\n' +
178
+ '4. Increase --timeout value: --timeout 10000\n' +
179
+ '5. Change wait strategy: --wait-until load or --wait-until domcontentloaded';
180
+ }
181
+
182
+ return error;
183
+ }
@@ -0,0 +1,60 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Navigate to a URL
4
+ * Usage: node navigate.js --url https://example.com [--wait-until networkidle2] [--timeout 30000]
5
+ *
6
+ * Session behavior:
7
+ * --close false : Keep browser running, disconnect from it (default for chaining)
8
+ * --close true : Close browser completely and clear session
9
+ */
10
+ import {
11
+ getBrowser,
12
+ getPage,
13
+ closeBrowser,
14
+ disconnectBrowser,
15
+ parseArgs,
16
+ outputJSON,
17
+ outputError,
18
+ } from './lib/browser.js';
19
+
20
+ async function navigate() {
21
+ const args = parseArgs(process.argv.slice(2));
22
+
23
+ if (!args.url) {
24
+ outputError(new Error('--url 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
+ const options = {
37
+ waitUntil: args['wait-until'] || 'networkidle2',
38
+ timeout: Number.parseInt(args.timeout || '30000'),
39
+ };
40
+
41
+ await page.goto(args.url, options);
42
+
43
+ const result = {
44
+ success: true,
45
+ url: page.url(),
46
+ title: await page.title(),
47
+ };
48
+
49
+ outputJSON(result);
50
+
51
+ // Default: disconnect to keep browser running for session persistence
52
+ // Use --close true to fully close browser
53
+ await (args.close === 'true' ? closeBrowser() : disconnectBrowser());
54
+ process.exit(0);
55
+ } catch (error) {
56
+ outputError(error);
57
+ }
58
+ }
59
+
60
+ navigate();
@@ -0,0 +1,113 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Monitor network requests
4
+ * Usage: node network.js --url https://example.com [--types xhr,fetch] [--output requests.json]
5
+ */
6
+ import fs from 'node:fs/promises';
7
+ import {
8
+ getBrowser,
9
+ getPage,
10
+ closeBrowser,
11
+ disconnectBrowser,
12
+ parseArgs,
13
+ outputJSON,
14
+ outputError,
15
+ } from './lib/browser.js';
16
+
17
+ async function monitorNetwork() {
18
+ const args = parseArgs(process.argv.slice(2));
19
+
20
+ if (!args.url) {
21
+ outputError(new Error('--url is required'));
22
+
23
+ return;
24
+ }
25
+
26
+ try {
27
+ const browser = await getBrowser({
28
+ headless: args.headless !== 'false',
29
+ });
30
+
31
+ const page = await getPage(browser);
32
+
33
+ const requests = [];
34
+ const filterTypes = args.types ? args.types.split(',').map((t) => t.toLowerCase()) : null;
35
+
36
+ // Monitor requests
37
+ page.on('request', (request) => {
38
+ const resourceType = request.resourceType().toLowerCase();
39
+
40
+ if (!filterTypes || filterTypes.includes(resourceType)) {
41
+ requests.push({
42
+ id: request._requestId || requests.length,
43
+ url: request.url(),
44
+ method: request.method(),
45
+ resourceType,
46
+ headers: request.headers(),
47
+ postData: request.postData(),
48
+ timestamp: Date.now(),
49
+ });
50
+ }
51
+ });
52
+
53
+ // Monitor responses
54
+ const responses = new Map();
55
+
56
+ page.on('response', async (response) => {
57
+ const request = response.request();
58
+ const resourceType = request.resourceType().toLowerCase();
59
+
60
+ if (!filterTypes || filterTypes.includes(resourceType)) {
61
+ try {
62
+ responses.set(request._requestId || request.url(), {
63
+ status: response.status(),
64
+ statusText: response.statusText(),
65
+ headers: response.headers(),
66
+ fromCache: response.fromCache(),
67
+ timing: response.timing(),
68
+ });
69
+ } catch {
70
+ // Ignore errors for some response types
71
+ }
72
+ }
73
+ });
74
+
75
+ // Navigate
76
+ await page.goto(args.url, {
77
+ waitUntil: args['wait-until'] || 'networkidle2',
78
+ });
79
+
80
+ // Merge requests with responses
81
+ const combined = requests.map((req) => ({
82
+ ...req,
83
+ response: responses.get(req.id) || responses.get(req.url) || null,
84
+ }));
85
+
86
+ const result = {
87
+ success: true,
88
+ url: page.url(),
89
+ requestCount: combined.length,
90
+ requests: combined,
91
+ };
92
+
93
+ if (args.output) {
94
+ await fs.writeFile(args.output, JSON.stringify(result, null, 2));
95
+ outputJSON({
96
+ success: true,
97
+ output: args.output,
98
+ requestCount: combined.length,
99
+ });
100
+ } else {
101
+ outputJSON(result);
102
+ }
103
+
104
+ // Default: disconnect to keep browser running for session persistence
105
+ // Use --close true to fully close browser
106
+ await (args.close === 'true' ? closeBrowser() : disconnectBrowser());
107
+ process.exit(0);
108
+ } catch (error) {
109
+ outputError(error);
110
+ }
111
+ }
112
+
113
+ monitorNetwork();
@@ -0,0 +1,16 @@
1
+ {
2
+ "name": "chrome-devtools-scripts",
3
+ "version": "1.1.0",
4
+ "description": "Browser automation scripts for Chrome DevTools Agent Skill",
5
+ "type": "module",
6
+ "scripts": {},
7
+ "dependencies": {
8
+ "debug": "^4.4.0",
9
+ "puppeteer": "^24.15.0",
10
+ "sharp": "^0.33.5",
11
+ "yargs": "^17.7.2"
12
+ },
13
+ "engines": {
14
+ "node": ">=18.0.0"
15
+ }
16
+ }