houdini-agent-panel 0.1.0__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 (74) hide show
  1. houdini_agent_panel-0.1.0/LICENSE +21 -0
  2. houdini_agent_panel-0.1.0/PKG-INFO +117 -0
  3. houdini_agent_panel-0.1.0/README.md +89 -0
  4. houdini_agent_panel-0.1.0/pyproject.toml +64 -0
  5. houdini_agent_panel-0.1.0/python/houdini_agent_panel/__init__.py +5 -0
  6. houdini_agent_panel-0.1.0/python/houdini_agent_panel/__main__.py +112 -0
  7. houdini_agent_panel-0.1.0/python/houdini_agent_panel/announcements.py +313 -0
  8. houdini_agent_panel-0.1.0/python/houdini_agent_panel/client.py +732 -0
  9. houdini_agent_panel-0.1.0/python/houdini_agent_panel/deps.py +203 -0
  10. houdini_agent_panel-0.1.0/python/houdini_agent_panel/houdini/python3.11libs/uiready.py +51 -0
  11. houdini_agent_panel-0.1.0/python/houdini_agent_panel/houdini/python3.13libs/uiready.py +51 -0
  12. houdini_agent_panel-0.1.0/python/houdini_agent_panel/houdini/python_panels/houdini_agent.pypanel +92 -0
  13. houdini_agent_panel-0.1.0/python/houdini_agent_panel/houdini_package.py +105 -0
  14. houdini_agent_panel-0.1.0/python/houdini_agent_panel/install.py +295 -0
  15. houdini_agent_panel-0.1.0/python/houdini_agent_panel/network.py +134 -0
  16. houdini_agent_panel-0.1.0/python/houdini_agent_panel/node.py +214 -0
  17. houdini_agent_panel-0.1.0/python/houdini_agent_panel/paths.py +102 -0
  18. houdini_agent_panel-0.1.0/python/houdini_agent_panel/refresh.py +92 -0
  19. houdini_agent_panel-0.1.0/python/houdini_agent_panel/registry.py +304 -0
  20. houdini_agent_panel-0.1.0/python/houdini_agent_panel/runtime.py +400 -0
  21. houdini_agent_panel-0.1.0/python/houdini_agent_panel/scene.py +164 -0
  22. houdini_agent_panel-0.1.0/python/houdini_agent_panel/sessions.py +139 -0
  23. houdini_agent_panel-0.1.0/python/houdini_agent_panel/settings.py +208 -0
  24. houdini_agent_panel-0.1.0/python/houdini_agent_panel/telemetry.py +140 -0
  25. houdini_agent_panel-0.1.0/python/houdini_agent_panel/transcript_model.py +192 -0
  26. houdini_agent_panel-0.1.0/python/houdini_agent_panel/ui/__init__.py +0 -0
  27. houdini_agent_panel-0.1.0/python/houdini_agent_panel/ui/agents.py +339 -0
  28. houdini_agent_panel-0.1.0/python/houdini_agent_panel/ui/announcement.py +203 -0
  29. houdini_agent_panel-0.1.0/python/houdini_agent_panel/ui/auth_view.py +71 -0
  30. houdini_agent_panel-0.1.0/python/houdini_agent_panel/ui/chips.py +148 -0
  31. houdini_agent_panel-0.1.0/python/houdini_agent_panel/ui/composer.py +477 -0
  32. houdini_agent_panel-0.1.0/python/houdini_agent_panel/ui/panel.py +636 -0
  33. houdini_agent_panel-0.1.0/python/houdini_agent_panel/ui/permissions.py +97 -0
  34. houdini_agent_panel-0.1.0/python/houdini_agent_panel/ui/qt.py +58 -0
  35. houdini_agent_panel-0.1.0/python/houdini_agent_panel/ui/settings_view.py +141 -0
  36. houdini_agent_panel-0.1.0/python/houdini_agent_panel/ui/theme.py +154 -0
  37. houdini_agent_panel-0.1.0/python/houdini_agent_panel/ui/transcript.py +447 -0
  38. houdini_agent_panel-0.1.0/python/houdini_agent_panel/ui/voice.py +290 -0
  39. houdini_agent_panel-0.1.0/python/houdini_agent_panel/updates.py +325 -0
  40. houdini_agent_panel-0.1.0/python/houdini_agent_panel.egg-info/PKG-INFO +117 -0
  41. houdini_agent_panel-0.1.0/python/houdini_agent_panel.egg-info/SOURCES.txt +72 -0
  42. houdini_agent_panel-0.1.0/python/houdini_agent_panel.egg-info/dependency_links.txt +1 -0
  43. houdini_agent_panel-0.1.0/python/houdini_agent_panel.egg-info/entry_points.txt +2 -0
  44. houdini_agent_panel-0.1.0/python/houdini_agent_panel.egg-info/requires.txt +8 -0
  45. houdini_agent_panel-0.1.0/python/houdini_agent_panel.egg-info/top_level.txt +1 -0
  46. houdini_agent_panel-0.1.0/setup.cfg +4 -0
  47. houdini_agent_panel-0.1.0/tests/test_announcements.py +222 -0
  48. houdini_agent_panel-0.1.0/tests/test_announcements_url.py +35 -0
  49. houdini_agent_panel-0.1.0/tests/test_client.py +447 -0
  50. houdini_agent_panel-0.1.0/tests/test_deps.py +290 -0
  51. houdini_agent_panel-0.1.0/tests/test_houdini_package.py +125 -0
  52. houdini_agent_panel-0.1.0/tests/test_install.py +309 -0
  53. houdini_agent_panel-0.1.0/tests/test_network.py +56 -0
  54. houdini_agent_panel-0.1.0/tests/test_node.py +275 -0
  55. houdini_agent_panel-0.1.0/tests/test_node_path.py +36 -0
  56. houdini_agent_panel-0.1.0/tests/test_pypanel.py +153 -0
  57. houdini_agent_panel-0.1.0/tests/test_refresh.py +124 -0
  58. houdini_agent_panel-0.1.0/tests/test_registry.py +228 -0
  59. houdini_agent_panel-0.1.0/tests/test_runtime.py +360 -0
  60. houdini_agent_panel-0.1.0/tests/test_scene.py +167 -0
  61. houdini_agent_panel-0.1.0/tests/test_sessions.py +121 -0
  62. houdini_agent_panel-0.1.0/tests/test_telemetry.py +158 -0
  63. houdini_agent_panel-0.1.0/tests/test_transcript_model.py +184 -0
  64. houdini_agent_panel-0.1.0/tests/test_ui_agents.py +170 -0
  65. houdini_agent_panel-0.1.0/tests/test_ui_announcement.py +125 -0
  66. houdini_agent_panel-0.1.0/tests/test_ui_auth.py +76 -0
  67. houdini_agent_panel-0.1.0/tests/test_ui_chips.py +131 -0
  68. houdini_agent_panel-0.1.0/tests/test_ui_composer.py +406 -0
  69. houdini_agent_panel-0.1.0/tests/test_ui_panel.py +323 -0
  70. houdini_agent_panel-0.1.0/tests/test_ui_permissions.py +97 -0
  71. houdini_agent_panel-0.1.0/tests/test_ui_settings.py +91 -0
  72. houdini_agent_panel-0.1.0/tests/test_ui_transcript.py +361 -0
  73. houdini_agent_panel-0.1.0/tests/test_updates.py +219 -0
  74. houdini_agent_panel-0.1.0/tests/test_version.py +23 -0
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 MAY4VFX
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,117 @@
1
+ Metadata-Version: 2.4
2
+ Name: houdini-agent-panel
3
+ Version: 0.1.0
4
+ Summary: Панель-чат с ACP-агентом внутри SideFX Houdini поверх fxhoudinimcp
5
+ Author: MAY4VFX
6
+ License: MIT
7
+ Project-URL: Homepage, https://github.com/MAY4VFX/houdini-agent-panel
8
+ Project-URL: Issues, https://github.com/MAY4VFX/houdini-agent-panel/issues
9
+ Keywords: houdini,vfx,acp,agent,mcp
10
+ Classifier: License :: OSI Approved :: MIT License
11
+ Classifier: Programming Language :: Python :: 3.10
12
+ Classifier: Programming Language :: Python :: 3.11
13
+ Classifier: Programming Language :: Python :: 3.12
14
+ Classifier: Programming Language :: Python :: 3.13
15
+ Classifier: Intended Audience :: End Users/Desktop
16
+ Classifier: Topic :: Multimedia :: Graphics :: 3D Modeling
17
+ Requires-Python: <3.15,>=3.10
18
+ Description-Content-Type: text/markdown
19
+ License-File: LICENSE
20
+ Requires-Dist: agent-client-protocol<0.13,>=0.12
21
+ Requires-Dist: fxhoudinimcp>=2.10
22
+ Requires-Dist: certifi
23
+ Provides-Extra: dev
24
+ Requires-Dist: pytest>=8; extra == "dev"
25
+ Requires-Dist: pytest-asyncio>=0.24; extra == "dev"
26
+ Requires-Dist: PySide6>=6.5; extra == "dev"
27
+ Dynamic: license-file
28
+
29
+ # houdini-agent-panel
30
+
31
+ Панель-чат с AI-агентом внутри SideFX Houdini. Ставится одной командой, агент
32
+ поднимается сам — ни терминала, ни портов, ни правки конфигов.
33
+
34
+ > Статус: v1 в сборке. Дизайн — [`docs/design.md`](docs/design.md), контракт модулей —
35
+ > [`docs/architecture.md`](docs/architecture.md), проверенные факты о внешних API —
36
+ > [`docs/facts/`](docs/facts/).
37
+
38
+ ## Зачем
39
+
40
+ Чтобы сегодня пользоваться агентом со сценой Houdini, нужен открытый терминал с `claude`
41
+ и настройка MCP руками. Художник этого не сделает.
42
+
43
+ Панель — надстройка над [fxhoudinimcp](https://github.com/healkeiser/fxhoudinimcp)
44
+ (189 инструментов работы со сценой поверх официального `hwebserver` Houdini). Мы не
45
+ пишем ни агента, ни инструменты — только ACP-клиент и инсталлятор, связывающие готовое.
46
+
47
+ ## Агенты
48
+
49
+ Из официального [реестра ACP](https://github.com/agentclientprotocol/registry):
50
+ Claude Agent, Codex, Gemini CLI, Grok Build, Kimi CLI, OpenCode — плюс «Свой агент»
51
+ для всего остального. Ставится только выбранный, а не все сразу. Node, если нужен,
52
+ панель приносит с собой.
53
+
54
+ Свои и удалённые модели подключаются как модель внутри OpenCode: ACP работает только
55
+ через stdio, поэтому агент всегда локальный, а эндпоинт модели может быть где угодно.
56
+
57
+ ## Установка
58
+
59
+ Одной командой, одинаково на macOS, Linux и Windows:
60
+
61
+ ```bash
62
+ uvx --from houdini-agent-panel python -m houdini_agent_panel install --agents opencode
63
+ ```
64
+
65
+ Она находит все установленные Houdini, ставит панель в Python каждой из них,
66
+ прописывает пакет и качает выбранного агента. В систему ничего не попадает:
67
+ `uvx` запускает инсталлятор и уходит.
68
+
69
+ Нет `uv`? Он ставится тоже одной командой и не требует прав root:
70
+
71
+ ```bash
72
+ curl -LsSf https://astral.sh/uv/install.sh | sh # macOS, Linux
73
+ powershell -c "irm https://astral.sh/uv/install.ps1 | iex" # Windows
74
+ ```
75
+
76
+ В репозитории лежат `scripts/install.sh` и `scripts/install.ps1` — они делают
77
+ оба шага сразу и пригодятся, когда репозиторий станет публичным и их можно
78
+ будет вызывать через `curl … | sh`.
79
+
80
+ Перезапустить Houdini → панель появится в меню панелей (Tab → Python Panels → Agent).
81
+
82
+ Инсталлятор находит на машине все установленные Houdini и для каждой ставит панель
83
+ **в её собственный Python**. Это не прихоть: `pydantic` тащит скомпилированное ядро, а у
84
+ Houdini 20.5 внутри Python 3.11 и у Houdini 22 — 3.13, так что одно общее дерево
85
+ зависимостей на обе версии физически невозможно. Подробности — в
86
+ [`docs/architecture.md`](docs/architecture.md) §0.
87
+
88
+ Полезное:
89
+
90
+ ```bash
91
+ python -m houdini_agent_panel install --dry-run # показать план, ничего не менять
92
+ python -m houdini_agent_panel doctor # что нашлось и что сломано
93
+ python -m houdini_agent_panel uninstall --purge # убрать вместе с папкой данных
94
+ ```
95
+
96
+ Ставится из локально собранного колеса — `--find-links dist`. Полностью офлайн —
97
+ добавить `--offline` и положить в ту же папку колёса всех зависимостей.
98
+
99
+ ## Приватность
100
+
101
+ Телеметрия выключена по умолчанию и включается только явно. Что собирается и что не
102
+ собирается никогда — [`docs/privacy.md`](docs/privacy.md).
103
+
104
+ ## Разработка
105
+
106
+ ```bash
107
+ uv venv --python 3.11 .venv # 3.11 — нижняя поддерживаемая версия (Houdini 20.5)
108
+ uv pip install --python .venv/bin/python -e ".[dev]"
109
+ .venv/bin/python -m pytest -q
110
+ ```
111
+
112
+ Тесты не ходят в сеть и не пишут за пределы `tmp_path` — это обеспечено автофикстурами
113
+ в `tests/conftest.py`, а не дисциплиной.
114
+
115
+ ## Лицензия
116
+
117
+ MIT
@@ -0,0 +1,89 @@
1
+ # houdini-agent-panel
2
+
3
+ Панель-чат с AI-агентом внутри SideFX Houdini. Ставится одной командой, агент
4
+ поднимается сам — ни терминала, ни портов, ни правки конфигов.
5
+
6
+ > Статус: v1 в сборке. Дизайн — [`docs/design.md`](docs/design.md), контракт модулей —
7
+ > [`docs/architecture.md`](docs/architecture.md), проверенные факты о внешних API —
8
+ > [`docs/facts/`](docs/facts/).
9
+
10
+ ## Зачем
11
+
12
+ Чтобы сегодня пользоваться агентом со сценой Houdini, нужен открытый терминал с `claude`
13
+ и настройка MCP руками. Художник этого не сделает.
14
+
15
+ Панель — надстройка над [fxhoudinimcp](https://github.com/healkeiser/fxhoudinimcp)
16
+ (189 инструментов работы со сценой поверх официального `hwebserver` Houdini). Мы не
17
+ пишем ни агента, ни инструменты — только ACP-клиент и инсталлятор, связывающие готовое.
18
+
19
+ ## Агенты
20
+
21
+ Из официального [реестра ACP](https://github.com/agentclientprotocol/registry):
22
+ Claude Agent, Codex, Gemini CLI, Grok Build, Kimi CLI, OpenCode — плюс «Свой агент»
23
+ для всего остального. Ставится только выбранный, а не все сразу. Node, если нужен,
24
+ панель приносит с собой.
25
+
26
+ Свои и удалённые модели подключаются как модель внутри OpenCode: ACP работает только
27
+ через stdio, поэтому агент всегда локальный, а эндпоинт модели может быть где угодно.
28
+
29
+ ## Установка
30
+
31
+ Одной командой, одинаково на macOS, Linux и Windows:
32
+
33
+ ```bash
34
+ uvx --from houdini-agent-panel python -m houdini_agent_panel install --agents opencode
35
+ ```
36
+
37
+ Она находит все установленные Houdini, ставит панель в Python каждой из них,
38
+ прописывает пакет и качает выбранного агента. В систему ничего не попадает:
39
+ `uvx` запускает инсталлятор и уходит.
40
+
41
+ Нет `uv`? Он ставится тоже одной командой и не требует прав root:
42
+
43
+ ```bash
44
+ curl -LsSf https://astral.sh/uv/install.sh | sh # macOS, Linux
45
+ powershell -c "irm https://astral.sh/uv/install.ps1 | iex" # Windows
46
+ ```
47
+
48
+ В репозитории лежат `scripts/install.sh` и `scripts/install.ps1` — они делают
49
+ оба шага сразу и пригодятся, когда репозиторий станет публичным и их можно
50
+ будет вызывать через `curl … | sh`.
51
+
52
+ Перезапустить Houdini → панель появится в меню панелей (Tab → Python Panels → Agent).
53
+
54
+ Инсталлятор находит на машине все установленные Houdini и для каждой ставит панель
55
+ **в её собственный Python**. Это не прихоть: `pydantic` тащит скомпилированное ядро, а у
56
+ Houdini 20.5 внутри Python 3.11 и у Houdini 22 — 3.13, так что одно общее дерево
57
+ зависимостей на обе версии физически невозможно. Подробности — в
58
+ [`docs/architecture.md`](docs/architecture.md) §0.
59
+
60
+ Полезное:
61
+
62
+ ```bash
63
+ python -m houdini_agent_panel install --dry-run # показать план, ничего не менять
64
+ python -m houdini_agent_panel doctor # что нашлось и что сломано
65
+ python -m houdini_agent_panel uninstall --purge # убрать вместе с папкой данных
66
+ ```
67
+
68
+ Ставится из локально собранного колеса — `--find-links dist`. Полностью офлайн —
69
+ добавить `--offline` и положить в ту же папку колёса всех зависимостей.
70
+
71
+ ## Приватность
72
+
73
+ Телеметрия выключена по умолчанию и включается только явно. Что собирается и что не
74
+ собирается никогда — [`docs/privacy.md`](docs/privacy.md).
75
+
76
+ ## Разработка
77
+
78
+ ```bash
79
+ uv venv --python 3.11 .venv # 3.11 — нижняя поддерживаемая версия (Houdini 20.5)
80
+ uv pip install --python .venv/bin/python -e ".[dev]"
81
+ .venv/bin/python -m pytest -q
82
+ ```
83
+
84
+ Тесты не ходят в сеть и не пишут за пределы `tmp_path` — это обеспечено автофикстурами
85
+ в `tests/conftest.py`, а не дисциплиной.
86
+
87
+ ## Лицензия
88
+
89
+ MIT
@@ -0,0 +1,64 @@
1
+ [build-system]
2
+ requires = ["setuptools>=68", "wheel"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "houdini-agent-panel"
7
+ version = "0.1.0"
8
+ description = "Панель-чат с ACP-агентом внутри SideFX Houdini поверх fxhoudinimcp"
9
+ readme = "README.md"
10
+ license = { text = "MIT" }
11
+ requires-python = ">=3.10,<3.15"
12
+ authors = [{ name = "MAY4VFX" }]
13
+ keywords = ["houdini", "vfx", "acp", "agent", "mcp"]
14
+ classifiers = [
15
+ "License :: OSI Approved :: MIT License",
16
+ "Programming Language :: Python :: 3.10",
17
+ "Programming Language :: Python :: 3.11",
18
+ "Programming Language :: Python :: 3.12",
19
+ "Programming Language :: Python :: 3.13",
20
+ "Intended Audience :: End Users/Desktop",
21
+ "Topic :: Multimedia :: Graphics :: 3D Modeling",
22
+ ]
23
+ dependencies = [
24
+ "agent-client-protocol>=0.12,<0.13",
25
+ "fxhoudinimcp>=2.10",
26
+ # Python, который приносит Houdini, собран без связки корневых сертификатов:
27
+ # HTTPS оттуда падает с CERTIFICATE_VERIFY_FAILED. Зависимость прямая, а не
28
+ # транзитивная через mcp/httpx, потому что без неё у панели молча отваливается
29
+ # вся работа с сетью (см. network.ssl_context).
30
+ "certifi",
31
+ ]
32
+
33
+ [project.urls]
34
+ Homepage = "https://github.com/MAY4VFX/houdini-agent-panel"
35
+ Issues = "https://github.com/MAY4VFX/houdini-agent-panel/issues"
36
+
37
+ [project.scripts]
38
+ houdini-agent-panel = "houdini_agent_panel.__main__:main"
39
+
40
+ [project.optional-dependencies]
41
+ dev = [
42
+ "pytest>=8",
43
+ "pytest-asyncio>=0.24",
44
+ "PySide6>=6.5",
45
+ ]
46
+
47
+ [tool.setuptools]
48
+ package-dir = { "" = "python" }
49
+
50
+ [tool.setuptools.packages.find]
51
+ where = ["python"]
52
+ include = ["houdini_agent_panel*"]
53
+
54
+ [tool.setuptools.package-data]
55
+ houdini_agent_panel = ["houdini/**/*", "data/*.json"]
56
+
57
+ [tool.pytest.ini_options]
58
+ testpaths = ["tests"]
59
+ asyncio_mode = "auto"
60
+ filterwarnings = ["ignore::DeprecationWarning"]
61
+
62
+ [tool.ruff]
63
+ line-length = 100
64
+ target-version = "py310"
@@ -0,0 +1,5 @@
1
+ """Панель-чат с ACP-агентом внутри SideFX Houdini поверх fxhoudinimcp."""
2
+
3
+ __version__ = "0.1.0"
4
+
5
+ __all__ = ["__version__"]
@@ -0,0 +1,112 @@
1
+ """CLI инсталлятора: ``python -m houdini_agent_panel <команда>``."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import argparse
6
+ import sys
7
+ from typing import Sequence
8
+
9
+ from . import houdini_package
10
+ from . import install as install_mod
11
+ from . import paths
12
+
13
+
14
+ def _split_agents(value: str | None) -> list[str]:
15
+ if not value:
16
+ return []
17
+ return [item.strip() for item in value.split(",") if item.strip()]
18
+
19
+
20
+ def build_parser() -> argparse.ArgumentParser:
21
+ parser = argparse.ArgumentParser(
22
+ prog="houdini_agent_panel",
23
+ description="Установка и диагностика панели-агента для Houdini.",
24
+ )
25
+ subparsers = parser.add_subparsers(dest="command", required=True)
26
+
27
+ install_parser = subparsers.add_parser(
28
+ "install", help="Поставить панель в найденные на машине Houdini"
29
+ )
30
+ install_parser.add_argument(
31
+ "--houdini-dir",
32
+ default=None,
33
+ help="Явный путь к <prefs>/packages вместо автопоиска по всем версиям на машине",
34
+ )
35
+ install_parser.add_argument(
36
+ "--agents",
37
+ default=None,
38
+ help="Агенты через запятую, например claude,codex. Без флага не ставится ни один",
39
+ )
40
+ install_parser.add_argument(
41
+ "--find-links",
42
+ default=None,
43
+ help="Локальная директория с колёсами: искать пакеты сначала там",
44
+ )
45
+ install_parser.add_argument(
46
+ "--offline",
47
+ action="store_true",
48
+ help="Не ходить на PyPI вообще (нужен --find-links со всеми зависимостями)",
49
+ )
50
+ install_parser.add_argument(
51
+ "--skip-deps",
52
+ action="store_true",
53
+ help="Не ставить зависимости панели в Houdini-Python, только package json",
54
+ )
55
+ install_parser.add_argument(
56
+ "--dry-run",
57
+ action="store_true",
58
+ help="Только показать план, ничего не менять на диске",
59
+ )
60
+
61
+ uninstall_parser = subparsers.add_parser("uninstall", help="Убрать панель из Houdini")
62
+ uninstall_parser.add_argument("--houdini-dir", default=None)
63
+ uninstall_parser.add_argument(
64
+ "--purge", action="store_true", help="Также снести папку данных панели целиком"
65
+ )
66
+ uninstall_parser.add_argument("--dry-run", action="store_true")
67
+
68
+ subparsers.add_parser(
69
+ "houdini-package", help="Напечатать package json панели и куда его класть"
70
+ )
71
+ subparsers.add_parser("doctor", help="Проверить, что из установки нашлось на машине")
72
+
73
+ return parser
74
+
75
+
76
+ def main(argv: Sequence[str] | None = None) -> int:
77
+ parser = build_parser()
78
+ args = parser.parse_args(argv)
79
+
80
+ if args.command == "install":
81
+ return install_mod.install(
82
+ houdini_dir=args.houdini_dir,
83
+ agents=_split_agents(args.agents),
84
+ find_links=args.find_links,
85
+ offline=args.offline,
86
+ skip_deps=args.skip_deps,
87
+ dry_run=args.dry_run,
88
+ )
89
+
90
+ if args.command == "uninstall":
91
+ return install_mod.uninstall(
92
+ houdini_dir=args.houdini_dir,
93
+ purge=args.purge,
94
+ dry_run=args.dry_run,
95
+ )
96
+
97
+ if args.command == "houdini-package":
98
+ target = paths.deps_dir()
99
+ payload = houdini_package.package_json(deps=target, installer_python=sys.executable)
100
+ print(f"Куда класть: <HOUDINI_USER_PREF_DIR>/packages/{houdini_package.PACKAGE_NAME}")
101
+ print(payload)
102
+ return 0
103
+
104
+ if args.command == "doctor":
105
+ return install_mod.doctor()
106
+
107
+ parser.error(f"неизвестная команда: {args.command}")
108
+ return 2 # parser.error сам завершает процесс, эта строка — для тестов на моке
109
+
110
+
111
+ if __name__ == "__main__":
112
+ raise SystemExit(main())