diff --git a/install.bat b/install.bat index 0fe6f0c..298a940 100644 --- a/install.bat +++ b/install.bat @@ -46,17 +46,23 @@ echo. echo codeagent-wrapper installed successfully at: echo %DEST% -rem Automatically ensure %USERPROFILE%\bin is in the USER (HKCU) PATH +rem Ensure %USERPROFILE%\bin is in PATH without duplicating entries rem 1) Read current user PATH from registry (REG_SZ or REG_EXPAND_SZ) set "USER_PATH_RAW=" -set "USER_PATH_TYPE=" for /f "tokens=1,2,*" %%A in ('reg query "HKCU\Environment" /v Path 2^>nul ^| findstr /I /R "^ *Path *REG_"') do ( - set "USER_PATH_TYPE=%%B" set "USER_PATH_RAW=%%C" ) rem Trim leading spaces from USER_PATH_RAW for /f "tokens=* delims= " %%D in ("!USER_PATH_RAW!") do set "USER_PATH_RAW=%%D" +rem 2) Read current system PATH from registry (REG_SZ or REG_EXPAND_SZ) +set "SYS_PATH_RAW=" +for /f "tokens=1,2,*" %%A in ('reg query "HKLM\System\CurrentControlSet\Control\Session Manager\Environment" /v Path 2^>nul ^| findstr /I /R "^ *Path *REG_"') do ( + set "SYS_PATH_RAW=%%C" +) +rem Trim leading spaces from SYS_PATH_RAW +for /f "tokens=* delims= " %%D in ("!SYS_PATH_RAW!") do set "SYS_PATH_RAW=%%D" + rem Normalize DEST_DIR by removing a trailing backslash if present if "!DEST_DIR:~-1!"=="\" set "DEST_DIR=!DEST_DIR:~0,-1!" @@ -67,42 +73,63 @@ set "SEARCH_EXP2=;!DEST_DIR!\;" set "SEARCH_LIT=;!PCT!USERPROFILE!PCT!\bin;" set "SEARCH_LIT2=;!PCT!USERPROFILE!PCT!\bin\;" -rem Prepare user PATH variants for containment tests -set "CHECK_RAW=;!USER_PATH_RAW!;" -set "USER_PATH_EXP=!USER_PATH_RAW!" -if defined USER_PATH_EXP call set "USER_PATH_EXP=%%USER_PATH_EXP%%" -set "CHECK_EXP=;!USER_PATH_EXP!;" +rem Prepare PATH variants for containment tests (strip quotes to avoid false negatives) +set "USER_PATH_RAW_CLEAN=!USER_PATH_RAW:"=!" +set "SYS_PATH_RAW_CLEAN=!SYS_PATH_RAW:"=!" -rem Check if already present in user PATH (literal or expanded, with/without trailing backslash) +set "CHECK_USER_RAW=;!USER_PATH_RAW_CLEAN!;" +set "USER_PATH_EXP=!USER_PATH_RAW_CLEAN!" +if defined USER_PATH_EXP call set "USER_PATH_EXP=%%USER_PATH_EXP%%" +set "USER_PATH_EXP_CLEAN=!USER_PATH_EXP:"=!" +set "CHECK_USER_EXP=;!USER_PATH_EXP_CLEAN!;" + +set "CHECK_SYS_RAW=;!SYS_PATH_RAW_CLEAN!;" +set "SYS_PATH_EXP=!SYS_PATH_RAW_CLEAN!" +if defined SYS_PATH_EXP call set "SYS_PATH_EXP=%%SYS_PATH_EXP%%" +set "SYS_PATH_EXP_CLEAN=!SYS_PATH_EXP:"=!" +set "CHECK_SYS_EXP=;!SYS_PATH_EXP_CLEAN!;" + +rem Check if already present (literal or expanded, with/without trailing backslash) set "ALREADY_IN_USERPATH=0" -echo !CHECK_RAW! | findstr /I /C:"!SEARCH_LIT!" /C:"!SEARCH_LIT2!" >nul && set "ALREADY_IN_USERPATH=1" +echo(!CHECK_USER_RAW! | findstr /I /C:"!SEARCH_LIT!" /C:"!SEARCH_LIT2!" >nul && set "ALREADY_IN_USERPATH=1" if "!ALREADY_IN_USERPATH!"=="0" ( - echo !CHECK_EXP! | findstr /I /C:"!SEARCH_EXP!" /C:"!SEARCH_EXP2!" >nul && set "ALREADY_IN_USERPATH=1" + echo(!CHECK_USER_EXP! | findstr /I /C:"!SEARCH_EXP!" /C:"!SEARCH_EXP2!" >nul && set "ALREADY_IN_USERPATH=1" +) + +set "ALREADY_IN_SYSPATH=0" +echo(!CHECK_SYS_RAW! | findstr /I /C:"!SEARCH_LIT!" /C:"!SEARCH_LIT2!" >nul && set "ALREADY_IN_SYSPATH=1" +if "!ALREADY_IN_SYSPATH!"=="0" ( + echo(!CHECK_SYS_EXP! | findstr /I /C:"!SEARCH_EXP!" /C:"!SEARCH_EXP2!" >nul && set "ALREADY_IN_SYSPATH=1" ) if "!ALREADY_IN_USERPATH!"=="1" ( echo User PATH already includes %%USERPROFILE%%\bin. ) else ( - rem Not present: append to user PATH using setx without duplicating system PATH - if defined USER_PATH_RAW ( - set "USER_PATH_NEW=!USER_PATH_RAW!" - if not "!USER_PATH_NEW:~-1!"==";" set "USER_PATH_NEW=!USER_PATH_NEW!;" - set "USER_PATH_NEW=!USER_PATH_NEW!!PCT!USERPROFILE!PCT!\bin" + if "!ALREADY_IN_SYSPATH!"=="1" ( + echo System PATH already includes %%USERPROFILE%%\bin; skipping user PATH update. ) else ( - set "USER_PATH_NEW=!PCT!USERPROFILE!PCT!\bin" - ) - rem Persist update to HKCU\Environment\Path (user scope) - setx PATH "!USER_PATH_NEW!" >nul - if errorlevel 1 ( - echo WARNING: Failed to append %%USERPROFILE%%\bin to your user PATH. - ) else ( - echo Added %%USERPROFILE%%\bin to your user PATH. + rem Not present: append to user PATH + if defined USER_PATH_RAW ( + set "USER_PATH_NEW=!USER_PATH_RAW!" + if not "!USER_PATH_NEW:~-1!"==";" set "USER_PATH_NEW=!USER_PATH_NEW!;" + set "USER_PATH_NEW=!USER_PATH_NEW!!PCT!USERPROFILE!PCT!\bin" + ) else ( + set "USER_PATH_NEW=!PCT!USERPROFILE!PCT!\bin" + ) + rem Persist update to HKCU\Environment\Path (user scope) + setx Path "!USER_PATH_NEW!" >nul + if errorlevel 1 ( + echo WARNING: Failed to append %%USERPROFILE%%\bin to your user PATH. + ) else ( + echo Added %%USERPROFILE%%\bin to your user PATH. + ) ) ) -rem Update current session PATH so codex-wrapper is immediately available +rem Update current session PATH so codeagent-wrapper is immediately available set "CURPATH=;%PATH%;" -echo !CURPATH! | findstr /I /C:"!SEARCH_EXP!" /C:"!SEARCH_EXP2!" /C:"!SEARCH_LIT!" /C:"!SEARCH_LIT2!" >nul +set "CURPATH_CLEAN=!CURPATH:"=!" +echo(!CURPATH_CLEAN! | findstr /I /C:"!SEARCH_EXP!" /C:"!SEARCH_EXP2!" /C:"!SEARCH_LIT!" /C:"!SEARCH_LIT2!" >nul if errorlevel 1 set "PATH=!DEST_DIR!;!PATH!" goto :cleanup diff --git a/install.sh b/install.sh index 0e426a4..d9e2eec 100644 --- a/install.sh +++ b/install.sh @@ -48,11 +48,28 @@ else exit 1 fi -if [[ ":$PATH:" != *":${BIN_DIR}:"* ]]; then +# Auto-add to shell config files with idempotency +if [[ ":${PATH}:" != *":${BIN_DIR}:"* ]]; then echo "" echo "WARNING: ${BIN_DIR} is not in your PATH" - echo "Add this line to your ~/.bashrc or ~/.zshrc (then restart your shell):" - echo "" - echo " export PATH=\"${BIN_DIR}:\$PATH\"" + + # Detect shell config file + if [ -n "$ZSH_VERSION" ]; then + RC_FILE="$HOME/.zshrc" + else + RC_FILE="$HOME/.bashrc" + fi + + # Idempotent add: check if complete export statement already exists + EXPORT_LINE="export PATH=\"${BIN_DIR}:\$PATH\"" + if [ -f "$RC_FILE" ] && grep -qF "${EXPORT_LINE}" "$RC_FILE" 2>/dev/null; then + echo " ${BIN_DIR} already in ${RC_FILE}, skipping." + else + echo " Adding to ${RC_FILE}..." + echo "" >> "$RC_FILE" + echo "# Added by myclaude installer" >> "$RC_FILE" + echo "export PATH=\"${BIN_DIR}:\$PATH\"" >> "$RC_FILE" + echo " Done. Run 'source ${RC_FILE}' or restart shell." + fi echo "" fi