refactorai-cli 0.7.13__tar.gz → 0.7.15__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 (54) hide show
  1. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/PKG-INFO +1 -1
  2. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/pyproject.toml +1 -1
  3. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/refactorai_cli/__init__.py +1 -1
  4. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/refactorai_cli/commands/run_cmds.py +11 -2
  5. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/refactorai_cli/commands/runtime_proxy_cmds.py +74 -10
  6. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/refactorai_cli.egg-info/PKG-INFO +1 -1
  7. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/README.md +0 -0
  8. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/refactorai_cli/auth.py +0 -0
  9. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/refactorai_cli/client.py +0 -0
  10. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/refactorai_cli/cloud_rr.py +0 -0
  11. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/refactorai_cli/commands/__init__.py +0 -0
  12. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/refactorai_cli/commands/account_cmds.py +0 -0
  13. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/refactorai_cli/commands/auth_cmds.py +0 -0
  14. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/refactorai_cli/commands/branch_cmds.py +0 -0
  15. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/refactorai_cli/commands/cloud_cmds.py +0 -0
  16. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/refactorai_cli/commands/engine_cmds.py +0 -0
  17. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/refactorai_cli/commands/hook_cmds.py +0 -0
  18. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/refactorai_cli/commands/model_cmds.py +0 -0
  19. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/refactorai_cli/commands/policy_cmds.py +0 -0
  20. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/refactorai_cli/commands/pre_push_cmds.py +0 -0
  21. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/refactorai_cli/commands/request_cmds.py +0 -0
  22. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/refactorai_cli/commands/rules_cmds.py +0 -0
  23. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/refactorai_cli/commands/runtime_cmds.py +0 -0
  24. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/refactorai_cli/commands/setup_cmds.py +0 -0
  25. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/refactorai_cli/commands/toolchains_cmds.py +0 -0
  26. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/refactorai_cli/commands/watch_cmds.py +0 -0
  27. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/refactorai_cli/commands/workspace_cmds.py +0 -0
  28. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/refactorai_cli/commit_queue.py +0 -0
  29. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/refactorai_cli/commit_telemetry.py +0 -0
  30. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/refactorai_cli/control_plane.py +0 -0
  31. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/refactorai_cli/credentials.py +0 -0
  32. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/refactorai_cli/dotenv_loader.py +0 -0
  33. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/refactorai_cli/git_scope.py +0 -0
  34. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/refactorai_cli/local_constitution.py +0 -0
  35. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/refactorai_cli/local_engine_runtime.py +0 -0
  36. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/refactorai_cli/local_paths.py +0 -0
  37. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/refactorai_cli/main.py +0 -0
  38. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/refactorai_cli/mode_sync.py +0 -0
  39. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/refactorai_cli/model_policy.py +0 -0
  40. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/refactorai_cli/pre_push_gate.py +0 -0
  41. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/refactorai_cli/refactor_branch_store.py +0 -0
  42. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/refactorai_cli/review_runner.py +0 -0
  43. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/refactorai_cli/runtime_manager.py +0 -0
  44. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/refactorai_cli/settings.py +0 -0
  45. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/refactorai_cli/setup_flow.py +0 -0
  46. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/refactorai_cli/watch_ledger.py +0 -0
  47. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/refactorai_cli/watch_state.py +0 -0
  48. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/refactorai_cli/watch_supervisor.py +0 -0
  49. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/refactorai_cli.egg-info/SOURCES.txt +0 -0
  50. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/refactorai_cli.egg-info/dependency_links.txt +0 -0
  51. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/refactorai_cli.egg-info/entry_points.txt +0 -0
  52. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/refactorai_cli.egg-info/requires.txt +0 -0
  53. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/refactorai_cli.egg-info/top_level.txt +0 -0
  54. {refactorai_cli-0.7.13 → refactorai_cli-0.7.15}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: refactorai-cli
3
- Version: 0.7.13
3
+ Version: 0.7.15
4
4
  Summary: Local-first CLI for the refactor platform
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "refactorai-cli"
3
- version = "0.7.13"
3
+ version = "0.7.15"
4
4
  description = "Local-first CLI for the refactor platform"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -5,4 +5,4 @@ the shared `refactor_core` pipeline from a project folder while staying
5
5
  authenticated to the hosted platform via a developer key.
6
6
  """
7
7
 
8
- __version__ = "0.7.13"
8
+ __version__ = "0.7.15"
@@ -119,7 +119,6 @@ from refactor_core.execution_variant import (
119
119
  is_cloud_execution,
120
120
  platform_inference_mode,
121
121
  resolve_execution_variant,
122
- uses_platform_inference,
123
122
  verification_location,
124
123
  )
125
124
 
@@ -5341,7 +5340,17 @@ def doctor(
5341
5340
  _report_dotenv(dotenv, project_root)
5342
5341
 
5343
5342
  execution_variant = _execution_variant(constitution)
5344
- if uses_platform_inference(execution_variant):
5343
+ # Route by ENGINE LOCATION (docs/46), matching review/code dispatch. Every
5344
+ # server-engine variant (local_byok / local_managed / cloud_byok /
5345
+ # cloud_managed) runs its engine on the Refactor server, so it is diagnosed
5346
+ # via the platform path and must NEVER import engine-only modules -- those
5347
+ # ship in the private engine wheel and are absent from a public pip/pipx
5348
+ # install. Only the host-engine variants (local_heuristic / local_model)
5349
+ # fall through to the engine-backed local doctor below. Previously this
5350
+ # branched on ``uses_platform_inference`` (False for local_byok), which sent
5351
+ # local_byok down the local path and blew up importing
5352
+ # ``refactor_core.execution`` on a client-only install.
5353
+ if engine_is_remote(execution_variant):
5345
5354
  _cloud_doctor(
5346
5355
  project_root=project_root,
5347
5356
  constitution=constitution,
@@ -79,6 +79,30 @@ def _engine_runs_on_server() -> bool:
79
79
  return engine_is_remote(_project_execution_mode())
80
80
 
81
81
 
82
+ def _sync_mode_from_server_if_possible(command_name: str | None = None) -> None:
83
+ """Best-effort server->local mode sync before routing.
84
+
85
+ Fixes the stale-mode chicken-and-egg: when a developer changes the mode in
86
+ the web UI, the local ``refactor.config`` may still point at the previous
87
+ variant. If dispatch reads that stale local value first, commands can route
88
+ to the wrong engine path (for example ``doctor`` going to the runtime path
89
+ instead of the local CLI cloud path), so the sync never runs and the local
90
+ mode never updates.
91
+
92
+ This helper is intentionally silent and fail-open (offline/auth issues are
93
+ ignored) so command routing remains robust.
94
+ """
95
+ try:
96
+ from refactorai_cli.mode_sync import sync_execution_variant_from_server
97
+
98
+ emit = None
99
+ if command_name == "doctor":
100
+ emit = lambda m: console.print(f"[dim]{m}[/dim]")
101
+ sync_execution_variant_from_server(Path.cwd(), emit=emit)
102
+ except Exception:
103
+ return
104
+
105
+
82
106
  def _active_runtime_artifact() -> Path:
83
107
  status = runtime_status()
84
108
  version = str(status.get("active_version") or "").strip()
@@ -98,12 +122,50 @@ def _active_runtime_artifact() -> Path:
98
122
  return artifact
99
123
 
100
124
 
125
+ # Subpackages that ship ONLY in the private engine wheel (R21 core split) and are
126
+ # intentionally absent from a public pip/pipx install of ``refactorai-core``.
127
+ _ENGINE_ONLY_PREFIXES = (
128
+ "refactor_core.execution",
129
+ "refactor_core.providers",
130
+ "refactor_core.enginecore",
131
+ "refactor_core.codeintel",
132
+ )
133
+
134
+
135
+ def _is_engine_only_module(exc: ModuleNotFoundError) -> bool:
136
+ """True when the missing module is an engine-only subpackage (not version skew)."""
137
+ name = exc.name or ""
138
+ return any(name == p or name.startswith(p + ".") for p in _ENGINE_ONLY_PREFIXES)
139
+
140
+
101
141
  def _is_core_too_old(exc: ModuleNotFoundError) -> bool:
102
- """True when a missing module points at an outdated installed ``refactor_core``."""
103
- return (exc.name or "").startswith("refactor_core")
142
+ """True when a missing module points at an outdated installed ``refactor_core``.
143
+
144
+ Engine-only subpackages are excluded: their absence in a public install is by
145
+ design, not a version mismatch (see :func:`_print_missing_module`).
146
+ """
147
+ return (exc.name or "").startswith("refactor_core") and not _is_engine_only_module(exc)
148
+
104
149
 
150
+ def _print_missing_module(exc: ModuleNotFoundError) -> None:
151
+ """Print an actionable message for a missing ``refactor_core`` module.
105
152
 
106
- def _print_core_too_old(exc: ModuleNotFoundError) -> None:
153
+ Distinguishes two very different causes:
154
+ - engine-only module absent from a public install (a routing/mode issue), vs
155
+ - a genuinely outdated core (version skew -> upgrade).
156
+ """
157
+ if _is_engine_only_module(exc):
158
+ console.print(
159
+ "[red]This command needs the local engine, which is not part of the "
160
+ "public install.[/red]\n"
161
+ f"Missing engine module: [bold]{exc.name}[/bold]\n"
162
+ "Only local_heuristic / local_model run the engine on this machine "
163
+ "(via the runtime artifact). Server-engine modes (local_byok / "
164
+ "local_managed / cloud_byok / cloud_managed) should not reach this "
165
+ "path — check the project's execution mode in refactor.config or the "
166
+ "web UI, then rerun. If the mode is correct, this is a routing bug."
167
+ )
168
+ return
107
169
  console.print(
108
170
  "[red]Installed refactor core is too old for this CLI.[/red]\n"
109
171
  f"Missing module: [bold]{exc.name}[/bold]\n"
@@ -127,8 +189,8 @@ def _delegate_to_run_cmds(command_name: str, passthrough_args: list[str]) -> Non
127
189
  try:
128
190
  from refactorai_cli.commands import run_cmds
129
191
  except ModuleNotFoundError as exc:
130
- if _is_core_too_old(exc):
131
- _print_core_too_old(exc)
192
+ if (exc.name or "").startswith("refactor_core"):
193
+ _print_missing_module(exc)
132
194
  raise typer.Exit(code=1) from exc
133
195
  raise
134
196
 
@@ -157,11 +219,12 @@ def _delegate_to_run_cmds(command_name: str, passthrough_args: list[str]) -> Non
157
219
  if code:
158
220
  raise typer.Exit(code=code) from exc
159
221
  except ModuleNotFoundError as exc:
160
- # A refactor_core submodule missing at call time (e.g. commit-scoped
161
- # review importing refactor_core.intent) means the installed core predates
162
- # this CLI. Surface an actionable upgrade hint instead of exiting silently.
163
- if _is_core_too_old(exc):
164
- _print_core_too_old(exc)
222
+ # A refactor_core submodule missing at call time can mean two things:
223
+ # version skew (installed core predates this CLI) or an engine-only module
224
+ # reached on a client-only install (a routing/mode issue). Surface the
225
+ # right actionable hint instead of exiting silently.
226
+ if (exc.name or "").startswith("refactor_core"):
227
+ _print_missing_module(exc)
165
228
  else:
166
229
  console.print(f"[red]{command_name} failed:[/red] {exc}")
167
230
  raise typer.Exit(code=1) from exc
@@ -181,6 +244,7 @@ def _dispatch(command_name: str, passthrough_args: list[str]) -> None:
181
244
  host-engine variants (``local_model`` / ``local_heuristic``) execute via the
182
245
  downloaded runtime artifact.
183
246
  """
247
+ _sync_mode_from_server_if_possible(command_name)
184
248
  if _engine_runs_on_server():
185
249
  _delegate_to_run_cmds(command_name, passthrough_args)
186
250
  return
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: refactorai-cli
3
- Version: 0.7.13
3
+ Version: 0.7.15
4
4
  Summary: Local-first CLI for the refactor platform
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown