opencode-skills-collection 3.1.0 → 3.1.1
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 +84 -1
- package/bundled-skills/android-ui-journey-testing/SKILL.md +191 -0
- package/bundled-skills/ask-matt/SKILL.md +92 -0
- package/bundled-skills/bugs-are-annoying/SKILL.md +137 -0
- package/bundled-skills/codebase-design/DEEPENING.md +37 -0
- package/bundled-skills/codebase-design/DESIGN-IT-TWICE.md +44 -0
- package/bundled-skills/codebase-design/SKILL.md +145 -0
- package/bundled-skills/competitor-analysis/LICENSE.txt +21 -0
- package/bundled-skills/competitor-analysis/SKILL.md +434 -0
- package/bundled-skills/competitor-analysis/references/battle-card-subagent.md +127 -0
- package/bundled-skills/competitor-analysis/references/battle-card.md +91 -0
- package/bundled-skills/competitor-analysis/references/example-research.md +130 -0
- package/bundled-skills/competitor-analysis/references/report-template.html +127 -0
- package/bundled-skills/competitor-analysis/references/research-patterns.md +217 -0
- package/bundled-skills/competitor-analysis/references/workflow.md +434 -0
- package/bundled-skills/competitor-analysis/scripts/capture_screenshots.mjs +142 -0
- package/bundled-skills/competitor-analysis/scripts/compile_report.mjs +929 -0
- package/bundled-skills/competitor-analysis/scripts/extract_vs_names.mjs +140 -0
- package/bundled-skills/competitor-analysis/scripts/gate_candidates.mjs +194 -0
- package/bundled-skills/competitor-analysis/scripts/list_urls.mjs +90 -0
- package/bundled-skills/competitor-analysis/scripts/md_utils.mjs +50 -0
- package/bundled-skills/competitor-analysis/scripts/merge_partials.mjs +291 -0
- package/bundled-skills/competitor-analysis/scripts/package.json +6 -0
- package/bundled-skills/design-it/3d-ui/SKILL.md +259 -0
- package/bundled-skills/design-it/SKILL.md +170 -0
- package/bundled-skills/design-it/ai-native-ui/SKILL.md +295 -0
- package/bundled-skills/design-it/aurora-ui/SKILL.md +307 -0
- package/bundled-skills/design-it/bento-ui/SKILL.md +314 -0
- package/bundled-skills/design-it/brutalism/SKILL.md +270 -0
- package/bundled-skills/design-it/brutalist-typography/SKILL.md +287 -0
- package/bundled-skills/design-it/card-based-design/SKILL.md +262 -0
- package/bundled-skills/design-it/claymorphism/SKILL.md +287 -0
- package/bundled-skills/design-it/color-blocking/SKILL.md +278 -0
- package/bundled-skills/design-it/command-center-ui/SKILL.md +345 -0
- package/bundled-skills/design-it/cyber-y2k/SKILL.md +312 -0
- package/bundled-skills/design-it/cyberpunk-ui/SKILL.md +262 -0
- package/bundled-skills/design-it/dark-mode/SKILL.md +289 -0
- package/bundled-skills/design-it/dashboard-design/SKILL.md +331 -0
- package/bundled-skills/design-it/data-dense-design/SKILL.md +322 -0
- package/bundled-skills/design-it/duotone-design/SKILL.md +248 -0
- package/bundled-skills/design-it/editorial-design/SKILL.md +328 -0
- package/bundled-skills/design-it/flat-design/SKILL.md +221 -0
- package/bundled-skills/design-it/flat-design-2/SKILL.md +240 -0
- package/bundled-skills/design-it/floating-ui/SKILL.md +299 -0
- package/bundled-skills/design-it/frutiger-aero/SKILL.md +274 -0
- package/bundled-skills/design-it/glassmorphism/SKILL.md +272 -0
- package/bundled-skills/design-it/gradient-design/SKILL.md +309 -0
- package/bundled-skills/design-it/high-contrast/SKILL.md +288 -0
- package/bundled-skills/design-it/holographic-ui/SKILL.md +310 -0
- package/bundled-skills/design-it/isometric-design/SKILL.md +228 -0
- package/bundled-skills/design-it/layered-design/SKILL.md +247 -0
- package/bundled-skills/design-it/material-design/SKILL.md +275 -0
- package/bundled-skills/design-it/maximalism/SKILL.md +297 -0
- package/bundled-skills/design-it/minimalism/SKILL.md +267 -0
- package/bundled-skills/design-it/monochromatic-ui/SKILL.md +296 -0
- package/bundled-skills/design-it/neo-brutalism/SKILL.md +270 -0
- package/bundled-skills/design-it/neumorphism/SKILL.md +248 -0
- package/bundled-skills/design-it/retro-design/SKILL.md +283 -0
- package/bundled-skills/design-it/retro-futurism/SKILL.md +259 -0
- package/bundled-skills/design-it/sci-fi-interface/SKILL.md +309 -0
- package/bundled-skills/design-it/skeuomorphism/SKILL.md +280 -0
- package/bundled-skills/design-it/soft-pastel/SKILL.md +307 -0
- package/bundled-skills/design-it/spatial-computing-ui/SKILL.md +300 -0
- package/bundled-skills/design-it/spatial-design/SKILL.md +268 -0
- package/bundled-skills/design-it/swiss-design/SKILL.md +293 -0
- package/bundled-skills/design-it/synthwave/SKILL.md +257 -0
- package/bundled-skills/design-it/tile-design/SKILL.md +297 -0
- package/bundled-skills/design-it/typography-first/SKILL.md +247 -0
- package/bundled-skills/design-it/vaporwave/SKILL.md +331 -0
- package/bundled-skills/design-it/vibrant-maximalism/SKILL.md +291 -0
- package/bundled-skills/design-it/widget-based-design/SKILL.md +274 -0
- package/bundled-skills/design-it/y2k-design/SKILL.md +268 -0
- package/bundled-skills/diagnosing-bugs/SKILL.md +165 -0
- package/bundled-skills/diagnosing-bugs/scripts/hitl-loop.template.sh +41 -0
- package/bundled-skills/docs/contributors/skill-scoring.md +235 -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/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 +4 -4
- package/bundled-skills/docs/users/visual-guide.md +4 -4
- package/bundled-skills/domain-modeling/ADR-FORMAT.md +47 -0
- package/bundled-skills/domain-modeling/CONTEXT-FORMAT.md +60 -0
- package/bundled-skills/domain-modeling/SKILL.md +105 -0
- package/bundled-skills/grill-me/SKILL.md +36 -0
- package/bundled-skills/grill-with-docs/SKILL.md +36 -0
- package/bundled-skills/grilling/SKILL.md +39 -0
- package/bundled-skills/handoff/SKILL.md +45 -0
- package/bundled-skills/image-generator/.env.example +7 -0
- package/bundled-skills/image-generator/SKILL.md +509 -0
- package/bundled-skills/improve-codebase-architecture/HTML-REPORT.md +123 -0
- package/bundled-skills/improve-codebase-architecture/SKILL.md +97 -0
- package/bundled-skills/learn/SKILL.md +156 -0
- package/bundled-skills/lesson-generator/SKILL.md +90 -0
- package/bundled-skills/llm-council/.env.example +7 -0
- package/bundled-skills/llm-council/SKILL.md +602 -0
- package/bundled-skills/loop-library/SKILL.md +205 -0
- package/bundled-skills/loop-library/agents/openai.yaml +4 -0
- package/bundled-skills/loop-library/references/catalog.md +270 -0
- package/bundled-skills/mailtrap-managing-contacts/SKILL.md +112 -0
- package/bundled-skills/mailtrap-sending-emails/SKILL.md +167 -0
- package/bundled-skills/mailtrap-setting-up-sending-domain/SKILL.md +77 -0
- package/bundled-skills/mailtrap-testing-with-sandbox/SKILL.md +110 -0
- package/bundled-skills/prototype/LOGIC.md +79 -0
- package/bundled-skills/prototype/SKILL.md +62 -0
- package/bundled-skills/prototype/UI.md +112 -0
- package/bundled-skills/setup-matt-pocock-skills/SKILL.md +158 -0
- package/bundled-skills/setup-matt-pocock-skills/domain.md +51 -0
- package/bundled-skills/setup-matt-pocock-skills/issue-tracker-github.md +34 -0
- package/bundled-skills/setup-matt-pocock-skills/issue-tracker-gitlab.md +35 -0
- package/bundled-skills/setup-matt-pocock-skills/issue-tracker-local.md +19 -0
- package/bundled-skills/setup-matt-pocock-skills/triage-labels.md +15 -0
- package/bundled-skills/survey-generator/LICENSE +21 -0
- package/bundled-skills/survey-generator/SKILL.md +143 -0
- package/bundled-skills/survey-generator/build_artifact.py +208 -0
- package/bundled-skills/survey-generator/examples/agentic-engineering/research_bundle.json +1196 -0
- package/bundled-skills/survey-generator/examples/agentic-engineering/survey.html +706 -0
- package/bundled-skills/survey-generator/style_spec.json +85 -0
- package/bundled-skills/survey-generator/templates/research_bundle_template.json +69 -0
- package/bundled-skills/tdd/SKILL.md +139 -0
- package/bundled-skills/tdd/mocking.md +59 -0
- package/bundled-skills/tdd/refactoring.md +10 -0
- package/bundled-skills/tdd/tests.md +61 -0
- package/bundled-skills/teach/GLOSSARY-FORMAT.md +35 -0
- package/bundled-skills/teach/LEARNING-RECORD-FORMAT.md +46 -0
- package/bundled-skills/teach/MISSION-FORMAT.md +31 -0
- package/bundled-skills/teach/RESOURCES-FORMAT.md +32 -0
- package/bundled-skills/teach/SKILL.md +169 -0
- package/bundled-skills/to-issues/SKILL.md +115 -0
- package/bundled-skills/to-prd/SKILL.md +104 -0
- package/bundled-skills/tools-page-seo-optimizer/SKILL.md +616 -0
- package/bundled-skills/triage/AGENT-BRIEF.md +207 -0
- package/bundled-skills/triage/OUT-OF-SCOPE.md +105 -0
- package/bundled-skills/triage/SKILL.md +143 -0
- package/bundled-skills/vibecode-production-qa-validator/SKILL.md +371 -141
- package/bundled-skills/wiki-builder/SKILL.md +157 -0
- package/bundled-skills/wiki-builder/agents/openai.yaml +5 -0
- package/bundled-skills/wiki-builder/references/wiki-flavors.md +98 -0
- package/bundled-skills/wiki-builder/scripts/init_wiki.sh +105 -0
- package/bundled-skills/wiki-builder/templates/index.md +20 -0
- package/bundled-skills/wiki-builder/templates/maintenance-log.md +7 -0
- package/bundled-skills/wiki-builder/templates/prompts/compile-concept-page.md +12 -0
- package/bundled-skills/wiki-builder/templates/prompts/compile-index.md +11 -0
- package/bundled-skills/wiki-builder/templates/prompts/compile-source-page.md +12 -0
- package/bundled-skills/wiki-builder/templates/prompts/lint-wiki.md +10 -0
- package/bundled-skills/wiki-builder/templates/prompts/query-and-file.md +11 -0
- package/bundled-skills/wiki-builder/templates/sources.md +9 -0
- package/bundled-skills/wiki-builder/templates/wiki.config.md +53 -0
- package/bundled-skills/writing-great-skills/GLOSSARY.md +181 -0
- package/bundled-skills/writing-great-skills/SKILL.md +111 -0
- package/bundled-skills/yao-meta-skill/SKILL.md +86 -0
- package/bundled-skills/yao-meta-skill/agents/interface.yaml +26 -0
- package/bundled-skills/yao-meta-skill/manifest.json +24 -0
- package/bundled-skills/yao-meta-skill/references/artifact-design-doctrine.md +49 -0
- package/bundled-skills/yao-meta-skill/references/authoring-discipline.md +78 -0
- package/bundled-skills/yao-meta-skill/references/autonomous-adaptation.md +65 -0
- package/bundled-skills/yao-meta-skill/references/distribution-registry-method.md +60 -0
- package/bundled-skills/yao-meta-skill/references/eval-playbook.md +69 -0
- package/bundled-skills/yao-meta-skill/references/gate-selection.md +68 -0
- package/bundled-skills/yao-meta-skill/references/governance.md +134 -0
- package/bundled-skills/yao-meta-skill/references/human-review-template.md +54 -0
- package/bundled-skills/yao-meta-skill/references/intent-dialogue.md +138 -0
- package/bundled-skills/yao-meta-skill/references/iteration-philosophy.md +30 -0
- package/bundled-skills/yao-meta-skill/references/non-skill-decision-tree.md +39 -0
- package/bundled-skills/yao-meta-skill/references/operating-modes.md +107 -0
- package/bundled-skills/yao-meta-skill/references/output-eval-method.md +113 -0
- package/bundled-skills/yao-meta-skill/references/output-quality-risk.md +41 -0
- package/bundled-skills/yao-meta-skill/references/output-visual-quality.md +53 -0
- package/bundled-skills/yao-meta-skill/references/packaging-contracts.md +70 -0
- package/bundled-skills/yao-meta-skill/references/pattern-extraction-doctrine.md +76 -0
- package/bundled-skills/yao-meta-skill/references/platform-capability-matrix.md +49 -0
- package/bundled-skills/yao-meta-skill/references/prompt-engineering-doctrine.md +76 -0
- package/bundled-skills/yao-meta-skill/references/qa-ladder.md +57 -0
- package/bundled-skills/yao-meta-skill/references/reference-scan.md +126 -0
- package/bundled-skills/yao-meta-skill/references/regression-cause-taxonomy.md +80 -0
- package/bundled-skills/yao-meta-skill/references/resource-boundaries.md +120 -0
- package/bundled-skills/yao-meta-skill/references/review-studio-method.md +87 -0
- package/bundled-skills/yao-meta-skill/references/review-waiver-method.md +76 -0
- package/bundled-skills/yao-meta-skill/references/runtime-conformance-method.md +21 -0
- package/bundled-skills/yao-meta-skill/references/skill-archetypes.md +86 -0
- package/bundled-skills/yao-meta-skill/references/skill-atlas-method.md +35 -0
- package/bundled-skills/yao-meta-skill/references/skill-engineering-method.md +210 -0
- package/bundled-skills/yao-meta-skill/references/skill-ir-method.md +41 -0
- package/bundled-skills/yao-meta-skill/references/skillops-decision-policy.md +53 -0
- package/bundled-skills/yao-meta-skill/references/systems-thinking-doctrine.md +75 -0
- package/bundled-skills/yao-meta-skill/references/telemetry-drift-method.md +182 -0
- package/bundled-skills/yao-meta-skill/references/trust-security-method.md +79 -0
- package/bundled-skills/yao-meta-skill/references/user-memory-policy.md +35 -0
- package/bundled-skills/youtube-notetaker/SKILL.md +209 -0
- package/bundled-skills/youtube-notetaker/reference/artifact.html +269 -0
- package/bundled-skills/youtube-notetaker/scripts/contact_sheet.py +53 -0
- package/bundled-skills/youtube-notetaker/scripts/detect_slides.sh +19 -0
- package/bundled-skills/youtube-notetaker/scripts/download.sh +24 -0
- package/bundled-skills/youtube-notetaker/scripts/extract_slides.py +43 -0
- package/bundled-skills/youtube-notetaker/scripts/serve.py +173 -0
- package/bundled-skills/youtube-notetaker/scripts/setup.sh +27 -0
- package/bundled-skills/youtube-notetaker/scripts/verify.sh +31 -0
- package/bundled-skills/youtube-notetaker/scripts/vtt_to_transcript.py +59 -0
- package/bundled-skills/youtube-notetaker/scripts/write_library_item.py +69 -0
- package/package.json +1 -1
- package/skills_index.json +1956 -286
- package/bundled-skills/ai-md/SKILL.md +0 -523
- package/bundled-skills/atlas-contract/SKILL.md +0 -650
- package/bundled-skills/busybox-on-windows/SKILL.md +0 -40
- package/bundled-skills/monte-carlo-prevent/SKILL.md +0 -257
- package/bundled-skills/monte-carlo-prevent/references/TROUBLESHOOTING.md +0 -23
- package/bundled-skills/monte-carlo-prevent/references/parameters.md +0 -32
- package/bundled-skills/monte-carlo-prevent/references/workflows.md +0 -478
- package/bundled-skills/monte-carlo-push-ingestion/SKILL.md +0 -372
- package/bundled-skills/monte-carlo-push-ingestion/references/anomaly-detection.md +0 -87
- package/bundled-skills/monte-carlo-push-ingestion/references/custom-lineage.md +0 -203
- package/bundled-skills/monte-carlo-push-ingestion/references/direct-http-api.md +0 -207
- package/bundled-skills/monte-carlo-push-ingestion/references/prerequisites.md +0 -150
- package/bundled-skills/monte-carlo-push-ingestion/references/push-lineage.md +0 -160
- package/bundled-skills/monte-carlo-push-ingestion/references/push-metadata.md +0 -158
- package/bundled-skills/monte-carlo-push-ingestion/references/push-query-logs.md +0 -219
- package/bundled-skills/monte-carlo-push-ingestion/references/validation.md +0 -257
- package/bundled-skills/monte-carlo-push-ingestion/scripts/sample_verify.py +0 -357
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery/collect_and_push_lineage.py +0 -70
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery/collect_and_push_metadata.py +0 -65
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery/collect_and_push_query_logs.py +0 -70
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery/collect_lineage.py +0 -214
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery/collect_metadata.py +0 -160
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery/collect_query_logs.py +0 -164
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery/push_lineage.py +0 -198
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery/push_metadata.py +0 -193
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery/push_query_logs.py +0 -207
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery-iceberg/collect_and_push_metadata.py +0 -71
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery-iceberg/collect_and_push_query_logs.py +0 -64
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery-iceberg/collect_metadata.py +0 -253
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery-iceberg/collect_query_logs.py +0 -149
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery-iceberg/push_metadata.py +0 -190
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/bigquery-iceberg/push_query_logs.py +0 -208
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/databricks/collect_and_push_lineage.py +0 -83
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/databricks/collect_and_push_metadata.py +0 -77
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/databricks/collect_and_push_query_logs.py +0 -83
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/databricks/collect_lineage.py +0 -240
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/databricks/collect_metadata.py +0 -212
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/databricks/collect_query_logs.py +0 -204
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/databricks/push_lineage.py +0 -192
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/databricks/push_metadata.py +0 -178
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/databricks/push_query_logs.py +0 -200
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/hive/collect_and_push_lineage.py +0 -119
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/hive/collect_and_push_metadata.py +0 -119
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/hive/collect_and_push_query_logs.py +0 -117
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/hive/collect_lineage.py +0 -265
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/hive/collect_metadata.py +0 -313
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/hive/collect_query_logs.py +0 -284
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/hive/push_lineage.py +0 -309
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/hive/push_metadata.py +0 -245
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/hive/push_query_logs.py +0 -255
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/redshift/collect_and_push_lineage.py +0 -78
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/redshift/collect_and_push_metadata.py +0 -80
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/redshift/collect_and_push_query_logs.py +0 -88
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/redshift/collect_lineage.py +0 -235
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/redshift/collect_metadata.py +0 -219
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/redshift/collect_query_logs.py +0 -239
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/redshift/push_lineage.py +0 -178
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/redshift/push_metadata.py +0 -178
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/redshift/push_query_logs.py +0 -196
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/snowflake/collect_and_push_lineage.py +0 -154
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/snowflake/collect_and_push_metadata.py +0 -137
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/snowflake/collect_and_push_query_logs.py +0 -137
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/snowflake/collect_lineage.py +0 -349
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/snowflake/collect_metadata.py +0 -329
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/snowflake/collect_query_logs.py +0 -254
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/snowflake/push_lineage.py +0 -307
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/snowflake/push_metadata.py +0 -228
- package/bundled-skills/monte-carlo-push-ingestion/scripts/templates/snowflake/push_query_logs.py +0 -248
- package/bundled-skills/monte-carlo-push-ingestion/scripts/test_template_sdk_usage.py +0 -340
- package/bundled-skills/skill-optimizer/SKILL.md +0 -271
- package/bundled-skills/using-superpowers/SKILL.md +0 -98
|
@@ -0,0 +1,509 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: image-generator
|
|
3
|
+
description: Generate and edit images using Gemini's Nano Banana Pro model (gemini-3-pro-image-preview). Use this skill when the user asks you to generate images, create visuals, edit photos, create logos, generate product mockups, or perform any image generation/editing task.
|
|
4
|
+
allowed-tools: Read, Write, Bash, WebFetch
|
|
5
|
+
category: "media"
|
|
6
|
+
risk: "safe"
|
|
7
|
+
source: "official"
|
|
8
|
+
source_repo: "dair-ai/dair-academy-plugins"
|
|
9
|
+
source_type: "official"
|
|
10
|
+
date_added: "2026-06-19"
|
|
11
|
+
author: "DAIR.AI"
|
|
12
|
+
license: "MIT"
|
|
13
|
+
license_source: "https://github.com/dair-ai/dair-academy-plugins/blob/main/README.md#license"
|
|
14
|
+
tags:
|
|
15
|
+
- dair-academy
|
|
16
|
+
- ai
|
|
17
|
+
- workflow
|
|
18
|
+
tools:
|
|
19
|
+
- claude-code
|
|
20
|
+
- codex-cli
|
|
21
|
+
- cursor
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
# Image Generator
|
|
25
|
+
|
|
26
|
+
## When to Use
|
|
27
|
+
|
|
28
|
+
Use when this workflow matches the user request: Generate and edit images using Gemini's Nano Banana Pro model (gemini-3-pro-image-preview). Use this skill when the user asks you to generate images, create visuals, edit photos, create logos, generate product mockups, or perform any image generation/editing task.
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
_Source: [dair-ai/dair-academy-plugins](https://github.com/dair-ai/dair-academy-plugins) (MIT)._
|
|
32
|
+
|
|
33
|
+
This skill generates and edits images using Google's Gemini Nano Banana Pro model (`gemini-3-pro-image-preview`).
|
|
34
|
+
|
|
35
|
+
## IMPORTANT: Setup Required
|
|
36
|
+
|
|
37
|
+
Before using this skill, the user must set the `GEMINI_API_KEY` environment variable:
|
|
38
|
+
|
|
39
|
+
1. Get a free API key from [Google AI Studio](https://aistudio.google.com/)
|
|
40
|
+
2. Export the key in your shell profile (`~/.zshrc`, `~/.bashrc`, etc.):
|
|
41
|
+
```bash
|
|
42
|
+
export GEMINI_API_KEY="your_api_key_here"
|
|
43
|
+
```
|
|
44
|
+
3. Restart your terminal or run `source ~/.zshrc` (or `~/.bashrc`)
|
|
45
|
+
|
|
46
|
+
**The skill will not work without this configuration.**
|
|
47
|
+
|
|
48
|
+
## Pre-flight Check
|
|
49
|
+
|
|
50
|
+
Before making any API call, verify the key is set:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
if [ -z "$GEMINI_API_KEY" ]; then
|
|
54
|
+
echo "ERROR: GEMINI_API_KEY is not set. Please export it in your shell profile."
|
|
55
|
+
exit 1
|
|
56
|
+
fi
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
If the key is missing, stop and tell the user to set it using the instructions above.
|
|
60
|
+
|
|
61
|
+
## Configuration
|
|
62
|
+
|
|
63
|
+
**Model**: `gemini-3-pro-image-preview`
|
|
64
|
+
|
|
65
|
+
**API Key**: Read from the `GEMINI_API_KEY` environment variable
|
|
66
|
+
|
|
67
|
+
## Iterating on User-Provided Images
|
|
68
|
+
|
|
69
|
+
When the user provides a path to an image they want to edit or iterate on, use this workflow:
|
|
70
|
+
|
|
71
|
+
### Step 1: Read and encode the image to base64
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
# Get the image path from user
|
|
75
|
+
IMG_PATH="/path/to/user/image.png"
|
|
76
|
+
|
|
77
|
+
# Detect mime type
|
|
78
|
+
if [[ "$IMG_PATH" == *.png ]]; then
|
|
79
|
+
MIME_TYPE="image/png"
|
|
80
|
+
elif [[ "$IMG_PATH" == *.jpg ]] || [[ "$IMG_PATH" == *.jpeg ]]; then
|
|
81
|
+
MIME_TYPE="image/jpeg"
|
|
82
|
+
elif [[ "$IMG_PATH" == *.webp ]]; then
|
|
83
|
+
MIME_TYPE="image/webp"
|
|
84
|
+
else
|
|
85
|
+
MIME_TYPE="image/png"
|
|
86
|
+
fi
|
|
87
|
+
|
|
88
|
+
# Encode to base64 (works on both macOS and Linux)
|
|
89
|
+
if [[ "$(uname)" == "Darwin" ]]; then
|
|
90
|
+
IMG_BASE64=$(base64 -i "$IMG_PATH")
|
|
91
|
+
else
|
|
92
|
+
IMG_BASE64=$(base64 -w0 "$IMG_PATH")
|
|
93
|
+
fi
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### Step 2: Send image with edit prompt (File-Based Approach)
|
|
97
|
+
|
|
98
|
+
**IMPORTANT:** Always use a file-based approach for the request body. Base64-encoded images are too large for command-line arguments and will cause "argument list too long" errors.
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
# User's edit request
|
|
102
|
+
EDIT_PROMPT="Add a santa hat to the person in this image"
|
|
103
|
+
|
|
104
|
+
# Write request to a JSON file (avoids command line length limits)
|
|
105
|
+
cat > /tmp/gemini_request.json << JSONEOF
|
|
106
|
+
{
|
|
107
|
+
"contents": [{
|
|
108
|
+
"parts": [
|
|
109
|
+
{"text": "$EDIT_PROMPT"},
|
|
110
|
+
{
|
|
111
|
+
"inline_data": {
|
|
112
|
+
"mime_type": "$MIME_TYPE",
|
|
113
|
+
"data": "$IMG_BASE64"
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
]
|
|
117
|
+
}],
|
|
118
|
+
"generationConfig": {
|
|
119
|
+
"responseModalities": ["TEXT", "IMAGE"]
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
JSONEOF
|
|
123
|
+
|
|
124
|
+
# Call the API using the file
|
|
125
|
+
curl -s -X POST \
|
|
126
|
+
"https://generativelanguage.googleapis.com/v1beta/models/gemini-3-pro-image-preview:generateContent" \
|
|
127
|
+
-H "x-goog-api-key: $GEMINI_API_KEY" \
|
|
128
|
+
-H "Content-Type: application/json" \
|
|
129
|
+
-d @/tmp/gemini_request.json > /tmp/gemini_response.json
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### Step 3: Extract and save the edited image
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
# Extract image from response and save
|
|
136
|
+
python3 -c "
|
|
137
|
+
import json
|
|
138
|
+
import base64
|
|
139
|
+
|
|
140
|
+
with open('/tmp/gemini_response.json') as f:
|
|
141
|
+
data = json.load(f)
|
|
142
|
+
|
|
143
|
+
for part in data['candidates'][0]['content']['parts']:
|
|
144
|
+
if 'inlineData' in part:
|
|
145
|
+
img_data = part['inlineData']['data']
|
|
146
|
+
mime = part['inlineData']['mimeType']
|
|
147
|
+
ext = 'png' if 'png' in mime else 'jpg'
|
|
148
|
+
with open('edited_image.' + ext, 'wb') as out:
|
|
149
|
+
out.write(base64.b64decode(img_data))
|
|
150
|
+
print(f'Saved: edited_image.{ext}')
|
|
151
|
+
elif 'text' in part:
|
|
152
|
+
print(part['text'])
|
|
153
|
+
"
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### Complete Example (File-Based)
|
|
157
|
+
|
|
158
|
+
For iterating on images, always use file-based requests:
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
# Variables
|
|
162
|
+
IMG_PATH="/path/to/image.png"
|
|
163
|
+
EDIT_PROMPT="Make the background a sunset beach"
|
|
164
|
+
OUTPUT_PATH="edited_output.png"
|
|
165
|
+
# Detect mime type and encode
|
|
166
|
+
MIME_TYPE=$([[ "$IMG_PATH" == *.png ]] && echo "image/png" || echo "image/jpeg")
|
|
167
|
+
IMG_BASE64=$(base64 -i "$IMG_PATH" 2>/dev/null || base64 -w0 "$IMG_PATH")
|
|
168
|
+
|
|
169
|
+
# Write request to file (required - base64 images are too large for command line)
|
|
170
|
+
cat > /tmp/gemini_request.json << JSONEOF
|
|
171
|
+
{
|
|
172
|
+
"contents": [{
|
|
173
|
+
"parts": [
|
|
174
|
+
{"text": "$EDIT_PROMPT"},
|
|
175
|
+
{"inline_data": {"mime_type": "$MIME_TYPE", "data": "$IMG_BASE64"}}
|
|
176
|
+
]
|
|
177
|
+
}],
|
|
178
|
+
"generationConfig": {
|
|
179
|
+
"responseModalities": ["TEXT", "IMAGE"]
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
JSONEOF
|
|
183
|
+
|
|
184
|
+
# Call API and extract image
|
|
185
|
+
curl -s -X POST \
|
|
186
|
+
"https://generativelanguage.googleapis.com/v1beta/models/gemini-3-pro-image-preview:generateContent" \
|
|
187
|
+
-H "x-goog-api-key: $GEMINI_API_KEY" \
|
|
188
|
+
-H "Content-Type: application/json" \
|
|
189
|
+
-d @/tmp/gemini_request.json > /tmp/gemini_response.json
|
|
190
|
+
|
|
191
|
+
# Save the output image
|
|
192
|
+
python3 -c "
|
|
193
|
+
import json, base64
|
|
194
|
+
with open('/tmp/gemini_response.json') as f:
|
|
195
|
+
data = json.load(f)
|
|
196
|
+
for part in data.get('candidates', [{}])[0].get('content', {}).get('parts', []):
|
|
197
|
+
if 'inlineData' in part:
|
|
198
|
+
with open('$OUTPUT_PATH', 'wb') as f:
|
|
199
|
+
f.write(base64.b64decode(part['inlineData']['data']))
|
|
200
|
+
print('Saved: $OUTPUT_PATH')
|
|
201
|
+
"
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
### Multi-Image Input (Combine/Compose)
|
|
205
|
+
|
|
206
|
+
To combine elements from multiple images (also uses file-based approach):
|
|
207
|
+
|
|
208
|
+
```bash
|
|
209
|
+
IMG1_PATH="/path/to/image1.png"
|
|
210
|
+
IMG2_PATH="/path/to/image2.png"
|
|
211
|
+
PROMPT="Put the dress from the first image on the person in the second image"
|
|
212
|
+
IMG1_BASE64=$(base64 -i "$IMG1_PATH" 2>/dev/null || base64 -w0 "$IMG1_PATH")
|
|
213
|
+
IMG2_BASE64=$(base64 -i "$IMG2_PATH" 2>/dev/null || base64 -w0 "$IMG2_PATH")
|
|
214
|
+
|
|
215
|
+
# Write request to file
|
|
216
|
+
cat > /tmp/gemini_request.json << JSONEOF
|
|
217
|
+
{
|
|
218
|
+
"contents": [{
|
|
219
|
+
"parts": [
|
|
220
|
+
{"text": "$PROMPT"},
|
|
221
|
+
{"inline_data": {"mime_type": "image/png", "data": "$IMG1_BASE64"}},
|
|
222
|
+
{"inline_data": {"mime_type": "image/png", "data": "$IMG2_BASE64"}}
|
|
223
|
+
]
|
|
224
|
+
}],
|
|
225
|
+
"generationConfig": {"responseModalities": ["TEXT", "IMAGE"]}
|
|
226
|
+
}
|
|
227
|
+
JSONEOF
|
|
228
|
+
|
|
229
|
+
curl -s -X POST \
|
|
230
|
+
"https://generativelanguage.googleapis.com/v1beta/models/gemini-3-pro-image-preview:generateContent" \
|
|
231
|
+
-H "x-goog-api-key: $GEMINI_API_KEY" \
|
|
232
|
+
-H "Content-Type: application/json" \
|
|
233
|
+
-d @/tmp/gemini_request.json > /tmp/gemini_response.json
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
## Capabilities
|
|
237
|
+
|
|
238
|
+
### Text-to-Image Generation
|
|
239
|
+
- Generate high-quality images from text descriptions
|
|
240
|
+
- Support for photorealistic, stylized, and artistic outputs
|
|
241
|
+
- Accurate text rendering in images (logos, infographics, diagrams)
|
|
242
|
+
|
|
243
|
+
### Image Editing
|
|
244
|
+
- Add or remove elements from images
|
|
245
|
+
- Inpainting with semantic masking (edit specific parts)
|
|
246
|
+
- Style transfer (apply artistic styles to photos)
|
|
247
|
+
- Multi-image composition (combine elements from multiple images)
|
|
248
|
+
|
|
249
|
+
### Advanced Features
|
|
250
|
+
- **High Resolution**: 1K, 2K, or 4K output
|
|
251
|
+
- **Aspect Ratios**: 1:1, 2:3, 3:2, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9, 21:9
|
|
252
|
+
- **Google Search Grounding**: Generate images based on real-time data
|
|
253
|
+
- **Multi-turn Editing**: Iteratively refine images through conversation
|
|
254
|
+
- **Up to 14 Reference Images**: Combine multiple inputs for complex compositions
|
|
255
|
+
|
|
256
|
+
## API Usage
|
|
257
|
+
|
|
258
|
+
### Basic Text-to-Image (Python)
|
|
259
|
+
|
|
260
|
+
```python
|
|
261
|
+
from google import genai
|
|
262
|
+
from google.genai import types
|
|
263
|
+
|
|
264
|
+
client = genai.Client()
|
|
265
|
+
|
|
266
|
+
response = client.models.generate_content(
|
|
267
|
+
model="gemini-3-pro-image-preview",
|
|
268
|
+
contents=["Your prompt here"],
|
|
269
|
+
config=types.GenerateContentConfig(
|
|
270
|
+
response_modalities=['TEXT', 'IMAGE'],
|
|
271
|
+
image_config=types.ImageConfig(
|
|
272
|
+
aspect_ratio="16:9", # Optional
|
|
273
|
+
image_size="2K" # Optional: "1K", "2K", "4K"
|
|
274
|
+
)
|
|
275
|
+
)
|
|
276
|
+
)
|
|
277
|
+
|
|
278
|
+
for part in response.parts:
|
|
279
|
+
if part.text is not None:
|
|
280
|
+
print(part.text)
|
|
281
|
+
elif part.inline_data is not None:
|
|
282
|
+
image = part.as_image()
|
|
283
|
+
image.save("generated_image.png")
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
### Basic Text-to-Image (JavaScript)
|
|
287
|
+
|
|
288
|
+
```javascript
|
|
289
|
+
import { GoogleGenAI } from "@google/genai";
|
|
290
|
+
import * as fs from "node:fs";
|
|
291
|
+
|
|
292
|
+
const ai = new GoogleGenAI({});
|
|
293
|
+
|
|
294
|
+
const response = await ai.models.generateContent({
|
|
295
|
+
model: "gemini-3-pro-image-preview",
|
|
296
|
+
contents: "Your prompt here",
|
|
297
|
+
config: {
|
|
298
|
+
responseModalities: ['TEXT', 'IMAGE'],
|
|
299
|
+
imageConfig: {
|
|
300
|
+
aspectRatio: "16:9",
|
|
301
|
+
imageSize: "2K"
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
});
|
|
305
|
+
|
|
306
|
+
for (const part of response.candidates[0].content.parts) {
|
|
307
|
+
if (part.text) {
|
|
308
|
+
console.log(part.text);
|
|
309
|
+
} else if (part.inlineData) {
|
|
310
|
+
const buffer = Buffer.from(part.inlineData.data, "base64");
|
|
311
|
+
fs.writeFileSync("generated_image.png", buffer);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
### REST API (curl)
|
|
317
|
+
|
|
318
|
+
```bash
|
|
319
|
+
curl -s -X POST \
|
|
320
|
+
"https://generativelanguage.googleapis.com/v1beta/models/gemini-3-pro-image-preview:generateContent" \
|
|
321
|
+
-H "x-goog-api-key: $GEMINI_API_KEY" \
|
|
322
|
+
-H "Content-Type: application/json" \
|
|
323
|
+
-d '{
|
|
324
|
+
"contents": [{
|
|
325
|
+
"parts": [{"text": "Your prompt here"}]
|
|
326
|
+
}],
|
|
327
|
+
"generationConfig": {
|
|
328
|
+
"responseModalities": ["TEXT", "IMAGE"],
|
|
329
|
+
"imageConfig": {
|
|
330
|
+
"aspectRatio": "16:9",
|
|
331
|
+
"imageSize": "2K"
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
}' | jq -r '.candidates[0].content.parts[] | select(.inlineData) | .inlineData.data' | base64 --decode > output.png
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
### Image Editing (with input image)
|
|
338
|
+
|
|
339
|
+
```python
|
|
340
|
+
from google import genai
|
|
341
|
+
from google.genai import types
|
|
342
|
+
from PIL import Image
|
|
343
|
+
|
|
344
|
+
client = genai.Client()
|
|
345
|
+
|
|
346
|
+
input_image = Image.open('input.png')
|
|
347
|
+
prompt = "Add a wizard hat to the cat in this image"
|
|
348
|
+
|
|
349
|
+
response = client.models.generate_content(
|
|
350
|
+
model="gemini-3-pro-image-preview",
|
|
351
|
+
contents=[prompt, input_image],
|
|
352
|
+
config=types.GenerateContentConfig(
|
|
353
|
+
response_modalities=['TEXT', 'IMAGE']
|
|
354
|
+
)
|
|
355
|
+
)
|
|
356
|
+
|
|
357
|
+
for part in response.parts:
|
|
358
|
+
if part.inline_data is not None:
|
|
359
|
+
image = part.as_image()
|
|
360
|
+
image.save("edited_image.png")
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
### Multi-Image Composition
|
|
364
|
+
|
|
365
|
+
```python
|
|
366
|
+
from google import genai
|
|
367
|
+
from google.genai import types
|
|
368
|
+
from PIL import Image
|
|
369
|
+
|
|
370
|
+
client = genai.Client()
|
|
371
|
+
|
|
372
|
+
image1 = Image.open('dress.png')
|
|
373
|
+
image2 = Image.open('model.png')
|
|
374
|
+
prompt = "Put the dress from the first image on the model from the second image"
|
|
375
|
+
|
|
376
|
+
response = client.models.generate_content(
|
|
377
|
+
model="gemini-3-pro-image-preview",
|
|
378
|
+
contents=[image1, image2, prompt],
|
|
379
|
+
config=types.GenerateContentConfig(
|
|
380
|
+
response_modalities=['TEXT', 'IMAGE'],
|
|
381
|
+
image_config=types.ImageConfig(
|
|
382
|
+
aspect_ratio="3:4",
|
|
383
|
+
image_size="2K"
|
|
384
|
+
)
|
|
385
|
+
)
|
|
386
|
+
)
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
### With Google Search Grounding
|
|
390
|
+
|
|
391
|
+
```python
|
|
392
|
+
from google import genai
|
|
393
|
+
from google.genai import types
|
|
394
|
+
|
|
395
|
+
client = genai.Client()
|
|
396
|
+
|
|
397
|
+
response = client.models.generate_content(
|
|
398
|
+
model="gemini-3-pro-image-preview",
|
|
399
|
+
contents="Visualize the current weather forecast for San Francisco",
|
|
400
|
+
config=types.GenerateContentConfig(
|
|
401
|
+
response_modalities=['TEXT', 'IMAGE'],
|
|
402
|
+
image_config=types.ImageConfig(aspect_ratio="16:9"),
|
|
403
|
+
tools=[{"google_search": {}}]
|
|
404
|
+
)
|
|
405
|
+
)
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
## Prompting Best Practices
|
|
409
|
+
|
|
410
|
+
### 1. Be Descriptive, Not Keyword-Based
|
|
411
|
+
Instead of: `cat, wizard hat, cute`
|
|
412
|
+
Write: `A fluffy orange cat wearing a small knitted wizard hat, sitting on a wooden floor with soft natural lighting from a window`
|
|
413
|
+
|
|
414
|
+
### 2. Specify Style and Mood
|
|
415
|
+
- Photography terms: "shot with 85mm lens", "soft bokeh background", "golden hour lighting"
|
|
416
|
+
- Artistic styles: "in the style of Van Gogh", "minimalist illustration", "photorealistic"
|
|
417
|
+
- Mood: "warm and cozy atmosphere", "dramatic noir lighting"
|
|
418
|
+
|
|
419
|
+
### 3. For Text in Images
|
|
420
|
+
Be explicit about:
|
|
421
|
+
- The exact text to render
|
|
422
|
+
- Font style (descriptively): "clean, bold, sans-serif font"
|
|
423
|
+
- Placement and size
|
|
424
|
+
|
|
425
|
+
### 4. For Editing
|
|
426
|
+
- Describe what to change and what to preserve
|
|
427
|
+
- Use "keep everything else unchanged"
|
|
428
|
+
- Reference specific elements clearly
|
|
429
|
+
|
|
430
|
+
### 5. For Product/Commercial Images
|
|
431
|
+
Mention:
|
|
432
|
+
- Lighting setup: "three-point softbox lighting"
|
|
433
|
+
- Background: "clean white studio background"
|
|
434
|
+
- Camera angle: "slightly elevated 45-degree shot"
|
|
435
|
+
|
|
436
|
+
## Resolution and Aspect Ratio Reference
|
|
437
|
+
|
|
438
|
+
| Aspect Ratio | 1K Resolution | 2K Resolution | 4K Resolution |
|
|
439
|
+
|--------------|---------------|---------------|---------------|
|
|
440
|
+
| 1:1 | 1024x1024 | 2048x2048 | 4096x4096 |
|
|
441
|
+
| 16:9 | 1376x768 | 2752x1536 | 5504x3072 |
|
|
442
|
+
| 9:16 | 768x1376 | 1536x2752 | 3072x5504 |
|
|
443
|
+
| 3:2 | 1264x848 | 2528x1696 | 5056x3392 |
|
|
444
|
+
| 2:3 | 848x1264 | 1696x2528 | 3392x5056 |
|
|
445
|
+
|
|
446
|
+
## Common Use Cases
|
|
447
|
+
|
|
448
|
+
### Logo Creation
|
|
449
|
+
```
|
|
450
|
+
Create a modern, minimalist logo for a coffee shop called 'The Daily Grind'.
|
|
451
|
+
The text should be in a clean, bold, sans-serif font.
|
|
452
|
+
Black and white color scheme. Put the logo in a circle.
|
|
453
|
+
```
|
|
454
|
+
|
|
455
|
+
### Product Photography
|
|
456
|
+
```
|
|
457
|
+
A high-resolution, studio-lit product photograph of a minimalist ceramic
|
|
458
|
+
coffee mug in matte black on a polished concrete surface. Three-point
|
|
459
|
+
softbox lighting with soft, diffused highlights. Slightly elevated
|
|
460
|
+
45-degree camera angle. Sharp focus on steam rising from the coffee.
|
|
461
|
+
```
|
|
462
|
+
|
|
463
|
+
### Style Transfer
|
|
464
|
+
```
|
|
465
|
+
Transform this photograph of a city street at night into Vincent van Gogh's
|
|
466
|
+
'Starry Night' style. Preserve the composition but render with swirling,
|
|
467
|
+
impasto brushstrokes and deep blues with bright yellows.
|
|
468
|
+
```
|
|
469
|
+
|
|
470
|
+
### Infographic
|
|
471
|
+
```
|
|
472
|
+
Create a vibrant infographic explaining photosynthesis as a recipe.
|
|
473
|
+
Show "ingredients" (sunlight, water, CO2) and "finished dish" (sugar/energy).
|
|
474
|
+
Style like a colorful kids' cookbook, suitable for 4th graders.
|
|
475
|
+
```
|
|
476
|
+
|
|
477
|
+
## Error Handling
|
|
478
|
+
|
|
479
|
+
Common issues:
|
|
480
|
+
- **No image returned**: Check that `response_modalities` includes `'IMAGE'`
|
|
481
|
+
- **Safety filters**: Some prompts may be blocked; try rephrasing
|
|
482
|
+
- **Rate limits**: Implement exponential backoff for retries
|
|
483
|
+
- **Large images**: For 4K, ensure sufficient timeout settings
|
|
484
|
+
|
|
485
|
+
## Dependencies
|
|
486
|
+
|
|
487
|
+
To use the Python SDK:
|
|
488
|
+
```bash
|
|
489
|
+
pip install google-genai pillow
|
|
490
|
+
```
|
|
491
|
+
|
|
492
|
+
For JavaScript:
|
|
493
|
+
```bash
|
|
494
|
+
npm install @google/genai
|
|
495
|
+
```
|
|
496
|
+
|
|
497
|
+
## Important Notes
|
|
498
|
+
|
|
499
|
+
- All generated images include a SynthID watermark
|
|
500
|
+
- The model uses a "thinking" process for complex prompts
|
|
501
|
+
- For best text rendering, generate text first, then request image with that text
|
|
502
|
+
- Images are not stored by the API - save outputs locally
|
|
503
|
+
|
|
504
|
+
|
|
505
|
+
## Limitations
|
|
506
|
+
|
|
507
|
+
- Requires the upstream tool, account, API key, or local setup when the workflow names one.
|
|
508
|
+
- Does not authorize destructive, production, paid, or external-message actions without explicit user approval.
|
|
509
|
+
- Validate generated artifacts or recommendations against the user's real sources before treating them as final.
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# HTML Report Format
|
|
2
|
+
|
|
3
|
+
The architectural review is rendered as a single self-contained HTML file in the OS temp directory. Tailwind and Mermaid both come from CDNs. Mermaid handles graph-shaped diagrams reliably; hand-built divs and inline SVG handle the more editorial visuals (mass diagrams, cross-sections). Mix the two — don't lean on Mermaid for everything, it'll start to look generic.
|
|
4
|
+
|
|
5
|
+
## Scaffold
|
|
6
|
+
|
|
7
|
+
```html
|
|
8
|
+
<!doctype html>
|
|
9
|
+
<html lang="en">
|
|
10
|
+
<head>
|
|
11
|
+
<meta charset="utf-8" />
|
|
12
|
+
<title>Architecture review — {{repo name}}</title>
|
|
13
|
+
<script src="https://cdn.tailwindcss.com"></script>
|
|
14
|
+
<script type="module">
|
|
15
|
+
import mermaid from "https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs";
|
|
16
|
+
mermaid.initialize({ startOnLoad: true, theme: "neutral", securityLevel: "loose" });
|
|
17
|
+
</script>
|
|
18
|
+
<style>
|
|
19
|
+
/* small custom layer for things Tailwind doesn't cover cleanly:
|
|
20
|
+
dashed seam lines, hand-drawn-feeling arrow heads, etc. */
|
|
21
|
+
.seam { stroke-dasharray: 4 4; }
|
|
22
|
+
.leak { stroke: #dc2626; }
|
|
23
|
+
.deep { background: linear-gradient(135deg, #0f172a, #1e293b); }
|
|
24
|
+
</style>
|
|
25
|
+
</head>
|
|
26
|
+
<body class="bg-stone-50 text-slate-900 font-sans">
|
|
27
|
+
<main class="max-w-5xl mx-auto px-6 py-12 space-y-12">
|
|
28
|
+
<header>...</header>
|
|
29
|
+
<section id="candidates" class="space-y-10">...</section>
|
|
30
|
+
<section id="top-recommendation">...</section>
|
|
31
|
+
</main>
|
|
32
|
+
</body>
|
|
33
|
+
</html>
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Header
|
|
37
|
+
|
|
38
|
+
Repo name, date, and a compact legend: solid box = module, dashed line = seam, red arrow = leakage, thick dark box = deep module. No introduction paragraph — straight into the candidates.
|
|
39
|
+
|
|
40
|
+
## Candidate card
|
|
41
|
+
|
|
42
|
+
The diagrams carry the weight. Prose is sparse, plain, and uses the glossary terms (from the `/codebase-design` skill) without ceremony.
|
|
43
|
+
|
|
44
|
+
Each candidate is one `<article>`:
|
|
45
|
+
|
|
46
|
+
- **Title** — short, names the deepening (e.g. "Collapse the Order intake pipeline").
|
|
47
|
+
- **Badge row** — recommendation strength (`Strong` = emerald, `Worth exploring` = amber, `Speculative` = slate), plus a tag for the dependency category (`in-process`, `local-substitutable`, `ports & adapters`, `mock`).
|
|
48
|
+
- **Files** — monospaced list, `font-mono text-sm`.
|
|
49
|
+
- **Before / After diagram** — the centrepiece. Two columns, side by side. See patterns below.
|
|
50
|
+
- **Problem** — one sentence. What hurts.
|
|
51
|
+
- **Solution** — one sentence. What changes.
|
|
52
|
+
- **Wins** — bullets, ≤6 words each. e.g. "Tests hit one interface", "Pricing logic stops leaking", "Delete 4 shallow wrappers".
|
|
53
|
+
- **ADR callout** (if applicable) — one line in an amber-tinted box.
|
|
54
|
+
|
|
55
|
+
No paragraphs of explanation. If the diagram needs a paragraph to be understood, redraw the diagram.
|
|
56
|
+
|
|
57
|
+
## Diagram patterns
|
|
58
|
+
|
|
59
|
+
Pick the pattern that fits the candidate. Mix them. Don't make every diagram look the same — variety is part of the point.
|
|
60
|
+
|
|
61
|
+
### Mermaid graph (the workhorse for dependencies / call flow)
|
|
62
|
+
|
|
63
|
+
Use a Mermaid `flowchart` or `graph` when the point is "X calls Y calls Z, and look at the mess." Wrap it in a Tailwind-styled card so it doesn't feel parachuted in. Style with classDef to colour leakage edges red and the deep module dark. Sequence diagrams work well for "before: 6 round-trips; after: 1."
|
|
64
|
+
|
|
65
|
+
```html
|
|
66
|
+
<div class="rounded-lg border border-slate-200 bg-white p-4">
|
|
67
|
+
<pre class="mermaid">
|
|
68
|
+
flowchart LR
|
|
69
|
+
A[OrderHandler] --> B[OrderValidator]
|
|
70
|
+
B --> C[OrderRepo]
|
|
71
|
+
C -.leak.-> D[PricingClient]
|
|
72
|
+
classDef leak stroke:#dc2626,stroke-width:2px;
|
|
73
|
+
class C,D leak
|
|
74
|
+
</pre>
|
|
75
|
+
</div>
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### Hand-built boxes-and-arrows (when Mermaid's layout fights you)
|
|
79
|
+
|
|
80
|
+
Modules as `<div>`s with borders and labels. Arrows as inline SVG `<line>` or `<path>` elements positioned absolutely over a relative container. Reach for this when you want the "after" diagram to feel like one thick-bordered deep module with greyed-out internals — Mermaid won't render that with the right weight.
|
|
81
|
+
|
|
82
|
+
### Cross-section (good for layered shallowness)
|
|
83
|
+
|
|
84
|
+
Stack horizontal bands (`h-12 border-l-4`) to show layers a call passes through. Before: 6 thin layers each doing nothing. After: 1 thick band labelled with the consolidated responsibility.
|
|
85
|
+
|
|
86
|
+
### Mass diagram (good for "interface as wide as implementation")
|
|
87
|
+
|
|
88
|
+
Two rectangles per module — one for interface surface area, one for implementation. Before: interface rectangle is nearly as tall as the implementation rectangle (shallow). After: interface rectangle is short, implementation rectangle is tall (deep).
|
|
89
|
+
|
|
90
|
+
### Call-graph collapse
|
|
91
|
+
|
|
92
|
+
Before: a tree of function calls rendered as nested boxes. After: the same tree collapsed into one box, with the now-internal calls shown faded inside it.
|
|
93
|
+
|
|
94
|
+
## Style guidance
|
|
95
|
+
|
|
96
|
+
- Lean editorial, not corporate-dashboard. Generous whitespace. Serif optional for headings (`font-serif` works well with stone/slate).
|
|
97
|
+
- Colour sparingly: one accent (emerald or indigo) plus red for leakage and amber for warnings.
|
|
98
|
+
- Keep diagrams ~320px tall so before/after sits comfortably side by side without scrolling.
|
|
99
|
+
- Use `text-xs uppercase tracking-wider` for module labels inside diagrams — they should read as schematic, not as UI.
|
|
100
|
+
- The only scripts are the Tailwind CDN and the Mermaid ESM import. The report is otherwise static — no app code, no interactivity beyond Mermaid's own rendering.
|
|
101
|
+
|
|
102
|
+
## Top recommendation section
|
|
103
|
+
|
|
104
|
+
One larger card. Candidate name, one sentence on why, anchor link to its card. That's it.
|
|
105
|
+
|
|
106
|
+
## Tone
|
|
107
|
+
|
|
108
|
+
Plain English, concise — but the architectural nouns and verbs come straight from the `/codebase-design` skill. Concision is not an excuse to drift.
|
|
109
|
+
|
|
110
|
+
**Use exactly:** module, interface, implementation, depth, deep, shallow, seam, adapter, leverage, locality.
|
|
111
|
+
|
|
112
|
+
**Never substitute:** component, service, unit (for module) · API, signature (for interface) · boundary (for seam) · layer, wrapper (for module, when you mean module).
|
|
113
|
+
|
|
114
|
+
**Phrasings that fit the style:**
|
|
115
|
+
|
|
116
|
+
- "Order intake module is shallow — interface nearly matches the implementation."
|
|
117
|
+
- "Pricing leaks across the seam."
|
|
118
|
+
- "Deepen: one interface, one place to test."
|
|
119
|
+
- "Two adapters justify the seam: HTTP in prod, in-memory in tests."
|
|
120
|
+
|
|
121
|
+
**Wins bullets** name the gain in glossary terms: *"locality: bugs concentrate in one module"*, *"leverage: one interface, N call sites"*, *"interface shrinks; implementation absorbs the wrappers"*. Don't write *"easier to maintain"* or *"cleaner code"* — those terms aren't in the glossary and don't earn their place.
|
|
122
|
+
|
|
123
|
+
No hedging, no throat-clearing, no "it's worth noting that…". If a sentence could be a bullet, make it a bullet. If a bullet could be cut, cut it. If a term isn't in the `/codebase-design` glossary, reach for one that is before inventing a new one.
|