Give every Action one obvious home
The required actions/ directory is the public behavior surface. Each direct Python file
declares exactly one decorated async def run.
Keep authored source separate from build output
my-assistant/
├── icon.png
├── shimpz.toml
├── actions/
│ ├── create_dns.py
│ ├── delete_dns.py
│ └── list_dns.py
├── lib/
│ └── cloudflare.py
└── pyproject.tomlicon.png, shimpz.toml, pyproject.toml, and actions/ are required. lib/ and tests/ are optional. Dockerfiles, locks, generated contracts,
changelogs, and Docker ignore files are platform build output rather than Assistant source.
One file, one async run function
from typing import TypedDict
from shimpz import action
class EchoResult(TypedDict):
message: str
@action(description="Repeat your message back to you.")
async def run(message: str) -> EchoResult:
return {"message": message}The filename becomes the Action id: underscores are replaced with hyphens. The required description says in one line what
the Action does for the person. Type annotations become closed input and output schemas; helper code stays in lib/.