opencode-skills-collection 3.1.12 → 3.1.13
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/bundled-skills/.antigravity-install-manifest.json +192 -1
- package/bundled-skills/ab-testing/SKILL.md +368 -0
- package/bundled-skills/ab-testing/evals/evals.json +105 -0
- package/bundled-skills/ab-testing/references/sample-size-guide.md +263 -0
- package/bundled-skills/ab-testing/references/test-templates.md +277 -0
- package/bundled-skills/accint-commitments/SKILL.md +32 -0
- package/bundled-skills/accint-frames/SKILL.md +35 -0
- package/bundled-skills/accint-solve/SKILL.md +22 -192
- package/bundled-skills/add-app-clip/SKILL.md +297 -0
- package/bundled-skills/add-app-clip/agents/openai.yaml +4 -0
- package/bundled-skills/add-app-clip/references/native-module.md +96 -0
- package/bundled-skills/agent-memory/SKILL.md +84 -0
- package/bundled-skills/alternatives-pages/README.md +46 -0
- package/bundled-skills/alternatives-pages/SKILL.md +376 -0
- package/bundled-skills/analytics/SKILL.md +324 -0
- package/bundled-skills/analytics/evals/evals.json +90 -0
- package/bundled-skills/analytics/references/event-library.md +260 -0
- package/bundled-skills/analytics/references/ga4-implementation.md +300 -0
- package/bundled-skills/analytics/references/gtm-implementation.md +390 -0
- package/bundled-skills/anti-deception/SKILL.md +50 -0
- package/bundled-skills/api-analyzer/SKILL.md +101 -0
- package/bundled-skills/api-and-interface-design/SKILL.md +307 -0
- package/bundled-skills/api-designer/SKILL.md +167 -0
- package/bundled-skills/api-integration/SKILL.md +175 -0
- package/bundled-skills/api-onboarding/README.md +47 -0
- package/bundled-skills/api-onboarding/SKILL.md +473 -0
- package/bundled-skills/api-sdk-generator/SKILL.md +223 -0
- package/bundled-skills/appium-skill/SKILL.md +317 -0
- package/bundled-skills/applicationinsights-web-ts/SKILL.md +477 -0
- package/bundled-skills/automated-triage/SKILL.md +189 -0
- package/bundled-skills/aws-agentic-ai/SKILL.md +141 -0
- package/bundled-skills/aws-cdk-development/SKILL.md +275 -0
- package/bundled-skills/aws-cost-operations/SKILL.md +273 -0
- package/bundled-skills/aws-mcp-setup/SKILL.md +192 -0
- package/bundled-skills/aws-serverless-eda/SKILL.md +394 -0
- package/bundled-skills/aws-sst-development/SKILL.md +175 -0
- package/bundled-skills/azure-ai-language-conversations-py/SKILL.md +112 -0
- package/bundled-skills/azure-servicebus-rust/SKILL.md +182 -0
- package/bundled-skills/azure-storage-queue-rust/SKILL.md +178 -0
- package/bundled-skills/baseline-ui/SKILL.md +15 -10
- package/bundled-skills/brooks-audit/SKILL.md +49 -0
- package/bundled-skills/brooks-audit/architecture-guide.md +195 -0
- package/bundled-skills/brooks-audit/onboarding-guide.md +89 -0
- package/bundled-skills/brooks-debt/SKILL.md +42 -0
- package/bundled-skills/brooks-debt/debt-guide.md +125 -0
- package/bundled-skills/brooks-harness/SKILL.md +139 -0
- package/bundled-skills/brooks-review/SKILL.md +42 -0
- package/bundled-skills/brooks-review/pr-review-guide.md +163 -0
- package/bundled-skills/brooks-sweep/SKILL.md +44 -0
- package/bundled-skills/brooks-sweep/sweep-guide.md +264 -0
- package/bundled-skills/brooks-test/SKILL.md +41 -0
- package/bundled-skills/brooks-test/test-guide.md +147 -0
- package/bundled-skills/bug-hunt-swarm/SKILL.md +189 -0
- package/bundled-skills/bug-hunt-swarm/agents/openai.yaml +4 -0
- package/bundled-skills/building-native-ui/SKILL.md +77 -18
- package/bundled-skills/building-native-ui/agents/openai.yaml +4 -0
- package/bundled-skills/building-native-ui/references/animations.md +220 -0
- package/bundled-skills/building-native-ui/references/controls.md +270 -0
- package/bundled-skills/building-native-ui/references/form-sheet.md +253 -0
- package/bundled-skills/building-native-ui/references/gradients.md +106 -0
- package/bundled-skills/building-native-ui/references/icons.md +213 -0
- package/bundled-skills/building-native-ui/references/media.md +198 -0
- package/bundled-skills/building-native-ui/references/route-structure.md +229 -0
- package/bundled-skills/building-native-ui/references/search.md +248 -0
- package/bundled-skills/building-native-ui/references/storage.md +121 -0
- package/bundled-skills/building-native-ui/references/tabs.md +433 -0
- package/bundled-skills/building-native-ui/references/toolbar-and-headers.md +284 -0
- package/bundled-skills/building-native-ui/references/visual-effects.md +197 -0
- package/bundled-skills/building-native-ui/references/webgpu-three.md +605 -0
- package/bundled-skills/building-native-ui/references/zoom-transitions.md +158 -0
- package/bundled-skills/changelog-updates/README.md +53 -0
- package/bundled-skills/changelog-updates/SKILL.md +552 -0
- package/bundled-skills/ci-cd-and-automation/SKILL.md +403 -0
- package/bundled-skills/claimable-postgres/SKILL.md +91 -59
- package/bundled-skills/co-marketing/SKILL.md +301 -0
- package/bundled-skills/co-marketing/evals/evals.json +84 -0
- package/bundled-skills/code-review-and-quality/SKILL.md +394 -0
- package/bundled-skills/code-showcase-core-components/SKILL.md +281 -0
- package/bundled-skills/code-showcase-react-ui-patterns/SKILL.md +306 -0
- package/bundled-skills/code-showcase-systematic-debugging/SKILL.md +167 -0
- package/bundled-skills/code-showcase-testing-patterns/SKILL.md +276 -0
- package/bundled-skills/code-simplification/SKILL.md +344 -0
- package/bundled-skills/community-building/README.md +102 -0
- package/bundled-skills/community-building/SKILL.md +415 -0
- package/bundled-skills/competitor-profiling/SKILL.md +427 -0
- package/bundled-skills/competitor-profiling/evals/evals.json +85 -0
- package/bundled-skills/competitor-profiling/references/templates.md +167 -0
- package/bundled-skills/competitor-profiling/references/tool-reference.md +179 -0
- package/bundled-skills/competitor-tracking/README.md +40 -0
- package/bundled-skills/competitor-tracking/SKILL.md +322 -0
- package/bundled-skills/context-engineering/SKILL.md +302 -0
- package/bundled-skills/cro/SKILL.md +202 -0
- package/bundled-skills/cro/evals/evals.json +111 -0
- package/bundled-skills/cro/references/experiments.md +248 -0
- package/bundled-skills/cro/references/form.md +422 -0
- package/bundled-skills/cucumber-skill/SKILL.md +235 -0
- package/bundled-skills/customer-research/SKILL.md +287 -0
- package/bundled-skills/customer-research/evals/evals.json +162 -0
- package/bundled-skills/customer-research/references/source-guides.md +401 -0
- package/bundled-skills/cypress-skill/SKILL.md +235 -0
- package/bundled-skills/debugging-and-error-recovery/SKILL.md +313 -0
- package/bundled-skills/debugging-code/SKILL.md +284 -0
- package/bundled-skills/debugging-code/references/advanced-techniques.md +50 -0
- package/bundled-skills/debugging-code/references/installing-debuggers.md +67 -0
- package/bundled-skills/debugging-code/scripts/install-dap.sh +87 -0
- package/bundled-skills/deprecation-and-migration/SKILL.md +219 -0
- package/bundled-skills/design-philosophy/SKILL.md +40 -0
- package/bundled-skills/design-philosophy/reference.md +19 -0
- package/bundled-skills/design-spatial/SKILL.md +271 -0
- package/bundled-skills/design-spatial/scripts/layout-audit.js +138 -0
- package/bundled-skills/design-system/SKILL.md +140 -0
- package/bundled-skills/design-system/references/motion-choreography.md +111 -0
- package/bundled-skills/design-thinking/SKILL.md +109 -0
- package/bundled-skills/design-ux/SKILL.md +75 -0
- package/bundled-skills/dev-to-hashnode/README.md +62 -0
- package/bundled-skills/dev-to-hashnode/SKILL.md +399 -0
- package/bundled-skills/developer-advocacy/README.md +102 -0
- package/bundled-skills/developer-advocacy/SKILL.md +423 -0
- package/bundled-skills/developer-audience-context/README.md +61 -0
- package/bundled-skills/developer-audience-context/SKILL.md +271 -0
- package/bundled-skills/developer-audience-context/references/example-apitest.md +175 -0
- package/bundled-skills/developer-audience-context/references/template.md +152 -0
- package/bundled-skills/developer-churn/README.md +80 -0
- package/bundled-skills/developer-churn/SKILL.md +652 -0
- package/bundled-skills/developer-listening/README.md +30 -0
- package/bundled-skills/developer-listening/SKILL.md +232 -0
- package/bundled-skills/developer-newsletter/README.md +84 -0
- package/bundled-skills/developer-newsletter/SKILL.md +376 -0
- package/bundled-skills/developer-onboarding/README.md +35 -0
- package/bundled-skills/developer-onboarding/SKILL.md +530 -0
- package/bundled-skills/developer-sandbox/README.md +47 -0
- package/bundled-skills/developer-sandbox/SKILL.md +504 -0
- package/bundled-skills/developer-seo/README.md +36 -0
- package/bundled-skills/developer-seo/SKILL.md +296 -0
- package/bundled-skills/developer-signup-flow/README.md +36 -0
- package/bundled-skills/developer-signup-flow/SKILL.md +397 -0
- package/bundled-skills/devrel-content/README.md +81 -0
- package/bundled-skills/devrel-content/SKILL.md +428 -0
- package/bundled-skills/docs/integrations/jetski-cortex.md +3 -3
- package/bundled-skills/docs/integrations/jetski-gemini-loader/README.md +1 -1
- package/bundled-skills/docs/maintainers/repo-growth-seo.md +3 -3
- package/bundled-skills/docs/maintainers/skills-update-guide.md +1 -1
- package/bundled-skills/docs/users/bundles.md +1 -1
- package/bundled-skills/docs/users/claude-code-skills.md +1 -1
- package/bundled-skills/docs/users/faq.md +1 -1
- package/bundled-skills/docs/users/gemini-cli-skills.md +1 -1
- package/bundled-skills/docs/users/getting-started.md +1 -1
- package/bundled-skills/docs/users/kiro-integration.md +1 -1
- package/bundled-skills/docs/users/usage.md +8 -8
- package/bundled-skills/docs/users/visual-guide.md +8 -8
- package/bundled-skills/docs-as-marketing/README.md +37 -0
- package/bundled-skills/docs-as-marketing/SKILL.md +398 -0
- package/bundled-skills/documentation-and-adrs/SKILL.md +291 -0
- package/bundled-skills/doubt-driven-development/SKILL.md +256 -0
- package/bundled-skills/eas-update-insights/SKILL.md +232 -0
- package/bundled-skills/eas-update-insights/agents/openai.yaml +4 -0
- package/bundled-skills/eas-update-insights/references/channel-insights-schema.md +47 -0
- package/bundled-skills/eas-update-insights/references/update-insights-schema.md +69 -0
- package/bundled-skills/expo-api-routes/SKILL.md +9 -5
- package/bundled-skills/expo-api-routes/agents/openai.yaml +4 -0
- package/bundled-skills/expo-brownfield/SKILL.md +71 -0
- package/bundled-skills/expo-brownfield/agents/openai.yaml +4 -0
- package/bundled-skills/expo-brownfield/references/brownfield-integrated.md +526 -0
- package/bundled-skills/expo-brownfield/references/brownfield-isolated.md +402 -0
- package/bundled-skills/expo-brownfield/references/comparison.md +63 -0
- package/bundled-skills/expo-brownfield/references/troubleshooting.md +88 -0
- package/bundled-skills/expo-cicd-workflows/SKILL.md +18 -16
- package/bundled-skills/expo-cicd-workflows/agents/openai.yaml +4 -0
- package/bundled-skills/expo-cicd-workflows/scripts/fetch.js +109 -0
- package/bundled-skills/expo-cicd-workflows/scripts/package.json +11 -0
- package/bundled-skills/expo-cicd-workflows/scripts/validate.js +84 -0
- package/bundled-skills/expo-deployment/SKILL.md +157 -53
- package/bundled-skills/expo-deployment/agents/openai.yaml +4 -0
- package/bundled-skills/expo-deployment/references/app-store-metadata.md +497 -0
- package/bundled-skills/expo-deployment/references/ios-app-store.md +371 -0
- package/bundled-skills/expo-deployment/references/play-store.md +246 -0
- package/bundled-skills/expo-deployment/references/testflight.md +58 -0
- package/bundled-skills/expo-deployment/references/workflows.md +160 -0
- package/bundled-skills/expo-dev-client/SKILL.md +25 -14
- package/bundled-skills/expo-dev-client/agents/openai.yaml +4 -0
- package/bundled-skills/expo-examples/SKILL.md +111 -0
- package/bundled-skills/expo-examples/references/catalog.md +105 -0
- package/bundled-skills/expo-module/SKILL.md +152 -0
- package/bundled-skills/expo-module/agents/openai.yaml +4 -0
- package/bundled-skills/expo-module/references/config-plugin.md +90 -0
- package/bundled-skills/expo-module/references/create-expo-module.md +206 -0
- package/bundled-skills/expo-module/references/lifecycle.md +127 -0
- package/bundled-skills/expo-module/references/module-config.md +48 -0
- package/bundled-skills/expo-module/references/native-module.md +286 -0
- package/bundled-skills/expo-module/references/native-view.md +171 -0
- package/bundled-skills/expo-observe/SKILL.md +44 -0
- package/bundled-skills/expo-observe/references/metrics.md +47 -0
- package/bundled-skills/expo-observe/references/queries.md +342 -0
- package/bundled-skills/expo-observe/references/setup.md +255 -0
- package/bundled-skills/expo-tailwind-setup/SKILL.md +13 -10
- package/bundled-skills/expo-tailwind-setup/agents/openai.yaml +4 -0
- package/bundled-skills/expo-ui/SKILL.md +61 -0
- package/bundled-skills/expo-ui/agents/openai.yaml +4 -0
- package/bundled-skills/expo-ui/references/drop-in-replacements.md +27 -0
- package/bundled-skills/expo-ui/references/jetpack-compose.md +73 -0
- package/bundled-skills/expo-ui/references/swift-ui.md +73 -0
- package/bundled-skills/expo-ui/references/universal.md +73 -0
- package/bundled-skills/expo-ui/scripts/list-components.js +193 -0
- package/bundled-skills/faf-context/SKILL.md +106 -0
- package/bundled-skills/faf-go/SKILL.md +336 -0
- package/bundled-skills/fixing-accessibility/SKILL.md +16 -5
- package/bundled-skills/fixing-metadata/SKILL.md +18 -8
- package/bundled-skills/fixing-motion-performance/SKILL.md +17 -6
- package/bundled-skills/formik-patterns/SKILL.md +379 -0
- package/bundled-skills/free-tier-strategy/README.md +39 -0
- package/bundled-skills/free-tier-strategy/SKILL.md +462 -0
- package/bundled-skills/frontend-architecture/SKILL.md +419 -0
- package/bundled-skills/frontend-data-contracts/SKILL.md +331 -0
- package/bundled-skills/frontend-observability/SKILL.md +434 -0
- package/bundled-skills/frontend-optimistic-mutations/SKILL.md +278 -0
- package/bundled-skills/frontend-seo/SKILL.md +710 -0
- package/bundled-skills/frontend-slides-frontend-slides/SKILL.md +397 -0
- package/bundled-skills/frontend-ui-engineering/SKILL.md +341 -0
- package/bundled-skills/gemini-api-dev/SKILL.md +96 -53
- package/bundled-skills/gemini-live-api-dev/SKILL.md +339 -0
- package/bundled-skills/gemini-omni-flash-api/SKILL.md +335 -0
- package/bundled-skills/gemini-omni-flash-api/scripts/upload_file.py +218 -0
- package/bundled-skills/gemini-omni-flash-api/scripts/video/generate_video.py +439 -0
- package/bundled-skills/gemini-omni-flash-api/scripts/video/inspect_video.py +197 -0
- package/bundled-skills/gemini-omni-flash-api/scripts/video/prep_video.py +255 -0
- package/bundled-skills/git-workflow-and-versioning/SKILL.md +313 -0
- package/bundled-skills/github-presence/README.md +67 -0
- package/bundled-skills/github-presence/SKILL.md +484 -0
- package/bundled-skills/graphql-schema/SKILL.md +309 -0
- package/bundled-skills/hf-mcp/SKILL.md +195 -0
- package/bundled-skills/hf-mem/SKILL.md +92 -0
- package/bundled-skills/hugging-face-cli/SKILL.md +155 -115
- package/bundled-skills/hugging-face-community-evals/SKILL.md +14 -7
- package/bundled-skills/hugging-face-dataset-viewer/SKILL.md +30 -37
- package/bundled-skills/hugging-face-gradio/SKILL.md +14 -7
- package/bundled-skills/hugging-face-model-trainer/SKILL.md +36 -10
- package/bundled-skills/hugging-face-model-trainer/scripts/convert_to_gguf.py +30 -52
- package/bundled-skills/hugging-face-model-trainer/scripts/hf_benchmarks.py +659 -0
- package/bundled-skills/hugging-face-paper-publisher/SKILL.md +13 -6
- package/bundled-skills/hugging-face-papers/SKILL.md +12 -5
- package/bundled-skills/hugging-face-trackio/SKILL.md +11 -5
- package/bundled-skills/hugging-face-vision-trainer/SKILL.md +11 -5
- package/bundled-skills/huggingface-best/SKILL.md +143 -0
- package/bundled-skills/huggingface-local-models/SKILL.md +130 -0
- package/bundled-skills/huggingface-local-models/references/hardware.md +38 -0
- package/bundled-skills/huggingface-local-models/references/hub-discovery.md +178 -0
- package/bundled-skills/huggingface-local-models/references/quantization.md +256 -0
- package/bundled-skills/huggingface-lora-space-builder/SKILL.md +409 -0
- package/bundled-skills/huggingface-lora-space-builder/references/adapting-to-the-lora.md +113 -0
- package/bundled-skills/huggingface-lora-space-builder/references/base-models/krea-2.md +63 -0
- package/bundled-skills/huggingface-lora-space-builder/references/base-models/ltx.md +205 -0
- package/bundled-skills/huggingface-lora-space-builder/references/base-models/qwen-image.md +144 -0
- package/bundled-skills/huggingface-lora-space-builder/references/creative-mode.md +262 -0
- package/bundled-skills/huggingface-lora-space-builder/references/tasks.md +124 -0
- package/bundled-skills/huggingface-lora-space-builder/references/zerogpu-and-publishing.md +194 -0
- package/bundled-skills/huggingface-spaces/SKILL.md +247 -0
- package/bundled-skills/huggingface-spaces/references/buckets.md +89 -0
- package/bundled-skills/huggingface-spaces/references/debugging.md +234 -0
- package/bundled-skills/huggingface-spaces/references/gradio.md +171 -0
- package/bundled-skills/huggingface-spaces/references/grants.md +56 -0
- package/bundled-skills/huggingface-spaces/references/inference-providers.md +85 -0
- package/bundled-skills/huggingface-spaces/references/known-errors.md +232 -0
- package/bundled-skills/huggingface-spaces/references/requirements.md +153 -0
- package/bundled-skills/huggingface-spaces/references/zerogpu.md +276 -0
- package/bundled-skills/huggingface-tool-builder/SKILL.md +137 -0
- package/bundled-skills/huggingface-tool-builder/references/baseline_hf_api.py +57 -0
- package/bundled-skills/huggingface-tool-builder/references/baseline_hf_api.sh +40 -0
- package/bundled-skills/huggingface-tool-builder/references/baseline_hf_api.tsx +57 -0
- package/bundled-skills/huggingface-tool-builder/references/find_models_by_paper.sh +230 -0
- package/bundled-skills/huggingface-tool-builder/references/hf_enrich_models.sh +96 -0
- package/bundled-skills/huggingface-tool-builder/references/hf_model_card_frontmatter.sh +188 -0
- package/bundled-skills/huggingface-tool-builder/references/hf_model_papers_auth.sh +171 -0
- package/bundled-skills/huggingface-zerogpu/SKILL.md +306 -0
- package/bundled-skills/huggingface-zerogpu/references/concurrency.md +79 -0
- package/bundled-skills/huggingface-zerogpu/references/cuda-and-deps.md +66 -0
- package/bundled-skills/huggingface-zerogpu/references/how-quota-works.md +74 -0
- package/bundled-skills/huggingface-zerogpu/references/how-zerogpu-works.md +50 -0
- package/bundled-skills/hugo-to-markdown/SKILL.md +201 -0
- package/bundled-skills/hugo-to-markdown/agents/openai.yaml +4 -0
- package/bundled-skills/hugo-to-markdown/references/conversion-workflow.md +143 -0
- package/bundled-skills/hugo-to-markdown/references/front-matter-and-content.md +145 -0
- package/bundled-skills/hugo-to-markdown/references/links-assets-and-validation.md +106 -0
- package/bundled-skills/hugo-to-markdown/references/shortcodes-and-render-hooks.md +281 -0
- package/bundled-skills/hugo-to-markdown/scripts/check_standard_markdown.py +70 -0
- package/bundled-skills/hugo-to-markdown/scripts/inventory_hugo_rules.py +188 -0
- package/bundled-skills/hyperexecute-skill/SKILL.md +65 -0
- package/bundled-skills/idea-refine/SKILL.md +195 -0
- package/bundled-skills/idea-refine/examples.md +238 -0
- package/bundled-skills/idea-refine/frameworks.md +99 -0
- package/bundled-skills/idea-refine/refinement-criteria.md +113 -0
- package/bundled-skills/idea-refine/scripts/idea-refine.sh +15 -0
- package/bundled-skills/implement/SKILL.md +32 -0
- package/bundled-skills/incremental-implementation/SKILL.md +262 -0
- package/bundled-skills/jest-skill/SKILL.md +182 -0
- package/bundled-skills/junit-5-skill/SKILL.md +236 -0
- package/bundled-skills/logic-diff/SKILL.md +50 -0
- package/bundled-skills/logic-diff/logic-diff-guide.md +75 -0
- package/bundled-skills/logic-explain/SKILL.md +50 -0
- package/bundled-skills/logic-explain/logic-explain-guide.md +74 -0
- package/bundled-skills/logic-fix-all/SKILL.md +87 -0
- package/bundled-skills/logic-fix-all/guide-phases-0-2-consent-scope-health.md +113 -0
- package/bundled-skills/logic-fix-all/guide-phases-3-5-review-locate-clarify.md +47 -0
- package/bundled-skills/logic-fix-all/guide-phases-6-9-fix-iterate-report.md +143 -0
- package/bundled-skills/logic-fix-all/logic-fix-all-guide.md +60 -0
- package/bundled-skills/logic-locate/SKILL.md +52 -0
- package/bundled-skills/logic-locate/logic-locate-guide.md +85 -0
- package/bundled-skills/logic-review/SKILL.md +100 -0
- package/bundled-skills/logic-review/logic-review-guide.md +296 -0
- package/bundled-skills/longbridge-content/SKILL.md +87 -0
- package/bundled-skills/longbridge-fundamentals/SKILL.md +134 -0
- package/bundled-skills/longbridge-market-data/SKILL.md +129 -0
- package/bundled-skills/loopy/SKILL.md +289 -0
- package/bundled-skills/loopy/agents/openai.yaml +4 -0
- package/bundled-skills/loopy/references/audit.md +61 -0
- package/bundled-skills/loopy/references/debrief.md +43 -0
- package/bundled-skills/loopy/references/discover.md +72 -0
- package/bundled-skills/loopy/references/publish.md +65 -0
- package/bundled-skills/loopy/references/run.md +73 -0
- package/bundled-skills/marketing-plan/SKILL.md +283 -0
- package/bundled-skills/marketing-plan/evals/evals.json +96 -0
- package/bundled-skills/marketing-plan/references/aarrr-framework.md +180 -0
- package/bundled-skills/marketing-plan/references/budget-planning.md +168 -0
- package/bundled-skills/marketing-plan/references/client-types.md +373 -0
- package/bundled-skills/marketing-plan/references/current-state-rubric.md +255 -0
- package/bundled-skills/marketing-plan/references/example-quietude.md +972 -0
- package/bundled-skills/marketing-plan/references/funding-stage-unlocks.md +230 -0
- package/bundled-skills/marketing-plan/references/growth-patterns.md +148 -0
- package/bundled-skills/marketing-plan/references/idea-cross-reference.md +265 -0
- package/bundled-skills/marketing-plan/references/measurement-framework.md +213 -0
- package/bundled-skills/marketing-plan/references/methodology.md +363 -0
- package/bundled-skills/marketing-plan/references/ops-stack-mapping.md +197 -0
- package/bundled-skills/marketing-plan/references/plan-template.md +494 -0
- package/bundled-skills/marketing-plan/references/team-and-agency-model.md +278 -0
- package/bundled-skills/monte-carlo-analyze-root-cause/SKILL.md +229 -0
- package/bundled-skills/monte-carlo-asset-health/SKILL.md +200 -0
- package/bundled-skills/monte-carlo-monitoring-advisor/SKILL.md +317 -0
- package/bundled-skills/monte-carlo-performance-diagnosis/SKILL.md +153 -0
- package/bundled-skills/monte-carlo-remediation/SKILL.md +359 -0
- package/bundled-skills/monte-carlo-storage-cost-analysis/SKILL.md +162 -0
- package/bundled-skills/native-data-fetching/SKILL.md +11 -8
- package/bundled-skills/native-data-fetching/agents/openai.yaml +4 -0
- package/bundled-skills/native-data-fetching/references/expo-router-loaders.md +341 -0
- package/bundled-skills/neon-ai-gateway/SKILL.md +237 -0
- package/bundled-skills/neon-functions/SKILL.md +465 -0
- package/bundled-skills/neon-functions/references/ai-sdk.md +139 -0
- package/bundled-skills/neon-functions/references/hono-websockets.md +145 -0
- package/bundled-skills/neon-functions/references/mastra-studio.md +132 -0
- package/bundled-skills/neon-functions/references/mcp.md +137 -0
- package/bundled-skills/neon-functions/references/sentry.md +131 -0
- package/bundled-skills/neon-functions/references/sse.md +143 -0
- package/bundled-skills/neon-object-storage/SKILL.md +200 -0
- package/bundled-skills/neon-postgres/SKILL.md +234 -469
- package/bundled-skills/neon-postgres-branches/SKILL.md +292 -0
- package/bundled-skills/neon-postgres-egress-optimizer/SKILL.md +256 -0
- package/bundled-skills/newman-cicd-integration/SKILL.md +330 -0
- package/bundled-skills/observability-and-instrumentation/SKILL.md +216 -0
- package/bundled-skills/odw/SKILL.md +57 -0
- package/bundled-skills/offers/SKILL.md +168 -0
- package/bundled-skills/offers/references/bonus-stacking.md +150 -0
- package/bundled-skills/offers/references/examples.md +215 -0
- package/bundled-skills/offers/references/guarantee-design.md +172 -0
- package/bundled-skills/offers/references/offer-anatomy.md +203 -0
- package/bundled-skills/offers/references/offer-formats.md +240 -0
- package/bundled-skills/offers/references/scarcity-urgency.md +175 -0
- package/bundled-skills/offers/references/value-equation.md +134 -0
- package/bundled-skills/onboarding/SKILL.md +235 -0
- package/bundled-skills/onboarding/evals/evals.json +92 -0
- package/bundled-skills/onboarding/references/experiments.md +258 -0
- package/bundled-skills/open-source-marketing/README.md +100 -0
- package/bundled-skills/open-source-marketing/SKILL.md +466 -0
- package/bundled-skills/openapi-spec-generator/SKILL.md +335 -0
- package/bundled-skills/performance-optimization/SKILL.md +363 -0
- package/bundled-skills/planning-and-task-breakdown/SKILL.md +240 -0
- package/bundled-skills/polis-protocol-a-self-optimizing-city-of-agents/SKILL.md +170 -0
- package/bundled-skills/postgresql-cli/SKILL.md +498 -0
- package/bundled-skills/postgresql-cli/references/cli-options-and-variables.md +444 -0
- package/bundled-skills/postgresql-cli/references/meta-commands-core.md +466 -0
- package/bundled-skills/postgresql-cli/references/meta-commands-formatting.md +154 -0
- package/bundled-skills/postgresql-cli/references/meta-commands-inspection.md +134 -0
- package/bundled-skills/postgresql-cli/references/tips-advanced.md +289 -0
- package/bundled-skills/postgresql-cli/references/tips-workflows.md +407 -0
- package/bundled-skills/postman-collection-generator/SKILL.md +184 -0
- package/bundled-skills/postman-newman-automation/SKILL.md +311 -0
- package/bundled-skills/postman-openapi-converter/SKILL.md +174 -0
- package/bundled-skills/power-user-cultivation/README.md +78 -0
- package/bundled-skills/power-user-cultivation/SKILL.md +598 -0
- package/bundled-skills/pricing/SKILL.md +246 -0
- package/bundled-skills/pricing/evals/evals.json +90 -0
- package/bundled-skills/pricing/references/research-methods.md +152 -0
- package/bundled-skills/pricing/references/tier-structure.md +232 -0
- package/bundled-skills/privacy-mask/SKILL.md +96 -0
- package/bundled-skills/product-marketing/SKILL.md +256 -0
- package/bundled-skills/product-marketing/evals/evals.json +85 -0
- package/bundled-skills/public-relations/SKILL.md +146 -0
- package/bundled-skills/public-relations/references/journalist-pitching.md +368 -0
- package/bundled-skills/public-relations/references/media-outlets.md +207 -0
- package/bundled-skills/public-relations/references/newsjacking.md +218 -0
- package/bundled-skills/public-relations/references/press-platforms.md +188 -0
- package/bundled-skills/puppeteer-skill/SKILL.md +143 -0
- package/bundled-skills/pytest-skill/SKILL.md +201 -0
- package/bundled-skills/rclone-cli/SKILL.md +351 -0
- package/bundled-skills/rclone-cli/references/bisync.md +2003 -0
- package/bundled-skills/rclone-cli/references/cache.md +726 -0
- package/bundled-skills/rclone-cli/references/chunker.md +484 -0
- package/bundled-skills/rclone-cli/references/combine.md +187 -0
- package/bundled-skills/rclone-cli/references/commands/rclone.md +1169 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_about.md +89 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_archive.md +49 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_archive_create.md +97 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_archive_extract.md +83 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_archive_list.md +98 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_authorize.md +53 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_backend.md +82 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_bisync.md +160 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_cat.md +122 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_check.md +134 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_checksum.md +120 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_cleanup.md +49 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_completion.md +40 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_completion_bash.md +70 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_completion_fish.md +57 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_completion_powershell.md +49 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_completion_zsh.md +57 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_config.md +56 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_config_create.md +150 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_config_delete.md +33 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_config_disconnect.md +40 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_config_dump.md +33 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_config_edit.md +39 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_config_encryption.md +36 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_config_encryption_check.md +43 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_config_encryption_remove.md +44 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_config_encryption_set.md +54 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_config_file.md +33 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_config_password.md +49 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_config_paths.md +33 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_config_providers.md +33 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_config_reconnect.md +40 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_config_redacted.md +45 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_config_show.md +33 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_config_string.md +57 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_config_touch.md +33 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_config_update.md +150 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_config_userinfo.md +38 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_convmv.md +440 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_copy.md +258 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_copyto.md +219 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_copyurl.md +91 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_cryptcheck.md +141 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_cryptdecode.md +51 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_dedupe.md +166 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_delete.md +117 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_deletefile.md +50 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_gendocs.md +39 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_gitannex.md +113 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_hashsum.md +120 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_link.md +60 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_listremotes.md +55 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_ls.md +114 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_lsd.md +127 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_lsf.md +241 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_lsjson.md +195 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_lsl.md +115 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_md5sum.md +96 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_mkdir.md +43 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_mount.md +1105 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_move.md +223 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_moveto.md +218 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_ncdu.md +140 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_nfsmount.md +1111 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_obscure.md +60 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_purge.md +58 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_rc.md +111 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_rcat.md +79 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_rcd.md +219 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_rmdir.md +52 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_rmdirs.md +66 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_selfupdate.md +91 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_serve.md +61 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_serve_dlna.md +619 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_serve_docker.md +653 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_serve_ftp.md +698 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_serve_http.md +837 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_serve_nfs.md +670 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_serve_restic.md +246 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_serve_s3.md +867 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_serve_sftp.md +745 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_serve_webdav.md +896 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_settier.md +63 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_sha1sum.md +99 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_size.md +94 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_sync.md +252 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_test.md +51 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_test_changenotify.md +34 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_test_histogram.md +41 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_test_info.md +51 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_test_makefile.md +39 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_test_makefiles.md +47 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_test_memory.md +33 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_test_speed.md +66 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_touch.md +110 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_tree.md +121 -0
- package/bundled-skills/rclone-cli/references/commands/rclone_version.md +83 -0
- package/bundled-skills/rclone-cli/references/crypt.md +844 -0
- package/bundled-skills/rclone-cli/references/docker.md +615 -0
- package/bundled-skills/rclone-cli/references/faq.md +364 -0
- package/bundled-skills/rclone-cli/references/filtering.md +991 -0
- package/bundled-skills/rclone-cli/references/flags.md +1221 -0
- package/bundled-skills/rclone-cli/references/hasher.md +383 -0
- package/bundled-skills/rclone-cli/references/install.md +686 -0
- package/bundled-skills/rclone-cli/references/overview.md +620 -0
- package/bundled-skills/rclone-cli/references/providers/alias.md +141 -0
- package/bundled-skills/rclone-cli/references/providers/archive.md +287 -0
- package/bundled-skills/rclone-cli/references/providers/azureblob.md +1140 -0
- package/bundled-skills/rclone-cli/references/providers/azurefiles.md +834 -0
- package/bundled-skills/rclone-cli/references/providers/b2.md +879 -0
- package/bundled-skills/rclone-cli/references/providers/box.md +573 -0
- package/bundled-skills/rclone-cli/references/providers/cloudinary.md +259 -0
- package/bundled-skills/rclone-cli/references/providers/compress.md +222 -0
- package/bundled-skills/rclone-cli/references/providers/drime.md +319 -0
- package/bundled-skills/rclone-cli/references/providers/drive.md +2032 -0
- package/bundled-skills/rclone-cli/references/providers/dropbox.md +661 -0
- package/bundled-skills/rclone-cli/references/providers/fichier.md +230 -0
- package/bundled-skills/rclone-cli/references/providers/filefabric.md +298 -0
- package/bundled-skills/rclone-cli/references/providers/filelu.md +256 -0
- package/bundled-skills/rclone-cli/references/providers/filen.md +243 -0
- package/bundled-skills/rclone-cli/references/providers/filescom.md +209 -0
- package/bundled-skills/rclone-cli/references/providers/ftp.md +621 -0
- package/bundled-skills/rclone-cli/references/providers/gofile.md +274 -0
- package/bundled-skills/rclone-cli/references/providers/googlecloudstorage.md +846 -0
- package/bundled-skills/rclone-cli/references/providers/googlephotos.md +676 -0
- package/bundled-skills/rclone-cli/references/providers/hdfs.md +263 -0
- package/bundled-skills/rclone-cli/references/providers/hidrive.md +487 -0
- package/bundled-skills/rclone-cli/references/providers/http.md +323 -0
- package/bundled-skills/rclone-cli/references/providers/iclouddrive.md +212 -0
- package/bundled-skills/rclone-cli/references/providers/internetarchive.md +355 -0
- package/bundled-skills/rclone-cli/references/providers/internxt.md +189 -0
- package/bundled-skills/rclone-cli/references/providers/jottacloud.md +604 -0
- package/bundled-skills/rclone-cli/references/providers/koofr.md +395 -0
- package/bundled-skills/rclone-cli/references/providers/linkbox.md +117 -0
- package/bundled-skills/rclone-cli/references/providers/local.md +749 -0
- package/bundled-skills/rclone-cli/references/providers/mailru.md +470 -0
- package/bundled-skills/rclone-cli/references/providers/mega.md +361 -0
- package/bundled-skills/rclone-cli/references/providers/memory.md +109 -0
- package/bundled-skills/rclone-cli/references/providers/netstorage.md +371 -0
- package/bundled-skills/rclone-cli/references/providers/onedrive.md +1322 -0
- package/bundled-skills/rclone-cli/references/providers/opendrive.md +222 -0
- package/bundled-skills/rclone-cli/references/providers/oracleobjectstorage/_index.md +932 -0
- package/bundled-skills/rclone-cli/references/providers/oracleobjectstorage/tutorial_mount.md +503 -0
- package/bundled-skills/rclone-cli/references/providers/pcloud.md +373 -0
- package/bundled-skills/rclone-cli/references/providers/pikpak.md +373 -0
- package/bundled-skills/rclone-cli/references/providers/pixeldrain.md +182 -0
- package/bundled-skills/rclone-cli/references/providers/premiumizeme.md +253 -0
- package/bundled-skills/rclone-cli/references/providers/protondrive.md +397 -0
- package/bundled-skills/rclone-cli/references/providers/putio.md +246 -0
- package/bundled-skills/rclone-cli/references/providers/qingstor.md +346 -0
- package/bundled-skills/rclone-cli/references/providers/quatrix.md +295 -0
- package/bundled-skills/rclone-cli/references/providers/s3.md +9687 -0
- package/bundled-skills/rclone-cli/references/providers/seafile.md +432 -0
- package/bundled-skills/rclone-cli/references/providers/sftp.md +1277 -0
- package/bundled-skills/rclone-cli/references/providers/shade.md +267 -0
- package/bundled-skills/rclone-cli/references/providers/sharefile.md +357 -0
- package/bundled-skills/rclone-cli/references/providers/sia.md +223 -0
- package/bundled-skills/rclone-cli/references/providers/smb.md +309 -0
- package/bundled-skills/rclone-cli/references/providers/storj.md +503 -0
- package/bundled-skills/rclone-cli/references/providers/sugarsync.md +305 -0
- package/bundled-skills/rclone-cli/references/providers/swift.md +744 -0
- package/bundled-skills/rclone-cli/references/providers/ulozto.md +283 -0
- package/bundled-skills/rclone-cli/references/providers/webdav.md +565 -0
- package/bundled-skills/rclone-cli/references/providers/yandex.md +283 -0
- package/bundled-skills/rclone-cli/references/providers/zoho.md +305 -0
- package/bundled-skills/rclone-cli/references/rc.md +2725 -0
- package/bundled-skills/rclone-cli/references/union.md +336 -0
- package/bundled-skills/rclone-cli/references/usage.md +3555 -0
- package/bundled-skills/rclone-cli/scripts/install.sh +204 -0
- package/bundled-skills/redis-cli/SKILL.md +392 -0
- package/bundled-skills/redis-cli/references/advanced-features.md +338 -0
- package/bundled-skills/redis-cli/references/connection-and-options.md +258 -0
- package/bundled-skills/redis-cli/references/data-query-commands.md +417 -0
- package/bundled-skills/redis-cli/references/inspection-and-monitoring.md +309 -0
- package/bundled-skills/redis-cli/references/key-management.md +252 -0
- package/bundled-skills/redis-cli/references/module-data-types.md +429 -0
- package/bundled-skills/redis-cli/references/server-administration.md +366 -0
- package/bundled-skills/repo-maintainer/SKILL.md +480 -0
- package/bundled-skills/resolving-merge-conflicts/SKILL.md +32 -0
- package/bundled-skills/review-and-simplify-changes/SKILL.md +202 -0
- package/bundled-skills/review-swarm/SKILL.md +185 -0
- package/bundled-skills/review-swarm/agents/openai.yaml +4 -0
- package/bundled-skills/riffkit/SKILL.md +122 -0
- package/bundled-skills/robot-framework-skill/SKILL.md +153 -0
- package/bundled-skills/sdk-dx/README.md +39 -0
- package/bundled-skills/sdk-dx/SKILL.md +541 -0
- package/bundled-skills/security-and-hardening/SKILL.md +474 -0
- package/bundled-skills/selenium-skill/SKILL.md +258 -0
- package/bundled-skills/shipping-and-launch/SKILL.md +323 -0
- package/bundled-skills/smartui-skill/SKILL.md +149 -0
- package/bundled-skills/source-driven-development/SKILL.md +207 -0
- package/bundled-skills/spec-driven-development/SKILL.md +217 -0
- package/bundled-skills/styleseed-design-review/SKILL.md +126 -0
- package/bundled-skills/supabase/CHANGELOG.md +35 -0
- package/bundled-skills/supabase/SKILL.md +149 -0
- package/bundled-skills/supabase/assets/feedback-issue-template.md +17 -0
- package/bundled-skills/supabase/references/skill-feedback.md +17 -0
- package/bundled-skills/supabase-postgres-best-practices/CHANGELOG.md +29 -0
- package/bundled-skills/supabase-postgres-best-practices/SKILL.md +74 -0
- package/bundled-skills/supabase-postgres-best-practices/references/_contributing.md +170 -0
- package/bundled-skills/supabase-postgres-best-practices/references/_sections.md +39 -0
- package/bundled-skills/supabase-postgres-best-practices/references/_template.md +34 -0
- package/bundled-skills/supabase-postgres-best-practices/references/advanced-full-text-search.md +55 -0
- package/bundled-skills/supabase-postgres-best-practices/references/advanced-jsonb-indexing.md +49 -0
- package/bundled-skills/supabase-postgres-best-practices/references/conn-idle-timeout.md +46 -0
- package/bundled-skills/supabase-postgres-best-practices/references/conn-limits.md +44 -0
- package/bundled-skills/supabase-postgres-best-practices/references/conn-pooling.md +41 -0
- package/bundled-skills/supabase-postgres-best-practices/references/conn-prepared-statements.md +46 -0
- package/bundled-skills/supabase-postgres-best-practices/references/data-batch-inserts.md +54 -0
- package/bundled-skills/supabase-postgres-best-practices/references/data-n-plus-one.md +53 -0
- package/bundled-skills/supabase-postgres-best-practices/references/data-pagination.md +50 -0
- package/bundled-skills/supabase-postgres-best-practices/references/data-upsert.md +50 -0
- package/bundled-skills/supabase-postgres-best-practices/references/lock-advisory.md +56 -0
- package/bundled-skills/supabase-postgres-best-practices/references/lock-deadlock-prevention.md +68 -0
- package/bundled-skills/supabase-postgres-best-practices/references/lock-short-transactions.md +50 -0
- package/bundled-skills/supabase-postgres-best-practices/references/lock-skip-locked.md +54 -0
- package/bundled-skills/supabase-postgres-best-practices/references/monitor-explain-analyze.md +45 -0
- package/bundled-skills/supabase-postgres-best-practices/references/monitor-pg-stat-statements.md +55 -0
- package/bundled-skills/supabase-postgres-best-practices/references/monitor-vacuum-analyze.md +55 -0
- package/bundled-skills/supabase-postgres-best-practices/references/query-composite-indexes.md +44 -0
- package/bundled-skills/supabase-postgres-best-practices/references/query-covering-indexes.md +40 -0
- package/bundled-skills/supabase-postgres-best-practices/references/query-index-types.md +48 -0
- package/bundled-skills/supabase-postgres-best-practices/references/query-missing-indexes.md +43 -0
- package/bundled-skills/supabase-postgres-best-practices/references/query-partial-indexes.md +45 -0
- package/bundled-skills/supabase-postgres-best-practices/references/schema-constraints.md +80 -0
- package/bundled-skills/supabase-postgres-best-practices/references/schema-data-types.md +46 -0
- package/bundled-skills/supabase-postgres-best-practices/references/schema-foreign-key-indexes.md +59 -0
- package/bundled-skills/supabase-postgres-best-practices/references/schema-lowercase-identifiers.md +55 -0
- package/bundled-skills/supabase-postgres-best-practices/references/schema-partitioning.md +55 -0
- package/bundled-skills/supabase-postgres-best-practices/references/schema-primary-keys.md +61 -0
- package/bundled-skills/supabase-postgres-best-practices/references/security-privileges.md +54 -0
- package/bundled-skills/supabase-postgres-best-practices/references/security-rls-basics.md +50 -0
- package/bundled-skills/supabase-postgres-best-practices/references/security-rls-performance.md +63 -0
- package/bundled-skills/swiftui-expert-skill/SKILL.md +175 -242
- package/bundled-skills/swiftui-expert-skill/references/accessibility-patterns.md +215 -0
- package/bundled-skills/swiftui-expert-skill/references/animation-advanced.md +428 -0
- package/bundled-skills/swiftui-expert-skill/references/animation-basics.md +284 -0
- package/bundled-skills/swiftui-expert-skill/references/animation-transitions.md +326 -0
- package/bundled-skills/swiftui-expert-skill/references/charts-accessibility.md +135 -0
- package/bundled-skills/swiftui-expert-skill/references/charts.md +602 -0
- package/bundled-skills/swiftui-expert-skill/references/focus-patterns.md +299 -0
- package/bundled-skills/swiftui-expert-skill/references/image-optimization.md +203 -0
- package/bundled-skills/swiftui-expert-skill/references/latest-apis.md +528 -0
- package/bundled-skills/swiftui-expert-skill/references/layout-best-practices.md +266 -0
- package/bundled-skills/swiftui-expert-skill/references/liquid-glass.md +423 -0
- package/bundled-skills/swiftui-expert-skill/references/list-patterns.md +467 -0
- package/bundled-skills/swiftui-expert-skill/references/localization.md +194 -0
- package/bundled-skills/swiftui-expert-skill/references/macos-scenes.md +318 -0
- package/bundled-skills/swiftui-expert-skill/references/macos-views.md +357 -0
- package/bundled-skills/swiftui-expert-skill/references/macos-window-styling.md +303 -0
- package/bundled-skills/swiftui-expert-skill/references/performance-patterns.md +417 -0
- package/bundled-skills/swiftui-expert-skill/references/previews.md +313 -0
- package/bundled-skills/swiftui-expert-skill/references/scroll-patterns.md +293 -0
- package/bundled-skills/swiftui-expert-skill/references/sheet-navigation-patterns.md +363 -0
- package/bundled-skills/swiftui-expert-skill/references/soft-deprecation.md +39 -0
- package/bundled-skills/swiftui-expert-skill/references/state-management.md +492 -0
- package/bundled-skills/swiftui-expert-skill/references/text-patterns.md +34 -0
- package/bundled-skills/swiftui-expert-skill/references/trace-analysis.md +295 -0
- package/bundled-skills/swiftui-expert-skill/references/trace-recording.md +134 -0
- package/bundled-skills/swiftui-expert-skill/references/view-structure.md +854 -0
- package/bundled-skills/swiftui-expert-skill/scripts/analyze_trace.py +301 -0
- package/bundled-skills/swiftui-expert-skill/scripts/instruments_parser/__init__.py +1 -0
- package/bundled-skills/swiftui-expert-skill/scripts/instruments_parser/causes.py +187 -0
- package/bundled-skills/swiftui-expert-skill/scripts/instruments_parser/correlate.py +179 -0
- package/bundled-skills/swiftui-expert-skill/scripts/instruments_parser/events.py +291 -0
- package/bundled-skills/swiftui-expert-skill/scripts/instruments_parser/hangs.py +108 -0
- package/bundled-skills/swiftui-expert-skill/scripts/instruments_parser/hitches.py +145 -0
- package/bundled-skills/swiftui-expert-skill/scripts/instruments_parser/summary.py +243 -0
- package/bundled-skills/swiftui-expert-skill/scripts/instruments_parser/swiftui.py +195 -0
- package/bundled-skills/swiftui-expert-skill/scripts/instruments_parser/time_profiler.py +135 -0
- package/bundled-skills/swiftui-expert-skill/scripts/instruments_parser/xctrace.py +117 -0
- package/bundled-skills/swiftui-expert-skill/scripts/instruments_parser/xml_utils.py +224 -0
- package/bundled-skills/swiftui-expert-skill/scripts/record_trace.py +252 -0
- package/bundled-skills/technical-tutorials/README.md +90 -0
- package/bundled-skills/technical-tutorials/SKILL.md +581 -0
- package/bundled-skills/test-framework-migration-skill/SKILL.md +122 -0
- package/bundled-skills/testng-skill/SKILL.md +163 -0
- package/bundled-skills/train-sentence-transformers/SKILL.md +118 -0
- package/bundled-skills/train-sentence-transformers/references/base_model_selection.md +79 -0
- package/bundled-skills/train-sentence-transformers/references/dataset_formats.md +128 -0
- package/bundled-skills/train-sentence-transformers/references/evaluators_cross_encoder.md +116 -0
- package/bundled-skills/train-sentence-transformers/references/evaluators_sentence_transformer.md +151 -0
- package/bundled-skills/train-sentence-transformers/references/evaluators_sparse_encoder.md +121 -0
- package/bundled-skills/train-sentence-transformers/references/hardware_guide.md +105 -0
- package/bundled-skills/train-sentence-transformers/references/hf_jobs_execution.md +173 -0
- package/bundled-skills/train-sentence-transformers/references/losses_cross_encoder.md +137 -0
- package/bundled-skills/train-sentence-transformers/references/losses_sentence_transformer.md +246 -0
- package/bundled-skills/train-sentence-transformers/references/losses_sparse_encoder.md +106 -0
- package/bundled-skills/train-sentence-transformers/references/model_architectures.md +178 -0
- package/bundled-skills/train-sentence-transformers/references/prompts_and_instructions.md +160 -0
- package/bundled-skills/train-sentence-transformers/references/training_args.md +269 -0
- package/bundled-skills/train-sentence-transformers/references/troubleshooting.md +225 -0
- package/bundled-skills/train-sentence-transformers/scripts/mine_hard_negatives.py +199 -0
- package/bundled-skills/train-sentence-transformers/scripts/train_cross_encoder_distillation_example.py +254 -0
- package/bundled-skills/train-sentence-transformers/scripts/train_cross_encoder_example.py +253 -0
- package/bundled-skills/train-sentence-transformers/scripts/train_cross_encoder_listwise_example.py +282 -0
- package/bundled-skills/train-sentence-transformers/scripts/train_sentence_transformer_distillation_example.py +303 -0
- package/bundled-skills/train-sentence-transformers/scripts/train_sentence_transformer_example.py +227 -0
- package/bundled-skills/train-sentence-transformers/scripts/train_sentence_transformer_make_multilingual_example.py +308 -0
- package/bundled-skills/train-sentence-transformers/scripts/train_sentence_transformer_matryoshka_example.py +212 -0
- package/bundled-skills/train-sentence-transformers/scripts/train_sentence_transformer_multi_dataset_example.py +258 -0
- package/bundled-skills/train-sentence-transformers/scripts/train_sentence_transformer_static_embedding_example.py +273 -0
- package/bundled-skills/train-sentence-transformers/scripts/train_sentence_transformer_with_lora_example.py +275 -0
- package/bundled-skills/train-sentence-transformers/scripts/train_sparse_encoder_distillation_example.py +262 -0
- package/bundled-skills/train-sentence-transformers/scripts/train_sparse_encoder_example.py +237 -0
- package/bundled-skills/transformers-js/SKILL.md +83 -29
- package/bundled-skills/transformers-js/references/CONFIGURATION.md +55 -7
- package/bundled-skills/transformers-js/references/EXAMPLES.md +98 -83
- package/bundled-skills/transformers-js/references/MODEL_REGISTRY.md +197 -0
- package/bundled-skills/transformers-js/references/PIPELINE_OPTIONS.md +31 -19
- package/bundled-skills/transformers-js/references/TEXT_GENERATION.md +18 -18
- package/bundled-skills/trl-training/SKILL.md +327 -0
- package/bundled-skills/tune-monitor/SKILL.md +268 -0
- package/bundled-skills/ui-a11y/SKILL.md +76 -68
- package/bundled-skills/ui-component/SKILL.md +54 -82
- package/bundled-skills/ui-lint/SKILL.md +111 -0
- package/bundled-skills/ui-motion/SKILL.md +181 -0
- package/bundled-skills/ui-page/SKILL.md +80 -90
- package/bundled-skills/ui-pattern/SKILL.md +50 -68
- package/bundled-skills/ui-review/SKILL.md +95 -77
- package/bundled-skills/ui-score/SKILL.md +145 -0
- package/bundled-skills/ui-setup/SKILL.md +196 -88
- package/bundled-skills/ui-skills-root/SKILL.md +72 -0
- package/bundled-skills/ui-tokens/SKILL.md +44 -52
- package/bundled-skills/ui-update/SKILL.md +167 -0
- package/bundled-skills/unslop-commit/SKILL.md +113 -0
- package/bundled-skills/unslop-file/SKILL.md +157 -0
- package/bundled-skills/unslop-review/SKILL.md +102 -0
- package/bundled-skills/update-swiftui-apis/SKILL.md +120 -0
- package/bundled-skills/update-swiftui-apis/references/scan-manifest.md +230 -0
- package/bundled-skills/upgrading-expo/SKILL.md +107 -82
- package/bundled-skills/upgrading-expo/agents/openai.yaml +4 -0
- package/bundled-skills/upgrading-expo/references/expo-av-to-audio.md +132 -0
- package/bundled-skills/upgrading-expo/references/expo-av-to-video.md +160 -0
- package/bundled-skills/upgrading-expo/references/native-tabs.md +124 -0
- package/bundled-skills/upgrading-expo/references/new-architecture.md +79 -0
- package/bundled-skills/upgrading-expo/references/react-19.md +79 -0
- package/bundled-skills/upgrading-expo/references/react-compiler.md +59 -0
- package/bundled-skills/upgrading-expo/references/react-navigation-to-expo-router.md +61 -0
- package/bundled-skills/usage-based-pricing/README.md +40 -0
- package/bundled-skills/usage-based-pricing/SKILL.md +547 -0
- package/bundled-skills/use-dom/SKILL.md +428 -0
- package/bundled-skills/use-dom/agents/openai.yaml +4 -0
- package/bundled-skills/ux-audit/SKILL.md +112 -44
- package/bundled-skills/ux-copy/SKILL.md +105 -73
- package/bundled-skills/ux-feedback/SKILL.md +106 -58
- package/bundled-skills/ux-flow/SKILL.md +51 -50
- package/bundled-skills/vitest-skill/SKILL.md +165 -0
- package/bundled-skills/weaviate/scripts/weaviate_conn.py +16 -6
- package/bundled-skills/webdriverio-skill/SKILL.md +157 -0
- package/bundled-skills/wjttc-builder/SKILL.md +355 -0
- package/bundled-skills/wjttc-tester/SKILL.md +190 -0
- package/package.json +1 -1
- package/skills_index.json +4320 -132
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Uploads a file to the Gemini Files API and waits for it to become ACTIVE.
|
|
4
|
+
Uses the official google-genai SDK.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import argparse
|
|
8
|
+
import json
|
|
9
|
+
import mimetypes
|
|
10
|
+
import os
|
|
11
|
+
import sys
|
|
12
|
+
import time
|
|
13
|
+
from google import genai
|
|
14
|
+
from google.genai import types
|
|
15
|
+
|
|
16
|
+
def get_api_key(args):
|
|
17
|
+
"""Retrieves API key from command args or environment."""
|
|
18
|
+
if args.api_key:
|
|
19
|
+
return args.api_key
|
|
20
|
+
return os.environ.get("GEMINI_API_KEY")
|
|
21
|
+
|
|
22
|
+
def detect_mime_type(file_path):
|
|
23
|
+
"""Determines MIME type based on file extension, falling back to standard mimetypes module."""
|
|
24
|
+
ext = os.path.splitext(file_path)[1].lower()
|
|
25
|
+
mime_map = {
|
|
26
|
+
".png": "image/png",
|
|
27
|
+
".jpg": "image/jpeg",
|
|
28
|
+
".jpeg": "image/jpeg",
|
|
29
|
+
".webp": "image/webp",
|
|
30
|
+
".mp4": "video/mp4",
|
|
31
|
+
".mp3": "audio/mpeg",
|
|
32
|
+
".wav": "audio/wav",
|
|
33
|
+
".pdf": "application/pdf",
|
|
34
|
+
".txt": "text/plain",
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
if ext in mime_map:
|
|
38
|
+
return mime_map[ext]
|
|
39
|
+
|
|
40
|
+
mime_type, _ = mimetypes.guess_type(file_path)
|
|
41
|
+
if mime_type:
|
|
42
|
+
return mime_type
|
|
43
|
+
|
|
44
|
+
return "application/octet-stream"
|
|
45
|
+
|
|
46
|
+
def upload_file(file_path, display_name=None, api_key=None):
|
|
47
|
+
"""Performs an upload using google-genai SDK, with automatic pre-processing for large videos."""
|
|
48
|
+
file_size = os.path.getsize(file_path)
|
|
49
|
+
mime_type = detect_mime_type(file_path)
|
|
50
|
+
|
|
51
|
+
# Large video file size check (>25MB)
|
|
52
|
+
is_video = mime_type.startswith("video/")
|
|
53
|
+
if is_video and file_size > 25 * 1024 * 1024:
|
|
54
|
+
size_mb = file_size / (1024 * 1024)
|
|
55
|
+
print(f"\nWARNING: Video file '{file_path}' is very large ({size_mb:.2f} MB)!")
|
|
56
|
+
print("Note: Gemini Omni Flash is optimized for 10s videos at 720p and 24fps. Uploading very large or")
|
|
57
|
+
print("high-resolution videos will significantly increase upload times and may cause Out-Of-Memory (OOM) errors.")
|
|
58
|
+
|
|
59
|
+
# Determine if terminal is interactive
|
|
60
|
+
if sys.stdin.isatty():
|
|
61
|
+
print("\nWould you like to automatically pre-process this video first using prep_video.py?")
|
|
62
|
+
print("This will trim, scale, and optimize the video to ensure a fast, OOM-safe upload.")
|
|
63
|
+
try:
|
|
64
|
+
choice = input("Pre-process video? [Y/n]: ").strip().lower()
|
|
65
|
+
if choice in ("", "y", "yes"):
|
|
66
|
+
prepped_output_path = os.path.join("media", f"prepped_{os.path.basename(file_path)}")
|
|
67
|
+
os.makedirs("media", exist_ok=True)
|
|
68
|
+
|
|
69
|
+
# Resolve prep_video.py script path
|
|
70
|
+
import subprocess
|
|
71
|
+
prep_script = os.path.join(os.path.dirname(os.path.abspath(__file__)), "video", "prep_video.py")
|
|
72
|
+
if not os.path.exists(prep_script):
|
|
73
|
+
prep_script = os.path.join(os.path.dirname(os.path.abspath(__file__)), "prep_video.py")
|
|
74
|
+
|
|
75
|
+
cmd = [sys.executable, prep_script, file_path, "--output", prepped_output_path]
|
|
76
|
+
print(f"Running: {' '.join(cmd)}")
|
|
77
|
+
|
|
78
|
+
try:
|
|
79
|
+
result = subprocess.run(cmd)
|
|
80
|
+
if result.returncode == 0 and os.path.exists(prepped_output_path):
|
|
81
|
+
file_path = prepped_output_path
|
|
82
|
+
file_size = os.path.getsize(file_path)
|
|
83
|
+
print(f"\nPre-processing completed successfully! Proceeding with upload of prepped video ({file_size / (1024*1024):.2f} MB)...")
|
|
84
|
+
else:
|
|
85
|
+
raise RuntimeError("Error: Video pre-processing failed. Proceeding with original file upload is not recommended.")
|
|
86
|
+
except Exception as e:
|
|
87
|
+
raise RuntimeError(f"Error executing prep_video.py: {e}")
|
|
88
|
+
else:
|
|
89
|
+
proceed_choice = input("Do you want to proceed with uploading the original large video anyway? [y/N]: ").strip().lower()
|
|
90
|
+
if proceed_choice not in ("y", "yes"):
|
|
91
|
+
raise RuntimeError("Upload cancelled by user. Please pre-process the video manually first.")
|
|
92
|
+
except (KeyboardInterrupt, EOFError):
|
|
93
|
+
raise RuntimeError("\nNo input received. Upload cancelled to prevent OOM.")
|
|
94
|
+
else:
|
|
95
|
+
# Non-interactive mode
|
|
96
|
+
if file_size > 100 * 1024 * 1024: # Block files larger than 100MB in non-interactive mode
|
|
97
|
+
err_msg = (
|
|
98
|
+
f"Error: Video file is extremely large ({size_mb:.2f} MB) and script is running in non-interactive mode.\n"
|
|
99
|
+
"To prevent Out-Of-Memory (OOM) errors, upload has been blocked.\n"
|
|
100
|
+
"Please pre-process the video first using prep_video.py."
|
|
101
|
+
)
|
|
102
|
+
raise RuntimeError(err_msg)
|
|
103
|
+
else:
|
|
104
|
+
print("Proceeding with upload in non-interactive mode...", file=sys.stderr)
|
|
105
|
+
|
|
106
|
+
if not display_name:
|
|
107
|
+
display_name = os.path.basename(file_path)
|
|
108
|
+
|
|
109
|
+
print(f"Preparing upload of '{file_path}' ({file_size} bytes, type: {mime_type})...")
|
|
110
|
+
|
|
111
|
+
# Step 1: Initialize Client
|
|
112
|
+
client = genai.Client(api_key=api_key)
|
|
113
|
+
|
|
114
|
+
# Step 2: Upload file using SDK
|
|
115
|
+
print("Uploading file bytes using google-genai SDK...")
|
|
116
|
+
try:
|
|
117
|
+
config = types.UploadFileConfig(
|
|
118
|
+
display_name=display_name,
|
|
119
|
+
mime_type=mime_type,
|
|
120
|
+
)
|
|
121
|
+
file_obj = client.files.upload(file=file_path, config=config)
|
|
122
|
+
# Convert Pydantic File model to dictionary with both camelCase and snake_case keys for compatibility
|
|
123
|
+
file_dict = json.loads(file_obj.model_dump_json())
|
|
124
|
+
# Add camelCase field for mimeType
|
|
125
|
+
if "mime_type" in file_dict:
|
|
126
|
+
file_dict["mimeType"] = file_dict["mime_type"]
|
|
127
|
+
return file_dict
|
|
128
|
+
except Exception as e:
|
|
129
|
+
raise RuntimeError(f"Error uploading file via SDK: {e}")
|
|
130
|
+
|
|
131
|
+
def wait_for_active(file_name, api_key, poll_interval=3, max_attempts=30, backoff_factor=1.5, max_interval=30):
|
|
132
|
+
"""Polls the file status until state is ACTIVE or FAILED using exponential backoff via the SDK."""
|
|
133
|
+
print(f"Waiting for file {file_name} to finish processing...")
|
|
134
|
+
|
|
135
|
+
client = genai.Client(api_key=api_key)
|
|
136
|
+
attempt = 0
|
|
137
|
+
current_interval = poll_interval
|
|
138
|
+
consecutive_errors = 0
|
|
139
|
+
max_consecutive_errors = 5
|
|
140
|
+
|
|
141
|
+
while attempt < max_attempts:
|
|
142
|
+
try:
|
|
143
|
+
file_obj = client.files.get(name=file_name)
|
|
144
|
+
state = file_obj.state
|
|
145
|
+
|
|
146
|
+
# Extract state name as a string (handling both Enum and String)
|
|
147
|
+
state_str = state.name if hasattr(state, "name") else str(state)
|
|
148
|
+
|
|
149
|
+
# Reset consecutive errors on successful API response
|
|
150
|
+
consecutive_errors = 0
|
|
151
|
+
|
|
152
|
+
if state_str == "ACTIVE":
|
|
153
|
+
print("File is ACTIVE and ready for generations!")
|
|
154
|
+
file_dict = json.loads(file_obj.model_dump_json())
|
|
155
|
+
if "mime_type" in file_dict:
|
|
156
|
+
file_dict["mimeType"] = file_dict["mime_type"]
|
|
157
|
+
return file_dict
|
|
158
|
+
elif state_str == "FAILED":
|
|
159
|
+
raise RuntimeError("Error: File processing failed on the backend.")
|
|
160
|
+
|
|
161
|
+
print(f"Current state: {state_str}. Retrying in {current_interval:.1f}s...")
|
|
162
|
+
time.sleep(current_interval)
|
|
163
|
+
|
|
164
|
+
# Increase interval for the next poll (backoff)
|
|
165
|
+
current_interval = min(current_interval * backoff_factor, max_interval)
|
|
166
|
+
attempt += 1
|
|
167
|
+
|
|
168
|
+
except Exception as e:
|
|
169
|
+
consecutive_errors += 1
|
|
170
|
+
if consecutive_errors >= max_consecutive_errors:
|
|
171
|
+
raise RuntimeError(f"Error: Too many consecutive errors checking status ({e}). Exiting.")
|
|
172
|
+
|
|
173
|
+
print(f"Warning: Error checking status ({e}). Retrying in {current_interval:.1f}s...")
|
|
174
|
+
time.sleep(current_interval)
|
|
175
|
+
current_interval = min(current_interval * backoff_factor, max_interval)
|
|
176
|
+
attempt += 1
|
|
177
|
+
|
|
178
|
+
raise RuntimeError(f"Error: Maximum polling attempts ({max_attempts}) reached. File is still not ACTIVE.")
|
|
179
|
+
|
|
180
|
+
def main():
|
|
181
|
+
parser = argparse.ArgumentParser(description="Upload files to Gemini Files API using google-genai SDK.")
|
|
182
|
+
parser.add_argument("file", help="Path to the file to upload")
|
|
183
|
+
parser.add_argument("--name", help="Custom display name for the file")
|
|
184
|
+
parser.add_argument("--api-key", help="Gemini API Key (overrides env)")
|
|
185
|
+
parser.add_argument("--no-wait", action="store_true", help="Don't wait for ACTIVE status")
|
|
186
|
+
|
|
187
|
+
args = parser.parse_args()
|
|
188
|
+
|
|
189
|
+
api_key = get_api_key(args)
|
|
190
|
+
if not api_key:
|
|
191
|
+
print("Error: API key is not set. Use --api-key or set GEMINI_API_KEY environment variable.", file=sys.stderr)
|
|
192
|
+
sys.exit(1)
|
|
193
|
+
|
|
194
|
+
if not os.path.exists(args.file):
|
|
195
|
+
print(f"Error: File '{args.file}' not found.", file=sys.stderr)
|
|
196
|
+
sys.exit(1)
|
|
197
|
+
|
|
198
|
+
try:
|
|
199
|
+
file_meta = upload_file(args.file, args.name, api_key)
|
|
200
|
+
file_name = file_meta.get("name")
|
|
201
|
+
|
|
202
|
+
print(f"File metadata created:")
|
|
203
|
+
print(f" Name: {file_name}")
|
|
204
|
+
print(f" URI: {file_meta.get('uri')}")
|
|
205
|
+
print(f" Type: {file_meta.get('mimeType')}")
|
|
206
|
+
|
|
207
|
+
if not args.no_wait:
|
|
208
|
+
file_meta = wait_for_active(file_name, api_key)
|
|
209
|
+
|
|
210
|
+
print("\nFile upload successfully completed! JSON Output:")
|
|
211
|
+
print(json.dumps(file_meta, indent=2))
|
|
212
|
+
sys.exit(0)
|
|
213
|
+
except Exception as e:
|
|
214
|
+
print(f"Error: {e}", file=sys.stderr)
|
|
215
|
+
sys.exit(1)
|
|
216
|
+
|
|
217
|
+
if __name__ == "__main__":
|
|
218
|
+
main()
|
|
@@ -0,0 +1,439 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Generates and edits videos using the Gemini Omni Flash model via the google-genai Interactions API.
|
|
4
|
+
Can automatically upload local media references using the Files API.
|
|
5
|
+
Supports parallel execution of multiple generations using Python standard library.
|
|
6
|
+
Uses the official google-genai SDK.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import argparse
|
|
10
|
+
from concurrent.futures import ThreadPoolExecutor, as_completed
|
|
11
|
+
import json
|
|
12
|
+
import os
|
|
13
|
+
import re
|
|
14
|
+
import sys
|
|
15
|
+
import time
|
|
16
|
+
import urllib.request
|
|
17
|
+
import urllib.error
|
|
18
|
+
import uuid
|
|
19
|
+
from google import genai
|
|
20
|
+
|
|
21
|
+
# Load local upload helper logic inline to prevent dependency issues
|
|
22
|
+
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|
23
|
+
from upload_file import upload_file, wait_for_active
|
|
24
|
+
|
|
25
|
+
def get_api_key(args):
|
|
26
|
+
"""Retrieves API key from command args or environment."""
|
|
27
|
+
if args.api_key:
|
|
28
|
+
return args.api_key
|
|
29
|
+
return os.environ.get("GEMINI_API_KEY")
|
|
30
|
+
|
|
31
|
+
def is_file_uri(uri):
|
|
32
|
+
"""Returns True if the string is a standard Gemini File URI."""
|
|
33
|
+
if not uri:
|
|
34
|
+
return False
|
|
35
|
+
return "files/" in uri and ("generativelanguage.googleapis.com" in uri or uri.startswith("files/"))
|
|
36
|
+
|
|
37
|
+
def normalize_file_uri(uri):
|
|
38
|
+
"""Normalizes any File API URI/reference to the standard https://generativelanguage.googleapis.com/files/{id} format."""
|
|
39
|
+
if not uri:
|
|
40
|
+
return None
|
|
41
|
+
match = re.search(r'files/([a-zA-Z0-9]+)', uri)
|
|
42
|
+
if match:
|
|
43
|
+
file_id = match.group(1)
|
|
44
|
+
return f"https://generativelanguage.googleapis.com/files/{file_id}"
|
|
45
|
+
return uri
|
|
46
|
+
|
|
47
|
+
def slugify(text):
|
|
48
|
+
"""Converts a text prompt into a safe, descriptive filename slug."""
|
|
49
|
+
text = text.lower()
|
|
50
|
+
text = re.sub(r'[^a-z0-9]+', '_', text)
|
|
51
|
+
return text.strip('_')[:50]
|
|
52
|
+
|
|
53
|
+
def parse_and_validate_duration(value):
|
|
54
|
+
"""Parses and formats a duration integer between 3 and 10 with optional 's' suffix."""
|
|
55
|
+
if value is None:
|
|
56
|
+
return None
|
|
57
|
+
if isinstance(value, (int, float)):
|
|
58
|
+
val = float(value)
|
|
59
|
+
else:
|
|
60
|
+
clean_value = str(value).strip().lower()
|
|
61
|
+
if clean_value in ('none', ''):
|
|
62
|
+
return None
|
|
63
|
+
if clean_value.endswith('s'):
|
|
64
|
+
clean_value = clean_value[:-1]
|
|
65
|
+
try:
|
|
66
|
+
val = float(clean_value)
|
|
67
|
+
except ValueError:
|
|
68
|
+
raise ValueError(f"Invalid duration value: '{value}'. Must be an integer (e.g., 5, 10).")
|
|
69
|
+
|
|
70
|
+
if not val.is_integer():
|
|
71
|
+
raise ValueError(f"Duration must be an integer, not a float (e.g., got {value}).")
|
|
72
|
+
|
|
73
|
+
val_int = int(val)
|
|
74
|
+
if val_int < 3 or val_int > 10:
|
|
75
|
+
raise ValueError(f"Duration must be between 3 (inclusive) and 10 (inclusive) seconds. Got {val_int}.")
|
|
76
|
+
|
|
77
|
+
return f"{val_int}s"
|
|
78
|
+
|
|
79
|
+
def argparse_duration_type(value):
|
|
80
|
+
"""argparse type converter for validating duration."""
|
|
81
|
+
if value is None or str(value).strip().lower() in ('none', ''):
|
|
82
|
+
return None
|
|
83
|
+
try:
|
|
84
|
+
return parse_and_validate_duration(value)
|
|
85
|
+
except ValueError as e:
|
|
86
|
+
raise argparse.ArgumentTypeError(str(e))
|
|
87
|
+
|
|
88
|
+
def resolve_or_upload_asset(asset_path, mime_type, api_key, strip_audio=False):
|
|
89
|
+
"""
|
|
90
|
+
If asset_path is a File API URI, returns it directly (normalized).
|
|
91
|
+
If it is a local file path, uploads it and returns its File API URI (normalized).
|
|
92
|
+
"""
|
|
93
|
+
if not asset_path:
|
|
94
|
+
return None, None
|
|
95
|
+
|
|
96
|
+
if is_file_uri(asset_path):
|
|
97
|
+
normalized = normalize_file_uri(asset_path)
|
|
98
|
+
print(f"Using existing File URI: {normalized}")
|
|
99
|
+
if strip_audio:
|
|
100
|
+
print("Warning: --strip-audio was specified but the video input is an existing remote File URI. "
|
|
101
|
+
"Audio cannot be stripped from remote files automatically.")
|
|
102
|
+
return normalized, mime_type
|
|
103
|
+
|
|
104
|
+
if os.path.exists(asset_path):
|
|
105
|
+
upload_path = asset_path
|
|
106
|
+
temp_stripped_path = None
|
|
107
|
+
|
|
108
|
+
if strip_audio:
|
|
109
|
+
print(f"Detected local asset path '{asset_path}'. Stripping audio before upload...")
|
|
110
|
+
|
|
111
|
+
# Check if ffmpeg is available
|
|
112
|
+
import subprocess
|
|
113
|
+
try:
|
|
114
|
+
subprocess.run(["ffmpeg", "-version"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, check=True)
|
|
115
|
+
except (subprocess.SubprocessError, FileNotFoundError):
|
|
116
|
+
raise RuntimeError(
|
|
117
|
+
"Error: ffmpeg is not installed or not found in system PATH. "
|
|
118
|
+
"ffmpeg is required to strip audio from local videos."
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
try:
|
|
122
|
+
os.makedirs("media", exist_ok=True)
|
|
123
|
+
base_name = os.path.basename(asset_path)
|
|
124
|
+
name, ext = os.path.splitext(base_name)
|
|
125
|
+
temp_stripped_path = os.path.join("media", f"temp_stripped_{name}_{uuid.uuid4().hex}{ext}")
|
|
126
|
+
|
|
127
|
+
# Fast stream-copy audio stripping
|
|
128
|
+
cmd = ["ffmpeg", "-y", "-i", asset_path, "-c:v", "copy", "-an", temp_stripped_path]
|
|
129
|
+
subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True)
|
|
130
|
+
|
|
131
|
+
print(f"Successfully stripped audio. Temporary video file created at: {temp_stripped_path}")
|
|
132
|
+
upload_path = temp_stripped_path
|
|
133
|
+
except Exception as e:
|
|
134
|
+
print(f"Error stripping audio using ffmpeg: {e}", file=sys.stderr)
|
|
135
|
+
print("Falling back to uploading the original video with audio.", file=sys.stderr)
|
|
136
|
+
|
|
137
|
+
print(f"Uploading asset '{upload_path}'...")
|
|
138
|
+
file_meta = upload_file(upload_path, api_key=api_key)
|
|
139
|
+
file_name = file_meta.get("name")
|
|
140
|
+
# Wait for file to become active
|
|
141
|
+
file_meta = wait_for_active(file_name, api_key)
|
|
142
|
+
normalized = normalize_file_uri(file_meta.get("uri"))
|
|
143
|
+
|
|
144
|
+
# Clean up temporary stripped file if we created one
|
|
145
|
+
if temp_stripped_path and os.path.exists(temp_stripped_path):
|
|
146
|
+
try:
|
|
147
|
+
os.remove(temp_stripped_path)
|
|
148
|
+
print(f"Cleaned up temporary video file: {temp_stripped_path}")
|
|
149
|
+
except Exception as e:
|
|
150
|
+
print(f"Warning: Failed to remove temporary file {temp_stripped_path}: {e}", file=sys.stderr)
|
|
151
|
+
|
|
152
|
+
# Handle both mimeType and mime_type key formats returned from upload_file
|
|
153
|
+
returned_mime = file_meta.get("mimeType") or file_meta.get("mime_type")
|
|
154
|
+
return normalized, returned_mime
|
|
155
|
+
else:
|
|
156
|
+
raise FileNotFoundError(f"Asset path '{asset_path}' is neither a valid File API URI nor a local file path.")
|
|
157
|
+
|
|
158
|
+
def download_video_file(file_uri, output_path, api_key):
|
|
159
|
+
"""Downloads generated video file from URI using alt=media standard in a memory-safe, chunked manner."""
|
|
160
|
+
separator = "&" if "?" in file_uri else "?"
|
|
161
|
+
download_url = f"{file_uri}{separator}alt=media"
|
|
162
|
+
|
|
163
|
+
print(f"Downloading video from {file_uri} to {output_path} in chunked mode...")
|
|
164
|
+
req = urllib.request.Request(download_url)
|
|
165
|
+
req.add_header("x-goog-api-key", api_key)
|
|
166
|
+
|
|
167
|
+
try:
|
|
168
|
+
with urllib.request.urlopen(req, timeout=480) as resp:
|
|
169
|
+
parent_dir = os.path.dirname(output_path)
|
|
170
|
+
if parent_dir:
|
|
171
|
+
os.makedirs(parent_dir, exist_ok=True)
|
|
172
|
+
|
|
173
|
+
with open(output_path, "wb") as f:
|
|
174
|
+
while True:
|
|
175
|
+
chunk = resp.read(8192)
|
|
176
|
+
if not chunk:
|
|
177
|
+
break
|
|
178
|
+
f.write(chunk)
|
|
179
|
+
print(f"Video successfully saved to: {output_path}")
|
|
180
|
+
except urllib.error.HTTPError as e:
|
|
181
|
+
raise RuntimeError(f"Error downloading video file: {e.code} - {e.read().decode()}")
|
|
182
|
+
|
|
183
|
+
def generate_video(prompt, api_key, model="gemini-omni-flash-preview", aspect_ratio="16:9", duration=None, image_path=None, video_path=None, output_path="output.mp4", strip_audio=False, previous_interaction_id=None):
|
|
184
|
+
"""Creates an interaction with the video model and downloads the resulting video using the official google-genai SDK."""
|
|
185
|
+
duration = parse_and_validate_duration(duration)
|
|
186
|
+
input_parts = []
|
|
187
|
+
|
|
188
|
+
# 1. Resolve and add image inputs (reference/start/end frames)
|
|
189
|
+
if image_path:
|
|
190
|
+
if isinstance(image_path, list):
|
|
191
|
+
for path in image_path:
|
|
192
|
+
img_uri, img_mime = resolve_or_upload_asset(path, "image/png", api_key)
|
|
193
|
+
input_parts.append({
|
|
194
|
+
"type": "image",
|
|
195
|
+
"uri": img_uri,
|
|
196
|
+
"mime_type": img_mime
|
|
197
|
+
})
|
|
198
|
+
else:
|
|
199
|
+
img_uri, img_mime = resolve_or_upload_asset(image_path, "image/png", api_key)
|
|
200
|
+
input_parts.append({
|
|
201
|
+
"type": "image",
|
|
202
|
+
"uri": img_uri,
|
|
203
|
+
"mime_type": img_mime
|
|
204
|
+
})
|
|
205
|
+
|
|
206
|
+
# 2. Resolve and add video inputs (for edits or extensions)
|
|
207
|
+
if video_path:
|
|
208
|
+
if isinstance(video_path, list):
|
|
209
|
+
for path in video_path:
|
|
210
|
+
vid_uri, vid_mime = resolve_or_upload_asset(path, "video/mp4", api_key, strip_audio=strip_audio)
|
|
211
|
+
input_parts.append({
|
|
212
|
+
"type": "video",
|
|
213
|
+
"uri": vid_uri,
|
|
214
|
+
"mime_type": vid_mime
|
|
215
|
+
})
|
|
216
|
+
else:
|
|
217
|
+
vid_uri, vid_mime = resolve_or_upload_asset(video_path, "video/mp4", api_key, strip_audio=strip_audio)
|
|
218
|
+
input_parts.append({
|
|
219
|
+
"type": "video",
|
|
220
|
+
"uri": vid_uri,
|
|
221
|
+
"mime_type": vid_mime
|
|
222
|
+
})
|
|
223
|
+
|
|
224
|
+
# 3. Add text prompt
|
|
225
|
+
input_parts.append({
|
|
226
|
+
"type": "text",
|
|
227
|
+
"text": prompt
|
|
228
|
+
})
|
|
229
|
+
|
|
230
|
+
# Construct the config
|
|
231
|
+
video_config = {
|
|
232
|
+
"type": "video",
|
|
233
|
+
"aspect_ratio": aspect_ratio,
|
|
234
|
+
"delivery": "uri"
|
|
235
|
+
}
|
|
236
|
+
if duration:
|
|
237
|
+
video_config["duration"] = duration
|
|
238
|
+
|
|
239
|
+
print(f"\nSending generation request using official google-genai SDK and model '{model}'...")
|
|
240
|
+
print(f"Prompt: '{prompt}' | Aspect Ratio: {aspect_ratio} | Duration: {duration}")
|
|
241
|
+
|
|
242
|
+
# Initialize the client and call interactions.create
|
|
243
|
+
client = genai.Client(api_key=api_key)
|
|
244
|
+
try:
|
|
245
|
+
interaction = client.interactions.create(
|
|
246
|
+
model=model,
|
|
247
|
+
input=input_parts,
|
|
248
|
+
response_format=video_config,
|
|
249
|
+
previous_interaction_id=previous_interaction_id
|
|
250
|
+
)
|
|
251
|
+
except Exception as e:
|
|
252
|
+
raise RuntimeError(f"Error generating video via SDK: {e}")
|
|
253
|
+
|
|
254
|
+
print(f"Generation complete for '{prompt}'! Processing response...")
|
|
255
|
+
|
|
256
|
+
interaction_id = interaction.id
|
|
257
|
+
if interaction_id:
|
|
258
|
+
print(f"Interaction ID: {interaction_id}")
|
|
259
|
+
|
|
260
|
+
output_video = interaction.output_video
|
|
261
|
+
if not output_video or not output_video.uri:
|
|
262
|
+
err_msg = f"No video content found in response for '{prompt}'."
|
|
263
|
+
if video_path:
|
|
264
|
+
err_msg += (
|
|
265
|
+
"\nWARNING: IMPORTANT REGIONAL RESTRICTION: Uploading videos to use for video edits is "
|
|
266
|
+
"not available in the EEA, Switzerland, United Kingdom, and some US states."
|
|
267
|
+
)
|
|
268
|
+
raise RuntimeError(f"{err_msg}\nResponse output_video field: {output_video}")
|
|
269
|
+
|
|
270
|
+
video_uri = output_video.uri
|
|
271
|
+
print(f"Generated video URI for '{prompt}': {video_uri}")
|
|
272
|
+
|
|
273
|
+
# Download the final video
|
|
274
|
+
download_video_file(video_uri, output_path, api_key)
|
|
275
|
+
|
|
276
|
+
def run_job(job, api_key):
|
|
277
|
+
"""Runs a single generation job inside a thread pool, catching exceptions."""
|
|
278
|
+
prompt = job.get("prompt")
|
|
279
|
+
if not prompt:
|
|
280
|
+
print("Warning: Skipping job with empty prompt.", file=sys.stderr)
|
|
281
|
+
return {"job": job, "status": "SKIPPED", "error": "Empty prompt"}
|
|
282
|
+
|
|
283
|
+
aspect_ratio = job.get("aspect_ratio", "16:9")
|
|
284
|
+
duration = job.get("duration")
|
|
285
|
+
image_path = job.get("image")
|
|
286
|
+
video_path = job.get("video")
|
|
287
|
+
output_path = job.get("output")
|
|
288
|
+
model = job.get("model", "gemini-omni-flash-preview")
|
|
289
|
+
strip_audio = job.get("strip_audio", False)
|
|
290
|
+
previous_interaction_id = job.get("previous_interaction_id")
|
|
291
|
+
|
|
292
|
+
if not output_path:
|
|
293
|
+
output_path = f"media/output_{slugify(prompt)}.mp4"
|
|
294
|
+
|
|
295
|
+
print(f"[Parallel] Dispatching: '{prompt}' (Output: {output_path})")
|
|
296
|
+
|
|
297
|
+
try:
|
|
298
|
+
generate_video(
|
|
299
|
+
prompt=prompt,
|
|
300
|
+
api_key=api_key,
|
|
301
|
+
model=model,
|
|
302
|
+
aspect_ratio=aspect_ratio,
|
|
303
|
+
duration=duration,
|
|
304
|
+
image_path=image_path,
|
|
305
|
+
video_path=video_path,
|
|
306
|
+
output_path=output_path,
|
|
307
|
+
strip_audio=strip_audio,
|
|
308
|
+
previous_interaction_id=previous_interaction_id
|
|
309
|
+
)
|
|
310
|
+
return {"job": job, "status": "SUCCESS", "output_path": output_path}
|
|
311
|
+
except Exception as e:
|
|
312
|
+
print(f"[Parallel] Failed: '{prompt}' - Error: {e}", file=sys.stderr)
|
|
313
|
+
return {"job": job, "status": "FAILED", "error": str(e)}
|
|
314
|
+
|
|
315
|
+
def main():
|
|
316
|
+
parser = argparse.ArgumentParser(description="Generate and edit videos using Gemini Omni Flash model via google-genai SDK (supports parallel batch execution).")
|
|
317
|
+
parser.add_argument("prompt", nargs="?", help="Text prompt / instruction for a single video generation")
|
|
318
|
+
parser.add_argument("--image", action="append", help="Optional local image path or File API URI for referencing / image-to-video (can be specified multiple times)")
|
|
319
|
+
parser.add_argument("--video", action="append", help="Optional local video path or File API URI for editing / extending (can be specified multiple times)")
|
|
320
|
+
parser.add_argument("--aspect-ratio", default="16:9", choices=["16:9", "9:16"], help="Aspect ratio (default: 16:9)")
|
|
321
|
+
parser.add_argument("--duration", type=argparse_duration_type, default=None, help="Video duration as an integer between 3 and 10 seconds (e.g., 5, 10). Default: None (API/Model decides, typically 10s or matches source)")
|
|
322
|
+
parser.add_argument("--model", default="gemini-omni-flash-preview", help="Gemini Omni Flash video model ID (default: gemini-omni-flash-preview)")
|
|
323
|
+
parser.add_argument("--output", help="Local output file path for single generation (default: media/output.mp4)")
|
|
324
|
+
parser.add_argument("--strip-audio", "-a", action="store_true", help="Completely strip/disable audio stream from the input video(s) before uploading so Gemini Omni Flash can regenerate new audio from scratch")
|
|
325
|
+
parser.add_argument("--previous-interaction-id", help="Optional Interaction ID of a previous generation for turn-by-turn editing")
|
|
326
|
+
parser.add_argument("--api-key", help="Gemini API Key (overrides env)")
|
|
327
|
+
|
|
328
|
+
# Parallel batch configuration options
|
|
329
|
+
parser.add_argument("--batch", help="Path to a JSON file containing an array of generation jobs")
|
|
330
|
+
parser.add_argument("--prompts-file", help="Path to a text file containing one prompt per line to run in parallel")
|
|
331
|
+
parser.add_argument("--concurrency", type=int, default=3, help="Maximum number of concurrent executions (default: 3)")
|
|
332
|
+
|
|
333
|
+
args = parser.parse_args()
|
|
334
|
+
|
|
335
|
+
api_key = get_api_key(args)
|
|
336
|
+
if not api_key:
|
|
337
|
+
print("Error: API key is not set. Use --api-key or set GEMINI_API_KEY environment variable.", file=sys.stderr)
|
|
338
|
+
sys.exit(1)
|
|
339
|
+
|
|
340
|
+
# 1. Handle Batch JSON execution
|
|
341
|
+
if args.batch:
|
|
342
|
+
if not os.path.exists(args.batch):
|
|
343
|
+
print(f"Error: Batch JSON file '{args.batch}' not found.", file=sys.stderr)
|
|
344
|
+
sys.exit(1)
|
|
345
|
+
try:
|
|
346
|
+
with open(args.batch, "r", encoding="utf-8") as f:
|
|
347
|
+
jobs = json.load(f)
|
|
348
|
+
if not isinstance(jobs, list):
|
|
349
|
+
print("Error: Batch JSON file must contain a list/array of job objects.", file=sys.stderr)
|
|
350
|
+
sys.exit(1)
|
|
351
|
+
except Exception as e:
|
|
352
|
+
print(f"Error parsing Batch JSON: {e}", file=sys.stderr)
|
|
353
|
+
sys.exit(1)
|
|
354
|
+
|
|
355
|
+
print(f"Loaded {len(jobs)} jobs from batch JSON. Running with concurrency={args.concurrency}...")
|
|
356
|
+
|
|
357
|
+
# 2. Handle Prompts File execution
|
|
358
|
+
elif args.prompts_file:
|
|
359
|
+
if not os.path.exists(args.prompts_file):
|
|
360
|
+
print(f"Error: Prompts file '{args.prompts_file}' not found.", file=sys.stderr)
|
|
361
|
+
sys.exit(1)
|
|
362
|
+
|
|
363
|
+
jobs = []
|
|
364
|
+
with open(args.prompts_file, "r", encoding="utf-8") as f:
|
|
365
|
+
for line in f:
|
|
366
|
+
line = line.strip()
|
|
367
|
+
if line and not line.startswith("#"):
|
|
368
|
+
jobs.append({
|
|
369
|
+
"prompt": line,
|
|
370
|
+
"aspect_ratio": args.aspect_ratio,
|
|
371
|
+
"duration": args.duration,
|
|
372
|
+
"image": args.image,
|
|
373
|
+
"video": args.video,
|
|
374
|
+
"model": args.model,
|
|
375
|
+
"strip_audio": args.strip_audio,
|
|
376
|
+
"previous_interaction_id": args.previous_interaction_id
|
|
377
|
+
})
|
|
378
|
+
print(f"Loaded {len(jobs)} prompts from text file. Running with concurrency={args.concurrency}...")
|
|
379
|
+
|
|
380
|
+
# 3. Handle standard single prompt execution
|
|
381
|
+
else:
|
|
382
|
+
if not args.prompt:
|
|
383
|
+
parser.print_help()
|
|
384
|
+
sys.exit(1)
|
|
385
|
+
|
|
386
|
+
output_path = args.output if args.output else "media/output.mp4"
|
|
387
|
+
try:
|
|
388
|
+
generate_video(
|
|
389
|
+
prompt=args.prompt,
|
|
390
|
+
api_key=api_key,
|
|
391
|
+
model=args.model,
|
|
392
|
+
aspect_ratio=args.aspect_ratio,
|
|
393
|
+
duration=args.duration,
|
|
394
|
+
image_path=args.image,
|
|
395
|
+
video_path=args.video,
|
|
396
|
+
output_path=output_path,
|
|
397
|
+
strip_audio=args.strip_audio,
|
|
398
|
+
previous_interaction_id=args.previous_interaction_id
|
|
399
|
+
)
|
|
400
|
+
sys.exit(0)
|
|
401
|
+
except Exception as e:
|
|
402
|
+
print(f"Error: Generation failed: {e}", file=sys.stderr)
|
|
403
|
+
sys.exit(1)
|
|
404
|
+
|
|
405
|
+
# Parallel Execution Loop
|
|
406
|
+
if not jobs:
|
|
407
|
+
print("Warning: No valid jobs found to execute.")
|
|
408
|
+
sys.exit(0)
|
|
409
|
+
|
|
410
|
+
results = []
|
|
411
|
+
with ThreadPoolExecutor(max_workers=args.concurrency) as executor:
|
|
412
|
+
futures = {executor.submit(run_job, job, api_key): job for job in jobs}
|
|
413
|
+
for future in as_completed(futures):
|
|
414
|
+
results.append(future.result())
|
|
415
|
+
|
|
416
|
+
# Print Batch Results Summary
|
|
417
|
+
print("\n" + "="*50)
|
|
418
|
+
print("BATCH PARALLEL EXECUTION SUMMARY")
|
|
419
|
+
print("="*50)
|
|
420
|
+
success_count = sum(1 for r in results if r["status"] == "SUCCESS")
|
|
421
|
+
failed_count = sum(1 for r in results if r["status"] == "FAILED")
|
|
422
|
+
skipped_count = sum(1 for r in results if r["status"] == "SKIPPED")
|
|
423
|
+
|
|
424
|
+
print(f"Total: {len(results)} | Success: {success_count} | Failed: {failed_count} | Skipped: {skipped_count}\n")
|
|
425
|
+
for r in results:
|
|
426
|
+
status_str = r["status"]
|
|
427
|
+
prompt = r["job"].get("prompt")
|
|
428
|
+
if r["status"] == "SUCCESS":
|
|
429
|
+
print(f" [{status_str}] '{prompt}' -> {r['output_path']}")
|
|
430
|
+
else:
|
|
431
|
+
print(f" [{status_str}] '{prompt}' -> Error: {r.get('error')}")
|
|
432
|
+
print("="*50)
|
|
433
|
+
|
|
434
|
+
if failed_count > 0:
|
|
435
|
+
sys.exit(1)
|
|
436
|
+
sys.exit(0)
|
|
437
|
+
|
|
438
|
+
if __name__ == "__main__":
|
|
439
|
+
main()
|