refactorai-cli 0.4.8__tar.gz → 0.4.10__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 (46) hide show
  1. {refactorai_cli-0.4.8 → refactorai_cli-0.4.10}/PKG-INFO +1 -1
  2. {refactorai_cli-0.4.8 → refactorai_cli-0.4.10}/pyproject.toml +1 -1
  3. {refactorai_cli-0.4.8 → refactorai_cli-0.4.10}/refactorai_cli/__init__.py +1 -1
  4. {refactorai_cli-0.4.8 → refactorai_cli-0.4.10}/refactorai_cli/commands/watch_cmds.py +66 -11
  5. {refactorai_cli-0.4.8 → refactorai_cli-0.4.10}/refactorai_cli/watch_state.py +1 -1
  6. {refactorai_cli-0.4.8 → refactorai_cli-0.4.10}/refactorai_cli.egg-info/PKG-INFO +1 -1
  7. {refactorai_cli-0.4.8 → refactorai_cli-0.4.10}/README.md +0 -0
  8. {refactorai_cli-0.4.8 → refactorai_cli-0.4.10}/refactorai_cli/auth.py +0 -0
  9. {refactorai_cli-0.4.8 → refactorai_cli-0.4.10}/refactorai_cli/client.py +0 -0
  10. {refactorai_cli-0.4.8 → refactorai_cli-0.4.10}/refactorai_cli/cloud_rr.py +0 -0
  11. {refactorai_cli-0.4.8 → refactorai_cli-0.4.10}/refactorai_cli/commands/__init__.py +0 -0
  12. {refactorai_cli-0.4.8 → refactorai_cli-0.4.10}/refactorai_cli/commands/account_cmds.py +0 -0
  13. {refactorai_cli-0.4.8 → refactorai_cli-0.4.10}/refactorai_cli/commands/auth_cmds.py +0 -0
  14. {refactorai_cli-0.4.8 → refactorai_cli-0.4.10}/refactorai_cli/commands/branch_cmds.py +0 -0
  15. {refactorai_cli-0.4.8 → refactorai_cli-0.4.10}/refactorai_cli/commands/cloud_cmds.py +0 -0
  16. {refactorai_cli-0.4.8 → refactorai_cli-0.4.10}/refactorai_cli/commands/engine_cmds.py +0 -0
  17. {refactorai_cli-0.4.8 → refactorai_cli-0.4.10}/refactorai_cli/commands/hook_cmds.py +0 -0
  18. {refactorai_cli-0.4.8 → refactorai_cli-0.4.10}/refactorai_cli/commands/model_cmds.py +0 -0
  19. {refactorai_cli-0.4.8 → refactorai_cli-0.4.10}/refactorai_cli/commands/request_cmds.py +0 -0
  20. {refactorai_cli-0.4.8 → refactorai_cli-0.4.10}/refactorai_cli/commands/rules_cmds.py +0 -0
  21. {refactorai_cli-0.4.8 → refactorai_cli-0.4.10}/refactorai_cli/commands/run_cmds.py +0 -0
  22. {refactorai_cli-0.4.8 → refactorai_cli-0.4.10}/refactorai_cli/commands/runtime_cmds.py +0 -0
  23. {refactorai_cli-0.4.8 → refactorai_cli-0.4.10}/refactorai_cli/commands/runtime_proxy_cmds.py +0 -0
  24. {refactorai_cli-0.4.8 → refactorai_cli-0.4.10}/refactorai_cli/commands/setup_cmds.py +0 -0
  25. {refactorai_cli-0.4.8 → refactorai_cli-0.4.10}/refactorai_cli/commands/toolchains_cmds.py +0 -0
  26. {refactorai_cli-0.4.8 → refactorai_cli-0.4.10}/refactorai_cli/commit_queue.py +0 -0
  27. {refactorai_cli-0.4.8 → refactorai_cli-0.4.10}/refactorai_cli/control_plane.py +0 -0
  28. {refactorai_cli-0.4.8 → refactorai_cli-0.4.10}/refactorai_cli/credentials.py +0 -0
  29. {refactorai_cli-0.4.8 → refactorai_cli-0.4.10}/refactorai_cli/dotenv_loader.py +0 -0
  30. {refactorai_cli-0.4.8 → refactorai_cli-0.4.10}/refactorai_cli/git_scope.py +0 -0
  31. {refactorai_cli-0.4.8 → refactorai_cli-0.4.10}/refactorai_cli/local_constitution.py +0 -0
  32. {refactorai_cli-0.4.8 → refactorai_cli-0.4.10}/refactorai_cli/local_engine_runtime.py +0 -0
  33. {refactorai_cli-0.4.8 → refactorai_cli-0.4.10}/refactorai_cli/local_paths.py +0 -0
  34. {refactorai_cli-0.4.8 → refactorai_cli-0.4.10}/refactorai_cli/main.py +0 -0
  35. {refactorai_cli-0.4.8 → refactorai_cli-0.4.10}/refactorai_cli/model_policy.py +0 -0
  36. {refactorai_cli-0.4.8 → refactorai_cli-0.4.10}/refactorai_cli/refactor_branch_store.py +0 -0
  37. {refactorai_cli-0.4.8 → refactorai_cli-0.4.10}/refactorai_cli/review_runner.py +0 -0
  38. {refactorai_cli-0.4.8 → refactorai_cli-0.4.10}/refactorai_cli/runtime_manager.py +0 -0
  39. {refactorai_cli-0.4.8 → refactorai_cli-0.4.10}/refactorai_cli/settings.py +0 -0
  40. {refactorai_cli-0.4.8 → refactorai_cli-0.4.10}/refactorai_cli/setup_flow.py +0 -0
  41. {refactorai_cli-0.4.8 → refactorai_cli-0.4.10}/refactorai_cli.egg-info/SOURCES.txt +0 -0
  42. {refactorai_cli-0.4.8 → refactorai_cli-0.4.10}/refactorai_cli.egg-info/dependency_links.txt +0 -0
  43. {refactorai_cli-0.4.8 → refactorai_cli-0.4.10}/refactorai_cli.egg-info/entry_points.txt +0 -0
  44. {refactorai_cli-0.4.8 → refactorai_cli-0.4.10}/refactorai_cli.egg-info/requires.txt +0 -0
  45. {refactorai_cli-0.4.8 → refactorai_cli-0.4.10}/refactorai_cli.egg-info/top_level.txt +0 -0
  46. {refactorai_cli-0.4.8 → refactorai_cli-0.4.10}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: refactorai-cli
3
- Version: 0.4.8
3
+ Version: 0.4.10
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.4.8"
3
+ version = "0.4.10"
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.4.8"
8
+ __version__ = "0.4.10"
@@ -79,6 +79,48 @@ def _preview_for_run(project_root: Path, run_id: str, *, limit: int = 3) -> list
79
79
  return lines
80
80
 
81
81
 
82
+ def _pending_for_run(
83
+ project_root: Path,
84
+ run_id: str,
85
+ *,
86
+ limit: int = 3,
87
+ ) -> tuple[int, list[str]]:
88
+ """Return ``(pending_count, preview_lines)`` for requests created by ``run_id``."""
89
+ if not run_id:
90
+ return 0, []
91
+ try:
92
+ from refactor_core.refactor_requests import IN_PROGRESS, PENDING, list_requests
93
+ except Exception:
94
+ return 0, []
95
+ try:
96
+ requests = list_requests(project_root)
97
+ except Exception:
98
+ return 0, []
99
+ matches = [
100
+ rr
101
+ for rr in requests
102
+ if str(getattr(rr, "created_by_run", "") or "") == run_id
103
+ and str(getattr(rr, "status", "") or "") in {PENDING, IN_PROGRESS}
104
+ ]
105
+ if not matches:
106
+ return 0, []
107
+ lines: list[str] = []
108
+ for rr in matches[: max(1, limit)]:
109
+ sev = str(getattr(rr, "severity", "medium") or "medium").lower()
110
+ location = str(getattr(rr, "location", "") or "").strip() or str(
111
+ getattr(rr, "file_path", "") or "(unknown location)"
112
+ )
113
+ rec = _truncate(
114
+ str(getattr(rr, "recommendation", "") or getattr(rr, "rationale", "") or "").strip(),
115
+ limit=100,
116
+ )
117
+ if rec:
118
+ lines.append(f"[{sev}] {location} - {rec}")
119
+ else:
120
+ lines.append(f"[{sev}] {location}")
121
+ return len(matches), lines
122
+
123
+
82
124
  def _resolve_repo(project_root: Path | None) -> Path:
83
125
  root = git_scope.repo_root(project_root or Path.cwd())
84
126
  if not root:
@@ -175,7 +217,7 @@ def _read_key(timeout: float) -> str:
175
217
  """Non-blocking key read on a POSIX TTY, normalized to a token.
176
218
 
177
219
  Returns ``up``/``down`` for arrow keys, the raw character for normal keys
178
- (case preserved so ``[r]`` and ``[R]`` are distinguishable), ``esc`` for a
220
+ (used for hotkeys like ``[r]`` and ``[f]``), ``esc`` for a
179
221
  bare Escape, or ``""`` when nothing was pressed / the terminal is not
180
222
  interactive. Sleeps ``timeout`` in the non-interactive case so the caller's
181
223
  poll cadence is preserved.
@@ -219,15 +261,19 @@ def _read_key(timeout: float) -> str:
219
261
  def build_action_command(action: str, sha: str, *, executable: str = "refactor") -> list[str] | None:
220
262
  """Build the argv for a terminal action. Pure + testable (docs/42 Phase 4).
221
263
 
222
- ``code`` reuses pending requests; ``refresh`` regenerates them. ``merge`` /
223
- ``drop`` operate on the refactor branch built by ``code`` (local only).
264
+ ``code`` reuses pending requests; ``refresh`` regenerates them. Both pass
265
+ ``--keep`` so resolving from the terminal only *builds* the refactor branch
266
+ (per-request commits + final test) and never pops its own merge/keep/drop
267
+ prompt — the terminal's ``[m]`` merge / ``[x]`` drop keys are the single,
268
+ explicit place that decision is made. ``merge`` / ``drop`` operate on that
269
+ already-built refactor branch (local only, never pushes).
224
270
  """
225
271
  if action == "code":
226
272
  # Commit-scoped so `[r]` resolves THIS commit's requests (docs/41 Phase 4).
227
- return [executable, "code", "--commit", sha]
273
+ return [executable, "code", "--commit", sha, "--keep"]
228
274
  if action == "refresh":
229
- # `[R]` regenerates the requests for this commit before resolving.
230
- return [executable, "code", "--commit", sha, "--refresh-requests"]
275
+ # `[f]` regenerates the requests for this commit before resolving.
276
+ return [executable, "code", "--commit", sha, "--refresh-requests", "--keep"]
231
277
  if action == "diff":
232
278
  # Shows the pending refactor-request patch diffs (not the git diff).
233
279
  return [executable, "diff"]
@@ -280,10 +326,19 @@ def _run_action(live, project_root: Path, action: str, node, state: WatchState)
280
326
  console.print(f"\n[bold bright_cyan]watch:[/bold bright_cyan] {action} for "
281
327
  f"[yellow]{node.short_sha}[/yellow] ({node.branch or 'detached'})\n")
282
328
  _launch_interactive(cmd, project_root)
283
- if action in ("code", "refresh"):
284
- # Resolving/regenerating requests changes the tree; re-review this commit
285
- # to refresh its gate/RR counts on the next consume pass.
329
+ if action == "refresh":
330
+ # `[f]` explicitly regenerates requests, so re-review this commit on the
331
+ # next pass.
286
332
  state.requeue(node.sha)
333
+ elif action == "code":
334
+ # `[r]` is resolve/reuse. Do NOT auto re-review here (that can regenerate
335
+ # duplicate-looking findings); instead reflect current pending requests
336
+ # from the existing run in-place.
337
+ node_after = state.get(node.sha)
338
+ if node_after and node_after.run_id:
339
+ pending_count, preview = _pending_for_run(project_root, node_after.run_id)
340
+ node_after.rr_count = pending_count
341
+ node_after.rr_preview = preview
287
342
  console.print("\n[dim]watch: returning to the Refactor Terminal...[/dim]")
288
343
  live.start()
289
344
 
@@ -315,10 +370,10 @@ def _run_tui(project_root: Path, state: WatchState, runner: ReviewRunner) -> Non
315
370
  state.move_selection(-1)
316
371
  elif key in ("down", "j"):
317
372
  state.move_selection(+1)
318
- elif key in ("r", "R", "d", "m", "x"):
373
+ elif key in ("r", "f", "d", "m", "x"):
319
374
  action = {
320
375
  "r": "code",
321
- "R": "refresh",
376
+ "f": "refresh",
322
377
  "d": "diff",
323
378
  "m": "merge",
324
379
  "x": "drop",
@@ -329,7 +329,7 @@ def render_graph(state: WatchState, *, now: datetime | None = None, width: int =
329
329
  _with_pad(
330
330
  Text.from_markup(
331
331
  "[dim]\\[↑/↓ or j/k][/dim] select [bold]\\[r][/bold] refactor "
332
- "[bold]\\[R][/bold] refresh [bold]\\[d][/bold] diff "
332
+ "[bold]\\[f][/bold] fresh review [bold]\\[d][/bold] diff "
333
333
  "[bold]\\[m][/bold] merge [bold]\\[x][/bold] drop "
334
334
  "[bold]\\[p][/bold] push [bold]\\[q][/bold] quit"
335
335
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: refactorai-cli
3
- Version: 0.4.8
3
+ Version: 0.4.10
4
4
  Summary: Local-first CLI for the refactor platform
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown