#!/usr/bin/env bash set -euo pipefail SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" ROOT_DIR="$(cd -- "$SCRIPT_DIR/.." && pwd)" TOOL_DIR="$SCRIPT_DIR/sdlc-delivery" SOURCE_DIR="$ROOT_DIR/sdlc" DELIVERY_ROOT="$ROOT_DIR/sdlc-delivery" STAGING_DIR="$ROOT_DIR/.sdlc-delivery.staging" if [[ ! -d "$TOOL_DIR/node_modules/playwright" ]]; then echo "Installing the local PDF renderer..." npm install --prefix "$TOOL_DIR" npx --prefix "$TOOL_DIR" playwright install chromium fi # The Software Design figures are drawn in scripts/sdlc-seed/figures.mjs and # rasterised with the document font before the seed copies them into sdlc/. echo "Rendering Software Design figures..." node "$TOOL_DIR/render-figures.mjs" # sdlc/ is generated output: the seed rebuilds every work product from the # controlled project data in scripts/sdlc-seed/ before anything is rendered. echo "Seeding work products from project data..." node "$SCRIPT_DIR/sdlc-seed/build.mjs" rm -rf "$STAGING_DIR" mkdir -p "$STAGING_DIR" while IFS= read -r -d '' source; do relative="${source#"$ROOT_DIR/sdlc/"}" destination="$STAGING_DIR/${relative%.md}.pdf" echo "Rendering ${relative%.md}.pdf" node "$TOOL_DIR/render-sdlc.mjs" "$source" "$destination" done < <(find "$SOURCE_DIR" -type f -name '*.md' -print0 | sort -z) # Every .pdf gets a Word copy beside it, reconstructed from the rendered page. # The CI header bands need Playwright, so they are rendered here with node and # handed to the converter, which then only needs Python with pdf2docx: the local # interpreter ($PYTHON) when it has it, otherwise a throwaway python container. BAND_DIR="$(mktemp -d)" trap 'rm -rf "$BAND_DIR"' EXIT echo "Rendering CI header bands..." node "$TOOL_DIR/render-ci-band.mjs" "$SOURCE_DIR" "$BAND_DIR" echo "Converting PDFs to Word..." PYTHON="${PYTHON:-python3}" if "$PYTHON" -c 'import pdf2docx, docx' 2>/dev/null; then "$PYTHON" "$TOOL_DIR/convert-to-docx.py" "$SOURCE_DIR" "$STAGING_DIR" "$BAND_DIR" elif command -v docker >/dev/null 2>&1; then PY_CACHE="${XDG_CACHE_HOME:-$HOME/.cache}/sdlc-delivery-python" mkdir -p "$PY_CACHE" docker run --rm --user "$(id -u):$(id -g)" -e HOME=/tmp -e PYTHONPATH=/py \ -v "$ROOT_DIR:$ROOT_DIR" -v "$BAND_DIR:$BAND_DIR:ro" -v "$PY_CACHE:/py" \ -w "$ROOT_DIR" python:3.12-slim sh -c ' python -c "import pdf2docx, docx" 2>/dev/null || pip install --quiet --disable-pip-version-check --target /py -r "$1" shift; python "$@"' _ \ "$TOOL_DIR/requirements.txt" "$TOOL_DIR/convert-to-docx.py" "$SOURCE_DIR" "$STAGING_DIR" "$BAND_DIR" else echo "pdf2docx is not available: pip install -r $TOOL_DIR/requirements.txt, or install docker." >&2 exit 1 fi echo "Verifying staged delivery package..." "$SCRIPT_DIR/verify-sdlc-delivery.sh" "$STAGING_DIR" rm -rf "$DELIVERY_ROOT" mv "$STAGING_DIR" "$DELIVERY_ROOT" echo "Delivery and verification passed: $DELIVERY_ROOT"