homeconsole-cli 0.0.7__tar.gz → 0.0.8__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 (66) hide show
  1. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/PKG-INFO +1 -1
  2. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/env.py +75 -3
  3. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/homeconsole_cli.egg-info/PKG-INFO +1 -1
  4. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/pyproject.toml +1 -1
  5. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/README.md +0 -0
  6. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/__init__.py +0 -0
  7. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/api.py +0 -0
  8. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/capabilities.py +0 -0
  9. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/client.py +0 -0
  10. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/__init__.py +0 -0
  11. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/_client_helpers.py +0 -0
  12. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/_compose_helpers.py +0 -0
  13. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/auth.py +0 -0
  14. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/connect.py +0 -0
  15. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/core.py +0 -0
  16. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/deploy.py +0 -0
  17. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/doctor.py +0 -0
  18. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/install.py +0 -0
  19. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/logs.py +0 -0
  20. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/marketplace.py +0 -0
  21. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/module.py +0 -0
  22. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/ping.py +0 -0
  23. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/plugin.py +0 -0
  24. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/recovery/__init__.py +0 -0
  25. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/recovery/compose.py +0 -0
  26. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/recovery/config.py +0 -0
  27. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/recovery/core.py +0 -0
  28. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/recovery/db.py +0 -0
  29. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/recovery/mode.py +0 -0
  30. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/recovery/redis.py +0 -0
  31. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/recovery/ui.py +0 -0
  32. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/remove.py +0 -0
  33. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/reset.py +0 -0
  34. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/search.py +0 -0
  35. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/secrets.py +0 -0
  36. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/setup.py +0 -0
  37. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/setup_wizard.py +0 -0
  38. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/status.py +0 -0
  39. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/update.py +0 -0
  40. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/config.py +0 -0
  41. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/constants.py +0 -0
  42. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/core_ops.py +0 -0
  43. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/core_source.py +0 -0
  44. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/env_bootstrap.py +0 -0
  45. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/errors.py +0 -0
  46. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/main.py +0 -0
  47. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/marketplace_operation.py +0 -0
  48. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/native_core.py +0 -0
  49. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/repl.py +0 -0
  50. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/setup_runner.py +0 -0
  51. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/shell.py +0 -0
  52. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/update_check.py +0 -0
  53. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/homeconsole_cli.egg-info/SOURCES.txt +0 -0
  54. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/homeconsole_cli.egg-info/dependency_links.txt +0 -0
  55. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/homeconsole_cli.egg-info/entry_points.txt +0 -0
  56. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/homeconsole_cli.egg-info/requires.txt +0 -0
  57. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/homeconsole_cli.egg-info/top_level.txt +0 -0
  58. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/setup.cfg +0 -0
  59. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/tests/test_config_roundtrip.py +0 -0
  60. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/tests/test_core_ops.py +0 -0
  61. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/tests/test_env_bootstrap.py +0 -0
  62. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/tests/test_main_root_callback.py +0 -0
  63. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/tests/test_marketplace_operation_parse.py +0 -0
  64. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/tests/test_native_core_helpers.py +0 -0
  65. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/tests/test_nav_cli.py +0 -0
  66. {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/tests/test_setup_runner.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: homeconsole-cli
3
- Version: 0.0.7
3
+ Version: 0.0.8
4
4
  Summary: HomeConsole CLI (hc) — управление платформой через HTTP API
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -212,6 +212,47 @@ def _get_running_services(compose_file: Path, cwd: Path) -> set[str]:
212
212
  return set()
213
213
 
214
214
 
215
+ def _warn_orphan_volumes(console: Console, cwd: Path) -> None:
216
+ """After down -v, check for volumes that compose didn't remove (not in top-level volumes:)."""
217
+ try:
218
+ r = subprocess.run( # noqa: S603
219
+ ["docker", "volume", "ls", "--format", "{{.Name}}"],
220
+ capture_output=True, text=True, check=False, timeout=5,
221
+ )
222
+ project = cwd.name # compose project name = directory name
223
+ orphans = [
224
+ v for v in r.stdout.splitlines()
225
+ if v.startswith(f"{project}_") or v.startswith("dev_")
226
+ ]
227
+ if orphans:
228
+ console.print(f"[yellow]![/yellow] Volumes не удалены (нет в top-level volumes секции compose):")
229
+ for v in orphans:
230
+ console.print(f" [dim]docker volume rm {v}[/dim]")
231
+ except Exception: # noqa: BLE001
232
+ pass
233
+
234
+
235
+ def _detect_active_profiles(running: set[str]) -> set[str]:
236
+ """Return compose profiles that have at least one running container."""
237
+ profiles: set[str] = set()
238
+ for svcs in _SERVICES.values():
239
+ for s in svcs:
240
+ if s.compose_profile and s.name in running:
241
+ profiles.add(s.compose_profile)
242
+ for opt in _DB_OPTIONS:
243
+ if opt.compose_profile and opt.service and opt.service in running:
244
+ profiles.add(opt.compose_profile)
245
+ return profiles
246
+
247
+
248
+ def _detect_active_db(running: set[str]) -> str:
249
+ """Return the DB key ('postgres' | 'sqlite') based on running containers."""
250
+ for opt in _DB_OPTIONS:
251
+ if opt.service and opt.service in running:
252
+ return opt.key
253
+ return "sqlite"
254
+
255
+
215
256
  def _pick_services_interactive(available: list[_Svc], running: set[str]) -> list[_Svc]:
216
257
  try:
217
258
  import questionary
@@ -520,7 +561,7 @@ def register(app: typer.Typer) -> None:
520
561
  mode: str = typer.Option(_MODE_DEFAULT, "--mode", "-m", help=_MODE_HELP),
521
562
  volumes: bool = typer.Option(False, "--volumes", "-v", help="Удалить volumes (БД, кэш)"),
522
563
  ) -> None:
523
- """Остановить dev-окружение."""
564
+ """Остановить dev-окружение (автоматически определяет активные профили)."""
524
565
  console = Console()
525
566
  try:
526
567
  require_docker(console)
@@ -528,13 +569,44 @@ def register(app: typer.Typer) -> None:
528
569
  src = _resolve_source(console)
529
570
  project = compose_project_from_source(console, src, mode=mode)
530
571
 
531
- console.print(f"[cyan]→[/cyan] env down mode=[bold]{mode}[/bold]")
532
- cmd = ["docker", "compose", "-f", str(project.compose_file), "down"]
572
+ # Detect which profiles are actually running so we stop them too.
573
+ running = _get_running_services(project.compose_file, project.cwd)
574
+ active_profiles = _detect_active_profiles(running)
575
+ active_db = _detect_active_db(running)
576
+
577
+ profile_hint = f" profiles=[bold]{', '.join(sorted(active_profiles))}[/bold]" if active_profiles else ""
578
+ console.print(f"[cyan]→[/cyan] env down mode=[bold]{mode}[/bold] db=[bold]{active_db}[/bold]{profile_hint}")
579
+
580
+ cmd = ["docker", "compose", "-f", str(project.compose_file)]
581
+ for profile in sorted(active_profiles):
582
+ cmd += ["--profile", profile]
583
+ cmd.append("down")
584
+
533
585
  if volumes:
586
+ if active_db == "sqlite" and sys.stdin.isatty():
587
+ console.print(
588
+ "[yellow]![/yellow] SQLite хранит данные в volume [bold]core-data[/bold] — "
589
+ "они будут удалены вместе с остальными volumes."
590
+ )
591
+ try:
592
+ import questionary
593
+ confirmed = questionary.confirm(
594
+ "Удалить volumes (данные SQLite будут потеряны)?",
595
+ default=False,
596
+ ).ask()
597
+ except ImportError:
598
+ confirmed = True
599
+ if not confirmed:
600
+ console.print("[dim]Volumes оставлены.[/dim]")
601
+ raise typer.Exit(code=0)
534
602
  cmd.append("-v")
603
+
535
604
  _run(cmd, cwd=project.cwd)
536
605
  console.print("[green]✓[/green] env down ok")
537
606
 
607
+ if volumes:
608
+ _warn_orphan_volumes(console, project.cwd)
609
+
538
610
  except HcCliError as e:
539
611
  console.print(f"[red]Ошибка:[/red] {e.message}")
540
612
  if e.hint:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: homeconsole-cli
3
- Version: 0.0.7
3
+ Version: 0.0.8
4
4
  Summary: HomeConsole CLI (hc) — управление платформой через HTTP API
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "homeconsole-cli"
3
- version = "0.0.7"
3
+ version = "0.0.8"
4
4
  description = "HomeConsole CLI (hc) — управление платформой через HTTP API"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"