answer42 0.2.0__py3-none-any.whl
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.
- answer42-0.2.0.dist-info/METADATA +388 -0
- answer42-0.2.0.dist-info/RECORD +28 -0
- answer42-0.2.0.dist-info/WHEEL +4 -0
- answer42-0.2.0.dist-info/entry_points.txt +2 -0
- answer42-0.2.0.dist-info/licenses/LICENSE +21 -0
- mcp_1c/__init__.py +4 -0
- mcp_1c/assets/MCPTestClient.cf +0 -0
- mcp_1c/assets/MCPTestManager.cf +0 -0
- mcp_1c/assets/__init__.py +1 -0
- mcp_1c/assets/skills/answer42/SKILL.md +170 -0
- mcp_1c/assets/skills/answer42-rag/SKILL.md +58 -0
- mcp_1c/bridge.py +136 -0
- mcp_1c/credentials.py +147 -0
- mcp_1c/os_support.py +224 -0
- mcp_1c/platform.py +187 -0
- mcp_1c/protocol.py +35 -0
- mcp_1c/rag/__init__.py +5 -0
- mcp_1c/rag/detect.py +23 -0
- mcp_1c/rag/model.py +114 -0
- mcp_1c/rag/parsers.py +387 -0
- mcp_1c/rag/service.py +375 -0
- mcp_1c/rag/store.py +228 -0
- mcp_1c/recorder.py +239 -0
- mcp_1c/release_helper.py +83 -0
- mcp_1c/runtime.py +636 -0
- mcp_1c/server.py +3285 -0
- mcp_1c/skill_installer.py +127 -0
- mcp_1c/window_control.py +276 -0
|
@@ -0,0 +1,388 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: answer42
|
|
3
|
+
Version: 0.2.0
|
|
4
|
+
Summary: Answer42 — The Answer to Life, Universe, and 1C — UI Driver. MCP-powered 1C:Enterprise UI automation: click, fill, navigate, test, and introspect managed forms through the test-client API
|
|
5
|
+
Author: Marvin (AI Assistant), 42Clouds, and contributors
|
|
6
|
+
Author-email: "Kosolapov Stanislav (proDOOMman)" <prodoomman@gmail.com>
|
|
7
|
+
License: MIT
|
|
8
|
+
License-File: LICENSE
|
|
9
|
+
Keywords: 1c,1c-enterprise,mcp,test-client,ui-automation
|
|
10
|
+
Classifier: Development Status :: 3 - Alpha
|
|
11
|
+
Classifier: Intended Audience :: Developers
|
|
12
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
13
|
+
Classifier: Programming Language :: Python :: 3
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
17
|
+
Classifier: Topic :: Software Development :: Testing
|
|
18
|
+
Requires-Python: >=3.11
|
|
19
|
+
Requires-Dist: mcp>=1.9.0
|
|
20
|
+
Requires-Dist: pydantic>=2.0
|
|
21
|
+
Requires-Dist: websockets>=12.0
|
|
22
|
+
Provides-Extra: dev
|
|
23
|
+
Requires-Dist: pytest>=8.0; extra == 'dev'
|
|
24
|
+
Requires-Dist: ruff>=0.5; extra == 'dev'
|
|
25
|
+
Provides-Extra: linux-window-control
|
|
26
|
+
Requires-Dist: python-xlib>=0.33; extra == 'linux-window-control'
|
|
27
|
+
Provides-Extra: screenshot
|
|
28
|
+
Requires-Dist: mss>=9.0.0; extra == 'screenshot'
|
|
29
|
+
Provides-Extra: window-control
|
|
30
|
+
Requires-Dist: python-xlib>=0.33; extra == 'window-control'
|
|
31
|
+
Provides-Extra: windows-window-control
|
|
32
|
+
Requires-Dist: pywin32>=306; extra == 'windows-window-control'
|
|
33
|
+
Description-Content-Type: text/markdown
|
|
34
|
+
|
|
35
|
+
# Answer42
|
|
36
|
+
|
|
37
|
+
<p align="center">
|
|
38
|
+
<img src="docs/assets/answer42-logo.png" alt="Answer42 logo" width="220">
|
|
39
|
+
</p>
|
|
40
|
+
|
|
41
|
+
**Answer42** — MCP-инструмент для интерактивного управления UI **1С:Предприятия** через клиент тестирования. Он позволяет AI-агенту открывать формы 1С, нажимать кнопки, заполнять поля, выбирать ссылки из форм выбора, работать с таблицами, динамическими списками и табличными документами.
|
|
42
|
+
|
|
43
|
+
> **The Answer to Life, Universe, and 1C — UI Driver**
|
|
44
|
+
|
|
45
|
+
Проект даёт AI-агенту три способности:
|
|
46
|
+
|
|
47
|
+
1. **Интерактивное управление UI 1С** — открыть форму, кликнуть кнопку, активировать поле, заполнить значение, выбрать строку, провести сценарий через `/TESTMANAGER` + `/TESTCLIENT`.
|
|
48
|
+
2. **Доказательная запись клиентского тестирования** — записывать аннотированные PDF-слайды с MCP method/request/response и скриншотами окна 1С.
|
|
49
|
+
3. **RAG-индекс метаданных** — локальный SQLite/FTS индекс конфигураций 1С (EDT, XML-выгрузка Конфигуратора, base + extensions), включая подсказки для `ui_tree` и dynamic-list settings.
|
|
50
|
+
|
|
51
|
+
## Быстрый старт
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
# Рекомендуется для обычной установки из PyPI
|
|
55
|
+
pipx install 'answer42[screenshot,linux-window-control]'
|
|
56
|
+
|
|
57
|
+
# Альтернатива без pipx
|
|
58
|
+
python3 -m venv .venv
|
|
59
|
+
. .venv/bin/activate
|
|
60
|
+
pip install 'answer42[screenshot,linux-window-control]'
|
|
61
|
+
|
|
62
|
+
# Разработка из git checkout
|
|
63
|
+
pip install -e '.[screenshot,dev,linux-window-control]'
|
|
64
|
+
|
|
65
|
+
# Windows: запускать из интерактивной пользовательской сессии, не как service
|
|
66
|
+
# pipx install "answer42[screenshot,windows-window-control]"
|
|
67
|
+
# pip install "answer42[screenshot,windows-window-control]"
|
|
68
|
+
|
|
69
|
+
# Запуск MCP-сервера (transport: stdio)
|
|
70
|
+
answer42 --ws-host 127.0.0.1 --ws-port 8765
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Запуск сессии и подключение тестируемой базы выполняются одним MCP-вызовом:
|
|
74
|
+
|
|
75
|
+
```text
|
|
76
|
+
start_session(
|
|
77
|
+
session_id="my-session",
|
|
78
|
+
base_url="<TARGET_INFOBASE_URL>",
|
|
79
|
+
idle_timeout_minutes=60,
|
|
80
|
+
execute="/path/to/external.epf", # опционально: /Execute
|
|
81
|
+
command_parameter="InitScenario" # опционально: /C
|
|
82
|
+
)
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
`start_session` определяет версию 1С по `base_url`, поднимает инфраструктуру Answer42 (на Linux — Xvfb, если нужен headless; на Windows — интерактивная desktop-сессия), свободные порты, WebSocket bridge, файловую базу менеджера и test-manager. Если доступны серверные компоненты 1С (`ibsrv`), менеджер и встроенная тестовая база публикуются через автономный сервер; если доступен только тонкий клиент и `ibcmd`, Answer42 автоматически использует fallback `file-direct` (`/F`) для файловых баз менеджера и клиента. После `idle_timeout_minutes` минут неактивности сессия автоматически завершается; значение по умолчанию — 60 минут. Для запуска клиента можно передать `extra_args`, `execute` (параметр командной строки `/Execute`) и `command_parameter` (параметр `/C`); если `/C` уже указан в `extra_args`, значения склеиваются через `;`.
|
|
86
|
+
|
|
87
|
+
Логин/пароль рекомендуется **не передавать явно**: `start_session` умеет брать их из локального credentials-файла по `base_url`. Параметры `username`/`password` остаются в API для разовых сценариев и обратной совместимости, но при передаче в MCP-вызове они видны вызывающему агенту в аргументах tool-call.
|
|
88
|
+
|
|
89
|
+
## Безопасное хранение логинов и паролей
|
|
90
|
+
|
|
91
|
+
Чтобы креды были доступны MCP-серверу, но не попадали в чат и аргументы tool-call, храните их в локальном файле за пределами репозитория и передайте путь в окружение процесса Answer42:
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
export ONEC_MCP_CREDENTIALS_FILE=/secure/path/credentials.json
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Если переменная окружения не задана, MCP-сервер читает файл по умолчанию:
|
|
98
|
+
|
|
99
|
+
```text
|
|
100
|
+
~/.onec-mcp-credentials.json
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Формат файла:
|
|
104
|
+
|
|
105
|
+
```json
|
|
106
|
+
{
|
|
107
|
+
"entries": [
|
|
108
|
+
{
|
|
109
|
+
"url": "https://example.invalid/infobase",
|
|
110
|
+
"username": "<USERNAME>",
|
|
111
|
+
"password": "<PASSWORD>"
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
"url": "https://*.example.invalid/*",
|
|
115
|
+
"username": "<WILDCARD_USERNAME>",
|
|
116
|
+
"password": "<WILDCARD_PASSWORD>"
|
|
117
|
+
}
|
|
118
|
+
]
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
Рекомендуемые права на файл: `0600`.
|
|
123
|
+
|
|
124
|
+
Правила матчинга: сначала точное совпадение `url`, затем wildcard (`*`, `?`) через `fnmatch`; первое совпадение побеждает. Пароли не логируются и не возвращаются наружу.
|
|
125
|
+
|
|
126
|
+
Для сохранения или обновления записи можно использовать MCP-tool:
|
|
127
|
+
|
|
128
|
+
```text
|
|
129
|
+
credentials_save(
|
|
130
|
+
url="<TARGET_INFOBASE_URL>",
|
|
131
|
+
username="<USERNAME>",
|
|
132
|
+
password="<PASSWORD>"
|
|
133
|
+
)
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
Для удаления записи:
|
|
137
|
+
|
|
138
|
+
```text
|
|
139
|
+
credentials_remove(url="<TARGET_INFOBASE_URL>")
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
Для проверки, что для адреса есть сохранённые креды, используйте MCP-tool:
|
|
143
|
+
|
|
144
|
+
```text
|
|
145
|
+
credentials_check(base_url="<TARGET_INFOBASE_URL>")
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
Ответы этих tools содержат только факт наличия/изменения/удаления записи и URL; логины и пароли не возвращаются. Tool `credentials_list()` оставлен в коде для локальной диагностики, но в OpenClaw-конфигурации его рекомендуется скрывать через `toolFilter.exclude`, чтобы агент не мог получить список URL-шаблонов.
|
|
149
|
+
|
|
150
|
+
Остановка сессии:
|
|
151
|
+
|
|
152
|
+
```text
|
|
153
|
+
stop_session(session_id="my-session", clean_data=False)
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
## Требования
|
|
157
|
+
|
|
158
|
+
- Python 3.11+
|
|
159
|
+
- 1С:Предприятие 8.3.27+
|
|
160
|
+
- Пакеты Python: `mcp`, `websockets`, `pydantic`; для скриншотов — `mss`
|
|
161
|
+
- Linux/X11: `python-xlib`/`wmctrl`/`xdotool`, GUI/Xvfb для headless-сервера
|
|
162
|
+
- Windows: интерактивная пользовательская desktop-сессия; window-control и screenshots работают через WinAPI/`mss`
|
|
163
|
+
|
|
164
|
+
## Безопасность стендов и учётных данных
|
|
165
|
+
|
|
166
|
+
В репозитории не должно быть реальных URL стендов, логинов или паролей. Для штатного запуска передавайте только `base_url`, а логин/пароль храните в локальном credentials-файле, доступном процессу Answer42 через `ONEC_MCP_CREDENTIALS_FILE`.
|
|
167
|
+
|
|
168
|
+
`start_session` всё ещё принимает `username` и `password` напрямую для разовых сценариев и обратной совместимости. Используйте это только когда осознанно готовы раскрыть значения вызывающему агенту: параметры MCP-вызова могут попасть в историю чата, логи клиента или отладочный вывод. Если вместо реального пароля передан редактированный плейсхолдер из звёздочек (`***`, `********` и т.п.), Answer42 остановит запуск с явной ошибкой: нужно указать настоящий пароль или сохранить корректные креды через `credentials_save()`.
|
|
169
|
+
|
|
170
|
+
Примеры в документации используют только плейсхолдеры (`<TARGET_INFOBASE_URL>`, `<USERNAME>`, `<PASSWORD>`). Перед публикацией артефактов проверяйте, что параметры вызовов заредактированы: recorder маскирует ключи вроде `password`, но URL и логин тоже не должны попадать в публичные материалы.
|
|
171
|
+
|
|
172
|
+
## Архитектура
|
|
173
|
+
|
|
174
|
+
Поток выполнения:
|
|
175
|
+
|
|
176
|
+
1. MCP-клиент вызывает tools через stdio MCP.
|
|
177
|
+
2. Answer42 принимает MCP-вызовы и передаёт команды в WebSocket bridge.
|
|
178
|
+
3. 1С test manager подключается к bridge и выполняет BSL-dispatch.
|
|
179
|
+
4. Test manager управляет 1С test client через API `ТестируемоеПриложение`.
|
|
180
|
+
5. Test client выполняет интерактивные операции в целевой информационной базе.
|
|
181
|
+
|
|
182
|
+
Подробнее: [`docs/architecture.md`](docs/architecture.md).
|
|
183
|
+
|
|
184
|
+
## Сборка конфигураций 1С
|
|
185
|
+
|
|
186
|
+
Конфигурация менеджера тестирования собирается из XML-исходников `src/cf/` через `ibcmd config import` (приоритетный способ) или через Конфигуратор/DESIGNER (fallback, если `ibcmd` отсутствует):
|
|
187
|
+
|
|
188
|
+
```bash
|
|
189
|
+
python scripts/build_cf.py src/cf build/MCPTestManager.cf
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
PowerShell:
|
|
193
|
+
|
|
194
|
+
```powershell
|
|
195
|
+
python scripts/build_cf.py src/cf build/MCPTestManager.cf
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
Тестовая конфигурация для E2E собирается из XML-исходников `src/client_cf/`:
|
|
199
|
+
|
|
200
|
+
```bash
|
|
201
|
+
python scripts/build_cf.py src/client_cf build/MCPTestClient.cf
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
PowerShell:
|
|
205
|
+
|
|
206
|
+
```powershell
|
|
207
|
+
python scripts/build_cf.py src/client_cf build/MCPTestClient.cf
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
`start_session` автоматически собирает `build/MCPTestManager.cf`, если файл отсутствует или XML-исходники `src/cf/` новее. Встроенный demo-клиент аналогично собирает `build/MCPTestClient.cf` из `src/client_cf/`. E2E-сценарий также пересобирает `build/MCPTestClient.cf`, чтобы тесты не использовали устаревший артефакт.
|
|
211
|
+
|
|
212
|
+
E2E можно запускать целиком или по независимым сценариям:
|
|
213
|
+
|
|
214
|
+
```bash
|
|
215
|
+
python3 scripts/e2e_stable.py # full
|
|
216
|
+
E2E_SCENARIO=smoke python3 scripts/e2e_stable.py # быстрый smoke
|
|
217
|
+
E2E_SCENARIO=dynamic python3 scripts/e2e_stable.py # legacy: таблицы/dynamic-list/отчёт
|
|
218
|
+
E2E_SCENARIO=dynamic-tables python3 scripts/e2e_stable.py
|
|
219
|
+
E2E_SCENARIO=dynamic-lists python3 scripts/e2e_stable.py
|
|
220
|
+
E2E_SCENARIO=dynamic-reports python3 scripts/e2e_stable.py
|
|
221
|
+
E2E_SCENARIO=coverage python3 scripts/e2e_stable.py # diagnostic/negative tools
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
Для реального распараллеливания сценарий умеет сам запустить пять разные сессий (`smoke`, `dynamic-tables`, `dynamic-lists`, `dynamic-reports`, `coverage`), а не копии одного и того же теста. Встроенная тестовая файловая база публикуется через один общий `ibsrv`, когда серверные компоненты доступны; без `ibsrv` demo-клиент запускается через `file-direct` (`/F`):
|
|
225
|
+
|
|
226
|
+
```bash
|
|
227
|
+
E2E_PARALLEL=1 E2E_SESSION_ID=e2e-split python3 scripts/e2e_stable.py
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
`start_session` также переиспользует общий автономный сервер для одинаковой файловой базы. Последний `stop_session` освобождает refcount и завершает shared `ibsrv`.
|
|
231
|
+
|
|
232
|
+
## MCP-инструменты
|
|
233
|
+
|
|
234
|
+
### Жизненный цикл
|
|
235
|
+
|
|
236
|
+
- `start_session(...)` — единый запуск: определение версии по `base_url`, Xvfb на Linux при необходимости, свободные порты, bridge, файловая база менеджера, `ibsrv` или fallback `file-direct`, test-manager и подключение клиента тестирования. Если `username`/`password` не переданы, берёт их из credentials-файла по `base_url`. Поддерживает `extra_args`, `execute` → `/Execute`, `command_parameter` → `/C`; несколько частей `/C` объединяются через `;`.
|
|
237
|
+
- `session_status(session_id)` — состояние bridge, runtime, клиента тестирования и RAG snapshot.
|
|
238
|
+
- `stop_session(session_id, clean_data)` — отключение клиента тестирования и остановка всех процессов, Xvfb и bridge.
|
|
239
|
+
|
|
240
|
+
### Автоматизация UI
|
|
241
|
+
|
|
242
|
+
- `active_window()` — активное окно тестируемого приложения через `ТестируемоеПриложение.ПолучитьАктивноеОкно()`.
|
|
243
|
+
- `windows_list(max_depth)` — список окон тестируемого приложения; если открыто два окна клиента, возвращает оба, потому что читает подчинённые объекты `ТестируемоеПриложение`, а не окна менеджера тестирования.
|
|
244
|
+
- `activate_window(index, title, name)` — переключить активное окно по индексу, заголовку или имени.
|
|
245
|
+
- `goto_start_page()`, `goto_previous_window()`, `goto_next_window()` — навигация основного окна: `ПерейтиКНачальнойСтранице`, `ПерейтиКПредыдущемуОкну`, `ПерейтиКСледующемуОкну`.
|
|
246
|
+
- `ui_tree(max_depth, include_rag_types, include_hidden, rag_snapshot)` — дерево UI с `visible`, `available`, `enabled`, `read_only`; скрытые элементы и неактивные страницы page-group по умолчанию опускаются, `include_hidden=true` возвращает полное дерево. RAG-типы добавляются, когда доступен индекс метаданных.
|
|
247
|
+
- `command_bar()` — диагностическая информация по командной панели, когда она доступна API тест-клиента.
|
|
248
|
+
- `current_element()` — диагностическая информация по текущему элементу, когда она доступна API тест-клиента.
|
|
249
|
+
- `find_object(name, title, type)` — найти объект в дереве UI.
|
|
250
|
+
- `activate_object(name, title, type)` — активировать объект.
|
|
251
|
+
- `open_navigation_link(navigation_link)` — открыть навигационную ссылку `e1cib/...`.
|
|
252
|
+
- `click_button(name, search_by_title)` — нажать кнопку.
|
|
253
|
+
- `set_field_value(field_name, value, search_by_title)` — установить значение поля.
|
|
254
|
+
- `create_new_item()` — создать новый элемент.
|
|
255
|
+
- `save_form()` — сохранить форму.
|
|
256
|
+
- `close_form()` — закрыть форму.
|
|
257
|
+
- `screenshot(path)` — скриншот экрана.
|
|
258
|
+
|
|
259
|
+
### Таблицы и табличные части
|
|
260
|
+
|
|
261
|
+
- `table_rows(...)` — строки таблицы.
|
|
262
|
+
- `table_find_row(...)` — найти строку по подстроке.
|
|
263
|
+
- `table_goto_row(...)` — перейти к строке.
|
|
264
|
+
- `table_current_row(...)` — текущая строка.
|
|
265
|
+
- `table_selected_rows(...)` — выделенные строки.
|
|
266
|
+
- `table_set_field(...)` — установить значение в ячейке.
|
|
267
|
+
- `table_choose_field_from_list(...)` — открыть форму выбора для ссылочного поля в строке табличной части.
|
|
268
|
+
- `table_edit_info(...)` — информация о редактировании таблицы.
|
|
269
|
+
- `table_move_row(...)` — перейти к первой/следующей/предыдущей/последней строке.
|
|
270
|
+
|
|
271
|
+
### Динамические списки
|
|
272
|
+
|
|
273
|
+
- `dynamic_list_available_fields(object, rag_snapshot)` — поля, доступные для отбора/сортировки по RAG-индексу.
|
|
274
|
+
- `dynamic_list_apply_settings(filters, orders, clear_first)` — применить сортировки через API тест-клиента и best-effort отборы через стандартную форму **Настроить список**.
|
|
275
|
+
- `dynamic_list_set_order(column_title, name="Список")` — сортировка по видимому заголовку колонки.
|
|
276
|
+
- `dynamic_list_output()` — команда **Вывести список** с возвратом текста табличного документа, когда он доступен.
|
|
277
|
+
- `dynamic_list_open_settings()` — открыть **Настроить список**.
|
|
278
|
+
- `dynamic_list_clear_settings()` — сбросить настройки динамического списка.
|
|
279
|
+
- `dynamic_list_open_form_settings()` — открыть **Изменить форму**.
|
|
280
|
+
|
|
281
|
+
### Табличные документы
|
|
282
|
+
|
|
283
|
+
- `tabular_documents(include_text)` — список табличных документов в активном окне.
|
|
284
|
+
- `tabular_document_text(...)` — текст табличного документа.
|
|
285
|
+
- `tabular_document_save(path, format)` — сохранить табличный документ в выбранном формате.
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
### Доказательная запись
|
|
289
|
+
|
|
290
|
+
- `recording_start(output_dir, display, window)` — включить доказательную запись.
|
|
291
|
+
- `recording_capture(action, note)` — вручную добавить доказательный слайд.
|
|
292
|
+
- `recording_stop()` — собрать `manifest.json`, `recording.pdf` (если доступен backend PDF).
|
|
293
|
+
|
|
294
|
+
### RAG / индекс метаданных
|
|
295
|
+
|
|
296
|
+
- `rag_source_add(name, path, kind, format="auto")` — зарегистрировать источник; формат определяется автоматически при `format="auto"`.
|
|
297
|
+
- `rag_sources_list()` — список источников.
|
|
298
|
+
- `rag_snapshot_create(name, base, extensions, sources)` — создать effective snapshot.
|
|
299
|
+
- `rag_snapshots_list()` — список snapshot-ов.
|
|
300
|
+
- `rag_index_build(snapshot, source)` — построить индекс.
|
|
301
|
+
- `rag_lookup_object(object, snapshot)` — найти объект метаданных.
|
|
302
|
+
- `rag_query(query, snapshot, limit)` — полнотекстовый поиск.
|
|
303
|
+
|
|
304
|
+
CLI-пример:
|
|
305
|
+
|
|
306
|
+
```bash
|
|
307
|
+
python3 scripts/rag_cli.py add-source Configuration /path/to/configuration/src --kind base
|
|
308
|
+
python3 scripts/rag_cli.py add-source Extension1 /path/to/extension/src --kind extension
|
|
309
|
+
python3 scripts/rag_cli.py snapshot Configuration+Extension1 --base Configuration --extension Extension1
|
|
310
|
+
python3 scripts/rag_cli.py build --snapshot Configuration+Extension1
|
|
311
|
+
python3 scripts/rag_cli.py lookup РегистрСведений.Регистр1 --snapshot Configuration+Extension1
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
## Ограничения
|
|
315
|
+
|
|
316
|
+
- Форма пользовательской настройки **«Изменить форму»** частично недоступна для надёжной автоматизации через API клиента тестирования. В частности, команда **«Добавить поля»** в верхней панели формы настройки может быть видна на скриншоте и в диагностическом тексте, но не нажиматься как обычная `ТестируемаяКнопкаФормы`: `click_button` может не находить её, а `activate_object` может вернуть `activated=true` без открытия диалога добавления полей.
|
|
317
|
+
|
|
318
|
+
## Лицензия
|
|
319
|
+
|
|
320
|
+
MIT
|
|
321
|
+
|
|
322
|
+
## Copyright
|
|
323
|
+
|
|
324
|
+
Copyright (c) 2026 Kosolapov Stanislav aka proDOOMman <prodoomman@gmail.com>, Marvin (AI Assistant), 42Clouds, and contributors.
|
|
325
|
+
|
|
326
|
+
Licensed under the MIT License.
|
|
327
|
+
|
|
328
|
+
## Публикация пакета
|
|
329
|
+
|
|
330
|
+
Рекомендуемый канал установки для пользователей — PyPI:
|
|
331
|
+
|
|
332
|
+
```bash
|
|
333
|
+
pipx install 'answer42[screenshot,linux-window-control]'
|
|
334
|
+
# Windows:
|
|
335
|
+
# pipx install "answer42[screenshot,windows-window-control]"
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
Публикация автоматизирована в `.gitlab-ci.yml` и оставлена только для PyPI:
|
|
339
|
+
|
|
340
|
+
1. tag `vX.Y.Z` запускает unit/ruff/package checks;
|
|
341
|
+
2. `package` собирает wheel/sdist и проверяет их через `twine check`;
|
|
342
|
+
3. `publish_pypi` публикует wheel/sdist в PyPI через `PYPI_API_TOKEN`;
|
|
343
|
+
4. `create_gitlab_release` создаёт GitLab Release для tag.
|
|
344
|
+
|
|
345
|
+
|
|
346
|
+
One-command релиз:
|
|
347
|
+
|
|
348
|
+
```bash
|
|
349
|
+
answer42 release 0.2.1
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
Команда меняет `pyproject.toml`, создаёт commit `Release v0.2.1`, annotated tag `v0.2.1`, пушит branch и tag. Tag запускает CI: публикацию в PyPI и создание GitLab Release.
|
|
353
|
+
|
|
354
|
+
Секрет GitLab CI:
|
|
355
|
+
|
|
356
|
+
- `PYPI_API_TOKEN` — PyPI token для проекта `answer42`.
|
|
357
|
+
|
|
358
|
+
Перед релизом проверьте, что `src/mcp_1c/assets/MCPTestManager.cf` и `src/mcp_1c/assets/MCPTestClient.cf` пересобраны из актуальных XML-исходников. Runtime использует XML+`scripts/build_cf.py` в git checkout, а в установленном PyPI wheel при отсутствии исходников копирует packaged `.cf` из `mcp_1c.assets`.
|
|
359
|
+
|
|
360
|
+
### Установка packaged skills
|
|
361
|
+
|
|
362
|
+
PyPI сам по себе не устанавливает agent skills в пользовательские каталоги, поэтому в CLI добавлена команда:
|
|
363
|
+
|
|
364
|
+
```bash
|
|
365
|
+
answer42 install-skills
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
По умолчанию она устанавливает `answer42` и `answer42-rag` в OpenClaw:
|
|
369
|
+
|
|
370
|
+
```text
|
|
371
|
+
~/.openclaw/workspace/skills
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
Другие агенты/варианты:
|
|
375
|
+
|
|
376
|
+
```bash
|
|
377
|
+
answer42 install-skills --agent claude
|
|
378
|
+
answer42 install-skills --agent codex
|
|
379
|
+
answer42 install-skills --agent opencode
|
|
380
|
+
answer42 install-skills --agent pi
|
|
381
|
+
answer42 install-skills --agent hermes
|
|
382
|
+
answer42 install-skills --agent all
|
|
383
|
+
answer42 install-skills --target-dir /path/to/skills
|
|
384
|
+
answer42 install-skills --list-agents
|
|
385
|
+
answer42 install-skills --dry-run --agent all
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
Для агентов без стабильного стандарта skill-директорий (`codex`, `opencode`, `pi`, `hermes`) presets best-effort; если у конкретной установки другой путь, используйте `--target-dir`.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
mcp_1c/__init__.py,sha256=DP803-8aPqu8ukYztLWiTQYil7IC6WnqMu_4FH2KHvA,109
|
|
2
|
+
mcp_1c/bridge.py,sha256=LLo467dDRM5NRGiQnJWfW5y9JYBxkY3JR5E4fEoZEvI,5012
|
|
3
|
+
mcp_1c/credentials.py,sha256=ix0aP6fsbiVGKi6mrqgF9SlTaZhwspMU9awtowgMorI,5105
|
|
4
|
+
mcp_1c/os_support.py,sha256=cEnLbMXCuruBMyKqoisGPdhsXjHEYWK2nlh_dQsysNI,7045
|
|
5
|
+
mcp_1c/platform.py,sha256=9hxnPgZ487g6OvcttnBMxPHxbeMKAGhnRlD687MBcBk,6977
|
|
6
|
+
mcp_1c/protocol.py,sha256=evAgPSrMoqNJ1dB5ngM5jAphvQBKZAwKExLZT4Kfgsw,859
|
|
7
|
+
mcp_1c/recorder.py,sha256=4TlrcqqVon26gqttbmoY-NI3m2QGfRHl6-78a8LKgD8,10150
|
|
8
|
+
mcp_1c/release_helper.py,sha256=4ufBPtNXRbri-ap4x7sRoJFrTEYKwl-coDdmCkepaZ8,3434
|
|
9
|
+
mcp_1c/runtime.py,sha256=MqKI0JKIkJ1CmYBOF3d2_O-iKlRnMJ0zvns2fHZUY2M,21593
|
|
10
|
+
mcp_1c/server.py,sha256=1CM3AjTgz67cguto8mIlct5LO0Et1DDiF8IgNGXz2Tw,139006
|
|
11
|
+
mcp_1c/skill_installer.py,sha256=TN2fd2K2sRJniJp7IheKvpBb-b0WCfK7GXRahCJJcf4,4648
|
|
12
|
+
mcp_1c/window_control.py,sha256=8m6qIGuVtnXsGlNQqMdZ7Os5CyjFegcuD3q0rWVAd3g,11196
|
|
13
|
+
mcp_1c/assets/MCPTestClient.cf,sha256=CTtp2ieZxlbiJwJDR59NCwfkEFDyjDhOfjP_5w0o_8Y,83432
|
|
14
|
+
mcp_1c/assets/MCPTestManager.cf,sha256=iSUdSJpngJrxUBkQNQmzwjQF1PpZ7l_UkLsVyRrf0ws,102833
|
|
15
|
+
mcp_1c/assets/__init__.py,sha256=2eYFDX1SEIs71o3aUZ_PlDuUt7wi-wbKimA79bzOYpY,52
|
|
16
|
+
mcp_1c/assets/skills/answer42/SKILL.md,sha256=kzN9wZvzaCPGiSNYqa55_UXkEmgypurhQ6_7MSyLVXk,19683
|
|
17
|
+
mcp_1c/assets/skills/answer42-rag/SKILL.md,sha256=8OJXy3aYaT3-cstG0eIzXbNXeauJAK9OSYYk3s0gvPE,3708
|
|
18
|
+
mcp_1c/rag/__init__.py,sha256=H0JoCFOElFhVWAXVzydozFDe104xogxG5SlX--sbF-I,107
|
|
19
|
+
mcp_1c/rag/detect.py,sha256=6COm_c1tLl6cQuJp7_QRzcbsbs409xPboZuhTtPRAPE,831
|
|
20
|
+
mcp_1c/rag/model.py,sha256=rAgcZQzizQYNQ5mjVkjzRpaNrdxsIzYheP2c_LC-VQA,3119
|
|
21
|
+
mcp_1c/rag/parsers.py,sha256=TWHymXSAUSH8C2uNnlyeAVfhRICx89HjaWAbVwwNY4M,15391
|
|
22
|
+
mcp_1c/rag/service.py,sha256=mvUByozVx9eNkFvnZTc_WDeUvJvaTuIb1nC75zCessQ,22088
|
|
23
|
+
mcp_1c/rag/store.py,sha256=GBXI39gE3nFu4-aTePUWUdd9XqKcVRTIuRgsSnl2T2Q,9190
|
|
24
|
+
answer42-0.2.0.dist-info/METADATA,sha256=eyW8cdipapmRiUC39VwZSpdAj8KdaXF3yd2Zb3vCs40,25266
|
|
25
|
+
answer42-0.2.0.dist-info/WHEEL,sha256=mffPy8wBnZQn2VnJUU5jE99KsxaSfiyMHV9Yt0aLVxs,87
|
|
26
|
+
answer42-0.2.0.dist-info/entry_points.txt,sha256=P5mcqy0UTIic3fS8eiKmnBajhH8XSf9p-ugOZSS22PA,48
|
|
27
|
+
answer42-0.2.0.dist-info/licenses/LICENSE,sha256=zN08YjDz_QUFXLGdJmGbqoWElLeFebmmr50IuF6CzJk,1165
|
|
28
|
+
answer42-0.2.0.dist-info/RECORD,,
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Kosolapov Stanislav aka proDOOMman <prodoomman@gmail.com>, Marvin (AI Assistant), 42Clouds, and contributors
|
|
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.
|
mcp_1c/__init__.py
ADDED
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Packaged Answer42 1C configuration artifacts."""
|