@trieungoctam/vibekit 1.0.0
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/LICENSE +21 -0
- package/README.md +85 -0
- package/agents/debugger.md +158 -0
- package/agents/docs-manager.md +220 -0
- package/agents/planner.md +129 -0
- package/agents/researcher.md +58 -0
- package/agents/reviewer.md +152 -0
- package/agents/tester.md +126 -0
- package/bin/vibekit.js +18 -0
- package/hooks/lib/ck-config-utils.cjs +831 -0
- package/hooks/lib/colors.cjs +95 -0
- package/hooks/lib/config-counter.cjs +103 -0
- package/hooks/lib/context-builder.cjs +616 -0
- package/hooks/lib/git-info-cache.cjs +143 -0
- package/hooks/lib/hook-logger.cjs +92 -0
- package/hooks/lib/privacy-checker.cjs +297 -0
- package/hooks/lib/project-detector.cjs +474 -0
- package/hooks/lib/scout-checker.cjs +263 -0
- package/hooks/lib/transcript-parser.cjs +181 -0
- package/hooks/post-edit-simplify-reminder.cjs +156 -0
- package/hooks/privacy-block.cjs +166 -0
- package/hooks/scout-block.cjs +147 -0
- package/hooks/session-init.cjs +360 -0
- package/package.json +41 -0
- package/rules/development-rules.md +52 -0
- package/rules/documentation-management.md +121 -0
- package/rules/orchestration-protocol.md +43 -0
- package/rules/primary-workflow.md +57 -0
- package/rules/team-coordination-rules.md +90 -0
- package/skills/ai/agent-browser/SKILL.md +294 -0
- package/skills/ai/agent-browser/references/.gitkeep +0 -0
- package/skills/ai/agent-browser/references/agent-browser-vs-chrome-devtools.md +112 -0
- package/skills/ai/agent-browser/references/browserbase-cloud-setup.md +161 -0
- package/skills/ai/ai-artist/SKILL.md +122 -0
- package/skills/ai/ai-artist/data/awesome-prompts.csv +3592 -0
- package/skills/ai/ai-artist/data/lighting.csv +19 -0
- package/skills/ai/ai-artist/data/nano-banana-templates.csv +17 -0
- package/skills/ai/ai-artist/data/platforms.csv +11 -0
- package/skills/ai/ai-artist/data/styles.csv +26 -0
- package/skills/ai/ai-artist/data/techniques.csv +19 -0
- package/skills/ai/ai-artist/data/use-cases.csv +16 -0
- package/skills/ai/ai-artist/references/advanced-techniques.md +184 -0
- package/skills/ai/ai-artist/references/awesome-nano-banana-pro-prompts.md +8575 -0
- package/skills/ai/ai-artist/references/domain-code.md +66 -0
- package/skills/ai/ai-artist/references/domain-data.md +72 -0
- package/skills/ai/ai-artist/references/domain-marketing.md +66 -0
- package/skills/ai/ai-artist/references/domain-patterns.md +33 -0
- package/skills/ai/ai-artist/references/domain-writing.md +68 -0
- package/skills/ai/ai-artist/references/image-prompting.md +141 -0
- package/skills/ai/ai-artist/references/llm-prompting.md +165 -0
- package/skills/ai/ai-artist/references/nano-banana.md +136 -0
- package/skills/ai/ai-artist/references/reasoning-techniques.md +201 -0
- package/skills/ai/ai-artist/references/validation-workflow.md +117 -0
- package/skills/ai/ai-artist/scripts/core.py +197 -0
- package/skills/ai/ai-artist/scripts/extract_prompts.py +102 -0
- package/skills/ai/ai-artist/scripts/generate.py +370 -0
- package/skills/ai/ai-artist/scripts/search.py +147 -0
- package/skills/ai/ai-multimodal/.env.example +204 -0
- package/skills/ai/ai-multimodal/SKILL.md +110 -0
- package/skills/ai/ai-multimodal/references/audio-processing.md +387 -0
- package/skills/ai/ai-multimodal/references/image-generation.md +939 -0
- package/skills/ai/ai-multimodal/references/music-generation.md +311 -0
- package/skills/ai/ai-multimodal/references/video-analysis.md +515 -0
- package/skills/ai/ai-multimodal/references/video-generation.md +457 -0
- package/skills/ai/ai-multimodal/references/vision-understanding.md +492 -0
- package/skills/ai/ai-multimodal/scripts/.coverage +0 -0
- package/skills/ai/ai-multimodal/scripts/check_setup.py +315 -0
- package/skills/ai/ai-multimodal/scripts/document_converter.py +395 -0
- package/skills/ai/ai-multimodal/scripts/gemini_batch_process.py +1185 -0
- package/skills/ai/ai-multimodal/scripts/media_optimizer.py +506 -0
- package/skills/ai/ai-multimodal/scripts/requirements.txt +26 -0
- package/skills/ai/ai-multimodal/scripts/tests/.coverage +0 -0
- package/skills/ai/ai-multimodal/scripts/tests/requirements.txt +20 -0
- package/skills/ai/ai-multimodal/scripts/tests/test_document_converter.py +74 -0
- package/skills/ai/ai-multimodal/scripts/tests/test_gemini_batch_process.py +362 -0
- package/skills/ai/ai-multimodal/scripts/tests/test_media_optimizer.py +373 -0
- package/skills/ai/mcp-management/README.md +219 -0
- package/skills/ai/mcp-management/SKILL.md +210 -0
- package/skills/ai/mcp-management/assets/tools.json +3146 -0
- package/skills/ai/mcp-management/references/configuration.md +114 -0
- package/skills/ai/mcp-management/references/gemini-cli-integration.md +221 -0
- package/skills/ai/mcp-management/references/mcp-protocol.md +116 -0
- package/skills/ai/mcp-management/scripts/.env.example +10 -0
- package/skills/ai/mcp-management/scripts/cli.ts +195 -0
- package/skills/ai/mcp-management/scripts/dist/analyze-tools.js +70 -0
- package/skills/ai/mcp-management/scripts/dist/cli.js +160 -0
- package/skills/ai/mcp-management/scripts/dist/mcp-client.js +183 -0
- package/skills/ai/mcp-management/scripts/mcp-client.ts +230 -0
- package/skills/ai/mcp-management/scripts/package.json +20 -0
- package/skills/ai/mcp-management/scripts/tsconfig.json +15 -0
- package/skills/core/brainstorm/SKILL.md +164 -0
- package/skills/core/brainstorm/scripts/frame-template.html +214 -0
- package/skills/core/brainstorm/scripts/helper.js +88 -0
- package/skills/core/brainstorm/scripts/server.cjs +338 -0
- package/skills/core/brainstorm/scripts/start-server.sh +153 -0
- package/skills/core/brainstorm/scripts/stop-server.sh +55 -0
- package/skills/core/brainstorm/spec-document-reviewer-prompt.md +49 -0
- package/skills/core/brainstorm/visual-companion.md +286 -0
- package/skills/core/code-review/SKILL.md +147 -0
- package/skills/core/code-review/references/code-review-reception.md +113 -0
- package/skills/core/code-review/references/codebase-scan-workflow.md +29 -0
- package/skills/core/code-review/references/edge-case-scouting.md +119 -0
- package/skills/core/code-review/references/parallel-review-workflow.md +69 -0
- package/skills/core/code-review/references/requesting-code-review.md +116 -0
- package/skills/core/code-review/references/task-management-reviews.md +140 -0
- package/skills/core/code-review/references/verification-before-completion.md +139 -0
- package/skills/core/cook/README.md +86 -0
- package/skills/core/cook/SKILL.md +113 -0
- package/skills/core/cook/references/intent-detection.md +101 -0
- package/skills/core/cook/references/review-cycle.md +75 -0
- package/skills/core/cook/references/subagent-patterns.md +75 -0
- package/skills/core/cook/references/workflow-steps.md +172 -0
- package/skills/core/debug/SKILL.md +121 -0
- package/skills/core/debug/references/defense-in-depth.md +124 -0
- package/skills/core/debug/references/frontend-verification.md +103 -0
- package/skills/core/debug/references/investigation-methodology.md +101 -0
- package/skills/core/debug/references/log-and-ci-analysis.md +97 -0
- package/skills/core/debug/references/performance-diagnostics.md +113 -0
- package/skills/core/debug/references/reporting-standards.md +122 -0
- package/skills/core/debug/references/root-cause-tracing.md +122 -0
- package/skills/core/debug/references/systematic-debugging.md +102 -0
- package/skills/core/debug/references/task-management-debugging.md +155 -0
- package/skills/core/debug/references/verification.md +123 -0
- package/skills/core/debug/scripts/find-polluter.sh +63 -0
- package/skills/core/debug/scripts/find-polluter.test.md +102 -0
- package/skills/core/execute/SKILL.md +70 -0
- package/skills/core/fix/SKILL.md +111 -0
- package/skills/core/fix/references/complexity-assessment.md +72 -0
- package/skills/core/fix/references/mode-selection.md +46 -0
- package/skills/core/fix/references/parallel-exploration.md +100 -0
- package/skills/core/fix/references/review-cycle.md +77 -0
- package/skills/core/fix/references/skill-activation-matrix.md +78 -0
- package/skills/core/fix/references/task-orchestration.md +103 -0
- package/skills/core/fix/references/workflow-ci.md +28 -0
- package/skills/core/fix/references/workflow-deep.md +122 -0
- package/skills/core/fix/references/workflow-logs.md +72 -0
- package/skills/core/fix/references/workflow-quick.md +59 -0
- package/skills/core/fix/references/workflow-standard.md +111 -0
- package/skills/core/fix/references/workflow-test.md +75 -0
- package/skills/core/fix/references/workflow-types.md +33 -0
- package/skills/core/fix/references/workflow-ui.md +75 -0
- package/skills/core/plan/SKILL.md +145 -0
- package/skills/core/plan/plan-document-reviewer-prompt.md +49 -0
- package/skills/core/subagent-dev/SKILL.md +277 -0
- package/skills/core/subagent-dev/code-quality-reviewer-prompt.md +26 -0
- package/skills/core/subagent-dev/implementer-prompt.md +113 -0
- package/skills/core/subagent-dev/spec-reviewer-prompt.md +61 -0
- package/skills/core/tdd/SKILL.md +371 -0
- package/skills/core/tdd/testing-anti-patterns.md +299 -0
- package/skills/core/test/SKILL.md +109 -0
- package/skills/core/test/references/report-format.md +58 -0
- package/skills/core/test/references/test-execution-workflow.md +103 -0
- package/skills/core/test/references/ui-testing-workflow.md +65 -0
- package/skills/core/verify/SKILL.md +139 -0
- package/skills/dev/backend-dev/SKILL.md +96 -0
- package/skills/dev/backend-dev/references/backend-api-design.md +495 -0
- package/skills/dev/backend-dev/references/backend-architecture.md +454 -0
- package/skills/dev/backend-dev/references/backend-authentication.md +338 -0
- package/skills/dev/backend-dev/references/backend-code-quality.md +659 -0
- package/skills/dev/backend-dev/references/backend-debugging.md +904 -0
- package/skills/dev/backend-dev/references/backend-devops.md +494 -0
- package/skills/dev/backend-dev/references/backend-mindset.md +387 -0
- package/skills/dev/backend-dev/references/backend-performance.md +397 -0
- package/skills/dev/backend-dev/references/backend-security.md +290 -0
- package/skills/dev/backend-dev/references/backend-technologies.md +256 -0
- package/skills/dev/backend-dev/references/backend-testing.md +429 -0
- package/skills/dev/context-engineering/SKILL.md +108 -0
- package/skills/dev/context-engineering/references/context-compression.md +84 -0
- package/skills/dev/context-engineering/references/context-degradation.md +93 -0
- package/skills/dev/context-engineering/references/context-fundamentals.md +75 -0
- package/skills/dev/context-engineering/references/context-optimization.md +82 -0
- package/skills/dev/context-engineering/references/evaluation.md +89 -0
- package/skills/dev/context-engineering/references/memory-systems.md +88 -0
- package/skills/dev/context-engineering/references/multi-agent-patterns.md +90 -0
- package/skills/dev/context-engineering/references/project-development.md +97 -0
- package/skills/dev/context-engineering/references/runtime-awareness.md +202 -0
- package/skills/dev/context-engineering/references/tool-design.md +86 -0
- package/skills/dev/context-engineering/scripts/compression_evaluator.py +349 -0
- package/skills/dev/context-engineering/scripts/context_analyzer.py +317 -0
- package/skills/dev/context-engineering/scripts/tests/test_edge_cases.py +246 -0
- package/skills/dev/databases/SKILL.md +84 -0
- package/skills/dev/databases/analytics.md +198 -0
- package/skills/dev/databases/db-design.md +188 -0
- package/skills/dev/databases/incremental-etl.md +213 -0
- package/skills/dev/databases/references/mongodb-aggregation.md +447 -0
- package/skills/dev/databases/references/mongodb-atlas.md +465 -0
- package/skills/dev/databases/references/mongodb-crud.md +408 -0
- package/skills/dev/databases/references/mongodb-indexing.md +442 -0
- package/skills/dev/databases/references/postgresql-administration.md +594 -0
- package/skills/dev/databases/references/postgresql-performance.md +527 -0
- package/skills/dev/databases/references/postgresql-psql-cli.md +467 -0
- package/skills/dev/databases/references/postgresql-queries.md +475 -0
- package/skills/dev/databases/scripts/.coverage +0 -0
- package/skills/dev/databases/scripts/db_backup.py +502 -0
- package/skills/dev/databases/scripts/db_migrate.py +426 -0
- package/skills/dev/databases/scripts/db_performance_check.py +457 -0
- package/skills/dev/databases/scripts/requirements.txt +20 -0
- package/skills/dev/databases/scripts/tests/coverage-db.json +1 -0
- package/skills/dev/databases/scripts/tests/requirements.txt +4 -0
- package/skills/dev/databases/scripts/tests/test_db_backup.py +340 -0
- package/skills/dev/databases/scripts/tests/test_db_migrate.py +277 -0
- package/skills/dev/databases/scripts/tests/test_db_performance_check.py +370 -0
- package/skills/dev/databases/stacks/bigquery.md +231 -0
- package/skills/dev/databases/stacks/d1_cloudflare.md +137 -0
- package/skills/dev/databases/stacks/mysql.md +216 -0
- package/skills/dev/databases/stacks/postgres.md +235 -0
- package/skills/dev/databases/stacks/sqlite.md +244 -0
- package/skills/dev/databases/transactional.md +176 -0
- package/skills/dev/devops/.env.example +76 -0
- package/skills/dev/devops/SKILL.md +97 -0
- package/skills/dev/devops/references/browser-rendering.md +305 -0
- package/skills/dev/devops/references/cloudflare-d1-kv.md +123 -0
- package/skills/dev/devops/references/cloudflare-platform.md +271 -0
- package/skills/dev/devops/references/cloudflare-r2-storage.md +280 -0
- package/skills/dev/devops/references/cloudflare-workers-advanced.md +312 -0
- package/skills/dev/devops/references/cloudflare-workers-apis.md +309 -0
- package/skills/dev/devops/references/cloudflare-workers-basics.md +418 -0
- package/skills/dev/devops/references/docker-basics.md +297 -0
- package/skills/dev/devops/references/docker-compose.md +292 -0
- package/skills/dev/devops/references/gcloud-platform.md +297 -0
- package/skills/dev/devops/references/gcloud-services.md +304 -0
- package/skills/dev/devops/references/kubernetes-basics.md +99 -0
- package/skills/dev/devops/references/kubernetes-helm-advanced.md +75 -0
- package/skills/dev/devops/references/kubernetes-helm.md +81 -0
- package/skills/dev/devops/references/kubernetes-kubectl.md +74 -0
- package/skills/dev/devops/references/kubernetes-security-advanced.md +98 -0
- package/skills/dev/devops/references/kubernetes-security.md +95 -0
- package/skills/dev/devops/references/kubernetes-troubleshooting-advanced.md +74 -0
- package/skills/dev/devops/references/kubernetes-troubleshooting.md +49 -0
- package/skills/dev/devops/references/kubernetes-workflows-advanced.md +75 -0
- package/skills/dev/devops/references/kubernetes-workflows.md +78 -0
- package/skills/dev/devops/scripts/cloudflare_deploy.py +269 -0
- package/skills/dev/devops/scripts/docker_optimize.py +332 -0
- package/skills/dev/devops/scripts/requirements.txt +20 -0
- package/skills/dev/devops/scripts/tests/requirements.txt +3 -0
- package/skills/dev/devops/scripts/tests/test_cloudflare_deploy.py +285 -0
- package/skills/dev/devops/scripts/tests/test_docker_optimize.py +436 -0
- package/skills/dev/frontend-design/SKILL.md +78 -0
- package/skills/dev/frontend-design/references/ai-multimodal-overview.md +165 -0
- package/skills/dev/frontend-design/references/analysis-best-practices.md +80 -0
- package/skills/dev/frontend-design/references/analysis-prompts.md +141 -0
- package/skills/dev/frontend-design/references/analysis-techniques.md +118 -0
- package/skills/dev/frontend-design/references/animejs.md +396 -0
- package/skills/dev/frontend-design/references/asset-generation.md +337 -0
- package/skills/dev/frontend-design/references/design-extraction-overview.md +71 -0
- package/skills/dev/frontend-design/references/extraction-best-practices.md +141 -0
- package/skills/dev/frontend-design/references/extraction-output-templates.md +162 -0
- package/skills/dev/frontend-design/references/extraction-prompts.md +127 -0
- package/skills/dev/frontend-design/references/technical-accessibility.md +119 -0
- package/skills/dev/frontend-design/references/technical-best-practices.md +97 -0
- package/skills/dev/frontend-design/references/technical-optimization.md +44 -0
- package/skills/dev/frontend-design/references/technical-overview.md +90 -0
- package/skills/dev/frontend-design/references/technical-workflows.md +150 -0
- package/skills/dev/frontend-design/references/visual-analysis-overview.md +95 -0
- package/skills/dev/frontend-design/references/workflow-3d.md +102 -0
- package/skills/dev/frontend-design/references/workflow-describe.md +87 -0
- package/skills/dev/frontend-design/references/workflow-immersive.md +87 -0
- package/skills/dev/frontend-design/references/workflow-quick.md +57 -0
- package/skills/dev/frontend-design/references/workflow-screenshot.md +63 -0
- package/skills/dev/frontend-design/references/workflow-video.md +74 -0
- package/skills/dev/frontend-dev/SKILL.md +400 -0
- package/skills/dev/frontend-dev/resources/common-patterns.md +331 -0
- package/skills/dev/frontend-dev/resources/complete-examples.md +872 -0
- package/skills/dev/frontend-dev/resources/component-patterns.md +502 -0
- package/skills/dev/frontend-dev/resources/data-fetching.md +767 -0
- package/skills/dev/frontend-dev/resources/file-organization.md +502 -0
- package/skills/dev/frontend-dev/resources/loading-and-error-states.md +501 -0
- package/skills/dev/frontend-dev/resources/performance.md +406 -0
- package/skills/dev/frontend-dev/resources/routing-guide.md +364 -0
- package/skills/dev/frontend-dev/resources/styling-guide.md +428 -0
- package/skills/dev/frontend-dev/resources/typescript-standards.md +418 -0
- package/skills/dev/git/SKILL.md +114 -0
- package/skills/dev/git/references/branch-management.md +88 -0
- package/skills/dev/git/references/commit-standards.md +46 -0
- package/skills/dev/git/references/gh-cli-guide.md +109 -0
- package/skills/dev/git/references/safety-protocols.md +69 -0
- package/skills/dev/git/references/workflow-commit.md +58 -0
- package/skills/dev/git/references/workflow-merge.md +48 -0
- package/skills/dev/git/references/workflow-pr.md +58 -0
- package/skills/dev/git/references/workflow-push.md +52 -0
- package/skills/dev/git-worktree/SKILL.md +218 -0
- package/skills/utils/ask/SKILL.md +58 -0
- package/skills/utils/bootstrap/SKILL.md +101 -0
- package/skills/utils/bootstrap/references/shared-phases.md +59 -0
- package/skills/utils/bootstrap/references/workflow-auto.md +52 -0
- package/skills/utils/bootstrap/references/workflow-fast.md +50 -0
- package/skills/utils/bootstrap/references/workflow-full.md +60 -0
- package/skills/utils/bootstrap/references/workflow-parallel.md +59 -0
- package/skills/utils/ck-help/SKILL.md +102 -0
- package/skills/utils/ck-help/scripts/ck-help.py +1321 -0
- package/skills/utils/ck-help/scripts/commands_data.yaml +3 -0
- package/skills/utils/ck-help/scripts/skills_data.yaml +593 -0
- package/skills/utils/copywriting/SKILL.md +94 -0
- package/skills/utils/copywriting/references/copy-formulas.md +150 -0
- package/skills/utils/copywriting/references/cta-patterns.md +168 -0
- package/skills/utils/copywriting/references/email-copy.md +193 -0
- package/skills/utils/copywriting/references/headline-templates.md +140 -0
- package/skills/utils/copywriting/references/landing-page-copy.md +175 -0
- package/skills/utils/copywriting/references/power-words.md +189 -0
- package/skills/utils/copywriting/references/social-media-copy.md +222 -0
- package/skills/utils/copywriting/references/workflow-cro.md +83 -0
- package/skills/utils/copywriting/references/workflow-enhance.md +32 -0
- package/skills/utils/copywriting/references/workflow-fast.md +29 -0
- package/skills/utils/copywriting/references/workflow-good.md +39 -0
- package/skills/utils/copywriting/references/writing-styles.md +247 -0
- package/skills/utils/copywriting/scripts/extract-writing-styles.py +308 -0
- package/skills/utils/copywriting/templates/copy-brief.md +49 -0
- package/skills/utils/docs/SKILL.md +55 -0
- package/skills/utils/docs/references/init-workflow.md +32 -0
- package/skills/utils/docs/references/summarize-workflow.md +18 -0
- package/skills/utils/docs/references/update-workflow.md +59 -0
- package/skills/utils/journal/SKILL.md +11 -0
- package/skills/utils/kanban/SKILL.md +99 -0
- package/skills/utils/preview/SKILL.md +75 -0
- package/skills/utils/preview/references/generation-modes.md +95 -0
- package/skills/utils/preview/references/view-mode.md +42 -0
- package/skills/utils/repomix/SKILL.md +248 -0
- package/skills/utils/repomix/references/configuration.md +211 -0
- package/skills/utils/repomix/references/usage-patterns.md +232 -0
- package/skills/utils/repomix/scripts/.coverage +0 -0
- package/skills/utils/repomix/scripts/README.md +179 -0
- package/skills/utils/repomix/scripts/repomix_batch.py +455 -0
- package/skills/utils/repomix/scripts/repos.example.json +15 -0
- package/skills/utils/repomix/scripts/requirements.txt +15 -0
- package/skills/utils/repomix/scripts/tests/test_repomix_batch.py +531 -0
- package/skills/utils/research/SKILL.md +171 -0
- package/skills/utils/scout/SKILL.md +89 -0
- package/skills/utils/scout/references/external-scouting.md +140 -0
- package/skills/utils/scout/references/internal-scouting.md +119 -0
- package/skills/utils/scout/references/task-management-scouting.md +125 -0
- package/skills/utils/sequential-thinking/.env.example +8 -0
- package/skills/utils/sequential-thinking/README.md +183 -0
- package/skills/utils/sequential-thinking/SKILL.md +95 -0
- package/skills/utils/sequential-thinking/package.json +31 -0
- package/skills/utils/sequential-thinking/references/advanced-strategies.md +79 -0
- package/skills/utils/sequential-thinking/references/advanced-techniques.md +76 -0
- package/skills/utils/sequential-thinking/references/core-patterns.md +95 -0
- package/skills/utils/sequential-thinking/references/examples-api.md +88 -0
- package/skills/utils/sequential-thinking/references/examples-architecture.md +94 -0
- package/skills/utils/sequential-thinking/references/examples-debug.md +90 -0
- package/skills/utils/sequential-thinking/scripts/format-thought.js +159 -0
- package/skills/utils/sequential-thinking/scripts/process-thought.js +236 -0
- package/skills/utils/sequential-thinking/tests/format-thought.test.js +133 -0
- package/skills/utils/sequential-thinking/tests/process-thought.test.js +215 -0
- package/skills/utils/write-skill/SKILL.md +655 -0
- package/skills/utils/write-skill/anthropic-best-practices.md +1150 -0
- package/skills/utils/write-skill/examples/CLAUDE_MD_TESTING.md +189 -0
- package/skills/utils/write-skill/graphviz-conventions.dot +172 -0
- package/skills/utils/write-skill/persuasion-principles.md +187 -0
- package/skills/utils/write-skill/render-graphs.js +168 -0
- package/skills/utils/write-skill/testing-skills-with-subagents.md +384 -0
- package/src/commands/init.js +238 -0
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Extract all prompts from awesome-nano-banana-pro-prompts.md into CSV."""
|
|
3
|
+
|
|
4
|
+
import re
|
|
5
|
+
import csv
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
|
|
8
|
+
def extract_prompts(md_content: str) -> list[dict]:
|
|
9
|
+
"""Extract all prompts with their metadata."""
|
|
10
|
+
prompts = []
|
|
11
|
+
|
|
12
|
+
# Split by prompt entries (### No. X:)
|
|
13
|
+
entries = re.split(r'### No\. \d+:', md_content)
|
|
14
|
+
|
|
15
|
+
for i, entry in enumerate(entries[1:], 1): # Skip content before first entry
|
|
16
|
+
prompt_data = {
|
|
17
|
+
"id": i,
|
|
18
|
+
"title": "",
|
|
19
|
+
"category": "",
|
|
20
|
+
"description": "",
|
|
21
|
+
"prompt": "",
|
|
22
|
+
"author": "",
|
|
23
|
+
"source": "",
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
# Extract title (first line after split)
|
|
27
|
+
title_match = re.search(r'^([^\n]+)', entry.strip())
|
|
28
|
+
if title_match:
|
|
29
|
+
prompt_data["title"] = title_match.group(1).strip()
|
|
30
|
+
|
|
31
|
+
# Extract category from badges
|
|
32
|
+
categories = re.findall(r'!\[([^\]]+)\]\([^)]+badge[^)]*\)', entry)
|
|
33
|
+
if categories:
|
|
34
|
+
# Filter out non-category badges
|
|
35
|
+
cats = [c for c in categories if c not in ["Featured", "Raycast", "Language-ZH", "Language-EN", "Language-JA"]]
|
|
36
|
+
prompt_data["category"] = ", ".join(cats[:3]) if cats else ""
|
|
37
|
+
|
|
38
|
+
# Extract description
|
|
39
|
+
desc_match = re.search(r'#### 📖 Description\s*\n\n([^\n#]+)', entry)
|
|
40
|
+
if desc_match:
|
|
41
|
+
prompt_data["description"] = desc_match.group(1).strip()
|
|
42
|
+
|
|
43
|
+
# Extract prompt (between ``` markers after "#### 📝 Prompt")
|
|
44
|
+
prompt_section = re.search(r'#### 📝 Prompt\s*\n\n```[^\n]*\n(.*?)```', entry, re.DOTALL)
|
|
45
|
+
if prompt_section:
|
|
46
|
+
prompt_data["prompt"] = prompt_section.group(1).strip()
|
|
47
|
+
|
|
48
|
+
# Extract author
|
|
49
|
+
author_match = re.search(r'\*\*Author:\*\*\s*\[([^\]]+)\]', entry)
|
|
50
|
+
if author_match:
|
|
51
|
+
prompt_data["author"] = author_match.group(1).strip()
|
|
52
|
+
|
|
53
|
+
# Extract source URL
|
|
54
|
+
source_match = re.search(r'\*\*Source:\*\*\s*\[([^\]]+)\]\(([^)]+)\)', entry)
|
|
55
|
+
if source_match:
|
|
56
|
+
prompt_data["source"] = source_match.group(2).strip()
|
|
57
|
+
|
|
58
|
+
if prompt_data["prompt"]: # Only add if we found a prompt
|
|
59
|
+
prompts.append(prompt_data)
|
|
60
|
+
|
|
61
|
+
return prompts
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def save_to_csv(prompts: list[dict], output_path: Path):
|
|
65
|
+
"""Save prompts to CSV file."""
|
|
66
|
+
fieldnames = ["id", "title", "category", "description", "prompt", "author", "source"]
|
|
67
|
+
|
|
68
|
+
with open(output_path, 'w', newline='', encoding='utf-8') as f:
|
|
69
|
+
writer = csv.DictWriter(f, fieldnames=fieldnames, quoting=csv.QUOTE_ALL)
|
|
70
|
+
writer.writeheader()
|
|
71
|
+
for p in prompts:
|
|
72
|
+
writer.writerow(p)
|
|
73
|
+
|
|
74
|
+
print(f"Saved {len(prompts)} prompts to {output_path}")
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def main():
|
|
78
|
+
script_dir = Path(__file__).parent
|
|
79
|
+
md_path = script_dir.parent / "references" / "awesome-nano-banana-pro-prompts.md"
|
|
80
|
+
csv_path = script_dir.parent / "data" / "awesome-prompts.csv"
|
|
81
|
+
|
|
82
|
+
print(f"Reading from: {md_path}")
|
|
83
|
+
|
|
84
|
+
with open(md_path, 'r', encoding='utf-8') as f:
|
|
85
|
+
content = f.read()
|
|
86
|
+
|
|
87
|
+
prompts = extract_prompts(content)
|
|
88
|
+
print(f"Extracted {len(prompts)} prompts")
|
|
89
|
+
|
|
90
|
+
# Print sample
|
|
91
|
+
if prompts:
|
|
92
|
+
print("\nSample prompts:")
|
|
93
|
+
for p in prompts[:3]:
|
|
94
|
+
print(f"\n[{p['id']}] {p['title'][:50]}...")
|
|
95
|
+
print(f" Category: {p['category']}")
|
|
96
|
+
print(f" Prompt: {p['prompt'][:100]}...")
|
|
97
|
+
|
|
98
|
+
save_to_csv(prompts, csv_path)
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
if __name__ == "__main__":
|
|
102
|
+
main()
|
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""
|
|
4
|
+
AI Artist Generate - Nano Banana image generation with 3 creative modes
|
|
5
|
+
|
|
6
|
+
Uses 129 actual prompts from awesome-nano-banana-pro-prompts collection.
|
|
7
|
+
|
|
8
|
+
Usage:
|
|
9
|
+
python generate.py "<concept>" --output <path.png> [options]
|
|
10
|
+
|
|
11
|
+
Modes:
|
|
12
|
+
--mode search : Find best matching prompt (default)
|
|
13
|
+
--mode creative : Remix elements from multiple prompts
|
|
14
|
+
--mode wild : AI-enhanced out-of-the-box interpretation
|
|
15
|
+
--mode all : Generate all 3 variations
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
import argparse
|
|
19
|
+
import sys
|
|
20
|
+
import os
|
|
21
|
+
import re
|
|
22
|
+
import random
|
|
23
|
+
from pathlib import Path
|
|
24
|
+
|
|
25
|
+
# Add parent for core imports
|
|
26
|
+
sys.path.insert(0, str(Path(__file__).parent))
|
|
27
|
+
from core import search
|
|
28
|
+
|
|
29
|
+
# Gemini API setup
|
|
30
|
+
CLAUDE_ROOT = Path.home() / '.claude'
|
|
31
|
+
sys.path.insert(0, str(CLAUDE_ROOT / 'scripts'))
|
|
32
|
+
PROJECT_CLAUDE = Path(__file__).parent.parent.parent.parent
|
|
33
|
+
sys.path.insert(0, str(PROJECT_CLAUDE / 'scripts'))
|
|
34
|
+
try:
|
|
35
|
+
from resolve_env import resolve_env
|
|
36
|
+
CENTRALIZED_RESOLVER = True
|
|
37
|
+
except ImportError:
|
|
38
|
+
CENTRALIZED_RESOLVER = False
|
|
39
|
+
try:
|
|
40
|
+
from dotenv import load_dotenv
|
|
41
|
+
load_dotenv(Path.home() / '.claude' / '.env')
|
|
42
|
+
load_dotenv(Path.home() / '.claude' / 'skills' / '.env')
|
|
43
|
+
except ImportError:
|
|
44
|
+
pass
|
|
45
|
+
|
|
46
|
+
try:
|
|
47
|
+
from google import genai
|
|
48
|
+
from google.genai import types
|
|
49
|
+
GENAI_AVAILABLE = True
|
|
50
|
+
except ImportError:
|
|
51
|
+
GENAI_AVAILABLE = False
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
# ============ CONFIGURATION ============
|
|
55
|
+
NANO_BANANA_MODELS = {
|
|
56
|
+
"flash": "gemini-2.5-flash-image",
|
|
57
|
+
"pro": "gemini-3-pro-image-preview",
|
|
58
|
+
}
|
|
59
|
+
DEFAULT_MODEL = "flash"
|
|
60
|
+
ASPECT_RATIOS = ["1:1", "2:3", "3:2", "3:4", "4:3", "4:5", "5:4", "9:16", "16:9", "21:9"]
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def get_api_key() -> str:
|
|
64
|
+
"""Get Gemini API key from environment."""
|
|
65
|
+
if CENTRALIZED_RESOLVER:
|
|
66
|
+
return resolve_env('GEMINI_API_KEY', skill='ai-multimodal')
|
|
67
|
+
return os.getenv('GEMINI_API_KEY')
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def adapt_prompt(template_prompt: str, concept: str, **kwargs) -> str:
|
|
71
|
+
"""Adapt a template prompt to the user's concept.
|
|
72
|
+
|
|
73
|
+
Intelligently replaces variables and adapts the prompt while keeping
|
|
74
|
+
the original structure and Nano Banana narrative style.
|
|
75
|
+
"""
|
|
76
|
+
prompt = template_prompt
|
|
77
|
+
|
|
78
|
+
# Replace common variable patterns
|
|
79
|
+
replacements = {
|
|
80
|
+
# Raycast-style arguments
|
|
81
|
+
r'\{argument name="[^"]*" default="[^"]*"\}': concept,
|
|
82
|
+
r'\{argument name=[^}]+\}': concept,
|
|
83
|
+
# Bracket variables
|
|
84
|
+
r'\[insert [^\]]+\]': concept,
|
|
85
|
+
r'\[subject\]': concept,
|
|
86
|
+
r'\[concept\]': concept,
|
|
87
|
+
r'\[topic\]': concept,
|
|
88
|
+
r'\[product\]': concept,
|
|
89
|
+
r'\[scene\]': concept,
|
|
90
|
+
r'\[description\]': concept,
|
|
91
|
+
# Generic placeholders
|
|
92
|
+
r'\{[^}]+\}': lambda m: kwargs.get(m.group(0)[1:-1], concept),
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
for pattern, replacement in replacements.items():
|
|
96
|
+
if callable(replacement):
|
|
97
|
+
prompt = re.sub(pattern, replacement, prompt, flags=re.IGNORECASE)
|
|
98
|
+
else:
|
|
99
|
+
prompt = re.sub(pattern, replacement, prompt, flags=re.IGNORECASE)
|
|
100
|
+
|
|
101
|
+
# Ensure negative constraints exist (Nano Banana style)
|
|
102
|
+
if "NEVER" not in prompt and "DO NOT" not in prompt:
|
|
103
|
+
prompt += " NEVER add watermarks or unwanted text. DO NOT include labels."
|
|
104
|
+
|
|
105
|
+
return prompt
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def mode_search(concept: str, verbose: bool = False) -> tuple[str, dict]:
|
|
109
|
+
"""Mode 1: Find best matching prompt from awesome collection."""
|
|
110
|
+
result = search(concept, "awesome", 1)
|
|
111
|
+
|
|
112
|
+
if result.get("count", 0) > 0:
|
|
113
|
+
match = result["results"][0]
|
|
114
|
+
prompt = adapt_prompt(match["prompt"], concept)
|
|
115
|
+
|
|
116
|
+
if verbose:
|
|
117
|
+
print(f" [SEARCH] Matched: {match['title'][:60]}...")
|
|
118
|
+
print(f" Author: {match.get('author', 'Unknown')}")
|
|
119
|
+
|
|
120
|
+
return prompt, {"mode": "search", "match": match}
|
|
121
|
+
|
|
122
|
+
# Fallback to basic prompt
|
|
123
|
+
prompt = f"A professional image of {concept}. High quality, detailed. Professional photography. NEVER add watermarks."
|
|
124
|
+
return prompt, {"mode": "search", "match": None}
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def mode_creative(concept: str, verbose: bool = False) -> tuple[str, dict]:
|
|
128
|
+
"""Mode 2: Creative remix - combine elements from multiple prompts."""
|
|
129
|
+
# Get top 3 matches
|
|
130
|
+
result = search(concept, "awesome", 3)
|
|
131
|
+
matches = result.get("results", [])
|
|
132
|
+
|
|
133
|
+
if len(matches) < 2:
|
|
134
|
+
return mode_search(concept, verbose)
|
|
135
|
+
|
|
136
|
+
# Extract key elements from each prompt
|
|
137
|
+
elements = []
|
|
138
|
+
for m in matches:
|
|
139
|
+
prompt = m.get("prompt", "")
|
|
140
|
+
# Extract style descriptions, lighting, composition hints
|
|
141
|
+
if "style" in prompt.lower() or "lighting" in prompt.lower():
|
|
142
|
+
elements.append(prompt[:200])
|
|
143
|
+
|
|
144
|
+
if verbose:
|
|
145
|
+
print(f" [CREATIVE] Remixing {len(matches)} prompts:")
|
|
146
|
+
for m in matches:
|
|
147
|
+
print(f" - {m['title'][:50]}...")
|
|
148
|
+
|
|
149
|
+
# Build creative remix
|
|
150
|
+
base = matches[0]["prompt"]
|
|
151
|
+
style_hints = []
|
|
152
|
+
|
|
153
|
+
# Extract style from second match
|
|
154
|
+
if len(matches) > 1:
|
|
155
|
+
m2 = matches[1]["prompt"]
|
|
156
|
+
style_match = re.search(r'(style[^.]+\.)', m2, re.IGNORECASE)
|
|
157
|
+
if style_match:
|
|
158
|
+
style_hints.append(style_match.group(1))
|
|
159
|
+
|
|
160
|
+
# Extract lighting/mood from third match
|
|
161
|
+
if len(matches) > 2:
|
|
162
|
+
m3 = matches[2]["prompt"]
|
|
163
|
+
light_match = re.search(r'(lighting[^.]+\.)', m3, re.IGNORECASE)
|
|
164
|
+
if light_match:
|
|
165
|
+
style_hints.append(light_match.group(1))
|
|
166
|
+
|
|
167
|
+
# Adapt and enhance
|
|
168
|
+
prompt = adapt_prompt(base, concept)
|
|
169
|
+
if style_hints:
|
|
170
|
+
prompt += " " + " ".join(style_hints)
|
|
171
|
+
|
|
172
|
+
return prompt, {"mode": "creative", "matches": [m["title"] for m in matches]}
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def mode_wild(concept: str, verbose: bool = False) -> tuple[str, dict]:
|
|
176
|
+
"""Mode 3: Wild/Out-of-the-box - AI-enhanced creative interpretation."""
|
|
177
|
+
result = search(concept, "awesome", 5)
|
|
178
|
+
matches = result.get("results", [])
|
|
179
|
+
|
|
180
|
+
# Creative transformations
|
|
181
|
+
transformations = [
|
|
182
|
+
"reimagined as a Japanese Ukiyo-e woodblock print with Prussian blue and vermilion",
|
|
183
|
+
"transformed into a premium liquid glass Bento grid infographic",
|
|
184
|
+
"captured as a vintage 1800s patent document with technical drawings",
|
|
185
|
+
"rendered as a surreal dreamscape with volumetric god rays",
|
|
186
|
+
"depicted in cyberpunk neon aesthetic with holographic elements",
|
|
187
|
+
"illustrated as a hand-drawn chalkboard explanation",
|
|
188
|
+
"visualized as an isometric 3D diorama with miniature figures",
|
|
189
|
+
"presented as a cinematic movie poster with dramatic lighting",
|
|
190
|
+
"created as a vaporwave aesthetic with glitch effects and Roman statues",
|
|
191
|
+
"designed as a premium Apple-style product showcase",
|
|
192
|
+
]
|
|
193
|
+
|
|
194
|
+
# Pick random transformation
|
|
195
|
+
transform = random.choice(transformations)
|
|
196
|
+
|
|
197
|
+
if matches:
|
|
198
|
+
# Use structure from a random match but apply wild transformation
|
|
199
|
+
base = random.choice(matches)
|
|
200
|
+
prompt = f"{concept}, {transform}. "
|
|
201
|
+
|
|
202
|
+
# Extract any technical camera/quality settings from matched prompt
|
|
203
|
+
tech_match = re.search(r'(\d+mm lens|f/[\d.]+|Canon|Nikon|professional photography)', base["prompt"])
|
|
204
|
+
if tech_match:
|
|
205
|
+
prompt += f"Shot with {tech_match.group(1)}. "
|
|
206
|
+
|
|
207
|
+
if verbose:
|
|
208
|
+
print(f" [WILD] Transform: {transform}")
|
|
209
|
+
print(f" Based on: {base['title'][:50]}...")
|
|
210
|
+
else:
|
|
211
|
+
prompt = f"{concept}, {transform}. Professional quality."
|
|
212
|
+
|
|
213
|
+
prompt += " NEVER add watermarks. DO NOT include unwanted text."
|
|
214
|
+
|
|
215
|
+
return prompt, {"mode": "wild", "transformation": transform}
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
def generate_image(
|
|
219
|
+
prompt: str,
|
|
220
|
+
output_path: str,
|
|
221
|
+
model: str = DEFAULT_MODEL,
|
|
222
|
+
aspect_ratio: str = "1:1",
|
|
223
|
+
size: str = "2K",
|
|
224
|
+
verbose: bool = False
|
|
225
|
+
) -> dict:
|
|
226
|
+
"""Generate image using Nano Banana (Gemini image models)."""
|
|
227
|
+
|
|
228
|
+
if not GENAI_AVAILABLE:
|
|
229
|
+
return {"status": "error", "error": "google-genai not installed. Run: pip install google-genai"}
|
|
230
|
+
|
|
231
|
+
api_key = get_api_key()
|
|
232
|
+
if not api_key:
|
|
233
|
+
return {"status": "error", "error": "GEMINI_API_KEY not found"}
|
|
234
|
+
|
|
235
|
+
model_id = NANO_BANANA_MODELS.get(model, model)
|
|
236
|
+
|
|
237
|
+
if verbose:
|
|
238
|
+
print(f"\n[Nano Banana Generation]")
|
|
239
|
+
print(f" Model: {model_id}")
|
|
240
|
+
print(f" Aspect: {aspect_ratio}")
|
|
241
|
+
print(f" Prompt: {prompt[:100]}...")
|
|
242
|
+
|
|
243
|
+
try:
|
|
244
|
+
client = genai.Client(api_key=api_key)
|
|
245
|
+
|
|
246
|
+
# Build config
|
|
247
|
+
image_config_args = {'aspect_ratio': aspect_ratio}
|
|
248
|
+
if 'pro' in model_id.lower() and size:
|
|
249
|
+
image_config_args['image_size'] = size
|
|
250
|
+
|
|
251
|
+
config = types.GenerateContentConfig(
|
|
252
|
+
response_modalities=['IMAGE'],
|
|
253
|
+
image_config=types.ImageConfig(**image_config_args)
|
|
254
|
+
)
|
|
255
|
+
|
|
256
|
+
response = client.models.generate_content(
|
|
257
|
+
model=model_id,
|
|
258
|
+
contents=[prompt],
|
|
259
|
+
config=config
|
|
260
|
+
)
|
|
261
|
+
|
|
262
|
+
output_file = Path(output_path)
|
|
263
|
+
output_file.parent.mkdir(parents=True, exist_ok=True)
|
|
264
|
+
|
|
265
|
+
if hasattr(response, 'candidates') and response.candidates:
|
|
266
|
+
for part in response.candidates[0].content.parts:
|
|
267
|
+
if part.inline_data:
|
|
268
|
+
with open(output_file, 'wb') as f:
|
|
269
|
+
f.write(part.inline_data.data)
|
|
270
|
+
|
|
271
|
+
if verbose:
|
|
272
|
+
print(f" Generated: {output_file}")
|
|
273
|
+
|
|
274
|
+
return {"status": "success", "output": str(output_file), "model": model_id}
|
|
275
|
+
|
|
276
|
+
return {"status": "error", "error": "No image in response"}
|
|
277
|
+
|
|
278
|
+
except Exception as e:
|
|
279
|
+
return {"status": "error", "error": str(e)}
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
def main():
|
|
283
|
+
parser = argparse.ArgumentParser(
|
|
284
|
+
description="AI Artist Generate - Nano Banana with 3 creative modes",
|
|
285
|
+
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
286
|
+
epilog="""
|
|
287
|
+
Modes:
|
|
288
|
+
search : Find best matching prompt from 129 curated prompts (default)
|
|
289
|
+
creative : Remix elements from multiple matching prompts
|
|
290
|
+
wild : AI-enhanced out-of-the-box creative interpretation
|
|
291
|
+
all : Generate all 3 variations
|
|
292
|
+
|
|
293
|
+
Examples:
|
|
294
|
+
# Search mode (default)
|
|
295
|
+
python generate.py "tech conference banner" -o banner.png
|
|
296
|
+
|
|
297
|
+
# Creative remix
|
|
298
|
+
python generate.py "AI workshop" -o workshop.png --mode creative
|
|
299
|
+
|
|
300
|
+
# Wild/experimental
|
|
301
|
+
python generate.py "product showcase" -o product.png --mode wild
|
|
302
|
+
|
|
303
|
+
# Generate all 3 variations
|
|
304
|
+
python generate.py "futuristic city" -o city.png --mode all
|
|
305
|
+
"""
|
|
306
|
+
)
|
|
307
|
+
|
|
308
|
+
parser.add_argument("concept", help="Core concept/subject to generate")
|
|
309
|
+
parser.add_argument("--output", "-o", required=True, help="Output image path")
|
|
310
|
+
parser.add_argument("--mode", "-m", choices=["search", "creative", "wild", "all"],
|
|
311
|
+
default="search", help="Generation mode")
|
|
312
|
+
parser.add_argument("--model", choices=list(NANO_BANANA_MODELS.keys()),
|
|
313
|
+
default=DEFAULT_MODEL, help="Model: flash or pro")
|
|
314
|
+
parser.add_argument("--aspect-ratio", "-ar", choices=ASPECT_RATIOS, default="1:1")
|
|
315
|
+
parser.add_argument("--size", choices=["1K", "2K", "4K"], default="2K")
|
|
316
|
+
parser.add_argument("--verbose", "-v", action="store_true")
|
|
317
|
+
parser.add_argument("--show-prompt", action="store_true", help="Print generated prompt")
|
|
318
|
+
parser.add_argument("--dry-run", action="store_true", help="Build prompt without generating")
|
|
319
|
+
|
|
320
|
+
args = parser.parse_args()
|
|
321
|
+
|
|
322
|
+
if args.verbose:
|
|
323
|
+
print(f"[Concept: {args.concept}]")
|
|
324
|
+
|
|
325
|
+
# Determine modes to run
|
|
326
|
+
modes = ["search", "creative", "wild"] if args.mode == "all" else [args.mode]
|
|
327
|
+
|
|
328
|
+
for mode in modes:
|
|
329
|
+
if args.verbose or len(modes) > 1:
|
|
330
|
+
print(f"\n{'='*50}")
|
|
331
|
+
print(f"[Mode: {mode.upper()}]")
|
|
332
|
+
|
|
333
|
+
# Build prompt based on mode
|
|
334
|
+
if mode == "search":
|
|
335
|
+
prompt, meta = mode_search(args.concept, args.verbose)
|
|
336
|
+
elif mode == "creative":
|
|
337
|
+
prompt, meta = mode_creative(args.concept, args.verbose)
|
|
338
|
+
elif mode == "wild":
|
|
339
|
+
prompt, meta = mode_wild(args.concept, args.verbose)
|
|
340
|
+
|
|
341
|
+
if args.show_prompt or args.verbose:
|
|
342
|
+
print(f"\n[Prompt]\n{prompt}\n")
|
|
343
|
+
|
|
344
|
+
if args.dry_run:
|
|
345
|
+
print("[Dry run - no generation]")
|
|
346
|
+
continue
|
|
347
|
+
|
|
348
|
+
# Generate output path for mode
|
|
349
|
+
output_path = args.output
|
|
350
|
+
if len(modes) > 1:
|
|
351
|
+
base = Path(args.output)
|
|
352
|
+
output_path = str(base.parent / f"{base.stem}-{mode}{base.suffix}")
|
|
353
|
+
|
|
354
|
+
result = generate_image(
|
|
355
|
+
prompt=prompt,
|
|
356
|
+
output_path=output_path,
|
|
357
|
+
model=args.model,
|
|
358
|
+
aspect_ratio=args.aspect_ratio,
|
|
359
|
+
size=args.size,
|
|
360
|
+
verbose=args.verbose
|
|
361
|
+
)
|
|
362
|
+
|
|
363
|
+
if result["status"] == "success":
|
|
364
|
+
print(f"✓ Generated: {result['output']}")
|
|
365
|
+
else:
|
|
366
|
+
print(f"✗ Error: {result['error']}")
|
|
367
|
+
|
|
368
|
+
|
|
369
|
+
if __name__ == "__main__":
|
|
370
|
+
main()
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""
|
|
4
|
+
AI Artist Search - BM25 search engine for prompt engineering resources
|
|
5
|
+
Usage: python search.py "<query>" [--domain <domain>] [--max-results 3]
|
|
6
|
+
python search.py "<query>" --prompt-system [--platform <platform>]
|
|
7
|
+
|
|
8
|
+
Domains: use-case, style, platform, technique, lighting
|
|
9
|
+
Platforms: midjourney, dalle, sd, flux, nano-banana
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import argparse
|
|
13
|
+
import sys
|
|
14
|
+
from core import CSV_CONFIG, MAX_RESULTS, search, search_all_domains
|
|
15
|
+
|
|
16
|
+
# Fix Windows cp1252 encoding: hardcoded emojis can't encode on Windows.
|
|
17
|
+
# Reconfigure stdout to UTF-8 with replacement (Python 3.7+).
|
|
18
|
+
if sys.stdout.encoding and sys.stdout.encoding.lower() != "utf-8":
|
|
19
|
+
if hasattr(sys.stdout, 'reconfigure'):
|
|
20
|
+
sys.stdout.reconfigure(encoding="utf-8", errors="replace")
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def format_output(result):
|
|
24
|
+
"""Format results for Claude consumption (token-optimized)"""
|
|
25
|
+
if "error" in result:
|
|
26
|
+
return f"Error: {result['error']}"
|
|
27
|
+
|
|
28
|
+
output = []
|
|
29
|
+
output.append(f"## AI Artist Search Results")
|
|
30
|
+
output.append(f"**Domain:** {result['domain']} | **Query:** {result['query']}")
|
|
31
|
+
output.append(f"**Source:** {result['file']} | **Found:** {result['count']} results\n")
|
|
32
|
+
|
|
33
|
+
for i, row in enumerate(result['results'], 1):
|
|
34
|
+
output.append(f"### Result {i}")
|
|
35
|
+
for key, value in row.items():
|
|
36
|
+
value_str = str(value)
|
|
37
|
+
if len(value_str) > 400:
|
|
38
|
+
value_str = value_str[:400] + "..."
|
|
39
|
+
output.append(f"- **{key}:** {value_str}")
|
|
40
|
+
output.append("")
|
|
41
|
+
|
|
42
|
+
return "\n".join(output)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def generate_prompt_system(query, platform=None):
|
|
46
|
+
"""Generate a comprehensive prompt system for a given concept"""
|
|
47
|
+
output = []
|
|
48
|
+
output.append(f"## 🎨 AI Artist Prompt System")
|
|
49
|
+
output.append(f"**Concept:** {query}")
|
|
50
|
+
if platform:
|
|
51
|
+
output.append(f"**Target Platform:** {platform}")
|
|
52
|
+
output.append("")
|
|
53
|
+
|
|
54
|
+
# Search relevant domains
|
|
55
|
+
use_case = search(query, "use-case", 1)
|
|
56
|
+
style = search(query, "style", 2)
|
|
57
|
+
lighting = search(query, "lighting", 1)
|
|
58
|
+
technique = search(query, "technique", 2)
|
|
59
|
+
|
|
60
|
+
# Use case / Template
|
|
61
|
+
if use_case.get("count", 0) > 0:
|
|
62
|
+
uc = use_case["results"][0]
|
|
63
|
+
output.append("### 📋 Use Case Match")
|
|
64
|
+
output.append(f"**{uc.get('Use Case', 'N/A')}** ({uc.get('Category', '')})")
|
|
65
|
+
if uc.get("Prompt Template"):
|
|
66
|
+
output.append(f"**Template:** `{uc.get('Prompt Template')}`")
|
|
67
|
+
if uc.get("Key Elements"):
|
|
68
|
+
output.append(f"**Key Elements:** {uc.get('Key Elements')}")
|
|
69
|
+
if uc.get("Tips"):
|
|
70
|
+
output.append(f"**Tips:** {uc.get('Tips')}")
|
|
71
|
+
output.append("")
|
|
72
|
+
|
|
73
|
+
# Styles
|
|
74
|
+
if style.get("count", 0) > 0:
|
|
75
|
+
output.append("### 🎭 Recommended Styles")
|
|
76
|
+
for s in style["results"]:
|
|
77
|
+
output.append(f"**{s.get('Style Name', 'N/A')}** - {s.get('Description', '')}")
|
|
78
|
+
if s.get("Prompt Keywords"):
|
|
79
|
+
output.append(f" Keywords: `{s.get('Prompt Keywords')}`")
|
|
80
|
+
output.append("")
|
|
81
|
+
|
|
82
|
+
# Lighting
|
|
83
|
+
if lighting.get("count", 0) > 0:
|
|
84
|
+
lt = lighting["results"][0]
|
|
85
|
+
output.append("### 💡 Lighting Suggestion")
|
|
86
|
+
output.append(f"**{lt.get('Lighting Type', 'N/A')}** - {lt.get('Description', '')}")
|
|
87
|
+
output.append(f" Mood: {lt.get('Mood', '')} | Keywords: `{lt.get('Prompt Keywords', '')}`")
|
|
88
|
+
output.append("")
|
|
89
|
+
|
|
90
|
+
# Techniques
|
|
91
|
+
if technique.get("count", 0) > 0:
|
|
92
|
+
output.append("### 🔧 Relevant Techniques")
|
|
93
|
+
for t in technique["results"]:
|
|
94
|
+
output.append(f"**{t.get('Technique', 'N/A')}**: {t.get('Description', '')}")
|
|
95
|
+
if t.get("Syntax Example"):
|
|
96
|
+
output.append(f" Example: `{t.get('Syntax Example')}`")
|
|
97
|
+
output.append("")
|
|
98
|
+
|
|
99
|
+
# Platform-specific tips
|
|
100
|
+
if platform:
|
|
101
|
+
plat = search(platform, "platform", 1)
|
|
102
|
+
if plat.get("count", 0) > 0:
|
|
103
|
+
p = plat["results"][0]
|
|
104
|
+
output.append(f"### 🖥️ {p.get('Platform', '')} Tips")
|
|
105
|
+
output.append(f"**Prompt Style:** {p.get('Prompt Style', '')}")
|
|
106
|
+
output.append(f"**Key Parameters:** {p.get('Key Parameters', '')}")
|
|
107
|
+
output.append(f"**Best Practices:** {p.get('Best Practices', '')}")
|
|
108
|
+
output.append("")
|
|
109
|
+
|
|
110
|
+
return "\n".join(output)
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
if __name__ == "__main__":
|
|
114
|
+
parser = argparse.ArgumentParser(description="AI Artist Search")
|
|
115
|
+
parser.add_argument("query", help="Search query")
|
|
116
|
+
parser.add_argument("--domain", "-d", choices=list(CSV_CONFIG.keys()), help="Search domain")
|
|
117
|
+
parser.add_argument("--max-results", "-n", type=int, default=MAX_RESULTS, help="Max results (default: 3)")
|
|
118
|
+
parser.add_argument("--json", action="store_true", help="Output as JSON")
|
|
119
|
+
# Prompt system generation
|
|
120
|
+
parser.add_argument("--prompt-system", "-ps", action="store_true", help="Generate comprehensive prompt system")
|
|
121
|
+
parser.add_argument("--platform", "-p", type=str, default=None, help="Target platform for prompt system")
|
|
122
|
+
parser.add_argument("--all", "-a", action="store_true", help="Search all domains")
|
|
123
|
+
|
|
124
|
+
args = parser.parse_args()
|
|
125
|
+
|
|
126
|
+
# Prompt system generation
|
|
127
|
+
if args.prompt_system:
|
|
128
|
+
result = generate_prompt_system(args.query, args.platform)
|
|
129
|
+
print(result)
|
|
130
|
+
# Search all domains
|
|
131
|
+
elif args.all:
|
|
132
|
+
results = search_all_domains(args.query, args.max_results)
|
|
133
|
+
if args.json:
|
|
134
|
+
import json
|
|
135
|
+
print(json.dumps(results, indent=2, ensure_ascii=False))
|
|
136
|
+
else:
|
|
137
|
+
for domain, result in results.items():
|
|
138
|
+
print(format_output(result))
|
|
139
|
+
print("---\n")
|
|
140
|
+
# Domain search
|
|
141
|
+
else:
|
|
142
|
+
result = search(args.query, args.domain, args.max_results)
|
|
143
|
+
if args.json:
|
|
144
|
+
import json
|
|
145
|
+
print(json.dumps(result, indent=2, ensure_ascii=False))
|
|
146
|
+
else:
|
|
147
|
+
print(format_output(result))
|