Jaunt
Guides

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_roots for Python imports (import ... and from ... 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 produce SKILL.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.md

The 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.

On this page