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,319 @@
1
+ """Tests for nextjs-init.py script."""
2
+
3
+ import json
4
+ import sys
5
+ from pathlib import Path
6
+
7
+ import pytest
8
+
9
+ # Add parent directory to path to import the script
10
+ sys.path.insert(0, str(Path(__file__).parent.parent))
11
+
12
+ from nextjs_init import NextJSInitializer
13
+
14
+
15
+ class TestNextJSInitializer:
16
+ """Test suite for NextJSInitializer."""
17
+
18
+ def test_init_with_defaults(self, tmp_path):
19
+ """Test initialization with default parameters."""
20
+ initializer = NextJSInitializer(
21
+ name="test-app",
22
+ directory=tmp_path / "test-app"
23
+ )
24
+
25
+ assert initializer.name == "test-app"
26
+ assert initializer.typescript is True
27
+ assert initializer.app_router is True
28
+ assert initializer.src_dir is False
29
+ assert initializer.tailwind is False
30
+ assert initializer.eslint is True
31
+
32
+ def test_validate_name_valid(self, tmp_path):
33
+ """Test name validation with valid names."""
34
+ valid_names = ["my-app", "my_app", "myapp123", "test-app-1"]
35
+
36
+ for name in valid_names:
37
+ initializer = NextJSInitializer(
38
+ name=name,
39
+ directory=tmp_path / name
40
+ )
41
+ initializer.validate_name() # Should not raise
42
+
43
+ def test_validate_name_invalid(self, tmp_path):
44
+ """Test name validation with invalid names."""
45
+ invalid_cases = [
46
+ ("", ValueError, "empty"),
47
+ ("123app", ValueError, "starts with number"),
48
+ ("my app", ValueError, "contains space"),
49
+ ("my@app", ValueError, "contains special char"),
50
+ ]
51
+
52
+ for name, expected_error, reason in invalid_cases:
53
+ initializer = NextJSInitializer(
54
+ name=name,
55
+ directory=tmp_path / (name or "empty")
56
+ )
57
+
58
+ with pytest.raises(expected_error):
59
+ initializer.validate_name()
60
+
61
+ def test_check_directory_exists(self, tmp_path):
62
+ """Test directory existence check."""
63
+ existing_dir = tmp_path / "existing"
64
+ existing_dir.mkdir()
65
+
66
+ initializer = NextJSInitializer(
67
+ name="test-app",
68
+ directory=existing_dir
69
+ )
70
+
71
+ with pytest.raises(FileExistsError):
72
+ initializer.check_directory()
73
+
74
+ def test_create_directory_structure_app_router(self, tmp_path):
75
+ """Test directory structure creation with App Router."""
76
+ project_dir = tmp_path / "test-app"
77
+ initializer = NextJSInitializer(
78
+ name="test-app",
79
+ directory=project_dir,
80
+ app_router=True
81
+ )
82
+
83
+ initializer.create_directory_structure()
84
+
85
+ # Check directories
86
+ assert (project_dir / "app").exists()
87
+ assert (project_dir / "public").exists()
88
+ assert (project_dir / "components").exists()
89
+ assert (project_dir / "lib").exists()
90
+
91
+ # Check App Router files
92
+ assert (project_dir / "app" / "layout.tsx").exists()
93
+ assert (project_dir / "app" / "page.tsx").exists()
94
+ assert (project_dir / "app" / "globals.css").exists()
95
+
96
+ def test_create_directory_structure_with_src(self, tmp_path):
97
+ """Test directory structure with src/ directory."""
98
+ project_dir = tmp_path / "test-app"
99
+ initializer = NextJSInitializer(
100
+ name="test-app",
101
+ directory=project_dir,
102
+ src_dir=True
103
+ )
104
+
105
+ initializer.create_directory_structure()
106
+
107
+ # Check src structure
108
+ assert (project_dir / "src" / "app").exists()
109
+ assert (project_dir / "src" / "components").exists()
110
+ assert (project_dir / "src" / "lib").exists()
111
+
112
+ def test_package_json_generation(self, tmp_path):
113
+ """Test package.json generation."""
114
+ initializer = NextJSInitializer(
115
+ name="test-app",
116
+ directory=tmp_path / "test-app",
117
+ typescript=True,
118
+ tailwind=True,
119
+ eslint=True
120
+ )
121
+
122
+ package_json = initializer._get_package_json()
123
+
124
+ assert package_json["name"] == "test-app"
125
+ assert package_json["version"] == "0.1.0"
126
+ assert package_json["private"] is True
127
+
128
+ # Check scripts
129
+ assert "dev" in package_json["scripts"]
130
+ assert "build" in package_json["scripts"]
131
+ assert "start" in package_json["scripts"]
132
+ assert "lint" in package_json["scripts"]
133
+
134
+ # Check dependencies
135
+ assert "next" in package_json["dependencies"]
136
+ assert "react" in package_json["dependencies"]
137
+ assert "react-dom" in package_json["dependencies"]
138
+
139
+ # Check TypeScript dependencies
140
+ assert "typescript" in package_json["devDependencies"]
141
+ assert "@types/node" in package_json["devDependencies"]
142
+ assert "@types/react" in package_json["devDependencies"]
143
+
144
+ # Check Tailwind dependencies
145
+ assert "tailwindcss" in package_json["dependencies"]
146
+
147
+ # Check ESLint dependencies
148
+ assert "eslint" in package_json["devDependencies"]
149
+
150
+ def test_tsconfig_generation(self, tmp_path):
151
+ """Test tsconfig.json generation."""
152
+ initializer = NextJSInitializer(
153
+ name="test-app",
154
+ directory=tmp_path / "test-app",
155
+ typescript=True,
156
+ import_alias="@/*"
157
+ )
158
+
159
+ tsconfig = initializer._get_tsconfig()
160
+
161
+ assert "compilerOptions" in tsconfig
162
+ assert tsconfig["compilerOptions"]["strict"] is True
163
+ assert tsconfig["compilerOptions"]["jsx"] == "preserve"
164
+ assert "@/*" in tsconfig["compilerOptions"]["paths"]
165
+ assert "next-env.d.ts" in tsconfig["include"]
166
+
167
+ def test_layout_content_typescript(self, tmp_path):
168
+ """Test layout.tsx content generation."""
169
+ initializer = NextJSInitializer(
170
+ name="test-app",
171
+ directory=tmp_path / "test-app",
172
+ typescript=True
173
+ )
174
+
175
+ content = initializer._get_layout_content()
176
+
177
+ assert "import './globals.css'" in content
178
+ assert "export const metadata" in content
179
+ assert "children: React.ReactNode" in content
180
+ assert "<html lang=\"en\">" in content
181
+
182
+ def test_layout_content_javascript(self, tmp_path):
183
+ """Test layout.jsx content generation."""
184
+ initializer = NextJSInitializer(
185
+ name="test-app",
186
+ directory=tmp_path / "test-app",
187
+ typescript=False
188
+ )
189
+
190
+ content = initializer._get_layout_content()
191
+
192
+ assert "import './globals.css'" in content
193
+ assert "export const metadata" in content
194
+ assert "React.ReactNode" not in content # No TypeScript types
195
+
196
+ def test_tailwind_config_typescript(self, tmp_path):
197
+ """Test Tailwind config generation with TypeScript."""
198
+ initializer = NextJSInitializer(
199
+ name="test-app",
200
+ directory=tmp_path / "test-app",
201
+ typescript=True,
202
+ tailwind=True
203
+ )
204
+
205
+ config = initializer._get_tailwind_config()
206
+
207
+ assert "import type { Config }" in config
208
+ assert "const config: Config" in config
209
+ assert "content:" in config
210
+
211
+ def test_tailwind_config_javascript(self, tmp_path):
212
+ """Test Tailwind config generation with JavaScript."""
213
+ initializer = NextJSInitializer(
214
+ name="test-app",
215
+ directory=tmp_path / "test-app",
216
+ typescript=False,
217
+ tailwind=True
218
+ )
219
+
220
+ config = initializer._get_tailwind_config()
221
+
222
+ assert "module.exports" in config
223
+ assert "content:" in config
224
+
225
+ def test_gitignore_generation(self, tmp_path):
226
+ """Test .gitignore generation."""
227
+ initializer = NextJSInitializer(
228
+ name="test-app",
229
+ directory=tmp_path / "test-app"
230
+ )
231
+
232
+ gitignore = initializer._get_gitignore()
233
+
234
+ assert "/node_modules" in gitignore
235
+ assert "/.next/" in gitignore
236
+ assert ".env*.local" in gitignore
237
+ assert ".DS_Store" in gitignore
238
+
239
+ def test_readme_generation(self, tmp_path):
240
+ """Test README.md generation."""
241
+ initializer = NextJSInitializer(
242
+ name="test-app",
243
+ directory=tmp_path / "test-app"
244
+ )
245
+
246
+ readme = initializer._get_readme()
247
+
248
+ assert "# test-app" in readme
249
+ assert "Next.js" in readme
250
+ assert "npm run dev" in readme
251
+
252
+ def test_create_config_files(self, tmp_path):
253
+ """Test configuration files creation."""
254
+ project_dir = tmp_path / "test-app"
255
+ initializer = NextJSInitializer(
256
+ name="test-app",
257
+ directory=project_dir,
258
+ typescript=True,
259
+ tailwind=True,
260
+ eslint=True
261
+ )
262
+
263
+ initializer.create_directory_structure()
264
+ initializer.create_config_files()
265
+
266
+ # Check all config files exist
267
+ assert (project_dir / "package.json").exists()
268
+ assert (project_dir / "next.config.js").exists()
269
+ assert (project_dir / "tsconfig.json").exists()
270
+ assert (project_dir / ".eslintrc.json").exists()
271
+ assert (project_dir / "tailwind.config.ts").exists()
272
+ assert (project_dir / "postcss.config.js").exists()
273
+ assert (project_dir / ".gitignore").exists()
274
+ assert (project_dir / "README.md").exists()
275
+
276
+ # Verify package.json is valid JSON
277
+ with open(project_dir / "package.json") as f:
278
+ package_json = json.load(f)
279
+ assert package_json["name"] == "test-app"
280
+
281
+ def test_full_initialization(self, tmp_path):
282
+ """Test full initialization process."""
283
+ project_dir = tmp_path / "test-app"
284
+ initializer = NextJSInitializer(
285
+ name="test-app",
286
+ directory=project_dir,
287
+ typescript=True,
288
+ app_router=True,
289
+ tailwind=True
290
+ )
291
+
292
+ initializer.initialize()
293
+
294
+ # Verify directory exists
295
+ assert project_dir.exists()
296
+
297
+ # Verify structure
298
+ assert (project_dir / "app").exists()
299
+ assert (project_dir / "public").exists()
300
+
301
+ # Verify config files
302
+ assert (project_dir / "package.json").exists()
303
+ assert (project_dir / "tsconfig.json").exists()
304
+ assert (project_dir / "next.config.js").exists()
305
+
306
+ def test_pages_router_structure(self, tmp_path):
307
+ """Test Pages Router directory structure."""
308
+ project_dir = tmp_path / "test-app"
309
+ initializer = NextJSInitializer(
310
+ name="test-app",
311
+ directory=project_dir,
312
+ app_router=False # Use Pages Router
313
+ )
314
+
315
+ initializer.create_directory_structure()
316
+
317
+ # Check Pages Router files
318
+ assert (project_dir / "pages" / "_app.tsx").exists()
319
+ assert (project_dir / "pages" / "index.tsx").exists()
@@ -0,0 +1,374 @@
1
+ """Tests for turborepo-migrate.py script."""
2
+
3
+ import json
4
+ import sys
5
+ from pathlib import Path
6
+
7
+ import pytest
8
+
9
+ # Add parent directory to path to import the script
10
+ sys.path.insert(0, str(Path(__file__).parent.parent))
11
+
12
+ from turborepo_migrate import TurborepoMigrator
13
+
14
+
15
+ @pytest.fixture
16
+ def mock_monorepo(tmp_path):
17
+ """Create a mock monorepo structure."""
18
+ # Root package.json
19
+ root_pkg = {
20
+ "name": "test-monorepo",
21
+ "private": True,
22
+ "workspaces": ["apps/*", "packages/*"],
23
+ "scripts": {
24
+ "build": "npm run build --workspaces",
25
+ "test": "npm run test --workspaces"
26
+ }
27
+ }
28
+
29
+ (tmp_path / "package.json").write_text(json.dumps(root_pkg, indent=2))
30
+
31
+ # Create apps
32
+ apps_dir = tmp_path / "apps"
33
+ apps_dir.mkdir()
34
+
35
+ web_dir = apps_dir / "web"
36
+ web_dir.mkdir()
37
+ (web_dir / "package.json").write_text(json.dumps({
38
+ "name": "web",
39
+ "version": "1.0.0",
40
+ "scripts": {
41
+ "dev": "next dev",
42
+ "build": "next build",
43
+ "test": "jest",
44
+ "lint": "eslint ."
45
+ },
46
+ "dependencies": {
47
+ "@repo/ui": "*",
48
+ "next": "latest"
49
+ }
50
+ }, indent=2))
51
+
52
+ # Create Next.js output directory
53
+ (web_dir / ".next").mkdir()
54
+
55
+ # Create packages
56
+ packages_dir = tmp_path / "packages"
57
+ packages_dir.mkdir()
58
+
59
+ ui_dir = packages_dir / "ui"
60
+ ui_dir.mkdir()
61
+ (ui_dir / "package.json").write_text(json.dumps({
62
+ "name": "@repo/ui",
63
+ "version": "0.0.0",
64
+ "scripts": {
65
+ "build": "tsc",
66
+ "test": "jest",
67
+ "lint": "eslint ."
68
+ },
69
+ "dependencies": {
70
+ "react": "latest"
71
+ }
72
+ }, indent=2))
73
+
74
+ # Create dist directory
75
+ (ui_dir / "dist").mkdir()
76
+
77
+ return tmp_path
78
+
79
+
80
+ class TestTurborepoMigrator:
81
+ """Test suite for TurborepoMigrator."""
82
+
83
+ def test_init(self, tmp_path):
84
+ """Test migrator initialization."""
85
+ migrator = TurborepoMigrator(
86
+ path=tmp_path,
87
+ dry_run=True,
88
+ package_manager="npm"
89
+ )
90
+
91
+ assert migrator.path == tmp_path.resolve()
92
+ assert migrator.dry_run is True
93
+ assert migrator.package_manager == "npm"
94
+
95
+ def test_validate_path_exists(self, mock_monorepo):
96
+ """Test path validation with valid monorepo."""
97
+ migrator = TurborepoMigrator(path=mock_monorepo)
98
+ migrator.validate_path() # Should not raise
99
+
100
+ def test_validate_path_not_exists(self, tmp_path):
101
+ """Test path validation with non-existent path."""
102
+ migrator = TurborepoMigrator(path=tmp_path / "nonexistent")
103
+
104
+ with pytest.raises(FileNotFoundError):
105
+ migrator.validate_path()
106
+
107
+ def test_validate_path_not_directory(self, tmp_path):
108
+ """Test path validation with file instead of directory."""
109
+ file_path = tmp_path / "file.txt"
110
+ file_path.touch()
111
+
112
+ migrator = TurborepoMigrator(path=file_path)
113
+
114
+ with pytest.raises(NotADirectoryError):
115
+ migrator.validate_path()
116
+
117
+ def test_validate_path_no_package_json(self, tmp_path):
118
+ """Test path validation without package.json."""
119
+ empty_dir = tmp_path / "empty"
120
+ empty_dir.mkdir()
121
+
122
+ migrator = TurborepoMigrator(path=empty_dir)
123
+
124
+ with pytest.raises(FileNotFoundError):
125
+ migrator.validate_path()
126
+
127
+ def test_analyze_workspace_npm(self, mock_monorepo):
128
+ """Test workspace analysis for npm/yarn workspaces."""
129
+ migrator = TurborepoMigrator(path=mock_monorepo)
130
+ migrator.analyze_workspace()
131
+
132
+ assert migrator.workspace_config["type"] == "npm/yarn"
133
+ assert "apps/*" in migrator.workspace_config["patterns"]
134
+ assert "packages/*" in migrator.workspace_config["patterns"]
135
+
136
+ def test_analyze_workspace_pnpm(self, tmp_path):
137
+ """Test workspace analysis for pnpm workspaces."""
138
+ # Create root package.json without workspaces
139
+ (tmp_path / "package.json").write_text(json.dumps({
140
+ "name": "test-monorepo",
141
+ "private": True
142
+ }))
143
+
144
+ # Create pnpm-workspace.yaml
145
+ (tmp_path / "pnpm-workspace.yaml").write_text("""packages:
146
+ - 'apps/*'
147
+ - 'packages/*'
148
+ """)
149
+
150
+ migrator = TurborepoMigrator(path=tmp_path)
151
+ migrator.analyze_workspace()
152
+
153
+ assert migrator.workspace_config["type"] == "pnpm"
154
+ assert migrator.workspace_config["file"] == "pnpm-workspace.yaml"
155
+
156
+ def test_discover_packages(self, mock_monorepo):
157
+ """Test package discovery."""
158
+ migrator = TurborepoMigrator(path=mock_monorepo)
159
+ migrator.analyze_workspace()
160
+ migrator.discover_packages()
161
+
162
+ assert len(migrator.packages) == 2
163
+
164
+ package_names = {pkg["name"] for pkg in migrator.packages}
165
+ assert "web" in package_names
166
+ assert "@repo/ui" in package_names
167
+
168
+ def test_analyze_scripts(self, mock_monorepo):
169
+ """Test script analysis."""
170
+ migrator = TurborepoMigrator(path=mock_monorepo)
171
+ migrator.analyze_workspace()
172
+ migrator.discover_packages()
173
+
174
+ common_scripts = migrator.analyze_scripts()
175
+
176
+ # All packages have build, test, lint
177
+ assert "build" in common_scripts
178
+ assert "test" in common_scripts
179
+ assert "lint" in common_scripts
180
+
181
+ # Check package counts
182
+ assert len(common_scripts["build"]) == 2
183
+ assert len(common_scripts["test"]) == 2
184
+
185
+ def test_infer_build_outputs(self, mock_monorepo):
186
+ """Test build output inference."""
187
+ migrator = TurborepoMigrator(path=mock_monorepo)
188
+ migrator.analyze_workspace()
189
+ migrator.discover_packages()
190
+
191
+ outputs = migrator._infer_build_outputs()
192
+
193
+ # Should detect .next and dist directories
194
+ assert ".next/**" in outputs
195
+ assert "!.next/cache/**" in outputs
196
+ assert "dist/**" in outputs
197
+
198
+ def test_generate_turbo_config(self, mock_monorepo):
199
+ """Test turbo.json generation."""
200
+ migrator = TurborepoMigrator(path=mock_monorepo)
201
+ migrator.analyze_workspace()
202
+ migrator.discover_packages()
203
+
204
+ common_scripts = migrator.analyze_scripts()
205
+ turbo_config = migrator.generate_turbo_config(common_scripts)
206
+
207
+ assert "$schema" in turbo_config
208
+ assert "pipeline" in turbo_config
209
+
210
+ # Check build task
211
+ assert "build" in turbo_config["pipeline"]
212
+ assert turbo_config["pipeline"]["build"]["dependsOn"] == ["^build"]
213
+ assert "outputs" in turbo_config["pipeline"]["build"]
214
+
215
+ # Check test task
216
+ assert "test" in turbo_config["pipeline"]
217
+ assert "coverage/**" in turbo_config["pipeline"]["test"]["outputs"]
218
+
219
+ # Check lint task
220
+ assert "lint" in turbo_config["pipeline"]
221
+
222
+ # Note: dev task won't be in pipeline because it's only in 1 package
223
+ # (needs to be in 2+ packages to be considered "common")
224
+ # This is correct behavior - only truly common scripts are included
225
+
226
+ def test_update_root_package_json(self, mock_monorepo):
227
+ """Test root package.json update."""
228
+ migrator = TurborepoMigrator(path=mock_monorepo)
229
+ migrator.analyze_workspace()
230
+ migrator.discover_packages()
231
+
232
+ updated_package_json = migrator.update_root_package_json()
233
+
234
+ # Check turbo added to devDependencies
235
+ assert "turbo" in updated_package_json["devDependencies"]
236
+ assert updated_package_json["devDependencies"]["turbo"] == "latest"
237
+
238
+ # Check scripts updated (only common scripts are added)
239
+ assert updated_package_json["scripts"]["build"] == "turbo run build"
240
+ assert updated_package_json["scripts"]["test"] == "turbo run test"
241
+ assert updated_package_json["scripts"]["lint"] == "turbo run lint"
242
+ # dev is only in one package, so it won't be added
243
+
244
+ def test_generate_migration_report(self, mock_monorepo):
245
+ """Test migration report generation."""
246
+ migrator = TurborepoMigrator(path=mock_monorepo)
247
+ migrator.analyze_workspace()
248
+ migrator.discover_packages()
249
+
250
+ common_scripts = migrator.analyze_scripts()
251
+ turbo_config = migrator.generate_turbo_config(common_scripts)
252
+ updated_package_json = migrator.update_root_package_json()
253
+
254
+ report = migrator.generate_migration_report(turbo_config, updated_package_json)
255
+
256
+ assert "TURBOREPO MIGRATION REPORT" in report
257
+ assert "PACKAGES:" in report
258
+ assert "TURBO.JSON PIPELINE:" in report
259
+ assert "ROOT PACKAGE.JSON SCRIPTS:" in report
260
+ assert "RECOMMENDATIONS:" in report
261
+
262
+ # Check package names appear
263
+ assert "web" in report
264
+ assert "@repo/ui" in report
265
+
266
+ def test_write_files_dry_run(self, mock_monorepo, capsys):
267
+ """Test file writing in dry-run mode."""
268
+ migrator = TurborepoMigrator(path=mock_monorepo, dry_run=True)
269
+ migrator.analyze_workspace()
270
+ migrator.discover_packages()
271
+
272
+ common_scripts = migrator.analyze_scripts()
273
+ turbo_config = migrator.generate_turbo_config(common_scripts)
274
+ updated_package_json = migrator.update_root_package_json()
275
+
276
+ migrator.write_files(turbo_config, updated_package_json)
277
+
278
+ # Check files not created
279
+ assert not (mock_monorepo / "turbo.json").exists()
280
+
281
+ # Check output
282
+ captured = capsys.readouterr()
283
+ assert "DRY RUN" in captured.out
284
+
285
+ def test_write_files_actual(self, mock_monorepo):
286
+ """Test actual file writing."""
287
+ migrator = TurborepoMigrator(path=mock_monorepo, dry_run=False)
288
+ migrator.analyze_workspace()
289
+ migrator.discover_packages()
290
+
291
+ common_scripts = migrator.analyze_scripts()
292
+ turbo_config = migrator.generate_turbo_config(common_scripts)
293
+ updated_package_json = migrator.update_root_package_json()
294
+
295
+ migrator.write_files(turbo_config, updated_package_json)
296
+
297
+ # Check turbo.json created
298
+ assert (mock_monorepo / "turbo.json").exists()
299
+
300
+ # Verify content
301
+ with open(mock_monorepo / "turbo.json") as f:
302
+ saved_config = json.load(f)
303
+ assert saved_config["$schema"] == turbo_config["$schema"]
304
+ assert "pipeline" in saved_config
305
+
306
+ # Check package.json updated
307
+ with open(mock_monorepo / "package.json") as f:
308
+ saved_package = json.load(f)
309
+ assert "turbo" in saved_package["devDependencies"]
310
+
311
+ def test_full_migration_dry_run(self, mock_monorepo):
312
+ """Test full migration process in dry-run mode."""
313
+ migrator = TurborepoMigrator(path=mock_monorepo, dry_run=True)
314
+ migrator.migrate()
315
+
316
+ # Files should not be created in dry-run
317
+ assert not (mock_monorepo / "turbo.json").exists()
318
+
319
+ # Original package.json should be unchanged
320
+ with open(mock_monorepo / "package.json") as f:
321
+ package_json = json.load(f)
322
+ assert "turbo" not in package_json.get("devDependencies", {})
323
+
324
+ def test_full_migration_actual(self, mock_monorepo):
325
+ """Test full migration process."""
326
+ migrator = TurborepoMigrator(path=mock_monorepo, dry_run=False)
327
+ migrator.migrate()
328
+
329
+ # Check turbo.json created
330
+ assert (mock_monorepo / "turbo.json").exists()
331
+
332
+ with open(mock_monorepo / "turbo.json") as f:
333
+ turbo_config = json.load(f)
334
+ assert "$schema" in turbo_config
335
+ assert "pipeline" in turbo_config
336
+ assert "build" in turbo_config["pipeline"]
337
+
338
+ # Check package.json updated
339
+ with open(mock_monorepo / "package.json") as f:
340
+ package_json = json.load(f)
341
+ assert "turbo" in package_json["devDependencies"]
342
+ assert package_json["scripts"]["build"] == "turbo run build"
343
+
344
+ def test_parse_pnpm_workspace(self, tmp_path):
345
+ """Test pnpm-workspace.yaml parsing."""
346
+ yaml_content = """packages:
347
+ - 'apps/*'
348
+ - 'packages/*'
349
+ - 'tools/*'
350
+ """
351
+ yaml_file = tmp_path / "pnpm-workspace.yaml"
352
+ yaml_file.write_text(yaml_content)
353
+
354
+ migrator = TurborepoMigrator(path=tmp_path)
355
+ patterns = migrator._parse_pnpm_workspace(yaml_file)
356
+
357
+ assert len(patterns) == 3
358
+ assert "apps/*" in patterns
359
+ assert "packages/*" in patterns
360
+ assert "tools/*" in patterns
361
+
362
+ def test_monorepo_without_workspaces(self, tmp_path):
363
+ """Test migration fails for non-workspace monorepo."""
364
+ # Create package.json without workspaces
365
+ (tmp_path / "package.json").write_text(json.dumps({
366
+ "name": "not-a-monorepo",
367
+ "version": "1.0.0"
368
+ }))
369
+
370
+ migrator = TurborepoMigrator(path=tmp_path)
371
+
372
+ # migrate() calls sys.exit(1) on error, so we catch SystemExit
373
+ with pytest.raises(SystemExit):
374
+ migrator.migrate()