ai-engineering-init 1.1.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/.claude/agents/code-reviewer.md +139 -0
- package/.claude/agents/project-manager.md +159 -0
- package/.claude/audio/completed.wav +0 -0
- package/.claude/commands/add-todo.md +255 -0
- package/.claude/commands/check.md +210 -0
- package/.claude/commands/crud.md +454 -0
- package/.claude/commands/dev.md +503 -0
- package/.claude/commands/init-docs.md +681 -0
- package/.claude/commands/next.md +251 -0
- package/.claude/commands/progress.md +242 -0
- package/.claude/commands/start.md +199 -0
- package/.claude/commands/sync.md +307 -0
- package/.claude/commands/update-status.md +428 -0
- package/.claude/docs/Mixin/344/275/277/347/224/250/346/214/207/345/215/227.md +299 -0
- package/.claude/docs/README.md +167 -0
- package/.claude/docs//345/211/215/347/253/257/345/274/200/345/217/221/346/214/207/345/215/227.md +599 -0
- package/.claude/docs//345/220/216/347/253/257/345/274/200/345/217/221/346/214/207/345/215/227.md +726 -0
- package/.claude/docs//345/267/245/344/275/234/346/265/201/345/274/200/345/217/221/346/214/207/345/215/227.md +714 -0
- package/.claude/docs//345/267/245/345/205/267/347/261/273/344/275/277/347/224/250/346/214/207/345/215/227.md +463 -0
- package/.claude/docs//346/225/260/346/215/256/345/272/223/350/256/276/350/256/241/350/247/204/350/214/203.md +390 -0
- package/.claude/docs//346/226/260/345/212/237/350/203/275/345/274/200/345/217/221/346/265/201/347/250/213/350/247/204/350/214/203.md +688 -0
- package/.claude/docs//346/226/260/351/241/271/347/233/256/345/274/200/345/217/221/346/265/201/347/250/213.md +365 -0
- package/.claude/docs//346/241/206/346/236/266/350/257/264/346/230/216.md +393 -0
- package/.claude/docs//350/267/257/347/224/261/351/205/215/347/275/256/346/214/207/345/215/227.md +246 -0
- package/.claude/framework-config.json +73 -0
- package/.claude/hooks/pre-tool-use.js +117 -0
- package/.claude/hooks/skill-forced-eval.js +167 -0
- package/.claude/hooks/stop.js +58 -0
- package/.claude/settings.json +41 -0
- package/.claude/skills/add-skill/SKILL.md +352 -0
- package/.claude/skills/api-development/SKILL.md +560 -0
- package/.claude/skills/architecture-design/SKILL.md +756 -0
- package/.claude/skills/backend-annotations/SKILL.md +674 -0
- package/.claude/skills/banana-image/CHANGELOG.md +37 -0
- package/.claude/skills/banana-image/README.md +146 -0
- package/.claude/skills/banana-image/SKILL.md +164 -0
- package/.claude/skills/banana-image/assets/logo.png +0 -0
- package/.claude/skills/banana-image/references/advanced-usage.md +189 -0
- package/.claude/skills/banana-image/scripts/apply_template.py +125 -0
- package/.claude/skills/banana-image/scripts/banana_image_exec.ts +412 -0
- package/.claude/skills/banana-image/scripts/batch_prep.py +82 -0
- package/.claude/skills/banana-image/scripts/package-lock.json +1437 -0
- package/.claude/skills/banana-image/scripts/package.json +18 -0
- package/.claude/skills/banana-image/scripts/requirements.txt +10 -0
- package/.claude/skills/banana-image/templates/poster.json +22 -0
- package/.claude/skills/banana-image/templates/product.json +17 -0
- package/.claude/skills/banana-image/templates/social.json +22 -0
- package/.claude/skills/banana-image/templates/thumbnail.json +17 -0
- package/.claude/skills/brainstorm/SKILL.md +648 -0
- package/.claude/skills/bug-detective/SKILL.md +1206 -0
- package/.claude/skills/code-patterns/SKILL.md +590 -0
- package/.claude/skills/collaborating-with-codex/SKILL.md +174 -0
- package/.claude/skills/collaborating-with-codex/scripts/codex_bridge.py +275 -0
- package/.claude/skills/collaborating-with-gemini/SKILL.md +194 -0
- package/.claude/skills/collaborating-with-gemini/scripts/gemini_bridge.py +275 -0
- package/.claude/skills/crud-development/SKILL.md +649 -0
- package/.claude/skills/data-permission/SKILL.md +599 -0
- package/.claude/skills/database-ops/SKILL.md +407 -0
- package/.claude/skills/error-handler/SKILL.md +371 -0
- package/.claude/skills/file-oss-management/SKILL.md +863 -0
- package/.claude/skills/git-workflow/SKILL.md +375 -0
- package/.claude/skills/json-serialization/SKILL.md +357 -0
- package/.claude/skills/leniu-api-development/SKILL.md +803 -0
- package/.claude/skills/leniu-architecture-design/SKILL.md +598 -0
- package/.claude/skills/leniu-backend-annotations/SKILL.md +664 -0
- package/.claude/skills/leniu-code-patterns/SKILL.md +365 -0
- package/.claude/skills/leniu-crud-development/SKILL.md +1110 -0
- package/.claude/skills/leniu-data-permission/SKILL.md +256 -0
- package/.claude/skills/leniu-database-ops/SKILL.md +426 -0
- package/.claude/skills/leniu-error-handler/SKILL.md +462 -0
- package/.claude/skills/leniu-java-amount-handling/SKILL.md +461 -0
- package/.claude/skills/leniu-java-code-style/SKILL.md +510 -0
- package/.claude/skills/leniu-java-concurrent/SKILL.md +400 -0
- package/.claude/skills/leniu-java-entity/SKILL.md +751 -0
- package/.claude/skills/leniu-java-export/SKILL.md +560 -0
- package/.claude/skills/leniu-java-logging/SKILL.md +832 -0
- package/.claude/skills/leniu-java-mq/SKILL.md +338 -0
- package/.claude/skills/leniu-java-mybatis/SKILL.md +640 -0
- package/.claude/skills/leniu-java-report-query-param/SKILL.md +291 -0
- package/.claude/skills/leniu-java-task/SKILL.md +367 -0
- package/.claude/skills/leniu-java-total-line/SKILL.md +195 -0
- package/.claude/skills/leniu-marketing-price-rule-customizer/SKILL.md +301 -0
- package/.claude/skills/leniu-marketing-recharge-rule-customizer/SKILL.md +285 -0
- package/.claude/skills/leniu-mealtime/SKILL.md +215 -0
- package/.claude/skills/leniu-redis-cache/SKILL.md +316 -0
- package/.claude/skills/leniu-security-guard/SKILL.md +520 -0
- package/.claude/skills/leniu-utils-toolkit/SKILL.md +380 -0
- package/.claude/skills/openspec-apply-change/SKILL.md +156 -0
- package/.claude/skills/openspec-archive-change/SKILL.md +114 -0
- package/.claude/skills/openspec-bulk-archive-change/SKILL.md +246 -0
- package/.claude/skills/openspec-continue-change/SKILL.md +118 -0
- package/.claude/skills/openspec-explore/SKILL.md +290 -0
- package/.claude/skills/openspec-ff-change/SKILL.md +101 -0
- package/.claude/skills/openspec-new-change/SKILL.md +74 -0
- package/.claude/skills/openspec-onboard/SKILL.md +529 -0
- package/.claude/skills/openspec-sync-specs/SKILL.md +138 -0
- package/.claude/skills/openspec-verify-change/SKILL.md +168 -0
- package/.claude/skills/performance-doctor/SKILL.md +627 -0
- package/.claude/skills/project-navigator/SKILL.md +305 -0
- package/.claude/skills/redis-cache/SKILL.md +839 -0
- package/.claude/skills/scheduled-jobs/SKILL.md +633 -0
- package/.claude/skills/security-guard/SKILL.md +748 -0
- package/.claude/skills/sms-mail/SKILL.md +766 -0
- package/.claude/skills/social-login/SKILL.md +668 -0
- package/.claude/skills/store-pc/SKILL.md +366 -0
- package/.claude/skills/task-tracker/SKILL.md +307 -0
- package/.claude/skills/tech-decision/SKILL.md +393 -0
- package/.claude/skills/tenant-management/SKILL.md +603 -0
- package/.claude/skills/test-development/SKILL.md +755 -0
- package/.claude/skills/ui-pc/SKILL.md +438 -0
- package/.claude/skills/utils-toolkit/SKILL.md +615 -0
- package/.claude/skills/websocket-sse/SKILL.md +716 -0
- package/.claude/skills/workflow-engine/SKILL.md +676 -0
- package/.claude/templates//345/276/205/345/212/236/346/270/205/345/215/225/346/250/241/346/235/277.md +56 -0
- package/.claude/templates//351/234/200/346/261/202/346/226/207/346/241/243/346/250/241/346/235/277.md +85 -0
- package/.claude/templates//351/241/271/347/233/256/347/212/266/346/200/201/346/250/241/346/235/277.md +43 -0
- package/.codex/skills/add-skill/SKILL.md +352 -0
- package/.codex/skills/add-todo/SKILL.md +269 -0
- package/.codex/skills/api-development/SKILL.md +693 -0
- package/.codex/skills/architecture-design/SKILL.md +628 -0
- package/.codex/skills/backend-annotations/SKILL.md +664 -0
- package/.codex/skills/banana-image/CHANGELOG.md +37 -0
- package/.codex/skills/banana-image/README.md +146 -0
- package/.codex/skills/banana-image/SKILL.md +164 -0
- package/.codex/skills/banana-image/assets/logo.png +0 -0
- package/.codex/skills/banana-image/references/advanced-usage.md +189 -0
- package/.codex/skills/banana-image/scripts/apply_template.py +125 -0
- package/.codex/skills/banana-image/scripts/banana_image_exec.ts +412 -0
- package/.codex/skills/banana-image/scripts/batch_prep.py +82 -0
- package/.codex/skills/banana-image/scripts/package-lock.json +1437 -0
- package/.codex/skills/banana-image/scripts/package.json +18 -0
- package/.codex/skills/banana-image/scripts/requirements.txt +10 -0
- package/.codex/skills/banana-image/templates/poster.json +22 -0
- package/.codex/skills/banana-image/templates/product.json +17 -0
- package/.codex/skills/banana-image/templates/social.json +22 -0
- package/.codex/skills/banana-image/templates/thumbnail.json +17 -0
- package/.codex/skills/brainstorm/SKILL.md +648 -0
- package/.codex/skills/bug-detective/SKILL.md +1206 -0
- package/.codex/skills/check/SKILL.md +367 -0
- package/.codex/skills/code-patterns/SKILL.md +442 -0
- package/.codex/skills/collaborating-with-codex/SKILL.md +174 -0
- package/.codex/skills/collaborating-with-codex/scripts/codex_bridge.py +275 -0
- package/.codex/skills/collaborating-with-gemini/SKILL.md +194 -0
- package/.codex/skills/collaborating-with-gemini/scripts/gemini_bridge.py +275 -0
- package/.codex/skills/crud/SKILL.md +265 -0
- package/.codex/skills/crud-development/SKILL.md +637 -0
- package/.codex/skills/data-permission/SKILL.md +591 -0
- package/.codex/skills/database-ops/SKILL.md +553 -0
- package/.codex/skills/dev/SKILL.md +187 -0
- package/.codex/skills/error-handler/SKILL.md +361 -0
- package/.codex/skills/file-oss-management/SKILL.md +863 -0
- package/.codex/skills/git-workflow/SKILL.md +375 -0
- package/.codex/skills/init-docs/SKILL.md +194 -0
- package/.codex/skills/json-serialization/SKILL.md +357 -0
- package/.codex/skills/leniu-api-development/SKILL.md +803 -0
- package/.codex/skills/leniu-architecture-design/SKILL.md +594 -0
- package/.codex/skills/leniu-backend-annotations/SKILL.md +662 -0
- package/.codex/skills/leniu-code-patterns/SKILL.md +365 -0
- package/.codex/skills/leniu-crud-development/SKILL.md +1110 -0
- package/.codex/skills/leniu-data-permission/SKILL.md +256 -0
- package/.codex/skills/leniu-database-ops/SKILL.md +426 -0
- package/.codex/skills/leniu-error-handler/SKILL.md +462 -0
- package/.codex/skills/leniu-java-amount-handling/SKILL.md +461 -0
- package/.codex/skills/leniu-java-code-style/SKILL.md +510 -0
- package/.codex/skills/leniu-java-concurrent/SKILL.md +400 -0
- package/.codex/skills/leniu-java-entity/SKILL.md +751 -0
- package/.codex/skills/leniu-java-export/SKILL.md +560 -0
- package/.codex/skills/leniu-java-logging/SKILL.md +832 -0
- package/.codex/skills/leniu-java-mq/SKILL.md +338 -0
- package/.codex/skills/leniu-java-mybatis/SKILL.md +640 -0
- package/.codex/skills/leniu-java-report-query-param/SKILL.md +291 -0
- package/.codex/skills/leniu-java-task/SKILL.md +367 -0
- package/.codex/skills/leniu-java-total-line/SKILL.md +195 -0
- package/.codex/skills/leniu-marketing-price-rule-customizer/SKILL.md +301 -0
- package/.codex/skills/leniu-marketing-recharge-rule-customizer/SKILL.md +285 -0
- package/.codex/skills/leniu-mealtime/SKILL.md +215 -0
- package/.codex/skills/leniu-redis-cache/SKILL.md +316 -0
- package/.codex/skills/leniu-security-guard/SKILL.md +520 -0
- package/.codex/skills/leniu-utils-toolkit/SKILL.md +378 -0
- package/.codex/skills/next/SKILL.md +137 -0
- package/.codex/skills/openspec-apply-change/SKILL.md +156 -0
- package/.codex/skills/openspec-archive-change/SKILL.md +114 -0
- package/.codex/skills/openspec-bulk-archive-change/SKILL.md +246 -0
- package/.codex/skills/openspec-continue-change/SKILL.md +118 -0
- package/.codex/skills/openspec-explore/SKILL.md +290 -0
- package/.codex/skills/openspec-ff-change/SKILL.md +101 -0
- package/.codex/skills/openspec-new-change/SKILL.md +74 -0
- package/.codex/skills/openspec-onboard/SKILL.md +529 -0
- package/.codex/skills/openspec-sync-specs/SKILL.md +138 -0
- package/.codex/skills/openspec-verify-change/SKILL.md +168 -0
- package/.codex/skills/performance-doctor/SKILL.md +627 -0
- package/.codex/skills/progress/SKILL.md +193 -0
- package/.codex/skills/project-navigator/SKILL.md +286 -0
- package/.codex/skills/redis-cache/SKILL.md +829 -0
- package/.codex/skills/scheduled-jobs/SKILL.md +633 -0
- package/.codex/skills/security-guard/SKILL.md +739 -0
- package/.codex/skills/sms-mail/SKILL.md +766 -0
- package/.codex/skills/social-login/SKILL.md +668 -0
- package/.codex/skills/start/SKILL.md +154 -0
- package/.codex/skills/store-pc/SKILL.md +491 -0
- package/.codex/skills/sync/SKILL.md +149 -0
- package/.codex/skills/task-tracker/SKILL.md +307 -0
- package/.codex/skills/tech-decision/SKILL.md +393 -0
- package/.codex/skills/tenant-management/SKILL.md +603 -0
- package/.codex/skills/test-development/SKILL.md +755 -0
- package/.codex/skills/ui-pc/SKILL.md +475 -0
- package/.codex/skills/update-status/SKILL.md +159 -0
- package/.codex/skills/utils-toolkit/SKILL.md +593 -0
- package/.codex/skills/websocket-sse/SKILL.md +716 -0
- package/.codex/skills/workflow-engine/SKILL.md +676 -0
- package/.cursor/agents/code-reviewer.md +139 -0
- package/.cursor/agents/project-manager.md +159 -0
- package/.cursor/commands/opsx-apply.md +152 -0
- package/.cursor/commands/opsx-archive.md +157 -0
- package/.cursor/commands/opsx-bulk-archive.md +242 -0
- package/.cursor/commands/opsx-continue.md +114 -0
- package/.cursor/commands/opsx-explore.md +174 -0
- package/.cursor/commands/opsx-ff.md +94 -0
- package/.cursor/commands/opsx-new.md +69 -0
- package/.cursor/commands/opsx-onboard.md +525 -0
- package/.cursor/commands/opsx-sync.md +134 -0
- package/.cursor/commands/opsx-verify.md +164 -0
- package/.cursor/mcp.json +22 -0
- package/.cursor/skills/add-skill/SKILL.md +352 -0
- package/.cursor/skills/api-development/SKILL.md +560 -0
- package/.cursor/skills/architecture-design/SKILL.md +756 -0
- package/.cursor/skills/backend-annotations/SKILL.md +674 -0
- package/.cursor/skills/banana-image/CHANGELOG.md +37 -0
- package/.cursor/skills/banana-image/README.md +146 -0
- package/.cursor/skills/banana-image/SKILL.md +164 -0
- package/.cursor/skills/banana-image/assets/logo.png +0 -0
- package/.cursor/skills/banana-image/references/advanced-usage.md +189 -0
- package/.cursor/skills/banana-image/scripts/apply_template.py +125 -0
- package/.cursor/skills/banana-image/scripts/banana_image_exec.ts +412 -0
- package/.cursor/skills/banana-image/scripts/batch_prep.py +82 -0
- package/.cursor/skills/banana-image/scripts/package-lock.json +1437 -0
- package/.cursor/skills/banana-image/scripts/package.json +18 -0
- package/.cursor/skills/banana-image/scripts/requirements.txt +10 -0
- package/.cursor/skills/banana-image/templates/poster.json +22 -0
- package/.cursor/skills/banana-image/templates/product.json +17 -0
- package/.cursor/skills/banana-image/templates/social.json +22 -0
- package/.cursor/skills/banana-image/templates/thumbnail.json +17 -0
- package/.cursor/skills/brainstorm/SKILL.md +648 -0
- package/.cursor/skills/bug-detective/SKILL.md +1206 -0
- package/.cursor/skills/code-patterns/SKILL.md +590 -0
- package/.cursor/skills/collaborating-with-codex/SKILL.md +174 -0
- package/.cursor/skills/collaborating-with-codex/scripts/codex_bridge.py +275 -0
- package/.cursor/skills/collaborating-with-gemini/SKILL.md +194 -0
- package/.cursor/skills/collaborating-with-gemini/scripts/gemini_bridge.py +275 -0
- package/.cursor/skills/crud-development/SKILL.md +649 -0
- package/.cursor/skills/data-permission/SKILL.md +599 -0
- package/.cursor/skills/database-ops/SKILL.md +407 -0
- package/.cursor/skills/error-handler/SKILL.md +371 -0
- package/.cursor/skills/file-oss-management/SKILL.md +863 -0
- package/.cursor/skills/git-workflow/SKILL.md +375 -0
- package/.cursor/skills/json-serialization/SKILL.md +357 -0
- package/.cursor/skills/leniu-api-development/SKILL.md +803 -0
- package/.cursor/skills/leniu-architecture-design/SKILL.md +598 -0
- package/.cursor/skills/leniu-backend-annotations/SKILL.md +664 -0
- package/.cursor/skills/leniu-code-patterns/SKILL.md +365 -0
- package/.cursor/skills/leniu-crud-development/SKILL.md +1110 -0
- package/.cursor/skills/leniu-data-permission/SKILL.md +256 -0
- package/.cursor/skills/leniu-database-ops/SKILL.md +426 -0
- package/.cursor/skills/leniu-error-handler/SKILL.md +462 -0
- package/.cursor/skills/leniu-java-amount-handling/SKILL.md +461 -0
- package/.cursor/skills/leniu-java-code-style/SKILL.md +510 -0
- package/.cursor/skills/leniu-java-concurrent/SKILL.md +400 -0
- package/.cursor/skills/leniu-java-entity/SKILL.md +751 -0
- package/.cursor/skills/leniu-java-export/SKILL.md +560 -0
- package/.cursor/skills/leniu-java-logging/SKILL.md +832 -0
- package/.cursor/skills/leniu-java-mq/SKILL.md +338 -0
- package/.cursor/skills/leniu-java-mybatis/SKILL.md +640 -0
- package/.cursor/skills/leniu-java-report-query-param/SKILL.md +291 -0
- package/.cursor/skills/leniu-java-task/SKILL.md +367 -0
- package/.cursor/skills/leniu-java-total-line/SKILL.md +195 -0
- package/.cursor/skills/leniu-marketing-price-rule-customizer/SKILL.md +301 -0
- package/.cursor/skills/leniu-marketing-recharge-rule-customizer/SKILL.md +285 -0
- package/.cursor/skills/leniu-mealtime/SKILL.md +215 -0
- package/.cursor/skills/leniu-redis-cache/SKILL.md +316 -0
- package/.cursor/skills/leniu-security-guard/SKILL.md +520 -0
- package/.cursor/skills/leniu-utils-toolkit/SKILL.md +380 -0
- package/.cursor/skills/openspec-apply-change/SKILL.md +156 -0
- package/.cursor/skills/openspec-archive-change/SKILL.md +114 -0
- package/.cursor/skills/openspec-bulk-archive-change/SKILL.md +246 -0
- package/.cursor/skills/openspec-continue-change/SKILL.md +118 -0
- package/.cursor/skills/openspec-explore/SKILL.md +290 -0
- package/.cursor/skills/openspec-ff-change/SKILL.md +101 -0
- package/.cursor/skills/openspec-new-change/SKILL.md +74 -0
- package/.cursor/skills/openspec-onboard/SKILL.md +529 -0
- package/.cursor/skills/openspec-sync-specs/SKILL.md +138 -0
- package/.cursor/skills/openspec-verify-change/SKILL.md +168 -0
- package/.cursor/skills/performance-doctor/SKILL.md +627 -0
- package/.cursor/skills/project-navigator/SKILL.md +305 -0
- package/.cursor/skills/redis-cache/SKILL.md +839 -0
- package/.cursor/skills/scheduled-jobs/SKILL.md +633 -0
- package/.cursor/skills/security-guard/SKILL.md +748 -0
- package/.cursor/skills/sms-mail/SKILL.md +766 -0
- package/.cursor/skills/social-login/SKILL.md +668 -0
- package/.cursor/skills/store-pc/SKILL.md +366 -0
- package/.cursor/skills/task-tracker/SKILL.md +307 -0
- package/.cursor/skills/tech-decision/SKILL.md +393 -0
- package/.cursor/skills/tenant-management/SKILL.md +603 -0
- package/.cursor/skills/test-development/SKILL.md +755 -0
- package/.cursor/skills/ui-pc/SKILL.md +438 -0
- package/.cursor/skills/utils-toolkit/SKILL.md +615 -0
- package/.cursor/skills/websocket-sse/SKILL.md +716 -0
- package/.cursor/skills/workflow-engine/SKILL.md +676 -0
- package/AGENTS.md +669 -0
- package/CLAUDE.md +205 -0
- package/README.md +205 -0
- package/bin/index.js +179 -0
- package/init.sh +178 -0
- package/package.json +27 -0
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="assets/logo.png" alt="Banana Image Logo" width="280">
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
<h1 align="center">Banana Image</h1>
|
|
6
|
+
|
|
7
|
+
<p align="center">
|
|
8
|
+
<strong>AI-Powered Image Generation Tool for Claude Code</strong>
|
|
9
|
+
</p>
|
|
10
|
+
|
|
11
|
+
<p align="center">
|
|
12
|
+
<a href="#features">Features</a> •
|
|
13
|
+
<a href="#installation">Installation</a> •
|
|
14
|
+
<a href="#usage">Usage</a> •
|
|
15
|
+
<a href="#models">Models</a> •
|
|
16
|
+
<a href="#examples">Examples</a>
|
|
17
|
+
</p>
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Features
|
|
22
|
+
|
|
23
|
+
- **Dual Model Support** - Flash (fast) and Pro (high-quality 4K)
|
|
24
|
+
- **Flexible Aspect Ratios** - 1:1, 16:9, 9:16, 4:3, 2:3, 21:9, and more
|
|
25
|
+
- **Image Editing** - Modify existing images with text prompts
|
|
26
|
+
- **Batch Generation** - Generate up to 4 variants at once
|
|
27
|
+
- **Proxy Support** - Works behind corporate firewalls
|
|
28
|
+
- **Claude Code Integration** - Seamless skill integration
|
|
29
|
+
|
|
30
|
+
## Installation
|
|
31
|
+
|
|
32
|
+
### 1. Set API Key
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
export GEMINI_API_KEY="your-api-key"
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### 2. Install Dependencies
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
cd ~/.claude/skills/banana-image/scripts
|
|
42
|
+
npm install
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Usage
|
|
46
|
+
|
|
47
|
+
### Quick Start
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
# Fast generation (Flash model)
|
|
51
|
+
npx tsx ~/.claude/skills/banana-image/scripts/banana_image_exec.ts \
|
|
52
|
+
-p "A cute shiba inu in the park" -m flash
|
|
53
|
+
|
|
54
|
+
# 4K high-quality (Pro model)
|
|
55
|
+
npx tsx ~/.claude/skills/banana-image/scripts/banana_image_exec.ts \
|
|
56
|
+
-p "Professional product photo: iPhone case" -m pro -r 4K -a 4:5
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### CLI Options
|
|
60
|
+
|
|
61
|
+
| Option | Description | Default |
|
|
62
|
+
| -------------------- | ------------------------------- | ---------------- |
|
|
63
|
+
| `-p, --prompt` | Image description (required) | - |
|
|
64
|
+
| `-m, --model` | Model: `flash` or `pro` | `pro` |
|
|
65
|
+
| `-a, --aspect-ratio` | Ratio: 1:1, 16:9, 9:16, etc. | `1:1` |
|
|
66
|
+
| `-r, --resolution` | Resolution: 1K, 2K, 4K | Pro=4K, Flash=1K |
|
|
67
|
+
| `-o, --output` | Output directory | `./images` |
|
|
68
|
+
| `-n, --negative` | Negative prompt | - |
|
|
69
|
+
| `-i, --input` | Input image (edit mode) | - |
|
|
70
|
+
| `-c, --count` | Number of images (1-4) | `1` |
|
|
71
|
+
| `-g, --grounding` | Enable Google Search (Pro only) | `false` |
|
|
72
|
+
|
|
73
|
+
## Models
|
|
74
|
+
|
|
75
|
+
| Model | Speed | Max Resolution | Best For |
|
|
76
|
+
| --------- | ------ | -------------- | --------------------------------------- |
|
|
77
|
+
| **Flash** | 2-5s | 1024px | Drafts, iterations, prototypes |
|
|
78
|
+
| **Pro** | 10-40s | 4K | Final delivery, marketing, professional |
|
|
79
|
+
|
|
80
|
+
## Examples
|
|
81
|
+
|
|
82
|
+
### Image Generation
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
# 16:9 landscape poster
|
|
86
|
+
npx tsx banana_image_exec.ts -p "Sunset over mountains" -m pro -r 4K -a 16:9
|
|
87
|
+
|
|
88
|
+
# Portrait for social media
|
|
89
|
+
npx tsx banana_image_exec.ts -p "Product showcase" -m pro -a 9:16
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Image Editing
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
# Edit existing image
|
|
96
|
+
npx tsx banana_image_exec.ts -p "Change background to beach sunset" -i ./photo.png
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Batch Generation
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
# Generate 4 variants
|
|
103
|
+
npx tsx banana_image_exec.ts -p "Logo design concept" -m pro -c 4
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## Output
|
|
107
|
+
|
|
108
|
+
```json
|
|
109
|
+
{
|
|
110
|
+
"success": true,
|
|
111
|
+
"images": [
|
|
112
|
+
{
|
|
113
|
+
"path": "./images/banana_pro_2025-01-01T12-00-00_abc123.png",
|
|
114
|
+
"model": "gemini-3-pro-image-preview",
|
|
115
|
+
"prompt": "Your prompt"
|
|
116
|
+
}
|
|
117
|
+
],
|
|
118
|
+
"metadata": {
|
|
119
|
+
"model": "gemini-3-pro-image-preview",
|
|
120
|
+
"aspectRatio": "16:9",
|
|
121
|
+
"resolution": "4K",
|
|
122
|
+
"duration": 15234
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## Aspect Ratio Guide
|
|
128
|
+
|
|
129
|
+
| Use Case | Ratio | Keywords |
|
|
130
|
+
| ------------------- | ----- | -------------------------- |
|
|
131
|
+
| Social media square | 1:1 | Instagram, profile |
|
|
132
|
+
| Landscape banner | 16:9 | YouTube, desktop wallpaper |
|
|
133
|
+
| Portrait story | 9:16 | Stories, mobile wallpaper |
|
|
134
|
+
| Product photo | 4:5 | E-commerce, catalog |
|
|
135
|
+
| Movie poster | 2:3 | Poster, print |
|
|
136
|
+
| Ultra-wide | 21:9 | Banner, header |
|
|
137
|
+
|
|
138
|
+
## Requirements
|
|
139
|
+
|
|
140
|
+
- Node.js 18+
|
|
141
|
+
- Gemini API Key
|
|
142
|
+
- Network access (proxy supported)
|
|
143
|
+
|
|
144
|
+
## License
|
|
145
|
+
|
|
146
|
+
MIT
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: banana-image
|
|
3
|
+
description: |
|
|
4
|
+
【触发条件】当用户要求生成图片、创建海报、制作缩略图、编辑图片时使用。
|
|
5
|
+
关键词:生成图片、/image、产品图、海报、缩略图、4K、高清。
|
|
6
|
+
【核心产出】高质量 AI 生成图片(最高 4K 分辨率)。
|
|
7
|
+
【不触发】纯文本任务、代码生成、不涉及图片的设计讨论。
|
|
8
|
+
【先问什么】若缺少:图片描述、分辨率偏好、宽高比,先提问补齐。
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Banana Image - AI 图片生成
|
|
12
|
+
|
|
13
|
+
基于 Gemini API 的独立图片生成技能,支持 4K 输出、双模型选择、图片编辑。
|
|
14
|
+
|
|
15
|
+
## 环境要求
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
# 设置 API Key(必需)
|
|
19
|
+
export GEMINI_API_KEY="your-api-key"
|
|
20
|
+
|
|
21
|
+
# 安装依赖(首次使用)
|
|
22
|
+
cd .claude/skills/banana-image/scripts && npm install
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## 快速命令
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
# 快速生成(Flash 模型)
|
|
29
|
+
npx tsx .claude/skills/banana-image/scripts/banana_image_exec.ts \
|
|
30
|
+
-p "可爱的柴犬在公园玩耍" -m flash
|
|
31
|
+
|
|
32
|
+
# 4K 高质量生成(Pro 模型)
|
|
33
|
+
npx tsx .claude/skills/banana-image/scripts/banana_image_exec.ts \
|
|
34
|
+
-p "专业产品照片:iPhone 手机壳" -m pro -r 4K -a 4:5
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## 模型选择
|
|
38
|
+
|
|
39
|
+
| 模型 | 速度 | 分辨率 | 适用场景 |
|
|
40
|
+
| --------- | ---- | ------- | ---------------------------- |
|
|
41
|
+
| **Flash** | 2-3s | ≤1024px | 快速草图、迭代、原型 |
|
|
42
|
+
| **Pro** | 5-8s | ≤4K | 最终交付、营销素材、专业作品 |
|
|
43
|
+
|
|
44
|
+
**自动选择规则**:
|
|
45
|
+
|
|
46
|
+
- 包含 "快速"、"草图"、"draft" → Flash
|
|
47
|
+
- 包含 "4K"、"专业"、"高质量" → Pro(默认)
|
|
48
|
+
|
|
49
|
+
## 参数说明
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
npx tsx banana_image_exec.ts --help
|
|
53
|
+
|
|
54
|
+
Options:
|
|
55
|
+
--prompt, -p <text> 图片描述(必需)
|
|
56
|
+
--model, -m <type> 模型选择: flash | pro (默认: pro)
|
|
57
|
+
--aspect-ratio, -a <r> 宽高比: 1:1, 16:9, 9:16, 4:3, 3:2, 21:9 等
|
|
58
|
+
--resolution, -r <res> 分辨率: 1K, 2K, 4K (默认: Pro=4K, Flash=1K)
|
|
59
|
+
--negative, -n <text> 排除内容描述
|
|
60
|
+
--output, -o <dir> 输出目录 (默认: ./images)
|
|
61
|
+
--grounding, -g 启用 Google Search 锚定 (仅 Pro)
|
|
62
|
+
--input, -i <path> 输入图片路径(编辑模式)
|
|
63
|
+
--system, -s <text> 系统指令
|
|
64
|
+
--count, -c <num> 生成数量 (1-4)
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## 工作流
|
|
68
|
+
|
|
69
|
+
### 1. 简单生成
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
npx tsx .claude/skills/banana-image/scripts/banana_image_exec.ts \
|
|
73
|
+
-p "A cute shiba inu playing in the park" \
|
|
74
|
+
-m pro
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### 2. 带参数生成
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
# 16:9 横版海报,启用 Google 搜索锚定
|
|
81
|
+
npx tsx .claude/skills/banana-image/scripts/banana_image_exec.ts \
|
|
82
|
+
-p "2024年科技大会宣传海报" \
|
|
83
|
+
-m pro -r 4K -a 16:9 -g
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### 3. 图片编辑
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
# 修改现有图片
|
|
90
|
+
npx tsx .claude/skills/banana-image/scripts/banana_image_exec.ts \
|
|
91
|
+
-p "将背景改为黄昏海滩" \
|
|
92
|
+
-i /path/to/original.png
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### 4. 批量生成
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
# 生成多张变体
|
|
99
|
+
npx tsx .claude/skills/banana-image/scripts/banana_image_exec.ts \
|
|
100
|
+
-p "产品照片:无线耳机" \
|
|
101
|
+
-m pro -c 4
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## 输出格式
|
|
105
|
+
|
|
106
|
+
脚本输出 JSON 格式结果:
|
|
107
|
+
|
|
108
|
+
```json
|
|
109
|
+
{
|
|
110
|
+
"success": true,
|
|
111
|
+
"images": [
|
|
112
|
+
{
|
|
113
|
+
"path": "./images/banana_pro_2024-01-01T12-00-00_abc123.png",
|
|
114
|
+
"model": "gemini-3-pro-image-preview",
|
|
115
|
+
"prompt": "可爱的柴犬"
|
|
116
|
+
}
|
|
117
|
+
],
|
|
118
|
+
"metadata": {
|
|
119
|
+
"model": "gemini-3-pro-image-preview",
|
|
120
|
+
"aspectRatio": "1:1",
|
|
121
|
+
"resolution": "4K",
|
|
122
|
+
"duration": 5234
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## 宽高比映射
|
|
128
|
+
|
|
129
|
+
| 用途 | 宽高比 | 关键词 |
|
|
130
|
+
| ------------ | ------ | ----------------------------- |
|
|
131
|
+
| 社交媒体方图 | 1:1 | "方形"、"Instagram" |
|
|
132
|
+
| 横版海报 | 16:9 | "横版"、"YouTube"、"桌面壁纸" |
|
|
133
|
+
| 竖版海报 | 9:16 | "竖版"、"手机壁纸"、"Story" |
|
|
134
|
+
| 产品图 | 4:5 | "产品"、"电商" |
|
|
135
|
+
| 电影海报 | 2:3 | "海报"、"电影" |
|
|
136
|
+
| 超宽屏 | 21:9 | "超宽"、"Banner" |
|
|
137
|
+
|
|
138
|
+
## 模板系统
|
|
139
|
+
|
|
140
|
+
读取预定义模板生成图片:
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
# 列出可用模板
|
|
144
|
+
python .claude/skills/banana-image/scripts/apply_template.py list
|
|
145
|
+
|
|
146
|
+
# 应用产品图模板
|
|
147
|
+
python .claude/skills/banana-image/scripts/apply_template.py apply product \
|
|
148
|
+
-v '{"product": "wireless earbuds"}'
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
模板输出可直接传递给 `banana_image_exec.ts`。
|
|
152
|
+
|
|
153
|
+
## 错误处理
|
|
154
|
+
|
|
155
|
+
| 错误 | 原因 | 解决方案 |
|
|
156
|
+
| ----------------------- | -------------- | ----------------------------- |
|
|
157
|
+
| GEMINI_API_KEY not set | 未设置 API Key | `export GEMINI_API_KEY="..."` |
|
|
158
|
+
| Content filtered | 内容安全过滤 | 调整描述,避免敏感词 |
|
|
159
|
+
| Invalid aspect ratio | 不支持的宽高比 | 使用支持的宽高比 |
|
|
160
|
+
| Image generation failed | API 调用失败 | 检查网络和 API 配额 |
|
|
161
|
+
|
|
162
|
+
## 参考文档
|
|
163
|
+
|
|
164
|
+
- [高级用法](references/advanced-usage.md) - 批量生成、图片编辑、参数优化
|
|
Binary file
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
# 高级用法参考
|
|
2
|
+
|
|
3
|
+
## 批量生成工作流
|
|
4
|
+
|
|
5
|
+
### 1. 准备 prompt 列表
|
|
6
|
+
|
|
7
|
+
**纯文本格式** (`prompts.txt`):
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
可爱的柴犬在公园里玩耍
|
|
11
|
+
专业产品照片:iPhone 手机壳
|
|
12
|
+
科幻风格的城市夜景
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
**CSV 格式** (`prompts.csv`):
|
|
16
|
+
|
|
17
|
+
```csv
|
|
18
|
+
prompt,aspect_ratio,model
|
|
19
|
+
可爱的柴犬,1:1,flash
|
|
20
|
+
专业产品照片,4:5,pro
|
|
21
|
+
科幻城市,16:9,pro
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### 2. 转换为 JSON
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
python ~/.claude/skills/banana-image/scripts/batch_prep.py prompts.txt
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
输出:
|
|
31
|
+
|
|
32
|
+
```json
|
|
33
|
+
{
|
|
34
|
+
"source": "prompts.txt",
|
|
35
|
+
"count": 3,
|
|
36
|
+
"prompts": [
|
|
37
|
+
{ "id": 1, "prompt": "可爱的柴犬在公园里玩耍" },
|
|
38
|
+
{ "id": 2, "prompt": "专业产品照片:iPhone 手机壳" },
|
|
39
|
+
{ "id": 3, "prompt": "科幻风格的城市夜景" }
|
|
40
|
+
]
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### 3. Claude 批量生成
|
|
45
|
+
|
|
46
|
+
Claude 读取 JSON 后逐个调用 `banana_image_exec.ts`:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
# 对每个 prompt 执行
|
|
50
|
+
npx tsx ~/.claude/skills/banana-image/scripts/banana_image_exec.ts \
|
|
51
|
+
-p "可爱的柴犬在公园里玩耍" \
|
|
52
|
+
-m pro
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## 模板系统
|
|
56
|
+
|
|
57
|
+
### 列出可用模板
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
python ~/.claude/skills/banana-image/scripts/apply_template.py list
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### 应用模板
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
python ~/.claude/skills/banana-image/scripts/apply_template.py apply product \
|
|
67
|
+
-v '{"product": "sleek wireless earbuds"}'
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
输出:
|
|
71
|
+
|
|
72
|
+
```json
|
|
73
|
+
{
|
|
74
|
+
"prompt": "Create a professional, high-end product photography shot of sleek wireless earbuds...",
|
|
75
|
+
"model_tier": "pro",
|
|
76
|
+
"resolution": "4k",
|
|
77
|
+
"aspect_ratio": "4:5",
|
|
78
|
+
"enable_grounding": true
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
然后使用输出参数调用 `banana_image_exec.ts`:
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
npx tsx ~/.claude/skills/banana-image/scripts/banana_image_exec.ts \
|
|
86
|
+
-p "Create a professional, high-end product photography shot of sleek wireless earbuds..." \
|
|
87
|
+
-m pro -r 4K -a 4:5 -g
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## 图片编辑模式
|
|
91
|
+
|
|
92
|
+
### 编辑现有图片
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
npx tsx ~/.claude/skills/banana-image/scripts/banana_image_exec.ts \
|
|
96
|
+
-p "Make the background a sunset beach scene" \
|
|
97
|
+
-i /path/to/original.png
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### 风格迁移
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
npx tsx ~/.claude/skills/banana-image/scripts/banana_image_exec.ts \
|
|
104
|
+
-p "Transform this photo into a Studio Ghibli anime style" \
|
|
105
|
+
-i /path/to/photo.jpg \
|
|
106
|
+
-m pro
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## 参数优化技巧
|
|
110
|
+
|
|
111
|
+
### 提高质量
|
|
112
|
+
|
|
113
|
+
1. 使用 Pro 模型:`-m pro`
|
|
114
|
+
2. 使用 4K 分辨率:`-r 4K`
|
|
115
|
+
3. 启用 Google 搜索锚定:`-g`
|
|
116
|
+
4. 详细的提示词描述
|
|
117
|
+
|
|
118
|
+
### 加快速度
|
|
119
|
+
|
|
120
|
+
1. 使用 Flash 模型:`-m flash`
|
|
121
|
+
2. 降低分辨率:`-r 1K`
|
|
122
|
+
3. 简化提示词
|
|
123
|
+
|
|
124
|
+
### Negative Prompt 示例
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
npx tsx ~/.claude/skills/banana-image/scripts/banana_image_exec.ts \
|
|
128
|
+
-p "Professional portrait photo of a business person" \
|
|
129
|
+
-n "blurry, low quality, distorted, watermark, text, cartoon" \
|
|
130
|
+
-m pro
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## 输出目录管理
|
|
134
|
+
|
|
135
|
+
默认输出目录:`~/.claude/banana-image-output/`
|
|
136
|
+
|
|
137
|
+
自定义输出目录:
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
npx tsx ~/.claude/skills/banana-image/scripts/banana_image_exec.ts \
|
|
141
|
+
-p "产品图" \
|
|
142
|
+
-o /path/to/custom/output
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
## 常见问题
|
|
146
|
+
|
|
147
|
+
### Q: 生成失败,提示安全过滤?
|
|
148
|
+
|
|
149
|
+
尝试:
|
|
150
|
+
|
|
151
|
+
1. 使用更中性的描述
|
|
152
|
+
2. 避免敏感词汇
|
|
153
|
+
3. 使用 `--negative` 排除不当内容
|
|
154
|
+
|
|
155
|
+
### Q: 图片质量不够?
|
|
156
|
+
|
|
157
|
+
1. 使用 Pro 模型:`-m pro`
|
|
158
|
+
2. 提高分辨率:`-r 4K`
|
|
159
|
+
3. 优化提示词,添加更多细节描述
|
|
160
|
+
|
|
161
|
+
### Q: 如何生成多张变体?
|
|
162
|
+
|
|
163
|
+
```bash
|
|
164
|
+
npx tsx ~/.claude/skills/banana-image/scripts/banana_image_exec.ts \
|
|
165
|
+
-p "产品照片" \
|
|
166
|
+
-c 4
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
### Q: 如何查看已生成的图片?
|
|
170
|
+
|
|
171
|
+
```bash
|
|
172
|
+
ls -la ~/.claude/banana-image-output/
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
## 环境变量
|
|
176
|
+
|
|
177
|
+
| 变量 | 说明 | 必需 |
|
|
178
|
+
| ---------------- | --------------- | ---- |
|
|
179
|
+
| `GEMINI_API_KEY` | Gemini API 密钥 | 是 |
|
|
180
|
+
|
|
181
|
+
设置方式:
|
|
182
|
+
|
|
183
|
+
```bash
|
|
184
|
+
# 临时设置
|
|
185
|
+
export GEMINI_API_KEY="your-api-key"
|
|
186
|
+
|
|
187
|
+
# 永久设置(添加到 ~/.zshrc 或 ~/.bashrc)
|
|
188
|
+
echo 'export GEMINI_API_KEY="your-api-key"' >> ~/.zshrc
|
|
189
|
+
```
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
模板应用脚本
|
|
4
|
+
读取模板 JSON 并填充占位符,输出完整的生成参数
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import sys
|
|
8
|
+
import json
|
|
9
|
+
import argparse
|
|
10
|
+
import re
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
TEMPLATES_DIR = Path(__file__).parent.parent / "templates"
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def list_templates() -> list[dict]:
|
|
18
|
+
"""列出所有可用模板"""
|
|
19
|
+
templates = []
|
|
20
|
+
for f in TEMPLATES_DIR.glob("*.json"):
|
|
21
|
+
try:
|
|
22
|
+
with open(f, "r", encoding="utf-8") as file:
|
|
23
|
+
data = json.load(file)
|
|
24
|
+
templates.append(
|
|
25
|
+
{
|
|
26
|
+
"file": f.name,
|
|
27
|
+
"name": data.get("name", f.stem),
|
|
28
|
+
"description": data.get("description", ""),
|
|
29
|
+
}
|
|
30
|
+
)
|
|
31
|
+
except Exception:
|
|
32
|
+
continue
|
|
33
|
+
return templates
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def load_template(name: str) -> dict:
|
|
37
|
+
"""加载指定模板"""
|
|
38
|
+
# 尝试直接文件名
|
|
39
|
+
template_path = TEMPLATES_DIR / f"{name}.json"
|
|
40
|
+
if not template_path.exists():
|
|
41
|
+
# 尝试匹配名称
|
|
42
|
+
for f in TEMPLATES_DIR.glob("*.json"):
|
|
43
|
+
with open(f, "r", encoding="utf-8") as file:
|
|
44
|
+
data = json.load(file)
|
|
45
|
+
if data.get("name") == name:
|
|
46
|
+
return data
|
|
47
|
+
raise FileNotFoundError(f"模板不存在: {name}")
|
|
48
|
+
|
|
49
|
+
with open(template_path, "r", encoding="utf-8") as f:
|
|
50
|
+
return json.load(f)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def apply_template(template: dict, values: dict) -> dict:
|
|
54
|
+
"""应用模板,填充占位符"""
|
|
55
|
+
prompt = template["prompt_template"]
|
|
56
|
+
|
|
57
|
+
# 替换占位符
|
|
58
|
+
for key, value in values.items():
|
|
59
|
+
prompt = prompt.replace(f"{{{{{key}}}}}", value)
|
|
60
|
+
|
|
61
|
+
# 检查未填充的占位符
|
|
62
|
+
missing = re.findall(r"\{\{(\w+)\}\}", prompt)
|
|
63
|
+
if missing:
|
|
64
|
+
placeholders = template.get("placeholders", {})
|
|
65
|
+
required = [m for m in missing if not placeholders.get(m, {}).get("optional")]
|
|
66
|
+
if required:
|
|
67
|
+
raise ValueError(f"缺少必需的占位符: {', '.join(required)}")
|
|
68
|
+
# 移除可选占位符
|
|
69
|
+
for m in missing:
|
|
70
|
+
prompt = prompt.replace(f"{{{{{m}}}}}", "")
|
|
71
|
+
|
|
72
|
+
# 构建结果
|
|
73
|
+
result = {"prompt": prompt.strip(), **template.get("defaults", {})}
|
|
74
|
+
|
|
75
|
+
return result
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def main():
|
|
79
|
+
parser = argparse.ArgumentParser(description="应用模板生成图片参数")
|
|
80
|
+
subparsers = parser.add_subparsers(dest="command", help="子命令")
|
|
81
|
+
|
|
82
|
+
# list 子命令
|
|
83
|
+
subparsers.add_parser("list", help="列出所有模板")
|
|
84
|
+
|
|
85
|
+
# apply 子命令
|
|
86
|
+
apply_parser = subparsers.add_parser("apply", help="应用模板")
|
|
87
|
+
apply_parser.add_argument("template", help="模板名称")
|
|
88
|
+
apply_parser.add_argument(
|
|
89
|
+
"--values",
|
|
90
|
+
"-v",
|
|
91
|
+
type=str,
|
|
92
|
+
help='JSON 格式的占位符值,如: {"product": "coffee maker"}',
|
|
93
|
+
)
|
|
94
|
+
apply_parser.add_argument("--output", "-o", help="输出文件路径")
|
|
95
|
+
|
|
96
|
+
args = parser.parse_args()
|
|
97
|
+
|
|
98
|
+
if args.command == "list":
|
|
99
|
+
templates = list_templates()
|
|
100
|
+
print(json.dumps(templates, ensure_ascii=False, indent=2))
|
|
101
|
+
|
|
102
|
+
elif args.command == "apply":
|
|
103
|
+
try:
|
|
104
|
+
template = load_template(args.template)
|
|
105
|
+
values = json.loads(args.values) if args.values else {}
|
|
106
|
+
result = apply_template(template, values)
|
|
107
|
+
|
|
108
|
+
output = json.dumps(result, ensure_ascii=False, indent=2)
|
|
109
|
+
|
|
110
|
+
if args.output:
|
|
111
|
+
with open(args.output, "w", encoding="utf-8") as f:
|
|
112
|
+
f.write(output)
|
|
113
|
+
print(f"已保存到: {args.output}")
|
|
114
|
+
else:
|
|
115
|
+
print(output)
|
|
116
|
+
except Exception as e:
|
|
117
|
+
print(json.dumps({"error": str(e)}))
|
|
118
|
+
sys.exit(1)
|
|
119
|
+
|
|
120
|
+
else:
|
|
121
|
+
parser.print_help()
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
if __name__ == "__main__":
|
|
125
|
+
main()
|