nexus-dev-toolkit 3.1.8__tar.gz → 3.1.9__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.
- {nexus_dev_toolkit-3.1.8/nexus_dev_toolkit.egg-info → nexus_dev_toolkit-3.1.9}/PKG-INFO +1 -1
- {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/nexus_cli.py +18 -1
- {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9/nexus_dev_toolkit.egg-info}/PKG-INFO +1 -1
- {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/pyproject.toml +1 -1
- {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tests/test_cli.py +37 -0
- {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/LICENSE +0 -0
- {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/README.md +0 -0
- {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/nexus_dev_toolkit.egg-info/SOURCES.txt +0 -0
- {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/nexus_dev_toolkit.egg-info/dependency_links.txt +0 -0
- {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/nexus_dev_toolkit.egg-info/entry_points.txt +0 -0
- {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/nexus_dev_toolkit.egg-info/requires.txt +0 -0
- {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/nexus_dev_toolkit.egg-info/top_level.txt +0 -0
- {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/nexus_server.py +0 -0
- {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/setup.cfg +0 -0
- {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tests/test_server.py +0 -0
- {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/__init__.py +0 -0
- {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/agents/__init__.py +0 -0
- {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/agents/code-reviewer.md +0 -0
- {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/agents/database-reviewer.md +0 -0
- {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/agents/deployment-reviewer.md +0 -0
- {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/agents/monitoring-reviewer.md +0 -0
- {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/agents/performance-reviewer.md +0 -0
- {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/agents/pr-verifier.md +0 -0
- {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/epav/__init__.py +0 -0
- {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/epav/arch_ingest.py +0 -0
- {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/epav/graph_backend.py +0 -0
- {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/epav/package_resolver.py +0 -0
- {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/epav/project_rules.py +0 -0
- {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/epav/skills/__init__.py +0 -0
- {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/epav/skills/apply.md +0 -0
- {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/epav/skills/code-review.md +0 -0
- {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/epav/skills/commit.md +0 -0
- {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/epav/skills/create-pr.md +0 -0
- {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/epav/skills/database-review.md +0 -0
- {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/epav/skills/deployment-review.md +0 -0
- {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/epav/skills/dev-tasks-planner.md +0 -0
- {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/epav/skills/epav.md +0 -0
- {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/epav/skills/evaluate.md +0 -0
- {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/epav/skills/monitoring-review.md +0 -0
- {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/epav/skills/performance-review.md +0 -0
- {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/epav/skills/plan.md +0 -0
- {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/epav/skills/pr-review.md +0 -0
- {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/epav/skills/scaffold.md +0 -0
- {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/epav/skills/validate.md +0 -0
- {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/epav/task_loader.py +0 -0
|
@@ -22,7 +22,7 @@ app.add_typer(agent_app, name="agent")
|
|
|
22
22
|
|
|
23
23
|
console = Console()
|
|
24
24
|
|
|
25
|
-
_VERSION = "3.1.
|
|
25
|
+
_VERSION = "3.1.9"
|
|
26
26
|
|
|
27
27
|
|
|
28
28
|
def _fetch_latest_pypi_version() -> str | None:
|
|
@@ -430,6 +430,7 @@ def update(
|
|
|
430
430
|
) -> None:
|
|
431
431
|
"""Update nexus-dev-toolkit to the latest version."""
|
|
432
432
|
latest_version = _fetch_latest_pypi_version()
|
|
433
|
+
upgraded = False
|
|
433
434
|
if latest_version and not _is_outdated(_VERSION, latest_version):
|
|
434
435
|
console.print(f"\n [green]✓[/green] Already up to date (v{_VERSION}).\n")
|
|
435
436
|
else:
|
|
@@ -439,6 +440,7 @@ def update(
|
|
|
439
440
|
else:
|
|
440
441
|
subprocess.run([sys.executable, "-m", "pip", "install", "--upgrade", "nexus-dev-toolkit"])
|
|
441
442
|
console.print("\n [green]✓[/green] Done.\n")
|
|
443
|
+
upgraded = True
|
|
442
444
|
|
|
443
445
|
if not also_sync:
|
|
444
446
|
if sys.stdin.isatty():
|
|
@@ -454,6 +456,21 @@ def update(
|
|
|
454
456
|
return
|
|
455
457
|
|
|
456
458
|
root = Path(".").resolve()
|
|
459
|
+
|
|
460
|
+
if upgraded:
|
|
461
|
+
# This process's own _BUILTIN_SKILLS/_BUILTIN_AGENTS were imported before the upgrade
|
|
462
|
+
# subprocess above ran, so syncing in-process here would silently miss anything newly
|
|
463
|
+
# added in the version just installed. Re-exec `nexus sync` as a fresh process instead.
|
|
464
|
+
nexus_bin = shutil.which("nexus")
|
|
465
|
+
if nexus_bin:
|
|
466
|
+
subprocess.run([nexus_bin, "sync", str(root)])
|
|
467
|
+
return
|
|
468
|
+
console.print(
|
|
469
|
+
" [yellow]⚠[/yellow] Couldn't find [bold]nexus[/bold] on PATH to re-run sync in a fresh "
|
|
470
|
+
"process — syncing in-process instead, which may miss anything added in this exact "
|
|
471
|
+
"upgrade. Run [cyan]nexus sync[/cyan] again afterward to be sure.\n"
|
|
472
|
+
)
|
|
473
|
+
|
|
457
474
|
table = _sync_project(root)
|
|
458
475
|
if table is None:
|
|
459
476
|
console.print(" [yellow]⚠[/yellow] Current directory isn't a nexus project — skipping sync.\n")
|
|
@@ -367,6 +367,43 @@ def test_update_with_sync_flag_syncs_current_project(monkeypatch, tmp_project):
|
|
|
367
367
|
assert "scaffold.md" in output
|
|
368
368
|
|
|
369
369
|
|
|
370
|
+
def test_update_with_sync_flag_reexecs_sync_after_real_upgrade(monkeypatch, tmp_project):
|
|
371
|
+
"""After an actual upgrade, sync must run as a fresh `nexus sync` process, not in-process —
|
|
372
|
+
this process's own _BUILTIN_SKILLS/_BUILTIN_AGENTS were imported before the upgrade ran, so
|
|
373
|
+
calling _sync_project() directly here would silently miss anything the upgrade just added."""
|
|
374
|
+
import nexus_cli
|
|
375
|
+
monkeypatch.setattr("nexus_cli._fetch_latest_pypi_version", lambda: "99.0.0")
|
|
376
|
+
calls = []
|
|
377
|
+
monkeypatch.setattr("nexus_cli.subprocess.run", lambda cmd, *a, **k: calls.append(cmd))
|
|
378
|
+
monkeypatch.setattr("nexus_cli.shutil.which", lambda name: f"/usr/bin/{name}")
|
|
379
|
+
|
|
380
|
+
def _boom(root):
|
|
381
|
+
raise AssertionError("_sync_project must not run in-process after a real upgrade")
|
|
382
|
+
monkeypatch.setattr("nexus_cli._sync_project", _boom)
|
|
383
|
+
|
|
384
|
+
runner.invoke(app, ["init", str(tmp_project)])
|
|
385
|
+
monkeypatch.chdir(tmp_project)
|
|
386
|
+
result = runner.invoke(app, ["update", "--sync"])
|
|
387
|
+
|
|
388
|
+
assert result.exit_code == 0
|
|
389
|
+
assert calls[0] == ["uv", "tool", "upgrade", "nexus-dev-toolkit"]
|
|
390
|
+
assert calls[1] == ["/usr/bin/nexus", "sync", str(tmp_project.resolve())]
|
|
391
|
+
|
|
392
|
+
|
|
393
|
+
def test_update_sync_falls_back_in_process_when_nexus_not_on_path(monkeypatch, tmp_project):
|
|
394
|
+
import nexus_cli
|
|
395
|
+
monkeypatch.setattr("nexus_cli._fetch_latest_pypi_version", lambda: "99.0.0")
|
|
396
|
+
monkeypatch.setattr("nexus_cli.subprocess.run", lambda *a, **k: None)
|
|
397
|
+
monkeypatch.setattr("nexus_cli.shutil.which", lambda name: "/usr/bin/uv" if name == "uv" else None)
|
|
398
|
+
runner.invoke(app, ["init", str(tmp_project)])
|
|
399
|
+
monkeypatch.chdir(tmp_project)
|
|
400
|
+
result = runner.invoke(app, ["update", "--sync"])
|
|
401
|
+
assert result.exit_code == 0
|
|
402
|
+
output = _flat(result.output)
|
|
403
|
+
assert "Syncing built-ins" in output
|
|
404
|
+
assert "scaffold.md" in output
|
|
405
|
+
|
|
406
|
+
|
|
370
407
|
class _FakeTTY:
|
|
371
408
|
def isatty(self):
|
|
372
409
|
return True
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/nexus_dev_toolkit.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
{nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/nexus_dev_toolkit.egg-info/entry_points.txt
RENAMED
|
File without changes
|
|
File without changes
|
{nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/nexus_dev_toolkit.egg-info/top_level.txt
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|