refactorai-cli 0.7.20__tar.gz → 0.7.23__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.
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/PKG-INFO +1 -1
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/pyproject.toml +1 -1
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/refactorai_cli/__init__.py +1 -1
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/refactorai_cli/commands/run_cmds.py +23 -23
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/refactorai_cli/watch_state.py +47 -11
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/refactorai_cli.egg-info/PKG-INFO +1 -1
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/README.md +0 -0
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/refactorai_cli/auth.py +0 -0
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/refactorai_cli/client.py +0 -0
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/refactorai_cli/cloud_rr.py +0 -0
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/refactorai_cli/commands/__init__.py +0 -0
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/refactorai_cli/commands/account_cmds.py +0 -0
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/refactorai_cli/commands/auth_cmds.py +0 -0
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/refactorai_cli/commands/branch_cmds.py +0 -0
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/refactorai_cli/commands/cloud_cmds.py +0 -0
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/refactorai_cli/commands/engine_cmds.py +0 -0
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/refactorai_cli/commands/hook_cmds.py +0 -0
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/refactorai_cli/commands/model_cmds.py +0 -0
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/refactorai_cli/commands/policy_cmds.py +0 -0
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/refactorai_cli/commands/pre_push_cmds.py +0 -0
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/refactorai_cli/commands/request_cmds.py +0 -0
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/refactorai_cli/commands/rules_cmds.py +0 -0
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/refactorai_cli/commands/runtime_cmds.py +0 -0
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/refactorai_cli/commands/runtime_proxy_cmds.py +0 -0
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/refactorai_cli/commands/setup_cmds.py +0 -0
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/refactorai_cli/commands/toolchains_cmds.py +0 -0
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/refactorai_cli/commands/watch_cmds.py +0 -0
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/refactorai_cli/commands/workspace_cmds.py +0 -0
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/refactorai_cli/commit_queue.py +0 -0
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/refactorai_cli/commit_telemetry.py +0 -0
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/refactorai_cli/control_plane.py +0 -0
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/refactorai_cli/credentials.py +0 -0
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/refactorai_cli/dotenv_loader.py +0 -0
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/refactorai_cli/git_scope.py +0 -0
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/refactorai_cli/local_constitution.py +0 -0
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/refactorai_cli/local_engine_runtime.py +0 -0
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/refactorai_cli/local_paths.py +0 -0
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/refactorai_cli/main.py +0 -0
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/refactorai_cli/mode_sync.py +0 -0
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/refactorai_cli/model_policy.py +0 -0
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/refactorai_cli/pre_push_gate.py +0 -0
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/refactorai_cli/refactor_branch_store.py +0 -0
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/refactorai_cli/review_runner.py +0 -0
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/refactorai_cli/runtime_manager.py +0 -0
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/refactorai_cli/settings.py +0 -0
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/refactorai_cli/setup_flow.py +0 -0
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/refactorai_cli/watch_ledger.py +0 -0
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/refactorai_cli/watch_supervisor.py +0 -0
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/refactorai_cli.egg-info/SOURCES.txt +0 -0
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/refactorai_cli.egg-info/dependency_links.txt +0 -0
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/refactorai_cli.egg-info/entry_points.txt +0 -0
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/refactorai_cli.egg-info/requires.txt +0 -0
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/refactorai_cli.egg-info/top_level.txt +0 -0
- {refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/setup.cfg +0 -0
|
@@ -1795,9 +1795,21 @@ def _install_plan_for_missing_binary(
|
|
|
1795
1795
|
plan: list[str] = []
|
|
1796
1796
|
if pkg_cmd:
|
|
1797
1797
|
plan.append(pkg_cmd)
|
|
1798
|
-
# Dependency restore after toolchain install
|
|
1798
|
+
# Dependency restore after toolchain install. Use the SAME lockfile-aware
|
|
1799
|
+
# installer as the cloud/managed path (single source of truth in
|
|
1800
|
+
# ``cloud_rr._node_install_command``) so sandbox preflight never rewrites a
|
|
1801
|
+
# committed lockfile: ``npm ci`` / ``yarn install --immutable`` /
|
|
1802
|
+
# ``pnpm install --frozen-lockfile`` when a lockfile is present, falling back
|
|
1803
|
+
# to ``npm install`` only for a lockfile-less project. Historically this path
|
|
1804
|
+
# hardcoded ``npm install``, which regenerated ``package-lock.json`` /
|
|
1805
|
+
# ``yarn.lock`` in the mounted tree and left the working tree dirty (blocking
|
|
1806
|
+
# the refactor-branch flow); unifying on the lockfile-aware command removes
|
|
1807
|
+
# that divergence at the source.
|
|
1799
1808
|
if (project_root / "package.json").is_file():
|
|
1800
|
-
|
|
1809
|
+
from refactorai_cli.cloud_rr import _node_install_command
|
|
1810
|
+
|
|
1811
|
+
_, node_install_cmd = _node_install_command(project_root)
|
|
1812
|
+
plan.append(node_install_cmd)
|
|
1801
1813
|
elif (project_root / "requirements.txt").is_file():
|
|
1802
1814
|
plan.append("pip install -r requirements.txt")
|
|
1803
1815
|
return plan
|
|
@@ -3329,28 +3341,16 @@ def review(
|
|
|
3329
3341
|
sandbox_ctx = None
|
|
3330
3342
|
|
|
3331
3343
|
try:
|
|
3332
|
-
#
|
|
3333
|
-
#
|
|
3334
|
-
#
|
|
3335
|
-
# verification
|
|
3344
|
+
# Engine routing keys off engine location (docs/46). Review is *read-only*
|
|
3345
|
+
# analysis: it produces findings / refactor requests and never executes
|
|
3346
|
+
# verification (tests) locally. The container sandbox exists for that
|
|
3347
|
+
# verification during ``code`` / ``refactor``, so provisioning + preflighting
|
|
3348
|
+
# it here only added container start + ``exec`` probe latency (and could hang
|
|
3349
|
+
# on the container runtime) for zero effect on the review result — the old
|
|
3350
|
+
# ``sandbox_ctx`` was consumed solely to print a preflight warning. Sandbox
|
|
3351
|
+
# readiness is therefore enforced lazily, when code is actually applied; use
|
|
3352
|
+
# ``refactor sandbox start`` to validate the toolchain ahead of time.
|
|
3336
3353
|
engine_remote = _engine_is_remote(constitution)
|
|
3337
|
-
verify_local = _verify_local(constitution)
|
|
3338
|
-
if _sandbox_enabled(project_config):
|
|
3339
|
-
if verify_local:
|
|
3340
|
-
sandbox_ctx = _ensure_sandbox_ready(
|
|
3341
|
-
project_root=project_root,
|
|
3342
|
-
project_config=project_config,
|
|
3343
|
-
stage="review",
|
|
3344
|
-
auto_approve_install=False,
|
|
3345
|
-
no_install=False,
|
|
3346
|
-
continue_on_preflight_failure=True,
|
|
3347
|
-
)
|
|
3348
|
-
else:
|
|
3349
|
-
variant = _execution_variant(constitution)
|
|
3350
|
-
console.print(
|
|
3351
|
-
f"[dim]review: sandbox.enabled is ignored in "
|
|
3352
|
-
f"{variant} variant (verification runs in the cloud).[/dim]"
|
|
3353
|
-
)
|
|
3354
3354
|
if engine_remote:
|
|
3355
3355
|
artifact = _cloud_inference(
|
|
3356
3356
|
stage="review",
|
|
@@ -43,6 +43,10 @@ PHASE_FINALIZE = "finalize"
|
|
|
43
43
|
PHASE_DONE = "done"
|
|
44
44
|
PHASE_NONE = "none"
|
|
45
45
|
|
|
46
|
+
# Cap the live sub-step trail so a long review never overflows the node block.
|
|
47
|
+
# Older steps scroll off the top (the checklist keeps the most recent progress).
|
|
48
|
+
_MAX_SUBSTEPS = 6
|
|
49
|
+
|
|
46
50
|
|
|
47
51
|
@dataclass
|
|
48
52
|
class RRCommit:
|
|
@@ -121,9 +125,13 @@ class CommitNode:
|
|
|
121
125
|
intent_summary: str = ""
|
|
122
126
|
run_id: str = ""
|
|
123
127
|
error: str = ""
|
|
124
|
-
# Live sub-step
|
|
125
|
-
#
|
|
128
|
+
# Live sub-step trail while REVIEWING, oldest first (e.g. "resolving scope",
|
|
129
|
+
# "reviewing batch 2/5", "security scan"). Rendered as a Cursor-style
|
|
130
|
+
# checklist: completed steps ticked, the last one spinning. Volatile UI-only
|
|
131
|
+
# detail; not part of the persisted node contract. ``substep`` mirrors the
|
|
132
|
+
# current (last) step for the compact single-line status fallback.
|
|
126
133
|
substep: str = ""
|
|
134
|
+
substeps: list[str] = field(default_factory=list)
|
|
127
135
|
finalize: "FinalizeInfo | None" = None
|
|
128
136
|
|
|
129
137
|
@property
|
|
@@ -275,16 +283,24 @@ class WatchState:
|
|
|
275
283
|
if node:
|
|
276
284
|
node.state = REVIEWING
|
|
277
285
|
node.substep = ""
|
|
286
|
+
node.substeps = []
|
|
278
287
|
|
|
279
288
|
def set_substep(self, sha: str, label: str) -> None:
|
|
280
|
-
"""
|
|
289
|
+
"""Append a new live sub-step to a reviewing node's trail (UI-only).
|
|
281
290
|
|
|
282
|
-
|
|
283
|
-
|
|
291
|
+
Consecutive duplicates are collapsed and the trail is capped at
|
|
292
|
+
:data:`_MAX_SUBSTEPS` (oldest scroll off). No-op unless the node is
|
|
293
|
+
currently ``REVIEWING`` so a stale progress line can never mutate a
|
|
294
|
+
finished node.
|
|
284
295
|
"""
|
|
285
296
|
node = self._nodes.get(sha)
|
|
286
|
-
if node and node.state == REVIEWING:
|
|
287
|
-
|
|
297
|
+
if not (node and node.state == REVIEWING):
|
|
298
|
+
return
|
|
299
|
+
if not node.substeps or node.substeps[-1] != label:
|
|
300
|
+
node.substeps.append(label)
|
|
301
|
+
if len(node.substeps) > _MAX_SUBSTEPS:
|
|
302
|
+
node.substeps = node.substeps[-_MAX_SUBSTEPS:]
|
|
303
|
+
node.substep = label
|
|
288
304
|
|
|
289
305
|
def requeue(self, sha: str) -> None:
|
|
290
306
|
"""Reset a node to ``queued`` so the next pass re-reviews it (post-resolve)."""
|
|
@@ -297,6 +313,7 @@ class WatchState:
|
|
|
297
313
|
node.rr_preview = []
|
|
298
314
|
node.error = ""
|
|
299
315
|
node.substep = ""
|
|
316
|
+
node.substeps = []
|
|
300
317
|
node.finalize = None
|
|
301
318
|
self.forced_review.discard(sha)
|
|
302
319
|
|
|
@@ -554,10 +571,29 @@ def _render_review_view(state: WatchState, *, now: datetime | None = None, width
|
|
|
554
571
|
row2 = Text.from_markup(f"[cyan]|[/cyan] [yellow]{node.short_sha}[/yellow] ")
|
|
555
572
|
row2.append(node.subject or "(no subject)")
|
|
556
573
|
node_lines.append(row2)
|
|
557
|
-
# Row 3:
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
574
|
+
# Row 3: while reviewing, render a Cursor-style checklist of sub-steps
|
|
575
|
+
# (completed steps ticked, the current one spinning) so progress reads as
|
|
576
|
+
# advancing work instead of a single overwritten line. Falls back to the
|
|
577
|
+
# compact status line before the first step arrives / for other states.
|
|
578
|
+
if node.state == REVIEWING and node.substeps:
|
|
579
|
+
spinner = _spinner_frame(now)
|
|
580
|
+
last = len(node.substeps) - 1
|
|
581
|
+
for idx, label in enumerate(node.substeps):
|
|
582
|
+
row = Text.from_markup("[cyan]|[/cyan] ")
|
|
583
|
+
if idx == last:
|
|
584
|
+
row.append_text(Text.from_markup(f"[cyan]{spinner}[/cyan] "))
|
|
585
|
+
row.append(label)
|
|
586
|
+
if node.changed:
|
|
587
|
+
row.append(f" ({node.changed} files)", style="dim")
|
|
588
|
+
row.append(" …", style="dim")
|
|
589
|
+
else:
|
|
590
|
+
row.append_text(Text.from_markup("[green]✓[/green] "))
|
|
591
|
+
row.append(label, style="dim")
|
|
592
|
+
node_lines.append(row)
|
|
593
|
+
else:
|
|
594
|
+
row3 = Text.from_markup("[cyan]|[/cyan] ")
|
|
595
|
+
row3.append_text(Text.from_markup(_status_line(node)))
|
|
596
|
+
node_lines.append(row3)
|
|
561
597
|
if node.state == REVIEWED and node.rr_preview:
|
|
562
598
|
for item in node.rr_preview:
|
|
563
599
|
req = Text.from_markup("[cyan]|[/cyan] ")
|
|
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
|
{refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/refactorai_cli/commands/runtime_proxy_cmds.py
RENAMED
|
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
|
|
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
|
{refactorai_cli-0.7.20 → refactorai_cli-0.7.23}/refactorai_cli.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|