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.
- 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,109 @@
|
|
|
1
|
+
# Media Processing Troubleshooting
|
|
2
|
+
|
|
3
|
+
## FFmpeg Issues
|
|
4
|
+
|
|
5
|
+
### Unknown Encoder Error
|
|
6
|
+
```bash
|
|
7
|
+
# Check available encoders
|
|
8
|
+
ffmpeg -encoders | grep h264
|
|
9
|
+
|
|
10
|
+
# Install codec libraries (Ubuntu/Debian)
|
|
11
|
+
sudo apt-get install libx264-dev libx265-dev libvpx-dev
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
### Memory Errors
|
|
15
|
+
```bash
|
|
16
|
+
# Limit thread usage
|
|
17
|
+
ffmpeg -threads 4 input.mp4 output.mp4
|
|
18
|
+
|
|
19
|
+
# Process in segments for large files
|
|
20
|
+
ffmpeg -i large.mp4 -ss 0 -t 600 segment1.mp4
|
|
21
|
+
ffmpeg -i large.mp4 -ss 600 -t 600 segment2.mp4
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### Slow Encoding
|
|
25
|
+
```bash
|
|
26
|
+
# Use faster preset (trades compression for speed)
|
|
27
|
+
ffmpeg -i input.mp4 -c:v libx264 -preset ultrafast output.mp4
|
|
28
|
+
|
|
29
|
+
# Use hardware acceleration
|
|
30
|
+
ffmpeg -hwaccel cuda -i input.mp4 -c:v h264_nvenc output.mp4
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## ImageMagick Issues
|
|
34
|
+
|
|
35
|
+
### "Not Authorized" Error
|
|
36
|
+
```bash
|
|
37
|
+
# Edit policy file
|
|
38
|
+
sudo nano /etc/ImageMagick-7/policy.xml
|
|
39
|
+
|
|
40
|
+
# Change from:
|
|
41
|
+
# <policy domain="coder" rights="none" pattern="PDF" />
|
|
42
|
+
|
|
43
|
+
# To:
|
|
44
|
+
# <policy domain="coder" rights="read|write" pattern="PDF" />
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Memory Limit Errors
|
|
48
|
+
```bash
|
|
49
|
+
# Increase memory limits
|
|
50
|
+
magick -limit memory 2GB -limit map 4GB input.jpg output.jpg
|
|
51
|
+
|
|
52
|
+
# Process in batches for large sets
|
|
53
|
+
ls *.jpg | xargs -n 10 -P 4 mogrify -resize 800x
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Slow Batch Processing
|
|
57
|
+
```bash
|
|
58
|
+
# Use parallel processing with GNU Parallel
|
|
59
|
+
ls *.jpg | parallel -j 4 magick {} -resize 800x resized-{}
|
|
60
|
+
|
|
61
|
+
# Or use mogrify for in-place edits (faster)
|
|
62
|
+
mogrify -resize 800x *.jpg
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## RMBG Issues
|
|
66
|
+
|
|
67
|
+
### Model Download Failures
|
|
68
|
+
```bash
|
|
69
|
+
# Check network connectivity
|
|
70
|
+
curl https://unpkg.com/@rmbg/model-modnet/modnet-256.onnx
|
|
71
|
+
|
|
72
|
+
# Use custom cache directory
|
|
73
|
+
RMBG_CACHE_DIR=/tmp/rmbg-cache rmbg input.jpg
|
|
74
|
+
|
|
75
|
+
# Clear cache and retry
|
|
76
|
+
rm -rf /tmp/rmbg-cache
|
|
77
|
+
rmbg input.jpg
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Out of Memory
|
|
81
|
+
```bash
|
|
82
|
+
# Use smaller model
|
|
83
|
+
rmbg input.jpg -m u2netp -o output.png
|
|
84
|
+
|
|
85
|
+
# Reduce resolution
|
|
86
|
+
rmbg input.jpg -r 1024 -o output.png
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### Slow Processing
|
|
90
|
+
```bash
|
|
91
|
+
# Use fastest model
|
|
92
|
+
rmbg input.jpg -m u2netp -o output.png
|
|
93
|
+
|
|
94
|
+
# Process smaller resolution
|
|
95
|
+
rmbg input.jpg -r 1024 -o output.png
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## Performance Tips
|
|
99
|
+
|
|
100
|
+
1. **Use CRF for quality control** - Better than bitrate for video encoding
|
|
101
|
+
2. **Copy streams when possible** - Avoid re-encoding with `-c copy`
|
|
102
|
+
3. **Hardware acceleration** - GPU encoding 5-10x faster than CPU
|
|
103
|
+
4. **Appropriate presets** - Balance speed vs compression (`fast`, `medium`, `slow`)
|
|
104
|
+
5. **Batch with mogrify** - In-place image processing faster than individual commands
|
|
105
|
+
6. **Strip metadata** - Reduce file size with `-strip` flag
|
|
106
|
+
7. **Progressive JPEG** - Better web loading with `-interlace Plane`
|
|
107
|
+
8. **Test on samples** - Verify settings before processing large batches
|
|
108
|
+
9. **Parallel processing** - Use GNU Parallel for multiple files
|
|
109
|
+
10. **Limit memory** - Prevent crashes on large batches with `-limit` flags
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# Media Processing Scripts
|
|
2
|
+
|
|
3
|
+
Helper scripts for common media processing tasks.
|
|
4
|
+
|
|
5
|
+
## Background Removal Scripts
|
|
6
|
+
|
|
7
|
+
### remove-background.sh
|
|
8
|
+
Remove background from a single image using RMBG CLI.
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
# Basic usage
|
|
12
|
+
./remove-background.sh photo.jpg
|
|
13
|
+
|
|
14
|
+
# With specific model
|
|
15
|
+
./remove-background.sh photo.jpg briaai
|
|
16
|
+
|
|
17
|
+
# With custom output and resolution
|
|
18
|
+
./remove-background.sh photo.jpg briaai output.png 4096
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
**Arguments:**
|
|
22
|
+
- `input` - Input image file (required)
|
|
23
|
+
- `model` - Model name: u2netp, modnet, briaai, isnet-anime, silueta, u2net-cloth (default: modnet)
|
|
24
|
+
- `output` - Output file path (default: auto-generated)
|
|
25
|
+
- `resolution` - Max resolution in pixels (default: 2048)
|
|
26
|
+
|
|
27
|
+
### batch-remove-background.sh
|
|
28
|
+
Remove backgrounds from all images in a directory.
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
# Basic usage
|
|
32
|
+
./batch-remove-background.sh ./photos
|
|
33
|
+
|
|
34
|
+
# With custom output directory
|
|
35
|
+
./batch-remove-background.sh ./photos ./output
|
|
36
|
+
|
|
37
|
+
# With specific model and resolution
|
|
38
|
+
./batch-remove-background.sh ./photos ./output briaai 4096
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
**Arguments:**
|
|
42
|
+
- `input_dir` - Input directory with images (required)
|
|
43
|
+
- `output_dir` - Output directory (default: input_dir/no-bg)
|
|
44
|
+
- `model` - Model name (default: modnet)
|
|
45
|
+
- `resolution` - Max resolution in pixels (default: 2048)
|
|
46
|
+
|
|
47
|
+
### remove-bg-node.js
|
|
48
|
+
Node.js script for background removal with progress tracking.
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
# Basic usage
|
|
52
|
+
node remove-bg-node.js photo.jpg
|
|
53
|
+
|
|
54
|
+
# With options
|
|
55
|
+
node remove-bg-node.js photo.jpg -m briaai -o output.png -r 4096 -p
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
**Options:**
|
|
59
|
+
- `-o, --output <path>` - Output file path
|
|
60
|
+
- `-m, --model <name>` - Model: briaai, modnet, u2netp
|
|
61
|
+
- `-r, --resolution <n>` - Max resolution
|
|
62
|
+
- `-p, --progress` - Show progress
|
|
63
|
+
|
|
64
|
+
## Image Processing Scripts
|
|
65
|
+
|
|
66
|
+
### batch_resize.py
|
|
67
|
+
Batch resize images with various options.
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
python batch_resize.py -i ./input -o ./output -w 800 -h 600
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Video Processing Scripts
|
|
74
|
+
|
|
75
|
+
### video_optimize.py
|
|
76
|
+
Optimize videos for web with quality and size optimization.
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
python video_optimize.py -i input.mp4 -o output.mp4 --preset slow --crf 23
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### media_convert.py
|
|
83
|
+
Convert media files between different formats.
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
python media_convert.py -i input.mkv -o output.mp4 --codec h264
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## Requirements
|
|
90
|
+
|
|
91
|
+
### Shell Scripts
|
|
92
|
+
- Bash (macOS, Linux)
|
|
93
|
+
- rmbg-cli: `npm install -g rmbg-cli`
|
|
94
|
+
- FFmpeg: `brew install ffmpeg` or `apt-get install ffmpeg`
|
|
95
|
+
- ImageMagick: `brew install imagemagick` or `apt-get install imagemagick`
|
|
96
|
+
|
|
97
|
+
### Node.js Scripts
|
|
98
|
+
- Node.js 14+
|
|
99
|
+
- Dependencies: `npm install rmbg`
|
|
100
|
+
|
|
101
|
+
### Python Scripts
|
|
102
|
+
- Python 3.7+
|
|
103
|
+
- Dependencies: `pip install -r requirements.txt`
|
|
104
|
+
|
|
105
|
+
## Testing
|
|
106
|
+
|
|
107
|
+
Run tests:
|
|
108
|
+
```bash
|
|
109
|
+
cd tests
|
|
110
|
+
bash test_all.sh
|
|
111
|
+
```
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Batch background removal script using RMBG CLI
|
|
3
|
+
# Usage: ./batch-remove-background.sh <input_dir> [output_dir] [model] [resolution]
|
|
4
|
+
|
|
5
|
+
set -e
|
|
6
|
+
|
|
7
|
+
# Colors for output
|
|
8
|
+
RED='\033[0;31m'
|
|
9
|
+
GREEN='\033[0;32m'
|
|
10
|
+
YELLOW='\033[1;33m'
|
|
11
|
+
BLUE='\033[0;34m'
|
|
12
|
+
NC='\033[0m' # No Color
|
|
13
|
+
|
|
14
|
+
# Default values
|
|
15
|
+
INPUT_DIR=""
|
|
16
|
+
OUTPUT_DIR=""
|
|
17
|
+
MODEL="modnet"
|
|
18
|
+
MAX_RESOLUTION="2048"
|
|
19
|
+
|
|
20
|
+
# Parse arguments
|
|
21
|
+
INPUT_DIR="$1"
|
|
22
|
+
if [ -n "$2" ]; then
|
|
23
|
+
OUTPUT_DIR="$2"
|
|
24
|
+
fi
|
|
25
|
+
if [ -n "$3" ]; then
|
|
26
|
+
MODEL="$3"
|
|
27
|
+
fi
|
|
28
|
+
if [ -n "$4" ]; then
|
|
29
|
+
MAX_RESOLUTION="$4"
|
|
30
|
+
fi
|
|
31
|
+
|
|
32
|
+
# Validate input directory
|
|
33
|
+
if [ -z "$INPUT_DIR" ]; then
|
|
34
|
+
echo -e "${RED}Error: Input directory is required${NC}"
|
|
35
|
+
echo ""
|
|
36
|
+
echo "Usage: $0 <input_dir> [output_dir] [model] [resolution]"
|
|
37
|
+
echo ""
|
|
38
|
+
echo "Arguments:"
|
|
39
|
+
echo " input_dir Input directory with images (required)"
|
|
40
|
+
echo " output_dir Output directory (default: input_dir/no-bg)"
|
|
41
|
+
echo " model Model name: u2netp, modnet, briaai, isnet-anime, silueta, u2net-cloth (default: modnet)"
|
|
42
|
+
echo " resolution Max resolution in pixels (default: 2048)"
|
|
43
|
+
echo ""
|
|
44
|
+
echo "Examples:"
|
|
45
|
+
echo " $0 ./photos"
|
|
46
|
+
echo " $0 ./photos ./output"
|
|
47
|
+
echo " $0 ./photos ./output briaai"
|
|
48
|
+
echo " $0 ./photos ./output briaai 4096"
|
|
49
|
+
exit 1
|
|
50
|
+
fi
|
|
51
|
+
|
|
52
|
+
if [ ! -d "$INPUT_DIR" ]; then
|
|
53
|
+
echo -e "${RED}Error: Input directory '$INPUT_DIR' not found${NC}"
|
|
54
|
+
exit 1
|
|
55
|
+
fi
|
|
56
|
+
|
|
57
|
+
# Set default output directory
|
|
58
|
+
if [ -z "$OUTPUT_DIR" ]; then
|
|
59
|
+
OUTPUT_DIR="$INPUT_DIR/no-bg"
|
|
60
|
+
fi
|
|
61
|
+
|
|
62
|
+
# Create output directory if it doesn't exist
|
|
63
|
+
mkdir -p "$OUTPUT_DIR"
|
|
64
|
+
|
|
65
|
+
# Check if rmbg-cli is installed
|
|
66
|
+
if ! command -v rmbg &> /dev/null; then
|
|
67
|
+
echo -e "${YELLOW}Warning: rmbg-cli not found${NC}"
|
|
68
|
+
echo "Installing rmbg-cli globally..."
|
|
69
|
+
npm install -g rmbg-cli
|
|
70
|
+
echo -e "${GREEN}✓ rmbg-cli installed${NC}"
|
|
71
|
+
fi
|
|
72
|
+
|
|
73
|
+
# Find all image files
|
|
74
|
+
IMAGE_FILES=$(find "$INPUT_DIR" -maxdepth 1 -type f \( -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.png" -o -iname "*.webp" \))
|
|
75
|
+
TOTAL_FILES=$(echo "$IMAGE_FILES" | grep -v '^$' | wc -l | tr -d ' ')
|
|
76
|
+
|
|
77
|
+
if [ "$TOTAL_FILES" -eq 0 ]; then
|
|
78
|
+
echo -e "${YELLOW}Warning: No image files found in '$INPUT_DIR'${NC}"
|
|
79
|
+
exit 0
|
|
80
|
+
fi
|
|
81
|
+
|
|
82
|
+
# Display configuration
|
|
83
|
+
echo -e "${GREEN}Batch Background Removal Configuration:${NC}"
|
|
84
|
+
echo " Input Dir: $INPUT_DIR"
|
|
85
|
+
echo " Output Dir: $OUTPUT_DIR"
|
|
86
|
+
echo " Model: $MODEL"
|
|
87
|
+
echo " Resolution: $MAX_RESOLUTION"
|
|
88
|
+
echo " Total Files: $TOTAL_FILES"
|
|
89
|
+
echo ""
|
|
90
|
+
|
|
91
|
+
# Process each image
|
|
92
|
+
SUCCESS_COUNT=0
|
|
93
|
+
FAIL_COUNT=0
|
|
94
|
+
CURRENT=0
|
|
95
|
+
|
|
96
|
+
while IFS= read -r file; do
|
|
97
|
+
[ -z "$file" ] && continue
|
|
98
|
+
|
|
99
|
+
CURRENT=$((CURRENT + 1))
|
|
100
|
+
BASENAME=$(basename "$file")
|
|
101
|
+
OUTPUT_FILE="$OUTPUT_DIR/${BASENAME%.*}.png"
|
|
102
|
+
|
|
103
|
+
echo -e "${BLUE}[$CURRENT/$TOTAL_FILES]${NC} Processing: $BASENAME"
|
|
104
|
+
|
|
105
|
+
if rmbg "$file" -m "$MODEL" -o "$OUTPUT_FILE" -r "$MAX_RESOLUTION" 2>/dev/null; then
|
|
106
|
+
SUCCESS_COUNT=$((SUCCESS_COUNT + 1))
|
|
107
|
+
echo -e " ${GREEN}✓ Success${NC}"
|
|
108
|
+
else
|
|
109
|
+
FAIL_COUNT=$((FAIL_COUNT + 1))
|
|
110
|
+
echo -e " ${RED}✗ Failed${NC}"
|
|
111
|
+
fi
|
|
112
|
+
done <<< "$IMAGE_FILES"
|
|
113
|
+
|
|
114
|
+
# Display summary
|
|
115
|
+
echo ""
|
|
116
|
+
echo -e "${GREEN}Batch Processing Complete${NC}"
|
|
117
|
+
echo " Total: $TOTAL_FILES files"
|
|
118
|
+
echo " Success: $SUCCESS_COUNT files"
|
|
119
|
+
echo " Failed: $FAIL_COUNT files"
|
|
120
|
+
echo " Output: $OUTPUT_DIR"
|
|
121
|
+
|
|
122
|
+
if [ "$FAIL_COUNT" -gt 0 ]; then
|
|
123
|
+
exit 1
|
|
124
|
+
fi
|
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Batch image resizing with multiple strategies.
|
|
4
|
+
|
|
5
|
+
Supports aspect ratio maintenance, smart cropping, thumbnail generation,
|
|
6
|
+
watermarks, format conversion, and parallel processing.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import argparse
|
|
10
|
+
import subprocess
|
|
11
|
+
import sys
|
|
12
|
+
from concurrent.futures import ThreadPoolExecutor, as_completed
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
from typing import List, Optional, Tuple
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class ImageResizer:
|
|
18
|
+
"""Handle image resizing operations using ImageMagick."""
|
|
19
|
+
|
|
20
|
+
def __init__(self, verbose: bool = False, dry_run: bool = False):
|
|
21
|
+
self.verbose = verbose
|
|
22
|
+
self.dry_run = dry_run
|
|
23
|
+
|
|
24
|
+
def check_imagemagick(self) -> bool:
|
|
25
|
+
"""Check if ImageMagick is available."""
|
|
26
|
+
try:
|
|
27
|
+
subprocess.run(
|
|
28
|
+
['magick', '-version'],
|
|
29
|
+
stdout=subprocess.DEVNULL,
|
|
30
|
+
stderr=subprocess.DEVNULL,
|
|
31
|
+
check=True
|
|
32
|
+
)
|
|
33
|
+
return True
|
|
34
|
+
except (subprocess.CalledProcessError, FileNotFoundError):
|
|
35
|
+
return False
|
|
36
|
+
|
|
37
|
+
def build_resize_command(
|
|
38
|
+
self,
|
|
39
|
+
input_path: Path,
|
|
40
|
+
output_path: Path,
|
|
41
|
+
width: Optional[int],
|
|
42
|
+
height: Optional[int],
|
|
43
|
+
strategy: str,
|
|
44
|
+
quality: int,
|
|
45
|
+
watermark: Optional[Path] = None
|
|
46
|
+
) -> List[str]:
|
|
47
|
+
"""Build ImageMagick resize command based on strategy."""
|
|
48
|
+
cmd = ['magick', str(input_path)]
|
|
49
|
+
|
|
50
|
+
# Apply resize strategy
|
|
51
|
+
if strategy == 'fit':
|
|
52
|
+
# Fit within dimensions, maintain aspect ratio
|
|
53
|
+
geometry = f"{width or ''}x{height or ''}"
|
|
54
|
+
cmd.extend(['-resize', geometry])
|
|
55
|
+
|
|
56
|
+
elif strategy == 'fill':
|
|
57
|
+
# Fill dimensions, crop excess
|
|
58
|
+
if not width or not height:
|
|
59
|
+
raise ValueError("Both width and height required for 'fill' strategy")
|
|
60
|
+
cmd.extend([
|
|
61
|
+
'-resize', f'{width}x{height}^',
|
|
62
|
+
'-gravity', 'center',
|
|
63
|
+
'-extent', f'{width}x{height}'
|
|
64
|
+
])
|
|
65
|
+
|
|
66
|
+
elif strategy == 'cover':
|
|
67
|
+
# Cover dimensions, may exceed
|
|
68
|
+
if not width or not height:
|
|
69
|
+
raise ValueError("Both width and height required for 'cover' strategy")
|
|
70
|
+
cmd.extend(['-resize', f'{width}x{height}^'])
|
|
71
|
+
|
|
72
|
+
elif strategy == 'exact':
|
|
73
|
+
# Force exact dimensions, ignore aspect ratio
|
|
74
|
+
if not width or not height:
|
|
75
|
+
raise ValueError("Both width and height required for 'exact' strategy")
|
|
76
|
+
cmd.extend(['-resize', f'{width}x{height}!'])
|
|
77
|
+
|
|
78
|
+
elif strategy == 'thumbnail':
|
|
79
|
+
# Create square thumbnail
|
|
80
|
+
size = width or height or 200
|
|
81
|
+
cmd.extend([
|
|
82
|
+
'-resize', f'{size}x{size}^',
|
|
83
|
+
'-gravity', 'center',
|
|
84
|
+
'-extent', f'{size}x{size}'
|
|
85
|
+
])
|
|
86
|
+
|
|
87
|
+
# Add watermark if specified
|
|
88
|
+
if watermark:
|
|
89
|
+
cmd.extend([
|
|
90
|
+
str(watermark),
|
|
91
|
+
'-gravity', 'southeast',
|
|
92
|
+
'-geometry', '+10+10',
|
|
93
|
+
'-composite'
|
|
94
|
+
])
|
|
95
|
+
|
|
96
|
+
# Output settings
|
|
97
|
+
cmd.extend([
|
|
98
|
+
'-quality', str(quality),
|
|
99
|
+
'-strip',
|
|
100
|
+
str(output_path)
|
|
101
|
+
])
|
|
102
|
+
|
|
103
|
+
return cmd
|
|
104
|
+
|
|
105
|
+
def resize_image(
|
|
106
|
+
self,
|
|
107
|
+
input_path: Path,
|
|
108
|
+
output_path: Path,
|
|
109
|
+
width: Optional[int],
|
|
110
|
+
height: Optional[int],
|
|
111
|
+
strategy: str = 'fit',
|
|
112
|
+
quality: int = 85,
|
|
113
|
+
watermark: Optional[Path] = None
|
|
114
|
+
) -> bool:
|
|
115
|
+
"""Resize a single image."""
|
|
116
|
+
try:
|
|
117
|
+
# Ensure output directory exists
|
|
118
|
+
output_path.parent.mkdir(parents=True, exist_ok=True)
|
|
119
|
+
|
|
120
|
+
cmd = self.build_resize_command(
|
|
121
|
+
input_path, output_path, width, height,
|
|
122
|
+
strategy, quality, watermark
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
if self.verbose or self.dry_run:
|
|
126
|
+
print(f"Command: {' '.join(cmd)}")
|
|
127
|
+
|
|
128
|
+
if self.dry_run:
|
|
129
|
+
return True
|
|
130
|
+
|
|
131
|
+
subprocess.run(
|
|
132
|
+
cmd,
|
|
133
|
+
stdout=subprocess.PIPE if not self.verbose else None,
|
|
134
|
+
stderr=subprocess.PIPE if not self.verbose else None,
|
|
135
|
+
check=True
|
|
136
|
+
)
|
|
137
|
+
return True
|
|
138
|
+
|
|
139
|
+
except subprocess.CalledProcessError as e:
|
|
140
|
+
print(f"Error resizing {input_path}: {e}", file=sys.stderr)
|
|
141
|
+
if not self.verbose and e.stderr:
|
|
142
|
+
print(e.stderr.decode(), file=sys.stderr)
|
|
143
|
+
return False
|
|
144
|
+
except Exception as e:
|
|
145
|
+
print(f"Error processing {input_path}: {e}", file=sys.stderr)
|
|
146
|
+
return False
|
|
147
|
+
|
|
148
|
+
def batch_resize(
|
|
149
|
+
self,
|
|
150
|
+
input_paths: List[Path],
|
|
151
|
+
output_dir: Path,
|
|
152
|
+
width: Optional[int],
|
|
153
|
+
height: Optional[int],
|
|
154
|
+
strategy: str = 'fit',
|
|
155
|
+
quality: int = 85,
|
|
156
|
+
format_ext: Optional[str] = None,
|
|
157
|
+
watermark: Optional[Path] = None,
|
|
158
|
+
parallel: int = 1
|
|
159
|
+
) -> Tuple[int, int]:
|
|
160
|
+
"""Resize multiple images."""
|
|
161
|
+
success_count = 0
|
|
162
|
+
fail_count = 0
|
|
163
|
+
|
|
164
|
+
def process_image(input_path: Path) -> Tuple[Path, bool]:
|
|
165
|
+
"""Process single image for parallel execution."""
|
|
166
|
+
if not input_path.exists() or not input_path.is_file():
|
|
167
|
+
return input_path, False
|
|
168
|
+
|
|
169
|
+
# Determine output path
|
|
170
|
+
output_name = input_path.stem
|
|
171
|
+
if format_ext:
|
|
172
|
+
output_path = output_dir / f"{output_name}.{format_ext.lstrip('.')}"
|
|
173
|
+
else:
|
|
174
|
+
output_path = output_dir / input_path.name
|
|
175
|
+
|
|
176
|
+
if not self.dry_run:
|
|
177
|
+
print(f"Processing {input_path.name} -> {output_path.name}")
|
|
178
|
+
|
|
179
|
+
success = self.resize_image(
|
|
180
|
+
input_path, output_path, width, height,
|
|
181
|
+
strategy, quality, watermark
|
|
182
|
+
)
|
|
183
|
+
|
|
184
|
+
return input_path, success
|
|
185
|
+
|
|
186
|
+
# Process images
|
|
187
|
+
if parallel > 1:
|
|
188
|
+
with ThreadPoolExecutor(max_workers=parallel) as executor:
|
|
189
|
+
futures = [executor.submit(process_image, path) for path in input_paths]
|
|
190
|
+
|
|
191
|
+
for future in as_completed(futures):
|
|
192
|
+
_, success = future.result()
|
|
193
|
+
if success:
|
|
194
|
+
success_count += 1
|
|
195
|
+
else:
|
|
196
|
+
fail_count += 1
|
|
197
|
+
else:
|
|
198
|
+
for input_path in input_paths:
|
|
199
|
+
_, success = process_image(input_path)
|
|
200
|
+
if success:
|
|
201
|
+
success_count += 1
|
|
202
|
+
else:
|
|
203
|
+
fail_count += 1
|
|
204
|
+
|
|
205
|
+
return success_count, fail_count
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
def collect_images(paths: List[Path], recursive: bool = False) -> List[Path]:
|
|
209
|
+
"""Collect image files from paths."""
|
|
210
|
+
image_exts = {'.jpg', '.jpeg', '.png', '.gif', '.webp', '.bmp', '.tiff', '.tif'}
|
|
211
|
+
images = []
|
|
212
|
+
|
|
213
|
+
for path in paths:
|
|
214
|
+
if path.is_file() and path.suffix.lower() in image_exts:
|
|
215
|
+
images.append(path)
|
|
216
|
+
elif path.is_dir():
|
|
217
|
+
pattern = '**/*' if recursive else '*'
|
|
218
|
+
for img_path in path.glob(pattern):
|
|
219
|
+
if img_path.is_file() and img_path.suffix.lower() in image_exts:
|
|
220
|
+
images.append(img_path)
|
|
221
|
+
|
|
222
|
+
return images
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
def main():
|
|
226
|
+
"""Main entry point."""
|
|
227
|
+
parser = argparse.ArgumentParser(
|
|
228
|
+
description='Batch image resizing with multiple strategies.'
|
|
229
|
+
)
|
|
230
|
+
parser.add_argument(
|
|
231
|
+
'inputs',
|
|
232
|
+
nargs='+',
|
|
233
|
+
type=Path,
|
|
234
|
+
help='Input image(s) or directory'
|
|
235
|
+
)
|
|
236
|
+
parser.add_argument(
|
|
237
|
+
'-o', '--output',
|
|
238
|
+
type=Path,
|
|
239
|
+
required=True,
|
|
240
|
+
help='Output directory'
|
|
241
|
+
)
|
|
242
|
+
parser.add_argument(
|
|
243
|
+
'-w', '--width',
|
|
244
|
+
type=int,
|
|
245
|
+
help='Target width in pixels'
|
|
246
|
+
)
|
|
247
|
+
parser.add_argument(
|
|
248
|
+
'-h', '--height',
|
|
249
|
+
type=int,
|
|
250
|
+
dest='img_height',
|
|
251
|
+
help='Target height in pixels'
|
|
252
|
+
)
|
|
253
|
+
parser.add_argument(
|
|
254
|
+
'-s', '--strategy',
|
|
255
|
+
choices=['fit', 'fill', 'cover', 'exact', 'thumbnail'],
|
|
256
|
+
default='fit',
|
|
257
|
+
help='Resize strategy (default: fit)'
|
|
258
|
+
)
|
|
259
|
+
parser.add_argument(
|
|
260
|
+
'-q', '--quality',
|
|
261
|
+
type=int,
|
|
262
|
+
default=85,
|
|
263
|
+
help='Output quality 0-100 (default: 85)'
|
|
264
|
+
)
|
|
265
|
+
parser.add_argument(
|
|
266
|
+
'-f', '--format',
|
|
267
|
+
help='Output format (e.g., jpg, png, webp)'
|
|
268
|
+
)
|
|
269
|
+
parser.add_argument(
|
|
270
|
+
'-wm', '--watermark',
|
|
271
|
+
type=Path,
|
|
272
|
+
help='Watermark image to overlay'
|
|
273
|
+
)
|
|
274
|
+
parser.add_argument(
|
|
275
|
+
'-p', '--parallel',
|
|
276
|
+
type=int,
|
|
277
|
+
default=1,
|
|
278
|
+
help='Number of parallel processes (default: 1)'
|
|
279
|
+
)
|
|
280
|
+
parser.add_argument(
|
|
281
|
+
'-r', '--recursive',
|
|
282
|
+
action='store_true',
|
|
283
|
+
help='Process directories recursively'
|
|
284
|
+
)
|
|
285
|
+
parser.add_argument(
|
|
286
|
+
'-n', '--dry-run',
|
|
287
|
+
action='store_true',
|
|
288
|
+
help='Show commands without executing'
|
|
289
|
+
)
|
|
290
|
+
parser.add_argument(
|
|
291
|
+
'-v', '--verbose',
|
|
292
|
+
action='store_true',
|
|
293
|
+
help='Verbose output'
|
|
294
|
+
)
|
|
295
|
+
|
|
296
|
+
args = parser.parse_args()
|
|
297
|
+
|
|
298
|
+
# Validate dimensions
|
|
299
|
+
if not args.width and not args.img_height:
|
|
300
|
+
print("Error: At least one of --width or --height required", file=sys.stderr)
|
|
301
|
+
sys.exit(1)
|
|
302
|
+
|
|
303
|
+
# Initialize resizer
|
|
304
|
+
resizer = ImageResizer(verbose=args.verbose, dry_run=args.dry_run)
|
|
305
|
+
|
|
306
|
+
# Check dependencies
|
|
307
|
+
if not resizer.check_imagemagick():
|
|
308
|
+
print("Error: ImageMagick not found", file=sys.stderr)
|
|
309
|
+
sys.exit(1)
|
|
310
|
+
|
|
311
|
+
# Collect input images
|
|
312
|
+
images = collect_images(args.inputs, args.recursive)
|
|
313
|
+
|
|
314
|
+
if not images:
|
|
315
|
+
print("Error: No images found", file=sys.stderr)
|
|
316
|
+
sys.exit(1)
|
|
317
|
+
|
|
318
|
+
print(f"Found {len(images)} image(s) to process")
|
|
319
|
+
|
|
320
|
+
# Create output directory
|
|
321
|
+
if not args.dry_run:
|
|
322
|
+
args.output.mkdir(parents=True, exist_ok=True)
|
|
323
|
+
|
|
324
|
+
# Process images
|
|
325
|
+
success, fail = resizer.batch_resize(
|
|
326
|
+
images,
|
|
327
|
+
args.output,
|
|
328
|
+
args.width,
|
|
329
|
+
args.img_height,
|
|
330
|
+
args.strategy,
|
|
331
|
+
args.quality,
|
|
332
|
+
args.format,
|
|
333
|
+
args.watermark,
|
|
334
|
+
args.parallel
|
|
335
|
+
)
|
|
336
|
+
|
|
337
|
+
print(f"\nResults: {success} succeeded, {fail} failed")
|
|
338
|
+
sys.exit(0 if fail == 0 else 1)
|
|
339
|
+
|
|
340
|
+
|
|
341
|
+
if __name__ == '__main__':
|
|
342
|
+
main()
|