@@ -459,7 +459,7 @@ def _register_all_interpreters(self, venv_path: Path):
459459 safe_print (_ (' -> Scanning directory: {}' ).format (interp_dir .name ))
460460 found_exe_path = None
461461 search_locations = [interp_dir / 'bin' , interp_dir / 'Scripts' , interp_dir ]
462- possible_exe_names = ['python3.12' , 'python3.11' , 'python3.10' , 'python3.9' , 'python3' , 'python' , 'python.exe' ]
462+ possible_exe_names = ['python3.14' , 'python3.13' , 'python3. 12' , 'python3.11' , 'python3.10' , 'python3.8 ' , 'python3.9' , 'python3' , 'python' , 'python.exe' ]
463463 for location in search_locations :
464464 if location .is_dir ():
465465 for exe_name in possible_exe_names :
@@ -553,6 +553,27 @@ def run_verbose(cmd: List[str], error_msg: str):
553553 safe_print (' ----------------' )
554554 raise
555555 try :
556+ safe_print (' - Attempting bootstrap with built-in ensurepip (most reliable)...' )
557+ ensurepip_cmd = [str (python_exe ), '-m' , 'ensurepip' , '--upgrade' ]
558+ run_verbose (ensurepip_cmd , "ensurepip bootstrap failed." )
559+ safe_print (' ✅ Pip bootstrap complete via ensurepip.' )
560+ core_deps = _get_core_dependencies ()
561+ if core_deps :
562+ safe_print (_ (' - Installing omnipkg core dependencies...' ))
563+ deps_install_cmd = [str (python_exe ), '-m' , 'pip' , 'install' , '--no-cache-dir' ] + sorted (list (core_deps ))
564+ run_verbose (deps_install_cmd , 'Failed to install omnipkg dependencies.' )
565+ safe_print (_ (' ✅ Core dependencies installed.' ))
566+ safe_print (_ (' - Installing omnipkg application layer...' ))
567+ project_root = self ._find_project_root ()
568+ if project_root :
569+ safe_print (_ (' (Developer mode detected: performing editable install)' ))
570+ install_cmd = [str (python_exe ), '-m' , 'pip' , 'install' , '--no-cache-dir' , '--no-deps' , '-e' , str (project_root )]
571+ else :
572+ safe_print (' (Standard mode detected: installing from PyPI)' )
573+ install_cmd = [str (python_exe ), '-m' , 'pip' , 'install' , '--no-cache-dir' , '--no-deps' , 'omnipkg' ]
574+ run_verbose (install_cmd , 'Failed to install omnipkg application.' )
575+ safe_print (_ (' ✅ Omnipkg bootstrapped successfully!' ))
576+ except Exception as e :
556577 safe_print (_ (' - Bootstrapping pip, setuptools, wheel...' ))
557578 with tempfile .NamedTemporaryFile (suffix = '.py' , delete = False , mode = 'w' , encoding = 'utf-8' ) as tmp_file :
558579 script_path = tmp_file .name
@@ -790,7 +811,8 @@ def _install_managed_python(self, venv_path: Path, full_version: str) -> Path:
790811 py_arch = py_arch_map .get (arch )
791812 if not py_arch :
792813 raise OSError (_ ('Unsupported architecture: {}' ).format (arch ))
793- VERSION_TO_RELEASE_TAG_MAP = {'3.13.7' : '20250818' , '3.13.6' : '20250807' , '3.13.1' : '20241211' , '3.13.0' : '20241016' , '3.12.11' : '20250818' , '3.12.8' : '20241211' , '3.12.7' : '20241008' , '3.12.6' : '20240814' , '3.12.5' : '20240726' , '3.12.4' : '20240726' , '3.12.3' : '20240415' , '3.11.13' : '20250603' , '3.11.12' : '20241211' , '3.11.10' : '20241008' , '3.11.9' : '20240726' , '3.11.6' : '20231002' , '3.10.18' : '20250818' , '3.10.15' : '20241008' , '3.10.14' : '20240726' , '3.10.13' : '20231002' , '3.9.23' : '20250818' , '3.9.21' : '20241211' , '3.9.20' : '20241008' , '3.9.19' : '20240726' , '3.9.18' : '20231002' }
814+ VERSION_TO_RELEASE_TAG_MAP = {'3.8.20' : '20241002' ,
815+ '3.14.0' : '20251014' ,'3.13.7' : '20250818' , '3.13.6' : '20250807' , '3.13.1' : '20241211' , '3.13.0' : '20241016' , '3.12.11' : '20250818' , '3.12.8' : '20241211' , '3.12.7' : '20241008' , '3.12.6' : '20240814' , '3.12.5' : '20240726' , '3.12.4' : '20240726' , '3.12.3' : '20240415' , '3.11.13' : '20250603' , '3.11.12' : '20241211' , '3.11.10' : '20241008' , '3.11.9' : '20240726' , '3.11.6' : '20231002' , '3.10.18' : '20250818' , '3.10.15' : '20241008' , '3.10.14' : '20240726' , '3.10.13' : '20231002' , '3.9.23' : '20250818' , '3.9.21' : '20241211' , '3.9.20' : '20241008' , '3.9.19' : '20240726' , '3.9.18' : '20231002' }
794816 release_tag = VERSION_TO_RELEASE_TAG_MAP .get (full_version )
795817 if not release_tag :
796818 available_versions = list (VERSION_TO_RELEASE_TAG_MAP .keys ())
@@ -2994,7 +3016,7 @@ def redis_key_prefix(self) -> str:
29943016 py_ver_str = f'py{ match .group (1 )} '
29953017 else :
29963018 try :
2997- result = subprocess .run ([python_exe_path , '-c' , "import sys; safe_print (f'py{sys.version_info.major}.{sys.version_info.minor}')" ], capture_output = True , text = True , check = True , timeout = 2 )
3019+ result = subprocess .run ([python_exe_path , '-c' , "import sys; print (f'py{sys.version_info.major}.{sys.version_info.minor}')" ], capture_output = True , text = True , check = True , timeout = 2 )
29983020 py_ver_str = result .stdout .strip ()
29993021 except Exception :
30003022 py_ver_str = f'py{ sys .version_info .major } .{ sys .version_info .minor } '
@@ -4635,7 +4657,7 @@ def _is_interpreter_directory_valid(self, path: Path) -> bool:
46354657 return False
46364658 bin_dir = path / 'bin'
46374659 if bin_dir .is_dir ():
4638- for name in ['python ' , 'python3' , 'python3.9 ' , 'python3.10' , 'python3.11 ' , 'python3.12 ' ]:
4660+ for name in ['python3.14 ' , 'python3.13 ' , 'python3.12 ' , 'python3.11' , 'python3. 10' , 'python3.9 ' , 'python3.8' , 'python3' , 'python' , 'python.exe ' ]:
46394661 exe_path = bin_dir / name
46404662 if exe_path .is_file () and os .access (exe_path , os .X_OK ):
46414663 try :
@@ -4673,7 +4695,7 @@ def _fallback_to_download(self, version: str) -> int:
46734695 """
46744696 safe_print (_ ('\n --- Running robust download strategy ---' ))
46754697 try :
4676- full_versions = {'3.13' : '3.13.7' , '3.12' : '3.12.11' , '3.11' : '3.11.9' , '3.10' : '3.10.18' , '3.9' : '3.9.23' }
4698+ full_versions = {'3.14' : '3.14.0' , '3. 13' : '3.13.7' , '3.12' : '3.12.11' , '3.11' : '3.11.9' , '3.10' : '3.10.18' , '3.9' : '3.9.23' , '3.8' : '3.8.20 ' }
46774699 full_version = full_versions .get (version )
46784700 if not full_version :
46794701 safe_print (f'❌ Error: No known standalone build for Python { version } .' )
@@ -5652,7 +5674,6 @@ def _heal_conda_environment(self, also_run_clean: bool = True):
56525674 if not conda_meta_path .is_dir ():
56535675 return # No metadata directory
56545676
5655- safe_print ('\n ' + '─' * 60 )
56565677 safe_print ("🛡️ AUTO-HEAL: Scanning conda environment for corruption..." )
56575678
56585679 # Proactive scan for corrupted files
@@ -5687,7 +5708,6 @@ def _heal_conda_environment(self, also_run_clean: bool = True):
56875708
56885709 if not corrupted_files_found :
56895710 safe_print (" - ✅ No corruption detected in conda metadata" )
5690- safe_print ('─' * 60 )
56915711 return
56925712
56935713 # Healing process
0 commit comments