Everything you need to submit a contrib/ recipe, on one page.
Deep detail lives in recipe-handbook/.
Requires an AI coding assistant (e.g. CloudCode). If you don't have one, skip to § 3 for the manual commands.
The fastest path is prepare-python-recipe — it runs every other
skill in the right order.
| Skill | What it does | Example prompt |
|---|---|---|
prepare-python-recipe |
Runs every other skill below in sequence. The fastest path to a PR-ready recipe. | prepare the python recipe contrib/python/my-recipe |
generate-manifest |
Writes a valid manifest.yaml from your recipe files |
generate manifest for contrib/python/my-recipe |
align-recipe-pyproject |
Fixes pyproject.toml to match repo conventions |
align pyproject.toml for contrib/python/my-recipe |
extract-python-environment-variables |
Populates .env.example from Python source and adds load_dotenv() where needed |
extract env vars for contrib/python/my-recipe |
generate-python-runnability-test |
Writes tests/test_runnability.py |
generate runnability test for contrib/python/my-recipe |
For deep detail on each skill, see the Repo Skills Catalog.
- Recipe has a clear, unique purpose: a concrete problem it solves and something new to teach — see What makes a good recipe
- Recipe lives at
contrib/<lang>/<name>— anatomy - Recipe name (folder name) ≤ 30 chars, lowercase + hyphens only
- Under size limit: 70 files / 2 MB for
contrib/— use WebP for doc-only screenshots/diagrams -
manifest.yamlvalid, with realownership.teamandownership.poc— AI skill:generate-manifest -
README.mdhas ≥ 100 words, a setup section, and a run section with a code block — CI enforces this; details
Deprecated models:
gemini-2.0-flashandgemini-2.5-flashare no longer accepted. Usegemini-3.5-flash.
Python — details
-
pyproject.tomlaligned — AI skill:align-recipe-pyproject -
uv.lockin sync — runuv lockfrom the recipe root -
.env.exampledeclares every env var the recipe reads — AI skill:extract-python-environment-variables -
load_dotenv()called in the package__init__.py(notagent.py) - Model names read from env vars, not hardcoded in source
-
tests/test_runnability.pypresent — AI skill:generate-python-runnability-test
Java / Go / TypeScript / Kotlin — language-specific guidance is
in progress; start with the relevant page before writing code:
Go ·
Java ·
TypeScript ·
Kotlin.
Structural checks in § 3 already apply — run
uv run validate $RECIPE_PATH and review
anatomy.md for layout rules.
The commands in this section run from the repo root and mirror
what CI runs. They all use $RECIPE_PATH — set that variable
first.
Do this once before running any of the commands below:
export RECIPE_PATH=contrib/python/my-recipeReplace my-recipe with your recipe's folder name.
One block, one paste. Requires $RECIPE_PATH from above.
# From the repo root
uv run validate $RECIPE_PATH # Validates manifest and structure
uv run ruff format $RECIPE_PATH # Formats the recipe code
uv run ruff check --fix $RECIPE_PATH # Fixes lint errors
# From the recipe root
cd $RECIPE_PATH
uv lock # Updates the lock file
uv run pytest # Runs the testsuv run validate <recipe-path> runs all structural validators
against your recipe and reports PASS / FAIL for each.
- All checks pass:
uv run validate $RECIPE_PATH
Individual validators (useful for isolating one failure):
uv run validate manifest $RECIPE_PATH
uv run validate structure $RECIPE_PATH
uv run validate readme $RECIPE_PATHvalidate manifest— checksmanifest.yamlagainst the schema and verifiesownership.team/ownership.pocare not placeholders.validate structure— checks folder name, size, required files, and layout.validate readme— checks README.md for a setup section, run section, code block, and minimum word count.
- Format and lint pass:
uv run ruff format $RECIPE_PATH uv run ruff check $RECIPE_PATH
- Tests pass (integration excluded, same as CI):
cd $RECIPE_PATH uv run pytest --ignore=tests/integration --ignore-glob="**/test_integration.py"
CI excludes integration tests by default. See python.md — Integration tests for exclusion patterns and how to run them locally before opening a PR.
- CI failing on your PR? → troubleshooting
- Fix
validate-recipe-structurefailures first — structural errors can mask Python-specific checks downstream. - Some failures cascade: a stale
uv.lockcauses bothpython-dependency-policyandpython-teststo fail. Fix the root cause before pushing again. - CI re-runs automatically on every push to your PR branch. No manual trigger is needed.
- Want the full story? → handbook overview