Auto-Generated PyPI Skills (Build)
Jaunt can generate 'skills' from your project's external imports and inject them into the build prompt.
This exists for one reason: better generated code when your specs use third-party libraries. Jaunt extracts real usage patterns from PyPI READMEs, turns them into short reference "skills", and feeds that to the builder.
Jaunt adds a pre-build step to jaunt build that (best-effort) generates and injects skills for the external libraries your project imports.
There are two related skill workflows in Jaunt:
- automatic PyPI skill generation during
jaunt build - explicit user-managed skill authoring through
jaunt skill build <name>
Both respect [agent].engine, so if you switch to agent.engine = "aider",
Jaunt uses the Aider runtime for those skill-generation steps too.
With current defaults, that means the Aider runtime is used unless you opt back
to agent.engine = "legacy".
What It Does
On every jaunt build:
- Scans
paths.source_rootsfor Python imports (import ...andfrom ... import ...). - Filters out:
- stdlib modules
- project-internal top-level modules
- relative imports (
from .foo import ...)
- Resolves the remaining imports to installed PyPI distributions + versions (from your current environment).
- Ensures there is exactly one skill per distribution at:
<project_root>/.agents/skills/<dist-normalized>/SKILL.md
- Fetches the README for the exact
<dist>==<version>from PyPI, then uses an OpenAI "skills generator" to produceSKILL.md. - Concatenates all generated skills into a single block and injects it into the build LLM prompt so the builder can use accurate library patterns.
If any piece fails (resolution, PyPI fetch, generation, write), Jaunt prints a warning and continues building without those missing skills.
Where Skills Are Stored
Skills are stored inside your project:
<project_root>/
.agents/
skills/
requests/
SKILL.md
pydantic/
SKILL.mdThe directory name is the distribution name normalized like PyPI (lowercased; -, _, . treated consistently).
Safe Overwrites (When Jaunt Regenerates)
Jaunt will only overwrite a skill file if it was previously generated by Jaunt and the installed version changed.
- Generated files start with a header like:
<!-- jaunt:skill=pypi dist=<dist> version=<version> -->
- If a file has no header, it is treated as user-managed and is never overwritten.
What Gets Injected Into The Build Prompt
During build generation, Jaunt injects an extra user message before the normal module prompt:
External library skills (reference):- followed by a concatenated block like:
## <dist>==<version>- skill content (header removed to reduce noise)
This gives the code generator concrete, library-specific usage patterns and gotchas.
Security Note (Prompt Injection Hygiene)
PyPI READMEs are treated as untrusted input. The skill generator is instructed to ignore "instructions" inside READMEs and only extract factual usage and API patterns.
Troubleshooting
-
Want to see it in action quickly? Try a runnable example:
uv run python examples/run_example.py pydantic test
-
"It didn't generate a skill": the import might be stdlib or internal, the dist might not be installed, or the README fetch/generation might have failed. Jaunt should emit a warning but still proceed with the build.
-
"Wrong version": skills are keyed to what's installed in the environment running
jaunt build. Update your environment, rerun build, and Jaunt should refresh generated skills. -
"I want to edit a checked-in skill directly": use
jaunt skill build <name>on a user-managed skill directory under.agents/skills/<name>/.
Next: Limitations.