cokit-cli 1.0.1 → 1.0.3

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 (564) hide show
  1. package/AGENTS.md +103 -0
  2. package/README.FLOW.md +237 -0
  3. package/README.md +153 -94
  4. package/agents/brainstormer.agent.md +71 -0
  5. package/agents/code-reviewer.agent.md +128 -0
  6. package/agents/database-admin.agent.md +91 -0
  7. package/agents/debugger.agent.md +128 -0
  8. package/agents/docs-manager.agent.md +121 -0
  9. package/agents/fullstack-developer.agent.md +96 -0
  10. package/agents/git-manager.agent.md +392 -0
  11. package/agents/mcp-manager.agent.md +93 -0
  12. package/agents/planner.agent.md +94 -0
  13. package/agents/project-manager.agent.md +124 -0
  14. package/agents/researcher.agent.md +32 -0
  15. package/agents/scout-external.agent.md +141 -0
  16. package/agents/scout.agent.md +107 -0
  17. package/agents/tester.agent.md +106 -0
  18. package/agents/ui-ux-designer.agent.md +225 -0
  19. package/collections/ck-core.collection.yml +30 -0
  20. package/collections/ck-development-rules.collection.yml +18 -0
  21. package/collections/ck-documentation.collection.yml +18 -0
  22. package/collections/ck-git-workflow.collection.yml +18 -0
  23. package/collections/ck-orchestration.collection.yml +22 -0
  24. package/collections/ck-ui-design.collection.yml +18 -0
  25. package/docs/README.md +85 -0
  26. package/docs/copilot-processing-flow.md +128 -0
  27. package/instructions/ck-backend.instructions.md +48 -0
  28. package/instructions/ck-development.instructions.md +40 -0
  29. package/instructions/ck-frontend-design-pro.instructions.md +58 -0
  30. package/instructions/ck-frontend.instructions.md +44 -0
  31. package/instructions/ck-google-adk-python.instructions.md +242 -0
  32. package/instructions/ck-research.instructions.md +167 -0
  33. package/instructions/ck-testing.instructions.md +36 -0
  34. package/package.json +9 -2
  35. package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/phase-01-restructure-folders.md +183 -0
  36. package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/phase-02-convert-agents.md +206 -0
  37. package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/phase-03-convert-commands-to-prompts.md +284 -0
  38. package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/phase-04-convert-skills-to-instructions.md +349 -0
  39. package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/phase-05-create-collections.md +320 -0
  40. package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/phase-06-update-cli-build-scripts.md +450 -0
  41. package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/phase-07-update-documentation.md +407 -0
  42. package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/plan.md +136 -0
  43. package/prompts/ck-ask.prompt.md +57 -0
  44. package/prompts/ck-bootstrap-auto-fast.prompt.md +108 -0
  45. package/prompts/ck-bootstrap-auto-parallel.prompt.md +66 -0
  46. package/prompts/ck-bootstrap-auto.prompt.md +114 -0
  47. package/prompts/ck-bootstrap.prompt.md +136 -0
  48. package/prompts/ck-brainstorm.prompt.md +68 -0
  49. package/prompts/ck-ck-help.prompt.md +114 -0
  50. package/prompts/ck-code-auto.prompt.md +171 -0
  51. package/prompts/ck-code-no-test.prompt.md +159 -0
  52. package/prompts/ck-code-parallel.prompt.md +56 -0
  53. package/prompts/ck-code.prompt.md +177 -0
  54. package/prompts/ck-coding-level.prompt.md +54 -0
  55. package/prompts/ck-cook-auto-fast.prompt.md +26 -0
  56. package/prompts/ck-cook-auto-parallel.prompt.md +49 -0
  57. package/prompts/ck-cook-auto.prompt.md +15 -0
  58. package/prompts/ck-cook.prompt.md +96 -0
  59. package/prompts/ck-debug.prompt.md +14 -0
  60. package/prompts/ck-design-3d.prompt.md +84 -0
  61. package/prompts/ck-design-describe.prompt.md +24 -0
  62. package/prompts/ck-design-fast.prompt.md +32 -0
  63. package/prompts/ck-design-good.prompt.md +36 -0
  64. package/prompts/ck-design-screenshot.prompt.md +35 -0
  65. package/prompts/ck-design-video.prompt.md +35 -0
  66. package/prompts/ck-docs-init.prompt.md +27 -0
  67. package/prompts/ck-docs-summarize.prompt.md +23 -0
  68. package/prompts/ck-docs-update.prompt.md +36 -0
  69. package/prompts/ck-fix-ci.prompt.md +18 -0
  70. package/prompts/ck-fix-fast.prompt.md +18 -0
  71. package/prompts/ck-fix-hard.prompt.md +36 -0
  72. package/prompts/ck-fix-logs.prompt.md +27 -0
  73. package/prompts/ck-fix-parallel.prompt.md +54 -0
  74. package/prompts/ck-fix-test.prompt.md +19 -0
  75. package/prompts/ck-fix-types.prompt.md +11 -0
  76. package/prompts/ck-fix-ui.prompt.md +49 -0
  77. package/prompts/ck-fix.prompt.md +44 -0
  78. package/prompts/ck-git-cm.prompt.md +8 -0
  79. package/prompts/ck-git-cp.prompt.md +7 -0
  80. package/prompts/ck-git-merge.prompt.md +41 -0
  81. package/prompts/ck-git-pr.prompt.md +49 -0
  82. package/prompts/ck-kanban.prompt.md +77 -0
  83. package/prompts/ck-plan-archive.prompt.md +58 -0
  84. package/prompts/ck-plan-ci.prompt.md +34 -0
  85. package/prompts/ck-plan-cro.prompt.md +66 -0
  86. package/prompts/ck-plan-fast.prompt.md +67 -0
  87. package/prompts/ck-plan-hard.prompt.md +89 -0
  88. package/prompts/ck-plan-parallel.prompt.md +126 -0
  89. package/prompts/ck-plan-two.prompt.md +43 -0
  90. package/prompts/ck-plan-validate.prompt.md +118 -0
  91. package/prompts/ck-plan.prompt.md +29 -1
  92. package/prompts/ck-preview.prompt.md +65 -0
  93. package/prompts/ck-review-codebase.prompt.md +44 -0
  94. package/prompts/ck-scout-ext.prompt.md +35 -0
  95. package/prompts/ck-scout.prompt.md +25 -0
  96. package/prompts/ck-skill-add.prompt.md +36 -0
  97. package/prompts/ck-skill-create.prompt.md +29 -0
  98. package/prompts/ck-skill-fix-logs.prompt.md +22 -0
  99. package/prompts/ck-skill-optimize-auto.prompt.md +25 -0
  100. package/prompts/ck-skill-optimize.prompt.md +34 -0
  101. package/prompts/ck-skill-plan.prompt.md +46 -0
  102. package/prompts/ck-test-ui.prompt.md +92 -0
  103. package/prompts/ck-test.prompt.md +10 -0
  104. package/prompts/ck-use-mcp.prompt.md +27 -0
  105. package/prompts/ck-watzup.prompt.md +11 -0
  106. package/prompts/ck-worktree.prompt.md +127 -0
  107. package/rules/README.agents.md +55 -0
  108. package/rules/README.collections.md +78 -0
  109. package/rules/README.copilot-instructions.md +66 -0
  110. package/rules/README.instructions.md +73 -0
  111. package/rules/README.md +39 -0
  112. package/rules/README.prompts.md +76 -0
  113. package/rules/README.skills.md +71 -0
  114. package/skills/ck-ai-artist/SKILL.md +73 -0
  115. package/skills/ck-ai-artist/references/advanced-techniques.md +184 -0
  116. package/skills/ck-ai-artist/references/domain-code.md +66 -0
  117. package/skills/ck-ai-artist/references/domain-data.md +72 -0
  118. package/skills/ck-ai-artist/references/domain-marketing.md +66 -0
  119. package/skills/ck-ai-artist/references/domain-patterns.md +33 -0
  120. package/skills/ck-ai-artist/references/domain-writing.md +68 -0
  121. package/skills/ck-ai-artist/references/image-prompting.md +141 -0
  122. package/skills/ck-ai-artist/references/llm-prompting.md +165 -0
  123. package/skills/ck-ai-artist/references/nano-banana.md +59 -0
  124. package/skills/ck-ai-artist/references/reasoning-techniques.md +201 -0
  125. package/skills/ck-backend-development/SKILL.md +93 -0
  126. package/skills/ck-backend-development/references/backend-api-design.md +495 -0
  127. package/skills/ck-backend-development/references/backend-architecture.md +454 -0
  128. package/skills/ck-backend-development/references/backend-authentication.md +338 -0
  129. package/skills/ck-backend-development/references/backend-code-quality.md +659 -0
  130. package/skills/ck-backend-development/references/backend-debugging.md +904 -0
  131. package/skills/ck-backend-development/references/backend-devops.md +494 -0
  132. package/skills/ck-backend-development/references/backend-mindset.md +387 -0
  133. package/skills/ck-backend-development/references/backend-performance.md +397 -0
  134. package/skills/ck-backend-development/references/backend-security.md +290 -0
  135. package/skills/ck-backend-development/references/backend-technologies.md +256 -0
  136. package/skills/ck-backend-development/references/backend-testing.md +429 -0
  137. package/skills/ck-better-auth/SKILL.md +202 -0
  138. package/skills/ck-better-auth/references/advanced-features.md +553 -0
  139. package/skills/ck-better-auth/references/database-integration.md +577 -0
  140. package/skills/ck-better-auth/references/email-password-auth.md +416 -0
  141. package/skills/ck-better-auth/references/oauth-providers.md +430 -0
  142. package/skills/ck-better-auth/scripts/.coverage +0 -0
  143. package/skills/ck-better-auth/scripts/better_auth_init.py +521 -0
  144. package/skills/ck-better-auth/scripts/requirements.txt +15 -0
  145. package/skills/ck-better-auth/scripts/tests/.coverage +0 -0
  146. package/skills/ck-better-auth/scripts/tests/test_better_auth_init.py +421 -0
  147. package/skills/ck-chrome-devtools/SKILL.md +470 -0
  148. package/skills/ck-chrome-devtools/references/cdp-domains.md +694 -0
  149. package/skills/ck-chrome-devtools/references/performance-guide.md +940 -0
  150. package/skills/ck-chrome-devtools/references/puppeteer-reference.md +953 -0
  151. package/skills/ck-chrome-devtools/scripts/README.md +272 -0
  152. package/skills/ck-chrome-devtools/scripts/__tests__/selector.test.js +210 -0
  153. package/skills/ck-chrome-devtools/scripts/aria-snapshot.js +362 -0
  154. package/skills/ck-chrome-devtools/scripts/click.js +83 -0
  155. package/skills/ck-chrome-devtools/scripts/console.js +79 -0
  156. package/skills/ck-chrome-devtools/scripts/evaluate.js +53 -0
  157. package/skills/ck-chrome-devtools/scripts/fill.js +76 -0
  158. package/skills/ck-chrome-devtools/scripts/inject-auth.js +229 -0
  159. package/skills/ck-chrome-devtools/scripts/install-deps.sh +181 -0
  160. package/skills/ck-chrome-devtools/scripts/install.sh +83 -0
  161. package/skills/ck-chrome-devtools/scripts/lib/browser.js +318 -0
  162. package/skills/ck-chrome-devtools/scripts/lib/selector.js +178 -0
  163. package/skills/ck-chrome-devtools/scripts/navigate.js +54 -0
  164. package/skills/ck-chrome-devtools/scripts/network.js +106 -0
  165. package/skills/ck-chrome-devtools/scripts/package-lock.json +1589 -0
  166. package/skills/ck-chrome-devtools/scripts/package.json +16 -0
  167. package/skills/ck-chrome-devtools/scripts/performance.js +149 -0
  168. package/skills/ck-chrome-devtools/scripts/screenshot.js +198 -0
  169. package/skills/ck-chrome-devtools/scripts/select-ref.js +131 -0
  170. package/skills/ck-chrome-devtools/scripts/snapshot.js +135 -0
  171. package/skills/ck-code-review/SKILL.md +110 -53
  172. package/skills/ck-code-review/references/code-review-reception.md +182 -49
  173. package/skills/ck-code-review/references/requesting-code-review.md +105 -0
  174. package/skills/ck-code-review/references/verification-before-completion.md +111 -58
  175. package/skills/ck-databases/SKILL.md +231 -0
  176. package/skills/ck-databases/references/mongodb-aggregation.md +447 -0
  177. package/skills/ck-databases/references/mongodb-atlas.md +465 -0
  178. package/skills/ck-databases/references/mongodb-crud.md +408 -0
  179. package/skills/ck-databases/references/mongodb-indexing.md +442 -0
  180. package/skills/ck-databases/references/postgresql-administration.md +594 -0
  181. package/skills/ck-databases/references/postgresql-performance.md +527 -0
  182. package/skills/ck-databases/references/postgresql-psql-cli.md +467 -0
  183. package/skills/ck-databases/references/postgresql-queries.md +475 -0
  184. package/skills/ck-databases/scripts/.coverage +0 -0
  185. package/skills/ck-databases/scripts/db_backup.py +502 -0
  186. package/skills/ck-databases/scripts/db_migrate.py +425 -0
  187. package/skills/ck-databases/scripts/db_performance_check.py +456 -0
  188. package/skills/ck-databases/scripts/requirements.txt +20 -0
  189. package/skills/ck-databases/scripts/tests/coverage-db.json +1 -0
  190. package/skills/ck-databases/scripts/tests/requirements.txt +4 -0
  191. package/skills/ck-databases/scripts/tests/test_db_backup.py +340 -0
  192. package/skills/ck-databases/scripts/tests/test_db_migrate.py +277 -0
  193. package/skills/ck-databases/scripts/tests/test_db_performance_check.py +370 -0
  194. package/skills/ck-debugging/SKILL.md +55 -43
  195. package/skills/ck-debugging/references/defense-in-depth.md +124 -0
  196. package/skills/ck-debugging/references/root-cause-tracing.md +100 -43
  197. package/skills/ck-debugging/references/systematic-debugging.md +80 -52
  198. package/skills/ck-debugging/references/verification.md +101 -52
  199. package/skills/ck-debugging/scripts/find-polluter.sh +63 -0
  200. package/skills/ck-debugging/scripts/find-polluter.test.md +102 -0
  201. package/skills/ck-devops/.env.example +76 -0
  202. package/skills/ck-devops/SKILL.md +283 -0
  203. package/skills/ck-devops/references/browser-rendering.md +305 -0
  204. package/skills/ck-devops/references/cloudflare-d1-kv.md +123 -0
  205. package/skills/ck-devops/references/cloudflare-platform.md +271 -0
  206. package/skills/ck-devops/references/cloudflare-r2-storage.md +280 -0
  207. package/skills/ck-devops/references/cloudflare-workers-advanced.md +312 -0
  208. package/skills/ck-devops/references/cloudflare-workers-apis.md +309 -0
  209. package/skills/ck-devops/references/cloudflare-workers-basics.md +418 -0
  210. package/skills/ck-devops/references/docker-basics.md +297 -0
  211. package/skills/ck-devops/references/docker-compose.md +292 -0
  212. package/skills/ck-devops/references/gcloud-platform.md +297 -0
  213. package/skills/ck-devops/references/gcloud-services.md +304 -0
  214. package/skills/ck-devops/scripts/cloudflare_deploy.py +269 -0
  215. package/skills/ck-devops/scripts/docker_optimize.py +331 -0
  216. package/skills/ck-devops/scripts/requirements.txt +20 -0
  217. package/skills/ck-devops/scripts/tests/requirements.txt +3 -0
  218. package/skills/ck-devops/scripts/tests/test_cloudflare_deploy.py +285 -0
  219. package/skills/ck-devops/scripts/tests/test_docker_optimize.py +436 -0
  220. package/skills/ck-docs-seeker/.env.example +15 -0
  221. package/skills/ck-docs-seeker/SKILL.md +70 -65
  222. package/skills/ck-docs-seeker/package.json +25 -0
  223. package/skills/ck-docs-seeker/references/advanced.md +79 -0
  224. package/skills/ck-docs-seeker/references/context7-patterns.md +68 -0
  225. package/skills/ck-docs-seeker/references/errors.md +68 -0
  226. package/skills/ck-docs-seeker/scripts/analyze-llms-txt.js +211 -0
  227. package/skills/ck-docs-seeker/scripts/detect-topic.js +172 -0
  228. package/skills/ck-docs-seeker/scripts/fetch-docs.js +213 -0
  229. package/skills/ck-docs-seeker/scripts/tests/run-tests.js +72 -0
  230. package/skills/ck-docs-seeker/scripts/tests/test-analyze-llms.js +119 -0
  231. package/skills/ck-docs-seeker/scripts/tests/test-detect-topic.js +112 -0
  232. package/skills/ck-docs-seeker/scripts/tests/test-fetch-docs.js +84 -0
  233. package/skills/ck-docs-seeker/scripts/utils/env-loader.js +94 -0
  234. package/skills/ck-docs-seeker/workflows/library-search.md +87 -0
  235. package/skills/ck-docs-seeker/workflows/repo-analysis.md +91 -0
  236. package/skills/ck-docs-seeker/workflows/topic-search.md +77 -0
  237. package/skills/ck-frontend-design/SKILL.md +79 -0
  238. package/skills/ck-frontend-design/references/analysis-best-practices.md +80 -0
  239. package/skills/ck-frontend-design/references/analysis-prompts.md +141 -0
  240. package/skills/ck-frontend-design/references/analysis-techniques.md +118 -0
  241. package/skills/ck-frontend-design/references/animejs.md +396 -0
  242. package/skills/ck-frontend-design/references/design-extraction-overview.md +71 -0
  243. package/skills/ck-frontend-design/references/extraction-best-practices.md +141 -0
  244. package/skills/ck-frontend-design/references/extraction-output-templates.md +162 -0
  245. package/skills/ck-frontend-design/references/extraction-prompts.md +127 -0
  246. package/skills/ck-frontend-design/references/technical-accessibility.md +119 -0
  247. package/skills/ck-frontend-design/references/technical-best-practices.md +97 -0
  248. package/skills/ck-frontend-design/references/technical-optimization.md +44 -0
  249. package/skills/ck-frontend-design/references/technical-overview.md +90 -0
  250. package/skills/ck-frontend-design/references/technical-workflows.md +150 -0
  251. package/skills/ck-frontend-design/references/visual-analysis-overview.md +95 -0
  252. package/skills/ck-frontend-development/SKILL.md +399 -0
  253. package/skills/ck-frontend-development/resources/common-patterns.md +331 -0
  254. package/skills/ck-frontend-development/resources/complete-examples.md +872 -0
  255. package/skills/ck-frontend-development/resources/component-patterns.md +502 -0
  256. package/skills/ck-frontend-development/resources/data-fetching.md +767 -0
  257. package/skills/ck-frontend-development/resources/file-organization.md +502 -0
  258. package/skills/ck-frontend-development/resources/loading-and-error-states.md +501 -0
  259. package/skills/ck-frontend-development/resources/performance.md +406 -0
  260. package/skills/ck-frontend-development/resources/routing-guide.md +364 -0
  261. package/skills/ck-frontend-development/resources/styling-guide.md +428 -0
  262. package/skills/ck-frontend-development/resources/typescript-standards.md +418 -0
  263. package/skills/ck-markdown-novel-viewer/SKILL.md +190 -0
  264. package/skills/ck-markdown-novel-viewer/assets/directory-browser.css +215 -0
  265. package/skills/ck-markdown-novel-viewer/assets/favicon.png +0 -0
  266. package/skills/ck-markdown-novel-viewer/assets/novel-theme.css +818 -0
  267. package/skills/ck-markdown-novel-viewer/assets/reader.js +262 -0
  268. package/skills/ck-markdown-novel-viewer/assets/template.html +80 -0
  269. package/skills/ck-markdown-novel-viewer/package.json +15 -0
  270. package/skills/ck-markdown-novel-viewer/scripts/lib/http-server.cjs +434 -0
  271. package/skills/ck-markdown-novel-viewer/scripts/lib/markdown-renderer.cjs +272 -0
  272. package/skills/ck-markdown-novel-viewer/scripts/lib/plan-navigator.cjs +509 -0
  273. package/skills/ck-markdown-novel-viewer/scripts/lib/port-finder.cjs +48 -0
  274. package/skills/ck-markdown-novel-viewer/scripts/lib/process-mgr.cjs +150 -0
  275. package/skills/ck-markdown-novel-viewer/scripts/server.cjs +411 -0
  276. package/skills/ck-markdown-novel-viewer/scripts/tests/server.test.cjs +283 -0
  277. package/skills/ck-markdown-novel-viewer/tests/dashboard-assets.test.cjs +340 -0
  278. package/skills/ck-markdown-novel-viewer/tests/dashboard-renderer.test.cjs +404 -0
  279. package/skills/ck-markdown-novel-viewer/tests/http-server.test.cjs +271 -0
  280. package/skills/ck-markdown-novel-viewer/tests/run-tests.cjs +51 -0
  281. package/skills/ck-markdown-novel-viewer/tests/test-framework.cjs +154 -0
  282. package/skills/ck-markdown-novel-viewer/tests/verify-xss.cjs +90 -0
  283. package/skills/ck-mcp-builder/LICENSE.txt +202 -0
  284. package/skills/ck-mcp-builder/SKILL.md +327 -0
  285. package/skills/ck-mcp-builder/reference/evaluation.md +602 -0
  286. package/skills/ck-mcp-builder/reference/mcp_best_practices.md +915 -0
  287. package/skills/ck-mcp-builder/reference/node_mcp_server.md +916 -0
  288. package/skills/ck-mcp-builder/reference/python_mcp_server.md +752 -0
  289. package/skills/ck-mcp-builder/scripts/connections.py +151 -0
  290. package/skills/ck-mcp-builder/scripts/evaluation.py +373 -0
  291. package/skills/ck-mcp-builder/scripts/example_evaluation.xml +22 -0
  292. package/skills/ck-mcp-builder/scripts/requirements.txt +2 -0
  293. package/skills/ck-mcp-management/README.md +219 -0
  294. package/skills/ck-mcp-management/SKILL.md +209 -0
  295. package/skills/ck-mcp-management/assets/tools.json +3146 -0
  296. package/skills/ck-mcp-management/references/configuration.md +114 -0
  297. package/skills/ck-mcp-management/references/gemini-cli-integration.md +215 -0
  298. package/skills/ck-mcp-management/references/mcp-protocol.md +116 -0
  299. package/skills/ck-mcp-management/scripts/.env.example +10 -0
  300. package/skills/ck-mcp-management/scripts/cli.ts +195 -0
  301. package/skills/ck-mcp-management/scripts/dist/analyze-tools.js +70 -0
  302. package/skills/ck-mcp-management/scripts/dist/cli.js +160 -0
  303. package/skills/ck-mcp-management/scripts/dist/mcp-client.js +183 -0
  304. package/skills/ck-mcp-management/scripts/mcp-client.ts +230 -0
  305. package/skills/ck-mcp-management/scripts/package.json +20 -0
  306. package/skills/ck-mcp-management/scripts/tsconfig.json +15 -0
  307. package/skills/ck-media-processing/SKILL.md +90 -0
  308. package/skills/ck-media-processing/references/common-workflows.md +132 -0
  309. package/skills/ck-media-processing/references/ffmpeg-encoding.md +358 -0
  310. package/skills/ck-media-processing/references/ffmpeg-filters.md +503 -0
  311. package/skills/ck-media-processing/references/ffmpeg-streaming.md +403 -0
  312. package/skills/ck-media-processing/references/format-compatibility.md +375 -0
  313. package/skills/ck-media-processing/references/imagemagick-batch.md +612 -0
  314. package/skills/ck-media-processing/references/imagemagick-editing.md +623 -0
  315. package/skills/ck-media-processing/references/rmbg-background-removal.md +66 -0
  316. package/skills/ck-media-processing/references/troubleshooting.md +109 -0
  317. package/skills/ck-media-processing/scripts/README.md +111 -0
  318. package/skills/ck-media-processing/scripts/batch-remove-background.sh +124 -0
  319. package/skills/ck-media-processing/scripts/batch_resize.py +342 -0
  320. package/skills/ck-media-processing/scripts/media_convert.py +311 -0
  321. package/skills/ck-media-processing/scripts/remove-background.sh +96 -0
  322. package/skills/ck-media-processing/scripts/remove-bg-node.js +158 -0
  323. package/skills/ck-media-processing/scripts/requirements.txt +24 -0
  324. package/skills/ck-media-processing/scripts/tests/.coverage +0 -0
  325. package/skills/ck-media-processing/scripts/tests/requirements.txt +2 -0
  326. package/skills/ck-media-processing/scripts/tests/test_batch_resize.py +372 -0
  327. package/skills/ck-media-processing/scripts/tests/test_media_convert.py +259 -0
  328. package/skills/ck-media-processing/scripts/tests/test_video_optimize.py +397 -0
  329. package/skills/ck-media-processing/scripts/video_optimize.py +414 -0
  330. package/skills/ck-mobile-development/SKILL.md +210 -0
  331. package/skills/ck-mobile-development/references/mobile-android.md +604 -0
  332. package/skills/ck-mobile-development/references/mobile-best-practices.md +545 -0
  333. package/skills/ck-mobile-development/references/mobile-debugging.md +1089 -0
  334. package/skills/ck-mobile-development/references/mobile-frameworks.md +465 -0
  335. package/skills/ck-mobile-development/references/mobile-ios.md +496 -0
  336. package/skills/ck-mobile-development/references/mobile-mindset.md +544 -0
  337. package/skills/ck-payment-integration/README.md +185 -0
  338. package/skills/ck-payment-integration/SKILL.md +116 -0
  339. package/skills/ck-payment-integration/references/polar/benefits.md +396 -0
  340. package/skills/ck-payment-integration/references/polar/best-practices.md +482 -0
  341. package/skills/ck-payment-integration/references/polar/checkouts.md +266 -0
  342. package/skills/ck-payment-integration/references/polar/overview.md +184 -0
  343. package/skills/ck-payment-integration/references/polar/products.md +244 -0
  344. package/skills/ck-payment-integration/references/polar/sdk.md +436 -0
  345. package/skills/ck-payment-integration/references/polar/subscriptions.md +340 -0
  346. package/skills/ck-payment-integration/references/polar/webhooks.md +405 -0
  347. package/skills/ck-payment-integration/references/sepay/api.md +140 -0
  348. package/skills/ck-payment-integration/references/sepay/best-practices.md +337 -0
  349. package/skills/ck-payment-integration/references/sepay/overview.md +138 -0
  350. package/skills/ck-payment-integration/references/sepay/qr-codes.md +228 -0
  351. package/skills/ck-payment-integration/references/sepay/sdk.md +213 -0
  352. package/skills/ck-payment-integration/references/sepay/webhooks.md +208 -0
  353. package/skills/ck-payment-integration/scripts/.env.example +20 -0
  354. package/skills/ck-payment-integration/scripts/checkout-helper.js +244 -0
  355. package/skills/ck-payment-integration/scripts/package.json +17 -0
  356. package/skills/ck-payment-integration/scripts/polar-webhook-verify.js +202 -0
  357. package/skills/ck-payment-integration/scripts/sepay-webhook-verify.js +193 -0
  358. package/skills/ck-payment-integration/scripts/test-scripts.js +237 -0
  359. package/skills/ck-planning/SKILL.md +79 -49
  360. package/skills/ck-planning/references/codebase-understanding.md +62 -0
  361. package/skills/ck-planning/references/output-standards.md +127 -0
  362. package/skills/ck-planning/references/plan-organization.md +122 -60
  363. package/skills/ck-planning/references/research-phase.md +49 -56
  364. package/skills/ck-planning/references/solution-design.md +61 -63
  365. package/skills/ck-problem-solving/SKILL.md +95 -0
  366. package/skills/ck-problem-solving/references/attribution.md +69 -0
  367. package/skills/ck-problem-solving/references/collision-zone-thinking.md +79 -0
  368. package/skills/ck-problem-solving/references/inversion-exercise.md +91 -0
  369. package/skills/ck-problem-solving/references/meta-pattern-recognition.md +87 -0
  370. package/skills/ck-problem-solving/references/scale-game.md +95 -0
  371. package/skills/ck-problem-solving/references/simplification-cascades.md +80 -0
  372. package/skills/ck-problem-solving/references/when-stuck.md +72 -0
  373. package/skills/ck-repomix/SKILL.md +247 -0
  374. package/skills/ck-repomix/references/configuration.md +211 -0
  375. package/skills/ck-repomix/references/usage-patterns.md +232 -0
  376. package/skills/ck-repomix/scripts/.coverage +0 -0
  377. package/skills/ck-repomix/scripts/README.md +179 -0
  378. package/skills/ck-repomix/scripts/repomix_batch.py +455 -0
  379. package/skills/ck-repomix/scripts/repos.example.json +15 -0
  380. package/skills/ck-repomix/scripts/requirements.txt +15 -0
  381. package/skills/ck-repomix/scripts/tests/test_repomix_batch.py +531 -0
  382. package/skills/ck-sequential-thinking/.env.example +8 -0
  383. package/skills/ck-sequential-thinking/README.md +183 -0
  384. package/skills/ck-sequential-thinking/SKILL.md +14 -2
  385. package/skills/ck-sequential-thinking/package.json +31 -0
  386. package/skills/ck-sequential-thinking/references/advanced-strategies.md +79 -0
  387. package/skills/ck-sequential-thinking/references/advanced-techniques.md +2 -14
  388. package/skills/ck-sequential-thinking/references/core-patterns.md +8 -0
  389. package/skills/ck-sequential-thinking/references/examples-api.md +88 -0
  390. package/skills/ck-sequential-thinking/references/examples-architecture.md +94 -0
  391. package/skills/ck-sequential-thinking/references/examples-debug.md +90 -0
  392. package/skills/ck-sequential-thinking/scripts/format-thought.js +159 -0
  393. package/skills/ck-sequential-thinking/scripts/process-thought.js +236 -0
  394. package/skills/ck-sequential-thinking/tests/format-thought.test.js +133 -0
  395. package/skills/ck-sequential-thinking/tests/process-thought.test.js +215 -0
  396. package/skills/ck-shopify/README.md +66 -0
  397. package/skills/ck-shopify/SKILL.md +319 -0
  398. package/skills/ck-shopify/references/app-development.md +470 -0
  399. package/skills/ck-shopify/references/extensions.md +493 -0
  400. package/skills/ck-shopify/references/themes.md +498 -0
  401. package/skills/ck-shopify/scripts/.coverage +0 -0
  402. package/skills/ck-shopify/scripts/requirements.txt +19 -0
  403. package/skills/ck-shopify/scripts/shopify_init.py +423 -0
  404. package/skills/ck-shopify/scripts/tests/.coverage +0 -0
  405. package/skills/ck-shopify/scripts/tests/test_shopify_init.py +385 -0
  406. package/skills/ck-skill-creator/LICENSE.txt +202 -0
  407. package/skills/ck-skill-creator/SKILL.md +265 -0
  408. package/skills/ck-skill-creator/scripts/init_skill.py +303 -0
  409. package/skills/ck-skill-creator/scripts/package_skill.py +110 -0
  410. package/skills/ck-skill-creator/scripts/quick_validate.py +65 -0
  411. package/skills/ck-threejs/SKILL.md +87 -0
  412. package/skills/ck-threejs/references/01-getting-started.md +177 -0
  413. package/skills/ck-threejs/references/02-loaders.md +169 -0
  414. package/skills/ck-threejs/references/03-textures.md +170 -0
  415. package/skills/ck-threejs/references/04-cameras.md +195 -0
  416. package/skills/ck-threejs/references/05-lights.md +183 -0
  417. package/skills/ck-threejs/references/06-animations.md +214 -0
  418. package/skills/ck-threejs/references/07-math.md +260 -0
  419. package/skills/ck-threejs/references/08-interaction.md +267 -0
  420. package/skills/ck-threejs/references/09-postprocessing.md +240 -0
  421. package/skills/ck-threejs/references/10-controls.md +259 -0
  422. package/skills/ck-threejs/references/11-materials-advanced.md +270 -0
  423. package/skills/ck-threejs/references/12-performance.md +269 -0
  424. package/skills/ck-threejs/references/13-node-materials.md +298 -0
  425. package/skills/ck-threejs/references/14-physics-vr.md +304 -0
  426. package/skills/ck-threejs/references/15-specialized-loaders.md +333 -0
  427. package/skills/ck-threejs/references/16-webgpu.md +302 -0
  428. package/skills/ck-ui-styling/LICENSE.txt +202 -0
  429. package/skills/ck-ui-styling/SKILL.md +319 -0
  430. package/skills/ck-ui-styling/canvas-fonts/ArsenalSC-OFL.txt +93 -0
  431. package/skills/ck-ui-styling/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
  432. package/skills/ck-ui-styling/canvas-fonts/BigShoulders-Bold.ttf +0 -0
  433. package/skills/ck-ui-styling/canvas-fonts/BigShoulders-OFL.txt +93 -0
  434. package/skills/ck-ui-styling/canvas-fonts/BigShoulders-Regular.ttf +0 -0
  435. package/skills/ck-ui-styling/canvas-fonts/Boldonse-OFL.txt +93 -0
  436. package/skills/ck-ui-styling/canvas-fonts/Boldonse-Regular.ttf +0 -0
  437. package/skills/ck-ui-styling/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
  438. package/skills/ck-ui-styling/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
  439. package/skills/ck-ui-styling/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
  440. package/skills/ck-ui-styling/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
  441. package/skills/ck-ui-styling/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
  442. package/skills/ck-ui-styling/canvas-fonts/CrimsonPro-OFL.txt +93 -0
  443. package/skills/ck-ui-styling/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
  444. package/skills/ck-ui-styling/canvas-fonts/DMMono-OFL.txt +93 -0
  445. package/skills/ck-ui-styling/canvas-fonts/DMMono-Regular.ttf +0 -0
  446. package/skills/ck-ui-styling/canvas-fonts/EricaOne-OFL.txt +94 -0
  447. package/skills/ck-ui-styling/canvas-fonts/EricaOne-Regular.ttf +0 -0
  448. package/skills/ck-ui-styling/canvas-fonts/GeistMono-Bold.ttf +0 -0
  449. package/skills/ck-ui-styling/canvas-fonts/GeistMono-OFL.txt +93 -0
  450. package/skills/ck-ui-styling/canvas-fonts/GeistMono-Regular.ttf +0 -0
  451. package/skills/ck-ui-styling/canvas-fonts/Gloock-OFL.txt +93 -0
  452. package/skills/ck-ui-styling/canvas-fonts/Gloock-Regular.ttf +0 -0
  453. package/skills/ck-ui-styling/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
  454. package/skills/ck-ui-styling/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
  455. package/skills/ck-ui-styling/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
  456. package/skills/ck-ui-styling/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
  457. package/skills/ck-ui-styling/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
  458. package/skills/ck-ui-styling/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
  459. package/skills/ck-ui-styling/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
  460. package/skills/ck-ui-styling/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
  461. package/skills/ck-ui-styling/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
  462. package/skills/ck-ui-styling/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
  463. package/skills/ck-ui-styling/canvas-fonts/InstrumentSans-OFL.txt +93 -0
  464. package/skills/ck-ui-styling/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
  465. package/skills/ck-ui-styling/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
  466. package/skills/ck-ui-styling/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
  467. package/skills/ck-ui-styling/canvas-fonts/Italiana-OFL.txt +93 -0
  468. package/skills/ck-ui-styling/canvas-fonts/Italiana-Regular.ttf +0 -0
  469. package/skills/ck-ui-styling/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
  470. package/skills/ck-ui-styling/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
  471. package/skills/ck-ui-styling/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
  472. package/skills/ck-ui-styling/canvas-fonts/Jura-Light.ttf +0 -0
  473. package/skills/ck-ui-styling/canvas-fonts/Jura-Medium.ttf +0 -0
  474. package/skills/ck-ui-styling/canvas-fonts/Jura-OFL.txt +93 -0
  475. package/skills/ck-ui-styling/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
  476. package/skills/ck-ui-styling/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
  477. package/skills/ck-ui-styling/canvas-fonts/Lora-Bold.ttf +0 -0
  478. package/skills/ck-ui-styling/canvas-fonts/Lora-BoldItalic.ttf +0 -0
  479. package/skills/ck-ui-styling/canvas-fonts/Lora-Italic.ttf +0 -0
  480. package/skills/ck-ui-styling/canvas-fonts/Lora-OFL.txt +93 -0
  481. package/skills/ck-ui-styling/canvas-fonts/Lora-Regular.ttf +0 -0
  482. package/skills/ck-ui-styling/canvas-fonts/NationalPark-Bold.ttf +0 -0
  483. package/skills/ck-ui-styling/canvas-fonts/NationalPark-OFL.txt +93 -0
  484. package/skills/ck-ui-styling/canvas-fonts/NationalPark-Regular.ttf +0 -0
  485. package/skills/ck-ui-styling/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
  486. package/skills/ck-ui-styling/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
  487. package/skills/ck-ui-styling/canvas-fonts/Outfit-Bold.ttf +0 -0
  488. package/skills/ck-ui-styling/canvas-fonts/Outfit-OFL.txt +93 -0
  489. package/skills/ck-ui-styling/canvas-fonts/Outfit-Regular.ttf +0 -0
  490. package/skills/ck-ui-styling/canvas-fonts/PixelifySans-Medium.ttf +0 -0
  491. package/skills/ck-ui-styling/canvas-fonts/PixelifySans-OFL.txt +93 -0
  492. package/skills/ck-ui-styling/canvas-fonts/PoiretOne-OFL.txt +93 -0
  493. package/skills/ck-ui-styling/canvas-fonts/PoiretOne-Regular.ttf +0 -0
  494. package/skills/ck-ui-styling/canvas-fonts/RedHatMono-Bold.ttf +0 -0
  495. package/skills/ck-ui-styling/canvas-fonts/RedHatMono-OFL.txt +93 -0
  496. package/skills/ck-ui-styling/canvas-fonts/RedHatMono-Regular.ttf +0 -0
  497. package/skills/ck-ui-styling/canvas-fonts/Silkscreen-OFL.txt +93 -0
  498. package/skills/ck-ui-styling/canvas-fonts/Silkscreen-Regular.ttf +0 -0
  499. package/skills/ck-ui-styling/canvas-fonts/SmoochSans-Medium.ttf +0 -0
  500. package/skills/ck-ui-styling/canvas-fonts/SmoochSans-OFL.txt +93 -0
  501. package/skills/ck-ui-styling/canvas-fonts/Tektur-Medium.ttf +0 -0
  502. package/skills/ck-ui-styling/canvas-fonts/Tektur-OFL.txt +93 -0
  503. package/skills/ck-ui-styling/canvas-fonts/Tektur-Regular.ttf +0 -0
  504. package/skills/ck-ui-styling/canvas-fonts/WorkSans-Bold.ttf +0 -0
  505. package/skills/ck-ui-styling/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
  506. package/skills/ck-ui-styling/canvas-fonts/WorkSans-Italic.ttf +0 -0
  507. package/skills/ck-ui-styling/canvas-fonts/WorkSans-OFL.txt +93 -0
  508. package/skills/ck-ui-styling/canvas-fonts/WorkSans-Regular.ttf +0 -0
  509. package/skills/ck-ui-styling/canvas-fonts/YoungSerif-OFL.txt +93 -0
  510. package/skills/ck-ui-styling/canvas-fonts/YoungSerif-Regular.ttf +0 -0
  511. package/skills/ck-ui-styling/references/canvas-design-system.md +320 -0
  512. package/skills/ck-ui-styling/references/shadcn-accessibility.md +471 -0
  513. package/skills/ck-ui-styling/references/shadcn-components.md +424 -0
  514. package/skills/ck-ui-styling/references/shadcn-theming.md +373 -0
  515. package/skills/ck-ui-styling/references/tailwind-customization.md +483 -0
  516. package/skills/ck-ui-styling/references/tailwind-responsive.md +382 -0
  517. package/skills/ck-ui-styling/references/tailwind-utilities.md +455 -0
  518. package/skills/ck-ui-styling/scripts/.coverage +0 -0
  519. package/skills/ck-ui-styling/scripts/requirements.txt +17 -0
  520. package/skills/ck-ui-styling/scripts/shadcn_add.py +292 -0
  521. package/skills/ck-ui-styling/scripts/tailwind_config_gen.py +456 -0
  522. package/skills/ck-ui-styling/scripts/tests/coverage-ui.json +1 -0
  523. package/skills/ck-ui-styling/scripts/tests/requirements.txt +3 -0
  524. package/skills/ck-ui-styling/scripts/tests/test_shadcn_add.py +266 -0
  525. package/skills/ck-ui-styling/scripts/tests/test_tailwind_config_gen.py +336 -0
  526. package/skills/ck-ui-ux-pro-max/SKILL.md +227 -0
  527. package/skills/ck-ui-ux-pro-max/data/charts.csv +26 -0
  528. package/skills/ck-ui-ux-pro-max/data/colors.csv +97 -0
  529. package/skills/ck-ui-ux-pro-max/data/landing.csv +31 -0
  530. package/skills/ck-ui-ux-pro-max/data/products.csv +97 -0
  531. package/skills/ck-ui-ux-pro-max/data/prompts.csv +24 -0
  532. package/skills/ck-ui-ux-pro-max/data/stacks/flutter.csv +53 -0
  533. package/skills/ck-ui-ux-pro-max/data/stacks/html-tailwind.csv +51 -0
  534. package/skills/ck-ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
  535. package/skills/ck-ui-ux-pro-max/data/stacks/react-native.csv +52 -0
  536. package/skills/ck-ui-ux-pro-max/data/stacks/react.csv +54 -0
  537. package/skills/ck-ui-ux-pro-max/data/stacks/svelte.csv +54 -0
  538. package/skills/ck-ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
  539. package/skills/ck-ui-ux-pro-max/data/stacks/vue.csv +50 -0
  540. package/skills/ck-ui-ux-pro-max/data/styles.csv +59 -0
  541. package/skills/ck-ui-ux-pro-max/data/typography.csv +58 -0
  542. package/skills/ck-ui-ux-pro-max/data/ux-guidelines.csv +100 -0
  543. package/skills/ck-ui-ux-pro-max/scripts/core.py +236 -0
  544. package/skills/ck-ui-ux-pro-max/scripts/search.py +76 -0
  545. package/skills/ck-web-frameworks/SKILL.md +322 -0
  546. package/skills/ck-web-frameworks/references/nextjs-app-router.md +465 -0
  547. package/skills/ck-web-frameworks/references/nextjs-data-fetching.md +459 -0
  548. package/skills/ck-web-frameworks/references/nextjs-optimization.md +511 -0
  549. package/skills/ck-web-frameworks/references/nextjs-server-components.md +495 -0
  550. package/skills/ck-web-frameworks/references/remix-icon-integration.md +603 -0
  551. package/skills/ck-web-frameworks/references/turborepo-caching.md +551 -0
  552. package/skills/ck-web-frameworks/references/turborepo-pipelines.md +517 -0
  553. package/skills/ck-web-frameworks/references/turborepo-setup.md +542 -0
  554. package/skills/ck-web-frameworks/scripts/.coverage +0 -0
  555. package/skills/ck-web-frameworks/scripts/__init__.py +0 -0
  556. package/skills/ck-web-frameworks/scripts/nextjs_init.py +547 -0
  557. package/skills/ck-web-frameworks/scripts/requirements.txt +16 -0
  558. package/skills/ck-web-frameworks/scripts/tests/coverage-web.json +1 -0
  559. package/skills/ck-web-frameworks/scripts/tests/requirements.txt +3 -0
  560. package/skills/ck-web-frameworks/scripts/tests/test_nextjs_init.py +319 -0
  561. package/skills/ck-web-frameworks/scripts/tests/test_turborepo_migrate.py +374 -0
  562. package/skills/ck-web-frameworks/scripts/turborepo_migrate.py +394 -0
  563. package/src/commands/init.js +61 -30
  564. package/src/utils/paths.js +35 -4
@@ -0,0 +1,331 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Dockerfile Optimization Analyzer
4
+
5
+ Analyzes Dockerfiles for optimization opportunities including multi-stage builds,
6
+ security issues, size reduction, and best practices.
7
+
8
+ Usage:
9
+ python docker-optimize.py Dockerfile
10
+ python docker-optimize.py --json Dockerfile
11
+ python docker-optimize.py --verbose Dockerfile
12
+ """
13
+
14
+ import argparse
15
+ import json
16
+ import re
17
+ import sys
18
+ from pathlib import Path
19
+ from typing import Dict, List, Optional, Tuple
20
+
21
+ # Windows UTF-8 compatibility
22
+ sys.path.insert(0, str(Path.home() / '.claude' / 'scripts'))
23
+ try:
24
+ from win_compat import ensure_utf8_stdout
25
+ ensure_utf8_stdout()
26
+ except ImportError:
27
+ if sys.platform == 'win32':
28
+ import io
29
+ if hasattr(sys.stdout, 'buffer'):
30
+ sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
31
+
32
+
33
+ class DockerfileAnalyzer:
34
+ """Analyze Dockerfile for optimization opportunities."""
35
+
36
+ def __init__(self, dockerfile_path: Path, verbose: bool = False):
37
+ """
38
+ Initialize analyzer.
39
+
40
+ Args:
41
+ dockerfile_path: Path to Dockerfile
42
+ verbose: Enable verbose output
43
+ """
44
+ self.dockerfile_path = Path(dockerfile_path)
45
+ self.verbose = verbose
46
+ self.lines = []
47
+ self.issues = []
48
+ self.suggestions = []
49
+
50
+ def load_dockerfile(self) -> bool:
51
+ """
52
+ Load and parse Dockerfile.
53
+
54
+ Returns:
55
+ True if loaded successfully
56
+
57
+ Raises:
58
+ FileNotFoundError: If Dockerfile doesn't exist
59
+ """
60
+ if not self.dockerfile_path.exists():
61
+ raise FileNotFoundError(f"Dockerfile not found: {self.dockerfile_path}")
62
+
63
+ with open(self.dockerfile_path, 'r') as f:
64
+ self.lines = f.readlines()
65
+
66
+ return True
67
+
68
+ def analyze_base_image(self) -> None:
69
+ """Check base image for optimization opportunities."""
70
+ for i, line in enumerate(self.lines, 1):
71
+ line = line.strip()
72
+ if line.startswith('FROM'):
73
+ # Check for 'latest' tag
74
+ if ':latest' in line or (': ' not in line and 'AS' not in line and '@' not in line):
75
+ self.issues.append({
76
+ 'line': i,
77
+ 'severity': 'warning',
78
+ 'category': 'base_image',
79
+ 'message': 'Base image uses :latest or no tag',
80
+ 'suggestion': 'Use specific version tags for reproducibility'
81
+ })
82
+
83
+ # Check for non-alpine/slim variants
84
+ if 'node' in line.lower() and 'alpine' not in line.lower():
85
+ self.suggestions.append({
86
+ 'line': i,
87
+ 'category': 'size',
88
+ 'message': 'Consider using Alpine variant',
89
+ 'suggestion': 'node:20-alpine is ~10x smaller than node:20'
90
+ })
91
+
92
+ def analyze_multi_stage(self) -> None:
93
+ """Check if multi-stage build is used."""
94
+ from_count = sum(1 for line in self.lines if line.strip().startswith('FROM'))
95
+
96
+ if from_count == 1:
97
+ # Check if build tools are installed
98
+ has_build_tools = any(
99
+ any(tool in line.lower() for tool in ['gcc', 'make', 'build-essential', 'npm install', 'pip install'])
100
+ for line in self.lines
101
+ )
102
+
103
+ if has_build_tools:
104
+ self.issues.append({
105
+ 'line': 0,
106
+ 'severity': 'warning',
107
+ 'category': 'optimization',
108
+ 'message': 'Single-stage build with build tools',
109
+ 'suggestion': 'Use multi-stage build to exclude build dependencies from final image'
110
+ })
111
+
112
+ def analyze_layer_caching(self) -> None:
113
+ """Check for optimal layer caching order."""
114
+ copy_lines = []
115
+ run_lines = []
116
+
117
+ for i, line in enumerate(self.lines, 1):
118
+ stripped = line.strip()
119
+ if stripped.startswith('COPY'):
120
+ copy_lines.append((i, stripped))
121
+ elif stripped.startswith('RUN'):
122
+ run_lines.append((i, stripped))
123
+
124
+ # Check if dependency files copied before source
125
+ has_package_copy = any('package.json' in line or 'requirements.txt' in line or 'go.mod' in line
126
+ for _, line in copy_lines)
127
+ has_source_copy = any('COPY . .' in line or 'COPY ./' in line
128
+ for _, line in copy_lines)
129
+
130
+ if has_source_copy and not has_package_copy:
131
+ self.issues.append({
132
+ 'line': 0,
133
+ 'severity': 'warning',
134
+ 'category': 'caching',
135
+ 'message': 'Source copied before dependencies',
136
+ 'suggestion': 'Copy dependency files first (package.json, requirements.txt) then run install, then copy source'
137
+ })
138
+
139
+ def analyze_security(self) -> None:
140
+ """Check for security issues."""
141
+ has_user = any(line.strip().startswith('USER') and 'root' not in line.lower()
142
+ for line in self.lines)
143
+
144
+ if not has_user:
145
+ self.issues.append({
146
+ 'line': 0,
147
+ 'severity': 'error',
148
+ 'category': 'security',
149
+ 'message': 'Container runs as root',
150
+ 'suggestion': 'Create and use non-root user with USER instruction'
151
+ })
152
+
153
+ # Check for secrets in build
154
+ for i, line in enumerate(self.lines, 1):
155
+ if any(secret in line.upper() for secret in ['PASSWORD', 'SECRET', 'TOKEN', 'API_KEY']):
156
+ if 'ENV' in line or 'ARG' in line:
157
+ self.issues.append({
158
+ 'line': i,
159
+ 'severity': 'error',
160
+ 'category': 'security',
161
+ 'message': 'Potential secret in Dockerfile',
162
+ 'suggestion': 'Use build-time arguments or runtime environment variables'
163
+ })
164
+
165
+ def analyze_apt_cache(self) -> None:
166
+ """Check for apt cache cleanup."""
167
+ for i, line in enumerate(self.lines, 1):
168
+ if 'apt-get install' in line.lower() or 'apt install' in line.lower():
169
+ # Check if same RUN command cleans cache
170
+ if 'rm -rf /var/lib/apt/lists/*' not in line:
171
+ self.suggestions.append({
172
+ 'line': i,
173
+ 'category': 'size',
174
+ 'message': 'apt cache not cleaned in same layer',
175
+ 'suggestion': 'Add && rm -rf /var/lib/apt/lists/* to reduce image size'
176
+ })
177
+
178
+ def analyze_combine_run(self) -> None:
179
+ """Check for multiple consecutive RUN commands."""
180
+ consecutive_runs = 0
181
+ first_run_line = 0
182
+
183
+ for i, line in enumerate(self.lines, 1):
184
+ if line.strip().startswith('RUN'):
185
+ if consecutive_runs == 0:
186
+ first_run_line = i
187
+ consecutive_runs += 1
188
+ else:
189
+ if consecutive_runs > 1:
190
+ self.suggestions.append({
191
+ 'line': first_run_line,
192
+ 'category': 'layers',
193
+ 'message': f'{consecutive_runs} consecutive RUN commands',
194
+ 'suggestion': 'Combine related RUN commands with && to reduce layers'
195
+ })
196
+ consecutive_runs = 0
197
+
198
+ def analyze_workdir(self) -> None:
199
+ """Check for WORKDIR usage."""
200
+ has_workdir = any(line.strip().startswith('WORKDIR') for line in self.lines)
201
+
202
+ if not has_workdir:
203
+ self.suggestions.append({
204
+ 'line': 0,
205
+ 'category': 'best_practice',
206
+ 'message': 'No WORKDIR specified',
207
+ 'suggestion': 'Use WORKDIR to set working directory instead of cd commands'
208
+ })
209
+
210
+ def analyze(self) -> Dict:
211
+ """
212
+ Run all analyses.
213
+
214
+ Returns:
215
+ Analysis results dictionary
216
+ """
217
+ self.load_dockerfile()
218
+
219
+ self.analyze_base_image()
220
+ self.analyze_multi_stage()
221
+ self.analyze_layer_caching()
222
+ self.analyze_security()
223
+ self.analyze_apt_cache()
224
+ self.analyze_combine_run()
225
+ self.analyze_workdir()
226
+
227
+ return {
228
+ 'dockerfile': str(self.dockerfile_path),
229
+ 'total_lines': len(self.lines),
230
+ 'issues': self.issues,
231
+ 'suggestions': self.suggestions,
232
+ 'summary': {
233
+ 'errors': len([i for i in self.issues if i.get('severity') == 'error']),
234
+ 'warnings': len([i for i in self.issues if i.get('severity') == 'warning']),
235
+ 'suggestions': len(self.suggestions)
236
+ }
237
+ }
238
+
239
+ def print_results(self, results: Dict) -> None:
240
+ """
241
+ Print analysis results in human-readable format.
242
+
243
+ Args:
244
+ results: Analysis results from analyze()
245
+ """
246
+ print(f"\nDockerfile Analysis: {results['dockerfile']}")
247
+ print(f"Total lines: {results['total_lines']}")
248
+ print(f"\nSummary:")
249
+ print(f" Errors: {results['summary']['errors']}")
250
+ print(f" Warnings: {results['summary']['warnings']}")
251
+ print(f" Suggestions: {results['summary']['suggestions']}")
252
+
253
+ if results['issues']:
254
+ print(f"\n{'='*60}")
255
+ print("ISSUES:")
256
+ print('='*60)
257
+ for issue in results['issues']:
258
+ severity = issue.get('severity', 'info').upper()
259
+ line_info = f"Line {issue['line']}" if issue['line'] > 0 else "General"
260
+ print(f"\n[{severity}] {line_info} - {issue['category']}")
261
+ print(f" {issue['message']}")
262
+ print(f" → {issue['suggestion']}")
263
+
264
+ if results['suggestions']:
265
+ print(f"\n{'='*60}")
266
+ print("SUGGESTIONS:")
267
+ print('='*60)
268
+ for sugg in results['suggestions']:
269
+ line_info = f"Line {sugg['line']}" if sugg['line'] > 0 else "General"
270
+ print(f"\n{line_info} - {sugg['category']}")
271
+ print(f" {sugg['message']}")
272
+ print(f" → {sugg['suggestion']}")
273
+
274
+ print()
275
+
276
+
277
+ def main():
278
+ """CLI entry point."""
279
+ parser = argparse.ArgumentParser(
280
+ description="Analyze Dockerfile for optimization opportunities",
281
+ formatter_class=argparse.RawDescriptionHelpFormatter
282
+ )
283
+
284
+ parser.add_argument(
285
+ "dockerfile",
286
+ type=str,
287
+ help="Path to Dockerfile"
288
+ )
289
+
290
+ parser.add_argument(
291
+ "--json",
292
+ action="store_true",
293
+ help="Output results as JSON"
294
+ )
295
+
296
+ parser.add_argument(
297
+ "--verbose",
298
+ "-v",
299
+ action="store_true",
300
+ help="Enable verbose output"
301
+ )
302
+
303
+ args = parser.parse_args()
304
+
305
+ try:
306
+ analyzer = DockerfileAnalyzer(
307
+ dockerfile_path=args.dockerfile,
308
+ verbose=args.verbose
309
+ )
310
+
311
+ results = analyzer.analyze()
312
+
313
+ if args.json:
314
+ print(json.dumps(results, indent=2))
315
+ else:
316
+ analyzer.print_results(results)
317
+
318
+ # Exit with error code if issues found
319
+ if results['summary']['errors'] > 0:
320
+ sys.exit(1)
321
+
322
+ except FileNotFoundError as e:
323
+ print(f"Error: {e}", file=sys.stderr)
324
+ sys.exit(1)
325
+ except Exception as e:
326
+ print(f"Unexpected error: {e}", file=sys.stderr)
327
+ sys.exit(1)
328
+
329
+
330
+ if __name__ == "__main__":
331
+ main()
@@ -0,0 +1,20 @@
1
+ # DevOps Skill Dependencies
2
+ # Python 3.10+ required
3
+
4
+ # No Python package dependencies - uses only standard library
5
+
6
+ # Testing dependencies (dev)
7
+ pytest>=8.0.0
8
+ pytest-cov>=4.1.0
9
+ pytest-mock>=3.12.0
10
+
11
+ # Note: This skill requires various CLI tools depending on platform:
12
+ #
13
+ # Cloudflare:
14
+ # - wrangler CLI: npm install -g wrangler
15
+ #
16
+ # Docker:
17
+ # - docker CLI: https://docs.docker.com/get-docker/
18
+ #
19
+ # Google Cloud:
20
+ # - gcloud CLI: https://cloud.google.com/sdk/docs/install
@@ -0,0 +1,3 @@
1
+ pytest>=7.0.0
2
+ pytest-cov>=4.0.0
3
+ pytest-mock>=3.10.0
@@ -0,0 +1,285 @@
1
+ """
2
+ Tests for cloudflare-deploy.py
3
+
4
+ Run with: pytest test_cloudflare_deploy.py -v
5
+ """
6
+
7
+ import pytest
8
+ import subprocess
9
+ from pathlib import Path
10
+ from unittest.mock import Mock, patch, mock_open
11
+ import sys
12
+ import os
13
+
14
+ # Add parent directory to path for imports
15
+ sys.path.insert(0, str(Path(__file__).parent.parent))
16
+
17
+ from cloudflare_deploy import CloudflareDeploy, CloudflareDeployError
18
+
19
+
20
+ @pytest.fixture
21
+ def temp_project(tmp_path):
22
+ """Create temporary project directory with wrangler.toml"""
23
+ project_dir = tmp_path / "test-worker"
24
+ project_dir.mkdir()
25
+
26
+ wrangler_toml = project_dir / "wrangler.toml"
27
+ wrangler_toml.write_text('''
28
+ name = "test-worker"
29
+ main = "src/index.ts"
30
+ compatibility_date = "2024-01-01"
31
+ ''')
32
+
33
+ return project_dir
34
+
35
+
36
+ @pytest.fixture
37
+ def deployer(temp_project):
38
+ """Create CloudflareDeploy instance with temp project"""
39
+ return CloudflareDeploy(
40
+ project_dir=temp_project,
41
+ env="staging",
42
+ dry_run=False,
43
+ verbose=False
44
+ )
45
+
46
+
47
+ class TestCloudflareDeployInit:
48
+ """Test CloudflareDeploy initialization"""
49
+
50
+ def test_init_with_defaults(self, temp_project):
51
+ deployer = CloudflareDeploy(project_dir=temp_project)
52
+ assert deployer.project_dir == temp_project.resolve()
53
+ assert deployer.env is None
54
+ assert deployer.dry_run is False
55
+ assert deployer.verbose is False
56
+
57
+ def test_init_with_custom_params(self, temp_project):
58
+ deployer = CloudflareDeploy(
59
+ project_dir=temp_project,
60
+ env="production",
61
+ dry_run=True,
62
+ verbose=True
63
+ )
64
+ assert deployer.env == "production"
65
+ assert deployer.dry_run is True
66
+ assert deployer.verbose is True
67
+
68
+
69
+ class TestValidateProject:
70
+ """Test project validation"""
71
+
72
+ def test_validate_existing_project(self, deployer):
73
+ assert deployer.validate_project() is True
74
+
75
+ def test_validate_nonexistent_project(self, tmp_path):
76
+ deployer = CloudflareDeploy(project_dir=tmp_path / "nonexistent")
77
+ with pytest.raises(CloudflareDeployError, match="does not exist"):
78
+ deployer.validate_project()
79
+
80
+ def test_validate_missing_wrangler_toml(self, tmp_path):
81
+ project_dir = tmp_path / "no-toml"
82
+ project_dir.mkdir()
83
+ deployer = CloudflareDeploy(project_dir=project_dir)
84
+
85
+ with pytest.raises(CloudflareDeployError, match="wrangler.toml not found"):
86
+ deployer.validate_project()
87
+
88
+
89
+ class TestCheckWranglerInstalled:
90
+ """Test wrangler CLI detection"""
91
+
92
+ @patch('subprocess.run')
93
+ def test_wrangler_installed(self, mock_run, deployer):
94
+ mock_run.return_value = Mock(
95
+ returncode=0,
96
+ stdout="wrangler 3.0.0",
97
+ stderr=""
98
+ )
99
+ assert deployer.check_wrangler_installed() is True
100
+
101
+ @patch('subprocess.run')
102
+ def test_wrangler_not_installed(self, mock_run, deployer):
103
+ mock_run.side_effect = FileNotFoundError()
104
+ assert deployer.check_wrangler_installed() is False
105
+
106
+ @patch('subprocess.run')
107
+ def test_wrangler_command_fails(self, mock_run, deployer):
108
+ mock_run.side_effect = subprocess.CalledProcessError(1, "wrangler")
109
+ assert deployer.check_wrangler_installed() is False
110
+
111
+
112
+ class TestGetWorkerName:
113
+ """Test worker name extraction"""
114
+
115
+ def test_get_worker_name_success(self, deployer):
116
+ name = deployer.get_worker_name()
117
+ assert name == "test-worker"
118
+
119
+ def test_get_worker_name_no_name(self, tmp_path):
120
+ project_dir = tmp_path / "no-name"
121
+ project_dir.mkdir()
122
+
123
+ wrangler_toml = project_dir / "wrangler.toml"
124
+ wrangler_toml.write_text("main = 'index.ts'")
125
+
126
+ deployer = CloudflareDeploy(project_dir=project_dir)
127
+ with pytest.raises(CloudflareDeployError, match="Worker name not found"):
128
+ deployer.get_worker_name()
129
+
130
+ def test_get_worker_name_with_quotes(self, tmp_path):
131
+ project_dir = tmp_path / "quoted"
132
+ project_dir.mkdir()
133
+
134
+ wrangler_toml = project_dir / "wrangler.toml"
135
+ wrangler_toml.write_text('name = "my-worker"\n')
136
+
137
+ deployer = CloudflareDeploy(project_dir=project_dir)
138
+ assert deployer.get_worker_name() == "my-worker"
139
+
140
+ def test_get_worker_name_single_quotes(self, tmp_path):
141
+ project_dir = tmp_path / "single-quotes"
142
+ project_dir.mkdir()
143
+
144
+ wrangler_toml = project_dir / "wrangler.toml"
145
+ wrangler_toml.write_text("name = 'my-worker'\n")
146
+
147
+ deployer = CloudflareDeploy(project_dir=project_dir)
148
+ assert deployer.get_worker_name() == "my-worker"
149
+
150
+
151
+ class TestBuildDeployCommand:
152
+ """Test deploy command construction"""
153
+
154
+ def test_basic_command(self, temp_project):
155
+ deployer = CloudflareDeploy(project_dir=temp_project)
156
+ cmd = deployer.build_deploy_command()
157
+ assert cmd == ["wrangler", "deploy"]
158
+
159
+ def test_command_with_env(self, temp_project):
160
+ deployer = CloudflareDeploy(project_dir=temp_project, env="production")
161
+ cmd = deployer.build_deploy_command()
162
+ assert cmd == ["wrangler", "deploy", "--env", "production"]
163
+
164
+ def test_command_with_dry_run(self, temp_project):
165
+ deployer = CloudflareDeploy(project_dir=temp_project, dry_run=True)
166
+ cmd = deployer.build_deploy_command()
167
+ assert cmd == ["wrangler", "deploy", "--dry-run"]
168
+
169
+ def test_command_with_env_and_dry_run(self, temp_project):
170
+ deployer = CloudflareDeploy(
171
+ project_dir=temp_project,
172
+ env="staging",
173
+ dry_run=True
174
+ )
175
+ cmd = deployer.build_deploy_command()
176
+ assert cmd == ["wrangler", "deploy", "--env", "staging", "--dry-run"]
177
+
178
+
179
+ class TestRunCommand:
180
+ """Test command execution"""
181
+
182
+ @patch('subprocess.run')
183
+ def test_run_command_success(self, mock_run, deployer):
184
+ mock_run.return_value = Mock(
185
+ returncode=0,
186
+ stdout="Success",
187
+ stderr=""
188
+ )
189
+
190
+ exit_code, stdout, stderr = deployer.run_command(["echo", "test"])
191
+
192
+ assert exit_code == 0
193
+ assert stdout == "Success"
194
+ assert stderr == ""
195
+ mock_run.assert_called_once()
196
+
197
+ @patch('subprocess.run')
198
+ def test_run_command_failure_with_check(self, mock_run, deployer):
199
+ mock_run.side_effect = subprocess.CalledProcessError(
200
+ 1, "cmd", stderr="Error"
201
+ )
202
+
203
+ with pytest.raises(CloudflareDeployError, match="Command failed"):
204
+ deployer.run_command(["false"], check=True)
205
+
206
+ @patch('subprocess.run')
207
+ def test_run_command_failure_no_check(self, mock_run, deployer):
208
+ mock_run.side_effect = subprocess.CalledProcessError(
209
+ 1, "cmd", output="", stderr="Error"
210
+ )
211
+
212
+ exit_code, stdout, stderr = deployer.run_command(["false"], check=False)
213
+
214
+ assert exit_code == 1
215
+
216
+
217
+ class TestDeploy:
218
+ """Test full deployment flow"""
219
+
220
+ @patch.object(CloudflareDeploy, 'check_wrangler_installed')
221
+ @patch.object(CloudflareDeploy, 'run_command')
222
+ def test_deploy_success(self, mock_run_cmd, mock_check_wrangler, deployer):
223
+ mock_check_wrangler.return_value = True
224
+ mock_run_cmd.return_value = (0, "Deployed successfully", "")
225
+
226
+ result = deployer.deploy()
227
+
228
+ assert result is True
229
+ mock_check_wrangler.assert_called_once()
230
+ mock_run_cmd.assert_called_once()
231
+
232
+ @patch.object(CloudflareDeploy, 'check_wrangler_installed')
233
+ def test_deploy_wrangler_not_installed(self, mock_check_wrangler, deployer):
234
+ mock_check_wrangler.return_value = False
235
+
236
+ with pytest.raises(CloudflareDeployError, match="wrangler CLI not installed"):
237
+ deployer.deploy()
238
+
239
+ @patch.object(CloudflareDeploy, 'check_wrangler_installed')
240
+ @patch.object(CloudflareDeploy, 'run_command')
241
+ def test_deploy_command_fails(self, mock_run_cmd, mock_check_wrangler, deployer):
242
+ mock_check_wrangler.return_value = True
243
+ mock_run_cmd.side_effect = CloudflareDeployError("Deploy failed")
244
+
245
+ with pytest.raises(CloudflareDeployError, match="Deploy failed"):
246
+ deployer.deploy()
247
+
248
+ def test_deploy_invalid_project(self, tmp_path):
249
+ deployer = CloudflareDeploy(project_dir=tmp_path / "nonexistent")
250
+
251
+ with pytest.raises(CloudflareDeployError):
252
+ deployer.deploy()
253
+
254
+
255
+ class TestIntegration:
256
+ """Integration tests"""
257
+
258
+ @patch.object(CloudflareDeploy, 'check_wrangler_installed')
259
+ @patch.object(CloudflareDeploy, 'run_command')
260
+ def test_full_deployment_flow(self, mock_run_cmd, mock_check_wrangler, temp_project):
261
+ mock_check_wrangler.return_value = True
262
+ mock_run_cmd.return_value = (0, "Success", "")
263
+
264
+ deployer = CloudflareDeploy(
265
+ project_dir=temp_project,
266
+ env="production",
267
+ dry_run=False,
268
+ verbose=True
269
+ )
270
+
271
+ result = deployer.deploy()
272
+
273
+ assert result is True
274
+ assert mock_run_cmd.call_count == 1
275
+
276
+ # Verify correct command was built
277
+ call_args = mock_run_cmd.call_args[0][0]
278
+ assert "wrangler" in call_args
279
+ assert "deploy" in call_args
280
+ assert "--env" in call_args
281
+ assert "production" in call_args
282
+
283
+
284
+ if __name__ == "__main__":
285
+ pytest.main([__file__, "-v"])