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.
- houdini_agent_panel-0.1.0/LICENSE +21 -0
- houdini_agent_panel-0.1.0/PKG-INFO +117 -0
- houdini_agent_panel-0.1.0/README.md +89 -0
- houdini_agent_panel-0.1.0/pyproject.toml +64 -0
- houdini_agent_panel-0.1.0/python/houdini_agent_panel/__init__.py +5 -0
- houdini_agent_panel-0.1.0/python/houdini_agent_panel/__main__.py +112 -0
- houdini_agent_panel-0.1.0/python/houdini_agent_panel/announcements.py +313 -0
- houdini_agent_panel-0.1.0/python/houdini_agent_panel/client.py +732 -0
- houdini_agent_panel-0.1.0/python/houdini_agent_panel/deps.py +203 -0
- houdini_agent_panel-0.1.0/python/houdini_agent_panel/houdini/python3.11libs/uiready.py +51 -0
- houdini_agent_panel-0.1.0/python/houdini_agent_panel/houdini/python3.13libs/uiready.py +51 -0
- houdini_agent_panel-0.1.0/python/houdini_agent_panel/houdini/python_panels/houdini_agent.pypanel +92 -0
- houdini_agent_panel-0.1.0/python/houdini_agent_panel/houdini_package.py +105 -0
- houdini_agent_panel-0.1.0/python/houdini_agent_panel/install.py +295 -0
- houdini_agent_panel-0.1.0/python/houdini_agent_panel/network.py +134 -0
- houdini_agent_panel-0.1.0/python/houdini_agent_panel/node.py +214 -0
- houdini_agent_panel-0.1.0/python/houdini_agent_panel/paths.py +102 -0
- houdini_agent_panel-0.1.0/python/houdini_agent_panel/refresh.py +92 -0
- houdini_agent_panel-0.1.0/python/houdini_agent_panel/registry.py +304 -0
- houdini_agent_panel-0.1.0/python/houdini_agent_panel/runtime.py +400 -0
- houdini_agent_panel-0.1.0/python/houdini_agent_panel/scene.py +164 -0
- houdini_agent_panel-0.1.0/python/houdini_agent_panel/sessions.py +139 -0
- houdini_agent_panel-0.1.0/python/houdini_agent_panel/settings.py +208 -0
- houdini_agent_panel-0.1.0/python/houdini_agent_panel/telemetry.py +140 -0
- houdini_agent_panel-0.1.0/python/houdini_agent_panel/transcript_model.py +192 -0
- houdini_agent_panel-0.1.0/python/houdini_agent_panel/ui/__init__.py +0 -0
- houdini_agent_panel-0.1.0/python/houdini_agent_panel/ui/agents.py +339 -0
- houdini_agent_panel-0.1.0/python/houdini_agent_panel/ui/announcement.py +203 -0
- houdini_agent_panel-0.1.0/python/houdini_agent_panel/ui/auth_view.py +71 -0
- houdini_agent_panel-0.1.0/python/houdini_agent_panel/ui/chips.py +148 -0
- houdini_agent_panel-0.1.0/python/houdini_agent_panel/ui/composer.py +477 -0
- houdini_agent_panel-0.1.0/python/houdini_agent_panel/ui/panel.py +636 -0
- houdini_agent_panel-0.1.0/python/houdini_agent_panel/ui/permissions.py +97 -0
- houdini_agent_panel-0.1.0/python/houdini_agent_panel/ui/qt.py +58 -0
- houdini_agent_panel-0.1.0/python/houdini_agent_panel/ui/settings_view.py +141 -0
- houdini_agent_panel-0.1.0/python/houdini_agent_panel/ui/theme.py +154 -0
- houdini_agent_panel-0.1.0/python/houdini_agent_panel/ui/transcript.py +447 -0
- houdini_agent_panel-0.1.0/python/houdini_agent_panel/ui/voice.py +290 -0
- houdini_agent_panel-0.1.0/python/houdini_agent_panel/updates.py +325 -0
- houdini_agent_panel-0.1.0/python/houdini_agent_panel.egg-info/PKG-INFO +117 -0
- houdini_agent_panel-0.1.0/python/houdini_agent_panel.egg-info/SOURCES.txt +72 -0
- houdini_agent_panel-0.1.0/python/houdini_agent_panel.egg-info/dependency_links.txt +1 -0
- houdini_agent_panel-0.1.0/python/houdini_agent_panel.egg-info/entry_points.txt +2 -0
- houdini_agent_panel-0.1.0/python/houdini_agent_panel.egg-info/requires.txt +8 -0
- houdini_agent_panel-0.1.0/python/houdini_agent_panel.egg-info/top_level.txt +1 -0
- houdini_agent_panel-0.1.0/setup.cfg +4 -0
- houdini_agent_panel-0.1.0/tests/test_announcements.py +222 -0
- houdini_agent_panel-0.1.0/tests/test_announcements_url.py +35 -0
- houdini_agent_panel-0.1.0/tests/test_client.py +447 -0
- houdini_agent_panel-0.1.0/tests/test_deps.py +290 -0
- houdini_agent_panel-0.1.0/tests/test_houdini_package.py +125 -0
- houdini_agent_panel-0.1.0/tests/test_install.py +309 -0
- houdini_agent_panel-0.1.0/tests/test_network.py +56 -0
- houdini_agent_panel-0.1.0/tests/test_node.py +275 -0
- houdini_agent_panel-0.1.0/tests/test_node_path.py +36 -0
- houdini_agent_panel-0.1.0/tests/test_pypanel.py +153 -0
- houdini_agent_panel-0.1.0/tests/test_refresh.py +124 -0
- houdini_agent_panel-0.1.0/tests/test_registry.py +228 -0
- houdini_agent_panel-0.1.0/tests/test_runtime.py +360 -0
- houdini_agent_panel-0.1.0/tests/test_scene.py +167 -0
- houdini_agent_panel-0.1.0/tests/test_sessions.py +121 -0
- houdini_agent_panel-0.1.0/tests/test_telemetry.py +158 -0
- houdini_agent_panel-0.1.0/tests/test_transcript_model.py +184 -0
- houdini_agent_panel-0.1.0/tests/test_ui_agents.py +170 -0
- houdini_agent_panel-0.1.0/tests/test_ui_announcement.py +125 -0
- houdini_agent_panel-0.1.0/tests/test_ui_auth.py +76 -0
- houdini_agent_panel-0.1.0/tests/test_ui_chips.py +131 -0
- houdini_agent_panel-0.1.0/tests/test_ui_composer.py +406 -0
- houdini_agent_panel-0.1.0/tests/test_ui_panel.py +323 -0
- houdini_agent_panel-0.1.0/tests/test_ui_permissions.py +97 -0
- houdini_agent_panel-0.1.0/tests/test_ui_settings.py +91 -0
- houdini_agent_panel-0.1.0/tests/test_ui_transcript.py +361 -0
- houdini_agent_panel-0.1.0/tests/test_updates.py +219 -0
- 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,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())
|