cokit-cli 1.0.1 → 1.0.2
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.
- package/AGENTS.md +103 -0
- package/README.FLOW.md +237 -0
- package/README.md +153 -94
- package/agents/brainstormer.agent.md +71 -0
- package/agents/code-reviewer.agent.md +128 -0
- package/agents/database-admin.agent.md +91 -0
- package/agents/debugger.agent.md +128 -0
- package/agents/docs-manager.agent.md +121 -0
- package/agents/fullstack-developer.agent.md +96 -0
- package/agents/git-manager.agent.md +392 -0
- package/agents/mcp-manager.agent.md +93 -0
- package/agents/planner.agent.md +94 -0
- package/agents/project-manager.agent.md +124 -0
- package/agents/researcher.agent.md +32 -0
- package/agents/scout-external.agent.md +141 -0
- package/agents/scout.agent.md +107 -0
- package/agents/tester.agent.md +106 -0
- package/agents/ui-ux-designer.agent.md +225 -0
- package/collections/ck-core.collection.yml +30 -0
- package/collections/ck-development-rules.collection.yml +18 -0
- package/collections/ck-documentation.collection.yml +18 -0
- package/collections/ck-git-workflow.collection.yml +18 -0
- package/collections/ck-orchestration.collection.yml +22 -0
- package/collections/ck-ui-design.collection.yml +18 -0
- package/docs/README.md +85 -0
- package/docs/copilot-processing-flow.md +128 -0
- package/instructions/ck-backend.instructions.md +48 -0
- package/instructions/ck-development.instructions.md +40 -0
- package/instructions/ck-frontend-design-pro.instructions.md +58 -0
- package/instructions/ck-frontend.instructions.md +44 -0
- package/instructions/ck-google-adk-python.instructions.md +242 -0
- package/instructions/ck-research.instructions.md +167 -0
- package/instructions/ck-testing.instructions.md +36 -0
- package/package.json +9 -2
- package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/phase-01-restructure-folders.md +183 -0
- package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/phase-02-convert-agents.md +206 -0
- package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/phase-03-convert-commands-to-prompts.md +284 -0
- package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/phase-04-convert-skills-to-instructions.md +349 -0
- package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/phase-05-create-collections.md +320 -0
- package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/phase-06-update-cli-build-scripts.md +450 -0
- package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/phase-07-update-documentation.md +407 -0
- package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/plan.md +136 -0
- package/prompts/ck-ask.prompt.md +57 -0
- package/prompts/ck-bootstrap-auto-fast.prompt.md +108 -0
- package/prompts/ck-bootstrap-auto-parallel.prompt.md +66 -0
- package/prompts/ck-bootstrap-auto.prompt.md +114 -0
- package/prompts/ck-bootstrap.prompt.md +136 -0
- package/prompts/ck-brainstorm.prompt.md +68 -0
- package/prompts/ck-ck-help.prompt.md +114 -0
- package/prompts/ck-code-auto.prompt.md +171 -0
- package/prompts/ck-code-no-test.prompt.md +159 -0
- package/prompts/ck-code-parallel.prompt.md +56 -0
- package/prompts/ck-code.prompt.md +177 -0
- package/prompts/ck-coding-level.prompt.md +54 -0
- package/prompts/ck-cook-auto-fast.prompt.md +26 -0
- package/prompts/ck-cook-auto-parallel.prompt.md +49 -0
- package/prompts/ck-cook-auto.prompt.md +15 -0
- package/prompts/ck-cook.prompt.md +96 -0
- package/prompts/ck-debug.prompt.md +14 -0
- package/prompts/ck-design-3d.prompt.md +84 -0
- package/prompts/ck-design-describe.prompt.md +24 -0
- package/prompts/ck-design-fast.prompt.md +32 -0
- package/prompts/ck-design-good.prompt.md +36 -0
- package/prompts/ck-design-screenshot.prompt.md +35 -0
- package/prompts/ck-design-video.prompt.md +35 -0
- package/prompts/ck-docs-init.prompt.md +27 -0
- package/prompts/ck-docs-summarize.prompt.md +23 -0
- package/prompts/ck-docs-update.prompt.md +36 -0
- package/prompts/ck-fix-ci.prompt.md +18 -0
- package/prompts/ck-fix-fast.prompt.md +18 -0
- package/prompts/ck-fix-hard.prompt.md +36 -0
- package/prompts/ck-fix-logs.prompt.md +27 -0
- package/prompts/ck-fix-parallel.prompt.md +54 -0
- package/prompts/ck-fix-test.prompt.md +19 -0
- package/prompts/ck-fix-types.prompt.md +11 -0
- package/prompts/ck-fix-ui.prompt.md +49 -0
- package/prompts/ck-fix.prompt.md +44 -0
- package/prompts/ck-git-cm.prompt.md +8 -0
- package/prompts/ck-git-cp.prompt.md +7 -0
- package/prompts/ck-git-merge.prompt.md +41 -0
- package/prompts/ck-git-pr.prompt.md +49 -0
- package/prompts/ck-kanban.prompt.md +77 -0
- package/prompts/ck-plan-archive.prompt.md +58 -0
- package/prompts/ck-plan-ci.prompt.md +34 -0
- package/prompts/ck-plan-cro.prompt.md +66 -0
- package/prompts/ck-plan-fast.prompt.md +67 -0
- package/prompts/ck-plan-hard.prompt.md +89 -0
- package/prompts/ck-plan-parallel.prompt.md +126 -0
- package/prompts/ck-plan-two.prompt.md +43 -0
- package/prompts/ck-plan-validate.prompt.md +118 -0
- package/prompts/ck-plan.prompt.md +29 -1
- package/prompts/ck-preview.prompt.md +65 -0
- package/prompts/ck-review-codebase.prompt.md +44 -0
- package/prompts/ck-scout-ext.prompt.md +35 -0
- package/prompts/ck-scout.prompt.md +25 -0
- package/prompts/ck-skill-add.prompt.md +36 -0
- package/prompts/ck-skill-create.prompt.md +29 -0
- package/prompts/ck-skill-fix-logs.prompt.md +22 -0
- package/prompts/ck-skill-optimize-auto.prompt.md +25 -0
- package/prompts/ck-skill-optimize.prompt.md +34 -0
- package/prompts/ck-skill-plan.prompt.md +46 -0
- package/prompts/ck-test-ui.prompt.md +92 -0
- package/prompts/ck-test.prompt.md +10 -0
- package/prompts/ck-use-mcp.prompt.md +27 -0
- package/prompts/ck-watzup.prompt.md +11 -0
- package/prompts/ck-worktree.prompt.md +127 -0
- package/rules/README.agents.md +55 -0
- package/rules/README.collections.md +78 -0
- package/rules/README.copilot-instructions.md +66 -0
- package/rules/README.instructions.md +73 -0
- package/rules/README.md +39 -0
- package/rules/README.prompts.md +76 -0
- package/rules/README.skills.md +71 -0
- package/skills/ck-ai-artist/SKILL.md +73 -0
- package/skills/ck-ai-artist/references/advanced-techniques.md +184 -0
- package/skills/ck-ai-artist/references/domain-code.md +66 -0
- package/skills/ck-ai-artist/references/domain-data.md +72 -0
- package/skills/ck-ai-artist/references/domain-marketing.md +66 -0
- package/skills/ck-ai-artist/references/domain-patterns.md +33 -0
- package/skills/ck-ai-artist/references/domain-writing.md +68 -0
- package/skills/ck-ai-artist/references/image-prompting.md +141 -0
- package/skills/ck-ai-artist/references/llm-prompting.md +165 -0
- package/skills/ck-ai-artist/references/nano-banana.md +59 -0
- package/skills/ck-ai-artist/references/reasoning-techniques.md +201 -0
- package/skills/ck-backend-development/SKILL.md +93 -0
- package/skills/ck-backend-development/references/backend-api-design.md +495 -0
- package/skills/ck-backend-development/references/backend-architecture.md +454 -0
- package/skills/ck-backend-development/references/backend-authentication.md +338 -0
- package/skills/ck-backend-development/references/backend-code-quality.md +659 -0
- package/skills/ck-backend-development/references/backend-debugging.md +904 -0
- package/skills/ck-backend-development/references/backend-devops.md +494 -0
- package/skills/ck-backend-development/references/backend-mindset.md +387 -0
- package/skills/ck-backend-development/references/backend-performance.md +397 -0
- package/skills/ck-backend-development/references/backend-security.md +290 -0
- package/skills/ck-backend-development/references/backend-technologies.md +256 -0
- package/skills/ck-backend-development/references/backend-testing.md +429 -0
- package/skills/ck-better-auth/SKILL.md +202 -0
- package/skills/ck-better-auth/references/advanced-features.md +553 -0
- package/skills/ck-better-auth/references/database-integration.md +577 -0
- package/skills/ck-better-auth/references/email-password-auth.md +416 -0
- package/skills/ck-better-auth/references/oauth-providers.md +430 -0
- package/skills/ck-better-auth/scripts/.coverage +0 -0
- package/skills/ck-better-auth/scripts/better_auth_init.py +521 -0
- package/skills/ck-better-auth/scripts/requirements.txt +15 -0
- package/skills/ck-better-auth/scripts/tests/.coverage +0 -0
- package/skills/ck-better-auth/scripts/tests/test_better_auth_init.py +421 -0
- package/skills/ck-chrome-devtools/SKILL.md +470 -0
- package/skills/ck-chrome-devtools/references/cdp-domains.md +694 -0
- package/skills/ck-chrome-devtools/references/performance-guide.md +940 -0
- package/skills/ck-chrome-devtools/references/puppeteer-reference.md +953 -0
- package/skills/ck-chrome-devtools/scripts/README.md +272 -0
- package/skills/ck-chrome-devtools/scripts/__tests__/selector.test.js +210 -0
- package/skills/ck-chrome-devtools/scripts/aria-snapshot.js +362 -0
- package/skills/ck-chrome-devtools/scripts/click.js +83 -0
- package/skills/ck-chrome-devtools/scripts/console.js +79 -0
- package/skills/ck-chrome-devtools/scripts/evaluate.js +53 -0
- package/skills/ck-chrome-devtools/scripts/fill.js +76 -0
- package/skills/ck-chrome-devtools/scripts/inject-auth.js +229 -0
- package/skills/ck-chrome-devtools/scripts/install-deps.sh +181 -0
- package/skills/ck-chrome-devtools/scripts/install.sh +83 -0
- package/skills/ck-chrome-devtools/scripts/lib/browser.js +318 -0
- package/skills/ck-chrome-devtools/scripts/lib/selector.js +178 -0
- package/skills/ck-chrome-devtools/scripts/navigate.js +54 -0
- package/skills/ck-chrome-devtools/scripts/network.js +106 -0
- package/skills/ck-chrome-devtools/scripts/package-lock.json +1589 -0
- package/skills/ck-chrome-devtools/scripts/package.json +16 -0
- package/skills/ck-chrome-devtools/scripts/performance.js +149 -0
- package/skills/ck-chrome-devtools/scripts/screenshot.js +198 -0
- package/skills/ck-chrome-devtools/scripts/select-ref.js +131 -0
- package/skills/ck-chrome-devtools/scripts/snapshot.js +135 -0
- package/skills/ck-code-review/SKILL.md +110 -53
- package/skills/ck-code-review/references/code-review-reception.md +182 -49
- package/skills/ck-code-review/references/requesting-code-review.md +105 -0
- package/skills/ck-code-review/references/verification-before-completion.md +111 -58
- package/skills/ck-databases/SKILL.md +231 -0
- package/skills/ck-databases/references/mongodb-aggregation.md +447 -0
- package/skills/ck-databases/references/mongodb-atlas.md +465 -0
- package/skills/ck-databases/references/mongodb-crud.md +408 -0
- package/skills/ck-databases/references/mongodb-indexing.md +442 -0
- package/skills/ck-databases/references/postgresql-administration.md +594 -0
- package/skills/ck-databases/references/postgresql-performance.md +527 -0
- package/skills/ck-databases/references/postgresql-psql-cli.md +467 -0
- package/skills/ck-databases/references/postgresql-queries.md +475 -0
- package/skills/ck-databases/scripts/.coverage +0 -0
- package/skills/ck-databases/scripts/db_backup.py +502 -0
- package/skills/ck-databases/scripts/db_migrate.py +425 -0
- package/skills/ck-databases/scripts/db_performance_check.py +456 -0
- package/skills/ck-databases/scripts/requirements.txt +20 -0
- package/skills/ck-databases/scripts/tests/coverage-db.json +1 -0
- package/skills/ck-databases/scripts/tests/requirements.txt +4 -0
- package/skills/ck-databases/scripts/tests/test_db_backup.py +340 -0
- package/skills/ck-databases/scripts/tests/test_db_migrate.py +277 -0
- package/skills/ck-databases/scripts/tests/test_db_performance_check.py +370 -0
- package/skills/ck-debugging/SKILL.md +55 -43
- package/skills/ck-debugging/references/defense-in-depth.md +124 -0
- package/skills/ck-debugging/references/root-cause-tracing.md +100 -43
- package/skills/ck-debugging/references/systematic-debugging.md +80 -52
- package/skills/ck-debugging/references/verification.md +101 -52
- package/skills/ck-debugging/scripts/find-polluter.sh +63 -0
- package/skills/ck-debugging/scripts/find-polluter.test.md +102 -0
- package/skills/ck-devops/.env.example +76 -0
- package/skills/ck-devops/SKILL.md +283 -0
- package/skills/ck-devops/references/browser-rendering.md +305 -0
- package/skills/ck-devops/references/cloudflare-d1-kv.md +123 -0
- package/skills/ck-devops/references/cloudflare-platform.md +271 -0
- package/skills/ck-devops/references/cloudflare-r2-storage.md +280 -0
- package/skills/ck-devops/references/cloudflare-workers-advanced.md +312 -0
- package/skills/ck-devops/references/cloudflare-workers-apis.md +309 -0
- package/skills/ck-devops/references/cloudflare-workers-basics.md +418 -0
- package/skills/ck-devops/references/docker-basics.md +297 -0
- package/skills/ck-devops/references/docker-compose.md +292 -0
- package/skills/ck-devops/references/gcloud-platform.md +297 -0
- package/skills/ck-devops/references/gcloud-services.md +304 -0
- package/skills/ck-devops/scripts/cloudflare_deploy.py +269 -0
- package/skills/ck-devops/scripts/docker_optimize.py +331 -0
- package/skills/ck-devops/scripts/requirements.txt +20 -0
- package/skills/ck-devops/scripts/tests/requirements.txt +3 -0
- package/skills/ck-devops/scripts/tests/test_cloudflare_deploy.py +285 -0
- package/skills/ck-devops/scripts/tests/test_docker_optimize.py +436 -0
- package/skills/ck-docs-seeker/.env.example +15 -0
- package/skills/ck-docs-seeker/SKILL.md +70 -65
- package/skills/ck-docs-seeker/package.json +25 -0
- package/skills/ck-docs-seeker/references/advanced.md +79 -0
- package/skills/ck-docs-seeker/references/context7-patterns.md +68 -0
- package/skills/ck-docs-seeker/references/errors.md +68 -0
- package/skills/ck-docs-seeker/scripts/analyze-llms-txt.js +211 -0
- package/skills/ck-docs-seeker/scripts/detect-topic.js +172 -0
- package/skills/ck-docs-seeker/scripts/fetch-docs.js +213 -0
- package/skills/ck-docs-seeker/scripts/tests/run-tests.js +72 -0
- package/skills/ck-docs-seeker/scripts/tests/test-analyze-llms.js +119 -0
- package/skills/ck-docs-seeker/scripts/tests/test-detect-topic.js +112 -0
- package/skills/ck-docs-seeker/scripts/tests/test-fetch-docs.js +84 -0
- package/skills/ck-docs-seeker/scripts/utils/env-loader.js +94 -0
- package/skills/ck-docs-seeker/workflows/library-search.md +87 -0
- package/skills/ck-docs-seeker/workflows/repo-analysis.md +91 -0
- package/skills/ck-docs-seeker/workflows/topic-search.md +77 -0
- package/skills/ck-frontend-design/SKILL.md +79 -0
- package/skills/ck-frontend-design/references/analysis-best-practices.md +80 -0
- package/skills/ck-frontend-design/references/analysis-prompts.md +141 -0
- package/skills/ck-frontend-design/references/analysis-techniques.md +118 -0
- package/skills/ck-frontend-design/references/animejs.md +396 -0
- package/skills/ck-frontend-design/references/design-extraction-overview.md +71 -0
- package/skills/ck-frontend-design/references/extraction-best-practices.md +141 -0
- package/skills/ck-frontend-design/references/extraction-output-templates.md +162 -0
- package/skills/ck-frontend-design/references/extraction-prompts.md +127 -0
- package/skills/ck-frontend-design/references/technical-accessibility.md +119 -0
- package/skills/ck-frontend-design/references/technical-best-practices.md +97 -0
- package/skills/ck-frontend-design/references/technical-optimization.md +44 -0
- package/skills/ck-frontend-design/references/technical-overview.md +90 -0
- package/skills/ck-frontend-design/references/technical-workflows.md +150 -0
- package/skills/ck-frontend-design/references/visual-analysis-overview.md +95 -0
- package/skills/ck-frontend-development/SKILL.md +399 -0
- package/skills/ck-frontend-development/resources/common-patterns.md +331 -0
- package/skills/ck-frontend-development/resources/complete-examples.md +872 -0
- package/skills/ck-frontend-development/resources/component-patterns.md +502 -0
- package/skills/ck-frontend-development/resources/data-fetching.md +767 -0
- package/skills/ck-frontend-development/resources/file-organization.md +502 -0
- package/skills/ck-frontend-development/resources/loading-and-error-states.md +501 -0
- package/skills/ck-frontend-development/resources/performance.md +406 -0
- package/skills/ck-frontend-development/resources/routing-guide.md +364 -0
- package/skills/ck-frontend-development/resources/styling-guide.md +428 -0
- package/skills/ck-frontend-development/resources/typescript-standards.md +418 -0
- package/skills/ck-markdown-novel-viewer/SKILL.md +190 -0
- package/skills/ck-markdown-novel-viewer/assets/directory-browser.css +215 -0
- package/skills/ck-markdown-novel-viewer/assets/favicon.png +0 -0
- package/skills/ck-markdown-novel-viewer/assets/novel-theme.css +818 -0
- package/skills/ck-markdown-novel-viewer/assets/reader.js +262 -0
- package/skills/ck-markdown-novel-viewer/assets/template.html +80 -0
- package/skills/ck-markdown-novel-viewer/package.json +15 -0
- package/skills/ck-markdown-novel-viewer/scripts/lib/http-server.cjs +434 -0
- package/skills/ck-markdown-novel-viewer/scripts/lib/markdown-renderer.cjs +272 -0
- package/skills/ck-markdown-novel-viewer/scripts/lib/plan-navigator.cjs +509 -0
- package/skills/ck-markdown-novel-viewer/scripts/lib/port-finder.cjs +48 -0
- package/skills/ck-markdown-novel-viewer/scripts/lib/process-mgr.cjs +150 -0
- package/skills/ck-markdown-novel-viewer/scripts/server.cjs +411 -0
- package/skills/ck-markdown-novel-viewer/scripts/tests/server.test.cjs +283 -0
- package/skills/ck-markdown-novel-viewer/tests/dashboard-assets.test.cjs +340 -0
- package/skills/ck-markdown-novel-viewer/tests/dashboard-renderer.test.cjs +404 -0
- package/skills/ck-markdown-novel-viewer/tests/http-server.test.cjs +271 -0
- package/skills/ck-markdown-novel-viewer/tests/run-tests.cjs +51 -0
- package/skills/ck-markdown-novel-viewer/tests/test-framework.cjs +154 -0
- package/skills/ck-markdown-novel-viewer/tests/verify-xss.cjs +90 -0
- package/skills/ck-mcp-builder/LICENSE.txt +202 -0
- package/skills/ck-mcp-builder/SKILL.md +327 -0
- package/skills/ck-mcp-builder/reference/evaluation.md +602 -0
- package/skills/ck-mcp-builder/reference/mcp_best_practices.md +915 -0
- package/skills/ck-mcp-builder/reference/node_mcp_server.md +916 -0
- package/skills/ck-mcp-builder/reference/python_mcp_server.md +752 -0
- package/skills/ck-mcp-builder/scripts/connections.py +151 -0
- package/skills/ck-mcp-builder/scripts/evaluation.py +373 -0
- package/skills/ck-mcp-builder/scripts/example_evaluation.xml +22 -0
- package/skills/ck-mcp-builder/scripts/requirements.txt +2 -0
- package/skills/ck-mcp-management/README.md +219 -0
- package/skills/ck-mcp-management/SKILL.md +209 -0
- package/skills/ck-mcp-management/assets/tools.json +3146 -0
- package/skills/ck-mcp-management/references/configuration.md +114 -0
- package/skills/ck-mcp-management/references/gemini-cli-integration.md +215 -0
- package/skills/ck-mcp-management/references/mcp-protocol.md +116 -0
- package/skills/ck-mcp-management/scripts/.env.example +10 -0
- package/skills/ck-mcp-management/scripts/cli.ts +195 -0
- package/skills/ck-mcp-management/scripts/dist/analyze-tools.js +70 -0
- package/skills/ck-mcp-management/scripts/dist/cli.js +160 -0
- package/skills/ck-mcp-management/scripts/dist/mcp-client.js +183 -0
- package/skills/ck-mcp-management/scripts/mcp-client.ts +230 -0
- package/skills/ck-mcp-management/scripts/package.json +20 -0
- package/skills/ck-mcp-management/scripts/tsconfig.json +15 -0
- package/skills/ck-media-processing/SKILL.md +90 -0
- package/skills/ck-media-processing/references/common-workflows.md +132 -0
- package/skills/ck-media-processing/references/ffmpeg-encoding.md +358 -0
- package/skills/ck-media-processing/references/ffmpeg-filters.md +503 -0
- package/skills/ck-media-processing/references/ffmpeg-streaming.md +403 -0
- package/skills/ck-media-processing/references/format-compatibility.md +375 -0
- package/skills/ck-media-processing/references/imagemagick-batch.md +612 -0
- package/skills/ck-media-processing/references/imagemagick-editing.md +623 -0
- package/skills/ck-media-processing/references/rmbg-background-removal.md +66 -0
- package/skills/ck-media-processing/references/troubleshooting.md +109 -0
- package/skills/ck-media-processing/scripts/README.md +111 -0
- package/skills/ck-media-processing/scripts/batch-remove-background.sh +124 -0
- package/skills/ck-media-processing/scripts/batch_resize.py +342 -0
- package/skills/ck-media-processing/scripts/media_convert.py +311 -0
- package/skills/ck-media-processing/scripts/remove-background.sh +96 -0
- package/skills/ck-media-processing/scripts/remove-bg-node.js +158 -0
- package/skills/ck-media-processing/scripts/requirements.txt +24 -0
- package/skills/ck-media-processing/scripts/tests/.coverage +0 -0
- package/skills/ck-media-processing/scripts/tests/requirements.txt +2 -0
- package/skills/ck-media-processing/scripts/tests/test_batch_resize.py +372 -0
- package/skills/ck-media-processing/scripts/tests/test_media_convert.py +259 -0
- package/skills/ck-media-processing/scripts/tests/test_video_optimize.py +397 -0
- package/skills/ck-media-processing/scripts/video_optimize.py +414 -0
- package/skills/ck-mobile-development/SKILL.md +210 -0
- package/skills/ck-mobile-development/references/mobile-android.md +604 -0
- package/skills/ck-mobile-development/references/mobile-best-practices.md +545 -0
- package/skills/ck-mobile-development/references/mobile-debugging.md +1089 -0
- package/skills/ck-mobile-development/references/mobile-frameworks.md +465 -0
- package/skills/ck-mobile-development/references/mobile-ios.md +496 -0
- package/skills/ck-mobile-development/references/mobile-mindset.md +544 -0
- package/skills/ck-payment-integration/README.md +185 -0
- package/skills/ck-payment-integration/SKILL.md +116 -0
- package/skills/ck-payment-integration/references/polar/benefits.md +396 -0
- package/skills/ck-payment-integration/references/polar/best-practices.md +482 -0
- package/skills/ck-payment-integration/references/polar/checkouts.md +266 -0
- package/skills/ck-payment-integration/references/polar/overview.md +184 -0
- package/skills/ck-payment-integration/references/polar/products.md +244 -0
- package/skills/ck-payment-integration/references/polar/sdk.md +436 -0
- package/skills/ck-payment-integration/references/polar/subscriptions.md +340 -0
- package/skills/ck-payment-integration/references/polar/webhooks.md +405 -0
- package/skills/ck-payment-integration/references/sepay/api.md +140 -0
- package/skills/ck-payment-integration/references/sepay/best-practices.md +337 -0
- package/skills/ck-payment-integration/references/sepay/overview.md +138 -0
- package/skills/ck-payment-integration/references/sepay/qr-codes.md +228 -0
- package/skills/ck-payment-integration/references/sepay/sdk.md +213 -0
- package/skills/ck-payment-integration/references/sepay/webhooks.md +208 -0
- package/skills/ck-payment-integration/scripts/.env.example +20 -0
- package/skills/ck-payment-integration/scripts/checkout-helper.js +244 -0
- package/skills/ck-payment-integration/scripts/package.json +17 -0
- package/skills/ck-payment-integration/scripts/polar-webhook-verify.js +202 -0
- package/skills/ck-payment-integration/scripts/sepay-webhook-verify.js +193 -0
- package/skills/ck-payment-integration/scripts/test-scripts.js +237 -0
- package/skills/ck-planning/SKILL.md +79 -49
- package/skills/ck-planning/references/codebase-understanding.md +62 -0
- package/skills/ck-planning/references/output-standards.md +127 -0
- package/skills/ck-planning/references/plan-organization.md +122 -60
- package/skills/ck-planning/references/research-phase.md +49 -56
- package/skills/ck-planning/references/solution-design.md +61 -63
- package/skills/ck-problem-solving/SKILL.md +95 -0
- package/skills/ck-problem-solving/references/attribution.md +69 -0
- package/skills/ck-problem-solving/references/collision-zone-thinking.md +79 -0
- package/skills/ck-problem-solving/references/inversion-exercise.md +91 -0
- package/skills/ck-problem-solving/references/meta-pattern-recognition.md +87 -0
- package/skills/ck-problem-solving/references/scale-game.md +95 -0
- package/skills/ck-problem-solving/references/simplification-cascades.md +80 -0
- package/skills/ck-problem-solving/references/when-stuck.md +72 -0
- package/skills/ck-repomix/SKILL.md +247 -0
- package/skills/ck-repomix/references/configuration.md +211 -0
- package/skills/ck-repomix/references/usage-patterns.md +232 -0
- package/skills/ck-repomix/scripts/.coverage +0 -0
- package/skills/ck-repomix/scripts/README.md +179 -0
- package/skills/ck-repomix/scripts/repomix_batch.py +455 -0
- package/skills/ck-repomix/scripts/repos.example.json +15 -0
- package/skills/ck-repomix/scripts/requirements.txt +15 -0
- package/skills/ck-repomix/scripts/tests/test_repomix_batch.py +531 -0
- package/skills/ck-sequential-thinking/.env.example +8 -0
- package/skills/ck-sequential-thinking/README.md +183 -0
- package/skills/ck-sequential-thinking/SKILL.md +14 -2
- package/skills/ck-sequential-thinking/package.json +31 -0
- package/skills/ck-sequential-thinking/references/advanced-strategies.md +79 -0
- package/skills/ck-sequential-thinking/references/advanced-techniques.md +2 -14
- package/skills/ck-sequential-thinking/references/core-patterns.md +8 -0
- package/skills/ck-sequential-thinking/references/examples-api.md +88 -0
- package/skills/ck-sequential-thinking/references/examples-architecture.md +94 -0
- package/skills/ck-sequential-thinking/references/examples-debug.md +90 -0
- package/skills/ck-sequential-thinking/scripts/format-thought.js +159 -0
- package/skills/ck-sequential-thinking/scripts/process-thought.js +236 -0
- package/skills/ck-sequential-thinking/tests/format-thought.test.js +133 -0
- package/skills/ck-sequential-thinking/tests/process-thought.test.js +215 -0
- package/skills/ck-shopify/README.md +66 -0
- package/skills/ck-shopify/SKILL.md +319 -0
- package/skills/ck-shopify/references/app-development.md +470 -0
- package/skills/ck-shopify/references/extensions.md +493 -0
- package/skills/ck-shopify/references/themes.md +498 -0
- package/skills/ck-shopify/scripts/.coverage +0 -0
- package/skills/ck-shopify/scripts/requirements.txt +19 -0
- package/skills/ck-shopify/scripts/shopify_init.py +423 -0
- package/skills/ck-shopify/scripts/tests/.coverage +0 -0
- package/skills/ck-shopify/scripts/tests/test_shopify_init.py +385 -0
- package/skills/ck-skill-creator/LICENSE.txt +202 -0
- package/skills/ck-skill-creator/SKILL.md +265 -0
- package/skills/ck-skill-creator/scripts/init_skill.py +303 -0
- package/skills/ck-skill-creator/scripts/package_skill.py +110 -0
- package/skills/ck-skill-creator/scripts/quick_validate.py +65 -0
- package/skills/ck-threejs/SKILL.md +87 -0
- package/skills/ck-threejs/references/01-getting-started.md +177 -0
- package/skills/ck-threejs/references/02-loaders.md +169 -0
- package/skills/ck-threejs/references/03-textures.md +170 -0
- package/skills/ck-threejs/references/04-cameras.md +195 -0
- package/skills/ck-threejs/references/05-lights.md +183 -0
- package/skills/ck-threejs/references/06-animations.md +214 -0
- package/skills/ck-threejs/references/07-math.md +260 -0
- package/skills/ck-threejs/references/08-interaction.md +267 -0
- package/skills/ck-threejs/references/09-postprocessing.md +240 -0
- package/skills/ck-threejs/references/10-controls.md +259 -0
- package/skills/ck-threejs/references/11-materials-advanced.md +270 -0
- package/skills/ck-threejs/references/12-performance.md +269 -0
- package/skills/ck-threejs/references/13-node-materials.md +298 -0
- package/skills/ck-threejs/references/14-physics-vr.md +304 -0
- package/skills/ck-threejs/references/15-specialized-loaders.md +333 -0
- package/skills/ck-threejs/references/16-webgpu.md +302 -0
- package/skills/ck-ui-styling/LICENSE.txt +202 -0
- package/skills/ck-ui-styling/SKILL.md +319 -0
- package/skills/ck-ui-styling/canvas-fonts/ArsenalSC-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/BigShoulders-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Boldonse-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/CrimsonPro-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/DMMono-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/EricaOne-OFL.txt +94 -0
- package/skills/ck-ui-styling/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/GeistMono-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Gloock-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/InstrumentSans-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Italiana-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Jura-Light.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Jura-Medium.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Jura-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Lora-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Lora-Italic.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Lora-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/Lora-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/NationalPark-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Outfit-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/PixelifySans-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/PoiretOne-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/RedHatMono-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Silkscreen-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/SmoochSans-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Tektur-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/WorkSans-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/YoungSerif-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/YoungSerif-Regular.ttf +0 -0
- package/skills/ck-ui-styling/references/canvas-design-system.md +320 -0
- package/skills/ck-ui-styling/references/shadcn-accessibility.md +471 -0
- package/skills/ck-ui-styling/references/shadcn-components.md +424 -0
- package/skills/ck-ui-styling/references/shadcn-theming.md +373 -0
- package/skills/ck-ui-styling/references/tailwind-customization.md +483 -0
- package/skills/ck-ui-styling/references/tailwind-responsive.md +382 -0
- package/skills/ck-ui-styling/references/tailwind-utilities.md +455 -0
- package/skills/ck-ui-styling/scripts/.coverage +0 -0
- package/skills/ck-ui-styling/scripts/requirements.txt +17 -0
- package/skills/ck-ui-styling/scripts/shadcn_add.py +292 -0
- package/skills/ck-ui-styling/scripts/tailwind_config_gen.py +456 -0
- package/skills/ck-ui-styling/scripts/tests/coverage-ui.json +1 -0
- package/skills/ck-ui-styling/scripts/tests/requirements.txt +3 -0
- package/skills/ck-ui-styling/scripts/tests/test_shadcn_add.py +266 -0
- package/skills/ck-ui-styling/scripts/tests/test_tailwind_config_gen.py +336 -0
- package/skills/ck-ui-ux-pro-max/SKILL.md +227 -0
- package/skills/ck-ui-ux-pro-max/data/charts.csv +26 -0
- package/skills/ck-ui-ux-pro-max/data/colors.csv +97 -0
- package/skills/ck-ui-ux-pro-max/data/landing.csv +31 -0
- package/skills/ck-ui-ux-pro-max/data/products.csv +97 -0
- package/skills/ck-ui-ux-pro-max/data/prompts.csv +24 -0
- package/skills/ck-ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/skills/ck-ui-ux-pro-max/data/stacks/html-tailwind.csv +51 -0
- package/skills/ck-ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/skills/ck-ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/skills/ck-ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/skills/ck-ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/skills/ck-ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/skills/ck-ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/skills/ck-ui-ux-pro-max/data/styles.csv +59 -0
- package/skills/ck-ui-ux-pro-max/data/typography.csv +58 -0
- package/skills/ck-ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/skills/ck-ui-ux-pro-max/scripts/core.py +236 -0
- package/skills/ck-ui-ux-pro-max/scripts/search.py +76 -0
- package/skills/ck-web-frameworks/SKILL.md +322 -0
- package/skills/ck-web-frameworks/references/nextjs-app-router.md +465 -0
- package/skills/ck-web-frameworks/references/nextjs-data-fetching.md +459 -0
- package/skills/ck-web-frameworks/references/nextjs-optimization.md +511 -0
- package/skills/ck-web-frameworks/references/nextjs-server-components.md +495 -0
- package/skills/ck-web-frameworks/references/remix-icon-integration.md +603 -0
- package/skills/ck-web-frameworks/references/turborepo-caching.md +551 -0
- package/skills/ck-web-frameworks/references/turborepo-pipelines.md +517 -0
- package/skills/ck-web-frameworks/references/turborepo-setup.md +542 -0
- package/skills/ck-web-frameworks/scripts/.coverage +0 -0
- package/skills/ck-web-frameworks/scripts/__init__.py +0 -0
- package/skills/ck-web-frameworks/scripts/nextjs_init.py +547 -0
- package/skills/ck-web-frameworks/scripts/requirements.txt +16 -0
- package/skills/ck-web-frameworks/scripts/tests/coverage-web.json +1 -0
- package/skills/ck-web-frameworks/scripts/tests/requirements.txt +3 -0
- package/skills/ck-web-frameworks/scripts/tests/test_nextjs_init.py +319 -0
- package/skills/ck-web-frameworks/scripts/tests/test_turborepo_migrate.py +374 -0
- package/skills/ck-web-frameworks/scripts/turborepo_migrate.py +394 -0
- package/src/commands/init.js +61 -30
- package/src/utils/paths.js +35 -4
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
"""Tests for shadcn_add.py"""
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
import subprocess
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from unittest.mock import MagicMock, mock_open, patch
|
|
7
|
+
|
|
8
|
+
import pytest
|
|
9
|
+
|
|
10
|
+
# Add parent directory to path for imports
|
|
11
|
+
import sys
|
|
12
|
+
sys.path.insert(0, str(Path(__file__).parent.parent))
|
|
13
|
+
|
|
14
|
+
from shadcn_add import ShadcnInstaller
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class TestShadcnInstaller:
|
|
18
|
+
"""Test ShadcnInstaller class."""
|
|
19
|
+
|
|
20
|
+
@pytest.fixture
|
|
21
|
+
def temp_project(self, tmp_path):
|
|
22
|
+
"""Create temporary project structure."""
|
|
23
|
+
project_root = tmp_path / "test-project"
|
|
24
|
+
project_root.mkdir()
|
|
25
|
+
|
|
26
|
+
# Create components.json
|
|
27
|
+
components_json = project_root / "components.json"
|
|
28
|
+
components_json.write_text(
|
|
29
|
+
json.dumps({
|
|
30
|
+
"style": "new-york",
|
|
31
|
+
"aliases": {
|
|
32
|
+
"components": "@/components",
|
|
33
|
+
"utils": "@/lib/utils"
|
|
34
|
+
}
|
|
35
|
+
})
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
# Create components directory
|
|
39
|
+
ui_dir = project_root / "components" / "ui"
|
|
40
|
+
ui_dir.mkdir(parents=True)
|
|
41
|
+
|
|
42
|
+
return project_root
|
|
43
|
+
|
|
44
|
+
def test_init_default_project_root(self):
|
|
45
|
+
"""Test initialization with default project root."""
|
|
46
|
+
installer = ShadcnInstaller()
|
|
47
|
+
assert installer.project_root == Path.cwd()
|
|
48
|
+
assert installer.dry_run is False
|
|
49
|
+
|
|
50
|
+
def test_init_custom_project_root(self, tmp_path):
|
|
51
|
+
"""Test initialization with custom project root."""
|
|
52
|
+
installer = ShadcnInstaller(project_root=tmp_path)
|
|
53
|
+
assert installer.project_root == tmp_path
|
|
54
|
+
|
|
55
|
+
def test_init_dry_run(self):
|
|
56
|
+
"""Test initialization with dry run mode."""
|
|
57
|
+
installer = ShadcnInstaller(dry_run=True)
|
|
58
|
+
assert installer.dry_run is True
|
|
59
|
+
|
|
60
|
+
def test_check_shadcn_config_exists(self, temp_project):
|
|
61
|
+
"""Test checking for existing shadcn config."""
|
|
62
|
+
installer = ShadcnInstaller(project_root=temp_project)
|
|
63
|
+
assert installer.check_shadcn_config() is True
|
|
64
|
+
|
|
65
|
+
def test_check_shadcn_config_not_exists(self, tmp_path):
|
|
66
|
+
"""Test checking for non-existent shadcn config."""
|
|
67
|
+
installer = ShadcnInstaller(project_root=tmp_path)
|
|
68
|
+
assert installer.check_shadcn_config() is False
|
|
69
|
+
|
|
70
|
+
def test_get_installed_components_empty(self, temp_project):
|
|
71
|
+
"""Test getting installed components when none exist."""
|
|
72
|
+
installer = ShadcnInstaller(project_root=temp_project)
|
|
73
|
+
installed = installer.get_installed_components()
|
|
74
|
+
assert installed == []
|
|
75
|
+
|
|
76
|
+
def test_get_installed_components_with_files(self, temp_project):
|
|
77
|
+
"""Test getting installed components when files exist."""
|
|
78
|
+
ui_dir = temp_project / "components" / "ui"
|
|
79
|
+
|
|
80
|
+
# Create component files
|
|
81
|
+
(ui_dir / "button.tsx").write_text("export const Button = () => {}")
|
|
82
|
+
(ui_dir / "card.tsx").write_text("export const Card = () => {}")
|
|
83
|
+
|
|
84
|
+
installer = ShadcnInstaller(project_root=temp_project)
|
|
85
|
+
installed = installer.get_installed_components()
|
|
86
|
+
|
|
87
|
+
assert sorted(installed) == ["button", "card"]
|
|
88
|
+
|
|
89
|
+
def test_get_installed_components_no_config(self, tmp_path):
|
|
90
|
+
"""Test getting installed components without config."""
|
|
91
|
+
installer = ShadcnInstaller(project_root=tmp_path)
|
|
92
|
+
installed = installer.get_installed_components()
|
|
93
|
+
assert installed == []
|
|
94
|
+
|
|
95
|
+
def test_add_components_no_components(self, temp_project):
|
|
96
|
+
"""Test adding components with empty list."""
|
|
97
|
+
installer = ShadcnInstaller(project_root=temp_project)
|
|
98
|
+
success, message = installer.add_components([])
|
|
99
|
+
|
|
100
|
+
assert success is False
|
|
101
|
+
assert "No components specified" in message
|
|
102
|
+
|
|
103
|
+
def test_add_components_no_config(self, tmp_path):
|
|
104
|
+
"""Test adding components without shadcn config."""
|
|
105
|
+
installer = ShadcnInstaller(project_root=tmp_path)
|
|
106
|
+
success, message = installer.add_components(["button"])
|
|
107
|
+
|
|
108
|
+
assert success is False
|
|
109
|
+
assert "not initialized" in message
|
|
110
|
+
|
|
111
|
+
def test_add_components_already_installed(self, temp_project):
|
|
112
|
+
"""Test adding components that are already installed."""
|
|
113
|
+
ui_dir = temp_project / "components" / "ui"
|
|
114
|
+
(ui_dir / "button.tsx").write_text("export const Button = () => {}")
|
|
115
|
+
|
|
116
|
+
installer = ShadcnInstaller(project_root=temp_project)
|
|
117
|
+
success, message = installer.add_components(["button"])
|
|
118
|
+
|
|
119
|
+
assert success is False
|
|
120
|
+
assert "already installed" in message
|
|
121
|
+
assert "button" in message
|
|
122
|
+
|
|
123
|
+
def test_add_components_with_overwrite(self, temp_project):
|
|
124
|
+
"""Test adding components with overwrite flag."""
|
|
125
|
+
ui_dir = temp_project / "components" / "ui"
|
|
126
|
+
(ui_dir / "button.tsx").write_text("export const Button = () => {}")
|
|
127
|
+
|
|
128
|
+
installer = ShadcnInstaller(project_root=temp_project)
|
|
129
|
+
|
|
130
|
+
with patch("subprocess.run") as mock_run:
|
|
131
|
+
mock_run.return_value = MagicMock(
|
|
132
|
+
stdout="Component added successfully",
|
|
133
|
+
returncode=0
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
success, message = installer.add_components(["button"], overwrite=True)
|
|
137
|
+
|
|
138
|
+
assert success is True
|
|
139
|
+
assert "Successfully added" in message
|
|
140
|
+
mock_run.assert_called_once()
|
|
141
|
+
|
|
142
|
+
# Verify --overwrite flag was passed
|
|
143
|
+
call_args = mock_run.call_args[0][0]
|
|
144
|
+
assert "--overwrite" in call_args
|
|
145
|
+
|
|
146
|
+
def test_add_components_dry_run(self, temp_project):
|
|
147
|
+
"""Test adding components in dry run mode."""
|
|
148
|
+
installer = ShadcnInstaller(project_root=temp_project, dry_run=True)
|
|
149
|
+
success, message = installer.add_components(["button", "card"])
|
|
150
|
+
|
|
151
|
+
assert success is True
|
|
152
|
+
assert "Would run:" in message
|
|
153
|
+
assert "button" in message
|
|
154
|
+
assert "card" in message
|
|
155
|
+
|
|
156
|
+
@patch("subprocess.run")
|
|
157
|
+
def test_add_components_success(self, mock_run, temp_project):
|
|
158
|
+
"""Test successful component addition."""
|
|
159
|
+
mock_run.return_value = MagicMock(
|
|
160
|
+
stdout="Components added successfully",
|
|
161
|
+
stderr="",
|
|
162
|
+
returncode=0
|
|
163
|
+
)
|
|
164
|
+
|
|
165
|
+
installer = ShadcnInstaller(project_root=temp_project)
|
|
166
|
+
success, message = installer.add_components(["button", "card"])
|
|
167
|
+
|
|
168
|
+
assert success is True
|
|
169
|
+
assert "Successfully added" in message
|
|
170
|
+
assert "button" in message
|
|
171
|
+
assert "card" in message
|
|
172
|
+
|
|
173
|
+
# Verify correct command was called
|
|
174
|
+
mock_run.assert_called_once()
|
|
175
|
+
call_args = mock_run.call_args[0][0]
|
|
176
|
+
assert call_args[:3] == ["npx", "shadcn@latest", "add"]
|
|
177
|
+
assert "button" in call_args
|
|
178
|
+
assert "card" in call_args
|
|
179
|
+
|
|
180
|
+
@patch("subprocess.run")
|
|
181
|
+
def test_add_components_subprocess_error(self, mock_run, temp_project):
|
|
182
|
+
"""Test component addition with subprocess error."""
|
|
183
|
+
mock_run.side_effect = subprocess.CalledProcessError(
|
|
184
|
+
1, "cmd", stderr="Error occurred"
|
|
185
|
+
)
|
|
186
|
+
|
|
187
|
+
installer = ShadcnInstaller(project_root=temp_project)
|
|
188
|
+
success, message = installer.add_components(["button"])
|
|
189
|
+
|
|
190
|
+
assert success is False
|
|
191
|
+
assert "Failed to add" in message
|
|
192
|
+
|
|
193
|
+
@patch("subprocess.run")
|
|
194
|
+
def test_add_components_npx_not_found(self, mock_run, temp_project):
|
|
195
|
+
"""Test component addition when npx is not found."""
|
|
196
|
+
mock_run.side_effect = FileNotFoundError()
|
|
197
|
+
|
|
198
|
+
installer = ShadcnInstaller(project_root=temp_project)
|
|
199
|
+
success, message = installer.add_components(["button"])
|
|
200
|
+
|
|
201
|
+
assert success is False
|
|
202
|
+
assert "npx not found" in message
|
|
203
|
+
|
|
204
|
+
def test_add_all_components_no_config(self, tmp_path):
|
|
205
|
+
"""Test adding all components without config."""
|
|
206
|
+
installer = ShadcnInstaller(project_root=tmp_path)
|
|
207
|
+
success, message = installer.add_all_components()
|
|
208
|
+
|
|
209
|
+
assert success is False
|
|
210
|
+
assert "not initialized" in message
|
|
211
|
+
|
|
212
|
+
def test_add_all_components_dry_run(self, temp_project):
|
|
213
|
+
"""Test adding all components in dry run mode."""
|
|
214
|
+
installer = ShadcnInstaller(project_root=temp_project, dry_run=True)
|
|
215
|
+
success, message = installer.add_all_components()
|
|
216
|
+
|
|
217
|
+
assert success is True
|
|
218
|
+
assert "Would run:" in message
|
|
219
|
+
assert "--all" in message
|
|
220
|
+
|
|
221
|
+
@patch("subprocess.run")
|
|
222
|
+
def test_add_all_components_success(self, mock_run, temp_project):
|
|
223
|
+
"""Test successful addition of all components."""
|
|
224
|
+
mock_run.return_value = MagicMock(
|
|
225
|
+
stdout="All components added",
|
|
226
|
+
returncode=0
|
|
227
|
+
)
|
|
228
|
+
|
|
229
|
+
installer = ShadcnInstaller(project_root=temp_project)
|
|
230
|
+
success, message = installer.add_all_components()
|
|
231
|
+
|
|
232
|
+
assert success is True
|
|
233
|
+
assert "Successfully added all" in message
|
|
234
|
+
|
|
235
|
+
# Verify --all flag was passed
|
|
236
|
+
call_args = mock_run.call_args[0][0]
|
|
237
|
+
assert "--all" in call_args
|
|
238
|
+
|
|
239
|
+
def test_list_installed_no_config(self, tmp_path):
|
|
240
|
+
"""Test listing installed components without config."""
|
|
241
|
+
installer = ShadcnInstaller(project_root=tmp_path)
|
|
242
|
+
success, message = installer.list_installed()
|
|
243
|
+
|
|
244
|
+
assert success is False
|
|
245
|
+
assert "not initialized" in message
|
|
246
|
+
|
|
247
|
+
def test_list_installed_empty(self, temp_project):
|
|
248
|
+
"""Test listing installed components when none exist."""
|
|
249
|
+
installer = ShadcnInstaller(project_root=temp_project)
|
|
250
|
+
success, message = installer.list_installed()
|
|
251
|
+
|
|
252
|
+
assert success is True
|
|
253
|
+
assert "No components installed" in message
|
|
254
|
+
|
|
255
|
+
def test_list_installed_with_components(self, temp_project):
|
|
256
|
+
"""Test listing installed components when they exist."""
|
|
257
|
+
ui_dir = temp_project / "components" / "ui"
|
|
258
|
+
(ui_dir / "button.tsx").write_text("export const Button = () => {}")
|
|
259
|
+
(ui_dir / "card.tsx").write_text("export const Card = () => {}")
|
|
260
|
+
|
|
261
|
+
installer = ShadcnInstaller(project_root=temp_project)
|
|
262
|
+
success, message = installer.list_installed()
|
|
263
|
+
|
|
264
|
+
assert success is True
|
|
265
|
+
assert "button" in message
|
|
266
|
+
assert "card" in message
|
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
"""Tests for tailwind_config_gen.py"""
|
|
2
|
+
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
|
|
5
|
+
import pytest
|
|
6
|
+
|
|
7
|
+
# Add parent directory to path for imports
|
|
8
|
+
import sys
|
|
9
|
+
sys.path.insert(0, str(Path(__file__).parent.parent))
|
|
10
|
+
|
|
11
|
+
from tailwind_config_gen import TailwindConfigGenerator
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class TestTailwindConfigGenerator:
|
|
15
|
+
"""Test TailwindConfigGenerator class."""
|
|
16
|
+
|
|
17
|
+
def test_init_default_typescript(self):
|
|
18
|
+
"""Test initialization with default settings."""
|
|
19
|
+
generator = TailwindConfigGenerator()
|
|
20
|
+
assert generator.typescript is True
|
|
21
|
+
assert generator.framework == "react"
|
|
22
|
+
|
|
23
|
+
def test_init_javascript(self):
|
|
24
|
+
"""Test initialization for JavaScript config."""
|
|
25
|
+
generator = TailwindConfigGenerator(typescript=False)
|
|
26
|
+
assert generator.typescript is False
|
|
27
|
+
|
|
28
|
+
def test_init_framework(self):
|
|
29
|
+
"""Test initialization with different frameworks."""
|
|
30
|
+
for framework in ["react", "vue", "svelte", "nextjs"]:
|
|
31
|
+
generator = TailwindConfigGenerator(framework=framework)
|
|
32
|
+
assert generator.framework == framework
|
|
33
|
+
|
|
34
|
+
def test_default_output_path_typescript(self):
|
|
35
|
+
"""Test default output path for TypeScript."""
|
|
36
|
+
generator = TailwindConfigGenerator(typescript=True)
|
|
37
|
+
assert generator.output_path.name == "tailwind.config.ts"
|
|
38
|
+
|
|
39
|
+
def test_default_output_path_javascript(self):
|
|
40
|
+
"""Test default output path for JavaScript."""
|
|
41
|
+
generator = TailwindConfigGenerator(typescript=False)
|
|
42
|
+
assert generator.output_path.name == "tailwind.config.js"
|
|
43
|
+
|
|
44
|
+
def test_custom_output_path(self, tmp_path):
|
|
45
|
+
"""Test custom output path."""
|
|
46
|
+
custom_path = tmp_path / "custom-config.ts"
|
|
47
|
+
generator = TailwindConfigGenerator(output_path=custom_path)
|
|
48
|
+
assert generator.output_path == custom_path
|
|
49
|
+
|
|
50
|
+
def test_base_config_structure(self):
|
|
51
|
+
"""Test base configuration structure."""
|
|
52
|
+
generator = TailwindConfigGenerator()
|
|
53
|
+
config = generator.config
|
|
54
|
+
|
|
55
|
+
assert "darkMode" in config
|
|
56
|
+
assert "content" in config
|
|
57
|
+
assert "theme" in config
|
|
58
|
+
assert "plugins" in config
|
|
59
|
+
assert "extend" in config["theme"]
|
|
60
|
+
|
|
61
|
+
def test_default_content_paths_react(self):
|
|
62
|
+
"""Test default content paths for React."""
|
|
63
|
+
generator = TailwindConfigGenerator(framework="react")
|
|
64
|
+
paths = generator.config["content"]
|
|
65
|
+
|
|
66
|
+
assert any("src/**/*.{js,jsx,ts,tsx}" in p for p in paths)
|
|
67
|
+
assert any("index.html" in p for p in paths)
|
|
68
|
+
|
|
69
|
+
def test_default_content_paths_nextjs(self):
|
|
70
|
+
"""Test default content paths for Next.js."""
|
|
71
|
+
generator = TailwindConfigGenerator(framework="nextjs")
|
|
72
|
+
paths = generator.config["content"]
|
|
73
|
+
|
|
74
|
+
assert any("app/**" in p for p in paths)
|
|
75
|
+
assert any("pages/**" in p for p in paths)
|
|
76
|
+
assert any("components/**" in p for p in paths)
|
|
77
|
+
|
|
78
|
+
def test_default_content_paths_vue(self):
|
|
79
|
+
"""Test default content paths for Vue."""
|
|
80
|
+
generator = TailwindConfigGenerator(framework="vue")
|
|
81
|
+
paths = generator.config["content"]
|
|
82
|
+
|
|
83
|
+
assert any("vue" in p for p in paths)
|
|
84
|
+
|
|
85
|
+
def test_add_colors(self):
|
|
86
|
+
"""Test adding custom colors."""
|
|
87
|
+
generator = TailwindConfigGenerator()
|
|
88
|
+
colors = {
|
|
89
|
+
"brand": "#3b82f6",
|
|
90
|
+
"accent": "#8b5cf6"
|
|
91
|
+
}
|
|
92
|
+
generator.add_colors(colors)
|
|
93
|
+
|
|
94
|
+
assert "colors" in generator.config["theme"]["extend"]
|
|
95
|
+
assert generator.config["theme"]["extend"]["colors"]["brand"] == "#3b82f6"
|
|
96
|
+
assert generator.config["theme"]["extend"]["colors"]["accent"] == "#8b5cf6"
|
|
97
|
+
|
|
98
|
+
def test_add_colors_multiple_times(self):
|
|
99
|
+
"""Test adding colors multiple times."""
|
|
100
|
+
generator = TailwindConfigGenerator()
|
|
101
|
+
|
|
102
|
+
generator.add_colors({"brand": "#3b82f6"})
|
|
103
|
+
generator.add_colors({"accent": "#8b5cf6"})
|
|
104
|
+
|
|
105
|
+
colors = generator.config["theme"]["extend"]["colors"]
|
|
106
|
+
assert "brand" in colors
|
|
107
|
+
assert "accent" in colors
|
|
108
|
+
|
|
109
|
+
def test_add_color_palette(self):
|
|
110
|
+
"""Test adding full color palette."""
|
|
111
|
+
generator = TailwindConfigGenerator()
|
|
112
|
+
generator.add_color_palette("brand", "#3b82f6")
|
|
113
|
+
|
|
114
|
+
brand = generator.config["theme"]["extend"]["colors"]["brand"]
|
|
115
|
+
|
|
116
|
+
assert isinstance(brand, dict)
|
|
117
|
+
assert "50" in brand
|
|
118
|
+
assert "500" in brand
|
|
119
|
+
assert "950" in brand
|
|
120
|
+
assert "var(--color-brand" in brand["500"]
|
|
121
|
+
|
|
122
|
+
def test_add_fonts(self):
|
|
123
|
+
"""Test adding custom fonts."""
|
|
124
|
+
generator = TailwindConfigGenerator()
|
|
125
|
+
fonts = {
|
|
126
|
+
"sans": ["Inter", "system-ui", "sans-serif"],
|
|
127
|
+
"display": ["Playfair Display", "serif"]
|
|
128
|
+
}
|
|
129
|
+
generator.add_fonts(fonts)
|
|
130
|
+
|
|
131
|
+
font_family = generator.config["theme"]["extend"]["fontFamily"]
|
|
132
|
+
assert font_family["sans"] == ["Inter", "system-ui", "sans-serif"]
|
|
133
|
+
assert font_family["display"] == ["Playfair Display", "serif"]
|
|
134
|
+
|
|
135
|
+
def test_add_spacing(self):
|
|
136
|
+
"""Test adding custom spacing."""
|
|
137
|
+
generator = TailwindConfigGenerator()
|
|
138
|
+
spacing = {
|
|
139
|
+
"18": "4.5rem",
|
|
140
|
+
"navbar": "4rem"
|
|
141
|
+
}
|
|
142
|
+
generator.add_spacing(spacing)
|
|
143
|
+
|
|
144
|
+
spacing_config = generator.config["theme"]["extend"]["spacing"]
|
|
145
|
+
assert spacing_config["18"] == "4.5rem"
|
|
146
|
+
assert spacing_config["navbar"] == "4rem"
|
|
147
|
+
|
|
148
|
+
def test_add_breakpoints(self):
|
|
149
|
+
"""Test adding custom breakpoints."""
|
|
150
|
+
generator = TailwindConfigGenerator()
|
|
151
|
+
breakpoints = {
|
|
152
|
+
"3xl": "1920px",
|
|
153
|
+
"tablet": "768px"
|
|
154
|
+
}
|
|
155
|
+
generator.add_breakpoints(breakpoints)
|
|
156
|
+
|
|
157
|
+
screens = generator.config["theme"]["extend"]["screens"]
|
|
158
|
+
assert screens["3xl"] == "1920px"
|
|
159
|
+
assert screens["tablet"] == "768px"
|
|
160
|
+
|
|
161
|
+
def test_add_plugins(self):
|
|
162
|
+
"""Test adding plugins."""
|
|
163
|
+
generator = TailwindConfigGenerator()
|
|
164
|
+
plugins = ["@tailwindcss/typography", "@tailwindcss/forms"]
|
|
165
|
+
generator.add_plugins(plugins)
|
|
166
|
+
|
|
167
|
+
assert "@tailwindcss/typography" in generator.config["plugins"]
|
|
168
|
+
assert "@tailwindcss/forms" in generator.config["plugins"]
|
|
169
|
+
|
|
170
|
+
def test_add_plugins_no_duplicates(self):
|
|
171
|
+
"""Test that adding same plugin twice doesn't duplicate."""
|
|
172
|
+
generator = TailwindConfigGenerator()
|
|
173
|
+
generator.add_plugins(["@tailwindcss/typography"])
|
|
174
|
+
generator.add_plugins(["@tailwindcss/typography"])
|
|
175
|
+
|
|
176
|
+
count = generator.config["plugins"].count("@tailwindcss/typography")
|
|
177
|
+
assert count == 1
|
|
178
|
+
|
|
179
|
+
def test_recommend_plugins(self):
|
|
180
|
+
"""Test plugin recommendations."""
|
|
181
|
+
generator = TailwindConfigGenerator()
|
|
182
|
+
recommendations = generator.recommend_plugins()
|
|
183
|
+
|
|
184
|
+
assert isinstance(recommendations, list)
|
|
185
|
+
assert "tailwindcss-animate" in recommendations
|
|
186
|
+
|
|
187
|
+
def test_recommend_plugins_nextjs(self):
|
|
188
|
+
"""Test plugin recommendations for Next.js."""
|
|
189
|
+
generator = TailwindConfigGenerator(framework="nextjs")
|
|
190
|
+
recommendations = generator.recommend_plugins()
|
|
191
|
+
|
|
192
|
+
assert "@tailwindcss/typography" in recommendations
|
|
193
|
+
|
|
194
|
+
def test_generate_typescript_config(self):
|
|
195
|
+
"""Test generating TypeScript configuration."""
|
|
196
|
+
generator = TailwindConfigGenerator(typescript=True)
|
|
197
|
+
config = generator.generate_config_string()
|
|
198
|
+
|
|
199
|
+
assert "import type { Config } from 'tailwindcss'" in config
|
|
200
|
+
assert "const config: Config" in config
|
|
201
|
+
assert "export default config" in config
|
|
202
|
+
|
|
203
|
+
def test_generate_javascript_config(self):
|
|
204
|
+
"""Test generating JavaScript configuration."""
|
|
205
|
+
generator = TailwindConfigGenerator(typescript=False)
|
|
206
|
+
config = generator.generate_config_string()
|
|
207
|
+
|
|
208
|
+
assert "module.exports" in config
|
|
209
|
+
assert "@type" in config
|
|
210
|
+
|
|
211
|
+
def test_generate_config_with_colors(self):
|
|
212
|
+
"""Test generating config with custom colors."""
|
|
213
|
+
generator = TailwindConfigGenerator()
|
|
214
|
+
generator.add_colors({"brand": "#3b82f6"})
|
|
215
|
+
config = generator.generate_config_string()
|
|
216
|
+
|
|
217
|
+
assert "colors" in config
|
|
218
|
+
assert "brand" in config
|
|
219
|
+
|
|
220
|
+
def test_generate_config_with_plugins(self):
|
|
221
|
+
"""Test generating config with plugins."""
|
|
222
|
+
generator = TailwindConfigGenerator()
|
|
223
|
+
generator.add_plugins(["tailwindcss-animate"])
|
|
224
|
+
config = generator.generate_config_string()
|
|
225
|
+
|
|
226
|
+
assert "plugins:" in config
|
|
227
|
+
assert "require('tailwindcss-animate')" in config
|
|
228
|
+
|
|
229
|
+
def test_validate_config_valid(self):
|
|
230
|
+
"""Test validating valid configuration."""
|
|
231
|
+
generator = TailwindConfigGenerator()
|
|
232
|
+
valid, message = generator.validate_config()
|
|
233
|
+
|
|
234
|
+
assert valid is True
|
|
235
|
+
|
|
236
|
+
def test_validate_config_no_content(self):
|
|
237
|
+
"""Test validating config with no content paths."""
|
|
238
|
+
generator = TailwindConfigGenerator()
|
|
239
|
+
generator.config["content"] = []
|
|
240
|
+
|
|
241
|
+
valid, message = generator.validate_config()
|
|
242
|
+
|
|
243
|
+
assert valid is False
|
|
244
|
+
assert "No content paths" in message
|
|
245
|
+
|
|
246
|
+
def test_validate_config_empty_theme(self):
|
|
247
|
+
"""Test validating config with empty theme extensions."""
|
|
248
|
+
generator = TailwindConfigGenerator()
|
|
249
|
+
# Default has empty theme.extend
|
|
250
|
+
|
|
251
|
+
valid, message = generator.validate_config()
|
|
252
|
+
|
|
253
|
+
assert valid is True
|
|
254
|
+
assert "Warning" in message
|
|
255
|
+
|
|
256
|
+
def test_write_config(self, tmp_path):
|
|
257
|
+
"""Test writing configuration to file."""
|
|
258
|
+
output_path = tmp_path / "tailwind.config.ts"
|
|
259
|
+
generator = TailwindConfigGenerator(output_path=output_path)
|
|
260
|
+
|
|
261
|
+
success, message = generator.write_config()
|
|
262
|
+
|
|
263
|
+
assert success is True
|
|
264
|
+
assert output_path.exists()
|
|
265
|
+
assert "written to" in message
|
|
266
|
+
|
|
267
|
+
def test_write_config_creates_content(self, tmp_path):
|
|
268
|
+
"""Test that written config contains expected content."""
|
|
269
|
+
output_path = tmp_path / "tailwind.config.ts"
|
|
270
|
+
generator = TailwindConfigGenerator(output_path=output_path)
|
|
271
|
+
generator.add_colors({"brand": "#3b82f6"})
|
|
272
|
+
|
|
273
|
+
generator.write_config()
|
|
274
|
+
|
|
275
|
+
content = output_path.read_text()
|
|
276
|
+
assert "import type { Config }" in content
|
|
277
|
+
assert "brand" in content
|
|
278
|
+
|
|
279
|
+
def test_write_config_invalid_path(self):
|
|
280
|
+
"""Test writing config to invalid path."""
|
|
281
|
+
generator = TailwindConfigGenerator(output_path=Path("/invalid/path/config.ts"))
|
|
282
|
+
|
|
283
|
+
success, message = generator.write_config()
|
|
284
|
+
|
|
285
|
+
assert success is False
|
|
286
|
+
assert "Failed to write" in message
|
|
287
|
+
|
|
288
|
+
def test_full_configuration_typescript(self, tmp_path):
|
|
289
|
+
"""Test generating complete TypeScript configuration."""
|
|
290
|
+
output_path = tmp_path / "tailwind.config.ts"
|
|
291
|
+
generator = TailwindConfigGenerator(
|
|
292
|
+
typescript=True,
|
|
293
|
+
framework="nextjs",
|
|
294
|
+
output_path=output_path
|
|
295
|
+
)
|
|
296
|
+
|
|
297
|
+
# Add various customizations
|
|
298
|
+
generator.add_colors({"brand": "#3b82f6", "accent": "#8b5cf6"})
|
|
299
|
+
generator.add_fonts({"sans": ["Inter", "sans-serif"]})
|
|
300
|
+
generator.add_spacing({"navbar": "4rem"})
|
|
301
|
+
generator.add_breakpoints({"3xl": "1920px"})
|
|
302
|
+
generator.add_plugins(["tailwindcss-animate"])
|
|
303
|
+
|
|
304
|
+
success, _ = generator.write_config()
|
|
305
|
+
assert success is True
|
|
306
|
+
|
|
307
|
+
content = output_path.read_text()
|
|
308
|
+
|
|
309
|
+
# Verify all customizations are present
|
|
310
|
+
assert "brand" in content
|
|
311
|
+
assert "accent" in content
|
|
312
|
+
assert "Inter" in content
|
|
313
|
+
assert "navbar" in content
|
|
314
|
+
assert "3xl" in content
|
|
315
|
+
assert "tailwindcss-animate" in content
|
|
316
|
+
|
|
317
|
+
def test_full_configuration_javascript(self, tmp_path):
|
|
318
|
+
"""Test generating complete JavaScript configuration."""
|
|
319
|
+
output_path = tmp_path / "tailwind.config.js"
|
|
320
|
+
generator = TailwindConfigGenerator(
|
|
321
|
+
typescript=False,
|
|
322
|
+
framework="react",
|
|
323
|
+
output_path=output_path
|
|
324
|
+
)
|
|
325
|
+
|
|
326
|
+
generator.add_colors({"primary": "#3b82f6"})
|
|
327
|
+
generator.add_plugins(["@tailwindcss/forms"])
|
|
328
|
+
|
|
329
|
+
success, _ = generator.write_config()
|
|
330
|
+
assert success is True
|
|
331
|
+
|
|
332
|
+
content = output_path.read_text()
|
|
333
|
+
|
|
334
|
+
assert "module.exports" in content
|
|
335
|
+
assert "primary" in content
|
|
336
|
+
assert "@tailwindcss/forms" in content
|