nonoka-cli 0.2.13__tar.gz → 0.2.14__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 (122) hide show
  1. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/PKG-INFO +6 -5
  2. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/README.md +5 -4
  3. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/pyproject.toml +1 -1
  4. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/__init__.py +1 -1
  5. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/tests/unit/test_install_script.py +56 -2
  6. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/.gitignore +0 -0
  7. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/LICENSE +0 -0
  8. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/NOTICE +0 -0
  9. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/__main__.py +0 -0
  10. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/benchmark/__init__.py +0 -0
  11. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/benchmark/harbor.py +0 -0
  12. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/benchmark/swe_bench.py +0 -0
  13. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/benchmark/swe_environment.py +0 -0
  14. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/benchmark/swe_runner.py +0 -0
  15. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/benchmark/watchdog.py +0 -0
  16. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/bridge/__init__.py +0 -0
  17. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/bridge/events.py +0 -0
  18. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/bridge/handler.py +0 -0
  19. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/bridge/nonoka_tools.py +0 -0
  20. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/bridge/protocol.py +0 -0
  21. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/bridge/server.py +0 -0
  22. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/cli.py +0 -0
  23. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/commands/__init__.py +0 -0
  24. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/commands/benchmark_cmd.py +0 -0
  25. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/commands/config_cmd.py +0 -0
  26. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/commands/doctor_cmd.py +0 -0
  27. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/commands/eval_cmd.py +0 -0
  28. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/commands/logs_cmd.py +0 -0
  29. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/commands/opencode_cmd.py +0 -0
  30. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/commands/plugin_cmd.py +0 -0
  31. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/commands/run_cmd.py +0 -0
  32. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/commands/sessions_cmd.py +0 -0
  33. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/config/__init__.py +0 -0
  34. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/config/loader.py +0 -0
  35. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/config/manager.py +0 -0
  36. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/config/models.py +0 -0
  37. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/core/__init__.py +0 -0
  38. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/core/agent_factory.py +0 -0
  39. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/core/context.py +0 -0
  40. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/core/context_trimmer.py +0 -0
  41. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/core/git_service.py +0 -0
  42. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/core/mcp_service.py +0 -0
  43. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/core/namespaces.py +0 -0
  44. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/core/operational_signals.py +0 -0
  45. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/core/orchestrator.py +0 -0
  46. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/core/plugin_manifest.py +0 -0
  47. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/core/plugin_manifest_converter.py +0 -0
  48. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/core/project_agents.py +0 -0
  49. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/core/prompt_builder.py +0 -0
  50. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/core/repo_map_service.py +0 -0
  51. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/core/run_evidence.py +0 -0
  52. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/core/runner_service.py +0 -0
  53. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/core/scorecard.py +0 -0
  54. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/core/semantic_cache.py +0 -0
  55. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/core/session_service.py +0 -0
  56. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/core/task_state.py +0 -0
  57. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/core/tool_output_policy.py +0 -0
  58. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/core/tool_service.py +0 -0
  59. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/mcp/__init__.py +0 -0
  60. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/mcp/manager.py +0 -0
  61. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/mcp/models.py +0 -0
  62. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/safety/__init__.py +0 -0
  63. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/safety/preflight.py +0 -0
  64. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/safety/sandbox.py +0 -0
  65. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/sessions/__init__.py +0 -0
  66. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/sessions/manager.py +0 -0
  67. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/sessions/models.py +0 -0
  68. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/skills/__init__.py +0 -0
  69. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/tools/__init__.py +0 -0
  70. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/tools/builtins/__init__.py +0 -0
  71. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/tools/builtins/agent_tools.py +0 -0
  72. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/tools/builtins/file_tools.py +0 -0
  73. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/tools/loader.py +0 -0
  74. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/utils/__init__.py +0 -0
  75. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/utils/errors.py +0 -0
  76. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/utils/logging.py +0 -0
  77. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/src/nonoka_cli/utils/trace_logger.py +0 -0
  78. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/tests/conftest.py +0 -0
  79. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/tests/fixtures/bridge_external_capabilities.json +0 -0
  80. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/tests/integration/test_server_external_capabilities.py +0 -0
  81. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/tests/integration/test_watchdog_process_group.py +0 -0
  82. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/tests/unit/benchmark/test_harbor.py +0 -0
  83. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/tests/unit/benchmark/test_swe_environment.py +0 -0
  84. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/tests/unit/benchmark/test_watchdog.py +0 -0
  85. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/tests/unit/bridge/test_events.py +0 -0
  86. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/tests/unit/bridge/test_handler.py +0 -0
  87. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/tests/unit/bridge/test_nonoka_tools.py +0 -0
  88. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/tests/unit/bridge/test_package.py +0 -0
  89. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/tests/unit/bridge/test_protocol.py +0 -0
  90. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/tests/unit/bridge/test_server.py +0 -0
  91. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/tests/unit/commands/test_benchmark_cmd.py +0 -0
  92. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/tests/unit/commands/test_cli_entrypoint.py +0 -0
  93. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/tests/unit/commands/test_config_cmd.py +0 -0
  94. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/tests/unit/commands/test_doctor_cmd.py +0 -0
  95. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/tests/unit/commands/test_eval_cmd.py +0 -0
  96. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/tests/unit/commands/test_logs_cmd.py +0 -0
  97. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/tests/unit/commands/test_opencode_cmd.py +0 -0
  98. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/tests/unit/commands/test_plugin_cmd.py +0 -0
  99. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/tests/unit/commands/test_run_cmd.py +0 -0
  100. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/tests/unit/commands/test_swe_bench_cmd.py +0 -0
  101. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/tests/unit/config/test_loader.py +0 -0
  102. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/tests/unit/config/test_models.py +0 -0
  103. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/tests/unit/core/test_agent_factory.py +0 -0
  104. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/tests/unit/core/test_context_trimmer.py +0 -0
  105. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/tests/unit/core/test_git_service.py +0 -0
  106. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/tests/unit/core/test_operational_signals.py +0 -0
  107. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/tests/unit/core/test_orchestrator.py +0 -0
  108. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/tests/unit/core/test_plugin_manifest.py +0 -0
  109. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/tests/unit/core/test_plugin_manifest_converter.py +0 -0
  110. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/tests/unit/core/test_project_agents.py +0 -0
  111. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/tests/unit/core/test_prompt_builder.py +0 -0
  112. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/tests/unit/core/test_repo_map_service.py +0 -0
  113. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/tests/unit/core/test_safety_policy.py +0 -0
  114. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/tests/unit/core/test_scorecard.py +0 -0
  115. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/tests/unit/core/test_semantic_cache.py +0 -0
  116. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/tests/unit/core/test_task_state.py +0 -0
  117. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/tests/unit/core/test_tool_output_policy.py +0 -0
  118. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/tests/unit/safety/test_preflight.py +0 -0
  119. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/tests/unit/sessions/test_manager.py +0 -0
  120. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/tests/unit/tools/test_file_tools.py +0 -0
  121. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/tests/unit/utils/test_logging.py +0 -0
  122. {nonoka_cli-0.2.13 → nonoka_cli-0.2.14}/tests/unit/utils/test_trace_logger.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nonoka-cli
3
- Version: 0.2.13
3
+ Version: 0.2.14
4
4
  Summary: OpenCode backend for the Nonoka Agent framework
5
5
  License: MIT
6
6
  License-File: LICENSE
@@ -43,7 +43,7 @@ tool execution and human-in-the-loop (HITL) approval using its native tools.
43
43
  The easiest way to get nonoka + OpenCode is the one-line installer:
44
44
 
45
45
  ```bash
46
- curl -fsSL https://nonoka.dev/install.sh | bash
46
+ curl -fsSL https://raw.githubusercontent.com/fyerfyer/Nonoka-cli/main/install.sh | bash
47
47
  ```
48
48
 
49
49
  The installer will:
@@ -89,8 +89,9 @@ The legacy `nonoka-cli` executable remains available for compatibility.
89
89
  `nonoka-cli` automatically loads `~/.config/nonoka/.env` and `./.env` on startup,
90
90
  so you don't need to `export` every time if you save the key in `.env`.
91
91
 
92
- > To use `uv` instead of `pip`, or to run non-interactively, pass flags:
93
- > `curl -fsSL https://nonoka.dev/install.sh | bash -s -- --uv --yes`.
92
+ > The installer uses `uv` by default when it is available and falls back to
93
+ > the isolated environment's pip. Pass `--pip` to explicitly select pip, or
94
+ > `--yes` to run non-interactively.
94
95
 
95
96
  For a non-interactive custom location, use flags (environment variables with
96
97
  the same names are also supported):
@@ -163,7 +164,7 @@ Example output:
163
164
 
164
165
  ```
165
166
  nonoka-cli doctor
166
- ✓ nonoka-cli 0.2.13
167
+ ✓ nonoka-cli 0.2.14
167
168
  ✓ Python 3.11
168
169
  ✓ opencode 1.18.2
169
170
  ✓ provider nonoka-opencode-provider@0.2.17
@@ -14,7 +14,7 @@ tool execution and human-in-the-loop (HITL) approval using its native tools.
14
14
  The easiest way to get nonoka + OpenCode is the one-line installer:
15
15
 
16
16
  ```bash
17
- curl -fsSL https://nonoka.dev/install.sh | bash
17
+ curl -fsSL https://raw.githubusercontent.com/fyerfyer/Nonoka-cli/main/install.sh | bash
18
18
  ```
19
19
 
20
20
  The installer will:
@@ -60,8 +60,9 @@ The legacy `nonoka-cli` executable remains available for compatibility.
60
60
  `nonoka-cli` automatically loads `~/.config/nonoka/.env` and `./.env` on startup,
61
61
  so you don't need to `export` every time if you save the key in `.env`.
62
62
 
63
- > To use `uv` instead of `pip`, or to run non-interactively, pass flags:
64
- > `curl -fsSL https://nonoka.dev/install.sh | bash -s -- --uv --yes`.
63
+ > The installer uses `uv` by default when it is available and falls back to
64
+ > the isolated environment's pip. Pass `--pip` to explicitly select pip, or
65
+ > `--yes` to run non-interactively.
65
66
 
66
67
  For a non-interactive custom location, use flags (environment variables with
67
68
  the same names are also supported):
@@ -134,7 +135,7 @@ Example output:
134
135
 
135
136
  ```
136
137
  nonoka-cli doctor
137
- ✓ nonoka-cli 0.2.13
138
+ ✓ nonoka-cli 0.2.14
138
139
  ✓ Python 3.11
139
140
  ✓ opencode 1.18.2
140
141
  ✓ provider nonoka-opencode-provider@0.2.17
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "nonoka-cli"
7
- version = "0.2.13"
7
+ version = "0.2.14"
8
8
  description = "OpenCode backend for the Nonoka Agent framework"
9
9
  readme = "README.md"
10
10
  license = { text = "MIT" }
@@ -2,4 +2,4 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- __version__ = "0.2.13"
5
+ __version__ = "0.2.14"
@@ -20,7 +20,18 @@ def _fake_environment(tmp_path: Path) -> tuple[dict[str, str], Path]:
20
20
  fake_bin = tmp_path / "bin"
21
21
  fake_bin.mkdir()
22
22
  log = tmp_path / "calls.log"
23
- _command(fake_bin / "python3", "printf '3.13\\n'\n")
23
+ _command(
24
+ fake_bin / "python3",
25
+ 'if [ "${1:-}" = "-c" ]; then\n'
26
+ ' printf "3.13\\n"\n'
27
+ 'elif [ "${1:-}" = "-m" ] && [ "${2:-}" = "venv" ]; then\n'
28
+ ' mkdir -p "$3/bin"\n'
29
+ ' cp "$0" "$3/bin/python"\n'
30
+ ' cp "$(dirname "$0")/nonoka" "$3/bin/nonoka"\n'
31
+ 'elif [ "${1:-}" = "-m" ] && [ "${2:-}" = "pip" ]; then\n'
32
+ ' printf "python-pip:%s\\n" "${*:3}" >> "$NONOKA_TEST_LOG"\n'
33
+ 'fi\n',
34
+ )
24
35
  _command(
25
36
  fake_bin / "uv",
26
37
  'printf "uv:%s\\n" "$*" >> "$NONOKA_TEST_LOG"\n'
@@ -87,7 +98,7 @@ def test_install_dir_flags_expand_home_and_drive_all_commands(tmp_path: Path) ->
87
98
  home = Path(env["HOME"])
88
99
  calls = log.read_text()
89
100
  assert f"uv:venv {home}/chosen-install/.venv --python python3" in calls
90
- assert "uv:pip install --upgrade nonoka-cli" in calls
101
+ assert f"uv:pip install --python {home}/chosen-install/.venv/bin/python --upgrade nonoka-cli" in calls
91
102
  assert f"nonoka:config init --yes --config {home}/chosen-config/config.yaml" in calls
92
103
  assert f"nonoka:init --config {home}/chosen-config/config.yaml" in calls
93
104
  assert f"npm prefix: {home}/chosen-npm" in result.stdout
@@ -112,6 +123,49 @@ def test_environment_variables_select_noninteractive_layout(tmp_path: Path) -> N
112
123
  assert f"npm prefix: {tmp_path}/env-npm" in result.stdout
113
124
 
114
125
 
126
+ def test_uv_is_the_default_and_targets_the_created_environment(tmp_path: Path) -> None:
127
+ env, log = _fake_environment(tmp_path)
128
+ install_dir = tmp_path / "default-uv"
129
+
130
+ result = _run(
131
+ tmp_path,
132
+ "--yes",
133
+ "--no-opencode",
134
+ "--install-dir",
135
+ str(install_dir),
136
+ env=env,
137
+ )
138
+
139
+ assert result.returncode == 0, result.stderr
140
+ calls = log.read_text()
141
+ assert f"uv:venv {install_dir}/.venv --python python3" in calls
142
+ assert (
143
+ f"uv:pip install --python {install_dir}/.venv/bin/python --upgrade nonoka-cli"
144
+ in calls
145
+ )
146
+ assert "python-pip:" not in calls
147
+
148
+
149
+ def test_pip_mode_is_pinned_to_the_created_environment(tmp_path: Path) -> None:
150
+ env, log = _fake_environment(tmp_path)
151
+ install_dir = tmp_path / "explicit-pip"
152
+
153
+ result = _run(
154
+ tmp_path,
155
+ "--yes",
156
+ "--pip",
157
+ "--no-opencode",
158
+ "--install-dir",
159
+ str(install_dir),
160
+ env=env,
161
+ )
162
+
163
+ assert result.returncode == 0, result.stderr
164
+ calls = log.read_text()
165
+ assert "python-pip:install --upgrade nonoka-cli" in calls
166
+ assert f"uv:venv {install_dir}/.venv --python python3" not in calls
167
+
168
+
115
169
  def test_interactive_prompts_explain_each_directory(tmp_path: Path) -> None:
116
170
  env, log = _fake_environment(tmp_path)
117
171
  selected_install = tmp_path / "interactive-install"
File without changes
File without changes
File without changes