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.
Files changed (45) hide show
  1. {nexus_dev_toolkit-3.1.8/nexus_dev_toolkit.egg-info → nexus_dev_toolkit-3.1.9}/PKG-INFO +1 -1
  2. {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/nexus_cli.py +18 -1
  3. {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9/nexus_dev_toolkit.egg-info}/PKG-INFO +1 -1
  4. {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/pyproject.toml +1 -1
  5. {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tests/test_cli.py +37 -0
  6. {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/LICENSE +0 -0
  7. {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/README.md +0 -0
  8. {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/nexus_dev_toolkit.egg-info/SOURCES.txt +0 -0
  9. {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/nexus_dev_toolkit.egg-info/dependency_links.txt +0 -0
  10. {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/nexus_dev_toolkit.egg-info/entry_points.txt +0 -0
  11. {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/nexus_dev_toolkit.egg-info/requires.txt +0 -0
  12. {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/nexus_dev_toolkit.egg-info/top_level.txt +0 -0
  13. {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/nexus_server.py +0 -0
  14. {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/setup.cfg +0 -0
  15. {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tests/test_server.py +0 -0
  16. {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/__init__.py +0 -0
  17. {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/agents/__init__.py +0 -0
  18. {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/agents/code-reviewer.md +0 -0
  19. {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/agents/database-reviewer.md +0 -0
  20. {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/agents/deployment-reviewer.md +0 -0
  21. {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/agents/monitoring-reviewer.md +0 -0
  22. {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/agents/performance-reviewer.md +0 -0
  23. {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/agents/pr-verifier.md +0 -0
  24. {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/epav/__init__.py +0 -0
  25. {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/epav/arch_ingest.py +0 -0
  26. {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/epav/graph_backend.py +0 -0
  27. {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/epav/package_resolver.py +0 -0
  28. {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/epav/project_rules.py +0 -0
  29. {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/epav/skills/__init__.py +0 -0
  30. {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/epav/skills/apply.md +0 -0
  31. {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/epav/skills/code-review.md +0 -0
  32. {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/epav/skills/commit.md +0 -0
  33. {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/epav/skills/create-pr.md +0 -0
  34. {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/epav/skills/database-review.md +0 -0
  35. {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/epav/skills/deployment-review.md +0 -0
  36. {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/epav/skills/dev-tasks-planner.md +0 -0
  37. {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/epav/skills/epav.md +0 -0
  38. {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/epav/skills/evaluate.md +0 -0
  39. {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/epav/skills/monitoring-review.md +0 -0
  40. {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/epav/skills/performance-review.md +0 -0
  41. {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/epav/skills/plan.md +0 -0
  42. {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/epav/skills/pr-review.md +0 -0
  43. {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/epav/skills/scaffold.md +0 -0
  44. {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/epav/skills/validate.md +0 -0
  45. {nexus_dev_toolkit-3.1.8 → nexus_dev_toolkit-3.1.9}/tools/epav/task_loader.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nexus-dev-toolkit
3
- Version: 3.1.8
3
+ Version: 3.1.9
4
4
  Summary: Developer workflow toolkit for Claude Code — Day 0 scaffold + Day 1 EPAV
5
5
  Author-email: Ronald dela Cruz <rcdelacruz@users.noreply.github.com>
6
6
  License-Expression: MIT
@@ -22,7 +22,7 @@ app.add_typer(agent_app, name="agent")
22
22
 
23
23
  console = Console()
24
24
 
25
- _VERSION = "3.1.8"
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")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nexus-dev-toolkit
3
- Version: 3.1.8
3
+ Version: 3.1.9
4
4
  Summary: Developer workflow toolkit for Claude Code — Day 0 scaffold + Day 1 EPAV
5
5
  Author-email: Ronald dela Cruz <rcdelacruz@users.noreply.github.com>
6
6
  License-Expression: MIT
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "nexus-dev-toolkit"
3
- version = "3.1.8"
3
+ version = "3.1.9"
4
4
  description = "Developer workflow toolkit for Claude Code — Day 0 scaffold + Day 1 EPAV"
5
5
  authors = [
6
6
  {name = "Ronald dela Cruz", email = "rcdelacruz@users.noreply.github.com"}
@@ -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