Skip to main content
Create a root-owned folder under extensions/. The folder name is the extension identity and must be a valid Python identifier.
extensions/warehouse/

Declare the extension

metadata.name must match the folder. The optional PEP 621 project name and version must match extension.yaml. Its static dependencies join the root environment solve.

Export the application-owned singleton

extension.py exports one public Extension subclass and the singleton named extension. Keep SDK clients on that singleton, and expose a bounded invocation view through ExtensionContext:
extensions/warehouse/extension.py
Harnest imports extension modules during compilation but does not call start() or connect to services. Runtime startup activates extensions in dependency order and calls stop() in reverse order.

Add optional extension content

Managed mode composes declared content into the owning agent. Advanced mode accepts declared lifecycle hooks and factories but rejects populated managed-content directories because the native target owns its own composition.

Add extension dependencies

Use requires.extensions when this extension depends on another local Harnest Extension:
extensions/warehouse/extension.yaml
Harnest rejects missing dependencies and cycles. Extension Python dependencies share one solve with the root project; incompatible constraints fail harnest env sync instead of creating isolated environments.

Add lifecycle behavior

Declare exactly which Harnest surfaces the extension contributes.