devstuff 2.2.0__tar.gz → 2.2.1__tar.gz

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.
Files changed (165) hide show
  1. {devstuff-2.2.0 → devstuff-2.2.1}/CHANGELOG.md +6 -0
  2. {devstuff-2.2.0 → devstuff-2.2.1}/PKG-INFO +1 -1
  3. {devstuff-2.2.0 → devstuff-2.2.1}/pyproject.toml +1 -1
  4. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/generic.py +7 -1
  5. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/tools.yaml +13 -1
  6. {devstuff-2.2.0 → devstuff-2.2.1}/tests/test_generic.py +32 -0
  7. {devstuff-2.2.0 → devstuff-2.2.1}/uv.lock +1 -1
  8. {devstuff-2.2.0 → devstuff-2.2.1}/.claude/skills/run-stuff/SKILL.md +0 -0
  9. {devstuff-2.2.0 → devstuff-2.2.1}/.claude/skills/run-stuff/smoke.sh +0 -0
  10. {devstuff-2.2.0 → devstuff-2.2.1}/.github/workflows/bump.yml +0 -0
  11. {devstuff-2.2.0 → devstuff-2.2.1}/.github/workflows/ci.yml +0 -0
  12. {devstuff-2.2.0 → devstuff-2.2.1}/.github/workflows/publish.yml +0 -0
  13. {devstuff-2.2.0 → devstuff-2.2.1}/.github/workflows/test-installs.yml +0 -0
  14. {devstuff-2.2.0 → devstuff-2.2.1}/.gitignore +0 -0
  15. {devstuff-2.2.0 → devstuff-2.2.1}/CLAUDE.md +0 -0
  16. {devstuff-2.2.0 → devstuff-2.2.1}/README.md +0 -0
  17. {devstuff-2.2.0 → devstuff-2.2.1}/dev/Dockerfile +0 -0
  18. {devstuff-2.2.0 → devstuff-2.2.1}/dev/Dockerfile.ci +0 -0
  19. {devstuff-2.2.0 → devstuff-2.2.1}/dev/Makefile +0 -0
  20. {devstuff-2.2.0 → devstuff-2.2.1}/dev/docker-compose.yml +0 -0
  21. {devstuff-2.2.0 → devstuff-2.2.1}/devstuff +0 -0
  22. {devstuff-2.2.0 → devstuff-2.2.1}/docs/specs/README.md +0 -0
  23. {devstuff-2.2.0 → devstuff-2.2.1}/docs/specs/agent/development-plan.md +0 -0
  24. {devstuff-2.2.0 → devstuff-2.2.1}/docs/specs/agent/specifications.md +0 -0
  25. {devstuff-2.2.0 → devstuff-2.2.1}/docs/specs/agent/stack-decisions.md +0 -0
  26. {devstuff-2.2.0 → devstuff-2.2.1}/docs/specs/ansible-config/development-plan.md +0 -0
  27. {devstuff-2.2.0 → devstuff-2.2.1}/docs/specs/ansible-config/specifications.md +0 -0
  28. {devstuff-2.2.0 → devstuff-2.2.1}/docs/specs/ansible-config/stack-decisions.md +0 -0
  29. {devstuff-2.2.0 → devstuff-2.2.1}/docs/specs/bat-config/development-plan.md +0 -0
  30. {devstuff-2.2.0 → devstuff-2.2.1}/docs/specs/bat-config/specifications.md +0 -0
  31. {devstuff-2.2.0 → devstuff-2.2.1}/docs/specs/bat-config/stack-decisions.md +0 -0
  32. {devstuff-2.2.0 → devstuff-2.2.1}/docs/specs/commitizen-config/development-plan.md +0 -0
  33. {devstuff-2.2.0 → devstuff-2.2.1}/docs/specs/commitizen-config/specifications.md +0 -0
  34. {devstuff-2.2.0 → devstuff-2.2.1}/docs/specs/commitizen-config/stack-decisions.md +0 -0
  35. {devstuff-2.2.0 → devstuff-2.2.1}/docs/specs/docker-config/development-plan.md +0 -0
  36. {devstuff-2.2.0 → devstuff-2.2.1}/docs/specs/docker-config/specifications.md +0 -0
  37. {devstuff-2.2.0 → devstuff-2.2.1}/docs/specs/docker-config/stack-decisions.md +0 -0
  38. {devstuff-2.2.0 → devstuff-2.2.1}/docs/specs/lazygit-config/development-plan.md +0 -0
  39. {devstuff-2.2.0 → devstuff-2.2.1}/docs/specs/lazygit-config/specifications.md +0 -0
  40. {devstuff-2.2.0 → devstuff-2.2.1}/docs/specs/lazygit-config/stack-decisions.md +0 -0
  41. {devstuff-2.2.0 → devstuff-2.2.1}/docs/specs/precommit-config/development-plan.md +0 -0
  42. {devstuff-2.2.0 → devstuff-2.2.1}/docs/specs/precommit-config/specifications.md +0 -0
  43. {devstuff-2.2.0 → devstuff-2.2.1}/docs/specs/precommit-config/stack-decisions.md +0 -0
  44. {devstuff-2.2.0 → devstuff-2.2.1}/docs/specs/starship-config/development-plan.md +0 -0
  45. {devstuff-2.2.0 → devstuff-2.2.1}/docs/specs/starship-config/specifications.md +0 -0
  46. {devstuff-2.2.0 → devstuff-2.2.1}/docs/specs/starship-config/stack-decisions.md +0 -0
  47. {devstuff-2.2.0 → devstuff-2.2.1}/docs/specs/verbose-mode/development-plan.md +0 -0
  48. {devstuff-2.2.0 → devstuff-2.2.1}/docs/specs/verbose-mode/specifications.md +0 -0
  49. {devstuff-2.2.0 → devstuff-2.2.1}/docs/specs/verbose-mode/stack-decisions.md +0 -0
  50. {devstuff-2.2.0 → devstuff-2.2.1}/install.sh +0 -0
  51. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/__init__.py +0 -0
  52. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/__main__.py +0 -0
  53. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/agent/__init__.py +0 -0
  54. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/agent/approval.py +0 -0
  55. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/agent/bridges.py +0 -0
  56. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/agent/catalog.py +0 -0
  57. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/agent/completion.py +0 -0
  58. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/agent/config.py +0 -0
  59. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/agent/loop.py +0 -0
  60. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/agent/ollama.py +0 -0
  61. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/agent/preflight.py +0 -0
  62. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/agent/primitives.py +0 -0
  63. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/agent/registry.py +0 -0
  64. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/agent/sandbox.py +0 -0
  65. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/agent/session.py +0 -0
  66. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/agent/transcript.py +0 -0
  67. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/agent/wizard.py +0 -0
  68. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/agent_tools.schema.json +0 -0
  69. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/agent_tools.yaml +0 -0
  70. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/base.py +0 -0
  71. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/catalog.py +0 -0
  72. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/cli.py +0 -0
  73. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/commands/__init__.py +0 -0
  74. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/commands/add_cmd.py +0 -0
  75. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/commands/agent_cmd.py +0 -0
  76. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/commands/catalog_cmd.py +0 -0
  77. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/commands/configure_cmd.py +0 -0
  78. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/commands/delete_cmd.py +0 -0
  79. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/commands/docs_cmd.py +0 -0
  80. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/commands/doctor_cmd.py +0 -0
  81. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/commands/functions_cmd.py +0 -0
  82. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/commands/help_cmd.py +0 -0
  83. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/commands/install_cmd.py +0 -0
  84. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/commands/list_cmd.py +0 -0
  85. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/commands/remove_cmd.py +0 -0
  86. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/commands/run_cmd.py +0 -0
  87. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/commands/skills_cmd.py +0 -0
  88. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/commands/update_cmd.py +0 -0
  89. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/configure/__init__.py +0 -0
  90. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/configure/ansible/__init__.py +0 -0
  91. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/configure/ansible/detect.py +0 -0
  92. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/configure/ansible/model.py +0 -0
  93. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/configure/ansible/render.py +0 -0
  94. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/configure/ansible/validate.py +0 -0
  95. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/configure/ansible/wizard.py +0 -0
  96. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/configure/bat/__init__.py +0 -0
  97. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/configure/bat/detect.py +0 -0
  98. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/configure/bat/model.py +0 -0
  99. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/configure/bat/preview.py +0 -0
  100. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/configure/bat/render.py +0 -0
  101. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/configure/bat/wizard.py +0 -0
  102. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/configure/commitizen/__init__.py +0 -0
  103. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/configure/commitizen/detect.py +0 -0
  104. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/configure/commitizen/model.py +0 -0
  105. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/configure/commitizen/render.py +0 -0
  106. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/configure/commitizen/validate.py +0 -0
  107. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/configure/commitizen/wizard.py +0 -0
  108. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/configure/docker/__init__.py +0 -0
  109. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/configure/docker/detect.py +0 -0
  110. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/configure/docker/model.py +0 -0
  111. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/configure/docker/render.py +0 -0
  112. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/configure/docker/validate.py +0 -0
  113. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/configure/docker/wizard.py +0 -0
  114. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/configure/lazygit/__init__.py +0 -0
  115. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/configure/lazygit/detect.py +0 -0
  116. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/configure/lazygit/model.py +0 -0
  117. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/configure/lazygit/render.py +0 -0
  118. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/configure/lazygit/validate.py +0 -0
  119. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/configure/lazygit/wizard.py +0 -0
  120. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/configure/precommit/__init__.py +0 -0
  121. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/configure/precommit/detect.py +0 -0
  122. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/configure/precommit/model.py +0 -0
  123. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/configure/precommit/render.py +0 -0
  124. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/configure/precommit/validate.py +0 -0
  125. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/configure/precommit/wizard.py +0 -0
  126. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/configure/starship/__init__.py +0 -0
  127. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/configure/starship/fonts.py +0 -0
  128. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/configure/starship/model.py +0 -0
  129. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/configure/starship/preview.py +0 -0
  130. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/configure/starship/render.py +0 -0
  131. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/configure/starship/wizard.py +0 -0
  132. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/doctor.py +0 -0
  133. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/function_runner.py +0 -0
  134. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/functions.schema.json +0 -0
  135. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/functions.yaml +0 -0
  136. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/functions_catalog.py +0 -0
  137. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/functions_registry.py +0 -0
  138. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/registry.py +0 -0
  139. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/ui.py +0 -0
  140. {devstuff-2.2.0 → devstuff-2.2.1}/src/dev_setup/verbose.py +0 -0
  141. {devstuff-2.2.0 → devstuff-2.2.1}/tests/__init__.py +0 -0
  142. {devstuff-2.2.0 → devstuff-2.2.1}/tests/integration/__init__.py +0 -0
  143. {devstuff-2.2.0 → devstuff-2.2.1}/tests/integration/conftest.py +0 -0
  144. {devstuff-2.2.0 → devstuff-2.2.1}/tests/integration/test_agent_smoke.py +0 -0
  145. {devstuff-2.2.0 → devstuff-2.2.1}/tests/integration/test_agent_tui.py +0 -0
  146. {devstuff-2.2.0 → devstuff-2.2.1}/tests/integration/test_commitizen_config.py +0 -0
  147. {devstuff-2.2.0 → devstuff-2.2.1}/tests/integration/test_tools.py +0 -0
  148. {devstuff-2.2.0 → devstuff-2.2.1}/tests/test_agent.py +0 -0
  149. {devstuff-2.2.0 → devstuff-2.2.1}/tests/test_agent_completion.py +0 -0
  150. {devstuff-2.2.0 → devstuff-2.2.1}/tests/test_agent_loop.py +0 -0
  151. {devstuff-2.2.0 → devstuff-2.2.1}/tests/test_agent_sandbox.py +0 -0
  152. {devstuff-2.2.0 → devstuff-2.2.1}/tests/test_agent_tools.py +0 -0
  153. {devstuff-2.2.0 → devstuff-2.2.1}/tests/test_agent_wizard.py +0 -0
  154. {devstuff-2.2.0 → devstuff-2.2.1}/tests/test_catalog.py +0 -0
  155. {devstuff-2.2.0 → devstuff-2.2.1}/tests/test_configure_ansible.py +0 -0
  156. {devstuff-2.2.0 → devstuff-2.2.1}/tests/test_configure_bat.py +0 -0
  157. {devstuff-2.2.0 → devstuff-2.2.1}/tests/test_configure_commitizen.py +0 -0
  158. {devstuff-2.2.0 → devstuff-2.2.1}/tests/test_configure_docker.py +0 -0
  159. {devstuff-2.2.0 → devstuff-2.2.1}/tests/test_configure_lazygit.py +0 -0
  160. {devstuff-2.2.0 → devstuff-2.2.1}/tests/test_configure_precommit.py +0 -0
  161. {devstuff-2.2.0 → devstuff-2.2.1}/tests/test_configure_starship.py +0 -0
  162. {devstuff-2.2.0 → devstuff-2.2.1}/tests/test_doctor.py +0 -0
  163. {devstuff-2.2.0 → devstuff-2.2.1}/tests/test_functions.py +0 -0
  164. {devstuff-2.2.0 → devstuff-2.2.1}/tests/test_registry.py +0 -0
  165. {devstuff-2.2.0 → devstuff-2.2.1}/tests/test_verbose.py +0 -0
@@ -1,3 +1,9 @@
1
+ ## v2.2.1 (2026-08-05)
2
+
3
+ ### Bug Fixes
4
+
5
+ - repair the two failing builtin install integration tests (#40)
6
+
1
7
  ## v2.2.0 (2026-08-05)
2
8
 
3
9
  ### Features
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: devstuff
3
- Version: 2.2.0
3
+ Version: 2.2.1
4
4
  Summary: Development environment setup CLI for Linux
5
5
  Project-URL: Repository, https://github.com/thesawdawg/dev-setup-py
6
6
  Author-email: Sawyer <sawyerksu@gmail.com>
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "devstuff"
3
- version = "2.2.0"
3
+ version = "2.2.1"
4
4
  description = "Development environment setup CLI for Linux"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -730,7 +730,13 @@ def _check_cmd_installed(cmd: str, *, install_type: str = "") -> bool:
730
730
  ).returncode == 0
731
731
  except Exception:
732
732
  return False
733
+ # Same nvm sourcing as the simple-command branch above. `bash -lc` reads ~/.profile,
734
+ # whose sourcing of ~/.bashrc (where nvm's init lives) returns early when the shell
735
+ # is non-interactive — so an nvm-installed binary is never on PATH here. Without
736
+ # this, any npm-type tool with a multi-word check_cmd reports "not installed"
737
+ # immediately after installing successfully.
738
+ prefix = f"{_npm_init()} && " if install_type == "npm" else ""
733
739
  try:
734
- return _probe(["bash", "-lc", cmd], capture_output=True).returncode == 0
740
+ return _probe(["bash", "-lc", f"{prefix}{cmd}"], capture_output=True).returncode == 0
735
741
  except Exception:
736
742
  return False
@@ -706,7 +706,11 @@ tools:
706
706
  category: ai-tools
707
707
  type: npm
708
708
  npm_name: llm-checker
709
- check_cmd: llm-checker hw-detect
709
+ # Multi-word on purpose: a "complex" check_cmd is what makes get_version() fall
710
+ # through to the nvm-sourcing probe, which is the only way to read the version of
711
+ # an nvm-installed binary. `hw-detect` also answered "is it installed", but did a
712
+ # full hardware scan (shelling out to lspci) on every `devstuff list` to do it.
713
+ check_cmd: llm-checker --version
710
714
  help_cmd: llm-checker --help
711
715
  docs_url: https://github.com/signerless/llm-checker
712
716
  requires:
@@ -722,6 +726,14 @@ tools:
722
726
  docs_url: https://lmstudio.ai/docs/cli
723
727
  install_script: |
724
728
  set -euo pipefail
729
+ # LM Studio's installer hard-fails on a system without libatomic: it prints the
730
+ # apt line to run and exits 1 rather than installing it. That is the state of a
731
+ # minimal Ubuntu (including this repo's CI image), so install it here — every
732
+ # other prerequisite the installer needs is already present on a base system.
733
+ if ! ldconfig -p 2>/dev/null | grep -q 'libatomic\.so'; then
734
+ sudo apt-get update -q
735
+ sudo apt-get install -y libatomic1
736
+ fi
725
737
  curl -fsSL https://lmstudio.ai/install.sh | bash
726
738
  remove_script: |
727
739
  set -euo pipefail
@@ -159,3 +159,35 @@ def test_download_script_skips_check_when_no_sha256():
159
159
  )
160
160
  def test_is_simple_command(cmd, expected):
161
161
  assert _is_simple_command(cmd) is expected
162
+
163
+
164
+ # -- check_cmd probing ---------------------------------------------------------------
165
+
166
+
167
+ def _probed_script(run_mock) -> str:
168
+ """The shell text passed to `bash -lc` by the last _check_cmd_installed probe."""
169
+ return run_mock.call_args[0][0][2]
170
+
171
+
172
+ @pytest.mark.parametrize("cmd", ["llm-checker --version", "llm-checker"])
173
+ def test_npm_check_cmd_sources_nvm_whether_simple_or_complex(cmd):
174
+ """`bash -lc` never loads nvm on its own: it reads ~/.profile, whose sourcing of
175
+ ~/.bashrc returns early for a non-interactive shell. Without the explicit source,
176
+ an npm-type tool reports "not installed" right after installing successfully."""
177
+ with mock.patch("dev_setup.generic.shutil.which", return_value=None), \
178
+ mock.patch("subprocess.run") as run:
179
+ run.return_value.returncode = 0
180
+ assert generic._check_cmd_installed(cmd, install_type="npm")
181
+ assert ".nvm/nvm.sh" in _probed_script(run)
182
+
183
+
184
+ def test_non_npm_check_cmd_does_not_pay_for_nvm():
185
+ with mock.patch("dev_setup.generic.shutil.which", return_value=None), \
186
+ mock.patch("subprocess.run") as run:
187
+ run.return_value.returncode = 0
188
+ generic._check_cmd_installed("test -d ~/.somewhere", install_type="bash")
189
+ assert ".nvm/nvm.sh" not in _probed_script(run)
190
+
191
+
192
+ def test_complex_check_cmd_still_reports_a_failing_command_as_not_installed():
193
+ assert not generic._check_cmd_installed("false --version", install_type="npm")
@@ -167,7 +167,7 @@ wheels = [
167
167
 
168
168
  [[package]]
169
169
  name = "devstuff"
170
- version = "2.2.0"
170
+ version = "2.2.1"
171
171
  source = { editable = "." }
172
172
  dependencies = [
173
173
  { name = "click" },
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes