Add a new package/service to the Nannos monorepo. Use when: creating a new microservice, adding a new library, scaffolding a new package under packages/, registering a package for versioning and release.
packages/Every package lives under packages/<package-name>/. Adding one requires updates to several repo-wide coordination files so the package participates in versioning, releases, builds, and (optionally) Kubernetes deployment.
Create packages/<package-name>/ with the appropriate project files:
pyproject.toml (with version = "0.1.0"), source directory, tests/package.json (with "version": "0.1.0"), src/, tsconfig.jsonIf the package is deployable, add a Dockerfile.
scripts/release-helpers.shThis file contains all package metadata. Three places must be updated:
ALL_PACKAGES variable (line ~19)Add the package name to the space-separated list:
ALL_PACKAGES="agent-creator agent-runner orchestrator-agent console-backend console-frontend ringier-a2a-sdk client-slack client-slack-frontend client-email <new-package>"
pkg_dir() functionAdd a case entry mapping package name → directory:
<new-package>) echo "packages/<new-package>" ;;
pkg_type() functionAdd a case entry declaring the package type (python or node):
# Add to the correct case group:
# node packages: console-frontend|client-slack-frontend|client-slack|client-email|<new-package>
# python packages: agent-creator|agent-runner|orchestrator-agent|console-backend|ringier-a2a-sdk|<new-package>
justfileOnly required if the package has a Dockerfile (is buildable/deployable):
img_<new_package> := registry + "/nannos-<new-package>"
Variable name uses underscores; image name uses hyphens.
_buildable_packages list (~line 46)_buildable_packages := "agent-creator agent-runner orchestrator-agent console-backend console-frontend client-slack client-slack-frontend client-email <new-package>"
pkg-image recipe (~line 62) <new-package>) echo "{{ img_<new_package> }}" ;;
pkg-deploy recipeOnly if the k8s deployment name differs from the package name:
<new-package>) echo "<deploy-name>" ;;
Update the example-k8s-deployment/ directory with the necessary manifests to deploy the new package as a service. Look through the existing files to see the pattern.
!! important: If there is a gitops folder symlinked in this repo root this means this developer is managing a k8s cluster: See gitops/AGENTS.md - it has instruction on how to construct the necessary k8s manifests and add them to the FluxCD gitops.
Run these commands to confirm the package is correctly registered:
# Should list your new package with its version
just pkg-version <new-package>
# Should show the package in the changed list (since it has no release tag yet)
just changed
# If buildable, verify the image name resolves
just pkg-image <new-package>
| Step | File | Required? |
|---|---|---|
| Create package dir | packages/<name>/ | Always |
Add to ALL_PACKAGES | scripts/release-helpers.sh | Always |
Add to pkg_dir() | scripts/release-helpers.sh | Always |
Add to pkg_type() | scripts/release-helpers.sh | Always |
| Add image variable | justfile | If has Dockerfile |
Add to _buildable_packages | justfile | If has Dockerfile |
Add to pkg-image | justfile | If has Dockerfile |
Add to pkg-deploy | justfile | If deploy name differs |
| Add k8s manifests | example-k8s-deployment/ | If deployed to k8s |