From a35ea62ab11b63cf775427afad289e80c30b1690 Mon Sep 17 00:00:00 2001 From: Jason Woltje Date: Wed, 2 Sep 2026 20:18:17 -0500 Subject: [PATCH] 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:-r 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 --- RELEASE | 1 + compose.yaml | 2 +- package.json | 2 +- scripts/build.sh | 1 + scripts/common.sh | 15 +++++++++++++++ scripts/hello.sh | 1 + scripts/verify.sh | 3 ++- 7 files changed, 22 insertions(+), 3 deletions(-) create mode 100644 RELEASE diff --git a/RELEASE b/RELEASE new file mode 100644 index 00000000..bcab45af --- /dev/null +++ b/RELEASE @@ -0,0 +1 @@ +0.0.3 diff --git a/compose.yaml b/compose.yaml index 1a447020..0defc3a1 100644 --- a/compose.yaml +++ b/compose.yaml @@ -3,7 +3,7 @@ services: build: context: . dockerfile: Containerfile - image: mosaic-poc-agent:0.84.4 + image: ${MOSAIC_IMAGE_TAG:?MOSAIC_IMAGE_TAG must be set by scripts/load_release (run via scripts/*.sh)} user: "1000:1000" environment: # Resolved from config.json by scripts/common.sh (load_config). diff --git a/package.json b/package.json index c88ca47b..f5673c09 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mosaic-stack-dev-test", - "version": "0.1.0", + "version": "0.0.3", "private": true, "description": "Minimal Mosaic Stack container proof of concept: one Pi agent, four local contract files, one real model request returning MOSAIC_HELLO_OK.", "license": "UNLICENSED", diff --git a/scripts/build.sh b/scripts/build.sh index e2758a8d..275989c5 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -6,6 +6,7 @@ cd "$(dirname "$0")/.." source scripts/common.sh load_config +load_release bootstrap_runtime_dir diff --git a/scripts/common.sh b/scripts/common.sh index e3e21abd..b62e6a59 100755 --- a/scripts/common.sh +++ b/scripts/common.sh @@ -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. diff --git a/scripts/hello.sh b/scripts/hello.sh index bbbaf57a..becfd479 100755 --- a/scripts/hello.sh +++ b/scripts/hello.sh @@ -11,6 +11,7 @@ cd "$(dirname "$0")/.." source scripts/common.sh load_config +load_release bootstrap_runtime_dir diff --git a/scripts/verify.sh b/scripts/verify.sh index 54a47316..f807013d 100755 --- a/scripts/verify.sh +++ b/scripts/verify.sh @@ -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.