Prompt Packages

A prompt package is a unit of work you can hand to someone else's agent.

Modules bring capabilities — tools, integrations, things an agent can do. A prompt brings a task: the instruction itself, packaged so it can be installed, versioned, and shared. It is the smallest publishable thing in Axon, and the only one with no build step.

axon prompt init eslint-scout

Two things called "prompts"

Worth separating up front, because the word does double duty:

Prompts in your agent live in src/prompts/ and are context loaded at invocation time — see prompts/. They belong to that one agent.

Prompt packages are registry artifacts. Same file formats, same authoring rules, but the folder is the package and it ships on its own.

The difference is scope, not substance. A prompt you wrote in src/prompts/ becomes a package by moving it into a folder with a prompt.config.ts beside it.

The shape

eslint-scout/
├── components/          # fragments the prompts compose — never invokable
   └── rules.vue
├── eslint-scout.vue     # a prompt
├── reconcile.md         # another prompt
├── prompt.config.ts     # identity
└── package.json

Every top-level .vue/.md file is an invokable prompt. components/ holds the fragments they compose and is never invokable itself — that one rule is the whole layout.

A single-prompt package and a pack of them are the same shape. A pack is just one with more files, not a different kind of thing.

prompt.config.ts

Identity only:

export default definePrompt({
    description: "Scouts a codebase and files proposals",
})

There is nothing else to configure. A prompt has no dependencies, no runtime surface, and no options — so axon prepare on one has nothing to do, and publishing is the entire lifecycle.

Static and dynamic

A .md prompt is static text. A .vue prompt takes props, and the props are introspected — callers get them typed without you declaring anything twice:

<template>
    <h1>Review {{ path }}</h1>

    <p>
        Read the file and list every rule violation you find. Report the line
        number and the rule name. Do not fix anything.
    </p>
</template>

<script setup lang="ts">
defineProps<{ path: string }>()
</script>

Invoked with those props:

axon run @cody/eslint-scout:eslint-scout --path src/auth.ts

Why this is its own kind

For a long time, sharing an instruction meant wrapping it in a module — which meant a build step, a config file with real surface area, and knowledge of how the runtime loads things. That is a lot of machinery around what is, in the end, a string.

Most people who want to share something want to share a task, not a capability. Prompts exist so that is a one-command operation, and so the registry can carry work as well as tooling.

Next: publish one.