dayhoff-tools 1.11.2__py3-none-any.whl → 1.11.4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- dayhoff_tools/cli/utility_commands.py +160 -119
 - {dayhoff_tools-1.11.2.dist-info → dayhoff_tools-1.11.4.dist-info}/METADATA +1 -1
 - {dayhoff_tools-1.11.2.dist-info → dayhoff_tools-1.11.4.dist-info}/RECORD +5 -5
 - {dayhoff_tools-1.11.2.dist-info → dayhoff_tools-1.11.4.dist-info}/WHEEL +0 -0
 - {dayhoff_tools-1.11.2.dist-info → dayhoff_tools-1.11.4.dist-info}/entry_points.txt +0 -0
 
| 
         @@ -219,6 +219,7 @@ def build_and_upload_wheel(bump_part: str = "patch"): 
     | 
|
| 
       219 
219 
     | 
    
         
             
                    # Build wheel and sdist
         
     | 
| 
       220 
220 
     | 
    
         
             
                    # UV expects pyproject.toml, so temporarily copy the platform manifest
         
     | 
| 
       221 
221 
     | 
    
         
             
                    backup_created = False
         
     | 
| 
      
 222 
     | 
    
         
            +
                    temp_pyproject_created = False
         
     | 
| 
       222 
223 
     | 
    
         
             
                    if pyproject_path != "pyproject.toml":
         
     | 
| 
       223 
224 
     | 
    
         
             
                        if Path("pyproject.toml").exists():
         
     | 
| 
       224 
225 
     | 
    
         
             
                            Path("pyproject.toml").rename("pyproject.toml.build.bak")
         
     | 
| 
         @@ -226,48 +227,53 @@ def build_and_upload_wheel(bump_part: str = "patch"): 
     | 
|
| 
       226 
227 
     | 
    
         
             
                        Path(pyproject_path).read_text()
         
     | 
| 
       227 
228 
     | 
    
         
             
                        with open("pyproject.toml", "w") as f:
         
     | 
| 
       228 
229 
     | 
    
         
             
                            f.write(Path(pyproject_path).read_text())
         
     | 
| 
      
 230 
     | 
    
         
            +
                        temp_pyproject_created = True
         
     | 
| 
       229 
231 
     | 
    
         | 
| 
       230 
     | 
    
         
            -
                     
     | 
| 
       231 
     | 
    
         
            -
             
     | 
| 
       232 
     | 
    
         
            -
             
     | 
| 
       233 
     | 
    
         
            -
             
     | 
| 
       234 
     | 
    
         
            -
             
     | 
| 
       235 
     | 
    
         
            -
             
     | 
| 
       236 
     | 
    
         
            -
             
     | 
| 
       237 
     | 
    
         
            -
                         
     | 
| 
       238 
     | 
    
         
            -
                         
     | 
| 
       239 
     | 
    
         
            -
             
     | 
| 
       240 
     | 
    
         
            -
             
     | 
| 
       241 
     | 
    
         
            -
             
     | 
| 
       242 
     | 
    
         
            -
             
     | 
| 
       243 
     | 
    
         
            -
                    print(f"Running command: {BLUE}{' '.join(publish_cmd_safe_print)}{RESET}")
         
     | 
| 
       244 
     | 
    
         
            -
                    subprocess.run(
         
     | 
| 
       245 
     | 
    
         
            -
                        publish_cmd,  # Use the actual command with token
         
     | 
| 
       246 
     | 
    
         
            -
                        check=True,
         
     | 
| 
       247 
     | 
    
         
            -
                    )
         
     | 
| 
      
 232 
     | 
    
         
            +
                    try:
         
     | 
| 
      
 233 
     | 
    
         
            +
                        build_cmd = ["uv", "build"]
         
     | 
| 
      
 234 
     | 
    
         
            +
                        # Print command in blue
         
     | 
| 
      
 235 
     | 
    
         
            +
                        print(f"Running command: {BLUE}{' '.join(build_cmd)}{RESET}")
         
     | 
| 
      
 236 
     | 
    
         
            +
                        subprocess.run(build_cmd, check=True)
         
     | 
| 
      
 237 
     | 
    
         
            +
             
     | 
| 
      
 238 
     | 
    
         
            +
                        # Upload using uv publish with explicit arguments
         
     | 
| 
      
 239 
     | 
    
         
            +
                        # Print masked command in blue
         
     | 
| 
      
 240 
     | 
    
         
            +
                        print(f"Running command: {BLUE}{' '.join(publish_cmd_safe_print)}{RESET}")
         
     | 
| 
      
 241 
     | 
    
         
            +
                        subprocess.run(
         
     | 
| 
      
 242 
     | 
    
         
            +
                            publish_cmd,  # Use the actual command with token
         
     | 
| 
      
 243 
     | 
    
         
            +
                            check=True,
         
     | 
| 
      
 244 
     | 
    
         
            +
                        )
         
     | 
| 
       248 
245 
     | 
    
         | 
| 
       249 
     | 
    
         
            -
             
     | 
| 
      
 246 
     | 
    
         
            +
                        print(f"Successfully built and uploaded version {new_version} to PyPI")
         
     | 
| 
       250 
247 
     | 
    
         | 
| 
       251 
     | 
    
         
            -
             
     | 
| 
       252 
     | 
    
         
            -
             
     | 
| 
       253 
     | 
    
         
            -
                        proj_name = None
         
     | 
| 
      
 248 
     | 
    
         
            +
                        # Re-install DHT in current venv when building from DHT itself
         
     | 
| 
      
 249 
     | 
    
         
            +
                        # (Keep temp pyproject.toml until after this step)
         
     | 
| 
       254 
250 
     | 
    
         
             
                        try:
         
     | 
| 
       255 
     | 
    
         
            -
                             
     | 
| 
       256 
     | 
    
         
            -
                             
     | 
| 
       257 
     | 
    
         
            -
                                proj_toml 
     | 
| 
       258 
     | 
    
         
            -
                                 
     | 
| 
       259 
     | 
    
         
            -
             
     | 
| 
       260 
     | 
    
         
            -
             
     | 
| 
       261 
     | 
    
         
            -
             
     | 
| 
       262 
     | 
    
         
            -
             
     | 
| 
       263 
     | 
    
         
            -
             
     | 
| 
       264 
     | 
    
         
            -
             
     | 
| 
       265 
     | 
    
         
            -
                             
     | 
| 
       266 
     | 
    
         
            -
             
     | 
| 
       267 
     | 
    
         
            -
             
     | 
| 
       268 
     | 
    
         
            -
             
     | 
| 
       269 
     | 
    
         
            -
             
     | 
| 
       270 
     | 
    
         
            -
             
     | 
| 
      
 251 
     | 
    
         
            +
                            proj_name = None
         
     | 
| 
      
 252 
     | 
    
         
            +
                            try:
         
     | 
| 
      
 253 
     | 
    
         
            +
                                proj_toml = toml.load(pyproject_path)
         
     | 
| 
      
 254 
     | 
    
         
            +
                                proj_name = (
         
     | 
| 
      
 255 
     | 
    
         
            +
                                    proj_toml.get("project", {}).get("name")
         
     | 
| 
      
 256 
     | 
    
         
            +
                                    if isinstance(proj_toml, dict)
         
     | 
| 
      
 257 
     | 
    
         
            +
                                    else None
         
     | 
| 
      
 258 
     | 
    
         
            +
                                )
         
     | 
| 
      
 259 
     | 
    
         
            +
                            except Exception:
         
     | 
| 
      
 260 
     | 
    
         
            +
                                pass
         
     | 
| 
      
 261 
     | 
    
         
            +
                            if proj_name == "dayhoff-tools":
         
     | 
| 
      
 262 
     | 
    
         
            +
                                print("Re-installing dayhoff-tools into the active environment…")
         
     | 
| 
      
 263 
     | 
    
         
            +
                                reinstall_cmd = ["uv", "pip", "install", "-e", ".[full]"]
         
     | 
| 
      
 264 
     | 
    
         
            +
                                print(f"Running command: {BLUE}{' '.join(reinstall_cmd)}{RESET}")
         
     | 
| 
      
 265 
     | 
    
         
            +
                                subprocess.run(reinstall_cmd, check=True)
         
     | 
| 
      
 266 
     | 
    
         
            +
                                print("dayhoff-tools reinstalled in the current environment.")
         
     | 
| 
      
 267 
     | 
    
         
            +
                        except subprocess.CalledProcessError as e:
         
     | 
| 
      
 268 
     | 
    
         
            +
                            print(f"Warning: Failed to reinstall dayhoff-tools locally: {e}")
         
     | 
| 
      
 269 
     | 
    
         
            +
             
     | 
| 
      
 270 
     | 
    
         
            +
                    finally:
         
     | 
| 
      
 271 
     | 
    
         
            +
                        # Restore original state (always clean up, even if errors occurred)
         
     | 
| 
      
 272 
     | 
    
         
            +
                        if temp_pyproject_created:
         
     | 
| 
      
 273 
     | 
    
         
            +
                            if Path("pyproject.toml").exists():
         
     | 
| 
      
 274 
     | 
    
         
            +
                                Path("pyproject.toml").unlink()
         
     | 
| 
      
 275 
     | 
    
         
            +
                            if backup_created and Path("pyproject.toml.build.bak").exists():
         
     | 
| 
      
 276 
     | 
    
         
            +
                                Path("pyproject.toml.build.bak").rename("pyproject.toml")
         
     | 
| 
       271 
277 
     | 
    
         | 
| 
       272 
278 
     | 
    
         
             
                except FileNotFoundError:
         
     | 
| 
       273 
279 
     | 
    
         
             
                    print(f"Error: {pyproject_path} not found.")
         
     | 
| 
         @@ -423,58 +429,79 @@ def sync_with_toml( 
     | 
|
| 
       423 
429 
     | 
    
         
             
                        with open("pyproject.workstation.toml", "r") as f:
         
     | 
| 
       424 
430 
     | 
    
         
             
                            content = f.read()
         
     | 
| 
       425 
431 
     | 
    
         | 
| 
       426 
     | 
    
         
            -
                        # Extract dependencies list
         
     | 
| 
       427 
     | 
    
         
            -
                         
     | 
| 
       428 
     | 
    
         
            -
                         
     | 
| 
       429 
     | 
    
         
            -
             
     | 
| 
       430 
     | 
    
         
            -
                            deps = []
         
     | 
| 
       431 
     | 
    
         
            -
                            for line in deps_text.split("\n"):
         
     | 
| 
       432 
     | 
    
         
            -
                                line = line.strip()
         
     | 
| 
       433 
     | 
    
         
            -
                                if line.startswith('"') or line.startswith("'"):
         
     | 
| 
       434 
     | 
    
         
            -
                                    dep = re.sub(r'["\']', "", line)
         
     | 
| 
       435 
     | 
    
         
            -
                                    dep = re.sub(r",?\s*#.*$", "", dep)
         
     | 
| 
       436 
     | 
    
         
            -
                                    dep = dep.strip().rstrip(",")
         
     | 
| 
       437 
     | 
    
         
            -
                                    if dep:
         
     | 
| 
       438 
     | 
    
         
            -
                                        deps.append(dep)
         
     | 
| 
       439 
     | 
    
         
            -
             
     | 
| 
       440 
     | 
    
         
            -
                            if deps:
         
     | 
| 
       441 
     | 
    
         
            -
                                pip_cmd = (
         
     | 
| 
       442 
     | 
    
         
            -
                                    [sys.executable, "-m", "pip", "install"]
         
     | 
| 
       443 
     | 
    
         
            -
                                    + deps
         
     | 
| 
       444 
     | 
    
         
            -
                                    + ["-c", "constraints.txt"]
         
     | 
| 
       445 
     | 
    
         
            -
                                )
         
     | 
| 
       446 
     | 
    
         
            -
                                print(
         
     | 
| 
       447 
     | 
    
         
            -
                                    f"Running command: {BLUE}{' '.join(pip_cmd[:5])} ... -c constraints.txt{RESET}"
         
     | 
| 
       448 
     | 
    
         
            -
                                )
         
     | 
| 
       449 
     | 
    
         
            -
                                subprocess.run(pip_cmd, check=True)
         
     | 
| 
      
 432 
     | 
    
         
            +
                        # Extract dependencies list using line-by-line parsing to handle [] in package names
         
     | 
| 
      
 433 
     | 
    
         
            +
                        lines = content.split("\n")
         
     | 
| 
      
 434 
     | 
    
         
            +
                        in_deps = False
         
     | 
| 
      
 435 
     | 
    
         
            +
                        deps_lines = []
         
     | 
| 
       450 
436 
     | 
    
         | 
| 
       451 
     | 
    
         
            -
                         
     | 
| 
       452 
     | 
    
         
            -
             
     | 
| 
       453 
     | 
    
         
            -
             
     | 
| 
       454 
     | 
    
         
            -
             
     | 
| 
       455 
     | 
    
         
            -
             
     | 
| 
       456 
     | 
    
         
            -
             
     | 
| 
       457 
     | 
    
         
            -
             
     | 
| 
       458 
     | 
    
         
            -
             
     | 
| 
       459 
     | 
    
         
            -
             
     | 
| 
       460 
     | 
    
         
            -
             
     | 
| 
       461 
     | 
    
         
            -
             
     | 
| 
       462 
     | 
    
         
            -
             
     | 
| 
       463 
     | 
    
         
            -
             
     | 
| 
       464 
     | 
    
         
            -
             
     | 
| 
       465 
     | 
    
         
            -
             
     | 
| 
       466 
     | 
    
         
            -
             
     | 
| 
       467 
     | 
    
         
            -
             
     | 
| 
       468 
     | 
    
         
            -
             
     | 
| 
       469 
     | 
    
         
            -
             
     | 
| 
       470 
     | 
    
         
            -
             
     | 
| 
       471 
     | 
    
         
            -
             
     | 
| 
       472 
     | 
    
         
            -
             
     | 
| 
       473 
     | 
    
         
            -
                                 
     | 
| 
       474 
     | 
    
         
            -
                                 
     | 
| 
       475 
     | 
    
         
            -
             
     | 
| 
       476 
     | 
    
         
            -
             
     | 
| 
       477 
     | 
    
         
            -
                                 
     | 
| 
      
 437 
     | 
    
         
            +
                        for line in lines:
         
     | 
| 
      
 438 
     | 
    
         
            +
                            if re.match(r"\s*dependencies\s*=\s*\[", line):
         
     | 
| 
      
 439 
     | 
    
         
            +
                                in_deps = True
         
     | 
| 
      
 440 
     | 
    
         
            +
                                continue
         
     | 
| 
      
 441 
     | 
    
         
            +
                            if in_deps:
         
     | 
| 
      
 442 
     | 
    
         
            +
                                if re.match(r"^\s*\]\s*$", line):
         
     | 
| 
      
 443 
     | 
    
         
            +
                                    break
         
     | 
| 
      
 444 
     | 
    
         
            +
                                deps_lines.append(line)
         
     | 
| 
      
 445 
     | 
    
         
            +
             
     | 
| 
      
 446 
     | 
    
         
            +
                        deps = []
         
     | 
| 
      
 447 
     | 
    
         
            +
                        for line in deps_lines:
         
     | 
| 
      
 448 
     | 
    
         
            +
                            line = line.strip()
         
     | 
| 
      
 449 
     | 
    
         
            +
                            if line.startswith('"') or line.startswith("'"):
         
     | 
| 
      
 450 
     | 
    
         
            +
                                dep = re.sub(r'["\']', "", line)
         
     | 
| 
      
 451 
     | 
    
         
            +
                                dep = re.sub(r",?\s*#.*$", "", dep)
         
     | 
| 
      
 452 
     | 
    
         
            +
                                dep = dep.strip().rstrip(",")
         
     | 
| 
      
 453 
     | 
    
         
            +
                                if dep:
         
     | 
| 
      
 454 
     | 
    
         
            +
                                    deps.append(dep)
         
     | 
| 
      
 455 
     | 
    
         
            +
             
     | 
| 
      
 456 
     | 
    
         
            +
                        if deps:
         
     | 
| 
      
 457 
     | 
    
         
            +
                            pip_cmd = (
         
     | 
| 
      
 458 
     | 
    
         
            +
                                [sys.executable, "-m", "pip", "install"]
         
     | 
| 
      
 459 
     | 
    
         
            +
                                + deps
         
     | 
| 
      
 460 
     | 
    
         
            +
                                + ["-c", "constraints.txt"]
         
     | 
| 
      
 461 
     | 
    
         
            +
                            )
         
     | 
| 
      
 462 
     | 
    
         
            +
                            print(
         
     | 
| 
      
 463 
     | 
    
         
            +
                                f"Running command: {BLUE}{' '.join(pip_cmd[:5])} ... -c constraints.txt{RESET}"
         
     | 
| 
      
 464 
     | 
    
         
            +
                            )
         
     | 
| 
      
 465 
     | 
    
         
            +
                            subprocess.run(pip_cmd, check=True)
         
     | 
| 
      
 466 
     | 
    
         
            +
             
     | 
| 
      
 467 
     | 
    
         
            +
                        # Install dev dependencies using line-by-line parsing
         
     | 
| 
      
 468 
     | 
    
         
            +
                        in_dev_groups = False
         
     | 
| 
      
 469 
     | 
    
         
            +
                        in_dev_list = False
         
     | 
| 
      
 470 
     | 
    
         
            +
                        dev_lines = []
         
     | 
| 
      
 471 
     | 
    
         
            +
             
     | 
| 
      
 472 
     | 
    
         
            +
                        for line in lines:
         
     | 
| 
      
 473 
     | 
    
         
            +
                            if re.match(r"\s*\[dependency-groups\]", line):
         
     | 
| 
      
 474 
     | 
    
         
            +
                                in_dev_groups = True
         
     | 
| 
      
 475 
     | 
    
         
            +
                                continue
         
     | 
| 
      
 476 
     | 
    
         
            +
                            if in_dev_groups and re.match(r"\s*dev\s*=\s*\[", line):
         
     | 
| 
      
 477 
     | 
    
         
            +
                                in_dev_list = True
         
     | 
| 
      
 478 
     | 
    
         
            +
                                continue
         
     | 
| 
      
 479 
     | 
    
         
            +
                            if in_dev_list:
         
     | 
| 
      
 480 
     | 
    
         
            +
                                if re.match(r"^\s*\]\s*$", line):
         
     | 
| 
      
 481 
     | 
    
         
            +
                                    break
         
     | 
| 
      
 482 
     | 
    
         
            +
                                dev_lines.append(line)
         
     | 
| 
      
 483 
     | 
    
         
            +
             
     | 
| 
      
 484 
     | 
    
         
            +
                        dev_deps = []
         
     | 
| 
      
 485 
     | 
    
         
            +
                        for line in dev_lines:
         
     | 
| 
      
 486 
     | 
    
         
            +
                            line = line.strip()
         
     | 
| 
      
 487 
     | 
    
         
            +
                            if line.startswith('"') or line.startswith("'"):
         
     | 
| 
      
 488 
     | 
    
         
            +
                                dep = re.sub(r'["\']', "", line)
         
     | 
| 
      
 489 
     | 
    
         
            +
                                dep = re.sub(r",?\s*#.*$", "", dep)
         
     | 
| 
      
 490 
     | 
    
         
            +
                                dep = dep.strip().rstrip(",")
         
     | 
| 
      
 491 
     | 
    
         
            +
                                if dep:
         
     | 
| 
      
 492 
     | 
    
         
            +
                                    dev_deps.append(dep)
         
     | 
| 
      
 493 
     | 
    
         
            +
             
     | 
| 
      
 494 
     | 
    
         
            +
                        if dev_deps:
         
     | 
| 
      
 495 
     | 
    
         
            +
                            print("Installing dev dependencies...")
         
     | 
| 
      
 496 
     | 
    
         
            +
                            pip_cmd = (
         
     | 
| 
      
 497 
     | 
    
         
            +
                                [sys.executable, "-m", "pip", "install"]
         
     | 
| 
      
 498 
     | 
    
         
            +
                                + dev_deps
         
     | 
| 
      
 499 
     | 
    
         
            +
                                + ["-c", "constraints.txt"]
         
     | 
| 
      
 500 
     | 
    
         
            +
                            )
         
     | 
| 
      
 501 
     | 
    
         
            +
                            print(
         
     | 
| 
      
 502 
     | 
    
         
            +
                                f"Running command: {BLUE}{' '.join(pip_cmd[:5])} ... -c constraints.txt{RESET}"
         
     | 
| 
      
 503 
     | 
    
         
            +
                            )
         
     | 
| 
      
 504 
     | 
    
         
            +
                            subprocess.run(pip_cmd, check=True)
         
     | 
| 
       478 
505 
     | 
    
         | 
| 
       479 
506 
     | 
    
         
             
                        # Install project if requested
         
     | 
| 
       480 
507 
     | 
    
         
             
                        if install_project:
         
     | 
| 
         @@ -728,48 +755,62 @@ def add_dependency( 
     | 
|
| 
       728 
755 
     | 
    
         | 
| 
       729 
756 
     | 
    
         
             
                        if dev:
         
     | 
| 
       730 
757 
     | 
    
         
             
                            # Add to [dependency-groups] dev section
         
     | 
| 
       731 
     | 
    
         
            -
                            #  
     | 
| 
       732 
     | 
    
         
            -
                             
     | 
| 
       733 
     | 
    
         
            -
             
     | 
| 
       734 
     | 
    
         
            -
             
     | 
| 
       735 
     | 
    
         
            -
             
     | 
| 
       736 
     | 
    
         
            -
                             
     | 
| 
       737 
     | 
    
         
            -
             
     | 
| 
      
 758 
     | 
    
         
            +
                            # Use line-by-line parsing to handle [] in dependency names like dayhoff-tools[full]
         
     | 
| 
      
 759 
     | 
    
         
            +
                            lines = content.split("\n")
         
     | 
| 
      
 760 
     | 
    
         
            +
                            in_dev_groups = False
         
     | 
| 
      
 761 
     | 
    
         
            +
                            in_dev_list = False
         
     | 
| 
      
 762 
     | 
    
         
            +
                            dev_start_idx = None
         
     | 
| 
      
 763 
     | 
    
         
            +
                            dev_end_idx = None
         
     | 
| 
      
 764 
     | 
    
         
            +
             
     | 
| 
      
 765 
     | 
    
         
            +
                            for idx, line in enumerate(lines):
         
     | 
| 
      
 766 
     | 
    
         
            +
                                if re.match(r"\s*\[dependency-groups\]", line):
         
     | 
| 
      
 767 
     | 
    
         
            +
                                    in_dev_groups = True
         
     | 
| 
      
 768 
     | 
    
         
            +
                                    continue
         
     | 
| 
      
 769 
     | 
    
         
            +
                                if in_dev_groups and re.match(r"\s*dev\s*=\s*\[", line):
         
     | 
| 
      
 770 
     | 
    
         
            +
                                    in_dev_list = True
         
     | 
| 
      
 771 
     | 
    
         
            +
                                    dev_start_idx = idx
         
     | 
| 
      
 772 
     | 
    
         
            +
                                    continue
         
     | 
| 
      
 773 
     | 
    
         
            +
                                if in_dev_list and re.match(r"^\s*\]\s*$", line):
         
     | 
| 
      
 774 
     | 
    
         
            +
                                    dev_end_idx = idx
         
     | 
| 
      
 775 
     | 
    
         
            +
                                    break
         
     | 
| 
      
 776 
     | 
    
         
            +
             
     | 
| 
      
 777 
     | 
    
         
            +
                            if dev_start_idx is None or dev_end_idx is None:
         
     | 
| 
       738 
778 
     | 
    
         
             
                                print(
         
     | 
| 
       739 
779 
     | 
    
         
             
                                    f"Warning: Could not find [dependency-groups] dev section in {manifest_file}"
         
     | 
| 
       740 
780 
     | 
    
         
             
                                )
         
     | 
| 
       741 
781 
     | 
    
         
             
                                continue
         
     | 
| 
       742 
782 
     | 
    
         | 
| 
       743 
     | 
    
         
            -
                            # Insert new dependency  
     | 
| 
       744 
     | 
    
         
            -
                             
     | 
| 
       745 
     | 
    
         
            -
                             
     | 
| 
       746 
     | 
    
         
            -
                             
     | 
| 
       747 
     | 
    
         
            -
             
     | 
| 
       748 
     | 
    
         
            -
                            # Add with proper indentation
         
     | 
| 
       749 
     | 
    
         
            -
                            new_dep = f'    "{package}",\n'
         
     | 
| 
       750 
     | 
    
         
            -
                            new_content = content.replace(
         
     | 
| 
       751 
     | 
    
         
            -
                                dev_match.group(0), f"{before}{deps_block}{new_dep}{after}"
         
     | 
| 
       752 
     | 
    
         
            -
                            )
         
     | 
| 
      
 783 
     | 
    
         
            +
                            # Insert new dependency before the closing ]
         
     | 
| 
      
 784 
     | 
    
         
            +
                            new_dep = f'    "{package}",'
         
     | 
| 
      
 785 
     | 
    
         
            +
                            lines.insert(dev_end_idx, new_dep)
         
     | 
| 
      
 786 
     | 
    
         
            +
                            new_content = "\n".join(lines)
         
     | 
| 
       753 
787 
     | 
    
         
             
                        else:
         
     | 
| 
       754 
788 
     | 
    
         
             
                            # Add to [project] dependencies section
         
     | 
| 
       755 
     | 
    
         
            -
                             
     | 
| 
       756 
     | 
    
         
            -
             
     | 
| 
       757 
     | 
    
         
            -
                             
     | 
| 
       758 
     | 
    
         
            -
                             
     | 
| 
      
 789 
     | 
    
         
            +
                            # Use line-by-line parsing to handle [] in dependency names like dayhoff-tools[full]
         
     | 
| 
      
 790 
     | 
    
         
            +
                            lines = content.split("\n")
         
     | 
| 
      
 791 
     | 
    
         
            +
                            in_deps = False
         
     | 
| 
      
 792 
     | 
    
         
            +
                            deps_start_idx = None
         
     | 
| 
      
 793 
     | 
    
         
            +
                            deps_end_idx = None
         
     | 
| 
      
 794 
     | 
    
         
            +
             
     | 
| 
      
 795 
     | 
    
         
            +
                            for idx, line in enumerate(lines):
         
     | 
| 
      
 796 
     | 
    
         
            +
                                if re.match(r"\s*dependencies\s*=\s*\[", line):
         
     | 
| 
      
 797 
     | 
    
         
            +
                                    in_deps = True
         
     | 
| 
      
 798 
     | 
    
         
            +
                                    deps_start_idx = idx
         
     | 
| 
      
 799 
     | 
    
         
            +
                                    continue
         
     | 
| 
      
 800 
     | 
    
         
            +
                                if in_deps and re.match(r"^\s*\]\s*$", line):
         
     | 
| 
      
 801 
     | 
    
         
            +
                                    deps_end_idx = idx
         
     | 
| 
      
 802 
     | 
    
         
            +
                                    break
         
     | 
| 
      
 803 
     | 
    
         
            +
             
     | 
| 
      
 804 
     | 
    
         
            +
                            if deps_start_idx is None or deps_end_idx is None:
         
     | 
| 
       759 
805 
     | 
    
         
             
                                print(
         
     | 
| 
       760 
806 
     | 
    
         
             
                                    f"Warning: Could not find dependencies section in {manifest_file}"
         
     | 
| 
       761 
807 
     | 
    
         
             
                                )
         
     | 
| 
       762 
808 
     | 
    
         
             
                                continue
         
     | 
| 
       763 
809 
     | 
    
         | 
| 
       764 
     | 
    
         
            -
                            before  
     | 
| 
       765 
     | 
    
         
            -
                             
     | 
| 
       766 
     | 
    
         
            -
                             
     | 
| 
       767 
     | 
    
         
            -
             
     | 
| 
       768 
     | 
    
         
            -
                            # Add with proper indentation
         
     | 
| 
       769 
     | 
    
         
            -
                            new_dep = f'    "{package}",\n'
         
     | 
| 
       770 
     | 
    
         
            -
                            new_content = content.replace(
         
     | 
| 
       771 
     | 
    
         
            -
                                deps_match.group(0), f"{before}{deps_block}{new_dep}{after}"
         
     | 
| 
       772 
     | 
    
         
            -
                            )
         
     | 
| 
      
 810 
     | 
    
         
            +
                            # Insert new dependency before the closing ]
         
     | 
| 
      
 811 
     | 
    
         
            +
                            new_dep = f'    "{package}",'
         
     | 
| 
      
 812 
     | 
    
         
            +
                            lines.insert(deps_end_idx, new_dep)
         
     | 
| 
      
 813 
     | 
    
         
            +
                            new_content = "\n".join(lines)
         
     | 
| 
       773 
814 
     | 
    
         | 
| 
       774 
815 
     | 
    
         
             
                        manifest_file.write_text(new_content)
         
     | 
| 
       775 
816 
     | 
    
         
             
                        print(f"✅ Added '{package}' to {manifest_file}")
         
     | 
| 
         @@ -12,7 +12,7 @@ dayhoff_tools/cli/engine/shared.py,sha256=Ecx6I1jtzmxQDn3BezKpgpQ4SJeZf4SZjUCLg- 
     | 
|
| 
       12 
12 
     | 
    
         
             
            dayhoff_tools/cli/engine/studio_commands.py,sha256=VwTQujz32-uMcYusDRE73SdzRpgvIkv7ZAF4zRv6AzA,30266
         
     | 
| 
       13 
13 
     | 
    
         
             
            dayhoff_tools/cli/main.py,sha256=Ii5boey--93yGthB_eS2LC7ZR3WHGsJXDHY7uElEtso,6169
         
     | 
| 
       14 
14 
     | 
    
         
             
            dayhoff_tools/cli/swarm_commands.py,sha256=5EyKj8yietvT5lfoz8Zx0iQvVaNgc3SJX1z2zQR6o6M,5614
         
     | 
| 
       15 
     | 
    
         
            -
            dayhoff_tools/cli/utility_commands.py,sha256= 
     | 
| 
      
 15 
     | 
    
         
            +
            dayhoff_tools/cli/utility_commands.py,sha256=46WAySWDFUgwP_Vkr1L4g1xpZOu38r-9UHJhJpRPMnA,42640
         
     | 
| 
       16 
16 
     | 
    
         
             
            dayhoff_tools/deployment/base.py,sha256=48KE76QlWMeIZJefcBOZVbyChS2V_mgs7IQ31odPV2o,17806
         
     | 
| 
       17 
17 
     | 
    
         
             
            dayhoff_tools/deployment/deploy_aws.py,sha256=gfqh09hGbz0q3oPqVm0imd_CEjKF2k8moGNRIL26qqE,18614
         
     | 
| 
       18 
18 
     | 
    
         
             
            dayhoff_tools/deployment/deploy_gcp.py,sha256=xgaOVsUDmP6wSEMYNkm1yRNcVskfdz80qJtCulkBIAM,8860
         
     | 
| 
         @@ -33,7 +33,7 @@ dayhoff_tools/intake/uniprot.py,sha256=BZYJQF63OtPcBBnQ7_P9gulxzJtqyorgyuDiPeOJq 
     | 
|
| 
       33 
33 
     | 
    
         
             
            dayhoff_tools/logs.py,sha256=DKdeP0k0kliRcilwvX0mUB2eipO5BdWUeHwh-VnsICs,838
         
     | 
| 
       34 
34 
     | 
    
         
             
            dayhoff_tools/sqlite.py,sha256=jV55ikF8VpTfeQqqlHSbY8OgfyfHj8zgHNpZjBLos_E,18672
         
     | 
| 
       35 
35 
     | 
    
         
             
            dayhoff_tools/warehouse.py,sha256=UETBtZD3r7WgvURqfGbyHlT7cxoiVq8isjzMuerKw8I,24475
         
     | 
| 
       36 
     | 
    
         
            -
            dayhoff_tools-1.11. 
     | 
| 
       37 
     | 
    
         
            -
            dayhoff_tools-1.11. 
     | 
| 
       38 
     | 
    
         
            -
            dayhoff_tools-1.11. 
     | 
| 
       39 
     | 
    
         
            -
            dayhoff_tools-1.11. 
     | 
| 
      
 36 
     | 
    
         
            +
            dayhoff_tools-1.11.4.dist-info/METADATA,sha256=3aHs-3Zmst0iz9G1VmPuLPHgmBjkVoG7Y-PESX5AlzM,2980
         
     | 
| 
      
 37 
     | 
    
         
            +
            dayhoff_tools-1.11.4.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
         
     | 
| 
      
 38 
     | 
    
         
            +
            dayhoff_tools-1.11.4.dist-info/entry_points.txt,sha256=iAf4jteNqW3cJm6CO6czLxjW3vxYKsyGLZ8WGmxamSc,49
         
     | 
| 
      
 39 
     | 
    
         
            +
            dayhoff_tools-1.11.4.dist-info/RECORD,,
         
     | 
| 
         
            File without changes
         
     | 
| 
         
            File without changes
         
     |