@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,156 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * error-formatter.cjs - Rich, actionable error messages for scout-block
4
+ *
5
+ * Follows CLI UX best practices: Problem + Reason + Solution
6
+ * Supports ANSI colors with NO_COLOR env var respect.
7
+ */
8
+
9
+ const path = require('node:path');
10
+
11
+ // ANSI color codes
12
+ const COLORS = {
13
+ red: '\u001B[31m',
14
+ yellow: '\u001B[33m',
15
+ blue: '\u001B[34m',
16
+ cyan: '\u001B[36m',
17
+ bold: '\u001B[1m',
18
+ dim: '\u001B[2m',
19
+ reset: '\u001B[0m',
20
+ };
21
+
22
+ /**
23
+ * Check if terminal supports colors
24
+ * Respects NO_COLOR standard and FORCE_COLOR
25
+ *
26
+ * @returns {boolean}
27
+ */
28
+ function supportsColor() {
29
+ // Respect NO_COLOR standard (https://no-color.org/)
30
+ if (process.env.NO_COLOR !== undefined) return false;
31
+
32
+ // Respect FORCE_COLOR
33
+ if (process.env.FORCE_COLOR !== undefined) return true;
34
+
35
+ // Check if stderr is TTY (we output errors to stderr)
36
+ return process.stderr.isTTY || false;
37
+ }
38
+
39
+ /**
40
+ * Apply color to text if supported
41
+ *
42
+ * @param {string} text - Text to colorize
43
+ * @param {string} color - Color name from COLORS
44
+ * @returns {string}
45
+ */
46
+ function colorize(text, color) {
47
+ if (!supportsColor()) return text;
48
+ const colorCode = COLORS[color] || '';
49
+
50
+ return `${colorCode}${text}${COLORS.reset}`;
51
+ }
52
+
53
+ /**
54
+ * Get .cctkignore config path
55
+ *
56
+ * @param {string} claudeDir - Path to .claude directory
57
+ * @returns {string}
58
+ */
59
+ function formatConfigPath(claudeDir) {
60
+ if (claudeDir) {
61
+ return path.join(claudeDir, '.cctkignore');
62
+ }
63
+
64
+ return '.claude/.cctkignore';
65
+ }
66
+
67
+ /**
68
+ * Format a blocked path error with actionable guidance
69
+ *
70
+ * Pattern: What went wrong → Why → How to fix → Where to configure
71
+ *
72
+ * @param {Object} details - Error details
73
+ * @param {string} details.path - The blocked path
74
+ * @param {string} details.pattern - The pattern that matched
75
+ * @param {string} details.tool - The tool that was blocked
76
+ * @param {string} details.claudeDir - Path to .claude directory
77
+ * @returns {string}
78
+ */
79
+ function formatBlockedError(details) {
80
+ const { path: blockedPath, pattern, tool, claudeDir } = details;
81
+ const configPath = formatConfigPath(claudeDir);
82
+
83
+ // Truncate path if too long
84
+ const displayPath = blockedPath.length > 60 ? `...${blockedPath.slice(-57)}` : blockedPath;
85
+
86
+ const lines = [
87
+ '',
88
+ `${colorize('NOTE:', 'cyan')} This is not an error - this block is intentional to optimize context.`,
89
+ '',
90
+ `${colorize('BLOCKED', 'red')}: Access to '${displayPath}' denied`,
91
+ '',
92
+ ` ${colorize('Pattern:', 'yellow')} ${pattern}`,
93
+ ` ${colorize('Tool:', 'yellow')} ${tool || 'unknown'}`,
94
+ '',
95
+ ` ${colorize('To allow, add to', 'blue')} ${configPath}:`,
96
+ ` !${pattern}`,
97
+ '',
98
+ ` ${colorize('Config:', 'dim')} ${configPath}`,
99
+ '',
100
+ ];
101
+
102
+ return lines.join('\n');
103
+ }
104
+
105
+ /**
106
+ * Format a simple error message (one line, for piped output)
107
+ *
108
+ * @param {string} pattern - The pattern that matched
109
+ * @param {string} blockedPath - The path that was blocked
110
+ * @returns {string}
111
+ */
112
+ function formatSimpleError(pattern, blockedPath) {
113
+ return `ERROR: Blocked pattern '${pattern}' matched path: ${blockedPath}`;
114
+ }
115
+
116
+ /**
117
+ * Format error for machine-readable output (exit code 2)
118
+ * Used when stderr is not a TTY
119
+ *
120
+ * @param {Object} details - Error details
121
+ * @returns {string}
122
+ */
123
+ function formatMachineError(details) {
124
+ const { path: blockedPath, pattern, tool, claudeDir } = details;
125
+ const configPath = formatConfigPath(claudeDir);
126
+
127
+ return JSON.stringify({
128
+ error: 'BLOCKED',
129
+ path: blockedPath,
130
+ pattern,
131
+ tool,
132
+ config: configPath,
133
+ fix: `Add '!${pattern}' to ${configPath} to allow this path`,
134
+ });
135
+ }
136
+
137
+ /**
138
+ * Format a warning message (non-blocking)
139
+ *
140
+ * @param {string} message - Warning message
141
+ * @returns {string}
142
+ */
143
+ function formatWarning(message) {
144
+ return `${colorize('WARN:', 'yellow')} ${message}`;
145
+ }
146
+
147
+ module.exports = {
148
+ formatBlockedError,
149
+ formatSimpleError,
150
+ formatMachineError,
151
+ formatWarning,
152
+ formatConfigPath,
153
+ supportsColor,
154
+ colorize,
155
+ COLORS,
156
+ };
@@ -0,0 +1,359 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * path-extractor.cjs - Extract paths from Claude Code tool inputs
4
+ *
5
+ * Extracts file_path, path, pattern params and parses Bash commands
6
+ * to find all path-like arguments.
7
+ */
8
+
9
+ /**
10
+ * Extract all paths from a tool_input object
11
+ * Handles: file_path, path, pattern params and command strings
12
+ *
13
+ * @param {Object} toolInput - The tool_input from hook JSON
14
+ * @returns {string[]} Array of extracted paths
15
+ */
16
+ function extractFromToolInput(toolInput) {
17
+ const paths = [];
18
+
19
+ if (!toolInput || typeof toolInput !== 'object') {
20
+ return paths;
21
+ }
22
+
23
+ // Direct path params (Read, Edit, Write, Grep, Glob tools)
24
+ const directParams = ['file_path', 'path', 'pattern'];
25
+
26
+ for (const param of directParams) {
27
+ if (toolInput[param] && typeof toolInput[param] === 'string') {
28
+ const normalized = normalizeExtractedPath(toolInput[param]);
29
+
30
+ if (normalized) paths.push(normalized);
31
+ }
32
+ }
33
+
34
+ // Extract from Bash command if present
35
+ if (toolInput.command && typeof toolInput.command === 'string') {
36
+ const cmdPaths = extractFromCommand(toolInput.command);
37
+
38
+ paths.push(...cmdPaths);
39
+ }
40
+
41
+ return paths.filter(Boolean);
42
+ }
43
+
44
+ /**
45
+ * Extract path-like segments from a Bash command string
46
+ * Handles quoted paths and filters out non-path tokens
47
+ *
48
+ * @param {string} command - The command string
49
+ * @returns {string[]} Array of extracted paths
50
+ */
51
+ function extractFromCommand(command) {
52
+ if (!command || typeof command !== 'string') {
53
+ return [];
54
+ }
55
+
56
+ const paths = [];
57
+
58
+ // First, extract quoted strings (preserve spaces in paths)
59
+ const quotedPattern = /["']([^"']+)["']/g;
60
+ let match;
61
+
62
+ while ((match = quotedPattern.exec(command)) !== null) {
63
+ if (looksLikePath(match[1])) {
64
+ paths.push(normalizeExtractedPath(match[1]));
65
+ }
66
+ }
67
+
68
+ // Remove quoted strings for unquoted path extraction
69
+ const withoutQuotes = command.replaceAll(/["'][^"']*["']/g, ' ');
70
+
71
+ // Split on whitespace and extract path-like tokens
72
+ const tokens = withoutQuotes.split(/\s+/).filter(Boolean);
73
+
74
+ for (const token of tokens) {
75
+ // Skip flags and shell operators
76
+ if (isSkippableToken(token)) continue;
77
+
78
+ // Priority check: if token IS a blocked directory name exactly, include it
79
+ // This handles cases like "cd build" where "build" is both a command word
80
+ // and a blocked directory name
81
+ if (isBlockedDirName(token)) {
82
+ paths.push(normalizeExtractedPath(token));
83
+ continue;
84
+ }
85
+
86
+ // Skip common non-path command words
87
+ if (isCommandKeyword(token)) continue;
88
+
89
+ // Check if it looks like a path
90
+ if (looksLikePath(token)) {
91
+ paths.push(normalizeExtractedPath(token));
92
+ }
93
+ }
94
+
95
+ return paths;
96
+ }
97
+
98
+ // Common blocked directory names that should be extracted even if they
99
+ // match command keywords (e.g., "build" is both a subcommand and a dir name)
100
+ // Keep in sync with DEFAULT_PATTERNS in pattern-matcher.cjs
101
+ const BLOCKED_DIR_NAMES = [
102
+ 'node_modules',
103
+ '__pycache__',
104
+ '.git',
105
+ 'dist',
106
+ 'build',
107
+ '.next',
108
+ '.nuxt',
109
+ '.venv',
110
+ 'venv',
111
+ 'vendor',
112
+ 'target',
113
+ 'coverage',
114
+ ];
115
+
116
+ /**
117
+ * Check if token is exactly a blocked directory name
118
+ * This takes priority over command keyword filtering
119
+ *
120
+ * @param {string} token - Token to check
121
+ * @returns {boolean}
122
+ */
123
+ function isBlockedDirName(token) {
124
+ return BLOCKED_DIR_NAMES.includes(token);
125
+ }
126
+
127
+ /**
128
+ * Check if a string looks like a file path
129
+ *
130
+ * @param {string} str - String to check
131
+ * @returns {boolean}
132
+ */
133
+ function looksLikePath(str) {
134
+ if (!str || str.length < 2) return false;
135
+
136
+ // Contains path separator
137
+ if (str.includes('/') || str.includes('\\')) return true;
138
+
139
+ // Starts with relative path indicator
140
+ if (str.startsWith('./') || str.startsWith('../')) return true;
141
+
142
+ // Has file extension (likely a file)
143
+ if (/\.\w{1,6}$/.test(str)) return true;
144
+
145
+ // Contains common blocked directory names
146
+ if (/node_modules|__pycache__|\.git|dist|build/.test(str)) return true;
147
+
148
+ // Looks like a directory path
149
+ if (/^[a-zA-Z0-9_-]+\//.test(str)) return true;
150
+
151
+ return false;
152
+ }
153
+
154
+ /**
155
+ * Check if token should be skipped (flags, operators)
156
+ *
157
+ * @param {string} token - Token to check
158
+ * @returns {boolean}
159
+ */
160
+ function isSkippableToken(token) {
161
+ // Flags
162
+ if (token.startsWith('-')) return true;
163
+
164
+ // Shell operators
165
+ if (['|', '||', '&&', '>', '>>', '<', '<<', '&', ';'].includes(token)) return true;
166
+ if (token.startsWith('|') || token.startsWith('>') || token.startsWith('<')) return true;
167
+ if (token.startsWith('&')) return true;
168
+
169
+ // Numeric values
170
+ if (/^\d+$/.test(token)) return true;
171
+
172
+ return false;
173
+ }
174
+
175
+ /**
176
+ * Check if token is a common command keyword (not a path)
177
+ *
178
+ * @param {string} token - Token to check
179
+ * @returns {boolean}
180
+ */
181
+ function isCommandKeyword(token) {
182
+ const keywords = [
183
+ // Shell commands
184
+ 'echo',
185
+ 'cat',
186
+ 'ls',
187
+ 'cd',
188
+ 'rm',
189
+ 'cp',
190
+ 'mv',
191
+ 'find',
192
+ 'grep',
193
+ 'head',
194
+ 'tail',
195
+ 'wc',
196
+ 'du',
197
+ 'tree',
198
+ 'touch',
199
+ 'mkdir',
200
+ 'rmdir',
201
+ 'pwd',
202
+ 'which',
203
+ 'env',
204
+ 'export',
205
+ 'source',
206
+ 'bash',
207
+ 'sh',
208
+ 'zsh',
209
+ 'true',
210
+ 'false',
211
+ 'test',
212
+ 'xargs',
213
+ 'tee',
214
+ 'sort',
215
+ 'uniq',
216
+ 'cut',
217
+ 'tr',
218
+ 'sed',
219
+ 'awk',
220
+ 'diff',
221
+ 'chmod',
222
+ 'chown',
223
+ 'ln',
224
+ 'file',
225
+
226
+ // Package managers and their subcommands
227
+ 'npm',
228
+ 'pnpm',
229
+ 'yarn',
230
+ 'bun',
231
+ 'npx',
232
+ 'pnpx',
233
+ 'bunx',
234
+ 'node',
235
+ 'run',
236
+ 'build',
237
+ 'test',
238
+ 'lint',
239
+ 'dev',
240
+ 'start',
241
+ 'install',
242
+ 'ci',
243
+ 'exec',
244
+ 'add',
245
+ 'remove',
246
+ 'update',
247
+ 'publish',
248
+ 'pack',
249
+ 'init',
250
+ 'create',
251
+
252
+ // Build tools
253
+ 'tsc',
254
+ 'esbuild',
255
+ 'vite',
256
+ 'webpack',
257
+ 'rollup',
258
+ 'turbo',
259
+ 'nx',
260
+ 'jest',
261
+ 'vitest',
262
+ 'mocha',
263
+ 'eslint',
264
+ 'prettier',
265
+
266
+ // Git
267
+ 'git',
268
+ 'commit',
269
+ 'push',
270
+ 'pull',
271
+ 'merge',
272
+ 'rebase',
273
+ 'checkout',
274
+ 'branch',
275
+ 'status',
276
+ 'log',
277
+ 'diff',
278
+ 'add',
279
+ 'reset',
280
+ 'stash',
281
+ 'fetch',
282
+ 'clone',
283
+
284
+ // Docker
285
+ 'docker',
286
+ 'compose',
287
+ 'up',
288
+ 'down',
289
+ 'ps',
290
+ 'logs',
291
+ 'exec',
292
+ 'container',
293
+ 'image',
294
+
295
+ // Misc
296
+ 'sudo',
297
+ 'time',
298
+ 'timeout',
299
+ 'watch',
300
+ 'make',
301
+ 'cargo',
302
+ 'python',
303
+ 'python3',
304
+ 'pip',
305
+ 'ruby',
306
+ 'gem',
307
+ 'go',
308
+ 'rust',
309
+ 'java',
310
+ 'javac',
311
+ 'mvn',
312
+ 'gradle',
313
+ ];
314
+
315
+ return keywords.includes(token.toLowerCase());
316
+ }
317
+
318
+ /**
319
+ * Normalize an extracted path
320
+ * - Remove surrounding quotes
321
+ * - Normalize path separators to forward slash
322
+ *
323
+ * @param {string} path - Path to normalize
324
+ * @returns {string} Normalized path
325
+ */
326
+ function normalizeExtractedPath(path) {
327
+ if (!path) return '';
328
+
329
+ let normalized = path.trim();
330
+
331
+ // Remove surrounding quotes
332
+ if (
333
+ (normalized.startsWith('"') && normalized.endsWith('"')) ||
334
+ (normalized.startsWith("'") && normalized.endsWith("'"))
335
+ ) {
336
+ normalized = normalized.slice(1, -1);
337
+ }
338
+
339
+ // Normalize path separators to forward slash
340
+ normalized = normalized.replaceAll('\\', '/');
341
+
342
+ // Remove trailing slash for consistency
343
+ if (normalized.endsWith('/') && normalized.length > 1) {
344
+ normalized = normalized.slice(0, -1);
345
+ }
346
+
347
+ return normalized;
348
+ }
349
+
350
+ module.exports = {
351
+ extractFromToolInput,
352
+ extractFromCommand,
353
+ looksLikePath,
354
+ isSkippableToken,
355
+ isCommandKeyword,
356
+ isBlockedDirName,
357
+ normalizeExtractedPath,
358
+ BLOCKED_DIR_NAMES,
359
+ };
@@ -0,0 +1,184 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * pattern-matcher.cjs - Gitignore-spec compliant pattern matching
4
+ *
5
+ * Uses 'ignore' package for .cctkignore parsing and path matching.
6
+ * Supports negation patterns (!) for allowlisting.
7
+ */
8
+
9
+ const fs = require('node:fs');
10
+ const path = require('node:path');
11
+ const Ignore = require('./vendor/ignore');
12
+
13
+ // Default patterns if .cctkignore doesn't exist or is empty
14
+ // Only includes directories with HEAVY file counts (1000+ files typical)
15
+ const DEFAULT_PATTERNS = [
16
+ // JavaScript/TypeScript - package dependencies & build outputs
17
+ 'node_modules',
18
+ 'dist',
19
+ 'build',
20
+ '.next',
21
+ '.nuxt',
22
+ // Python - virtualenvs & cache
23
+ '__pycache__',
24
+ '.venv',
25
+ 'venv',
26
+ // Go/PHP - vendor dependencies
27
+ 'vendor',
28
+ // Rust/Java - compiled outputs
29
+ 'target',
30
+ // Version control
31
+ '.git',
32
+ // Test coverage (can be large with reports)
33
+ 'coverage',
34
+ ];
35
+
36
+ /**
37
+ * Load patterns from .cctkignore file
38
+ * Falls back to DEFAULT_PATTERNS if file doesn't exist or is empty
39
+ *
40
+ * @param {string} ckignorePath - Path to .cctkignore file
41
+ * @returns {string[]} Array of patterns
42
+ */
43
+ function loadPatterns(ckignorePath) {
44
+ if (!ckignorePath || !fs.existsSync(ckignorePath)) {
45
+ return DEFAULT_PATTERNS;
46
+ }
47
+
48
+ try {
49
+ const content = fs.readFileSync(ckignorePath, 'utf8');
50
+ const patterns = content
51
+ .split('\n')
52
+ .map((line) => line.trim())
53
+ .filter((line) => line && !line.startsWith('#'));
54
+
55
+ return patterns.length > 0 ? patterns : DEFAULT_PATTERNS;
56
+ } catch (error) {
57
+ console.error('WARN: Failed to read .cctkignore:', error.message);
58
+
59
+ return DEFAULT_PATTERNS;
60
+ }
61
+ }
62
+
63
+ /**
64
+ * Create a matcher from patterns
65
+ * Normalizes patterns to match anywhere in the path tree
66
+ *
67
+ * @param {string[]} patterns - Array of patterns from .cctkignore
68
+ * @returns {Object} Matcher object with ig instance and pattern info
69
+ */
70
+ function createMatcher(patterns) {
71
+ const ig = Ignore();
72
+
73
+ // Normalize patterns to match anywhere in path tree
74
+ // e.g., "node_modules" becomes "**\/node_modules" and "**\/node_modules/**"
75
+ const normalizedPatterns = [];
76
+
77
+ for (const p of patterns) {
78
+ if (p.startsWith('!')) {
79
+ // Negation pattern - un-ignore
80
+ const inner = p.slice(1);
81
+
82
+ if (inner.includes('/') || inner.includes('*')) {
83
+ // Already has path or glob - use as-is
84
+ normalizedPatterns.push(p);
85
+ } else {
86
+ // Simple dir name - match anywhere
87
+ normalizedPatterns.push(`!**/${inner}`, `!**/${inner}/**`);
88
+ }
89
+ } else {
90
+ // Block pattern
91
+ if (p.includes('/') || p.includes('*')) {
92
+ // Already has path or glob - use as-is
93
+ normalizedPatterns.push(p);
94
+ } else {
95
+ // Simple dir name - match the dir and contents anywhere
96
+ normalizedPatterns.push(`**/${p}`, `**/${p}/**`, p, `${p}/**`);
97
+ }
98
+ }
99
+ }
100
+
101
+ ig.add(normalizedPatterns);
102
+
103
+ return {
104
+ ig,
105
+ patterns: normalizedPatterns,
106
+ original: patterns,
107
+ };
108
+ }
109
+
110
+ /**
111
+ * Check if a path should be blocked
112
+ *
113
+ * @param {Object} matcher - Matcher object from createMatcher
114
+ * @param {string} testPath - Path to test
115
+ * @returns {Object} { blocked: boolean, pattern?: string }
116
+ */
117
+ function matchPath(matcher, testPath) {
118
+ if (!testPath || typeof testPath !== 'string') {
119
+ return { blocked: false };
120
+ }
121
+
122
+ // Normalize path separators (Windows backslash to forward slash)
123
+ let normalized = testPath.replaceAll('\\', '/');
124
+
125
+ // Remove leading ./ if present
126
+ if (normalized.startsWith('./')) {
127
+ normalized = normalized.slice(2);
128
+ }
129
+
130
+ // Check if path is ignored (blocked)
131
+ const blocked = matcher.ig.ignores(normalized);
132
+
133
+ if (blocked) {
134
+ // Find which original pattern matched for error message
135
+ const matchedPattern = findMatchingPattern(matcher.original, normalized);
136
+
137
+ return { blocked: true, pattern: matchedPattern };
138
+ }
139
+
140
+ return { blocked: false };
141
+ }
142
+
143
+ /**
144
+ * Find which original pattern matched (for error messages)
145
+ *
146
+ * @param {string[]} originalPatterns - Original patterns from .cctkignore
147
+ * @param {string} path - The path that was blocked
148
+ * @returns {string} The pattern that matched
149
+ */
150
+ function findMatchingPattern(originalPatterns, path) {
151
+ for (const p of originalPatterns) {
152
+ if (p.startsWith('!')) continue; // Skip negations
153
+
154
+ // Simple substring check for common cases
155
+ const pattern = p.replaceAll('**', '').replaceAll('*', '');
156
+
157
+ if (pattern && path.includes(pattern)) {
158
+ return p;
159
+ }
160
+
161
+ // For more complex patterns, use ignore to test individually
162
+ const tempIg = Ignore();
163
+
164
+ if (p.includes('/') || p.includes('*')) {
165
+ tempIg.add(p);
166
+ } else {
167
+ tempIg.add([`**/${p}`, `**/${p}/**`, p, `${p}/**`]);
168
+ }
169
+
170
+ if (tempIg.ignores(path)) {
171
+ return p;
172
+ }
173
+ }
174
+
175
+ return originalPatterns.find((p) => !p.startsWith('!')) || 'unknown';
176
+ }
177
+
178
+ module.exports = {
179
+ loadPatterns,
180
+ createMatcher,
181
+ matchPath,
182
+ findMatchingPattern,
183
+ DEFAULT_PATTERNS,
184
+ };