From 82d1070a44ed2f7c6c5f7466f95e058a285d3190 Mon Sep 17 00:00:00 2001 From: claude-ceo-assistant Date: Fri, 8 May 2026 05:35:25 -0700 Subject: [PATCH] =?UTF-8?q?cleanup:=20local-e2e-setup.sh=20=E2=80=94=20sym?= =?UTF-8?q?link=20injection=20optional=20via=20--with-symlink?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Follow-up to molecule-ai-org-template-molecule-dev PR #6 (PR-D in the internal#77 phasing) which removed the dev-lead symlink from the parent template. Without this update, running the setup script errored out because it required a symlink that the parent no longer ships. Changes: - Default mode: clone parent template only. No sibling clone, no symlink. The canonical local-e2e test (TestLocalE2E_ExternalDevDepartment) uses the !external resolver to fetch the dev tree at test runtime — no filesystem fixture needed. - --with-symlink flag: keeps the legacy sibling-clone + symlink layout for the symlink-based regression tests (TestLocalE2E_DevDepartmentExtraction + TestLocalE2E_FilesDirConsumption). Script INJECTS the symlink (since parent no longer ships it post-PR #6). - Updated 'Run tests' guidance: !external test is the canonical e2e; symlink tests are opt-in regression coverage for the path the resolver still supports but no production template uses. VERIFIED LOCALLY 2026-05-08: - Default mode: clone parent only, layout correct. - --with-symlink mode: parent + dev-department + injected symlink, layout correct. - Full TestLocalE2E_* test suite passes against --with-symlink fixture (1.7s). Refs: internal#77 — extraction RFC molecule-ai/molecule-ai-org-template-molecule-dev#6 — PR-D (symlink removal) task #235 follow-up — finishes the cleanup the PR-D description mentioned --- .molecule-ci/scripts/local-e2e-setup.sh | 98 ++++++++++++++++++------- 1 file changed, 70 insertions(+), 28 deletions(-) diff --git a/.molecule-ci/scripts/local-e2e-setup.sh b/.molecule-ci/scripts/local-e2e-setup.sh index adb8796..7392413 100755 --- a/.molecule-ci/scripts/local-e2e-setup.sh +++ b/.molecule-ci/scripts/local-e2e-setup.sh @@ -1,19 +1,37 @@ #!/usr/bin/env bash -# local-e2e-setup.sh — bootstrap the local sibling-clone fixture for -# end-to-end testing of the dev-department extraction (RFC internal#77). +# local-e2e-setup.sh — bootstrap the local fixture for end-to-end +# testing of the dev-department composition (RFC internal#77). # -# Sets up: +# Composition shape evolved 2026-05-08: +# - PR #5 (parent template): introduced dev-lead symlink + sibling-clone deploy. +# - PR #6 (parent template, this PR's parent): replaced symlink with `!external` +# resolver block. Composition now happens at platform import time. +# +# Effective state: only the parent template needs to be cloned. The dev tree +# is fetched on demand by the workspace-server's `!external` resolver into +# /.external-cache/, populated when go tests call resolveYAMLIncludes. +# +# Optional: still clone molecule-dev-department as a sibling for symlink- +# based composition tests (TestLocalE2E_DevDepartmentExtraction + +# TestLocalE2E_FilesDirConsumption). Those tests skip gracefully if the +# symlink isn't created — they're regression coverage for the symlink path +# the resolver still supports, even though no production template uses it. +# +# Sets up (default): # /tmp/local-e2e-deploy/ -# ├── molecule-dev/ ← parent template (symlink wires dev-lead) -# └── molecule-dev-department/ ← extracted dev tree +# └── molecule-dev/ ← parent template (uses !external) # -# After running, both Go tests are exercisable: +# Sets up (with --with-symlink for legacy tests): +# /tmp/local-e2e-deploy/ +# ├── molecule-dev/ +# │ └── dev-lead → ../molecule-dev-department/dev-lead (script-injected) +# └── molecule-dev-department/ +# +# After running, the canonical local-e2e test is exercisable: # cd /workspace-server -# go test -v -run TestLocalE2E_DevDepartmentExtraction ./internal/handlers/ -# go test -v -run TestLocalE2E_FilesDirConsumption ./internal/handlers/ +# go test -v -run TestLocalE2E_ExternalDevDepartment ./internal/handlers/ # -# Idempotent: re-running pulls latest from both repos. Pass --fresh to -# wipe and re-clone. +# Idempotent: re-running pulls latest. Pass --fresh to wipe and re-clone. set -euo pipefail @@ -22,10 +40,25 @@ GITEA="${GITEA_URL:-https://git.moleculesai.app}" TOKEN_PATH="${HOME}/.molecule-ai/gitea-token" PARENT_REPO="molecule-ai-org-template-molecule-dev" -PARENT_DIR_NAME="molecule-dev" # dir name parent expects (matches operator convention) +PARENT_DIR_NAME="molecule-dev" SUBTREE_REPO="molecule-dev-department" -if [[ "${1:-}" == "--fresh" ]]; then +WITH_SYMLINK=0 +WIPE=0 +for arg in "$@"; do + case "$arg" in + --fresh) WIPE=1 ;; + --with-symlink) WITH_SYMLINK=1 ;; + -h|--help) + sed -n '2,30p' "$0" + exit 0 ;; + *) + echo "unknown flag: $arg" >&2 + exit 2 ;; + esac +done + +if [[ "$WIPE" == "1" ]]; then echo "[fresh] wiping ${ROOT}" rm -rf "${ROOT}" fi @@ -51,27 +84,36 @@ clone_or_pull() { fi } -clone_or_pull "${PARENT_REPO}" "${PARENT_DIR_NAME}" -clone_or_pull "${SUBTREE_REPO}" "${SUBTREE_REPO}" +clone_or_pull "${PARENT_REPO}" "${PARENT_DIR_NAME}" -# Sanity: parent's dev-lead symlink target resolves to subtree's dev-lead. -SYMLINK="${PARENT_DIR_NAME}/dev-lead" -if [[ ! -L "${SYMLINK}" ]]; then - echo "ERROR: ${SYMLINK} is not a symlink — parent template's PR #5 (slim) may not be deployed yet" >&2 - exit 3 -fi -if [[ ! -f "${SYMLINK}/workspace.yaml" ]]; then - echo "ERROR: ${SYMLINK}/workspace.yaml does not resolve — symlink target missing" >&2 - ls -la "${SYMLINK}" >&2 - exit 4 +if [[ "$WITH_SYMLINK" == "1" ]]; then + clone_or_pull "${SUBTREE_REPO}" "${SUBTREE_REPO}" + SYMLINK="${PARENT_DIR_NAME}/dev-lead" + if [[ ! -L "${SYMLINK}" ]]; then + echo "[symlink] creating ${SYMLINK} → ../${SUBTREE_REPO}/dev-lead (post-PR #6 the parent no longer ships one; injected for legacy tests)" + ln -s "../${SUBTREE_REPO}/dev-lead" "${SYMLINK}" + fi + if [[ ! -f "${SYMLINK}/workspace.yaml" ]]; then + echo "ERROR: ${SYMLINK}/workspace.yaml does not resolve — symlink target missing" >&2 + ls -la "${SYMLINK}" >&2 + exit 4 + fi fi echo "" echo "== ready ==" echo " parent : ${ROOT}/${PARENT_DIR_NAME}" -echo " subtree: ${ROOT}/${SUBTREE_REPO}" -echo " symlink: $(ls -la "${SYMLINK}" | awk '{print $NF}')" +if [[ "$WITH_SYMLINK" == "1" ]]; then + echo " subtree: ${ROOT}/${SUBTREE_REPO}" + echo " symlink: $(ls -la "${PARENT_DIR_NAME}/dev-lead" | awk '{print $NF}')" +fi echo "" -echo "Run tests:" +echo "Run the canonical e2e (default — uses !external resolver, no fixture):" echo " cd /workspace-server" -echo " go test -v -run TestLocalE2E_ ./internal/handlers/" +echo " go test -v -run TestLocalE2E_ExternalDevDepartment ./internal/handlers/" +if [[ "$WITH_SYMLINK" == "1" ]]; then + echo "" + echo "Run the legacy symlink-path tests (regression coverage for symlink resolver):" + echo " go test -v -run TestLocalE2E_DevDepartmentExtraction ./internal/handlers/" + echo " go test -v -run TestLocalE2E_FilesDirConsumption ./internal/handlers/" +fi