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,372 @@
1
+ #!/usr/bin/env python3
2
+ """Tests for batch_resize.py"""
3
+
4
+ import sys
5
+ from pathlib import Path
6
+ from unittest.mock import MagicMock, call, patch
7
+
8
+ import pytest
9
+
10
+ # Add parent directory to path
11
+ sys.path.insert(0, str(Path(__file__).parent.parent))
12
+
13
+ from batch_resize import ImageResizer, collect_images
14
+
15
+
16
+ class TestImageResizer:
17
+ """Test ImageResizer class."""
18
+
19
+ def setup_method(self):
20
+ """Set up test fixtures."""
21
+ self.resizer = ImageResizer(verbose=False, dry_run=False)
22
+
23
+ @patch("subprocess.run")
24
+ def test_check_imagemagick_available(self, mock_run):
25
+ """Test ImageMagick availability check."""
26
+ mock_run.return_value = MagicMock(returncode=0)
27
+ assert self.resizer.check_imagemagick() is True
28
+
29
+ @patch("subprocess.run")
30
+ def test_check_imagemagick_unavailable(self, mock_run):
31
+ """Test when ImageMagick is not available."""
32
+ mock_run.side_effect = FileNotFoundError()
33
+ assert self.resizer.check_imagemagick() is False
34
+
35
+ def test_build_resize_command_fit_strategy(self):
36
+ """Test command building for 'fit' strategy."""
37
+ cmd = self.resizer.build_resize_command(
38
+ Path("input.jpg"),
39
+ Path("output.jpg"),
40
+ width=800,
41
+ height=600,
42
+ strategy="fit",
43
+ quality=85
44
+ )
45
+
46
+ assert "magick" in cmd
47
+ assert str(Path("input.jpg")) in cmd
48
+ assert "-resize" in cmd
49
+ assert "800x600" in cmd
50
+ assert "-quality" in cmd
51
+ assert "85" in cmd
52
+ assert "-strip" in cmd
53
+
54
+ def test_build_resize_command_fill_strategy(self):
55
+ """Test command building for 'fill' strategy."""
56
+ cmd = self.resizer.build_resize_command(
57
+ Path("input.jpg"),
58
+ Path("output.jpg"),
59
+ width=800,
60
+ height=600,
61
+ strategy="fill",
62
+ quality=85
63
+ )
64
+
65
+ assert "-resize" in cmd
66
+ assert "800x600^" in cmd
67
+ assert "-gravity" in cmd
68
+ assert "center" in cmd
69
+ assert "-extent" in cmd
70
+
71
+ def test_build_resize_command_thumbnail_strategy(self):
72
+ """Test command building for 'thumbnail' strategy."""
73
+ cmd = self.resizer.build_resize_command(
74
+ Path("input.jpg"),
75
+ Path("output.jpg"),
76
+ width=200,
77
+ height=None,
78
+ strategy="thumbnail",
79
+ quality=85
80
+ )
81
+
82
+ assert "200x200^" in cmd
83
+ assert "-gravity" in cmd
84
+ assert "center" in cmd
85
+
86
+ def test_build_resize_command_with_watermark(self):
87
+ """Test command building with watermark."""
88
+ watermark = Path("watermark.png")
89
+ cmd = self.resizer.build_resize_command(
90
+ Path("input.jpg"),
91
+ Path("output.jpg"),
92
+ width=800,
93
+ height=None,
94
+ strategy="fit",
95
+ quality=85,
96
+ watermark=watermark
97
+ )
98
+
99
+ assert str(watermark) in cmd
100
+ assert "-gravity" in cmd
101
+ assert "southeast" in cmd
102
+ assert "-composite" in cmd
103
+
104
+ def test_build_resize_command_exact_strategy(self):
105
+ """Test command building for 'exact' strategy."""
106
+ cmd = self.resizer.build_resize_command(
107
+ Path("input.jpg"),
108
+ Path("output.jpg"),
109
+ width=800,
110
+ height=600,
111
+ strategy="exact",
112
+ quality=85
113
+ )
114
+
115
+ assert "800x600!" in cmd
116
+
117
+ def test_build_resize_command_fill_requires_dimensions(self):
118
+ """Test that 'fill' strategy requires both dimensions."""
119
+ with pytest.raises(ValueError):
120
+ self.resizer.build_resize_command(
121
+ Path("input.jpg"),
122
+ Path("output.jpg"),
123
+ width=800,
124
+ height=None,
125
+ strategy="fill",
126
+ quality=85
127
+ )
128
+
129
+ @patch("subprocess.run")
130
+ def test_resize_image_success(self, mock_run):
131
+ """Test successful image resize."""
132
+ mock_run.return_value = MagicMock(returncode=0)
133
+
134
+ result = self.resizer.resize_image(
135
+ Path("input.jpg"),
136
+ Path("output/output.jpg"),
137
+ width=800,
138
+ height=None,
139
+ strategy="fit",
140
+ quality=85
141
+ )
142
+
143
+ assert result is True
144
+ mock_run.assert_called_once()
145
+
146
+ @patch("subprocess.run")
147
+ def test_resize_image_dry_run(self, mock_run):
148
+ """Test resize in dry-run mode."""
149
+ resizer = ImageResizer(dry_run=True)
150
+
151
+ result = resizer.resize_image(
152
+ Path("input.jpg"),
153
+ Path("output.jpg"),
154
+ width=800,
155
+ height=None
156
+ )
157
+
158
+ assert result is True
159
+ mock_run.assert_not_called()
160
+
161
+ @patch("subprocess.run")
162
+ def test_resize_image_failure(self, mock_run):
163
+ """Test resize failure handling."""
164
+ mock_run.side_effect = Exception("Resize failed")
165
+
166
+ result = self.resizer.resize_image(
167
+ Path("input.jpg"),
168
+ Path("output.jpg"),
169
+ width=800,
170
+ height=None
171
+ )
172
+
173
+ assert result is False
174
+
175
+
176
+ class TestCollectImages:
177
+ """Test image collection functionality."""
178
+
179
+ def test_collect_images_from_file(self, tmp_path):
180
+ """Test collecting a single image file."""
181
+ img_file = tmp_path / "test.jpg"
182
+ img_file.touch()
183
+
184
+ images = collect_images([img_file])
185
+ assert len(images) == 1
186
+ assert images[0] == img_file
187
+
188
+ def test_collect_images_from_directory(self, tmp_path):
189
+ """Test collecting images from directory."""
190
+ (tmp_path / "image1.jpg").touch()
191
+ (tmp_path / "image2.png").touch()
192
+ (tmp_path / "text.txt").touch()
193
+
194
+ images = collect_images([tmp_path])
195
+ assert len(images) == 2
196
+ assert all(img.suffix.lower() in {'.jpg', '.png'} for img in images)
197
+
198
+ def test_collect_images_recursive(self, tmp_path):
199
+ """Test recursive image collection."""
200
+ subdir = tmp_path / "subdir"
201
+ subdir.mkdir()
202
+ (tmp_path / "image1.jpg").touch()
203
+ (subdir / "image2.jpg").touch()
204
+
205
+ images = collect_images([tmp_path], recursive=True)
206
+ assert len(images) == 2
207
+
208
+ images_non_recursive = collect_images([tmp_path], recursive=False)
209
+ assert len(images_non_recursive) == 1
210
+
211
+ def test_collect_images_filters_extensions(self, tmp_path):
212
+ """Test that only image files are collected."""
213
+ (tmp_path / "image.jpg").touch()
214
+ (tmp_path / "doc.pdf").touch()
215
+ (tmp_path / "text.txt").touch()
216
+
217
+ images = collect_images([tmp_path])
218
+ assert len(images) == 1
219
+ assert images[0].suffix.lower() == '.jpg'
220
+
221
+ def test_collect_images_multiple_paths(self, tmp_path):
222
+ """Test collecting from multiple paths."""
223
+ dir1 = tmp_path / "dir1"
224
+ dir2 = tmp_path / "dir2"
225
+ dir1.mkdir()
226
+ dir2.mkdir()
227
+
228
+ (dir1 / "image1.jpg").touch()
229
+ (dir2 / "image2.png").touch()
230
+
231
+ images = collect_images([dir1, dir2])
232
+ assert len(images) == 2
233
+
234
+
235
+ class TestBatchResize:
236
+ """Test batch resize functionality."""
237
+
238
+ def setup_method(self):
239
+ """Set up test fixtures."""
240
+ self.resizer = ImageResizer(verbose=False, dry_run=False)
241
+
242
+ @patch.object(ImageResizer, "resize_image")
243
+ def test_batch_resize_success(self, mock_resize, tmp_path):
244
+ """Test successful batch resize."""
245
+ mock_resize.return_value = True
246
+
247
+ input_images = [
248
+ tmp_path / "image1.jpg",
249
+ tmp_path / "image2.jpg"
250
+ ]
251
+ for img in input_images:
252
+ img.touch()
253
+
254
+ output_dir = tmp_path / "output"
255
+
256
+ success, fail = self.resizer.batch_resize(
257
+ input_images,
258
+ output_dir,
259
+ width=800,
260
+ height=None,
261
+ strategy="fit"
262
+ )
263
+
264
+ assert success == 2
265
+ assert fail == 0
266
+ assert mock_resize.call_count == 2
267
+
268
+ @patch.object(ImageResizer, "resize_image")
269
+ def test_batch_resize_with_failures(self, mock_resize, tmp_path):
270
+ """Test batch resize with some failures."""
271
+ mock_resize.side_effect = [True, False, True]
272
+
273
+ input_images = [
274
+ tmp_path / "image1.jpg",
275
+ tmp_path / "image2.jpg",
276
+ tmp_path / "image3.jpg"
277
+ ]
278
+ for img in input_images:
279
+ img.touch()
280
+
281
+ output_dir = tmp_path / "output"
282
+
283
+ success, fail = self.resizer.batch_resize(
284
+ input_images,
285
+ output_dir,
286
+ width=800,
287
+ height=None
288
+ )
289
+
290
+ assert success == 2
291
+ assert fail == 1
292
+
293
+ @patch.object(ImageResizer, "resize_image")
294
+ def test_batch_resize_format_conversion(self, mock_resize, tmp_path):
295
+ """Test batch resize with format conversion."""
296
+ mock_resize.return_value = True
297
+
298
+ input_images = [tmp_path / "image.png"]
299
+ input_images[0].touch()
300
+
301
+ output_dir = tmp_path / "output"
302
+
303
+ self.resizer.batch_resize(
304
+ input_images,
305
+ output_dir,
306
+ width=800,
307
+ height=None,
308
+ format_ext="jpg"
309
+ )
310
+
311
+ # Check that resize_image was called with .jpg extension
312
+ call_args = mock_resize.call_args[0]
313
+ assert call_args[1].suffix == ".jpg"
314
+
315
+
316
+ class TestResizeStrategies:
317
+ """Test different resize strategies."""
318
+
319
+ def setup_method(self):
320
+ """Set up test fixtures."""
321
+ self.resizer = ImageResizer()
322
+
323
+ def test_fit_strategy_maintains_aspect(self):
324
+ """Test that 'fit' strategy maintains aspect ratio."""
325
+ cmd = self.resizer.build_resize_command(
326
+ Path("input.jpg"),
327
+ Path("output.jpg"),
328
+ width=800,
329
+ height=600,
330
+ strategy="fit",
331
+ quality=85
332
+ )
333
+
334
+ # Should have resize without ^ or !
335
+ resize_idx = cmd.index("-resize")
336
+ geometry = cmd[resize_idx + 1]
337
+ assert "^" not in geometry
338
+ assert "!" not in geometry
339
+
340
+ def test_cover_strategy_fills_dimensions(self):
341
+ """Test that 'cover' strategy fills dimensions."""
342
+ cmd = self.resizer.build_resize_command(
343
+ Path("input.jpg"),
344
+ Path("output.jpg"),
345
+ width=800,
346
+ height=600,
347
+ strategy="cover",
348
+ quality=85
349
+ )
350
+
351
+ resize_idx = cmd.index("-resize")
352
+ geometry = cmd[resize_idx + 1]
353
+ assert "^" in geometry
354
+
355
+ def test_exact_strategy_ignores_aspect(self):
356
+ """Test that 'exact' strategy ignores aspect ratio."""
357
+ cmd = self.resizer.build_resize_command(
358
+ Path("input.jpg"),
359
+ Path("output.jpg"),
360
+ width=800,
361
+ height=600,
362
+ strategy="exact",
363
+ quality=85
364
+ )
365
+
366
+ resize_idx = cmd.index("-resize")
367
+ geometry = cmd[resize_idx + 1]
368
+ assert "!" in geometry
369
+
370
+
371
+ if __name__ == "__main__":
372
+ pytest.main([__file__, "-v"])
@@ -0,0 +1,259 @@
1
+ #!/usr/bin/env python3
2
+ """Tests for media_convert.py"""
3
+
4
+ import sys
5
+ from pathlib import Path
6
+ from unittest.mock import MagicMock, patch
7
+
8
+ import pytest
9
+
10
+ # Add parent directory to path
11
+ sys.path.insert(0, str(Path(__file__).parent.parent))
12
+
13
+ from media_convert import (
14
+ build_audio_command,
15
+ build_image_command,
16
+ build_video_command,
17
+ check_dependencies,
18
+ convert_file,
19
+ detect_media_type,
20
+ )
21
+
22
+
23
+ class TestMediaTypeDetection:
24
+ """Test media type detection."""
25
+
26
+ def test_detect_video_formats(self):
27
+ """Test video format detection."""
28
+ assert detect_media_type(Path("test.mp4")) == "video"
29
+ assert detect_media_type(Path("test.mkv")) == "video"
30
+ assert detect_media_type(Path("test.avi")) == "video"
31
+ assert detect_media_type(Path("test.mov")) == "video"
32
+
33
+ def test_detect_audio_formats(self):
34
+ """Test audio format detection."""
35
+ assert detect_media_type(Path("test.mp3")) == "audio"
36
+ assert detect_media_type(Path("test.aac")) == "audio"
37
+ assert detect_media_type(Path("test.flac")) == "audio"
38
+ assert detect_media_type(Path("test.wav")) == "audio"
39
+
40
+ def test_detect_image_formats(self):
41
+ """Test image format detection."""
42
+ assert detect_media_type(Path("test.jpg")) == "image"
43
+ assert detect_media_type(Path("test.png")) == "image"
44
+ assert detect_media_type(Path("test.gif")) == "image"
45
+ assert detect_media_type(Path("test.webp")) == "image"
46
+
47
+ def test_detect_unknown_format(self):
48
+ """Test unknown format detection."""
49
+ assert detect_media_type(Path("test.txt")) == "unknown"
50
+ assert detect_media_type(Path("test.doc")) == "unknown"
51
+
52
+ def test_case_insensitive(self):
53
+ """Test case-insensitive detection."""
54
+ assert detect_media_type(Path("TEST.MP4")) == "video"
55
+ assert detect_media_type(Path("TEST.JPG")) == "image"
56
+
57
+
58
+ class TestCommandBuilding:
59
+ """Test command building functions."""
60
+
61
+ def test_build_video_command_web_preset(self):
62
+ """Test video command with web preset."""
63
+ cmd = build_video_command(
64
+ Path("input.mp4"),
65
+ Path("output.mp4"),
66
+ preset="web"
67
+ )
68
+
69
+ assert "ffmpeg" in cmd
70
+ assert "-i" in cmd
71
+ assert str(Path("input.mp4")) in cmd
72
+ assert "-c:v" in cmd
73
+ assert "libx264" in cmd
74
+ assert "-crf" in cmd
75
+ assert "23" in cmd
76
+ assert "-preset" in cmd
77
+ assert "medium" in cmd
78
+ assert str(Path("output.mp4")) in cmd
79
+
80
+ def test_build_video_command_archive_preset(self):
81
+ """Test video command with archive preset."""
82
+ cmd = build_video_command(
83
+ Path("input.mp4"),
84
+ Path("output.mp4"),
85
+ preset="archive"
86
+ )
87
+
88
+ assert "18" in cmd # CRF for archive
89
+ assert "slow" in cmd # Preset for archive
90
+
91
+ def test_build_audio_command_mp3(self):
92
+ """Test audio command for MP3 output."""
93
+ cmd = build_audio_command(
94
+ Path("input.wav"),
95
+ Path("output.mp3"),
96
+ preset="web"
97
+ )
98
+
99
+ assert "ffmpeg" in cmd
100
+ assert "-c:a" in cmd
101
+ assert "libmp3lame" in cmd
102
+ assert "-b:a" in cmd
103
+
104
+ def test_build_audio_command_flac(self):
105
+ """Test audio command for FLAC (lossless)."""
106
+ cmd = build_audio_command(
107
+ Path("input.wav"),
108
+ Path("output.flac"),
109
+ preset="web"
110
+ )
111
+
112
+ assert "flac" in cmd
113
+ assert "-b:a" not in cmd # No bitrate for lossless
114
+
115
+ def test_build_image_command(self):
116
+ """Test image command building."""
117
+ cmd = build_image_command(
118
+ Path("input.png"),
119
+ Path("output.jpg"),
120
+ preset="web"
121
+ )
122
+
123
+ assert "magick" in cmd
124
+ assert str(Path("input.png")) in cmd
125
+ assert "-quality" in cmd
126
+ assert "85" in cmd
127
+ assert "-strip" in cmd
128
+ assert str(Path("output.jpg")) in cmd
129
+
130
+
131
+ class TestDependencyCheck:
132
+ """Test dependency checking."""
133
+
134
+ @patch("subprocess.run")
135
+ def test_check_dependencies_both_available(self, mock_run):
136
+ """Test when both tools are available."""
137
+ mock_run.return_value = MagicMock(returncode=0)
138
+ ffmpeg_ok, magick_ok = check_dependencies()
139
+ assert ffmpeg_ok is True
140
+ assert magick_ok is True
141
+
142
+ @patch("subprocess.run")
143
+ def test_check_dependencies_ffmpeg_only(self, mock_run):
144
+ """Test when only FFmpeg is available."""
145
+ def side_effect(*args, **kwargs):
146
+ if "ffmpeg" in args[0]:
147
+ return MagicMock(returncode=0)
148
+ return MagicMock(returncode=1)
149
+
150
+ mock_run.side_effect = side_effect
151
+ ffmpeg_ok, magick_ok = check_dependencies()
152
+ assert ffmpeg_ok is True
153
+ assert magick_ok is False
154
+
155
+
156
+ class TestFileConversion:
157
+ """Test file conversion functionality."""
158
+
159
+ @patch("subprocess.run")
160
+ @patch("media_convert.detect_media_type")
161
+ def test_convert_video_file_dry_run(self, mock_detect, mock_run):
162
+ """Test video conversion in dry-run mode."""
163
+ mock_detect.return_value = "video"
164
+
165
+ result = convert_file(
166
+ Path("input.mp4"),
167
+ Path("output.mp4"),
168
+ preset="web",
169
+ dry_run=True
170
+ )
171
+
172
+ assert result is True
173
+ mock_run.assert_not_called()
174
+
175
+ @patch("subprocess.run")
176
+ @patch("media_convert.detect_media_type")
177
+ def test_convert_image_file_success(self, mock_detect, mock_run):
178
+ """Test successful image conversion."""
179
+ mock_detect.return_value = "image"
180
+ mock_run.return_value = MagicMock(returncode=0)
181
+
182
+ result = convert_file(
183
+ Path("input.png"),
184
+ Path("output.jpg"),
185
+ preset="web"
186
+ )
187
+
188
+ assert result is True
189
+ mock_run.assert_called_once()
190
+
191
+ @patch("subprocess.run")
192
+ @patch("media_convert.detect_media_type")
193
+ def test_convert_file_error(self, mock_detect, mock_run):
194
+ """Test conversion error handling."""
195
+ mock_detect.return_value = "video"
196
+ mock_run.side_effect = Exception("Conversion failed")
197
+
198
+ result = convert_file(
199
+ Path("input.mp4"),
200
+ Path("output.mp4")
201
+ )
202
+
203
+ assert result is False
204
+
205
+ @patch("media_convert.detect_media_type")
206
+ def test_convert_unknown_format(self, mock_detect):
207
+ """Test conversion with unknown format."""
208
+ mock_detect.return_value = "unknown"
209
+
210
+ result = convert_file(
211
+ Path("input.txt"),
212
+ Path("output.txt")
213
+ )
214
+
215
+ assert result is False
216
+
217
+
218
+ class TestQualityPresets:
219
+ """Test quality preset functionality."""
220
+
221
+ def test_web_preset_settings(self):
222
+ """Test web preset values."""
223
+ cmd = build_video_command(
224
+ Path("input.mp4"),
225
+ Path("output.mp4"),
226
+ preset="web"
227
+ )
228
+
229
+ cmd_str = " ".join(cmd)
230
+ assert "23" in cmd_str # CRF
231
+ assert "128k" in cmd_str # Audio bitrate
232
+
233
+ def test_archive_preset_settings(self):
234
+ """Test archive preset values."""
235
+ cmd = build_video_command(
236
+ Path("input.mp4"),
237
+ Path("output.mp4"),
238
+ preset="archive"
239
+ )
240
+
241
+ cmd_str = " ".join(cmd)
242
+ assert "18" in cmd_str # Higher quality CRF
243
+ assert "192k" in cmd_str # Higher audio bitrate
244
+
245
+ def test_mobile_preset_settings(self):
246
+ """Test mobile preset values."""
247
+ cmd = build_video_command(
248
+ Path("input.mp4"),
249
+ Path("output.mp4"),
250
+ preset="mobile"
251
+ )
252
+
253
+ cmd_str = " ".join(cmd)
254
+ assert "26" in cmd_str # Lower quality CRF
255
+ assert "96k" in cmd_str # Lower audio bitrate
256
+
257
+
258
+ if __name__ == "__main__":
259
+ pytest.main([__file__, "-v"])