@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,159 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Measure performance metrics and record trace
4
+ * Usage: node performance.js --url https://example.com [--trace trace.json] [--metrics]
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 measurePerformance() {
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
+ // Start tracing if requested
34
+ if (args.trace) {
35
+ await page.tracing.start({
36
+ path: args.trace,
37
+ categories: [
38
+ 'devtools.timeline',
39
+ 'disabled-by-default-devtools.timeline',
40
+ 'disabled-by-default-devtools.timeline.frame',
41
+ ],
42
+ });
43
+ }
44
+
45
+ // Navigate
46
+ await page.goto(args.url, {
47
+ waitUntil: 'networkidle2',
48
+ });
49
+
50
+ // Stop tracing
51
+ if (args.trace) {
52
+ await page.tracing.stop();
53
+ }
54
+
55
+ // Get performance metrics
56
+ const metrics = await page.metrics();
57
+
58
+ // Get Core Web Vitals
59
+ const vitals = await page.evaluate(() => {
60
+ return new Promise((resolve) => {
61
+ const vitals = {
62
+ LCP: null,
63
+ FID: null,
64
+ CLS: 0,
65
+ FCP: null,
66
+ TTFB: null,
67
+ };
68
+
69
+ // LCP
70
+ try {
71
+ new PerformanceObserver((list) => {
72
+ const entries = list.getEntries();
73
+
74
+ if (entries.length > 0) {
75
+ const lastEntry = entries.at(-1);
76
+
77
+ vitals.LCP = lastEntry.renderTime || lastEntry.loadTime;
78
+ }
79
+ }).observe({ entryTypes: ['largest-contentful-paint'], buffered: true });
80
+ } catch {}
81
+
82
+ // CLS
83
+ try {
84
+ new PerformanceObserver((list) => {
85
+ list.getEntries().forEach((entry) => {
86
+ if (!entry.hadRecentInput) {
87
+ vitals.CLS += entry.value;
88
+ }
89
+ });
90
+ }).observe({ entryTypes: ['layout-shift'], buffered: true });
91
+ } catch {}
92
+
93
+ // FCP
94
+ try {
95
+ const paintEntries = performance.getEntriesByType('paint');
96
+ const fcpEntry = paintEntries.find((e) => e.name === 'first-contentful-paint');
97
+
98
+ if (fcpEntry) {
99
+ vitals.FCP = fcpEntry.startTime;
100
+ }
101
+ } catch {}
102
+
103
+ // TTFB
104
+ try {
105
+ const [navigationEntry] = performance.getEntriesByType('navigation');
106
+
107
+ if (navigationEntry) {
108
+ vitals.TTFB = navigationEntry.responseStart - navigationEntry.requestStart;
109
+ }
110
+ } catch {}
111
+
112
+ // Wait a bit for metrics to stabilize
113
+ setTimeout(() => resolve(vitals), 1000);
114
+ });
115
+ });
116
+
117
+ // Get resource timing
118
+ const resources = await page.evaluate(() => {
119
+ return performance.getEntriesByType('resource').map((r) => ({
120
+ name: r.name,
121
+ type: r.initiatorType,
122
+ duration: r.duration,
123
+ size: r.transferSize,
124
+ startTime: r.startTime,
125
+ }));
126
+ });
127
+
128
+ const result = {
129
+ success: true,
130
+ url: page.url(),
131
+ metrics: {
132
+ ...metrics,
133
+ JSHeapUsedSizeMB: (metrics.JSHeapUsedSize / 1024 / 1024).toFixed(2),
134
+ JSHeapTotalSizeMB: (metrics.JSHeapTotalSize / 1024 / 1024).toFixed(2),
135
+ },
136
+ vitals,
137
+ resources: {
138
+ count: resources.length,
139
+ totalDuration: resources.reduce((sum, r) => sum + r.duration, 0),
140
+ items: args.resources === 'true' ? resources : undefined,
141
+ },
142
+ };
143
+
144
+ if (args.trace) {
145
+ result.trace = args.trace;
146
+ }
147
+
148
+ outputJSON(result);
149
+
150
+ // Default: disconnect to keep browser running for session persistence
151
+ // Use --close true to fully close browser
152
+ await (args.close === 'true' ? closeBrowser() : disconnectBrowser());
153
+ process.exit(0);
154
+ } catch (error) {
155
+ outputError(error);
156
+ }
157
+ }
158
+
159
+ measurePerformance();
@@ -0,0 +1,212 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Take a screenshot
4
+ * Usage: node screenshot.js --output screenshot.png [--url https://example.com] [--full-page true] [--selector .element] [--max-size 5] [--no-compress]
5
+ * Supports both CSS and XPath selectors:
6
+ * - CSS: node screenshot.js --selector ".main-content" --output page.png
7
+ * - XPath: node screenshot.js --selector "//div[@class='main-content']" --output page.png
8
+ *
9
+ * Session behavior:
10
+ * By default, browser stays running for session persistence
11
+ * Use --close true to fully close browser
12
+ */
13
+ import fs from 'node:fs/promises';
14
+ import path from 'node:path';
15
+ import {
16
+ getBrowser,
17
+ getPage,
18
+ closeBrowser,
19
+ disconnectBrowser,
20
+ parseArgs,
21
+ outputJSON,
22
+ outputError,
23
+ } from './lib/browser.js';
24
+ import { parseSelector, getElement, enhanceError } from './lib/selector.js';
25
+
26
+ /**
27
+ * Check if Sharp is available
28
+ */
29
+ let sharp = null;
30
+
31
+ try {
32
+ sharp = (await import('sharp')).default;
33
+ } catch {
34
+ // Sharp not installed, compression disabled
35
+ }
36
+
37
+ /**
38
+ * Compress image using Sharp if it exceeds max size
39
+ * Sharp is 4-5x faster than ImageMagick with lower memory usage
40
+ * Falls back to no compression if Sharp is not installed
41
+ * @param {string} filePath - Path to the image file
42
+ * @param {number} maxSizeMB - Maximum file size in MB (default: 5)
43
+ * @returns {Promise<{compressed: boolean, originalSize: number, finalSize: number}>}
44
+ */
45
+ async function compressImageIfNeeded(filePath, maxSizeMB = 5) {
46
+ const stats = await fs.stat(filePath);
47
+ const originalSize = stats.size;
48
+ const maxSizeBytes = maxSizeMB * 1024 * 1024;
49
+
50
+ if (originalSize <= maxSizeBytes) {
51
+ return { compressed: false, originalSize, finalSize: originalSize };
52
+ }
53
+
54
+ if (!sharp) {
55
+ console.error('Warning: Sharp not installed. Run npm install to enable automatic compression.');
56
+
57
+ return { compressed: false, originalSize, finalSize: originalSize };
58
+ }
59
+
60
+ try {
61
+ const ext = path.extname(filePath).toLowerCase();
62
+ const imageBuffer = await fs.readFile(filePath);
63
+ const metadata = await sharp(imageBuffer).metadata();
64
+
65
+ // First pass: moderate compression
66
+ let outputBuffer;
67
+
68
+ switch (ext) {
69
+ case '.png': {
70
+ // PNG: resize to 90% and compress
71
+ const newWidth = Math.round(metadata.width * 0.9);
72
+
73
+ outputBuffer = await sharp(imageBuffer).resize(newWidth).png({ quality: 85, compressionLevel: 9 }).toBuffer();
74
+
75
+ break;
76
+ }
77
+ case '.jpg':
78
+ case '.jpeg': {
79
+ // JPEG: quality 80 with progressive encoding
80
+ outputBuffer = await sharp(imageBuffer).jpeg({ quality: 80, progressive: true, mozjpeg: true }).toBuffer();
81
+
82
+ break;
83
+ }
84
+ case '.webp': {
85
+ // WebP: quality 80
86
+ outputBuffer = await sharp(imageBuffer).webp({ quality: 80 }).toBuffer();
87
+
88
+ break;
89
+ }
90
+ default: {
91
+ // Other formats: convert to JPEG
92
+ outputBuffer = await sharp(imageBuffer).jpeg({ quality: 80, progressive: true, mozjpeg: true }).toBuffer();
93
+ }
94
+ }
95
+
96
+ // Second pass: aggressive compression if still too large
97
+ if (outputBuffer.length > maxSizeBytes) {
98
+ if (ext === '.png') {
99
+ const newWidth = Math.round(metadata.width * 0.75);
100
+
101
+ outputBuffer = await sharp(outputBuffer).resize(newWidth).png({ quality: 70, compressionLevel: 9 }).toBuffer();
102
+ } else {
103
+ outputBuffer = await sharp(outputBuffer).jpeg({ quality: 60, progressive: true, mozjpeg: true }).toBuffer();
104
+ }
105
+ }
106
+
107
+ // Write compressed image back to file
108
+ await fs.writeFile(filePath, outputBuffer);
109
+
110
+ return { compressed: true, originalSize, finalSize: outputBuffer.length };
111
+ } catch (error) {
112
+ console.error('Compression error:', error.message);
113
+
114
+ return { compressed: false, originalSize, finalSize: originalSize };
115
+ }
116
+ }
117
+
118
+ async function screenshot() {
119
+ const args = parseArgs(process.argv.slice(2));
120
+
121
+ if (!args.output) {
122
+ outputError(new Error('--output is required'));
123
+
124
+ return;
125
+ }
126
+
127
+ try {
128
+ const browser = await getBrowser({
129
+ headless: args.headless !== 'false',
130
+ });
131
+
132
+ const page = await getPage(browser);
133
+
134
+ // Navigate if URL provided
135
+ if (args.url) {
136
+ await page.goto(args.url, {
137
+ waitUntil: args['wait-until'] || 'networkidle2',
138
+ });
139
+ }
140
+
141
+ // Ensure output directory exists
142
+ const outputDir = path.dirname(path.resolve(args.output));
143
+
144
+ await fs.mkdir(outputDir, { recursive: true });
145
+
146
+ const screenshotOptions = {
147
+ path: args.output,
148
+ type: args.format || 'png',
149
+ fullPage: args['full-page'] === 'true',
150
+ };
151
+
152
+ if (args.quality) {
153
+ screenshotOptions.quality = Number.parseInt(args.quality);
154
+ }
155
+
156
+ let buffer;
157
+
158
+ if (args.selector) {
159
+ // Parse and validate selector
160
+ const parsed = parseSelector(args.selector);
161
+
162
+ // Get element based on selector type
163
+ const element = await getElement(page, parsed);
164
+
165
+ if (!element) {
166
+ throw new Error(`Element not found: ${args.selector}`);
167
+ }
168
+ buffer = await element.screenshot(screenshotOptions);
169
+ } else {
170
+ buffer = await page.screenshot(screenshotOptions);
171
+ }
172
+
173
+ const result = {
174
+ success: true,
175
+ output: path.resolve(args.output),
176
+ size: buffer.length,
177
+ url: page.url(),
178
+ };
179
+
180
+ // Compress image if needed (unless --no-compress flag is set)
181
+ if (args['no-compress'] !== 'true') {
182
+ const maxSize = args['max-size'] ? Number.parseFloat(args['max-size']) : 5;
183
+ const compressionResult = await compressImageIfNeeded(args.output, maxSize);
184
+
185
+ if (compressionResult.compressed) {
186
+ result.compressed = true;
187
+ result.originalSize = compressionResult.originalSize;
188
+ result.size = compressionResult.finalSize;
189
+ result.compressionRatio = `${((1 - compressionResult.finalSize / compressionResult.originalSize) * 100).toFixed(2)}%`;
190
+ }
191
+ }
192
+
193
+ outputJSON(result);
194
+
195
+ // Default: disconnect to keep browser running for session persistence
196
+ // Use --close true to fully close browser
197
+ await (args.close === 'true' ? closeBrowser() : disconnectBrowser());
198
+ process.exit(0);
199
+ } catch (error) {
200
+ // Enhance error message if selector-related
201
+ if (args.selector) {
202
+ const enhanced = enhanceError(error, args.selector);
203
+
204
+ outputError(enhanced);
205
+ } else {
206
+ outputError(error);
207
+ }
208
+ process.exit(1);
209
+ }
210
+ }
211
+
212
+ screenshot();
@@ -0,0 +1,151 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Select and interact with elements by ref from ARIA snapshot
4
+ * Usage: node select-ref.js --ref e5 --action click
5
+ * node select-ref.js --ref e10 --action fill --value "text"
6
+ * node select-ref.js --ref e3 --action screenshot --output element.png
7
+ *
8
+ * Actions:
9
+ * click - Click the element
10
+ * fill - Fill input with --value
11
+ * screenshot - Take screenshot of element
12
+ * text - Get text content
13
+ * focus - Focus the element
14
+ * hover - Hover over element
15
+ *
16
+ * Refs are obtained from aria-snapshot.js output (e.g., [ref=e5])
17
+ *
18
+ * Session behavior:
19
+ * By default, browser stays running for session persistence
20
+ * Use --close true to fully close browser
21
+ */
22
+ import fs from 'node:fs/promises';
23
+ import path from 'node:path';
24
+ import {
25
+ getBrowser,
26
+ getPage,
27
+ closeBrowser,
28
+ disconnectBrowser,
29
+ parseArgs,
30
+ outputJSON,
31
+ outputError,
32
+ } from './lib/browser.js';
33
+
34
+ async function selectRef() {
35
+ const args = parseArgs(process.argv.slice(2));
36
+
37
+ if (!args.ref) {
38
+ outputError(new Error('--ref is required (e.g., --ref e5)'));
39
+
40
+ return;
41
+ }
42
+
43
+ if (!args.action) {
44
+ outputError(new Error('--action is required (click, fill, screenshot, text, focus, hover)'));
45
+
46
+ return;
47
+ }
48
+
49
+ try {
50
+ const browser = await getBrowser({
51
+ headless: args.headless !== 'false',
52
+ });
53
+
54
+ const page = await getPage(browser);
55
+
56
+ // Get element by ref from window.__chromeDevToolsRefs
57
+ const element = await page.evaluateHandle((ref) => {
58
+ const refs = window.__chromeDevToolsRefs;
59
+
60
+ if (!refs) {
61
+ throw new Error('No refs available. Run aria-snapshot.js first to generate refs.');
62
+ }
63
+ const el = refs.get(ref);
64
+
65
+ if (!el) {
66
+ throw new Error(`Ref "${ref}" not found. Available refs: ${[...refs.keys()].join(', ')}`);
67
+ }
68
+
69
+ return el;
70
+ }, args.ref);
71
+
72
+ const elementHandle = element.asElement();
73
+
74
+ if (!elementHandle) {
75
+ throw new Error(`Could not get element handle for ref "${args.ref}"`);
76
+ }
77
+
78
+ const result = {
79
+ success: true,
80
+ ref: args.ref,
81
+ action: args.action,
82
+ };
83
+
84
+ // Perform action
85
+ switch (args.action) {
86
+ case 'click': {
87
+ await elementHandle.click();
88
+ result.message = 'Element clicked';
89
+ break;
90
+ }
91
+
92
+ case 'fill': {
93
+ if (!args.value && args.value !== '') {
94
+ throw new Error('--value is required for fill action');
95
+ }
96
+ await elementHandle.click({ clickCount: 3 }); // Select all
97
+ await elementHandle.type(args.value);
98
+ result.message = 'Element filled';
99
+ result.value = args.value;
100
+ break;
101
+ }
102
+
103
+ case 'screenshot': {
104
+ if (!args.output) {
105
+ throw new Error('--output is required for screenshot action');
106
+ }
107
+ const outputDir = path.dirname(args.output);
108
+
109
+ await fs.mkdir(outputDir, { recursive: true });
110
+ await elementHandle.screenshot({ path: args.output });
111
+ result.output = path.resolve(args.output);
112
+ result.message = 'Screenshot saved';
113
+ break;
114
+ }
115
+
116
+ case 'text': {
117
+ const text = await page.evaluate((el) => el.textContent?.trim(), elementHandle);
118
+
119
+ result.text = text;
120
+ break;
121
+ }
122
+
123
+ case 'focus': {
124
+ await elementHandle.focus();
125
+ result.message = 'Element focused';
126
+ break;
127
+ }
128
+
129
+ case 'hover': {
130
+ await elementHandle.hover();
131
+ result.message = 'Hovering over element';
132
+ break;
133
+ }
134
+
135
+ default: {
136
+ throw new Error(`Unknown action: ${args.action}. Valid actions: click, fill, screenshot, text, focus, hover`);
137
+ }
138
+ }
139
+
140
+ outputJSON(result);
141
+
142
+ // Default: disconnect to keep browser running for session persistence
143
+ // Use --close true to fully close browser
144
+ await (args.close === 'true' ? closeBrowser() : disconnectBrowser());
145
+ process.exit(0);
146
+ } catch (error) {
147
+ outputError(error);
148
+ }
149
+ }
150
+
151
+ selectRef();
@@ -0,0 +1,143 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Get DOM snapshot with selectors
4
+ * Usage: node snapshot.js [--url https://example.com] [--output snapshot.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 snapshot() {
18
+ const args = parseArgs(process.argv.slice(2));
19
+
20
+ try {
21
+ const browser = await getBrowser({
22
+ headless: args.headless !== 'false',
23
+ });
24
+
25
+ const page = await getPage(browser);
26
+
27
+ // Navigate if URL provided
28
+ if (args.url) {
29
+ await page.goto(args.url, {
30
+ waitUntil: args['wait-until'] || 'networkidle2',
31
+ });
32
+ }
33
+
34
+ // Get interactive elements with metadata
35
+ const elements = await page.evaluate(() => {
36
+ const interactiveSelectors = [
37
+ 'a[href]',
38
+ 'button',
39
+ 'input',
40
+ 'textarea',
41
+ 'select',
42
+ '[onclick]',
43
+ '[role="button"]',
44
+ '[role="link"]',
45
+ '[contenteditable]',
46
+ ];
47
+
48
+ const elements = [];
49
+ const selector = interactiveSelectors.join(', ');
50
+ const nodes = document.querySelectorAll(selector);
51
+
52
+ nodes.forEach((el, index) => {
53
+ const rect = el.getBoundingClientRect();
54
+
55
+ // Generate unique selector
56
+ let uniqueSelector = '';
57
+
58
+ if (el.id) {
59
+ uniqueSelector = `#${el.id}`;
60
+ } else if (el.className) {
61
+ const classes = [...el.classList].join('.');
62
+
63
+ uniqueSelector = `${el.tagName.toLowerCase()}.${classes}`;
64
+ } else {
65
+ uniqueSelector = el.tagName.toLowerCase();
66
+ }
67
+
68
+ elements.push({
69
+ index,
70
+ tagName: el.tagName.toLowerCase(),
71
+ type: el.type || null,
72
+ id: el.id || null,
73
+ className: el.className || null,
74
+ name: el.name || null,
75
+ value: el.value || null,
76
+ text: el.textContent?.trim().slice(0, 100) || null,
77
+ href: el.href || null,
78
+ selector: uniqueSelector,
79
+ xpath: getXPath(el),
80
+ visible: rect.width > 0 && rect.height > 0,
81
+ position: {
82
+ x: rect.x,
83
+ y: rect.y,
84
+ width: rect.width,
85
+ height: rect.height,
86
+ },
87
+ });
88
+ });
89
+
90
+ function getXPath(element) {
91
+ if (element.id) {
92
+ return `//*[@id="${element.id}"]`;
93
+ }
94
+ if (element === document.body) {
95
+ return '/html/body';
96
+ }
97
+ let ix = 0;
98
+ const siblings = element.parentNode?.childNodes || [];
99
+
100
+ for (const sibling of siblings) {
101
+ if (sibling === element) {
102
+ return `${getXPath(element.parentNode)}/${element.tagName.toLowerCase()}[${ix + 1}]`;
103
+ }
104
+ if (sibling.nodeType === 1 && sibling.tagName === element.tagName) {
105
+ ix++;
106
+ }
107
+ }
108
+
109
+ return '';
110
+ }
111
+
112
+ return elements;
113
+ });
114
+
115
+ const result = {
116
+ success: true,
117
+ url: page.url(),
118
+ title: await page.title(),
119
+ elementCount: elements.length,
120
+ elements,
121
+ };
122
+
123
+ if (args.output) {
124
+ await fs.writeFile(args.output, JSON.stringify(result, null, 2));
125
+ outputJSON({
126
+ success: true,
127
+ output: args.output,
128
+ elementCount: elements.length,
129
+ });
130
+ } else {
131
+ outputJSON(result);
132
+ }
133
+
134
+ // Default: disconnect to keep browser running for session persistence
135
+ // Use --close true to fully close browser
136
+ await (args.close === 'true' ? closeBrowser() : disconnectBrowser());
137
+ process.exit(0);
138
+ } catch (error) {
139
+ outputError(error);
140
+ }
141
+ }
142
+
143
+ snapshot();
@@ -0,0 +1,47 @@
1
+ import { getBrowser, getPage, disconnectBrowser, outputJSON } from './lib/browser.js';
2
+
3
+ async function debugWs() {
4
+ const browser = await getBrowser();
5
+ const page = await getPage(browser);
6
+
7
+ const logs = [];
8
+ const wsEvents = [];
9
+
10
+ // Capture console
11
+ page.on('console', (msg) => {
12
+ logs.push({ type: msg.type(), text: msg.text() });
13
+ });
14
+
15
+ // Monitor WebSocket via CDP
16
+ const client = await page.createCDPSession();
17
+
18
+ await client.send('Network.enable');
19
+
20
+ client.on('Network.webSocketCreated', (e) => wsEvents.push({ event: 'created', ...e }));
21
+ client.on('Network.webSocketWillSendHandshakeRequest', (e) => wsEvents.push({ event: 'handshake', ...e }));
22
+ client.on('Network.webSocketHandshakeResponseReceived', (e) => wsEvents.push({ event: 'response', ...e }));
23
+ client.on('Network.webSocketClosed', (e) => wsEvents.push({ event: 'closed', ...e }));
24
+ client.on('Network.webSocketFrameError', (e) => wsEvents.push({ event: 'error', ...e }));
25
+
26
+ await page.goto('http://localhost:5173', { waitUntil: 'networkidle0', timeout: 15_000 });
27
+
28
+ // Wait for WS connections
29
+ await new Promise((r) => setTimeout(r, 5000));
30
+
31
+ outputJSON({
32
+ success: true,
33
+ url: page.url(),
34
+ logs: logs.filter(
35
+ (l) => l.text.toLowerCase().includes('websocket') || l.text.toLowerCase().includes('ws') || l.type === 'error',
36
+ ),
37
+ wsEvents,
38
+ });
39
+
40
+ await disconnectBrowser();
41
+ process.exit(0);
42
+ }
43
+
44
+ debugWs().catch((error) => {
45
+ console.error(JSON.stringify({ success: false, error: error.message }));
46
+ process.exit(1);
47
+ });