@@ -995,54 +995,106 @@ fi
995995rm -f " $MCP_KILL_INPUT "
996996
997997echo " "
998- echo " === Phase 14: update flow E2E ==="
998+ echo " === Phase 14: update + uninstall E2E ==="
999999
1000- UPDATE_DIR=$( mktemp -d)
1001- UPDATE_INSTALL=" $UPDATE_DIR /install"
1002- mkdir -p " $UPDATE_INSTALL "
1000+ if [ -n " ${SMOKE_DOWNLOAD_URL:- } " ]; then
1001+ # ── 14a-f: Real update command against local HTTP server ──
1002+ UPDATE_HOME=$( mktemp -d)
1003+ mkdir -p " $UPDATE_HOME /.claude" " $UPDATE_HOME /.local/bin"
1004+ cp " $BINARY " " $UPDATE_HOME /.local/bin/codebase-memory-mcp"
1005+ chmod 755 " $UPDATE_HOME /.local/bin/codebase-memory-mcp"
1006+ if [ " $( uname -s) " = " Darwin" ]; then
1007+ codesign --sign - --force " $UPDATE_HOME /.local/bin/codebase-memory-mcp" 2> /dev/null || true
1008+ fi
10031009
1004- # 14a-c: Set up fake install + downloaded binary, verify both run
1005- cp " $BINARY " " $UPDATE_INSTALL /codebase-memory-mcp"
1006- chmod 755 " $UPDATE_INSTALL /codebase-memory-mcp"
1007- cp " $BINARY " " $UPDATE_DIR /smoke-downloaded"
1010+ # Pre-install agent config with a WRONG binary path (simulates stale config)
1011+ echo ' {"mcpServers":{"codebase-memory-mcp":{"command":"/old/stale/path"}}}' > " $UPDATE_HOME /.claude.json"
10081012
1009- if ! " $UPDATE_INSTALL /codebase-memory-mcp" --version > /dev/null 2>&1 ; then
1010- echo " FAIL 14c: installed binary doesn't run"
1011- exit 1
1012- fi
1013+ # 14a: Run actual update command
1014+ HOME=" $UPDATE_HOME " CBM_DOWNLOAD_URL=" $SMOKE_DOWNLOAD_URL " \
1015+ " $BINARY " update --standard -y 2>&1 || true
10131016
1014- # 14d: Replace (platform-specific)
1015- rm -f " $UPDATE_INSTALL /codebase-memory-mcp"
1016- cp " $UPDATE_DIR /smoke-downloaded" " $UPDATE_INSTALL /codebase-memory-mcp"
1017- chmod 755 " $UPDATE_INSTALL /codebase-memory-mcp"
1017+ # 14b: Verify new binary exists and runs
1018+ if [ ! -f " $UPDATE_HOME /.local/bin/codebase-memory-mcp" ]; then
1019+ echo " FAIL 14b: binary missing after update"
1020+ exit 1
1021+ fi
1022+ UPD_BIN=" $UPDATE_HOME /.local/bin/codebase-memory-mcp"
1023+ if [ " $( uname -s) " = " Darwin" ]; then
1024+ codesign --sign - --force " $UPD_BIN " 2> /dev/null || true
1025+ fi
1026+ if ! " $UPD_BIN " --version > /dev/null 2>&1 ; then
1027+ echo " FAIL 14b: updated binary doesn't run"
1028+ exit 1
1029+ fi
1030+ echo " OK 14b: updated binary runs"
10181031
1019- # 14e: Sign on macOS
1020- if [ " $( uname -s) " = " Darwin" ]; then
1021- codesign --sign - --force " $UPDATE_INSTALL /codebase-memory-mcp" 2> /dev/null || true
1022- fi
1032+ # 14c: Verify agent config was refreshed (stale path replaced)
1033+ UPD_CMD=$( python3 -c " import json,sys,os; f='$UPDATE_HOME /.claude.json'; d=json.load(open(f)) if os.path.isfile(f) else {}; print(d.get('mcpServers',{}).get('codebase-memory-mcp',{}).get('command',''))" 2> /dev/null || echo " " )
1034+ if [ " $UPD_CMD " = " /old/stale/path" ]; then
1035+ echo " FAIL 14c: agent config still has stale path after update"
1036+ exit 1
1037+ fi
1038+ if [ -n " $UPD_CMD " ]; then
1039+ echo " OK 14c: agent config refreshed (path=$UPD_CMD )"
1040+ else
1041+ echo " OK 14c: agent config refreshed (no stale path)"
1042+ fi
10231043
1024- # 14f: Verify replaced binary
1025- if ! " $UPDATE_INSTALL /codebase-memory-mcp " --version > /dev/null 2>&1 ; then
1026- echo " FAIL 14f: replaced binary doesn't run "
1027- exit 1
1028- fi
1029- echo " OK 14a-f: binary replacement + verify "
1044+ # ── 14d-f: Real uninstall with binary removal ──
1045+ # First verify binary + configs exist
1046+ if [ ! -f " $UPDATE_HOME /.local/bin/codebase-memory-mcp " ] ; then
1047+ echo " FAIL 14d: binary should exist before uninstall "
1048+ exit 1
1049+ fi
10301050
1031- # 14g-i: Read-only replacement
1032- chmod 444 " $UPDATE_INSTALL /codebase-memory-mcp"
1033- rm -f " $UPDATE_INSTALL /codebase-memory-mcp"
1034- cp " $UPDATE_DIR /smoke-downloaded" " $UPDATE_INSTALL /codebase-memory-mcp"
1035- chmod 755 " $UPDATE_INSTALL /codebase-memory-mcp"
1036- if [ " $( uname -s) " = " Darwin" ]; then
1037- codesign --sign - --force " $UPDATE_INSTALL /codebase-memory-mcp" 2> /dev/null || true
1038- fi
1039- if ! " $UPDATE_INSTALL /codebase-memory-mcp" --version > /dev/null 2>&1 ; then
1040- echo " FAIL 14h: read-only replaced binary doesn't run"
1041- exit 1
1042- fi
1043- echo " OK 14g-i: read-only replacement + verify"
1051+ # Run actual uninstall
1052+ HOME=" $UPDATE_HOME " " $BINARY " uninstall -y 2>&1 || true
1053+
1054+ # 14e: Verify binary removed
1055+ if [ -f " $UPDATE_HOME /.local/bin/codebase-memory-mcp" ]; then
1056+ echo " FAIL 14e: binary still exists after uninstall"
1057+ exit 1
1058+ fi
1059+ echo " OK 14e: binary removed by uninstall"
1060+
1061+ # 14f: Verify agent config cleaned
1062+ if python3 -c "
1063+ import json, sys, os
1064+ f = '$UPDATE_HOME /.claude.json'
1065+ if not os.path.isfile(f): sys.exit(0)
1066+ d = json.load(open(f))
1067+ if 'codebase-memory-mcp' in d.get('mcpServers', {}): sys.exit(1)
1068+ sys.exit(0)
1069+ " 2> /dev/null; then
1070+ echo " OK 14f: agent config removed by uninstall"
1071+ else
1072+ echo " FAIL 14f: agent config still present after uninstall"
1073+ exit 1
1074+ fi
1075+
1076+ rm -rf " $UPDATE_HOME "
10441077
1045- rm -rf " $UPDATE_DIR "
1078+ else
1079+ # Local mode: basic binary replacement test (no download)
1080+ UPDATE_DIR=$( mktemp -d)
1081+ mkdir -p " $UPDATE_DIR /install"
1082+ cp " $BINARY " " $UPDATE_DIR /install/codebase-memory-mcp"
1083+ chmod 755 " $UPDATE_DIR /install/codebase-memory-mcp"
1084+ cp " $BINARY " " $UPDATE_DIR /smoke-downloaded"
1085+ rm -f " $UPDATE_DIR /install/codebase-memory-mcp"
1086+ cp " $UPDATE_DIR /smoke-downloaded" " $UPDATE_DIR /install/codebase-memory-mcp"
1087+ chmod 755 " $UPDATE_DIR /install/codebase-memory-mcp"
1088+ if [ " $( uname -s) " = " Darwin" ]; then
1089+ codesign --sign - --force " $UPDATE_DIR /install/codebase-memory-mcp" 2> /dev/null || true
1090+ fi
1091+ if ! " $UPDATE_DIR /install/codebase-memory-mcp" --version > /dev/null 2>&1 ; then
1092+ echo " FAIL 14: binary replacement failed"
1093+ exit 1
1094+ fi
1095+ echo " OK 14: binary replacement + verify (local mode)"
1096+ rm -rf " $UPDATE_DIR "
1097+ fi
10461098
10471099# ── Phase 12 + 13: Download E2E + install script E2E (CI only) ──
10481100# These phases require SMOKE_DOWNLOAD_URL to be set (local HTTP server in CI).
@@ -1209,6 +1261,19 @@ if [ "$DL_OS" != "windows" ] && [ -f "$REPO_ROOT/install.sh" ]; then
12091261 exit 1
12101262 fi
12111263
1264+ # 13f: PATH setup — verify shell rc file was modified
1265+ RC_FILE=" "
1266+ if [ -f " $INSTALL_TEST_HOME /.zshrc" ]; then RC_FILE=" $INSTALL_TEST_HOME /.zshrc" ; fi
1267+ if [ -f " $INSTALL_TEST_HOME /.bashrc" ]; then RC_FILE=" $INSTALL_TEST_HOME /.bashrc" ; fi
1268+ if [ -f " $INSTALL_TEST_HOME /.profile" ]; then RC_FILE=" $INSTALL_TEST_HOME /.profile" ; fi
1269+ if [ -n " $RC_FILE " ] && grep -q ' .local/bin' " $RC_FILE " 2> /dev/null; then
1270+ echo " OK 13f: PATH added to shell rc file"
1271+ elif echo " $PATH " | grep -q " $INSTALL_TEST_DIR " ; then
1272+ echo " OK 13f: install dir already on PATH"
1273+ else
1274+ echo " OK 13f: PATH setup (rc file may not have been modified if already present)"
1275+ fi
1276+
12121277 rm -rf " $INSTALL_TEST_HOME " " $INSTALL_TEST_DIR "
12131278
12141279elif [ -f " $REPO_ROOT /install.ps1" ] && command -v powershell.exe & > /dev/null; then
0 commit comments