feat(release): RELEASE identity + image tag single-sourcing (#10)

- RELEASE file: single source of release version (0.0.X until declared stable)
- common.sh load_release(): validates version, derives
  MOSAIC_IMAGE_TAG=mosaic-poc-agent:<pi>-r<release> from the pinned pi dep
- compose.yaml: image tag is required env; build/hello/verify call load_release
- verify.sh derives the image name instead of hardcoding it
- package.json version aligned to the same 0.0.X line

Closes #10
This commit is contained in:
2026-09-02 20:18:17 -05:00
parent f6c93dcb5c
commit a35ea62ab1
7 changed files with 22 additions and 3 deletions
+1
View File
@@ -6,6 +6,7 @@ cd "$(dirname "$0")/.."
source scripts/common.sh
load_config
load_release
bootstrap_runtime_dir
+15
View File
@@ -19,6 +19,21 @@ load_config() {
MOSAIC_DEV_DIR="$MOSAIC_DATA_ROOT"
}
# Resolve the release identity: RELEASE is the single source of the
# release version (stays 0.0.X until declared stable); the image tag
# derives from it plus the pinned pi dependency version.
load_release() {
local release pi_version
release="$(tr -d '[:space:]' < RELEASE)"
if ! printf '%s' "$release" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+$'; then
echo "common: RELEASE must be a semver-ish version, got: '$release'" >&2
exit 1
fi
pi_version="$(node -p "require('./package.json').dependencies['@earendil-works/pi-coding-agent']")"
export MOSAIC_RELEASE="$release"
export MOSAIC_IMAGE_TAG="mosaic-poc-agent:${pi_version}-r${release}"
}
# Ensure the configured runtime data directory exists and carries this
# project's ownership marker. The marker is what scripts/reset.sh requires
# before it will delete anything.
+1
View File
@@ -11,6 +11,7 @@ cd "$(dirname "$0")/.."
source scripts/common.sh
load_config
load_release
bootstrap_runtime_dir
+2 -1
View File
@@ -14,10 +14,11 @@ cd "$(dirname "$0")/.."
# shellcheck source=common.sh
source scripts/common.sh
IMAGE="mosaic-poc-agent:0.84.4"
EXPECTED="${EXPECTED_MARKER:-MOSAIC_HELLO_OK}"
load_config
load_release
IMAGE="$MOSAIC_IMAGE_TAG"
# Ensure the configured data root exists (host-owned) before the mount,
# otherwise Docker would auto-create a root-owned directory.